javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swttree.cpp
branchRCL_3
changeset 21 4376525cdefb
parent 19 71c436fe3ce0
child 24 6c158198356e
--- a/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swttree.cpp	Wed Jun 09 09:34:07 2010 +0300
+++ b/javauis/eswt_akn/org.eclipse.ercp.swt.s60/native/src/swttree.cpp	Mon Jun 21 15:32:50 2010 +0300
@@ -45,6 +45,9 @@
                    MSwtComposite& aParent, TInt aStyle, TBool aVisibility, TBool aDimmed)
         : CSwtComposite(aDisplay, aPeer, &aParent, aStyle, aVisibility, aDimmed)
         , iItemHeightValid(EFalse)
+        , iPointerRevertExpandNeeded(EFalse)
+        , iPointerRevertCollapseNeeded(EFalse)
+        , iRevertedItem(KAknTreeIIDNone)
 {
 }
 
@@ -410,6 +413,20 @@
     iLastFocusedItem = iTree->FocusedItem();
     CSwtComposite::HandlePointerEventL(aPointerEvent);
 
+    // Expanding node as part of pointer event reverting
+    if (iPointerRevertExpandNeeded)
+    {
+        iTree->ExpandNode(iRevertedItem, ETrue);
+        iPointerRevertExpandNeeded = EFalse;
+    }
+
+    // Collapsing node as part of pointer event reverting
+    if (iPointerRevertCollapseNeeded)
+    {
+        iTree->CollapseNode(iRevertedItem, ETrue);
+        iPointerRevertCollapseNeeded = EFalse;
+    }
+
 #ifdef RD_JAVA_ADVANCED_TACTILE_FEEDBACK
     if (feedback)
     {
@@ -813,36 +830,64 @@
     {
     case MAknTreeListObserver::ENodeExpanded:
     {
-        TInt count = iTree->ChildCount(aItem);
-        if (count > 0)
+        /*
+         * Pointer reverting has to be done after HandlePointerEvent. So here
+         * just setting attributes and actual reverting is done in
+         * CSwtTree::HandlePointerEventL
+         * In case of reverting event, Java will not get any notifications.
+         */
+        if (iDisplay.RevertPointerEvent() && !iPointerRevertExpandNeeded)
         {
-            TRAP_IGNORE(iDisplay.PostTreeEventL(iPeer, ESwtEventExpand, aItem));
-        }
-        if (IsMarkable())
-        {
-            if (count == 0)
-            {
-                iTree->SetMarked(aItem, ETrue, ETrue);
-            }
+            iPointerRevertCollapseNeeded = ETrue;
+            iRevertedItem = aItem;
         }
         else
         {
-            TRAP_IGNORE(iDisplay.PostTreeEventL(iPeer, ESwtEventDefaultSelection, aItem));
+            TInt count = iTree->ChildCount(aItem);
+            if (count > 0)
+            {
+                TRAP_IGNORE(iDisplay.PostTreeEventL(iPeer, ESwtEventExpand, aItem));
+            }
+            if (IsMarkable())
+            {
+                if (count == 0)
+                {
+                    iTree->SetMarked(aItem, ETrue, ETrue);
+                }
+            }
+            else
+            {
+                TRAP_IGNORE(iDisplay.PostTreeEventL(iPeer, ESwtEventDefaultSelection, aItem));
+            }
         }
         break;
     }
     case MAknTreeListObserver::ENodeCollapsed:
     {
-        TInt count = iTree->ChildCount(aItem);
-        if (count > 0)
+        /*
+         * Pointer reverting has to be done after HandlePointerEvent. So here
+         * just setting attributes and actual reverting is done in
+         * CSwtTree::HandlePointerEventL
+         * In case of reverting event, Java will not get any notifications.
+         */
+        if (iDisplay.RevertPointerEvent() && !iPointerRevertCollapseNeeded)
         {
-            TRAP_IGNORE(iDisplay.PostTreeEventL(iPeer, ESwtEventCollapse, aItem));
+            iPointerRevertExpandNeeded = ETrue;
+            iRevertedItem = aItem;
         }
-        if (IsMarkable())
+        else
         {
-            if (count == 0)
+            TInt count = iTree->ChildCount(aItem);
+            if (count > 0)
             {
-                iTree->SetMarked(aItem, EFalse, ETrue);
+                TRAP_IGNORE(iDisplay.PostTreeEventL(iPeer, ESwtEventCollapse, aItem));
+            }
+            if (IsMarkable())
+            {
+                if (count == 0)
+                {
+                    iTree->SetMarked(aItem, EFalse, ETrue);
+                }
             }
         }
         break;