package org.insightech.er.editor.controller.editpolicy.element.node.table_view; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.eclipse.draw2d.ColorConstants; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.RectangleFigure; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPartViewer; import org.eclipse.gef.LayerConstants; import org.eclipse.gef.Request; import org.eclipse.gef.commands.Command; import org.eclipse.gef.commands.CompoundCommand; import org.eclipse.gef.editparts.LayerManager; import org.eclipse.gef.editparts.ScalableFreeformRootEditPart; import org.eclipse.gef.editparts.ZoomManager; import org.eclipse.gef.editpolicies.NonResizableEditPolicy; import org.eclipse.gef.requests.DirectEditRequest; import org.insightech.er.Activator; import org.insightech.er.editor.controller.command.diagram_contents.element.connection.relation.CreateRelationCommand; import org.insightech.er.editor.controller.command.diagram_contents.element.connection.relation.DeleteRelationCommand; import org.insightech.er.editor.controller.command.diagram_contents.element.node.table_view.AddColumnGroupCommand; import org.insightech.er.editor.controller.command.diagram_contents.element.node.table_view.AddWordCommand; import org.insightech.er.editor.controller.command.diagram_contents.element.node.table_view.ChangeColumnOrderCommand; import org.insightech.er.editor.controller.command.diagram_contents.element.node.table_view.ChangeTableViewPropertyCommand; import org.insightech.er.editor.controller.editpart.element.node.column.ColumnEditPart; import org.insightech.er.editor.controller.editpart.element.node.column.NormalColumnEditPart; import org.insightech.er.editor.model.diagram_contents.element.connection.Relation; import org.insightech.er.editor.model.diagram_contents.element.node.table.ERTable; import org.insightech.er.editor.model.diagram_contents.element.node.table.TableView; 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.dictionary.CopyWord; import org.insightech.er.editor.model.diagram_contents.not_element.dictionary.Word; import org.insightech.er.editor.model.diagram_contents.not_element.group.ColumnGroup; import org.insightech.er.editor.view.drag_drop.ERDiagramTransferDragSourceListener; public class ColumnSelectionHandlesEditPolicy extends NonResizableEditPolicy { /** * {@inheritDoc} */ @Override protected List createSelectionHandles() { List list = new ArrayList(); getHost().getRoot().getContents().refresh(); // NonResizableHandleKit.addHandles((GraphicalEditPart) getHost(), list, // new SelectEditPartTracker(getHost()), SharedCursors.ARROW); return list; } private Rectangle getColumnRectangle() { ColumnEditPart columnEditPart = (ColumnEditPart) this.getHost(); NormalColumn column = (NormalColumn) columnEditPart.getModel(); IFigure figure = columnEditPart.getFigure(); Rectangle rect = figure.getBounds(); int startY = 0; int endY = 0; if (column.getColumnHolder() instanceof ColumnGroup) { ColumnGroup columnGroup = (ColumnGroup) column.getColumnHolder(); NormalColumn firstColumn = columnGroup.getColumns().get(0); NormalColumn finalColumn = columnGroup.getColumns().get( columnGroup.getColumns().size() - 1); for (Object editPart : columnEditPart.getParent().getChildren()) { NormalColumnEditPart normalColumnEditPart = (NormalColumnEditPart) editPart; if (normalColumnEditPart.getModel() == firstColumn) { Rectangle bounds = normalColumnEditPart.getFigure() .getBounds(); startY = bounds.y; } else if (normalColumnEditPart.getModel() == finalColumn) { Rectangle bounds = normalColumnEditPart.getFigure() .getBounds(); endY = bounds.y + bounds.height; } } } else { startY = rect.y; endY = rect.y + rect.height; } return new Rectangle(rect.x, startY, rect.width, endY - startY); } @Override public void showTargetFeedback(Request request) { if (request instanceof DirectEditRequest) { ZoomManager zoomManager = ((ScalableFreeformRootEditPart) this .getHost().getRoot()).getZoomManager(); double zoom = zoomManager.getZoom(); Rectangle columnRectangle = this.getColumnRectangle(); int center = (int) ((columnRectangle.y + (columnRectangle.height / 2)) * zoom); DirectEditRequest directEditRequest = (DirectEditRequest) request; int y = 0; if (directEditRequest.getLocation().y < center) { y = columnRectangle.y - 1; } else { y = columnRectangle.y + columnRectangle.height - 1; } RectangleFigure feedbackFigure = new RectangleFigure(); feedbackFigure.setForegroundColor(ColorConstants.lightGray); feedbackFigure.setBackgroundColor(ColorConstants.lightGray); feedbackFigure.setBounds(new Rectangle( (int) (zoom * columnRectangle.x), (int) (zoom * y), (int) (zoom * columnRectangle.width), (int) (zoom * 2))); LayerManager manager = (LayerManager) this.getHost().getRoot(); IFigure layer = manager.getLayer(LayerConstants.PRIMARY_LAYER); IFigure feedbackLayer = this.getFeedbackLayer(); List children = this.getFeedbackLayer().getChildren(); children.clear(); feedbackLayer.setBounds(layer.getBounds()); feedbackLayer.add(feedbackFigure); feedbackLayer.repaint(); } super.showTargetFeedback(request); } @Override public void eraseTargetFeedback(Request request) { if (request instanceof DirectEditRequest) { this.getFeedbackLayer().getChildren().clear(); } super.eraseTargetFeedback(request); } @Override public EditPart getTargetEditPart(Request request) { if (ERDiagramTransferDragSourceListener.REQUEST_TYPE_ADD_COLUMN_GROUP .equals(request.getType()) || ERDiagramTransferDragSourceListener.REQUEST_TYPE_MOVE_COLUMN_GROUP .equals(request.getType())) { DirectEditRequest editRequest = (DirectEditRequest) request; TableView tableView = (TableView) this.getHost().getParent() .getModel(); ColumnGroup columnGroup = (ColumnGroup) ((Map) editRequest .getDirectEditFeature()) .get(ERDiagramTransferDragSourceListener.MOVE_COLUMN_GROUP_PARAM_GROUP); Object parent = ((Map) editRequest.getDirectEditFeature()) .get(ERDiagramTransferDragSourceListener.MOVE_COLUMN_GROUP_PARAM_PARENT); if (parent == tableView || !tableView.getColumns().contains(columnGroup)) { return getHost(); } } else if (ERDiagramTransferDragSourceListener.REQUEST_TYPE_ADD_WORD .equals(request.getType())) { return getHost(); } else if (ERDiagramTransferDragSourceListener.REQUEST_TYPE_MOVE_COLUMN .equals(request.getType())) { return getHost(); } return super.getTargetEditPart(request); } /** * {@inheritDoc} */ @Override public Command getCommand(Request request) { try { if (ERDiagramTransferDragSourceListener.REQUEST_TYPE_ADD_COLUMN_GROUP .equals(request.getType())) { DirectEditRequest editRequest = (DirectEditRequest) request; TableView tableView = (TableView) this.getHost().getParent() .getModel(); ColumnGroup columnGroup = (ColumnGroup) ((Map) editRequest .getDirectEditFeature()) .get(ERDiagramTransferDragSourceListener.MOVE_COLUMN_GROUP_PARAM_GROUP); if (!tableView.getColumns().contains(columnGroup)) { return new AddColumnGroupCommand(tableView, columnGroup, this.getColumnIndex(editRequest)); } } else if (ERDiagramTransferDragSourceListener.REQUEST_TYPE_ADD_WORD .equals(request.getType())) { DirectEditRequest editRequest = (DirectEditRequest) request; TableView table = (TableView) this.getHost().getParent() .getModel(); Word word = (Word) editRequest.getDirectEditFeature(); return new AddWordCommand(table, word, this .getColumnIndex(editRequest)); } else if (ERDiagramTransferDragSourceListener.REQUEST_TYPE_MOVE_COLUMN .equals(request.getType())) { DirectEditRequest editRequest = (DirectEditRequest) request; TableView newTableView = (TableView) this.getHost().getParent() .getModel(); return createMoveColumnCommand(editRequest, this.getHost() .getViewer(), newTableView, this .getColumnIndex(editRequest)); } else if (ERDiagramTransferDragSourceListener.REQUEST_TYPE_MOVE_COLUMN_GROUP .equals(request.getType())) { DirectEditRequest editRequest = (DirectEditRequest) request; TableView newTableView = (TableView) this.getHost().getParent() .getModel(); return createMoveColumnGroupCommand(editRequest, newTableView, this.getColumnIndex(editRequest)); } } catch (Exception e) { Activator.showExceptionDialog(e); } return super.getCommand(request); } public static Command createMoveColumnCommand( DirectEditRequest editRequest, EditPartViewer viewer, TableView newTableView, int index) { NormalColumn oldColumn = (NormalColumn) editRequest .getDirectEditFeature(); TableView oldTableView = (TableView) oldColumn.getColumnHolder(); if (newTableView == oldTableView) { return new ChangeColumnOrderCommand(newTableView, oldColumn, index); } CompoundCommand command = new CompoundCommand(); // �Q�Ƃ��Ă���O���L�[�̕ύX List<Relation> relationList = oldColumn.getOutgoingRelationList(); if (!relationList.isEmpty()) { Activator.showErrorDialog("error.reference.key.not.moveable"); return null; } else if (oldColumn.isForeignKey()) { Relation oldRelation = oldColumn.getRelationList().get(0); TableView referencedTableView = oldRelation.getSourceTableView(); if (ERTable.isRecursive(referencedTableView, newTableView)) { Activator.showErrorDialog("error.recursive.relation"); return null; } DeleteRelationCommand deleteOldRelationCommand = new DeleteRelationCommand( oldRelation, true); command.add(deleteOldRelationCommand); Relation newRelation = new Relation(oldRelation.isReferenceForPK(), oldRelation.getReferencedComplexUniqueKey(), oldRelation .getReferencedColumn()); List<NormalColumn> oldForeignKeyColumnList = new ArrayList<NormalColumn>(); if (referencedTableView == newTableView) { Activator .showErrorDialog("error.foreign.key.not.moveable.to.reference.table"); return null; } if (oldRelation.isReferenceForPK()) { for (NormalColumn referencedPrimaryKey : ((ERTable) referencedTableView) .getPrimaryKeys()) { for (NormalColumn oldTableColumn : oldTableView .getNormalColumns()) { if (oldTableColumn.isForeignKey()) { if (oldTableColumn.getReferencedColumn(oldRelation) == referencedPrimaryKey) { oldForeignKeyColumnList.add(oldTableColumn); break; } } } } } else if (oldRelation.getReferencedComplexUniqueKey() != null) { for (NormalColumn referencedColumn : oldRelation .getReferencedComplexUniqueKey().getColumnList()) { for (NormalColumn oldTableColumn : oldTableView .getNormalColumns()) { if (oldTableColumn.isForeignKey()) { if (oldTableColumn.getReferencedColumn(oldRelation) == referencedColumn) { oldForeignKeyColumnList.add(oldTableColumn); break; } } } } } else { oldForeignKeyColumnList.add(oldColumn); } for (NormalColumn oldForeignKey : oldForeignKeyColumnList) { List<Relation> oldRelationList = oldForeignKey.getOutgoingRelationList(); if (!oldRelationList.isEmpty()) { Activator.showErrorDialog("error.reference.key.not.moveable"); return null; } } CreateRelationCommand createNewRelationCommand = new CreateRelationCommand( newRelation, oldForeignKeyColumnList); EditPart sourceEditPart = (EditPart) viewer.getEditPartRegistry() .get(referencedTableView); EditPart targetEditPart = (EditPart) viewer.getEditPartRegistry() .get(newTableView); createNewRelationCommand.setSource(sourceEditPart); createNewRelationCommand.setTarget(targetEditPart); command.add(createNewRelationCommand); } else { TableView copyOldTableView = oldTableView.copyData(); for (NormalColumn column : copyOldTableView.getNormalColumns()) { CopyColumn copyColumn = (CopyColumn) column; if (copyColumn.getOriginalColumn() == oldColumn) { copyOldTableView.removeColumn(copyColumn); break; } } ChangeTableViewPropertyCommand sourceTableCommand = new ChangeTableViewPropertyCommand( oldTableView, copyOldTableView); command.add(sourceTableCommand); TableView copyNewTableView = newTableView.copyData(); CopyColumn copyColumn = new CopyColumn(oldColumn); copyColumn.setWord(new CopyWord(oldColumn.getWord())); copyNewTableView.addColumn(index, copyColumn); ChangeTableViewPropertyCommand targetTableCommand = new ChangeTableViewPropertyCommand( newTableView, copyNewTableView); command.add(targetTableCommand); } return command.unwrap(); } public static Command createMoveColumnGroupCommand( DirectEditRequest editRequest, TableView newTableView, int index) { ColumnGroup columnGroup = (ColumnGroup) ((Map) editRequest .getDirectEditFeature()) .get(ERDiagramTransferDragSourceListener.MOVE_COLUMN_GROUP_PARAM_GROUP); TableView oldTableView = (TableView) ((Map) editRequest .getDirectEditFeature()) .get(ERDiagramTransferDragSourceListener.MOVE_COLUMN_GROUP_PARAM_PARENT); if (newTableView == oldTableView) { return new ChangeColumnOrderCommand(newTableView, columnGroup, index); } CompoundCommand command = new CompoundCommand(); TableView copyOldTableView = oldTableView.copyData(); for (Column column : copyOldTableView.getColumns()) { if (column == columnGroup) { copyOldTableView.removeColumn(column); break; } } ChangeTableViewPropertyCommand sourceTableCommand = new ChangeTableViewPropertyCommand( oldTableView, copyOldTableView); command.add(sourceTableCommand); if (!newTableView.getColumns().contains(columnGroup)) { command.add(new AddColumnGroupCommand(newTableView, columnGroup, index)); } return command.unwrap(); } private int getColumnIndex(DirectEditRequest editRequest) { ZoomManager zoomManager = ((ScalableFreeformRootEditPart) this .getHost().getRoot()).getZoomManager(); double zoom = zoomManager.getZoom(); ColumnEditPart columnEditPart = (ColumnEditPart) this.getHost(); Column column = (Column) columnEditPart.getModel(); TableView newTableView = (TableView) this.getHost().getParent() .getModel(); List<Column> columns = newTableView.getColumns(); if (column.getColumnHolder() instanceof ColumnGroup) { column = (ColumnGroup) column.getColumnHolder(); } int index = columns.indexOf(column); Rectangle columnRectangle = this.getColumnRectangle(); int center = (int) ((columnRectangle.y + (columnRectangle.height / 2)) * zoom); if (editRequest.getLocation().y >= center) { index++; } return index; } }