]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/treectrl.cpp
Don't do the wx cleanup if wxPython didn't do the initialization.
[wxWidgets.git] / src / msw / treectrl.cpp
index 242eab62b1e51998924a14c590c28aeb4d42eacd..84a8b01c20f42fdd61073a7b9593f7a5e9a14044 100644 (file)
@@ -303,27 +303,24 @@ struct wxTreeViewItem : public TV_ITEM
 
 // wxVirutalNode is used in place of a single root when 'hidden' root is
 // specified.
 
 // wxVirutalNode is used in place of a single root when 'hidden' root is
 // specified.
-class wxVirtualNode
+class wxVirtualNode : public wxTreeViewItem
 {
 public:
     wxVirtualNode(wxTreeItemData *data)
 {
 public:
     wxVirtualNode(wxTreeItemData *data)
+        : wxTreeViewItem(TVI_ROOT, 0)
     {
         m_data = data;
     {
         m_data = data;
-
-        m_tvItem = new wxTreeViewItem(TVI_ROOT, 0);
     }
 
     ~wxVirtualNode()
     {
         delete m_data;
     }
 
     ~wxVirtualNode()
     {
         delete m_data;
-        delete m_tvItem;
     }
 
     wxTreeItemData *GetData() const { return m_data; }
     void SetData(wxTreeItemData *data) { delete m_data; m_data = data; }
 
 private:
     }
 
     wxTreeItemData *GetData() const { return m_data; }
     void SetData(wxTreeItemData *data) { delete m_data; m_data = data; }
 
 private:
-    wxTreeViewItem *m_tvItem;
     wxTreeItemData *m_data;
 };
 
     wxTreeItemData *m_data;
 };
 
@@ -1298,11 +1295,21 @@ wxTreeItemId wxTreeCtrl::GetSelection() const
 
 wxTreeItemId wxTreeCtrl::GetParent(const wxTreeItemId& item) const
 {
 
 wxTreeItemId wxTreeCtrl::GetParent(const wxTreeItemId& item) const
 {
-    HTREEITEM hItem = TreeView_GetParent(GetHwnd(), HITEM(item));
-    if ( !hItem && HasFlag(wxTR_HIDE_ROOT) )
+    HTREEITEM hItem;
+
+    if ( IS_VIRTUAL_ROOT(item) )
     {
     {
-        // the top level items should have the virtual root as their parent
-        hItem = TVI_ROOT;
+        // no parent for the virtual root
+        hItem = 0;
+    }
+    else // normal item
+    {
+        hItem = TreeView_GetParent(GetHwnd(), HITEM(item));
+        if ( !hItem && HasFlag(wxTR_HIDE_ROOT) )
+        {
+            // the top level items should have the virtual root as their parent
+            hItem = TVI_ROOT;
+        }
     }
 
     return wxTreeItemId((WXHTREEITEM)hItem);
     }
 
     return wxTreeItemId((WXHTREEITEM)hItem);
@@ -1507,7 +1514,7 @@ wxTreeItemId wxTreeCtrl::AddRoot(const wxString& text,
         return TVI_ROOT;
     }
 
         return TVI_ROOT;
     }
 
-    return DoInsertItem(wxTreeItemId((WXHTREEITEM) 0), (WXHTREEITEM) 0,
+    return DoInsertItem(wxTreeItemId((long)(WXHTREEITEM) 0), (long)(WXHTREEITEM) 0,
                         text, image, selectedImage, data);
 }
 
                         text, image, selectedImage, data);
 }
 
@@ -1614,11 +1621,8 @@ void wxTreeCtrl::DoExpand(const wxTreeItemId& item, int flag)
                   wxT("Unknown flag in wxTreeCtrl::DoExpand") );
 
     // A hidden root can be neither expanded nor collapsed.
                   wxT("Unknown flag in wxTreeCtrl::DoExpand") );
 
     // A hidden root can be neither expanded nor collapsed.
-    if ( (HITEM(item) == TVI_ROOT) && (m_windowStyle & wxTR_HIDE_ROOT) )
-    {
-        // No action will be taken.
-        return;
-    }
+    wxCHECK_RET( !(m_windowStyle & wxTR_HIDE_ROOT) || (HITEM(item) != TVI_ROOT),
+                 wxT("Can't expand/collapse hidden root node!") )
 
     // TreeView_Expand doesn't send TVN_ITEMEXPAND(ING) messages, so we must
     // emulate them. This behaviour has changed slightly with comctl32.dll
 
     // TreeView_Expand doesn't send TVN_ITEMEXPAND(ING) messages, so we must
     // emulate them. This behaviour has changed slightly with comctl32.dll
