Tip: Switch Between Source and Header C++ Files
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. 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

Comments
There are no comments yet. Be the first to comment!