📄 tablecursor.java
字号:
/******************************************************************************* * Copyright (c) 2000, 2004 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/package org.eclipse.swt.custom;import org.eclipse.swt.*;import org.eclipse.swt.graphics.*;import org.eclipse.swt.widgets.*;import org.eclipse.swt.events.*;/** * A TableCursor provides a way for the user to navigate around a Table * using the keyboard. It also provides a mechanism for selecting an * individual cell in a table. * * <p> Here is an example of using a TableCursor to navigate to a cell and then edit it. * * <code><pre> * public static void main(String[] args) { * Display display = new Display(); * Shell shell = new Shell(display); * shell.setLayout(new GridLayout()); * * // create a a table with 3 columns and fill with data * final Table table = new Table(shell, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION); * table.setLayoutData(new GridData(GridData.FILL_BOTH)); * TableColumn column1 = new TableColumn(table, SWT.NONE); * TableColumn column2 = new TableColumn(table, SWT.NONE); * TableColumn column3 = new TableColumn(table, SWT.NONE); * for (int i = 0; i < 100; i++) { * TableItem item = new TableItem(table, SWT.NONE); * item.setText(new String[] { "cell "+i+" 0", "cell "+i+" 1", "cell "+i+" 2"}); * } * column1.pack(); * column2.pack(); * column3.pack(); * * // create a TableCursor to navigate around the table * final TableCursor cursor = new TableCursor(table, SWT.NONE); * // create an editor to edit the cell when the user hits "ENTER" * // while over a cell in the table * final ControlEditor editor = new ControlEditor(cursor); * editor.grabHorizontal = true; * editor.grabVertical = true; * * cursor.addSelectionListener(new SelectionAdapter() { * // when the TableEditor is over a cell, select the corresponding row in * // the table * public void widgetSelected(SelectionEvent e) { * table.setSelection(new TableItem[] {cursor.getRow()}); * } * // when the user hits "ENTER" in the TableCursor, pop up a text editor so that * // they can change the text of the cell * public void widgetDefaultSelected(SelectionEvent e){ * final Text text = new Text(cursor, SWT.NONE); * TableItem row = cursor.getRow(); * int column = cursor.getColumn(); * text.setText(row.getText(column)); * text.addKeyListener(new KeyAdapter() { * public void keyPressed(KeyEvent e) { * // close the text editor and copy the data over * // when the user hits "ENTER" * if (e.character == SWT.CR) { * TableItem row = cursor.getRow(); * int column = cursor.getColumn(); * row.setText(column, text.getText()); * text.dispose(); * } * // close the text editor when the user hits "ESC" * if (e.character == SWT.ESC) { * text.dispose(); * } * } * }); * editor.setEditor(text); * text.setFocus(); * } * }); * // Hide the TableCursor when the user hits the "MOD1" or "MOD2" key. * // This alows the user to select multiple items in the table. * cursor.addKeyListener(new KeyAdapter() { * public void keyPressed(KeyEvent e) { * if (e.keyCode == SWT.MOD1 || * e.keyCode == SWT.MOD2 || * (e.stateMask & SWT.MOD1) != 0 || * (e.stateMask & SWT.MOD2) != 0) { * cursor.setVisible(false); * } * } * }); * // Show the TableCursor when the user releases the "MOD2" or "MOD1" key. * // This signals the end of the multiple selection task. * table.addKeyListener(new KeyAdapter() { * public void keyReleased(KeyEvent e) { * if (e.keyCode == SWT.MOD1 && (e.stateMask & SWT.MOD2) != 0) return; * if (e.keyCode == SWT.MOD2 && (e.stateMask & SWT.MOD1) != 0) return; * if (e.keyCode != SWT.MOD1 && (e.stateMask & SWT.MOD1) != 0) return; * if (e.keyCode != SWT.MOD2 && (e.stateMask & SWT.MOD2) != 0) return; * * TableItem[] selection = table.getSelection(); * TableItem row = (selection.length == 0) ? table.getItem(table.getTopIndex()) : selection[0]; * table.showItem(row); * cursor.setSelection(row, 0); * cursor.setVisible(true); * cursor.setFocus(); * } * }); * * shell.open(); * while (!shell.isDisposed()) { * if (!display.readAndDispatch()) * display.sleep(); * } * display.dispose(); * } * </pre></code> * * <dl> * <dt><b>Styles:</b></dt> * <dd>BORDER</dd> * <dt><b>Events:</b></dt> * <dd>Selection, DefaultSelection</dd> * </dl> * * @since 2.0 * */public class TableCursor extends Canvas { Table table; TableItem row = null; TableColumn column = null; Listener tableListener, resizeListener, disposeItemListener, disposeColumnListener; // By default, invert the list selection colors static final int BACKGROUND = SWT.COLOR_LIST_SELECTION_TEXT; static final int FOREGROUND = SWT.COLOR_LIST_SELECTION;/** * Constructs a new instance of this class given its parent * table and a style value describing its behavior and appearance. * <p> * The style value is either one of the style constants defined in * class <code>SWT</code> which is applicable to instances of this * class, or must be built by <em>bitwise OR</em>'ing together * (that is, using the <code>int</code> "|" operator) two or more * of those <code>SWT</code> style constants. The class description * lists the style constants that are applicable to the class. * Style bits are also inherited from superclasses. * </p> * * @param parent a Table control which will be the parent of the new instance (cannot be null) * @param style the style of control to construct * * @exception IllegalArgumentException <ul> * <li>ERROR_NULL_ARGUMENT - if the parent is null</li> * </ul> * @exception SWTException <ul> * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li> * <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li> * </ul> * * @see SWT#BORDER * @see Widget#checkSubclass() * @see Widget#getStyle() */public TableCursor(Table parent, int style) { super(parent, style); table = parent; setBackground(null); setForeground(null); Listener listener = new Listener() { public void handleEvent(Event event) { switch (event.type) { case SWT.Dispose : dispose(event); break; case SWT.FocusIn : case SWT.FocusOut : redraw(); break; case SWT.KeyDown : keyDown(event); break; case SWT.Paint : paint(event); break; case SWT.Traverse : traverse(event); break; } } }; int[] events = new int[] {SWT.Dispose, SWT.FocusIn, SWT.FocusOut, SWT.KeyDown, SWT.Paint, SWT.Traverse}; for (int i = 0; i < events.length; i++) { addListener(events[i], listener); } tableListener = new Listener() { public void handleEvent(Event event) { switch (event.type) { case SWT.MouseDown : tableMouseDown(event); break; case SWT.FocusIn : tableFocusIn(event); break; } } }; table.addListener(SWT.FocusIn, tableListener); table.addListener(SWT.MouseDown, tableListener); disposeItemListener = new Listener() { public void handleEvent(Event event) { row = null; column = null; resize(); } }; disposeColumnListener = new Listener() { public void handleEvent(Event event) { row = null; column = null; resize(); } }; resizeListener = new Listener() { public void handleEvent(Event event) { resize(); } }; ScrollBar hBar = table.getHorizontalBar(); if (hBar != null) { hBar.addListener(SWT.Selection, resizeListener); } ScrollBar vBar = table.getVerticalBar(); if (vBar != null) { vBar.addListener(SWT.Selection, resizeListener); }}/** * Adds the listener to the collection of listeners who will * be notified when the receiver's selection changes, by sending * it one of the messages defined in the <code>SelectionListener</code> * interface. * <p> * When <code>widgetSelected</code> is called, the item field of the event object is valid. * If the reciever has <code>SWT.CHECK</code> style set and the check selection changes, * the event object detail field contains the value <code>SWT.CHECK</code>. * <code>widgetDefaultSelected</code> is typically called when an item is double-clicked. * </p> * * @param listener the listener which should be notified * * @exception IllegalArgumentException <ul> * <li>ERROR_NULL_ARGUMENT - if the listener is null</li> * </ul> * @exception SWTException <ul> * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> * </ul> * * @see SelectionListener * @see SelectionEvent * @see #removeSelectionListener(SelectionListener) * */public void addSelectionListener(SelectionListener listener) { checkWidget(); if (listener == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); TypedListener typedListener = new TypedListener(listener); addListener(SWT.Selection, typedListener); addListener(SWT.DefaultSelection, typedListener);}void dispose(Event event) { table.removeListener(SWT.FocusIn, tableListener); table.removeListener(SWT.MouseDown, tableListener); if (column != null) { column.removeListener(SWT.Dispose, disposeColumnListener); column.removeListener(SWT.Move, resizeListener); column.removeListener(SWT.Resize, resizeListener); column = null; } if (row != null) { row.removeListener(SWT.Dispose, disposeItemListener); row = null; } ScrollBar hBar = table.getHorizontalBar(); if (hBar != null) { hBar.removeListener(SWT.Selection, resizeListener); } ScrollBar vBar = table.getVerticalBar(); if (vBar != null) { vBar.removeListener(SWT.Selection, resizeListener); }}void keyDown(Event event) { if (row == null) return; switch (event.character) { case SWT.CR : notifyListeners(SWT.DefaultSelection, new Event()); return; } int rowIndex = table.indexOf(row); int columnIndex = column == null ? 0 : table.indexOf(column); switch (event.keyCode) { case SWT.ARROW_UP : setRowColumn(Math.max(0, rowIndex - 1), columnIndex, true); break; case SWT.ARROW_DOWN : setRowColumn(Math.min(rowIndex + 1, table.getItemCount() - 1), columnIndex, true); break; case SWT.ARROW_LEFT : case SWT.ARROW_RIGHT : { int columnCount = table.getColumnCount(); if (columnCount == 0) break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -