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.

  1. Go to "Tools->Macros->Macros IDE".
  2. In "Macros IDE", select the "MyMacros" module and go to "Project->Add Existing Item..." and browse for the attached file.
  3. 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


Downloads

Comments

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

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • On-Demand eSeminar DevOps and Cloud are all the rage in IT, but the two terms relating process and computing aren't mutually exclusive. Join us to see how your movement into cloud changes the way you develop, deploy, test and manage, and how DevOps can actually be a good thing when coupled with cloud.

  • On-demand Event Event Date: May 18, 2015 While the idea of using facial and/or gesture recognition to create a modern, intuitive game seems attractive, some developers may want to leverage Unity 3D as a way to accelerate their development efforts. There are many different ways in which Intel and Unity Technologies have been working together to help speed the development of games with the Intel&reag; RealSense™ SDK (software developer kit). Check out this webcast to join a panel of experts as they …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date