X-Git-Url: http://secure.phpeclipse.com diff --git a/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/view/SchemaSelectionControl.java b/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/view/SchemaSelectionControl.java new file mode 100644 index 0000000..f18c3b9 --- /dev/null +++ b/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/view/SchemaSelectionControl.java @@ -0,0 +1,343 @@ +package com.quantum.view; + +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import com.quantum.Messages; +import com.quantum.QuantumPlugin; +import com.quantum.model.Bookmark; +import com.quantum.model.ConnectionException; +import com.quantum.model.NotConnectedException; +import com.quantum.model.Schema; +import com.quantum.ui.dialog.ExceptionDisplayDialog; +import com.quantum.ui.dialog.SimpleSelectionDialog; +import com.quantum.util.connection.ConnectionUtil; + +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.viewers.ILabelProviderListener; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +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; + + +/** + * @author BC + */ +public class SchemaSelectionControl extends Composite { + + class ContentProviderImpl implements IStructuredContentProvider { + public Object[] getElements(Object inputElement) { + List list = new ArrayList((Collection) inputElement); + Collections.sort(list); + return list.toArray(); + } + + public void dispose() { + } + + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + } + } + + class LabelProviderImpl implements ITableLabelProvider { + + public Image getColumnImage(Object element, int columnIndex) { + if (columnIndex == 0) { + return QuantumPlugin.getImage("schema.gif"); + } else { + return null; + } + } + + public String getColumnText(Object element, int columnIndex) { + if (columnIndex == 0) { + return ((Schema) element).getDisplayName(); + } else { + return null; + } + } + + public void addListener(ILabelProviderListener listener) { + } + + public void dispose() { + } + + public boolean isLabelProperty(Object element, String property) { + return "displayName".equals(property); + } + + public void removeListener(ILabelProviderListener listener) { + } + } + + + private final Bookmark bookmarkForConnection; + private ConnectionUtil connectionUtil = new ConnectionUtil(); + private Set schemas = Collections.synchronizedSet(new HashSet()); + private TableViewer schemaTable; + private Button useAllSchemasButton; + + private int schemaRule; + + private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); + private Button useUsernameAsSchemaButton; + private Button useSelectedSchemasButton; + private Button removeButton; + private Button addButton; + + /** + * @param parent + * @param style + */ + public SchemaSelectionControl(Composite parent, Bookmark bookmarkForConnection) { + super(parent, SWT.NONE); + this.bookmarkForConnection = bookmarkForConnection; + + Schema[] schemas = bookmarkForConnection.getSchemaSelections(); + this.schemas.addAll(Arrays.asList(schemas)); + this.schemaRule = this.bookmarkForConnection.getSchemaRule(); + createContents(); + } + + protected void createContents() { + + GridLayout layout = new GridLayout(); + layout.numColumns = 1; + setLayout(layout); + GridData data = new GridData(GridData.FILL_BOTH); + setLayoutData(data); + + this.useAllSchemasButton = new Button(this, SWT.RADIO); + this.useAllSchemasButton.setText(Messages.getString(getClass(), "useAllSchemas")); //$NON-NLS-1$ + this.useAllSchemasButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + this.useAllSchemasButton.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent event) { + setSchemaRule(Bookmark.SCHEMA_RULE_USE_ALL); + updateControls(); + } + }); + + this.useUsernameAsSchemaButton = new Button(this, SWT.RADIO); + this.useUsernameAsSchemaButton.setText(Messages.getString(getClass(), "useUsernameAsSchema")); //$NON-NLS-1$ + this.useUsernameAsSchemaButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + this.useUsernameAsSchemaButton.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent event) { + setSchemaRule(Bookmark.SCHEMA_RULE_USE_DEFAULT); + updateControls(); + } + }); + + this.useSelectedSchemasButton = new Button(this, SWT.RADIO); + this.useSelectedSchemasButton.setText(Messages.getString(getClass(), "useSelectedSchemas")); //$NON-NLS-1$ + this.useSelectedSchemasButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + this.useSelectedSchemasButton.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent event) { + setSchemaRule(Bookmark.SCHEMA_RULE_USE_SELECTED); + updateControls(); + } + }); + + Composite composite = new Composite(this, SWT.NONE); + layout = new GridLayout(); + layout.numColumns = 2; + composite.setLayout(layout); + data = new GridData(GridData.FILL_BOTH); + composite.setLayoutData(data); + + this.schemaTable = new TableViewer(composite, + SWT.FULL_SELECTION | SWT.MULTI | SWT.BORDER); + layout = new GridLayout(); + layout.marginWidth = 5; + layout.marginHeight = 5; + + this.schemaTable.getTable().setLayout(layout); + data = new GridData(GridData.FILL_BOTH); + this.schemaTable.getTable().setLayoutData(data); + this.schemaTable.setLabelProvider(new LabelProviderImpl()); + this.schemaTable.setContentProvider(new ContentProviderImpl()); + this.schemaTable.setInput(this.schemas); + + createButtonArea(composite); + + updateControls(); + } + + private void updateControls() { + this.useAllSchemasButton.setSelection(this.schemaRule == Bookmark.SCHEMA_RULE_USE_ALL); + this.useUsernameAsSchemaButton.setSelection(this.schemaRule == Bookmark.SCHEMA_RULE_USE_DEFAULT); + + boolean enabled = (this.schemaRule != Bookmark.SCHEMA_RULE_USE_ALL + && this.schemaRule != Bookmark.SCHEMA_RULE_USE_DEFAULT); + + this.useSelectedSchemasButton.setSelection(enabled); + this.schemaTable.getControl().setEnabled(enabled); + + this.addButton.setEnabled(enabled); + this.removeButton.setEnabled( + enabled && !this.schemaTable.getSelection().isEmpty()); + } + + private void createButtonArea(Composite composite) { + Composite buttonArea = new Composite(composite, SWT.NONE); + GridLayout layout = new GridLayout(); + layout.numColumns = 1; + buttonArea.setLayout(layout); + GridData data = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING); + buttonArea.setLayoutData(data); + + this.addButton = new Button(buttonArea, SWT.NULL); + this.addButton.setText("Add"); + data = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING); + this.addButton.setLayoutData(data); + this.addButton.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent event) { + addSchema(); + } + }); + + this.removeButton = new Button(buttonArea, SWT.NULL); + this.removeButton.setText("Remove"); + this.removeButton.setEnabled(false); + data = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING); + this.removeButton.setLayoutData(data); + this.removeButton.addSelectionListener(new SelectionAdapter() { + public void widgetSelected(SelectionEvent event) { + removeSchema(SchemaSelectionControl.this.schemaTable.getSelection()); + } + }); + + schemaTable.addSelectionChangedListener(new ISelectionChangedListener() { + public void selectionChanged(SelectionChangedEvent event) { + updateControls(); + } + }); + } + private void addSchema() { + Bookmark bookmark = getBookmark(); + boolean isAlreadyConnected = bookmark.isConnected(); + + if (!isAlreadyConnected) { + boolean confirmed = MessageDialog.openConfirm(getShell(), + Messages.getString(getClass(), "connectTitle"), + Messages.getString(getClass(), "connectMessage")); + if (confirmed) { + this.connectionUtil.connect(bookmark, getShell()); + } + } + + try { + if (bookmark.isConnected()) { + List schemaList = getAllUnselectedSchemas(bookmark); + SimpleSelectionDialog dialog = new SimpleSelectionDialog( + getShell(), Messages.getString(getClass(), "addSchemaDialog"), + schemaList.toArray(), + QuantumPlugin.getImage("schema.gif"), true); + int result = dialog.open(); + if (result == SimpleSelectionDialog.OK + && !dialog.getSelection().isEmpty()) { + for (Iterator i = dialog.getSelection().iterator(); i.hasNext();) { + this.schemas.add(i.next()); + } + + refreshTable(); + this.propertyChangeSupport.firePropertyChange("schemas", null, getSchemas()); + } + + if (!isAlreadyConnected) { + bookmark.disconnect(); + } + } + } catch (ConnectionException e) { + ExceptionDisplayDialog.openError(getShell(), null, null, e); + } catch (SQLException e) { + ExceptionDisplayDialog.openError(getShell(), null, null, e); + } + } + + /** + * @param bookmark + * @return + * @throws NotConnectedException + * @throws SQLException + */ + private List getAllUnselectedSchemas(Bookmark bookmark) + throws NotConnectedException, SQLException { + Schema[] schemas = bookmark.getDatabase().getSchemas(); + List schemaList = new ArrayList(Arrays.asList(schemas)); + schemaList.removeAll(this.schemas); + Collections.sort(schemaList); + return schemaList; + } + + private void removeSchema(ISelection selection) { + IStructuredSelection structuredSelection = (IStructuredSelection) selection; + for (Iterator i = structuredSelection.iterator(); i.hasNext();) { + Schema element = (Schema) i.next(); + this.schemas.remove(element); + } + refreshTable(); + this.propertyChangeSupport.firePropertyChange("schemas", null, getSchemas()); + } + + private Bookmark getBookmark() { + return this.bookmarkForConnection; + } + + private void refreshTable() { + this.schemaTable.refresh(); + } + + public Schema[] getSchemas() { + return (Schema[]) this.schemas.toArray(new Schema[this.schemas.size()]); + } + + public void setSchemas(Schema[] schemas) { + this.schemas.clear(); + this.schemas.addAll(Arrays.asList(schemas)); + updateControls(); + refreshTable(); + this.propertyChangeSupport.firePropertyChange("schemas", null, getSchemas()); + } + public void addPropertyChangeListener(PropertyChangeListener arg0) { + this.propertyChangeSupport.addPropertyChangeListener(arg0); + } + public void removePropertyChangeListener(PropertyChangeListener arg0) { + this.propertyChangeSupport.removePropertyChangeListener(arg0); + } + public int getSchemaRule() { + return this.schemaRule; + } + public void setSchemaRule(int schemaRule) { + if (schemaRule != this.schemaRule) { + int original = this.schemaRule; + this.schemaRule = schemaRule; + updateControls(); + refreshTable(); + this.propertyChangeSupport.firePropertyChange( + "schemaRule", original, schemaRule); + } + } +}