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: }