/////////////////////////////////////////////////////////////////////////////
// Name:        main.cpp
// Purpose:     Contrib. demo
// Author:      Aleksandras Gluchovas
// Modified by:
// Created:     24/11/98
// RCS-ID:      $Id$
// Copyright:   (c) Aleksandras Gluchovas
// Licence:       wxWindows license
/////////////////////////////////////////////////////////////////////////////

#ifdef __GNUG__
#pragma implementation "fl_sample.cpp"
#pragma interface "fl_sample.cpp"
#endif

// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif

#include "controlbar.h"

// plugins used
#include "barhintspl.h"
#include "hintanimpl.h"

#include "wx/textctrl.h"

// ADDED by alex (linker complaints...):
#ifndef wxDUMMY_OBJ_INCLUDED
char wxDummyChar=0;
#endif

#define ID_LOAD  102
#define ID_STORE 103
#define ID_QUIT  104

#define LAYOUT_FILE "layouts.dat"

class MyApp: public wxApp
{ 
public:
    bool OnInit(void);
};

class MyFrame: public wxFrame
{
protected:
    wxFrameLayout* mpLayout;
    wxWindow*      mpClientWnd;
	wxPanel*       mpInternalFrm;


    wxTextCtrl* CreateTextCtrl( const wxString& value );


public:
    MyFrame( wxWindow* parent, char *title );
    ~MyFrame();
    
    void OnQuit( wxCommandEvent& event );

    bool OnClose(void) { return TRUE; }

    DECLARE_EVENT_TABLE()
};

/***** Implementation for class MyApp *****/

IMPLEMENT_APP    (MyApp)

bool MyApp::OnInit(void)
{
    // wxWindows boiler-plate:

    MyFrame *frame = new MyFrame(NULL, "wxFrameLayout sample");

    wxMenu *file_menu = new wxMenu;

    file_menu->Append( ID_LOAD,  "&Load layout"  );
    file_menu->Append( ID_STORE, "&Store layout"  );
    file_menu->AppendSeparator();

    file_menu->Append( ID_QUIT, "E&xit" );

    wxMenuBar *menu_bar = new wxMenuBar;

    menu_bar->Append(file_menu, "&File");

    frame->CreateStatusBar(3);
    frame->SetMenuBar(menu_bar);

    frame->Show(TRUE);

    SetTopWindow(frame);

    return TRUE;
}

/***** Immlementation for class MyFrame *****/

BEGIN_EVENT_TABLE(MyFrame, wxFrame)

    EVT_MENU( ID_QUIT,  MyFrame::OnQuit  )

END_EVENT_TABLE()

MyFrame::MyFrame( wxWindow* parent, char *title )
    
	: wxFrame( parent, -1, "NewTest-II", wxDefaultPosition,
			   wxSize( 700, 500 ),
			   wxCLIP_CHILDREN | wxMINIMIZE_BOX | wxMAXIMIZE_BOX |
			   wxTHICK_FRAME   | wxSYSTEM_MENU  | wxCAPTION,
			   "freimas" )
{
#ifdef __WXMSW__
	mpInternalFrm = (wxPanel*)this;
#else
	mpInternalFrm = new wxPanel( this, -1 );	
#endif
	
    mpClientWnd = CreateTextCtrl( "Client window" );

	// btw, creation of internal frame is needed for wxGtk version
	// to act correctly (since menu-bar is a separate window there..)
    
    mpLayout = new wxFrameLayout( mpInternalFrm, mpClientWnd );

#ifdef __WXGTK__

	// real-time dosn't work well under wxGtk yet
	cbCommonPaneProperties props;
	mpLayout->GetPaneProperties( props );

	props.mRealTimeUpdatesOn = FALSE; // off
	
	mpLayout->SetPaneProperties( props, wxALL_PANES );
	
#endif
	
	mpLayout->PushDefaultPlugins();
	mpLayout->AddPlugin( CLASSINFO( cbBarHintsPlugin ) ); // facny "X"es and beveal for barso
	//mpLayout->AddPlugin( CLASSINFO( cbHintAnimationPlugin ) );

    cbDimInfo sizes( 80,65, // when docked horizontally      
                     80,65,    // when docked vertically        
                     80,30, // when floated                  
                     TRUE,  // the bar is fixed-size
                     5,     // vertical gap (bar border)
                     5      // horizontal gap (bar border)
                   ); 

    // drop-in 20 bars

    for( int i = 1; i <= 10; ++i )
    {
        char buf[4];
		sprintf( buf, "%d", i );
        wxString name = wxString("Bar-");
		name += buf;
    
        sizes.mIsFixed = i % 5 > 0; // every fifth bar is not fixed-size

        if ( !sizes.mIsFixed ) name += " (flexible)";

        mpLayout->AddBar( CreateTextCtrl(name),// bar window
                          sizes, i % MAX_PANES,// alignment ( 0-top,1-bottom, etc)
                          0,                   // insert into 0th row (vert. position)
                          0,                   // offset from the start of row (in pixels)
                          name                 // name to refere in customization pop-ups
                       );
    }
}

MyFrame::~MyFrame()
{
    // layout is not a window, should be released manually

    if ( mpLayout ) delete mpLayout;
}

wxTextCtrl* MyFrame::CreateTextCtrl( const wxString& value )
{
    wxTextCtrl* pCtrl = 
			
		new wxTextCtrl( mpInternalFrm, -1, value, 
                        wxPoint(0,0), wxSize(1,1), wxTE_MULTILINE );

	pCtrl->SetBackgroundColour( wxColour( 255,255,255 ) );

	return pCtrl;
}

void MyFrame::OnQuit( wxCommandEvent& event )
{
    Show( FALSE ); // TRICK:: hide it, to avoid flickered destruction

    Close(TRUE);
}

#ifdef __HACK_MY_MSDEV40__

////////////// new 2.0-magic (linker errors...) ////////////////

wxToolBar* wxFrame::CreateToolBar(long style, wxWindowID id, const wxString& name)
{
    wxCHECK_MSG( m_frameToolBar == NULL, FALSE,
               "recreating toolbar in wxFrame" );

    wxToolBar* toolBar = OnCreateToolBar(style, id, name);
    if (toolBar)
    {
        SetToolBar(toolBar);
        PositionToolBar();
        return toolBar;
    }
    else
    {
        return NULL;
    }
}

wxToolBar* wxFrame::OnCreateToolBar(long style, wxWindowID id, const wxString& name)
{
    return new wxToolBar(this, id, wxDefaultPosition, wxDefaultSize, style, name);
}

#endif
