X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8290d43d0d43369d007f1c47abf98a45da461a30..4fdae9972d39fbe62adaa1c1d721ba1762cd8950:/src/common/wincmn.cpp diff --git a/src/common/wincmn.cpp b/src/common/wincmn.cpp index bd49ebf5dd..59f3a09ffb 100644 --- a/src/common/wincmn.cpp +++ b/src/common/wincmn.cpp @@ -41,6 +41,7 @@ #include "wx/settings.h" #include "wx/dialog.h" #include "wx/msgdlg.h" + #include "wx/statusbr.h" #endif //WX_PRECOMP #if wxUSE_CONSTRAINTS @@ -52,6 +53,10 @@ #include "wx/dnd.h" #endif // wxUSE_DRAG_AND_DROP +#if wxUSE_HELP + #include "wx/cshelp.h" +#endif // wxUSE_HELP + #if wxUSE_TOOLTIPS #include "wx/tooltip.h" #endif // wxUSE_TOOLTIPS @@ -76,6 +81,11 @@ BEGIN_EVENT_TABLE(wxWindowBase, wxEvtHandler) EVT_SYS_COLOUR_CHANGED(wxWindowBase::OnSysColourChanged) EVT_INIT_DIALOG(wxWindowBase::OnInitDialog) EVT_MIDDLE_DOWN(wxWindowBase::OnMiddleClick) + +#if wxUSE_HELP + EVT_HELP(-1, wxWindowBase::OnHelp) +#endif // wxUSE_HELP + END_EVENT_TABLE() // ============================================================================ @@ -124,11 +134,7 @@ void wxWindowBase::InitBase() m_foregroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOWTEXT); // GRG, changed Mar/2000 -#if 0 // !defined(__WXMAC__) && !defined(__WXGTK__) - m_font = *wxSWISS_FONT; // and this? -#else m_font = settings.GetSystemFont(wxSYS_DEFAULT_GUI_FONT); -#endif // no style bits m_exStyle = m_windowStyle = 0; @@ -156,6 +162,9 @@ void wxWindowBase::InitBase() #if wxUSE_CARET m_caret = (wxCaret *)NULL; #endif // wxUSE_CARET + + // Whether we're using the current theme for this window (wxGTK only for now) + m_themeEnabled = FALSE; } // common part of window creation process @@ -319,13 +328,32 @@ bool wxWindowBase::DestroyChildren() // centre the window with respect to its parent in either (or both) directions void wxWindowBase::Centre(int direction) { + // the position/size of the parent window or of the entire screen + wxPoint posParent; int widthParent, heightParent; - wxWindow *parent = GetParent(); - if ( !parent ) + wxWindow *parent = NULL; + + if ( !(direction & wxCENTRE_ON_SCREEN) ) { - // no other choice - direction |= wxCENTRE_ON_SCREEN; + // find the parent to centre this window on: it should be the + // immediate parent for the controls but the top level parent for the + // top level windows (like dialogs) + parent = GetParent(); + if ( IsTopLevel() ) + { + while ( parent && !parent->IsTopLevel() ) + { + parent = parent->GetParent(); + } + } + + // did we find the parent? + if ( !parent ) + { + // no other choice + direction |= wxCENTRE_ON_SCREEN; + } } if ( direction & wxCENTRE_ON_SCREEN ) @@ -335,8 +363,19 @@ void wxWindowBase::Centre(int direction) } else { - // centre inside the parents rectangle - parent->GetClientSize(&widthParent, &heightParent); + if ( IsTopLevel() ) + { + // centre on the parent + parent->GetSize(&widthParent, &heightParent); + + // adjust to the parents position + posParent = parent->GetPosition(); + } + else + { + // centre inside the parents client rectangle + parent->GetClientSize(&widthParent, &heightParent); + } } int width, height; @@ -351,23 +390,12 @@ void wxWindowBase::Centre(int direction) if ( direction & wxVERTICAL ) 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 & wxCENTRE_ON_SCREEN) || !IsTopLevel() ) - { - // the only chance to get this is to have a not top level window - // without parent which shouldn't happen - wxCHECK_RET( parent, wxT("this window must have a parent") ); - - // adjust to the parents client area origin - wxPoint posParent = parent->ClientToScreen(wxPoint(0, 0)); + xNew += posParent.x; + yNew += posParent.y; - xNew += posParent.x; - yNew += posParent.y; - } - - // move the centre of this window to this position - Move(xNew, yNew); + // move the window to this position (keeping the old size but using + // SetSize() and not Move() to allow xNew and/or yNew to be -1) + SetSize(xNew, yNew, width, height, wxSIZE_ALLOW_MINUS_ONE); } // fits the window around the children @@ -375,7 +403,14 @@ void wxWindowBase::Fit() { if ( GetChildren().GetCount() > 0 ) { - SetClientSize(DoGetBestSize()); + wxSize size = DoGetBestSize(); + + // for compatibility with the old versions and because it really looks + // slightly more pretty like this, add a pad + size.x += 7; + size.y += 14; + + SetClientSize(size); } //else: do nothing if we have no children } @@ -394,10 +429,11 @@ wxSize wxWindowBase::DoGetBestSize() const node = node->GetNext() ) { wxWindow *win = node->GetData(); - if ( win->IsTopLevel() ) + if ( win->IsTopLevel() || wxDynamicCast(win, wxStatusBar) || !win->IsShown()) { // dialogs and frames lie in different top level windows - - // don't deal with them here + // don't deal with them here; as for the status bars, they + // don't lie in the client area at all continue; } @@ -418,8 +454,7 @@ wxSize wxWindowBase::DoGetBestSize() const maxY = wy + wh; } - // leave a margin - return wxSize(maxX + 7, maxY + 14); + return wxSize(maxX, maxY); } else { @@ -488,6 +523,11 @@ void wxWindowBase::AddChild(wxWindowBase *child) { wxCHECK_RET( child, wxT("can't add a NULL child") ); + // this should never happen and it will lead to a crash later if it does + // because RemoveChild() will remove only one node from the children list + // and the other(s) one(s) will be left with dangling pointers in them + wxASSERT_MSG( !GetChildren().Find(child), _T("AddChild() called twice") ); + GetChildren().Append(child); child->SetParent(this); } @@ -586,16 +626,15 @@ bool wxWindowBase::SetForegroundColour( const wxColour &colour ) bool wxWindowBase::SetCursor(const wxCursor& cursor) { - // don't try to set invalid cursor, always fall back to the default - const wxCursor& cursorOk = cursor.Ok() ? cursor : *wxSTANDARD_CURSOR; - - if ( (wxCursor&)cursorOk == m_cursor ) + // setting an invalid cursor is ok, it means that we don't have any special + // cursor + if ( m_cursor == cursor ) { // no change return FALSE; } - m_cursor = cursorOk; + m_cursor = cursor; return TRUE; } @@ -818,6 +857,64 @@ void wxWindowBase::InitDialog() GetEventHandler()->ProcessEvent(event); } +// ---------------------------------------------------------------------------- +// context-sensitive help support +// ---------------------------------------------------------------------------- + +#if wxUSE_HELP + +// associate this help text with this window +void wxWindowBase::SetHelpText(const wxString& text) +{ + wxHelpProvider *helpProvider = wxHelpProvider::Get(); + if ( helpProvider ) + { + helpProvider->AddHelp(this, text); + } +} + +// associate this help text with all windows with the same id as this +// one +void wxWindowBase::SetHelpTextForId(const wxString& text) +{ + wxHelpProvider *helpProvider = wxHelpProvider::Get(); + if ( helpProvider ) + { + helpProvider->AddHelp(GetId(), text); + } +} + +// get the help string associated with this window (may be empty) +wxString wxWindowBase::GetHelpText() const +{ + wxString text; + wxHelpProvider *helpProvider = wxHelpProvider::Get(); + if ( helpProvider ) + { + text = helpProvider->GetHelp(this); + } + + return text; +} + +// show help for this window +void wxWindowBase::OnHelp(wxHelpEvent& event) +{ + wxHelpProvider *helpProvider = wxHelpProvider::Get(); + if ( helpProvider ) + { + if ( helpProvider->ShowHelp(this) ) + { + // skip the event.Skip() below + return; + } + } + + event.Skip(); +} + +#endif // wxUSE_HELP + // ---------------------------------------------------------------------------- // tooltips // ---------------------------------------------------------------------------- @@ -1414,9 +1511,7 @@ void wxWindowBase::OnMiddleClick( wxMouseEvent& event ) wxMessageBox(wxString::Format( _T( - " wxWindows Library (%s port)\n" - "Version %u.%u.%u, compiled at %s %s\n" - " Copyright (c) 1995-2000 wxWindows team" + " wxWindows Library (%s port)\nVersion %u.%u.%u, compiled at %s %s\n Copyright (c) 1995-2000 wxWindows team" ), port.c_str(), wxMAJOR_VERSION,