// headers
// ----------------------------------------------------------------------------
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
- #pragma implementation "windowbase.h"
-#endif
-
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#include "wx/dialog.h"
#include "wx/msgdlg.h"
#include "wx/statusbr.h"
+ #include "wx/toolbar.h"
#include "wx/dcclient.h"
#endif //WX_PRECOMP
#include "wx/caret.h"
#endif // wxUSE_CARET
+#if wxUSE_DISPLAY
+ #include "wx/display.h"
+#endif
+
#if wxUSE_SYSTEM_OPTIONS
#include "wx/sysopt.h"
#endif
// static data
// ----------------------------------------------------------------------------
-#if defined(__WXPM__)
+#if defined(__WXPALMOS__)
+int wxWindowBase::ms_lastControlId = 32767;
+#elif defined(__WXPM__)
int wxWindowBase::ms_lastControlId = 2000;
#else
int wxWindowBase::ms_lastControlId = -200;
// VZ: this one shouldn't exist...
m_isBeingDeleted = false;
+
+ // Reserved for future use
+ m_windowReserved = NULL;
}
// common part of window creation process
int widthParent, heightParent;
wxWindow *parent = NULL;
+ wxTopLevelWindow *winTop = NULL;
if ( !(direction & wxCENTRE_ON_SCREEN) )
{
// Windows, for example, this places it completely off the screen
if ( parent )
{
- wxTopLevelWindow *winTop = wxDynamicCast(parent, wxTopLevelWindow);
+ winTop = wxDynamicCast(parent, wxTopLevelWindow);
if ( winTop && winTop->IsIconized() )
{
+ winTop = NULL;
parent = NULL;
}
}
if ( direction & wxCENTRE_ON_SCREEN )
{
+ //RN: If we are using wxDisplay we get
+ //the dimensions of the monitor the window is on,
+ //otherwise we get the dimensions of the primary monitor
+ //FIXME: wxDisplay::GetFromWindow only implemented on MSW
+#if wxUSE_DISPLAY && defined(__WXMSW__)
+ int nDisplay = wxDisplay::GetFromWindow((wxWindow*)this);
+ if(nDisplay != wxNOT_FOUND)
+ {
+ wxDisplay windowDisplay(nDisplay);
+ wxRect displayRect = windowDisplay.GetGeometry();
+ widthParent = displayRect.width;
+ heightParent = displayRect.height;
+ }
+ else
+#endif
// centre with respect to the whole screen
wxDisplaySize(&widthParent, &heightParent);
}
{
if ( IsTopLevel() )
{
- // centre on the parent
- parent->GetSize(&widthParent, &heightParent);
+ if(winTop)
+ winTop->GetRectForTopLevelChildren(&posParent.x, &posParent.y, &widthParent, &heightParent);
+ else
+ {
+ // centre on the parent
+ parent->GetSize(&widthParent, &heightParent);
- // adjust to the parents position
- posParent = parent->GetPosition();
+ // adjust to the parents position
+ posParent = parent->GetPosition();
+ }
}
else
{
xNew += posParent.x;
yNew += posParent.y;
+ // FIXME: This needs to get the client display rect of the display
+ // the window is (via wxDisplay::GetFromWindow).
+
// Base size of the visible dimensions of the display
// to take into account the taskbar. And the Mac menu bar at top.
wxRect clientrect = wxGetClientDisplayRect();
- // NB: in wxMSW, negative position may not neccessary mean "out of screen",
+ // NB: in wxMSW, negative position may not necessarily mean "out of screen",
// but it may mean that the window is placed on other than the main
// display. Therefore we only make sure centered window is on the main display
// if the parent is at least partially present here.
// fits the window around the children
void wxWindowBase::Fit()
{
- if ( GetChildren().GetCount() > 0 )
+ if ( !GetChildren().empty() )
{
SetClientSize(GetBestSize());
}
return (realChildCount > 0);
}
#endif
-
+
void wxWindowBase::InvalidateBestSize()
{
m_bestSizeCache = wxDefaultSize;
// return the size best suited for the current window
wxSize wxWindowBase::DoGetBestSize() const
{
+ wxSize best;
+
if ( m_windowSizer )
{
- return m_windowSizer->GetMinSize();
+ best = GetWindowSizeForVirtualSize(m_windowSizer->GetMinSize());
}
#if wxUSE_CONSTRAINTS
else if ( m_constraints )
// will never return a size bigger than the current one :-(
}
- return wxSize(maxX, maxY);
+ best = wxSize(maxX, maxY);
}
#endif // wxUSE_CONSTRAINTS
else if ( !GetChildren().empty()
maxX += 7;
maxY += 14;
- return wxSize(maxX, maxY);
+ best = wxSize(maxX, maxY);
}
else // ! has children
{
- // for a generic window there is no natural best size - just use either the
- // minimum size if there is one, or the current size
- if ( GetMinSize().IsFullySpecified() )
- return GetMinSize();
- else
- return GetSize();
+ // for a generic window there is no natural best size so, if the
+ // minimal size is not set, use the current size but take care to
+ // remember it as minimal size for the next time because our best size
+ // should be constant: otherwise we could get into a situation when the
+ // window is initially at some size, then expanded to a larger size and
+ // then, when the containing window is shrunk back (because our initial
+ // best size had been used for computing the parent min size), we can't
+ // be shrunk back any more because our best size is now bigger
+ wxSize size = GetMinSize();
+ if ( !size.IsFullySpecified() )
+ {
+ size.SetDefaults(GetSize());
+ wxConstCast(this, wxWindowBase)->SetMinSize(size);
+ }
+
+ // return as-is, unadjusted by the client size difference.
+ return size;
}
+
+ // Add any difference between size and client size
+ wxSize diff = GetSize() - GetClientSize();
+ best.x += wxMax(0, diff.x);
+ best.y += wxMax(0, diff.y);
+
+ return best;
}
// by default the origin is not shifted
wxPoint wxWindowBase::GetClientAreaOrigin() const
{
- return wxPoint(0, 0);
+ return wxPoint(0,0);
}
// set the min/max size of the window
wxSize wxWindowBase::DoGetVirtualSize() const
{
- wxSize s( GetClientSize() );
+ if ( m_virtualSize.IsFullySpecified() )
+ return m_virtualSize;
+
+ wxSize size = GetClientSize();
+ if ( m_virtualSize.x != wxDefaultCoord )
+ size.x = m_virtualSize.x;
+
+ if ( m_virtualSize.y != wxDefaultCoord )
+ size.y = m_virtualSize.y;
- return wxSize( wxMax( m_virtualSize.GetWidth(), s.GetWidth() ),
- wxMax( m_virtualSize.GetHeight(), s.GetHeight() ) );
+ return size;
}
// ----------------------------------------------------------------------------
if ( parent->m_inheritFgCol && !m_hasFgCol )
SetForegroundColour(parent->GetForegroundColour());
+ // inheriting (solid) background colour is wrong as it totally breaks
+ // any kind of themed backgrounds
+ //
+ // instead, the controls should use the same background as their parent
+ // (ideally by not drawing it at all)
+#if 0
if ( parent->m_inheritBgCol && !m_hasBgCol )
SetBackgroundColour(parent->GetBackgroundColour());
+#endif // 0
}
}
wxVisualAttributes attrs;
attrs.font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
attrs.colFg = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
- attrs.colBg = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE);
+ // On Smartphone/PocketPC, wxSYS_COLOUR_WINDOW is a better reflection of
+ // the usual background colour than wxSYS_COLOUR_BTNFACE.
+ // It's a pity that wxSYS_COLOUR_WINDOW isn't always a suitable background
+ // colour on other platforms.
+
+#if defined(__WXWINCE__) && (defined(__SMARTPHONE__) || defined(__POCKETPC__))
+ attrs.colBg = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
+#else
+ attrs.colBg = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE);
+#endif
return attrs;
}
return false;
m_hasBgCol = colour.Ok();
+ if ( m_backgroundStyle != wxBG_STYLE_CUSTOM )
+ m_backgroundStyle = m_hasBgCol ? wxBG_STYLE_COLOUR : wxBG_STYLE_SYSTEM;
+
m_inheritBgCol = m_hasBgCol;
m_backgroundColour = colour;
SetThemeEnabled( !m_hasBgCol && !m_foregroundColour.Ok() );
// find child window by id or name
// ----------------------------------------------------------------------------
-wxWindow *wxWindowBase::FindWindow( long id )
+wxWindow *wxWindowBase::FindWindow(long id) const
{
if ( id == m_windowId )
return (wxWindow *)this;
return (wxWindow *)res;
}
-wxWindow *wxWindowBase::FindWindow( const wxString& name )
+wxWindow *wxWindowBase::FindWindow(const wxString& name) const
{
if ( name == m_windowName )
return (wxWindow *)this;
wxWindow *
wxWindowBase::FindWindowById( long id, const wxWindow* parent )
{
- return wxFindWindowHelper(parent, _T(""), id, wxFindWindowCmpIds);
+ return wxFindWindowHelper(parent, wxEmptyString, id, wxFindWindowCmpIds);
}
// ----------------------------------------------------------------------------
void wxWindowBase::UpdateWindowUI(long flags)
{
wxUpdateUIEvent event(GetId());
- event.m_eventObject = this;
+ event.SetEventObject(this);
if ( GetEventHandler()->ProcessEvent(event) )
{
if ( !win->IsTopLevel() )
{
wxSysColourChangedEvent event2;
- event.m_eventObject = win;
+ event.SetEventObject(win);
win->GetEventHandler()->ProcessEvent(event2);
}
switch ( wxGetOsVersion() )
{
- case wxMOTIF_X: port += _T("Motif"); break;
+ case wxMOTIF_X: port += _T("Motif"); break;
case wxMAC:
- case wxMAC_DARWIN: port += _T("Mac"); break;
- case wxBEOS: port += _T("BeOS"); break;
+ case wxMAC_DARWIN: port += _T("Mac"); break;
+ case wxBEOS: port += _T("BeOS"); break;
case wxGTK:
case wxGTK_WIN32:
case wxGTK_OS2:
- case wxGTK_BEOS: port += _T("GTK"); break;
+ case wxGTK_BEOS: port += _T("GTK"); break;
case wxWINDOWS:
case wxPENWINDOWS:
case wxWINDOWS_NT:
case wxWIN32S:
case wxWIN95:
- case wxWIN386: port += _T("MS Windows"); break;
+ case wxWIN386: port += _T("MS Windows"); break;
case wxMGL_UNIX:
case wxMGL_X:
case wxMGL_WIN32:
- case wxMGL_OS2: port += _T("MGL"); break;
+ case wxMGL_OS2: port += _T("MGL"); break;
case wxWINDOWS_OS2:
- case wxOS2_PM: port += _T("OS/2"); break;
+ case wxOS2_PM: port += _T("OS/2"); break;
+ case wxPALMOS: port += _T("Palm OS"); break;
+ case wxWINDOWS_CE: port += _T("Windows CE (generic)"); break;
+ case wxWINDOWS_POCKETPC: port += _T("Windows CE PocketPC"); break;
+ case wxWINDOWS_SMARTPHONE: port += _T("Windows CE Smartphone"); break;
default: port += _T("unknown"); break;
}
wxMessageBox(wxString::Format(
_T(
- " wxWidgets Library (%s port)\nVersion %u.%u.%u%s%s, compiled at %s %s\n Copyright (c) 1995-2004 wxWidgets team"
+ " wxWidgets Library (%s port)\nVersion %d.%d.%d%s%s, compiled at %s %s\n Copyright (c) 1995-2005 wxWidgets team"
),
port.c_str(),
wxMAJOR_VERSION,
#ifdef __WXDEBUG__
_T(" Debug build"),
#else
- _T(""),
+ wxEmptyString,
#endif
__TDATE__,
__TTIME__
#endif
-#if !wxUSE_STL
// ----------------------------------------------------------------------------
// list classes implementation
// ----------------------------------------------------------------------------
+#if wxUSE_STL
+
+#include <wx/listimpl.cpp>
+WX_DEFINE_LIST(wxWindowList);
+
+#else
+
void wxWindowListNode::DeleteData()
{
delete (wxWindow *)GetData();
}
+
#endif
// ----------------------------------------------------------------------------
#endif
title = GetWindow()->GetName();
- if (!title.IsEmpty())
+ if (!title.empty())
{
*name = title;
return wxACC_OK;
return wxACC_FAIL;
wxString ht(GetWindow()->GetHelpText());
- if (!ht.IsEmpty())
+ if (!ht.empty())
{
*description = ht;
return wxACC_OK;
return wxACC_FAIL;
wxString ht(GetWindow()->GetHelpText());
- if (!ht.IsEmpty())
+ if (!ht.empty())
{
*helpText = ht;
return wxACC_OK;