Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 149193 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/jface/viewers/TableViewer.java (-335 / +276 lines)
Lines 7-12 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
9
 *     IBM Corporation - initial API and implementation
10
 *     Tom Schindl <tom.schindl@bestsolution.at> (bug 83200)
10
 *******************************************************************************/
11
 *******************************************************************************/
11
12
12
package org.eclipse.jface.viewers;
13
package org.eclipse.jface.viewers;
Lines 16-21 Link Here
16
import java.util.List;
17
import java.util.List;
17
18
18
import org.eclipse.jface.util.Assert;
19
import org.eclipse.jface.util.Assert;
20
import org.eclipse.jface.util.Policy;
19
import org.eclipse.swt.SWT;
21
import org.eclipse.swt.SWT;
20
import org.eclipse.swt.custom.TableEditor;
22
import org.eclipse.swt.custom.TableEditor;
21
import org.eclipse.swt.events.MouseAdapter;
23
import org.eclipse.swt.events.MouseAdapter;
Lines 28-33 Link Here
28
import org.eclipse.swt.widgets.Item;
30
import org.eclipse.swt.widgets.Item;
29
import org.eclipse.swt.widgets.Listener;
31
import org.eclipse.swt.widgets.Listener;
30
import org.eclipse.swt.widgets.Table;
32
import org.eclipse.swt.widgets.Table;
33
import org.eclipse.swt.widgets.TableColumn;
31
import org.eclipse.swt.widgets.TableItem;
34
import org.eclipse.swt.widgets.TableItem;
32
import org.eclipse.swt.widgets.Widget;
35
import org.eclipse.swt.widgets.Widget;
33
36
Lines 64-241 Link Here
64
 * @see #internalRefresh(Object, boolean)
67
 * @see #internalRefresh(Object, boolean)
65
 */
68
 */
66
public class TableViewer extends StructuredViewer {
69
public class TableViewer extends StructuredViewer {
67
		
70
68
	private class VirtualManager{
71
	private class VirtualManager {
69
72
70
		/**
73
		/**
71
		 * The currently invisible elements as provided 
74
		 * The currently invisible elements as provided by the content provider
72
		 * by the content provider or by addition.
75
		 * or by addition. This will not be populated by an
73
		 * This will not be populated by an ILazyStructuredContentProvider
76
		 * ILazyStructuredContentProvider as an ILazyStructuredContentProvider
74
		 * as an ILazyStructuredContentProvider is only queried
77
		 * is only queried on the virtual callback.
75
		 * on the virtual callback.
76
		 */
78
		 */
77
		private Object[] cachedElements = new Object[0];
79
		private Object[] cachedElements = new Object[0];
80
78
		/**
81
		/**
79
		 * Create a new instance of the receiver.
82
		 * Create a new instance of the receiver.
80
		 *
83
		 * 
81
		 */
84
		 */
82
		public VirtualManager(){
85
		public VirtualManager() {
83
			addTableListener();
86
			addTableListener();
84
		}
87
		}
85
88
86
		
87
		/**
89
		/**
88
		 * Add the listener for SetData on the table
90
		 * Add the listener for SetData on the table
89
		 */
91
		 */
90
		private void addTableListener() {
92
		private void addTableListener() {
91
			table.addListener(SWT.SetData,new Listener(){
93
			table.addListener(SWT.SetData, new Listener() {
92
				/* (non-Javadoc)
94
				/*
95
				 * (non-Javadoc)
96
				 * 
93
				 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
97
				 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
94
				 */
98
				 */
95
				public void handleEvent(Event event) {
99
				public void handleEvent(Event event) {
96
					TableItem item = (TableItem) event.item;
100
					TableItem item = (TableItem) event.item;
97
					final int index = table.indexOf(item);
101
					final int index = table.indexOf(item);
98
					Object element = resolveElement(index);
102
					Object element = resolveElement(index);
99
					if(element == null){
103
					if (element == null) {
100
						//Didn't find it so make a request
104
						// Didn't find it so make a request
101
						//Keep looking if it is not in the cache.
105
						// Keep looking if it is not in the cache.
102
						IContentProvider contentProvider = getContentProvider();
106
						IContentProvider contentProvider = getContentProvider();
103
						//If we are building lazily then request lookup now
107
						// If we are building lazily then request lookup now
104
						if(contentProvider instanceof ILazyContentProvider){
108
						if (contentProvider instanceof ILazyContentProvider) {
105
							((ILazyContentProvider) contentProvider).
109
							((ILazyContentProvider) contentProvider)
106
								updateElement(index);
110
									.updateElement(index);
107
							return;
111
							return;
108
						}	
112
						}
109
					}
113
					}
110
						
114
111
					
115
					associate(element, item);
112
					associate(element,item);
116
					updateItem(item, element);
113
					updateItem(item,element);
114
				}
117
				}
115
118
116
			});
119
			});
117
		}
120
		}
118
		
121
119
		/**
122
		/**
120
		 * Get the element at index.Resolve it lazily if this
123
		 * Get the element at index.Resolve it lazily if this is available.
121
		 * is available.
124
		 * 
122
		 * @param index
125
		 * @param index
123
		 * @return Object or <code>null</code> if it could
126
		 * @return Object or <code>null</code> if it could not be found
124
		 * not be found
125
		 */
127
		 */
126
		protected Object resolveElement(int index) {
128
		protected Object resolveElement(int index) {
127
			
129
128
			Object element = null;
130
			Object element = null;
129
			if(index < cachedElements.length) {
131
			if (index < cachedElements.length) {
130
				element =  cachedElements[index];
132
				element = cachedElements[index];
131
			}
133
			}
132
			
134
133
			return element;
135
			return element;
134
		}
136
		}
135
137
136
		/**
138
		/**
137
		 * A non visible item has been added.
139
		 * A non visible item has been added.
140
		 * 
138
		 * @param element
141
		 * @param element
139
		 * @param index
142
		 * @param index
140
		 */
143
		 */
141
		public void notVisibleAdded(Object element, int index) {
144
		public void notVisibleAdded(Object element, int index) {
142
			
145
143
			int requiredCount = index + 1;
146
			int requiredCount = index + 1;
144
			
147
145
			if(requiredCount > getTable().getItemCount()){
148
			if (requiredCount > getTable().getItemCount()) {
146
				getTable().setItemCount(requiredCount);
149
				getTable().setItemCount(requiredCount);
147
				Object[] newCache = new Object[requiredCount];
150
				Object[] newCache = new Object[requiredCount];
148
				System.arraycopy(cachedElements, 0, newCache, 0, cachedElements.length);
151
				System.arraycopy(cachedElements, 0, newCache, 0,
152
						cachedElements.length);
149
				cachedElements = newCache;
153
				cachedElements = newCache;
150
			}
154
			}
151
			
155
152
			
153
			cachedElements[index] = element;
156
			cachedElements[index] = element;
154
			
157
155
		}
158
		}
156
		
159
157
	}
160
	}
158
	
161
159
	private VirtualManager virtualManager;
162
	private VirtualManager virtualManager;
160
	
161
	/**
162
	 * TableColorAndFontNoOp is an optimization for tables without
163
	 * color and font support.
164
	 * @see ITableColorProvider
165
	 * @see ITableFontProvider
166
	 */
167
	private class TableColorAndFontNoOp{
168
		
169
		/**
170
		 * Create a new instance of the receiver.
171
		 *
172
		 */
173
		TableColorAndFontNoOp(){
174
			
175
		}
176
		
177
		/**
178
		 * Set the fonts and colors for the tableItem if there is a color
179
		 * and font provider available.
180
		 * @param tableItem The item to update.
181
		 * @param element The element being represented
182
		 * @param column The column index
183
		 */
184
		public void setFontsAndColors(TableItem tableItem, Object element, int column){
185
		}	
186
		
187
	}
188
163
189
	/**
164
	/**
190
	 * TableColorAndFontCollector is an helper class for color and font
191
	 * support for tables that support the ITableFontProvider and
192
	 * the ITableColorProvider.
193
	 * @see ITableColorProvider
194
	 * @see ITableFontProvider
195
	 */
196
	
197
	private class TableColorAndFontCollector extends TableColorAndFontNoOp{
198
		
199
		ITableFontProvider fontProvider = null;
200
		ITableColorProvider colorProvider = null;
201
		
202
		/**
203
		 * Create an instance of the receiver. Set the color and font
204
		 * providers if provider can be cast to the correct type.
205
		 * @param provider IBaseLabelProvider
206
		 */
207
		public TableColorAndFontCollector(IBaseLabelProvider provider){
208
			if(provider instanceof ITableFontProvider) {
209
				fontProvider = (ITableFontProvider) provider;
210
			}
211
			if(provider instanceof ITableColorProvider) {
212
				colorProvider = (ITableColorProvider) provider;
213
			}
214
		}
215
	
216
		
217
		/**
218
		 * Set the fonts and colors for the tableItem if there is a color
219
		 * and font provider available.
220
		 * @param tableItem The item to update.
221
		 * @param element The element being represented
222
		 * @param column The column index
223
		 */
224
		public void setFontsAndColors(TableItem tableItem, Object element, int column){
225
			if (colorProvider != null) {
226
				tableItem.setBackground(column, colorProvider.getBackground(element,
227
						column));
228
				tableItem.setForeground(column, colorProvider.getForeground(element,
229
						column));
230
			}
231
			if(fontProvider != null) {
232
				tableItem.setFont(column,fontProvider.getFont(element,column));
233
			}
234
		}	
235
		
236
	}
237
	
238
	/**
239
	 * Internal table viewer implementation.
165
	 * Internal table viewer implementation.
240
	 */
166
	 */
241
	private TableEditorImpl tableViewerImpl;
167
	private TableEditorImpl tableViewerImpl;
Lines 249-260 Link Here
249
	 * This viewer's table editor.
175
	 * This viewer's table editor.
250
	 */
176
	 */
251
	private TableEditor tableEditor;
177
	private TableEditor tableEditor;
178
252
	
179
	
253
	/**
180
254
	 * The color and font collector for the cells.
181
	private ViewerLabelProvider viewerLabelProvider;
255
	 */
182
256
	private TableColorAndFontNoOp tableColorAndFont = new TableColorAndFontNoOp();
183
	private static String TABLE_VIEWER_KEY = Policy.JFACE + ".columnViewer";//$NON-NLS-1$
257
	
184
258
	/**
185
	/**
259
	 * Creates a table viewer on a newly-created table control under the given
186
	 * Creates a table viewer on a newly-created table control under the given
260
	 * parent. The table control is created using the SWT style bits
187
	 * parent. The table control is created using the SWT style bits
Lines 281-287 Link Here
281
	 *            SWT style bits
208
	 *            SWT style bits
282
	 */
209
	 */
283
	public TableViewer(Composite parent, int style) {
210
	public TableViewer(Composite parent, int style) {
284
		this(new Table(parent, style));			
211
		this(new Table(parent, style));
285
	}
212
	}
286
213
287
	/**
214
	/**
Lines 299-317 Link Here
299
		initTableViewerImpl();
226
		initTableViewerImpl();
300
		initializeVirtualManager(table.getStyle());
227
		initializeVirtualManager(table.getStyle());
301
	}
228
	}
302
	
229
303
	/**
230
	/**
304
	 * Initialize the virtual manager to manage the virtual state
231
	 * Initialize the virtual manager to manage the virtual state if the table
305
	 * if the table is VIRTUAL. If not use the default no-op
232
	 * is VIRTUAL. If not use the default no-op version.
306
	 * version.
233
	 * 
307
	 * @param style
234
	 * @param style
308
	 */
235
	 */
309
	private void initializeVirtualManager(int style) {
236
	private void initializeVirtualManager(int style) {
310
		if((style & SWT.VIRTUAL) == 0) {
237
		if ((style & SWT.VIRTUAL) == 0) {
311
			return;
238
			return;
312
		}
239
		}
313
			
240
314
		virtualManager = new VirtualManager();	
241
		virtualManager = new VirtualManager();
315
	}
242
	}
316
243
317
	/**
244
	/**
Lines 330-336 Link Here
330
	public void add(Object[] elements) {
257
	public void add(Object[] elements) {
331
		assertElementsNotNull(elements);
258
		assertElementsNotNull(elements);
332
		Object[] filtered = filter(elements);
259
		Object[] filtered = filter(elements);
333
		
260
334
		for (int i = 0; i < filtered.length; i++) {
261
		for (int i = 0; i < filtered.length; i++) {
335
			Object element = filtered[i];
262
			Object element = filtered[i];
336
			int index = indexForElement(element);
263
			int index = indexForElement(element);
Lines 340-356 Link Here
340
267
341
	/**
268
	/**
342
	 * Create a new TableItem at index if required.
269
	 * Create a new TableItem at index if required.
270
	 * 
343
	 * @param element
271
	 * @param element
344
	 * @param index
272
	 * @param index
345
	 * 
273
	 * 
346
	 * @since 3.1
274
	 * @since 3.1
347
	 */
275
	 */
348
	private void createItem(Object element, int index) {
276
	private void createItem(Object element, int index) {
349
		if(virtualManager == null) {
277
		if (virtualManager == null) {
350
			updateItem(new TableItem(getTable(), SWT.NONE, index), element);
278
			updateItem(new TableItem(getTable(), SWT.NONE, index), element);
351
		} else{
279
		} else {
352
			virtualManager.notVisibleAdded(element,index);
280
			virtualManager.notVisibleAdded(element, index);
353
			
281
354
		}
282
		}
355
	}
283
	}
356
284
Lines 382-388 Link Here
382
	}
310
	}
