Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 55407 Details for
Bug 151377
[CellEditors] Listeners for CellSelections
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read
this important communication.
[patch]
patch that applies to HEAD
151377.patch (text/plain), 16.65 KB, created by
Thomas Schindl
on 2006-12-11 10:51:47 EST
(
hide
)
Description:
patch that applies to HEAD
Filename:
MIME Type:
Creator:
Thomas Schindl
Created:
2006-12-11 10:51:47 EST
Size:
16.65 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.jface >Index: src/org/eclipse/jface/viewers/TableViewer.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jface/src/org/eclipse/jface/viewers/TableViewer.java,v >retrieving revision 1.73 >diff -u -r1.73 TableViewer.java >--- src/org/eclipse/jface/viewers/TableViewer.java 8 Dec 2006 22:51:09 -0000 1.73 >+++ src/org/eclipse/jface/viewers/TableViewer.java 11 Dec 2006 15:49:07 -0000 >@@ -137,10 +137,6 @@ > return table.getSelection(); > } > >- protected void setEditor(Control w, Item item, int fColumnNumber) { >- tableEditor.setEditor(w, (TableItem) item, fColumnNumber); >- } >- > protected void setLayoutData(LayoutData layoutData) { > tableEditor.grabHorizontal = layoutData.grabHorizontal; > tableEditor.horizontalAlignment = layoutData.horizontalAlignment; >@@ -151,6 +147,15 @@ > table.showSelection(); > } > >+ protected void setEditor(Control w, ViewerCell cell) { >+ if( cell == null ) { >+ tableEditor.setEditor(w, null, 0); >+ } else { >+ tableEditor.setEditor(w, (TableItem) cell.getItem(), cell.getColumnIndex()); >+ } >+ >+ } >+ > }; > } > >Index: src/org/eclipse/jface/viewers/TreeViewer.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jface/src/org/eclipse/jface/viewers/TreeViewer.java,v >retrieving revision 1.73 >diff -u -r1.73 TreeViewer.java >--- src/org/eclipse/jface/viewers/TreeViewer.java 24 Nov 2006 13:09:35 -0000 1.73 >+++ src/org/eclipse/jface/viewers/TreeViewer.java 11 Dec 2006 15:49:07 -0000 >@@ -345,8 +345,13 @@ > return tree.getSelection(); > } > >- protected void setEditor(Control w, Item item, int fColumnNumber) { >- treeEditor.setEditor(w, (TreeItem) item, fColumnNumber); >+ protected void setEditor(Control w, ViewerCell cell) { >+ if( cell == null ) { >+ treeEditor.setEditor(w, null, 0); >+ } else { >+ treeEditor.setEditor(w, (TreeItem)cell.getItem(), cell.getColumnIndex()); >+ } >+ > } > > protected void setLayoutData(LayoutData layoutData) { >Index: src/org/eclipse/jface/viewers/ColumnViewer.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jface/src/org/eclipse/jface/viewers/ColumnViewer.java,v >retrieving revision 1.20 >diff -u -r1.20 ColumnViewer.java >--- src/org/eclipse/jface/viewers/ColumnViewer.java 30 Nov 2006 18:53:06 -0000 1.20 >+++ src/org/eclipse/jface/viewers/ColumnViewer.java 11 Dec 2006 15:49:07 -0000 >@@ -15,13 +15,19 @@ > package org.eclipse.jface.viewers; > > import org.eclipse.core.runtime.Assert; >-import org.eclipse.swt.events.MouseAdapter; >-import org.eclipse.swt.events.MouseEvent; >+import org.eclipse.core.runtime.ListenerList; >+import org.eclipse.swt.SWT; > import org.eclipse.swt.graphics.Point; > import org.eclipse.swt.widgets.Control; >+import org.eclipse.swt.widgets.Event; > import org.eclipse.swt.widgets.Item; >+import org.eclipse.swt.widgets.Listener; > import org.eclipse.swt.widgets.Widget; > >+ >+ >+ >+ > /** > * The ColumnViewer is the abstract superclass of viewers that have columns > * (e.g., AbstractTreeViewer and AbstractTableViewer). Concrete subclasses of >@@ -50,6 +56,8 @@ > > private int tabEditingStyle = EditingSupport.TABING_NONE; > >+ private ListenerList cellSelectionListeners; >+ > /** > * Create a new instance of the receiver. > */ >@@ -74,11 +82,18 @@ > // their > // own impl > if (viewerEditor != null) { >- control.addMouseListener(new MouseAdapter() { >- public void mouseDown(MouseEvent e) { >- viewerEditor.handleMouseDown(e); >+ Listener l = new Listener() { >+ >+ public void handleEvent(Event event) { >+ handleMouseDown(event); > } >- }); >+ >+ }; >+ >+ control.addListener(SWT.MouseDown, l); >+ control.addListener(SWT.MouseDoubleClick, l); >+ >+ addCellSelectionListener(new EditingListener()); > } > } > >@@ -371,7 +386,14 @@ > */ > public void editElement(Object element, int column) { > if (viewerEditor != null) { >- viewerEditor.editElement(element, column); >+ Widget item = findItem(element); >+ if( item != null ) { >+ ViewerRow row = (ViewerRow)item.getData(ViewerRow.ROWPART_KEY); >+ ViewerCell cell = row.getCell(column); >+ if( cell != null ) { >+ viewerEditor.editCell(cell); >+ } >+ } > } > } > >@@ -544,4 +566,62 @@ > int getTabEditingStyle() { > return this.tabEditingStyle; > } >-} >+ >+ >+ /** >+ * Adding a cell selection listener >+ * >+ * @param listener >+ * listener for cell selections >+ */ >+ public void addCellSelectionListener(ICellSelectionListener listener) { >+ if( cellSelectionListeners == null ) { >+ cellSelectionListeners = new ListenerList(); >+ } >+ this.cellSelectionListeners.add(listener); >+ } >+ >+ /** >+ * Remove the cell selection listener >+ * >+ * @param listener >+ * listener for cell selections >+ */ >+ public void removeCellSelectionListener(ICellSelectionListener listener) { >+ this.cellSelectionListeners.remove(listener); >+ } >+ >+ private void handleMouseDown(Event event) { >+ Point p = new Point(event.x,event.y); >+ >+ ViewerRow row = getViewerRow(p); >+ >+ if( row != null ) { >+ ViewerCell cell = row.getCell(p); >+ >+ if( cell != null ) { >+ fireCellSelectionEvent(new CellSelectionEvent(this,cell,event)); >+ } >+ } >+ } >+ >+ private void fireCellSelectionEvent(CellSelectionEvent event) { >+ if( ! cellSelectionListeners.isEmpty() ) { >+ Object[] listeners = cellSelectionListeners.getListeners(); >+ for( int i = 0; i < listeners.length; i++ ) { >+ ((ICellSelectionListener)listeners[i]).cellSelected(event); >+ } >+ } >+ } >+ >+ private class EditingListener implements ICellSelectionListener { >+ >+ public void cellSelected(CellSelectionEvent event) { >+ if( event.swtEvent.type == SWT.MouseDown || event.swtEvent.type == SWT.MouseDoubleClick ) { >+ if( viewerEditor != null ) { >+ viewerEditor.handleCellSelectionEvent(event); >+ } >+ } >+ } >+ } >+} >\ No newline at end of file >Index: src/org/eclipse/jface/viewers/ViewerCell.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerCell.java,v >retrieving revision 1.4 >diff -u -r1.4 ViewerCell.java >--- src/org/eclipse/jface/viewers/ViewerCell.java 6 Sep 2006 19:16:09 -0000 1.4 >+++ src/org/eclipse/jface/viewers/ViewerCell.java 11 Dec 2006 15:49:07 -0000 >@@ -177,4 +177,8 @@ > public Control getControl() { > return row.getControl(); > } >+ >+ ViewerRow getViewerRow() { >+ return row; >+ } > } >Index: src/org/eclipse/jface/viewers/AbstractViewerEditor.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractViewerEditor.java,v >retrieving revision 1.3 >diff -u -r1.3 AbstractViewerEditor.java >--- src/org/eclipse/jface/viewers/AbstractViewerEditor.java 1 Dec 2006 16:30:31 -0000 1.3 >+++ src/org/eclipse/jface/viewers/AbstractViewerEditor.java 11 Dec 2006 15:49:07 -0000 >@@ -22,7 +22,6 @@ > import org.eclipse.swt.events.MouseListener; > import org.eclipse.swt.events.TraverseEvent; > import org.eclipse.swt.events.TraverseListener; >-import org.eclipse.swt.graphics.Rectangle; > import org.eclipse.swt.widgets.Control; > import org.eclipse.swt.widgets.Display; > import org.eclipse.swt.widgets.Item; >@@ -46,21 +45,19 @@ > > private String[] columnProperties; > >- private int columnNumber; >- > private ICellEditorListener cellEditorListener; > > private FocusListener focusListener; > > private MouseListener mouseListener; > >- private int doubleClickExpirationTime; >- > private ColumnViewer viewer; > >- private Item item; >- > private TraverseListener tabeditingListener; >+ >+ private int activationTime; >+ >+ private ViewerCell cell; > > /** > * Create a new editor implementation for the viewer >@@ -92,8 +89,8 @@ > > void activateCellEditor() { > >- ViewerColumn part = viewer.getViewerColumn(columnNumber); >- Object element = item.getData(); >+ ViewerColumn part = viewer.getViewerColumn(cell.getColumnIndex()); >+ Object element = cell.getElement(); > > if (part != null && part.getEditingSupport() != null > && part.getEditingSupport().canEdit(element)) { >@@ -113,7 +110,7 @@ > return; > } > setLayoutData(cellEditor.getLayoutData()); >- setEditor(control, item, columnNumber); >+ setEditor(control, cell); > cellEditor.setFocus(); > if (focusListener == null) { > focusListener = new FocusAdapter() { >@@ -128,7 +125,7 @@ > public void mouseDown(MouseEvent e) { > // time wrap? > // check for expiration of doubleClickTime >- if (e.time <= doubleClickExpirationTime) { >+ if (e.time <= activationTime) { > control.removeMouseListener(mouseListener); > cancelEditing(); > handleDoubleClickEvent(); >@@ -143,11 +140,11 @@ > tabeditingListener = new TraverseListener() { > > public void keyTraversed(TraverseEvent e) { >- ViewerColumn col = viewer.getViewerColumn(columnNumber); >+ ViewerColumn col = viewer.getViewerColumn(cell.getColumnIndex()); > if ( col != null && col.getEditingSupport().isTabingSupported() ) { > col.getEditingSupport().processTraversEvent( >- columnNumber, >- viewer.getViewerRowFromItem(item), e); >+ cell.getColumnIndex(), >+ cell.getViewerRow(), e); > } > } > }; >@@ -159,38 +156,6 @@ > } > } > >- /** >- * Activate a cell editor for the given mouse position. >- */ >- private void activateCellEditor(MouseEvent event) { >- if (item == null || item.isDisposed()) { >- // item no longer exists >- return; >- } >- int columnToEdit; >- ViewerRow row = viewer.getViewerRowFromItem(item); >- int columns = row.getColumnCount(); >- if (columns == 0) { >- // If no TableColumn, Table acts as if it has a single column >- // which takes the whole width. >- columnToEdit = 0; >- } else { >- columnToEdit = -1; >- for (int i = 0; i < columns; i++) { >- Rectangle bounds = row.getBounds(i); >- if (bounds.contains(event.x, event.y)) { >- columnToEdit = i; >- break; >- } >- } >- if (columnToEdit == -1) { >- return; >- } >- } >- >- columnNumber = columnToEdit; >- activateCellEditor(); >- } > > /** > * Applies the current value and deactivates the currently active cell >@@ -204,12 +169,13 @@ > // see 1GAHI8Z: ITPUI:ALL - How to code event notification when > // using cell editor ? > this.cellEditor = null; >- Item t = this.item; >+ Item t = this.cell.getItem(); >+ > // don't null out table item -- same item is still selected > if (t != null && !t.isDisposed()) { > saveEditorValue(c, t); > } >- setEditor(null, null, 0); >+ setEditor(null, null); > c.removeListener(cellEditorListener); > Control control = c.getControl(); > if (control != null) { >@@ -235,7 +201,7 @@ > */ > void cancelEditing() { > if (cellEditor != null) { >- setEditor(null, null, 0); >+ setEditor(null, null); > cellEditor.removeListener(cellEditorListener); > > Control control = cellEditor.getControl(); >@@ -265,11 +231,8 @@ > * > * @param event > */ >- void handleMouseDown(MouseEvent event) { >- if (event.button != 1) { >- return; >- } >- >+ void handleCellSelectionEvent(CellSelectionEvent event) { >+ > if (cellEditor != null) { > applyEditorValue(); > } >@@ -279,47 +242,40 @@ > // the cell editor will be deactivated and a doubleClick event will > // be processed. > // >- doubleClickExpirationTime = event.time >- + Display.getCurrent().getDoubleClickTime(); >- >- Item[] items = getSelection(); >- // Do not edit if more than one row is selected. >- if (items.length != 1) { >- item = null; >- return; >+ if( event.swtEvent != null ) { >+ activationTime = event.swtEvent.time + Display.getCurrent().getDoubleClickTime(); > } >- item = items[0]; >- activateCellEditor(event); >+ >+ >+ this.cell = event.cell; >+ activateCellEditor(); > } > > /** > * Start editing the given element. > * >- * @param element >- * @param column >+ * @param cell the cell to edit > */ >- void editElement(Object element, int column) { >+ void editCell(ViewerCell cell) { > if (cellEditor != null) { > applyEditorValue(); > } > >- setSelection(createSelection(element), true); >+ setSelection(createSelection(cell.getElement()), true); > Item[] selection = getSelection(); > if (selection.length != 1) { > return; > } > >- item = selection[0]; >- > // Make sure selection is visible > showSelection(); >- columnNumber = column; >+ > activateCellEditor(); > > } > > private void saveEditorValue(CellEditor cellEditor, Item tableItem) { >- ViewerColumn part = viewer.getViewerColumn(columnNumber); >+ ViewerColumn part = viewer.getViewerColumn(cell.getColumnIndex()); > > if (part != null && part.getEditingSupport() != null) { > part.getEditingSupport().setValue(tableItem.getData(), >@@ -414,13 +370,11 @@ > * Position the editor inside the control > * > * @param w >- * the editor control >- * @param item >- * the item (row) in which the editor is drawn in >- * @param fColumnNumber >- * the column number in which the editor is shown >+ * the editor control or <code>null</code> if the editor has to be reset >+ * @param cell the cell in which the editor should be displayed or <code>null</code> if the editor has to be reset >+ * > */ >- protected abstract void setEditor(Control w, Item item, int fColumnNumber); >+ protected abstract void setEditor(Control w, ViewerCell cell); > > /** > * set the layout data for the editor >Index: src/org/eclipse/jface/viewers/CellSelectionEvent.java >=================================================================== >RCS file: src/org/eclipse/jface/viewers/CellSelectionEvent.java >diff -N src/org/eclipse/jface/viewers/CellSelectionEvent.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/jface/viewers/CellSelectionEvent.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,57 @@ >+/******************************************************************************* >+ * Copyright (c) 2006 Tom Schindl 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: >+ * Tom Shindl <tom.schindl@bestsolution.at> - initial API and implementation (bug 151377) >+ ******************************************************************************/ >+ >+package org.eclipse.jface.viewers; >+ >+import java.util.EventObject; >+ >+import org.eclipse.jface.viewers.ColumnViewer; >+import org.eclipse.jface.viewers.ViewerCell; >+import org.eclipse.swt.widgets.Event; >+ >+/** >+ * This event is trigger when a cell is selected through key board or any other >+ * action >+ * >+ * @since 3.3 >+ * >+ */ >+public class CellSelectionEvent extends EventObject { >+ /** >+ * The real SWT-Event which triggered the action >+ */ >+ public Event swtEvent; >+ >+ /** >+ * The cell selected >+ */ >+ public ViewerCell cell; >+ >+ private static final long serialVersionUID = 1L; >+ >+ /** >+ * A new event object holding all data to decide what was the event that has >+ * been triggered >+ * >+ * @param viewer >+ * the viewer which is the source of the event >+ * @param cell >+ * the cell selected >+ * @param swtEvent >+ * the real swt event >+ */ >+ CellSelectionEvent(ColumnViewer viewer, ViewerCell cell, Event swtEvent) { >+ super(viewer); >+ this.cell = cell; >+ this.swtEvent = swtEvent; >+ } >+ >+} >Index: src/org/eclipse/jface/viewers/ICellSelectionListener.java >=================================================================== >RCS file: src/org/eclipse/jface/viewers/ICellSelectionListener.java >diff -N src/org/eclipse/jface/viewers/ICellSelectionListener.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/jface/viewers/ICellSelectionListener.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,18 @@ >+package org.eclipse.jface.viewers; >+ >+/** >+ * Classes interested when cell-selections occur in a table/tree control have to >+ * implement this interface >+ * >+ * @since 3.3 >+ * >+ */ >+public interface ICellSelectionListener { >+ /** >+ * This method is called when a cell is selected >+ * >+ * @param event >+ * the selection event >+ */ >+ public void cellSelected(CellSelectionEvent event); >+}
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 151377
:
46627
|
54784
|
54904
|
55407
|
55408
|
55412