]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/ownerdrw.cpp
added xpmdecod.cpp
[wxWidgets.git] / src / msw / ownerdrw.cpp
index 8ea7c54e0f0fd5805a91dd95932abed06398aaa6..dc65344eef7805e83d85400970666596f156410e 100644 (file)
@@ -31,6 +31,7 @@
   #include "wx/utils.h"
 #endif
 
+#include "wx/settings.h"
 #include "wx/ownerdrw.h"
 #include "wx/menuitem.h"
 
@@ -51,6 +52,8 @@ wxOwnerDrawn::wxOwnerDrawn(const wxString& str,
   m_bOwnerDrawn  = FALSE;
   m_nHeight      = 0;
   m_nMarginWidth = ms_nLastMarginWidth;
+  if (wxNORMAL_FONT)
+    m_font = * wxNORMAL_FONT;
 }
 
 #if defined(__WXMSW__) && defined(__WIN32__) && defined(SM_CXMENUCHECK)
@@ -68,22 +71,44 @@ size_t wxOwnerDrawn::ms_nLastMarginWidth = ms_nDefaultMarginWidth;
 bool wxOwnerDrawn::OnMeasureItem(size_t *pwidth, size_t *pheight)
 {
   wxMemoryDC dc;
-  dc.SetFont(GetFont());
 
-  // ## ugly...
-  wxChar *szStripped = new wxChar[m_strName.Len()];
-  wxStripMenuCodes((wxChar *)m_strName.c_str(), szStripped);
-  wxString str = szStripped;
-  delete [] szStripped;
+  wxString str = wxStripMenuCodes(m_strName);
 
   // # without this menu items look too tightly packed (at least under Windows)
   str += wxT('W'); // 'W' is typically the widest letter
 
+  if (m_font.Ok())
+      dc.SetFont(GetFont());
+
   dc.GetTextExtent(str, (long *)pwidth, (long *)pheight);
 
   // JACS: items still look too tightly packed, so adding 2 pixels.
   (*pheight) = (*pheight) + 2;
 
+  // Ray Gilbert's changes - Corrects the problem of a BMP
+  // being placed next to text in a menu item, and the BMP does
+  // not match the size expected by the system.  This will 
+  // resize the space so the BMP will fit.  Without this, BMPs
+  // must be no larger or smaller than 16x16.
+  if (m_bmpChecked.Ok())
+  {
+      // Is BMP height larger then text height?
+      size_t adjustedHeight = m_bmpChecked.GetHeight() +
+                              wxSystemSettings::GetSystemMetric(wxSYS_EDGE_Y);
+      if (*pheight < adjustedHeight)
+          *pheight = adjustedHeight;
+      
+      // Does BMP encroach on default check menu position?
+      size_t adjustedWidth = m_bmpChecked.GetWidth() +
+                             (wxSystemSettings::GetSystemMetric(wxSYS_EDGE_X) * 2);
+      if (ms_nDefaultMarginWidth < adjustedWidth)
+          *pwidth += adjustedWidth - ms_nDefaultMarginWidth;
+      
+      // Do we need to widen margin to fit BMP?
+      if ((size_t)GetMarginWidth() < adjustedWidth)
+          SetMarginWidth(adjustedWidth);
+  }
+  
   m_nHeight = *pheight;                // remember height for use in OnDrawItem
 
   return TRUE;
@@ -224,9 +249,13 @@ bool wxOwnerDrawn::OnDrawItem(wxDC& dc, const wxRect& rc, wxODAction act, wxODSt
       // there should be enough place!
       wxASSERT((nBmpWidth <= rc.GetWidth()) && (nBmpHeight <= rc.GetHeight()));
 
+      int heightDiff = (m_nHeight - nBmpHeight);
+//      if (heightDiff = -1)
+//        heightDiff = -2;
+
       //MT: blit with mask enabled.
       dc.Blit(rc.x + (GetMarginWidth() - nBmpWidth) / 2, 
-              rc.y + (m_nHeight - nBmpHeight) /2, 
+              rc.y + heightDiff / 2, 
               nBmpWidth, nBmpHeight, 
               &dcMem, 0, 0, wxCOPY, TRUE);