]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/pen.cpp
Added ability to switch off more components of the size page UI
[wxWidgets.git] / src / os2 / pen.cpp
index 711a62a679fba745badbe59a45119d1aba032d0f..c1c9f7253ca7159d8d946c3cf4f831e50f6d0e2f 100644 (file)
 #endif
 
 #include "wx/os2/private.h"
 #endif
 
 #include "wx/os2/private.h"
-#include "assert.h"
 
 
-IMPLEMENT_DYNAMIC_CLASS(wxPen, wxGDIObject)
+class WXDLLIMPEXP_FWD_CORE wxPen;
+
+// ----------------------------------------------------------------------------
+// wxPenRefData: contains information about an HPEN and its handle
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxPenRefData: public wxGDIRefData
+{
+    friend class WXDLLIMPEXP_FWD_CORE wxPen;
+public:
+    wxPenRefData();
+    wxPenRefData(const wxPenRefData& rData);
+    wxPenRefData(const wxColour& col, int width, wxPenStyle style);
+    wxPenRefData(const wxBitmap& stipple, int width);
+    virtual ~wxPenRefData();
+
+    bool operator==(const wxPenRefData& data) const
+    {
+        // we intentionally don't compare m_hPen fields here
+        return m_nStyle == data.m_nStyle &&
+               m_nWidth == data.m_nWidth &&
+               m_nJoin == data.m_nJoin &&
+               m_nCap == data.m_nCap &&
+               m_vColour == data.m_vColour &&
+               (m_nStyle != wxPENSTYLE_STIPPLE || m_vStipple.IsSameAs(data.m_vStipple)) &&
+               (m_nStyle != wxPENSTYLE_USER_DASH ||
+                (m_dash == data.m_dash &&
+                    memcmp(m_dash, data.m_dash, m_nbDash*sizeof(wxDash)) == 0));
+    }
+
+private:
+    // initialize the fields which have reasonable default values
+    //
+    // doesn't initialize m_width and m_style which must be initialize in ctor
+    void Init()
+    {
+        m_nJoin = wxJOIN_ROUND;
+        m_nCap = wxCAP_ROUND;
+        m_nbDash = 0;
+        m_dash = NULL;
+        m_hPen = 0;
+    }
+
+    int                             m_nWidth;
+    wxPenStyle                      m_nStyle;
+    wxPenJoin                       m_nJoin;
+    wxPenCap                        m_nCap;
+    wxBitmap                        m_vStipple;
+    int                             m_nbDash;
+    wxDash *                        m_dash;
+    wxColour                        m_vColour;
+    WXHPEN                          m_hPen;// in OS/2 GPI this will be the PS the pen is associated with
+
+    wxDECLARE_NO_ASSIGN_CLASS(wxPenRefData);
+};
+
+#define M_PENDATA ((wxPenRefData *)m_refData)
+
+// ----------------------------------------------------------------------------
+// wxPenRefData ctors/dtor
+// ----------------------------------------------------------------------------
 
 wxPenRefData::wxPenRefData()
 {
 
 wxPenRefData::wxPenRefData()
 {
-    m_nStyle  = wxSOLID;
+    Init();
+
+    m_nStyle  = wxPENSTYLE_SOLID;
     m_nWidth  = 1;
     m_nWidth  = 1;
-    m_nJoin   = wxJOIN_ROUND ;
-    m_nCap    = wxCAP_ROUND ;
-    m_nbDash  = 0 ;
-    m_dash    = (wxDash*)NULL;
-    m_hPen    = 0L;
 } // end of wxPenRefData::wxPenRefData
 
 wxPenRefData::wxPenRefData(
 } // end of wxPenRefData::wxPenRefData
 
 wxPenRefData::wxPenRefData(
@@ -52,71 +108,75 @@ wxPenRefData::wxPenRefData(
     m_hPen    = 0L;
 } // end of wxPenRefData::wxPenRefData
 
     m_hPen    = 0L;
 } // end of wxPenRefData::wxPenRefData
 
-wxPenRefData::~wxPenRefData()
+wxPenRefData::wxPenRefData(const wxColour& col, int width, wxPenStyle style)
 {
 {
-} // end of wxPenRefData::~wxPenRefData
+    Init();
+
+    m_nStyle = style;
+    m_nWidth = width;
+
+    m_vColour = col;
+}
 
 
-//
-// Pens
-//
-wxPen::wxPen()
+wxPenRefData::wxPenRefData(const wxBitmap& stipple, int width)
 {
 {
-} // end of wxPen::wxPen
+    Init();
+
+    m_nStyle = wxPENSTYLE_STIPPLE;
+    m_nWidth = width;
 
 
-wxPen::~wxPen()
+    m_vStipple = stipple;
+}
+
+wxPenRefData::~wxPenRefData()
 {
 {
-} // end of wxPen::wxPen
+} // end of wxPenRefData::~wxPenRefData
+
+// ----------------------------------------------------------------------------
+// wxPen
+// ----------------------------------------------------------------------------
+
+IMPLEMENT_DYNAMIC_CLASS(wxPen, wxGDIObject)
 
 
-// Should implement Create
 wxPen::wxPen(
   const wxColour&                   rColour
 , int                               nWidth
 , wxPenStyle                        nStyle
 )
 {
 wxPen::wxPen(
   const wxColour&                   rColour
 , int                               nWidth
 , wxPenStyle                        nStyle
 )
 {
-    m_refData = new wxPenRefData;
-
-    M_PENDATA->m_vColour = rColour;
-    M_PENDATA->m_nWidth  = nWidth;
-    M_PENDATA->m_nStyle  = nStyle;
-    M_PENDATA->m_nJoin   = wxJOIN_ROUND ;
-    M_PENDATA->m_nCap    = wxCAP_ROUND ;
-    M_PENDATA->m_hPen    = 0L;
+    m_refData = new wxPenRefData(rColour, nWidth, nStyle);
 
     RealizeResource();
 } // end of wxPen::wxPen
 
 
     RealizeResource();
 } // end of wxPen::wxPen
 
-wxPen::wxPen(const wxColour& colour, int width, wxBrushStyle style)
+#if FUTURE_WXWIN_COMPATIBILITY_3_0
+wxPen::wxPen(const wxColour& colour, int width, int style)
 {
 {
-    m_refData = new wxPenRefData;
-
-    M_PENDATA->m_vColour = colour;
-    M_PENDATA->m_nWidth  = width;
-    M_PENDATA->m_nStyle  = (wxPenStyle)nStyle;
-    M_PENDATA->m_nJoin   = wxJOIN_ROUND ;
-    M_PENDATA->m_nCap    = wxCAP_ROUND ;
-    M_PENDATA->m_hPen    = 0L;
+    m_refData = new wxPenRefData(colour, width, (wxPenStyle)style);
 
     RealizeResource();
 }
 
     RealizeResource();
 }
+#endif
 
 wxPen::wxPen(
   const wxBitmap&                   rStipple
 , int                               nWidth
 )
 {
 
 wxPen::wxPen(
   const wxBitmap&                   rStipple
 , int                               nWidth
 )
 {
-    m_refData = new wxPenRefData;
-
-    M_PENDATA->m_vStipple = rStipple;
-    M_PENDATA->m_nWidth   = nWidth;
-    M_PENDATA->m_nStyle   = wxSTIPPLE;
-    M_PENDATA->m_nJoin    = wxJOIN_ROUND ;
-    M_PENDATA->m_nCap     = wxCAP_ROUND ;
-    M_PENDATA->m_hPen     = 0;
+    m_refData = new wxPenRefData (rStipple, nWidth);
 
     RealizeResource();
 } // end of wxPen::wxPen
 
 
     RealizeResource();
 } // end of wxPen::wxPen
 
+bool wxPen::operator==(const wxPen& pen) const
+{
+    const wxPenRefData *
+        penData = static_cast<const wxPenRefData *>(pen.m_refData);
+
+    // an invalid pen is only equal to another invalid pen
+    return m_refData ? penData && *M_PENDATA == *penData : !penData;
+}
+
 int wx2os2PenStyle(
   wxPenStyle                               nWxStyle
 );
 int wx2os2PenStyle(
   wxPenStyle                               nWxStyle
 );
@@ -159,10 +219,10 @@ bool wxPen::RealizeResource()
         {
             vError = ::WinGetLastError(vHabmain);
             sError = wxPMErrorToStr(vError);
         {
             vError = ::WinGetLastError(vHabmain);
             sError = wxPMErrorToStr(vError);
-            wxLogError(_T("Unable to set current color table to RGB mode. Error: %s\n"), sError.c_str());
+            wxLogError(wxT("Unable to set current color table to RGB mode. Error: %s\n"), sError.c_str());
             return false;
         }
             return false;
         }
-        if (M_PENDATA->m_nStyle == wxTRANSPARENT)
+        if (M_PENDATA->m_nStyle == wxPENSTYLE_TRANSPARENT)
         {
             return true;
         }
         {
             return true;
         }
@@ -225,7 +285,7 @@ bool wxPen::RealizeResource()
         {
             vError = ::WinGetLastError(vHabmain);
             sError = wxPMErrorToStr(vError);
         {
             vError = ::WinGetLastError(vHabmain);
             sError = wxPMErrorToStr(vError);
-            wxLogError(_T("Can't set Gpi attributes for a LINEBUNDLE. Error: %s\n"), sError.c_str());
+            wxLogError(wxT("Can't set Gpi attributes for a LINEBUNDLE. Error: %s\n"), sError.c_str());
             return false;
         }
 
             return false;
         }
 
@@ -233,7 +293,7 @@ bool wxPen::RealizeResource()
         ULONG                           flDefMask = 0L;
         switch(M_PENDATA->m_nStyle)
         {
         ULONG                           flDefMask = 0L;
         switch(M_PENDATA->m_nStyle)
         {
-            case wxSTIPPLE:
+            case wxPENSTYLE_STIPPLE:
                 ::GpiSetBitmapId( M_PENDATA->m_hPen
                                  ,(USHORT)M_PENDATA->m_vStipple.GetHBITMAP()
                                  ,(USHORT)M_PENDATA->m_vStipple.GetId()
                 ::GpiSetBitmapId( M_PENDATA->m_hPen
                                  ,(USHORT)M_PENDATA->m_vStipple.GetHBITMAP()
                                  ,(USHORT)M_PENDATA->m_vStipple.GetId()
@@ -245,42 +305,42 @@ bool wxPen::RealizeResource()
                 flDefMask = ABB_REF_POINT;
                 break;
 
                 flDefMask = ABB_REF_POINT;
                 break;
 
-            case wxBDIAGONAL_HATCH:
+            case wxPENSTYLE_BDIAGONAL_HATCH:
                 m_vAreaBundle.usSymbol = PATSYM_DIAG3;
                 m_vAreaBundle.usSet = LCID_DEFAULT;
                 flAttrMask = ABB_COLOR | ABB_BACK_COLOR | ABB_MIX_MODE | ABB_BACK_MIX_MODE | ABB_SYMBOL;
                 flDefMask = ABB_SET | ABB_REF_POINT;
                 break;
 
                 m_vAreaBundle.usSymbol = PATSYM_DIAG3;
                 m_vAreaBundle.usSet = LCID_DEFAULT;
                 flAttrMask = ABB_COLOR | ABB_BACK_COLOR | ABB_MIX_MODE | ABB_BACK_MIX_MODE | ABB_SYMBOL;
                 flDefMask = ABB_SET | ABB_REF_POINT;
                 break;
 
-            case wxCROSSDIAG_HATCH:
+            case wxPENSTYLE_CROSSDIAG_HATCH:
                 m_vAreaBundle.usSymbol = PATSYM_DIAGHATCH;
                 m_vAreaBundle.usSet = LCID_DEFAULT;
                 flAttrMask = ABB_COLOR | ABB_BACK_COLOR | ABB_MIX_MODE | ABB_BACK_MIX_MODE | ABB_SYMBOL;
                 flDefMask = ABB_SET | ABB_REF_POINT;
                 break;
 
                 m_vAreaBundle.usSymbol = PATSYM_DIAGHATCH;
                 m_vAreaBundle.usSet = LCID_DEFAULT;
                 flAttrMask = ABB_COLOR | ABB_BACK_COLOR | ABB_MIX_MODE | ABB_BACK_MIX_MODE | ABB_SYMBOL;
                 flDefMask = ABB_SET | ABB_REF_POINT;
                 break;
 
-            case wxFDIAGONAL_HATCH:
+            case wxPENSTYLE_FDIAGONAL_HATCH:
                 m_vAreaBundle.usSymbol = PATSYM_DIAG1;
                 m_vAreaBundle.usSet = LCID_DEFAULT;
                 flAttrMask = ABB_COLOR | ABB_BACK_COLOR | ABB_MIX_MODE | ABB_BACK_MIX_MODE | ABB_SYMBOL;
                 flDefMask = ABB_SET | ABB_REF_POINT;
                 break;
 
                 m_vAreaBundle.usSymbol = PATSYM_DIAG1;
                 m_vAreaBundle.usSet = LCID_DEFAULT;
                 flAttrMask = ABB_COLOR | ABB_BACK_COLOR | ABB_MIX_MODE | ABB_BACK_MIX_MODE | ABB_SYMBOL;
                 flDefMask = ABB_SET | ABB_REF_POINT;
                 break;
 
-            case wxCROSS_HATCH:
+            case wxPENSTYLE_CROSS_HATCH:
                 m_vAreaBundle.usSymbol = PATSYM_HATCH;
                 m_vAreaBundle.usSet = LCID_DEFAULT;
                 flAttrMask = ABB_COLOR | ABB_BACK_COLOR | ABB_MIX_MODE | ABB_BACK_MIX_MODE | ABB_SYMBOL;
                 flDefMask = ABB_SET | ABB_REF_POINT;
                 break;
 
                 m_vAreaBundle.usSymbol = PATSYM_HATCH;
                 m_vAreaBundle.usSet = LCID_DEFAULT;
                 flAttrMask = ABB_COLOR | ABB_BACK_COLOR | ABB_MIX_MODE | ABB_BACK_MIX_MODE | ABB_SYMBOL;
                 flDefMask = ABB_SET | ABB_REF_POINT;
                 break;
 
-            case wxHORIZONTAL_HATCH:
+            case wxPENSTYLE_HORIZONTAL_HATCH:
                 m_vAreaBundle.usSymbol = PATSYM_HORIZ;
                 m_vAreaBundle.usSet = LCID_DEFAULT;
                 flAttrMask = ABB_COLOR | ABB_BACK_COLOR | ABB_MIX_MODE | ABB_BACK_MIX_MODE | ABB_SYMBOL;
                 flDefMask = ABB_SET | ABB_REF_POINT;
                 break;
 
                 m_vAreaBundle.usSymbol = PATSYM_HORIZ;
                 m_vAreaBundle.usSet = LCID_DEFAULT;
                 flAttrMask = ABB_COLOR | ABB_BACK_COLOR | ABB_MIX_MODE | ABB_BACK_MIX_MODE | ABB_SYMBOL;
                 flDefMask = ABB_SET | ABB_REF_POINT;
                 break;
 
-            case wxVERTICAL_HATCH:
+            case wxPENSTYLE_VERTICAL_HATCH:
                 m_vAreaBundle.usSymbol = PATSYM_VERT;
                 m_vAreaBundle.usSet = LCID_DEFAULT;
                 flAttrMask = ABB_COLOR | ABB_BACK_COLOR | ABB_MIX_MODE | ABB_BACK_MIX_MODE | ABB_SYMBOL;
                 m_vAreaBundle.usSymbol = PATSYM_VERT;
                 m_vAreaBundle.usSet = LCID_DEFAULT;
                 flAttrMask = ABB_COLOR | ABB_BACK_COLOR | ABB_MIX_MODE | ABB_BACK_MIX_MODE | ABB_SYMBOL;
@@ -310,7 +370,7 @@ bool wxPen::RealizeResource()
         {
             vError = ::WinGetLastError(vHabmain);
             sError = wxPMErrorToStr(vError);
         {
             vError = ::WinGetLastError(vHabmain);
             sError = wxPMErrorToStr(vError);
-            wxLogError(_T("Can't set Gpi attributes for an AREABUNDLE. Error: %s\n"), sError.c_str());
+            wxLogError(wxT("Can't set Gpi attributes for an AREABUNDLE. Error: %s\n"), sError.c_str());
         }
 
         return (bool)bOk;
         }
 
         return (bool)bOk;
@@ -348,7 +408,7 @@ wxGDIRefData* wxPen::CreateGDIRefData() const
 
 wxGDIRefData* wxPen::CloneGDIRefData(const wxGDIRefData* data) const
 {
 
 wxGDIRefData* wxPen::CloneGDIRefData(const wxGDIRefData* data) const
 {
-    return new wxPenRefData(*wx_static_cast(const wxPenRefData*, data));
+    return new wxPenRefData(*static_cast<const wxPenRefData*>(data));
 }
 
 void wxPen::SetColour( const wxColour& rColour )
 }
 
 void wxPen::SetColour( const wxColour& rColour )
@@ -398,7 +458,7 @@ void wxPen::SetStipple(
 {
     AllocExclusive();
     M_PENDATA->m_vStipple = rStipple;
 {
     AllocExclusive();
     M_PENDATA->m_vStipple = rStipple;
-    M_PENDATA->m_nStyle = wxSTIPPLE;
+    M_PENDATA->m_nStyle = wxPENSTYLE_STIPPLE;
     RealizeResource();
 } // end of wxPen::SetStipple
 
     RealizeResource();
 } // end of wxPen::SetStipple
 
@@ -428,6 +488,77 @@ void wxPen::SetCap(
     RealizeResource();
 } // end of wxPen::SetCap
 
     RealizeResource();
 } // end of wxPen::SetCap
 
+wxColour wxPen::GetColour() const
+{
+    wxCHECK_MSG( IsOk(), wxNullColour, wxT("invalid pen") );
+
+    return M_PENDATA->m_vColour;
+}
+
+int wxPen::GetWidth() const
+{
+    wxCHECK_MSG( IsOk(), -1, wxT("invalid pen") );
+
+    return M_PENDATA->m_nWidth;
+}
+
+wxPenStyle wxPen::GetStyle() const
+{
+    wxCHECK_MSG( IsOk(), wxPENSTYLE_INVALID, wxT("invalid pen") );
+
+    return M_PENDATA->m_nStyle;
+}
+
+wxPenJoin wxPen::GetJoin() const
+{
+    wxCHECK_MSG( IsOk(), wxJOIN_INVALID, wxT("invalid pen") );
+
+    return M_PENDATA->m_nJoin;
+}
+
+wxPenCap wxPen::GetCap() const
+{
+    wxCHECK_MSG( IsOk(), wxCAP_INVALID, wxT("invalid pen") );
+
+    return M_PENDATA->m_nCap;
+}
+
+int wxPen::GetPS() const
+{
+    wxCHECK_MSG( IsOk(), 0, wxT("invalid pen") );
+
+    return M_PENDATA->m_hPen;
+}
+
+int wxPen::GetDashes(wxDash** ptr) const
+{
+    wxCHECK_MSG( IsOk(), -1, wxT("invalid pen") );
+
+    *ptr = M_PENDATA->m_dash;
+    return M_PENDATA->m_nbDash;
+}
+
+wxDash* wxPen::GetDash() const
+{
+    wxCHECK_MSG( IsOk(), NULL, wxT("invalid pen") );
+
+    return M_PENDATA->m_dash;
+}
+
+int wxPen::GetDashCount() const
+{
+    wxCHECK_MSG( IsOk(), -1, wxT("invalid pen") );
+
+    return M_PENDATA->m_nbDash;
+}
+
+wxBitmap* wxPen::GetStipple() const
+{
+    wxCHECK_MSG( IsOk(), NULL, wxT("invalid pen") );
+
+    return &(M_PENDATA->m_vStipple);
+}
+
 int wx2os2PenStyle(
   wxPenStyle                               nWxStyle
 )
 int wx2os2PenStyle(
   wxPenStyle                               nWxStyle
 )
@@ -436,31 +567,31 @@ int wx2os2PenStyle(
 
     switch (nWxStyle)
     {
 
     switch (nWxStyle)
     {
-        case wxDOT:
+        case wxPENSTYLE_DOT:
             nPMStyle = LINETYPE_DOT;
             break;
 
             nPMStyle = LINETYPE_DOT;
             break;
 
-        case wxDOT_DASH:
+        case wxPENSTYLE_DOT_DASH:
             nPMStyle = LINETYPE_DASHDOT;
             break;
 
             nPMStyle = LINETYPE_DASHDOT;
             break;
 
-        case wxSHORT_DASH:
+        case wxPENSTYLE_SHORT_DASH:
             nPMStyle = LINETYPE_SHORTDASH;
             break;
 
             nPMStyle = LINETYPE_SHORTDASH;
             break;
 
-        case wxLONG_DASH:
+        case wxPENSTYLE_LONG_DASH:
             nPMStyle = LINETYPE_LONGDASH;
             break;
 
             nPMStyle = LINETYPE_LONGDASH;
             break;
 
-        case wxTRANSPARENT:
+        case wxPENSTYLE_TRANSPARENT:
             nPMStyle = LINETYPE_INVISIBLE;
             break;
 
             nPMStyle = LINETYPE_INVISIBLE;
             break;
 
-        case wxUSER_DASH:
+        case wxPENSTYLE_USER_DASH:
             nPMStyle = LINETYPE_DASHDOUBLEDOT; // We must make a choice... This is mine!
             break;
 
             nPMStyle = LINETYPE_DASHDOUBLEDOT; // We must make a choice... This is mine!
             break;
 
-        case wxSOLID:
+        case wxPENSTYLE_SOLID:
         default:
             nPMStyle = LINETYPE_SOLID;
             break;
         default:
             nPMStyle = LINETYPE_SOLID;
             break;