treelist.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // Name: samples/treelist/treelist.cpp
  3. // Purpose: Sample showing wxTreeListCtrl.
  4. // Author: Vadim Zeitlin
  5. // Created: 2011-08-19
  6. // Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
  7. // Licence: wxWindows licence
  8. ///////////////////////////////////////////////////////////////////////////////
  9. // ============================================================================
  10. // Declarations
  11. // ============================================================================
  12. // ----------------------------------------------------------------------------
  13. // Headers
  14. // ----------------------------------------------------------------------------
  15. #include "wx/wxprec.h"
  16. #ifdef __BORLANDC__
  17. #pragma hdrstop
  18. #endif
  19. #if !wxUSE_TREELISTCTRL
  20. #error "wxUSE_TREELISTCTRL must be 1 for this sample."
  21. #endif
  22. #ifndef WX_PRECOMP
  23. #include "wx/app.h"
  24. #include "wx/frame.h"
  25. #include "wx/log.h"
  26. #include "wx/menu.h"
  27. #include "wx/sizer.h"
  28. #include "wx/statusbr.h"
  29. #include "wx/textctrl.h"
  30. #endif
  31. #include "wx/treelist.h"
  32. #include "wx/aboutdlg.h"
  33. #include "wx/artprov.h"
  34. // ----------------------------------------------------------------------------
  35. // Resources
  36. // ----------------------------------------------------------------------------
  37. #ifndef wxHAS_IMAGES_IN_RESOURCES
  38. #include "../sample.xpm"
  39. #endif
  40. // ----------------------------------------------------------------------------
  41. // Constants
  42. // ----------------------------------------------------------------------------
  43. // Menu items.
  44. enum
  45. {
  46. Id_MultiSelect = 100,
  47. Id_FlatList,
  48. Id_Checkboxes_Start,
  49. Id_NoCheckboxes = Id_Checkboxes_Start,
  50. Id_Checkboxes2State,
  51. Id_Checkboxes3State,
  52. Id_CheckboxesUser3State,
  53. Id_Checkboxes_End,
  54. Id_DumpSelection,
  55. Id_Check_HTMLDocs,
  56. Id_Uncheck_HTMLDocs,
  57. Id_Indet_HTMLDocs,
  58. Id_Select_HTMLDocs
  59. };
  60. // Tree list columns.
  61. enum
  62. {
  63. Col_Component,
  64. Col_Files,
  65. Col_Size
  66. };
  67. // ----------------------------------------------------------------------------
  68. // Custom comparator for tree list items comparison
  69. // ----------------------------------------------------------------------------
  70. // This is a toy class as in a real program you would have the original numeric
  71. // data somewhere and wouldn't need to parse it back from strings presumably.
  72. // Nevertheless it shows how to implement a custom comparator which is needed
  73. // if you want to sort by a column with non-textual contents.
  74. class MyComparator : public wxTreeListItemComparator
  75. {
  76. public:
  77. virtual int
  78. Compare(wxTreeListCtrl* treelist,
  79. unsigned column,
  80. wxTreeListItem item1,
  81. wxTreeListItem item2)
  82. {
  83. wxString text1 = treelist->GetItemText(item1, column),
  84. text2 = treelist->GetItemText(item2, column);
  85. switch ( column )
  86. {
  87. case Col_Component:
  88. // Simple alphabetical comparison is fine for those.
  89. return text1.CmpNoCase(text2);
  90. case Col_Files:
  91. // Compare strings as numbers.
  92. return GetNumFilesFromText(text1) - GetNumFilesFromText(text2);
  93. case Col_Size:
  94. // Compare strings as numbers but also take care of "KiB" and
  95. // "MiB" suffixes.
  96. return GetSizeFromText(text1) - GetSizeFromText(text2);
  97. }
  98. wxFAIL_MSG( "Sorting on unknown column?" );
  99. return 0;
  100. }
  101. private:
  102. // Return the number of files handling special value "many". Notice that
  103. // the returned value is signed to allow using it in subtraction above.
  104. int GetNumFilesFromText(const wxString& text) const
  105. {
  106. unsigned long n;
  107. if ( !text.ToULong(&n) )
  108. {
  109. if ( text == "many" )
  110. n = 9999;
  111. else
  112. n = 0;
  113. }
  114. return n;
  115. }
  116. // Return the size in KiB from a string with either KiB or MiB suffix.
  117. int GetSizeFromText(const wxString& text) const
  118. {
  119. wxString size;
  120. unsigned factor = 1;
  121. if ( text.EndsWith(" MiB", &size) )
  122. factor = 1024;
  123. else if ( !text.EndsWith(" KiB", &size) )
  124. return 0;
  125. unsigned long n = 0;
  126. size.ToULong(&n);
  127. return n*factor;
  128. }
  129. };
  130. // ----------------------------------------------------------------------------
  131. // Application class
  132. // ----------------------------------------------------------------------------
  133. class MyApp : public wxApp
  134. {
  135. public:
  136. virtual bool OnInit();
  137. };
  138. // ----------------------------------------------------------------------------
  139. // Main window class
  140. // ----------------------------------------------------------------------------
  141. class MyFrame : public wxFrame
  142. {
  143. public:
  144. MyFrame();
  145. virtual ~MyFrame();
  146. private:
  147. // Event handlers for the menu and wxTreeListCtrl events.
  148. void OnMultiSelect(wxCommandEvent& event);
  149. void OnFlatList(wxCommandEvent& event);
  150. void OnCheckboxes(wxCommandEvent& event);
  151. void OnDumpSelection(wxCommandEvent& event);
  152. void OnCheckHTMLDocs(wxCommandEvent& event);
  153. void OnSelectHTMLDocs(wxCommandEvent& event);
  154. void OnAbout(wxCommandEvent& event);
  155. void OnExit(wxCommandEvent& event);
  156. void OnSelectionChanged(wxTreeListEvent& event);
  157. void OnItemExpanding(wxTreeListEvent& event);
  158. void OnItemExpanded(wxTreeListEvent& event);
  159. void OnItemChecked(wxTreeListEvent& event);
  160. void OnItemActivated(wxTreeListEvent& event);
  161. void OnItemContextMenu(wxTreeListEvent& event);
  162. enum
  163. {
  164. Icon_File,
  165. Icon_FolderClosed,
  166. Icon_FolderOpened
  167. };
  168. // Create the image list, called once only. Should add images to it in the
  169. // same order as they appear in the enum above.
  170. void InitImageList();
  171. // Create the control with the given styles.
  172. wxTreeListCtrl* CreateTreeListCtrl(long style);
  173. // Recreate an already existing control.
  174. void RecreateTreeListCtrl(long style);
  175. // Helper: return the text of the item or "NONE" if the item is invalid.
  176. wxString DumpItem(wxTreeListItem item) const;
  177. // Another helper: just translate wxCheckBoxState to user-readable text.
  178. static const char* CheckedStateString(wxCheckBoxState state);
  179. wxImageList* m_imageList;
  180. wxTreeListCtrl* m_treelist;
  181. MyComparator m_comparator;
  182. wxTreeListItem m_itemHTMLDocs;
  183. wxLog* m_oldLogTarget;
  184. bool m_isFlat;
  185. wxDECLARE_EVENT_TABLE();
  186. };
  187. // ============================================================================
  188. // Implementation
  189. // ============================================================================
  190. // ----------------------------------------------------------------------------
  191. // Application class
  192. // ----------------------------------------------------------------------------
  193. wxIMPLEMENT_APP(MyApp);
  194. bool MyApp::OnInit()
  195. {
  196. if ( !wxApp::OnInit() )
  197. return false;
  198. new MyFrame;
  199. return true;
  200. }
  201. // ----------------------------------------------------------------------------
  202. // Main window class
  203. // ----------------------------------------------------------------------------
  204. wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
  205. EVT_MENU(Id_MultiSelect, MyFrame::OnMultiSelect)
  206. EVT_MENU(Id_FlatList, MyFrame::OnFlatList)
  207. EVT_MENU_RANGE(Id_Checkboxes_Start, Id_Checkboxes_End,
  208. MyFrame::OnCheckboxes)
  209. EVT_MENU(Id_DumpSelection, MyFrame::OnDumpSelection)
  210. EVT_MENU_RANGE(Id_Check_HTMLDocs, Id_Indet_HTMLDocs,
  211. MyFrame::OnCheckHTMLDocs)
  212. EVT_MENU(Id_Select_HTMLDocs, MyFrame::OnSelectHTMLDocs)
  213. EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
  214. EVT_MENU(wxID_EXIT, MyFrame::OnExit)
  215. EVT_TREELIST_SELECTION_CHANGED(wxID_ANY, MyFrame::OnSelectionChanged)
  216. EVT_TREELIST_ITEM_EXPANDING(wxID_ANY, MyFrame::OnItemExpanding)
  217. EVT_TREELIST_ITEM_EXPANDED(wxID_ANY, MyFrame::OnItemExpanded)
  218. EVT_TREELIST_ITEM_CHECKED(wxID_ANY, MyFrame::OnItemChecked)
  219. EVT_TREELIST_ITEM_ACTIVATED(wxID_ANY, MyFrame::OnItemActivated)
  220. EVT_TREELIST_ITEM_CONTEXT_MENU(wxID_ANY, MyFrame::OnItemContextMenu)
  221. wxEND_EVENT_TABLE()
  222. MyFrame::MyFrame()
  223. : wxFrame(NULL, wxID_ANY, "wxWidgets tree/list control sample",
  224. wxDefaultPosition, wxSize(600, 450))
  225. {
  226. m_isFlat = false;
  227. // Create menus and status bar.
  228. SetIcon(wxICON(sample));
  229. wxMenu* fileMenu = new wxMenu;
  230. fileMenu->Append(wxID_EXIT);
  231. wxMenu* treeStyle = new wxMenu;
  232. treeStyle->AppendCheckItem(Id_MultiSelect, "&Multiple selections\tCtrl-M");
  233. treeStyle->AppendSeparator();
  234. treeStyle->AppendRadioItem(Id_NoCheckboxes,
  235. "&No checkboxes\tCtrl-1");
  236. treeStyle->AppendRadioItem(Id_Checkboxes2State,
  237. "&2-state checkboxes\tCtrl-2");
  238. treeStyle->AppendRadioItem(Id_Checkboxes3State,
  239. "&3-state checkboxes\tCtrl-3");
  240. treeStyle->AppendRadioItem(Id_CheckboxesUser3State,
  241. "&User-settable 3-state checkboxes\tCtrl-4");
  242. treeStyle->AppendSeparator();
  243. treeStyle->AppendCheckItem(Id_FlatList, "&Flat list");
  244. wxMenu* treeOper = new wxMenu;
  245. treeOper->Append(Id_DumpSelection, "&Dump selection\tCtrl-D");
  246. treeOper->AppendSeparator();
  247. treeOper->Append(Id_Check_HTMLDocs, "&Check Doc/HTML item\tCtrl-C");
  248. treeOper->Append(Id_Uncheck_HTMLDocs, "&Uncheck Doc/HTML item\tCtrl-U");
  249. treeOper->Append(Id_Indet_HTMLDocs, "Make Doc/HTML &indeterminate\tCtrl-I");
  250. treeOper->Append(Id_Select_HTMLDocs, "&Select Doc/HTML item\tCtrl-S");
  251. wxMenu* helpMenu = new wxMenu;
  252. helpMenu->Append(wxID_ABOUT);
  253. wxMenuBar* menuBar = new wxMenuBar();
  254. menuBar->Append(fileMenu, "&File");
  255. menuBar->Append(treeStyle, "&Style");
  256. menuBar->Append(treeOper, "&Operations");
  257. menuBar->Append(helpMenu, "&Help");
  258. SetMenuBar(menuBar);
  259. CreateStatusBar(1);
  260. // Construct the image list with the standard images.
  261. InitImageList();
  262. // Create and layout child controls.
  263. m_treelist = CreateTreeListCtrl(wxTL_DEFAULT_STYLE);
  264. wxTextCtrl* textLog = new wxTextCtrl(this, wxID_ANY, "",
  265. wxDefaultPosition, wxDefaultSize,
  266. wxTE_READONLY | wxTE_MULTILINE);
  267. m_oldLogTarget = wxLog::SetActiveTarget(new wxLogTextCtrl(textLog));
  268. wxSizer* sizer = new wxBoxSizer(wxVERTICAL);
  269. sizer->Add(m_treelist, wxSizerFlags(2).Expand());
  270. sizer->Add(textLog, wxSizerFlags(1).Expand());
  271. SetSizer(sizer);
  272. // Finally show everything.
  273. Show();
  274. }
  275. MyFrame::~MyFrame()
  276. {
  277. delete m_imageList;
  278. delete wxLog::SetActiveTarget(m_oldLogTarget);
  279. }
  280. void MyFrame::InitImageList()
  281. {
  282. wxSize iconSize = wxArtProvider::GetSizeHint(wxART_LIST);
  283. if ( iconSize == wxDefaultSize )
  284. iconSize = wxSize(16, 16);
  285. m_imageList = new wxImageList(iconSize.x, iconSize.y);
  286. // The order should be the same as for the enum elements.
  287. static const char* const icons[] =
  288. {
  289. wxART_NORMAL_FILE,
  290. wxART_FOLDER,
  291. wxART_FOLDER_OPEN
  292. };
  293. for ( unsigned n = 0; n < WXSIZEOF(icons); n++ )
  294. {
  295. m_imageList->Add
  296. (
  297. wxArtProvider::GetIcon(icons[n], wxART_LIST, iconSize)
  298. );
  299. }
  300. }
  301. wxTreeListCtrl* MyFrame::CreateTreeListCtrl(long style)
  302. {
  303. wxTreeListCtrl* const
  304. tree = new wxTreeListCtrl(this, wxID_ANY,
  305. wxDefaultPosition, wxDefaultSize,
  306. style);
  307. tree->SetImageList(m_imageList);
  308. tree->AppendColumn("Component",
  309. wxCOL_WIDTH_AUTOSIZE,
  310. wxALIGN_LEFT,
  311. wxCOL_RESIZABLE | wxCOL_SORTABLE);
  312. tree->AppendColumn("# Files",
  313. tree->WidthFor("1,000,000"),
  314. wxALIGN_RIGHT,
  315. wxCOL_RESIZABLE | wxCOL_SORTABLE);
  316. tree->AppendColumn("Size",
  317. tree->WidthFor("1,000,000 KiB"),
  318. wxALIGN_RIGHT,
  319. wxCOL_RESIZABLE | wxCOL_SORTABLE);
  320. // Define a shortcut to save on typing here.
  321. #define ADD_ITEM(item, parent, files, size) \
  322. wxTreeListItem item = tree->AppendItem(m_isFlat ? root : parent, \
  323. #item, \
  324. Icon_FolderClosed, \
  325. Icon_FolderOpened); \
  326. tree->SetItemText(item, Col_Files, files); \
  327. tree->SetItemText(item, Col_Size, size)
  328. wxTreeListItem root = tree->GetRootItem();
  329. ADD_ITEM(Code, root, "", "");
  330. ADD_ITEM(wxMSW, Code, "313", "3.94 MiB");
  331. ADD_ITEM(wxGTK, Code, "180", "1.66 MiB");
  332. ADD_ITEM(wxOSX, Code, "265", "2.36 MiB");
  333. ADD_ITEM(Core, wxOSX, "31", "347 KiB");
  334. ADD_ITEM(Carbon, wxOSX, "91", "1.34 MiB");
  335. ADD_ITEM(Cocoa, wxOSX, "46", "512 KiB");
  336. ADD_ITEM(Documentation, root, "", "");
  337. ADD_ITEM(HTML, Documentation, "many", "");
  338. ADD_ITEM(CHM, Documentation, "1", "");
  339. ADD_ITEM(Samples, root, "", "");
  340. ADD_ITEM(minimal, Samples, "1", "7 KiB");
  341. ADD_ITEM(widgets, Samples, "28", "419 KiB");
  342. #undef ADD_ITEM
  343. // Remember this one for subsequent tests.
  344. m_itemHTMLDocs = HTML;
  345. // Set a custom comparator to compare strings containing numbers correctly.
  346. tree->SetItemComparator(&m_comparator);
  347. return tree;
  348. }
  349. void MyFrame::RecreateTreeListCtrl(long style)
  350. {
  351. wxTreeListCtrl* const treelist = CreateTreeListCtrl(style);
  352. GetSizer()->Replace(m_treelist, treelist);
  353. delete m_treelist;
  354. m_treelist = treelist;
  355. Layout();
  356. }
  357. void MyFrame::OnMultiSelect(wxCommandEvent& event)
  358. {
  359. long style = m_treelist->GetWindowStyle();
  360. if ( event.IsChecked() )
  361. style |= wxTL_MULTIPLE;
  362. else
  363. style &= ~wxTL_MULTIPLE;
  364. RecreateTreeListCtrl(style);
  365. }
  366. void MyFrame::OnFlatList(wxCommandEvent& event)
  367. {
  368. m_isFlat = event.IsChecked();
  369. RecreateTreeListCtrl(m_treelist->GetWindowStyle());
  370. }
  371. void MyFrame::OnCheckboxes(wxCommandEvent& event)
  372. {
  373. long style = m_treelist->GetWindowStyle();
  374. style &= ~(wxTL_CHECKBOX | wxTL_3STATE | wxTL_USER_3STATE);
  375. switch ( event.GetId() )
  376. {
  377. case Id_NoCheckboxes:
  378. break;
  379. case Id_Checkboxes2State:
  380. style |= wxTL_CHECKBOX;
  381. break;
  382. case Id_Checkboxes3State:
  383. style |= wxTL_3STATE;
  384. break;
  385. case Id_CheckboxesUser3State:
  386. style |= wxTL_USER_3STATE;
  387. break;
  388. default:
  389. wxFAIL_MSG( "Unknown checkbox style" );
  390. return;
  391. }
  392. RecreateTreeListCtrl(style);
  393. }
  394. void MyFrame::OnDumpSelection(wxCommandEvent& WXUNUSED(event))
  395. {
  396. if ( m_treelist->HasFlag(wxTL_MULTIPLE) )
  397. {
  398. wxTreeListItems selections;
  399. const unsigned numSelected = m_treelist->GetSelections(selections);
  400. switch ( numSelected )
  401. {
  402. case 0:
  403. wxLogMessage("No items selected");
  404. break;
  405. case 1:
  406. wxLogMessage("Single item selected: %s",
  407. DumpItem(selections[0]));
  408. break;
  409. default:
  410. wxLogMessage("%u items selected:", numSelected);
  411. for ( unsigned n = 0; n < numSelected; n++ )
  412. {
  413. wxLogMessage("\t%s", DumpItem(selections[n]));
  414. }
  415. }
  416. }
  417. else // Single selection
  418. {
  419. wxLogMessage("Selection: %s", DumpItem(m_treelist->GetSelection()));
  420. }
  421. }
  422. void MyFrame::OnCheckHTMLDocs(wxCommandEvent& event)
  423. {
  424. wxCheckBoxState state;
  425. switch ( event.GetId() )
  426. {
  427. case Id_Uncheck_HTMLDocs:
  428. state = wxCHK_UNCHECKED;
  429. break;
  430. case Id_Check_HTMLDocs:
  431. state = wxCHK_CHECKED;
  432. break;
  433. case Id_Indet_HTMLDocs:
  434. state = wxCHK_UNDETERMINED;
  435. break;
  436. default:
  437. wxFAIL_MSG( "Unknown check state" );
  438. return;
  439. }
  440. m_treelist->CheckItem(m_itemHTMLDocs, state);
  441. }
  442. void MyFrame::OnSelectHTMLDocs(wxCommandEvent& WXUNUSED(event))
  443. {
  444. m_treelist->Select(m_itemHTMLDocs);
  445. }
  446. void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
  447. {
  448. wxAboutDialogInfo info;
  449. info.SetDescription("wxTreeListCtrl wxWidgets sample.");
  450. info.SetCopyright("(C) 2011 Vadim Zeitlin <vadim@wxwidgets.org>");
  451. wxAboutBox(info);
  452. }
  453. void MyFrame::OnExit(wxCommandEvent& WXUNUSED(event))
  454. {
  455. Close(true);
  456. }
  457. wxString MyFrame::DumpItem(wxTreeListItem item) const
  458. {
  459. return item.IsOk() ? m_treelist->GetItemText(item) : wxString("NONE");
  460. }
  461. /* static */
  462. const char* MyFrame::CheckedStateString(wxCheckBoxState state)
  463. {
  464. switch ( state )
  465. {
  466. case wxCHK_UNCHECKED:
  467. return "unchecked";
  468. case wxCHK_UNDETERMINED:
  469. return "undetermined";
  470. case wxCHK_CHECKED:
  471. return "checked";
  472. }
  473. return "invalid";
  474. }
  475. void MyFrame::OnSelectionChanged(wxTreeListEvent& event)
  476. {
  477. const char* msg;
  478. if ( m_treelist->HasFlag(wxTL_MULTIPLE) )
  479. msg = "Selection of the \"%s\" item changed.";
  480. else
  481. msg = "Selection changed, now is \"%s\".";
  482. wxLogMessage(msg, DumpItem(event.GetItem()));
  483. }
  484. void MyFrame::OnItemExpanding(wxTreeListEvent& event)
  485. {
  486. wxLogMessage("Item \"%s\" is expanding", DumpItem(event.GetItem()));
  487. }
  488. void MyFrame::OnItemExpanded(wxTreeListEvent& event)
  489. {
  490. wxLogMessage("Item \"%s\" expanded", DumpItem(event.GetItem()));
  491. }
  492. void MyFrame::OnItemChecked(wxTreeListEvent& event)
  493. {
  494. wxTreeListItem item = event.GetItem();
  495. wxLogMessage("Item \"%s\" toggled, now %s (was %s)",
  496. DumpItem(item),
  497. CheckedStateString(m_treelist->GetCheckedState(item)),
  498. CheckedStateString(event.GetOldCheckedState()));
  499. }
  500. void MyFrame::OnItemActivated(wxTreeListEvent& event)
  501. {
  502. wxLogMessage("Item \"%s\" activated", DumpItem(event.GetItem()));
  503. }
  504. void MyFrame::OnItemContextMenu(wxTreeListEvent& event)
  505. {
  506. enum
  507. {
  508. Id_Check_Item,
  509. Id_Uncheck_Item,
  510. Id_Indet_Item,
  511. Id_Check_Recursively,
  512. Id_Update_Parent
  513. };
  514. wxMenu menu;
  515. menu.Append(Id_Check_Item, "&Check item");
  516. menu.Append(Id_Uncheck_Item, "&Uncheck item");
  517. if ( m_treelist->HasFlag(wxTL_3STATE) )
  518. menu.Append(Id_Indet_Item, "Make item &indeterminate");
  519. menu.AppendSeparator();
  520. menu.Append(Id_Check_Recursively, "Check &recursively");
  521. menu.Append(Id_Update_Parent, "Update &parent");
  522. const wxTreeListItem item = event.GetItem();
  523. switch ( m_treelist->GetPopupMenuSelectionFromUser(menu) )
  524. {
  525. case Id_Check_Item:
  526. m_treelist->CheckItem(item);
  527. break;
  528. case Id_Uncheck_Item:
  529. m_treelist->UncheckItem(item);
  530. break;
  531. case Id_Indet_Item:
  532. m_treelist->CheckItem(item, wxCHK_UNDETERMINED);
  533. break;
  534. case Id_Check_Recursively:
  535. m_treelist->CheckItemRecursively(item);
  536. break;
  537. case Id_Update_Parent:
  538. m_treelist->UpdateItemParentStateRecursively(item);
  539. break;
  540. default:
  541. wxFAIL_MSG( "Unexpected menu selection" );
  542. // Fall through.
  543. case wxID_NONE:
  544. return;
  545. }
  546. }