package org.insightech.er.editor.view.dialog.element.table.tab; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.TableEditor; 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.TabFolder; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.ui.PlatformUI; import org.insightech.er.ResourceString; import org.insightech.er.common.dialog.AbstractDialog; import org.insightech.er.common.exception.InputException; import org.insightech.er.common.widgets.CompositeFactory; import org.insightech.er.common.widgets.ValidatableTabWrapper; import org.insightech.er.editor.model.diagram_contents.element.node.table.ERTable; import org.insightech.er.editor.model.diagram_contents.element.node.table.column.NormalColumn; import org.insightech.er.editor.model.diagram_contents.element.node.table.index.CopyIndex; import org.insightech.er.editor.model.diagram_contents.element.node.table.index.Index; import org.insightech.er.editor.view.dialog.common.ERTableComposite; import org.insightech.er.editor.view.dialog.element.table.sub.IndexDialog; import org.insightech.er.util.Format; public class IndexTabWrapper extends ValidatableTabWrapper { private static final int BUTTON_WIDTH = 60; private ERTable copyData; private Table indexTable; private List<Button> checkButtonList; private List<TableEditor> editorList; private Button addButton; private Button editButton; private Button deleteButton; public IndexTabWrapper(AbstractDialog dialog, TabFolder parent, int style, ERTable copyData) { super(dialog, parent, style, "label.index"); this.copyData = copyData; this.checkButtonList = new ArrayList<Button>(); this.editorList = new ArrayList<TableEditor>(); this.init(); } /** * {@inheritDoc} */ @Override public void validatePage() throws InputException { this.resutuctIndexData(); } @Override public void initComposite() { this.setLayout(new GridLayout()); Composite content = new Composite(this, SWT.BORDER); this.createBody(content); } private void createBody(Composite content) { GridData contentGridData = new GridData(); contentGridData.horizontalAlignment = GridData.FILL; contentGridData.grabExcessHorizontalSpace = true; content.setLayoutData(contentGridData); content.setLayout(new GridLayout(3, false)); this.initTable(content); this.initTableButton(content); this.setTableData(); } private void initTable(Composite parent) { GridData gridData = new GridData(); gridData.horizontalSpan = 3; gridData.grabExcessHorizontalSpace = true; gridData.horizontalAlignment = GridData.FILL; gridData.heightHint = 200; this.indexTable = new Table(parent, SWT.BORDER | SWT.HIDE_SELECTION); this.indexTable.setHeaderVisible(true); this.indexTable.setLayoutData(gridData); this.indexTable.setLinesVisible(true); CompositeFactory.createTableColumn(this.indexTable, "label.column.name", ERTableComposite.NAME_WIDTH, SWT.NONE); TableColumn separatorColumn = CompositeFactory.createTableColumn( this.indexTable, "", 3, SWT.NONE); separatorColumn.setResizable(false); } private void initTableButton(Composite parent) { GridData gridData = new GridData(); gridData.widthHint = BUTTON_WIDTH; this.addButton = new Button(parent, SWT.NONE); this.addButton.setText(ResourceString .getResourceString("label.button.add")); this.addButton.setLayoutData(gridData); this.editButton = new Button(parent, SWT.NONE); this.editButton.setText(ResourceString .getResourceString("label.button.edit")); this.editButton.setLayoutData(gridData); this.deleteButton = new Button(parent, SWT.NONE); this.deleteButton.setText(ResourceString .getResourceString("label.button.delete")); this.deleteButton.setLayoutData(gridData); } @Override protected void addListener() { this.addButton.addSelectionListener(new SelectionAdapter() { /** * {@inheritDoc} */ @Override public void widgetSelected(SelectionEvent event) { IndexDialog dialog = new IndexDialog(PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getShell(), null, copyData); if (dialog.open() == IDialogConstants.OK_ID) { addIndexData(dialog.getResultIndex(), true); } } }); this.editButton.addSelectionListener(new SelectionAdapter() { /** * {@inheritDoc} */ @Override public void widgetSelected(SelectionEvent event) { Index targetIndex = getTargetIndex(); if (targetIndex == null) { return; } IndexDialog dialog = new IndexDialog(PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getShell(), targetIndex, copyData); if (dialog.open() == IDialogConstants.OK_ID) { addIndexData(dialog.getResultIndex(), false); } } }); this.deleteButton.addSelectionListener(new SelectionAdapter() { /** * {@inheritDoc} */ @Override public void widgetSelected(SelectionEvent event) { removeIndex(); } }); } private void setTableData() { List<Index> indexes = this.copyData.getIndexes(); TableItem radioTableItem = new TableItem(this.indexTable, SWT.NONE); for (int i = 0; i < indexes.size(); i++) { TableColumn tableColumn = new TableColumn(this.indexTable, SWT.CENTER); tableColumn.setWidth(60); tableColumn.setResizable(false); tableColumn.setText("Index" + (i + 1)); TableEditor editor = new TableEditor(this.indexTable); Button radioButton = new Button(this.indexTable, SWT.RADIO); radioButton.addSelectionListener(new SelectionAdapter() { /** * {@inheritDoc} */ @Override public void widgetSelected(SelectionEvent event) { setButtonEnabled(true); } }); radioButton.pack(); editor.minimumWidth = radioButton.getSize().x; editor.horizontalAlignment = SWT.CENTER; editor.setEditor(radioButton, radioTableItem, i + 2); this.checkButtonList.add(radioButton); this.editorList.add(editor); } for (NormalColumn normalColumn : this.copyData.getExpandedColumns()) { TableItem tableItem = new TableItem(this.indexTable, SWT.NONE); tableItem.setText(0, Format.null2blank(normalColumn.getName())); for (int i = 0; i < indexes.size(); i++) { Index index = indexes.get(i); List<NormalColumn> indexColumns = index.getColumns(); for (int j = 0; j < indexColumns.size(); j++) { NormalColumn indexColumn = indexColumns.get(j); if (normalColumn.equals(indexColumn)) { tableItem.setText(i + 2, String.valueOf(j + 1)); break; } } } } setButtonEnabled(false); } public void addIndexData(Index index, boolean add) { int selectedIndex = -1; for (int i = 0; i < this.checkButtonList.size(); i++) { Button checkButton = this.checkButtonList.get(i); if (checkButton.getSelection()) { selectedIndex = i; break; } } Index copyIndex = null; if (add || selectedIndex == -1) { copyIndex = new CopyIndex(copyData, index, null); this.copyData.addIndex(copyIndex); } else { copyIndex = this.copyData.getIndex(selectedIndex); CopyIndex.copyData(index, copyIndex); } this.restruct(); } public void removeIndex() { int selectedIndex = -1; for (int i = 0; i < this.checkButtonList.size(); i++) { Button checkButton = this.checkButtonList.get(i); if (checkButton.getSelection()) { selectedIndex = i; break; } } if (selectedIndex == -1) { return; } this.copyData.removeIndex(selectedIndex); this.restruct(); } public void restruct() { this.clearButtonAndEditor(); while (this.indexTable.getColumnCount() > 2) { TableColumn tableColumn = this.indexTable.getColumn(2); tableColumn.dispose(); } this.indexTable.removeAll(); this.resutuctIndexData(); this.setTableData(); } private void resutuctIndexData() { for (Index index : this.copyData.getIndexes()) { List<NormalColumn> indexColumns = index.getColumns(); Iterator<NormalColumn> columnIterator = indexColumns.iterator(); Iterator<Boolean> descIterator = index.getDescs().iterator(); while (columnIterator.hasNext()) { NormalColumn indexColumn = columnIterator.next(); descIterator.next(); if (!this.copyData.getExpandedColumns().contains(indexColumn)) { columnIterator.remove(); descIterator.remove(); } } } } private void clearButtonAndEditor() { for (Button checkButton : this.checkButtonList) { checkButton.dispose(); } this.checkButtonList.clear(); for (TableEditor editor : this.editorList) { editor.dispose(); } this.editorList.clear(); } public Index getTargetIndex() { int selectedIndex = -1; for (int i = 0; i < this.checkButtonList.size(); i++) { Button checkButton = this.checkButtonList.get(i); if (checkButton.getSelection()) { selectedIndex = i; break; } } if (selectedIndex == -1) { return null; } return this.copyData.getIndex(selectedIndex); } private void setButtonEnabled(boolean enabled) { this.editButton.setEnabled(enabled); this.deleteButton.setEnabled(enabled); } @Override public void setInitFocus() { } @Override public void perfomeOK() { } }