#include "wx/settings.h"
#include "wx/dialog.h"
#include "wx/msgdlg.h"
+ #include "wx/statusbr.h"
#endif //WX_PRECOMP
#if wxUSE_CONSTRAINTS
#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
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()
// ============================================================================
#endif // wxUSE_VALIDATORS
// use the system default colours
- wxSystemSettings settings;
-
- m_backgroundColour = settings.GetSystemColour(wxSYS_COLOUR_BTNFACE);
- // m_foregroundColour = *wxBLACK; // TODO take this from sys settings too?
+ m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_BTNFACE);
m_foregroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOWTEXT);
-#if !defined(__WXMAC__) && !defined(__WXGTK__)
- m_font = *wxSWISS_FONT; // and this?
-#else
- m_font = settings.GetSystemFont(wxSYS_DEFAULT_GUI_FONT);
-#endif
+ // 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);
+#endif // __WXMSW__
// no style bits
m_exStyle =
#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
// 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 )
}
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;
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") );
+ xNew += posParent.x;
+ yNew += posParent.y;
- // adjust to the parents client area origin
- wxPoint posParent = parent->ClientToScreen(wxPoint(0, 0));
+ // Base size of the visible dimensions of the display
+ // to take into account the taskbar
+ wxRect rect = wxGetClientDisplayRect();
+ wxSize size (rect.width,rect.height);
- xNew += posParent.x;
- yNew += posParent.y;
+ if (posParent.x >= 0) // if parent is on the main display
+ {
+ if (xNew < 0)
+ xNew = 0;
+ else if (xNew+width > size.x)
+ xNew = size.x-width-1;
+ }
+ if (posParent.y >= 0) // if parent is on the main display
+ {
+ if (yNew+height > size.y)
+ yNew = size.y-height-1;
+
+ // Make certain that the title bar is initially visible
+ // always, even if this would push the bottom of the
+ // dialog of the visible area of the display
+ if (yNew < 0)
+ yNew = 0;
}
- // 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
{
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
}
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;
}
maxY = wy + wh;
}
- // leave a margin
- return wxSize(maxX + 7, maxY + 14);
+ return wxSize(maxX, maxY);
}
else
{
{
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);
}
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;
}
// don't try to set invalid font, always fall back to the default
const wxFont& fontOk = font.Ok() ? font : *wxSWISS_FONT;
- if ( (wxFont&)fontOk == m_font )
+ if ( fontOk == m_font )
{
// no change
return FALSE;
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
// ----------------------------------------------------------------------------
if ( event.GetSetText() )
{
- wxControl *control = wxDynamicCast(this, wxControl);
+ wxControl *control = wxDynamicThisCast(this, wxControl);
if ( control )
{
wxTextCtrl *text = wxDynamicCast(control, wxTextCtrl);
}
#if wxUSE_CHECKBOX
- wxCheckBox *checkbox = wxDynamicCast(this, wxCheckBox);
+ wxCheckBox *checkbox = wxDynamicThisCast(this, wxCheckBox);
if ( checkbox )
{
if ( event.GetSetChecked() )
#endif // wxUSE_CHECKBOX
#if wxUSE_RADIOBTN
- wxRadioButton *radiobtn = wxDynamicCast(this, wxRadioButton);
+ wxRadioButton *radiobtn = wxDynamicThisCast(this, wxRadioButton);
if ( radiobtn )
{
if ( event.GetSetChecked() )
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,