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 }