package org.insightech.er.editor.view.dialog.common; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.draw2d.ColorConstants; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.TableEditor; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; 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.MessageBox; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import org.eclipse.ui.PlatformUI; import org.insightech.er.Activator; import org.insightech.er.ImageKey; import org.insightech.er.ResourceString; import org.insightech.er.common.dialog.AbstractDialog; import org.insightech.er.common.widgets.CompositeFactory; import org.insightech.er.db.sqltype.SqlType; import org.insightech.er.editor.model.ERDiagram; import org.insightech.er.editor.model.diagram_contents.element.node.table.ERTable; import org.insightech.er.editor.model.diagram_contents.element.node.table.column.Column; import org.insightech.er.editor.model.diagram_contents.element.node.table.column.CopyColumn; import org.insightech.er.editor.model.diagram_contents.element.node.table.column.NormalColumn; import org.insightech.er.editor.model.diagram_contents.not_element.group.ColumnGroup; import org.insightech.er.editor.view.dialog.word.column.AbstractColumnDialog; import org.insightech.er.util.Format; public class ERTableComposite extends Composite { private static final int DEFAULT_HEIGHT = 200; private static final int KEY_WIDTH = 45; public static final int NAME_WIDTH = 150; private static final int TYPE_WIDTH = 100; private static final int NOT_NULL_WIDTH = 80; public static final int UNIQUE_KEY_WIDTH = 70; private Table table; private Button columnAddButton; private Button columnEditButton; private Button columnDeleteButton; private Button upButton; private Button downButton; // private Button quickAddButton; private ERDiagram diagram; private ERTable ertable; private List<Column> columnList; private AbstractColumnDialog columnDialog; private AbstractDialog parentDialog; private Map<Column, TableEditor[]> columnNotNullCheckMap = new HashMap<Column, TableEditor[]>(); private boolean buttonDisplay; private boolean checkboxEnabled; private int height; private ERTableCompositeHolder holder; private TableViewer tableViewer; public ERTableComposite(ERTableCompositeHolder holder, Composite parent, ERDiagram diagram, ERTable erTable, List<Column> columnList, AbstractColumnDialog columnDialog, AbstractDialog parentDialog, int horizontalSpan, boolean buttonDisplay, boolean checkboxEnabled) { this(holder, parent, diagram, erTable, columnList, columnDialog, parentDialog, horizontalSpan, buttonDisplay, checkboxEnabled, DEFAULT_HEIGHT); } public ERTableComposite(ERTableCompositeHolder holder, Composite parent, ERDiagram diagram, ERTable erTable, List<Column> columnList, AbstractColumnDialog columnDialog, AbstractDialog parentDialog, int horizontalSpan, boolean buttonDisplay, boolean checkboxEnabled, int height) { super(parent, SWT.NONE); this.holder = holder; this.height = height; this.buttonDisplay = buttonDisplay; this.checkboxEnabled = checkboxEnabled; this.diagram = diagram; this.ertable = erTable; this.columnList = columnList; this.columnDialog = columnDialog; this.parentDialog = parentDialog; GridData gridData = new GridData(); gridData.horizontalSpan = horizontalSpan; this.setLayoutData(gridData); this.createComposite(); this.initComposite(); } private void createComposite() { GridLayout gridLayout = new GridLayout(); gridLayout.numColumns = 3; this.setLayout(gridLayout); this.createTable(); if (this.buttonDisplay) { this.createButton(); this.setButtonEnabled(false); } } // private TableItem[] currentItems = null; private void createTable() { this.table = CompositeFactory.createTable(this, this.height, 3); CompositeFactory.createTableColumn(this.table, "PK", KEY_WIDTH, SWT.CENTER); CompositeFactory.createTableColumn(this.table, "FK", KEY_WIDTH, SWT.CENTER); CompositeFactory.createTableColumn(this.table, "label.physical.name", NAME_WIDTH, SWT.NONE); CompositeFactory.createTableColumn(this.table, "label.logical.name", NAME_WIDTH, SWT.NONE); CompositeFactory.createTableColumn(this.table, "label.column.type", TYPE_WIDTH, SWT.NONE); CompositeFactory.createTableColumn(this.table, "label.not.null", NOT_NULL_WIDTH, SWT.NONE); CompositeFactory.createTableColumn(this.table, "label.unique.key", UNIQUE_KEY_WIDTH, SWT.NONE); this.table.addSelectionListener(new SelectionAdapter() { /** * {@inheritDoc} */ @Override public void widgetSelected(SelectionEvent e) { int index = table.getSelectionIndex(); selectTable(index); Column selectedColumn = columnList.get(index); if (selectedColumn instanceof ColumnGroup) { holder.selectGroup((ColumnGroup) selectedColumn); } } }); table.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { if (e.keyCode == SWT.SPACE) { Column targetColumn = getTargetColumn(); if (targetColumn == null || !(targetColumn instanceof CopyColumn)) { return; } addOrEditColumn((CopyColumn) targetColumn, false); } } }); // tableViewer = new TableViewer(table); // tableViewer.setContentProvider(new ArrayContentProvider()); // // final LocalSelectionTransfer transfer = LocalSelectionTransfer // .getTransfer(); // Transfer[] types = new Transfer[] { transfer }; // tableViewer.addDragSupport(DND.DROP_MOVE, types, // new DragSourceAdapter() { // @Override // public void dragSetData(DragSourceEvent event) { // TableItem[] tableItems = ((Table) ((DragSource) event.widget) // .getControl()).getSelection(); // currentItems = tableItems; // transfer.setSelection(tableViewer.getSelection()); // } // }); // // tableViewer.addDropSupport(DND.DROP_MOVE, types, new ViewerDropAdapter( // tableViewer) { // @Override // public boolean validateDrop(Object target, int operation, // TransferData transferType) { // return true; // } // // @Override // public boolean performDrop(Object data) { // if (data instanceof IStructuredSelection) { // IStructuredSelection ssel = (IStructuredSelection) data; // // TableItem insertingItem = (TableItem) this // .getCurrentEvent().item; // if (insertingItem == null) { // return false; // } // // List<TableItem> removingItems = Arrays.asList(currentItems); // Collections.reverse(removingItems); // for (TableItem item : removingItems) { // table.remove(table.indexOf(item)); // } // // Object[] selections = ssel.toArray(); // List<Object> movedRows = Arrays.asList(selections); // Collections.reverse(movedRows); // // int index = table.indexOf(insertingItem); // if (getCurrentLocation() == LOCATION_AFTER) { // index += 1; // } // for (Object row : movedRows) { // tableViewer.insert(row, index); // } // } // return true; // } // }); if (this.buttonDisplay) { this.table.addMouseListener(new MouseAdapter() { /** * {@inheritDoc} */ @Override public void mouseDoubleClick(MouseEvent e) { Column targetColumn = getTargetColumn(); if (targetColumn == null || !(targetColumn instanceof CopyColumn)) { return; } addOrEditColumn((CopyColumn) targetColumn, false); } }); } } /** * This method initializes composite2 * */ private void createButton() { GridLayout gridLayout = new GridLayout(); gridLayout.numColumns = 8; GridData gridData = new GridData(); gridData.horizontalSpan = 2; Composite buttonComposite = new Composite(this, SWT.NONE); buttonComposite.setLayoutData(gridData); buttonComposite.setLayout(gridLayout); this.columnAddButton = CompositeFactory.createButton(buttonComposite, "label.button.add"); this.columnAddButton.addSelectionListener(new SelectionAdapter() { /** * {@inheritDoc} */ @Override public void widgetSelected(SelectionEvent e) { addOrEditColumn(null, true); } }); this.columnEditButton = CompositeFactory.createButton(buttonComposite, "label.button.edit"); this.columnEditButton.addSelectionListener(new SelectionAdapter() { /** * {@inheritDoc} */ @Override public void widgetSelected(SelectionEvent e) { Column targetColumn = getTargetColumn(); if (targetColumn == null || !(targetColumn instanceof CopyColumn)) { return; } addOrEditColumn((CopyColumn) targetColumn, false); } }); this.columnDeleteButton = CompositeFactory.createButton( buttonComposite, "label.button.delete"); this.columnDeleteButton.addSelectionListener(new SelectionAdapter() { /** * {@inheritDoc} */ @Override public void widgetSelected(SelectionEvent e) { int index = table.getSelectionIndex(); removeColumn(); if (index >= table.getItemCount()) { index = table.getItemCount() - 1; } selectTable(index); } }); CompositeFactory.filler(buttonComposite, 1, 30); this.upButton = CompositeFactory.createButton(buttonComposite, "label.up.arrow"); this.upButton.addSelectionListener(new SelectionAdapter() { /** * {@inheritDoc} */ @Override public void widgetSelected(SelectionEvent e) { upColumn(); } }); this.downButton = CompositeFactory.createButton(buttonComposite, "label.down.arrow"); this.downButton.addSelectionListener(new SelectionAdapter() { /** * {@inheritDoc} */ @Override public void widgetSelected(SelectionEvent e) { downColumn(); } }); CompositeFactory.filler(buttonComposite, 1, 30); // this.quickAddButton = new Button(buttonComposite, SWT.NONE); // this.quickAddButton.setText(ResourceString // .getResourceString("label.button.quick.add")); // // this.quickAddButton.addSelectionListener(new SelectionAdapter() { // // /** // * {@inheritDoc} // */ // @Override // public void widgetSelected(SelectionEvent e) { // QuickAddDialog dialog = new QuickAddDialog(PlatformUI // .getWorkbench().getActiveWorkbenchWindow().getShell(), // diagram); // if (dialog.open() == IDialogConstants.OK_ID) { // List<NormalColumn> columnList = dialog.getColumnList(); // // for (NormalColumn column : columnList) { // addTableData(column, true); // } // } // } // // }); // // this.quickAddButton.setEnabled(true); } private void initComposite() { if (this.columnList != null) { for (Column column : this.columnList) { TableItem tableItem = new TableItem(this.table, SWT.NONE); this.column2TableItem(column, tableItem); } } } private void disposeCheckBox(Column column) { TableEditor[] oldEditors = this.columnNotNullCheckMap.get(column); if (oldEditors != null) { for (TableEditor oldEditor : oldEditors) { if (oldEditor.getEditor() != null) { oldEditor.getEditor().dispose(); oldEditor.dispose(); } } this.columnNotNullCheckMap.remove(column); } } private void column2TableItem(Column column, TableItem tableItem) { this.disposeCheckBox(column); if (column instanceof NormalColumn) { tableItem.setBackground(ColorConstants.white); NormalColumn normalColumn = (NormalColumn) column; if (normalColumn.isPrimaryKey()) { tableItem.setImage(0, Activator.getImage(ImageKey.PRIMARY_KEY)); } else { tableItem.setImage(0, null); } if (normalColumn.isForeignKey()) { tableItem.setImage(1, Activator.getImage(ImageKey.FOREIGN_KEY)); } else { tableItem.setImage(1, null); } tableItem.setText(2, Format.null2blank(normalColumn .getPhysicalName())); tableItem.setText(3, Format.null2blank(normalColumn .getLogicalName())); SqlType sqlType = normalColumn.getType(); tableItem.setText(4, Format.formatType(sqlType, normalColumn .getTypeData(), this.diagram.getDatabase())); this.setTableEditor(normalColumn, tableItem); } else { tableItem.setBackground(ColorConstants.white); tableItem.setImage(0, Activator.getImage(ImageKey.GROUP)); tableItem.setImage(1, null); tableItem.setText(2, column.getName()); tableItem.setText(3, ""); tableItem.setText(4, ""); } } private void setTableEditor(final NormalColumn normalColumn, TableItem tableItem) { final Button notNullCheckButton = new Button(this.table, SWT.CHECK); notNullCheckButton.pack(); final Button uniqueCheckButton = new Button(this.table, SWT.CHECK); uniqueCheckButton.pack(); TableEditor[] editors = new TableEditor[2]; editors[0] = new TableEditor(this.table); editors[0].minimumWidth = notNullCheckButton.getSize().x; editors[0].horizontalAlignment = SWT.CENTER; editors[0].setEditor(notNullCheckButton, tableItem, 5); editors[1] = new TableEditor(this.table); editors[1].minimumWidth = uniqueCheckButton.getSize().x; editors[1].horizontalAlignment = SWT.CENTER; editors[1].setEditor(uniqueCheckButton, tableItem, 6); if (normalColumn.isNotNull()) { notNullCheckButton.setSelection(true); } else { notNullCheckButton.setSelection(false); } if (normalColumn.isUniqueKey()) { uniqueCheckButton.setSelection(true); } else { uniqueCheckButton.setSelection(false); } if (normalColumn.isPrimaryKey()) { notNullCheckButton.setEnabled(false); } if (this.ertable != null) { if (normalColumn.isRefered()) { uniqueCheckButton.setEnabled(false); } } this.columnNotNullCheckMap.put(normalColumn, editors); if (this.checkboxEnabled) { notNullCheckButton.addSelectionListener(new SelectionAdapter() { /** * {@inheritDoc} */ @Override public void widgetSelected(SelectionEvent e) { normalColumn.setNotNull(notNullCheckButton.getSelection()); super.widgetSelected(e); } }); uniqueCheckButton.addSelectionListener(new SelectionAdapter() { /** * {@inheritDoc} */ @Override public void widgetSelected(SelectionEvent e) { normalColumn.setUniqueKey(uniqueCheckButton.getSelection()); super.widgetSelected(e); } }); } else { notNullCheckButton.setEnabled(false); uniqueCheckButton.setEnabled(false); } } /** * <pre> * �スJ�ス�ス�ス�ス�スフ追隠箏ゑソス�ス鼾� * CopyColumn �ス�ス�スヌ隠�ス�ス�スワゑソス * �ス�ス�スフ際、word �スノゑソス CopyWord �ス�ス�スン定さ�ス�ストゑソス�スワゑソス * �スiCopyWord �ス�ス original �ス�ス �ス�ス�ス[�スh�ス�スI�ス箏ゑソス�ス鼾�ソスヘ、�ス�ス�スフイ�ス�ス�スX�ス^�ス�ス�スX * �スI�ス箏なゑソス�スB�ス�ス鼾�ソスヘ、�スV�ス�ス�ス�ス�スC�ス�ス�スX�ス^�ス�ス�スX�スj * </pre> * * @param column * @param add */ private void addTableData(NormalColumn column, boolean add) { int index = this.table.getSelectionIndex(); TableItem tableItem = null; CopyColumn copyColumn = null; if (add) { tableItem = new TableItem(table, SWT.NONE); copyColumn = new CopyColumn(column); this.columnList.add(copyColumn); } else { tableItem = this.table.getItem(index); copyColumn = (CopyColumn) this.columnList.get(index); CopyColumn.copyData(column, copyColumn); } this.column2TableItem(copyColumn, tableItem); this.parentDialog.validate(); } public void addTableData(ColumnGroup column) { TableItem tableItem = null; tableItem = new TableItem(table, SWT.NONE); this.columnList.add(column); this.column2TableItem(column, tableItem); this.parentDialog.validate(); } private void removeColumn() { int index = this.table.getSelectionIndex(); if (index != -1) { Column column = this.columnList.get(index); if (column instanceof NormalColumn) { NormalColumn normalColumn = (NormalColumn) column; if (normalColumn.isForeignKey()) { this .setMessage(ResourceString .getResourceString("error.foreign.key.not.deleteable")); } else { if (this.ertable != null && normalColumn.isRefered()) { this .setMessage(ResourceString .getResourceString("error.reference.key.not.deleteable")); } else { removeColumn(index); } } } else { this.removeColumn(index); } } this.parentDialog.validate(); } public void removeColumn(int index) { Column column = this.columnList.get(index); this.table.remove(index); this.columnList.remove(index); this.disposeCheckBox(column); for (int i = index; i < this.table.getItemCount(); i++) { TableItem tableItem = this.table.getItem(i); column = this.columnList.get(i); this.disposeCheckBox(column); if (column instanceof NormalColumn) { this.setTableEditor((NormalColumn) column, tableItem); } } } private CopyColumn getTargetColumn() { CopyColumn column = null; int index = this.table.getSelectionIndex(); if (index != -1) { column = (CopyColumn) this.columnList.get(index); } return column; } private void setMessage(String message) { MessageBox messageBox = new MessageBox(PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getShell(), SWT.ICON_ERROR | SWT.OK); messageBox.setText(ResourceString .getResourceString("dialog.title.error")); messageBox.setMessage(message); messageBox.open(); } private void upColumn() { int index = this.table.getSelectionIndex(); if (index != -1 && index != 0) { this.changeColumn(index - 1, index); this.table.setSelection(index - 1); } } private void downColumn() { int index = this.table.getSelectionIndex(); if (index != -1 && index != table.getItemCount() - 1) { this.changeColumn(index, index + 1); table.setSelection(index + 1); } } private void changeColumn(int index1, int index2) { Column column1 = this.columnList.remove(index1); Column column2 = null; if (index1 < index2) { column2 = this.columnList.remove(index2 - 1); this.columnList.add(index1, column2); this.columnList.add(index2, column1); } else if (index1 > index2) { column2 = this.columnList.remove(index2); this.columnList.add(index1 - 1, column2); this.columnList.add(index2, column1); } TableItem[] tableItems = this.table.getItems(); this.column2TableItem(column1, tableItems[index2]); this.column2TableItem(column2, tableItems[index1]); } private void addOrEditColumn(CopyColumn targetColumn, boolean add) { boolean foreignKey = false; boolean isRefered = false; if (targetColumn != null) { foreignKey = targetColumn.isForeignKey(); if (this.ertable != null) { isRefered = targetColumn.isRefered(); } } this.columnDialog.setTargetColumn(targetColumn, foreignKey, isRefered); if (this.columnDialog.open() == IDialogConstants.OK_ID) { NormalColumn column = this.columnDialog.getColumn(); addTableData(column, add); } } /** * tableを取得します。 * @return table */ public Table getTable() { return table; } public void setColumnList(List<Column> columnList) { this.table.removeAll(); if (this.columnList != null) { for (Column column : this.columnList) { this.disposeCheckBox(column); } } this.columnList = columnList; initComposite(); } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); if (this.buttonDisplay) { this.columnAddButton.setEnabled(enabled); this.columnEditButton.setEnabled(false); this.columnDeleteButton.setEnabled(false); this.upButton.setEnabled(false); this.downButton.setEnabled(false); // this.quickAddButton.setEnabled(enabled); } } private void setButtonEnabled(boolean enabled) { if (this.buttonDisplay) { this.columnEditButton.setEnabled(enabled); this.columnDeleteButton.setEnabled(enabled); this.upButton.setEnabled(enabled); this.downButton.setEnabled(enabled); } } private void selectTable(int index) { this.table.select(index); if (index >= 0) { this.setButtonEnabled(true); } else { this.setButtonEnabled(false); } } }