package org.insightech.er.editor.controller.editpart.element.node; import java.beans.PropertyChangeEvent; import java.math.BigDecimal; import java.util.List; import org.eclipse.draw2d.ChopboxAnchor; import org.eclipse.draw2d.ColorConstants; import org.eclipse.draw2d.ConnectionAnchor; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gef.ConnectionEditPart; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.GraphicalEditPart; import org.eclipse.gef.NodeEditPart; import org.eclipse.gef.Request; import org.eclipse.gef.RequestConstants; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.widgets.Display; import org.insightech.er.Activator; import org.insightech.er.Resources; import org.insightech.er.editor.controller.editpart.DeleteableEditPart; import org.insightech.er.editor.controller.editpart.element.AbstractModelEditPart; import org.insightech.er.editor.controller.editpart.element.connection.ERDiagramConnectionEditPart; import org.insightech.er.editor.controller.editpart.element.node.column.ColumnEditPart; import org.insightech.er.editor.controller.editpolicy.element.node.NodeElementGraphicalNodeEditPolicy; import org.insightech.er.editor.model.ViewableModel; import org.insightech.er.editor.model.diagram_contents.element.connection.ConnectionElement; import org.insightech.er.editor.model.diagram_contents.element.node.NodeElement; import org.insightech.er.editor.model.diagram_contents.element.node.category.Category; import org.insightech.er.editor.model.diagram_contents.element.node.note.Note; import org.insightech.er.editor.model.diagram_contents.element.node.table.ERTable; import org.insightech.er.editor.model.settings.Settings; import org.insightech.er.editor.model.tracking.ChangeTrackingList; import org.insightech.er.editor.view.figure.connection.ERDiagramConnection; import org.insightech.er.editor.view.figure.table.TableFigure; import org.insightech.er.util.Check; public abstract class NodeElementEditPart extends AbstractModelEditPart implements NodeEditPart, DeleteableEditPart { private Font font; private Font largeFont; /** * {@inheritDoc} */ @Override public void deactivate() { this.disposeFont(); super.deactivate(); } protected void disposeFont() { if (this.font != null) { this.font.dispose(); } } @Override public void doPropertyChange(PropertyChangeEvent event) { if (event.getPropertyName().equals(NodeElement.PROPERTY_CHANGE_RECTANGLE)) { refreshVisuals(); } else if (event.getPropertyName().equals(ViewableModel.PROPERTY_CHANGE_COLOR)) { refreshVisuals(); } else if (event.getPropertyName().equals(ViewableModel.PROPERTY_CHANGE_FONT)) { this.changeFont(this.figure); refreshVisuals(); // if (getNodeModel().needsUpdateOtherModel()) { // // �S�r���[�̃��t���b�V�� // getNodeModel().getDiagram().refreshAllModel(event, getNodeModel()); // } else { // refreshVisuals(); // } // } else if (event.getPropertyName().equals(NodeElement.PROPERTY_CHANGE_INCOMING)) { refreshTargetConnections(); } else if (event.getPropertyName().equals(NodeElement.PROPERTY_CHANGE_OUTGOING)) { refreshSourceConnections(); } } public NodeElement getNodeModel() { return (NodeElement) super.getModel(); } /** * {@inheritDoc} */ @Override protected void createEditPolicies() { this.installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new NodeElementGraphicalNodeEditPolicy()); } protected void setVisible() { NodeElement element = (NodeElement) this.getModel(); Category category = this.getCurrentCategory(); if (category != null) { this.figure.setVisible(category.isVisible(element, this .getDiagram())); } else { this.figure.setVisible(true); } } protected Font changeFont(IFigure figure) { this.disposeFont(); NodeElement nodeElement = (NodeElement) this.getModel(); String fontName = nodeElement.getFontName(); int fontSize = nodeElement.getFontSize(); if (Check.isEmpty(fontName)) { FontData fontData = Display.getCurrent().getSystemFont() .getFontData()[0]; fontName = fontData.getName(); nodeElement.setFontName(fontName); } if (fontSize <= 0) { fontSize = ViewableModel.DEFAULT_FONT_SIZE; nodeElement.setFontSize(fontSize); } this.font = new Font(Display.getCurrent(), fontName, fontSize, SWT.NORMAL); if (getDiagram().getDiagramContents().getSettings().getTitleFontEm() != null) { int largeFontSize = getDiagram().getDiagramContents().getSettings().getTitleFontEm().multiply(new BigDecimal(nodeElement.getFontSize())).intValue(); this.largeFont = new Font(Display.getCurrent(), fontName, largeFontSize, SWT.NORMAL); } figure.setFont(this.font); if (figure instanceof TableFigure) { ((TableFigure)figure).setLargeFont(this.largeFont); } return font; } /** * {@inheritDoc} */ @Override public void refreshVisuals() { NodeElement element = (NodeElement) this.getModel(); this.setVisible(); Rectangle rectangle = this.getRectangle(); GraphicalEditPart parent = (GraphicalEditPart) this.getParent(); IFigure figure = this.getFigure(); int[] color = element.getColor(); if (color != null) { ChangeTrackingList changeTrackingList = this.getDiagram() .getChangeTrackingList(); if (changeTrackingList.isCalculated() && (element instanceof Note || element instanceof ERTable)) { if (changeTrackingList.isAdded(element)) { figure.setBackgroundColor(Resources.ADDED_COLOR); } else if (changeTrackingList.getUpdatedNodeElement(element) != null) { figure.setBackgroundColor(Resources.UPDATED_COLOR); } else { figure.setBackgroundColor(ColorConstants.white); } } else { Color bgColor = Resources.getColor(color); figure.setBackgroundColor(bgColor); } } parent.setLayoutConstraint(this, figure, rectangle); } public void refreshConnections() { for (Object sourceConnection : this.getSourceConnections()) { ConnectionEditPart editPart = (ConnectionEditPart) sourceConnection; ConnectionElement connectinoElement = (ConnectionElement) editPart .getModel(); connectinoElement.setParentMove(); } for (Object targetConnection : this.getTargetConnections()) { ConnectionEditPart editPart = (ConnectionEditPart) targetConnection; ConnectionElement connectinoElement = (ConnectionElement) editPart .getModel(); connectinoElement.setParentMove(); } } protected Rectangle getRectangle() { NodeElement element = (NodeElement) this.getModel(); Point point = new Point(element.getX(), element.getY()); Dimension dimension = new Dimension(element.getWidth(), element .getHeight()); Dimension minimumSize = this.figure.getMinimumSize(); if (dimension.width != -1 && dimension.width < minimumSize.width) { dimension.width = minimumSize.width; } if (dimension.height != -1 && dimension.height < minimumSize.height) { dimension.height = minimumSize.height; } return new Rectangle(point, dimension); } /** * {@inheritDoc} */ @Override protected List getModelSourceConnections() { NodeElement element = (NodeElement) this.getModel(); return element.getOutgoings(); } /** * {@inheritDoc} */ @Override protected List getModelTargetConnections() { NodeElement element = (NodeElement) this.getModel(); return element.getIncomings(); } public ConnectionAnchor getSourceConnectionAnchor(ConnectionEditPart arg0) { return new ChopboxAnchor(this.getFigure()); } public ConnectionAnchor getSourceConnectionAnchor(Request arg0) { return new ChopboxAnchor(this.getFigure()); } public ConnectionAnchor getTargetConnectionAnchor(ConnectionEditPart arg0) { return new ChopboxAnchor(this.getFigure()); } public ConnectionAnchor getTargetConnectionAnchor(Request arg0) { return new ChopboxAnchor(this.getFigure()); } public void changeSettings(Settings settings) { this.refresh(); for (Object object : this.getSourceConnections()) { ERDiagramConnectionEditPart editPart = (ERDiagramConnectionEditPart) object; ERDiagramConnection connection = (ERDiagramConnection) editPart .getFigure(); connection.setBezier(settings.isUseBezierCurve()); editPart.refresh(); } } public boolean isDeleteable() { return true; } /** * {@inheritDoc} */ @Override public void setSelected(int value) { if (value != 0 && getViewer() != null) { for (Object editPartObject : this.getViewer().getSelectedEditParts()) { if (editPartObject instanceof ColumnEditPart) { ((ColumnEditPart) editPartObject).setSelected(0); } } } super.setSelected(value); } /** * {@inheritDoc} */ @Override public void performRequest(Request request) { if (request.getType().equals(RequestConstants.REQ_OPEN)) { try { performRequestOpen(); } catch (Exception e) { Activator.showExceptionDialog(e); } } super.performRequest(request); } abstract protected void performRequestOpen(); }