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()
Same problem here reparse project or reparse file does not woks any more (http://forums.next.codeblocks.org/index.php/topic,15471.msg103892.html#msg103892), all the recent nightly builds has this issue.
Edit: It should be commit before rev 6546.
The reason is quite simple:
Quote from: wxWidgets documentationwxTreeCtrl::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.
Quote from: projectmanager.h/** 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.
Thank you jens!!!
Quote from: jens on November 03, 2011, 09:50:39 PM
So all code that uses wxTreeCtrl::GetSelection() has to be fixed to use ProjectManager::GetTreeSelection() instead.
That is certainly true. It seems I missed one position, where this applies, too. I'll correct this once I find the time...
Quote from: daniloz on November 03, 2011, 02:57:31 PM
If instead of
wxTreeItemId selItem = tree->GetSelection();
I use
wxTreeItemId selItem = Manager::Get()->GetProjectManager()->GetTreeSelection();
That would be the right thing to do...
@jens and @MortenMacFly:
Thanks very much for your answers!!!
Quote from: daniloz on November 04, 2011, 10:10:55 AM
@jens and @MortenMacFly:
Thanks very much for your answers!!!
BTW: It's committed meanwhile. I've missed at least three positions, actually... :?