/* Set up the basic primitives for Layer control */

#include "fctsys.h"
#include "gr_basic.h"

#include "common.h"
#include "pcbnew.h"

#include "protos.h"


/* Variables locales */

/* Fonctions locales: */

enum layer_sel_id {
    ID_LAYER_OK = 1800,
    ID_LAYER_CANCEL,
    ID_LAYER_SELECT_TOP,
    ID_LAYER_SELECT_BOTTOM,
    ID_LAYER_SELECT

};


/***********************************************/
/* classe pour la frame de selection de layers */
/***********************************************/

class WinEDA_SelLayerFrame : public wxDialog
{
private:
    WinEDA_BasePcbFrame* m_Parent;
    wxRadioBox*          m_LayerList;
    int m_LayerId[NB_LAYERS];

public:

    // Constructor and destructor
    WinEDA_SelLayerFrame( WinEDA_BasePcbFrame* parent, int default_layer,
                          int min_layer, int max_layer );
    ~WinEDA_SelLayerFrame() { };

private:
    void    Sel_Layer( wxCommandEvent& event );
    void    Cancel( wxCommandEvent& event );

    DECLARE_EVENT_TABLE()
};

/* Table des evenements pour WinEDA_SelLayerFrame */
BEGIN_EVENT_TABLE( WinEDA_SelLayerFrame, wxDialog )
EVT_BUTTON( ID_LAYER_OK, WinEDA_SelLayerFrame::Sel_Layer )
EVT_BUTTON( ID_LAYER_CANCEL, WinEDA_SelLayerFrame::Cancel )
EVT_RADIOBOX( ID_LAYER_SELECT, WinEDA_SelLayerFrame::Sel_Layer )
END_EVENT_TABLE()


/****************************************************************************************/
int WinEDA_BasePcbFrame::SelectLayer( int default_layer, int min_layer, int max_layer )
/****************************************************************************************/

/* Install the dialog box for layer selection
 * @param default_layer = Preselection
 * @param min_layer = min layer value (-1 if no min value)
 * @param max_layer = max layer value (-1 si no max value)
 * @return new layer value, or <0 if aborted
 */
{
    int layer;
    WinEDA_SelLayerFrame* frame =
        new WinEDA_SelLayerFrame( this, default_layer, min_layer, max_layer );

    layer = frame->ShowModal(); frame->Destroy();
    return layer;
}


/***********************************************************************/
WinEDA_SelLayerFrame::WinEDA_SelLayerFrame( WinEDA_BasePcbFrame* parent,
                                            int default_layer, int min_layer, int max_layer ) :
    wxDialog( parent, -1, _( "Select Layer:" ), wxPoint( -1, -1 ),
              wxSize( 470, 250 ),
              DIALOG_STYLE )
/***********************************************************************/
{
    wxButton* Button;
    int       ii, yy, xx;
    wxPoint   pos;
    wxString  LayerList[NB_LAYERS];
    int       LayerCount, LayerSelect = -1;

    m_Parent = parent;
    SetFont( *g_DialogFont );

    /* Build the layer list */
    LayerCount = 0;
    int Masque_Layer = g_TabAllCopperLayerMask[g_DesignSettings.m_CopperLayerCount - 1];
    Masque_Layer += ALL_NO_CU_LAYERS;
    for( ii = 0; ii < NB_LAYERS; ii++ )
    {
        m_LayerId[ii] = 0;
        if( (g_TabOneLayerMask[ii] & Masque_Layer) )
        {
            if( min_layer > ii )
                continue;
            
            if( (max_layer >= 0) && (max_layer < ii) )
                break;
            
            LayerList[LayerCount] = ReturnPcbLayerName( ii );
            if( ii == default_layer )
                LayerSelect = LayerCount;
            
            m_LayerId[LayerCount] = ii;
            LayerCount++;
        }
    }

    pos.x = 5; pos.y = 5;

    m_LayerList = new wxRadioBox( this, ID_LAYER_SELECT, _( "Layer" ),
                                  pos, wxSize( -1, -1 ), LayerCount, LayerList,
                                  (LayerCount < 8) ? LayerCount : 8, wxRA_SPECIFY_ROWS );

    if( LayerSelect >= 0 )
        m_LayerList->SetSelection( LayerSelect );

    m_LayerList->GetSize( &xx, &yy );
    pos.x += xx + 12;
    Button = new wxButton( this, ID_LAYER_OK,
                           _( "OK" ), pos );
    Button->SetForegroundColour( *wxBLUE );

    pos.y += Button->GetSize().y + 5;
    Button = new wxButton( this, ID_LAYER_CANCEL,
                           _( "Cancel" ), pos );
    Button->SetForegroundColour( *wxRED );

    /* Redimensionnement de la boite de dialogue: */
    pos.x += Button->GetSize().x + 10;
    SetSize( -1, -1, pos.x, yy + 35 );
}


/***************************************************************/
void WinEDA_SelLayerFrame::Sel_Layer( wxCommandEvent& event )
/***************************************************************/
{
    int ii = m_LayerId[m_LayerList->GetSelection()];

    EndModal( ii );
}


/***************************************************************/
void WinEDA_SelLayerFrame::Cancel( wxCommandEvent& event )
/***************************************************************/
{
    EndModal( -1 );
}


/*********************************************************/
/* classe pour la frame de selection de paires de layers */
/*********************************************************/

class WinEDA_SelLayerPairFrame : public wxDialog
{
private:
    WinEDA_BasePcbFrame* m_Parent;
    wxRadioBox*          m_LayerListTOP;
    wxRadioBox*          m_LayerListBOTTOM;
    int m_LayerId[NB_COPPER_LAYERS];

public:

    // Constructor and destructor
    WinEDA_SelLayerPairFrame( WinEDA_BasePcbFrame* parent );
    ~WinEDA_SelLayerPairFrame() { };

private:
    void    Sel_Layer( wxCommandEvent& event );
    void    Cancel( wxCommandEvent& event );

    DECLARE_EVENT_TABLE()
};


/* Table des evenements pour WinEDA_SelLayerPairFrame */
BEGIN_EVENT_TABLE( WinEDA_SelLayerPairFrame, wxDialog )
EVT_BUTTON( ID_LAYER_OK, WinEDA_SelLayerPairFrame::Sel_Layer )
EVT_BUTTON( ID_LAYER_CANCEL, WinEDA_SelLayerPairFrame::Cancel )
EVT_RADIOBOX( ID_LAYER_SELECT, WinEDA_SelLayerPairFrame::Sel_Layer )
END_EVENT_TABLE()

/***********************************************/
void WinEDA_BasePcbFrame::SelectLayerPair()
/***********************************************/

/* Affiche une double liste de layers cuivre pour selection d'une paire de layers
 *  pour autorutage, vias...
 */
{
    WinEDA_SelLayerPairFrame* frame =
        new WinEDA_SelLayerPairFrame( this );

    frame->ShowModal(); frame->Destroy();
    DrawPanel->MouseToCursorSchema();
    SetToolbars();
}


/*******************************************************************************/
WinEDA_SelLayerPairFrame::WinEDA_SelLayerPairFrame( WinEDA_BasePcbFrame* parent ) :
    wxDialog( parent, -1, _( "Select Layer Pair:" ), wxPoint( -1, -1 ),
              wxSize( 470, 250 ), DIALOG_STYLE )
/*******************************************************************************/
{
    wxButton* Button;
    int       ii, LayerCount;
    int       yy, xx;
    wxPoint   pos;
    wxString  LayerList[NB_COPPER_LAYERS];
    int       LayerTopSelect = 0, LayerBottomSelect = 0;

    m_Parent = parent;
    SetFont( *g_DialogFont );

    PCB_SCREEN* screen = (PCB_SCREEN*) m_Parent->m_CurrentScreen;
    /* Construction de la liste des couches autoris�s */
    int         Masque_Layer = g_TabAllCopperLayerMask[g_DesignSettings.m_CopperLayerCount - 1];
    Masque_Layer += ALL_NO_CU_LAYERS;
    for( ii = 0, LayerCount = 0; ii < NB_COPPER_LAYERS; ii++ )
    {
        m_LayerId[ii] = 0;
        if( (g_TabOneLayerMask[ii] & Masque_Layer) )
        {
            LayerList[LayerCount] = ReturnPcbLayerName( ii );
            if( ii == screen->m_Route_Layer_TOP )
                LayerTopSelect = LayerCount;
            if( ii == screen->m_Route_Layer_BOTTOM )
                LayerBottomSelect = LayerCount;
            m_LayerId[LayerCount] = ii;
            LayerCount++;
        }
    }

    pos.x = 5; pos.y = 5;
    m_LayerListTOP = new wxRadioBox( this, ID_LAYER_SELECT_TOP, _( "Top Layer" ),
                                     pos, wxSize( -1, -1 ), LayerCount, LayerList,
                                     (LayerCount < 8) ? LayerCount : 8, wxRA_SPECIFY_ROWS );
    m_LayerListTOP->SetSelection( LayerTopSelect );

    m_LayerListTOP->GetSize( &xx, &yy );
    pos.x += xx + 12;
    m_LayerListBOTTOM = new wxRadioBox( this, ID_LAYER_SELECT_BOTTOM, _( "Bottom Layer" ),
                                        pos, wxSize( -1, -1 ), LayerCount, LayerList,
                                        (LayerCount < 8) ? LayerCount : 8, wxRA_SPECIFY_ROWS );
    m_LayerListBOTTOM->SetSelection( LayerBottomSelect );

    m_LayerListBOTTOM->GetSize( &xx, &yy );
    pos.x += xx + 12;
    Button = new wxButton( this, ID_LAYER_OK, _( "OK" ), pos );
    Button->SetForegroundColour( *wxBLUE );

    pos.y += Button->GetSize().y + 5;
    Button = new wxButton( this, ID_LAYER_CANCEL, _( "Cancel" ), pos );
    Button->SetForegroundColour( *wxRED );

    /* Redimensionnement de la boite de dialogue: */
    pos.x += Button->GetSize().x + 10;
    SetSize( -1, -1, pos.x, yy + 35 );
}


/***************************************************************/
void WinEDA_SelLayerPairFrame::Sel_Layer( wxCommandEvent& event )
/***************************************************************/
{
    PCB_SCREEN* screen = (PCB_SCREEN*) m_Parent->m_CurrentScreen;

    screen->m_Route_Layer_TOP    = m_LayerId[m_LayerListTOP->GetSelection()];
    screen->m_Route_Layer_BOTTOM = m_LayerId[m_LayerListBOTTOM->GetSelection()];
    EndModal( 0 );
}


/***************************************************************/
void WinEDA_SelLayerPairFrame::Cancel( wxCommandEvent& event )
/***************************************************************/
{
    EndModal( -1 );
}
