Mercurial > projects > dwt-addons
annotate dwtx/jface/viewers/TreeViewer.d @ 90:7ffeace6c47f
Update 3.4M7 to 3.4
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Sun, 06 Jul 2008 23:30:07 +0200 |
parents | 46a6e0e6ccd4 |
children | 04b47443bb01 |
rev | line source |
---|---|
10 | 1 /******************************************************************************* |
90 | 2 * Copyright (c) 2004, 2008 IBM Corporation and others. |
10 | 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 * Tom Schindl <tom.schindl@bestsolution.at> - concept of ViewerRow, | |
70
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
11 * refactoring (bug 153993), bug 167323, 191468, 205419 |
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
12 * Matthew Hall - bug 221988 |
10 | 13 * Port to the D programming language: |
14 * Frank Benoit <benoit@tionex.de> | |
15 *******************************************************************************/ | |
16 | |
17 module dwtx.jface.viewers.TreeViewer; | |
18 | |
19 import dwtx.jface.viewers.AbstractTreeViewer; | |
20 import dwtx.jface.viewers.TreeViewerRow; | |
21 import dwtx.jface.viewers.IBaseLabelProvider; | |
22 import dwtx.jface.viewers.ColumnViewerEditor; | |
23 import dwtx.jface.viewers.IContentProvider; | |
24 import dwtx.jface.viewers.TreeSelection; | |
25 import dwtx.jface.viewers.ViewerRow; | |
26 import dwtx.jface.viewers.ISelection; | |
27 import dwtx.jface.viewers.TreeViewerEditor; | |
28 import dwtx.jface.viewers.ColumnViewerEditorActivationStrategy; | |
29 import dwtx.jface.viewers.ColumnViewerEditorActivationEvent; | |
30 import dwtx.jface.viewers.ILazyTreeContentProvider; | |
31 import dwtx.jface.viewers.ILazyTreePathContentProvider; | |
32 import dwtx.jface.viewers.TreePath; | |
33 import dwtx.jface.viewers.TreeExpansionEvent; | |
34 import dwtx.jface.viewers.ViewerCell; | |
35 | |
36 import tango.util.collection.LinkSeq; | |
37 import tango.util.collection.model.Seq; | |
38 import tango.util.collection.model.SeqView; | |
39 | |
40 import dwt.DWT; | |
41 import dwt.events.DisposeEvent; | |
42 import dwt.events.DisposeListener; | |
43 import dwt.events.TreeEvent; | |
44 import dwt.events.TreeListener; | |
45 import dwt.graphics.Point; | |
46 import dwt.widgets.Composite; | |
47 import dwt.widgets.Control; | |
48 import dwt.widgets.Event; | |
49 import dwt.widgets.Item; | |
50 import dwt.widgets.Listener; | |
51 import dwt.widgets.Tree; | |
52 import dwt.widgets.TreeItem; | |
53 import dwt.widgets.Widget; | |
54 import dwtx.jface.util.Policy; | |
55 | |
56 import dwt.dwthelper.utils; | |
57 import dwt.dwthelper.Runnable; | |
58 | |
59 /** | |
60 * A concrete viewer based on an DWT <code>Tree</code> control. | |
61 * <p> | |
62 * This class is not intended to be subclassed outside the viewer framework. It | |
63 * is designed to be instantiated with a pre-existing DWT tree control and | |
64 * configured with a domain-specific content provider, label provider, element | |
65 * filter (optional), and element sorter (optional). | |
66 * </p> | |
67 * <p> | |
68 * Content providers for tree viewers must implement either the | |
69 * {@link ITreeContentProvider} interface, (as of 3.2) the | |
70 * {@link ILazyTreeContentProvider} interface, or (as of 3.3) the | |
71 * {@link ILazyTreePathContentProvider}. If the content provider is an | |
72 * <code>ILazyTreeContentProvider</code> or an | |
73 * <code>ILazyTreePathContentProvider</code>, the underlying Tree must be | |
70
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
74 * created using the {@link DWT#VIRTUAL} style bit, the tree viewer will not |
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
75 * support sorting or filtering, and hash lookup must be enabled by calling |
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
76 * {@link #setUseHashlookup(bool)}. |
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
77 * </p> |
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
78 * <p> |
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
79 * Users setting up an editable tree with more than 1 column <b>have</b> to pass the |
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
80 * DWT.FULL_SELECTION style bit |
10 | 81 * </p> |
90 | 82 * @noextend This class is not intended to be subclassed by clients. |
10 | 83 */ |
84 public class TreeViewer : AbstractTreeViewer { | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
85 alias AbstractTreeViewer.addTreeListener addTreeListener; |
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
86 alias AbstractTreeViewer.getLabelProvider getLabelProvider; |
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
87 alias AbstractTreeViewer.getSelection getSelection; |
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
88 alias AbstractTreeViewer.preservingSelection preservingSelection; |
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
89 alias AbstractTreeViewer.remove remove; |
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
90 alias AbstractTreeViewer.setSelection setSelection; |
10 | 91 |
92 private static final String VIRTUAL_DISPOSE_KEY = Policy.JFACE | |
93 ~ ".DISPOSE_LISTENER"; //$NON-NLS-1$ | |
94 | |
95 /** | |
96 * This viewer's control. | |
97 */ | |
98 private Tree tree; | |
99 | |
100 /** | |
101 * Flag for whether the tree has been disposed of. | |
102 */ | |
103 private bool treeIsDisposed = false; | |
104 | |
105 private bool contentProviderIsLazy; | |
106 | |
107 private bool contentProviderIsTreeBased; | |
108 | |
109 /** | |
110 * The row object reused | |
111 */ | |
112 private TreeViewerRow cachedRow; | |
113 | |
114 /** | |
115 * true if we are inside a preservingSelection() call | |
116 */ | |
117 private bool preservingSelection_; | |
118 | |
119 /** | |
120 * Creates a tree viewer on a newly-created tree control under the given | |
121 * parent. The tree control is created using the DWT style bits | |
122 * <code>MULTI, H_SCROLL, V_SCROLL,</code> and <code>BORDER</code>. The | |
123 * viewer has no input, no content provider, a default label provider, no | |
124 * sorter, and no filters. | |
125 * | |
126 * @param parent | |
127 * the parent control | |
128 */ | |
129 public this(Composite parent) { | |
130 this(parent, DWT.MULTI | DWT.H_SCROLL | DWT.V_SCROLL | DWT.BORDER); | |
131 } | |
132 | |
133 /** | |
134 * Creates a tree viewer on a newly-created tree control under the given | |
135 * parent. The tree control is created using the given DWT style bits. The | |
136 * viewer has no input, no content provider, a default label provider, no | |
137 * sorter, and no filters. | |
138 * | |
139 * @param parent | |
140 * the parent control | |
141 * @param style | |
142 * the DWT style bits used to create the tree. | |
143 */ | |
144 public this(Composite parent, int style) { | |
145 this(new Tree(parent, style)); | |
146 } | |
147 | |
148 /** | |
149 * Creates a tree viewer on the given tree control. The viewer has no input, | |
150 * no content provider, a default label provider, no sorter, and no filters. | |
151 * | |
152 * @param tree | |
153 * the tree control | |
154 */ | |
155 public this(Tree tree) { | |
156 super(); | |
157 this.tree = tree; | |
158 hookControl(tree); | |
159 } | |
160 | |
161 /* | |
162 * (non-Javadoc) Method declared in AbstractTreeViewer. | |
163 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
164 protected override void addTreeListener(Control c, TreeListener listener) { |
10 | 165 (cast(Tree) c).addTreeListener(listener); |
166 } | |
167 | |
168 /* | |
169 * (non-Javadoc) | |
170 * | |
171 * @see dwtx.jface.viewers.ColumnViewer#getColumnViewerOwner(int) | |
172 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
173 protected override Widget getColumnViewerOwner(int columnIndex) { |
10 | 174 if (columnIndex < 0 || ( columnIndex > 0 && columnIndex >= getTree().getColumnCount() ) ) { |
175 return null; | |
176 } | |
177 | |
178 if (getTree().getColumnCount() is 0)// Hang it off the table if it | |
179 return getTree(); | |
180 | |
181 return getTree().getColumn(columnIndex); | |
182 } | |
183 | |
184 /* | |
185 * (non-Javadoc) Method declared in AbstractTreeViewer. | |
186 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
187 protected override Item[] getChildren(Widget o) { |
10 | 188 if (auto ti = cast(TreeItem)o ) { |
189 return ti.getItems(); | |
190 } | |
191 if (auto t = cast(Tree)o ) { | |
192 return t.getItems(); | |
193 } | |
194 return null; | |
195 } | |
196 | |
197 /* | |
198 * (non-Javadoc) Method declared in Viewer. | |
199 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
200 public override Control getControl() { |
10 | 201 return tree; |
202 } | |
203 | |
204 /* | |
205 * (non-Javadoc) Method declared in AbstractTreeViewer. | |
206 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
207 protected override bool getExpanded(Item item) { |
10 | 208 return (cast(TreeItem) item).getExpanded(); |
209 } | |
210 | |
211 /* | |
212 * (non-Javadoc) | |
213 * | |
214 * @see dwtx.jface.viewers.ColumnViewer#getItemAt(dwt.graphics.Point) | |
215 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
216 protected override Item getItemAt(Point p) { |
10 | 217 TreeItem[] selection = tree.getSelection(); |
218 | |
219 if( selection.length is 1 ) { | |
220 int columnCount = tree.getColumnCount(); | |
221 | |
222 for( int i = 0; i < columnCount; i++ ) { | |
223 if( selection[0].getBounds(i).contains(p) ) { | |
224 return selection[0]; | |
225 } | |
226 } | |
227 } | |
228 | |
229 return getTree().getItem(p); | |
230 } | |
231 | |
232 /* | |
233 * (non-Javadoc) Method declared in AbstractTreeViewer. | |
234 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
235 protected override int getItemCount(Control widget) { |
10 | 236 return (cast(Tree) widget).getItemCount(); |
237 } | |
238 | |
239 /* | |
240 * (non-Javadoc) Method declared in AbstractTreeViewer. | |
241 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
242 protected override int getItemCount(Item item) { |
10 | 243 return (cast(TreeItem) item).getItemCount(); |
244 } | |
245 | |
246 /* | |
247 * (non-Javadoc) Method declared in AbstractTreeViewer. | |
248 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
249 protected override Item[] getItems(Item item) { |
10 | 250 return (cast(TreeItem) item).getItems(); |
251 } | |
252 | |
253 /** | |
254 * The tree viewer implementation of this <code>Viewer</code> framework | |
255 * method ensures that the given label provider is an instance of either | |
256 * <code>ITableLabelProvider</code> or <code>ILabelProvider</code>. If | |
257 * it is an <code>ITableLabelProvider</code>, then it provides a separate | |
258 * label text and image for each column. If it is an | |
259 * <code>ILabelProvider</code>, then it provides only the label text and | |
260 * image for the first column, and any remaining columns are blank. | |
261 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
262 public override IBaseLabelProvider getLabelProvider() { |
10 | 263 return super.getLabelProvider(); |
264 } | |
265 | |
266 /* | |
267 * (non-Javadoc) Method declared in AbstractTreeViewer. | |
268 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
269 protected override Item getParentItem(Item item) { |
10 | 270 return (cast(TreeItem) item).getParentItem(); |
271 } | |
272 | |
273 /* | |
274 * (non-Javadoc) Method declared in AbstractTreeViewer. | |
275 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
276 protected override Item[] getSelection(Control widget) { |
10 | 277 return (cast(Tree) widget).getSelection(); |
278 } | |
279 | |
280 /** | |
281 * Returns this tree viewer's tree control. | |
282 * | |
283 * @return the tree control | |
284 */ | |
285 public Tree getTree() { | |
286 return tree; | |
287 } | |
288 | |
289 /* | |
290 * (non-Javadoc) | |
291 * | |
292 * @see dwtx.jface.viewers.AbstractTreeViewer#hookControl(dwt.widgets.Control) | |
293 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
294 protected override void hookControl(Control control) { |
10 | 295 super.hookControl(control); |
296 Tree treeControl = cast(Tree) control; | |
297 | |
298 if ((treeControl.getStyle() & DWT.VIRTUAL) !is 0) { | |
299 treeControl.addDisposeListener(new class DisposeListener { | |
300 public void widgetDisposed(DisposeEvent e) { | |
301 treeIsDisposed = true; | |
302 unmapAllElements(); | |
303 } | |
304 }); | |
305 treeControl.addListener(DWT.SetData, new class Listener { | |
306 | |
307 public void handleEvent(Event event) { | |
308 if (contentProviderIsLazy) { | |
309 TreeItem item = cast(TreeItem) event.item; | |
310 TreeItem parentItem = item.getParentItem(); | |
311 int index = event.index; | |
312 virtualLazyUpdateWidget( | |
313 parentItem is null ? cast(Widget) getTree() | |
314 : parentItem, index); | |
315 } | |
316 } | |
317 | |
318 }); | |
319 } | |
320 } | |
321 | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
322 protected override ColumnViewerEditor createViewerEditor() { |
10 | 323 return new TreeViewerEditor(this,null,new ColumnViewerEditorActivationStrategy(this),ColumnViewerEditor.DEFAULT); |
324 } | |
325 | |
326 /* | |
327 * (non-Javadoc) Method declared in AbstractTreeViewer. | |
328 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
329 protected override Item newItem(Widget parent, int flags, int ix) { |
10 | 330 TreeItem item; |
331 | |
332 if ( cast(TreeItem)parent ) { | |
333 item = cast(TreeItem) createNewRowPart(getViewerRowFromItem(parent), | |
334 flags, ix).getItem(); | |
335 } else { | |
336 item = cast(TreeItem) createNewRowPart(null, flags, ix).getItem(); | |
337 } | |
338 | |
339 return item; | |
340 } | |
341 | |
342 /* | |
343 * (non-Javadoc) Method declared in AbstractTreeViewer. | |
344 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
345 protected override void removeAll(Control widget) { |
10 | 346 (cast(Tree) widget).removeAll(); |
347 } | |
348 | |
349 /* | |
350 * (non-Javadoc) Method declared in AbstractTreeViewer. | |
351 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
352 protected override void setExpanded(Item node, bool expand) { |
10 | 353 (cast(TreeItem) node).setExpanded(expand); |
354 if (contentProviderIsLazy) { | |
355 // force repaints to happen | |
356 getControl().update(); | |
357 } | |
358 } | |
359 | |
360 /* | |
361 * (non-Javadoc) Method declared in AbstractTreeViewer. | |
362 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
363 protected override void setSelection(SeqView!(Item) items) { |
10 | 364 |
365 Item[] current = getSelection(getTree()); | |
366 | |
367 // Don't bother resetting the same selection | |
368 if (isSameSelection(items, current)) { | |
369 return; | |
370 } | |
371 | |
372 getTree().setSelection( cast(TreeItem[]) items.toArray()); | |
373 } | |
374 | |
375 /* | |
376 * (non-Javadoc) Method declared in AbstractTreeViewer. | |
377 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
378 protected override void showItem(Item item) { |
10 | 379 getTree().showItem(cast(TreeItem) item); |
380 } | |
381 | |
382 /* | |
383 * (non-Javadoc) | |
384 * | |
385 * @see dwtx.jface.viewers.AbstractTreeViewer#getChild(dwt.widgets.Widget, | |
386 * int) | |
387 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
388 protected override Item getChild(Widget widget, int index) { |
10 | 389 if (auto ti = cast(TreeItem)widget ) { |
390 return ti.getItem(index); | |
391 } | |
392 if (auto t = cast(Tree)widget ) { | |
393 return t.getItem(index); | |
394 } | |
395 return null; | |
396 } | |
397 | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
398 protected override void assertContentProviderType(IContentProvider provider) { |
10 | 399 if ( null !is cast(ILazyTreeContentProvider)provider |
400 || null !is cast(ILazyTreePathContentProvider)provider ) { | |
401 return; | |
402 } | |
403 super.assertContentProviderType(provider); | |
404 } | |
405 | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
406 protected override Object[] getRawChildren(Object parent) { |
10 | 407 if (contentProviderIsLazy) { |
408 return new Object[0]; | |
409 } | |
410 return super.getRawChildren(parent); | |
411 } | |
412 | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
413 override void preservingSelection(Runnable updateCode, bool reveal) { |
10 | 414 if (preservingSelection_){ |
415 // avoid preserving the selection if called reentrantly, | |
416 // see bug 172640 | |
417 updateCode.run(); | |
418 return; | |
419 } | |
420 preservingSelection_ = true; | |
421 try { | |
422 super.preservingSelection(updateCode, reveal); | |
423 } finally { | |
424 preservingSelection_ = false; | |
425 } | |
426 } | |
427 | |
428 /** | |
429 * For a TreeViewer with a tree with the VIRTUAL style bit set, set the | |
430 * number of children of the given element or tree path. To set the number | |
431 * of children of the invisible root of the tree, you can pass the input | |
432 * object or an empty tree path. | |
433 * | |
434 * @param elementOrTreePath | |
435 * the element, or tree path | |
436 * @param count | |
437 * | |
438 * @since 3.2 | |
439 */ | |
440 public void setChildCount(Object elementOrTreePath, int count) { | |
70
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
441 if (checkBusy()) |
10 | 442 return; |
39 | 443 preservingSelection(new class(elementOrTreePath,count) Runnable { |
10 | 444 Object elementOrTreePath_; |
445 int count_; | |
39 | 446 this(Object a,int b){ |
447 elementOrTreePath_=a; | |
448 count_=b; | |
10 | 449 } |
450 public void run() { | |
451 if (internalIsInputOrEmptyPath(elementOrTreePath_)) { | |
452 getTree().setItemCount(count_); | |
453 return; | |
454 } | |
455 Widget[] items = internalFindItems(elementOrTreePath_); | |
456 for (int i = 0; i < items.length; i++) { | |
457 TreeItem treeItem = cast(TreeItem) items[i]; | |
458 treeItem.setItemCount(count_); | |
459 } | |
460 } | |
461 }); | |
462 } | |
463 | |
464 /** | |
465 * For a TreeViewer with a tree with the VIRTUAL style bit set, replace the | |
466 * given parent's child at index with the given element. If the given parent | |
467 * is this viewer's input or an empty tree path, this will replace the root | |
468 * element at the given index. | |
469 * <p> | |
470 * This method should be called by implementers of ILazyTreeContentProvider | |
471 * to populate this viewer. | |
472 * </p> | |
473 * | |
474 * @param parentElementOrTreePath | |
475 * the parent of the element that should be updated, or the tree | |
476 * path to that parent | |
477 * @param index | |
478 * the index in the parent's children | |
479 * @param element | |
480 * the new element | |
481 * | |
482 * @see #setChildCount(Object, int) | |
483 * @see ILazyTreeContentProvider | |
484 * @see ILazyTreePathContentProvider | |
485 * | |
486 * @since 3.2 | |
487 */ | |
488 public void replace(Object parentElementOrTreePath, int index, | |
489 Object element) { | |
70
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
490 if (checkBusy()) |
10 | 491 return; |
492 Item[] selectedItems = getSelection(getControl()); | |
493 TreeSelection selection = cast(TreeSelection) getSelection(); | |
494 Widget[] itemsToDisassociate; | |
495 if (auto tp = cast(TreePath)parentElementOrTreePath ) { | |
496 TreePath elementPath = tp | |
497 .createChildPath(element); | |
498 itemsToDisassociate = internalFindItems(elementPath); | |
499 } else { | |
500 itemsToDisassociate = internalFindItems(element); | |
501 } | |
502 if (internalIsInputOrEmptyPath(parentElementOrTreePath)) { | |
503 if (index < tree.getItemCount()) { | |
504 TreeItem item = tree.getItem(index); | |
505 selection = adjustSelectionForReplace(selectedItems, selection, item, element, getRoot()); | |
506 // disassociate any different item that represents the | |
507 // same element under the same parent (the tree) | |
508 for (int i = 0; i < itemsToDisassociate.length; i++) { | |
509 if (auto itemToDisassociate = cast(TreeItem)itemsToDisassociate[i]) { | |
510 if (itemToDisassociate !is item | |
511 && itemToDisassociate.getParentItem() is null) { | |
512 int indexToDisassociate = getTree().indexOf( | |
513 itemToDisassociate); | |
514 disassociate(itemToDisassociate); | |
515 getTree().clear(indexToDisassociate, true); | |
516 } | |
517 } | |
518 } | |
519 Object oldData = item.getData(); | |
520 updateItem(item, element); | |
521 if (!/+TreeViewer.this.+/opEquals(oldData, element)) { | |
522 item.clearAll(true); | |
523 } | |
524 } | |
525 } else { | |
526 Widget[] parentItems = internalFindItems(parentElementOrTreePath); | |
527 for (int i = 0; i < parentItems.length; i++) { | |
528 TreeItem parentItem = cast(TreeItem) parentItems[i]; | |
529 if (index < parentItem.getItemCount()) { | |
530 TreeItem item = parentItem.getItem(index); | |
531 selection = adjustSelectionForReplace(selectedItems, selection, item, element, parentItem.getData()); | |
532 // disassociate any different item that represents the | |
533 // same element under the same parent (the tree) | |
534 for (int j = 0; j < itemsToDisassociate.length; j++) { | |
535 if ( auto itemToDisassociate = cast(TreeItem)itemsToDisassociate[j] ) { | |
536 if (itemToDisassociate !is item | |
537 && itemToDisassociate.getParentItem() is parentItem) { | |
538 int indexToDisaccociate = parentItem | |
539 .indexOf(itemToDisassociate); | |
540 disassociate(itemToDisassociate); | |
541 parentItem.clear(indexToDisaccociate, true); | |
542 } | |
543 } | |
544 } | |
545 Object oldData = item.getData(); | |
546 updateItem(item, element); | |
547 if (!/+TreeViewer.this.+/opEquals(oldData, element)) { | |
548 item.clearAll(true); | |
549 } | |
550 } | |
551 } | |
552 } | |
553 // Restore the selection if we are not already in a nested preservingSelection: | |
554 if (!preservingSelection_) { | |
555 setSelectionToWidget(selection, false); | |
556 // send out notification if old and new differ | |
557 ISelection newSelection = getSelection(); | |
558 if (!(cast(Object)newSelection).opEquals(cast(Object)selection)) { | |
559 handleInvalidSelection(selection, newSelection); | |
560 } | |
561 } | |
562 } | |
563 | |
564 /** | |
565 * Fix for bug 185673: If the currently replaced item was selected, add it | |
566 * to the selection that is being restored. Only do this if its getData() is | |
567 * currently null | |
568 * | |
569 * @param selectedItems | |
570 * @param selection | |
571 * @param item | |
572 * @param element | |
573 * @return | |
574 */ | |
575 private TreeSelection adjustSelectionForReplace(Item[] selectedItems, | |
576 TreeSelection selection, TreeItem item, Object element, Object parentElement) { | |
577 if (item.getData() !is null || selectedItems.length is selection.size() | |
578 || parentElement is null) { | |
579 // Don't do anything - we are not seeing an instance of bug 185673 | |
580 return selection; | |
581 } | |
582 for (int i = 0; i < selectedItems.length; i++) { | |
583 if (item is selectedItems[i]) { | |
584 // The current item was selected, but its data is null. | |
585 // The data will be replaced by the given element, so to keep | |
586 // it selected, we have to add it to the selection. | |
587 TreePath[] originalPaths = selection.getPaths(); | |
588 int length_ = originalPaths.length; | |
589 TreePath[] paths = new TreePath[length_ + 1]; | |
590 System.arraycopy(originalPaths, 0, paths, 0, length_); | |
591 // set the element temporarily so that we can call getTreePathFromItem | |
592 item.setData(element); | |
593 paths[length_] = getTreePathFromItem(item); | |
594 item.setData(null); | |
595 return new TreeSelection(paths, selection.getElementComparer()); | |
596 } | |
597 } | |
598 // The item was not selected, return the given selection | |
599 return selection; | |
600 } | |
601 | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
602 public override bool isExpandable(Object element) { |
10 | 603 if (contentProviderIsLazy) { |
604 TreeItem treeItem = cast(TreeItem) internalExpand(element, false); | |
605 if (treeItem is null) { | |
606 return false; | |
607 } | |
608 virtualMaterializeItem(treeItem); | |
609 return treeItem.getItemCount() > 0; | |
610 } | |
611 return super.isExpandable(element); | |
612 } | |
613 | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
614 protected override Object getParentElement(Object element) { |
70
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
615 bool oldBusy = isBusy(); |
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
616 setBusy(true); |
10 | 617 try { |
618 if (contentProviderIsLazy && !contentProviderIsTreeBased && !(cast(TreePath)element )) { | |
619 ILazyTreeContentProvider lazyTreeContentProvider = cast(ILazyTreeContentProvider) getContentProvider(); | |
620 return lazyTreeContentProvider.getParent(element); | |
621 } | |
622 if (contentProviderIsLazy && contentProviderIsTreeBased && !(cast(TreePath)element )) { | |
623 ILazyTreePathContentProvider lazyTreePathContentProvider = cast(ILazyTreePathContentProvider) getContentProvider(); | |
624 TreePath[] parents = lazyTreePathContentProvider | |
625 .getParents(element); | |
626 if (parents !is null && parents.length > 0) { | |
627 return parents[0]; | |
628 } | |
629 } | |
630 return super.getParentElement(element); | |
631 } finally { | |
70
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
632 setBusy(oldBusy); |
10 | 633 } |
634 } | |
635 | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
636 protected override void createChildren(Widget widget) { |
10 | 637 if (contentProviderIsLazy) { |
638 Object element = widget.getData(); | |
639 if (element is null && cast(TreeItem)widget ) { | |
640 // parent has not been materialized | |
641 virtualMaterializeItem(cast(TreeItem) widget); | |
642 // try getting the element now that updateElement was called | |
643 element = widget.getData(); | |
644 } | |
645 if (element is null) { | |
646 // give up because the parent is still not materialized | |
647 return; | |
648 } | |
649 Item[] children = getChildren(widget); | |
650 if (children.length is 1 && children[0].getData() is null) { | |
651 // found a dummy node | |
652 virtualLazyUpdateChildCount(widget, children.length); | |
653 children = getChildren(widget); | |
654 } | |
655 // touch all children to make sure they are materialized | |
656 for (int i = 0; i < children.length; i++) { | |
657 if (children[i].getData() is null) { | |
658 virtualLazyUpdateWidget(widget, i); | |
659 } | |
660 } | |
661 return; | |
662 } | |
663 super.createChildren(widget); | |
664 } | |
665 | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
666 protected override void internalAdd(Widget widget, Object parentElement, |
10 | 667 Object[] childElements) { |
668 if (contentProviderIsLazy) { | |
669 if (auto ti = cast(TreeItem)widget ) { | |
670 int count = ti.getItemCount() + childElements.length; | |
671 ti.setItemCount(count); | |
672 ti.clearAll(false); | |
673 } else { | |
674 Tree t = cast(Tree) widget; | |
675 t.setItemCount(t.getItemCount() + childElements.length); | |
676 t.clearAll(false); | |
677 } | |
678 return; | |
679 } | |
680 super.internalAdd(widget, parentElement, childElements); | |
681 } | |
682 | |
683 private void virtualMaterializeItem(TreeItem treeItem) { | |
684 if (treeItem.getData() !is null) { | |
685 // already materialized | |
686 return; | |
687 } | |
688 if (!contentProviderIsLazy) { | |
689 return; | |
690 } | |
691 int index; | |
692 Widget parent = treeItem.getParentItem(); | |
693 if (parent is null) { | |
694 parent = treeItem.getParent(); | |
695 } | |
696 Object parentElement = parent.getData(); | |
697 if (parentElement !is null) { | |
698 if ( auto t = cast(Tree)parent ) { | |
699 index = t.indexOf(treeItem); | |
700 } else { | |
701 index = (cast(TreeItem) parent).indexOf(treeItem); | |
702 } | |
703 virtualLazyUpdateWidget(parent, index); | |
704 } | |
705 } | |
706 | |
707 /* | |
708 * (non-Javadoc) | |
709 * | |
710 * @see dwtx.jface.viewers.AbstractTreeViewer#internalRefreshStruct(dwt.widgets.Widget, | |
711 * java.lang.Object, bool) | |
712 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
713 protected override void internalRefreshStruct(Widget widget, Object element, |
10 | 714 bool updateLabels) { |
715 if (contentProviderIsLazy) { | |
716 // clear all starting with the given widget | |
717 if (auto t = cast(Tree)widget ) { | |
718 t.clearAll(true); | |
719 } else if (cast(TreeItem)widget ) { | |
720 (cast(TreeItem) widget).clearAll(true); | |
721 } | |
722 int index = 0; | |
723 Widget parent = null; | |
724 if (auto treeItem = cast(TreeItem)widget ) { | |
725 parent = treeItem.getParentItem(); | |
726 if (parent is null) { | |
727 parent = treeItem.getParent(); | |
728 } | |
729 if (cast(Tree)parent ) { | |
730 index = (cast(Tree) parent).indexOf(treeItem); | |
731 } else { | |
732 index = (cast(TreeItem) parent).indexOf(treeItem); | |
733 } | |
734 } | |
735 virtualRefreshExpandedItems(parent, widget, element, index); | |
736 return; | |
737 } | |
738 super.internalRefreshStruct(widget, element, updateLabels); | |
739 } | |
740 | |
741 /** | |
742 * Traverses the visible (expanded) part of the tree and updates child | |
743 * counts. | |
744 * | |
745 * @param parent the parent of the widget, or <code>null</code> if the widget is the tree | |
746 * @param widget | |
747 * @param element | |
748 * @param index the index of the widget in the children array of its parent, or 0 if the widget is the tree | |
749 */ | |
750 private void virtualRefreshExpandedItems(Widget parent, Widget widget, Object element, int index) { | |
751 if ( cast(Tree)widget ) { | |
752 if (element is null) { | |
753 (cast(Tree) widget).setItemCount(0); | |
754 return; | |
755 } | |
756 virtualLazyUpdateChildCount(widget, getChildren(widget).length); | |
757 } else if ((cast(TreeItem) widget).getExpanded()) { | |
758 // prevent SetData callback | |
759 (cast(TreeItem)widget).setText(" "); //$NON-NLS-1$ | |
760 virtualLazyUpdateWidget(parent, index); | |
761 } else { | |
762 return; | |
763 } | |
764 Item[] items = getChildren(widget); | |
765 for (int i = 0; i < items.length; i++) { | |
766 Item item = items[i]; | |
767 Object data = item.getData(); | |
768 virtualRefreshExpandedItems(widget, item, data, i); | |
769 } | |
770 } | |
771 | |
772 /* | |
773 * To unmap elements correctly, we need to register a dispose listener with | |
774 * the item if the tree is virtual. | |
775 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
776 protected override void mapElement(Object element, Widget item) { |
10 | 777 super.mapElement(element, item); |
778 // make sure to unmap elements if the tree is virtual | |
779 if ((getTree().getStyle() & DWT.VIRTUAL) !is 0) { | |
780 // only add a dispose listener if item hasn't already on assigned | |
781 // because it is reused | |
782 if (item.getData(VIRTUAL_DISPOSE_KEY) is null) { | |
70
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
783 item.setData(VIRTUAL_DISPOSE_KEY, Boolean.TRUE); |
39 | 784 item.addDisposeListener(new class(item) DisposeListener { |
10 | 785 Widget item_; |
39 | 786 this(Widget a){ |
787 item_=a; | |
10 | 788 } |
789 public void widgetDisposed(DisposeEvent e) { | |
790 if (!treeIsDisposed) { | |
791 Object data = item_.getData(); | |
792 if (usingElementMap() && data !is null) { | |
793 unmapElement(data, item_); | |
794 } | |
795 } | |
796 } | |
797 }); | |
798 } | |
799 } | |
800 } | |
801 | |
802 /* | |
803 * (non-Javadoc) | |
804 * | |
805 * @see dwtx.jface.viewers.ColumnViewer#getRowPartFromItem(dwt.widgets.Widget) | |
806 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
807 protected override ViewerRow getViewerRowFromItem(Widget item) { |
10 | 808 if( cachedRow is null ) { |
809 cachedRow = new TreeViewerRow(cast(TreeItem) item); | |
810 } else { | |
811 cachedRow.setItem(cast(TreeItem) item); | |
812 } | |
813 | |
814 return cachedRow; | |
815 } | |
816 | |
817 /** | |
818 * Create a new ViewerRow at rowIndex | |
819 * | |
820 * @param parent | |
821 * @param style | |
822 * @param rowIndex | |
823 * @return ViewerRow | |
824 */ | |
825 private ViewerRow createNewRowPart(ViewerRow parent, int style, int rowIndex) { | |
826 if (parent is null) { | |
827 if (rowIndex >= 0) { | |
828 return getViewerRowFromItem(new TreeItem(tree, style, rowIndex)); | |
829 } | |
830 return getViewerRowFromItem(new TreeItem(tree, style)); | |
831 } | |
832 | |
833 if (rowIndex >= 0) { | |
834 return getViewerRowFromItem(new TreeItem(cast(TreeItem) parent.getItem(), | |
835 DWT.NONE, rowIndex)); | |
836 } | |
837 | |
838 return getViewerRowFromItem(new TreeItem(cast(TreeItem) parent.getItem(), | |
839 DWT.NONE)); | |
840 } | |
841 | |
842 /* | |
843 * (non-Javadoc) | |
844 * | |
845 * @see dwtx.jface.viewers.AbstractTreeViewer#internalInitializeTree(dwt.widgets.Control) | |
846 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
847 protected override void internalInitializeTree(Control widget) { |
10 | 848 if (contentProviderIsLazy) { |
849 if (cast(Tree)widget && widget.getData() !is null) { | |
850 virtualLazyUpdateChildCount(widget, 0); | |
851 return; | |
852 } | |
853 } | |
854 super.internalInitializeTree(tree); | |
855 } | |
856 | |
857 /* | |
858 * (non-Javadoc) | |
859 * | |
860 * @see dwtx.jface.viewers.AbstractTreeViewer#updatePlus(dwt.widgets.Item, | |
861 * java.lang.Object) | |
862 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
863 protected override void updatePlus(Item item, Object element) { |
10 | 864 if (contentProviderIsLazy) { |
865 Object data = item.getData(); | |
866 int itemCount = 0; | |
867 if (data !is null) { | |
868 // item is already materialized | |
869 itemCount = (cast(TreeItem) item).getItemCount(); | |
870 } | |
871 virtualLazyUpdateHasChildren(item, itemCount); | |
872 } else { | |
873 super.updatePlus(item, element); | |
874 } | |
875 } | |
876 | |
877 /** | |
878 * Removes the element at the specified index of the parent. The selection is updated if required. | |
879 * | |
880 * @param parentOrTreePath the parent element, the input element, or a tree path to the parent element | |
881 * @param index child index | |
882 * @since 3.3 | |
883 */ | |
884 public void remove(Object parentOrTreePath_, int index_) { | |
70
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
885 if (checkBusy()) |
10 | 886 return; |
39 | 887 preservingSelection(new class((cast(TreeSelection) getSelection()).getPaths(),parentOrTreePath_,index_) Runnable { |
10 | 888 Seq!(TreePath) oldSelection; |
889 Object parentOrTreePath; | |
890 int index; | |
39 | 891 this(TreePath[] a,Object b,int c){ |
892 parentOrTreePath=b; | |
893 index=c; | |
10 | 894 oldSelection = new LinkSeq!(TreePath); |
39 | 895 foreach( p; a){ |
10 | 896 oldSelection.append( p ); |
897 } | |
898 } | |
899 public void run() { | |
900 TreePath removedPath = null; | |
901 if (internalIsInputOrEmptyPath(parentOrTreePath)) { | |
902 Tree tree = cast(Tree) getControl(); | |
903 if (index < tree.getItemCount()) { | |
904 TreeItem item = tree.getItem(index); | |
905 if (item.getData() !is null) { | |
906 removedPath = getTreePathFromItem(item); | |
907 disassociate(item); | |
908 } | |
909 item.dispose(); | |
910 } | |
911 } else { | |
912 Widget[] parentItems = internalFindItems(parentOrTreePath); | |
913 for (int i = 0; i < parentItems.length; i++) { | |
914 TreeItem parentItem = cast(TreeItem) parentItems[i]; | |
70
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
915 if (parentItem.isDisposed()) |
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
916 continue; |
10 | 917 if (index < parentItem.getItemCount()) { |
918 TreeItem item = parentItem.getItem(index); | |
919 if (item.getData() !is null) { | |
920 removedPath = getTreePathFromItem(item); | |
921 disassociate(item); | |
922 } | |
923 item.dispose(); | |
924 } | |
925 } | |
926 } | |
927 if (removedPath !is null) { | |
928 bool removed = false; | |
929 int delIdx = 0; | |
930 foreach ( path; oldSelection.dup ) { | |
931 if (path.startsWith(removedPath, getComparer())) { | |
932 oldSelection.removeAt(delIdx); | |
933 removed = true; | |
934 } | |
935 delIdx++; | |
936 } | |
937 if (removed) { | |
938 setSelection(new TreeSelection( | |
939 oldSelection.toArray(), getComparer()), | |
940 false); | |
941 } | |
942 | |
943 } | |
944 } | |
945 }); | |
946 } | |
947 | |
948 /* (non-Javadoc) | |
949 * @see dwtx.jface.viewers.AbstractTreeViewer#handleTreeExpand(dwt.events.TreeEvent) | |
950 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
951 protected override void handleTreeExpand(TreeEvent event) { |
10 | 952 if (contentProviderIsLazy) { |
953 if (event.item.getData() !is null) { | |
954 Item[] children = getChildren(event.item); | |
955 if (children.length is 1 && children[0].getData() is null) { | |
956 // we have a dummy child node, ask for an updated child | |
957 // count | |
958 virtualLazyUpdateChildCount(event.item, children.length); | |
959 } | |
960 fireTreeExpanded(new TreeExpansionEvent(this, event.item | |
961 .getData())); | |
962 } | |
963 return; | |
964 } | |
965 super.handleTreeExpand(event); | |
966 } | |
967 | |
968 /* (non-Javadoc) | |
969 * @see dwtx.jface.viewers.AbstractTreeViewer#setContentProvider(dwtx.jface.viewers.IContentProvider) | |
970 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
971 public override void setContentProvider(IContentProvider provider) { |
10 | 972 contentProviderIsLazy = (cast(ILazyTreeContentProvider)provider ) |
973 || (cast(ILazyTreePathContentProvider)provider ); | |
974 contentProviderIsTreeBased = null !is cast(ILazyTreePathContentProvider)provider ; | |
975 super.setContentProvider(provider); | |
976 } | |
977 | |
978 /** | |
979 * For a TreeViewer with a tree with the VIRTUAL style bit set, inform the | |
980 * viewer about whether the given element or tree path has children. Avoid | |
981 * calling this method if the number of children has already been set. | |
982 * | |
983 * @param elementOrTreePath | |
984 * the element, or tree path | |
985 * @param hasChildren | |
986 * | |
987 * @since 3.3 | |
988 */ | |
989 public void setHasChildren(Object elementOrTreePath_, bool hasChildren_) { | |
70
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
990 if (checkBusy()) |
10 | 991 return; |
39 | 992 preservingSelection(new class(elementOrTreePath_,hasChildren_) Runnable { |
10 | 993 Object elementOrTreePath; |
994 bool hasChildren; | |
39 | 995 this(Object a,bool b){ |
996 elementOrTreePath=a; | |
997 hasChildren=b; | |
10 | 998 } |
999 public void run() { | |
1000 if (internalIsInputOrEmptyPath(elementOrTreePath)) { | |
1001 if (hasChildren) { | |
1002 virtualLazyUpdateChildCount(getTree(), | |
1003 getChildren(getTree()).length); | |
1004 } else { | |
1005 setChildCount(elementOrTreePath, 0); | |
1006 } | |
1007 return; | |
1008 } | |
1009 Widget[] items = internalFindItems(elementOrTreePath); | |
1010 for (int i = 0; i < items.length; i++) { | |
1011 TreeItem item = cast(TreeItem) items[i]; | |
1012 if (!hasChildren) { | |
1013 item.setItemCount(0); | |
1014 } else { | |
1015 if (!item.getExpanded()) { | |
1016 item.setItemCount(1); | |
1017 TreeItem child = item.getItem(0); | |
1018 if (child.getData() !is null) { | |
1019 disassociate(child); | |
1020 } | |
1021 item.clear(0, true); | |
1022 } else { | |
1023 virtualLazyUpdateChildCount(item, item.getItemCount()); | |
1024 } | |
1025 } | |
1026 } | |
1027 } | |
1028 }); | |
1029 } | |
1030 | |
1031 /** | |
1032 * Update the widget at index. | |
1033 * @param widget | |
1034 * @param index | |
1035 */ | |
1036 private void virtualLazyUpdateWidget(Widget widget, int index) { | |
70
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
1037 bool oldBusy = isBusy(); |
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
1038 setBusy(false); |
10 | 1039 try { |
1040 if (contentProviderIsTreeBased) { | |
1041 TreePath treePath; | |
1042 if ( auto i = cast(Item)widget ) { | |
1043 if (widget.getData() is null) { | |
1044 // we need to materialize the parent first | |
1045 // see bug 167668 | |
1046 // however, that would be too risky | |
1047 // see bug 182782 and bug 182598 | |
1048 // so we just ignore this call altogether | |
1049 // and don't do this: virtualMaterializeItem((TreeItem) widget); | |
1050 return; | |
1051 } | |
1052 treePath = getTreePathFromItem(i); | |
1053 } else { | |
1054 treePath = TreePath.EMPTY; | |
1055 } | |
1056 (cast(ILazyTreePathContentProvider) getContentProvider()) | |
1057 .updateElement(treePath, index); | |
1058 } else { | |
1059 (cast(ILazyTreeContentProvider) getContentProvider()).updateElement( | |
1060 widget.getData(), index); | |
1061 } | |
1062 } finally { | |
70
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
1063 setBusy(oldBusy); |
10 | 1064 } |
1065 } | |
1066 | |
1067 /** | |
1068 * Update the child count | |
1069 * @param widget | |
1070 * @param currentChildCount | |
1071 */ | |
1072 private void virtualLazyUpdateChildCount(Widget widget, int currentChildCount) { | |
70
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
1073 bool oldBusy = isBusy(); |
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
1074 setBusy(false); |
10 | 1075 try { |
1076 if (contentProviderIsTreeBased) { | |
1077 TreePath treePath; | |
1078 if (cast(Item)widget ) { | |
1079 treePath = getTreePathFromItem(cast(Item) widget); | |
1080 } else { | |
1081 treePath = TreePath.EMPTY; | |
1082 } | |
1083 (cast(ILazyTreePathContentProvider) getContentProvider()) | |
1084 .updateChildCount(treePath, currentChildCount); | |
1085 } else { | |
1086 (cast(ILazyTreeContentProvider) getContentProvider()).updateChildCount(widget.getData(), currentChildCount); | |
1087 } | |
1088 } finally { | |
70
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
1089 setBusy(oldBusy); |
10 | 1090 } |
1091 } | |
1092 | |
1093 /** | |
1094 * Update the item with the current child count. | |
1095 * @param item | |
1096 * @param currentChildCount | |
1097 */ | |
1098 private void virtualLazyUpdateHasChildren(Item item, int currentChildCount) { | |
70
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
1099 bool oldBusy = isBusy(); |
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
1100 setBusy(false); |
10 | 1101 try { |
1102 if (contentProviderIsTreeBased) { | |
1103 TreePath treePath; | |
1104 treePath = getTreePathFromItem(item); | |
1105 if (currentChildCount is 0) { | |
1106 // item is not expanded (but may have a plus currently) | |
1107 (cast(ILazyTreePathContentProvider) getContentProvider()) | |
1108 .updateHasChildren(treePath); | |
1109 } else { | |
1110 (cast(ILazyTreePathContentProvider) getContentProvider()) | |
1111 .updateChildCount(treePath, currentChildCount); | |
1112 } | |
1113 } else { | |
1114 (cast(ILazyTreeContentProvider) getContentProvider()).updateChildCount(item.getData(), currentChildCount); | |
1115 } | |
1116 } finally { | |
70
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
1117 setBusy(oldBusy); |
10 | 1118 } |
1119 } | |
1120 | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
1121 protected override void disassociate(Item item) { |
10 | 1122 if (contentProviderIsLazy) { |
1123 // avoid causing a callback: | |
1124 item.setText(" "); //$NON-NLS-1$ | |
1125 } | |
1126 super.disassociate(item); | |
1127 } | |
1128 | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
1129 protected override int doGetColumnCount() { |
10 | 1130 return tree.getColumnCount(); |
1131 } | |
1132 | |
1133 /** | |
1134 * Sets a new selection for this viewer and optionally makes it visible. | |
1135 * <p> | |
1136 * <b>Currently the <code>reveal</code> parameter is not honored because | |
1137 * {@link Tree} does not provide an API to only select an item without | |
1138 * scrolling it into view</b> | |
1139 * </p> | |
1140 * | |
1141 * @param selection | |
1142 * the new selection | |
1143 * @param reveal | |
1144 * <code>true</code> if the selection is to be made visible, | |
1145 * and <code>false</code> otherwise | |
1146 */ | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
1147 public override void setSelection(ISelection selection, bool reveal) { |
10 | 1148 super.setSelection(selection, reveal); |
1149 } | |
1150 | |
43
ea8ff534f622
Fix override and super aliases
Frank Benoit <benoit@tionex.de>
parents:
40
diff
changeset
|
1151 public override void editElement(Object element, int column) { |
10 | 1152 if( cast(TreePath)element ) { |
70
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
1153 try { |
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
1154 getControl().setRedraw(false); |
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
1155 setSelection(new TreeSelection(cast(TreePath) element)); |
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
1156 TreeItem[] items = tree.getSelection(); |
10 | 1157 |
70
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
1158 if( items.length is 1 ) { |
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
1159 ViewerRow row = getViewerRowFromItem(items[0]); |
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
1160 |
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
1161 if (row !is null) { |
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
1162 ViewerCell cell = row.getCell(column); |
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
1163 if (cell !is null) { |
10 | 1164 triggerEditorActivationEvent(new ColumnViewerEditorActivationEvent(cell)); |
1165 } | |
1166 } | |
1167 } | |
70
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
1168 } finally { |
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
1169 getControl().setRedraw(true); |
10 | 1170 } |
1171 } else { | |
1172 super.editElement(element, column); | |
1173 } | |
1174 } | |
70
46a6e0e6ccd4
Merge with d-fied sources of 3.4M7
Frank Benoit <benoit@tionex.de>
parents:
54
diff
changeset
|
1175 |
10 | 1176 } |