]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/wincmn.cpp
Give wxListBox a GetClassDefaultAttributes so wxCalendarCtrl (and
[wxWidgets.git] / src / common / wincmn.cpp
index 5c24fd2e89fcbc31ed97af79de4ffb75768b3e3c..aa5c6d38653702256dbc393c32cb3fcf7bf338aa 100644 (file)
@@ -121,9 +121,9 @@ wxWindowBase::wxWindowBase()
 
     // no constraints on the minimal window size
     m_minWidth =
-    m_maxWidth = wxDefaultSize.x;
+    m_maxWidth = wxDefaultCoord;
     m_minHeight =
-    m_maxHeight = wxDefaultSize.y;
+    m_maxHeight = wxDefaultCoord;
 
     // invalidiated cache value
     m_bestSizeCache = wxDefaultSize;
@@ -186,9 +186,9 @@ wxWindowBase::wxWindowBase()
     m_virtualSize = wxDefaultSize;
 
     m_minVirtualWidth =
-    m_maxVirtualWidth = wxDefaultSize.x;
+    m_maxVirtualWidth = wxDefaultCoord;
     m_minVirtualHeight =
-    m_maxVirtualHeight = wxDefaultSize.y;
+    m_maxVirtualHeight = wxDefaultCoord;
 
     m_windowVariant = wxWINDOW_VARIANT_NORMAL;
 
@@ -438,8 +438,8 @@ void wxWindowBase::Centre(int direction)
     int width, height;
     GetSize(&width, &height);
 
-    int xNew = wxDefaultPosition.x,
-        yNew = wxDefaultPosition.y;
+    int xNew = wxDefaultCoord,
+        yNew = wxDefaultCoord;
 
     if ( direction & wxHORIZONTAL )
         xNew = (widthParent - width)/2;
@@ -451,9 +451,8 @@ void wxWindowBase::Centre(int direction)
     yNew += posParent.y;
 
     // Base size of the visible dimensions of the display
-    // to take into account the taskbar
-    wxRect rect = wxGetClientDisplayRect();
-    wxSize size (rect.width,rect.height);
+    // 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",
     //     but it may mean that the window is placed on other than the main
@@ -461,21 +460,21 @@ void wxWindowBase::Centre(int direction)
     //     if the parent is at least partially present here.
     if (posParent.x + widthParent >= 0)  // if parent is (partially) on the main display
     {
-        if (xNew < 0)
-            xNew = 0;
-        else if (xNew+width > size.x)
-            xNew = size.x-width-1;
+        if (xNew < clientrect.GetLeft())
+            xNew = clientrect.GetLeft();
+        else if (xNew + width > clientrect.GetRight())
+            xNew = clientrect.GetRight() - width;
     }
     if (posParent.y + heightParent >= 0)  // if parent is (partially) on the main display
     {
-        if (yNew+height > size.y)
-            yNew = size.y-height-1;
+        if (yNew + height > clientrect.GetBottom())
+            yNew = clientrect.GetBottom() - height;
 
         // 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;
+        // dialog off the visible area of the display
+        if (yNew < clientrect.GetTop())
+            yNew = clientrect.GetTop();
     }
 
     // move the window to this position (keeping the old size but using
@@ -596,9 +595,9 @@ wxSize wxWindowBase::DoGetBestSize() const
 
             // if the window hadn't been positioned yet, assume that it is in
             // the origin
-            if ( wx == wxDefaultPosition.x )
+            if ( wx == wxDefaultCoord )
                 wx = 0;
-            if ( wy == wxDefaultPosition.y )
+            if ( wy == wxDefaultCoord )
                 wy = 0;
 
             win->GetSize(&ww, &wh);
@@ -669,8 +668,8 @@ void wxWindowBase::SetSizeHints(int minW, int minH,
 {
     // setting min width greater than max width leads to infinite loops under
     // X11 and generally doesn't make any sense, so don't allow it
-    wxCHECK_RET( (minW == wxDefaultSize.x || maxW == wxDefaultSize.x || minW <= maxW) &&
-                    (minH == wxDefaultSize.y || maxH == wxDefaultSize.y || minH <= maxH),
+    wxCHECK_RET( (minW == wxDefaultCoord || maxW == wxDefaultCoord || minW <= maxW) &&
+                    (minH == wxDefaultCoord || maxH == wxDefaultCoord || minH <= maxH),
                  _T("min width/height must be less than max width/height!") );
 
     m_minWidth = minW;
@@ -735,13 +734,13 @@ void wxWindowBase::SetVirtualSizeHints( int minW, int minH,
 
 void wxWindowBase::DoSetVirtualSize( int x, int y )
 {
-    if ( m_minVirtualWidth != wxDefaultSize.x && m_minVirtualWidth > x )
+    if ( m_minVirtualWidth != wxDefaultCoord && m_minVirtualWidth > x )
         x = m_minVirtualWidth;
-    if ( m_maxVirtualWidth != wxDefaultSize.x && m_maxVirtualWidth < x )
+    if ( m_maxVirtualWidth != wxDefaultCoord && m_maxVirtualWidth < x )
         x = m_maxVirtualWidth;
-    if ( m_minVirtualHeight != wxDefaultSize.y && m_minVirtualHeight > y )
+    if ( m_minVirtualHeight != wxDefaultCoord && m_minVirtualHeight > y )
         y = m_minVirtualHeight;
-    if ( m_maxVirtualHeight != wxDefaultSize.y && m_maxVirtualHeight < y )
+    if ( m_maxVirtualHeight != wxDefaultCoord && m_maxVirtualHeight < y )
         y = m_maxVirtualHeight;
 
     m_virtualSize = wxSize(x, y);
@@ -1891,22 +1890,22 @@ void wxWindowBase::SetSizeConstraint(int x, int y, int w, int h)
     wxLayoutConstraints *constr = GetConstraints();
     if ( constr )
     {
-        if ( x != wxDefaultPosition.x )
+        if ( x != wxDefaultCoord )
         {
             constr->left.SetValue(x);
             constr->left.SetDone(true);
         }
-        if ( y != wxDefaultPosition.y )
+        if ( y != wxDefaultCoord )
         {
             constr->top.SetValue(y);
             constr->top.SetDone(true);
         }
-        if ( w != wxDefaultSize.x )
+        if ( w != wxDefaultCoord )
         {
             constr->width.SetValue(w);
             constr->width.SetDone(true);
         }
-        if ( h != wxDefaultSize.y )
+        if ( h != wxDefaultCoord )
         {
             constr->height.SetValue(h);
             constr->height.SetDone(true);
@@ -1919,12 +1918,12 @@ void wxWindowBase::MoveConstraint(int x, int y)
     wxLayoutConstraints *constr = GetConstraints();
     if ( constr )
     {
-        if ( x != wxDefaultPosition.x )
+        if ( x != wxDefaultCoord )
         {
             constr->left.SetValue(x);
             constr->left.SetDone(true);
         }
-        if ( y != wxDefaultPosition.y )
+        if ( y != wxDefaultCoord )
         {
             constr->top.SetValue(y);
             constr->top.SetDone(true);
@@ -2408,7 +2407,7 @@ bool wxWindowBase::TryParent(wxEvent& event)
 }
 
 // ----------------------------------------------------------------------------
-// navigation
+// keyboard navigation
 // ----------------------------------------------------------------------------
 
 // Navigates in the specified direction.
@@ -2424,6 +2423,36 @@ bool wxWindowBase::Navigate(int flags)
     return false;
 }
 
+void wxWindowBase::DoMoveInTabOrder(wxWindow *win, MoveKind move)
+{
+    // check that we're not a top level window
+    wxCHECK_RET( GetParent(),
+                    _T("MoveBefore/AfterInTabOrder() don't work for TLWs!") );
+
+    // find the target window in the siblings list
+    wxWindowList& siblings = GetParent()->GetChildren();
+    wxWindowList::compatibility_iterator i = siblings.Find(win);
+    wxCHECK_RET( i, _T("MoveBefore/AfterInTabOrder(): win is not a sibling") );
+
+    // unfortunately, when wxUSE_STL == 1 DetachNode() is not implemented so we
+    // can't just move the node around
+    wxWindow *self = (wxWindow *)this;
+    siblings.DeleteObject(self);
+    if ( move == MoveAfter )
+    {
+        i = i->GetNext();
+    }
+
+    if ( i )
+    {
+        siblings.Insert(i, self);
+    }
+    else // MoveAfter and win was the last sibling
+    {
+        siblings.Append(self);
+    }
+}
+
 // ----------------------------------------------------------------------------
 // global functions
 // ----------------------------------------------------------------------------