ingo@6: package de.intevation.flys.client.client.ui; ingo@6: ingo@19: import java.util.ArrayList; ingo@19: import java.util.List; ingo@19: ingo@6: import com.google.gwt.core.client.GWT; ingo@6: import com.google.gwt.i18n.client.DateTimeFormat; ingo@13: import com.google.gwt.user.client.rpc.AsyncCallback; ingo@6: ingo@7: import com.smartgwt.client.widgets.Canvas; ingo@6: import com.smartgwt.client.widgets.Window; ingo@23: import com.smartgwt.client.widgets.layout.Layout; ingo@7: import com.smartgwt.client.widgets.layout.VLayout; ingo@7: import com.smartgwt.client.widgets.tab.Tab; ingo@23: import com.smartgwt.client.widgets.tab.TabSet; ingo@6: ingo@13: import de.intevation.flys.client.shared.model.Artifact; ingo@23: import de.intevation.flys.client.shared.model.ArtifactDescription; ingo@6: import de.intevation.flys.client.shared.model.Collection; ingo@23: import de.intevation.flys.client.shared.model.Data; ingo@30: import de.intevation.flys.client.shared.model.DataItem; ingo@51: import de.intevation.flys.client.shared.model.DataList; ingo@30: import de.intevation.flys.client.shared.model.DefaultData; ingo@30: import de.intevation.flys.client.shared.model.DefaultDataItem; ingo@71: import de.intevation.flys.client.shared.model.OutputMode; ingo@30: import de.intevation.flys.client.shared.model.River; ingo@71: import de.intevation.flys.client.shared.model.User; ingo@6: ingo@14: import de.intevation.flys.client.client.Config; ingo@13: import de.intevation.flys.client.client.FLYS; ingo@6: import de.intevation.flys.client.client.FLYSMessages; ingo@19: import de.intevation.flys.client.client.event.HasCollectionChangeHandlers; ingo@36: import de.intevation.flys.client.client.event.HasParameterChangeHandler; ingo@23: import de.intevation.flys.client.client.event.HasStepForwardHandlers; ingo@19: import de.intevation.flys.client.client.event.CollectionChangeEvent; ingo@36: import de.intevation.flys.client.client.event.CollectionChangeHandler; ingo@36: import de.intevation.flys.client.client.event.ParameterChangeEvent; ingo@36: 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@23: import de.intevation.flys.client.client.event.StepForwardEvent; ingo@23: import de.intevation.flys.client.client.event.StepForwardHandler; ingo@71: import de.intevation.flys.client.client.services.AddArtifactService; ingo@71: import de.intevation.flys.client.client.services.AddArtifactServiceAsync; ingo@60: import de.intevation.flys.client.client.services.AdvanceService; ingo@60: import de.intevation.flys.client.client.services.AdvanceServiceAsync; ingo@13: import de.intevation.flys.client.client.services.ArtifactService; ingo@13: import de.intevation.flys.client.client.services.ArtifactServiceAsync; ingo@32: import de.intevation.flys.client.client.services.StepForwardService; ingo@32: import de.intevation.flys.client.client.services.StepForwardServiceAsync; ingo@26: import de.intevation.flys.client.client.services.CreateCollectionService; ingo@26: import de.intevation.flys.client.client.services.CreateCollectionServiceAsync; ingo@30: import de.intevation.flys.client.client.ui.ModuleSelection; ingo@6: ingo@6: ingo@6: /** ingo@6: * @author Ingo Weinzierl ingo@6: */ ingo@19: public class CollectionView ingo@19: extends Window ingo@23: implements CollectionChangeHandler, HasCollectionChangeHandlers, ingo@36: HasParameterChangeHandler, ParameterChangeHandler, ingo@60: StepForwardHandler, StepBackHandler ingo@23: { ingo@13: /** The ArtifactService used to communicate with the Artifact server. */ ingo@13: protected ArtifactServiceAsync artifactService = ingo@13: GWT.create(ArtifactService.class); ingo@13: ingo@32: /** The StepForwardService used to put data into an existing artifact. */ ingo@32: protected StepForwardServiceAsync forwardService = ingo@32: GWT.create(StepForwardService.class); ingo@32: ingo@60: /** The StepForwardService used to put data into an existing artifact. */ ingo@60: protected AdvanceServiceAsync advanceService = ingo@60: GWT.create(AdvanceService.class); ingo@60: ingo@26: /** The ArtifactService used to communicate with the Artifact server. */ ingo@26: protected CreateCollectionServiceAsync createCollectionService = ingo@26: GWT.create(CreateCollectionService.class); ingo@26: ingo@71: /** The AddArtifactService used to add an artifact to a collection. */ ingo@71: protected AddArtifactServiceAsync addArtifactService = ingo@71: GWT.create(AddArtifactService.class); ingo@71: ingo@6: /** The message class that provides i18n strings.*/ ingo@6: FLYSMessages messages = GWT.create(FLYSMessages.class); ingo@6: ingo@13: /** The FLYS instance used to call services.*/ ingo@13: protected FLYS flys; ingo@13: ingo@23: /** The ParameterList.*/ ingo@23: protected ParameterList parameterList; ingo@23: ingo@19: /** The list of ValueChangeHandlers.*/ ingo@19: protected List handlers; ingo@19: ingo@36: /** The list of ParameterizationChangeHandler.*/ ingo@36: protected List parameterHandlers; ingo@36: ingo@6: /** The collection to be displayed.*/ ingo@6: protected Collection collection; ingo@6: ingo@30: /** The artifact that handles the parameterization.*/ ingo@30: protected Artifact artifact; ingo@30: ingo@23: protected TabSet tabs; ingo@23: ingo@7: /** The parameter tab.*/ ingo@7: protected Tab parameterTab; ingo@7: ingo@7: /** The output tab.*/ ingo@7: protected Tab outputTab; ingo@7: ingo@23: /** The layout.*/ ingo@23: protected Layout layout; ingo@23: ingo@6: ingo@6: /** ingo@6: * This constructor creates a new CollectionView that is used to display the ingo@6: * collection. ingo@6: * ingo@6: * @param collection The collection to be displayed. ingo@6: */ ingo@13: public CollectionView(FLYS flys, Collection collection) { ingo@13: this.flys = flys; ingo@6: this.collection = collection; ingo@6: ingo@36: this.tabs = new TabSet(); ingo@36: this.parameterTab = new Tab(messages.winfo()); ingo@60: this.parameterList = new ParameterList(this); ingo@36: this.handlers = new ArrayList(); ingo@36: this.parameterHandlers = new ArrayList(); ingo@36: this.layout = new VLayout(); ingo@19: ingo@19: addCollectionChangeHandler(this); ingo@36: addParameterChangeHandler(this); ingo@72: addParameterChangeHandler(parameterList); ingo@19: ingo@6: init(); ingo@6: } ingo@6: ingo@6: ingo@6: /** ingo@6: * This method handles the initial layout stuff. ingo@6: */ ingo@6: protected void init() { ingo@39: setWidth(700); ingo@39: setHeight(600); ingo@6: ingo@23: layout.setWidth100(); ingo@23: ingo@6: setCanDragResize(true); ingo@6: ingo@6: DateTimeFormat dtf = DateTimeFormat.getFormat(messages.date_format()); ingo@6: String lastAccess = dtf.format(collection.getLastAccess()); ingo@6: setTitle(lastAccess + " - " + collection.getName()); ingo@7: ingo@7: addItem(layout); ingo@7: ingo@23: layout.addMember(tabs); ingo@23: tabs.addTab(parameterTab); ingo@23: ingo@7: if (isNew()) { ingo@39: tabs.setTabTitle(0, messages.new_calculation()); ingo@23: tabs.updateTab(0, renderNew()); ingo@7: } ingo@7: } ingo@7: ingo@7: ingo@7: /** ingo@26: * This method triggers the CreateCollectionService to create a new ingo@26: * collection in the artifact server. ingo@26: * ingo@26: * @param ownerId The uuid of the user that should own the new collection. ingo@26: */ ingo@26: protected void createNewCollection(String ownerId) { ingo@71: Config config = Config.getInstance(); ingo@71: final String serverUrl = config.getServerUrl(); ingo@26: ingo@26: createCollectionService.create( ingo@26: serverUrl, ownerId, ingo@71: new AsyncCallback() { ingo@26: public void onFailure(Throwable caught) { ingo@26: GWT.log("Could not create the new collection."); ingo@26: GWT.log(caught.getMessage()); ingo@26: } ingo@26: ingo@71: public void onSuccess(Collection collection) { ingo@26: GWT.log("Successfully created a new collection."); ingo@71: ingo@71: Artifact artifact = getArtifact(); ingo@71: addArtifactService.add(collection, artifact, serverUrl, ingo@71: new AsyncCallback() { ingo@71: ingo@71: public void onFailure(Throwable caught) { ingo@71: GWT.log("An error occured while adding artifact."); ingo@71: } ingo@71: ingo@71: public void onSuccess(Collection newCollection) { ingo@71: GWT.log("Successfully added artifact."); ingo@71: setCollection(newCollection); ingo@71: } ingo@71: } ingo@71: ); ingo@26: } ingo@26: }); ingo@26: } ingo@26: ingo@26: ingo@26: protected FLYS getFlys() { ingo@26: return flys; ingo@26: } ingo@26: ingo@26: ingo@26: ingo@26: /** ingo@19: * This method registers a new ValueChangeHandler. ingo@19: * ingo@19: * @param handler The new ValueChangeHandler. ingo@19: */ ingo@19: public void addCollectionChangeHandler(CollectionChangeHandler handler) { ingo@19: if (handler != null) { ingo@19: handlers.add(handler); ingo@19: } ingo@19: } ingo@19: ingo@19: ingo@19: /** ingo@36: * This method registers a new ParameterChangeHandler. ingo@36: * ingo@36: * @param handler The new ParameterChangeHandler. ingo@36: */ ingo@36: public void addParameterChangeHandler(ParameterChangeHandler handler) { ingo@36: if (handler != null) { ingo@36: parameterHandlers.add(handler); ingo@36: } ingo@36: } ingo@36: ingo@36: ingo@36: /** ingo@19: * This method calls the onValueChange() method of all ingo@19: * registered ValueChangeHanders. ingo@19: */ ingo@19: protected void fireCollectionChangeEvent( ingo@19: Collection old, Collection newCol) ingo@19: { ingo@19: for (CollectionChangeHandler handler: handlers) { ingo@19: handler.onCollectionChange(new CollectionChangeEvent(old, newCol)); ingo@19: } ingo@19: } ingo@19: ingo@19: ingo@19: /** ingo@36: * This method calls the onParameterChange() method of all ingo@36: * registered ParameterChangeHandler. ingo@36: */ ingo@36: protected void fireParameterChangeEvent(Artifact old, Artifact newArt) { ingo@36: for (ParameterChangeHandler handler: parameterHandlers) { ingo@36: handler.onParameterChange(new ParameterChangeEvent(old, newArt)); ingo@36: } ingo@36: } ingo@36: ingo@36: ingo@36: /** ingo@7: * This method returns true, if the Collection is new and no plugins has ingo@7: * been chosen. ingo@7: * ingo@7: * @return true, if the Collection is new. ingo@7: */ ingo@7: public boolean isNew() { ingo@71: return collection.getItemLength() == 0 ? true : false; ingo@7: } ingo@7: ingo@7: ingo@7: /** ingo@30: * This method creates a Canvas displaying the plugins of FLYS combined with ingo@30: * a widget to select a river. ingo@7: * ingo@30: * @return a Canvas that displays the supported plugins and rivers of FLYS. ingo@7: */ ingo@7: protected Canvas renderNew() { ingo@30: River[] rivers = flys.getRivers(); ingo@30: DataItem[] items = new DataItem[rivers.length]; ingo@7: ingo@30: int i = 0; ingo@30: for (River river: rivers) { ingo@30: String name = river.getName(); ingo@30: items[i++] = new DefaultDataItem(name, null, name); ingo@30: } ingo@7: ingo@30: Data data = new DefaultData( ingo@39: "river", ingo@37: messages.river_selection(), ingo@37: null, ingo@51: items); ingo@7: ingo@30: ModuleSelection widget = new ModuleSelection(); ingo@30: HasStepForwardHandlers handler = (HasStepForwardHandlers) widget; ingo@30: ingo@30: handler.addStepForwardHandler(new StepForwardHandler() { ingo@30: public void onStepForward(StepForwardEvent event) { ingo@30: Data[] data = event.getData(); ingo@30: ingo@30: DataItem[] moduleItems = data[0].getItems(); ingo@30: DataItem[] riversItems = data[1].getItems(); ingo@30: ingo@30: String module = moduleItems[0].getStringValue(); ingo@30: String river = riversItems[0].getStringValue(); ingo@30: ingo@32: final String serverUrl = Config.getInstance().getServerUrl(); ingo@32: final Data[] feedData = new Data[] { data[1] }; ingo@14: artifactService.create( ingo@30: serverUrl, module.toLowerCase(), ingo@14: new AsyncCallback() { ingo@14: public void onFailure(Throwable caught) { ingo@14: GWT.log("Could not create the new artifact."); ingo@14: GWT.log(caught.getMessage()); ingo@14: } ingo@14: ingo@14: public void onSuccess(Artifact artifact) { ingo@14: GWT.log("Successfully created a new artifact."); ingo@23: ingo@32: forwardService.go(serverUrl, artifact, feedData, ingo@32: new AsyncCallback() { ingo@32: public void onFailure(Throwable caught) { ingo@32: GWT.log("Could not feed the artifact."); ingo@32: GWT.log(caught.getMessage()); ingo@32: } ingo@32: ingo@32: public void onSuccess(Artifact artifact) { ingo@32: GWT.log("Successfully feed the artifact."); ingo@32: setArtifact(artifact); ingo@32: } ingo@32: }); ingo@14: } ingo@13: }); ingo@13: } ingo@13: }); ingo@13: ingo@51: DataList list = new DataList(); ingo@51: list.add(data); ingo@51: ingo@51: return widget.create(list); ingo@30: } ingo@7: ingo@30: ingo@30: /** ingo@71: * Returns the artifact that is used for the parameterization. ingo@71: * ingo@71: * @return the artifact that is used for the parameterization. ingo@71: */ ingo@71: protected Artifact getArtifact() { ingo@71: return artifact; ingo@71: } ingo@71: ingo@71: ingo@71: /** ingo@30: * Set the current artifact that is the master of the parameterization. ingo@30: * ingo@30: * @param artifact The new artifact. ingo@30: */ ingo@30: protected void setArtifact(Artifact artifact) { ingo@36: Artifact tmp = this.artifact; ingo@30: this.artifact = artifact; ingo@36: ingo@36: fireParameterChangeEvent(tmp, this.artifact); ingo@36: } ingo@36: ingo@36: ingo@36: /** ingo@36: * Implements the onCollectionChange() method to do update the GUI after the ingo@36: * parameterization has changed. ingo@36: * ingo@36: * @param event The ParameterChangeEvent. ingo@36: */ ingo@36: public void onParameterChange(ParameterChangeEvent event) { ingo@71: Artifact art = event.getNewValue(); ingo@71: ArtifactDescription desc = art.getArtifactDescription(); ingo@71: OutputMode[] outs = desc.getOutputModes(); ingo@36: ingo@71: if (outs != null) { ingo@71: User user = getFlys().getCurrentUser(); ingo@71: createNewCollection(user.identifier()); ingo@71: } ingo@71: else { ingo@71: updateView(); ingo@71: } ingo@6: } ingo@13: ingo@13: ingo@13: /** ingo@19: * Set the current collection. ingo@13: * ingo@19: * @param collection The new collection. ingo@13: */ ingo@19: protected void setCollection(Collection collection) { ingo@19: Collection tmp = this.collection; ingo@19: this.collection = collection; ingo@13: ingo@19: fireCollectionChangeEvent(tmp, this.collection); ingo@19: } ingo@19: ingo@19: ingo@19: public void onCollectionChange(CollectionChangeEvent event) { ingo@13: updateView(); ingo@13: } ingo@13: ingo@13: ingo@36: /** ingo@60: * This method is used to call the ADVANCE service to go back to a previous ingo@60: * state. ingo@60: * ingo@60: * @param e The StepBackEvent that holds the identifier of the target state. ingo@60: */ ingo@60: public void onStepBack(StepBackEvent e) { ingo@60: final String target = e.getTarget(); ingo@60: final String serverUrl = Config.getInstance().getServerUrl(); ingo@60: ingo@60: advanceService.advance(serverUrl, artifact, target, ingo@60: new AsyncCallback() { ingo@60: public void onFailure(Throwable caught) { ingo@60: GWT.log("Could not go back to '" + target + "'"); ingo@60: GWT.log(caught.getMessage()); ingo@60: } ingo@60: ingo@60: public void onSuccess(Artifact artifact) { ingo@60: GWT.log("Successfully step back to '" + target + "'"); ingo@60: setArtifact(artifact); ingo@60: } ingo@60: } ingo@60: ); ingo@60: } ingo@60: ingo@60: ingo@60: /** ingo@36: * This method is called if the user clicks on the 'next' button to advance ingo@36: * to the next state. ingo@36: * ingo@36: * @param event The StepForwardEvent. ingo@36: */ ingo@23: public void onStepForward(StepForwardEvent event) { ingo@23: GWT.log("CollectionView - onStepForward()"); ingo@39: String serverUrl = Config.getInstance().getServerUrl(); ingo@39: ingo@39: forwardService.go(serverUrl, artifact, event.getData(), ingo@39: new AsyncCallback() { ingo@39: public void onFailure(Throwable caught) { ingo@39: GWT.log("Could not feed the artifact."); ingo@39: GWT.log(caught.getMessage()); ingo@39: } ingo@39: ingo@39: public void onSuccess(Artifact artifact) { ingo@39: GWT.log("Successfully feed the artifact."); ingo@39: setArtifact(artifact); ingo@39: } ingo@39: }); ingo@23: } ingo@23: ingo@23: ingo@23: /** ingo@23: * Update the view (refresh the list of old and current data). ingo@23: */ ingo@13: protected void updateView() { ingo@36: GWT.log("CollectionView.updateView()"); ingo@23: ingo@23: tabs.setTabTitle(0, messages.winfo()); ingo@23: tabs.updateTab(0, parameterList); ingo@13: } ingo@6: } ingo@6: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :