X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2d3cddaf52b535e41afe7ad37d636a6258e8991b..e1910715af0629ad65976e87cdeca23ede2fd6ee:/src/univ/themes/win32.cpp diff --git a/src/univ/themes/win32.cpp b/src/univ/themes/win32.cpp index 9217d0363e..ba02e22faf 100644 --- a/src/univ/themes/win32.cpp +++ b/src/univ/themes/win32.cpp @@ -50,9 +50,10 @@ #include "wx/spinbutt.h" #include "wx/settings.h" #include "wx/menu.h" +#include "wx/artprov.h" +#include "wx/toplevel.h" #include "wx/univ/scrtimer.h" -#include "wx/toplevel.h" #include "wx/univ/renderer.h" #include "wx/univ/inphand.h" #include "wx/univ/colschem.h" @@ -321,8 +322,6 @@ public: 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, wxBitmap *bmpPressed, @@ -602,8 +601,8 @@ class wxWin32SystemMenuEvtHandler; class wxWin32FrameInputHandler : public wxStdFrameInputHandler { public: - wxWin32FrameInputHandler(wxInputHandler *handler) - : wxStdFrameInputHandler(handler), m_menuHandler(NULL) { } + wxWin32FrameInputHandler(wxInputHandler *handler); + ~wxWin32FrameInputHandler(); virtual bool HandleMouse(wxInputConsumer *control, const wxMouseEvent& event); @@ -628,6 +627,18 @@ public: virtual wxColour GetBackground(wxWindow *win) const; }; +// ---------------------------------------------------------------------------- +// wxWin32ArtProvider +// ---------------------------------------------------------------------------- + +class wxWin32ArtProvider : public wxArtProvider +{ +protected: + virtual wxBitmap CreateBitmap(const wxArtID& id, + const wxArtClient& client, + const wxSize& size); +}; + // ---------------------------------------------------------------------------- // wxWin32Theme // ---------------------------------------------------------------------------- @@ -641,6 +652,7 @@ public: virtual ~wxWin32Theme(); virtual wxRenderer *GetRenderer(); + virtual wxArtProvider *GetArtProvider(); virtual wxInputHandler *GetInputHandler(const wxString& control); virtual wxColourScheme *GetColourScheme(); @@ -649,6 +661,8 @@ private: wxInputHandler *GetDefaultInputHandler(); wxWin32Renderer *m_renderer; + + wxWin32ArtProvider *m_artProvider; // the names of the already created handlers and the handlers themselves // (these arrays are synchronized) @@ -1187,6 +1201,16 @@ wxRenderer *wxWin32Theme::GetRenderer() return m_renderer; } +wxArtProvider *wxWin32Theme::GetArtProvider() +{ + if ( !m_artProvider ) + { + m_artProvider = new wxWin32ArtProvider; + } + + return m_artProvider; +} + wxInputHandler *wxWin32Theme::GetDefaultInputHandler() { if ( !m_handlerDefault ) @@ -1338,8 +1362,12 @@ wxColour wxWin32ColourScheme::Get(wxWin32ColourScheme::StdColour col) const case CONTROL_TEXT: return wxColour(GetSysColor(COLOR_BTNTEXT)); - case SCROLLBAR: return wxColour(GetSysColor(COLOR_SCROLLBAR)); - case SCROLLBAR_PRESSED: return wxColour(GetSysColor(COLOR_HIGHLIGHT)); +#if defined(COLOR_3DLIGHT) + case SCROLLBAR: return wxColour(GetSysColor(COLOR_3DLIGHT)); +#else + case SCROLLBAR: return wxColour(0xe0e0e0); +#endif + case SCROLLBAR_PRESSED: return wxColour(GetSysColor(COLOR_BTNTEXT)); case HIGHLIGHT: return wxColour(GetSysColor(COLOR_HIGHLIGHT)); case HIGHLIGHT_TEXT: return wxColour(GetSysColor(COLOR_HIGHLIGHTTEXT)); @@ -3853,26 +3881,19 @@ static char *warning_xpm[]={ "....ddddddddddddddddddddddddddd.", ".....ddddddddddddddddddddddddd.."}; -wxIcon wxWin32Renderer::GetStdIcon(int which) const +wxBitmap wxWin32ArtProvider::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; } @@ -4346,79 +4367,13 @@ bool wxWin32StatusBarInputHandler::HandleMouseMove(wxInputConsumer *consumer, // wxWin32FrameInputHandler // ---------------------------------------------------------------------------- -bool wxWin32FrameInputHandler::HandleMouse(wxInputConsumer *consumer, - const wxMouseEvent& event) -{ - if ( event.LeftDClick() || event.LeftDown() || event.RightDown() ) - { - wxTopLevelWindow *tlw = - wxStaticCast(consumer->GetInputWindow(), wxTopLevelWindow); - - long hit = tlw->HitTest(event.GetPosition()); - - if ( event.LeftDClick() && hit == wxHT_TOPLEVEL_TITLEBAR ) - { - tlw->PerformAction(wxACTION_TOPLEVEL_BUTTON_CLICK, - tlw->IsMaximized() ? wxTOPLEVEL_BUTTON_RESTORE - : wxTOPLEVEL_BUTTON_MAXIMIZE); - return TRUE; - } - else if ( tlw->GetWindowStyle() & wxSYSTEM_MENU ) - { - if ( (event.LeftDown() && hit == wxHT_TOPLEVEL_ICON) || - (event.RightDown() && - (hit == wxHT_TOPLEVEL_TITLEBAR || - hit == wxHT_TOPLEVEL_ICON)) ) - { - PopupSystemMenu(tlw, event.GetPosition()); - return TRUE; - } - } - } - - return wxStdFrameInputHandler::HandleMouse(consumer, event); -} - -void wxWin32FrameInputHandler::PopupSystemMenu(wxTopLevelWindow *window, - const wxPoint& pos) const -{ - wxMenu *menu = new wxMenu; - - if ( window->GetWindowStyle() & wxMAXIMIZE_BOX ) - menu->Append(wxID_RESTORE_FRAME , _("&Restore")); - menu->Append(wxID_MOVE_FRAME , _("&Move")); - if ( window->GetWindowStyle() & wxRESIZE_BORDER ) - menu->Append(wxID_RESIZE_FRAME , _("&Size")); - if ( wxSystemSettings::HasFeature(wxSYS_CAN_ICONIZE_FRAME) ) - 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")); - - if ( window->GetWindowStyle() & wxMAXIMIZE_BOX ) - { - if ( window->IsMaximized() ) - { - menu->Enable(wxID_MAXIMIZE_FRAME, FALSE); - menu->Enable(wxID_MOVE_FRAME, FALSE); - if ( window->GetWindowStyle() & wxRESIZE_BORDER ) - menu->Enable(wxID_RESIZE_FRAME, FALSE); - } - else - menu->Enable(wxID_RESTORE_FRAME, FALSE); - } - - window->PopupMenu(menu, pos); - delete menu; -} - class wxWin32SystemMenuEvtHandler : public wxEvtHandler { public: - wxWin32SystemMenuEvtHandler(wxWin32FrameInputHandler *handler, - wxInputConsumer *consumer); - void RemoveSelf(); + wxWin32SystemMenuEvtHandler(wxWin32FrameInputHandler *handler); + + void Attach(wxInputConsumer *consumer); + void Detach(); private: DECLARE_EVENT_TABLE() @@ -4432,10 +4387,16 @@ private: }; wxWin32SystemMenuEvtHandler::wxWin32SystemMenuEvtHandler( - wxWin32FrameInputHandler *handler, - wxInputConsumer *consumer) + wxWin32FrameInputHandler *handler) { m_inputHnd = handler; + m_wnd = NULL; +} + +void wxWin32SystemMenuEvtHandler::Attach(wxInputConsumer *consumer) +{ + wxASSERT_MSG( m_wnd == NULL, _T("can't attach the handler twice!") ); + m_wnd = wxStaticCast(consumer->GetInputWindow(), wxTopLevelWindow); m_wnd->PushEventHandler(this); @@ -4448,12 +4409,13 @@ wxWin32SystemMenuEvtHandler::wxWin32SystemMenuEvtHandler( m_wnd->SetAcceleratorTable(table); } -void wxWin32SystemMenuEvtHandler::RemoveSelf() +void wxWin32SystemMenuEvtHandler::Detach() { if ( m_wnd ) { m_wnd->SetAcceleratorTable(m_oldAccelTable); m_wnd->RemoveEventHandler(this); + m_wnd = NULL; } } @@ -4492,25 +4454,99 @@ void wxWin32SystemMenuEvtHandler::OnClose(wxCloseEvent &event) } -bool wxWin32FrameInputHandler::HandleActivation(wxInputConsumer *consumer, - bool activated) +wxWin32FrameInputHandler::wxWin32FrameInputHandler(wxInputHandler *handler) + : wxStdFrameInputHandler(handler) { - if ( consumer->GetInputWindow()->GetWindowStyle() & wxSYSTEM_MENU ) + m_menuHandler = new wxWin32SystemMenuEvtHandler(this); +} + +wxWin32FrameInputHandler::~wxWin32FrameInputHandler() +{ + if ( m_menuHandler ) + { + m_menuHandler->Detach(); + delete m_menuHandler; + } +} + +bool wxWin32FrameInputHandler::HandleMouse(wxInputConsumer *consumer, + const wxMouseEvent& event) +{ + if ( event.LeftDClick() || event.LeftDown() || event.RightDown() ) { - if ( !activated && m_menuHandler ) + wxTopLevelWindow *tlw = + wxStaticCast(consumer->GetInputWindow(), wxTopLevelWindow); + + long hit = tlw->HitTest(event.GetPosition()); + + if ( event.LeftDClick() && hit == wxHT_TOPLEVEL_TITLEBAR ) { - m_menuHandler->RemoveSelf(); - wxDELETE(m_menuHandler); + tlw->PerformAction(wxACTION_TOPLEVEL_BUTTON_CLICK, + tlw->IsMaximized() ? wxTOPLEVEL_BUTTON_RESTORE + : wxTOPLEVEL_BUTTON_MAXIMIZE); + return TRUE; } - else if ( activated ) + else if ( tlw->GetWindowStyle() & wxSYSTEM_MENU ) { - if ( m_menuHandler ) + if ( (event.LeftDown() && hit == wxHT_TOPLEVEL_ICON) || + (event.RightDown() && + (hit == wxHT_TOPLEVEL_TITLEBAR || + hit == wxHT_TOPLEVEL_ICON)) ) { - m_menuHandler->RemoveSelf(); - delete m_menuHandler; + PopupSystemMenu(tlw, event.GetPosition()); + return TRUE; } + } + } - m_menuHandler = new wxWin32SystemMenuEvtHandler(this, consumer); + return wxStdFrameInputHandler::HandleMouse(consumer, event); +} + +void wxWin32FrameInputHandler::PopupSystemMenu(wxTopLevelWindow *window, + const wxPoint& pos) const +{ + wxMenu *menu = new wxMenu; + + if ( window->GetWindowStyle() & wxMAXIMIZE_BOX ) + menu->Append(wxID_RESTORE_FRAME , _("&Restore")); + menu->Append(wxID_MOVE_FRAME , _("&Move")); + if ( window->GetWindowStyle() & wxRESIZE_BORDER ) + menu->Append(wxID_RESIZE_FRAME , _("&Size")); + if ( wxSystemSettings::HasFeature(wxSYS_CAN_ICONIZE_FRAME) ) + 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")); + + if ( window->GetWindowStyle() & wxMAXIMIZE_BOX ) + { + if ( window->IsMaximized() ) + { + menu->Enable(wxID_MAXIMIZE_FRAME, FALSE); + menu->Enable(wxID_MOVE_FRAME, FALSE); + if ( window->GetWindowStyle() & wxRESIZE_BORDER ) + menu->Enable(wxID_RESIZE_FRAME, FALSE); + } + else + menu->Enable(wxID_RESTORE_FRAME, FALSE); + } + + window->PopupMenu(menu, pos); + delete menu; +} + +bool wxWin32FrameInputHandler::HandleActivation(wxInputConsumer *consumer, + bool activated) +{ + if ( consumer->GetInputWindow()->GetWindowStyle() & wxSYSTEM_MENU ) + { + // always detach if active frame changed: + m_menuHandler->Detach(); + + if ( activated ) + { + m_menuHandler->Attach(consumer); } }