]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/statbmp.cpp
guard against nullptr
[wxWidgets.git] / src / os2 / statbmp.cpp
index d06a109a0eadb887d5426915554fd09121007999..9a7f0985a39cc2601005a0ae7aa8877d58c3c153 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        statbmp.cpp
+// Name:        src/os2/statbmp.cpp
 // Purpose:     wxStaticBitmap
 // Author:      David Webster
 // Modified by:
@@ -9,52 +9,78 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-#pragma implementation "statbmp.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
-#include "wx/window.h"
-#include "wx/os2/private.h"
+#include "wx/statbmp.h"
 
 #ifndef WX_PRECOMP
     #include "wx/icon.h"
-    #include "wx/statbmp.h"
+    #include "wx/window.h"
+    #include "wx/dcclient.h"
 #endif
 
+#include "wx/os2/private.h"
+
 #include <stdio.h>
 
 // ---------------------------------------------------------------------------
-// macors
+// macros
 // ---------------------------------------------------------------------------
 
-IMPLEMENT_DYNAMIC_CLASS(wxStaticBitmap, wxControl)
+BEGIN_EVENT_TABLE(wxStaticBitmap, wxWindow)
+    EVT_PAINT(wxStaticBitmap::OnPaint)
+END_EVENT_TABLE()
+
+static wxGDIImage* ConvertImage(
+  const wxGDIImage&                 rBitmap
+)
+{
+    bool                            bIsIcon = rBitmap.IsKindOf( CLASSINFO(wxIcon) );
+
+    if(!bIsIcon )
+    {
+        wxASSERT_MSG( wxDynamicCast(&rBitmap, wxBitmap),
+                      wxT("not an icon and not a bitmap?") );
+
+        const wxBitmap&             rBmp = (const wxBitmap&)rBitmap;
+        wxMask*                     pMask = rBmp.GetMask();
+
+        if (pMask && pMask->GetMaskBitmap())
+        {
+            wxIcon*                 pIcon = new wxIcon;
+
+            pIcon->CopyFromBitmap(rBmp);
+            return pIcon;
+        }
+        return new wxBitmap(rBmp);
+    }
+
+    // copying a bitmap is a cheap operation
+    return new wxIcon( (const wxIcon&)rBitmap );
+} // end of ConvertImage
 
 // ---------------------------------------------------------------------------
 //  wxStaticBitmap
 // ---------------------------------------------------------------------------
 
-bool wxStaticBitmap::Create(
-  wxWindow*                         pParent
-, wxWindowID                        nId
-, const wxGDIImage&                 rBitmap
-, const wxPoint&                    rPos
-, const wxSize&                     rSize
-, long                              lStyle
-, const wxString&                   rName
-)
+bool wxStaticBitmap::Create( wxWindow*         pParent,
+                             wxWindowID        nId,
+                             const wxGDIImage& rBitmap,
+                             const wxPoint&    rPos,
+                             const wxSize&     WXUNUSED(rSize),
+                             long              lStyle,
+                             const wxString&   rName )
 {
+    ERRORID                         vError;
+    wxString                        sError;
+
     Init();
 
     SetName(rName);
     if (pParent)
         pParent->AddChild(this);
 
-    m_backgroundColour = pParent->GetBackgroundColour() ;
-    m_foregroundColour = pParent->GetForegroundColour() ;
-
     if (nId == -1)
         m_windowId = (int)NewControlId();
     else
@@ -64,20 +90,20 @@ bool wxStaticBitmap::Create(
 
     int                             nX= rPos.x;
     int                             nY = rPos.y;
-    int                             nWidth = rSize.x;
-    int                             nHeight = rSize.y;
+    char                            zId[16];
 
     m_windowStyle = lStyle;
 
     m_bIsIcon = rBitmap.IsKindOf(CLASSINFO(wxIcon));
 
-    // TODO: create static bitmap control
-    const wxChar*                   zClassname = wxT("WX_STATIC");
-    int                             nWinstyle = m_bIsIcon ? SS_ICON : SS_BITMAP;
+    //
+    // For now we only support an ICON
+    //
+    int                             nWinstyle = SS_ICON;
 
     m_hWnd = (WXHWND)::WinCreateWindow( pParent->GetHWND()
-                                       ,zClassname
-                                       ,wxT("")
+                                       ,(PSZ)wxCanvasClassName
+                                       ,zId
                                        ,nWinstyle | WS_VISIBLE
                                        ,0,0,0,0
                                        ,pParent->GetHWND()
@@ -86,88 +112,92 @@ bool wxStaticBitmap::Create(
                                        ,NULL
                                        ,NULL
                                       );
-
-    wxCHECK_MSG( m_hWnd, FALSE, wxT("Failed to create static bitmap") );
-
-    SetImage(rBitmap);
+    if (!m_hWnd)
+    {
+        vError = ::WinGetLastError(wxGetInstance());
+        sError = wxPMErrorToStr(vError);
+        return false;
+    }
+    wxCHECK_MSG( m_hWnd, false, wxT("Failed to create static bitmap") );
+    m_pImage = ConvertImage(rBitmap);
+    ::WinSendMsg(   m_hWnd,
+                    SM_SETHANDLE,
+                    MPFROMHWND(rBitmap.GetHandle()),
+                    (MPARAM)0);
 
     // Subclass again for purposes of dialog editing mode
     SubclassWin(m_hWnd);
-    SetFont(*wxSMALL_FONT);
-    SetSize(nX, nY, nWidth, nHeight);
-    return(FALSE);
-}
+    SetSize(nX, nY, m_pImage->GetWidth(), m_pImage->GetHeight());
+
+    return true;
+} // end of wxStaticBitmap::Create
 
 bool wxStaticBitmap::ImageIsOk() const
 {
-    return(m_pImage && m_pImage->Ok());
+    return(m_pImage && m_pImage->IsOk());
 }
 
 void wxStaticBitmap::Free()
 {
-    delete m_pImage;
-    m_pImage = NULL;
-}
+    wxDELETE(m_pImage);
+} // end of wxStaticBitmap::Free
 
 wxSize wxStaticBitmap::DoGetBestSize() const
 {
-    // reuse the current size (as wxWindow does) instead of using some
+    //
+    // Reuse the current size (as wxWindow does) instead of using some
     // arbitrary default size (as wxControl, our immediate base class, does)
+    //
     return wxWindow::DoGetBestSize();
 }
 
