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);
// 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()
};
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);
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;
}
}
}
-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 )
{
- if ( !activated && m_menuHandler )
+ m_menuHandler->Detach();
+ delete m_menuHandler;
+ }
+}
+
+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 )
{
- 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;
}
+ }
+ }
+
+ return wxStdFrameInputHandler::HandleMouse(consumer, event);
+}
- m_menuHandler = new wxWin32SystemMenuEvtHandler(this, consumer);
+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);
}
}