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.map; ingo@805: gernotbelger@9483: import org.dive4elements.river.client.client.FLYSConstants; gernotbelger@9483: import org.dive4elements.river.client.client.ui.CollectionView; gernotbelger@9483: import org.dive4elements.river.client.client.ui.NoopThemeRecordHandler; gernotbelger@9483: import org.dive4elements.river.client.client.ui.ThemePanel; gernotbelger@9483: import org.dive4elements.river.client.shared.model.AttributedTheme; gernotbelger@9483: import org.dive4elements.river.client.shared.model.FacetRecord; gernotbelger@9483: import org.dive4elements.river.client.shared.model.OutputMode; gernotbelger@9483: import org.dive4elements.river.client.shared.model.Theme; gernotbelger@9483: ingo@805: import com.google.gwt.core.client.GWT; ingo@805: import com.smartgwt.client.types.ListGridFieldType; christian@4064: import com.smartgwt.client.util.BooleanCallback; christian@4064: import com.smartgwt.client.util.SC; ingo@805: import com.smartgwt.client.widgets.grid.ListGridField; ingo@1327: import com.smartgwt.client.widgets.grid.ListGridRecord; christian@4064: import com.smartgwt.client.widgets.grid.events.HeaderDoubleClickEvent; christian@4064: import com.smartgwt.client.widgets.grid.events.HeaderDoubleClickHandler; ingo@805: import com.smartgwt.client.widgets.layout.VLayout; ingo@1377: import com.smartgwt.client.widgets.menu.Menu; ingo@1377: import com.smartgwt.client.widgets.menu.MenuItem; ingo@1377: import com.smartgwt.client.widgets.menu.events.ClickHandler; ingo@1377: import com.smartgwt.client.widgets.menu.events.MenuItemClickEvent; ingo@805: ingo@805: /** ingo@805: * @author Ingo Weinzierl ingo@805: */ ingo@805: public class MapThemePanel extends ThemePanel { ingo@805: ingo@4330: public static final int CELL_HEIGHT = 25; ingo@1327: ingo@806: public interface ActivateCallback { ingo@806: void activate(Theme theme, boolean activate); ingo@806: } ingo@806: ingo@1303: public interface ThemeMovedCallback { ingo@1303: void onThemeMoved(Theme theme, int oldIdx, int newIdx); ingo@1303: } ingo@1303: ingo@1377: public interface LayerZoomCallback { ingo@1377: void onLayerZoom(Theme theme, String extent); ingo@1377: } ingo@1377: gernotbelger@9483: private final FLYSConstants MSG = GWT.create(FLYSConstants.class); ingo@805: gernotbelger@9483: protected ActivateCallback activateCallback; ingo@1303: protected ThemeMovedCallback themeMovedCallback; gernotbelger@9483: protected LayerZoomCallback layerZoomCallback; ingo@806: ingo@1382: protected ListGridRecord[] oldRecords; ingo@1382: ingo@805: public static final String GRID_FIELD_ACTIVE = "active"; gernotbelger@9483: public static final String GRID_FIELD_NAME = "name"; ingo@805: ingo@805: protected MapOutputTab mapOut; ingo@805: gernotbelger@9483: public MapThemePanel(final CollectionView view, final OutputMode mode, final MapOutputTab mapOut, final ActivateCallback activateCallback, gernotbelger@9483: final ThemeMovedCallback themeMovedCallback, final LayerZoomCallback layerZoomCallback) { gernotbelger@9416: super(mode, view, new NoopThemeRecordHandler()); ingo@805: gernotbelger@9483: this.mapOut = mapOut; gernotbelger@9483: this.activateCallback = activateCallback; ingo@1303: this.themeMovedCallback = themeMovedCallback; gernotbelger@9483: this.layerZoomCallback = layerZoomCallback; ingo@806: ingo@805: initGrid(); ingo@805: initLayout(); ingo@805: ingo@805: updateGrid(); ingo@805: } ingo@805: ingo@805: protected void initLayout() { ingo@805: setWidth100(); ingo@805: setHeight100(); ingo@805: gernotbelger@9483: final VLayout layout = new VLayout(); ingo@805: layout.setWidth100(); ingo@805: layout.setHeight100(); ingo@805: gernotbelger@9483: layout.addMember(this.list); gernotbelger@9483: layout.addMember(this.navigation); ingo@805: ingo@805: addChild(layout); ingo@805: } ingo@805: ingo@805: protected void initGrid() { gernotbelger@9483: this.list.setCanEdit(true); gernotbelger@9483: this.list.setCanSort(false); gernotbelger@9483: this.list.setShowRecordComponents(false); gernotbelger@9483: this.list.setShowRecordComponentsByCell(true); gernotbelger@9483: this.list.setShowHeader(true); gernotbelger@9483: this.list.setShowHeaderContextMenu(false); gernotbelger@9483: this.list.setCanReorderFields(false); gernotbelger@9483: this.list.setWidth100(); gernotbelger@9483: this.list.setHeight100(); ingo@805: gernotbelger@9483: this.list.addHeaderDoubleClickHandler(new HeaderDoubleClickHandler() { christian@4064: @Override gernotbelger@9483: public void onHeaderDoubleClick(final HeaderDoubleClickEvent event) { raimund@2436: // cancel the event. raimund@2436: return; raimund@2436: } raimund@2436: }); raimund@2436: gernotbelger@9483: this.list.setCellHeight(CELL_HEIGHT); gernotbelger@9483: this.list.setShowRecordComponents(true); gernotbelger@9483: this.list.setShowRecordComponentsByCell(true); gernotbelger@9483: this.list.setShowAllRecords(true); ingo@1327: gernotbelger@9483: this.list.addEditCompleteHandler(this); ingo@805: gernotbelger@9483: final ListGridField active = new ListGridField(GRID_FIELD_ACTIVE, " ", 20); ingo@805: active.setType(ListGridFieldType.BOOLEAN); ingo@1327: active.setCanDragResize(false); ingo@1327: gernotbelger@9483: final ListGridField name = new ListGridField(GRID_FIELD_NAME, this.MSG.chart_themepanel_header_themes()); ingo@805: name.setType(ListGridFieldType.TEXT); ingo@805: gernotbelger@9483: this.list.setFields(active, name); ingo@805: } ingo@805: ingo@805: @Override ingo@1382: protected void clearGrid() { gernotbelger@9483: this.oldRecords = this.list.getRecords(); ingo@1382: super.clearGrid(); ingo@1382: } ingo@1382: ingo@1382: @Override gernotbelger@9483: protected void addFacetRecord(final FacetRecord rec) { gernotbelger@9483: final Theme newTheme = rec.getTheme(); gernotbelger@9483: boolean isNew = true; ingo@1382: gernotbelger@9483: for (final ListGridRecord old : getOldRecords()) { gernotbelger@9483: final FacetRecord fr = (FacetRecord) old; ingo@1382: ingo@1382: if (newTheme.equals(fr.getTheme())) { ingo@1382: isNew = false; ingo@1382: break; ingo@1382: } ingo@1382: } ingo@1382: gernotbelger@9483: if (isNew && this.mapOut != null) gernotbelger@9483: this.mapOut.addLayer(newTheme); ingo@1382: ingo@1382: super.addFacetRecord(rec); ingo@1382: } ingo@1382: ingo@1382: @Override ingo@1377: protected Menu getSingleContextMenu(final ListGridRecord[] records) { gernotbelger@9483: final Menu menu = super.getSingleContextMenu(records); ingo@1377: gernotbelger@9483: final MenuItem layerZoom = createLayerZoomItem(records); ingo@1377: if (layerZoom != null) { ingo@1377: menu.addItem(layerZoom); ingo@1377: } aheinecke@5792: menu.addItem(createMapURLItem(records)); ingo@1377: ingo@1377: return menu; ingo@1377: } ingo@1377: christian@4739: protected MenuItem createMapURLItem(final ListGridRecord[] records) { gernotbelger@9483: final FacetRecord fr = (FacetRecord) records[0]; gernotbelger@9483: final Theme theme = fr.getTheme(); gernotbelger@9483: final AttributedTheme at = (AttributedTheme) theme; christian@4739: gernotbelger@9483: final MenuItem item = new MenuItem(this.MSG.wmsURLMenuItem()); christian@4739: item.addClickHandler(new ClickHandler() { christian@4739: @Override gernotbelger@9483: public void onClick(final MenuItemClickEvent evt) { gernotbelger@9483: final String url = getMapOutputTab().getWMSUrl(theme); gernotbelger@9483: gernotbelger@9483: SC.say(MapThemePanel.this.MSG.wmsURLBoxTitle(), url); christian@4739: } christian@4739: }); christian@4739: christian@4739: return item; christian@4739: } christian@4739: ingo@1382: @Override ingo@1382: protected MenuItem createRemoveItem(final ListGridRecord[] records) { gernotbelger@9483: final MenuItem item = super.createRemoveItem(records); ingo@1382: item.addClickHandler(new ClickHandler() { ingo@1382: @Override gernotbelger@9483: public void onClick(final MenuItemClickEvent evt) { gernotbelger@9483: SC.ask(MapThemePanel.this.MSG.askThemeRemove(), new BooleanCallback() { ingo@1422: @Override gernotbelger@9483: public void execute(final Boolean value) { ingo@1422: if (value) { gernotbelger@9483: for (final ListGridRecord record : records) { gernotbelger@9483: final FacetRecord facet = (FacetRecord) record; ingo@1382: gernotbelger@9483: final Theme theme = facet.getTheme(); ingo@1422: theme.setVisible(0); ingo@1422: theme.setActive(0); ingo@1382: gernotbelger@9483: getMapOutputTab().removeLayer(theme); ingo@1422: } ingo@1382: ingo@1422: updateCollection(); ingo@1422: } ingo@1422: } ingo@1422: }); ingo@1382: } ingo@1382: }); ingo@1382: ingo@1382: return item; ingo@1382: } ingo@1382: ingo@1377: protected MenuItem createLayerZoomItem(final ListGridRecord[] recs) { gernotbelger@9483: final FacetRecord fr = (FacetRecord) recs[0]; ingo@1377: final AttributedTheme at = (AttributedTheme) fr.getTheme(); ingo@1377: ingo@1377: final String extent = at.getAttr("extent"); ingo@1377: ingo@1377: if (extent == null || extent.length() == 0) { ingo@1377: return null; ingo@1377: } ingo@1377: gernotbelger@9483: final MenuItem zoom = new MenuItem(this.MSG.zoomToLayer()); ingo@1377: zoom.addClickHandler(new ClickHandler() { ingo@1377: @Override gernotbelger@9483: public void onClick(final MenuItemClickEvent evt) { gernotbelger@9483: if (MapThemePanel.this.layerZoomCallback != null) { gernotbelger@9483: MapThemePanel.this.layerZoomCallback.onLayerZoom(at, extent); ingo@1377: } ingo@1377: } ingo@1377: }); ingo@1377: ingo@1377: return zoom; ingo@1377: } ingo@1377: christian@4064: @Override christian@4064: public String getWidthAsString() { gernotbelger@9483: if (!isVisible()) { christian@4064: return "0"; gernotbelger@9483: } else { christian@4064: return super.getWidthAsString(); christian@4064: } christian@4064: } ingo@1377: ingo@1377: @Override gernotbelger@9483: public void activateTheme(final Theme theme, final boolean active) { gernotbelger@9483: if (this.activateCallback != null) { gernotbelger@9483: this.activateCallback.activate(theme, active); ingo@806: } ingo@806: ingo@805: theme.setActive(active ? 1 : 0); ingo@805: } ingo@1303: ingo@1303: @Override gernotbelger@9483: protected void fireThemeMoved(final Theme theme, final int oldIdx, final int newIdx) { gernotbelger@9483: if (this.themeMovedCallback != null) { gernotbelger@9483: this.themeMovedCallback.onThemeMoved(theme, oldIdx, newIdx); ingo@1303: } ingo@1303: } ingo@1382: ingo@1382: protected ListGridRecord[] getOldRecords() { gernotbelger@9483: return this.oldRecords != null ? this.oldRecords : new ListGridRecord[0]; ingo@1382: } ingo@1382: ingo@1382: protected MapOutputTab getMapOutputTab() { gernotbelger@9483: return this.mapOut; ingo@1382: } ingo@805: } ingo@805: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :