ingo@523: package de.intevation.flys.client.client.ui.chart; ingo@523: ingo@523: import com.google.gwt.core.client.GWT; ingo@526: import com.google.gwt.user.client.rpc.AsyncCallback; ingo@523: ingo@523: import com.smartgwt.client.types.ListGridFieldType; ingo@526: import com.smartgwt.client.util.SC; ingo@523: import com.smartgwt.client.widgets.Canvas; ingo@523: import com.smartgwt.client.widgets.grid.events.EditCompleteEvent; ingo@523: import com.smartgwt.client.widgets.grid.events.EditCompleteHandler; ingo@523: import com.smartgwt.client.widgets.grid.ListGrid; ingo@523: import com.smartgwt.client.widgets.grid.ListGridField; ingo@523: import com.smartgwt.client.widgets.grid.ListGridRecord; ingo@523: import com.smartgwt.client.widgets.layout.VLayout; ingo@523: ingo@523: import de.intevation.flys.client.shared.model.Collection; ingo@523: import de.intevation.flys.client.shared.model.FacetRecord; ingo@523: import de.intevation.flys.client.shared.model.OutputMode; ingo@524: import de.intevation.flys.client.shared.model.Theme; ingo@524: import de.intevation.flys.client.shared.model.ThemeList; ingo@523: ingo@526: import de.intevation.flys.client.client.Config; ingo@523: import de.intevation.flys.client.client.FLYSConstants; ingo@526: import de.intevation.flys.client.client.services.CollectionAttributeService; ingo@526: import de.intevation.flys.client.client.services.CollectionAttributeServiceAsync; ingo@523: ingo@523: ingo@523: /** ingo@523: * @author Ingo Weinzierl ingo@523: */ ingo@523: public class ChartThemePanel extends Canvas implements EditCompleteHandler { ingo@523: ingo@523: /** The interface that provides i18n messages. */ ingo@523: private FLYSConstants MSG = GWT.create(FLYSConstants.class); ingo@523: ingo@526: ingo@526: /** The service that is used to modify collection attributes.*/ ingo@526: protected CollectionAttributeServiceAsync updater = ingo@526: GWT.create(CollectionAttributeService.class); ingo@526: ingo@526: ingo@523: public static final String GRID_FIELD_ACTIVE = "active"; ingo@523: public static final String GRID_FIELD_NAME = "name"; ingo@523: ingo@523: ingo@523: protected Collection collection; ingo@523: ingo@523: protected OutputMode mode; ingo@523: ingo@523: protected ListGrid list; ingo@523: ingo@523: ingo@523: ingo@523: public ChartThemePanel(Collection collection, OutputMode mode) { ingo@523: this.collection = collection; ingo@523: this.mode = mode; ingo@523: this.list = new ListGrid(); ingo@523: ingo@523: initGrid(); ingo@523: initLayout(); ingo@523: ingo@523: updateGrid(); ingo@523: } ingo@523: ingo@523: ingo@523: /** ingo@523: * Initializes the layout of this panel. ingo@523: */ ingo@523: protected void initLayout() { ingo@523: setWidth100(); ingo@523: setHeight100(); ingo@523: ingo@523: VLayout layout = new VLayout(); ingo@523: layout.setWidth100(); ingo@523: layout.setHeight100(); ingo@523: ingo@523: layout.addMember(list); ingo@523: ingo@523: addChild(layout); ingo@523: } ingo@523: ingo@523: ingo@523: /** ingo@523: * Initializes the components (columns) of the theme grid. ingo@523: */ ingo@523: protected void initGrid() { ingo@523: list.setCanEdit(true); ingo@523: list.setCanSort(false); ingo@523: list.setShowRecordComponents(false); ingo@523: list.setShowRecordComponentsByCell(true); ingo@523: list.setShowHeader(true); ingo@523: list.setShowHeaderContextMenu(false); ingo@523: list.setWidth100(); ingo@523: list.setHeight100(); ingo@523: ingo@523: list.addEditCompleteHandler(this); ingo@523: ingo@523: ListGridField active = new ListGridField(GRID_FIELD_ACTIVE, " ", 20); ingo@523: active.setType(ListGridFieldType.BOOLEAN); ingo@523: ingo@523: ListGridField name = new ListGridField( ingo@523: GRID_FIELD_NAME, MSG.chart_themepanel_header_themes()); ingo@523: name.setType(ListGridFieldType.TEXT); ingo@523: ingo@523: list.setFields(active, name); ingo@523: } ingo@523: ingo@523: ingo@523: /** ingo@526: * Replace the current collection with a new one. NOTE: this operation ingo@526: * triggers updateGrid() which modifies the themes in the grid. ingo@526: * ingo@526: * @param collection The new collection object. ingo@526: */ ingo@526: protected void setCollection(Collection collection) { ingo@526: this.collection = collection; ingo@526: ingo@526: updateGrid(); ingo@526: } ingo@526: ingo@526: ingo@526: /** ingo@523: * A method that removes all records from theme grid. ingo@523: */ ingo@523: protected void clearGrid() { ingo@523: ListGridRecord[] records = list.getRecords(); ingo@523: ingo@523: if (records == null || records.length == 0) { ingo@523: return; ingo@523: } ingo@523: ingo@523: for (ListGridRecord record: records) { ingo@523: list.removeData(record); ingo@523: } ingo@523: } ingo@523: ingo@523: ingo@523: /** ingo@523: * This method is used to clear the current theme grid and add new updated ingo@523: * data. ingo@523: */ ingo@523: protected void updateGrid() { ingo@526: GWT.log("ChartThemePanel.updateGrid"); ingo@526: ingo@523: clearGrid(); ingo@523: ingo@524: ThemeList themeList = collection.getThemeList(mode.getName()); ingo@523: ingo@524: if (themeList == null) { ingo@524: GWT.log("ERROR: No theme list."); ingo@524: return; ingo@524: } ingo@524: ingo@524: int count = themeList.getThemeCount(); ingo@524: ingo@524: for (int i = 1; i <= count; i++) { ingo@524: Theme theme = themeList.getThemeAt(i); ingo@524: ingo@524: if (theme == null) { ingo@524: continue; ingo@524: } ingo@524: ingo@524: list.addData(new FacetRecord(theme)); ingo@523: } ingo@523: } ingo@523: ingo@523: ingo@523: /** ingo@523: * This method is called after a cell in the theme grid has been modified. ingo@523: * ingo@523: * @param event The event that stores information about the modified record. ingo@523: */ ingo@523: public void onEditComplete(EditCompleteEvent event) { ingo@523: GWT.log("Edited record."); ingo@523: ingo@523: int row = event.getRowNum(); ingo@523: FacetRecord rec = (FacetRecord) list.getRecord(row); ingo@523: ingo@526: updateThemeList(rec.getTheme()); ingo@526: } ingo@526: ingo@526: ingo@526: /** ingo@526: * Update the theme list of the current collection with a modified theme. If ingo@526: * a theme is really modified, the CollectionAttributeService is triggered ingo@526: * to save the changes to the artifact server. ingo@526: * ingo@526: * @param theme The modified theme. ingo@526: */ ingo@526: protected void updateThemeList(Theme theme) { ingo@526: GWT.log("Update theme: " + theme.getFacet()); ingo@526: ingo@526: ThemeList themeList = collection.getThemeList(mode.getName()); ingo@526: ingo@526: String a = theme.getArtifact(); ingo@526: String f = theme.getFacet(); ingo@526: ingo@526: int num = themeList != null ? themeList.getThemeCount() : 0; ingo@526: ingo@526: boolean updateRequired = false; ingo@526: ingo@526: for (int i = 1; i <= num; i++) { ingo@526: Theme old = themeList.getThemeAt(i); ingo@526: ingo@526: if (f.equals(old.getFacet()) && a.equals(old.getArtifact())) { ingo@526: themeList.removeTheme(old); ingo@526: themeList.addTheme(theme); ingo@526: ingo@526: updateRequired = true; ingo@526: ingo@526: break; ingo@526: } ingo@526: } ingo@526: ingo@526: if (updateRequired) { ingo@526: updateCollection(); ingo@526: } ingo@526: } ingo@526: ingo@526: ingo@526: /** ingo@526: * This method triggers the CollectionAttributeService. Based on the current ingo@526: * collectin settings, the attribute of the collection is modified or not. ingo@526: * But in every case, we will get a new collection object - which might be ingo@526: * the same as the current one. ingo@526: */ ingo@526: public void updateCollection() { ingo@526: final Config config = Config.getInstance(); ingo@526: final String url = config.getServerUrl(); ingo@526: final String loc = config.getLocale(); ingo@526: ingo@526: GWT.log("ChartThemePanel.updateCollection via RPC now"); ingo@526: ingo@526: updater.update(collection, url, loc, new AsyncCallback() { ingo@526: public void onFailure(Throwable caught) { ingo@526: GWT.log("Could not update collection attributes."); ingo@526: SC.warn(MSG.getString(caught.getMessage())); ingo@526: } ingo@526: ingo@526: ingo@526: public void onSuccess(Collection collection) { ingo@526: setCollection(collection); ingo@526: } ingo@526: }); ingo@523: } ingo@523: } ingo@523: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :