Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

macro collapse all in solution visual studio 2010

I found the CollapseAll macro online that has worked for me in vs2005 and vs2008. However, this half way works in vs2010. It looks like it only collapses the top nodes and not any subnodes that may be expanded? any ideas?

Thanks, rod.

    Sub CollapseAll()
        ' Get the the Solution Explorer tree
        Dim UIHSolutionExplorer As UIHierarchy
        UIHSolutionExplorer = DTE.Windows.Item(Constants.vsext_wk_SProjectWindow).Object()
        ' Check if there is any open solution
        If (UIHSolutionExplorer.UIHierarchyItems.Count = 0) Then
            ' MsgBox("Nothing to collapse. You must have an open solution.")
            Return
        End If
        ' Get the top node (the name of the solution)
        Dim UIHSolutionRootNode As UIHierarchyItem
        UIHSolutionRootNode = UIHSolutionExplorer.UIHierarchyItems.Item(1)
        UIHSolutionRootNode.DTE.SuppressUI = True
        ' Collapse each project node
        Dim UIHItem As UIHierarchyItem
        For Each UIHItem In UIHSolutionRootNode.UIHierarchyItems
            'UIHItem.UIHierarchyItems.Expanded = False
            If UIHItem.UIHierarchyItems.Expanded Then
                Collapse(UIHItem)
            End If
        Next
        ' Select the solution node, or else when you click 
        ' on the solution window
        ' scrollbar, it will synchronize the open document 
        ' with the tree and pop
        ' out the corresponding node which is probably not what you want.
        UIHSolutionRootNode.Select(vsUISelectionType.vsUISelectionTypeSelect)
        UIHSolutionRootNode.DTE.SuppressUI = False
    End Sub

    Private Sub Collapse(ByVal item As UIHierarchyItem)
        For Each eitem As UIHierarchyItem In item.UIHierarchyItems
            If eitem.UIHierarchyItems.Expanded AndAlso eitem.UIHierarchyItems.Count > 0 Then
                Collapse(eitem)
            End If
        Next
        item.UIHierarchyItems.Expanded = False
    End Sub
End Module
like image 456
Rod Avatar asked Dec 28 '22 16:12

Rod


2 Answers

(Yes, I know you marked the other answer as accepted, but technically that wasn't answering your coding question, albeit it did give you an answer. This however is what you originally asked.)

Actually, I don't think this would have worked in any version of Visual Studio because the logic in your Collapse function is wrong. Same with the initial loop in the project (which I'm not sure why you just didn't pass the solution node to the collapse function anyway...)

Specifically, you're checking if it's expanded before delving in to the children, so if a folder is collapsed but its children are expanded, it won't go inside and collapse the children as your check causes that to be skipped. Just check the count. After all you DO want to delve in to everything to collapse.

Here's a version I created using yours as a starting point. I also added the ability to re-select the selected item if there is one. I like having the item I'm working on selected. And if I want everything collapsed, I either select the root node, or I deselect everything, in both cases it then selects the root (the solution node).

I also added the MultiBeep function for audible feedback since I'm not a fan of message boxes. 2 beeps is success, 3 means you don't have a solution open.

Sub CollapseSolutionTree()

  ' Get the the Solution Explorer tree
    Dim SolutionExplorer As UIHierarchy = DTE.Windows.Item(Constants.vsext_wk_SProjectWindow).Object()

  ' Check if there is any open solution
    If (SolutionExplorer.UIHierarchyItems.Count = 0) Then
        MultiBeep(3)
        Return
    End If

  ' Get the selected node (if any)
    Dim SelectedNode As UIHierarchyItem
    Try
        SelectedNode = SolutionExplorer.SelectedItems(0)
    Catch
    End Try

  ' Get the top node (the name of the solution)
    Dim SolutionNode As UIHierarchyItem = SolutionExplorer.UIHierarchyItems.Item(1)
    SolutionNode.DTE.SuppressUI = True

  ' Collapse the solution tree
    CollapseSolutionExplorerNode(SolutionNode)

  ' If there was a selected item before the command, re-select it.  Otherwise select the solution node.
    If SelectedNode isnot Nothing
        SelectedNode.Select(vsUISelectionType.vsUISelectionTypeSelect)
    Else
        SolutionNode.Select(vsUISelectionType.vsUISelectionTypeSelect)
    End If

    SolutionNode.DTE.SuppressUI = False

    MultiBeep(2)

End Sub

Private Sub CollapseSolutionExplorerNode(ByVal Folder As UIHierarchyItem)

    For Each Subfolder As UIHierarchyItem In Folder.UIHierarchyItems
        If Subfolder.UIHierarchyItems.Count Then CollapseSolutionExplorerNode(Subfolder)
    Next

    Folder.UIHierarchyItems.Expanded = False

End Sub

Private Sub MultiBeep(Count As Integer, Optional Spacing As Integer = 100)
    Beep
    For I = 2 to Count
        System.Threading.Thread.CurrentThread.Sleep(Spacing)
        Beep
    Next
End Sub

HTH,

Mark

like image 55
Mark A. Donohoe Avatar answered Jan 16 '23 07:01

Mark A. Donohoe


There's a VS2010 extension at Sara Ford's blog:

http://blogs.msdn.com/b/saraford/archive/2010/05/13/collapse-selection-in-solution-explorer-extension-7.aspx

like image 30
openshac Avatar answered Jan 16 '23 06:01

openshac