teichmann@5835: package org.dive4elements.river.client.client.ui.map; ingo@1406: ingo@1412: import java.util.ArrayList; ingo@1412: import java.util.List; raimund@2455: import java.util.Map; raimund@2455: import java.util.LinkedHashMap; ingo@1412: ingo@1408: import com.google.gwt.core.client.GWT; ingo@1408: import com.google.gwt.user.client.rpc.AsyncCallback; ingo@1406: ingo@1406: import com.smartgwt.client.util.SC; ingo@1406: import com.smartgwt.client.widgets.Button; ingo@1406: import com.smartgwt.client.widgets.Canvas; ingo@1406: import com.smartgwt.client.widgets.Window; raimund@2455: import com.smartgwt.client.widgets.form.DynamicForm; raimund@2455: import com.smartgwt.client.widgets.form.fields.ComboBoxItem; ingo@1406: import com.smartgwt.client.widgets.events.ClickEvent; ingo@1406: import com.smartgwt.client.widgets.events.ClickHandler; ingo@1412: import com.smartgwt.client.widgets.grid.ListGridRecord; ingo@1406: import com.smartgwt.client.widgets.layout.HLayout; ingo@1406: import com.smartgwt.client.widgets.layout.Layout; ingo@1406: import com.smartgwt.client.widgets.layout.VLayout; ingo@1406: teichmann@5835: import org.dive4elements.river.client.shared.model.Capabilities; teichmann@5835: import org.dive4elements.river.client.shared.model.WMSLayer; teichmann@5835: import org.dive4elements.river.client.client.FLYSConstants; teichmann@5835: import org.dive4elements.river.client.client.services.GCService; teichmann@5835: import org.dive4elements.river.client.client.services.GCServiceAsync; teichmann@5835: import org.dive4elements.river.client.client.services.MapUrlService; teichmann@5835: import org.dive4elements.river.client.client.services.MapUrlServiceAsync; ingo@1408: ingo@1406: ingo@1406: public class ExternalWMSWindow extends Window { ingo@1406: ingo@1412: public interface LayerLoader { ingo@1412: void load(List toLoad); ingo@1412: } // end of interface WMSLayerLoader ingo@1412: ingo@1412: ingo@1408: protected GCServiceAsync gcService = GWT.create(GCService.class); raimund@2455: protected MapUrlServiceAsync muService = GWT.create(MapUrlService.class); ingo@1408: protected FLYSConstants MSG = GWT.create(FLYSConstants.class); ingo@1408: ingo@1406: protected Layout inputPanel; ingo@1406: protected Layout infoPanel; ingo@1406: protected Layout layersPanel; ingo@1406: ingo@1408: protected Capabilities capabilites; ingo@1408: ingo@1418: protected String srs; ingo@1418: raimund@2455: protected LinkedHashMap urls; ingo@1406: protected String url; ingo@1406: ingo@1412: protected LayerLoader loader; ingo@1406: ingo@1412: ingo@1412: public ExternalWMSWindow(LayerLoader loader) { ingo@1406: super(); raimund@2455: this.urls = new LinkedHashMap(); ingo@1412: this.loader = loader; ingo@1406: } ingo@1406: ingo@1406: ingo@1418: public ExternalWMSWindow(LayerLoader loader, String srs) { ingo@1418: this(loader); ingo@1418: this.srs = srs; ingo@1418: } ingo@1418: ingo@1418: ingo@1406: protected void setUrl(String url) { ingo@1406: this.url = url; ingo@1406: } ingo@1406: ingo@1406: ingo@1406: protected String getUrl() { ingo@1406: return url; ingo@1406: } ingo@1406: ingo@1406: ingo@1408: protected String getCapabilitiesUrl() { ingo@1408: String cUrl = url; ingo@1408: ingo@1408: if (url.indexOf("?") >= 0) { ingo@1408: cUrl += "&SERVICE=WMS&REQUEST=GetCapabilities"; ingo@1408: } ingo@1408: else { ingo@1408: cUrl += "?SERVICE=WMS&REQUEST=GetCapabilities"; ingo@1408: } ingo@1408: ingo@1408: return cUrl; ingo@1408: } ingo@1408: ingo@1408: ingo@1408: protected void setCapabilites(Capabilities capabilites) { ingo@1408: this.capabilites = capabilites; ingo@1408: } ingo@1408: ingo@1408: ingo@1406: public void start() { ingo@1406: show(); ingo@1406: centerInPage(); ingo@1406: ingo@1406: goToInputPanel(); ingo@1406: } ingo@1406: ingo@1406: ingo@1406: protected void goToInputPanel() { ingo@1406: clearItems(); ingo@1406: ingo@1406: inputPanel = createInputPanel(); ingo@1406: ingo@1406: addItem(inputPanel); ingo@1406: ingo@1406: setWidth(380); ingo@1406: setHeight(140); ingo@1406: } ingo@1406: ingo@1406: ingo@1406: protected void goToInfoPanel() { ingo@1406: clearItems(); ingo@1406: ingo@1406: infoPanel = createInfoPanel(); ingo@1406: ingo@1406: addItem(infoPanel); ingo@1406: ingo@1406: setWidth(500); ingo@1406: setHeight(500); ingo@1409: ingo@1409: centerInPage(); ingo@1406: } ingo@1406: ingo@1406: ingo@1406: protected void goToLayersPanel() { ingo@1406: clearItems(); ingo@1406: ingo@1406: layersPanel = createLayersPanel(); ingo@1406: ingo@1406: addItem(layersPanel); ingo@1406: ingo@1406: setWidth(500); ingo@1406: setHeight(500); ingo@1406: } ingo@1406: ingo@1406: ingo@1406: protected void clearItems() { ingo@1406: Canvas[] items = getItems(); ingo@1406: ingo@1406: if (items != null) { ingo@1406: for (Canvas item: items) { ingo@1406: removeItem(item); ingo@1406: } ingo@1406: } ingo@1406: } ingo@1406: ingo@1406: raimund@2455: protected void setUrls(Map urls) { raimund@2455: this.urls.putAll(urls); raimund@2455: } raimund@2455: raimund@2455: protected void readUrls() { raimund@2455: } raimund@2455: raimund@2455: ingo@1406: protected Layout createInputPanel() { ingo@1410: setTitle(MSG.addwmsInputTitle()); ingo@1406: raimund@2455: readUrls(); raimund@2455: raimund@2455: DynamicForm form = new DynamicForm(); raimund@2455: final ComboBoxItem url = new ComboBoxItem("Url:"); raimund@2455: url.setRedrawOnChange(true); raimund@2455: muService.getUrls(new AsyncCallback >() { raimund@2455: public void onFailure(Throwable caught) { raimund@2455: GWT.log("Error reading WMS-Services" + caught.getMessage()); raimund@2455: } raimund@2455: public void onSuccess(Map wms) { raimund@2455: urls.putAll(wms); raimund@2455: url.setValueMap(urls); raimund@2455: raimund@2455: } raimund@2455: }); ingo@1406: ingo@1406: String oldUrl = getUrl(); ingo@1406: if (oldUrl != null && oldUrl.length() > 0) { ingo@1406: url.setValue(oldUrl); ingo@1406: } ingo@1406: ingo@1406: ClickHandler goHandler = new ClickHandler() { ingo@1406: @Override ingo@1406: public void onClick(ClickEvent e) { raimund@2455: String newUrl = url.getValue().toString(); ingo@1406: ingo@1406: if (!isUrlValid(newUrl)) { ingo@1410: SC.warn(MSG.addwmsInvalidURL()); ingo@1406: return; ingo@1406: } ingo@1406: raimund@2455: setUrl(newUrl); ingo@1408: ingo@1408: doCapabilitesRequest(); ingo@1406: } ingo@1406: }; ingo@1406: ingo@1406: ClickHandler cancelHandler = new ClickHandler() { ingo@1406: @Override ingo@1406: public void onClick(ClickEvent e) { ingo@1406: quit(); ingo@1406: } ingo@1406: }; ingo@1406: ingo@1406: VLayout root = new VLayout(); ingo@1406: root.setHeight(75); ingo@1406: root.setMargin(10); ingo@1406: root.setLayoutMargin(10); ingo@1406: raimund@2455: form.setFields(url); raimund@2455: root.addMember(form); ingo@1406: root.addMember(createButtonPanel(null, goHandler, cancelHandler)); ingo@1406: ingo@1406: return root; ingo@1406: } ingo@1406: ingo@1406: ingo@1406: protected Layout createInfoPanel() { ingo@1410: setTitle(MSG.addwmsInfoTitle()); ingo@1406: ingo@1406: ClickHandler backHandler = new ClickHandler() { ingo@1406: @Override ingo@1406: public void onClick(ClickEvent e) { ingo@1406: goToInputPanel(); ingo@1406: } ingo@1406: }; ingo@1406: ingo@1406: ClickHandler goHandler = new ClickHandler() { ingo@1406: @Override ingo@1406: public void onClick(ClickEvent e) { ingo@1406: goToLayersPanel(); ingo@1406: } ingo@1406: }; ingo@1406: ingo@1406: ClickHandler cancelHandler = new ClickHandler() { ingo@1406: @Override ingo@1406: public void onClick(ClickEvent e) { ingo@1406: quit(); ingo@1406: } ingo@1406: }; ingo@1406: ingo@1408: VLayout root = new VLayout(); ingo@1408: VLayout panel = new CapabilitiesPanel(capabilites); ingo@1406: ingo@1408: root.setLayoutMargin(10); ingo@1408: panel.setHeight(420); ingo@1406: ingo@1408: root.addMember(panel); ingo@1406: root.addMember(createButtonPanel(backHandler, goHandler, cancelHandler)); ingo@1406: ingo@1406: return root; ingo@1406: } ingo@1406: ingo@1406: ingo@1406: protected Layout createLayersPanel() { ingo@1410: setTitle(MSG.addwmsLayerTitle()); ingo@1406: ingo@1418: final WMSLayersTree tree = new WMSLayersTree(capabilites, srs); ingo@1412: ingo@1406: ClickHandler backHandler = new ClickHandler() { ingo@1406: @Override ingo@1406: public void onClick(ClickEvent e) { ingo@1406: goToInfoPanel(); ingo@1406: } ingo@1406: }; ingo@1406: ingo@1406: ClickHandler goHandler = new ClickHandler() { ingo@1406: @Override ingo@1406: public void onClick(ClickEvent e) { ingo@1412: ListGridRecord[] selection = tree.getSelectedRecords(); ingo@1412: ingo@1412: if (selection == null || selection.length == 0) { ingo@1412: return; ingo@1412: } ingo@1412: ingo@1412: List toLoad = new ArrayList(); ingo@1412: ingo@1412: for (ListGridRecord record: selection) { ingo@1412: toLoad.add( ingo@1412: ((WMSLayersTree.WMSLayerNode) record).getWMSLayer()); ingo@1412: ingo@1412: } ingo@1412: ingo@1412: finish(toLoad); ingo@1406: } ingo@1406: }; ingo@1406: ingo@1406: ClickHandler cancelHandler = new ClickHandler() { ingo@1406: @Override ingo@1406: public void onClick(ClickEvent e) { ingo@1406: quit(); ingo@1406: } ingo@1406: }; ingo@1406: ingo@1412: VLayout root = new VLayout(); ingo@1406: ingo@1411: root.setLayoutMargin(10); ingo@1411: tree.setHeight(420); ingo@1406: ingo@1411: root.addMember(tree); ingo@1406: root.addMember(createButtonPanel(backHandler, goHandler, cancelHandler)); ingo@1406: ingo@1406: return root; ingo@1406: } ingo@1406: ingo@1406: ingo@1406: /** ingo@1406: * @param back ingo@1406: * @param ok ingo@1406: * @param cancel ingo@1406: * ingo@1406: * @return ingo@1406: */ ingo@1406: protected Layout createButtonPanel( ingo@1406: ClickHandler backHandler, ingo@1406: ClickHandler goHandler, ingo@1406: ClickHandler cancelHandler ingo@1406: ) { ingo@1420: Button back = new Button(MSG.addwmsBack()); ingo@1420: Button go = new Button(MSG.addwmsContinue()); ingo@1420: Button cancel = new Button(MSG.addwmsCancel()); ingo@1406: ingo@1406: if (backHandler != null) { ingo@1406: back.addClickHandler(backHandler); ingo@1406: } ingo@1406: else { ingo@1406: back.setDisabled(true); ingo@1406: } ingo@1406: ingo@1406: if (goHandler != null) { ingo@1406: go.addClickHandler(goHandler); ingo@1406: } ingo@1406: else { ingo@1406: go.setDisabled(true); ingo@1406: } ingo@1406: ingo@1406: if (cancelHandler != null) { ingo@1406: cancel.addClickHandler(cancelHandler); ingo@1406: } ingo@1406: else { ingo@1406: cancel.setDisabled(true); ingo@1406: } ingo@1406: ingo@1406: HLayout buttonPanel = new HLayout(); ingo@1406: buttonPanel.setHeight(25); ingo@1406: buttonPanel.setMembersMargin(15); ingo@1406: buttonPanel.setLayoutTopMargin(10); ingo@1406: buttonPanel.addMember(back); ingo@1406: buttonPanel.addMember(go); ingo@1406: buttonPanel.addMember(cancel); ingo@1406: ingo@1406: return buttonPanel; ingo@1406: } ingo@1406: ingo@1406: ingo@1406: protected boolean isUrlValid(String url) { ingo@1406: // TODO Improve URL validation ingo@1406: return !(url == null || url.length() == 0); ingo@1406: } ingo@1406: ingo@1406: ingo@1412: protected void finish(List toLoad) { ingo@1412: loader.load(toLoad); ingo@1412: ingo@1412: quit(); ingo@1412: } ingo@1412: ingo@1412: ingo@1406: protected void quit() { ingo@1406: destroy(); ingo@1406: } ingo@1408: ingo@1408: ingo@1408: protected void doCapabilitesRequest() { ingo@1408: gcService.query(getCapabilitiesUrl(),new AsyncCallback() { ingo@1408: public void onFailure(Throwable e) { ingo@1408: SC.warn(MSG.getString(e.getMessage())); ingo@1408: } ingo@1408: ingo@1408: public void onSuccess(Capabilities capabilites) { ingo@1408: setCapabilites(capabilites); ingo@1408: goToInfoPanel(); ingo@1408: } ingo@1408: }); ingo@1408: } ingo@1406: } ingo@1406: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :