1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
\r
3 * in Industry THTH ry.
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.modeling.ui.diagramEditor;
\r
14 import java.util.ArrayList;
\r
15 import java.util.Collection;
\r
16 import java.util.Collections;
\r
17 import java.util.Set;
\r
19 import org.eclipse.jface.layout.GridDataFactory;
\r
20 import org.eclipse.jface.layout.GridLayoutFactory;
\r
21 import org.eclipse.jface.viewers.CellLabelProvider;
\r
22 import org.eclipse.jface.viewers.CheckStateChangedEvent;
\r
23 import org.eclipse.jface.viewers.CheckboxTreeViewer;
\r
24 import org.eclipse.jface.viewers.ICheckStateListener;
\r
25 import org.eclipse.jface.viewers.ICheckStateProvider;
\r
26 import org.eclipse.jface.viewers.ISelection;
\r
27 import org.eclipse.jface.viewers.ISelectionChangedListener;
\r
28 import org.eclipse.jface.viewers.ITreeContentProvider;
\r
29 import org.eclipse.jface.viewers.SelectionChangedEvent;
\r
30 import org.eclipse.jface.viewers.TreeViewer;
\r
31 import org.eclipse.jface.viewers.Viewer;
\r
32 import org.eclipse.jface.viewers.ViewerCell;
\r
33 import org.eclipse.swt.SWT;
\r
34 import org.eclipse.swt.custom.TreeEditor;
\r
35 import org.eclipse.swt.events.KeyAdapter;
\r
36 import org.eclipse.swt.events.KeyEvent;
\r
37 import org.eclipse.swt.events.SelectionEvent;
\r
38 import org.eclipse.swt.events.SelectionListener;
\r
39 import org.eclipse.swt.graphics.Color;
\r
40 import org.eclipse.swt.graphics.GC;
\r
41 import org.eclipse.swt.graphics.Point;
\r
42 import org.eclipse.swt.graphics.Rectangle;
\r
43 import org.eclipse.swt.widgets.Button;
\r
44 import org.eclipse.swt.widgets.Composite;
\r
45 import org.eclipse.swt.widgets.Control;
\r
46 import org.eclipse.swt.widgets.Event;
\r
47 import org.eclipse.swt.widgets.Listener;
\r
48 import org.eclipse.swt.widgets.Text;
\r
49 import org.eclipse.swt.widgets.Tree;
\r
50 import org.eclipse.swt.widgets.TreeColumn;
\r
51 import org.eclipse.swt.widgets.TreeItem;
\r
52 import org.eclipse.ui.part.Page;
\r
53 import org.simantics.diagram.layer.ILayersViewPage;
\r
54 import org.simantics.g2d.canvas.ICanvasContext;
\r
55 import org.simantics.g2d.diagram.DiagramHints;
\r
56 import org.simantics.g2d.diagram.IDiagram;
\r
57 import org.simantics.g2d.diagram.participant.Selection;
\r
58 import org.simantics.g2d.element.ElementClass;
\r
59 import org.simantics.g2d.element.IElement;
\r
60 import org.simantics.g2d.element.handler.ElementLayers;
\r
61 import org.simantics.g2d.layers.IEditableLayer;
\r
62 import org.simantics.g2d.layers.ILayer;
\r
63 import org.simantics.g2d.layers.ILayers;
\r
64 import org.simantics.g2d.layers.ILayersEditor;
\r
65 import org.simantics.g2d.layers.SimpleLayer;
\r
66 import org.simantics.g2d.layers.ILayersEditor.ILayersEditorListener;
\r
67 import org.simantics.utils.datastructures.Arrays;
\r
68 import org.simantics.utils.datastructures.hints.HintListenerAdapter;
\r
69 import org.simantics.utils.datastructures.hints.IHintListener;
\r
70 import org.simantics.utils.datastructures.hints.IHintObservable;
\r
71 import org.simantics.utils.datastructures.hints.IHintContext.Key;
\r
72 import org.simantics.utils.ui.ISelectionUtils;
\r
74 public class DiagramLayersPage extends Page implements ILayersViewPage {
\r
76 private static final String TEXT_APPLY_FOCUS_SETTINGS = "Focus Active";
\r
77 private static final String TOOLTIP_APPLY_FOCUS_SETTINGS = "Only Focus Diagram Elements For Active Roles";
\r
78 private static final String TEXT_IGNORE_FOCUS_SETTINGS = "Focus All";
\r
79 private static final String TOOLTIP_IGNORE_FOCUS_SETTINGS = "Focus All Diagram Elements Regardless Of Active Roles";
\r
81 private static final String TEXT_APPLY_VISIBILITY_SETTINGS = "Show Active";
\r
82 private static final String TOOLTIP_APPLY_VISIBILITY_SETTINGS = "Only Show Diagram Elements For Active Roles";
\r
83 private static final String TEXT_IGNORE_VISIBILITY_SETTINGS = "Show All";
\r
84 private static final String TOOLTIP_IGNORE_VISIBILITY_SETTINGS = "Show All Diagram Elements Regardless Of Active Roles";
\r
86 final private ICanvasContext context;
\r
87 final private IDiagram diagram;
\r
88 private CheckboxTreeViewer viewer;
\r
89 private Composite composite;
\r
90 private TreeEditor editor;
\r
92 private Collection<IElement> elements = Collections.emptySet();
\r
104 static Tristate to(Boolean b) {
\r
105 return b == null ? null : b ? True : False;
\r
107 boolean toBoolean() {
\r
110 throw new IllegalStateException("cannot convert Tristate Both to boolean");
\r
119 Tristate toggle() {
\r
130 Tristate merge(Tristate state) {
\r
157 Boolean getAttribute(IElement e, ILayer layer, Attribute attribute) {
\r
158 ElementClass ec = e.getElementClass();
\r
159 for (ElementLayers el : ec.getItemsByClass(ElementLayers.class)) {
\r
160 switch (attribute) {
\r
162 return Boolean.valueOf(el.isVisible(e, layer));
\r
164 return Boolean.valueOf(el.isFocusable(e, layer));
\r
170 boolean setAttribute(IElement e, ILayer layer, Attribute attribute, boolean value) {
\r
171 ElementClass ec = e.getElementClass();
\r
172 for (ElementLayers el : ec.getItemsByClass(ElementLayers.class)) {
\r
173 switch (attribute) {
\r
175 return el.setVisibility(e, layer, value);
\r
177 return el.setFocusability(e, layer, value);
\r
183 Tristate getJointAttribute(Collection<IElement> elements, ILayer layer, Attribute attribute) {
\r
184 Tristate state = null;
\r
185 for (IElement e : elements) {
\r
186 Boolean attr = getAttribute(e, layer, attribute);
\r
190 if (state == null) {
\r
191 state = Tristate.to(attr);
\r
193 state = state.merge(Tristate.to(attr));
\r
199 int setAttribute(Collection<IElement> elements, ILayer layer, Attribute attribute, boolean value) {
\r
201 for (IElement e : elements) {
\r
202 if (setAttribute(e, layer, attribute, value))
\r
209 final private IHintListener selectionListener = new HintListenerAdapter() {
\r
212 public void hintChanged(IHintObservable sender, Key key, Object oldValue, Object newValue) {
\r
213 Collection<IElement> es = Collections.emptySet();
\r
214 if (newValue instanceof Collection<?>) {
\r
215 Collection<?> coll = (Collection<?>)newValue;
\r
216 es = new ArrayList<IElement>(coll.size());
\r
217 for (Object o : coll) {
\r
218 if (!(o instanceof IElement))
\r
220 es.add((IElement) o);
\r
223 es = Collections.emptySet();
\r
229 private void redraw() {
\r
230 viewer.getControl().getDisplay().asyncExec(new Runnable() {
\r
232 public void run() {
\r
233 if (viewer.getControl().isDisposed())
\r
235 viewer.getControl().redraw();
\r
241 public DiagramLayersPage(IDiagram diagram, ICanvasContext context) {
\r
243 assert(diagram != null);
\r
245 this.diagram = diagram;
\r
246 this.context = context;
\r
248 context.getDefaultHintContext().addKeyHintListener(Selection.SELECTION0, selectionListener);
\r
252 public void dispose() {
\r
254 context.getDefaultHintContext().removeKeyHintListener(Selection.SELECTION0, selectionListener);
\r
261 public void createControl(Composite parent) {
\r
263 final ILayersEditor layers = diagram.getHint(DiagramHints.KEY_LAYERS_EDITOR);
\r
264 layers.addListener(new ILayersEditorListener() {
\r
267 public void layerRemoved(ILayer layer) {
\r
272 public void layerAdded(ILayer layer) {
\r
277 public void layerActivated(ILayer layer) {
\r
282 public void layerDeactivated(ILayer layer) {
\r
287 public void ignoreFocusChanged(boolean value) {
\r
291 public void ignoreVisibilityChanged(boolean value) {
\r
294 void scheduleRefresh() {
\r
295 viewer.getControl().getDisplay().asyncExec(new Runnable() {
\r
297 public void run() {
\r
304 composite = new Composite(parent, SWT.NONE);
\r
305 GridLayoutFactory.fillDefaults().numColumns(4).applyTo(composite);
\r
307 Button addButton = new Button(composite, SWT.NONE);
\r
308 addButton.setText("New");
\r
309 addButton.setToolTipText("Create New Diagram Role");
\r
310 addButton.addSelectionListener(new SelectionListener() {
\r
312 String findFreshName(ILayers layers, String proposal) {
\r
313 Set<ILayer> all = layers.getLayers();
\r
314 String name = proposal;
\r
317 boolean match = false;
\r
318 for (ILayer layer : all) {
\r
319 if (name.equals(layer.getName())) {
\r
327 name = proposal + " " + i;
\r
332 public void widgetSelected(SelectionEvent e) {
\r
333 String name = findFreshName(layers, "New Role");
\r
334 SimpleLayer layer = new SimpleLayer(name);
\r
335 layers.addLayer(layer);
\r
336 layers.activate(layer);
\r
340 public void widgetDefaultSelected(SelectionEvent e) {
\r
346 final Button removeButton = new Button(composite, SWT.NONE);
\r
347 removeButton.setText("Remove");
\r
348 removeButton.setToolTipText("Remove Selected Diagram Role");
\r
349 removeButton.addSelectionListener(new SelectionListener() {
\r
351 public void widgetSelected(SelectionEvent e) {
\r
352 TreeItem[] items = viewer.getTree().getSelection();
\r
353 if (items.length == 0)
\r
356 TreeItem[] all = viewer.getTree().getItems();
\r
357 int firstIndex = Arrays.indexOf(all, items[0]);
\r
358 for (TreeItem item : items) {
\r
359 int index = Arrays.indexOf(all, item);
\r
361 ILayer layer = (ILayer)item.getData();
\r
362 layers.removeLayer(layer);
\r
364 int selectIndex = firstIndex - 1;
\r
365 if (firstIndex == 0) {
\r
366 for (int i = firstIndex; i < all.length; ++i)
\r
367 if (all[i] != null) {
\r
372 if (selectIndex >= 0) {
\r
373 viewer.getTree().select(all[selectIndex]);
\r
378 public void widgetDefaultSelected(SelectionEvent e) {
\r
383 String ignoreVisibilityText = TEXT_IGNORE_VISIBILITY_SETTINGS;
\r
384 String ignoreVisibilityTooltip = TOOLTIP_IGNORE_VISIBILITY_SETTINGS;
\r
385 boolean ignoreVisibility = layers.getIgnoreVisibilitySettings();
\r
386 if (ignoreVisibility) {
\r
387 ignoreVisibilityText = TEXT_APPLY_VISIBILITY_SETTINGS;
\r
388 ignoreVisibilityTooltip = TOOLTIP_APPLY_VISIBILITY_SETTINGS;
\r
391 final Button ignoreVisibilityButton = new Button(composite, SWT.NONE);
\r
392 ignoreVisibilityButton.setText(ignoreVisibilityText);
\r
393 ignoreVisibilityButton.setToolTipText(ignoreVisibilityTooltip);
\r
394 ignoreVisibilityButton.addSelectionListener(new SelectionListener() {
\r
397 public void widgetSelected(SelectionEvent e) {
\r
398 String ignoreText = TEXT_IGNORE_VISIBILITY_SETTINGS;
\r
399 String ignoreTooltip= TOOLTIP_IGNORE_VISIBILITY_SETTINGS;
\r
400 boolean ignore = layers.getIgnoreVisibilitySettings();
\r
402 ignoreText = TEXT_APPLY_VISIBILITY_SETTINGS;
\r
403 ignoreTooltip = TOOLTIP_APPLY_VISIBILITY_SETTINGS;
\r
404 layers.setIgnoreVisibilitySettings(true);
\r
406 layers.setIgnoreVisibilitySettings(false);
\r
408 ignoreVisibilityButton.setText(ignoreText);
\r
409 ignoreVisibilityButton.setToolTipText(ignoreTooltip);
\r
410 composite.layout();
\r
411 context.getThreadAccess().asyncExec(new Runnable() {
\r
414 public void run() {
\r
415 if(context.isDisposed()) return;
\r
416 context.getContentContext().setDirty();
\r
423 public void widgetDefaultSelected(SelectionEvent e) {
\r
429 String ignoreFocusText = TEXT_IGNORE_FOCUS_SETTINGS;
\r
430 String ignoreFocusTooltip = TOOLTIP_IGNORE_FOCUS_SETTINGS;
\r
431 boolean ignoreFocus = layers.getIgnoreFocusSettings();
\r
433 ignoreFocusText = TEXT_APPLY_FOCUS_SETTINGS;
\r
434 ignoreFocusTooltip = TOOLTIP_APPLY_FOCUS_SETTINGS;
\r
437 final Button ignoreFocusButton = new Button(composite, SWT.NONE);
\r
438 ignoreFocusButton.setText(ignoreFocusText);
\r
439 ignoreFocusButton.setToolTipText(ignoreFocusTooltip);
\r
440 ignoreFocusButton.addSelectionListener(new SelectionListener() {
\r
443 public void widgetSelected(SelectionEvent e) {
\r
444 String ignoreText = TEXT_IGNORE_FOCUS_SETTINGS;
\r
445 String ignoreTooltip = TOOLTIP_IGNORE_FOCUS_SETTINGS;
\r
446 boolean ignore = layers.getIgnoreFocusSettings();
\r
448 ignoreText = TEXT_APPLY_FOCUS_SETTINGS;
\r
449 ignoreTooltip = TOOLTIP_APPLY_FOCUS_SETTINGS;
\r
450 layers.setIgnoreFocusSettings(true);
\r
452 layers.setIgnoreFocusSettings(false);
\r
454 ignoreFocusButton.setText(ignoreText);
\r
455 ignoreFocusButton.setToolTipText(ignoreTooltip);
\r
456 composite.layout();
\r
457 context.getThreadAccess().asyncExec(new Runnable() {
\r
460 public void run() {
\r
461 if(context.isDisposed()) return;
\r
462 context.getContentContext().setDirty();
\r
469 public void widgetDefaultSelected(SelectionEvent e) {
\r
475 viewer = new CheckboxTreeViewer(composite, SWT.BORDER | SWT.FULL_SELECTION );
\r
477 GridDataFactory.fillDefaults().grab(true, true).span(4, 1).applyTo(viewer.getControl());
\r
478 viewer.getControl().setToolTipText("Selects the diagram to include in the exported document.");
\r
479 viewer.setAutoExpandLevel(TreeViewer.ALL_LEVELS);
\r
480 viewer.getTree().setHeaderVisible(true);
\r
481 editor = new TreeEditor(viewer.getTree());
\r
483 final TreeColumn column1 = new TreeColumn(viewer.getTree(), SWT.LEFT);
\r
484 column1.setText("Role");
\r
485 column1.setWidth(100);
\r
486 final TreeColumn column2 = new TreeColumn(viewer.getTree(), SWT.LEFT);
\r
487 column2.setText("Show");
\r
488 column2.setWidth(50);
\r
489 final TreeColumn column3 = new TreeColumn(viewer.getTree(), SWT.LEFT);
\r
490 column3.setText("Focus");
\r
491 column3.setWidth(50);
\r
492 viewer.getTree().addListener(SWT.Resize, new Listener() {
\r
494 public void handleEvent(Event event) {
\r
495 Tree tree = viewer.getTree();
\r
496 Point size = tree.getSize();
\r
497 int w = Math.max(size.x - 100 - tree.getBorderWidth() * 2, 30);
\r
498 column1.setWidth(w);
\r
502 viewer.getTree().addListener(SWT.PaintItem, new Listener() {
\r
503 public void handleEvent(Event event) {
\r
504 if ((event.index == 1 || event.index == 2) && !elements.isEmpty()) {
\r
505 ILayer[] lz = layers.getLayers().toArray(new ILayer[0]);
\r
507 TreeItem item = (TreeItem)event.item;
\r
508 int index = viewer.getTree().indexOf(item);
\r
511 if (event.index == 1)
\r
512 width = (column2.getWidth() - 1);
\r
513 if (event.index == 2)
\r
514 width = (column3.getWidth() - 1);
\r
516 Attribute attribute = Attribute.Visible;
\r
517 if (event.index == 2)
\r
518 attribute = Attribute.Focusable;
\r
519 Tristate state = getJointAttribute(elements, lz[index], attribute);
\r
521 Color color = null;
\r
524 color = viewer.getTree().getDisplay().getSystemColor(SWT.COLOR_RED);
\r
527 color = viewer.getTree().getDisplay().getSystemColor(SWT.COLOR_GREEN);
\r
530 color = viewer.getTree().getDisplay().getSystemColor(SWT.COLOR_GRAY);
\r
535 Color foreground = gc.getForeground();
\r
536 Color background = gc.getBackground();
\r
537 gc.setBackground(color);
\r
538 gc.setForeground(viewer.getTree().getDisplay().getSystemColor(SWT.COLOR_BLACK));
\r
539 gc.fillRectangle(event.x, event.y, width-1, event.height-1);
\r
540 Rectangle rect2 = new Rectangle(event.x, event.y, width-1, event.height-1);
\r
541 gc.drawRectangle(rect2);
\r
542 gc.setForeground(background);
\r
543 gc.setBackground(foreground);
\r
547 viewer.getTree().addKeyListener(new KeyAdapter() {
\r
549 public void keyPressed(KeyEvent event) {
\r
550 if (event.keyCode == SWT.F2) {
\r
551 // FIXME: Eclipse currently eats F2 presses. This should be
\r
552 // implemented as a command handler or find some way to
\r
553 // force these listeners to have priority...
\r
554 System.out.println("startediting");
\r
556 TreeItem[] items = viewer.getTree().getSelection();
\r
557 if(items.length != 1)
\r
560 TreeItem item = items[0];
\r
562 ILayer layer = ISelectionUtils.filterSingleSelection(viewer.getSelection(), ILayer.class);
\r
566 startEditing(layer, item);
\r
570 viewer.getTree().addListener(SWT.MouseDown, new Listener() {
\r
571 public void handleEvent(Event event) {
\r
572 if (viewer.getControl().isDisposed())
\r
575 Point pt = new Point(event.x, event.y);
\r
576 TreeItem item = viewer.getTree().getItem(pt);
\r
580 int index = viewer.getTree().indexOf(item);
\r
581 ILayer[] lz = layers.getLayers().toArray(new ILayer[0]);
\r
582 ILayer layer = lz[index];
\r
584 Rectangle rect = item.getBounds(0);
\r
585 if (event.count == 2 && rect.contains(pt)) {
\r
586 startEditing(layer, item);
\r
590 // Cannot adjust visibility/focusability if no elements are selected.
\r
591 if (elements.isEmpty())
\r
594 rect = item.getBounds(1);
\r
595 if (rect.contains(pt)) {
\r
596 Tristate state = getJointAttribute(elements, layer, Attribute.Visible);
\r
597 if (setAttribute(elements, layer, Attribute.Visible, state.toggle().toBoolean()) > 0) {
\r
603 Rectangle rect2 = item.getBounds(2);
\r
604 if (rect2.contains(pt)) {
\r
605 Tristate state = getJointAttribute(elements, layer, Attribute.Focusable);
\r
606 if (setAttribute(elements, layer, Attribute.Focusable, state.toggle().toBoolean()) > 0) {
\r
613 private void refresh() {
\r
614 viewer.getControl().redraw();
\r
615 context.getThreadAccess().asyncExec(new Runnable() {
\r
617 public void run() {
\r
618 if (context.isDisposed())
\r
620 context.getContentContext().setDirty();
\r
626 viewer.addCheckStateListener(new ICheckStateListener(){
\r
628 public void checkStateChanged(CheckStateChangedEvent event) {
\r
629 ILayer layer = (ILayer)event.getElement();
\r
630 if(event.getChecked()) layers.activate(layer);
\r
631 else layers.deactivate(layer);
\r
632 viewer.setSubtreeChecked(event.getElement(), event.getChecked());
\r
633 context.getThreadAccess().asyncExec(new Runnable() {
\r
636 public void run() {
\r
637 if(context.isDisposed()) return;
\r
638 context.getContentContext().setDirty();
\r
645 viewer.addSelectionChangedListener(new ISelectionChangedListener() {
\r
647 public void selectionChanged(SelectionChangedEvent event) {
\r
648 ISelection s = event.getSelection();
\r
650 removeButton.setEnabled(false);
\r
652 removeButton.setEnabled(true);
\r
657 viewer.setContentProvider(new ITreeContentProvider(){
\r
659 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
\r
662 public void dispose() {
\r
665 public Object[] getElements(Object inputElement) {
\r
666 return layers.getLayers().toArray();
\r
669 public boolean hasChildren(Object element) {
\r
673 public Object getParent(Object element) {
\r
677 public Object[] getChildren(Object parentElement) {
\r
678 return new Object[0];
\r
681 viewer.setLabelProvider(new CellLabelProvider() {
\r
683 public void update(ViewerCell cell) {
\r
684 if(cell.getColumnIndex() == 0) {
\r
685 ILayer layer = (ILayer)cell.getElement();
\r
686 cell.setText(layer.getName());
\r
692 viewer.setCheckStateProvider(new ICheckStateProvider() {
\r
694 public boolean isChecked(Object element) {
\r
695 ILayer layer = (ILayer)element;
\r
696 final boolean isActive = layers.isActive(layer);
\r
700 public boolean isGrayed(Object element) {
\r
705 viewer.setInput(this);
\r
707 for(ILayer layer : layers.getVisibleLayers()) {
\r
708 viewer.setSubtreeChecked(layer, true);
\r
713 public Control getControl() {
\r
718 public void setFocus() {
\r
722 public void addSelectionChangedListener(ISelectionChangedListener listener) {
\r
726 public ISelection getSelection() {
\r
731 public void removeSelectionChangedListener(ISelectionChangedListener listener) {
\r
735 public void setSelection(ISelection selection) {
\r
738 private boolean startEditing(final ILayer layer, final TreeItem item/*, final int columnIndex*/) {
\r
740 // Column column = columns[columnIndex];
\r
742 String initialText = layer.getName();
\r
744 final Composite composite = new Composite(viewer.getTree(), SWT.NONE);
\r
745 final Text text = new Text(composite, SWT.BORDER);
\r
746 final int insetX = 0;
\r
747 final int insetY = 0;
\r
748 composite.addListener(SWT.Resize, new Listener() {
\r
749 public void handleEvent(Event e) {
\r
750 Rectangle rect = composite.getClientArea();
\r
751 text.setBounds(rect.x + insetX, rect.y + insetY, rect.width - insetX * 2, rect.height
\r
755 Listener textListener = new Listener() {
\r
756 public void handleEvent(final Event e) {
\r
761 if(layer instanceof IEditableLayer) {
\r
762 IEditableLayer l = (IEditableLayer)layer;
\r
763 l.setName(text.getText());
\r
764 System.out.println("renamed layer to " + text.getText());
\r
768 // // Item may be disposed if the tree gets reset after a previous editing.
\r
769 // if (!item.isDisposed()) {
\r
770 // item.setText(columnIndex, text.getText());
\r
771 // queueSelectionRefresh(context);
\r
774 // // System.out.println("validation error: " + error);
\r
776 composite.dispose();
\r
779 // newText = text.getText();
\r
780 // error = modifier.isValid(newText);
\r
781 // if (error != null) {
\r
782 // text.setBackground(invalidModificationColor);
\r
783 // // System.out.println("validation error: " + error);
\r
785 // text.setBackground(null);
\r
789 newText = text.getText();
\r
790 String leftText = newText.substring(0, e.start);
\r
791 String rightText = newText.substring(e.end, newText.length());
\r
792 GC gc = new GC(text);
\r
793 Point size = gc.textExtent(leftText + e.text + rightText);
\r
795 size = text.computeSize(size.x, SWT.DEFAULT);
\r
796 editor.horizontalAlignment = SWT.LEFT;
\r
797 Rectangle itemRect = item.getBounds(0),
\r
798 rect = viewer.getTree().getClientArea();
\r
799 editor.minimumWidth = Math.max(size.x, itemRect.width) + insetX * 2;
\r
800 int left = itemRect.x,
\r
801 right = rect.x + rect.width;
\r
802 editor.minimumWidth = Math.min(editor.minimumWidth, right - left);
\r
803 editor.minimumHeight = size.y + insetY * 2;
\r
807 switch (e.detail) {
\r
808 case SWT.TRAVERSE_RETURN:
\r
809 if(layer instanceof IEditableLayer) {
\r
810 IEditableLayer l = (IEditableLayer)layer;
\r
811 l.setName(text.getText());
\r
812 //System.out.println("renamed layer to " + text.getText());
\r
815 // error = modifier.isValid(text.getText());
\r
816 // if (error == null) {
\r
817 // modifier.modify(text.getText());
\r
818 // if (!item.isDisposed()) {
\r
819 // item.setText(columnIndex, text.getText());
\r
820 // queueSelectionRefresh(context);
\r
824 case SWT.TRAVERSE_ESCAPE:
\r
825 composite.dispose();
\r
829 //System.out.println("unhandled traversal: " + e.detail);
\r
836 text.addListener(SWT.FocusOut, textListener);
\r
837 text.addListener(SWT.Traverse, textListener);
\r
838 text.addListener(SWT.Verify, textListener);
\r
839 text.addListener(SWT.Modify, textListener);
\r
840 editor.setEditor(composite, item, 0);
\r
841 text.setText(initialText);
\r
844 // lastItem[0] = item;
\r