X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/add28c55a04eb30080fc2ef9d3c5ddf66eab236a..2e0bceb668d2f3908d96ab9074b6ae293fde1bbb:/samples/treectrl/treetest.cpp diff --git a/samples/treectrl/treetest.cpp b/samples/treectrl/treetest.cpp index d5d4ce6e54..36bb41f431 100644 --- a/samples/treectrl/treetest.cpp +++ b/samples/treectrl/treetest.cpp @@ -39,13 +39,26 @@ #include "treetest.h" +// 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!", \ + "Tree sample error", \ + wxOK | wxICON_EXCLAMATION, \ + this); \ + return; \ + } + BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(TreeTest_Quit, MyFrame::OnQuit) EVT_MENU(TreeTest_About, MyFrame::OnAbout) EVT_MENU(TreeTest_Dump, MyFrame::OnDump) + EVT_MENU(TreeTest_Rename, MyFrame::OnRename) + EVT_MENU(TreeTest_Sort, MyFrame::OnSort) + EVT_MENU(TreeTest_SortRev, MyFrame::OnSortRev) EVT_MENU(TreeTest_Bold, MyFrame::OnSetBold) EVT_MENU(TreeTest_UnBold, MyFrame::OnClearBold) EVT_MENU(TreeTest_Delete, MyFrame::OnDelete) + EVT_MENU(TreeTest_DeleteChildren, MyFrame::OnDeleteChildren) EVT_MENU(TreeTest_DeleteAll, MyFrame::OnDeleteAll) EVT_MENU(TreeTest_Recreate, MyFrame::OnRecreate) END_EVENT_TABLE() @@ -64,12 +77,12 @@ BEGIN_EVENT_TABLE(MyTreeCtrl, wxTreeCtrl) EVT_TREE_ITEM_COLLAPSING(TreeTest_Ctrl, MyTreeCtrl::OnItemCollapsing) EVT_TREE_SEL_CHANGED(TreeTest_Ctrl, MyTreeCtrl::OnSelChanged) EVT_TREE_SEL_CHANGING(TreeTest_Ctrl, MyTreeCtrl::OnSelChanging) - EVT_CHAR(MyTreeCtrl::OnKeyDown) + EVT_TREE_KEY_DOWN(TreeTest_Ctrl, MyTreeCtrl::OnTreeKeyDown) + EVT_TREE_ITEM_ACTIVATED(TreeTest_Ctrl, MyTreeCtrl::OnItemActivated) END_EVENT_TABLE() IMPLEMENT_APP(MyApp) -// `Main program' equivalent, creating windows and returning main app frame bool MyApp::OnInit() { // Create the main frame window @@ -96,25 +109,32 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) SetIcon(wxICON(mondrian)); // Make a menubar - wxMenu *file_menu = new wxMenu; + wxMenu *file_menu = new wxMenu, + *tree_menu = new wxMenu; - file_menu->Append(TreeTest_Dump, "D&ump tree items"); - file_menu->Append(TreeTest_Delete, "&Delete this item"); - file_menu->Append(TreeTest_DeleteAll, "Delete &all items"); - file_menu->Append(TreeTest_Recreate, "&Recreate the tree"); - file_menu->AppendSeparator(); - file_menu->Append(TreeTest_Bold, "Make item &bold"); - file_menu->Append(TreeTest_UnBold, "Make item ¬ bold"); - file_menu->AppendSeparator(); file_menu->Append(TreeTest_About, "&About..."); file_menu->AppendSeparator(); file_menu->Append(TreeTest_Quit, "E&xit"); + tree_menu->Append(TreeTest_Dump, "D&ump tree items"); + tree_menu->Append(TreeTest_Recreate, "&Recreate the tree"); + tree_menu->AppendSeparator(); + 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_Sort, "Sort children of current item"); + tree_menu->Append(TreeTest_SortRev, "Sort in reversed order"); + tree_menu->Append(TreeTest_Rename, "Rename item..."); + tree_menu->AppendSeparator(); + tree_menu->Append(TreeTest_Bold, "Make item &bold"); + tree_menu->Append(TreeTest_UnBold, "Make item ¬ bold"); + wxMenuBar *menu_bar = new wxMenuBar; menu_bar->Append(file_menu, "&File"); + menu_bar->Append(tree_menu, "&Tree"); SetMenuBar(menu_bar); - // Make a panel with a message m_treeCtrl = new MyTreeCtrl(this, TreeTest_Ctrl, wxDefaultPosition, wxDefaultSize, wxTR_HAS_BUTTONS | wxSUNKEN_BORDER); @@ -141,9 +161,15 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) CreateStatusBar(3); SetStatusText("", 0); +#ifdef __WXMOTIF__ + // For some reason, we get a memcpy crash in wxLogStream::DoLogStream + // on gcc/wxMotif, if we use wxLogTextCtl. Maybe it's just gcc? + delete wxLog::SetActiveTarget(new wxLogStderr); +#else // set our text control as the log target wxLogTextCtrl *logWindow = new wxLogTextCtrl(textCtrl); delete wxLog::SetActiveTarget(logWindow); +#endif } MyFrame::~MyFrame() @@ -158,31 +184,73 @@ void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) { - wxMessageDialog dialog(this, - "Tree test sample\n" - "Julian Smart (c) 1997", - "About tree test", wxOK); + wxMessageBox("Tree test sample\n" + "Julian Smart (c) 1997,\n" + "Vadim Zeitlin (c) 1998", + "About tree test", + wxOK | wxICON_INFORMATION, this); +} + +void MyFrame::OnRename(wxCommandEvent& WXUNUSED(event)) +{ + wxTreeItemId item = m_treeCtrl->GetSelection(); + + CHECK_ITEM( item ); - dialog.ShowModal(); + static wxString s_text; + s_text = wxGetTextFromUser("New name: ", "Tree sample question", + s_text, this); + if ( !s_text.IsEmpty() ) + { + m_treeCtrl->SetItemText(item, s_text); + } +} + +void MyFrame::DoSort(bool reverse) +{ + wxTreeItemId item = m_treeCtrl->GetSelection(); + + CHECK_ITEM( item ); + + m_treeCtrl->DoSortChildren(item, reverse); } void MyFrame::OnDump(wxCommandEvent& WXUNUSED(event)) { wxTreeItemId root = m_treeCtrl->GetSelection(); + + CHECK_ITEM( root ); + m_treeCtrl->GetItemsRecursively(root, -1); } void MyFrame::DoSetBold(bool bold) { - m_treeCtrl->SetItemBold(m_treeCtrl->GetSelection(), bold); + wxTreeItemId item = m_treeCtrl->GetSelection(); + + CHECK_ITEM( item ); + + m_treeCtrl->SetItemBold(item, bold); } void MyFrame::OnDelete(wxCommandEvent& WXUNUSED(event)) { wxTreeItemId item = m_treeCtrl->GetSelection(); + + CHECK_ITEM( item ); + m_treeCtrl->Delete(item); } +void MyFrame::OnDeleteChildren(wxCommandEvent& WXUNUSED(event)) +{ + wxTreeItemId item = m_treeCtrl->GetSelection(); + + CHECK_ITEM( item ); + + m_treeCtrl->DeleteChildren(item); +} + void MyFrame::OnDeleteAll(wxCommandEvent& WXUNUSED(event)) { m_treeCtrl->DeleteAllItems(); @@ -195,17 +263,28 @@ void MyFrame::OnRecreate(wxCommandEvent& event) } // MyTreeCtrl implementation +IMPLEMENT_DYNAMIC_CLASS(MyTreeCtrl, wxTreeCtrl) + MyTreeCtrl::MyTreeCtrl(wxWindow *parent, const wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : wxTreeCtrl(parent, id, pos, size, style) { + m_reverseSort = FALSE; + // Make an image list containing small icons m_imageListNormal = new wxImageList(16, 16, TRUE); // should correspond to TreeCtrlIcon_xxx enum - m_imageListNormal->Add(wxICON(icon2)); +#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 + m_imageListNormal->Add(wxBitmap("bitmap1", wxBITMAP_TYPE_BMP_RESOURCE)); + m_imageListNormal->Add(wxBitmap("bitmap2", wxBITMAP_TYPE_BMP_RESOURCE)); +#else m_imageListNormal->Add(wxICON(icon1)); + m_imageListNormal->Add(wxICON(icon2)); +#endif SetImageList(m_imageListNormal); @@ -218,6 +297,20 @@ MyTreeCtrl::~MyTreeCtrl() delete m_imageListNormal; } +int MyTreeCtrl::OnCompareItems(const wxTreeItemId& item1, + const wxTreeItemId& item2) +{ + if ( m_reverseSort ) + { + // just exchange 1st and 2nd items + return wxTreeCtrl::OnCompareItems(item2, item1); + } + else + { + return wxTreeCtrl::OnCompareItems(item1, item2); + } +} + void MyTreeCtrl::AddItemsRecursively(const wxTreeItemId& idParent, size_t numChildren, size_t depth, @@ -311,7 +404,12 @@ void MyTreeCtrl::OnItemCollapsing(wxTreeEvent& event) } } -void MyTreeCtrl::OnKeyDown(wxTreeEvent& WXUNUSED(event)) +void MyTreeCtrl::OnTreeKeyDown(wxTreeEvent&WXUNUSED(event)) +{ + wxLogMessage("OnTreeKeyDown"); +} + +void MyTreeCtrl::OnItemActivated(wxTreeEvent&WXUNUSED(event)) { // show some info about this item wxTreeItemId itemId = GetSelection(); @@ -322,7 +420,7 @@ void MyTreeCtrl::OnKeyDown(wxTreeEvent& WXUNUSED(event)) item->ShowInfo(this); } - wxLogMessage("OnKeyDown"); + wxLogMessage("OnItemActivated"); } static inline const char *Bool2String(bool b)