]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/frame.cpp
checking that a wxWindow is of run-time type wxWindow is hopefully useless
[wxWidgets.git] / src / msw / frame.cpp
index f438b28bb7d51f767760ae78d4d5bf2b1c045267..7cc30151f4b36184d26c658dcf7297eada3208ab 100644 (file)
@@ -27,6 +27,7 @@
 #include "wx/frame.h"
 
 #ifndef WX_PRECOMP
+    #include "wx/msw/wrapcctl.h" // include <commctrl.h> "properly"
     #include "wx/app.h"
     #include "wx/menu.h"
     #include "wx/utils.h"
     #include "wx/mdi.h"
     #include "wx/panel.h"
     #include "wx/log.h"
+    #include "wx/toolbar.h"
+    #include "wx/statusbr.h"
+    #include "wx/menuitem.h"
 #endif // WX_PRECOMP
 
 #include "wx/msw/private.h"
 
-// include <commctrl.h> "properly"
-#include "wx/msw/wrapcctl.h"
-
 #if defined(__POCKETPC__) || defined(__SMARTPHONE__)
     #include <ole2.h>
     #include <aygshell.h>
     #include "wx/msw/winundef.h"
 #endif
 
-#if wxUSE_STATUSBAR
-    #include "wx/statusbr.h"
-    #include "wx/generic/statusbr.h"
-#endif // wxUSE_STATUSBAR
-
-#if wxUSE_TOOLBAR
-    #include "wx/toolbar.h"
-#endif // wxUSE_TOOLBAR
-
-#include "wx/menuitem.h"
+#include "wx/generic/statusbr.h"
 
 #ifdef __WXUNIVERSAL__
     #include "wx/univ/theme.h"
@@ -240,6 +232,20 @@ void wxFrame::DoSetClientSize(int width, int height)
     wxPoint pt = GetClientAreaOrigin();
     width += pt.x;
     height += pt.y;
+#if wxUSE_TOOLBAR
+    if ( width )
+    {
+        wxToolBar *toolbar = GetToolBar();
+        if ( toolbar && toolbar->HasFlag(wxTB_RIGHT) )
+        {
+            width -= toolbar->GetClientSize().x;
+        }
+        if ( toolbar && toolbar->HasFlag( wxTB_BOTTOM ) )
+        {
+            height -= toolbar->GetClientSize().y;
+        }
+    }
+#endif
 
     wxTopLevelWindow::DoSetClientSize(width, height);
 }
@@ -256,7 +262,24 @@ void wxFrame::DoGetClientSize(int *x, int *y) const
 
     if ( y )
         *y -= pt.y;
-
+#if wxUSE_TOOLBAR
+    if( y )
+    {
+        wxToolBar *toolbar = GetToolBar();
+        if( toolbar && toolbar->HasFlag( wxTB_BOTTOM ) )
+        {
+            *y -= toolbar->GetClientSize().y;
+        }
+    }
+    if ( x )
+    {
+        wxToolBar *toolbar = GetToolBar();
+        if ( toolbar && toolbar->HasFlag(wxTB_RIGHT) )
+        {
+            *x -= toolbar->GetClientSize().x;
+        }
+    }
+#endif
 #if wxUSE_STATUSBAR
     // adjust client area height to take the status bar into account
     if ( y )
@@ -323,6 +346,13 @@ void wxFrame::PositionStatusBar()
 
     int w, h;
     GetClientSize(&w, &h);
+#if wxUSE_TOOLBAR
+    wxToolBar *toolbar = GetToolBar();
+    if( toolbar && toolbar->HasFlag( wxTB_BOTTOM ) )
+        h += toolbar->GetClientRect().height;
+    if( toolbar && toolbar->HasFlag( wxTB_RIGHT ) )
+        w += toolbar->GetClientRect().width;
+#endif
     int sw, sh;
     m_frameStatusBar->GetSize(&sw, &sh);
 
@@ -568,6 +598,7 @@ wxToolBar* wxFrame::CreateToolBar(long style, wxWindowID id, const wxString& nam
 
 void wxFrame::PositionToolBar()
 {
+    int x = 0, y = 0;
     wxToolBar *toolbar = GetToolBar();
     if ( toolbar && toolbar->IsShown() )
     {
@@ -589,9 +620,24 @@ void wxFrame::PositionToolBar()
             height -= statbar->GetClientSize().y;
         }
 #endif // wxUSE_STATUSBAR
-
-        int x = 0;
-        int y = 0;
+    int tx, ty, tw, th;
+    toolbar->GetPosition( &tx, &ty );
+    toolbar->GetSize( &tw, &th );
+    if( ( toolbar->GetWindowStyleFlag() & wxTB_HORIZONTAL ) || ( toolbar->GetWindowStyleFlag() & wxTB_VERTICAL ) )
+    {
+        x = 0;
+        y = 0;
+    }
+    else if( toolbar->GetWindowStyleFlag() & wxTB_BOTTOM )
+    {
+        x = 0;
+        y = height - th;
+    }
+    else if( toolbar->HasFlag(wxTB_RIGHT) )
+    {
+        x = width - tw;
+        y = 0;
+    }
 #if defined(WINCE_WITH_COMMANDBAR)
         // We're using a commandbar - so we have to allow for it.
         if (GetMenuBar() && GetMenuBar()->GetCommandBar())
@@ -601,22 +647,33 @@ void wxFrame::PositionToolBar()
             y = rect.bottom - rect.top;
         }
 #endif
-
-        int tx, ty;
-        int tw, th;
-        toolbar->GetPosition(&tx, &ty);
-        toolbar->GetSize(&tw, &th);
-
+    if( ( toolbar->GetWindowStyleFlag() & wxTB_HORIZONTAL ) || ( toolbar->GetWindowStyleFlag() & wxTB_VERTICAL ) )
+    {
         // Adjust
         if (ty < 0 && (-ty == th))
             ty = 0;
         if (tx < 0 && (-tx == tw))
             tx = 0;
+    }
+    else if( toolbar->GetWindowStyleFlag() & wxTB_BOTTOM )
+    {
+        if( ty < 0 && ( -ty == th ) )
+            ty = height - th;
+        if( tx < 0 && ( -tx == tw ) )
+            tx = 0;
+    }
+        else if( toolbar->HasFlag(wxTB_RIGHT) )
+        {
+            if( ty < 0 && ( -ty == th ) )
+                ty = 0;
+            if( tx < 0 && ( -tx == tw ) )
+                tx = width - tw;
+        }
 
         int desiredW = tw;
         int desiredH = th;
 
-        if ( toolbar->GetWindowStyleFlag() & wxTB_VERTICAL )
+        if ( toolbar->IsVertical() )
         {
             desiredH = height;
         }
@@ -635,7 +692,7 @@ void wxFrame::PositionToolBar()
         bool heightChanging wxDUMMY_INITIALIZE(true);
         bool widthChanging wxDUMMY_INITIALIZE(true);
 
-        if ( toolbar->GetWindowStyleFlag() & wxTB_VERTICAL )
+        if ( toolbar->IsVertical() )
         {
             // It's OK if the current height is greater than what can be shown.
             heightChanging = (desiredH > th) ;
@@ -1063,7 +1120,7 @@ wxPoint wxFrame::GetClientAreaOrigin() const
         {
             pt.x += w;
         }
-        else
+        else if( ( toolbar->GetWindowStyleFlag() & wxTB_TOP ) )
         {
             pt.y += h;
         }