X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f73eddd2a5af3c58fff4e2a6154d9a395b7631a5..d6a3ec35c891f8b05099ec194b5ed4a6697dfb51:/samples/treectrl/treetest.cpp diff --git a/samples/treectrl/treetest.cpp b/samples/treectrl/treetest.cpp index 307b3de575..15069adaca 100644 --- a/samples/treectrl/treetest.cpp +++ b/samples/treectrl/treetest.cpp @@ -29,6 +29,7 @@ #include "wx/imaglist.h" #include "wx/treectrl.h" #include "wx/math.h" +#include "wx/renderer.h" #ifdef __WIN32__ // this is not supported by native control @@ -43,6 +44,15 @@ #include "icon4.xpm" #include "icon5.xpm" +#include "state1.xpm" +#include "state2.xpm" +#include "state3.xpm" +#include "state4.xpm" +#include "state5.xpm" + +#include "unchecked.xpm" +#include "checked.xpm" + #ifndef __WXMSW__ #include "../sample.xpm" #endif @@ -98,7 +108,9 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) MENU_LINK(DeleteAll) MENU_LINK(Recreate) MENU_LINK(ToggleImages) + MENU_LINK(ToggleStates) MENU_LINK(ToggleAlternateImages) + MENU_LINK(ToggleAlternateStates) MENU_LINK(ToggleButtons) MENU_LINK(SetImageSize) MENU_LINK(CollapseAndReset) @@ -110,6 +122,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) MENU_LINK(IncSpacing) MENU_LINK(DecSpacing) MENU_LINK(ToggleIcon) + MENU_LINK(ToggleState) MENU_LINK(SelectRoot) MENU_LINK(ShowFirstVisible) @@ -118,6 +131,9 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) #endif // wxHAS_LAST_VISIBLE MENU_LINK(ShowNextVisible) MENU_LINK(ShowPrevVisible) + MENU_LINK(ShowParent) + MENU_LINK(ShowPrevSibling) + MENU_LINK(ShowNextSibling) #undef MENU_LINK END_EVENT_TABLE() @@ -146,6 +162,7 @@ BEGIN_EVENT_TABLE(MyTreeCtrl, wxTreeCtrl) EVT_TREE_SEL_CHANGING(TreeTest_Ctrl, MyTreeCtrl::OnSelChanging) EVT_TREE_KEY_DOWN(TreeTest_Ctrl, MyTreeCtrl::OnTreeKeyDown) EVT_TREE_ITEM_ACTIVATED(TreeTest_Ctrl, MyTreeCtrl::OnItemActivated) + EVT_TREE_STATE_IMAGE_CLICK(TreeTest_Ctrl, MyTreeCtrl::OnItemStateClick) // so many different ways to handle right mouse button clicks... EVT_CONTEXT_MENU(MyTreeCtrl::OnContextMenu) @@ -221,7 +238,9 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) style_menu->AppendCheckItem(TreeTest_ToggleSel, wxT("Toggle &selection mode\tCtrl-S")); #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_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...")); style_menu->AppendSeparator(); style_menu->Append(TreeTest_SetFgColour, wxT("Set &foreground colour...")); @@ -261,6 +280,7 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) item_menu->Append(TreeTest_ClearBold, wxT("Make item ¬ bold")); item_menu->AppendSeparator(); item_menu->Append(TreeTest_ToggleIcon, wxT("Toggle the item's &icon")); + item_menu->Append(TreeTest_ToggleState, wxT("Toggle the item's &state")); item_menu->AppendSeparator(); item_menu->Append(TreeTest_ShowFirstVisible, wxT("Show &first visible")); #ifdef wxHAS_LAST_VISIBLE @@ -268,6 +288,10 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) #endif // wxHAS_LAST_VISIBLE item_menu->Append(TreeTest_ShowNextVisible, wxT("Show &next visible")); item_menu->Append(TreeTest_ShowPrevVisible, wxT("Show &previous visible")); + item_menu->AppendSeparator(); + item_menu->Append(TreeTest_ShowParent, "Show pa&rent"); + item_menu->Append(TreeTest_ShowPrevSibling, "Show &previous sibling"); + item_menu->Append(TreeTest_ShowNextSibling, "Show &next sibling"); #ifndef NO_MULTIPLE_SELECTION item_menu->AppendSeparator(); @@ -296,7 +320,9 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) CreateTreeWithDefStyle(); menu_bar->Check(TreeTest_ToggleImages, true); + menu_bar->Check(TreeTest_ToggleStates, true); menu_bar->Check(TreeTest_ToggleAlternateImages, false); + menu_bar->Check(TreeTest_ToggleAlternateStates, false); #if wxUSE_STATUSBAR // create a status bar @@ -626,6 +652,20 @@ void MyFrame::OnToggleImages(wxCommandEvent& WXUNUSED(event)) } } +void MyFrame::OnToggleStates(wxCommandEvent& WXUNUSED(event)) +{ + if ( wxGetApp().ShowStates() ) + { + m_treeCtrl->CreateStateImageList(true); + wxGetApp().SetShowStates(false); + } + else + { + m_treeCtrl->CreateStateImageList(false); + wxGetApp().SetShowStates(true); + } +} + void MyFrame::OnToggleAlternateImages(wxCommandEvent& WXUNUSED(event)) { bool alternateImages = m_treeCtrl->AlternateImages(); @@ -634,6 +674,14 @@ void MyFrame::OnToggleAlternateImages(wxCommandEvent& WXUNUSED(event)) m_treeCtrl->CreateImageList(0); } +void MyFrame::OnToggleAlternateStates(wxCommandEvent& WXUNUSED(event)) +{ + bool alternateStates = m_treeCtrl->AlternateStates(); + + m_treeCtrl->SetAlternateStates(!alternateStates); + m_treeCtrl->CreateStateImageList(); +} + void MyFrame::OnToggleButtons(wxCommandEvent& WXUNUSED(event)) { #if USE_GENERIC_TREECTRL || !defined(__WXMSW__) @@ -715,6 +763,15 @@ void MyFrame::OnToggleIcon(wxCommandEvent& WXUNUSED(event)) m_treeCtrl->DoToggleIcon(item); } +void MyFrame::OnToggleState(wxCommandEvent& WXUNUSED(event)) +{ + wxTreeItemId item = m_treeCtrl->GetSelection(); + + CHECK_ITEM( item ); + + m_treeCtrl->DoToggleState(item); +} + void MyFrame::DoShowFirstOrLast(TreeFunc0_t pfn, const wxString& label) { const wxTreeItemId item = (m_treeCtrl->*pfn)(); @@ -726,25 +783,27 @@ void MyFrame::DoShowFirstOrLast(TreeFunc0_t pfn, const wxString& label) label, m_treeCtrl->GetItemText(item)); } -void MyFrame::DoShowNextOrPrev(TreeFunc1_t pfn, const wxString& label) +void MyFrame::DoShowRelativeItem(TreeFunc1_t pfn, const wxString& label) { wxTreeItemId item = m_treeCtrl->GetSelection(); CHECK_ITEM( item ); - if ( !m_treeCtrl->IsVisible(item) ) + if ((pfn == (TreeFunc1_t) &wxTreeCtrl::GetPrevVisible + || pfn == (TreeFunc1_t) &wxTreeCtrl::GetNextVisible) + && !m_treeCtrl->IsVisible(item)) { wxLogMessage("The selected item must be visible."); return; } - item = (m_treeCtrl->*pfn)(item); + wxTreeItemId new_item = (m_treeCtrl->*pfn)(item); - if ( !item.IsOk() ) + if ( !new_item.IsOk() ) wxLogMessage("There is no %s item", label); else wxLogMessage("The %s item is \"%s\"", - label, m_treeCtrl->GetItemText(item)); + label, m_treeCtrl->GetItemText(new_item)); } void MyFrame::OnSetFgColour(wxCommandEvent& WXUNUSED(event)) @@ -772,11 +831,13 @@ MyTreeCtrl::MyTreeCtrl(wxWindow *parent, const wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : wxTreeCtrl(parent, id, pos, size, style), - m_alternateImages(false) + m_alternateImages(false), + m_alternateStates(false) { m_reverseSort = false; CreateImageList(); + CreateStateImageList(); // Add some items to the tree AddTestItemsToTree(5, 2); @@ -836,6 +897,54 @@ void MyTreeCtrl::CreateImageList(int size) AssignImageList(images); } +void MyTreeCtrl::CreateStateImageList(bool del) +{ + if ( del ) + { + SetStateImageList(NULL); + return; + } + + wxImageList *states; + wxBusyCursor wait; + + if (m_alternateStates) + { + wxIcon icons[5]; + icons[0] = wxIcon(state1_xpm); // yellow + icons[1] = wxIcon(state2_xpm); // green + icons[2] = wxIcon(state3_xpm); // red + icons[3] = wxIcon(state4_xpm); // blue + icons[4] = wxIcon(state5_xpm); // black + + int width = icons[0].GetWidth(), + height = icons[0].GetHeight(); + + // Make an state image list containing small icons + states = new wxImageList(width, height, true); + + for ( size_t i = 0; i < WXSIZEOF(icons); i++ ) + states->Add(icons[i]); + } + else + { + 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); + + for ( size_t i = 0; i < WXSIZEOF(icons); i++ ) + states->Add(icons[i]); + } + + AssignStateImageList(states); +} + #if USE_GENERIC_TREECTRL || !defined(__WXMSW__) void MyTreeCtrl::CreateButtonsImageList(int size) { @@ -936,6 +1045,9 @@ void MyTreeCtrl::AddItemsRecursively(const wxTreeItemId& idParent, wxTreeItemId id = AppendItem(idParent, str, image, imageSel, new MyTreeItemData(str)); + if ( wxGetApp().ShowStates() ) + SetItemState(id, 0); + // and now we also set the expanded one (only for the folders) if ( hasChildren && wxGetApp().ShowImages() ) { @@ -1007,17 +1119,39 @@ void MyTreeCtrl::GetItemsRecursively(const wxTreeItemId& idParent, void MyTreeCtrl::DoToggleIcon(const wxTreeItemId& item) { - int image = (GetItemImage(item) == TreeCtrlIcon_Folder) + int image = GetItemImage(item) == TreeCtrlIcon_Folder ? TreeCtrlIcon_File : TreeCtrlIcon_Folder; SetItemImage(item, image, wxTreeItemIcon_Normal); - image = (GetItemImage(item) == TreeCtrlIcon_FolderSelected) + image = GetItemImage(item, wxTreeItemIcon_Selected) == TreeCtrlIcon_FolderSelected ? TreeCtrlIcon_FileSelected : TreeCtrlIcon_FolderSelected; SetItemImage(item, image, wxTreeItemIcon_Selected); } +void MyTreeCtrl::DoToggleState(const wxTreeItemId& item) +{ + if ( m_alternateStates ) + { + // sets random state unlike current + int state = GetItemState(item); + int nState; + + srand (time(NULL)); + do { + nState = rand() % GetStateImageList()->GetImageCount(); + } while (nState == state); + + SetItemState(item, nState); + } + else + { + // we have only 2 checkbox states, so next state will be reversed + SetItemState(item, wxTREE_ITEMSTATE_NEXT); + } +} + void MyTreeCtrl::LogEvent(const wxChar *name, const wxTreeEvent& event) { wxTreeItemId item = event.GetItem(); @@ -1238,7 +1372,10 @@ void MyTreeCtrl::OnEndDrag(wxTreeEvent& event) // Finally, we only copy one item here but we might copy the entire tree if // we were dragging a folder. int image = wxGetApp().ShowImages() ? TreeCtrlIcon_File : -1; - AppendItem(itemDst, text, image); + wxTreeItemId id = AppendItem(itemDst, text, image); + + if ( wxGetApp().ShowStates() ) + SetItemState(id, GetItemState(itemSrc)); } void MyTreeCtrl::OnBeginLabelEdit(wxTreeEvent& event) @@ -1301,6 +1438,16 @@ void MyTreeCtrl::OnItemActivated(wxTreeEvent& event) wxLogMessage(wxT("OnItemActivated")); } +void MyTreeCtrl::OnItemStateClick(wxTreeEvent& event) +{ + // toggle item state + wxTreeItemId itemId = event.GetItem(); + DoToggleState(itemId); + + wxLogMessage(wxT("Item \"%s\" state changed to %d"), + GetItemText(itemId), GetItemState(itemId)); +} + void MyTreeCtrl::OnItemMenu(wxTreeEvent& event) { wxTreeItemId itemId = event.GetItem(); @@ -1309,7 +1456,7 @@ void MyTreeCtrl::OnItemMenu(wxTreeEvent& event) wxPoint clientpt = event.GetPoint(); wxPoint screenpt = ClientToScreen(clientpt); - wxLogMessage(wxT("OnItemMenu for item \"%s\" at screen coords (%i, %i)"), + wxLogMessage(wxT("OnItemMenu for item \"%s\" at screen coords (%i, %i)"), item ? item->GetDesc() : _T(""), screenpt.x, screenpt.y); ShowMenu(itemId, clientpt);