diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/navigator/DBNDataSource.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/navigator/DBNDataSource.java index 477386b1d15f22ac35bc61ef33dba28cc9c97c88..15c0ee87f33669d08cafacba8fcb035a7e267018 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/navigator/DBNDataSource.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/navigator/DBNDataSource.java @@ -247,4 +247,8 @@ public class DBNDataSource extends DBNDatabaseNode implements IAdaptable, IDataS return node; } + @Override + public String toString() { + return dataSource.toString(); + } } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/navigator/DBNDatabaseFolder.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/navigator/DBNDatabaseFolder.java index f0fd487c6c8cf39f80e3b2de8a9c5c4d8fc049cd..0635b0ff534924a352e3bc46f2e0bef6ab0be329 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/navigator/DBNDatabaseFolder.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/navigator/DBNDatabaseFolder.java @@ -155,4 +155,8 @@ public class DBNDatabaseFolder extends DBNDatabaseNode implements DBNContainer, return childObjects; } + @Override + public String toString() { + return meta.getChildrenType(getDataSource()); + } } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/DataSourceDescriptor.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/DataSourceDescriptor.java index 7aa38b631fa970da4e3e8b86cab4e8bee9f3591e..1bc18636aca47ae24012c0ef7a524d40fbe40987 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/DataSourceDescriptor.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/DataSourceDescriptor.java @@ -1152,4 +1152,8 @@ public class DataSourceDescriptor folderPath = descriptor.folderPath; } + @Override + public String toString() { + return name + " [" + driver + "]"; + } } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/DriverDescriptor.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/DriverDescriptor.java index 449fbeaa2cee1d4f150771ae9033afa719a4a59e..b4a8952b811c48d55d0f96e4419b9f90196e6237 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/DriverDescriptor.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/registry/DriverDescriptor.java @@ -1275,6 +1275,11 @@ public class DriverDescriptor extends AbstractDescriptor implements DBPDriver return divPos == -1 ? sourcesString : sourcesString.substring(0, divPos); } + @Override + public String toString() { + return name; + } + static class DriversParser implements SAXListener { DataSourceProviderDescriptor curProvider; diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/search/AbstractSearchPage.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/search/AbstractSearchPage.java index 04e3619d32c64638077f1af5ba058134a79f9e14..9b28763ae37d6aa7e4837dd8f6ad96784069a1bc 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/search/AbstractSearchPage.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/search/AbstractSearchPage.java @@ -106,6 +106,8 @@ public abstract class AbstractSearchPage extends DialogPage implements IObjectSe Object[] nodes = tree.getViewer() instanceof CheckboxTreeViewer ? ((CheckboxTreeViewer) tree.getViewer()).getCheckedElements() : ((IStructuredSelection)tree.getViewer().getSelection()).toArray(); + Object[] grayed = tree.getViewer() instanceof CheckboxTreeViewer ? + ((CheckboxTreeViewer) tree.getViewer()).getGrayedElements() : null; for (Object obj : nodes) { DBNNode node = (DBNNode) obj; if (sourcesString.length() > 0) { diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/search/data/SearchDataPage.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/search/data/SearchDataPage.java index 4e0db2fe427d0892f52a9c23fc688e295a1f3103..81db635ac1fca4eb0ab2d2e7c294e1f47333cc07 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/search/data/SearchDataPage.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/search/data/SearchDataPage.java @@ -35,12 +35,10 @@ import org.jkiss.dbeaver.core.CoreMessages; import org.jkiss.dbeaver.core.DBeaverCore; import org.jkiss.dbeaver.model.navigator.*; import org.jkiss.dbeaver.model.runtime.DBRProcessListener; -import org.jkiss.dbeaver.model.struct.DBSEntity; -import org.jkiss.dbeaver.model.struct.DBSObject; -import org.jkiss.dbeaver.model.struct.DBSObjectContainer; -import org.jkiss.dbeaver.model.struct.DBSWrapper; +import org.jkiss.dbeaver.model.struct.*; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.search.AbstractSearchPage; +import org.jkiss.dbeaver.ui.views.navigator.database.CheckboxTreeManager; import org.jkiss.dbeaver.ui.views.navigator.database.DatabaseNavigatorTree; import org.jkiss.dbeaver.ui.views.navigator.database.load.TreeLoadNode; import org.jkiss.utils.CommonUtils; @@ -145,32 +143,10 @@ public class SearchDataPage extends AbstractSearchPage { return false; } }); + viewer.addCheckStateListener(new CheckboxTreeManager(viewer, new Class[] {DBSDataSearcher.class})); viewer.addCheckStateListener(new ICheckStateListener() { @Override public void checkStateChanged(CheckStateChangedEvent event) { - if (event.getChecked()) { - final DBNNode node = (DBNNode) event.getElement(); - if (node instanceof DBNDataSource) { - DBNDataSource dsNode = (DBNDataSource) node; - dsNode.initializeNode(null, new DBRProcessListener() { - @Override - public void onProcessFinish(IStatus status) - { - if (status.isOK()) { - Display.getDefault().asyncExec(new Runnable() { - @Override - public void run() - { - if (!dataSourceTree.isDisposed()) { - updateEnablement(); - } - } - }); - } - } - }); - } - } updateEnablement(); } }); diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/search/data/SearchDataQuery.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/search/data/SearchDataQuery.java index d154765a4ea85d38230320ea04b678daa4e7a9fe..06ccb5b5fa423a51b3095438e6e13abe6880d60e 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/search/data/SearchDataQuery.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/search/data/SearchDataQuery.java @@ -64,7 +64,7 @@ public class SearchDataQuery implements IObjectSearchQuery { try { String searchString = params.getSearchString(); - monitor.subTask("Collect tables"); + //monitor.subTask("Collect tables"); List searchers = new ArrayList(); for (DBSObject object : params.sources) { addSearchers(monitor, searchers, object); diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/views/navigator/database/CheckboxTreeManager.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/views/navigator/database/CheckboxTreeManager.java new file mode 100644 index 0000000000000000000000000000000000000000..9d0541264360c2e0ebd67cf15b8c0bcc109753ec --- /dev/null +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/views/navigator/database/CheckboxTreeManager.java @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2010-2014 Serge Rieder + * serge@jkiss.org + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package org.jkiss.dbeaver.ui.views.navigator.database; + +import org.eclipse.jface.viewers.CheckStateChangedEvent; +import org.eclipse.jface.viewers.CheckboxTreeViewer; +import org.eclipse.jface.viewers.ICheckStateListener; +import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.model.navigator.DBNContainer; +import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; +import org.jkiss.dbeaver.runtime.VoidProgressMonitor; +import org.jkiss.dbeaver.ui.UIUtils; +import org.jkiss.utils.CommonUtils; + +import java.util.ArrayList; +import java.util.List; + +public class CheckboxTreeManager implements ICheckStateListener { + + private final CheckboxTreeViewer viewer; + private final Class[] targetTypes; + + public CheckboxTreeManager(CheckboxTreeViewer viewer, Class[] targetTypes) { + this.viewer = viewer; + this.targetTypes = targetTypes; + } + + @Override + public void checkStateChanged(CheckStateChangedEvent event) { + try { + VoidProgressMonitor monitor = VoidProgressMonitor.INSTANCE; + + List targetChildren = new ArrayList(); + List targetContainers = new ArrayList(); + collectChildren(monitor, event.getElement(), targetChildren, targetContainers); + for (DBNDatabaseNode child : targetChildren) { + viewer.setChecked(child, event.getChecked()); + } + for (DBNDatabaseNode container : targetContainers) { + viewer.setChecked(container, event.getChecked()); + if (event.getChecked()) { + boolean missing = false; + List directChildren = container.getChildren(monitor); + if (directChildren != null) { + for (DBNDatabaseNode node : directChildren) { + if (!targetChildren.contains(node)) { + missing = true; + break; + } + } + } + viewer.setGrayed(container, missing); + } else { + viewer.setGrayed(container, false); + } + } + } catch (DBException e) { + UIUtils.showErrorDialog(viewer.getControl().getShell(), "Error", "Can't collect child nodes", e); + } + } + + private boolean collectChildren(DBRProgressMonitor monitor, final Object element, List targetChildren, List targetContainers) throws DBException { + if (element instanceof DBNDatabaseNode) { + for (Class type : targetTypes) { + if (type.isInstance(((DBNDatabaseNode) element).getObject())) { + targetChildren.add((DBNDatabaseNode) element); + return true; + } + } + ((DBNDatabaseNode) element).initializeNode(monitor, null); + List children = ((DBNDatabaseNode) element).getChildren(monitor); + if (!CommonUtils.isEmpty(children)) { + boolean foundChild = false; + for (DBNDatabaseNode child : children) { + if (collectChildren(monitor, child, targetChildren, targetContainers)) { + foundChild = true; + } + } + if (foundChild) { + targetContainers.add((DBNDatabaseNode) element); + } + return foundChild; + } + } + return false; + } + + +} diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/views/navigator/database/DatabaseNavigatorTree.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/views/navigator/database/DatabaseNavigatorTree.java index 046eb1c3d68f2cb45c3e6ffe5701d555e82a9330..ced8cc129944b8a5dd741b4e45af7c4e46e6c990 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/views/navigator/database/DatabaseNavigatorTree.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/views/navigator/database/DatabaseNavigatorTree.java @@ -91,18 +91,18 @@ public class DatabaseNavigatorTree extends Composite implements IDBNListener int treeStyle = SWT.H_SCROLL | SWT.V_SCROLL | style; if (checkEnabled) { this.viewer = new CheckboxTreeViewer(this, treeStyle); - ((CheckboxTreeViewer)this.viewer).setCheckStateProvider(new ICheckStateProvider() { - @Override - public boolean isChecked(Object element) { - TreeItem widget = (TreeItem) viewer.testFindItem(element); - return widget.getChecked(); - } - - @Override - public boolean isGrayed(Object element) { - return element instanceof DBNContainer; - } - }); +// ((CheckboxTreeViewer)this.viewer).setCheckStateProvider(new ICheckStateProvider() { +// @Override +// public boolean isChecked(Object element) { +// TreeItem widget = (TreeItem) viewer.testFindItem(element); +// return widget.getChecked(); +// } +// +// @Override +// public boolean isGrayed(Object element) { +// return element instanceof DBNContainer; +// } +// }); } else { this.viewer = new TreeViewer(this, treeStyle) { @Override