/**
* 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.TableTree;
import org.eclipse.swt.custom.TableTreeEditor;
import org.eclipse.swt.custom.TableTreeItem;
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;
import org.eclipse.emf.common.ui.viewer.ExtendedTableTreeViewer;
/**
* This base class for implementing a {@link TableTreeEditor} 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.
* @deprecated
* @see ExtendedTreeEditor
*/
@Deprecated
public abstract class ExtendedTableTreeEditor
extends TableTreeEditor
implements KeyListener, MouseListener, SelectionListener
{
protected Table table;
protected TableItem selectedTableItem;
protected TableTree tableTree;
protected TableTreeItem editTableTreeItem;
protected int editTableTreeItemColumn;
boolean isActivating;
boolean isDeactivating;
boolean isActive;
public ExtendedTableTreeEditor(TableTree tableTree)
{
super(tableTree);
this.tableTree = tableTree;
this.table = tableTree.getTable();
table.addKeyListener(this);
table.addMouseListener(this);
table.addSelectionListener(this);
}
public void mouseDoubleClick(MouseEvent event)
{
// System.out.println("*double*");
editTableTreeItem = null;
}
public void mouseDown(MouseEvent event)
{
editTableTreeItem = null;
editTableTreeItemColumn = -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 = tableTree.getTable().getItems();
int columnCount = tableTree.getTable().getColumnCount();
LOOP: for (int i = tableTree.getTable().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;
}
editTableTreeItem = (TableTreeItem)tableItems[i].getData(ExtendedTableTreeViewer.ITEM_ID);
editTableTreeItemColumn = 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 (editTableTreeItem == 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 = tableTree.getTable().getItems();
int columnCount = tableTree.getTable().getColumnCount();
LOOP: for (int i = tableTree.getTable().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];
TableTreeItem tableTreeItem = (TableTreeItem)tableItems[i].getData(ExtendedTableTreeViewer.ITEM_ID);
if (tableTreeItem == editTableTreeItem)
{
selectedTableItem = null;
table.showSelection();
editItem(tableItem, editTableTreeItem, editTableTreeItemColumn);
}
}
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, (TableTreeItem)selectedTableItem.getData(ExtendedTableTreeViewer.ITEM_ID), 0);
selectedTableItem = null;
}
}
protected abstract void editItem(TableItem tableItem, TableTreeItem tableTreeItem, int column);
@Override
public void setEditor(Control canvas, TableTreeItem tableTreeItem, int column)
{
super.setEditor(canvas, tableTreeItem, column);
}
}