/******************************************************************************* * Copyright (c) 2007-2010 Exadel, Inc. and 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: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.model.ui.editors.dnd.composite; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent; import org.eclipse.jface.viewers.ICellEditorListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.jface.viewers.ViewerRow; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.TraverseEvent; import org.eclipse.swt.events.TraverseListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; /** * * @author yzhishko * */ public class TagAttributesTableViewer extends TableViewer { private boolean isHandle = true; private boolean isTraversed = false; public TagAttributesTableViewer(Composite parent, int style) { super(parent, style); } public TagAttributesTableViewer(Composite parent) { super(parent); } public TagAttributesTableViewer(Table table) { super(table); } @Override protected void hookControl(Control control) { super.hookControl(control); if (getColumnViewerEditor() != null) { getTable().addKeyListener(new KeyListener() { public void keyReleased(KeyEvent e) { if (isHandle || (!isHandle && isTraversed)) { handleKeyReleasedEvent(e); } isHandle = true; isTraversed = false; } public void keyPressed(KeyEvent e) { } }); addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { isTraversed = false; isHandle = true; } }); getTable().addTraverseListener(new TraverseListener() { public void keyTraversed(TraverseEvent e) { if (e.character == '\r') { e.doit = false; } if (isCellEditorActive() && e.detail == SWT.TRAVERSE_ESCAPE) { e.doit = false; e.detail = SWT.TRAVERSE_NONE; isTraversed = true; } } }); } } private void handleKeyReleasedEvent(KeyEvent keyEvent) { if (keyEvent.character == '\r' && keyEvent.doit == true) { TableItem[] selectedItems = getTable().getSelection(); if (selectedItems == null || selectedItems.length != 1) { return; } TableItem item = selectedItems[0]; ViewerRow row = getViewerRowFromItem(item); ViewerCell cell = row.getCell(1); if (cell != null) { triggerEditorActivationEvent(new ColumnViewerEditorActivationEvent( cell)); } } } @Override public void setCellEditors(CellEditor[] editors) { super.setCellEditors(editors); editors[1].addListener(new ICellEditorListener() { public void editorValueChanged(boolean oldValidState, boolean newValidState) { isHandle = false; } public void cancelEditor() { isHandle = false; } public void applyEditorValue() { } }); } }