svnno****@sourc*****
svnno****@sourc*****
2009年 2月 20日 (金) 00:39:29 JST
Revision: 2693 http://svn.sourceforge.jp/view?root=jiemamy&view=rev&rev=2693 Author: daisuke_m Date: 2009-02-20 00:39:29 +0900 (Fri, 20 Feb 2009) Log Message: ----------- テーブル編集ダイアログ・内部キータブの表示。 / refactor Modified Paths: -------------- vesta/trunk/org.jiemamy.eclipse/src/main/java/org/jiemamy/eclipse/editor/dialog/table/TableEditDialog.java vesta/trunk/org.jiemamy.eclipse/src/main/java/org/jiemamy/eclipse/ui/tab/AbstractTab.java Added Paths: ----------- vesta/trunk/org.jiemamy.eclipse/src/main/java/org/jiemamy/eclipse/editor/dialog/table/TableEditDialogLocalKeyTab.java -------------- next part -------------- Modified: vesta/trunk/org.jiemamy.eclipse/src/main/java/org/jiemamy/eclipse/editor/dialog/table/TableEditDialog.java =================================================================== --- vesta/trunk/org.jiemamy.eclipse/src/main/java/org/jiemamy/eclipse/editor/dialog/table/TableEditDialog.java 2009-02-19 14:25:31 UTC (rev 2692) +++ vesta/trunk/org.jiemamy.eclipse/src/main/java/org/jiemamy/eclipse/editor/dialog/table/TableEditDialog.java 2009-02-19 15:39:29 UTC (rev 2693) @@ -70,7 +70,7 @@ private TableEditDialogColumnTab tabColumns; -// private TableEditDialogKeyTab tabKeys; + private TableEditDialogLocalKeyTab tabLocalKeys; private TableEditDialogCheckTab tabChecks; @@ -174,8 +174,8 @@ // ---- B-1. カラム tabColumns = new TableEditDialogColumnTab(tabFolder, SWT.NULL, tableModel); - // ---- B-2. 一意 -// tabKeys = new TableEditDialogKeyTab(tabFolder, SWT.NULL, tableModel); + // ---- B-2. 内部キー + tabLocalKeys = new TableEditDialogLocalKeyTab(tabFolder, SWT.NULL, tableModel); // ---- B-3. チェック制約 tabChecks = new TableEditDialogCheckTab(tabFolder, SWT.NULL, tableModel); Added: vesta/trunk/org.jiemamy.eclipse/src/main/java/org/jiemamy/eclipse/editor/dialog/table/TableEditDialogLocalKeyTab.java =================================================================== --- vesta/trunk/org.jiemamy.eclipse/src/main/java/org/jiemamy/eclipse/editor/dialog/table/TableEditDialogLocalKeyTab.java (rev 0) +++ vesta/trunk/org.jiemamy.eclipse/src/main/java/org/jiemamy/eclipse/editor/dialog/table/TableEditDialogLocalKeyTab.java 2009-02-19 15:39:29 UTC (rev 2693) @@ -0,0 +1,521 @@ +/* + * Copyright 2007-2009 Jiemamy Project and the Others. + * Created on 2009/02/18 + * + * This file is part of Jiemamy. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ +package org.jiemamy.eclipse.editor.dialog.table; + +import java.util.List; + +import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang.StringUtils; +import org.eclipse.jface.resource.ImageRegistry; +import org.eclipse.jface.viewers.ArrayContentProvider; +import org.eclipse.jface.viewers.BaseLabelProvider; +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.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; +import org.eclipse.swt.events.KeyAdapter; +import org.eclipse.swt.events.KeyEvent; +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.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.TabFolder; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.Text; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.jiemamy.EventBroker; +import org.jiemamy.Jiemamy; +import org.jiemamy.JiemamyFactory; +import org.jiemamy.ReferenceResolver; +import org.jiemamy.eclipse.Images; +import org.jiemamy.eclipse.JiemamyPlugin; +import org.jiemamy.eclipse.ui.AbstractTableEditor; +import org.jiemamy.eclipse.ui.TableEditorConfigurator; +import org.jiemamy.eclipse.ui.helper.TextSelectionAdapter; +import org.jiemamy.eclipse.ui.tab.AbstractTab; +import org.jiemamy.editcommand.Command; +import org.jiemamy.editcommand.CommandListener; +import org.jiemamy.model.JiemamyElement; +import org.jiemamy.model.attribute.ColumnModel; +import org.jiemamy.model.attribute.ColumnRef; +import org.jiemamy.model.attribute.constraint.LocalKeyModel; +import org.jiemamy.model.attribute.constraint.PrimaryKeyModel; +import org.jiemamy.model.attribute.constraint.UniqueKeyModel; +import org.jiemamy.model.entity.TableModel; +import org.jiemamy.utils.CollectionsUtil; +import org.jiemamy.utils.ListUtils; +import org.jiemamy.utils.model.TableUtil; + +/** + * テーブル編集ダイアログの「内部キー制約」タブ。 + * + * @author daisuke + */ +public class TableEditDialogLocalKeyTab extends AbstractTab { + + private static Logger logger = LoggerFactory.getLogger(TableEditDialogLocalKeyTab.class); + + private TableModel tableModel; + + private AbstractTableEditor localKeyEditor; + + + /** + * インスタンスを生成する。 + * + * @param parentTabFolder + * @param style + * @param tableModel + */ + public TableEditDialogLocalKeyTab(TabFolder parentTabFolder, int style, TableModel tableModel) { + super(parentTabFolder, style, "内部キー制約"); // RESOURCE + + this.tableModel = tableModel; + + Composite composite = new Composite(parentTabFolder, SWT.NULL); + composite.setLayout(new GridLayout(1, false)); + composite.setLayoutData(new GridData(GridData.FILL_BOTH)); + + localKeyEditor = new LocalKeyTableEditor(composite, SWT.NULL); + localKeyEditor.configure(); + localKeyEditor.disableEditControls(); + localKeyEditor.disableEditControls(); + + getTabItem().setControl(composite); + } + + + /** + * 内部キー用ContentProvider + * + * @author daisuke + */ + private class LocalKeyContentProvider extends ArrayContentProvider implements CommandListener { + + private Viewer viewer; + + + public void commandExecuted(Command command) { + logger.debug("LocalKeyContentProvider: commandExecuted"); +// if (evt.getPropertyName().equals(TableModel.P_ENTITY_TABLE_UNIQUES)) { + localKeyEditor.refreshTable(); +// } else if (evt.getPropertyName().equals(CheckConstraintModel.P_UNIQUE_NAME)) { +// uniqueEditArea.refreshTable(); +// } else if (evt.getPropertyName().equals(CheckConstraintModel.P_UNIQUE_DEFINITION)) { +// uniqueEditArea.refreshTable(); +// } else if (evt.getSource() instanceof UniqueConstraintModel) { +// uniqueEditArea.refreshTable(); +// if (evt.getPropertyName().equals(UniqueConstraintModel.P_CREATE)) { +// // nothing to do +// } else if (evt.getPropertyName().equals(UniqueConstraintModel.P_DELETE)) { +// ((AbstractModel) evt.getSource()).removePropertyChangeListener(this); +// } else if (evt.getPropertyName().equals(UniqueConstraintModel.P_REVERT)) { +// ((AbstractModel) evt.getSource()).addPropertyChangeListener(this); +// } +// } + } + + @Override + public void dispose() { + logger.debug("LocalKeyContentProvider: dispose"); +// tableModel.removePropertyChangeListener(this); +// for (UniqueConstraintModel unique : tableModel.getUniques()) { +// ((AbstractModel) unique).removePropertyChangeListener(this); +// } + super.dispose(); + } + + public JiemamyElement getTargetModel() { + return (JiemamyElement) viewer.getInput(); + } + + @Override + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + logger.debug("LocalKeyContentProvider: input changed"); + logger.trace("oldInput: " + oldInput); + logger.trace("newInput: " + newInput); + + this.viewer = viewer; + +// if (oldInput != null) { +// tableModel.removePropertyChangeListener(this); +// for (UniqueConstraintModel unique : tableModel.getUniques()) { +// ((AbstractModel) unique).removePropertyChangeListener(this); +// } +// } +// if (newInput != null) { +// tableModel.addPropertyChangeListener(this); +// for (UniqueConstraintModel unique : tableModel.getUniques()) { +// ((AbstractModel) unique).addPropertyChangeListener(this); +// } +// } + + super.inputChanged(viewer, oldInput, newInput); + } + + } + + /** + * 内部キー用LabelProvider + * + * @author daisuke + */ + private class LocalKeyLabelProvider extends BaseLabelProvider implements ITableLabelProvider { + + private ReferenceResolver resolver; + + + private LocalKeyLabelProvider() { + resolver = tableModel.getJiemamy().getReferenceResolver(); + } + + public Image getColumnImage(Object element, int columnIndex) { + LocalKeyModel localKeyModel = (LocalKeyModel) element; + if (columnIndex == 0 && localKeyModel instanceof PrimaryKeyModel) { + ImageRegistry ir = JiemamyPlugin.getDefault().getImageRegistry(); + return ir.get(Images.ICON_PK); + } else { + return null; + } + } + + public String getColumnText(Object element, int columnIndex) { + LocalKeyModel unique = (LocalKeyModel) element; + switch (columnIndex) { + case 1: + return unique.getName(); + + case 2: + List<String> columnNames = CollectionsUtil.newArrayList(); + for (ColumnRef columnRef : unique.getKeyColumns()) { + columnNames.add(resolver.resolve(columnRef).getName()); + } + return StringUtils.join(columnNames, ","); + + default: + return StringUtils.EMPTY; + } + } + } + + private class LocalKeyTableEditor extends AbstractTableEditor { + + private final Jiemamy jiemamy; + + private final List<LocalKeyModel> localKeys; + + private Text txtKeyConstraintName; + + private org.eclipse.swt.widgets.List lstKeyColumns; + + + public LocalKeyTableEditor(Composite parent, int style) { + super(parent, style, new TableEditorConfigurator() { + + public String getAddLabel() { + return "追加"; // RESOURCE + } + + public String getEditorTitle() { + return "ローカルキー情報"; // RESOURCE + } + + public String getInsertLabel() { + return "挿入"; // RESOURCE + } + + public String getRemoveLabel() { + return "削除"; // RESOURCE + } + }); + + jiemamy = tableModel.getJiemamy(); + localKeys = TableUtil.getAttributes(tableModel, LocalKeyModel.class); + + assert jiemamy != null; + assert localKeys != null; + } + + @Override + protected JiemamyElement addItem() { + Table table = getTableViewer().getTable(); + JiemamyFactory factory = jiemamy.getFactory(); + LocalKeyModel unique = factory.newModel(UniqueKeyModel.class); + + localKeys.add(unique); + tableModel.getAttributes().add(unique); + + int addedIndex = localKeys.indexOf(unique); + table.setSelection(addedIndex); + enableEditControls(addedIndex); + txtKeyConstraintName.setFocus(); + + return unique; + } + + @Override + protected void configureEditorControls() { + txtKeyConstraintName.addFocusListener(new TextSelectionAdapter(txtKeyConstraintName)); + txtKeyConstraintName.addKeyListener(new KeyAdapter() { + + @Override + public void keyReleased(KeyEvent e) { + updateModel(); + localKeyEditor.refreshTable(); + } + }); + lstKeyColumns.addSelectionListener(new SelectionAdapter() { + + @Override + public void widgetSelected(SelectionEvent e) { + updateModel(); + localKeyEditor.refreshTable(); + } + }); + } + + @Override + protected void configureTable(final Table table) { + super.configureTable(table); + + // THINK ↓要る? +// final Menu menu = new Menu(table); +// table.setMenu(menu); +// menu.addMenuListener(new MenuAdapter() { +// +// @Override +// public void menuShown(MenuEvent evt) { +// for (MenuItem item : menu.getItems()) { +// item.dispose(); +// } +// int index = table.getSelectionIndex(); +// if (index == -1) { +// return; +// } +// +// MenuItem removeItem = new MenuItem(menu, SWT.PUSH); +// removeItem.setText("&Remove"); // TODO 外部化せよ。 +// removeItem.addSelectionListener(new SelectionAdapter() { +// +// @Override +// public void widgetSelected(SelectionEvent evt) { +// removeTableSelectionItem(); +// } +// }); +// } +// }); + } + + @Override + protected void configureTableViewer(TableViewer tableViewer) { + tableViewer.setLabelProvider(new LocalKeyLabelProvider()); + final LocalKeyContentProvider contentProvider = new LocalKeyContentProvider(); + tableViewer.setContentProvider(contentProvider); + tableViewer.setInput(localKeys); + + final EventBroker eventBroker = jiemamy.getEventBroker(); + eventBroker.addListener(contentProvider); + + // THINK んーーー?? このタイミングか? + tableViewer.getTable().addDisposeListener(new DisposeListener() { + + public void widgetDisposed(DisposeEvent e) { + eventBroker.removeListener(contentProvider); + } + + }); + } + + @Override + protected void createEditorControls(Composite parent) { + Label label; + + Composite cmpNames = new Composite(parent, SWT.NULL); + cmpNames.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + GridLayout layout = new GridLayout(2, false); + layout.marginHeight = 0; + layout.marginWidth = 0; + cmpNames.setLayout(layout); + + label = new Label(cmpNames, SWT.NULL); + label.setText("制約名"); // RESOURCE + + txtKeyConstraintName = new Text(cmpNames, SWT.BORDER); + txtKeyConstraintName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + + label = new Label(cmpNames, SWT.NULL); + label.setText("構成カラム"); // RESOURCE + + lstKeyColumns = new org.eclipse.swt.widgets.List(cmpNames, SWT.BORDER | SWT.MULTI); + lstKeyColumns.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + } + + @Override + protected void createTableColumns(Table table) { + TableColumn colMark = new TableColumn(table, SWT.LEFT); + colMark.setText(StringUtils.EMPTY); + colMark.setWidth(20); + + TableColumn colName = new TableColumn(table, SWT.LEFT); + colName.setText("制約名"); // RESOURCE + colName.setWidth(200); + + TableColumn colExpression = new TableColumn(table, SWT.LEFT); + colExpression.setText("構成カラム"); // RESOURCE + colExpression.setWidth(500); + } + + @Override + protected void disableEditDetailControls() { + txtKeyConstraintName.setText(StringUtils.EMPTY); + lstKeyColumns.removeAll(); + + txtKeyConstraintName.setEnabled(false); + lstKeyColumns.setEnabled(false); + } + + @Override + protected void enableEditDetailControls(int index) { + LocalKeyModel unique = localKeys.get(index); + + txtKeyConstraintName.setEnabled(true); + lstKeyColumns.setEnabled(true); + lstKeyColumns.removeAll(); + + // 現在値の設定 + txtKeyConstraintName.setText(StringUtils.defaultIfEmpty(unique.getName(), "")); + List<ColumnRef> keyColumns = unique.getKeyColumns(); + List<ColumnModel> columns = TableUtil.getColumns(tableModel); + for (ColumnModel columnModel : columns) { + lstKeyColumns.add(columnModel.getName()); + boolean found = false; + for (ColumnRef columnRef : keyColumns) { + if (columnRef.getReferenceId().equals(columnModel.getId())) { + found = true; + break; + } + } + if (found) { + int[] newIndices = + ArrayUtils.add(lstKeyColumns.getSelectionIndices(), columns.indexOf(columnModel)); + lstKeyColumns.setSelection(newIndices); + } + } + } + + @Override + protected JiemamyElement insertTableSelectionItem() { + Table table = getTableViewer().getTable(); + int index = table.getSelectionIndex(); + + JiemamyFactory factory = jiemamy.getFactory(); + LocalKeyModel unique = factory.newModel(UniqueKeyModel.class); + + if (index < 0 || index > table.getItemCount()) { + tableModel.getAttributes().add(unique); + localKeys.add(unique); + } else { + // FIXME attributesに対しては、indexを調整しないと。 + tableModel.getAttributes().add(index, unique); + localKeys.add(index, unique); + } + + int addedIndex = localKeys.indexOf(unique); + table.setSelection(addedIndex); + enableEditControls(addedIndex); + txtKeyConstraintName.setFocus(); + + return unique; + } + + @Override + protected void moveDownTableSelectionItem() { + Table table = getTableViewer().getTable(); + int index = table.getSelectionIndex(); + if (index < 0 || index >= table.getItemCount()) { + return; + } + + // FIXME attributesに対しては、indexを調整しないと。 + ListUtils.moveDown(tableModel.getAttributes(), index); + ListUtils.moveDown(localKeys, index); + + table.setSelection(index + 1); + enableEditControls(index + 1); + } + + @Override + protected void moveUpTableSelectionItem() { + Table table = getTableViewer().getTable(); + int index = table.getSelectionIndex(); + if (index <= 0 || index > table.getItemCount()) { + return; + } + + // FIXME attributesに対しては、indexを調整しないと。 + ListUtils.moveUp(tableModel.getAttributes(), index); + ListUtils.moveUp(localKeys, index); + + table.setSelection(index - 1); + enableEditControls(index - 1); + } + + @Override + protected JiemamyElement removeTableSelectionItem() { + TableViewer tableViewer = getTableViewer(); + Table table = tableViewer.getTable(); + int index = table.getSelectionIndex(); + if (index < 0 || index > table.getItemCount()) { + return null; + } + LocalKeyModel keyToRemove = localKeys.remove(index); + tableModel.getAttributes().remove(keyToRemove); + tableViewer.remove(keyToRemove); + table.setSelection(index); + + disableEditControls(); + + return keyToRemove; + } + + private void updateModel() { + int editIndex = getTableViewer().getTable().getSelectionIndex(); + + if (editIndex != -1) { + JiemamyFactory factory = jiemamy.getFactory(); + LocalKeyModel unique = localKeys.get(editIndex); + unique.setName(StringUtils.defaultIfEmpty(txtKeyConstraintName.getText(), null)); + List<ColumnRef> keyColumns = unique.getKeyColumns(); + keyColumns.clear(); + for (int selectionIndex : lstKeyColumns.getSelectionIndices()) { + ColumnModel columnModel = TableUtil.getColumns(tableModel).get(selectionIndex); + keyColumns.add(factory.newReference(columnModel)); + } + } + } + } +} Property changes on: vesta/trunk/org.jiemamy.eclipse/src/main/java/org/jiemamy/eclipse/editor/dialog/table/TableEditDialogLocalKeyTab.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: vesta/trunk/org.jiemamy.eclipse/src/main/java/org/jiemamy/eclipse/ui/tab/AbstractTab.java =================================================================== --- vesta/trunk/org.jiemamy.eclipse/src/main/java/org/jiemamy/eclipse/ui/tab/AbstractTab.java 2009-02-19 14:25:31 UTC (rev 2692) +++ vesta/trunk/org.jiemamy.eclipse/src/main/java/org/jiemamy/eclipse/ui/tab/AbstractTab.java 2009-02-19 15:39:29 UTC (rev 2693) @@ -24,7 +24,7 @@ import org.eclipse.swt.widgets.TabItem; /** - * タブエリアの抽象クラス + * タブエリアの抽象クラス。 * * @author daisuke */