X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9a83f860948059b0273b5cc6d9e43fadad3ebfca..fa699cbaaf217af186cd04dd10d6ec67c8667136:/samples/treectrl/treetest.cpp diff --git a/samples/treectrl/treetest.cpp b/samples/treectrl/treetest.cpp index 41a86c466c..485e203b54 100644 --- a/samples/treectrl/treetest.cpp +++ b/samples/treectrl/treetest.cpp @@ -6,7 +6,7 @@ // Created: 04/01/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart -// Licence: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // For compilers that support precompilation, includes "wx/wx.h". @@ -30,6 +30,7 @@ #include "wx/treectrl.h" #include "wx/math.h" #include "wx/renderer.h" +#include "wx/wupdlock.h" #ifdef __WIN32__ // this is not supported by native control @@ -53,7 +54,7 @@ #include "unchecked.xpm" #include "checked.xpm" -#ifndef __WXMSW__ +#ifndef wxHAS_IMAGES_IN_RESOURCES #include "../sample.xpm" #endif @@ -98,6 +99,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) MENU_LINK(Select) MENU_LINK(Unselect) MENU_LINK(ToggleSel) + MENU_LINK(SelectChildren) #endif // NO_MULTIPLE_SELECTION MENU_LINK(Rename) MENU_LINK(Count) @@ -112,6 +114,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) MENU_LINK(Recreate) MENU_LINK(ToggleImages) MENU_LINK(ToggleStates) + MENU_LINK(ToggleBell) MENU_LINK(ToggleAlternateImages) MENU_LINK(ToggleAlternateStates) MENU_LINK(ToggleButtons) @@ -120,6 +123,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) MENU_LINK(EnsureVisible) MENU_LINK(SetFocus) MENU_LINK(AddItem) + MENU_LINK(AddManyItems) MENU_LINK(InsertItem) MENU_LINK(IncIndent) MENU_LINK(DecIndent) @@ -128,6 +132,8 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) MENU_LINK(ToggleIcon) MENU_LINK(ToggleState) MENU_LINK(SelectRoot) + MENU_LINK(SetFocusedRoot) + MENU_LINK(ClearFocused) MENU_LINK(ShowFirstVisible) #ifdef wxHAS_LAST_VISIBLE @@ -139,6 +145,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) MENU_LINK(ShowPrevSibling) MENU_LINK(ShowNextSibling) MENU_LINK(ScrollTo) + MENU_LINK(SelectLast) #undef MENU_LINK END_EVENT_TABLE() @@ -194,7 +201,6 @@ bool MyApp::OnInit() // Show the frame frame->Show(true); - SetTopWindow(frame); return true; } @@ -211,7 +217,7 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) // This reduces flicker effects - even better would be to define // OnEraseBackground to do nothing. When the tree control's scrollbars are // show or hidden, the frame is sent a background erase event. - SetBackgroundColour(wxColour(255, 255, 255)); + SetBackgroundColour(*wxWHITE); // Give it an icon SetIcon(wxICON(sample)); @@ -223,9 +229,11 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) *tree_menu = new wxMenu, *item_menu = new wxMenu; +#if wxUSE_LOG file_menu->Append(TreeTest_ClearLog, wxT("&Clear log\tCtrl-L")); file_menu->AppendSeparator(); - file_menu->Append(TreeTest_About, wxT("&About...")); +#endif // wxUSE_LOG + file_menu->Append(TreeTest_About, wxT("&About")); file_menu->AppendSeparator(); file_menu->Append(TreeTest_Quit, wxT("E&xit\tAlt-X")); @@ -244,6 +252,7 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) #endif // NO_MULTIPLE_SELECTION style_menu->AppendCheckItem(TreeTest_ToggleImages, wxT("Toggle show ima&ges")); style_menu->AppendCheckItem(TreeTest_ToggleStates, wxT("Toggle show st&ates")); + style_menu->AppendCheckItem(TreeTest_ToggleBell, wxT("Toggle &bell on no match")); style_menu->AppendCheckItem(TreeTest_ToggleAlternateImages, wxT("Toggle alternate images")); style_menu->AppendCheckItem(TreeTest_ToggleAlternateStates, wxT("Toggle alternate state images")); style_menu->Append(TreeTest_SetImageSize, wxT("Set image si&ze...")); @@ -257,11 +266,16 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) tree_menu->Append(TreeTest_CollapseAndReset, wxT("C&ollapse and reset")); tree_menu->AppendSeparator(); tree_menu->Append(TreeTest_AddItem, wxT("Append a &new item")); + tree_menu->Append(TreeTest_AddManyItems, wxT("Appends &many items")); tree_menu->Append(TreeTest_InsertItem, wxT("&Insert a new item")); 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_SetFocusedRoot, wxT("Set focus to root item")); + tree_menu->Append(TreeTest_ClearFocused, wxT("Reset focus")); + 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")); @@ -301,12 +315,15 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) item_menu->AppendSeparator(); item_menu->Append(TreeTest_ScrollTo, "Scroll &to item", "Scroll to the last by one top level child"); + item_menu->Append(TreeTest_SelectLast, "Select &last item", + "Select the last item"); #ifndef NO_MULTIPLE_SELECTION item_menu->AppendSeparator(); item_menu->Append(TreeTest_DumpSelected, wxT("Dump selected items\tAlt-D")); item_menu->Append(TreeTest_Select, wxT("Select current item\tAlt-S")); item_menu->Append(TreeTest_Unselect, wxT("Unselect everything\tAlt-U")); + item_menu->Append(TreeTest_SelectChildren, wxT("Select all children\tCtrl-A")); #endif // NO_MULTIPLE_SELECTION wxMenuBar *menu_bar = new wxMenuBar; @@ -324,6 +341,16 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) m_textCtrl = new wxTextCtrl(m_panel, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxSUNKEN_BORDER); + +#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(m_textCtrl); + delete wxLog::SetActiveTarget(logWindow); +#endif #endif // wxUSE_LOG CreateTreeWithDefStyle(); @@ -337,18 +364,6 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) // 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? - delete wxLog::SetActiveTarget(new wxLogStderr); -#else - // set our text control as the log target - wxLogTextCtrl *logWindow = new wxLogTextCtrl(m_textCtrl); - delete wxLog::SetActiveTarget(logWindow); -#endif -#endif // wxUSE_LOG } MyFrame::~MyFrame() @@ -589,11 +604,31 @@ void MyFrame::OnSelectRoot(wxCommandEvent& WXUNUSED(event)) m_treeCtrl->SelectItem(m_treeCtrl->GetRootItem()); } +void MyFrame::OnSetFocusedRoot(wxCommandEvent& WXUNUSED(event)) +{ + if ( !m_treeCtrl->HasFlag(wxTR_HIDE_ROOT) ) + m_treeCtrl->SetFocusedItem(m_treeCtrl->GetRootItem()); +} + +void MyFrame::OnClearFocused(wxCommandEvent& WXUNUSED(event)) +{ + m_treeCtrl->ClearFocusedItem(); +} + void MyFrame::OnUnselect(wxCommandEvent& WXUNUSED(event)) { m_treeCtrl->UnselectAll(); } +void MyFrame::OnSelectChildren(wxCommandEvent& WXUNUSED(event)) +{ + wxTreeItemId item = m_treeCtrl->GetFocusedItem(); + if ( !item.IsOk() ) + item = m_treeCtrl->GetRootItem(); + + m_treeCtrl->SelectChildren(item); +} + #endif // NO_MULTIPLE_SELECTION void MyFrame::DoSetBold(bool bold) @@ -675,6 +710,11 @@ void MyFrame::OnToggleStates(wxCommandEvent& WXUNUSED(event)) } } +void MyFrame::OnToggleBell(wxCommandEvent& event) +{ + m_treeCtrl->EnableBellOnNoMatch(event.IsChecked()); +} + void MyFrame::OnToggleAlternateImages(wxCommandEvent& WXUNUSED(event)) { bool alternateImages = m_treeCtrl->AlternateImages(); @@ -745,6 +785,17 @@ void MyFrame::OnAddItem(wxCommandEvent& WXUNUSED(event)) MyTreeCtrl::TreeCtrlIcon_File */ ); } +void MyFrame::OnAddManyItems(wxCommandEvent& WXUNUSED(event)) +{ + wxWindowUpdateLocker lockUpdates(this); + + const wxTreeItemId root = m_treeCtrl->GetRootItem(); + for ( int n = 0; n < 1000; n++ ) + { + m_treeCtrl->AppendItem(root, wxString::Format("Item #%03d", n)); + } +} + void MyFrame::OnIncIndent(wxCommandEvent& WXUNUSED(event)) { unsigned int indent = m_treeCtrl->GetIndent(); @@ -776,7 +827,7 @@ void MyFrame::OnDecSpacing(wxCommandEvent& WXUNUSED(event)) { m_treeCtrl->SetSpacing( indent-5 ); m_treeCtrl->Refresh(); - } + } } void MyFrame::OnToggleIcon(wxCommandEvent& WXUNUSED(event)) @@ -850,17 +901,35 @@ void MyFrame::OnScrollTo(wxCommandEvent& WXUNUSED(event)) m_treeCtrl->ScrollTo(item); } +void MyFrame::OnSelectLast(wxCommandEvent& WXUNUSED(event)) +{ + // select the very last item of the tree + wxTreeItemId item = m_treeCtrl->GetRootItem(); + for ( ;; ) + { + wxTreeItemId itemChild = m_treeCtrl->GetLastChild(item); + if ( !itemChild.IsOk() ) + break; + + item = itemChild; + } + + CHECK_ITEM( item ); + + m_treeCtrl->SelectItem(item); +} + void MyFrame::OnSetFgColour(wxCommandEvent& WXUNUSED(event)) { wxColour col = wxGetColourFromUser(this, m_treeCtrl->GetForegroundColour()); - if ( col.Ok() ) + if ( col.IsOk() ) m_treeCtrl->SetForegroundColour(col); } void MyFrame::OnSetBgColour(wxCommandEvent& WXUNUSED(event)) { wxColour col = wxGetColourFromUser(this, m_treeCtrl->GetBackgroundColour()); - if ( col.Ok() ) + if ( col.IsOk() ) m_treeCtrl->SetBackgroundColour(col); } @@ -975,10 +1044,10 @@ void MyTreeCtrl::CreateStateImageList(bool del) wxIcon icons[2]; icons[0] = wxIcon(unchecked_xpm); icons[1] = wxIcon(checked_xpm); - + int width = icons[0].GetWidth(), height = icons[0].GetHeight(); - + // Make an state image list containing small icons states = new wxImageList(width, height, true); @@ -1522,13 +1591,14 @@ void MyTreeCtrl::OnItemStateClick(wxTreeEvent& event) void MyTreeCtrl::OnItemMenu(wxTreeEvent& event) { wxTreeItemId itemId = event.GetItem(); - MyTreeItemData *item = itemId.IsOk() ? (MyTreeItemData *)GetItemData(itemId) - : NULL; + wxCHECK_RET( itemId.IsOk(), "should have a valid item" ); + + MyTreeItemData *item = (MyTreeItemData *)GetItemData(itemId); wxPoint clientpt = event.GetPoint(); wxPoint screenpt = ClientToScreen(clientpt); wxLogMessage(wxT("OnItemMenu for item \"%s\" at screen coords (%i, %i)"), - item ? item->GetDesc() : wxT(""), screenpt.x, screenpt.y); + item->GetDesc(), screenpt.x, screenpt.y); ShowMenu(itemId, clientpt); event.Skip(); @@ -1557,7 +1627,7 @@ void MyTreeCtrl::ShowMenu(wxTreeItemId id, const wxPoint& pt) #if wxUSE_MENUS wxMenu menu(title); - menu.Append(TreeTest_About, wxT("&About...")); + menu.Append(TreeTest_About, wxT("&About")); menu.AppendSeparator(); menu.Append(TreeTest_Highlight, wxT("&Highlight item")); menu.Append(TreeTest_Dump, wxT("&Dump")); @@ -1569,11 +1639,11 @@ void MyTreeCtrl::ShowMenu(wxTreeItemId id, const wxPoint& pt) void MyTreeCtrl::OnItemRClick(wxTreeEvent& event) { wxTreeItemId itemId = event.GetItem(); - MyTreeItemData *item = itemId.IsOk() ? (MyTreeItemData *)GetItemData(itemId) - : NULL; + wxCHECK_RET( itemId.IsOk(), "should have a valid item" ); + + MyTreeItemData *item = (MyTreeItemData *)GetItemData(itemId); - wxLogMessage(wxT("Item \"%s\" right clicked"), item ? item->GetDesc() - : wxT("")); + wxLogMessage(wxT("Item \"%s\" right clicked"), item->GetDesc()); event.Skip(); }