X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1b4651028a315ed881858165675667fdaef58d6c..29d18d6945b531aae7d3658a9d1f986184757e89:/src/univ/themes/gtk.cpp diff --git a/src/univ/themes/gtk.cpp b/src/univ/themes/gtk.cpp index fe2695813a..776d9cd4e7 100644 --- a/src/univ/themes/gtk.cpp +++ b/src/univ/themes/gtk.cpp @@ -30,6 +30,7 @@ #include "wx/dcmemory.h" #include "wx/window.h" + #include "wx/bmpbuttn.h" #include "wx/button.h" #include "wx/checkbox.h" #include "wx/listbox.h" @@ -47,12 +48,13 @@ #include "wx/univ/inphand.h" #include "wx/univ/colschem.h" #include "wx/univ/theme.h" +#include "wx/toplevel.h" // ---------------------------------------------------------------------------- // constants (to be removed, for testing only) // ---------------------------------------------------------------------------- -static const size_t BORDER_THICKNESS = 10; +static const wxCoord BORDER_THICKNESS = 1; // ---------------------------------------------------------------------------- // wxGTKRenderer: draw the GUI elements in GTK style @@ -204,6 +206,39 @@ public: wxCoord y, const wxMenuGeometryInfo& geomInfo); #endif + + virtual void DrawFrameTitleBar(wxDC& dc, + const wxRect& rect, + const wxString& title, + const wxIcon& icon, + int flags, + int specialButton = 0, + int specialButtonFlag = 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); + + // titlebars + virtual wxRect GetFrameClientArea(const wxRect& rect, int flags) const; + virtual wxSize GetFrameTotalSize(const wxSize& clientSize, 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, @@ -418,12 +453,12 @@ class wxGTKInputHandler : public wxInputHandler public: wxGTKInputHandler(wxGTKRenderer *renderer); - virtual bool HandleKey(wxControl *control, + virtual bool HandleKey(wxInputConsumer *control, const wxKeyEvent& event, bool pressed); - virtual bool HandleMouse(wxControl *control, + virtual bool HandleMouse(wxInputConsumer *control, const wxMouseEvent& event); - virtual bool HandleMouseMove(wxControl *control, const wxMouseEvent& event); + virtual bool HandleMouseMove(wxInputConsumer *control, const wxMouseEvent& event); protected: wxGTKRenderer *m_renderer; @@ -469,7 +504,7 @@ public: wxGTKCheckboxInputHandler(wxInputHandler *handler) : wxStdCheckboxInputHandler(handler) { } - virtual bool HandleKey(wxControl *control, + virtual bool HandleKey(wxInputConsumer *control, const wxKeyEvent& event, bool pressed); }; @@ -480,7 +515,7 @@ public: wxGTKTextCtrlInputHandler(wxInputHandler *handler) : wxStdTextCtrlInputHandler(handler) { } - virtual bool HandleKey(wxControl *control, + virtual bool HandleKey(wxInputConsumer *control, const wxKeyEvent& event, bool pressed); }; @@ -617,6 +652,8 @@ wxInputHandler *wxGTKTheme::GetInputHandler(const wxString& control) else if ( control == wxINP_HANDLER_NOTEBOOK ) handler = new wxStdNotebookInputHandler(GetDefaultInputHandler()); #endif // wxUSE_NOTEBOOK + else if ( control == wxINP_HANDLER_TOPLEVEL ) + handler = new wxStdFrameInputHandler(GetDefaultInputHandler()); else handler = GetDefaultInputHandler(); @@ -865,7 +902,10 @@ void wxGTKRenderer::DrawBorder(wxDC& dc, break; case wxBORDER_STATIC: - DrawShadedRect(dc, &rect, m_penDarkGrey, m_penHighlight); + for ( width = 0; width < BORDER_THICKNESS; width++ ) + { + DrawShadedRect(dc, &rect, m_penDarkGrey, m_penHighlight); + } break; case wxBORDER_RAISED: @@ -876,13 +916,19 @@ void wxGTKRenderer::DrawBorder(wxDC& dc, break; case wxBORDER_DOUBLE: - DrawShadedRect(dc, &rect, m_penLightGrey, m_penBlack); - DrawShadedRect(dc, &rect, m_penHighlight, m_penDarkGrey); - DrawRect(dc, &rect, m_penLightGrey); + for ( width = 0; width < BORDER_THICKNESS; width++ ) + { + DrawShadedRect(dc, &rect, m_penLightGrey, m_penBlack); + DrawShadedRect(dc, &rect, m_penHighlight, m_penDarkGrey); + DrawRect(dc, &rect, m_penLightGrey); + } break; case wxBORDER_SIMPLE: - DrawRect(dc, &rect, m_penBlack); + for ( width = 0; width < BORDER_THICKNESS; width++ ) + { + DrawRect(dc, &rect, m_penBlack); + } break; default: @@ -910,11 +956,11 @@ wxRect wxGTKRenderer::GetBorderDimensions(wxBorder border) const case wxBORDER_SIMPLE: case wxBORDER_STATIC: - width = 1; + width = BORDER_THICKNESS; break; case wxBORDER_DOUBLE: - width = 3; + width = 3*BORDER_THICKNESS; break; default: @@ -954,15 +1000,18 @@ void wxGTKRenderer::DrawTextBorder(wxDC& dc, { wxRect rect = rectOrig; - if ( flags & wxCONTROL_FOCUSED ) + if ( border != wxBORDER_NONE ) { - DrawRect(dc, &rect, m_penBlack); - DrawAntiShadedRect(dc, &rect, m_penDarkGrey, m_penHighlight); - } - else // !focused - { - DrawAntiShadedRect(dc, &rect, m_penDarkGrey, m_penHighlight); - DrawAntiShadedRect(dc, &rect, m_penBlack, m_penHighlight); + if ( flags & wxCONTROL_FOCUSED ) + { + DrawRect(dc, &rect, m_penBlack); + DrawAntiShadedRect(dc, &rect, m_penDarkGrey, m_penHighlight); + } + else // !focused + { + DrawAntiShadedRect(dc, &rect, m_penDarkGrey, m_penHighlight); + DrawAntiShadedRect(dc, &rect, m_penBlack, m_penHighlight); + } } if ( rectIn ) @@ -980,8 +1029,12 @@ void wxGTKRenderer::DrawButtonBorder(wxDC& dc, { // button pressed: draw a black border around it and an inward shade DrawRect(dc, &rect, m_penBlack); - DrawAntiShadedRect(dc, &rect, m_penDarkGrey, m_penHighlight); - DrawAntiShadedRect(dc, &rect, m_penBlack, m_penDarkGrey); + + for ( size_t width = 0; width < BORDER_THICKNESS; width++ ) + { + DrawAntiShadedRect(dc, &rect, m_penDarkGrey, m_penHighlight); + DrawAntiShadedRect(dc, &rect, m_penBlack, m_penDarkGrey); + } } else { @@ -999,10 +1052,13 @@ void wxGTKRenderer::DrawButtonBorder(wxDC& dc, } // now draw a normal button - DrawShadedRect(dc, &rect, m_penHighlight, m_penBlack); - DrawAntiShadedRect(dc, &rect, - wxPen(GetBackgroundColour(flags), 0, wxSOLID), - m_penDarkGrey); + for ( size_t width = 0; width < BORDER_THICKNESS; width++ ) + { + DrawShadedRect(dc, &rect, m_penHighlight, m_penBlack); + DrawAntiShadedRect(dc, &rect, + wxPen(GetBackgroundColour(flags), 0, wxSOLID), + m_penDarkGrey); + } } if ( rectIn ) @@ -1472,13 +1528,11 @@ void wxGTKRenderer::DrawRadioButton(wxDC& dc, // text control // ---------------------------------------------------------------------------- -static const int TEXT_BORDER = 2; - wxRect wxGTKRenderer::GetTextTotalArea(const wxTextCtrl *text, const wxRect& rect) { wxRect rectTotal = rect; - rectTotal.Inflate(TEXT_BORDER); + rectTotal.Inflate(2*BORDER_THICKNESS); return rectTotal; } @@ -1487,7 +1541,7 @@ wxRect wxGTKRenderer::GetTextClientArea(const wxTextCtrl *text, wxCoord *extraSpaceBeyond) { wxRect rectText = rect; - rectText.Inflate(-TEXT_BORDER); + rectText.Inflate(-2*BORDER_THICKNESS); if ( text->WrapLines() ) { @@ -2280,6 +2334,14 @@ int wxGTKRenderer::PixelToScrollbar(const wxScrollBar *scrollbar, void wxGTKRenderer::AdjustSize(wxSize *size, const wxWindow *window) { +#if wxUSE_BMPBUTTON + if ( wxDynamicCast(window, wxBitmapButton) ) + { + size->x += 4; + size->y += 4; + } else +#endif // wxUSE_BMPBUTTON +#if wxUSE_BUTTON if ( wxDynamicCast(window, wxButton) ) { if ( !(window->GetWindowStyle() & wxBU_EXACTFIT) ) @@ -2293,8 +2355,9 @@ void wxGTKRenderer::AdjustSize(wxSize *size, const wxWindow *window) // button border width size->y += 4; } - } - else if ( wxDynamicCast(window, wxScrollBar) ) + } else +#endif wxUSE_BUTTON + if ( wxDynamicCast(window, wxScrollBar) ) { // we only set the width of vert scrollbars and height of the // horizontal ones @@ -2312,6 +2375,75 @@ 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::DrawFrameBorder(wxDC& dc, + const wxRect& rect, + int flags) +{ +} + +void wxGTKRenderer::DrawFrameBackground(wxDC& dc, + const wxRect& rect, + int flags) +{ +} + +void wxGTKRenderer::DrawFrameTitle(wxDC& dc, + const wxRect& rect, + const wxString& title, + int flags) +{ +} + +void wxGTKRenderer::DrawFrameIcon(wxDC& dc, + const wxRect& rect, + const wxIcon& icon, + int flags) +{ +} + +void wxGTKRenderer::DrawFrameButton(wxDC& dc, + wxCoord x, wxCoord y, + int button, + int flags) +{ +} + +wxRect wxGTKRenderer::GetFrameClientArea(const wxRect& rect, int flags) const +{ + return rect; +} + +wxSize wxGTKRenderer::GetFrameTotalSize(const wxSize& clientSize, int flags) const +{ + return clientSize; +} + +wxSize wxGTKRenderer::GetFrameIconSize() const +{ + return wxSize(-1, -1); +} + +int wxGTKRenderer::HitTestFrame(const wxRect& rect, const wxPoint& pt, int flags) const +{ + return wxHT_TOPLEVEL_CLIENT_AREA; +} + + + // ============================================================================ // wxInputHandler // ============================================================================ @@ -2325,20 +2457,20 @@ wxGTKInputHandler::wxGTKInputHandler(wxGTKRenderer *renderer) m_renderer = renderer; } -bool wxGTKInputHandler::HandleKey(wxControl *control, +bool wxGTKInputHandler::HandleKey(wxInputConsumer *control, const wxKeyEvent& event, bool pressed) { return FALSE; } -bool wxGTKInputHandler::HandleMouse(wxControl *control, +bool wxGTKInputHandler::HandleMouse(wxInputConsumer *control, const wxMouseEvent& event) { // clicking on the control gives it focus - if ( event.ButtonDown() ) + if ( event.ButtonDown() && wxWindow::FindFocus() != control->GetInputWindow() ) { - control->SetFocus(); + control->GetInputWindow()->SetFocus(); return TRUE; } @@ -2346,16 +2478,16 @@ bool wxGTKInputHandler::HandleMouse(wxControl *control, return FALSE; } -bool wxGTKInputHandler::HandleMouseMove(wxControl *control, +bool wxGTKInputHandler::HandleMouseMove(wxInputConsumer *control, const wxMouseEvent& event) { if ( event.Entering() ) { - control->SetCurrent(TRUE); + control->GetInputWindow()->SetCurrent(TRUE); } else if ( event.Leaving() ) { - control->SetCurrent(FALSE); + control->GetInputWindow()->SetCurrent(FALSE); } else { @@ -2369,7 +2501,7 @@ bool wxGTKInputHandler::HandleMouseMove(wxControl *control, // wxGTKCheckboxInputHandler // ---------------------------------------------------------------------------- -bool wxGTKCheckboxInputHandler::HandleKey(wxControl *control, +bool wxGTKCheckboxInputHandler::HandleKey(wxInputConsumer *control, const wxKeyEvent& event, bool pressed) { @@ -2391,7 +2523,7 @@ bool wxGTKCheckboxInputHandler::HandleKey(wxControl *control, // wxGTKTextCtrlInputHandler // ---------------------------------------------------------------------------- -bool wxGTKTextCtrlInputHandler::HandleKey(wxControl *control, +bool wxGTKTextCtrlInputHandler::HandleKey(wxInputConsumer *control, const wxKeyEvent& event, bool pressed) {