Mercurial > projects > dwt-addons
comparison dwtx/jface/viewers/AbstractTreeViewer.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 | 5df4896124c7 |
children |
comparison
equal
deleted
inserted
replaced
103:2d6540440fe6 | 104:04b47443bb01 |
---|---|
41 import dwtx.jface.viewers.IElementComparer; | 41 import dwtx.jface.viewers.IElementComparer; |
42 import dwtx.jface.viewers.ITreeSelection; | 42 import dwtx.jface.viewers.ITreeSelection; |
43 import dwtx.jface.viewers.IBaseLabelProvider; | 43 import dwtx.jface.viewers.IBaseLabelProvider; |
44 import dwtx.jface.viewers.ITreePathLabelProvider; | 44 import dwtx.jface.viewers.ITreePathLabelProvider; |
45 | 45 |
46 import tango.util.collection.LinkSeq; | |
47 import tango.util.collection.ArraySeq; | |
48 import tango.util.collection.model.Seq; | |
49 import tango.util.collection.model.SeqView; | |
50 | 46 |
51 | 47 |
52 import dwt.DWT; | 48 import dwt.DWT; |
53 import dwt.custom.BusyIndicator; | 49 import dwt.custom.BusyIndicator; |
54 import dwt.events.SelectionEvent; | 50 import dwt.events.SelectionEvent; |
62 import dwtx.core.runtime.Assert; | 58 import dwtx.core.runtime.Assert; |
63 import dwtx.core.runtime.ListenerList; | 59 import dwtx.core.runtime.ListenerList; |
64 import dwtx.jface.util.SafeRunnable; | 60 import dwtx.jface.util.SafeRunnable; |
65 | 61 |
66 import dwt.dwthelper.utils; | 62 import dwt.dwthelper.utils; |
63 import dwtx.dwtxhelper.Collection; | |
67 import dwt.dwthelper.Runnable; | 64 import dwt.dwthelper.Runnable; |
68 | 65 |
69 /** | 66 /** |
70 * Abstract base implementation for tree-structure-oriented viewers (trees and | 67 * Abstract base implementation for tree-structure-oriented viewers (trees and |
71 * table trees). | 68 * table trees). |
309 * @return the filter list of children | 306 * @return the filter list of children |
310 */ | 307 */ |
311 private Object[] filter(Object parentElementOrTreePath, Object[] elements) { | 308 private Object[] filter(Object parentElementOrTreePath, Object[] elements) { |
312 ViewerFilter[] filters = getFilters(); | 309 ViewerFilter[] filters = getFilters(); |
313 if (filters !is null) { | 310 if (filters !is null) { |
314 auto filtered = new ArraySeq!(Object); | 311 ArrayList filtered = new ArrayList(elements.length); |
315 filtered.capacity(elements.length); | |
316 for (int i = 0; i < elements.length; i++) { | 312 for (int i = 0; i < elements.length; i++) { |
317 bool add = true; | 313 bool add = true; |
318 for (int j = 0; j < filters.length; j++) { | 314 for (int j = 0; j < filters.length; j++) { |
319 add = filters[j].select(this, parentElementOrTreePath, | 315 add = filters[j].select(this, parentElementOrTreePath, |
320 elements[i]); | 316 elements[i]); |
321 if (!add) { | 317 if (!add) { |
322 break; | 318 break; |
323 } | 319 } |
324 } | 320 } |
325 if (add) { | 321 if (add) { |
326 filtered.append(elements[i]); | 322 filtered.add(elements[i]); |
327 } | 323 } |
328 } | 324 } |
329 return filtered.toArray(); | 325 return filtered.toArray(); |
330 } | 326 } |
331 return elements; | 327 return elements; |
799 if (data !is null) { | 795 if (data !is null) { |
800 return; // children already there! | 796 return; // children already there! |
801 } | 797 } |
802 } | 798 } |
803 | 799 |
804 BusyIndicator.showWhile(widget.getDisplay(), new class(widget,tis) Runnable { | 800 BusyIndicator.showWhile(widget.getDisplay(), dgRunnable( (Widget widget_, Item[] tis_){ |
805 Widget widget_; | 801 // fix for PR 1FW89L7: |
806 Item[] tis_; | 802 // don't complain and remove all "dummies" ... |
807 this( Widget a, Item[] b){ | 803 if (tis_ !is null) { |
808 widget_ = a; | 804 for (int i = 0; i < tis_.length; i++) { |
809 tis_=b; | 805 if (tis_[i].getData() !is null) { |
810 } | 806 disassociate(tis_[i]); |
811 public void run() { | 807 Assert.isTrue(tis_[i].getData() is null, |
812 // fix for PR 1FW89L7: | 808 "Second or later child is non -null");//$NON-NLS-1$ |
813 // don't complain and remove all "dummies" ... | 809 |
814 if (tis_ !is null) { | |
815 for (int i = 0; i < tis_.length; i++) { | |
816 if (tis_[i].getData() !is null) { | |
817 disassociate(tis_[i]); | |
818 Assert.isTrue(tis_[i].getData() is null, | |
819 "Second or later child is non -null");//$NON-NLS-1$ | |
820 | |
821 } | |
822 tis_[i].dispose(); | |
823 } | 810 } |
824 } | 811 tis_[i].dispose(); |
825 Object d = widget_.getData(); | 812 } |
826 if (d !is null) { | 813 } |
827 Object parentElement = d; | 814 Object d = widget_.getData(); |
828 Object[] children; | 815 if (d !is null) { |
829 if (isTreePathContentProvider() && (null !is cast(Item)widget_) ) { | 816 Object parentElement = d; |
830 TreePath path = getTreePathFromItem(cast(Item) widget_); | 817 Object[] children; |
831 children = getSortedChildren(path); | 818 if (isTreePathContentProvider() && (null !is cast(Item)widget_) ) { |
832 } else { | 819 TreePath path = getTreePathFromItem(cast(Item) widget_); |
833 children = getSortedChildren(parentElement); | 820 children = getSortedChildren(path); |
834 } | 821 } else { |
835 for (int i = 0; i < children.length; i++) { | 822 children = getSortedChildren(parentElement); |
836 createTreeItem(widget_, children[i], -1); | 823 } |
837 } | 824 for (int i = 0; i < children.length; i++) { |
838 } | 825 createTreeItem(widget_, children[i], -1); |
839 } | 826 } |
840 | 827 } |
841 }); | 828 }, widget,tis )); |
842 } finally { | 829 } finally { |
843 setBusy(oldBusy); | 830 setBusy(oldBusy); |
844 } | 831 } |
845 } | 832 } |
846 | 833 |
992 * @return <code>true</code> if the refer to the same elements, | 979 * @return <code>true</code> if the refer to the same elements, |
993 * <code>false</code> otherwise | 980 * <code>false</code> otherwise |
994 * | 981 * |
995 * @since 3.1 in TreeViewer, moved to AbstractTreeViewer in 3.3 | 982 * @since 3.1 in TreeViewer, moved to AbstractTreeViewer in 3.3 |
996 */ | 983 */ |
997 protected bool isSameSelection(SeqView!(Item) items, Item[] current) { | 984 protected bool isSameSelection(List items, Item[] current) { |
998 // If they are not the same size then they are not equivalent | 985 // If they are not the same size then they are not equivalent |
999 int n = items.size(); | 986 int n = items.size(); |
1000 if (n !is current.length) { | 987 if (n !is current.length) { |
1001 return false; | 988 return false; |
1002 } | 989 } |
1003 | 990 |
1004 CustomHashtable itemSet = newHashtable(n * 2 + 1); | 991 CustomHashtable itemSet = newHashtable(n * 2 + 1); |
1005 foreach( item; items ){ | 992 for (Iterator i = items.iterator(); i.hasNext();) { |
993 Item item = cast(Item) i.next(); | |
1006 Object element = item.getData(); | 994 Object element = item.getData(); |
1007 itemSet.put(element, element); | 995 itemSet.put(element, element); |
1008 } | 996 } |
1009 | 997 |
1010 // Go through the items of the current collection | 998 // Go through the items of the current collection |
1210 * | 1198 * |
1211 * @return the array of expanded elements | 1199 * @return the array of expanded elements |
1212 * @see #setExpandedElements | 1200 * @see #setExpandedElements |
1213 */ | 1201 */ |
1214 public Object[] getExpandedElements() { | 1202 public Object[] getExpandedElements() { |
1215 auto items = new ArraySeq!(Item); | 1203 ArrayList items = new ArrayList(); |
1216 internalCollectExpandedItems(items, getControl()); | 1204 internalCollectExpandedItems(items, getControl()); |
1217 auto result = new ArraySeq!(Object); | 1205 ArrayList result = new ArrayList(items.size()); |
1218 result.capacity(items.size()); | 1206 for (Iterator it = items.iterator(); it.hasNext();) { |
1219 foreach ( item; items ) { | 1207 Item item = cast(Item) it.next(); |
1220 Object data = item.getData(); | 1208 Object data = item.getData(); |
1221 if (data !is null) { | 1209 if (data !is null) { |
1222 result.append(data); | 1210 result.add(data); |
1223 } | 1211 } |
1224 } | 1212 } |
1225 return result.toArray(); | 1213 return result.toArray(); |
1226 } | 1214 } |
1227 | 1215 |
1412 /* | 1400 /* |
1413 * (non-Javadoc) | 1401 * (non-Javadoc) |
1414 * | 1402 * |
1415 * @see dwtx.jface.viewers.StructuredViewer#getSelectionFromWidget() | 1403 * @see dwtx.jface.viewers.StructuredViewer#getSelectionFromWidget() |
1416 */ | 1404 */ |
1417 protected override SeqView!(Object) getSelectionFromWidget() { | 1405 protected override List getSelectionFromWidget() { |
1418 Widget[] items = getSelection(getControl()); | 1406 Widget[] items = getSelection(getControl()); |
1419 ArraySeq!(Object) list = new ArraySeq!(Object); | 1407 ArrayList list = new ArrayList(items.length); |
1420 list.capacity(items.length); | |
1421 for (int i = 0; i < items.length; i++) { | 1408 for (int i = 0; i < items.length; i++) { |
1422 Widget item = items[i]; | 1409 Widget item = items[i]; |
1423 Object e = item.getData(); | 1410 Object e = item.getData(); |
1424 if (e !is null) { | 1411 if (e !is null) { |
1425 list.append(e); | 1412 list.add(e); |
1426 } | 1413 } |
1427 } | 1414 } |
1428 return list; | 1415 return list; |
1429 } | 1416 } |
1430 | 1417 |
1572 * a list (element type: <code>Item</code>) into which to | 1559 * a list (element type: <code>Item</code>) into which to |
1573 * collect the elements | 1560 * collect the elements |
1574 * @param widget | 1561 * @param widget |
1575 * the widget | 1562 * the widget |
1576 */ | 1563 */ |
1577 private void internalCollectExpandedItems(Seq!(Item) result, Widget widget) { | 1564 private void internalCollectExpandedItems(List result, Widget widget) { |
1578 Item[] items = getChildren(widget); | 1565 Item[] items = getChildren(widget); |
1579 for (int i = 0; i < items.length; i++) { | 1566 for (int i = 0; i < items.length; i++) { |
1580 Item item = items[i]; | 1567 Item item = items[i]; |
1581 if (getExpanded(item)) { | 1568 if (getExpanded(item)) { |
1582 result.append(item); | 1569 result.add(item); |
1583 } | 1570 } |
1584 internalCollectExpandedItems(result, item); | 1571 internalCollectExpandedItems(result, item); |
1585 } | 1572 } |
1586 } | 1573 } |
1587 | 1574 |
1619 Object element = internalToElement(elementOrPath); | 1606 Object element = internalToElement(elementOrPath); |
1620 w = internalFindChild(pw, element); | 1607 w = internalFindChild(pw, element); |
1621 if (expand && null !is cast(Item)pw ) { | 1608 if (expand && null !is cast(Item)pw ) { |
1622 // expand parent items top-down | 1609 // expand parent items top-down |
1623 Item item = cast(Item) pw; | 1610 Item item = cast(Item) pw; |
1624 auto toExpandList = new LinkSeq!(Item); | 1611 LinkedList toExpandList = new LinkedList(); |
1625 while (item !is null && !getExpanded(item)) { | 1612 while (item !is null && !getExpanded(item)) { |
1626 toExpandList.prepend(item); | 1613 toExpandList.addFirst(item); |
1627 item = getParentItem(item); | 1614 item = getParentItem(item); |
1628 } | 1615 } |
1629 foreach( toExpand; toExpandList ){ | 1616 for (Iterator it = toExpandList.iterator(); it |
1617 .hasNext();) { | |
1618 Item toExpand = cast(Item) it.next(); | |
1630 setExpanded(toExpand, true); | 1619 setExpanded(toExpand, true); |
1631 } | 1620 } |
1632 } | 1621 } |
1633 } | 1622 } |
1634 } | 1623 } |
2174 if (elementsOrTreePaths.length is 0) { | 2163 if (elementsOrTreePaths.length is 0) { |
2175 return; | 2164 return; |
2176 } | 2165 } |
2177 if (checkBusy()) | 2166 if (checkBusy()) |
2178 return; | 2167 return; |
2179 preservingSelection(new class(elementsOrTreePaths) Runnable { | 2168 preservingSelection( dgRunnable( (Object[] elementsOrTreePaths_){ |
2180 Object[] elementsOrTreePaths_; | 2169 internalRemove(elementsOrTreePaths_); |
2181 this(Object[] a){ | 2170 }, elementsOrTreePaths)); |
2182 elementsOrTreePaths_=a; | |
2183 } | |
2184 public void run() { | |
2185 internalRemove(elementsOrTreePaths_); | |
2186 } | |
2187 }); | |
2188 } | 2171 } |
2189 | 2172 |
2190 /** | 2173 /** |
2191 * Removes the given elements from this viewer whenever they appear as | 2174 * Removes the given elements from this viewer whenever they appear as |
2192 * children of the given parent element. If the given elements also appear | 2175 * children of the given parent element. If the given elements also appear |
2210 if (elements.length is 0) { | 2193 if (elements.length is 0) { |
2211 return; | 2194 return; |
2212 } | 2195 } |
2213 if (checkBusy()) | 2196 if (checkBusy()) |
2214 return; | 2197 return; |
2215 preservingSelection(new class(parent,elements) Runnable { | 2198 preservingSelection( dgRunnable( (Object parent_,Object[] elements_){ |
2216 Object parent_; | 2199 internalRemove(parent_, elements_); |
2217 Object[] elements_; | 2200 }, parent, elements )); |
2218 this(Object a,Object[] b){ | |
2219 parent_=a; | |
2220 elements_=b; | |
2221 } | |
2222 public void run() { | |
2223 internalRemove(parent_, elements_); | |
2224 } | |
2225 }); | |
2226 } | 2201 } |
2227 | 2202 |
2228 /** | 2203 /** |
2229 * Removes the given element from the viewer. The selection is updated if | 2204 * Removes the given element from the viewer. The selection is updated if |
2230 * necessary. | 2205 * necessary. |
2477 * | 2452 * |
2478 * @param items | 2453 * @param items |
2479 * list of items (element type: | 2454 * list of items (element type: |
2480 * <code>dwt.widgets.Item</code>) | 2455 * <code>dwt.widgets.Item</code>) |
2481 */ | 2456 */ |
2482 protected abstract void setSelection(SeqView!(Item) items); | 2457 protected abstract void setSelection(List items); |
2483 | 2458 |
2484 /** | 2459 /** |
2485 * This implementation of setSelectionToWidget accepts a list of elements or | 2460 * This implementation of setSelectionToWidget accepts a list of elements or |
2486 * a list of tree paths. | 2461 * a list of tree paths. |
2487 */ | 2462 */ |
2488 protected override void setSelectionToWidget(SeqView!(Object) v, bool reveal) { | 2463 protected override void setSelectionToWidget(List v, bool reveal) { |
2489 if (v is null) { | 2464 if (v is null) { |
2490 setSelection(new ArraySeq!(Item)); | 2465 setSelection(new ArrayList(0)); |
2491 return; | 2466 return; |
2492 } | 2467 } |
2493 int size = v.size(); | 2468 int size = v.size(); |
2494 auto newSelection = new ArraySeq!(Item); | 2469 List newSelection = new ArrayList(size); |
2495 newSelection.capacity(size); | |
2496 for (int i = 0; i < size; ++i) { | 2470 for (int i = 0; i < size; ++i) { |
2497 Object elementOrTreePath = v.get(i); | 2471 Object elementOrTreePath = v.get(i); |
2498 // Use internalExpand since item may not yet be created. See | 2472 // Use internalExpand since item may not yet be created. See |
2499 // 1G6B1AR. | 2473 // 1G6B1AR. |
2500 Widget w = internalExpand(elementOrTreePath, false); | 2474 Widget w = internalExpand(elementOrTreePath, false); |
2501 if ( auto it = cast(Item)w ) { | 2475 if ( auto it = cast(Item)w ) { |
2502 newSelection.append(it); | 2476 newSelection.add(it); |
2503 } else if (w is null && null !is cast(TreePath)elementOrTreePath ) { | 2477 } else if (w is null && null !is cast(TreePath)elementOrTreePath ) { |
2504 TreePath treePath = cast(TreePath) elementOrTreePath; | 2478 TreePath treePath = cast(TreePath) elementOrTreePath; |
2505 Object element = treePath.getLastSegment(); | 2479 Object element = treePath.getLastSegment(); |
2506 if (element !is null) { | 2480 if (element !is null) { |
2507 w = internalExpand(element, false); | 2481 w = internalExpand(element, false); |
2508 if ( auto it = cast(Item)w ) { | 2482 if ( auto it = cast(Item)w ) { |
2509 newSelection.append(it); | 2483 newSelection.add(it); |
2510 } | 2484 } |
2511 } | 2485 } |
2512 } | 2486 } |
2513 } | 2487 } |
2514 setSelection(newSelection); | 2488 setSelection(newSelection); |
2834 * | 2808 * |
2835 * @return the visible expanded elements | 2809 * @return the visible expanded elements |
2836 * @since 2.0 | 2810 * @since 2.0 |
2837 */ | 2811 */ |
2838 public Object[] getVisibleExpandedElements() { | 2812 public Object[] getVisibleExpandedElements() { |
2839 auto v = new ArraySeq!(Object); | 2813 ArrayList v = new ArrayList(); |
2840 internalCollectVisibleExpanded(v, getControl()); | 2814 internalCollectVisibleExpanded(v, getControl()); |
2841 return v.toArray(); | 2815 return v.toArray(); |
2842 } | 2816 } |
2843 | 2817 |
2844 private void internalCollectVisibleExpanded(ArraySeq!(Object) result, Widget widget) { | 2818 private void internalCollectVisibleExpanded(ArrayList result, Widget widget) { |
2845 Item[] items = getChildren(widget); | 2819 Item[] items = getChildren(widget); |
2846 for (int i = 0; i < items.length; i++) { | 2820 for (int i = 0; i < items.length; i++) { |
2847 Item item = items[i]; | 2821 Item item = items[i]; |
2848 if (getExpanded(item)) { | 2822 if (getExpanded(item)) { |
2849 Object data = item.getData(); | 2823 Object data = item.getData(); |
2850 if (data !is null) { | 2824 if (data !is null) { |
2851 result.append(data); | 2825 result.add(data); |
2852 } | 2826 } |
2853 // Only recurse if it is expanded - if | 2827 // Only recurse if it is expanded - if |
2854 // not then the children aren't visible | 2828 // not then the children aren't visible |
2855 internalCollectVisibleExpanded(result, item); | 2829 internalCollectVisibleExpanded(result, item); |
2856 } | 2830 } |
2863 * @return {@link TreePath} | 2837 * @return {@link TreePath} |
2864 * | 2838 * |
2865 * @since 3.2 | 2839 * @since 3.2 |
2866 */ | 2840 */ |
2867 protected TreePath getTreePathFromItem(Item item) { | 2841 protected TreePath getTreePathFromItem(Item item) { |
2868 auto segments = new LinkSeq!(Object); | 2842 LinkedList segments = new LinkedList(); |
2869 while (item !is null) { | 2843 while (item !is null) { |
2870 Object segment = item.getData(); | 2844 Object segment = item.getData(); |
2871 Assert.isNotNull(segment); | 2845 Assert.isNotNull(segment); |
2872 segments.prepend(segment); | 2846 segments.addFirst(segment); |
2873 item = getParentItem(item); | 2847 item = getParentItem(item); |
2874 } | 2848 } |
2875 return new TreePath(segments.toArray()); | 2849 return new TreePath(segments.toArray()); |
2876 } | 2850 } |
2877 package TreePath getTreePathFromItem_package(Item item) { | 2851 package TreePath getTreePathFromItem_package(Item item) { |
2888 Control control = getControl(); | 2862 Control control = getControl(); |
2889 if (control is null || control.isDisposed()) { | 2863 if (control is null || control.isDisposed()) { |
2890 return TreeSelection.EMPTY; | 2864 return TreeSelection.EMPTY; |
2891 } | 2865 } |
2892 Widget[] items = getSelection(getControl()); | 2866 Widget[] items = getSelection(getControl()); |
2893 auto list = new ArraySeq!(TreePath); | 2867 ArrayList list = new ArrayList(items.length); |
2894 list.capacity(items.length); | |
2895 for (int i = 0; i < items.length; i++) { | 2868 for (int i = 0; i < items.length; i++) { |
2896 Widget item = items[i]; | 2869 Widget item = items[i]; |
2897 if (item.getData() !is null) { | 2870 if (item.getData() !is null) { |
2898 list.append(getTreePathFromItem(cast(Item) item)); | 2871 list.add(getTreePathFromItem(cast(Item) item)); |
2899 } | 2872 } |
2900 } | 2873 } |
2901 return new TreeSelection( list.toArray(), getComparer()); | 2874 return new TreeSelection( arraycast!(TreePath)(list.toArray()), getComparer()); |
2902 } | 2875 } |
2903 | 2876 |
2904 protected override void setSelectionToWidget(ISelection selection, bool reveal) { | 2877 protected override void setSelectionToWidget(ISelection selection, bool reveal) { |
2905 if ( auto treeSelection = cast(ITreeSelection)selection ) { | 2878 if ( auto treeSelection = cast(ITreeSelection)selection ) { |
2906 auto list = new ArraySeq!(Object); | 2879 setSelectionToWidget(Arrays.asList(treeSelection.getPaths()), |
2907 auto paths = treeSelection.getPaths(); | 2880 reveal); |
2908 list.capacity(paths.length); | |
2909 foreach( path; paths ){ | |
2910 list.append(path); | |
2911 } | |
2912 setSelectionToWidget(list, reveal); | |
2913 } else { | 2881 } else { |
2914 super.setSelectionToWidget(selection, reveal); | 2882 super.setSelectionToWidget(selection, reveal); |
2915 } | 2883 } |
2916 } | 2884 } |
2917 | 2885 |
2928 * @see #setExpandedElements | 2896 * @see #setExpandedElements |
2929 * | 2897 * |
2930 * @since 3.2 | 2898 * @since 3.2 |
2931 */ | 2899 */ |
2932 public TreePath[] getExpandedTreePaths() { | 2900 public TreePath[] getExpandedTreePaths() { |
2933 auto items = new ArraySeq!(Item); | 2901 ArrayList items = new ArrayList(); |
2934 internalCollectExpandedItems(items, getControl()); | 2902 internalCollectExpandedItems(items, getControl()); |
2935 auto result = new ArraySeq!(TreePath); | 2903 ArrayList result = new ArrayList(items.size()); |
2936 result.capacity(items.size()); | 2904 for (Iterator it = items.iterator(); it.hasNext();) { |
2937 foreach( item; items ){ | 2905 Item item = cast(Item) it.next(); |
2938 TreePath treePath = getTreePathFromItem(item); | 2906 TreePath treePath = getTreePathFromItem(item); |
2939 if (treePath !is null) { | 2907 if (treePath !is null) { |
2940 result.append(treePath); | 2908 result.add(treePath); |
2941 } | 2909 } |
2942 } | 2910 } |
2943 return result.toArray(); | 2911 return arraycast!(TreePath)(result.toArray()); |
2944 } | 2912 } |
2945 | 2913 |
2946 private bool isTreePathContentProvider() { | 2914 private bool isTreePathContentProvider() { |
2947 return null !is cast(ITreePathContentProvider)getContentProvider() ; | 2915 return null !is cast(ITreePathContentProvider)getContentProvider() ; |
2948 } | 2916 } |