Mercurial > dive4elements > river
view flys-client/src/main/java/de/intevation/flys/client/client/ui/chart/ChartThemePanel.java @ 593:c0477626ae6a
#156 Do not display report modes as tabs in the project view.
flys-client/trunk@2189 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Tue, 21 Jun 2011 17:29:18 +0000 |
parents | c17c593f8732 |
children | 3b02a798d75d |
line wrap: on
line source
package de.intevation.flys.client.client.ui.chart; import java.util.ArrayList; import java.util.List; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.types.ListGridFieldType; import com.smartgwt.client.util.SC; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.grid.events.EditCompleteEvent; import com.smartgwt.client.widgets.grid.events.EditCompleteHandler; import com.smartgwt.client.widgets.grid.ListGrid; import com.smartgwt.client.widgets.grid.ListGridField; import com.smartgwt.client.widgets.grid.ListGridRecord; import com.smartgwt.client.widgets.layout.VLayout; import de.intevation.flys.client.shared.model.Collection; import de.intevation.flys.client.shared.model.FacetRecord; import de.intevation.flys.client.shared.model.OutputMode; import de.intevation.flys.client.shared.model.Theme; import de.intevation.flys.client.shared.model.ThemeList; import de.intevation.flys.client.client.Config; import de.intevation.flys.client.client.FLYSConstants; import de.intevation.flys.client.client.event.HasOutputParameterChangeHandlers; import de.intevation.flys.client.client.event.OnMoveEvent; import de.intevation.flys.client.client.event.OnMoveHandler; import de.intevation.flys.client.client.event.OutputParameterChangeEvent; import de.intevation.flys.client.client.event.OutputParameterChangeHandler; import de.intevation.flys.client.client.services.CollectionAttributeService; import de.intevation.flys.client.client.services.CollectionAttributeServiceAsync; /** * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> */ public class ChartThemePanel extends Canvas implements EditCompleteHandler, OnMoveHandler, HasOutputParameterChangeHandlers { /** The interface that provides i18n messages. */ private FLYSConstants MSG = GWT.create(FLYSConstants.class); /** The service that is used to modify collection attributes.*/ protected CollectionAttributeServiceAsync updater = GWT.create(CollectionAttributeService.class); public static final String GRID_FIELD_ACTIVE = "active"; public static final String GRID_FIELD_NAME = "name"; protected Collection collection; protected OutputMode mode; protected List<OutputParameterChangeHandler> outHandlers; protected ListGrid list; protected ChartOutputTab chartOut; protected ThemeNavigationPanel navigation; public ChartThemePanel(Collection collection, OutputMode mode) { this.collection = collection; this.mode = mode; this.outHandlers = new ArrayList<OutputParameterChangeHandler>(); this.chartOut = chartOut; this.list = new ListGrid(); this.navigation = new ThemeNavigationPanel(); this.navigation.addOnMoveHandler(this); initGrid(); initLayout(); updateGrid(); } /** * Initializes the layout of this panel. */ protected void initLayout() { setWidth100(); setHeight100(); VLayout layout = new VLayout(); layout.setWidth100(); layout.setHeight100(); layout.addMember(list); layout.addMember(navigation); addChild(layout); } /** * Initializes the components (columns) of the theme grid. */ protected void initGrid() { list.setCanEdit(true); list.setCanSort(false); list.setShowRecordComponents(false); list.setShowRecordComponentsByCell(true); list.setShowHeader(true); list.setShowHeaderContextMenu(false); list.setWidth100(); list.setHeight100(); list.addEditCompleteHandler(this); ListGridField active = new ListGridField(GRID_FIELD_ACTIVE, " ", 20); active.setType(ListGridFieldType.BOOLEAN); ListGridField name = new ListGridField( GRID_FIELD_NAME, MSG.chart_themepanel_header_themes()); name.setType(ListGridFieldType.TEXT); list.setFields(active, name); } /** * Replace the current collection with a new one. <b>NOTE: this operation * triggers updateGrid() which modifies the themes in the grid.</b> * * @param collection The new collection object. */ protected void setCollection(Collection collection) { this.collection = collection; updateGrid(); } /** * Registers a new OutputParameterChangeHandler. * * @param h The new handler. */ public void addOutputParameterChangeHandler(OutputParameterChangeHandler h){ if (h != null) { outHandlers.add(h); } } /** * Returns the ThemeList of the current collection and output mode. * * @return the current ThemeList. */ public ThemeList getThemeList() { return collection.getThemeList(mode.getName()); } /** * A method that removes all records from theme grid. */ protected void clearGrid() { ListGridRecord[] records = list.getRecords(); if (records == null || records.length == 0) { return; } for (ListGridRecord record: records) { list.removeData(record); } } /** * This method is used to clear the current theme grid and add new updated * data. */ protected void updateGrid() { GWT.log("ChartThemePanel.updateGrid"); clearGrid(); ThemeList themeList = getThemeList(); if (themeList == null) { GWT.log("ERROR: No theme list."); return; } int count = themeList.getThemeCount(); for (int i = 1; i <= count; i++) { Theme theme = themeList.getThemeAt(i); if (theme == null) { continue; } list.addData(new FacetRecord(theme)); } fireOutputParameterChanged(); } /** * Called when the attribution of a chart changed. It informs the registered * handlers about the changes. */ protected void fireOutputParameterChanged() { OutputParameterChangeEvent evt = new OutputParameterChangeEvent(); for (OutputParameterChangeHandler handler: outHandlers) { handler.onOutputParameterChanged(evt); } } /** * This method is called after a cell in the theme grid has been modified. * * @param event The event that stores information about the modified record. */ public void onEditComplete(EditCompleteEvent event) { GWT.log("Edited record."); int row = event.getRowNum(); FacetRecord rec = (FacetRecord) list.getRecord(row); Theme theme = rec.getTheme(); theme.setActive(rec.getActive()); updateThemeList(rec.getTheme()); } /** * Update the theme list of the current collection with a modified theme. If * a theme is really modified, the CollectionAttributeService is triggered * to save the changes to the artifact server. * * @param theme The modified theme. */ protected void updateThemeList(Theme theme) { GWT.log("Update theme: " + theme.getFacet()); ThemeList themeList = getThemeList(); String a = theme.getArtifact(); String f = theme.getFacet(); int num = themeList != null ? themeList.getThemeCount() : 0; boolean updateRequired = false; for (int i = 1; i <= num; i++) { Theme old = themeList.getThemeAt(i); if (f.equals(old.getFacet()) && a.equals(old.getArtifact())) { themeList.removeTheme(old); themeList.addTheme(theme); updateRequired = true; break; } } if (updateRequired) { updateCollection(); } } /** * This method triggers the CollectionAttributeService. Based on the current * collectin settings, the attribute of the collection is modified or not. * But in every case, we will get a new collection object - which might be * the same as the current one. */ public void updateCollection() { final Config config = Config.getInstance(); final String url = config.getServerUrl(); final String loc = config.getLocale(); GWT.log("ChartThemePanel.updateCollection via RPC now"); // don't forget to enable the panel after the request has finished! disable(); updater.update(collection, url, loc, new AsyncCallback<Collection>() { public void onFailure(Throwable caught) { GWT.log("Could not update collection attributes."); SC.warn(MSG.getString(caught.getMessage())); enable(); } public void onSuccess(Collection collection) { setCollection(collection); enable(); } }); } public void onMove(OnMoveEvent event) { int type = event.getType(); GWT.log("ChartThemePanel.onMove: " + type); ListGridRecord[] records = list.getSelection(); if (records == null || records.length == 0) { GWT.log("ChartThemePanel.onMove: No records selected."); return; } switch (type) { case 0: moveRecordsTop(records); break; case 1: moveRecordsUp(records); break; case 2: moveRecordsDown(records); break; case 3: moveRecordsBottom(records); break; } updateCollection(); } /** * Moves the selected grid records (themes) to the top of the grid. * * @param records The selected themes in the list. Null not permitted. */ protected void moveRecordsTop(ListGridRecord[] records) { ThemeList themeList = getThemeList(); int idx = 1; for (ListGridRecord record: records) { Theme theme = ((FacetRecord) record).getTheme(); themeList.setThemePosition(theme, idx++); } updateGrid(); } /** * Moves the selected grid records (themes) one step up. * * @param records The selected themes in the list. Null not permitted. */ protected void moveRecordsUp(ListGridRecord[] records) { ThemeList themeList = getThemeList(); int[] newPos = new int[records.length]; for (int i = 0; i < records.length ; i++) { Theme theme = ((FacetRecord) records[i]).getTheme(); newPos[i] = theme.getPosition() - 1; } for (int i = 0; i < records.length ; i++) { Theme theme = ((FacetRecord) records[i]).getTheme(); themeList.setThemePosition(theme, newPos[i]); } updateGrid(); } /** * Moves the selected grid records (themes) one step down. * * @param records The selected themes in the list. Null not permitted. */ protected void moveRecordsDown(ListGridRecord[] records) { ThemeList themeList = getThemeList(); int[] newPos = new int[records.length]; for (int i = records.length-1; i >= 0; i--) { Theme theme = ((FacetRecord) records[i]).getTheme(); newPos[i] = theme.getPosition()+1; } for (int i = records.length-1; i >= 0; i--) { Theme theme = ((FacetRecord) records[i]).getTheme(); themeList.setThemePosition(theme, newPos[i]); } updateGrid(); } /** * Moves the selected grid records (themes) to the bottom of the grid. * * @param records The selected themes in the list. Null not permitted. */ protected void moveRecordsBottom(ListGridRecord[] records) { ThemeList themeList = getThemeList(); int idx = themeList.getThemeCount(); for (int i = records.length-1; i >= 0; i--) { Theme theme = ((FacetRecord) records[i]).getTheme(); themeList.setThemePosition(theme, idx--); } updateGrid(); } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :