/****************************/
	/*	EESchema - database.cpp	*/
	/****************************/

/* Routine de selection d'un composant en librairie
*/

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

#include "common.h"
#include "program.h"
#include "libcmp.h"
#include "general.h"

#include "protos.h"


/* Routines locales */

/* Variables locales */


/********************************************************************************/
bool DataBaseGetName(WinEDA_DrawFrame * frame,
		wxString & Keys, wxString & BufName)
/********************************************************************************/
/*
	Routine de selection du nom d'un composant en librairie pour chargement,
	Keys pointe la liste des mots cles de filtrage
	Si Keys = "", recherche des composants qui correspondent
au masque BufName( avec * et ? )

 Retourne
	TRUE si composant selectionne
	FALSE si commande annulee
	place le nom du composant a charger, selectionne a partir d'une liste dans
	BufName
*/
{
int ii;
EDA_LibComponentStruct * LibEntry;
LibraryStruct * Lib;
WinEDAListBox * ListBox;
const wxChar ** ListNames;

	BufName.MakeUpper();
	Keys.MakeUpper();

	/* Examen de la liste des librairies pour comptage */
	for (Lib = g_LibraryList, ii = 0; Lib != NULL; Lib = Lib->m_Pnext)
		{
		LibEntry = (EDA_LibComponentStruct *) PQFirst(&Lib->m_Entries, FALSE);
		while( LibEntry )
			{
			if ( ! Keys.IsEmpty() )
				{
				if( KeyWordOk(Keys, LibEntry->m_KeyWord) ) ii++;
				}
			else
				{
				if( WildCompareString( BufName, LibEntry->m_Name.m_Text, FALSE ) ) ii++;
				}
			LibEntry = (EDA_LibComponentStruct *) PQNext(Lib->m_Entries, LibEntry, NULL);
			}
		}

	if ( ii == 0 )
		{
		DisplayError(frame, _("No Component found") );
		return 0;
		}

	ListNames = (const wxChar**)MyZMalloc( (ii+1) * sizeof(const wxChar*));
	for (Lib = g_LibraryList, ii = 0; Lib != NULL; Lib = Lib->m_Pnext)
		{
		/* Examen de la liste des elements */
		LibEntry = (EDA_LibComponentStruct *) PQFirst(&Lib->m_Entries, FALSE);
		while( LibEntry )
			{
			if ( ! Keys.IsEmpty())
				{
				if( KeyWordOk(Keys, LibEntry->m_KeyWord) )
					{
					ListNames[ii] = LibEntry->m_Name.m_Text.GetData(); ii++;
					}
				}
			else if( WildCompareString( BufName, LibEntry->m_Name.m_Text, FALSE ) ) 
				{
				ListNames[ii] = LibEntry->m_Name.m_Text; ii++;
				}
			LibEntry = (EDA_LibComponentStruct *) PQNext(Lib->m_Entries, LibEntry, NULL);
			}
		}

	ListBox = new WinEDAListBox(frame, _("Selection"), ListNames,
						wxEmptyString, DisplayCmpDoc, wxColour(200,200,255) );
	ListBox->MoveMouseToOrigin();
		
	/* Affichage de la liste selectionnee */
	if( ii )
		{
		ii = ListBox->ShowModal(); ListBox->Destroy();
		if ( ii < 0 ) ii = 0;
		else
			{
			BufName = ListNames[ii];
			ii = 1;
			}
		}


	free (ListNames);
	return (ii) ;
}


/**********************************/
void DisplayCmpDoc(wxString & Name)
/**********************************/
{
LibCmpEntry * CmpEntry;

	CmpEntry = FindLibPart(Name.GetData(), wxEmptyString, FIND_ALIAS);
	if ( CmpEntry == NULL ) return;

	Name = wxT("Descr: ") + CmpEntry->m_Doc;
	Name += wxT("\nKeyW: ") + CmpEntry->m_KeyWord;
}