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; felix@899: gernotbelger@9133: import org.dive4elements.river.client.client.FLYSConstants; gernotbelger@9133: import org.dive4elements.river.client.shared.model.ToLoad; gernotbelger@9133: felix@899: import com.google.gwt.core.client.GWT; christian@4567: import com.smartgwt.client.util.SC; felix@899: import com.smartgwt.client.widgets.Button; christian@4567: import com.smartgwt.client.widgets.events.ClickEvent; christian@4182: import com.smartgwt.client.widgets.events.ClickHandler; felix@899: import com.smartgwt.client.widgets.grid.ListGrid; christian@4567: import com.smartgwt.client.widgets.layout.HLayout; christian@4567: import com.smartgwt.client.widgets.layout.VLayout; felix@899: felix@914: /** ingo@3549: * Widget showing two Datacages and a add-this-button. ingo@3549: * Insert a record into a listgrid when add-this-button clicked. felix@914: */ gernotbelger@9133: public class DatacagePairWidget extends VLayout { gernotbelger@9227: gernotbelger@9227: /** gernotbelger@9227: * Allows for advanced controlling of the behavior of this pair widget. gernotbelger@9227: */ gernotbelger@9227: public static interface IDatacagePairControler { gernotbelger@9227: void setup(DatacageWidget leftWidget, DatacageWidget rightWidget, HLayout toolbarLayout); gernotbelger@9227: } gernotbelger@9227: gernotbelger@9227: /** gernotbelger@9227: * {@link IDatacagePairControler} implementation that does nothing. gernotbelger@9227: */ gernotbelger@9227: public static final IDatacagePairControler NIL_CONTROLER = new IDatacagePairControler() { gernotbelger@9227: @Override gernotbelger@9227: public void setup(final DatacageWidget leftWidget, final DatacageWidget rightWidget, final HLayout toolbarLayout) { gernotbelger@9227: // does nothing gernotbelger@9227: } gernotbelger@9227: }; gernotbelger@9227: ingo@3549: /** i18n resource. */ gernotbelger@9227: private static final FLYSConstants MSG = GWT.create(FLYSConstants.class); sascha@2905: felix@1284: /** The "remote" ListGrid to insert data to when add-button is clicked. */ gernotbelger@9220: private final ListGrid grid; sascha@2905: felix@1284: /** First (upper) DataCage Grid. */ gernotbelger@9220: private final DatacageWidget firstDatacageWidget; sascha@2905: felix@1284: /** Second (lower) DataCage Grid. */ gernotbelger@9220: private final DatacageWidget secondDatacageWidget; felix@1298: gernotbelger@9133: /** Max number of recommendation pairs to be added */ gernotbelger@9133: private final int maxCount; gernotbelger@9220: gernotbelger@9133: /** errorMsg maxCount */ gernotbelger@9133: private final String msgMaxCount; sascha@2905: gernotbelger@9227: public DatacagePairWidget(final IDatacagePairControler controler, final DatacageWidgetData leftData, final DatacageWidgetData rightData, gernotbelger@9227: final ListGrid grid, final int maxCount, final String msgMaxCount) { gernotbelger@9227: gernotbelger@9133: this.msgMaxCount = msgMaxCount; gernotbelger@9133: this.maxCount = maxCount; felix@899: this.grid = grid; felix@899: gernotbelger@9133: final HLayout hLayout = new HLayout(); gernotbelger@9220: gernotbelger@9220: this.firstDatacageWidget = new DatacageWidget(leftData); gernotbelger@9220: this.secondDatacageWidget = new DatacageWidget(rightData); gernotbelger@9220: gernotbelger@9133: this.firstDatacageWidget.setIsMutliSelectable(false); gernotbelger@9133: this.secondDatacageWidget.setIsMutliSelectable(false); felix@899: gernotbelger@9133: hLayout.addMember(this.firstDatacageWidget); gernotbelger@9133: hLayout.addMember(this.secondDatacageWidget); felix@899: gernotbelger@9227: final HLayout toolbarLayout = new HLayout(); gernotbelger@9227: toolbarLayout.setAutoHeight(); gernotbelger@9227: gernotbelger@9227: final Button plusBtn = new Button(MSG.datacage_add_pair()); christian@3533: plusBtn.setAutoFit(true); felix@899: plusBtn.addClickHandler(new ClickHandler() { felix@899: @Override gernotbelger@9133: public void onClick(final ClickEvent event) { felix@899: plusClicked(); felix@899: } felix@899: }); gernotbelger@9227: toolbarLayout.addMember(plusBtn); felix@899: felix@899: addMember(hLayout); gernotbelger@9227: addMember(toolbarLayout); gernotbelger@9227: gernotbelger@9227: controler.setup(this.firstDatacageWidget, this.secondDatacageWidget, toolbarLayout); felix@899: } felix@899: felix@899: /** felix@899: * Callback for add-button. felix@899: * Fires to load for every selected element and handler. felix@899: */ gernotbelger@9227: protected final void plusClicked() { gernotbelger@9133: final ToLoad toLoad1 = this.firstDatacageWidget.getSelection(); gernotbelger@9133: final ToLoad toLoad2 = this.secondDatacageWidget.getSelection(); felix@899: gernotbelger@9220: // FIXME: allows to select folders... but it should not gernotbelger@9220: gernotbelger@9133: if (toLoad1 == null || toLoad2 == null || toLoad1.toRecommendations().isEmpty() || toLoad2.toRecommendations().isEmpty()) { gernotbelger@9227: SC.say(MSG.warning_select_two_values()); gernotbelger@9133: return; gernotbelger@9133: } gernotbelger@9220: gernotbelger@9133: if (this.grid.getTotalRows() >= this.maxCount) { gernotbelger@9133: SC.say(this.msgMaxCount); felix@899: return; felix@899: } felix@899: gernotbelger@9133: this.grid.addData(new RecommendationPairRecord(toLoad1.toRecommendations().get(0), toLoad2.toRecommendations().get(0))); felix@899: } gernotbelger@9220: }