# HG changeset patch # User gernotbelger # Date 1534429683 -7200 # Node ID 05405292a7ca99504615e74938b355062914943b # Parent 9744ce3c3853abdcd6b609957dfbd2f9f6c1eb3f Navigationtheme panel now shows themes of dWt and WQ charts grayed out, if the current station is outside the valid range of the theme. diff -r 9744ce3c3853 -r 05405292a7ca gwt-client/src/main/java/org/dive4elements/river/client/client/ui/IThemeRecordHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/IThemeRecordHandler.java Thu Aug 16 16:28:03 2018 +0200 @@ -0,0 +1,21 @@ +/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde + * Software engineering by + * Björnsen Beratende Ingenieure GmbH + * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt + * + * This file is Free Software under the GNU AGPL (>=v3) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ +package org.dive4elements.river.client.client.ui; + +import org.dive4elements.river.client.shared.model.FacetRecord; + +/** + * Implementors of this interface are allowed to manipulate the records of the theme panel. + * + * @author Gernot Belger + */ +public interface IThemeRecordHandler { + void handle(FacetRecord facetRecord); +} \ No newline at end of file diff -r 9744ce3c3853 -r 05405292a7ca gwt-client/src/main/java/org/dive4elements/river/client/client/ui/NoopThemeRecordHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/NoopThemeRecordHandler.java Thu Aug 16 16:28:03 2018 +0200 @@ -0,0 +1,25 @@ +/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde + * Software engineering by + * Björnsen Beratende Ingenieure GmbH + * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt + * + * This file is Free Software under the GNU AGPL (>=v3) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ +package org.dive4elements.river.client.client.ui; + +import org.dive4elements.river.client.shared.model.FacetRecord; + +/** + * Default implementation of {@link IThemeRecordHandler} that does nothing. + * + * @author Gernot Belger + */ +public final class NoopThemeRecordHandler implements IThemeRecordHandler { + + @Override + public void handle(final FacetRecord facetRecord) { + /* we do nothing */ + } +} \ No newline at end of file diff -r 9744ce3c3853 -r 05405292a7ca gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ThemePanel.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ThemePanel.java Thu Aug 16 16:27:53 2018 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ThemePanel.java Thu Aug 16 16:28:03 2018 +0200 @@ -8,22 +8,8 @@ package org.dive4elements.river.client.client.ui; -import com.google.gwt.core.client.GWT; -import com.google.gwt.user.client.rpc.AsyncCallback; - -import com.smartgwt.client.util.BooleanCallback; -import com.smartgwt.client.util.SC; -import com.smartgwt.client.widgets.Canvas; -import com.smartgwt.client.widgets.grid.ListGrid; -import com.smartgwt.client.widgets.grid.ListGridRecord; -import com.smartgwt.client.widgets.grid.events.EditCompleteEvent; -import com.smartgwt.client.widgets.grid.events.EditCompleteHandler; -import com.smartgwt.client.widgets.grid.events.RowContextClickEvent; -import com.smartgwt.client.widgets.grid.events.RowContextClickHandler; -import com.smartgwt.client.widgets.menu.Menu; -import com.smartgwt.client.widgets.menu.MenuItem; -import com.smartgwt.client.widgets.menu.events.ClickHandler; -import com.smartgwt.client.widgets.menu.events.MenuItemClickEvent; +import java.util.ArrayList; +import java.util.List; import org.dive4elements.river.client.client.Config; import org.dive4elements.river.client.client.FLYSConstants; @@ -47,8 +33,21 @@ import org.dive4elements.river.client.shared.model.Theme; import org.dive4elements.river.client.shared.model.ThemeList; -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.util.BooleanCallback; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.grid.ListGrid; +import com.smartgwt.client.widgets.grid.ListGridRecord; +import com.smartgwt.client.widgets.grid.events.EditCompleteEvent; +import com.smartgwt.client.widgets.grid.events.EditCompleteHandler; +import com.smartgwt.client.widgets.grid.events.RowContextClickEvent; +import com.smartgwt.client.widgets.grid.events.RowContextClickHandler; +import com.smartgwt.client.widgets.menu.Menu; +import com.smartgwt.client.widgets.menu.MenuItem; +import com.smartgwt.client.widgets.menu.events.ClickHandler; +import com.smartgwt.client.widgets.menu.events.MenuItemClickEvent; /** * ThemePanel on the left in CollectionView. @@ -57,67 +56,62 @@ * * @author Ingo Weinzierl */ -public abstract class ThemePanel -extends Canvas -implements OnMoveHandler, - EditCompleteHandler, - HasOutputParameterChangeHandlers, - HasRedrawRequestHandlers -{ - protected CollectionAttributeServiceAsync updater = - GWT.create(CollectionAttributeService.class); +public abstract class ThemePanel extends Canvas implements OnMoveHandler, EditCompleteHandler, HasOutputParameterChangeHandlers, HasRedrawRequestHandlers { + + private final CollectionAttributeServiceAsync updater = GWT.create(CollectionAttributeService.class); /** The service used to get collection item attributes. */ - protected CollectionItemAttributeServiceAsync itemAttributeService = - GWT.create(CollectionItemAttributeService.class); + private final CollectionItemAttributeServiceAsync itemAttributeService = GWT.create(CollectionItemAttributeService.class); /** i18ner. */ - protected FLYSConstants MSG = GWT.create(FLYSConstants.class); + protected final FLYSConstants MSG = GWT.create(FLYSConstants.class); /** List of OutParameterChangedHandler. */ - protected List outHandlers; + private final List outHandlers; /** List of ChartShallRedrawHandler. */ - protected List redrawRequestHandlers; - - protected OutputMode mode; + protected final List redrawRequestHandlers; - protected ThemeNavigationPanel navigation; - protected ListGrid list; + protected final OutputMode mode; - /** The collection view*/ + protected final ThemeNavigationPanel navigation; + + protected final ListGrid list; + + /** The collection view */ protected CollectionView view; + private final IThemeRecordHandler recordHandler; + /** * Setup Grid, navigation bar. - * @param collection Collection for which to show themes. + * + * @param collection + * Collection for which to show themes. */ - public ThemePanel( - OutputMode mode, - CollectionView view - ) { - this.mode = mode; - this.list = createGrid(); - this.view = view; - list.addRowContextClickHandler(new RowContextClickHandler() { + public ThemePanel(final OutputMode mode, final CollectionView view, final IThemeRecordHandler recordHandler) { + this.mode = mode; + this.recordHandler = recordHandler; + this.list = createGrid(); + this.view = view; + + this.list.addRowContextClickHandler(new RowContextClickHandler() { @Override - public void onRowContextClick(RowContextClickEvent event) { - ListGridRecord[] records = list.getSelectedRecords(); + public void onRowContextClick(final RowContextClickEvent event) { + final ListGridRecord[] records = ThemePanel.this.list.getSelectedRecords(); Menu menu = null; if (records == null || records.length == 0) { return; - } - else if (records.length == 1) { + } else if (records.length == 1) { menu = getSingleContextMenu(records); - } - else if (records.length > 1) { + } else if (records.length > 1) { menu = getMultiContextMenu(records); } if (menu != null) { - list.setContextMenu(menu); + ThemePanel.this.list.setContextMenu(menu); menu.showContextMenu(); event.cancel(); @@ -127,104 +121,98 @@ this.redrawRequestHandlers = new ArrayList(); this.outHandlers = new ArrayList(); - this.navigation = new ThemeNavigationPanel(); + this.navigation = new ThemeNavigationPanel(); this.navigation.addOnMoveHandler(this); this.setShowResizeBar(true); } - public abstract void activateTheme(Theme theme, boolean active); - /** * Replace the current collection with a new one. NOTE: this operation * triggers updateGrid() which modifies the themes in the grid. * - * @param collection The new collection object. + * @param collection + * The new collection object. */ - protected void setCollection(Collection collection) { + protected void setCollection(final Collection collection) { // Set collection of view, but do not trigger event shooting. this.view.setCollection(collection, true); updateGrid(); } - /** Get Collection. */ public Collection getCollection() { - return view.getCollection(); + return this.view.getCollection(); } - /** * Returns the ThemeList of the current collection and output mode. * * @return the current ThemeList. */ public ThemeList getThemeList() { - return getCollection().getThemeList(mode.getName()); + return getCollection().getThemeList(this.mode.getName()); } public ListGridRecord[] getSelectedRecords() { - return list.getSelectedRecords(); + return this.list.getSelectedRecords(); } /** * Registers a new OutputParameterChangeHandler. * - * @param h The new handler. + * @param h + * The new handler. */ @Override - public void addOutputParameterChangeHandler(OutputParameterChangeHandler h){ + public void addOutputParameterChangeHandler(final OutputParameterChangeHandler h) { if (h != null) { - outHandlers.add(h); + this.outHandlers.add(h); } } - /** * Registers a RedrawRequestHandler. * - * @param h The new handler. + * @param h + * The new handler. */ @Override - public void addRedrawRequestHandler(RedrawRequestHandler h){ + public void addRedrawRequestHandler(final RedrawRequestHandler h) { if (h != null) { - redrawRequestHandlers.add(h); + this.redrawRequestHandlers.add(h); } } - /** * Request a redraw of e.g. a Chart. */ final public void requestRedraw() { - for (RedrawRequestHandler handler: redrawRequestHandlers) { + for (final RedrawRequestHandler handler : this.redrawRequestHandlers) { handler.onRedrawRequest(new RedrawRequestEvent(Type.DEFAULT)); } } - /** * Called when the attribution of an output changed. It informs the * registered handlers about the changes. */ protected void fireOutputParameterChanged() { - OutputParameterChangeEvent evt = new OutputParameterChangeEvent(); + final OutputParameterChangeEvent evt = new OutputParameterChangeEvent(); - for (OutputParameterChangeHandler handler: outHandlers) { + for (final OutputParameterChangeHandler handler : this.outHandlers) { handler.onOutputParameterChanged(evt); } } - /** Registers the CollectionView associated to this ThemePanel. */ - public void setCollectionView(CollectionView view) { + public void setCollectionView(final CollectionView view) { this.view = view; } - /** * This method is used to clear the current theme grid and add new updated * data. @@ -232,21 +220,21 @@ protected void updateGrid() { GWT.log("ThemePanel.updateGrid"); - ListGridRecord[] selected = list.getSelectedRecords(); + final ListGridRecord[] selected = this.list.getSelectedRecords(); clearGrid(); - ThemeList themeList = getThemeList(); + final ThemeList themeList = getThemeList(); if (themeList == null) { GWT.log("ERROR: No theme list."); return; } - int count = themeList.getThemeCount(); + final int count = themeList.getThemeCount(); for (int i = 1; i <= count; i++) { - Theme theme = themeList.getThemeAt(i); + final Theme theme = themeList.getThemeAt(i); if (theme == null) { continue; @@ -260,41 +248,38 @@ continue; } - FacetRecord newRecord = createRecord(theme); + final FacetRecord newRecord = createRecord(theme); addFacetRecord(newRecord); - String newArtifact = theme.getArtifact(); - String newFacet = theme.getFacet(); - int newIndex = theme.getIndex(); + final String newArtifact = theme.getArtifact(); + final String newFacet = theme.getFacet(); + final int newIndex = theme.getIndex(); - for (ListGridRecord r: selected) { - FacetRecord sel = (FacetRecord) r; - Theme oldTheme = sel.getTheme(); + for (final ListGridRecord r : selected) { + final FacetRecord sel = (FacetRecord) r; + final Theme oldTheme = sel.getTheme(); - if (oldTheme.getArtifact().equals(newArtifact) - && oldTheme.getFacet().equals(newFacet) - && oldTheme.getIndex() == newIndex) { - list.selectRecord(newRecord); + if (oldTheme.getArtifact().equals(newArtifact) && oldTheme.getFacet().equals(newFacet) && oldTheme.getIndex() == newIndex) { + this.list.selectRecord(newRecord); } } } + updateThemes(); + fireOutputParameterChanged(); } - /** Adds given Record to the list (table). */ - protected void addFacetRecord(FacetRecord rec) { - list.addData(rec); + protected void addFacetRecord(final FacetRecord rec) { + this.list.addData(rec); } - /** Create a FacetRecord that wraps given theme. */ - protected FacetRecord createRecord(Theme theme) { + protected final FacetRecord createRecord(final Theme theme) { return new FacetRecord(theme); } - /** * This method triggers the CollectionAttributeService. Based on the current * collectin settings, the attribute of the collection is modified or not. @@ -303,25 +288,24 @@ */ public void updateCollection() { final Config config = Config.getInstance(); - final String loc = config.getLocale(); + final String loc = config.getLocale(); GWT.log("ThemePanel.updateCollection via RPC now"); // Don't forget to enable the panel after the request has finished! disable(); - updater.update(getCollection(), loc, new AsyncCallback() { + this.updater.update(getCollection(), loc, new AsyncCallback() { @Override - public void onFailure(Throwable caught) { + public void onFailure(final Throwable caught) { GWT.log("Could not update collection attributes."); - SC.warn(MSG.getString(caught.getMessage())); + SC.warn(ThemePanel.this.MSG.getString(caught.getMessage())); enable(); } - @Override - public void onSuccess(Collection collection) { + public void onSuccess(final Collection collection) { setCollection(collection); enable(); @@ -329,51 +313,43 @@ }); } - /** * Create and configure the Grid to display. */ protected ListGrid createGrid() { - ListGrid grid = createNewGrid(); + final ListGrid grid = new ListGrid(); grid.setLeaveScrollbarGap(false); return grid; } - - protected ListGrid createNewGrid() { - return new ListGrid(); - } - - /** * A method that removes all records from theme grid. */ protected void clearGrid() { - ListGridRecord[] records = list.getRecords(); + final ListGridRecord[] records = this.list.getRecords(); if (records == null || records.length == 0) { return; } - for (ListGridRecord record: records) { - list.removeData(record); + for (final ListGridRecord record : records) { + this.list.removeData(record); } } /** Return 'separator'- menu-item. */ protected MenuItem createSeparator() { - MenuItem separator = new MenuItem(); + final MenuItem separator = new MenuItem(); separator.setIsSeparator(true); return separator; } - /** * Get the context menu for a (right mouse button)click on a single item. */ protected Menu getSingleContextMenu(final ListGridRecord[] records) { - Menu menu = new Menu(); + final Menu menu = new Menu(); menu.addItem(createActivateItem(records)); menu.addItem(createDeactivateItem(records)); @@ -384,9 +360,8 @@ return menu; } - protected Menu getMultiContextMenu(final ListGridRecord[] records) { - Menu menu = new Menu(); + final Menu menu = new Menu(); menu.addItem(createActivateItem(records)); menu.addItem(createDeactivateItem(records)); @@ -395,16 +370,15 @@ return menu; } - /** The properties menu item (opens style editor on click). */ protected MenuItem createPropertiesItem(final ListGridRecord[] records) { - MenuItem properties = new MenuItem(MSG.properties()); + final MenuItem properties = new MenuItem(this.MSG.properties()); properties.addClickHandler(new ClickHandler() { @Override - public void onClick(MenuItemClickEvent evt) { + public void onClick(final MenuItemClickEvent evt) { GWT.log("clicked properties"); - for (ListGridRecord record: records) { + for (final ListGridRecord record : records) { openStyleEditor((FacetRecord) record); } } @@ -413,15 +387,14 @@ return properties; } - protected MenuItem createActivateItem(final ListGridRecord[] records) { - MenuItem activate = new MenuItem(MSG.activateTheme()); + final MenuItem activate = new MenuItem(this.MSG.activateTheme()); activate.addClickHandler(new ClickHandler() { @Override - public void onClick(MenuItemClickEvent evt) { - for (ListGridRecord record: records) { - FacetRecord facet = (FacetRecord) record; + public void onClick(final MenuItemClickEvent evt) { + for (final ListGridRecord record : records) { + final FacetRecord facet = (FacetRecord) record; activateTheme(facet.getTheme(), true); } @@ -432,15 +405,14 @@ return activate; } - protected MenuItem createDeactivateItem(final ListGridRecord[] records) { - MenuItem deactivate = new MenuItem(MSG.deactivateTheme()); + final MenuItem deactivate = new MenuItem(this.MSG.deactivateTheme()); deactivate.addClickHandler(new ClickHandler() { @Override - public void onClick(MenuItemClickEvent evt) { - for (ListGridRecord record: records) { - FacetRecord facet = (FacetRecord) record; + public void onClick(final MenuItemClickEvent evt) { + for (final ListGridRecord record : records) { + final FacetRecord facet = (FacetRecord) record; activateTheme(facet.getTheme(), false); } @@ -451,29 +423,27 @@ return deactivate; } - /** Remove given themes (not asking for confirmation). */ protected void removeThemes(final ListGridRecord[] records) { - for (ListGridRecord record: records) { - FacetRecord facet = (FacetRecord) record; - Theme theme = facet.getTheme(); + for (final ListGridRecord record : records) { + final FacetRecord facet = (FacetRecord) record; + final Theme theme = facet.getTheme(); theme.setVisible(0); theme.setActive(0); updateCollection(); } } - /** Create menu item for removing theme(s). Will ask for confirmation. */ protected MenuItem createRemoveItem(final ListGridRecord[] records) { - MenuItem remove = new MenuItem(MSG.removeTheme()); + final MenuItem remove = new MenuItem(this.MSG.removeTheme()); remove.addClickHandler(new ClickHandler() { @Override - public void onClick(MenuItemClickEvent evt) { - SC.ask(MSG.askThemeRemove(), new BooleanCallback() { + public void onClick(final MenuItemClickEvent evt) { + SC.ask(ThemePanel.this.MSG.askThemeRemove(), new BooleanCallback() { @Override - public void execute(Boolean value) { + public void execute(final Boolean value) { if (value) { removeThemes(records); } @@ -485,20 +455,20 @@ return remove; } - /** * 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. + * @param event + * The event that stores information about the modified record. */ @Override - public void onEditComplete(EditCompleteEvent event) { + public void onEditComplete(final EditCompleteEvent event) { GWT.log("Edited record."); - int row = event.getRowNum(); - FacetRecord rec = (FacetRecord) list.getRecord(row); + final int row = event.getRowNum(); + final FacetRecord rec = (FacetRecord) this.list.getRecord(row); - Theme theme = rec.getTheme(); + final Theme theme = rec.getTheme(); theme.setDescription(rec.getName()); activateTheme(theme, rec.getActive()); @@ -506,27 +476,28 @@ updateCollection(); } - /** * This method should be defined in subclasses that wants to listen to this * event. * - * @param theme The theme that is moved. - * @param oldIdx The index of the theme before it was moved. - * @param newIdx The index of the theme after it was moved. + * @param theme + * The theme that is moved. + * @param oldIdx + * The index of the theme before it was moved. + * @param newIdx + * The index of the theme after it was moved. */ - protected void fireThemeMoved(Theme theme, int oldIdx, int newIdx) { + protected void fireThemeMoved(final Theme theme, final int oldIdx, final int newIdx) { // Do nothing } - @Override - public void onMove(OnMoveEvent event) { - int type = event.getType(); + public void onMove(final OnMoveEvent event) { + final int type = event.getType(); GWT.log("ThemePanel.onMove: " + type); - ListGridRecord[] records = list.getSelectedRecords(); + final ListGridRecord[] records = this.list.getSelectedRecords(); if (records == null || records.length == 0) { GWT.log("ThemePanel.onMove: No records selected."); @@ -534,28 +505,36 @@ } switch (type) { - case 0: moveRecordsTop(records); break; - case 1: moveRecordsUp(records); break; - case 2: moveRecordsDown(records); break; - case 3: moveRecordsBottom(records); break; + 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. + * @param records + * The selected themes in the list. Null not permitted. */ - protected void moveRecordsTop(ListGridRecord[] records) { - ThemeList themeList = getThemeList(); + protected void moveRecordsTop(final ListGridRecord[] records) { + final ThemeList themeList = getThemeList(); int idx = 1; - for (ListGridRecord record: records) { - Theme theme = ((FacetRecord) record).getTheme(); + for (final ListGridRecord record : records) { + final Theme theme = ((FacetRecord) record).getTheme(); fireThemeMoved(theme, theme.getPosition(), idx); themeList.setThemePosition(theme, idx++); } @@ -563,49 +542,24 @@ updateGrid(); } - /** * Moves the selected grid records (themes) one step up. * - * @param records The selected themes in the list. Null not permitted. + * @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]; + protected void moveRecordsUp(final ListGridRecord[] records) { + final ThemeList themeList = getThemeList(); - for (int i = 0; i < records.length ; i++) { - Theme theme = ((FacetRecord) records[i]).getTheme(); - newPos[i] = theme.getPosition() - 1; - } + final int[] newPos = new int[records.length]; - for (int i = 0; i < records.length ; i++) { - Theme theme = ((FacetRecord) records[i]).getTheme(); - fireThemeMoved(theme, theme.getPosition(), newPos[i]); - themeList.setThemePosition(theme, newPos[i]); + for (int i = 0; i < records.length; i++) { + final Theme theme = ((FacetRecord) records[i]).getTheme(); + newPos[i] = theme.getPosition() - 1; } - 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(); + for (int i = 0; i < records.length; i++) { + final Theme theme = ((FacetRecord) records[i]).getTheme(); fireThemeMoved(theme, theme.getPosition(), newPos[i]); themeList.setThemePosition(theme, newPos[i]); } @@ -613,19 +567,44 @@ updateGrid(); } + /** + * Moves the selected grid records (themes) one step down. + * + * @param records + * The selected themes in the list. Null not permitted. + */ + protected void moveRecordsDown(final ListGridRecord[] records) { + final ThemeList themeList = getThemeList(); + + final int[] newPos = new int[records.length]; + + for (int i = records.length - 1; i >= 0; i--) { + final Theme theme = ((FacetRecord) records[i]).getTheme(); + newPos[i] = theme.getPosition() + 1; + } + + for (int i = records.length - 1; i >= 0; i--) { + final Theme theme = ((FacetRecord) records[i]).getTheme(); + fireThemeMoved(theme, theme.getPosition(), newPos[i]); + 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. + * @param records + * The selected themes in the list. Null not permitted. */ - protected void moveRecordsBottom(ListGridRecord[] records) { - ThemeList themeList = getThemeList(); + protected void moveRecordsBottom(final ListGridRecord[] records) { + final ThemeList themeList = getThemeList(); int idx = themeList.getThemeCount(); - for (int i = records.length-1; i >= 0; i--) { - Theme theme = ((FacetRecord) records[i]).getTheme(); + for (int i = records.length - 1; i >= 0; i--) { + final Theme theme = ((FacetRecord) records[i]).getTheme(); fireThemeMoved(theme, theme.getPosition(), idx); themeList.setThemePosition(theme, idx--); } @@ -633,48 +612,47 @@ updateGrid(); } - protected void openStyleEditor(final FacetRecord record) { - Config config = Config.getInstance(); - String locale = config.getLocale(); - - String artifact = record.getTheme().getArtifact(); + final Config config = Config.getInstance(); + final String locale = config.getLocale(); - itemAttributeService.getCollectionItemAttribute( - this.getCollection(), - artifact, - locale, - new AsyncCallback() { - @Override - public void onFailure (Throwable caught) { - SC.warn(MSG.getString(caught.getMessage())); - } - @Override - public void onSuccess(CollectionItemAttribute cia) { - GWT.log("Successfully loaded collectionitem attributes."); - showStyleEditor(cia, record); - } - }); + final String artifact = record.getTheme().getArtifact(); + + this.itemAttributeService.getCollectionItemAttribute(this.getCollection(), artifact, locale, new AsyncCallback() { + @Override + public void onFailure(final Throwable caught) { + SC.warn(ThemePanel.this.MSG.getString(caught.getMessage())); + } + + @Override + public void onSuccess(final CollectionItemAttribute cia) { + GWT.log("Successfully loaded collectionitem attributes."); + showStyleEditor(cia, record); + } + }); } - - protected void showStyleEditor( - CollectionItemAttribute cia, - FacetRecord record) - { - StyleEditorWindow win = new StyleEditorWindow( - getCollection(), - cia, - record); + protected void showStyleEditor(final CollectionItemAttribute cia, final FacetRecord record) { + final StyleEditorWindow win = new StyleEditorWindow(getCollection(), cia, record); win.setThemePanel(this); win.centerInPage(); win.show(); } - /** Get OutputMode of this Panel. */ public OutputMode getMode() { return this.mode; } -} -// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : + + public void updateThemes() { + + final ListGridRecord[] records = this.list.getRecords(); + for (final ListGridRecord record : records) { + final FacetRecord facetRecord = (FacetRecord) record; + + this.recordHandler.handle(facetRecord); + } + + this.list.markForRedraw(); + } +} \ No newline at end of file diff -r 9744ce3c3853 -r 05405292a7ca gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ChartOutputTab.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ChartOutputTab.java Thu Aug 16 16:27:53 2018 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ChartOutputTab.java Thu Aug 16 16:28:03 2018 +0200 @@ -31,6 +31,8 @@ import org.dive4elements.river.client.client.services.ChartInfoService; import org.dive4elements.river.client.client.services.ChartInfoServiceAsync; import org.dive4elements.river.client.client.ui.CollectionView; +import org.dive4elements.river.client.client.ui.IThemeRecordHandler; +import org.dive4elements.river.client.client.ui.NoopThemeRecordHandler; import org.dive4elements.river.client.client.ui.OutputTab; import org.dive4elements.river.client.shared.Transform2D; import org.dive4elements.river.client.shared.model.Axis; @@ -74,9 +76,6 @@ * coordinates. */ protected Transform2D[] transformer; - /** The collection view.*/ - protected CollectionView view; - /** The ThemePanel to expose control over themes (facettes). */ protected ChartThemePanel ctp; @@ -107,16 +106,17 @@ * @param collection The Collection which this chart belongs to. * @param mode The OutputMode. * @param collectionView The shown collection. + * @param recordHandler */ public ChartOutputTab( String title, Collection collection, OutputMode mode, - CollectionView collectionView + CollectionView collectionView, + IThemeRecordHandler recordHandler ){ super(title, collection, collectionView, mode); - view = collectionView; left = new Canvas(); right = new Canvas(); xrange = new int[2]; @@ -143,7 +143,7 @@ hLayout.addMember(left); hLayout.addMember(right); - ctp = createThemePanel(mode, collectionView); + ctp = createThemePanel(mode, collectionView, recordHandler); if (ctp != null) { ctp.addRedrawRequestHandler(this); ctp.addOutputParameterChangeHandler(this); @@ -170,17 +170,13 @@ } - public ChartThemePanel createThemePanel( - OutputMode mode, CollectionView view - ) { + public ChartThemePanel createThemePanel( OutputMode mode, CollectionView view, IThemeRecordHandler recordHandler ) { // Output "cross_section" needs slightly modified ThemePanel // (with action buttons). - if (mode.getName().equals("cross_section")) { - return new CrossSectionChartThemePanel(mode, view); - } - else { - return new ChartThemePanel(mode, view); - } + if (mode.getName().equals("cross_section")) + return new CrossSectionChartThemePanel(mode, view, recordHandler); + + return new ChartThemePanel(mode, view, recordHandler); } @@ -482,7 +478,7 @@ String locale = config.getLocale(); info.getChartInfo( - view.getCollection(), + getCollectionView().getCollection(), locale, mode.getName(), getChartAttributes(), @@ -506,8 +502,11 @@ chart.setSrc(getImgUrl(w, h)); } - - + + protected final void updateThemePanel() { + ctp.updateThemes(); + } + /** * Returns the existing chart panel. * @@ -709,13 +708,6 @@ return zoom; } - - /** Return the 'parent' CollectionView. */ - public CollectionView getView() { - return this.view; - } - - public static Number subtract(Number left, Number right) { if (left instanceof Double) { return new Double(left.doubleValue() - right.doubleValue()); diff -r 9744ce3c3853 -r 05405292a7ca gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ChartThemePanel.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ChartThemePanel.java Thu Aug 16 16:27:53 2018 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ChartThemePanel.java Thu Aug 16 16:28:03 2018 +0200 @@ -8,25 +8,12 @@ package org.dive4elements.river.client.client.ui.chart; -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.grid.ListGridField; -import com.smartgwt.client.widgets.grid.ListGridRecord; -import com.smartgwt.client.widgets.layout.VLayout; -import com.smartgwt.client.widgets.menu.Menu; -import com.smartgwt.client.widgets.menu.MenuItem; -import com.smartgwt.client.widgets.menu.events.ClickHandler; -import com.smartgwt.client.widgets.menu.events.MenuItemClickEvent; - import org.dive4elements.river.client.client.Config; -import org.dive4elements.river.client.client.FLYSConstants; import org.dive4elements.river.client.client.services.FeedServiceAsync; import org.dive4elements.river.client.client.services.LoadArtifactService; import org.dive4elements.river.client.client.services.LoadArtifactServiceAsync; import org.dive4elements.river.client.client.ui.CollectionView; +import org.dive4elements.river.client.client.ui.IThemeRecordHandler; import org.dive4elements.river.client.client.ui.ThemePanel; import org.dive4elements.river.client.shared.model.Artifact; import org.dive4elements.river.client.shared.model.Data; @@ -38,6 +25,18 @@ import org.dive4elements.river.client.shared.model.Theme; import org.dive4elements.river.client.shared.model.ThemeList; +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.grid.CellFormatter; +import com.smartgwt.client.widgets.grid.ListGridField; +import com.smartgwt.client.widgets.grid.ListGridRecord; +import com.smartgwt.client.widgets.layout.VLayout; +import com.smartgwt.client.widgets.menu.Menu; +import com.smartgwt.client.widgets.menu.MenuItem; +import com.smartgwt.client.widgets.menu.events.ClickHandler; +import com.smartgwt.client.widgets.menu.events.MenuItemClickEvent; /** * ThemePanel on the left in CollectionView. @@ -48,348 +47,272 @@ */ public class ChartThemePanel extends ThemePanel { /** Artifact Clone/Creation service. */ - protected LoadArtifactServiceAsync loadService = - GWT.create(LoadArtifactService.class); - - /** The interface that provides i18n messages. */ - protected FLYSConstants MSG = GWT.create(FLYSConstants.class); - - public static final String GRID_FIELD_ACTIVE = "active"; - public static final String GRID_FIELD_NAME = "name"; - public static final String GRID_FIELD_ACTIONS = "actions"; + private final LoadArtifactServiceAsync loadService = GWT.create(LoadArtifactService.class); - FeedServiceAsync feedService = GWT.create( - org.dive4elements.river.client.client.services.FeedService.class); - + protected static final String GRID_FIELD_ACTIVE = "active"; + protected static final String GRID_FIELD_NAME = "name"; + protected static final String GRID_FIELD_ACTIONS = "actions"; - /** Constructor for a ChartThemePanel. */ - public ChartThemePanel( - OutputMode mode, - CollectionView view - ) { - super(mode, view); + protected final FeedServiceAsync feedService = GWT.create(org.dive4elements.river.client.client.services.FeedService.class); - initGrid(); + /** Constructor for a ChartThemePanel. + * @param recordHandler */ + public ChartThemePanel(final OutputMode mode, final CollectionView view, final IThemeRecordHandler recordHandler) { + super(mode, view, recordHandler); + + initGrid(recordHandler); initLayout(); updateGrid(); } - /** Creates Layout with theme list and navigation bar inside. */ protected VLayout createLayout() { - VLayout layout = new VLayout(); + final VLayout layout = new VLayout(); layout.setWidth100(); layout.setHeight100(); - layout.addMember(list); - layout.addMember(navigation); + layout.addMember(this.list); + layout.addMember(this.navigation); return layout; } - /** * Initializes the layout of this panel. */ - protected void initLayout() { + private void initLayout() { setWidth100(); setHeight100(); addChild(createLayout()); } - /** * Initializes the components (columns) of the theme grid. + * @param recordHandler */ - 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(); + protected void initGrid( final IThemeRecordHandler recordHandler ) { + this.list.setCanEdit(true); + this.list.setCanSort(false); + this.list.setShowRecordComponents(false); + this.list.setShowRecordComponentsByCell(true); + this.list.setShowHeader(true); + this.list.setShowHeaderContextMenu(false); + this.list.setWidth100(); + this.list.setHeight100(); - list.addEditCompleteHandler(this); + this.list.addEditCompleteHandler(this); - ListGridField active = new ListGridField(GRID_FIELD_ACTIVE, " ", 20); + final ListGridField active = new ListGridField(GRID_FIELD_ACTIVE, " ", 20); active.setType(ListGridFieldType.BOOLEAN); - ListGridField name = new ListGridField( - GRID_FIELD_NAME, MSG.chart_themepanel_header_themes()); + final ListGridField name = new ListGridField(GRID_FIELD_NAME, this.MSG.chart_themepanel_header_themes()); name.setType(ListGridFieldType.TEXT); - list.setFields(active, name); + if( recordHandler instanceof CellFormatter) + name.setCellFormatter((CellFormatter) recordHandler); + + this.list.setFields(active, name); } - /** Set theme active/inactive. */ @Override - public void activateTheme(Theme theme, boolean active) { + public void activateTheme(final Theme theme, final boolean active) { theme.setActive(active ? 1 : 0); } - /** Returns name of longitudinal section area facets. */ protected String getAreaFacetName() { return "longitudinal_section.area"; } - /** Create the DataProvider ('Blackboard') key for a theme. */ - public static String areaKey(Theme theme) { - return theme.getArtifact() + ":" + theme.getFacet() + ":" - + theme.getIndex(); + public static String areaKey(final Theme theme) { + return theme.getArtifact() + ":" + theme.getFacet() + ":" + theme.getIndex(); } - /** * Tell an area artifact where to get the upper and lower curve from. - * @param artifact UUID of area-artifact. + * + * @param artifact + * UUID of area-artifact. */ - public void feedTellArea( - final String artifact, - Theme under, - Theme over, - boolean between - ) { + public void feedTellArea(final String artifact, final Theme under, final Theme over, final boolean between) { Data[] feedData; if (over != null && under != null) { - feedData = new Data[] { - DefaultData.createSimpleStringData("area.curve_under", - areaKey(under)), - DefaultData.createSimpleStringData("area.curve_over", - areaKey(over)), - DefaultData.createSimpleStringData("area.name", - over.getDescription() + " / " + under.getDescription()), - DefaultData.createSimpleStringData("area.facet", - getAreaFacetName()), - DefaultData.createSimpleStringData("area.between", - (between)? "true" : "false") - }; + feedData = new Data[] { DefaultData.createSimpleStringData("area.curve_under", areaKey(under)), + DefaultData.createSimpleStringData("area.curve_over", areaKey(over)), + DefaultData.createSimpleStringData("area.name", over.getDescription() + " / " + under.getDescription()), + DefaultData.createSimpleStringData("area.facet", getAreaFacetName()), + DefaultData.createSimpleStringData("area.between", (between) ? "true" : "false") }; GWT.log("Have 'over' and 'under' curve"); - } - else if (over == null && under != null) { - feedData = new Data[] { - DefaultData.createSimpleStringData("area.curve_under", - areaKey(under)), - DefaultData.createSimpleStringData("area.name", - under.getDescription() + " / " + MSG.getString("x_axis")), - DefaultData.createSimpleStringData("area.facet", - getAreaFacetName()), - DefaultData.createSimpleStringData("area.between", - (between)? "true" : "false") - }; + } else if (over == null && under != null) { + feedData = new Data[] { DefaultData.createSimpleStringData("area.curve_under", areaKey(under)), + DefaultData.createSimpleStringData("area.name", under.getDescription() + " / " + this.MSG.getString("x_axis")), + DefaultData.createSimpleStringData("area.facet", getAreaFacetName()), + DefaultData.createSimpleStringData("area.between", (between) ? "true" : "false") }; GWT.log("Have 'under' curve only"); - } - else if (over != null && under == null) { - feedData = new Data[] { - DefaultData.createSimpleStringData("area.curve_over", - areaKey(over)), - DefaultData.createSimpleStringData("area.name", - MSG.getString("x_axis") + " / " + over.getDescription()), - DefaultData.createSimpleStringData("area.facet", - getAreaFacetName()), - DefaultData.createSimpleStringData("area.between", - (between)? "true" : "false") - }; + } else if (over != null && under == null) { + feedData = new Data[] { DefaultData.createSimpleStringData("area.curve_over", areaKey(over)), + DefaultData.createSimpleStringData("area.name", this.MSG.getString("x_axis") + " / " + over.getDescription()), + DefaultData.createSimpleStringData("area.facet", getAreaFacetName()), + DefaultData.createSimpleStringData("area.between", (between) ? "true" : "false") }; GWT.log("Have 'over' curve only"); - } - else { + } else { GWT.log("Missing Data for area painting."); return; } - feedService.feed( - Config.getInstance().getLocale(), - new DefaultArtifact(artifact, "TODO:hash"), - feedData, - new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - GWT.log("Could not feed artifact (" + artifact - + ") with area info: " + caught.getMessage()); - SC.warn(MSG.getString(caught.getMessage())); - enable(); - } - @Override - public void onSuccess(Artifact fartifact) { - GWT.log("Successfully set area params to " + artifact); - requestRedraw(); - updateCollection(); - updateGrid(); - enable(); - } - }); + this.feedService.feed(Config.getInstance().getLocale(), new DefaultArtifact(artifact, "TODO:hash"), feedData, new AsyncCallback() { + @Override + public void onFailure(final Throwable caught) { + GWT.log("Could not feed artifact (" + artifact + ") with area info: " + caught.getMessage()); + SC.warn(ChartThemePanel.this.MSG.getString(caught.getMessage())); + enable(); + } + + @Override + public void onSuccess(final Artifact fartifact) { + GWT.log("Successfully set area params to " + artifact); + requestRedraw(); + updateCollection(); + updateGrid(); + enable(); + } + }); } - /** * Create and parameterize a new area artifact. + * * @param under - * @param over if null, against axis. - * @param between if true, ignore under/over order. + * @param over + * if null, against axis. + * @param between + * if true, ignore under/over order. */ - public void createAreaArtifact( - final Theme over, - final Theme under, - final boolean between - ) { - Config config = Config.getInstance(); - String locale = config.getLocale(); + public void createAreaArtifact(final Theme over, final Theme under, final boolean between) { + final Config config = Config.getInstance(); + final String locale = config.getLocale(); - Recommendation area = new Recommendation( - "area", - "", - "", - null); + final Recommendation area = new Recommendation("area", "", "", null); // Set target out dynamically. area.setTargetOut(getMode().getName()); - Recommendation[] recommendations = new Recommendation[] {area}; + final Recommendation[] recommendations = new Recommendation[] { area }; - loadService.loadMany( - this.getCollection(), - recommendations, - null, //use individual factories. - locale, - new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - GWT.log("Failed, no area artifact: " + caught.getMessage()); - enable(); - // TODO i18n - SC.warn("Failed, no area artifact: " + caught.getMessage()); - } - @Override - public void onSuccess(Artifact[] artifacts) { - GWT.log("Success, created area artifact: " - + artifacts[0].getUuid()); - // Now, feed the artifact with the relevant data. - feedTellArea(artifacts[0].getUuid(), under, over, between); - } - } - ); + this.loadService.loadMany(this.getCollection(), recommendations, null, // use individual factories. + locale, new AsyncCallback() { + @Override + public void onFailure(final Throwable caught) { + GWT.log("Failed, no area artifact: " + caught.getMessage()); + enable(); + // TODO i18n + SC.warn("Failed, no area artifact: " + caught.getMessage()); + } + + @Override + public void onSuccess(final Artifact[] artifacts) { + GWT.log("Success, created area artifact: " + artifacts[0].getUuid()); + // Now, feed the artifact with the relevant data. + feedTellArea(artifacts[0].getUuid(), under, over, between); + } + }); } - /** * Return true if two themes are canditates for an area being * rendered between them. * TODO join with canArea, generalize to allow easier modification - * in subclasses. + * in subclasses. */ - protected boolean areAreaCompatible(Theme a, Theme b) { + protected boolean areAreaCompatible(final Theme a, final Theme b) { if (a.equals(b)) { return false; } - if (a.getFacet().equals("w_differences") && - b.getFacet().equals("w_differences")) { + if (a.getFacet().equals("w_differences") && b.getFacet().equals("w_differences")) { return true; } - if (a.getFacet().equals("longitudinal_section.w") || - a.getFacet().equals("other.wqkms.w") || - a.getFacet().equals("other.wqkms") || - a.getFacet().equals("discharge_longitudinal_section.w") || - a.getFacet().equals("discharge_longitudinal_section.c") || - a.getFacet().equals("other.wkms")) { - return b.getFacet().equals("longitudinal_section.w") - || b.getFacet().equals("other.wqkms") - || b.getFacet().equals("other.wqkms.w") - || b.getFacet().equals("discharge_longitudinal_section.w") - || b.getFacet().equals("discharge_longitudinal_section.c") - || b.getFacet().equals("other.wkms"); - } - else if (a.getFacet().equals("longitudinal_section.q") || - a.getFacet().equals("discharge_longitudinal_section.q") || - a.getFacet().equals("other.wqkms.q")) { - return b.getFacet().equals("longitudinal_section.q") - || b.getFacet().equals("discharge_longitudinal_section.q") + if (a.getFacet().equals("longitudinal_section.w") || a.getFacet().equals("other.wqkms.w") || a.getFacet().equals("other.wqkms") + || a.getFacet().equals("discharge_longitudinal_section.w") || a.getFacet().equals("discharge_longitudinal_section.c") + || a.getFacet().equals("other.wkms")) { + return b.getFacet().equals("longitudinal_section.w") || b.getFacet().equals("other.wqkms") || b.getFacet().equals("other.wqkms.w") + || b.getFacet().equals("discharge_longitudinal_section.w") || b.getFacet().equals("discharge_longitudinal_section.c") + || b.getFacet().equals("other.wkms"); + } else if (a.getFacet().equals("longitudinal_section.q") || a.getFacet().equals("discharge_longitudinal_section.q") + || a.getFacet().equals("other.wqkms.q")) { + return b.getFacet().equals("longitudinal_section.q") || b.getFacet().equals("discharge_longitudinal_section.q") || b.getFacet().equals("other.wqkms.q"); } return false; } - /** * True if context menu should contain 'create area' submenu on * this theme. */ - protected boolean canArea(Theme a) { - return a.getFacet().equals("longitudinal_section.q") - || a.getFacet().equals("longitudinal_section.w") - || a.getFacet().equals("discharge_longitudinal_section.w") - || a.getFacet().equals("discharge_longitudinal_section.q") - || a.getFacet().equals("discharge_longitudinal_section.c") - || a.getFacet().startsWith("other.wqkms") - || a.getFacet().equals("other.wkms") - || a.getFacet().equals("w_differences"); + protected boolean canArea(final Theme a) { + return a.getFacet().equals("longitudinal_section.q") || a.getFacet().equals("longitudinal_section.w") + || a.getFacet().equals("discharge_longitudinal_section.w") || a.getFacet().equals("discharge_longitudinal_section.q") + || a.getFacet().equals("discharge_longitudinal_section.c") || a.getFacet().startsWith("other.wqkms") || a.getFacet().equals("other.wkms") + || a.getFacet().equals("w_differences"); } - /** Attach menu/item to open editor for Manual Points. */ - protected void attachManualPointsMenu(Menu menu) { + protected void attachManualPointsMenu(final Menu menu) { menu.addItem(createSeparator()); - MenuItem editManualPoints = new MenuItem(MSG.editpoints()); + final MenuItem editManualPoints = new MenuItem(this.MSG.editpoints()); editManualPoints.addClickHandler(new ClickHandler() { - @Override - public void onClick(MenuItemClickEvent evt) { - if(mode.getName().equals("historical_discharge")) { - new ManualDatePointsEditor(view.getCollection(), - redrawRequestHandlers.get(0), - mode.getName()).show(); - } - else { - new ManualPointsEditor(view.getCollection(), - redrawRequestHandlers.get(0), - mode.getName()).show(); - } + @Override + public void onClick(final MenuItemClickEvent evt) { + if (ChartThemePanel.this.mode.getName().equals("historical_discharge")) { + new ManualDatePointsEditor(ChartThemePanel.this.view.getCollection(), ChartThemePanel.this.redrawRequestHandlers.get(0), + ChartThemePanel.this.mode.getName()).show(); + } else { + new ManualPointsEditor(ChartThemePanel.this.view.getCollection(), ChartThemePanel.this.redrawRequestHandlers.get(0), + ChartThemePanel.this.mode.getName()).show(); } - }); + } + }); menu.addItem(editManualPoints); } - /** * Include area specific menu items and manual point editor, depending * on facet. */ @Override protected Menu getSingleContextMenu(final ListGridRecord[] records) { - Menu menu = super.getSingleContextMenu(records); + final Menu menu = super.getSingleContextMenu(records); - final Theme facetTheme = ((FacetRecord)records[0]).getTheme(); + final Theme facetTheme = ((FacetRecord) records[0]).getTheme(); if (!canArea(facetTheme)) { if (facetTheme.getFacet().endsWith("manualpoints")) { attachManualPointsMenu(menu); return menu; - } - else { + } else { return menu; } } menu.addItem(createSeparator()); - MenuItem areaMenuItem = new MenuItem(MSG.chart_themepanel_new_area()); - Menu areaMenu = new Menu(); + final MenuItem areaMenuItem = new MenuItem(this.MSG.chart_themepanel_new_area()); + final Menu areaMenu = new Menu(); - ThemeList themes = getThemeList(); - int nThemes = themes.getThemeCount(); + final ThemeList themes = getThemeList(); + final int nThemes = themes.getThemeCount(); // Create the "under..." submenu. - MenuItem underMenuItem = new MenuItem( - MSG.chart_themepanel_area_under()); - Menu underMenu = new Menu(); - for (int i = 0; i < nThemes; i++) { - final Theme theme = themes.getThemeAt(i+1); + final MenuItem underMenuItem = new MenuItem(this.MSG.chart_themepanel_area_under()); + final Menu underMenu = new Menu(); + for (int i = 0; i < nThemes; i++) { + final Theme theme = themes.getThemeAt(i + 1); if (theme.getVisible() == 0) { continue; @@ -399,12 +322,12 @@ continue; } - MenuItem againster = new MenuItem(theme.getDescription()); + final MenuItem againster = new MenuItem(theme.getDescription()); underMenu.addItem(againster); againster.addClickHandler(new ClickHandler() { @Override - public void onClick(MenuItemClickEvent evt) { + public void onClick(final MenuItemClickEvent evt) { disable(); createAreaArtifact(theme, facetTheme, false); } @@ -412,32 +335,32 @@ } // Create the "over..." submenu. - MenuItem overMenuItem = new MenuItem(MSG.chart_themepanel_area_over()); - Menu overMenu = new Menu(); - for (int i = 0; i < nThemes; i++) { - final Theme theme = themes.getThemeAt(i+1); + final MenuItem overMenuItem = new MenuItem(this.MSG.chart_themepanel_area_over()); + final Menu overMenu = new Menu(); + for (int i = 0; i < nThemes; i++) { + final Theme theme = themes.getThemeAt(i + 1); if (theme.getVisible() == 0) { continue; } if (!areAreaCompatible(facetTheme, theme)) { continue; } - MenuItem againster = new MenuItem(theme.getDescription()); + final MenuItem againster = new MenuItem(theme.getDescription()); overMenu.addItem(againster); againster.addClickHandler(new ClickHandler() { @Override - public void onClick(MenuItemClickEvent evt) { + public void onClick(final MenuItemClickEvent evt) { disable(); createAreaArtifact(facetTheme, theme, false); } }); } overMenu.addItem(createSeparator()); - MenuItem againstAxis = new MenuItem(MSG.getString("x_axis")); + final MenuItem againstAxis = new MenuItem(this.MSG.getString("x_axis")); againstAxis.addClickHandler(new ClickHandler() { @Override - public void onClick(MenuItemClickEvent evt) { + public void onClick(final MenuItemClickEvent evt) { disable(); createAreaArtifact(null, facetTheme, false); } @@ -445,23 +368,22 @@ overMenu.addItem(againstAxis); // Create the "between..." submenu. - MenuItem betweenMenuItem = new MenuItem( - MSG.chart_themepanel_area_between()); - Menu betweenMenu = new Menu(); - for (int i = 0; i < nThemes; i++) { - final Theme theme = themes.getThemeAt(i+1); + final MenuItem betweenMenuItem = new MenuItem(this.MSG.chart_themepanel_area_between()); + final Menu betweenMenu = new Menu(); + for (int i = 0; i < nThemes; i++) { + final Theme theme = themes.getThemeAt(i + 1); if (theme.getVisible() == 0) { continue; } if (!areAreaCompatible(facetTheme, theme)) { continue; } - MenuItem againster = new MenuItem(theme.getDescription()); + final MenuItem againster = new MenuItem(theme.getDescription()); betweenMenu.addItem(againster); againster.addClickHandler(new ClickHandler() { @Override - public void onClick(MenuItemClickEvent evt) { + public void onClick(final MenuItemClickEvent evt) { disable(); createAreaArtifact(facetTheme, theme, true); } @@ -478,11 +400,10 @@ areaMenu.addItem(overMenuItem); areaMenu.addItem(underMenuItem); areaMenu.addItem(createSeparator()); - MenuItem standAloneAgainstAxis = new MenuItem( - MSG.getString("against_x_axis")); + final MenuItem standAloneAgainstAxis = new MenuItem(this.MSG.getString("against_x_axis")); standAloneAgainstAxis.addClickHandler(new ClickHandler() { @Override - public void onClick(MenuItemClickEvent evt) { + public void onClick(final MenuItemClickEvent evt) { disable(); createAreaArtifact(null, facetTheme, false); } @@ -494,5 +415,4 @@ return menu; } -} -// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : +} \ No newline at end of file diff -r 9744ce3c3853 -r 05405292a7ca gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ChartToolbar.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ChartToolbar.java Thu Aug 16 16:27:53 2018 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/ChartToolbar.java Thu Aug 16 16:28:03 2018 +0200 @@ -83,7 +83,7 @@ @Override public void onClick(ClickEvent ce) { new ManualWSPEditor( - finalChartTab.getView().getCollection(), + finalChartTab.getCollectionView().getCollection(), finalChartTab, finalChartTab.getMode().getName()).show(); }}); @@ -300,11 +300,11 @@ protected void openPointWindow() { ChartOutputTab chartTab = getChartOutputTab(); if (chartTab.getMode().getName().equals("historical_discharge")) { - new ManualDatePointsEditor(chartTab.getView().getCollection(), + new ManualDatePointsEditor(chartTab.getCollectionView().getCollection(), chartTab, chartTab.getMode().getName()).show(); } else { - new ManualPointsEditor(chartTab.getView().getCollection(), + new ManualPointsEditor(chartTab.getCollectionView().getCollection(), chartTab, chartTab.getMode().getName()).show(); } } diff -r 9744ce3c3853 -r 05405292a7ca gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/CrossSectionChartThemePanel.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/CrossSectionChartThemePanel.java Thu Aug 16 16:27:53 2018 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/CrossSectionChartThemePanel.java Thu Aug 16 16:28:03 2018 +0200 @@ -32,6 +32,7 @@ import org.dive4elements.river.client.client.services.LoadArtifactService; import org.dive4elements.river.client.client.services.LoadArtifactServiceAsync; import org.dive4elements.river.client.client.ui.CollectionView; +import org.dive4elements.river.client.client.ui.IThemeRecordHandler; import org.dive4elements.river.client.client.widgets.KMSpinner; import org.dive4elements.river.client.client.widgets.KMSpinnerChangeListener; import org.dive4elements.river.client.shared.model.Artifact; @@ -97,12 +98,11 @@ /** * Trivial constructor. + * @param noopThemeRecordHandler */ - public CrossSectionChartThemePanel( - OutputMode mode, - CollectionView view) + public CrossSectionChartThemePanel( OutputMode mode, CollectionView view, IThemeRecordHandler recordHandler) { - super(mode, view); + super(mode, view, recordHandler); } @@ -550,7 +550,7 @@ * Initializes the components (columns) of the theme grid. */ @Override - protected void initGrid() { + protected void initGrid(IThemeRecordHandler recordHandler) { list.setCanEdit(true); list.setCanSort(false); list.setShowRecordComponents(true); diff -r 9744ce3c3853 -r 05405292a7ca gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/NaviChartOutputTab.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/NaviChartOutputTab.java Thu Aug 16 16:27:53 2018 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/NaviChartOutputTab.java Thu Aug 16 16:28:03 2018 +0200 @@ -53,7 +53,7 @@ private INaviChartStepper stepper; public NaviChartOutputTab(final String title, final Collection collection, final OutputMode mode, final CollectionView collectionView) { - super(title, collection, mode, collectionView); + super(title, collection, mode, collectionView, new NaviChartRecordHandler(collectionView)); this.stepper = new NilNaviChartStepper(); @@ -230,6 +230,7 @@ this.currentkm.setValue(this.kmFormat.format(currentKm)); this.tbarPanel.onZoom(null); + updateThemePanel(); } /** diff -r 9744ce3c3853 -r 05405292a7ca gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/NaviChartRecordHandler.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/NaviChartRecordHandler.java Thu Aug 16 16:28:03 2018 +0200 @@ -0,0 +1,85 @@ +/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde + * Software engineering by + * Björnsen Beratende Ingenieure GmbH + * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt + * + * This file is Free Software under the GNU AGPL (>=v3) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ +package org.dive4elements.river.client.client.ui.chart; + +import org.dive4elements.river.client.client.ui.CollectionView; +import org.dive4elements.river.client.client.ui.IThemeRecordHandler; +import org.dive4elements.river.client.shared.model.AttributedTheme; +import org.dive4elements.river.client.shared.model.FacetRecord; +import org.dive4elements.river.client.shared.model.Theme; + +import com.smartgwt.client.widgets.grid.CellFormatter; +import com.smartgwt.client.widgets.grid.ListGridRecord; + +/** + * @author Gernot Belger + */ +final class NaviChartRecordHandler implements IThemeRecordHandler, CellFormatter { + + private static final String STYLE_CLASS_NAVI_CHART_GRAYED = "naviChartGrayed"; + private final CollectionView collectionView; + + public NaviChartRecordHandler(final CollectionView collectionView) { + this.collectionView = collectionView; + } + + private boolean checkOutsideRange(final FacetRecord facetRecord) { + + final Theme theme = facetRecord.getTheme(); + if (!(theme instanceof AttributedTheme)) + return false; + + final double currentKm = this.collectionView.getCurrentKm(); + + final AttributedTheme aTheme = (AttributedTheme) theme; + + final Double startKm = aTheme.getAttrAsDouble("startKm"); + final Double endKm = aTheme.getAttrAsDouble("endKm"); + if (startKm == null || endKm == null) + return false; + + final double fromKm = startKm < endKm ? startKm : endKm; + final double toKm = startKm < endKm ? endKm : startKm; + + return currentKm < fromKm || currentKm > toKm; + } + + @Override + public void handle(final FacetRecord facetRecord) { + + final boolean isOutsideRange = checkOutsideRange(facetRecord); + if (isOutsideRange) + facetRecord.set_baseStyle(STYLE_CLASS_NAVI_CHART_GRAYED); + else + facetRecord.set_baseStyle(null); + } + + @Override + public String format(final Object value, final ListGridRecord record, final int rowNum, final int colNum) { + + if (!(record instanceof FacetRecord)) + return null; + + final FacetRecord facetRecord = (FacetRecord) record; + final String description = facetRecord.getName(); + + final boolean isOutsideRange = checkOutsideRange(facetRecord); + if (isOutsideRange) { + return new StringBuilder(description) // + .append(" (") // + // FIXME: i10n + .append("auß. Gültigkeitsbereich") // + .append(")") // + .toString(); + } + + return description; + } +} \ No newline at end of file diff -r 9744ce3c3853 -r 05405292a7ca gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/OverviewOutputTab.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/OverviewOutputTab.java Thu Aug 16 16:27:53 2018 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/chart/OverviewOutputTab.java Thu Aug 16 16:28:03 2018 +0200 @@ -13,7 +13,9 @@ import org.dive4elements.river.client.client.event.OutputParameterChangeHandler; import org.dive4elements.river.client.client.event.RedrawRequestHandler; import org.dive4elements.river.client.client.ui.CollectionView; +import org.dive4elements.river.client.client.ui.IThemeRecordHandler; import org.dive4elements.river.client.client.ui.ImgLink; +import org.dive4elements.river.client.client.ui.NoopThemeRecordHandler; import org.dive4elements.river.client.shared.model.Collection; import org.dive4elements.river.client.shared.model.OutputMode; import org.dive4elements.river.client.shared.model.Theme; @@ -24,7 +26,7 @@ private class NoChartThemePanel extends ChartThemePanel { public NoChartThemePanel(OutputMode mode, CollectionView view) { - super(mode, view); + super(mode, view, new NoopThemeRecordHandler()); } @Override @@ -99,15 +101,13 @@ OutputMode mode, CollectionView collectionView ){ - super(title, collection, mode, collectionView); + super(title, collection, mode, collectionView, new NoopThemeRecordHandler()); left.setVisible(false); } @Override - public ChartThemePanel createThemePanel( - OutputMode mode, CollectionView view - ) { + public ChartThemePanel createThemePanel(OutputMode mode, CollectionView view, IThemeRecordHandler recordHandler) { return new NoChartThemePanel(mode, view); } @@ -115,4 +115,4 @@ public ChartToolbar createChartToolbar(ChartOutputTab tab) { return new MinimumChartToolbar(tab); } -} +} \ No newline at end of file diff -r 9744ce3c3853 -r 05405292a7ca gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/MapThemePanel.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/MapThemePanel.java Thu Aug 16 16:27:53 2018 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/map/MapThemePanel.java Thu Aug 16 16:28:03 2018 +0200 @@ -25,6 +25,7 @@ import org.dive4elements.river.client.client.FLYSConstants; import org.dive4elements.river.client.client.ui.CollectionView; +import org.dive4elements.river.client.client.ui.NoopThemeRecordHandler; import org.dive4elements.river.client.client.ui.ThemePanel; import org.dive4elements.river.client.shared.model.AttributedTheme; import org.dive4elements.river.client.shared.model.FacetRecord; @@ -80,7 +81,7 @@ ThemeMovedCallback themeMovedCallback, LayerZoomCallback layerZoomCallback ) { - super(mode, view); + super(mode, view, new NoopThemeRecordHandler()); this.mapOut = mapOut; this.activateCallback = activateCallback; diff -r 9744ce3c3853 -r 05405292a7ca gwt-client/src/main/java/org/dive4elements/river/client/shared/model/AttributedTheme.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/AttributedTheme.java Thu Aug 16 16:27:53 2018 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/AttributedTheme.java Thu Aug 16 16:28:03 2018 +0200 @@ -18,58 +18,77 @@ */ public class AttributedTheme implements Theme { - protected Map attributes; + private static final long serialVersionUID = 1L; + + private Map attributes; /** CollectionItem associated with this facet/themes artifact. */ - protected CollectionItem collectionItem; + private CollectionItem collectionItem; public AttributedTheme() { this.attributes = new HashMap(); } + /** Remark: only here so attributes is not final and serialization is happy */ + public void setAttributes(final Map attributes) { + this.attributes = attributes; + } public Set getKeys() { - return attributes.keySet(); + return this.attributes.keySet(); } - - public void addAttr(String name, String value) { + public void addAttr(final String name, final String value) { if (name != null && value != null) { - attributes.put(name, value); + this.attributes.put(name, value); } } - - public String getAttr(String name) { - return attributes.get(name); + public String getAttr(final String name) { + return this.attributes.get(name); } - - public Integer getAttrAsInt(String name) { - String attr = getAttr(name); + public Integer getAttrAsInt(final String name) { + final String attr = getAttr(name); if (attr != null && attr.length() > 0) { try { return Integer.parseInt(attr); } - catch (NumberFormatException nfe) { + catch (final NumberFormatException nfe) { + nfe.printStackTrace(); } } return null; } + public Double getAttrAsDouble(final String name) { - public boolean getAttrAsBoolean(String name) { - String attr = getAttr(name); + final String attr = getAttr(name); + if (attr == null || attr.isEmpty()) + return null; + + try { + return Double.parseDouble(attr); + } + catch (final NumberFormatException nfe) { + nfe.printStackTrace(); + return null; + } + } + + public boolean getAttrAsBoolean(final String name) { + final String attr = getAttr(name); if (attr != null) { try { - int num = Integer.valueOf(attr); + final int num = Integer.valueOf(attr); return num > 0; } - catch (NumberFormatException nfe) { + catch (final NumberFormatException nfe) { // do nothing + nfe.printStackTrace(); } } @@ -79,21 +98,21 @@ @Override public int getPosition() { - Integer pos = getAttrAsInt("pos"); + final Integer pos = getAttrAsInt("pos"); return pos != null ? pos.intValue() : -1; } @Override - public void setPosition(int pos) { + public void setPosition(final int pos) { addAttr("pos", String.valueOf(pos)); } @Override public int getIndex() { - Integer idx = getAttrAsInt("index"); + final Integer idx = getAttrAsInt("index"); return idx != null ? idx.intValue() : -1; } @@ -106,7 +125,7 @@ @Override - public void setActive(int active) { + public void setActive(final int active) { addAttr("active", String.valueOf(active)); } @@ -130,7 +149,7 @@ @Override - public void setDescription(String description) { + public void setDescription(final String description) { if (description != null && description.length() > 0) { addAttr("description", description); } @@ -144,18 +163,18 @@ @Override - public void setVisible(int visible) { + public void setVisible(final int visible) { addAttr("visible", String.valueOf(visible)); } @Override - public boolean equals(Object o) { + public boolean equals(final Object o) { if (!(o instanceof AttributedTheme)) { return false; } - AttributedTheme other = (AttributedTheme) o; + final AttributedTheme other = (AttributedTheme) o; if (other.getPosition() != getPosition()) { return false; @@ -188,18 +207,15 @@ return true; } - /** Get the CollectionItem representing the facets artifact. */ @Override public CollectionItem getCollectionItem() { - return collectionItem; + return this.collectionItem; } - /** Set the CollectionItem representing the facets artifact. */ @Override - public void setCollectionItem(CollectionItem ci) { + public void setCollectionItem(final CollectionItem ci) { this.collectionItem = ci; } -} -// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : +} \ No newline at end of file diff -r 9744ce3c3853 -r 05405292a7ca gwt-client/src/main/java/org/dive4elements/river/client/shared/model/ChartMode.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/ChartMode.java Thu Aug 16 16:27:53 2018 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/ChartMode.java Thu Aug 16 16:28:03 2018 +0200 @@ -11,49 +11,42 @@ import java.util.List; import org.dive4elements.river.client.client.ui.CollectionView; +import org.dive4elements.river.client.client.ui.NoopThemeRecordHandler; import org.dive4elements.river.client.client.ui.OutputTab; import org.dive4elements.river.client.client.ui.chart.ChartOutputTab; import org.dive4elements.river.client.client.ui.chart.NaviChartOutputTab; - /** * @author Ingo Weinzierl */ public class ChartMode extends DefaultOutputMode { + private static final long serialVersionUID = 1L; + public ChartMode() { } - - public ChartMode(String name, String desc, String mimeType) { - super(name, desc, mimeType); - } - + public ChartMode(final String name, final String descrition, final String mimeType, final List facets, final String type) { + super(name, descrition, mimeType, facets); - public ChartMode( - String name, - String descrition, - String mimeType, - List facets, - String type) - { - super(name, descrition, mimeType, facets); this.type = type; } - /** Create output tab. Some outs feel better inside a specialized one. */ @Override - public OutputTab createOutputTab(String t, Collection c, CollectionView p) { - if (this.getName().equals("fix_wq_curve") || - this.getName().equals("extreme_wq_curve") || - this.getName().equals("fix_deltawt_curve") || - this.getName().equals("fix_derivate_curve") || - this.getName().equals("fix_vollmer_wq_curve") || - this.getName().equals("sinfo_floodduration_curve")){ + public OutputTab createOutputTab(final String t, final Collection c, final CollectionView p) { + final String modeName = this.getName(); + + if (modeName.equals("fix_wq_curve") || // + modeName.equals("extreme_wq_curve") || // + modeName.equals("fix_deltawt_curve") || // + modeName.equals("fix_derivate_curve") || // + modeName.equals("fix_vollmer_wq_curve") || // + modeName.equals("sinfo_floodduration_curve")) { + return new NaviChartOutputTab(t, c, this, p); } - return new ChartOutputTab(t, c, this, p); + + return new ChartOutputTab(t, c, this, p, new NoopThemeRecordHandler()); } -} -// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : +} \ No newline at end of file diff -r 9744ce3c3853 -r 05405292a7ca gwt-client/src/main/java/org/dive4elements/river/client/shared/model/FacetRecord.java --- a/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/FacetRecord.java Thu Aug 16 16:27:53 2018 +0200 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/FacetRecord.java Thu Aug 16 16:28:03 2018 +0200 @@ -12,46 +12,38 @@ /** * ListGridRecord for Facets. + * * @author Ingo Weinzierl */ -public class FacetRecord extends ListGridRecord { +public final class FacetRecord extends ListGridRecord { /** Underlying theme. */ - protected Theme theme; + private final Theme theme; - - public FacetRecord(Theme theme) { + public FacetRecord(final Theme theme) { this.theme = theme; setActive(theme.getActive() == 1); setName(theme.getDescription()); } - public Theme getTheme() { - return theme; + return this.theme; } - - public void setName(String description) { - // TODO Add a setter method setName() to Facet - // facet.setName(name); + public void setName(final String description) { setAttribute("name", description); } - public String getName() { return getAttribute("name"); } - public boolean getActive() { return getAttributeAsBoolean("active"); } - - public void setActive(boolean active) { + public void setActive(final boolean active) { setAttribute("active", active); } -} -// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : +} \ No newline at end of file diff -r 9744ce3c3853 -r 05405292a7ca gwt-client/src/main/webapp/FLYS.css --- a/gwt-client/src/main/webapp/FLYS.css Thu Aug 16 16:27:53 2018 +0200 +++ b/gwt-client/src/main/webapp/FLYS.css Thu Aug 16 16:28:03 2018 +0200 @@ -244,3 +244,80 @@ .riverLinkHighlight { background: #B7D431; } + +.naviChartGrayed, +.naviChartGrayedDark, +.naviChartGrayedOver, +.naviChartGrayedOverDark, +.naviChartGrayedSelected, +.naviChartGrayedSelectedDark, +.naviChartGrayedSelectedOver, +.naviChartGrayedSelectedOverDark, +.naviChartGrayedDisabled, +.naviChartGrayedDisabledDark { + + border-top: 1px solid #fafafa; + border-bottom: 1px solid #f0f0f0; + font-family: Arial, Verdana, sans-serif; + font-size: 11px; + text-overflow: ellipsis; + + color: #CCCCCC; + font-style: italic; +} + +.naviChartGrayedDark { + background-color: #fafafa; +} + +.naviChartGrayedOver, +.naviChartGrayedOverDark { + background-color: #c4ddfd; + background-image: url(./images/ListGrid/row_Over.png); + background-repeat: repeat-x; + background-position: bottom left; + background-attachment: scroll; + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2M0ZGRmZCIvPjxzdG9wIG9mZnNldD0iOSUiIHN0b3AtY29sb3I9IiNmMGY4ZmYiLz48c3RvcCBvZmZzZXQ9IjE0JSIgc3RvcC1jb2xvcj0iI2U1ZjNmZiIvPjxzdG9wIG9mZnNldD0iODYlIiBzdG9wLWNvbG9yPSIjY2NlNWZmIi8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjYzRkZGZkIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0idXJsKCNncmFkKSIgLz48L3N2Zz4g'); + background-size: 100%; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #c4ddfd), color-stop(9%, #f0f8ff), color-stop(14%, #e5f3ff), color-stop(86%, #cce5ff), color-stop(100%, #c4ddfd)); + background-image: -webkit-linear-gradient(top, #c4ddfd 0%, #f0f8ff 9%, #e5f3ff 14%, #cce5ff 86%, #c4ddfd 100%); + background-image: -moz-linear-gradient(top, #c4ddfd 0%, #f0f8ff 9%, #e5f3ff 14%, #cce5ff 86%, #c4ddfd 100%); + background-image: -o-linear-gradient(top, #c4ddfd 0%, #f0f8ff 9%, #e5f3ff 14%, #cce5ff 86%, #c4ddfd 100%); + background-image: linear-gradient(top, #c4ddfd 0%, #f0f8ff 9%, #e5f3ff 14%, #cce5ff 86%, #c4ddfd 100%); + border-bottom: 1px solid #c4ddfd; + border-top: 1px solid #c4ddfd; + -webkit-box-shadow: inset #e5f0ff 0 1px 0, inset #e5f0ff 0 -1px 0; + -moz-box-shadow: inset #e5f0ff 0 1px 0, inset #e5f0ff 0 -1px 0; + box-shadow: inset #e5f0ff 0 1px 0, inset #e5f0ff 0 -1px 0; +} + +.naviChartGrayedSelected, +.naviChartGrayedSelectedDark { + background: #d6e8ff; + border-bottom: 1px dotted #9fb7e9; + border-top: 1px dotted #9fb7e9; +} + +.naviChartGrayedSelectedOver, +.naviChartGrayedSelectedOverDark { + border-bottom: 1px solid #ababab; + border-top: 1px solid #b8cfef; + background-color: #c4ddfd; + background-image: url(./images/ListGrid/row_Selected_Over.png); + background-repeat: repeat-x; + background-attachment: scroll; + background-position: bottom left; + background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjUwJSIgeTE9IjAlIiB4Mj0iNTAlIiB5Mj0iMTAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2M0ZGRmZCIvPjxzdG9wIG9mZnNldD0iOSUiIHN0b3AtY29sb3I9IiNmMGY4ZmYiLz48c3RvcCBvZmZzZXQ9IjE0JSIgc3RvcC1jb2xvcj0iI2U1ZjNmZiIvPjxzdG9wIG9mZnNldD0iODYlIiBzdG9wLWNvbG9yPSIjY2NlNWZmIi8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjYzRkZGZkIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0idXJsKCNncmFkKSIgLz48L3N2Zz4g'); + background-size: 100%; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #c4ddfd), color-stop(9%, #f0f8ff), color-stop(14%, #e5f3ff), color-stop(86%, #cce5ff), color-stop(100%, #c4ddfd)); + background-image: -webkit-linear-gradient(top, #c4ddfd 0%, #f0f8ff 9%, #e5f3ff 14%, #cce5ff 86%, #c4ddfd 100%); + background-image: -moz-linear-gradient(top, #c4ddfd 0%, #f0f8ff 9%, #e5f3ff 14%, #cce5ff 86%, #c4ddfd 100%); + background-image: -o-linear-gradient(top, #c4ddfd 0%, #f0f8ff 9%, #e5f3ff 14%, #cce5ff 86%, #c4ddfd 100%); + background-image: linear-gradient(top, #c4ddfd 0%, #f0f8ff 9%, #e5f3ff 14%, #cce5ff 86%, #c4ddfd 100%); +} + +.naviChartGrayedDisabled, +.naviChartGrayedDisabledDark { + background-color: white; + color: #ababab; +} \ No newline at end of file