Commit ec7f26f5 authored by Dick Hollenbeck's avatar Dick Hollenbeck

FP_LIB_TABLE::ROW::SetFullURI() does environment variable substitution up front.

We can now remove a few calls to FP_LIB_TABLE::ExpandSubstitutions( const wxString& aString )
since its being done in above function.

DIALOG_FP_LIB_TABLE now handles table to copy cut copy paste from global to
project and reverse.  Fixed a problem with cursor position management when
switching between tables.
parent 248788f3
...@@ -51,6 +51,13 @@ void FP_LIB_TABLE::ROW::SetType( const wxString& aType ) ...@@ -51,6 +51,13 @@ void FP_LIB_TABLE::ROW::SetType( const wxString& aType )
} }
void FP_LIB_TABLE::ROW::SetFullURI( const wxString& aFullURI )
{
uri_user = aFullURI;
uri_expanded = FP_LIB_TABLE::ExpandSubstitutions( aFullURI );
}
FP_LIB_TABLE::FP_LIB_TABLE( FP_LIB_TABLE* aFallBackTable ) : FP_LIB_TABLE::FP_LIB_TABLE( FP_LIB_TABLE* aFallBackTable ) :
fallBack( aFallBackTable ) fallBack( aFallBackTable )
{ {
...@@ -407,7 +414,7 @@ const FP_LIB_TABLE::ROW* FP_LIB_TABLE::FindRowByURI( const wxString& aURI ) ...@@ -407,7 +414,7 @@ const FP_LIB_TABLE::ROW* FP_LIB_TABLE::FindRowByURI( const wxString& aURI )
for( unsigned i = 0; i < cur->rows.size(); i++ ) for( unsigned i = 0; i < cur->rows.size(); i++ )
{ {
wxString uri = ExpandSubstitutions( cur->rows[i].GetFullURI() ); wxString uri = cur->rows[i].GetFullURI( true );
if( wxFileName::GetPathSeparator() == wxChar( '\\' ) && uri.Find( wxChar( '/' ) ) >= 0 ) if( wxFileName::GetPathSeparator() == wxChar( '\\' ) && uri.Find( wxChar( '/' ) ) >= 0 )
uri.Replace( wxT( "/" ), wxT( "\\" ) ); uri.Replace( wxT( "/" ), wxT( "\\" ) );
...@@ -461,16 +468,17 @@ const FP_LIB_TABLE::ROW* FP_LIB_TABLE::FindRow( const wxString& aLibraryNickName ...@@ -461,16 +468,17 @@ const FP_LIB_TABLE::ROW* FP_LIB_TABLE::FindRow( const wxString& aLibraryNickName
THROW_IO_ERROR( msg ); THROW_IO_ERROR( msg );
} }
/* enable this when FP_LIB_TABLE::Footprint*() functions are put into use. #if 0 // enable this as soon as FP_LIB_TABLE::FindRow() is not being used outside
// this class, and FP_LIB_TABLE::Footprint*() functions are put into use.
if( !row->plugin ) if( !row->plugin )
row->setPlugin( IO_MGR::PluginFind( row->type ) ); row->setPlugin( IO_MGR::PluginFind( row->type ) );
*/ #endif
return row; return row;
} }
const wxString FP_LIB_TABLE::ExpandSubstitutions( const wxString aString ) const wxString FP_LIB_TABLE::ExpandSubstitutions( const wxString& aString )
{ {
// We reserve the right to do this another way, by providing our own member // We reserve the right to do this another way, by providing our own member
// function. // function.
...@@ -604,7 +612,7 @@ bool FP_LIB_TABLE::ConvertFromLegacy( NETLIST& aNetList, const wxArrayString& aL ...@@ -604,7 +612,7 @@ bool FP_LIB_TABLE::ConvertFromLegacy( NETLIST& aNetList, const wxArrayString& aL
for( unsigned i = 0; i < cur->rows.size(); i++ ) for( unsigned i = 0; i < cur->rows.size(); i++ )
{ {
wxString uri = ExpandSubstitutions( cur->rows[i].GetFullURI() ); wxString uri = cur->rows[i].GetFullURI( true );
if( wxFileName::GetPathSeparator() == wxChar( '\\' ) if( wxFileName::GetPathSeparator() == wxChar( '\\' )
&& uri.Find( wxChar( '/' ) ) >= 0 ) && uri.Find( wxChar( '/' ) ) >= 0 )
...@@ -616,6 +624,7 @@ bool FP_LIB_TABLE::ConvertFromLegacy( NETLIST& aNetList, const wxArrayString& aL ...@@ -616,6 +624,7 @@ bool FP_LIB_TABLE::ConvertFromLegacy( NETLIST& aNetList, const wxArrayString& aL
break; break;
} }
} }
} while( ( cur = cur->fallBack ) != 0 && libNickname.IsEmpty() ); } while( ( cur = cur->fallBack ) != 0 && libNickname.IsEmpty() );
if( libNickname.IsEmpty() ) if( libNickname.IsEmpty() )
......
...@@ -112,17 +112,18 @@ public: ...@@ -112,17 +112,18 @@ public:
ROW( const wxString& aNick, const wxString& aURI, const wxString& aType, ROW( const wxString& aNick, const wxString& aURI, const wxString& aType,
const wxString& aOptions, const wxString& aDescr = wxEmptyString ) : const wxString& aOptions, const wxString& aDescr = wxEmptyString ) :
nickName( aNick ), nickName( aNick ),
uri( aURI ),
options( aOptions ),
description( aDescr ), description( aDescr ),
properties( 0 ) properties( 0 )
{ {
SetOptions( aOptions ),
SetFullURI( aURI );
SetType( aType ); SetType( aType );
} }
ROW( const ROW& a ) : ROW( const ROW& a ) :
nickName( a.nickName ), nickName( a.nickName ),
uri( a.uri ), uri_user( a.uri_user ),
uri_expanded( a.uri_expanded ),
type( a.type ), type( a.type ),
options( a.options ), options( a.options ),
description( a.description ), description( a.description ),
...@@ -139,22 +140,23 @@ public: ...@@ -139,22 +140,23 @@ public:
ROW& operator=( const ROW& r ) ROW& operator=( const ROW& r )
{ {
nickName = r.nickName; nickName = r.nickName;
uri = r.uri; uri_user = r.uri_user;
type = r.type; uri_expanded = r.uri_expanded;
options = r.options; type = r.type;
options = r.options;
description = r.description;
properties = r.properties ? new PROPERTIES( *r.properties ) : NULL;
description = r.description; // do not copy the PLUGIN, it is lazily created.
properties = r.properties ? new PROPERTIES( *r.properties ) : NULL; // setPlugin( NULL );
setPlugin( NULL ); // do not copy the PLUGIN, it is lazily created.
return *this; return *this;
} }
bool operator==( const ROW& r ) const bool operator==( const ROW& r ) const
{ {
return nickName==r.nickName && uri==r.uri && type==r.type && options==r.options; return nickName==r.nickName && uri_user==r.uri_user && type==r.type && options==r.options;
} }
bool operator!=( const ROW& r ) const { return !( *this == r ); } bool operator!=( const ROW& r ) const { return !( *this == r ); }
...@@ -187,23 +189,24 @@ public: ...@@ -187,23 +189,24 @@ public:
/** /**
* Function GetFullURI * Function GetFullURI
* returns the full location specifying URI for the LIB. * returns the full location specifying URI for the LIB, either in original
* UI form or in environment variable expanded form.
* *
* @param doEnvVarSubs tells this function to do the substitution, else not. * @param aSubstituted Tells if caller wanted the substituted form, else not.
*/ */
const wxString GetFullURI( bool doEnvVarSubs = false ) const const wxString& GetFullURI( bool aSubstituted = false ) const
{ {
if( doEnvVarSubs ) if( aSubstituted )
return FP_LIB_TABLE::ExpandSubstitutions( uri ); return uri_expanded;
else else
return uri; return uri_user;
} }
/** /**
* Function SetFullURI * Function SetFullURI
* changes the full URI for the library. * changes the full URI for the library.
*/ */
void SetFullURI( const wxString& aFullURI ) { uri = aFullURI; } void SetFullURI( const wxString& aFullURI );
/** /**
* Function GetOptions * Function GetOptions
...@@ -274,7 +277,8 @@ public: ...@@ -274,7 +277,8 @@ public:
} }
wxString nickName; wxString nickName;
wxString uri; wxString uri_user; ///< what user entered from UI or loaded from disk
wxString uri_expanded; ///< from ExpandSubstitutions()
LIB_T type; LIB_T type;
wxString options; wxString options;
wxString description; wxString description;
...@@ -524,7 +528,7 @@ public: ...@@ -524,7 +528,7 @@ public:
* This enables (fp_lib_table)s to have platform dependent environment * This enables (fp_lib_table)s to have platform dependent environment
* variables in them, allowing for a uniform table across platforms. * variables in them, allowing for a uniform table across platforms.
*/ */
static const wxString ExpandSubstitutions( const wxString aString ); static const wxString ExpandSubstitutions( const wxString& aString );
/** /**
* Function LoadGlobalTable * Function LoadGlobalTable
......
...@@ -251,6 +251,16 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE ...@@ -251,6 +251,16 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE
int selRowCount; int selRowCount;
int selColCount; int selColCount;
int getCursorRow() const
{
return m_cur_grid->GetGridCursorRow();
}
int getCursorCol() const
{
return m_cur_grid->GetGridCursorCol();
}
/// Gets the selected area into a sensible rectangle 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()
{ {
...@@ -328,128 +338,13 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE ...@@ -328,128 +338,13 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE
menu.Enable( MYID_PASTE, false ); menu.Enable( MYID_PASTE, false );
} }
// if there is no current cell cursor, disable paste.
else if( m_cur_row == -1 || m_cur_col == -1 )
menu.Enable( MYID_PASTE, false );
PopupMenu( &menu ); PopupMenu( &menu );
// passOnFocus(); // passOnFocus();
} }
void cutcopy( bool doCut ) void cutcopy( bool doCut );
{ void paste();
// 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( doCut )
tbl->SetValue( row, col, wxEmptyString );
}
txt += ROW_SEP;
}
wxTheClipboard->SetData( new wxTextDataObject( txt ) );
wxTheClipboard->Close();
m_cur_grid->AutoSizeColumns();
m_cur_grid->ForceRefresh();
}
}
void paste()
{
// assume format came from a spreadsheet or us.
if( wxTheClipboard->Open() )
{
if( wxTheClipboard->IsSupported( wxDF_TEXT ) )
{
wxTextDataObject data;
FP_TBL_MODEL* tbl = (FP_TBL_MODEL*) m_cur_grid->GetTable();
wxTheClipboard->GetData( data );
wxString cb_text = data.GetText();
size_t ndx = cb_text.find( wxT( "(fp_lib_table" ) );
if( ndx != std::string::npos )
{
// paste the ROWs of s-expression (fp_lib_table), starting
// at column 0 regardless of current cursor column.
STRING_LINE_READER slr( TO_UTF8( cb_text ), wxT( "Clipboard" ) );
FP_LIB_TABLE_LEXER lexer( &slr );
FP_LIB_TABLE tmp_tbl;
bool parsed = true;
try
{
tmp_tbl.Parse( &lexer );
}
catch( PARSE_ERROR& pe )
{
// @todo tell what line and offset
parsed = false;
}
if( parsed )
{
// if clipboard rows would extend past end of current table size...
if( int( tmp_tbl.rows.size() ) > tbl->GetNumberRows() - m_cur_row )
{
int newRowsNeeded = tmp_tbl.rows.size() - ( tbl->GetNumberRows() - m_cur_row );
tbl->AppendRows( newRowsNeeded );
}
for( int i = 0; i < (int) tmp_tbl.rows.size(); ++i )
{
tbl->rows[m_cur_row+i] = tmp_tbl.rows[i];
}
}
m_cur_grid->AutoSizeColumns();
}
else
{
wxStringTokenizer rows( cb_text, ROW_SEP, wxTOKEN_RET_EMPTY );
// if clipboard rows would extend past 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 );
}
}
m_cur_grid->AutoSizeColumns();
}
}
wxTheClipboard->Close();
m_cur_grid->ForceRefresh();
}
}
// the user clicked on a popup menu choice: // the user clicked on a popup menu choice:
void onPopupSelection( wxCommandEvent& event ) void onPopupSelection( wxCommandEvent& event )
...@@ -473,6 +368,9 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE ...@@ -473,6 +368,9 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE
case MYID_SELECT: case MYID_SELECT:
m_cur_grid->SelectAll(); m_cur_grid->SelectAll();
break; break;
default:
;
} }
} }
...@@ -617,16 +515,16 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE ...@@ -617,16 +515,16 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE
void deleteRowHandler( wxMouseEvent& event ) void deleteRowHandler( wxMouseEvent& event )
{ {
int curRow = m_cur_grid->GetGridCursorRow(); int curRow = getCursorRow();
m_cur_grid->DeleteRows( curRow ); m_cur_grid->DeleteRows( curRow );
} }
void moveUpHandler( wxMouseEvent& event ) void moveUpHandler( wxMouseEvent& event )
{ {
int curRow = m_cur_grid->GetGridCursorRow(); int curRow = getCursorRow();
if( curRow >= 1 ) if( curRow >= 1 )
{ {
int curCol = m_cur_grid->GetGridCursorCol(); int curCol = getCursorCol();
FP_TBL_MODEL* tbl = (FP_TBL_MODEL*) m_cur_grid->GetTable(); FP_TBL_MODEL* tbl = (FP_TBL_MODEL*) m_cur_grid->GetTable();
...@@ -655,10 +553,10 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE ...@@ -655,10 +553,10 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE
{ {
FP_TBL_MODEL* tbl = (FP_TBL_MODEL*) m_cur_grid->GetTable(); FP_TBL_MODEL* tbl = (FP_TBL_MODEL*) m_cur_grid->GetTable();
int curRow = m_cur_grid->GetGridCursorRow(); int curRow = getCursorRow();
if( unsigned( curRow + 1 ) < tbl->rows.size() ) if( unsigned( curRow + 1 ) < tbl->rows.size() )
{ {
int curCol = m_cur_grid->GetGridCursorCol(); int curCol = getCursorCol();
ROW move_me = tbl->rows[curRow]; ROW move_me = tbl->rows[curRow];
...@@ -734,17 +632,6 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE ...@@ -734,17 +632,6 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE
rightClickCellPopupMenu(); 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 /// Populate the readonly environment variable table with names and values
/// by examining all the full_uri columns. /// by examining all the full_uri columns.
void populateEnvironReadOnlyTable() void populateEnvironReadOnlyTable()
...@@ -822,20 +709,13 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE ...@@ -822,20 +709,13 @@ 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 ) :
DIALOG_FP_LIB_TABLE_BASE( aParent ), DIALOG_FP_LIB_TABLE_BASE( aParent ),
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( 0 ),
m_cur_col( 0 )
{ {
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 );
...@@ -899,6 +779,127 @@ public: ...@@ -899,6 +779,127 @@ public:
}; };
void DIALOG_FP_LIB_TABLE::cutcopy( bool doCut )
{
// 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( doCut )
tbl->SetValue( row, col, wxEmptyString );
}
txt += ROW_SEP;
}
wxTheClipboard->SetData( new wxTextDataObject( txt ) );
wxTheClipboard->Close();
m_cur_grid->AutoSizeColumns();
m_cur_grid->ForceRefresh();
}
}
void DIALOG_FP_LIB_TABLE::paste()
{
// assume format came from a spreadsheet or us.
if( wxTheClipboard->Open() )
{
if( wxTheClipboard->IsSupported( wxDF_TEXT ) )
{
wxTextDataObject data;
FP_TBL_MODEL* tbl = (FP_TBL_MODEL*) m_cur_grid->GetTable();
wxTheClipboard->GetData( data );
wxString cb_text = data.GetText();
size_t ndx = cb_text.find( wxT( "(fp_lib_table" ) );
if( ndx != std::string::npos )
{
// paste the ROWs of s-expression (fp_lib_table), starting
// at column 0 regardless of current cursor column.
STRING_LINE_READER slr( TO_UTF8( cb_text ), wxT( "Clipboard" ) );
FP_LIB_TABLE_LEXER lexer( &slr );
FP_LIB_TABLE tmp_tbl;
bool parsed = true;
try
{
tmp_tbl.Parse( &lexer );
}
catch( PARSE_ERROR& pe )
{
// @todo tell what line and offset
parsed = false;
}
if( parsed )
{
const int cur_row = getCursorRow();
// if clipboard rows would extend past end of current table size...
if( int( tmp_tbl.rows.size() ) > tbl->GetNumberRows() - cur_row )
{
int newRowsNeeded = tmp_tbl.rows.size() - ( tbl->GetNumberRows() - cur_row );
tbl->AppendRows( newRowsNeeded );
}
for( int i = 0; i < (int) tmp_tbl.rows.size(); ++i )
{
tbl->rows[cur_row+i] = tmp_tbl.rows[i];
}
}
m_cur_grid->AutoSizeColumns();
}
else
{
const int cur_row = getCursorRow();
const int cur_col = getCursorCol();
wxStringTokenizer rows( cb_text, ROW_SEP, wxTOKEN_RET_EMPTY );
// if clipboard rows would extend past end of current table size...
if( int( rows.CountTokens() ) > tbl->GetNumberRows() - cur_row )
{
int newRowsNeeded = rows.CountTokens() - ( tbl->GetNumberRows() - cur_row );
tbl->AppendRows( newRowsNeeded );
}
for( int row = cur_row; rows.HasMoreTokens(); ++row )
{
wxString rowTxt = rows.GetNextToken();
wxStringTokenizer cols( rowTxt, COL_SEP, wxTOKEN_RET_EMPTY );
for( int col = cur_col; cols.HasMoreTokens(); ++col )
{
wxString cellTxt = cols.GetNextToken();
tbl->SetValue( row, col, cellTxt );
}
}
m_cur_grid->AutoSizeColumns();
}
}
wxTheClipboard->Close();
m_cur_grid->ForceRefresh();
}
}
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 );
......
...@@ -221,7 +221,7 @@ BOARD* IO_MGR::Load( PCB_FILE_T aFileType, const wxString& aFileName, ...@@ -221,7 +221,7 @@ BOARD* IO_MGR::Load( PCB_FILE_T aFileType, const wxString& aFileName,
BOARD* aAppendToMe, const PROPERTIES* aProperties ) BOARD* aAppendToMe, const PROPERTIES* aProperties )
{ {
// release the PLUGIN even if an exception is thrown. // release the PLUGIN even if an exception is thrown.
PLUGIN::RELEASER pi = PluginFind( aFileType ); PLUGIN::RELEASER pi( PluginFind( aFileType ) );
if( (PLUGIN*) pi ) // test pi->plugin if( (PLUGIN*) pi ) // test pi->plugin
{ {
...@@ -235,7 +235,7 @@ BOARD* IO_MGR::Load( PCB_FILE_T aFileType, const wxString& aFileName, ...@@ -235,7 +235,7 @@ BOARD* IO_MGR::Load( PCB_FILE_T aFileType, const wxString& aFileName,
void IO_MGR::Save( PCB_FILE_T aFileType, const wxString& aFileName, BOARD* aBoard, const PROPERTIES* aProperties ) void IO_MGR::Save( PCB_FILE_T aFileType, const wxString& aFileName, BOARD* aBoard, const PROPERTIES* aProperties )
{ {
// release the PLUGIN even if an exception is thrown. // release the PLUGIN even if an exception is thrown.
PLUGIN::RELEASER pi = PluginFind( aFileType ); PLUGIN::RELEASER pi( PluginFind( aFileType ) );
if( (PLUGIN*) pi ) // test pi->plugin if( (PLUGIN*) pi ) // test pi->plugin
{ {
......
...@@ -405,7 +405,11 @@ public: ...@@ -405,7 +405,11 @@ public:
API functions which take one. API functions which take one.
*/ */
virtual ~PLUGIN() {}; virtual ~PLUGIN()
{
//printf( "~%s", __func__ );
};
/** /**
* Class RELEASER * Class RELEASER
...@@ -419,6 +423,9 @@ public: ...@@ -419,6 +423,9 @@ public:
// private assignment operator so it's illegal // private assignment operator so it's illegal
RELEASER& operator=( RELEASER& aOther ) { return *this; } RELEASER& operator=( RELEASER& aOther ) { return *this; }
// private copy constructor so it's illegal
RELEASER( const RELEASER& aOther ) {}
public: public:
RELEASER( PLUGIN* aPlugin = NULL ) : RELEASER( PLUGIN* aPlugin = NULL ) :
plugin( aPlugin ) plugin( aPlugin )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment