/***********************************************************/
/*                      cvstruct.h  :                      */
/* descriptions des principales classes derivees utilisees */
/***********************************************************/

#ifndef CVSTRUCT_H
#define CVSTRUCT_H

#include "wx/listctrl.h"
#include <wx/filename.h>
#include "param_config.h"
#include "cvpcb.h"

/*  Forward declarations of all top-level window classes. */
class FootprintListBox;
class ListBoxCmp;
class WinEDA_DisplayFrame;


/******************************************************/
/* classe derivee pour la Fenetre principale de cvpcb */
/******************************************************/

class WinEDA_CvpcbFrame : public WinEDA_BasicFrame
{
public:

    bool                 m_KeepCvpcbOpen;
    FootprintListBox*    m_FootprintList;
    ListBoxCmp*          m_ListCmp;
    WinEDA_DisplayFrame* DrawFrame;
    WinEDA_Toolbar*      m_HToolBar; // Toolbar horizontal haut d'ecran
    wxFileName           m_NetlistFileName;
    wxArrayString        m_ModuleLibNames;
    wxArrayString        m_AliasLibNames;
    wxString             m_UserLibraryPath;
    wxString             m_NetlistFileExtension;
    wxString             m_DocModulesFileName;
    FOOTPRINT_LIST       m_footprints;
    COMPONENT_LIST       m_components;

protected:
    int                  m_undefinedComponentCnt;
    bool                 m_modified;
    bool                 m_rightJustify;
    bool                 m_isEESchemaNetlist;
    PARAM_CFG_ARRAY      m_projectFileParams;

    // Constructor and destructor
public:
    WinEDA_CvpcbFrame( const wxString &title,
                       long style = KICAD_DEFAULT_DRAWFRAME_STYLE );
    ~WinEDA_CvpcbFrame();

    void            OnLeftClick( wxListEvent& event );
    void            OnLeftDClick( wxListEvent& event );
    void            OnSelectComponent( wxListEvent& event );

    void            Update_Config( wxCommandEvent& event ); /* enregistrement de la config */
    void            OnQuit( wxCommandEvent& event );
    void            OnCloseWindow( wxCloseEvent& Event );
    void            OnSize( wxSizeEvent& SizeEvent );
    void            OnChar( wxKeyEvent& event );
    void            ReCreateHToolbar();
    virtual void    ReCreateMenuBar();
    void            SetLanguage( wxCommandEvent& event );

    void            ToFirstNA( wxCommandEvent& event );
    void            ToPreviousNA( wxCommandEvent& event );
    void            DelAssociations( wxCommandEvent& event );
    void            SaveQuitCvpcb( wxCommandEvent& event );
    void            LoadNetList( wxCommandEvent& event );
    void            ConfigCvpcb( wxCommandEvent& event );
    void            OnKeepOpenOnSave( wxCommandEvent& event );
    void            DisplayModule( wxCommandEvent& event );
    void            AssocieModule( wxCommandEvent& event );
    void            WriteStuffList( wxCommandEvent& event );
    void            DisplayDocFile( wxCommandEvent& event );
    void            OnSelectFilteringFootprint( wxCommandEvent& event );

    void            OnUpdateKeepOpenOnSave( wxUpdateUIEvent& event );

    void            SetNewPkg( const wxString& package );
    void            BuildCmpListBox();
    void            BuildFootprintListBox();
    void            CreateScreenCmp();
    int             SaveNetList( const wxString& FullFileName );
    int             SaveComponentList( const wxString& FullFileName );
    bool            ReadNetList();
    int             rdpcad();
    int             ReadSchematicNetlist();
    int             ReadFootprintFilterList( FILE* f );
    int             ReadViewlogicWirList();
    int             ReadViewlogicNetList();
    void            LoadProjectFile( const wxString& FileName );
    void            SaveProjectFile( const wxString& fileName );
    virtual void    LoadSettings();
    virtual void    SaveSettings();

    PARAM_CFG_ARRAY& GetProjectFileParameters( void );

    DECLARE_EVENT_TABLE()
};


/***********************************************/
/* ListBox derivee pour l'affichage des listes */
/***********************************************/
class ListBoxBase : public wxListView
{
public:

    ListBoxBase( WinEDA_CvpcbFrame * parent, wxWindowID id,
                 const wxPoint &loc, const wxSize &size );

    ~ListBoxBase();

    int     GetSelection();
    void    OnSize( wxSizeEvent& event );

    virtual WinEDA_CvpcbFrame* GetParent();

};

/************************************************************/
/* ListBox derivee pour l'affichage de la liste des Modules */
/************************************************************/

class FootprintListBox : public ListBoxBase
{
private:
    wxArrayString  m_FullFootprintList;
    wxArrayString  m_FilteredFootprintList;
public:
    wxArrayString* m_ActiveFootprintList;
    bool           m_UseFootprintFullList;

public:
    FootprintListBox( WinEDA_CvpcbFrame * parent, wxWindowID id,
                      const wxPoint &loc, const wxSize &size,
                      int nbitems, wxString choice[] );
    ~FootprintListBox();

    int         GetCount();
    void        SetSelection( unsigned index, bool State = TRUE );
    void        SetString( unsigned linecount, const wxString& text );
    void        AppendLine( const wxString& text );
    void        SetFootprintFullList( FOOTPRINT_LIST& list );
    void        SetFootprintFilteredList( COMPONENT* Component,
                                          FOOTPRINT_LIST& list );
    void        SetActiveFootprintList( bool FullList, bool Redraw = FALSE );

    wxString    GetSelectedFootprint();
    wxString    OnGetItemText( long item, long column ) const;
    void        OnLeftClick( wxListEvent& event );
    void        OnLeftDClick( wxListEvent& event );

    DECLARE_EVENT_TABLE()
};

/***************************************************************/
/* ListBox derivee pour l'affichage de la liste des Composants */
/***************************************************************/

class ListBoxCmp : public ListBoxBase
{
public:
    wxArrayString      m_ComponentList;
    WinEDA_CvpcbFrame* m_Parent;

public:

    ListBoxCmp( WinEDA_CvpcbFrame * parent, wxWindowID id,
                const wxPoint &loc, const wxSize &size,
                int nbitems, wxString choice[] );

    ~ListBoxCmp();

    void        Clear();
    int         GetCount();
    wxString    OnGetItemText( long item, long column ) const;
    void        SetSelection( unsigned index, bool State = TRUE );
    void        SetString( unsigned linecount, const wxString& text );
    void        AppendLine( const wxString& text );

    DECLARE_EVENT_TABLE()
};


/*******************************************************/
/* class WWinEDA_DisplayFrame: public WinEDA_DrawFrame */
/*******************************************************/

class WinEDA_DisplayFrame : public WinEDA_BasePcbFrame
{
public:

public:
    WinEDA_DisplayFrame( WinEDA_CvpcbFrame* father,
                         const wxString &title,
                         const wxPoint &pos, const wxSize &size,
                         long style = KICAD_DEFAULT_DRAWFRAME_STYLE );

    ~WinEDA_DisplayFrame();

    void    OnCloseWindow( wxCloseEvent& Event );
    void    RedrawActiveWindow( wxDC* DC, bool EraseBg );
    void    ReCreateHToolbar();
    void    ReCreateVToolbar();
    void    RecreateMenuBar();
    void    OnLeftClick( wxDC* DC, const wxPoint& MousePos );
    void    OnLeftDClick( wxDC* DC, const wxPoint& MousePos );
    bool    OnRightClick( const wxPoint& MousePos, wxMenu* PopMenu );
    void    SetToolbars();
    void    GeneralControle( wxDC* DC, wxPoint Mouse );
    void    InstallOptionsDisplay( wxCommandEvent& event );
    MODULE* Get_Module( const wxString& CmpName );

    void    Process_Settings( wxCommandEvent& event );
    void    Show3D_Frame( wxCommandEvent& event );

    DECLARE_EVENT_TABLE()
};


#endif  //#ifndef CVSTRUCT_H