383
311
384
	/*
312
	/*
385
	 *  (non-Javadoc)
313
	 * (non-Javadoc)
314
	 * 
386
	 * @see org.eclipse.jface.viewers.StructuredViewer#doFindInputItem(java.lang.Object)
315
	 * @see org.eclipse.jface.viewers.StructuredViewer#doFindInputItem(java.lang.Object)
387
	 */
316
	 */
388
	protected Widget doFindInputItem(Object element) {
317
	protected Widget doFindInputItem(Object element) {
Lines 393-403 Link Here
393
	}
322
	}
394
323
395
	/*
324
	/*
396
	 *  (non-Javadoc)
325
	 * (non-Javadoc)
326
	 * 
397
	 * @see org.eclipse.jface.viewers.StructuredViewer#doFindItem(java.lang.Object)
327
	 * @see org.eclipse.jface.viewers.StructuredViewer#doFindItem(java.lang.Object)
398
	 */
328
	 */
399
	protected Widget doFindItem(Object element) {
329
	protected Widget doFindItem(Object element) {
400
		
330
401
		TableItem[] children = table.getItems();
331
		TableItem[] children = table.getItems();
402
		for (int i = 0; i < children.length; i++) {
332
		for (int i = 0; i < children.length; i++) {
403
			TableItem item = children[i];
333
			TableItem item = children[i];
Lines 411-418 Link Here
411
	}
341
	}
412
342
413
	/*
343
	/*
414
	 *  (non-Javadoc)
344
	 * (non-Javadoc)
415
	 * @see org.eclipse.jface.viewers.StructuredViewer#doUpdateItem(org.eclipse.swt.widgets.Widget, java.lang.Object, boolean)
345
	 * 
346
	 * @see org.eclipse.jface.viewers.StructuredViewer#doUpdateItem(org.eclipse.swt.widgets.Widget,
347
	 *      java.lang.Object, boolean)
416
	 */
348
	 */
417
	protected void doUpdateItem(Widget widget, Object element, boolean fullMap) {
349
	protected void doUpdateItem(Widget widget, Object element, boolean fullMap) {
418
		if (widget instanceof TableItem) {
350
		if (widget instanceof TableItem) {
Lines 422-508 Link Here
422
			if (fullMap) {
354
			if (fullMap) {
423
				associate(element, item);
355
				associate(element, item);
424
			} else {
356
			} else {
425
            	Object data = item.getData();
357
				Object data = item.getData();
426
            	if (data != null) {
358
				if (data != null) {
427
            		unmapElement(data, item);
359
					unmapElement(data, item);
428
            	}
360
				}
429
				item.setData(element);
361
				item.setData(element);
430
				mapElement(element, item);
362
				mapElement(element, item);
431
			}
363
			}
432
364
433
			IBaseLabelProvider prov = getLabelProvider();
434
			ITableLabelProvider tprov = null;		
435
			ILabelProvider lprov = null;
436
			IViewerLabelProvider vprov = null;
437
			
438
			if(prov instanceof ILabelProvider) {
439
				lprov = (ILabelProvider) prov;
440
			}
441
			
442
			if (prov instanceof IViewerLabelProvider) {
443
				vprov = (IViewerLabelProvider) prov;
444
			} 
445
446
			if (prov instanceof ITableLabelProvider) {
447
				tprov = (ITableLabelProvider) prov;
448
			} 
449
			
450
			int columnCount = table.getColumnCount();
365
			int columnCount = table.getColumnCount();
451
			TableItem ti = item;
366
452
			getColorAndFontCollector().setFontsAndColors(element);
453
			
454
			// Also enter loop if no columns added. See 1G9WWGZ: JFUIF:WINNT -
367
			// Also enter loop if no columns added. See 1G9WWGZ: JFUIF:WINNT -
455
			// TableViewer with 0 columns does not work
368
			// TableViewer with 0 columns does not work
456
			for (int column = 0; column < columnCount || column == 0; column++) {
369
			for (int column = 0; column < columnCount || column == 0; column++) {
457
				// Similar code in TreeViewer.doUpdateItem()
370
				TableColumnViewerPart columnViewer = getColumnViewer(column);
458
				String text = "";//$NON-NLS-1$
371
				columnViewer.refresh(item, element);
459
				Image image = null;
460
				tableColorAndFont.setFontsAndColors(ti,element,column);
461
462
				if (tprov == null) {
463
					if (column == 0) {
464
						ViewerLabel updateLabel = new ViewerLabel(item
465
								.getText(), item.getImage());
466
						
467
						if(vprov != null) {
468
							buildLabel(updateLabel,element,vprov);
469
						} else{
470
							if(lprov != null) {
471
								buildLabel(updateLabel,element,lprov);
472
							}
473
						}
474
						
475
//						As it is possible for user code to run the event 
476
			            //loop check here.
477
						if (item.isDisposed()) {
478
			                unmapElement(element, item);
479
			                return;
480
			            }   
481
						
482
						text = updateLabel.getText();
483
						image = updateLabel.getImage();
484
					}
485
				} else {
486
					text = tprov.getColumnText(element, column);
487
					image = tprov.getColumnImage(element, column);
488
				}
489
372
490
				//Avoid setting text to null
373
				// As it is possible for user code to run the event
491
				if (text == null) {
374
				// loop check here.
492
					text = ""; //$NON-NLS-1$
375
				if (item.isDisposed()) {
493
				}
376
					unmapElement(element, item);
494
				ti.setText(column, text);
377
					return;
495
				if (ti.getImage(column) != image) {
496
					ti.setImage(column, image);
497
				}
378
				}
379
498
			}
380
			}
499
			
381
500
			
501
			getColorAndFontCollector().applyFontsAndColors(ti);
502
		}
382
		}
503
	}
383
	}
504
384
505
	/**
385
	/**
386
	 * Return the TableColumnViewer at columnIndex
387
	 * 
388
	 * @param columnIndex
389
	 * @return TableColumnViewer
390
	 */
391
	public TableColumnViewerPart getColumnViewer(int columnIndex) {
392
		TableColumn column = getTable().getColumn(columnIndex);
393
		Object viewer = column.getData(TABLE_VIEWER_KEY);
394
		if (viewer == null){
395
			viewer = new TableColumnViewerPart(
396
					createViewerLabelProvider(columnIndex), columnIndex);
397
			column.setData(TABLE_VIEWER_KEY, viewer);
398
		}
399
		return (TableColumnViewerPart) viewer;
400
	}
401
	
402
	/**
403
	 * Set the TableColumnViewerPart at columnIndex to be 
404
	 * viewerPart.
405
	 * @param viewerPart
406
	 * @param columnIndex
407
	 */
408
	public void setTableColumnPart(TableColumnViewerPart viewerPart, int columnIndex){
409
		TableColumn column = getTable().getColumn(columnIndex);
410
		column.setData(TABLE_VIEWER_KEY, viewerPart);
411
	}
412
413
	/**
414
	 * Create a ViewerLabelProvider for the column at index
415
	 * 
416
	 * @param columnIndex
417
	 * @return ViewerLabelProvider
418
	 */
419
	private ViewerLabelProvider createViewerLabelProvider(int columnIndex) {
420
		return null;//We will create a mapping from the old
421
		//api here
422
	}
423
424
	/**
506
	 * Starts editing the given element.
425
	 * Starts editing the given element.
507
	 * 
426
	 * 
508
	 * @param element
427
	 * @param element
Lines 544-550 Link Here
544
	}
463
	}
545
464
546
	/*
465
	/*
547
	 *  (non-Javadoc)
466
	 * (non-Javadoc)
467
	 * 
548
	 * @see org.eclipse.jface.viewers.Viewer#getControl()
468
	 * @see org.eclipse.jface.viewers.Viewer#getControl()
549
	 */
469
	 */
550
	public Control getControl() {
470
	public Control getControl() {
Lines 588-598 Link Here
588
	}
508
	}
589
509
590
	/*
510
	/*
591
	 *  (non-Javadoc)
511
	 * (non-Javadoc)
512
	 * 
592
	 * @see org.eclipse.jface.viewers.StructuredViewer#getSelectionFromWidget()
513
	 * @see org.eclipse.jface.viewers.StructuredViewer#getSelectionFromWidget()
593
	 */
514
	 */
594
	protected List getSelectionFromWidget() {
515
	protected List getSelectionFromWidget() {
595
		if(virtualManager != null) {
516
		if (virtualManager != null) {
596
			return getVirtualSelection();
517
			return getVirtualSelection();
597
		}
518
		}
598
		Widget[] items = table.getSelection();
519
		Widget[] items = table.getSelection();
Lines 606-655 Link Here
606
		}
527
		}
607
		return list;
528
		return list;
608
	}
529
	}
