X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c403693947e0129dac212a86021ca8280e28462f..64ea838d8f4d1853b7d850db93ee565e901d099a:/src/univ/themes/win32.cpp diff --git a/src/univ/themes/win32.cpp b/src/univ/themes/win32.cpp index 083ae06c36..46da9be08f 100644 --- a/src/univ/themes/win32.cpp +++ b/src/univ/themes/win32.cpp @@ -24,6 +24,10 @@ #pragma hdrstop #endif +#include "wx/univ/theme.h" + +#if wxUSE_THEME_WIN32 + #ifndef WX_PRECOMP #include "wx/timer.h" #include "wx/intl.h" @@ -31,6 +35,7 @@ #include "wx/window.h" #include "wx/dcmemory.h" + #include "wx/dcclient.h" #include "wx/button.h" #include "wx/bmpbuttn.h" @@ -56,16 +61,13 @@ #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 @@ -73,16 +75,6 @@ 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 = @@ -98,36 +90,6 @@ static const wxCoord SLIDER_TICK_LENGTH = 6; class wxWin32Renderer : public wxStdRenderer { public: - // constants - enum wxArrowDirection - { - Arrow_Left, - Arrow_Right, - Arrow_Up, - Arrow_Down, - Arrow_Max - }; - - enum wxArrowStyle - { - Arrow_Normal, - Arrow_Disabled, - Arrow_Pressed, - Arrow_Inverted, - Arrow_InvertedDisabled, - Arrow_StateMax - }; - - enum wxFrameButtonType - { - FrameButton_Close, - FrameButton_Minimize, - FrameButton_Maximize, - FrameButton_Restore, - FrameButton_Help, - FrameButton_Max - }; - // ctor wxWin32Renderer(const wxColourScheme *scheme); @@ -151,15 +113,11 @@ public: const wxRect& rect, int flags = 0, wxRect *rectIn = NULL); + virtual void DrawArrow(wxDC& dc, wxDirection dir, const wxRect& rect, int flags = 0); - virtual void DrawScrollbarArrow(wxDC& dc, - wxDirection dir, - const wxRect& rect, - int flags = 0) - { DrawArrow(dc, dir, rect, flags); } virtual void DrawScrollbarThumb(wxDC& dc, wxOrientation orient, const wxRect& rect, @@ -168,13 +126,6 @@ public: wxOrientation orient, const wxRect& rect, int flags = 0); - virtual void DrawScrollCorner(wxDC& dc, - const wxRect& rect); - virtual void DrawCheckItem(wxDC& dc, - const wxString& label, - const wxBitmap& bitmap, - const wxRect& rect, - int flags = 0); #if wxUSE_TOOLBAR virtual void DrawToolBarButton(wxDC& dc, @@ -246,38 +197,6 @@ public: 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, @@ -289,8 +208,6 @@ public: virtual wxSize GetScrollbarArrowSize() const { return m_sizeScrollbarArrow; } - virtual wxCoord GetListboxItemHeight(wxCoord fontHeight) - { return fontHeight + 2; } virtual wxSize GetCheckBitmapSize() const { return wxSize(13, 13); } virtual wxSize GetRadioBitmapSize() const @@ -298,10 +215,12 @@ public: 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, @@ -337,11 +256,8 @@ public: const wxMenu& menu) const; #endif // wxUSE_MENUS -#if wxUSE_STATUSBAR - virtual wxSize GetStatusBarBorders(wxCoord *borderBetweenFields) const; -#endif // wxUSE_STATUSBAR - protected: + // overridden wxStdRenderer methods virtual void DrawFrameWithLabel(wxDC& dc, const wxString& label, const wxRect& rectFrame, @@ -350,28 +266,23 @@ protected: int alignment, int indexAccel); + virtual void DrawCheckItemBitmap(wxDC& dc, + const wxBitmap& bitmap, + const wxRect& rect, + int flags); + // draw the border used for scrollbar arrows void DrawArrowBorder(wxDC& dc, wxRect *rect, bool isPressed = false); // public DrawArrow()s helper void DrawArrow(wxDC& dc, const wxRect& rect, - wxArrowDirection arrowDir, wxArrowStyle arrowStyle); + ArrowDirection arrowDir, ArrowStyle arrowStyle); // DrawArrowButton is used by DrawScrollbar and DrawComboButton void DrawArrowButton(wxDC& dc, const wxRect& rect, - wxArrowDirection arrowDir, - wxArrowStyle arrowStyle); - - // DrawCheckButton helper - void DrawCheckOrRadioButton(wxDC& dc, - const wxString& label, - const wxBitmap& bitmap, - const wxRect& rect, - int flags, - wxAlignment align, - int indexAccel, - wxCoord focusOffsetY); + ArrowDirection arrowDir, + ArrowStyle arrowStyle); // draw a normal or transposed line (useful for using the same code fo both // horizontal and vertical widgets) @@ -388,18 +299,64 @@ protected: // get the standard check/radio button bitmap wxBitmap GetIndicator(IndicatorType indType, int flags); - wxBitmap GetCheckBitmap(int flags) + virtual wxBitmap GetCheckBitmap(int flags) { return GetIndicator(IndicatorType_Check, flags); } - wxBitmap GetRadioBitmap(int flags) + 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 DrawCheckItem() + // the checked and unchecked bitmaps for DrawCheckItemBitmap() wxBitmap m_bmpCheckBitmaps[IndicatorStatus_Max]; // the bitmaps returned by GetIndicator() @@ -407,14 +364,15 @@ private: [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]; @@ -534,7 +492,7 @@ public: 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: @@ -603,56 +561,55 @@ 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", " ", " ", " ", @@ -660,25 +617,34 @@ static const char *frame_button_minimize_xpm[] = { " ", " ", " ", -" ...... ", -" ...... ", +" 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[] = { @@ -1151,7 +1117,7 @@ wxWin32Theme::~wxWin32Theme() { delete m_renderer; delete m_scheme; - wxArtProvider::RemoveProvider(m_artProvider); + delete m_artProvider; } wxRenderer *wxWin32Theme::GetRenderer() @@ -1285,7 +1251,7 @@ wxColour wxWin32ColourScheme::GetBackground(wxWindow *win) const col = Get(CONTROL); else { - if ( !col.Ok() ) + if ( !col.IsOk() ) { // doesn't depend on the state col = Get(WINDOW); @@ -1294,7 +1260,7 @@ wxColour wxWin32ColourScheme::GetBackground(wxWindow *win) const } #endif // wxUSE_TEXTCTRL - if (!col.Ok()) + if (!col.IsOk()) col = Get(CONTROL); // Most controls should be this colour, not WINDOW } else @@ -1303,7 +1269,7 @@ wxColour wxWin32ColourScheme::GetBackground(wxWindow *win) const // 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) ) @@ -1362,6 +1328,7 @@ wxColour wxWin32ColourScheme::Get(wxWin32ColourScheme::StdColour col) const 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; @@ -1394,13 +1361,14 @@ wxColour wxWin32ColourScheme::Get(wxWin32ColourScheme::StdColour col) const 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; } } @@ -1419,9 +1387,6 @@ wxWin32Renderer::wxWin32Renderer(const wxColourScheme *scheme) // 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; @@ -1591,13 +1556,6 @@ wxWin32Renderer::wxWin32Renderer(const wxColourScheme *scheme) 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 @@ -1650,7 +1608,7 @@ void wxWin32Renderer::DrawFrameWithLabel(wxDC& dc, int indexAccel) { wxString label2; - label2 << _T(' ') << label << _T(' '); + label2 << wxT(' ') << label << wxT(' '); if ( indexAccel != -1 ) { // adjust it as we prepended a space @@ -1715,14 +1673,13 @@ void wxWin32Renderer::DrawButtonBorder(wxDC& dc, // (check)listbox items // ---------------------------------------------------------------------------- -void wxWin32Renderer::DrawCheckItem(wxDC& dc, - const wxString& label, - const wxBitmap& bitmap, - const wxRect& rect, - int flags) +void wxWin32Renderer::DrawCheckItemBitmap(wxDC& dc, + const wxBitmap& bitmap, + const wxRect& rect, + int flags) { wxBitmap bmp; - if ( bitmap.Ok() ) + if ( bitmap.IsOk() ) { bmp = bitmap; } @@ -1732,7 +1689,7 @@ void wxWin32Renderer::DrawCheckItem(wxDC& dc, ? IndicatorStatus_Checked : IndicatorStatus_Unchecked; - if ( !m_bmpCheckBitmaps[i].Ok() ) + if ( !m_bmpCheckBitmaps[i].IsOk() ) { m_bmpCheckBitmaps[i] = wxBitmap(ms_xpmChecked[i]); } @@ -1742,13 +1699,6 @@ void wxWin32Renderer::DrawCheckItem(wxDC& dc, dc.DrawBitmap(bmp, rect.x, rect.y + (rect.height - bmp.GetHeight()) / 2 - 1, true /* use mask */); - - wxRect rectLabel = rect; - int bmpWidth = bmp.GetWidth(); - rectLabel.x += bmpWidth; - rectLabel.width -= bmpWidth; - - DrawItem(dc, label, rectLabel, flags); } // ---------------------------------------------------------------------------- @@ -1761,21 +1711,24 @@ wxBitmap wxWin32Renderer::GetIndicator(IndicatorType indType, int flags) IndicatorStatus indStatus; GetIndicatorsFromFlags(flags, indState, indStatus); - wxBitmap bmp = m_bmpIndicators[indType][indState][indStatus]; - if ( !bmp.Ok() ) + wxBitmap& bmp = m_bmpIndicators[indType][indState][indStatus]; + if ( !bmp.IsOk() ) { const char **xpm = ms_xpmIndicators[indType][indState][indStatus]; if ( xpm ) { // create and cache it bmp = wxBitmap(xpm); - m_bmpIndicators[indType][indState][indStatus] = bmp; } } return bmp; } +// ---------------------------------------------------------------------------- +// toolbar stuff +// ---------------------------------------------------------------------------- + #if wxUSE_TOOLBAR void wxWin32Renderer::DrawToolBarButton(wxDC& dc, const wxString& label, @@ -1814,7 +1767,7 @@ void wxWin32Renderer::DrawToolBarButton(wxDC& dc, { 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) @@ -1874,7 +1827,7 @@ void wxWin32Renderer::DrawTab(wxDC& dc, switch ( dir ) { default: - wxFAIL_MSG(_T("invaild notebook tab orientation")); + wxFAIL_MSG(wxT("invaild notebook tab orientation")); // fall through case wxTOP: @@ -2064,21 +2017,15 @@ wxRect wxWin32Renderer::GetSliderShaftRect(const wxRect& rectOrig, 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) { @@ -2095,8 +2042,8 @@ wxRect wxWin32Renderer::GetSliderShaftRect(const wxRect& rectOrig, rect.width -= 2*SLIDER_MARGIN; rect.height = 2*BORDER_THICKNESS; } - else - { // == wxVERTICAL + else // == wxVERTICAL + { rect.y += SLIDER_MARGIN; if (left & right) { @@ -2143,9 +2090,8 @@ void wxWin32Renderer::DrawSliderShaft(wxDC& dc, y1 y2 */ - if (flags & wxCONTROL_FOCUSED) { - DrawFocusRect(dc, rectOrig); - } + if (flags & wxCONTROL_FOCUSED) + DrawFocusRect(NULL, dc, rectOrig); wxRect rect = GetSliderShaftRect(rectOrig, lenThumb, orient, style); @@ -2189,72 +2135,70 @@ void wxWin32Renderer::DrawSliderThumb(wxDC& dc, 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); + + bool isVertical = orient == wxVERTICAL; - wxCoord sizeArrow = (transpose ? rect.height : rect.width) / 2; - wxCoord c = ((transpose ? rect.height : rect.width) - 2*sizeArrow); + 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); @@ -2266,7 +2210,6 @@ void wxWin32Renderer::DrawSliderThumb(wxDC& dc, } rectInt.Deflate(2); -#if !defined(__WXMGL__) static const char *stipple_xpm[] = { /* columns rows colors chars-per-pixel */ "2 2 2 1", @@ -2276,24 +2219,6 @@ void wxWin32Renderer::DrawSliderThumb(wxDC& dc, "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)); @@ -2328,55 +2253,56 @@ void wxWin32Renderer::DrawSliderTicks(wxDC& dc, */ // 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); } } @@ -2495,12 +2421,12 @@ void wxWin32Renderer::DrawMenuItem(wxDC& dc, // 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); @@ -2525,7 +2451,7 @@ void wxWin32Renderer::DrawMenuItem(wxDC& dc, rect.x = geometryInfo.GetSize().x - MENU_RIGHT_MARGIN; rect.width = MENU_RIGHT_MARGIN; - wxArrowStyle arrowStyle; + ArrowStyle arrowStyle; if ( flags & wxCONTROL_DISABLED ) arrowStyle = flags & wxCONTROL_SELECTED ? Arrow_InvertedDisabled : Arrow_Disabled; @@ -2596,7 +2522,7 @@ wxMenuGeometryInfo *wxWin32Renderer::GetMenuGeometry(wxWindow *win, h = heightText; wxCoord widthLabel; - dc.GetTextExtent(item->GetLabel(), &widthLabel, NULL); + dc.GetTextExtent(item->GetItemLabelText(), &widthLabel, NULL); if ( widthLabel > widthLabelMax ) { widthLabelMax = widthLabel; @@ -2610,7 +2536,7 @@ wxMenuGeometryInfo *wxWin32Renderer::GetMenuGeometry(wxWindow *win, } const wxBitmap& bmp = item->GetBitmap(); - if ( bmp.Ok() ) + if ( bmp.IsOk() ) { wxCoord widthBmp = bmp.GetWidth(); if ( widthBmp > widthBmpMax ) @@ -2655,25 +2581,15 @@ wxMenuGeometryInfo *wxWin32Renderer::GetMenuGeometry(wxWindow *win, // status bar // ---------------------------------------------------------------------------- -static const wxCoord STATBAR_BORDER_X = 2; -static const wxCoord STATBAR_BORDER_Y = 2; - -wxSize wxWin32Renderer::GetStatusBarBorders(wxCoord *borderBetweenFields) const -{ - if ( borderBetweenFields ) - *borderBetweenFields = 2; - - return wxSize(STATBAR_BORDER_X, STATBAR_BORDER_Y); -} - void wxWin32Renderer::DrawStatusField(wxDC& dc, const wxRect& rect, const wxString& label, - int flags, int style /*=0*/) + int flags, + int style) { wxRect rectIn; - if ( flags & wxCONTROL_ISDEFAULT ) + if ( flags & wxCONTROL_SIZEGRIP ) { // draw the size grip: it is a normal rect except that in the lower // right corner we have several bands which may be used for dragging @@ -2728,19 +2644,12 @@ void wxWin32Renderer::DrawStatusField(wxDC& dc, rectIn.Deflate(1); rectIn.width -= STATUSBAR_GRIP_SIZE; - } - else // normal pane - { - if (style == wxSB_RAISED) - DrawBorder(dc, wxBORDER_RAISED, rect, flags, &rectIn); - else if (style != wxSB_FLAT) - DrawBorder(dc, wxBORDER_STATIC, rect, flags, &rectIn); - } - rectIn.Deflate(STATBAR_BORDER_X, STATBAR_BORDER_Y); + // this will prevent the standard version from drawing any borders + style = wxSB_FLAT; + } - wxDCClipper clipper(dc, rectIn); - DrawLabel(dc, label, rectIn, flags, wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL); + wxStdRenderer::DrawStatusField(dc, rect, label, flags, style); } #endif // wxUSE_STATUSBAR @@ -2813,21 +2722,7 @@ void wxWin32Renderer::DrawArrow(wxDC& dc, const wxRect& rect, int flags) { - // get the bitmap for this arrow - wxArrowDirection arrowDir; - switch ( dir ) - { - case wxLEFT: arrowDir = Arrow_Left; break; - case wxRIGHT: arrowDir = Arrow_Right; break; - case wxUP: arrowDir = Arrow_Up; break; - case wxDOWN: arrowDir = Arrow_Down; break; - - default: - wxFAIL_MSG(_T("unknown arrow direction")); - return; - } - - wxArrowStyle arrowStyle; + ArrowStyle arrowStyle; if ( flags & wxCONTROL_PRESSED ) { // can't be pressed and disabled @@ -2838,13 +2733,13 @@ void wxWin32Renderer::DrawArrow(wxDC& dc, arrowStyle = flags & wxCONTROL_DISABLED ? Arrow_Disabled : Arrow_Normal; } - DrawArrowButton(dc, rect, arrowDir, arrowStyle); + DrawArrowButton(dc, rect, GetArrowDirection(dir), arrowStyle); } void wxWin32Renderer::DrawArrow(wxDC& dc, const wxRect& rect, - wxArrowDirection arrowDir, - wxArrowStyle arrowStyle) + ArrowDirection arrowDir, + ArrowStyle arrowStyle) { const wxBitmap& bmp = m_bmpArrows[arrowStyle][arrowDir]; @@ -2863,8 +2758,8 @@ void wxWin32Renderer::DrawArrow(wxDC& dc, void wxWin32Renderer::DrawArrowButton(wxDC& dc, const wxRect& rectAll, - wxArrowDirection arrowDir, - wxArrowStyle arrowStyle) + ArrowDirection arrowDir, + ArrowStyle arrowStyle) { wxRect rect = rectAll; DrawBackground(dc, wxSCHEME_COLOUR(m_scheme, CONTROL), rect); @@ -2894,387 +2789,12 @@ void wxWin32Renderer::DrawScrollbarShaft(wxDC& dc, DrawBackground(dc, m_scheme->Get(col), rectBar); } -void wxWin32Renderer::DrawScrollCorner(wxDC& dc, const wxRect& rect) -{ - DrawBackground(dc, wxSCHEME_COLOUR(m_scheme, CONTROL), rect); -} - -// ---------------------------------------------------------------------------- -// 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", @@ -3383,7 +2903,7 @@ static char *error_xpm[]={ }; /* 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", @@ -3439,7 +2959,7 @@ static char *info_xpm[]={ }; /* 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", @@ -3494,7 +3014,7 @@ static char *question_xpm[]={ }; /* 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", @@ -3564,28 +3084,20 @@ wxBitmap wxWin32ArtProvider::CreateBitmap(const wxArtID& id, // text control geometry // ---------------------------------------------------------------------------- -static inline int GetTextBorderWidth() -{ - return 1; -} - wxRect -wxWin32Renderer::GetTextTotalArea(const wxTextCtrl * WXUNUSED(text), +wxWin32Renderer::GetTextTotalArea(const wxTextCtrl *text, const wxRect& rect) const { - wxRect rectTotal = rect; + wxRect rectTotal = wxStdRenderer::GetTextTotalArea(text, rect); - wxCoord widthBorder = GetTextBorderWidth(); - rectTotal.Inflate(widthBorder); - - // this is what Windows does + // this is strange but it's what Windows does rectTotal.height++; return rectTotal; } wxRect -wxWin32Renderer::GetTextClientArea(const wxTextCtrl * WXUNUSED(text), +wxWin32Renderer::GetTextClientArea(const wxTextCtrl *text, const wxRect& rect, wxCoord *extraSpaceBeyond) const { @@ -3595,13 +3107,7 @@ wxWin32Renderer::GetTextClientArea(const wxTextCtrl * WXUNUSED(text), if ( rectText.height > 0 ) rectText.height--; - wxCoord widthBorder = GetTextBorderWidth(); - rectText.Inflate(-widthBorder); - - if ( extraSpaceBeyond ) - *extraSpaceBeyond = 0; - - return rectText; + return wxStdRenderer::GetTextClientArea(text, rect, extraSpaceBeyond); } #endif // wxUSE_TEXTCTRL @@ -3615,14 +3121,12 @@ void wxWin32Renderer::AdjustSize(wxSize *size, const wxWindow *window) #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 @@ -3672,10 +3176,18 @@ void wxWin32Renderer::AdjustSize(wxSize *size, const wxWindow *window) } #endif // wxUSE_BUTTON || wxUSE_TOGGLEBTN - // take into account the border width - wxRect rectBorder = GetBorderDimensions(window->GetBorder()); - size->x += rectBorder.x + rectBorder.width; - size->y += rectBorder.y + rectBorder.height; + wxStdRenderer::AdjustSize(size, window); +} + +wxBitmap wxWin32Renderer::GetFrameButtonBitmap(FrameButtonType type) +{ + wxBitmap& bmp = m_bmpFrameButtons[type]; + if ( !bmp.IsOk() ) + { + bmp = wxBitmap(ms_xpmFrameButtons[type]); + } + + return bmp; } // ============================================================================ @@ -3699,10 +3211,9 @@ bool wxWin32InputHandler::HandleMouse(wxInputConsumer *control, // 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(); @@ -3735,13 +3246,11 @@ bool wxWin32ScrollBarInputHandler::OnScrollTimer(wxScrollBar *scrollbar, 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 ) @@ -3803,7 +3312,7 @@ bool wxWin32ScrollBarInputHandler::HandleMouseMove(wxInputConsumer *control, return false; } - ht = m_renderer->HitTestScrollbar(scrollbar, event.GetPosition()); + ht = scrollbar->HitTestBar(event.GetPosition()); if ( ht == m_htLast ) { // yes it did, resume scrolling @@ -3833,7 +3342,7 @@ bool wxWin32ScrollBarInputHandler::HandleMouseMove(wxInputConsumer *control, // 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() { @@ -3852,7 +3361,7 @@ bool wxWin32ScrollBarInputHandler::HandleMouseMove(wxInputConsumer *control, 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 @@ -4008,7 +3517,7 @@ bool wxWin32StatusBarInputHandler::IsOnGrip(wxWindow *statbar, 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() ) @@ -4116,7 +3625,7 @@ wxWin32SystemMenuEvtHandler(wxWin32FrameInputHandler *handler) 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); @@ -4152,21 +3661,13 @@ END_EVENT_TABLE() 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 @@ -4227,7 +3728,7 @@ bool wxWin32FrameInputHandler::HandleMouse(wxInputConsumer *consumer, hit == wxHT_TOPLEVEL_ICON)) ) { #if wxUSE_MENUS - PopupSystemMenu(tlw, event.GetPosition()); + PopupSystemMenu(tlw); #endif // wxUSE_MENUS return true; } @@ -4239,38 +3740,36 @@ bool wxWin32FrameInputHandler::HandleMouse(wxInputConsumer *consumer, #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 @@ -4291,3 +3790,5 @@ bool wxWin32FrameInputHandler::HandleActivation(wxInputConsumer *consumer, return wxStdInputHandler::HandleActivation(consumer, activated); } + +#endif // wxUSE_THEME_WIN32