/** * Copyright (c) 2009 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.SWT; import org.eclipse.swt.custom.TableCursor; 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.Table; import org.eclipse.swt.widgets.TableItem; /** * An abstract base class for implementing table editing where multiple columns (all by default) are editable. * A table cursor is used to provide keyboard navigation over the table. * <p><b>Provisional API.</b> Please do not use it for anything more than experimentation. * @since 2.5 */ public abstract class MultiColumnTableEditor extends BasicTableEditor implements KeyListener, MouseListener, SelectionListener { protected TableCursor cursor; // Bit field: each bit indicates if the corresponding column is editable. // protected int editableColumns; public MultiColumnTableEditor(Table table) { this(table, 0xFFFFFFFF); } public MultiColumnTableEditor(Table table, int editableColumns) { super(table); this.editableColumns = editableColumns; table.addSelectionListener(this); cursor = new TableCursor(table, SWT.NONE); cursor.addSelectionListener(this); cursor.addMouseListener(this); if ((table.getStyle() & SWT.CHECK) != 0) { cursor.addKeyListener(this); } } @Override public void dispose() { if (table != null) { table.removeSelectionListener(this); table = null; } if (cursor != null) { cursor.removeKeyListener(this); cursor.removeMouseListener(this); cursor.removeSelectionListener(this); cursor = null; } } public void keyPressed(KeyEvent e) { if (e.character == ' ') { TableItem item = getSelection(); if (item != null) { item.setChecked(!item.getChecked()); } } } public void keyReleased(KeyEvent e) { // Do nothing. } public void mouseDoubleClick(MouseEvent e) { // Do nothing. } public void mouseDown(MouseEvent e) { // Do nothing. } public void mouseUp(MouseEvent e) { Point size = cursor.getSize(); if (e.x >= 0 && e.x < size.x && e.y >= 0 && e.y < size.y) { edit(cursor.getRow(), cursor.getColumn()); } } public void widgetSelected(SelectionEvent e) { // Move the table selection with the cursor. // if (e.widget == cursor) { table.setSelection(cursor.getRow()); } // Initially set the cursor selection to show it when an item is selected in the table. // if (e.widget == table) { if (cursor.getRow() == null) { TableItem item = getSelection(); if (item != null) { cursor.setSelection(item, 0); } cursor.setFocus(); } } } public void widgetDefaultSelected(SelectionEvent e) { if (e.widget == cursor) { TableItem item = getSelection(); if (item != null) { edit(item, cursor.getColumn()); } } } @Override protected void edit(TableItem item, int column) { if (canEdit(item, column)) { cursor.setVisible(false); super.edit(item, column); } } @Override protected boolean canEdit(TableItem item, int column) { return (1 << column & editableColumns) != 0; } @Override protected void endEditing(TableItem item, int column, Control editor, boolean accept) { super.endEditing(item, column, editor, accept); cursor.setVisible(true); cursor.setFocus(); } }