609
	
530
610
	/**
531
	/**
611
	 * Get the virtual selection. Avoid calling SWT whenever possible
532
	 * Get the virtual selection. Avoid calling SWT whenever possible to prevent
612
	 * to prevent extra widget creation.
533
	 * extra widget creation.
534
	 * 
613
	 * @return List of Object
535
	 * @return List of Object
614
	 */
536
	 */
615
537
616
	private List getVirtualSelection() {
538
	private List getVirtualSelection() {
617
		
539
618
		List result = new ArrayList();
540
		List result = new ArrayList();
619
		int[] selectionIndices = getTable().getSelectionIndices(); 
541
		int[] selectionIndices = getTable().getSelectionIndices();
620
		if(getContentProvider() instanceof ILazyContentProvider){
542
		if (getContentProvider() instanceof ILazyContentProvider) {
621
			ILazyContentProvider lazy = (ILazyContentProvider) getContentProvider();
543
			ILazyContentProvider lazy = (ILazyContentProvider) getContentProvider();
622
			for (int i = 0; i < selectionIndices.length; i++) {
544
			for (int i = 0; i < selectionIndices.length; i++) {
623
				int selectionIndex = selectionIndices[i];
545
				int selectionIndex = selectionIndices[i];
624
				lazy.updateElement(selectionIndex);//Start the update
546
				lazy.updateElement(selectionIndex);// Start the update
625
				Object element = getTable().getItem(selectionIndex).getData();
547
				Object element = getTable().getItem(selectionIndex).getData();
626
				//Only add the element if it got updated.
548
				// Only add the element if it got updated.
627
				//If this is done deferred the selection will
549
				// If this is done deferred the selection will
628
				//be incomplete until selection is finished.
550
				// be incomplete until selection is finished.
629
				if (element != null) {
551
				if (element != null) {
630
					result.add(element);
552
					result.add(element);
631
				}				
553
				}
632
			}
554
			}
633
		}
555
		} else {
634
		else{
635
			for (int i = 0; i < selectionIndices.length; i++) {
556
			for (int i = 0; i < selectionIndices.length; i++) {
636
				Object element = null;
557
				Object element = null;
637
				//See if it is cached
558
				// See if it is cached
638
				int selectionIndex = selectionIndices[i];
559
				int selectionIndex = selectionIndices[i];
639
				if (selectionIndex < virtualManager.cachedElements.length){
560
				if (selectionIndex < virtualManager.cachedElements.length) {
640
					element = virtualManager.cachedElements[selectionIndex];
561
					element = virtualManager.cachedElements[selectionIndex];
641
				}
562
				}
642
				if (element == null){
563
				if (element == null) {
643
					// Not cached so try the item's data
564
					// Not cached so try the item's data
644
					TableItem item = getTable().getItem(selectionIndex);
565
					TableItem item = getTable().getItem(selectionIndex);
645
					element = item.getData();
566
					element = item.getData();
646
				}
567
				}
647
				if (element != null) {
568
				if (element != null) {
648
					result.add(element);
569
					result.add(element);
649
				}				
570
				}
650
			}
571
			}
651
			
572
652
			
653
		}
573
		}
654
		return result;
574
		return result;
655
	}
575
	}
