X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ef46ef23cb8aa259ea8b8894ad6a2254b57db31a..30386aeb867e0b6311450a87c056c42301765a65:/samples/treectrl/treetest.cpp diff --git a/samples/treectrl/treetest.cpp b/samples/treectrl/treetest.cpp index 3a3f8d43e1..307b3de575 100644 --- a/samples/treectrl/treetest.cpp +++ b/samples/treectrl/treetest.cpp @@ -9,26 +9,22 @@ // 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/artprov.h" #include "wx/image.h" #include "wx/imaglist.h" #include "wx/treectrl.h" @@ -47,11 +43,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!"), \ @@ -69,6 +64,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) MENU_LINK(Quit) MENU_LINK(About) + MENU_LINK(ClearLog) MENU_LINK(TogButtons) MENU_LINK(TogTwist) @@ -82,6 +78,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) MENU_LINK(SetBgColour) MENU_LINK(ResetStyle) + MENU_LINK(Highlight) MENU_LINK(Dump) #ifndef NO_MULTIPLE_SELECTION MENU_LINK(DumpSelected) @@ -101,6 +98,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) MENU_LINK(DeleteAll) MENU_LINK(Recreate) MENU_LINK(ToggleImages) + MENU_LINK(ToggleAlternateImages) MENU_LINK(ToggleButtons) MENU_LINK(SetImageSize) MENU_LINK(CollapseAndReset) @@ -113,6 +111,13 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) MENU_LINK(DecSpacing) MENU_LINK(ToggleIcon) MENU_LINK(SelectRoot) + + MENU_LINK(ShowFirstVisible) +#ifdef wxHAS_LAST_VISIBLE + MENU_LINK(ShowLastVisible) +#endif // wxHAS_LAST_VISIBLE + MENU_LINK(ShowNextVisible) + MENU_LINK(ShowPrevVisible) #undef MENU_LINK END_EVENT_TABLE() @@ -137,13 +142,21 @@ BEGIN_EVENT_TABLE(MyTreeCtrl, wxTreeCtrl) EVT_TREE_ITEM_COLLAPSED(TreeTest_Ctrl, MyTreeCtrl::OnItemCollapsed) EVT_TREE_ITEM_COLLAPSING(TreeTest_Ctrl, MyTreeCtrl::OnItemCollapsing) - EVT_CONTEXT_MENU(MyTreeCtrl::OnContextMenu) - EVT_TREE_ITEM_MENU(TreeTest_Ctrl, MyTreeCtrl::OnItemMenu) - 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 different 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() @@ -151,6 +164,9 @@ IMPLEMENT_APP(MyApp) bool MyApp::OnInit() { + if ( !wxApp::OnInit() ) + return false; + // Create the main frame window MyFrame *frame = new MyFrame(wxT("wxTreeCtrl Test"), 50, 50, 450, 600); @@ -176,7 +192,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 @@ -185,6 +201,8 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) *tree_menu = new wxMenu, *item_menu = new wxMenu; + file_menu->Append(TreeTest_ClearLog, wxT("&Clear log\tCtrl-L")); + file_menu->AppendSeparator(); file_menu->Append(TreeTest_About, wxT("&About...")); file_menu->AppendSeparator(); file_menu->Append(TreeTest_Quit, wxT("E&xit\tAlt-X")); @@ -200,9 +218,10 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) 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->AppendCheckItem(TreeTest_ToggleSel, wxT("Toggle &selection mode")); + 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_ToggleAlternateImages, wxT("Toggle alternate images")); style_menu->Append(TreeTest_SetImageSize, wxT("Set image si&ze...")); style_menu->AppendSeparator(); style_menu->Append(TreeTest_SetFgColour, wxT("Set &foreground colour...")); @@ -242,6 +261,13 @@ 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->AppendSeparator(); + item_menu->Append(TreeTest_ShowFirstVisible, wxT("Show &first visible")); +#ifdef wxHAS_LAST_VISIBLE + item_menu->Append(TreeTest_ShowLastVisible, wxT("Show &last visible")); +#endif // wxHAS_LAST_VISIBLE + item_menu->Append(TreeTest_ShowNextVisible, wxT("Show &next visible")); + item_menu->Append(TreeTest_ShowPrevVisible, wxT("Show &previous visible")); #ifndef NO_MULTIPLE_SELECTION item_menu->AppendSeparator(); @@ -258,9 +284,11 @@ 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, wxID_ANY, wxT(""), + m_textCtrl = new wxTextCtrl(m_panel, wxID_ANY, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxSUNKEN_BORDER); #endif // wxUSE_LOG @@ -268,6 +296,7 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) CreateTreeWithDefStyle(); menu_bar->Check(TreeTest_ToggleImages, true); + menu_bar->Check(TreeTest_ToggleAlternateImages, false); #if wxUSE_STATUSBAR // create a status bar @@ -319,9 +348,12 @@ 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); + + GetMenuBar()->Enable(TreeTest_SelectRoot, !(style & wxTR_HIDE_ROOT)); + Resize(); } @@ -347,14 +379,20 @@ void MyFrame::OnIdle(wxIdleEvent& event) if ( m_treeCtrl ) { wxTreeItemId idRoot = m_treeCtrl->GetRootItem(); + wxString status; + if (idRoot.IsOk()) + { + wxTreeItemId idLast = m_treeCtrl->GetLastChild(idRoot); + status = wxString::Format( + _T("Root/last item is %svisible/%svisible"), + m_treeCtrl->IsVisible(idRoot) ? _T("") : _T("not "), + idLast.IsOk() && m_treeCtrl->IsVisible(idLast) + ? _T("") : _T("not ")); + } + else + status = _T("No root item"); - SetStatusText(wxString::Format - ( - _T("Root/last item is %svisible/%svisible"), - m_treeCtrl->IsVisible(idRoot) ? _T("") : _T("not "), - m_treeCtrl->IsVisible(m_treeCtrl->GetLastChild(idRoot)) - ? _T("") : _T("not ") - ), 1); + SetStatusText(status, 1); } #endif // wxUSE_STATUSBAR @@ -379,12 +417,11 @@ void MyFrame::Resize() { wxSize size = GetClientSize(); m_treeCtrl->SetSize(0, 0, size.x, size.y -#if !wxUSE_LOG - ); -#else +#if wxUSE_LOG *2/3); - m_textCtrl->SetSize(0, 2*size.y/3, size.x, size.y/3); + m_textCtrl->SetSize(0, 2*size.y/3, size.x, size.y/3 #endif + ); } void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) @@ -400,6 +437,11 @@ void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) wxOK | wxICON_INFORMATION, this); } +void MyFrame::OnClearLog(wxCommandEvent& WXUNUSED(event)) +{ + m_textCtrl->Clear(); +} + void MyFrame::OnRename(wxCommandEvent& WXUNUSED(event)) { wxTreeItemId item = m_treeCtrl->GetSelection(); @@ -452,6 +494,26 @@ void MyFrame::DoSort(bool reverse) m_treeCtrl->DoSortChildren(item, reverse); } +void MyFrame::OnHighlight(wxCommandEvent& WXUNUSED(event)) +{ + wxTreeItemId id = m_treeCtrl->GetSelection(); + + CHECK_ITEM( id ); + + wxRect r; + if ( !m_treeCtrl->GetBoundingRect(id, r, true /* text, not full row */) ) + { + wxLogMessage(_T("Failed to get bounding item rect")); + return; + } + + wxClientDC dc(m_treeCtrl); + dc.SetBrush(*wxRED); + dc.SetPen(*wxTRANSPARENT_PEN); + dc.DrawRectangle(r); + m_treeCtrl->Update(); +} + void MyFrame::OnDump(wxCommandEvent& WXUNUSED(event)) { wxTreeItemId root = m_treeCtrl->GetSelection(); @@ -473,7 +535,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++ ) { @@ -488,7 +550,8 @@ void MyFrame::OnSelect(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnSelectRoot(wxCommandEvent& WXUNUSED(event)) { - m_treeCtrl->SelectItem(m_treeCtrl->GetRootItem()); + if ( !m_treeCtrl->HasFlag(wxTR_HIDE_ROOT) ) + m_treeCtrl->SelectItem(m_treeCtrl->GetRootItem()); } void MyFrame::OnUnselect(wxCommandEvent& WXUNUSED(event)) @@ -563,6 +626,14 @@ void MyFrame::OnToggleImages(wxCommandEvent& WXUNUSED(event)) } } +void MyFrame::OnToggleAlternateImages(wxCommandEvent& WXUNUSED(event)) +{ + bool alternateImages = m_treeCtrl->AlternateImages(); + + m_treeCtrl->SetAlternateImages(!alternateImages); + m_treeCtrl->CreateImageList(0); +} + void MyFrame::OnToggleButtons(wxCommandEvent& WXUNUSED(event)) { #if USE_GENERIC_TREECTRL || !defined(__WXMSW__) @@ -644,6 +715,38 @@ void MyFrame::OnToggleIcon(wxCommandEvent& WXUNUSED(event)) m_treeCtrl->DoToggleIcon(item); } +void MyFrame::DoShowFirstOrLast(TreeFunc0_t pfn, const wxString& label) +{ + const wxTreeItemId item = (m_treeCtrl->*pfn)(); + + if ( !item.IsOk() ) + wxLogMessage("There is no %s item", label); + else + wxLogMessage("The %s item is \"%s\"", + label, m_treeCtrl->GetItemText(item)); +} + +void MyFrame::DoShowNextOrPrev(TreeFunc1_t pfn, const wxString& label) +{ + wxTreeItemId item = m_treeCtrl->GetSelection(); + + CHECK_ITEM( item ); + + if ( !m_treeCtrl->IsVisible(item) ) + { + wxLogMessage("The selected item must be visible."); + return; + } + + item = (m_treeCtrl->*pfn)(item); + + if ( !item.IsOk() ) + wxLogMessage("There is no %s item", label); + else + wxLogMessage("The %s item is \"%s\"", + label, m_treeCtrl->GetItemText(item)); +} + void MyFrame::OnSetFgColour(wxCommandEvent& WXUNUSED(event)) { wxColour col = wxGetColourFromUser(this, m_treeCtrl->GetForegroundColour()); @@ -668,7 +771,8 @@ 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) + : wxTreeCtrl(parent, id, pos, size, style), + m_alternateImages(false) { m_reverseSort = false; @@ -696,15 +800,29 @@ void MyTreeCtrl::CreateImageList(int size) // should correspond to TreeCtrlIcon_xxx enum wxBusyCursor wait; wxIcon icons[5]; - icons[0] = wxIcon(icon1_xpm); - icons[1] = wxIcon(icon2_xpm); - icons[2] = wxIcon(icon3_xpm); - icons[3] = wxIcon(icon4_xpm); - icons[4] = wxIcon(icon5_xpm); - int sizeOrig = icons[0].GetWidth(); + if (m_alternateImages) + { + icons[TreeCtrlIcon_File] = wxIcon(icon1_xpm); + icons[TreeCtrlIcon_FileSelected] = wxIcon(icon2_xpm); + icons[TreeCtrlIcon_Folder] = wxIcon(icon3_xpm); + icons[TreeCtrlIcon_FolderSelected] = wxIcon(icon4_xpm); + icons[TreeCtrlIcon_FolderOpened] = wxIcon(icon5_xpm); + } + else + { + wxSize iconSize(size, size); + + icons[TreeCtrlIcon_File] = + icons[TreeCtrlIcon_FileSelected] = wxArtProvider::GetIcon(wxART_NORMAL_FILE, wxART_LIST, iconSize); + icons[TreeCtrlIcon_Folder] = + icons[TreeCtrlIcon_FolderSelected] = + icons[TreeCtrlIcon_FolderOpened] = wxArtProvider::GetIcon(wxART_FOLDER, wxART_LIST, iconSize); + } + for ( size_t i = 0; i < WXSIZEOF(icons); i++ ) { + int sizeOrig = icons[0].GetWidth(); if ( size == sizeOrig ) { images->Add(icons[i]); @@ -733,12 +851,25 @@ void MyTreeCtrl::CreateButtonsImageList(int size) // should correspond to TreeCtrlIcon_xxx enum wxBusyCursor wait; wxIcon icons[4]; - icons[0] = wxIcon(icon3_xpm); // closed - icons[1] = wxIcon(icon3_xpm); // closed, selected - icons[2] = wxIcon(icon5_xpm); // open - icons[3] = wxIcon(icon5_xpm); // open, selected - for ( size_t i = 0; i < WXSIZEOF(icons); i++ ) + if (m_alternateImages) + { + icons[0] = wxIcon(icon3_xpm); // closed + icons[1] = wxIcon(icon3_xpm); // closed, selected + icons[2] = wxIcon(icon5_xpm); // open + icons[3] = wxIcon(icon5_xpm); // open, selected + } + else + { + wxSize iconSize(size, size); + + icons[0] = // closed + icons[1] = wxArtProvider::GetIcon(wxART_FOLDER, wxART_LIST, iconSize); // closed, selected + icons[2] = // open + icons[3] = wxArtProvider::GetIcon(wxART_FOLDER_OPEN, wxART_LIST, iconSize);// open, selected + } + + for ( size_t i = 0; i < WXSIZEOF(icons); i++ ) { int sizeOrig = icons[i].GetWidth(); if ( size == sizeOrig ) @@ -786,9 +917,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) @@ -831,7 +962,7 @@ void MyTreeCtrl::AddTestItemsToTree(size_t numChildren, wxTreeItemId rootId = AddRoot(wxT("Root"), image, image, new MyTreeItemData(wxT("Root item"))); - if ( image != -1 ) + if ( !HasFlag(wxTR_HIDE_ROOT) && image != -1 ) { SetItemImage(rootId, TreeCtrlIcon_FolderOpened, wxTreeItemIcon_Expanded); } @@ -839,7 +970,8 @@ void MyTreeCtrl::AddTestItemsToTree(size_t numChildren, AddItemsRecursively(rootId, numChildren, depth, 0); // set some colours/fonts for testing - SetItemFont(rootId, *wxITALIC_FONT); + if ( !HasFlag(wxTR_HIDE_ROOT) ) + SetItemFont(rootId, *wxITALIC_FONT); wxTreeItemIdValue cookie; wxTreeItemId id = GetFirstChild(rootId, cookie); @@ -875,18 +1007,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(); \ } @@ -928,8 +1075,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; @@ -998,7 +1143,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; @@ -1047,8 +1191,12 @@ void MyTreeCtrl::OnBeginDrag(wxTreeEvent& event) { m_draggedItem = event.GetItem(); - wxLogMessage(wxT("OnBeginDrag: started dragging %s"), - GetItemText(m_draggedItem).c_str()); + wxPoint clientpt = event.GetPoint(); + wxPoint screenpt = ClientToScreen(clientpt); + + wxLogMessage(wxT("OnBeginDrag: started dragging %s at screen coords (%i,%i)"), + GetItemText(m_draggedItem).c_str(), + screenpt.x, screenpt.y); event.Allow(); } @@ -1105,6 +1253,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) @@ -1153,41 +1306,21 @@ void MyTreeCtrl::OnItemMenu(wxTreeEvent& event) wxTreeItemId itemId = event.GetItem(); MyTreeItemData *item = itemId.IsOk() ? (MyTreeItemData *)GetItemData(itemId) : NULL; + wxPoint clientpt = event.GetPoint(); + wxPoint screenpt = ClientToScreen(clientpt); - wxLogMessage(wxT("OnItemMenu for item \"%s\""), item ? item->GetDesc() - : _T("")); + wxLogMessage(wxT("OnItemMenu for item \"%s\" at screen coords (%i, %i)"), + item ? item->GetDesc() : _T(""), screenpt.x, screenpt.y); + ShowMenu(itemId, clientpt); event.Skip(); } void MyTreeCtrl::OnContextMenu(wxContextMenuEvent& event) { wxPoint pt = event.GetPosition(); - wxTreeItemId 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) - { - // 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 /* only the label */); - pt = wxPoint(rect.GetRight(), rect.GetTop()); - } - else - { - pt = wxPoint(0, 0); - } - } - else // event was generated by mouse, use supplied coords - { - pt = ScreenToClient(pt); - } - ShowMenu(item, pt); + wxLogMessage(wxT("OnContextMenu at screen coords (%i, %i)"), pt.x, pt.y); } void MyTreeCtrl::ShowMenu(wxTreeItemId id, const wxPoint& pt) @@ -1205,12 +1338,40 @@ void MyTreeCtrl::ShowMenu(wxTreeItemId id, const wxPoint& pt) #if wxUSE_MENUS wxMenu menu(title); menu.Append(TreeTest_About, wxT("&About...")); + menu.AppendSeparator(); + menu.Append(TreeTest_Highlight, wxT("&Highlight item")); menu.Append(TreeTest_Dump, wxT("&Dump")); PopupMenu(&menu, 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()); @@ -1222,6 +1383,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) @@ -1237,6 +1400,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))); }