Contents Up << >>

## FL concepts

These are typical steps when adding FL functionality to your application.

- include the appropriate header files;
- create a new wxFrameLayout (REF NOT FOUND) passing the top-level frame and the window that is interpreted as the main 'client' window;
- set an updates manager for optimizing drag operations;
- add plugins for implementing various features;
- add bars;
- enable floating mode for the layout if required;
- delete the frame layout in the main frame's destructor.

The following is taken from fl_demo1 and shows the main code implementing the user interface as illustrated in What is FL?.

    // fl headers
    #include "wx/fl/controlbar.h"     // core API

    // extra plugins
    #include "wx/fl/barhintspl.h"    // bevel for bars with "X"s and grooves
    #include "wx/fl/rowdragpl.h"     // NC-look with draggable rows
    #include "wx/fl/cbcustom.h"      // customization plugin
    #include "wx/fl/hintanimpl.h"

    // beauty-care
    #include "wx/fl/gcupdatesmgr.h"  // smooth d&d
    #include "wx/fl/antiflickpl.h"   // double-buffered repaint of decorations
    #include "wx/fl/dyntbar.h"       // auto-layout toolbar
    #include "wx/fl/dyntbarhnd.h"    // control-bar dimension handler for it

    MyFrame::MyFrame(wxFrame *frame)
        : wxFrame( frame, wxID_ANY, "wxWindows 2.0 wxFrameLayout Test Application", wxDefaultPosition,
              wxSize( 700, 500 ),
              wxCLIP_CHILDREN | wxMINIMIZE_BOX | wxMAXIMIZE_BOX |
              wxRESIZE_BORDER | wxSYSTEM_MENU  | wxCAPTION,
              "freimas" )
    {
        mpClientWnd = CreateTextCtrl( "Client window" );

        mpLayout = new wxFrameLayout( this, mpClientWnd );

        mpLayout->SetUpdatesManager( new cbGCUpdatesMgr() );

        // setup plugins for testing
        mpLayout->PushDefaultPlugins();

        mpLayout->AddPlugin( CLASSINFO( cbBarHintsPlugin ) ); // fancy "X"es and bevel for bars
        mpLayout->AddPlugin( CLASSINFO( cbHintAnimationPlugin ) );
        mpLayout->AddPlugin( CLASSINFO( cbRowDragPlugin  ) );
        mpLayout->AddPlugin( CLASSINFO( cbAntiflickerPlugin ) );
        mpLayout->AddPlugin( CLASSINFO( cbSimpleCustomizationPlugin ) );

        // drop in some bars
        cbDimInfo sizes0( 200,45, // when docked horizontally
                          200,85, // when docked vertically
                          175,35, // when floated
                          FALSE,  // the bar is not fixed-size
                          4,      // vertical gap (bar border)
                          4       // horizontal gap (bar border)
                        );

        cbDimInfo sizes1( 150,35, // when docked horizontally
                          150,85, // when docked vertically
                          175,35, // when floated
                          TRUE,   // the bar is not fixed-size
                          4,      // vertical gap (bar border)
                          4       // horizontal gap (bar border)
                        );

        cbDimInfo sizes2( 175,45, // when docked horizontally
                          175,37, // when docked vertically
                          170,35, // when floated
                          TRUE,   // the bar is not fixed-size
                          4,      // vertical gap (bar border)
                          4,      // horizontal gap (bar border)
                          new cbDynToolBarDimHandler()
                        );

        mpLayout->AddBar( CreateTextCtrl("Hello"),  // bar window
                          sizes0, FL_ALIGN_TOP,     // alignment ( 0-top,1-bottom, etc)
                          0,                        // insert into 0th row (vert. position)
                          0,                        // offset from the start of row (in pixels)
                          "InfoViewer1",            // name for reference in customization pop-ups
                          TRUE
                        );

        mpLayout->AddBar( CreateTextCtrl("Bye"),    // bar window
                          sizes0, FL_ALIGN_TOP,     // alignment ( 0-top,1-bottom, etc)
                          1,                        // insert into 0th row (vert. position)
                          0,                        // offset from the start of row (in pixels)
                          "InfoViewer2",            // name for reference in customization pop-ups
                          TRUE
                        );

        mpLayout->AddBar( CreateTextCtrl("Fixed0"), // bar window
                          sizes1, FL_ALIGN_TOP,     // alignment ( 0-top,1-bottom, etc)
                          0,                        // insert into 0th row (vert. position)
                          0,                        // offset from the start of row (in pixels)
                          "ToolBar1",               // name for reference in customization pop-ups
                          TRUE
                        );

        wxDynamicToolBar* pToolBar = new wxDynamicToolBar();

        pToolBar->Create( this, -1 );

        // 1001-1006 ids of command events fired by added tool-buttons

        pToolBar->AddTool( 1001, BMP_DIR "new.bmp" );
        pToolBar->AddTool( 1002, BMP_DIR "open.bmp" );
        pToolBar->AddTool( 1003, BMP_DIR "save.bmp" );

        pToolBar->AddTool( 1004, BMP_DIR "cut.bmp" );
        pToolBar->AddTool( 1005, BMP_DIR "copy.bmp" );
        pToolBar->AddTool( 1006, BMP_DIR "paste.bmp" );

        mpLayout->AddBar( pToolBar,             // bar window (can be NULL)
                          sizes2, FL_ALIGN_TOP, // alignment ( 0-top,1-bottom, etc)
                          0,                    // insert into 0th row (vert. position)
                          0,                    // offset from the start of row (in pixels)
                          "ToolBar2",           // name for reference in customization pop-ups
                          FALSE
                        );

        mpLayout->EnableFloating( TRUE ); // off, thinking about wxGtk...
    }

    MyFrame::~MyFrame()
    {
        if ( mpLayout)
            delete mpLayout; // should be destroyed manually
    }