提交 a54e140c 编写于 作者: S serge-rider

ERD: direct notes editor

Former-commit-id: 6f5c0142
上级 e8347f12
......@@ -18,36 +18,35 @@ package org.jkiss.dbeaver.ext.erd.command;
import org.eclipse.gef.commands.Command;
import org.jkiss.dbeaver.ext.erd.figures.NoteFigure;
import org.jkiss.dbeaver.ext.erd.model.ERDNote;
import org.jkiss.dbeaver.ext.erd.part.NotePart;
/**
* Change note text
*/
public class NoteSetTextCommand extends Command {
private ERDNote note;
private NoteFigure figure;
private NotePart note;
private String newText;
private String oldText;
public NoteSetTextCommand(ERDNote note, NoteFigure figure, String newText) {
public NoteSetTextCommand(NotePart note, String newText) {
super("Set note text");
this.note = note;
this.figure = figure;
this.oldText = this.note.getName();
this.newText = newText;
}
@Override
public void execute() {
note.setObject(newText);
figure.setText(newText);
note.getNote().setObject(newText);
((NoteFigure) note.getFigure()).setText(newText);
}
@Override
public void undo() {
note.setObject(oldText);
figure.setText(oldText);
note.getNote().setObject(oldText);
((NoteFigure) note.getFigure()).setText(oldText);
}
}
\ No newline at end of file
......@@ -36,167 +36,160 @@ import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Text;
import org.jkiss.dbeaver.ext.erd.figures.NoteFigure;
/**
* A generic DirectEdit manager to be used for labels which includes validation
* functionality by adding the ICellEditorValidator on startup
*/
public class ExtendedDirectEditManager extends DirectEditManager
{
Font figureFont;
protected VerifyListener verifyListener;
protected Label label;
protected String originalValue;
private boolean committing = false;
private ICellEditorValidator validator = null;
/**
* Creates a new ActivityDirectEditManager with the given attributes.
*
* @param source
* the source EditPart
* @param editorType
* type of editor
* @param locator
* the CellEditorLocator
*/
public ExtendedDirectEditManager(GraphicalEditPart source, Class editorType, CellEditorLocator locator,
Label label, ICellEditorValidator validator)
{
super(source, editorType, locator);
this.label = label;
this.originalValue = label.getText();
this.validator = validator;
}
/**
* @see org.eclipse.gef.tools.DirectEditManager#bringDown()
*/
@Override
protected void bringDown()
{
Font disposeFont = figureFont;
figureFont = null;
super.bringDown();
if (disposeFont != null)
disposeFont.dispose();
}
/**
* @see org.eclipse.gef.tools.DirectEditManager#initCellEditor()
*/
@Override
protected void initCellEditor()
{
Text text = (Text) getCellEditor().getControl();
//add the verifyListener to apply changes to the control size
verifyListener = new VerifyListener()
{
/**
* Changes the size of the editor control to reflect the changed
* text
*/
@Override
public void verifyText(VerifyEvent event)
{
Text text = (Text) getCellEditor().getControl();
String oldText = text.getText();
String leftText = oldText.substring(0, event.start);
String rightText = oldText.substring(event.end, oldText.length());
GC gc = new GC(text);
if (leftText == null)
leftText = "";
if (rightText == null)
rightText = "";
String s = leftText + event.text + rightText;
Point size = gc.textExtent(leftText + event.text + rightText);
gc.dispose();
if (size.x != 0)
size = text.computeSize(size.x, SWT.DEFAULT);
else
{
//just make it square
size.x = size.y;
}
getCellEditor().getControl().setSize(size.x, size.y);
}
};
text.addVerifyListener(verifyListener);
//set the initial value of the
originalValue = this.label.getText();
getCellEditor().setValue(originalValue);
//calculate the font size of the underlying
IFigure figure = getEditPart().getFigure();
figureFont = figure.getFont();
FontData data = figureFont.getFontData()[0];
Dimension fontSize = new Dimension(0, data.getHeight());
//set the font to be used
this.label.translateToAbsolute(fontSize);
data.setHeight(fontSize.height);
figureFont = new Font(null, data);
//set the validator for the CellEditor
getCellEditor().setValidator(validator);
text.setFont(figureFont);
text.selectAll();
}
/**
* Commits the current value of the cell editor by getting a {@link Command}
* from the source edit part and executing it via the {@link CommandStack}.
* Finally, {@link #bringDown()}is called to perform and necessary cleanup.
*/
@Override
protected void commit()
{
if (committing)
return;
committing = true;
try
{
//we set the cell editor control to invisible to remove any
// possible flicker
getCellEditor().getControl().setVisible(false);
if (isDirty())
{
CommandStack stack = getEditPart().getViewer().getEditDomain().getCommandStack();
Command command = getEditPart().getCommand(getDirectEditRequest());
if (command != null && command.canExecute())
stack.execute(command);
}
}
finally
{
bringDown();
committing = false;
}
}
/**
* Need to override so as to remove the verify listener
*/
@Override
protected void unhookListeners()
{
super.unhookListeners();
Text text = (Text) getCellEditor().getControl();
text.removeVerifyListener(verifyListener);
verifyListener = null;
}
public class ExtendedDirectEditManager extends DirectEditManager {
protected Font figureFont;
protected VerifyListener verifyListener;
protected IFigure figure;
protected String originalValue;
private boolean committing = false;
private ICellEditorValidator validator = null;
/**
* Creates a new ActivityDirectEditManager with the given attributes.
*
* @param source the source EditPart
* @param editorType type of editor
* @param locator the CellEditorLocator
*/
public ExtendedDirectEditManager(GraphicalEditPart source, Class editorType, CellEditorLocator locator,
IFigure figure, ICellEditorValidator validator) {
super(source, editorType, locator);
this.figure = figure;
this.originalValue = getFigureText(figure);
this.validator = validator;
}
private static String getFigureText(IFigure figure) {
if (figure instanceof Label) {
return ((Label) figure).getText();
} else if (figure instanceof NoteFigure) {
return ((NoteFigure) figure).getText();
} else {
return "???";
}
}
/**
* @see org.eclipse.gef.tools.DirectEditManager#bringDown()
*/
@Override
protected void bringDown() {
Font disposeFont = figureFont;
figureFont = null;
super.bringDown();
if (disposeFont != null)
disposeFont.dispose();
}
/**
* @see org.eclipse.gef.tools.DirectEditManager#initCellEditor()
*/
@Override
protected void initCellEditor() {
Text text = (Text) getCellEditor().getControl();
//add the verifyListener to apply changes to the control size
verifyListener = new VerifyListener() {
/**
* Changes the size of the editor control to reflect the changed
* text
*/
@Override
public void verifyText(VerifyEvent event) {
Text text = (Text) getCellEditor().getControl();
String oldText = text.getText();
String leftText = oldText.substring(0, event.start);
String rightText = oldText.substring(event.end, oldText.length());
GC gc = new GC(text);
String s = leftText + event.text + rightText;
Point size = gc.textExtent(leftText + event.text + rightText);
gc.dispose();
if (size.x != 0)
size = text.computeSize(size.x, SWT.DEFAULT);
else {
//just make it square
size.x = size.y;
}
getCellEditor().getControl().setSize(size.x, size.y);
}
};
text.addVerifyListener(verifyListener);
//set the initial value of the
originalValue = getFigureText(this.figure);
getCellEditor().setValue(originalValue);
//calculate the font size of the underlying
IFigure figure = getEditPart().getFigure();
figureFont = figure.getFont();
FontData data = figureFont.getFontData()[0];
Dimension fontSize = new Dimension(0, data.getHeight());
//set the font to be used
this.figure.translateToAbsolute(fontSize);
data.setHeight(fontSize.height);
figureFont = new Font(null, data);
//set the validator for the CellEditor
getCellEditor().setValidator(validator);
text.setFont(figureFont);
text.selectAll();
}
/**
* Commits the current value of the cell editor by getting a {@link Command}
* from the source edit part and executing it via the {@link CommandStack}.
* Finally, {@link #bringDown()}is called to perform and necessary cleanup.
*/
@Override
protected void commit() {
if (committing)
return;
committing = true;
try {
//we set the cell editor control to invisible to remove any
// possible flicker
getCellEditor().getControl().setVisible(false);
if (isDirty()) {
CommandStack stack = getEditPart().getViewer().getEditDomain().getCommandStack();
Command command = getEditPart().getCommand(getDirectEditRequest());
if (command != null && command.canExecute())
stack.execute(command);
}
} finally {
bringDown();
committing = false;
}
}
/**
* Need to override so as to remove the verify listener
*/
@Override
protected void unhookListeners() {
super.unhookListeners();
Text text = (Text) getCellEditor().getControl();
text.removeVerifyListener(verifyListener);
verifyListener = null;
}
}
\ No newline at end of file
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2018 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.directedit;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.draw2d.text.TextFlow;
import org.eclipse.gef.tools.CellEditorLocator;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Text;
/**
* A CellEditorLocator for a specified text flow
*
* @author Serge Rider
*/
public class FigureEditorLocator implements CellEditorLocator {
private IFigure figure;
public FigureEditorLocator(IFigure label) {
this.figure = label;
}
/**
* expands the size of the control by 1 pixel in each direction
*/
@Override
public void relocate(CellEditor celleditor) {
Text text = (Text) celleditor.getControl();
Point pref = text.computeSize(SWT.DEFAULT, SWT.DEFAULT);
Rectangle rect = figure.getBounds().getCopy();
figure.translateToAbsolute(rect);
if (text.getCharCount() > 1)
text.setBounds(rect.x - 1, rect.y - 1, pref.x + 1, pref.y + 1);
else
text.setBounds(rect.x - 1, rect.y - 1, pref.y + 1, pref.y + 1);
}
protected IFigure getFigure() {
return figure;
}
}
\ No newline at end of file
......@@ -54,6 +54,14 @@ public class NoteFigure extends FlowPage {
));
}
public TextFlow getTextFlow() {
return textFlow;
}
public String getText() {
return textFlow.getText();
}
public void setText(String text)
{
textFlow.setText(text);
......
......@@ -17,21 +17,25 @@
package org.jkiss.dbeaver.ext.erd.model;
import org.jkiss.code.NotNull;
import org.jkiss.utils.CommonUtils;
/**
* Simple text note
*/
public class ERDNote extends ERDObject<String> {
public ERDNote(String text)
{
super(text);
public ERDNote(String text) {
super(CommonUtils.notEmpty(text));
}
@NotNull
@Override
public String getName()
{
public String getName() {
return getObject();
}
@Override
public void setObject(String object) {
super.setObject(CommonUtils.notEmpty(object));
}
}
......@@ -19,7 +19,6 @@ package org.jkiss.dbeaver.ext.erd.part;
import org.eclipse.draw2d.ChopboxAnchor;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
......@@ -27,15 +26,18 @@ import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.Request;
import org.eclipse.gef.RequestConstants;
import org.jkiss.dbeaver.ext.erd.ERDMessages;
import org.jkiss.dbeaver.ext.erd.command.EntityAddCommand;
import org.jkiss.dbeaver.ext.erd.command.NoteSetTextCommand;
import org.eclipse.gef.requests.DirectEditRequest;
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.FigureEditorLocator;
import org.jkiss.dbeaver.ext.erd.directedit.ValidationMessageHandler;
import org.jkiss.dbeaver.ext.erd.editor.ERDGraphicalViewer;
import org.jkiss.dbeaver.ext.erd.figures.NoteFigure;
import org.jkiss.dbeaver.ext.erd.model.ERDNote;
import org.jkiss.dbeaver.ext.erd.model.EntityDiagram;
import org.jkiss.dbeaver.ext.erd.policy.NoteEditPolicy;
import org.jkiss.dbeaver.ext.erd.policy.NoteDirectEditPolicy;
import org.jkiss.dbeaver.model.DBPNamedObject;
import org.jkiss.dbeaver.ui.dialogs.EditTextDialog;
import java.beans.PropertyChangeEvent;
......@@ -46,6 +48,8 @@ import java.beans.PropertyChangeEvent;
*/
public class NotePart extends NodePart
{
private DirectEditManager manager;
public NotePart() {
}
......@@ -65,8 +69,8 @@ public class NotePart extends NodePart
//installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new EntityNodeEditPolicy());
//installEditPolicy(EditPolicy.LAYOUT_ROLE, new EntityLayoutEditPolicy());
//installEditPolicy(EditPolicy.CONTAINER_ROLE, new EntityContainerEditPolicy());
installEditPolicy(EditPolicy.COMPONENT_ROLE, new NoteEditPolicy());
//installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new NoteDirectEditPolicy());
//installEditPolicy(EditPolicy.COMPONENT_ROLE, new NoteEditPolicy());
installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new NoteDirectEditPolicy());
//installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new ResizableEditPolicy());
}
......@@ -76,23 +80,45 @@ public class NotePart extends NodePart
public void performRequest(Request request)
{
if (request.getType() == RequestConstants.REQ_OPEN) {
performDirectEdit();
/*
final String newText = EditTextDialog.editText(getViewer().getControl().getShell(), ERDMessages.part_note_title, getNote().getObject());
if (newText != null) {
NoteSetTextCommand command = new NoteSetTextCommand(getNote(), (NoteFigure) getFigure(), newText);
getViewer().getEditDomain().getCommandStack().execute(command);
}
*/
} else if (request.getType() == RequestConstants.REQ_DIRECT_EDIT) {
if (request instanceof DirectEditRequest
&& !directEditHitTest(((DirectEditRequest) request).getLocation().getCopy()))
return;
performDirectEdit();
}
}
//******************* Miscellaneous stuff *********************/
private boolean directEditHitTest(Point requestLoc) {
NoteFigure figure = (NoteFigure) getFigure();
figure.translateToRelative(requestLoc);
return figure.containsPoint(requestLoc);
}
protected void performDirectEdit() {
if (manager == null) {
ERDGraphicalViewer viewer = (ERDGraphicalViewer) getViewer();
ValidationMessageHandler handler = viewer.getValidationHandler();
NoteFigure figure = (NoteFigure) getFigure();
manager = new ExtendedDirectEditManager(this, TextCellEditor.class, new FigureEditorLocator(figure),
figure, value -> null);
}
manager.show();
}
public String toString()
{
return getNote().getObject();
}
//******************* Listener related methods *********************/
public void handleNameChange(String value)
{
NoteFigure noteFigure = (NoteFigure) getFigure();
......@@ -102,7 +128,7 @@ public class NotePart extends NodePart
/**
* 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
* (possibly before a commit which will result in a change in the figure
* value)
*/
public void revertNameChange()
......@@ -131,7 +157,7 @@ public class NotePart extends NodePart
* Creates a figure which represents the table
*/
@Override
protected IFigure createFigure()
protected NoteFigure createFigure()
{
final NoteFigure noteFigure = new NoteFigure(getNote());
EntityDiagram.NodeVisualInfo visualInfo = ((DiagramPart) getParent()).getDiagram().getVisualInfo(getNote(), true);
......
......@@ -23,65 +23,49 @@ import org.eclipse.gef.commands.Command;
import org.eclipse.gef.editpolicies.DirectEditPolicy;
import org.eclipse.gef.requests.DirectEditRequest;
import org.eclipse.jface.viewers.CellEditor;
import org.jkiss.dbeaver.ext.erd.command.NoteSetTextCommand;
import org.jkiss.dbeaver.ext.erd.part.NotePart;
/**
* EditPolicy for the direct editing of table names
*
*
* @author Serge Rider
*/
public class NoteDirectEditPolicy extends DirectEditPolicy
{
public class NoteDirectEditPolicy extends DirectEditPolicy {
private String oldValue;
private String oldValue;
/**
* @see org.eclipse.gef.editpolicies.DirectEditPolicy#getDirectEditCommand(org.eclipse.gef.requests.DirectEditRequest)
*/
@Override
protected Command getDirectEditCommand(DirectEditRequest request)
{
/*
EntityRenameCommand cmd = new EntityRenameCommand();
ERDEntity table = (ERDEntity) getHost().getModel();
cmd.setTable(table);
cmd.setOldName(table.getName());
CellEditor cellEditor = request.getCellEditor();
cmd.setName((String) cellEditor.getValue());
return cmd;
*/
return null;
}
@Override
protected Command getDirectEditCommand(DirectEditRequest request) {
CellEditor cellEditor = request.getCellEditor();
String newNote = (String) cellEditor.getValue();
return new NoteSetTextCommand((NotePart) getHost(), newNote);
}
@Override
protected void showCurrentEditValue(DirectEditRequest request) {
String value = (String) request.getCellEditor().getValue();
NotePart notePart = (NotePart) getHost();
notePart.handleNameChange(value);
}
/**
* @see org.eclipse.gef.editpolicies.DirectEditPolicy#showCurrentEditValue(org.eclipse.gef.requests.DirectEditRequest)
*/
@Override
protected void showCurrentEditValue(DirectEditRequest request)
{
String value = (String) request.getCellEditor().getValue();
NotePart notePart = (NotePart) getHost();
notePart.handleNameChange(value);
}
@Override
protected void storeOldEditValue(DirectEditRequest request) {
@Override
protected void storeOldEditValue(DirectEditRequest request)
{
CellEditor cellEditor = request.getCellEditor();
oldValue = (String) cellEditor.getValue();
}
CellEditor cellEditor = request.getCellEditor();
oldValue = (String) cellEditor.getValue();
}
/**
* @param request
*/
@Override
protected void revertOldEditValue(DirectEditRequest request)
{
CellEditor cellEditor = request.getCellEditor();
cellEditor.setValue(oldValue);
NotePart entityPart = (NotePart) getHost();
entityPart.revertNameChange();
}
/**
* @param request
*/
@Override
protected void revertOldEditValue(DirectEditRequest request) {
CellEditor cellEditor = request.getCellEditor();
cellEditor.setValue(oldValue);
NotePart entityPart = (NotePart) getHost();
entityPart.revertNameChange();
}
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册