package org.insightech.er.editor.controller.command.common; import java.util.ArrayList; import org.eclipse.gef.EditPart; import org.eclipse.gef.GraphicalViewer; import org.insightech.er.editor.ERDiagramEditor; import org.insightech.er.editor.controller.command.AbstractCommand; import org.insightech.er.editor.controller.editpart.element.ERDiagramEditPart; import org.insightech.er.editor.model.ERDiagram; import org.insightech.er.editor.model.diagram_contents.element.connection.ConnectionElement; import org.insightech.er.editor.model.diagram_contents.element.node.Location; import org.insightech.er.editor.model.diagram_contents.element.node.NodeElement; import org.insightech.er.editor.model.diagram_contents.element.node.NodeSet; import org.insightech.er.editor.model.diagram_contents.element.node.ermodel.ERModel; import org.insightech.er.editor.model.diagram_contents.element.node.table.ERTable; import org.insightech.er.editor.model.diagram_contents.element.node.table.ERVirtualTable; 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.NormalColumn; import org.insightech.er.editor.model.diagram_contents.not_element.group.ColumnGroup; import org.insightech.er.editor.model.diagram_contents.not_element.group.GroupSet; public class PasteCommand extends AbstractCommand { private ERDiagram diagram; private GraphicalViewer viewer; // 貼り付け対象の一覧 private NodeSet nodeElements; // 貼り付け時に追加するグループ列の一覧 private GroupSet columnGroups; /** * 貼り付けコマンドを作成します。 * * @param editor * @param nodeElements * @param x * @param y */ public PasteCommand(ERDiagramEditor editor, NodeSet nodeElements, int x, int y) { this.viewer = editor.getGraphicalViewer(); Object model = viewer.getContents().getModel(); if (model instanceof ERDiagram) { this.diagram = (ERDiagram) model; } if (model instanceof ERModel) { this.diagram = ((ERModel) model).getDiagram(); } this.nodeElements = nodeElements; this.columnGroups = new GroupSet(); // 貼り付け対象に対して処理を繰り返します for (NodeElement nodeElement : nodeElements) { nodeElement.setLocation(new Location(nodeElement.getX() + x, nodeElement.getY() + y, nodeElement.getWidth(), nodeElement .getHeight())); // 貼り付け対象がテーブルの場合 if (nodeElement instanceof ERTable) { ERTable table = (ERTable) nodeElement; if (table instanceof ERVirtualTable) { ERTable rawTable = ((ERVirtualTable)table).getRawTable(); rawTable.setIncoming(new ArrayList<ConnectionElement>()); rawTable.setOutgoing(new ArrayList<ConnectionElement>()); for (Column column : rawTable.getColumns()) { if (column instanceof NormalColumn) { ((NormalColumn)column).clearRelations(); } } } // 列に対して処理を繰り返します for (Column column : table.getColumns()) { // 列がグループ列の場合 if (column instanceof ColumnGroup) { ColumnGroup group = (ColumnGroup) column; // この図のグループ列でない場合 if (!diagram.getDiagramContents().getGroups().contains( group)) { // 対象のグループ列に追加します。 columnGroups.add(group); } } } } } } /** * 貼り付け処理を実行する */ @Override protected void doExecute() { // 描画更新をとめます。 ERDiagramEditPart.setUpdateable(false); GroupSet columnGroupSet = this.diagram.getDiagramContents().getGroups(); // 図にノードを追加します。 for (NodeElement nodeElement : this.nodeElements) { if (nodeElement instanceof ERVirtualTable) { this.diagram.addContent(((ERVirtualTable)nodeElement).getRawTable()); } else { this.diagram.addContent(nodeElement); } } // グループ列を追加します。 for (ColumnGroup columnGroup : this.columnGroups) { columnGroupSet.add(columnGroup); } // 描画更新を再開します。 ERDiagramEditPart.setUpdateable(true); this.diagram.changeAll(); // 貼り付けられたテーブルを選択状態にします。 this.setFocus(); } /** * 貼り付け処理を元に戻す */ @Override protected void doUndo() { // 描画更新をとめます。 ERDiagramEditPart.setUpdateable(false); GroupSet columnGroupSet = this.diagram.getDiagramContents().getGroups(); // 図からノードを削除します。 for (NodeElement nodeElement : this.nodeElements) { this.diagram.removeContent(nodeElement); } // グループ列を削除します。 for (ColumnGroup columnGroup : this.columnGroups) { columnGroupSet.remove(columnGroup); } // 描画更新を再開します。 ERDiagramEditPart.setUpdateable(true); this.diagram.changeAll(); } /** * 貼り付けられたテーブルを選択状態にします。 */ private void setFocus() { // 貼り付けられたテーブルを選択状態にします。 for (NodeElement nodeElement : this.nodeElements) { EditPart editPart = (EditPart) viewer.getEditPartRegistry().get( nodeElement); if (editPart != null) { this.viewer.getSelectionManager().appendSelection(editPart); } } } }