// 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,
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
// ----------------------------------------------------------------------------
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);
wxTreeListCtrl* m_treelist;
+ MyComparator m_comparator;
+
wxTreeListItem m_itemHTMLDocs;
wxLog* m_oldLogTarget;
+ bool m_isFlat;
+
wxDECLARE_EVENT_TABLE();
};
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)
: wxFrame(NULL, wxID_ANY, "wxWidgets tree/list control sample",
wxDefaultPosition, wxSize(600, 450))
{
+ m_isFlat = false;
+
// Create menus and status bar.
SetIcon(wxICON(sample));
"&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");
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); \
// 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;
}
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();
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)