]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/treectrl.cpp
No changes, just minor cleanup.
[wxWidgets.git] / src / msw / treectrl.cpp
index c33fade6f84c0c4a0a046bed9b9258493a4c9f12..b408ac740d961ef193b216d71d656e56ac3ea6fe 100644 (file)
@@ -431,7 +431,7 @@ public:
                     break;
 
                 default:
                     break;
 
                 default:
-                    wxFAIL_MSG( _T("unsupported wxTreeItemIcon value") );
+                    wxFAIL_MSG( wxT("unsupported wxTreeItemIcon value") );
             }
         }
 
             }
         }
 
@@ -750,6 +750,7 @@ void wxTreeCtrl::Init()
     m_focusLost = true;
     m_changingSelection = false;
     m_triggerStateImageClick = false;
     m_focusLost = true;
     m_changingSelection = false;
     m_triggerStateImageClick = false;
+    m_mouseUpDeselect = false;
 
     // initialize the global array of events now as it can't be done statically
     // with the wxEVT_XXX values being allocated during run-time only
 
     // initialize the global array of events now as it can't be done statically
     // with the wxEVT_XXX values being allocated during run-time only
@@ -866,7 +867,7 @@ wxTreeCtrl::GetClassDefaultAttributes(wxWindowVariant variant)
 bool wxTreeCtrl::DoGetItem(wxTreeViewItem *tvItem) const
 {
     wxCHECK_MSG( tvItem->hItem != TVI_ROOT, false,
 bool wxTreeCtrl::DoGetItem(wxTreeViewItem *tvItem) const
 {
     wxCHECK_MSG( tvItem->hItem != TVI_ROOT, false,
-                 _T("can't retrieve virtual root item") );
+                 wxT("can't retrieve virtual root item") );
 
     if ( !TreeView_GetItem(GetHwnd(), tvItem) )
     {
 
     if ( !TreeView_GetItem(GetHwnd(), tvItem) )
     {
@@ -1354,6 +1355,11 @@ wxTreeItemId wxTreeCtrl::GetSelection() const
     wxCHECK_MSG( !HasFlag(wxTR_MULTIPLE), wxTreeItemId(),
                  wxT("this only works with single selection controls") );
 
     wxCHECK_MSG( !HasFlag(wxTR_MULTIPLE), wxTreeItemId(),
                  wxT("this only works with single selection controls") );
 
+    return GetFocusedItem();
+}
+
+wxTreeItemId wxTreeCtrl::GetFocusedItem() const
+{
     return wxTreeItemId(TreeView_GetSelection(GetHwnd()));
 }
 
     return wxTreeItemId(TreeView_GetSelection(GetHwnd()));
 }
 
@@ -1498,7 +1504,7 @@ wxTreeItemId wxTreeCtrl::DoInsertAfter(const wxTreeItemId& parent,
 {
     wxCHECK_MSG( parent.IsOk() || !TreeView_GetRoot(GetHwnd()),
                  wxTreeItemId(),
 {
     wxCHECK_MSG( parent.IsOk() || !TreeView_GetRoot(GetHwnd()),
                  wxTreeItemId(),
-                 _T("can't have more than one root in the tree") );
+                 wxT("can't have more than one root in the tree") );
 
     TV_INSERTSTRUCT tvIns;
     tvIns.hParent = HITEM(parent);
 
     TV_INSERTSTRUCT tvIns;
     tvIns.hParent = HITEM(parent);
@@ -1579,7 +1585,7 @@ wxTreeItemId wxTreeCtrl::AddRoot(const wxString& text,
 {
     if ( HasFlag(wxTR_HIDE_ROOT) )
     {
 {
     if ( HasFlag(wxTR_HIDE_ROOT) )
     {
-        wxASSERT_MSG( !m_pVirtualRoot, _T("tree can have only a single root") );
+        wxASSERT_MSG( !m_pVirtualRoot, wxT("tree can have only a single root") );
 
         // create a virtual root item, the parent for all the others
         wxTreeItemParam *param = new wxTreeItemParam;
 
         // create a virtual root item, the parent for all the others
         wxTreeItemParam *param = new wxTreeItemParam;
@@ -1620,7 +1626,7 @@ wxTreeItemId wxTreeCtrl::DoInsertItem(const wxTreeItemId& parent,
 
         // assert, not check: if the index is invalid, we will append the item
         // to the end
 
         // assert, not check: if the index is invalid, we will append the item
         // to the end
-        wxASSERT_MSG( index == 0, _T("bad index in wxTreeCtrl::InsertItem") );
+        wxASSERT_MSG( index == 0, wxT("bad index in wxTreeCtrl::InsertItem") );
     }
 
     return DoInsertAfter(parent, idPrev, text, image, selectedImage, data);
     }
 
     return DoInsertAfter(parent, idPrev, text, image, selectedImage, data);
@@ -1876,10 +1882,11 @@ void wxTreeCtrl::DoSelectItem(const wxTreeItemId& item, bool select)
 
 void wxTreeCtrl::SelectItem(const wxTreeItemId& item, bool select)
 {
 
 void wxTreeCtrl::SelectItem(const wxTreeItemId& item, bool select)
 {
-    wxCHECK_RET( !IsHiddenRoot(item), _T("can't select hidden root item") );
+    wxCHECK_RET( !IsHiddenRoot(item), wxT("can't select hidden root item") );
 
 
-    if ( IsSelected(item) == select )
+    if ( select == IsSelected(item) )
     {
     {
+        // nothing to do, the item is already in the requested state
         return;
     }
 
         return;
     }
 
@@ -1902,20 +1909,31 @@ void wxTreeCtrl::SelectItem(const wxTreeItemId& item, bool select)
             (void)HandleTreeEvent(changedEvent);
         }
     }
             (void)HandleTreeEvent(changedEvent);
         }
     }
-    else
+    else // single selection
     {
     {
-        wxASSERT_MSG( select,
-                      _T("SelectItem(false) works only for multiselect") );
+        wxTreeItemId itemOld, itemNew;
+        if ( select )
+        {
+            itemOld = GetSelection();
+            itemNew = item;
+        }
+        else // deselecting the currently selected item
+        {
+            itemOld = item;
+            // 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
 
 
         // 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
 
-        wxTreeEvent changingEvent(wxEVT_COMMAND_TREE_SEL_CHANGING, this, item);
+        wxTreeEvent
+            changingEvent(wxEVT_COMMAND_TREE_SEL_CHANGING, this, itemNew);
+        changingEvent.SetOldItem(itemOld);
 
         if ( IsTreeEventAllowed(changingEvent) )
         {
 
         if ( IsTreeEventAllowed(changingEvent) )
         {
-            if ( !TreeView_SelectItem(GetHwnd(), HITEM(item)) )
+            if ( !TreeView_SelectItem(GetHwnd(), HITEM(itemNew)) )
             {
                 wxLogLastError(wxT("TreeView_SelectItem"));
             }
             {
                 wxLogLastError(wxT("TreeView_SelectItem"));
             }
@@ -1924,7 +1942,8 @@ void wxTreeCtrl::SelectItem(const wxTreeItemId& item, bool select)
                 SetFocusedItem(item);
 
                 wxTreeEvent changedEvent(wxEVT_COMMAND_TREE_SEL_CHANGED,
                 SetFocusedItem(item);
 
                 wxTreeEvent changedEvent(wxEVT_COMMAND_TREE_SEL_CHANGED,
-                                         this, item);
+                                         this, itemNew);
+                changedEvent.SetOldItem(itemOld);
                 (void)HandleTreeEvent(changedEvent);
             }
         }
                 (void)HandleTreeEvent(changedEvent);
             }
         }
@@ -1934,7 +1953,7 @@ void wxTreeCtrl::SelectItem(const wxTreeItemId& item, bool select)
 
 void wxTreeCtrl::EnsureVisible(const wxTreeItemId& item)
 {
 
 void wxTreeCtrl::EnsureVisible(const wxTreeItemId& item)
 {
-    wxCHECK_RET( !IsHiddenRoot(item), _T("can't show hidden root item") );
+    wxCHECK_RET( !IsHiddenRoot(item), wxT("can't show hidden root item") );
 
     // no error return
     TreeView_EnsureVisible(GetHwnd(), HITEM(item));
 
     // no error return
     TreeView_EnsureVisible(GetHwnd(), HITEM(item));
@@ -2699,9 +2718,17 @@ wxTreeCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
 
                 if ( !(tvht.flags & TVHT_ONITEM) )
                 {
 
                 if ( !(tvht.flags & TVHT_ONITEM) )
                 {
-                    if ( !HandleMouseEvent(nMsg, x, y, wParam) )
+                    if ( tvht.flags & TVHT_ONITEMBUTTON )
                     {
                     {
-                        if ( tvht.flags & TVHT_ONITEMBUTTON )
+                        // either it's going to be handled by user code or
+                        // we're going to use it ourselves to toggle the
+                        // branch, in either case don't pass it to the base
+                        // class which would generate another mouse click event
+                        // for it even though it's already handled here
+                        processed = true;
+                        SetFocus();
+
+                        if ( !HandleMouseEvent(nMsg, x, y, wParam) )
                         {
                             if ( !IsExpanded(htItem) )
                             {
                         {
                             if ( !IsExpanded(htItem) )
                             {
@@ -2712,8 +2739,6 @@ wxTreeCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
                                 Collapse(htItem);
                             }
                         }
                                 Collapse(htItem);
                             }
                         }
-
-                        processed = true;
                     }
 
                     m_focusLost = false;
                     }
 
                     m_focusLost = false;
@@ -2852,6 +2877,7 @@ wxTreeCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
                         else
                         {
                             SetFocusedItem(wxTreeItemId(htItem));
                         else
                         {
                             SetFocusedItem(wxTreeItemId(htItem));
+                            m_mouseUpDeselect = true;
                         }
                     }
                     else // click on a single selected item
                         }
                     }
                     else // click on a single selected item
@@ -3001,16 +3027,13 @@ wxTreeCtrl::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
             case WM_LBUTTONUP:
                 if ( isMultiple )
                 {
             case WM_LBUTTONUP:
                 if ( isMultiple )
                 {
-                    // deselect other items if multiple items selected
+                    // deselect other items if needed
                     if ( htItem )
                     {
                     if ( htItem )
                     {
-                        wxArrayTreeItemIds selections;
-                        size_t count = GetSelections(selections);
-
-                        if ( count > 1 &&
-                             !(wParam & MK_CONTROL) &&
-                             !(wParam & MK_SHIFT) )
+                        if ( m_mouseUpDeselect )
                         {
                         {
+                            m_mouseUpDeselect = false;
+
                             wxTreeEvent changingEvent(wxEVT_COMMAND_TREE_SEL_CHANGING,
                                                       this, htItem);
                             changingEvent.m_itemOld = htOldItem;
                             wxTreeEvent changingEvent(wxEVT_COMMAND_TREE_SEL_CHANGING,
                                                       this, htItem);
                             changingEvent.m_itemOld = htOldItem;
@@ -3372,7 +3395,6 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
                 return MSWHandleTreeKeyDownEvent(
                         info->wVKey, (wxIsAltDown() ? KF_ALTDOWN : 0) << 16);
             }
                 return MSWHandleTreeKeyDownEvent(
                         info->wVKey, (wxIsAltDown() ? KF_ALTDOWN : 0) << 16);
             }
-            break;
 
 
         // Vista's tree control has introduced some problems with our
 
 
         // Vista's tree control has introduced some problems with our
@@ -3482,7 +3504,7 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
 
                             if ( !loaded )
                             {
 
                             if ( !loaded )
                             {
-                                wxLoadedDLL dllComCtl32(_T("comctl32.dll"));
+                                wxLoadedDLL dllComCtl32(wxT("comctl32.dll"));
                                 if ( dllComCtl32.IsLoaded() )
                                     wxDL_INIT_FUNC(s_pfn, ImageList_Copy, dllComCtl32);
                             }
                                 if ( dllComCtl32.IsLoaded() )
                                     wxDL_INIT_FUNC(s_pfn, ImageList_Copy, dllComCtl32);
                             }
@@ -3684,7 +3706,7 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
             {
                 // normally this is impossible because the m_dragImage is
                 // deleted once the drag operation is over
             {
                 // normally this is impossible because the m_dragImage is
                 // deleted once the drag operation is over
-                wxASSERT_MSG( !m_dragImage, _T("starting to drag once again?") );
+                wxASSERT_MSG( !m_dragImage, wxT("starting to drag once again?") );
 
                 m_dragImage = new wxDragImage(*this, event.m_item);
                 m_dragImage->BeginDrag(wxPoint(0,0), this);
 
                 m_dragImage = new wxDragImage(*this, event.m_item);
                 m_dragImage->BeginDrag(wxPoint(0,0), this);