/*
* 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.dialogs;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.navigator.*;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.model.struct.DBSWrapper;
import org.jkiss.dbeaver.ui.navigator.database.DatabaseNavigatorTree;
import org.jkiss.dbeaver.ui.navigator.database.load.TreeLoadNode;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* BrowseObjectDialog
*
* @author Serge Rider
*/
public class BrowseObjectDialog extends Dialog {
private String title;
private DBNNode rootNode;
private DBNNode selectedNode;
private boolean singleSelection;
private Class<?>[] allowedTypes;
private Class<?>[] resultTypes;
private List<DBNNode> selectedObjects = new ArrayList<>();
private DatabaseNavigatorTree navigatorTree;
private BrowseObjectDialog(
Shell parentShell,
String title,
DBNNode rootNode,
DBNNode selectedNode,
boolean singleSelection,
Class<?>[] allowedTypes,
Class<?>[] resultTypes)
{
super(parentShell);
this.title = title;
this.rootNode = rootNode;
this.selectedNode = selectedNode;
this.singleSelection = singleSelection;
this.allowedTypes = allowedTypes;
this.resultTypes = resultTypes == null ? allowedTypes : resultTypes;
}
@Override
protected boolean isResizable()
{
return true;
}
@Override
protected Control createDialogArea(Composite parent)
{
getShell().setText(title);
Composite group = (Composite) super.createDialogArea(parent);
GridData gd = new GridData(GridData.FILL_BOTH);
group.setLayoutData(gd);
navigatorTree = new DatabaseNavigatorTree(group, rootNode, (singleSelection ? SWT.SINGLE : SWT.MULTI) | SWT.BORDER);
gd = new GridData(GridData.FILL_BOTH);
gd.widthHint = 500;
gd.heightHint = 500;
navigatorTree.setLayoutData(gd);
navigatorTree.getViewer().addFilter(new ViewerFilter() {
@Override
public boolean select(Viewer viewer, Object parentElement, Object element)
{
if (element instanceof TreeLoadNode || element instanceof DBNLocalFolder) {
return true;
}
if (element instanceof DBNNode) {
if (element instanceof DBNDatabaseFolder) {
DBNDatabaseFolder folder = (DBNDatabaseFolder) element;
Class<? extends DBSObject> folderItemsClass = folder.getChildrenClass();
return folderItemsClass != null && matchesType(folderItemsClass, false);
}
if (element instanceof DBNProject || element instanceof DBNProjectDatabases ||
element instanceof DBNDataSource ||
(element instanceof DBSWrapper && matchesType(((DBSWrapper) element).getObject().getClass(), false)))
{
return true;
}
}
return false;
}
});
if (selectedNode != null) {
navigatorTree.getViewer().setSelection(new StructuredSelection(selectedNode));
selectedObjects.add(selectedNode);
}
navigatorTree.getViewer().addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event)
{
selectedObjects.clear();
IStructuredSelection selection = (IStructuredSelection) navigatorTree.getViewer().getSelection();
for (Iterator iter = selection.iterator(); iter.hasNext(); ) {
DBNNode node = (DBNNode) iter.next();
if (node instanceof DBSWrapper) {
DBSObject object = DBUtils.getAdapter(DBSObject.class, ((DBSWrapper) node).getObject());
if (object != null && matchesType(object.getClass(), true)) {
selectedObjects.add(node);
}
}
}
getButton(IDialogConstants.OK_ID).setEnabled(!selectedObjects.isEmpty());
}
});
return group;
}
private boolean matchesType(Class<?> nodeType, boolean result)
{
for (Class<?> ot : result ? resultTypes : allowedTypes) {
if (ot.isAssignableFrom(nodeType)) {
return true;
}
}
return false;
}
@Override
protected Control createContents(Composite parent)
{
Control contents = super.createContents(parent);
getButton(IDialogConstants.OK_ID).setEnabled(!selectedObjects.isEmpty());
return contents;
}
@Override
protected void okPressed()
{
super.okPressed();
}
public List<DBNNode> getSelectedObjects()
{
return selectedObjects;
}
/*
public static List<DBNNode> selectObjects(Shell parentShell, String title, DBNNode rootNode, DBNNode selectedNode, Class ... allowedTypes)
{
BrowseObjectDialog scDialog = new BrowseObjectDialog(parentShell, title, rootNode, selectedNode, false, allowedTypes);
if (scDialog.open() == IDialogConstants.OK_ID) {
return scDialog.getSelectedObjects();
} else {
return null;
}
}
*/
public static DBNNode selectObject(Shell parentShell, String title, DBNNode rootNode, DBNNode selectedNode, Class<?>[] allowedTypes, Class<?>[] resultTypes)
{
BrowseObjectDialog scDialog = new BrowseObjectDialog(parentShell, title, rootNode, selectedNode, true, allowedTypes, resultTypes);
if (scDialog.open() == IDialogConstants.OK_ID) {
List<DBNNode> result = scDialog.getSelectedObjects();
return result.isEmpty() ? null : result.get(0);
} else {
return null;
}
}
}