package org.objectstyle.wolips.baseforuiplugins.utils; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.events.ControlListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeColumn; public class WOTextCellEditor extends TextCellEditor { public WOTextCellEditor() { // DO NOTHING } public WOTextCellEditor(Composite parent) { super(parent, ("carbon".equals(SWT.getPlatform()) || "cocoa".equals(SWT.getPlatform())) ? SWT.BORDER | SWT.SINGLE : SWT.SINGLE); } public WOTextCellEditor(Composite parent, int style) { super(parent, ("carbon".equals(SWT.getPlatform()) || "cocoa".equals(SWT.getPlatform())) ? SWT.BORDER | SWT.SINGLE : style); } @Override protected Control createControl(Composite parent) { Text textControl = (Text) super.createControl(parent); if ("carbon".equals(SWT.getPlatform()) || "cocoa".equals(SWT.getPlatform())) { textControl.addControlListener(new ControlListener() { private boolean _moving; private boolean _resizing; public void controlMoved(ControlEvent e) { if (!_moving) { _moving = true; try { Text resizedText = (Text) e.widget; Point location = resizedText.getLocation(); Composite controlParent = resizedText.getParent(); if (controlParent instanceof Tree) { TreeColumn firstColumn = ((Tree) controlParent).getColumn(0); // The first column of a tree lines up differently for some reason -- maybe // the open/close triangle causes it to move. I don't see any API to // determine what column this editor is editing, so this lame hack is // checking to see if our initial x position is less than the width of the // first column. if (resizedText.getBounds().x < firstColumn.getWidth()) { if (((Tree)controlParent).getColumnCount() == 1) { resizedText.setLocation(location.x - 3, location.y - 2); } else { resizedText.setLocation(location.x - 5, location.y - 2); } } else { resizedText.setLocation(location.x - 5, location.y - 2); } } else { resizedText.setLocation(location.x - 5, location.y - 2); } } finally { _moving = false; } } } public void controlResized(ControlEvent e) { if (!_resizing) { _resizing = true; try { Text resizedText = (Text) e.widget; Point size = resizedText.getSize(); Composite controlParent = resizedText.getParent(); if (controlParent instanceof Tree) { TreeColumn firstColumn = ((Tree) controlParent).getColumn(0); // The first column of a tree lines up differently for some reason -- maybe // the open/close triangle causes it to move. I don't see any API to // determine what column this editor is editing, so this lame hack is // checking to see if our initial x position is less than the width of the // first column. if (resizedText.getBounds().x < firstColumn.getWidth()) { if (((Tree)controlParent).getColumnCount() == 1) { resizedText.setSize(size.x + 5, size.y + 4); } else { resizedText.setSize(size.x + 5, size.y + 6); } } else { resizedText.setSize(size.x + 5, size.y + 6); } } else { resizedText.setSize(size.x + 5, size.y + 6); } } finally { _resizing = false; } } } }); } return textControl; } public Text getText() { return text; } }