]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/wincmn.cpp
added wxObject::AllocExclusive() and associated methods
[wxWidgets.git] / src / common / wincmn.cpp
index 07f22dfcb1c03de9e569a9f176bfbf42af093ae7..89f902063e3d8f6644a11524558fc020ac40f690 100644 (file)
@@ -124,16 +124,21 @@ void wxWindowBase::InitBase()
 #endif // wxUSE_VALIDATORS
 
     // use the system default colours
-    m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNFACE);
-    m_foregroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOWTEXT);
+    m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE);
+    m_foregroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
 
     // don't set the font here for wxMSW as we don't call WM_SETFONT here and
     // so the font is *not* really set - but calls to SetFont() later won't do
     // anything because m_font appears to be already set!
 #ifndef __WXMSW__
-    m_font = wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT);
+    m_font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
 #endif // __WXMSW__
 
+    // the colours/fonts are default for now
+    m_hasBgCol =
+    m_hasFgCol =
+    m_hasFont = FALSE;
+
     // no style bits
     m_exStyle =
     m_windowStyle = 0;
@@ -209,6 +214,8 @@ bool wxWindowBase::CreateBase(wxWindowBase *parent,
 // common clean up
 wxWindowBase::~wxWindowBase()
 {
+    wxASSERT_MSG( GetCapture() != this, wxT("attempt to destroy window with mouse capture") );
+
     // FIXME if these 2 cases result from programming errors in the user code
     //       we should probably assert here instead of silently fixing them
 
@@ -626,6 +633,41 @@ wxEvtHandler *wxWindowBase::PopEventHandler(bool deleteHandler)
     return handlerA;
 }
 
+bool wxWindowBase::RemoveEventHandler(wxEvtHandler *handler)
+{
+    wxCHECK_MSG( handler, FALSE, _T("RemoveEventHandler(NULL) called") );
+
+    wxEvtHandler *handlerPrev = NULL,
+                 *handlerCur = GetEventHandler();
+    while ( handlerCur )
+    {
+        wxEvtHandler *handlerNext = handlerCur->GetNextHandler();
+
+        if ( handlerCur == handler )
+        {
+            if ( handlerPrev )
+            {
+                handlerPrev->SetNextHandler(handlerNext);
+            }
+            else
+            {
+                SetEventHandler(handlerNext);
+            }
+
+            handler->SetNextHandler(NULL);
+
+            return TRUE;
+        }
+
+        handlerPrev = handlerCur;
+        handlerCur = handlerNext;
+    }
+
+    wxFAIL_MSG( _T("where has the event handler gone?") );
+
+    return FALSE;
+}
+
 // ----------------------------------------------------------------------------
 // cursors, fonts &c
 // ----------------------------------------------------------------------------
@@ -637,6 +679,8 @@ bool wxWindowBase::SetBackgroundColour( const wxColour &colour )
 
     m_backgroundColour = colour;
 
+    m_hasBgCol = TRUE;
+
     return TRUE;
 }
 
@@ -647,6 +691,8 @@ bool wxWindowBase::SetForegroundColour( const wxColour &colour )
 
     m_foregroundColour = colour;
 
+    m_hasFgCol = TRUE;
+
     return TRUE;
 }
 
@@ -678,6 +724,8 @@ bool wxWindowBase::SetFont(const wxFont& font)
 
     m_font = fontOk;
 
+    m_hasFont = TRUE;
+
     return TRUE;
 }
 
@@ -1500,10 +1548,16 @@ void wxWindowBase::OnMiddleClick( wxMouseEvent& event )
     {
         // don't translate these strings
         wxString port;
+
+#ifdef __WXUNIVERSAL__
+        port = _T("Univ/");
+#endif // __WXUNIVERSAL__
+
         switch ( wxGetOsVersion() )
         {
             case wxMOTIF_X:     port = _T("Motif"); break;
-            case wxMACINTOSH:   port = _T("Mac"); break;
+            case wxMAC:
+            case wxMAC_DARWIN:  port = _T("Mac"); break;
             case wxBEOS:        port = _T("BeOS"); break;
             case wxGTK:
             case wxGTK_WIN32:
@@ -1526,14 +1580,19 @@ void wxWindowBase::OnMiddleClick( wxMouseEvent& event )
 
         wxMessageBox(wxString::Format(
                                       _T(
-                                        "       wxWindows Library (%s port)\nVersion %u.%u.%u, compiled at %s %s\n   Copyright (c) 1995-2001 wxWindows team"
+                                        "       wxWindows Library (%s port)\nVersion %u.%u.%u%s, compiled at %s %s\n   Copyright (c) 1995-2002 wxWindows team"
                                         ),
                                       port.c_str(),
                                       wxMAJOR_VERSION,
                                       wxMINOR_VERSION,
                                       wxRELEASE_NUMBER,
-                                      __DATE__,
-                                      __TIME__
+#if wxUSE_UNICODE
+                                      L" (Unicode)",
+#else
+                                      "",
+#endif
+                                      __TDATE__,
+                                      __TTIME__
                                      ),
                      _T("wxWindows information"),
                      wxICON_INFORMATION | wxOK,
@@ -1595,3 +1654,54 @@ wxHitTest wxWindowBase::DoHitTest(wxCoord x, wxCoord y) const
     return outside ? wxHT_WINDOW_OUTSIDE : wxHT_WINDOW_INSIDE;
 }
 
+// ----------------------------------------------------------------------------
+// mouse capture
+// ----------------------------------------------------------------------------
+
+struct WXDLLEXPORT wxWindowNext
+{
+    wxWindow *win;
+    wxWindowNext *next;
+} *wxWindowBase::ms_winCaptureNext = NULL;
+
+void wxWindowBase::CaptureMouse()
+{
+    wxLogTrace(_T("mousecapture"), _T("CaptureMouse(0x%08x)"), this);
+    
+    wxWindow *winOld = GetCapture();
+    if ( winOld )
+    {
+        // save it on stack
+        wxWindowNext *item = new wxWindowNext;
+        item->win = winOld;
+        item->next = ms_winCaptureNext;
+        ms_winCaptureNext = item;
+    }
+    //else: no mouse capture to save
+
+    DoCaptureMouse();
+}
+
+void wxWindowBase::ReleaseMouse()
+{
+    wxLogTrace(_T("mousecapture"), _T("ReleaseMouse(0x%08x)"), this);
+
+    wxASSERT_MSG( GetCapture() == this, wxT("attempt to release mouse, but this window hasn't captured it") )
+
+    DoReleaseMouse();
+
+    if ( ms_winCaptureNext )
+    {
+        ms_winCaptureNext->win->CaptureMouse();
+
+        wxWindowNext *item = ms_winCaptureNext;
+        ms_winCaptureNext = item->next;
+        delete item;
+    }
+    //else: stack is empty, no previous capture
+
+    wxLogTrace(_T("mousecapture"),
+               _T("After ReleaseMouse() mouse is captured by 0x%08x"),
+               GetCapture());
+}
+