teichmann@5861: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5861: * Software engineering by Intevation GmbH teichmann@5861: * teichmann@5993: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5861: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5993: * documentation coming with Dive4Elements River for details. teichmann@5861: */ teichmann@5861: teichmann@5835: package org.dive4elements.river.client.client.ui; ingo@805: gernotbelger@9416: import java.util.ArrayList; gernotbelger@9416: import java.util.List; ingo@805: teichmann@5835: import org.dive4elements.river.client.client.Config; teichmann@5835: import org.dive4elements.river.client.client.FLYSConstants; teichmann@5835: import org.dive4elements.river.client.client.event.HasOutputParameterChangeHandlers; teichmann@5835: import org.dive4elements.river.client.client.event.HasRedrawRequestHandlers; teichmann@5835: import org.dive4elements.river.client.client.event.OnMoveEvent; teichmann@5835: import org.dive4elements.river.client.client.event.OnMoveHandler; teichmann@5835: import org.dive4elements.river.client.client.event.OutputParameterChangeEvent; teichmann@5835: import org.dive4elements.river.client.client.event.OutputParameterChangeHandler; teichmann@5835: import org.dive4elements.river.client.client.event.RedrawRequestEvent; teichmann@5835: import org.dive4elements.river.client.client.event.RedrawRequestEvent.Type; teichmann@5835: import org.dive4elements.river.client.client.event.RedrawRequestHandler; teichmann@5835: import org.dive4elements.river.client.client.services.CollectionAttributeService; teichmann@5835: import org.dive4elements.river.client.client.services.CollectionAttributeServiceAsync; teichmann@5835: import org.dive4elements.river.client.client.services.CollectionItemAttributeService; teichmann@5835: import org.dive4elements.river.client.client.services.CollectionItemAttributeServiceAsync; teichmann@5835: import org.dive4elements.river.client.shared.model.Collection; teichmann@5835: import org.dive4elements.river.client.shared.model.CollectionItemAttribute; teichmann@5835: import org.dive4elements.river.client.shared.model.FacetRecord; teichmann@5835: import org.dive4elements.river.client.shared.model.OutputMode; teichmann@5835: import org.dive4elements.river.client.shared.model.Theme; teichmann@5835: import org.dive4elements.river.client.shared.model.ThemeList; christian@4184: gernotbelger@9416: import com.google.gwt.core.client.GWT; gernotbelger@9416: import com.google.gwt.user.client.rpc.AsyncCallback; gernotbelger@9416: import com.smartgwt.client.util.BooleanCallback; gernotbelger@9416: import com.smartgwt.client.util.SC; gernotbelger@9416: import com.smartgwt.client.widgets.Canvas; gernotbelger@9416: import com.smartgwt.client.widgets.grid.ListGrid; gernotbelger@9416: import com.smartgwt.client.widgets.grid.ListGridRecord; gernotbelger@9416: import com.smartgwt.client.widgets.grid.events.EditCompleteEvent; gernotbelger@9416: import com.smartgwt.client.widgets.grid.events.EditCompleteHandler; gernotbelger@9416: import com.smartgwt.client.widgets.grid.events.RowContextClickEvent; gernotbelger@9416: import com.smartgwt.client.widgets.grid.events.RowContextClickHandler; gernotbelger@9416: import com.smartgwt.client.widgets.menu.Menu; gernotbelger@9416: import com.smartgwt.client.widgets.menu.MenuItem; gernotbelger@9416: import com.smartgwt.client.widgets.menu.events.ClickHandler; gernotbelger@9416: import com.smartgwt.client.widgets.menu.events.MenuItemClickEvent; ingo@805: felix@1430: /** felix@1430: * ThemePanel on the left in CollectionView. tom@8856: * Contains control widgets for "themes", which are plotted in tom@8856: * a diagram (chart). felix@1430: * felix@1430: * @author Ingo Weinzierl felix@1430: */ gernotbelger@9416: public abstract class ThemePanel extends Canvas implements OnMoveHandler, EditCompleteHandler, HasOutputParameterChangeHandlers, HasRedrawRequestHandlers { gernotbelger@9416: gernotbelger@9416: private final CollectionAttributeServiceAsync updater = GWT.create(CollectionAttributeService.class); ingo@805: ingo@1309: /** The service used to get collection item attributes. */ gernotbelger@9416: private final CollectionItemAttributeServiceAsync itemAttributeService = GWT.create(CollectionItemAttributeService.class); ingo@1309: felix@1443: /** i18ner. */ gernotbelger@9416: protected final FLYSConstants MSG = GWT.create(FLYSConstants.class); ingo@805: felix@858: /** List of OutParameterChangedHandler. */ gernotbelger@9416: private final List outHandlers; felix@1443: felix@858: /** List of ChartShallRedrawHandler. */ gernotbelger@9416: protected final List redrawRequestHandlers; ingo@805: gernotbelger@9416: protected final OutputMode mode; ingo@805: gernotbelger@9416: protected final ThemeNavigationPanel navigation; gernotbelger@9416: gernotbelger@9416: protected final ListGrid list; gernotbelger@9416: gernotbelger@9416: /** The collection view */ ingo@1309: protected CollectionView view; ingo@1309: gernotbelger@9416: private final IThemeRecordHandler recordHandler; gernotbelger@9416: felix@854: /** felix@854: * Setup Grid, navigation bar. gernotbelger@9416: * gernotbelger@9416: * @param collection gernotbelger@9416: * Collection for which to show themes. felix@854: */ gernotbelger@9416: public ThemePanel(final OutputMode mode, final CollectionView view, final IThemeRecordHandler recordHandler) { gernotbelger@9416: this.mode = mode; gernotbelger@9416: this.recordHandler = recordHandler; gernotbelger@9416: this.list = createGrid(); gernotbelger@9416: this.view = view; gernotbelger@9416: gernotbelger@9416: this.list.addRowContextClickHandler(new RowContextClickHandler() { christian@4184: @Override gernotbelger@9416: public void onRowContextClick(final RowContextClickEvent event) { gernotbelger@9416: final ListGridRecord[] records = ThemePanel.this.list.getSelectedRecords(); raimund@1358: raimund@1358: Menu menu = null; raimund@1358: raimund@1358: if (records == null || records.length == 0) { raimund@1358: return; gernotbelger@9416: } else if (records.length == 1) { raimund@1358: menu = getSingleContextMenu(records); gernotbelger@9416: } else if (records.length > 1) { raimund@1358: menu = getMultiContextMenu(records); raimund@1358: } raimund@1358: raimund@1358: if (menu != null) { gernotbelger@9416: ThemePanel.this.list.setContextMenu(menu); raimund@1358: menu.showContextMenu(); raimund@1358: raimund@1358: event.cancel(); raimund@1358: } raimund@1358: } raimund@1358: }); felix@854: felix@858: this.redrawRequestHandlers = new ArrayList(); ingo@805: this.outHandlers = new ArrayList(); gernotbelger@9416: this.navigation = new ThemeNavigationPanel(); ingo@805: this.navigation.addOnMoveHandler(this); sascha@3547: christian@3532: this.setShowResizeBar(true); ingo@805: } ingo@805: ingo@805: public abstract void activateTheme(Theme theme, boolean active); ingo@805: ingo@805: /** ingo@805: * Replace the current collection with a new one. NOTE: this operation ingo@805: * triggers updateGrid() which modifies the themes in the grid. ingo@805: * gernotbelger@9416: * @param collection gernotbelger@9416: * The new collection object. ingo@805: */ gernotbelger@9416: protected void setCollection(final Collection collection) { felix@1555: // Set collection of view, but do not trigger event shooting. felix@1555: this.view.setCollection(collection, true); ingo@805: ingo@805: updateGrid(); ingo@805: } ingo@805: felix@1551: /** Get Collection. */ felix@1551: public Collection getCollection() { gernotbelger@9416: return this.view.getCollection(); felix@1551: } felix@1551: ingo@805: /** ingo@805: * Returns the ThemeList of the current collection and output mode. ingo@805: * ingo@805: * @return the current ThemeList. ingo@805: */ ingo@805: public ThemeList getThemeList() { gernotbelger@9416: return getCollection().getThemeList(this.mode.getName()); ingo@805: } ingo@805: aheinecke@5794: public ListGridRecord[] getSelectedRecords() { gernotbelger@9416: return this.list.getSelectedRecords(); aheinecke@5794: } ingo@805: ingo@805: /** ingo@805: * Registers a new OutputParameterChangeHandler. ingo@805: * gernotbelger@9416: * @param h gernotbelger@9416: * The new handler. ingo@805: */ christian@4184: @Override gernotbelger@9416: public void addOutputParameterChangeHandler(final OutputParameterChangeHandler h) { ingo@805: if (h != null) { gernotbelger@9416: this.outHandlers.add(h); ingo@805: } ingo@805: } ingo@805: ingo@805: /** felix@858: * Registers a RedrawRequestHandler. felix@858: * gernotbelger@9416: * @param h gernotbelger@9416: * The new handler. felix@858: */ christian@4184: @Override gernotbelger@9416: public void addRedrawRequestHandler(final RedrawRequestHandler h) { felix@858: if (h != null) { gernotbelger@9416: this.redrawRequestHandlers.add(h); felix@858: } felix@858: } felix@858: felix@858: /** felix@858: * Request a redraw of e.g. a Chart. felix@858: */ felix@1379: final public void requestRedraw() { gernotbelger@9416: for (final RedrawRequestHandler handler : this.redrawRequestHandlers) { raimund@1509: handler.onRedrawRequest(new RedrawRequestEvent(Type.DEFAULT)); felix@858: } felix@858: } felix@858: felix@858: /** ingo@805: * Called when the attribution of an output changed. It informs the ingo@805: * registered handlers about the changes. ingo@805: */ ingo@805: protected void fireOutputParameterChanged() { gernotbelger@9416: final OutputParameterChangeEvent evt = new OutputParameterChangeEvent(); ingo@805: gernotbelger@9416: for (final OutputParameterChangeHandler handler : this.outHandlers) { ingo@805: handler.onOutputParameterChanged(evt); ingo@805: } ingo@805: } ingo@805: felix@1560: /** Registers the CollectionView associated to this ThemePanel. */ gernotbelger@9416: public void setCollectionView(final CollectionView view) { ingo@1309: this.view = view; ingo@1309: } ingo@1309: ingo@805: /** ingo@805: * This method is used to clear the current theme grid and add new updated ingo@805: * data. ingo@805: */ ingo@805: protected void updateGrid() { ingo@805: GWT.log("ThemePanel.updateGrid"); ingo@805: gernotbelger@9416: final ListGridRecord[] selected = this.list.getSelectedRecords(); ingo@1361: ingo@805: clearGrid(); ingo@805: gernotbelger@9416: final ThemeList themeList = getThemeList(); ingo@805: ingo@805: if (themeList == null) { ingo@805: GWT.log("ERROR: No theme list."); ingo@805: return; ingo@805: } ingo@805: gernotbelger@9416: final int count = themeList.getThemeCount(); ingo@805: ingo@805: for (int i = 1; i <= count; i++) { gernotbelger@9416: final Theme theme = themeList.getThemeAt(i); ingo@805: felix@1578: if (theme == null) { felix@1578: continue; felix@1578: } felix@1578: felix@1578: if (theme.getFacet().equals("empty.facet")) { raimund@1531: theme.setVisible(0); raimund@1531: } raimund@1531: felix@1578: if (theme.getVisible() == 0) { ingo@805: continue; ingo@805: } ingo@805: gernotbelger@9416: final FacetRecord newRecord = createRecord(theme); ingo@1382: addFacetRecord(newRecord); ingo@1361: gernotbelger@9416: final String newArtifact = theme.getArtifact(); gernotbelger@9416: final String newFacet = theme.getFacet(); gernotbelger@9416: final int newIndex = theme.getIndex(); ingo@1361: gernotbelger@9416: for (final ListGridRecord r : selected) { gernotbelger@9416: final FacetRecord sel = (FacetRecord) r; gernotbelger@9416: final Theme oldTheme = sel.getTheme(); ingo@1361: gernotbelger@9416: if (oldTheme.getArtifact().equals(newArtifact) && oldTheme.getFacet().equals(newFacet) && oldTheme.getIndex() == newIndex) { gernotbelger@9416: this.list.selectRecord(newRecord); ingo@1361: } ingo@1361: } ingo@805: } ingo@805: gernotbelger@9416: updateThemes(); gernotbelger@9416: ingo@805: fireOutputParameterChanged(); ingo@805: } ingo@805: felix@1430: /** Adds given Record to the list (table). */ gernotbelger@9416: protected void addFacetRecord(final FacetRecord rec) { gernotbelger@9416: this.list.addData(rec); ingo@1382: } ingo@1382: felix@1430: /** Create a FacetRecord that wraps given theme. */ gernotbelger@9416: protected final FacetRecord createRecord(final Theme theme) { ingo@1327: return new FacetRecord(theme); ingo@1327: } ingo@1327: ingo@805: /** ingo@805: * This method triggers the CollectionAttributeService. Based on the current ingo@805: * collectin settings, the attribute of the collection is modified or not. ingo@805: * But in every case, we will get a new collection object - which might be ingo@805: * the same as the current one. ingo@805: */ ingo@805: public void updateCollection() { ingo@805: final Config config = Config.getInstance(); gernotbelger@9416: final String loc = config.getLocale(); ingo@805: ingo@805: GWT.log("ThemePanel.updateCollection via RPC now"); ingo@805: felix@1430: // Don't forget to enable the panel after the request has finished! ingo@805: disable(); ingo@805: gernotbelger@9416: this.updater.update(getCollection(), loc, new AsyncCallback() { christian@4184: @Override gernotbelger@9416: public void onFailure(final Throwable caught) { ingo@805: GWT.log("Could not update collection attributes."); gernotbelger@9416: SC.warn(ThemePanel.this.MSG.getString(caught.getMessage())); ingo@805: ingo@805: enable(); ingo@805: } ingo@805: christian@4184: @Override gernotbelger@9416: public void onSuccess(final Collection collection) { ingo@805: setCollection(collection); ingo@805: ingo@805: enable(); ingo@805: } ingo@805: }); ingo@805: } ingo@805: felix@854: /** felix@854: * Create and configure the Grid to display. felix@854: */ felix@854: protected ListGrid createGrid() { gernotbelger@9416: final ListGrid grid = new ListGrid(); ingo@2445: grid.setLeaveScrollbarGap(false); ingo@1309: ingo@1309: return grid; felix@854: } ingo@805: ingo@805: /** ingo@805: * A method that removes all records from theme grid. ingo@805: */ ingo@805: protected void clearGrid() { gernotbelger@9416: final ListGridRecord[] records = this.list.getRecords(); ingo@805: ingo@805: if (records == null || records.length == 0) { ingo@805: return; ingo@805: } ingo@805: gernotbelger@9416: for (final ListGridRecord record : records) { gernotbelger@9416: this.list.removeData(record); ingo@805: } ingo@805: } ingo@805: felix@1443: /** Return 'separator'- menu-item. */ felix@1443: protected MenuItem createSeparator() { gernotbelger@9416: final MenuItem separator = new MenuItem(); felix@1443: separator.setIsSeparator(true); felix@1443: return separator; felix@1443: } ingo@805: felix@1443: /** felix@1443: * Get the context menu for a (right mouse button)click on a single item. felix@1443: */ ingo@1309: protected Menu getSingleContextMenu(final ListGridRecord[] records) { gernotbelger@9416: final Menu menu = new Menu(); ingo@1309: ingo@1309: menu.addItem(createActivateItem(records)); ingo@1309: menu.addItem(createDeactivateItem(records)); ingo@1309: menu.addItem(createRemoveItem(records)); felix@1443: menu.addItem(createSeparator()); ingo@1309: menu.addItem(createPropertiesItem(records)); ingo@1309: ingo@1309: return menu; ingo@1309: } ingo@1309: ingo@1309: protected Menu getMultiContextMenu(final ListGridRecord[] records) { gernotbelger@9416: final Menu menu = new Menu(); ingo@1309: ingo@1309: menu.addItem(createActivateItem(records)); ingo@1309: menu.addItem(createDeactivateItem(records)); ingo@1309: menu.addItem(createRemoveItem(records)); ingo@1309: ingo@1309: return menu; ingo@1309: } ingo@1309: felix@1453: /** The properties menu item (opens style editor on click). */ ingo@1309: protected MenuItem createPropertiesItem(final ListGridRecord[] records) { gernotbelger@9416: final MenuItem properties = new MenuItem(this.MSG.properties()); ingo@1309: ingo@1309: properties.addClickHandler(new ClickHandler() { christian@4184: @Override gernotbelger@9416: public void onClick(final MenuItemClickEvent evt) { ingo@1309: GWT.log("clicked properties"); gernotbelger@9416: for (final ListGridRecord record : records) { ingo@1309: openStyleEditor((FacetRecord) record); ingo@1309: } ingo@1309: } ingo@1309: }); ingo@1309: ingo@1309: return properties; ingo@1309: } ingo@1309: ingo@1309: protected MenuItem createActivateItem(final ListGridRecord[] records) { gernotbelger@9416: final MenuItem activate = new MenuItem(this.MSG.activateTheme()); ingo@1309: ingo@1309: activate.addClickHandler(new ClickHandler() { christian@4184: @Override gernotbelger@9416: public void onClick(final MenuItemClickEvent evt) { gernotbelger@9416: for (final ListGridRecord record : records) { gernotbelger@9416: final FacetRecord facet = (FacetRecord) record; ingo@1309: activateTheme(facet.getTheme(), true); ingo@1309: } ingo@1309: ingo@1309: updateCollection(); ingo@1309: } ingo@1309: }); ingo@1309: ingo@1309: return activate; ingo@1309: } ingo@1309: ingo@1309: protected MenuItem createDeactivateItem(final ListGridRecord[] records) { gernotbelger@9416: final MenuItem deactivate = new MenuItem(this.MSG.deactivateTheme()); ingo@1309: ingo@1309: deactivate.addClickHandler(new ClickHandler() { christian@4184: @Override gernotbelger@9416: public void onClick(final MenuItemClickEvent evt) { gernotbelger@9416: for (final ListGridRecord record : records) { gernotbelger@9416: final FacetRecord facet = (FacetRecord) record; ingo@1309: activateTheme(facet.getTheme(), false); ingo@1309: } ingo@1309: ingo@1309: updateCollection(); ingo@1309: } ingo@1309: }); ingo@1309: ingo@1309: return deactivate; ingo@1309: } ingo@1309: felix@2443: /** Remove given themes (not asking for confirmation). */ felix@2443: protected void removeThemes(final ListGridRecord[] records) { gernotbelger@9416: for (final ListGridRecord record : records) { gernotbelger@9416: final FacetRecord facet = (FacetRecord) record; gernotbelger@9416: final Theme theme = facet.getTheme(); felix@2443: theme.setVisible(0); felix@2443: theme.setActive(0); felix@2443: updateCollection(); felix@2443: } felix@2443: } felix@2443: felix@2443: /** Create menu item for removing theme(s). Will ask for confirmation. */ ingo@1309: protected MenuItem createRemoveItem(final ListGridRecord[] records) { gernotbelger@9416: final MenuItem remove = new MenuItem(this.MSG.removeTheme()); ingo@1309: ingo@1309: remove.addClickHandler(new ClickHandler() { christian@4184: @Override gernotbelger@9416: public void onClick(final MenuItemClickEvent evt) { gernotbelger@9416: SC.ask(ThemePanel.this.MSG.askThemeRemove(), new BooleanCallback() { ingo@1422: @Override gernotbelger@9416: public void execute(final Boolean value) { ingo@1422: if (value) { felix@2443: removeThemes(records); ingo@1422: } ingo@1422: } ingo@1422: }); ingo@1309: } ingo@1309: }); ingo@1309: ingo@1309: return remove; ingo@1309: } ingo@1309: ingo@805: /** ingo@805: * This method is called after a cell in the theme grid has been modified. ingo@805: * gernotbelger@9416: * @param event gernotbelger@9416: * The event that stores information about the modified record. ingo@805: */ ingo@805: @Override gernotbelger@9416: public void onEditComplete(final EditCompleteEvent event) { ingo@805: GWT.log("Edited record."); ingo@805: gernotbelger@9416: final int row = event.getRowNum(); gernotbelger@9416: final FacetRecord rec = (FacetRecord) this.list.getRecord(row); ingo@805: gernotbelger@9416: final Theme theme = rec.getTheme(); ingo@1331: ingo@1331: theme.setDescription(rec.getName()); ingo@1331: activateTheme(theme, rec.getActive()); ingo@805: ingo@805: updateCollection(); ingo@805: } ingo@805: ingo@1303: /** ingo@1303: * This method should be defined in subclasses that wants to listen to this ingo@1303: * event. ingo@1303: * gernotbelger@9416: * @param theme gernotbelger@9416: * The theme that is moved. gernotbelger@9416: * @param oldIdx gernotbelger@9416: * The index of the theme before it was moved. gernotbelger@9416: * @param newIdx gernotbelger@9416: * The index of the theme after it was moved. ingo@1303: */ gernotbelger@9416: protected void fireThemeMoved(final Theme theme, final int oldIdx, final int newIdx) { christian@4184: // Do nothing ingo@1303: } ingo@1303: ingo@805: @Override gernotbelger@9416: public void onMove(final OnMoveEvent event) { gernotbelger@9416: final int type = event.getType(); ingo@805: ingo@805: GWT.log("ThemePanel.onMove: " + type); ingo@805: gernotbelger@9416: final ListGridRecord[] records = this.list.getSelectedRecords(); ingo@805: ingo@805: if (records == null || records.length == 0) { ingo@805: GWT.log("ThemePanel.onMove: No records selected."); ingo@805: return; ingo@805: } ingo@805: ingo@805: switch (type) { gernotbelger@9416: case 0: gernotbelger@9416: moveRecordsTop(records); gernotbelger@9416: break; gernotbelger@9416: case 1: gernotbelger@9416: moveRecordsUp(records); gernotbelger@9416: break; gernotbelger@9416: case 2: gernotbelger@9416: moveRecordsDown(records); gernotbelger@9416: break; gernotbelger@9416: case 3: gernotbelger@9416: moveRecordsBottom(records); gernotbelger@9416: break; ingo@805: } ingo@805: ingo@805: updateCollection(); ingo@805: } ingo@805: ingo@805: /** ingo@805: * Moves the selected grid records (themes) to the top of the grid. ingo@805: * gernotbelger@9416: * @param records gernotbelger@9416: * The selected themes in the list. Null not permitted. ingo@805: */ gernotbelger@9416: protected void moveRecordsTop(final ListGridRecord[] records) { gernotbelger@9416: final ThemeList themeList = getThemeList(); ingo@805: ingo@805: int idx = 1; ingo@805: gernotbelger@9416: for (final ListGridRecord record : records) { gernotbelger@9416: final Theme theme = ((FacetRecord) record).getTheme(); ingo@1303: fireThemeMoved(theme, theme.getPosition(), idx); ingo@805: themeList.setThemePosition(theme, idx++); ingo@805: } ingo@805: ingo@805: updateGrid(); ingo@805: } ingo@805: ingo@805: /** ingo@805: * Moves the selected grid records (themes) one step up. ingo@805: * gernotbelger@9416: * @param records gernotbelger@9416: * The selected themes in the list. Null not permitted. ingo@805: */ gernotbelger@9416: protected void moveRecordsUp(final ListGridRecord[] records) { gernotbelger@9416: final ThemeList themeList = getThemeList(); ingo@805: gernotbelger@9416: final int[] newPos = new int[records.length]; ingo@805: gernotbelger@9416: for (int i = 0; i < records.length; i++) { gernotbelger@9416: final Theme theme = ((FacetRecord) records[i]).getTheme(); gernotbelger@9416: newPos[i] = theme.getPosition() - 1; ingo@805: } ingo@805: gernotbelger@9416: for (int i = 0; i < records.length; i++) { gernotbelger@9416: final Theme theme = ((FacetRecord) records[i]).getTheme(); ingo@1303: fireThemeMoved(theme, theme.getPosition(), newPos[i]); ingo@805: themeList.setThemePosition(theme, newPos[i]); ingo@805: } ingo@805: ingo@805: updateGrid(); ingo@805: } ingo@805: gernotbelger@9416: /** gernotbelger@9416: * Moves the selected grid records (themes) one step down. gernotbelger@9416: * gernotbelger@9416: * @param records gernotbelger@9416: * The selected themes in the list. Null not permitted. gernotbelger@9416: */ gernotbelger@9416: protected void moveRecordsDown(final ListGridRecord[] records) { gernotbelger@9416: final ThemeList themeList = getThemeList(); gernotbelger@9416: gernotbelger@9416: final int[] newPos = new int[records.length]; gernotbelger@9416: gernotbelger@9416: for (int i = records.length - 1; i >= 0; i--) { gernotbelger@9416: final Theme theme = ((FacetRecord) records[i]).getTheme(); gernotbelger@9416: newPos[i] = theme.getPosition() + 1; gernotbelger@9416: } gernotbelger@9416: gernotbelger@9416: for (int i = records.length - 1; i >= 0; i--) { gernotbelger@9416: final Theme theme = ((FacetRecord) records[i]).getTheme(); gernotbelger@9416: fireThemeMoved(theme, theme.getPosition(), newPos[i]); gernotbelger@9416: themeList.setThemePosition(theme, newPos[i]); gernotbelger@9416: } gernotbelger@9416: gernotbelger@9416: updateGrid(); gernotbelger@9416: } ingo@805: ingo@805: /** ingo@805: * Moves the selected grid records (themes) to the bottom of the grid. ingo@805: * gernotbelger@9416: * @param records gernotbelger@9416: * The selected themes in the list. Null not permitted. ingo@805: */ gernotbelger@9416: protected void moveRecordsBottom(final ListGridRecord[] records) { gernotbelger@9416: final ThemeList themeList = getThemeList(); ingo@805: ingo@805: int idx = themeList.getThemeCount(); ingo@805: gernotbelger@9416: for (int i = records.length - 1; i >= 0; i--) { gernotbelger@9416: final Theme theme = ((FacetRecord) records[i]).getTheme(); ingo@1303: fireThemeMoved(theme, theme.getPosition(), idx); ingo@805: themeList.setThemePosition(theme, idx--); ingo@805: } ingo@805: ingo@805: updateGrid(); ingo@805: } ingo@1309: ingo@1309: protected void openStyleEditor(final FacetRecord record) { gernotbelger@9416: final Config config = Config.getInstance(); gernotbelger@9416: final String locale = config.getLocale(); ingo@1309: gernotbelger@9416: final String artifact = record.getTheme().getArtifact(); gernotbelger@9416: gernotbelger@9416: this.itemAttributeService.getCollectionItemAttribute(this.getCollection(), artifact, locale, new AsyncCallback() { gernotbelger@9416: @Override gernotbelger@9416: public void onFailure(final Throwable caught) { gernotbelger@9416: SC.warn(ThemePanel.this.MSG.getString(caught.getMessage())); gernotbelger@9416: } gernotbelger@9416: gernotbelger@9416: @Override gernotbelger@9416: public void onSuccess(final CollectionItemAttribute cia) { gernotbelger@9416: GWT.log("Successfully loaded collectionitem attributes."); gernotbelger@9416: showStyleEditor(cia, record); gernotbelger@9416: } gernotbelger@9416: }); ingo@1309: } raimund@1336: gernotbelger@9416: protected void showStyleEditor(final CollectionItemAttribute cia, final FacetRecord record) { gernotbelger@9416: final StyleEditorWindow win = new StyleEditorWindow(getCollection(), cia, record); raimund@1336: win.setThemePanel(this); raimund@1338: win.centerInPage(); raimund@1336: win.show(); raimund@1336: } felix@1568: felix@1568: /** Get OutputMode of this Panel. */ felix@1568: public OutputMode getMode() { felix@1568: return this.mode; felix@1568: } gernotbelger@9416: gernotbelger@9416: public void updateThemes() { gernotbelger@9416: gernotbelger@9416: final ListGridRecord[] records = this.list.getRecords(); gernotbelger@9416: for (final ListGridRecord record : records) { gernotbelger@9416: final FacetRecord facetRecord = (FacetRecord) record; gernotbelger@9416: gernotbelger@9416: this.recordHandler.handle(facetRecord); gernotbelger@9416: } gernotbelger@9416: gernotbelger@9416: this.list.markForRedraw(); gernotbelger@9416: } gernotbelger@9416: }