#pragma hdrstop
#endif
+#include "wx/univ/theme.h"
+
+#if wxUSE_THEME_WIN32
+
#ifndef WX_PRECOMP
#include "wx/timer.h"
#include "wx/intl.h"
#include "wx/window.h"
#include "wx/dcmemory.h"
+ #include "wx/dcclient.h"
#include "wx/button.h"
#include "wx/bmpbuttn.h"
#include "wx/notebook.h"
#include "wx/spinbutt.h"
#include "wx/artprov.h"
-#ifdef wxUSE_TOGGLEBTN
#include "wx/tglbtn.h"
-#endif // wxUSE_TOGGLEBTN
#include "wx/univ/scrtimer.h"
#include "wx/univ/stdrend.h"
#include "wx/univ/inpcons.h"
#include "wx/univ/inphand.h"
#include "wx/univ/colschem.h"
-#include "wx/univ/theme.h"
// ----------------------------------------------------------------------------
// constants
static const int BORDER_THICKNESS = 2;
-// the offset between the label and focus rect around it
-static const int FOCUS_RECT_OFFSET_X = 1;
-static const int FOCUS_RECT_OFFSET_Y = 1;
-
-static const int FRAME_BORDER_THICKNESS = 3;
-static const int RESIZEABLE_FRAME_BORDER_THICKNESS = 4;
-static const int FRAME_TITLEBAR_HEIGHT = 18;
-static const int FRAME_BUTTON_WIDTH = 16;
-static const int FRAME_BUTTON_HEIGHT = 14;
-
static const size_t NUM_STATUSBAR_GRIP_BANDS = 3;
static const size_t WIDTH_STATUSBAR_GRIP_BAND = 4;
static const size_t STATUSBAR_GRIP_SIZE =
class wxWin32Renderer : public wxStdRenderer
{
public:
- enum wxFrameButtonType
- {
- FrameButton_Close,
- FrameButton_Minimize,
- FrameButton_Maximize,
- FrameButton_Restore,
- FrameButton_Help,
- FrameButton_Max
- };
-
// ctor
wxWin32Renderer(const wxColourScheme *scheme);
int flags = 0, int style = 0);
#endif // wxUSE_STATUSBAR
- // titlebars
- virtual void DrawFrameTitleBar(wxDC& dc,
- const wxRect& rect,
- const wxString& title,
- const wxIcon& icon,
- int flags,
- int specialButton = 0,
- int specialButtonFlags = 0);
- virtual void DrawFrameBorder(wxDC& dc,
- const wxRect& rect,
- int flags);
- virtual void DrawFrameBackground(wxDC& dc,
- const wxRect& rect,
- int flags);
- virtual void DrawFrameTitle(wxDC& dc,
- const wxRect& rect,
- const wxString& title,
- int flags);
- virtual void DrawFrameIcon(wxDC& dc,
- const wxRect& rect,
- const wxIcon& icon,
- int flags);
- virtual void DrawFrameButton(wxDC& dc,
- wxCoord x, wxCoord y,
- int button,
- int flags = 0);
- virtual wxRect GetFrameClientArea(const wxRect& rect, int flags) const;
- virtual wxSize GetFrameTotalSize(const wxSize& clientSize, int flags) const;
- virtual wxSize GetFrameMinSize(int flags) const;
- virtual wxSize GetFrameIconSize() const;
- virtual int HitTestFrame(const wxRect& rect, const wxPoint& pt, int flags) const;
-
virtual void GetComboBitmaps(wxBitmap *bmpNormal,
wxBitmap *bmpFocus,
wxBitmap *bmpPressed,
virtual wxCoord GetCheckItemMargin() const
{ return 0; }
+#if wxUSE_TOOLBAR
virtual wxSize GetToolBarButtonSize(wxCoord *separator) const
{ if ( separator ) *separator = 5; return wxSize(16, 15); }
virtual wxSize GetToolBarMargin() const
{ return wxSize(4, 4); }
+#endif // wxUSE_TOOLBAR
#if wxUSE_TEXTCTRL
virtual wxRect GetTextTotalArea(const wxTextCtrl *text,
virtual wxBitmap GetRadioBitmap(int flags)
{ return GetIndicator(IndicatorType_Radio, flags); }
+ virtual wxBitmap GetFrameButtonBitmap(FrameButtonType type);
+
+#if wxUSE_SLIDER
+ // Fill the arguments with true or false if this slider has labels on
+ // left/right side (or top/bottom for horizontal sliders) respectively
+ static
+ void GetSliderLabelsSides(wxOrientation orient, long style,
+ bool *left, bool *right)
+ {
+ // should we draw ticks at all?
+ if ( !(style & wxSL_AUTOTICKS) )
+ {
+ *left =
+ *right = false;
+ return;
+ }
+
+ // should we draw them on both sides?
+ if ( style & wxSL_BOTH )
+ {
+ *left =
+ *right = true;
+ return;
+ }
+
+ // we draw them on one side only, determine which one
+ if ( ((style & wxSL_TOP) && (orient == wxHORIZONTAL)) ||
+ ((style & wxSL_LEFT) && (orient == wxVERTICAL)) )
+ {
+ *left = true;
+ *right = false;
+ }
+ else if ( ((style & wxSL_BOTTOM) && (orient == wxHORIZONTAL)) ||
+ ((style & wxSL_RIGHT) && (orient == wxVERTICAL)) )
+ {
+ *left = false;
+ *right = true;
+ }
+ else
+ {
+ wxFAIL_MSG( "inconsistent wxSlider flags" );
+
+ *left =
+ *right = false;
+ }
+ }
+#endif // wxUSE_SLIDER
+
private:
// the sizing parameters (TODO make them changeable)
wxSize m_sizeScrollbarArrow;
- wxFont m_titlebarFont;
-
// the checked and unchecked bitmaps for DrawCheckItemBitmap()
wxBitmap m_bmpCheckBitmaps[IndicatorStatus_Max];
[IndicatorState_MaxMenu]
[IndicatorStatus_Max];
- // standard defaults for m_bmpCheckBitmaps and m_bmpIndicators
+ // titlebar icons:
+ wxBitmap m_bmpFrameButtons[FrameButton_Max];
+
+ // standard defaults for the above bitmaps
static const char **ms_xpmChecked[IndicatorStatus_Max];
static const char **ms_xpmIndicators[IndicatorType_Max]
[IndicatorState_MaxMenu]
[IndicatorStatus_Max];
-
- // titlebar icons:
- wxBitmap m_bmpFrameButtons[FrameButton_Max];
+ static const char **ms_xpmFrameButtons[FrameButton_Max];
// first row is for the normal state, second - for the disabled
wxBitmap m_bmpArrows[Arrow_StateMax][Arrow_Max];
virtual bool HandleActivation(wxInputConsumer *consumer, bool activated);
#if wxUSE_MENUS
- void PopupSystemMenu(wxTopLevelWindow *window, const wxPoint& pos) const;
+ void PopupSystemMenu(wxTopLevelWindow *window) const;
#endif // wxUSE_MENUS
private:
// ----------------------------------------------------------------------------
// frame buttons bitmaps
-
static const char *frame_button_close_xpm[] = {
"12 10 2 1",
" c None",
-". c black",
+"X c black",
" ",
-" .. .. ",
-" .. .. ",
-" .... ",
-" .. ",
-" .... ",
-" .. .. ",
-" .. .. ",
+" XX XX ",
+" XX XX ",
+" XXXX ",
+" XX ",
+" XXXX ",
+" XX XX ",
+" XX XX ",
" ",
" "};
static const char *frame_button_help_xpm[] = {
"12 10 2 1",
" c None",
-". c #000000",
-" .... ",
-" .. .. ",
-" .. .. ",
-" .. ",
-" .. ",
-" .. ",
+"X c #000000",
+" XXXX ",
+" XX XX ",
+" XX XX ",
+" XX ",
+" XX ",
+" XX ",
" ",
-" .. ",
-" .. ",
+" XX ",
+" XX ",
" "};
static const char *frame_button_maximize_xpm[] = {
"12 10 2 1",
" c None",
-". c #000000",
-" ......... ",
-" ......... ",
-" . . ",
-" . . ",
-" . . ",
-" . . ",
-" . . ",
-" . . ",
-" ......... ",
+"X c #000000",
+" XXXXXXXXX ",
+" XXXXXXXXX ",
+" X X ",
+" X X ",
+" X X ",
+" X X ",
+" X X ",
+" X X ",
+" XXXXXXXXX ",
" "};
static const char *frame_button_minimize_xpm[] = {
"12 10 2 1",
" c None",
-". c #000000",
+"X c #000000",
" ",
" ",
" ",
" ",
" ",
" ",
-" ...... ",
-" ...... ",
+" XXXXXX ",
+" XXXXXX ",
" "};
static const char *frame_button_restore_xpm[] = {
"12 10 2 1",
" c None",
-". c #000000",
-" ...... ",
-" ...... ",
-" . . ",
-" ...... . ",
-" ...... . ",
-" . ... ",
-" . . ",
-" . . ",
-" ...... ",
+"X c #000000",
+" XXXXXX ",
+" XXXXXX ",
+" X X ",
+" XXXXXX X ",
+" XXXXXX X ",
+" X XXX ",
+" X X ",
+" X X ",
+" XXXXXX ",
" "};
+const char **wxWin32Renderer::ms_xpmFrameButtons[FrameButton_Max] =
+{
+ frame_button_close_xpm,
+ frame_button_minimize_xpm,
+ frame_button_maximize_xpm,
+ frame_button_restore_xpm,
+ frame_button_help_xpm,
+};
+
// menu bitmaps
static const char *checked_menu_xpm[] = {
{
delete m_renderer;
delete m_scheme;
- wxArtProvider::RemoveProvider(m_artProvider);
+ delete m_artProvider;
}
wxRenderer *wxWin32Theme::GetRenderer()
col = Get(CONTROL);
else
{
- if ( !col.Ok() )
+ if ( !col.IsOk() )
{
// doesn't depend on the state
col = Get(WINDOW);
}
#endif // wxUSE_TEXTCTRL
- if (!col.Ok())
+ if (!col.IsOk())
col = Get(CONTROL); // Most controls should be this colour, not WINDOW
}
else
// the colour set by the user should be used for the normal state
// and for the states for which we don't have any specific colours
- if ( !col.Ok() || (flags & wxCONTROL_PRESSED) != 0 )
+ if ( !col.IsOk() || (flags & wxCONTROL_PRESSED) != 0 )
{
#if wxUSE_SCROLLBAR
if ( wxDynamicCast(win, wxScrollBar) )
case TITLEBAR_ACTIVE_TEXT: return wxColour(GetSysColor(COLOR_CAPTIONTEXT));
case DESKTOP: return wxColour(0x808000);
+ case FRAME: return wxColour(GetSysColor(COLOR_APPWORKSPACE));
#else // !__WXMSW__
// use the standard Windows colours elsewhere
case WINDOW: return *wxWHITE;
case TITLEBAR_ACTIVE_TEXT:return *wxWHITE;
case DESKTOP: return wxColour(0x808000);
+ case FRAME: return wxColour(0x808080);
#endif // __WXMSW__
case GAUGE: return Get(HIGHLIGHT);
case MAX:
default:
- wxFAIL_MSG(_T("invalid standard colour"));
+ wxFAIL_MSG(wxT("invalid standard colour"));
return *wxBLACK;
}
}
// init data
m_sizeScrollbarArrow = wxSize(16, 16);
- m_titlebarFont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
- m_titlebarFont.SetWeight(wxFONTWEIGHT_BOLD);
-
// init the arrow bitmaps
static const size_t ARROW_WIDTH = 7;
static const size_t ARROW_LENGTH = 4;
m_bmpArrows[Arrow_Pressed][n] = m_bmpArrows[Arrow_Normal][n];
}
-
- // init the frame buttons bitmaps
- m_bmpFrameButtons[FrameButton_Close] = wxBitmap(frame_button_close_xpm);
- m_bmpFrameButtons[FrameButton_Minimize] = wxBitmap(frame_button_minimize_xpm);
- m_bmpFrameButtons[FrameButton_Maximize] = wxBitmap(frame_button_maximize_xpm);
- m_bmpFrameButtons[FrameButton_Restore] = wxBitmap(frame_button_restore_xpm);
- m_bmpFrameButtons[FrameButton_Help] = wxBitmap(frame_button_help_xpm);
}
bool wxWin32Renderer::AreScrollbarsInsideBorder() const
int indexAccel)
{
wxString label2;
- label2 << _T(' ') << label << _T(' ');
+ label2 << wxT(' ') << label << wxT(' ');
if ( indexAccel != -1 )
{
// adjust it as we prepended a space
int flags)
{
wxBitmap bmp;
- if ( bitmap.Ok() )
+ if ( bitmap.IsOk() )
{
bmp = bitmap;
}
? IndicatorStatus_Checked
: IndicatorStatus_Unchecked;
- if ( !m_bmpCheckBitmaps[i].Ok() )
+ if ( !m_bmpCheckBitmaps[i].IsOk() )
{
m_bmpCheckBitmaps[i] = wxBitmap(ms_xpmChecked[i]);
}
GetIndicatorsFromFlags(flags, indState, indStatus);
wxBitmap& bmp = m_bmpIndicators[indType][indState][indStatus];
- if ( !bmp.Ok() )
+ if ( !bmp.IsOk() )
{
const char **xpm = ms_xpmIndicators[indType][indState][indStatus];
if ( xpm )
{
int xpoint = (rect.GetLeft() + rect.GetRight() + 1 - bitmap.GetWidth()) / 2;
int ypoint = (rect.GetTop() + rect.GetBottom() + 1 - bitmap.GetHeight()) / 2;
- dc.DrawBitmap(bitmap, xpoint, ypoint);
+ dc.DrawBitmap(bitmap, xpoint, ypoint, bitmap.GetMask() != NULL);
}
}
else if (style == wxTOOL_STYLE_SEPARATOR)
switch ( dir )
{
default:
- wxFAIL_MSG(_T("invaild notebook tab orientation"));
+ wxFAIL_MSG(wxT("invaild notebook tab orientation"));
// fall through
case wxTOP:
wxOrientation orient,
long style) const
{
- bool transpose = (orient == wxVERTICAL);
- bool left = ((style & wxSL_AUTOTICKS) != 0) &
- (((style & wxSL_TOP) != 0) & !transpose |
- ((style & wxSL_LEFT) != 0) & transpose |
- ((style & wxSL_BOTH) != 0));
- bool right = ((style & wxSL_AUTOTICKS) != 0) &
- (((style & wxSL_BOTTOM) != 0) & !transpose |
- ((style & wxSL_RIGHT) != 0) & transpose |
- ((style & wxSL_BOTH) != 0));
+ bool left, right;
+ GetSliderLabelsSides(orient, style, &left, &right);
wxRect rect = rectOrig;
wxSize sizeThumb = GetSliderThumbSize (rect, lenThumb, orient);
- if (orient == wxHORIZONTAL) {
+ if (orient == wxHORIZONTAL)
+ {
rect.x += SLIDER_MARGIN;
if (left & right)
{
rect.width -= 2*SLIDER_MARGIN;
rect.height = 2*BORDER_THICKNESS;
}
- else
- { // == wxVERTICAL
+ else // == wxVERTICAL
+ {
rect.y += SLIDER_MARGIN;
if (left & right)
{
y1 y2
*/
- if (flags & wxCONTROL_FOCUSED) {
- DrawFocusRect(dc, rectOrig);
- }
+ if (flags & wxCONTROL_FOCUSED)
+ DrawFocusRect(NULL, dc, rectOrig);
wxRect rect = GetSliderShaftRect(rectOrig, lenThumb, orient, style);
DrawBackground(dc, wxNullColour, rect, flags);
- bool transpose = (orient == wxVERTICAL);
- bool left = ((style & wxSL_AUTOTICKS) != 0) &
- (((style & wxSL_TOP) != 0) & !transpose |
- ((style & wxSL_LEFT) != 0) & transpose) &
- ((style & wxSL_BOTH) == 0);
- bool right = ((style & wxSL_AUTOTICKS) != 0) &
- (((style & wxSL_BOTTOM) != 0) & !transpose |
- ((style & wxSL_RIGHT) != 0) & transpose) &
- ((style & wxSL_BOTH) == 0);
+ bool left, right;
+ GetSliderLabelsSides(orient, style, &left, &right);
- wxCoord sizeArrow = (transpose ? rect.height : rect.width) / 2;
- wxCoord c = ((transpose ? rect.height : rect.width) - 2*sizeArrow);
+ bool isVertical = orient == wxVERTICAL;
+
+ wxCoord sizeArrow = (isVertical ? rect.height : rect.width) / 2;
+ wxCoord c = ((isVertical ? rect.height : rect.width) - 2*sizeArrow);
wxCoord x1, x2, x3, y1, y2, y3, y4;
- x1 = (transpose ? rect.y : rect.x);
- x2 = (transpose ? rect.GetBottom() : rect.GetRight());
+ x1 = (isVertical ? rect.y : rect.x);
+ x2 = (isVertical ? rect.GetBottom() : rect.GetRight());
x3 = (x1-1+c) + sizeArrow;
- y1 = (transpose ? rect.x : rect.y);
- y2 = (transpose ? rect.GetRight() : rect.GetBottom());
+ y1 = (isVertical ? rect.x : rect.y);
+ y2 = (isVertical ? rect.GetRight() : rect.GetBottom());
y3 = (left ? (y1-1+c) + sizeArrow : y1);
y4 = (right ? (y2+1-c) - sizeArrow : y2);
dc.SetPen(m_penBlack);
- if (left) {
- DrawLine(dc, x3+1-c, y1, x2, y3, transpose);
+ if (left)
+ {
+ DrawLine(dc, x3+1-c, y1, x2, y3, isVertical);
}
- DrawLine(dc, x2, y3, x2, y4, transpose);
+ DrawLine(dc, x2, y3, x2, y4, isVertical);
if (right)
{
- DrawLine(dc, x3+1-c, y2, x2, y4, transpose);
+ DrawLine(dc, x3+1-c, y2, x2, y4, isVertical);
}
else
{
- DrawLine(dc, x1, y2, x2, y2, transpose);
+ DrawLine(dc, x1, y2, x2, y2, isVertical);
}
dc.SetPen(m_penDarkGrey);
- DrawLine(dc, x2-1, y3+1, x2-1, y4-1, transpose);
- if (right) {
- DrawLine(dc, x3+1-c, y2-1, x2-1, y4, transpose);
+ DrawLine(dc, x2-1, y3+1, x2-1, y4-1, isVertical);
+ if (right)
+ {
+ DrawLine(dc, x3+1-c, y2-1, x2-1, y4, isVertical);
}
else
{
- DrawLine(dc, x1+1, y2-1, x2-1, y2-1, transpose);
+ DrawLine(dc, x1+1, y2-1, x2-1, y2-1, isVertical);
}
dc.SetPen(m_penHighlight);
if (left)
{
- DrawLine(dc, x1, y3, x3, y1, transpose);
- DrawLine(dc, x3+1-c, y1+1, x2-1, y3, transpose);
+ DrawLine(dc, x1, y3, x3, y1, isVertical);
+ DrawLine(dc, x3+1-c, y1+1, x2-1, y3, isVertical);
}
else
{
- DrawLine(dc, x1, y1, x2, y1, transpose);
+ DrawLine(dc, x1, y1, x2, y1, isVertical);
}
- DrawLine(dc, x1, y3, x1, y4, transpose);
+ DrawLine(dc, x1, y3, x1, y4, isVertical);
if (right)
{
- DrawLine(dc, x1, y4, x3+c, y2+c, transpose);
+ DrawLine(dc, x1, y4, x3+c, y2+c, isVertical);
}
- if (flags & wxCONTROL_PRESSED) {
+ if (flags & wxCONTROL_PRESSED)
+ {
// TODO: MSW fills the entire area inside, not just the rect
wxRect rectInt = rect;
- if ( transpose )
+ if ( isVertical )
{
rectInt.SetLeft(y3);
rectInt.SetRight(y4);
}
rectInt.Deflate(2);
-#if !defined(__WXMGL__)
static const char *stipple_xpm[] = {
/* columns rows colors chars-per-pixel */
"2 2 2 1",
"w ",
" w",
};
-#else
- // VS: MGL can only do 8x8 stipple brushes
- static const char *stipple_xpm[] = {
- /* columns rows colors chars-per-pixel */
- "8 8 2 1",
- " c None",
- "w c white",
- /* pixels */
- "w w w w ",
- " w w w w",
- "w w w w ",
- " w w w w",
- "w w w w ",
- " w w w w",
- "w w w w ",
- " w w w w",
- };
-#endif
dc.SetBrush(wxBrush(stipple_xpm));
dc.SetTextForeground(wxSCHEME_COLOUR(m_scheme, SHADOW_HIGHLIGHT));
*/
// empty slider?
- if (end == start) return;
-
- bool transpose = (orient == wxVERTICAL);
- bool left = ((style & wxSL_AUTOTICKS) != 0) &
- (((style & wxSL_TOP) != 0) & !transpose |
- ((style & wxSL_LEFT) != 0) & transpose |
- ((style & wxSL_BOTH) != 0));
- bool right = ((style & wxSL_AUTOTICKS) != 0) &
- (((style & wxSL_BOTTOM) != 0) & !transpose |
- ((style & wxSL_RIGHT) != 0) & transpose |
- ((style & wxSL_BOTH) != 0));
+ if ( end == start )
+ return;
+
+ bool left, right;
+ GetSliderLabelsSides(orient, style, &left, &right);
+
+ bool isVertical = orient == wxVERTICAL;
// default thumb size
wxSize sizeThumb = GetSliderThumbSize (rect, 0, orient);
- wxCoord defaultLen = (transpose ? sizeThumb.x : sizeThumb.y);
+ wxCoord defaultLen = (isVertical ? sizeThumb.x : sizeThumb.y);
// normal thumb size
sizeThumb = GetSliderThumbSize (rect, lenThumb, orient);
- wxCoord widthThumb = (transpose ? sizeThumb.y : sizeThumb.x);
+ wxCoord widthThumb = (isVertical ? sizeThumb.y : sizeThumb.x);
wxRect rectShaft = GetSliderShaftRect (rect, lenThumb, orient, style);
wxCoord x1, x2, y1, y2, y3, y4 , len;
- x1 = (transpose ? rectShaft.y : rectShaft.x) + widthThumb/2;
- x2 = (transpose ? rectShaft.GetBottom() : rectShaft.GetRight()) - widthThumb/2;
- y1 = (transpose ? rectShaft.x : rectShaft.y) - defaultLen/2;
- y2 = (transpose ? rectShaft.GetRight() : rectShaft.GetBottom()) + defaultLen/2;
- y3 = (transpose ? rect.x : rect.y);
- y4 = (transpose ? rect.GetRight() : rect.GetBottom());
+ x1 = (isVertical ? rectShaft.y : rectShaft.x) + widthThumb/2;
+ x2 = (isVertical ? rectShaft.GetBottom() : rectShaft.GetRight()) - widthThumb/2;
+ y1 = (isVertical ? rectShaft.x : rectShaft.y) - defaultLen/2;
+ y2 = (isVertical ? rectShaft.GetRight() : rectShaft.GetBottom()) + defaultLen/2;
+ y3 = (isVertical ? rect.x : rect.y);
+ y4 = (isVertical ? rect.GetRight() : rect.GetBottom());
len = x2 - x1;
dc.SetPen(m_penBlack);
int range = end - start;
- for ( int n = 0; n < range; n += step ) {
+ for ( int n = 0; n < range; n += step )
+ {
wxCoord x = x1 + (len*n) / range;
- if (left & (y1 > y3)) {
+ if (left & (y1 > y3))
+ {
DrawLine(dc, x, y1, x, y3, orient == wxVERTICAL);
}
- if (right & (y4 > y2)) {
+ if (right & (y4 > y2))
+ {
DrawLine(dc, x, y2, x, y4, orient == wxVERTICAL);
}
}
// always draw the line at the end position
- if (left & (y1 > y3)) {
+ if (left & (y1 > y3))
+ {
DrawLine(dc, x2, y1, x2, y3, orient == wxVERTICAL);
}
- if (right & (y4 > y2)) {
+ if (right & (y4 > y2))
+ {
DrawLine(dc, x2, y2, x2, y4, orient == wxVERTICAL);
}
}
// draw the bitmap: use the bitmap provided or the standard checkmark for
// the checkable items
wxBitmap bmp = bitmap;
- if ( !bmp.Ok() && (flags & wxCONTROL_CHECKED) )
+ if ( !bmp.IsOk() && (flags & wxCONTROL_CHECKED) )
{
bmp = GetIndicator(IndicatorType_Menu, flags);
}
- if ( bmp.Ok() )
+ if ( bmp.IsOk() )
{
rect.SetRight(geometryInfo.GetLabelOffset());
wxControlRenderer::DrawBitmap(dc, bmp, rect);
h = heightText;
wxCoord widthLabel;
- dc.GetTextExtent(item->GetLabel(), &widthLabel, NULL);
+ dc.GetTextExtent(item->GetItemLabelText(), &widthLabel, NULL);
if ( widthLabel > widthLabelMax )
{
widthLabelMax = widthLabel;
}
const wxBitmap& bmp = item->GetBitmap();
- if ( bmp.Ok() )
+ if ( bmp.IsOk() )
{
wxCoord widthBmp = bmp.GetWidth();
if ( widthBmp > widthBmpMax )
DrawBackground(dc, m_scheme->Get(col), rectBar);
}
-// ----------------------------------------------------------------------------
-// top level windows
-// ----------------------------------------------------------------------------
-
-int wxWin32Renderer::HitTestFrame(const wxRect& rect, const wxPoint& pt, int flags) const
-{
- wxRect client = GetFrameClientArea(rect, flags);
-
- if ( client.Contains(pt) )
- return wxHT_TOPLEVEL_CLIENT_AREA;
-
- if ( flags & wxTOPLEVEL_TITLEBAR )
- {
- wxRect client = GetFrameClientArea(rect, flags & ~wxTOPLEVEL_TITLEBAR);
-
- if ( flags & wxTOPLEVEL_ICON )
- {
- if ( wxRect(client.GetPosition(), GetFrameIconSize()).Contains(pt) )
- return wxHT_TOPLEVEL_ICON;
- }
-
- wxRect btnRect(client.GetRight() - 2 - FRAME_BUTTON_WIDTH,
- client.GetTop() + (FRAME_TITLEBAR_HEIGHT-FRAME_BUTTON_HEIGHT)/2,
- FRAME_BUTTON_WIDTH, FRAME_BUTTON_HEIGHT);
-
- if ( flags & wxTOPLEVEL_BUTTON_CLOSE )
- {
- if ( btnRect.Contains(pt) )
- return wxHT_TOPLEVEL_BUTTON_CLOSE;
- btnRect.x -= FRAME_BUTTON_WIDTH + 2;
- }
- if ( flags & wxTOPLEVEL_BUTTON_MAXIMIZE )
- {
- if ( btnRect.Contains(pt) )
- return wxHT_TOPLEVEL_BUTTON_MAXIMIZE;
- btnRect.x -= FRAME_BUTTON_WIDTH;
- }
- if ( flags & wxTOPLEVEL_BUTTON_RESTORE )
- {
- if ( btnRect.Contains(pt) )
- return wxHT_TOPLEVEL_BUTTON_RESTORE;
- btnRect.x -= FRAME_BUTTON_WIDTH;
- }
- if ( flags & wxTOPLEVEL_BUTTON_ICONIZE )
- {
- if ( btnRect.Contains(pt) )
- return wxHT_TOPLEVEL_BUTTON_ICONIZE;
- btnRect.x -= FRAME_BUTTON_WIDTH;
- }
- if ( flags & wxTOPLEVEL_BUTTON_HELP )
- {
- if ( btnRect.Contains(pt) )
- return wxHT_TOPLEVEL_BUTTON_HELP;
- btnRect.x -= FRAME_BUTTON_WIDTH;
- }
-
- if ( pt.y >= client.y && pt.y < client.y + FRAME_TITLEBAR_HEIGHT )
- return wxHT_TOPLEVEL_TITLEBAR;
- }
-
- if ( (flags & wxTOPLEVEL_BORDER) && !(flags & wxTOPLEVEL_MAXIMIZED) )
- {
- // we are certainly at one of borders, lets decide which one:
-
- int border = 0;
- // dirty trick, relies on the way wxHT_TOPLEVEL_XXX are defined!
- if ( pt.x < client.x )
- border |= wxHT_TOPLEVEL_BORDER_W;
- else if ( pt.x >= client.width + client.x )
- border |= wxHT_TOPLEVEL_BORDER_E;
- if ( pt.y < client.y )
- border |= wxHT_TOPLEVEL_BORDER_N;
- else if ( pt.y >= client.height + client.y )
- border |= wxHT_TOPLEVEL_BORDER_S;
- return border;
- }
-
- return wxHT_NOWHERE;
-}
-
-void wxWin32Renderer::DrawFrameTitleBar(wxDC& dc,
- const wxRect& rect,
- const wxString& title,
- const wxIcon& icon,
- int flags,
- int specialButton,
- int specialButtonFlags)
-{
- if ( (flags & wxTOPLEVEL_BORDER) && !(flags & wxTOPLEVEL_MAXIMIZED) )
- {
- DrawFrameBorder(dc, rect, flags);
- }
- if ( flags & wxTOPLEVEL_TITLEBAR )
- {
- DrawFrameBackground(dc, rect, flags);
- if ( flags & wxTOPLEVEL_ICON )
- DrawFrameIcon(dc, rect, icon, flags);
- DrawFrameTitle(dc, rect, title, flags);
-
- wxRect client = GetFrameClientArea(rect, flags & ~wxTOPLEVEL_TITLEBAR);
- wxCoord x,y;
- x = client.GetRight() - 2 - FRAME_BUTTON_WIDTH;
- y = client.GetTop() + (FRAME_TITLEBAR_HEIGHT-FRAME_BUTTON_HEIGHT)/2;
-
- if ( flags & wxTOPLEVEL_BUTTON_CLOSE )
- {
- DrawFrameButton(dc, x, y, wxTOPLEVEL_BUTTON_CLOSE,
- (specialButton == wxTOPLEVEL_BUTTON_CLOSE) ?
- specialButtonFlags : 0);
- x -= FRAME_BUTTON_WIDTH + 2;
- }
- if ( flags & wxTOPLEVEL_BUTTON_MAXIMIZE )
- {
- DrawFrameButton(dc, x, y, wxTOPLEVEL_BUTTON_MAXIMIZE,
- (specialButton == wxTOPLEVEL_BUTTON_MAXIMIZE) ?
- specialButtonFlags : 0);
- x -= FRAME_BUTTON_WIDTH;
- }
- if ( flags & wxTOPLEVEL_BUTTON_RESTORE )
- {
- DrawFrameButton(dc, x, y, wxTOPLEVEL_BUTTON_RESTORE,
- (specialButton == wxTOPLEVEL_BUTTON_RESTORE) ?
- specialButtonFlags : 0);
- x -= FRAME_BUTTON_WIDTH;
- }
- if ( flags & wxTOPLEVEL_BUTTON_ICONIZE )
- {
- DrawFrameButton(dc, x, y, wxTOPLEVEL_BUTTON_ICONIZE,
- (specialButton == wxTOPLEVEL_BUTTON_ICONIZE) ?
- specialButtonFlags : 0);
- x -= FRAME_BUTTON_WIDTH;
- }
- if ( flags & wxTOPLEVEL_BUTTON_HELP )
- {
- DrawFrameButton(dc, x, y, wxTOPLEVEL_BUTTON_HELP,
- (specialButton == wxTOPLEVEL_BUTTON_HELP) ?
- specialButtonFlags : 0);
- }
- }
-}
-
-void wxWin32Renderer::DrawFrameBorder(wxDC& dc,
- const wxRect& rect,
- int flags)
-{
- if ( !(flags & wxTOPLEVEL_BORDER) ) return;
-
- wxRect r(rect);
-
- DrawShadedRect(dc, &r, m_penLightGrey, m_penBlack);
- DrawShadedRect(dc, &r, m_penHighlight, m_penDarkGrey);
- DrawShadedRect(dc, &r, m_penLightGrey, m_penLightGrey);
- if ( flags & wxTOPLEVEL_RESIZEABLE )
- DrawShadedRect(dc, &r, m_penLightGrey, m_penLightGrey);
-}
-
-void wxWin32Renderer::DrawFrameBackground(wxDC& dc,
- const wxRect& rect,
- int flags)
-{
- if ( !(flags & wxTOPLEVEL_TITLEBAR) ) return;
-
- wxColour col = (flags & wxTOPLEVEL_ACTIVE) ?
- wxSCHEME_COLOUR(m_scheme, TITLEBAR_ACTIVE) :
- wxSCHEME_COLOUR(m_scheme, TITLEBAR);
-
- wxRect r = GetFrameClientArea(rect, flags & ~wxTOPLEVEL_TITLEBAR);
- r.height = FRAME_TITLEBAR_HEIGHT;
-
- DrawBackground(dc, col, r);
-}
-
-void wxWin32Renderer::DrawFrameTitle(wxDC& dc,
- const wxRect& rect,
- const wxString& title,
- int flags)
-{
- wxColour col = (flags & wxTOPLEVEL_ACTIVE) ?
- wxSCHEME_COLOUR(m_scheme, TITLEBAR_ACTIVE_TEXT) :
- wxSCHEME_COLOUR(m_scheme, TITLEBAR_TEXT);
-
- wxRect r = GetFrameClientArea(rect, flags & ~wxTOPLEVEL_TITLEBAR);
- r.height = FRAME_TITLEBAR_HEIGHT;
- if ( flags & wxTOPLEVEL_ICON )
- {
- r.x += FRAME_TITLEBAR_HEIGHT;
- r.width -= FRAME_TITLEBAR_HEIGHT + 2;
- }
- else
- {
- r.x += 1;
- r.width -= 3;
- }
-
- if ( flags & wxTOPLEVEL_BUTTON_CLOSE )
- r.width -= FRAME_BUTTON_WIDTH + 2;
- if ( flags & wxTOPLEVEL_BUTTON_MAXIMIZE )
- r.width -= FRAME_BUTTON_WIDTH;
- if ( flags & wxTOPLEVEL_BUTTON_RESTORE )
- r.width -= FRAME_BUTTON_WIDTH;
- if ( flags & wxTOPLEVEL_BUTTON_ICONIZE )
- r.width -= FRAME_BUTTON_WIDTH;
- if ( flags & wxTOPLEVEL_BUTTON_HELP )
- r.width -= FRAME_BUTTON_WIDTH;
-
- dc.SetFont(m_titlebarFont);
- dc.SetTextForeground(col);
-
- wxCoord textW;
- dc.GetTextExtent(title, &textW, NULL);
- if ( textW > r.width )
- {
- // text is too big, let's shorten it and add "..." after it:
- size_t len = title.length();
- wxCoord WSoFar, letterW;
-
- dc.GetTextExtent(wxT("..."), &WSoFar, NULL);
- if ( WSoFar > r.width )
- {
- // not enough space to draw anything
- return;
- }
-
- wxString s;
- s.Alloc(len);
- for (size_t i = 0; i < len; i++)
- {
- dc.GetTextExtent(title[i], &letterW, NULL);
- if ( letterW + WSoFar > r.width )
- break;
- WSoFar += letterW;
- s << title[i];
- }
- s << wxT("...");
- dc.DrawLabel(s, wxNullBitmap, r,
- wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL);
- }
- else
- dc.DrawLabel(title, wxNullBitmap, r,
- wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL);
-}
-
-void wxWin32Renderer::DrawFrameIcon(wxDC& dc,
- const wxRect& rect,
- const wxIcon& icon,
- int flags)
-{
- if ( icon.Ok() )
- {
- wxRect r = GetFrameClientArea(rect, flags & ~wxTOPLEVEL_TITLEBAR);
- dc.DrawIcon(icon, r.x, r.y);
- }
-}
-
-void wxWin32Renderer::DrawFrameButton(wxDC& dc,
- wxCoord x, wxCoord y,
- int button,
- int flags)
-{
- wxRect r(x, y, FRAME_BUTTON_WIDTH, FRAME_BUTTON_HEIGHT);
-
- size_t idx = 0;
- switch (button)
- {
- case wxTOPLEVEL_BUTTON_CLOSE: idx = FrameButton_Close; break;
- case wxTOPLEVEL_BUTTON_MAXIMIZE: idx = FrameButton_Maximize; break;
- case wxTOPLEVEL_BUTTON_ICONIZE: idx = FrameButton_Minimize; break;
- case wxTOPLEVEL_BUTTON_RESTORE: idx = FrameButton_Restore; break;
- case wxTOPLEVEL_BUTTON_HELP: idx = FrameButton_Help; break;
- default:
- wxFAIL_MSG(wxT("incorrect button specification"));
- }
-
- if ( flags & wxCONTROL_PRESSED )
- {
- DrawShadedRect(dc, &r, m_penBlack, m_penHighlight);
- DrawShadedRect(dc, &r, m_penDarkGrey, m_penLightGrey);
- DrawBackground(dc, wxSCHEME_COLOUR(m_scheme, CONTROL), r);
- dc.DrawBitmap(m_bmpFrameButtons[idx], r.x+1, r.y+1, true);
- }
- else
- {
- DrawShadedRect(dc, &r, m_penHighlight, m_penBlack);
- DrawShadedRect(dc, &r, m_penLightGrey, m_penDarkGrey);
- DrawBackground(dc, wxSCHEME_COLOUR(m_scheme, CONTROL), r);
- dc.DrawBitmap(m_bmpFrameButtons[idx], r.x, r.y, true);
- }
-}
-
-
-wxRect wxWin32Renderer::GetFrameClientArea(const wxRect& rect,
- int flags) const
-{
- wxRect r(rect);
-
- if ( (flags & wxTOPLEVEL_BORDER) && !(flags & wxTOPLEVEL_MAXIMIZED) )
- {
- int border = (flags & wxTOPLEVEL_RESIZEABLE) ?
- RESIZEABLE_FRAME_BORDER_THICKNESS :
- FRAME_BORDER_THICKNESS;
- r.Inflate(-border);
- }
- if ( flags & wxTOPLEVEL_TITLEBAR )
- {
- r.y += FRAME_TITLEBAR_HEIGHT;
- r.height -= FRAME_TITLEBAR_HEIGHT;
- }
-
- return r;
-}
-
-wxSize wxWin32Renderer::GetFrameTotalSize(const wxSize& clientSize,
- int flags) const
-{
- wxSize s(clientSize);
-
- if ( (flags & wxTOPLEVEL_BORDER) && !(flags & wxTOPLEVEL_MAXIMIZED) )
- {
- int border = (flags & wxTOPLEVEL_RESIZEABLE) ?
- RESIZEABLE_FRAME_BORDER_THICKNESS :
- FRAME_BORDER_THICKNESS;
- s.x += 2*border;
- s.y += 2*border;
- }
- if ( flags & wxTOPLEVEL_TITLEBAR )
- s.y += FRAME_TITLEBAR_HEIGHT;
-
- return s;
-}
-
-wxSize wxWin32Renderer::GetFrameMinSize(int flags) const
-{
- wxSize s;
-
- if ( (flags & wxTOPLEVEL_BORDER) && !(flags & wxTOPLEVEL_MAXIMIZED) )
- {
- int border = (flags & wxTOPLEVEL_RESIZEABLE) ?
- RESIZEABLE_FRAME_BORDER_THICKNESS :
- FRAME_BORDER_THICKNESS;
- s.x += 2*border;
- s.y += 2*border;
- }
-
- if ( flags & wxTOPLEVEL_TITLEBAR )
- {
- s.y += FRAME_TITLEBAR_HEIGHT;
-
- if ( flags & wxTOPLEVEL_ICON )
- s.x += FRAME_TITLEBAR_HEIGHT + 2;
- if ( flags & wxTOPLEVEL_BUTTON_CLOSE )
- s.x += FRAME_BUTTON_WIDTH + 2;
- if ( flags & wxTOPLEVEL_BUTTON_MAXIMIZE )
- s.x += FRAME_BUTTON_WIDTH;
- if ( flags & wxTOPLEVEL_BUTTON_RESTORE )
- s.x += FRAME_BUTTON_WIDTH;
- if ( flags & wxTOPLEVEL_BUTTON_ICONIZE )
- s.x += FRAME_BUTTON_WIDTH;
- if ( flags & wxTOPLEVEL_BUTTON_HELP )
- s.x += FRAME_BUTTON_WIDTH;
- }
-
- return s;
-}
-
-wxSize wxWin32Renderer::GetFrameIconSize() const
-{
- return wxSize(16, 16);
-}
-
-
// ----------------------------------------------------------------------------
// standard icons
// ----------------------------------------------------------------------------
/* Copyright (c) Julian Smart */
-static char *error_xpm[]={
+static const char *error_xpm[]={
/* columns rows colors chars-per-pixel */
"32 32 70 1",
"- c #BF0101",
};
/* Copyright (c) Julian Smart */
-static char *info_xpm[]={
+static const char *info_xpm[]={
/* columns rows colors chars-per-pixel */
"32 32 17 1",
"* c #A1A3FB",
};
/* Copyright (c) Julian Smart */
-static char *question_xpm[]={
+static const char *question_xpm[]={
/* columns rows colors chars-per-pixel */
"32 32 16 1",
"O c #A3A3FF",
};
/* Copyright (c) Julian Smart */
-static char *warning_xpm[]={
+static const char *warning_xpm[]={
/* columns rows colors chars-per-pixel */
"32 32 9 1",
"@ c Black",
#if wxUSE_SCROLLBAR
if ( wxDynamicCast(window, wxScrollBar) )
{
- // we only set the width of vert scrollbars and height of the
- // horizontal ones
- if ( window->GetWindowStyle() & wxSB_HORIZONTAL )
- size->y = m_sizeScrollbarArrow.y;
- else
- size->x = m_sizeScrollbarArrow.x;
-
- // skip border width adjustments, they don't make sense for us
+ /*
+ Don't adjust the size for a scrollbar as its DoGetBestClientSize
+ already has the correct size set. Any size changes here would get
+ added to the best size, making the scrollbar larger.
+ Also skip border width adjustments, they don't make sense for us.
+ */
return;
}
#endif // wxUSE_SCROLLBAR
wxStdRenderer::AdjustSize(size, window);
}
+wxBitmap wxWin32Renderer::GetFrameButtonBitmap(FrameButtonType type)
+{
+ wxBitmap& bmp = m_bmpFrameButtons[type];
+ if ( !bmp.IsOk() )
+ {
+ bmp = wxBitmap(ms_xpmFrameButtons[type]);
+ }
+
+ return bmp;
+}
+
// ============================================================================
// wxInputHandler
// ============================================================================
// clicking on the control gives it focus
if ( event.ButtonDown() )
{
- wxWindow *win = control->GetInputWindow();
+ wxWindow * const win = control->GetInputWindow();
- if ( (wxWindow::FindFocus() != control->GetInputWindow()) &&
- win->AcceptsFocus() )
+ if ( win->CanAcceptFocus() && wxWindow::FindFocus() != win )
{
win->SetFocus();
bool stop = false;
if ( action == wxACTION_SCROLL_PAGE_DOWN )
{
- stop = m_renderer->HitTestScrollbar(scrollbar, m_ptStartScrolling)
- != wxHT_SCROLLBAR_BAR_2;
+ stop = scrollbar->HitTestBar(m_ptStartScrolling) != wxHT_SCROLLBAR_BAR_2;
}
else if ( action == wxACTION_SCROLL_PAGE_UP )
{
- stop = m_renderer->HitTestScrollbar(scrollbar, m_ptStartScrolling)
- != wxHT_SCROLLBAR_BAR_1;
+ stop = scrollbar->HitTestBar(m_ptStartScrolling) != wxHT_SCROLLBAR_BAR_1;
}
if ( stop )
return false;
}
- ht = m_renderer->HitTestScrollbar(scrollbar, event.GetPosition());
+ ht = scrollbar->HitTestBar(event.GetPosition());
if ( ht == m_htLast )
{
// yes it did, resume scrolling
// Always let thumb jump back if we leave the scrollbar
if ( event.Moving() )
{
- ht = m_renderer->HitTestScrollbar(scrollbar, event.GetPosition());
+ ht = scrollbar->HitTestBar(event.GetPosition());
}
else // event.Leaving()
{
if (pos.y > -40 && pos.y < scrollbar->GetSize().y+40)
pos.y = 5;
}
- ht = m_renderer->HitTestScrollbar(scrollbar, pos );
+ ht = scrollbar->HitTestBar(pos);
#endif
// if we're dragging the thumb and the mouse stays in the scrollbar, it
parentTLW = wxDynamicCast(statbar->GetParent(), wxTopLevelWindow);
wxCHECK_MSG( parentTLW, false,
- _T("the status bar should be a child of a TLW") );
+ wxT("the status bar should be a child of a TLW") );
// a maximized window can't be resized anyhow
if ( !parentTLW->IsMaximized() )
void wxWin32SystemMenuEvtHandler::Attach(wxInputConsumer *consumer)
{
- wxASSERT_MSG( m_wnd == NULL, _T("can't attach the handler twice!") );
+ wxASSERT_MSG( m_wnd == NULL, wxT("can't attach the handler twice!") );
m_wnd = wxStaticCast(consumer->GetInputWindow(), wxTopLevelWindow);
m_wnd->PushEventHandler(this);
void wxWin32SystemMenuEvtHandler::OnSystemMenu(wxCommandEvent &WXUNUSED(event))
{
- int border = ((m_wnd->GetWindowStyle() & wxRESIZE_BORDER) &&
- !m_wnd->IsMaximized()) ?
- RESIZEABLE_FRAME_BORDER_THICKNESS :
- FRAME_BORDER_THICKNESS;
- wxPoint pt = m_wnd->GetClientAreaOrigin();
- pt.x = -pt.x + border;
- pt.y = -pt.y + border + FRAME_TITLEBAR_HEIGHT;
-
#if wxUSE_ACCEL
wxAcceleratorTable table = *m_wnd->GetAcceleratorTable();
m_wnd->SetAcceleratorTable(wxNullAcceleratorTable);
#endif
#if wxUSE_MENUS
- m_inputHnd->PopupSystemMenu(m_wnd, pt);
+ m_inputHnd->PopupSystemMenu(m_wnd);
#endif // wxUSE_MENUS
#if wxUSE_ACCEL
hit == wxHT_TOPLEVEL_ICON)) )
{
#if wxUSE_MENUS
- PopupSystemMenu(tlw, event.GetPosition());
+ PopupSystemMenu(tlw);
#endif // wxUSE_MENUS
return true;
}
#if wxUSE_MENUS
-void wxWin32FrameInputHandler::PopupSystemMenu(wxTopLevelWindow *window,
- const wxPoint& pos) const
+void wxWin32FrameInputHandler::PopupSystemMenu(wxTopLevelWindow *window) const
{
- wxMenu *menu = new wxMenu;
+ wxMenu menu;
if ( window->GetWindowStyle() & wxMAXIMIZE_BOX )
- menu->Append(wxID_RESTORE_FRAME , _("&Restore"));
- menu->Append(wxID_MOVE_FRAME , _("&Move"));
+ menu.Append(wxID_RESTORE_FRAME , _("&Restore"));
+ menu.Append(wxID_MOVE_FRAME , _("&Move"));
if ( window->GetWindowStyle() & wxRESIZE_BORDER )
- menu->Append(wxID_RESIZE_FRAME , _("&Size"));
+ menu.Append(wxID_RESIZE_FRAME , _("&Size"));
if ( wxSystemSettings::HasFeature(wxSYS_CAN_ICONIZE_FRAME) )
- menu->Append(wxID_ICONIZE_FRAME , _("Mi&nimize"));
+ menu.Append(wxID_ICONIZE_FRAME , _("Mi&nimize"));
if ( window->GetWindowStyle() & wxMAXIMIZE_BOX )
- menu->Append(wxID_MAXIMIZE_FRAME , _("Ma&ximize"));
- menu->AppendSeparator();
- menu->Append(wxID_CLOSE_FRAME, _("Close\tAlt-F4"));
+ menu.Append(wxID_MAXIMIZE_FRAME , _("Ma&ximize"));
+ menu.AppendSeparator();
+ menu.Append(wxID_CLOSE_FRAME, _("&Close") + wxT("\t") + _("Alt+") + wxT("F4"));
if ( window->GetWindowStyle() & wxMAXIMIZE_BOX )
{
if ( window->IsMaximized() )
{
- menu->Enable(wxID_MAXIMIZE_FRAME, false);
- menu->Enable(wxID_MOVE_FRAME, false);
+ menu.Enable(wxID_MAXIMIZE_FRAME, false);
+ menu.Enable(wxID_MOVE_FRAME, false);
if ( window->GetWindowStyle() & wxRESIZE_BORDER )
- menu->Enable(wxID_RESIZE_FRAME, false);
+ menu.Enable(wxID_RESIZE_FRAME, false);
}
else
- menu->Enable(wxID_RESTORE_FRAME, false);
+ menu.Enable(wxID_RESTORE_FRAME, false);
}
- window->PopupMenu(menu, pos);
- delete menu;
+ window->PopupMenu(&menu, wxPoint(0, 0));
}
#endif // wxUSE_MENUS
return wxStdInputHandler::HandleActivation(consumer, activated);
}
+
+#endif // wxUSE_THEME_WIN32