X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cf724bceea97553bef690f52062ffbc336d0f7a9..0dfef5a8124ac0f1bb2aed6ef5ddfa833e8e2c6e:/samples/treectrl/treetest.cpp diff --git a/samples/treectrl/treetest.cpp b/samples/treectrl/treetest.cpp index 2fe8fe49fd..2bd8bfa646 100644 --- a/samples/treectrl/treetest.cpp +++ b/samples/treectrl/treetest.cpp @@ -25,22 +25,34 @@ #include "wx/wx.h" #endif -// under Windows the icons are in the .rc file -#ifndef __WXMSW__ - #include "icon1.xpm" - #include "icon2.xpm" - #include "mondrian.xpm" -#endif - #include "wx/log.h" +#include "wx/image.h" #include "wx/imaglist.h" #include "wx/treectrl.h" #include "math.h" +#ifdef __WXMSW__ + // comment out this line to test multiple selection even under MSW (where + // it looks ugly - but works) + #define NO_MULTIPLE_SELECTION +#endif + +#define NO_VARIABLE_HEIGHT + #include "treetest.h" +// under Windows the icons are in the .rc file +#ifndef __WXMSW__ + #include "icon1.xpm" + #include "icon2.xpm" + #include "icon3.xpm" + #include "icon4.xpm" + #include "icon5.xpm" + #include "mondrian.xpm" +#endif + // verify that the item is ok and insult the user if it is not #define CHECK_ITEM( item ) if ( !item.IsOk() ) { \ wxMessageBox("Please select some item first!", \ @@ -54,7 +66,14 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(TreeTest_Quit, MyFrame::OnQuit) EVT_MENU(TreeTest_About, MyFrame::OnAbout) EVT_MENU(TreeTest_Dump, MyFrame::OnDump) +#ifndef NO_MULTIPLE_SELECTION + EVT_MENU(TreeTest_DumpSelected, MyFrame::OnDumpSelected) + EVT_MENU(TreeTest_Select, MyFrame::OnSelect) + EVT_MENU(TreeTest_Unselect, MyFrame::OnUnselect) +#endif // NO_MULTIPLE_SELECTION EVT_MENU(TreeTest_Rename, MyFrame::OnRename) + EVT_MENU(TreeTest_Count, MyFrame::OnCount) + EVT_MENU(TreeTest_CountRec, MyFrame::OnCountRec) EVT_MENU(TreeTest_Sort, MyFrame::OnSort) EVT_MENU(TreeTest_SortRev, MyFrame::OnSortRev) EVT_MENU(TreeTest_Bold, MyFrame::OnSetBold) @@ -66,10 +85,12 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(TreeTest_CollapseAndReset, MyFrame::OnCollapseAndReset) EVT_MENU(TreeTest_EnsureVisible, MyFrame::OnEnsureVisible) EVT_MENU(TreeTest_AddItem, MyFrame::OnAddItem) + EVT_MENU(TreeTest_InsertItem, MyFrame::OnInsertItem) EVT_MENU(TreeTest_IncIndent, MyFrame::OnIncIndent) EVT_MENU(TreeTest_DecIndent, MyFrame::OnDecIndent) EVT_MENU(TreeTest_IncSpacing, MyFrame::OnIncSpacing) EVT_MENU(TreeTest_DecSpacing, MyFrame::OnDecSpacing) + EVT_MENU(TreeTest_ToggleIcon, MyFrame::OnToggleIcon) END_EVENT_TABLE() BEGIN_EVENT_TABLE(MyTreeCtrl, wxTreeCtrl) @@ -78,7 +99,9 @@ BEGIN_EVENT_TABLE(MyTreeCtrl, wxTreeCtrl) EVT_TREE_BEGIN_LABEL_EDIT(TreeTest_Ctrl, MyTreeCtrl::OnBeginLabelEdit) EVT_TREE_END_LABEL_EDIT(TreeTest_Ctrl, MyTreeCtrl::OnEndLabelEdit) EVT_TREE_DELETE_ITEM(TreeTest_Ctrl, MyTreeCtrl::OnDeleteItem) +#if 0 // there are so many of those that logging them causes flicker EVT_TREE_GET_INFO(TreeTest_Ctrl, MyTreeCtrl::OnGetInfo) +#endif EVT_TREE_SET_INFO(TreeTest_Ctrl, MyTreeCtrl::OnSetInfo) EVT_TREE_ITEM_EXPANDED(TreeTest_Ctrl, MyTreeCtrl::OnItemExpanded) EVT_TREE_ITEM_EXPANDING(TreeTest_Ctrl, MyTreeCtrl::OnItemExpanding) @@ -131,10 +154,14 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) tree_menu->Append(TreeTest_CollapseAndReset, "C&ollapse and reset"); tree_menu->AppendSeparator(); tree_menu->Append(TreeTest_AddItem, "Append a &new item"); + tree_menu->Append(TreeTest_InsertItem, "&Insert a new item"); tree_menu->Append(TreeTest_Delete, "&Delete this item"); tree_menu->Append(TreeTest_DeleteChildren, "Delete &children"); tree_menu->Append(TreeTest_DeleteAll, "Delete &all items"); tree_menu->AppendSeparator(); + tree_menu->Append(TreeTest_Count, "Count children of current item"); + tree_menu->Append(TreeTest_CountRec, "Recursively count children of current item"); + tree_menu->AppendSeparator(); tree_menu->Append(TreeTest_Sort, "Sort children of current item"); tree_menu->Append(TreeTest_SortRev, "Sort in reversed order"); tree_menu->AppendSeparator(); @@ -147,11 +174,20 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) tree_menu->Append(TreeTest_DecSpacing, "Reduce spacing by 5 points\tCtrl-R"); item_menu->Append(TreeTest_Dump, "&Dump item children"); - item_menu->AppendSeparator(); item_menu->Append(TreeTest_Rename, "&Rename item..."); + item_menu->AppendSeparator(); item_menu->Append(TreeTest_Bold, "Make item &bold"); item_menu->Append(TreeTest_UnBold, "Make item ¬ bold"); + item_menu->AppendSeparator(); + item_menu->Append(TreeTest_ToggleIcon, "Toggle the items &icon"); + +#ifndef NO_MULTIPLE_SELECTION + item_menu->AppendSeparator(); + item_menu->Append(TreeTest_DumpSelected, "Dump selected items\tAlt-D"); + item_menu->Append(TreeTest_Select, "Select current item\tAlt-S"); + item_menu->Append(TreeTest_Unselect, "Unselect everything\tAlt-U"); +#endif wxMenuBar *menu_bar = new wxMenuBar; menu_bar->Append(file_menu, "&File"); @@ -161,7 +197,18 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) m_treeCtrl = new MyTreeCtrl(this, TreeTest_Ctrl, wxDefaultPosition, wxDefaultSize, - wxTR_HAS_BUTTONS | wxSUNKEN_BORDER); + wxTR_HAS_BUTTONS | + wxTR_EDIT_LABELS | +#ifndef NO_MULTIPLE_SELECTION + wxTR_MULTIPLE | +#endif +#ifndef NO_VARIABLE_HEIGHT + wxTR_HAS_VARIABLE_ROW_HEIGHT | +#endif + wxSUNKEN_BORDER); + + m_treeCtrl->SetBackgroundColour(wxColour(204, 205, 79)); + wxTextCtrl *textCtrl = new wxTextCtrl(this, -1, "", wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxSUNKEN_BORDER); @@ -209,8 +256,7 @@ void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) { wxMessageBox("Tree test sample\n" - "Julian Smart (c) 1997,\n" - "Vadim Zeitlin (c) 1998", + "(c) Julian Smart 1997, Vadim Zeitlin 1998", "About tree test", wxOK | wxICON_INFORMATION, this); } @@ -221,6 +267,8 @@ void MyFrame::OnRename(wxCommandEvent& WXUNUSED(event)) CHECK_ITEM( item ); + // old code - now we edit in place +#if 0 static wxString s_text; s_text = wxGetTextFromUser("New name: ", "Tree sample question", s_text, this); @@ -228,6 +276,32 @@ void MyFrame::OnRename(wxCommandEvent& WXUNUSED(event)) { m_treeCtrl->SetItemText(item, s_text); } +#endif // 0 + + // TODO demonstrate creating a custom edit control... + (void)m_treeCtrl->EditLabel(item); +} + +void MyFrame::OnCount(wxCommandEvent& WXUNUSED(event)) +{ + wxTreeItemId item = m_treeCtrl->GetSelection(); + + CHECK_ITEM( item ); + + int i = m_treeCtrl->GetChildrenCount( item, FALSE ); + + wxLogMessage(wxT("%d children"), i); +} + +void MyFrame::OnCountRec(wxCommandEvent& WXUNUSED(event)) +{ + wxTreeItemId item = m_treeCtrl->GetSelection(); + + CHECK_ITEM( item ); + + int i = m_treeCtrl->GetChildrenCount( item ); + + wxLogMessage(wxT("%d children"), i); } void MyFrame::DoSort(bool reverse) @@ -248,6 +322,33 @@ void MyFrame::OnDump(wxCommandEvent& WXUNUSED(event)) m_treeCtrl->GetItemsRecursively(root, -1); } +#ifndef NO_MULTIPLE_SELECTION + +void MyFrame::OnDumpSelected(wxCommandEvent& WXUNUSED(event)) +{ + wxArrayTreeItemIds array; + + size_t count = m_treeCtrl->GetSelections(array); + wxLogMessage(wxT("%u items selected"), count); + + for ( size_t n = 0; n < count; n++ ) + { + wxLogMessage("\t%s", m_treeCtrl->GetItemText(array.Item(n)).c_str()); + } +} + +void MyFrame::OnSelect(wxCommandEvent& event) +{ + m_treeCtrl->SelectItem(m_treeCtrl->GetSelection()); +} + +void MyFrame::OnUnselect(wxCommandEvent& event) +{ + m_treeCtrl->UnselectAll(); +} + +#endif // NO_MULTIPLE_SELECTION + void MyFrame::DoSetBold(bool bold) { wxTreeItemId item = m_treeCtrl->GetSelection(); @@ -296,6 +397,11 @@ void MyFrame::OnEnsureVisible(wxCommandEvent& event) m_treeCtrl->DoEnsureVisible(); } +void MyFrame::OnInsertItem(wxCommandEvent& WXUNUSED(event)) +{ + m_treeCtrl->InsertItem(m_treeCtrl->GetRootItem(), 1, "2nd item"); +} + void MyFrame::OnAddItem(wxCommandEvent& WXUNUSED(event)) { static int s_num = 0; @@ -304,8 +410,8 @@ void MyFrame::OnAddItem(wxCommandEvent& WXUNUSED(event)) text.Printf("Item #%d", ++s_num); m_treeCtrl->AppendItem(m_treeCtrl->GetRootItem(), - text, - MyTreeCtrl::TreeCtrlIcon_File); + text /*, + MyTreeCtrl::TreeCtrlIcon_File */ ); } void MyFrame::OnIncIndent(wxCommandEvent& WXUNUSED(event)) @@ -336,6 +442,15 @@ void MyFrame::OnDecSpacing(wxCommandEvent& WXUNUSED(event)) m_treeCtrl->SetSpacing( indent-5 ); } +void MyFrame::OnToggleIcon(wxCommandEvent& WXUNUSED(event)) +{ + wxTreeItemId item = m_treeCtrl->GetSelection(); + + CHECK_ITEM( item ); + + m_treeCtrl->DoToggleIcon(item); +} + // MyTreeCtrl implementation IMPLEMENT_DYNAMIC_CLASS(MyTreeCtrl, wxTreeCtrl) @@ -344,6 +459,15 @@ MyTreeCtrl::MyTreeCtrl(wxWindow *parent, const wxWindowID id, long style) : wxTreeCtrl(parent, id, pos, size, style) { +#ifndef NO_VARIABLE_HEIGHT +#if wxUSE_LIBJPEG + wxImage::AddHandler(new wxJPEGHandler); + wxImage image; + + image.LoadFile(wxString("horse.jpg"), wxBITMAP_TYPE_JPEG ); +#endif +#endif + m_reverseSort = FALSE; // Make an image list containing small icons @@ -353,11 +477,25 @@ MyTreeCtrl::MyTreeCtrl(wxWindow *parent, const wxWindowID id, #if defined(__WXMSW__) && defined(__WIN16__) // This is required in 16-bit Windows mode only because we can't load a specific (16x16) // icon image, so it comes out stretched +# ifndef NO_VARIABLE_HEIGHT + m_imageListNormal->Add(image.ConvertToBitmap()); +# else m_imageListNormal->Add(wxBitmap("bitmap1", wxBITMAP_TYPE_BMP_RESOURCE)); +# endif m_imageListNormal->Add(wxBitmap("bitmap2", wxBITMAP_TYPE_BMP_RESOURCE)); + m_imageListNormal->Add(wxBitmap("bitmap3", wxBITMAP_TYPE_BMP_RESOURCE)); + m_imageListNormal->Add(wxBitmap("bitmap4", wxBITMAP_TYPE_BMP_RESOURCE)); + m_imageListNormal->Add(wxBitmap("bitmap5", wxBITMAP_TYPE_BMP_RESOURCE)); #else +# ifndef NO_VARIABLE_HEIGHT + m_imageListNormal->Add(image.ConvertToBitmap()); +# else m_imageListNormal->Add(wxICON(icon1)); +# endif m_imageListNormal->Add(wxICON(icon2)); + m_imageListNormal->Add(wxICON(icon3)); + m_imageListNormal->Add(wxICON(icon4)); + m_imageListNormal->Add(wxICON(icon5)); #endif SetImageList(m_imageListNormal); @@ -392,21 +530,32 @@ void MyTreeCtrl::AddItemsRecursively(const wxTreeItemId& idParent, { if ( depth > 0 ) { + bool hasChildren = depth > 1; + wxString str; for ( size_t n = 0; n < numChildren; n++ ) { // at depth 1 elements won't have any more children - if (depth == 1) - str.Printf("%s child %d.%d", "File", folder, n + 1); - else + if ( hasChildren ) str.Printf("%s child %d", "Folder", n + 1); + else + str.Printf("%s child %d.%d", "File", folder, n + 1); + // here we pass to AppendItem() normal and selected item images (we + // suppose that selected image follows the normal one in the enum) int image = depth == 1 ? TreeCtrlIcon_File : TreeCtrlIcon_Folder; - wxTreeItemId id = AppendItem(idParent, str, image, image, + wxTreeItemId id = AppendItem(idParent, str, image, image + 1, new MyTreeItemData(str)); + // and now we also set the expanded one (only for the folders) + if ( hasChildren ) + { + SetItemImage(id, TreeCtrlIcon_FolderOpened, + wxTreeItemIcon_Expanded); + } + // remember the last child for OnEnsureVisible() - if ( depth == 1 && n == numChildren - 1 ) + if ( !hasChildren && n == numChildren - 1 ) { m_lastItem = id; } @@ -423,8 +572,21 @@ void MyTreeCtrl::AddTestItemsToTree(size_t numChildren, wxTreeItemId rootId = AddRoot("Root", TreeCtrlIcon_Folder, TreeCtrlIcon_Folder, new MyTreeItemData("Root item")); + SetItemImage(rootId, TreeCtrlIcon_FolderOpened, wxTreeItemIcon_Expanded); AddItemsRecursively(rootId, numChildren, depth, 0); + + // set some colours/fonts for testing + SetItemFont(rootId, *wxITALIC_FONT); + + long cookie; + wxTreeItemId id = GetFirstChild(rootId, cookie); + SetItemTextColour(id, *wxBLUE); + + id = GetNextChild(rootId, cookie); + id = GetNextChild(rootId, cookie); + SetItemTextColour(id, *wxRED); + SetItemBackgroundColour(id, *wxLIGHT_GREY); } void MyTreeCtrl::GetItemsRecursively(const wxTreeItemId& idParent, long cookie) @@ -439,7 +601,7 @@ void MyTreeCtrl::GetItemsRecursively(const wxTreeItemId& idParent, long cookie) if(id <= 0) return; - wxString text=GetItemText(id); + wxString text = GetItemText(id); wxLogMessage(text); if (ItemHasChildren(id)) @@ -448,6 +610,14 @@ void MyTreeCtrl::GetItemsRecursively(const wxTreeItemId& idParent, long cookie) GetItemsRecursively(idParent, cookie); } +void MyTreeCtrl::DoToggleIcon(const wxTreeItemId& item) +{ + int image = GetItemImage(item) == TreeCtrlIcon_Folder ? TreeCtrlIcon_File + : TreeCtrlIcon_Folder; + + SetItemImage(item, image); +} + // avoid repetition #define TREE_EVENT_HANDLER(name) \ @@ -458,8 +628,6 @@ void MyTreeCtrl::name(wxTreeEvent& WXUNUSED(event)) \ TREE_EVENT_HANDLER(OnBeginDrag) TREE_EVENT_HANDLER(OnBeginRDrag) -TREE_EVENT_HANDLER(OnBeginLabelEdit) -TREE_EVENT_HANDLER(OnEndLabelEdit) TREE_EVENT_HANDLER(OnDeleteItem) TREE_EVENT_HANDLER(OnGetInfo) TREE_EVENT_HANDLER(OnSetInfo) @@ -471,13 +639,40 @@ TREE_EVENT_HANDLER(OnSelChanging) #undef TREE_EVENT_HANDLER +void MyTreeCtrl::OnBeginLabelEdit(wxTreeEvent& event) +{ + wxLogMessage("OnBeginLabelEdit"); + + // for testing, prevent this items label editing + wxTreeItemId itemId = event.GetItem(); + if ( IsTestItem(itemId) ) + { + wxMessageBox("You can't edit this item."); + + event.Veto(); + } +} + +void MyTreeCtrl::OnEndLabelEdit(wxTreeEvent& event) +{ + wxLogMessage("OnEndLabelEdit"); + + // don't allow anything except letters in the labels + if ( !event.GetLabel().IsWord() ) + { + wxMessageBox("The label should contain only letters."); + + event.Veto(); + } +} + void MyTreeCtrl::OnItemCollapsing(wxTreeEvent& event) { wxLogMessage("OnItemCollapsing"); // for testing, prevent the user from collapsing the first child folder wxTreeItemId itemId = event.GetItem(); - if ( GetParent(itemId) == GetRootItem() && !GetPrevSibling(itemId) ) + if ( IsTestItem(itemId) ) { wxMessageBox("You can't collapse this item.");