kicad/eeschema/viewlibs.cpp

345 lines
8.8 KiB
C++

/****************************/
/* EESchema - viewlibs.cpp */
/****************************/
#include "fctsys.h"
#include "gr_basic.h"
#include "common.h"
#include "program.h"
#include "libcmp.h"
#include "general.h"
#include "protos.h"
#include "id.h"
#define NEXT_PART 1
#define NEW_PART 0
#define PREVIOUS_PART -1
/* Routines locales */
/* Variables locales */
/*************************************************************************/
void WinEDA_ViewlibFrame::Process_Special_Functions(wxCommandEvent& event)
/*************************************************************************/
{
EDA_LibComponentStruct * LibEntry;
int ii, id = event.GetId();
wxPoint pos;
wxGetMousePosition(&pos.x, &pos.y);
pos.y += 20;
switch ( id )
{
case ID_LIBVIEW_SELECT_LIB:
SelectCurrentLibrary();
break;
case ID_LIBVIEW_SELECT_PART:
SelectAndViewLibraryPart(NEW_PART);
break;
case ID_LIBVIEW_NEXT:
SelectAndViewLibraryPart(NEXT_PART);
break;
case ID_LIBVIEW_PREVIOUS:
SelectAndViewLibraryPart(PREVIOUS_PART);
break;
case ID_LIBVIEW_VIEWDOC:
LibEntry = FindLibPart(g_CurrentViewComponentName.GetData(),
g_CurrentViewLibraryName.GetData(), FIND_ALIAS);
if( LibEntry && ( !LibEntry->m_DocFile.IsEmpty()) )
GetAssociatedDocument(this, g_RealLibDirBuffer, LibEntry->m_DocFile );
break;
case ID_LIBVIEW_DE_MORGAN_NORMAL_BUTT:
m_HToolBar->ToggleTool(ID_LIBVIEW_DE_MORGAN_NORMAL_BUTT, TRUE);
m_HToolBar->ToggleTool(ID_LIBVIEW_DE_MORGAN_CONVERT_BUTT, FALSE);
g_ViewConvert = 1;
ReDrawPanel();
break;
case ID_LIBVIEW_DE_MORGAN_CONVERT_BUTT:
m_HToolBar->ToggleTool(ID_LIBVIEW_DE_MORGAN_NORMAL_BUTT, FALSE);
m_HToolBar->ToggleTool(ID_LIBVIEW_DE_MORGAN_CONVERT_BUTT, TRUE);
g_ViewConvert = 2;
ReDrawPanel();
break;
case ID_LIBVIEW_SELECT_PART_NUMBER:
ii = SelpartBox->GetChoice();
if ( ii < 0 ) return;
g_ViewUnit = ii + 1;
ReDrawPanel();
break;
default:
{
wxString msg;
msg << wxT("WinEDA_ViewlibFrame::Process_Special_Functions error: id = ") << id;
DisplayError( this, msg);
break;
}
}
}
/*************************************************************************/
void WinEDA_ViewlibFrame::OnLeftClick(wxDC * DC, const wxPoint& MousePos)
/*************************************************************************/
{
}
/********************************************************************************/
void WinEDA_ViewlibFrame::OnRightClick(const wxPoint& MousePos, wxMenu * PopMenu)
/********************************************************************************/
{
}
/**********************************************/
void WinEDA_ViewlibFrame::DisplayLibInfos()
/**********************************************/
/* Affiche en Ligne d'info la librairie en cours de visualisation */
{
wxString msg;
LibraryStruct * Lib;
Lib = FindLibrary(g_CurrentViewLibraryName);
msg = _("Browse library: ");
if ( Lib ) msg += g_CurrentViewLibraryName;
else msg += _("None");
SetTitle(msg);
}
/*****************************************/
/* Routine to Select Current library */
/*****************************************/
void WinEDA_ViewlibFrame::SelectCurrentLibrary()
{
LibraryStruct * Lib;
Lib = SelectLibraryFromList(this);
if ( Lib )
{
g_CurrentViewComponentName.Empty();
g_CurrentViewLibraryName = Lib->m_Name;
DisplayLibInfos();
if ( m_LibList )
{
ReCreateListCmp();
ReDrawPanel();
DisplayLibInfos();
ReCreateHToolbar();
int id = m_LibList->FindString(g_CurrentViewLibraryName.GetData());
if ( id >= 0 ) m_LibList->SetSelection(id);
}
}
}
/**************************************************************/
void WinEDA_ViewlibFrame::SelectAndViewLibraryPart(int option)
/**************************************************************/
/* Routine to select and view library Part (NEW, NEXT or PREVIOUS) */
{
LibraryStruct * Lib;
if(g_CurrentViewLibraryName.IsEmpty() ) SelectCurrentLibrary();
if(g_CurrentViewLibraryName.IsEmpty() ) return;
Lib = FindLibrary(g_CurrentViewLibraryName);
if ( Lib == NULL ) return;
if ( (g_CurrentViewComponentName.IsEmpty()) || ( option == NEW_PART ) )
{
ViewOneLibraryContent(Lib, NEW_PART);
return;
}
EDA_LibComponentStruct * LibEntry = FindLibPart(g_CurrentViewComponentName.GetData(),
g_CurrentViewLibraryName, FIND_ALIAS);
if ( LibEntry == NULL ) return;
if (option == NEXT_PART )
ViewOneLibraryContent(Lib, NEXT_PART);
if (option == PREVIOUS_PART )
ViewOneLibraryContent(Lib, PREVIOUS_PART);
}
/*************************************************/
/* Routine to view one selected library content. */
/*************************************************/
void WinEDA_ViewlibFrame::ViewOneLibraryContent(LibraryStruct *Lib, int Flag)
{
int NumOfParts = 0;
EDA_LibComponentStruct *LibEntry, * PreviousLibEntry;
wxString CmpName;
wxClientDC dc(DrawPanel);
DrawPanel->PrepareGraphicContext(&dc);
if (Lib) NumOfParts = Lib->m_NumOfParts;
if (NumOfParts == 0)
{
DisplayError(this, wxT("No Library or Library is empty!"));
return;
}
if ( Lib == NULL ) return;
PQCompFunc((PQCompFuncType) LibraryEntryCompare);
LibEntry = (EDA_LibComponentStruct *) PQFirst(&Lib->m_Entries, FALSE);
if( Flag == NEW_PART )
{
DisplayComponentsNamesInLib(this, Lib, CmpName, g_CurrentViewComponentName);
}
if( Flag == NEXT_PART )
{
LibEntry = (EDA_LibComponentStruct *) PQFirst(&Lib->m_Entries, FALSE);
while ( LibEntry )
{
if( LibEntry->m_Name.m_Text == g_CurrentViewComponentName )
{
LibEntry = (EDA_LibComponentStruct *)
PQNext(Lib->m_Entries, LibEntry, NULL);
break;
}
LibEntry = (EDA_LibComponentStruct *)
PQNext(Lib->m_Entries, LibEntry, NULL);
}
if(LibEntry == NULL)
LibEntry = (EDA_LibComponentStruct *) PQFirst(&Lib->m_Entries, FALSE);
if( LibEntry ) CmpName = LibEntry->m_Name.m_Text;
}
if( Flag == PREVIOUS_PART )
{
PreviousLibEntry = NULL;
LibEntry = (EDA_LibComponentStruct *) PQFirst(&Lib->m_Entries, FALSE);
while ( LibEntry )
{
if( LibEntry->m_Name.m_Text == g_CurrentViewComponentName )
{
if( PreviousLibEntry ) break;
/* else : pointage sur 1er element :
balayage de la liste et Previous pointera dernier element */
}
PreviousLibEntry = LibEntry;
LibEntry = (EDA_LibComponentStruct *)
PQNext(Lib->m_Entries, LibEntry, NULL);
}
if( PreviousLibEntry )
CmpName = PreviousLibEntry->m_Name.m_Text;
}
g_ViewUnit = 1;
g_ViewConvert = 1;
LibEntry = FindLibPart(CmpName,Lib->m_Name, FIND_ALIAS);
g_CurrentViewComponentName = CmpName;
DisplayLibInfos();
Zoom_Automatique(FALSE);
RedrawActiveWindow(&dc, TRUE);
if ( m_CmpList )
{
int id = m_CmpList->FindString(g_CurrentViewComponentName.GetData());
if ( id >= 0 ) m_CmpList->SetSelection(id);
}
ReCreateHToolbar();
}
/*****************************************************************************/
/* Routine d'affichage du composant selectionne */
/* Si Le composant est un alias, le composant ROOT est recherche et affiche */
/*****************************************************************************/
void WinEDA_ViewlibFrame::RedrawActiveWindow(wxDC * DC, bool EraseBg)
{
EDA_LibComponentStruct * LibEntry = NULL;
LibCmpEntry * ViewCmpEntry = NULL;
const wxChar * RootName, * CmpName;
wxString Msg;
ActiveScreen = GetScreen();
if ( * g_CurrentViewComponentName )
{
LibEntry = FindLibPart(g_CurrentViewComponentName.GetData(),
g_CurrentViewLibraryName, FIND_ALIAS);
ViewCmpEntry = (LibCmpEntry * ) LibEntry;
}
/* Forcage de la reinit de la brosse et plume courante */
GRResetPenAndBrush(DC);
DC->SetBackground(*wxBLACK_BRUSH );
DC->SetBackgroundMode(wxTRANSPARENT);
if ( EraseBg ) DrawPanel->EraseScreen(DC);
DrawPanel->DrawBackGround(DC);
if( LibEntry)
{
CmpName = LibEntry->m_Name.m_Text.GetData();
if( LibEntry->Type != ROOT)
{
RootName = ((EDA_LibCmpAliasStruct*)LibEntry)->m_RootName.GetData();
Msg.Printf( _("Current Part: <%s> (is Alias of <%s>)"),
CmpName, RootName);
LibEntry = FindLibPart(RootName,g_CurrentViewLibraryName,FIND_ROOT);
if( LibEntry == NULL)
{
Msg.Printf( _("Error: Root Part <%s> not found"), RootName);
DisplayError(this, Msg);
}
else
{
/* Affichage du composant ROOT, avec nom de l'alias */
wxString RealName;
RealName = LibEntry->m_Name.m_Text;
LibEntry->m_Name.m_Text = CmpName;
if ( g_ViewUnit < 1 ) g_ViewUnit = 1;
if ( g_ViewConvert < 1 ) g_ViewConvert = 1;
DrawLibEntry(DrawPanel, DC, LibEntry, 0, 0,
g_ViewUnit, g_ViewConvert, GR_DEFAULT_DRAWMODE);
LibEntry->m_Name.m_Text = RealName;
}
}
else
{
Msg.Printf( _("Current Part: <%s>"), ViewCmpEntry->m_Name.m_Text.GetData());
DrawLibEntry(DrawPanel, DC, LibEntry, 0, 0,
g_ViewUnit, g_ViewConvert, GR_DEFAULT_DRAWMODE);
}
AfficheDoc(this, ViewCmpEntry->m_Doc, ViewCmpEntry->m_KeyWord);
}
SetStatusText(Msg,0);
DrawPanel->Trace_Curseur(DC);
}