annotate dialog HIGification, refactor and beautify associated

annotation code
This commit is contained in:
stambaughw 2008-02-26 01:07:38 +00:00
parent d2fe629b13
commit df7e6f3705
10 changed files with 1037 additions and 869 deletions

View File

@ -5,6 +5,14 @@ Started 2007-June-11
Please add newer entries at the top, list the date and your name with Please add newer entries at the top, list the date and your name with
email address. email address.
2008-Feb-25 UPDATE Wayne Stambaugh <stambaughw{at}verizon{dot}net>
================================================================================
+eeschema
* converted annotate_dialog layout to Gnome HIG per UIPolicy.txt factor
out dialog code from annotate.cpp.
* refactor and uncrustify schframe.cpp and schedit.cpp
* modify eeschema CMakeList.txt to reflect code changes.
2008-Feb-22 UPDATE Dick Hollenbeck <dick@softplc.com> 2008-Feb-22 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================ ================================================================================

View File

@ -7,7 +7,7 @@ INCLUDE_DIRECTORIES(
SET(EESCHEMA_SRCS SET(EESCHEMA_SRCS
affiche.cpp affiche.cpp
annotate.cpp annotate.cpp
# annotate_dialog.cpp annotate_dialog.cpp
block.cpp block.cpp
block_libedit.cpp block_libedit.cpp
busentry.cpp busentry.cpp

View File

@ -2,135 +2,207 @@
/* annotate.cpp: component annotation */ /* annotate.cpp: component annotation */
/**************************************/ /**************************************/
/* Local Variable */ #include "fctsys.h"
static bool AnnotProject = true; #include "common.h"
static bool SortByPosition = true; #include "program.h"
#include "libcmp.h"
#include "annotate_dialog.cpp"
#include "netlist.h" #include "netlist.h"
#include "protos.h" #include "protos.h"
/* Local Functions*/ /* Local Functions*/
static int ListeComposants( CmpListStruct* BaseListeCmp, DrawSheetList* sheet ); static int ListeComposants( CmpListStruct* BaseListeCmp, DrawSheetList* sheet );
static int AnnotTriComposant( const void* o1, const void* o2 );
static void BreakReference( CmpListStruct* BaseListeCmp, int NbOfCmp ); static void BreakReference( CmpListStruct* BaseListeCmp, int NbOfCmp );
static void ReAnnotateComponents( CmpListStruct* BaseListeCmp, int NbOfCmp ); static void ReAnnotateComponents( CmpListStruct* BaseListeCmp, int NbOfCmp );
static void ComputeReferenceNumber( CmpListStruct* BaseListeCmp, int NbOfCmp ); static void ComputeReferenceNumber( CmpListStruct* BaseListeCmp, int NbOfCmp );
static int GetLastReferenceNumber( CmpListStruct* Objet, CmpListStruct* BaseListeCmp, int GetLastReferenceNumber( CmpListStruct* Objet,
int NbOfCmp ); CmpListStruct* BaseListeCmp,
int NbOfCmp );
static int ExistUnit( CmpListStruct* Objet, int Unit, static int ExistUnit( CmpListStruct* Objet, int Unit,
CmpListStruct* BaseListeCmp, int NbOfCmp ); CmpListStruct* BaseListeCmp, int NbOfCmp );
/**************************************/ /*****************************************************************************
void ReAnnotatePowerSymbolsOnly( void ) * Used to annotate the power symbols, before testing erc or computing
/**************************************/ * netlist when a component reannotation is not necessary
/* Used to reannotate the power symbols, before testing erc or computing netlist
* when a true component reannotation is not necessary
* *
* In order to avoid conflicts the ref number starts with a 0: * In order to avoid conflicts the reference number starts with a 0. A
* PWR with id 12 is named PWR12 in global annotation and PWR012 by the Power annotation * PWR with id 12 is named PWR12 in global annotation and PWR012 by the
*/ * Power annotation.
****************************************************************************/
void ReAnnotatePowerSymbolsOnly( void )
{ {
/* Build the screen list (screen, not sheet) */ /* Build the screen list (screen, not sheet) */
EDA_SheetList SheetList( NULL ); EDA_SheetList SheetList( NULL );
/* Update the screen number, sheet count and date */ /* Update the screen number, sheet count and date */
//ScreenList.UpdateScreenNumberAndDate(); //ScreenList.UpdateScreenNumberAndDate();
DrawSheetList* sheet; DrawSheetList* sheet;
int CmpNumber = 1; int CmpNumber = 1;
for( sheet = SheetList.GetFirst(); sheet != NULL; sheet = SheetList.GetNext())
for( sheet = SheetList.GetFirst();
sheet != NULL;
sheet = SheetList.GetNext() )
{ {
EDA_BaseStruct* DrawList = sheet->LastDrawList(); EDA_BaseStruct* DrawList = sheet->LastDrawList();
for( ; DrawList != NULL; DrawList = DrawList->Pnext ) for( ; DrawList != NULL; DrawList = DrawList->Pnext )
{ {
if( DrawList->Type() != DRAW_LIB_ITEM_STRUCT_TYPE ) if( DrawList->Type() != DRAW_LIB_ITEM_STRUCT_TYPE )
continue; continue;
EDA_SchComponentStruct* DrawLibItem = (EDA_SchComponentStruct*) DrawList; EDA_SchComponentStruct* DrawLibItem =
(EDA_SchComponentStruct*) DrawList;
EDA_LibComponentStruct* Entry = EDA_LibComponentStruct* Entry =
FindLibPart( DrawLibItem->m_ChipName.GetData(), wxEmptyString, FIND_ROOT ); FindLibPart(
DrawLibItem->m_ChipName.GetData(), wxEmptyString,
FIND_ROOT );
if( (Entry == NULL) || (Entry->m_Options != ENTRY_POWER) ) if( (Entry == NULL) || (Entry->m_Options != ENTRY_POWER) )
continue; continue;
//DrawLibItem->ClearAnnotation(sheet); this clears all annotation :( //DrawLibItem->ClearAnnotation(sheet); this clears all annotation :(
wxString refstr = DrawLibItem->m_PrefixString; wxString refstr = DrawLibItem->m_PrefixString;
//str will be "C?" or so after the ClearAnnotation call.
while(refstr.Last() == '?') //str will be "C?" or so after the ClearAnnotation call.
refstr.RemoveLast(); while( refstr.Last() == '?' )
if(!refstr.StartsWith(wxT("#"))) refstr.RemoveLast();
refstr = wxT("#") + refstr;
refstr << wxT( "0" ) << CmpNumber; if( !refstr.StartsWith( wxT( "#" ) ) )
DrawLibItem->SetRef(sheet, refstr); refstr = wxT( "#" ) + refstr;
refstr << wxT( "0" ) << CmpNumber;
DrawLibItem->SetRef( sheet, refstr );
CmpNumber++; CmpNumber++;
} }
} }
} }
/***********************************************************************/
CmpListStruct* AllocateCmpListStrct(int numcomponents )
/***********************************************************************/ CmpListStruct* AllocateCmpListStrct( int numcomponents )
{ {
int ii = numcomponents * sizeof(CmpListStruct); int ii = numcomponents * sizeof(CmpListStruct);
CmpListStruct* list = (CmpListStruct*) MyZMalloc( ii ); CmpListStruct* list = (CmpListStruct*) MyZMalloc( ii );
//fill this memory with zeros.
char* cptr = (char*)list;
for(int i=0; i<ii; i++)
*cptr++ = 0;
return list;
}
/***********************************************************************/ //fill this memory with zeros.
void InstallAnnotateFrame( WinEDA_SchematicFrame* parent, wxPoint& pos ) char* cptr = (char*) list;
/***********************************************************************/
/** Function InstallAnnotateFrame for( int i = 0; i<ii; i++ )
* Install the annotate dialog frame *cptr++ = 0;
*/
{
WinEDA_AnnotateFrame* frame = new WinEDA_AnnotateFrame( parent );
frame->ShowModal(); return list;
frame->Destroy();
} }
/******************************************************************/ /* qsort function to annotate items by their position. */
void WinEDA_AnnotateFrame::AnnotateComponents( wxCommandEvent& event ) int AnnotateByPosition( const void* o1, const void* o2 )
/******************************************************************/ {
CmpListStruct* item1 = (CmpListStruct*) o1;
CmpListStruct* item2 = (CmpListStruct*) o2;
/** Function WinEDA_AnnotateFrame::AnnotateComponents int ii = strnicmp( item1->m_TextRef, item2->m_TextRef, 32 );
* Compute the annotation of the components for the whole project, or the current sheet only.
* All the components or the new ones only will be annotated. if( ii == 0 )
*/ ii = item1->m_SheetList.Cmp( item2->m_SheetList );
if( ii == 0 )
ii = item1->m_Pos.x - item2->m_Pos.x;
if( ii == 0 )
ii = item1->m_Pos.y - item2->m_Pos.y;
if( ii == 0 )
ii = item1->m_TimeStamp - item2->m_TimeStamp;
return ii;
}
/*****************************************************************************
* qsort function to annotate items by value
* Components are sorted
* by reference
* if same reference: by value
* if same value: by unit number
* if same unit number, by sheet
* if same sheet, by time stamp
*****************************************************************************/
int AnnotateByValue( const void* o1, const void* o2 )
{
CmpListStruct* item1 = (CmpListStruct*) o1;
CmpListStruct* item2 = (CmpListStruct*) o2;
int ii = strnicmp( item1->m_TextRef, item2->m_TextRef, 32 );
if( ii == 0 )
ii = strnicmp( item1->m_TextValue, item2->m_TextValue, 32 );
if( ii == 0 )
ii = item1->m_Unit - item2->m_Unit;
if( ii == 0 )
ii = item1->m_SheetList.Cmp( item2->m_SheetList );
if( ii == 0 )
ii = item1->m_Pos.x - item2->m_Pos.x;
if( ii == 0 )
ii = item1->m_Pos.y - item2->m_Pos.y;
if( ii == 0 )
ii = item1->m_TimeStamp - item2->m_TimeStamp;
return ii;
}
/*****************************************************************************
* DeleteAnnotation:
*
* Clear the current annotation.
****************************************************************************/
void DeleteAnnotation( WinEDA_SchematicFrame* parent, bool annotateSchematic )
{
DrawSheetStruct* sheet;
if( annotateSchematic )
sheet = g_RootSheet;
else
sheet = parent->GetSheet()->Last();
sheet->DeleteAnnotation( annotateSchematic );
g_RootSheet->m_s->SetModify();
parent->DrawPanel->Refresh( true );
}
/*****************************************************************************
* AnnotateComponents:
*
* Compute the annotation of the components for the whole project, or the
* current sheet only. All the components or the new ones only will be
* annotated.
*****************************************************************************/
void AnnotateComponents( WinEDA_SchematicFrame* parent,
bool annotateSchematic,
bool sortByPosition,
bool resetAnnotation )
{ {
int ii, NbOfCmp; int ii, NbOfCmp;
DrawSheetList* sheet; DrawSheetList* sheet;
CmpListStruct* BaseListeCmp; CmpListStruct* BaseListeCmp;
wxBusyCursor dummy; wxBusyCursor dummy;
AnnotProject = (m_AnnotProjetCtrl->GetSelection() == 0) ? true : FALSE; /* If it is an annotation for all the components, reset previous
SortByPosition = (m_AnnotSortCmpCtrl->GetSelection() == 0) ? true : FALSE; annotation: */
if( resetAnnotation )
/* If it is an annotation for all the components, reset previous annotation: */ DeleteAnnotation( parent, annotateSchematic );
if( m_AnnotNewCmpCtrl->GetSelection() == 0 )
DeleteAnnotation( event );
if( m_Abort )
return;
/* Build the sheet list */ /* Build the sheet list */
EDA_SheetList SheetList( g_RootSheet ); EDA_SheetList SheetList( g_RootSheet );
/* Update the sheet number */ /* Update the sheet number */
ii = 0; ii = 0;
/* First pass: Component counting */ /* First pass: Component counting */
sheet = m_Parent->GetSheet(); sheet = parent->GetSheet();
if( AnnotProject == true ){ if( annotateSchematic )
{
NbOfCmp = 0; NbOfCmp = 0;
for( sheet = SheetList.GetFirst(); sheet != NULL; sheet = SheetList.GetNext() ) for( sheet = SheetList.GetFirst();
sheet != NULL;
sheet = SheetList.GetNext() )
NbOfCmp += ListeComposants( NULL, sheet ); NbOfCmp += ListeComposants( NULL, sheet );
} }
else else
@ -139,95 +211,52 @@ void WinEDA_AnnotateFrame::AnnotateComponents( wxCommandEvent& event )
if( NbOfCmp == 0 ) if( NbOfCmp == 0 )
return; return;
BaseListeCmp = AllocateCmpListStrct(NbOfCmp); BaseListeCmp = AllocateCmpListStrct( NbOfCmp );
/* Second pass : Int data tables */ /* Second pass : Int data tables */
if( AnnotProject == true ) if( annotateSchematic )
{ {
ii = 0; ii = 0;
for( sheet = SheetList.GetFirst(); sheet != NULL; sheet = SheetList.GetNext() ) for( sheet = SheetList.GetFirst();
ii += ListeComposants( BaseListeCmp + ii, sheet); sheet != NULL;
sheet = SheetList.GetNext() )
ii += ListeComposants( BaseListeCmp + ii, sheet );
} }
else else
ii = ListeComposants( BaseListeCmp, sheet); ii = ListeComposants( BaseListeCmp, sheet );
if( ii != NbOfCmp ) if( ii != NbOfCmp )
DisplayError( this, wxT( "Internal error in AnnotateComponents()" ) ); DisplayError( parent, wxT( "Internal error in AnnotateComponents()" ) );
/* Break full components reference in name (prefix) and number: example: IC1 become IC, and 1 */ /* Break full components reference in name (prefix) and number:
example: IC1 become IC, and 1 */
BreakReference( BaseListeCmp, NbOfCmp ); BreakReference( BaseListeCmp, NbOfCmp );
qsort( BaseListeCmp, NbOfCmp, sizeof(CmpListStruct), if ( sortByPosition )
( int( * ) ( const void*, const void* ) )AnnotTriComposant ); qsort( BaseListeCmp, NbOfCmp, sizeof(CmpListStruct),
( int( * ) ( const void*, const void* ) )AnnotateByValue );
else
qsort( BaseListeCmp, NbOfCmp, sizeof(CmpListStruct),
( int( * ) ( const void*, const void* ) )AnnotateByPosition );
/* Recalculate reference numbers */ /* Recalculate reference numbers */
ComputeReferenceNumber( BaseListeCmp, NbOfCmp ); ComputeReferenceNumber( BaseListeCmp, NbOfCmp );
ReAnnotateComponents( BaseListeCmp, NbOfCmp ); ReAnnotateComponents( BaseListeCmp, NbOfCmp );
MyFree( BaseListeCmp ); BaseListeCmp = NULL; MyFree( BaseListeCmp );
BaseListeCmp = NULL;
/* Final control */ /* Final control */
CheckAnnotate( m_Parent, AnnotProject ? FALSE : true ); CheckAnnotate( parent, !annotateSchematic );
parent->DrawPanel->Refresh( true );
m_Parent->DrawPanel->Refresh( true ); /* Refresh screen */
EndModal( 1 );
} }
/********************************************************************/ /*****************************************************************************
void WinEDA_AnnotateFrame::DeleteAnnotation( wxCommandEvent& event ) * if BaseListeCmp == NULL : count components
/********************************************************************/
/* Clear the current annotation for the whole project or only for the current sheet
* Update sheet number and number of sheets
*/
{
DrawSheetStruct* sheet;
//EDA_SchComponentStruct* DrawLibItem;
if( !IsOK( this, _( "Previous Annotation will be deleted. Continue ?" ) ) ){
m_Abort = true;
return;
}
AnnotProject = (m_AnnotProjetCtrl->GetSelection() == 0) ? true : FALSE;
m_Abort = FALSE;
if( AnnotProject == true )
sheet = g_RootSheet;
else
sheet = m_Parent->GetSheet()->Last();
sheet->DeleteAnnotation( AnnotProject );
/*
for( ; screen != NULL; screen = ScreenList.GetNext() )
{
EDA_BaseStruct* DrawList = screen->EEDrawList;
for( ; DrawList != NULL; DrawList = DrawList->Pnext )
{
if( DrawList->Type() == DRAW_LIB_ITEM_STRUCT_TYPE )
{
DrawLibItem = (EDA_SchComponentStruct*) DrawList;
DrawLibItem->ClearAnnotation();
}
}
if( !AnnotProject )
break;
}
*/
g_RootSheet->m_s->SetModify();
m_Parent->DrawPanel->Refresh( true );
//EndModal( 0 );
}
/************************************************************************************/
int ListeComposants( CmpListStruct* BaseListeCmp, DrawSheetList* sheet)
/***********************************************************************************/
/* if BaseListeCmp == NULL : count components
* else update data table BaseListeCmp * else update data table BaseListeCmp
*/ *****************************************************************************/
int ListeComposants( CmpListStruct* BaseListeCmp, DrawSheetList* sheet )
{ {
int NbrCmp = 0; int NbrCmp = 0;
EDA_BaseStruct* DrawList = sheet->LastDrawList(); EDA_BaseStruct* DrawList = sheet->LastDrawList();
@ -236,42 +265,35 @@ int ListeComposants( CmpListStruct* BaseListeCmp, DrawSheetList* sheet)
for( ; DrawList; DrawList = DrawList->Pnext ) for( ; DrawList; DrawList = DrawList->Pnext )
{ {
switch( DrawList->Type() ) if( DrawList->Type() == DRAW_LIB_ITEM_STRUCT_TYPE )
{ {
case DRAW_SEGMENT_STRUCT_TYPE:
case DRAW_JUNCTION_STRUCT_TYPE:
case DRAW_TEXT_STRUCT_TYPE:
case DRAW_LABEL_STRUCT_TYPE:
case DRAW_GLOBAL_LABEL_STRUCT_TYPE:
case DRAW_HIER_LABEL_STRUCT_TYPE:
break;
case DRAW_LIB_ITEM_STRUCT_TYPE:
DrawLibItem = (EDA_SchComponentStruct*) DrawList; DrawLibItem = (EDA_SchComponentStruct*) DrawList;
Entry = FindLibPart( DrawLibItem->m_ChipName.GetData(), wxEmptyString, FIND_ROOT ); Entry = FindLibPart( DrawLibItem->m_ChipName.GetData(),
wxEmptyString,
FIND_ROOT );
if( Entry == NULL ) if( Entry == NULL )
break; continue;
if( BaseListeCmp == NULL ) /* Items counting only */ if( BaseListeCmp == NULL ) /* Items counting only */
{ {
NbrCmp++; NbrCmp++;
break; continue;
} }
BaseListeCmp[NbrCmp].m_Cmp = DrawLibItem; BaseListeCmp[NbrCmp].m_Cmp = DrawLibItem;
BaseListeCmp[NbrCmp].m_NbParts = Entry->m_UnitCount; BaseListeCmp[NbrCmp].m_NbParts = Entry->m_UnitCount;
BaseListeCmp[NbrCmp].m_Unit = DrawLibItem->m_Multi; BaseListeCmp[NbrCmp].m_Unit = DrawLibItem->m_Multi;
BaseListeCmp[NbrCmp].m_PartsLocked = Entry->m_UnitSelectionLocked; BaseListeCmp[NbrCmp].m_PartsLocked = Entry->m_UnitSelectionLocked;
BaseListeCmp[NbrCmp].m_SheetList = *sheet; BaseListeCmp[NbrCmp].m_SheetList = *sheet;
BaseListeCmp[NbrCmp].m_IsNew = FALSE; BaseListeCmp[NbrCmp].m_IsNew = FALSE;
BaseListeCmp[NbrCmp].m_Pos = DrawLibItem->m_Pos; BaseListeCmp[NbrCmp].m_Pos = DrawLibItem->m_Pos;
BaseListeCmp[NbrCmp].m_TimeStamp = DrawLibItem->m_TimeStamp; BaseListeCmp[NbrCmp].m_TimeStamp = DrawLibItem->m_TimeStamp;
if( DrawLibItem->GetRef(sheet).IsEmpty() ) if( DrawLibItem->GetRef( sheet ).IsEmpty() )
DrawLibItem->SetRef( sheet, wxT( "DefRef?" ) ); DrawLibItem->SetRef( sheet, wxT( "DefRef?" ) );
strncpy( BaseListeCmp[NbrCmp].m_TextRef, strncpy( BaseListeCmp[NbrCmp].m_TextRef,
CONV_TO_UTF8(DrawLibItem->GetRef(sheet)), 32 ); CONV_TO_UTF8( DrawLibItem->GetRef( sheet ) ), 32 );
BaseListeCmp[NbrCmp].m_NumRef = -1; BaseListeCmp[NbrCmp].m_NumRef = -1;
@ -281,19 +303,6 @@ int ListeComposants( CmpListStruct* BaseListeCmp, DrawSheetList* sheet)
strncpy( BaseListeCmp[NbrCmp].m_TextValue, strncpy( BaseListeCmp[NbrCmp].m_TextValue,
CONV_TO_UTF8( DrawLibItem->m_Field[VALUE].m_Text ), 32 ); CONV_TO_UTF8( DrawLibItem->m_Field[VALUE].m_Text ), 32 );
NbrCmp++; NbrCmp++;
break;
case DRAW_PICK_ITEM_STRUCT_TYPE:
case DRAW_POLYLINE_STRUCT_TYPE:
case DRAW_BUSENTRY_STRUCT_TYPE:
case DRAW_SHEET_STRUCT_TYPE:
case DRAW_SHEETLABEL_STRUCT_TYPE:
case DRAW_MARKER_STRUCT_TYPE:
case DRAW_NOCONNECT_STRUCT_TYPE:
break;
default:
break;
} }
} }
@ -301,60 +310,11 @@ int ListeComposants( CmpListStruct* BaseListeCmp, DrawSheetList* sheet)
} }
/*****************************************************************/ /*****************************************************************************
int AnnotTriComposant( const void* o1, const void* o2 ) * Update the reference component for the schematic project (or the current
/****************************************************************/ * sheet)
*****************************************************************************/
/* function used par qsort() for sorting the list
* Composants are sorted
* by reference
* if same reference: by value
* if same value: by unit number
* if same unit number, by sheet
* if same sheet, by time stamp
**/
{
CmpListStruct* Objet1 = (CmpListStruct*) o1;
CmpListStruct* Objet2 = (CmpListStruct*) o2;
int ii = strnicmp( Objet1->m_TextRef, Objet2->m_TextRef, 32 );
if( SortByPosition == true )
{
if( ii == 0 )
ii = Objet1->m_SheetList.Cmp(Objet2->m_SheetList);
if( ii == 0 )
ii = Objet1->m_Pos.x - Objet2->m_Pos.x;
if( ii == 0 )
ii = Objet1->m_Pos.y - Objet2->m_Pos.y;
}
else // Sort by value
{
if( ii == 0 )
ii = strnicmp( Objet1->m_TextValue, Objet2->m_TextValue, 32 );
if( ii == 0 )
ii = Objet1->m_Unit - Objet2->m_Unit;
if( ii == 0 )
ii = Objet1->m_SheetList.Cmp(Objet2->m_SheetList);
if( ii == 0 )
ii = Objet1->m_Pos.x - Objet2->m_Pos.x;
if( ii == 0 )
ii = Objet1->m_Pos.y - Objet2->m_Pos.y;
}
if( ii == 0 )
ii = Objet1->m_TimeStamp - Objet2->m_TimeStamp;
return ii;
}
/********************************************************************/
static void ReAnnotateComponents( CmpListStruct* BaseListeCmp, int NbOfCmp ) static void ReAnnotateComponents( CmpListStruct* BaseListeCmp, int NbOfCmp )
/********************************************************************/
/* Update the reference component for the schematic project (or the current sheet)
*/
{ {
int ii; int ii;
char* Text; char* Text;
@ -371,22 +331,23 @@ static void ReAnnotateComponents( CmpListStruct* BaseListeCmp, int NbOfCmp )
else else
sprintf( Text + strlen( Text ), "%d", BaseListeCmp[ii].m_NumRef ); sprintf( Text + strlen( Text ), "%d", BaseListeCmp[ii].m_NumRef );
DrawLibItem->SetRef(&(BaseListeCmp[ii].m_SheetList), CONV_FROM_UTF8( Text ) ); DrawLibItem->SetRef( &(BaseListeCmp[ii].m_SheetList),
CONV_FROM_UTF8( Text ) );
DrawLibItem->m_Multi = BaseListeCmp[ii].m_Unit; DrawLibItem->m_Multi = BaseListeCmp[ii].m_Unit;
} }
} }
/**************************************************************/ /*****************************************************************************
* Split component reference designators into a name (prefix) and number.
* Example: IC1 becomes IC and 1 in the .m_NumRef member.
* For multi part per package components not already annotated, set .m_Unit
* to a max value (0x7FFFFFFF).
*
* @param BaseListeCmp = list of component
* @param NbOfCmp = item count in the list
*****************************************************************************/
void BreakReference( CmpListStruct* BaseListeCmp, int NbOfCmp ) void BreakReference( CmpListStruct* BaseListeCmp, int NbOfCmp )
/**************************************************************/
/** BreakReference
* Break full components reference in name (prefix) and number: example: IC1 become IC, and 1 in .m_NumRef
* For multi part per package components not already annotated, set .m_Unit to a max value (0x7FFFFFFF)
* @param BaseListeCmp = list of component
* @param NbOfCmp = item count in the list
*/
{ {
int ii, ll; int ii, ll;
char* Text; char* Text;
@ -425,26 +386,26 @@ void BreakReference( CmpListStruct* BaseListeCmp, int NbOfCmp )
break; break;
} }
} }
/*printf("BreakReference(): %s number found: %d\n",
BaseListeCmp[ii].m_TextRef, wxLogDebug( wxT("BreakReference(): %s number found: %d\n" ),
BaseListeCmp[ii].m_NumRef); */ BaseListeCmp[ii].m_TextRef,
BaseListeCmp[ii].m_NumRef );
} }
} }
/*****************************************************************************/ /*****************************************************************************
* Compute the reference number for components without reference number
* Compute .m_NumRef member
*****************************************************************************/
static void ComputeReferenceNumber( CmpListStruct* BaseListeCmp, int NbOfCmp ) static void ComputeReferenceNumber( CmpListStruct* BaseListeCmp, int NbOfCmp )
/*****************************************************************************/
/* Compute the reference number for components without reference number
* Compute .m_NumRef member
*/
{ {
int ii, jj, LastReferenceNumber, NumberOfUnits, Unit; int ii, jj, LastReferenceNumber, NumberOfUnits, Unit;
const char* Text, * RefText, * ValText; const char* Text, * RefText, * ValText;
CmpListStruct* ObjRef, * ObjToTest; CmpListStruct* ObjRef, * ObjToTest;
/* Components with an invisible reference (power...) always are re-annotated */ /* Components with an invisible reference (power...) always are
* re-annotated */
for( ii = 0; ii < NbOfCmp; ii++ ) for( ii = 0; ii < NbOfCmp; ii++ )
{ {
Text = BaseListeCmp[ii].m_TextRef; Text = BaseListeCmp[ii].m_TextRef;
@ -466,7 +427,9 @@ static void ComputeReferenceNumber( CmpListStruct* BaseListeCmp, int NbOfCmp )
if( strnicmp( RefText, Text, 32 ) != 0 ) /* Nouveau Identificateur */ if( strnicmp( RefText, Text, 32 ) != 0 ) /* Nouveau Identificateur */
{ {
RefText = BaseListeCmp[ii].m_TextRef; RefText = BaseListeCmp[ii].m_TextRef;
LastReferenceNumber = GetLastReferenceNumber( BaseListeCmp + ii, BaseListeCmp, NbOfCmp ); LastReferenceNumber = GetLastReferenceNumber( BaseListeCmp + ii,
BaseListeCmp,
NbOfCmp );
} }
/* Annotation of one part per package components (trivial case)*/ /* Annotation of one part per package components (trivial case)*/
@ -483,13 +446,16 @@ static void ComputeReferenceNumber( CmpListStruct* BaseListeCmp, int NbOfCmp )
continue; continue;
} }
/* Annotation of multi-part components ( n parts per package ) (complex case) */ /* Annotation of multi-part components ( n parts per package )
(complex case) */
ValText = BaseListeCmp[ii].m_TextValue; ValText = BaseListeCmp[ii].m_TextValue;
NumberOfUnits = BaseListeCmp[ii].m_NbParts; NumberOfUnits = BaseListeCmp[ii].m_NbParts;
if( BaseListeCmp[ii].m_IsNew ) if( BaseListeCmp[ii].m_IsNew )
{ {
LastReferenceNumber++; BaseListeCmp[ii].m_NumRef = LastReferenceNumber; LastReferenceNumber++;
BaseListeCmp[ii].m_NumRef = LastReferenceNumber;
if( !BaseListeCmp[ii].m_PartsLocked ) if( !BaseListeCmp[ii].m_PartsLocked )
BaseListeCmp[ii].m_Unit = 1; BaseListeCmp[ii].m_Unit = 1;
BaseListeCmp[ii].m_Flag = 1; BaseListeCmp[ii].m_Flag = 1;
@ -519,8 +485,10 @@ static void ComputeReferenceNumber( CmpListStruct* BaseListeCmp, int NbOfCmp )
{ {
continue; continue;
} }
/* Component without reference number found, annotate it if possible */ /* Component without reference number found, annotate it if
if( !BaseListeCmp[jj].m_PartsLocked || (BaseListeCmp[jj].m_Unit == Unit) ) possible */
if( !BaseListeCmp[jj].m_PartsLocked ||
(BaseListeCmp[jj].m_Unit == Unit) )
{ {
BaseListeCmp[jj].m_NumRef = BaseListeCmp[ii].m_NumRef; BaseListeCmp[jj].m_NumRef = BaseListeCmp[ii].m_NumRef;
BaseListeCmp[jj].m_Unit = Unit; BaseListeCmp[jj].m_Unit = Unit;
@ -534,18 +502,18 @@ static void ComputeReferenceNumber( CmpListStruct* BaseListeCmp, int NbOfCmp )
} }
/*************************************************************************************************/ /*****************************************************************************
static int GetLastReferenceNumber( CmpListStruct* Objet, CmpListStruct* BaseListeCmp, int NbOfCmp ) * Search the last used (greatest) reference number in the component list
/*************************************************************************************************/ * for the prefix reference given by Objet
* The component list must be sorted.
/** Function GetLastReferenceNumber *
* Search the last (bigger) reference number in the component list
* for the prefix reference given by Objet
* The component list must be sorted
* @param Objet = reference item ( Objet->m_TextRef is the search pattern) * @param Objet = reference item ( Objet->m_TextRef is the search pattern)
* @param BaseListeCmp = list of items * @param BaseListeCmp = list of items
* @param NbOfCmp = items count in list of items * @param NbOfCmp = items count in list of items
*/ *****************************************************************************/
int GetLastReferenceNumber( CmpListStruct* Objet,
CmpListStruct* BaseListeCmp,
int NbOfCmp )
{ {
CmpListStruct* LastObjet = BaseListeCmp + NbOfCmp; CmpListStruct* LastObjet = BaseListeCmp + NbOfCmp;
int LastNumber = 0; int LastNumber = 0;
@ -554,7 +522,8 @@ static int GetLastReferenceNumber( CmpListStruct* Objet, CmpListStruct* BaseList
RefText = Objet->m_TextRef; RefText = Objet->m_TextRef;
for( ; Objet < LastObjet; Objet++ ) for( ; Objet < LastObjet; Objet++ )
{ {
if( strnicmp( RefText, Objet->m_TextRef, 32 ) != 0 ) /* Nouveau Identificateur */ /* Nouveau Identificateur */
if( strnicmp( RefText, Objet->m_TextRef, 32 ) != 0 )
break; break;
if( LastNumber < Objet->m_NumRef ) if( LastNumber < Objet->m_NumRef )
LastNumber = Objet->m_NumRef; LastNumber = Objet->m_NumRef;
@ -564,17 +533,16 @@ static int GetLastReferenceNumber( CmpListStruct* Objet, CmpListStruct* BaseList
} }
/*****************************************************************/ /*****************************************************************************
static int ExistUnit( CmpListStruct* Objet, int Unit, * TODO: Translate this to english/
CmpListStruct* BaseListeCmp, int NbOfCmp ) * Recherche dans la liste triee des composants, pour les composants
/****************************************************************/
/* Recherche dans la liste triee des composants, pour les composants
* multiples s'il existe pour le composant de reference Objet, * multiples s'il existe pour le composant de reference Objet,
* une unite de numero Unit * une unite de numero Unit
* Retourne index dans BaseListeCmp si oui * Retourne index dans BaseListeCmp si oui
* retourne -1 si non * retourne -1 si non
*/ *****************************************************************************/
static int ExistUnit( CmpListStruct* Objet, int Unit,
CmpListStruct* BaseListeCmp, int NbOfCmp )
{ {
CmpListStruct* EndList = BaseListeCmp + NbOfCmp; CmpListStruct* EndList = BaseListeCmp + NbOfCmp;
char* RefText, * ValText; char* RefText, * ValText;
@ -584,7 +552,9 @@ static int ExistUnit( CmpListStruct* Objet, int Unit,
RefText = Objet->m_TextRef; RefText = Objet->m_TextRef;
ValText = Objet->m_TextValue; ValText = Objet->m_TextValue;
NumRef = Objet->m_NumRef; NumRef = Objet->m_NumRef;
for( ItemToTest = BaseListeCmp, ii = 0; ItemToTest < EndList; ItemToTest++, ii++ ) for( ItemToTest = BaseListeCmp, ii = 0;
ItemToTest < EndList;
ItemToTest++, ii++ )
{ {
if( Objet == ItemToTest ) if( Objet == ItemToTest )
continue; continue;
@ -592,7 +562,8 @@ static int ExistUnit( CmpListStruct* Objet, int Unit,
continue; /* non affecte */ continue; /* non affecte */
if( ItemToTest->m_NumRef != NumRef ) if( ItemToTest->m_NumRef != NumRef )
continue; continue;
if( strnicmp( RefText, ItemToTest->m_TextRef, 32 ) != 0 ) /* Nouveau Identificateur */ /* Nouveau Identificateur */
if( strnicmp( RefText, ItemToTest->m_TextRef, 32 ) != 0 )
continue; continue;
if( ItemToTest->m_Unit == Unit ) if( ItemToTest->m_Unit == Unit )
{ {
@ -604,36 +575,40 @@ static int ExistUnit( CmpListStruct* Objet, int Unit,
} }
/******************************************************************/ /*****************************************************************************
int CheckAnnotate( WinEDA_SchematicFrame* frame, bool OneSheetOnly ) *
/******************************************************************/ * Function CheckAnnotate
* @return component count ( which are not annotated or have the same
/** Function CheckAnnotate * reference (duplicates))
* @return composent count ( which are not annotated or have the same reference (duplicates)) * @param oneSheetOnly : true = search is made only in the current sheet
* @param OneSheetOnly : true = search is made only in the current sheet
* false = search in whole hierarchy (usual search). * false = search in whole hierarchy (usual search).
*/ *
*****************************************************************************/
int CheckAnnotate( WinEDA_SchematicFrame* frame, bool oneSheetOnly )
{ {
int ii, error, NbOfCmp; int ii, error, NbOfCmp;
DrawSheetList* sheet; DrawSheetList* sheet;
CmpListStruct* ListeCmp = NULL; CmpListStruct* ListeCmp = NULL;
wxString Buff; wxString Buff;
wxString msg, cmpref; wxString msg, cmpref;
/* build the screen list */ /* build the screen list */
EDA_SheetList SheetList( NULL ); EDA_SheetList SheetList( NULL );
g_RootSheet->m_s->SetModify(); g_RootSheet->m_s->SetModify();
ii = 0; ii = 0;
/* first pass : count composents */ /* first pass : count composents */
if( !OneSheetOnly ){ if( !oneSheetOnly )
{
NbOfCmp = 0; NbOfCmp = 0;
for( sheet = SheetList.GetFirst(); sheet != NULL; sheet = SheetList.GetNext() ) for( sheet = SheetList.GetFirst();
sheet != NULL;
sheet = SheetList.GetNext() )
NbOfCmp += ListeComposants( NULL, sheet ); NbOfCmp += ListeComposants( NULL, sheet );
} }
else else
NbOfCmp = ListeComposants( NULL, frame->GetSheet() ); NbOfCmp = ListeComposants( NULL, frame->GetSheet() );
if( NbOfCmp == 0 ) if( NbOfCmp == 0 )
{ {
@ -643,22 +618,26 @@ int CheckAnnotate( WinEDA_SchematicFrame* frame, bool OneSheetOnly )
/* Second pass : create the list of components */ /* Second pass : create the list of components */
ListeCmp = AllocateCmpListStrct(NbOfCmp); ListeCmp = AllocateCmpListStrct( NbOfCmp );
printf("CheckAnnotate() listing all components:\n"); printf( "CheckAnnotate() listing all components:\n" );
if( !OneSheetOnly ){ if( !oneSheetOnly )
{
ii = 0; ii = 0;
for( sheet = SheetList.GetFirst(); sheet != NULL; sheet = SheetList.GetNext() ) for( sheet = SheetList.GetFirst();
sheet != NULL;
sheet = SheetList.GetNext() )
ii += ListeComposants( ListeCmp + ii, sheet ); ii += ListeComposants( ListeCmp + ii, sheet );
} }
else else
ListeComposants( ListeCmp, frame->GetSheet() ); ListeComposants( ListeCmp, frame->GetSheet() );
printf("CheckAnnotate() done:\n");
qsort( ListeCmp, NbOfCmp, sizeof(CmpListStruct), AnnotTriComposant );
/* Break full components reference in name (prefix) and number: example: IC1 become IC, and 1 */ printf( "CheckAnnotate() done:\n" );
qsort( ListeCmp, NbOfCmp, sizeof(CmpListStruct), AnnotateByValue );
/* Break full components reference in name (prefix) and number: example:
IC1 become IC, and 1 */
BreakReference( ListeCmp, NbOfCmp ); BreakReference( ListeCmp, NbOfCmp );
/* count not yet annotated items */ /* count not yet annotated items */
@ -676,7 +655,8 @@ int CheckAnnotate( WinEDA_SchematicFrame* frame, bool OneSheetOnly )
Buff = wxT( "?" ); Buff = wxT( "?" );
cmpref = CONV_FROM_UTF8( ListeCmp[ii].m_TextRef ); cmpref = CONV_FROM_UTF8( ListeCmp[ii].m_TextRef );
msg.Printf( _( "item not annotated: %s%s" ), cmpref.GetData(), Buff.GetData() ); msg.Printf( _( "item not annotated: %s%s" ),
cmpref.GetData(), Buff.GetData() );
if( (ListeCmp[ii].m_Unit > 0) && (ListeCmp[ii].m_Unit < 0x7FFFFFFF) ) if( (ListeCmp[ii].m_Unit > 0) && (ListeCmp[ii].m_Unit < 0x7FFFFFFF) )
{ {
@ -688,7 +668,8 @@ int CheckAnnotate( WinEDA_SchematicFrame* frame, bool OneSheetOnly )
break; break;
} }
if( MAX( ListeCmp[ii].m_NbParts, 1 ) < ListeCmp[ii].m_Unit ) // Annotate error // Annotate error
if( MAX( ListeCmp[ii].m_NbParts, 1 ) < ListeCmp[ii].m_Unit )
{ {
if( ListeCmp[ii].m_NumRef >= 0 ) if( ListeCmp[ii].m_NumRef >= 0 )
Buff << ListeCmp[ii].m_NumRef; Buff << ListeCmp[ii].m_NumRef;
@ -696,7 +677,8 @@ int CheckAnnotate( WinEDA_SchematicFrame* frame, bool OneSheetOnly )
Buff = wxT( "?" ); Buff = wxT( "?" );
cmpref = CONV_FROM_UTF8( ListeCmp[ii].m_TextRef ); cmpref = CONV_FROM_UTF8( ListeCmp[ii].m_TextRef );
msg.Printf( _( "Error item %s%s" ), cmpref.GetData(), Buff.GetData() ); msg.Printf( _( "Error item %s%s" ), cmpref.GetData(),
Buff.GetData() );
Buff.Printf( _( " unit %d and no more than %d parts" ), Buff.Printf( _( " unit %d and no more than %d parts" ),
ListeCmp[ii].m_Unit, ListeCmp[ii].m_NbParts ); ListeCmp[ii].m_Unit, ListeCmp[ii].m_NbParts );
@ -716,8 +698,9 @@ int CheckAnnotate( WinEDA_SchematicFrame* frame, bool OneSheetOnly )
msg.Empty(); msg.Empty();
Buff.Empty(); Buff.Empty();
if( (stricmp( ListeCmp[ii].m_TextRef, ListeCmp[ii + 1].m_TextRef ) != 0) if( (stricmp( ListeCmp[ii].m_TextRef,
|| ( ListeCmp[ii].m_NumRef != ListeCmp[ii + 1].m_NumRef ) ) ListeCmp[ii + 1].m_TextRef ) != 0)||
( ListeCmp[ii].m_NumRef != ListeCmp[ii + 1].m_NumRef ) )
continue; continue;
/* Same reference found */ /* Same reference found */
@ -732,7 +715,7 @@ int CheckAnnotate( WinEDA_SchematicFrame* frame, bool OneSheetOnly )
cmpref = CONV_FROM_UTF8( ListeCmp[ii].m_TextRef ); cmpref = CONV_FROM_UTF8( ListeCmp[ii].m_TextRef );
msg.Printf( _( "Multiple item %s%s" ), msg.Printf( _( "Multiple item %s%s" ),
cmpref.GetData(), Buff.GetData() ); cmpref.GetData(), Buff.GetData() );
if( (ListeCmp[ii].m_Unit > 0) && (ListeCmp[ii].m_Unit < 0x7FFFFFFF) ) if( (ListeCmp[ii].m_Unit > 0) && (ListeCmp[ii].m_Unit < 0x7FFFFFFF) )
{ {
@ -744,8 +727,8 @@ int CheckAnnotate( WinEDA_SchematicFrame* frame, bool OneSheetOnly )
continue; continue;
} }
/* Test error if units are different but number of parts per package too hight /* Test error if units are different but number of parts per package
* (ex U3 ( 1 part) and we find U3B the is an error) */ * too hight (ex U3 ( 1 part) and we find U3B the is an error) */
if( ListeCmp[ii].m_NbParts != ListeCmp[ii + 1].m_NbParts ) if( ListeCmp[ii].m_NbParts != ListeCmp[ii + 1].m_NbParts )
{ {
if( ListeCmp[ii].m_NumRef >= 0 ) if( ListeCmp[ii].m_NumRef >= 0 )
@ -754,7 +737,8 @@ int CheckAnnotate( WinEDA_SchematicFrame* frame, bool OneSheetOnly )
Buff = wxT( "?" ); Buff = wxT( "?" );
cmpref = CONV_FROM_UTF8( ListeCmp[ii].m_TextRef ); cmpref = CONV_FROM_UTF8( ListeCmp[ii].m_TextRef );
msg.Printf( _( "Multiple item %s%s" ), cmpref.GetData(), Buff.GetData() ); msg.Printf( _( "Multiple item %s%s" ),
cmpref.GetData(), Buff.GetData() );
if( (ListeCmp[ii].m_Unit > 0) && (ListeCmp[ii].m_Unit < 0x7FFFFFFF) ) if( (ListeCmp[ii].m_Unit > 0) && (ListeCmp[ii].m_Unit < 0x7FFFFFFF) )
{ {
@ -766,8 +750,9 @@ int CheckAnnotate( WinEDA_SchematicFrame* frame, bool OneSheetOnly )
error++; error++;
} }
/* Error if values are diff<66>rent between units, for the same reference */ /* Error if values are different between units, for the same reference */
if( stricmp( ListeCmp[ii].m_TextValue, ListeCmp[ii + 1].m_TextValue ) != 0 ) if( stricmp( ListeCmp[ii].m_TextValue,
ListeCmp[ii + 1].m_TextValue ) != 0 )
{ {
wxString nextcmpref, cmpvalue, nextcmpvalue; wxString nextcmpref, cmpvalue, nextcmpvalue;
cmpref = CONV_FROM_UTF8( ListeCmp[ii].m_TextRef ); cmpref = CONV_FROM_UTF8( ListeCmp[ii].m_TextRef );
@ -775,11 +760,13 @@ int CheckAnnotate( WinEDA_SchematicFrame* frame, bool OneSheetOnly )
cmpvalue = CONV_FROM_UTF8( ListeCmp[ii].m_TextValue ); cmpvalue = CONV_FROM_UTF8( ListeCmp[ii].m_TextValue );
nextcmpvalue = CONV_FROM_UTF8( ListeCmp[ii + 1].m_TextValue ); nextcmpvalue = CONV_FROM_UTF8( ListeCmp[ii + 1].m_TextValue );
msg.Printf( _( "Diff values for %s%d%c (%s) and %s%d%c (%s)" ), msg.Printf( _( "Diff values for %s%d%c (%s) and %s%d%c (%s)" ),
cmpref.GetData(), ListeCmp[ii].m_NumRef, ListeCmp[ii].m_Unit + 'A' - 1, cmpref.GetData(),
cmpvalue.GetData(), nextcmpref.GetData(), ListeCmp[ii].m_NumRef,
ListeCmp[ii + 1].m_NumRef, ListeCmp[ii].m_Unit + 'A' - 1,
ListeCmp[ii + 1].m_Unit + 'A' - 1, cmpvalue.GetData(), nextcmpref.GetData(),
nextcmpvalue.GetData() ); ListeCmp[ii + 1].m_NumRef,
ListeCmp[ii + 1].m_Unit + 'A' - 1,
nextcmpvalue.GetData() );
DisplayError( frame, msg ); DisplayError( frame, msg );
error++; error++;

View File

@ -1,17 +1,19 @@
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// Name: annotate_dialog.cpp // Name: annotate_dialog.cpp
// Purpose: // Purpose:
// Author: jean-pierre Charras // Author: jean-pierre Charras
// Modified by: // Modified by: Wayne Stambaugh
//
// Created: 05/02/2006 12:31:28 // Created: 05/02/2006 12:31:28
// RCS-ID: // Modified 02/21/2008 13:47:10
// RCS-ID:
// Copyright: License GNU // Copyright: License GNU
// Licence: // Licence:
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// Generated by DialogBlocks (unregistered), 05/02/2006 12:31:28
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #if defined (__GNUG__) && !defined (NO_GCC_PRAGMA)
#pragma implementation "annotate_dialog.h" #pragma implementation "annotate_dialog.h"
#endif #endif
@ -26,13 +28,15 @@
#include "wx/wx.h" #include "wx/wx.h"
#endif #endif
////@begin includes
////@end includes
#include "annotate_dialog.h" #include "annotate_dialog.h"
////@begin XPM images extern void DeleteAnnotation( WinEDA_SchematicFrame* parent,
////@end XPM images bool annotateSchematic );
extern void AnnotateComponents( WinEDA_SchematicFrame* parent,
bool annotateSchematic,
bool sortByPosition,
bool resetAnnotation );
/*! /*!
* WinEDA_AnnotateFrame type definition * WinEDA_AnnotateFrame type definition
@ -45,120 +49,170 @@ IMPLEMENT_DYNAMIC_CLASS( WinEDA_AnnotateFrame, wxDialog )
*/ */
BEGIN_EVENT_TABLE( WinEDA_AnnotateFrame, wxDialog ) BEGIN_EVENT_TABLE( WinEDA_AnnotateFrame, wxDialog )
EVT_BUTTON( wxID_CLEAR, WinEDA_AnnotateFrame::OnClear )
////@begin WinEDA_AnnotateFrame event table entries EVT_BUTTON( wxID_APPLY, WinEDA_AnnotateFrame::OnApply )
EVT_BUTTON( ID_ANNOTATE_CMP, WinEDA_AnnotateFrame::OnAnnotateCmpClick )
EVT_BUTTON( ID_DEANNOTATE_CMP, WinEDA_AnnotateFrame::OnDeannotateCmpClick )
EVT_BUTTON( wxID_CANCEL, WinEDA_AnnotateFrame::OnCancelClick )
////@end WinEDA_AnnotateFrame event table entries
END_EVENT_TABLE() END_EVENT_TABLE()
/*! /*!
* WinEDA_AnnotateFrame constructors * WinEDA_AnnotateFrame constructors
*/ */
WinEDA_AnnotateFrame::WinEDA_AnnotateFrame( ) WinEDA_AnnotateFrame::WinEDA_AnnotateFrame()
{ {
m_rbEntireSchematic = NULL;
m_cbResetAnnotation = NULL;
m_rbSortByPosition = NULL;
m_btnClear = NULL;
} }
WinEDA_AnnotateFrame::WinEDA_AnnotateFrame( WinEDA_SchematicFrame* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style )
WinEDA_AnnotateFrame::WinEDA_AnnotateFrame( WinEDA_SchematicFrame* parent,
wxWindowID id,
const wxString& caption,
const wxPoint& pos,
const wxSize& size,
long style )
{ {
m_Parent = parent; m_Parent = parent;
m_Abort = FALSE; Create( parent, id, caption, pos, size, style );
Create(parent, id, caption, pos, size, style);
m_AnnotNewCmpCtrl->SetSelection(1);
} }
/*! /*!
* WinEDA_AnnotateFrame creator * WinEDA_AnnotateFrame creator
*/ */
bool WinEDA_AnnotateFrame::Create( wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style ) bool WinEDA_AnnotateFrame::Create( wxWindow* parent,
wxWindowID id,
const wxString& caption,
const wxPoint& pos,
const wxSize& size,
long style )
{ {
////@begin WinEDA_AnnotateFrame member initialisation SetExtraStyle( wxWS_EX_BLOCK_EVENTS );
m_AnnotProjetCtrl = NULL;
m_AnnotNewCmpCtrl = NULL;
m_AnnotSortCmpCtrl = NULL;
////@end WinEDA_AnnotateFrame member initialisation
////@begin WinEDA_AnnotateFrame creation
SetExtraStyle(wxWS_EX_BLOCK_EVENTS);
wxDialog::Create( parent, id, caption, pos, size, style ); wxDialog::Create( parent, id, caption, pos, size, style );
CreateControls(); CreateControls();
if( GetSizer() ) if( GetSizer() )
{ {
GetSizer()->SetSizeHints(this); GetSizer()->SetSizeHints( this );
} }
Centre(); Centre();
////@end WinEDA_AnnotateFrame creation
return true; return true;
} }
/*! /*!
* Control creation for WinEDA_AnnotateFrame * Control creation for WinEDA_AnnotateFrame
*/ */
void WinEDA_AnnotateFrame::CreateControls() void WinEDA_AnnotateFrame::CreateControls()
{ {
SetFont(*g_DialogFont); wxFont fontBold = this->GetFont();
fontBold.SetWeight(wxFONTWEIGHT_BOLD);
////@begin WinEDA_AnnotateFrame content construction wxBoxSizer* sizerTop = new wxBoxSizer( wxVERTICAL );
// Generated by DialogBlocks, 07/11/2007 08:19:55 (unregistered)
WinEDA_AnnotateFrame* itemDialog1 = this; /* Sizer flags for setting up the spacing of the controls in the dialog
* box. These eventually should be moved to a file with a header in
* the common directory so all of the dialogs share the same layout
* spacing */
wxBoxSizer* itemBoxSizer2 = new wxBoxSizer(wxHORIZONTAL); /* Spacing for grouping labels in a dialog box. */
itemDialog1->SetSizer(itemBoxSizer2); wxSizerFlags flagsLabelSpacing( 0 );
flagsLabelSpacing.Align( wxALIGN_TOP | wxALIGN_LEFT );
flagsLabelSpacing.Border( wxLEFT | wxTOP, 6 );
wxBoxSizer* itemBoxSizer3 = new wxBoxSizer(wxVERTICAL); /* Spacing for grouping radio buttons inside the grouping sizer. */
itemBoxSizer2->Add(itemBoxSizer3, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxTOP|wxBOTTOM, 5); wxSizerFlags flagsRadioButtonSpacing( 0 );
flagsRadioButtonSpacing.Align( wxALIGN_LEFT );
flagsRadioButtonSpacing.Border( wxTOP | wxLEFT | wxRIGHT, 6 );
wxArrayString m_AnnotProjetCtrlStrings; /* Spacing for the radio button sizer inside the group sizer. */
m_AnnotProjetCtrlStrings.Add(_("Hierarchy")); wxSizerFlags flagsRadioButtonSizerSpacing( 0 );
m_AnnotProjetCtrlStrings.Add(_("Current sheet")); flagsRadioButtonSizerSpacing.Align( wxALIGN_TOP | wxALIGN_LEFT );
m_AnnotProjetCtrl = new wxRadioBox( itemDialog1, ID_RADIOBOX, _("annotate:"), wxDefaultPosition, wxDefaultSize, m_AnnotProjetCtrlStrings, 1, wxRA_SPECIFY_COLS ); flagsRadioButtonSizerSpacing.Border( wxLEFT, 20 );
m_AnnotProjetCtrl->SetSelection(0);
itemBoxSizer3->Add(m_AnnotProjetCtrl, 0, wxGROW|wxALL, 5);
wxArrayString m_AnnotNewCmpCtrlStrings; /* Spacing for the vertical group sizers. */
m_AnnotNewCmpCtrlStrings.Add(_("all components")); wxSizerFlags flagsGroupSizerSpacing( 1 );
m_AnnotNewCmpCtrlStrings.Add(_("new components only")); flagsGroupSizerSpacing.Align( wxALIGN_TOP | wxALIGN_LEFT );
m_AnnotNewCmpCtrl = new wxRadioBox( itemDialog1, ID_RADIOBOX1, _("select items:"), wxDefaultPosition, wxDefaultSize, m_AnnotNewCmpCtrlStrings, 1, wxRA_SPECIFY_COLS ); flagsGroupSizerSpacing.Border( wxTOP | wxLEFT | wxRIGHT, 12 );
m_AnnotNewCmpCtrl->SetSelection(0);
itemBoxSizer3->Add(m_AnnotNewCmpCtrl, 0, wxGROW|wxALL, 5);
wxArrayString m_AnnotSortCmpCtrlStrings; /* Spacing for dialog button sizer. */
m_AnnotSortCmpCtrlStrings.Add(_("by position")); wxSizerFlags flagsDialogButtonSizerSpacing( 0 );
m_AnnotSortCmpCtrlStrings.Add(_("by value")); flagsDialogButtonSizerSpacing.Border( wxALL, 12 );
m_AnnotSortCmpCtrl = new wxRadioBox( itemDialog1, ID_RADIOBOX2, _("sorting:"), wxDefaultPosition, wxDefaultSize, m_AnnotSortCmpCtrlStrings, 1, wxRA_SPECIFY_COLS );
m_AnnotSortCmpCtrl->SetSelection(0);
itemBoxSizer3->Add(m_AnnotSortCmpCtrl, 0, wxGROW|wxALL, 5);
wxBoxSizer* itemBoxSizer7 = new wxBoxSizer(wxVERTICAL); /* Spacing for the dialog buttons. */
itemBoxSizer2->Add(itemBoxSizer7, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5); wxSizerFlags flagsDialogButtonSpacing( 0 );
flagsDialogButtonSpacing.Border( wxLEFT | wxRIGHT, 3 );
wxButton* itemButton8 = new wxButton( itemDialog1, ID_ANNOTATE_CMP, _("&Annotate"), wxDefaultPosition, wxDefaultSize, 0 ); /* Annotate scope sizers, label, and radio buttons. */
itemButton8->SetDefault(); wxBoxSizer* sizerAnnotate = new wxBoxSizer( wxVERTICAL );
itemButton8->SetForegroundColour(wxColour(198, 0, 0)); wxStaticText* labelAnnotate = new wxStaticText( this, -1,
itemBoxSizer7->Add(itemButton8, 0, wxGROW|wxALL, 5); _( "Scope" ) );
labelAnnotate->SetFont( fontBold );
sizerAnnotate->Add( labelAnnotate, flagsLabelSpacing );
wxBoxSizer* sizerAnnotateItems = new wxBoxSizer( wxVERTICAL );
m_rbEntireSchematic =
new wxRadioButton( this, ID_ENTIRE_SCHEMATIC,
_( "Annotate the entire schematic" ),
wxDefaultPosition, wxDefaultSize, wxRB_GROUP );
wxRadioButton* rbCurrentPage =
new wxRadioButton( this, ID_CURRENT_PAGE,
_( "Annotate the current page only" ) );
m_rbEntireSchematic->SetValue( true );
m_cbResetAnnotation = new wxCheckBox( this, ID_RESET_ANNOTATION,
_( "Reset existing annotation" ) );
wxButton* itemButton9 = new wxButton( itemDialog1, ID_DEANNOTATE_CMP, _("&Del Annotate"), wxDefaultPosition, wxDefaultSize, 0 ); sizerAnnotateItems->Add( m_rbEntireSchematic, flagsRadioButtonSpacing );
itemButton9->SetForegroundColour(wxColour(0, 0, 230)); sizerAnnotateItems->Add( rbCurrentPage, flagsRadioButtonSpacing );
itemBoxSizer7->Add(itemButton9, 0, wxGROW|wxALL, 5); sizerAnnotateItems->Add( m_cbResetAnnotation, flagsRadioButtonSpacing );
sizerAnnotate->Add( sizerAnnotateItems, flagsRadioButtonSizerSpacing );
sizerTop->Add( sizerAnnotate, flagsGroupSizerSpacing );
wxButton* itemButton10 = new wxButton( itemDialog1, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); /* Annotation sort order sizers, label, and radio buttons. */
itemBoxSizer7->Add(itemButton10, 0, wxGROW|wxALL, 5); wxBoxSizer* sizerSort = new wxBoxSizer( wxVERTICAL );
wxStaticText* labelSort = new wxStaticText( this, wxID_ANY,
_( "Order" ) );
labelSort->SetFont( fontBold );
sizerSort->Add( labelSort, flagsLabelSpacing );
wxBoxSizer* sizerSortItems = new wxBoxSizer( wxVERTICAL );
m_rbSortByPosition = new wxRadioButton( this,
ID_SORT_BY_POSITION,
_( "Sort components by position" ),
wxDefaultPosition,
wxDefaultSize,
wxRB_GROUP );
wxRadioButton* rbSortByValue =
new wxRadioButton( this, ID_SORT_BY_VALUE,
_( "Sort components by value" ) );
sizerSortItems->Add( m_rbSortByPosition, flagsRadioButtonSpacing );
sizerSortItems->Add( rbSortByValue, flagsRadioButtonSpacing );
sizerSort->Add( sizerSortItems, flagsRadioButtonSizerSpacing );
sizerTop->Add( sizerSort, flagsGroupSizerSpacing );
////@end WinEDA_AnnotateFrame content construction /* Standard dialog buttons and sizer. */
wxBoxSizer* sizerDialogButtons = new wxBoxSizer( wxHORIZONTAL );
m_AnnotSortCmpCtrl->SetSelection(SortByPosition ? 0 : 1); wxButton* btnClose = new wxButton( this, wxID_CANCEL, _( "Close" ) );
/* TODO: Check if there is any existing annotation and enable/disable
* the clear button accordingly. Probably should also enable/
* disable new components radio button if all of the components
* are already annotated. Some low level work on the DrawSheetList
* class will need to be done to accomadate this.
*/
m_btnClear = new wxButton( this, wxID_CLEAR );
wxButton* btnApply = new wxButton( this, wxID_APPLY );
sizerDialogButtons->Add( btnClose, flagsDialogButtonSpacing );
sizerDialogButtons->Add( new wxBoxSizer( wxHORIZONTAL ),
wxSizerFlags( 1 ).Expand( ) );
sizerDialogButtons->Add( m_btnClear, flagsDialogButtonSpacing );
sizerDialogButtons->Add( btnApply, flagsDialogButtonSpacing );
sizerTop->Add( sizerDialogButtons, flagsDialogButtonSizerSpacing );
SetSizer( sizerTop );
} }
/*! /*!
* Should we show tooltips? * Should we show tooltips?
*/ */
@ -168,6 +222,7 @@ bool WinEDA_AnnotateFrame::ShowToolTips()
return true; return true;
} }
/*! /*!
* Get bitmap resources * Get bitmap resources
*/ */
@ -175,12 +230,11 @@ bool WinEDA_AnnotateFrame::ShowToolTips()
wxBitmap WinEDA_AnnotateFrame::GetBitmapResource( const wxString& name ) wxBitmap WinEDA_AnnotateFrame::GetBitmapResource( const wxString& name )
{ {
// Bitmap retrieval // Bitmap retrieval
////@begin WinEDA_AnnotateFrame bitmap retrieval wxUnusedVar( name );
wxUnusedVar(name);
return wxNullBitmap; return wxNullBitmap;
////@end WinEDA_AnnotateFrame bitmap retrieval
} }
/*! /*!
* Get icon resources * Get icon resources
*/ */
@ -188,34 +242,79 @@ wxBitmap WinEDA_AnnotateFrame::GetBitmapResource( const wxString& name )
wxIcon WinEDA_AnnotateFrame::GetIconResource( const wxString& name ) wxIcon WinEDA_AnnotateFrame::GetIconResource( const wxString& name )
{ {
// Icon retrieval // Icon retrieval
////@begin WinEDA_AnnotateFrame icon retrieval wxUnusedVar( name );
wxUnusedVar(name);
return wxNullIcon; return wxNullIcon;
////@end WinEDA_AnnotateFrame icon retrieval
} }
/*!
* wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_ANNOTATE_CMP
*/
void WinEDA_AnnotateFrame::OnAnnotateCmpClick( wxCommandEvent& event ) void WinEDA_AnnotateFrame::OnClear( wxCommandEvent& event )
{ {
AnnotateComponents(event); int response;
wxString message = _( "Clear the existing annotation for " );
if( GetLevel() )
message += _( "the entire schematic?" );
else
message += _( "the current sheet?" );
message += _( "\n\nThis operation will clear the existing annotation " \
"and cannot be undone." );
response = wxMessageBox( message, _( "" ),
wxICON_EXCLAMATION | wxOK | wxCANCEL );
if (response == wxCANCEL)
return;
DeleteAnnotation( m_Parent, GetLevel() );
m_btnClear->Enable(false);
} }
/*! void WinEDA_AnnotateFrame::OnApply( wxCommandEvent& event )
* wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_DEANNOTATE_CMP
*/
void WinEDA_AnnotateFrame::OnDeannotateCmpClick( wxCommandEvent& event )
{ {
DeleteAnnotation(event); int response;
wxButton* btn;
wxString message;
if( GetResetItems() )
message = _( "Clear and annotate all of the components " );
else
message = _( "Annotate only the unannotated components " );
if( GetLevel() )
message += _( "on the entire schematic?" );
else
message += _( "on the current sheet?" );
message += _( "\n\nThis operation will change the current annotation and " \
"cannot be undone." );
response = wxMessageBox( message, _( "" ),
wxICON_EXCLAMATION | wxOK | wxCANCEL );
if (response == wxCANCEL)
return;
AnnotateComponents( m_Parent, GetLevel(), GetSortOrder(),
GetResetItems() );
m_btnClear->Enable();
} }
/*! bool WinEDA_AnnotateFrame::GetLevel( void )
* wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_CANCEL
*/
void WinEDA_AnnotateFrame::OnCancelClick( wxCommandEvent& event )
{ {
EndModal( -1 ); wxASSERT_MSG( ((m_rbEntireSchematic != NULL) &&
m_rbEntireSchematic->IsKindOf( CLASSINFO( wxRadioButton ) )),
wxT( "m_rbEntireSchematic pointer was NULL." ) );
return m_rbEntireSchematic->GetValue();
}
bool WinEDA_AnnotateFrame::GetResetItems( void )
{
wxASSERT_MSG( (m_cbResetAnnotation != NULL) &&
m_cbResetAnnotation->IsKindOf( CLASSINFO( wxCheckBox ) ),
wxT( "m_cbResetAnnotation pointer was NULL." ) );
return m_cbResetAnnotation->IsChecked();
}
bool WinEDA_AnnotateFrame::GetSortOrder( void )
{
wxASSERT_MSG( (m_rbSortByPosition != NULL) &&
m_rbSortByPosition->IsKindOf( CLASSINFO( wxRadioButton ) ),
wxT( "m_rbSortByPosition pointer was NULL." ) );
return m_rbSortByPosition->GetValue();
} }

View File

@ -1,20 +1,20 @@
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// Name: annotate_dialog.h
// Purpose:
// Author: jean-pierre Charras
// Modified by:
// Created: 05/02/2006 12:31:28
// RCS-ID:
// Copyright: License GNU
// Licence:
/////////////////////////////////////////////////////////////////////////////
// Generated by DialogBlocks (unregistered), 05/02/2006 12:31:28 // Name: annotate_dialog.h
// Purpose:
// Author: jean-pierre Charras
// Modified by:
// Created: 05/02/2006 12:31:28
// RCS-ID:
// Copyright: License GNU
// Licence:
/////////////////////////////////////////////////////////////////////////////
#ifndef _ANNOTATE_DIALOG_H_ #ifndef _ANNOTATE_DIALOG_H_
#define _ANNOTATE_DIALOG_H_ #define _ANNOTATE_DIALOG_H_
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #if defined (__GNUG__) && !defined (NO_GCC_PRAGMA)
#pragma interface "annotate_dialog.h" #pragma interface "annotate_dialog.h"
#endif #endif
@ -22,39 +22,28 @@
* Includes * Includes
*/ */
////@begin includes
////@end includes
#include "fctsys.h" #include "fctsys.h"
#include "common.h" #include "common.h"
#include "program.h" #include "program.h"
#include "libcmp.h" #include "libcmp.h"
#include "general.h" #include "general.h"
/*!
* Forward declarations
*/
////@begin forward declarations
////@end forward declarations
/*! /*!
* Control identifiers * Control identifiers
*/ */
////@begin control identifiers #define ID_DIALOG 10000
#define ID_DIALOG 10000 #define ID_ENTIRE_SCHEMATIC 10001
#define ID_RADIOBOX 10001 #define ID_CURRENT_PAGE 10002
#define ID_RADIOBOX1 10002 #define ID_RESET_ANNOTATION 10003
#define ID_RADIOBOX2 10005 #define ID_SORT_BY_POSITION 10004
#define ID_ANNOTATE_CMP 10003 #define ID_SORT_BY_VALUE 10005
#define ID_DEANNOTATE_CMP 10004
#define SYMBOL_WINEDA_ANNOTATEFRAME_STYLE wxDEFAULT_DIALOG_STYLE|MAYBE_RESIZE_BORDER #define ANNOTATE_DIALOG_STYLE wxDEFAULT_DIALOG_STYLE | MAYBE_RESIZE_BORDER
#define SYMBOL_WINEDA_ANNOTATEFRAME_TITLE _("EESchema Annotation") #define ANNOTATE_DIALOG_TITLE _( "Annotate" )
#define SYMBOL_WINEDA_ANNOTATEFRAME_IDNAME ID_DIALOG
#define SYMBOL_WINEDA_ANNOTATEFRAME_SIZE wxSize(400, 300)
#define SYMBOL_WINEDA_ANNOTATEFRAME_POSITION wxDefaultPosition
////@end control identifiers
/*! /*!
* Compatibility * Compatibility
@ -68,60 +57,59 @@
* WinEDA_AnnotateFrame class declaration * WinEDA_AnnotateFrame class declaration
*/ */
class WinEDA_AnnotateFrame: public wxDialog class WinEDA_AnnotateFrame : public wxDialog
{ {
DECLARE_DYNAMIC_CLASS( WinEDA_AnnotateFrame ) DECLARE_DYNAMIC_CLASS( WinEDA_AnnotateFrame )
DECLARE_EVENT_TABLE()
public: public:
/// Constructors /// Constructors
WinEDA_AnnotateFrame( ); WinEDA_AnnotateFrame();
WinEDA_AnnotateFrame( WinEDA_SchematicFrame* parent, wxWindowID id = SYMBOL_WINEDA_ANNOTATEFRAME_IDNAME, const wxString& caption = SYMBOL_WINEDA_ANNOTATEFRAME_TITLE, const wxPoint& pos = SYMBOL_WINEDA_ANNOTATEFRAME_POSITION, const wxSize& size = SYMBOL_WINEDA_ANNOTATEFRAME_SIZE, long style = SYMBOL_WINEDA_ANNOTATEFRAME_STYLE ); WinEDA_AnnotateFrame( WinEDA_SchematicFrame* parent,
wxWindowID id = wxID_ANY,
const wxString& caption = ANNOTATE_DIALOG_TITLE,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = ANNOTATE_DIALOG_STYLE );
/// Creation /// Creation
bool Create( wxWindow* parent, wxWindowID id = SYMBOL_WINEDA_ANNOTATEFRAME_IDNAME, const wxString& caption = SYMBOL_WINEDA_ANNOTATEFRAME_TITLE, const wxPoint& pos = SYMBOL_WINEDA_ANNOTATEFRAME_POSITION, const wxSize& size = SYMBOL_WINEDA_ANNOTATEFRAME_SIZE, long style = SYMBOL_WINEDA_ANNOTATEFRAME_STYLE ); bool Create( wxWindow* parent,
wxWindowID id = wxID_ANY,
const wxString& caption = ANNOTATE_DIALOG_TITLE,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = ANNOTATE_DIALOG_STYLE );
/// Creates the controls and sizers /// Creates the controls and sizers
void CreateControls(); void CreateControls();
////@begin WinEDA_AnnotateFrame event handler declarations
/// wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_ANNOTATE_CMP
void OnAnnotateCmpClick( wxCommandEvent& event );
/// wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_DEANNOTATE_CMP
void OnDeannotateCmpClick( wxCommandEvent& event );
/// wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_CANCEL
void OnCancelClick( wxCommandEvent& event );
////@end WinEDA_AnnotateFrame event handler declarations
////@begin WinEDA_AnnotateFrame member function declarations
/// Retrieves bitmap resources /// Retrieves bitmap resources
wxBitmap GetBitmapResource( const wxString& name ); wxBitmap GetBitmapResource( const wxString& name );
/// Retrieves icon resources /// Retrieves icon resources
wxIcon GetIconResource( const wxString& name ); wxIcon GetIconResource( const wxString& name );
////@end WinEDA_AnnotateFrame member function declarations
bool GetLevel( void );
bool GetResetItems( void );
bool GetSortOrder( void );
/// Should we show tooltips? /// Should we show tooltips?
static bool ShowToolTips(); static bool ShowToolTips();
////@begin WinEDA_AnnotateFrame member variables WinEDA_SchematicFrame* m_Parent;
wxRadioBox* m_AnnotProjetCtrl;
wxRadioBox* m_AnnotNewCmpCtrl;
wxRadioBox* m_AnnotSortCmpCtrl;
////@end WinEDA_AnnotateFrame member variables
WinEDA_SchematicFrame * m_Parent;
bool m_Abort;
private: private:
void AnnotateComponents(wxCommandEvent& event); void OnClear( wxCommandEvent& event );
void DeleteAnnotation(wxCommandEvent& event); void OnApply( wxCommandEvent& event );
wxRadioButton* m_rbEntireSchematic;
wxRadioButton* m_rbSortByPosition;
wxCheckBox* m_cbResetAnnotation;
wxButton* m_btnClear;
DECLARE_EVENT_TABLE()
}; };
#endif #endif
// _ANNOTATE_DIALOG_H_
// _ANNOTATE_DIALOG_H_

View File

@ -2,6 +2,9 @@
/* GENERAL.H : declarations communes */ /* GENERAL.H : declarations communes */
/***************************************/ /***************************************/
#ifndef _GENERAL_H_
#define _GENERAL_H_
#ifndef eda_global #ifndef eda_global
#define eda_global extern #define eda_global extern
#endif #endif
@ -267,3 +270,5 @@ eda_global int g_PlotPSMinimunLineWidth; /* Minimum line (in EESCHEMA units) wid
/* Config keys */ /* Config keys */
#define MINI_DRAW_LINE_WIDTH_KEY wxT("MinimunDrawLineWidth") #define MINI_DRAW_LINE_WIDTH_KEY wxT("MinimunDrawLineWidth")
#define MINI_PLOTPS_LINE_WIDTH_KEY wxT("MinimunPlotPSLineWidth") #define MINI_PLOTPS_LINE_WIDTH_KEY wxT("MinimunPlotPSLineWidth")
#endif // _GENERAL_H_

View File

@ -300,7 +300,7 @@ void InstallNetlistFrame(WinEDA_SchematicFrame *parent, wxPoint &pos);
/***************/ /***************/
void ReAnnotatePowerSymbolsOnly(); void ReAnnotatePowerSymbolsOnly();
void InstallAnnotateFrame(WinEDA_SchematicFrame * parent, wxPoint &pos); void InstallAnnotateFrame(WinEDA_SchematicFrame * parent);
int CheckAnnotate(WinEDA_SchematicFrame * frame, bool OneSheetOnly); int CheckAnnotate(WinEDA_SchematicFrame * frame, bool OneSheetOnly);
/* Retourne le nombre de composants non annotes ou erron<6F>s /* Retourne le nombre de composants non annotes ou erron<6F>s
Si OneSheetOnly : recherche sur le schema courant Si OneSheetOnly : recherche sur le schema courant

View File

@ -15,9 +15,9 @@
#include "protos.h" #include "protos.h"
/********************************************************************************/ /*****************************************************************************/
void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
/********************************************************************************/ /*****************************************************************************/
/* Traite les selections d'outils et les commandes appelees du menu POPUP /* Traite les selections d'outils et les commandes appelees du menu POPUP
*/ */
@ -65,7 +65,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_POPUP_SCH_DISPLAYDOC_CMP: case ID_POPUP_SCH_DISPLAYDOC_CMP:
case ID_POPUP_SCH_EDIT_VALUE_CMP: case ID_POPUP_SCH_EDIT_VALUE_CMP:
case ID_POPUP_SCH_EDIT_REF_CMP: case ID_POPUP_SCH_EDIT_REF_CMP:
case ID_POPUP_SCH_EDIT_FOOTPRINT_CMP: case ID_POPUP_SCH_EDIT_FOOTPRINT_CMP:
case ID_POPUP_SCH_EDIT_CONVERT_CMP: case ID_POPUP_SCH_EDIT_CONVERT_CMP:
case ID_POPUP_SCH_SELECT_UNIT_CMP: case ID_POPUP_SCH_SELECT_UNIT_CMP:
case ID_POPUP_SCH_SELECT_UNIT1: case ID_POPUP_SCH_SELECT_UNIT1:
@ -115,20 +115,21 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
break; // Do nothing: break; // Do nothing:
case ID_POPUP_CANCEL_CURRENT_COMMAND: case ID_POPUP_CANCEL_CURRENT_COMMAND:
if( GetScreen()->BlockLocate.m_Command != BLOCK_IDLE ) if( GetScreen()->BlockLocate.m_Command != BLOCK_IDLE )
DrawPanel->SetCursor( wxCursor( DrawPanel->m_PanelCursor = DrawPanel-> DrawPanel->SetCursor( wxCursor( DrawPanel->m_PanelCursor =
m_PanelDefaultCursor ) ); DrawPanel->
m_PanelDefaultCursor ) );
if( DrawPanel->ManageCurseur && DrawPanel->ForceCloseManageCurseur ) if( DrawPanel->ManageCurseur && DrawPanel->ForceCloseManageCurseur )
{ {
DrawPanel->ForceCloseManageCurseur( DrawPanel, &dc ); DrawPanel->ForceCloseManageCurseur( DrawPanel, &dc );
} }
/* ne devrait pas etre execute, sauf bug: */ /* ne devrait pas etre execute, sauf bug: */
if( GetScreen()->BlockLocate.m_Command != BLOCK_IDLE ) if( GetScreen()->BlockLocate.m_Command != BLOCK_IDLE )
{ {
GetScreen()->BlockLocate.m_Command = BLOCK_IDLE; GetScreen()->BlockLocate.m_Command = BLOCK_IDLE;
GetScreen()->BlockLocate.m_State = STATE_NO_BLOCK; GetScreen()->BlockLocate.m_State = STATE_NO_BLOCK;
GetScreen()->BlockLocate.m_BlockDrawStruct = NULL; GetScreen()->BlockLocate.m_BlockDrawStruct = NULL;
} }
break; break;
@ -145,12 +146,13 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
{ {
DrawPanel->ForceCloseManageCurseur( DrawPanel, &dc ); DrawPanel->ForceCloseManageCurseur( DrawPanel, &dc );
} }
DrawPanel->m_PanelCursor = DrawPanel->m_PanelDefaultCursor = wxCURSOR_ARROW; DrawPanel->m_PanelCursor = DrawPanel->m_PanelDefaultCursor =
wxCURSOR_ARROW;
SetToolID( 0, DrawPanel->m_PanelCursor, wxEmptyString ); SetToolID( 0, DrawPanel->m_PanelCursor, wxEmptyString );
break; break;
} }
// End switch commande en cours // End switch commande en cours
switch( id ) // Command execution: switch( id ) // Command execution:
{ {
@ -167,7 +169,8 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
break; break;
case ID_LOAD_ONE_SHEET: case ID_LOAD_ONE_SHEET:
//how is this different from above?
//how is this different from above?
//LoadOneSheet( GetSheet(), wxEmptyString ); //LoadOneSheet( GetSheet(), wxEmptyString );
break; break;
@ -181,7 +184,8 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_LOAD_FILE_8: case ID_LOAD_FILE_8:
case ID_LOAD_FILE_9: case ID_LOAD_FILE_9:
case ID_LOAD_FILE_10: case ID_LOAD_FILE_10:
LoadOneEEProject( GetLastProject( id - ID_LOAD_FILE_1 ).GetData(), FALSE ); LoadOneEEProject( GetLastProject( id - ID_LOAD_FILE_1 ).GetData(
), FALSE );
break; break;
case ID_TO_LIBRARY: case ID_TO_LIBRARY:
@ -191,11 +195,12 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
} }
else else
{ {
m_Parent->m_LibeditFrame = new m_Parent->m_LibeditFrame =
WinEDA_LibeditFrame( m_Parent->m_SchematicFrame, new WinEDA_LibeditFrame( m_Parent->m_SchematicFrame,
m_Parent, m_Parent,
wxT( "Library Editor" ), wxT( "Library Editor" ),
wxPoint( -1, -1 ), wxSize( 600, 400 ) ); wxPoint( -1, -1 ),
wxSize( 600, 400 ) );
ActiveScreen = ScreenLib; ActiveScreen = ScreenLib;
m_Parent->m_LibeditFrame->AdjustScrollBars(); m_Parent->m_LibeditFrame->AdjustScrollBars();
} }
@ -219,9 +224,9 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_TO_CVPCB: case ID_TO_CVPCB:
{ {
wxString Line; wxString Line;
if( g_RootSheet->m_s->m_FileName != wxEmptyString ) if( g_RootSheet->m_s->m_FileName != wxEmptyString )
{ {
Line = g_RootSheet->m_s->m_FileName; Line = g_RootSheet->m_s->m_FileName;
AddDelimiterString( Line ); AddDelimiterString( Line );
ChangeFileNameExt( Line, wxEmptyString ); ChangeFileNameExt( Line, wxEmptyString );
ExecuteFile( this, CVPCB_EXE, Line ); ExecuteFile( this, CVPCB_EXE, Line );
@ -238,8 +243,9 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
} }
else else
{ {
m_Parent->m_ViewlibFrame = new m_Parent->m_ViewlibFrame =
WinEDA_ViewlibFrame( m_Parent->m_SchematicFrame, m_Parent ); new WinEDA_ViewlibFrame( m_Parent->m_SchematicFrame,
m_Parent );
m_Parent->m_ViewlibFrame->AdjustScrollBars(); m_Parent->m_ViewlibFrame->AdjustScrollBars();
} }
break; break;
@ -250,7 +256,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
break; break;
case wxID_CUT: case wxID_CUT:
if( GetScreen()->BlockLocate.m_Command != BLOCK_MOVE ) if( GetScreen()->BlockLocate.m_Command != BLOCK_MOVE )
break; break;
HandleBlockEndByPopUp( BLOCK_DELETE, &dc ); HandleBlockEndByPopUp( BLOCK_DELETE, &dc );
g_ItemToRepeat = NULL; g_ItemToRepeat = NULL;
@ -258,11 +264,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
case wxID_PASTE: case wxID_PASTE:
HandleBlockBegin( &dc, BLOCK_PASTE, GetScreen()->m_Curseur ); HandleBlockBegin( &dc, BLOCK_PASTE, GetScreen()->m_Curseur );
break;
case ID_GET_ANNOTATE:
InstallAnnotateFrame( this, defaultpos );
break; break;
case ID_GET_ERC: case ID_GET_ERC:
@ -312,10 +314,10 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_GLABEL_BUTT: case ID_GLABEL_BUTT:
SetToolID( id, wxCURSOR_PENCIL, _( "Add Global label" ) ); SetToolID( id, wxCURSOR_PENCIL, _( "Add Global label" ) );
break; break;
case ID_HIERLABEL_BUTT: case ID_HIERLABEL_BUTT:
SetToolID( id, wxCURSOR_PENCIL, _( "Add Hierarchal label" ) ); SetToolID( id, wxCURSOR_PENCIL, _( "Add Hierarchal label" ) );
break; break;
case ID_TEXT_COMMENT_BUTT: case ID_TEXT_COMMENT_BUTT:
SetToolID( id, wxCURSOR_PENCIL, _( "Add Text" ) ); SetToolID( id, wxCURSOR_PENCIL, _( "Add Text" ) );
@ -352,13 +354,13 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_POPUP_SCH_ENTRY_SELECT_SLASH: case ID_POPUP_SCH_ENTRY_SELECT_SLASH:
DrawPanel->MouseToCursorSchema(); DrawPanel->MouseToCursorSchema();
SetBusEntryShape( &dc, SetBusEntryShape( &dc,
(DrawBusEntryStruct*) GetScreen()->GetCurItem(), '/' ); (DrawBusEntryStruct*) GetScreen()->GetCurItem(), '/' );
break; break;
case ID_POPUP_SCH_ENTRY_SELECT_ANTISLASH: case ID_POPUP_SCH_ENTRY_SELECT_ANTISLASH:
DrawPanel->MouseToCursorSchema(); DrawPanel->MouseToCursorSchema();
SetBusEntryShape( &dc, SetBusEntryShape( &dc,
(DrawBusEntryStruct*) GetScreen()->GetCurItem(), '\\' ); (DrawBusEntryStruct*) GetScreen()->GetCurItem(), '\\' );
break; break;
case ID_NO_SELECT_BUTT: case ID_NO_SELECT_BUTT:
@ -376,36 +378,36 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
break; break;
case ID_POPUP_SCH_EDIT_TEXT: case ID_POPUP_SCH_EDIT_TEXT:
EditSchematicText((DrawTextStruct*) GetScreen()->GetCurItem(), &dc ); EditSchematicText( (DrawTextStruct*) GetScreen()->GetCurItem(), &dc );
break; break;
case ID_POPUP_SCH_ROTATE_TEXT: case ID_POPUP_SCH_ROTATE_TEXT:
DrawPanel->MouseToCursorSchema(); DrawPanel->MouseToCursorSchema();
ChangeTextOrient((DrawTextStruct*) GetScreen()->GetCurItem(), &dc ); ChangeTextOrient( (DrawTextStruct*) GetScreen()->GetCurItem(), &dc );
break; break;
case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_LABEL: case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_LABEL:
DrawPanel->MouseToCursorSchema(); DrawPanel->MouseToCursorSchema();
ConvertTextType( (DrawTextStruct*) GetScreen()->GetCurItem(), ConvertTextType( (DrawTextStruct*) GetScreen()->GetCurItem(),
&dc, DRAW_LABEL_STRUCT_TYPE ); &dc, DRAW_LABEL_STRUCT_TYPE );
break; break;
case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_GLABEL: case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_GLABEL:
DrawPanel->MouseToCursorSchema(); DrawPanel->MouseToCursorSchema();
ConvertTextType( (DrawTextStruct*) GetScreen()->GetCurItem(), ConvertTextType( (DrawTextStruct*) GetScreen()->GetCurItem(),
&dc, DRAW_GLOBAL_LABEL_STRUCT_TYPE ); &dc, DRAW_GLOBAL_LABEL_STRUCT_TYPE );
break; break;
case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_HLABEL: case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_HLABEL:
DrawPanel->MouseToCursorSchema(); DrawPanel->MouseToCursorSchema();
ConvertTextType( (DrawTextStruct*) GetScreen()->GetCurItem(), ConvertTextType( (DrawTextStruct*) GetScreen()->GetCurItem(),
&dc, DRAW_HIER_LABEL_STRUCT_TYPE ); &dc, DRAW_HIER_LABEL_STRUCT_TYPE );
break; break;
case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_COMMENT: case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_COMMENT:
DrawPanel->MouseToCursorSchema(); DrawPanel->MouseToCursorSchema();
ConvertTextType( (DrawTextStruct*) GetScreen()->GetCurItem(), ConvertTextType( (DrawTextStruct*) GetScreen()->GetCurItem(),
&dc, DRAW_TEXT_STRUCT_TYPE ); &dc, DRAW_TEXT_STRUCT_TYPE );
break; break;
case ID_POPUP_SCH_SET_SHAPE_TEXT: case ID_POPUP_SCH_SET_SHAPE_TEXT:
@ -415,50 +417,53 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_POPUP_SCH_ROTATE_FIELD: case ID_POPUP_SCH_ROTATE_FIELD:
DrawPanel->MouseToCursorSchema(); DrawPanel->MouseToCursorSchema();
RotateCmpField( (PartTextStruct*) GetScreen()->GetCurItem(), &dc ); RotateCmpField( (PartTextStruct*) GetScreen()->GetCurItem(), &dc );
break; break;
case ID_POPUP_SCH_EDIT_FIELD: case ID_POPUP_SCH_EDIT_FIELD:
EditCmpFieldText( (PartTextStruct*) GetScreen()->GetCurItem(), &dc ); EditCmpFieldText( (PartTextStruct*) GetScreen()->GetCurItem(), &dc );
break; break;
case ID_POPUP_SCH_DELETE_NODE: case ID_POPUP_SCH_DELETE_NODE:
case ID_POPUP_SCH_DELETE_CONNECTION: case ID_POPUP_SCH_DELETE_CONNECTION:
DrawPanel->MouseToCursorSchema(); DrawPanel->MouseToCursorSchema();
DeleteConnection( &dc, id == ID_POPUP_SCH_DELETE_CONNECTION ? TRUE : FALSE ); DeleteConnection( &dc,
id == ID_POPUP_SCH_DELETE_CONNECTION ? TRUE : FALSE );
GetScreen()->SetCurItem( NULL ); GetScreen()->SetCurItem( NULL );
g_ItemToRepeat = NULL; g_ItemToRepeat = NULL;
TestDanglingEnds( GetScreen()->EEDrawList, &dc ); TestDanglingEnds( GetScreen()->EEDrawList, &dc );
break; break;
case ID_POPUP_SCH_BREAK_WIRE: case ID_POPUP_SCH_BREAK_WIRE:
{ {
DrawPickedStruct* ListForUndo; DrawPickedStruct* ListForUndo;
DrawPanel->MouseToCursorSchema(); DrawPanel->MouseToCursorSchema();
ListForUndo = BreakSegment( (SCH_SCREEN*) GetScreen(), ListForUndo = BreakSegment( (SCH_SCREEN*) GetScreen(),
GetScreen()->m_Curseur, TRUE ); GetScreen()->m_Curseur, TRUE );
if( ListForUndo ) if( ListForUndo )
SaveCopyInUndoList( ListForUndo, IS_NEW | IS_CHANGED ); SaveCopyInUndoList( ListForUndo, IS_NEW | IS_CHANGED );
TestDanglingEnds( GetScreen()->EEDrawList, &dc ); TestDanglingEnds( GetScreen()->EEDrawList, &dc );
} }
break; break;
case ID_POPUP_SCH_DELETE_CMP: case ID_POPUP_SCH_DELETE_CMP:
if( GetScreen()->GetCurItem() == NULL ) if( GetScreen()->GetCurItem() == NULL )
break; break;
// Ensure the struct is a component (could be a struct of a component, like Field, text..) // Ensure the struct is a component (could be a struct of a
if( GetScreen()->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE ) // component, like Field, text..)
GetScreen()->SetCurItem( LocateSmallestComponent( (SCH_SCREEN*)GetScreen() ) ); if( GetScreen()->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE )
GetScreen()->SetCurItem( LocateSmallestComponent( (SCH_SCREEN*)
GetScreen() ) );
case ID_POPUP_SCH_DELETE: case ID_POPUP_SCH_DELETE:
if( GetScreen()->GetCurItem() == NULL ) if( GetScreen()->GetCurItem() == NULL )
break; break;
DeleteStruct( this->DrawPanel, &dc, GetScreen()->GetCurItem() ); DeleteStruct( this->DrawPanel, &dc, GetScreen()->GetCurItem() );
GetScreen()->SetCurItem( NULL ); GetScreen()->SetCurItem( NULL );
g_ItemToRepeat = NULL; g_ItemToRepeat = NULL;
TestDanglingEnds( GetScreen()->EEDrawList, &dc ); TestDanglingEnds( GetScreen()->EEDrawList, &dc );
GetScreen()->SetModify(); GetScreen()->SetModify();
break; break;
case ID_SCHEMATIC_DELETE_ITEM_BUTT: case ID_SCHEMATIC_DELETE_ITEM_BUTT:
@ -467,65 +472,76 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_POPUP_SCH_END_SHEET: case ID_POPUP_SCH_END_SHEET:
DrawPanel->MouseToCursorSchema(); DrawPanel->MouseToCursorSchema();
GetScreen()->GetCurItem()->Place( this, &dc ); GetScreen()->GetCurItem()->Place( this, &dc );
break; break;
case ID_POPUP_SCH_RESIZE_SHEET: case ID_POPUP_SCH_RESIZE_SHEET:
DrawPanel->MouseToCursorSchema(); DrawPanel->MouseToCursorSchema();
ReSizeSheet( (DrawSheetStruct*) ReSizeSheet( (DrawSheetStruct*)
GetScreen()->GetCurItem(), &dc ); GetScreen()->GetCurItem(), &dc );
TestDanglingEnds( GetScreen()->EEDrawList, &dc ); TestDanglingEnds( GetScreen()->EEDrawList, &dc );
break; break;
case ID_POPUP_SCH_EDIT_SHEET: case ID_POPUP_SCH_EDIT_SHEET:
EditSheet( (DrawSheetStruct*) EditSheet( (DrawSheetStruct*)
GetScreen()->GetCurItem(), &dc ); GetScreen()->GetCurItem(), &dc );
break; break;
case ID_POPUP_SCH_CLEANUP_SHEET: case ID_POPUP_SCH_CLEANUP_SHEET:
( (DrawSheetStruct*) ( (DrawSheetStruct*)
GetScreen()->GetCurItem() )->CleanupSheet( this, &dc ); GetScreen()->GetCurItem() )->CleanupSheet( this, &dc );
break; break;
case ID_POPUP_SCH_EDIT_PINSHEET: case ID_POPUP_SCH_EDIT_PINSHEET:
Edit_PinSheet( (DrawSheetLabelStruct*) Edit_PinSheet( (DrawSheetLabelStruct*)
GetScreen()->GetCurItem(), &dc ); GetScreen()->GetCurItem(), &dc );
break; break;
case ID_POPUP_SCH_MOVE_PINSHEET: case ID_POPUP_SCH_MOVE_PINSHEET:
DrawPanel->MouseToCursorSchema(); DrawPanel->MouseToCursorSchema();
StartMove_PinSheet( (DrawSheetLabelStruct*) StartMove_PinSheet( (DrawSheetLabelStruct*)
GetScreen()->GetCurItem(), &dc ); GetScreen()->GetCurItem(), &dc );
break; break;
case ID_POPUP_SCH_DRAG_CMP_REQUEST: case ID_POPUP_SCH_DRAG_CMP_REQUEST:
case ID_POPUP_SCH_MOVE_CMP_REQUEST: case ID_POPUP_SCH_MOVE_CMP_REQUEST:
// Ensure the struct is a component (could be a struct of a component, like Field, text..)
if( GetScreen()->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE ) // Ensure the struct is a component (could be a struct of a
GetScreen()->SetCurItem( LocateSmallestComponent( (SCH_SCREEN*)GetScreen() ) ); // component, like Field, text..)
if( GetScreen()->GetCurItem() == NULL ) if( GetScreen()->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE )
GetScreen()->SetCurItem( LocateSmallestComponent( (SCH_SCREEN*)
GetScreen() ) );
if( GetScreen()->GetCurItem() == NULL )
break; break;
case ID_POPUP_SCH_MOVE_ITEM_REQUEST: case ID_POPUP_SCH_MOVE_ITEM_REQUEST:
DrawPanel->MouseToCursorSchema(); DrawPanel->MouseToCursorSchema();
if ( id == ID_POPUP_SCH_DRAG_CMP_REQUEST ) if( id == ID_POPUP_SCH_DRAG_CMP_REQUEST )
{ // The easiest way to handle a drag component is simulate a block drag command {
if( GetScreen()->BlockLocate.m_State == STATE_NO_BLOCK ) // The easiest way to handle a drag component is simulate a
// block drag command
if( GetScreen()->BlockLocate.m_State == STATE_NO_BLOCK )
{ {
if( !HandleBlockBegin( &dc, BLOCK_DRAG, GetScreen()->m_Curseur ) ) break; if( !HandleBlockBegin( &dc, BLOCK_DRAG,
GetScreen()->m_Curseur ) )
break;
HandleBlockEnd( &dc ); HandleBlockEnd( &dc );
} }
} }
else Process_Move_Item( GetScreen()->GetCurItem(), &dc ); else
Process_Move_Item( GetScreen()->GetCurItem(), &dc );
break; break;
case ID_POPUP_SCH_EDIT_CMP: case ID_POPUP_SCH_EDIT_CMP:
// Ensure the struct is a component (could be a struct of a component, like Field, text..) // Ensure the struct is a component (could be a struct of a
if( GetScreen()->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE ) // component, like Field, text..)
GetScreen()->SetCurItem( LocateSmallestComponent( (SCH_SCREEN*)GetScreen() ) ); if( GetScreen()->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE )
if( GetScreen()->GetCurItem() == NULL ) GetScreen()->SetCurItem( LocateSmallestComponent( (SCH_SCREEN*)
GetScreen() ) );
if( GetScreen()->GetCurItem() == NULL )
break; break;
InstallCmpeditFrame( this, pos, InstallCmpeditFrame( this, pos,
(EDA_SchComponentStruct*) GetScreen()->GetCurItem() ); (EDA_SchComponentStruct*) GetScreen()->GetCurItem() );
break; break;
case ID_POPUP_SCH_MIROR_X_CMP: case ID_POPUP_SCH_MIROR_X_CMP:
@ -533,11 +549,12 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_POPUP_SCH_ROTATE_CMP_CLOCKWISE: case ID_POPUP_SCH_ROTATE_CMP_CLOCKWISE:
case ID_POPUP_SCH_ROTATE_CMP_COUNTERCLOCKWISE: case ID_POPUP_SCH_ROTATE_CMP_COUNTERCLOCKWISE:
case ID_POPUP_SCH_ORIENT_NORMAL_CMP: case ID_POPUP_SCH_ORIENT_NORMAL_CMP:
// Ensure the struct is a component (could be a struct of a
// Ensure the struct is a component (could be a struct of a component, like Field, text..) // component, like Field, text..)
if( GetScreen()->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE ) if( GetScreen()->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE )
GetScreen()->SetCurItem( LocateSmallestComponent( (SCH_SCREEN*)GetScreen() ) ); GetScreen()->SetCurItem( LocateSmallestComponent( (SCH_SCREEN*)
if( GetScreen()->GetCurItem() == NULL ) GetScreen() ) );
if( GetScreen()->GetCurItem() == NULL )
break; break;
{ {
int option; int option;
@ -576,9 +593,11 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_POPUP_SCH_EDIT_VALUE_CMP: case ID_POPUP_SCH_EDIT_VALUE_CMP:
// Ensure the struct is a component (could be a struct of a component, like Field, text..) // Ensure the struct is a component (could be a struct of a
// component, like Field, text..)
if( GetScreen()->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE ) if( GetScreen()->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE )
GetScreen()->SetCurItem( LocateSmallestComponent( (SCH_SCREEN*)GetScreen() ) ); GetScreen()->SetCurItem( LocateSmallestComponent( (SCH_SCREEN*)
GetScreen() ) );
if( GetScreen()->GetCurItem() == NULL ) if( GetScreen()->GetCurItem() == NULL )
break; break;
EditComponentValue( EditComponentValue(
@ -586,33 +605,36 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
break; break;
case ID_POPUP_SCH_EDIT_REF_CMP: case ID_POPUP_SCH_EDIT_REF_CMP:
// Ensure the struct is a component (could be a struct of a
// Ensure the struct is a component (could be a struct of a component, like Field, text..) // component, like Field, text..)
if( GetScreen()->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE ) if( GetScreen()->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE )
GetScreen()->SetCurItem( LocateSmallestComponent( (SCH_SCREEN*)GetScreen() ) ); GetScreen()->SetCurItem( LocateSmallestComponent( (SCH_SCREEN*)
GetScreen() ) );
if( GetScreen()->GetCurItem() == NULL ) if( GetScreen()->GetCurItem() == NULL )
break; break;
EditComponentReference( EditComponentReference(
(EDA_SchComponentStruct*) GetScreen()->GetCurItem(), &dc ); (EDA_SchComponentStruct*) GetScreen()->GetCurItem(), &dc );
break; break;
case ID_POPUP_SCH_EDIT_FOOTPRINT_CMP:
// Ensure the struct is a component (could be a struct of a component, like Field, text..) case ID_POPUP_SCH_EDIT_FOOTPRINT_CMP:
// Ensure the struct is a component (could be a struct of a
// component, like Field, text..)
if( GetScreen()->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE ) if( GetScreen()->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE )
GetScreen()->SetCurItem( LocateSmallestComponent( (SCH_SCREEN*)GetScreen() ) ); GetScreen()->SetCurItem( LocateSmallestComponent( (SCH_SCREEN*)
GetScreen() ) );
if( GetScreen()->GetCurItem() == NULL ) if( GetScreen()->GetCurItem() == NULL )
break; break;
EditComponentFootprint( EditComponentFootprint(
(EDA_SchComponentStruct*) GetScreen()->GetCurItem(), &dc ); (EDA_SchComponentStruct*) GetScreen()->GetCurItem(), &dc );
break; break;
case ID_POPUP_SCH_EDIT_CONVERT_CMP:
// Ensure the struct is a component (could be a struct of a component, like Field, text..) case ID_POPUP_SCH_EDIT_CONVERT_CMP:
// Ensure the struct is a component (could be a struct of a
// component, like Field, text..)
if( GetScreen()->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE ) if( GetScreen()->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE )
GetScreen()->SetCurItem( LocateSmallestComponent( (SCH_SCREEN*)GetScreen() ) ); GetScreen()->SetCurItem( LocateSmallestComponent( (SCH_SCREEN*)
GetScreen() ) );
if( GetScreen()->GetCurItem() == NULL ) if( GetScreen()->GetCurItem() == NULL )
break; break;
DrawPanel->MouseToCursorSchema(); DrawPanel->MouseToCursorSchema();
@ -626,16 +648,18 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
{ {
EDA_SchComponentStruct* olditem, * newitem; EDA_SchComponentStruct* olditem, * newitem;
if( GetScreen()->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE ) if( GetScreen()->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE )
GetScreen()->SetCurItem( LocateSmallestComponent( (SCH_SCREEN*)GetScreen() ) ); GetScreen()->SetCurItem( LocateSmallestComponent( (SCH_SCREEN*)
GetScreen() ) );
olditem = (EDA_SchComponentStruct*) GetScreen()->GetCurItem(); olditem = (EDA_SchComponentStruct*) GetScreen()->GetCurItem();
if( olditem == NULL ) if( olditem == NULL )
break; break;
newitem = olditem->GenCopy(); newitem = olditem->GenCopy();
newitem->m_TimeStamp = GetTimeStamp(); newitem->m_TimeStamp = GetTimeStamp();
newitem->ClearAnnotation(); newitem->ClearAnnotation();
newitem->m_Flags = IS_NEW; newitem->m_Flags = IS_NEW;
StartMovePart( newitem, &dc ); StartMovePart( newitem, &dc );
/* Redraw the original part, because StartMovePart() has erase it from screen */ /* Redraw the original part, because StartMovePart() has erase
* it from screen */
RedrawOneStruct( DrawPanel, &dc, olditem, GR_DEFAULT_DRAWMODE ); RedrawOneStruct( DrawPanel, &dc, olditem, GR_DEFAULT_DRAWMODE );
} }
break; break;
@ -666,10 +690,11 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_POPUP_SCH_SELECT_UNIT24: case ID_POPUP_SCH_SELECT_UNIT24:
case ID_POPUP_SCH_SELECT_UNIT25: case ID_POPUP_SCH_SELECT_UNIT25:
case ID_POPUP_SCH_SELECT_UNIT26: case ID_POPUP_SCH_SELECT_UNIT26:
// Ensure the struct is a component (could be a struct of a
// Ensure the struct is a component (could be a struct of a component, like Field, text..) // component, like Field, text..)
if( GetScreen()->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE ) if( GetScreen()->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE )
GetScreen()->SetCurItem( LocateSmallestComponent( (SCH_SCREEN*)GetScreen() ) ); GetScreen()->SetCurItem( LocateSmallestComponent( (SCH_SCREEN*)
GetScreen() ) );
if( GetScreen()->GetCurItem() == NULL ) if( GetScreen()->GetCurItem() == NULL )
break; break;
DrawPanel->MouseToCursorSchema(); DrawPanel->MouseToCursorSchema();
@ -680,19 +705,23 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
break; break;
case ID_POPUP_SCH_DISPLAYDOC_CMP: case ID_POPUP_SCH_DISPLAYDOC_CMP:
// Ensure the struct is a component (could be a piece of a
// Ensure the struct is a component (could be a piece of a component, like Field, text..) // component, like Field, text..)
if( GetScreen()->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE ) if( GetScreen()->GetCurItem()->Type() != DRAW_LIB_ITEM_STRUCT_TYPE )
GetScreen()->SetCurItem( LocateSmallestComponent( (SCH_SCREEN*)GetScreen() ) ); GetScreen()->SetCurItem( LocateSmallestComponent( (SCH_SCREEN*)
GetScreen() ) );
if( GetScreen()->GetCurItem() == NULL ) if( GetScreen()->GetCurItem() == NULL )
break; break;
{ {
EDA_LibComponentStruct* LibEntry; EDA_LibComponentStruct* LibEntry;
LibEntry = FindLibPart( ( (EDA_SchComponentStruct*) LibEntry = FindLibPart(
GetScreen()->GetCurItem() )->m_ChipName, ( (EDA_SchComponentStruct*) GetScreen()->GetCurItem() )->m_ChipName,
wxEmptyString, FIND_ALIAS ); wxEmptyString,
FIND_ALIAS );
if( LibEntry && LibEntry->m_DocFile != wxEmptyString ) if( LibEntry && LibEntry->m_DocFile != wxEmptyString )
GetAssociatedDocument( this, g_RealLibDirBuffer, LibEntry->m_DocFile ); GetAssociatedDocument( this,
g_RealLibDirBuffer,
LibEntry->m_DocFile );
} }
break; break;
@ -764,9 +793,10 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
case ID_POPUP_SCH_ADD_LABEL: case ID_POPUP_SCH_ADD_LABEL:
case ID_POPUP_SCH_ADD_GLABEL: case ID_POPUP_SCH_ADD_GLABEL:
GetScreen()->SetCurItem( CreateNewText( &dc, GetScreen()->SetCurItem(
id == ID_POPUP_SCH_ADD_LABEL ? CreateNewText( &dc,
LAYER_LOCLABEL : LAYER_GLOBLABEL ) ); id == ID_POPUP_SCH_ADD_LABEL ?
LAYER_LOCLABEL : LAYER_GLOBLABEL ) );
if( GetScreen()->GetCurItem() ) if( GetScreen()->GetCurItem() )
{ {
GetScreen()->GetCurItem()->Place( this, &dc ); GetScreen()->GetCurItem()->Place( this, &dc );
@ -776,21 +806,24 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
break; break;
case ID_SCHEMATIC_UNDO: case ID_SCHEMATIC_UNDO:
if ( GetSchematicFromUndoList() ) if( GetSchematicFromUndoList() )
DrawPanel->Refresh( TRUE ); DrawPanel->Refresh( TRUE );
break; break;
case ID_SCHEMATIC_REDO: case ID_SCHEMATIC_REDO:
if ( GetSchematicFromRedoList() ) if( GetSchematicFromRedoList() )
DrawPanel->Refresh( TRUE ); DrawPanel->Refresh( TRUE );
break; break;
default: // Log error: default: // Log error:
DisplayError( this, wxT( "WinEDA_SchematicFrame::Process_Special_Functions error" ) ); DisplayError( this,
wxT( "WinEDA_SchematicFrame::Process_Special_Functions error" ) );
break; break;
} }
// End switch ( id ) (Command execution) // End switch ( id ) (Command execution)
if( m_ID_current_state == 0 ) if( m_ID_current_state == 0 )
g_ItemToRepeat = NULL; g_ItemToRepeat = NULL;
@ -801,10 +834,8 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event )
} }
/********************************************************************************/
void WinEDA_SchematicFrame::Process_Move_Item( EDA_BaseStruct* DrawStruct, void WinEDA_SchematicFrame::Process_Move_Item( EDA_BaseStruct* DrawStruct,
wxDC* DC ) wxDC* DC )
/********************************************************************************/
{ {
if( DrawStruct == NULL ) if( DrawStruct == NULL )
return; return;
@ -822,7 +853,7 @@ void WinEDA_SchematicFrame::Process_Move_Item( EDA_BaseStruct* DrawStruct,
case DRAW_LABEL_STRUCT_TYPE: case DRAW_LABEL_STRUCT_TYPE:
case DRAW_GLOBAL_LABEL_STRUCT_TYPE: case DRAW_GLOBAL_LABEL_STRUCT_TYPE:
case DRAW_HIER_LABEL_STRUCT_TYPE: case DRAW_HIER_LABEL_STRUCT_TYPE:
case DRAW_TEXT_STRUCT_TYPE: case DRAW_TEXT_STRUCT_TYPE:
StartMoveTexte( (DrawTextStruct*) DrawStruct, DC ); StartMoveTexte( (DrawTextStruct*) DrawStruct, DC );
break; break;

View File

@ -1,6 +1,6 @@
/******************************************************************/ /******************************************************************/
/* schframe.cpp - fonctions des classes du type WinEDA_DrawFrame */ /* schframe.cpp - fonctions des classes du type WinEDA_DrawFrame */
/******************************************************************/ /******************************************************************/
#ifdef __GNUG__ #ifdef __GNUG__
#pragma implementation #pragma implementation
@ -17,354 +17,403 @@
#include "protos.h" #include "protos.h"
#include "id.h" #include "id.h"
#include "annotate_dialog.h"
/*******************************/ /*******************************/
/* class WinEDA_SchematicFrame */ /* class WinEDA_SchematicFrame */
/*******************************/ /*******************************/
BEGIN_EVENT_TABLE(WinEDA_SchematicFrame, wxFrame) BEGIN_EVENT_TABLE( WinEDA_SchematicFrame, wxFrame )
COMMON_EVENTS_DRAWFRAME COMMON_EVENTS_DRAWFRAME EVT_SOCKET( ID_EDA_SOCKET_EVENT_SERV,
WinEDA_DrawFrame::OnSockRequestServer )
EVT_SOCKET( ID_EDA_SOCKET_EVENT, WinEDA_DrawFrame::OnSockRequest )
EVT_SOCKET(ID_EDA_SOCKET_EVENT_SERV, WinEDA_DrawFrame::OnSockRequestServer) EVT_CLOSE( WinEDA_SchematicFrame::OnCloseWindow )
EVT_SOCKET(ID_EDA_SOCKET_EVENT, WinEDA_DrawFrame::OnSockRequest) EVT_SIZE( WinEDA_SchematicFrame::OnSize )
EVT_CLOSE(WinEDA_SchematicFrame::OnCloseWindow) EVT_MENU_RANGE( ID_LOAD_PROJECT, ID_LOAD_FILE_10,
EVT_SIZE(WinEDA_SchematicFrame::OnSize) WinEDA_SchematicFrame::Process_Special_Functions )
EVT_MENU_RANGE(ID_LOAD_PROJECT,ID_LOAD_FILE_10, EVT_TOOL( ID_NEW_PROJECT, WinEDA_SchematicFrame::Process_Special_Functions )
WinEDA_SchematicFrame::Process_Special_Functions) EVT_TOOL( ID_LOAD_PROJECT, WinEDA_SchematicFrame::Process_Special_Functions )
EVT_TOOL_RANGE( ID_SCHEMATIC_MAIN_TOOLBAR_START,
ID_SCHEMATIC_MAIN_TOOLBAR_END,
WinEDA_SchematicFrame::Process_Special_Functions )
EVT_TOOL(ID_NEW_PROJECT, WinEDA_SchematicFrame::Process_Special_Functions) EVT_MENU_RANGE( ID_PREFERENCES_FONT_INFOSCREEN, ID_PREFERENCES_FONT_END,
EVT_TOOL(ID_LOAD_PROJECT, WinEDA_SchematicFrame::Process_Special_Functions) WinEDA_DrawFrame::ProcessFontPreferences )
EVT_TOOL_RANGE(ID_SCHEMATIC_MAIN_TOOLBAR_START, ID_SCHEMATIC_MAIN_TOOLBAR_END,
WinEDA_SchematicFrame::Process_Special_Functions)
EVT_MENU( ID_SAVE_PROJECT, WinEDA_SchematicFrame::Save_File )
EVT_MENU( ID_SAVE_ONE_SHEET, WinEDA_SchematicFrame::Save_File )
EVT_MENU( ID_SAVE_ONE_SHEET_AS, WinEDA_SchematicFrame::Save_File )
EVT_TOOL( ID_SAVE_PROJECT, WinEDA_SchematicFrame::Save_File )
EVT_MENU( ID_GEN_PRINT, WinEDA_SchematicFrame::ToPrinter )
EVT_MENU( ID_GEN_PLOT_PS, WinEDA_SchematicFrame::ToPlot_PS )
EVT_MENU( ID_GEN_PLOT_HPGL, WinEDA_SchematicFrame::ToPlot_HPGL )
EVT_MENU( ID_GEN_PLOT_SVG, WinEDA_DrawFrame::SVG_Print )
EVT_MENU( ID_GEN_COPY_SHEET_TO_CLIPBOARD, WinEDA_DrawFrame::CopyToClipboard )
EVT_MENU( ID_GEN_COPY_BLOCK_TO_CLIPBOARD, WinEDA_DrawFrame::CopyToClipboard )
EVT_MENU( ID_EXIT, WinEDA_SchematicFrame::Process_Special_Functions )
EVT_MENU_RANGE(ID_PREFERENCES_FONT_INFOSCREEN, ID_PREFERENCES_FONT_END, EVT_MENU_RANGE( ID_CONFIG_AND_PREFERENCES_START,
WinEDA_DrawFrame::ProcessFontPreferences) ID_CONFIG_AND_PREFERENCES_END,
WinEDA_SchematicFrame::Process_Config )
EVT_TOOL( ID_COLORS_SETUP, WinEDA_SchematicFrame::Process_Config )
EVT_TOOL( ID_OPTIONS_SETUP, WinEDA_SchematicFrame::Process_Config )
EVT_MENU(ID_SAVE_PROJECT, WinEDA_SchematicFrame::Save_File) EVT_MENU_RANGE( ID_LANGUAGE_CHOICE, ID_LANGUAGE_CHOICE_END,
EVT_MENU(ID_SAVE_ONE_SHEET, WinEDA_SchematicFrame::Save_File) WinEDA_DrawFrame::SetLanguage )
EVT_MENU(ID_SAVE_ONE_SHEET_AS, WinEDA_SchematicFrame::Save_File)
EVT_TOOL(ID_SAVE_PROJECT, WinEDA_SchematicFrame::Save_File)
EVT_MENU(ID_GEN_PRINT, WinEDA_SchematicFrame::ToPrinter)
EVT_MENU(ID_GEN_PLOT_PS, WinEDA_SchematicFrame::ToPlot_PS)
EVT_MENU(ID_GEN_PLOT_HPGL, WinEDA_SchematicFrame::ToPlot_HPGL)
EVT_MENU(ID_GEN_PLOT_SVG, WinEDA_DrawFrame::SVG_Print)
EVT_MENU(ID_GEN_COPY_SHEET_TO_CLIPBOARD, WinEDA_DrawFrame::CopyToClipboard)
EVT_MENU(ID_GEN_COPY_BLOCK_TO_CLIPBOARD, WinEDA_DrawFrame::CopyToClipboard)
EVT_MENU(ID_EXIT, WinEDA_SchematicFrame::Process_Special_Functions)
EVT_MENU_RANGE(ID_CONFIG_AND_PREFERENCES_START, ID_CONFIG_AND_PREFERENCES_END, WinEDA_SchematicFrame::Process_Config) EVT_TOOL_RANGE( ID_ZOOM_IN_BUTT, ID_ZOOM_PAGE_BUTT,
EVT_TOOL(ID_COLORS_SETUP, WinEDA_SchematicFrame::Process_Config) WinEDA_SchematicFrame::Process_Zoom )
EVT_TOOL(ID_OPTIONS_SETUP, WinEDA_SchematicFrame::Process_Config)
EVT_MENU_RANGE(ID_LANGUAGE_CHOICE, ID_LANGUAGE_CHOICE_END, EVT_TOOL( ID_NEW_PROJECT, WinEDA_SchematicFrame::Process_Special_Functions )
WinEDA_DrawFrame::SetLanguage) EVT_TOOL( ID_LOAD_PROJECT, WinEDA_SchematicFrame::Process_Special_Functions )
EVT_TOOL_RANGE(ID_ZOOM_IN_BUTT, ID_ZOOM_PAGE_BUTT, EVT_TOOL( ID_TO_LIBRARY, WinEDA_SchematicFrame::Process_Special_Functions )
WinEDA_SchematicFrame::Process_Zoom) EVT_TOOL( ID_TO_LIBVIEW, WinEDA_SchematicFrame::Process_Special_Functions )
EVT_TOOL(ID_NEW_PROJECT, WinEDA_SchematicFrame::Process_Special_Functions) EVT_TOOL( ID_TO_PCB, WinEDA_SchematicFrame::Process_Special_Functions )
EVT_TOOL(ID_LOAD_PROJECT, WinEDA_SchematicFrame::Process_Special_Functions) EVT_TOOL( ID_TO_CVPCB, WinEDA_SchematicFrame::Process_Special_Functions )
EVT_TOOL(ID_TO_LIBRARY, WinEDA_SchematicFrame::Process_Special_Functions) EVT_TOOL( ID_SHEET_SET, WinEDA_DrawFrame::Process_PageSettings )
EVT_TOOL(ID_TO_LIBVIEW, WinEDA_SchematicFrame::Process_Special_Functions) EVT_TOOL( ID_HIERARCHY, WinEDA_SchematicFrame::Process_Special_Functions )
EVT_TOOL( wxID_CUT, WinEDA_SchematicFrame::Process_Special_Functions )
EVT_TOOL( wxID_COPY, WinEDA_SchematicFrame::Process_Special_Functions )
EVT_TOOL( wxID_PASTE, WinEDA_SchematicFrame::Process_Special_Functions )
EVT_TOOL( ID_UNDO_BUTT, WinEDA_SchematicFrame::Process_Special_Functions )
EVT_TOOL( ID_GET_ANNOTATE, WinEDA_SchematicFrame::OnAnnotate )
EVT_TOOL( ID_GEN_PRINT, WinEDA_SchematicFrame::ToPrinter )
EVT_TOOL_RANGE( ID_GET_ERC, ID_FIND_ITEMS,
WinEDA_SchematicFrame::Process_Special_Functions )
EVT_TOOL(ID_TO_PCB, WinEDA_SchematicFrame::Process_Special_Functions) EVT_MENU( ID_GENERAL_HELP, WinEDA_DrawFrame::GetKicadHelp )
EVT_TOOL(ID_TO_CVPCB, WinEDA_SchematicFrame::Process_Special_Functions) EVT_MENU( ID_KICAD_ABOUT, WinEDA_DrawFrame::GetKicadAbout )
EVT_TOOL(ID_SHEET_SET, WinEDA_DrawFrame::Process_PageSettings) // Tools et boutons de Schematique, Vertical toolbar:
EVT_TOOL(ID_HIERARCHY, WinEDA_SchematicFrame::Process_Special_Functions) EVT_TOOL_RANGE( ID_SCHEMATIC_VERTICAL_TOOLBAR_START,
EVT_TOOL(wxID_CUT, WinEDA_SchematicFrame::Process_Special_Functions) ID_SCHEMATIC_VERTICAL_TOOLBAR_END,
EVT_TOOL(wxID_COPY, WinEDA_SchematicFrame::Process_Special_Functions) WinEDA_SchematicFrame::Process_Special_Functions )
EVT_TOOL(wxID_PASTE, WinEDA_SchematicFrame::Process_Special_Functions)
EVT_TOOL(ID_UNDO_BUTT, WinEDA_SchematicFrame::Process_Special_Functions)
EVT_TOOL(ID_GEN_PRINT, WinEDA_SchematicFrame::ToPrinter)
EVT_TOOL_RANGE(ID_GET_ANNOTATE,ID_FIND_ITEMS,
WinEDA_SchematicFrame::Process_Special_Functions)
EVT_MENU(ID_GENERAL_HELP, WinEDA_DrawFrame::GetKicadHelp) EVT_TOOL_RCLICKED( ID_LABEL_BUTT, WinEDA_SchematicFrame::ToolOnRightClick )
EVT_MENU(ID_KICAD_ABOUT, WinEDA_DrawFrame::GetKicadAbout) EVT_TOOL_RCLICKED( ID_GLABEL_BUTT, WinEDA_SchematicFrame::ToolOnRightClick )
EVT_TOOL_RCLICKED( ID_HIERLABEL_BUTT,
WinEDA_SchematicFrame::ToolOnRightClick )
// Tools et boutons de Schematique, Vertical toolbar: EVT_MENU_RANGE( ID_POPUP_START_RANGE, ID_POPUP_END_RANGE,
EVT_TOOL_RANGE(ID_SCHEMATIC_VERTICAL_TOOLBAR_START, WinEDA_SchematicFrame::Process_Special_Functions )
ID_SCHEMATIC_VERTICAL_TOOLBAR_END,
WinEDA_SchematicFrame::Process_Special_Functions)
EVT_TOOL_RCLICKED(ID_LABEL_BUTT, WinEDA_SchematicFrame::ToolOnRightClick) // Tools et boutons de Schematique, Options toolbar:
EVT_TOOL_RCLICKED(ID_GLABEL_BUTT, WinEDA_SchematicFrame::ToolOnRightClick) EVT_TOOL_RANGE( ID_TB_OPTIONS_START, ID_TB_OPTIONS_END,
EVT_TOOL_RCLICKED(ID_HIERLABEL_BUTT, WinEDA_SchematicFrame::ToolOnRightClick) WinEDA_SchematicFrame::OnSelectOptionToolbar )
EVT_MENU_RANGE(ID_POPUP_START_RANGE, ID_POPUP_END_RANGE, EVT_MENU_RANGE( ID_POPUP_GENERAL_START_RANGE, ID_POPUP_GENERAL_END_RANGE,
WinEDA_SchematicFrame::Process_Special_Functions ) WinEDA_SchematicFrame::Process_Special_Functions )
// Tools et boutons de Schematique, Options toolbar:
EVT_TOOL_RANGE(ID_TB_OPTIONS_START,ID_TB_OPTIONS_END,
WinEDA_SchematicFrame::OnSelectOptionToolbar)
EVT_MENU_RANGE(ID_POPUP_GENERAL_START_RANGE, ID_POPUP_GENERAL_END_RANGE,
WinEDA_SchematicFrame::Process_Special_Functions )
END_EVENT_TABLE() END_EVENT_TABLE()
/****************/
/* Constructor */
/****************/
WinEDA_SchematicFrame::WinEDA_SchematicFrame( wxWindow* father,
/****************/ WinEDA_App* parent,
/* Constructor */ const wxString& title,
/****************/ const wxPoint& pos,
const wxSize& size,
WinEDA_SchematicFrame::WinEDA_SchematicFrame(wxWindow * father, WinEDA_App *parent, long style ) :
const wxString & title, const wxPoint& pos, const wxSize& size, long style) : WinEDA_DrawFrame( father, SCHEMATIC_FRAME, parent, title, pos, size, style )
WinEDA_DrawFrame(father, SCHEMATIC_FRAME, parent, title, pos, size, style)
{ {
m_FrameName = wxT("SchematicFrame"); m_FrameName = wxT( "SchematicFrame" );
m_AboutTitle = g_EeschemaAboutTitle; m_AboutTitle = g_EeschemaAboutTitle;
m_Draw_Axis = FALSE; // TRUE to show axis m_Draw_Axis = FALSE; // TRUE to show axis
m_Draw_Grid = g_ShowGrid; // TRUE to show a grid m_Draw_Grid = g_ShowGrid; // TRUE to show a grid
m_Draw_Sheet_Ref = TRUE; // TRUE to show sheet references m_Draw_Sheet_Ref = TRUE; // TRUE to show sheet references
m_CurrentSheet = new DrawSheetList(); m_CurrentSheet = new DrawSheetList();
CreateScreens(); CreateScreens();
// Give an icon
#ifdef __WINDOWS__
SetIcon(wxICON(a_icon_eeschema));
#else
SetIcon(wxICON(icon_eeschema));
#endif
g_ItemToRepeat = NULL; // Give an icon
/* Get config */ #ifdef __WINDOWS__
GetSettings(); SetIcon( wxICON( a_icon_eeschema ) );
g_DrawMinimunLineWidth = m_Parent->m_EDA_Config->Read(MINI_DRAW_LINE_WIDTH_KEY, (long)0); #else
g_PlotPSMinimunLineWidth = m_Parent->m_EDA_Config->Read(MINI_PLOTPS_LINE_WIDTH_KEY, (long) 4); SetIcon( wxICON( icon_eeschema ) );
#endif
/****/ g_ItemToRepeat = NULL;
SetSize(m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y); /* Get config */
if ( DrawPanel ) DrawPanel->m_Block_Enable = TRUE; GetSettings();
ReCreateMenuBar(); g_DrawMinimunLineWidth = m_Parent->m_EDA_Config->Read(
ReCreateHToolbar(); MINI_DRAW_LINE_WIDTH_KEY,
ReCreateVToolbar(); (long) 0 );
ReCreateOptToolbar(); g_PlotPSMinimunLineWidth = m_Parent->m_EDA_Config->Read(
MINI_PLOTPS_LINE_WIDTH_KEY,
(long) 4 );
/****/
SetSize( m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y );
if( DrawPanel )
DrawPanel->m_Block_Enable = TRUE;
ReCreateMenuBar();
ReCreateHToolbar();
ReCreateVToolbar();
ReCreateOptToolbar();
} }
/***************/ /***************/
/* Destructor */ /* Destructor */
/***************/ /***************/
WinEDA_SchematicFrame::~WinEDA_SchematicFrame() WinEDA_SchematicFrame::~WinEDA_SchematicFrame()
{ {
m_Parent->m_SchematicFrame = NULL; m_Parent->m_SchematicFrame = NULL;
SAFE_DELETE( g_RootSheet ); SAFE_DELETE( g_RootSheet );
SAFE_DELETE( m_CurrentSheet ); //a DrawSheetList, on the heap. SAFE_DELETE( m_CurrentSheet ); //a DrawSheetList, on the heap.
m_CurrentSheet = NULL; m_CurrentSheet = NULL;
} }
/***************/
/* utility functions */
/***************/ /***************/
/* utility functions */
/***************/
DrawSheetList* WinEDA_SchematicFrame::GetSheet() DrawSheetList* WinEDA_SchematicFrame::GetSheet()
{
return m_CurrentSheet;
}
BASE_SCREEN* WinEDA_SchematicFrame::GetScreen()
{
return m_CurrentSheet->LastScreen();
}
void WinEDA_SchematicFrame::SetScreen(SCH_SCREEN* screen)
{ {
//find it in the hierarchy, and set it. return m_CurrentSheet;
//there is ambiguity in this function (there may be several
//instances of a given sheet, but irregardless it is useful
//for printing etc.
DrawSheetList sheetlist;
if(g_RootSheet->LocatePathOfScreen(screen, &sheetlist)){
*m_CurrentSheet = sheetlist;
m_CurrentSheet->UpdateAllScreenReferences();
}
} }
BASE_SCREEN* WinEDA_SchematicFrame::GetScreen()
{
return m_CurrentSheet->LastScreen();
}
void WinEDA_SchematicFrame::SetScreen( SCH_SCREEN* screen )
{
//find it in the hierarchy, and set it.
//there is ambiguity in this function (there may be several
//instances of a given sheet, but irregardless it is useful
//for printing etc.
DrawSheetList sheetlist;
if( g_RootSheet->LocatePathOfScreen( screen, &sheetlist ) )
{
*m_CurrentSheet = sheetlist;
m_CurrentSheet->UpdateAllScreenReferences();
}
}
wxString WinEDA_SchematicFrame::GetScreenDesc() wxString WinEDA_SchematicFrame::GetScreenDesc()
{ {
wxString s = m_CurrentSheet->PathHumanReadable(); wxString s = m_CurrentSheet->PathHumanReadable();
return s;
return s;
} }
/******************************/ /******************************/
void WinEDA_SchematicFrame::CreateScreens() void WinEDA_SchematicFrame::CreateScreens()
/******************************/ /******************************/
{ {
/* creation des ecrans Sch , Lib */ /* creation des ecrans Sch , Lib */
if( g_RootSheet == NULL ){ if( g_RootSheet == NULL )
g_RootSheet = new DrawSheetStruct(); {
} g_RootSheet = new DrawSheetStruct();
if( g_RootSheet->m_s == NULL ){ }
g_RootSheet->m_s = new SCH_SCREEN( SCHEMATIC_FRAME ); if( g_RootSheet->m_s == NULL )
g_RootSheet->m_s->m_RefCount++; {
} g_RootSheet->m_s = new SCH_SCREEN( SCHEMATIC_FRAME );
g_RootSheet->m_s->m_FileName = g_DefaultSchematicFileName; g_RootSheet->m_s->m_RefCount++;
g_RootSheet->m_s->m_Date = GenDate(); }
m_CurrentSheet->Clear(); g_RootSheet->m_s->m_FileName = g_DefaultSchematicFileName;
m_CurrentSheet->Push(g_RootSheet); g_RootSheet->m_s->m_Date = GenDate();
m_CurrentSheet->Clear();
m_CurrentSheet->Push( g_RootSheet );
if( ScreenLib == NULL ) if( ScreenLib == NULL )
ScreenLib = new SCH_SCREEN( LIBEDITOR_FRAME ); ScreenLib = new SCH_SCREEN( LIBEDITOR_FRAME );
ScreenLib->SetZoom( 4 ); ScreenLib->SetZoom( 4 );
ScreenLib->m_UndoRedoCountMax = 10; ScreenLib->m_UndoRedoCountMax = 10;
} }
/**************************************************************/ /**************************************************************/
void WinEDA_SchematicFrame::OnCloseWindow(wxCloseEvent & Event) void WinEDA_SchematicFrame::OnCloseWindow( wxCloseEvent& Event )
/**************************************************************/ /**************************************************************/
{ {
DrawSheetList* sheet; DrawSheetList* sheet;
if ( m_Parent->m_LibeditFrame ) // Can close component editor ? if( m_Parent->m_LibeditFrame ) // Can close component editor ?
{ {
if ( ! m_Parent->m_LibeditFrame->Close() ) return; if( !m_Parent->m_LibeditFrame->Close() )
} return;
}
EDA_SheetList sheets( g_RootSheet ); EDA_SheetList sheets( g_RootSheet );
for(sheet = sheets.GetFirst(); sheet != NULL; sheet = sheets.GetNext() ){ for( sheet = sheets.GetFirst(); sheet != NULL; sheet = sheets.GetNext() )
if(sheet->LastScreen() && sheet->LastScreen()->IsModify()) break; {
} if( sheet->LastScreen() && sheet->LastScreen()->IsModify() )
break;
}
if ( sheet ) if( sheet )
{ {
unsigned ii; unsigned ii;
wxMessageDialog dialog(this, _("Schematic modified, Save before exit ?"), wxMessageDialog dialog( this,
_("Confirmation"), wxYES_NO | wxCANCEL | wxICON_EXCLAMATION | wxYES_DEFAULT); _( "Schematic modified, Save before exit ?" ),
ii = dialog.ShowModal(); _( "Confirmation" ), wxYES_NO | wxCANCEL |
switch ( ii ) wxICON_EXCLAMATION | wxYES_DEFAULT );
{ ii = dialog.ShowModal();
case wxID_CANCEL:
Event.Veto();
return;
case wxID_NO: switch( ii )
break; {
case wxID_CANCEL:
Event.Veto();
return;
case wxID_OK: case wxID_NO:
case wxID_YES: break;
SaveProject();
break;
}
}
for(sheet = sheets.GetFirst(); sheet != NULL; sheet = sheets.GetNext() ){ case wxID_OK:
if(sheet->LastScreen()){ case wxID_YES:
sheet->LastScreen()->ClrModify(); SaveProject();
} break;
} }
}
if ( ! GetScreen()->m_FileName.IsEmpty() && (GetScreen()->EEDrawList != NULL) ) for( sheet = sheets.GetFirst(); sheet != NULL; sheet = sheets.GetNext() )
SetLastProject(GetScreen()->m_FileName); {
if( sheet->LastScreen() )
{
sheet->LastScreen()->ClrModify();
}
}
ClearProjectDrawList(g_RootSheet->m_s, TRUE); if( !GetScreen()->m_FileName.IsEmpty() && (GetScreen()->EEDrawList != NULL) )
SetLastProject( GetScreen()->m_FileName );
/* allof sub sheets are deleted, only the main sheet is useable */ ClearProjectDrawList( g_RootSheet->m_s, TRUE );
m_CurrentSheet->Clear();
SaveSettings(); /* allof sub sheets are deleted, only the main sheet is useable */
m_CurrentSheet->Clear();
m_Parent->m_EDA_Config->Write(MINI_DRAW_LINE_WIDTH_KEY, (long)g_DrawMinimunLineWidth); SaveSettings();
m_Parent->m_EDA_Config->Write(MINI_PLOTPS_LINE_WIDTH_KEY, (long) g_PlotPSMinimunLineWidth);
Destroy(); m_Parent->m_EDA_Config->Write( MINI_DRAW_LINE_WIDTH_KEY,
(long) g_DrawMinimunLineWidth );
m_Parent->m_EDA_Config->Write( MINI_PLOTPS_LINE_WIDTH_KEY,
(long) g_PlotPSMinimunLineWidth );
Destroy();
} }
/********************************************/ /********************************************/
void WinEDA_SchematicFrame::SetToolbars() void WinEDA_SchematicFrame::SetToolbars()
/********************************************/ /********************************************/
/* Enable or disable some tools according to current conditions /* Enable or disable some tools according to current conditions
*/ */
{ {
if( m_HToolBar ) if( m_HToolBar )
{ {
if ( GetScreen() && GetScreen()->BlockLocate.m_Command == BLOCK_MOVE ) if( GetScreen() && GetScreen()->BlockLocate.m_Command == BLOCK_MOVE )
{ {
m_HToolBar->EnableTool(wxID_CUT,TRUE); m_HToolBar->EnableTool( wxID_CUT, TRUE );
m_HToolBar->EnableTool(wxID_COPY,TRUE); m_HToolBar->EnableTool( wxID_COPY, TRUE );
} }
else else
{ {
m_HToolBar->EnableTool(wxID_CUT,FALSE); m_HToolBar->EnableTool( wxID_CUT, FALSE );
m_HToolBar->EnableTool(wxID_COPY,FALSE); m_HToolBar->EnableTool( wxID_COPY, FALSE );
} }
if ( g_BlockSaveDataList ) m_HToolBar->EnableTool(wxID_PASTE,TRUE); if( g_BlockSaveDataList )
else m_HToolBar->EnableTool(wxID_PASTE,FALSE); m_HToolBar->EnableTool( wxID_PASTE, TRUE );
else
m_HToolBar->EnableTool( wxID_PASTE, FALSE );
wxMenuBar * menuBar = GetMenuBar(); wxMenuBar* menuBar = GetMenuBar();
if ( GetScreen() && GetScreen()->m_RedoList ) if( GetScreen() && GetScreen()->m_RedoList )
{ {
m_HToolBar->EnableTool(ID_SCHEMATIC_REDO,TRUE); m_HToolBar->EnableTool( ID_SCHEMATIC_REDO, TRUE );
menuBar->Enable(ID_SCHEMATIC_REDO,TRUE); menuBar->Enable( ID_SCHEMATIC_REDO, TRUE );
} }
else else
{ {
m_HToolBar->EnableTool(ID_SCHEMATIC_REDO,FALSE); m_HToolBar->EnableTool( ID_SCHEMATIC_REDO, FALSE );
menuBar->Enable(ID_SCHEMATIC_REDO,FALSE); menuBar->Enable( ID_SCHEMATIC_REDO, FALSE );
} }
if ( GetScreen() && GetScreen()->m_UndoList ) if( GetScreen() && GetScreen()->m_UndoList )
{ {
m_HToolBar->EnableTool(ID_SCHEMATIC_UNDO,TRUE); m_HToolBar->EnableTool( ID_SCHEMATIC_UNDO, TRUE );
menuBar->Enable(ID_SCHEMATIC_UNDO,TRUE); menuBar->Enable( ID_SCHEMATIC_UNDO, TRUE );
} }
else else
{ {
m_HToolBar->EnableTool(ID_SCHEMATIC_UNDO,FALSE); m_HToolBar->EnableTool( ID_SCHEMATIC_UNDO, FALSE );
menuBar->Enable(ID_SCHEMATIC_UNDO,FALSE); menuBar->Enable( ID_SCHEMATIC_UNDO, FALSE );
} }
} }
if ( m_OptionsToolBar ) if( m_OptionsToolBar )
{ {
m_OptionsToolBar->ToggleTool(ID_TB_OPTIONS_SHOW_GRID,m_Draw_Grid); m_OptionsToolBar->ToggleTool( ID_TB_OPTIONS_SHOW_GRID, m_Draw_Grid );
m_OptionsToolBar->SetToolShortHelp(ID_TB_OPTIONS_SHOW_GRID, m_OptionsToolBar->SetToolShortHelp( ID_TB_OPTIONS_SHOW_GRID,
m_Draw_Grid ? _("Grid not show") : _("Show Grid")); m_Draw_Grid ? _( "Grid not show" ) : _( "Show Grid" ) );
m_OptionsToolBar->ToggleTool(ID_TB_OPTIONS_SELECT_UNIT_MM, m_OptionsToolBar->ToggleTool( ID_TB_OPTIONS_SELECT_UNIT_MM,
g_UnitMetric == MILLIMETRE ? TRUE : FALSE); g_UnitMetric == MILLIMETRE ? TRUE : FALSE );
m_OptionsToolBar->ToggleTool(ID_TB_OPTIONS_SELECT_UNIT_INCH, m_OptionsToolBar->ToggleTool( ID_TB_OPTIONS_SELECT_UNIT_INCH,
g_UnitMetric == INCHES ? TRUE : FALSE); g_UnitMetric == INCHES ? TRUE : FALSE );
m_OptionsToolBar->ToggleTool(ID_TB_OPTIONS_SELECT_CURSOR,g_CursorShape); m_OptionsToolBar->ToggleTool( ID_TB_OPTIONS_SELECT_CURSOR,
m_OptionsToolBar->ToggleTool(ID_TB_OPTIONS_HIDDEN_PINS,g_ShowAllPins); g_CursorShape );
m_OptionsToolBar->SetToolShortHelp(ID_TB_OPTIONS_HIDDEN_PINS, m_OptionsToolBar->ToggleTool( ID_TB_OPTIONS_HIDDEN_PINS, g_ShowAllPins );
g_ShowAllPins ? _("No show Hidden Pins") : _("Show Hidden Pins") ); m_OptionsToolBar->SetToolShortHelp( ID_TB_OPTIONS_HIDDEN_PINS,
m_OptionsToolBar->ToggleTool(ID_TB_OPTIONS_BUS_WIRES_ORIENT, g_HVLines); g_ShowAllPins ? _( "No show Hidden Pins" ) : _( "Show Hidden Pins" ) );
m_OptionsToolBar->SetToolShortHelp(ID_TB_OPTIONS_BUS_WIRES_ORIENT, m_OptionsToolBar->ToggleTool( ID_TB_OPTIONS_BUS_WIRES_ORIENT,
g_HVLines ? _("Draw lines at any direction") : g_HVLines );
_("Draw lines H, V or 45 deg only") ); m_OptionsToolBar->SetToolShortHelp( ID_TB_OPTIONS_BUS_WIRES_ORIENT,
} g_HVLines ? _( "Draw lines at any direction" ) :
_( "Draw lines H, V or 45 deg only" ) );
}
DisplayUnitsMsg(); DisplayUnitsMsg();
} }
/******************************************/ /******************************************/
int WinEDA_SchematicFrame::BestZoom() int WinEDA_SchematicFrame::BestZoom()
/******************************************/ /******************************************/
{ {
int dx, dy, ii,jj ; int dx, dy, ii, jj;
int bestzoom; int bestzoom;
wxSize size; wxSize size;
dx = GetScreen()->m_CurrentSheetDesc->m_Size.x; dx = GetScreen()->m_CurrentSheetDesc->m_Size.x;
dy = GetScreen()->m_CurrentSheetDesc->m_Size.y; dy = GetScreen()->m_CurrentSheetDesc->m_Size.y;
size = DrawPanel->GetClientSize(); size = DrawPanel->GetClientSize();
ii = dx / size.x; ii = dx / size.x;
jj = dy / size.y; jj = dy / size.y;
bestzoom = MAX(ii, jj) + 1; bestzoom = MAX( ii, jj ) + 1;
GetScreen()->SetZoom(ii); GetScreen()->SetZoom( ii );
GetScreen()->m_Curseur.x = dx / 2; GetScreen()->m_Curseur.x = dx / 2;
GetScreen()->m_Curseur.y = dy / 2; GetScreen()->m_Curseur.y = dy / 2;
return(bestzoom); return bestzoom;
} }
void WinEDA_SchematicFrame::OnAnnotate( wxCommandEvent& event )
{
WinEDA_AnnotateFrame* dlg = new WinEDA_AnnotateFrame( this );
dlg->ShowModal();
dlg->Destroy();
}

View File

@ -438,6 +438,7 @@ public:
private: private:
void Process_Move_Item( EDA_BaseStruct* DrawStruct, wxDC* DC ); void Process_Move_Item( EDA_BaseStruct* DrawStruct, wxDC* DC );
void OnAnnotate ( wxCommandEvent& event );
// Bus Entry // Bus Entry
DrawBusEntryStruct* CreateBusEntry( wxDC* DC, int entry_type ); DrawBusEntryStruct* CreateBusEntry( wxDC* DC, int entry_type );