// Created: 10/12/99
// RCS-ID: $Id$
// Copyright: (c) David Webster
-// Licence: wxWindows license
+// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#ifndef WX_PRECOMP
#include "wx/window.h"
- #include "wx/msw/private.h"
+ #include "wx/os2/private.h"
#include "wx/font.h"
#include "wx/bitmap.h"
#include "wx/dcmemory.h"
#if wxUSE_OWNER_DRAWN
+#include "wx/settings.h"
#include "wx/ownerdrw.h"
#include "wx/menuitem.h"
{
wxMemoryDC vDC;
- vDC.SetFont(GetFont());
wxString sStr = wxStripMenuCodes(m_strName);
-#if 0
- wxString sTgt = "\t";
- size_t nIndex;
-
- nIndex = sStr.Find(sTgt.c_str());
- if (nIndex != -1)
- sStr.Remove(nIndex);
- sTgt = "~";
- nIndex = sStr.Find(sTgt.c_str());
- if (nIndex != -1)
- sStr.Replace(sTgt.c_str(), "", TRUE);
-#endif
+ //
+ // If we have a valid accel string, then pad out
+ // the menu string so the menu and accel string are not
+ // placed ontop of eachother.
+ if (!m_strAccel.empty() )
+ {
+ sStr.Pad(sStr.Length()%8);
+ sStr += m_strAccel;
+ }
+ vDC.SetFont(GetFont());
vDC.GetTextExtent( sStr
,(long *)pWidth
,(long *)pHeight
);
+ if (!m_strAccel.IsEmpty())
+ {
+ //
+ // Measure the accelerator string, and add it's width to
+ // the total item width, plus 16 (Accelerators are right justified,
+ // with the right edge of the text rectangle 16 pixels left of
+ // the right edge of the menu)
+ //
+ int nAccelWidth;
+ int nAccelHeight;
+
+ vDC.GetTextExtent( m_strAccel
+ ,&nAccelWidth
+ ,&nAccelHeight
+ );
+ *pWidth += nAccelWidth;
+ }
+
+ //
+ // Add space at the end of the menu for the submenu expansion arrow
+ // this will also allow offsetting the accel string from the right edge
+ //
+ *pWidth = (size_t)(*pWidth + GetDefaultMarginWidth() * 1.5);
+
+ //
+ // JACS: items still look too tightly packed, so adding 5 pixels.
+ //
+ (*pHeight) += 5;
+
+ //
+ // 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 nAdjustedHeight = m_bmpChecked.GetHeight() +
+ wxSystemSettings::GetMetric(wxSYS_EDGE_Y);
+ if (*pHeight < nAdjustedHeight)
+ *pHeight = nAdjustedHeight;
- (*pHeight) = (*pHeight) + 2;
- m_nHeight = *pHeight; // remember height for use in OnDrawItem
+ //
+ // Does BMP encroach on default check menu position?
+ //
+ size_t nAdjustedWidth = m_bmpChecked.GetWidth() +
+ (wxSystemSettings::GetMetric(wxSYS_EDGE_X) * 2);
+
+ //
+ // Do we need to widen margin to fit BMP?
+ //
+ if ((size_t)GetMarginWidth() < nAdjustedWidth)
+ SetMarginWidth(nAdjustedWidth);
+
+ //
+ // Add the size of the bitmap to our total size...
+ //
+ *pWidth += GetMarginWidth();
+ }
+
+ //
+ // Add the size of the bitmap to our total size - even if we don't have
+ // a bitmap we leave room for one...
+ //
+ *pWidth += GetMarginWidth();
+
+ //
+ // Make sure that this item is at least as
+ // tall as the user's system settings specify
+ //
+ if (*pHeight < m_nMinHeight)
+ *pHeight = m_nMinHeight;
+ m_nHeight = *pHeight; // remember height for use in OnDrawItem
return TRUE;
} // end of wxOwnerDrawn::OnMeasureItem
wxColour vColText;
COLORREF vRef;
RECTL vRect = {rRect.x + 4, rRect.y + 1, rRect.x + (rRect.width - 2), rRect.y + rRect.height};
- char zMsg[128];
+
+ memset(&vCbnd, 0, sizeof(CHARBUNDLE));
//
// Use default font if no font set
// Fall back to default colors if none explicitly specified
//
vRef = ::WinQuerySysColor( HWND_DESKTOP
- ,SYSCLR_MENU // we are using gray for all our window backgrounds in wxWindows
+ ,SYSCLR_MENU // we are using gray for all our window backgrounds in wxWidgets
,0L
);
vColBack.Set( GetRValue(vRef)
,GetBValue(vRef)
);
}
+
rDC.SetTextBackground(vColBack);
rDC.SetTextForeground(vColText);
rDC.SetBackgroundMode(wxTRANSPARENT);
+ vCbnd.lColor = vColText.GetPixel();
+ vCbnd.lBackColor = vColBack.GetPixel();
+ ::GpiSetAttrs( hPS
+ ,PRIM_CHAR
+ ,CBB_BACK_COLOR | CBB_COLOR
+ ,0
+ ,&vCbnd
+ );
+ ::GpiSetBackMix( hPS
+ ,BM_LEAVEALONE
+ );
//
// Paint the background
wxString sTgt = "\t";
wxString sFullString = m_strName; // need to save the original text
wxString sAccel;
- size_t nIndex;
+ int nIndex;
size_t nWidth;
size_t nCharWidth;
size_t nHeight;
,(long *)&nWidth
,(long *)&nHeight
);
- sTmp = sFullString[nIndex + 1];
+ sTmp = sFullString[(size_t)(nIndex + 1)];
rDC.GetTextExtent( sTmp
,(long *)&nCharWidth
,(long *)&nHeight
//
// Draw the main item text sans the accel text
- rDC.DrawText( sFullString
- ,nX
- ,rRect.y + 4
- );
+ //
+ POINTL vPntStart = {nX, rRect.y + 4};
+ ::GpiCharStringAt( rDC.GetHPS()
+ ,&vPntStart
+ ,sFullString.length()
+ ,(PCH)sFullString.c_str()
+ );
if (bFoundMneumonic)
{
//
// Underline the mneumonic -- still won't work, but at least it "looks" right
//
wxPen vPen;
- POINTL vPntStart = {nX + nWidth - 1, rRect.y + 2}; // Make it look pretty!
POINTL vPntEnd = {nX + nWidth + nCharWidth - 3, rRect.y + 2}; //CharWidth is bit wide
+ vPntStart.x = nX + nWidth - 1;
+ vPntStart.y = rRect.y + 2; // Make it look pretty!
vPen = wxPen(vColText, 1, wxSOLID); // Assuming we are always black
rDC.SetPen(vPen);
::GpiMove(hPS, &vPntStart);
//
// Back off the starting position from the right edge
//
- rDC.DrawText( sAccel
- ,rRect.width - (nWidth + 7) // this seems to mimic the default OS/2 positioning
- ,rRect.y + 4
- );
+ vPntStart.x = rRect.width - (nWidth + 7);
+ vPntStart.y = rRect.y + 4;
+ ::GpiCharStringAt( rDC.GetHPS()
+ ,&vPntStart
+ ,sAccel.length()
+ ,(PCH)sAccel.c_str()
+ );
}
//
vRect.xLeft = rRect.x;
vRect.xRight = rRect.x + GetMarginWidth();
vRect.yBottom = rRect.y;
- vRect.yTop = rRect.y + m_nHeight;
+ vRect.yTop = rRect.y + m_nHeight - 3;
::WinDrawBitmap( hPS // PS for this menuitem
,hBmpCheck // system checkmark
if (vBmp.Ok())
{
+
wxMemoryDC vDCMem(&rDC);
+ wxMemoryDC* pOldDC = (wxMemoryDC*)vBmp.GetSelectedInto();
+ if(pOldDC != NULL)
+ {
+ vBmp.SetSelectedInto(NULL);
+ }
vDCMem.SelectObject(vBmp);
//
//
wxASSERT((nBmpWidth <= rRect.width) && (nBmpHeight <= rRect.height));
- //
- //MT: blit with mask enabled.
- //
+ int nHeightDiff = m_nHeight - nBmpHeight;
+
rDC.Blit( rRect.x + (GetMarginWidth() - nBmpWidth) / 2
- ,rRect.y + (m_nHeight - nBmpHeight) /2
+ ,rRect.y + nHeightDiff / 2
,nBmpWidth
,nBmpHeight
,&vDCMem
if (eStatus & wxODSelected)
{
- RECT vRectBmp = { rRect.x
- ,rRect.y
- ,rRect.x + GetMarginWidth()
- ,rRect.y + m_nHeight
- };
+ POINTL vPnt1 = {rRect.x + 1, rRect.y + 3}; // Leave a little background border
+ POINTL vPnt2 = {rRect.x + GetMarginWidth(), rRect.y + m_nHeight - 3};
+
LINEBUNDLE vLine;
vLine.lColor = vColBack.GetPixel();
,0
,&vLine
);
+ ::GpiMove(hPS, &vPnt1);
::GpiBox( hPS
,DRO_OUTLINE
- ,(PPOINTL)&vRectBmp
+ ,&vPnt2
,0L
,0L
);
}
+ vBmp.SetSelectedInto(NULL);
}
}
return TRUE;