--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Tree.java Tue Aug 31 15:09:22 2010 +0300
@@ -0,0 +1,1450 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation and others.
+ * Portion Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ * Nokia Corporation - S60 implementation
+ * Nokia Corporation - Qt implementation
+ *******************************************************************************/
+package org.eclipse.swt.widgets;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTException;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.events.TreeListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.internal.qt.OS;
+import org.eclipse.swt.internal.qt.WidgetState;
+
+/**
+ * Instances of this class provide a selectable user interface object that
+ * displays a hierarchy of items and issues notification when an item in the
+ * hierarchy is selected.
+ * <p>
+ * The item children that may be added to instances of this class must be of
+ * type <code>TreeItem</code>.
+ * </p>
+ * <p>
+ * Style <code>VIRTUAL</code> is used to create a <code>Tree</code> whose
+ * <code>TreeItem</code>s are to be populated by the client on an on-demand
+ * basis instead of up-front. This can provide significant performance
+ * improvements for trees that are very large or for which <code>TreeItem</code>
+ * population is expensive (for example, retrieving values from an external
+ * source).
+ * </p>
+ * <p>
+ *
+ * Here is an example of using a <code>Tree</code> with style
+ * <code>VIRTUAL</code>: <code><pre>
+ * final Tree tree = new Tree(parent, SWT.VIRTUAL | SWT.BORDER);
+ * tree.setItemCount(20);
+ * tree.addListener(SWT.SetData, new Listener() {
+ * public void handleEvent(Event event) {
+ * TreeItem item = (TreeItem)event.item;
+ * TreeItem parentItem = item.getParentItem();
+ * String text = null;
+ * if (parentItem == null) {
+ * text = "node " + tree.indexOf(item);
+ * } else {
+ * text = parentItem.getText() + " - " + parentItem.indexOf(item);
+ * }
+ * item.setText(text);
+ * System.out.println(text);
+ * item.setItemCount(10);
+ * }
+ * });
+ * </pre></code>
+ * </p>
+ * <p>
+ * Note that although this class is a subclass of <code>Composite</code>, it
+ * does not normally make sense to add <code>Control</code> children to it, or
+ * set a layout on it, unless implementing something like a cell editor.
+ * </p>
+ * <p>
+ *
+ * <dl>
+ * <dt><b>Styles:</b></dt>
+ * <dd>SINGLE, MULTI, CHECK, VIRTUAL</dd>
+ * <dt><b>Events:</b></dt>
+ * <dd>Selection, DefaultSelection, Collapse, Expand, SetData,</dd>
+ * </dl>
+ * </p>
+ * <p>
+ *
+ * Note: Only one of the styles SINGLE and MULTI may be specified.
+ * </p>
+ * <p>
+ * IMPORTANT: This class is <em>not</em> intended to be subclassed.
+ * </p>
+ **/
+public class Tree extends Composite {
+
+ static int checkStyle(int style) {
+ style |= SWT.H_SCROLL | SWT.V_SCROLL;
+ return checkBits(style, SWT.SINGLE, SWT.MULTI, 0, 0, 0, 0);
+ }
+
+ // The root items of the Tree.
+ TreeItem[] topLevelItems;
+
+ int topLevelItemCount;
+ boolean ignoreSelectionEvent;
+
+ boolean ignoreExpandEvent;
+
+ int[] topLevelItemsHandle;
+
+ // Tells if any item has expanded used for SWT.VIRTUAL style Tree
+ int expandedItemCount = 0;
+
+ /**
+ * Constructs a new instance of this class given its parent and a style
+ * value describing its behavior and appearance.
+ * <p>
+ * The style value is either one of the style constants defined in class
+ * <code>SWT</code> which is applicable to instances of this class, or must
+ * be built by <em>bitwise OR</em>'ing together (that is, using the
+ * <code>int</code> "|" operator) two or more of those <code>SWT</code>
+ * style constants. The class description lists the style constants that are
+ * applicable to the class. Style bits are also inherited from superclasses.
+ * </p>
+ *
+ * @param parent
+ * a composite control which will be the parent of the new
+ * instance (cannot be null)
+ * @param style
+ * the style of control to construct
+ *
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ * thread that created the parent</li>
+ * <li>ERROR_INVALID_SUBCLASS - if this class is not an
+ * allowed subclass</li>
+ * </ul>
+ *
+ * @see SWT#SINGLE
+ * @see SWT#MULTI
+ * @see SWT#CHECK
+ * @see Widget#checkSubclass
+ * @see Widget#getStyle
+ */
+ public Tree(Composite parent, int style) {
+ super(parent, checkStyle(style));
+ }
+
+ TreeItem _getItem(int index) {
+ if ((style & SWT.VIRTUAL) == 0)
+ return topLevelItems[index];
+ if (topLevelItems[index] != null)
+ return topLevelItems[index];
+ return topLevelItems[index] = new TreeItem(this, SWT.NONE, index, false);
+ }
+
+ void _showItem(TreeItem item, int aScrollHint ){
+ if (item == null)
+ error(SWT.ERROR_NULL_ARGUMENT);
+ if (item.isDisposed())
+ error(SWT.ERROR_INVALID_ARGUMENT);
+ if (item.getParent() != this)
+ return;
+
+ int itemHandle = item.internal_itemHandle();
+ if((style & SWT.VIRTUAL)!=0 && !item.cached){
+ TreeItem parentItem = item.getParentItem();
+ if(parentItem!=null) {
+ for(int i=0;i<parentItem.childrenItemCount;i++){
+ if(item==parentItem.childrenItems[i]){
+ itemHandle = parentItem.childrenItemsHandle[i];
+ break;
+ }
+ }
+ } else {
+ for(int i=0;i<topLevelItemCount;i++){
+ if(item==topLevelItems[i]){
+ itemHandle = topLevelItemsHandle[i];
+ break;
+ }
+ }
+ }
+ }
+ OS.QTreeWidget_scrollToItem(topHandle, itemHandle, aScrollHint);
+ }
+
+ /**
+ * Adds the listener to the collection of listeners who will be notified
+ * when the receiver's selection changes, by sending it one of the messages
+ * defined in the <code>SelectionListener</code> interface.
+ * <p>
+ * When <code>widgetSelected</code> is called, the item field of the event
+ * object is valid. If the reciever has <code>SWT.CHECK</code> style set and
+ * the check selection changes, the event object detail field contains the
+ * value <code>SWT.CHECK</code>. <code>widgetDefaultSelected</code> is
+ * typically called when an item is double-clicked. The item field of the
+ * event object is valid for default selection, but the detail field is not
+ * used.
+ * </p>
+ *
+ * @param listener
+ * the listener which should be notified
+ *
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ * disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ * thread that created the receiver</li>
+ * </ul>
+ *
+ * @see SelectionListener
+ * @see #removeSelectionListener
+ * @see SelectionEvent
+ */
+ public void addSelectionListener(SelectionListener listener) {
+ checkWidget();
+ if (listener == null)
+ error(SWT.ERROR_NULL_ARGUMENT);
+ TypedListener typedListener = new TypedListener(listener);
+ addListener(SWT.Selection, typedListener);
+ addListener(SWT.DefaultSelection, typedListener);
+ }
+
+ /*
+ * Add a new child to the Tree's list of children. Add the item at the given
+ * index. An index of -1 implies that the child should be added to the end
+ * of the Tree's list of children.
+ */
+ void addTopLevelItem(TreeItem item, int index, int itemHandle) {
+
+ if (!(0 <= index && index <= topLevelItemCount))
+ error(SWT.ERROR_INVALID_RANGE);
+
+ increaseArraySize();
+ // Put the new item in the correct place in item array
+ System.arraycopy(topLevelItems, index, topLevelItems, index + 1,
+ topLevelItemCount + 1 - index);
+ topLevelItems[index] = item;
+
+ // itemCount is already increase in the previous line.
+ System.arraycopy(topLevelItemsHandle, index, topLevelItemsHandle,
+ index + 1, topLevelItemCount + 1 - index);
+ topLevelItemsHandle[index] = itemHandle;
+
+ topLevelItemCount++;
+ }
+
+ /**
+ * Adds the listener to the collection of listeners who will be notified
+ * when an item in the receiver is expanded or collapsed by sending it one
+ * of the messages defined in the <code>TreeListener</code> interface.
+ *
+ * @param listener
+ * the listener which should be notified
+ *
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ * disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ * thread that created the receiver</li>
+ * </ul>
+ *
+ * @see TreeListener
+ * @see #removeTreeListener
+ */
+ public void addTreeListener(TreeListener listener) {
+ checkWidget();
+ if (listener == null)
+ error(SWT.ERROR_NULL_ARGUMENT);
+ TypedListener typedListener = new TypedListener(listener);
+ addListener(SWT.Expand, typedListener);
+ addListener(SWT.Collapse, typedListener);
+ }
+
+ boolean checkData(TreeItem item, int index) {
+ if (item.cached)
+ return true;
+ if ((style & SWT.VIRTUAL) != 0) {
+ if (index == -1)
+ return false;
+ Event event = new Event();
+ event.item = item;
+ event.index = index;
+ item.ensureValid(index);
+ sendEvent(SWT.SetData, event);
+ if (isDisposed())
+ return false;
+ if (item.isDisposed())
+ return false;
+ }
+ if (isDisposed())
+ return false;
+ if (item == null || item.isDisposed())
+ return false;
+ return true;
+
+ }
+
+ boolean checkData(TreeItem item, TreeItem parentItem) {
+ return checkData(item, parentItem == null ? getItemIndex(item)
+ : parentItem.getChildItemIndex(item));
+ }
+
+ protected void checkSubclass() {
+ if (!isValidSubclass())
+ error(SWT.ERROR_INVALID_SUBCLASS);
+ }
+
+ void clearSelection(){
+ for(int i=0;i<topLevelItemCount;i++){
+ TreeItem topItem = _getItem(i);
+ topItem.selection=false;
+ topItem.clearSelection();
+ }
+ }
+
+ void createHandle_pp(int index) {
+ topHandle = scrollAreaHandle = frameHandle = OS.QTreeWidget_new();
+ handle = OS.QAbstractScrollArea_viewPort(topHandle);
+ state |= WidgetState.HANDLE;
+ state &= ~WidgetState.CANVAS;
+
+ OS.QTreeWidget_setColumnCount(topHandle, 1);
+
+ // Set up selection mode (MULTI/SINGLE)
+ if ((style & SWT.MULTI) != 0) {
+ OS.QAbstractItemView_setSelectionMode(topHandle,
+ OS.QT_ABSTRACTITEMVIEW_SELECTIONMODE_MULTI);
+ } else {
+ OS.QAbstractItemView_setSelectionMode(topHandle,
+ OS.QT_ABSTRACTITEMVIEW_SELECTIONMODE_SINGLE);
+ }
+
+ OS.QTreeWidget_swt_setHeaderVisible(topHandle, false);
+ }
+
+ void createWidget(int index) {
+ super.createWidget(index);
+ topLevelItems = new TreeItem[4];
+ topLevelItemCount = 0;
+ topLevelItemsHandle = new int[4];
+ }
+
+ /**
+ * Deselects all selected items in the receiver.
+ *
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ * disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ * thread that created the receiver</li>
+ * </ul>
+ */
+ public void deselectAll() {
+ checkWidget();
+ if ((style & SWT.SINGLE) != 0) {
+ return;
+ }
+ ignoreSelectionEvent = true;
+ OS.QAbstractItemView_clearSelection(topHandle);
+
+ if((style&SWT.VIRTUAL)!=0){
+ clearSelection();
+ }
+ ignoreSelectionEvent = false;
+ }
+
+ /*
+ * Its a recursive function executed only in virtual tree style.
+ * It takes item handle as a parameter, finds and return. If it
+ * can't find the item with that handle it just returns null.
+ */
+ TreeItem findParentItem(int itemHandle) {
+ TreeItem item = null;
+ for (int i = 0; i < topLevelItemCount; i++) {
+ if (topLevelItemsHandle[i] == itemHandle) {
+ item = _getItem(i);
+ break;
+ } else {
+ TreeItem topLevelItem = _getItem(i);
+ if(topLevelItem.cached){
+ if (topLevelItem.getExpanded()) {
+ item = topLevelItem.findItem(itemHandle);
+ }}
+ if (item != null)
+ break;
+ }
+ }
+ return item;
+ }
+
+ /**
+ * Returns the item at the given point in the receiver or null if no such
+ * item exists. The point is in the coordinate system of the receiver.
+ *
+ * @param point
+ * the point used to locate the item
+ * @return the item at the given point
+ *
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the point is null</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ * disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ * thread that created the receiver</li>
+ * </ul>
+ */
+ public TreeItem getItem(Point point) {
+ checkWidget();
+ if (point == null)
+ error(SWT.ERROR_NULL_ARGUMENT);
+ int itemHandle = OS.QTreeWidget_itemAt(topHandle, point.x,
+ point.y);
+ if (itemHandle == -1)
+ return null;
+ TreeItem item = null;
+ for (int i = 0; i < topLevelItemCount; i++) {
+
+ if (topLevelItemsHandle[i] == itemHandle) {
+ item = _getItem(i);
+ break;
+ } else {
+ item = _getItem(i).getItem(itemHandle);
+ if (item != null)
+ break;
+ }
+ }
+ return item;
+ }
+
+ /**
+ * Returns the number of items contained in the receiver that are direct
+ * item children of the receiver. The number that is returned is the number
+ * of roots in the tree.
+ *
+ * @return the number of items
+ *
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ * disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ * thread that created the receiver</li>
+ * </ul>
+ */
+ public int getItemCount() {
+ checkWidget();
+ return topLevelItemCount;
+ }
+
+ /**
+ * Returns the height of the area which would be used to display
+ * <em>one</em> of the items in the tree.
+ *
+ * @return the height of one item
+ *
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ * disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ * thread that created the receiver</li>
+ * </ul>
+ */
+ public int getItemHeight() {
+ checkWidget();
+ int itemHeight = 0;
+ if (topLevelItemCount > 0) {
+ itemHeight = OS.QAbstractItemView_sizeHintForRow(
+ topHandle, 0);
+ } else {
+ OS.QTreeWidget_addTopLevelItem(topHandle, OS
+ .QTreeWidgetItem_new());
+ itemHeight = OS.QAbstractItemView_sizeHintForRow(
+ topHandle, 0);
+ OS.QTreeWidget_clear(topHandle);
+ }
+ return itemHeight;
+ }
+
+ int getItemIndex(TreeItem item) {
+ if (item == null)
+ error(SWT.ERROR_NULL_ARGUMENT);
+ if (topLevelItemCount == 0 || topLevelItems == null || item.getParent() != this)
+ return -1;
+
+ return OS.QTreeWidget_indexOfTopLevelItem(topHandle,
+ item.internal_itemHandle());
+ }
+
+ /**
+ * Returns a (possibly empty) array of items contained in the receiver that
+ * are direct item children of the receiver. These
+ * <p>
+ * Note: This is not the actual structure used by the receiver to maintain
+ * its list of items, so modifying the array will not affect the receiver.
+ * </p>
+ *
+ * @return the items
+ *
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ * disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ * thread that created the receiver</li>
+ * </ul>
+ */
+ public TreeItem[] getItems() {
+ checkWidget();
+ if (topLevelItemCount == 0)
+ return new TreeItem[0];
+ TreeItem[] result = new TreeItem[topLevelItemCount];
+ if ((style & SWT.VIRTUAL) != 0) {
+ for (int i = 0; i < topLevelItemCount; i++) {
+ result[i] = _getItem(i);
+ checkData(result[i], i);
+ }
+ } else {
+ System.arraycopy(topLevelItems, 0, result, 0, topLevelItemCount);
+ }
+ return result;
+ }
+
+ /**
+ * Returns the receiver's parent item, which must be a <code>TreeItem</code>
+ * or null when the receiver is a root.
+ *
+ * @return the receiver's parent item
+ *
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ * disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ * thread that created the receiver</li>
+ * </ul>
+ */
+ public TreeItem getParentItem() {
+ checkWidget();
+ return null;
+ }
+
+ Point getPreferredClientAreaSize_pp() {
+ Point size = OS.QWidget_sizeHint(topHandle);
+
+ if (topLevelItemCount > 0) {
+ size.y = topLevelItemCount * getItemHeight();
+ size.x = OS.QTreeView_columnWidth(topHandle, 0);
+ }
+
+ return size;
+ }
+
+ /**
+ * Returns an array of <code>TreeItem</code>s that are currently selected in
+ * the receiver. The order of the items is unspecified. An empty array
+ * indicates that no items are selected.
+ * <p>
+ * Note: This is not the actual structure used by the receiver to maintain
+ * its selection, so modifying the array will not affect the receiver.
+ * </p>
+ *
+ * @return an array representing the selection
+ *
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ * disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ * thread that created the receiver</li>
+ * </ul>
+ */
+ public TreeItem[] getSelection() {
+ checkWidget();
+ int[] selectionHandles = OS.QTreeWidget_selectedItems(topHandle);
+
+ TreeItem[] selectedItems = new TreeItem[selectionHandles.length];
+
+ for (int j = 0; j < selectionHandles.length; j++) {
+ for (int i = 0; i < topLevelItemCount; i++) {
+ if (topLevelItems[i].itemHandle == selectionHandles[j]) {
+ selectedItems[j] = topLevelItems[i];
+ break;
+ } else {
+ TreeItem item = topLevelItems[i].getItem(selectionHandles[j]);
+ if (item != null) {
+ selectedItems[j] = item;
+ break;
+ }
+ }
+ }
+ }
+ return selectedItems;
+ }
+
+ /**
+ * Returns the number of selected items contained in the receiver.
+ *
+ * @return the number of selected items
+ *
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ * disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ * thread that created the receiver</li>
+ * </ul>
+ */
+ public int getSelectionCount() {
+ checkWidget();
+ return OS.QTreeWidget_swt_selectionCount(topHandle);
+ }
+
+ /**
+ * Returns the item which is currently at the top of the receiver. This item
+ * can change when items are expanded, collapsed, scrolled or new items are
+ * added or removed.
+ *
+ * @return the item at the top of the receiver
+ *
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ * disposed</li>
+ * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
+ * thread that created the receiver</li>
+ * </ul>
+ *
+ * @since 2.1
+ */
+ public TreeItem getTopItem() {
+ return getItem(new Point(1, 1));
+ }
+
+ void hookEvents_pp() {
+ super.hookEvents_pp();
+
+ int selectionSignalProxy = OS.SignalHandler_new(topHandle,
+ OS.QSIGNAL_TREE_ITEMSELECTION_CHANGED);
+
+ OS.QObject_connectOrThrow(topHandle,
+ "itemSelectionChanged()", selectionSignalProxy,
+ "widgetSignal()", OS.QT_AUTOCONNECTION);
+
+ int itemActivatedSignalProxy = OS.SignalHandler_new(
+ topHandle, OS.QSIGNAL_TREE_ITEM_ACTIVATED);
+
+ OS.QObject_connectOrThrow(topHandle,
+ "itemActivated(QTreeWidgetItem*,int)",
+ itemActivatedSignalProxy, "widgetSignal(QTreeWidgetItem*,int)",
+ OS.QT_AUTOCONNECTION);
+
+ int itemExpandedSignalProxy = OS.SignalHandler_new(
+ topHandle, OS.QSIGNAL_TREE_ITEM_EXPANDED);
+
+ OS.QObject_connectOrThrow(topHandle,
+ "itemExpanded(QTreeWidgetItem*)", itemExpandedSignalProxy,
+ "widgetSignal(QTreeWidgetItem*)", OS.QT_AUTOCONNECTION);
+
+ int itemCollapsedSignalProxy = OS.SignalHandler_new(
+ topHandle, OS.QSIGNAL_TREE_ITEM_COLLAPSED);
+
+ OS.QObject_connectOrThrow(topHandle,
+ "itemCollapsed(QTreeWidgetItem*)", itemCollapsedSignalProxy,
+ "widgetSignal(QTreeWidgetItem*)", OS.QT_AUTOCONNECTION);
+ }
+
+ void increaseArraySize(){
+ if (topLevelItems == null) {
+ topLevelItems = new TreeItem[4];
+ }
+ if (topLevelItemCount + 1 == topLevelItems.length) {
+ int length = Math.max(4, topLevelItems.length * 3 / 2);
+ TreeItem[] newItems = new TreeItem[length];
+ System.arraycopy(topLevelItems, 0, newItems, 0,
+ topLevelItems.length);
+ topLevelItems = newItems;
+ }
+
+ if (topLevelItemsHandle == null) {
+ topLevelItemsHandle = new int[4];
+ }
+ if (topLevelItemCount + 1 == topLevelItemsHandle.length) {
+ int length = Math.max(4, topLevelItemsHandle.length * 3 / 2);
+ int[] handles = new int[length];
+ System.arraycopy(topLevelItemsHandle, 0, handles, 0,
+ topLevelItemsHandle.length);
+ topLevelItemsHandle = handles;
+ }
+ }
+
+ /**
+ * Gets the index of an item.
+ * <p>
+ * -1 is returned if the item has a parent or the item is not found in the tree.
+ *
+ * @param time
+ * the search item
+ * @return the index of the item in the tree
+ *
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the item is null</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ * disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ * called from the thread that created the receiver</li>
+ * </ul>
+ */
+ public int indexOf(TreeItem item){
+ checkWidget();
+ return getItemIndex(item);
+ }
+
+ boolean isTopLevelLastItemAndLastChildren() {
+ boolean traverse = false;
+ if (topLevelItemCount > 0) {
+ TreeItem item = null;
+ int currentItemHandle = OS.QTreeWidget_currentItem(topHandle);
+ if ((topLevelItems[topLevelItemCount - 1].itemHandle == currentItemHandle)
+ && ((topLevelItems[topLevelItemCount - 1].childrenItemCount == 0) ||
+ !topLevelItems[topLevelItemCount - 1]
+ .getExpanded())) {
+ return true;
+ } else if ((item = topLevelItems[topLevelItemCount - 1]
+ .getItem(currentItemHandle)) != null) {
+ if (item.isLastItemOfLastChild()
+ && (item.childrenItemCount == 0 || !item.getExpanded())) {
+ return true;
+ }
+ }
+ }
+ return traverse;
+ }
+
+ boolean qt_event_paint(int widgetHandle, int x, int y, int width,
+ int height, int regionHandle) {
+ if (widgetHandle == handle && ((style & SWT.VIRTUAL) != 0)
+ && topLevelItemCount > 0) {
+
+ int start = OS.QTreeWidget_swt_rowAt(topHandle,
+ (style & SWT.MIRRORED) != 0 ? OS.QWidget_rect(handle).width-x:x, y);
+
+ // If first item to draw is any one of the top level item
+ if (start != -1) {
+ int end = 0;
+ int itemHeight = getItemHeight();
+
+ if (expandedItemCount > 0) {
+ // number of top level items to draw. Here making partially visible items to fully drawn
+ end = start + (height % itemHeight == 0 ? height/itemHeight : height/itemHeight + 1) - 1;
+ } else {
+ // if none of the items are expanded and top level item are
+ // less than the number of items to to draw.
+ end = Math.min(topLevelItemCount - 1, start + (height % itemHeight == 0 ? height/itemHeight :
+ height/itemHeight + 1) - 1);
+ }
+
+ for (int i = start; i <= end; i++) {
+
+ TreeItem item = _getItem(i);
+ checkData(item, i);
+ // expanded child items to draw.
+ if (item.getExpanded()) {
+ int left = setAndGetRemainingItemsToPaint(item, end - i);
+ end = i + left;
+ }
+ // Total number of visible items in the tree is less than the
+ // items can draw even though after expanding some of the items
+ if (i == topLevelItemCount - 1)
+ break;
+ }
+
+ } else if (start == -1) {
+
+ // first Item to draw is not top level item
+ int firstItemHandle = OS.QTreeWidget_itemAt(topHandle,
+ (style & SWT.MIRRORED) != 0 ? OS.QWidget_rect(handle).width-x:x, y);
+ int lastItemHandle = OS.QTreeWidget_itemAt(topHandle,
+ (style & SWT.MIRRORED) != 0 ? OS.QWidget_rect(handle).width-x:x,
+ y + height);
+
+ if(!(lastItemHandle==0 && firstItemHandle == 0)){
+ int parentItemHandle = 0;
+ // if the last item is partially visible or items are not enough to fill,
+ // then lastItemHandle is 0.
+ if(lastItemHandle==0){
+ parentItemHandle = OS.QTreeWidgetItem_swt_isSameParent(
+ firstItemHandle, firstItemHandle);
+ } else {
+ // if the first and last item has same parent, then
+ // returns some parentItemHandle otherwise returns -1
+ parentItemHandle = OS.QTreeWidgetItem_swt_isSameParent(
+ firstItemHandle, lastItemHandle);
+ }
+
+ // First item and last item to draw has same parent or
+ // items are not full or lastItem is partially visible
+ if (parentItemHandle != -1) {
+ int begin = OS.QTreeWidgetItem_indexOfChild(
+ parentItemHandle, firstItemHandle);
+ int last = 0;
+
+ if(lastItemHandle == 0){
+ last = OS.QTreeWidget_swt_parentChildCount( firstItemHandle )-1;
+ } else {
+ last = OS.QTreeWidgetItem_indexOfChild(
+ parentItemHandle, lastItemHandle);
+ }
+
+ TreeItem parentItem = findParentItem(parentItemHandle);
+ int itemHeight = getItemHeight();
+ int numItemsToFit = (height % itemHeight == 0 ? height/itemHeight :
+ height/itemHeight + 1);
+
+ // First item and last item to draw has same parent
+ // inner level drawing of children
+ for (int a = begin; a <= last; a++) {
+ TreeItem item = parentItem._getItem(a);
+ checkData(item, a);
+ numItemsToFit = numItemsToFit - 1;
+ numItemsToFit = setAndGetRemainingItemsToPaint(item, numItemsToFit);
+ }
+
+ // This is fix to suddenly scrolling, firstItem to draw is some inner level item and
+ // last item to draw is root item or nothing (no enough item to fit)
+ TreeItem rootItem = null;
+ while (parentItem != null && numItemsToFit>0) {
+ rootItem = parentItem;
+ parentItem = rootItem.getParentItem();
+
+ if(parentItem != null){
+ int index = OS.QTreeWidgetItem_indexOfChild(parentItem.internal_itemHandle(),
+ rootItem.internal_itemHandle());
+ int endIndex = parentItem.childrenItemCount - (index+1) > numItemsToFit ? numItemsToFit:
+ parentItem.childrenItemCount-1;
+
+ for (int a = index+1; a <= endIndex; a++) {
+ TreeItem item = parentItem._getItem(a);
+ checkData(item, a);
+ numItemsToFit = numItemsToFit - 1;
+ numItemsToFit = setAndGetRemainingItemsToPaint(item, numItemsToFit);
+ if(numItemsToFit <= 0)
+ break;
+ }
+ } else{
+ int index = OS.QTreeWidget_indexOfTopLevelItem(topHandle,
+ rootItem.internal_itemHandle());
+ int endIndex = topLevelItemCount - (index+1) > numItemsToFit ? numItemsToFit:
+ topLevelItemCount-1;
+ for (int a = index+1; a <= endIndex; a++) {
+ TreeItem item = _getItem(a);
+ checkData(item, a);
+ numItemsToFit = numItemsToFit - 1;
+ numItemsToFit = setAndGetRemainingItemsToPaint(item, numItemsToFit);
+ if(numItemsToFit <= 0)
+ break;
+ }
+ }
+ }
+ } else {
+
+ // First item and last item to draw has different parent
+ TreeItem firstItem = findParentItem(firstItemHandle);
+ TreeItem parentItem = firstItem.getParentItem();
+
+ int begin = OS.QTreeWidgetItem_indexOfChild(parentItem
+ .internal_itemHandle(), firstItemHandle);
+
+ TreeItem lastItem = findParentItem(lastItemHandle);
+ TreeItem itemFind = null;
+
+ //search for last item in the child of first item (under the first item),
+ // child of first item siblings and siblings. And paint if some children
+ // are expanded.(lower level search)
+ for (int i = begin; i < parentItem.childrenItemCount; i++) {
+ itemFind = parentItem._getItem(i);
+ checkData(itemFind, i);
+ if (itemFind == lastItem)
+ break;
+
+ if(itemFind.getExpanded())
+ itemFind = upperItemPaintAndSearch(itemFind, lastItem, -1);
+ if (itemFind == lastItem)
+ break;
+ }
+
+ // if last item to paint is not child of first item or child of siblings or
+ // siblings. do the following( upper level search )
+ if (itemFind != lastItem) {
+ TreeItem rootItem = null;
+ // search for last item to paint until next topLevel item
+ while (parentItem != null) {
+ rootItem = parentItem;
+ parentItem = parentItem.getParentItem();
+
+ if(parentItem != null){
+ // current Parent is already searched and painted in the
+ // above for loop. so pass that parent index so that
+ // next search will start from next parent item
+ int currParentIndex = OS.QTreeWidgetItem_indexOfChild(parentItem
+ .internal_itemHandle(), rootItem.internal_itemHandle());
+
+ itemFind = upperItemPaintAndSearch(parentItem, lastItem, currParentIndex);
+ }
+ if (itemFind == lastItem)
+ break;
+ }
+
+ // search last item to paint in all remaining top level items and
+ // their children.( last one to search)
+ if (itemFind != lastItem) {
+ int index = OS.QTreeWidget_indexOfTopLevelItem(
+ topHandle, rootItem
+ .internal_itemHandle());
+ // we need to search the next parent
+ for (int i = index+1; i < topLevelItemCount; i++) {
+ TreeItem topItem = _getItem(i);
+ checkData(topItem, i);
+ if (topItem == lastItem)
+ break;
+ if(topItem.getExpanded())
+ itemFind = upperItemPaintAndSearch(topItem, lastItem,-1);
+ if (itemFind == lastItem)
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return super.qt_event_paint(widgetHandle, x, y, width, height,
+ regionHandle);
+ }
+
+ void qt_signal_tree_itemActivated(int selectionHandle, int column) {
+ if (!ignoreSelectionEvent) {
+ sendEvent(SWT.DefaultSelection);
+ }
+ }
+
+ void qt_signal_tree_itemCollapsed(int selectionHandle) {
+ --expandedItemCount;
+ if (!ignoreExpandEvent) {
+ sendEvent(SWT.Collapse);
+ }
+ }
+
+ void qt_signal_tree_itemExpanded(int selectionHandle) {
+ ++expandedItemCount;
+ if (!ignoreExpandEvent) {
+ sendEvent(SWT.Expand);
+ }
+ updateColumnWidth();
+ }
+
+ void qt_signal_tree_itemSelectionChanged() {
+ if (!ignoreSelectionEvent) {
+ sendEvent(SWT.Selection);
+ }
+ }
+
+ void releaseChildren_pp(boolean destroy) {
+ if (topLevelItems != null) {
+ for (int i = topLevelItemCount-1; i >= 0; i--) {
+ TreeItem item = _getItem(i);
+ if(item.cached){
+ if (item != null && !item.isDisposed() ) {
+ item.childrenItemCount = 0;
+ item.childrenItems = null;
+ item.childrenItemsHandle = null;
+ item.itemHandle = 0;
+ item.parentItem = null;
+ item.tree = null;
+ item.cached = false;
+ item.release(destroy);
+ }
+ }
+ }
+ }
+ OS.QTreeWidget_clear(topHandle);
+ super.releaseChildren_pp(destroy);
+ }
+
+ void releaseHandle_pp(){
+ expandedItemCount = 0;
+ topLevelItems = null;
+ topLevelItemCount = 0;
+ topLevelItemsHandle = null;
+ super.releaseHandle_pp();
+ }
+
+ void remove(int start, int end) {
+ checkWidget();
+ if (start > end)
+ return;
+ if (!(0 <= start && start <= end && end < topLevelItemCount)) {
+ error(SWT.ERROR_INVALID_RANGE);
+ }
+
+ int index = end;
+ while (index >= start) {
+ TreeItem item = _getItem(index);
+ if (item != null && !item.isDisposed()) {
+ item.release(false);
+ }
+ index--;
+ }
+ }
+
+ /**
+ * Removes all of the items from the receiver.
+ * <p>
+ *
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ * disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ * called from the thread that created the receiver</li>
+ * </ul>
+ */
+ public void removeAll() {
+ checkWidget();
+ OS.QTreeWidget_clear(topHandle);
+ expandedItemCount = 0;
+ topLevelItems = null;
+ topLevelItemCount = 0;
+ topLevelItemsHandle = null;
+ }
+
+ /**
+ * Removes the listener from the collection of listeners who will be
+ * notified when the receiver's selection changes.
+ *
+ * @param listener
+ * the listener which should no longer be notified
+ *
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ * disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ * called from the thread that created the receiver</li>
+ * </ul>
+ *
+ * @see SelectionListener
+ * @see #addSelectionListener
+ */
+ public void removeSelectionListener(SelectionListener listener) {
+ checkWidget();
+ if (listener == null)
+ error(SWT.ERROR_NULL_ARGUMENT);
+ eventTable.unhook(SWT.Selection, listener);
+ eventTable.unhook(SWT.DefaultSelection, listener);
+ }
+
+ /**
+ * Removes the listener from the collection of listeners who will be
+ * notified when items in the receiver are expanded or collapsed..
+ *
+ * @param listener
+ * the listener which should no longer be notified
+ *
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the listener is null</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ * disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ * called from the thread that created the receiver</li>
+ * </ul>
+ *
+ * @see TreeListener
+ * @see #addTreeListener
+ */
+ public void removeTreeListener(TreeListener listener) {
+ checkWidget();
+ if (listener == null)
+ error(SWT.ERROR_NULL_ARGUMENT);
+ if (eventTable == null)
+ return;
+ eventTable.unhook(SWT.Expand, listener);
+ eventTable.unhook(SWT.Collapse, listener);
+ }
+
+ /**
+ * Selects all of the items in the receiver.
+ * <p>
+ * If the receiver is single-select, do nothing.
+ *
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ * disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ * called from the thread that created the receiver</li>
+ * </ul>
+ */
+ public void selectAll() {
+ checkWidget();
+ if ((style & SWT.SINGLE) != 0)
+ return;
+
+ ignoreSelectionEvent = true;
+ OS.QTreeView_selectAll(topHandle);
+ ignoreSelectionEvent = false;
+ }
+
+ /*
+ * Its a recursive function executed only in virtual tree style.
+ * It takes tree item and number of items can paint as a parameters.
+ * It do two things, if the given tree item has more number of
+ * expanded items under it, it paints only given parameter number
+ * of first available items and return 0. If it has less number
+ * of expanded tree items under it, it paints only available
+ * tree items and return remaining count.
+ */
+ int setAndGetRemainingItemsToPaint(TreeItem item, int num) {
+ int left = num;
+
+ if (item.getExpanded()) {
+ int count = Math.min(num, item.childrenItemCount);
+ for (int a = 0; a < count; a++) {
+ if (left > 0) {
+ TreeItem childItem = item._getItem(a);
+ checkData(childItem, a);
+ left = left - 1;
+
+ if (childItem.getExpanded()) {
+ left = setAndGetRemainingItemsToPaint(childItem, left);
+ }
+ }
+ }
+ }
+
+ return left;
+ }
+
+ /**
+ * Sets the number of items contained in the receiver.
+ *
+ * @param count
+ * the number of items
+ *
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ * disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ * called from the thread that created the receiver</li>
+ * </ul>
+ *
+ * @since 3.0
+ */
+ public void setItemCount(int count) {
+ checkWidget();
+ count = Math.max(0, count);
+ if (count == topLevelItemCount)
+ return;
+ boolean isVirtual = (style & SWT.VIRTUAL) != 0;
+ if (!isVirtual)
+ setRedraw(false);
+ int oldItemCount = topLevelItemCount;
+ remove(count, topLevelItemCount - 1);
+ int length = Math.max(4, (count + 3) / 4 * 4);
+ TreeItem[] newItems = new TreeItem[length];
+ if (topLevelItems == null) {
+ topLevelItems = new TreeItem[count];
+ }
+ System.arraycopy(topLevelItems, 0, newItems, 0, topLevelItemCount);
+ topLevelItems = newItems;
+ if (isVirtual) {
+ if (oldItemCount < count) {
+ int[] handles = OS.QTreeWidget_addTopLevelItems(
+ topHandle, count - topLevelItemCount);
+ int[] temp = new int[count];
+ if (topLevelItemsHandle == null) {
+ topLevelItemsHandle = new int[count];
+ }
+ System.arraycopy(topLevelItemsHandle, 0, temp, 0,
+ topLevelItemCount);
+ System.arraycopy(handles, 0, temp, topLevelItemCount,
+ handles.length);
+ topLevelItemsHandle = temp;
+ }
+ topLevelItemCount = count;
+ } else {
+ for (int i = topLevelItemCount; i < count; i++) {
+ new TreeItem(this, SWT.NONE, i);
+ }
+ }
+ if (!isVirtual)
+ setRedraw(true);
+ }
+
+ /**
+ * Sets the receiver's selection to be the given array of items. The current
+ * selection is cleared before the new items are selected.
+ * <p>
+ * Items that are not in the receiver are ignored. If the receiver is
+ * single-select and multiple items are specified, then all items are
+ * ignored.
+ *
+ * @param items
+ * the array of items
+ *
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the array of items is null
+ * </li> <li>ERROR_INVALID_ARGUMENT - if one of the items has
+ * been disposed</li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ * disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ * called from the thread that created the receiver</li>
+ * </ul>
+ *
+ * @see Tree#deselectAll()
+ */
+ public void setSelection(TreeItem[] items) {
+ checkWidget();
+ if (items == null)
+ error(SWT.ERROR_NULL_ARGUMENT);
+ ignoreSelectionEvent = true;
+ OS.QAbstractItemView_clearSelection(topHandle);
+ if (items.length == 0
+ || (((style & SWT.SINGLE) != 0) && items.length > 1)) {
+ return;
+ }
+
+ TreeItem[] selectedItems = new TreeItem[items.length];
+ int validItemCount = 0;
+
+ // Remove invalid items
+ for (int i = 0; i < items.length; i++) {
+ if (items[i] != null && !(items[i].isDisposed())) {
+ if (items[i].getParent() == this) {
+ boolean found = false;
+ // Remove duplicates
+ for (int j = 0; j < validItemCount; j++) {
+ if (selectedItems[j].equals(items[i])) {
+ found = true;
+ break;
+ }
+ }
+
+ if (!found) {
+ selectedItems[validItemCount] = items[i];
+ validItemCount++;
+ }
+ }
+ }
+ }
+
+ // Resize the array if there were some invalid items
+ if (validItemCount < selectedItems.length) {
+ TreeItem[] temp = new TreeItem[validItemCount];
+ System.arraycopy(selectedItems, 0, temp, 0, validItemCount);
+ selectedItems = temp;
+ }
+
+ for (int i = 0; i < selectedItems.length; i++) {
+ if((style & SWT.VIRTUAL) != 0) {
+ if(selectedItems[i].cached){
+ OS.QTreeWidget_setCurrentItem(topHandle,
+ selectedItems[i].internal_itemHandle());
+ }
+ selectedItems[i].selection=true;
+ } else {
+ OS.QTreeWidget_setCurrentItem(topHandle,
+ selectedItems[i].internal_itemHandle());
+ }
+
+ }
+ ignoreSelectionEvent = false;
+ }
+
+ /**
+ * Sets the item which is currently at the top of the receiver. This item
+ * can change when items are expanded, collapsed, scrolled or new items are
+ * added or removed.
+ *
+ * @param item
+ * the item to be shown
+ *
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the item is null</li> <li>
+ * ERROR_INVALID_ARGUMENT - if the item has been disposed
+ * </li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ * disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ * called from the thread that created the receiver</li>
+ * </ul>
+ *
+ * @see Tree#getTopItem()
+ *
+ * @since 2.1
+ */
+ public void setTopItem(TreeItem item) {
+ checkWidget();
+ _showItem(item, OS.QT_ABSTRACTITEMVIEW_SCROLLHINT_POSITIONATTOP);
+ }
+
+ void setTraversalFlags_pp(int type, int key, int modifier,
+ int character) {
+ traverseDoit = false;
+ traverseCancel = false;
+ if (type == SWT.TRAVERSE_RETURN) {
+ // Selecting TreeItems is done with enter
+ return;
+ }
+
+ switch (key) {
+ case OS.QT_KEY_LEFT:
+ case OS.QT_KEY_RIGHT:
+ traverseDoit = false;
+ break;
+ case OS.QT_KEY_UP:
+ // TopLevel first item
+ if (topLevelItems[0].itemHandle == OS
+ .QTreeWidget_currentItem(topHandle)) {
+ traverseDoit = true;
+ }
+ break;
+ case OS.QT_KEY_DOWN:
+ if (isTopLevelLastItemAndLastChildren()) {
+ traverseDoit = true;
+ }
+ break;
+ default:
+ super.setTraversalFlags_pp(type, key, modifier, character);
+ break;
+ }
+ }
+
+ /**
+ * Shows the item. If the item is already showing in the receiver, this
+ * method simply returns. Otherwise, the items are scrolled and expanded
+ * until the item is visible.
+ *
+ * @param item
+ * the item to be shown
+ *
+ * @exception IllegalArgumentException
+ * <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the item is null</li> <li>
+ * ERROR_INVALID_ARGUMENT - if the item has been disposed
+ * </li>
+ * </ul>
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ * disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ * called from the thread that created the receiver</li>
+ * </ul>
+ *
+ * @see Tree#showSelection()
+ */
+ public void showItem(TreeItem item) {
+ checkWidget();
+ _showItem(item, OS.QT_ABSTRACTITEMVIEW_SCROLLHINT_ENSUREVISIBLE);
+ }
+
+ /**
+ * Shows the selection. If the selection is already showing in the receiver,
+ * this method simply returns. Otherwise, the items are scrolled until the
+ * selection is visible.
+ *
+ * @exception SWTException
+ * <ul>
+ * <li>ERROR_WIDGET_DISPOSED - if the receiver has been
+ * disposed</li> <li>ERROR_THREAD_INVALID_ACCESS - if not
+ * called from the thread that created the receiver</li>
+ * </ul>
+ *
+ * @see Tree#showItem(TreeItem)
+ */
+ public void showSelection() {
+ // Shows first visible selected item in the Tree.
+ checkWidget();
+ TreeItem[] selection = getSelection();
+ if (selection.length == 0)
+ return;
+ _showItem(selection[0], OS.QT_ABSTRACTITEMVIEW_SCROLLHINT_ENSUREVISIBLE);
+ }
+
+ void updateColumnWidth(){
+ if (isDisposed()) return;
+ OS.QTreeWidget_swt_setHeaderStretch(topHandle, false);
+ OS.QTreeView_resizeColumnToContents(topHandle, 0);
+ }
+
+ /*
+ * Its a recursive function executed only in virtual tree style.
+ * It takes two tree items and one int as a parameter, first item to
+ * find expanded children under it and second tree item is that
+ * we need to compare. This function try to search expanded items
+ * under first parameter item and paint until it is equal to
+ * second parameter item. if it doesn't find second parameter item
+ * then it paints all expanded items under first parameter item and
+ * returns last painted child item. int parameter is from where to
+ * start the search
+ */
+ TreeItem upperItemPaintAndSearch(TreeItem item, TreeItem itemToFind, int index) {
+ TreeItem childItem = null;
+ if (item != null) {
+ if (item.getExpanded()) {
+ for (int i = index+1; i < item.childrenItemCount; i++) {
+ childItem = item._getItem(i);
+ checkData(childItem, i);
+ if (childItem == itemToFind) {
+ break;
+ }
+ if (childItem.getExpanded()) {
+ childItem = upperItemPaintAndSearch(childItem, itemToFind,-1);
+ }
+ if (childItem == itemToFind) {
+ break;
+ }
+ }
+ }
+ }
+ return childItem;
+ }
+
+}