merge in branch fp-lib-table
This commit is contained in:
commit
273244a196
|
@ -304,9 +304,8 @@ void DSNLEXER::Unexpected( int aTok ) throw( IO_ERROR )
|
||||||
|
|
||||||
void DSNLEXER::Duplicate( int aTok ) throw( IO_ERROR )
|
void DSNLEXER::Duplicate( int aTok ) throw( IO_ERROR )
|
||||||
{
|
{
|
||||||
wxString errText;
|
wxString errText = wxString::Format(
|
||||||
|
_("%s is a duplicate"), GetTokenString( aTok ).GetData() );
|
||||||
errText.Printf( _("%s is a duplicate"), GetTokenString( aTok ).GetData() );
|
|
||||||
THROW_PARSE_ERROR( errText, CurSource(), CurLine(), CurLineNumber(), CurOffset() );
|
THROW_PARSE_ERROR( errText, CurSource(), CurLine(), CurLineNumber(), CurOffset() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -358,9 +357,8 @@ int DSNLEXER::NeedNUMBER( const char* aExpectation ) throw( IO_ERROR )
|
||||||
int tok = NextTok();
|
int tok = NextTok();
|
||||||
if( tok != DSN_NUMBER )
|
if( tok != DSN_NUMBER )
|
||||||
{
|
{
|
||||||
wxString errText;
|
wxString errText = wxString::Format(
|
||||||
|
_("need a NUMBER for '%s'"), wxString::FromUTF8( aExpectation ).GetData() );
|
||||||
errText.Printf( _("need a NUMBER for '%s'"), wxString::FromUTF8( aExpectation ).GetData() );
|
|
||||||
THROW_PARSE_ERROR( errText, CurSource(), CurLine(), CurLineNumber(), CurOffset() );
|
THROW_PARSE_ERROR( errText, CurSource(), CurLine(), CurLineNumber(), CurOffset() );
|
||||||
}
|
}
|
||||||
return tok;
|
return tok;
|
||||||
|
|
|
@ -24,6 +24,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <wx/config.h> // wxExpandEnvVars()
|
||||||
|
|
||||||
#include <set>
|
#include <set>
|
||||||
|
|
||||||
#include <io_mgr.h>
|
#include <io_mgr.h>
|
||||||
|
@ -45,11 +47,29 @@ FP_LIB_TABLE::FP_LIB_TABLE( FP_LIB_TABLE* aFallBackTable ) :
|
||||||
|
|
||||||
void FP_LIB_TABLE::Parse( FP_LIB_TABLE_LEXER* in ) throw( IO_ERROR, PARSE_ERROR )
|
void FP_LIB_TABLE::Parse( FP_LIB_TABLE_LEXER* in ) throw( IO_ERROR, PARSE_ERROR )
|
||||||
{
|
{
|
||||||
T tok;
|
/*
|
||||||
|
(fp_lib_table
|
||||||
|
(lib (name NICKNAME)(descr DESCRIPTION)(type TYPE)(full_uri FULL_URI)(options OPTIONS))
|
||||||
|
:
|
||||||
|
)
|
||||||
|
|
||||||
|
Elements after (name) are order independent.
|
||||||
|
*/
|
||||||
|
|
||||||
|
T tok;
|
||||||
|
|
||||||
|
// This table may be nested within a larger s-expression, or not.
|
||||||
|
// Allow for parser of that optional containing s-epression to have looked ahead.
|
||||||
|
if( in->CurTok() != T_fp_lib_table )
|
||||||
|
{
|
||||||
|
in->NeedLEFT();
|
||||||
|
if( ( tok = in->NextTok() ) != T_fp_lib_table )
|
||||||
|
in->Expecting( T_fp_lib_table );
|
||||||
|
}
|
||||||
|
|
||||||
while( ( tok = in->NextTok() ) != T_RIGHT )
|
while( ( tok = in->NextTok() ) != T_RIGHT )
|
||||||
{
|
{
|
||||||
// (lib (name "LOGICAL")(type "TYPE")(full_uri "FULL_URI")(options "OPTIONS"))
|
ROW row; // reconstructed for each row in input stream.
|
||||||
|
|
||||||
if( tok == T_EOF )
|
if( tok == T_EOF )
|
||||||
in->Expecting( T_RIGHT );
|
in->Expecting( T_RIGHT );
|
||||||
|
@ -57,10 +77,14 @@ void FP_LIB_TABLE::Parse( FP_LIB_TABLE_LEXER* in ) throw( IO_ERROR, PARSE_ERROR
|
||||||
if( tok != T_LEFT )
|
if( tok != T_LEFT )
|
||||||
in->Expecting( T_LEFT );
|
in->Expecting( T_LEFT );
|
||||||
|
|
||||||
if( ( tok = in->NextTok() ) != T_fp_lib )
|
// in case there is a "row integrity" error, tell where later.
|
||||||
in->Expecting( T_fp_lib );
|
int lineNum = in->CurLineNumber();
|
||||||
|
int offset = in->CurOffset();
|
||||||
|
|
||||||
// (name "LOGICAL_NAME")
|
if( ( tok = in->NextTok() ) != T_lib )
|
||||||
|
in->Expecting( T_lib );
|
||||||
|
|
||||||
|
// (name NICKNAME)
|
||||||
in->NeedLEFT();
|
in->NeedLEFT();
|
||||||
|
|
||||||
if( ( tok = in->NextTok() ) != T_name )
|
if( ( tok = in->NextTok() ) != T_name )
|
||||||
|
@ -68,48 +92,74 @@ void FP_LIB_TABLE::Parse( FP_LIB_TABLE_LEXER* in ) throw( IO_ERROR, PARSE_ERROR
|
||||||
|
|
||||||
in->NeedSYMBOLorNUMBER();
|
in->NeedSYMBOLorNUMBER();
|
||||||
|
|
||||||
ROW row;
|
|
||||||
|
|
||||||
row.SetNickName( in->FromUTF8() );
|
row.SetNickName( in->FromUTF8() );
|
||||||
|
|
||||||
in->NeedRIGHT();
|
in->NeedRIGHT();
|
||||||
|
|
||||||
// (uri "FULL_URI")
|
// After (name), remaining (lib) elements are order independent, and in
|
||||||
in->NeedLEFT();
|
// some cases optional.
|
||||||
|
|
||||||
if( ( tok = in->NextTok() ) != T_full_uri )
|
bool sawType = false;
|
||||||
in->Expecting( T_full_uri );
|
bool sawOpts = false;
|
||||||
|
bool sawDesc = false;
|
||||||
|
bool sawUri = false;
|
||||||
|
|
||||||
in->NeedSYMBOLorNUMBER();
|
while( ( tok = in->NextTok() ) != T_RIGHT )
|
||||||
|
{
|
||||||
|
if( tok == T_EOF )
|
||||||
|
in->Unexpected( T_EOF );
|
||||||
|
|
||||||
row.SetFullURI( in->FromUTF8() );
|
if( tok != T_LEFT )
|
||||||
|
in->Expecting( T_LEFT );
|
||||||
|
|
||||||
in->NeedRIGHT();
|
tok = in->NeedSYMBOLorNUMBER();
|
||||||
|
|
||||||
// (type "TYPE")
|
switch( tok )
|
||||||
in->NeedLEFT();
|
{
|
||||||
|
case T_uri:
|
||||||
|
if( sawUri )
|
||||||
|
in->Duplicate( tok );
|
||||||
|
sawUri = true;
|
||||||
|
in->NeedSYMBOLorNUMBER();
|
||||||
|
row.SetFullURI( in->FromUTF8() );
|
||||||
|
break;
|
||||||
|
|
||||||
if( ( tok = in->NextTok() ) != T_type )
|
case T_type:
|
||||||
|
if( sawType )
|
||||||
|
in->Duplicate( tok );
|
||||||
|
sawType = true;
|
||||||
|
in->NeedSYMBOLorNUMBER();
|
||||||
|
row.SetType( in->FromUTF8() );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case T_options:
|
||||||
|
if( sawOpts )
|
||||||
|
in->Duplicate( tok );
|
||||||
|
sawOpts = true;
|
||||||
|
in->NeedSYMBOLorNUMBER();
|
||||||
|
row.SetOptions( in->FromUTF8() );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case T_descr:
|
||||||
|
if( sawDesc )
|
||||||
|
in->Duplicate( tok );
|
||||||
|
sawDesc = true;
|
||||||
|
in->NeedSYMBOLorNUMBER();
|
||||||
|
row.SetDescr( in->FromUTF8() );
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
in->Unexpected( tok );
|
||||||
|
}
|
||||||
|
|
||||||
|
in->NeedRIGHT();
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !sawType )
|
||||||
in->Expecting( T_type );
|
in->Expecting( T_type );
|
||||||
|
|
||||||
in->NeedSYMBOLorNUMBER();
|
if( !sawUri )
|
||||||
|
in->Expecting( T_uri );
|
||||||
row.SetType( in->FromUTF8() );
|
|
||||||
|
|
||||||
in->NeedRIGHT();
|
|
||||||
|
|
||||||
// (options "OPTIONS")
|
|
||||||
in->NeedLEFT();
|
|
||||||
|
|
||||||
if( ( tok = in->NextTok() ) != T_options )
|
|
||||||
in->Expecting( T_options );
|
|
||||||
|
|
||||||
in->NeedSYMBOLorNUMBER();
|
|
||||||
|
|
||||||
row.SetOptions( in->FromUTF8() );
|
|
||||||
|
|
||||||
in->NeedRIGHT();
|
|
||||||
in->NeedRIGHT(); // terminate the (lib..)
|
|
||||||
|
|
||||||
// all nickNames within this table fragment must be unique, so we do not
|
// all nickNames within this table fragment must be unique, so we do not
|
||||||
// use doReplace in InsertRow(). (However a fallBack table can have a
|
// use doReplace in InsertRow(). (However a fallBack table can have a
|
||||||
|
@ -119,9 +169,8 @@ void FP_LIB_TABLE::Parse( FP_LIB_TABLE_LEXER* in ) throw( IO_ERROR, PARSE_ERROR
|
||||||
{
|
{
|
||||||
wxString msg = wxString::Format(
|
wxString msg = wxString::Format(
|
||||||
_( "'%s' is a duplicate footprint library nickName" ),
|
_( "'%s' is a duplicate footprint library nickName" ),
|
||||||
GetChars( row.nickName )
|
GetChars( row.nickName ) );
|
||||||
);
|
THROW_PARSE_ERROR( msg, in->CurSource(), in->CurLine(), lineNum, offset );
|
||||||
THROW_IO_ERROR( msg );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -142,11 +191,12 @@ void FP_LIB_TABLE::Format( OUTPUTFORMATTER* out, int nestLevel ) const
|
||||||
void FP_LIB_TABLE::ROW::Format( OUTPUTFORMATTER* out, int nestLevel ) const
|
void FP_LIB_TABLE::ROW::Format( OUTPUTFORMATTER* out, int nestLevel ) const
|
||||||
throw( IO_ERROR )
|
throw( IO_ERROR )
|
||||||
{
|
{
|
||||||
out->Print( nestLevel, "(lib (name %s)(full_uri %s)(type %s)(options %s))\n",
|
out->Print( nestLevel, "(lib (name %s)(type %s)(uri %s)(options %s)(descr %s))\n",
|
||||||
out->Quotew( GetNickName() ).c_str(),
|
out->Quotew( GetNickName() ).c_str(),
|
||||||
out->Quotew( GetFullURI() ).c_str(),
|
|
||||||
out->Quotew( GetType() ).c_str(),
|
out->Quotew( GetType() ).c_str(),
|
||||||
out->Quotew( GetOptions() ).c_str()
|
out->Quotew( GetFullURI() ).c_str(),
|
||||||
|
out->Quotew( GetOptions() ).c_str(),
|
||||||
|
out->Quotew( GetDescr() ).c_str()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -252,6 +302,14 @@ PLUGIN* FP_LIB_TABLE::PluginFind( const wxString& aLibraryNickName )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const wxString FP_LIB_TABLE::ExpandSubtitutions( const wxString aString )
|
||||||
|
{
|
||||||
|
// We reserve the right to do this another way, by providing our own member
|
||||||
|
// function.
|
||||||
|
return wxExpandEnvVars( aString );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#if 0 // don't know that this is needed yet
|
#if 0 // don't know that this is needed yet
|
||||||
MODULE* FP_LIB_TABLE::LookupFootprint( const FP_LIB_ID& aFootprintId )
|
MODULE* FP_LIB_TABLE::LookupFootprint( const FP_LIB_ID& aFootprintId )
|
||||||
throw( IO_ERROR )
|
throw( IO_ERROR )
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
fp_lib_table
|
fp_lib_table
|
||||||
|
lib
|
||||||
name
|
name
|
||||||
type
|
type
|
||||||
kicad
|
uri
|
||||||
legacy
|
|
||||||
eagle
|
|
||||||
full_uri
|
|
||||||
options
|
options
|
||||||
fp_lib
|
descr
|
||||||
|
|
|
@ -39,27 +39,58 @@
|
||||||
// "richio" after its author, Richard Hollenbeck, aka Dick Hollenbeck.
|
// "richio" after its author, Richard Hollenbeck, aka Dick Hollenbeck.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void IO_ERROR::init( const char* aThrowersFile, const char* aThrowersLoc, const wxString& aMsg )
|
||||||
|
{
|
||||||
|
errorText.Printf( IO_FORMAT, aMsg.GetData(),
|
||||||
|
wxString::FromUTF8( aThrowersFile ).GetData(),
|
||||||
|
wxString::FromUTF8( aThrowersLoc ).GetData() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PARSE_ERROR::init( const char* aThrowersFile, const char* aThrowersLoc,
|
||||||
|
const wxString& aMsg, const wxString& aSource,
|
||||||
|
const char* aInputLine,
|
||||||
|
int aLineNumber, int aByteIndex )
|
||||||
|
{
|
||||||
|
// save inpuLine, lineNumber, and offset for UI (.e.g. Sweet text editor)
|
||||||
|
inputLine = aInputLine;
|
||||||
|
lineNumber = aLineNumber;
|
||||||
|
byteIndex = aByteIndex;
|
||||||
|
|
||||||
|
errorText.Printf( PARSE_FORMAT, aMsg.GetData(), aSource.GetData(),
|
||||||
|
aLineNumber, aByteIndex,
|
||||||
|
wxString::FromUTF8( aThrowersFile ).GetData(),
|
||||||
|
wxString::FromUTF8( aThrowersLoc ).GetData() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----<LINE_READER>------------------------------------------------------
|
//-----<LINE_READER>------------------------------------------------------
|
||||||
|
|
||||||
LINE_READER::LINE_READER( unsigned aMaxLineLength )
|
LINE_READER::LINE_READER( unsigned aMaxLineLength )
|
||||||
{
|
{
|
||||||
lineNum = 0;
|
lineNum = 0;
|
||||||
|
|
||||||
if( aMaxLineLength == 0 ) // caller is goofed up.
|
if( aMaxLineLength == 0 )
|
||||||
aMaxLineLength = LINE_READER_LINE_DEFAULT_MAX;
|
{
|
||||||
|
line = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
maxLineLength = aMaxLineLength;
|
||||||
|
|
||||||
maxLineLength = aMaxLineLength;
|
// start at the INITIAL size, expand as needed up to the MAX size in maxLineLength
|
||||||
|
capacity = LINE_READER_LINE_INITIAL_SIZE;
|
||||||
|
|
||||||
// start at the INITIAL size, expand as needed up to the MAX size in maxLineLength
|
// but never go above user's aMaxLineLength, and leave space for trailing nul
|
||||||
capacity = LINE_READER_LINE_INITIAL_SIZE;
|
if( capacity > aMaxLineLength+1 )
|
||||||
|
capacity = aMaxLineLength+1;
|
||||||
|
|
||||||
// but never go above user's aMaxLineLength, and leave space for trailing nul
|
line = new char[capacity];
|
||||||
if( capacity > aMaxLineLength+1 )
|
|
||||||
capacity = aMaxLineLength+1;
|
|
||||||
|
|
||||||
line = new char[capacity];
|
line[0] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
line[0] = '\0';
|
|
||||||
length = 0;
|
length = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ class FP_LIB_TABLE_LEXER;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class FP_LIB_TABLE
|
* Class FP_LIB_TABLE
|
||||||
* holds FP_LIB_TABLE::ROW records, and can be searched based on logical library name.
|
* holds FP_LIB_TABLE::ROW records (rows), and can be searched based on library nickName.
|
||||||
* <p>
|
* <p>
|
||||||
* This class owns the <b>footprint library table</b>, which is like fstab in concept and maps
|
* This class owns the <b>footprint library table</b>, which is like fstab in concept and maps
|
||||||
* logical library name to the library URI, type, and options. It is heavily based on the SWEET
|
* logical library name to the library URI, type, and options. It is heavily based on the SWEET
|
||||||
|
@ -104,10 +104,12 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
ROW( const wxString& aNick, const wxString& aURI, const wxString& aType, const wxString& aOptions ) :
|
ROW( const wxString& aNick, const wxString& aURI, const wxString& aType,
|
||||||
|
const wxString& aOptions, const wxString& aDescr = wxEmptyString ) :
|
||||||
nickName( aNick ),
|
nickName( aNick ),
|
||||||
uri( aURI ),
|
uri( aURI ),
|
||||||
options( aOptions )
|
options( aOptions ),
|
||||||
|
description( aDescr )
|
||||||
{
|
{
|
||||||
SetType( aType );
|
SetType( aType );
|
||||||
}
|
}
|
||||||
|
@ -119,42 +121,69 @@ public:
|
||||||
|
|
||||||
bool operator!=( const ROW& r ) const { return !( *this == r ); }
|
bool operator!=( const ROW& r ) const { return !( *this == r ); }
|
||||||
|
|
||||||
|
//-----<accessors>------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function GetNickName
|
* Function GetNickName
|
||||||
* returns the short name of this library table row.
|
* returns the short name of this library table row.
|
||||||
*/
|
*/
|
||||||
const wxString& GetNickName() const
|
const wxString& GetNickName() const { return nickName; }
|
||||||
{
|
|
||||||
return nickName;
|
/**
|
||||||
}
|
* Function SetNickName
|
||||||
|
* changes the logical name of this library, useful for an editor.
|
||||||
|
*/
|
||||||
|
void SetNickName( const wxString& aNickName ) { nickName = aNickName; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function GetType
|
* Function GetType
|
||||||
* returns the type of LIB represented by this record.
|
* returns the type of LIB represented by this row.
|
||||||
*/
|
*/
|
||||||
const wxString GetType() const
|
const wxString GetType() const { return IO_MGR::ShowType( type ); }
|
||||||
{
|
|
||||||
return IO_MGR::ShowType( type );
|
/**
|
||||||
}
|
* Function SetType
|
||||||
|
* changes the type represented by this row.
|
||||||
|
*/
|
||||||
|
void SetType( const wxString& aType ) { type = IO_MGR::EnumFromStr( aType ); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function GetFullURI
|
* Function GetFullURI
|
||||||
* returns the full location specifying URI for the LIB.
|
* returns the full location specifying URI for the LIB.
|
||||||
*/
|
*/
|
||||||
const wxString& GetFullURI() const
|
const wxString& GetFullURI() const { return uri; }
|
||||||
{
|
|
||||||
return uri;
|
/**
|
||||||
}
|
* Function SetFullURI
|
||||||
|
* changes the full URI for the library.
|
||||||
|
*/
|
||||||
|
void SetFullURI( const wxString& aFullURI ) { uri = aFullURI; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function GetOptions
|
* Function GetOptions
|
||||||
* returns the options string, which may hold a password or anything else needed to
|
* returns the options string, which may hold a password or anything else needed to
|
||||||
* instantiate the underlying LIB_SOURCE.
|
* instantiate the underlying LIB_SOURCE.
|
||||||
*/
|
*/
|
||||||
const wxString& GetOptions() const
|
const wxString& GetOptions() const { return options; }
|
||||||
{
|
|
||||||
return options;
|
/**
|
||||||
}
|
* Function SetOptions
|
||||||
|
*/
|
||||||
|
void SetOptions( const wxString& aOptions ) { options = aOptions; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function GetDescr
|
||||||
|
* returns the description of the library referenced by this row.
|
||||||
|
*/
|
||||||
|
const wxString& GetDescr() const { return description; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function SetDescr
|
||||||
|
* changes the description of the library referenced by this row.
|
||||||
|
*/
|
||||||
|
void SetDescr( const wxString& aDescr ) { description = aDescr; }
|
||||||
|
|
||||||
|
//-----</accessors>-----------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function Format
|
* Function Format
|
||||||
|
@ -167,49 +196,13 @@ public:
|
||||||
void Format( OUTPUTFORMATTER* out, int nestLevel ) const
|
void Format( OUTPUTFORMATTER* out, int nestLevel ) const
|
||||||
throw( IO_ERROR );
|
throw( IO_ERROR );
|
||||||
|
|
||||||
/**
|
|
||||||
* Function SetNickName
|
|
||||||
* changes the logical name of this library, useful for an editor.
|
|
||||||
*/
|
|
||||||
void SetNickName( const wxString& aNickName )
|
|
||||||
{
|
|
||||||
nickName = aNickName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function SetType
|
|
||||||
* changes the type represented by this record.
|
|
||||||
*/
|
|
||||||
void SetType( const wxString& aType )
|
|
||||||
{
|
|
||||||
type = IO_MGR::EnumFromStr( aType );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function SetFullURI
|
|
||||||
* changes the full URI for the library, useful from a library table editor.
|
|
||||||
*/
|
|
||||||
void SetFullURI( const wxString& aFullURI )
|
|
||||||
{
|
|
||||||
uri = aFullURI;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function SetOptions
|
|
||||||
* changes the options string for this record, and is useful from
|
|
||||||
* the library table editor.
|
|
||||||
*/
|
|
||||||
void SetOptions( const wxString& aOptions )
|
|
||||||
{
|
|
||||||
options = aOptions;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
wxString nickName;
|
wxString nickName;
|
||||||
wxString uri;
|
wxString uri;
|
||||||
LIB_T type;
|
LIB_T type;
|
||||||
wxString options;
|
wxString options;
|
||||||
|
wxString description;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -219,7 +212,7 @@ public:
|
||||||
* @a aFallBackTable. Loading of this table fragment is done by using Parse().
|
* @a aFallBackTable. Loading of this table fragment is done by using Parse().
|
||||||
*
|
*
|
||||||
* @param aFallBackTable is another FP_LIB_TABLE which is searched only when
|
* @param aFallBackTable is another FP_LIB_TABLE which is searched only when
|
||||||
* a record is not found in this table. No ownership is
|
* a row is not found in this table. No ownership is
|
||||||
* taken of aFallBackTable.
|
* taken of aFallBackTable.
|
||||||
*/
|
*/
|
||||||
FP_LIB_TABLE( FP_LIB_TABLE* aFallBackTable = NULL );
|
FP_LIB_TABLE( FP_LIB_TABLE* aFallBackTable = NULL );
|
||||||
|
@ -249,9 +242,9 @@ public:
|
||||||
*
|
*
|
||||||
* <pre>
|
* <pre>
|
||||||
* (fp_lib_table
|
* (fp_lib_table
|
||||||
* (lib (name LOGICAL)(type TYPE)(uri FULL_URI)(options OPTIONS))
|
* (lib (name LOGICAL)(descr DESCRIPTION)(uri FULL_URI)(type TYPE)(options OPTIONS))
|
||||||
* (lib (name LOGICAL)(type TYPE)(uri FULL_URI)(options OPTIONS))
|
* (lib (name LOGICAL)(descr DESCRIPTION)(uri FULL_URI)(type TYPE)(options OPTIONS))
|
||||||
* (lib (name LOGICAL)(type TYPE)(uri FULL_URI)(options OPTIONS))
|
* (lib (name LOGICAL)(descr DESCRIPTION)(uri FULL_URI)(type TYPE)(options OPTIONS))
|
||||||
* )
|
* )
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -363,6 +356,15 @@ public:
|
||||||
const ROW* FindRow( const wxString& aNickName ) throw( IO_ERROR );
|
const ROW* FindRow( const wxString& aNickName ) throw( IO_ERROR );
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function ExpandEnvSubsitutions
|
||||||
|
* replaces any environment variable references with their values and is
|
||||||
|
* here to fully embellish the ROW::uri in a platform independent way.
|
||||||
|
* This enables (fp_lib_table)s to have platform dependent environment
|
||||||
|
* variables in them, allowing for a uniform table across platforms.
|
||||||
|
*/
|
||||||
|
static const wxString ExpandSubtitutions( const wxString aString );
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -115,12 +115,7 @@ struct IO_ERROR // : std::exception
|
||||||
init( aThrowersFile, aThrowersLoc, wxString( aMsg ) );
|
init( aThrowersFile, aThrowersLoc, wxString( aMsg ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void init( const char* aThrowersFile, const char* aThrowersLoc, const wxString& aMsg )
|
void init( const char* aThrowersFile, const char* aThrowersLoc, const wxString& aMsg );
|
||||||
{
|
|
||||||
errorText.Printf( IO_FORMAT, aMsg.GetData(),
|
|
||||||
wxString::FromUTF8( aThrowersFile ).GetData(),
|
|
||||||
wxString::FromUTF8( aThrowersLoc ).GetData() );
|
|
||||||
}
|
|
||||||
|
|
||||||
IO_ERROR() {}
|
IO_ERROR() {}
|
||||||
|
|
||||||
|
@ -165,18 +160,7 @@ struct PARSE_ERROR : public IO_ERROR
|
||||||
void init( const char* aThrowersFile, const char* aThrowersLoc,
|
void init( const char* aThrowersFile, const char* aThrowersLoc,
|
||||||
const wxString& aMsg, const wxString& aSource,
|
const wxString& aMsg, const wxString& aSource,
|
||||||
const char* aInputLine,
|
const char* aInputLine,
|
||||||
int aLineNumber, int aByteIndex )
|
int aLineNumber, int aByteIndex );
|
||||||
{
|
|
||||||
// save inpuLine, lineNumber, and offset for UI (.e.g. Sweet text editor)
|
|
||||||
inputLine = aInputLine;
|
|
||||||
lineNumber = aLineNumber;
|
|
||||||
byteIndex = aByteIndex;
|
|
||||||
|
|
||||||
errorText.Printf( PARSE_FORMAT, aMsg.GetData(), aSource.GetData(),
|
|
||||||
aLineNumber, aByteIndex,
|
|
||||||
wxString::FromUTF8( aThrowersFile ).GetData(),
|
|
||||||
wxString::FromUTF8( aThrowersLoc ).GetData() );
|
|
||||||
}
|
|
||||||
|
|
||||||
~PARSE_ERROR() throw ( /*none*/ ){}
|
~PARSE_ERROR() throw ( /*none*/ ){}
|
||||||
};
|
};
|
||||||
|
|
|
@ -24,11 +24,29 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* TODO:
|
||||||
|
|
||||||
|
*) Check for duplicate nicknames per table
|
||||||
|
|
||||||
|
*) Grab text from any pending ChoiceEditor when OK button pressed.
|
||||||
|
|
||||||
|
*) Test wxRE_ADVANCED on Windows.
|
||||||
|
|
||||||
|
*) Do environment variable substitution on lookup
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include <fctsys.h>
|
#include <fctsys.h>
|
||||||
#include <dialog_fp_lib_table_base.h>
|
#include <dialog_fp_lib_table_base.h>
|
||||||
#include <fp_lib_table.h>
|
#include <fp_lib_table.h>
|
||||||
#include <wx/grid.h>
|
#include <wx/grid.h>
|
||||||
|
#include <wx/clipbrd.h>
|
||||||
|
#include <wx/tokenzr.h>
|
||||||
|
#include <wx/arrstr.h>
|
||||||
|
#include <wx/regex.h>
|
||||||
|
#include <set>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class FP_TBL_MODEL
|
* Class FP_TBL_MODEL
|
||||||
|
@ -39,6 +57,16 @@ class FP_TBL_MODEL : public wxGridTableBase, public FP_LIB_TABLE
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
enum COL_ORDER ///< grid column order, established by this sequence
|
||||||
|
{
|
||||||
|
COL_NICKNAME,
|
||||||
|
COL_URI,
|
||||||
|
COL_TYPE,
|
||||||
|
COL_OPTIONS,
|
||||||
|
COL_DESCR,
|
||||||
|
COL_COUNT // keep as last
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor FP_TBL_MODEL
|
* Constructor FP_TBL_MODEL
|
||||||
* is a copy constructor that builds a wxGridTableBase (table model) by wrapping
|
* is a copy constructor that builds a wxGridTableBase (table model) by wrapping
|
||||||
|
@ -52,7 +80,7 @@ public:
|
||||||
//-----<wxGridTableBase overloads>-------------------------------------------
|
//-----<wxGridTableBase overloads>-------------------------------------------
|
||||||
|
|
||||||
int GetNumberRows () { return rows.size(); }
|
int GetNumberRows () { return rows.size(); }
|
||||||
int GetNumberCols () { return 4; }
|
int GetNumberCols () { return COL_COUNT; }
|
||||||
|
|
||||||
wxString GetValue( int aRow, int aCol )
|
wxString GetValue( int aRow, int aCol )
|
||||||
{
|
{
|
||||||
|
@ -62,10 +90,11 @@ public:
|
||||||
|
|
||||||
switch( aCol )
|
switch( aCol )
|
||||||
{
|
{
|
||||||
case 0: return r.GetNickName();
|
case COL_NICKNAME: return r.GetNickName();
|
||||||
case 1: return r.GetFullURI();
|
case COL_URI: return r.GetFullURI();
|
||||||
case 2: return r.GetType();
|
case COL_TYPE: return r.GetType();
|
||||||
case 3: return r.GetOptions();
|
case COL_OPTIONS: return r.GetOptions();
|
||||||
|
case COL_DESCR: return r.GetDescr();
|
||||||
default:
|
default:
|
||||||
; // fall thru to wxEmptyString
|
; // fall thru to wxEmptyString
|
||||||
}
|
}
|
||||||
|
@ -82,10 +111,11 @@ public:
|
||||||
|
|
||||||
switch( aCol )
|
switch( aCol )
|
||||||
{
|
{
|
||||||
case 0: r.SetNickName( aValue ); break;
|
case COL_NICKNAME: r.SetNickName( aValue ); break;
|
||||||
case 1: r.SetFullURI( aValue ); break;
|
case COL_URI: r.SetFullURI( aValue ); break;
|
||||||
case 2: r.SetType( aValue ); break;
|
case COL_TYPE: r.SetType( aValue ); break;
|
||||||
case 3: r.SetOptions( aValue ); break;
|
case COL_OPTIONS: r.SetOptions( aValue ); break;
|
||||||
|
case COL_DESCR: r.SetDescr( aValue ); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -169,19 +199,38 @@ public:
|
||||||
{
|
{
|
||||||
switch( aCol )
|
switch( aCol )
|
||||||
{
|
{
|
||||||
case 0: return _( "Nickname" );
|
case COL_NICKNAME: return _( "Nickname" );
|
||||||
case 1: return _( "Library Path" );
|
case COL_URI: return _( "Library Path" );
|
||||||
case 2: return _( "Plugin" );
|
|
||||||
case 3: return _( "Options" );
|
// keep this text fairly long so column is sized wide enough
|
||||||
default: return wxEmptyString;
|
case COL_TYPE: return _( "Plugin Type" );
|
||||||
|
case COL_OPTIONS: return _( "Options" );
|
||||||
|
case COL_DESCR: return _( "Description" );
|
||||||
|
default: return wxEmptyString;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----</wxGridTableBase overloads>------------------------------------------
|
/*
|
||||||
|
wxGridCellAttr* GetAttr( int aRow, int aCol, wxGridCellAttr::wxAttrKind aKind ) const // overload
|
||||||
|
{
|
||||||
|
if( aCol != COL_TYPE )
|
||||||
|
return wxGridTableBase::GetAttr( aRow, aCol, aKind );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
//-----</wxGridTableBase overloads>------------------------------------------
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// It works for table data on clipboard for an Excell spreadsheet,
|
||||||
|
// why not us too for now.
|
||||||
|
#define COL_SEP wxT( '\t' )
|
||||||
|
#define ROW_SEP wxT( '\n' )
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class DIALOG_FP_LIB_TABLE
|
* Class DIALOG_FP_LIB_TABLE
|
||||||
|
@ -192,19 +241,31 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE
|
||||||
{
|
{
|
||||||
typedef FP_LIB_TABLE::ROW ROW;
|
typedef FP_LIB_TABLE::ROW ROW;
|
||||||
|
|
||||||
/* row & col "selection" acquisition, not currently used but works.
|
enum
|
||||||
|
{
|
||||||
|
ID_CUT, // = wxID_HIGHEST + 1,
|
||||||
|
ID_COPY,
|
||||||
|
ID_PASTE,
|
||||||
|
};
|
||||||
|
|
||||||
|
// row & col "selection" acquisition
|
||||||
// selected area by cell coordinate and count
|
// selected area by cell coordinate and count
|
||||||
int selRowStart;
|
int selRowStart;
|
||||||
int selColStart;
|
int selColStart;
|
||||||
int selRowCount;
|
int selRowCount;
|
||||||
int selColCount;
|
int selColCount;
|
||||||
|
|
||||||
/// Gets the selected area into a sensible rectable of sel{Row,Col}{Start,Count} above.
|
/// Gets the selected area into a sensible rectangle of sel{Row,Col}{Start,Count} above.
|
||||||
void getSelectedArea()
|
void getSelectedArea()
|
||||||
{
|
{
|
||||||
wxGridCellCoordsArray topLeft = m_cur_grid->GetSelectionBlockTopLeft();
|
wxGridCellCoordsArray topLeft = m_cur_grid->GetSelectionBlockTopLeft();
|
||||||
wxGridCellCoordsArray botRight = m_cur_grid->GetSelectionBlockBottomRight();
|
wxGridCellCoordsArray botRight = m_cur_grid->GetSelectionBlockBottomRight();
|
||||||
|
|
||||||
|
wxArrayInt cols = m_cur_grid->GetSelectedCols();
|
||||||
|
wxArrayInt rows = m_cur_grid->GetSelectedRows();
|
||||||
|
|
||||||
|
D(printf("topLeft.Count():%zd botRight:Count():%zd\n", topLeft.Count(), botRight.Count() );)
|
||||||
|
|
||||||
if( topLeft.Count() && botRight.Count() )
|
if( topLeft.Count() && botRight.Count() )
|
||||||
{
|
{
|
||||||
selRowStart = topLeft[0].GetRow();
|
selRowStart = topLeft[0].GetRow();
|
||||||
|
@ -213,6 +274,20 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE
|
||||||
selRowCount = botRight[0].GetRow() - selRowStart + 1;
|
selRowCount = botRight[0].GetRow() - selRowStart + 1;
|
||||||
selColCount = botRight[0].GetCol() - selColStart + 1;
|
selColCount = botRight[0].GetCol() - selColStart + 1;
|
||||||
}
|
}
|
||||||
|
else if( cols.Count() )
|
||||||
|
{
|
||||||
|
selColStart = cols[0];
|
||||||
|
selColCount = cols.Count();
|
||||||
|
selRowStart = 0;
|
||||||
|
selRowCount = m_cur_grid->GetNumberRows();
|
||||||
|
}
|
||||||
|
else if( rows.Count() )
|
||||||
|
{
|
||||||
|
selColStart = 0;
|
||||||
|
selColCount = m_cur_grid->GetNumberCols();
|
||||||
|
selRowStart = rows[0];
|
||||||
|
selRowCount = rows.Count();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
selRowStart = -1;
|
selRowStart = -1;
|
||||||
|
@ -221,19 +296,122 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE
|
||||||
selColCount = 0;
|
selColCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
D(printf("selRowStart:%d selColStart:%d selRowCount:%d selColCount:%d\n",
|
// D(printf("selRowStart:%d selColStart:%d selRowCount:%d selColCount:%d\n", selRowStart, selColStart, selRowCount, selColCount );)
|
||||||
selRowStart, selColStart, selRowCount, selColCount );)
|
}
|
||||||
|
|
||||||
|
void rightClickCellPopupMenu()
|
||||||
|
{
|
||||||
|
wxMenu menu;
|
||||||
|
|
||||||
|
menu.Append( ID_CUT, _( "Cut" ), _( "Clear selected cells" ) );
|
||||||
|
menu.Append( ID_COPY, _( "Copy" ), _( "Copy selected cells to clipboard" ) );
|
||||||
|
menu.Append( ID_PASTE, _( "Paste" ), _( "Paste clipboard cells to matrix at current cell" ) );
|
||||||
|
|
||||||
|
getSelectedArea();
|
||||||
|
|
||||||
|
// if nothing is selected, diable cut and copy.
|
||||||
|
if( !selRowCount && !selColCount )
|
||||||
|
{
|
||||||
|
menu.Enable( ID_CUT, false );
|
||||||
|
menu.Enable( ID_COPY, false );
|
||||||
|
}
|
||||||
|
|
||||||
|
// if there is no current cell cursor, disable paste.
|
||||||
|
if( m_cur_row == -1 || m_cur_col == -1 )
|
||||||
|
menu.Enable( ID_PASTE, false );
|
||||||
|
|
||||||
|
PopupMenu( &menu );
|
||||||
|
|
||||||
|
// passOnFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
// the user clicked on a popup menu choice:
|
||||||
|
void onPopupSelection( wxCommandEvent& event )
|
||||||
|
{
|
||||||
|
int menuId = event.GetId();
|
||||||
|
|
||||||
|
// assume getSelectedArea() was called by rightClickPopupMenu() and there's
|
||||||
|
// no way to have gotten here without that having been called.
|
||||||
|
|
||||||
|
switch( menuId )
|
||||||
|
{
|
||||||
|
case ID_CUT:
|
||||||
|
case ID_COPY:
|
||||||
|
// this format is compatible with most spreadsheets
|
||||||
|
if( wxTheClipboard->Open() )
|
||||||
|
{
|
||||||
|
wxGridTableBase* tbl = m_cur_grid->GetTable();
|
||||||
|
wxString txt;
|
||||||
|
|
||||||
|
for( int row = selRowStart; row < selRowStart + selRowCount; ++row )
|
||||||
|
{
|
||||||
|
for( int col = selColStart; col < selColStart + selColCount; ++col )
|
||||||
|
{
|
||||||
|
txt += tbl->GetValue( row, col );
|
||||||
|
|
||||||
|
if( col < selColStart + selColCount - 1 ) // that was not last column
|
||||||
|
txt += COL_SEP;
|
||||||
|
|
||||||
|
if( menuId == ID_CUT )
|
||||||
|
tbl->SetValue( row, col, wxEmptyString );
|
||||||
|
}
|
||||||
|
txt += ROW_SEP;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxTheClipboard->SetData( new wxTextDataObject( txt ) );
|
||||||
|
wxTheClipboard->Close();
|
||||||
|
m_cur_grid->ForceRefresh();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ID_PASTE:
|
||||||
|
D(printf( "paste\n" );)
|
||||||
|
// assume format came from a spreadsheet or us.
|
||||||
|
if( wxTheClipboard->Open() )
|
||||||
|
{
|
||||||
|
if( wxTheClipboard->IsSupported( wxDF_TEXT ) )
|
||||||
|
{
|
||||||
|
wxGridTableBase* tbl = m_cur_grid->GetTable();
|
||||||
|
wxTextDataObject data;
|
||||||
|
|
||||||
|
wxTheClipboard->GetData( data );
|
||||||
|
|
||||||
|
wxStringTokenizer rows( data.GetText(), ROW_SEP, wxTOKEN_RET_EMPTY );
|
||||||
|
|
||||||
|
// if clipboard rows would extend paste end of current table size...
|
||||||
|
if( int( rows.CountTokens() ) > tbl->GetNumberRows() - m_cur_row )
|
||||||
|
{
|
||||||
|
int newRowsNeeded = rows.CountTokens() - ( tbl->GetNumberRows() - m_cur_row );
|
||||||
|
tbl->AppendRows( newRowsNeeded );
|
||||||
|
}
|
||||||
|
|
||||||
|
for( int row = m_cur_row; rows.HasMoreTokens(); ++row )
|
||||||
|
{
|
||||||
|
wxString rowTxt = rows.GetNextToken();
|
||||||
|
|
||||||
|
wxStringTokenizer cols( rowTxt, COL_SEP, wxTOKEN_RET_EMPTY );
|
||||||
|
|
||||||
|
for( int col = m_cur_col; cols.HasMoreTokens(); ++col )
|
||||||
|
{
|
||||||
|
wxString cellTxt = cols.GetNextToken();
|
||||||
|
tbl->SetValue( row, col, cellTxt );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxTheClipboard->Close();
|
||||||
|
m_cur_grid->ForceRefresh();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
//-----<event handlers>----------------------------------
|
//-----<event handlers>----------------------------------
|
||||||
|
|
||||||
void pageChangedHandler( wxAuiNotebookEvent& event )
|
void pageChangedHandler( wxAuiNotebookEvent& event )
|
||||||
{
|
{
|
||||||
int pageNdx = m_auinotebook->GetSelection();
|
int pageNdx = m_auinotebook->GetSelection();
|
||||||
m_cur_grid = pageNdx==0 ? m_global_grid : m_project_grid;
|
m_cur_grid = ( pageNdx == 0 ) ? m_global_grid : m_project_grid;
|
||||||
|
|
||||||
D(printf("%s cur_grid is %s\n", __func__, pageNdx==0 ? "global" : "project" );)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void appendRowHandler( wxMouseEvent& event )
|
void appendRowHandler( wxMouseEvent& event )
|
||||||
|
@ -336,8 +514,98 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE
|
||||||
EndModal( dialogRet );
|
EndModal( dialogRet );
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----</event handlers>---------------------------------
|
void onGridCellLeftClick( wxGridEvent& event )
|
||||||
|
{
|
||||||
|
event.Skip();
|
||||||
|
}
|
||||||
|
|
||||||
|
void onGridCellLeftDClick( wxGridEvent& event )
|
||||||
|
{
|
||||||
|
event.Skip();
|
||||||
|
}
|
||||||
|
|
||||||
|
void onGridCellRightClick( wxGridEvent& event )
|
||||||
|
{
|
||||||
|
rightClickCellPopupMenu();
|
||||||
|
}
|
||||||
|
|
||||||
|
void onGridCmdSelectCell( wxGridEvent& event )
|
||||||
|
{
|
||||||
|
m_cur_row = event.GetRow();
|
||||||
|
m_cur_col = event.GetCol();
|
||||||
|
|
||||||
|
D(printf("change cursor(%d,%d)\n", m_cur_row, m_cur_col );)
|
||||||
|
|
||||||
|
// somebody else wants this
|
||||||
|
event.Skip();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Populate the readonly environment variable table with names and values
|
||||||
|
/// by examining all the full_uri columns.
|
||||||
|
void populateEnvironReadOnlyTable()
|
||||||
|
{
|
||||||
|
wxRegEx re( wxT( ".*?\\$\\{(.+?)\\}.*?" ), wxRE_ADVANCED );
|
||||||
|
wxASSERT( re.IsValid() ); // wxRE_ADVANCED is required.
|
||||||
|
|
||||||
|
std::set< wxString > unique;
|
||||||
|
typedef std::set<wxString>::const_iterator SET_CITER;
|
||||||
|
|
||||||
|
m_path_subs_grid->DeleteRows( 0, m_path_subs_grid->GetNumberRows() );
|
||||||
|
|
||||||
|
int gblRowCount = m_global_model.GetNumberRows();
|
||||||
|
int prjRowCount = m_project_model.GetNumberRows();
|
||||||
|
int row;
|
||||||
|
|
||||||
|
for( row = 0; row < gblRowCount; ++row )
|
||||||
|
{
|
||||||
|
wxString uri = m_global_model.GetValue( row, FP_TBL_MODEL::COL_URI );
|
||||||
|
|
||||||
|
while( re.Matches( uri ) )
|
||||||
|
{
|
||||||
|
wxString envvar = re.GetMatch( uri, 1 );
|
||||||
|
|
||||||
|
// ignore duplicates
|
||||||
|
unique.insert( envvar );
|
||||||
|
|
||||||
|
// delete the last match and search again
|
||||||
|
uri.Replace( re.GetMatch( uri, 0 ), wxEmptyString );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for( row = 0; row < prjRowCount; ++row )
|
||||||
|
{
|
||||||
|
wxString uri = m_project_model.GetValue( row, FP_TBL_MODEL::COL_URI );
|
||||||
|
|
||||||
|
while( re.Matches( uri ) )
|
||||||
|
{
|
||||||
|
wxString envvar = re.GetMatch( uri, 1 );
|
||||||
|
|
||||||
|
// ignore duplicates
|
||||||
|
unique.insert( envvar );
|
||||||
|
|
||||||
|
// delete the last match and search again
|
||||||
|
uri.Replace( re.GetMatch( uri, 0 ), wxEmptyString );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_path_subs_grid->AppendRows( unique.size() );
|
||||||
|
|
||||||
|
row = 0;
|
||||||
|
for( SET_CITER it = unique.begin(); it != unique.end(); ++it, ++row )
|
||||||
|
{
|
||||||
|
wxString evName = *it;
|
||||||
|
wxString evValue;
|
||||||
|
|
||||||
|
m_path_subs_grid->SetCellValue( row, 0, evName );
|
||||||
|
|
||||||
|
if( wxGetEnv( evName, &evValue ) )
|
||||||
|
m_path_subs_grid->SetCellValue( row, 1, evValue );
|
||||||
|
}
|
||||||
|
|
||||||
|
m_path_subs_grid->AutoSizeColumns();
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----</event handlers>---------------------------------
|
||||||
|
|
||||||
// caller's tables are modified only on OK button.
|
// caller's tables are modified only on OK button.
|
||||||
FP_LIB_TABLE* m_global;
|
FP_LIB_TABLE* m_global;
|
||||||
|
@ -349,6 +617,10 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE
|
||||||
|
|
||||||
wxGrid* m_cur_grid; ///< changed based on tab choice
|
wxGrid* m_cur_grid; ///< changed based on tab choice
|
||||||
|
|
||||||
|
// wxGrid makes it difficult to know if the cursor is yet visible,
|
||||||
|
// use this to solve that, initial values are -1
|
||||||
|
int m_cur_row; ///< cursor position
|
||||||
|
int m_cur_col;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
DIALOG_FP_LIB_TABLE( wxFrame* aParent, FP_LIB_TABLE* aGlobal, FP_LIB_TABLE* aProject ) :
|
DIALOG_FP_LIB_TABLE( wxFrame* aParent, FP_LIB_TABLE* aGlobal, FP_LIB_TABLE* aProject ) :
|
||||||
|
@ -356,16 +628,45 @@ public:
|
||||||
m_global( aGlobal ),
|
m_global( aGlobal ),
|
||||||
m_project( aProject ),
|
m_project( aProject ),
|
||||||
m_global_model( *aGlobal ),
|
m_global_model( *aGlobal ),
|
||||||
m_project_model( *aProject )
|
m_project_model( *aProject ),
|
||||||
|
m_cur_row( -1 ),
|
||||||
|
m_cur_col( -1 )
|
||||||
{
|
{
|
||||||
m_global_grid->SetTable( (wxGridTableBase*) &m_global_model );
|
m_global_grid->SetTable( (wxGridTableBase*) &m_global_model );
|
||||||
m_project_grid->SetTable( (wxGridTableBase*) &m_project_model );
|
m_project_grid->SetTable( (wxGridTableBase*) &m_project_model );
|
||||||
|
|
||||||
m_global_grid->AutoSizeColumns( false );
|
m_global_grid->AutoSizeColumns( false );
|
||||||
|
|
||||||
m_project_grid->AutoSizeColumns( false );
|
m_project_grid->AutoSizeColumns( false );
|
||||||
|
|
||||||
m_path_subs_grid->AutoSizeColumns( false );
|
wxArrayString choices;
|
||||||
|
choices.Add( IO_MGR::ShowType( IO_MGR::KICAD ) );
|
||||||
|
choices.Add( IO_MGR::ShowType( IO_MGR::LEGACY ) );
|
||||||
|
choices.Add( IO_MGR::ShowType( IO_MGR::EAGLE ) );
|
||||||
|
choices.Add( IO_MGR::ShowType( IO_MGR::GEDA_PCB ) );
|
||||||
|
|
||||||
|
wxGridCellAttr* attr;
|
||||||
|
|
||||||
|
attr = new wxGridCellAttr;
|
||||||
|
attr->SetEditor( new wxGridCellChoiceEditor( choices ) );
|
||||||
|
m_project_grid->SetColAttr( FP_TBL_MODEL::COL_TYPE, attr );
|
||||||
|
|
||||||
|
attr = new wxGridCellAttr;
|
||||||
|
attr->SetEditor( new wxGridCellChoiceEditor( choices ) );
|
||||||
|
m_global_grid->SetColAttr( FP_TBL_MODEL::COL_TYPE, attr );
|
||||||
|
|
||||||
|
m_global_grid->AutoSizeColumns();
|
||||||
|
m_project_grid->AutoSizeColumns();
|
||||||
|
|
||||||
|
m_path_subs_grid->AutoSizeColumns();
|
||||||
|
|
||||||
|
Connect( ID_CUT, ID_PASTE, wxEVT_COMMAND_MENU_SELECTED,
|
||||||
|
wxCommandEventHandler( DIALOG_FP_LIB_TABLE::onPopupSelection ), NULL, this );
|
||||||
|
|
||||||
|
populateEnvironReadOnlyTable();
|
||||||
|
|
||||||
|
/* This scrunches the dialog hideously
|
||||||
|
Fit();
|
||||||
|
*/
|
||||||
|
|
||||||
// fire pageChangedHandler() so m_cur_grid gets set
|
// fire pageChangedHandler() so m_cur_grid gets set
|
||||||
wxAuiNotebookEvent uneventful;
|
wxAuiNotebookEvent uneventful;
|
||||||
|
@ -374,18 +675,18 @@ public:
|
||||||
|
|
||||||
~DIALOG_FP_LIB_TABLE()
|
~DIALOG_FP_LIB_TABLE()
|
||||||
{
|
{
|
||||||
// Destroy the gui stuff first, with a goal of destroying the two wxGrids now,
|
Disconnect( ID_CUT, ID_PASTE, wxEVT_COMMAND_MENU_SELECTED,
|
||||||
// since the ~wxGrid() wants the wxGridTableBase to still be non-destroyed.
|
wxCommandEventHandler( DIALOG_FP_LIB_TABLE::onPopupSelection ), NULL, this );
|
||||||
// Without this call, the wxGridTableBase objects are destroyed first
|
|
||||||
// (i.e. destructor called) and there is a segfault since wxGridTableBase's vtable
|
// ~wxGrid() examines its table, and the tables will have been destroyed before
|
||||||
// is then no longer valid. If ~wxGrid() would not examine a wxGridTableBase that
|
// the wxGrids are, so remove the tables from the wxGrids' awareness.
|
||||||
// it does not own, then this would not be a concern. But it is, since it does.
|
// Otherwise there is a segfault.
|
||||||
DestroyChildren();
|
m_global_grid->SetTable( NULL );
|
||||||
|
m_project_grid->SetTable( NULL );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int InvokePcbLibTableEditor( wxFrame* aParent, FP_LIB_TABLE* aGlobal, FP_LIB_TABLE* aProject )
|
int InvokePcbLibTableEditor( wxFrame* aParent, FP_LIB_TABLE* aGlobal, FP_LIB_TABLE* aProject )
|
||||||
{
|
{
|
||||||
DIALOG_FP_LIB_TABLE dlg( aParent, aGlobal, aProject );
|
DIALOG_FP_LIB_TABLE dlg( aParent, aGlobal, aProject );
|
||||||
|
|
|
@ -34,7 +34,7 @@ DIALOG_FP_LIB_TABLE_BASE::DIALOG_FP_LIB_TABLE_BASE( wxWindow* parent, wxWindowID
|
||||||
m_global_grid = new wxGrid( m_global_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
|
m_global_grid = new wxGrid( m_global_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
|
||||||
// Grid
|
// Grid
|
||||||
m_global_grid->CreateGrid( 1, 4 );
|
m_global_grid->CreateGrid( 1, 5 );
|
||||||
m_global_grid->EnableEditing( true );
|
m_global_grid->EnableEditing( true );
|
||||||
m_global_grid->EnableGridLines( true );
|
m_global_grid->EnableGridLines( true );
|
||||||
m_global_grid->EnableDragGridSize( true );
|
m_global_grid->EnableDragGridSize( true );
|
||||||
|
@ -70,7 +70,7 @@ DIALOG_FP_LIB_TABLE_BASE::DIALOG_FP_LIB_TABLE_BASE( wxWindow* parent, wxWindowID
|
||||||
m_project_grid = new wxGrid( m_project_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
|
m_project_grid = new wxGrid( m_project_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
|
||||||
// Grid
|
// Grid
|
||||||
m_project_grid->CreateGrid( 1, 4 );
|
m_project_grid->CreateGrid( 1, 5 );
|
||||||
m_project_grid->EnableEditing( true );
|
m_project_grid->EnableEditing( true );
|
||||||
m_project_grid->EnableGridLines( true );
|
m_project_grid->EnableGridLines( true );
|
||||||
m_project_grid->EnableDragGridSize( true );
|
m_project_grid->EnableDragGridSize( true );
|
||||||
|
@ -142,7 +142,7 @@ DIALOG_FP_LIB_TABLE_BASE::DIALOG_FP_LIB_TABLE_BASE( wxWindow* parent, wxWindowID
|
||||||
m_path_subs_grid = new wxGrid( m_bottom, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
|
m_path_subs_grid = new wxGrid( m_bottom, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
|
||||||
// Grid
|
// Grid
|
||||||
m_path_subs_grid->CreateGrid( 2, 2 );
|
m_path_subs_grid->CreateGrid( 1, 2 );
|
||||||
m_path_subs_grid->EnableEditing( true );
|
m_path_subs_grid->EnableEditing( true );
|
||||||
m_path_subs_grid->EnableGridLines( true );
|
m_path_subs_grid->EnableGridLines( true );
|
||||||
m_path_subs_grid->EnableDragGridSize( false );
|
m_path_subs_grid->EnableDragGridSize( false );
|
||||||
|
@ -155,15 +155,13 @@ DIALOG_FP_LIB_TABLE_BASE::DIALOG_FP_LIB_TABLE_BASE( wxWindow* parent, wxWindowID
|
||||||
m_path_subs_grid->EnableDragColMove( false );
|
m_path_subs_grid->EnableDragColMove( false );
|
||||||
m_path_subs_grid->EnableDragColSize( true );
|
m_path_subs_grid->EnableDragColSize( true );
|
||||||
m_path_subs_grid->SetColLabelSize( 30 );
|
m_path_subs_grid->SetColLabelSize( 30 );
|
||||||
m_path_subs_grid->SetColLabelValue( 0, _("Category") );
|
m_path_subs_grid->SetColLabelValue( 0, _("Environment Variable") );
|
||||||
m_path_subs_grid->SetColLabelValue( 1, _("Path Segment") );
|
m_path_subs_grid->SetColLabelValue( 1, _("Path Segment") );
|
||||||
m_path_subs_grid->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
|
m_path_subs_grid->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
|
||||||
|
|
||||||
// Rows
|
// Rows
|
||||||
m_path_subs_grid->EnableDragRowSize( true );
|
m_path_subs_grid->EnableDragRowSize( true );
|
||||||
m_path_subs_grid->SetRowLabelSize( 40 );
|
m_path_subs_grid->SetRowLabelSize( 40 );
|
||||||
m_path_subs_grid->SetRowLabelValue( 0, _("%S") );
|
|
||||||
m_path_subs_grid->SetRowLabelValue( 1, _("%P") );
|
|
||||||
m_path_subs_grid->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
|
m_path_subs_grid->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
|
||||||
|
|
||||||
// Label Appearance
|
// Label Appearance
|
||||||
|
@ -188,7 +186,7 @@ DIALOG_FP_LIB_TABLE_BASE::DIALOG_FP_LIB_TABLE_BASE( wxWindow* parent, wxWindowID
|
||||||
m_bottom->SetSizer( m_bottom_sizer );
|
m_bottom->SetSizer( m_bottom_sizer );
|
||||||
m_bottom->Layout();
|
m_bottom->Layout();
|
||||||
m_bottom_sizer->Fit( m_bottom );
|
m_bottom_sizer->Fit( m_bottom );
|
||||||
m_splitter->SplitHorizontally( m_top, m_bottom, 343 );
|
m_splitter->SplitHorizontally( m_top, m_bottom, 398 );
|
||||||
bSizer1->Add( m_splitter, 2, wxEXPAND, 5 );
|
bSizer1->Add( m_splitter, 2, wxEXPAND, 5 );
|
||||||
|
|
||||||
|
|
||||||
|
@ -199,6 +197,14 @@ DIALOG_FP_LIB_TABLE_BASE::DIALOG_FP_LIB_TABLE_BASE( wxWindow* parent, wxWindowID
|
||||||
|
|
||||||
// Connect Events
|
// Connect Events
|
||||||
m_auinotebook->Connect( wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, wxAuiNotebookEventHandler( DIALOG_FP_LIB_TABLE_BASE::pageChangedHandler ), NULL, this );
|
m_auinotebook->Connect( wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, wxAuiNotebookEventHandler( DIALOG_FP_LIB_TABLE_BASE::pageChangedHandler ), NULL, this );
|
||||||
|
m_global_grid->Connect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( DIALOG_FP_LIB_TABLE_BASE::onGridCellLeftClick ), NULL, this );
|
||||||
|
m_global_grid->Connect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( DIALOG_FP_LIB_TABLE_BASE::onGridCellLeftDClick ), NULL, this );
|
||||||
|
m_global_grid->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( DIALOG_FP_LIB_TABLE_BASE::onGridCellRightClick ), NULL, this );
|
||||||
|
m_global_grid->Connect( wxEVT_GRID_SELECT_CELL, wxGridEventHandler( DIALOG_FP_LIB_TABLE_BASE::onGridCmdSelectCell ), NULL, this );
|
||||||
|
m_project_grid->Connect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( DIALOG_FP_LIB_TABLE_BASE::onGridCellLeftClick ), NULL, this );
|
||||||
|
m_project_grid->Connect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( DIALOG_FP_LIB_TABLE_BASE::onGridCellLeftDClick ), NULL, this );
|
||||||
|
m_project_grid->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( DIALOG_FP_LIB_TABLE_BASE::onGridCellRightClick ), NULL, this );
|
||||||
|
m_project_grid->Connect( wxEVT_GRID_SELECT_CELL, wxGridEventHandler( DIALOG_FP_LIB_TABLE_BASE::onGridCmdSelectCell ), NULL, this );
|
||||||
m_append_button->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( DIALOG_FP_LIB_TABLE_BASE::appendRowHandler ), NULL, this );
|
m_append_button->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( DIALOG_FP_LIB_TABLE_BASE::appendRowHandler ), NULL, this );
|
||||||
m_delete_button->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( DIALOG_FP_LIB_TABLE_BASE::deleteRowHandler ), NULL, this );
|
m_delete_button->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( DIALOG_FP_LIB_TABLE_BASE::deleteRowHandler ), NULL, this );
|
||||||
m_move_up_button->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( DIALOG_FP_LIB_TABLE_BASE::moveUpHandler ), NULL, this );
|
m_move_up_button->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( DIALOG_FP_LIB_TABLE_BASE::moveUpHandler ), NULL, this );
|
||||||
|
@ -211,6 +217,14 @@ DIALOG_FP_LIB_TABLE_BASE::~DIALOG_FP_LIB_TABLE_BASE()
|
||||||
{
|
{
|
||||||
// Disconnect Events
|
// Disconnect Events
|
||||||
m_auinotebook->Disconnect( wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, wxAuiNotebookEventHandler( DIALOG_FP_LIB_TABLE_BASE::pageChangedHandler ), NULL, this );
|
m_auinotebook->Disconnect( wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED, wxAuiNotebookEventHandler( DIALOG_FP_LIB_TABLE_BASE::pageChangedHandler ), NULL, this );
|
||||||
|
m_global_grid->Disconnect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( DIALOG_FP_LIB_TABLE_BASE::onGridCellLeftClick ), NULL, this );
|
||||||
|
m_global_grid->Disconnect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( DIALOG_FP_LIB_TABLE_BASE::onGridCellLeftDClick ), NULL, this );
|
||||||
|
m_global_grid->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( DIALOG_FP_LIB_TABLE_BASE::onGridCellRightClick ), NULL, this );
|
||||||
|
m_global_grid->Disconnect( wxEVT_GRID_SELECT_CELL, wxGridEventHandler( DIALOG_FP_LIB_TABLE_BASE::onGridCmdSelectCell ), NULL, this );
|
||||||
|
m_project_grid->Disconnect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( DIALOG_FP_LIB_TABLE_BASE::onGridCellLeftClick ), NULL, this );
|
||||||
|
m_project_grid->Disconnect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( DIALOG_FP_LIB_TABLE_BASE::onGridCellLeftDClick ), NULL, this );
|
||||||
|
m_project_grid->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( DIALOG_FP_LIB_TABLE_BASE::onGridCellRightClick ), NULL, this );
|
||||||
|
m_project_grid->Disconnect( wxEVT_GRID_SELECT_CELL, wxGridEventHandler( DIALOG_FP_LIB_TABLE_BASE::onGridCmdSelectCell ), NULL, this );
|
||||||
m_append_button->Disconnect( wxEVT_LEFT_DOWN, wxMouseEventHandler( DIALOG_FP_LIB_TABLE_BASE::appendRowHandler ), NULL, this );
|
m_append_button->Disconnect( wxEVT_LEFT_DOWN, wxMouseEventHandler( DIALOG_FP_LIB_TABLE_BASE::appendRowHandler ), NULL, this );
|
||||||
m_delete_button->Disconnect( wxEVT_LEFT_DOWN, wxMouseEventHandler( DIALOG_FP_LIB_TABLE_BASE::deleteRowHandler ), NULL, this );
|
m_delete_button->Disconnect( wxEVT_LEFT_DOWN, wxMouseEventHandler( DIALOG_FP_LIB_TABLE_BASE::deleteRowHandler ), NULL, this );
|
||||||
m_move_up_button->Disconnect( wxEVT_LEFT_DOWN, wxMouseEventHandler( DIALOG_FP_LIB_TABLE_BASE::moveUpHandler ), NULL, this );
|
m_move_up_button->Disconnect( wxEVT_LEFT_DOWN, wxMouseEventHandler( DIALOG_FP_LIB_TABLE_BASE::moveUpHandler ), NULL, this );
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
<property name="minimum_size"></property>
|
<property name="minimum_size"></property>
|
||||||
<property name="name">DIALOG_FP_LIB_TABLE_BASE</property>
|
<property name="name">DIALOG_FP_LIB_TABLE_BASE</property>
|
||||||
<property name="pos"></property>
|
<property name="pos"></property>
|
||||||
<property name="size">864,652</property>
|
<property name="size">996,652</property>
|
||||||
<property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
|
<property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
|
||||||
<property name="subclass">DIALOG_SHIM; dialog_shim.h</property>
|
<property name="subclass">DIALOG_SHIM; dialog_shim.h</property>
|
||||||
<property name="title">PCB Library Tables</property>
|
<property name="title">PCB Library Tables</property>
|
||||||
|
@ -140,7 +140,7 @@
|
||||||
<property name="pos"></property>
|
<property name="pos"></property>
|
||||||
<property name="resize">Resizable</property>
|
<property name="resize">Resizable</property>
|
||||||
<property name="sashgravity">0.0</property>
|
<property name="sashgravity">0.0</property>
|
||||||
<property name="sashpos">343</property>
|
<property name="sashpos">398</property>
|
||||||
<property name="sashsize">-1</property>
|
<property name="sashsize">-1</property>
|
||||||
<property name="show">1</property>
|
<property name="show">1</property>
|
||||||
<property name="size"></property>
|
<property name="size"></property>
|
||||||
|
@ -464,7 +464,7 @@
|
||||||
<property name="col_label_size">30</property>
|
<property name="col_label_size">30</property>
|
||||||
<property name="col_label_values"></property>
|
<property name="col_label_values"></property>
|
||||||
<property name="col_label_vert_alignment">wxALIGN_CENTRE</property>
|
<property name="col_label_vert_alignment">wxALIGN_CENTRE</property>
|
||||||
<property name="cols">4</property>
|
<property name="cols">5</property>
|
||||||
<property name="column_sizes"></property>
|
<property name="column_sizes"></property>
|
||||||
<property name="context_help"></property>
|
<property name="context_help"></property>
|
||||||
<property name="context_menu">1</property>
|
<property name="context_menu">1</property>
|
||||||
|
@ -524,9 +524,9 @@
|
||||||
<event name="OnEnterWindow"></event>
|
<event name="OnEnterWindow"></event>
|
||||||
<event name="OnEraseBackground"></event>
|
<event name="OnEraseBackground"></event>
|
||||||
<event name="OnGridCellChange"></event>
|
<event name="OnGridCellChange"></event>
|
||||||
<event name="OnGridCellLeftClick"></event>
|
<event name="OnGridCellLeftClick">onGridCellLeftClick</event>
|
||||||
<event name="OnGridCellLeftDClick"></event>
|
<event name="OnGridCellLeftDClick">onGridCellLeftDClick</event>
|
||||||
<event name="OnGridCellRightClick"></event>
|
<event name="OnGridCellRightClick">onGridCellRightClick</event>
|
||||||
<event name="OnGridCellRightDClick"></event>
|
<event name="OnGridCellRightDClick"></event>
|
||||||
<event name="OnGridCmdCellChange"></event>
|
<event name="OnGridCmdCellChange"></event>
|
||||||
<event name="OnGridCmdCellLeftClick"></event>
|
<event name="OnGridCmdCellLeftClick"></event>
|
||||||
|
@ -543,7 +543,7 @@
|
||||||
<event name="OnGridCmdLabelRightDClick"></event>
|
<event name="OnGridCmdLabelRightDClick"></event>
|
||||||
<event name="OnGridCmdRangeSelect"></event>
|
<event name="OnGridCmdRangeSelect"></event>
|
||||||
<event name="OnGridCmdRowSize"></event>
|
<event name="OnGridCmdRowSize"></event>
|
||||||
<event name="OnGridCmdSelectCell"></event>
|
<event name="OnGridCmdSelectCell">onGridCmdSelectCell</event>
|
||||||
<event name="OnGridColSize"></event>
|
<event name="OnGridColSize"></event>
|
||||||
<event name="OnGridEditorCreated"></event>
|
<event name="OnGridEditorCreated"></event>
|
||||||
<event name="OnGridEditorHidden"></event>
|
<event name="OnGridEditorHidden"></event>
|
||||||
|
@ -693,7 +693,7 @@
|
||||||
<property name="col_label_size">30</property>
|
<property name="col_label_size">30</property>
|
||||||
<property name="col_label_values"></property>
|
<property name="col_label_values"></property>
|
||||||
<property name="col_label_vert_alignment">wxALIGN_CENTRE</property>
|
<property name="col_label_vert_alignment">wxALIGN_CENTRE</property>
|
||||||
<property name="cols">4</property>
|
<property name="cols">5</property>
|
||||||
<property name="column_sizes"></property>
|
<property name="column_sizes"></property>
|
||||||
<property name="context_help"></property>
|
<property name="context_help"></property>
|
||||||
<property name="context_menu">1</property>
|
<property name="context_menu">1</property>
|
||||||
|
@ -753,9 +753,9 @@
|
||||||
<event name="OnEnterWindow"></event>
|
<event name="OnEnterWindow"></event>
|
||||||
<event name="OnEraseBackground"></event>
|
<event name="OnEraseBackground"></event>
|
||||||
<event name="OnGridCellChange"></event>
|
<event name="OnGridCellChange"></event>
|
||||||
<event name="OnGridCellLeftClick"></event>
|
<event name="OnGridCellLeftClick">onGridCellLeftClick</event>
|
||||||
<event name="OnGridCellLeftDClick"></event>
|
<event name="OnGridCellLeftDClick">onGridCellLeftDClick</event>
|
||||||
<event name="OnGridCellRightClick"></event>
|
<event name="OnGridCellRightClick">onGridCellRightClick</event>
|
||||||
<event name="OnGridCellRightDClick"></event>
|
<event name="OnGridCellRightDClick"></event>
|
||||||
<event name="OnGridCmdCellChange"></event>
|
<event name="OnGridCmdCellChange"></event>
|
||||||
<event name="OnGridCmdCellLeftClick"></event>
|
<event name="OnGridCmdCellLeftClick"></event>
|
||||||
|
@ -772,7 +772,7 @@
|
||||||
<event name="OnGridCmdLabelRightDClick"></event>
|
<event name="OnGridCmdLabelRightDClick"></event>
|
||||||
<event name="OnGridCmdRangeSelect"></event>
|
<event name="OnGridCmdRangeSelect"></event>
|
||||||
<event name="OnGridCmdRowSize"></event>
|
<event name="OnGridCmdRowSize"></event>
|
||||||
<event name="OnGridCmdSelectCell"></event>
|
<event name="OnGridCmdSelectCell">onGridCmdSelectCell</event>
|
||||||
<event name="OnGridColSize"></event>
|
<event name="OnGridColSize"></event>
|
||||||
<event name="OnGridEditorCreated"></event>
|
<event name="OnGridEditorCreated"></event>
|
||||||
<event name="OnGridEditorHidden"></event>
|
<event name="OnGridEditorHidden"></event>
|
||||||
|
@ -1297,7 +1297,7 @@
|
||||||
<property name="close_button">1</property>
|
<property name="close_button">1</property>
|
||||||
<property name="col_label_horiz_alignment">wxALIGN_CENTRE</property>
|
<property name="col_label_horiz_alignment">wxALIGN_CENTRE</property>
|
||||||
<property name="col_label_size">30</property>
|
<property name="col_label_size">30</property>
|
||||||
<property name="col_label_values">"Category" "Path Segment"</property>
|
<property name="col_label_values">"Environment Variable" "Path Segment"</property>
|
||||||
<property name="col_label_vert_alignment">wxALIGN_CENTRE</property>
|
<property name="col_label_vert_alignment">wxALIGN_CENTRE</property>
|
||||||
<property name="cols">2</property>
|
<property name="cols">2</property>
|
||||||
<property name="column_sizes">150,500</property>
|
<property name="column_sizes">150,500</property>
|
||||||
|
@ -1343,10 +1343,10 @@
|
||||||
<property name="resize">Resizable</property>
|
<property name="resize">Resizable</property>
|
||||||
<property name="row_label_horiz_alignment">wxALIGN_CENTRE</property>
|
<property name="row_label_horiz_alignment">wxALIGN_CENTRE</property>
|
||||||
<property name="row_label_size">40</property>
|
<property name="row_label_size">40</property>
|
||||||
<property name="row_label_values">"%S" "%P"</property>
|
<property name="row_label_values"></property>
|
||||||
<property name="row_label_vert_alignment">wxALIGN_CENTRE</property>
|
<property name="row_label_vert_alignment">wxALIGN_CENTRE</property>
|
||||||
<property name="row_sizes"></property>
|
<property name="row_sizes"></property>
|
||||||
<property name="rows">2</property>
|
<property name="rows">1</property>
|
||||||
<property name="show">1</property>
|
<property name="show">1</property>
|
||||||
<property name="size"></property>
|
<property name="size"></property>
|
||||||
<property name="subclass"></property>
|
<property name="subclass"></property>
|
||||||
|
|
|
@ -61,6 +61,10 @@ class DIALOG_FP_LIB_TABLE_BASE : public DIALOG_SHIM
|
||||||
|
|
||||||
// Virtual event handlers, overide them in your derived class
|
// Virtual event handlers, overide them in your derived class
|
||||||
virtual void pageChangedHandler( wxAuiNotebookEvent& event ) { event.Skip(); }
|
virtual void pageChangedHandler( wxAuiNotebookEvent& event ) { event.Skip(); }
|
||||||
|
virtual void onGridCellLeftClick( wxGridEvent& event ) { event.Skip(); }
|
||||||
|
virtual void onGridCellLeftDClick( wxGridEvent& event ) { event.Skip(); }
|
||||||
|
virtual void onGridCellRightClick( wxGridEvent& event ) { event.Skip(); }
|
||||||
|
virtual void onGridCmdSelectCell( wxGridEvent& event ) { event.Skip(); }
|
||||||
virtual void appendRowHandler( wxMouseEvent& event ) { event.Skip(); }
|
virtual void appendRowHandler( wxMouseEvent& event ) { event.Skip(); }
|
||||||
virtual void deleteRowHandler( wxMouseEvent& event ) { event.Skip(); }
|
virtual void deleteRowHandler( wxMouseEvent& event ) { event.Skip(); }
|
||||||
virtual void moveUpHandler( wxMouseEvent& event ) { event.Skip(); }
|
virtual void moveUpHandler( wxMouseEvent& event ) { event.Skip(); }
|
||||||
|
@ -71,12 +75,12 @@ class DIALOG_FP_LIB_TABLE_BASE : public DIALOG_SHIM
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
DIALOG_FP_LIB_TABLE_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("PCB Library Tables"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 864,652 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
|
DIALOG_FP_LIB_TABLE_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("PCB Library Tables"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 996,652 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
|
||||||
~DIALOG_FP_LIB_TABLE_BASE();
|
~DIALOG_FP_LIB_TABLE_BASE();
|
||||||
|
|
||||||
void m_splitterOnIdle( wxIdleEvent& )
|
void m_splitterOnIdle( wxIdleEvent& )
|
||||||
{
|
{
|
||||||
m_splitter->SetSashPosition( 343 );
|
m_splitter->SetSashPosition( 398 );
|
||||||
m_splitter->Disconnect( wxEVT_IDLE, wxIdleEventHandler( DIALOG_FP_LIB_TABLE_BASE::m_splitterOnIdle ), NULL, this );
|
m_splitter->Disconnect( wxEVT_IDLE, wxIdleEventHandler( DIALOG_FP_LIB_TABLE_BASE::m_splitterOnIdle ), NULL, this );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,7 @@ public:
|
||||||
EAGLE,
|
EAGLE,
|
||||||
PCAD,
|
PCAD,
|
||||||
GEDA_PCB, //< Geda PCB file formats.
|
GEDA_PCB, //< Geda PCB file formats.
|
||||||
|
|
||||||
// add your type here.
|
// add your type here.
|
||||||
|
|
||||||
// ALTIUM,
|
// ALTIUM,
|
||||||
|
|
|
@ -188,13 +188,13 @@ public:
|
||||||
bool operator==( const PCB_PLOT_PARAMS &aPcbPlotParams ) const;
|
bool operator==( const PCB_PLOT_PARAMS &aPcbPlotParams ) const;
|
||||||
bool operator!=( const PCB_PLOT_PARAMS &aPcbPlotParams ) const;
|
bool operator!=( const PCB_PLOT_PARAMS &aPcbPlotParams ) const;
|
||||||
|
|
||||||
void SetColor( EDA_COLOR_T aVal ) { m_color = aVal; }
|
void SetColor( EDA_COLOR_T aVal ) { m_color = aVal; }
|
||||||
EDA_COLOR_T GetColor() const { return m_color; }
|
EDA_COLOR_T GetColor() const { return m_color; }
|
||||||
|
|
||||||
void SetReferenceColor( EDA_COLOR_T aVal ) { m_referenceColor = aVal; }
|
void SetReferenceColor( EDA_COLOR_T aVal ) { m_referenceColor = aVal; }
|
||||||
EDA_COLOR_T GetReferenceColor() const { return m_referenceColor; }
|
EDA_COLOR_T GetReferenceColor() const { return m_referenceColor; }
|
||||||
|
|
||||||
void SetValueColor( EDA_COLOR_T aVal ) { m_valueColor = aVal; }
|
void SetValueColor( EDA_COLOR_T aVal ) { m_valueColor = aVal; }
|
||||||
EDA_COLOR_T GetValueColor() const { return m_valueColor; }
|
EDA_COLOR_T GetValueColor() const { return m_valueColor; }
|
||||||
|
|
||||||
void SetTextMode( PlotTextMode aVal ) { m_textMode = aVal; }
|
void SetTextMode( PlotTextMode aVal ) { m_textMode = aVal; }
|
||||||
|
@ -292,5 +292,4 @@ public:
|
||||||
*/
|
*/
|
||||||
extern int g_DrawDefaultLineThickness;
|
extern int g_DrawDefaultLineThickness;
|
||||||
|
|
||||||
|
|
||||||
#endif // PCB_PLOT_PARAMS_H_
|
#endif // PCB_PLOT_PARAMS_H_
|
||||||
|
|
|
@ -45,6 +45,8 @@
|
||||||
#include <class_board.h>
|
#include <class_board.h>
|
||||||
#include <fp_lib_table.h>
|
#include <fp_lib_table.h>
|
||||||
|
|
||||||
|
#include <fp_lib_table_lexer.h>
|
||||||
|
|
||||||
#include <pcbplot.h>
|
#include <pcbplot.h>
|
||||||
#include <pcbnew.h>
|
#include <pcbnew.h>
|
||||||
#include <pcbnew_id.h>
|
#include <pcbnew_id.h>
|
||||||
|
@ -88,27 +90,66 @@ void PCB_EDIT_FRAME::Process_Config( wxCommandEvent& event )
|
||||||
FP_LIB_TABLE gbl;
|
FP_LIB_TABLE gbl;
|
||||||
FP_LIB_TABLE prj;
|
FP_LIB_TABLE prj;
|
||||||
|
|
||||||
gbl.InsertRow( FP_LIB_TABLE::ROW(
|
FP_LIB_TABLE_LEXER glex(
|
||||||
wxT( "passives" ), wxT( "%G/passives" ), wxT( "KiCad" ), wxT( "speed=fast,purpose=testing" ) ) );
|
"(fp_lib_table\n"
|
||||||
|
" (lib (name passives)(descr \"R/C Lib\")(type KiCad)(uri ${KISYSMODS}/passives.pretty))\n"
|
||||||
|
" (lib (name micros)(descr \"Small stuff\")(type Legacy)(uri ${KISYSMODS}/passives.mod)(options \"op1=2\"))\n"
|
||||||
|
" (lib (name chips)(descr \"Potatoe chips\")(type Eagle)(uri /opt/eagle-6.2.0/lbr/con-amp-micromatch.lbr))\n"
|
||||||
|
")", wxT( "gbl" ) );
|
||||||
|
|
||||||
gbl.InsertRow( FP_LIB_TABLE::ROW(
|
FP_LIB_TABLE_LEXER plex(
|
||||||
wxT( "micros" ), wxT( "%P/micros" ), wxT( "Legacy" ), wxT( "speed=fast,purpose=testing" ) ) );
|
"(fp_lib_table\n"
|
||||||
|
" (lib (name passives)(descr \"Demo Lib\")(type KiCad)(uri ${KIUSRMODS}/passives.pretty))\n"
|
||||||
|
" (lib (name micros)(descr \"Small stuff\")(type Legacy)(uri ${KIUSRMODS}/micros.mod)(options \"op1=2\"))\n"
|
||||||
|
" (lib (name chips)(descr \"Potatoe chips\")(type Eagle)(uri /opt/eagle-6.2.0/lbr/con-amp-micromatch.lbr))\n"
|
||||||
|
")", wxT( "prj" ) );
|
||||||
|
|
||||||
prj.InsertRow( FP_LIB_TABLE::ROW(
|
try
|
||||||
wxT( "micros" ), wxT( "%P/potato_chips" ), wxT( "Eagle" ), wxT( "speed=fast,purpose=testing" ) ) );
|
{
|
||||||
|
gbl.Parse( &glex );
|
||||||
|
prj.Parse( &plex );
|
||||||
|
}
|
||||||
|
/* PARSE_ERROR is an IO_ERROR, handle them the same for now.
|
||||||
|
catch( PARSE_ERROR pe )
|
||||||
|
{
|
||||||
|
DisplayError( this, pe.errorText );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
catch( IO_ERROR ioe )
|
||||||
|
{
|
||||||
|
DisplayError( this, ioe.errorText );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
int r = InvokePcbLibTableEditor( this, &gbl, &prj );
|
int r = InvokePcbLibTableEditor( this, &gbl, &prj );
|
||||||
|
|
||||||
if( r & 1 )
|
if( r & 1 )
|
||||||
{
|
{
|
||||||
|
#if defined(DEBUG)
|
||||||
|
printf( "changed global:\n" );
|
||||||
|
|
||||||
|
STRING_FORMATTER sf;
|
||||||
|
|
||||||
|
gbl.Format( &sf, 0 );
|
||||||
|
|
||||||
|
printf( "%s\n", sf.GetString().c_str() );
|
||||||
|
#endif
|
||||||
// save global table to disk and apply it
|
// save global table to disk and apply it
|
||||||
D( printf( "global has changed\n" );)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( r & 2 )
|
if( r & 2 )
|
||||||
{
|
{
|
||||||
|
#if defined(DEBUG)
|
||||||
|
printf( "changed project:\n" );
|
||||||
|
|
||||||
|
STRING_FORMATTER sf;
|
||||||
|
|
||||||
|
prj.Format( &sf, 0 );
|
||||||
|
|
||||||
|
printf( "%s\n", sf.GetString().c_str() );
|
||||||
|
#endif
|
||||||
// save project table to disk and apply it
|
// save project table to disk and apply it
|
||||||
D( printf( "project has changed\n" );)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue