]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/region.cpp
Fixed overlapping buttons in wizard on MacOS X
[wxWidgets.git] / src / os2 / region.cpp
index b3ff3e34d72f7903b1407761fcdc80d77cc876a9..c56301d723e90c333add2942d9572992a2d877d4 100644 (file)
@@ -4,7 +4,7 @@
 // Author:    David Webster
 // Modified by:
 // Created:   10/15/99
-// RCS-ID:       $Id$
+// RCS-ID:    $Id$
 // Copyright: (c) Davdi Webster
 // Licence:   wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
@@ -19,8 +19,8 @@
 #include "wx/window.h"
 #include "wx/os2/private.h"
 
-       IMPLEMENT_DYNAMIC_CLASS(wxRegion, wxGDIObject)
-       IMPLEMENT_DYNAMIC_CLASS(wxRegionIterator, wxObject)
+    IMPLEMENT_DYNAMIC_CLASS(wxRegion, wxGDIObject)
+    IMPLEMENT_DYNAMIC_CLASS(wxRegionIterator, wxObject)
 
 //-----------------------------------------------------------------------------
 // wxRegionRefData implementation
@@ -31,6 +31,7 @@ public:
     wxRegionRefData()
     {
         m_hRegion = 0;
+        m_hPS     = 0;
     }
 
     wxRegionRefData(const wxRegionRefData& rData)
@@ -75,6 +76,7 @@ public:
 };
 
 #define M_REGION (((wxRegionRefData*)m_refData)->m_hRegion)
+#define M_REGION_OF(rgn) (((wxRegionRefData*)(rgn.m_refData))->m_hRegion)
 
 //-----------------------------------------------------------------------------
 // wxRegion
@@ -89,11 +91,13 @@ wxRegion::wxRegion()
 } // end of wxRegion::wxRegion
 
 wxRegion::wxRegion(
-  WXHRGN                            hRegion
+  WXHRGN                            hRegion,
+  WXHDC                             hPS
 )
 {
     m_refData = new wxRegionRefData;
     M_REGION = (HRGN) hRegion;
+    (((wxRegionRefData*)m_refData)->m_hPS) = hPS;
 } // end of wxRegion::wxRegion
 
 wxRegion::wxRegion(
@@ -217,10 +221,44 @@ wxRegion::~wxRegion()
 {
 } // end of wxRegion::~wxRegion
 
+wxObjectRefData *wxRegion::CreateData() const
+{
+    return new wxRegionRefData;
+}
+
+wxObjectRefData *wxRegion::CloneData(const wxObjectRefData *data) const
+{
+    return new wxRegionRefData(*(wxRegionRefData *)data);
+}
+
 //-----------------------------------------------------------------------------
 //# Modify region
 //-----------------------------------------------------------------------------
 
+bool wxRegion::Offset(
+  wxCoord                           x
+, wxCoord                           y
+)
+{
+    if ( !x && !y )
+    {
+        // nothing to do
+        return TRUE;
+    }
+
+    AllocExclusive();
+
+#if 0
+    if ( ::OffsetRgn(GetHrgn(), x, y) == ERROR )
+    {
+        wxLogLastError(_T("OffsetRgn"));
+
+        return FALSE;
+    }
+#endif
+    return TRUE;
+}
+
 //
 // Clear current region
 //
@@ -240,71 +278,7 @@ bool wxRegion::Combine(
 , wxRegionOp                        eOp
 )
 {
-    //
-    // Don't change shared data
-    //
-    if (!m_refData)
-    {
-        m_refData = new wxRegionRefData();
-    }
-    else if (m_refData->GetRefCount() > 1)
-    {
-        wxRegionRefData*            pRef = (wxRegionRefData*)m_refData;
-
-        UnRef();
-        m_refData = new wxRegionRefData(*pRef);
-    }
-
-    //
-    // If ref count is 1, that means it's 'ours' anyway so no action.
-    //
-    RECTL                           vRect;
-
-    vRect.xLeft   = x;
-    vRect.xRight  = x + vWidth;
-    vRect.yBottom = y;
-    vRect.yTop    = y + vHeight;
-
-    HRGN                            hRgn = ::GpiCreateRegion( ((wxRegionRefData*)m_refData)->m_hPS
-                                                             ,1
-                                                             ,&vRect
-                                                            );
-    LONG                            lMode = 0L;
-
-    switch (eOp)
-    {
-        case wxRGN_AND:
-            lMode = CRGN_AND;
-            break;
-
-        case wxRGN_OR:
-            lMode = CRGN_OR;
-            break;
-
-        case wxRGN_XOR:
-            lMode = CRGN_XOR;
-            break;
-
-        case wxRGN_DIFF:
-            lMode = CRGN_DIFF;
-            break;
-
-        case wxRGN_COPY:
-        default:
-            lMode = CRGN_COPY;
-            break;
-    }
-    bool                            bSuccess = ::GpiCombineRegion( ((wxRegionRefData*)m_refData)->m_hPS
-                                                                  ,M_REGION
-                                                                  ,M_REGION
-                                                                  ,hRgn
-                                                                  ,lMode
-                                                                 );
-    ::GpiDestroyRegion ( ((wxRegionRefData*)m_refData)->m_hPS
-                        ,hRgn
-                       );
-
-    return bSuccess;
+    return Combine(wxRegion(x, y, vWidth, vHeight), eOp);
 } // end of wxRegion::Combine
 
 //
@@ -315,55 +289,67 @@ bool wxRegion::Combine(
 , wxRegionOp                        eOp
 )
 {
-    if (rRegion.Empty())
-        return FALSE;
-
     //
-    // Don't change shared data
+    // We can't use the API functions if we don't have a valid region handle
     //
     if (!m_refData)
     {
-        m_refData = new wxRegionRefData();
+        // combining with an empty/invalid region works differently depending
+        // on the operation
+        switch (eOp)
+        {
+            case wxRGN_COPY:
+            case wxRGN_OR:
+            case wxRGN_XOR:
+                *this = rRegion;
+                break;
+
+            default:
+                wxFAIL_MSG( _T("unknown region operation") );
+                // fall through
+
+            case wxRGN_AND:
+            case wxRGN_DIFF:
+                // leave empty/invalid
+                return FALSE;
+        }
     }
-    else  if (m_refData->GetRefCount() > 1)
+    else // we have a valid region
     {
-        wxRegionRefData*            pRef = (wxRegionRefData*)m_refData;
 
-        UnRef();
-        m_refData = new wxRegionRefData(*pRef);
-    }
+        LONG                        lMode = 0;
 
-    LONG                            lMode = 0;
-
-    switch (eOp)
-    {
-        case wxRGN_AND:
-            lMode = CRGN_AND;
-            break;
-
-        case wxRGN_OR:
-            lMode = CRGN_OR;
-            break;
-
-        case wxRGN_XOR:
-            lMode = CRGN_XOR;
-            break;
-
-        case wxRGN_DIFF:
-            lMode = CRGN_DIFF;
-            break;
-
-        case wxRGN_COPY:
-        default:
-            lMode = CRGN_COPY;
-            break;
+        switch (eOp)
+        {
+            case wxRGN_AND:
+                lMode = CRGN_AND;
+                break;
+
+            case wxRGN_OR:
+                lMode = CRGN_OR;
+                break;
+
+            case wxRGN_XOR:
+                lMode = CRGN_XOR;
+                break;
+
+            case wxRGN_DIFF:
+                lMode = CRGN_DIFF;
+                break;
+
+            case wxRGN_COPY:
+            default:
+                lMode = CRGN_COPY;
+                break;
+        }
+        return (::GpiCombineRegion( ((wxRegionRefData*)rRegion.m_refData)->m_hPS
+                                   ,M_REGION
+                                   ,M_REGION
+                                   ,((wxRegionRefData*)rRegion.m_refData)->m_hRegion
+                                   ,lMode
+                                  ) != RGN_ERROR);
     }
-    return (::GpiCombineRegion( ((wxRegionRefData*)rRegion.m_refData)->m_hPS
-                               ,M_REGION
-                               ,M_REGION
-                               ,((wxRegionRefData*)rRegion.m_refData)->m_hRegion
-                               ,lMode
-                              ) != RGN_ERROR);
+    return TRUE;
 } // end of wxRegion::Combine
 
 bool wxRegion::Combine(
@@ -396,13 +382,14 @@ void wxRegion::GetBox(
     if (m_refData)
     {
         RECTL                       vRect;
+        APIRET                      rc;
 
-        ::GpiQueryRegionBox( ((wxRegionRefData*)m_refData)->m_hPS
+        rc = ::GpiQueryRegionBox( ((wxRegionRefData*)m_refData)->m_hPS
                             ,M_REGION
                             ,&vRect
                            );
         x       = vRect.xLeft;
-        y       = vRect.yTop;
+        y       = vRect.yBottom;
         vWidth  = vRect.xRight - vRect.xLeft;
         vHeight = vRect.yTop - vRect.yBottom;
     }