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; ingo@23: gernotbelger@9071: import java.util.ArrayList; gernotbelger@9071: import java.util.List; gernotbelger@9071: import java.util.Map; gernotbelger@9071: import java.util.Set; gernotbelger@9071: import java.util.TreeMap; ingo@23: teichmann@5835: import org.dive4elements.river.client.client.Config; teichmann@5835: import org.dive4elements.river.client.client.FLYS; teichmann@5835: import org.dive4elements.river.client.client.FLYSConstants; teichmann@5835: import org.dive4elements.river.client.client.event.AdvanceHandler; teichmann@5835: import org.dive4elements.river.client.client.event.CollectionChangeEvent; teichmann@5835: import org.dive4elements.river.client.client.event.CollectionChangeHandler; teichmann@5835: import org.dive4elements.river.client.client.event.HasParameterChangeHandler; teichmann@5835: import org.dive4elements.river.client.client.event.HasStepBackHandlers; teichmann@5835: import org.dive4elements.river.client.client.event.HasStepForwardHandlers; teichmann@5835: import org.dive4elements.river.client.client.event.OutputModesChangeEvent; teichmann@5835: import org.dive4elements.river.client.client.event.OutputModesChangeHandler; teichmann@5835: import org.dive4elements.river.client.client.event.ParameterChangeEvent; teichmann@5835: import org.dive4elements.river.client.client.event.ParameterChangeHandler; teichmann@5835: import org.dive4elements.river.client.client.event.StepBackEvent; teichmann@5835: import org.dive4elements.river.client.client.event.StepBackHandler; teichmann@5835: import org.dive4elements.river.client.client.event.StepForwardEvent; teichmann@5835: import org.dive4elements.river.client.client.event.StepForwardHandler; teichmann@5835: import org.dive4elements.river.client.client.services.AdvanceService; teichmann@5835: import org.dive4elements.river.client.client.services.AdvanceServiceAsync; teichmann@5835: import org.dive4elements.river.client.client.services.ArtifactService; teichmann@5835: import org.dive4elements.river.client.client.services.ArtifactServiceAsync; teichmann@5835: import org.dive4elements.river.client.client.services.ReportService; teichmann@5835: import org.dive4elements.river.client.client.services.ReportServiceAsync; teichmann@5835: import org.dive4elements.river.client.client.services.StepForwardService; teichmann@5835: import org.dive4elements.river.client.client.services.StepForwardServiceAsync; teichmann@5835: import org.dive4elements.river.client.client.ui.stationinfo.GaugePanel; teichmann@5835: import org.dive4elements.river.client.client.ui.stationinfo.InfoPanel; teichmann@5835: import org.dive4elements.river.client.client.ui.stationinfo.MeasurementStationPanel; teichmann@5835: import org.dive4elements.river.client.shared.model.Artifact; teichmann@5835: import org.dive4elements.river.client.shared.model.ArtifactDescription; gernotbelger@9071: import org.dive4elements.river.client.shared.model.BUNDUArtifact; teichmann@5835: import org.dive4elements.river.client.shared.model.Collection; 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; teichmann@5835: import org.dive4elements.river.client.shared.model.ExportMode; teichmann@5835: import org.dive4elements.river.client.shared.model.FixAnalysisArtifact; teichmann@5835: import org.dive4elements.river.client.shared.model.MINFOArtifact; teichmann@5835: import org.dive4elements.river.client.shared.model.OutputMode; teichmann@5835: import org.dive4elements.river.client.shared.model.ReportMode; teichmann@5835: import org.dive4elements.river.client.shared.model.River; gernotbelger@8854: import org.dive4elements.river.client.shared.model.SINFOArtifact; gernotbelger@8995: import org.dive4elements.river.client.shared.model.UINFOArtifact; teichmann@5835: import org.dive4elements.river.client.shared.model.WINFOArtifact; christian@4062: gernotbelger@9071: import com.google.gwt.core.client.GWT; gernotbelger@9071: import com.google.gwt.user.client.rpc.AsyncCallback; gernotbelger@9071: import com.smartgwt.client.types.Overflow; gernotbelger@9071: import com.smartgwt.client.types.VerticalAlignment; gernotbelger@9071: import com.smartgwt.client.types.VisibilityMode; gernotbelger@9071: import com.smartgwt.client.util.SC; gernotbelger@9071: import com.smartgwt.client.widgets.Canvas; gernotbelger@9071: import com.smartgwt.client.widgets.layout.HLayout; gernotbelger@9071: import com.smartgwt.client.widgets.layout.SectionStack; gernotbelger@9071: import com.smartgwt.client.widgets.layout.SectionStackSection; gernotbelger@9071: import com.smartgwt.client.widgets.layout.VLayout; gernotbelger@9071: import com.smartgwt.client.widgets.tab.Tab; gernotbelger@9071: import com.smartgwt.client.widgets.tab.events.TabSelectedHandler; ingo@23: gernotbelger@9071: public class ParameterList extends Tab implements StepBackHandler, StepForwardHandler, ParameterChangeHandler, HasParameterChangeHandler, CollectionChangeHandler, OutputModesChangeHandler, AdvanceHandler { christian@4184: private static final long serialVersionUID = 5204784727239299980L; christian@4184: ingo@789: public static final String STYLENAME_OLD_PARAMETERS = "oldParameters"; ingo@789: felix@6579: /** The message class that provides i18n strings. */ ingo@211: protected FLYSConstants MSG = GWT.create(FLYSConstants.class); ingo@73: ingo@73: /** The ArtifactService used to communicate with the Artifact server. */ gernotbelger@9071: protected ArtifactServiceAsync artifactService = GWT.create(ArtifactService.class); ingo@73: ingo@73: /** The StepForwardService used to put data into an existing artifact. */ gernotbelger@9071: protected StepForwardServiceAsync forwardService = GWT.create(StepForwardService.class); ingo@73: ingo@73: /** The StepForwardService used to put data into an existing artifact. */ gernotbelger@9071: protected AdvanceServiceAsync advanceService = GWT.create(AdvanceService.class); ingo@73: gernotbelger@9071: protected ReportServiceAsync reportService = GWT.create(ReportService.class); sascha@604: felix@6579: /** The list of ParameterizationChangeHandler. */ ingo@73: protected List parameterHandlers; ingo@73: ingo@73: protected FLYS flys; ingo@73: ingo@60: protected CollectionView cView; ingo@23: ingo@73: protected Artifact artifact; ingo@73: ingo@51: protected List old; ingo@790: protected Map oldStorage; gernotbelger@9071: protected DataList current; ingo@23: ingo@23: protected UIProvider uiProvider; ingo@23: raimund@256: protected VLayout topLayout; ingo@23: protected VLayout oldItems; ingo@23: protected VLayout currentItems; ingo@275: protected VLayout exportModes; sascha@582: protected VLayout report; ingo@788: protected VLayout helperPanel; ingo@788: protected VLayout tablePanel; bjoern@4270: protected InfoPanel infoPanel; gernotbelger@9071: protected Canvas reportPanel; ingo@23: bjoern@4254: private SectionStack stack; bjoern@4254: gernotbelger@9071: public ParameterList(final FLYS flys, final CollectionView cView, final String title) { ingo@90: super(title); ingo@90: ingo@73: this.cView = cView; gernotbelger@9071: this.flys = flys; ingo@73: gernotbelger@9071: this.parameterHandlers = new ArrayList(); gernotbelger@9071: this.old = new ArrayList(); gernotbelger@9071: this.oldStorage = new TreeMap(); gernotbelger@9071: this.topLayout = new VLayout(); gernotbelger@9071: this.oldItems = new VLayout(); gernotbelger@9071: this.currentItems = new VLayout(); gernotbelger@9071: this.exportModes = new VLayout(); gernotbelger@9071: this.report = new VLayout(); ingo@23: ingo@224: addParameterChangeHandler(this); ingo@224: ingo@23: init(); ingo@23: } ingo@23: gernotbelger@9071: public ParameterList(final FLYS flys, final CollectionView cView, final String title, final Artifact artifact) { ingo@224: super(title); ingo@224: gernotbelger@9071: this.cView = cView; gernotbelger@9071: this.flys = flys; ingo@224: this.artifact = artifact; ingo@224: gernotbelger@9071: this.parameterHandlers = new ArrayList(); gernotbelger@9071: this.old = new ArrayList(); gernotbelger@9071: this.oldStorage = new TreeMap(); gernotbelger@9071: this.topLayout = new VLayout(); gernotbelger@9071: this.oldItems = new VLayout(); gernotbelger@9071: this.currentItems = new VLayout(); gernotbelger@9071: this.exportModes = new VLayout(); gernotbelger@9071: this.report = new VLayout(); ingo@224: ingo@224: init(); ingo@224: ingo@224: addParameterChangeHandler(this); ingo@224: ingo@790: setArtifact(artifact, false); ingo@224: } ingo@224: ingo@23: protected void init() { gernotbelger@9071: final HLayout rootLayout = new HLayout(); ingo@90: rootLayout.setMembersMargin(20); ingo@73: gernotbelger@9071: final VLayout left = new VLayout(); ingo@53: gernotbelger@9071: if (this.old == null || this.old.size() == 0) { gernotbelger@9071: this.oldItems.setHeight(1); ingo@83: } ingo@83: gernotbelger@9071: this.oldItems.setMembersMargin(10); gernotbelger@9071: this.oldItems.setStyleName(STYLENAME_OLD_PARAMETERS); gernotbelger@9071: this.currentItems.setAlign(VerticalAlignment.TOP); ingo@23: ingo@73: left.setMembersMargin(20); ingo@73: left.setWidth(300); ingo@50: gernotbelger@9071: left.addMember(this.oldItems); gernotbelger@9071: left.addMember(this.currentItems); gernotbelger@9071: left.addMember(this.exportModes); gernotbelger@9071: left.addMember(this.report); sascha@582: gernotbelger@9071: this.reportPanel = new Canvas(); gernotbelger@9071: this.reportPanel.setHeight("*"); gernotbelger@9071: this.report.addMember(this.reportPanel); ingo@73: ingo@90: rootLayout.addMember(left); ingo@788: rootLayout.addMember(createSectionStack()); ingo@73: gernotbelger@9071: this.topLayout.addMember(rootLayout); gernotbelger@9071: if (this.artifact == null) { gernotbelger@9071: final Canvas moduleSelection = renderNew(); ingo@224: moduleSelection.setLayoutAlign(VerticalAlignment.TOP); gernotbelger@9071: this.currentItems.addMember(moduleSelection); ingo@224: } ingo@90: gernotbelger@9071: setPane(this.topLayout); ingo@73: } ingo@73: ingo@788: protected SectionStack createSectionStack() { gernotbelger@9071: this.stack = new SectionStack(); gernotbelger@9071: this.stack.setHeight100(); gernotbelger@9071: this.stack.setCanResizeSections(true); gernotbelger@9071: this.stack.setVisibilityMode(VisibilityMode.MULTIPLE); gernotbelger@9071: this.stack.setOverflow(Overflow.SCROLL); ingo@788: felix@3346: // This canvas is used to render helper widgets. ingo@788: final SectionStackSection helperSection = new SectionStackSection(); ingo@788: helperSection.setExpanded(false); gernotbelger@9071: helperSection.setTitle(this.MSG.helperPanelTitle()); gernotbelger@9071: this.helperPanel = new VLayout() { christian@4062: @Override gernotbelger@9071: public void addMember(final Canvas component) { ingo@788: super.addMember(component); gernotbelger@9071: ParameterList.this.stack.expandSection(helperSection.getID()); ingo@788: } ingo@788: christian@4062: @Override gernotbelger@9071: public void removeMembers(final Canvas[] components) { ingo@788: super.removeMembers(components); ingo@788: helperSection.setExpanded(false); ingo@788: } ingo@788: }; gernotbelger@9071: this.helperPanel.setWidth100(); gernotbelger@9071: this.helperPanel.setHeight100(); gernotbelger@9071: helperSection.setItems(this.helperPanel); ingo@788: felix@3346: // This canvas is used to render calculation results. ingo@788: final SectionStackSection tableSection = new SectionStackSection(); ingo@788: tableSection.setExpanded(false); gernotbelger@9071: tableSection.setTitle(this.MSG.calcTableTitle()); gernotbelger@9071: this.tablePanel = new VLayout() { christian@4062: @Override gernotbelger@9071: public void addMember(final Canvas component) { ingo@788: super.addMember(component); ingo@788: tableSection.setExpanded(true); gernotbelger@9071: if (ParameterList.this.stack.getSection(InfoPanel.SECTION_ID) != null) { gernotbelger@9071: ParameterList.this.stack.getSection(InfoPanel.SECTION_ID).setExpanded(false); rrenkert@7982: } ingo@788: } ingo@788: christian@4062: @Override gernotbelger@9071: public void removeMembers(final Canvas[] components) { ingo@788: super.removeMembers(components); ingo@788: tableSection.setExpanded(false); ingo@788: } ingo@788: }; gernotbelger@9071: this.tablePanel.setHeight100(); gernotbelger@9071: this.tablePanel.setWidth100(); gernotbelger@9071: tableSection.setItems(this.tablePanel); ingo@788: gernotbelger@9071: this.stack.setSections(helperSection, tableSection); ingo@788: gernotbelger@9071: return this.stack; ingo@788: } ingo@788: felix@3346: /** Sets and forwards artifact. */ gernotbelger@9071: protected void setArtifact(final Artifact artifact) { ingo@790: setArtifact(artifact, true); ingo@790: } ingo@790: gernotbelger@9071: protected void setArtifact(final Artifact artifact, final boolean forward) { gernotbelger@9071: final Artifact tmp = this.artifact; ingo@73: this.artifact = artifact; ingo@73: ingo@790: if (forward) { gernotbelger@9071: fireParameterChangeEvent(tmp, this.artifact, ParameterChangeEvent.Type.FORWARD); gernotbelger@9071: } else { gernotbelger@9071: fireParameterChangeEvent(tmp, this.artifact, ParameterChangeEvent.Type.BACK); ingo@790: } ingo@73: } ingo@73: ingo@73: /** ingo@73: * This method registers a new ParameterChangeHandler. ingo@73: * gernotbelger@9071: * @param handler gernotbelger@9071: * The new ParameterChangeHandler. ingo@73: */ christian@4062: @Override gernotbelger@9071: public void addParameterChangeHandler(final ParameterChangeHandler handler) { ingo@73: if (handler != null) { gernotbelger@9071: this.parameterHandlers.add(handler); ingo@73: } ingo@73: } ingo@73: ingo@73: /** ingo@73: * This method calls the onParameterChange() method of all ingo@73: * registered ParameterChangeHandler. ingo@73: */ gernotbelger@9071: protected void fireParameterChangeEvent(final Artifact old, final Artifact newArt, final ParameterChangeEvent.Type type) { gernotbelger@9071: final ParameterChangeEvent e = new ParameterChangeEvent(old, newArt, type); ingo@790: gernotbelger@9071: for (final ParameterChangeHandler handler : this.parameterHandlers) { ingo@790: handler.onParameterChange(e); ingo@73: } ingo@73: } ingo@73: ingo@73: /** ingo@73: * This method creates a Canvas displaying the plugins of FLYS combined with ingo@73: * a widget to select a river. ingo@73: * ingo@73: * @return a Canvas that displays the supported plugins and rivers of FLYS. ingo@73: */ ingo@73: protected Canvas renderNew() { gernotbelger@9071: final River[] rivers = this.flys.getRivers(); gernotbelger@9071: final DataItem[] items = new DataItem[rivers.length]; ingo@73: ingo@73: int i = 0; gernotbelger@9071: for (final River river : rivers) { gernotbelger@9071: final String name = river.getName(); gernotbelger@9071: final String mUuid = river.getModelUuid(); gernotbelger@9071: items[i++] = new DefaultDataItem(name, null, mUuid); ingo@73: } ingo@73: gernotbelger@9071: final Data data = new DefaultData("river", this.MSG.river_selection(), null, items); ingo@73: gernotbelger@9071: final LinkSelection widget = new LinkSelection(); gernotbelger@9071: final HasStepForwardHandlers handler = widget; ingo@73: gernotbelger@9071: widget.setContainer(this.helperPanel); ingo@83: ingo@73: handler.addStepForwardHandler(new StepForwardHandler() { christian@4184: private static final long serialVersionUID = -6210719844707004860L; christian@4184: christian@4062: @Override gernotbelger@9071: public void onStepForward(final StepForwardEvent event) { ingo@3353: lockUI(); gernotbelger@9071: final Data[] data = event.getData(); ingo@73: gernotbelger@9071: final DataItem[] moduleItems = data[0].getItems(); gernotbelger@9071: final DataItem[] riversItems = data[1].getItems(); ingo@73: gernotbelger@9071: final String module = moduleItems[0].getStringValue(); gernotbelger@9071: final String river = riversItems[0].getStringValue(); ingo@73: christian@4184: if (module == null || river == null) { gernotbelger@9071: GWT.log("ParameterList.renderNew(): module == null " + "|| river == null"); ingo@3353: unlockUI(); ingo@90: return; ingo@90: } gernotbelger@8870: final String newTitle = moduleItems[0].getLabel(); ingo@102: setTitle(newTitle); ingo@90: gernotbelger@9071: final Config config = Config.getInstance(); ingo@229: final String locale = config.getLocale(); ingo@229: felix@3346: final Data[] feedData = new Data[] { data[1] }; ingo@229: gernotbelger@9071: ParameterList.this.artifactService.create(locale, module.toLowerCase(), null, new AsyncCallback() { gernotbelger@9071: @Override gernotbelger@9071: public void onFailure(final Throwable caught) { gernotbelger@9071: unlockUI(); gernotbelger@9071: GWT.log("Could not create the new artifact."); gernotbelger@9071: SC.warn(FLYS.getExceptionString(ParameterList.this.MSG, caught)); gernotbelger@9071: } ingo@73: gernotbelger@9071: @Override gernotbelger@9071: public void onSuccess(final Artifact artifact) { gernotbelger@9071: GWT.log("Successfully created a new artifact."); ingo@73: gernotbelger@9071: ParameterList.this.forwardService.go(locale, artifact, feedData, new AsyncCallback() { gernotbelger@9071: @Override gernotbelger@9071: public void onFailure(final Throwable caught) { gernotbelger@9071: unlockUI(); gernotbelger@9071: GWT.log("Could not feed the artifact."); gernotbelger@9071: SC.warn(caught.getMessage()); gernotbelger@9071: } gernotbelger@9071: gernotbelger@9071: @Override gernotbelger@9071: public void onSuccess(final Artifact artifact) { gernotbelger@9071: GWT.log("Successfully feed the artifact."); gernotbelger@9071: ParameterList.this.old.clear(); gernotbelger@9071: ParameterList.this.cView.addArtifactToCollection(artifact); gernotbelger@9071: setArtifact(artifact); gernotbelger@9071: unlockUI(); gernotbelger@9071: } gernotbelger@9071: }); gernotbelger@9071: } ingo@73: }); ingo@73: } ingo@73: }); ingo@73: gernotbelger@9071: final DataList list = new DataList(); ingo@73: list.add(data); ingo@73: ingo@73: return widget.create(list); ingo@23: } ingo@23: ingo@38: protected void clearOldData() { gernotbelger@9071: this.old.clear(); ingo@38: } ingo@38: gernotbelger@9071: public void addOldData(final DataList old) { ingo@790: addOldData(old, true); ingo@790: } ingo@790: gernotbelger@9071: public void addOldData(final DataList old, final boolean redraw) { ingo@23: if (old != null) { ingo@23: this.old.add(old); ingo@23: } ingo@23: ingo@790: refreshOld(redraw); ingo@23: } ingo@23: gernotbelger@9071: public void addOldDatas(final DataList[] old) { ingo@790: addOldDatas(old, true); ingo@790: } ingo@790: gernotbelger@9071: public void addOldDatas(final DataList[] old, final boolean redraw) { ingo@23: if (old != null && old.length > 0) { gernotbelger@9071: for (final DataList o : old) { ingo@785: if (o == null) { ingo@785: continue; ingo@785: } ingo@785: ingo@38: if (!exists(o)) { ingo@38: GWT.log("Data '" + o.getLabel() + "' is new."); ingo@790: addOldData(o, false); ingo@38: } ingo@23: } ingo@23: ingo@790: if (redraw) { ingo@790: addOldData(null, true); ingo@790: } ingo@790: ingo@23: return; ingo@23: } ingo@23: ingo@790: addOldData(null, true); ingo@23: } ingo@23: gernotbelger@9071: public boolean exists(final DataList data) { ingo@785: if (data == null) { ingo@785: return false; ingo@785: } ingo@785: gernotbelger@9071: final String stateName = data.getState(); ingo@38: gernotbelger@9071: for (final DataList o : this.old) { ingo@51: if (stateName.equals(o.getState())) { ingo@38: return true; ingo@38: } ingo@38: } ingo@38: ingo@38: return false; ingo@38: } ingo@38: gernotbelger@9071: public void setCurrentData(final DataList current, final UIProvider uiProvider) { gernotbelger@9071: this.current = current; ingo@23: this.uiProvider = uiProvider; ingo@23: ingo@23: refreshCurrent(); ingo@23: } ingo@23: gernotbelger@9071: public void refreshOld(final boolean redrawAll) { ingo@790: if (redrawAll) { ingo@790: refreshAllOld(); gernotbelger@9071: } else { gernotbelger@9071: final DataList dataList = this.old.get(this.old.size() - 1); gernotbelger@9071: final String state = dataList.getState(); ingo@23: gernotbelger@9071: if (this.oldStorage.get(state) == null) { gernotbelger@9071: final String provider = dataList.getUIProvider(); gernotbelger@9071: final UIProvider uiprovider = UIProviderFactory.getProvider(provider, this.flys.getCurrentUser()); ingo@790: ((HasStepBackHandlers) uiprovider).addStepBackHandler(this); ingo@23: gernotbelger@9071: final Canvas c = uiprovider.createOld(dataList); ingo@790: if (c != null) { gernotbelger@9071: this.oldStorage.put(dataList.getState(), c); gernotbelger@9071: this.oldItems.addMember(c); ingo@790: } ingo@790: } ingo@23: } ingo@23: ingo@790: updateOldHeight(); ingo@790: } ingo@790: ingo@790: protected void refreshAllOld() { gernotbelger@9071: final List not = new ArrayList(); ingo@790: gernotbelger@9071: for (final DataList data : this.old) { gernotbelger@9071: final String state = data.getState(); ingo@790: gernotbelger@9071: final Canvas c = this.oldStorage.get(state); ingo@790: ingo@790: if (c != null) { ingo@790: not.add(state); ingo@790: } ingo@790: } ingo@790: gernotbelger@9071: final Map newOld = new TreeMap(); ingo@790: gernotbelger@9071: final Set> entries = this.oldStorage.entrySet(); gernotbelger@9071: for (final Map.Entry entry : entries) { gernotbelger@9071: final String state = entry.getKey(); gernotbelger@9071: final Canvas value = entry.getValue(); ingo@790: ingo@790: if (not.indexOf(state) < 0) { gernotbelger@9071: this.oldItems.removeMember(value); gernotbelger@9071: } else { ingo@790: newOld.put(state, value); ingo@790: } ingo@790: } ingo@790: gernotbelger@9071: this.oldStorage = newOld; ingo@790: } ingo@790: ingo@790: protected void updateOldHeight() { gernotbelger@9071: final int minHeight = this.oldItems.getMinHeight(); ingo@23: if (minHeight <= 20) { gernotbelger@9071: this.oldItems.setHeight(20); gernotbelger@9071: } else { gernotbelger@9071: this.oldItems.setHeight(minHeight); ingo@23: } ingo@23: } ingo@23: ingo@23: /** felix@6579: * Refreshes the part displaying the data of the current state. ingo@23: * The UI is created using the UIProvider stored in the Data object. ingo@23: */ ingo@23: public void refreshCurrent() { gernotbelger@9071: this.currentItems.removeMembers(this.currentItems.getMembers()); ingo@53: gernotbelger@9071: if (this.current != null && this.uiProvider != null) { gernotbelger@9071: final Canvas c = this.uiProvider.create(this.current); gernotbelger@9071: final Canvas h = this.uiProvider.createHelpLink(this.current, null, this.flys); ingo@2500: gernotbelger@9071: final HLayout wrapper = new HLayout(); ingo@2500: wrapper.addMember(h); ingo@2500: wrapper.addMember(c); ingo@2500: gernotbelger@9071: this.currentItems.addMember(wrapper); gernotbelger@9071: } else if (this.uiProvider != null) { gernotbelger@9071: final Canvas c = this.uiProvider.create(null); ingo@54: c.setLayoutAlign(VerticalAlignment.TOP); ingo@54: gernotbelger@9071: this.currentItems.addMember(c); gernotbelger@9071: } else { gernotbelger@9071: this.currentItems.setHeight(1); ingo@275: } ingo@789: gernotbelger@9071: final Canvas[] members = this.currentItems.getMembers(); ingo@789: if (members == null || members.length == 0) { gernotbelger@9071: this.currentItems.setHeight(1); gernotbelger@9071: } else { ingo@789: int height = 0; ingo@789: gernotbelger@9071: for (final Canvas member : members) { ingo@789: height += member.getHeight(); ingo@789: } ingo@789: gernotbelger@9071: this.currentItems.setHeight(height); ingo@789: } ingo@23: } ingo@60: ingo@60: /** ingo@73: * This method is called if the user clicks on the 'next' button to advance ingo@73: * to the next state. ingo@73: * gernotbelger@9071: * @param event gernotbelger@9071: * The StepForwardEvent. ingo@73: */ christian@4062: @Override gernotbelger@9071: public void onStepForward(final StepForwardEvent event) { ingo@73: GWT.log("CollectionView - onStepForward()"); ingo@3353: lockUI(); ingo@73: gernotbelger@9071: final Config config = Config.getInstance(); gernotbelger@9071: final String locale = config.getLocale(); ingo@229: gernotbelger@9071: this.forwardService.go(locale, this.artifact, event.getData(), new AsyncCallback() { gernotbelger@9071: @Override gernotbelger@9071: public void onFailure(final Throwable caught) { gernotbelger@9071: unlockUI(); gernotbelger@9071: GWT.log("Could not feed the artifact."); gernotbelger@9071: SC.warn(FLYS.getExceptionString(ParameterList.this.MSG, caught)); gernotbelger@9071: } ingo@73: gernotbelger@9071: @Override gernotbelger@9071: public void onSuccess(final Artifact artifact) { gernotbelger@9071: GWT.log("Successfully feed the artifact."); gernotbelger@9071: ParameterList.this.old.clear(); ingo@790: gernotbelger@9071: setArtifact(artifact, true); gernotbelger@9071: unlockUI(); gernotbelger@9071: } ingo@73: }); ingo@73: } ingo@73: ingo@73: /** ingo@60: * This method is used to remove all old items from this list after the user ingo@60: * has clicked the step back button. ingo@60: * gernotbelger@9071: * @param e gernotbelger@9071: * The StepBackEvent that holds the identifier of the target state. ingo@60: */ christian@4062: @Override gernotbelger@9071: public void onStepBack(final StepBackEvent e) { ingo@3353: lockUI(); gernotbelger@9071: final String target = e.getTarget(); ingo@229: gernotbelger@9071: final Config config = Config.getInstance(); gernotbelger@9071: final String locale = config.getLocale(); ingo@73: gernotbelger@9071: this.advanceService.advance(locale, this.artifact, target, new AsyncCallback() { gernotbelger@9071: @Override gernotbelger@9071: public void onFailure(final Throwable caught) { gernotbelger@9071: unlockUI(); gernotbelger@9071: GWT.log("Could not go back to '" + target + "'"); gernotbelger@9071: SC.warn(FLYS.getExceptionString(ParameterList.this.MSG, caught)); gernotbelger@9071: } ingo@73: gernotbelger@9071: @Override gernotbelger@9071: public void onSuccess(final Artifact artifact) { gernotbelger@9071: GWT.log("Successfully step back to '" + target + "'"); gernotbelger@9071: gernotbelger@9071: ParameterList.this.old.clear(); gernotbelger@9071: gernotbelger@9071: setArtifact(artifact, false); gernotbelger@9071: unlockUI(); ingo@73: } gernotbelger@9071: }); ingo@60: } ingo@72: christian@4062: @Override ingo@785: public void onAdvance(final String target) { gernotbelger@9071: final Config config = Config.getInstance(); gernotbelger@9071: final String locale = config.getLocale(); ingo@785: gernotbelger@9071: this.advanceService.advance(locale, this.artifact, target, new AsyncCallback() { gernotbelger@9071: @Override gernotbelger@9071: public void onFailure(final Throwable caught) { gernotbelger@9071: GWT.log("Could not go to '" + target + "'"); gernotbelger@9071: SC.warn(FLYS.getExceptionString(ParameterList.this.MSG, caught)); gernotbelger@9071: } ingo@785: gernotbelger@9071: @Override gernotbelger@9071: public void onSuccess(final Artifact artifact) { gernotbelger@9071: GWT.log("Successfully advanced to '" + target + "'"); gernotbelger@9071: gernotbelger@9071: ParameterList.this.old.clear(); gernotbelger@9071: gernotbelger@9071: setArtifact(artifact, true); ingo@785: } gernotbelger@9071: }); ingo@785: } ingo@785: ingo@72: /** ingo@72: * Implements the onCollectionChange() method to do update the GUI after the ingo@72: * parameterization has changed. ingo@72: * gernotbelger@9071: * @param event gernotbelger@9071: * The ParameterChangeEvent. ingo@72: */ christian@4062: @Override gernotbelger@9071: public void onParameterChange(final ParameterChangeEvent event) { ingo@72: GWT.log("ParameterList.onParameterChange"); ingo@72: gernotbelger@9071: final Canvas[] c = this.helperPanel.getMembers(); ingo@788: if (c != null && c.length > 0) { gernotbelger@9071: this.helperPanel.removeMembers(c); ingo@83: } ingo@83: gernotbelger@9071: final Artifact art = event.getNewValue(); gernotbelger@9071: final ArtifactDescription desc = art.getArtifactDescription(); ingo@72: gernotbelger@9071: final DataList currentData = desc.getCurrentData(); ingo@72: if (currentData != null) { ingo@72: // the user has to enter some attributes gernotbelger@9071: final String uiProvider = currentData.getUIProvider(); gernotbelger@9071: final UIProvider provider = UIProviderFactory.getProvider(uiProvider, this.flys.getCurrentUser()); ingo@72: gernotbelger@9071: provider.setContainer(this.helperPanel); raimund@233: provider.setArtifact(art); gernotbelger@9071: provider.setCollection(this.cView.getCollection()); raimund@915: provider.setParameterList(this); ingo@83: ingo@73: ((HasStepForwardHandlers) provider).addStepForwardHandler(this); ingo@73: ((HasStepBackHandlers) provider).addStepBackHandler(this); ingo@72: ingo@72: setCurrentData(currentData, provider); gernotbelger@9071: } else { gernotbelger@9071: final String[] reachable = desc.getReachableStates(); ingo@785: if (reachable != null && reachable.length > 0) { ingo@785: // We have reached a final state with the option to step to ingo@785: // further to a next state. But in the current state, no user ingo@785: // data is required. gernotbelger@9071: final UIProvider ui = UIProviderFactory.getProvider("continue", null); ingo@785: ui.setArtifact(art); gernotbelger@9071: ui.setCollection(this.cView.getCollection()); raimund@915: ui.setParameterList(this); ingo@785: ingo@785: ((ContinuePanel) ui).addAdvanceHandler(this); ingo@785: ingo@785: setCurrentData(null, ui); gernotbelger@9071: } else { ingo@785: // we have reached a final state with no more user input ingo@785: setCurrentData(null, null); ingo@785: } ingo@72: } gernotbelger@8854: gernotbelger@9071: // FIXME: we got a whole artifact framework to separate ui and backend stuff, but in the end.... we have switches over gernotbelger@9071: // specific datatypes here... gernotbelger@9071: if (art instanceof WINFOArtifact || art instanceof SINFOArtifact || art instanceof UINFOArtifact || art instanceof FixAnalysisArtifact gernotbelger@9071: || art instanceof BUNDUArtifact) { bjoern@4270: createGaugePanel(); bjoern@4270: renderInfo(desc.getRiver(), desc.getOldData()); gernotbelger@9071: } else if (art instanceof MINFOArtifact) { bjoern@4271: createMeasurementStationPanel(); bjoern@4271: renderInfo(desc.getRiver(), desc.getOldData()); gernotbelger@9071: } else { bjoern@4270: removeInfoPanel(); bjoern@4254: } ingo@72: gernotbelger@9071: addOldDatas(desc.getOldData(), event.getType() == ParameterChangeEvent.Type.BACK); ingo@72: } raimund@256: christian@4062: @Override gernotbelger@9071: public void onCollectionChange(final CollectionChangeEvent event) { gernotbelger@9071: final Collection c = event.getNewValue(); gernotbelger@9071: final Map outs = c.getOutputModes(); gernotbelger@9071: final Set keys = outs.keySet(); ingo@275: gernotbelger@9071: final OutputMode[] outputs = new OutputMode[outs.size()]; ingo@513: ingo@513: int idx = 0; gernotbelger@9071: for (final String outname : keys) { ingo@513: outputs[idx++] = outs.get(outname); ingo@513: } ingo@513: ingo@513: updateExportModes(c, getExportModes(outputs)); sascha@589: updateReportModes(c, getReportModes(outputs)); ingo@513: } ingo@513: christian@4062: @Override gernotbelger@9071: public void onOutputModesChange(final OutputModesChangeEvent event) { ingo@513: gernotbelger@9071: final Collection c = this.cView.getCollection(); ingo@513: ingo@513: if (c != null) { gernotbelger@9071: final OutputMode[] outs = event.getOutputModes(); sascha@589: updateExportModes(c, getExportModes(outs)); sascha@589: updateReportModes(c, getReportModes(outs)); ingo@513: } ingo@513: } ingo@513: gernotbelger@9071: protected List getReportModes(final OutputMode[] outs) { ingo@513: gernotbelger@9071: final List reports = new ArrayList(); sascha@589: sascha@589: if (outs == null || outs.length == 0) { sascha@589: return reports; sascha@589: } sascha@589: gernotbelger@9071: for (final OutputMode out : outs) { sascha@589: if (out instanceof ReportMode) { gernotbelger@9071: reports.add((ReportMode) out); sascha@589: } sascha@589: } sascha@589: sascha@589: return reports; sascha@589: } sascha@589: gernotbelger@9071: protected List getExportModes(final OutputMode[] outs) { gernotbelger@9071: final List exports = new ArrayList(); ingo@275: ingo@513: if (outs == null || outs.length == 0) { ingo@513: return exports; ingo@513: } ingo@275: gernotbelger@9071: for (final OutputMode out : outs) { ingo@275: if (out instanceof ExportMode) { ingo@275: exports.add((ExportMode) out); ingo@275: } ingo@275: } ingo@275: ingo@513: return exports; ingo@275: } ingo@275: gernotbelger@9071: protected void updateExportModes(final Collection c, final List exports) { gernotbelger@9071: final int num = exports != null ? exports.size() : 0; ingo@275: GWT.log("Update export modes: " + num); ingo@275: gernotbelger@9071: this.exportModes.removeMembers(this.exportModes.getMembers()); ingo@275: ingo@275: if (exports.size() > 0) { gernotbelger@9071: this.exportModes.addMember(new ExportPanel(c, exports)); gernotbelger@9071: } else { gernotbelger@9071: this.exportModes.setHeight(1); ingo@789: } ingo@275: } ingo@275: gernotbelger@9071: protected void updateReportModes(final Collection c, final List reports) { gernotbelger@9071: final int num = reports != null ? reports.size() : 0; sascha@589: GWT.log("Update report modes: " + num); sascha@589: sascha@604: if (num == 0) { gernotbelger@9071: this.reportPanel.setContents(""); sascha@604: return; sascha@604: } sascha@604: gernotbelger@9071: final Config config = Config.getInstance(); gernotbelger@9071: final String locale = config.getLocale(); sascha@604: gernotbelger@9071: final String cid = c.identifier(); sascha@604: gernotbelger@9071: for (final ReportMode report : reports) { sascha@589: GWT.log("report '" + report.toString() + "'"); sascha@604: gernotbelger@9071: this.reportService.report(cid, locale, report.getName(), new AsyncCallback() { gernotbelger@9071: @Override gernotbelger@9071: public void onFailure(final Throwable caught) { gernotbelger@9071: SC.warn(FLYS.getExceptionString(ParameterList.this.MSG, caught)); gernotbelger@9071: } sascha@604: gernotbelger@9071: @Override gernotbelger@9071: public void onSuccess(final String msg) { gernotbelger@9071: setReportMessage(msg); gernotbelger@9071: } gernotbelger@9071: }); sascha@589: } sascha@604: } sascha@589: felix@4617: /** Sets content of reportPanel. */ sascha@604: protected void setReportMessage(String msg) { sascha@604: GWT.log("returned from service: " + msg); sascha@604: if (msg == null) { sascha@604: msg = ""; sascha@604: } gernotbelger@9071: this.reportPanel.setContents(msg); sascha@589: } sascha@589: raimund@256: /** raimund@256: * Adds a table to the parameterlist to show calculated data. raimund@256: * gernotbelger@9071: * @param table gernotbelger@9071: * The table data panel. raimund@256: */ gernotbelger@9071: public void setTable(final TableDataPanel table) { ingo@788: removeTable(); ingo@788: gernotbelger@9071: final Canvas c = table.create(); ingo@788: c.setHeight100(); ingo@788: c.setWidth100(); ingo@788: gernotbelger@9071: this.tablePanel.addMember(c); ingo@788: } ingo@788: ingo@788: public boolean hasTable() { gernotbelger@9071: final Canvas[] members = this.tablePanel.getMembers(); ingo@788: ingo@788: return members != null && members.length > 0; raimund@260: } raimund@260: raimund@260: /** raimund@260: * Removes the table from the parameter list. raimund@260: */ ingo@788: public void removeTable() { gernotbelger@9071: final Canvas[] members = this.tablePanel.getMembers(); raimund@260: ingo@788: if (members != null && members.length > 0) { gernotbelger@9071: this.tablePanel.removeMembers(members); ingo@788: } raimund@256: } raimund@915: gernotbelger@9071: public void registerCollectionViewTabHandler(final TabSelectedHandler tsh) { bjoern@4662: this.cView.registerTabHandler(tsh); raimund@915: } ingo@3353: ingo@3353: protected void lockUI() { gernotbelger@9071: this.cView.lockUI(); ingo@3353: } ingo@3353: ingo@3353: protected void unlockUI() { gernotbelger@9071: this.cView.unlockUI(); ingo@3353: } bjoern@3715: bjoern@4254: private void createGaugePanel() { bjoern@4254: GWT.log("ParameterList - createGaugePanel"); gernotbelger@9071: if (this.infoPanel == null) { gernotbelger@9071: this.infoPanel = new GaugePanel(this.flys); gernotbelger@9071: this.infoPanel.setWidth100(); gernotbelger@9071: this.infoPanel.setHeight100(); bjoern@4254: } bjoern@4254: } bjoern@4254: bjoern@4271: private void createMeasurementStationPanel() { bjoern@4271: GWT.log("ParameterList - createMeasurementStationPanel"); gernotbelger@9071: if (this.infoPanel == null) { gernotbelger@9071: this.infoPanel = new MeasurementStationPanel(this.flys); gernotbelger@9071: this.infoPanel.setWidth100(); gernotbelger@9071: this.infoPanel.setHeight100(); bjoern@4271: } bjoern@4271: } bjoern@4271: bjoern@4270: private void showInfoPanel() { bjoern@4270: GWT.log("ParameterList - showInfoPanel"); bjoern@4270: bjoern@4270: /* Don't add InfoPanel twice */ gernotbelger@9071: SectionStackSection info = this.stack.getSection(InfoPanel.SECTION_ID); rrenkert@7934: if (info == null) { rrenkert@7934: info = new SectionStackSection(); gernotbelger@9071: info.setTitle(this.infoPanel.getSectionTitle()); rrenkert@7934: info.setID(InfoPanel.SECTION_ID); rrenkert@7934: info.setName(InfoPanel.SECTION_ID); gernotbelger@9071: info.setItems(this.infoPanel); gernotbelger@9071: this.stack.addSection(info, 0); bjoern@4270: } bjoern@4270: rrenkert@7934: info.setExpanded(true); bjoern@4254: } bjoern@4254: bjoern@4270: private void hideInfoPanel() { bjoern@4270: GWT.log("ParameterList - hideInfoPanel"); bjoern@4254: gernotbelger@9071: if (this.infoPanel != null) { gernotbelger@9071: this.infoPanel.hide(); bjoern@4254: } bjoern@4254: } bjoern@4254: bjoern@4270: private void removeInfoPanel() { bjoern@4270: GWT.log("ParameterList - removeInfoPanel"); gernotbelger@9071: final SectionStackSection exists = this.stack.getSection(InfoPanel.SECTION_ID); bjoern@4292: if (exists != null) { gernotbelger@9071: this.stack.removeSection(InfoPanel.SECTION_ID); bjoern@4292: } bjoern@4254: } bjoern@4254: gernotbelger@9071: private void renderInfo(final String river, final DataList[] data) { bjoern@4270: GWT.log("ParameterList - renderInfo"); bjoern@4270: bjoern@4270: if (river != null) { bjoern@4270: showInfoPanel(); gernotbelger@9071: this.infoPanel.setRiver(river); gernotbelger@9071: this.infoPanel.setData(data); gernotbelger@9071: } else { bjoern@4270: GWT.log("ParameterList - renderInfo no river"); bjoern@4270: hideInfoPanel(); bjoern@4270: } bjoern@3715: } ingo@23: } ingo@23: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :