]> git.saurik.com Git - wxWidgets.git/commitdiff
Applied Hans Van Leemputten's FL separator patch
authorJulian Smart <julian@anthemion.co.uk>
Tue, 5 Feb 2002 12:18:49 +0000 (12:18 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Tue, 5 Feb 2002 12:18:49 +0000 (12:18 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14012 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

contrib/samples/fl/fl_demo1/fl_demo1.cpp
contrib/samples/fl/fl_demo1/fl_demo1.h
contrib/src/fl/dyntbar.cpp

index 55cf936c44e45ae4957fb0ef997b1a395d26952c..3150a51b988d5813839051689e78730c344e7f90 100644 (file)
@@ -174,9 +174,9 @@ MyFrame::MyFrame(wxFrame *frame)
                       4       // horizontal gap (bar border)
                     ); 
     
-    cbDimInfo sizes2( 175,45, // when docked horizontally      
-                      175,37, // when docked vertically        
-                      170,35, // when floated                  
+    cbDimInfo sizes2( 195,35, // when docked horizontally      
+                      185,37, // when docked vertically        
+                      195,35, // when floated                  
                       TRUE,   // the bar is not fixed-size
                       4,      // vertical gap (bar border)
                       4,      // horizontal gap (bar border)
@@ -212,11 +212,12 @@ MyFrame::MyFrame(wxFrame *frame)
     pToolBar->Create( this, -1 );
     
     // 1001-1006 ids of command events fired by added tool-buttons
-    
+
     pToolBar->AddTool( 1001, BMP_DIR "new.bmp" );
+    pToolBar->AddSeparator();
     pToolBar->AddTool( 1002, BMP_DIR "open.bmp" );
     pToolBar->AddTool( 1003, BMP_DIR "save.bmp" );
-    
+    pToolBar->AddSeparator(new wxMySeparatorLine(pToolBar, -1));    
     pToolBar->AddTool( 1004, BMP_DIR "cut.bmp" );
     pToolBar->AddTool( 1005, BMP_DIR "copy.bmp" );
     pToolBar->AddTool( 1006, BMP_DIR "paste.bmp" );
@@ -239,3 +240,21 @@ MyFrame::~MyFrame()
         delete mpLayout; // should be destroyed manually
 }
 
+#define LINE_SIZE 3
+void wxMySeparatorLine::DoSetSize( int x, int y,
+                                   int width, int height,
+                                   int sizeFlags)
+{
+    if (width < height)
+    {
+        x += (width - LINE_SIZE) / 2;
+        width = LINE_SIZE;
+    }
+    else
+    {
+        y += (height - LINE_SIZE) / 2;
+        height = LINE_SIZE;
+    }
+    
+    wxStaticLine::DoSetSize(x, y, width, height, sizeFlags);
+}
index 8b0d02ffabaea3d4aa1d4775b9dde5a57721827a..13ba9d4dc6cf13f8da5e13d440483844b1b8f619 100644 (file)
@@ -21,6 +21,7 @@
 #define NEW_TEST_EXIT 1103
 
 #include "wx/panel.h"
+#include "wx/statline.h"    
 
 // Define a new application type
 class MyApp: public wxApp
@@ -51,5 +52,23 @@ public:
     DECLARE_EVENT_TABLE()
 };
 
+/*
+ * Quick example of your own Separator class...
+ */
+class wxMySeparatorLine : public wxStaticLine
+{
+public:
+    wxMySeparatorLine() 
+    {}
+    wxMySeparatorLine( wxWindow *parent, wxWindowID id) 
+        : wxStaticLine( parent, id)
+    {}
+
+protected:
+   virtual void DoSetSize( int x, int y,
+                           int width, int height,
+                           int sizeFlags = wxSIZE_AUTO);
+};
+
 #endif
 
index 138f5a0b95be3b46c90f2137aac6d4d27d5e50cd..194271339eec547fad7615a638af7f78405c646b 100644 (file)
@@ -229,11 +229,14 @@ void wxDynamicToolBar::AddSeparator( wxWindow* pSepartorWnd )
 
     pInfo->mpToolWnd    = pSepartorWnd;
     pInfo->mIndex       = -1;
-    pInfo->mIsSeparator    = TRUE;
+    pInfo->mIsSeparator = TRUE;
 
+    // Do we draw a separator or is a other object?
     if ( pSepartorWnd )
     {
-        pSepartorWnd->Create( this, -1 );
+        // hvl => Is there a way to know if it was already created?
+        // hvl => shouldn't the pSepartorWnd be created? (like one should expect?)
+        // pSepartorWnd->Create( this, -1 );
 
         int x,y;
         pSepartorWnd->GetSize( &x, &y );
@@ -245,11 +248,13 @@ void wxDynamicToolBar::AddSeparator( wxWindow* pSepartorWnd )
     }
     else
     {
-        pInfo->mRealSize.x = mSepartorSize;
+        // Init x and y to the default.
+        pInfo->mRealSize.x = 0;
         pInfo->mRealSize.y = 0;
 
+        // Init height and width to the normal size of a separator.
         pInfo->mRect.width  = mSepartorSize;
-        pInfo->mRect.height = 0;
+        pInfo->mRect.height = mSepartorSize;
     }
 
     mTools.Add( pInfo );
@@ -299,21 +304,19 @@ void wxDynamicToolBar::DrawSeparator( wxDynToolInfo& info, wxDC& dc )
 void wxDynamicToolBar::OnPaint( wxPaintEvent& event )
 {
     // draw separators if any
-
     wxPaintDC dc(this);
 
     size_t i;
     for( i = 0; i != mTools.Count(); ++i )
-    
+    {
         if ( mTools[i]->mIsSeparator ) 
         {
             // check if separator doesn't have it's own window
             // if so, then draw it using built-in drawing method
-
             if ( !mTools[i]->mpToolWnd )
-
                 DrawSeparator( *mTools[i], dc );
         }
+    }
 }
 
 // FOR NOW:: quick fix
@@ -321,6 +324,11 @@ void wxDynamicToolBar::OnPaint( wxPaintEvent& event )
 
 void wxDynamicToolBar::SizeToolWindows()
 {
+    bool bStateCheckDone = FALSE;
+    bool bHorzSeparator  = FALSE;
+    int maxWidth         = 0;
+    int maxHeight        = 0;
+
     size_t i;
     for( i = 0; i != mTools.Count(); ++i )
     {
@@ -328,7 +336,6 @@ void wxDynamicToolBar::SizeToolWindows()
 
         if ( !info.mIsSeparator ) 
         {
-
             // center real rectangle within the rectangle 
             // provided by the layout manager
 
@@ -338,38 +345,114 @@ void wxDynamicToolBar::SizeToolWindows()
             // FOR NOW FOR NOW:: quick & dirty fix
             if ( info.mpToolWnd->IsKindOf( CLASSINFO( wxChoice ) ) )
             {
-                info.mpToolWnd->SetSize( x,y, 
-                                        info.mRealSize.x - 3, 
-                                        info.mRealSize.y);
+                info.mpToolWnd->SetSize( x, y, 
+                                         info.mRealSize.x - 3, 
+                                         info.mRealSize.y);
             }
             else
-                info.mpToolWnd->SetSize( x,y, 
-                                        info.mRealSize.x, 
-                                        info.mRealSize.y );
+            {
+                info.mpToolWnd->SetSize( x, y, 
+                                         info.mRealSize.x, 
+                                         info.mRealSize.y );
+            }
         }
+        else
+        {
+            // We performer this code here, so we only execute it when we have 
+            // separators and we do it only once (all to do with performance...)
+            if (!bStateCheckDone)
+            {
+                bStateCheckDone = TRUE;
+                
+                size_t j;
+                wxDynToolInfo *pInfo = NULL;
+                wxDynToolInfo *pPrevInfo = NULL;
+                int nVertSeparators = 0;
+
+                for( j = 0; j != mTools.Count(); ++j )
+                {
+                    pInfo = mTools[j];
+                    
+                    // Count all Vert Separators.
+                    if ( pInfo->mIsSeparator ) 
+                        nVertSeparators++;
+
+                    // Check if the new row starts with a Separator.
+                    if ( pPrevInfo && pInfo->mIsSeparator &&
+                         // pPrevInfo->mRect.x >= pInfo->mRect.x &&
+                         pPrevInfo->mRect.y < pInfo->mRect.y)
+                    {
+                        // If the Separator is shown on the next row and it's 
+                        // the only object on the row it would mean that the 
+                        // Separator should be shown as Horizontal one.
+                        if (j+1 != mTools.Count())
+                        {
+                            if (pInfo->mRect.y < mTools[j+1]->mRect.y)
+                                nVertSeparators--;
+                        }
+                        else
+                        {
+                            nVertSeparators--;
+                        }
+                    }
+
+                    pPrevInfo = pInfo;
+
+                    maxWidth = wxMax(pInfo->mRect.width, maxWidth);
+                    maxHeight = wxMax(pInfo->mRect.height, maxHeight);
+                }
+                
+                bHorzSeparator = nVertSeparators == 0;
+            }
+            
+            // Check if we should draw Horz or Vert...
+            if ( !bHorzSeparator )
+            {
+                info.mRect.width = mSepartorSize;
+                info.mRect.height = maxHeight;
+            }
+            else
+            {
+                info.mRect.width = maxWidth;
+                info.mRect.height = mSepartorSize;
+            }
 
-        // TBD:: size separator window if present
+            // Do we need to set a new size to a seperator object?
+            if ( info.mpToolWnd )
+            {
+                info.mpToolWnd->SetSize( info.mRect.x,
+                                         info.mRect.y, 
+                                         info.mRect.width, 
+                                         info.mRect.height);
+            }
+
+        }
     }
 }
 
 bool wxDynamicToolBar::Layout()
 {
-    if ( !mpLayoutMan )
-        mpLayoutMan = CreateDefaultLayout();
-
     int x,y;
     GetSize( &x, &y );
     wxSize wndDim(x,y);
     wxSize result;
-
-    wxLayoutItemArrayT items;
-
-    // safe conversion
     size_t i;
+    wxDynToolInfo *pInfo;
+
+    // Reset the size of separators...
     for( i = 0; i != mTools.Count(); ++i )
-        items.Add( mTools[i] );
+    {
+        pInfo = mTools[i];
+        
+        if ( pInfo->mIsSeparator ) 
+        {
+            pInfo->mRect.width  = mSepartorSize;
+            pInfo->mRect.height = mSepartorSize;
+        }
+    }
 
-    mpLayoutMan->Layout( wndDim, result, items, mVertGap, mHorizGap );;
+    // Calc and set the best layout
+    GetPreferredDim( wndDim, result );
 
     SizeToolWindows();
     return TRUE;
@@ -387,7 +470,7 @@ void wxDynamicToolBar::GetPreferredDim( const wxSize& givenDim, wxSize& prefDim
     for( i = 0; i != mTools.Count(); ++i )
         items.Add( mTools[i] );
 
-    mpLayoutMan->Layout( givenDim, prefDim, items, mVertGap, mHorizGap );;
+    mpLayoutMan->Layout( givenDim, prefDim, items, mVertGap, mHorizGap );
 }
 
 void wxDynamicToolBar::SetLayout( LayoutManagerBase* pLayout )
@@ -419,7 +502,7 @@ void BagLayout::Layout(  const wxSize&       parentDim,
                          wxSize&             resultingDim,
                          wxLayoutItemArrayT& items,
                          int                 horizGap,
-                          int                 vertGap  
+                         int                 vertGap  
                       )
 {
     int maxWidth = 0;