Code::Blocks Forums

Developer forums (C::B DEVELOPMENT STRICTLY!) => Plugins development => Topic started by: daniloz on November 03, 2011, 02:18:26 PM

Title: tree->GetSelection not working anymore on rev7548
Post by: daniloz on November 03, 2011, 02:18:26 PM
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]
Title: Re: tree->GetSelection not working anymore on rev7548
Post by: daniloz on November 03, 2011, 02:57:31 PM
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()
Title: Re: tree->GetSelection not working anymore on rev7548
Post by: ollydbg on November 03, 2011, 03:05:20 PM
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.
Title: Re: tree->GetSelection not working anymore on rev7548
Post by: Jenna on November 03, 2011, 09:50:39 PM
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.
Title: Re: tree->GetSelection not working anymore on rev7548
Post by: ollydbg on November 04, 2011, 01:52:07 AM
Thank you jens!!!
Title: Re: tree->GetSelection not working anymore on rev7548
Post by: MortenMacFly on November 04, 2011, 09:52:50 AM
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...
Title: Re: tree->GetSelection not working anymore on rev7548
Post by: daniloz on November 04, 2011, 10:10:55 AM
@jens and @MortenMacFly:
Thanks very much for your answers!!!
Title: Re: tree->GetSelection not working anymore on rev7548
Post by: MortenMacFly on November 04, 2011, 10:27:57 AM
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... :?