/****************************************************************************** * Copyright (C) 2006-2012 IFS Institute for Software 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 * * Original authors: * Dennis Hunziker * Ueli Kistler * Reto Schuettel * Robin Stocker * Contributors: * Fabio Zadrozny <fabiofz@gmail.com> - initial implementation ******************************************************************************/ /* * Copyright (C) 2006, 2007 Dennis Hunziker, Ueli Kistler * Copyright (C) 2007 Reto Schuettel, Robin Stocker * * IFS Institute for Software, HSR Rapperswil, Switzerland * */ package org.python.pydev.refactoring.ui.pages.listener; import java.util.Observable; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.TableEditor; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.Text; import org.python.pydev.refactoring.ui.pages.core.SimpleTableItem; public class TableCellEditorListener extends Observable implements Listener { private final Table table; private IValidationPage wizard; public TableCellEditorListener(IValidationPage wizard, Table parametersTable) { this.wizard = wizard; this.table = parametersTable; } /** * http://www.eclipse.org/swt/snippets/ */ @Override public void handleEvent(Event event) { final TableEditor editor = new TableEditor(table); editor.horizontalAlignment = SWT.LEFT; editor.grabHorizontal = true; Rectangle clientArea = table.getClientArea(); if (table.getSelection().length != 1) { return; } Rectangle bounds = table.getSelection()[0].getBounds(); Point pt = new Point(bounds.x, bounds.y); int index = table.getTopIndex(); while (index < table.getItemCount()) { boolean visible = false; final SimpleTableItem item = (SimpleTableItem) table.getItem(index); for (int i = 0; i < table.getColumnCount(); i++) { Rectangle rect = item.getBounds(i); if (rect.contains(pt)) { final Text text = new Text(table, SWT.NONE); Listener textListener = new TextListener(item, text); text.addListener(SWT.FocusOut, textListener); text.addListener(SWT.Traverse, textListener); text.addListener(SWT.FocusOut, wizard); editor.setEditor(text, item, i); text.setText(item.getText(i)); text.selectAll(); text.setFocus(); return; } if (!visible && rect.intersects(clientArea)) { visible = true; } } if (!visible) { return; } index++; } } private final class TextListener implements Listener { private SimpleTableItem tableItem; private final Text text; private TextListener(SimpleTableItem item, Text text) { this.tableItem = item; this.text = text; } @Override public void handleEvent(final Event e) { if (e.type == SWT.FocusOut) { tableItem.setText(text.getText()); text.dispose(); table.setFocus(); } else if (e.type == SWT.Traverse) { if (e.detail == SWT.TRAVERSE_RETURN) { tableItem.setText(text.getText()); e.doit = true; } if (e.detail == SWT.TRAVERSE_RETURN || e.detail == SWT.TRAVERSE_ESCAPE) { text.dispose(); if (e.detail == SWT.TRAVERSE_ESCAPE) { e.doit = false; } } } } } }