/*******************************************************************************
* Copyright (c) 2008 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.smooks.edimap.editor;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.tools.CellEditorLocator;
import org.eclipse.gef.tools.DirectEditManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.graphics.Font;
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.jboss.tools.smooks.gef.tree.model.TreeNodeModel;
import org.jboss.tools.smooks.model.medi.MappingNode;
/**
* @author Dart (dpeng@redhat.com)
*
*/
public class EDIEdiPartDirectEditManager extends DirectEditManager {
Font scaledFont;
protected VerifyListener verifyListener;
protected Label textLabel;
/**
* Creates a new ActivityDirectEditManager with the given attributes.
*
* @param source
* the source EditPart
* @param editorType
* type of editor
* @param locator
* the CellEditorLocator
*/
public EDIEdiPartDirectEditManager(GraphicalEditPart source, Class<?> editorType, CellEditorLocator locator,
Label label) {
super(source, editorType, locator);
textLabel = label;
}
/**
* @see org.eclipse.gef.tools.DirectEditManager#bringDown()
*/
protected void bringDown() {
// This method might be re-entered when super.bringDown() is called.
Font disposeFont = scaledFont;
scaledFont = null;
super.bringDown();
if (disposeFont != null)
disposeFont.dispose();
}
/**
* @see org.eclipse.gef.tools.DirectEditManager#initCellEditor()
*/
protected void initCellEditor() {
Text text = (Text) getCellEditor().getControl();
verifyListener = new VerifyListener() {
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);
Point size = gc.textExtent(leftText + event.text + rightText);
gc.dispose();
if (size.x != 0)
size = text.computeSize(size.x, SWT.DEFAULT);
getCellEditor().getControl().setSize(size.x, size.y);
}
};
text.addVerifyListener(verifyListener);
Object model = this.getEditPart().getModel();
if(model instanceof TreeNodeModel){
model = ((TreeNodeModel)model).getData();
}
String initialLabelText = textLabel.getText();
if(model instanceof MappingNode){
initialLabelText = ((MappingNode)model).getXmltag();
}
if(initialLabelText == null) {
initialLabelText = ""; //$NON-NLS-1$
}
getCellEditor().setValue(initialLabelText);
IFigure figure = getEditPart().getFigure();
scaledFont = figure.getFont();
FontData data = scaledFont.getFontData()[0];
Dimension fontSize = new Dimension(0, data.getHeight());
textLabel.translateToAbsolute(fontSize);
data.setHeight(fontSize.height);
scaledFont = new Font(null, data);
text.setFont(scaledFont);
}
/**
* @see org.eclipse.gef.tools.DirectEditManager#unhookListeners()
*/
protected void unhookListeners() {
super.unhookListeners();
Text text = (Text) getCellEditor().getControl();
text.removeVerifyListener(verifyListener);
verifyListener = null;
}
}