What you talkin' 'bout, class view?

Every once in a while I get mail asking how to find what is selected within the class
view window. For a while I was telling everybody who asked that it was not possible
because there is not an automation model on the class view window. But recently I
stumbled across a way of finding out what is selected through another part of the
object model. This works for C# and VC projects, but not for VB or J# (we will see
why in a minute).

When an item is selected in the class view tool window, and the project that item
is contained within is a C# or VC project, either the code model element or the Project
object for that item is placed into the properties window. Since a System.Object/IDispatch
can be retrieved for what is displayed within the properties window with
the DTE.SelectedItems.SelectionContainer property, you can write code such as shown
in the following macro to inspect the selected item to find out more information about
what is selected:

    Sub"urn:schemas-microsoft-com:office:office" /> classwindow()

        Dim cc As CodeClass

        Dim cn As CodeNamespace

        Dim cp As CodeProperty

        Dim cf As CodeAttribute

        Dim proj As Project

        Dim obj As Object

        obj
= DTE.SelectedItems.SelectionContainer.Item(1)

        Try

            proj
= obj

        Catch ex1 As System.Exception

            Try

                cc
= obj

            Catch ex2 As System.Exception

                Try

                    cn
= obj

                Catch ex3 As System.Exception

                    Try

                        cf
= obj

                    Catch ex4 As System.Exception

                        Try

                            cp
= obj

                        Catch ex5 As System.Exception

                            MsgBox("Unknown
type")

                        End Try

                    End Try

                End Try

            End Try

        End Try

    End Sub

As I said, this only works for C# and VC projects, but not VB or J# ones. Why? Because
those two languages don’t
push an item into the class view window, and without that item in the properties window,
there is nothing to retrieve.