-void wxStaticBitmap::SetImage(
-  const wxGDIImage&                 rBitmap
-)
+void wxStaticBitmap::OnPaint ( wxPaintEvent& WXUNUSED(rEvent) )
 {
-    Free();
+    wxPaintDC vDc(this);
+    wxBitmap* pBitmap;
 
-    m_bIsIcon = rBitmap.IsKindOf(CLASSINFO(wxIcon));
-    if (m_bIsIcon)
-        m_pImage = new wxIcon((const wxIcon&)rBitmap);
-    else
-        m_pImage = new wxBitmap((const wxBitmap &)rBitmap);
+    if (m_pImage->IsKindOf(CLASSINFO(wxIcon)))
+    {
+        wxIcon*                     pIcon;
 
-    int                             nX;
-    int                             nY;
-    int                             nW;
-    int                             nH;
+        pIcon = wxDynamicCast(m_pImage, wxIcon);
+        pBitmap = new wxBitmap(*pIcon);
+        vDc.DrawBitmap(*pBitmap, 0, 0);
+        delete pBitmap;
+    }
+    else
+    {
+        pBitmap = wxDynamicCast(m_pImage, wxBitmap);
+        vDc.DrawBitmap(*pBitmap, 0, 0);
+    }
+} // end of wxStaticBitmap::OnPaint
 
-    GetPosition(&nX, &nY);
-    GetSize(&nW, &nH);
+void wxStaticBitmap::SetImage( const wxGDIImage& rBitmap )
+{
+    int nX = 0;
+    int nY = 0;
+    int nWidth = 0;
+    int nHeight = 0;
 
+    Free();
     ::WinSendMsg( GetHwnd()
                  ,SM_SETHANDLE
-                 ,MPFROMHWND(m_pImage->GetHandle())
+                 ,MPFROMHWND(rBitmap.GetHandle())
                  ,NULL
                 );
-    if (ImageIsOk())
-    {
-        int                         nWidth = rBitmap.GetWidth();
-        int                         nHeight = rBitmap.GetHeight();
+    m_pImage = ConvertImage(rBitmap);
 
-        if (nWidth && nHeight)
-        {
-            nW = nWidth;
-            nW = nHeight;
-
-            ::WinSetWindowPos( GetHwnd()
-                              ,HWND_TOP
-                              ,nX
-                              ,nY
-                              ,nWidth
-                              ,nHeight
-                              ,SWP_SIZE | SWP_MOVE | SWP_SHOW
-                             );
-        }
-    }
+    GetPosition(&nX, &nY);
+    GetSize(&nWidth, &nHeight);
+    // Convert to OS/2 coordinate system
+    nY = wxWindow::GetOS2ParentHeight(GetParent()) - nY - nHeight;
 
     RECTL                           vRect;
 
-    vRect.xLeft   = nW;
-    vRect.yTop    = nY;
-    vRect.xRight  = nX + nW;
-    vRect.yBottom = nY + nH;
+    vRect.xLeft   = nX;
+    vRect.yTop    = nY + nHeight;
+    vRect.xRight  = nX + nWidth;
+    vRect.yBottom = nY;
 
     ::WinInvalidateRect(GetHwndOf(GetParent()), &vRect, TRUE);
 }