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