Just for a reminder. If you needed, please note the originally referenced.
If it doesn't work, restart the visual studio and try again.
I was looking for a macro just to be able to switch quickly between a "cpp" and a "h" file. I found several, but they didn't work as I wanted. Some of them just look into the current folder for the partner file; this is a problem if you have some folder structure in your project.
I created two macros. The first one, "Proj_Switch_header_source," looks for the partner file in the project where the original file is. The second one, "Sln_Switch_header_source," looks for the partner file in the whole solution.
I use the first one all the time because normally in the structure of my projects the "cpp" and "h" files are in the same project. The second macro is less interesting but might be useful for other project structures where the "cpp" and "h" files are scattered in different projects in the same solution.
How to Install the Macros
These macros has been tested in Visual Studio 2005/2008/2010. I don't know whether they work in other versions.
- Go to "Tools->Macros->Macros IDE".
- In "Macros IDE", select the "MyMacros" module and go to "Project->Add Existing Item..." and browse for the attached file.
- Now, the macros are ready to use. You can do it just running them from the "Macro Explorer" or just attaching a shortcut to them. To attach a shortcut to the macros, close the "Macros IDE" and go back to Visual Studio, and then go to "Tools->Options" and click the "Keyboard" panel. In the "Show commands containing" field, type the name of the macros (given above), click on the macro, and assign a shortcut.
The Code
- Imports System
- Imports EnvDTE
- Imports EnvDTE80
- Imports System.Diagnostics
- Public Module Navigating
- '//
- '// Angel Tena
- '// Next Limit Technologies 1998
- '// Given a source or header file looks for the partner file
- '// in the current project and opens it.
- '//
- Sub Proj_Switch_header_source()
- Dim fileName As String
- Dim fileNamePartner As String
- Dim projItem As ProjectItem = DTE.ActiveDocument.ProjectItem
- Dim proj As Project = projItem.ContainingProject
- fileName = DTE.ActiveDocument.Name.ToLower
- If (fileName.EndsWith(".h")) Then
- fileNamePartner = _
- fileName.Substring(0, fileName.Length() - 2) + ".cpp"
- End If
- If (fileName.EndsWith(".cpp")) Then
- fileNamePartner = _
- fileName.Substring(0, fileName.Length() - 4) + ".h"
- End If
- Dim filePathPartner As String
- Dim projItems As ProjectItems
- projItems = proj.ProjectItems
- FindFile(fileNamePartner, filePathPartner, projItems, 0)
- If Not filePathPartner Is Nothing Then
- DTE.ItemOperations.OpenFile(filePathPartner)
- End If
- If filePathPartner Is Nothing Then
- MsgBox("File " & fileNamePartner & _
- " not found in the project")
- End If
- End Sub
- '//
- '// Angel Tena
- '// Next Limit Technologies 1998
- '// Given a source or header file looks for the partner file
- '// in the whole solution and opens it.
- '//
- Sub Sln_Switch_header_source()
- Dim fileName As String
- Dim fileNamePartner As String
- fileName = DTE.ActiveDocument.Name.ToLower
- If (fileName.EndsWith(".h")) Then
- fileNamePartner = _
- fileName.Substring(0, fileName.Length() - 2) + ".cpp"
- End If
- If (fileName.EndsWith(".cpp")) Then
- fileNamePartner = _
- fileName.Substring(0, fileName.Length() - 4) + ".h"
- End If
- Dim soln As Solution = DTE.Solution
- Dim projs As Projects = soln.Projects
- Dim proj As Project
- Dim filePathPartner As String
- For Each proj In projs
- Dim projItems As ProjectItems
- projItems = proj.ProjectItems
- FindFile(fileNamePartner, filePathPartner, projItems, 0)
- If Not filePathPartner Is Nothing Then
- DTE.ItemOperations.OpenFile(filePathPartner)
- Exit For
- End If
- Next
- If filePathPartner Is Nothing Then
- MsgBox("File " & fileNamePartner & _
- " not found in the solution")
- End If
- End Sub
- Sub FindFile(ByVal fileName As String, _
- ByRef filePath As String, _
- ByVal projitems As ProjectItems, _
- ByVal Level As Integer)
- Dim projItem As ProjectItem
- For Each projItem In projitems
- Dim projItemName As String = projItem.Name.ToLower
- If projItemName.Equals(fileName) Then
- filePath = projItem.FileNames(1)
- Return
- End If
- Dim projItems2 As ProjectItems = projItem.ProjectItems
- Dim notsubcoll As Boolean = projItems2 Is Nothing
- If Not notsubcoll Then
- FindFile(fileName, filePath, projItems2, Level + 1)
- End If
- Next
- End Sub
- End Module