package org.insightech.er.preference.jdbc;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
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.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.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.PlatformUI;
import org.insightech.er.Activator;
import org.insightech.er.ResourceString;
import org.insightech.er.Resources;
import org.insightech.er.db.DBManager;
import org.insightech.er.db.DBManagerFactory;
import org.insightech.er.editor.model.settings.JDBCDriverSetting;
import org.insightech.er.preference.PreferenceInitializer;
import org.insightech.er.util.Format;
public class JDBCPreferencePage extends
org.eclipse.jface.preference.PreferencePage implements
IWorkbenchPreferencePage {
private Table table;
private Button addButton;
private Button editButton;
private Button deleteButton;
public void init(IWorkbench workbench) {
}
@Override
protected Control createContents(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 3;
composite.setLayout(gridLayout);
this.initTable(composite);
this.createButton(composite);
this.addListener();
return composite;
}
private void initTable(Composite parent) {
this.table = new Table(parent, SWT.SINGLE | SWT.BORDER
| SWT.FULL_SELECTION);
GridData gridData = new GridData();
gridData.horizontalAlignment = GridData.FILL;
gridData.grabExcessHorizontalSpace = true;
gridData.heightHint = 200;
gridData.horizontalSpan = 3;
this.table.setLayoutData(gridData);
this.table.setLinesVisible(true);
this.table.setHeaderVisible(true);
TableColumn nameColumn = new TableColumn(table, SWT.NONE);
nameColumn.setText(ResourceString.getResourceString("label.database"));
nameColumn.setWidth(200);
TableColumn driverClassNameColumn = new TableColumn(table, SWT.NONE);
driverClassNameColumn.setText(ResourceString
.getResourceString("label.driver.class.name"));
driverClassNameColumn.setWidth(200);
TableColumn pathColumn = new TableColumn(table, SWT.NONE);
pathColumn.setText(ResourceString.getResourceString("label.path"));
pathColumn.setWidth(200);
this.setData();
}
private void createButton(Composite parent) {
GridData buttonGridData = new GridData();
buttonGridData.widthHint = Resources.BUTTON_WIDTH;
this.addButton = new Button(parent, SWT.NONE);
this.addButton.setLayoutData(buttonGridData);
this.addButton.setText(ResourceString
.getResourceString("label.button.add"));
this.editButton = new Button(parent, SWT.NONE);
this.editButton.setLayoutData(buttonGridData);
this.editButton.setText(ResourceString
.getResourceString("label.button.edit"));
this.deleteButton = new Button(parent, SWT.NONE);
this.deleteButton.setLayoutData(buttonGridData);
this.deleteButton.setText(ResourceString
.getResourceString("label.button.delete"));
this.deleteButton.setEnabled(false);
}
private void setData() {
this.table.removeAll();
for (JDBCDriverSetting setting : PreferenceInitializer
.getJDBCDriverSettingList()) {
TableItem tableItem = new TableItem(this.table, SWT.NONE);
tableItem.setBackground(ColorConstants.white);
tableItem.setText(0, Format.null2blank(setting.getDb()));
tableItem.setText(1, Format.null2blank(setting.getClassName()));
tableItem.setText(2, Format.null2blank(setting.getPath()));
}
}
@Override
protected void performDefaults() {
PreferenceInitializer.clearJDBCDriverInfo();
setData();
super.performDefaults();
}
@Override
public boolean performOk() {
PreferenceInitializer.clearJDBCDriverInfo();
for (int i = 0; i < this.table.getItemCount(); i++) {
TableItem tableItem = this.table.getItem(i);
String db = tableItem.getText(0);
String driverClassName = tableItem.getText(1);
String path = tableItem.getText(2);
PreferenceInitializer.addJDBCDriver(db, driverClassName, path);
}
return super.performOk();
}
private void addListener() {
this.table.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent selectionevent) {
int index = table.getSelectionIndex();
if (index == -1) {
return;
}
TableItem item = table.getItem(index);
String db = item.getText(0);
String driverClassName = item.getText(1);
DBManager dbManager = DBManagerFactory.getDBManager(db);
if (!dbManager.getDriverClassName().equals(driverClassName)) {
deleteButton.setEnabled(true);
} else {
deleteButton.setEnabled(false);
}
}
});
this.table.addMouseListener(new MouseAdapter() {
/**
* {@inheritDoc}
*/
@Override
public void mouseDoubleClick(MouseEvent e) {
edit();
}
});
this.addButton.addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*/
@Override
public void widgetSelected(SelectionEvent e) {
List<JDBCDriverSetting> otherDriverSettingList = getOtherDriverSettingList(-1);
JDBCPathDialog dialog = new JDBCPathDialog(PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getShell(),
null, null, null, otherDriverSettingList, true);
if (dialog.open() == IDialogConstants.OK_ID) {
PreferenceInitializer.addJDBCDriver(dialog.getDatabase(),
Format.null2blank(dialog.getDriverClassName()),
Format.null2blank(dialog.getPath()));
setData();
}
}
});
this.editButton.addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*/
@Override
public void widgetSelected(SelectionEvent e) {
edit();
}
});
this.deleteButton.addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*/
@Override
public void widgetSelected(SelectionEvent event) {
try {
int index = table.getSelectionIndex();
if (index == -1) {
return;
}
TableItem item = table.getItem(index);
String db = item.getText(0);
String driverClassName = item.getText(1);
DBManager dbManager = DBManagerFactory.getDBManager(db);
if (!dbManager.getDriverClassName().equals(driverClassName)) {
table.remove(index);
}
} catch (Exception e) {
Activator.showExceptionDialog(e);
}
}
});
}
private List<JDBCDriverSetting> getOtherDriverSettingList(int index) {
List<JDBCDriverSetting> list = new ArrayList<JDBCDriverSetting>();
for (int i = 0; i < this.table.getItemCount(); i++) {
if (i != index) {
TableItem tableItem = this.table.getItem(i);
String db = tableItem.getText(0);
String driverClassName = tableItem.getText(1);
String path = tableItem.getText(2);
JDBCDriverSetting driverSetting = new JDBCDriverSetting(db,
driverClassName, path);
list.add(driverSetting);
}
}
return list;
}
private void edit() {
try {
int index = table.getSelectionIndex();
if (index == -1) {
return;
}
TableItem item = table.getItem(index);
List<JDBCDriverSetting> otherDriverSettingList = getOtherDriverSettingList(index);
JDBCPathDialog dialog = new JDBCPathDialog(PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getShell(), item
.getText(0), item.getText(1), item.getText(2),
otherDriverSettingList, true);
if (dialog.open() == IDialogConstants.OK_ID) {
item.setText(1, dialog.getDriverClassName());
item.setText(2, dialog.getPath());
}
} catch (Exception e) {
Activator.showExceptionDialog(e);
}
}
}