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 46241 Details for
Bug 149193
[Viewers] JFace Table and Tree Viewers need to handle SWT events in an extensible way
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]
First pass of the new API
149193.txt (text/plain), 46.33 KB, created by
Tod Creasey
on 2006-07-13 10:21:36 EDT
(
hide
)
Description:
First pass of the new API
Filename:
MIME Type:
Creator:
Tod Creasey
Created:
2006-07-13 10:21:36 EDT
Size:
46.33 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.jface >Index: src/org/eclipse/jface/viewers/TableViewer.java >=================================================================== >RCS file: /home/eclipse/org.eclipse.jface/src/org/eclipse/jface/viewers/TableViewer.java,v >retrieving revision 1.56 >diff -u -r1.56 TableViewer.java >--- src/org/eclipse/jface/viewers/TableViewer.java 15 Jun 2006 22:28:48 -0000 1.56 >+++ src/org/eclipse/jface/viewers/TableViewer.java 13 Jul 2006 14:21:51 -0000 >@@ -7,6 +7,7 @@ > * > * Contributors: > * IBM Corporation - initial API and implementation >+ * Tom Schindl <tom.schindl@bestsolution.at> (bug 83200) > *******************************************************************************/ > > package org.eclipse.jface.viewers; >@@ -16,6 +17,7 @@ > import java.util.List; > > import org.eclipse.jface.util.Assert; >+import org.eclipse.jface.util.Policy; > import org.eclipse.swt.SWT; > import org.eclipse.swt.custom.TableEditor; > import org.eclipse.swt.events.MouseAdapter; >@@ -28,6 +30,7 @@ > import org.eclipse.swt.widgets.Item; > import org.eclipse.swt.widgets.Listener; > import org.eclipse.swt.widgets.Table; >+import org.eclipse.swt.widgets.TableColumn; > import org.eclipse.swt.widgets.TableItem; > import org.eclipse.swt.widgets.Widget; > >@@ -64,178 +67,101 @@ > * @see #internalRefresh(Object, boolean) > */ > public class TableViewer extends StructuredViewer { >- >- private class VirtualManager{ >+ >+ private class VirtualManager { > > /** >- * The currently invisible elements as provided >- * by the content provider or by addition. >- * This will not be populated by an ILazyStructuredContentProvider >- * as an ILazyStructuredContentProvider is only queried >- * on the virtual callback. >+ * The currently invisible elements as provided by the content provider >+ * or by addition. This will not be populated by an >+ * ILazyStructuredContentProvider as an ILazyStructuredContentProvider >+ * is only queried on the virtual callback. > */ > private Object[] cachedElements = new Object[0]; >+ > /** > * Create a new instance of the receiver. >- * >+ * > */ >- public VirtualManager(){ >+ public VirtualManager() { > addTableListener(); > } > >- > /** > * Add the listener for SetData on the table > */ > private void addTableListener() { >- table.addListener(SWT.SetData,new Listener(){ >- /* (non-Javadoc) >+ table.addListener(SWT.SetData, new Listener() { >+ /* >+ * (non-Javadoc) >+ * > * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event) > */ > public void handleEvent(Event event) { > TableItem item = (TableItem) event.item; > final int index = table.indexOf(item); > Object element = resolveElement(index); >- if(element == null){ >- //Didn't find it so make a request >- //Keep looking if it is not in the cache. >+ if (element == null) { >+ // Didn't find it so make a request >+ // Keep looking if it is not in the cache. > IContentProvider contentProvider = getContentProvider(); >- //If we are building lazily then request lookup now >- if(contentProvider instanceof ILazyContentProvider){ >- ((ILazyContentProvider) contentProvider). >- updateElement(index); >+ // If we are building lazily then request lookup now >+ if (contentProvider instanceof ILazyContentProvider) { >+ ((ILazyContentProvider) contentProvider) >+ .updateElement(index); > return; >- } >+ } > } >- >- >- associate(element,item); >- updateItem(item,element); >+ >+ associate(element, item); >+ updateItem(item, element); > } > > }); > } >- >+ > /** >- * Get the element at index.Resolve it lazily if this >- * is available. >+ * Get the element at index.Resolve it lazily if this is available. >+ * > * @param index >- * @return Object or <code>null</code> if it could >- * not be found >+ * @return Object or <code>null</code> if it could not be found > */ > protected Object resolveElement(int index) { >- >+ > Object element = null; >- if(index < cachedElements.length) { >- element = cachedElements[index]; >+ if (index < cachedElements.length) { >+ element = cachedElements[index]; > } >- >+ > return element; > } > > /** > * A non visible item has been added. >+ * > * @param element > * @param index > */ > public void notVisibleAdded(Object element, int index) { >- >+ > int requiredCount = index + 1; >- >- if(requiredCount > getTable().getItemCount()){ >+ >+ if (requiredCount > getTable().getItemCount()) { > getTable().setItemCount(requiredCount); > Object[] newCache = new Object[requiredCount]; >- System.arraycopy(cachedElements, 0, newCache, 0, cachedElements.length); >+ System.arraycopy(cachedElements, 0, newCache, 0, >+ cachedElements.length); > cachedElements = newCache; > } >- >- >+ > cachedElements[index] = element; >- >+ > } >- >+ > } >- >+ > private VirtualManager virtualManager; >- >- /** >- * TableColorAndFontNoOp is an optimization for tables without >- * color and font support. >- * @see ITableColorProvider >- * @see ITableFontProvider >- */ >- private class TableColorAndFontNoOp{ >- >- /** >- * Create a new instance of the receiver. >- * >- */ >- TableColorAndFontNoOp(){ >- >- } >- >- /** >- * Set the fonts and colors for the tableItem if there is a color >- * and font provider available. >- * @param tableItem The item to update. >- * @param element The element being represented >- * @param column The column index >- */ >- public void setFontsAndColors(TableItem tableItem, Object element, int column){ >- } >- >- } > > /** >- * TableColorAndFontCollector is an helper class for color and font >- * support for tables that support the ITableFontProvider and >- * the ITableColorProvider. >- * @see ITableColorProvider >- * @see ITableFontProvider >- */ >- >- private class TableColorAndFontCollector extends TableColorAndFontNoOp{ >- >- ITableFontProvider fontProvider = null; >- ITableColorProvider colorProvider = null; >- >- /** >- * Create an instance of the receiver. Set the color and font >- * providers if provider can be cast to the correct type. >- * @param provider IBaseLabelProvider >- */ >- public TableColorAndFontCollector(IBaseLabelProvider provider){ >- if(provider instanceof ITableFontProvider) { >- fontProvider = (ITableFontProvider) provider; >- } >- if(provider instanceof ITableColorProvider) { >- colorProvider = (ITableColorProvider) provider; >- } >- } >- >- >- /** >- * Set the fonts and colors for the tableItem if there is a color >- * and font provider available. >- * @param tableItem The item to update. >- * @param element The element being represented >- * @param column The column index >- */ >- public void setFontsAndColors(TableItem tableItem, Object element, int column){ >- if (colorProvider != null) { >- tableItem.setBackground(column, colorProvider.getBackground(element, >- column)); >- tableItem.setForeground(column, colorProvider.getForeground(element, >- column)); >- } >- if(fontProvider != null) { >- tableItem.setFont(column,fontProvider.getFont(element,column)); >- } >- } >- >- } >- >- /** > * Internal table viewer implementation. > */ > private TableEditorImpl tableViewerImpl; >@@ -249,12 +175,13 @@ > * This viewer's table editor. > */ > private TableEditor tableEditor; >+ > >- /** >- * The color and font collector for the cells. >- */ >- private TableColorAndFontNoOp tableColorAndFont = new TableColorAndFontNoOp(); >- >+ >+ private ViewerLabelProvider viewerLabelProvider; >+ >+ private static String TABLE_VIEWER_KEY = Policy.JFACE + ".columnViewer";//$NON-NLS-1$ >+ > /** > * Creates a table viewer on a newly-created table control under the given > * parent. The table control is created using the SWT style bits >@@ -281,7 +208,7 @@ > * SWT style bits > */ > public TableViewer(Composite parent, int style) { >- this(new Table(parent, style)); >+ this(new Table(parent, style)); > } > > /** >@@ -299,19 +226,19 @@ > initTableViewerImpl(); > initializeVirtualManager(table.getStyle()); > } >- >+ > /** >- * Initialize the virtual manager to manage the virtual state >- * if the table is VIRTUAL. If not use the default no-op >- * version. >+ * Initialize the virtual manager to manage the virtual state if the table >+ * is VIRTUAL. If not use the default no-op version. >+ * > * @param style > */ > private void initializeVirtualManager(int style) { >- if((style & SWT.VIRTUAL) == 0) { >+ if ((style & SWT.VIRTUAL) == 0) { > return; > } >- >- virtualManager = new VirtualManager(); >+ >+ virtualManager = new VirtualManager(); > } > > /** >@@ -330,7 +257,7 @@ > public void add(Object[] elements) { > assertElementsNotNull(elements); > Object[] filtered = filter(elements); >- >+ > for (int i = 0; i < filtered.length; i++) { > Object element = filtered[i]; > int index = indexForElement(element); >@@ -340,17 +267,18 @@ > > /** > * Create a new TableItem at index if required. >+ * > * @param element > * @param index > * > * @since 3.1 > */ > private void createItem(Object element, int index) { >- if(virtualManager == null) { >+ if (virtualManager == null) { > updateItem(new TableItem(getTable(), SWT.NONE, index), element); >- } else{ >- virtualManager.notVisibleAdded(element,index); >- >+ } else { >+ virtualManager.notVisibleAdded(element, index); >+ > } > } > >@@ -382,7 +310,8 @@ > } > > /* >- * (non-Javadoc) >+ * (non-Javadoc) >+ * > * @see org.eclipse.jface.viewers.StructuredViewer#doFindInputItem(java.lang.Object) > */ > protected Widget doFindInputItem(Object element) { >@@ -393,11 +322,12 @@ > } > > /* >- * (non-Javadoc) >+ * (non-Javadoc) >+ * > * @see org.eclipse.jface.viewers.StructuredViewer#doFindItem(java.lang.Object) > */ > protected Widget doFindItem(Object element) { >- >+ > TableItem[] children = table.getItems(); > for (int i = 0; i < children.length; i++) { > TableItem item = children[i]; >@@ -411,8 +341,10 @@ > } > > /* >- * (non-Javadoc) >- * @see org.eclipse.jface.viewers.StructuredViewer#doUpdateItem(org.eclipse.swt.widgets.Widget, java.lang.Object, boolean) >+ * (non-Javadoc) >+ * >+ * @see org.eclipse.jface.viewers.StructuredViewer#doUpdateItem(org.eclipse.swt.widgets.Widget, >+ * java.lang.Object, boolean) > */ > protected void doUpdateItem(Widget widget, Object element, boolean fullMap) { > if (widget instanceof TableItem) { >@@ -422,87 +354,74 @@ > if (fullMap) { > associate(element, item); > } else { >- Object data = item.getData(); >- if (data != null) { >- unmapElement(data, item); >- } >+ Object data = item.getData(); >+ if (data != null) { >+ unmapElement(data, item); >+ } > item.setData(element); > mapElement(element, item); > } > >- IBaseLabelProvider prov = getLabelProvider(); >- ITableLabelProvider tprov = null; >- ILabelProvider lprov = null; >- IViewerLabelProvider vprov = null; >- >- if(prov instanceof ILabelProvider) { >- lprov = (ILabelProvider) prov; >- } >- >- if (prov instanceof IViewerLabelProvider) { >- vprov = (IViewerLabelProvider) prov; >- } >- >- if (prov instanceof ITableLabelProvider) { >- tprov = (ITableLabelProvider) prov; >- } >- > int columnCount = table.getColumnCount(); >- TableItem ti = item; >- getColorAndFontCollector().setFontsAndColors(element); >- >+ > // Also enter loop if no columns added. See 1G9WWGZ: JFUIF:WINNT - > // TableViewer with 0 columns does not work > for (int column = 0; column < columnCount || column == 0; column++) { >- // Similar code in TreeViewer.doUpdateItem() >- String text = "";//$NON-NLS-1$ >- Image image = null; >- tableColorAndFont.setFontsAndColors(ti,element,column); >- >- if (tprov == null) { >- if (column == 0) { >- ViewerLabel updateLabel = new ViewerLabel(item >- .getText(), item.getImage()); >- >- if(vprov != null) { >- buildLabel(updateLabel,element,vprov); >- } else{ >- if(lprov != null) { >- buildLabel(updateLabel,element,lprov); >- } >- } >- >-// As it is possible for user code to run the event >- //loop check here. >- if (item.isDisposed()) { >- unmapElement(element, item); >- return; >- } >- >- text = updateLabel.getText(); >- image = updateLabel.getImage(); >- } >- } else { >- text = tprov.getColumnText(element, column); >- image = tprov.getColumnImage(element, column); >- } >+ TableColumnViewerPart columnViewer = getColumnViewer(column); >+ columnViewer.refresh(item, element); > >- //Avoid setting text to null >- if (text == null) { >- text = ""; //$NON-NLS-1$ >- } >- ti.setText(column, text); >- if (ti.getImage(column) != image) { >- ti.setImage(column, image); >+ // As it is possible for user code to run the event >+ // loop check here. >+ if (item.isDisposed()) { >+ unmapElement(element, item); >+ return; > } >+ > } >- >- >- getColorAndFontCollector().applyFontsAndColors(ti); >+ > } > } > > /** >+ * Return the TableColumnViewer at columnIndex >+ * >+ * @param columnIndex >+ * @return TableColumnViewer >+ */ >+ public TableColumnViewerPart getColumnViewer(int columnIndex) { >+ TableColumn column = getTable().getColumn(columnIndex); >+ Object viewer = column.getData(TABLE_VIEWER_KEY); >+ if (viewer == null){ >+ viewer = new TableColumnViewerPart( >+ createViewerLabelProvider(columnIndex), columnIndex); >+ column.setData(TABLE_VIEWER_KEY, viewer); >+ } >+ return (TableColumnViewerPart) viewer; >+ } >+ >+ /** >+ * Set the TableColumnViewerPart at columnIndex to be >+ * viewerPart. >+ * @param viewerPart >+ * @param columnIndex >+ */ >+ public void setTableColumnPart(TableColumnViewerPart viewerPart, int columnIndex){ >+ TableColumn column = getTable().getColumn(columnIndex); >+ column.setData(TABLE_VIEWER_KEY, viewerPart); >+ } >+ >+ /** >+ * Create a ViewerLabelProvider for the column at index >+ * >+ * @param columnIndex >+ * @return ViewerLabelProvider >+ */ >+ private ViewerLabelProvider createViewerLabelProvider(int columnIndex) { >+ return null;//We will create a mapping from the old >+ //api here >+ } >+ >+ /** > * Starts editing the given element. > * > * @param element >@@ -544,7 +463,8 @@ > } > > /* >- * (non-Javadoc) >+ * (non-Javadoc) >+ * > * @see org.eclipse.jface.viewers.Viewer#getControl() > */ > public Control getControl() { >@@ -588,11 +508,12 @@ > } > > /* >- * (non-Javadoc) >+ * (non-Javadoc) >+ * > * @see org.eclipse.jface.viewers.StructuredViewer#getSelectionFromWidget() > */ > protected List getSelectionFromWidget() { >- if(virtualManager != null) { >+ if (virtualManager != null) { > return getVirtualSelection(); > } > Widget[] items = table.getSelection(); >@@ -606,50 +527,49 @@ > } > return list; > } >- >+ > /** >- * Get the virtual selection. Avoid calling SWT whenever possible >- * to prevent extra widget creation. >+ * Get the virtual selection. Avoid calling SWT whenever possible to prevent >+ * extra widget creation. >+ * > * @return List of Object > */ > > private List getVirtualSelection() { >- >+ > List result = new ArrayList(); >- int[] selectionIndices = getTable().getSelectionIndices(); >- if(getContentProvider() instanceof ILazyContentProvider){ >+ int[] selectionIndices = getTable().getSelectionIndices(); >+ if (getContentProvider() instanceof ILazyContentProvider) { > ILazyContentProvider lazy = (ILazyContentProvider) getContentProvider(); > for (int i = 0; i < selectionIndices.length; i++) { > int selectionIndex = selectionIndices[i]; >- lazy.updateElement(selectionIndex);//Start the update >+ lazy.updateElement(selectionIndex);// Start the update > Object element = getTable().getItem(selectionIndex).getData(); >- //Only add the element if it got updated. >- //If this is done deferred the selection will >- //be incomplete until selection is finished. >+ // Only add the element if it got updated. >+ // If this is done deferred the selection will >+ // be incomplete until selection is finished. > if (element != null) { > result.add(element); >- } >+ } > } >- } >- else{ >+ } else { > for (int i = 0; i < selectionIndices.length; i++) { > Object element = null; >- //See if it is cached >+ // See if it is cached > int selectionIndex = selectionIndices[i]; >- if (selectionIndex < virtualManager.cachedElements.length){ >+ if (selectionIndex < virtualManager.cachedElements.length) { > element = virtualManager.cachedElements[selectionIndex]; > } >- if (element == null){ >+ if (element == null) { > // Not cached so try the item's data > TableItem item = getTable().getItem(selectionIndex); > element = item.getData(); > } > if (element != null) { > result.add(element); >- } >+ } > } >- >- >+ > } > return result; > } >@@ -664,7 +584,8 @@ > } > > /* >- * (non-Javadoc) >+ * (non-Javadoc) >+ * > * @see org.eclipse.jface.viewers.ContentViewer#hookControl(org.eclipse.swt.widgets.Control) > */ > protected void hookControl(Control control) { >@@ -757,8 +678,10 @@ > } > > /* >- * (non-Javadoc) >- * @see org.eclipse.jface.viewers.Viewer#inputChanged(java.lang.Object, java.lang.Object) >+ * (non-Javadoc) >+ * >+ * @see org.eclipse.jface.viewers.Viewer#inputChanged(java.lang.Object, >+ * java.lang.Object) > */ > protected void inputChanged(Object input, Object oldInput) { > getControl().setRedraw(false); >@@ -795,12 +718,13 @@ > if (position == -1) { > position = table.getItemCount(); > } >- >- createItem(element,position); >+ >+ createItem(element, position); > } > > /* >- * (non-Javadoc) >+ * (non-Javadoc) >+ * > * @see org.eclipse.jface.viewers.StructuredViewer#internalRefresh(java.lang.Object) > */ > protected void internalRefresh(Object element) { >@@ -808,15 +732,17 @@ > } > > /* >- * (non-Javadoc) >- * @see org.eclipse.jface.viewers.StructuredViewer#internalRefresh(java.lang.Object, boolean) >+ * (non-Javadoc) >+ * >+ * @see org.eclipse.jface.viewers.StructuredViewer#internalRefresh(java.lang.Object, >+ * boolean) > */ > protected void internalRefresh(Object element, boolean updateLabels) { > tableViewerImpl.applyEditorValue(); > if (element == null || equals(element, getRoot())) { >- if(virtualManager == null) { >+ if (virtualManager == null) { > internalRefreshAll(updateLabels); >- } else{ >+ } else { > internalVirtualRefreshAll(); > } > } else { >@@ -833,17 +759,17 @@ > * @since 3.1 > */ > private void internalVirtualRefreshAll() { >- >+ > Object root = getRoot(); > IContentProvider contentProvider = getContentProvider(); >- >- //Invalidate for lazy >- if(!(contentProvider instanceof ILazyContentProvider) >+ >+ // Invalidate for lazy >+ if (!(contentProvider instanceof ILazyContentProvider) > && (contentProvider instanceof IStructuredContentProvider)) { >- //Don't cache if the root is null but cache if it is not lazy. >- if(root != null){ >- virtualManager.cachedElements = >- ((IStructuredContentProvider) getContentProvider()).getElements(root); >+ // Don't cache if the root is null but cache if it is not lazy. >+ if (root != null) { >+ virtualManager.cachedElements = ((IStructuredContentProvider) getContentProvider()) >+ .getElements(root); > getTable().setItemCount(virtualManager.cachedElements.length); > } > } >@@ -851,8 +777,9 @@ > } > > /** >- * Refresh all of the elements of the table. update the >- * labels if updatLabels is true; >+ * Refresh all of the elements of the table. update the labels if >+ * updatLabels is true; >+ * > * @param updateLabels > * > * @since 3.1 >@@ -871,10 +798,9 @@ > TableItem[] items = getTable().getItems(); > int min = Math.min(children.length, items.length); > for (int i = 0; i < min; ++i) { >- >- >+ > TableItem item = items[i]; >- >+ > // if the element is unchanged, update its label if appropriate > if (equals(children[i], item.getData())) { > if (updateLabels) { >@@ -893,14 +819,16 @@ > // So, if the object associated with this item has changed, > // just disassociate it for now, and update it below. > item.setText(""); //$NON-NLS-1$ >- item.setImage(new Image[Math.max(1,table.getColumnCount())]);//Clear all images >+ item.setImage(new Image[Math.max(1, table.getColumnCount())]);// Clear >+ // all >+ // images > disassociate(item); > } > } > // dispose of all items beyond the end of the current elements > if (min < items.length) { > for (int i = items.length; --i >= min;) { >- >+ > disassociate(items[i]); > } > table.remove(min, items.length - 1); >@@ -912,7 +840,7 @@ > } > // Update items which were removed above > for (int i = 0; i < min; ++i) { >- >+ > TableItem item = items[i]; > if (item.getData() == null) { > updateItem(item, children[i]); >@@ -920,11 +848,10 @@ > } > // add any remaining elements > for (int i = min; i < children.length; ++i) { >- createItem(children[i],i); >+ createItem(children[i], i); > } > } > >- > /** > * Removes the given elements from this table viewer. > * >@@ -987,9 +914,9 @@ > */ > public void remove(final Object[] elements) { > assertElementsNotNull(elements); >- if (elements.length == 0) { >- return; >- } >+ if (elements.length == 0) { >+ return; >+ } > preservingSelection(new Runnable() { > public void run() { > internalRemove(elements); >@@ -1007,8 +934,8 @@ > * the model. Note that there is another method for efficiently processing > * the simultaneous removal of multiple elements. > * </p> >- * <strong>NOTE:</strong> removing an object from a virtual >- * table will decrement the itemCount. >+ * <strong>NOTE:</strong> removing an object from a virtual table will >+ * decrement the itemCount. > * > * @param element > * the element >@@ -1018,7 +945,8 @@ > } > > /* >- * (non-Javadoc) >+ * (non-Javadoc) >+ * > * @see org.eclipse.jface.viewers.StructuredViewer#reveal(java.lang.Object) > */ > public void reveal(Object element) { >@@ -1079,34 +1007,36 @@ > * may also implement {@link IColorProvider} and/or {@link IFontProvider} to > * provide colors and/or fonts. > * </p> >+ * <p> >+ * If the label provider implements the mixin interface ITooltipProvider, it >+ * can provide custom tooltips. >+ * </p> > */ > public void setLabelProvider(IBaseLabelProvider labelProvider) { > Assert.isTrue(labelProvider instanceof ITableLabelProvider > || labelProvider instanceof ILabelProvider); > super.setLabelProvider(labelProvider); >- if(labelProvider instanceof ITableFontProvider || labelProvider instanceof ITableColorProvider) { >- tableColorAndFont = new TableColorAndFontCollector(labelProvider); >- } else { >- tableColorAndFont = new TableColorAndFontNoOp(); >- } >- >+ viewerLabelProvider = new ViewerLabelProvider(); >+ viewerLabelProvider.setProviders(labelProvider); > } >- >+ > /** > * <p> >- * Sets a new selection for this viewer and optionally makes it visible. >- * The TableViewer implmentation of this method is ineffecient for the >+ * Sets a new selection for this viewer and optionally makes it visible. The >+ * TableViewer implmentation of this method is ineffecient for the > * ILazyContentProvider as lookup is done by indices rather than elements >- * and may require population of the entire table in worse case. >+ * and may require population of the entire table in worse case. > * </p> > * <p> >- * Use Table#setSelection(int[] indices) and Table#showSelection() if >- * you wish to set selection more effeciently when using a ILazyContentProvider. >+ * Use Table#setSelection(int[] indices) and Table#showSelection() if you >+ * wish to set selection more effeciently when using a ILazyContentProvider. > * </p> > * >- * @param selection the new selection >- * @param reveal <code>true</code> if the selection is to be made >- * visible, and <code>false</code> otherwise >+ * @param selection >+ * the new selection >+ * @param reveal >+ * <code>true</code> if the selection is to be made visible, >+ * and <code>false</code> otherwise > * @see Table#setSelection(int[]) > * @see Table#showSelection() > */ >@@ -1115,21 +1045,23 @@ > } > > /* >- * (non-Javadoc) >- * @see org.eclipse.jface.viewers.StructuredViewer#setSelectionToWidget(java.util.List, boolean) >+ * (non-Javadoc) >+ * >+ * @see org.eclipse.jface.viewers.StructuredViewer#setSelectionToWidget(java.util.List, >+ * boolean) > */ > protected void setSelectionToWidget(List list, boolean reveal) { >- >+ > if (list == null) { > table.deselectAll(); > return; > } >- >- if(virtualManager != null){ >+ >+ if (virtualManager != null) { > virtualSetSelectionToWidget(list, reveal); > return; > } >- >+ > int size = list.size(); > TableItem[] items = new TableItem[size]; > int count = 0; >@@ -1149,22 +1081,24 @@ > if (reveal) { > table.showSelection(); > } >- >+ > } >- >- >+ > /** > * Set the selection on a virtual table >- * @param list The elements to set >- * @param reveal Whether or not reveal the first item. >+ * >+ * @param list >+ * The elements to set >+ * @param reveal >+ * Whether or not reveal the first item. > */ > private void virtualSetSelectionToWidget(List list, boolean reveal) { > int size = list.size(); > int[] indices = new int[list.size()]; >- >+ > TableItem firstItem = null; > int count = 0; >- HashSet virtualElements = new HashSet(); >+ HashSet virtualElements = new HashSet(); > for (int i = 0; i < size; ++i) { > Object o = list.get(i); > Widget w = findItem(o); >@@ -1178,37 +1112,38 @@ > virtualElements.add(o); > } > } >- >- if(getContentProvider() instanceof ILazyContentProvider){ >- ILazyContentProvider provider = >- (ILazyContentProvider) getContentProvider(); >- >- //Now go through it again until all is done or we are no longer virtual >- //This may create all items so it is not a good >- //idea in general. >- //Use #setSelection (int [] indices,boolean reveal) instead >- for (int i = 0; virtualElements.size() > 0 && i < getTable().getItemCount(); i++) { >+ >+ if (getContentProvider() instanceof ILazyContentProvider) { >+ ILazyContentProvider provider = (ILazyContentProvider) getContentProvider(); >+ >+ // Now go through it again until all is done or we are no longer >+ // virtual >+ // This may create all items so it is not a good >+ // idea in general. >+ // Use #setSelection (int [] indices,boolean reveal) instead >+ for (int i = 0; virtualElements.size() > 0 >+ && i < getTable().getItemCount(); i++) { > provider.updateElement(i); > TableItem item = getTable().getItem(i); >- if(virtualElements.contains(item.getData())){ >- indices[count++] = i; >+ if (virtualElements.contains(item.getData())) { >+ indices[count++] = i; > virtualElements.remove(item.getData()); > if (firstItem == null) { > firstItem = item; > } > } > } >- } >- else{ >- >- if(count != list.size()){//As this is expensive skip it if all have been found >- //If it is not lazy we can use the cache >+ } else { >+ >+ if (count != list.size()) {// As this is expensive skip it if all >+ // have been found >+ // If it is not lazy we can use the cache > for (int i = 0; i < virtualManager.cachedElements.length; i++) { > Object element = virtualManager.cachedElements[i]; >- if(virtualElements.contains(element)){ >+ if (virtualElements.contains(element)) { > TableItem item = getTable().getItem(i); >- item.getText();//Be sure to fire the update >- indices[count++] = i; >+ item.getText();// Be sure to fire the update >+ indices[count++] = i; > virtualElements.remove(element); > if (firstItem == null) { > firstItem = item; >@@ -1217,7 +1152,7 @@ > } > } > } >- >+ > if (count < size) { > System.arraycopy(indices, 0, indices = new int[count], 0, count); > } >@@ -1230,35 +1165,39 @@ > > /** > * Set the item count of the receiver. >- * @param count the new table size. >+ * >+ * @param count >+ * the new table size. > * > * @since 3.1 > */ >- public void setItemCount(int count){ >+ public void setItemCount(int count) { > getTable().setItemCount(count); > getTable().redraw(); > } >- >+ > /** >- * Replace the entries starting at index with elements. >- * This method assumes all of these values are correct >- * and will not call the content provider to verify. >- * <strong>Note that this method will create a TableItem >- * for all of the elements provided</strong>. >+ * Replace the entries starting at index with elements. This method assumes >+ * all of these values are correct and will not call the content provider to >+ * verify. <strong>Note that this method will create a TableItem for all of >+ * the elements provided</strong>. >+ * > * @param element > * @param index > * @see ILazyContentProvider > * > * @since 3.1 > */ >- public void replace(Object element, int index){ >+ public void replace(Object element, int index) { > TableItem item = getTable().getItem(index); > refreshItem(item, element); > } > > /** > * Clear the table item at the specified index >- * @param index the index of the table item to be cleared >+ * >+ * @param index >+ * the index of the table item to be cleared > * > * @since 3.1 > */ >@@ -1269,26 +1208,28 @@ > } > table.clear(index); > } >- >- /* (non-Javadoc) >+ >+ /* >+ * (non-Javadoc) >+ * > * @see org.eclipse.jface.viewers.StructuredViewer#getRawChildren(java.lang.Object) > */ > protected Object[] getRawChildren(Object parent) { > >- Assert.isTrue(!(getContentProvider() instanceof ILazyContentProvider),"Cannot get raw children with an ILazyContentProvider");//$NON-NLS-1$ >+ Assert.isTrue(!(getContentProvider() instanceof ILazyContentProvider), >+ "Cannot get raw children with an ILazyContentProvider");//$NON-NLS-1$ > return super.getRawChildren(parent); >- >+ > } >- >- /* (non-Javadoc) >+ >+ /* >+ * (non-Javadoc) >+ * > * @see org.eclipse.jface.viewers.StructuredViewer#assertContentProviderType(org.eclipse.jface.viewers.IContentProvider) > */ > protected void assertContentProviderType(IContentProvider provider) { >- Assert.isTrue(provider instanceof IStructuredContentProvider || >- provider instanceof ILazyContentProvider); >+ Assert.isTrue(provider instanceof IStructuredContentProvider >+ || provider instanceof ILazyContentProvider); > } >- >- >- >-} > >+} >Index: src/org/eclipse/jface/viewers/DecoratingLabelProvider.java >=================================================================== >RCS file: /home/eclipse/org.eclipse.jface/src/org/eclipse/jface/viewers/DecoratingLabelProvider.java,v >retrieving revision 1.20 >diff -u -r1.20 DecoratingLabelProvider.java >--- src/org/eclipse/jface/viewers/DecoratingLabelProvider.java 19 Apr 2006 21:05:56 -0000 1.20 >+++ src/org/eclipse/jface/viewers/DecoratingLabelProvider.java 13 Jul 2006 14:21:51 -0000 >@@ -22,10 +22,8 @@ > * The decorator decorates the label text, image, font and colors provided by > * the nested label provider. > */ >-public class DecoratingLabelProvider extends LabelProvider implements >- ILabelProvider, IViewerLabelProvider, IColorProvider, IFontProvider, ITreePathLabelProvider { >+public class DecoratingLabelProvider extends TreeViewerLabelProvider { > >- private ILabelProvider provider; > > private ILabelDecorator decorator; > >@@ -44,7 +42,7 @@ > public DecoratingLabelProvider(ILabelProvider provider, > ILabelDecorator decorator) { > Assert.isNotNull(provider); >- this.provider = provider; >+ setProviders(provider); > this.decorator = decorator; > } > >@@ -56,7 +54,7 @@ > */ > public void addListener(ILabelProviderListener listener) { > super.addListener(listener); >- provider.addListener(listener); >+ getLabelProvider().addListener(listener); > if (decorator != null) { > decorator.addListener(listener); > } >@@ -68,7 +66,7 @@ > * disposes both the nested label provider and the label decorator. > */ > public void dispose() { >- provider.dispose(); >+ getLabelProvider().dispose(); > if (decorator != null) { > decorator.dispose(); > } >@@ -82,7 +80,7 @@ > * <code>decorateImage</code> method. > */ > public Image getImage(Object element) { >- Image image = provider.getImage(element); >+ Image image = getLabelProvider().getImage(element); > if (decorator != null) { > if (decorator instanceof LabelDecorator) { > LabelDecorator ld2 = (LabelDecorator) decorator; >@@ -110,15 +108,6 @@ > } > > /** >- * Returns the nested label provider. >- * >- * @return the nested label provider >- */ >- public ILabelProvider getLabelProvider() { >- return provider; >- } >- >- /** > * The <code>DecoratingLabelProvider</code> implementation of this > * <code>ILabelProvider</code> method returns the text label provided > * by the nested label provider's <code>getText</code> method, >@@ -126,7 +115,7 @@ > * <code>decorateText</code> method. > */ > public String getText(Object element) { >- String text = provider.getText(element); >+ String text = getLabelProvider().getText(element); > if (decorator != null) { > if (decorator instanceof LabelDecorator) { > LabelDecorator ld2 = (LabelDecorator) decorator; >@@ -151,7 +140,7 @@ > * decorator returns <code>true</code>. > */ > public boolean isLabelProperty(Object element, String property) { >- if (provider.isLabelProperty(element, property)) { >+ if (getLabelProvider().isLabelProperty(element, property)) { > return true; > } > if (decorator != null && decorator.isLabelProperty(element, property)) { >@@ -168,7 +157,7 @@ > */ > public void removeListener(ILabelProviderListener listener) { > super.removeListener(listener); >- provider.removeListener(listener); >+ getLabelProvider().removeListener(listener); > if (decorator != null) { > decorator.removeListener(listener); > } >@@ -260,36 +249,6 @@ > > } > >- /* (non-Javadoc) >- * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object) >- */ >- public Color getBackground(Object element) { >- if(provider instanceof IColorProvider) { >- return ((IColorProvider) provider).getBackground(element); >- } >- return null; >- } >- >- /* (non-Javadoc) >- * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object) >- */ >- public Font getFont(Object element) { >- if(provider instanceof IFontProvider) { >- return ((IFontProvider) provider).getFont(element); >- } >- return null; >- } >- >- /* (non-Javadoc) >- * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object) >- */ >- public Color getForeground(Object element) { >- if(provider instanceof IColorProvider) { >- return ((IColorProvider) provider).getForeground(element); >- } >- return null; >- } >- > /** > * Return the decoration context associated with this label provider. > * It will be passed to the decorator if the decorator is an >@@ -314,8 +273,10 @@ > this.decorationContext = decorationContext; > } > >+ >+ > /* (non-Javadoc) >- * @see org.eclipse.jface.viewers.ITreePathLabelProvider#updateLabel(org.eclipse.jface.viewers.ViewerLabel, org.eclipse.jface.viewers.TreePath) >+ * @see org.eclipse.jface.viewers.TreeViewerLabelProvider#updateLabel(org.eclipse.jface.viewers.ViewerLabel, org.eclipse.jface.viewers.TreePath) > */ > public void updateLabel(ViewerLabel settings, TreePath elementPath) { > ILabelDecorator currentDecorator = getLabelDecorator(); >@@ -338,8 +299,8 @@ > settings.setHasPendingDecorations(!decorationReady); > // update icon and label > >- if (provider instanceof ITreePathLabelProvider) { >- ITreePathLabelProvider pprov = (ITreePathLabelProvider) provider; >+ if (getTreePathProvider() == null) { >+ ITreePathLabelProvider pprov = (ITreePathLabelProvider) getLabelProvider(); > if (decorationReady || oldText == null > || settings.getText().length() == 0) { > pprov.updateLabel(settings, elementPath); >Index: src/org/eclipse/jface/viewers/ViewerLabelProvider.java >=================================================================== >RCS file: src/org/eclipse/jface/viewers/ViewerLabelProvider.java >diff -N src/org/eclipse/jface/viewers/ViewerLabelProvider.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/jface/viewers/ViewerLabelProvider.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,184 @@ >+/******************************************************************************* >+ * Copyright (c) 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 Corporation - initial API and implementation >+ ******************************************************************************/ >+ >+package org.eclipse.jface.viewers; >+ >+import org.eclipse.swt.graphics.Color; >+import org.eclipse.swt.graphics.Font; >+ >+/** >+ * @since 3.2 >+ * >+ */ >+public class ViewerLabelProvider extends LabelProvider implements >+ ILabelProvider, IViewerLabelProvider, IColorProvider, IFontProvider { >+ >+ private static IFontProvider defaultFontProvider = new IFontProvider() { >+ /* >+ * (non-Javadoc) >+ * >+ * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object) >+ */ >+ public Font getFont(Object element) { >+ return null; >+ } >+ }; >+ >+ private static IColorProvider defaultColorProvider = new IColorProvider() { >+ /* >+ * (non-Javadoc) >+ * >+ * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object) >+ */ >+ public Color getBackground(Object element) { >+ return null; >+ } >+ >+ /* >+ * (non-Javadoc) >+ * >+ * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object) >+ */ >+ public Color getForeground(Object element) { >+ return null; >+ } >+ }; >+ >+ private static ILabelProvider defaultLabelProvider = new LabelProvider(){ >+ >+ }; >+ >+ private ILabelProvider labelProvider = defaultLabelProvider; >+ >+ private IColorProvider colorProvider = defaultColorProvider; >+ >+ private IFontProvider fontProvider = defaultFontProvider; >+ >+ /* >+ * (non-Javadoc) >+ * >+ * @see org.eclipse.jface.viewers.IViewerLabelProvider#updateLabel(org.eclipse.jface.viewers.ViewerLabel, >+ * java.lang.Object) >+ */ >+ public void updateLabel(ViewerLabel label, Object element) { >+ label.setText(labelProvider.getText(element)); >+ label.setImage(labelProvider.getImage(element)); >+ >+ if (colorProvider != null) { >+ label.setBackground(colorProvider.getBackground(element)); >+ label.setForeground(colorProvider.getForeground(element)); >+ } >+ >+ if (fontProvider != null) { >+ label.setFont(fontProvider.getFont(element)); >+ } >+ >+ } >+ >+ /** >+ * Set the colorProvider to use for the receiver. >+ * >+ * @param colorProvider >+ * The colorProvider to set. >+ */ >+ public void setColorProvider(IColorProvider colorProvider) { >+ this.colorProvider = colorProvider; >+ } >+ >+ /** >+ * Set the fontProvider to fontProvider. >+ * >+ * @param fontProvider >+ * The fontProvider to set. >+ */ >+ public void setFontProvider(IFontProvider fontProvider) { >+ this.fontProvider = fontProvider; >+ } >+ >+ /** >+ * Set the labelProvider to be provider. >+ * >+ * @param provider >+ * ILabelProvider provider to set. >+ */ >+ public void setLabelProvider(ILabelProvider provider) { >+ this.labelProvider = provider; >+ } >+ >+ /** >+ * Set the any providers for the receiver that can be adapted from provider. >+ * >+ * @param provider >+ */ >+ public void setProviders(Object provider) { >+ if (provider instanceof ILabelProvider) >+ labelProvider = (ILabelProvider) provider; >+ if (provider instanceof IColorProvider) >+ colorProvider = (IColorProvider) provider; >+ if (provider instanceof IFontProvider) >+ fontProvider = (IFontProvider) provider; >+ >+ } >+ >+ /* >+ * (non-Javadoc) >+ * >+ * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object) >+ */ >+ public Font getFont(Object element) { >+ return fontProvider.getFont(element); >+ >+ } >+ >+ /* >+ * (non-Javadoc) >+ * >+ * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object) >+ */ >+ public Color getBackground(Object element) { >+ return colorProvider.getBackground(element); >+ } >+ >+ /* >+ * (non-Javadoc) >+ * >+ * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object) >+ */ >+ public Color getForeground(Object element) { >+ return colorProvider.getForeground(element); >+ } >+ >+ /** >+ * Get the IColorProvider for the receiver. >+ * @return IColorProvider >+ */ >+ public IColorProvider getColorProvider() { >+ return colorProvider; >+ } >+ >+ /** >+ * Get the IFontProvider for the receiver. >+ * @return IFontProvider >+ */ >+ public IFontProvider getFontProvider() { >+ return fontProvider; >+ } >+ >+ /** >+ * @return Returns the labelProvider. >+ */ >+ public ILabelProvider getLabelProvider() { >+ return labelProvider; >+ } >+ >+ >+ >+} >Index: src/org/eclipse/jface/viewers/TableColumnViewerPart.java >=================================================================== >RCS file: src/org/eclipse/jface/viewers/TableColumnViewerPart.java >diff -N src/org/eclipse/jface/viewers/TableColumnViewerPart.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/jface/viewers/TableColumnViewerPart.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,80 @@ >+/******************************************************************************* >+ * Copyright (c) 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 Corporation - initial API and implementation >+ ******************************************************************************/ >+ >+package org.eclipse.jface.viewers; >+ >+import org.eclipse.swt.widgets.TableColumn; >+import org.eclipse.swt.widgets.TableItem; >+ >+/** >+ * The TableColumnViewer is the viewer for a TableColumn. >+ * >+ * @since 3.3 >+ * >+ */ >+public class TableColumnViewerPart { >+ >+ private TableColumn tableColumn; >+ private int index; >+ private ViewerLabelProvider labelProvider; >+ >+ >+ /** >+ * Create a new instance of the receiver at >+ * @param provider >+ * @param columnIndex >+ */ >+ public TableColumnViewerPart(ViewerLabelProvider provider, int columnIndex) { >+ index = columnIndex; >+ labelProvider = provider; >+ } >+ >+ >+ /** >+ * @param item >+ * @param element >+ */ >+ public void refresh(TableItem item, Object element) { >+ >+ ViewerLabel label = new ViewerLabel(item.getText(index),item.getImage(index)); >+ labelProvider.updateLabel(label,element); >+ >+ if(label.hasNewBackground()) >+ item.setBackground(index, label.getBackground()); >+ >+ if(label.hasNewForeground()) >+ item.setForeground(index, label.getForeground()); >+ >+ if(label.hasNewFont()) >+ item.setFont(index, label.getFont()); >+ >+ if(label.hasNewText()) >+ item.setText(index, label.getText()); >+ >+ if(label.hasNewImage()) >+ item.setImage(index, label.getImage()); >+ >+ >+ } >+ >+ >+ /** >+ * @return Returns the tableColumn. >+ */ >+ public TableColumn getTableColumn() { >+ return tableColumn; >+ } >+ >+ >+} >+ >+ >+ >Index: src/org/eclipse/jface/viewers/TreeViewerLabelProvider.java >=================================================================== >RCS file: src/org/eclipse/jface/viewers/TreeViewerLabelProvider.java >diff -N src/org/eclipse/jface/viewers/TreeViewerLabelProvider.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/jface/viewers/TreeViewerLabelProvider.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,53 @@ >+/******************************************************************************* >+ * Copyright (c) 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 Corporation - initial API and implementation >+ ******************************************************************************/ >+ >+package org.eclipse.jface.viewers; >+ >+ >+/** >+ * TreeViewerLabelProvider is the ViewerLabelProvider that handles >+ * TreePaths. >+ * @since 3.2 >+ * >+ */ >+public class TreeViewerLabelProvider extends ViewerLabelProvider { >+ private ITreePathLabelProvider treePathProvider; >+ >+ >+ >+ /** >+ * Update the label for the element with TreePath. >+ * @param label >+ * @param elementPath >+ */ >+ public void updateLabel(ViewerLabel label, TreePath elementPath) { >+ treePathProvider.updateLabel(label, elementPath); >+ >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.jface.viewers.ViewerLabelProvider#setProviders(java.lang.Object) >+ */ >+ public void setProviders(Object provider) { >+ super.setProviders(provider); >+ if(provider instanceof ITreePathLabelProvider) >+ treePathProvider = (ITreePathLabelProvider) provider; >+ } >+ >+ /** >+ * Return the ITreePathLabelProvider for the receiver. >+ * @return Returns the treePathProvider. >+ */ >+ public ITreePathLabelProvider getTreePathProvider() { >+ return treePathProvider; >+ } >+ >+}
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 149193
:
46241
|
46254
|
46263
|
46677
|
46686
|
47008
|
47350
|
47453
|
47454
|
47472
|
47722
|
47944
|
48028
|
48089