]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/msw/subwin.h
Fix wxPropertyGrid::GetPropertyRect when the last item is collapsed.
[wxWidgets.git] / include / wx / msw / subwin.h
index 61620abff732cb266873dfc5f3962b849fe6aad9..9e48b9e35f78340effd3371538e6705387184b3b 100644 (file)
@@ -4,7 +4,6 @@
 // Author:      Vadim Zeitlin
 // Modified by:
 // Created:     2004-12-11
-// RCS-ID:      $Id$
 // Copyright:   (c) 2004 Vadim Zeitlin <vadim@wxwindows.org>
 // Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
@@ -18,7 +17,7 @@
 // wxSubwindows contains all HWNDs making part of a single wx control
 // ----------------------------------------------------------------------------
 
-class WXDLLEXPORT wxSubwindows
+class WXDLLIMPEXP_CORE wxSubwindows
 {
 public:
     // the number of subwindows can be specified either as parameter to ctor or
@@ -28,10 +27,11 @@ public:
     // allocate enough space for the given number of windows
     void Create(size_t n)
     {
-        wxASSERT_MSG( !m_hwnds, _T("Create() called twice?") );
+        wxASSERT_MSG( !m_hwnds, wxT("Create() called twice?") );
 
         m_count = n;
         m_hwnds = (HWND *)calloc(n, sizeof(HWND));
+        m_ids = new wxWindowIDRef[n];
     }
 
     // non-virtual dtor, this class is not supposed to be used polymorphically
@@ -39,10 +39,12 @@ public:
     {
         for ( size_t n = 0; n < m_count; n++ )
         {
-            ::DestroyWindow(m_hwnds[n]);
+            if ( m_hwnds[n] )
+                ::DestroyWindow(m_hwnds[n]);
         }
 
         free(m_hwnds);
+        delete [] m_ids;
     }
 
     // get the number of subwindows
@@ -51,15 +53,24 @@ public:
     // access a given window
     HWND& Get(size_t n)
     {
-        wxASSERT_MSG( n < m_count, _T("subwindow index out of range") );
+        wxASSERT_MSG( n < m_count, wxT("subwindow index out of range") );
 
         return m_hwnds[n];
     }
 
-    HWND& operator[](size_t n) { return Get(n); }
     HWND operator[](size_t n) const
     {
-        return wx_const_cast(wxSubwindows *, this)->Get(n);
+        return const_cast<wxSubwindows *>(this)->Get(n);
+    }
+
+    // initialize the given window: id will be stored in wxWindowIDRef ensuring
+    // that it is not reused while this object exists
+    void Set(size_t n, HWND hwnd, wxWindowID id)
+    {
+        wxASSERT_MSG( n < m_count, wxT("subwindow index out of range") );
+
+        m_hwnds[n] = hwnd;
+        m_ids[n] = id;
     }
 
     // check if we have this window
@@ -84,7 +95,18 @@ public:
         int sw = show ? SW_SHOW : SW_HIDE;
         for ( size_t n = 0; n < m_count; n++ )
         {
-            ::ShowWindow(m_hwnds[n], sw);
+            if ( m_hwnds[n] )
+                ::ShowWindow(m_hwnds[n], sw);
+        }
+    }
+
+    // enable/disable everything
+    void Enable(bool enable)
+    {
+        for ( size_t n = 0; n < m_count; n++ )
+        {
+            if ( m_hwnds[n] )
+                ::EnableWindow(m_hwnds[n], enable);
         }
     }
 
@@ -92,11 +114,17 @@ public:
     void SetFont(const wxFont& font)
     {
         HFONT hfont = GetHfontOf(font);
-        wxCHECK_RET( hfont, _T("invalid font") );
+        wxCHECK_RET( hfont, wxT("invalid font") );
 
         for ( size_t n = 0; n < m_count; n++ )
         {
-            ::SendMessage(m_hwnds[n], WM_SETFONT, (WPARAM)hfont, 0);
+            if ( m_hwnds[n] )
+            {
+                ::SendMessage(m_hwnds[n], WM_SETFONT, (WPARAM)hfont, 0);
+
+                // otherwise the window might not be redrawn correctly
+                ::InvalidateRect(m_hwnds[n], NULL, FALSE /* don't erase bg */);
+            }
         }
     }
 
@@ -106,10 +134,14 @@ public:
         wxRect r;
         for ( size_t n = 0; n < m_count; n++ )
         {
-            RECT rc;
-            ::GetWindowRect(m_hwnds[n], &rc);
+            if ( m_hwnds[n] )
+            {
+                RECT rc;
+
+                ::GetWindowRect(m_hwnds[n], &rc);
 
-            r.Union(wxRectFromRECT(rc));
+                r.Union(wxRectFromRECT(rc));
+            }
         }
 
         return r;
@@ -128,9 +160,59 @@ private:
     // the HWNDs we contain
     HWND *m_hwnds;
 
+    // the IDs of the windows
+    wxWindowIDRef *m_ids;
 
-    DECLARE_NO_COPY_CLASS(wxSubwindows)
+
+    wxDECLARE_NO_COPY_CLASS(wxSubwindows);
 };
 
+// convenient macro to forward a few methods which are usually propagated to
+// subwindows to a wxSubwindows object
+//
+// parameters should be:
+//  - cname the name of the class implementing these methods
+//  - base the name of its base class
+//  - subwins the name of the member variable of type wxSubwindows *
+#define WX_FORWARD_STD_METHODS_TO_SUBWINDOWS(cname, base, subwins)            \
+    bool cname::ContainsHWND(WXHWND hWnd) const                               \
+    {                                                                         \
+        return subwins && subwins->HasWindow((HWND)hWnd);                     \
+    }                                                                         \
+                                                                              \
+    bool cname::Show(bool show)                                               \
+    {                                                                         \
+        if ( !base::Show(show) )                                              \
+            return false;                                                     \
+                                                                              \
+        if ( subwins )                                                        \
+            subwins->Show(show);                                              \
+                                                                              \
+        return true;                                                          \
+    }                                                                         \
+                                                                              \
+    bool cname::Enable(bool enable)                                           \
+    {                                                                         \
+        if ( !base::Enable(enable) )                                          \
+            return false;                                                     \
+                                                                              \
+        if ( subwins )                                                        \
+            subwins->Enable(enable);                                          \
+                                                                              \
+        return true;                                                          \
+    }                                                                         \
+                                                                              \
+    bool cname::SetFont(const wxFont& font)                                   \
+    {                                                                         \
+        if ( !base::SetFont(font) )                                           \
+            return false;                                                     \
+                                                                              \
+        if ( subwins )                                                        \
+            subwins->SetFont(font);                                           \
+                                                                              \
+        return true;                                                          \
+    }
+
+
 #endif // _WX_MSW_SUBWIN_H_