/******************************************************************************* * Copyright (c) 2013 hangum. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v2.1 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * * Contributors: * hangum - initial API and implementation ******************************************************************************/ package com.hangum.tadpole.rdb.erd.core.part; import java.util.List; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.eclipse.draw2d.ConnectionAnchor; import org.eclipse.draw2d.IFigure; import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.Notifier; import org.eclipse.emf.common.util.EList; import org.eclipse.gef.ConnectionEditPart; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.NodeEditPart; import org.eclipse.gef.Request; import org.eclipse.gef.editparts.AbstractGraphicalEditPart; import com.hangum.tadpole.engine.define.DBDefine; import com.hangum.tadpole.rdb.erd.core.figures.ColumnFigure; import com.hangum.tadpole.rdb.erd.core.figures.TableFigure; import com.hangum.tadpole.rdb.erd.core.figures.TableFigure.COLUMN_TYPE; import com.hangum.tadpole.rdb.erd.core.policies.TableComponentEditPolicy; import com.hangum.tadpole.rdb.model.Column; import com.hangum.tadpole.rdb.model.DB; import com.hangum.tadpole.rdb.model.Style; import com.hangum.tadpole.rdb.model.Table; public class TableEditPart extends AbstractGraphicalEditPart implements NodeEditPart { private static final Logger logger = Logger.getLogger(TableEditPart.class); private TableAdapter adapter; public TableEditPart() { super(); adapter = new TableAdapter(); } @Override protected IFigure createFigure() { TableFigure tf = new TableFigure(); updateFigure(tf); return tf; } @Override protected void createEditPolicies() { // installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new RelationNodeEditPolicy()); installEditPolicy(EditPolicy.COMPONENT_ROLE, new TableComponentEditPolicy()); } /* * SELECT 스트립트를 에디터에 보여주면 좋겠다. */ // @Override // public void performRequest(Request req) { // if(req.getType() == RequestConstants.REQ_OPEN) { // Table tableModel = (Table)getModel(); // } // } @Override protected void refreshVisuals() { Table table = (Table)getModel(); DBEditPart parent = (DBEditPart)getParent(); super.refreshVisuals(); updateFigure((TableFigure)getFigure()); refreshChildren(); parent.setLayoutConstraint(this, figure, table.getConstraints()); } private void updateFigure(TableFigure figure) { Table tableModel = (Table)getModel(); DB db = tableModel.getDb(); if(db == null) { figure.removeAllColumns(); } else { Style style = db.getStyle(); String strTableTitle = style.getTableTitle(); if(db.getDbType().startsWith(DBDefine.SQLite_DEFAULT.toString())) { figure.setTableName(tableModel.getName() ); } else { if("name".equals(strTableTitle)) figure.setTableName(tableModel.getName() ); else if("comment".equals(strTableTitle)) figure.setTableName(tableModel.getComment()); else { if("".equals(tableModel.getComment())) { figure.setTableName(tableModel.getName() ); } else { figure.setTableName(tableModel.getName() + "(" + tableModel.getComment() + ")"); } } } figure.removeAllColumns(); // 모든 컬럼을 보여 주지 않아야 하는지 .. boolean isShowColumn = "NO".equals(style.getColumnPrimaryKey()) & "NO".equals(style.getColumnName()) & "NO".equals(style.getColumnComment()) & "NO".equals(style.getColumnType()) & "NO".equals(style.getColumnNullCheck()); if(!isShowColumn) { EList<Column> columns = tableModel.getColumns(); for (Column column : columns) { ColumnFigure[] figures = createColumnFigure(tableModel, column); if("YES".equals(style.getColumnPrimaryKey())) figure.add(figures[0]); if("YES".equals(style.getColumnName())) figure.add(figures[1]); if("YES".equals(style.getColumnComment())) figure.add(figures[2]); if("YES".equals(style.getColumnType())) figure.add(figures[3]); if("YES".equals(style.getColumnNullCheck())) figure.add(figures[4]); } } } } private ColumnFigure[] createColumnFigure(Table tableModel, Column model){ ColumnFigure labelKey = new ColumnFigure(COLUMN_TYPE.KEY); ColumnFigure labelName = new ColumnFigure(COLUMN_TYPE.NAME); ColumnFigure labelComment = new ColumnFigure(COLUMN_TYPE.COMMENT); ColumnFigure labelType = new ColumnFigure(COLUMN_TYPE.TYPE); ColumnFigure labelNotNull = new ColumnFigure(COLUMN_TYPE.NULL); labelKey.setText( StringUtils.substring(model.getKey(), 0, 1)); labelName.setText(model.getField()); labelComment.setText(model.getComment()); labelType.setText(model.getType()); labelNotNull.setText(StringUtils.substring(model.getNull(), 0, 1)); return new ColumnFigure[]{labelKey, labelName, labelComment, labelType, labelNotNull}; } @Override protected List getModelSourceConnections() { Table model = (Table)getModel(); return model.getOutgoingLinks(); } @Override protected List getModelTargetConnections() { Table model = (Table)getModel(); return model.getIncomingLinks(); } @Override public void activate() { if(!isActive()) { ((Table)getModel()).eAdapters().add(adapter); } super.activate(); } @Override public void deactivate() { if(isActive()) { ((Table)getModel()).eAdapters().remove(adapter); } super.deactivate(); } @Override public ConnectionAnchor getSourceConnectionAnchor(ConnectionEditPart connection) { return ((TableFigure)getFigure()).getConnectionAnchor(); } @Override public ConnectionAnchor getTargetConnectionAnchor(ConnectionEditPart connection) { return ((TableFigure)getFigure()).getConnectionAnchor(); } @Override public ConnectionAnchor getSourceConnectionAnchor(Request request) { return ((TableFigure)getFigure()).getConnectionAnchor(); } @Override public ConnectionAnchor getTargetConnectionAnchor(Request request) { return ((TableFigure)getFigure()).getConnectionAnchor(); } public class TableAdapter implements Adapter { @Override public void notifyChanged(Notification notification) { // Table tableModel = (Table)getModel(); // logger.debug("\t\t ######################## [table] " + tableModel.getName()); refreshVisuals(); refreshSourceConnections(); refreshTargetConnections(); } @Override public Notifier getTarget() { return (Table)getModel(); } @Override public void setTarget(Notifier newTarget) { } @Override public boolean isAdapterForType(Object type) { return type.equals(Table.class); } } }