X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0fe5e8fea017ecb73f8aaa8ceb745feb269b3f79..6ea1280cb72eca20ee34d0c76e660d5cc0a482b7:/src/univ/themes/gtk.cpp diff --git a/src/univ/themes/gtk.cpp b/src/univ/themes/gtk.cpp index 7761d66acc..098e4d0960 100644 --- a/src/univ/themes/gtk.cpp +++ b/src/univ/themes/gtk.cpp @@ -6,7 +6,7 @@ // Created: 06.08.00 // RCS-ID: $Id$ // Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com) -// Licence: wxWindows license +// Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// // =========================================================================== @@ -42,18 +42,20 @@ #include "wx/slider.h" #include "wx/textctrl.h" #include "wx/toolbar.h" + #include "wx/statusbr.h" #include "wx/settings.h" #endif // WX_PRECOMP #include "wx/notebook.h" #include "wx/spinbutt.h" +#include "wx/toplevel.h" +#include "wx/artprov.h" #include "wx/univ/renderer.h" #include "wx/univ/inphand.h" #include "wx/univ/colschem.h" #include "wx/univ/theme.h" -#include "wx/toplevel.h" class WXDLLEXPORT wxGTKMenuGeometryInfo; @@ -76,7 +78,8 @@ public: virtual void DrawBackground(wxDC& dc, const wxColour& col, const wxRect& rect, - int flags = 0); + int flags = 0, + wxWindow *window = NULL ); virtual void DrawLabel(wxDC& dc, const wxString& label, const wxRect& rect, @@ -163,7 +166,8 @@ public: const wxString& label, const wxBitmap& bitmap, const wxRect& rect, - int flags); + int flags = 0, + long style = 0); virtual void DrawTextLine(wxDC& dc, const wxString& text, @@ -182,21 +186,25 @@ public: virtual void DrawSliderShaft(wxDC& dc, const wxRect& rect, + int lenThumb, wxOrientation orient, int flags = 0, + long style = 0, wxRect *rectShaft = NULL); virtual void DrawSliderThumb(wxDC& dc, const wxRect& rect, wxOrientation orient, - int flags = 0); - virtual void DrawSliderTicks(wxDC& dc, - const wxRect& rect, - const wxSize& sizeThumb, - wxOrientation orient, - int start, - int end, - int step, - int flags) + int flags = 0, + long style = 0); + virtual void DrawSliderTicks(wxDC& WXUNUSED(dc), + const wxRect& WXUNUSED(rect), + int WXUNUSED(lenThumb), + wxOrientation WXUNUSED(orient), + int WXUNUSED(start), + int WXUNUSED(end), + int WXUNUSED(step) = 1, + int WXUNUSED(flags) = 0, + long WXUNUSED(style) = 0) { // we don't have the ticks in GTK version } @@ -221,7 +229,7 @@ public: virtual void DrawStatusField(wxDC& dc, const wxRect& rect, const wxString& label, - int flags = 0); + int flags = 0, int style = 0); virtual void DrawFrameTitleBar(wxDC& dc, const wxRect& rect, @@ -255,8 +263,6 @@ public: virtual wxSize GetFrameMinSize(int flags) const; virtual wxSize GetFrameIconSize() const; virtual int HitTestFrame(const wxRect& rect, const wxPoint& pt, int flags) const; - - virtual wxIcon GetStdIcon(int which) const; virtual void GetComboBitmaps(wxBitmap *bmpNormal, wxBitmap *bmpFocus, @@ -305,8 +311,11 @@ public: virtual wxCoord GetSliderDim() const { return 15; } virtual wxCoord GetSliderTickLen() const { return 0; } virtual wxRect GetSliderShaftRect(const wxRect& rect, - wxOrientation orient) const; + int lenThumb, + wxOrientation orient, + long style = 0) const; virtual wxSize GetSliderThumbSize(const wxRect& rect, + int lenThumb, wxOrientation orient) const; virtual wxSize GetProgressBarStep() const { return wxSize(16, 32); } @@ -337,7 +346,8 @@ protected: // draw the background with any colour, not only the default one(s) void DoDrawBackground(wxDC& dc, const wxColour& col, - const wxRect& rect); + const wxRect& rect, + wxWindow *window = NULL); // DrawBorder() helpers: all of them shift and clip the DC after drawing // the border @@ -524,7 +534,7 @@ protected: wxStdScrollBarInputHandler::Press(scrollbar, doIt); } - virtual bool IsAllowedButton(int WXUNUSED(button)) { return TRUE; } + virtual bool IsAllowedButton(int WXUNUSED(button)) { return true; } bool IsArrow() const { @@ -566,11 +576,23 @@ public: virtual wxColour GetBackground(wxWindow *win) const; }; +// ---------------------------------------------------------------------------- +// wxGTKArtProvider +// ---------------------------------------------------------------------------- + +class wxGTKArtProvider : public wxArtProvider +{ +protected: + virtual wxBitmap CreateBitmap(const wxArtID& id, + const wxArtClient& client, + const wxSize& size); +}; + // ---------------------------------------------------------------------------- // wxGTKTheme // ---------------------------------------------------------------------------- -WX_DEFINE_ARRAY(wxInputHandler *, wxArrayHandlers); +WX_DEFINE_ARRAY_PTR(wxInputHandler *, wxArrayHandlers); class wxGTKTheme : public wxTheme { @@ -579,6 +601,7 @@ public: virtual ~wxGTKTheme(); virtual wxRenderer *GetRenderer(); + virtual wxArtProvider *GetArtProvider(); virtual wxInputHandler *GetInputHandler(const wxString& control); virtual wxColourScheme *GetColourScheme(); @@ -588,6 +611,8 @@ private: wxGTKRenderer *m_renderer; + wxGTKArtProvider *m_artProvider; + // the names of the already created handlers and the handlers themselves // (these arrays are synchronized) wxSortedArrayString m_handlerNames; @@ -615,6 +640,7 @@ wxGTKTheme::wxGTKTheme() m_scheme = NULL; m_renderer = NULL; m_handlerDefault = NULL; + m_artProvider = NULL; } wxGTKTheme::~wxGTKTheme() @@ -629,6 +655,7 @@ wxGTKTheme::~wxGTKTheme() delete m_handlerDefault; delete m_renderer; delete m_scheme; + wxArtProvider::RemoveProvider(m_artProvider); } wxRenderer *wxGTKTheme::GetRenderer() @@ -641,6 +668,16 @@ wxRenderer *wxGTKTheme::GetRenderer() return m_renderer; } +wxArtProvider *wxGTKTheme::GetArtProvider() +{ + if ( !m_artProvider ) + { + m_artProvider = new wxGTKArtProvider; + } + + return m_artProvider; +} + wxColourScheme *wxGTKTheme::GetColourScheme() { if ( !m_scheme ) @@ -739,7 +776,7 @@ wxColour wxGTKColourScheme::GetBackground(wxWindow *win) const col = win->GetBackgroundColour(); } - if ( win->IsContainerWindow() ) + if ( !win->ShouldInheritColours() ) { // doesn't depend on the state if ( !col.Ok() ) @@ -944,7 +981,7 @@ void wxGTKRenderer::DrawAntiRaisedBorder(wxDC& dc, wxRect *rect) void wxGTKRenderer::DrawBorder(wxDC& dc, wxBorder border, const wxRect& rectTotal, - int flags, + int WXUNUSED(flags), wxRect *rectIn) { size_t width; @@ -1045,7 +1082,7 @@ wxRect wxGTKRenderer::GetBorderDimensions(wxBorder border) const bool wxGTKRenderer::AreScrollbarsInsideBorder() const { // no, the scrollbars are outside the border in GTK+ - return FALSE; + return false; } // ---------------------------------------------------------------------------- @@ -1298,7 +1335,7 @@ void wxGTKRenderer::DrawCheckItem(wxDC& dc, DrawCheckButton(dc, _T(""), bitmap, rectBitmap, flags & ~wxCONTROL_FOCUSED); wxRect rectLabel = rect; - wxCoord shift = rectBitmap.width + 2*GetCheckItemMargin(); + wxCoord shift = rectBitmap.width + 2*GetCheckItemMargin(); rectLabel.x += shift; rectLabel.width -= shift; DrawItem(dc, label, rectLabel, flags); @@ -1368,13 +1405,13 @@ void wxGTKRenderer::DrawRadioBitmap(wxDC& dc, DrawUpZag(dc, x, xRight, yMid, y); DrawUpZag(dc, x + 1, xRight - 1, yMid, y + 1); - bool drawIt = TRUE; + bool drawIt = true; if ( flags & wxCONTROL_CHECKED ) dc.SetPen(m_penBlack); else if ( flags & wxCONTROL_PRESSED ) dc.SetPen(wxPen(wxSCHEME_COLOUR(m_scheme, CONTROL_PRESSED), 0, wxSOLID)); else // unchecked and unpressed - drawIt = FALSE; + drawIt = false; if ( drawIt ) DrawUpZag(dc, x + 2, xRight - 2, yMid, y + 2); @@ -1387,14 +1424,14 @@ void wxGTKRenderer::DrawRadioBitmap(wxDC& dc, DrawDownZag(dc, x + 1, xRight - 1, yMid, yBottom - 1); if ( !(flags & wxCONTROL_CHECKED) ) - drawIt = TRUE; // with the same pen + drawIt = true; // with the same pen else if ( flags & wxCONTROL_PRESSED ) { dc.SetPen(wxPen(wxSCHEME_COLOUR(m_scheme, CONTROL_PRESSED), 0, wxSOLID)); - drawIt = TRUE; + drawIt = true; } else // checked and unpressed - drawIt = FALSE; + drawIt = false; if ( drawIt ) DrawDownZag(dc, x + 2, xRight - 2, yMid, yBottom - 2); @@ -1445,14 +1482,14 @@ wxBitmap wxGTKRenderer::GetCheckBitmap(int flags) // normal unchecked dc.SelectObject(m_bitmapsCheckbox[0][1]); - DrawUncheckBitmap(dc, rect, FALSE); + DrawUncheckBitmap(dc, rect, false); // pressed checked m_bitmapsCheckbox[1][0] = m_bitmapsCheckbox[0][0]; // pressed unchecked dc.SelectObject(m_bitmapsCheckbox[1][1]); - DrawUncheckBitmap(dc, rect, TRUE); + DrawUncheckBitmap(dc, rect, true); } int row = flags & wxCONTROL_PRESSED ? 1 : 0; @@ -1551,7 +1588,7 @@ void wxGTKRenderer::DoDrawCheckOrRadioBitmap(wxDC& dc, rectLabel.SetRight(rect.GetRight()); } - dc.DrawBitmap(bitmap, xBmp, yBmp, TRUE /* use mask */); + dc.DrawBitmap(bitmap, xBmp, yBmp, true /* use mask */); DrawLabel(dc, label, rectLabel, flags, wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL, indexAccel); @@ -1582,6 +1619,10 @@ void wxGTKRenderer::DrawRadioButton(wxDC& dc, dc.SetBackground(*wxLIGHT_GREY_BRUSH); dc.Clear(); DrawRadioBitmap(dc, rect, flags); + + // must unselect the bitmap before setting a mask for it because of the + // MSW limitations + dc.SelectObject(wxNullBitmap); bitmap.SetMask(new wxMask(bitmap, *wxLIGHT_GREY)); } @@ -1593,7 +1634,8 @@ void wxGTKRenderer::DrawToolBarButton(wxDC& dc, const wxString& label, const wxBitmap& bitmap, const wxRect& rectOrig, - int flags) + int flags, + long WXUNUSED(style)) { // we don't draw the separators at all if ( !label.empty() || bitmap.Ok() ) @@ -1622,7 +1664,7 @@ void wxGTKRenderer::DrawToolBarButton(wxDC& dc, // text control // ---------------------------------------------------------------------------- -wxRect wxGTKRenderer::GetTextTotalArea(const wxTextCtrl *text, +wxRect wxGTKRenderer::GetTextTotalArea(const wxTextCtrl * WXUNUSED(text), const wxRect& rect) const { wxRect rectTotal = rect; @@ -1833,13 +1875,14 @@ void wxGTKRenderer::DrawTab(wxDC& dc, // ---------------------------------------------------------------------------- wxSize wxGTKRenderer::GetSliderThumbSize(const wxRect& rect, + int lenThumb, wxOrientation orient) const { static const wxCoord SLIDER_THUMB_LENGTH = 30; wxSize size; - wxRect rectShaft = GetSliderShaftRect(rect, orient); + wxRect rectShaft = GetSliderShaftRect(rect, lenThumb, orient); if ( orient == wxHORIZONTAL ) { size.x = wxMin(SLIDER_THUMB_LENGTH, rectShaft.width); @@ -1855,15 +1898,19 @@ wxSize wxGTKRenderer::GetSliderThumbSize(const wxRect& rect, } wxRect wxGTKRenderer::GetSliderShaftRect(const wxRect& rect, - wxOrientation WXUNUSED(orient)) const + int WXUNUSED(lenThumb), + wxOrientation WXUNUSED(orient), + long WXUNUSED(style)) const { return rect.Deflate(2*BORDER_THICKNESS, 2*BORDER_THICKNESS); } void wxGTKRenderer::DrawSliderShaft(wxDC& dc, const wxRect& rectOrig, - wxOrientation orient, + int WXUNUSED(lenThumb), + wxOrientation WXUNUSED(orient), int flags, + long WXUNUSED(style), wxRect *rectShaft) { wxRect rect = rectOrig; @@ -1890,7 +1937,8 @@ void wxGTKRenderer::DrawSliderShaft(wxDC& dc, void wxGTKRenderer::DrawSliderThumb(wxDC& dc, const wxRect& rectOrig, wxOrientation orient, - int flags) + int WXUNUSED(flags), + long WXUNUSED(style)) { // draw the thumb border wxRect rect = rectOrig; @@ -2108,7 +2156,7 @@ wxMenuGeometryInfo *wxGTKRenderer::GetMenuGeometry(wxWindow *win, widthAccelMax = 0, widthBmpMax = MENU_LEFT_MARGIN; - for ( wxMenuItemList::Node *node = menu.GetMenuItems().GetFirst(); + for ( wxMenuItemList::compatibility_iterator node = menu.GetMenuItems().GetFirst(); node; node = node->GetNext() ) { @@ -2180,15 +2228,16 @@ wxMenuGeometryInfo *wxGTKRenderer::GetMenuGeometry(wxWindow *win, // status bar // ---------------------------------------------------------------------------- -wxSize wxGTKRenderer::GetStatusBarBorders(wxCoord *borderBetweenFields) const +wxSize +wxGTKRenderer::GetStatusBarBorders(wxCoord * WXUNUSED(borderBetweenFields)) const { return wxSize(0, 0); } -void wxGTKRenderer::DrawStatusField(wxDC& dc, - const wxRect& rect, - const wxString& label, - int flags) +void wxGTKRenderer::DrawStatusField(wxDC& WXUNUSED(dc), + const wxRect& WXUNUSED(rect), + const wxString& WXUNUSED(label), + int WXUNUSED(flags), int WXUNUSED(style)) { } @@ -2256,7 +2305,8 @@ void wxGTKRenderer::GetComboBitmaps(wxBitmap *bmpNormal, void wxGTKRenderer::DoDrawBackground(wxDC& dc, const wxColour& col, - const wxRect& rect) + const wxRect& rect, + wxWindow * WXUNUSED(window)) { wxBrush brush(col, wxSOLID); dc.SetBrush(brush); @@ -2267,10 +2317,11 @@ void wxGTKRenderer::DoDrawBackground(wxDC& dc, void wxGTKRenderer::DrawBackground(wxDC& dc, const wxColour& col, const wxRect& rect, - int flags) + int flags, + wxWindow *window ) { wxColour colBg = col.Ok() ? col : GetBackgroundColour(flags); - DoDrawBackground(dc, colBg, rect); + DoDrawBackground(dc, colBg, rect, window ); } // ---------------------------------------------------------------------------- @@ -2601,7 +2652,7 @@ void wxGTKRenderer::DrawScrollbarThumb(wxDC& dc, void wxGTKRenderer::DrawScrollbarShaft(wxDC& dc, wxOrientation orient, const wxRect& rect, - int flags) + int WXUNUSED(flags)) { wxRect rectBar = rect; DrawThumbBorder(dc, &rectBar, orient); @@ -2707,70 +2758,78 @@ void wxGTKRenderer::AdjustSize(wxSize *size, const wxWindow *window) // top level windows // ---------------------------------------------------------------------------- -void wxGTKRenderer::DrawFrameTitleBar(wxDC& dc, - const wxRect& rect, - const wxString& title, - const wxIcon& icon, - int flags, - int specialButton, - int specialButtonFlag) +void wxGTKRenderer::DrawFrameTitleBar(wxDC& WXUNUSED(dc), + const wxRect& WXUNUSED(rect), + const wxString& WXUNUSED(title), + const wxIcon& WXUNUSED(icon), + int WXUNUSED(flags), + int WXUNUSED(specialButton), + int WXUNUSED(specialButtonFlag)) { } -void wxGTKRenderer::DrawFrameBorder(wxDC& dc, - const wxRect& rect, - int flags) +void wxGTKRenderer::DrawFrameBorder(wxDC& WXUNUSED(dc), + const wxRect& WXUNUSED(rect), + int WXUNUSED(flags)) { } -void wxGTKRenderer::DrawFrameBackground(wxDC& dc, - const wxRect& rect, - int flags) +void wxGTKRenderer::DrawFrameBackground(wxDC& WXUNUSED(dc), + const wxRect& WXUNUSED(rect), + int WXUNUSED(flags)) { } -void wxGTKRenderer::DrawFrameTitle(wxDC& dc, - const wxRect& rect, - const wxString& title, - int flags) +void wxGTKRenderer::DrawFrameTitle(wxDC& WXUNUSED(dc), + const wxRect& WXUNUSED(rect), + const wxString& WXUNUSED(title), + int WXUNUSED(flags)) { } -void wxGTKRenderer::DrawFrameIcon(wxDC& dc, - const wxRect& rect, - const wxIcon& icon, - int flags) +void wxGTKRenderer::DrawFrameIcon(wxDC& WXUNUSED(dc), + const wxRect& WXUNUSED(rect), + const wxIcon& WXUNUSED(icon), + int WXUNUSED(flags)) { } -void wxGTKRenderer::DrawFrameButton(wxDC& dc, - wxCoord x, wxCoord y, - int button, - int flags) +void wxGTKRenderer::DrawFrameButton(wxDC& WXUNUSED(dc), + wxCoord WXUNUSED(x), + wxCoord WXUNUSED(y), + int WXUNUSED(button), + int WXUNUSED(flags)) { } -wxRect wxGTKRenderer::GetFrameClientArea(const wxRect& rect, int flags) const +wxRect +wxGTKRenderer::GetFrameClientArea(const wxRect& rect, + int WXUNUSED(flags)) const { return rect; } -wxSize wxGTKRenderer::GetFrameTotalSize(const wxSize& clientSize, int flags) const +wxSize +wxGTKRenderer::GetFrameTotalSize(const wxSize& clientSize, + int WXUNUSED(flags)) const { return clientSize; } -wxSize wxGTKRenderer::GetFrameMinSize(int flags) const +wxSize wxGTKRenderer::GetFrameMinSize(int WXUNUSED(flags)) const { return wxSize(0,0); } wxSize wxGTKRenderer::GetFrameIconSize() const { - return wxSize(-1, -1); + return wxSize(wxDefaultCoord, wxDefaultCoord); } -int wxGTKRenderer::HitTestFrame(const wxRect& rect, const wxPoint& pt, int flags) const +int +wxGTKRenderer::HitTestFrame(const wxRect& WXUNUSED(rect), + const wxPoint& WXUNUSED(pt), + int WXUNUSED(flags)) const { return wxHT_TOPLEVEL_CLIENT_AREA; } @@ -2780,7 +2839,7 @@ int wxGTKRenderer::HitTestFrame(const wxRect& rect, const wxPoint& pt, int flags // standard icons // ---------------------------------------------------------------------------- -static char *error_xpm[] = { +static const char *error_xpm[] = { /* columns rows colors chars-per-pixel */ "48 48 537 2", " c Gray0", @@ -3371,7 +3430,7 @@ static char *error_xpm[] = { "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+W+W+W+W+W+W+W+W+W+W+W+W+W+W+W+W+" }; -static char *info_xpm[] = { +static const char *info_xpm[] = { /* columns rows colors chars-per-pixel */ "48 48 478 2", " c Gray0", @@ -3904,7 +3963,7 @@ static char *info_xpm[] = { }; /* XPM */ -static char *warning_xpm[] = { +static const char *warning_xpm[] = { /* columns rows colors chars-per-pixel */ "48 48 270 2", " c Gray0", @@ -4229,7 +4288,7 @@ static char *warning_xpm[] = { }; /* XPM */ -static char *question_xpm[] = { +static const char *question_xpm[] = { /* columns rows colors chars-per-pixel */ "48 48 101 2", " c Gray0", @@ -4384,27 +4443,19 @@ static char *question_xpm[] = { "$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$." }; - -wxIcon wxGTKRenderer::GetStdIcon(int which) const +wxBitmap wxGTKArtProvider::CreateBitmap(const wxArtID& id, + const wxArtClient& WXUNUSED(client), + const wxSize& WXUNUSED(size)) { - switch(which) - { - case wxICON_INFORMATION: - return wxIcon(info_xpm); - - case wxICON_QUESTION: - return wxIcon(question_xpm); - - case wxICON_EXCLAMATION: - return wxIcon(warning_xpm); - - default: - wxFAIL_MSG(wxT("requested non existent standard icon")); - // still fall through - - case wxICON_HAND: - return wxIcon(error_xpm); - } + if ( id == wxART_INFORMATION ) + return wxBitmap(info_xpm); + if ( id == wxART_ERROR ) + return wxBitmap(error_xpm); + if ( id == wxART_WARNING ) + return wxBitmap(warning_xpm); + if ( id == wxART_QUESTION ) + return wxBitmap(question_xpm); + return wxNullBitmap; } @@ -4421,11 +4472,11 @@ wxGTKInputHandler::wxGTKInputHandler(wxGTKRenderer *renderer) m_renderer = renderer; } -bool wxGTKInputHandler::HandleKey(wxInputConsumer *control, - const wxKeyEvent& event, - bool pressed) +bool wxGTKInputHandler::HandleKey(wxInputConsumer * WXUNUSED(control), + const wxKeyEvent& WXUNUSED(event), + bool WXUNUSED(pressed)) { - return FALSE; + return false; } bool wxGTKInputHandler::HandleMouse(wxInputConsumer *control, @@ -4436,10 +4487,10 @@ bool wxGTKInputHandler::HandleMouse(wxInputConsumer *control, { control->GetInputWindow()->SetFocus(); - return TRUE; + return true; } - return FALSE; + return false; } bool wxGTKInputHandler::HandleMouseMove(wxInputConsumer *control, @@ -4447,18 +4498,18 @@ bool wxGTKInputHandler::HandleMouseMove(wxInputConsumer *control, { if ( event.Entering() ) { - control->GetInputWindow()->SetCurrent(TRUE); + control->GetInputWindow()->SetCurrent(true); } else if ( event.Leaving() ) { - control->GetInputWindow()->SetCurrent(FALSE); + control->GetInputWindow()->SetCurrent(false); } else { - return FALSE; + return false; } - return TRUE; + return true; } // ---------------------------------------------------------------------------- @@ -4476,11 +4527,11 @@ bool wxGTKCheckboxInputHandler::HandleKey(wxInputConsumer *control, { control->PerformAction(wxACTION_CHECKBOX_TOGGLE); - return TRUE; + return true; } } - return FALSE; + return false; } // ---------------------------------------------------------------------------- @@ -4570,7 +4621,7 @@ bool wxGTKTextCtrlInputHandler::HandleKey(wxInputConsumer *control, { control->PerformAction(action); - return TRUE; + return true; } }