]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/treectrl.cpp
No real changes, just use ProgID term instead of incorrect CLSID.
[wxWidgets.git] / src / msw / treectrl.cpp
index 58daae2cf1c7df3a57d1d05b1589074b986ce8a4..6cb53d2876c6c74ba1eecafaf90f1b04b934c62c 100644 (file)
@@ -1966,23 +1966,25 @@ void wxTreeCtrl::SelectItem(const wxTreeItemId& item, bool select)
             // leave itemNew invalid
         }
 
-        // in spite of the docs (MSDN Jan 99 edition), we don't seem to receive
-        // the notification from the control (i.e. TVN_SELCHANG{ED|ING}), so
-        // send them ourselves
-
+        // Recent versions of comctl32.dll send TVN_SELCHANG{ED,ING} events
+        // when we call TreeView_SelectItem() but apparently some old ones did
+        // not so send the events ourselves and ignore those generated by
+        // TreeView_SelectItem() if m_changingSelection is set.
         wxTreeEvent
             changingEvent(wxEVT_COMMAND_TREE_SEL_CHANGING, this, itemNew);
         changingEvent.SetOldItem(itemOld);
 
         if ( IsTreeEventAllowed(changingEvent) )
         {
+            TempSetter set(m_changingSelection);
+
             if ( !TreeView_SelectItem(GetHwnd(), HITEM(itemNew)) )
             {
                 wxLogLastError(wxT("TreeView_SelectItem"));
             }
             else // ok
             {
-                SetFocusedItem(item);
+                ::SetFocus(GetHwnd(), HITEM(item));
 
                 wxTreeEvent changedEvent(wxEVT_COMMAND_TREE_SEL_CHANGED,
                                          this, itemNew);
@@ -2655,18 +2657,7 @@ bool wxTreeCtrl::MSWHandleSelectionKey(unsigned vkey)
 bool wxTreeCtrl::MSWHandleTreeKeyDownEvent(WXWPARAM wParam, WXLPARAM lParam)
 {
     wxTreeEvent keyEvent(wxEVT_COMMAND_TREE_KEY_DOWN, this);
-
-    int keyCode = wxCharCodeMSWToWX(wParam);
-
-    if ( !keyCode )
-    {
-        // wxCharCodeMSWToWX() returns 0 to indicate that this is a
-        // simple ASCII key
-        keyCode = wParam;
-    }
-
-    keyEvent.m_evtKey = CreateKeyEvent(wxEVT_KEY_DOWN, keyCode,
-                                       lParam, wParam);
+    keyEvent.m_evtKey = CreateKeyEvent(wxEVT_KEY_DOWN, wParam, lParam);
 
     bool processed = HandleTreeEvent(keyEvent);
 
@@ -2738,13 +2729,16 @@ wxTreeCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
         }
 
         // create the event
-        wxTreeEvent event(wxEVT_COMMAND_TREE_ITEM_MENU, this, item);
+        if ( item.IsOk() )
+        {
+            wxTreeEvent event(wxEVT_COMMAND_TREE_ITEM_MENU, this, item);
 
-        event.m_pointDrag = pt;
+            event.m_pointDrag = pt;
 
-        if ( HandleTreeEvent(event) )
-            processed = true;
-        //else: continue with generating wxEVT_CONTEXT_MENU in base class code
+            if ( HandleTreeEvent(event) )
+                processed = true;
+            //else: continue with generating wxEVT_CONTEXT_MENU in base class code
+        }
     }
     else if ( (nMsg >= WM_MOUSEFIRST) && (nMsg <= WM_MOUSELAST) )
     {
@@ -3480,7 +3474,7 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
         //     we have to handle both messages:
         case TVN_SELCHANGEDA:
         case TVN_SELCHANGEDW:
-            if ( !HasFlag(wxTR_MULTIPLE) || !m_changingSelection )
+            if ( !m_changingSelection )
             {
                 eventType = wxEVT_COMMAND_TREE_SEL_CHANGED;
             }
@@ -3488,7 +3482,7 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
 
         case TVN_SELCHANGINGA:
         case TVN_SELCHANGINGW:
-            if ( !HasFlag(wxTR_MULTIPLE) || !m_changingSelection )
+            if ( !m_changingSelection )
             {
                 if ( eventType == wxEVT_NULL )
                     eventType = wxEVT_COMMAND_TREE_SEL_CHANGING;
@@ -3520,7 +3514,8 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
             //
             // to avoid such surprises, we force the generation of focus events
             // now, before we generate the selection change ones
-            SetFocus();
+            if ( !m_changingSelection )
+                SetFocus();
             break;
 
         // instead of explicitly checking for _WIN32_IE, check if the