ingo@23: package de.intevation.flys.client.client.ui; ingo@23: ingo@23: import java.util.ArrayList; ingo@23: import java.util.List; ingo@275: import java.util.Map; ingo@275: import java.util.Set; ingo@790: import java.util.TreeMap; ingo@23: ingo@38: import com.google.gwt.core.client.GWT; ingo@73: import com.google.gwt.user.client.rpc.AsyncCallback; ingo@38: ingo@23: import com.smartgwt.client.types.VerticalAlignment; ingo@788: import com.smartgwt.client.types.VisibilityMode; ingo@215: import com.smartgwt.client.util.SC; ingo@53: import com.smartgwt.client.widgets.Canvas; ingo@23: import com.smartgwt.client.widgets.layout.HLayout; ingo@788: import com.smartgwt.client.widgets.layout.SectionStack; ingo@788: import com.smartgwt.client.widgets.layout.SectionStackSection; ingo@23: import com.smartgwt.client.widgets.layout.VLayout; ingo@90: import com.smartgwt.client.widgets.tab.Tab; raimund@915: import com.smartgwt.client.widgets.tab.events.TabSelectedHandler; ingo@23: ingo@72: import de.intevation.flys.client.shared.model.Artifact; bjoern@3715: import de.intevation.flys.client.shared.model.WINFOArtifact; ingo@72: import de.intevation.flys.client.shared.model.ArtifactDescription; ingo@275: import de.intevation.flys.client.shared.model.Collection; ingo@23: import de.intevation.flys.client.shared.model.Data; ingo@73: import de.intevation.flys.client.shared.model.DataItem; ingo@51: import de.intevation.flys.client.shared.model.DataList; ingo@73: import de.intevation.flys.client.shared.model.DefaultData; ingo@73: import de.intevation.flys.client.shared.model.DefaultDataItem; sascha@589: import de.intevation.flys.client.shared.model.ReportMode; ingo@275: import de.intevation.flys.client.shared.model.ExportMode; ingo@275: import de.intevation.flys.client.shared.model.OutputMode; ingo@73: import de.intevation.flys.client.shared.model.River; ingo@73: import de.intevation.flys.client.client.Config; ingo@73: import de.intevation.flys.client.client.FLYS; ingo@211: import de.intevation.flys.client.client.FLYSConstants; ingo@785: import de.intevation.flys.client.client.event.AdvanceHandler; ingo@275: import de.intevation.flys.client.client.event.CollectionChangeEvent; ingo@275: import de.intevation.flys.client.client.event.CollectionChangeHandler; ingo@73: import de.intevation.flys.client.client.event.HasParameterChangeHandler; ingo@60: import de.intevation.flys.client.client.event.HasStepBackHandlers; ingo@72: import de.intevation.flys.client.client.event.HasStepForwardHandlers; ingo@513: import de.intevation.flys.client.client.event.OutputModesChangeEvent; ingo@513: import de.intevation.flys.client.client.event.OutputModesChangeHandler; ingo@72: import de.intevation.flys.client.client.event.ParameterChangeEvent; ingo@72: import de.intevation.flys.client.client.event.ParameterChangeHandler; ingo@60: import de.intevation.flys.client.client.event.StepBackEvent; ingo@60: import de.intevation.flys.client.client.event.StepBackHandler; ingo@73: import de.intevation.flys.client.client.event.StepForwardEvent; ingo@73: import de.intevation.flys.client.client.event.StepForwardHandler; ingo@73: import de.intevation.flys.client.client.services.AdvanceService; sascha@604: import de.intevation.flys.client.client.services.ReportService; ingo@73: import de.intevation.flys.client.client.services.AdvanceServiceAsync; ingo@73: import de.intevation.flys.client.client.services.ArtifactService; ingo@73: import de.intevation.flys.client.client.services.ArtifactServiceAsync; ingo@73: import de.intevation.flys.client.client.services.StepForwardService; ingo@73: import de.intevation.flys.client.client.services.StepForwardServiceAsync; sascha@604: import de.intevation.flys.client.client.services.ReportServiceAsync; ingo@23: ingo@23: ingo@60: public class ParameterList ingo@90: extends Tab ingo@73: implements StepBackHandler, StepForwardHandler, ParameterChangeHandler, ingo@513: HasParameterChangeHandler, CollectionChangeHandler, ingo@785: OutputModesChangeHandler, AdvanceHandler ingo@60: { ingo@789: public static final String STYLENAME_OLD_PARAMETERS = "oldParameters"; ingo@789: ingo@73: /** 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. */ ingo@73: protected ArtifactServiceAsync artifactService = ingo@73: GWT.create(ArtifactService.class); ingo@73: ingo@73: /** The StepForwardService used to put data into an existing artifact. */ ingo@73: protected StepForwardServiceAsync forwardService = ingo@73: GWT.create(StepForwardService.class); ingo@73: ingo@73: /** The StepForwardService used to put data into an existing artifact. */ ingo@73: protected AdvanceServiceAsync advanceService = ingo@73: GWT.create(AdvanceService.class); ingo@73: ingo@73: sascha@604: protected ReportServiceAsync reportService = sascha@604: GWT.create(ReportService.class); sascha@604: sascha@604: ingo@73: /** 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; ingo@51: 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@3715: protected GaugePanel gaugePanel; sascha@582: protected Canvas reportPanel; ingo@23: ingo@90: public ParameterList(FLYS flys, CollectionView cView, String title) { ingo@90: super(title); ingo@90: ingo@73: this.cView = cView; ingo@73: this.flys = flys; ingo@73: ingo@73: parameterHandlers = new ArrayList(); ingo@73: old = new ArrayList(); ingo@790: oldStorage = new TreeMap(); raimund@256: topLayout = new VLayout(); ingo@73: oldItems = new VLayout(); ingo@73: currentItems = new VLayout(); ingo@275: exportModes = new VLayout(); sascha@582: report = new VLayout(); ingo@23: ingo@224: addParameterChangeHandler(this); ingo@224: ingo@23: init(); ingo@23: } ingo@23: ingo@23: ingo@224: public ParameterList( ingo@224: FLYS flys, ingo@224: CollectionView cView, ingo@224: String title, ingo@224: Artifact artifact) ingo@224: { ingo@224: super(title); ingo@224: ingo@224: this.cView = cView; ingo@224: this.flys = flys; ingo@224: this.artifact = artifact; ingo@224: ingo@224: parameterHandlers = new ArrayList(); ingo@224: old = new ArrayList(); ingo@790: oldStorage = new TreeMap(); raimund@256: topLayout = new VLayout(); ingo@224: oldItems = new VLayout(); ingo@224: currentItems = new VLayout(); ingo@275: exportModes = new VLayout(); sascha@582: 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@224: ingo@23: protected void init() { ingo@90: HLayout rootLayout = new HLayout(); ingo@90: rootLayout.setMembersMargin(20); ingo@73: ingo@73: VLayout left = new VLayout(); ingo@53: ingo@83: if (old == null || old.size() == 0) { ingo@572: oldItems.setHeight(1); ingo@83: } ingo@83: ingo@53: oldItems.setMembersMargin(10); ingo@789: oldItems.setStyleName(STYLENAME_OLD_PARAMETERS); ingo@23: currentItems.setAlign(VerticalAlignment.TOP); ingo@23: ingo@73: left.setMembersMargin(20); ingo@73: left.setWidth(300); ingo@50: ingo@73: left.addMember(oldItems); ingo@73: left.addMember(currentItems); ingo@275: left.addMember(exportModes); sascha@582: left.addMember(report); sascha@582: sascha@582: reportPanel = new Canvas(); sascha@582: reportPanel.setHeight("*"); sascha@582: report.addMember(reportPanel); ingo@73: ingo@90: rootLayout.addMember(left); ingo@788: rootLayout.addMember(createSectionStack()); ingo@73: raimund@256: topLayout.addMember(rootLayout); ingo@224: if (artifact == null) { ingo@224: Canvas moduleSelection = renderNew(); ingo@224: moduleSelection.setLayoutAlign(VerticalAlignment.TOP); ingo@224: currentItems.addMember(moduleSelection); ingo@224: } ingo@90: raimund@256: setPane(topLayout); ingo@73: } ingo@73: ingo@73: ingo@788: protected SectionStack createSectionStack() { raimund@1388: final SectionStack stack = new SectionStack(); ingo@788: stack.setHeight100(); ingo@788: stack.setCanResizeSections(true); ingo@788: stack.setVisibilityMode(VisibilityMode.MULTIPLE); ingo@788: bjoern@3715: final SectionStackSection gaugeSection = new SectionStackSection(); bjoern@3715: gaugeSection.setExpanded(false); bjoern@3715: gaugeSection.setTitle(MSG.gaugePanelTitle()); bjoern@3865: gaugePanel = new GaugePanel(flys, gaugeSection) { bjoern@3715: public void addMember(Canvas component) { bjoern@3715: super.addMember(component); bjoern@3715: gaugeSection.setExpanded(true); bjoern@3715: } bjoern@3715: bjoern@3715: public void removeMembers(Canvas[] components) { bjoern@3715: super.removeMembers(components); bjoern@3715: gaugeSection.setExpanded(false); bjoern@3715: } bjoern@3715: }; bjoern@3715: gaugePanel.setWidth100(); ingo@3719: gaugePanel.setHeight100(); bjoern@3715: felix@3346: // This canvas is used to render helper widgets. ingo@788: final SectionStackSection helperSection = new SectionStackSection(); ingo@788: helperSection.setExpanded(false); ingo@788: helperSection.setTitle(MSG.helperPanelTitle()); ingo@788: helperPanel = new VLayout() { ingo@788: public void addMember(Canvas component) { ingo@788: super.addMember(component); raimund@1388: stack.expandSection(helperSection.getID()); ingo@788: } ingo@788: ingo@788: public void removeMembers(Canvas[] components) { ingo@788: super.removeMembers(components); ingo@788: helperSection.setExpanded(false); ingo@788: } ingo@788: }; ingo@788: helperPanel.setWidth100(); ingo@788: helperPanel.setHeight100(); ingo@788: helperSection.setItems(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); ingo@788: tableSection.setTitle(MSG.calcTableTitle()); ingo@788: tablePanel = new VLayout() { ingo@788: public void addMember(Canvas component) { ingo@788: super.addMember(component); ingo@788: tableSection.setExpanded(true); ingo@788: } ingo@788: ingo@788: public void removeMembers(Canvas[] components) { ingo@788: super.removeMembers(components); ingo@788: tableSection.setExpanded(false); ingo@788: } ingo@788: }; ingo@788: tablePanel.setHeight100(); ingo@788: tablePanel.setWidth100(); ingo@788: tableSection.setItems(tablePanel); ingo@788: bjoern@3715: stack.setSections(gaugeSection, helperSection, tableSection); ingo@788: ingo@788: return stack; ingo@788: } ingo@788: ingo@788: felix@3346: /** Sets and forwards artifact. */ ingo@73: protected void setArtifact(Artifact artifact) { ingo@790: setArtifact(artifact, true); ingo@790: } ingo@790: ingo@790: ingo@790: protected void setArtifact(Artifact artifact, boolean forward) { ingo@73: Artifact tmp = this.artifact; ingo@73: this.artifact = artifact; ingo@73: ingo@790: if (forward) { ingo@790: fireParameterChangeEvent( ingo@790: tmp, this.artifact, ParameterChangeEvent.Type.FORWARD); ingo@790: } ingo@790: else { ingo@790: fireParameterChangeEvent( ingo@790: tmp, this.artifact, ParameterChangeEvent.Type.BACK); ingo@790: } ingo@73: } ingo@73: ingo@73: ingo@73: /** ingo@73: * This method registers a new ParameterChangeHandler. ingo@73: * ingo@73: * @param handler The new ParameterChangeHandler. ingo@73: */ ingo@73: public void addParameterChangeHandler(ParameterChangeHandler handler) { ingo@73: if (handler != null) { ingo@73: parameterHandlers.add(handler); ingo@73: } ingo@73: } ingo@73: ingo@73: ingo@73: /** ingo@73: * This method calls the onParameterChange() method of all ingo@73: * registered ParameterChangeHandler. ingo@73: */ ingo@790: protected void fireParameterChangeEvent( ingo@790: Artifact old, ingo@790: Artifact newArt, ingo@790: ParameterChangeEvent.Type type) ingo@790: { ingo@790: ParameterChangeEvent e = new ParameterChangeEvent(old, newArt, type); ingo@790: ingo@73: for (ParameterChangeHandler handler: parameterHandlers) { ingo@790: handler.onParameterChange(e); ingo@73: } 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() { ingo@73: River[] rivers = flys.getRivers(); ingo@73: DataItem[] items = new DataItem[rivers.length]; ingo@73: ingo@73: int i = 0; ingo@73: for (River river: rivers) { ingo@73: String name = river.getName(); ingo@73: items[i++] = new DefaultDataItem(name, null, name); ingo@73: } ingo@73: ingo@73: Data data = new DefaultData( ingo@73: "river", ingo@73: MSG.river_selection(), ingo@73: null, ingo@73: items); ingo@73: felix@3346: LinkSelection widget = new LinkSelection(); ingo@73: HasStepForwardHandlers handler = (HasStepForwardHandlers) widget; ingo@73: ingo@83: widget.setContainer(helperPanel); ingo@83: ingo@73: handler.addStepForwardHandler(new StepForwardHandler() { ingo@73: public void onStepForward(StepForwardEvent event) { ingo@3353: lockUI(); ingo@73: Data[] data = event.getData(); ingo@73: ingo@73: DataItem[] moduleItems = data[0].getItems(); ingo@73: DataItem[] riversItems = data[1].getItems(); ingo@73: ingo@73: String module = moduleItems[0].getStringValue(); ingo@73: String river = riversItems[0].getStringValue(); ingo@73: ingo@90: if (module == null) { ingo@90: // TODO throw / show error! ingo@3353: unlockUI(); ingo@90: return; ingo@90: } ingo@90: ingo@102: String newTitle = MSG.getString(module); ingo@102: setTitle(newTitle); ingo@90: ingo@229: Config config = Config.getInstance(); ingo@229: final String locale = config.getLocale(); ingo@229: felix@3346: final Data[] feedData = new Data[] { data[1] }; ingo@229: ingo@73: artifactService.create( raimund@1425: locale, module.toLowerCase(), null, ingo@73: new AsyncCallback() { ingo@73: public void onFailure(Throwable caught) { ingo@3353: unlockUI(); ingo@73: GWT.log("Could not create the new artifact."); ingo@215: SC.warn(MSG.getString(caught.getMessage())); ingo@73: } ingo@73: ingo@73: public void onSuccess(Artifact artifact) { ingo@73: GWT.log("Successfully created a new artifact."); ingo@73: raimund@1425: forwardService.go(locale, artifact, feedData, ingo@73: new AsyncCallback() { ingo@73: public void onFailure(Throwable caught) { ingo@3353: unlockUI(); ingo@73: GWT.log("Could not feed the artifact."); ingo@215: SC.warn(caught.getMessage()); ingo@73: } ingo@73: ingo@73: public void onSuccess(Artifact artifact) { ingo@73: GWT.log("Successfully feed the artifact."); ingo@790: old.clear(); ingo@909: cView.addArtifactToCollection(artifact); ingo@73: setArtifact(artifact); ingo@3353: unlockUI(); ingo@73: } ingo@73: }); ingo@73: } ingo@73: }); ingo@73: } ingo@73: }); ingo@73: ingo@73: DataList list = new DataList(); ingo@73: list.add(data); ingo@73: ingo@73: return widget.create(list); ingo@23: } ingo@23: ingo@23: ingo@38: protected void clearOldData() { ingo@38: old.clear(); ingo@38: } ingo@38: ingo@38: ingo@51: public void addOldData(DataList old) { ingo@790: addOldData(old, true); ingo@790: } ingo@790: ingo@790: ingo@790: public void addOldData(DataList old, 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: ingo@23: ingo@51: public void addOldDatas(DataList[] old) { ingo@790: addOldDatas(old, true); ingo@790: } ingo@790: ingo@790: ingo@790: public void addOldDatas(DataList[] old, boolean redraw) { ingo@23: if (old != null && old.length > 0) { ingo@51: for (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: ingo@23: ingo@51: public boolean exists(DataList data) { ingo@785: if (data == null) { ingo@785: return false; ingo@785: } ingo@785: ingo@51: String stateName = data.getState(); ingo@38: ingo@51: for (DataList o: 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: ingo@38: ingo@51: public void setCurrentData(DataList current, UIProvider uiProvider) { ingo@23: this.current = current; ingo@23: this.uiProvider = uiProvider; ingo@23: ingo@23: refreshCurrent(); ingo@23: } ingo@23: ingo@23: ingo@790: public void refreshOld(boolean redrawAll) { ingo@790: if (redrawAll) { ingo@790: refreshAllOld(); ingo@790: } ingo@790: else { ingo@790: DataList dataList = old.get(old.size()-1); ingo@790: String state = dataList.getState(); ingo@23: ingo@790: if (oldStorage.get(state) == null) { ingo@790: String provider = dataList.getUIProvider(); ingo@909: UIProvider uiprovider = UIProviderFactory.getProvider( ingo@909: provider, ingo@909: flys.getCurrentUser()); ingo@790: ((HasStepBackHandlers) uiprovider).addStepBackHandler(this); ingo@23: ingo@790: Canvas c = uiprovider.createOld(dataList); ingo@790: if (c != null) { ingo@790: oldStorage.put(dataList.getState(), c); ingo@790: oldItems.addMember(c); ingo@790: } ingo@790: } ingo@23: } ingo@23: ingo@790: updateOldHeight(); ingo@790: } ingo@790: ingo@790: ingo@790: protected void refreshAllOld() { ingo@790: List not = new ArrayList(); ingo@790: ingo@790: for (DataList data: old) { ingo@790: String state = data.getState(); ingo@790: ingo@790: Canvas c = oldStorage.get(state); ingo@790: ingo@790: if (c != null) { ingo@790: not.add(state); ingo@790: } ingo@790: } ingo@790: ingo@790: Map newOld = new TreeMap(); ingo@790: ingo@790: Set> entries = oldStorage.entrySet(); ingo@790: for (Map.Entry entry: entries) { ingo@790: String state = entry.getKey(); ingo@790: Canvas value = entry.getValue(); ingo@790: ingo@790: if (not.indexOf(state) < 0) { ingo@790: oldItems.removeMember(value); ingo@790: } ingo@790: else { ingo@790: newOld.put(state, value); ingo@790: } ingo@790: } ingo@790: ingo@790: oldStorage = newOld; ingo@790: } ingo@790: ingo@790: ingo@790: protected void updateOldHeight() { ingo@23: int minHeight = oldItems.getMinHeight(); ingo@23: if (minHeight <= 20) { ingo@23: oldItems.setHeight(20); ingo@23: } ingo@23: else { ingo@23: oldItems.setHeight(minHeight); ingo@23: } ingo@23: } ingo@23: ingo@23: ingo@23: /** ingo@23: * This method 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() { ingo@40: currentItems.removeMembers(currentItems.getMembers()); ingo@53: ingo@54: if (current != null && uiProvider != null) { ingo@54: Canvas c = uiProvider.create(current); ingo@2500: Canvas h = uiProvider.createHelpLink(current, null); ingo@2500: ingo@2500: HLayout wrapper = new HLayout(); ingo@2500: wrapper.addMember(h); ingo@2500: wrapper.addMember(c); ingo@2500: ingo@2500: currentItems.addMember(wrapper); ingo@785: } ingo@785: else if (uiProvider != null) { ingo@785: Canvas c = uiProvider.create(null); ingo@54: c.setLayoutAlign(VerticalAlignment.TOP); ingo@54: ingo@54: currentItems.addMember(c); ingo@54: } ingo@275: else { ingo@275: currentItems.setHeight(1); ingo@275: } ingo@789: ingo@789: Canvas[] members = currentItems.getMembers(); ingo@789: if (members == null || members.length == 0) { ingo@789: currentItems.setHeight(1); ingo@789: } ingo@789: else { ingo@789: int height = 0; ingo@789: ingo@789: for (Canvas member: members) { ingo@789: height += member.getHeight(); ingo@789: } ingo@789: ingo@789: currentItems.setHeight(height); ingo@789: } ingo@23: } ingo@60: 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: * ingo@73: * @param event The StepForwardEvent. ingo@73: */ ingo@73: public void onStepForward(StepForwardEvent event) { ingo@73: GWT.log("CollectionView - onStepForward()"); ingo@3353: lockUI(); ingo@73: felix@3346: Config config = Config.getInstance(); felix@3346: String locale = config.getLocale(); ingo@229: raimund@1425: forwardService.go(locale, artifact, event.getData(), ingo@73: new AsyncCallback() { ingo@73: public void onFailure(Throwable caught) { ingo@3353: unlockUI(); ingo@73: GWT.log("Could not feed the artifact."); ingo@215: SC.warn(MSG.getString(caught.getMessage())); ingo@73: } ingo@73: ingo@73: public void onSuccess(Artifact artifact) { ingo@73: GWT.log("Successfully feed the artifact."); ingo@790: old.clear(); ingo@790: ingo@790: setArtifact(artifact, true); ingo@3353: unlockUI(); ingo@73: } ingo@73: }); 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: * ingo@73: * @param e The StepBackEvent that holds the identifier of the target state. ingo@60: */ ingo@60: public void onStepBack(StepBackEvent e) { ingo@3353: lockUI(); ingo@73: final String target = e.getTarget(); ingo@73: ingo@229: Config config = Config.getInstance(); ingo@229: final String locale = config.getLocale(); ingo@229: raimund@1425: advanceService.advance(locale, artifact, target, ingo@73: new AsyncCallback() { ingo@73: public void onFailure(Throwable caught) { ingo@3353: unlockUI(); ingo@73: GWT.log("Could not go back to '" + target + "'"); ingo@215: SC.warn(MSG.getString(caught.getMessage())); ingo@73: } ingo@73: ingo@73: public void onSuccess(Artifact artifact) { ingo@73: GWT.log("Successfully step back to '" + target + "'"); ingo@73: ingo@73: old.clear(); ingo@73: ingo@790: setArtifact(artifact, false); ingo@3353: unlockUI(); ingo@73: } ingo@73: } ingo@73: ); ingo@60: } ingo@72: ingo@72: ingo@785: public void onAdvance(final String target) { ingo@785: Config config = Config.getInstance(); ingo@785: final String locale = config.getLocale(); ingo@785: raimund@1425: advanceService.advance(locale, artifact, target, ingo@785: new AsyncCallback() { ingo@785: public void onFailure(Throwable caught) { ingo@785: GWT.log("Could not go to '" + target + "'"); ingo@785: SC.warn(MSG.getString(caught.getMessage())); ingo@785: } ingo@785: ingo@785: public void onSuccess(Artifact artifact) { ingo@785: GWT.log("Successfully advanced to '" + target + "'"); ingo@785: ingo@785: old.clear(); ingo@785: ingo@790: setArtifact(artifact, true); ingo@785: } ingo@785: } ingo@785: ); ingo@785: } 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: * ingo@72: * @param event The ParameterChangeEvent. ingo@72: */ ingo@72: public void onParameterChange(ParameterChangeEvent event) { ingo@72: GWT.log("ParameterList.onParameterChange"); ingo@72: ingo@788: Canvas[] c = helperPanel.getMembers(); ingo@788: if (c != null && c.length > 0) { ingo@788: helperPanel.removeMembers(c); ingo@83: } ingo@83: ingo@72: Artifact art = event.getNewValue(); ingo@72: ArtifactDescription desc = art.getArtifactDescription(); ingo@72: ingo@72: DataList currentData = desc.getCurrentData(); ingo@72: if (currentData != null) { ingo@72: // the user has to enter some attributes ingo@72: String uiProvider = currentData.getUIProvider(); ingo@909: UIProvider provider = UIProviderFactory.getProvider( ingo@909: uiProvider, ingo@909: flys.getCurrentUser()); ingo@72: ingo@83: provider.setContainer(helperPanel); raimund@233: provider.setArtifact(art); ingo@909: provider.setCollection(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); ingo@72: } ingo@72: else { ingo@785: 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. felix@867: UIProvider ui = UIProviderFactory.getProvider("continue", null); ingo@785: ui.setArtifact(art); ingo@909: ui.setCollection(cView.getCollection()); raimund@915: ui.setParameterList(this); ingo@785: ingo@785: ((ContinuePanel) ui).addAdvanceHandler(this); ingo@785: ingo@785: setCurrentData(null, ui); ingo@785: } ingo@785: else { ingo@785: // we have reached a final state with no more user input ingo@785: setCurrentData(null, null); ingo@785: } ingo@72: } bjoern@3715: if (art instanceof WINFOArtifact) { ingo@3719: String river = desc.getRiver(); ingo@3719: if (river != null) { bjoern@3837: renderGaugeInfo(desc.getRiver(), desc.getOldData()); ingo@3719: } ingo@3719: else { ingo@3719: gaugePanel.hide(); ingo@3719: } bjoern@3715: } ingo@72: ingo@790: addOldDatas( ingo@790: desc.getOldData(), ingo@790: event.getType() == ParameterChangeEvent.Type.BACK); ingo@72: } raimund@256: ingo@275: ingo@275: public void onCollectionChange(CollectionChangeEvent event) { ingo@513: Collection c = event.getNewValue(); ingo@275: Map outs = c.getOutputModes(); ingo@275: Set keys = outs.keySet(); ingo@275: ingo@513: OutputMode[] outputs = new OutputMode[outs.size()]; ingo@513: ingo@513: int idx = 0; ingo@513: for (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: ingo@513: ingo@513: public void onOutputModesChange(OutputModesChangeEvent event) { ingo@513: ingo@513: Collection c = cView.getCollection(); ingo@513: ingo@513: if (c != null) { sascha@589: OutputMode [] outs = event.getOutputModes(); sascha@589: updateExportModes(c, getExportModes(outs)); sascha@589: updateReportModes(c, getReportModes(outs)); ingo@513: } ingo@513: } ingo@513: ingo@513: sascha@589: protected List getReportModes(OutputMode [] outs) { sascha@589: sascha@589: List reports = new ArrayList(); sascha@589: sascha@589: if (outs == null || outs.length == 0) { sascha@589: return reports; sascha@589: } sascha@589: sascha@589: for (OutputMode out: outs) { sascha@589: if (out instanceof ReportMode) { sascha@589: reports.add((ReportMode)out); sascha@589: } sascha@589: } sascha@589: sascha@589: return reports; sascha@589: } sascha@589: sascha@589: ingo@513: protected List getExportModes(OutputMode[] outs) { ingo@275: List exports = new ArrayList(); ingo@275: ingo@513: if (outs == null || outs.length == 0) { ingo@513: return exports; ingo@513: } ingo@275: ingo@513: for (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: ingo@275: ingo@275: protected void updateExportModes(Collection c, List exports) { ingo@275: int num = exports != null ? exports.size() : 0; ingo@275: GWT.log("Update export modes: " + num); ingo@275: ingo@275: exportModes.removeMembers(exportModes.getMembers()); ingo@275: ingo@275: if (exports.size() > 0) { ingo@275: exportModes.addMember(new ExportPanel(c, exports)); ingo@275: } ingo@789: else { ingo@789: exportModes.setHeight(1); ingo@789: } ingo@275: } ingo@275: sascha@589: protected void updateReportModes(Collection c, List reports) { sascha@589: int num = reports != null ? reports.size() : 0; sascha@589: GWT.log("Update report modes: " + num); sascha@589: sascha@604: if (num == 0) { sascha@604: reportPanel.setContents(""); sascha@604: return; sascha@604: } sascha@604: sascha@604: Config config = Config.getInstance(); sascha@604: String locale = config.getLocale(); sascha@604: sascha@604: String cid = c.identifier(); sascha@604: sascha@589: for (ReportMode report: reports) { sascha@589: GWT.log("report '" + report.toString() + "'"); sascha@604: raimund@1425: reportService.report(cid, locale, report.getName(), sascha@604: new AsyncCallback() { sascha@604: public void onFailure(Throwable caught) { sascha@604: SC.warn(caught.getMessage()); sascha@604: } sascha@604: sascha@604: public void onSuccess(String msg) { sascha@604: setReportMessage(msg); sascha@604: } sascha@604: }); sascha@589: } sascha@604: } sascha@589: 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: } sascha@604: reportPanel.setContents(msg); sascha@589: } sascha@589: ingo@275: raimund@256: /** raimund@256: * Adds a table to the parameterlist to show calculated data. raimund@256: * raimund@256: * @param table The table data panel. raimund@256: */ ingo@788: public void setTable(TableDataPanel table) { ingo@788: removeTable(); ingo@788: ingo@788: Canvas c = table.create(); ingo@788: c.setHeight100(); ingo@788: c.setWidth100(); ingo@788: ingo@788: tablePanel.addMember(c); ingo@788: } ingo@788: ingo@788: ingo@788: public boolean hasTable() { ingo@788: Canvas[] members = tablePanel.getMembers(); ingo@788: ingo@788: return members != null && members.length > 0; raimund@260: } raimund@260: raimund@260: raimund@260: /** raimund@260: * Removes the table from the parameter list. raimund@260: */ ingo@788: public void removeTable() { ingo@788: Canvas[] members = tablePanel.getMembers(); raimund@260: ingo@788: if (members != null && members.length > 0) { ingo@788: tablePanel.removeMembers(members); ingo@788: } raimund@256: } raimund@915: raimund@915: raimund@915: public void registerCollectionViewTabHandler (TabSelectedHandler tsh) { raimund@915: this.cView.registerTabHandler (tsh); raimund@915: } ingo@3353: ingo@3353: ingo@3353: protected void lockUI() { ingo@3353: cView.lockUI(); ingo@3353: } ingo@3353: ingo@3353: ingo@3353: protected void unlockUI() { ingo@3353: cView.unlockUI(); ingo@3353: } bjoern@3715: bjoern@3715: bjoern@3837: private void renderGaugeInfo(String river, DataList[] data) { bjoern@3715: gaugePanel.setRiver(river); bjoern@3837: gaugePanel.setData(data); bjoern@3715: gaugePanel.show(); bjoern@3715: } bjoern@3715: ingo@23: } ingo@23: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :