X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/88ac883a0d005437c97a60d8195bd5e4719b1154..ca17eff36b7084f213ab3c233b6183ef8bd1a345:/src/common/wincmn.cpp diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index 92b73efe79..13c3f639ab 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -100,9 +100,9 @@ void wxWindowBase::InitBase() m_isShown = FALSE; m_isEnabled = TRUE; - // no client data - m_clientObject = (wxClientData *)NULL; + // no client data (yet) m_clientData = NULL; + m_clientDataType = ClientData_None; // the default event handler is just this window m_eventHandler = this; @@ -154,6 +154,7 @@ bool wxWindowBase::CreateBase(wxWindowBase *parent, const wxPoint& WXUNUSED(pos), const wxSize& WXUNUSED(size), long style, + const wxValidator& validator, const wxString& name) { // m_isWindow is set to TRUE in wxWindowBase::Init() as well as many other @@ -167,6 +168,7 @@ bool wxWindowBase::CreateBase(wxWindowBase *parent, SetName(name); SetWindowStyleFlag(style); SetParent(parent); + SetValidator(validator); return TRUE; } @@ -191,6 +193,16 @@ wxWindowBase::~wxWindowBase() wxASSERT_MSG( GetChildren().GetCount() == 0, _T("children not destroyed") ); + // make sure that there are no dangling pointers left pointing to us + wxPanel *panel = wxDynamicCast(GetParent(), wxPanel); + if ( panel ) + { + if ( panel->GetLastFocus() == this ) + { + panel->SetLastFocus((wxWindow *)NULL); + } + } + #if wxUSE_CARET if ( m_caret ) delete m_caret; @@ -304,16 +316,27 @@ void wxWindowBase::Centre(int direction) int width, height; GetSize(&width, &height); - int new_x = -1, - new_y = -1; + int xNew = -1, + yNew = -1; if ( direction & wxHORIZONTAL ) - new_x = (widthParent - width)/2; + xNew = (widthParent - width)/2; if ( direction & wxVERTICAL ) - new_y = (heightParent - height)/2; + yNew = (heightParent - height)/2; + + // controls are always centered on their parent because it doesn't make + // sense to centre them on the screen + if ( (direction & wxCENTER_FRAME) || wxDynamicCast(this, wxControl) ) + { + // adjust to the parents client area origin + wxPoint posParent = parent->ClientToScreen(wxPoint(0, 0)); - Move(new_x, new_y); + xNew += posParent.x; + yNew += posParent.y; + } + + Move(xNew, yNew); } // fits the window around the children @@ -322,14 +345,14 @@ void wxWindowBase::Fit() int maxX = 0, maxY = 0; - wxWindowList::Node *node = GetChildren().GetFirst(); - while ( node ) + for ( wxWindowList::Node *node = GetChildren().GetFirst(); + node; + node = node->GetNext() ) { wxWindow *win = node->GetData(); - if ( win->IsKindOf(CLASSINFO(wxFrame)) || - win->IsKindOf(CLASSINFO(wxDialog)) ) + if ( win->IsTopLevel() ) { - // dialogs and frames line in different top level windows - don't + // dialogs and frames lie in different top level windows - don't // deal with them here continue; } @@ -341,8 +364,6 @@ void wxWindowBase::Fit() maxX = wx + ww; if ( wy + wh > maxY ) maxY = wy + wh; - - node = node->GetNext(); } // leave a margin @@ -392,6 +413,14 @@ bool wxWindowBase::Enable(bool enable) return FALSE; } } +// ---------------------------------------------------------------------------- +// RTTI +// ---------------------------------------------------------------------------- + +bool wxWindowBase::IsTopLevel() const +{ + return wxDynamicCast(this, wxFrame) || wxDynamicCast(this, wxDialog); +} // ---------------------------------------------------------------------------- // reparenting the window @@ -542,7 +571,7 @@ void wxWindowBase::SetCaret(wxCaret *caret) if ( m_caret ) { wxASSERT_MSG( m_caret->GetWindow() == this, - "caret should be created associated to this window" ); + _T("caret should be created associated to this window") ); } } #endif // wxUSE_CARET @@ -618,9 +647,21 @@ wxWindow *wxWindowBase::FindWindow( const wxString& name ) // dialog oriented functions // ---------------------------------------------------------------------------- -void wxWindowBase::MakeModal(bool WXUNUSED(modal)) +void wxWindowBase::MakeModal(bool modal) { - wxFAIL_MSG(_T("TODO")); + // Disable all other windows + if ( IsTopLevel() ) + { + wxWindowList::Node *node = wxTopLevelWindows.GetFirst(); + while (node) + { + wxWindow *win = node->GetData(); + if (win != this) + win->Enable(!modal); + + node = node->GetNext(); + } + } } bool wxWindowBase::Validate() @@ -914,7 +955,7 @@ bool wxWindowBase::DoPhase(int phase) while (node) { wxWindow *child = node->GetData(); - if ( !child->IsKindOf(CLASSINFO(wxFrame)) && !child->IsKindOf(CLASSINFO(wxDialog)) ) + if ( !child->IsTopLevel() ) { wxLayoutConstraints *constr = child->GetConstraints(); if ( constr ) @@ -958,7 +999,7 @@ void wxWindowBase::ResetConstraints() while (node) { wxWindow *win = node->GetData(); - if ( !win->IsKindOf(CLASSINFO(wxFrame)) && !win->IsKindOf(CLASSINFO(wxDialog)) ) + if ( !win->IsTopLevel() ) win->ResetConstraints(); node = node->GetNext(); } @@ -1015,7 +1056,7 @@ void wxWindowBase::SetConstraintSizes(bool recurse) while (node) { wxWindow *win = node->GetData(); - if ( !win->IsKindOf(CLASSINFO(wxFrame)) && !win->IsKindOf(CLASSINFO(wxDialog)) ) + if ( !win->IsTopLevel() ) win->SetConstraintSizes(); node = node->GetNext(); } @@ -1026,8 +1067,7 @@ void wxWindowBase::SetConstraintSizes(bool recurse) // this window. void wxWindowBase::TransformSizerToActual(int *x, int *y) const { - if ( !m_sizerParent || m_sizerParent->IsKindOf(CLASSINFO(wxDialog) ) || - m_sizerParent->IsKindOf(CLASSINFO(wxFrame)) ) + if ( !m_sizerParent || m_sizerParent->IsTopLevel() ) return; int xp, yp; @@ -1159,22 +1199,28 @@ void wxWindowBase::UpdateWindowUI() if ( event.GetSetEnabled() ) Enable(event.GetEnabled()); - if ( event.GetSetText() && IsKindOf(CLASSINFO(wxControl)) ) - ((wxControl*)this)->SetLabel(event.GetText()); + if ( event.GetSetText() ) + { + wxControl *control = wxDynamicCast(this, wxControl); + if ( control ) + control->SetLabel(event.GetText()); + } #if wxUSE_CHECKBOX - if ( IsKindOf(CLASSINFO(wxCheckBox)) ) + wxCheckBox *checkbox = wxDynamicCast(this, wxCheckBox); + if ( checkbox ) { if ( event.GetSetChecked() ) - ((wxCheckBox *)this)->SetValue(event.GetChecked()); + checkbox->SetValue(event.GetChecked()); } #endif // wxUSE_CHECKBOX #if wxUSE_RADIOBUTTON - if ( IsKindOf(CLASSINFO(wxRadioButton)) ) + wxRadioButton *radiobtn = wxDynamicCast(this, wxRadioButton); + if ( radiobtn ) { if ( event.GetSetChecked() ) - ((wxRadioButton *) this)->SetValue(event.GetChecked()); + radiobtn->SetValue(event.GetChecked()); } #endif // wxUSE_RADIOBUTTON } @@ -1189,9 +1235,11 @@ wxPoint wxWindowBase::ConvertPixelsToDialog(const wxPoint& pt) { int charWidth = GetCharWidth(); int charHeight = GetCharHeight(); - wxPoint pt2; - pt2.x = (int) ((pt.x * 4) / charWidth) ; - pt2.y = (int) ((pt.y * 8) / charHeight) ; + wxPoint pt2(-1, -1); + if (pt.x != -1) + pt2.x = (int) ((pt.x * 4) / charWidth) ; + if (pt.y != -1) + pt2.y = (int) ((pt.y * 8) / charHeight) ; return pt2; } @@ -1200,13 +1248,56 @@ wxPoint wxWindowBase::ConvertDialogToPixels(const wxPoint& pt) { int charWidth = GetCharWidth(); int charHeight = GetCharHeight(); - wxPoint pt2; - pt2.x = (int) ((pt.x * charWidth) / 4) ; - pt2.y = (int) ((pt.y * charHeight) / 8) ; + wxPoint pt2(-1, -1); + if (pt.x != -1) + pt2.x = (int) ((pt.x * charWidth) / 4) ; + if (pt.y != -1) + pt2.y = (int) ((pt.y * charHeight) / 8) ; return pt2; } +// ---------------------------------------------------------------------------- +// client data +// ---------------------------------------------------------------------------- + +void wxWindowBase::DoSetClientObject( wxClientData *data ) +{ + wxASSERT_MSG( m_clientDataType != ClientData_Void, + _T("can't have both object and void client data") ); + + if ( m_clientObject ) + delete m_clientObject; + + m_clientObject = data; + m_clientDataType = ClientData_Object; +} + +wxClientData *wxWindowBase::DoGetClientObject() const +{ + wxASSERT_MSG( m_clientDataType == ClientData_Object, + _T("this window doesn't have object client data") ); + + return m_clientObject; +} + +void wxWindowBase::DoSetClientData( void *data ) +{ + wxASSERT_MSG( m_clientDataType != ClientData_Object, + _T("can't have both object and void client data") ); + + m_clientData = data; + m_clientDataType = ClientData_Void; +} + +void *wxWindowBase::DoGetClientData() const +{ + wxASSERT_MSG( m_clientDataType == ClientData_Void, + _T("this window doesn't have void client data") ); + + return m_clientData; +} + // ---------------------------------------------------------------------------- // event handlers // ----------------------------------------------------------------------------