/*******************************************************************************
* 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.mongodb.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.mongodb.erd.core.figures.ColumnFigure;
import com.hangum.tadpole.mongodb.erd.core.figures.SubTableFigure;
import com.hangum.tadpole.mongodb.erd.core.figures.TableFigure;
import com.hangum.tadpole.mongodb.erd.core.figures.TableFigure.COLUMN_TYPE;
import com.hangum.tadpole.mongodb.erd.core.policies.TableComponentEditPolicy;
import com.hangum.tadpole.mongodb.model.Column;
import com.hangum.tadpole.mongodb.model.Table;
/**
* table edit part
*
* @author hangum
*
*/
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());
}
@Override
protected void refreshVisuals() {
Table tableModel = (Table)getModel();
DBEditPart parent = (DBEditPart)getParent();
super.refreshVisuals();
updateFigure((TableFigure)getFigure());
refreshChildren();
parent.setLayoutConstraint(this, figure, tableModel.getConstraints());
}
private void updateFigure(TableFigure tableFigure) {
Table tableModel = (Table)getModel();
tableFigure.setTableName(tableModel.getName());
tableFigure.removeAllColumns();
EList<Column> columns = tableModel.getColumns();
for (Column column : columns) {
if("BasicDBObject".equals(column.getType())) {
addSubDocument(tableFigure, column);
} else {
addColumnFigure(tableFigure, column);
}
}
}
/**
* Add sub document and column
*
* @param parentTableFigure
* @param columnParent
*/
private void addSubDocument(TableFigure parentTableFigure, Column columnParent) {
SubTableFigure subDocFigure = new SubTableFigure();
subDocFigure.setTableName(columnParent.getField());
EList<Column> sucColumns = columnParent.getSubDoc();
for (Column column : sucColumns) {
if("BasicDBObject".equals(column.getType())) {
addSubDocument(subDocFigure, column);
} else {
addColumnFigure(subDocFigure, column);
}
}
parentTableFigure.add(subDocFigure);
}
/**
* create column figure
*
* @param tableFigure
* @param model
*/
private void addColumnFigure(TableFigure tableFigure, Column model){
ColumnFigure labelKey = new ColumnFigure(COLUMN_TYPE.KEY);
labelKey.setText(StringUtils.substring(model.getKey(), 0, 1));
ColumnFigure labelName = new ColumnFigure(COLUMN_TYPE.NAME);
labelName.setText(model.getField());
ColumnFigure labelType = new ColumnFigure(COLUMN_TYPE.TYPE);
labelType.setText(model.getType());
tableFigure.add(labelKey);
tableFigure.add(labelName);
tableFigure.add(labelType);
}
@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) {
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);
}
}
}