[Jiemamy-notify:1468] commit [2693] テーブル編集ダイアログ・内部キータブの表示。 /

Back to archive index

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
  */



Jiemamy-notify メーリングリストの案内
Back to archive index