From: Vadim Zeitlin Date: Sun, 7 Oct 2007 21:58:51 +0000 (+0000) Subject: made wxTreeCtrl::GetNextVisible() behave in the same way in Win32 as in the generic... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/f73eddd2a5af3c58fff4e2a6154d9a395b7631a5 made wxTreeCtrl::GetNextVisible() behave in the same way in Win32 as in the generic version and implemented GetPrevVisible() in the generic version git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49085 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/changes.txt b/docs/changes.txt index cf36c9349a..f172e17df6 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -195,6 +195,8 @@ All (GUI): - Added wxSYS_DCLICK_TIME system metric constant (Arne Steinarson) - Added wxApp::Get/SetAppDisplayName() (Brian A. Vanderburg II) - Added wxWindow::GetPopupMenuSelectionFromUser() (Arne Steinarson) +- Implemented wxTreeCtrl::GetPrevVisible() in the generic version and made the + behaviour of GetNextSibling() consistent between wxMSW and generic versions wxGTK: diff --git a/docs/latex/wx/treectrl.tex b/docs/latex/wx/treectrl.tex index 26118922e6..e43750d483 100644 --- a/docs/latex/wx/treectrl.tex +++ b/docs/latex/wx/treectrl.tex @@ -332,7 +332,7 @@ will be sent which can be vetoed as well. \func{void}{EndEditLabel}{\param{bool }{cancelEdit}} -Ends label editing. If {\it cancelEdit} is {\tt true}, the edit will be cancelled. +Ends label editing. If {\it cancelEdit} is \true, the edit will be cancelled. This function is currently supported under Windows only. @@ -371,13 +371,13 @@ Expands the given item and all its children recursively. \membersection{wxTreeCtrl::GetBoundingRect}\label{wxtreectrlgetitemrect} -\constfunc{bool}{GetBoundingRect}{\param{const wxTreeItemId\&}{ item}, \param{wxRect\& }{rect}, \param{bool }{textOnly = {\tt false}}} +\constfunc{bool}{GetBoundingRect}{\param{const wxTreeItemId\&}{ item}, \param{wxRect\& }{rect}, \param{bool }{textOnly = \false}} -Retrieves the rectangle bounding the {\it item}. If {\it textOnly} is {\tt true}, +Retrieves the rectangle bounding the {\it item}. If {\it textOnly} is \true, only the rectangle around the item's label will be returned, otherwise the item's image is also taken into account. -The return value is {\tt true} if the rectangle was successfully retrieved or {\tt false} +The return value is \true if the rectangle was successfully retrieved or \false if it was not (in this case {\it rect} is not changed) -- for example, if the item is currently invisible. @@ -404,9 +404,9 @@ This function is only available in the generic version. \membersection{wxTreeCtrl::GetChildrenCount}\label{wxtreectrlgetchildrencount} -\constfunc{unsigned int}{GetChildrenCount}{\param{const wxTreeItemId\&}{ item}, \param{bool}{ recursively = {\tt true}}} +\constfunc{unsigned int}{GetChildrenCount}{\param{const wxTreeItemId\&}{ item}, \param{bool}{ recursively = \true}} -Returns the number of items in the branch. If {\it recursively} is {\tt true}, returns the total number +Returns the number of items in the branch. If {\it recursively} is \true, returns the total number of descendants, otherwise only one level of children is counted. @@ -439,7 +439,7 @@ to make these functions reentrant (i.e. allow more than one enumeration on one and the same object simultaneously). The cookie passed to GetFirstChild and GetNextChild should be the same variable. -Returns an invalid tree item (i.e. IsOk() returns {\tt false}) if there are no further children. +Returns an invalid tree item (i.e. IsOk() returns \false) if there are no further children. \wxheading{See also} @@ -603,7 +603,10 @@ Returns an invalid tree item if there are no further siblings. \constfunc{wxTreeItemId}{GetNextVisible}{\param{const wxTreeItemId\&}{ item}} -Returns the next visible item. +Returns the next visible item or an invalid item if this item is the last +visible one. + +Notice that the \arg{item} itself must be visible. \membersection{wxTreeCtrl::GetItemParent}\label{wxtreectrlgetitemparent} @@ -630,7 +633,10 @@ Returns an invalid tree item if there are no further children. \constfunc{wxTreeItemId}{GetPrevVisible}{\param{const wxTreeItemId\&}{ item}} -Returns the previous visible item. +Returns the previous visible item or an invalid item if this item is the first +visible one. + +Notice that the \arg{item} itself must be visible. \membersection{wxTreeCtrl::GetQuickBestSize}\label{wxtreectrlgetquickbestsize} @@ -656,8 +662,8 @@ Returns the root item for the tree control. \constfunc{int}{GetItemSelectedImage}{\param{const wxTreeItemId\& }{item}} -Gets the selected item image (this function is obsolete, use -{\tt GetItemImage(item, wxTreeItemIcon\_Selected}) instead). +Gets the selected item image (this function is obsolete, use +{\tt GetItemImage(item, wxTreeItemIcon\_Selected)} instead). \membersection{wxTreeCtrl::GetSelection}\label{wxtreectrlgetselection} @@ -747,7 +753,7 @@ both selected and unselected items. \constfunc{bool}{IsBold}{\param{const wxTreeItemId\& }{item}} -Returns {\tt true} if the given item is in bold state. +Returns \true if the given item is in bold state. See also: \helpref{SetItemBold}{wxtreectrlsetitembold} @@ -763,28 +769,28 @@ Returns \true if the control is empty (i.e. has no items, even no root one). \constfunc{bool}{IsExpanded}{\param{const wxTreeItemId\&}{ item}} -Returns {\tt true} if the item is expanded (only makes sense if it has children). +Returns \true if the item is expanded (only makes sense if it has children). \membersection{wxTreeCtrl::IsSelected}\label{wxtreectrlisselected} \constfunc{bool}{IsSelected}{\param{const wxTreeItemId\&}{ item}} -Returns {\tt true} if the item is selected. +Returns \true if the item is selected. \membersection{wxTreeCtrl::IsVisible}\label{wxtreectrlisvisible} \constfunc{bool}{IsVisible}{\param{const wxTreeItemId\&}{ item}} -Returns {\tt true} if the item is visible (it might be outside the view, or not expanded). +Returns \true if the item is visible on the screen. \membersection{wxTreeCtrl::ItemHasChildren}\label{wxtreectrlitemhaschildren} \constfunc{bool}{ItemHasChildren}{\param{const wxTreeItemId\&}{ item}} -Returns {\tt true} if the item has children. +Returns \true if the item has children. \membersection{wxTreeCtrl::OnCompareItems}\label{wxtreectrloncompareitems} @@ -879,9 +885,9 @@ Sets the colour of the item's background. \membersection{wxTreeCtrl::SetItemBold}\label{wxtreectrlsetitembold} -\func{void}{SetItemBold}{\param{const wxTreeItemId\& }{item}, \param{bool}{ bold = {\tt true}}} +\func{void}{SetItemBold}{\param{const wxTreeItemId\& }{item}, \param{bool}{ bold = \true}} -Makes item appear in bold font if {\it bold} parameter is {\tt true} or resets it to +Makes item appear in bold font if {\it bold} parameter is \true or resets it to the normal state. See also: \helpref{IsBold}{wxtreectrlisbold} @@ -911,7 +917,7 @@ tree->GetItemData(item)->SetData(data).} \membersection{wxTreeCtrl::SetItemDropHighlight}\label{wxtreectrlsetitemdrophighlight} -\func{void}{SetItemDropHighlight}{\param{const wxTreeItemId\&}{ item}, \param{bool}{highlight = {\tt true}}} +\func{void}{SetItemDropHighlight}{\param{const wxTreeItemId\&}{ item}, \param{bool}{highlight = \true}} Gives the item the visual feedback for Drag'n'Drop actions, which is useful if something is dragged from the outside onto the tree control @@ -933,7 +939,7 @@ although font attributes may vary. \membersection{wxTreeCtrl::SetItemHasChildren}\label{wxtreectrlsetitemhaschildren} -\func{void}{SetItemHasChildren}{\param{const wxTreeItemId\&}{ item}, \param{bool }{hasChildren = {\tt true}}} +\func{void}{SetItemHasChildren}{\param{const wxTreeItemId\&}{ item}, \param{bool }{hasChildren = \true}} Force appearance of the button next to the item. This is useful to allow the user to expand the items which don't have any children now, @@ -954,7 +960,8 @@ for the description of the {\it which} parameter. \func{void}{SetItemSelectedImage}{\param{const wxTreeItemId\&}{ item}, \param{int }{selImage}} -Sets the selected item image (this function is obsolete, use {\tt SetItemImage(item, wxTreeItemIcon\_Selected}) instead). +Sets the selected item image (this function is obsolete, use +{\tt SetItemImage(item, wxTreeItemIcon\_Selected)} instead). \membersection{wxTreeCtrl::SetItemText}\label{wxtreectrlsetitemtext} diff --git a/samples/treectrl/treetest.cpp b/samples/treectrl/treetest.cpp index ff909cd97e..307b3de575 100644 --- a/samples/treectrl/treetest.cpp +++ b/samples/treectrl/treetest.cpp @@ -111,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() @@ -140,7 +147,7 @@ BEGIN_EVENT_TABLE(MyTreeCtrl, wxTreeCtrl) 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... + // 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, @@ -254,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(); @@ -701,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()); diff --git a/samples/treectrl/treetest.h b/samples/treectrl/treetest.h index 5546561ad2..2d6e989211 100644 --- a/samples/treectrl/treetest.h +++ b/samples/treectrl/treetest.h @@ -225,6 +225,18 @@ public: void OnToggleIcon(wxCommandEvent& event); + void OnShowFirstVisible(wxCommandEvent& WXUNUSED(event)) + { DoShowFirstOrLast(&wxTreeCtrl::GetFirstVisibleItem, "first visible"); } +#ifdef wxHAS_LAST_VISIBLE // we don't have it currently but may add later + void OnShowLastVisible(wxCommandEvent& WXUNUSED(event)) + { DoShowFirstOrLast(&wxTreeCtrl::GetLastVisibleItem, "last visible"); } +#endif // wxHAS_LAST_VISIBLE + + void OnShowNextVisible(wxCommandEvent& WXUNUSED(event)) + { DoShowNextOrPrev(&wxTreeCtrl::GetNextVisible, "next visible"); } + void OnShowPrevVisible(wxCommandEvent& WXUNUSED(event)) + { DoShowNextOrPrev(&wxTreeCtrl::GetPrevVisible, "previous visible"); } + void OnIdle(wxIdleEvent& event); void OnSize(wxSizeEvent& event); @@ -238,6 +250,14 @@ private: void CreateTreeWithDefStyle(); void CreateTree(long style); + // common parts of OnShowFirst/LastVisible() and OnShowNext/PrevVisible() + typedef wxTreeItemId (wxTreeCtrl::*TreeFunc0_t)() const; + void DoShowFirstOrLast(TreeFunc0_t pfn, const wxString& label); + + typedef wxTreeItemId (wxTreeCtrl::*TreeFunc1_t)(const wxTreeItemId&) const; + void DoShowNextOrPrev(TreeFunc1_t pfn, const wxString& label); + + wxPanel *m_panel; MyTreeCtrl *m_treeCtrl; #if wxUSE_LOG @@ -297,5 +317,9 @@ enum TreeTest_Select, TreeTest_Unselect, TreeTest_SelectRoot, + TreeTest_ShowFirstVisible, + TreeTest_ShowLastVisible, + TreeTest_ShowNextVisible, + TreeTest_ShowPrevVisible, TreeTest_Ctrl = 1000 }; diff --git a/src/generic/treectlg.cpp b/src/generic/treectlg.cpp index 31c980e91f..87a01089a1 100644 --- a/src/generic/treectlg.cpp +++ b/src/generic/treectlg.cpp @@ -1315,6 +1315,7 @@ wxTreeItemId wxGenericTreeCtrl::GetFirstVisibleItem() const wxTreeItemId wxGenericTreeCtrl::GetNextVisible(const wxTreeItemId& item) const { wxCHECK_MSG( item.IsOk(), wxTreeItemId(), wxT("invalid tree item") ); + wxASSERT_MSG( IsVisible(item), wxT("this item itself should be visible") ); wxTreeItemId id = item; if (id.IsOk()) @@ -1331,10 +1332,37 @@ wxTreeItemId wxGenericTreeCtrl::GetNextVisible(const wxTreeItemId& item) const wxTreeItemId wxGenericTreeCtrl::GetPrevVisible(const wxTreeItemId& item) const { wxCHECK_MSG( item.IsOk(), wxTreeItemId(), wxT("invalid tree item") ); + wxASSERT_MSG( IsVisible(item), wxT("this item itself should be visible") ); - wxFAIL_MSG(wxT("not implemented")); + // find out the starting point + wxTreeItemId prevItem = GetPrevSibling(item); + if ( !prevItem.IsOk() ) + { + prevItem = GetItemParent(item); + } - return wxTreeItemId(); + // find the first visible item after it + while ( prevItem.IsOk() && !IsVisible(prevItem) ) + { + prevItem = GetNext(prevItem); + if ( !prevItem.IsOk() || prevItem == item ) + { + // there are no visible items before item + return wxTreeItemId(); + } + } + + // from there we must be able to navigate until this item + while ( prevItem.IsOk() ) + { + const wxTreeItemId nextItem = GetNextVisible(prevItem); + if ( !nextItem.IsOk() || nextItem == item ) + break; + + prevItem = nextItem; + } + + return prevItem; } // called by wxTextTreeCtrl when it marks itself for deletion diff --git a/src/msw/treectrl.cpp b/src/msw/treectrl.cpp index 96bf25a0b5..f7e310659d 100644 --- a/src/msw/treectrl.cpp +++ b/src/msw/treectrl.cpp @@ -1354,7 +1354,15 @@ wxTreeItemId wxTreeCtrl::GetNextVisible(const wxTreeItemId& item) const wxCHECK_MSG( item.IsOk(), wxTreeItemId(), wxT("invalid tree item") ); wxASSERT_MSG( IsVisible(item), wxT("The item you call GetNextVisible() for must be visible itself!")); - return wxTreeItemId(TreeView_GetNextVisible(GetHwnd(), HITEM(item))); + wxTreeItemId next(TreeView_GetNextVisible(GetHwnd(), HITEM(item))); + if ( next.IsOk() && !IsVisible(next) ) + { + // Win32 considers that any non-collapsed item is visible while we want + // to return only really visible items + next.Unset(); + } + + return next; } wxTreeItemId wxTreeCtrl::GetPrevVisible(const wxTreeItemId& item) const @@ -1362,7 +1370,15 @@ wxTreeItemId wxTreeCtrl::GetPrevVisible(const wxTreeItemId& item) const wxCHECK_MSG( item.IsOk(), wxTreeItemId(), wxT("invalid tree item") ); wxASSERT_MSG( IsVisible(item), wxT("The item you call GetPrevVisible() for must be visible itself!")); - return wxTreeItemId(TreeView_GetPrevVisible(GetHwnd(), HITEM(item))); + wxTreeItemId prev(TreeView_GetPrevVisible(GetHwnd(), HITEM(item))); + if ( prev.IsOk() && !IsVisible(prev) ) + { + // just as above, Win32 function will happily return the previous item + // in the tree for the first visible item too + prev.Unset(); + } + + return prev; } // ----------------------------------------------------------------------------