]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mgl/window.cpp
fix wrong clear selection (modified patch 1763916)
[wxWidgets.git] / src / mgl / window.cpp
index 9d0595d88dce831fd70062317f0c6e6fc61df82b..85f2abeee3d5417af7718dcfcae3321ec0e0cf1b 100644 (file)
     #pragma hdrstop
 #endif
 
     #pragma hdrstop
 #endif
 
+#include "wx/window.h"
+
 #ifndef WX_PRECOMP
 #ifndef WX_PRECOMP
-    #include "wx/window.h"
     #include "wx/msgdlg.h"
     #include "wx/accel.h"
     #include "wx/msgdlg.h"
     #include "wx/accel.h"
-    #include "wx/setup.h"
     #include "wx/dc.h"
     #include "wx/dcclient.h"
     #include "wx/utils.h"
     #include "wx/app.h"
     #include "wx/panel.h"
     #include "wx/dc.h"
     #include "wx/dcclient.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
 
 #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/sysopt.h"
 #include "wx/mgl/private.h"
-#include "wx/intl.h"
-#include "wx/dcscreen.h"
 #include "wx/caret.h"
 
 #include <mgraph.hpp>
 #include "wx/caret.h"
 
 #include <mgraph.hpp>
@@ -72,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;
 // 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
 
 // ---------------------------------------------------------------------------
 // constants
@@ -150,6 +153,8 @@ static ibool MGLAPI wxWindowMouseHandler(window_t *wnd, event_t *e)
     wxPoint orig(win->GetClientAreaOrigin());
     wxPoint where;
 
     wxPoint orig(win->GetClientAreaOrigin());
     wxPoint where;
 
+    g_buttonState = e->modifiers;
+
     MGL_wmCoordGlobalToLocal(win->GetHandle(),
                              e->where_x, e->where_y, &where.x, &where.y);
 
     MGL_wmCoordGlobalToLocal(win->GetHandle(),
                              e->where_x, e->where_y, &where.x, &where.y);
 
@@ -167,19 +172,19 @@ static ibool MGLAPI wxWindowMouseHandler(window_t *wnd, event_t *e)
     event.SetTimestamp(e->when);
     event.m_x = where.x - orig.x;
     event.m_y = where.y - orig.y;
     event.SetTimestamp(e->when);
     event.m_x = where.x - orig.x;
     event.m_y = where.y - orig.y;
-    event.m_shiftDown = ( e->modifiers & EVT_SHIFTKEY ) == EVT_SHIFTKEY;
-    event.m_controlDown = ( e->modifiers & EVT_CTRLSTATE ) == EVT_CTRLSTATE;
-    event.m_altDown = ( e->modifiers & EVT_LEFTALT ) == EVT_LEFTALT;
-    event.m_metaDown = ( e->modifiers & EVT_RIGHTALT ) == EVT_RIGHTALT;
-    event.m_leftDown = ( e->modifiers & EVT_LEFTBUT ) == EVT_LEFTBUT;
-    event.m_middleDown = ( e->modifiers & EVT_MIDDLEBUT ) == EVT_MIDDLEBUT;
-    event.m_rightDown = ( e->modifiers & EVT_RIGHTBUT ) == EVT_RIGHTBUT;
+    event.m_shiftDown = ( e->modifiers & EVT_SHIFTKEY ) != 0;
+    event.m_controlDown = ( e->modifiers & EVT_CTRLSTATE ) != 0;
+    event.m_altDown = ( e->modifiers & EVT_LEFTALT ) != 0;
+    event.m_metaDown = ( e->modifiers & EVT_RIGHTALT ) != 0;
+    event.m_leftDown = ( e->modifiers & EVT_LEFTBUT ) != 0;
+    event.m_middleDown = ( e->modifiers & EVT_MIDDLEBUT ) != 0;
+    event.m_rightDown = ( e->modifiers & EVT_RIGHTBUT ) != 0;
 
     switch (e->what)
     {
         case EVT_MOUSEDOWN:
             // Change focus if the user clicks outside focused window:
 
     switch (e->what)
     {
         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 )
                 win->SetFocus();
 
             if ( e->message & EVT_DBLCLICK )
@@ -296,25 +301,25 @@ static long wxScanToKeyCode(event_t *event, bool translate)
 
     if ( 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)
         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_padPageUp,      WXK_NUMPAD_PRIOR)
-            KEY (KB_padPageDown,    WXK_NUMPAD_PAGEDOWN)
-          //KEY (KB_padPageDown,    WXK_NUMPAD_NEXT)
+            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')
             KEY (KB_1,              '1')
             KEY (KB_2,              '2')
             KEY (KB_3,              '3')
@@ -458,10 +463,10 @@ static ibool MGLAPI wxWindowKeybHandler(window_t *wnd, event_t *e)
     event.m_scanCode = 0; // not used by wx at all
     event.m_x = where.x;
     event.m_y = where.y;
     event.m_scanCode = 0; // not used by wx at all
     event.m_x = where.x;
     event.m_y = where.y;
-    event.m_shiftDown = ( e->modifiers & EVT_SHIFTKEY ) == EVT_SHIFTKEY;
-    event.m_controlDown = ( e->modifiers & EVT_CTRLSTATE ) == EVT_CTRLSTATE;
-    event.m_altDown = ( e->modifiers & EVT_LEFTALT ) == EVT_LEFTALT;
-    event.m_metaDown = ( e->modifiers & EVT_RIGHTALT ) == EVT_RIGHTALT;
+    event.m_shiftDown = ( e->modifiers & EVT_SHIFTKEY ) != 0;
+    event.m_controlDown = ( e->modifiers & EVT_CTRLSTATE ) != 0;
+    event.m_altDown = ( e->modifiers & EVT_LEFTALT ) != 0;
+    event.m_metaDown = ( e->modifiers & EVT_RIGHTALT ) != 0;
 
     if ( e->what == EVT_KEYUP )
     {
 
     if ( e->what == EVT_KEYUP )
     {
@@ -699,6 +704,11 @@ void wxWindowMGL::SetFocus()
         gs_activeFrame->GetEventHandler()->ProcessEvent(event);
     }
 
         gs_activeFrame->GetEventHandler()->ProcessEvent(event);
     }
 
+    // notify the parent keeping track of focus for the kbd navigation
+    // purposes that we got it
+    wxChildFocusEvent eventFocus((wxWindow*)this);
+    GetEventHandler()->ProcessEvent(eventFocus);
+
     wxFocusEvent event(wxEVT_SET_FOCUS, GetId());
     event.SetEventObject(this);
     event.SetWindow((wxWindow*)oldFocusedWindow);
     wxFocusEvent event(wxEVT_SET_FOCUS, GetId());
     event.SetEventObject(this);
     event.SetWindow((wxWindow*)oldFocusedWindow);
@@ -1097,7 +1107,6 @@ void wxWindowMGL::Clear()
     dc.Clear();
 }
 
     dc.Clear();
 }
 
-#include "wx/menu.h"
 void wxWindowMGL::Refresh(bool eraseBack, const wxRect *rect)
 {
     if ( m_eraseBackground == -1 )
 void wxWindowMGL::Refresh(bool eraseBack, const wxRect *rect)
 {
     if ( m_eraseBackground == -1 )
@@ -1153,7 +1162,7 @@ void wxWindowMGL::HandlePaint(MGLDevCtx *dc)
     {
         dc->setColorRGB(255,0,255);
         dc->fillRect(-1000,-1000,2000,2000);
     {
         dc->setColorRGB(255,0,255);
         dc->fillRect(-1000,-1000,2000,2000);
-        wxUsleep(50);
+        wxMilliSleep(50);
     }
 #endif
 
     }
 #endif