/*
* Created on Jul 13, 2004
*/
package com.realpersist.gef.part;
import java.beans.PropertyChangeEvent;
import java.util.List;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.NodeEditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.RequestConstants;
import org.eclipse.gef.requests.DirectEditRequest;
import org.eclipse.gef.tools.DirectEditManager;
import org.eclipse.jface.viewers.TextCellEditor;
import com.realpersist.gef.directedit.ExtendedDirectEditManager;
import com.realpersist.gef.directedit.LabelCellEditorLocator;
import com.realpersist.gef.directedit.TableNameCellEditorValidator;
import com.realpersist.gef.directedit.ValidationMessageHandler;
import com.realpersist.gef.editor.ValidationEnabledGraphicalViewer;
import com.realpersist.gef.figures.EditableLabel;
import com.realpersist.gef.figures.TableFigure;
import com.realpersist.gef.model.Table;
import com.realpersist.gef.part.connector.BottomAnchor;
import com.realpersist.gef.part.connector.TopAnchor;
import com.realpersist.gef.policy.TableContainerEditPolicy;
import com.realpersist.gef.policy.TableDirectEditPolicy;
import com.realpersist.gef.policy.TableEditPolicy;
import com.realpersist.gef.policy.TableLayoutEditPolicy;
import com.realpersist.gef.policy.TableNodeEditPolicy;
/**
* Represents the editable/resizable table which can have columns added,
* removed, renamed etc.
*
* @author Phil Zoio
*/
public class TablePart extends PropertyAwarePart implements NodeEditPart
{
protected DirectEditManager manager;
//******************* Life-cycle related methods *********************/
/**
* @see org.eclipse.gef.EditPart#activate()
*/
public void activate()
{
super.activate();
}
/**
* @see org.eclipse.gef.EditPart#deactivate()
*/
public void deactivate()
{
super.deactivate();
}
//******************* Model related methods *********************/
/**
* Returns the Table model object represented by this EditPart
*/
public Table getTable()
{
return (Table) getModel();
}
/**
* @return the children Model objects as a new ArrayList
*/
protected List getModelChildren()
{
return getTable().getColumns();
}
/**
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getModelSourceConnections()
*/
protected List getModelSourceConnections()
{
return getTable().getForeignKeyRelationships();
}
/**
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getModelTargetConnections()
*/
protected List getModelTargetConnections()
{
return getTable().getPrimaryKeyRelationships();
}
//******************* Editing related methods *********************/
/**
* Creates edit policies and associates these with roles
*/
protected void createEditPolicies()
{
installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new TableNodeEditPolicy());
installEditPolicy(EditPolicy.LAYOUT_ROLE, new TableLayoutEditPolicy());
installEditPolicy(EditPolicy.CONTAINER_ROLE, new TableContainerEditPolicy());
installEditPolicy(EditPolicy.COMPONENT_ROLE, new TableEditPolicy());
installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new TableDirectEditPolicy());
}
//******************* Direct editing related methods *********************/
/**
* @see org.eclipse.gef.EditPart#performRequest(org.eclipse.gef.Request)
*/
public void performRequest(Request request)
{
if (request.getType() == RequestConstants.REQ_DIRECT_EDIT)
{
if (request instanceof DirectEditRequest
&& !directEditHitTest(((DirectEditRequest) request).getLocation().getCopy()))
return;
performDirectEdit();
}
}
private boolean directEditHitTest(Point requestLoc)
{
TableFigure figure = (TableFigure) getFigure();
EditableLabel nameLabel = figure.getNameLabel();
nameLabel.translateToRelative(requestLoc);
if (nameLabel.containsPoint(requestLoc))
return true;
return false;
}
protected void performDirectEdit()
{
if (manager == null)
{
ValidationEnabledGraphicalViewer viewer = (ValidationEnabledGraphicalViewer) getViewer();
ValidationMessageHandler handler = viewer.getValidationHandler();
TableFigure figure = (TableFigure) getFigure();
EditableLabel nameLabel = figure.getNameLabel();
manager = new ExtendedDirectEditManager(this, TextCellEditor.class, new LabelCellEditorLocator(nameLabel),
nameLabel, new TableNameCellEditorValidator(handler));
}
manager.show();
}
/**
* @param handles
* the name change during an edit
*/
public void handleNameChange(String value)
{
TableFigure tableFigure = (TableFigure) getFigure();
EditableLabel label = tableFigure.getNameLabel();
label.setVisible(false);
refreshVisuals();
}
/**
* Reverts to existing name in model when exiting from a direct edit
* (possibly before a commit which will result in a change in the label
* value)
*/
public void revertNameChange()
{
TableFigure tableFigure = (TableFigure) getFigure();
EditableLabel label = tableFigure.getNameLabel();
Table table = getTable();
label.setText(table.getName());
label.setVisible(true);
refreshVisuals();
}
//******************* Miscellaneous stuff *********************/
/**
* @see org.eclipse.gef.editparts.AbstractEditPart#toString()
*/
public String toString()
{
return getModel().toString();
}
//******************* Listener related methods *********************/
/**
* Handles change in name when committing a direct edit
*/
protected void commitNameChange(PropertyChangeEvent evt)
{
TableFigure tableFigure = (TableFigure) getFigure();
EditableLabel label = tableFigure.getNameLabel();
label.setText(getTable().getName());
label.setVisible(true);
refreshVisuals();
}
/**
* handles change in bounds, to be overridden by subclass
*/
protected void handleBoundsChange(PropertyChangeEvent evt)
{
TableFigure tableFigure = (TableFigure) getFigure();
Rectangle constraint = (Rectangle) evt.getNewValue();
SchemaDiagramPart parent = (SchemaDiagramPart) getParent();
parent.setLayoutConstraint(this, tableFigure, constraint);
}
//******************* Layout related methods *********************/
/**
* Creates a figure which represents the table
*/
protected IFigure createFigure()
{
Table table = getTable();
EditableLabel label = new EditableLabel(table.getName());
TableFigure tableFigure = new TableFigure(label);
return tableFigure;
}
/**
* Reset the layout constraint, and revalidate the content pane
*/
protected void refreshVisuals()
{
TableFigure tableFigure = (TableFigure) getFigure();
Point location = tableFigure.getLocation();
SchemaDiagramPart parent = (SchemaDiagramPart) getParent();
Rectangle constraint = new Rectangle(location.x, location.y, -1, -1);
parent.setLayoutConstraint(this, tableFigure, constraint);
}
/**
* @return the Content pane for adding or removing child figures
*/
public IFigure getContentPane()
{
TableFigure figure = (TableFigure) getFigure();
return figure.getColumnsFigure();
}
/**
* @see NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef.ConnectionEditPart)
*/
public ConnectionAnchor getSourceConnectionAnchor(ConnectionEditPart connection)
{
return new TopAnchor(getFigure());
}
/**
* @see org.eclipse.gef.NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef.Request)
*/
public ConnectionAnchor getSourceConnectionAnchor(Request request)
{
return new TopAnchor(getFigure());
}
/**
* @see NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef.ConnectionEditPart)
*/
public ConnectionAnchor getTargetConnectionAnchor(ConnectionEditPart connection)
{
return new BottomAnchor(getFigure());
}
/**
* @see org.eclipse.gef.NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef.Request)
*/
public ConnectionAnchor getTargetConnectionAnchor(Request request)
{
return new BottomAnchor(getFigure());
}
/**
* Sets the width of the line when selected
*/
public void setSelected(int value)
{
super.setSelected(value);
TableFigure tableFigure = (TableFigure) getFigure();
if (value != EditPart.SELECTED_NONE)
tableFigure.setSelected(true);
else
tableFigure.setSelected(false);
tableFigure.repaint();
}
}