Mercurial > dive4elements > river
diff flys-client/src/main/java/org/dive4elements/river/client/client/ui/CollectionView.java @ 5834:f507086aa94b
Repaired internal references.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 25 Apr 2013 12:31:32 +0200 |
parents | flys-client/src/main/java/de/intevation/flys/client/client/ui/CollectionView.java@adb6c0f14810 |
children | 821a02bbfb4e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-client/src/main/java/org/dive4elements/river/client/client/ui/CollectionView.java Thu Apr 25 12:31:32 2013 +0200 @@ -0,0 +1,790 @@ +package de.intevation.flys.client.client.ui; + +import com.google.gwt.core.client.GWT; + +import com.google.gwt.user.client.rpc.AsyncCallback; + +import com.smartgwt.client.util.SC; + +import com.smartgwt.client.widgets.Window; + +import com.smartgwt.client.widgets.events.CloseClickEvent; +import com.smartgwt.client.widgets.events.CloseClickHandler; + +import com.smartgwt.client.widgets.layout.Layout; +import com.smartgwt.client.widgets.layout.VLayout; + +import com.smartgwt.client.widgets.tab.TabSet; + +import com.smartgwt.client.widgets.tab.events.TabSelectedHandler; + +import de.intevation.flys.client.client.Config; +import de.intevation.flys.client.client.FLYS; +import de.intevation.flys.client.client.FLYSConstants; + +import de.intevation.flys.client.client.event.CollectionChangeEvent; +import de.intevation.flys.client.client.event.CollectionChangeHandler; +import de.intevation.flys.client.client.event.HasCollectionChangeHandlers; +import de.intevation.flys.client.client.event.HasOutputModesChangeHandlers; +import de.intevation.flys.client.client.event.OutputModesChangeEvent; +import de.intevation.flys.client.client.event.OutputModesChangeHandler; +import de.intevation.flys.client.client.event.ParameterChangeEvent; +import de.intevation.flys.client.client.event.ParameterChangeHandler; + +import de.intevation.flys.client.client.services.AddArtifactService; +import de.intevation.flys.client.client.services.AddArtifactServiceAsync; +import de.intevation.flys.client.client.services.ArtifactService; +import de.intevation.flys.client.client.services.ArtifactServiceAsync; +import de.intevation.flys.client.client.services.CollectionAttributeService; +import de.intevation.flys.client.client.services.CollectionAttributeServiceAsync; +import de.intevation.flys.client.client.services.CreateCollectionService; +import de.intevation.flys.client.client.services.CreateCollectionServiceAsync; +import de.intevation.flys.client.client.services.DescribeCollectionService; +import de.intevation.flys.client.client.services.DescribeCollectionServiceAsync; +import de.intevation.flys.client.client.services.LoadArtifactService; +import de.intevation.flys.client.client.services.LoadArtifactServiceAsync; + +import de.intevation.flys.client.client.ui.ScreenLock; + +import de.intevation.flys.client.shared.model.Artifact; +import de.intevation.flys.client.shared.model.ArtifactDescription; +import de.intevation.flys.client.shared.model.Collection; +import de.intevation.flys.client.shared.model.ExportMode; +import de.intevation.flys.client.shared.model.OutputMode; +import de.intevation.flys.client.shared.model.Recommendation; +import de.intevation.flys.client.shared.model.ReportMode; +import de.intevation.flys.client.shared.model.User; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.Stack; + + +/** + * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> + */ +public class CollectionView +extends Window +implements CollectionChangeHandler, HasCollectionChangeHandlers, + OutputModesChangeHandler, HasOutputModesChangeHandlers, + ParameterChangeHandler, CloseClickHandler +{ + /** The ArtifactService used to communicate with the Artifact server. */ + protected CreateCollectionServiceAsync createCollectionService = + GWT.create(CreateCollectionService.class); + + /** The ArtifactService used to communicate with the Artifact server. */ + protected ArtifactServiceAsync createArtifactService = + GWT.create(ArtifactService.class); + + /** The AddArtifactService used to add an artifact to a collection. */ + protected AddArtifactServiceAsync addArtifactService = + GWT.create(AddArtifactService.class); + + /** The DescribeCollectionService used to update the existing collection. */ + protected DescribeCollectionServiceAsync describeCollectionService = + GWT.create(DescribeCollectionService.class); + + protected CollectionAttributeServiceAsync updater = + GWT.create(CollectionAttributeService.class); + + /** The LoadArtifactService used to load recommendations*/ + protected LoadArtifactServiceAsync loadArtifactService = + GWT.create(LoadArtifactService.class); + + /** The message class that provides i18n strings. */ + protected FLYSConstants messages = GWT.create(FLYSConstants.class); + + /** The FLYS instance used to call services. */ + protected FLYS flys; + + /** The ParameterList. */ + protected ParameterList parameterList; + + /** The list of CollectionChangeHandlers. */ + protected List<CollectionChangeHandler> handlers; + + /** The list of OutputModesChangeHandlers. */ + protected List<OutputModesChangeHandler> outHandlers; + + /** The collection to be displayed. */ + protected Collection collection; + + /** The artifact that handles the parameterization. */ + protected Artifact artifact; + + protected TabSet tabs; + + /** The output tab. */ + protected Map<String, OutputTab> outputTabs; + + /** The layout. */ + protected Layout layout; + + /** Layout to show spinning wheel of joy. */ + protected VLayout lockScreen; + + protected int artifactsQueue; + protected int recommendationQueue; + protected Stack<Recommendation> newRecommendations; + + /** Values for fix analysis charts*/ + protected double currentKm; + protected double minKm; + protected double maxKm; + protected double steps; + + /** + * This constructor creates a new CollectionView that is used to display the + * <i>collection</i>. + */ + public CollectionView(FLYS flys) { + this.flys = flys; + this.tabs = new TabSet(); + this.outputTabs = new HashMap<String, OutputTab>(); + this.handlers = new ArrayList<CollectionChangeHandler>(); + this.outHandlers = new ArrayList<OutputModesChangeHandler>(); + this.layout = new VLayout(); + this.parameterList = new ParameterList( + flys, this, messages.new_project()); + this.artifactsQueue = 0; + this.recommendationQueue = 0; + this.newRecommendations = new Stack<Recommendation>(); + + this.currentKm = -1d; + this.minKm = -1d; + this.maxKm = -1d; + this.steps = -1d; + + addCollectionChangeHandler(this); + addCollectionChangeHandler(parameterList); + addCollectionChangeHandler(flys); + addOutputModesChangeHandler(this); + addOutputModesChangeHandler(parameterList); + addCloseClickHandler(this); + + parameterList.addParameterChangeHandler(this); + + init(); + } + + /** + * @param collection The collection to be displayed. + */ + public CollectionView(FLYS flys, Collection collection, Artifact artifact) { + this.flys = flys; + this.artifact = artifact; + this.collection = collection; + this.tabs = new TabSet(); + this.outputTabs = new HashMap<String, OutputTab>(); + this.handlers = new ArrayList<CollectionChangeHandler>(); + this.outHandlers = new ArrayList<OutputModesChangeHandler>(); + this.layout = new VLayout(); + + this.currentKm = -1d; + this.minKm = -1d; + this.maxKm = -1d; + this.steps = -1d; + + if (artifact != null) { + this.parameterList = new ParameterList( + flys, + this, + messages.getString(artifact.getName()), + artifact); + } + else { + this.parameterList = new ParameterList( + flys, this, messages.new_project()); + } + + this.artifactsQueue = 0; + this.newRecommendations = new Stack<Recommendation>(); + + addCollectionChangeHandler(this); + addCollectionChangeHandler(parameterList); + addCollectionChangeHandler(flys); + addOutputModesChangeHandler(this); + addOutputModesChangeHandler(parameterList); + addCloseClickHandler(this); + + parameterList.addParameterChangeHandler(this); + + init(); + + setCollection(collection); + + if (artifact != null) { + setArtifact(artifact); + } + } + + + /** + * This method handles the initial layout stuff. + */ + protected void init() { + setWidth(1010); + setHeight(700); + + setMaximized(true); + + layout.setWidth100(); + + setCanDragReposition(true); + setCanDragResize(true); + setShowMaximizeButton(true); + setKeepInParentRect(true); + + setTitle(""); + + addItem(layout); + + layout.addMember(tabs); + tabs.addTab(parameterList); + } + + protected FLYS getFlys() { + return flys; + } + + + /** + * This method registers a new CollectionChangeHandler. + * + * @param handler The new CollectionChangeHandler. + */ + @Override + public void addCollectionChangeHandler(CollectionChangeHandler handler) { + if (handler != null) { + handlers.add(handler); + } + } + + + /** + * This method registers a new OutputModesChangeHandler. + * + * @param handler The new OutputModesChangeHandler. + */ + @Override + public void addOutputModesChangeHandler(OutputModesChangeHandler handler) { + if (handler != null) { + outHandlers.add(handler); + } + } + + + /** + * This method calls the <code>onValueChange()</code> method of all + * registered ValueChangeHanders. + */ + protected void fireCollectionChangeEvent( + Collection old, Collection newCol) + { + for (CollectionChangeHandler handler: handlers) { + handler.onCollectionChange(new CollectionChangeEvent(old, newCol)); + } + } + + + protected void fireOutputModesChangeEvent(OutputMode[] outputs) { + if (collection == null) { + return; + } + + for (OutputModesChangeHandler handler: outHandlers) { + handler.onOutputModesChange(new OutputModesChangeEvent(outputs)); + } + } + + + /** Disables input, grey out, show spinning wheel of joy. */ + public void lockUI() { + lockScreen = ScreenLock.lockUI(layout, lockScreen); + } + + + /** Enable input, remove grey, remove spinning wheel of joy. */ + public void unlockUI() { + ScreenLock.unlockUI(layout, lockScreen); + } + + + /** + * This method returns true, if the Collection is new and no plugins has + * been chosen. + * + * @return true, if the Collection is new. + */ + public boolean isNew() { + return collection.hasItems(); + } + + + /** + * Returns the artifact that is used for the parameterization. + * + * @return the artifact that is used for the parameterization. + */ + public Artifact getArtifact() { + return artifact; + } + + + public User getUser() { + return getFlys().getCurrentUser(); + } + + + /** + * Set the current artifact that is the master of the parameterization. + * + * @param artifact The new artifact. + */ + public void setArtifact(Artifact artifact) { + this.artifact = artifact; + + onArtifactChanged(artifact); + } + + + public void onArtifactChanged(Artifact artifact) { + artifactChanged(); + + if (artifact.isInBackground()) { + LoadingPanel p = new LoadingPanel(this, artifact); + p.addStepBackHandler(parameterList); + } + } + + + /** + * Implements the onCollectionChange() method to do update the GUI after the + * parameterization has changed. + * + * @param event The ParameterChangeEvent. + */ + @Override + public void onParameterChange(ParameterChangeEvent event) { + GWT.log("CollectionView.onParameterChange"); + setArtifact(event.getNewValue()); + } + + + protected void artifactChanged() { + Collection c = getCollection(); + + if (c != null) { + loadCollection(c); + } + else { + updateView(); + } + } + + /** + * Loads all information of a collection + * @param c the Collection + */ + private void loadCollection(Collection c) { + ArtifactDescription desc = getArtifact().getArtifactDescription(); + final Recommendation[] recom = desc.getRecommendations(); + Config config = Config.getInstance(); + String locale = config.getLocale(); + + describeCollectionService.describe(c.identifier(), locale, + new AsyncCallback<Collection>() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not DESCRIBE collection."); + SC.warn(FLYS.getExceptionString(messages, caught)); + } + + @Override + public void onSuccess(Collection newCollection) { + GWT.log("Successfully DESCRIBED collection."); + boolean loaded = true; + for (Recommendation r: recom) { + if(!newCollection.loadedRecommendation(r)) { + loaded = false; + } + } + if (!loaded) { + loadRecommendedArtifacts(recom); + } + else { + setCollection(newCollection); + } + } + } + ); + } + + + /** + * Returns the collection of displayed by this view. + * + * @return the collection of this view. + */ + public Collection getCollection() { + return collection; + } + + + protected void setCollection(Collection collection) { + setCollection(collection, false); + } + + + /** + * Set the current collection. + * + * @param collection The new collection. + * @param suppress Whether to fire a collectionchangeevent. + */ + protected void setCollection(Collection collection, boolean suppress) { + if (collection != null && this.collection == null) { + flys.getWorkspace().addView(collection.identifier(), this); + } + + Collection tmp = this.collection; + this.collection = collection; + + setTitle(collection.getDisplayName()); + + if (!suppress) { + fireCollectionChangeEvent(tmp, this.collection); + } + } + + + @Override + public void onCollectionChange(CollectionChangeEvent event) { + if (artifactsQueue > 0) { + GWT.log("Do not update UI because we are still loading Artifacts."); + return; + } + + Collection newCol = event.getNewValue(); + + Map<String, OutputMode> outs = newCol.getOutputModes(); + + Set<String> keys = outs.keySet(); + OutputMode[] prepared = new OutputMode[outs.size()]; + + int idx = 0; + for (String outname: keys) { + prepared[idx++] = outs.get(outname); + } + + fireOutputModesChangeEvent(prepared); + + updateView(); + } + + + @Override + public void onOutputModesChange(OutputModesChangeEvent event) { + clearOutputTabs(); + OutputMode[] outs = event.getOutputModes(); + + if (outs == null) { + return; + } + + boolean hasCSV = false; + + for (OutputMode out: outs) { + addOutputTab(out.getName(), out); + + if (out instanceof ExportMode) { + ExportMode export = (ExportMode) out; + + if (export.getFacet("csv") != null) { + hasCSV = true; + parameterList.contractInfoPanel(); + } + } + } + + if (!hasCSV) { + parameterList.removeTable(); + } + } + + + /** + * Adds a new tab for the OutputMode <i>out</i>. + * + * @param name The name and title of the output. + */ + protected void addOutputTab(String name, OutputMode out) { + if (out instanceof ExportMode) { + ExportMode export = (ExportMode) out; + + if (export.getFacet("csv") != null && !parameterList.hasTable()) { + TableDataPanel p = new TableDataPanel(); + p.setUuid(collection.identifier()); + p.setName(out.getName()); + parameterList.setTable(p); + } + + return; + } + + if (out instanceof ReportMode) { + // we don't want to display report modes at all + return; + } + + GWT.log("Add new output tab for '" + name + "'"); + + String title = messages.getString(name); + OutputTab tab = out.createOutputTab(title, getCollection(), this); + + if (tab != null) { + outputTabs.put(name, tab); + } + } + + + /** + * Removes all output mode tabs from tab bar. + */ + protected void clearOutputTabs() { + GWT.log("Clear OutputTabs."); + + int num = tabs.getNumTabs(); + + for (int i = num-1; i >= 1; i--) { + tabs.removeTab(i); + } + + outputTabs.clear(); + } + + + /** + * Update the view (refresh the list of old and current data). + */ + protected void updateView() { + GWT.log("CollectionView.updateView()"); + updateOutputTabs(); + } + + + /** + * This method is used to update the tabs to show specific output modes. + */ + protected void updateOutputTabs() { + GWT.log("Update output tabs."); + if (outputTabs != null) { + Set<String> keys = outputTabs.keySet(); + + for (String key: keys) { + tabs.addTab(outputTabs.get(key)); + } + } + } + + + @Override + public void onCloseClick(CloseClickEvent event) { + if (collection != null) { + if(artifact != null) { + flys.closeProject(collection.identifier()); + } + else { + flys.getProjectList().deleteCollection(collection); + } + } + else { + hide(); + destroy(); + } + } + + + public void addArtifactToCollection(Artifact artifact) { + Config config = Config.getInstance(); + final String locale = config.getLocale(); + final Collection collection = getCollection(); + + GWT.log("CollectionView.addArtifactToCollection " + collection); + + if (collection != null) { + addArtifactService.add( + collection, artifact, locale, + new AsyncCallback<Collection>() { + @Override + public void onFailure(Throwable caught) { + GWT.log("An error occured while adding artifact."); + SC.warn(FLYS.getExceptionString(messages, caught)); + } + + @Override + public void onSuccess(Collection newCollection) { + GWT.log("Successfully added artifacts."); + setCollection(newCollection, true); + } + } + ); + } + else { + // Create new collection and add artifact + final Artifact art = artifact; + createCollectionService.create( + locale, + flys.getCurrentUser().identifier(), + new AsyncCallback<Collection>() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Could not create the new collection."); + SC.warn(FLYS.getExceptionString(messages, caught)); + } + + @Override + public void onSuccess(Collection collection) { + GWT.log("Successfully created a new collection."); + addArtifactService.add( + collection, art, locale, + new AsyncCallback<Collection>() { + @Override + public void onFailure(Throwable caught) { + GWT.log("An error occured while adding artifact."); + SC.warn(FLYS.getExceptionString(messages, caught)); + } + + @Override + public void onSuccess(Collection newCollection) { + GWT.log("Successfully added artifacts."); + setCollection(newCollection); + } + } + ); + } + } + ); + } + } + + + protected void addRecommendationsToCollection() { + Config config = Config.getInstance(); + final String locale = config.getLocale(); + final Collection collection = getCollection(); + + collection.addRecommendations(newRecommendations); + + updater.update(collection, locale, + new AsyncCallback<Collection>() { + @Override + public void onFailure(Throwable caught) { + newRecommendations.removeAllElements(); + setCollection(collection); + + GWT.log("An error occured while saving recommendations."); + SC.warn(FLYS.getExceptionString(messages, caught)); + } + + @Override + public void onSuccess(Collection newCol) { + GWT.log("Successfully saved recommendations."); + newRecommendations.removeAllElements(); + setCollection(newCol); + } + } + ); + } + + + protected void loadRecommendedArtifacts(Recommendation[] recommendations) { + Config config = Config.getInstance(); + final String locale = config.getLocale(); + final Collection collection = getCollection(); + + Artifact masterArtifact = getArtifact(); + + if (recommendations == null) { + GWT.log("WARNING: Currently no recommendations."); + return; + } + + for (final Recommendation recommendation: recommendations) { + if (collection.loadedRecommendation(recommendation)) { + continue; + } + newRecommendations.push(recommendation); + + // XXX: UGLY! If no reference artifact given use uuid of + // current artifact as reference. + if (recommendation.getMasterArtifact() == null) { + recommendation.setMasterArtifact(masterArtifact.getUuid()); + } + + } + + loadArtifactService.loadMany( + collection, + recommendations, + null, + locale, + new AsyncCallback<Artifact[]>() { + @Override + public void onFailure(Throwable caught) { + GWT.log("Error loading recommendations: " + + caught.getMessage()); + SC.warn(FLYS.getExceptionString(messages, caught)); + } + + @Override + public void onSuccess(Artifact[] artifacts) { + GWT.log("Loaded artifacts: " + artifacts.length); + addRecommendationsToCollection(); + } + }); + } + + + public void registerTabHandler(TabSelectedHandler tse) { + tabs.addTabSelectedHandler(tse); + } + + + public void setCurrentKm(double currentKm) { + this.currentKm = currentKm; + } + + public double getCurrentKm() { + return this.currentKm; + } + + public void setMinKm(double km) { + this.minKm = km; + } + + public double getMinKm() { + return this.minKm; + } + + public void setMaxKm(double km) { + this.maxKm = km; + } + + public double getMaxKm() { + return this.maxKm; + } + + public void setSteps(double step) { + this.steps = step; + } + + public double getSteps() { + return this.steps; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :