/*
* $Id$
*
* Copyright (c) 2004-2005 by the TeXlapse Team.
* 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
*/
package net.sourceforge.texlipse.tableview.views;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
/**
* @author Esa Seuranen
*
* A key listener class for individual cells in the table viewer.
*
* The main purpose for this class is to enable better (more usable) controls
* when editing table entries in the table viewer (TableViewer), which, as the
* name suggest, is not originally designed to be a table editor. However, this
* class enables fast moving around between neighboring cells by using
* CTRL+ArrowKeys.
*/
public class TexCellListener implements KeyListener {
/** Table Viewer to which listener belongs */
private TableViewer viewer;
/** Column, which the listener listens
* This is here, because there seems to be no way
* to extract the "current column" information from the viewer...
*/
private int column;
/** The underlying datastructure, TexRowList, of the whole table */
private TexRowList texRowList;
/**
* Constructor
*
* DO NOT USE THIS, use the other constructor(s) instead
*/
private TexCellListener() {
}
/**
* Constructor for the cell listener.
*
* Column information is necessary, so that moving around neighboring cell
* listener (i.e. activating the editing controls) can be done.
*
* @param viewer
* to which the cell listener belongs to
* @param texRowList
* the underlying datastructure for the whole table
* @param column
* which the cell listener listens to
*/
public TexCellListener(TableViewer viewer, TexRowList texRowList, int column) {
this.viewer = viewer;
this.texRowList = texRowList;
this.column = column;
}
/**
* KeyListener method from KeyListener Interface
*
* Determines the actions to be taken, when a key is pressed. That means
* either moving the editing controls to neigboring cell, if a)
* CTRL+ArrowKey was pressed b) neighboring cell in that direction exists or
* calculating a sum of cells in given direction (and copying it to
* clipboard) c) CTRL+KEYPAD_8,_2,_4 or _6 (up, down, left, right) is
* pressed
*
* @param e key event that occured
*/
public void keyPressed(KeyEvent e) {
if ((e.stateMask & (SWT.CTRL | SWT.ALT | SWT.SHIFT)) != SWT.CTRL)
return;
int row = viewer.getTable().getSelectionIndex();
int columns = viewer.getTable().getColumnCount();
int rows = viewer.getTable().getItemCount();
// FIXME redundant test
if ((e.stateMask & (SWT.CTRL | SWT.ALT | SWT.SHIFT)) == SWT.CTRL) {
//TexRow texRow = (TexRow) texRowList.getRows().get(row);
double sum = 0.0;
switch (e.keyCode) {
case SWT.ARROW_UP:
if (row > 0)
viewer.editElement(viewer.getElementAt(row - 1), column);
break;
case SWT.ARROW_DOWN:
/*
if (row < rows - 1) // TODO else { add one row to the model }
viewer.editElement(viewer.getElementAt(row + 1), column);
*/
if (row >= rows - 1)
texRowList.addRow();
viewer.editElement(viewer.getElementAt(row + 1), column);
break;
case SWT.ARROW_LEFT:
if (column > 0)
viewer.editElement(viewer.getElementAt(row), column - 1);
break;
case SWT.ARROW_RIGHT:
if (column < columns - 1)
viewer.editElement(viewer.getElementAt(row), column + 1);
break;
case SWT.KEYPAD_8:
sum = texRowList.sum(column, row, TexRowList.SUM_UP);
if(row>0) {
viewer.editElement(viewer.getElementAt(row - 1), column);
((TexRow)texRowList.getRows().get(row)).setCol(column,
((int)sum==sum)?Integer.toString((int)sum):Double.toString(sum));
viewer.editElement(viewer.getElementAt(row), column);
}
break;
case SWT.KEYPAD_2:
sum = texRowList.sum(column, row, TexRowList.SUM_DOWN);
if(row<texRowList.getRows().size()-1) {
viewer.editElement(viewer.getElementAt(row + 1), column);
((TexRow)texRowList.getRows().get(row)).setCol(column,
((int)sum==sum)?Integer.toString((int)sum):Double.toString(sum));
viewer.editElement(viewer.getElementAt(row), column);
}
break;
case SWT.KEYPAD_4:
sum = texRowList.sum(column, row, TexRowList.SUM_LEFT);
if(column>0) {
viewer.editElement(viewer.getElementAt(row), column-1);
((TexRow)texRowList.getRows().get(row)).setCol(column,
((int)sum==sum)?Integer.toString((int)sum):Double.toString(sum));
viewer.editElement(viewer.getElementAt(row), column);
}
break;
case SWT.KEYPAD_6:
sum = texRowList.sum(column, row, TexRowList.SUM_RIGHT);
if(column<TexRow.COLUMNS-1) {
viewer.editElement(viewer.getElementAt(row), column+1);
((TexRow)texRowList.getRows().get(row)).setCol(column,
((int)sum==sum)?Integer.toString((int)sum):Double.toString(sum));
viewer.editElement(viewer.getElementAt(row), column);
}
break;
}
}
}
/**
* KeyListener method from KeyListener Interface
*
* Determines the actions to be taken, when a key is released
* (which is absolutely nothing).
*
* @param e key event, that occurred
*/
public void keyReleased(KeyEvent e) {
}
}