package com.quantum.properties; import java.sql.DatabaseMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import com.quantum.Messages; import com.quantum.QuantumPlugin; import com.quantum.model.Entity; import com.quantum.model.ForeignKey; import com.quantum.model.NotConnectedException; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; public class ReferencesPropertyPage extends BaseEntityPropertyPage { class ColumnDetailsAdaptor { private final int columnNumber; private final ForeignKey foreignKey; public ColumnDetailsAdaptor(ForeignKey foreignKey, int columnNumber) { this.foreignKey = foreignKey; this.columnNumber = columnNumber; } public int getColumnNumber() { return this.columnNumber; } public ForeignKey getForeignKey() { return this.foreignKey; } } class TableDetailsAdaptor { private final ForeignKey foreignKey; public TableDetailsAdaptor(ForeignKey foreignKey) { this.foreignKey = foreignKey; } public ForeignKey getForeignKey() { return this.foreignKey; } } protected void createInformationArea(Composite composite) { if (!Entity.SEQUENCE_TYPE.equals(getEntity().getType())) { try { ForeignKey[] references = getEntity().getReferences(); Table table = new Table(composite, SWT.SINGLE | SWT.FULL_SELECTION | SWT.BORDER); table.setHeaderVisible(true); GridData gridData = new GridData(GridData.FILL_BOTH); gridData.horizontalSpan = 2; table.setLayoutData(gridData); for (int i = 0, length = 4; i < length; i++) { TableColumn column = new TableColumn(table, SWT.NONE); column.setText(Messages.getString(getClass(), "column" + i)); } TableViewer viewer = new TableViewer(table); setTableContents(viewer, references); setColumnWidths(table); } catch (NotConnectedException e) { createErrorMessage(composite, e); } catch (SQLException e) { createErrorMessage(composite, e); } catch (RuntimeException e) { createErrorMessage(composite, e); } } } /** * @param viewer */ private void setTableContents(TableViewer viewer, ForeignKey[] references) { viewer.setContentProvider(new IStructuredContentProvider() { public Object[] getElements(Object inputElement) { List list = new ArrayList(); if (inputElement instanceof ForeignKey[]) { ForeignKey[] keys = (ForeignKey[]) inputElement; for (int i = 0, length = keys == null ? 0 : keys.length; i < length; i++) { list.add(new TableDetailsAdaptor(keys[i])); for (int j = 0, columns = keys[i].getNumberOfColumns(); j < columns; j++) { list.add(new ColumnDetailsAdaptor(keys[i], j)); } } } return list.toArray(); } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } }); viewer.setLabelProvider(new ITableLabelProvider() { public Image getColumnImage(Object element, int columnIndex) { if ((columnIndex == 1 || columnIndex == 2) && element instanceof ColumnDetailsAdaptor) { return QuantumPlugin.getImage("column.gif"); } else if ((columnIndex == 1 || columnIndex == 2) && element instanceof TableDetailsAdaptor) { return QuantumPlugin.getImage("bigtable.gif"); } else if ((columnIndex == 0) && element instanceof TableDetailsAdaptor) { return QuantumPlugin.getImage("foreignkey.gif"); } else { return null; } } public String getColumnText(Object element, int columnIndex) { String label = null; if (element instanceof TableDetailsAdaptor) { label = getColumnText((TableDetailsAdaptor) element, columnIndex); } else if (element instanceof ColumnDetailsAdaptor) { label = getColumnText((ColumnDetailsAdaptor) element, columnIndex); } return label == null ? "" : label; } private String getColumnText(TableDetailsAdaptor adaptor, int columnIndex) { switch (columnIndex) { case 0: return adaptor.getForeignKey().getName(); case 1: return adaptor.getForeignKey().getLocalEntityQualifiedName(); case 2: return adaptor.getForeignKey().getForeignEntityQualifiedName(); case 3: ForeignKey key = adaptor.getForeignKey(); if (key.getDeleteRule() == DatabaseMetaData.importedKeyCascade) { return Messages.getString( ReferencesPropertyPage.class, "importedKeyCascade"); } else if (key.getDeleteRule() == DatabaseMetaData.importedKeyNoAction) { return Messages.getString( ReferencesPropertyPage.class, "importedKeyNoAction"); } else if (key.getDeleteRule() == DatabaseMetaData.importedKeyRestrict) { return Messages.getString( ReferencesPropertyPage.class, "importedKeyRestrict"); } else if (key.getDeleteRule() == DatabaseMetaData.importedKeySetDefault) { return Messages.getString( ReferencesPropertyPage.class, "importedKeySetDefault"); } else if (key.getDeleteRule() == DatabaseMetaData.importedKeySetNull) { return Messages.getString( ReferencesPropertyPage.class, "importedKeySetNull"); } else { return null; } default: return null; } } private String getColumnText(ColumnDetailsAdaptor adaptor, int columnIndex) { switch (columnIndex) { case 1: return adaptor.getForeignKey().getLocalColumnName(adaptor.getColumnNumber()); case 2: return adaptor.getForeignKey().getForeignColumnName(adaptor.getColumnNumber()); default: return null; } } public void addListener(ILabelProviderListener listener) { } public void dispose() { } public boolean isLabelProperty(Object element, String property) { return false; } public void removeListener(ILabelProviderListener listener) { } }); viewer.setInput(references); } }