From 42328440bdebc5b9f1be417d525eb3cd42dd00f3 Mon Sep 17 00:00:00 2001 From: serge-rider Date: Sun, 20 Sep 2020 19:59:10 +0300 Subject: [PATCH] #9822 Tunnel action handler impl + UI connection service additions --- .../datasource/UIServiceConnectionsImpl.java | 13 ++++--- .../connection/ConnectionPageSettings.java | 12 +++++- .../dialogs/connection/ConnectionWizard.java | 1 + .../connection/EditConnectionDialog.java | 18 +++++++-- .../runtime/ui/UIServiceConnections.java | 12 +++--- .../actions/NavigatorHandlerObjectOpen.java | 3 +- .../actions/node/NNAHDataSourceTunnel.java | 12 +++++- .../ui/ICompositeDialogPageContainer.java | 29 +++++++++++++++ .../ui/dialogs/MultiPageWizardDialog.java | 37 ++++++++++++++----- 9 files changed, 109 insertions(+), 28 deletions(-) create mode 100644 plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/ICompositeDialogPageContainer.java diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/datasource/UIServiceConnectionsImpl.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/datasource/UIServiceConnectionsImpl.java index 945921b737..91221a34cc 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/datasource/UIServiceConnectionsImpl.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/actions/datasource/UIServiceConnectionsImpl.java @@ -17,6 +17,7 @@ package org.jkiss.dbeaver.ui.actions.datasource; +import org.jkiss.code.NotNull; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBPDataSourceContainer; import org.jkiss.dbeaver.model.exec.DBCExecutionContext; @@ -35,27 +36,27 @@ public class UIServiceConnectionsImpl implements DBServiceConnections, UIService private static final Log log = Log.getLog(UIServiceConnectionsImpl.class); @Override - public void openConnectionEditor(DBPDataSourceContainer dataSourceContainer) { - EditConnectionDialog.openEditConnectionDialog(UIUtils.getActiveWorkbenchWindow(), dataSourceContainer); + public void openConnectionEditor(@NotNull DBPDataSourceContainer dataSourceContainer, String defaultPageName) { + EditConnectionDialog.openEditConnectionDialog(UIUtils.getActiveWorkbenchWindow(), dataSourceContainer, defaultPageName); } @Override - public void connectDataSource(DBPDataSourceContainer dataSourceContainer, DBRProgressListener onFinish) { + public void connectDataSource(@NotNull DBPDataSourceContainer dataSourceContainer, DBRProgressListener onFinish) { DataSourceHandler.connectToDataSource(null, dataSourceContainer, onFinish); } @Override - public void disconnectDataSource(DBPDataSourceContainer dataSourceContainer) { + public void disconnectDataSource(@NotNull DBPDataSourceContainer dataSourceContainer) { DataSourceHandler.disconnectDataSource(dataSourceContainer, null); } @Override - public void closeActiveTransaction(DBRProgressMonitor monitor, DBCExecutionContext context, boolean commitTxn) { + public void closeActiveTransaction(@NotNull DBRProgressMonitor monitor, @NotNull DBCExecutionContext context, boolean commitTxn) { DataSourceHandler.closeActiveTransaction(monitor, context, commitTxn); } @Override - public boolean checkAndCloseActiveTransaction(DBCExecutionContext[] contexts) { + public boolean checkAndCloseActiveTransaction(@NotNull DBCExecutionContext[] contexts) { return DataSourceHandler.checkAndCloseActiveTransaction(contexts); } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/connection/ConnectionPageSettings.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/connection/ConnectionPageSettings.java index a6dd1ecb44..50935ea25c 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/connection/ConnectionPageSettings.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/connection/ConnectionPageSettings.java @@ -56,7 +56,7 @@ import java.util.*; /** * Settings connection page. Hosts particular drivers' connection pages */ -class ConnectionPageSettings extends ActiveWizardPage implements IDataSourceConnectionEditorSite, ICompositeDialogPage, IDataSourceConnectionTester { +class ConnectionPageSettings extends ActiveWizardPage implements IDataSourceConnectionEditorSite, ICompositeDialogPage, ICompositeDialogPageContainer, IDataSourceConnectionTester { private static final Log log = Log.getLog(DriverDescriptor.class); public static final String PAGE_NAME = ConnectionPageSettings.class.getSimpleName(); @@ -410,4 +410,14 @@ class ConnectionPageSettings extends ActiveWizardPage implemen public String toString() { return getName(); } + + @Override + public void showSubPage(IDialogPage subPage) { + for (TabItem pageTab : tabFolder.getItems()) { + if (pageTab.getData() == subPage) { + tabFolder.setSelection(pageTab); + break; + } + } + } } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/connection/ConnectionWizard.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/connection/ConnectionWizard.java index f6817299de..a983be153f 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/connection/ConnectionWizard.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/connection/ConnectionWizard.java @@ -235,6 +235,7 @@ public abstract class ConnectionWizard extends ActiveWizard implements INewWizar final IWizardPage page = getPage(pageId); if (page != null) { getContainer().showPage(page); + return true; } return false; } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/connection/EditConnectionDialog.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/connection/EditConnectionDialog.java index 7814d3ddb1..7992a7a2d4 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/connection/EditConnectionDialog.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/dialogs/connection/EditConnectionDialog.java @@ -50,6 +50,7 @@ public class EditConnectionDialog extends MultiPageWizardDialog { private static String lastActivePage; private Button testButton; + private String defaultPageName; private EditConnectionDialog(IWorkbenchWindow window, ConnectionWizard wizard) { super(window, wizard); @@ -74,8 +75,15 @@ public class EditConnectionDialog extends MultiPageWizardDialog { protected Control createContents(Composite parent) { Control contents = super.createContents(parent); - if (!CommonUtils.isEmpty(lastActivePage)) { - getWizard().openSettingsPage(lastActivePage); + String activePage = defaultPageName; + if (CommonUtils.isEmpty(activePage)) { + activePage = lastActivePage; + } + if (!CommonUtils.isEmpty(activePage)) { + String finalActivePage = activePage; + UIUtils.asyncExec(() -> { + getWizard().openSettingsPage(finalActivePage); + }); } return contents; @@ -132,15 +140,19 @@ public class EditConnectionDialog extends MultiPageWizardDialog { getWizard().testConnection(); } - public static boolean openEditConnectionDialog(IWorkbenchWindow window, DBPDataSourceContainer dataSource) { + public static boolean openEditConnectionDialog(IWorkbenchWindow window, DBPDataSourceContainer dataSource, String defaultPageName) { EditConnectionDialog dialog = openDialogs.get(dataSource); if (dialog != null) { + if (defaultPageName != null) { + dialog.showPage(defaultPageName); + } dialog.getShell().forceActive(); return true; } EditConnectionWizard wizard = new EditConnectionWizard((DataSourceDescriptor) dataSource); dialog = new EditConnectionDialog(window, wizard); + dialog.defaultPageName = defaultPageName; openDialogs.put(dataSource, dialog); try { return dialog.open() == IDialogConstants.OK_ID; diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/runtime/ui/UIServiceConnections.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/runtime/ui/UIServiceConnections.java index cf0111f256..0157d5ce86 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/runtime/ui/UIServiceConnections.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/runtime/ui/UIServiceConnections.java @@ -17,6 +17,8 @@ package org.jkiss.dbeaver.runtime.ui; +import org.jkiss.code.NotNull; +import org.jkiss.code.Nullable; import org.jkiss.dbeaver.model.DBPDataSourceContainer; import org.jkiss.dbeaver.model.exec.DBCExecutionContext; import org.jkiss.dbeaver.model.runtime.DBRProgressListener; @@ -27,14 +29,14 @@ import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; */ public interface UIServiceConnections { - void openConnectionEditor(DBPDataSourceContainer dataSourceContainer); + void openConnectionEditor(@NotNull DBPDataSourceContainer dataSourceContainer, @Nullable String defaultPageName); - void connectDataSource(DBPDataSourceContainer dataSourceContainer, DBRProgressListener onFinish); + void connectDataSource(@NotNull DBPDataSourceContainer dataSourceContainer, DBRProgressListener onFinish); - void disconnectDataSource(DBPDataSourceContainer dataSourceContainer); + void disconnectDataSource(@NotNull DBPDataSourceContainer dataSourceContainer); - void closeActiveTransaction(DBRProgressMonitor monitor, DBCExecutionContext context, boolean commitTxn); + void closeActiveTransaction(@NotNull DBRProgressMonitor monitor, @NotNull DBCExecutionContext context, boolean commitTxn); - boolean checkAndCloseActiveTransaction(DBCExecutionContext[] contexts); + boolean checkAndCloseActiveTransaction(@NotNull DBCExecutionContext[] contexts); } \ No newline at end of file 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 2dea9228b6..ffa1ebe77a 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 @@ -39,7 +39,6 @@ import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.edit.DBEObjectEditor; import org.jkiss.dbeaver.model.navigator.*; import org.jkiss.dbeaver.model.struct.DBSObject; -import org.jkiss.dbeaver.model.struct.DBSObjectContainer; import org.jkiss.dbeaver.runtime.DBWorkbench; import org.jkiss.dbeaver.runtime.ui.UIServiceConnections; import org.jkiss.dbeaver.runtime.ui.UIServiceSQL; @@ -271,7 +270,7 @@ public class NavigatorHandlerObjectOpen extends NavigatorHandlerObjectBase imple public static void openConnectionEditor(IWorkbenchWindow workbenchWindow, DBPDataSourceContainer dataSourceContainer) { UIServiceConnections serviceConnections = DBWorkbench.getService(UIServiceConnections.class); if (serviceConnections != null) { - serviceConnections.openConnectionEditor(dataSourceContainer); + serviceConnections.openConnectionEditor(dataSourceContainer, null); } } diff --git a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/actions/node/NNAHDataSourceTunnel.java b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/actions/node/NNAHDataSourceTunnel.java index 955bff1c80..6c855cff72 100644 --- a/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/actions/node/NNAHDataSourceTunnel.java +++ b/plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/navigator/actions/node/NNAHDataSourceTunnel.java @@ -18,10 +18,14 @@ package org.jkiss.dbeaver.ui.navigator.actions.node; import org.eclipse.swt.widgets.Event; +import org.jkiss.dbeaver.model.DBPDataSourceContainer; import org.jkiss.dbeaver.model.DBPImage; 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.net.DBWHandlerConfiguration; +import org.jkiss.dbeaver.runtime.DBWorkbench; +import org.jkiss.dbeaver.runtime.ui.UIServiceConnections; import org.jkiss.dbeaver.ui.UIIcon; import org.jkiss.dbeaver.ui.navigator.INavigatorModelView; import org.jkiss.dbeaver.ui.navigator.actions.NavigatorNodeActionHandlerAbstract; @@ -62,7 +66,13 @@ public class NNAHDataSourceTunnel extends NavigatorNodeActionHandlerAbstract { @Override public void handleNodeAction(INavigatorModelView view, DBNNode node, Event event, boolean defaultAction) { - + if (node instanceof DBNDatabaseNode) { + DBPDataSourceContainer dataSourceContainer = ((DBNDatabaseNode) node).getDataSourceContainer(); + UIServiceConnections serviceConnections = DBWorkbench.getService(UIServiceConnections.class); + if (serviceConnections != null) { + serviceConnections.openConnectionEditor(dataSourceContainer, "ConnectionPageNetworkHandler.ssh_tunnel"); + } + } } } diff --git a/plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/ICompositeDialogPageContainer.java b/plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/ICompositeDialogPageContainer.java new file mode 100644 index 0000000000..7953c48345 --- /dev/null +++ b/plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/ICompositeDialogPageContainer.java @@ -0,0 +1,29 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2020 DBeaver Corp and others + * + * 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; + +import org.eclipse.jface.dialogs.IDialogPage; + +/** + * ICompositeDialogPageContainer + */ +public interface ICompositeDialogPageContainer extends ICompositeDialogPage { + + void showSubPage(IDialogPage subPage); + +} \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/dialogs/MultiPageWizardDialog.java b/plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/dialogs/MultiPageWizardDialog.java index 9447f0821a..cf102e217b 100644 --- a/plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/dialogs/MultiPageWizardDialog.java +++ b/plugins/org.jkiss.dbeaver.ui/src/org/jkiss/dbeaver/ui/dialogs/MultiPageWizardDialog.java @@ -41,6 +41,7 @@ import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.IWorkbenchWizard; import org.jkiss.dbeaver.runtime.DBWorkbench; import org.jkiss.dbeaver.ui.ICompositeDialogPage; +import org.jkiss.dbeaver.ui.ICompositeDialogPageContainer; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.preferences.PreferenceStoreDelegate; import org.jkiss.utils.ArrayUtils; @@ -209,17 +210,17 @@ public class MultiPageWizardDialog extends TitleAreaDialog implements IWizardCon } private void changePage() { + TreeItem[] selection = pagesTree.getSelection(); + if (selection.length != 1) { + return; + } + TreeItem newItem = selection[0]; + if (prevPage == newItem.getData()) { + return; + } + pageArea.setRedraw(false); try { - TreeItem[] selection = pagesTree.getSelection(); - if (selection.length != 1) { - return; - } - TreeItem newItem = selection[0]; - if (prevPage == newItem.getData()) { - return; - } - GridData gd; if (prevPage != null) { gd = (GridData) prevPage.getControl().getLayoutData(); @@ -306,7 +307,20 @@ public class MultiPageWizardDialog extends TitleAreaDialog implements IWizardCon if (item.getData() == page) { pagesTree.setSelection(item); changePage(); - break; + return; + } + if (item.getData() instanceof ICompositeDialogPageContainer) { + IDialogPage[] subPages = ((ICompositeDialogPageContainer) item.getData()).getSubPages(false, false); + if (!ArrayUtils.isEmpty(subPages)) { + for (IDialogPage subPage : subPages) { + if (subPage == page) { + pagesTree.setSelection(item); + changePage(); + ((ICompositeDialogPageContainer) item.getData()).showSubPage(page); + return; + } + } + } } for (TreeItem child : item.getItems()) { if (child.getData() == page) { @@ -396,4 +410,7 @@ public class MultiPageWizardDialog extends TitleAreaDialog implements IWizardCon } } + protected void showPage(String pageName) { + + } } -- GitLab