/*
* 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 14, 2004
*/
package org.jkiss.dbeaver.ext.erd.part;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.RequestConstants;
import org.eclipse.gef.tools.DirectEditManager;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.jkiss.dbeaver.ext.erd.ERDMessages;
import org.jkiss.dbeaver.ext.erd.directedit.ColumnNameTypeCellEditorValidator;
import org.jkiss.dbeaver.ext.erd.directedit.ExtendedDirectEditManager;
import org.jkiss.dbeaver.ext.erd.directedit.LabelCellEditorLocator;
import org.jkiss.dbeaver.ext.erd.directedit.ValidationMessageHandler;
import org.jkiss.dbeaver.ext.erd.editor.ERDAttributeStyle;
import org.jkiss.dbeaver.ext.erd.editor.ERDGraphicalViewer;
import org.jkiss.dbeaver.ext.erd.figures.AttributeItemFigure;
import org.jkiss.dbeaver.ext.erd.figures.EditableLabel;
import org.jkiss.dbeaver.ext.erd.model.ERDEntityAttribute;
import java.beans.PropertyChangeEvent;
/**
* Represents an editable Column object in the model
* @author Serge Rider
*/
public class AttributePart extends PropertyAwarePart
{
protected DirectEditManager manager;
@Override
public boolean isSelectable() {
return true;
}
/**
* @return the ColumnLabel representing the Column
*/
@Override
protected AttributeItemFigure createFigure()
{
ERDEntityAttribute column = (ERDEntityAttribute) getModel();
AttributeItemFigure attributeFigure = new AttributeItemFigure(column);
DiagramPart diagramPart = (DiagramPart) getParent().getParent();
boolean showNullability = diagramPart.getDiagram().hasAttributeStyle(ERDAttributeStyle.NULLABILITY);
Font columnFont = diagramPart.getNormalFont();
Color columnColor = diagramPart.getContentPane().getForegroundColor();
if (column.isInPrimaryKey()) {
columnFont = diagramPart.getBoldFont();
if (showNullability && !column.getObject().isRequired()) {
columnFont = diagramPart.getBoldItalicFont();
}
/*
if (!column.isInForeignKey()) {
columnFont = diagramPart.getBoldFont();
} else {
columnFont = diagramPart.getBoldItalicFont();
}
*/
} else {
if (showNullability && !column.getObject().isRequired()) {
columnFont = diagramPart.getItalicFont();
}
}
if (column.isInForeignKey()) {
//columnColor = Display.getDefault().getSystemColor(SWT.COLOR_DARK_BLUE);
}
attributeFigure.setFont(columnFont);
attributeFigure.setForegroundColor(columnColor);
return attributeFigure;
}
@Override
public AttributeItemFigure getFigure() {
return (AttributeItemFigure)super.getFigure();
}
/**
* Create EditPolicies for the column label
*/
@Override
protected void createEditPolicies()
{
//installEditPolicy(EditPolicy.COMPONENT_ROLE, new AttributeEditPolicy());
//installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new ColumnDirectEditPolicy());
//installEditPolicy(EditPolicy.LAYOUT_ROLE, null);
}
@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) {
getAttribute().openEditor();
}
}
private boolean directEditHitTest(Point requestLoc)
{
IFigure figure = getFigure();
figure.translateToRelative(requestLoc);
return figure.containsPoint(requestLoc);
}
protected void performDirectEdit()
{
if (manager == null)
{
ERDGraphicalViewer viewer = (ERDGraphicalViewer) getViewer();
ValidationMessageHandler handler = viewer.getValidationHandler();
Label l = getFigure();
ColumnNameTypeCellEditorValidator columnNameTypeCellEditorValidator = new ColumnNameTypeCellEditorValidator(
handler);
manager = new ExtendedDirectEditManager(this, TextCellEditor.class, new LabelCellEditorLocator(l), l,
columnNameTypeCellEditorValidator);
}
manager.show();
}
/**
* Sets the width of the line when selected
*/
@Override
public void setSelected(int value)
{
super.setSelected(value);
EditableLabel columnLabel = getFigure();
if (value != EditPart.SELECTED_NONE)
columnLabel.setSelected(true);
else
columnLabel.setSelected(false);
columnLabel.repaint();
}
public void handleNameChange(String textValue)
{
EditableLabel label = getFigure();
label.setVisible(false);
setSelected(EditPart.SELECTED_NONE);
label.revalidate();
}
/**
* Handles when successfully applying direct edit
*/
@Override
protected void commitNameChange(PropertyChangeEvent evt)
{
AttributeItemFigure label = getFigure();
label.setText(getAttribute().getLabelText());
setSelected(EditPart.SELECTED_PRIMARY);
label.revalidate();
}
/**
* Reverts state back to prior edit state
*/
public void revertNameChange(String oldValue)
{
AttributeItemFigure label = getFigure();
label.setVisible(true);
setSelected(EditPart.SELECTED_PRIMARY);
label.revalidate();
}
/**
* We don't need to explicitly handle refresh visuals because the times when
* this needs to be done it is handled by the table e.g. handleNameChange()
*/
@Override
protected void refreshVisuals()
{
ERDEntityAttribute column = (ERDEntityAttribute) getModel();
getFigure().setText(column.getLabelText());
}
public ERDEntityAttribute getAttribute()
{
return (ERDEntityAttribute) getModel();
}
@Override
public String toString()
{
return ERDMessages.column_ + getAttribute().getLabelText();
}
}