meet Ralph, a big harry template fieldnames patch
This commit is contained in:
parent
39476ccdb6
commit
f3d5c4948b
|
@ -1,5 +1,7 @@
|
||||||
eeschema/cmp_library_base.cpp
|
eeschema/cmp_library_keywords.cpp
|
||||||
eeschema/cmp_library_base.h
|
eeschema/cmp_library_keywords.h
|
||||||
|
eeschema/template_fieldnames_keywords.cpp
|
||||||
|
eeschema/template_fieldnames_keywords.h
|
||||||
pcbnew/dialog_freeroute_exchange_help_html.h
|
pcbnew/dialog_freeroute_exchange_help_html.h
|
||||||
Makefile
|
Makefile
|
||||||
CMakeFiles
|
CMakeFiles
|
||||||
|
@ -9,4 +11,5 @@ Testing
|
||||||
version.h
|
version.h
|
||||||
config.h
|
config.h
|
||||||
install_manifest.txt
|
install_manifest.txt
|
||||||
|
Documentation/doxygen
|
||||||
*.cmake
|
*.cmake
|
||||||
|
|
|
@ -4,6 +4,32 @@ KiCad ChangeLog 2010
|
||||||
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.
|
||||||
|
|
||||||
|
2010-Jun-17 UPDATE Dick Hollenbeck <dick@softplc.com>
|
||||||
|
================================================================================
|
||||||
|
++eeschema:
|
||||||
|
Added "template fieldnames" to eeschema. This is a list of template elements
|
||||||
|
consisting of {name, value, visibility} which you want shown in the eeschema
|
||||||
|
component fieldname (property) editors (both schematic and library versions
|
||||||
|
of the editors). Template fieldnames are forced into the editors'
|
||||||
|
presentation of the fields even though those fields may not exist in the
|
||||||
|
component. Entering a non-blank value while in a field editor will cause the
|
||||||
|
field & value to be retained in the component. Therefore it is unusual to
|
||||||
|
provide a non-blank '.value' in a template, because a trip through the field
|
||||||
|
editor will invariably add that field to the component since the template
|
||||||
|
being applied has initially a non blank 'value'. The current template editor
|
||||||
|
is only going to last about a week and it does not support adding non-blank
|
||||||
|
template values yet, nor visibility control, only field '.name'. But the
|
||||||
|
template fieldnames configuration storage and component field editors do
|
||||||
|
know how to handle template.visible and template.value already, in addition
|
||||||
|
to template.name. See the file .eeschema in your home directory for the
|
||||||
|
configuration storage, keyword: FieldNames. e.g. only field Manufacturer has
|
||||||
|
a '.value':
|
||||||
|
|
||||||
|
FieldNames=(templatefields (field (name "Manufacturer")(value "IBM 12")) (field (name "Vendor")) (field (name "Installed")) (field (name "Ralphy") visible))
|
||||||
|
|
||||||
|
DSNLEXER is used to parse the FieldNames record, & OUTPUTFORMATTER to generate it.
|
||||||
|
|
||||||
|
|
||||||
2010-jun-15, UPDATE Jean-Pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
|
2010-jun-15, UPDATE Jean-Pierre Charras <jean-pierre.charras@gipsa-lab.inpg.fr>
|
||||||
================================================================================
|
================================================================================
|
||||||
bitmap2component:
|
bitmap2component:
|
||||||
|
|
|
@ -39,23 +39,29 @@
|
||||||
# Usage:
|
# Usage:
|
||||||
#
|
#
|
||||||
# add_custom_command(
|
# add_custom_command(
|
||||||
# OUTPUT ${CMAKE_BINARY_DIR}/cmp_library_base.h
|
# OUTPUT ${CMAKE_BINARY_DIR}/cmp_library_keywords.h
|
||||||
|
# ${CMAKE_BINARY_DIR}/cmp_library_keywords.cpp
|
||||||
# COMMAND ${CMAKE_COMMAND}
|
# COMMAND ${CMAKE_COMMAND}
|
||||||
# -DinputFile=${CMAKE_CURRENT_SOURCE_DIR}/token_list_file
|
# -Denum=YOURTOK_T
|
||||||
|
# -DinputFile=${CMAKE_CURRENT_SOURCE_DIR}/cmp_library.lst
|
||||||
# -P ${CMAKE_MODULE_PATH}/TokenList2DsnLexer.cmake
|
# -P ${CMAKE_MODULE_PATH}/TokenList2DsnLexer.cmake
|
||||||
# DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/cmp_library.lst
|
# DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/cmp_library.lst
|
||||||
# )
|
# )
|
||||||
#
|
#
|
||||||
# Input parameters:
|
# Input parameters:
|
||||||
#
|
#
|
||||||
# inputFile - The name of the token list file.
|
# enum - The name of the enum to generate, defaults to DSN_T, but
|
||||||
|
# you'll get collisions if you don't override it.
|
||||||
|
# inputFile - The name of the token list file.
|
||||||
# outputPath - Optional output path to save the generated files. If not defined,
|
# outputPath - Optional output path to save the generated files. If not defined,
|
||||||
# the output path is the same path as the token list file path.
|
# the output path is the same path as the token list file path.
|
||||||
#
|
|
||||||
|
|
||||||
set( tokens "" )
|
set( tokens "" )
|
||||||
set( lineCount 0 )
|
set( lineCount 0 )
|
||||||
set( dsnErrorMsg "DSN token file generator failure:" )
|
set( dsnErrorMsg "DSN token file generator failure:" )
|
||||||
|
|
||||||
|
|
||||||
if( NOT EXISTS ${inputFile} )
|
if( NOT EXISTS ${inputFile} )
|
||||||
message( FATAL_ERROR "${dsnErrorMsg} file ${inputFile} cannot be found." )
|
message( FATAL_ERROR "${dsnErrorMsg} file ${inputFile} cannot be found." )
|
||||||
endif( NOT EXISTS ${inputFile} )
|
endif( NOT EXISTS ${inputFile} )
|
||||||
|
@ -64,14 +70,20 @@ if( NOT EXISTS ${outputPath} )
|
||||||
get_filename_component( outputPath "${inputFile}" PATH )
|
get_filename_component( outputPath "${inputFile}" PATH )
|
||||||
endif( NOT EXISTS ${outputPath} )
|
endif( NOT EXISTS ${outputPath} )
|
||||||
|
|
||||||
|
if( NOT DEFINED enum )
|
||||||
|
set( enum DSN_T )
|
||||||
|
endif()
|
||||||
|
#message( STATUS "enum: ${enum}" )
|
||||||
|
|
||||||
|
|
||||||
# Separate the file name without extension from the full file path.
|
# Separate the file name without extension from the full file path.
|
||||||
get_filename_component( result "${inputFile}" NAME_WE )
|
get_filename_component( result "${inputFile}" NAME_WE )
|
||||||
|
|
||||||
message( STATUS "Extracted file name ${result} from path ${inputFile}" )
|
message( STATUS "Extracted file name ${result} from path ${inputFile}" )
|
||||||
|
|
||||||
# Create include and source file name from the list file name.
|
# Create include and source file name from the list file name.
|
||||||
set( includeFileName "${outputPath}/${result}_base.h" )
|
set( includeFileName "${outputPath}/${result}_keywords.h" )
|
||||||
set( sourceFileName "${outputPath}/${result}_base.cpp" )
|
set( sourceFileName "${outputPath}/${result}_keywords.cpp" )
|
||||||
|
|
||||||
# Create tag for generating header file.
|
# Create tag for generating header file.
|
||||||
string( TOUPPER "${result}" fileNameTag )
|
string( TOUPPER "${result}" fileNameTag )
|
||||||
|
@ -91,7 +103,7 @@ set( includeFileHeader
|
||||||
|
|
||||||
namespace DSN {
|
namespace DSN {
|
||||||
|
|
||||||
enum DSN_T {
|
enum ${enum} {
|
||||||
|
|
||||||
// these first few are negative special ones for syntax, and are
|
// these first few are negative special ones for syntax, and are
|
||||||
// inherited from DSNLEXER.
|
// inherited from DSNLEXER.
|
||||||
|
@ -122,7 +134,7 @@ set( sourceFileHeader
|
||||||
#include \"fctsys.h\"
|
#include \"fctsys.h\"
|
||||||
#include \"macros.h\"
|
#include \"macros.h\"
|
||||||
|
|
||||||
#include \"${result}_base.h\"
|
#include \"${result}_keywords.h\"
|
||||||
|
|
||||||
|
|
||||||
namespace DSN {
|
namespace DSN {
|
||||||
|
@ -130,7 +142,6 @@ namespace DSN {
|
||||||
#define TOKDEF(x) { #x, T_##x }
|
#define TOKDEF(x) { #x, T_##x }
|
||||||
|
|
||||||
const KEYWORD ${result}_keywords[] = {
|
const KEYWORD ${result}_keywords[] = {
|
||||||
|
|
||||||
"
|
"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -193,8 +204,10 @@ endforeach( token ${tokens} )
|
||||||
file( APPEND "${includeFileName}"
|
file( APPEND "${includeFileName}"
|
||||||
"};
|
"};
|
||||||
|
|
||||||
|
extern const KEYWORD ${result}_keywords[];
|
||||||
|
extern const unsigned ${result}_keyword_count;
|
||||||
|
|
||||||
} // End namespace DSN
|
} // End namespace DSN
|
||||||
|
|
||||||
|
|
||||||
#endif // End ${headerTag}
|
#endif // End ${headerTag}
|
||||||
|
@ -208,6 +221,6 @@ file( APPEND "${sourceFileName}"
|
||||||
const unsigned ${result}_keyword_count = DIM( ${result}_keywords );
|
const unsigned ${result}_keyword_count = DIM( ${result}_keywords );
|
||||||
|
|
||||||
|
|
||||||
} // End namespace DSN
|
} // End namespace DSN
|
||||||
"
|
"
|
||||||
)
|
)
|
||||||
|
|
|
@ -182,6 +182,16 @@ const char* DSNLEXER::GetTokenText( int aTok )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
wxString DSNLEXER::GetTokenString( int aTok )
|
||||||
|
{
|
||||||
|
wxString ret;
|
||||||
|
|
||||||
|
ret << wxT("'") << CONV_FROM_UTF8( GetTokenText(aTok) ) << wxT("'");
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void DSNLEXER::ThrowIOError( wxString aText, int charOffset ) throw (IOError)
|
void DSNLEXER::ThrowIOError( wxString aText, int charOffset ) throw (IOError)
|
||||||
{
|
{
|
||||||
// append to aText, do not overwrite
|
// append to aText, do not overwrite
|
||||||
|
@ -193,6 +203,38 @@ void DSNLEXER::ThrowIOError( wxString aText, int charOffset ) throw (IOError)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DSNLEXER::Expecting( int aTok ) throw( IOError )
|
||||||
|
{
|
||||||
|
wxString errText( _("Expecting") );
|
||||||
|
errText << wxT(" ") << GetTokenString( aTok );
|
||||||
|
ThrowIOError( errText, CurOffset() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DSNLEXER::Expecting( const wxString& text ) throw( IOError )
|
||||||
|
{
|
||||||
|
wxString errText( _("Expecting") );
|
||||||
|
errText << wxT(" '") << text << wxT("'");
|
||||||
|
ThrowIOError( errText, CurOffset() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DSNLEXER::Unexpected( int aTok ) throw( IOError )
|
||||||
|
{
|
||||||
|
wxString errText( _("Unexpected") );
|
||||||
|
errText << wxT(" ") << GetTokenString( aTok );
|
||||||
|
ThrowIOError( errText, CurOffset() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DSNLEXER::Unexpected( const wxString& text ) throw( IOError )
|
||||||
|
{
|
||||||
|
wxString errText( _("Unexpected") );
|
||||||
|
errText << wxT(" '") << text << wxT("'");
|
||||||
|
ThrowIOError( errText, CurOffset() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function isspace
|
* Function isspace
|
||||||
* strips the upper bits of the int to ensure the value passed to ::isspace() is
|
* strips the upper bits of the int to ensure the value passed to ::isspace() is
|
||||||
|
|
|
@ -124,6 +124,8 @@ set(EESCHEMA_SRCS
|
||||||
symbdraw.cpp
|
symbdraw.cpp
|
||||||
symbedit.cpp
|
symbedit.cpp
|
||||||
edit_graphic_bodyitem_text.cpp
|
edit_graphic_bodyitem_text.cpp
|
||||||
|
template_fieldnames_keywords.cpp
|
||||||
|
template_fieldnames.cpp
|
||||||
tool_lib.cpp
|
tool_lib.cpp
|
||||||
tool_sch.cpp
|
tool_sch.cpp
|
||||||
tool_viewlib.cpp
|
tool_viewlib.cpp
|
||||||
|
@ -155,20 +157,34 @@ endif(APPLE)
|
||||||
# Generate DSN lexer header and source files for the component library file
|
# Generate DSN lexer header and source files for the component library file
|
||||||
# format.
|
# format.
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/cmp_library_base.h
|
OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/cmp_library_keywords.h
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/cmp_library_keywords.cpp
|
||||||
COMMAND ${CMAKE_COMMAND}
|
COMMAND ${CMAKE_COMMAND}
|
||||||
-DinputFile=${CMAKE_CURRENT_SOURCE_DIR}/cmp_library.lst
|
-DinputFile=${CMAKE_CURRENT_SOURCE_DIR}/cmp_library.lst
|
||||||
-P ${CMAKE_MODULE_PATH}/TokenList2DsnLexer.cmake
|
-P ${CMAKE_MODULE_PATH}/TokenList2DsnLexer.cmake
|
||||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/cmp_library.lst
|
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/cmp_library.lst
|
||||||
COMMENT "creating ${CMAKE_CURRENT_SOURCE_DIR}/cmp_library_base.h(.cpp)
|
COMMENT "creating ${CMAKE_CURRENT_SOURCE_DIR}/cmp_library_keywords.h(.cpp)
|
||||||
from ${CMAKE_CURRENT_SOURCE_DIR}/cmp_library.lst"
|
from ${CMAKE_CURRENT_SOURCE_DIR}/cmp_library.lst"
|
||||||
)
|
)
|
||||||
|
|
||||||
set_source_files_properties( cmp_library_lexer.cpp
|
set_source_files_properties( cmp_library_lexer.cpp
|
||||||
PROPERTIES
|
PROPERTIES
|
||||||
OBJECT_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/cmp_library_base.h
|
OBJECT_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/cmp_library_keywords.h
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/template_fieldnames_keywords.h
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/template_fieldnames_keywords.cpp
|
||||||
|
COMMAND ${CMAKE_COMMAND}
|
||||||
|
-Denum=TFIELD_T
|
||||||
|
-DinputFile=${CMAKE_CURRENT_SOURCE_DIR}/template_fieldnames.lst
|
||||||
|
-P ${CMAKE_MODULE_PATH}/TokenList2DsnLexer.cmake
|
||||||
|
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/template_fieldnames.lst
|
||||||
|
COMMENT "creating ${CMAKE_CURRENT_SOURCE_DIR}/template_fieldnames_keywords.h(.cpp)
|
||||||
|
from ${CMAKE_CURRENT_SOURCE_DIR}/template_fieldnames.lst"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
add_executable(eeschema WIN32 MACOSX_BUNDLE ${EESCHEMA_SRCS} ${EESCHEMA_EXTRA_SRCS}
|
add_executable(eeschema WIN32 MACOSX_BUNDLE ${EESCHEMA_SRCS} ${EESCHEMA_EXTRA_SRCS}
|
||||||
${EESCHEMA_RESOURCES})
|
${EESCHEMA_RESOURCES})
|
||||||
|
|
||||||
|
|
|
@ -188,13 +188,15 @@ LIB_COMPONENT::LIB_COMPONENT( const wxString& aName, CMP_LIBRARY* aLibrary ) :
|
||||||
m_DrawPinNum = 1;
|
m_DrawPinNum = 1;
|
||||||
m_DrawPinName = 1;
|
m_DrawPinName = 1;
|
||||||
|
|
||||||
/* The minimum requirements for a component are a value and a reference
|
// Add the MANDATORY_FIELDS in RAM only. These are assumed to be present
|
||||||
* designator field.
|
// when the field editors are invoked.
|
||||||
*/
|
|
||||||
LIB_FIELD* value = new LIB_FIELD( this, VALUE );
|
LIB_FIELD* value = new LIB_FIELD( this, VALUE );
|
||||||
value->m_Text = aName;
|
value->m_Text = aName;
|
||||||
drawings.push_back( value );
|
drawings.push_back( value );
|
||||||
|
|
||||||
drawings.push_back( new LIB_FIELD( this, REFERENCE ) );
|
drawings.push_back( new LIB_FIELD( this, REFERENCE ) );
|
||||||
|
drawings.push_back( new LIB_FIELD( this, FOOTPRINT ) );
|
||||||
|
drawings.push_back( new LIB_FIELD( this, DATASHEET ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -388,19 +390,17 @@ void LIB_COMPONENT::RemoveDrawItem( LIB_DRAW_ITEM* aItem,
|
||||||
{
|
{
|
||||||
wxASSERT( aItem != NULL );
|
wxASSERT( aItem != NULL );
|
||||||
|
|
||||||
/* Value and reference fields cannot be removed. */
|
// none of the MANDATOR_FIELDS may be removed in RAM, but they may be
|
||||||
|
// omitted when saving to disk.
|
||||||
if( aItem->Type() == COMPONENT_FIELD_DRAW_TYPE )
|
if( aItem->Type() == COMPONENT_FIELD_DRAW_TYPE )
|
||||||
{
|
{
|
||||||
LIB_FIELD* field = (LIB_FIELD*)aItem;
|
LIB_FIELD* field = (LIB_FIELD*) aItem;
|
||||||
|
|
||||||
if( field->m_FieldId == VALUE || field->m_FieldId == REFERENCE )
|
if( field->m_FieldId < MANDATORY_FIELDS )
|
||||||
{
|
{
|
||||||
wxString fieldType = ( field->m_FieldId == VALUE ) ?
|
wxLogWarning( _( "An attempt was made to remove the %s field "
|
||||||
_( "value" ) : _( "reference" );
|
"from component %s in library %s." ),
|
||||||
|
GetChars( field->m_Name ), GetChars( GetName() ),
|
||||||
wxLogWarning( _( "An attempt was made to remove the %s field \
|
|
||||||
from component %s in library %s." ),
|
|
||||||
GetChars( fieldType ), GetChars( GetName() ),
|
|
||||||
GetChars( GetLibraryName() ) );
|
GetChars( GetLibraryName() ) );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -518,8 +518,8 @@ LIB_PIN* LIB_COMPONENT::GetPin( const wxString& aNumber, int aUnit, int aConvert
|
||||||
|
|
||||||
bool LIB_COMPONENT::Save( FILE* aFile )
|
bool LIB_COMPONENT::Save( FILE* aFile )
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
LIB_FIELD& value = GetValueField();
|
LIB_FIELD& value = GetValueField();
|
||||||
|
|
||||||
/* First line: it s a comment (component name for readers) */
|
/* First line: it s a comment (component name for readers) */
|
||||||
if( fprintf( aFile, "#\n# %s\n#\n", CONV_TO_UTF8( value.m_Text ) ) < 0 )
|
if( fprintf( aFile, "#\n# %s\n#\n", CONV_TO_UTF8( value.m_Text ) ) < 0 )
|
||||||
|
@ -567,13 +567,33 @@ bool LIB_COMPONENT::Save( FILE* aFile )
|
||||||
LIB_FIELD_LIST fields;
|
LIB_FIELD_LIST fields;
|
||||||
GetFields( fields );
|
GetFields( fields );
|
||||||
|
|
||||||
for( i = 0; i < fields.size(); i++ )
|
// Fixed fields:
|
||||||
|
// may have their own save policy so there is a separate loop for them.
|
||||||
|
for( i = 0; i < MANDATORY_FIELDS; ++i )
|
||||||
{
|
{
|
||||||
if( fields[i].m_Text.IsEmpty() && fields[i].m_Name.IsEmpty() )
|
if( !fields[i].m_Text.IsEmpty() )
|
||||||
continue;
|
{
|
||||||
|
if( !fields[i].Save( aFile ) )
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if( !fields[i].Save( aFile ) )
|
// User defined fields:
|
||||||
return false;
|
// may have their own save policy so there is a separate loop for them.
|
||||||
|
|
||||||
|
int fieldId = MANDATORY_FIELDS; // really wish this would go away.
|
||||||
|
|
||||||
|
for( i = MANDATORY_FIELDS; i < fields.size(); ++i )
|
||||||
|
{
|
||||||
|
// There is no need to save empty fields, i.e. no reason to preserve field
|
||||||
|
// names now that fields names come in dynamically through the template
|
||||||
|
// fieldnames.
|
||||||
|
if( !fields[i].m_Text.IsEmpty() )
|
||||||
|
{
|
||||||
|
fields[i].m_FieldId = fieldId++;
|
||||||
|
if( !fields[i].Save( aFile ) )
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save the alias list: a line starting by "ALIAS" */
|
/* Save the alias list: a line starting by "ALIAS" */
|
||||||
|
@ -623,6 +643,7 @@ bool LIB_COMPONENT::Save( FILE* aFile )
|
||||||
{
|
{
|
||||||
if( item.Type() == COMPONENT_FIELD_DRAW_TYPE )
|
if( item.Type() == COMPONENT_FIELD_DRAW_TYPE )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( !item.Save( aFile ) )
|
if( !item.Save( aFile ) )
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -637,6 +658,7 @@ bool LIB_COMPONENT::Save( FILE* aFile )
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool LIB_COMPONENT::Load( FILE* aFile, char* aLine, int* aLineNum,
|
bool LIB_COMPONENT::Load( FILE* aFile, char* aLine, int* aLineNum,
|
||||||
wxString& aErrorMsg )
|
wxString& aErrorMsg )
|
||||||
{
|
{
|
||||||
|
@ -832,8 +854,8 @@ bool LIB_COMPONENT::LoadDrawEntries( FILE* aFile, char* aLine,
|
||||||
{
|
{
|
||||||
if( GetLine( aFile, aLine, aLineNum, LINE_BUFFER_LEN_LARGE ) == NULL )
|
if( GetLine( aFile, aLine, aLineNum, LINE_BUFFER_LEN_LARGE ) == NULL )
|
||||||
{
|
{
|
||||||
aErrorMsg = wxT( "file ended prematurely while attempting \
|
aErrorMsg = wxT( "file ended prematurely while attempting "
|
||||||
to flush to end of drawing section." );
|
"to flush to end of drawing section." );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} while( strncmp( aLine, "ENDDRAW", 7 ) != 0 );
|
} while( strncmp( aLine, "ENDDRAW", 7 ) != 0 );
|
||||||
|
@ -868,21 +890,26 @@ bool LIB_COMPONENT::LoadField( char* aLine, wxString& aErrorMsg )
|
||||||
{
|
{
|
||||||
LIB_FIELD* field = new LIB_FIELD( this );
|
LIB_FIELD* field = new LIB_FIELD( this );
|
||||||
|
|
||||||
if ( !field->Load( aLine, aErrorMsg ) )
|
if( !field->Load( aLine, aErrorMsg ) )
|
||||||
{
|
{
|
||||||
SAFE_DELETE( field );
|
SAFE_DELETE( field );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( field->m_FieldId == REFERENCE )
|
if( field->m_FieldId < MANDATORY_FIELDS )
|
||||||
{
|
{
|
||||||
GetReferenceField() = *field;
|
LIB_FIELD* fixedField = GetField( field->m_FieldId );
|
||||||
SAFE_DELETE( field );
|
|
||||||
}
|
// this will fire only if somebody broke a constructor or editor.
|
||||||
else if ( field->m_FieldId == VALUE )
|
// MANDATORY_FIELDS are alway present in ram resident components, no
|
||||||
{
|
// exceptions, and they always have their names set, even fixed fields.
|
||||||
GetValueField() = *field;
|
wxASSERT( fixedField );
|
||||||
name = field->m_Text;
|
|
||||||
|
*fixedField = *field;
|
||||||
|
|
||||||
|
if( field->m_FieldId == VALUE )
|
||||||
|
name = field->m_Text;
|
||||||
|
|
||||||
SAFE_DELETE( field );
|
SAFE_DELETE( field );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -932,6 +959,7 @@ EDA_Rect LIB_COMPONENT::GetBoundaryBox( int aUnit, int aConvert )
|
||||||
if( ( item.m_Unit > 0 ) && ( ( unitCount > 1 ) && ( aUnit > 0 )
|
if( ( item.m_Unit > 0 ) && ( ( unitCount > 1 ) && ( aUnit > 0 )
|
||||||
&& ( aUnit != item.m_Unit ) ) )
|
&& ( aUnit != item.m_Unit ) ) )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( item.m_Convert > 0
|
if( item.m_Convert > 0
|
||||||
&& ( ( aConvert > 0 ) && ( aConvert != item.m_Convert ) ) )
|
&& ( ( aConvert > 0 ) && ( aConvert != item.m_Convert ) ) )
|
||||||
continue;
|
continue;
|
||||||
|
@ -947,48 +975,69 @@ EDA_Rect LIB_COMPONENT::GetBoundaryBox( int aUnit, int aConvert )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** Function SetFields
|
void LIB_COMPONENT::deleteAllFields()
|
||||||
* initialize fields from a vector of fields
|
|
||||||
* @param aFields a std::vector <LIB_FIELD> to import.
|
|
||||||
*/
|
|
||||||
void LIB_COMPONENT::SetFields( const std::vector <LIB_FIELD> aFields )
|
|
||||||
{
|
{
|
||||||
LIB_FIELD* field;
|
LIB_DRAW_ITEM_LIST::iterator it;
|
||||||
|
|
||||||
for( size_t i = 0; i < aFields.size(); i++ )
|
for( it = drawings.begin(); it!=drawings.end(); /* deleting */ )
|
||||||
{
|
{
|
||||||
field = GetField( aFields[i].m_FieldId );
|
if( it->Type() != COMPONENT_FIELD_DRAW_TYPE )
|
||||||
|
|
||||||
if( field )
|
|
||||||
{
|
{
|
||||||
*field = aFields[i];
|
++it;
|
||||||
|
|
||||||
if( (int) i == VALUE )
|
|
||||||
name = field->m_Text;
|
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If the field isn't set, don't add it to the component. */
|
// 'it' is not advanced, but should point to next in list after erase()
|
||||||
if( aFields[i].m_Text.IsEmpty() )
|
drawings.erase( it );
|
||||||
continue;
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LIB_COMPONENT::SetFields( const std::vector <LIB_FIELD>& aFields )
|
||||||
|
{
|
||||||
|
deleteAllFields();
|
||||||
|
|
||||||
|
for( unsigned i=0; i<aFields.size(); ++i )
|
||||||
|
{
|
||||||
|
// drawings is a ptr_vector, new and copy an object on the heap.
|
||||||
|
LIB_FIELD* field = new LIB_FIELD( aFields[i] );
|
||||||
|
|
||||||
field = new LIB_FIELD( aFields[i] );
|
|
||||||
drawings.push_back( field );
|
drawings.push_back( field );
|
||||||
}
|
}
|
||||||
|
|
||||||
drawings.sort();
|
drawings.sort(); // would be nice to know why...
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void LIB_COMPONENT::GetFields( LIB_FIELD_LIST& aList )
|
void LIB_COMPONENT::GetFields( LIB_FIELD_LIST& aList )
|
||||||
{
|
{
|
||||||
|
LIB_FIELD* field;
|
||||||
|
|
||||||
|
// The only caller of this function is the library field editor, so it
|
||||||
|
// establishes policy here.
|
||||||
|
|
||||||
|
// Grab the MANDATORY_FIELDS first, in expected order given by
|
||||||
|
// enum NumFieldType
|
||||||
|
for( int id=0; id<MANDATORY_FIELDS; ++id )
|
||||||
|
{
|
||||||
|
field = GetField( id );
|
||||||
|
|
||||||
|
// the MANDATORY_FIELDS are exactly that in RAM.
|
||||||
|
wxASSERT( field );
|
||||||
|
|
||||||
|
aList.push_back( *field );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now grab all the rest of fields.
|
||||||
BOOST_FOREACH( LIB_DRAW_ITEM& item, drawings )
|
BOOST_FOREACH( LIB_DRAW_ITEM& item, drawings )
|
||||||
{
|
{
|
||||||
if( item.Type() != COMPONENT_FIELD_DRAW_TYPE )
|
if( item.Type() != COMPONENT_FIELD_DRAW_TYPE )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
LIB_FIELD* field = ( LIB_FIELD* ) &item;
|
field = ( LIB_FIELD* ) &item;
|
||||||
|
if( (unsigned) field->m_FieldId < MANDATORY_FIELDS )
|
||||||
|
continue; // was added above
|
||||||
|
|
||||||
aList.push_back( *field );
|
aList.push_back( *field );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1011,6 +1060,23 @@ LIB_FIELD* LIB_COMPONENT::GetField( int aId )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LIB_FIELD* LIB_COMPONENT::FindField( const wxString& aFieldName )
|
||||||
|
{
|
||||||
|
BOOST_FOREACH( LIB_DRAW_ITEM& item, drawings )
|
||||||
|
{
|
||||||
|
if( item.Type() != COMPONENT_FIELD_DRAW_TYPE )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
LIB_FIELD* field = ( LIB_FIELD* ) &item;
|
||||||
|
|
||||||
|
if( field->m_Name == aFieldName )
|
||||||
|
return field;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
LIB_FIELD& LIB_COMPONENT::GetValueField()
|
LIB_FIELD& LIB_COMPONENT::GetValueField()
|
||||||
{
|
{
|
||||||
LIB_FIELD* field = GetField( VALUE );
|
LIB_FIELD* field = GetField( VALUE );
|
||||||
|
|
|
@ -118,9 +118,9 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
typedef boost::ptr_vector< CMP_LIB_ENTRY > LIB_ENTRY_LIST;
|
typedef boost::ptr_vector< CMP_LIB_ENTRY > LIB_ENTRY_LIST;
|
||||||
|
|
||||||
|
|
||||||
extern bool operator<( const CMP_LIB_ENTRY& aItem1, const CMP_LIB_ENTRY& aItem2 );
|
extern bool operator<( const CMP_LIB_ENTRY& aItem1, const CMP_LIB_ENTRY& aItem2 );
|
||||||
|
|
||||||
extern int LibraryEntryCompare( const CMP_LIB_ENTRY* aItem1, const CMP_LIB_ENTRY* aItem2 );
|
extern int LibraryEntryCompare( const CMP_LIB_ENTRY* aItem1, const CMP_LIB_ENTRY* aItem2 );
|
||||||
|
@ -183,6 +183,9 @@ private:
|
||||||
* Used only by the component editor LibEdit
|
* Used only by the component editor LibEdit
|
||||||
* to store aliases info during edition
|
* to store aliases info during edition
|
||||||
* usually void outside the component editor */
|
* usually void outside the component editor */
|
||||||
|
|
||||||
|
void deleteAllFields();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
LIB_COMPONENT( const wxString& aName, CMP_LIBRARY* aLibrary = NULL );
|
LIB_COMPONENT( const wxString& aName, CMP_LIBRARY* aLibrary = NULL );
|
||||||
LIB_COMPONENT( LIB_COMPONENT& aComponent, CMP_LIBRARY* aLibrary = NULL );
|
LIB_COMPONENT( LIB_COMPONENT& aComponent, CMP_LIBRARY* aLibrary = NULL );
|
||||||
|
@ -301,19 +304,32 @@ public:
|
||||||
void SetNormal() { m_options = ENTRY_NORMAL; }
|
void SetNormal() { m_options = ENTRY_NORMAL; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize fields from a vector of fields.
|
* Function SetFields
|
||||||
|
* overwrites all the existing in this component with fields supplied
|
||||||
|
* in \a aFieldsList. The only known caller of this function is the
|
||||||
|
* library component field editor, and it establishes needed behavior.
|
||||||
*
|
*
|
||||||
* @param aFields - a std::vector <LIB_FIELD> to import.
|
* @param aFieldsList is a set of fields to import, removing all previous fields.
|
||||||
*/
|
*/
|
||||||
void SetFields( const std::vector <LIB_FIELD> aFields );
|
void SetFields( const std::vector <LIB_FIELD>& aFieldsList );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return list of field references of component.
|
* Function GetFields
|
||||||
|
* returns a list of fields withing this component. The only known caller of
|
||||||
|
* this function is the library component field editor, and it establishes
|
||||||
|
* needed behavior.
|
||||||
*
|
*
|
||||||
* @param aList - List to add field references to.
|
* @param aList - List to add fields to
|
||||||
*/
|
*/
|
||||||
void GetFields( LIB_FIELD_LIST& aList );
|
void GetFields( LIB_FIELD_LIST& aList );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function FindField
|
||||||
|
* finds a field within this component matching \a aFieldName and returns
|
||||||
|
* it or NULL if not found.
|
||||||
|
*/
|
||||||
|
LIB_FIELD* FindField( const wxString& aFieldName );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return pointer to the requested field.
|
* Return pointer to the requested field.
|
||||||
*
|
*
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
/**********************************************************/
|
/**********************************************************/
|
||||||
|
|
||||||
#include "fctsys.h"
|
#include "fctsys.h"
|
||||||
|
#include "appl_wxstruct.h"
|
||||||
#include "gr_basic.h"
|
#include "gr_basic.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "base_struct.h"
|
#include "base_struct.h"
|
||||||
|
@ -35,8 +36,8 @@
|
||||||
*
|
*
|
||||||
* 0 = REFERENCE
|
* 0 = REFERENCE
|
||||||
* 1 = VALUE
|
* 1 = VALUE
|
||||||
* 3 = FOOTPRINT (default Footprint)
|
* 2 = FOOTPRINT (default Footprint)
|
||||||
* 4 = DOCUMENTATION (user doc link)
|
* 3 = DOCUMENTATION (user doc link)
|
||||||
*
|
*
|
||||||
* others = free fields
|
* others = free fields
|
||||||
*/
|
*/
|
||||||
|
@ -81,6 +82,11 @@ void LIB_FIELD::Init( int id )
|
||||||
m_FieldId = id;
|
m_FieldId = id;
|
||||||
m_Size.x = m_Size.y = DEFAULT_SIZE_TEXT;
|
m_Size.x = m_Size.y = DEFAULT_SIZE_TEXT;
|
||||||
m_typeName = _( "Field" );
|
m_typeName = _( "Field" );
|
||||||
|
|
||||||
|
// fields in RAM must always have names, because we are trying to get
|
||||||
|
// less dependent on field ids and more dependent on names.
|
||||||
|
// Plus assumptions are made in the field editors.
|
||||||
|
m_Name = TEMPLATE_FIELDNAME::GetDefaultFieldName( id );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -94,13 +100,16 @@ bool LIB_FIELD::Save( FILE* ExportFile )
|
||||||
hjustify = 'L';
|
hjustify = 'L';
|
||||||
else if( m_HJustify == GR_TEXT_HJUSTIFY_RIGHT )
|
else if( m_HJustify == GR_TEXT_HJUSTIFY_RIGHT )
|
||||||
hjustify = 'R';
|
hjustify = 'R';
|
||||||
|
|
||||||
vjustify = 'C';
|
vjustify = 'C';
|
||||||
if( m_VJustify == GR_TEXT_VJUSTIFY_BOTTOM )
|
if( m_VJustify == GR_TEXT_VJUSTIFY_BOTTOM )
|
||||||
vjustify = 'B';
|
vjustify = 'B';
|
||||||
else if( m_VJustify == GR_TEXT_VJUSTIFY_TOP )
|
else if( m_VJustify == GR_TEXT_VJUSTIFY_TOP )
|
||||||
vjustify = 'T';
|
vjustify = 'T';
|
||||||
|
|
||||||
if( text.IsEmpty() )
|
if( text.IsEmpty() )
|
||||||
text = wxT( "~" );
|
text = wxT( "~" );
|
||||||
|
|
||||||
if( fprintf( ExportFile, "F%d \"%s\" %d %d %d %c %c %c %c%c%c",
|
if( fprintf( ExportFile, "F%d \"%s\" %d %d %d %c %c %c %c%c%c",
|
||||||
m_FieldId, CONV_TO_UTF8( text ), m_Pos.x, m_Pos.y, m_Size.x,
|
m_FieldId, CONV_TO_UTF8( text ), m_Pos.x, m_Pos.y, m_Size.x,
|
||||||
m_Orient == 0 ? 'H' : 'V',
|
m_Orient == 0 ? 'H' : 'V',
|
||||||
|
@ -115,8 +124,10 @@ bool LIB_FIELD::Save( FILE* ExportFile )
|
||||||
* Just because default name depends on the language and can change from
|
* Just because default name depends on the language and can change from
|
||||||
* a country to an other
|
* a country to an other
|
||||||
*/
|
*/
|
||||||
|
wxString defName = TEMPLATE_FIELDNAME::GetDefaultFieldName( m_FieldId );
|
||||||
|
|
||||||
if( m_FieldId >= FIELD1 && !m_Name.IsEmpty()
|
if( m_FieldId >= FIELD1 && !m_Name.IsEmpty()
|
||||||
&& m_Name != ReturnDefaultFieldName( m_FieldId )
|
&& m_Name != defName
|
||||||
&& fprintf( ExportFile, " \"%s\"", CONV_TO_UTF8( m_Name ) ) < 0 )
|
&& fprintf( ExportFile, " \"%s\"", CONV_TO_UTF8( m_Name ) ) < 0 )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -177,8 +188,7 @@ bool LIB_FIELD::Load( char* line, wxString& errorMsg )
|
||||||
|
|
||||||
if( cnt < 5 )
|
if( cnt < 5 )
|
||||||
{
|
{
|
||||||
errorMsg.Printf( wxT( "field %d does not have the correct number of \
|
errorMsg.Printf( wxT( "field %d does not have the correct number of parameters" ),
|
||||||
parameters" ),
|
|
||||||
m_FieldId );
|
m_FieldId );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -192,8 +202,7 @@ parameters" ),
|
||||||
m_Orient = TEXT_ORIENT_VERT;
|
m_Orient = TEXT_ORIENT_VERT;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
errorMsg.Printf( wxT( "field %d text orientation parameter <%c> is \
|
errorMsg.Printf( wxT( "field %d text orientation parameter <%c> is not valid" ),
|
||||||
not valid" ),
|
|
||||||
textOrient );
|
textOrient );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -204,8 +213,7 @@ not valid" ),
|
||||||
m_Attributs |= TEXT_NO_VISIBLE;
|
m_Attributs |= TEXT_NO_VISIBLE;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
errorMsg.Printf( wxT( "field %d text visible parameter <%c> is not \
|
errorMsg.Printf( wxT( "field %d text visible parameter <%c> is not valid" ),
|
||||||
valid" ),
|
|
||||||
textVisible );
|
textVisible );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -223,9 +231,9 @@ valid" ),
|
||||||
m_HJustify = GR_TEXT_HJUSTIFY_RIGHT;
|
m_HJustify = GR_TEXT_HJUSTIFY_RIGHT;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
errorMsg.Printf( wxT( "field %d text horizontal justification \
|
errorMsg.Printf(
|
||||||
parameter <%c> is not valid" ),
|
wxT( "field %d text horizontal justification parameter <%c> is not valid" ),
|
||||||
textHJustify );
|
textHJustify );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -237,9 +245,9 @@ parameter <%c> is not valid" ),
|
||||||
m_VJustify = GR_TEXT_VJUSTIFY_TOP;
|
m_VJustify = GR_TEXT_VJUSTIFY_TOP;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
errorMsg.Printf( wxT( "field %d text vertical justification \
|
errorMsg.Printf(
|
||||||
parameter <%c> is not valid" ),
|
wxT( "field %d text vertical justification parameter <%c> is not valid" ),
|
||||||
textVJustify[0] );
|
textVJustify[0] );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -249,7 +257,15 @@ parameter <%c> is not valid" ),
|
||||||
m_Bold = true;
|
m_Bold = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( m_FieldId >= FIELD1 )
|
// fields in RAM must always have names.
|
||||||
|
if( m_FieldId < MANDATORY_FIELDS )
|
||||||
|
{
|
||||||
|
// Fields in RAM must always have names, because we are trying to get
|
||||||
|
// less dependent on field ids and more dependent on names.
|
||||||
|
// Plus assumptions are made in the field editors.
|
||||||
|
m_Name = TEMPLATE_FIELDNAME::GetDefaultFieldName( m_FieldId );
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
ReadDelimitedText( fieldUserName, line, sizeof( fieldUserName ) );
|
ReadDelimitedText( fieldUserName, line, sizeof( fieldUserName ) );
|
||||||
m_Name = CONV_FROM_UTF8( fieldUserName );
|
m_Name = CONV_FROM_UTF8( fieldUserName );
|
||||||
|
@ -259,7 +275,6 @@ parameter <%c> is not valid" ),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** Function GetPenSize
|
/** Function GetPenSize
|
||||||
* @return the size of the "pen" that be used to draw or plot this item
|
* @return the size of the "pen" that be used to draw or plot this item
|
||||||
*/
|
*/
|
||||||
|
@ -346,7 +361,9 @@ bool LIB_FIELD::HitTest( const wxPoint& refPos )
|
||||||
return HitTest( refPos, 0, DefaultTransformMatrix );
|
return HitTest( refPos, 0, DefaultTransformMatrix );
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Function HitTest
|
|
||||||
|
/**
|
||||||
|
* Function HitTest
|
||||||
* @return true if the point aPosRef is near this object
|
* @return true if the point aPosRef is near this object
|
||||||
* @param aPosRef = a wxPoint to test
|
* @param aPosRef = a wxPoint to test
|
||||||
* @param aThreshold = unused here (TextHitTest calculates its threshold )
|
* @param aThreshold = unused here (TextHitTest calculates its threshold )
|
||||||
|
@ -527,34 +544,3 @@ EDA_Rect LIB_FIELD::GetBoundingBox()
|
||||||
|
|
||||||
return rect;
|
return rect;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function ReturnDefaultFieldName
|
|
||||||
* Return the default field name from its index (REFERENCE, VALUE ..)
|
|
||||||
* FieldDefaultNameList is not static, because we want the text translation
|
|
||||||
* for I18n
|
|
||||||
* @param aFieldNdx = Filed number (>= 0)
|
|
||||||
*/
|
|
||||||
wxString ReturnDefaultFieldName( int aFieldNdx )
|
|
||||||
{
|
|
||||||
// avoid unnecessarily copying wxStrings at runtime.
|
|
||||||
static const wxString defaults[] = {
|
|
||||||
_( "Reference" ), // Reference of part, i.e. "IC21"
|
|
||||||
_( "Value" ), // Value of part, i.e. "3.3K" and name in lib
|
|
||||||
// for lib entries
|
|
||||||
_( "Footprint" ), // Footprint, used by cvpcb or pcbnew, i.e.
|
|
||||||
// "16DIP300"
|
|
||||||
_( "Datasheet" ), // A link to an user document, if wanted
|
|
||||||
};
|
|
||||||
|
|
||||||
if( (unsigned) aFieldNdx <= DATASHEET )
|
|
||||||
return defaults[ aFieldNdx ];
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
wxString ret = _( "Field" );
|
|
||||||
ret << ( aFieldNdx - FIELD1 + 1);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -9,32 +9,19 @@
|
||||||
#include "classes_body_items.h"
|
#include "classes_body_items.h"
|
||||||
|
|
||||||
|
|
||||||
class LIB_FIELD;
|
/**
|
||||||
|
* Class LIB_FIELD
|
||||||
|
* is used in symbol libraries. At least MANDATORY_FIELDS are always present
|
||||||
typedef std::vector< LIB_FIELD > LIB_FIELD_LIST;
|
* in a ram resident library symbol. All constructors must ensure this because
|
||||||
|
* the component property editor assumes it.
|
||||||
|
* @see enum NumFieldType
|
||||||
/* Fields , same as component fields.
|
|
||||||
* can be defined in libraries (mandatory for ref and value, ca be useful for
|
|
||||||
* footprints)
|
|
||||||
* 2 Fields are always defined :
|
|
||||||
* Prefix (U, IC..) with gives the reference in schematic)
|
|
||||||
* Name (74LS00..) used to find the component in libraries, and give the
|
|
||||||
* default value in schematic
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class LIB_FIELD : public LIB_DRAW_ITEM, public EDA_TextStruct
|
class LIB_FIELD : public LIB_DRAW_ITEM, public EDA_TextStruct
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
int m_FieldId; /* 0 = REFERENCE
|
int m_FieldId; ///< @see enum NumFieldType
|
||||||
* 1 = VALUE
|
|
||||||
* 3 = FOOTPRINT (default Footprint)
|
wxString m_Name; ///< Name (not the field text value itself, that is .m_Text)
|
||||||
* 4 = DOCUMENTATION (user doc link)
|
|
||||||
* others = free fields
|
|
||||||
*/
|
|
||||||
wxString m_Name; /* Field Name (not the field text itself, that is
|
|
||||||
* .m_Text) */
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -84,7 +71,8 @@ public:
|
||||||
int aColor, int aDrawMode, void* aData,
|
int aColor, int aDrawMode, void* aData,
|
||||||
const int aTransformMatrix[2][2] );
|
const int aTransformMatrix[2][2] );
|
||||||
|
|
||||||
/** Function IsVisible
|
/**
|
||||||
|
* Function IsVisible
|
||||||
* @return true is this field is visible, false if flagged invisible
|
* @return true is this field is visible, false if flagged invisible
|
||||||
*/
|
*/
|
||||||
bool IsVisible()
|
bool IsVisible()
|
||||||
|
@ -174,4 +162,6 @@ protected:
|
||||||
virtual void DoSetWidth( int width ) { m_Width = width; }
|
virtual void DoSetWidth( int width ) { m_Width = width; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef std::vector< LIB_FIELD > LIB_FIELD_LIST;
|
||||||
|
|
||||||
#endif // CLASS_LIBENTRY_FIELDS_H
|
#endif // CLASS_LIBENTRY_FIELDS_H
|
||||||
|
|
|
@ -28,19 +28,18 @@ class LIB_FIELD;
|
||||||
class SCH_FIELD : public SCH_ITEM, public EDA_TextStruct
|
class SCH_FIELD : public SCH_ITEM, public EDA_TextStruct
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
int m_FieldId; /* Field indicator type (REFERENCE, VALUE or
|
int m_FieldId; ///< Field index, @see enum NumFieldType
|
||||||
* other id) */
|
|
||||||
|
|
||||||
wxString m_Name; /* Field name (ref, value,pcb, sheet, filed 1..
|
|
||||||
* and for fields 1 to 8 the name is editable
|
|
||||||
*/
|
|
||||||
|
|
||||||
bool m_AddExtraText; /* Mainly for REFERENCE, add extra info
|
wxString m_Name;
|
||||||
|
|
||||||
|
bool m_AddExtraText; /**< for REFERENCE, add extra info
|
||||||
* (for REFERENCE: add part selection text */
|
* (for REFERENCE: add part selection text */
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SCH_FIELD( const wxPoint& aPos, int aFieldId, SCH_COMPONENT* aParent,
|
SCH_FIELD( const wxPoint& aPos, int aFieldId, SCH_COMPONENT* aParent,
|
||||||
wxString aName = wxEmptyString );
|
wxString aName = wxEmptyString );
|
||||||
|
|
||||||
~SCH_FIELD();
|
~SCH_FIELD();
|
||||||
|
|
||||||
virtual wxString GetClass() const
|
virtual wxString GetClass() const
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
/**************************************************************/
|
/**************************************************************/
|
||||||
|
|
||||||
#include "fctsys.h"
|
#include "fctsys.h"
|
||||||
|
#include "appl_wxstruct.h"
|
||||||
#include "class_drawpanel.h"
|
#include "class_drawpanel.h"
|
||||||
#include "gr_basic.h"
|
#include "gr_basic.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
@ -63,7 +64,6 @@ SCH_COMPONENT::SCH_COMPONENT( LIB_COMPONENT& libComponent,
|
||||||
const wxPoint& pos, bool setNewItemFlag ) :
|
const wxPoint& pos, bool setNewItemFlag ) :
|
||||||
SCH_ITEM( NULL, TYPE_SCH_COMPONENT )
|
SCH_ITEM( NULL, TYPE_SCH_COMPONENT )
|
||||||
{
|
{
|
||||||
|
|
||||||
Init( pos );
|
Init( pos );
|
||||||
|
|
||||||
m_Multi = unit;
|
m_Multi = unit;
|
||||||
|
@ -74,42 +74,39 @@ SCH_COMPONENT::SCH_COMPONENT( LIB_COMPONENT& libComponent,
|
||||||
if( setNewItemFlag )
|
if( setNewItemFlag )
|
||||||
m_Flags = IS_NEW | IS_MOVED;
|
m_Flags = IS_NEW | IS_MOVED;
|
||||||
|
|
||||||
// Import predefined fields from the library component:
|
// Import user defined fields from the library component:
|
||||||
LIB_FIELD_LIST libFields;
|
LIB_FIELD_LIST libFields;
|
||||||
|
|
||||||
libComponent.GetFields( libFields );
|
libComponent.GetFields( libFields );
|
||||||
|
|
||||||
for( size_t i = 0; i < libFields.size(); i++ )
|
for( LIB_FIELD_LIST::iterator it = libFields.begin(); it!=libFields.end(); ++it )
|
||||||
{
|
{
|
||||||
if( libFields[i].m_Text.IsEmpty() && libFields[i].m_Name.IsEmpty() )
|
// Can no longer insert an empty name, since names are now keys. The
|
||||||
|
// field index is not used beyond the first MANDATORY_FIELDS
|
||||||
|
if( it->m_Name.IsEmpty() )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
int field_idx = libFields[i].m_FieldId;
|
// See if field by same name already exists.
|
||||||
/* Add extra fields if library component has more than the default
|
SCH_FIELD* schField = FindField( it->m_Name );
|
||||||
* number of fields.
|
|
||||||
*/
|
if( !schField )
|
||||||
if( field_idx >= GetFieldCount() )
|
|
||||||
{
|
{
|
||||||
while( field_idx >= GetFieldCount() )
|
SCH_FIELD fld( wxPoint( 0, 0 ), GetFieldCount(), this, it->m_Name );
|
||||||
{
|
schField = AddField( fld );
|
||||||
SCH_FIELD field( wxPoint( 0, 0 ), GetFieldCount(), this,
|
|
||||||
ReturnDefaultFieldName( field_idx ) );
|
|
||||||
AddField( field );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
SCH_FIELD* schField = GetField( field_idx );
|
|
||||||
|
|
||||||
schField->m_Pos = m_Pos + libFields[i].m_Pos;
|
schField->m_Pos = m_Pos + it->m_Pos;
|
||||||
schField->ImportValues( libFields[i] );
|
|
||||||
schField->m_Text = libFields[i].m_Text;
|
schField->ImportValues( *it );
|
||||||
schField->m_Name = ( field_idx < FIELD1 ) ? ReturnDefaultFieldName( field_idx ) :
|
|
||||||
libFields[i].m_Name;
|
schField->m_Text = it->m_Text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
wxString msg = libComponent.GetReferenceField().m_Text;
|
wxString msg = libComponent.GetReferenceField().m_Text;
|
||||||
|
|
||||||
if( msg.IsEmpty() )
|
if( msg.IsEmpty() )
|
||||||
msg = wxT( "U" );
|
msg = wxT( "U" );
|
||||||
|
|
||||||
m_PrefixString = msg;
|
m_PrefixString = msg;
|
||||||
|
|
||||||
// update the reference -- just the prefix for now.
|
// update the reference -- just the prefix for now.
|
||||||
|
@ -147,20 +144,19 @@ SCH_COMPONENT::SCH_COMPONENT( const SCH_COMPONENT& aTemplate ) :
|
||||||
void SCH_COMPONENT::Init( const wxPoint& pos )
|
void SCH_COMPONENT::Init( const wxPoint& pos )
|
||||||
{
|
{
|
||||||
m_Pos = pos;
|
m_Pos = pos;
|
||||||
m_Multi = 0; /* In multi unit chip - which unit to draw. */
|
m_Multi = 0; // In multi unit chip - which unit to draw.
|
||||||
m_Convert = 0; /* De Morgan Handling */
|
m_Convert = 0; // De Morgan Handling
|
||||||
|
|
||||||
/* The rotation/mirror transformation matrix. pos normal */
|
// The rotation/mirror transformation matrix. pos normal
|
||||||
m_Transform[0][0] = 1;
|
m_Transform[0][0] = 1;
|
||||||
m_Transform[0][1] = 0;
|
m_Transform[0][1] = 0;
|
||||||
m_Transform[1][0] = 0;
|
m_Transform[1][0] = 0;
|
||||||
m_Transform[1][1] = -1;
|
m_Transform[1][1] = -1;
|
||||||
|
|
||||||
m_Fields.reserve( DEFAULT_NUMBER_OF_FIELDS );
|
// construct only the mandatory fields, which are the first 4 only.
|
||||||
|
for( int i = 0; i < MANDATORY_FIELDS; ++i )
|
||||||
for( int i = 0; i < DEFAULT_NUMBER_OF_FIELDS; ++i )
|
|
||||||
{
|
{
|
||||||
SCH_FIELD field( pos, i, this, ReturnDefaultFieldName( i ) );
|
SCH_FIELD field( pos, i, this, TEMPLATE_FIELDNAME::GetDefaultFieldName( i ) );
|
||||||
|
|
||||||
if( i==REFERENCE )
|
if( i==REFERENCE )
|
||||||
field.SetLayer( LAYER_REFERENCEPART );
|
field.SetLayer( LAYER_REFERENCEPART );
|
||||||
|
@ -300,7 +296,7 @@ wxString SCH_COMPONENT::ReturnFieldName( int aFieldNdx ) const
|
||||||
if( !field->m_Name.IsEmpty() )
|
if( !field->m_Name.IsEmpty() )
|
||||||
return field->m_Name;
|
return field->m_Name;
|
||||||
else
|
else
|
||||||
return ReturnDefaultFieldName( aFieldNdx );
|
return TEMPLATE_FIELDNAME::GetDefaultFieldName( aFieldNdx );
|
||||||
}
|
}
|
||||||
|
|
||||||
return wxEmptyString;
|
return wxEmptyString;
|
||||||
|
@ -504,14 +500,27 @@ SCH_FIELD* SCH_COMPONENT::GetField( int aFieldNdx ) const
|
||||||
|
|
||||||
wxASSERT( field );
|
wxASSERT( field );
|
||||||
|
|
||||||
// use case to remove const-ness
|
// use cast to remove const-ness
|
||||||
return (SCH_FIELD*) field;
|
return (SCH_FIELD*) field;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SCH_COMPONENT::AddField( const SCH_FIELD& aField )
|
SCH_FIELD* SCH_COMPONENT::AddField( const SCH_FIELD& aField )
|
||||||
{
|
{
|
||||||
|
int newNdx = m_Fields.size();
|
||||||
m_Fields.push_back( aField );
|
m_Fields.push_back( aField );
|
||||||
|
return &m_Fields[newNdx];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SCH_FIELD* SCH_COMPONENT::FindField( const wxString& aFieldName )
|
||||||
|
{
|
||||||
|
for( unsigned i=0; i<m_Fields.size(); ++i )
|
||||||
|
{
|
||||||
|
if( aFieldName == m_Fields[i].m_Name )
|
||||||
|
return &m_Fields[i];
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1038,17 +1047,34 @@ bool SCH_COMPONENT::Save( FILE* f ) const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for( int fieldNdx = 0; fieldNdx < GetFieldCount(); ++fieldNdx )
|
// update the ugly field index, which I would like to see go away someday soon.
|
||||||
|
for( unsigned i=0; i<m_Fields.size(); ++i )
|
||||||
{
|
{
|
||||||
SCH_FIELD* field = GetField( fieldNdx );
|
SCH_FIELD* fld = GetField( i );
|
||||||
wxString defaultName = ReturnDefaultFieldName( fieldNdx );
|
fld->m_FieldId = i; // we don't need field Ids, please be gone.
|
||||||
|
}
|
||||||
|
|
||||||
// only save the field if there is a value in the field or if field name
|
// Fixed fields:
|
||||||
// is different than the default field name
|
// Save fixed fields which are non blank.
|
||||||
if( field->m_Text.IsEmpty() && defaultName == field->m_Name )
|
for( unsigned i=0; i<MANDATORY_FIELDS; ++i )
|
||||||
continue;
|
{
|
||||||
|
SCH_FIELD* fld = GetField( i );
|
||||||
|
if( !fld->m_Text.IsEmpty() )
|
||||||
|
{
|
||||||
|
if( !fld->Save( f ) )
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if( !field->Save( f ) )
|
// User defined fields:
|
||||||
|
// The *policy* about which user defined fields are part of a symbol is now
|
||||||
|
// only in the dialog editors. No policy should be enforced here, simply
|
||||||
|
// save all the user defined fields, they are present because a dialog editor
|
||||||
|
// thought they should be. If you disagree, go fix the dialog editors.
|
||||||
|
for( unsigned i=MANDATORY_FIELDS; i<m_Fields.size(); ++i )
|
||||||
|
{
|
||||||
|
SCH_FIELD* fld = GetField( i );
|
||||||
|
if( !fld->Save( f ) )
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,32 +31,6 @@ struct Error
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Enum NumFieldType
|
|
||||||
* is the numbered set of all fields a SCH_COMPONENT can hold
|
|
||||||
* Note more than 8 user fields are allowed, but for efficiency reasons
|
|
||||||
* the defualt number of users fields is 8
|
|
||||||
*/
|
|
||||||
enum NumFieldType {
|
|
||||||
REFERENCE = 0, ///< Field Reference of part, i.e. "IC21"
|
|
||||||
VALUE, ///< Field Value of part, i.e. "3.3K"
|
|
||||||
FOOTPRINT, ///< Field Name Module PCB, i.e. "16DIP300"
|
|
||||||
DATASHEET, ///< name of datasheet
|
|
||||||
|
|
||||||
FIELD1,
|
|
||||||
FIELD2,
|
|
||||||
FIELD3,
|
|
||||||
FIELD4,
|
|
||||||
FIELD5,
|
|
||||||
FIELD6,
|
|
||||||
FIELD7,
|
|
||||||
FIELD8,
|
|
||||||
|
|
||||||
DEFAULT_NUMBER_OF_FIELDS
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/// A container for several SCH_FIELD items
|
/// A container for several SCH_FIELD items
|
||||||
typedef std::vector<SCH_FIELD> SCH_FIELDS;
|
typedef std::vector<SCH_FIELD> SCH_FIELDS;
|
||||||
|
|
||||||
|
@ -230,6 +204,8 @@ public:
|
||||||
*/
|
*/
|
||||||
EDA_Rect GetBoundingBox();
|
EDA_Rect GetBoundingBox();
|
||||||
|
|
||||||
|
//-----<Fields>-----------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function ReturnFieldName
|
* Function ReturnFieldName
|
||||||
* returns the Field name given a field index like (REFERENCE, VALUE ..)
|
* returns the Field name given a field index like (REFERENCE, VALUE ..)
|
||||||
|
@ -241,7 +217,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Function GetField
|
* Function GetField
|
||||||
* returns a field.
|
* returns a field.
|
||||||
* @param aFieldNdx An index into the array of fields
|
* @param aFieldNdx An index into the array of fields, not a field id.
|
||||||
* @return SCH_FIELD* - the field value or NULL if does not exist
|
* @return SCH_FIELD* - the field value or NULL if does not exist
|
||||||
*/
|
*/
|
||||||
SCH_FIELD* GetField( int aFieldNdx ) const;
|
SCH_FIELD* GetField( int aFieldNdx ) const;
|
||||||
|
@ -251,14 +227,22 @@ public:
|
||||||
* adds a field to the component. The field is copied as it is put into
|
* adds a field to the component. The field is copied as it is put into
|
||||||
* the component.
|
* the component.
|
||||||
* @param aField A const reference to the SCH_FIELD to add.
|
* @param aField A const reference to the SCH_FIELD to add.
|
||||||
|
* @return SCH_FIELD* - the newly inserted field.
|
||||||
*/
|
*/
|
||||||
void AddField( const SCH_FIELD& aField );
|
SCH_FIELD* AddField( const SCH_FIELD& aField );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function FindField
|
||||||
|
* searches for SCH_FIELD with \a aFieldName and returns it if found, else NULL.
|
||||||
|
*/
|
||||||
|
SCH_FIELD* FindField( const wxString& aFieldName );
|
||||||
|
|
||||||
void SetFields( const SCH_FIELDS& aFields )
|
void SetFields( const SCH_FIELDS& aFields )
|
||||||
{
|
{
|
||||||
m_Fields = aFields; // vector copying, length is changed possibly
|
m_Fields = aFields; // vector copying, length is changed possibly
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//-----</Fields>----------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function GetFieldCount
|
* Function GetFieldCount
|
||||||
|
|
|
@ -3,4 +3,4 @@
|
||||||
* library file DSN lexer which will replace the current library and library
|
* library file DSN lexer which will replace the current library and library
|
||||||
* document file formats.
|
* document file formats.
|
||||||
*/
|
*/
|
||||||
#include "cmp_library_base.cpp"
|
#include "cmp_library_keywords.cpp"
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
#include "fctsys.h"
|
#include "fctsys.h"
|
||||||
|
#include "appl_wxstruct.h"
|
||||||
#include "gr_basic.h"
|
#include "gr_basic.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "class_drawpanel.h"
|
#include "class_drawpanel.h"
|
||||||
|
@ -111,22 +112,6 @@ DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::DIALOG_EDIT_COMPONENT_IN_SCHEMATIC( wxWindow
|
||||||
{
|
{
|
||||||
GetSizer()->SetSizeHints( this );
|
GetSizer()->SetSizeHints( this );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::reinitializeFieldsIdAndDefaultNames( )
|
|
||||||
{
|
|
||||||
for( unsigned new_id = FIELD1; new_id < m_FieldsBuf.size(); new_id++ )
|
|
||||||
{
|
|
||||||
unsigned old_id = m_FieldsBuf[new_id].m_FieldId;
|
|
||||||
if ( old_id != new_id )
|
|
||||||
{
|
|
||||||
if ( m_FieldsBuf[new_id].m_Name == ReturnDefaultFieldName( old_id ) )
|
|
||||||
m_FieldsBuf[new_id].m_Name = ReturnDefaultFieldName( new_id );
|
|
||||||
m_FieldsBuf[new_id].m_FieldId = new_id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -242,7 +227,7 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::OnOKButtonClick( wxCommandEvent& event
|
||||||
|
|
||||||
copyPanelToOptions();
|
copyPanelToOptions();
|
||||||
|
|
||||||
/* save old cmp in undo list if not already in edit, or moving ... */
|
// save old cmp in undo list if not already in edit, or moving ...
|
||||||
if( m_Cmp->m_Flags == 0 )
|
if( m_Cmp->m_Flags == 0 )
|
||||||
m_Parent->SaveCopyInUndoList( m_Cmp, UR_CHANGED );
|
m_Parent->SaveCopyInUndoList( m_Cmp, UR_CHANGED );
|
||||||
|
|
||||||
|
@ -252,10 +237,11 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::OnOKButtonClick( wxCommandEvent& event
|
||||||
m_FieldsBuf[i].m_Pos += m_Cmp->m_Pos;
|
m_FieldsBuf[i].m_Pos += m_Cmp->m_Pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
// delete any fields with no name
|
// delete any fields with no name or no value before we copy all of m_FieldsBuf
|
||||||
for( unsigned i = FIELD1; i<m_FieldsBuf.size(); )
|
// back into the component
|
||||||
|
for( unsigned i = MANDATORY_FIELDS; i<m_FieldsBuf.size(); )
|
||||||
{
|
{
|
||||||
if( m_FieldsBuf[i].m_Name.IsEmpty() )
|
if( m_FieldsBuf[i].m_Name.IsEmpty() || m_FieldsBuf[i].m_Text.IsEmpty() )
|
||||||
{
|
{
|
||||||
m_FieldsBuf.erase( m_FieldsBuf.begin() + i );
|
m_FieldsBuf.erase( m_FieldsBuf.begin() + i );
|
||||||
continue;
|
continue;
|
||||||
|
@ -278,7 +264,6 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::OnOKButtonClick( wxCommandEvent& event
|
||||||
// reference.
|
// reference.
|
||||||
m_Cmp->SetRef( m_Parent->GetSheet(), m_FieldsBuf[REFERENCE].m_Text );
|
m_Cmp->SetRef( m_Parent->GetSheet(), m_FieldsBuf[REFERENCE].m_Text );
|
||||||
|
|
||||||
|
|
||||||
m_Parent->OnModify( );
|
m_Parent->OnModify( );
|
||||||
|
|
||||||
m_Parent->TestDanglingEnds( m_Parent->GetScreen()->EEDrawList, NULL );
|
m_Parent->TestDanglingEnds( m_Parent->GetScreen()->EEDrawList, NULL );
|
||||||
|
@ -303,7 +288,7 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::addFieldButtonHandler( wxCommandEvent&
|
||||||
blank.m_Orient = m_FieldsBuf[REFERENCE].m_Orient;
|
blank.m_Orient = m_FieldsBuf[REFERENCE].m_Orient;
|
||||||
|
|
||||||
m_FieldsBuf.push_back( blank );
|
m_FieldsBuf.push_back( blank );
|
||||||
m_FieldsBuf[fieldNdx].m_Name = ReturnDefaultFieldName(fieldNdx);
|
m_FieldsBuf[fieldNdx].m_Name = TEMPLATE_FIELDNAME::GetDefaultFieldName(fieldNdx);
|
||||||
|
|
||||||
m_skipCopyFromPanel = true;
|
m_skipCopyFromPanel = true;
|
||||||
setRowItem( fieldNdx, m_FieldsBuf[fieldNdx] );
|
setRowItem( fieldNdx, m_FieldsBuf[fieldNdx] );
|
||||||
|
@ -320,7 +305,7 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::deleteFieldButtonHandler( wxCommandEven
|
||||||
if( fieldNdx >= m_FieldsBuf.size() ) // traps the -1 case too
|
if( fieldNdx >= m_FieldsBuf.size() ) // traps the -1 case too
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if( fieldNdx < FIELD1 )
|
if( fieldNdx < MANDATORY_FIELDS )
|
||||||
{
|
{
|
||||||
wxBell();
|
wxBell();
|
||||||
return;
|
return;
|
||||||
|
@ -333,8 +318,6 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::deleteFieldButtonHandler( wxCommandEven
|
||||||
if( fieldNdx >= m_FieldsBuf.size() )
|
if( fieldNdx >= m_FieldsBuf.size() )
|
||||||
--fieldNdx;
|
--fieldNdx;
|
||||||
|
|
||||||
// Reinitialize fields IDs and default names:
|
|
||||||
reinitializeFieldsIdAndDefaultNames();
|
|
||||||
updateDisplay( );
|
updateDisplay( );
|
||||||
|
|
||||||
setSelectedFieldNdx( fieldNdx );
|
setSelectedFieldNdx( fieldNdx );
|
||||||
|
@ -342,14 +325,14 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::deleteFieldButtonHandler( wxCommandEven
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC:: moveUpButtonHandler( wxCommandEvent& event )
|
void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::moveUpButtonHandler( wxCommandEvent& event )
|
||||||
{
|
{
|
||||||
unsigned fieldNdx = getSelectedFieldNdx();
|
unsigned fieldNdx = getSelectedFieldNdx();
|
||||||
|
|
||||||
if( fieldNdx >= m_FieldsBuf.size() ) // traps the -1 case too
|
if( fieldNdx >= m_FieldsBuf.size() ) // traps the -1 case too
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if( fieldNdx <= FIELD1 )
|
if( fieldNdx <= MANDATORY_FIELDS )
|
||||||
{
|
{
|
||||||
wxBell();
|
wxBell();
|
||||||
return;
|
return;
|
||||||
|
@ -371,8 +354,6 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC:: moveUpButtonHandler( wxCommandEvent& e
|
||||||
m_FieldsBuf[fieldNdx] = tmp;
|
m_FieldsBuf[fieldNdx] = tmp;
|
||||||
setRowItem( fieldNdx, tmp );
|
setRowItem( fieldNdx, tmp );
|
||||||
|
|
||||||
// Reinitialize fields IDs and default names:
|
|
||||||
reinitializeFieldsIdAndDefaultNames();
|
|
||||||
updateDisplay( );
|
updateDisplay( );
|
||||||
|
|
||||||
m_skipCopyFromPanel = true;
|
m_skipCopyFromPanel = true;
|
||||||
|
@ -408,10 +389,14 @@ int DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::getSelectedFieldNdx()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SCH_FIELD* DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::findField( const wxString& aFieldName )
|
||||||
static bool SortFieldsById(const SCH_FIELD& item1, const SCH_FIELD& item2)
|
|
||||||
{
|
{
|
||||||
return item1.m_FieldId < item2.m_FieldId;
|
for( unsigned i=0; i<m_FieldsBuf.size(); ++i )
|
||||||
|
{
|
||||||
|
if( aFieldName == m_FieldsBuf[i].m_Name )
|
||||||
|
return &m_FieldsBuf[i];
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -419,6 +404,18 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::InitBuffers( SCH_COMPONENT* aComponent
|
||||||
{
|
{
|
||||||
m_Cmp = aComponent;
|
m_Cmp = aComponent;
|
||||||
|
|
||||||
|
/* We have 3 component related field lists to be aware of: 1) UI
|
||||||
|
presentation, 2) fields in component ram copy, and 3) fields recorded
|
||||||
|
with component on disk. m_FieldsBuf is the list of UI fields, and this
|
||||||
|
list is not the same as the list which is in the component, which is
|
||||||
|
also not the same as the list on disk. All 3 lists are potentially
|
||||||
|
different. In the UI we choose to preserve the order of the first
|
||||||
|
MANDATORY_FIELDS which are sometimes called fixed fields. Then we append
|
||||||
|
the template fieldnames in the exact same order as the template
|
||||||
|
fieldname editor shows them. Then we append any user defined fieldnames
|
||||||
|
which came from the component.
|
||||||
|
*/
|
||||||
|
|
||||||
m_LibEntry = CMP_LIBRARY::FindLibraryComponent( m_Cmp->m_ChipName );
|
m_LibEntry = CMP_LIBRARY::FindLibraryComponent( m_Cmp->m_ChipName );
|
||||||
|
|
||||||
#if 0 && defined(DEBUG)
|
#if 0 && defined(DEBUG)
|
||||||
|
@ -430,28 +427,85 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::InitBuffers( SCH_COMPONENT* aComponent
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// copy all the fields to a work area
|
// When this code was written, all field constructors ensure that the fixed fields
|
||||||
m_FieldsBuf = aComponent->m_Fields;
|
// are all present within a component. So we can knowingly copy them over
|
||||||
|
// in the normal order. Copy only the fixed fields at first.
|
||||||
|
// Please do not break the field constructors.
|
||||||
|
|
||||||
|
m_FieldsBuf.clear();
|
||||||
|
for( int i=0; i<MANDATORY_FIELDS; ++i )
|
||||||
|
{
|
||||||
|
m_FieldsBuf.push_back( aComponent->m_Fields[i] );
|
||||||
|
|
||||||
|
// make the editable field position relative to the component
|
||||||
|
m_FieldsBuf[i].m_Pos -= m_Cmp->m_Pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add template fieldnames:
|
||||||
|
// Now copy in the template fields, in the order that they are present in the
|
||||||
|
// template field editor UI.
|
||||||
|
const TEMPLATE_FIELDNAMES& tfnames = m_Parent->GetTemplateFieldNames();
|
||||||
|
for( TEMPLATE_FIELDNAMES::const_iterator it = tfnames.begin(); it!=tfnames.end(); ++it )
|
||||||
|
{
|
||||||
|
// add a new field unconditionally to the UI only
|
||||||
|
SCH_FIELD fld( wxPoint(0,0), -1 /* id is a relic */, NULL, it->m_Name );
|
||||||
|
|
||||||
|
// See if field by same name already exists in component.
|
||||||
|
SCH_FIELD* schField = aComponent->FindField( it->m_Name );
|
||||||
|
|
||||||
|
// If the field does not already exist in the component, then we
|
||||||
|
// use defaults from the template fieldname, otherwise the original
|
||||||
|
// values from the component will be set.
|
||||||
|
if( !schField )
|
||||||
|
{
|
||||||
|
if( !it->m_Visible )
|
||||||
|
fld.m_Attributs |= TEXT_NO_VISIBLE;
|
||||||
|
else
|
||||||
|
fld.m_Attributs &= ~TEXT_NO_VISIBLE;
|
||||||
|
|
||||||
|
fld.m_Text = it->m_Value; // empty? ok too.
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fld = *schField;
|
||||||
|
|
||||||
|
// make the editable field position relative to the component
|
||||||
|
fld.m_Pos -= m_Cmp->m_Pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_FieldsBuf.push_back( fld );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lastly, append any original fields from the component which were not added
|
||||||
|
// from the set of fixed fields nor from the set of template fields.
|
||||||
|
for( unsigned i=MANDATORY_FIELDS; i<aComponent->m_Fields.size(); ++i )
|
||||||
|
{
|
||||||
|
SCH_FIELD* cmp = &aComponent->m_Fields[i];
|
||||||
|
SCH_FIELD* buf = findField( cmp->m_Name );
|
||||||
|
|
||||||
|
if( !buf )
|
||||||
|
{
|
||||||
|
int newNdx = m_FieldsBuf.size();
|
||||||
|
m_FieldsBuf.push_back( *cmp );
|
||||||
|
|
||||||
|
// make the editable field position relative to the component
|
||||||
|
m_FieldsBuf[newNdx].m_Pos -= m_Cmp->m_Pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Sort files by field id,if they are not entered by id
|
|
||||||
sort(m_FieldsBuf.begin(), m_FieldsBuf.end(), SortFieldsById);
|
|
||||||
|
|
||||||
#if 0 && defined(DEBUG)
|
#if 0 && defined(DEBUG)
|
||||||
for( unsigned i = 0; i<m_FieldsBuf.size(); ++i )
|
for( unsigned i = 0; i<m_FieldsBuf.size(); ++i )
|
||||||
{
|
{
|
||||||
printf( "m_FieldsBuf[%d] (x=%d, y=%d)\n", i, m_FieldsBuf[i].m_Pos.x,
|
printf( "m_FieldsBuf[%d] (x=%-3d, y=%-3d) name:%s\n", i, m_FieldsBuf[i].m_Pos.x,
|
||||||
m_FieldsBuf[i].m_Pos.y );
|
m_FieldsBuf[i].m_Pos.y, CONV_TO_UTF8(m_FieldsBuf[i].m_Name) );
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m_FieldsBuf[REFERENCE].m_Text = m_Cmp->GetRef( m_Parent->GetSheet() );
|
m_FieldsBuf[REFERENCE].m_Text = m_Cmp->GetRef( m_Parent->GetSheet() );
|
||||||
|
|
||||||
for( unsigned i = 0; i<m_FieldsBuf.size(); ++i )
|
for( unsigned i = 0; i<m_FieldsBuf.size(); ++i )
|
||||||
{
|
{
|
||||||
// make the editable field position relative to the component
|
|
||||||
m_FieldsBuf[i].m_Pos -= m_Cmp->m_Pos;
|
|
||||||
|
|
||||||
setRowItem( i, m_FieldsBuf[i] );
|
setRowItem( i, m_FieldsBuf[i] );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -512,22 +566,27 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::copySelectedFieldToPanel()
|
||||||
rotateCheckBox->SetValue( field.m_Orient == TEXT_ORIENT_VERT );
|
rotateCheckBox->SetValue( field.m_Orient == TEXT_ORIENT_VERT );
|
||||||
|
|
||||||
int style = 0;
|
int style = 0;
|
||||||
|
|
||||||
if( field.m_Italic )
|
if( field.m_Italic )
|
||||||
style = 1;
|
style = 1;
|
||||||
|
|
||||||
if( field.m_Bold )
|
if( field.m_Bold )
|
||||||
style |= 2;
|
style |= 2;
|
||||||
|
|
||||||
m_StyleRadioBox->SetSelection( style );
|
m_StyleRadioBox->SetSelection( style );
|
||||||
|
|
||||||
fieldNameTextCtrl->SetValue( field.m_Name );
|
fieldNameTextCtrl->SetValue( field.m_Name );
|
||||||
|
|
||||||
// if fieldNdx == REFERENCE, VALUE, FOOTPRINT, or DATASHEET, then
|
// the names of the fixed fields are not editable, others are.
|
||||||
//disable editing
|
fieldNameTextCtrl->Enable( fieldNdx >= MANDATORY_FIELDS );
|
||||||
fieldNameTextCtrl->Enable( fieldNdx >= FIELD1 );
|
fieldNameTextCtrl->SetEditable( fieldNdx >= MANDATORY_FIELDS );
|
||||||
fieldNameTextCtrl->SetEditable( fieldNdx >= FIELD1 );
|
|
||||||
moveUpButton->Enable( fieldNdx >= FIELD1 ); /* disable move up button
|
// only user defined fields may be moved, and not the top most user defined
|
||||||
* for non moveable fields */
|
// field since it would be moving up into the fixed fields, > not >=
|
||||||
// if fieldNdx == REFERENCE, VALUE, then disable delete button
|
moveUpButton->Enable( fieldNdx > MANDATORY_FIELDS );
|
||||||
deleteFieldButton->Enable( fieldNdx > VALUE );
|
|
||||||
|
// may only delete user defined fields
|
||||||
|
deleteFieldButton->Enable( fieldNdx >= MANDATORY_FIELDS );
|
||||||
|
|
||||||
fieldValueTextCtrl->SetValue( field.m_Text );
|
fieldValueTextCtrl->SetValue( field.m_Text );
|
||||||
|
|
||||||
|
@ -554,11 +613,12 @@ void DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::copySelectedFieldToPanel()
|
||||||
rotateCheckBox->SetValue( m_FieldsBuf[REFERENCE].m_Orient == TEXT_ORIENT_VERT );
|
rotateCheckBox->SetValue( m_FieldsBuf[REFERENCE].m_Orient == TEXT_ORIENT_VERT );
|
||||||
|
|
||||||
coord.x = m_FieldsBuf[REFERENCE].m_Pos.x
|
coord.x = m_FieldsBuf[REFERENCE].m_Pos.x
|
||||||
+ ( fieldNdx - FIELD1 + 1 ) * 100;
|
+ ( fieldNdx - MANDATORY_FIELDS + 1 ) * 100;
|
||||||
coord.y = m_FieldsBuf[REFERENCE].m_Pos.y
|
|
||||||
+ ( fieldNdx - FIELD1 + 1 ) * 100;
|
|
||||||
|
|
||||||
// coord can compute negative if field is < FIELD1, e.g. FOOTPRINT.
|
coord.y = m_FieldsBuf[REFERENCE].m_Pos.y
|
||||||
|
+ ( fieldNdx - MANDATORY_FIELDS + 1 ) * 100;
|
||||||
|
|
||||||
|
// coord can compute negative if field is < MANDATORY_FIELDS, e.g. FOOTPRINT.
|
||||||
// That is ok, we basically don't want all the new empty fields on
|
// That is ok, we basically don't want all the new empty fields on
|
||||||
// top of each other.
|
// top of each other.
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,6 +67,8 @@ class DIALOG_EDIT_COMPONENT_IN_SCHEMATIC : public DIALOG_EDIT_COMPONENT_IN_SCHEM
|
||||||
void deleteFieldButtonHandler( wxCommandEvent& event );
|
void deleteFieldButtonHandler( wxCommandEvent& event );
|
||||||
void moveUpButtonHandler( wxCommandEvent& event );
|
void moveUpButtonHandler( wxCommandEvent& event );
|
||||||
|
|
||||||
|
SCH_FIELD* findField( const wxString& aFieldName );
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
@ -92,12 +94,6 @@ private:
|
||||||
for( unsigned ii = FIELD1; ii<m_FieldsBuf.size(); ii++ )
|
for( unsigned ii = FIELD1; ii<m_FieldsBuf.size(); ii++ )
|
||||||
setRowItem( ii, m_FieldsBuf[ii] );
|
setRowItem( ii, m_FieldsBuf[ii] );
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Function reinitializeFieldsIdAndDefaultNames
|
|
||||||
* Calculates the field id and default name, after deleting a field
|
|
||||||
* or moving a field
|
|
||||||
*/
|
|
||||||
void reinitializeFieldsIdAndDefaultNames();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // __dialog_edit_component_in_schematic__
|
#endif // __dialog_edit_component_in_schematic__
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
#include "fctsys.h"
|
#include "fctsys.h"
|
||||||
|
#include "appl_wxstruct.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "confirm.h"
|
#include "confirm.h"
|
||||||
#include "class_drawpanel.h"
|
#include "class_drawpanel.h"
|
||||||
|
@ -20,8 +21,8 @@
|
||||||
// Local variables:
|
// Local variables:
|
||||||
static int s_SelectedRow;
|
static int s_SelectedRow;
|
||||||
|
|
||||||
#define COLUMN_FIELD_NAME 0
|
#define COLUMN_FIELD_NAME 0
|
||||||
#define COLUMN_TEXT 1
|
#define COLUMN_TEXT 1
|
||||||
|
|
||||||
/*****************************************************************************************/
|
/*****************************************************************************************/
|
||||||
class DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB : public DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB_BASE
|
class DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB : public DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB_BASE
|
||||||
|
@ -29,8 +30,8 @@ class DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB : public DIALOG_EDIT_LIBENTRY_FIELDS_IN
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
WinEDA_LibeditFrame* m_Parent;
|
WinEDA_LibeditFrame* m_Parent;
|
||||||
LIB_COMPONENT* m_LibEntry;
|
LIB_COMPONENT* m_LibEntry;
|
||||||
bool m_skipCopyFromPanel;
|
bool m_skipCopyFromPanel;
|
||||||
|
|
||||||
/// a copy of the edited component's LIB_FIELDs
|
/// a copy of the edited component's LIB_FIELDs
|
||||||
std::vector <LIB_FIELD> m_FieldsBuf;
|
std::vector <LIB_FIELD> m_FieldsBuf;
|
||||||
|
@ -63,7 +64,14 @@ private:
|
||||||
* sets up to edit the given component.
|
* sets up to edit the given component.
|
||||||
* @param aComponent The component to edit.
|
* @param aComponent The component to edit.
|
||||||
*/
|
*/
|
||||||
void InitBuffers( void );
|
void InitBuffers();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function findField
|
||||||
|
* searches m_FieldsBuf and returns a LIB_FIELD with \a aFieldName or NULL if
|
||||||
|
* not found.
|
||||||
|
*/
|
||||||
|
LIB_FIELD* findField( const wxString& aFieldName );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function copySelectedFieldToPanel
|
* Function copySelectedFieldToPanel
|
||||||
|
@ -81,21 +89,16 @@ private:
|
||||||
bool copyPanelToSelectedField();
|
bool copyPanelToSelectedField();
|
||||||
void setRowItem( int aFieldNdx, const LIB_FIELD& aField );
|
void setRowItem( int aFieldNdx, const LIB_FIELD& aField );
|
||||||
|
|
||||||
/** Function updateDisplay
|
/**
|
||||||
|
* Function updateDisplay
|
||||||
* update the listbox showing fields, according to the fields texts
|
* update the listbox showing fields, according to the fields texts
|
||||||
* must be called after a text change in fields, if this change is not an edition
|
* must be called after a text change in fields, if this change is not an edition
|
||||||
*/
|
*/
|
||||||
void updateDisplay( )
|
void updateDisplay( )
|
||||||
{
|
{
|
||||||
for( unsigned ii = FIELD1; ii<m_FieldsBuf.size(); ii++ )
|
for( unsigned ii = MANDATORY_FIELDS; ii<m_FieldsBuf.size(); ii++ )
|
||||||
setRowItem( ii, m_FieldsBuf[ii] );
|
setRowItem( ii, m_FieldsBuf[ii] );
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Function reinitializeFieldsIdAndDefaultNames
|
|
||||||
* Calculates the field id and default name, after deleting a field
|
|
||||||
* or moving a field
|
|
||||||
*/
|
|
||||||
void reinitializeFieldsIdAndDefaultNames();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -223,8 +226,8 @@ void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::OnOKButtonClick( wxCommandEvent& event
|
||||||
if( newvalue->CmpNoCase( m_LibEntry->m_AliasList[i] ) == 0 )
|
if( newvalue->CmpNoCase( m_LibEntry->m_AliasList[i] ) == 0 )
|
||||||
{
|
{
|
||||||
wxString msg;
|
wxString msg;
|
||||||
msg.Printf( _( "A new name is entered for this component\nAn \
|
msg.Printf( _( "A new name is entered for this component\n"
|
||||||
alias %s already exists!\nCannot update this component" ),
|
"An alias %s already exists!\nCannot update this component" ),
|
||||||
newvalue->GetData() );
|
newvalue->GetData() );
|
||||||
DisplayError( this, msg );
|
DisplayError( this, msg );
|
||||||
return;
|
return;
|
||||||
|
@ -234,10 +237,11 @@ alias %s already exists!\nCannot update this component" ),
|
||||||
/* save old cmp in undo list */
|
/* save old cmp in undo list */
|
||||||
m_Parent->SaveCopyInUndoList( m_LibEntry, IS_CHANGED );
|
m_Parent->SaveCopyInUndoList( m_LibEntry, IS_CHANGED );
|
||||||
|
|
||||||
// delete any fields with no name
|
// delete any fields with no name or no value before we copy all of m_FieldsBuf
|
||||||
for( unsigned i = FIELD1; i < m_FieldsBuf.size(); )
|
// back into the component
|
||||||
|
for( unsigned i = MANDATORY_FIELDS; i < m_FieldsBuf.size(); )
|
||||||
{
|
{
|
||||||
if( m_FieldsBuf[i].m_Name.IsEmpty() )
|
if( m_FieldsBuf[i].m_Name.IsEmpty() || m_FieldsBuf[i].m_Text.IsEmpty() )
|
||||||
{
|
{
|
||||||
m_FieldsBuf.erase( m_FieldsBuf.begin() + i );
|
m_FieldsBuf.erase( m_FieldsBuf.begin() + i );
|
||||||
continue;
|
continue;
|
||||||
|
@ -246,7 +250,17 @@ alias %s already exists!\nCannot update this component" ),
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
|
||||||
// copy all the fields back, and change the length of m_Fields.
|
#if defined(DEBUG)
|
||||||
|
for( unsigned i=0; i<m_FieldsBuf.size(); ++i )
|
||||||
|
{
|
||||||
|
printf( "save[%d].name:'%s' value:'%s'\n", i,
|
||||||
|
CONV_TO_UTF8( m_FieldsBuf[i].m_Name ),
|
||||||
|
CONV_TO_UTF8( m_FieldsBuf[i].m_Text )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// copy all the fields back, fully replacing any previous fields
|
||||||
m_LibEntry->SetFields( m_FieldsBuf );
|
m_LibEntry->SetFields( m_FieldsBuf );
|
||||||
|
|
||||||
m_Parent->OnModify( );
|
m_Parent->OnModify( );
|
||||||
|
@ -255,27 +269,13 @@ alias %s already exists!\nCannot update this component" ),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************/
|
|
||||||
void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::reinitializeFieldsIdAndDefaultNames( )
|
|
||||||
/*****************************************************************************/
|
|
||||||
{
|
|
||||||
for( unsigned new_id = FIELD1; new_id < m_FieldsBuf.size(); new_id++ )
|
|
||||||
{
|
|
||||||
unsigned old_id = m_FieldsBuf[new_id].m_FieldId;
|
|
||||||
if ( old_id != new_id )
|
|
||||||
{
|
|
||||||
if ( m_FieldsBuf[new_id].m_Name == ReturnDefaultFieldName( old_id ) )
|
|
||||||
m_FieldsBuf[new_id].m_Name = ReturnDefaultFieldName( new_id );
|
|
||||||
m_FieldsBuf[new_id].m_FieldId = new_id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************************/
|
/**************************************************************************************/
|
||||||
void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::addFieldButtonHandler( wxCommandEvent& event )
|
void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::addFieldButtonHandler( wxCommandEvent& event )
|
||||||
/**************************************************************************************/
|
/**************************************************************************************/
|
||||||
{
|
{
|
||||||
|
WinEDA_SchematicFrame* frame;
|
||||||
|
frame = (WinEDA_SchematicFrame*) wxGetApp().GetTopWindow();
|
||||||
|
|
||||||
// in case m_FieldsBuf[REFERENCE].m_Orient has changed on screen only, grab
|
// in case m_FieldsBuf[REFERENCE].m_Orient has changed on screen only, grab
|
||||||
// screen contents.
|
// screen contents.
|
||||||
if( !copyPanelToSelectedField() )
|
if( !copyPanelToSelectedField() )
|
||||||
|
@ -286,7 +286,7 @@ void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::addFieldButtonHandler( wxCommandEvent&
|
||||||
LIB_FIELD blank( fieldNdx );
|
LIB_FIELD blank( fieldNdx );
|
||||||
|
|
||||||
m_FieldsBuf.push_back( blank );
|
m_FieldsBuf.push_back( blank );
|
||||||
m_FieldsBuf[fieldNdx].m_Name = ReturnDefaultFieldName(fieldNdx);
|
m_FieldsBuf[fieldNdx].m_Name = TEMPLATE_FIELDNAME::GetDefaultFieldName(fieldNdx);
|
||||||
|
|
||||||
setRowItem( fieldNdx, m_FieldsBuf[fieldNdx] );
|
setRowItem( fieldNdx, m_FieldsBuf[fieldNdx] );
|
||||||
|
|
||||||
|
@ -300,7 +300,7 @@ void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::addFieldButtonHandler( wxCommandEvent&
|
||||||
void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::deleteFieldButtonHandler( wxCommandEvent& event )
|
void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::deleteFieldButtonHandler( wxCommandEvent& event )
|
||||||
/*****************************************************************************************/
|
/*****************************************************************************************/
|
||||||
/* Delete a field.
|
/* Delete a field.
|
||||||
* Fields REFERENCE and VALUE are mandatory, and cannot be deleted.
|
* MANDATORY_FIELDS cannot be deleted.
|
||||||
* If a field is empty, it is removed.
|
* If a field is empty, it is removed.
|
||||||
* if not empty, the text is removed.
|
* if not empty, the text is removed.
|
||||||
*/
|
*/
|
||||||
|
@ -317,6 +317,7 @@ void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::deleteFieldButtonHandler( wxCommandEven
|
||||||
}
|
}
|
||||||
|
|
||||||
m_skipCopyFromPanel = true;
|
m_skipCopyFromPanel = true;
|
||||||
|
|
||||||
if( m_FieldsBuf[fieldNdx].m_Text.IsEmpty() )
|
if( m_FieldsBuf[fieldNdx].m_Text.IsEmpty() )
|
||||||
{
|
{
|
||||||
m_FieldsBuf.erase( m_FieldsBuf.begin() + fieldNdx );
|
m_FieldsBuf.erase( m_FieldsBuf.begin() + fieldNdx );
|
||||||
|
@ -324,9 +325,6 @@ void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::deleteFieldButtonHandler( wxCommandEven
|
||||||
|
|
||||||
if( fieldNdx >= m_FieldsBuf.size() )
|
if( fieldNdx >= m_FieldsBuf.size() )
|
||||||
--fieldNdx;
|
--fieldNdx;
|
||||||
|
|
||||||
// Reinitialize fields IDs and default names:
|
|
||||||
reinitializeFieldsIdAndDefaultNames();
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -351,7 +349,7 @@ void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB:: moveUpButtonHandler( wxCommandEvent& e
|
||||||
if( fieldNdx >= m_FieldsBuf.size() ) // traps the -1 case too
|
if( fieldNdx >= m_FieldsBuf.size() ) // traps the -1 case too
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if( fieldNdx <= FIELD1 )
|
if( fieldNdx <= MANDATORY_FIELDS )
|
||||||
{
|
{
|
||||||
wxBell();
|
wxBell();
|
||||||
return;
|
return;
|
||||||
|
@ -370,8 +368,6 @@ void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB:: moveUpButtonHandler( wxCommandEvent& e
|
||||||
m_FieldsBuf[fieldNdx] = tmp;
|
m_FieldsBuf[fieldNdx] = tmp;
|
||||||
setRowItem( fieldNdx, tmp );
|
setRowItem( fieldNdx, tmp );
|
||||||
|
|
||||||
// Reinitialize fields IDs and default names:
|
|
||||||
reinitializeFieldsIdAndDefaultNames();
|
|
||||||
updateDisplay( );
|
updateDisplay( );
|
||||||
|
|
||||||
m_skipCopyFromPanel = true;
|
m_skipCopyFromPanel = true;
|
||||||
|
@ -407,53 +403,138 @@ int DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::getSelectedFieldNdx()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static bool SortFieldsById(const LIB_FIELD& item1, const LIB_FIELD& item2)
|
/**
|
||||||
|
* Function findfield
|
||||||
|
* searches a LIB_FIELD_LIST for aFieldName.
|
||||||
|
*/
|
||||||
|
static LIB_FIELD* findfield( const LIB_FIELD_LIST& aList, const wxString& aFieldName )
|
||||||
{
|
{
|
||||||
return item1.m_FieldId < item2.m_FieldId;
|
const LIB_FIELD* field = NULL;
|
||||||
|
|
||||||
|
for( unsigned i=0; i<aList.size(); ++i )
|
||||||
|
{
|
||||||
|
if( aFieldName == aList[i].m_Name )
|
||||||
|
{
|
||||||
|
field = &aList[i]; // best to avoid casting here.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (LIB_FIELD*) field; // remove const-ness last
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LIB_FIELD* DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::findField( const wxString& aFieldName )
|
||||||
|
{
|
||||||
|
for( unsigned i=0; i<m_FieldsBuf.size(); ++i )
|
||||||
|
{
|
||||||
|
if( aFieldName == m_FieldsBuf[i].m_Name )
|
||||||
|
return &m_FieldsBuf[i];
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************/
|
/***********************************************************/
|
||||||
void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::InitBuffers( void )
|
void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::InitBuffers()
|
||||||
/***********************************************************/
|
/***********************************************************/
|
||||||
{
|
{
|
||||||
LIB_FIELD_LIST fields;
|
LIB_FIELD_LIST cmpFields;
|
||||||
|
|
||||||
m_LibEntry->GetFields( fields );
|
m_LibEntry->GetFields( cmpFields );
|
||||||
|
|
||||||
// copy all the fields to a work area
|
#if defined(DEBUG)
|
||||||
m_FieldsBuf.reserve(DEFAULT_NUMBER_OF_FIELDS);
|
for( unsigned i=0; i<cmpFields.size(); ++i )
|
||||||
|
|
||||||
// Creates a working copy of fields
|
|
||||||
for( size_t i = 0; i < fields.size(); i++ )
|
|
||||||
m_FieldsBuf.push_back( fields[i] );
|
|
||||||
|
|
||||||
// Display 12 fields (or more), and add missing fields
|
|
||||||
LIB_FIELD blank( 2 );
|
|
||||||
unsigned fcount = m_FieldsBuf.size();
|
|
||||||
for( unsigned ii = 2; ii < DEFAULT_NUMBER_OF_FIELDS; ii++ )
|
|
||||||
{
|
{
|
||||||
unsigned jj;
|
printf( "cmpFields[%d].name:%s\n", i, CONV_TO_UTF8( cmpFields[i].m_Name ) );
|
||||||
for ( jj = 2; jj < fcount; jj ++ )
|
}
|
||||||
if ( m_FieldsBuf[jj].m_FieldId == (int)ii ) // Field id already exists, ok.
|
#endif
|
||||||
break;
|
|
||||||
if ( jj < fcount ) continue;
|
/* We have 3 component related field lists to be aware of: 1) UI
|
||||||
// Field id not found: add this field
|
presentation (m_FieldsBuf), 2) fields in component ram copy, and 3)
|
||||||
blank.m_FieldId = ii;
|
fields recorded with component on disk. m_FieldsBuf is the list of UI
|
||||||
m_FieldsBuf.push_back( blank );
|
fields, and this list is not the same as the list which is in the
|
||||||
|
component, which is also not the same as the list on disk. All 3 lists
|
||||||
|
are potentially different. In the UI we choose to preserve the order of
|
||||||
|
the first MANDATORY_FIELDS which are sometimes called fixed fields. Then
|
||||||
|
we append the template fieldnames in the exact same order as the
|
||||||
|
template fieldname editor shows them. Then we append any user defined
|
||||||
|
fieldnames which came from the component, and user can modify it during
|
||||||
|
editing, but cannot delete or move a fixed field.
|
||||||
|
*/
|
||||||
|
|
||||||
|
m_FieldsBuf.clear();
|
||||||
|
|
||||||
|
/* When this code was written, all field constructors ensured that the
|
||||||
|
MANDATORY_FIELDS are all present within a component (in ram only). So we can
|
||||||
|
knowingly copy them over in the normal order. Copy only the fixed fields
|
||||||
|
at first. Please do not break the field constructors.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// fixed fields:
|
||||||
|
for( int i=0; i<MANDATORY_FIELDS; ++i )
|
||||||
|
{
|
||||||
|
D( printf( "add fixed:%s\n", CONV_TO_UTF8( cmpFields[i].m_Name ) ); )
|
||||||
|
m_FieldsBuf.push_back( cmpFields[i] );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add template fieldnames:
|
||||||
|
// Now copy in the template fields, in the order that they are present in the
|
||||||
|
// template field editor UI.
|
||||||
|
const TEMPLATE_FIELDNAMES& tfnames =
|
||||||
|
((WinEDA_SchematicFrame*)m_Parent->GetParent())->GetTemplateFieldNames();
|
||||||
|
|
||||||
|
for( TEMPLATE_FIELDNAMES::const_iterator it = tfnames.begin(); it!=tfnames.end(); ++it )
|
||||||
|
{
|
||||||
|
// add a new field unconditionally to the UI only for this template fieldname
|
||||||
|
|
||||||
|
// field id must not be in range 0 - MANDATORY_FIELDS, set before saving to disk
|
||||||
|
LIB_FIELD fld(-1);
|
||||||
|
|
||||||
|
// See if field by same name already exists in component.
|
||||||
|
LIB_FIELD* libField = findfield( cmpFields, it->m_Name );
|
||||||
|
|
||||||
|
// If the field does not already exist in the component, then we
|
||||||
|
// use defaults from the template fieldname, otherwise the original
|
||||||
|
// values from the component will be set.
|
||||||
|
if( !libField )
|
||||||
|
{
|
||||||
|
D( printf( "add template:%s\n", CONV_TO_UTF8( it->m_Name ) ); )
|
||||||
|
|
||||||
|
fld.m_Name = it->m_Name;
|
||||||
|
fld.m_Text = it->m_Value; // empty? ok too.
|
||||||
|
|
||||||
|
if( !it->m_Visible )
|
||||||
|
fld.m_Attributs |= TEXT_NO_VISIBLE;
|
||||||
|
else
|
||||||
|
fld.m_Attributs &= ~TEXT_NO_VISIBLE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
D( printf( "match template:%s\n", CONV_TO_UTF8( libField->m_Name )); )
|
||||||
|
fld = *libField; // copy values from component, m_Name too
|
||||||
|
}
|
||||||
|
|
||||||
|
m_FieldsBuf.push_back( fld );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lastly, append any original fields from the component which were not added
|
||||||
|
// from the set of fixed fields nor from the set of template fields.
|
||||||
|
for( unsigned i=MANDATORY_FIELDS; i<cmpFields.size(); ++i )
|
||||||
|
{
|
||||||
|
LIB_FIELD* cmp = &cmpFields[i];
|
||||||
|
LIB_FIELD* buf = findField( cmp->m_Name );
|
||||||
|
|
||||||
|
if( !buf )
|
||||||
|
{
|
||||||
|
D( printf( "add cmp:%s\n", CONV_TO_UTF8( cmp->m_Name )); )
|
||||||
|
m_FieldsBuf.push_back( *cmp );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* field names have become more important than field ids, so we cannot
|
||||||
|
mangle the names in the buffer, but can do so in the panel, see elsewhere.
|
||||||
m_FieldsBuf[VALUE].m_Name << wxT( "/" ) << _( "Chip Name" );
|
m_FieldsBuf[VALUE].m_Name << wxT( "/" ) << _( "Chip Name" );
|
||||||
|
*/
|
||||||
// Sort files by field id, because they are not entered by id
|
|
||||||
sort(m_FieldsBuf.begin(), m_FieldsBuf.end(), SortFieldsById);
|
|
||||||
|
|
||||||
// Now, all fields with Id 0 to NUMBER_OF_FIELDS-1 exist
|
|
||||||
// init default fields names
|
|
||||||
for( unsigned ii = 0; ii < m_FieldsBuf.size(); ii++ )
|
|
||||||
{
|
|
||||||
if( m_FieldsBuf[ii].m_Name.IsEmpty() || ii < FIELD1 )
|
|
||||||
m_FieldsBuf[ii].m_Name = ReturnDefaultFieldName( ii );
|
|
||||||
}
|
|
||||||
|
|
||||||
for( unsigned ii = 0; ii < m_FieldsBuf.size(); ++ii )
|
for( unsigned ii = 0; ii < m_FieldsBuf.size(); ++ii )
|
||||||
{
|
{
|
||||||
|
@ -466,6 +547,7 @@ void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::InitBuffers( void )
|
||||||
// resume editing at the last row edited, last time dialog was up.
|
// resume editing at the last row edited, last time dialog was up.
|
||||||
if ( s_SelectedRow < (int) m_FieldsBuf.size() )
|
if ( s_SelectedRow < (int) m_FieldsBuf.size() )
|
||||||
s_SelectedRow = 0;
|
s_SelectedRow = 0;
|
||||||
|
|
||||||
setSelectedFieldNdx( s_SelectedRow );
|
setSelectedFieldNdx( s_SelectedRow );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -513,8 +595,10 @@ void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::copySelectedFieldToPanel()
|
||||||
int style = 0;
|
int style = 0;
|
||||||
if( field.m_Italic )
|
if( field.m_Italic )
|
||||||
style = 1;
|
style = 1;
|
||||||
|
|
||||||
if( field.m_Bold )
|
if( field.m_Bold )
|
||||||
style |= 2;
|
style |= 2;
|
||||||
|
|
||||||
m_StyleRadioBox->SetSelection( style );
|
m_StyleRadioBox->SetSelection( style );
|
||||||
|
|
||||||
// Copy the text justification
|
// Copy the text justification
|
||||||
|
@ -532,12 +616,22 @@ void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::copySelectedFieldToPanel()
|
||||||
else
|
else
|
||||||
m_FieldVJustifyCtrl->SetSelection(1);
|
m_FieldVJustifyCtrl->SetSelection(1);
|
||||||
|
|
||||||
fieldNameTextCtrl->SetValue( field.m_Name );
|
|
||||||
|
// Field names have become more important than field ids, so we cannot
|
||||||
|
// mangle the names in the buffer but we can do so in the panel.
|
||||||
|
if( field.m_FieldId == VALUE )
|
||||||
|
fieldNameTextCtrl->SetValue( field.m_Name + wxT( " / " ) + _( "Chip Name" ) );
|
||||||
|
else
|
||||||
|
fieldNameTextCtrl->SetValue( field.m_Name );
|
||||||
|
|
||||||
// if fieldNdx == REFERENCE, VALUE, FOOTPRINT, or DATASHEET, then disable field name editing
|
// if fieldNdx == REFERENCE, VALUE, FOOTPRINT, or DATASHEET, then disable field name editing
|
||||||
fieldNameTextCtrl->Enable( fieldNdx >= FIELD1 );
|
fieldNameTextCtrl->Enable( fieldNdx >= MANDATORY_FIELDS );
|
||||||
fieldNameTextCtrl->SetEditable( fieldNdx >= FIELD1 );
|
fieldNameTextCtrl->SetEditable( fieldNdx >= MANDATORY_FIELDS );
|
||||||
moveUpButton->Enable( fieldNdx >= FIELD1 ); // disable move up button for non moveable fields
|
|
||||||
|
// only user defined fields may be moved, and not the top most user defined
|
||||||
|
// field since it would be moving up into the fixed fields, > not >=
|
||||||
|
moveUpButton->Enable( fieldNdx > MANDATORY_FIELDS );
|
||||||
|
|
||||||
// if fieldNdx == REFERENCE, VALUE, then disable delete button
|
// if fieldNdx == REFERENCE, VALUE, then disable delete button
|
||||||
deleteFieldButton->Enable( fieldNdx > VALUE );
|
deleteFieldButton->Enable( fieldNdx > VALUE );
|
||||||
|
|
||||||
|
@ -557,10 +651,10 @@ void DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::copySelectedFieldToPanel()
|
||||||
{
|
{
|
||||||
rotateCheckBox->SetValue( m_FieldsBuf[REFERENCE].m_Orient == TEXT_ORIENT_VERT );
|
rotateCheckBox->SetValue( m_FieldsBuf[REFERENCE].m_Orient == TEXT_ORIENT_VERT );
|
||||||
|
|
||||||
coord.x = m_FieldsBuf[REFERENCE].m_Pos.x + (fieldNdx - FIELD1 + 1) * 100;
|
coord.x = m_FieldsBuf[REFERENCE].m_Pos.x + (fieldNdx - MANDATORY_FIELDS + 1) * 100;
|
||||||
coord.y = m_FieldsBuf[REFERENCE].m_Pos.y + (fieldNdx - FIELD1 + 1) * 100;
|
coord.y = m_FieldsBuf[REFERENCE].m_Pos.y + (fieldNdx - MANDATORY_FIELDS + 1) * 100;
|
||||||
|
|
||||||
// coord can compute negative if field is < FIELD1, e.g. FOOTPRINT.
|
// coord can compute negative if field is < MANDATORY_FIELDS, e.g. FOOTPRINT.
|
||||||
// That is ok, we basically don't want all the new empty fields on
|
// That is ok, we basically don't want all the new empty fields on
|
||||||
// top of each other.
|
// top of each other.
|
||||||
}
|
}
|
||||||
|
@ -602,25 +696,31 @@ bool DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::copyPanelToSelectedField()
|
||||||
GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_HJUSTIFY_CENTER,
|
GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_HJUSTIFY_CENTER,
|
||||||
GR_TEXT_HJUSTIFY_RIGHT
|
GR_TEXT_HJUSTIFY_RIGHT
|
||||||
};
|
};
|
||||||
|
|
||||||
GRTextVertJustifyType vjustify[3] = {
|
GRTextVertJustifyType vjustify[3] = {
|
||||||
GR_TEXT_VJUSTIFY_BOTTOM, GR_TEXT_VJUSTIFY_CENTER,
|
GR_TEXT_VJUSTIFY_BOTTOM, GR_TEXT_VJUSTIFY_CENTER,
|
||||||
GR_TEXT_VJUSTIFY_TOP
|
GR_TEXT_VJUSTIFY_TOP
|
||||||
};
|
};
|
||||||
|
|
||||||
field.m_HJustify = hjustify[m_FieldHJustifyCtrl->GetSelection()];
|
field.m_HJustify = hjustify[m_FieldHJustifyCtrl->GetSelection()];
|
||||||
field.m_VJustify = vjustify[m_FieldVJustifyCtrl->GetSelection()];
|
field.m_VJustify = vjustify[m_FieldVJustifyCtrl->GetSelection()];
|
||||||
|
|
||||||
/* Void fields texts for REFERENCE and VALUE (value is the name of the component in lib ! ) are not allowed
|
// Blank/empty field texts for REFERENCE and VALUE are not allowed.
|
||||||
* change them only for a new non void value
|
// (Value is the name of the component in lib!)
|
||||||
*/
|
// Change them only if user provided a non blank value
|
||||||
if( !fieldValueTextCtrl->GetValue().IsEmpty() || fieldNdx > VALUE )
|
if( !fieldValueTextCtrl->GetValue().IsEmpty() || fieldNdx > VALUE )
|
||||||
field.m_Text = fieldValueTextCtrl->GetValue();
|
field.m_Text = fieldValueTextCtrl->GetValue();
|
||||||
|
|
||||||
field.m_Name = fieldNameTextCtrl->GetValue();
|
// FieldNameTextCtrl has a tricked value in it for VALUE index, do not copy it back.
|
||||||
|
// It has the "Chip Name" appended.
|
||||||
|
if( field.m_FieldId >= MANDATORY_FIELDS )
|
||||||
|
field.m_Name = fieldNameTextCtrl->GetValue();
|
||||||
|
|
||||||
setRowItem( fieldNdx, field ); // update fieldListCtrl
|
setRowItem( fieldNdx, field ); // update fieldListCtrl
|
||||||
|
|
||||||
field.m_Size.x = WinEDA_GraphicTextCtrl::ParseSize(
|
field.m_Size.x = WinEDA_GraphicTextCtrl::ParseSize(
|
||||||
textSizeTextCtrl->GetValue(), EESCHEMA_INTERNAL_UNIT, g_UnitMetric );
|
textSizeTextCtrl->GetValue(), EESCHEMA_INTERNAL_UNIT, g_UnitMetric );
|
||||||
|
|
||||||
field.m_Size.y = field.m_Size.x;
|
field.m_Size.y = field.m_Size.x;
|
||||||
|
|
||||||
int style = m_StyleRadioBox->GetSelection();
|
int style = m_StyleRadioBox->GetSelection();
|
||||||
|
@ -632,7 +732,7 @@ bool DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB::copyPanelToSelectedField()
|
||||||
if( (style & 2 ) != 0 )
|
if( (style & 2 ) != 0 )
|
||||||
field.m_Bold = true;
|
field.m_Bold = true;
|
||||||
else
|
else
|
||||||
field.m_Bold = false;
|
field.m_Bold = false;
|
||||||
|
|
||||||
double value;
|
double value;
|
||||||
|
|
||||||
|
|
|
@ -40,3 +40,89 @@ void DIALOG_EESCHEMA_OPTIONS::SetGridSizes( const GridArray& grid_sizes,
|
||||||
|
|
||||||
m_choiceGridSize->SetSelection( select );
|
m_choiceGridSize->SetSelection( select );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DIALOG_EESCHEMA_OPTIONS::SetFieldName( int aNdx, wxString aName )
|
||||||
|
{
|
||||||
|
switch( aNdx )
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
m_fieldName1->SetValue( aName );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
m_fieldName2->SetValue( aName );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
m_fieldName3->SetValue( aName );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
m_fieldName4->SetValue( aName );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
m_fieldName5->SetValue( aName );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5:
|
||||||
|
m_fieldName6->SetValue( aName );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 6:
|
||||||
|
m_fieldName7->SetValue( aName );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 7:
|
||||||
|
m_fieldName8->SetValue( aName );
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString DIALOG_EESCHEMA_OPTIONS::GetFieldName( int aNdx )
|
||||||
|
{
|
||||||
|
wxString nme;
|
||||||
|
|
||||||
|
switch ( aNdx )
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
nme = m_fieldName1->GetValue();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
nme = m_fieldName2->GetValue();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
nme = m_fieldName3->GetValue();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
nme = m_fieldName4->GetValue();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
nme = m_fieldName5->GetValue();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5:
|
||||||
|
nme = m_fieldName6->GetValue();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 6:
|
||||||
|
nme = m_fieldName7->GetValue();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 7:
|
||||||
|
nme = m_fieldName8->GetValue();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nme;
|
||||||
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
class DIALOG_EESCHEMA_OPTIONS : public DIALOG_EESCHEMA_OPTIONS_BASE
|
class DIALOG_EESCHEMA_OPTIONS : public DIALOG_EESCHEMA_OPTIONS_BASE
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
DIALOG_EESCHEMA_OPTIONS( wxWindow* parent );
|
DIALOG_EESCHEMA_OPTIONS( wxWindow* parent );
|
||||||
|
|
||||||
void SetUnits( const wxArrayString& units, int select = 0 );
|
void SetUnits( const wxArrayString& units, int select = 0 );
|
||||||
int GetUnitsSelection( void ) { return m_choiceUnits->GetSelection(); }
|
int GetUnitsSelection( void ) { return m_choiceUnits->GetSelection(); }
|
||||||
|
@ -91,6 +91,13 @@ public:
|
||||||
{
|
{
|
||||||
return m_checkPageLimits->GetValue();
|
return m_checkPageLimits->GetValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** Set the field \a aNdx textctrl to \a aName */
|
||||||
|
void SetFieldName( int aNdx, wxString aName);
|
||||||
|
|
||||||
|
/** Get the field \a aNdx name from the fields textctrl */
|
||||||
|
wxString GetFieldName( int aNdx );
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // __dialog_eeschema_options__
|
#endif // __dialog_eeschema_options__
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
// C++ code generated with wxFormBuilder (version Apr 16 2008)
|
// C++ code generated with wxFormBuilder (version Dec 21 2009)
|
||||||
// http://www.wxformbuilder.org/
|
// http://www.wxformbuilder.org/
|
||||||
//
|
//
|
||||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||||
|
@ -18,7 +18,15 @@ DIALOG_EESCHEMA_OPTIONS_BASE::DIALOG_EESCHEMA_OPTIONS_BASE( wxWindow* parent, wx
|
||||||
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
|
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
|
||||||
|
|
||||||
wxBoxSizer* mainSizer;
|
wxBoxSizer* mainSizer;
|
||||||
mainSizer = new wxBoxSizer( wxHORIZONTAL );
|
mainSizer = new wxBoxSizer( wxVERTICAL );
|
||||||
|
|
||||||
|
wxBoxSizer* bSizer5;
|
||||||
|
bSizer5 = new wxBoxSizer( wxVERTICAL );
|
||||||
|
|
||||||
|
m_notebook1 = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
m_panel1 = new wxPanel( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||||
|
wxBoxSizer* p1mainSizer;
|
||||||
|
p1mainSizer = new wxBoxSizer( wxHORIZONTAL );
|
||||||
|
|
||||||
wxBoxSizer* bSizer3;
|
wxBoxSizer* bSizer3;
|
||||||
bSizer3 = new wxBoxSizer( wxVERTICAL );
|
bSizer3 = new wxBoxSizer( wxVERTICAL );
|
||||||
|
@ -31,80 +39,80 @@ DIALOG_EESCHEMA_OPTIONS_BASE::DIALOG_EESCHEMA_OPTIONS_BASE( wxWindow* parent, wx
|
||||||
fgSizer1->SetFlexibleDirection( wxHORIZONTAL );
|
fgSizer1->SetFlexibleDirection( wxHORIZONTAL );
|
||||||
fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||||
|
|
||||||
m_staticText2 = new wxStaticText( this, wxID_ANY, _("Mesurement &units:"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticText2 = new wxStaticText( m_panel1, wxID_ANY, _("Measurement &units:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticText2->Wrap( -1 );
|
m_staticText2->Wrap( -1 );
|
||||||
fgSizer1->Add( m_staticText2, 1, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
fgSizer1->Add( m_staticText2, 1, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
||||||
|
|
||||||
wxArrayString m_choiceUnitsChoices;
|
wxArrayString m_choiceUnitsChoices;
|
||||||
m_choiceUnits = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitsChoices, 0 );
|
m_choiceUnits = new wxChoice( m_panel1, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitsChoices, 0 );
|
||||||
m_choiceUnits->SetSelection( 0 );
|
m_choiceUnits->SetSelection( 0 );
|
||||||
fgSizer1->Add( m_choiceUnits, 1, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 3 );
|
fgSizer1->Add( m_choiceUnits, 1, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 3 );
|
||||||
|
|
||||||
|
|
||||||
fgSizer1->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 3 );
|
fgSizer1->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 3 );
|
||||||
|
|
||||||
m_staticText3 = new wxStaticText( this, wxID_ANY, _("&Grid size:"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticText3 = new wxStaticText( m_panel1, wxID_ANY, _("&Grid size:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticText3->Wrap( -1 );
|
m_staticText3->Wrap( -1 );
|
||||||
fgSizer1->Add( m_staticText3, 1, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
fgSizer1->Add( m_staticText3, 1, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
||||||
|
|
||||||
wxArrayString m_choiceGridSizeChoices;
|
wxArrayString m_choiceGridSizeChoices;
|
||||||
m_choiceGridSize = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceGridSizeChoices, 0 );
|
m_choiceGridSize = new wxChoice( m_panel1, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceGridSizeChoices, 0 );
|
||||||
m_choiceGridSize->SetSelection( 0 );
|
m_choiceGridSize->SetSelection( 0 );
|
||||||
fgSizer1->Add( m_choiceGridSize, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 3 );
|
fgSizer1->Add( m_choiceGridSize, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 3 );
|
||||||
|
|
||||||
m_staticGridUnits = new wxStaticText( this, wxID_ANY, _("mils"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticGridUnits = new wxStaticText( m_panel1, wxID_ANY, _("mils"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticGridUnits->Wrap( -1 );
|
m_staticGridUnits->Wrap( -1 );
|
||||||
fgSizer1->Add( m_staticGridUnits, 0, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
fgSizer1->Add( m_staticGridUnits, 0, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
||||||
|
|
||||||
m_staticText5 = new wxStaticText( this, wxID_ANY, _("Default &line width:"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticText5 = new wxStaticText( m_panel1, wxID_ANY, _("Default &line width:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticText5->Wrap( -1 );
|
m_staticText5->Wrap( -1 );
|
||||||
fgSizer1->Add( m_staticText5, 1, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
fgSizer1->Add( m_staticText5, 1, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
||||||
|
|
||||||
m_spinLineWidth = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS|wxSP_WRAP, 0, 100, 0 );
|
m_spinLineWidth = new wxSpinCtrl( m_panel1, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS|wxSP_WRAP, 0, 100, 0 );
|
||||||
fgSizer1->Add( m_spinLineWidth, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 3 );
|
fgSizer1->Add( m_spinLineWidth, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 3 );
|
||||||
|
|
||||||
m_staticLineWidthUnits = new wxStaticText( this, wxID_ANY, _("mils"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticLineWidthUnits = new wxStaticText( m_panel1, wxID_ANY, _("mils"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticLineWidthUnits->Wrap( -1 );
|
m_staticLineWidthUnits->Wrap( -1 );
|
||||||
fgSizer1->Add( m_staticLineWidthUnits, 0, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
fgSizer1->Add( m_staticLineWidthUnits, 0, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
||||||
|
|
||||||
m_staticText7 = new wxStaticText( this, wxID_ANY, _("Default text &size:"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticText7 = new wxStaticText( m_panel1, wxID_ANY, _("Default text &size:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticText7->Wrap( -1 );
|
m_staticText7->Wrap( -1 );
|
||||||
fgSizer1->Add( m_staticText7, 1, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
fgSizer1->Add( m_staticText7, 1, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
||||||
|
|
||||||
m_spinTextSize = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS|wxSP_WRAP, 0, 1000, 0 );
|
m_spinTextSize = new wxSpinCtrl( m_panel1, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS|wxSP_WRAP, 0, 1000, 0 );
|
||||||
fgSizer1->Add( m_spinTextSize, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 3 );
|
fgSizer1->Add( m_spinTextSize, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 3 );
|
||||||
|
|
||||||
m_staticTextSizeUnits = new wxStaticText( this, wxID_ANY, _("mils"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticTextSizeUnits = new wxStaticText( m_panel1, wxID_ANY, _("mils"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticTextSizeUnits->Wrap( -1 );
|
m_staticTextSizeUnits->Wrap( -1 );
|
||||||
fgSizer1->Add( m_staticTextSizeUnits, 0, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
fgSizer1->Add( m_staticTextSizeUnits, 0, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
||||||
|
|
||||||
m_staticText9 = new wxStaticText( this, wxID_ANY, _("Repeat draw item &horizontal displacement:"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticText9 = new wxStaticText( m_panel1, wxID_ANY, _("Repeat draw item &horizontal displacement:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticText9->Wrap( -1 );
|
m_staticText9->Wrap( -1 );
|
||||||
fgSizer1->Add( m_staticText9, 1, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
fgSizer1->Add( m_staticText9, 1, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
||||||
|
|
||||||
m_spinRepeatHorizontal = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS|wxSP_WRAP, 0, 500, 0 );
|
m_spinRepeatHorizontal = new wxSpinCtrl( m_panel1, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS|wxSP_WRAP, 0, 500, 0 );
|
||||||
fgSizer1->Add( m_spinRepeatHorizontal, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 3 );
|
fgSizer1->Add( m_spinRepeatHorizontal, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 3 );
|
||||||
|
|
||||||
m_staticRepeatXUnits = new wxStaticText( this, wxID_ANY, _("mils"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticRepeatXUnits = new wxStaticText( m_panel1, wxID_ANY, _("mils"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticRepeatXUnits->Wrap( -1 );
|
m_staticRepeatXUnits->Wrap( -1 );
|
||||||
fgSizer1->Add( m_staticRepeatXUnits, 0, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
fgSizer1->Add( m_staticRepeatXUnits, 0, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
||||||
|
|
||||||
m_staticText12 = new wxStaticText( this, wxID_ANY, _("Repeat draw item &vertical displacement:"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticText12 = new wxStaticText( m_panel1, wxID_ANY, _("Repeat draw item &vertical displacement:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticText12->Wrap( -1 );
|
m_staticText12->Wrap( -1 );
|
||||||
fgSizer1->Add( m_staticText12, 1, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
fgSizer1->Add( m_staticText12, 1, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
||||||
|
|
||||||
m_spinRepeatVertical = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS|wxSP_WRAP, 0, 500, 100 );
|
m_spinRepeatVertical = new wxSpinCtrl( m_panel1, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS|wxSP_WRAP, 0, 500, 100 );
|
||||||
fgSizer1->Add( m_spinRepeatVertical, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 3 );
|
fgSizer1->Add( m_spinRepeatVertical, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 3 );
|
||||||
|
|
||||||
m_staticRepeatYUnits = new wxStaticText( this, wxID_ANY, _("mils"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticRepeatYUnits = new wxStaticText( m_panel1, wxID_ANY, _("mils"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticRepeatYUnits->Wrap( -1 );
|
m_staticRepeatYUnits->Wrap( -1 );
|
||||||
fgSizer1->Add( m_staticRepeatYUnits, 0, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
fgSizer1->Add( m_staticRepeatYUnits, 0, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
||||||
|
|
||||||
m_staticText16 = new wxStaticText( this, wxID_ANY, _("&Repeat label increment:"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_staticText16 = new wxStaticText( m_panel1, wxID_ANY, _("&Repeat label increment:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticText16->Wrap( -1 );
|
m_staticText16->Wrap( -1 );
|
||||||
fgSizer1->Add( m_staticText16, 1, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
fgSizer1->Add( m_staticText16, 1, wxALIGN_CENTER_VERTICAL|wxALL, 3 );
|
||||||
|
|
||||||
m_spinRepeatLabel = new wxSpinCtrl( this, wxID_ANY, wxT("1"), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS|wxSP_WRAP, 0, 10, 1 );
|
m_spinRepeatLabel = new wxSpinCtrl( m_panel1, wxID_ANY, wxT("1"), wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS|wxSP_WRAP, 0, 10, 1 );
|
||||||
fgSizer1->Add( m_spinRepeatLabel, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 3 );
|
fgSizer1->Add( m_spinRepeatLabel, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 3 );
|
||||||
|
|
||||||
|
|
||||||
|
@ -115,24 +123,19 @@ DIALOG_EESCHEMA_OPTIONS_BASE::DIALOG_EESCHEMA_OPTIONS_BASE( wxWindow* parent, wx
|
||||||
wxBoxSizer* bSizer2;
|
wxBoxSizer* bSizer2;
|
||||||
bSizer2 = new wxBoxSizer( wxVERTICAL );
|
bSizer2 = new wxBoxSizer( wxVERTICAL );
|
||||||
|
|
||||||
m_checkShowGrid = new wxCheckBox( this, wxID_ANY, _("Show g&rid"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_checkShowGrid = new wxCheckBox( m_panel1, wxID_ANY, _("Show g&rid"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
|
||||||
bSizer2->Add( m_checkShowGrid, 0, wxALL|wxEXPAND, 3 );
|
bSizer2->Add( m_checkShowGrid, 0, wxALL|wxEXPAND, 3 );
|
||||||
|
|
||||||
m_checkShowHiddenPins = new wxCheckBox( this, wxID_ANY, _("Show hi&dden pins"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_checkShowHiddenPins = new wxCheckBox( m_panel1, wxID_ANY, _("Show hi&dden pins"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
|
||||||
bSizer2->Add( m_checkShowHiddenPins, 0, wxALL|wxEXPAND, 3 );
|
bSizer2->Add( m_checkShowHiddenPins, 0, wxALL|wxEXPAND, 3 );
|
||||||
|
|
||||||
m_checkAutoPan = new wxCheckBox( this, wxID_ANY, _("Enable automatic &panning"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_checkAutoPan = new wxCheckBox( m_panel1, wxID_ANY, _("Enable automatic &panning"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
|
||||||
bSizer2->Add( m_checkAutoPan, 0, wxALL|wxEXPAND, 3 );
|
bSizer2->Add( m_checkAutoPan, 0, wxALL|wxEXPAND, 3 );
|
||||||
|
|
||||||
m_checkHVOrientation = new wxCheckBox( this, wxID_ANY, _("Allow buses and wires to be placed in H or V &orientation only"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_checkHVOrientation = new wxCheckBox( m_panel1, wxID_ANY, _("Allow buses and wires to be placed in H or V &orientation only"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
|
||||||
bSizer2->Add( m_checkHVOrientation, 0, wxALL|wxEXPAND, 3 );
|
bSizer2->Add( m_checkHVOrientation, 0, wxALL|wxEXPAND, 3 );
|
||||||
|
|
||||||
m_checkPageLimits = new wxCheckBox( this, wxID_ANY, _("Show p&age limits"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_checkPageLimits = new wxCheckBox( m_panel1, wxID_ANY, _("Show p&age limits"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
|
||||||
bSizer2->Add( m_checkPageLimits, 0, wxALL|wxEXPAND, 3 );
|
bSizer2->Add( m_checkPageLimits, 0, wxALL|wxEXPAND, 3 );
|
||||||
|
|
||||||
bSizer3->Add( bSizer2, 0, wxEXPAND, 0 );
|
bSizer3->Add( bSizer2, 0, wxEXPAND, 0 );
|
||||||
|
@ -140,15 +143,112 @@ DIALOG_EESCHEMA_OPTIONS_BASE::DIALOG_EESCHEMA_OPTIONS_BASE( wxWindow* parent, wx
|
||||||
|
|
||||||
bSizer3->Add( 0, 0, 1, wxALL|wxEXPAND, 10 );
|
bSizer3->Add( 0, 0, 1, wxALL|wxEXPAND, 10 );
|
||||||
|
|
||||||
|
p1mainSizer->Add( bSizer3, 1, wxALL|wxEXPAND, 12 );
|
||||||
|
|
||||||
|
m_panel1->SetSizer( p1mainSizer );
|
||||||
|
m_panel1->Layout();
|
||||||
|
p1mainSizer->Fit( m_panel1 );
|
||||||
|
m_notebook1->AddPage( m_panel1, _("General Options"), true );
|
||||||
|
m_panel2 = new wxPanel( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||||
|
m_panel2->SetToolTip( _("User defined field names for schematic components. ") );
|
||||||
|
|
||||||
|
wxBoxSizer* bSizer6;
|
||||||
|
bSizer6 = new wxBoxSizer( wxVERTICAL );
|
||||||
|
|
||||||
|
wxBoxSizer* bSizer8;
|
||||||
|
bSizer8 = new wxBoxSizer( wxVERTICAL );
|
||||||
|
|
||||||
|
m_staticText211 = new wxStaticText( m_panel2, wxID_ANY, _("Please enter fieldnames which you want presented in the component fieldname (property) editors. Names may not include (, ), or \" characters."), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
m_staticText211->Wrap( 400 );
|
||||||
|
bSizer8->Add( m_staticText211, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
|
||||||
|
|
||||||
|
bSizer6->Add( bSizer8, 0, wxEXPAND, 5 );
|
||||||
|
|
||||||
|
wxBoxSizer* bSizer7;
|
||||||
|
bSizer7 = new wxBoxSizer( wxVERTICAL );
|
||||||
|
|
||||||
|
wxFlexGridSizer* fgSizer2;
|
||||||
|
fgSizer2 = new wxFlexGridSizer( 2, 2, 0, 0 );
|
||||||
|
fgSizer2->AddGrowableCol( 1 );
|
||||||
|
fgSizer2->SetFlexibleDirection( wxHORIZONTAL );
|
||||||
|
fgSizer2->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||||
|
|
||||||
|
m_staticText15 = new wxStaticText( m_panel2, wxID_ANY, _("Custom field 1"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
m_staticText15->Wrap( -1 );
|
||||||
|
fgSizer2->Add( m_staticText15, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 3 );
|
||||||
|
|
||||||
|
m_fieldName1 = new wxTextCtrl( m_panel2, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
fgSizer2->Add( m_fieldName1, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 3 );
|
||||||
|
|
||||||
|
m_staticText161 = new wxStaticText( m_panel2, wxID_ANY, _("Custom field 2"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
m_staticText161->Wrap( -1 );
|
||||||
|
fgSizer2->Add( m_staticText161, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 3 );
|
||||||
|
|
||||||
|
m_fieldName2 = new wxTextCtrl( m_panel2, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
fgSizer2->Add( m_fieldName2, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 3 );
|
||||||
|
|
||||||
|
m_staticText17 = new wxStaticText( m_panel2, wxID_ANY, _("Custom field 3"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
m_staticText17->Wrap( -1 );
|
||||||
|
fgSizer2->Add( m_staticText17, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 3 );
|
||||||
|
|
||||||
|
m_fieldName3 = new wxTextCtrl( m_panel2, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
fgSizer2->Add( m_fieldName3, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 3 );
|
||||||
|
|
||||||
|
m_staticText18 = new wxStaticText( m_panel2, wxID_ANY, _("Custom field 4"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
m_staticText18->Wrap( -1 );
|
||||||
|
fgSizer2->Add( m_staticText18, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 3 );
|
||||||
|
|
||||||
|
m_fieldName4 = new wxTextCtrl( m_panel2, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
fgSizer2->Add( m_fieldName4, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 3 );
|
||||||
|
|
||||||
|
m_staticText19 = new wxStaticText( m_panel2, wxID_ANY, _("Custom field 5"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
m_staticText19->Wrap( -1 );
|
||||||
|
fgSizer2->Add( m_staticText19, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 3 );
|
||||||
|
|
||||||
|
m_fieldName5 = new wxTextCtrl( m_panel2, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
fgSizer2->Add( m_fieldName5, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 3 );
|
||||||
|
|
||||||
|
m_staticText20 = new wxStaticText( m_panel2, wxID_ANY, _("Custom field 6"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
m_staticText20->Wrap( -1 );
|
||||||
|
fgSizer2->Add( m_staticText20, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 3 );
|
||||||
|
|
||||||
|
m_fieldName6 = new wxTextCtrl( m_panel2, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
fgSizer2->Add( m_fieldName6, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 3 );
|
||||||
|
|
||||||
|
m_staticText21 = new wxStaticText( m_panel2, wxID_ANY, _("Custom field 7"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
m_staticText21->Wrap( -1 );
|
||||||
|
fgSizer2->Add( m_staticText21, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 3 );
|
||||||
|
|
||||||
|
m_fieldName7 = new wxTextCtrl( m_panel2, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
fgSizer2->Add( m_fieldName7, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 3 );
|
||||||
|
|
||||||
|
m_staticText22 = new wxStaticText( m_panel2, wxID_ANY, _("Custom field 8"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
m_staticText22->Wrap( -1 );
|
||||||
|
fgSizer2->Add( m_staticText22, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 3 );
|
||||||
|
|
||||||
|
m_fieldName8 = new wxTextCtrl( m_panel2, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
fgSizer2->Add( m_fieldName8, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 3 );
|
||||||
|
|
||||||
|
bSizer7->Add( fgSizer2, 1, wxALIGN_CENTER|wxEXPAND, 5 );
|
||||||
|
|
||||||
|
bSizer6->Add( bSizer7, 1, wxALL|wxEXPAND, 12 );
|
||||||
|
|
||||||
|
m_panel2->SetSizer( bSizer6 );
|
||||||
|
m_panel2->Layout();
|
||||||
|
bSizer6->Fit( m_panel2 );
|
||||||
|
m_notebook1->AddPage( m_panel2, _("Template Field Names"), false );
|
||||||
|
|
||||||
|
bSizer5->Add( m_notebook1, 1, wxEXPAND, 0 );
|
||||||
|
|
||||||
m_sdbSizer1 = new wxStdDialogButtonSizer();
|
m_sdbSizer1 = new wxStdDialogButtonSizer();
|
||||||
m_sdbSizer1OK = new wxButton( this, wxID_OK );
|
m_sdbSizer1OK = new wxButton( this, wxID_OK );
|
||||||
m_sdbSizer1->AddButton( m_sdbSizer1OK );
|
m_sdbSizer1->AddButton( m_sdbSizer1OK );
|
||||||
m_sdbSizer1Cancel = new wxButton( this, wxID_CANCEL );
|
m_sdbSizer1Cancel = new wxButton( this, wxID_CANCEL );
|
||||||
m_sdbSizer1->AddButton( m_sdbSizer1Cancel );
|
m_sdbSizer1->AddButton( m_sdbSizer1Cancel );
|
||||||
m_sdbSizer1->Realize();
|
m_sdbSizer1->Realize();
|
||||||
bSizer3->Add( m_sdbSizer1, 0, wxALL|wxEXPAND, 0 );
|
bSizer5->Add( m_sdbSizer1, 0, wxALL|wxEXPAND, 12 );
|
||||||
|
|
||||||
mainSizer->Add( bSizer3, 1, wxALL|wxEXPAND, 12 );
|
mainSizer->Add( bSizer5, 1, 0, 12 );
|
||||||
|
|
||||||
this->SetSizer( mainSizer );
|
this->SetSizer( mainSizer );
|
||||||
this->Layout();
|
this->Layout();
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,5 +1,5 @@
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
// C++ code generated with wxFormBuilder (version Apr 16 2008)
|
// C++ code generated with wxFormBuilder (version Dec 21 2009)
|
||||||
// http://www.wxformbuilder.org/
|
// http://www.wxformbuilder.org/
|
||||||
//
|
//
|
||||||
// PLEASE DO "NOT" EDIT THIS FILE!
|
// PLEASE DO "NOT" EDIT THIS FILE!
|
||||||
|
@ -20,6 +20,12 @@
|
||||||
#include <wx/spinctrl.h>
|
#include <wx/spinctrl.h>
|
||||||
#include <wx/sizer.h>
|
#include <wx/sizer.h>
|
||||||
#include <wx/checkbox.h>
|
#include <wx/checkbox.h>
|
||||||
|
#include <wx/panel.h>
|
||||||
|
#include <wx/bitmap.h>
|
||||||
|
#include <wx/image.h>
|
||||||
|
#include <wx/icon.h>
|
||||||
|
#include <wx/textctrl.h>
|
||||||
|
#include <wx/notebook.h>
|
||||||
#include <wx/button.h>
|
#include <wx/button.h>
|
||||||
#include <wx/dialog.h>
|
#include <wx/dialog.h>
|
||||||
|
|
||||||
|
@ -38,6 +44,8 @@ class DIALOG_EESCHEMA_OPTIONS_BASE : public wxDialog
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
wxNotebook* m_notebook1;
|
||||||
|
wxPanel* m_panel1;
|
||||||
wxStaticText* m_staticText2;
|
wxStaticText* m_staticText2;
|
||||||
wxChoice* m_choiceUnits;
|
wxChoice* m_choiceUnits;
|
||||||
|
|
||||||
|
@ -65,15 +73,34 @@ class DIALOG_EESCHEMA_OPTIONS_BASE : public wxDialog
|
||||||
wxCheckBox* m_checkHVOrientation;
|
wxCheckBox* m_checkHVOrientation;
|
||||||
wxCheckBox* m_checkPageLimits;
|
wxCheckBox* m_checkPageLimits;
|
||||||
|
|
||||||
|
wxPanel* m_panel2;
|
||||||
|
wxStaticText* m_staticText211;
|
||||||
|
wxStaticText* m_staticText15;
|
||||||
|
wxTextCtrl* m_fieldName1;
|
||||||
|
wxStaticText* m_staticText161;
|
||||||
|
wxTextCtrl* m_fieldName2;
|
||||||
|
wxStaticText* m_staticText17;
|
||||||
|
wxTextCtrl* m_fieldName3;
|
||||||
|
wxStaticText* m_staticText18;
|
||||||
|
wxTextCtrl* m_fieldName4;
|
||||||
|
wxStaticText* m_staticText19;
|
||||||
|
wxTextCtrl* m_fieldName5;
|
||||||
|
wxStaticText* m_staticText20;
|
||||||
|
wxTextCtrl* m_fieldName6;
|
||||||
|
wxStaticText* m_staticText21;
|
||||||
|
wxTextCtrl* m_fieldName7;
|
||||||
|
wxStaticText* m_staticText22;
|
||||||
|
wxTextCtrl* m_fieldName8;
|
||||||
wxStdDialogButtonSizer* m_sdbSizer1;
|
wxStdDialogButtonSizer* m_sdbSizer1;
|
||||||
wxButton* m_sdbSizer1OK;
|
wxButton* m_sdbSizer1OK;
|
||||||
wxButton* m_sdbSizer1Cancel;
|
wxButton* m_sdbSizer1Cancel;
|
||||||
|
|
||||||
// Virtual event handlers, overide them in your derived class
|
// Virtual event handlers, overide them in your derived class
|
||||||
virtual void OnChooseUnits( wxCommandEvent& event ){ event.Skip(); }
|
virtual void OnChooseUnits( wxCommandEvent& event ) { event.Skip(); }
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
DIALOG_EESCHEMA_OPTIONS_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Schematic Editor Options"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
|
DIALOG_EESCHEMA_OPTIONS_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Schematic Editor Options"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
|
||||||
~DIALOG_EESCHEMA_OPTIONS_BASE();
|
~DIALOG_EESCHEMA_OPTIONS_BASE();
|
||||||
|
|
||||||
|
|
|
@ -22,16 +22,16 @@
|
||||||
#include <wx/fdrepdlg.h>
|
#include <wx/fdrepdlg.h>
|
||||||
|
|
||||||
|
|
||||||
#define HOTKEY_FILENAME wxT( "eeschema" )
|
#define HOTKEY_FILENAME wxT( "eeschema" )
|
||||||
|
|
||||||
#define FR_HISTORY_LIST_CNT 10 ///< Maximum number of find and replace strings.
|
#define FR_HISTORY_LIST_CNT 10 ///< Maximum number of find and replace strings.
|
||||||
|
|
||||||
void WinEDA_LibeditFrame::Process_Config( wxCommandEvent& event )
|
void WinEDA_LibeditFrame::Process_Config( wxCommandEvent& event )
|
||||||
{
|
{
|
||||||
int id = event.GetId();
|
int id = event.GetId();
|
||||||
wxPoint pos;
|
wxPoint pos;
|
||||||
wxFileName fn;
|
wxFileName fn;
|
||||||
WinEDA_SchematicFrame * schFrame = (WinEDA_SchematicFrame *) GetParent();
|
WinEDA_SchematicFrame * schFrame = ( WinEDA_SchematicFrame * ) GetParent();
|
||||||
|
|
||||||
wxGetMousePosition( &pos.x, &pos.y );
|
wxGetMousePosition( &pos.x, &pos.y );
|
||||||
|
|
||||||
|
@ -187,6 +187,7 @@ void WinEDA_SchematicFrame::OnSetOptions( wxCommandEvent& event )
|
||||||
|
|
||||||
wxLogDebug( wxT( "Current grid array index %d." ),
|
wxLogDebug( wxT( "Current grid array index %d." ),
|
||||||
grid_list.Index( GetBaseScreen()->GetGrid() ) );
|
grid_list.Index( GetBaseScreen()->GetGrid() ) );
|
||||||
|
|
||||||
units.Add( GetUnitsLabel( INCHES ) );
|
units.Add( GetUnitsLabel( INCHES ) );
|
||||||
units.Add( GetUnitsLabel( MILLIMETRE ) );
|
units.Add( GetUnitsLabel( MILLIMETRE ) );
|
||||||
|
|
||||||
|
@ -206,12 +207,24 @@ void WinEDA_SchematicFrame::OnSetOptions( wxCommandEvent& event )
|
||||||
dlg.Fit();
|
dlg.Fit();
|
||||||
dlg.SetMinSize( dlg.GetSize() );
|
dlg.SetMinSize( dlg.GetSize() );
|
||||||
|
|
||||||
|
const TEMPLATE_FIELDNAMES& tfnames = m_TemplateFieldNames.GetTemplateFieldNames();
|
||||||
|
|
||||||
|
for( unsigned i=0; i<tfnames.size(); ++i )
|
||||||
|
{
|
||||||
|
D(printf("dlg.SetFieldName(%d, '%s')\n",
|
||||||
|
i, CONV_TO_UTF8( tfnames[i].m_Name) );)
|
||||||
|
|
||||||
|
dlg.SetFieldName( i, tfnames[i].m_Name );
|
||||||
|
}
|
||||||
|
|
||||||
if( dlg.ShowModal() == wxID_CANCEL )
|
if( dlg.ShowModal() == wxID_CANCEL )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
g_UnitMetric = dlg.GetUnitsSelection();
|
g_UnitMetric = dlg.GetUnitsSelection();
|
||||||
|
|
||||||
GetBaseScreen()->SetGrid(
|
GetBaseScreen()->SetGrid(
|
||||||
grid_list[ (size_t) dlg.GetGridSelection() ].m_Size );
|
grid_list[ (size_t) dlg.GetGridSelection() ].m_Size );
|
||||||
|
|
||||||
g_DrawDefaultLineThickness = dlg.GetLineWidth();
|
g_DrawDefaultLineThickness = dlg.GetLineWidth();
|
||||||
g_DefaultTextLabelSize = dlg.GetTextSize();
|
g_DefaultTextLabelSize = dlg.GetTextSize();
|
||||||
g_RepeatStep.x = dlg.GetRepeatHorizontal();
|
g_RepeatStep.x = dlg.GetRepeatHorizontal();
|
||||||
|
@ -222,6 +235,27 @@ void WinEDA_SchematicFrame::OnSetOptions( wxCommandEvent& event )
|
||||||
DrawPanel->m_AutoPAN_Enable = dlg.GetEnableAutoPan();
|
DrawPanel->m_AutoPAN_Enable = dlg.GetEnableAutoPan();
|
||||||
g_HVLines = dlg.GetEnableHVBusOrientation();
|
g_HVLines = dlg.GetEnableHVBusOrientation();
|
||||||
g_ShowPageLimits = dlg.GetShowPageLimits();
|
g_ShowPageLimits = dlg.GetShowPageLimits();
|
||||||
|
|
||||||
|
wxString templateFieldName;
|
||||||
|
|
||||||
|
// @todo this will change when the template field editor is redone to
|
||||||
|
// look like the component field property editor, showing visibility and value also
|
||||||
|
|
||||||
|
DeleteAllTemplateFieldNames();
|
||||||
|
for( int i=0; i<8; ++i ) // no. fields in this dialog window
|
||||||
|
{
|
||||||
|
templateFieldName = dlg.GetFieldName( i );
|
||||||
|
|
||||||
|
if( !templateFieldName.IsEmpty() )
|
||||||
|
{
|
||||||
|
TEMPLATE_FIELDNAME fld( dlg.GetFieldName( i ) );
|
||||||
|
|
||||||
|
// @todo set visibility and value also from a better editor
|
||||||
|
|
||||||
|
AddTemplateFieldName( fld );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
DrawPanel->Refresh( true );
|
DrawPanel->Refresh( true );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -438,7 +472,7 @@ static const wxString FindStringEntry( wxT( "LastFindString" ) );
|
||||||
static const wxString ReplaceStringEntry( wxT( "LastReplaceString" ) );
|
static const wxString ReplaceStringEntry( wxT( "LastReplaceString" ) );
|
||||||
static const wxString FindStringHistoryEntry( wxT( "FindStringHistoryList%d" ) );
|
static const wxString FindStringHistoryEntry( wxT( "FindStringHistoryList%d" ) );
|
||||||
static const wxString ReplaceStringHistoryEntry( wxT( "ReplaceStringHistoryList%d" ) );
|
static const wxString ReplaceStringHistoryEntry( wxT( "ReplaceStringHistoryList%d" ) );
|
||||||
|
static const wxString FieldNamesEntry( wxT( "FieldNames" ) );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the EESchema applications settings list.
|
* Return the EESchema applications settings list.
|
||||||
|
@ -614,6 +648,26 @@ void WinEDA_SchematicFrame::LoadSettings()
|
||||||
if( !tmpHistory.IsEmpty() )
|
if( !tmpHistory.IsEmpty() )
|
||||||
m_replaceStringHistoryList.Add( tmpHistory );
|
m_replaceStringHistoryList.Add( tmpHistory );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxString templateFieldNames = cfg->Read( FieldNamesEntry, wxEmptyString );
|
||||||
|
|
||||||
|
if( !templateFieldNames.IsEmpty() )
|
||||||
|
{
|
||||||
|
std::string dsnTxt = CONV_TO_UTF8( templateFieldNames );
|
||||||
|
|
||||||
|
DSNLEXER lexer( dsnTxt, DSN::template_fieldnames_keywords,
|
||||||
|
DSN::template_fieldnames_keyword_count );
|
||||||
|
try
|
||||||
|
{
|
||||||
|
m_TemplateFieldNames.Parse( &lexer );
|
||||||
|
}
|
||||||
|
catch( IOError e )
|
||||||
|
{
|
||||||
|
// @todo show error msg
|
||||||
|
D(printf("templatefieldnames parsing error: '%s'\n",
|
||||||
|
CONV_TO_UTF8(e.errorText) );)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -660,7 +714,7 @@ void WinEDA_SchematicFrame::SaveSettings()
|
||||||
/* Save the find and replace string history list. */
|
/* Save the find and replace string history list. */
|
||||||
size_t i;
|
size_t i;
|
||||||
wxString tmpHistory;
|
wxString tmpHistory;
|
||||||
wxString entry;
|
wxString entry; // invoke constructor outside of any loops
|
||||||
|
|
||||||
for ( i = 0; i < m_findStringHistoryList.GetCount() && i < FR_HISTORY_LIST_CNT; i++ )
|
for ( i = 0; i < m_findStringHistoryList.GetCount() && i < FR_HISTORY_LIST_CNT; i++ )
|
||||||
{
|
{
|
||||||
|
@ -673,4 +727,17 @@ void WinEDA_SchematicFrame::SaveSettings()
|
||||||
entry.Printf( ReplaceStringHistoryEntry, i );
|
entry.Printf( ReplaceStringHistoryEntry, i );
|
||||||
cfg->Write( entry, m_replaceStringHistoryList[ i ] );
|
cfg->Write( entry, m_replaceStringHistoryList[ i ] );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Save template fieldnames
|
||||||
|
STRINGFORMATTER sf;
|
||||||
|
|
||||||
|
m_TemplateFieldNames.Format( &sf, 0 );
|
||||||
|
|
||||||
|
wxString record = CONV_FROM_UTF8( sf.GetString().c_str() );
|
||||||
|
record.Replace( wxT("\n"), wxT(""), true ); // strip all newlines
|
||||||
|
record.Replace( wxT(" "), wxT(" "), true ); // double space to single
|
||||||
|
|
||||||
|
|
||||||
|
cfg->Write( FieldNamesEntry, record );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -506,7 +506,6 @@ int ReadPartDescr( wxWindow* frame, char* Line, FILE* f, wxString& aMsgDiag,
|
||||||
char* ptcar;
|
char* ptcar;
|
||||||
wxString fieldName;
|
wxString fieldName;
|
||||||
|
|
||||||
|
|
||||||
component = new SCH_COMPONENT();
|
component = new SCH_COMPONENT();
|
||||||
|
|
||||||
component->m_Convert = 1;
|
component->m_Convert = 1;
|
||||||
|
@ -703,7 +702,7 @@ int ReadPartDescr( wxWindow* frame, char* Line, FILE* f, wxString& aMsgDiag,
|
||||||
ReadDelimitedText( FieldUserName, ptcar, sizeof(FieldUserName) );
|
ReadDelimitedText( FieldUserName, ptcar, sizeof(FieldUserName) );
|
||||||
|
|
||||||
if( !FieldUserName[0] )
|
if( !FieldUserName[0] )
|
||||||
fieldName = ReturnDefaultFieldName( fieldNdx );
|
fieldName = TEMPLATE_FIELDNAME::GetDefaultFieldName( fieldNdx );
|
||||||
else
|
else
|
||||||
fieldName = CONV_FROM_UTF8( FieldUserName );
|
fieldName = CONV_FROM_UTF8( FieldUserName );
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,179 @@
|
||||||
|
|
||||||
|
|
||||||
|
#include "template_fieldnames.h"
|
||||||
|
//#include "class_sch_component.h"
|
||||||
|
#include "dsnlexer.h"
|
||||||
|
#include "macros.h"
|
||||||
|
|
||||||
|
using namespace DSN; // enum TFIELD_T is in this namespace
|
||||||
|
|
||||||
|
|
||||||
|
wxString TEMPLATE_FIELDNAME::GetDefaultFieldName( int aFieldNdx )
|
||||||
|
{
|
||||||
|
// Fixed values for the first few default fields used by EESCHEMA
|
||||||
|
static const wxString fixedNames[] = {
|
||||||
|
_( "Reference" ), // The component reference, R1, C1, etc.
|
||||||
|
_( "Value" ), // The component value + name
|
||||||
|
_( "Footprint" ), // The footprint for use with PCBNEW
|
||||||
|
_( "Datasheet" ), // Link to a datasheet for component
|
||||||
|
};
|
||||||
|
|
||||||
|
if ( (unsigned) aFieldNdx < DIM(fixedNames) )
|
||||||
|
return fixedNames[aFieldNdx];
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxString fieldName = _("Field");
|
||||||
|
|
||||||
|
fieldName << aFieldNdx;
|
||||||
|
|
||||||
|
return fieldName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TEMPLATE_FIELDNAME::Format( OUTPUTFORMATTER* out, int nestLevel ) const throw( IOError )
|
||||||
|
{
|
||||||
|
// user may want spaces in his field name, ug, so quote them for the parser.
|
||||||
|
out->Print( nestLevel, "(field (name \"%s\")", CONV_TO_UTF8(m_Name) );
|
||||||
|
|
||||||
|
if( !m_Value.IsEmpty() )
|
||||||
|
out->Print( 0, "(value \"%s\")", CONV_TO_UTF8(m_Value) );
|
||||||
|
|
||||||
|
if( m_Visible )
|
||||||
|
out->Print( 0, " visible" );
|
||||||
|
|
||||||
|
out->Print( 0, ")\n" );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TEMPLATE_FIELDNAME::Parse( DSNLEXER* in ) throw( IOError )
|
||||||
|
{
|
||||||
|
TFIELD_T tok;
|
||||||
|
|
||||||
|
if( (tok = (TFIELD_T) in->NextTok()) != T_LEFT )
|
||||||
|
in->Expecting( T_LEFT );
|
||||||
|
|
||||||
|
if( (tok = (TFIELD_T) in->NextTok()) != T_name )
|
||||||
|
in->Expecting( T_name );
|
||||||
|
|
||||||
|
if( (tok = (TFIELD_T) in->NextTok()) != T_SYMBOL && tok!=T_STRING )
|
||||||
|
in->Expecting( _("field's name") );
|
||||||
|
|
||||||
|
m_Name = CONV_FROM_UTF8( in->CurText() );
|
||||||
|
|
||||||
|
if( (tok = (TFIELD_T) in->NextTok()) != T_RIGHT )
|
||||||
|
in->Expecting( T_RIGHT );
|
||||||
|
|
||||||
|
while( (tok = (TFIELD_T) in->NextTok() ) != T_RIGHT && tok != T_EOF )
|
||||||
|
{
|
||||||
|
if( tok == T_LEFT )
|
||||||
|
tok = (TFIELD_T) in->NextTok();
|
||||||
|
|
||||||
|
switch( tok )
|
||||||
|
{
|
||||||
|
case T_value:
|
||||||
|
if( (tok = (TFIELD_T) in->NextTok()) != T_SYMBOL && tok!=T_STRING )
|
||||||
|
in->Expecting( _("field's value") );
|
||||||
|
|
||||||
|
m_Value = CONV_FROM_UTF8( in->CurText() );
|
||||||
|
|
||||||
|
if( (tok = (TFIELD_T) in->NextTok()) != T_RIGHT )
|
||||||
|
in->Expecting( T_RIGHT );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case T_visible:
|
||||||
|
m_Visible = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
in->Unexpected( CONV_FROM_UTF8( in->CurText() ) );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TEMPLATES::Format( OUTPUTFORMATTER* out, int nestLevel ) const throw( IOError )
|
||||||
|
{
|
||||||
|
// We'll keep this general even though the only know use at this time
|
||||||
|
// will not want the newlines or the indentation.
|
||||||
|
out->Print( nestLevel, "(templatefields" );
|
||||||
|
for( unsigned i=0; i<m_Fields.size(); ++i )
|
||||||
|
m_Fields[i].Format( out, nestLevel+1 );
|
||||||
|
out->Print( 0, ")\n" );
|
||||||
|
}
|
||||||
|
|
||||||
|
void TEMPLATES::Parse( DSNLEXER* in ) throw( IOError )
|
||||||
|
{
|
||||||
|
TFIELD_T tok;
|
||||||
|
|
||||||
|
while( (tok = (TFIELD_T) in->NextTok() ) != T_RIGHT && tok != T_EOF )
|
||||||
|
{
|
||||||
|
if( tok == T_LEFT )
|
||||||
|
tok = (TFIELD_T) in->NextTok();
|
||||||
|
|
||||||
|
switch( tok )
|
||||||
|
{
|
||||||
|
case T_templatefields: // a token indicating class TEMPLATES.
|
||||||
|
|
||||||
|
// Be flexible regarding the starting point of the DSNLEXER
|
||||||
|
// stream. Caller may not have read the first two tokens out of the
|
||||||
|
// stream: T_LEFT and T_templatefields, so ignore them if seen here.
|
||||||
|
break;
|
||||||
|
|
||||||
|
case T_field:
|
||||||
|
{
|
||||||
|
// instantiate on stack, so if exception is thrown,
|
||||||
|
// destructor runs
|
||||||
|
TEMPLATE_FIELDNAME field;
|
||||||
|
|
||||||
|
field.Parse( in );
|
||||||
|
|
||||||
|
// add the field
|
||||||
|
AddTemplateFieldName( field );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
in->Unexpected( CONV_FROM_UTF8( in->CurText() ) );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
D(printf("tok:%d\n", tok);)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int TEMPLATES::AddTemplateFieldName( const TEMPLATE_FIELDNAME& aFieldName )
|
||||||
|
{
|
||||||
|
// Ensure that the template fieldname does not match a fixed fieldname.
|
||||||
|
for( int i=0; i<MANDATORY_FIELDS; ++i )
|
||||||
|
{
|
||||||
|
if( TEMPLATE_FIELDNAME::GetDefaultFieldName(i) == aFieldName.m_Name )
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ensure uniqueness, overwrite any template fieldname by the same name.
|
||||||
|
for( unsigned i=0; i<m_Fields.size(); ++i )
|
||||||
|
{
|
||||||
|
if( m_Fields[i].m_Name == aFieldName.m_Name )
|
||||||
|
{
|
||||||
|
D(printf("inserting template fieldname:'%s' at %d\n",
|
||||||
|
CONV_TO_UTF8(aFieldName.m_Name), i );)
|
||||||
|
|
||||||
|
m_Fields[i] = aFieldName;
|
||||||
|
return i; // return the container index
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// D(printf("appending template fieldname:'%s'\n", CONV_TO_UTF8(aFieldName.m_Name) );)
|
||||||
|
|
||||||
|
// the name is legal and not previously added to the config container, append
|
||||||
|
// it and return its index within the container.
|
||||||
|
m_Fields.push_back( aFieldName );
|
||||||
|
|
||||||
|
return m_Fields.size() - 1; // return the index of insertion.
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,149 @@
|
||||||
|
|
||||||
|
#ifndef _TEMPLATE_FIELDNAME_H_
|
||||||
|
#define _TEMPLATE_FIELDNAME_H_
|
||||||
|
|
||||||
|
#include "richio.h"
|
||||||
|
#include "wxstruct.h"
|
||||||
|
#include "macros.h"
|
||||||
|
#include "template_fieldnames_keywords.h"
|
||||||
|
|
||||||
|
class DSNLEXER;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enum NumFieldType
|
||||||
|
* is the set of all field indices assuming an array like sequence that a
|
||||||
|
* SCH_COMPONENT or LIB_COMPONENT can hold.
|
||||||
|
* The first fields are called fixed fields and the quantity of them is
|
||||||
|
* given by MANDATORY_FIELDS. After that come an unlimited number of
|
||||||
|
* user defined fields, only some of which have indices defined here.
|
||||||
|
*/
|
||||||
|
enum NumFieldType {
|
||||||
|
REFERENCE = 0, ///< Field Reference of part, i.e. "IC21"
|
||||||
|
VALUE, ///< Field Value of part, i.e. "3.3K"
|
||||||
|
FOOTPRINT, ///< Field Name Module PCB, i.e. "16DIP300"
|
||||||
|
DATASHEET, ///< name of datasheet
|
||||||
|
|
||||||
|
MANDATORY_FIELDS, ///< the first 4 are mandatory or fixed, and instantiated in FIELD constructors
|
||||||
|
|
||||||
|
FIELD1 = MANDATORY_FIELDS,
|
||||||
|
FIELD2,
|
||||||
|
FIELD3,
|
||||||
|
FIELD4,
|
||||||
|
FIELD5,
|
||||||
|
FIELD6,
|
||||||
|
FIELD7,
|
||||||
|
FIELD8,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Struct TEMPLATE_FIELDNAME
|
||||||
|
* holds a name of a component's field, field value, and default visibility.
|
||||||
|
* Template fieldnames are wanted fieldnames for use in the symbol/component
|
||||||
|
* property editors.
|
||||||
|
*/
|
||||||
|
struct TEMPLATE_FIELDNAME
|
||||||
|
{
|
||||||
|
wxString m_Name; ///< The field name
|
||||||
|
wxString m_Value; ///< The default value or empty
|
||||||
|
bool m_Visible; ///< If first appearance of the field's editor has as visible.
|
||||||
|
|
||||||
|
TEMPLATE_FIELDNAME() :
|
||||||
|
m_Visible( false )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
TEMPLATE_FIELDNAME( const wxString& aName ) :
|
||||||
|
m_Name( aName ),
|
||||||
|
m_Visible( false )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function Format
|
||||||
|
* serializes this object out as text into the given OUTPUTFORMATTER.
|
||||||
|
*/
|
||||||
|
void Format( OUTPUTFORMATTER* out, int nestLevel ) const throw( IOError );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function Parse
|
||||||
|
* fills this object from information in the input stream \a aSpec, which
|
||||||
|
* is a DSNLEXER. The entire textual element spec is <br>
|
||||||
|
* (field (name _yourfieldname_)(value _yourvalue_) visible)) <br>
|
||||||
|
* The presence of value is optional, the presence of visible is optional.
|
||||||
|
* When this function is called, the input token stream given by \a aSpec
|
||||||
|
* is assumed to be positioned at the '^' in the following example, i.e. just after the
|
||||||
|
* identifying keyword and before the content specifying stuff.<br>
|
||||||
|
* (field ^ (....) )
|
||||||
|
*
|
||||||
|
* @param aSpec is the input token stream of keywords and symbols.
|
||||||
|
*/
|
||||||
|
void Parse( DSNLEXER* aSpec ) throw( IOError );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function GetDefaultFieldName
|
||||||
|
* returns a default symbol field name for field \a aFieldNdx for all components.
|
||||||
|
* These fieldnames are not modifiable, but template fieldnames are.
|
||||||
|
* @param aFieldNdx The field number index, > 0
|
||||||
|
*/
|
||||||
|
static wxString GetDefaultFieldName( int aFieldNdx );
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::vector< TEMPLATE_FIELDNAME > TEMPLATE_FIELDNAMES;
|
||||||
|
|
||||||
|
|
||||||
|
class TEMPLATES
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
TEMPLATE_FIELDNAMES m_Fields;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function Format
|
||||||
|
* serializes this object out as text into the given OUTPUTFORMATTER.
|
||||||
|
*/
|
||||||
|
void Format( OUTPUTFORMATTER* out, int nestLevel ) const throw( IOError );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function Parse
|
||||||
|
* fills this object from information in the input stream handled by DSNLEXER
|
||||||
|
*/
|
||||||
|
void Parse( DSNLEXER* in ) throw( IOError );
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function AddTemplateFieldName
|
||||||
|
* inserts or appends a wanted symbol field name into the fieldnames
|
||||||
|
* template. Should be used for any symbol property editor. If the name
|
||||||
|
* already exists, it overwrites the same name.
|
||||||
|
*
|
||||||
|
* @param aFieldName is a full description of the wanted field, and it must not match
|
||||||
|
* any of the default fieldnames.
|
||||||
|
* @return int - the index within the config container at which aFieldName was
|
||||||
|
* added, or -1 if the name is illegal because it matches a default fieldname.
|
||||||
|
*/
|
||||||
|
int AddTemplateFieldName( const TEMPLATE_FIELDNAME& aFieldName );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function DeleteAllTemplateFieldNames
|
||||||
|
* deletes the entire contents.
|
||||||
|
*/
|
||||||
|
void DeleteAllTemplateFieldNames()
|
||||||
|
{
|
||||||
|
m_Fields.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function GetTemplateFieldName
|
||||||
|
* returns a template fieldnames list for read only access.
|
||||||
|
*/
|
||||||
|
const TEMPLATE_FIELDNAMES& GetTemplateFieldNames()
|
||||||
|
{
|
||||||
|
return m_Fields;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // _TEMPLATE_FIELDNAME_H_
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
field
|
||||||
|
name
|
||||||
|
templatefields
|
||||||
|
value
|
||||||
|
visible
|
|
@ -230,13 +230,53 @@ public:
|
||||||
void ThrowIOError( wxString aText, int charOffset ) throw (IOError);
|
void ThrowIOError( wxString aText, int charOffset ) throw (IOError);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function GetTokenString
|
* Function Expecting
|
||||||
|
* throws an IOError exception with an input file specific error message.
|
||||||
|
* @param aTok is the token/keyword type which was expected at the current input location.
|
||||||
|
* @throw IOError with the location within the input file of the problem.
|
||||||
|
*/
|
||||||
|
void Expecting( int aTok ) throw( IOError );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function Expecting
|
||||||
|
* throws an IOError exception with an input file specific error message.
|
||||||
|
* @param aErrorMsg is the token/keyword type which was expected at the
|
||||||
|
* current input location.
|
||||||
|
* @throw IOError with the location within the input file of the problem.
|
||||||
|
*/
|
||||||
|
void Expecting( const wxString& aErrorMsg ) throw( IOError );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function Unexpected
|
||||||
|
* throws an IOError exception with an input file specific error message.
|
||||||
|
* @param aTok is the token/keyword type which was not expected at the
|
||||||
|
* current input location.
|
||||||
|
* @throw IOError with the location within the input file of the problem.
|
||||||
|
*/
|
||||||
|
void Unexpected( int aTok ) throw( IOError );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function Unexpected
|
||||||
|
* throws an IOError exception with an input file specific error message.
|
||||||
|
* @param aErrorMsg is the token/keyword type which was not expected at the
|
||||||
|
* current input location.
|
||||||
|
* @throw IOError with the location within the input file of the problem.
|
||||||
|
*/
|
||||||
|
void Unexpected( const wxString& aErrorMsg ) throw( IOError );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function GetTokenText
|
||||||
* returns the C string representation of a DSN_T value.
|
* returns the C string representation of a DSN_T value.
|
||||||
*/
|
*/
|
||||||
const char* GetTokenText( int aTok );
|
const char* GetTokenText( int aTok );
|
||||||
|
|
||||||
static const char* Syntax( int aTok );
|
/**
|
||||||
|
* Function GetTokenString
|
||||||
|
* returns a quote wrapped wxString representation of a token value.
|
||||||
|
*/
|
||||||
|
wxString GetTokenString( int aTok );
|
||||||
|
|
||||||
|
static const char* Syntax( int aTok );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function CurText
|
* Function CurText
|
||||||
|
|
|
@ -11,8 +11,8 @@
|
||||||
#include <boost/ptr_container/ptr_vector.hpp>
|
#include <boost/ptr_container/ptr_vector.hpp>
|
||||||
|
|
||||||
|
|
||||||
/* definifition des types de parametre des files de configuration */
|
/** Type of parameter in the configuration file */
|
||||||
enum paramcfg_id /* type du parametre dans la structure ParamConfig */
|
enum paramcfg_id
|
||||||
{
|
{
|
||||||
PARAM_INT,
|
PARAM_INT,
|
||||||
PARAM_SETCOLOR,
|
PARAM_SETCOLOR,
|
||||||
|
@ -20,7 +20,8 @@ enum paramcfg_id /* type du parametre dans la structure ParamConfig */
|
||||||
PARAM_BOOL,
|
PARAM_BOOL,
|
||||||
PARAM_LIBNAME_LIST,
|
PARAM_LIBNAME_LIST,
|
||||||
PARAM_WXSTRING,
|
PARAM_WXSTRING,
|
||||||
PARAM_COMMAND_ERASE
|
PARAM_COMMAND_ERASE,
|
||||||
|
PARAM_FIELDNAME_LIST,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MAX_COLOR 0x8001F
|
#define MAX_COLOR 0x8001F
|
||||||
|
@ -29,36 +30,50 @@ enum paramcfg_id /* type du parametre dans la structure ParamConfig */
|
||||||
#define INT_MINVAL 0x80000000
|
#define INT_MINVAL 0x80000000
|
||||||
#define INT_MAXVAL 0x7FFFFFFF
|
#define INT_MAXVAL 0x7FFFFFFF
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class PARAM_CFG_BASE
|
||||||
|
* is a base class which establishes the virtual functions ReadParam and SaveParam,
|
||||||
|
* which are re-implemented by a number of base classes, and these function's
|
||||||
|
* doxygen comments are inherited also.
|
||||||
|
*/
|
||||||
class PARAM_CFG_BASE
|
class PARAM_CFG_BASE
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
const wxChar* m_Ident; /* Keyword in config data */
|
const wxChar* m_Ident; ///< Keyword in config data
|
||||||
paramcfg_id m_Type; /* Type of parameter */
|
paramcfg_id m_Type; ///< Type of parameter
|
||||||
const wxChar* m_Group; /* Group name (tjis is like a path in the config data) */
|
const wxChar* m_Group; ///< Group name (this is like a path in the config data)
|
||||||
bool m_Setup; /* TRUE -> setup parameter (used for all projects), FALSE = parameter relative to a project */
|
bool m_Setup; ///< Install or Project based parameter, true == install
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PARAM_CFG_BASE( const wxChar* ident, const paramcfg_id type, const wxChar* group = NULL );
|
PARAM_CFG_BASE( const wxChar* ident, const paramcfg_id type, const wxChar* group = NULL );
|
||||||
|
|
||||||
/** ReadParam
|
/**
|
||||||
* read the value of parameter thi stored in aConfig
|
* Function ReadParam
|
||||||
* @param aConfig = the wxConfigBase that store the parameter
|
* reads the value of the parameter stored in aConfig
|
||||||
|
* @param aConfig = the wxConfigBase that holds the parameter
|
||||||
*/
|
*/
|
||||||
virtual void ReadParam( wxConfigBase* aConfig ) {};
|
virtual void ReadParam( wxConfigBase* aConfig ) {};
|
||||||
|
|
||||||
/** SaveParam
|
/**
|
||||||
* the the value of parameter thi stored in aConfig
|
* Function SaveParam
|
||||||
|
* saves the value of the parameter stored in aConfig
|
||||||
* @param aConfig = the wxConfigBase that can store the parameter
|
* @param aConfig = the wxConfigBase that can store the parameter
|
||||||
*/
|
*/
|
||||||
virtual void SaveParam( wxConfigBase* aConfig ) {};
|
virtual void SaveParam( wxConfigBase* aConfig ) {};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configuration parameter - Integer Class
|
||||||
|
*
|
||||||
|
*/
|
||||||
class PARAM_CFG_INT : public PARAM_CFG_BASE
|
class PARAM_CFG_INT : public PARAM_CFG_BASE
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
int* m_Pt_param; /* pointeur sur le parametre a configurer */
|
int* m_Pt_param; ///< Pointer to the parameter value
|
||||||
int m_Min, m_Max; /* valeurs extremes du parametre */
|
int m_Min, m_Max; ///< Minimum and maximum values of the param type
|
||||||
int m_Default; /* valeur par defaut */
|
int m_Default; ///< The default value of the parameter
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PARAM_CFG_INT( const wxChar* ident, int* ptparam,
|
PARAM_CFG_INT( const wxChar* ident, int* ptparam,
|
||||||
|
@ -68,24 +83,20 @@ public:
|
||||||
int default_val = 0, int min = INT_MINVAL, int max = INT_MAXVAL,
|
int default_val = 0, int min = INT_MINVAL, int max = INT_MAXVAL,
|
||||||
const wxChar* group = NULL );
|
const wxChar* group = NULL );
|
||||||
|
|
||||||
/** ReadParam
|
|
||||||
* read the value of parameter thi stored in aConfig
|
|
||||||
* @param aConfig = the wxConfigBase that store the parameter
|
|
||||||
*/
|
|
||||||
virtual void ReadParam( wxConfigBase* aConfig );
|
virtual void ReadParam( wxConfigBase* aConfig );
|
||||||
|
|
||||||
/** SaveParam
|
|
||||||
* the the value of parameter thi stored in aConfig
|
|
||||||
* @param aConfig = the wxConfigBase that can store the parameter
|
|
||||||
*/
|
|
||||||
virtual void SaveParam( wxConfigBase* aConfig );
|
virtual void SaveParam( wxConfigBase* aConfig );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configuration parameter - SetColor Class
|
||||||
|
*
|
||||||
|
*/
|
||||||
class PARAM_CFG_SETCOLOR : public PARAM_CFG_BASE
|
class PARAM_CFG_SETCOLOR : public PARAM_CFG_BASE
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
int* m_Pt_param; /* pointeur sur le parametre a configurer */
|
int* m_Pt_param; ///< Pointer to the parameter value
|
||||||
int m_Default; /* valeur par defaut */
|
int m_Default; ///< The default value of the parameter
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PARAM_CFG_SETCOLOR( const wxChar* ident, int* ptparam,
|
PARAM_CFG_SETCOLOR( const wxChar* ident, int* ptparam,
|
||||||
|
@ -93,25 +104,21 @@ public:
|
||||||
PARAM_CFG_SETCOLOR( bool Insetup, const wxChar* ident, int* ptparam,
|
PARAM_CFG_SETCOLOR( bool Insetup, const wxChar* ident, int* ptparam,
|
||||||
int default_val, const wxChar* group = NULL );
|
int default_val, const wxChar* group = NULL );
|
||||||
|
|
||||||
/** ReadParam
|
|
||||||
* read the value of parameter thi stored in aConfig
|
|
||||||
* @param aConfig = the wxConfigBase that store the parameter
|
|
||||||
*/
|
|
||||||
virtual void ReadParam( wxConfigBase* aConfig );
|
virtual void ReadParam( wxConfigBase* aConfig );
|
||||||
|
|
||||||
/** SaveParam
|
|
||||||
* the the value of parameter thi stored in aConfig
|
|
||||||
* @param aConfig = the wxConfigBase that can store the parameter
|
|
||||||
*/
|
|
||||||
virtual void SaveParam( wxConfigBase* aConfig );
|
virtual void SaveParam( wxConfigBase* aConfig );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configuration parameter - Double Precision Class
|
||||||
|
*
|
||||||
|
*/
|
||||||
class PARAM_CFG_DOUBLE : public PARAM_CFG_BASE
|
class PARAM_CFG_DOUBLE : public PARAM_CFG_BASE
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
double* m_Pt_param; /* pointeur sur le parametre a configurer */
|
double* m_Pt_param; ///< Pointer to the parameter value
|
||||||
double m_Default; /* valeur par defaut */
|
double m_Default; ///< The default value of the parameter
|
||||||
double m_Min, m_Max; /* valeurs extremes du parametre */
|
double m_Min, m_Max; ///< Minimum and maximum values of the param type
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PARAM_CFG_DOUBLE( const wxChar* ident, double* ptparam,
|
PARAM_CFG_DOUBLE( const wxChar* ident, double* ptparam,
|
||||||
|
@ -121,24 +128,20 @@ public:
|
||||||
double default_val = 0.0, double min = 0.0, double max = 10000.0,
|
double default_val = 0.0, double min = 0.0, double max = 10000.0,
|
||||||
const wxChar* group = NULL );
|
const wxChar* group = NULL );
|
||||||
|
|
||||||
/** ReadParam
|
|
||||||
* read the value of parameter thi stored in aConfig
|
|
||||||
* @param aConfig = the wxConfigBase that store the parameter
|
|
||||||
*/
|
|
||||||
virtual void ReadParam( wxConfigBase* aConfig );
|
virtual void ReadParam( wxConfigBase* aConfig );
|
||||||
|
|
||||||
/** SaveParam
|
|
||||||
* the the value of parameter thi stored in aConfig
|
|
||||||
* @param aConfig = the wxConfigBase that can store the parameter
|
|
||||||
*/
|
|
||||||
virtual void SaveParam( wxConfigBase* aConfig );
|
virtual void SaveParam( wxConfigBase* aConfig );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configuration parameter - Boolean Class
|
||||||
|
*
|
||||||
|
*/
|
||||||
class PARAM_CFG_BOOL : public PARAM_CFG_BASE
|
class PARAM_CFG_BOOL : public PARAM_CFG_BASE
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
bool* m_Pt_param; /* pointeur sur le parametre a configurer */
|
bool* m_Pt_param; ///< Pointer to the parameter value
|
||||||
int m_Default; /* valeur par defaut */
|
int m_Default; ///< The default value of the parameter
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PARAM_CFG_BOOL( const wxChar* ident, bool* ptparam,
|
PARAM_CFG_BOOL( const wxChar* ident, bool* ptparam,
|
||||||
|
@ -146,24 +149,19 @@ public:
|
||||||
PARAM_CFG_BOOL( bool Insetup, const wxChar* ident, bool* ptparam,
|
PARAM_CFG_BOOL( bool Insetup, const wxChar* ident, bool* ptparam,
|
||||||
int default_val = FALSE, const wxChar* group = NULL );
|
int default_val = FALSE, const wxChar* group = NULL );
|
||||||
|
|
||||||
/** ReadParam
|
|
||||||
* read the value of parameter thi stored in aConfig
|
|
||||||
* @param aConfig = the wxConfigBase that store the parameter
|
|
||||||
*/
|
|
||||||
virtual void ReadParam( wxConfigBase* aConfig );
|
virtual void ReadParam( wxConfigBase* aConfig );
|
||||||
|
|
||||||
/** SaveParam
|
|
||||||
* the the value of parameter thi stored in aConfig
|
|
||||||
* @param aConfig = the wxConfigBase that can store the parameter
|
|
||||||
*/
|
|
||||||
virtual void SaveParam( wxConfigBase* aConfig );
|
virtual void SaveParam( wxConfigBase* aConfig );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configuration parameter - wxString Class
|
||||||
|
*
|
||||||
|
*/
|
||||||
class PARAM_CFG_WXSTRING : public PARAM_CFG_BASE
|
class PARAM_CFG_WXSTRING : public PARAM_CFG_BASE
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
wxString* m_Pt_param; /* pointeur sur le parametre a configurer */
|
wxString* m_Pt_param; ///< Pointer to the parameter value
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PARAM_CFG_WXSTRING( const wxChar* ident, wxString* ptparam, const wxChar* group = NULL );
|
PARAM_CFG_WXSTRING( const wxChar* ident, wxString* ptparam, const wxChar* group = NULL );
|
||||||
|
@ -171,42 +169,28 @@ public:
|
||||||
const wxChar* ident,
|
const wxChar* ident,
|
||||||
wxString* ptparam,
|
wxString* ptparam,
|
||||||
const wxChar* group = NULL );
|
const wxChar* group = NULL );
|
||||||
/** ReadParam
|
|
||||||
* read the value of parameter thi stored in aConfig
|
|
||||||
* @param aConfig = the wxConfigBase that store the parameter
|
|
||||||
*/
|
|
||||||
virtual void ReadParam( wxConfigBase* aConfig );
|
|
||||||
|
|
||||||
/** SaveParam
|
virtual void ReadParam( wxConfigBase* aConfig );
|
||||||
* the the value of parameter thi stored in aConfig
|
|
||||||
* @param aConfig = the wxConfigBase that can store the parameter
|
|
||||||
*/
|
|
||||||
virtual void SaveParam( wxConfigBase* aConfig );
|
virtual void SaveParam( wxConfigBase* aConfig );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class PARAM_CFG_LIBNAME_LIST : public PARAM_CFG_BASE
|
class PARAM_CFG_LIBNAME_LIST : public PARAM_CFG_BASE
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
wxArrayString* m_Pt_param; /* pointeur sur le parametre a configurer */
|
wxArrayString* m_Pt_param; ///< Pointer to the parameter value
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PARAM_CFG_LIBNAME_LIST( const wxChar* ident,
|
PARAM_CFG_LIBNAME_LIST( const wxChar* ident,
|
||||||
wxArrayString* ptparam,
|
wxArrayString* ptparam,
|
||||||
const wxChar* group = NULL );
|
const wxChar* group = NULL );
|
||||||
|
|
||||||
/** ReadParam
|
|
||||||
* read the value of parameter thi stored in aConfig
|
|
||||||
* @param aConfig = the wxConfigBase that store the parameter
|
|
||||||
*/
|
|
||||||
virtual void ReadParam( wxConfigBase* aConfig );
|
virtual void ReadParam( wxConfigBase* aConfig );
|
||||||
|
|
||||||
/** SaveParam
|
|
||||||
* the the value of parameter thi stored in aConfig
|
|
||||||
* @param aConfig = the wxConfigBase that can store the parameter
|
|
||||||
*/
|
|
||||||
virtual void SaveParam( wxConfigBase* aConfig );
|
virtual void SaveParam( wxConfigBase* aConfig );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/** A list of parameters type */
|
||||||
typedef boost::ptr_vector< PARAM_CFG_BASE > PARAM_CFG_ARRAY;
|
typedef boost::ptr_vector< PARAM_CFG_BASE > PARAM_CFG_ARRAY;
|
||||||
|
|
||||||
#endif /* __PARAM_CONFIG_H__ */
|
#endif /* __PARAM_CONFIG_H__ */
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include "wxstruct.h"
|
#include "wxstruct.h"
|
||||||
#include "param_config.h"
|
#include "param_config.h"
|
||||||
#include "class_undoredo_container.h"
|
#include "class_undoredo_container.h"
|
||||||
|
#include "template_fieldnames.h"
|
||||||
|
|
||||||
|
|
||||||
class WinEDA_LibeditFrame;
|
class WinEDA_LibeditFrame;
|
||||||
|
@ -51,6 +52,7 @@ enum fl_rot_cmp
|
||||||
CMP_MIRROR_Y = 0x200 // Mirror around Y axis
|
CMP_MIRROR_Y = 0x200 // Mirror around Y axis
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Schematic editor (EESchema) main window.
|
* Schematic editor (EESchema) main window.
|
||||||
*/
|
*/
|
||||||
|
@ -68,6 +70,8 @@ public:
|
||||||
wxString m_UserLibraryPath;
|
wxString m_UserLibraryPath;
|
||||||
wxArrayString m_ComponentLibFiles;
|
wxArrayString m_ComponentLibFiles;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
TEMPLATES m_TemplateFieldNames;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
wxString m_DefaultSchematicFileName;
|
wxString m_DefaultSchematicFileName;
|
||||||
|
@ -108,6 +112,49 @@ public:
|
||||||
void SaveProjectFile( wxWindow* displayframe, bool askoverwrite = true );
|
void SaveProjectFile( wxWindow* displayframe, bool askoverwrite = true );
|
||||||
bool LoadProjectFile( const wxString& CfgFileName, bool ForceRereadConfig );
|
bool LoadProjectFile( const wxString& CfgFileName, bool ForceRereadConfig );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function GetDefaultFieldName
|
||||||
|
* returns a default symbol field name for field \a aFieldNdx for all components.
|
||||||
|
* These fieldnames are not modifiable, but template fieldnames are.
|
||||||
|
* @param aFieldNdx The field number index
|
||||||
|
*/
|
||||||
|
static wxString GetDefaultFieldName( int aFieldNdx );
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function AddTemplateFieldName
|
||||||
|
* inserts or appends a wanted symbol field name into the fieldnames
|
||||||
|
* template. Should be used for any symbol property editor. If the name
|
||||||
|
* already exists, it overwrites the same name.
|
||||||
|
*
|
||||||
|
* @param aFieldName is a full description of the wanted field, and it must not match
|
||||||
|
* any of the default fieldnames.
|
||||||
|
* @return int - the index within the config container at which aFieldName was
|
||||||
|
* added, or -1 if the name is illegal because it matches a default fieldname.
|
||||||
|
*/
|
||||||
|
int AddTemplateFieldName( const TEMPLATE_FIELDNAME& aFieldName )
|
||||||
|
{
|
||||||
|
return m_TemplateFieldNames.AddTemplateFieldName( aFieldName );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function GetTemplateFieldName
|
||||||
|
* returns a template fieldnames list for read only access.
|
||||||
|
*/
|
||||||
|
const TEMPLATE_FIELDNAMES& GetTemplateFieldNames()
|
||||||
|
{
|
||||||
|
return m_TemplateFieldNames.GetTemplateFieldNames();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function DeleteAllTemplateFieldNames
|
||||||
|
* removes all template fieldnames.
|
||||||
|
*/
|
||||||
|
void DeleteAllTemplateFieldNames()
|
||||||
|
{
|
||||||
|
m_TemplateFieldNames.DeleteAllTemplateFieldNames();
|
||||||
|
}
|
||||||
|
|
||||||
PARAM_CFG_ARRAY& GetConfigurationSettings( void );
|
PARAM_CFG_ARRAY& GetConfigurationSettings( void );
|
||||||
void LoadSettings();
|
void LoadSettings();
|
||||||
void SaveSettings();
|
void SaveSettings();
|
||||||
|
|
|
@ -549,30 +549,24 @@ void SPECCTRA_DB::ThrowIOError( const wxChar* fmt, ... ) throw( IOError )
|
||||||
|
|
||||||
void SPECCTRA_DB::expecting( DSN_T aTok ) throw( IOError )
|
void SPECCTRA_DB::expecting( DSN_T aTok ) throw( IOError )
|
||||||
{
|
{
|
||||||
wxString errText( _("Expecting") );
|
lexer->Expecting( aTok );
|
||||||
errText << wxT(" ") << GetTokenString( aTok );
|
|
||||||
lexer->ThrowIOError( errText, lexer->CurOffset() );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SPECCTRA_DB::expecting( const char* text ) throw( IOError )
|
void SPECCTRA_DB::expecting( const char* text ) throw( IOError )
|
||||||
{
|
{
|
||||||
wxString errText( _("Expecting") );
|
wxString errText = CONV_FROM_UTF8( text );
|
||||||
errText << wxT(" '") << CONV_FROM_UTF8(text) << wxT("'");
|
lexer->Expecting( errText );
|
||||||
lexer->ThrowIOError( errText, lexer->CurOffset() );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SPECCTRA_DB::unexpected( DSN_T aTok ) throw( IOError )
|
void SPECCTRA_DB::unexpected( DSN_T aTok ) throw( IOError )
|
||||||
{
|
{
|
||||||
wxString errText( _("Unexpected") );
|
lexer->Expecting( aTok );
|
||||||
errText << wxT(" ") << GetTokenString( aTok );
|
|
||||||
lexer->ThrowIOError( errText, lexer->CurOffset() );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SPECCTRA_DB::unexpected( const char* text ) throw( IOError )
|
void SPECCTRA_DB::unexpected( const char* text ) throw( IOError )
|
||||||
{
|
{
|
||||||
wxString errText( _("Unexpected") );
|
wxString errText = CONV_FROM_UTF8( text );
|
||||||
errText << wxT(" '") << CONV_FROM_UTF8(text) << wxT("'");
|
lexer->Unexpected( errText );
|
||||||
lexer->ThrowIOError( errText, lexer->CurOffset() );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue