]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/treectrl.cpp
applied numpad keys patch
[wxWidgets.git] / src / msw / treectrl.cpp
index 58a84c5ac46c20ad8d0456a19a05b8f24b4a2b46..18b888bb9b3d845212a004d3b14b128dfa14c684 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
-// Name:        treectrl.cpp
+// Name:        src/msw/treectrl.cpp
 // Purpose:     wxTreeCtrl
 // Author:      Julian Smart
 // Modified by: Vadim Zeitlin to be less MSW-specific on 10.10.98
 // Purpose:     wxTreeCtrl
 // Author:      Julian Smart
 // Modified by: Vadim Zeitlin to be less MSW-specific on 10.10.98
@@ -16,6 +16,7 @@
 // ----------------------------------------------------------------------------
 // headers
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // headers
 // ----------------------------------------------------------------------------
+
 #ifdef __GNUG__
     #pragma implementation "treectrl.h"
 #endif
 #ifdef __GNUG__
     #pragma implementation "treectrl.h"
 #endif
     #pragma hdrstop
 #endif
 
     #pragma hdrstop
 #endif
 
+#if wxUSE_TREECTRL
+
 #include "wx/msw/private.h"
 
 #include "wx/msw/private.h"
 
-// Set this to 1 to be _absolutely_ sure that repainting will work for all comctl32.dll versions
+// Set this to 1 to be _absolutely_ sure that repainting will work for all
+// comctl32.dll versions
 #define wxUSE_COMCTL32_SAFELY 0
 
 // Mingw32 is a bit mental even though this is done in winundef
 #define wxUSE_COMCTL32_SAFELY 0
 
 // Mingw32 is a bit mental even though this is done in winundef
@@ -54,7 +58,7 @@
     #include "wx/msw/gnuwin32/extra.h"
 #endif
 
     #include "wx/msw/gnuwin32/extra.h"
 #endif
 
-#if defined(__WIN95__) && !(defined(__GNUWIN32_OLD__) || defined(__TWIN32__))
+#if defined(__WIN95__) && !((defined(__GNUWIN32_OLD__) || defined(__TWIN32__)) && !defined(__CYGWIN10__))
     #include <commctrl.h>
 #endif
 
     #include <commctrl.h>
 #endif
 
@@ -88,6 +92,7 @@
 // looks quite ugly.
 #define wxUSE_CHECKBOXES_IN_MULTI_SEL_TREE 0
 
 // looks quite ugly.
 #define wxUSE_CHECKBOXES_IN_MULTI_SEL_TREE 0
 
+
 // ----------------------------------------------------------------------------
 // private functions
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // private functions
 // ----------------------------------------------------------------------------
@@ -368,7 +373,7 @@ public:
             DoTraverse(root, recursively);
         }
 
             DoTraverse(root, recursively);
         }
 
-    virtual bool OnVisit(const wxTreeItemId& item)
+    virtual bool OnVisit(const wxTreeItemId& WXUNUSED(item))
     {
         m_count++;
 
     {
         m_count++;
 
@@ -448,7 +453,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxTreeCtrl, wxControl)
 // ----------------------------------------------------------------------------
 
 // handy table for sending events
 // ----------------------------------------------------------------------------
 
 // handy table for sending events
-static const wxEventType g_events[2][2] =
+static wxEventType g_events[2][2] =
 {
     { wxEVT_COMMAND_TREE_ITEM_COLLAPSED, wxEVT_COMMAND_TREE_ITEM_COLLAPSING },
     { wxEVT_COMMAND_TREE_ITEM_EXPANDED,  wxEVT_COMMAND_TREE_ITEM_EXPANDING  }
 {
     { wxEVT_COMMAND_TREE_ITEM_COLLAPSED, wxEVT_COMMAND_TREE_ITEM_COLLAPSING },
     { wxEVT_COMMAND_TREE_ITEM_EXPANDED,  wxEVT_COMMAND_TREE_ITEM_EXPANDING  }
@@ -501,8 +506,15 @@ void wxTreeCtrl::Init()
     m_textCtrl = NULL;
     m_hasAnyAttr = FALSE;
     m_dragImage = NULL;
     m_textCtrl = NULL;
     m_hasAnyAttr = FALSE;
     m_dragImage = NULL;
-
     m_htSelStart = 0;
     m_htSelStart = 0;
+
+    // Initialize static array of events, because with the new event system,
+    // they may not be initialized yet.
+
+    g_events[0][0] = wxEVT_COMMAND_TREE_ITEM_COLLAPSED;
+    g_events[0][1] = wxEVT_COMMAND_TREE_ITEM_COLLAPSING;
+    g_events[1][0] = wxEVT_COMMAND_TREE_ITEM_EXPANDED;
+    g_events[1][1] = wxEVT_COMMAND_TREE_ITEM_EXPANDING;
 }
 
 bool wxTreeCtrl::Create(wxWindow *parent,
 }
 
 bool wxTreeCtrl::Create(wxWindow *parent,
@@ -519,7 +531,10 @@ bool wxTreeCtrl::Create(wxWindow *parent,
         return FALSE;
 
     DWORD wstyle = WS_VISIBLE | WS_CHILD | WS_TABSTOP |
         return FALSE;
 
     DWORD wstyle = WS_VISIBLE | WS_CHILD | WS_TABSTOP |
-                   TVS_SHOWSELALWAYS /* | WS_CLIPSIBLINGS */;
+                   TVS_SHOWSELALWAYS;
+
+    if ( m_windowStyle & wxCLIP_SIBLINGS )
+        wstyle |= WS_CLIPSIBLINGS;
 
     if ((m_windowStyle & wxTR_NO_LINES) == 0)
         wstyle |= TVS_HASLINES;
 
     if ((m_windowStyle & wxTR_NO_LINES) == 0)
         wstyle |= TVS_HASLINES;
@@ -642,7 +657,7 @@ wxTreeCtrl::~wxTreeCtrl()
 
     // delete user data to prevent memory leaks
     DeleteAllItems();
 
     // delete user data to prevent memory leaks
     DeleteAllItems();
-    
+
     if (m_ownsImageListNormal) delete m_imageListNormal;
     if (m_ownsImageListState) delete m_imageListState;
 }
     if (m_ownsImageListNormal) delete m_imageListNormal;
     if (m_ownsImageListState) delete m_imageListState;
 }
@@ -1596,6 +1611,14 @@ void wxTreeCtrl::DeleteTextCtrl()
 {
     if ( m_textCtrl )
     {
 {
     if ( m_textCtrl )
     {
+        // the HWND corresponding to this control is deleted by the tree
+        // control itself and we don't know when exactly this happens, so check
+        // if the window still exists before calling UnsubclassWin()
+        if ( !::IsWindow(GetHwndOf(m_textCtrl)) )
+        {
+            m_textCtrl->SetHWND(0);
+        }
+
         m_textCtrl->UnsubclassWin();
         m_textCtrl->SetHWND(0);
         delete m_textCtrl;
         m_textCtrl->UnsubclassWin();
         m_textCtrl->SetHWND(0);
         delete m_textCtrl;
@@ -1620,6 +1643,7 @@ wxTextCtrl* wxTreeCtrl::EditLabel(const wxTreeItemId& item,
     }
 
     m_textCtrl = (wxTextCtrl *)textControlClass->CreateObject();
     }
 
     m_textCtrl = (wxTextCtrl *)textControlClass->CreateObject();
+    m_textCtrl->SetParent(this);
     m_textCtrl->SetHWND((WXHWND)hWnd);
     m_textCtrl->SubclassWin((WXHWND)hWnd);
 
     m_textCtrl->SetHWND((WXHWND)hWnd);
     m_textCtrl->SubclassWin((WXHWND)hWnd);
 
@@ -1627,7 +1651,7 @@ wxTextCtrl* wxTreeCtrl::EditLabel(const wxTreeItemId& item,
 }
 
 // End label editing, optionally cancelling the edit
 }
 
 // End label editing, optionally cancelling the edit
-void wxTreeCtrl::EndEditLabel(const wxTreeItemId& item, bool discardChanges)
+void wxTreeCtrl::EndEditLabel(const wxTreeItemId& WXUNUSED(item), bool discardChanges)
 {
     TreeView_EndEditLabelNow(GetHwnd(), discardChanges);
 
 {
     TreeView_EndEditLabelNow(GetHwnd(), discardChanges);
 
@@ -2114,7 +2138,7 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
             }
             break;
 
             }
             break;
 
-#if defined(_WIN32_IE) && _WIN32_IE >= 0x300 && !wxUSE_COMCTL32_SAFELY
+#if defined(_WIN32_IE) && _WIN32_IE >= 0x300 && !wxUSE_COMCTL32_SAFELY && !defined(__GNUWIN32__)
         case NM_CUSTOMDRAW:
             {
                 LPNMTVCUSTOMDRAW lptvcd = (LPNMTVCUSTOMDRAW)lParam;
         case NM_CUSTOMDRAW:
             {
                 LPNMTVCUSTOMDRAW lptvcd = (LPNMTVCUSTOMDRAW)lParam;
@@ -2208,7 +2232,7 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
                         return TRUE;
                 }
             }
                         return TRUE;
                 }
             }
-            break;
+//            break;  // can never be reached
 #endif // _WIN32_IE >= 0x300
 
         case NM_DBLCLK:
 #endif // _WIN32_IE >= 0x300
 
         case NM_DBLCLK:
@@ -2328,7 +2352,7 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
         case TVN_GETDISPINFO:
             // NB: so far the user can't set the image himself anyhow, so do it
             //     anyway - but this may change later
         case TVN_GETDISPINFO:
             // NB: so far the user can't set the image himself anyhow, so do it
             //     anyway - but this may change later
-            if ( /* !processed && */ 1 )
+//          if ( /* !processed && */ 1 )
             {
                 wxTreeItemId item = event.m_item;
                 TV_DISPINFO *info = (TV_DISPINFO *)lParam;
             {
                 wxTreeItemId item = event.m_item;
                 TV_DISPINFO *info = (TV_DISPINFO *)lParam;
@@ -2352,7 +2376,7 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
                                           : wxTreeItemIcon_Selected
                         );
                 }
                                           : wxTreeItemIcon_Selected
                         );
                 }
-            }
+                       }
             break;
 
         //default:
             break;
 
         //default:
@@ -2365,3 +2389,4 @@ bool wxTreeCtrl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
 
 #endif // __WIN95__
 
 
 #endif // __WIN95__
 
+#endif // wxUSE_TREECTRL