]> git.saurik.com Git - wxWidgets.git/commitdiff
made wxTreeCtrl::GetNextVisible() behave in the same way in Win32 as in the generic...
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 7 Oct 2007 21:58:51 +0000 (21:58 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 7 Oct 2007 21:58:51 +0000 (21:58 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49085 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
docs/latex/wx/treectrl.tex
samples/treectrl/treetest.cpp
samples/treectrl/treetest.h
src/generic/treectlg.cpp
src/msw/treectrl.cpp

index cf36c9349aecc0a6c239097a64248a572bfddb2e..f172e17df6e2ad7ad5c74587163732fcf25d6cd2 100644 (file)
@@ -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:
 
index 26118922e6dde8917faa32c4f95bd61581518697..e43750d483b7c8e38dc6ef3f1836919fba9fd750 100644 (file)
@@ -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}
index ff909cd97e8b476bce2dec0e97a2df37ef55d179..307b3de5753821c8a9818225c0313aba681ac8ae 100644 (file)
@@ -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 &not 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());
index 5546561ad20f96ad58c27c9bb9c2ace09729079f..2d6e9892118f09fd5bd06c5f4dc74168704e3e70 100644 (file)
@@ -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
 };
index 31c980e91ff5ccfbb184887df36aacadd46faaa1..87a01089a1de020f8d9126115c9c9a5cf7dcdbf8 100644 (file)
@@ -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
index 96bf25a0b5eea4df84a659bf0462327f9cb0686b..f7e310659d81e51030f04a68a37d448a8fb93444 100644 (file)
@@ -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;
 }
 
 // ----------------------------------------------------------------------------