@@ -1759,24 +1763,6 @@ void wxTreeCtrl::ScrollTo(const wxTreeItemId& item)
 
 wxTextCtrl* wxTreeCtrl::GetEditControl() const
 {
 
 wxTextCtrl* wxTreeCtrl::GetEditControl() const
 {
-    // normally, we could try to do something like this to return something
-    // even when the editing was started by the user and not by calling
-    // EditLabel() - but as nobody has asked for this so far and there might be
-    // problems in the code below, I leave it disabled for now (VZ)
-#if 0
-    if ( !m_textCtrl )
-    {
-        HWND hwndText = TreeView_GetEditControl(GetHwnd());
-        if ( hwndText )
-        {
-            m_textCtrl = new wxTextCtrl(this, -1);
-            m_textCtrl->Hide();
-            m_textCtrl->SetHWND((WXHWND)hwndText);
-        }
-        //else: not editing label right now
-    }
-#endif // 0
-
     return m_textCtrl;
 }
 
     return m_textCtrl;
 }
 
@@ -1806,20 +1792,19 @@ wxTextCtrl* wxTreeCtrl::EditLabel(const wxTreeItemId& item,
 
     DeleteTextCtrl();
 
 
     DeleteTextCtrl();
 
+    m_textCtrl = (wxTextCtrl *)textControlClass->CreateObject();
     HWND hWnd = (HWND) TreeView_EditLabel(GetHwnd(), HITEM(item));
 
     // this is not an error - the TVN_BEGINLABELEDIT handler might have
     // returned FALSE
     if ( !hWnd )
     {
     HWND hWnd = (HWND) TreeView_EditLabel(GetHwnd(), HITEM(item));
 
     // this is not an error - the TVN_BEGINLABELEDIT handler might have
     // returned FALSE
     if ( !hWnd )
     {
+        delete m_textCtrl;
+        m_textCtrl = NULL;
         return NULL;
     }
 
         return NULL;
     }
 
-    m_textCtrl = (wxTextCtrl *)textControlClass->CreateObject();
-    m_textCtrl->SetParent(this);
-    m_textCtrl->SetHWND((WXHWND)hWnd);
-    m_textCtrl->SubclassWin((WXHWND)hWnd);
-
+    // textctrl is subclassed in MSWOnNotify
     return m_textCtrl;
 }
 
     return m_textCtrl;
 }
 
@@ -2295,13 +2280,12 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
                 eventType = wxEVT_COMMAND_TREE_KEY_DOWN;
                 TV_KEYDOWN *info = (TV_KEYDOWN *)lParam;
 
                 eventType = wxEVT_COMMAND_TREE_KEY_DOWN;
                 TV_KEYDOWN *info = (TV_KEYDOWN *)lParam;
 
-                // we pass 0 as last CreateKeyEvent() parameter because we
+                // we pass 0 as 2 last CreateKeyEvent() parameters because we
                 // don't have access to the real key press flags here - but as
                 // it is only used to determin wxKeyEvent::m_altDown flag it's
                 // not too bad
                 event.m_evtKey = CreateKeyEvent(wxEVT_KEY_DOWN,
                 // don't have access to the real key press flags here - but as
                 // it is only used to determin wxKeyEvent::m_altDown flag it's
                 // not too bad
                 event.m_evtKey = CreateKeyEvent(wxEVT_KEY_DOWN,
-                                                wxCharCodeMSWToWX(info->wVKey),
-                                                0);
+                                                wxCharCodeMSWToWX(info->wVKey));
 
                 // a separate event for Space/Return
                 if ( !wxIsCtrlDown() && !wxIsShiftDown() &&
 
                 // a separate event for Space/Return
                 if ( !wxIsCtrlDown() && !wxIsShiftDown() &&
@@ -2522,6 +2506,32 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
         case TVN_BEGINLABELEDIT:
             // return TRUE to cancel label editing
             *result = !event.IsAllowed();
         case TVN_BEGINLABELEDIT:
             // return TRUE to cancel label editing
             *result = !event.IsAllowed();
+            // set ES_WANTRETURN ( like we do in BeginLabelEdit )
+            if(event.IsAllowed())
+            {
+                HWND hText = TreeView_GetEditControl(GetHwnd());
+                if(hText != NULL)
+                {
+                    // MBN: if m_textCtrl already has an HWND, it is a stale 
+                    // pointer from a previous edit (because the user
+                    // didn't modify the label before dismissing the control,
+                    // and TVN_ENDLABELEDIT was not sent), so delete it
+                    if(m_textCtrl && m_textCtrl->GetHWND() != 0)
+                        DeleteTextCtrl();
+                    if(!m_textCtrl)
+                        m_textCtrl = new wxTextCtrl();
+                    m_textCtrl->SetParent(this);
+                    m_textCtrl->SetHWND((WXHWND)hText);
+                    m_textCtrl->SubclassWin((WXHWND)hText);
+
+                    // set wxTE_PROCESS_ENTER style for the text control to
+                    // force it to process the Enter presses itself, otherwise
+                    // they could be stolen from it by the dialog
+                    // navigation code
+                    m_textCtrl->SetWindowStyle(m_textCtrl->GetWindowStyle()
+                                               | wxTE_PROCESS_ENTER);
+                }
+            }
             break;
 
         case TVN_ENDLABELEDIT:
             break;
 
         case TVN_ENDLABELEDIT: