X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e2f9212c00094f3032511bc7d42efc7c1b91134b..8f5e92dbe5b8adca2af32da6d43165b1c78dacfd:/src/common/wincmn.cpp diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index df455c9cfa..6ffcaea012 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -115,10 +115,6 @@ void wxWindowBase::InitBase() m_isShown = FALSE; m_isEnabled = TRUE; - // no client data (yet) - m_clientData = NULL; - m_clientDataType = wxClientData_None; - // the default event handler is just this window m_eventHandler = this; @@ -128,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; @@ -151,6 +152,7 @@ void wxWindowBase::InitBase() m_constraints = (wxLayoutConstraints *) NULL; m_constraintsInvolvedIn = (wxWindowList *) NULL; m_windowSizer = (wxSizer *) NULL; + m_containingSizer = (wxSizer *) NULL; m_autoLayout = FALSE; #endif // wxUSE_CONSTRAINTS @@ -166,6 +168,10 @@ void wxWindowBase::InitBase() m_caret = (wxCaret *)NULL; #endif // wxUSE_CARET +#if wxUSE_PALETTE + m_hasCustomPalette = FALSE; +#endif // wxUSE_PALETTE + // Whether we're using the current theme for this window (wxGTK only for now) m_themeEnabled = FALSE; } @@ -213,6 +219,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 @@ -236,10 +244,6 @@ wxWindowBase::~wxWindowBase() delete m_windowValidator; #endif // wxUSE_VALIDATORS - // we only delete object data, not untyped - if ( m_clientDataType == wxClientData_Object ) - delete m_clientObject; - #if wxUSE_CONSTRAINTS // Have to delete constraints/sizer FIRST otherwise sizers may try to look // at deleted windows as they delete themselves. @@ -254,6 +258,9 @@ wxWindowBase::~wxWindowBase() m_constraints = NULL; } + if ( m_containingSizer ) + m_containingSizer->Remove((wxWindow*)this); + if ( m_windowSizer ) delete m_windowSizer; @@ -398,14 +405,18 @@ void wxWindowBase::Centre(int direction) wxRect rect = wxGetClientDisplayRect(); wxSize size (rect.width,rect.height); +#ifndef __WXMGL__ // FIXME - temporary dirty hack!! if (posParent.x >= 0) // if parent is on the main display +#endif { if (xNew < 0) xNew = 0; else if (xNew+width > size.x) xNew = size.x-width-1; } +#ifndef __WXMGL__ // FIXME - temporary dirty hack!! if (posParent.y >= 0) // if parent is on the main display +#endif { if (yNew+height > size.y) yNew = size.y-height-1; @@ -634,6 +645,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 // ---------------------------------------------------------------------------- @@ -645,6 +691,8 @@ bool wxWindowBase::SetBackgroundColour( const wxColour &colour ) m_backgroundColour = colour; + m_hasBgCol = TRUE; + return TRUE; } @@ -655,6 +703,8 @@ bool wxWindowBase::SetForegroundColour( const wxColour &colour ) m_foregroundColour = colour; + m_hasFgCol = TRUE; + return TRUE; } @@ -686,9 +736,36 @@ bool wxWindowBase::SetFont(const wxFont& font) m_font = fontOk; + m_hasFont = TRUE; + return TRUE; } +#if wxUSE_PALETTE + +void wxWindowBase::SetPalette(const wxPalette& pal) +{ + m_hasCustomPalette = TRUE; + m_palette = pal; + + // VZ: can anyone explain me what do we do here? + wxWindowDC d((wxWindow *) this); + d.SetPalette(pal); +} + +wxWindow *wxWindowBase::GetAncestorWithCustomPalette() const +{ + wxWindow *win = (wxWindow *)this; + while ( win && !win->HasCustomPalette() ) + { + win = win->GetParent(); + } + + return win; +} + +#endif // wxUSE_PALETTE + #if wxUSE_CARET void wxWindowBase::SetCaret(wxCaret *caret) { @@ -962,7 +1039,7 @@ void wxWindowBase::OnHelp(wxHelpEvent& event) #endif // wxUSE_HELP // ---------------------------------------------------------------------------- -// tooltips +// tooltipsroot.Replace("\\", "/"); // ---------------------------------------------------------------------------- #if wxUSE_TOOLTIPS @@ -1355,6 +1432,23 @@ void wxWindowBase::GetClientSizeConstraint(int *w, int *h) const GetClientSize(w, h); } +void wxWindowBase::AdjustForParentClientOrigin(int& x, int& y, int sizeFlags) +{ + // don't do it for the dialogs/frames - they float independently of their + // parent + if ( !IsTopLevel() ) + { + wxWindow *parent = GetParent(); + if ( !(sizeFlags & wxSIZE_NO_ADJUSTMENTS) && parent ) + { + wxPoint pt(parent->GetClientAreaOrigin()); + x += pt.x; + y += pt.y; + } + } +} + + void wxWindowBase::GetPositionConstraint(int *x, int *y) const { wxLayoutConstraints *constr = GetConstraints(); @@ -1454,51 +1548,6 @@ wxPoint wxWindowBase::ConvertDialogToPixels(const wxPoint& pt) return pt2; } -// ---------------------------------------------------------------------------- -// client data -// ---------------------------------------------------------------------------- - -void wxWindowBase::DoSetClientObject( wxClientData *data ) -{ - wxASSERT_MSG( m_clientDataType != wxClientData_Void, - wxT("can't have both object and void client data") ); - - if ( m_clientObject ) - delete m_clientObject; - - m_clientObject = data; - m_clientDataType = wxClientData_Object; -} - -wxClientData *wxWindowBase::DoGetClientObject() const -{ - // it's not an error to call GetClientObject() on a window which doesn't - // have client data at all - NULL will be returned - wxASSERT_MSG( m_clientDataType != wxClientData_Void, - wxT("this window doesn't have object client data") ); - - return m_clientObject; -} - -void wxWindowBase::DoSetClientData( void *data ) -{ - wxASSERT_MSG( m_clientDataType != wxClientData_Object, - wxT("can't have both object and void client data") ); - - m_clientData = data; - m_clientDataType = wxClientData_Void; -} - -void *wxWindowBase::DoGetClientData() const -{ - // it's not an error to call GetClientData() on a window which doesn't have - // client data at all - NULL will be returned - wxASSERT_MSG( m_clientDataType != wxClientData_Object, - wxT("this window doesn't have void client data") ); - - return m_clientData; -} - // ---------------------------------------------------------------------------- // event handlers // ---------------------------------------------------------------------------- @@ -1536,10 +1585,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: @@ -1562,14 +1617,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-2000 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, @@ -1631,3 +1691,64 @@ 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 ) + { + // I think this is correct, but not compatible with some ports +#if defined(__WXX11__) || defined(__WXMGL__) + ((wxWindowBase*) winOld)->DoReleaseMouse(); +#endif + + // 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 ) + { + // I think this is correct, but not compatible with some ports +#if defined(__WXX11__) || defined(__WXMGL__) + ((wxWindowBase*)ms_winCaptureNext->win)->DoCaptureMouse(); +#else + ms_winCaptureNext->win->CaptureMouse(); +#endif + + 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()); +} +