ingo@6: package de.intevation.flys.client.client.ui; ingo@6: ingo@19: import java.util.ArrayList; ingo@74: import java.util.HashMap; ingo@19: import java.util.List; ingo@74: import java.util.Map; ingo@74: import java.util.Set; ingo@19: ingo@6: import com.google.gwt.core.client.GWT; ingo@13: import com.google.gwt.user.client.rpc.AsyncCallback; ingo@6: ingo@215: import com.smartgwt.client.util.SC; 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@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@71: import de.intevation.flys.client.shared.model.OutputMode; 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@211: import de.intevation.flys.client.client.FLYSConstants; ingo@19: import de.intevation.flys.client.client.event.HasCollectionChangeHandlers; 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@71: import de.intevation.flys.client.client.services.AddArtifactService; ingo@71: import de.intevation.flys.client.client.services.AddArtifactServiceAsync; ingo@26: import de.intevation.flys.client.client.services.CreateCollectionService; ingo@26: import de.intevation.flys.client.client.services.CreateCollectionServiceAsync; ingo@100: import de.intevation.flys.client.client.services.DescribeCollectionService; ingo@100: import de.intevation.flys.client.client.services.DescribeCollectionServiceAsync; 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@73: ParameterChangeHandler ingo@23: { ingo@13: /** 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@100: /** The DescribeCollectionService used to update the existing collection. */ ingo@100: protected DescribeCollectionServiceAsync describeCollectionService = ingo@100: GWT.create(DescribeCollectionService.class); ingo@100: ingo@6: /** The message class that provides i18n strings.*/ ingo@211: protected FLYSConstants messages = GWT.create(FLYSConstants.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@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 output tab.*/ ingo@74: protected Map outputTabs; 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@100: public CollectionView(FLYS flys) { ingo@100: this.flys = flys; ingo@100: this.tabs = new TabSet(); ingo@100: this.outputTabs = new HashMap(); ingo@100: this.handlers = new ArrayList(); ingo@100: this.layout = new VLayout(); ingo@100: this.parameterList = new ParameterList( raimund@92: flys, this, messages.new_project()); ingo@19: ingo@19: addCollectionChangeHandler(this); ingo@73: ingo@73: parameterList.addParameterChangeHandler(this); ingo@19: ingo@6: init(); ingo@6: } ingo@6: ingo@6: ingo@224: public CollectionView(FLYS flys, Collection collection, Artifact artifact) { ingo@224: this.flys = flys; ingo@224: this.tabs = new TabSet(); ingo@224: this.outputTabs = new HashMap(); ingo@224: this.handlers = new ArrayList(); ingo@224: this.layout = new VLayout(); ingo@224: this.parameterList = new ParameterList( ingo@224: flys, ingo@224: this, ingo@228: messages.getString(artifact.getName()), ingo@224: artifact); ingo@224: ingo@224: addCollectionChangeHandler(this); ingo@224: ingo@224: parameterList.addParameterChangeHandler(this); ingo@224: ingo@224: init(); ingo@224: ingo@224: setCollection(collection); ingo@224: setArtifact(artifact); ingo@224: } ingo@224: ingo@224: ingo@6: /** ingo@6: * This method handles the initial layout stuff. ingo@6: */ ingo@6: protected void init() { raimund@91: setWidth(750); ingo@39: setHeight(600); ingo@6: ingo@23: layout.setWidth100(); ingo@23: raimund@77: setCanDragReposition(true); ingo@6: setCanDragResize(true); raimund@77: setKeepInParentRect(true); ingo@6: ingo@84: setTitle(""); ingo@7: ingo@7: addItem(layout); ingo@7: ingo@23: layout.addMember(tabs); ingo@90: tabs.addTab(parameterList); 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@100: GWT.log("CollectionView.createNewCollection"); ingo@100: ingo@229: Config config = Config.getInstance(); ingo@229: final String url = config.getServerUrl(); ingo@229: final String locale = config.getLocale(); ingo@26: ingo@26: createCollectionService.create( ingo@229: url, locale, ownerId, ingo@71: new AsyncCallback() { ingo@26: public void onFailure(Throwable caught) { ingo@26: GWT.log("Could not create the new collection."); ingo@215: SC.warn(messages.getString(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@229: addArtifactService.add(collection, artifact, url, locale, ingo@71: new AsyncCallback() { ingo@71: ingo@71: public void onFailure(Throwable caught) { ingo@71: GWT.log("An error occured while adding artifact."); ingo@215: SC.warn(messages.getString(caught.getMessage())); 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@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@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@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@30: this.artifact = 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@100: GWT.log("CollectionView.onParameterChange"); ingo@100: ingo@71: Artifact art = event.getNewValue(); ingo@71: ArtifactDescription desc = art.getArtifactDescription(); ingo@71: OutputMode[] outs = desc.getOutputModes(); ingo@36: ingo@73: setArtifact(art); ingo@87: clearOutputTabs(); ingo@73: raimund@260: if (parameterList.hasPanel()) { raimund@260: parameterList.removePanel(); raimund@260: } ingo@229: Collection c = getCollection(); ingo@100: ingo@229: if (outs != null && c == null) { ingo@71: User user = getFlys().getCurrentUser(); ingo@71: createNewCollection(user.identifier()); ingo@71: } ingo@229: else if (outs != null && c != null) { ingo@100: Config config = Config.getInstance(); ingo@100: String url = config.getServerUrl(); ingo@229: String locale = config.getLocale(); ingo@100: ingo@229: describeCollectionService.describe(c.identifier(), url, locale, ingo@100: new AsyncCallback() { ingo@100: public void onFailure(Throwable caught) { ingo@100: GWT.log("Could not DESCRIBE collection."); ingo@215: SC.warn(messages.getString(caught.getMessage())); ingo@100: } ingo@100: ingo@100: ingo@100: public void onSuccess(Collection newCollection) { ingo@100: GWT.log("Successfully DESCRIBED collection."); ingo@100: setCollection(newCollection); ingo@100: } ingo@100: } ingo@100: ); ingo@100: } ingo@71: else { ingo@71: updateView(); ingo@71: } ingo@6: } ingo@13: ingo@13: ingo@13: /** ingo@74: * Returns the collection of displayed by this view. ingo@74: * ingo@74: * @return the collection of this view. ingo@74: */ ingo@74: protected Collection getCollection() { ingo@74: return collection; ingo@74: } ingo@74: ingo@74: ingo@74: /** 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@74: Collection newCol = event.getNewValue(); ingo@74: ingo@74: Map outs = newCol.getOutputModes(); ingo@74: ingo@74: Set keys = outs.keySet(); ingo@74: for (String outname: keys) { ingo@74: addOutputTab(outname, outs.get(outname)); ingo@74: } ingo@74: ingo@13: updateView(); ingo@13: } ingo@13: ingo@13: ingo@36: /** ingo@74: * Adds a new tab for the OutputMode out. ingo@74: * ingo@74: * @param name The name and title of the output. ingo@74: */ ingo@74: protected void addOutputTab(String name, OutputMode out) { ingo@239: // XXX Maybe we should change this determination of visual outputs. I am ingo@239: // not sure if the mimetype is the correct value for this! raimund@256: ingo@239: if (out.getMimeType().equals("text/plain")) { raimund@256: TableDataPanel p = new TableDataPanel(); raimund@256: p.setUuid(collection.identifier()); raimund@259: p.setName(out.getName()); raimund@256: parameterList.setPanel (p); ingo@239: return; ingo@239: } ingo@239: ingo@74: GWT.log("Add new output tab for '" + name + "'"); ingo@75: ingo@75: // TODO Source this out to a factory that creates the different ingo@75: // OutputTabs. ingo@102: String title = messages.getString(name); ingo@102: OutputTab tab = new ChartOutputTab(title, getCollection(), out); ingo@74: outputTabs.put(name, tab); ingo@74: } ingo@74: ingo@74: ingo@74: /** ingo@74: * Removes all output mode tabs from tab bar. ingo@74: */ ingo@74: protected void clearOutputTabs() { ingo@74: GWT.log("Clear OutputTabs."); ingo@74: ingo@74: int num = tabs.getNumTabs(); ingo@74: ingo@74: for (int i = num-1; i >= 1; i--) { ingo@74: tabs.removeTab(i); ingo@74: } ingo@74: ingo@74: outputTabs.clear(); ingo@74: } ingo@74: ingo@74: ingo@74: /** 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@74: updateOutputTabs(); ingo@74: } ingo@23: ingo@74: ingo@74: /** ingo@74: * This method is used to update the tabs to show specific output modes. ingo@74: */ ingo@74: protected void updateOutputTabs() { ingo@74: GWT.log("Update output tabs."); ingo@74: if (outputTabs != null) { ingo@74: Set keys = outputTabs.keySet(); ingo@74: ingo@74: for (String key: keys) { ingo@74: tabs.addTab(outputTabs.get(key)); ingo@74: } ingo@74: } ingo@13: } ingo@6: } ingo@6: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :