diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/AbstractContextDescriptor.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/AbstractContextDescriptor.java index 0abaaa20b8676409af3019f2d96a945ad5e546a3..a6963fb0d2680d6b5bef56be0b808c7c5603c2b0 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/AbstractContextDescriptor.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/impl/AbstractContextDescriptor.java @@ -57,6 +57,10 @@ public abstract class AbstractContextDescriptor extends AbstractDescriptor return !objectTypes.isEmpty(); } + public List getObjectTypes() { + return objectTypes; + } + public boolean appliesTo(DBPObject object) { return appliesTo(object, null); diff --git a/plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/MultiPageDatabaseEditor.java b/plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/MultiPageDatabaseEditor.java index 203b6da40a5b2160be3ce560f0ad812d0ba42f1a..4d72ac129b7fae439124e1d0ac127e0fcd42bcab 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/MultiPageDatabaseEditor.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/MultiPageDatabaseEditor.java @@ -32,6 +32,9 @@ import org.jkiss.dbeaver.ui.css.DBStyles; */ public abstract class MultiPageDatabaseEditor extends MultiPageAbstractEditor implements IDatabaseEditor, DBPContextProvider { + public static final String PARAMETER_ACTIVE_PAGE = "activePage"; + public static final String PARAMETER_ACTIVE_FOLDER = "activeFolder"; + private DatabaseEditorListener listener; @Override diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/spreadsheet/Spreadsheet.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/spreadsheet/Spreadsheet.java index e0b0fcdbdcdf73383ff33f88cc9c4ede9b6e0593..4b3708a7e3a9a9350e453bea59093af65a606653 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/spreadsheet/Spreadsheet.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/spreadsheet/Spreadsheet.java @@ -36,6 +36,7 @@ import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.controls.lightgrid.*; import org.jkiss.dbeaver.ui.controls.resultset.AbstractPresentation; import org.jkiss.dbeaver.ui.controls.resultset.ResultSetPreferences; +import org.jkiss.utils.CommonUtils; /** * ResultSetControl @@ -280,8 +281,9 @@ public class Spreadsheet extends LightGrid implements Listener { GridPos pos = super.getCell(new Point(event.x, event.y)); GridPos focusPos = super.getFocusPos(); if (pos != null && focusPos != null && pos.equals(super.getFocusPos())) { - DoubleClickBehavior doubleClickBehavior = DoubleClickBehavior.valueOf( - presentation.getPreferenceStore().getString(ResultSetPreferences.RESULT_SET_DOUBLE_CLICK)); + DoubleClickBehavior doubleClickBehavior = CommonUtils.valueOf(DoubleClickBehavior.class, + presentation.getPreferenceStore().getString(ResultSetPreferences.RESULT_SET_DOUBLE_CLICK), + DoubleClickBehavior.NONE); switch (doubleClickBehavior) { case NONE: diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/preferences/PrefPageResultSetPresentation.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/preferences/PrefPageResultSetPresentation.java index 5f50dad8d967844a7a777403d30dcdbfb24f68ee..9113c485272b786c9de01711e8d125253256b986 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/preferences/PrefPageResultSetPresentation.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/editors/data/preferences/PrefPageResultSetPresentation.java @@ -174,7 +174,11 @@ public class PrefPageResultSetPresentation extends TargetPrefPage gridShowAttrFilters.setSelection(store.getBoolean(ResultSetPreferences.RESULT_SET_SHOW_ATTR_FILTERS)); gridShowAttrOrder.setSelection(store.getBoolean(ResultSetPreferences.RESULT_SET_SHOW_ATTR_ORDERING)); gridDoubleClickBehavior.select( - Spreadsheet.DoubleClickBehavior.valueOf(store.getString(ResultSetPreferences.RESULT_SET_DOUBLE_CLICK)).ordinal()); + CommonUtils.valueOf( + Spreadsheet.DoubleClickBehavior.class, + store.getString(ResultSetPreferences.RESULT_SET_DOUBLE_CLICK), + Spreadsheet.DoubleClickBehavior.NONE) + .ordinal()); autoSwitchMode.setSelection(store.getBoolean(ResultSetPreferences.RESULT_SET_AUTO_SWITCH_MODE)); showDescription.setSelection(store.getBoolean(ResultSetPreferences.RESULT_SET_SHOW_DESCRIPTION)); columnWidthByValue.setSelection(store.getBoolean(ResultSetPreferences.RESULT_SET_CALC_COLUMN_WIDTH_BY_VALUES)); @@ -206,7 +210,8 @@ public class PrefPageResultSetPresentation extends TargetPrefPage store.setValue(ResultSetPreferences.RESULT_SET_SHOW_ATTR_ICONS, gridShowAttrIcons.getSelection()); store.setValue(ResultSetPreferences.RESULT_SET_SHOW_ATTR_FILTERS, gridShowAttrFilters.getSelection()); store.setValue(ResultSetPreferences.RESULT_SET_SHOW_ATTR_ORDERING, gridShowAttrOrder.getSelection()); - store.setValue(ResultSetPreferences.RESULT_SET_DOUBLE_CLICK, CommonUtils.fromOrdinal(Spreadsheet.DoubleClickBehavior.class, gridDoubleClickBehavior.getSelectionIndex()).name()); + store.setValue(ResultSetPreferences.RESULT_SET_DOUBLE_CLICK, CommonUtils.fromOrdinal( + Spreadsheet.DoubleClickBehavior.class, gridDoubleClickBehavior.getSelectionIndex()).name()); store.setValue(ResultSetPreferences.RESULT_SET_AUTO_SWITCH_MODE, autoSwitchMode.getSelection()); store.setValue(ResultSetPreferences.RESULT_SET_SHOW_DESCRIPTION, showDescription.getSelection()); store.setValue(ResultSetPreferences.RESULT_SET_CALC_COLUMN_WIDTH_BY_VALUES, columnWidthByValue.getSelection()); diff --git a/plugins/org.jkiss.dbeaver.ui.navigator/plugin.xml b/plugins/org.jkiss.dbeaver.ui.navigator/plugin.xml index 8c0aeda23f9376f6f6c15ce411e5fa92c76b80d3..1903acf10c394d1bcfd93678fc46ad6780c1b3ba 100644 --- a/plugins/org.jkiss.dbeaver.ui.navigator/plugin.xml +++ b/plugins/org.jkiss.dbeaver.ui.navigator/plugin.xml @@ -213,7 +213,10 @@ - + + + + diff --git a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/editors/entity/EntityEditorsRegistry.java b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/editors/entity/EntityEditorsRegistry.java index 8c0b62cbb4c86005568e4b3f3639e178458238f8..1b122cbe3ade561b25de285e52987e9c71b9a2f6 100644 --- a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/editors/entity/EntityEditorsRegistry.java +++ b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/editors/entity/EntityEditorsRegistry.java @@ -87,6 +87,10 @@ public class EntityEditorsRegistry { return defaultEditor; } + public List getEntityEditors() { + return entityEditors; + } + public List getEntityEditors(DBPObject object, IEntityEditorContext context, String position) { List editors = new ArrayList<>(); final List positionList = diff --git a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/internal/UINavigatorMessages.java b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/internal/UINavigatorMessages.java index 8092b37dded255e76cf25ebfa1b0494a44340fe0..5f230bd5eff0290e120c56dfb5a669a8ae4cfcb6 100644 --- a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/internal/UINavigatorMessages.java +++ b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/internal/UINavigatorMessages.java @@ -105,6 +105,8 @@ public class UINavigatorMessages extends NLS { public static String pref_page_database_general_label_double_click_connection_open_sqleditor; public static String pref_page_database_general_label_double_click_connection_open_new_sqleditor; public static String pref_page_database_general_label_double_click_connection_expand_collapse; + public static String pref_page_navigator_default_editor_page_label; + public static String pref_page_navigator_default_editor_page_tip; // ProjectSettings public static String pref_page_projects_settings_label_resource_location; diff --git a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/internal/UINavigatorMessages.properties b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/internal/UINavigatorMessages.properties index 0cb393f0021d57d50bcfd2bc48c08ddb87f33527..3c00611ab3a571ca7b67f455fdfc71943dd32afc 100644 --- a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/internal/UINavigatorMessages.properties +++ b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/internal/UINavigatorMessages.properties @@ -81,6 +81,9 @@ pref_page_database_general_label_double_click_connection_conn_disconn = Connect pref_page_database_general_label_double_click_connection_open_sqleditor = Open SQL Editor pref_page_database_general_label_double_click_connection_open_new_sqleditor = Open new SQL Editor pref_page_database_general_label_double_click_connection_expand_collapse = Expand / Collapse +pref_page_navigator_default_editor_page_label = Default editor page +pref_page_navigator_default_editor_page_tip = Activates specified page in object editors. If not specified then activates default page + #ProjectSettings pref_page_projects_settings_label_resource_location = Resource locations diff --git a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/internal/UINavigatorPreferencesInitializer.java b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/internal/UINavigatorPreferencesInitializer.java index 9a6bcb68812c430780c5887b56fd89875c6cb402..7888320acef9fdd04350005cbe7bd78a5114904d 100644 --- a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/internal/UINavigatorPreferencesInitializer.java +++ b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/internal/UINavigatorPreferencesInitializer.java @@ -17,11 +17,9 @@ package org.jkiss.dbeaver.ui.internal; import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer; -import org.jkiss.dbeaver.ModelPreferences; import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore; import org.jkiss.dbeaver.runtime.DBWorkbench; import org.jkiss.dbeaver.ui.navigator.NavigatorPreferences; -import org.jkiss.dbeaver.ui.navigator.database.NavigatorViewBase; import org.jkiss.dbeaver.utils.PrefUtils; /** @@ -46,8 +44,9 @@ public class UINavigatorPreferencesInitializer extends AbstractPreferenceInitial PrefUtils.setDefaultPreferenceValue(store, NavigatorPreferences.NAVIGATOR_GROUP_BY_DRIVER, false); PrefUtils.setDefaultPreferenceValue(store, NavigatorPreferences.NAVIGATOR_EDITOR_SHOW_TABLE_GRID, true); - PrefUtils.setDefaultPreferenceValue(store, NavigatorPreferences.NAVIGATOR_OBJECT_DOUBLE_CLICK, NavigatorViewBase.DoubleClickBehavior.EDIT.name()); - PrefUtils.setDefaultPreferenceValue(store, NavigatorPreferences.NAVIGATOR_CONNECTION_DOUBLE_CLICK, NavigatorViewBase.DoubleClickBehavior.EXPAND.name()); + PrefUtils.setDefaultPreferenceValue(store, NavigatorPreferences.NAVIGATOR_OBJECT_DOUBLE_CLICK, NavigatorPreferences.DoubleClickBehavior.EDIT.name()); + PrefUtils.setDefaultPreferenceValue(store, NavigatorPreferences.NAVIGATOR_CONNECTION_DOUBLE_CLICK, NavigatorPreferences.DoubleClickBehavior.EXPAND.name()); + PrefUtils.setDefaultPreferenceValue(store, NavigatorPreferences.NAVIGATOR_DEFAULT_EDITOR_PAGE, ""); PrefUtils.setDefaultPreferenceValue(store, NavigatorPreferences.NAVIGATOR_SHOW_SQL_PREVIEW, true); PrefUtils.setDefaultPreferenceValue(store, NavigatorPreferences.NAVIGATOR_SHOW_OBJECT_TIPS, true); PrefUtils.setDefaultPreferenceValue(store, NavigatorPreferences.NAVIGATOR_LONG_LIST_FETCH_SIZE, 5000); diff --git a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/NavigatorPreferences.java b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/NavigatorPreferences.java index b431f9f30bdae7f73d25fabdf3e6b1675ac1f014..a4f2dd041e58c17414686018d5d894571c5f5b5c 100644 --- a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/NavigatorPreferences.java +++ b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/NavigatorPreferences.java @@ -31,6 +31,7 @@ public class NavigatorPreferences { public static final String NAVIGATOR_EDITOR_SHOW_TABLE_GRID = "navigator.editor.showGrid"; //$NON-NLS-1$ public static final String NAVIGATOR_OBJECT_DOUBLE_CLICK = "navigator.object.doubleClick"; //$NON-NLS-1$ public static final String NAVIGATOR_CONNECTION_DOUBLE_CLICK = "navigator.connection.doubleClick"; //$NON-NLS-1$ + public static final String NAVIGATOR_DEFAULT_EDITOR_PAGE = "navigator.object.defaultEditorPage"; //$NON-NLS-1$ public static final String NAVIGATOR_SHOW_SQL_PREVIEW = "navigator.editor.show.preview"; //$NON-NLS-1$ public static final String NAVIGATOR_SHOW_OBJECT_TIPS = "navigator.show.objects.tips"; //$NON-NLS-1$ public static final String NAVIGATOR_LONG_LIST_FETCH_SIZE = "navigator.long.list.fetch.size"; //$NON-NLS-1$ @@ -48,4 +49,11 @@ public class NavigatorPreferences { public static final int MIN_LONG_LIST_FETCH_SIZE = 100; + public enum DoubleClickBehavior { + EDIT, + CONNECT, + SQL_EDITOR, + EXPAND, + SQL_EDITOR_NEW + } } diff --git a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/NavigatorUtils.java b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/NavigatorUtils.java index 969e13981e0f0fee527b4176d32cc13b0e98e445..dc40539bcbfc516d642e32ef484c7d4a98703b82 100644 --- a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/NavigatorUtils.java +++ b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/NavigatorUtils.java @@ -49,6 +49,7 @@ import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.controls.ViewerColumnController; import org.jkiss.dbeaver.ui.dnd.DatabaseObjectTransfer; import org.jkiss.dbeaver.ui.dnd.TreeNodeTransfer; +import org.jkiss.dbeaver.ui.editors.MultiPageDatabaseEditor; import org.jkiss.dbeaver.ui.navigator.actions.NavigatorHandlerObjectOpen; import org.jkiss.dbeaver.ui.navigator.actions.NavigatorHandlerRefresh; import org.jkiss.dbeaver.ui.navigator.database.DatabaseNavigatorView; @@ -242,13 +243,17 @@ public class NavigatorUtils { } public static void executeNodeAction(DBXTreeNodeHandler.Action action, Object node, IServiceLocator serviceLocator) { + executeNodeAction(action, node, null, serviceLocator); + } + + public static void executeNodeAction(DBXTreeNodeHandler.Action action, Object node, Map parameters, IServiceLocator serviceLocator) { String defCommandId = null; if (action == DBXTreeNodeHandler.Action.open) { defCommandId = NavigatorCommands.CMD_OBJECT_OPEN; } String actionCommand = getNodeActionCommand(action, node, defCommandId); if (actionCommand != null) { - ActionUtils.runCommand(actionCommand, new StructuredSelection(node), serviceLocator); + ActionUtils.runCommand(actionCommand, new StructuredSelection(node), parameters, serviceLocator); } else { // do nothing // TODO: implement some other behavior @@ -551,15 +556,19 @@ public class NavigatorUtils { } public static void openNavigatorNode(Object node, IWorkbenchWindow window) { + + } + public static void openNavigatorNode(Object node, IWorkbenchWindow window, Map parameters) { if (node instanceof DBNResource) { UIServiceSQL serviceSQL = DBWorkbench.getService(UIServiceSQL.class); if (serviceSQL != null) { serviceSQL.openResource(((DBNResource) node).getResource()); } } else if (node instanceof DBNNode && ((DBNNode) node).allowsOpen()) { + Object activePage = parameters == null ? null : parameters.get(MultiPageDatabaseEditor.PARAMETER_ACTIVE_PAGE); NavigatorHandlerObjectOpen.openEntityEditor( (DBNNode) node, - null, + CommonUtils.toString(activePage, null), window); } } diff --git a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/actions/NavigatorHandlerObjectOpen.java b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/actions/NavigatorHandlerObjectOpen.java index a8a6e57019651fe5cf4060e32a87f7db101a90af..c1d7eaa40a4fdd6ae7c24840b50268e8d1729e9a 100644 --- a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/actions/NavigatorHandlerObjectOpen.java +++ b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/actions/NavigatorHandlerObjectOpen.java @@ -105,7 +105,7 @@ public class NavigatorHandlerObjectOpen extends NavigatorHandlerObjectBase imple } } if (node != null) { - NavigatorUtils.openNavigatorNode(node, HandlerUtil.getActiveWorkbenchWindow(event)); + NavigatorUtils.openNavigatorNode(node, HandlerUtil.getActiveWorkbenchWindow(event), event.getParameters()); } } } diff --git a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/database/NavigatorViewBase.java b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/database/NavigatorViewBase.java index 6a75dada626597178c60597c1fd3c8c5ce655673..fa316db72b17b5cd3253a76876954a5357d9491a 100644 --- a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/database/NavigatorViewBase.java +++ b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/database/NavigatorViewBase.java @@ -33,11 +33,13 @@ import org.jkiss.dbeaver.model.IDataSourceContainerProvider; import org.jkiss.dbeaver.model.navigator.*; import org.jkiss.dbeaver.model.navigator.meta.DBXTreeNodeHandler; import org.jkiss.dbeaver.model.preferences.DBPPreferenceListener; +import org.jkiss.dbeaver.model.struct.DBSDataContainer; import org.jkiss.dbeaver.runtime.DBWorkbench; import org.jkiss.dbeaver.runtime.ui.UIServiceConnections; import org.jkiss.dbeaver.runtime.ui.UIServiceSQL; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.controls.PropertyPageStandard; +import org.jkiss.dbeaver.ui.editors.MultiPageDatabaseEditor; import org.jkiss.dbeaver.ui.navigator.INavigatorFilter; import org.jkiss.dbeaver.ui.navigator.INavigatorModelView; import org.jkiss.dbeaver.ui.navigator.NavigatorPreferences; @@ -47,17 +49,11 @@ import org.jkiss.dbeaver.ui.navigator.database.load.TreeNodeSpecial; import org.jkiss.utils.CommonUtils; import java.util.Collection; +import java.util.Collections; +import java.util.Map; public abstract class NavigatorViewBase extends ViewPart implements INavigatorModelView, IDataSourceContainerProvider, DBPPreferenceListener { - public enum DoubleClickBehavior { - EDIT, - CONNECT, - SQL_EDITOR, - EXPAND, - SQL_EDITOR_NEW, - } - private DBNModel model; private DatabaseNavigatorTree tree; private transient Object lastSelection; @@ -126,8 +122,11 @@ public abstract class NavigatorViewBase extends ViewPart implements INavigatorMo if ((node instanceof DBNResource && ((DBNResource) node).getResource() instanceof IFolder)) { toggleNode(viewer, node); } else if (node instanceof DBNDataSource) { - DoubleClickBehavior dsBehaviorDefault = DoubleClickBehavior.valueOf(DBWorkbench.getPlatform().getPreferenceStore().getString(NavigatorPreferences.NAVIGATOR_CONNECTION_DOUBLE_CLICK)); - if (dsBehaviorDefault == DoubleClickBehavior.EXPAND) { + NavigatorPreferences.DoubleClickBehavior dsBehaviorDefault = CommonUtils.valueOf( + NavigatorPreferences.DoubleClickBehavior.class, + DBWorkbench.getPlatform().getPreferenceStore().getString(NavigatorPreferences.NAVIGATOR_CONNECTION_DOUBLE_CLICK), + NavigatorPreferences.DoubleClickBehavior.EDIT); + if (dsBehaviorDefault == NavigatorPreferences.DoubleClickBehavior.EXPAND) { toggleNode(viewer, node); } else { DBPDataSourceContainer dataSource = ((DBNDataSource) node).getObject(); @@ -137,10 +136,12 @@ public abstract class NavigatorViewBase extends ViewPart implements INavigatorMo break; case CONNECT: { UIServiceConnections serviceConnections = DBWorkbench.getService(UIServiceConnections.class); - if (dataSource.isConnected()) { - serviceConnections.disconnectDataSource(dataSource); - } else { - serviceConnections.connectDataSource(dataSource, null); + if (serviceConnections != null) { + if (dataSource.isConnected()) { + serviceConnections.disconnectDataSource(dataSource); + } else { + serviceConnections.connectDataSource(dataSource, null); + } } break; } @@ -163,12 +164,23 @@ public abstract class NavigatorViewBase extends ViewPart implements INavigatorMo } else if (node instanceof TreeNodeSpecial) { ((TreeNodeSpecial) node).handleDefaultAction(navigatorTree); } else { - DoubleClickBehavior dcBehaviorDefault = DoubleClickBehavior.valueOf(DBWorkbench.getPlatform().getPreferenceStore().getString(NavigatorPreferences.NAVIGATOR_OBJECT_DOUBLE_CLICK)); + String defaultEditorPageId = null; + NavigatorPreferences.DoubleClickBehavior dcBehaviorDefault = CommonUtils.valueOf( + NavigatorPreferences.DoubleClickBehavior.class, + DBWorkbench.getPlatform().getPreferenceStore().getString(NavigatorPreferences.NAVIGATOR_OBJECT_DOUBLE_CLICK)); + + if (node instanceof DBNDatabaseNode && ((DBNDatabaseNode) node).getObject() instanceof DBSDataContainer) { + defaultEditorPageId = DBWorkbench.getPlatform().getPreferenceStore().getString(NavigatorPreferences.NAVIGATOR_DEFAULT_EDITOR_PAGE); + } boolean hasChildren = node instanceof DBNNode && ((DBNNode) node).hasChildren(true); - if (hasChildren && dcBehaviorDefault == DoubleClickBehavior.EXPAND) { + if (hasChildren && dcBehaviorDefault == NavigatorPreferences.DoubleClickBehavior.EXPAND) { toggleNode(viewer, node); } else { - NavigatorUtils.executeNodeAction(DBXTreeNodeHandler.Action.open, node, getSite()); + Map parameters = null; + if (!CommonUtils.isEmpty(defaultEditorPageId)) { + parameters = Collections.singletonMap(MultiPageDatabaseEditor.PARAMETER_ACTIVE_PAGE, defaultEditorPageId); + } + NavigatorUtils.executeNodeAction(DBXTreeNodeHandler.Action.open, node, parameters, getSite()); } } } @@ -192,7 +204,7 @@ public abstract class NavigatorViewBase extends ViewPart implements INavigatorMo } } - protected void onSelectionChange(IStructuredSelection structSel) { + private void onSelectionChange(IStructuredSelection structSel) { if (!structSel.isEmpty()) { lastSelection = structSel.getFirstElement(); if (lastSelection instanceof DBNNode) { diff --git a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/preferences/PrefPageDatabaseNavigator.java b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/preferences/PrefPageDatabaseNavigator.java index dc251c9d0c01933b03ea7f3e170a6c34430efbc9..140b136f29faac0eb7cfd37fbe9f416e4e5216d1 100644 --- a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/preferences/PrefPageDatabaseNavigator.java +++ b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/preferences/PrefPageDatabaseNavigator.java @@ -25,15 +25,23 @@ import org.eclipse.ui.IWorkbenchPreferencePage; import org.eclipse.ui.IWorkbenchPropertyPage; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.ModelPreferences; -import org.jkiss.dbeaver.ui.internal.UINavigatorMessages; +import org.jkiss.dbeaver.model.impl.AbstractDescriptor; import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore; +import org.jkiss.dbeaver.model.struct.DBSDataContainer; +import org.jkiss.dbeaver.model.struct.DBSEntity; +import org.jkiss.dbeaver.model.struct.DBSObjectContainer; import org.jkiss.dbeaver.runtime.DBWorkbench; import org.jkiss.dbeaver.ui.UIUtils; +import org.jkiss.dbeaver.ui.editors.entity.EntityEditorDescriptor; +import org.jkiss.dbeaver.ui.editors.entity.EntityEditorsRegistry; +import org.jkiss.dbeaver.ui.internal.UINavigatorMessages; import org.jkiss.dbeaver.ui.navigator.NavigatorPreferences; -import org.jkiss.dbeaver.ui.navigator.database.NavigatorViewBase; import org.jkiss.dbeaver.utils.PrefUtils; import org.jkiss.utils.CommonUtils; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; import java.util.Locale; /** @@ -53,6 +61,7 @@ public class PrefPageDatabaseNavigator extends AbstractPrefPage implements IWork private Text longListFetchSizeText; private Combo dsDoubleClickBehavior; private Combo objDoubleClickBehavior; + private Combo defaultEditorPageCombo; public PrefPageDatabaseNavigator() { @@ -94,11 +103,13 @@ public class PrefPageDatabaseNavigator extends AbstractPrefPage implements IWork objDoubleClickBehavior.add(UINavigatorMessages.pref_page_database_general_label_double_click_node_expand_collapse, 1); dsDoubleClickBehavior = UIUtils.createLabelCombo(navigatorGroup, UINavigatorMessages.pref_page_database_general_label_double_click_connection, SWT.DROP_DOWN | SWT.READ_ONLY); - dsDoubleClickBehavior.add(UINavigatorMessages.pref_page_database_general_label_double_click_connection_open_properties, NavigatorViewBase.DoubleClickBehavior.EDIT.ordinal()); - dsDoubleClickBehavior.add(UINavigatorMessages.pref_page_database_general_label_double_click_connection_conn_disconn, NavigatorViewBase.DoubleClickBehavior.CONNECT.ordinal()); - dsDoubleClickBehavior.add(UINavigatorMessages.pref_page_database_general_label_double_click_connection_open_sqleditor, NavigatorViewBase.DoubleClickBehavior.SQL_EDITOR.ordinal()); - dsDoubleClickBehavior.add(UINavigatorMessages.pref_page_database_general_label_double_click_connection_expand_collapse, NavigatorViewBase.DoubleClickBehavior.EXPAND.ordinal()); - dsDoubleClickBehavior.add(UINavigatorMessages.pref_page_database_general_label_double_click_connection_open_new_sqleditor, NavigatorViewBase.DoubleClickBehavior.SQL_EDITOR_NEW.ordinal()); + dsDoubleClickBehavior.add(UINavigatorMessages.pref_page_database_general_label_double_click_connection_open_properties, NavigatorPreferences.DoubleClickBehavior.EDIT.ordinal()); + dsDoubleClickBehavior.add(UINavigatorMessages.pref_page_database_general_label_double_click_connection_conn_disconn, NavigatorPreferences.DoubleClickBehavior.CONNECT.ordinal()); + dsDoubleClickBehavior.add(UINavigatorMessages.pref_page_database_general_label_double_click_connection_open_sqleditor, NavigatorPreferences.DoubleClickBehavior.SQL_EDITOR.ordinal()); + dsDoubleClickBehavior.add(UINavigatorMessages.pref_page_database_general_label_double_click_connection_expand_collapse, NavigatorPreferences.DoubleClickBehavior.EXPAND.ordinal()); + dsDoubleClickBehavior.add(UINavigatorMessages.pref_page_database_general_label_double_click_connection_open_new_sqleditor, NavigatorPreferences.DoubleClickBehavior.SQL_EDITOR_NEW.ordinal()); + + defaultEditorPageCombo = UIUtils.createLabelCombo(navigatorGroup, UINavigatorMessages.pref_page_navigator_default_editor_page_label, UINavigatorMessages.pref_page_navigator_default_editor_page_tip, SWT.DROP_DOWN | SWT.READ_ONLY); } performDefaults(); @@ -119,10 +130,24 @@ public class PrefPageDatabaseNavigator extends AbstractPrefPage implements IWork showResourceFolderPlaceholdersCheck.setSelection(store.getBoolean(ModelPreferences.NAVIGATOR_SHOW_FOLDER_PLACEHOLDERS)); groupByDriverCheck.setSelection(store.getBoolean(NavigatorPreferences.NAVIGATOR_GROUP_BY_DRIVER)); longListFetchSizeText.setText(store.getString(NavigatorPreferences.NAVIGATOR_LONG_LIST_FETCH_SIZE)); - NavigatorViewBase.DoubleClickBehavior objDCB = NavigatorViewBase.DoubleClickBehavior.valueOf(store.getString(NavigatorPreferences.NAVIGATOR_OBJECT_DOUBLE_CLICK)); - objDoubleClickBehavior.select(objDCB == NavigatorViewBase.DoubleClickBehavior.EXPAND ? 1 : 0); + NavigatorPreferences.DoubleClickBehavior objDCB = CommonUtils.valueOf(NavigatorPreferences.DoubleClickBehavior.class, store.getString(NavigatorPreferences.NAVIGATOR_OBJECT_DOUBLE_CLICK)); + objDoubleClickBehavior.select(objDCB == NavigatorPreferences.DoubleClickBehavior.EXPAND ? 1 : 0); dsDoubleClickBehavior.select( - NavigatorViewBase.DoubleClickBehavior.valueOf(store.getString(NavigatorPreferences.NAVIGATOR_CONNECTION_DOUBLE_CLICK)).ordinal()); + CommonUtils.valueOf( + NavigatorPreferences.DoubleClickBehavior.class, + store.getString(NavigatorPreferences.NAVIGATOR_CONNECTION_DOUBLE_CLICK), + NavigatorPreferences.DoubleClickBehavior.EDIT) + .ordinal()); + + String defEditorPage = store.getString(NavigatorPreferences.NAVIGATOR_DEFAULT_EDITOR_PAGE); + List entityEditors = getAvailableEditorPages(); + defaultEditorPageCombo.add(""); + for (EntityEditorDescriptor eed : entityEditors) { + defaultEditorPageCombo.add(eed.getName()); + if (eed.getId().equals(defEditorPage)) { + defaultEditorPageCombo.select(defaultEditorPageCombo.getItemCount() - 1); + } + } } @Override @@ -138,19 +163,41 @@ public class PrefPageDatabaseNavigator extends AbstractPrefPage implements IWork store.setValue(ModelPreferences.NAVIGATOR_SHOW_FOLDER_PLACEHOLDERS, showResourceFolderPlaceholdersCheck.getSelection()); store.setValue(NavigatorPreferences.NAVIGATOR_GROUP_BY_DRIVER, groupByDriverCheck.getSelection()); store.setValue(NavigatorPreferences.NAVIGATOR_LONG_LIST_FETCH_SIZE, longListFetchSizeText.getText()); - NavigatorViewBase.DoubleClickBehavior objDCB = NavigatorViewBase.DoubleClickBehavior.EXPAND; + NavigatorPreferences.DoubleClickBehavior objDCB = NavigatorPreferences.DoubleClickBehavior.EXPAND; if (objDoubleClickBehavior.getSelectionIndex() == 0) { - objDCB = NavigatorViewBase.DoubleClickBehavior.EDIT; + objDCB = NavigatorPreferences.DoubleClickBehavior.EDIT; } store.setValue(NavigatorPreferences.NAVIGATOR_OBJECT_DOUBLE_CLICK, objDCB.name()); store.setValue(NavigatorPreferences.NAVIGATOR_CONNECTION_DOUBLE_CLICK, - CommonUtils.fromOrdinal(NavigatorViewBase.DoubleClickBehavior.class, dsDoubleClickBehavior.getSelectionIndex()).name()); + CommonUtils.fromOrdinal(NavigatorPreferences.DoubleClickBehavior.class, dsDoubleClickBehavior.getSelectionIndex()).name()); + + List entityEditors = getAvailableEditorPages(); + int defEditorIndex = defaultEditorPageCombo.getSelectionIndex(); + store.setValue(NavigatorPreferences.NAVIGATOR_DEFAULT_EDITOR_PAGE, defEditorIndex == 0 ? "" : entityEditors.get(defEditorIndex - 1).getId()); PrefUtils.savePreferenceStore(store); return true; } + private List getAvailableEditorPages() { + List editors = new ArrayList<>(EntityEditorsRegistry.getInstance().getEntityEditors()); + editors.removeIf(editor -> { + if (editor.getType() != EntityEditorDescriptor.Type.editor) return true; + for (AbstractDescriptor.ObjectType ot : editor.getObjectTypes()) { + if (!DBSDataContainer.class.getName().equals(ot.getImplName()) && + !DBSObjectContainer.class.getName().equals(ot.getImplName()) && + !DBSEntity.class.getName().equals(ot.getImplName())) + { + return true; + } + } + return false; + }); + editors.sort(Comparator.comparing(EntityEditorDescriptor::getName)); + return editors; + } + @Override public void applyData(Object data) { diff --git a/plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/ActionUtils.java b/plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/ActionUtils.java index f6e5070ba21736a2b491729129bbbbbd97db4ab3..d2d6bdbca3f6b48fc6f924ada18076953570811a 100644 --- a/plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/ActionUtils.java +++ b/plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/ActionUtils.java @@ -18,6 +18,8 @@ package org.jkiss.dbeaver.ui; import org.eclipse.core.commands.Command; +import org.eclipse.core.commands.IParameter; +import org.eclipse.core.commands.Parameterization; import org.eclipse.core.commands.ParameterizedCommand; import org.eclipse.core.commands.common.NotDefinedException; import org.eclipse.core.expressions.EvaluationContext; @@ -32,7 +34,6 @@ import org.eclipse.jface.commands.ToggleState; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.swt.graphics.Image; import org.eclipse.ui.*; import org.eclipse.ui.commands.ICommandImageService; import org.eclipse.ui.commands.ICommandService; @@ -49,6 +50,8 @@ import org.jkiss.dbeaver.model.DBPImage; import org.jkiss.dbeaver.runtime.DBWorkbench; import org.jkiss.utils.CommonUtils; +import java.util.Map; + /** * Action utils */ @@ -271,6 +274,11 @@ public class ActionUtils } public static void runCommand(String commandId, ISelection selection, IServiceLocator serviceLocator) + { + runCommand(commandId, selection, null, serviceLocator); + } + + public static void runCommand(String commandId, ISelection selection, Map parameters, IServiceLocator serviceLocator) { if (commandId != null) { try { @@ -293,6 +301,24 @@ public class ActionUtils } } } + + Parameterization[] parametrization = null; + + if (!CommonUtils.isEmpty(parameters)) { + parametrization = new Parameterization[parameters.size()]; + int paramIndex = 0; + for (Map.Entry param : parameters.entrySet()) { + IParameter parameter = command.getParameter(param.getKey()); + if (parameter != null) { + parametrization[paramIndex] = new Parameterization(parameter, CommonUtils.toString(param.getValue())); + } else { + log.debug("Parameter '" + param.getKey() + "' not found in command '" + commandId + "'"); + parametrization[paramIndex] = null; + } + paramIndex++; + } + } + if (selection != null && needContextPatch) { // Create new eval context IEvaluationContext context = new EvaluationContext( @@ -302,11 +328,12 @@ public class ActionUtils } context.addVariable(ISources.ACTIVE_CURRENT_SELECTION_NAME, selection); - ParameterizedCommand pc = new ParameterizedCommand(command, null); + ParameterizedCommand pc = new ParameterizedCommand(command, parametrization); handlerService.executeCommandInContext(pc, null, context); } else if (command != null) { if (command.isEnabled()) { - handlerService.executeCommand(commandId, null); + ParameterizedCommand pc = new ParameterizedCommand(command, parametrization); + handlerService.executeCommand(pc, null); } else { log.warn("Command '" + commandId + "' is disabled"); }