]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mgl/window.cpp
use the right GdkWindow and origin for non-pizza widget with wxClientDC
[wxWidgets.git] / src / mgl / window.cpp
index 8b52088724b1a6f407284fedffd10d8ce361174c..275d2e801e922b883584f7dfa0d61b82a61cf9bb 100644 (file)
@@ -23,8 +23,9 @@
     #pragma hdrstop
 #endif
 
+#include "wx/window.h"
+
 #ifndef WX_PRECOMP
-    #include "wx/window.h"
     #include "wx/msgdlg.h"
     #include "wx/accel.h"
     #include "wx/dc.h"
     #include "wx/utils.h"
     #include "wx/app.h"
     #include "wx/panel.h"
+    #include "wx/intl.h"
+    #include "wx/log.h"
+    #include "wx/dcscreen.h"
+    #include "wx/menu.h"
 #endif
 
 #if wxUSE_DRAG_AND_DROP
     #include "wx/dnd.h"
 #endif
 
-#include "wx/log.h"
 #include "wx/sysopt.h"
 #include "wx/mgl/private.h"
-#include "wx/intl.h"
-#include "wx/dcscreen.h"
 #include "wx/caret.h"
 
 #include <mgraph.hpp>
@@ -71,6 +73,8 @@ static wxWindowMGL *gs_mouseCapture = NULL;
 // the frame that is currently active (i.e. its child has focus). It is
 // used to generate wxActivateEvents
 static wxWindowMGL *gs_activeFrame = NULL;
+// track the mouse button state for wxGetMouseState()
+unsigned long g_buttonState = 0;
 
 // ---------------------------------------------------------------------------
 // constants
@@ -149,6 +153,8 @@ static ibool MGLAPI wxWindowMouseHandler(window_t *wnd, event_t *e)
     wxPoint orig(win->GetClientAreaOrigin());
     wxPoint where;
 
+    g_buttonState = e->modifiers;
+
     MGL_wmCoordGlobalToLocal(win->GetHandle(),
                              e->where_x, e->where_y, &where.x, &where.y);
 
@@ -178,7 +184,7 @@ static ibool MGLAPI wxWindowMouseHandler(window_t *wnd, event_t *e)
     {
         case EVT_MOUSEDOWN:
             // Change focus if the user clicks outside focused window:
-            if ( win->AcceptsFocus() && wxWindow::FindFocus() != win )
+            if ( win->CanAcceptFocus() && wxWindow::FindFocus() != win )
                 win->SetFocus();
 
             if ( e->message & EVT_DBLCLICK )
@@ -229,12 +235,12 @@ static ibool MGLAPI wxWindowMouseHandler(window_t *wnd, event_t *e)
 
                         event2.SetEventObject(gs_windowUnderMouse);
                         event2.SetEventType(wxEVT_LEAVE_WINDOW);
-                        gs_windowUnderMouse->GetEventHandler()->ProcessEvent(event2);
+                        gs_windowUnderMouse->HandleWindowEvent(event2);
                     }
 
                     wxMouseEvent event3(event);
                     event3.SetEventType(wxEVT_ENTER_WINDOW);
-                    win->GetEventHandler()->ProcessEvent(event3);
+                    win->HandleWindowEvent(event3);
 
                     gs_windowUnderMouse = win;
                 }
@@ -251,7 +257,7 @@ static ibool MGLAPI wxWindowMouseHandler(window_t *wnd, event_t *e)
                     wxMouseEvent evt(inside ?
                                      wxEVT_ENTER_WINDOW : wxEVT_LEAVE_WINDOW);
                     evt.SetEventObject(win);
-                    win->GetEventHandler()->ProcessEvent(evt);
+                    win->HandleWindowEvent(evt);
                     gs_windowUnderMouse = inside ? win : NULL;
                 }
             }
@@ -270,7 +276,7 @@ static ibool MGLAPI wxWindowMouseHandler(window_t *wnd, event_t *e)
     else
     {
         event.SetEventType(type);
-        return win->GetEventHandler()->ProcessEvent(event);
+        return win->HandleWindowEvent(event);
     }
 }
 
