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 54784 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]
A first patch to bring back this feature
151377.patch (text/plain), 15.85 KB, created by
Thomas Schindl
on 2006-11-30 09:59:12 EST
(
hide
)
Description:
A first patch to bring back this feature
Filename:
MIME Type:
Creator:
Thomas Schindl
Created:
2006-11-30 09:59:12 EST
Size:
15.85 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.72 >diff -u -r1.72 TableViewer.java >--- src/org/eclipse/jface/viewers/TableViewer.java 24 Nov 2006 13:09:35 -0000 1.72 >+++ src/org/eclipse/jface/viewers/TableViewer.java 30 Nov 2006 14:50:25 -0000 >@@ -631,8 +631,13 @@ > return getTable().getSelection(); > } > >- protected void setEditor(Control w, Item item, int fColumnNumber) { >- tableEditor.setEditor(w, (TableItem) item, fColumnNumber); >+ protected void setEditor(Control w, ViewerCell cell) { >+ if( cell == null ) { >+ tableEditor.setEditor(w, null, 0); >+ } else { >+ tableEditor.setEditor(w, (TableItem)cell.getItem(), cell.getColumnIndex()); >+ } >+ > } > > protected void setLayoutData(LayoutData layoutData) { >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 30 Nov 2006 14:50:25 -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.19 >diff -u -r1.19 ColumnViewer.java >--- src/org/eclipse/jface/viewers/ColumnViewer.java 29 Nov 2006 21:50:39 -0000 1.19 >+++ src/org/eclipse/jface/viewers/ColumnViewer.java 30 Nov 2006 14:50:24 -0000 >@@ -14,13 +14,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 >@@ -46,6 +52,8 @@ > private ViewerCell cell = new ViewerCell(null, 0); > > private AbstractViewerEditor viewerEditor; >+ >+ private ListenerList cellSelectionListeners; > > /** > * Create a new instance of the receiver. >@@ -71,11 +79,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()); > } > } > >@@ -365,10 +380,19 @@ > * @param column > * the column index > * @since 3.1 (in subclasses, added in 3.3 to abstract class) >+ * @see #editCell(ViewerCell) > */ > 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.editElement(cell); >+ } >+ } >+ //viewerEditor.editElement(element, column); > } > } > >@@ -527,4 +551,67 @@ > viewerEditor.setColumnProperties(columnProperties); > } > } >+ >+ /** >+ * 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); >+ } >+ >+ /** >+ * Start editing the given cell if possible >+ * @param cell the cell to edit >+ */ >+ public void editCell(ViewerCell cell) { >+ viewerEditor.editElement(cell); >+ } >+ >+ 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 ) { >+ editCell(event.cell); >+ } >+ } >+ } > } >Index: src/org/eclipse/jface/viewers/ViewerRow.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.jface/src/org/eclipse/jface/viewers/ViewerRow.java,v >retrieving revision 1.4 >diff -u -r1.4 ViewerRow.java >--- src/org/eclipse/jface/viewers/ViewerRow.java 6 Sep 2006 19:14:21 -0000 1.4 >+++ src/org/eclipse/jface/viewers/ViewerRow.java 30 Nov 2006 14:50:25 -0000 >@@ -8,6 +8,7 @@ > * Contributors: > * IBM Corporation - initial API and implementation > * Tom Shindl <tom.schindl@bestsolution.at> - initial API and implementation >+ * fix for bug 166346 > ******************************************************************************/ > > package org.eclipse.jface.viewers; >@@ -189,7 +190,12 @@ > */ > public int getColumnIndex(Point point) { > int count = getColumnCount(); >- >+ >+ // If there are no columns the column-index is 0 >+ if( count == 0 ) { >+ return 0; >+ } >+ > for (int i = 0; i < count; i++) { > if (getBounds(i).contains(point)) { > return i; >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.1 >diff -u -r1.1 AbstractViewerEditor.java >--- src/org/eclipse/jface/viewers/AbstractViewerEditor.java 24 Nov 2006 13:09:36 -0000 1.1 >+++ src/org/eclipse/jface/viewers/AbstractViewerEditor.java 30 Nov 2006 14:50:24 -0000 >@@ -18,9 +18,7 @@ > import org.eclipse.swt.events.MouseAdapter; > import org.eclipse.swt.events.MouseEvent; > import org.eclipse.swt.events.MouseListener; >-import org.eclipse.swt.graphics.Rectangle; > import org.eclipse.swt.widgets.Control; >-import org.eclipse.swt.widgets.Display; > import org.eclipse.swt.widgets.Item; > > /** >@@ -42,8 +40,6 @@ > > private String[] columnProperties; > >- private int columnNumber; >- > private ICellEditorListener cellEditorListener; > > private FocusListener focusListener; >@@ -54,7 +50,7 @@ > > private ColumnViewer viewer; > >- private Item item; >+ private ViewerCell cell; > > /** > * Create a new editor implementation for the viewer >@@ -86,8 +82,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)) { >@@ -107,7 +103,7 @@ > return; > } > setLayoutData(cellEditor.getLayoutData()); >- setEditor(control, item, columnNumber); >+ setEditor(control, cell); > cellEditor.setFocus(); > if (focusListener == null) { > focusListener = new FocusAdapter() { >@@ -136,39 +132,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 > * editor. > */ >@@ -180,12 +143,14 @@ > // see 1GAHI8Z: ITPUI:ALL - How to code event notification when > // using cell editor ? > this.cellEditor = null; >- Item t = this.item; >+ Item t = cell.getItem(); >+ > // don't null out table item -- same item is still selected > if (t != null && !t.isDisposed()) { >- saveEditorValue(c, t); >+ saveEditorValue(c, cell); > } >- setEditor(null, null, 0); >+ >+ setEditor(null, null); > c.removeListener(cellEditorListener); > Control control = c.getControl(); > if (control != null) { >@@ -205,7 +170,7 @@ > */ > void cancelEditing() { > if (cellEditor != null) { >- setEditor(null, null, 0); >+ setEditor(null, null); > cellEditor.removeListener(cellEditorListener); > CellEditor oldEditor = cellEditor; > cellEditor = null; >@@ -214,68 +179,26 @@ > } > > /** >- * Enable the editor by mouse down >- * >- * @param event >- */ >- void handleMouseDown(MouseEvent event) { >- if (event.button != 1) { >- return; >- } >- >- if (cellEditor != null) { >- applyEditorValue(); >- } >- >- // activate the cell editor immediately. If a second mouseDown >- // is received prior to the expiration of the doubleClick time then >- // 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; >- } >- item = items[0]; >- activateCellEditor(event); >- } >- >- /** >- * Start editing the given element. >+ * Start editing the given cell. > * >- * @param element >- * @param column >+ * @param cell > */ >- void editElement(Object element, int column) { >+ void editElement(ViewerCell cell) { >+ this.cell = cell; > if (cellEditor != null) { > applyEditorValue(); > } > >- setSelection(createSelection(element), true); >- Item[] selection = getSelection(); >- if (selection.length != 1) { >- return; >- } >- >- item = selection[0]; >+ setSelection(createSelection(cell.getElement()), true); > >- // Make sure selection is visible >- showSelection(); >- columnNumber = column; > activateCellEditor(); >- > } > >- private void saveEditorValue(CellEditor cellEditor, Item tableItem) { >- ViewerColumn part = viewer.getViewerColumn(columnNumber); >+ private void saveEditorValue(CellEditor cellEditor, ViewerCell cell) { >+ ViewerColumn part = viewer.getViewerColumn(cell.getColumnIndex()); > > if (part != null && part.getEditingSupport() != null) { >- part.getEditingSupport().setValue(tableItem.getData(), >+ part.getEditingSupport().setValue(cell.getElement(), > cellEditor.getValue()); > } > } >@@ -367,13 +290,13 @@ > * 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