/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* Created on Jul 13, 2004
*/
package org.jkiss.dbeaver.ext.erd.part;
import org.eclipse.draw2d.ChopboxAnchor;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.*;
import org.eclipse.gef.tools.DirectEditManager;
import org.eclipse.jface.viewers.TextCellEditor;
import org.jkiss.dbeaver.ext.erd.directedit.ExtendedDirectEditManager;
import org.jkiss.dbeaver.ext.erd.directedit.LabelCellEditorLocator;
import org.jkiss.dbeaver.ext.erd.directedit.TableNameCellEditorValidator;
import org.jkiss.dbeaver.ext.erd.directedit.ValidationMessageHandler;
import org.jkiss.dbeaver.ext.erd.editor.ERDGraphicalViewer;
import org.jkiss.dbeaver.ext.erd.figures.EditableLabel;
import org.jkiss.dbeaver.ext.erd.figures.EntityFigure;
import org.jkiss.dbeaver.ext.erd.model.ERDAssociation;
import org.jkiss.dbeaver.ext.erd.model.ERDEntity;
import org.jkiss.dbeaver.ext.erd.model.ERDEntityAttribute;
import org.jkiss.dbeaver.ext.erd.model.EntityDiagram;
import org.jkiss.dbeaver.ext.erd.policy.EntityContainerEditPolicy;
import org.jkiss.dbeaver.ext.erd.policy.EntityEditPolicy;
import org.jkiss.dbeaver.ext.erd.policy.EntityNodeEditPolicy;
import org.jkiss.dbeaver.model.DBPEvaluationContext;
import org.jkiss.dbeaver.model.DBUtils;
import java.beans.PropertyChangeEvent;
import java.util.List;
/**
* Represents the editable/resizable table which can have columns added,
* removed, renamed etc.
*
* @author Serge Rider
*/
public class EntityPart extends NodePart
{
protected DirectEditManager manager;
public EntityPart()
{
}
/**
* Returns the Table model object represented by this EditPart
*/
public ERDEntity getTable()
{
return (ERDEntity) getModel();
}
/**
* @return the children Model objects as a new ArrayList
*/
@Override
protected List<ERDEntityAttribute> getModelChildren()
{
return getTable().getColumns();
}
@Override
protected List<ERDAssociation> getModelSourceConnections()
{
return getTable().getForeignKeyRelationships();
}
@Override
protected List<ERDAssociation> getModelTargetConnections()
{
return getTable().getPrimaryKeyRelationships();
}
//******************* Editing related methods *********************/
/**
* Creates edit policies and associates these with roles
*/
@Override
protected void createEditPolicies()
{
final boolean editEnabled = isEditEnabled();
if (editEnabled) {
installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new EntityNodeEditPolicy());
//installEditPolicy(EditPolicy.LAYOUT_ROLE, new EntityLayoutEditPolicy());
installEditPolicy(EditPolicy.CONTAINER_ROLE, new EntityContainerEditPolicy());
installEditPolicy(EditPolicy.COMPONENT_ROLE, new EntityEditPolicy());
//installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new EntityDirectEditPolicy());
}
}
//******************* Direct editing related methods *********************/
/**
* @see org.eclipse.gef.EditPart#performRequest(org.eclipse.gef.Request)
*/
@Override
public void performRequest(Request request)
{
if (request.getType() == RequestConstants.REQ_DIRECT_EDIT)
{
/*
if (request instanceof DirectEditRequest
&& !directEditHitTest(((DirectEditRequest) request).getLocation().getCopy()))
return;
performDirectEdit();
*/
} else if (request.getType() == RequestConstants.REQ_OPEN) {
getTable().openEditor();
}
}
private boolean directEditHitTest(Point requestLoc)
{
EntityFigure figure = getFigure();
EditableLabel nameLabel = figure.getNameLabel();
nameLabel.translateToRelative(requestLoc);
return nameLabel.containsPoint(requestLoc);
}
protected void performDirectEdit()
{
if (manager == null)
{
ERDGraphicalViewer viewer = getViewer();
ValidationMessageHandler handler = viewer.getValidationHandler();
EntityFigure figure = getFigure();
EditableLabel nameLabel = figure.getNameLabel();
manager = new ExtendedDirectEditManager(this, TextCellEditor.class, new LabelCellEditorLocator(nameLabel),
nameLabel, new TableNameCellEditorValidator(handler));
}
manager.show();
}
public void handleNameChange(String value)
{
EntityFigure entityFigure = getFigure();
EditableLabel label = entityFigure.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()
{
EntityFigure entityFigure = getFigure();
EditableLabel label = entityFigure.getNameLabel();
ERDEntity entity = getTable();
label.setText(entity.getObject().getName());
label.setVisible(true);
refreshVisuals();
}
//******************* Miscellaneous stuff *********************/
public String toString()
{
return DBUtils.getObjectFullName(getTable().getObject(), DBPEvaluationContext.UI);
}
//******************* Listener related methods *********************/
/**
* Handles change in name when committing a direct edit
*/
@Override
protected void commitNameChange(PropertyChangeEvent evt)
{
EntityFigure entityFigure = getFigure();
EditableLabel label = entityFigure.getNameLabel();
label.setText(getTable().getObject().getName());
label.setVisible(true);
refreshVisuals();
}
//******************* Layout related methods *********************/
/**
* Creates a figure which represents the table
*/
@Override
protected EntityFigure createFigure()
{
final EntityFigure figure = new EntityFigure(getTable());
final EntityDiagram diagram = ((DiagramPart) getParent()).getDiagram();
Rectangle bounds = diagram.getInitBounds(getTable());
if (bounds != null) {
figure.setLocation(bounds.getLocation());
}
return figure;
}
@Override
public EntityFigure getFigure() {
return (EntityFigure)super.getFigure();
}
/**
* Reset the layout constraint, and revalidate the content pane
*/
@Override
protected void refreshVisuals()
{
EntityFigure entityFigure = getFigure();
Point location = entityFigure.getLocation();
DiagramPart parent = (DiagramPart) getParent();
Rectangle constraint = new Rectangle(location.x, location.y, -1, -1);
parent.setLayoutConstraint(this, entityFigure, constraint);
}
/**
* @return the Content pane for adding or removing child figures
*/
@Override
public EntityFigure getContentPane()
{
// EntityFigure figure = (EntityFigure) getFigure();
// return figure.getColumnsFigure();
return getFigure();
}
@Override
public ConnectionAnchor getSourceConnectionAnchor(ConnectionEditPart connection)
{
return new ChopboxAnchor(getFigure());
}
@Override
public ConnectionAnchor getSourceConnectionAnchor(Request request)
{
return new ChopboxAnchor(getFigure());
//return new TopAnchor(getFigure());
}
@Override
public ConnectionAnchor getTargetConnectionAnchor(ConnectionEditPart connection)
{
return new ChopboxAnchor(getFigure());
//return new BottomAnchor(getFigure());
}
@Override
public ConnectionAnchor getTargetConnectionAnchor(Request request)
{
return new ChopboxAnchor(getFigure());
}
/**
* Sets the width of the line when selected
*/
@Override
public void setSelected(int value)
{
super.setSelected(value);
EntityFigure entityFigure = getFigure();
if (value != EditPart.SELECTED_NONE)
entityFigure.setSelected(true);
else
entityFigure.setSelected(false);
entityFigure.repaint();
}
public AssociationPart getConnectionPart(ERDAssociation rel, boolean source)
{
for (Object conn : source ? getSourceConnections() : getTargetConnections()) {
if (conn instanceof AssociationPart && ((AssociationPart) conn).getAssociation() == rel) {
return (AssociationPart) conn;
}
}
return null;
}
@Override
public ERDGraphicalViewer getViewer() {
return (ERDGraphicalViewer)super.getViewer();
}
@Override
public void activate()
{
super.activate();
getViewer().handleTableActivate(getTable().getObject());
}
@Override
public void deactivate()
{
getViewer().handleTableDeactivate(getTable().getObject());
super.deactivate();
}
@Override
protected void finalize() throws Throwable
{
super.finalize();
}
}