teichmann@5861: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
teichmann@5861: * Software engineering by Intevation GmbH
teichmann@5861: *
teichmann@5861: * This file is Free Software under the GNU AGPL (>=v3)
teichmann@5861: * and comes with ABSOLUTELY NO WARRANTY! Check out the
teichmann@5861: * documentation coming with Dive4Elements River for details.
teichmann@5861: */
teichmann@5861:
teichmann@5835: package org.dive4elements.river.client.client.ui;
raimund@282:
rrenkert@5928: import java.util.HashMap;
rrenkert@5928: import java.util.LinkedHashMap;
rrenkert@5928: import java.util.Map;
rrenkert@5928:
raimund@282: import com.google.gwt.core.client.GWT;
raimund@282:
raimund@282: import com.smartgwt.client.types.VerticalAlignment;
raimund@282: import com.smartgwt.client.widgets.Canvas;
rrenkert@5928: import com.smartgwt.client.widgets.HTMLPane;
felix@3546: import com.smartgwt.client.widgets.Img;
raimund@282: import com.smartgwt.client.widgets.Label;
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:
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
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@5928: private static Map rivers;
rrenkert@5928:
rrenkert@5928: private static Trigger trigger;
rrenkert@5928:
rrenkert@5928: private Canvas module;
rrenkert@5928:
rrenkert@5928: private class Trigger {
rrenkert@5928:
rrenkert@5928: private LinkSelection ls;
rrenkert@5928:
rrenkert@5928: public Trigger(LinkSelection ls) {
rrenkert@5928: this.ls = ls;
rrenkert@5928: // TODO Auto-generated constructor stub
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@5928: rivers = 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: Canvas back = getBackButton(dataList.getState());
raimund@282:
raimund@282: layout.addMember(label);
raimund@282: layout.addMember(vLayout);
raimund@282: layout.addMember(back);
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);
raimund@282: layout.setHeight(25);
rrenkert@5928: HLayout colums = 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: LinkedHashMap it = new LinkedHashMap();
rrenkert@5928: boolean defaultSet = false;
rrenkert@5928: boolean first = true;
rrenkert@5928: DataItem def = d.getDefault();
rrenkert@5928: String defValue = def != null ? def.getStringValue() : null;
raimund@282:
rrenkert@5928: if (defValue != null && defValue.length() > 0) {
rrenkert@5928: defaultSet = true;
rrenkert@5928: }
rrenkert@5928:
rrenkert@5928: int counter = 0;
raimund@282: for (DataItem item: d.getItems()) {
raimund@282: LinkItem link = new LinkItem("river");
raimund@282: link.setLinkTitle(item.getLabel());
raimund@282: link.setTarget(item.getStringValue());
raimund@282: link.setShowTitle(false);
raimund@282: DynamicForm f = new DynamicForm();
rrenkert@5928: rivers.put(item.getStringValue(), link);
rrenkert@5928:
raimund@282: f.setItems(link);
rrenkert@5928: if (counter < d.getItems().length/2) {
rrenkert@5928: formLayout1.addMember(f);
rrenkert@5928: }
rrenkert@5928: else {
rrenkert@5928: formLayout2.addMember(f);
rrenkert@5928: }
rrenkert@5928: counter++;
rrenkert@5928:
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@5928: String river = ((LinkItem)event.getItem()).getLinkTitle();
rrenkert@5928: for (String s : rivers.keySet()) {
rrenkert@5928: LinkItem item = rivers.get(s);
rrenkert@5928: if (item.getLinkTitle().equals(river)) {
rrenkert@5928: item.setCellStyle("riverLinkHighlight");
rrenkert@5928: }
rrenkert@5928: else {
rrenkert@5928: item.setCellStyle("formCell");
rrenkert@5928: callUnHighlightRiver(s);
rrenkert@5928: }
rrenkert@5928: }
rrenkert@5928: callHighlightRiver(river);
rrenkert@5928: }
rrenkert@5928: });
rrenkert@5928: }
raimund@282:
rrenkert@5928: if (module != null) {
rrenkert@5928: getModuleSelection().setRivers(rivers);
raimund@282: }
raimund@282: label.setWidth(50);
raimund@282:
raimund@282: layout.addMember(label);
rrenkert@5928: colums.addMember(formLayout1);
rrenkert@5928: colums.addMember(formLayout2);
rrenkert@5928: layout.addMember(colums);
raimund@282:
rrenkert@5928: }
rrenkert@5928: layout.addMember(getNextButton());
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@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@5928: for (String s : rivers.keySet()) {
rrenkert@5928: if (s.equals(name)) {
rrenkert@5928: LinkItem item = rivers.get(name);
rrenkert@5928: item.setCellStyle("riverLinkHighlight");
rrenkert@5928: item.redraw();
rrenkert@5928: }
rrenkert@5928: else {
rrenkert@5928: LinkItem item = rivers.get(s);
rrenkert@5928: item.setCellStyle("formCell");
rrenkert@5928: item.redraw();
rrenkert@5928: }
rrenkert@5928: }
rrenkert@5928: }
rrenkert@5928:
rrenkert@5928: private static boolean availableRiver(String river) {
rrenkert@5928: if (rivers.containsKey(river)) {
rrenkert@5928: if(rivers.get(river).isVisible()) {
rrenkert@5928: return true;
rrenkert@5928: }
rrenkert@5928: }
rrenkert@5928: return false;
rrenkert@5928: }
rrenkert@5928:
rrenkert@5928: private static void selectCallback(String name) {
rrenkert@5928: trigger.trigger(name);
rrenkert@5928: }
rrenkert@5928:
rrenkert@5928: private native void callHighlightRiver(String name) /*-{
rrenkert@5928: $wnd.highlight(name);
rrenkert@5928: }-*/;
rrenkert@5928:
rrenkert@5928: private native void callUnHighlightRiver(String name) /*-{
rrenkert@5928: $wnd.unHighlight(name);
rrenkert@5928: }-*/;
raimund@282: }
raimund@282: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :