提交 d221836c 编写于 作者: S Serge Rider

#4553 Datasource and schema selectors events and handlers.

上级 272f4898
......@@ -376,7 +376,11 @@
</handler>
<handler commandId="org.jkiss.dbeaver.core.select.schema" class="org.jkiss.dbeaver.ui.actions.datasource.SelectActiveSchemaHandler">
<enabledWhen>
<reference definitionId="org.jkiss.dbeaver.core.ui.datasource.editor"/>
<with variable="activeEditor">
<adapt type="org.jkiss.dbeaver.model.DBPContextProvider">
<test property="org.jkiss.dbeaver.core.datasource.supportsTransactions" value="true"/>
</adapt>
</with>
</enabledWhen>
</handler>
......
......@@ -82,9 +82,10 @@ public class DBeaverCore implements DBPPlatform {
// The plug-in ID
public static final String PLUGIN_ID = "org.jkiss.dbeaver.core"; //$NON-NLS-1$
public static final String APP_CONFIG_FILE = "dbeaver.ini";
public static final String ECLIPSE_CONFIG_FILE = "eclipse.ini";
public static final String TEMP_PROJECT_NAME = ".dbeaver-temp"; //$NON-NLS-1$
private static final String APP_CONFIG_FILE = "dbeaver.ini";
private static final String ECLIPSE_CONFIG_FILE = "eclipse.ini";
private static final String TEMP_PROJECT_NAME = ".dbeaver-temp"; //$NON-NLS-1$
private static final Log log = Log.getLog(DBeaverCore.class);
......@@ -167,7 +168,7 @@ public class DBeaverCore implements DBPPlatform {
return workbench == null || workbench.isClosing();
}
public static void setClosing(boolean closing) {
private static void setClosing(boolean closing) {
isClosing = closing;
}
......@@ -175,7 +176,7 @@ public class DBeaverCore implements DBPPlatform {
return DBeaverActivator.getInstance().getPreferences();
}
DBeaverCore() {
private DBeaverCore() {
}
private void initialize() {
......
......@@ -28,6 +28,7 @@ import org.jkiss.dbeaver.model.runtime.features.DBRFeature;
import org.jkiss.dbeaver.model.runtime.features.DBRFeatureRegistry;
import org.jkiss.dbeaver.model.struct.DBSDataContainer;
import org.jkiss.dbeaver.ui.ActionUtils;
import org.jkiss.dbeaver.ui.actions.datasource.DataSourceToolbarHandler;
import org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer;
import org.jkiss.dbeaver.ui.editors.entity.EntityEditor;
import org.jkiss.dbeaver.ui.editors.sql.SQLEditor;
......@@ -98,6 +99,12 @@ class WorkbenchContextListener implements IWindowListener, IPageListener, IPartL
}
private void listenWindowEvents(IWorkbenchWindow window) {
{
// Register ds toolbar handler
DataSourceToolbarHandler toolbarHandler = new DataSourceToolbarHandler(window);
window.getShell().addDisposeListener(e -> toolbarHandler.dispose());
}
IPerspectiveListener perspectiveListener = new IPerspectiveListener() {
private IContextActivation perspectiveActivation;
......
/*
* 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.jface.viewers.IStructuredSelection;
import org.eclipse.ui.*;
import org.eclipse.ui.internal.WorkbenchWindow;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.DBPEvent;
import org.jkiss.dbeaver.model.DBPEventListener;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry;
import org.jkiss.dbeaver.model.app.DBPRegistryListener;
import org.jkiss.dbeaver.model.navigator.DBNEvent;
import org.jkiss.dbeaver.model.navigator.DBNNode;
import org.jkiss.dbeaver.model.navigator.DBNResource;
import org.jkiss.dbeaver.model.navigator.INavigatorListener;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.registry.DataSourceProviderRegistry;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.ui.AbstractPartListener;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.actions.DataSourcePropertyTester;
import org.jkiss.dbeaver.ui.editors.EditorUtils;
import org.jkiss.dbeaver.ui.perspective.AbstractPageListener;
import org.jkiss.dbeaver.utils.RuntimeUtils;
import java.util.ArrayList;
import java.util.List;
public class DataSourceToolbarHandler implements DBPRegistryListener, DBPEventListener, INavigatorListener {
private final List<DBPDataSourceRegistry> handledRegistries = new ArrayList<>();
private final IWorkbenchWindow workbenchWindow;
private IWorkbenchPart activePart;
private IPageListener pageListener;
private IPartListener partListener;
public DataSourceToolbarHandler(IWorkbenchWindow workbenchWindow) {
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) {
updateToolbar();
}
}
}
};
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);
}
}
};
workbenchWindow.addPageListener(pageListener);
for (IWorkbenchPage page : workbenchWindow.getPages()) {
pageListener.pageOpened(page);
}
// 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(this);
for (DBPDataSourceRegistry registry : DBUtils.getAllRegistries()) {
handleRegistryLoad(registry);
}
}
public void dispose() {
DataSourceProviderRegistry.getInstance().removeDataSourceRegistryListener(this);
for (DBPDataSourceRegistry registry : this.handledRegistries) {
registry.removeDataSourceListener(this);
}
handledRegistries.clear();
DBWorkbench.getPlatform().getNavigatorModel().removeListener(this);
if (this.pageListener != null) {
this.workbenchWindow.removePageListener(this.pageListener);
this.pageListener = null;
}
}
public void setActivePart(@Nullable IWorkbenchPart part) {
activePart = part;
if (activePart instanceof IEditorPart) {
updateToolbar();
}
}
@Override
public void handleDataSourceEvent(final DBPEvent event) {
if (workbenchWindow.getWorkbench().isClosing()) {
return;
}
DBPDataSourceContainer currentDataSource = DataSourceToolbarUtils.getCurrentDataSource(workbenchWindow);
if (event.getAction() == DBPEvent.Action.OBJECT_ADD ||
event.getAction() == DBPEvent.Action.OBJECT_REMOVE ||
(event.getAction() == DBPEvent.Action.OBJECT_UPDATE && event.getObject() == currentDataSource) ||
(event.getAction() == DBPEvent.Action.OBJECT_SELECT && Boolean.TRUE.equals(event.getEnabled()) &&
DBUtils.getContainer(event.getObject()) == currentDataSource)
) {
UIUtils.asyncExec(
this::updateToolbar
);
}
// 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(
() -> {
if (workbenchWindow instanceof WorkbenchWindow) {
((WorkbenchWindow) workbenchWindow).updateActionBars();
}
}
);
}
}
private void updateToolbar() {
DataSourceToolbarUtils.refreshSelectorToolbar(workbenchWindow);
}
@Override
public void handleRegistryLoad(DBPDataSourceRegistry registry) {
registry.addDataSourceListener(this);
handledRegistries.add(registry);
}
@Override
public void handleRegistryUnload(DBPDataSourceRegistry registry) {
handledRegistries.remove(registry);
registry.removeDataSourceListener(this);
}
@Override
public void nodeChanged(DBNEvent event) {
final DBNNode node = event.getNode();
if (!(node instanceof DBNResource)) {
return;
}
IWorkbenchPage activePage = workbenchWindow.getActivePage();
if (activePage == null) {
return;
}
IEditorPart activeEditor = activePage.getActiveEditor();
if (activeEditor == null) {
return;
}
IFile activeFile = EditorUtils.getFileFromInput(activeEditor.getEditorInput());
if (activeFile == null) {
return;
}
if (activeFile.equals(((DBNResource) node).getResource())) {
DBPDataSourceContainer visibleContainer = DataSourceToolbarUtils.getCurrentDataSource(workbenchWindow);
DBPDataSourceContainer newContainer = EditorUtils.getFileDataSource(activeFile);
if (newContainer != visibleContainer) {
updateToolbar();
}
}
}
}
\ No newline at end of file
......@@ -16,31 +16,17 @@
*/
package org.jkiss.dbeaver.ui.actions.datasource;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IProject;
import org.eclipse.e4.ui.model.application.ui.MElementContainer;
import org.eclipse.e4.ui.model.application.ui.MUIElement;
import org.eclipse.e4.ui.model.application.ui.basic.MTrimBar;
import org.eclipse.e4.ui.model.application.ui.basic.MTrimElement;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.graphics.GC;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.commands.IElementUpdater;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.internal.WorkbenchWindow;
import org.eclipse.ui.menus.UIElement;
import org.jkiss.dbeaver.model.*;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.ui.DBeaverIcons;
import org.jkiss.dbeaver.ui.TextUtils;
import org.jkiss.dbeaver.ui.actions.AbstractDataSourceHandler;
import org.jkiss.dbeaver.ui.navigator.dialogs.SelectDataSourceDialog;
import java.util.Map;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.IDataSourceContainerProvider;
public class DataSourceToolbarUtils
{
......@@ -60,8 +46,7 @@ public class DataSourceToolbarUtils
return null;
}
public static void refreshSelectorToolbar(ExecutionEvent event) {
IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event);
public static void refreshSelectorToolbar(IWorkbenchWindow window) {
if (window instanceof WorkbenchWindow) {
MTrimBar topTrim = ((WorkbenchWindow) window).getTopTrim();
for (MTrimElement element : topTrim.getChildren()) {
......
......@@ -26,6 +26,7 @@ import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.commands.IElementUpdater;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.menus.UIElement;
import org.jkiss.dbeaver.core.CoreMessages;
import org.jkiss.dbeaver.model.*;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.ui.DBeaverIcons;
......@@ -62,8 +63,6 @@ public class SelectActiveDataSourceHandler extends AbstractDataSourceHandler imp
((IDataSourceContainerProviderEx) activeEditor).setDataSourceContainer(newDataSource);
DataSourceToolbarUtils.refreshSelectorToolbar(event);
return null;
}
......@@ -88,6 +87,7 @@ public class SelectActiveDataSourceHandler extends AbstractDataSourceHandler imp
}
element.setText(connectionName);
element.setIcon(DBeaverIcons.getImageDescriptor(connectionIcon));
element.setTooltip(CoreMessages.toolbar_datasource_selector_combo_datasource_tooltip);
}
}
\ No newline at end of file
......@@ -57,6 +57,10 @@ public class SelectActiveSchemaHandler extends AbstractDataSourceHandler impleme
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
DBPDataSourceContainer dataSourceContainer = DataSourceToolbarUtils.getCurrentDataSource(HandlerUtil.getActiveWorkbenchWindow(event));
if (dataSourceContainer == null) {
log.debug("No active connection. Action is in disabled state.");
return null;
}
DatabaseListReader databaseListReader = new DatabaseListReader(dataSourceContainer.getDataSource());
try {
......@@ -108,28 +112,26 @@ public class SelectActiveSchemaHandler extends AbstractDataSourceHandler impleme
DBIcon schemaIcon = DBIcon.TREE_SCHEMA;
String schemaTooltip = CoreMessages.toolbar_datasource_selector_combo_database_tooltip;
if (activeEditor instanceof DBPContextProvider) {
DBCExecutionContext executionContext = ((DBPContextProvider) activeEditor).getExecutionContext();
if (executionContext != null) {
schemaName = "<no schema>";
//DBSObjectContainer objectContainer = DBUtils.getAdapter(DBSObjectContainer.class, executionContext.getDataSource());
DBSObjectSelector objectSelector = DBUtils.getAdapter(DBSObjectSelector.class, executionContext.getDataSource());
if (objectSelector != null && objectSelector.supportsDefaultChange()) {
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()) {
//objectContainer = (DBSObjectContainer) defObject;
defObject = objectSelector.getDefaultObject();
}
DBPDataSourceContainer dataSource = DataSourceToolbarUtils.getCurrentDataSource(workbenchWindow);
if (dataSource != null && dataSource.isConnected()) {
schemaName = "<no schema>";
//DBSObjectContainer objectContainer = DBUtils.getAdapter(DBSObjectContainer.class, executionContext.getDataSource());
DBSObjectSelector objectSelector = DBUtils.getAdapter(DBSObjectSelector.class, dataSource);
if (objectSelector != null && objectSelector.supportsDefaultChange()) {
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()) {
//objectContainer = (DBSObjectContainer) defObject;
defObject = objectSelector.getDefaultObject();
}
}
if (defObject != null) {
schemaName = defObject.getName();
schemaIcon = DBIcon.TREE_SCHEMA;
}
if (defObject != null) {
schemaName = defObject.getName();
schemaIcon = DBIcon.TREE_SCHEMA;
}
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册