]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/wincmn.cpp
1. minor headers rearrangement: wxprec.h doesn't include setup.h directly
[wxWidgets.git] / src / common / wincmn.cpp
index 71028dc3acd102f1e4e64ed7fdae5cb2b412710f..9b9ec27e617b330899f69db2f06c7ed623984dcd 100644 (file)
@@ -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;
 }
@@ -301,57 +303,50 @@ void wxWindowBase::Centre(int direction)
     int widthParent, heightParent;
 
     wxWindow *parent = GetParent();
-    if ( parent )
+    if ( !parent )
     {
-        parent->GetClientSize(&widthParent, &heightParent);
+        // no other choice
+        direction |= wxCENTRE_ON_SCREEN;
     }
-    else
+
+    if ( direction & wxCENTRE_ON_SCREEN )
     {
         // centre with respect to the whole screen
         wxDisplaySize(&widthParent, &heightParent);
     }
+    else
+    {
+        // centre inside the parents rectangle
+        parent->GetClientSize(&widthParent, &heightParent);
+    }
 
     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;
 
-    Move(new_x, new_y);
-}
+    // controls are always centered on their parent because it doesn't make
+    // sense to centre them on the screen
+    if ( !(direction & wxCENTRE_ON_SCREEN) || wxDynamicCast(this, wxControl) )
+    {
+        // theo nly chance to get this is to have a wxControl without parent
+        wxCHECK_RET( parent, _T("a control must have a parent") );
 
-// Center TopLevel windows over thier parent instead of the whole screen
-void wxWindowBase::CentreOnParent(int direction)
-{
-    wxPoint     ppos;
-    wxSize      psze;
-    wxSize      wsze;
-    wxWindow*   parent = GetParent();
-    int         x, y;
+        // adjust to the parents client area origin
+        wxPoint posParent = parent->ClientToScreen(wxPoint(0, 0));
 
-    if (!parent || !IsTopLevel()) {
-        Centre(direction);
-        return;
+        xNew += posParent.x;
+        yNew += posParent.y;
     }
 
-    psze = parent->GetSize();
-    ppos = parent->ClientToScreen(wxPoint(0,0));
-    wsze = GetSize();
-
-    x = y = -1;
-
-    if (direction == wxBOTH || direction == wxHORIZONTAL)
-        x = ppos.x + (psze.x  - wsze.x)/2;
-    if (direction == wxBOTH || direction == wxVERTICAL)
-        y = ppos.y + (psze.y - wsze.y)/2;
-
-    Move(x, y);
+    Move(xNew, yNew);
 }
 
 // fits the window around the children
@@ -546,7 +541,7 @@ 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 ( cursorOk == m_cursor )
+    if ( (wxCursor&)cursorOk == m_cursor )
     {
         // no change
         return FALSE;
@@ -562,7 +557,7 @@ bool wxWindowBase::SetFont(const wxFont& font)
     // don't try to set invalid font, always fall back to the default
     const wxFont& fontOk = font.Ok() ? font : *wxSWISS_FONT;
 
-    if ( fontOk == m_font )
+    if ( (wxFont&)fontOk == m_font )
     {
         // no change
         return FALSE;
@@ -1272,6 +1267,47 @@ wxPoint wxWindowBase::ConvertDialogToPixels(const wxPoint& pt)
     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
 // ----------------------------------------------------------------------------