Hi,
I was developing a plugin and since one week, the part that gets the selected item on the "Project Manager" is not working anymore.
I have a pretty much standard code, as in other places in C::B and other plugins, i.e.:
void cbTree::OnContextMenu( wxCommandEvent& /*event*/ )
{
wxTreeCtrl* tree = Manager::Get()->GetProjectManager()->GetTree();
if ( !tree )
return;
wxTreeItemId selItem = tree->GetSelection();
if ( !selItem.IsOk() )
return;
const FileTreeData* ftData = static_cast<FileTreeData*>( tree->GetItemData( selItem ) );
if ( !ftData )
return;
if (ftData->GetKind() != FileTreeData::ftdkFile)
return;
ProjectFile* pFile = ftData->GetProjectFile();
if ( !pFile )
return;
// Do something with the pFile here //
return;
}
After adding some verbosity to the code and debugging, I figured out that
wxTreeItemId selItem = tree->GetSelection();
is returning a NULL pointer.
Any idea what has changed in the last week or so that could break this...
Btw, I checked the code completion plugin, and the part where is does a "Reparse this Project" (void NativeParser::ReparseSelectedProject()) is also not working for the same reason...
Attached is a simple project to reproduce the problem.
[attachment deleted by admin]
Sorry to reply to my own post, but I have some information about this issue:
If instead of
wxTreeItemId selItem = tree->GetSelection();
I use
wxTreeItemId selItem = Manager::Get()->GetProjectManager()->GetTreeSelection();
Then everything is working...
It seems something was broken in tree->GetSelection()
The reason is quite simple:
wxTreeCtrl::GetSelection
wxTreeItemId GetSelection() const
Returns the selection, or an invalid item if there is no selection. This function only works with the controls without wxTR_MULTIPLE style, use GetSelections for the controls which do have this style.
wxTR_MULTIPLE was added to the projects tree in revision 7531.
/** Get the selection of the project manager's tree (GUI).
* This must be used instead of tree->GetSelection() because the tree
* has the wxTR_MULTIPLE style.
* This usually returns the first item in the selection list, but
* if there is a right-click popup menu then the user may have
* selected several items and right-clicked on one, so return the
* right-click item instead.
* of the first
* @return A wxTreeItemId of the selected tree item.
*/
wxTreeItemId GetTreeSelection();
So all code that uses wxTreeCtrl::GetSelection()
has to be fixed to use ProjectManager::GetTreeSelection()
instead.