Lines 664-670 Link Here
664
	}
584
	}
665
585
666
	/*
586
	/*
667
	 *  (non-Javadoc)
587
	 * (non-Javadoc)
588
	 * 
668
	 * @see org.eclipse.jface.viewers.ContentViewer#hookControl(org.eclipse.swt.widgets.Control)
589
	 * @see org.eclipse.jface.viewers.ContentViewer#hookControl(org.eclipse.swt.widgets.Control)
669
	 */
590
	 */
670
	protected void hookControl(Control control) {
591
	protected void hookControl(Control control) {
Lines 757-764 Link Here
757
	}
678
	}
758
679
759
	/*
680
	/*
760
	 *  (non-Javadoc)
681
	 * (non-Javadoc)
761
	 * @see org.eclipse.jface.viewers.Viewer#inputChanged(java.lang.Object, java.lang.Object)
682
	 * 
683
	 * @see org.eclipse.jface.viewers.Viewer#inputChanged(java.lang.Object,
684
	 *      java.lang.Object)
762
	 */
685
	 */
763
	protected void inputChanged(Object input, Object oldInput) {
686
	protected void inputChanged(Object input, Object oldInput) {
764
		getControl().setRedraw(false);
687
		getControl().setRedraw(false);
Lines 795-806 Link Here
795
		if (position == -1) {
718
		if (position == -1) {
796
			position = table.getItemCount();
719
			position = table.getItemCount();
797
		}
720
		}
798
		
721
799
		createItem(element,position);
722
		createItem(element, position);
800
	}
723
	}
801
724
802
	/*
725
	/*
803
	 *  (non-Javadoc)
726
	 * (non-Javadoc)
727
	 * 
804
	 * @see org.eclipse.jface.viewers.StructuredViewer#internalRefresh(java.lang.Object)
728
	 * @see org.eclipse.jface.viewers.StructuredViewer#internalRefresh(java.lang.Object)
805
	 */
729
	 */
806
	protected void internalRefresh(Object element) {
730
	protected void internalRefresh(Object element) {
Lines 808-822 Link Here
808
	}
732
	}
809
733
810
	/*
734
	/*
811
	 *  (non-Javadoc)
735
	 * (non-Javadoc)
812
	 * @see org.eclipse.jface.viewers.StructuredViewer#internalRefresh(java.lang.Object, boolean)
736
	 * 
737
	 * @see org.eclipse.jface.viewers.StructuredViewer#internalRefresh(java.lang.Object,
738
	 *      boolean)
813
	 */
739
	 */