@@ -295,23 +301,25 @@ static long wxScanToKeyCode(event_t *event, bool translate)
 
     if ( translate )
     {
+        bool numlock = (event->modifiers & EVT_NUMLOCK) != 0;
+
         switch ( EVT_scanCode(event->message) )
         {
             KEY (KB_padMinus,       WXK_NUMPAD_SUBTRACT)
             KEY (KB_padPlus,        WXK_NUMPAD_ADD)
             KEY (KB_padTimes,       WXK_NUMPAD_MULTIPLY)
             KEY (KB_padDivide,      WXK_NUMPAD_DIVIDE)
-            KEY (KB_padCenter,      WXK_NUMPAD_SEPARATOR) // ?
-            KEY (KB_padLeft,        WXK_NUMPAD_LEFT)
-            KEY (KB_padRight,       WXK_NUMPAD_RIGHT)
-            KEY (KB_padUp,          WXK_NUMPAD_UP)
-            KEY (KB_padDown,        WXK_NUMPAD_DOWN)
-            KEY (KB_padInsert,      WXK_NUMPAD_INSERT)
-            KEY (KB_padDelete,      WXK_NUMPAD_DELETE)
-            KEY (KB_padHome,        WXK_NUMPAD_HOME)
-            KEY (KB_padEnd,         WXK_NUMPAD_END)
-            KEY (KB_padPageUp,      WXK_NUMPAD_PAGEUP)
-            KEY (KB_padPageDown,    WXK_NUMPAD_PAGEDOWN)
+            KEY (KB_padCenter,      numlock ? WXK_NUMPAD5 : WXK_NUMPAD_SEPARATOR) // ?
+            KEY (KB_padLeft,        numlock ? WXK_NUMPAD4 : WXK_NUMPAD_LEFT)
+            KEY (KB_padRight,       numlock ? WXK_NUMPAD6 : WXK_NUMPAD_RIGHT)
+            KEY (KB_padUp,          numlock ? WXK_NUMPAD8 : WXK_NUMPAD_UP)
+            KEY (KB_padDown,        numlock ? WXK_NUMPAD2 : WXK_NUMPAD_DOWN)
+            KEY (KB_padInsert,      numlock ? WXK_NUMPAD0 : WXK_NUMPAD_INSERT)
+            KEY (KB_padDelete,      numlock ? WXK_DECIMAL : WXK_NUMPAD_DELETE)
+            KEY (KB_padHome,        numlock ? WXK_NUMPAD7 : WXK_NUMPAD_HOME)
+            KEY (KB_padEnd,         numlock ? WXK_NUMPAD1 : WXK_NUMPAD_END)
+            KEY (KB_padPageUp,      numlock ? WXK_NUMPAD9 : WXK_NUMPAD_PAGEUP)
+            KEY (KB_padPageDown,    numlock ? WXK_NUMPAD3 : WXK_NUMPAD_PAGEDOWN)
             KEY (KB_1,              '1')
             KEY (KB_2,              '2')
             KEY (KB_3,              '3')
@@ -463,7 +471,7 @@ static ibool MGLAPI wxWindowKeybHandler(window_t *wnd, event_t *e)
     if ( e->what == EVT_KEYUP )
     {
         event.SetEventType(wxEVT_KEY_UP);
-        return win->GetEventHandler()->ProcessEvent(event);
+        return win->HandleWindowEvent(event);
     }
     else
     {
@@ -473,7 +481,7 @@ static ibool MGLAPI wxWindowKeybHandler(window_t *wnd, event_t *e)
         event.SetEventType(wxEVT_KEY_DOWN);
         event2 = event;
 
-        ret = win->GetEventHandler()->ProcessEvent(event);
+        ret = win->HandleWindowEvent(event);
 
         // wxMSW doesn't send char events with Alt pressed
         // Only send wxEVT_CHAR event if not processed yet. Thus, ALT-x
@@ -482,7 +490,7 @@ static ibool MGLAPI wxWindowKeybHandler(window_t *wnd, event_t *e)
         if ( !ret && event2.m_keyCode != 0 )
         {
             event2.SetEventType(wxEVT_CHAR);
-            ret = win->GetEventHandler()->ProcessEvent(event2);
+            ret = win->HandleWindowEvent(event2);
         }
 
         // Synthetize navigation key event, but do it only if the TAB key
@@ -497,7 +505,7 @@ static ibool MGLAPI wxWindowKeybHandler(window_t *wnd, event_t *e)
             // Ctrl-TAB changes the (parent) window, i.e. switch notebook page:
             navEvent.SetWindowChange(event.m_controlDown);
             navEvent.SetCurrentFocus(wxStaticCast(win, wxWindow));
-            ret = win->GetParent()->GetEventHandler()->ProcessEvent(navEvent);
+            ret = win->HandleWindowEvent(navEvent);
         }
 
         // Finally, process special meaning keys that are usually
@@ -542,7 +550,6 @@ void wxWindowMGL::Init()
     // mgl specific:
     m_wnd = NULL;
     m_isShown = true;
-    m_frozen = false;
     m_paintMGLDC = NULL;
     m_eraseBackground = -1;
 }
@@ -552,8 +559,6 @@ wxWindowMGL::~wxWindowMGL()
 {
     SendDestroyEvent();
 
-    m_isBeingDeleted = true;
-
     if ( gs_mouseCapture == this )
         ReleaseMouse();
 
@@ -687,19 +692,24 @@ void wxWindowMGL::SetFocus()
         {
             wxActivateEvent event(wxEVT_ACTIVATE, false, gs_activeFrame->GetId());
             event.SetEventObject(gs_activeFrame);
-            gs_activeFrame->GetEventHandler()->ProcessEvent(event);
+            gs_activeFrame->HandleWindowEvent(event);
         }
 
         gs_activeFrame = active;
         wxActivateEvent event(wxEVT_ACTIVATE, true, gs_activeFrame->GetId());
         event.SetEventObject(gs_activeFrame);
-        gs_activeFrame->GetEventHandler()->ProcessEvent(event);
+        gs_activeFrame->HandleWindowEvent(event);
     }
 
+    // notify the parent keeping track of focus for the kbd navigation
+    // purposes that we got it
+    wxChildFocusEvent eventFocus((wxWindow*)this);
+    HandleWindowEvent(eventFocus);
+
     wxFocusEvent event(wxEVT_SET_FOCUS, GetId());
     event.SetEventObject(this);
     event.SetWindow((wxWindow*)oldFocusedWindow);
-    GetEventHandler()->ProcessEvent(event);
+    HandleWindowEvent(event);
 
 #if wxUSE_CARET
     // caret needs to be informed about focus change
@@ -728,7 +738,7 @@ void wxWindowMGL::KillFocus()
     wxFocusEvent event(wxEVT_KILL_FOCUS, GetId());
     event.SetEventObject(this);
     event.SetWindow(gs_toBeFocusedWindow);
-    GetEventHandler()->ProcessEvent(event);
+    HandleWindowEvent(event);
 }
 
 // ----------------------------------------------------------------------------
@@ -1043,7 +1053,7 @@ void wxWindowMGL::DoSetSize(int x, int y, int width, int height, int sizeFlags)
         wxSize newSize(width, height);
         wxSizeEvent event(newSize, GetId());
         event.SetEventObject(this);
-        GetEventHandler()->ProcessEvent(event);
+        HandleWindowEvent(event);
     }
 }
 
@@ -1086,15 +1096,6 @@ void wxWindowMGL::GetTextExtent(const wxString& string,
 // painting
 // ---------------------------------------------------------------------------
 
-void wxWindowMGL::Clear()
-{
-    wxClientDC dc((wxWindow *)this);
-    wxBrush brush(GetBackgroundColour(), wxSOLID);
-    dc.SetBackground(brush);
-    dc.Clear();
-}
-
-#include "wx/menu.h"
 void wxWindowMGL::Refresh(bool eraseBack, const wxRect *rect)
 {
     if ( m_eraseBackground == -1 )
@@ -1115,26 +1116,24 @@ void wxWindowMGL::Refresh(bool eraseBack, const wxRect *rect)
 
 void wxWindowMGL::Update()
 {
-    if ( !m_frozen )
+    if ( !IsFrozen() )
         MGL_wmUpdateDC(g_winMng);
 }
 
-void wxWindowMGL::Freeze()
+void wxWindowMGL::DoFreeze()
 {
-    m_frozen = true;
     m_refreshAfterThaw = false;
 }
 
-void wxWindowMGL::Thaw()
+void wxWindowMGL::DoThaw()
 {
-    m_frozen = false;
     if ( m_refreshAfterThaw )
         Refresh();
 }
 
 void wxWindowMGL::HandlePaint(MGLDevCtx *dc)
 {
-    if ( m_frozen )
+    if ( IsFrozen() )
     {
         // Don't paint anything if the window is frozen.
         m_refreshAfterThaw = true;
@@ -1150,7 +1149,7 @@ void wxWindowMGL::HandlePaint(MGLDevCtx *dc)
     {
         dc->setColorRGB(255,0,255);
         dc->fillRect(-1000,-1000,2000,2000);
-        wxUsleep(50);
+        wxMilliSleep(50);
     }
 #endif
 
@@ -1171,17 +1170,17 @@ void wxWindowMGL::HandlePaint(MGLDevCtx *dc)
         wxWindowDC dc((wxWindow*)this);
         wxEraseEvent eventEr(m_windowId, &dc);
         eventEr.SetEventObject(this);
-        GetEventHandler()->ProcessEvent(eventEr);
+        HandleWindowEvent(eventEr);
     }
     m_eraseBackground = -1;
 
     wxNcPaintEvent eventNc(GetId());
     eventNc.SetEventObject(this);
-    GetEventHandler()->ProcessEvent(eventNc);
+    HandleWindowEvent(eventNc);
 
     wxPaintEvent eventPt(GetId());
     eventPt.SetEventObject(this);
-    GetEventHandler()->ProcessEvent(eventPt);
+    HandleWindowEvent(eventPt);
 
 #if wxUSE_CARET
     if ( caret )
@@ -1213,6 +1212,6 @@ wxWindow* wxFindWindowAtPoint(const wxPoint& pt)
 
 void wxWindowMGL::OnInternalIdle()
 {
-    if (wxUpdateUIEvent::CanUpdate(this))
+    if (wxUpdateUIEvent::CanUpdate(this) && IsShown())
         UpdateWindowUI(wxUPDATE_UI_FROMIDLE);
 }