/* * DBeaver - Universal Database Manager * Copyright (C) 2010-2017 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.navigator.database; import org.eclipse.core.resources.IFolder; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.viewers.*; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.views.properties.IPropertySheetPage; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.DBeaverPreferences; import org.jkiss.dbeaver.core.DBeaverCore; import org.jkiss.dbeaver.core.DBeaverUI; import org.jkiss.dbeaver.model.DBPDataSource; import org.jkiss.dbeaver.model.DBPDataSourceContainer; import org.jkiss.dbeaver.model.IDataSourceContainerProvider; import org.jkiss.dbeaver.model.navigator.*; import org.jkiss.dbeaver.model.navigator.meta.DBXTreeNodeHandler; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.actions.datasource.DataSourceHandler; import org.jkiss.dbeaver.ui.actions.navigator.NavigatorHandlerObjectOpen; import org.jkiss.dbeaver.ui.controls.PropertyPageStandard; import org.jkiss.dbeaver.ui.editors.sql.handlers.OpenHandler; import org.jkiss.dbeaver.ui.navigator.INavigatorModelView; import org.jkiss.dbeaver.ui.navigator.NavigatorUtils; import org.jkiss.utils.CommonUtils; import java.util.Collection; public abstract class NavigatorViewBase extends ViewPart implements INavigatorModelView, IDataSourceContainerProvider { public enum DoubleClickBehavior { EDIT, CONNECT, SQL_EDITOR, EXPAND } private DBNModel model; private DatabaseNavigatorTree tree; private transient Object lastSelection; protected NavigatorViewBase() { super(); model = DBeaverCore.getInstance().getNavigatorModel(); } public DBNModel getModel() { return model; } protected DatabaseNavigatorTree getNavigatorTree() { return tree; } /** * Navigator nodes filter. * Implementation returns true if element shouldn't be filtered (i.e. always visible). * @return filter or null if no filtering is supported. */ protected IFilter getNavigatorFilter() { return null; } @NotNull @Override public TreeViewer getNavigatorViewer() { return tree.getViewer(); } /** * This is a callback that will allow us to create the viewer and initialize * it. */ @Override public void createPartControl(Composite parent) { this.tree = createNavigatorTree(parent, getRootNode()); getViewSite().setSelectionProvider(tree.getViewer()); } private DatabaseNavigatorTree createNavigatorTree(Composite parent, DBNNode rootNode) { // Create tree final DatabaseNavigatorTree navigatorTree = new DatabaseNavigatorTree(parent, rootNode, getTreeStyle(), false, getNavigatorFilter()); navigatorTree.getViewer().addSelectionChangedListener( new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { onSelectionChange((IStructuredSelection)event.getSelection()); } } ); navigatorTree.getViewer().addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { TreeViewer viewer = tree.getViewer(); IStructuredSelection selection = (IStructuredSelection) viewer.getSelection(); if (selection.size() == 1) { Object node = selection.getFirstElement(); if ((node instanceof DBNResource && ((DBNResource) node).getResource() instanceof IFolder) || (node instanceof DBNDataSource && DoubleClickBehavior.valueOf(DBeaverCore.getGlobalPreferenceStore().getString(DBeaverPreferences.NAVIGATOR_CONNECTION_DOUBLE_CLICK)) == DoubleClickBehavior.EXPAND)) { if (Boolean.TRUE.equals(viewer.getExpandedState(node))) { viewer.collapseToLevel(node, 1); } else { viewer.expandToLevel(node, 1); } } else if (node instanceof DBNDataSource) { DBPDataSourceContainer dataSource = ((DBNDataSource) node).getObject(); NavigatorViewBase.DoubleClickBehavior doubleClickBehavior = NavigatorViewBase.DoubleClickBehavior.valueOf(DBeaverCore.getGlobalPreferenceStore().getString(DBeaverPreferences.NAVIGATOR_CONNECTION_DOUBLE_CLICK)); switch (doubleClickBehavior) { case EDIT: NavigatorHandlerObjectOpen.openEntityEditor((DBNDataSource) node, null, DBeaverUI.getActiveWorkbenchWindow()); break; case CONNECT: if (dataSource.isConnected()) { DataSourceHandler.disconnectDataSource(dataSource, null); } else { DataSourceHandler.connectToDataSource(null, dataSource, null); } break; case SQL_EDITOR: try { OpenHandler.openRecentScript(getSite().getWorkbenchWindow(), dataSource, null); } catch (CoreException e) { UIUtils.showErrorDialog(getSite().getShell(), "Open SQL editor", "Can't open SQL editor", e); } break; } } else { NavigatorUtils.executeNodeAction(DBXTreeNodeHandler.Action.open, node, getSite()); } } } }); // Hook context menu NavigatorUtils.addContextMenu(this.getSite(), navigatorTree.getViewer()); // Add drag and drop support NavigatorUtils.addDragAndDropSupport(navigatorTree.getViewer()); return navigatorTree; } protected void onSelectionChange(IStructuredSelection structSel) { if (!structSel.isEmpty()) { lastSelection = structSel.getFirstElement(); if (lastSelection instanceof DBNNode) { String desc = ((DBNNode)lastSelection).getNodeDescription(); if (CommonUtils.isEmpty(desc)) { desc = ((DBNNode)lastSelection).getNodeName(); } getViewSite().getActionBars().getStatusLineManager().setMessage(desc); } } else { lastSelection = null; } if (lastSelection instanceof DBNDatabaseNode && DBeaverCore.getGlobalPreferenceStore().getBoolean(DBeaverPreferences.NAVIGATOR_SYNC_EDITOR_DATASOURCE)) { IEditorPart activeEditor = DBeaverUI.getActiveWorkbenchWindow().getActivePage().getActiveEditor(); if (activeEditor != null) { NavigatorUtils.syncEditorWithNavigator(this, activeEditor); } } } protected int getTreeStyle() { return SWT.MULTI; } @Override public void dispose() { model = null; super.dispose(); } /** * Passing the focus request to the viewer's control. */ @Override public void setFocus() { tree.getViewer().getControl().setFocus(); } @Override public <T> T getAdapter(Class<T> adapter) { if (adapter == IPropertySheetPage.class) { return adapter.cast(new PropertyPageStandard()); } return super.getAdapter(adapter); } public void showNode(DBNNode node) { tree.showNode(node); } @Override public DBPDataSourceContainer getDataSourceContainer() { if (lastSelection instanceof DBNDatabaseNode) { if (lastSelection instanceof DBNDataSource) { return ((DBNDataSource)lastSelection).getDataSourceContainer(); } else if (((DBNDatabaseNode) lastSelection).getObject() != null) { final DBPDataSource dataSource = ((DBNDatabaseNode) lastSelection).getObject().getDataSource(); return dataSource == null ? null : dataSource.getContainer(); } } else if (lastSelection instanceof DBNResource) { Collection<DBPDataSourceContainer> containers = ((DBNResource) lastSelection).getAssociatedDataSources(); if (containers != null && containers.size() == 1) { return containers.iterator().next(); } } return null; } public void configureView() { } }