/*
* 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.driver;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.*;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.jkiss.dbeaver.core.CoreMessages;
import org.jkiss.dbeaver.core.DBeaverActivator;
import org.jkiss.dbeaver.model.DBIcon;
import org.jkiss.dbeaver.registry.DataSourceDescriptor;
import org.jkiss.dbeaver.registry.DataSourceProviderDescriptor;
import org.jkiss.dbeaver.registry.DataSourceProviderRegistry;
import org.jkiss.dbeaver.registry.driver.DriverDescriptor;
import org.jkiss.dbeaver.ui.IHelpContextIds;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.dialogs.HelpEnabledDialog;
import org.jkiss.utils.CommonUtils;
import java.util.List;
/**
* EditDriverDialog
*/
public class DriverManagerDialog extends HelpEnabledDialog implements ISelectionChangedListener, IDoubleClickListener {
private static final String DIALOG_ID = "DBeaver.DriverManagerDialog";//$NON-NLS-1$
public static final String DEFAULT_DS_PROVIDER = "generic";
private DataSourceProviderDescriptor selectedProvider;
private DataSourceProviderDescriptor onlyManagableProvider;
private String selectedCategory;
private DriverDescriptor selectedDriver;
private Button newButton;
private Button editButton;
private Button deleteButton;
private DriverTreeControl treeControl;
private Image dialogImage;
//private Label driverDescription;
//private ProgressMonitorPart monitorPart;
private Text descText;
public DriverManagerDialog(Shell shell)
{
super(shell, IHelpContextIds.CTX_DRIVER_MANAGER);
}
@Override
protected IDialogSettings getDialogBoundsSettings()
{
return UIUtils.getDialogSettings(DIALOG_ID);
}
@Override
protected Control createDialogArea(Composite parent)
{
List<DataSourceProviderDescriptor> providers = DataSourceProviderRegistry.getInstance().getDataSourceProviders();
{
DataSourceProviderDescriptor manProvider = null;
for (DataSourceProviderDescriptor provider : providers) {
if (provider.isDriversManagable()) {
if (manProvider != null) {
manProvider = null;
break;
}
manProvider = provider;
}
}
if (manProvider != null) {
onlyManagableProvider = manProvider;
}
}
getShell().setText(CoreMessages.dialog_driver_manager_title);
getShell().setMinimumSize(300, 300);
dialogImage = DBeaverActivator.getImageDescriptor("/icons/driver_manager.png").createImage(); //$NON-NLS-1$
getShell().setImage(dialogImage);
Composite group = UIUtils.createPlaceholder((Composite) super.createDialogArea(parent), 2);
group.setLayoutData(new GridData(GridData.FILL_BOTH));
{
treeControl = new DriverTreeControl(group, this, providers, false);
GridData gd = new GridData(GridData.FILL_BOTH);
gd.heightHint = 300;
gd.widthHint = 300;
treeControl.setLayoutData(gd);
}
{
Composite buttonBar = new Composite(group, SWT.TOP);
buttonBar.setLayout(new GridLayout(1, false));
GridData gd = new GridData(GridData.FILL_VERTICAL);
gd.minimumWidth = 100;
buttonBar.setLayoutData(gd);
newButton = new Button(buttonBar, SWT.FLAT | SWT.PUSH);
newButton.setText(CoreMessages.dialog_driver_manager_button_new);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.widthHint = 100;
newButton.setLayoutData(gd);
newButton.addSelectionListener(new SelectionListener()
{
@Override
public void widgetSelected(SelectionEvent e)
{
createDriver();
}
@Override
public void widgetDefaultSelected(SelectionEvent e)
{
}
});
editButton = new Button(buttonBar, SWT.FLAT | SWT.PUSH);
editButton.setText(CoreMessages.dialog_driver_manager_button_edit);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.widthHint = 100;
editButton.setLayoutData(gd);
editButton.addSelectionListener(new SelectionListener()
{
@Override
public void widgetSelected(SelectionEvent e)
{
editDriver();
}
@Override
public void widgetDefaultSelected(SelectionEvent e)
{
}
});
deleteButton = new Button(buttonBar, SWT.FLAT | SWT.PUSH);
deleteButton.setText(CoreMessages.dialog_driver_manager_button_delete);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.widthHint = 100;
deleteButton.setLayoutData(gd);
deleteButton.addSelectionListener(new SelectionListener()
{
@Override
public void widgetSelected(SelectionEvent e)
{
deleteDriver();
}
@Override
public void widgetDefaultSelected(SelectionEvent e)
{
}
});
{
final Composite legend = UIUtils.createPlaceholder(buttonBar, 2, 5);
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.verticalIndent = 5;
gd.horizontalSpan = 2;
legend.setLayoutData(gd);
UIUtils.createLabel(legend, DBIcon.OVER_LAMP);
UIUtils.createLabel(legend, CoreMessages.dialog_driver_manager_label_user_defined);
UIUtils.createLabel(legend, DBIcon.OVER_ERROR);
UIUtils.createLabel(legend, CoreMessages.dialog_driver_manager_label_unavailable);
}
}
descText = new Text(group, SWT.READ_ONLY);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.verticalIndent = 5;
gd.horizontalSpan = 2;
gd.grabExcessHorizontalSpace = true;
descText.setLayoutData(gd);
/*
monitorPart = new ProgressMonitorPart(group, null, true);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.verticalIndent = 5;
gd.horizontalSpan = 2;
gd.grabExcessHorizontalSpace = true;
monitorPart.setLayoutData(gd);
monitorPart.setVisible(false);
*/
setDefaultSelection();
this.updateButtons();
return group;
}
@Override
protected void createButtonsForButtonBar(Composite parent)
{
createButton(
parent,
IDialogConstants.CLOSE_ID,
IDialogConstants.CLOSE_LABEL,
true);
}
@Override
protected void buttonPressed(int buttonId)
{
if (buttonId == IDialogConstants.CLOSE_ID) {
setReturnCode(OK);
close();
}
}
@Override
public void selectionChanged(SelectionChangedEvent event)
{
setDefaultSelection();
ISelection selection = event.getSelection();
if (selection instanceof IStructuredSelection) {
Object selectedObject = ((IStructuredSelection) selection).getFirstElement();
if (selectedObject instanceof DriverDescriptor) {
this.selectedDriver = (DriverDescriptor) selectedObject;
this.selectedCategory = selectedDriver.getCategory();
this.selectedProvider = selectedDriver.getProviderDescriptor();
} else if (selectedObject instanceof DataSourceProviderDescriptor) {
this.selectedProvider = (DataSourceProviderDescriptor)selectedObject;
} else if (selectedObject instanceof DriverTreeViewer.DriverCategory) {
//this.selectedProvider = null;
this.selectedCategory = ((DriverTreeViewer.DriverCategory) selectedObject).getName();
}
}
//super.updateStatus(new Status(Status.INFO, DBeaverConstants.PLUGIN_ID, selectedDriver == null ? "" : selectedDriver.getDescription()));
this.updateButtons();
}
private void setDefaultSelection() {
this.selectedDriver = null;
this.selectedProvider = DataSourceProviderRegistry.getInstance().getDataSourceProvider(DEFAULT_DS_PROVIDER);
this.selectedCategory = null;
}
@Override
public void doubleClick(DoubleClickEvent event)
{
if (selectedDriver != null) {
editDriver();
}
}
private void updateButtons()
{
newButton.setEnabled(onlyManagableProvider != null || (selectedProvider != null && selectedProvider.isDriversManagable()));
editButton.setEnabled(selectedDriver != null);
deleteButton.setEnabled(selectedDriver != null && selectedDriver.getProviderDescriptor().isDriversManagable());
if (selectedDriver != null) {
descText.setText(CommonUtils.toString(selectedDriver.getDescription()));
} else if (selectedCategory != null) {
descText.setText(selectedCategory + " drivers");
} else if (selectedProvider != null) {
descText.setText(selectedProvider.getName() + " provider");
} else {
descText.setText("");
}
/*
if (selectedDriver != null) {
monitorPart.setTaskName(CommonUtils.toString(selectedDriver.getDescription()));
} else if (selectedCategory != null) {
monitorPart.setTaskName(selectedCategory + " drivers");
} else if (selectedProvider != null) {
monitorPart.setTaskName(selectedProvider.getName() + " provider");
} else {
monitorPart.setTaskName("");
}
*/
}
private void createDriver()
{
if (onlyManagableProvider != null || selectedProvider != null) {
DataSourceProviderDescriptor provider = selectedProvider;
if (provider == null || !provider.isDriversManagable()) {
provider = onlyManagableProvider;
}
DriverEditDialog dialog = new DriverEditDialog(getShell(), provider, selectedCategory);
if (dialog.open() == IDialogConstants.OK_ID) {
treeControl.getViewer().refresh();
}
}
}
private void editDriver()
{
DriverDescriptor driver = selectedDriver;
if (driver != null) {
//driver.validateFilesPresence(this);
DriverEditDialog dialog = new DriverEditDialog(getShell(), driver);
if (dialog.open() == IDialogConstants.OK_ID) {
// Do nothing
}
treeControl.getViewer().refresh(driver);
}
}
private void deleteDriver()
{
List<DataSourceDescriptor> usedDS = selectedDriver.getUsedBy();
if (!usedDS.isEmpty()) {
StringBuilder message = new StringBuilder(NLS.bind(CoreMessages.dialog_driver_manager_message_cant_delete_text, selectedDriver.getName()));
for (DataSourceDescriptor ds : usedDS) {
message.append("\n - ").append(ds.getName());
}
UIUtils.showMessageBox(getShell(), CoreMessages.dialog_driver_manager_message_cant_delete_title, message.toString(), SWT.ICON_ERROR);
return;
}
if (UIUtils.confirmAction(
getShell(),
CoreMessages.dialog_driver_manager_message_delete_driver_title,
CoreMessages.dialog_driver_manager_message_delete_driver_text + selectedDriver.getName() + "'?"))
{
selectedDriver.getProviderDescriptor().removeDriver(selectedDriver);
selectedDriver.getProviderDescriptor().getRegistry().saveDrivers();
treeControl.getViewer().refresh();
}
}
@Override
public boolean close()
{
UIUtils.dispose(dialogImage);
return super.close();
}
/* @Override
public void run(boolean fork, boolean cancelable, final DBRRunnableWithProgress runnable) throws InvocationTargetException, InterruptedException
{
// Code copied from WizardDialog
if (monitorPart != null) {
monitorPart.setVisible(true);
monitorPart.layout();
monitorPart.attachToCancelComponent(null);
}
// The operation can only be canceled if it is executed in a separate
// thread.
// Otherwise the UI is blocked anyway.
try {
ModalContext.run(
new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
runnable.run(new DefaultProgressMonitor(monitor));
}
},
true,
monitorPart,
getShell().getDisplay());
} finally {
// explicitly invoke done() on our progress monitor so that its
// label does not spill over to the next invocation, see bug 271530
if (monitorPart != null) {
monitorPart.done();
monitorPart.setVisible(false);
}
}
}*/
}