提交 381ad276 编写于 作者: S serge-rider

Datasource selector panel redesign (modeless)

上级 43efce07
......@@ -16,24 +16,8 @@
*/
package org.jkiss.dbeaver.ui.controls;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.jkiss.dbeaver.core.DBeaverCore;
import org.jkiss.dbeaver.model.DBIcon;
import org.jkiss.dbeaver.model.DBPImage;
import org.jkiss.dbeaver.model.navigator.DBNNode;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.ui.UIIcon;
import org.jkiss.dbeaver.ui.controls.itemlist.ItemListControl;
import org.jkiss.dbeaver.ui.dialogs.BaseDialog;
import org.jkiss.dbeaver.ui.dialogs.connection.SelectDataSourceDialog;
/**
* Image combo
......
/*
* 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.action.Action;
import org.eclipse.jface.action.IContributionManager;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.IFontProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.graphics.Font;
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.eclipse.swt.widgets.Text;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.core.DBeaverUI;
import org.jkiss.dbeaver.model.DBPImage;
import org.jkiss.dbeaver.model.DBPObject;
import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.load.AbstractLoadService;
import org.jkiss.dbeaver.model.struct.DBSWrapper;
import org.jkiss.dbeaver.ui.*;
import org.jkiss.dbeaver.ui.controls.ListContentProvider;
import org.jkiss.dbeaver.ui.controls.itemlist.DatabaseObjectListControl;
import org.jkiss.utils.CommonUtils;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* SelectObjectDialog
*
* @author Serge Rider
*/
public abstract class AbstractPopupPanel extends Dialog {
private final String title;
private boolean modeless;
protected AbstractPopupPanel(Shell parentShell, String title)
{
super(parentShell);
this.title = title;
}
@Override
protected boolean isResizable()
{
return true;
}
public boolean isModeless() {
return modeless;
}
public void setModeless(boolean modeless) {
this.modeless = modeless;
if (modeless) {
setShellStyle(SWT.SHELL_TRIM);
} else {
setShellStyle(SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL | SWT.MAX | SWT.RESIZE);
}
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(title);
}
@Override
protected Control createButtonBar(Composite parent) {
if (this.modeless) {
return UIUtils.createPlaceholder(parent, 1);
}
return super.createButtonBar(parent);
}
protected void closeOnFocusLost(Control ... controls) {
if (modeless) {
FocusAdapter focusListener = new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
DBeaverUI.asyncExec(() -> {
if (!UIUtils.isParent(getShell(), getShell().getDisplay().getFocusControl())) {
cancelPressed();
}
});
}
};
for (Control ctrl : controls) {
if (ctrl != null) {
ctrl.addFocusListener(focusListener);
}
}
}
}
}
......@@ -18,21 +18,19 @@ package org.jkiss.dbeaver.ui.dialogs;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IContributionManager;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.IFontProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.graphics.Font;
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.eclipse.swt.widgets.Text;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.core.DBeaverUI;
import org.jkiss.dbeaver.model.DBPImage;
import org.jkiss.dbeaver.model.DBPObject;
import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode;
......@@ -54,22 +52,19 @@ import java.util.List;
*
* @author Serge Rider
*/
public class SelectObjectDialog<T extends DBPObject> extends Dialog {
public class SelectObjectDialog<T extends DBPObject> extends AbstractPopupPanel {
private static final String DIALOG_ID = "DBeaver.SelectObjectDialog";//$NON-NLS-1$
private String title;
private String listId;
private Collection<T> objects;
private List<T> selectedObjects = new ArrayList<>();
private boolean singleSelection;
private Font boldFont;
private boolean modeless;
public SelectObjectDialog(Shell parentShell, String title, boolean singleSelection, String listId, Collection<T> objects, Collection<T> selected)
{
super(parentShell);
this.title = title;
super(parentShell, title);
this.singleSelection = singleSelection;
this.listId = listId;
this.objects = new ArrayList<>(objects);
......@@ -85,26 +80,9 @@ public class SelectObjectDialog<T extends DBPObject> extends Dialog {
return UIUtils.getDialogSettings(DIALOG_ID + "." + listId);
}
@Override
protected boolean isResizable()
{
return true;
}
public void setModeless(boolean modeless) {
this.modeless = modeless;
if (modeless) {
setShellStyle(SWT.SHELL_TRIM);
} else {
setShellStyle(SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL | SWT.MAX | SWT.RESIZE);
}
}
@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);
......@@ -145,23 +123,7 @@ public class SelectObjectDialog<T extends DBPObject> extends Dialog {
performSearch(ISearchContextProvider.SearchType.NONE);
getItemsViewer().getControl().setFocus();
if (modeless) {
FocusAdapter focusListener = new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
DBeaverUI.asyncExec(() -> {
if (!UIUtils.isParent(getShell(), getShell().getDisplay().getFocusControl())) {
cancelPressed();
}
});
}
};
getItemsViewer().getControl().addFocusListener(focusListener);
Text searchControl = getSearchTextControl();
if (searchControl != null) {
searchControl.addFocusListener(focusListener);
}
}
closeOnFocusLost(getItemsViewer().getControl(), getSearchTextControl());
}
});
}
......@@ -238,12 +200,12 @@ public class SelectObjectDialog<T extends DBPObject> extends Dialog {
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
selectedObjects.clear();
selectedObjects.addAll(selection.toList());
if (!modeless) {
if (!isModeless()) {
getButton(IDialogConstants.OK_ID).setEnabled(!selectedObjects.isEmpty());
}
});
objectList.setDoubleClickHandler(event -> {
if (modeless || getButton(IDialogConstants.OK_ID).isEnabled()) {
if (isModeless() || getButton(IDialogConstants.OK_ID).isEnabled()) {
okPressed();
}
});
......@@ -253,14 +215,6 @@ public class SelectObjectDialog<T extends DBPObject> extends Dialog {
return group;
}
@Override
protected Control createButtonBar(Composite parent) {
if (this.modeless) {
return UIUtils.createPlaceholder(parent, 1);
}
return super.createButtonBar(parent);
}
@Override
public int open() {
int result = super.open();
......@@ -274,7 +228,7 @@ public class SelectObjectDialog<T extends DBPObject> extends Dialog {
protected Control createContents(Composite parent)
{
Control ctl = super.createContents(parent);
if (!modeless) {
if (!isModeless()) {
getButton(IDialogConstants.OK_ID).setEnabled(false);
}
return ctl;
......
......@@ -27,6 +27,7 @@ import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.dialogs.FilteredTree;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.core.CoreMessages;
......@@ -35,6 +36,7 @@ import org.jkiss.dbeaver.core.DBeaverUI;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.navigator.*;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.dialogs.AbstractPopupPanel;
import org.jkiss.dbeaver.ui.navigator.database.DatabaseNavigatorTree;
/**
......@@ -42,7 +44,7 @@ import org.jkiss.dbeaver.ui.navigator.database.DatabaseNavigatorTree;
*
* @author Serge Rider
*/
public class SelectDataSourceDialog extends Dialog {
public class SelectDataSourceDialog extends AbstractPopupPanel {
private static final String PARAM_SHOW_CONNECTED = "showConnected";
private static final String PARAM_SHOW_ALL_PROJECTS = "showAllProjects";
......@@ -59,7 +61,7 @@ public class SelectDataSourceDialog extends Dialog {
public SelectDataSourceDialog(@NotNull Shell parentShell, @Nullable IProject project, DBPDataSourceContainer selection)
{
super(parentShell);
super(parentShell, CoreMessages.dialog_select_datasource_title);
this.project = project;
this.dataSource = selection;
}
......@@ -70,17 +72,9 @@ public class SelectDataSourceDialog extends Dialog {
return UIUtils.getDialogSettings(DIALOG_ID);
}
@Override
protected boolean isResizable()
{
return true;
}
@Override
protected Control createDialogArea(Composite parent)
{
getShell().setText(CoreMessages.dialog_select_datasource_title);
showConnected = getDialogBoundsSettings().getBoolean(PARAM_SHOW_CONNECTED);
showAllProjects = getDialogBoundsSettings().getBoolean(PARAM_SHOW_ALL_PROJECTS);
......@@ -106,43 +100,45 @@ public class SelectDataSourceDialog extends Dialog {
gd.minimumWidth = 100;
dataSourceTree.setLayoutData(gd);
final TreeViewer treeViewer = dataSourceTree.getViewer();
final Text descriptionText = new Text(group, SWT.READ_ONLY);
descriptionText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
final Button showConnectedCheck = new Button(group, SWT.CHECK);
showConnectedCheck.setText("Show connected databases only");
showConnectedCheck.setText("Show &connected databases only");
showConnectedCheck.setSelection(showConnected);
showConnectedCheck.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
showConnected = showConnectedCheck.getSelection();
dataSourceTree.getViewer().getControl().setRedraw(false);
treeViewer.getControl().setRedraw(false);
try {
dataSourceTree.getViewer().refresh();
treeViewer.refresh();
if (showConnected) {
dataSourceTree.getViewer().expandAll();
treeViewer.expandAll();
}
} finally {
dataSourceTree.getViewer().getControl().setRedraw(true);
treeViewer.getControl().setRedraw(true);
}
getDialogBoundsSettings().put(PARAM_SHOW_CONNECTED, showConnected);
}
});
final Button showAllProjectsCheck = new Button(group, SWT.CHECK);
showAllProjectsCheck.setText("Show all projects");
showAllProjectsCheck.setText("Show &all projects");
showAllProjectsCheck.setSelection(showAllProjects);
showAllProjectsCheck.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
showAllProjects = showAllProjectsCheck.getSelection();
dataSourceTree.getViewer().getControl().setRedraw(false);
treeViewer.getControl().setRedraw(false);
try {
dataSourceTree.reloadTree(getTreeRootNode());
if (showAllProjects) {
dataSourceTree.getViewer().expandToLevel(3);
treeViewer.expandToLevel(3);
}
} finally {
dataSourceTree.getViewer().getControl().setRedraw(true);
treeViewer.getControl().setRedraw(true);
}
getDialogBoundsSettings().put(PARAM_SHOW_ALL_PROJECTS, showAllProjects);
}
......@@ -151,11 +147,11 @@ public class SelectDataSourceDialog extends Dialog {
if (this.dataSource != null) {
DBNDatabaseNode dsNode = core.getNavigatorModel().getNodeByObject(this.dataSource);
if (dsNode != null) {
dataSourceTree.getViewer().setSelection(new StructuredSelection(dsNode), true);
treeViewer.setSelection(new StructuredSelection(dsNode), true);
}
}
dataSourceTree.getViewer().addFilter(new ViewerFilter() {
treeViewer.addFilter(new ViewerFilter() {
@Override
public boolean select(Viewer viewer, Object parentElement, Object element)
{
......@@ -170,7 +166,7 @@ public class SelectDataSourceDialog extends Dialog {
return element instanceof DBNProject || element instanceof DBNProjectDatabases || element instanceof DBNLocalFolder || element instanceof DBNDataSource;
}
});
dataSourceTree.getViewer().addSelectionChangedListener(
treeViewer.addSelectionChangedListener(
event -> {
IStructuredSelection structSel = (IStructuredSelection) event.getSelection();
Object selNode = structSel.isEmpty() ? null : structSel.getFirstElement();
......@@ -188,18 +184,25 @@ public class SelectDataSourceDialog extends Dialog {
}
}
);
dataSourceTree.getViewer().addDoubleClickListener(event -> {
treeViewer.addDoubleClickListener(event -> {
if (getButton(IDialogConstants.OK_ID).isEnabled()) {
okPressed();
}
});
DBeaverUI.asyncExec(() -> {
dataSourceTree.getViewer().getControl().setFocus();
treeViewer.getControl().setFocus();
if (showConnected) {
dataSourceTree.getViewer().expandAll();
treeViewer.expandAll();
}
});
closeOnFocusLost(
treeViewer.getControl(),
dataSourceTree.getFilterControl(),
descriptionText,
showConnectedCheck,
showAllProjectsCheck);
return group;
}
......@@ -230,9 +233,11 @@ public class SelectDataSourceDialog extends Dialog {
composite.setFont(parent.getFont());
// Add the buttons to the button bar.
createButton(composite, IDialogConstants.OK_ID, "Select", true);
createButton(composite, IDialogConstants.IGNORE_ID, "None", false);
createButton(composite, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
createButton(composite, IDialogConstants.OK_ID, "&Select", true);
createButton(composite, IDialogConstants.IGNORE_ID, "&None", false);
if (!isModeless()) {
createButton(composite, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
}
return composite;
}
......
......@@ -35,6 +35,7 @@ import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.dialogs.PatternFilter;
import org.eclipse.ui.progress.WorkbenchJob;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.DBeaverPreferences;
import org.jkiss.dbeaver.Log;
......@@ -64,6 +65,7 @@ public class DatabaseNavigatorTree extends Composite implements INavigatorListen
private boolean checkEnabled;
private ISelection defaultSelection;
private IFilter navigatorFilter;
private Text filterControl;
public DatabaseNavigatorTree(Composite parent, DBNNode rootNode, int style)
{
......@@ -115,6 +117,11 @@ public class DatabaseNavigatorTree extends Composite implements INavigatorListen
treeViewer.setInput(new DatabaseNavigatorContent(rootNode));
}
@Nullable
public Text getFilterControl() {
return filterControl;
}
private TreeViewer doCreateTreeViewer(Composite parent, int style) {
checkEnabled = (style & SWT.CHECK) != 0;
......@@ -125,6 +132,7 @@ public class DatabaseNavigatorTree extends Composite implements INavigatorListen
} else {
if (navigatorFilter != null) {
CustomFilteredTree filteredTree = new CustomFilteredTree(this, treeStyle);
filterControl = filteredTree.getFilterControl();
return filteredTree.getViewer();
} else {
return doCreateNavigatorTreeViewer(parent, style);
......
......@@ -810,6 +810,7 @@ public class DataSourceManagementToolbar implements DBPRegistryListener, DBPEven
void showConnectionSelector() {
SelectDataSourceDialog dialog = new SelectDataSourceDialog(connectionCombo.getShell(), getActiveProject(), connectionCombo.getSelectedItem());
dialog.setModeless(true);
if (dialog.open() == IDialogConstants.CANCEL_ID) {
return;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册