提交 25a8fb64 编写于 作者: S serge-rider

#9718 Filter connected datasources

上级 e7d6ab63
......@@ -32,5 +32,6 @@ Require-Bundle: org.eclipse.osgi,
org.w3c.css.sac,
org.jkiss.dbeaver.model,
org.jkiss.dbeaver.core,
org.jkiss.dbeaver.ui
org.jkiss.dbeaver.ui,
org.jkiss.dbeaver.ui.editors.data
Automatic-Module-Name: org.jkiss.dbeaver.ui.app.standalone
......@@ -41,6 +41,7 @@ Export-Package: org.jkiss.dbeaver.registry.functions,
org.jkiss.dbeaver.ui.data.managers,
org.jkiss.dbeaver.ui.data.managers.stream,
org.jkiss.dbeaver.ui.data.registry,
org.jkiss.dbeaver.ui.editors.content,
org.jkiss.dbeaver.ui.editors.data,
org.jkiss.dbeaver.ui.editors.data.preferences
Automatic-Module-Name: org.jkiss.dbeaver.ui.editors.data
......
......@@ -72,6 +72,8 @@ command.org.jkiss.dbeaver.core.object.create.name=Create Object
command.org.jkiss.dbeaver.core.object.create.description=Create new database object
command.org.jkiss.dbeaver.core.object.delete.name=Delete Object
command.org.jkiss.dbeaver.core.object.delete.description=Delete database object
command.org.jkiss.dbeaver.navigator.filter.connected.name=Show connected
command.org.jkiss.dbeaver.navigator.filter.connected.description=View all/connected data sources
command.org.jkiss.dbeaver.core.object.filter.config.name=Configure filter
command.org.jkiss.dbeaver.core.object.filter.config.description=Configure objects filter
command.org.jkiss.dbeaver.core.object.filter.clear.name=Clear filter
......
......@@ -228,6 +228,7 @@
<command id="org.jkiss.dbeaver.core.object.move.down" name="%command.org.jkiss.dbeaver.core.object.move.down.name" description="%command.org.jkiss.dbeaver.core.object.move.down.description" categoryId="org.jkiss.dbeaver.core.database"/>
<command id="org.jkiss.dbeaver.core.object.goto" name="%command.org.jkiss.dbeaver.core.object.goto.name" description="%command.org.jkiss.dbeaver.core.object.goto.description" categoryId="org.jkiss.dbeaver.core.database"/>
<command id="org.jkiss.dbeaver.navigator.filter.connected" name="%command.org.jkiss.dbeaver.navigator.filter.connected.name" description="%command.org.jkiss.dbeaver.navigator.filter.connected.description" categoryId="org.jkiss.dbeaver.core.database"/>
<command id="org.jkiss.dbeaver.core.object.filter.config" name="%command.org.jkiss.dbeaver.core.object.filter.config.name" description="%command.org.jkiss.dbeaver.core.object.filter.config.description" categoryId="org.jkiss.dbeaver.core.database"/>
<command id="org.jkiss.dbeaver.core.object.filter.add.exclude" name="%command.org.jkiss.dbeaver.core.object.filter.add.exclude.name" description="%command.org.jkiss.dbeaver.core.object.filter.add.exclude.description" categoryId="org.jkiss.dbeaver.core.database"/>
<command id="org.jkiss.dbeaver.core.object.filter.add.include" name="%command.org.jkiss.dbeaver.core.object.filter.add.include.name" description="%command.org.jkiss.dbeaver.core.object.filter.add.include.description" categoryId="org.jkiss.dbeaver.core.database"/>
......@@ -277,6 +278,7 @@
<image commandId="org.jkiss.dbeaver.core.object.move.up" icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/misc/arrow_up.png"/>
<image commandId="org.jkiss.dbeaver.core.object.move.down" icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/misc/arrow_down.png"/>
<image commandId="org.jkiss.dbeaver.navigator.filter.connected" icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/misc/filter_apply.png"/>
<image commandId="org.jkiss.dbeaver.core.object.filter.config" icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/misc/filter.png"/>
<image commandId="org.jkiss.dbeaver.core.object.filter.add.exclude" icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/misc/filter_add.png"/>
<image commandId="org.jkiss.dbeaver.core.object.filter.add.include" icon="platform:/plugin/org.jkiss.dbeaver.ui/icons/misc/filter_add.png"/>
......@@ -329,6 +331,8 @@
-->
</handler>
<handler commandId="org.jkiss.dbeaver.navigator.filter.connected" class="org.jkiss.dbeaver.ui.navigator.actions.NavigatorHandlerConnectionFilter">
</handler>
<handler commandId="org.jkiss.dbeaver.core.object.filter.config" class="org.jkiss.dbeaver.ui.navigator.actions.NavigatorHandlerFilterConfig">
<enabledWhen>
<with variable="selection">
......@@ -745,6 +749,19 @@
</extension>
<extension point="org.eclipse.ui.menus">
<!-- Database navigator filter toolbar -->
<menuContribution allPopups="false" locationURI="toolbar:org.jkiss.dbeaver.navigator.filter.toolbar?after=additions">
<command commandId="org.jkiss.dbeaver.navigator.filter.connected" id="org.jkiss.dbeaver.navigator.connectionFilterMenu" style="pulldown"/>
</menuContribution>
<!-- Connection filter menu -->
<menuContribution allPopups="false" locationURI="menu:org.jkiss.dbeaver.navigator.connectionFilterMenu">
<!-- <dynamic id="org.jkiss.dbeaver.core.menu.newConnection.select" class="org.jkiss.dbeaver.ui.actions.datasource.NewConnectionDriverSelectorContributor"/>-->
<separator name="connected_toggle" visible="true"/>
<command commandId="org.jkiss.dbeaver.navigator.filter.connected"/>
</menuContribution>
<!-- Tools toolbar -->
<menuContribution allPopups="false" locationURI="toolbar:org.eclipse.ui.main.toolbar?after=additions">
<toolbar id="dbeaver-tools" label="Database Tools Toolbar">
<separator name="additions" visible="false"/>
......
......@@ -39,6 +39,8 @@ public class NavigatorCommands {
public static final String CMD_CREATE_FOLDER_LINK = "org.jkiss.dbeaver.core.resource.link.folder";
public static final String CMD_CREATE_PROJECT = "org.jkiss.dbeaver.core.project.create";
public static final String CMD_FILTER_CONNECTIONS = "org.jkiss.dbeaver.navigator.filter.connected";
public static final String PARAM_OBJECT_TYPE = "org.jkiss.dbeaver.core.object.type";
public static final String PARAM_OBJECT_TYPE_NAME = "org.jkiss.dbeaver.core.object.typeName";
public static final String PARAM_OBJECT_TYPE_ICON = "org.jkiss.dbeaver.core.object.typeIcon";
......
/*
* 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.navigator.actions;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.commands.IElementUpdater;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.menus.UIElement;
import org.jkiss.dbeaver.ui.ActionUtils;
import org.jkiss.dbeaver.ui.DBeaverIcons;
import org.jkiss.dbeaver.ui.UIIcon;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.navigator.NavigatorCommands;
import org.jkiss.dbeaver.ui.navigator.database.DatabaseNavigatorTree;
import org.jkiss.dbeaver.ui.navigator.database.DatabaseNavigatorView;
import java.util.Map;
public class NavigatorHandlerConnectionFilter extends AbstractHandler implements IElementUpdater {
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
IWorkbenchPart activePart = HandlerUtil.getActivePart(event);
if (activePart instanceof DatabaseNavigatorView) {
DatabaseNavigatorTree navigatorTree = ((DatabaseNavigatorView) activePart).getNavigatorTree();
navigatorTree.setFilterShowConnected(!navigatorTree.isFilterShowConnected());
navigatorTree.getViewer().getControl().setRedraw(false);
try {
navigatorTree.getViewer().refresh();
} finally {
navigatorTree.getViewer().getControl().setRedraw(true);
}
}
ActionUtils.fireCommandRefresh(NavigatorCommands.CMD_FILTER_CONNECTIONS);
return null;
}
@Override
public void updateElement(UIElement element, Map parameters) {
IWorkbenchPartSite partSite = UIUtils.getWorkbenchPartSite(element.getServiceLocator());
if (partSite != null && partSite.getPart() instanceof DatabaseNavigatorView) {
DatabaseNavigatorTree navigatorTree = ((DatabaseNavigatorView) partSite.getPart()).getNavigatorTree();
element.setIcon(DBeaverIcons.getImageDescriptor(
navigatorTree.isFilterShowConnected() ? UIIcon.FILTER_RESET : UIIcon.FILTER_APPLY
));
String actionName = navigatorTree.isFilterShowConnected() ? "Show all" : "Show connected only";
element.setText(actionName);
element.setTooltip(actionName);
}
}
}
\ No newline at end of file
......@@ -19,6 +19,8 @@ package org.jkiss.dbeaver.ui.navigator.database;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TreeEditor;
......@@ -30,10 +32,13 @@ import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchCommandConstants;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.dialogs.PatternFilter;
import org.eclipse.ui.menus.IMenuService;
import org.eclipse.ui.progress.WorkbenchJob;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
......@@ -63,6 +68,7 @@ public class DatabaseNavigatorTree extends Composite implements INavigatorListen
private static final Log log = Log.getLog(DatabaseNavigatorTree.class);
static final String TREE_DATA_STAT_MAX_SIZE = "nav.stat.maxSize";
private static final String FILTER_TOOLBAR_CONTRIBUTION_ID = "toolbar:org.jkiss.dbeaver.navigator.filter.toolbar"; //$NON-NLS-1$
private TreeViewer treeViewer;
private DBNModel model;
......@@ -73,8 +79,9 @@ public class DatabaseNavigatorTree extends Composite implements INavigatorListen
private boolean inlineRenameEnabled = false;
private INavigatorItemRenderer itemRenderer;
public DatabaseNavigatorTree(Composite parent, DBNNode rootNode, int style)
{
private boolean filterShowConnected = false;
public DatabaseNavigatorTree(Composite parent, DBNNode rootNode, int style) {
this(parent, rootNode, style, false);
}
......@@ -133,6 +140,14 @@ public class DatabaseNavigatorTree extends Composite implements INavigatorListen
}
}
public boolean isFilterShowConnected() {
return filterShowConnected;
}
public void setFilterShowConnected(boolean filterShowConnected) {
this.filterShowConnected = filterShowConnected;
}
public ILabelDecorator getLabelDecorator() {
return ((DatabaseNavigatorLabelProvider)treeViewer.getLabelProvider()).getLabelDecorator();
}
......@@ -210,7 +225,7 @@ public class DatabaseNavigatorTree extends Composite implements INavigatorListen
return checkboxTreeViewer;
} else {
if (navigatorFilter != null) {
CustomFilteredTree filteredTree = new CustomFilteredTree(this, treeStyle);
CustomFilteredTree filteredTree = new CustomFilteredTree(treeStyle);
filterControl = filteredTree.getFilterControl();
return filteredTree.getViewer();
} else {
......@@ -582,7 +597,7 @@ public class DatabaseNavigatorTree extends Composite implements INavigatorListen
////////////////////////////////////////////////////////////////////////////
// Filtered tree
private static class TreeFilter extends PatternFilter {
private class TreeFilter extends PatternFilter {
private final INavigatorFilter filter;
private boolean hasPattern = false;
......@@ -609,7 +624,10 @@ public class DatabaseNavigatorTree extends Composite implements INavigatorListen
}
public boolean isElementVisible(Viewer viewer, Object element){
if (hasPattern && filter.filterFolders() && element instanceof DBNLocalFolder) {
if (filterShowConnected && element instanceof DBNDataSource && !((DBNDataSource) element).getDataSourceContainer().isConnected()) {
return false;
}
if ((filterShowConnected || (hasPattern && filter.filterFolders())) && element instanceof DBNLocalFolder) {
return hasVisibleConnections(viewer, (DBNLocalFolder)element);
}
if (filter.select(element)) {
......@@ -629,6 +647,10 @@ public class DatabaseNavigatorTree extends Composite implements INavigatorListen
return true;
}
} else if (isLeafMatch(viewer, child)) {
if (filterShowConnected && child instanceof DBNDataSource && !((DBNDataSource) child).getDataSourceContainer().isConnected()) {
continue;
}
return true;
}
}
......@@ -637,9 +659,10 @@ public class DatabaseNavigatorTree extends Composite implements INavigatorListen
}
private static class CustomFilteredTree extends FilteredTree {
CustomFilteredTree(DatabaseNavigatorTree navigatorTree, int treeStyle) {
super(navigatorTree, treeStyle, new TreeFilter(navigatorTree.navigatorFilter), true);
private class CustomFilteredTree extends FilteredTree {
CustomFilteredTree(int treeStyle) {
super(DatabaseNavigatorTree.this, treeStyle, new TreeFilter(DatabaseNavigatorTree.this.navigatorFilter), true);
try {
if (treeViewer != null) {
treeViewer.setUseHashlookup(true);
......@@ -654,6 +677,27 @@ public class DatabaseNavigatorTree extends Composite implements INavigatorListen
UIUtils.addDefaultEditActionsSupport(UIUtils.getActiveWorkbenchWindow(), getFilterControl());
}
@Override
protected Composite createFilterControls(Composite parent) {
super.createFilterControls(parent);
((GridLayout)parent.getLayout()).numColumns++;
IWorkbenchWindow workbenchWindow = UIUtils.getActiveWorkbenchWindow();
ToolBarManager filterManager = new ToolBarManager();
filterManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
final IMenuService menuService = workbenchWindow.getService(IMenuService.class);
if (menuService != null) {
menuService.populateContributionManager(filterManager, FILTER_TOOLBAR_CONTRIBUTION_ID);
}
filterManager.createControl(parent);
parent.addDisposeListener(e -> filterManager.dispose());
return parent;
}
@Override
protected TreeViewer doCreateTreeViewer(Composite parent, int style) {
return ((DatabaseNavigatorTree)getParent()).doCreateNavigatorTreeViewer(parent, style);
......
......@@ -70,7 +70,7 @@ public abstract class NavigatorViewBase extends ViewPart implements INavigatorMo
return DBWorkbench.getPlatform().getNavigatorModel();
}
protected DatabaseNavigatorTree getNavigatorTree()
public DatabaseNavigatorTree getNavigatorTree()
{
return tree;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册