/**
* 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.SWT;
import org.eclipse.swt.custom.TableEditor;
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.graphics.Rectangle;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
/**
* This base class for implementing a {@link TableEditor} that calls {@link #editItem}
* when the cell editor potentially needs to be activated.
* This API is under construction; please do not use it for anything more than experimentation.
* It also does not fully support keyboard navigation.
* @deprecated Use {@link SingleColumnTableEditor} or {@link MultiColumnTableEditor}.
*/
@Deprecated
public abstract class ExtendedTableEditor
extends TableEditor
implements KeyListener, MouseListener, SelectionListener
{
protected Table table;
protected TableItem selectedTableItem;
protected TableItem editTableItem;
protected int editTableItemColumn;
boolean isActivating;
boolean isDeactivating;
boolean isActive;
public ExtendedTableEditor(Table table)
{
super(table);
this.table = table;
table.addKeyListener(this);
table.addMouseListener(this);
table.addSelectionListener(this);
}
public void mouseDoubleClick(MouseEvent event)
{
// System.out.println("*double*");
editTableItem = null;
}
public void mouseDown(MouseEvent event)
{
editTableItem = null;
editTableItemColumn = -1;
// System.out.println("*down*");
if (event.button == 1)
{
boolean wasActive = getEditor() != null && !getEditor().isDisposed();
Point point = new Point(event.x, event.y);
TableItem [] tableItems = table.getItems();
int columnCount = table.getColumnCount();
LOOP: for (int i = table.getTopIndex(); i < tableItems.length; ++i)
{
for (int j = 0; j < columnCount; ++j)
{
Rectangle bounds = tableItems[i].getBounds(j);
if (bounds.y > event.y)
{
break LOOP;
}
else if (bounds.contains(event.x, event.y))
{
if (j != 0 || !tableItems[i].getImageBounds(0).contains(event.x, event.y))
{
TableItem tableItem = tableItems[i];
if (tableItem == selectedTableItem || wasActive)
{
if (tableItem != selectedTableItem)
{
table.setSelection(i);
Event selectionEvent = new Event();
selectionEvent.widget = table;
selectionEvent.item = tableItem;
table.notifyListeners(SWT.Selection, selectionEvent);
selectedTableItem = tableItem;
}
editTableItem = tableItems[i];
editTableItemColumn = j;
}
else
{
TableItem mouseBasedTableItem = table.getItem(point);
if (mouseBasedTableItem == null)
{
table.setSelection(i);
Event selectionEvent = new Event();
selectionEvent.widget = table;
selectionEvent.item = tableItem;
table.notifyListeners(SWT.Selection, selectionEvent);
selectedTableItem = tableItem;
}
}
}
break LOOP;
}
}
}
if (editTableItem == null && wasActive)
{
dismiss();
}
}
}
public void dismiss()
{
setEditor(null, null, -1);
}
public void mouseUp(MouseEvent event)
{
// System.out.println("*up*");
if (event.button == 1)
{
TableItem [] tableItems = table.getItems();
int columnCount = table.getColumnCount();
LOOP: for (int i = table.getTopIndex(); i < tableItems.length; ++i)
{
for (int j = 0; j < columnCount; ++j)
{
Rectangle bounds = tableItems[i].getBounds(j);
if (bounds.y > event.y)
{
break LOOP;
}
else if (bounds.contains(event.x, event.y))
{
if (j != 0 || !tableItems[i].getImageBounds(0).contains(event.x, event.y))
{
TableItem tableItem = tableItems[i];
if (tableItem == editTableItem)
{
selectedTableItem = null;
table.showSelection();
editItem(editTableItem, editTableItemColumn);
}
}
break LOOP;
}
}
}
}
}
public void widgetDefaultSelected(SelectionEvent event)
{
widgetSelected(event);
}
public void widgetSelected(SelectionEvent event)
{
TableItem [] selection = table.getSelection();
selectedTableItem = selection.length == 1 ? selection[0] : null;
}
public void keyPressed(KeyEvent event)
{
// Do nothing
}
public void keyReleased(KeyEvent event)
{
TableItem [] selection = table.getSelection();
selectedTableItem = selection.length == 1 ? selection[0] : null;
if (event.character == ' ' && selectedTableItem != null)
{
editItem(selectedTableItem, 0);
selectedTableItem = null;
}
}
protected abstract void editItem(TableItem tableItem, int column);
@Override
public void setEditor(Control canvas, TableItem tableItem, int column)
{
super.setEditor(canvas, tableItem, column);
}
}