/*********************************/
/*  dialog_get_component.cpp     */
/*********************************/

#include <fctsys.h>
#include <common.h>
#include <macros.h>
#include <wxstruct.h>
#include <dialog_get_component.h>


/****************************************************************************/
/* Show a dialog frame to choose a name from an history list, or a new name */
/* to select a component or a module                                        */
/****************************************************************************/

static unsigned s_HistoryMaxCount = 8;  // Max number of items displayed in history list


/*
 * Dialog frame to choose a component or a footprint
 *   This dialog shows an history of last selected items
 */
DIALOG_GET_COMPONENT::DIALOG_GET_COMPONENT( EDA_DRAW_FRAME* parent,
                                            const wxPoint&  framepos,
                                            wxArrayString&  HistoryList,
                                            const wxString& Title,
                                            bool            show_extra_tool ) :
    DIALOG_GET_COMPONENT_BASE( parent, -1, Title, framepos )
{

#ifdef __WXMAC__
    m_auxToolSelector = false;
#else
    m_auxToolSelector = show_extra_tool;
#endif
    initDialog( HistoryList );

    m_textCmpNameCtrl->SetFocus();
    GetSizer()->Fit( this );
    GetSizer()->SetSizeHints( this );
}

void DIALOG_GET_COMPONENT::initDialog( wxArrayString& aHistoryList )
{
    SetFocus();
    m_GetExtraFunction = false;
    m_selectionIsKeyword = false;
    m_historyList->Append( aHistoryList );
    if( !m_auxToolSelector )
    {
        m_buttonBrowse->Show( false );
        m_buttonBrowse->Enable( false );
    }
}


void DIALOG_GET_COMPONENT::OnCancel( wxCommandEvent& event )
{
    m_Text = wxEmptyString;
    EndModal( wxID_CANCEL );
}

void DIALOG_GET_COMPONENT::Accept( wxCommandEvent& event )
{
    m_selectionIsKeyword = false;
    switch( event.GetId() )
    {
    case ID_SEL_BY_LISTBOX:
        m_Text = m_historyList->GetStringSelection();
        break;

    case wxID_OK:
        m_Text = m_textCmpNameCtrl->GetValue();
        break;

    case ID_ACCEPT_KEYWORD:
        m_selectionIsKeyword = true;
        m_Text = m_textCmpNameCtrl->GetValue();
        break;

    case ID_LIST_ALL:
        m_Text = wxT( "*" );
        break;
    }

    m_Text.Trim( false );      // Remove blanks at beginning
    m_Text.Trim( true );       // Remove blanks at end

    EndModal( wxID_OK );
}


/* Get the component name by the extra function */
void DIALOG_GET_COMPONENT::GetExtraSelection( wxCommandEvent& event )
{
    m_GetExtraFunction = true;
    EndModal( wxID_OK );
}


// Return the component name selected by the dialog
wxString DIALOG_GET_COMPONENT::GetComponentName( void )
{
    return m_Text;
}


/* Initialize the default component name default choice
*/
void DIALOG_GET_COMPONENT::SetComponentName( const wxString& name )
{
    if( m_textCmpNameCtrl )
    {
        m_textCmpNameCtrl->SetValue( name );
        m_textCmpNameCtrl->SetSelection(-1, -1);
    }
}


wxPoint GetComponentDialogPosition( void )
{
    wxPoint pos;
    int     x, y, w, h;

    pos = wxGetMousePosition();
    wxClientDisplayRect( &x, &y, &w, &h );
    pos.x -= 100;
    pos.y -= 50;
    if( pos.x < x )
        pos.x = x;
    if( pos.y < y )
        pos.y = y;
    if( pos.x < x )
        pos.x = x;
    x += w - 350;
    if( pos.x > x )
        pos.x = x;
    if( pos.y < y )
        pos.y = y;

    return pos;
}


/*
 * Add the string "aName" to the history list aHistoryList
 */
void AddHistoryComponentName( wxArrayString& aHistoryList, const wxString& aName )
{
    if( ( aHistoryList.GetCount() > 0 ) && ( aName == aHistoryList[0] ) )
        return;

    /* remove an old identical name if exists */
    for( unsigned ii = 1; ii < aHistoryList.GetCount(); ii++ )
    {
        if( aName == aHistoryList[ii] )
        {
            aHistoryList.RemoveAt( ii );
            ii--;
        }
    }

    // Add the new name at the beginning of the history list
    aHistoryList.Insert(aName, 0);

    // Remove extra names
    while( aHistoryList.GetCount() >= s_HistoryMaxCount )
        aHistoryList.RemoveAt( aHistoryList.GetCount()-1 );
}
