/** * Copyright (c) 2002-2006 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are 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: * IBM - Initial API and implementation */ package org.eclipse.emf.common.ui.celleditor; import org.eclipse.swt.custom.TreeEditor; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; /** * This base class for implementing a {@link TreeEditor} calls {@link #editItem} * when the cell editor potentially needs to be activated. * Activation is determined by checking for when a click happens on the single selection that was previously in effect, * or when the user hits the space key when a single selection is in effect. */ public abstract class ExtendedTreeEditor extends TreeEditor implements SelectionListener, MouseListener, KeyListener { protected Tree tree; protected TreeItem selectedTreeItem; protected TreeItem editTreeItem; public ExtendedTreeEditor(Tree tree) { super(tree); this.tree = tree; tree.addKeyListener(this); tree.addMouseListener(this); tree.addSelectionListener(this); } public void mouseDoubleClick(MouseEvent event) { // Do nothing } public void mouseDown(MouseEvent event) { if (event.button == 1) { TreeItem treeItem = tree.getItem(new Point(event.x, event.y)); editTreeItem = treeItem == selectedTreeItem ? treeItem : null; } } public void mouseUp(MouseEvent event) { if (event.button == 1) { TreeItem treeItem = tree.getItem(new Point(event.x, event.y)); if (editTreeItem == treeItem && editTreeItem != null) { editTreeItem = null; editItem(treeItem); } } } public void widgetDefaultSelected(SelectionEvent event) { widgetSelected(event); } public void widgetSelected(SelectionEvent event) { Control control = getEditor(); if (control != null && !control.isDisposed()) { setEditor(null); control.dispose(); } TreeItem [] selection = tree.getSelection(); selectedTreeItem = selection.length == 1 ? selection[0] : null; } public void keyPressed(KeyEvent event) { // Do nothing } public void keyReleased(KeyEvent event) { if (event.character == ' ' && selectedTreeItem != null) { editItem(selectedTreeItem); } } protected abstract void editItem(TreeItem treeItem); }