|
|
@ -56,7 +56,7 @@ enum COL_ORDER |
|
|
|
|
|
|
|
/**
|
|
|
|
* Class FP_TBL_MODEL |
|
|
|
* mixes in wxGridTableBase into FP_LIB_TABLE so that the latter can be used |
|
|
|
* mixes in FP_LIB_TABLE into wxGridTableBase so the result can be used |
|
|
|
* as a table within wxGrid. |
|
|
|
*/ |
|
|
|
class FP_TBL_MODEL : public wxGridTableBase, public FP_LIB_TABLE |
|
|
@ -282,6 +282,79 @@ protected: |
|
|
|
*/ |
|
|
|
class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE |
|
|
|
{ |
|
|
|
|
|
|
|
public: |
|
|
|
DIALOG_FP_LIB_TABLE( wxTopLevelWindow* aParent, FP_LIB_TABLE* aGlobal, FP_LIB_TABLE* aProject ) : |
|
|
|
DIALOG_FP_LIB_TABLE_BASE( aParent ), |
|
|
|
m_global( aGlobal ), |
|
|
|
m_project( aProject ) |
|
|
|
{ |
|
|
|
// wxGrid only supports user owned tables if they exist past end of ~wxGrid(),
|
|
|
|
// so make it a grid owned table.
|
|
|
|
m_global_grid->SetTable( new FP_TBL_MODEL( *aGlobal ), true ); |
|
|
|
m_project_grid->SetTable( new FP_TBL_MODEL( *aProject ), true ); |
|
|
|
|
|
|
|
// add Cut, Copy, and Paste to wxGrids
|
|
|
|
m_global_grid->PushEventHandler( new FP_GRID_TRICKS( m_global_grid ) ); |
|
|
|
m_project_grid->PushEventHandler( new FP_GRID_TRICKS( m_project_grid ) ); |
|
|
|
|
|
|
|
m_global_grid->AutoSizeColumns( false ); |
|
|
|
m_project_grid->AutoSizeColumns( false ); |
|
|
|
|
|
|
|
wxArrayString choices; |
|
|
|
|
|
|
|
choices.Add( IO_MGR::ShowType( IO_MGR::KICAD ) ); |
|
|
|
choices.Add( IO_MGR::ShowType( IO_MGR::GITHUB ) ); |
|
|
|
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 ) ); |
|
|
|
|
|
|
|
/* PCAD_PLUGIN does not support Footprint*() functions
|
|
|
|
choices.Add( IO_MGR::ShowType( IO_MGR::GITHUB ) ); |
|
|
|
*/ |
|
|
|
|
|
|
|
wxGridCellAttr* attr; |
|
|
|
|
|
|
|
attr = new wxGridCellAttr; |
|
|
|
attr->SetEditor( new wxGridCellChoiceEditor( choices ) ); |
|
|
|
m_project_grid->SetColAttr( COL_TYPE, attr ); |
|
|
|
|
|
|
|
attr = new wxGridCellAttr; |
|
|
|
attr->SetEditor( new wxGridCellChoiceEditor( choices ) ); |
|
|
|
m_global_grid->SetColAttr( COL_TYPE, attr ); |
|
|
|
|
|
|
|
m_global_grid->AutoSizeColumns( false ); |
|
|
|
m_project_grid->AutoSizeColumns( false ); |
|
|
|
|
|
|
|
/*
|
|
|
|
Connect( MYID_FIRST, MYID_LAST, 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
|
|
|
|
wxAuiNotebookEvent uneventful; |
|
|
|
pageChangedHandler( uneventful ); |
|
|
|
|
|
|
|
// for ALT+A handling, we want the initial focus to be on the first selected grid.
|
|
|
|
m_cur_grid->SetFocus(); |
|
|
|
} |
|
|
|
|
|
|
|
~DIALOG_FP_LIB_TABLE() |
|
|
|
{ |
|
|
|
// Delete the GRID_TRICKS.
|
|
|
|
// Any additional event handlers should be popped before the window is deleted.
|
|
|
|
m_global_grid->PopEventHandler( true ); |
|
|
|
m_project_grid->PopEventHandler( true ); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private: |
|
|
|
typedef FP_LIB_TABLE::ROW ROW; |
|
|
|
|
|
|
|
/// If the cursor is not on a valid cell, because there are no rows at all, return -1,
|
|
|
@ -298,7 +371,6 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE |
|
|
|
return m_cur_grid->GetGridCursorRow(); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Function verifyTables |
|
|
|
* trims important fields, removes blank row entries, and checks for duplicates. |
|
|
@ -308,7 +380,7 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE |
|
|
|
{ |
|
|
|
for( int t=0; t<2; ++t ) |
|
|
|
{ |
|
|
|
FP_TBL_MODEL& model = t==0 ? m_global_model : m_project_model; |
|
|
|
FP_TBL_MODEL& model = t==0 ? *global_model() : *project_model(); |
|
|
|
|
|
|
|
for( int r = 0; r < model.GetNumberRows(); ) |
|
|
|
{ |
|
|
@ -330,9 +402,9 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE |
|
|
|
wxT( ":" ), GetChars( nick ), r ); |
|
|
|
|
|
|
|
// show the tabbed panel holding the grid we have flunked:
|
|
|
|
if( &model != (FP_TBL_MODEL*) m_cur_grid->GetTable() ) |
|
|
|
if( &model != cur_model() ) |
|
|
|
{ |
|
|
|
m_auinotebook->SetSelection( &model == &m_global_model ? 0 : 1 ); |
|
|
|
m_auinotebook->SetSelection( &model == global_model() ? 0 : 1 ); |
|
|
|
} |
|
|
|
|
|
|
|
// go to the problematic row
|
|
|
@ -357,7 +429,7 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE |
|
|
|
// check for duplicate nickNames, separately in each table.
|
|
|
|
for( int t=0; t<2; ++t ) |
|
|
|
{ |
|
|
|
FP_TBL_MODEL& model = t==0 ? m_global_model : m_project_model; |
|
|
|
FP_TBL_MODEL& model = t==0 ? *global_model() : *project_model(); |
|
|
|
|
|
|
|
for( int r1 = 0; r1 < model.GetNumberRows() - 1; ++r1 ) |
|
|
|
{ |
|
|
@ -375,9 +447,9 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE |
|
|
|
); |
|
|
|
|
|
|
|
// show the tabbed panel holding the grid we have flunked:
|
|
|
|
if( &model != (FP_TBL_MODEL*) m_cur_grid->GetTable() ) |
|
|
|
if( &model != cur_model() ) |
|
|
|
{ |
|
|
|
m_auinotebook->SetSelection( &model == &m_global_model ? 0 : 1 ); |
|
|
|
m_auinotebook->SetSelection( &model == global_model() ? 0 : 1 ); |
|
|
|
} |
|
|
|
|
|
|
|
// go to the lower of the two rows, it is technically the duplicate:
|
|
|
@ -422,6 +494,7 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE |
|
|
|
{ |
|
|
|
int last_row = m_cur_grid->GetNumberRows() - 1; |
|
|
|
|
|
|
|
// wx documentation is wrong, SetGridCursor does not make visible.
|
|
|
|
m_cur_grid->MakeCellVisible( last_row, 0 ); |
|
|
|
m_cur_grid->SetGridCursor( last_row, 0 ); |
|
|
|
} |
|
|
@ -445,7 +518,7 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE |
|
|
|
{ |
|
|
|
int curCol = getCursorCol(); |
|
|
|
|
|
|
|
FP_TBL_MODEL* tbl = (FP_TBL_MODEL*) m_cur_grid->GetTable(); |
|
|
|
FP_TBL_MODEL* tbl = cur_model(); |
|
|
|
|
|
|
|
ROW move_me = tbl->rows[curRow]; |
|
|
|
|
|
|
@ -464,13 +537,14 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE |
|
|
|
tbl->GetView()->ProcessTableMessage( msg ); |
|
|
|
} |
|
|
|
|
|
|
|
m_cur_grid->MakeCellVisible( curRow, curCol ); |
|
|
|
m_cur_grid->SetGridCursor( curRow, curCol ); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void moveDownHandler( wxMouseEvent& event ) |
|
|
|
{ |
|
|
|
FP_TBL_MODEL* tbl = (FP_TBL_MODEL*) m_cur_grid->GetTable(); |
|
|
|
FP_TBL_MODEL* tbl = cur_model(); |
|
|
|
|
|
|
|
int curRow = getCursorRow(); |
|
|
|
if( unsigned( curRow + 1 ) < tbl->rows.size() ) |
|
|
@ -494,14 +568,14 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE |
|
|
|
tbl->GetView()->ProcessTableMessage( msg ); |
|
|
|
} |
|
|
|
|
|
|
|
m_cur_grid->MakeCellVisible( curRow, curCol ); |
|
|
|
m_cur_grid->SetGridCursor( curRow, curCol ); |
|
|
|
} |
|
|
|
DBG(printf("%s\n", __func__);) |
|
|
|
} |
|
|
|
|
|
|
|
void optionsEditor( wxMouseEvent& event ) |
|
|
|
{ |
|
|
|
FP_TBL_MODEL* tbl = (FP_TBL_MODEL*) m_cur_grid->GetTable(); |
|
|
|
FP_TBL_MODEL* tbl = cur_model(); |
|
|
|
|
|
|
|
int curRow = getCursorRow(); |
|
|
|
ROW& row = tbl->rows[curRow]; |
|
|
@ -537,19 +611,19 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE |
|
|
|
|
|
|
|
if( verifyTables() ) |
|
|
|
{ |
|
|
|
if( m_global_model != *m_global ) |
|
|
|
if( *global_model() != *m_global ) |
|
|
|
{ |
|
|
|
dialogRet |= 1; |
|
|
|
|
|
|
|
*m_global = m_global_model; |
|
|
|
*m_global = *global_model(); |
|
|
|
m_global->reindex(); |
|
|
|
} |
|
|
|
|
|
|
|
if( m_project_model != *m_project ) |
|
|
|
if( *project_model() != *m_project ) |
|
|
|
{ |
|
|
|
dialogRet |= 2; |
|
|
|
|
|
|
|
*m_project = m_project_model; |
|
|
|
*m_project = *project_model(); |
|
|
|
m_project->reindex(); |
|
|
|
} |
|
|
|
|
|
|
@ -570,13 +644,16 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE |
|
|
|
// clear the table
|
|
|
|
m_path_subs_grid->DeleteRows( 0, m_path_subs_grid->GetNumberRows() ); |
|
|
|
|
|
|
|
int gblRowCount = m_global_model.GetNumberRows(); |
|
|
|
int prjRowCount = m_project_model.GetNumberRows(); |
|
|
|
FP_TBL_MODEL* gbl = global_model(); |
|
|
|
FP_TBL_MODEL* prj = project_model(); |
|
|
|
|
|
|
|
int gblRowCount = gbl->GetNumberRows(); |
|
|
|
int prjRowCount = prj->GetNumberRows(); |
|
|
|
int row; |
|
|
|
|
|
|
|
for( row = 0; row < gblRowCount; ++row ) |
|
|
|
{ |
|
|
|
wxString uri = m_global_model.GetValue( row, COL_URI ); |
|
|
|
wxString uri = gbl->GetValue( row, COL_URI ); |
|
|
|
|
|
|
|
while( re.Matches( uri ) ) |
|
|
|
{ |
|
|
@ -592,7 +669,7 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE |
|
|
|
|
|
|
|
for( row = 0; row < prjRowCount; ++row ) |
|
|
|
{ |
|
|
|
wxString uri = m_project_model.GetValue( row, COL_URI ); |
|
|
|
wxString uri = prj->GetValue( row, COL_URI ); |
|
|
|
|
|
|
|
while( re.Matches( uri ) ) |
|
|
|
{ |
|
|
@ -625,91 +702,15 @@ class DIALOG_FP_LIB_TABLE : public DIALOG_FP_LIB_TABLE_BASE |
|
|
|
|
|
|
|
//-----</event handlers>---------------------------------
|
|
|
|
|
|
|
|
// caller's tables are modified only on OK button.
|
|
|
|
// caller's tables are modified only on OK button and successful verification.
|
|
|
|
FP_LIB_TABLE* m_global; |
|
|
|
FP_LIB_TABLE* m_project; |
|
|
|
|
|
|
|
// local copies which are edited, but aborted if Cancel button.
|
|
|
|
FP_TBL_MODEL m_global_model; |
|
|
|
FP_TBL_MODEL m_project_model; |
|
|
|
FP_TBL_MODEL* global_model() const { return (FP_TBL_MODEL*) m_global_grid->GetTable(); } |
|
|
|
FP_TBL_MODEL* project_model() const { return (FP_TBL_MODEL*) m_project_grid->GetTable(); } |
|
|
|
FP_TBL_MODEL* cur_model() const { return (FP_TBL_MODEL*) m_cur_grid->GetTable(); } |
|
|
|
|
|
|
|
wxGrid* m_cur_grid; ///< changed based on tab choice
|
|
|
|
|
|
|
|
public: |
|
|
|
DIALOG_FP_LIB_TABLE( wxTopLevelWindow* aParent, FP_LIB_TABLE* aGlobal, FP_LIB_TABLE* aProject ) : |
|
|
|
DIALOG_FP_LIB_TABLE_BASE( aParent ), |
|
|
|
m_global( aGlobal ), |
|
|
|
m_project( aProject ), |
|
|
|
m_global_model( *aGlobal ), |
|
|
|
m_project_model( *aProject ) |
|
|
|
{ |
|
|
|
m_global_grid->SetTable( (wxGridTableBase*) &m_global_model ); |
|
|
|
m_project_grid->SetTable( (wxGridTableBase*) &m_project_model ); |
|
|
|
|
|
|
|
// add Cut, Copy, and Paste to wxGrids
|
|
|
|
m_global_grid->PushEventHandler( new FP_GRID_TRICKS( m_global_grid ) ); |
|
|
|
m_project_grid->PushEventHandler( new FP_GRID_TRICKS( m_project_grid ) ); |
|
|
|
|
|
|
|
m_global_grid->AutoSizeColumns( false ); |
|
|
|
m_project_grid->AutoSizeColumns( false ); |
|
|
|
|
|
|
|
wxArrayString choices; |
|
|
|
|
|
|
|
choices.Add( IO_MGR::ShowType( IO_MGR::KICAD ) ); |
|
|
|
choices.Add( IO_MGR::ShowType( IO_MGR::GITHUB ) ); |
|
|
|
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 ) ); |
|
|
|
|
|
|
|
/* PCAD_PLUGIN does not support Footprint*() functions
|
|
|
|
choices.Add( IO_MGR::ShowType( IO_MGR::GITHUB ) ); |
|
|
|
*/ |
|
|
|
|
|
|
|
wxGridCellAttr* attr; |
|
|
|
|
|
|
|
attr = new wxGridCellAttr; |
|
|
|
attr->SetEditor( new wxGridCellChoiceEditor( choices ) ); |
|
|
|
m_project_grid->SetColAttr( COL_TYPE, attr ); |
|
|
|
|
|
|
|
attr = new wxGridCellAttr; |
|
|
|
attr->SetEditor( new wxGridCellChoiceEditor( choices ) ); |
|
|
|
m_global_grid->SetColAttr( COL_TYPE, attr ); |
|
|
|
|
|
|
|
m_global_grid->AutoSizeColumns( false ); |
|
|
|
m_project_grid->AutoSizeColumns( false ); |
|
|
|
|
|
|
|
/*
|
|
|
|
Connect( MYID_FIRST, MYID_LAST, 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
|
|
|
|
wxAuiNotebookEvent uneventful; |
|
|
|
pageChangedHandler( uneventful ); |
|
|
|
|
|
|
|
// for ALT+A handling, we want the initial focus to be on the first selected grid.
|
|
|
|
m_cur_grid->SetFocus(); |
|
|
|
} |
|
|
|
|
|
|
|
~DIALOG_FP_LIB_TABLE() |
|
|
|
{ |
|
|
|
// Delete the GRID_TRICKS.
|
|
|
|
// Any additional event handlers should be popped before the window is deleted.
|
|
|
|
m_global_grid->PopEventHandler( true ); |
|
|
|
m_project_grid->PopEventHandler( true ); |
|
|
|
|
|
|
|
// ~wxGrid() examines its table, and the tables will have been destroyed before
|
|
|
|
// the wxGrids are, so remove the tables from the wxGrids' awareness.
|
|
|
|
// Otherwise there is a segfault.
|
|
|
|
m_global_grid->SetTable( NULL ); |
|
|
|
m_project_grid->SetTable( NULL ); |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|