News:

When registered with our forums, feel free to send a "here I am" post here to differ human beings from SPAM bots.

Main Menu

tree->GetSelection not working anymore on rev7548

Started by daniloz, November 03, 2011, 02:18:26 PM

Previous topic - Next topic

daniloz

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]

daniloz

#1
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()

ollydbg

#2
Same problem here reparse project or reparse file does not woks any more, all the recent nightly builds has this issue.

Edit: It should be commit before rev 6546.
If some piece of memory should be reused, turn them to variables (or const variables).
If some piece of operations should be reused, turn them to functions.
If they happened together, then turn them to classes.

Jenna

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.

ollydbg

If some piece of memory should be reused, turn them to variables (or const variables).
If some piece of operations should be reused, turn them to functions.
If they happened together, then turn them to classes.

MortenMacFly

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...
Compiler logging: Settings->Compiler & Debugger->tab "Other"->Compiler logging="Full command line"
C::B Manual: [url="https://www.codeblocks.org/docs/main_codeblocks_en.html"]https://www.codeblocks.org/docs/main_codeblocks_en.html[/url]
C::B FAQ: [url="https://wiki.codeblocks.org/index.php?title=FAQ"]https://wiki.codeblocks.org/index.php?title=FAQ[/url]

daniloz

@jens and @MortenMacFly:
Thanks very much for your answers!!!

MortenMacFly

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... :?
Compiler logging: Settings->Compiler & Debugger->tab "Other"->Compiler logging="Full command line"
C::B Manual: [url="https://www.codeblocks.org/docs/main_codeblocks_en.html"]https://www.codeblocks.org/docs/main_codeblocks_en.html[/url]
C::B FAQ: [url="https://wiki.codeblocks.org/index.php?title=FAQ"]https://wiki.codeblocks.org/index.php?title=FAQ[/url]