X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/524cb04066186fd955c59a721575397b978192c0..f901941933f6bad712e855476b90c169315f9391:/samples/treelist/treelist.cpp?ds=sidebyside diff --git a/samples/treelist/treelist.cpp b/samples/treelist/treelist.cpp index fc614dc596..081a594e68 100644 --- a/samples/treelist/treelist.cpp +++ b/samples/treelist/treelist.cpp @@ -45,17 +45,19 @@ // Resources // ---------------------------------------------------------------------------- -#if !defined(__WXMSW__) && !defined(__WXPM__) +#ifndef wxHAS_IMAGES_IN_RESOURCES #include "../sample.xpm" #endif // ---------------------------------------------------------------------------- -// Constants for menu items +// Constants // ---------------------------------------------------------------------------- +// Menu items. enum { Id_MultiSelect = 100, + Id_FlatList, Id_Checkboxes_Start, Id_NoCheckboxes = Id_Checkboxes_Start, @@ -71,6 +73,89 @@ enum Id_Select_HTMLDocs }; +// Tree list columns. +enum +{ + Col_Component, + Col_Files, + Col_Size +}; + +// ---------------------------------------------------------------------------- +// Custom comparator for tree list items comparison +// ---------------------------------------------------------------------------- + +// This is a toy class as in a real program you would have the original numeric +// data somewhere and wouldn't need to parse it back from strings presumably. +// Nevertheless it shows how to implement a custom comparator which is needed +// if you want to sort by a column with non-textual contents. +class MyComparator : public wxTreeListItemComparator +{ +public: + virtual int + Compare(wxTreeListCtrl* treelist, + unsigned column, + wxTreeListItem item1, + wxTreeListItem item2) + { + wxString text1 = treelist->GetItemText(item1, column), + text2 = treelist->GetItemText(item2, column); + + switch ( column ) + { + case Col_Component: + // Simple alphabetical comparison is fine for those. + return text1.CmpNoCase(text2); + + case Col_Files: + // Compare strings as numbers. + return GetNumFilesFromText(text1) - GetNumFilesFromText(text2); + + case Col_Size: + // Compare strings as numbers but also take care of "KiB" and + // "MiB" suffixes. + return GetSizeFromText(text1) - GetSizeFromText(text2); + } + + wxFAIL_MSG( "Sorting on unknown column?" ); + + return 0; + } + +private: + // Return the number of files handling special value "many". Notice that + // the returned value is signed to allow using it in subtraction above. + int GetNumFilesFromText(const wxString& text) const + { + unsigned long n; + if ( !text.ToULong(&n) ) + { + if ( text == "many" ) + n = 9999; + else + n = 0; + } + + return n; + } + + // Return the size in KiB from a string with either KiB or MiB suffix. + int GetSizeFromText(const wxString& text) const + { + wxString size; + unsigned factor = 1; + if ( text.EndsWith(" MiB", &size) ) + factor = 1024; + else if ( !text.EndsWith(" KiB", &size) ) + return 0; + + unsigned long n = 0; + size.ToULong(&n); + + return n*factor; + } +}; + // ---------------------------------------------------------------------------- // Application class // ---------------------------------------------------------------------------- @@ -94,6 +179,7 @@ public: private: // Event handlers for the menu and wxTreeListCtrl events. void OnMultiSelect(wxCommandEvent& event); + void OnFlatList(wxCommandEvent& event); void OnCheckboxes(wxCommandEvent& event); void OnDumpSelection(wxCommandEvent& event); void OnCheckHTMLDocs(wxCommandEvent& event); @@ -138,10 +224,14 @@ private: wxTreeListCtrl* m_treelist; + MyComparator m_comparator; + wxTreeListItem m_itemHTMLDocs; wxLog* m_oldLogTarget; + bool m_isFlat; + wxDECLARE_EVENT_TABLE(); }; @@ -171,6 +261,7 @@ bool MyApp::OnInit() BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(Id_MultiSelect, MyFrame::OnMultiSelect) + EVT_MENU(Id_FlatList, MyFrame::OnFlatList) EVT_MENU_RANGE(Id_Checkboxes_Start, Id_Checkboxes_End, MyFrame::OnCheckboxes) @@ -194,6 +285,8 @@ MyFrame::MyFrame() : wxFrame(NULL, wxID_ANY, "wxWidgets tree/list control sample", wxDefaultPosition, wxSize(600, 450)) { + m_isFlat = false; + // Create menus and status bar. SetIcon(wxICON(sample)); @@ -211,6 +304,8 @@ MyFrame::MyFrame() "&3-state checkboxes\tCtrl-3"); treeStyle->AppendRadioItem(Id_CheckboxesUser3State, "&User-settable 3-state checkboxes\tCtrl-4"); + treeStyle->AppendSeparator(); + treeStyle->AppendCheckItem(Id_FlatList, "&Flat list"); wxMenu* treeOper = new wxMenu; treeOper->Append(Id_DumpSelection, "&Dump selection\tCtrl-D"); @@ -295,24 +390,23 @@ wxTreeListCtrl* MyFrame::CreateTreeListCtrl(long style) style); tree->SetImageList(m_imageList); - enum - { - Col_Component, - Col_Files, - Col_Size - }; - - tree->AppendColumn("Component"); + tree->AppendColumn("Component", + wxCOL_WIDTH_AUTOSIZE, + wxALIGN_LEFT, + wxCOL_RESIZABLE | wxCOL_SORTABLE); tree->AppendColumn("# Files", tree->WidthFor("1,000,000"), - wxALIGN_RIGHT); + wxALIGN_RIGHT, + wxCOL_RESIZABLE | wxCOL_SORTABLE); tree->AppendColumn("Size", tree->WidthFor("1,000,000 KiB"), - wxALIGN_RIGHT); + wxALIGN_RIGHT, + wxCOL_RESIZABLE | wxCOL_SORTABLE); // Define a shortcut to save on typing here. #define ADD_ITEM(item, parent, files, size) \ - wxTreeListItem item = tree->AppendItem(parent, #item, \ + wxTreeListItem item = tree->AppendItem(m_isFlat ? root : parent, \ + #item, \ Icon_FolderClosed, \ Icon_FolderOpened); \ tree->SetItemText(item, Col_Files, files); \ @@ -341,6 +435,9 @@ wxTreeListCtrl* MyFrame::CreateTreeListCtrl(long style) // Remember this one for subsequent tests. m_itemHTMLDocs = HTML; + // Set a custom comparator to compare strings containing numbers correctly. + tree->SetItemComparator(&m_comparator); + return tree; } @@ -367,6 +464,13 @@ void MyFrame::OnMultiSelect(wxCommandEvent& event) RecreateTreeListCtrl(style); } +void MyFrame::OnFlatList(wxCommandEvent& event) +{ + m_isFlat = event.IsChecked(); + + RecreateTreeListCtrl(m_treelist->GetWindowStyle()); +} + void MyFrame::OnCheckboxes(wxCommandEvent& event) { long style = m_treelist->GetWindowStyle(); @@ -499,7 +603,14 @@ const char* MyFrame::CheckedStateString(wxCheckBoxState state) void MyFrame::OnSelectionChanged(wxTreeListEvent& event) { - wxLogMessage("Selection changed to \"%s\"", DumpItem(event.GetItem())); + const char* msg; + + if ( m_treelist->HasFlag(wxTL_MULTIPLE) ) + msg = "Selection of the \"%s\" item changed."; + else + msg = "Selection changed, now is \"%s\"."; + + wxLogMessage(msg, DumpItem(event.GetItem())); } void MyFrame::OnItemExpanding(wxTreeListEvent& event)