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@30: import de.intevation.flys.client.shared.model.DefaultData;
ingo@30: import de.intevation.flys.client.shared.model.DefaultDataItem;
ingo@30: import de.intevation.flys.client.shared.model.River;
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@23: import de.intevation.flys.client.client.event.StepForwardEvent;
ingo@23: import de.intevation.flys.client.client.event.StepForwardHandler;
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@23: StepForwardHandler
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@26: /** The ArtifactService used to communicate with the Artifact server. */
ingo@26: protected CreateCollectionServiceAsync createCollectionService =
ingo@26: GWT.create(CreateCollectionService.class);
ingo@26:
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@36: this.parameterList = new ParameterList();
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@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@6: setWidth(600);
ingo@6: setHeight(400);
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@23: tabs.setTabTitle(0, "MODUL");
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@26: Config config = Config.getInstance();
ingo@26: String serverUrl = config.getServerUrl();
ingo@26:
ingo@26: createCollectionService.create(
ingo@26: serverUrl, ownerId,
ingo@26: 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@26: public void onSuccess(String uuid) {
ingo@26: GWT.log("Successfully created a new collection.");
ingo@26: GWT.log("NEW collection uuid: " + uuid);
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@19: return collection.getArtifactLength() == 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@30: "RIVER", "RIVER SELECTION", null, items, null);
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@30: return widget.create(data);
ingo@30: }
ingo@7:
ingo@30:
ingo@30: /**
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@36:
ingo@36: // TODO IMPLEMENT ME
ingo@36: updateView();
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@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@23: GWT.log("TODO: IMPLEMENT FEED!");
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: ArtifactDescription desc = artifact.getArtifactDescription();
ingo@23:
ingo@23: Data currentData = desc.getCurrentData();
ingo@23: if (currentData != null) {
ingo@23: String uiProvider = currentData.getUIProvider();
ingo@23: UIProvider provider = UIProviderFactory.getProvider(uiProvider);
ingo@23:
ingo@23: HasStepForwardHandlers handler = (HasStepForwardHandlers) provider;
ingo@23: handler.addStepForwardHandler(this);
ingo@23:
ingo@23: parameterList.setCurrentData(currentData, provider);
ingo@23: }
ingo@23:
ingo@23: parameterList.addOldDatas(desc.getOldData());
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 :