diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/DBeaverUI.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/DBeaverUI.java index 6a6a23408adf8998f6ed7e347fdc0be314ad3331..9c88d1d3b124d7b9f5891a69a168e6cbeb1d3daf 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/DBeaverUI.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/core/DBeaverUI.java @@ -296,23 +296,23 @@ public class DBeaverUI implements DBPPlatformUI { } @Override - public DBNNode selectObject(Object parentShell, String title, DBNNode rootNode, DBNNode selectedNode, Class[] allowedTypes, Class[] resultTypes, Class[] leafTypes) { + public DBNNode selectObject(@NotNull Object parentShell, String title, DBNNode rootNode, DBNNode selectedNode, Class[] allowedTypes, Class[] resultTypes, Class[] leafTypes) { Shell shell = (parentShell instanceof Shell ? (Shell)parentShell : UIUtils.getActiveWorkbenchShell()); return BrowseObjectDialog.selectObject(shell, title, rootNode, selectedNode, allowedTypes, resultTypes, leafTypes); } @Override - public void openEntityEditor(DBSObject object) { + public void openEntityEditor(@NotNull DBSObject object) { NavigatorHandlerObjectOpen.openEntityEditor(object); } @Override - public void openEntityEditor(DBNNode selectedNode, String defaultPageId) { + public void openEntityEditor(@NotNull DBNNode selectedNode, String defaultPageId) { NavigatorHandlerObjectOpen.openEntityEditor(selectedNode, defaultPageId, UIUtils.getActiveWorkbenchWindow()); } @Override - public void openConnectionEditor(DBPDataSourceContainer dataSourceContainer) { + public void openConnectionEditor(@NotNull DBPDataSourceContainer dataSourceContainer) { UIUtils.syncExec(() -> NavigatorHandlerObjectOpen.openConnectionEditor( UIUtils.getActiveWorkbenchWindow(), @@ -320,7 +320,7 @@ public class DBeaverUI implements DBPPlatformUI { } @Override - public void executeProcess(final DBRProcessDescriptor processDescriptor) { + public void executeProcess(@NotNull final DBRProcessDescriptor processDescriptor) { processDescriptor.setProcessListener(new DBRProcessListener() { @Override public void onProcessStarted() { @@ -356,10 +356,11 @@ public class DBeaverUI implements DBPPlatformUI { } @Override - public void executeInUI(Runnable runnable) { + public void executeInUI(@NotNull Runnable runnable) { UIUtils.syncExec(runnable); } + @NotNull @Override public Job createLoadingService(ILoadService loadingService, ILoadVisualizer visualizer) { return LoadingJob.createService(loadingService, visualizer); diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/views/session/SessionManagerViewer.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/views/session/SessionManagerViewer.java index 66df6ac246520bb05808f4ba9784065b90fedd01..8e7db5cc43a7573a1dcb87c0c11fb7c70e3029e0 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/views/session/SessionManagerViewer.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/views/session/SessionManagerViewer.java @@ -61,7 +61,7 @@ import org.jkiss.dbeaver.runtime.properties.PropertyCollector; import org.jkiss.dbeaver.ui.*; import org.jkiss.dbeaver.ui.controls.ListContentProvider; import org.jkiss.dbeaver.ui.controls.autorefresh.AutoRefreshControl; -import org.jkiss.dbeaver.ui.controls.itemlist.DatabaseObjectListControl; +import org.jkiss.dbeaver.ui.navigator.itemlist.DatabaseObjectListControl; import org.jkiss.dbeaver.ui.editors.StringEditorInput; import org.jkiss.dbeaver.ui.editors.SubEditorSite; import org.jkiss.dbeaver.ui.editors.sql.SQLEditorBase; diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/views/session/SessionTable.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/views/session/SessionTable.java index 2b5731c84e116ae9b296fc3305369f694a3edeee..6e62722425cf2aa77b932dc78ec6faeb92fa251d 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/views/session/SessionTable.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/views/session/SessionTable.java @@ -30,7 +30,7 @@ import org.jkiss.dbeaver.model.exec.DBCSession; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.runtime.load.DatabaseLoadService; import org.jkiss.dbeaver.ui.LoadingJob; -import org.jkiss.dbeaver.ui.controls.itemlist.DatabaseObjectListControl; +import org.jkiss.dbeaver.ui.navigator.itemlist.DatabaseObjectListControl; import java.lang.reflect.InvocationTargetException; import java.util.Collection; diff --git a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/page/DatabaseConsumerPageMapping.java b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/page/DatabaseConsumerPageMapping.java index 107377b7fe16bc3fdcdaec3dd0c8a6838c3c104f..8c8f6f58460a2e7fcd18490f216d1ccfb679530e 100644 --- a/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/page/DatabaseConsumerPageMapping.java +++ b/plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/page/DatabaseConsumerPageMapping.java @@ -27,6 +27,7 @@ import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.*; +import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBIcon; @@ -35,10 +36,11 @@ import org.jkiss.dbeaver.model.DBPEvaluationContext; import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.app.DBPProject; import org.jkiss.dbeaver.model.impl.DBObjectNameCaseTransformer; -import org.jkiss.dbeaver.model.navigator.*; +import org.jkiss.dbeaver.model.navigator.DBNDataSource; +import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode; +import org.jkiss.dbeaver.model.navigator.DBNNode; import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; import org.jkiss.dbeaver.model.struct.*; -import org.jkiss.dbeaver.model.struct.rdb.DBSSchema; import org.jkiss.dbeaver.runtime.DBWorkbench; import org.jkiss.dbeaver.runtime.ui.UIServiceSQL; import org.jkiss.dbeaver.tools.transfer.database.*; @@ -50,6 +52,7 @@ import org.jkiss.dbeaver.ui.SharedTextColors; import org.jkiss.dbeaver.ui.UIIcon; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.controls.CustomComboBoxCellEditor; +import org.jkiss.dbeaver.ui.controls.ObjectContainerSelectorPanel; import org.jkiss.dbeaver.ui.controls.TreeContentProvider; import org.jkiss.dbeaver.ui.dialogs.ActiveWizardPage; import org.jkiss.dbeaver.ui.dialogs.EnterNameDialog; @@ -64,9 +67,8 @@ public class DatabaseConsumerPageMapping extends ActiveWizardPage[] allowedTypes, Class[] resultTypes, Class[] leafTypes) { + public DBNNode selectObject(@NotNull Object parentShell, String title, DBNNode rootNode, DBNNode selectedNode, Class[] allowedTypes, Class[] resultTypes, Class[] leafTypes) { return null; } @Override - public void openEntityEditor(DBSObject object) { + public void openEntityEditor(@NotNull DBSObject object) { throw new IllegalStateException("Editors not supported in console mode"); } @Override - public void openEntityEditor(DBNNode selectedNode, String defaultPageId) { + public void openEntityEditor(@NotNull DBNNode selectedNode, String defaultPageId) { throw new IllegalStateException("Editors not supported in console mode"); } @Override - public void openConnectionEditor(DBPDataSourceContainer dataSourceContainer) { + public void openConnectionEditor(@NotNull DBPDataSourceContainer dataSourceContainer) { // do nothing } @Override - public void executeProcess(DBRProcessDescriptor processDescriptor) { + public void executeProcess(@NotNull DBRProcessDescriptor processDescriptor) { try { processDescriptor.execute(); } catch (DBException e) { @@ -138,10 +138,11 @@ public class ConsoleUserInterface implements DBPPlatformUI { } @Override - public void executeInUI(Runnable runnable) { + public void executeInUI(@NotNull Runnable runnable) { runnable.run(); } + @NotNull @Override public Job createLoadingService(ILoadService loadingService, ILoadVisualizer visualizer) { throw new IllegalStateException("Loading jobs not supported in console mode"); diff --git a/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/ObjectACLEditor.java b/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/ObjectACLEditor.java index 8ebc882ef6bc41b8abdf761fbfc69929478c285f..6a0d5d856444fc39dc9741cff757828a5712153d 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/ObjectACLEditor.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.acl/src/org/jkiss/dbeaver/ui/editors/acl/ObjectACLEditor.java @@ -51,7 +51,7 @@ import org.jkiss.dbeaver.ui.LoadingJob; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.controls.ListContentProvider; import org.jkiss.dbeaver.ui.controls.ProgressPageControl; -import org.jkiss.dbeaver.ui.controls.itemlist.ObjectListControl; +import org.jkiss.dbeaver.ui.navigator.itemlist.ObjectListControl; import org.jkiss.dbeaver.ui.editors.AbstractDatabaseObjectEditor; import org.jkiss.dbeaver.ui.editors.DatabaseEditorUtils; import org.jkiss.dbeaver.ui.navigator.NavigatorUtils; diff --git a/plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/object/struct/EditForeignKeyPage.java b/plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/object/struct/EditForeignKeyPage.java index 9d436c204c200b3bd09e8b849342a7bd24235851..33d78959764df93e620282c519ecf80e6ecb5d9a 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/object/struct/EditForeignKeyPage.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.base/src/org/jkiss/dbeaver/ui/editors/object/struct/EditForeignKeyPage.java @@ -27,6 +27,7 @@ import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.*; +import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBPDataSourceInfo; @@ -44,6 +45,7 @@ import org.jkiss.dbeaver.runtime.DBWorkbench; import org.jkiss.dbeaver.ui.DBeaverIcons; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.controls.CSmartCombo; +import org.jkiss.dbeaver.ui.controls.ObjectContainerSelectorPanel; import org.jkiss.dbeaver.ui.editors.internal.EditorsMessages; import org.jkiss.utils.ArrayUtils; import org.jkiss.utils.CommonUtils; @@ -123,15 +125,16 @@ public class EditForeignKeyPage extends BaseObjectEditPage { panel.setLayoutData(new GridData(GridData.FILL_BOTH)); { - final Composite tableGroup = UIUtils.createPlaceholder(panel, 2, 5); + final Composite tableGroup = UIUtils.createComposite(panel, 2); tableGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); UIUtils.createLabelText(tableGroup, EditorsMessages.dialog_struct_edit_fk_label_table, DBUtils.getObjectFullName(foreignKey.getParentObject(), DBPEvaluationContext.UI), SWT.READ_ONLY | SWT.BORDER); try { if (ownerTableNode != null) { - createSchemaSelector(tableGroup); + createSchemaSelector(tableGroup); } else if (foreignKey instanceof DBVEntityForeignKey) { // Virtual key - add container selector + createContainerSelector(tableGroup); } } catch (Throwable e) { log.debug("Can't create schema selector", e); @@ -318,7 +321,23 @@ public class EditForeignKeyPage extends BaseObjectEditPage { } private void createContainerSelector(Composite tableGroup) throws DBException { + ObjectContainerSelectorPanel containerPanel = new ObjectContainerSelectorPanel(tableGroup, "Reference table container") { + @Nullable + @Override + protected DBNNode getSelectedNode() { + return DBWorkbench.getPlatform().getNavigatorModel().getNodeByObject( + ownerTableNode != null ? ownerTableNode.getObject() : foreignKey.getDataSource()); + } + @Override + protected void setSelectedNode(DBNDatabaseNode node) { + ownerTableNode = node; + setContainerInfo(node.getNodeIconDefault(), node.getNodeFullName()); + } + }; + GridData gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan = 2; + containerPanel.setLayoutData(gd); } private void loadTableList(DBNDatabaseNode newContainerNode) { diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/panel/metadata/MetaDataPanel.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/panel/metadata/MetaDataPanel.java index f957569f7e3b3abe958a81746b607c55d5cb5110..6c2dba40cd713b6e867c129375636507e107b5ce 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/panel/metadata/MetaDataPanel.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/controls/resultset/panel/metadata/MetaDataPanel.java @@ -37,7 +37,7 @@ import org.jkiss.dbeaver.model.runtime.load.DatabaseLoadService; import org.jkiss.dbeaver.ui.LoadingJob; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.controls.TreeContentProvider; -import org.jkiss.dbeaver.ui.controls.itemlist.DatabaseObjectListControl; +import org.jkiss.dbeaver.ui.navigator.itemlist.DatabaseObjectListControl; import org.jkiss.dbeaver.ui.controls.resultset.IResultSetPanel; import org.jkiss.dbeaver.ui.controls.resultset.IResultSetPresentation; import org.jkiss.utils.CommonUtils; diff --git a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/plan/simple/PlanNodesTree.java b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/plan/simple/PlanNodesTree.java index 885f3c3a988b8974f15914cad2958724e7ab7fb3..6e35b7a7bc8f7fde2b4e1d8a2417c4c9e0553b74 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/plan/simple/PlanNodesTree.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.sql/src/org/jkiss/dbeaver/ui/editors/sql/plan/simple/PlanNodesTree.java @@ -28,7 +28,7 @@ import org.jkiss.dbeaver.model.exec.plan.DBCPlanNode; import org.jkiss.dbeaver.model.struct.DBSObject; import org.jkiss.dbeaver.ui.LoadingJob; import org.jkiss.dbeaver.ui.controls.ObjectViewerRenderer; -import org.jkiss.dbeaver.ui.controls.itemlist.DatabaseObjectListControl; +import org.jkiss.dbeaver.ui.navigator.itemlist.DatabaseObjectListControl; import org.jkiss.dbeaver.ui.navigator.actions.NavigatorHandlerObjectOpen; import org.jkiss.utils.CommonUtils; diff --git a/plugins/org.jkiss.dbeaver.ui.navigator/META-INF/MANIFEST.MF b/plugins/org.jkiss.dbeaver.ui.navigator/META-INF/MANIFEST.MF index 635a107fb15f4ccc81276ace26447976061df258..aa7df05f1f96880cd88002ef93add4adce1bedf0 100644 --- a/plugins/org.jkiss.dbeaver.ui.navigator/META-INF/MANIFEST.MF +++ b/plugins/org.jkiss.dbeaver.ui.navigator/META-INF/MANIFEST.MF @@ -29,8 +29,6 @@ Require-Bundle: org.eclipse.equinox.preferences, Export-Package: org.jkiss.dbeaver.ui.controls, org.jkiss.dbeaver.ui.actions, org.jkiss.dbeaver.ui.actions.datasource, - org.jkiss.dbeaver.ui.controls.itemlist, - org.jkiss.dbeaver.ui.navigator, org.jkiss.dbeaver.ui.editors.entity, org.jkiss.dbeaver.ui.editors.entity.handlers, org.jkiss.dbeaver.ui.editors.entity.properties, @@ -40,6 +38,7 @@ Export-Package: org.jkiss.dbeaver.ui.controls, org.jkiss.dbeaver.ui.navigator.database, org.jkiss.dbeaver.ui.navigator.database.load, org.jkiss.dbeaver.ui.navigator.dialogs, + org.jkiss.dbeaver.ui.navigator.itemlist, org.jkiss.dbeaver.ui.navigator.project, org.jkiss.dbeaver.ui.preferences, org.jkiss.dbeaver.ui.project, diff --git a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/actions/datasource/DataSourceManagementToolbar.java b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/actions/datasource/DataSourceManagementToolbar.java deleted file mode 100644 index 5aeeab196aab8c4ed1e9d9106e3f5050fc16fe07..0000000000000000000000000000000000000000 --- a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/actions/datasource/DataSourceManagementToolbar.java +++ /dev/null @@ -1,867 +0,0 @@ -/* - * 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.actions.datasource; - -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.jobs.IJobChangeEvent; -import org.eclipse.core.runtime.jobs.JobChangeAdapter; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.FocusEvent; -import org.eclipse.swt.events.FocusListener; -import org.eclipse.swt.layout.RowData; -import org.eclipse.swt.layout.RowLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.*; -import org.eclipse.ui.internal.WorkbenchWindow; -import org.eclipse.ui.menus.WorkbenchWindowControlContribution; -import org.jkiss.code.NotNull; -import org.jkiss.code.Nullable; -import org.jkiss.dbeaver.DBException; -import org.jkiss.dbeaver.Log; -import org.jkiss.dbeaver.model.*; -import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry; -import org.jkiss.dbeaver.model.app.DBPProject; -import org.jkiss.dbeaver.model.app.DBPRegistryListener; -import org.jkiss.dbeaver.model.exec.DBCExecutionContext; -import org.jkiss.dbeaver.model.navigator.*; -import org.jkiss.dbeaver.model.preferences.DBPPreferenceListener; -import org.jkiss.dbeaver.model.runtime.AbstractJob; -import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; -import org.jkiss.dbeaver.model.struct.DBSObject; -import org.jkiss.dbeaver.model.struct.DBSObjectContainer; -import org.jkiss.dbeaver.model.struct.DBSObjectSelector; -import org.jkiss.dbeaver.registry.DataSourceProviderRegistry; -import org.jkiss.dbeaver.registry.DataSourceRegistry; -import org.jkiss.dbeaver.runtime.DBWorkbench; -import org.jkiss.dbeaver.runtime.jobs.DataSourceJob; -import org.jkiss.dbeaver.ui.AbstractPartListener; -import org.jkiss.dbeaver.ui.IActionConstants; -import org.jkiss.dbeaver.ui.UIUtils; -import org.jkiss.dbeaver.ui.actions.AbstractPageListener; -import org.jkiss.dbeaver.ui.controls.CSmartSelector; -import org.jkiss.dbeaver.ui.controls.DatabaseLabelProviders; -import org.jkiss.dbeaver.ui.controls.SelectDataSourceCombo; -import org.jkiss.dbeaver.ui.editors.EditorUtils; -import org.jkiss.dbeaver.ui.internal.UINavigatorMessages; -import org.jkiss.dbeaver.ui.navigator.dialogs.SelectDatabaseDialog; -import org.jkiss.dbeaver.utils.GeneralUtils; -import org.jkiss.dbeaver.utils.RuntimeUtils; -import org.jkiss.utils.CommonUtils; - -import java.lang.ref.SoftReference; -import java.text.MessageFormat; -import java.util.*; - -/** - * DataSource Toolbar - * Deprecated. Everything was moved to org.jkiss.dbeaver.ui.actions.datasource.* - */ -@Deprecated -public class DataSourceManagementToolbar implements DBPRegistryListener, DBPEventListener, DBPPreferenceListener, INavigatorListener { - private static final Log log = Log.getLog(DataSourceManagementToolbar.class); - - private static DataSourceManagementToolbar toolBarInstance; - - private IWorkbenchWindow workbenchWindow; - private IWorkbenchPart activePart; - private IPageListener pageListener; - private IPartListener partListener; - - private Text resultSetSize; - private SelectDataSourceCombo connectionCombo; - private CSmartSelector databaseCombo; - - private SoftReference curDataSourceContainer = null; - - private final List handledRegistries = new ArrayList<>(); - private final List dbListReads = new ArrayList<>(); - private volatile IFile activeFile; - private volatile String currentDatabaseInstanceName; - - private class DatabaseListReader extends DataSourceJob { - private final List nodeList = new ArrayList<>(); - // Remote instance node - private DBSObject active; - private boolean enabled; - - DatabaseListReader(@NotNull DBCExecutionContext context) { - super(UINavigatorMessages.toolbar_datasource_selector_action_read_databases, context); - setSystem(true); - this.enabled = false; - } - - @Override - public IStatus run(DBRProgressMonitor monitor) { - final DBPDataSource dataSource = getExecutionContext().getDataSource(); - DBSObjectContainer objectContainer = DBUtils.getAdapter(DBSObjectContainer.class, dataSource); - DBSObjectSelector objectSelector = DBUtils.getAdapter(DBSObjectSelector.class, dataSource); - if (objectContainer == null || objectSelector == null) { - return Status.CANCEL_STATUS; - } - try { - monitor.beginTask(UINavigatorMessages.toolbar_datasource_selector_action_read_databases, 1); - currentDatabaseInstanceName = null; - Class childType = objectContainer.getChildType(monitor); - if (childType == null || !DBSObjectContainer.class.isAssignableFrom(childType)) { - enabled = false; - } else { - enabled = true; - - DBNModel navigatorModel = DBWorkbench.getPlatform().getNavigatorModel(); - - DBSObject defObject = objectSelector.getDefaultObject(); - if (defObject instanceof DBSObjectContainer) { - // Default object can be object container + object selector (e.g. in PG) - objectSelector = DBUtils.getAdapter(DBSObjectSelector.class, defObject); - if (objectSelector != null && objectSelector.supportsDefaultChange()) { - currentDatabaseInstanceName = defObject.getName(); - objectContainer = (DBSObjectContainer) defObject; - defObject = objectSelector.getDefaultObject(); - } - } - Collection children = objectContainer.getChildren(monitor); - active = defObject; - // Cache navigator nodes - if (children != null) { - for (DBSObject child : children) { - if (DBUtils.getAdapter(DBSObjectContainer.class, child) != null) { - DBNDatabaseNode node = navigatorModel.getNodeByObject(monitor, child, false); - if (node != null) { - nodeList.add(node); - } - } - } - } - } - } catch (DBException e) { - return GeneralUtils.makeExceptionStatus(e); - } finally { - monitor.done(); - } - return Status.OK_STATUS; - } - } - - public static DataSourceManagementToolbar getInstance() { - return toolBarInstance; - } - - public DataSourceManagementToolbar(IWorkbenchWindow workbenchWindow) { - toolBarInstance = this; - this.workbenchWindow = workbenchWindow; - DBWorkbench.getPlatform().getNavigatorModel().addListener(this); - - final ISelectionListener selectionListener = (part, selection) -> { - if (part == activePart && selection instanceof IStructuredSelection) { - final Object element = ((IStructuredSelection) selection).getFirstElement(); - if (element != null) { - if (RuntimeUtils.getObjectAdapter(element, DBSObject.class) != null) { - updateControls(false); - } - } - } - }; - pageListener = new AbstractPageListener() { - @Override - public void pageClosed(IWorkbenchPage page) { - page.removePartListener(partListener); - page.removeSelectionListener(selectionListener); - } - - @Override - public void pageOpened(IWorkbenchPage page) { - page.addPartListener(partListener); - page.addSelectionListener(selectionListener); - } - }; - partListener = new AbstractPartListener() { - @Override - public void partActivated(IWorkbenchPart part) { - setActivePart(part); - } - - @Override - public void partClosed(IWorkbenchPart part) { - if (part == activePart) { - setActivePart(null); - } - } - }; - } - - public void showConnectionSelector() { - connectionCombo.showConnectionSelector(); - } - - private void dispose() { - DBWorkbench.getPlatform().getNavigatorModel().removeListener(this); - - IWorkbenchPage activePage = workbenchWindow.getActivePage(); - if (activePage != null) { - pageListener.pageClosed(activePage); - } - - DataSourceProviderRegistry.getInstance().removeDataSourceRegistryListener(this); - for (DBPDataSourceRegistry registry : handledRegistries) { - registry.removeDataSourceListener(this); - } - - setActivePart(null); - - this.workbenchWindow.removePageListener(pageListener); - } - - @Override - public void handleRegistryLoad(DBPDataSourceRegistry registry) { - registry.addDataSourceListener(this); - handledRegistries.add(registry); - } - - @Override - public void handleRegistryUnload(DBPDataSourceRegistry registry) { - handledRegistries.remove(registry); - registry.removeDataSourceListener(this); - } - - @Nullable - private static IAdaptable getActiveObject(IWorkbenchPart activePart) { - if (activePart instanceof IEditorPart) { - return ((IEditorPart) activePart).getEditorInput(); - } else if (activePart instanceof IViewPart) { - return activePart; - } else { - return null; - } - } - - @Nullable - private DBPDataSourceContainer getDataSourceContainer() { - return getDataSourceContainer(activePart); - } - - @Nullable - private static DBPDataSourceContainer getDataSourceContainer(IWorkbenchPart part) { - if (part == null) { - return null; - } - if (part instanceof IDataSourceContainerProvider) { - return ((IDataSourceContainerProvider) part).getDataSourceContainer(); - } - - final IAdaptable activeObject = getActiveObject(part); - if (activeObject == null) { - return null; - } - if (activeObject instanceof IDataSourceContainerProvider) { - return ((IDataSourceContainerProvider) activeObject).getDataSourceContainer(); - } else if (activeObject instanceof DBPContextProvider) { - DBCExecutionContext executionContext = ((DBPContextProvider) activeObject).getExecutionContext(); - if (executionContext != null) { - return executionContext.getDataSource().getContainer(); - } - } - return null; - } - - @Nullable - private IDataSourceContainerProviderEx getActiveDataSourceUpdater() { - if (activePart instanceof IDataSourceContainerProviderEx) { - return (IDataSourceContainerProviderEx) activePart; - } else { - final IAdaptable activeObject = getActiveObject(activePart); - if (activeObject == null) { - return null; - } - return activeObject instanceof IDataSourceContainerProviderEx ? (IDataSourceContainerProviderEx) activeObject : null; - } - } - - private List getAvailableDataSources() { - //Get project from active editor - if (workbenchWindow != null && workbenchWindow.getActivePage() != null) { - final IEditorPart activeEditor = workbenchWindow.getActivePage().getActiveEditor(); - if (activeEditor != null && activeEditor.getEditorInput() instanceof IFileEditorInput) { - final IFile curFile = ((IFileEditorInput) activeEditor.getEditorInput()).getFile(); - if (curFile != null) { - DBPDataSourceContainer fileDataSource = EditorUtils.getFileDataSource(curFile); - if (fileDataSource != null) { - return fileDataSource.getRegistry().getDataSources(); - } - DBPProject projectMeta = DBWorkbench.getPlatform().getWorkspace().getProject(curFile.getProject()); - if (projectMeta != null) { - return projectMeta.getDataSourceRegistry().getDataSources(); - } - } - } - } - final DBPDataSourceContainer dataSourceContainer = getDataSourceContainer(); - if (dataSourceContainer != null) { - return dataSourceContainer.getRegistry().getDataSources(); - } else { - return DataSourceRegistry.getAllDataSources(); - } - } - - private DBPProject getActiveProject() { - //Get project from active editor - if (workbenchWindow != null && workbenchWindow.getActivePage() != null) { - final IEditorPart activeEditor = workbenchWindow.getActivePage().getActiveEditor(); - if (activeEditor != null && activeEditor.getEditorInput() instanceof IFileEditorInput) { - final IFile curFile = ((IFileEditorInput) activeEditor.getEditorInput()).getFile(); - if (curFile != null) { - return DBWorkbench.getPlatform().getWorkspace().getProject(curFile.getProject()); - } - } - } - final DBPDataSourceContainer dataSourceContainer = getDataSourceContainer(); - if (dataSourceContainer != null) { - return dataSourceContainer.getRegistry().getProject(); - } else { - return DBWorkbench.getPlatform().getWorkspace().getActiveProject(); - } - } - - public void setActivePart(@Nullable IWorkbenchPart part) { - if (!(part instanceof IEditorPart)) { - if (part == null || part.getSite() == null || part.getSite().getPage() == null) { - part = null; - } else { - // Toolbar works only with active editor - // Other parts just doesn't matter - part = part.getSite().getPage().getActiveEditor(); - } - } - if (connectionCombo != null && !connectionCombo.isDisposed()) { - final int selConnection = connectionCombo.getSelectionIndex(); - DBPDataSourceContainer visibleContainer = null; - if (selConnection > 0) { - visibleContainer = connectionCombo.getItem(selConnection); - } - DBPDataSourceContainer newContainer = getDataSourceContainer(part); - if (activePart != part || activePart == null || visibleContainer != newContainer) { - // Update previous statuses - DBPDataSourceContainer oldContainer = getDataSourceContainer(activePart); - activePart = part; - if (oldContainer != newContainer) { - if (oldContainer != null) { - oldContainer.getPreferenceStore().removePropertyChangeListener(this); - } - oldContainer = getDataSourceContainer(); - - if (oldContainer != null) { - // Update editor actions - oldContainer.getPreferenceStore().addPropertyChangeListener(this); - } - } - - // Update controls and actions - updateControls(true); - } - } - if (part != null) { - final IEditorInput editorInput = ((IEditorPart) part).getEditorInput(); - activeFile = EditorUtils.getFileFromInput(editorInput); - } else { - activeFile = null; - } - } - - private void fillDataSourceList(boolean force) { - if (connectionCombo.isDisposed()) { - return; - } - final List dataSources = getAvailableDataSources(); - - boolean update = force; - if (!update) { - // Check if there are any changes - final List oldDataSources = new ArrayList<>(connectionCombo.getItems()); - if (oldDataSources.size() == dataSources.size()) { - for (int i = 0; i < dataSources.size(); i++) { - if (dataSources.get(i) != oldDataSources.get(i)) { - update = true; - break; - } - } - } else { - update = true; - } - } - - if (update) { - connectionCombo.setRedraw(false); - } - try { - if (update) { - connectionCombo.removeAll(); - connectionCombo.addItem(null); - } - - int selectionIndex = 0; - if (activePart != null) { - final DBPDataSourceContainer dataSourceContainer = getDataSourceContainer(); - if (!CommonUtils.isEmpty(dataSources)) { - for (int i = 0; i < dataSources.size(); i++) { - DBPDataSourceContainer ds = dataSources.get(i); - if (ds == null) { - continue; - } - if (update) { - connectionCombo.addItem(ds); - } - if (dataSourceContainer == ds) { - selectionIndex = i + 1; - } - } - } - } - connectionCombo.select(selectionIndex); - connectionCombo.setToolTipText(UINavigatorMessages.toolbar_datasource_selector_combo_datasource_tooltip + "\n" + connectionCombo.getText()); - } finally { - if (update) { - connectionCombo.setRedraw(true); - } - } - } - - @Override - public void handleDataSourceEvent(final DBPEvent event) { - if (PlatformUI.getWorkbench().isClosing()) { - return; - } - if (event.getAction() == DBPEvent.Action.OBJECT_ADD || - event.getAction() == DBPEvent.Action.OBJECT_REMOVE || - (event.getAction() == DBPEvent.Action.OBJECT_UPDATE && event.getObject() == getDataSourceContainer()) || - (event.getAction() == DBPEvent.Action.OBJECT_SELECT && Boolean.TRUE.equals(event.getEnabled()) && - DBUtils.getContainer(event.getObject()) == getDataSourceContainer()) - ) { - UIUtils.asyncExec( - () -> updateControls(true) - ); - } - // This is a hack. We need to update main toolbar. By design toolbar should be updated along with command state - // but in fact it doesn't. I don't know better way than trigger update explicitly. - // TODO: replace with something smarter - if (event.getAction() == DBPEvent.Action.OBJECT_UPDATE && event.getEnabled() != null) { - //DataSourcePropertyTester.firePropertyChange(DataSourcePropertyTester.PROP_CONNECTED); - //DataSourcePropertyTester.firePropertyChange(DataSourcePropertyTester.PROP_TRANSACTIONAL); - UIUtils.asyncExec( - () -> { - IWorkbenchWindow workbenchWindow = UIUtils.getActiveWorkbenchWindow(); - if (workbenchWindow instanceof WorkbenchWindow) { - ((WorkbenchWindow) workbenchWindow).updateActionBars(); - } - } - ); - } - - } - - private void updateControls(boolean force) { - final DBPDataSourceContainer dataSourceContainer = getDataSourceContainer(); - - // Update resultset max size - if (resultSetSize != null && !resultSetSize.isDisposed()) { - if (dataSourceContainer == null) { - resultSetSize.setEnabled(false); - resultSetSize.setText(""); //$NON-NLS-1$ - } else { - resultSetSize.setEnabled(true); - resultSetSize.setText(String.valueOf(200)); - //resultSetSize.setText(String.valueOf(dataSourceContainer.getPreferenceStore().getInt(ResultSetPreferences.RESULT_SET_MAX_ROWS))); - } - } - - // Update datasources combo - updateDataSourceList(force); - updateDatabaseList(force); - } - - private void changeResultSetSize() { - DBPDataSourceContainer dsContainer = getDataSourceContainer(); - if (dsContainer != null) { - String rsSize = resultSetSize.getText(); - if (rsSize.length() == 0) { - rsSize = "1"; //$NON-NLS-1$ - } - //DBPPreferenceStore store = dsContainer.getPreferenceStore(); - //store.setValue(ResultSetPreferences.RESULT_SET_MAX_ROWS, rsSize); - //PrefUtils.savePreferenceStore(store); - } - } - - private void updateDataSourceList(boolean force) { - if (connectionCombo != null && !connectionCombo.isDisposed()) { - IDataSourceContainerProviderEx containerProvider = getActiveDataSourceUpdater(); - if (containerProvider == null) { - connectionCombo.removeAll(); - connectionCombo.setEnabled(false); - } else { - connectionCombo.setEnabled(true); - } - fillDataSourceList(force); - } - } - - private void updateDatabaseList(boolean force) { - if (!force) { - DBPDataSourceContainer dsContainer = getDataSourceContainer(); - if (curDataSourceContainer != null && dsContainer == curDataSourceContainer.get()) { - // The same DS container - nothing to change in DB list - return; - } - } - - // Update databases combo - fillDatabaseCombo(); - } - - private void fillDatabaseCombo() { - if (databaseCombo != null && !databaseCombo.isDisposed()) { - final DBPDataSourceContainer dsContainer = getDataSourceContainer(); - databaseCombo.setEnabled(dsContainer != null); - if (dsContainer != null && dsContainer.isConnected()) { - final DBPDataSource dataSource = dsContainer.getDataSource(); - if (dataSource != null) { - synchronized (dbListReads) { - for (DatabaseListReader reader : dbListReads) { - if (reader.getExecutionContext().getDataSource() == dataSource) { - return; - } - } - DatabaseListReader databaseReader = new DatabaseListReader(dataSource.getDefaultInstance().getDefaultContext(true)); - databaseReader.addJobChangeListener(new JobChangeAdapter() { - @Override - public void done(final IJobChangeEvent event) { - UIUtils.syncExec(() -> fillDatabaseList((DatabaseListReader) event.getJob())); - } - }); - dbListReads.add(databaseReader); - databaseReader.schedule(); - } - } - - curDataSourceContainer = new SoftReference<>(dsContainer); - } else { - curDataSourceContainer = null; - databaseCombo.removeAll(); - databaseCombo.setToolTipText(UINavigatorMessages.toolbar_datasource_selector_combo_database_tooltip); - } - } - } - - private synchronized void fillDatabaseList(DatabaseListReader reader) { - synchronized (dbListReads) { - dbListReads.remove(reader); - } - if (databaseCombo.isDisposed()) { - return; - } - databaseCombo.setRedraw(false); - try { - databaseCombo.removeAll(); - if (reader.active == null) { - databaseCombo.addItem(null); - } - if (!reader.enabled) { - databaseCombo.setEnabled(false); - return; - } - Collection dbList = reader.nodeList; - if (dbList != null && !dbList.isEmpty()) { - for (DBNDatabaseNode node : dbList) { - databaseCombo.addItem(node); - } - } - if (reader.active != null) { - int dbCount = databaseCombo.getItemCount(); - for (int i = 0; i < dbCount; i++) { - if (databaseCombo.getItem(i) != null && databaseCombo.getItem(i).getObject() == reader.active) { - databaseCombo.select(i); - break; - } - } - } - databaseCombo.setEnabled(reader.enabled); - databaseCombo.setToolTipText(UINavigatorMessages.toolbar_datasource_selector_combo_database_tooltip + "\n" + databaseCombo.getText()); - } finally { - if (!databaseCombo.isDisposed()) { - databaseCombo.setRedraw(true); - } - } - } - - private void changeDataSourceSelection(final DBPDataSourceContainer selectedDataSource) { - if (connectionCombo == null || connectionCombo.isDisposed()) { - return; - } - final IDataSourceContainerProviderEx dataSourceUpdater = getActiveDataSourceUpdater(); - if (dataSourceUpdater == null) { - return; - } - - final AbstractJob updateJob = new AbstractJob("Change active database") { - @Override - protected IStatus run(DBRProgressMonitor monitor) { - dataSourceUpdater.setDataSourceContainer(selectedDataSource); - return Status.OK_STATUS; - } - }; - updateJob.addJobChangeListener(new JobChangeAdapter() { - @Override - public void done(IJobChangeEvent event) { - UIUtils.asyncExec(() -> updateControls(false)); - } - }); - updateJob.schedule(); - } - - private void changeDataBaseSelection(@Nullable String newInstanceName, @NotNull DBNDatabaseNode node) { - DBPDataSourceContainer dsContainer = getDataSourceContainer(); - final String newName = node.getNodeName(); - if (dsContainer != null && dsContainer.isConnected()) { - final DBPDataSource dataSource = dsContainer.getDataSource(); - new AbstractJob("Change active database") { - @Override - protected IStatus run(DBRProgressMonitor monitor) { - try { - DBSObjectContainer oc = DBUtils.getAdapter(DBSObjectContainer.class, dataSource); - DBSObjectSelector os = DBUtils.getAdapter(DBSObjectSelector.class, dataSource); - if (os != null) { - if (newInstanceName != null && !CommonUtils.equalObjects(currentDatabaseInstanceName, newInstanceName)) { - // Change current instance - DBSObject newInstance = oc.getChild(monitor, newInstanceName); - if (newInstance != null) { - os.setDefaultObject(monitor, newInstance); - } - } - final DBSObject defObject = os.getDefaultObject(); - if (defObject instanceof DBSObjectContainer) { - // USe seconds level of active object - DBSObjectSelector os2 = DBUtils.getAdapter(DBSObjectSelector.class, defObject); - if (os2 != null && os2.supportsDefaultChange()) { - oc = (DBSObjectContainer) defObject; - os = os2; - } - } - } - - if (oc != null && os != null && os.supportsDefaultChange()) { - DBSObject newChild = oc.getChild(monitor, newName); - if (newChild != null) { - os.setDefaultObject(monitor, newChild); - } else { - throw new DBException(MessageFormat.format(UINavigatorMessages.toolbar_datasource_selector_error_database_not_found, newName)); - } - } else { - throw new DBException(UINavigatorMessages.toolbar_datasource_selector_error_database_change_not_supported); - } - } catch (DBException e) { - return GeneralUtils.makeExceptionStatus(e); - } - return Status.OK_STATUS; - } - }.schedule(); - } - } - - @Override - public void preferenceChange(PreferenceChangeEvent event) { -/* - if (event.getProperty().equals(ResultSetPreferences.RESULT_SET_MAX_ROWS) && !resultSetSize.isDisposed()) { - if (event.getNewValue() != null) { - resultSetSize.setText(event.getNewValue().toString()); - } - } -*/ - } - - Control createControl(Composite parent) { - workbenchWindow.addPageListener(pageListener); - IWorkbenchPage activePage = workbenchWindow.getActivePage(); - if (activePage != null) { - pageListener.pageOpened(activePage); - } - - // Register as datasource listener in all datasources - // We need it because at this moment there could be come already loaded registries (on startup) - DataSourceProviderRegistry.getInstance().addDataSourceRegistryListener(DataSourceManagementToolbar.this); - for (DBPDataSourceRegistry registry : DBUtils.getAllRegistries()) { - handleRegistryLoad(registry); - } - - Composite comboGroup = new Composite(parent, SWT.NONE); - RowLayout layout = new RowLayout(SWT.HORIZONTAL); - layout.marginTop = 0; - layout.marginBottom = 0; - layout.marginWidth = 5; - layout.marginHeight = 0; - - comboGroup.setLayout(layout); - - final int fontHeight = UIUtils.getFontHeight(parent); - int comboWidth = fontHeight * 20; - - connectionCombo = new SelectDataSourceCombo(comboGroup) { - - @Override - protected DBPProject getActiveProject() { - return DataSourceManagementToolbar.this.getActiveProject(); - } - - @Override - protected void onDataSourceChange(DBPDataSourceContainer dataSource) { - changeDataSourceSelection(dataSource); - } - }; - RowData rd = new RowData(); - rd.width = comboWidth; - connectionCombo.setLayoutData(rd); - connectionCombo.setVisibleItemCount(15); - connectionCombo.setWidthHint(comboWidth); - connectionCombo.setToolTipText(UINavigatorMessages.toolbar_datasource_selector_combo_datasource_tooltip); - connectionCombo.addItem(null); - connectionCombo.select(0); - - comboWidth = fontHeight * 20; - databaseCombo = new CSmartSelector(comboGroup, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.BORDER, - new DatabaseLabelProviders.DatabaseLabelProvider() { - @Override - public String getText(Object element) { - if (currentDatabaseInstanceName == null) { - return super.getText(element); - } else { - return super.getText(element) + "@" + currentDatabaseInstanceName; - } - } - }) { - @Override - protected void dropDown(boolean drop) { - if (!drop) { - return; - } - showDatabaseSelector(); - } - }; - rd = new RowData(); - rd.width = comboWidth; - databaseCombo.setLayoutData(rd); - databaseCombo.setVisibleItemCount(15); - databaseCombo.setWidthHint(comboWidth); - databaseCombo.setToolTipText(UINavigatorMessages.toolbar_datasource_selector_combo_database_tooltip); - databaseCombo.addItem(null); - databaseCombo.select(0); - - resultSetSize = new Text(comboGroup, SWT.BORDER); - resultSetSize.setTextLimit(10); - rd = new RowData(); - rd.width = fontHeight * 4; - resultSetSize.setLayoutData(rd); - resultSetSize.setToolTipText(UINavigatorMessages.toolbar_datasource_selector_resultset_segment_size); - - final DBPDataSourceContainer dataSourceContainer = getDataSourceContainer(); - if (dataSourceContainer != null) { - //resultSetSize.setText(String.valueOf(dataSourceContainer.getPreferenceStore().getInt(ResultSetPreferences.RESULT_SET_MAX_ROWS))); - } - //resultSetSize.setDigits(7); - resultSetSize.addVerifyListener(UIUtils.getIntegerVerifyListener(Locale.getDefault())); - resultSetSize.addFocusListener(new FocusListener() { - @Override - public void focusGained(FocusEvent e) { - } - - @Override - public void focusLost(FocusEvent e) { - changeResultSetSize(); - } - }); - comboGroup.addDisposeListener(e -> DataSourceManagementToolbar.this.dispose()); - - UIUtils.asyncExec(() -> { - if (workbenchWindow != null && workbenchWindow.getActivePage() != null) { - setActivePart(workbenchWindow.getActivePage().getActivePart()); - } - }); - - return comboGroup; - } - - void showDatabaseSelector() { - DBNDatabaseNode selectedDB = databaseCombo.getSelectedItem(); - List items = new ArrayList<>(databaseCombo.getItems()); - items.removeIf(Objects::isNull); - if (items.isEmpty()) { - return; - } - DBPDataSourceContainer dataSourceContainer = connectionCombo.getSelectedItem(); - SelectDatabaseDialog dialog = new SelectDatabaseDialog( - databaseCombo.getShell(), - dataSourceContainer, - currentDatabaseInstanceName, - items, - selectedDB == null ? null : Collections.singletonList(selectedDB)); - dialog.setModeless(true); - if (dialog.open() == IDialogConstants.CANCEL_ID) { - return; - } - DBNDatabaseNode node = dialog.getSelectedObject(); - if (node != null && node != databaseCombo.getSelectedItem()) { - // Change current database - databaseCombo.select(node); - changeDataBaseSelection(dialog.getCurrentInstanceName(), node); - } - } - - @Override - public void nodeChanged(DBNEvent event) { - if (activeFile == null) { - return; - } - final DBNNode node = event.getNode(); - if (node instanceof DBNResource && activeFile.equals(((DBNResource) node).getResource())) { - final int selConnection = connectionCombo.getSelectionIndex(); - if (selConnection > 0 && activeFile != null) { - DBPDataSourceContainer visibleContainer = connectionCombo.getItem(selConnection); - DBPDataSourceContainer newContainer = EditorUtils.getFileDataSource(activeFile); - if (newContainer != visibleContainer) { - updateControls(true); - } - } - } - } - - public static class ToolbarContribution extends WorkbenchWindowControlContribution { - public ToolbarContribution() { - super(IActionConstants.TOOLBAR_DATASOURCE); - } - - @Override - protected Control createControl(Composite parent) { - DataSourceManagementToolbar toolbar = new DataSourceManagementToolbar(UIUtils.getActiveWorkbenchWindow()); - return toolbar.createControl(parent); - } - } - -} diff --git a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/editors/entity/FolderEditor.java b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/editors/entity/FolderEditor.java index 67d8c3479ab7298d1ba04ea1540ed70d6559fb40..54756f8fdb184e994f56d42ec31f575b144e2607 100644 --- a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/editors/entity/FolderEditor.java +++ b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/editors/entity/FolderEditor.java @@ -36,7 +36,7 @@ import org.jkiss.dbeaver.model.navigator.*; import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor; import org.jkiss.dbeaver.runtime.DBWorkbench; import org.jkiss.dbeaver.ui.*; -import org.jkiss.dbeaver.ui.controls.itemlist.ItemListControl; +import org.jkiss.dbeaver.ui.navigator.itemlist.ItemListControl; import org.jkiss.dbeaver.ui.editors.INavigatorEditorInput; import org.jkiss.dbeaver.ui.editors.NodeEditorInput; import org.jkiss.dbeaver.ui.navigator.INavigatorModelView; diff --git a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/editors/entity/properties/TabbedFolderPageNode.java b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/editors/entity/properties/TabbedFolderPageNode.java index ccd59e329c655ab59ad11e472cdb438a08009b4c..7b7c4c8160cab89a918d048411f3b28648170745 100644 --- a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/editors/entity/properties/TabbedFolderPageNode.java +++ b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/editors/entity/properties/TabbedFolderPageNode.java @@ -35,7 +35,7 @@ import org.jkiss.dbeaver.ui.IRefreshablePart; import org.jkiss.dbeaver.ui.ISearchContextProvider; import org.jkiss.dbeaver.ui.controls.ProgressPageControl; import org.jkiss.dbeaver.ui.controls.folders.TabbedFolderPage; -import org.jkiss.dbeaver.ui.controls.itemlist.ItemListControl; +import org.jkiss.dbeaver.ui.navigator.itemlist.ItemListControl; import org.jkiss.dbeaver.ui.editors.IDatabaseEditor; import org.jkiss.dbeaver.ui.navigator.INavigatorModelView; diff --git a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/dialogs/BrowseObjectDialog.java b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/dialogs/BrowseObjectDialog.java index 62accd4d14dda443ab06b3fc7c29bad04d954241..3f67767cddd5f715004f61330a1fafc601dea242 100644 --- a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/dialogs/BrowseObjectDialog.java +++ b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/dialogs/BrowseObjectDialog.java @@ -139,6 +139,9 @@ public class BrowseObjectDialog extends Dialog { }); if (selectedNode != null) { treeViewer.setSelection(new StructuredSelection(selectedNode)); + if (!(selectedNode instanceof DBNDataSource) || ((DBNDataSource) selectedNode).getDataSourceContainer().isConnected()) { + treeViewer.expandToLevel(selectedNode, 1); + } selectedObjects.add(selectedNode); } treeViewer.addSelectionChangedListener(event -> { diff --git a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/dialogs/SelectObjectDialog.java b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/dialogs/SelectObjectDialog.java index 48ae5a09e9c96426eaa1e13429c690ee1d4f9573..7ae7a9b46e6832eddea48075fc4fe19a0fce74f3 100644 --- a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/dialogs/SelectObjectDialog.java +++ b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/dialogs/SelectObjectDialog.java @@ -40,7 +40,7 @@ import org.jkiss.dbeaver.model.runtime.load.AbstractLoadService; import org.jkiss.dbeaver.model.struct.DBSWrapper; import org.jkiss.dbeaver.ui.*; import org.jkiss.dbeaver.ui.controls.ListContentProvider; -import org.jkiss.dbeaver.ui.controls.itemlist.DatabaseObjectListControl; +import org.jkiss.dbeaver.ui.navigator.itemlist.DatabaseObjectListControl; import org.jkiss.dbeaver.ui.dialogs.AbstractPopupPanel; import org.jkiss.utils.CommonUtils; diff --git a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/controls/itemlist/DatabaseObjectListControl.java b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/itemlist/DatabaseObjectListControl.java similarity index 74% rename from plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/controls/itemlist/DatabaseObjectListControl.java rename to plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/itemlist/DatabaseObjectListControl.java index 1ac71d822bab30f5aa4f989b38a8195077dd3852..cbf2239f3f8f60aa05285bd06fa1489e65f279c1 100644 --- a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/controls/itemlist/DatabaseObjectListControl.java +++ b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/itemlist/DatabaseObjectListControl.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jkiss.dbeaver.ui.controls.itemlist; +package org.jkiss.dbeaver.ui.navigator.itemlist; import org.eclipse.jface.action.*; import org.eclipse.jface.viewers.IContentProvider; @@ -57,24 +57,21 @@ public abstract class DatabaseObjectListControl e private void createContextMenu() { - NavigatorUtils.createContextMenu(site, getItemsViewer(), new IMenuListener() { - @Override - public void menuAboutToShow(IMenuManager manager) { - IAction copyAction = new Action(WorkbenchMessages.Workbench_copy) { - @Override - public void run() - { - String text = getRenderer().getSelectedText(); - if (!CommonUtils.isEmpty(text)) { - UIUtils.setClipboardContents(getDisplay(), TextTransfer.getInstance(), text); - } + NavigatorUtils.createContextMenu(site, getItemsViewer(), manager -> { + IAction copyAction = new Action(WorkbenchMessages.Workbench_copy) { + @Override + public void run() + { + String text = getRenderer().getSelectedText(); + if (!CommonUtils.isEmpty(text)) { + UIUtils.setClipboardContents(getDisplay(), TextTransfer.getInstance(), text); } - }; - copyAction.setEnabled(!getSelectionProvider().getSelection().isEmpty()); - manager.add(copyAction); - manager.add(new Separator()); - fillCustomActions(manager); - } + } + }; + copyAction.setEnabled(!getSelectionProvider().getSelection().isEmpty()); + manager.add(copyAction); + manager.add(new Separator()); + fillCustomActions(manager); }); } diff --git a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/controls/itemlist/ItemListControl.java b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/itemlist/ItemListControl.java similarity index 99% rename from plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/controls/itemlist/ItemListControl.java rename to plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/itemlist/ItemListControl.java index 995c2f9b7e55d503401c05f26a525db4fb8b3895..adb206f9b860f6ef62d8116ade018b6018eeeece 100644 --- a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/controls/itemlist/ItemListControl.java +++ b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/itemlist/ItemListControl.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jkiss.dbeaver.ui.controls.itemlist; +package org.jkiss.dbeaver.ui.navigator.itemlist; import org.eclipse.jface.action.*; import org.eclipse.jface.viewers.*; diff --git a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/controls/itemlist/NodeListControl.java b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/itemlist/NodeListControl.java similarity index 99% rename from plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/controls/itemlist/NodeListControl.java rename to plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/itemlist/NodeListControl.java index 809490fc647ff5d6eca6455e3662856de4a5586f..e7363bcceaf89c9499ec3e55379d95f12bc14f83 100644 --- a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/controls/itemlist/NodeListControl.java +++ b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/itemlist/NodeListControl.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jkiss.dbeaver.ui.controls.itemlist; +package org.jkiss.dbeaver.ui.navigator.itemlist; import org.eclipse.jface.viewers.*; import org.eclipse.swt.widgets.Composite; diff --git a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/controls/itemlist/ObjectListControl.java b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/itemlist/ObjectListControl.java similarity index 99% rename from plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/controls/itemlist/ObjectListControl.java rename to plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/itemlist/ObjectListControl.java index c0a352b138dc10dca667d0d9d637cf2a306e556f..507d394e597ecdf2089dceb3cad3d8b2498a8b9e 100644 --- a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/controls/itemlist/ObjectListControl.java +++ b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/itemlist/ObjectListControl.java @@ -15,7 +15,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jkiss.dbeaver.ui.controls.itemlist; +package org.jkiss.dbeaver.ui.navigator.itemlist; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; diff --git a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/controls/itemlist/ObjectSearcher.java b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/itemlist/ObjectSearcher.java similarity index 99% rename from plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/controls/itemlist/ObjectSearcher.java rename to plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/itemlist/ObjectSearcher.java index 0fb357ab036b59b43bf6f96ceb00a0270bc9c44b..e3d2836bd84502fdda417f711a974d20f6d8ec46 100644 --- a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/controls/itemlist/ObjectSearcher.java +++ b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/itemlist/ObjectSearcher.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jkiss.dbeaver.ui.controls.itemlist; +package org.jkiss.dbeaver.ui.navigator.itemlist; import org.jkiss.dbeaver.model.DBPNamedObject; import org.jkiss.dbeaver.model.DBPObject; diff --git a/plugins/org.jkiss.dbeaver.ui.search/src/org/jkiss/dbeaver/ui/search/AbstractSearchResultsPage.java b/plugins/org.jkiss.dbeaver.ui.search/src/org/jkiss/dbeaver/ui/search/AbstractSearchResultsPage.java index 132a71cfd2c8c51c76d1c599e6e7ba2439e4a4d3..099dcd8778f2d4cedd4558dc71cc4b9be77972fa 100644 --- a/plugins/org.jkiss.dbeaver.ui.search/src/org/jkiss/dbeaver/ui/search/AbstractSearchResultsPage.java +++ b/plugins/org.jkiss.dbeaver.ui.search/src/org/jkiss/dbeaver/ui/search/AbstractSearchResultsPage.java @@ -38,7 +38,7 @@ import org.jkiss.dbeaver.runtime.DBWorkbench; import org.jkiss.dbeaver.ui.LoadingJob; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.controls.TreeContentProvider; -import org.jkiss.dbeaver.ui.controls.itemlist.NodeListControl; +import org.jkiss.dbeaver.ui.navigator.itemlist.NodeListControl; import org.jkiss.dbeaver.ui.navigator.INavigatorModelView; import org.jkiss.dbeaver.ui.search.internal.UISearchMessages; import org.jkiss.utils.CommonUtils; diff --git a/plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/controls/ObjectContainerSelectorPanel.java b/plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/controls/ObjectContainerSelectorPanel.java new file mode 100644 index 0000000000000000000000000000000000000000..d4243761c4dae534f4f557cb4d24913febc03caf --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/controls/ObjectContainerSelectorPanel.java @@ -0,0 +1,105 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org) + * Copyright (C) 2011-2012 Eugene Fradkin (eugene.fradkin@gmail.com) + * + * 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.controls; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Text; +import org.jkiss.code.Nullable; +import org.jkiss.dbeaver.model.DBIcon; +import org.jkiss.dbeaver.model.DBPImage; +import org.jkiss.dbeaver.model.app.DBPProject; +import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode; +import org.jkiss.dbeaver.model.navigator.DBNModel; +import org.jkiss.dbeaver.model.navigator.DBNNode; +import org.jkiss.dbeaver.model.navigator.DBNProject; +import org.jkiss.dbeaver.model.struct.DBSObjectContainer; +import org.jkiss.dbeaver.model.struct.rdb.DBSSchema; +import org.jkiss.dbeaver.runtime.DBWorkbench; +import org.jkiss.dbeaver.ui.DBeaverIcons; +import org.jkiss.dbeaver.ui.UIUtils; + +/** + * ObjectContainerSelectorPanel + */ +public abstract class ObjectContainerSelectorPanel extends Composite +{ + + private final Label containerIcon; + private final Text containerName; + + protected ObjectContainerSelectorPanel(Composite parent, String containerTitle) { + super(parent, SWT.NONE); + + GridLayout layout = new GridLayout(4, false); + layout.marginHeight = 0; + layout.marginWidth = 0; + this.setLayout(layout); + this.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + UIUtils.createControlLabel(this, containerTitle); + + containerIcon = new Label(this, SWT.NONE); + containerIcon.setImage(DBeaverIcons.getImage(DBIcon.TYPE_UNKNOWN)); + + containerName = new Text(this, SWT.BORDER | SWT.READ_ONLY); + containerName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + containerName.setText(""); + + Button browseButton = new Button(this, SWT.PUSH); + browseButton.setImage(DBeaverIcons.getImage(DBIcon.TREE_FOLDER)); + browseButton.setText("..."); + browseButton.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) + { + DBPProject activeProject = DBWorkbench.getPlatform().getWorkspace().getActiveProject(); + if (activeProject != null) { + final DBNModel navigatorModel = DBWorkbench.getPlatform().getNavigatorModel(); + final DBNProject rootNode = navigatorModel.getRoot().getProjectNode(activeProject); + DBNNode selectedNode = getSelectedNode(); + DBNNode node = DBWorkbench.getPlatformUI().selectObject( + getShell(), + containerTitle, + rootNode.getDatabases(), + selectedNode, + new Class[] {DBSObjectContainer.class}, + null, new Class[] { DBSSchema.class }); + if (node instanceof DBNDatabaseNode) { + setSelectedNode((DBNDatabaseNode) node); + } + } + } + }); + } + + public void setContainerInfo(DBPImage image, String name) { + containerIcon.setImage(DBeaverIcons.getImage(image)); + containerName.setText(name); + } + + protected abstract void setSelectedNode(DBNDatabaseNode node); + + @Nullable + protected abstract DBNNode getSelectedNode(); +} \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/controls/StringEditorTable.java b/plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/controls/StringEditorTable.java similarity index 99% rename from plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/controls/StringEditorTable.java rename to plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/controls/StringEditorTable.java index 963b2443aa6fa19f16e8087353afe233589bb15d..b5a8d97e22797baebadfcfa3c5befb9c1fa453be 100644 --- a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/controls/StringEditorTable.java +++ b/plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/controls/StringEditorTable.java @@ -31,7 +31,6 @@ import org.jkiss.dbeaver.model.DBPImage; import org.jkiss.dbeaver.ui.DBeaverIcons; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.internal.UIMessages; -import org.jkiss.dbeaver.ui.internal.UINavigatorMessages; import org.jkiss.utils.CommonUtils; import java.util.ArrayList;