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:
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!
ingo@239: if (out.getMimeType().equals("text/plain")) {
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 :