814
	protected void internalRefresh(Object element, boolean updateLabels) {
740
	protected void internalRefresh(Object element, boolean updateLabels) {
815
		tableViewerImpl.applyEditorValue();
741
		tableViewerImpl.applyEditorValue();
816
		if (element == null || equals(element, getRoot())) {
742
		if (element == null || equals(element, getRoot())) {
817
			if(virtualManager == null) {
743
			if (virtualManager == null) {
818
				internalRefreshAll(updateLabels);
744
				internalRefreshAll(updateLabels);
819
			} else{
745
			} else {
820
				internalVirtualRefreshAll();
746
				internalVirtualRefreshAll();
821
			}
747
			}
822
		} else {
748
		} else {
Lines 833-849 Link Here
833
	 * @since 3.1
759
	 * @since 3.1
834
	 */
760
	 */
835
	private void internalVirtualRefreshAll() {
761
	private void internalVirtualRefreshAll() {
836
		
762
837
		Object root = getRoot();
763
		Object root = getRoot();
838
		IContentProvider contentProvider = getContentProvider();
764
		IContentProvider contentProvider = getContentProvider();
839
		
765
840
		//Invalidate for lazy
766
		// Invalidate for lazy
841
		if(!(contentProvider instanceof ILazyContentProvider) 
767
		if (!(contentProvider instanceof ILazyContentProvider)
842
				&& (contentProvider instanceof IStructuredContentProvider)) {
768
				&& (contentProvider instanceof IStructuredContentProvider)) {
843
			//Don't cache if the root is null but cache if it is not lazy.
769
			// Don't cache if the root is null but cache if it is not lazy.
844
			if(root != null){
770
			if (root != null) {
845
				virtualManager.cachedElements = 
771
				virtualManager.cachedElements = ((IStructuredContentProvider) getContentProvider())
846
					((IStructuredContentProvider) getContentProvider()).getElements(root);
772
						.getElements(root);
847
				getTable().setItemCount(virtualManager.cachedElements.length);
773
				getTable().setItemCount(virtualManager.cachedElements.length);
848
			}
774
			}
849
		}
775
		}
Lines 851-858 Link Here
851
	}
777
	}
852
778
853
	/**
779
	/**
854
	 * Refresh all of the elements of the table. update the
780
	 * Refresh all of the elements of the table. update the labels if
855
	 * labels if updatLabels is true;
781
	 * updatLabels is true;
782
	 * 
856
	 * @param updateLabels
783
	 * @param updateLabels
857
	 * 
784
	 * 
858
	 * @since 3.1
785
	 * @since 3.1
Lines 871-880 Link Here
871
		TableItem[] items = getTable().getItems();
798
		TableItem[] items = getTable().getItems();
872
		int min = Math.min(children.length, items.length);
799
		int min = Math.min(children.length, items.length);
873
		for (int i = 0; i < min; ++i) {
800
		for (int i = 0; i < min; ++i) {
874
			
801
875
			
876
			TableItem item = items[i];
802
			TableItem item = items[i];
877
				
803
878
			// if the element is unchanged, update its label if appropriate
804
			// if the element is unchanged, update its label if appropriate
879
			if (equals(children[i], item.getData())) {
805
			if (equals(children[i], item.getData())) {
880
				if (updateLabels) {
806
				if (updateLabels) {
Lines 893-906 Link Here
893
				// So, if the object associated with this item has changed,
819
				// So, if the object associated with this item has changed,
894
				// just disassociate it for now, and update it below.
820
				// just disassociate it for now, and update it below.
895
				item.setText(""); //$NON-NLS-1$
821
				item.setText(""); //$NON-NLS-1$
896
				item.setImage(new Image[Math.max(1,table.getColumnCount())]);//Clear all images
822
				item.setImage(new Image[Math.max(1, table.getColumnCount())]);// Clear
823
				// all
824
				// images
897
				disassociate(item);
825
				disassociate(item);
898
			}
826
			}
899
		}
827
		}
900
		// dispose of all items beyond the end of the current elements
828
		// dispose of all items beyond the end of the current elements
901
		if (min < items.length) {
829
		if (min < items.length) {
902
			for (int i = items.length; --i >= min;) {
830
			for (int i = items.length; --i >= min;) {
903
				
831
904
				disassociate(items[i]);
832
				disassociate(items[i]);
905
			}
833
			}
906
			table.remove(min, items.length - 1);
834
			table.remove(min, items.length - 1);
Lines 912-918 Link Here
912
		}
840
		}
913
		// Update items which were removed above
841
		// Update items which were removed above
914
		for (int i = 0; i < min; ++i) {
842
		for (int i = 0; i < min; ++i) {
915
							
843
916
			TableItem item = items[i];
844
			TableItem item = items[i];
917
			if (item.getData() == null) {
845
			if (item.getData() == null) {
918
				updateItem(item, children[i]);
846
				updateItem(item, children[i]);
Lines 920-930 Link Here
920
		}
848
		}
921
		// add any remaining elements
849
		// add any remaining elements
922
		for (int i = min; i < children.length; ++i) {
850
		for (int i = min; i < children.length; ++i) {
923
			createItem(children[i],i);
851
			createItem(children[i], i);
924
		}
852
		}
925
	}
853
	}
926
854
927
928
	/**
855
	/**
929
	 * Removes the given elements from this table viewer.
856
	 * Removes the given elements from this table viewer.
930
	 * 
857
	 * 
Lines 987-995 Link Here
987
	 */
914
	 */
988
	public void remove(final Object[] elements) {
915
	public void remove(final Object[] elements) {
989
		assertElementsNotNull(elements);
916
		assertElementsNotNull(elements);
990
        if (elements.length == 0) {
917
		if (elements.length == 0) {
991
        	return;
918
			return;
992
        }
919
		}
993
		preservingSelection(new Runnable() {
920
		preservingSelection(new Runnable() {
994
			public void run() {
921
			public void run() {
995
				internalRemove(elements);
922
				internalRemove(elements);
Lines 1007-1014 Link Here
1007
	 * the model. Note that there is another method for efficiently processing
934
	 * the model. Note that there is another method for efficiently processing
1008
	 * the simultaneous removal of multiple elements.
935
	 * the simultaneous removal of multiple elements.
1009
	 * </p>
936
	 * </p>
1010
	 * <strong>NOTE:</strong> removing an object from a virtual
937
	 * <strong>NOTE:</strong> removing an object from a virtual table will
1011
	 * table will decrement the itemCount.
938
	 * decrement the itemCount.
1012
	 * 
939
	 * 
1013
	 * @param element
940
	 * @param element
1014
	 *            the element
941
	 *            the element
Lines 1018-1024 Link Here
1018
	}
945
	}
1019
946
1020
	/*
947
	/*
1021
	 *  (non-Javadoc)
948
	 * (non-Javadoc)
949
	 * 
1022
	 * @see org.eclipse.jface.viewers.StructuredViewer#reveal(java.lang.Object)
950
	 * @see org.eclipse.jface.viewers.StructuredViewer#reveal(java.lang.Object)
1023
	 */
951
	 */
1024
	public void reveal(Object element) {
952
	public void reveal(Object element) {
Lines 1079-1112 Link Here
1079
	 * may also implement {@link IColorProvider} and/or {@link IFontProvider} to
1007
	 * may also implement {@link IColorProvider} and/or {@link IFontProvider} to
1080
	 * provide colors and/or fonts.
1008
	 * provide colors and/or fonts.
1081
	 * </p>
1009
	 * </p>
1010
	 * <p>
1011
	 * If the label provider implements the mixin interface ITooltipProvider, it
1012
	 * can provide custom tooltips.
1013
	 * </p>
1082
	 */
1014
	 */
1083
	public void setLabelProvider(IBaseLabelProvider labelProvider) {
1015
	public void setLabelProvider(IBaseLabelProvider labelProvider) {
1084
		Assert.isTrue(labelProvider instanceof ITableLabelProvider
1016
		Assert.isTrue(labelProvider instanceof ITableLabelProvider
1085
				|| labelProvider instanceof ILabelProvider);
1017
				|| labelProvider instanceof ILabelProvider);
1086
		super.setLabelProvider(labelProvider);
1018
		super.setLabelProvider(labelProvider);
1087
		if(labelProvider instanceof ITableFontProvider || labelProvider instanceof ITableColorProvider) {
1019
		viewerLabelProvider = new ViewerLabelProvider();
1088
			tableColorAndFont = new TableColorAndFontCollector(labelProvider);
1020
		viewerLabelProvider.setProviders(labelProvider);
1089
		} else {
1090
			tableColorAndFont = new TableColorAndFontNoOp();
1091
		}
1092
				
1093
	}
1021
	}
1094
	
1022
1095
	/**
1023
	/**
1096
	 * <p>
1024
	 * <p>
1097
	 * Sets a new selection for this viewer and optionally makes it visible.
1025
	 * Sets a new selection for this viewer and optionally makes it visible. The
1098
	 * The TableViewer implmentation of this method is ineffecient for the
1026
	 * TableViewer implmentation of this method is ineffecient for the
1099
	 * ILazyContentProvider as lookup is done by indices rather than elements
1027
	 * ILazyContentProvider as lookup is done by indices rather than elements
1100
	 * and may require population of the entire table in worse case. 
1028
	 * and may require population of the entire table in worse case.
1101
	 * </p>
1029
	 * </p>
1102
	 * <p>
1030
	 * <p>
1103
	 * Use Table#setSelection(int[] indices) and Table#showSelection() if
1031
	 * Use Table#setSelection(int[] indices) and Table#showSelection() if you
1104
	 * you wish to set selection more effeciently when using a ILazyContentProvider.
1032
	 * wish to set selection more effeciently when using a ILazyContentProvider.
1105
	 * </p>
1033
	 * </p>
1106
	 * 
1034
	 * 
1107
	 * @param selection the new selection
1035
	 * @param selection
1108
     * @param reveal <code>true</code> if the selection is to be made
1036
	 *            the new selection
1109
     *   visible, and <code>false</code> otherwise
1037
	 * @param reveal
1038
	 *            <code>true</code> if the selection is to be made visible,
1039
	 *            and <code>false</code> otherwise
1110
	 * @see Table#setSelection(int[])
1040
	 * @see Table#setSelection(int[])
1111
	 * @see Table#showSelection()
1041
	 * @see Table#showSelection()
1112
	 */
1042
	 */
Lines 1115-1135 Link Here
1115
	}
1045
	}
1116
1046
1117
	/*
1047
	/*
1118
	 *  (non-Javadoc)
1048
	 * (non-Javadoc)
1119
	 * @see org.eclipse.jface.viewers.StructuredViewer#setSelectionToWidget(java.util.List, boolean)
1049
	 * 
1050
	 * @see org.eclipse.jface.viewers.StructuredViewer#setSelectionToWidget(java.util.List,
1051
	 *      boolean)
1120
	 */
1052
	 */
1121
	protected void setSelectionToWidget(List list, boolean reveal) {
1053
	protected void setSelectionToWidget(List list, boolean reveal) {
1122
		
1054
1123
		if (list == null) {
1055
		if (list == null) {
1124
			table.deselectAll();
1056
			table.deselectAll();
1125
			return;
1057
			return;
1126
		}
1058
		}
1127
		
1059
1128
		if(virtualManager != null){
1060
		if (virtualManager != null) {
1129
			virtualSetSelectionToWidget(list, reveal);
1061
			virtualSetSelectionToWidget(list, reveal);
1130
			return;
1062
			return;
1131
		}
1063
		}
1132
		
1064
1133
		int size = list.size();
1065
		int size = list.size();
1134
		TableItem[] items = new TableItem[size];
1066
		TableItem[] items = new TableItem[size];
1135
		int count = 0;
1067
		int count = 0;
Lines 1149-1170 Link Here
1149
		if (reveal) {
1081
		if (reveal) {
1150
			table.showSelection();
1082
			table.showSelection();
1151
		}
1083
		}
1152
			
1084
1153
	}
1085
	}
1154
	
1086
1155
	
1156
	/**
1087
	/**
1157
	 * Set the selection on a virtual table
1088
	 * Set the selection on a virtual table
1158
	 * @param list The elements to set
1089
	 * 
1159
	 * @param reveal Whether or not reveal the first item.
1090
	 * @param list
1091
	 *            The elements to set
1092
	 * @param reveal
1093
	 *            Whether or not reveal the first item.
1160
	 */
1094
	 */
1161
	private void virtualSetSelectionToWidget(List list, boolean reveal) {
1095
	private void virtualSetSelectionToWidget(List list, boolean reveal) {
1162
		int size = list.size();
1096
		int size = list.size();
1163
		int[] indices = new int[list.size()];
1097
		int[] indices = new int[list.size()];
1164
		
1098
1165
		TableItem firstItem = null;
1099
		TableItem firstItem = null;
1166
		int count = 0;
1100
		int count = 0;
1167
		HashSet virtualElements = new HashSet(); 
1101
		HashSet virtualElements = new HashSet();
1168
		for (int i = 0; i < size; ++i) {
1102
		for (int i = 0; i < size; ++i) {
1169
			Object o = list.get(i);
1103
			Object o = list.get(i);
1170
			Widget w = findItem(o);
1104
			Widget w = findItem(o);
Lines 1178-1214 Link Here
1178
				virtualElements.add(o);
1112
				virtualElements.add(o);
1179
			}
1113
			}
1180
		}
1114
		}
1181
		
1115
1182
		if(getContentProvider() instanceof ILazyContentProvider){
1116
		if (getContentProvider() instanceof ILazyContentProvider) {
1183
			ILazyContentProvider provider = 
1117
			ILazyContentProvider provider = (ILazyContentProvider) getContentProvider();
1184
				(ILazyContentProvider) getContentProvider();
1118
1185
		
1119
			// Now go through it again until all is done or we are no longer
1186
			//Now go through it again until all is done or we are no longer virtual
1120
			// virtual
1187
			//This may create all items so it is not a good
1121
			// This may create all items so it is not a good
1188
			//idea in general.
1122
			// idea in general.
1189
			//Use #setSelection (int [] indices,boolean reveal) instead
1123
			// Use #setSelection (int [] indices,boolean reveal) instead
1190
			for (int i = 0; virtualElements.size() > 0 && i < getTable().getItemCount(); i++) {
1124
			for (int i = 0; virtualElements.size() > 0
1125
					&& i < getTable().getItemCount(); i++) {
1191
				provider.updateElement(i);
1126
				provider.updateElement(i);
1192
				TableItem item = getTable().getItem(i);
1127
				TableItem item = getTable().getItem(i);
1193
				if(virtualElements.contains(item.getData())){
1128
				if (virtualElements.contains(item.getData())) {
1194
					indices[count++] = i;	
1129
					indices[count++] = i;
1195
					virtualElements.remove(item.getData());
1130
					virtualElements.remove(item.getData());
1196
					if (firstItem == null) {
1131
					if (firstItem == null) {
1197
						firstItem = item;
1132
						firstItem = item;
1198
					}
1133
					}
1199
				}
1134
				}
1200
			}
1135
			}
1201
		}
1136
		} else {
1202
		else{
1137
1203
			
1138
			if (count != list.size()) {// As this is expensive skip it if all
1204
			if(count != list.size()){//As this is expensive skip it if all have been found
1139
				// have been found
1205
				//If it is not lazy we can use the cache
1140
				// If it is not lazy we can use the cache
1206
				for (int i = 0; i < virtualManager.cachedElements.length; i++) {
1141
				for (int i = 0; i < virtualManager.cachedElements.length; i++) {
1207
					Object element = virtualManager.cachedElements[i];
1142
					Object element = virtualManager.cachedElements[i];
1208
					if(virtualElements.contains(element)){
1143
					if (virtualElements.contains(element)) {
1209
						TableItem item = getTable().getItem(i);
1144
						TableItem item = getTable().getItem(i);
1210
						item.getText();//Be sure to fire the update
1145
						item.getText();// Be sure to fire the update
1211
						indices[count++] = i;	
1146
						indices[count++] = i;
1212
						virtualElements.remove(element);
1147
						virtualElements.remove(element);
1213
						if (firstItem == null) {
1148
						if (firstItem == null) {
1214
							firstItem = item;
1149
							firstItem = item;
Lines 1217-1223 Link Here
1217
				}
1152
				}
1218
			}
1153
			}
1219
		}
1154
		}
1220
		
1155
1221
		if (count < size) {
1156
		if (count < size) {
1222
			System.arraycopy(indices, 0, indices = new int[count], 0, count);
1157
			System.arraycopy(indices, 0, indices = new int[count], 0, count);
1223
		}
1158
		}
Lines 1230-1264 Link Here
1230
1165
1231
	/**
1166
	/**
1232
	 * Set the item count of the receiver.
1167
	 * Set the item count of the receiver.
1233
	 * @param count the new table size.
1168
	 * 
1169
	 * @param count
1170
	 *            the new table size.
1234
	 * 
1171
	 * 
1235
	 * @since 3.1
1172
	 * @since 3.1
1236
	 */
1173
	 */
1237
	public void setItemCount(int count){
1174
	public void setItemCount(int count) {
1238
		getTable().setItemCount(count);
1175
		getTable().setItemCount(count);
1239
		getTable().redraw();
1176
		getTable().redraw();
1240
	}
1177
	}
1241
	
1178
1242
	/**
1179
	/**
1243
	 * Replace the entries starting at index with elements.
1180
	 * Replace the entries starting at index with elements. This method assumes
1244
	 * This method assumes all of these values are correct
1181
	 * all of these values are correct and will not call the content provider to
1245
	 * and will not call the content provider to verify.
1182
	 * verify. <strong>Note that this method will create a TableItem for all of
1246
	 * <strong>Note that this method will create a TableItem
1183
	 * the elements provided</strong>.
1247
	 * for all of the elements provided</strong>.
1184
	 * 
1248
	 * @param element
1185
	 * @param element
1249
	 * @param index
1186
	 * @param index
1250
	 * @see ILazyContentProvider
1187
	 * @see ILazyContentProvider
1251
	 * 
1188
	 * 
1252
	 * @since 3.1
1189
	 * @since 3.1
1253
	 */
1190
	 */
1254
	public void replace(Object element, int index){
1191
	public void replace(Object element, int index) {
1255
		TableItem item = getTable().getItem(index);
1192
		TableItem item = getTable().getItem(index);
1256
		refreshItem(item, element);
1193
		refreshItem(item, element);
1257
	}
1194
	}
1258
1195
1259
	/**
1196
	/**
1260
	 * Clear the table item at the specified index
1197
	 * Clear the table item at the specified index
1261
	 * @param index the index of the table item to be cleared
1198
	 * 
1199
	 * @param index
1200
	 *            the index of the table item to be cleared
1262
	 * 
1201
	 * 
1263
	 * @since 3.1
1202
	 * @since 3.1
1264
	 */
1203
	 */
Lines 1269-1294 Link Here
1269
		}
1208
		}
1270
		table.clear(index);
1209
		table.clear(index);
1271
	}
1210
	}
1272
	
1211
1273
	/* (non-Javadoc)
1212
	/*
1213
	 * (non-Javadoc)
1214
	 * 
1274
	 * @see org.eclipse.jface.viewers.StructuredViewer#getRawChildren(java.lang.Object)
1215
	 * @see org.eclipse.jface.viewers.StructuredViewer#getRawChildren(java.lang.Object)
1275
	 */
1216
	 */
1276
	protected Object[] getRawChildren(Object parent) {
1217
	protected Object[] getRawChildren(Object parent) {
1277
1218
1278
		Assert.isTrue(!(getContentProvider() instanceof ILazyContentProvider),"Cannot get raw children with an ILazyContentProvider");//$NON-NLS-1$
1219
		Assert.isTrue(!(getContentProvider() instanceof ILazyContentProvider),
1220
				"Cannot get raw children with an ILazyContentProvider");//$NON-NLS-1$
1279
		return super.getRawChildren(parent);
1221
		return super.getRawChildren(parent);
1280
	
1222
1281
	}
1223
	}
1282
	
1224
1283
	/* (non-Javadoc)
1225
	/*
1226
	 * (non-Javadoc)
1227
	 * 
1284
	 * @see org.eclipse.jface.viewers.StructuredViewer#assertContentProviderType(org.eclipse.jface.viewers.IContentProvider)
1228
	 * @see org.eclipse.jface.viewers.StructuredViewer#assertContentProviderType(org.eclipse.jface.viewers.IContentProvider)
1285
	 */
1229
	 */
1286
	protected void assertContentProviderType(IContentProvider provider) {
1230
	protected void assertContentProviderType(IContentProvider provider) {
1287
		Assert.isTrue(provider instanceof IStructuredContentProvider ||
1231
		Assert.isTrue(provider instanceof IStructuredContentProvider
1288
				provider instanceof ILazyContentProvider);
1232
				|| provider instanceof ILazyContentProvider);
1289
	}
1233
	}
1290
	
1291
	
1292
	
1293
}
1294
1234
1235
}
(-)src/org/eclipse/jface/viewers/DecoratingLabelProvider.java (-52 / +13 lines)
Lines 22-31 Link Here
22
 * The decorator decorates the label text, image, font and colors provided by 
22
 * The decorator decorates the label text, image, font and colors provided by 
23
 * the nested label provider.
23
 * the nested label provider.
24
 */
24
 */
25
public class DecoratingLabelProvider extends LabelProvider implements
25
public class DecoratingLabelProvider extends TreeViewerLabelProvider  {
26
        ILabelProvider, IViewerLabelProvider, IColorProvider, IFontProvider, ITreePathLabelProvider {
27
		
26
		
28
    private ILabelProvider provider;
29
27
30
    private ILabelDecorator decorator;
28
    private ILabelDecorator decorator;
31
29
Lines 44-50 Link Here
44
    public DecoratingLabelProvider(ILabelProvider provider,
42
    public DecoratingLabelProvider(ILabelProvider provider,
45
            ILabelDecorator decorator) {
43
            ILabelDecorator decorator) {
46
        Assert.isNotNull(provider);
44
        Assert.isNotNull(provider);
47
        this.provider = provider;
45
        setProviders(provider);
48
        this.decorator = decorator;
46
        this.decorator = decorator;
49
    }
47
    }
50
48
Lines 56-62 Link Here
56
     */
54
     */
57
    public void addListener(ILabelProviderListener listener) {
55
    public void addListener(ILabelProviderListener listener) {
58
        super.addListener(listener);
56
        super.addListener(listener);
59
        provider.addListener(listener);
57
        getLabelProvider().addListener(listener);
60
        if (decorator != null) {
58
        if (decorator != null) {
61
            decorator.addListener(listener);
59
            decorator.addListener(listener);
62
        }
60
        }
Lines 68-74 Link Here
68
     * disposes both the nested label provider and the label decorator.
66
     * disposes both the nested label provider and the label decorator.
69
     */
67
     */
70
    public void dispose() {
68
    public void dispose() {
71
        provider.dispose();
69
        getLabelProvider().dispose();
72
        if (decorator != null) {
70
        if (decorator != null) {
73
            decorator.dispose();
71
            decorator.dispose();
74
        }
72
        }
Lines 82-88 Link Here
82
     * <code>decorateImage</code> method.
80
     * <code>decorateImage</code> method.
83
     */
81
     */
84
    public Image getImage(Object element) {
82
    public Image getImage(Object element) {
85
        Image image = provider.getImage(element);
83
        Image image = getLabelProvider().getImage(element);
86
        if (decorator != null) {
84
        if (decorator != null) {
87
        	if (decorator instanceof LabelDecorator) {
85
        	if (decorator instanceof LabelDecorator) {
88
				LabelDecorator ld2 = (LabelDecorator) decorator;
86
				LabelDecorator ld2 = (LabelDecorator) decorator;
Lines 110-124 Link Here
110
    }
108
    }
111
109
112
    /**
110
    /**
113
     * Returns the nested label provider.
114
     *
115
     * @return the nested label provider
116
     */
117
    public ILabelProvider getLabelProvider() {
118
        return provider;
119
    }
120
121
    /**
122
     * The <code>DecoratingLabelProvider</code> implementation of this 
111
     * The <code>DecoratingLabelProvider</code> implementation of this 
123
     * <code>ILabelProvider</code> method returns the text label provided
112
     * <code>ILabelProvider</code> method returns the text label provided
124
     * by the nested label provider's <code>getText</code> method, 
113
     * by the nested label provider's <code>getText</code> method, 
Lines 126-132 Link Here
126
     * <code>decorateText</code> method.
115
     * <code>decorateText</code> method.
127
     */
116
     */
128
    public String getText(Object element) {
117
    public String getText(Object element) {
129
        String text = provider.getText(element);
118
        String text = getLabelProvider().getText(element);
130
        if (decorator != null) {
119
        if (decorator != null) {
131
        	if (decorator instanceof LabelDecorator) {
120
        	if (decorator instanceof LabelDecorator) {
132
				LabelDecorator ld2 = (LabelDecorator) decorator;
121
				LabelDecorator ld2 = (LabelDecorator) decorator;
Lines 151-157 Link Here
151
     * decorator returns <code>true</code>.
140
     * decorator returns <code>true</code>.
152
     */
141
     */
153
    public boolean isLabelProperty(Object element, String property) {
142
    public boolean isLabelProperty(Object element, String property) {
154
        if (provider.isLabelProperty(element, property)) {
143
        if (getLabelProvider().isLabelProperty(element, property)) {
155
			return true;
144
			return true;
156
		}
145
		}
157
        if (decorator != null && decorator.isLabelProperty(element, property)) {
146
        if (decorator != null && decorator.isLabelProperty(element, property)) {
Lines 168-174 Link Here
168
     */
157
     */
169
    public void removeListener(ILabelProviderListener listener) {
158
    public void removeListener(ILabelProviderListener listener) {
170
        super.removeListener(listener);
159
        super.removeListener(listener);
171
        provider.removeListener(listener);
160
        getLabelProvider().removeListener(listener);
172
        if (decorator != null) {
161
        if (decorator != null) {
173
            decorator.removeListener(listener);
162
            decorator.removeListener(listener);
174
        }
163
        }
Lines 260-295 Link Here
260
		
249
		
261
	}
250
	}
262
	
251
	
263
	/* (non-Javadoc)
264
	 * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
265
	 */
266
	public Color getBackground(Object element) {
267
		if(provider instanceof IColorProvider) {
268
			return ((IColorProvider) provider).getBackground(element);
269
		}
270
		return null;
271
	}
272
	
273
	/* (non-Javadoc)
274
	 * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
275
	 */
276
	public Font getFont(Object element) {
277
		if(provider instanceof IFontProvider) {
278
			return ((IFontProvider) provider).getFont(element);
279
		}
280
		return null;
281
	}
282
	
283
	/* (non-Javadoc)
284
	 * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
285
	 */
286
	public Color getForeground(Object element) {
287
		if(provider instanceof IColorProvider) {
288
			return ((IColorProvider) provider).getForeground(element);
289
		}
290
		return null;
291
	}
292
293
    /**
252
    /**
294
     * Return the decoration context associated with this label provider.
253
     * Return the decoration context associated with this label provider.
295
     * It will be passed to the decorator if the decorator is an 
254
     * It will be passed to the decorator if the decorator is an 
Lines 314-321 Link Here
314
		this.decorationContext = decorationContext;
273
		this.decorationContext = decorationContext;
315
	}
274
	}
316
275
276
	
277
317
	/* (non-Javadoc)
278
	/* (non-Javadoc)
318
	 * @see org.eclipse.jface.viewers.ITreePathLabelProvider#updateLabel(org.eclipse.jface.viewers.ViewerLabel, org.eclipse.jface.viewers.TreePath)
279
	 * @see org.eclipse.jface.viewers.TreeViewerLabelProvider#updateLabel(org.eclipse.jface.viewers.ViewerLabel, org.eclipse.jface.viewers.TreePath)
319
	 */
280
	 */
320
	public void updateLabel(ViewerLabel settings, TreePath elementPath) {
281
	public void updateLabel(ViewerLabel settings, TreePath elementPath) {
321
        ILabelDecorator currentDecorator = getLabelDecorator();
282
        ILabelDecorator currentDecorator = getLabelDecorator();
Lines 338-345 Link Here
338
        settings.setHasPendingDecorations(!decorationReady);
299
        settings.setHasPendingDecorations(!decorationReady);
339
        // update icon and label
300
        // update icon and label
340
301
341
        if (provider instanceof ITreePathLabelProvider) {
302
        if (getTreePathProvider() == null) {
342
			ITreePathLabelProvider pprov = (ITreePathLabelProvider) provider;
303
			ITreePathLabelProvider pprov = (ITreePathLabelProvider) getLabelProvider();
343
			if (decorationReady || oldText == null
304
			if (decorationReady || oldText == null
344
	                || settings.getText().length() == 0) {
305
	                || settings.getText().length() == 0) {
345
				pprov.updateLabel(settings, elementPath);
306
				pprov.updateLabel(settings, elementPath);
(-)src/org/eclipse/jface/viewers/ViewerLabelProvider.java (+184 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2006 IBM Corporation and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
10
 ******************************************************************************/
11
12
package org.eclipse.jface.viewers;
13
14
import org.eclipse.swt.graphics.Color;
15
import org.eclipse.swt.graphics.Font;
16
17
/**
18
 * @since 3.2
19
 * 
20
 */
21
public class ViewerLabelProvider extends LabelProvider implements
22
		ILabelProvider, IViewerLabelProvider, IColorProvider, IFontProvider {
23
24
	private static IFontProvider defaultFontProvider = new IFontProvider() {
25
		/*
26
		 * (non-Javadoc)
27
		 * 
28
		 * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
29
		 */
30
		public Font getFont(Object element) {
31
			return null;
32
		}
33
	};
34
35
	private static IColorProvider defaultColorProvider = new IColorProvider() {
36
		/*
37
		 * (non-Javadoc)
38
		 * 
39
		 * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
40
		 */
41
		public Color getBackground(Object element) {
42
			return null;
43
		}
44
45
		/*
46
		 * (non-Javadoc)
47
		 * 
48
		 * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
49
		 */
50
		public Color getForeground(Object element) {
51
			return null;
52
		}
53
	};
54
	
55
	private static ILabelProvider defaultLabelProvider = new LabelProvider(){
56
		
57
	};
58
59
	private ILabelProvider labelProvider = defaultLabelProvider;
60
61
	private IColorProvider colorProvider = defaultColorProvider;
62
63
	private IFontProvider fontProvider = defaultFontProvider;
64
65
	/*
66
	 * (non-Javadoc)
67
	 * 
68
	 * @see org.eclipse.jface.viewers.IViewerLabelProvider#updateLabel(org.eclipse.jface.viewers.ViewerLabel,
69
	 *      java.lang.Object)
70
	 */
71
	public void updateLabel(ViewerLabel label, Object element) {
72
		label.setText(labelProvider.getText(element));
73
		label.setImage(labelProvider.getImage(element));
74
75
		if (colorProvider != null) {
76
			label.setBackground(colorProvider.getBackground(element));
77
			label.setForeground(colorProvider.getForeground(element));
78
		}
79
80
		if (fontProvider != null) {
81
			label.setFont(fontProvider.getFont(element));
82
		}
83
84
	}
85
86
	/**
87
	 * Set the colorProvider to use for the receiver.
88
	 * 
89
	 * @param colorProvider
90
	 *            The colorProvider to set.
91
	 */
92
	public void setColorProvider(IColorProvider colorProvider) {
93
		this.colorProvider = colorProvider;
94
	}
95
96
	/**
97
	 * Set the fontProvider to fontProvider.
98
	 * 
99
	 * @param fontProvider
100
	 *            The fontProvider to set.
101
	 */
102
	public void setFontProvider(IFontProvider fontProvider) {
103
		this.fontProvider = fontProvider;
104
	}
105
106
	/**
107
	 * Set the labelProvider to be provider.
108
	 * 
109
	 * @param provider
110
	 *            ILabelProvider provider to set.
111
	 */
112
	public void setLabelProvider(ILabelProvider provider) {
113
		this.labelProvider = provider;
114
	}
115
116
	/**
117
	 * Set the any providers for the receiver that can be adapted from provider.
118
	 * 
119
	 * @param provider
120
	 */
121
	public void setProviders(Object provider) {
122
		if (provider instanceof ILabelProvider)
123
			labelProvider = (ILabelProvider) provider;
124
		if (provider instanceof IColorProvider)
125
			colorProvider = (IColorProvider) provider;
126
		if (provider instanceof IFontProvider)
127
			fontProvider = (IFontProvider) provider;
128
129
	}
130
131
	/*
132
	 * (non-Javadoc)
133
	 * 
134
	 * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
135
	 */
136
	public Font getFont(Object element) {
137
		return fontProvider.getFont(element);
138
139
	}
140
141
	/*
142
	 * (non-Javadoc)
143
	 * 
144
	 * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
145
	 */
146
	public Color getBackground(Object element) {
147
		return colorProvider.getBackground(element);
148
	}
149
150
	/*
151
	 * (non-Javadoc)
152
	 * 
153
	 * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
154
	 */
155
	public Color getForeground(Object element) {
156
		return colorProvider.getForeground(element);
157
	}
158
159
	/**
160
	 * Get the IColorProvider for the receiver.
161
	 * @return IColorProvider
162
	 */
163
	public IColorProvider getColorProvider() {
164
		return colorProvider;
165
	}
166
167
	/**
168
	 * Get the IFontProvider for the receiver.
169
	 * @return IFontProvider
170
	 */
171
	public IFontProvider getFontProvider() {
172
		return fontProvider;
173
	}
174
175
	/**
176
	 * @return Returns the labelProvider.
177
	 */
178
	public ILabelProvider getLabelProvider() {
179
		return labelProvider;
180
	}
181
182
	
183
184
}
(-)src/org/eclipse/jface/viewers/TableColumnViewerPart.java (+80 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2006 IBM Corporation and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
10
 ******************************************************************************/
11
12
package org.eclipse.jface.viewers;
13
14
import org.eclipse.swt.widgets.TableColumn;
15
import org.eclipse.swt.widgets.TableItem;
16
17
/**
18
 * The TableColumnViewer is the viewer for a TableColumn.
19
 * 
20
 * @since 3.3
21
 * 
22
 */
23
public class TableColumnViewerPart {
24
25
	private TableColumn tableColumn;
26
	private int index;
27
	private ViewerLabelProvider labelProvider;
28
29
	
30
	/**
31
	 * Create a new instance of the receiver at 
32
	 * @param provider
33
	 * @param columnIndex
34
	 */
35
	public TableColumnViewerPart(ViewerLabelProvider provider, int columnIndex) {
36
		index = columnIndex;
37
		labelProvider = provider;
38
	}
39
40
41
	/**
42
	 * @param item
43
	 * @param element
44
	 */
45
	public void refresh(TableItem item, Object element) {
46
		
47
		ViewerLabel label = new ViewerLabel(item.getText(index),item.getImage(index));
48
		labelProvider.updateLabel(label,element);
49
		
50
		if(label.hasNewBackground())
51
			item.setBackground(index, label.getBackground());
52
		
53
		if(label.hasNewForeground())
54
			item.setForeground(index, label.getForeground());
55
		
56
		if(label.hasNewFont())
57
			item.setFont(index, label.getFont());
58
		
59
		if(label.hasNewText())
60
			item.setText(index, label.getText());
61
		
62
		if(label.hasNewImage())
63
			item.setImage(index, label.getImage());
64
		
65
		
66
	}
67
68
69
	/**
70
	 * @return Returns the tableColumn.
71
	 */
72
	public TableColumn getTableColumn() {
73
		return tableColumn;
74
	}
75
76
77
}
78
79
	
80
(-)src/org/eclipse/jface/viewers/TreeViewerLabelProvider.java (+53 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2006 IBM Corporation and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
10
 ******************************************************************************/
11
12
package org.eclipse.jface.viewers;
13
14
15
/**
16
 * TreeViewerLabelProvider is the ViewerLabelProvider that handles
17
 * TreePaths.
18
 * @since 3.2
19
 *
20
 */
21
public class TreeViewerLabelProvider extends ViewerLabelProvider {
22
	 private ITreePathLabelProvider treePathProvider;
23
	
24
	
25
	
26
	/**
27
	 * Update the label for the element with TreePath.
28
	 * @param label
29
	 * @param elementPath
30
	 */
31
	public void updateLabel(ViewerLabel label, TreePath elementPath) {
32
		treePathProvider.updateLabel(label, elementPath);
33
34
	}
35
	
36
	/* (non-Javadoc)
37
	 * @see org.eclipse.jface.viewers.ViewerLabelProvider#setProviders(java.lang.Object)
38
	 */
39
	public void setProviders(Object provider) {
40
		super.setProviders(provider);
41
		if(provider instanceof ITreePathLabelProvider)
42
			treePathProvider = (ITreePathLabelProvider) provider;
43
	}
44
45
	/**
46
	 * Return the ITreePathLabelProvider for the receiver.
47
	 * @return Returns the treePathProvider.
48
	 */
49
	public ITreePathLabelProvider getTreePathProvider() {
50
		return treePathProvider;
51
	}
52
53
}

Return to bug 149193