///////////////////////////////////////////////////////////////////////////////
-// Name: msw/ownerdrw.cpp
+// Name: src/os2/ownerdrw.cpp
// Purpose: implementation of wxOwnerDrawn class
// Author: David Webster
// Modified by:
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
-#ifdef __GNUG__
-#pragma implementation
-#endif
-
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
+#if wxUSE_OWNER_DRAWN
+
#ifndef WX_PRECOMP
- #include "wx/window.h"
- #include "wx/os2/private.h"
- #include "wx/font.h"
- #include "wx/bitmap.h"
- #include "wx/dcmemory.h"
- #include "wx/menu.h"
- #include "wx/utils.h"
+ #include "wx/window.h"
+ #include "wx/os2/private.h"
+ #include "wx/font.h"
+ #include "wx/bitmap.h"
+ #include "wx/dcmemory.h"
+ #include "wx/menu.h"
+ #include "wx/utils.h"
+ #include "wx/settings.h"
+ #include "wx/menuitem.h"
#endif
-#if wxUSE_OWNER_DRAWN
-
-#include "wx/settings.h"
#include "wx/ownerdrw.h"
-#include "wx/menuitem.h"
-
+#include "wx/os2/dcclient.h"
// ============================================================================
// implementation of wxOwnerDrawn class
// ctor
// ----
//
-wxOwnerDrawn::wxOwnerDrawn(
- const wxString& rsStr
-, bool bCheckable
-, bool bMenuItem
-)
+wxOwnerDrawn::wxOwnerDrawn( const wxString& rsStr,
+ bool bCheckable,
+ bool WXUNUSED(bMenuItem) )
: m_strName(rsStr)
{
m_bCheckable = bCheckable;
- m_bOwnerDrawn = FALSE;
+ m_bOwnerDrawn = false;
m_nHeight = 0;
m_nMarginWidth = ms_nLastMarginWidth;
if (wxNORMAL_FONT)
m_font = *wxNORMAL_FONT;
} // end of wxOwnerDrawn::wxOwnerDrawn
+wxOwnerDrawn::~wxOwnerDrawn() { }
+
size_t wxOwnerDrawn::ms_nDefaultMarginWidth = 15;
size_t wxOwnerDrawn::ms_nLastMarginWidth = ms_nDefaultMarginWidth;
// -------
//
-bool wxOwnerDrawn::OnMeasureItem(
- size_t* pWidth
-, size_t* pHeight
-)
+bool wxOwnerDrawn::OnMeasureItem( size_t* pWidth,
+ size_t* pHeight )
{
- wxMemoryDC vDC;
-
+ wxMemoryDC vDC;
- wxString sStr = wxStripMenuCodes(m_strName);
+ wxString sStr = wxStripMenuCodes(m_strName);
//
// 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.
+ // the menu string so that the menu and accel string are not
+ // placed on top of each other.
if (!m_strAccel.empty() )
{
- sStr.Pad(sStr.Length()%8);
+ sStr.Pad(sStr.length()%8);
sStr += m_strAccel;
}
vDC.SetFont(GetFont());
vDC.GetTextExtent( sStr
- ,(long *)pWidth
- ,(long *)pHeight
+ ,(wxCoord *)pWidth
+ ,(wxCoord *)pHeight
);
- if (!m_strAccel.IsEmpty())
+ if (!m_strAccel.empty())
{
//
- // Measure the accelerator string, and add it's width to
+ // Measure the accelerator string, and add its 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)
}
//
- // 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
+ // 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);
// Make sure that this item is at least as
// tall as the user's system settings specify
//
- if (*pHeight < m_nMinHeight)
- *pHeight = m_nMinHeight;
+ const size_t heightStd = 6; // FIXME: get value from the system
+ if ( *pHeight < heightStd )
+ *pHeight = heightStd;
m_nHeight = *pHeight; // remember height for use in OnDrawItem
- return TRUE;
+ return true;
} // end of wxOwnerDrawn::OnMeasureItem
// draw the item
-bool wxOwnerDrawn::OnDrawItem(
- wxDC& rDC
-, const wxRect& rRect
-, wxODAction eAction
-, wxODStatus eStatus
-)
+bool wxOwnerDrawn::OnDrawItem( wxDC& rDC,
+ const wxRect& rRect,
+ wxODAction eAction,
+ wxODStatus eStatus )
{
//
// We do nothing on focus change
//
if (eAction == wxODFocusChanged )
- return TRUE;
+ return true;
//
// Select the font and draw the text
//
CHARBUNDLE vCbnd;
- HPS hPS= rDC.GetHPS();
+ wxPMDCImpl *impl = (wxPMDCImpl*) rDC.GetImpl();
+ HPS hPS= impl->GetHPS();
wxColour vColBack;
wxColour vColText;
COLORREF vRef;
}
//
- // Base on the status of the menu item pick the right colors
+ // Based on the status of the menu item, pick the right colors
//
if (eStatus & wxODSelected)
{
- wxColour vCol2("WHITE");
- vColBack.Set( (unsigned char)0
- ,(unsigned char)0
- ,(unsigned char)160
- ); // no dark blue in color table
- vColText = vCol2;
+ vRef = (ULONG)::WinQuerySysColor( HWND_DESKTOP
+ ,SYSCLR_MENUHILITEBGND
+ ,0L
+ );
+ vColBack.Set( GetRValue(vRef)
+ ,GetGValue(vRef)
+ ,GetBValue(vRef)
+ );
+ vRef = (ULONG)::WinQuerySysColor( HWND_DESKTOP
+ ,SYSCLR_MENUHILITE
+ ,0L
+ );
+ vColText.Set( GetRValue(vRef)
+ ,GetGValue(vRef)
+ ,GetBValue(vRef)
+ );
}
else if (eStatus & wxODDisabled)
{
//
// Unfortunately, unlike Win32, PM has no owner drawn specific text
// drawing methods like ::DrawState that can cleanly handle accel
- // pneumonics and deal, automatically, with various states, so we have
+ // mnemonics and deal, automatically, with various states, so we have
// to handle them ourselves. Notice Win32 can't handle \t in ownerdrawn
- // strings either. We cannot handle mneumonics either. We display
- // it, though, in hopes we can figure it out some day.
+ // strings either. We cannot handle mnemonics either. We display
+ // them, though, in the hope we can figure them out some day.
//
//
- // Display main text and accel text separately to allign better
+ // Display main text and accel text separately to align better
//
- wxString sTgt = "\t";
- wxString sFullString = m_strName; // need to save the original text
- wxString sAccel;
- int nIndex;
- size_t nWidth;
- size_t nCharWidth;
- size_t nHeight;
- bool bFoundMneumonic = FALSE;
- bool bFoundAccel = FALSE;
+ wxString sTgt = wxT("\t");
+ wxString sFullString = m_strName; // need to save the original text
+ wxString sAccel;
+ int nIndex;
+ size_t nWidth;
+ size_t nCharWidth;
+ size_t nHeight;
+ bool bFoundMnemonic = false;
+ bool bFoundAccel = false;
//
// Deal with the tab, extracting the Accel text
//
- nIndex = sFullString.Find(sTgt.c_str());
+ nIndex = sFullString.Find(sTgt);
if (nIndex != -1)
{
- bFoundAccel = TRUE;
+ bFoundAccel = true;
sAccel = sFullString.Mid(nIndex + 1);
sFullString.Remove(nIndex);
}
//
- // Deal with the mneumonic character
+ // Deal with the mnemonic character
//
- sTgt = "~";
- nIndex = sFullString.Find(sTgt.c_str());
+ sTgt = wxT("~");
+ nIndex = sFullString.Find(sTgt);
if (nIndex != -1)
{
- wxString sTmp = sFullString;
+ wxString sTmp = sFullString;
- bFoundMneumonic = TRUE;
+ bFoundMnemonic = true;
sTmp.Remove(nIndex);
rDC.GetTextExtent( sTmp
- ,(long *)&nWidth
- ,(long *)&nHeight
+ ,(wxCoord *)&nWidth
+ ,(wxCoord *)&nHeight
);
sTmp = sFullString[(size_t)(nIndex + 1)];
rDC.GetTextExtent( sTmp
- ,(long *)&nCharWidth
- ,(long *)&nHeight
+ ,(wxCoord *)&nCharWidth
+ ,(wxCoord *)&nHeight
);
- sFullString.Replace(sTgt.c_str(), "", TRUE);
+ sFullString.Replace(sTgt.c_str(), wxEmptyString, true);
}
//
// Draw the main item text sans the accel text
//
POINTL vPntStart = {nX, rRect.y + 4};
- ::GpiCharStringAt( rDC.GetHPS()
+ ::GpiCharStringAt( impl->GetHPS()
,&vPntStart
,sFullString.length()
- ,(PCH)sFullString.c_str()
+ ,sFullString.char_str()
);
- if (bFoundMneumonic)
+ if (bFoundMnemonic)
{
//
- // Underline the mneumonic -- still won't work, but at least it "looks" right
+ // Underline the mnemonic -- still won't work, but at least it "looks" right
//
wxPen vPen;
POINTL vPntEnd = {nX + nWidth + nCharWidth - 3, rRect.y + 2}; //CharWidth is bit wide
size_t nHeight;
rDC.GetTextExtent( sAccel
- ,(long *)&nWidth
- ,(long *)&nHeight
+ ,(wxCoord *)&nWidth
+ ,(wxCoord *)&nHeight
);
//
// Back off the starting position from the right edge
//
vPntStart.x = rRect.width - (nWidth + 7);
vPntStart.y = rRect.y + 4;
- ::GpiCharStringAt( rDC.GetHPS()
+ ::GpiCharStringAt( impl->GetHPS()
,&vPntStart
,sAccel.length()
- ,(PCH)sAccel.c_str()
+ ,sAccel.char_str()
);
}
//
// For uncheckable item we use only the 'checked' bitmap
//
- wxBitmap vBmp(GetBitmap(IsCheckable() ? ((eStatus & wxODChecked) != 0) : TRUE));
+ wxBitmap vBmp(GetBitmap(IsCheckable() ? ((eStatus & wxODChecked) != 0) : TRUE));
if (vBmp.Ok())
{
,0
,0
,wxCOPY
- ,TRUE
+ ,true
);
if (eStatus & wxODSelected)
vBmp.SetSelectedInto(NULL);
}
}
- return TRUE;
+ return true;
} // end of wxOwnerDrawn::OnDrawItem
#endif //wxUSE_OWNER_DRAWN