teichmann@5861: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5861: * Software engineering by Intevation GmbH teichmann@5861: * teichmann@5993: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5861: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5993: * documentation coming with Dive4Elements River for details. teichmann@5861: */ teichmann@5861: teichmann@5835: package org.dive4elements.river.client.client.ui; raimund@282: raimund@282: import com.google.gwt.core.client.GWT; raimund@282: import com.smartgwt.client.types.VerticalAlignment; raimund@282: import com.smartgwt.client.widgets.Canvas; rrenkert@5928: import com.smartgwt.client.widgets.HTMLPane; rrenkert@6119: import com.smartgwt.client.widgets.Img; raimund@282: import com.smartgwt.client.widgets.Label; rrenkert@6119: import com.smartgwt.client.widgets.events.VisibilityChangedEvent; rrenkert@6119: import com.smartgwt.client.widgets.events.VisibilityChangedHandler; raimund@282: import com.smartgwt.client.widgets.form.DynamicForm; raimund@282: import com.smartgwt.client.widgets.form.fields.LinkItem; christian@4064: import com.smartgwt.client.widgets.form.fields.events.ClickEvent; christian@4064: import com.smartgwt.client.widgets.form.fields.events.ClickHandler; rrenkert@5928: import com.smartgwt.client.widgets.form.fields.events.ItemHoverEvent; rrenkert@5928: import com.smartgwt.client.widgets.form.fields.events.ItemHoverHandler; raimund@282: import com.smartgwt.client.widgets.layout.HLayout; raimund@282: import com.smartgwt.client.widgets.layout.VLayout; raimund@282: christian@6349: import java.util.HashMap; christian@6349: import java.util.Map; christian@6349: teichmann@5835: import org.dive4elements.river.client.client.FLYSConstants; teichmann@5835: import org.dive4elements.river.client.client.event.StepForwardEvent; teichmann@5835: import org.dive4elements.river.client.shared.model.Data; teichmann@5835: import org.dive4elements.river.client.shared.model.DataItem; teichmann@5835: import org.dive4elements.river.client.shared.model.DataList; teichmann@5835: import org.dive4elements.river.client.shared.model.DefaultData; teichmann@5835: import org.dive4elements.river.client.shared.model.DefaultDataItem; raimund@282: raimund@282: raimund@282: /** raimund@282: * This UIProvider displays the DataItems of the Data object in a list of links. raimund@282: * raimund@282: * @author Raimund Renkert raimund@282: */ raimund@282: public class LinkSelection raimund@282: extends MapSelection rrenkert@6119: implements VisibilityChangedHandler raimund@282: { christian@4131: christian@4131: private static final long serialVersionUID = -7138270638349711024L; christian@4131: raimund@282: /** The message class that provides i18n strings.*/ raimund@282: protected FLYSConstants messages = GWT.create(FLYSConstants.class); raimund@282: raimund@282: /** The selected river*/ raimund@282: protected Data river; rrenkert@6119: private static Map riverHighlight; rrenkert@6119: private static Map riverList; rrenkert@6119: private static String selected; aheinecke@6019: private static HLayout columns; rrenkert@5928: rrenkert@5928: private static Trigger trigger; rrenkert@5928: rrenkert@5928: private Canvas module; rrenkert@5928: aheinecke@6019: rrenkert@5928: private class Trigger { rrenkert@5928: christian@6349: private final LinkSelection ls; rrenkert@5928: rrenkert@5928: public Trigger(LinkSelection ls) { rrenkert@5928: this.ls = ls; rrenkert@5928: } rrenkert@5928: rrenkert@5928: public void trigger(String name) { rrenkert@5928: DataItem item = new DefaultDataItem( rrenkert@5928: name, rrenkert@5928: null, rrenkert@5928: name); rrenkert@5928: rrenkert@5928: river = new DefaultData( rrenkert@5928: "river", rrenkert@5928: null, rrenkert@5928: null, rrenkert@5928: new DataItem [] {item}); rrenkert@5928: this.ls.fireStepForwardEvent (new StepForwardEvent (getData())); rrenkert@5928: } rrenkert@5928: } raimund@282: raimund@282: /** raimund@282: * This method currently returns a raimund@282: * {@link com.smartgwt.client.widgets.form.DynamicForm} that contains all raimund@282: * data items in a list of links stored in data. raimund@282: * raimund@282: * @param data The {@link Data} object. raimund@282: * raimund@282: * @return a combobox. raimund@282: */ christian@4064: @Override raimund@282: public Canvas create(DataList data) { rrenkert@5928: trigger = new Trigger(this); rrenkert@5928: createCallback(); rrenkert@6119: riverHighlight = new HashMap(); rrenkert@6119: riverList = new HashMap(); rrenkert@5928: raimund@282: VLayout v = new VLayout(); raimund@282: v.setMembersMargin(10); raimund@282: v.setAlign(VerticalAlignment.TOP); raimund@282: if (data.getState() == null) { rrenkert@5928: module = super.createWidget(data); raimund@282: v.addMember(module); raimund@282: } rrenkert@5928: else { rrenkert@5928: module = null; rrenkert@5928: } raimund@282: Canvas content = createWidget(data); raimund@282: v.addMember(content); raimund@282: raimund@282: return v; raimund@282: } raimund@282: raimund@282: christian@4064: @Override raimund@282: public Canvas createOld(DataList dataList) { raimund@282: HLayout layout = new HLayout(); raimund@282: VLayout vLayout = new VLayout(); raimund@282: layout.setWidth("400px"); raimund@282: raimund@282: Label label = new Label(dataList.getLabel()); raimund@282: label.setWidth("200px"); raimund@282: raimund@282: int size = dataList.size(); raimund@282: for (int i = 0; i < size; i++) { raimund@282: Data data = dataList.get(i); raimund@282: DataItem[] items = data.getItems(); raimund@282: raimund@282: for (DataItem item: items) { raimund@282: HLayout hLayout = new HLayout(); raimund@282: raimund@282: hLayout.addMember(label); raimund@282: hLayout.addMember(new Label(item.getLabel())); raimund@282: raimund@282: vLayout.addMember(hLayout); raimund@282: vLayout.setWidth("130px"); raimund@282: } raimund@282: } raimund@282: raimund@282: layout.addMember(label); raimund@282: layout.addMember(vLayout); raimund@282: raimund@282: return layout; raimund@282: } raimund@282: raimund@282: raimund@282: /** raimund@282: * This method creates the content of the widget. raimund@282: * raimund@282: * @param data The {@link Data} object. raimund@282: * raimund@282: * @return a list of links raimund@282: */ christian@4064: @Override raimund@282: protected Canvas createWidget(DataList data) { raimund@282: GWT.log("LinkSelection - create()"); raimund@282: raimund@282: VLayout layout = new VLayout(); raimund@282: layout.setAlign(VerticalAlignment.TOP); aheinecke@6019: // XXX: This an evil hack because of misuse of static vars! raimund@282: layout.setHeight(25); aheinecke@6019: columns = new HLayout(); rrenkert@5928: VLayout formLayout1 = new VLayout(); rrenkert@5928: VLayout formLayout2 = new VLayout(); raimund@282: rrenkert@5928: formLayout1.setLayoutLeftMargin(60); raimund@282: raimund@282: int size = data.size(); raimund@282: raimund@282: for (int i = 0; i < size; i++) { raimund@282: Data d = data.get(i); raimund@282: raimund@282: Label label = new Label(d.getDescription()); raimund@282: label.setValign(VerticalAlignment.TOP); raimund@282: label.setHeight(20); rrenkert@5928: label.setWidth(400); rrenkert@5928: rrenkert@5928: int counter = 0; raimund@282: for (DataItem item: d.getItems()) { rrenkert@6119: HLayout row = new HLayout(); rrenkert@7959: row.setTitle(item.getLabel()); raimund@282: LinkItem link = new LinkItem("river"); rrenkert@6119: link.setHoverDelay(0); raimund@282: link.setLinkTitle(item.getLabel()); rrenkert@7764: link.setValue(item.getStringValue()); raimund@282: link.setShowTitle(false); rrenkert@6119: Img img = new Img(); rrenkert@6119: img.setShowTitle(false); rrenkert@6130: img.setSrc("symbol_selected.png"); rrenkert@6130: img.setWidth(18); rrenkert@6130: img.setHeight(18); rrenkert@6119: img.setVisible(false); rrenkert@6119: Canvas container = new Canvas(); rrenkert@6119: container.addChild(img); rrenkert@6119: container.setHeight(20); rrenkert@6119: container.setWidth(20); raimund@282: DynamicForm f = new DynamicForm(); rrenkert@6119: riverList.put(item.getStringValue(), row); rrenkert@6119: riverHighlight.put(item.getStringValue(), img); raimund@282: f.setItems(link); rrenkert@6119: row.addMember(container); rrenkert@6119: row.addMember(f); rrenkert@6119: row.addVisibilityChangedHandler(this); rrenkert@6119: link.setColSpan(20); rrenkert@5928: if (counter < d.getItems().length/2) { rrenkert@6119: formLayout1.addMember(row); rrenkert@5928: } rrenkert@5928: else { rrenkert@6119: formLayout2.addMember(row); rrenkert@5928: } rrenkert@5928: counter++; raimund@282: link.addClickHandler(new ClickHandler() { christian@4064: @Override raimund@282: public void onClick(ClickEvent event) { raimund@282: DataItem item = new DefaultDataItem( raimund@282: ((LinkItem)event.getItem()).getLinkTitle(), raimund@282: null, raimund@282: ((LinkItem)event.getItem()).getLinkTitle()); raimund@282: raimund@282: river = new DefaultData( raimund@282: "river", raimund@282: null, raimund@282: null, raimund@282: new DataItem [] {item}); raimund@282: fireStepForwardEvent (new StepForwardEvent (getData())); raimund@282: } raimund@282: }); rrenkert@5928: link.addItemHoverHandler(new ItemHoverHandler() { rrenkert@5928: @Override rrenkert@5928: public void onItemHover(ItemHoverEvent event) { rrenkert@7764: String river = rrenkert@7764: ((LinkItem)event.getItem()).getValue().toString(); teichmann@6146: Img item = riverHighlight.get(river); teichmann@6146: if (item != null) { rrenkert@6119: item.setVisible(true); rrenkert@6119: if (selected != null && !selected.equals(river)) { rrenkert@6119: riverHighlight.get(selected).setVisible(false); rrenkert@5928: } rrenkert@6119: callHighlightRiver(river); rrenkert@6119: selected = river; aheinecke@6019: } rrenkert@5928: } rrenkert@5928: }); rrenkert@5928: } raimund@282: rrenkert@5928: if (module != null) { rrenkert@6119: getModuleSelection().setRivers(riverList); raimund@282: } raimund@282: label.setWidth(50); raimund@282: raimund@282: layout.addMember(label); aheinecke@6019: columns.addMember(formLayout1); aheinecke@6019: columns.addMember(formLayout2); aheinecke@6019: layout.addMember(columns); raimund@282: rrenkert@5928: } rrenkert@5928: HTMLPane map = new HTMLPane(); rrenkert@5928: map.setContentsURL("images/FLYS_Karte_interactive.html"); rrenkert@5928: felix@3546: helperContainer.addMember(map); raimund@282: return layout; raimund@282: } raimund@282: raimund@282: christian@4064: @Override raimund@282: protected Data[] getData() { raimund@282: Data[] module = super.getData(); raimund@282: if (module != null) { raimund@282: return new Data[] {module[0], river}; raimund@282: } raimund@282: else { raimund@282: return new Data[] {river}; raimund@282: } raimund@282: } rrenkert@5928: rrenkert@5928: private native void createCallback() /*-{ rrenkert@5928: $wnd.highlightRiver = @org.dive4elements.river.client.client.ui.LinkSelection::highlightCallback(Ljava/lang/String;); rrenkert@6119: $wnd.unHighlightRiver = @org.dive4elements.river.client.client.ui.LinkSelection::unHighlightCallback(Ljava/lang/String;); rrenkert@5928: $wnd.selectRiver = @org.dive4elements.river.client.client.ui.LinkSelection::selectCallback(Ljava/lang/String;); rrenkert@5928: $wnd.availableRiver = @org.dive4elements.river.client.client.ui.LinkSelection::availableRiver(Ljava/lang/String;); rrenkert@5928: }-*/; rrenkert@5928: rrenkert@5928: private static void highlightCallback(String name) { rrenkert@6119: if (riverHighlight.containsKey(name)) { rrenkert@6119: riverHighlight.get(name).setVisible(true); rrenkert@6119: if(selected != null && !selected.equals(name)) { rrenkert@6119: riverHighlight.get(selected).setVisible(false); rrenkert@6119: } rrenkert@6119: selected = name; aheinecke@6019: } rrenkert@6119: } rrenkert@6119: rrenkert@6119: private static void unHighlightCallback(String name) { rrenkert@6119: if (riverHighlight.containsKey(name)) { rrenkert@6119: riverHighlight.get(name).setVisible(false); rrenkert@6119: selected = null; rrenkert@5928: } rrenkert@5928: } rrenkert@5928: rrenkert@5928: private static boolean availableRiver(String river) { rrenkert@6119: HLayout row = riverList.get(river); rrenkert@6119: return row != null && row.isVisible(); rrenkert@5928: } rrenkert@5928: rrenkert@5928: private static void selectCallback(String name) { aheinecke@6019: if (availableRiver(name)) { rrenkert@7959: String river = riverList.get(name).getTitle(); rrenkert@7959: trigger.trigger(river); rrenkert@5966: } rrenkert@5928: } rrenkert@5928: rrenkert@6354: private native void callHighlightRiver(String name) /*-{ rrenkert@5928: $wnd.highlight(name); rrenkert@5928: }-*/; rrenkert@5928: rrenkert@6119: rrenkert@6119: @Override rrenkert@6119: public void onVisibilityChanged(VisibilityChangedEvent event) { rrenkert@6119: for (Map.Entry entry: riverHighlight.entrySet()) { rrenkert@6119: entry.getValue().setVisible(false); rrenkert@6119: } rrenkert@6119: selected = null; rrenkert@6119: } raimund@282: } raimund@282: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :