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 / +285 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 28-33 Link Here
28
import org.eclipse.swt.widgets.Item;
29
import org.eclipse.swt.widgets.Item;
29
import org.eclipse.swt.widgets.Listener;
30
import org.eclipse.swt.widgets.Listener;
30
import org.eclipse.swt.widgets.Table;
31
import org.eclipse.swt.widgets.Table;
32
import org.eclipse.swt.widgets.TableColumn;
31
import org.eclipse.swt.widgets.TableItem;
33
import org.eclipse.swt.widgets.TableItem;
32
import org.eclipse.swt.widgets.Widget;
34
import org.eclipse.swt.widgets.Widget;
33
35
Lines 64-241 Link Here
64
 * @see #internalRefresh(Object, boolean)
66
 * @see #internalRefresh(Object, boolean)
65
 */
67
 */
66
public class TableViewer extends StructuredViewer {
68
public class TableViewer extends StructuredViewer {
67
		
69
68
	private class VirtualManager{
70
	private class VirtualManager {
69
71
70
		/**
72
		/**
71
		 * The currently invisible elements as provided 
73
		 * The currently invisible elements as provided by the content provider
72
		 * by the content provider or by addition.
74
		 * or by addition. This will not be populated by an
73
		 * This will not be populated by an ILazyStructuredContentProvider
75
		 * ILazyStructuredContentProvider as an ILazyStructuredContentProvider
74
		 * as an ILazyStructuredContentProvider is only queried
76
		 * is only queried on the virtual callback.
75
		 * on the virtual callback.
76
		 */
77
		 */
77
		private Object[] cachedElements = new Object[0];
78
		private Object[] cachedElements = new Object[0];
79
78
		/**
80
		/**
79
		 * Create a new instance of the receiver.
81
		 * Create a new instance of the receiver.
80
		 *
82
		 * 
81
		 */
83
		 */
82
		public VirtualManager(){
84
		public VirtualManager() {
83
			addTableListener();
85
			addTableListener();
84
		}
86
		}
85
87
86
		
87
		/**
88
		/**
88
		 * Add the listener for SetData on the table
89
		 * Add the listener for SetData on the table
89
		 */
90
		 */
90
		private void addTableListener() {
91
		private void addTableListener() {
91
			table.addListener(SWT.SetData,new Listener(){
92
			table.addListener(SWT.SetData, new Listener() {
92
				/* (non-Javadoc)
93
				/*
94
				 * (non-Javadoc)
95
				 * 
93
				 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
96
				 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
94
				 */
97
				 */
95
				public void handleEvent(Event event) {
98
				public void handleEvent(Event event) {
96
					TableItem item = (TableItem) event.item;
99
					TableItem item = (TableItem) event.item;
97
					final int index = table.indexOf(item);
100
					final int index = table.indexOf(item);
98
					Object element = resolveElement(index);
101
					Object element = resolveElement(index);
99
					if(element == null){
102
					if (element == null) {
100
						//Didn't find it so make a request
103
						// Didn't find it so make a request
101
						//Keep looking if it is not in the cache.
104
						// Keep looking if it is not in the cache.
102
						IContentProvider contentProvider = getContentProvider();
105
						IContentProvider contentProvider = getContentProvider();
103
						//If we are building lazily then request lookup now
106
						// If we are building lazily then request lookup now
104
						if(contentProvider instanceof ILazyContentProvider){
107
						if (contentProvider instanceof ILazyContentProvider) {
105
							((ILazyContentProvider) contentProvider).
108
							((ILazyContentProvider) contentProvider)
106
								updateElement(index);
109
									.updateElement(index);
107
							return;
110
							return;
108
						}	
111
						}
109
					}
112
					}
110
						
113
111
					
114
					associate(element, item);
112
					associate(element,item);
115
					updateItem(item, element);
113
					updateItem(item,element);
114
				}
116
				}
115
117
116
			});
118
			});
117
		}
119
		}
118
		
120
119
		/**
121
		/**
120
		 * Get the element at index.Resolve it lazily if this
122
		 * Get the element at index.Resolve it lazily if this is available.
121
		 * is available.
123
		 * 
122
		 * @param index
124
		 * @param index
123
		 * @return Object or <code>null</code> if it could
125
		 * @return Object or <code>null</code> if it could not be found
124
		 * not be found
125
		 */
126
		 */
126
		protected Object resolveElement(int index) {
127
		protected Object resolveElement(int index) {
127
			
128
128
			Object element = null;
129
			Object element = null;
129
			if(index < cachedElements.length) {
130
			if (index < cachedElements.length) {
130
				element =  cachedElements[index];
131
				element = cachedElements[index];
131
			}
132
			}
132
			
133
133
			return element;
134
			return element;
134
		}
135
		}
135
136
136
		/**
137
		/**
137
		 * A non visible item has been added.
138
		 * A non visible item has been added.
139
		 * 
138
		 * @param element
140
		 * @param element
139
		 * @param index
141
		 * @param index
140
		 */
142
		 */
141
		public void notVisibleAdded(Object element, int index) {
143
		public void notVisibleAdded(Object element, int index) {
142
			
144
143
			int requiredCount = index + 1;
145
			int requiredCount = index + 1;
144
			
146
145
			if(requiredCount > getTable().getItemCount()){
147
			if (requiredCount > getTable().getItemCount()) {
146
				getTable().setItemCount(requiredCount);
148
				getTable().setItemCount(requiredCount);
147
				Object[] newCache = new Object[requiredCount];
149
				Object[] newCache = new Object[requiredCount];
148
				System.arraycopy(cachedElements, 0, newCache, 0, cachedElements.length);
150
				System.arraycopy(cachedElements, 0, newCache, 0,
151
						cachedElements.length);
149
				cachedElements = newCache;
152
				cachedElements = newCache;
150
			}
153
			}
151
			
154
152
			
153
			cachedElements[index] = element;
155
			cachedElements[index] = element;
154
			
156
155
		}
157
		}
156
		
158
157
	}
159
	}
158
	
160
159
	private VirtualManager virtualManager;
161
	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
162
189
	/**
163
	/**
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.
164
	 * Internal table viewer implementation.
240
	 */
165
	 */
241
	private TableEditorImpl tableViewerImpl;
166
	private TableEditorImpl tableViewerImpl;
Lines 249-260 Link Here
249
	 * This viewer's table editor.
174
	 * This viewer's table editor.
250
	 */
175
	 */
251
	private TableEditor tableEditor;
176
	private TableEditor tableEditor;
252
	
177
253
	/**
178
254
	 * The color and font collector for the cells.
255
	 */
256
	private TableColorAndFontNoOp tableColorAndFont = new TableColorAndFontNoOp();
257
	
258
	/**
179
	/**
259
	 * Creates a table viewer on a newly-created table control under the given
180
	 * 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
181
	 * parent. The table control is created using the SWT style bits
Lines 281-287 Link Here
281
	 *            SWT style bits
202
	 *            SWT style bits
282
	 */
203
	 */
283
	public TableViewer(Composite parent, int style) {
204
	public TableViewer(Composite parent, int style) {
284
		this(new Table(parent, style));			
205
		this(new Table(parent, style));
285
	}
206
	}
286
207
287
	/**
208
	/**
Lines 299-317 Link Here
299
		initTableViewerImpl();
220
		initTableViewerImpl();
300
		initializeVirtualManager(table.getStyle());
221
		initializeVirtualManager(table.getStyle());
301
	}
222
	}
302
	
223
303
	/**
224
	/**
304
	 * Initialize the virtual manager to manage the virtual state
225
	 * 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
226
	 * is VIRTUAL. If not use the default no-op version.
306
	 * version.
227
	 * 
307
	 * @param style
228
	 * @param style
308
	 */
229
	 */
309
	private void initializeVirtualManager(int style) {
230
	private void initializeVirtualManager(int style) {
310
		if((style & SWT.VIRTUAL) == 0) {
231
		if ((style & SWT.VIRTUAL) == 0) {
311
			return;
232
			return;
312
		}
233
		}
313
			
234
314
		virtualManager = new VirtualManager();	
235
		virtualManager = new VirtualManager();
315
	}
236
	}
316
237
317
	/**
238
	/**
Lines 330-336 Link Here
330
	public void add(Object[] elements) {
251
	public void add(Object[] elements) {
331
		assertElementsNotNull(elements);
252
		assertElementsNotNull(elements);
332
		Object[] filtered = filter(elements);
253
		Object[] filtered = filter(elements);
333
		
254
334
		for (int i = 0; i < filtered.length; i++) {
255
		for (int i = 0; i < filtered.length; i++) {
335
			Object element = filtered[i];
256
			Object element = filtered[i];
336
			int index = indexForElement(element);
257
			int index = indexForElement(element);
Lines 340-356 Link Here
340
261
341
	/**
262
	/**
342
	 * Create a new TableItem at index if required.
263
	 * Create a new TableItem at index if required.
264
	 * 
343
	 * @param element
265
	 * @param element
344
	 * @param index
266
	 * @param index
345
	 * 
267
	 * 
346
	 * @since 3.1
268
	 * @since 3.1
347
	 */
269
	 */
348
	private void createItem(Object element, int index) {
270
	private void createItem(Object element, int index) {
349
		if(virtualManager == null) {
271
		if (virtualManager == null) {
350
			updateItem(new TableItem(getTable(), SWT.NONE, index), element);
272
			updateItem(new TableItem(getTable(), SWT.NONE, index), element);
351
		} else{
273
		} else {
352
			virtualManager.notVisibleAdded(element,index);
274
			virtualManager.notVisibleAdded(element, index);
353
			
275
354
		}
276
		}
355
	}
277
	}
356
278
Lines 382-388 Link Here
382
	}
304
	}
383
305
384
	/*
306
	/*
385
	 *  (non-Javadoc)
307
	 * (non-Javadoc)
308
	 * 
386
	 * @see org.eclipse.jface.viewers.StructuredViewer#doFindInputItem(java.lang.Object)
309
	 * @see org.eclipse.jface.viewers.StructuredViewer#doFindInputItem(java.lang.Object)
387
	 */
310
	 */
388
	protected Widget doFindInputItem(Object element) {
311
	protected Widget doFindInputItem(Object element) {
Lines 393-403 Link Here
393
	}
316
	}
394
317
395
	/*
318
	/*
396
	 *  (non-Javadoc)
319
	 * (non-Javadoc)
320
	 * 
397
	 * @see org.eclipse.jface.viewers.StructuredViewer#doFindItem(java.lang.Object)
321
	 * @see org.eclipse.jface.viewers.StructuredViewer#doFindItem(java.lang.Object)
398
	 */
322
	 */
399
	protected Widget doFindItem(Object element) {
323
	protected Widget doFindItem(Object element) {
400
		
324
401
		TableItem[] children = table.getItems();
325
		TableItem[] children = table.getItems();
402
		for (int i = 0; i < children.length; i++) {
326
		for (int i = 0; i < children.length; i++) {
403
			TableItem item = children[i];
327
			TableItem item = children[i];
Lines 411-418 Link Here
411
	}
335
	}
412
336
413
	/*
337
	/*
414
	 *  (non-Javadoc)
338
	 * (non-Javadoc)
415
	 * @see org.eclipse.jface.viewers.StructuredViewer#doUpdateItem(org.eclipse.swt.widgets.Widget, java.lang.Object, boolean)
339
	 * 
340
	 * @see org.eclipse.jface.viewers.StructuredViewer#doUpdateItem(org.eclipse.swt.widgets.Widget,
341
	 *      java.lang.Object, boolean)
416
	 */
342
	 */
417
	protected void doUpdateItem(Widget widget, Object element, boolean fullMap) {
343
	protected void doUpdateItem(Widget widget, Object element, boolean fullMap) {
418
		if (widget instanceof TableItem) {
344
		if (widget instanceof TableItem) {
Lines 422-508 Link Here
422
			if (fullMap) {
348
			if (fullMap) {
423
				associate(element, item);
349
				associate(element, item);
424
			} else {
350
			} else {
425
            	Object data = item.getData();
351
				Object data = item.getData();
426
            	if (data != null) {
352
				if (data != null) {
427
            		unmapElement(data, item);
353
					unmapElement(data, item);
428
            	}
354
				}
429
				item.setData(element);
355
				item.setData(element);
430
				mapElement(element, item);
356
				mapElement(element, item);
431
			}
357
			}
432
358
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();
359
			int columnCount = table.getColumnCount();
451
			TableItem ti = item;
360
			if(columnCount == 0)
452
			getColorAndFontCollector().setFontsAndColors(element);
361
				columnCount = 1;//If there are no columns do the first one 
453
			
362
454
			// Also enter loop if no columns added. See 1G9WWGZ: JFUIF:WINNT -
363
			// Also enter loop if no columns added. See 1G9WWGZ: JFUIF:WINNT -
455
			// TableViewer with 0 columns does not work
364
			// TableViewer with 0 columns does not work
456
			for (int column = 0; column < columnCount || column == 0; column++) {
365
			for (int column = 0; column < columnCount || column == 0; column++) {
457
				// Similar code in TreeViewer.doUpdateItem()
366
				ColumnViewerPart columnViewer = getColumnViewer(column);
458
				String text = "";//$NON-NLS-1$
367
				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
368
490
				//Avoid setting text to null
369
				// As it is possible for user code to run the event
491
				if (text == null) {
370
				// loop check here.
492
					text = ""; //$NON-NLS-1$
371
				if (item.isDisposed()) {
493
				}
372
					unmapElement(element, item);
494
				ti.setText(column, text);
373
					return;
495
				if (ti.getImage(column) != image) {
496
					ti.setImage(column, image);
497
				}
374
				}
375
498
			}
376
			}
499
			
377
500
			
501
			getColorAndFontCollector().applyFontsAndColors(ti);
502
		}
378
		}
503
	}
379
	}
504
380
505
	/**
381
	/**
382
	 * Return the TableColumnViewer at columnIndex
383
	 * 
384
	 * @param columnIndex
385
	 * @return TableColumnViewer
386
	 */
387
	public ColumnViewerPart getColumnViewer(int columnIndex) {
388
389
		Object viewer;
390
		Widget columnOwner;
391
		if (getTable().getColumnCount() == 0)// Hang it off the table if it
392
			// has no columns
393
			columnOwner = getTable();
394
		else
395
			columnOwner = getTable().getColumn(columnIndex);
396
		viewer = columnOwner.getData(ColumnViewerPart.COLUMN_VIEWER_KEY);
397
398
		if (viewer == null) {
399
			viewer = new ColumnViewerPart(
400
					ViewerLabelProvider.createViewerLabelProvider(columnIndex,getLabelProvider()), columnIndex);
401
			columnOwner.setData(ColumnViewerPart.COLUMN_VIEWER_KEY, viewer);
402
		}
403
		return (ColumnViewerPart) viewer;
404
	}
405
406
	/**
407
	 * Set the TableColumnViewerPart at columnIndex to be viewerPart.
408
	 * 
409
	 * @param viewerPart
410
	 * @param columnIndex
411
	 */
412
	public void setColumnPart(ColumnViewerPart viewerPart, int columnIndex) {
413
		TableColumn column = getTable().getColumn(columnIndex);
414
		column.setData(ColumnViewerPart.COLUMN_VIEWER_KEY, viewerPart);
415
	}
416
417
418
	/**
506
	 * Starts editing the given element.
419
	 * Starts editing the given element.
507
	 * 
420
	 * 
508
	 * @param element
421
	 * @param element
Lines 544-550 Link Here
544
	}
457
	}
545
458
546
	/*
459
	/*
547
	 *  (non-Javadoc)
460
	 * (non-Javadoc)
461
	 * 
548
	 * @see org.eclipse.jface.viewers.Viewer#getControl()
462
	 * @see org.eclipse.jface.viewers.Viewer#getControl()
549
	 */
463
	 */
550
	public Control getControl() {
464
	public Control getControl() {
Lines 588-598 Link Here
588
	}
502
	}
589
503
590
	/*
504
	/*
591
	 *  (non-Javadoc)
505
	 * (non-Javadoc)
506
	 * 
592
	 * @see org.eclipse.jface.viewers.StructuredViewer#getSelectionFromWidget()
507
	 * @see org.eclipse.jface.viewers.StructuredViewer#getSelectionFromWidget()
593
	 */
508
	 */
594
	protected List getSelectionFromWidget() {
509
	protected List getSelectionFromWidget() {
595
		if(virtualManager != null) {
510
		if (virtualManager != null) {
596
			return getVirtualSelection();
511
			return getVirtualSelection();
597
		}
512
		}
598
		Widget[] items = table.getSelection();
513
		Widget[] items = table.getSelection();
Lines 606-655 Link Here
606
		}
521
		}
607
		return list;
522
		return list;
608
	}
523
	}
609
	
524
610
	/**
525
	/**
611
	 * Get the virtual selection. Avoid calling SWT whenever possible
526
	 * Get the virtual selection. Avoid calling SWT whenever possible to prevent
612
	 * to prevent extra widget creation.
527
	 * extra widget creation.
528
	 * 
613
	 * @return List of Object
529
	 * @return List of Object
614
	 */
530
	 */
615
531
616
	private List getVirtualSelection() {
532
	private List getVirtualSelection() {
617
		
533
618
		List result = new ArrayList();
534
		List result = new ArrayList();
619
		int[] selectionIndices = getTable().getSelectionIndices(); 
535
		int[] selectionIndices = getTable().getSelectionIndices();
620
		if(getContentProvider() instanceof ILazyContentProvider){
536
		if (getContentProvider() instanceof ILazyContentProvider) {
621
			ILazyContentProvider lazy = (ILazyContentProvider) getContentProvider();
537
			ILazyContentProvider lazy = (ILazyContentProvider) getContentProvider();
622
			for (int i = 0; i < selectionIndices.length; i++) {
538
			for (int i = 0; i < selectionIndices.length; i++) {
623
				int selectionIndex = selectionIndices[i];
539
				int selectionIndex = selectionIndices[i];
624
				lazy.updateElement(selectionIndex);//Start the update
540
				lazy.updateElement(selectionIndex);// Start the update
625
				Object element = getTable().getItem(selectionIndex).getData();
541
				Object element = getTable().getItem(selectionIndex).getData();
626
				//Only add the element if it got updated.
542
				// Only add the element if it got updated.
627
				//If this is done deferred the selection will
543
				// If this is done deferred the selection will
628
				//be incomplete until selection is finished.
544
				// be incomplete until selection is finished.
629
				if (element != null) {
545
				if (element != null) {
630
					result.add(element);
546
					result.add(element);
631
				}				
547
				}
632
			}
548
			}
633
		}
549
		} else {
634
		else{
635
			for (int i = 0; i < selectionIndices.length; i++) {
550
			for (int i = 0; i < selectionIndices.length; i++) {
636
				Object element = null;
551
				Object element = null;
637
				//See if it is cached
552
				// See if it is cached
638
				int selectionIndex = selectionIndices[i];
553
				int selectionIndex = selectionIndices[i];
639
				if (selectionIndex < virtualManager.cachedElements.length){
554
				if (selectionIndex < virtualManager.cachedElements.length) {
640
					element = virtualManager.cachedElements[selectionIndex];
555
					element = virtualManager.cachedElements[selectionIndex];
641
				}
556
				}
642
				if (element == null){
557
				if (element == null) {
643
					// Not cached so try the item's data
558
					// Not cached so try the item's data
644
					TableItem item = getTable().getItem(selectionIndex);
559
					TableItem item = getTable().getItem(selectionIndex);
645
					element = item.getData();
560
					element = item.getData();
646
				}
561
				}
647
				if (element != null) {
562
				if (element != null) {
648
					result.add(element);
563
					result.add(element);
649
				}				
564
				}
650
			}
565
			}
651
			
566
652
			
653
		}
567
		}
654
		return result;
568
		return result;
655
	}
569
	}
Lines 664-670 Link Here
664
	}
578
	}
665
579
666
	/*
580
	/*
667
	 *  (non-Javadoc)
581
	 * (non-Javadoc)
582
	 * 
668
	 * @see org.eclipse.jface.viewers.ContentViewer#hookControl(org.eclipse.swt.widgets.Control)
583
	 * @see org.eclipse.jface.viewers.ContentViewer#hookControl(org.eclipse.swt.widgets.Control)
669
	 */
584
	 */
670
	protected void hookControl(Control control) {
585
	protected void hookControl(Control control) {
Lines 757-764 Link Here
757
	}
672
	}
758
673
759
	/*
674
	/*
760
	 *  (non-Javadoc)
675
	 * (non-Javadoc)
761
	 * @see org.eclipse.jface.viewers.Viewer#inputChanged(java.lang.Object, java.lang.Object)
676
	 * 
677
	 * @see org.eclipse.jface.viewers.Viewer#inputChanged(java.lang.Object,
678
	 *      java.lang.Object)
762
	 */
679
	 */
763
	protected void inputChanged(Object input, Object oldInput) {
680
	protected void inputChanged(Object input, Object oldInput) {
764
		getControl().setRedraw(false);
681
		getControl().setRedraw(false);
Lines 795-806 Link Here
795
		if (position == -1) {
712
		if (position == -1) {
796
			position = table.getItemCount();
713
			position = table.getItemCount();
797
		}
714
		}
798
		
715
799
		createItem(element,position);
716
		createItem(element, position);
800
	}
717
	}
801
718
802
	/*
719
	/*
803
	 *  (non-Javadoc)
720
	 * (non-Javadoc)
721
	 * 
804
	 * @see org.eclipse.jface.viewers.StructuredViewer#internalRefresh(java.lang.Object)
722
	 * @see org.eclipse.jface.viewers.StructuredViewer#internalRefresh(java.lang.Object)
805
	 */
723
	 */
806
	protected void internalRefresh(Object element) {
724
	protected void internalRefresh(Object element) {
Lines 808-822 Link Here
808
	}
726
	}
809
727
810
	/*
728
	/*
811
	 *  (non-Javadoc)
729
	 * (non-Javadoc)
812
	 * @see org.eclipse.jface.viewers.StructuredViewer#internalRefresh(java.lang.Object, boolean)
730
	 * 
731
	 * @see org.eclipse.jface.viewers.StructuredViewer#internalRefresh(java.lang.Object,
732
	 *      boolean)
813
	 */
733
	 */
814
	protected void internalRefresh(Object element, boolean updateLabels) {
734
	protected void internalRefresh(Object element, boolean updateLabels) {
815
		tableViewerImpl.applyEditorValue();
735
		tableViewerImpl.applyEditorValue();
816
		if (element == null || equals(element, getRoot())) {
736
		if (element == null || equals(element, getRoot())) {
817
			if(virtualManager == null) {
737
			if (virtualManager == null) {
818
				internalRefreshAll(updateLabels);
738
				internalRefreshAll(updateLabels);
819
			} else{
739
			} else {
820
				internalVirtualRefreshAll();
740
				internalVirtualRefreshAll();
821
			}
741
			}
822
		} else {
742
		} else {
Lines 833-849 Link Here
833
	 * @since 3.1
753
	 * @since 3.1
834
	 */
754
	 */
835
	private void internalVirtualRefreshAll() {
755
	private void internalVirtualRefreshAll() {
836
		
756
837
		Object root = getRoot();
757
		Object root = getRoot();
838
		IContentProvider contentProvider = getContentProvider();
758
		IContentProvider contentProvider = getContentProvider();
839
		
759
840
		//Invalidate for lazy
760
		// Invalidate for lazy
841
		if(!(contentProvider instanceof ILazyContentProvider) 
761
		if (!(contentProvider instanceof ILazyContentProvider)
842
				&& (contentProvider instanceof IStructuredContentProvider)) {
762
				&& (contentProvider instanceof IStructuredContentProvider)) {
843
			//Don't cache if the root is null but cache if it is not lazy.
763
			// Don't cache if the root is null but cache if it is not lazy.
844
			if(root != null){
764
			if (root != null) {
845
				virtualManager.cachedElements = 
765
				virtualManager.cachedElements = ((IStructuredContentProvider) getContentProvider())
846
					((IStructuredContentProvider) getContentProvider()).getElements(root);
766
						.getElements(root);
847
				getTable().setItemCount(virtualManager.cachedElements.length);
767
				getTable().setItemCount(virtualManager.cachedElements.length);
848
			}
768
			}
849
		}
769
		}
Lines 851-858 Link Here
851
	}
771
	}
852
772
853
	/**
773
	/**
854
	 * Refresh all of the elements of the table. update the
774
	 * Refresh all of the elements of the table. update the labels if
855
	 * labels if updatLabels is true;
775
	 * updatLabels is true;
776
	 * 
856
	 * @param updateLabels
777
	 * @param updateLabels
857
	 * 
778
	 * 
858
	 * @since 3.1
779
	 * @since 3.1
Lines 871-880 Link Here
871
		TableItem[] items = getTable().getItems();
792
		TableItem[] items = getTable().getItems();
872
		int min = Math.min(children.length, items.length);
793
		int min = Math.min(children.length, items.length);
873
		for (int i = 0; i < min; ++i) {
794
		for (int i = 0; i < min; ++i) {
874
			
795
875
			
876
			TableItem item = items[i];
796
			TableItem item = items[i];
877
				
797
878
			// if the element is unchanged, update its label if appropriate
798
			// if the element is unchanged, update its label if appropriate
879
			if (equals(children[i], item.getData())) {
799
			if (equals(children[i], item.getData())) {
880
				if (updateLabels) {
800
				if (updateLabels) {
Lines 893-906 Link Here
893
				// So, if the object associated with this item has changed,
813
				// So, if the object associated with this item has changed,
894
				// just disassociate it for now, and update it below.
814
				// just disassociate it for now, and update it below.
895
				item.setText(""); //$NON-NLS-1$
815
				item.setText(""); //$NON-NLS-1$
896
				item.setImage(new Image[Math.max(1,table.getColumnCount())]);//Clear all images
816
				item.setImage(new Image[Math.max(1, table.getColumnCount())]);// Clear
817
				// all
818
				// images
897
				disassociate(item);
819
				disassociate(item);
898
			}
820
			}
899
		}
821
		}
900
		// dispose of all items beyond the end of the current elements
822
		// dispose of all items beyond the end of the current elements
901
		if (min < items.length) {
823
		if (min < items.length) {
902
			for (int i = items.length; --i >= min;) {
824
			for (int i = items.length; --i >= min;) {
903
				
825
904
				disassociate(items[i]);
826
				disassociate(items[i]);
905
			}
827
			}
906
			table.remove(min, items.length - 1);
828
			table.remove(min, items.length - 1);
Lines 912-918 Link Here
912
		}
834
		}
913
		// Update items which were removed above
835
		// Update items which were removed above
914
		for (int i = 0; i < min; ++i) {
836
		for (int i = 0; i < min; ++i) {
915
							
837
916
			TableItem item = items[i];
838
			TableItem item = items[i];
917
			if (item.getData() == null) {
839
			if (item.getData() == null) {
918
				updateItem(item, children[i]);
840
				updateItem(item, children[i]);
Lines 920-930 Link Here
920
		}
842
		}
921
		// add any remaining elements
843
		// add any remaining elements
922
		for (int i = min; i < children.length; ++i) {
844
		for (int i = min; i < children.length; ++i) {
923
			createItem(children[i],i);
845
			createItem(children[i], i);
924
		}
846
		}
925
	}
847
	}
926
848
927
928
	/**
849
	/**
929
	 * Removes the given elements from this table viewer.
850
	 * Removes the given elements from this table viewer.
930
	 * 
851
	 * 
Lines 987-995 Link Here
987
	 */
908
	 */
988
	public void remove(final Object[] elements) {
909
	public void remove(final Object[] elements) {
989
		assertElementsNotNull(elements);
910
		assertElementsNotNull(elements);
990
        if (elements.length == 0) {
911
		if (elements.length == 0) {
991
        	return;
912
			return;
992
        }
913
		}
993
		preservingSelection(new Runnable() {
914
		preservingSelection(new Runnable() {
994
			public void run() {
915
			public void run() {
995
				internalRemove(elements);
916
				internalRemove(elements);
Lines 1007-1014 Link Here
1007
	 * the model. Note that there is another method for efficiently processing
928
	 * the model. Note that there is another method for efficiently processing
1008
	 * the simultaneous removal of multiple elements.
929
	 * the simultaneous removal of multiple elements.
1009
	 * </p>
930
	 * </p>
1010
	 * <strong>NOTE:</strong> removing an object from a virtual
931
	 * <strong>NOTE:</strong> removing an object from a virtual table will
1011
	 * table will decrement the itemCount.
932
	 * decrement the itemCount.
1012
	 * 
933
	 * 
1013
	 * @param element
934
	 * @param element
1014
	 *            the element
935
	 *            the element
Lines 1018-1024 Link Here
1018
	}
939
	}
1019
940
1020
	/*
941
	/*
1021
	 *  (non-Javadoc)
942
	 * (non-Javadoc)
943
	 * 
1022
	 * @see org.eclipse.jface.viewers.StructuredViewer#reveal(java.lang.Object)
944
	 * @see org.eclipse.jface.viewers.StructuredViewer#reveal(java.lang.Object)
1023
	 */
945
	 */
1024
	public void reveal(Object element) {
946
	public void reveal(Object element) {
Lines 1079-1112 Link Here
1079
	 * may also implement {@link IColorProvider} and/or {@link IFontProvider} to
1001
	 * may also implement {@link IColorProvider} and/or {@link IFontProvider} to
1080
	 * provide colors and/or fonts.
1002
	 * provide colors and/or fonts.
1081
	 * </p>
1003
	 * </p>
1004
	 * <p>
1005
	 * If the label provider implements the mixin interface ITooltipProvider, it
1006
	 * can provide custom tooltips.
1007
	 * </p>
1082
	 */
1008
	 */
1083
	public void setLabelProvider(IBaseLabelProvider labelProvider) {
1009
	public void setLabelProvider(IBaseLabelProvider labelProvider) {
1084
		Assert.isTrue(labelProvider instanceof ITableLabelProvider
1010
		Assert.isTrue(labelProvider instanceof ITableLabelProvider
1085
				|| labelProvider instanceof ILabelProvider);
1011
				|| labelProvider instanceof ILabelProvider);
1012
		clearColumnParts();//Clear before refresh
1086
		super.setLabelProvider(labelProvider);
1013
		super.setLabelProvider(labelProvider);
1087
		if(labelProvider instanceof ITableFontProvider || labelProvider instanceof ITableColorProvider) {
1088
			tableColorAndFont = new TableColorAndFontCollector(labelProvider);
1089
		} else {
1090
			tableColorAndFont = new TableColorAndFontNoOp();
1091
		}
1092
				
1093
	}
1014
	}
1094
	
1015
	
1095
	/**
1016
	/**
1017
	 * Clear the viewer parts for the columns
1018
	 */
1019
	private void clearColumnParts() {
1020
		TableColumn[] columns = getTable().getColumns();
1021
		if(columns.length == 0)
1022
			getTable().setData(ColumnViewerPart.COLUMN_VIEWER_KEY,null);
1023
		else{
1024
			for (int i = 0; i < columns.length; i++) {
1025
				columns[i].setData(ColumnViewerPart.COLUMN_VIEWER_KEY,null);
1026
				
1027
			}
1028
		}
1029
		
1030
	}
1031
1032
	/**
1096
	 * <p>
1033
	 * <p>
1097
	 * Sets a new selection for this viewer and optionally makes it visible.
1034
	 * Sets a new selection for this viewer and optionally makes it visible. The
1098
	 * The TableViewer implmentation of this method is ineffecient for the
1035
	 * TableViewer implmentation of this method is ineffecient for the
1099
	 * ILazyContentProvider as lookup is done by indices rather than elements
1036
	 * ILazyContentProvider as lookup is done by indices rather than elements
1100
	 * and may require population of the entire table in worse case. 
1037
	 * and may require population of the entire table in worse case.
1101
	 * </p>
1038
	 * </p>
1102
	 * <p>
1039
	 * <p>
1103
	 * Use Table#setSelection(int[] indices) and Table#showSelection() if
1040
	 * Use Table#setSelection(int[] indices) and Table#showSelection() if you
1104
	 * you wish to set selection more effeciently when using a ILazyContentProvider.
1041
	 * wish to set selection more effeciently when using a ILazyContentProvider.
1105
	 * </p>
1042
	 * </p>
1106
	 * 
1043
	 * 
1107
	 * @param selection the new selection
1044
	 * @param selection
1108
     * @param reveal <code>true</code> if the selection is to be made
1045
	 *            the new selection
1109
     *   visible, and <code>false</code> otherwise
1046
	 * @param reveal
1047
	 *            <code>true</code> if the selection is to be made visible,
1048
	 *            and <code>false</code> otherwise
1110
	 * @see Table#setSelection(int[])
1049
	 * @see Table#setSelection(int[])
1111
	 * @see Table#showSelection()
1050
	 * @see Table#showSelection()
1112
	 */
1051
	 */
Lines 1115-1135 Link Here
1115
	}
1054
	}
1116
1055
1117
	/*
1056
	/*
1118
	 *  (non-Javadoc)
1057
	 * (non-Javadoc)
1119
	 * @see org.eclipse.jface.viewers.StructuredViewer#setSelectionToWidget(java.util.List, boolean)
1058
	 * 
1059
	 * @see org.eclipse.jface.viewers.StructuredViewer#setSelectionToWidget(java.util.List,
1060
	 *      boolean)
1120
	 */
1061
	 */
1121
	protected void setSelectionToWidget(List list, boolean reveal) {
1062
	protected void setSelectionToWidget(List list, boolean reveal) {
1122
		
1063
1123
		if (list == null) {
1064
		if (list == null) {
1124
			table.deselectAll();
1065
			table.deselectAll();
1125
			return;
1066
			return;
1126
		}
1067
		}
1127
		
1068
1128
		if(virtualManager != null){
1069
		if (virtualManager != null) {
1129
			virtualSetSelectionToWidget(list, reveal);
1070
			virtualSetSelectionToWidget(list, reveal);
1130
			return;
1071
			return;
1131
		}
1072
		}
1132
		
1073
1133
		int size = list.size();
1074
		int size = list.size();
1134
		TableItem[] items = new TableItem[size];
1075
		TableItem[] items = new TableItem[size];
1135
		int count = 0;
1076
		int count = 0;
Lines 1149-1170 Link Here
1149
		if (reveal) {
1090
		if (reveal) {
1150
			table.showSelection();
1091
			table.showSelection();
1151
		}
1092
		}
1152
			
1093
1153
	}
1094
	}
1154
	
1095
1155
	
1156
	/**
1096
	/**
1157
	 * Set the selection on a virtual table
1097
	 * Set the selection on a virtual table
1158
	 * @param list The elements to set
1098
	 * 
1159
	 * @param reveal Whether or not reveal the first item.
1099
	 * @param list
1100
	 *            The elements to set
1101
	 * @param reveal
1102
	 *            Whether or not reveal the first item.
1160
	 */
1103
	 */
1161
	private void virtualSetSelectionToWidget(List list, boolean reveal) {
1104
	private void virtualSetSelectionToWidget(List list, boolean reveal) {
1162
		int size = list.size();
1105
		int size = list.size();
1163
		int[] indices = new int[list.size()];
1106
		int[] indices = new int[list.size()];
1164
		
1107
1165
		TableItem firstItem = null;
1108
		TableItem firstItem = null;
1166
		int count = 0;
1109
		int count = 0;
1167
		HashSet virtualElements = new HashSet(); 
1110
		HashSet virtualElements = new HashSet();
1168
		for (int i = 0; i < size; ++i) {
1111
		for (int i = 0; i < size; ++i) {
1169
			Object o = list.get(i);
1112
			Object o = list.get(i);
1170
			Widget w = findItem(o);
1113
			Widget w = findItem(o);
Lines 1178-1214 Link Here
1178
				virtualElements.add(o);
1121
				virtualElements.add(o);
1179
			}
1122
			}
1180
		}
1123
		}
1181
		
1124
1182
		if(getContentProvider() instanceof ILazyContentProvider){
1125
		if (getContentProvider() instanceof ILazyContentProvider) {
1183
			ILazyContentProvider provider = 
1126
			ILazyContentProvider provider = (ILazyContentProvider) getContentProvider();
1184
				(ILazyContentProvider) getContentProvider();
1127
1185
		
1128
			// 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
1129
			// virtual
1187
			//This may create all items so it is not a good
1130
			// This may create all items so it is not a good
1188
			//idea in general.
1131
			// idea in general.
1189
			//Use #setSelection (int [] indices,boolean reveal) instead
1132
			// Use #setSelection (int [] indices,boolean reveal) instead
1190
			for (int i = 0; virtualElements.size() > 0 && i < getTable().getItemCount(); i++) {
1133
			for (int i = 0; virtualElements.size() > 0
1134
					&& i < getTable().getItemCount(); i++) {
1191
				provider.updateElement(i);
1135
				provider.updateElement(i);
1192
				TableItem item = getTable().getItem(i);
1136
				TableItem item = getTable().getItem(i);
1193
				if(virtualElements.contains(item.getData())){
1137
				if (virtualElements.contains(item.getData())) {
1194
					indices[count++] = i;	
1138
					indices[count++] = i;
1195
					virtualElements.remove(item.getData());
1139
					virtualElements.remove(item.getData());
1196
					if (firstItem == null) {
1140
					if (firstItem == null) {
1197
						firstItem = item;
1141
						firstItem = item;
1198
					}
1142
					}
1199
				}
1143
				}
1200
			}
1144
			}
1201
		}
1145
		} else {
1202
		else{
1146
1203
			
1147
			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
1148
				// have been found
1205
				//If it is not lazy we can use the cache
1149
				// If it is not lazy we can use the cache
1206
				for (int i = 0; i < virtualManager.cachedElements.length; i++) {
1150
				for (int i = 0; i < virtualManager.cachedElements.length; i++) {
1207
					Object element = virtualManager.cachedElements[i];
1151
					Object element = virtualManager.cachedElements[i];
1208
					if(virtualElements.contains(element)){
1152
					if (virtualElements.contains(element)) {
1209
						TableItem item = getTable().getItem(i);
1153
						TableItem item = getTable().getItem(i);
1210
						item.getText();//Be sure to fire the update
1154
						item.getText();// Be sure to fire the update
1211
						indices[count++] = i;	
1155
						indices[count++] = i;
1212
						virtualElements.remove(element);
1156
						virtualElements.remove(element);
1213
						if (firstItem == null) {
1157
						if (firstItem == null) {
1214
							firstItem = item;
1158
							firstItem = item;
Lines 1217-1223 Link Here
1217
				}
1161
				}
1218
			}
1162
			}
1219
		}
1163
		}
1220
		
1164
1221
		if (count < size) {
1165
		if (count < size) {
1222
			System.arraycopy(indices, 0, indices = new int[count], 0, count);
1166
			System.arraycopy(indices, 0, indices = new int[count], 0, count);
1223
		}
1167
		}
Lines 1230-1264 Link Here
1230
1174
1231
	/**
1175
	/**
1232
	 * Set the item count of the receiver.
1176
	 * Set the item count of the receiver.
1233
	 * @param count the new table size.
1177
	 * 
1178
	 * @param count
1179
	 *            the new table size.
1234
	 * 
1180
	 * 
1235
	 * @since 3.1
1181
	 * @since 3.1
1236
	 */
1182
	 */
1237
	public void setItemCount(int count){
1183
	public void setItemCount(int count) {
1238
		getTable().setItemCount(count);
1184
		getTable().setItemCount(count);
1239
		getTable().redraw();
1185
		getTable().redraw();
1240
	}
1186
	}
1241
	
1187
1242
	/**
1188
	/**
1243
	 * Replace the entries starting at index with elements.
1189
	 * Replace the entries starting at index with elements. This method assumes
1244
	 * This method assumes all of these values are correct
1190
	 * all of these values are correct and will not call the content provider to
1245
	 * and will not call the content provider to verify.
1191
	 * verify. <strong>Note that this method will create a TableItem for all of
1246
	 * <strong>Note that this method will create a TableItem
1192
	 * the elements provided</strong>.
1247
	 * for all of the elements provided</strong>.
1193
	 * 
1248
	 * @param element
1194
	 * @param element
1249
	 * @param index
1195
	 * @param index
1250
	 * @see ILazyContentProvider
1196
	 * @see ILazyContentProvider
1251
	 * 
1197
	 * 
1252
	 * @since 3.1
1198
	 * @since 3.1
1253
	 */
1199
	 */
1254
	public void replace(Object element, int index){
1200
	public void replace(Object element, int index) {
1255
		TableItem item = getTable().getItem(index);
1201
		TableItem item = getTable().getItem(index);
1256
		refreshItem(item, element);
1202
		refreshItem(item, element);
1257
	}
1203
	}
1258
1204
1259
	/**
1205
	/**
1260
	 * Clear the table item at the specified index
1206
	 * Clear the table item at the specified index
1261
	 * @param index the index of the table item to be cleared
1207
	 * 
1208
	 * @param index
1209
	 *            the index of the table item to be cleared
1262
	 * 
1210
	 * 
1263
	 * @since 3.1
1211
	 * @since 3.1
1264
	 */
1212
	 */
Lines 1269-1294 Link Here
1269
		}
1217
		}
1270
		table.clear(index);
1218
		table.clear(index);
1271
	}
1219
	}
1272
	
1220
1273
	/* (non-Javadoc)
1221
	/*
1222
	 * (non-Javadoc)
1223
	 * 
1274
	 * @see org.eclipse.jface.viewers.StructuredViewer#getRawChildren(java.lang.Object)
1224
	 * @see org.eclipse.jface.viewers.StructuredViewer#getRawChildren(java.lang.Object)
1275
	 */
1225
	 */
1276
	protected Object[] getRawChildren(Object parent) {
1226
	protected Object[] getRawChildren(Object parent) {
1277
1227
1278
		Assert.isTrue(!(getContentProvider() instanceof ILazyContentProvider),"Cannot get raw children with an ILazyContentProvider");//$NON-NLS-1$
1228
		Assert.isTrue(!(getContentProvider() instanceof ILazyContentProvider),
1229
				"Cannot get raw children with an ILazyContentProvider");//$NON-NLS-1$
1279
		return super.getRawChildren(parent);
1230
		return super.getRawChildren(parent);
1280
	
1231
1281
	}
1232
	}
1282
	
1233
1283
	/* (non-Javadoc)
1234
	/*
1235
	 * (non-Javadoc)
1236
	 * 
1284
	 * @see org.eclipse.jface.viewers.StructuredViewer#assertContentProviderType(org.eclipse.jface.viewers.IContentProvider)
1237
	 * @see org.eclipse.jface.viewers.StructuredViewer#assertContentProviderType(org.eclipse.jface.viewers.IContentProvider)
1285
	 */
1238
	 */
1286
	protected void assertContentProviderType(IContentProvider provider) {
1239
	protected void assertContentProviderType(IContentProvider provider) {
1287
		Assert.isTrue(provider instanceof IStructuredContentProvider ||
1240
		Assert.isTrue(provider instanceof IStructuredContentProvider
1288
				provider instanceof ILazyContentProvider);
1241
				|| provider instanceof ILazyContentProvider);
1289
	}
1242
	}
1290
	
1291
	
1292
	
1293
}
1294
1243
1244
}
(-)src/org/eclipse/jface/viewers/TreeViewer.java (-312 / +218 lines)
Lines 22-28 Link Here
22
import org.eclipse.swt.events.MouseAdapter;
22
import org.eclipse.swt.events.MouseAdapter;
23
import org.eclipse.swt.events.MouseEvent;
23
import org.eclipse.swt.events.MouseEvent;
24
import org.eclipse.swt.events.TreeListener;
24
import org.eclipse.swt.events.TreeListener;
25
import org.eclipse.swt.graphics.Image;
26
import org.eclipse.swt.graphics.Point;
25
import org.eclipse.swt.graphics.Point;
27
import org.eclipse.swt.graphics.Rectangle;
26
import org.eclipse.swt.graphics.Rectangle;
28
import org.eclipse.swt.widgets.Composite;
27
import org.eclipse.swt.widgets.Composite;
Lines 55-123 Link Here
55
public class TreeViewer extends AbstractTreeViewer {
54
public class TreeViewer extends AbstractTreeViewer {
56
55
57
	/**
56
	/**
58
	 * TreeColorAndFontCollector is an helper class for color and font support
59
	 * for trees that support the ITableFontProvider and the
60
	 * ITableColorProvider.
61
	 * 
62
	 * @see ITableColorProvider
63
	 * @see ITableFontProvider
64
	 */
65
66
	private class TreeColorAndFontCollector {
67
68
		ITableFontProvider fontProvider = null;
69
70
		ITableColorProvider colorProvider = null;
71
72
		/**
73
		 * Create an instance of the receiver. Set the color and font providers
74
		 * if provider can be cast to the correct type.
75
		 * 
76
		 * @param provider
77
		 *            IBaseLabelProvider
78
		 */
79
		public TreeColorAndFontCollector(IBaseLabelProvider provider) {
80
			if (provider instanceof ITableFontProvider) {
81
				fontProvider = (ITableFontProvider) provider;
82
			}
83
			if (provider instanceof ITableColorProvider) {
84
				colorProvider = (ITableColorProvider) provider;
85
			}
86
		}
87
88
		/**
89
		 * Create an instance of the receiver with no color and font providers.
90
		 */
91
		public TreeColorAndFontCollector() {
92
		}
93
94
		/**
95
		 * Set the fonts and colors for the treeItem if there is a color and
96
		 * font provider available.
97
		 * 
98
		 * @param treeItem
99
		 *            The item to update.
100
		 * @param element
101
		 *            The element being represented
102
		 * @param column
103
		 *            The column index
104
		 */
105
		public void setFontsAndColors(TreeItem treeItem, Object element,
106
				int column) {
107
			if (colorProvider != null) {
108
				treeItem.setBackground(column, colorProvider.getBackground(
109
						element, column));
110
				treeItem.setForeground(column, colorProvider.getForeground(
111
						element, column));
112
			}
113
			if (fontProvider != null) {
114
				treeItem.setFont(column, fontProvider.getFont(element, column));
115
			}
116
		}
117
118
	}
119
120
	/**
121
	 * Internal tree viewer implementation.
57
	 * Internal tree viewer implementation.
122
	 */
58
	 */
123
	private TreeEditorImpl treeViewerImpl;
59
	private TreeEditorImpl treeViewerImpl;
Lines 133-143 Link Here
133
	private TreeEditor treeEditor;
69
	private TreeEditor treeEditor;
134
70
135
	/**
71
	/**
136
	 * The color and font collector for the cells.
137
	 */
138
	private TreeColorAndFontCollector treeColorAndFont = new TreeColorAndFontCollector();
139
	
140
	/**
141
	 * Flag for whether the tree has been disposed of.
72
	 * Flag for whether the tree has been disposed of.
142
	 */
73
	 */
143
	private boolean treeIsDisposed = false;
74
	private boolean treeIsDisposed = false;
Lines 207-213 Link Here
207
	 * (non-Javadoc) Method declared in AbstractTreeViewer.
138
	 * (non-Javadoc) Method declared in AbstractTreeViewer.
208
	 */
139
	 */
209
	protected void doUpdateItem(final Item item, Object element) {
140
	protected void doUpdateItem(final Item item, Object element) {
210
		if (!(item instanceof TreeItem)) {
141
 		if (!(item instanceof TreeItem)) {
211
			return;
142
			return;
212
		}
143
		}
213
		TreeItem treeItem = (TreeItem) item;
144
		TreeItem treeItem = (TreeItem) item;
Lines 216-331 Link Here
216
			return;
147
			return;
217
		}
148
		}
218
149
219
		getColorAndFontCollector().setFontsAndColors(element);
150
		int columnCount = getTree().getColumnCount();
220
151
		if(columnCount == 0)//If no columns are created then fake one
221
		IBaseLabelProvider prov = getLabelProvider();
152
			columnCount = 1;
222
		ITableLabelProvider tprov = null;
153
223
		ILabelProvider lprov = null;
154
		for (int column = 0; column < columnCount; column++) {
224
		IViewerLabelProvider vprov = null;
155
			ColumnViewerPart columnViewer = getColumnViewer(column);
225
		ITreePathLabelProvider pprov = null;
156
			columnViewer.refresh(treeItem, element);
226
		
227
		if(prov instanceof ILabelProvider) {
228
			lprov = (ILabelProvider) prov;
229
		}
230
		
231
		if (prov instanceof IViewerLabelProvider) {
232
			vprov = (IViewerLabelProvider) prov;
233
		} 
234
		
235
		if (prov instanceof ITableLabelProvider) {
236
			tprov = (ITableLabelProvider) prov;
237
		}
238
		
239
		if (prov instanceof ITreePathLabelProvider) {
240
			pprov = (ITreePathLabelProvider) prov;
241
		}
242
		
243
		
244
		int columnCount = tree.getColumnCount();
245
		if (columnCount == 0) {// If no columns were created use the label
246
								// provider
247
248
			ViewerLabel updateLabel = new ViewerLabel(treeItem.getText(),
249
					treeItem.getImage());
250
			if (pprov != null) {
251
				TreePath path = getTreePathFromItem(item);
252
				buildLabel(updateLabel,path,pprov);
253
			} else 
254
				if(vprov != null) {
255
					buildLabel(updateLabel,element,vprov);
256
				} else{
257
					if(lprov != null) {
258
						buildLabel(updateLabel,element,lprov);
259
					}
260
				}
261
157
262
			// As it is possible for user code to run the event
158
			// As it is possible for user code to run the event
263
			// loop check here.
159
			// loop check here.
264
			if (treeItem.isDisposed()) {
160
			if (item.isDisposed()) {
265
				unmapElement(element, treeItem);
161
				unmapElement(element, item);
266
				return;
162
				return;
267
			}
163
			}
268
164
269
			if (updateLabel.hasNewText()) {
165
		}
270
				treeItem.setText(updateLabel.getText());
271
			}
272
			if (updateLabel.hasNewImage()) {
273
				treeItem.setImage(updateLabel.getImage());
274
			}
275
			
276
			if (!updateLabel.hasPendingDecorations())
277
				getColorAndFontCollector().applyFontsAndColors(treeItem);
278
279
		} else {// Use the table based support
280
			for (int column = 0; column < columnCount; column++) {
281
				// Similar code in TableViewer.doUpdateItem()
282
				String text = "";//$NON-NLS-1$
283
				Image image = null;
284
				treeColorAndFont.setFontsAndColors(treeItem, element, column);
285
286
				if (tprov == null) {
287
					if (column == 0) {
288
						ViewerLabel updateLabel = new ViewerLabel(treeItem
289
								.getText(), treeItem.getImage());
290
						if(vprov != null) {
291
							buildLabel(updateLabel,element,vprov);
292
						} else{
293
							if(lprov != null) {
294
								buildLabel(updateLabel,element,lprov);
295
							}
296
						}
297
166
298
						// As it is possible for user code to run the event
167
	}
299
						// loop check here.
300
						if (treeItem.isDisposed()) {
301
							unmapElement(element, treeItem);
302
							return;
303
						}
304
168
305
						text = updateLabel.getText();
169
	/**
306
						image = updateLabel.getImage();
170
	 * Get the TreeColumnViewerPart at the columnIndex.
307
					}
171
	 * 
308
				} else {
172
	 * @param columnIndex
309
					text = tprov.getColumnText(element, column);
173
	 * @return ColumnViewerPart
310
					image = tprov.getColumnImage(element, column);
174
	 */
311
				}
175
	private ColumnViewerPart getColumnViewer(int columnIndex) {
312
176
313
				// Avoid setting text to null
177
		Object viewer;
314
				if (text == null) {
178
		Widget columnOwner;
315
					text = ""; //$NON-NLS-1$
179
		if (getTree().getColumnCount() == 0)// Hang it off the table if it
316
				}
180
			// has no columns
317
				treeItem.setText(column, text);
181
			columnOwner = getTree();
318
				if (treeItem.getImage(column) != image) {
182
		else
319
					treeItem.setImage(column, image);
183
			columnOwner = getTree().getColumn(columnIndex);
320
				}
184
		viewer = columnOwner.getData(ColumnViewerPart.COLUMN_VIEWER_KEY);
321
			}
185
322
			getColorAndFontCollector().applyFontsAndColors(treeItem);
186
		if (viewer == null) {
187
			viewer = new ColumnViewerPart(
188
					ViewerLabelProvider.createViewerLabelProvider(columnIndex,
189
							getLabelProvider()), columnIndex);
190
			columnOwner.setData(ColumnViewerPart.COLUMN_VIEWER_KEY, viewer);
323
		}
191
		}
192
		return (ColumnViewerPart) viewer;
324
	}
193
	}
325
	
194
326
	/**
195
	/**
327
	 * Override to handle tree paths.
196
	 * Override to handle tree paths.
328
	 * @see org.eclipse.jface.viewers.StructuredViewer#buildLabel(org.eclipse.jface.viewers.ViewerLabel, java.lang.Object)
197
	 * 
198
	 * @see org.eclipse.jface.viewers.StructuredViewer#buildLabel(org.eclipse.jface.viewers.ViewerLabel,
199
	 *      java.lang.Object)
329
	 */
200
	 */
330
	protected void buildLabel(ViewerLabel updateLabel, Object elementOrPath) {
201
	protected void buildLabel(ViewerLabel updateLabel, Object elementOrPath) {
331
		Object element;
202
		Object element;
Lines 463-469 Link Here
463
	protected Item getParentItem(Item item) {
334
	protected Item getParentItem(Item item) {
464
		return ((TreeItem) item).getParentItem();
335
		return ((TreeItem) item).getParentItem();
465
	}
336
	}
466
	
337
467
	/*
338
	/*
468
	 * (non-Javadoc) Method declared in AbstractTreeViewer.
339
	 * (non-Javadoc) Method declared in AbstractTreeViewer.
469
	 */
340
	 */
Lines 494-505 Link Here
494
			}
365
			}
495
		});
366
		});
496
		if ((treeControl.getStyle() & SWT.VIRTUAL) != 0) {
367
		if ((treeControl.getStyle() & SWT.VIRTUAL) != 0) {
497
			treeControl.addDisposeListener(new DisposeListener(){
368
			treeControl.addDisposeListener(new DisposeListener() {
498
				public void widgetDisposed(DisposeEvent e) {
369
				public void widgetDisposed(DisposeEvent e) {
499
					treeIsDisposed = true;
370
					treeIsDisposed = true;
500
					unmapAllElements();
371
					unmapAllElements();
501
				}});
372
				}
502
			treeControl.addListener(SWT.SetData, new Listener(){
373
			});
374
			treeControl.addListener(SWT.SetData, new Listener() {
503
375
504
				public void handleEvent(Event event) {
376
				public void handleEvent(Event event) {
505
					if (getContentProvider() instanceof ILazyTreeContentProvider) {
377
					if (getContentProvider() instanceof ILazyTreeContentProvider) {
Lines 645-651 Link Here
645
	 */
517
	 */
646
	protected void setExpanded(Item node, boolean expand) {
518
	protected void setExpanded(Item node, boolean expand) {
647
		((TreeItem) node).setExpanded(expand);
519
		((TreeItem) node).setExpanded(expand);
648
		if(getContentProvider() instanceof ILazyTreeContentProvider) {
520
		if (getContentProvider() instanceof ILazyTreeContentProvider) {
649
			// force repaints to happen
521
			// force repaints to happen
650
			getControl().update();
522
			getControl().update();
651
		}
523
		}
Lines 661-667 Link Here
661
	 * <code>ITableLabelProvider</code> may also implement
533
	 * <code>ITableLabelProvider</code> may also implement
662
	 * {@link ITableColorProvider} and/or {@link ITableFontProvider} to provide
534
	 * {@link ITableColorProvider} and/or {@link ITableFontProvider} to provide
663
	 * colors and/or fonts. Note that the underlying {@link Tree} must be
535
	 * colors and/or fonts. Note that the underlying {@link Tree} must be
664
	 * configured with {@link TreeColumn} objects in this case. 
536
	 * configured with {@link TreeColumn} objects in this case.
665
	 * </p>
537
	 * </p>
666
	 * <p>
538
	 * <p>
667
	 * If the label provider is an <code>ILabelProvider</code>, then it
539
	 * If the label provider is an <code>ILabelProvider</code>, then it
Lines 674-681 Link Here
674
	public void setLabelProvider(IBaseLabelProvider labelProvider) {
546
	public void setLabelProvider(IBaseLabelProvider labelProvider) {
675
		Assert.isTrue(labelProvider instanceof ITableLabelProvider
547
		Assert.isTrue(labelProvider instanceof ITableLabelProvider
676
				|| labelProvider instanceof ILabelProvider);
548
				|| labelProvider instanceof ILabelProvider);
549
		clearColumnParts();//Clear before refresh
677
		super.setLabelProvider(labelProvider);
550
		super.setLabelProvider(labelProvider);
678
		treeColorAndFont = new TreeColorAndFontCollector(labelProvider);
551
		
552
	}
553
554
	/**
555
	 * Clear the viewer parts for the columns
556
	 */
557
	private void clearColumnParts() {
558
		TreeColumn[] columns = getTree().getColumns();
559
		if(columns.length == 0)
560
			getTree().setData(ColumnViewerPart.COLUMN_VIEWER_KEY,null);
561
		else{
562
			for (int i = 0; i < columns.length; i++) {
563
				columns[i].setData(ColumnViewerPart.COLUMN_VIEWER_KEY,null);
564
				
565
			}
566
		}
567
		
679
	}
568
	}
680
569
681
	/*
570
	/*
Lines 705-711 Link Here
705
	 *            the array of items
594
	 *            the array of items
706
	 * @return <code>true</code> if the refer to the same elements,
595
	 * @return <code>true</code> if the refer to the same elements,
707
	 *         <code>false</code> otherwise
596
	 *         <code>false</code> otherwise
708
	 *         
597
	 * 
709
	 * @since 3.1
598
	 * @since 3.1
710
	 */
599
	 */
711
	protected boolean isSameSelection(List items, Item[] current) {
600
	protected boolean isSameSelection(List items, Item[] current) {
Lines 725-731 Link Here
725
		// Go through the items of the current collection
614
		// Go through the items of the current collection
726
		// If there is a mismatch return false
615
		// If there is a mismatch return false
727
		for (int i = 0; i < current.length; i++) {
616
		for (int i = 0; i < current.length; i++) {
728
			if (current[i].getData() == null || !itemSet.containsKey(current[i].getData())) {
617
			if (current[i].getData() == null
618
					|| !itemSet.containsKey(current[i].getData())) {
729
				return false;
619
				return false;
730
			}
620
			}
731
		}
621
		}
Lines 740-748 Link Here
740
		getTree().showItem((TreeItem) item);
630
		getTree().showItem((TreeItem) item);
741
	}
631
	}
742
632
743
633
	/*
744
	/* (non-Javadoc)
634
	 * (non-Javadoc)
745
	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#getChild(org.eclipse.swt.widgets.Widget, int)
635
	 * 
636
	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#getChild(org.eclipse.swt.widgets.Widget,
637
	 *      int)
746
	 */
638
	 */
747
	protected Item getChild(Widget widget, int index) {
639
	protected Item getChild(Widget widget, int index) {
748
		if (widget instanceof TreeItem) {
640
		if (widget instanceof TreeItem) {
Lines 753-790 Link Here
753
		}
645
		}
754
		return null;
646
		return null;
755
	}
647
	}
756
	
648
757
	protected void assertContentProviderType(IContentProvider provider) {
649
	protected void assertContentProviderType(IContentProvider provider) {
758
		if(provider instanceof ILazyTreeContentProvider) {
650
		if (provider instanceof ILazyTreeContentProvider) {
759
			return;
651
			return;
760
		}
652
		}
761
		super.assertContentProviderType(provider);
653
		super.assertContentProviderType(provider);
762
	}
654
	}
763
	
655
764
    protected Object[] getRawChildren(Object parent) {
656
	protected Object[] getRawChildren(Object parent) {
765
    	if(getContentProvider() instanceof ILazyTreeContentProvider) {
657
		if (getContentProvider() instanceof ILazyTreeContentProvider) {
766
    		return new Object[0];
658
			return new Object[0];
767
    	}
659
		}
768
    	return super.getRawChildren(parent);
660
		return super.getRawChildren(parent);
769
    }
661
	}
770
662
771
    /**
663
	/**
772
     * For a TreeViewer with a tree with the VIRTUAL style bit set, set the
664
	 * For a TreeViewer with a tree with the VIRTUAL style bit set, set the
773
     * number of children of the given element. To set the number of children
665
	 * number of children of the given element. To set the number of children of
774
     * of the invisible root of the tree, the input object is passed as the
666
	 * the invisible root of the tree, the input object is passed as the
775
     * element.
667
	 * element.
776
     * 
668
	 * 
777
     * @param element
669
	 * @param element
778
     * @param count
670
	 * @param count
779
     * 
671
	 * 
780
	 * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
672
	 * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
781
	 * part of a work in progress. There is no guarantee that this API will remain
673
	 * part of a work in progress. There is no guarantee that this API will
782
	 * unchanged during the 3.2 release cycle. Please do not use this API without
674
	 * remain unchanged during the 3.2 release cycle. Please do not use this API
783
	 * consulting with the Platform/UI team.
675
	 * without consulting with the Platform/UI team.
784
	 * </p>
676
	 * </p>
785
     * 
677
	 * 
786
     * @since 3.2
678
	 * @since 3.2
787
     */
679
	 */
788
	public void setChildCount(Object element, int count) {
680
	public void setChildCount(Object element, int count) {
789
		Tree tree = (Tree) doFindInputItem(element);
681
		Tree tree = (Tree) doFindInputItem(element);
790
		if (tree != null) {
682
		if (tree != null) {
Lines 793-801 Link Here
793
		}
685
		}
794
		Widget[] items = findItems(element);
686
		Widget[] items = findItems(element);
795
		for (int i = 0; i < items.length; i++) {
687
		for (int i = 0; i < items.length; i++) {
796
			TreeItem treeItem = (TreeItem)items[i];
688
			TreeItem treeItem = (TreeItem) items[i];
797
			treeItem.setItemCount(count);
689
			treeItem.setItemCount(count);
798
		}		
690
		}
799
	}
691
	}
800
692
801
	/**
693
	/**
Lines 807-829 Link Here
807
	 * This method should be called by implementers of ILazyTreeContentProvider
699
	 * This method should be called by implementers of ILazyTreeContentProvider
808
	 * to populate this viewer.
700
	 * to populate this viewer.
809
	 * </p>
701
	 * </p>
810
	 * @param parent the parent of the element that should be updated
702
	 * 
811
	 * @param index the index in the parent's children
703
	 * @param parent
812
	 * @param element the new element
704
	 *            the parent of the element that should be updated
705
	 * @param index
706
	 *            the index in the parent's children
707
	 * @param element
708
	 *            the new element
813
	 * 
709
	 * 
814
	 * @see #setChildCount(Object, int)
710
	 * @see #setChildCount(Object, int)
815
	 * @see ILazyTreeContentProvider
711
	 * @see ILazyTreeContentProvider
816
     * 
712
	 * 
817
	 * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
713
	 * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
818
	 * part of a work in progress. There is no guarantee that this API will remain
714
	 * part of a work in progress. There is no guarantee that this API will
819
	 * unchanged during the 3.2 release cycle. Please do not use this API without
715
	 * remain unchanged during the 3.2 release cycle. Please do not use this API
820
	 * consulting with the Platform/UI team.
716
	 * without consulting with the Platform/UI team.
821
	 * </p>
717
	 * </p>
822
     * 
718
	 * 
823
	 * @since 3.2
719
	 * @since 3.2
824
	 */
720
	 */
825
	public void replace(Object parent, int index, Object element) {
721
	public void replace(Object parent, int index, Object element) {
826
		if(parent.equals(getInput())) {
722
		if (parent.equals(getInput())) {
827
			if (index < tree.getItemCount()) {
723
			if (index < tree.getItemCount()) {
828
				updateItem(tree.getItem(index), element);
724
				updateItem(tree.getItem(index), element);
829
			}
725
			}
Lines 834-914 Link Here
834
				if (index < parentItem.getItemCount()) {
730
				if (index < parentItem.getItemCount()) {
835
					updateItem(parentItem.getItem(index), element);
731
					updateItem(parentItem.getItem(index), element);
836
				}
732
				}
837
			}			
733
			}
734
		}
735
	}
736
737
	public boolean isExpandable(Object element) {
738
		if (getContentProvider() instanceof ILazyTreeContentProvider) {
739
			TreeItem treeItem = (TreeItem) internalExpand(element, false);
740
			if (treeItem == null) {
741
				return false;
742
			}
743
			virtualMaterializeItem(treeItem);
744
			return treeItem.getItemCount() > 0;
838
		}
745
		}
746
		return super.isExpandable(element);
839
	}
747
	}
840
	
748
841
    public boolean isExpandable(Object element) {
749
	protected Object getParentElement(Object element) {
842
    	if (getContentProvider() instanceof ILazyTreeContentProvider) {
750
		if (!(element instanceof TreePath)
843
    		TreeItem treeItem = (TreeItem) internalExpand(element, false);
751
				&& (getContentProvider() instanceof ILazyTreeContentProvider)) {
844
    		if (treeItem == null) {
752
			ILazyTreeContentProvider lazyTreeContentProvider = (ILazyTreeContentProvider) getContentProvider();
845
    			return false;
753
			return lazyTreeContentProvider.getParent(element);
846
    		}
754
		}
847
    		virtualMaterializeItem(treeItem);
755
		return super.getParentElement(element);
848
    		return treeItem.getItemCount() > 0;
756
	}
849
    	}
757
850
    	return super.isExpandable(element);
758
	protected void createChildren(Widget widget) {
851
    }
759
		if (getContentProvider() instanceof ILazyTreeContentProvider) {
852
760
			final Item[] tis = getChildren(widget);
853
    protected Object getParentElement(Object element) {
761
			if (tis != null && tis.length > 0) {
854
    	if(!(element instanceof TreePath) && (getContentProvider() instanceof ILazyTreeContentProvider)) {
762
				// children already there, touch them
855
    		ILazyTreeContentProvider lazyTreeContentProvider = (ILazyTreeContentProvider) getContentProvider();
763
				for (int i = 0; i < tis.length; i++) {
856
    		return lazyTreeContentProvider.getParent(element);
857
    	}
858
        return super.getParentElement(element);
859
	}
860
    
861
    protected void createChildren(Widget widget) {
862
    	if (getContentProvider() instanceof ILazyTreeContentProvider) {
863
    		final Item[] tis = getChildren(widget);
864
    		if (tis != null && tis.length > 0) {
865
    			// children already there, touch them
866
    			for (int i = 0; i < tis.length; i++) {
867
					tis[i].getText();
764
					tis[i].getText();
868
				}
765
				}
869
    			return;
766
				return;
870
    		}
767
			}
871
    		ILazyTreeContentProvider lazyTreeContentProvider = (ILazyTreeContentProvider) getContentProvider();
768
			ILazyTreeContentProvider lazyTreeContentProvider = (ILazyTreeContentProvider) getContentProvider();
872
    		Object element = widget.getData();
769
			Object element = widget.getData();
873
    		if (element == null && widget instanceof TreeItem) {
770
			if (element == null && widget instanceof TreeItem) {
874
    			// parent has not been materialized
771
				// parent has not been materialized
875
    			virtualMaterializeItem((TreeItem) widget);
772
				virtualMaterializeItem((TreeItem) widget);
876
    			// try getting the element now that updateElement was called
773
				// try getting the element now that updateElement was called
877
    			element = widget.getData();
774
				element = widget.getData();
878
    		}
775
			}
879
    		TreeItem[] children;
776
			TreeItem[] children;
880
    		if (widget instanceof Tree) {
777
			if (widget instanceof Tree) {
881
    			children = ((Tree) widget).getItems();
778
				children = ((Tree) widget).getItems();
882
    		} else {
779
			} else {
883
    			children = ((TreeItem) widget).getItems();
780
				children = ((TreeItem) widget).getItems();
884
    		}
781
			}
885
    		if (element != null && children.length > 0) {
782
			if (element != null && children.length > 0) {
886
    			for (int i = 0; i < children.length; i++) {
783
				for (int i = 0; i < children.length; i++) {
887
    				lazyTreeContentProvider.updateElement(element, i);
784
					lazyTreeContentProvider.updateElement(element, i);
888
    			}
785
				}
889
    		}
786
			}
890
    		return;
787
			return;
891
    	}
788
		}
892
    	super.createChildren(widget);
789
		super.createChildren(widget);
893
    }
790
	}
894
    
791
895
    protected void internalAdd(Widget widget, Object parentElement,
792
	protected void internalAdd(Widget widget, Object parentElement,
896
    		Object[] childElements) {
793
			Object[] childElements) {
897
    	if (getContentProvider() instanceof ILazyTreeContentProvider) {
794
		if (getContentProvider() instanceof ILazyTreeContentProvider) {
898
    		if (widget instanceof TreeItem) {
795
			if (widget instanceof TreeItem) {
899
    			TreeItem ti = (TreeItem) widget;
796
				TreeItem ti = (TreeItem) widget;
900
    			int count = ti.getItemCount() + childElements.length;
797
				int count = ti.getItemCount() + childElements.length;
901
				ti.setItemCount(count);
798
				ti.setItemCount(count);
902
    			ti.clearAll(false);
799
				ti.clearAll(false);
903
    		} else {
800
			} else {
904
    			Tree t = (Tree) widget;
801
				Tree t = (Tree) widget;
905
    			t.setItemCount(t.getItemCount() + childElements.length);
802
				t.setItemCount(t.getItemCount() + childElements.length);
906
    			t.clearAll(false);
803
				t.clearAll(false);
907
    		}
804
			}
908
    		return;
805
			return;
909
    	}
806
		}
910
    	super.internalAdd(widget, parentElement, childElements);
807
		super.internalAdd(widget, parentElement, childElements);
911
    }
808
	}
912
809
913
	private void virtualMaterializeItem(TreeItem treeItem) {
810
	private void virtualMaterializeItem(TreeItem treeItem) {
914
		if (treeItem.getData() != null) {
811
		if (treeItem.getData() != null) {
Lines 934-980 Link Here
934
			lazyTreeContentProvider.updateElement(parentElement, index);
831
			lazyTreeContentProvider.updateElement(parentElement, index);
935
		}
832
		}
936
	}
833
	}
937
	
834
938
	/* (non-Javadoc)
835
	/*
939
	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#internalRefreshStruct(org.eclipse.swt.widgets.Widget, java.lang.Object, boolean)
836
	 * (non-Javadoc)
940
	 */
837
	 * 
941
	protected void internalRefreshStruct(Widget widget, Object element, boolean updateLabels) {
838
	 * @see org.eclipse.jface.viewers.AbstractTreeViewer#internalRefreshStruct(org.eclipse.swt.widgets.Widget,
942
    	if (getContentProvider() instanceof ILazyTreeContentProvider) {
839
	 *      java.lang.Object, boolean)
943
    		// first phase: update child counts
840
	 */
944
    		virtualRefreshChildCounts(widget, element);
841
	protected void internalRefreshStruct(Widget widget, Object element,
945
    		// second phase: update labels
842
			boolean updateLabels) {
946
    		if (updateLabels) {
843
		if (getContentProvider() instanceof ILazyTreeContentProvider) {
947
    			if (widget instanceof Tree) {
844
			// first phase: update child counts
948
    				((Tree)widget).clearAll(true);
845
			virtualRefreshChildCounts(widget, element);
949
    			} else if (widget instanceof TreeItem) {
846
			// second phase: update labels
950
    				((TreeItem)widget).clearAll(true);
847
			if (updateLabels) {
951
    			}
848
				if (widget instanceof Tree) {
952
    		}
849
					((Tree) widget).clearAll(true);
953
    		return;
850
				} else if (widget instanceof TreeItem) {
954
    	}
851
					((TreeItem) widget).clearAll(true);
852
				}
853
			}
854
			return;
855
		}
955
		super.internalRefreshStruct(widget, element, updateLabels);
856
		super.internalRefreshStruct(widget, element, updateLabels);
956
	}
857
	}
957
858
958
	/**
859
	/**
959
	 * Traverses the visible (expanded) part of the tree and updates child counts.
860
	 * Traverses the visible (expanded) part of the tree and updates child
861
	 * counts.
862
	 * 
960
	 * @param widget
863
	 * @param widget
961
	 * @param element
864
	 * @param element
962
	 * @param updateLabels
865
	 * @param updateLabels
963
	 */
866
	 */
964
	private void virtualRefreshChildCounts(Widget widget, Object element) {
867
	private void virtualRefreshChildCounts(Widget widget, Object element) {
965
		ILazyTreeContentProvider lazyTreeContentProvider = (ILazyTreeContentProvider) getContentProvider();
868
		ILazyTreeContentProvider lazyTreeContentProvider = (ILazyTreeContentProvider) getContentProvider();
966
		if (widget instanceof Tree || ((TreeItem)widget).getExpanded()) {
869
		if (widget instanceof Tree || ((TreeItem) widget).getExpanded()) {
967
			// widget shows children - it is safe to call getChildren
870
			// widget shows children - it is safe to call getChildren
968
			if (element != null) {
871
			if (element != null) {
969
				lazyTreeContentProvider.updateChildCount(element, getChildren(widget).length);
872
				lazyTreeContentProvider.updateChildCount(element,
873
						getChildren(widget).length);
970
			} else {
874
			} else {
971
				if (widget instanceof Tree) {
875
				if (widget instanceof Tree) {
972
					((Tree)widget).setItemCount(0);
876
					((Tree) widget).setItemCount(0);
973
				} else {
877
				} else {
974
					((TreeItem)widget).setItemCount(0);
878
					((TreeItem) widget).setItemCount(0);
975
				}
879
				}
976
			}
880
			}
977
			// need to get children again because they might have been updated through a callback to setChildCount.
881
			// need to get children again because they might have been updated
882
			// through a callback to setChildCount.
978
			Item[] items = getChildren(widget);
883
			Item[] items = getChildren(widget);
979
			for (int i = 0; i < items.length; i++) {
884
			for (int i = 0; i < items.length; i++) {
980
				Item item = items[i];
885
				Item item = items[i];
Lines 985-991 Link Here
985
			}
890
			}
986
		}
891
		}
987
	}
892
	}
988
	
893
989
	/*
894
	/*
990
	 * To unmap elements correctly, we need to register a dispose listener with
895
	 * To unmap elements correctly, we need to register a dispose listener with
991
	 * the item if the tree is virtual.
896
	 * the item if the tree is virtual.
Lines 994-1000 Link Here
994
		super.mapElement(element, item);
899
		super.mapElement(element, item);
995
		// make sure to unmap elements if the tree is virtual
900
		// make sure to unmap elements if the tree is virtual
996
		if ((getTree().getStyle() & SWT.VIRTUAL) != 0) {
901
		if ((getTree().getStyle() & SWT.VIRTUAL) != 0) {
997
			item.addDisposeListener(new DisposeListener(){
902
			item.addDisposeListener(new DisposeListener() {
998
				public void widgetDisposed(DisposeEvent e) {
903
				public void widgetDisposed(DisposeEvent e) {
999
					if (!treeIsDisposed) {
904
					if (!treeIsDisposed) {
1000
						Object data = item.getData();
905
						Object data = item.getData();
Lines 1002-1008 Link Here
1002
							unmapElement(data, item);
907
							unmapElement(data, item);
1003
						}
908
						}
1004
					}
909
					}
1005
				}});
910
				}
911
			});
1006
		}
912
		}
1007
	}
913
	}
1008
}
914
}
(-)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/ColumnViewerPart.java (+110 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.jface.util.Policy;
15
import org.eclipse.swt.widgets.TableItem;
16
import org.eclipse.swt.widgets.TreeItem;
17
18
/**
19
 * The ColumnViewerPart is abstract implementation of the 
20
 * column parts.
21
 * @since 3.3
22
 *
23
 */
24
public class ColumnViewerPart {
25
26
	private int index;
27
	private ViewerLabelProvider labelProvider;
28
	static String COLUMN_VIEWER_KEY = Policy.JFACE + ".columnViewer";//$NON-NLS-1$
29
	
30
	/**
31
	 * Create a new instance of the receiver at columnIndex.
32
	 * @param provider
33
	 * @param columnIndex
34
	 */
35
	public ColumnViewerPart(ViewerLabelProvider provider, int columnIndex) {
36
		index = columnIndex;
37
		labelProvider = provider;
38
	}
39
	
40
	/**
41
	 * Return the column index for the receiver
42
	 * @return int
43
	 */
44
	public int getIndex() {
45
		return index;
46
	}
47
	/**
48
	 * Return the label provider for the receiver.
49
	 * @return ViewerLabelProvider
50
	 */
51
	public ViewerLabelProvider getLabelProvider() {
52
		return labelProvider;
53
	}
54
	
55
	/**
56
	 * Refresh the TreeItem for element.
57
	 * @param item
58
	 * @param element
59
	 */
60
	public void refresh(TreeItem item, Object element) {
61
62
		ViewerLabel label = new ViewerLabel(item.getText(getIndex()), item
63
				.getImage(getIndex()));
64
		getLabelProvider().updateLabel(label, element);
65
66
		if (label.hasNewBackground())
67
			item.setBackground(getIndex(), label.getBackground());
68
69
		if (label.hasNewForeground())
70
			item.setForeground(getIndex(), label.getForeground());
71
72
		if (label.hasNewFont())
73
			item.setFont(getIndex(), label.getFont());
74
75
		if (label.hasNewText())
76
			item.setText(getIndex(), label.getText());
77
78
		if (label.hasNewImage())
79
			item.setImage(getIndex(), label.getImage());
80
81
	}
82
	
83
	/**
84
	 * Refresh the TableItem for element.
85
	 * @param item
86
	 * @param element
87
	 */
88
	public void refresh(TableItem item, Object element) {
89
90
		ViewerLabel label = new ViewerLabel(item.getText(getIndex()), item
91
				.getImage(getIndex()));
92
		getLabelProvider().updateLabel(label, element);
93
94
		if (label.hasNewBackground())
95
			item.setBackground(getIndex(), label.getBackground());
96
97
		if (label.hasNewForeground())
98
			item.setForeground(getIndex(), label.getForeground());
99
100
		if (label.hasNewFont())
101
			item.setFont(getIndex(), label.getFont());
102
103
		if (label.hasNewText())
104
			item.setText(getIndex(), label.getText());
105
106
		if (label.hasNewImage())
107
			item.setImage(getIndex(), label.getImage());
108
109
	}
110
}
(-)src/org/eclipse/jface/viewers/ViewerLabelProvider.java (+220 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
	 * Create a new instance of the receiver.
67
	 */
68
	public ViewerLabelProvider() {
69
		super();
70
	}
71
72
	/**
73
	 * Create a new instance of the receiver based on labelProvider.
74
	 * 
75
	 * @param labelProvider
76
	 */
77
	public ViewerLabelProvider(IBaseLabelProvider labelProvider) {
78
		super();
79
		setProviders(labelProvider);
80
	}
81
82
	/**
83
	 * Create a ViewerLabelProvider for the column at index
84
	 * 
85
	 * @param columnIndex
86
	 * @param labelProvider The labelProvider to convert
87
	 * @return ViewerLabelProvider
88
	 */
89
	static ViewerLabelProvider createViewerLabelProvider(int columnIndex,
90
			IBaseLabelProvider labelProvider) {
91
92
		if (labelProvider instanceof ITableLabelProvider
93
				|| labelProvider instanceof ITableColorProvider
94
				|| labelProvider instanceof ITableFontProvider)
95
			return new TableColumnViewerLabelProvider(labelProvider,
96
					columnIndex);
97
		return new ViewerLabelProvider(labelProvider);
98
99
	}
100
101
	/*
102
	 * (non-Javadoc)
103
	 * 
104
	 * @see org.eclipse.jface.viewers.IViewerLabelProvider#updateLabel(org.eclipse.jface.viewers.ViewerLabel,
105
	 *      java.lang.Object)
106
	 */
107
	public void updateLabel(ViewerLabel label, Object element) {
108
		label.setText(labelProvider.getText(element));
109
		label.setImage(labelProvider.getImage(element));
110
111
		if (colorProvider != null) {
112
			label.setBackground(colorProvider.getBackground(element));
113
			label.setForeground(colorProvider.getForeground(element));
114
		}
115
116
		if (fontProvider != null) {
117
			label.setFont(fontProvider.getFont(element));
118
		}
119
120
	}
121
122
	/**
123
	 * Set the colorProvider to use for the receiver.
124
	 * 
125
	 * @param colorProvider
126
	 *            The colorProvider to set.
127
	 */
128
	public void setColorProvider(IColorProvider colorProvider) {
129
		this.colorProvider = colorProvider;
130
	}
131
132
	/**
133
	 * Set the fontProvider to fontProvider.
134
	 * 
135
	 * @param fontProvider
136
	 *            The fontProvider to set.
137
	 */
138
	public void setFontProvider(IFontProvider fontProvider) {
139
		this.fontProvider = fontProvider;
140
	}
141
142
	/**
143
	 * Set the labelProvider to be provider.
144
	 * 
145
	 * @param provider
146
	 *            ILabelProvider provider to set.
147
	 */
148
	public void setLabelProvider(ILabelProvider provider) {
149
		this.labelProvider = provider;
150
	}
151
152
	/**
153
	 * Set the any providers for the receiver that can be adapted from provider.
154
	 * 
155
	 * @param provider
156
	 */
157
	public void setProviders(Object provider) {
158
		if (provider instanceof ILabelProvider)
159
			labelProvider = (ILabelProvider) provider;
160
		if (provider instanceof IColorProvider)
161
			colorProvider = (IColorProvider) provider;
162
		if (provider instanceof IFontProvider)
163
			fontProvider = (IFontProvider) provider;
164
165
	}
166
167
	/*
168
	 * (non-Javadoc)
169
	 * 
170
	 * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
171
	 */
172
	public Font getFont(Object element) {
173
		return fontProvider.getFont(element);
174
175
	}
176
177
	/*
178
	 * (non-Javadoc)
179
	 * 
180
	 * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
181
	 */
182
	public Color getBackground(Object element) {
183
		return colorProvider.getBackground(element);
184
	}
185
186
	/*
187
	 * (non-Javadoc)
188
	 * 
189
	 * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
190
	 */
191
	public Color getForeground(Object element) {
192
		return colorProvider.getForeground(element);
193
	}
194
195
	/**
196
	 * Get the IColorProvider for the receiver.
197
	 * 
198
	 * @return IColorProvider
199
	 */
200
	public IColorProvider getColorProvider() {
201
		return colorProvider;
202
	}
203
204
	/**
205
	 * Get the IFontProvider for the receiver.
206
	 * 
207
	 * @return IFontProvider
208
	 */
209
	public IFontProvider getFontProvider() {
210
		return fontProvider;
211
	}
212
213
	/**
214
	 * @return Returns the labelProvider.
215
	 */
216
	public ILabelProvider getLabelProvider() {
217
		return labelProvider;
218
	}
219
220
}
(-)src/org/eclipse/jface/viewers/TableColumnViewerLabelProvider.java (+128 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
import org.eclipse.swt.graphics.Image;
17
18
/**
19
 * TableColumnViewerLabelProvider is the mapping from the table based providers
20
 * to the ViewerLabelProvider.
21
 * 
22
 * @since 3.3
23
 * @see ITableLabelProvider
24
 * @see ITableColorProvider
25
 * @see ITableFontProvider
26
 * 
27
 */
28
class TableColumnViewerLabelProvider extends ViewerLabelProvider {
29
30
	/**
31
	 * Create a new instance of the receiver.
32
	 * 
33
	 * @param labelProvider
34
	 *            instance of a table based label provider
35
	 * @param columnIndex the index into the table for this column 
36
	 * @see ITableLabelProvider
37
	 * @see ITableColorProvider
38
	 * @see ITableFontProvider
39
	 */
40
	public TableColumnViewerLabelProvider(IBaseLabelProvider labelProvider,
41
			int columnIndex) {
42
		super(labelProvider);
43
		
44
		if (labelProvider instanceof ITableLabelProvider)
45
			setLabelProvider(labelProviderFor(
46
					(ITableLabelProvider) labelProvider, columnIndex));
47
48
		if (labelProvider instanceof ITableColorProvider)
49
			setColorProvider(colorProviderFor(
50
					(ITableColorProvider) labelProvider, columnIndex));
51
		
52
		if (labelProvider instanceof ITableFontProvider)
53
			setFontProvider(fontProviderFor(
54
					(ITableFontProvider) labelProvider, columnIndex));
55
	}
56
57
	/**
58
	 * Return the IFontProvider based on provider at columnIndex.
59
	 * @param provider
60
	 * @param columnIndex
61
	 * @return IFontProvider
62
	 */
63
	private IFontProvider fontProviderFor(final ITableFontProvider provider,final int columnIndex) {
64
		return new IFontProvider(){
65
			/* (non-Javadoc)
66
			 * @see org.eclipse.jface.viewers.IFontProvider#getFont(java.lang.Object)
67
			 */
68
			public Font getFont(Object element) {
69
				return provider.getFont(element, columnIndex);
70
			}
71
		};
72
	}
73
74
	/**
75
	 * Return the ILabelProvider based on provider at columnIndex.
76
	 * @param provider
77
	 * @param columnIndex
78
	 * @return ILabelProvider
79
	 */
80
	private ILabelProvider labelProviderFor(final ITableLabelProvider provider, final int columnIndex) {
81
		return new LabelProvider(){
82
			/* (non-Javadoc)
83
			 * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
84
			 */
85
			public String getText(Object element) {
86
				return provider.getColumnText(element,columnIndex);
87
			}
88
			
89
			/* (non-Javadoc)
90
			 * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
91
			 */
92
			public Image getImage(Object element) {
93
				return provider.getColumnImage(element,columnIndex);
94
			}
95
		};
96
	}
97
98
	/**
99
	 * Create an IColorProvider from the ITableColorProvider at columnIndex.
100
	 * 
101
	 * @param provider
102
	 * @param columnIndex
103
	 * @return IColorProvider
104
	 */
105
	private IColorProvider colorProviderFor(final ITableColorProvider provider,
106
			final int columnIndex) {
107
		return new IColorProvider() {
108
			/*
109
			 * (non-Javadoc)
110
			 * 
111
			 * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
112
			 */
113
			public Color getBackground(Object element) {
114
				return provider.getBackground(element, columnIndex);
115
			}
116
117
			/*
118
			 * (non-Javadoc)
119
			 * 
120
			 * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
121
			 */
122
			public Color getForeground(Object element) {
123
				return provider.getForeground(element, columnIndex);
124
			}
125
		};
126
	}
127
128
}
(-)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