kicad/eeschema/viewlibs.cpp

379 lines
11 KiB
C++

/****************************/
/* EESchema - viewlibs.cpp */
/****************************/
#include "fctsys.h"
#include "gr_basic.h"
#include "common.h"
#include "class_drawpanel.h"
#include "confirm.h"
#include "eda_doc.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 )
/*************************************************************************/
{
wxString msg;
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;
DrawPanel->Refresh();
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;
DrawPanel->Refresh();
break;
case ID_LIBVIEW_SELECT_PART_NUMBER:
ii = SelpartBox->GetChoice();
if( ii < 0 )
return;
g_ViewUnit = ii + 1;
DrawPanel->Refresh();
break;
default:
msg << wxT( "WinEDA_ViewlibFrame::Process_Special_Functions error: id = " ) << id;
DisplayError( this, msg );
break;
}
}
/*************************************************************************/
void WinEDA_ViewlibFrame::OnLeftClick( wxDC* DC, const wxPoint& MousePos )
/*************************************************************************/
{
}
/********************************************************************************/
bool WinEDA_ViewlibFrame::OnRightClick( const wxPoint& MousePos,
wxMenu* PopMenu )
/********************************************************************************/
{
return true;
}
/**********************************************/
void WinEDA_ViewlibFrame::DisplayLibInfos()
/**********************************************/
/* Affiche en Ligne d'info la librairie en cours de visualisation */
{
wxString msg;
LibraryStruct* Lib;
Lib = FindLibrary( g_CurrentViewLibraryName );
msg = _( "Library browser" );
msg << wxT( " [" );
if( Lib )
msg << g_CurrentViewLibraryName;
else
msg += _( "none selected" );
msg << wxT( "]" );
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();
DrawPanel->Refresh();
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.GetData(), 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, wxPoint( 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, wxPoint( 0, 0 ),
g_ViewUnit, g_ViewConvert, GR_DEFAULT_DRAWMODE );
}
AfficheDoc( this, ViewCmpEntry->m_Doc, ViewCmpEntry->m_KeyWord );
}
SetStatusText( Msg, 0 );
DrawPanel->Trace_Curseur( DC );
}