/******************************************************************************* * 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.gef.tree.figures; 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 * */ public class TreeNodeTextDirectManager 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 TreeNodeTextDirectManager(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; } }