/*
* Copyright (C) 2007 SQL Explorer Development Team http://sourceforge.net/projects/eclipsesql
*
* This program 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 net.sourceforge.sqlexplorer.preferences;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import net.sourceforge.sqlexplorer.EDriverName;
import net.sourceforge.sqlexplorer.ExplorerException;
import net.sourceforge.sqlexplorer.IConstants;
import net.sourceforge.sqlexplorer.Messages;
import net.sourceforge.sqlexplorer.dbproduct.DriverManager;
import net.sourceforge.sqlexplorer.dbproduct.ManagedDriver;
import net.sourceforge.sqlexplorer.dialogs.CreateDriverDlg;
import net.sourceforge.sqlexplorer.plugin.SQLExplorerPlugin;
import net.sourceforge.sqlexplorer.util.ImageUtil;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.PlatformUI;
/**
* This class is used to define a preference page for JDBC drivers.
*
* The intention is to remove the need for the "Driver" view and to replace this with a "JDBC
* Drivers" preference page. The UI is identical to the view except for the removal of the toolbar and the addition
* of Add, Edit, Copy, Remove and Set Default buttons.
*
* @author <A HREF="mailto:dbulua@progress.com">Don Bulua</A>
* @modified Davy Vanherbergen
*/
public class DriverPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
private TableViewer _tableViewer;
private Font _boldfont;
private IPreferenceStore _prefs;
private DriverManager _driverModel;
/**
*
*/
public DriverPreferencePage() {
super();
}
/**
* @param title
*/
public DriverPreferencePage(String title) {
super(title);
}
/**
* @param title
* @param image
*/
public DriverPreferencePage(String title, ImageDescriptor image) {
super(title, image);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite) The UI is
* defined in the DriverContainerGroup class. Note: The [Restore Default] and [Apply] buttons have been removed
* using the noDefaultandApplyButton method as these don't apply since all updates are made in the corresponding
* dialogs.
*/
@Override
protected Control createContents(Composite parent) {
noDefaultAndApplyButton();
_driverModel = SQLExplorerPlugin.getDefault().getDriverModel();
PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, SQLExplorerPlugin.PLUGIN_ID + ".DriverContainerGroup");
_prefs = SQLExplorerPlugin.getDefault().getPreferenceStore();
GridLayout parentLayout = new GridLayout(1, false);
parentLayout.marginTop = parentLayout.marginBottom = 0;
parentLayout.marginHeight = 0;
parentLayout.verticalSpacing = 10;
parent.setLayout(parentLayout);
GridLayout layout;
Composite myComposite = new Composite(parent, SWT.NONE);
// Define layout.
layout = new GridLayout();
layout.numColumns = 2;
layout.marginWidth = layout.marginHeight = 0;
layout.horizontalSpacing = 20;
layout.verticalSpacing = 10;
myComposite.setLayout(layout);
myComposite.setLayoutData(new GridData(SWT.FILL, SWT.LEFT, true, true));
GridData gid = new GridData(GridData.FILL_BOTH);
gid.grabExcessHorizontalSpace = gid.grabExcessVerticalSpace = true;
gid.horizontalAlignment = gid.verticalAlignment = GridData.FILL;
gid.verticalSpan = 6;
_tableViewer = new TableViewer(myComposite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
_tableViewer.getControl().setLayoutData(gid);
_tableViewer.setContentProvider(new DriverContentProvider());
final DriverLabelProvider dlp = new DriverLabelProvider();
_tableViewer.setLabelProvider(dlp);
_tableViewer.getTable().addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
dlp.dispose();
if (_boldfont != null) {
_boldfont.dispose();
}
}
});
_tableViewer.getTable().addMouseListener(new MouseAdapter() {
@Override
public void mouseDoubleClick(MouseEvent e) {
changeDriver();
}
});
_tableViewer.setInput(_driverModel);
selectFirst();
final Table table = _tableViewer.getTable();
myComposite.layout();
parent.layout();
// Add Buttons
gid = new GridData(GridData.FILL);
gid.widthHint = 75;
Button add = new Button(myComposite, SWT.PUSH);
add.setText(Messages.getString("Preferences.Drivers.Button.Add"));
add.setLayoutData(gid);
add.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
CreateDriverDlg dlg = new CreateDriverDlg(getShell(), CreateDriverDlg.Type.CREATE, null);
dlg.open();
_tableViewer.refresh();
selectFirst();
}
});
gid = new GridData(GridData.FILL);
gid.widthHint = 75;
Button edit = new Button(myComposite, SWT.PUSH);
edit.setText(Messages.getString("Preferences.Drivers.Button.Edit"));
edit.setLayoutData(gid);
edit.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
changeDriver();
_tableViewer.refresh();
}
});
gid = new GridData(GridData.FILL);
gid.widthHint = 75;
Button copy = new Button(myComposite, SWT.PUSH);
copy.setText(Messages.getString("Preferences.Drivers.Button.Copy"));
copy.setLayoutData(gid);
copy.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
StructuredSelection sel = (StructuredSelection) _tableViewer.getSelection();
ManagedDriver dv = (ManagedDriver) sel.getFirstElement();
if (dv != null) {
CreateDriverDlg dlg = new CreateDriverDlg(getShell(), CreateDriverDlg.Type.COPY, dv);
dlg.open();
_tableViewer.refresh();
}
}
});
gid = new GridData(GridData.FILL);
gid.widthHint = 75;
Button remove = new Button(myComposite, SWT.PUSH);
remove.setText(Messages.getString("Preferences.Drivers.Button.Remove"));
remove.setLayoutData(gid);
remove.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
StructuredSelection sel = (StructuredSelection) _tableViewer.getSelection();
ManagedDriver managedDriver = (ManagedDriver) sel.getFirstElement();
if (managedDriver != null) {
// when the driver is used by other Aliases, give a warning to user
if (managedDriver.isUsedByAliases()) {
MessageDialog.openWarning(getShell(), Messages.getString("Preferences.Drivers.ConfirmDelete.Title"),
Messages.getString("Preferences.Drivers.ConfirmDelete.Warning"));
} else {
boolean okToDelete = MessageDialog.openConfirm(
getShell(),
Messages.getString("Preferences.Drivers.ConfirmDelete.Title"),
Messages.getString("Preferences.Drivers.ConfirmDelete.Prefix")
+ _tableViewer.getTable().getSelection()[0].getText()
+ Messages.getString("Preferences.Drivers.ConfirmDelete.Postfix"));
if (okToDelete) {
_driverModel.removeDriver(managedDriver);
_tableViewer.refresh();
selectFirst();
}
}
}
}
});
gid = new GridData(GridData.FILL);
gid.widthHint = 73;
Button bdefault = new Button(myComposite, SWT.PUSH);
bdefault.setText(Messages.getString("Preferences.Drivers.Button.Default"));
bdefault.setLayoutData(gid);
// Remove bold font on all elements, and make selected element bold
bdefault.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
for (int i = 0; i < _tableViewer.getTable().getItemCount(); i++) {
_tableViewer.getTable().getItem(i).setFont(0, table.getFont());
}
_boldfont = new Font(_tableViewer.getTable().getDisplay(), table.getFont().toString(), table.getFont()
.getFontData()[0].getHeight(), SWT.BOLD);
_tableViewer.getTable().getSelection()[0].setFont(0, _boldfont);
_prefs.setValue(IConstants.DEFAULT_DRIVER, _tableViewer.getTable().getSelection()[0].getText());
}
});
// add button to restore default drivers
Button bRestore = new Button(parent, SWT.PUSH);
bRestore.setText(Messages.getString("Preferences.Drivers.Button.RestoreDefault"));
bRestore.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
try {
_driverModel.restoreDrivers();
_tableViewer.refresh();
selectFirst();
} catch (ExplorerException ex) {
SQLExplorerPlugin.error("Cannot restore default driver configuration", ex);
}
}
});
bRestore.setLayoutData(new GridData(SWT.RIGHT, SWT.BOTTOM, false, false));
selectDefault(table);
return parent;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
*/
public void init(IWorkbench workbench) {
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.PreferencePage#noDefaultAndApplyButton()
*/
/**
* @return Returns the prefs.
*/
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.preference.IPreferencePage#performOk()
*/
@Override
public boolean performOk() {
return super.performOk();
}
private void changeDriver() {
StructuredSelection sel = (StructuredSelection) _tableViewer.getSelection();
ManagedDriver dv = (ManagedDriver) sel.getFirstElement();
if (dv != null) {
CreateDriverDlg dlg = new CreateDriverDlg(getShell(), CreateDriverDlg.Type.MODIFY, dv);
dlg.open();
_tableViewer.refresh();
selectFirst();
}
}
void selectFirst() {
Iterator<ManagedDriver> iter = _driverModel.getDrivers().iterator();
if (iter.hasNext()) {
StructuredSelection sel = new StructuredSelection(iter.next());
_tableViewer.setSelection(sel);
}
}
// Bold the default driver element
void selectDefault(Table table) {
String defaultDriver = _prefs.getString(IConstants.DEFAULT_DRIVER);
if (defaultDriver == null) {
return;
}
int index = 0;
for (ManagedDriver driver : _driverModel.getDrivers()) {
if (driver.getName().toLowerCase().startsWith(defaultDriver.toLowerCase())) {
_boldfont = new Font(_tableViewer.getTable().getDisplay(), table.getFont().toString(), table.getFont()
.getFontData()[0].getHeight(), SWT.BOLD);
_tableViewer.getTable().getItem(index).setFont(0, _boldfont);
_tableViewer.getTable().pack(true);
break;
}
index++;
}
}
}
class DriverContentProvider implements IStructuredContentProvider {
public Object[] getElements(Object input) {
ArrayList<ManagedDriver> drivers = new ArrayList<ManagedDriver>();
drivers.addAll(((DriverManager) input).getDrivers());
Collections.sort(drivers, new Comparator<ManagedDriver>() {
public int compare(ManagedDriver left, ManagedDriver right) {
return left.getName().compareTo(right.getName());
}
});
return drivers.toArray();
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
class DriverLabelProvider extends LabelProvider implements ITableLabelProvider {
DriverLabelProvider() {
};
public Image getColumnImage(Object element, int i) {
ManagedDriver dv = (ManagedDriver) element;
try {
dv.registerSQLDriver();
} catch (ClassNotFoundException e) {
// Nothing
}
if (dv.isDriverClassLoaded() == true) {
return ImageUtil.getImage("Images.OkDriver");
} else {
return ImageUtil.getImage("Images.ErrorDriver");
}
}
@Override
public void dispose() {
super.dispose();
ImageUtil.disposeImage("Images.OkDriver");
ImageUtil.disposeImage("Images.ErrorDriver");
}
public String getColumnText(Object element, int i) {
ManagedDriver dv = (ManagedDriver) element;
// MOD qiongli,display different name for different vertica driver version.
String name = dv.getName();
if ("Vertica".equalsIgnoreCase(name) && EDriverName.VERTICA2.getSqlEid().equals(dv.getId())) {//$NON-NLS-1$
name = "Vertica 6/7";//$NON-NLS-1$
}
return name;
}
@Override
public boolean isLabelProperty(Object element, String property) {
return true;
}
@Override
public void removeListener(ILabelProviderListener listener) {
}
@Override
public void addListener(ILabelProviderListener listener) {
}
}