X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dacaa6f142afa4cc4e56457b8fc776d502852ab8..61c006ec8254e5c24b45ade543fea419d63a66ba:/samples/treectrl/treetest.cpp diff --git a/samples/treectrl/treetest.cpp b/samples/treectrl/treetest.cpp index 13ba5b3b37..1028d79f66 100644 --- a/samples/treectrl/treetest.cpp +++ b/samples/treectrl/treetest.cpp @@ -9,30 +9,25 @@ // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ - #pragma implementation - #pragma interface -#endif - // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ - #pragma hdrstop + #pragma hdrstop #endif #ifndef WX_PRECOMP - #include "wx/wx.h" - #include "wx/log.h" + #include "wx/wx.h" + #include "wx/log.h" #endif #include "wx/colordlg.h" +#include "wx/numdlg.h" #include "wx/image.h" #include "wx/imaglist.h" #include "wx/treectrl.h" - -#include "math.h" +#include "wx/math.h" #ifdef __WIN32__ // this is not supported by native control @@ -47,11 +42,10 @@ #include "icon4.xpm" #include "icon5.xpm" -#if defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXMGL__) -#include "mondrian.xpm" +#ifndef __WXMSW__ + #include "../sample.xpm" #endif - // verify that the item is ok and insult the user if it is not #define CHECK_ITEM( item ) if ( !item.IsOk() ) { \ wxMessageBox(wxT("Please select some item first!"), \ @@ -112,6 +106,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) MENU_LINK(IncSpacing) MENU_LINK(DecSpacing) MENU_LINK(ToggleIcon) + MENU_LINK(SelectRoot) #undef MENU_LINK END_EVENT_TABLE() @@ -135,13 +130,22 @@ BEGIN_EVENT_TABLE(MyTreeCtrl, wxTreeCtrl) EVT_TREE_ITEM_EXPANDING(TreeTest_Ctrl, MyTreeCtrl::OnItemExpanding) EVT_TREE_ITEM_COLLAPSED(TreeTest_Ctrl, MyTreeCtrl::OnItemCollapsed) EVT_TREE_ITEM_COLLAPSING(TreeTest_Ctrl, MyTreeCtrl::OnItemCollapsing) - //EVT_TREE_ITEM_RIGHT_CLICK(TreeTest_Ctrl, MyTreeCtrl::OnItemRightClick) - EVT_CONTEXT_MENU(MyTreeCtrl::OnContextMenu) EVT_TREE_SEL_CHANGED(TreeTest_Ctrl, MyTreeCtrl::OnSelChanged) EVT_TREE_SEL_CHANGING(TreeTest_Ctrl, MyTreeCtrl::OnSelChanging) EVT_TREE_KEY_DOWN(TreeTest_Ctrl, MyTreeCtrl::OnTreeKeyDown) EVT_TREE_ITEM_ACTIVATED(TreeTest_Ctrl, MyTreeCtrl::OnItemActivated) + + // so many differents ways to handle right mouse button clicks... + EVT_CONTEXT_MENU(MyTreeCtrl::OnContextMenu) + // EVT_TREE_ITEM_MENU is the preferred event for creating context menus + // on a tree control, because it includes the point of the click or item, + // meaning that no additional placement calculations are required. + EVT_TREE_ITEM_MENU(TreeTest_Ctrl, MyTreeCtrl::OnItemMenu) + EVT_TREE_ITEM_RIGHT_CLICK(TreeTest_Ctrl, MyTreeCtrl::OnItemRClick) + + EVT_RIGHT_DOWN(MyTreeCtrl::OnRMouseDown) + EVT_RIGHT_UP(MyTreeCtrl::OnRMouseUp) EVT_RIGHT_DCLICK(MyTreeCtrl::OnRMouseDClick) END_EVENT_TABLE() @@ -153,17 +157,20 @@ bool MyApp::OnInit() MyFrame *frame = new MyFrame(wxT("wxTreeCtrl Test"), 50, 50, 450, 600); // Show the frame - frame->Show(TRUE); + frame->Show(true); SetTopWindow(frame); - return TRUE; + return true; } // My frame constructor MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) - : wxFrame((wxFrame *)NULL, -1, title, wxPoint(x, y), wxSize(w, h)), - m_treeCtrl(NULL), m_textCtrl(NULL) + : wxFrame((wxFrame *)NULL, wxID_ANY, title, wxPoint(x, y), wxSize(w, h)), + m_treeCtrl(NULL) +#if wxUSE_LOG + , m_textCtrl(NULL) +#endif // wxUSE_LOG { // This reduces flicker effects - even better would be to define // OnEraseBackground to do nothing. When the tree control's scrollbars are @@ -171,7 +178,7 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) SetBackgroundColour(wxColour(255, 255, 255)); // Give it an icon - SetIcon(wxICON(mondrian)); + SetIcon(wxICON(sample)); #if wxUSE_MENUS // Make a menubar @@ -184,20 +191,20 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) file_menu->AppendSeparator(); file_menu->Append(TreeTest_Quit, wxT("E&xit\tAlt-X")); - style_menu->Append(TreeTest_TogButtons, wxT("Toggle &normal buttons"), wxT(""), TRUE); - style_menu->Append(TreeTest_TogTwist, wxT("Toggle &twister buttons"), wxT(""), TRUE); - style_menu->Append(TreeTest_ToggleButtons, wxT("Toggle image &buttons"), wxT(""), TRUE); + style_menu->AppendCheckItem(TreeTest_TogButtons, wxT("Toggle &normal buttons")); + style_menu->AppendCheckItem(TreeTest_TogTwist, wxT("Toggle &twister buttons")); + style_menu->AppendCheckItem(TreeTest_ToggleButtons, wxT("Toggle image &buttons")); style_menu->AppendSeparator(); - style_menu->Append(TreeTest_TogLines, wxT("Toggle &connecting lines"), wxT(""), TRUE); - style_menu->Append(TreeTest_TogRootLines, wxT("Toggle &lines at root"), wxT(""), TRUE); - style_menu->Append(TreeTest_TogHideRoot, wxT("Toggle &hidden root"), wxT(""), TRUE); - style_menu->Append(TreeTest_TogBorder, wxT("Toggle &item border"), wxT(""), TRUE); - style_menu->Append(TreeTest_TogFullHighlight, wxT("Toggle &full row highlight"), wxT(""), TRUE); - style_menu->Append(TreeTest_TogEdit, wxT("Toggle &edit mode"), wxT(""), TRUE); + style_menu->AppendCheckItem(TreeTest_TogLines, wxT("Toggle &connecting lines")); + style_menu->AppendCheckItem(TreeTest_TogRootLines, wxT("Toggle &lines at root")); + style_menu->AppendCheckItem(TreeTest_TogHideRoot, wxT("Toggle &hidden root")); + style_menu->AppendCheckItem(TreeTest_TogBorder, wxT("Toggle &item border")); + style_menu->AppendCheckItem(TreeTest_TogFullHighlight, wxT("Toggle &full row highlight")); + style_menu->AppendCheckItem(TreeTest_TogEdit, wxT("Toggle &edit mode")); #ifndef NO_MULTIPLE_SELECTION - style_menu->Append(TreeTest_ToggleSel, wxT("Toggle &selection mode"), wxT(""), TRUE); + style_menu->AppendCheckItem(TreeTest_ToggleSel, wxT("Toggle &selection mode")); #endif // NO_MULTIPLE_SELECTION - style_menu->Append(TreeTest_ToggleImages, wxT("Toggle show ima&ges"), wxT(""), TRUE); + style_menu->AppendCheckItem(TreeTest_ToggleImages, wxT("Toggle show ima&ges")); style_menu->Append(TreeTest_SetImageSize, wxT("Set image si&ze...")); style_menu->AppendSeparator(); style_menu->Append(TreeTest_SetFgColour, wxT("Set &foreground colour...")); @@ -213,6 +220,7 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) tree_menu->Append(TreeTest_Delete, wxT("&Delete this item")); tree_menu->Append(TreeTest_DeleteChildren, wxT("Delete &children")); tree_menu->Append(TreeTest_DeleteAll, wxT("Delete &all items")); + tree_menu->Append(TreeTest_SelectRoot, wxT("Select root item")); tree_menu->AppendSeparator(); tree_menu->Append(TreeTest_Count, wxT("Count children of current item")); tree_menu->Append(TreeTest_CountRec, wxT("Recursively count children of current item")); @@ -252,20 +260,25 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) SetMenuBar(menu_bar); #endif // wxUSE_MENUS + m_panel = new wxPanel(this); + +#if wxUSE_LOG // create the controls - m_textCtrl = new wxTextCtrl(this, -1, wxT(""), + m_textCtrl = new wxTextCtrl(m_panel, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxSUNKEN_BORDER); +#endif // wxUSE_LOG CreateTreeWithDefStyle(); - menu_bar->Check(TreeTest_ToggleImages, TRUE); + menu_bar->Check(TreeTest_ToggleImages, true); #if wxUSE_STATUSBAR // create a status bar CreateStatusBar(2); #endif // wxUSE_STATUSBAR +#if wxUSE_LOG #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? @@ -275,11 +288,14 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) wxLogTextCtrl *logWindow = new wxLogTextCtrl(m_textCtrl); delete wxLog::SetActiveTarget(logWindow); #endif +#endif // wxUSE_LOG } MyFrame::~MyFrame() { +#if wxUSE_LOG delete wxLog::SetActiveTarget(NULL); +#endif // wxUSE_LOG } void MyFrame::CreateTreeWithDefStyle() @@ -307,7 +323,7 @@ void MyFrame::CreateTreeWithDefStyle() void MyFrame::CreateTree(long style) { - m_treeCtrl = new MyTreeCtrl(this, TreeTest_Ctrl, + m_treeCtrl = new MyTreeCtrl(m_panel, TreeTest_Ctrl, wxDefaultPosition, wxDefaultSize, style); Resize(); @@ -351,7 +367,11 @@ void MyFrame::OnIdle(wxIdleEvent& event) void MyFrame::OnSize(wxSizeEvent& event) { - if ( m_treeCtrl && m_textCtrl ) + if ( m_treeCtrl +#if wxUSE_LOG + && m_textCtrl +#endif // wxUSE_LOG + ) { Resize(); } @@ -362,13 +382,18 @@ void MyFrame::OnSize(wxSizeEvent& event) void MyFrame::Resize() { wxSize size = GetClientSize(); - m_treeCtrl->SetSize(0, 0, size.x, 2*size.y/3); + m_treeCtrl->SetSize(0, 0, size.x, size.y +#if !wxUSE_LOG + ); +#else + *2/3); m_textCtrl->SetSize(0, 2*size.y/3, size.x, size.y/3); +#endif } void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) { - Close(TRUE); + Close(true); } void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) @@ -390,7 +415,7 @@ void MyFrame::OnRename(wxCommandEvent& WXUNUSED(event)) static wxString s_text; s_text = wxGetTextFromUser(wxT("New name: "), wxT("Tree sample question"), s_text, this); - if ( !s_text.IsEmpty() ) + if ( !s_text.empty() ) { m_treeCtrl->SetItemText(item, s_text); } @@ -406,7 +431,7 @@ void MyFrame::OnCount(wxCommandEvent& WXUNUSED(event)) CHECK_ITEM( item ); - int i = m_treeCtrl->GetChildrenCount( item, FALSE ); + int i = m_treeCtrl->GetChildrenCount( item, false ); wxLogMessage(wxT("%d children"), i); } @@ -452,7 +477,7 @@ void MyFrame::OnDumpSelected(wxCommandEvent& WXUNUSED(event)) wxArrayTreeItemIds array; size_t count = m_treeCtrl->GetSelections(array); - wxLogMessage(wxT("%u items selected"), count); + wxLogMessage(wxT("%u items selected"), unsigned(count)); for ( size_t n = 0; n < count; n++ ) { @@ -465,6 +490,11 @@ void MyFrame::OnSelect(wxCommandEvent& WXUNUSED(event)) m_treeCtrl->SelectItem(m_treeCtrl->GetSelection()); } +void MyFrame::OnSelectRoot(wxCommandEvent& WXUNUSED(event)) +{ + m_treeCtrl->SelectItem(m_treeCtrl->GetRootItem()); +} + void MyFrame::OnUnselect(wxCommandEvent& WXUNUSED(event)) { m_treeCtrl->UnselectAll(); @@ -520,7 +550,7 @@ void MyFrame::OnSetImageSize(wxCommandEvent& WXUNUSED(event)) return; m_treeCtrl->CreateImageList(size); - wxGetApp().SetShowImages(TRUE); + wxGetApp().SetShowImages(true); } void MyFrame::OnToggleImages(wxCommandEvent& WXUNUSED(event)) @@ -528,12 +558,12 @@ void MyFrame::OnToggleImages(wxCommandEvent& WXUNUSED(event)) if ( wxGetApp().ShowImages() ) { m_treeCtrl->CreateImageList(-1); - wxGetApp().SetShowImages(FALSE); + wxGetApp().SetShowImages(false); } else { m_treeCtrl->CreateImageList(0); - wxGetApp().SetShowImages(TRUE); + wxGetApp().SetShowImages(true); } } @@ -543,12 +573,12 @@ void MyFrame::OnToggleButtons(wxCommandEvent& WXUNUSED(event)) if ( wxGetApp().ShowButtons() ) { m_treeCtrl->CreateButtonsImageList(-1); - wxGetApp().SetShowButtons(FALSE); + wxGetApp().SetShowButtons(false); } else { m_treeCtrl->CreateButtonsImageList(15); - wxGetApp().SetShowButtons(TRUE); + wxGetApp().SetShowButtons(true); } #endif } @@ -644,7 +674,7 @@ MyTreeCtrl::MyTreeCtrl(wxWindow *parent, const wxWindowID id, long style) : wxTreeCtrl(parent, id, pos, size, style) { - m_reverseSort = FALSE; + m_reverseSort = false; CreateImageList(); @@ -665,7 +695,7 @@ void MyTreeCtrl::CreateImageList(int size) m_imageSize = size; // Make an image list containing small icons - wxImageList *images = new wxImageList(size, size, TRUE); + wxImageList *images = new wxImageList(size, size, true); // should correspond to TreeCtrlIcon_xxx enum wxBusyCursor wait; @@ -702,7 +732,7 @@ void MyTreeCtrl::CreateButtonsImageList(int size) } // Make an image list containing small icons - wxImageList *images = new wxImageList(size, size, TRUE); + wxImageList *images = new wxImageList(size, size, true); // should correspond to TreeCtrlIcon_xxx enum wxBusyCursor wait; @@ -732,10 +762,6 @@ void MyTreeCtrl::CreateButtonsImageList(int WXUNUSED(size)) #endif } -MyTreeCtrl::~MyTreeCtrl() -{ -} - int MyTreeCtrl::OnCompareItems(const wxTreeItemId& item1, const wxTreeItemId& item2) { @@ -764,9 +790,9 @@ void MyTreeCtrl::AddItemsRecursively(const wxTreeItemId& idParent, { // at depth 1 elements won't have any more children if ( hasChildren ) - str.Printf(wxT("%s child %d"), wxT("Folder"), n + 1); + str.Printf(wxT("%s child %u"), wxT("Folder"), unsigned(n + 1)); else - str.Printf(wxT("%s child %d.%d"), wxT("File"), folder, n + 1); + str.Printf(wxT("%s child %u.%u"), wxT("File"), unsigned(folder), unsigned(n + 1)); // here we pass to AppendItem() normal and selected item images (we // suppose that selected image follows the normal one in the enum) @@ -853,18 +879,33 @@ void MyTreeCtrl::GetItemsRecursively(const wxTreeItemId& idParent, void MyTreeCtrl::DoToggleIcon(const wxTreeItemId& item) { - int image = GetItemImage(item) == TreeCtrlIcon_Folder ? TreeCtrlIcon_File - : TreeCtrlIcon_Folder; - - SetItemImage(item, image); + int image = (GetItemImage(item) == TreeCtrlIcon_Folder) + ? TreeCtrlIcon_File + : TreeCtrlIcon_Folder; + SetItemImage(item, image, wxTreeItemIcon_Normal); + + image = (GetItemImage(item) == TreeCtrlIcon_FolderSelected) + ? TreeCtrlIcon_FileSelected + : TreeCtrlIcon_FolderSelected; + SetItemImage(item, image, wxTreeItemIcon_Selected); } +void MyTreeCtrl::LogEvent(const wxChar *name, const wxTreeEvent& event) +{ + wxTreeItemId item = event.GetItem(); + wxString text; + if ( item.IsOk() ) + text << _T('"') << GetItemText(item).c_str() << _T('"'); + else + text = _T("invalid item"); + wxLogMessage(wxT("%s(%s)"), name, text.c_str()); +} // avoid repetition #define TREE_EVENT_HANDLER(name) \ void MyTreeCtrl::name(wxTreeEvent& event) \ { \ - wxLogMessage(wxT(#name)); \ + LogEvent(_T(#name), event); \ SetLastItem(wxTreeItemId()); \ event.Skip(); \ } @@ -906,8 +947,6 @@ void LogKeyEvent(const wxChar *name, const wxKeyEvent& event) case WXK_MENU: key = wxT("MENU"); break; case WXK_PAUSE: key = wxT("PAUSE"); break; case WXK_CAPITAL: key = wxT("CAPITAL"); break; - case WXK_PRIOR: key = wxT("PRIOR"); break; - case WXK_NEXT: key = wxT("NEXT"); break; case WXK_END: key = wxT("END"); break; case WXK_HOME: key = wxT("HOME"); break; case WXK_LEFT: key = wxT("LEFT"); break; @@ -976,7 +1015,6 @@ void LogKeyEvent(const wxChar *name, const wxKeyEvent& event) case WXK_NUMPAD_UP: key = wxT("NUMPAD_UP"); break; case WXK_NUMPAD_RIGHT: key = wxT("NUMPAD_RIGHT"); break; case WXK_NUMPAD_DOWN: key = wxT("NUMPAD_DOWN"); break; - case WXK_NUMPAD_PRIOR: key = wxT("NUMPAD_PRIOR"); break; case WXK_NUMPAD_PAGEUP: key = wxT("NUMPAD_PAGEUP"); break; case WXK_NUMPAD_PAGEDOWN: key = wxT("NUMPAD_PAGEDOWN"); break; case WXK_NUMPAD_END: key = wxT("NUMPAD_END"); break; @@ -992,7 +1030,7 @@ void LogKeyEvent(const wxChar *name, const wxKeyEvent& event) default: { - if ( wxIsprint((int)keycode) ) + if ( keycode < 128 && wxIsprint((int)keycode) ) key.Printf(wxT("'%c'"), (char)keycode); else if ( keycode > 0 && keycode < 27 ) key.Printf(_("Ctrl-%c"), wxT('A') + keycode - 1); @@ -1083,6 +1121,11 @@ void MyTreeCtrl::OnBeginLabelEdit(wxTreeEvent& event) event.Veto(); } + else if ( itemId == GetRootItem() ) + { + // test that it is possible to change the text of the item being edited + SetItemText(itemId, _T("Editing root item")); + } } void MyTreeCtrl::OnEndLabelEdit(wxTreeEvent& event) @@ -1126,26 +1169,35 @@ void MyTreeCtrl::OnItemActivated(wxTreeEvent& event) wxLogMessage(wxT("OnItemActivated")); } -void MyTreeCtrl::OnItemRightClick(wxTreeEvent& event) +void MyTreeCtrl::OnItemMenu(wxTreeEvent& event) { - ShowMenu(event.GetItem(), event.GetPoint()); + wxTreeItemId itemId = event.GetItem(); + MyTreeItemData *item = itemId.IsOk() ? (MyTreeItemData *)GetItemData(itemId) + : NULL; + + wxLogMessage(wxT("OnItemMenu for item \"%s\""), item ? item->GetDesc() + : _T("")); + + event.Skip(); } void MyTreeCtrl::OnContextMenu(wxContextMenuEvent& event) { wxPoint pt = event.GetPosition(); - wxTreeItemId item = GetSelection(); + wxTreeItemId item; + if ( !HasFlag(wxTR_MULTIPLE) ) + item = GetSelection(); wxLogMessage(wxT("OnContextMenu at screen coords (%i, %i)"), pt.x, pt.y); - //check if event was generated by keyboard (MSW-specific?) - if (pt.x==-1 && pt.y==-1) //(this is how MSW indicates it) + // check if event was generated by keyboard (MSW-specific?) + if ( pt.x == -1 && pt.y == -1 ) //(this is how MSW indicates it) { - //attempt to guess where to show the menu - if (item.IsOk()) - { - //if an item was clicked, show menu to the right of it + // attempt to guess where to show the menu + if ( item.IsOk() ) + { + // if an item was clicked, show menu to the right of it wxRect rect; - GetBoundingRect(item, rect, true); //true = only the label + GetBoundingRect(item, rect, true /* only the label */); pt = wxPoint(rect.GetRight(), rect.GetTop()); } else @@ -1153,12 +1205,11 @@ void MyTreeCtrl::OnContextMenu(wxContextMenuEvent& event) pt = wxPoint(0, 0); } } - else + else // event was generated by mouse, use supplied coords { - //event was generated by mouse, use supplied coords pt = ScreenToClient(pt); } - + ShowMenu(item, pt); } @@ -1183,6 +1234,32 @@ void MyTreeCtrl::ShowMenu(wxTreeItemId id, const wxPoint& pt) #endif // wxUSE_MENUS } +void MyTreeCtrl::OnItemRClick(wxTreeEvent& event) +{ + wxTreeItemId itemId = event.GetItem(); + MyTreeItemData *item = itemId.IsOk() ? (MyTreeItemData *)GetItemData(itemId) + : NULL; + + wxLogMessage(wxT("Item \"%s\" right clicked"), item ? item->GetDesc() + : _T("")); + + event.Skip(); +} + +void MyTreeCtrl::OnRMouseDown(wxMouseEvent& event) +{ + wxLogMessage(wxT("Right mouse button down")); + + event.Skip(); +} + +void MyTreeCtrl::OnRMouseUp(wxMouseEvent& event) +{ + wxLogMessage(wxT("Right mouse button up")); + + event.Skip(); +} + void MyTreeCtrl::OnRMouseDClick(wxMouseEvent& event) { wxTreeItemId id = HitTest(event.GetPosition()); @@ -1194,6 +1271,8 @@ void MyTreeCtrl::OnRMouseDClick(wxMouseEvent& event) if ( item ) wxLogMessage(wxT("Item '%s' under mouse"), item->GetDesc()); } + + event.Skip(); } static inline const wxChar *Bool2String(bool b) @@ -1209,6 +1288,6 @@ void MyTreeItemData::ShowInfo(wxTreeCtrl *tree) Bool2String(tree->IsSelected(GetId())), Bool2String(tree->IsExpanded(GetId())), Bool2String(tree->IsBold(GetId())), - tree->GetChildrenCount(GetId()), - tree->GetChildrenCount(GetId(), FALSE)); + unsigned(tree->GetChildrenCount(GetId())), + unsigned(tree->GetChildrenCount(GetId(), false))); }