package net.sourceforge.sqlexplorer.dialogs;
/*
* Copyright (C) 2002-2004 Andrea Mazzolini
* andreamazzolini@users.sourceforge.net
*
* 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
*/
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.sql.Driver;
import java.util.StringTokenizer;
import net.sourceforge.sqlexplorer.Messages;
import net.sourceforge.sqlexplorer.dbproduct.ManagedDriver;
import net.sourceforge.sqlexplorer.plugin.SQLExplorerPlugin;
import net.sourceforge.sqlexplorer.util.ImageUtil;
import net.sourceforge.sqlexplorer.util.MyURLClassLoader;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Text;
public class CreateDriverDlg extends TitleAreaDialog {
public enum Type {
CREATE, MODIFY, COPY
}
private ManagedDriver driver;
private static final int SIZING_TEXT_FIELD_WIDTH = 250;
Button _extraClasspathDeleteBtn;
private Button _extraClasspathUpBtn;
private Button _extraClasspathDownBtn;
private Button newBtn;
Button _javaClasspathListDriversBtn;
Button _extraClasspathListDriversBtn;
DefaultFileListBoxModel defaultModel = new DefaultFileListBoxModel();
ListViewer extraClassPathList;
ListViewer javaClassPathList;
Type type;
Text nameField;
Button jarSearch;
Combo combo;
Text exampleUrlField;
public CreateDriverDlg(Shell parentShell, Type type, ManagedDriver driver) {
super(parentShell);
this.driver = driver;
this.type = type;
}
protected void configureShell(Shell shell) {
super.configureShell(shell);
if (type == Type.CREATE) {
shell.setText(Messages.getString("DriverDialog.Create.WindowTitle"));
} else if (type == Type.MODIFY) {
shell.setText(Messages.getString("DriverDialog.Modify.WindowTitle"));
} else if (type == Type.COPY) {
shell.setText(Messages.getString("DriverDialog.Copy.WindowTitle"));
}
}
protected Control createContents(Composite parent) {
Control contents = super.createContents(parent);
if (type == Type.CREATE) {
setTitle(Messages.getString("DriverDialog.Create.Title"));
setMessage(Messages.getString("DriverDialog.Create.Message"));
} else if (type == Type.MODIFY) {
setTitle(Messages.getString("DriverDialog.Modify.Title"));
setMessage(Messages.getString("DriverDialog.Modify.Message"));
} else if (type == Type.COPY) {
setTitle(Messages.getString("DriverDialog.Copy.Title"));
setMessage(Messages.getString("DriverDialog.Copy.Message"));
}
Image image = ImageUtil.getImage("Images.WizardLogo");
if (image != null) {
setTitleImage(image);
}
// Bug # 1569762 : Driver list corrupt
/*contents.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
ImageUtil.disposeImage("Images.WizardLogo");
}
});
*/
return contents;
}
protected void okPressed() {
String name = nameField.getText().trim();
String driverClassName = (String) combo.getText();
driverClassName = (driverClassName != null ? driverClassName.trim() : "");
String url = exampleUrlField.getText().trim();
if (name.equals("")) {
MessageDialog.openError(this.getShell(), Messages.getString("Error..._2"), "Name is empty"); //$NON-NLS-2$
return;
}
if (driverClassName.equals("")) {
MessageDialog.openError(this.getShell(), Messages.getString("Error..._2"), "Driver Class Name is empty"); //$NON-NLS-2$
return;
}
if (url.equals("")) {
MessageDialog.openError(this.getShell(), Messages.getString("Error..._2"), "URL is empty"); //$NON-NLS-2$
return;
}
if (driver == null)
driver = new ManagedDriver(SQLExplorerPlugin.getDefault().getDriverModel().createUniqueId());
driver.setName(name);
driver.setJars(defaultModel.getFileNames());
driver.setDriverClassName(driverClassName);
driver.setUrl(url);
if (type != Type.MODIFY)
SQLExplorerPlugin.getDefault().getDriverModel().addDriver(driver);
close();
}
void validate() {
if ((nameField.getText().trim().length() > 0) && (exampleUrlField.getText().trim().length() > 0)
&& (combo.getText().trim().length() > 0))
setDialogComplete(true);
else
setDialogComplete(false);
}
protected void setDialogComplete(boolean value) {
Button okBtn = getButton(IDialogConstants.OK_ID);
if (okBtn != null)
okBtn.setEnabled(value);
}
protected void createButtonsForButtonBar(Composite parent) {
super.createButtonsForButtonBar(parent);
validate();
}
protected Control createDialogArea(Composite parent) {
// top level composite
Composite parentComposite = (Composite) super.createDialogArea(parent);
// create a composite with standard margins and spacing
Composite composite = new Composite(parentComposite, SWT.NONE);
GridLayout layout = new GridLayout();
layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
composite.setLayout(layout);
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
composite.setFont(parentComposite.getFont());
Composite nameGroup = new Composite(composite, SWT.NONE);
layout = new GridLayout();
layout.numColumns = 3;
layout.marginWidth = 10;
nameGroup.setLayout(layout);
GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
nameGroup.setLayoutData(data);
Composite topComposite = new Composite(nameGroup, SWT.NONE);
data = new GridData(GridData.FILL_VERTICAL | GridData.FILL_HORIZONTAL);
data.horizontalSpan = 3;
topComposite.setLayoutData(data);
topComposite.setLayout(new GridLayout());
Group topGroup = new Group(topComposite, SWT.NULL);
topGroup.setText(Messages.getString("Driver_14"));
data = new GridData(GridData.FILL_VERTICAL | GridData.FILL_HORIZONTAL);
data.horizontalSpan = 3;
data.widthHint = SIZING_TEXT_FIELD_WIDTH;
topGroup.setLayoutData(data);
layout = new GridLayout();
layout.numColumns = 3;
layout.marginWidth = 5;
topGroup.setLayout(layout);
Label label = new Label(topGroup, SWT.WRAP);
label.setText(Messages.getString("Name_15"));
nameField = new Text(topGroup, SWT.BORDER);
data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
data.horizontalSpan = 2;
data.widthHint = SIZING_TEXT_FIELD_WIDTH;
nameField.setLayoutData(data);
nameField.addKeyListener(new KeyListener() {
public void keyPressed(org.eclipse.swt.events.KeyEvent e) {
CreateDriverDlg.this.validate();
};
public void keyReleased(org.eclipse.swt.events.KeyEvent e) {
CreateDriverDlg.this.validate();
};
});
Label label5 = new Label(topGroup, SWT.WRAP);
label5.setText(Messages.getString("Example_URL_16"));
exampleUrlField = new Text(topGroup, SWT.BORDER);
data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
data.widthHint = SIZING_TEXT_FIELD_WIDTH;
data.horizontalSpan = 2;
exampleUrlField.setLayoutData(data);
exampleUrlField.addKeyListener(new KeyListener() {
public void keyPressed(org.eclipse.swt.events.KeyEvent e) {
CreateDriverDlg.this.validate();
};
public void keyReleased(org.eclipse.swt.events.KeyEvent e) {
CreateDriverDlg.this.validate();
};
});
Composite centralComposite = new Composite(nameGroup, SWT.NONE);
data = new GridData(GridData.FILL_VERTICAL | GridData.FILL_HORIZONTAL);
data.horizontalSpan = 3;
data.verticalSpan = 4;
data.heightHint = 200;
centralComposite.setLayoutData(data);
centralComposite.setLayout(new FillLayout());
TabFolder tabFolder = new TabFolder(centralComposite, SWT.NULL);
TabItem item1 = new TabItem(tabFolder, SWT.NULL);
item1.setText(Messages.getString("Java_Class_Path_17"));
TabItem item2 = new TabItem(tabFolder, SWT.NULL);
item2.setText(Messages.getString("Extra_Class_Path_18"));
createJavaClassPathPanel(tabFolder, item1);
createExtraClassPathPanel(tabFolder, item2);
Label label4 = new Label(nameGroup, SWT.WRAP);
label4.setText(Messages.getString("Driver_Class_Name_19"));
combo = new Combo(nameGroup, SWT.BORDER | SWT.DROP_DOWN);
data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);
data.widthHint = SIZING_TEXT_FIELD_WIDTH;
data.horizontalSpan = 2;
combo.setLayoutData(data);
combo.addSelectionListener(new org.eclipse.swt.events.SelectionListener() {
public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
}
public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
CreateDriverDlg.this.validate();
};
});
combo.addKeyListener(new KeyListener() {
public void keyPressed(org.eclipse.swt.events.KeyEvent e) {
CreateDriverDlg.this.validate();
};
public void keyReleased(org.eclipse.swt.events.KeyEvent e) {
CreateDriverDlg.this.validate();
};
});
nameGroup.layout();
loadData();
return parentComposite;
}
private void loadData() {
if (driver == null)
return;
nameField.setText(driver.getName());
if (driver.getDriverClassName() != null)
combo.setText(driver.getDriverClassName());
exampleUrlField.setText(driver.getUrl());
for (String jar : driver.getJars())
defaultModel.addFile(new File(jar));
if (extraClassPathList != null) {
extraClassPathList.refresh();
if (defaultModel.size() > 0)
extraClassPathList.getList().setSelection(0);
}
if (defaultModel.size() > 0) {
Object obj = (defaultModel.toArray())[0];
StructuredSelection sel = new StructuredSelection(obj);
extraClassPathList.setSelection(sel);
}
}
protected Point getInitialSize() {
return new Point(600, 500);
}
private void createJavaClassPathPanel(TabFolder tabFolder, TabItem tabItem) {
Composite parent = new Composite(tabFolder, SWT.NULL);
parent.setLayout(new FillLayout());
tabItem.setControl(parent);
Composite cmp = new Composite(parent, SWT.NULL);
GridLayout grid = new GridLayout();
grid.numColumns = 2;
cmp.setLayout(grid);
javaClassPathList = new ListViewer(cmp, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
GridData data = new GridData();
data.grabExcessVerticalSpace = true;
data.horizontalAlignment = GridData.FILL;
data.verticalAlignment = GridData.FILL;
data.grabExcessHorizontalSpace = true;
javaClassPathList.getControl().setLayoutData(data);
javaClassPathList.setContentProvider(new FileContentProvider());
javaClassPathList.setLabelProvider(new FileLabelProvider());
ClassPathListModel model = new ClassPathListModel();
javaClassPathList.setInput(model);
Composite left = new Composite(cmp, SWT.NULL);
data = new GridData();
data.horizontalSpan = 1;
data.grabExcessVerticalSpace = true;
data.widthHint = 100;
data.horizontalAlignment = GridData.FILL;
data.verticalAlignment = GridData.FILL;
left.setLayoutData(data);
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 1;
left.setLayout(gridLayout);
_javaClasspathListDriversBtn = new Button(left, SWT.NULL);
_javaClasspathListDriversBtn.setText(Messages.getString("List_Drivers_20"));
_javaClasspathListDriversBtn.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
combo.removeAll();
File file = (File) ((IStructuredSelection) javaClassPathList.getSelection()).getFirstElement();
if (file != null) {
try {
MyURLClassLoader cl = new MyURLClassLoader(file.toURL());
Class[] classes = cl.getAssignableClasses(Driver.class);
for (int i = 0; i < classes.length; ++i) {
combo.add(classes[i].getName());
}
} catch (MalformedURLException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
}
if (combo.getItemCount() > 0) {
combo.setText(combo.getItem(0));
}
}
});
data = new GridData();
data.grabExcessHorizontalSpace = true;
data.horizontalAlignment = GridData.FILL;
_javaClasspathListDriversBtn.setLayoutData(data);
javaClassPathList.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
File f = (File) selection.getFirstElement();
if (f != null) {
if (f.isFile())
_javaClasspathListDriversBtn.setEnabled(true);
else
_javaClasspathListDriversBtn.setEnabled(false);
} else
_javaClasspathListDriversBtn.setEnabled(false);
}
});
if (model.size() > 0) {
Object obj = (model.toArray())[0];
StructuredSelection sel = new StructuredSelection(obj);
javaClassPathList.setSelection(sel);
}
}
private void createExtraClassPathPanel(final TabFolder tabFolder, TabItem tabItem) {
Composite parent = new Composite(tabFolder, SWT.NULL);
parent.setLayout(new FillLayout());
tabItem.setControl(parent);
Composite cmp = new Composite(parent, SWT.NULL);
GridLayout grid = new GridLayout();
grid.numColumns = 2;
cmp.setLayout(grid);
extraClassPathList = new ListViewer(cmp, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
GridData data = new GridData();
data.grabExcessVerticalSpace = true;
data.horizontalAlignment = GridData.FILL;
data.verticalAlignment = GridData.FILL;
data.grabExcessHorizontalSpace = true;
extraClassPathList.getControl().setLayoutData(data);
extraClassPathList.setContentProvider(new FileContentProvider());
extraClassPathList.setLabelProvider(new FileLabelProvider());
extraClassPathList.setInput(defaultModel);
Composite left = new Composite(cmp, SWT.NULL);
data = new GridData();
data.horizontalSpan = 1;
data.grabExcessVerticalSpace = true;
data.widthHint = 100;
data.horizontalAlignment = GridData.FILL;
data.verticalAlignment = GridData.FILL;
left.setLayoutData(data);
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 1;
left.setLayout(gridLayout);
_extraClasspathListDriversBtn = new Button(left, SWT.NULL);
_extraClasspathListDriversBtn.setText(Messages.getString("List_Drivers_21"));
_extraClasspathListDriversBtn.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
combo.removeAll();
File file = (File) ((IStructuredSelection) extraClassPathList.getSelection()).getFirstElement();
if (file != null) {
try {
MyURLClassLoader cl = new MyURLClassLoader(file.toURL());
Class[] classes = cl.getAssignableClasses(Driver.class);
for (int i = 0; i < classes.length; ++i) {
combo.add(classes[i].getName());
}
} catch (Exception ex) {
SQLExplorerPlugin.error(ex);
}
}
if (combo.getItemCount() > 0) {
combo.setText(combo.getItem(0));
}
validate();
}
});
data = new GridData();
data.grabExcessHorizontalSpace = true;
data.horizontalAlignment = GridData.FILL;
_extraClasspathListDriversBtn.setLayoutData(data);
_extraClasspathUpBtn = new Button(left, SWT.NULL);
_extraClasspathUpBtn.setText(Messages.getString("Up_22"));
_extraClasspathUpBtn.setEnabled(false);
data = new GridData();
data.grabExcessHorizontalSpace = true;
data.horizontalAlignment = GridData.FILL;
_extraClasspathUpBtn.setLayoutData(data);
_extraClasspathDownBtn = new Button(left, SWT.NULL);
_extraClasspathDownBtn.setText(Messages.getString("Down_23"));
_extraClasspathDownBtn.setEnabled(false);
data = new GridData();
data.grabExcessHorizontalSpace = true;
data.horizontalAlignment = GridData.FILL;
_extraClasspathDownBtn.setLayoutData(data);
newBtn = new Button(left, SWT.NULL);
newBtn.setText(Messages.getString("New_24"));
newBtn.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
FileDialog dlg = new FileDialog(tabFolder.getShell(), SWT.OPEN);
dlg.setFilterExtensions(new String[] {"*.jar;*.zip"});
String str = dlg.open();
if (str != null) {
Object obj = new File(str);
defaultModel.add(obj);
extraClassPathList.refresh();
StructuredSelection sel = new StructuredSelection(obj);
extraClassPathList.setSelection(sel);
}
}
});
data = new GridData();
data.grabExcessHorizontalSpace = true;
data.horizontalAlignment = GridData.FILL;
newBtn.setLayoutData(data);
_extraClasspathDeleteBtn = new Button(left, SWT.NULL);
_extraClasspathDeleteBtn.setText(Messages.getString("Delete_26"));
_extraClasspathDeleteBtn.setEnabled(false);
_extraClasspathDeleteBtn.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
File f = (File) ((IStructuredSelection) extraClassPathList.getSelection()).getFirstElement();
if (f != null) {
defaultModel.remove(f);
extraClassPathList.refresh();
if (defaultModel.size() > 0) {
Object obj = (defaultModel.toArray())[0];
StructuredSelection sel = new StructuredSelection(obj);
extraClassPathList.setSelection(sel);
}
}
}
});
data = new GridData();
data.grabExcessHorizontalSpace = true;
data.horizontalAlignment = GridData.FILL;
_extraClasspathDeleteBtn.setLayoutData(data);
extraClassPathList.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
File f = (File) selection.getFirstElement();
if (f != null) {
_extraClasspathDeleteBtn.setEnabled(true);
_extraClasspathListDriversBtn.setEnabled(true);
} else {
_extraClasspathListDriversBtn.setEnabled(false);
_extraClasspathDeleteBtn.setEnabled(false);
}
}
});
}
protected void setShellStyle(int newShellStyle) {
super.setShellStyle(newShellStyle | SWT.RESIZE);
}
}
class DefaultFileListBoxModel extends java.util.Vector {
public static final long serialVersionUID = 1;
public void addFile(File file) {
addElement(file);
}
/**
* Return the File at the passed index.
*
* @param idx Index to return File for.
*
* @return The File at <TT>idx</TT>.
*
* @throws ArrayInexOutOfBoundsException Thrown if <TT>idx</TT> < 0 or >=
* <TT>getSize()</TT>.
*/
public File getFile(int idx) {
return (File) get(idx);
}
/**
* Return array of File names in list.
*
* @return array of File names in list.
*/
public String[] getFileNames() {
String[] fileNames = new String[this.size()];
for (int i = 0, limit = fileNames.length; i < limit; ++i) {
fileNames[i] = getFile(i).getAbsolutePath();
}
return fileNames;
}
public void insertFileAt(File file, int idx) {
insertElementAt(file, idx);
}
public File removeFile(int idx) {
return (File) remove(idx);
}
}
class ClassPathListModel extends DefaultFileListBoxModel {
public static final long serialVersionUID = 1;
/**
* Default ctor.
*/
public ClassPathListModel() {
super();
load();
}
/**
* Build list.
*/
private void load() {
removeAllElements();
String cp = System.getProperty("java.class.path");
StringTokenizer strtok = new StringTokenizer(cp, File.pathSeparator);
while (strtok.hasMoreTokens()) {
addFile(new File(strtok.nextToken()));
}
}
}
class FileContentProvider implements IStructuredContentProvider {
public Object[] getElements(Object input) {
return ((java.util.Vector) input).toArray();
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
class FileLabelProvider implements ILabelProvider {
FileLabelProvider() {
};
public Image getImage(Object elementx) {
return null;
}
public String getText(Object element) {
return ((File) element).toString();
}
public boolean isLabelProperty(Object element, String property) {
return true;
}
public void dispose() {
}
public void removeListener(ILabelProviderListener listener) {
}
public void addListener(ILabelProviderListener listener) {
}
}