diff --git a/plugins/org.jkiss.dbeaver.data.gis.view/src/org/jkiss/dbeaver/ui/gis/IGeometryValueEditor.java b/plugins/org.jkiss.dbeaver.data.gis.view/src/org/jkiss/dbeaver/ui/gis/IGeometryValueEditor.java index 716ab2d779e9883b7fa0cb399623d7e9397ac0d5..8ac5f4c01aa6d575c776ba185d0cb748e1668c76 100644 --- a/plugins/org.jkiss.dbeaver.data.gis.view/src/org/jkiss/dbeaver/ui/gis/IGeometryValueEditor.java +++ b/plugins/org.jkiss.dbeaver.data.gis.view/src/org/jkiss/dbeaver/ui/gis/IGeometryValueEditor.java @@ -16,11 +16,17 @@ */ package org.jkiss.dbeaver.ui.gis; +import org.eclipse.swt.widgets.Control; + +import java.util.List; + /** * Geometry value editor */ public interface IGeometryValueEditor { + Control getEditorControl(); + int getValueSRID(); void setValueSRID(int srid); diff --git a/plugins/org.jkiss.dbeaver.data.gis.view/src/org/jkiss/dbeaver/ui/gis/panel/GISEditorUtils.java b/plugins/org.jkiss.dbeaver.data.gis.view/src/org/jkiss/dbeaver/ui/gis/panel/GISEditorUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..a6ec3596a3161c5e389720bebb248b7436917d35 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.data.gis.view/src/org/jkiss/dbeaver/ui/gis/panel/GISEditorUtils.java @@ -0,0 +1,47 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jkiss.dbeaver.ui.gis.panel; + +import java.util.ArrayList; +import java.util.List; + +/** + * Database select dialog + */ +public class GISEditorUtils { + + private static final int MAX_RECENT_SRID_SIZE = 10; + + private static final List recentSRIDs = new ArrayList<>(); + + public static List getRecentSRIDs() { + return recentSRIDs; + } + + public static void addRecentSRID(int srid) { + if (!recentSRIDs.contains(srid)) { + recentSRIDs.add(srid); + } + } + + public static void curRecentSRIDs() { + if (recentSRIDs.size() > MAX_RECENT_SRID_SIZE) { + recentSRIDs.remove(0); + } + } + +} \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.data.gis.view/src/org/jkiss/dbeaver/ui/gis/panel/GISLeafletViewer.java b/plugins/org.jkiss.dbeaver.data.gis.view/src/org/jkiss/dbeaver/ui/gis/panel/GISLeafletViewer.java index 832f05d112baa7d7afae0eb237fbaf2e36beb9cf..bd3856230743f5e03d749d8c6b55199b24a3d955 100644 --- a/plugins/org.jkiss.dbeaver.data.gis.view/src/org/jkiss/dbeaver/ui/gis/panel/GISLeafletViewer.java +++ b/plugins/org.jkiss.dbeaver.data.gis.view/src/org/jkiss/dbeaver/ui/gis/panel/GISLeafletViewer.java @@ -17,7 +17,6 @@ package org.jkiss.dbeaver.ui.gis.panel; import org.eclipse.jface.action.*; -import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.dnd.Clipboard; @@ -39,7 +38,10 @@ import org.jkiss.dbeaver.model.exec.DBCException; import org.jkiss.dbeaver.model.gis.*; import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; import org.jkiss.dbeaver.runtime.DBWorkbench; -import org.jkiss.dbeaver.ui.*; +import org.jkiss.dbeaver.ui.ActionUtils; +import org.jkiss.dbeaver.ui.DBeaverIcons; +import org.jkiss.dbeaver.ui.UIIcon; +import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.css.CSSUtils; import org.jkiss.dbeaver.ui.css.DBStyles; import org.jkiss.dbeaver.ui.data.IValueController; @@ -65,7 +67,6 @@ public class GISLeafletViewer implements IGeometryValueEditor { private static final Log log = Log.getLog(GISLeafletViewer.class); private static final String PREF_RECENT_SRID_LIST = "srid.list.recent"; - private static final int MAX_RECENT_SRID_SIZE = 10; private static final String[] SUPPORTED_FORMATS = new String[] { "png", "gif", "bmp" }; @@ -77,7 +78,6 @@ public class GISLeafletViewer implements IGeometryValueEditor { private File scriptFile; private final ToolBarManager toolBarManager; private int defaultSRID; // Target SRID used to render map - private List recentSRIDs = new ArrayList<>(); private boolean toolsVisible = true; private boolean flipCoordinates = false; @@ -115,15 +115,18 @@ public class GISLeafletViewer implements IGeometryValueEditor { if (recentSRID == 0 || recentSRID == GeometryDataUtils.getDefaultSRID() || recentSRID == GisConstants.DEFAULT_OSM_SRID) { continue; } - if (!recentSRIDs.contains(recentSRID)) { - recentSRIDs.add(recentSRID); - } + GISEditorUtils.addRecentSRID(recentSRID); } } //recentSRIDs.sort(Integer::compareTo); } } + @Override + public Control getEditorControl() { + return composite; + } + @Override public int getValueSRID() { return actualSourceSRID != 0 ? actualSourceSRID : @@ -145,14 +148,12 @@ public class GISLeafletViewer implements IGeometryValueEditor { } { // Save SRID to the list of recently used SRIDs - if (srid != GeometryDataUtils.getDefaultSRID() && srid != GisConstants.DEFAULT_OSM_SRID && !recentSRIDs.contains(srid)) { - recentSRIDs.add(srid); - } - if (recentSRIDs.size() > MAX_RECENT_SRID_SIZE) { - recentSRIDs.remove(0); + if (srid != GeometryDataUtils.getDefaultSRID() && srid != GisConstants.DEFAULT_OSM_SRID) { + GISEditorUtils.addRecentSRID(srid); } + GISEditorUtils.curRecentSRIDs(); StringBuilder sridListStr = new StringBuilder(); - for (Integer sridInt : recentSRIDs) { + for (Integer sridInt : GISEditorUtils.getRecentSRIDs()) { if (sridListStr.length() > 0) sridListStr.append(","); sridListStr.append(sridInt); } @@ -444,7 +445,7 @@ public class GISLeafletViewer implements IGeometryValueEditor { toolBarManager.add(new Separator()); - Action crsSelectorAction = new ChangeCRSAction(); + Action crsSelectorAction = new SelectCRSAction(this); toolBarManager.add(ActionUtils.makeActionContribution(crsSelectorAction, true)); toolBarManager.add(new Action("Flip coordinates", Action.AS_CHECK_BOX) { @@ -502,93 +503,4 @@ public class GISLeafletViewer implements IGeometryValueEditor { } } - private class ChangeCRSAction extends Action implements IMenuCreator { - - private MenuManager menuManager; - - public ChangeCRSAction() { - super("EPSG:" + getValueSRID(), Action.AS_DROP_DOWN_MENU); - setImageDescriptor(DBeaverIcons.getImageDescriptor(UIIcon.CHART_LINE)); - } - - @Override - public void run() { - SelectSRIDDialog manageCRSDialog = new SelectSRIDDialog( - UIUtils.getActiveWorkbenchShell(), - getValueSRID()); - if (manageCRSDialog.open() == IDialogConstants.OK_ID) { - setValueSRID(manageCRSDialog.getSelectedSRID()); - } - } - - @Override - public IMenuCreator getMenuCreator() { - return this; - } - - @Override - public void dispose() { - if (menuManager != null) { - menuManager.dispose(); - menuManager = null; - } - } - - @Override - public Menu getMenu(Control parent) { - if (menuManager == null) { - menuManager = new MenuManager(); - menuManager.setRemoveAllWhenShown(true); - menuManager.addMenuListener(manager -> { - menuManager.add(new SetCRSAction(GeometryDataUtils.getDefaultSRID())); - menuManager.add(new SetCRSAction(GisConstants.DEFAULT_OSM_SRID)); - menuManager.add(new Separator()); - if (!recentSRIDs.isEmpty()) { - for (Integer recentSRID : recentSRIDs) { - menuManager.add(new SetCRSAction(recentSRID)); - } - menuManager.add(new Separator()); - } - menuManager.add(new Action("Other ...") { - @Override - public void run() { - ChangeCRSAction.this.run(); - } - }); - menuManager.add(new Action("Configuration ...") { - @Override - public void run() { - new GISViewerConfigurationDialog(composite.getShell()).open(); - } - }); - }); - } - return menuManager.createContextMenu(parent); - } - - @Override - public Menu getMenu(Menu parent) { - return null; - } - } - - private class SetCRSAction extends Action { - private final int srid; - - public SetCRSAction(int srid) { - super("EPSG:" + srid, AS_CHECK_BOX); - this.srid = srid; - } - - @Override - public boolean isChecked() { - return srid == getValueSRID(); - } - - @Override - public void run() { - setValueSRID(srid); - } - } - } \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.data.gis.view/src/org/jkiss/dbeaver/ui/gis/panel/GISTextViewer.java b/plugins/org.jkiss.dbeaver.data.gis.view/src/org/jkiss/dbeaver/ui/gis/panel/GISTextViewer.java index 74c778b510b85fa4329919c34837b217b7027953..52f942c71e8624919658183e2a3159324edcf234 100644 --- a/plugins/org.jkiss.dbeaver.data.gis.view/src/org/jkiss/dbeaver/ui/gis/panel/GISTextViewer.java +++ b/plugins/org.jkiss.dbeaver.data.gis.view/src/org/jkiss/dbeaver/ui/gis/panel/GISTextViewer.java @@ -16,12 +16,28 @@ */ package org.jkiss.dbeaver.ui.gis.panel; +import org.eclipse.jface.action.IContributionManager; +import org.eclipse.jface.action.ToolBarManager; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.ToolBar; +import org.jkiss.code.NotNull; import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.exec.DBCException; +import org.jkiss.dbeaver.model.gis.DBGeometry; import org.jkiss.dbeaver.model.gis.GisAttribute; import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; import org.jkiss.dbeaver.model.struct.DBSTypedObject; +import org.jkiss.dbeaver.ui.ActionUtils; +import org.jkiss.dbeaver.ui.UIUtils; +import org.jkiss.dbeaver.ui.css.CSSUtils; +import org.jkiss.dbeaver.ui.css.DBStyles; import org.jkiss.dbeaver.ui.data.IValueController; +import org.jkiss.dbeaver.ui.data.editors.BaseValueEditor; import org.jkiss.dbeaver.ui.data.editors.StringInlineEditor; import org.jkiss.dbeaver.ui.gis.IGeometryValueEditor; import org.jkiss.dbeaver.ui.gis.IGeometryViewer; @@ -33,17 +49,45 @@ import org.locationtech.jts.geom.Geometry; */ public class GISTextViewer extends StringInlineEditor implements IGeometryViewer, IGeometryValueEditor { + private static final Log log = Log.getLog(GISTextViewer.class); + private int valueSRID; + private ToolBarManager toolBarManager; public GISTextViewer(IValueController controller) { super(controller); } + @Override + protected Control createControl(Composite editPlaceholder) { + Composite composite = UIUtils.createPlaceholder(editPlaceholder, 1); + CSSUtils.setCSSClass(composite, DBStyles.COLORED_BY_CONNECTION_TYPE); + + Composite controlPanel = UIUtils.createPlaceholder(composite, 1); + controlPanel.setLayoutData(new GridData(GridData.FILL_BOTH)); + controlPanel.setLayout(new FillLayout()); + + Control textControl = super.createControl(controlPanel); + + Composite bottomPanel = UIUtils.createPlaceholder(composite, 1);//new Composite(composite, SWT.NONE); + bottomPanel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + CSSUtils.setCSSClass(bottomPanel, DBStyles.COLORED_BY_CONNECTION_TYPE); + + ToolBar bottomToolbar = new ToolBar(bottomPanel, SWT.FLAT | SWT.HORIZONTAL | SWT.RIGHT); + + toolBarManager = new ToolBarManager(bottomToolbar); + + return textControl; + } + @Override public void primeEditorValue(Object value) throws DBException { super.primeEditorValue(value); + valueSRID = 0; if (value instanceof Geometry) { this.valueSRID = ((Geometry) value).getSRID(); + } else if (value instanceof DBGeometry) { + this.valueSRID = ((DBGeometry) value).getSRID(); } if (valueSRID == 0) { DBSTypedObject column = valueController.getValueType(); @@ -51,19 +95,33 @@ public class GISTextViewer extends StringInlineEditor implements IGeometryViewer valueSRID = ((GisAttribute) column).getAttributeGeometrySRID(new VoidProgressMonitor()); } } + + updateToolBar(); + } + + private void updateToolBar() { + toolBarManager.removeAll(); + toolBarManager.add(ActionUtils.makeActionContribution(new SelectCRSAction(this), true)); + + toolBarManager.update(true); } @Override public Object extractEditorValue() throws DBCException { Object geometry = super.extractEditorValue(); - if (geometry instanceof Geometry) { - if (valueSRID != 0) { - ((Geometry) geometry).setSRID(valueSRID); - } - } return geometry; } + @Override + public void contributeActions(@NotNull IContributionManager manager, @NotNull IValueController controller) throws DBCException { + super.contributeActions(manager, controller); + } + + @Override + public Control getEditorControl() { + return getControl(); + } + @Override public int getValueSRID() { return valueSRID; @@ -72,6 +130,20 @@ public class GISTextViewer extends StringInlineEditor implements IGeometryViewer @Override public void setValueSRID(int srid) { this.valueSRID = srid; + + try { + Object geometry = extractEditorValue(); + if (geometry instanceof DBGeometry) { + ((DBGeometry) geometry).setSRID(valueSRID); + } else if (geometry instanceof Geometry) { + ((Geometry) geometry).setSRID(valueSRID); + } + valueController.updateValue(geometry, false); + } catch (DBCException e) { + log.error(e); + } + + updateToolBar(); } } diff --git a/plugins/org.jkiss.dbeaver.data.gis.view/src/org/jkiss/dbeaver/ui/gis/panel/SelectCRSAction.java b/plugins/org.jkiss.dbeaver.data.gis.view/src/org/jkiss/dbeaver/ui/gis/panel/SelectCRSAction.java new file mode 100644 index 0000000000000000000000000000000000000000..be0a01f024cf9ba909a710fe1e5603f3243b5b9b --- /dev/null +++ b/plugins/org.jkiss.dbeaver.data.gis.view/src/org/jkiss/dbeaver/ui/gis/panel/SelectCRSAction.java @@ -0,0 +1,106 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jkiss.dbeaver.ui.gis.panel; + +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IMenuCreator; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.action.Separator; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Menu; +import org.jkiss.dbeaver.model.gis.GisConstants; +import org.jkiss.dbeaver.ui.DBeaverIcons; +import org.jkiss.dbeaver.ui.UIIcon; +import org.jkiss.dbeaver.ui.UIUtils; +import org.jkiss.dbeaver.ui.gis.GeometryDataUtils; +import org.jkiss.dbeaver.ui.gis.IGeometryValueEditor; + +import java.util.List; + +class SelectCRSAction extends Action implements IMenuCreator { + + private MenuManager menuManager; + private IGeometryValueEditor valueEditor; + + public SelectCRSAction(IGeometryValueEditor valueEditor) { + super("EPSG:" + valueEditor.getValueSRID(), Action.AS_DROP_DOWN_MENU); + setImageDescriptor(DBeaverIcons.getImageDescriptor(UIIcon.CHART_LINE)); + this.valueEditor = valueEditor; + } + + @Override + public void run() { + SelectSRIDDialog manageCRSDialog = new SelectSRIDDialog( + UIUtils.getActiveWorkbenchShell(), + valueEditor.getValueSRID()); + if (manageCRSDialog.open() == IDialogConstants.OK_ID) { + valueEditor.setValueSRID(manageCRSDialog.getSelectedSRID()); + } + } + + @Override + public IMenuCreator getMenuCreator() { + return this; + } + + @Override + public void dispose() { + if (menuManager != null) { + menuManager.dispose(); + menuManager = null; + } + } + + @Override + public Menu getMenu(Control parent) { + if (menuManager == null) { + menuManager = new MenuManager(); + menuManager.setRemoveAllWhenShown(true); + menuManager.addMenuListener(manager -> { + menuManager.add(new SetCRSAction(valueEditor, GeometryDataUtils.getDefaultSRID())); + menuManager.add(new SetCRSAction(valueEditor, GisConstants.DEFAULT_OSM_SRID)); + menuManager.add(new Separator()); + List recentSRIDs = GISEditorUtils.getRecentSRIDs(); + if (!recentSRIDs.isEmpty()) { + for (Integer recentSRID : recentSRIDs) { + menuManager.add(new SetCRSAction(valueEditor, recentSRID)); + } + menuManager.add(new Separator()); + } + menuManager.add(new Action("Other ...") { + @Override + public void run() { + SelectCRSAction.this.run(); + } + }); + menuManager.add(new Action("Configuration ...") { + @Override + public void run() { + new GISViewerConfigurationDialog(valueEditor.getEditorControl().getShell()).open(); + } + }); + }); + } + return menuManager.createContextMenu(parent); + } + + @Override + public Menu getMenu(Menu parent) { + return null; + } +} diff --git a/plugins/org.jkiss.dbeaver.data.gis.view/src/org/jkiss/dbeaver/ui/gis/panel/SetCRSAction.java b/plugins/org.jkiss.dbeaver.data.gis.view/src/org/jkiss/dbeaver/ui/gis/panel/SetCRSAction.java new file mode 100644 index 0000000000000000000000000000000000000000..e092e72b3067f664142f50c848a8911afd42a8a1 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.data.gis.view/src/org/jkiss/dbeaver/ui/gis/panel/SetCRSAction.java @@ -0,0 +1,41 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jkiss.dbeaver.ui.gis.panel; + +import org.eclipse.jface.action.Action; +import org.jkiss.dbeaver.ui.gis.IGeometryValueEditor; + +class SetCRSAction extends Action { + private final IGeometryValueEditor valueEditor; + private final int srid; + + public SetCRSAction(IGeometryValueEditor valueEditor, int srid) { + super("EPSG:" + srid, AS_CHECK_BOX); + this.valueEditor = valueEditor; + this.srid = srid; + } + + @Override + public boolean isChecked() { + return srid == valueEditor.getValueSRID(); + } + + @Override + public void run() { + valueEditor.setValueSRID(srid); + } +} diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/editors/StringInlineEditor.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/editors/StringInlineEditor.java index ef60c83f4e07154a6673510d4e533bdb909a15d9..357fa55f5db4ebfd7117c66e328fa24ea39f7728 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/editors/StringInlineEditor.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/editors/StringInlineEditor.java @@ -50,13 +50,13 @@ public class StringInlineEditor extends BaseValueEditor { { final boolean inline = valueController.getEditType() == IValueController.EditType.INLINE; if (inline) { - final Text editor = new Text(valueController.getEditPlaceholder(), SWT.BORDER); + final Text editor = new Text(editPlaceholder, SWT.BORDER); //editor.setTextLimit(MAX_STRING_LENGTH); //editor.setFont(JFaceResources.getFont(JFaceResources.TEXT_FONT)); editor.setEditable(!valueController.isReadOnly()); return editor; } else { - final StyledText editor = new StyledText(valueController.getEditPlaceholder(), + final StyledText editor = new StyledText(editPlaceholder, SWT.MULTI | SWT.WRAP | SWT.V_SCROLL); //editor.setTextLimit(MAX_STRING_LENGTH); editor.setEditable(!valueController.isReadOnly());