ingo@523: package de.intevation.flys.client.client.ui.chart;
ingo@523:
ingo@531: import java.util.ArrayList;
ingo@531: import java.util.List;
ingo@531:
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@531: import de.intevation.flys.client.client.event.HasOutputParameterChangeHandlers;
ingo@527: import de.intevation.flys.client.client.event.OnMoveEvent;
ingo@527: import de.intevation.flys.client.client.event.OnMoveHandler;
ingo@531: import de.intevation.flys.client.client.event.OutputParameterChangeEvent;
ingo@531: import de.intevation.flys.client.client.event.OutputParameterChangeHandler;
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@527: public class ChartThemePanel
ingo@527: extends Canvas
ingo@531: implements EditCompleteHandler, OnMoveHandler,
ingo@531: HasOutputParameterChangeHandlers
ingo@527: {
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@531: protected List outHandlers;
ingo@531:
ingo@523: protected ListGrid list;
ingo@523:
ingo@531: protected ChartOutputTab chartOut;
ingo@531:
ingo@527: protected ThemeNavigationPanel navigation;
ingo@527:
ingo@523:
ingo@523:
ingo@523: public ChartThemePanel(Collection collection, OutputMode mode) {
ingo@531: this.collection = collection;
ingo@531: this.mode = mode;
ingo@531: this.outHandlers = new ArrayList();
ingo@531: this.chartOut = chartOut;
ingo@531: this.list = new ListGrid();
ingo@531: this.navigation = new ThemeNavigationPanel();
ingo@527: this.navigation.addOnMoveHandler(this);
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@527: layout.addMember(navigation);
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@531: * Registers a new OutputParameterChangeHandler.
ingo@531: *
ingo@531: * @param h The new handler.
ingo@531: */
ingo@531: public void addOutputParameterChangeHandler(OutputParameterChangeHandler h){
ingo@531: if (h != null) {
ingo@531: outHandlers.add(h);
ingo@531: }
ingo@531: }
ingo@531:
ingo@531:
ingo@531: /**
ingo@528: * Returns the ThemeList of the current collection and output mode.
ingo@528: *
ingo@528: * @return the current ThemeList.
ingo@528: */
ingo@528: public ThemeList getThemeList() {
ingo@528: return collection.getThemeList(mode.getName());
ingo@528: }
ingo@528:
ingo@528:
ingo@528: /**
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@528: ThemeList themeList = getThemeList();
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@531:
ingo@531: fireOutputParameterChanged();
ingo@531: }
ingo@531:
ingo@531:
ingo@531: /**
ingo@531: * Called when the attribution of a chart changed. It informs the registered
ingo@531: * handlers about the changes.
ingo@531: */
ingo@531: protected void fireOutputParameterChanged() {
ingo@531: OutputParameterChangeEvent evt = new OutputParameterChangeEvent();
ingo@531:
ingo@531: for (OutputParameterChangeHandler handler: outHandlers) {
ingo@531: handler.onOutputParameterChanged(evt);
ingo@531: }
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@529: Theme theme = rec.getTheme();
ingo@804: theme.setActive(rec.getActive() ? 1 : 0);
ingo@529:
ingo@777: updateCollection();
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@531: // don't forget to enable the panel after the request has finished!
ingo@531: disable();
ingo@531:
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@531:
ingo@531: enable();
ingo@526: }
ingo@526:
ingo@526:
ingo@526: public void onSuccess(Collection collection) {
ingo@526: setCollection(collection);
ingo@531:
ingo@531: enable();
ingo@526: }
ingo@526: });
ingo@523: }
ingo@527:
ingo@527:
ingo@527: public void onMove(OnMoveEvent event) {
ingo@528: int type = event.getType();
ingo@527:
ingo@528: GWT.log("ChartThemePanel.onMove: " + type);
ingo@528:
ingo@528: ListGridRecord[] records = list.getSelection();
ingo@528:
ingo@528: if (records == null || records.length == 0) {
ingo@528: GWT.log("ChartThemePanel.onMove: No records selected.");
ingo@528: return;
ingo@528: }
ingo@528:
ingo@528: switch (type) {
ingo@528: case 0: moveRecordsTop(records); break;
ingo@528: case 1: moveRecordsUp(records); break;
ingo@528: case 2: moveRecordsDown(records); break;
ingo@528: case 3: moveRecordsBottom(records); break;
ingo@528: }
ingo@529:
ingo@529: updateCollection();
ingo@528: }
ingo@528:
ingo@528:
ingo@528: /**
ingo@528: * Moves the selected grid records (themes) to the top of the grid.
ingo@528: *
ingo@528: * @param records The selected themes in the list. Null not permitted.
ingo@528: */
ingo@528: protected void moveRecordsTop(ListGridRecord[] records) {
ingo@528: ThemeList themeList = getThemeList();
ingo@528:
ingo@528: int idx = 1;
ingo@528:
ingo@528: for (ListGridRecord record: records) {
ingo@528: Theme theme = ((FacetRecord) record).getTheme();
ingo@528: themeList.setThemePosition(theme, idx++);
ingo@528: }
ingo@528:
ingo@528: updateGrid();
ingo@528: }
ingo@528:
ingo@528:
ingo@528: /**
ingo@528: * Moves the selected grid records (themes) one step up.
ingo@528: *
ingo@528: * @param records The selected themes in the list. Null not permitted.
ingo@528: */
ingo@528: protected void moveRecordsUp(ListGridRecord[] records) {
ingo@528: ThemeList themeList = getThemeList();
ingo@528:
ingo@528: int[] newPos = new int[records.length];
ingo@528:
ingo@528: for (int i = 0; i < records.length ; i++) {
ingo@528: Theme theme = ((FacetRecord) records[i]).getTheme();
ingo@528: newPos[i] = theme.getPosition() - 1;
ingo@528: }
ingo@528:
ingo@528: for (int i = 0; i < records.length ; i++) {
ingo@528: Theme theme = ((FacetRecord) records[i]).getTheme();
ingo@528: themeList.setThemePosition(theme, newPos[i]);
ingo@528: }
ingo@528:
ingo@528: updateGrid();
ingo@528: }
ingo@528:
ingo@528:
ingo@528: /**
ingo@528: * Moves the selected grid records (themes) one step down.
ingo@528: *
ingo@528: * @param records The selected themes in the list. Null not permitted.
ingo@528: */
ingo@528: protected void moveRecordsDown(ListGridRecord[] records) {
ingo@528: ThemeList themeList = getThemeList();
ingo@528:
ingo@528: int[] newPos = new int[records.length];
ingo@528:
ingo@528: for (int i = records.length-1; i >= 0; i--) {
ingo@528: Theme theme = ((FacetRecord) records[i]).getTheme();
ingo@528: newPos[i] = theme.getPosition()+1;
ingo@528: }
ingo@528:
ingo@528: for (int i = records.length-1; i >= 0; i--) {
ingo@528: Theme theme = ((FacetRecord) records[i]).getTheme();
ingo@528: themeList.setThemePosition(theme, newPos[i]);
ingo@528: }
ingo@528:
ingo@528: updateGrid();
ingo@528: }
ingo@528:
ingo@528:
ingo@528: /**
ingo@528: * Moves the selected grid records (themes) to the bottom of the grid.
ingo@528: *
ingo@528: * @param records The selected themes in the list. Null not permitted.
ingo@528: */
ingo@528: protected void moveRecordsBottom(ListGridRecord[] records) {
ingo@528: ThemeList themeList = getThemeList();
ingo@528:
ingo@528: int idx = themeList.getThemeCount();
ingo@528:
ingo@528: for (int i = records.length-1; i >= 0; i--) {
ingo@528: Theme theme = ((FacetRecord) records[i]).getTheme();
ingo@528: themeList.setThemePosition(theme, idx--);
ingo@528: }
ingo@528:
ingo@528: updateGrid();
ingo@527: }
ingo@523: }
ingo@523: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :