<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>IIrrelevant - Macros</title>
    <link>http://www.milkcarton.com/blog/</link>
    <description>Irrelevant musings about software development</description>
    <language>en-us</language>
    <copyright>Dan Morphis</copyright>
    <lastBuildDate>Mon, 27 Aug 2007 04:56:04 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>blog@milkcarton.com</managingEditor>
    <webMaster>blog@milkcarton.com</webMaster>
    <item>
      <trackback:ping>http://www.milkcarton.com/blog/Trackback.aspx?guid=1e707a99-6d90-4d04-984d-988d378137b3</trackback:ping>
      <pingback:server>http://www.milkcarton.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.milkcarton.com/blog/PermaLink,guid,1e707a99-6d90-4d04-984d-988d378137b3.aspx</pingback:target>
      <dc:creator>Dan Morphis</dc:creator>
      <wfw:comment>http://www.milkcarton.com/blog/CommentView,guid,1e707a99-6d90-4d04-984d-988d378137b3.aspx</wfw:comment>
      <wfw:commentRss>http://www.milkcarton.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=1e707a99-6d90-4d04-984d-988d378137b3</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I downloaded the very excellent Resource Refactoring Tool (<a title="http://www.codeplex.com/ResourceRefactoring" href="http://www.codeplex.com/ResourceRefactoring">http://www.codeplex.com/ResourceRefactoring</a>)
the other day.  It works great in code files, but I found that it didn't work
at all for ASPX/HTML pages.  Seeing this as a challenge, I decided to hack something
up in VBA to automatically extract the selected text, create a resx name for the text,
add it to the resource file, and insert the ASP.NET literal control.
</p>
        <h3>How to use it
</h3>
        <p>
This is split up into two different macro modules, one named Utilities, and the other
named what ever you want.  Then add them to your Visual Studio tool bar so you
have something convenient you can click on (Right click the tool bar, click Customize,
click Commands, then Macros under categories, find what you named the macro and then
drag it up to your tool bar.  You can either drag it to an existing tool strip,
or create your own.  Finally right click on the item while still in customize
mode and add an image).
</p>
        <p>
 
</p>
        <p>
Caller:
</p>
        <p>
        </p>
        <div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:1329ba2c-a1eb-4272-be95-d8be9e1e94a7" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
          <pre style="background-color:#FFFF80;">
            <div>
              <!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
              <span style="color: #0000FF; ">Imports</span>
              <span style="color: #000000; "> System </span>
              <span style="color: #0000FF; ">Imports</span>
              <span style="color: #000000; "> EnvDTE </span>
              <span style="color: #0000FF; ">Imports</span>
              <span style="color: #000000; "> EnvDTE80 </span>
              <span style="color: #0000FF; ">Imports</span>
              <span style="color: #000000; "> System.Diagnostics </span>
              <span style="color: #0000FF; ">Public</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Module</span>
              <span style="color: #000000; "> MoreMacros </span>
              <span style="color: #0000FF; ">Public</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Sub</span>
              <span style="color: #000000; "> AspTextLiteral() </span>
              <span style="color: #0000FF; ">Dim</span>
              <span style="color: #000000; "> resx </span>
              <span style="color: #0000FF; ">as</span>
              <span style="color: #000000; "> ProjectItem </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; "> DTE.ActiveWindow.Object.GetItem(</span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">solution\project\folder\ResourceFile.resx</span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">)
Utilities.AspTextLiteral(resx) </span>
              <span style="color: #0000FF; ">End Sub</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Public</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Sub</span>
              <span style="color: #000000; "> InQuoteLiteral()
DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate() </span>
              <span style="color: #0000FF; ">Dim</span>
              <span style="color: #000000; "> resx </span>
              <span style="color: #0000FF; ">as</span>
              <span style="color: #000000; "> ProjectItem </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; "> DTE.ActiveWindow.Object.GetItem(</span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">solution\project\folder\ResourceFile.resx</span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">)
Utilities.InQuoteLiteral(resx) </span>
              <span style="color: #0000FF; ">End Sub</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">End
Module</span>
              <span style="color: #000000; ">
              </span>
            </div>
          </pre>
        </div>
        <p>
Utilities: 
</p>
        <div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:7d5c45be-dc14-4893-a3ac-dcbe121d224d" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
          <pre style="background-color:#FFFF80;">
            <div>
              <!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
              <span style="color: #0000FF; ">Imports</span>
              <span style="color: #000000; "> System </span>
              <span style="color: #0000FF; ">Imports</span>
              <span style="color: #000000; "> EnvDTE </span>
              <span style="color: #0000FF; ">Imports</span>
              <span style="color: #000000; "> EnvDTE80 </span>
              <span style="color: #0000FF; ">Imports</span>
              <span style="color: #000000; "> System.Diagnostics </span>
              <span style="color: #0000FF; ">Imports</span>
              <span style="color: #000000; "> System.Xml </span>
              <span style="color: #0000FF; ">Public</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Module</span>
              <span style="color: #000000; "> Utilities </span>
              <span style="color: #0000FF; ">Public</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Sub</span>
              <span style="color: #000000; "> AspTextLiteral(</span>
              <span style="color: #0000FF; ">ByRef</span>
              <span style="color: #000000; "> resourceFile </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; "> ProjectItem) </span>
              <span style="color: #0000FF; ">Const</span>
              <span style="color: #000000; "> literalFormat </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">&lt;asp:Literal
runat=""server"" Text=""&lt;%$ Resources:{0},{1}%&gt;""
/&gt;</span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Const</span>
              <span style="color: #000000; "> inQuotesFormat </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">&lt;%$
Resources:{0},{1}%&gt;</span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; "> LiteralReplacer(resourceFile,
literalFormat, </span>
              <span style="color: #000000; ">4</span>
              <span style="color: #000000; ">) </span>
              <span style="color: #0000FF; ">End
Sub</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Public</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Sub</span>
              <span style="color: #000000; "> InQuoteLiteral(</span>
              <span style="color: #0000FF; ">ByRef</span>
              <span style="color: #000000; "> resourceFile </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; "> ProjectItem) </span>
              <span style="color: #0000FF; ">Const</span>
              <span style="color: #000000; "> inQuotesFormat </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">&lt;%$
Resources:{0},{1}%&gt;</span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; "> LiteralReplacer(resourceFile,
inQuotesFormat, </span>
              <span style="color: #000000; ">3</span>
              <span style="color: #000000; ">) </span>
              <span style="color: #0000FF; ">End
Sub</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Private</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Sub</span>
              <span style="color: #000000; "> LiteralReplacer(</span>
              <span style="color: #0000FF; ">ByRef</span>
              <span style="color: #000000; "> resourceFile </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; "> ProjectItem, </span>
              <span style="color: #0000FF; ">ByVal</span>
              <span style="color: #000000; "> template </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">String</span>
              <span style="color: #000000; ">, </span>
              <span style="color: #0000FF; ">ByVal</span>
              <span style="color: #000000; "> delete </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; "> Int16) </span>
              <span style="color: #0000FF; ">Dim</span>
              <span style="color: #000000; "> ts </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; "> TextSelection </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; "> DTE.ActiveDocument.Selection </span>
              <span style="color: #0000FF; ">Dim</span>
              <span style="color: #000000; "> name </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">String</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; "> StripNonAllowedChars(ts.Text).Trim.ToLower </span>
              <span style="color: #0000FF; ">Dim</span>
              <span style="color: #000000; "> value </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">String</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; "> ts.Text </span>
              <span style="color: #0000FF; ">Dim</span>
              <span style="color: #000000; "> path </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">String</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; "> resourceFile.Properties.Item(</span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">LocalPath</span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">).Value </span>
              <span style="color: #0000FF; ">Dim</span>
              <span style="color: #000000; "> resName </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">String</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; "> System.IO.Path.GetFileNameWithoutExtension(resourceFile.Name)
name </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; "> AddResourceEntry(path,
name, value) ts.Text </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">String</span>
              <span style="color: #000000; ">.Format(template,
resName, name) DTE.ActiveDocument.Selection.Delete(delete) </span>
              <span style="color: #0000FF; ">End
Sub</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #008000; ">'</span>
              <span style="color: #008000; ">Returns
the value of the name used</span>
              <span style="color: #008000; ">
              </span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Public</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Function</span>
              <span style="color: #000000; "> AddResourceEntry(</span>
              <span style="color: #0000FF; ">ByRef</span>
              <span style="color: #000000; "> resourceFilePath </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">String</span>
              <span style="color: #000000; ">, </span>
              <span style="color: #0000FF; ">ByVal</span>
              <span style="color: #000000; "> name </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">String</span>
              <span style="color: #000000; ">, </span>
              <span style="color: #0000FF; ">ByVal</span>
              <span style="color: #000000; "> value </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">String</span>
              <span style="color: #000000; ">) </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">String</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Dim</span>
              <span style="color: #000000; "> doc </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; "> XmlDocument </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">New</span>
              <span style="color: #000000; "> XmlDocument
doc.Load(resourceFilePath) </span>
              <span style="color: #008000; ">'</span>
              <span style="color: #008000; ">See
if it exists first</span>
              <span style="color: #008000; ">
              </span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Dim</span>
              <span style="color: #000000; "> root </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; "> XmlElement </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; "> doc.DocumentElement </span>
              <span style="color: #0000FF; ">Dim</span>
              <span style="color: #000000; "> e </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; "> XmlElement </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; "> root.SelectSingleNode(</span>
              <span style="color: #0000FF; ">String</span>
              <span style="color: #000000; ">.Format(</span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">data[@name=""{0}""]</span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">,
name)) </span>
              <span style="color: #0000FF; ">If</span>
              <span style="color: #000000; "> e </span>
              <span style="color: #0000FF; ">Is</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Nothing</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Then</span>
              <span style="color: #000000; "> name </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; "> CreateUniqueName(root,
name) </span>
              <span style="color: #0000FF; ">Dim</span>
              <span style="color: #000000; "> elem </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; "> XmlElement </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; "> CreateResourceFileElement(doc,
name, value) root.AppendChild(elem) </span>
              <span style="color: #0000FF; ">Else</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">If</span>
              <span style="color: #000000; "> e.SelectSingleNode(</span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">value</span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">).InnerText.ToLower </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; "> value.ToLower </span>
              <span style="color: #0000FF; ">Then</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Return</span>
              <span style="color: #000000; "> name </span>
              <span style="color: #0000FF; ">Else</span>
              <span style="color: #000000; "> name </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; "> CreateUniqueName(root,
name) </span>
              <span style="color: #0000FF; ">Dim</span>
              <span style="color: #000000; "> elem </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; "> XmlElement </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; "> CreateResourceFileElement(doc,
name, value) root.AppendChild(elem) </span>
              <span style="color: #0000FF; ">End</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">If</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">End</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">If</span>
              <span style="color: #000000; "> doc.Save(resourceFilePath) </span>
              <span style="color: #0000FF; ">Return</span>
              <span style="color: #000000; "> name </span>
              <span style="color: #0000FF; ">End
Function</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Private</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Function</span>
              <span style="color: #000000; "> CreateUniqueName(</span>
              <span style="color: #0000FF; ">ByRef</span>
              <span style="color: #000000; "> root </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; "> XmlElement, </span>
              <span style="color: #0000FF; ">ByVal</span>
              <span style="color: #000000; "> name </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">String</span>
              <span style="color: #000000; ">) </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">String</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">If</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">IsNumeric</span>
              <span style="color: #000000; ">(name.Substring(</span>
              <span style="color: #000000; ">0</span>
              <span style="color: #000000; ">, </span>
              <span style="color: #000000; ">1</span>
              <span style="color: #000000; ">)) </span>
              <span style="color: #0000FF; ">Then</span>
              <span style="color: #000000; "> name </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">n</span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #000000; ">&amp;</span>
              <span style="color: #000000; "> name </span>
              <span style="color: #0000FF; ">End</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">If</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #008000; ">'</span>
              <span style="color: #008000; ">Name
doesn't exist, use it</span>
              <span style="color: #008000; ">
              </span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">If</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Not</span>
              <span style="color: #000000; "> CheckNameExists(root,
name) </span>
              <span style="color: #0000FF; ">Then</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Return</span>
              <span style="color: #000000; "> name </span>
              <span style="color: #0000FF; ">End</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">If</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Dim</span>
              <span style="color: #000000; "> result </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">String</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #008000; ">'</span>
              <span style="color: #008000; ">Build
a unique name</span>
              <span style="color: #008000; ">
              </span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">For</span>
              <span style="color: #000000; "> I </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; "> Int16 </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #000000; ">1</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">To</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #000000; ">100</span>
              <span style="color: #000000; "> result </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; "> name </span>
              <span style="color: #000000; ">&amp;</span>
              <span style="color: #000000; "> I </span>
              <span style="color: #0000FF; ">If</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Not</span>
              <span style="color: #000000; "> CheckNameExists(root,
result) </span>
              <span style="color: #0000FF; ">Then</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Return</span>
              <span style="color: #000000; "> result </span>
              <span style="color: #0000FF; ">End</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">If</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Next</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Return</span>
              <span style="color: #000000; "> name </span>
              <span style="color: #000000; ">&amp;</span>
              <span style="color: #000000; "> Guid.NewGuid.ToString </span>
              <span style="color: #0000FF; ">End
Function</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Private</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Function</span>
              <span style="color: #000000; "> CheckNameExists(</span>
              <span style="color: #0000FF; ">ByRef</span>
              <span style="color: #000000; "> root </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; "> XmlElement, </span>
              <span style="color: #0000FF; ">ByVal</span>
              <span style="color: #000000; "> name </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">String</span>
              <span style="color: #000000; ">) </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Boolean</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Dim</span>
              <span style="color: #000000; "> e </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; "> XmlElement </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; "> root.SelectSingleNode(</span>
              <span style="color: #0000FF; ">String</span>
              <span style="color: #000000; ">.Format(</span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">data[@name=""{0}""]</span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">,
name)) </span>
              <span style="color: #0000FF; ">Return</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Not</span>
              <span style="color: #000000; "> (e </span>
              <span style="color: #0000FF; ">Is</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Nothing</span>
              <span style="color: #000000; ">) </span>
              <span style="color: #0000FF; ">End
Function</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Private</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Function</span>
              <span style="color: #000000; "> CreateResourceFileElement(</span>
              <span style="color: #0000FF; ">ByRef</span>
              <span style="color: #000000; "> doc </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; "> XmlDocument, </span>
              <span style="color: #0000FF; ">ByVal</span>
              <span style="color: #000000; "> name </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">String</span>
              <span style="color: #000000; ">, </span>
              <span style="color: #0000FF; ">ByVal</span>
              <span style="color: #000000; "> value </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">String</span>
              <span style="color: #000000; ">) </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; "> XmlElement </span>
              <span style="color: #0000FF; ">Dim</span>
              <span style="color: #000000; "> result </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; "> XmlElement </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; "> doc.CreateElement(</span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">data</span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">)
SetAttribute(result, </span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">name</span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">,
name) SetAttribute(result, </span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">xml:space</span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">, </span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">preserve</span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">) </span>
              <span style="color: #0000FF; ">Dim</span>
              <span style="color: #000000; "> valueElem </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; "> XmlElement </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; "> doc.CreateElement(</span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">value</span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">)
valueElem.InnerText </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; "> value
result.AppendChild(valueElem) </span>
              <span style="color: #0000FF; ">Return</span>
              <span style="color: #000000; "> result </span>
              <span style="color: #0000FF; ">End
Function</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Private</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Function</span>
              <span style="color: #000000; "> SetAttribute(</span>
              <span style="color: #0000FF; ">ByRef</span>
              <span style="color: #000000; "> element </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; "> XmlElement, </span>
              <span style="color: #0000FF; ">ByVal</span>
              <span style="color: #000000; "> attr </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">String</span>
              <span style="color: #000000; ">, </span>
              <span style="color: #0000FF; ">ByVal</span>
              <span style="color: #000000; "> value </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">String</span>
              <span style="color: #000000; ">) </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; "> XmlElement </span>
              <span style="color: #0000FF; ">If</span>
              <span style="color: #000000; "> element.Attributes.GetNamedItem(attr) </span>
              <span style="color: #0000FF; ">Is</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Nothing</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Then</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Dim</span>
              <span style="color: #000000; "> attrib </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; "> XmlAttribute </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; "> element.OwnerDocument.CreateAttribute(attr)
attrib.Value </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; "> value
element.Attributes.Append(attrib) </span>
              <span style="color: #0000FF; ">Else</span>
              <span style="color: #000000; "> element.Attributes.Item(attr).Value </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; "> value </span>
              <span style="color: #0000FF; ">End</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">If</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Return</span>
              <span style="color: #000000; "> element </span>
              <span style="color: #0000FF; ">End
Function</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Private</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Function</span>
              <span style="color: #000000; "> StripNonAllowedChars(</span>
              <span style="color: #0000FF; ">ByVal</span>
              <span style="color: #000000; "> text </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">String</span>
              <span style="color: #000000; ">) </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">String</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Const</span>
              <span style="color: #000000; "> non_allowed </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">""';:,&lt;.&gt;/?\|`~!@#$%^&amp;*()-=+[{]} </span>
              <span style="color: #000000; ">"</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">For</span>
              <span style="color: #000000; "> I </span>
              <span style="color: #0000FF; ">As</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Integer</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #000000; ">0</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">To</span>
              <span style="color: #000000; "> non_allowed.Length </span>
              <span style="color: #000000; ">-</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #000000; ">1</span>
              <span style="color: #000000; "> text </span>
              <span style="color: #000000; ">=</span>
              <span style="color: #000000; "> text.Replace(non_allowed(I).ToString, </span>
              <span style="color: #000000; ">""</span>
              <span style="color: #000000; ">) </span>
              <span style="color: #0000FF; ">Next</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">Return</span>
              <span style="color: #000000; "> text </span>
              <span style="color: #0000FF; ">End
Function</span>
              <span style="color: #000000; ">
              </span>
              <span style="color: #0000FF; ">End
Module</span>
              <span style="color: #000000; ">
              </span>
            </div>
          </pre>
        </div>
        <p>
 
</p>
        <div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:6c21f677-e872-405e-8840-6e23bfe78fbd" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">del.icio.us
Tags: <a href="http://del.icio.us/popular/VisualStudio" rel="tag">VisualStudio</a>, <a href="http://del.icio.us/popular/.NET" rel="tag">.NET</a>, <a href="http://del.icio.us/popular/Macros" rel="tag">Macros</a>, <a href="http://del.icio.us/popular/ASP.NET" rel="tag">ASP.NET</a></div>
        <img width="0" height="0" src="http://www.milkcarton.com/blog/aggbug.ashx?id=1e707a99-6d90-4d04-984d-988d378137b3" />
      </body>
      <title>ASP.NET Resource Refactoring</title>
      <guid isPermaLink="false">http://www.milkcarton.com/blog/PermaLink,guid,1e707a99-6d90-4d04-984d-988d378137b3.aspx</guid>
      <link>http://www.milkcarton.com/blog/2007/08/27/ASPNET+Resource+Refactoring.aspx</link>
      <pubDate>Mon, 27 Aug 2007 04:56:04 GMT</pubDate>
      <description>&lt;p&gt;
I&amp;nbsp;downloaded the very excellent Resource Refactoring Tool (&lt;a title="http://www.codeplex.com/ResourceRefactoring" href="http://www.codeplex.com/ResourceRefactoring"&gt;http://www.codeplex.com/ResourceRefactoring&lt;/a&gt;)
the other day.&amp;nbsp; It works great in code files, but I found that it didn't work
at all for ASPX/HTML pages.&amp;nbsp; Seeing this as a challenge, I decided to hack something
up in VBA to automatically extract the selected text, create a resx name for the text,
add it to the resource file, and insert the ASP.NET literal control.
&lt;/p&gt;
&lt;h3&gt;How to use it
&lt;/h3&gt;
&lt;p&gt;
This is split up into two different macro modules, one named Utilities, and the other
named what ever you want.&amp;nbsp; Then add them to your Visual Studio tool bar so you
have something convenient you can click on (Right click the tool bar, click Customize,
click Commands, then Macros under categories, find what you named the macro and then
drag it up to your tool bar.&amp;nbsp; You can either drag it to an existing tool strip,
or create your own.&amp;nbsp; Finally right click on the item while still in customize
mode and add an image).
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Caller:
&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:1329ba2c-a1eb-4272-be95-d8be9e1e94a7" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:#FFFF80;"&gt;
&lt;div&gt;
&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;Imports&lt;/span&gt;&lt;span style="color: #000000; "&gt; System &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Imports&lt;/span&gt;&lt;span style="color: #000000; "&gt; EnvDTE &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Imports&lt;/span&gt;&lt;span style="color: #000000; "&gt; EnvDTE80 &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Imports&lt;/span&gt;&lt;span style="color: #000000; "&gt; System.Diagnostics &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Module&lt;/span&gt;&lt;span style="color: #000000; "&gt; MoreMacros &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt; AspTextLiteral() &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; resx &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;as&lt;/span&gt;&lt;span style="color: #000000; "&gt; ProjectItem &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; DTE.ActiveWindow.Object.GetItem(&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;solution\project\folder\ResourceFile.resx&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;)
Utilities.AspTextLiteral(resx) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt; InQuoteLiteral()
DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate() &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; resx &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;as&lt;/span&gt;&lt;span style="color: #000000; "&gt; ProjectItem &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; DTE.ActiveWindow.Object.GetItem(&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;solution\project\folder\ResourceFile.resx&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;)
Utilities.InQuoteLiteral(resx) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End
Module&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;/div&gt;
&gt;
&lt;p&gt;
Utilities: 
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:7d5c45be-dc14-4893-a3ac-dcbe121d224d" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:#FFFF80;"&gt;
&lt;div&gt;
&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000FF; "&gt;Imports&lt;/span&gt;&lt;span style="color: #000000; "&gt; System &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Imports&lt;/span&gt;&lt;span style="color: #000000; "&gt; EnvDTE &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Imports&lt;/span&gt;&lt;span style="color: #000000; "&gt; EnvDTE80 &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Imports&lt;/span&gt;&lt;span style="color: #000000; "&gt; System.Diagnostics &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Imports&lt;/span&gt;&lt;span style="color: #000000; "&gt; System.Xml &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Module&lt;/span&gt;&lt;span style="color: #000000; "&gt; Utilities &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt; AspTextLiteral(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ByRef&lt;/span&gt;&lt;span style="color: #000000; "&gt; resourceFile &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; ProjectItem) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Const&lt;/span&gt;&lt;span style="color: #000000; "&gt; literalFormat &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;asp:Literal
runat=&amp;quot;&amp;quot;server&amp;quot;&amp;quot; Text=&amp;quot;&amp;quot;&amp;lt;%$ Resources:{0},{1}%&amp;gt;&amp;quot;&amp;quot;
/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Const&lt;/span&gt;&lt;span style="color: #000000; "&gt; inQuotesFormat &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;%$
Resources:{0},{1}%&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt; LiteralReplacer(resourceFile,
literalFormat, &lt;/span&gt;&lt;span style="color: #000000; "&gt;4&lt;/span&gt;&lt;span style="color: #000000; "&gt;) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End
Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt; InQuoteLiteral(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ByRef&lt;/span&gt;&lt;span style="color: #000000; "&gt; resourceFile &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; ProjectItem) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Const&lt;/span&gt;&lt;span style="color: #000000; "&gt; inQuotesFormat &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;lt;%$
Resources:{0},{1}%&amp;gt;&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt; LiteralReplacer(resourceFile,
inQuotesFormat, &lt;/span&gt;&lt;span style="color: #000000; "&gt;3&lt;/span&gt;&lt;span style="color: #000000; "&gt;) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End
Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Private&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt; LiteralReplacer(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ByRef&lt;/span&gt;&lt;span style="color: #000000; "&gt; resourceFile &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; ProjectItem, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000; "&gt; template &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000; "&gt; delete &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; Int16) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; ts &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; TextSelection &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; DTE.ActiveDocument.Selection &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; name &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; StripNonAllowedChars(ts.Text).Trim.ToLower &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; value &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; ts.Text &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; path &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; resourceFile.Properties.Item(&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;LocalPath&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;).Value &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; resName &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; System.IO.Path.GetFileNameWithoutExtension(resourceFile.Name)
name &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; AddResourceEntry(path,
name, value) ts.Text &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;.Format(template,
resName, name) DTE.ActiveDocument.Selection.Delete(delete) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End
Sub&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt;Returns
the value of the name used&lt;/span&gt;&lt;span style="color: #008000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Function&lt;/span&gt;&lt;span style="color: #000000; "&gt; AddResourceEntry(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ByRef&lt;/span&gt;&lt;span style="color: #000000; "&gt; resourceFilePath &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000; "&gt; name &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000; "&gt; value &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; doc &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; XmlDocument &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;New&lt;/span&gt;&lt;span style="color: #000000; "&gt; XmlDocument
doc.Load(resourceFilePath) &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt;See
if it exists first&lt;/span&gt;&lt;span style="color: #008000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; root &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; XmlElement &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; doc.DocumentElement &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; e &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; XmlElement &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; root.SelectSingleNode(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;.Format(&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;data[@name=&amp;quot;&amp;quot;{0}&amp;quot;&amp;quot;]&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;,
name)) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt; e &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Is&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Then&lt;/span&gt;&lt;span style="color: #000000; "&gt; name &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; CreateUniqueName(root,
name) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; elem &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; XmlElement &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; CreateResourceFileElement(doc,
name, value) root.AppendChild(elem) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Else&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt; e.SelectSingleNode(&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;value&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;).InnerText.ToLower &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; value.ToLower &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Then&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Return&lt;/span&gt;&lt;span style="color: #000000; "&gt; name &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Else&lt;/span&gt;&lt;span style="color: #000000; "&gt; name &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; CreateUniqueName(root,
name) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; elem &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; XmlElement &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; CreateResourceFileElement(doc,
name, value) root.AppendChild(elem) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt; doc.Save(resourceFilePath) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Return&lt;/span&gt;&lt;span style="color: #000000; "&gt; name &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End
Function&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Private&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Function&lt;/span&gt;&lt;span style="color: #000000; "&gt; CreateUniqueName(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ByRef&lt;/span&gt;&lt;span style="color: #000000; "&gt; root &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; XmlElement, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000; "&gt; name &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;IsNumeric&lt;/span&gt;&lt;span style="color: #000000; "&gt;(name.Substring(&lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #000000; "&gt;1&lt;/span&gt;&lt;span style="color: #000000; "&gt;)) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Then&lt;/span&gt;&lt;span style="color: #000000; "&gt; name &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;n&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000; "&gt; name &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt;Name
doesn't exist, use it&lt;/span&gt;&lt;span style="color: #008000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Not&lt;/span&gt;&lt;span style="color: #000000; "&gt; CheckNameExists(root,
name) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Then&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Return&lt;/span&gt;&lt;span style="color: #000000; "&gt; name &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; result &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #008000; "&gt;'&lt;/span&gt;&lt;span style="color: #008000; "&gt;Build
a unique name&lt;/span&gt;&lt;span style="color: #008000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;For&lt;/span&gt;&lt;span style="color: #000000; "&gt; I &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; Int16 &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;1&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;To&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;100&lt;/span&gt;&lt;span style="color: #000000; "&gt; result &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; name &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000; "&gt; I &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Not&lt;/span&gt;&lt;span style="color: #000000; "&gt; CheckNameExists(root,
result) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Then&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Return&lt;/span&gt;&lt;span style="color: #000000; "&gt; result &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Next&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Return&lt;/span&gt;&lt;span style="color: #000000; "&gt; name &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000; "&gt; Guid.NewGuid.ToString &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End
Function&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Private&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Function&lt;/span&gt;&lt;span style="color: #000000; "&gt; CheckNameExists(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ByRef&lt;/span&gt;&lt;span style="color: #000000; "&gt; root &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; XmlElement, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000; "&gt; name &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Boolean&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; e &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; XmlElement &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; root.SelectSingleNode(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;.Format(&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;data[@name=&amp;quot;&amp;quot;{0}&amp;quot;&amp;quot;]&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;,
name)) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Return&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Not&lt;/span&gt;&lt;span style="color: #000000; "&gt; (e &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Is&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000; "&gt;) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End
Function&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Private&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Function&lt;/span&gt;&lt;span style="color: #000000; "&gt; CreateResourceFileElement(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ByRef&lt;/span&gt;&lt;span style="color: #000000; "&gt; doc &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; XmlDocument, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000; "&gt; name &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000; "&gt; value &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; XmlElement &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; result &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; XmlElement &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; doc.CreateElement(&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;data&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;)
SetAttribute(result, &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;name&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;,
name) SetAttribute(result, &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;xml:space&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;preserve&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; valueElem &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; XmlElement &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; doc.CreateElement(&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;value&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;)
valueElem.InnerText &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; value
result.AppendChild(valueElem) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Return&lt;/span&gt;&lt;span style="color: #000000; "&gt; result &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End
Function&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Private&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Function&lt;/span&gt;&lt;span style="color: #000000; "&gt; SetAttribute(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ByRef&lt;/span&gt;&lt;span style="color: #000000; "&gt; element &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; XmlElement, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000; "&gt; attr &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000; "&gt; value &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; XmlElement &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt; element.Attributes.GetNamedItem(attr) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Is&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Nothing&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Then&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Dim&lt;/span&gt;&lt;span style="color: #000000; "&gt; attrib &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; XmlAttribute &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; element.OwnerDocument.CreateAttribute(attr)
attrib.Value &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; value
element.Attributes.Append(attrib) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Else&lt;/span&gt;&lt;span style="color: #000000; "&gt; element.Attributes.Item(attr).Value &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; value &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;If&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Return&lt;/span&gt;&lt;span style="color: #000000; "&gt; element &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End
Function&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Private&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Function&lt;/span&gt;&lt;span style="color: #000000; "&gt; StripNonAllowedChars(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000; "&gt; text &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt;) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;String&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Const&lt;/span&gt;&lt;span style="color: #000000; "&gt; non_allowed &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&amp;quot;';:,&amp;lt;.&amp;gt;/?\|`~!@#$%^&amp;amp;*()-=+[{]} &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;For&lt;/span&gt;&lt;span style="color: #000000; "&gt; I &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;As&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Integer&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;To&lt;/span&gt;&lt;span style="color: #000000; "&gt; non_allowed.Length &lt;/span&gt;&lt;span style="color: #000000; "&gt;-&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;1&lt;/span&gt;&lt;span style="color: #000000; "&gt; text &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; text.Replace(non_allowed(I).ToString, &lt;/span&gt;&lt;span style="color: #000000; "&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; "&gt;) &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Next&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;Return&lt;/span&gt;&lt;span style="color: #000000; "&gt; text &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End
Function&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;End
Module&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;/div&gt;
&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="0767317B-992E-4b12-91E0-4F059A8CECA8:6c21f677-e872-405e-8840-6e23bfe78fbd" contenteditable="false" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;del.icio.us
Tags: &lt;a href="http://del.icio.us/popular/VisualStudio" rel="tag"&gt;VisualStudio&lt;/a&gt;, &lt;a href="http://del.icio.us/popular/.NET" rel="tag"&gt;.NET&lt;/a&gt;, &lt;a href="http://del.icio.us/popular/Macros" rel="tag"&gt;Macros&lt;/a&gt;, &lt;a href="http://del.icio.us/popular/ASP.NET" rel="tag"&gt;ASP.NET&lt;/a&gt;
&lt;/div&gt;
&lt;img width="0" height="0" src="http://www.milkcarton.com/blog/aggbug.ashx?id=1e707a99-6d90-4d04-984d-988d378137b3" /&gt;</description>
      <comments>http://www.milkcarton.com/blog/CommentView,guid,1e707a99-6d90-4d04-984d-988d378137b3.aspx</comments>
      <category>.NET</category>
      <category>ASP.NET</category>
      <category>Macros</category>
      <category>VisualStudio</category>
    </item>
    <item>
      <trackback:ping>http://www.milkcarton.com/blog/Trackback.aspx?guid=bc7483b7-025b-45b7-9c8b-9a29ae90da5a</trackback:ping>
      <pingback:server>http://www.milkcarton.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.milkcarton.com/blog/PermaLink,guid,bc7483b7-025b-45b7-9c8b-9a29ae90da5a.aspx</pingback:target>
      <dc:creator>Dan Morphis</dc:creator>
      <wfw:comment>http://www.milkcarton.com/blog/CommentView,guid,bc7483b7-025b-45b7-9c8b-9a29ae90da5a.aspx</wfw:comment>
      <wfw:commentRss>http://www.milkcarton.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=bc7483b7-025b-45b7-9c8b-9a29ae90da5a</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The Visual Studio solution file for our software contains 36 projects (and growing). 
If you've ever tried to find a particular file or project in a 36 project solution
when many projects and folders are expanded, then you know how frustrating it can
be.
</p>
        <h3>The Solution
</h3>
        <p>
After putting up with it for over a year, I finally asked a <a href="http://orand.blogspot.com/">co-worker
of mine</a> if he knew of a way to quickly jump to a particular project in Visual
Studio.  He reminded me that Visual Studio has excellent macro support. 
A few minutes later using Visual Studios Macro Recorder feature I had something to
jump to a project I'm in a lot.  All told, I jump between around 4 projects pretty
regularly - our business logic layer, domain model, smart client and UI, and having
these macros have been a huge time saver!
</p>
        <h3>The Visual Studio Macro
</h3>
        <div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:bdd2d1d7-63e4-4bb5-9dfd-dc4358777b1e" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
          <pre style="background-color: #ffff80">
            <div>
              <!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
              <span style="color: #0000ff">Sub</span>
              <span style="color: #000000"> TemporaryMacro()
DTE.ActiveWindow.Object.GetItem(</span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">MySolution\MyProject</span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">).UIHierarchyItems.Expanded </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">True</span>
              <span style="color: #000000"> DTE.ActiveWindow.Object.GetItem(</span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">MySolution\MyProject</span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">).Select(vsUISelectionType.vsUISelectionTypeSelect) </span>
              <span style="color: #0000ff">End
Sub</span>
            </div>
          </pre>
        </div>
        <p>
Using this macro, you can straight to the "MyProject" project in your solution. 
This works, but its not very generic.  The solution name is hard coded, which
is fine if the particular project only lives in one solution.  But in our case,
we have 3 or 4 different solutions created.  The monster with all 36 solutions,
a client only solution with 10 of the projects, and a core only solution.
</p>
        <p>
I don't feel like creating different macros to jump between the same 5 projects depending
upon which solution is open.  So lets refactor this a little bit.  
</p>
        <p>
        </p>
        <div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:46a59703-74d1-44f3-8141-ad59ba5253a4" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
          <pre style="background-color: #ffff80">
            <div>
              <!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
              <span style="color: #008080"> 1</span>
              <span style="color: #0000ff">Private</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Function</span>
              <span style="color: #000000"> GetSolution() </span>
              <span style="color: #0000ff">As</span>
              <span style="color: #000000"> UIHierarchyItem </span>
              <span style="color: #008080"> 2</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Dim</span>
              <span style="color: #000000"> win </span>
              <span style="color: #0000ff">As</span>
              <span style="color: #000000"> Window </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000"> DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer) </span>
              <span style="color: #008080"> 3</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Dim</span>
              <span style="color: #000000"> uih </span>
              <span style="color: #0000ff">As</span>
              <span style="color: #000000"> UIHierarchy </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000"> win.Object </span>
              <span style="color: #008080"> 4</span>
              <span style="color: #000000"> GetSolution </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000"> uih.UIHierarchyItems.Item(</span>
              <span style="color: #000000">1</span>
              <span style="color: #000000">) </span>
              <span style="color: #008080"> 5</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">End
Function</span>
              <span style="color: #000000">
              </span>
              <span style="color: #008080"> 6</span>
              <span style="color: #000000">
              </span>
              <span style="color: #008080"> 7</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Private</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Function</span>
              <span style="color: #000000"> GetProject(</span>
              <span style="color: #0000ff">ByVal</span>
              <span style="color: #000000"> ProjectName </span>
              <span style="color: #0000ff">As</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">String</span>
              <span style="color: #000000">) </span>
              <span style="color: #0000ff">As</span>
              <span style="color: #000000"> UIHierarchyItem </span>
              <span style="color: #008080"> 8</span>
              <span style="color: #000000"> GetProject </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000"> GetSolution().UIHierarchyItems.Item(ProjectName) </span>
              <span style="color: #008080"> 9</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">End
Function</span>
              <span style="color: #000000">
              </span>
              <span style="color: #008080">10</span>
              <span style="color: #000000">
              </span>
              <span style="color: #008080">11</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Private</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Sub</span>
              <span style="color: #000000"> GotoProject(</span>
              <span style="color: #0000ff">ByVal</span>
              <span style="color: #000000"> ProjectName </span>
              <span style="color: #0000ff">As</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">String</span>
              <span style="color: #000000">) </span>
              <span style="color: #008080">12</span>
              <span style="color: #000000"> DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate() </span>
              <span style="color: #008080">13</span>
              <span style="color: #000000">
              </span>
              <span style="color: #008080">14</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Try</span>
              <span style="color: #000000">
              </span>
              <span style="color: #008080">15</span>
              <span style="color: #000000"> GetProject(ProjectName).Select(vsUISelectionType.vsUISelectionTypeSelect) </span>
              <span style="color: #008080">16</span>
              <span style="color: #000000"> GetProject(ProjectName).UIHierarchyItems.Expanded </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">True</span>
              <span style="color: #000000">
              </span>
              <span style="color: #008080">17</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Catch</span>
              <span style="color: #000000"> ex </span>
              <span style="color: #0000ff">As</span>
              <span style="color: #000000"> Exception </span>
              <span style="color: #008080">18</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">End</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Try</span>
              <span style="color: #000000">
              </span>
              <span style="color: #008080">19</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">End
Sub</span>
              <span style="color: #000000">
              </span>
              <span style="color: #008080">20</span>
              <span style="color: #000000">
              </span>
              <span style="color: #008080">21</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Public</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Sub</span>
              <span style="color: #000000"> MyProject() </span>
              <span style="color: #008080">22</span>
              <span style="color: #000000"> GotoProject(</span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">MyProject</span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">) </span>
              <span style="color: #008080">23</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">End
Sub</span>
            </div>
          </pre>
        </div>
        <p>
        </p>
        <p>
Lets break this down. The GetSolution method returns a UIHierarchyItem (an item in
the solution explorer tree you can click on). The first thing we do is tell the DTE
(What does DTE stand for btw?) we want the solution explorer window (line 2), once
we have that we can get the hierarchy (line 3), then we can get the items and get
the first item (line 4) which is the solution item in the hierarchy.
</p>
        <p>
NOTE: The macro environment is based on COM,  and in COM collections and arrays
start at 1, and not 0.
</p>
        <p>
In the GetProject method, you should see code which looks familiar.  The interesting
things come in the GotoProject method.  First we active the the solution explorer
window in the IDE (line 12), then get the project hierarchy item and select it so
it has focus (line 15), and finally we expand the item in the hierarchy so you can
see all the files under the project (line 16).
</p>
        <p>
And finally on line 21 we have the actual callable macro which will warp us to the
project we want in the solution.
</p>
        <h3>A Good First Step
</h3>
        <p>
So thats a good first step, but what else can we do?  We can <a href="#Collapsing">collapse
all the items in the solution explorer</a>, <a href="#OpenAFile">open up a particular
file</a>, or even <a href="#FixThings">"fix" items in your solution</a>.
</p>
        <h4>
          <a name="Collapsing">Collapsing the Solution Explorer</a>
        </h4>
        <p>
One thing I don't like about Visual Studio is over time, with a large number of projects, 
a lot of projects, folders and compound items (winforms items with a designer and
resource file) get expanded and it makes it especially hard to pick things out of
the visual clutter.  I always find it to be very tedious to close all the items
in the solution to clean up the clutter.  Lets write a macro to fix this mess
for us.
</p>
        <p>
        </p>
        <div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:1d5876ac-2eec-4552-bb59-0b66c2d5701c" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
          <pre style="background-color: #ffff80; word-wrap: break-word">
            <div>
              <!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
              <span style="color: #008080"> 1</span>
              <span style="color: #0000ff">Public</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Sub</span>
              <span style="color: #000000"> CollapseTopLevel() </span>
              <span style="color: #008080"> 2</span>
              <span style="color: #000000"> DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate() </span>
              <span style="color: #008080"> 3</span>
              <span style="color: #000000">
              </span>
              <span style="color: #008080"> 4</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Dim</span>
              <span style="color: #000000"> solutionWindow </span>
              <span style="color: #0000ff">As</span>
              <span style="color: #000000"> EnvDTE.Window </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000"> DTE.ActiveWindow </span>
              <span style="color: #008080"> 5</span>
              <span style="color: #000000"> solutionWindow.Visible </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">False</span>
              <span style="color: #000000">
              </span>
              <span style="color: #008080"> 6</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Dim</span>
              <span style="color: #000000"> solution </span>
              <span style="color: #0000ff">As</span>
              <span style="color: #000000"> UIHierarchyItem </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000"> GetSolution() </span>
              <span style="color: #008080"> 7</span>
              <span style="color: #000000">
              </span>
              <span style="color: #008080"> 8</span>
              <span style="color: #000000"> CollapseHierarchy(solution.UIHierarchyItems, </span>
              <span style="color: #0000ff">True</span>
              <span style="color: #000000">, </span>
              <span style="color: #0000ff">True</span>
              <span style="color: #000000">) </span>
              <span style="color: #008080"> 9</span>
              <span style="color: #000000"> solutionWindow.Visible </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">True</span>
              <span style="color: #000000">
              </span>
              <span style="color: #008080">10</span>
              <span style="color: #000000"> DTE.StatusBar.Clear() </span>
              <span style="color: #008080">11</span>
              <span style="color: #000000"> DTE.StatusBar.Progress(</span>
              <span style="color: #0000ff">False</span>
              <span style="color: #000000">) </span>
              <span style="color: #008080">12</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">End
Sub</span>
              <span style="color: #000000">
              </span>
              <span style="color: #008080">13</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Public</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Sub</span>
              <span style="color: #000000"> CollapseAll() </span>
              <span style="color: #008080">14</span>
              <span style="color: #000000"> DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate() </span>
              <span style="color: #008080">15</span>
              <span style="color: #000000">
              </span>
              <span style="color: #008080">16</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Dim</span>
              <span style="color: #000000"> solutionWindow </span>
              <span style="color: #0000ff">As</span>
              <span style="color: #000000"> EnvDTE.Window </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000"> DTE.ActiveWindow </span>
              <span style="color: #008080">17</span>
              <span style="color: #000000"> solutionWindow.Visible </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">False</span>
              <span style="color: #000000">
              </span>
              <span style="color: #008080">18</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Dim</span>
              <span style="color: #000000"> solution </span>
              <span style="color: #0000ff">As</span>
              <span style="color: #000000"> UIHierarchyItem </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000"> GetSolution() </span>
              <span style="color: #008080">19</span>
              <span style="color: #000000">
              </span>
              <span style="color: #008080">20</span>
              <span style="color: #000000"> CollapseHierarchy(solution.UIHierarchyItems, </span>
              <span style="color: #0000ff">True</span>
              <span style="color: #000000">, </span>
              <span style="color: #0000ff">False</span>
              <span style="color: #000000">) </span>
              <span style="color: #008080">21</span>
              <span style="color: #000000"> solutionWindow.Visible </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">True</span>
              <span style="color: #000000">
              </span>
              <span style="color: #008080">22</span>
              <span style="color: #000000"> DTE.StatusBar.Clear() </span>
              <span style="color: #008080">23</span>
              <span style="color: #000000"> DTE.StatusBar.Progress(</span>
              <span style="color: #0000ff">False</span>
              <span style="color: #000000">) </span>
              <span style="color: #008080">24</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">End
Sub</span>
              <span style="color: #000000">
              </span>
              <span style="color: #008080">25</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Private</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Sub</span>
              <span style="color: #000000"> CollapseHierarchy(</span>
              <span style="color: #0000ff">ByRef</span>
              <span style="color: #000000"> items </span>
              <span style="color: #0000ff">As</span>
              <span style="color: #000000"> UIHierarchyItems, </span>
              <span style="color: #0000ff">ByVal</span>
              <span style="color: #000000"> IsRoot </span>
              <span style="color: #0000ff">As</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Boolean</span>
              <span style="color: #000000">, </span>
              <span style="color: #0000ff">ByVal</span>
              <span style="color: #000000"> OnlyCollapseRootLevel </span>
              <span style="color: #0000ff">As</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Boolean</span>
              <span style="color: #000000">) </span>
              <span style="color: #008080">26</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">For</span>
              <span style="color: #000000"> i </span>
              <span style="color: #0000ff">As</span>
              <span style="color: #000000"> Int32 </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000">
              </span>
              <span style="color: #000000">1</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">To</span>
              <span style="color: #000000"> items.Count </span>
              <span style="color: #008080">27</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">If</span>
              <span style="color: #000000"> IsRoot </span>
              <span style="color: #0000ff">Then</span>
              <span style="color: #000000"> DTE.StatusBar.Progress(</span>
              <span style="color: #0000ff">True</span>
              <span style="color: #000000">, </span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">Collapsing</span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">,
i, items.Count) </span>
              <span style="color: #008080">28</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">If</span>
              <span style="color: #000000"> (items.Item(i).UIHierarchyItems.Count </span>
              <span style="color: #000000">&gt;</span>
              <span style="color: #000000">
              </span>
              <span style="color: #000000">0</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">And</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Not</span>
              <span style="color: #000000"> OnlyCollapseRootLevel) </span>
              <span style="color: #0000ff">Then</span>
              <span style="color: #000000">
              </span>
              <span style="color: #008080">29</span>
              <span style="color: #000000"> DTE.StatusBar.Text </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000">
              </span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">Collapsing </span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">
              </span>
              <span style="color: #000000">&amp;</span>
              <span style="color: #000000"> items.Item(i).Name </span>
              <span style="color: #008080">30</span>
              <span style="color: #000000"> CollapseHierarchy(items.Item(i).UIHierarchyItems, </span>
              <span style="color: #0000ff">False</span>
              <span style="color: #000000">, </span>
              <span style="color: #0000ff">False</span>
              <span style="color: #000000">) </span>
              <span style="color: #008080">31</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">End</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">If</span>
              <span style="color: #000000">
              </span>
              <span style="color: #008080">32</span>
              <span style="color: #000000"> items.Item(i).UIHierarchyItems.Expanded </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">False</span>
              <span style="color: #000000">
              </span>
              <span style="color: #008080">33</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Next</span>
              <span style="color: #000000">
              </span>
              <span style="color: #008080">34</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">End
Sub</span>
            </div>
          </pre>
        </div>
        <p>
        </p>
        <p>
There are two different methods here to collapse the solution, CollapseTopLevel and
CollapseAll.  CollapseTopLevel only collapses project items in the UI, while
CollapseAll will drill down and collapse every item.  The first is fast, takes
less than a second to collapse 36 items, while the later takes about 15 seconds. 
If you notice lines 4, 5 we grab a reference to the solution window, and then hide
it.  If the solution window is visible while the projects are collapsed, the
whole process takes much longer while the UI repaints.
</p>
        <h4>
          <a name="OpeningAFile">Opening a Particular File</a>
        </h4>
        <p>
When working on our data access layer (DAL), I do a lot of editing of our SQL upgrade
script.  I don't really like to try and find this file in the solution explorer. 
More than that, when I'm editing this file, I'm always adding to the bottom of this
file.  Can we do all that with a macro?  Sure enough!
</p>
        <div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:88ce2c1b-c3e5-4639-bd78-2808d3ce17fc" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
          <pre style="background-color: #ffff80; word-wrap: break-word">
            <div>
              <!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
              <span style="color: #008080">1</span>
              <span style="color: #0000ff">Public</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Sub</span>
              <span style="color: #000000"> DbScripts() </span>
              <span style="color: #008080">2</span>
              <span style="color: #000000"> DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate() </span>
              <span style="color: #008080">3</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Dim</span>
              <span style="color: #000000"> project </span>
              <span style="color: #0000ff">As</span>
              <span style="color: #000000"> UIHierarchyItem </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000"> GetSolution().UIHierarchyItems.Item(</span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">SchemaUpgradeManagerProject</span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">) </span>
              <span style="color: #008080">4</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Dim</span>
              <span style="color: #000000"> scripts </span>
              <span style="color: #0000ff">As</span>
              <span style="color: #000000"> ProjectItem </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000"> project.UIHierarchyItems.Item(</span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">Scripts</span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">).UIHierarchyItems.Item(</span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">DbScripts.sql</span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">).Object </span>
              <span style="color: #008080">5</span>
              <span style="color: #000000"> scripts.Open().Activate() </span>
              <span style="color: #008080">6</span>
              <span style="color: #000000"> DTE.ActiveDocument.Selection.EndOfDocument() </span>
              <span style="color: #008080">7</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">End
Sub</span>
            </div>
          </pre>
        </div>
        <h4>
          <a name="FixingThings">Fixing Things in the Solution</a>
        </h4>
        <p>
One of the frustrating things about creating NHibernate mapping files is remembering
to set the build action to Embedded Resource.  Or remembering to set the build
action of images, sounds and movie clips and other files to Embedded Resource. 
Why not let a macro fix this mess for you too?
</p>
        <p>
        </p>
        <div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:f7f2285d-9603-4135-bbc5-aa62bd882289" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
          <pre style="background-color: #ffff80">
            <div>
              <!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
              <span style="color: #0000ff">Public</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Sub</span>
              <span style="color: #000000"> FixThings() </span>
              <span style="color: #0000ff">Try</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Dim</span>
              <span style="color: #000000"> project </span>
              <span style="color: #0000ff">As</span>
              <span style="color: #000000"> Project </span>
              <span style="color: #0000ff">Dim</span>
              <span style="color: #000000"> projectItem </span>
              <span style="color: #0000ff">As</span>
              <span style="color: #000000"> UIHierarchyItem </span>
              <span style="color: #0000ff">Dim</span>
              <span style="color: #000000"> folder </span>
              <span style="color: #0000ff">As</span>
              <span style="color: #000000"> UIHierarchyItem
projectItem </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000"> GetProject(</span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">DataAccessProject</span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">)
folder </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000"> projectItem.UIHierarchyItems.Item(</span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">Mappings</span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">)
EmbeddResources(folder, </span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">hbm.xml</span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">)
project </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000"> projectItem.Object
project.Save() projectItem </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000"> GetProject(</span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">UserInterfaceProject</span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">)
folder </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000"> projectItem.UIHierarchyItems.Item(</span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">Icons</span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">)
EmbeddResources(folder, </span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">png</span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">)
project </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000"> projectItem.Object
project.Save() DTE.StatusBar.Clear() DTE.StatusBar.Progress(</span>
              <span style="color: #0000ff">False</span>
              <span style="color: #000000">) </span>
              <span style="color: #0000ff">Catch</span>
              <span style="color: #000000"> ex </span>
              <span style="color: #0000ff">As</span>
              <span style="color: #000000"> Exception </span>
              <span style="color: #0000ff">End</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Try</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">End
Sub</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Private</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Sub</span>
              <span style="color: #000000"> EmbeddResources(</span>
              <span style="color: #0000ff">ByRef</span>
              <span style="color: #000000"> folder </span>
              <span style="color: #0000ff">As</span>
              <span style="color: #000000"> UIHierarchyItem, </span>
              <span style="color: #0000ff">ByVal</span>
              <span style="color: #000000"> extension </span>
              <span style="color: #0000ff">As</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">String</span>
              <span style="color: #000000">) </span>
              <span style="color: #0000ff">Dim</span>
              <span style="color: #000000"> file </span>
              <span style="color: #0000ff">As</span>
              <span style="color: #000000"> ProjectItem </span>
              <span style="color: #0000ff">For</span>
              <span style="color: #000000"> i </span>
              <span style="color: #0000ff">As</span>
              <span style="color: #000000"> Int32 </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000">
              </span>
              <span style="color: #000000">1</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">To</span>
              <span style="color: #000000"> folder.UIHierarchyItems.Count
file </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000"> folder.UIHierarchyItems.Item(i).Object
DTE.StatusBar.Progress(</span>
              <span style="color: #0000ff">True</span>
              <span style="color: #000000">, </span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">Setting
BuildAction in </span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">
              </span>
              <span style="color: #000000">&amp;</span>
              <span style="color: #000000"> folder.Name,
i, folder.UIHierarchyItems.Count) </span>
              <span style="color: #0000ff">If</span>
              <span style="color: #000000"> file.Name.EndsWith(extension) </span>
              <span style="color: #0000ff">Then</span>
              <span style="color: #000000"> file.Properties.Item(</span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">BuildAction</span>
              <span style="color: #000000">"</span>
              <span style="color: #000000">).Value </span>
              <span style="color: #000000">=</span>
              <span style="color: #000000">
              </span>
              <span style="color: #000000">3</span>
              <span style="color: #000000">
              </span>
              <span style="color: #008000">'</span>
              <span style="color: #008000"> Embedded
Resource</span>
              <span style="color: #008000">
              </span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">End</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">If</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">Next</span>
              <span style="color: #000000">
              </span>
              <span style="color: #0000ff">End
Sub</span>
            </div>
          </pre>
        </div>
        <p>
        </p>
        <p>
There you have it, some simple Visual Studio macros to make your development much
easier!  Questions, comments, concerns, leave me a comment.
</p>
        <h3>Your Macros, Now Only a Click Away!
</h3>
        <p>
Now that we have all of these macros, we need a way to quickly and easily access them. 
Custom Visual Studio toolbars to the rescue!  To create a custom toolbar, click
on Tools -&gt; Customize -&gt; Toolbars.  From there click on the "New" button
and give it a name.  I choose the very original name of "My Macros" :). Dock
your toolbar if you'd like.
</p>
        <p>
With that done, click over to "Commands" tab and click on "Macros" in the left-side.
All of your macros, as well as the sample macros will show up in the right-side. 
Drag the macros you want to the toolbar you just created.  You'll notice that
your macro has a really long name like "Macros.MyMacros.SomeName.CollapseTopLevel." 
Long names like that will quickly eat up your valuable screen real estate.
</p>
        <p>
Thankfully we can fix that.  While still in Customize mode, you can right-click
on your macro in the toolbar (and indeed any item in any toolbar) and the third option
down is "Name."  Set this to what ever you want.  Since screen real-estate
is precious to me, I named my "Macros.MyMacros.ProjectName.CollapseTopLevel" macro
to "ClpseTopLvl".
</p>
        <h3>Update
</h3>
        <p>
In my haste to publish this article at around 1 AM I failed to mention how to create
a custom tool bar to give you quick access to all of your macros.
</p>
        <p>
11-Feb-2009 - <a href="http://dotnetbutchering.blogspot.com" target="_blank">Johnny
Idol</a> has referenced this blog post, and <a href="http://dotnetbutchering.blogspot.com/2009/02/visualstudio-collapse-all-projects-in.html" target="_blank">gone
into detail about how to actually create the macros and bind keyboard shortcuts to
them</a>.
</p>
        <img width="0" height="0" src="http://www.milkcarton.com/blog/aggbug.ashx?id=bc7483b7-025b-45b7-9c8b-9a29ae90da5a" />
      </body>
      <title>Using Visual Studio Macros to Increase Productivity</title>
      <guid isPermaLink="false">http://www.milkcarton.com/blog/PermaLink,guid,bc7483b7-025b-45b7-9c8b-9a29ae90da5a.aspx</guid>
      <link>http://www.milkcarton.com/blog/2007/05/20/Using+Visual+Studio+Macros+To+Increase+Productivity.aspx</link>
      <pubDate>Sun, 20 May 2007 09:12:32 GMT</pubDate>
      <description>&lt;p&gt;
The Visual Studio solution file for our software contains 36 projects (and growing).&amp;nbsp;
If you've ever tried to find a particular file or project in a 36 project solution
when many projects and folders are expanded, then you know how frustrating it can
be.
&lt;/p&gt;
&lt;h3&gt;The Solution
&lt;/h3&gt;
&lt;p&gt;
After putting up with it for over a year, I finally asked a &lt;a href="http://orand.blogspot.com/"&gt;co-worker
of mine&lt;/a&gt; if he knew of a way to quickly jump to a particular project in Visual
Studio.&amp;nbsp; He reminded me that Visual Studio has excellent macro support.&amp;nbsp;
A few minutes later using Visual Studios Macro Recorder feature I had something to
jump to a project I'm in a lot.&amp;nbsp; All told, I jump between around 4 projects pretty
regularly - our business logic layer, domain model, smart client and UI, and having
these macros have been a huge time saver!
&lt;/p&gt;
&lt;h3&gt;The Visual Studio Macro
&lt;/h3&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:bdd2d1d7-63e4-4bb5-9dfd-dc4358777b1e" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color: #ffff80"&gt;
&lt;div&gt;
&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; TemporaryMacro()
DTE.ActiveWindow.Object.GetItem(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;MySolution\MyProject&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).UIHierarchyItems.Expanded &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;True&lt;/span&gt;&lt;span style="color: #000000"&gt; DTE.ActiveWindow.Object.GetItem(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;MySolution\MyProject&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).Select(vsUISelectionType.vsUISelectionTypeSelect) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End
Sub&lt;/span&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Using this macro, you can straight to the "MyProject" project in your solution.&amp;nbsp;
This works, but its not very generic.&amp;nbsp; The solution name is hard coded, which
is fine if the particular project only lives in one solution.&amp;nbsp; But in our case,
we have 3 or 4 different solutions created.&amp;nbsp; The monster with all 36 solutions,
a client only solution with 10 of the projects, and a core only solution.
&lt;/p&gt;
&lt;p&gt;
I don't feel like creating different macros to jump between the same 5 projects depending
upon which solution is open.&amp;nbsp; So lets refactor this a little bit.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:46a59703-74d1-44f3-8141-ad59ba5253a4" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color: #ffff80"&gt;
&lt;div&gt;
&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #008080"&gt; 1&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;&lt;span style="color: #000000"&gt; GetSolution() &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; UIHierarchyItem &lt;/span&gt;&lt;span style="color: #008080"&gt; 2&lt;/span&gt; &lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; win &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Window &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer) &lt;/span&gt;&lt;span style="color: #008080"&gt; 3&lt;/span&gt; &lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; uih &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; UIHierarchy &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; win.Object &lt;/span&gt;&lt;span style="color: #008080"&gt; 4&lt;/span&gt; &lt;span style="color: #000000"&gt; GetSolution &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; uih.UIHierarchyItems.Item(&lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #008080"&gt; 5&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End
Function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008080"&gt; 6&lt;/span&gt; &lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008080"&gt; 7&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;&lt;span style="color: #000000"&gt; GetProject(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; ProjectName &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; UIHierarchyItem &lt;/span&gt;&lt;span style="color: #008080"&gt; 8&lt;/span&gt; &lt;span style="color: #000000"&gt; GetProject &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; GetSolution().UIHierarchyItems.Item(ProjectName) &lt;/span&gt;&lt;span style="color: #008080"&gt; 9&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End
Function&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt; &lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; GotoProject(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; ProjectName &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt; &lt;span style="color: #000000"&gt; DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate() &lt;/span&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt; &lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt; &lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt; &lt;span style="color: #000000"&gt; GetProject(ProjectName).Select(vsUISelectionType.vsUISelectionTypeSelect) &lt;/span&gt;&lt;span style="color: #008080"&gt;16&lt;/span&gt; &lt;span style="color: #000000"&gt; GetProject(ProjectName).UIHierarchyItems.Expanded &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;True&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008080"&gt;17&lt;/span&gt; &lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Catch&lt;/span&gt;&lt;span style="color: #000000"&gt; ex &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Exception &lt;/span&gt;&lt;span style="color: #008080"&gt;18&lt;/span&gt; &lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008080"&gt;19&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End
Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008080"&gt;20&lt;/span&gt; &lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008080"&gt;21&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; MyProject() &lt;/span&gt;&lt;span style="color: #008080"&gt;22&lt;/span&gt; &lt;span style="color: #000000"&gt; GotoProject(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;MyProject&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #008080"&gt;23&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End
Sub&lt;/span&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Lets break this down. The GetSolution method returns a UIHierarchyItem (an item in
the solution explorer tree you can click on). The first thing we do is tell the DTE
(What does DTE stand for btw?) we want the solution explorer window (line 2), once
we have that we can get the hierarchy (line 3), then we can get the items and get
the first item (line 4) which is the solution item in the hierarchy.
&lt;/p&gt;
&lt;p&gt;
NOTE: The macro environment is based on COM,&amp;nbsp; and in COM collections and arrays
start at 1, and not 0.
&lt;/p&gt;
&lt;p&gt;
In the GetProject method, you should see code which looks familiar.&amp;nbsp; The interesting
things come in the GotoProject method.&amp;nbsp; First we active the the solution explorer
window in the IDE (line 12), then get the project hierarchy item and select it so
it has focus (line 15), and finally we expand the item in the hierarchy so you can
see all the files under the project (line 16).
&lt;/p&gt;
&lt;p&gt;
And finally on line 21 we have the actual callable macro which will warp us to the
project we want in the solution.
&lt;/p&gt;
&lt;h3&gt;A Good First Step
&lt;/h3&gt;
&lt;p&gt;
So thats a good first step, but what else can we do?&amp;nbsp; We can &lt;a href="#Collapsing"&gt;collapse
all the items in the solution explorer&lt;/a&gt;, &lt;a href="#OpenAFile"&gt;open up a particular
file&lt;/a&gt;, or even &lt;a href="#FixThings"&gt;"fix" items in your solution&lt;/a&gt;.
&lt;/p&gt;
&lt;h4&gt;&lt;a name="Collapsing"&gt;Collapsing the Solution Explorer&lt;/a&gt;
&lt;/h4&gt;
&lt;p&gt;
One thing I don't like about Visual Studio is over time, with a large number of projects,&amp;nbsp;
a lot of projects, folders and compound items (winforms items with a designer and
resource file) get expanded and it makes it especially hard to pick things out of
the visual clutter.&amp;nbsp; I always find it to be very tedious to close all the items
in the solution to clean up the clutter.&amp;nbsp; Lets write a macro to fix this mess
for us.
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:1d5876ac-2eec-4552-bb59-0b66c2d5701c" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color: #ffff80; word-wrap: break-word"&gt;
&lt;div&gt;
&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #008080"&gt; 1&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; CollapseTopLevel() &lt;/span&gt;&lt;span style="color: #008080"&gt; 2&lt;/span&gt; &lt;span style="color: #000000"&gt; DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate() &lt;/span&gt;&lt;span style="color: #008080"&gt; 3&lt;/span&gt; &lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008080"&gt; 4&lt;/span&gt; &lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; solutionWindow &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; EnvDTE.Window &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; DTE.ActiveWindow &lt;/span&gt;&lt;span style="color: #008080"&gt; 5&lt;/span&gt; &lt;span style="color: #000000"&gt; solutionWindow.Visible &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;False&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008080"&gt; 6&lt;/span&gt; &lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; solution &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; UIHierarchyItem &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; GetSolution() &lt;/span&gt;&lt;span style="color: #008080"&gt; 7&lt;/span&gt; &lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008080"&gt; 8&lt;/span&gt; &lt;span style="color: #000000"&gt; CollapseHierarchy(solution.UIHierarchyItems, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;True&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;True&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #008080"&gt; 9&lt;/span&gt; &lt;span style="color: #000000"&gt; solutionWindow.Visible &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;True&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt; &lt;span style="color: #000000"&gt; DTE.StatusBar.Clear() &lt;/span&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt; &lt;span style="color: #000000"&gt; DTE.StatusBar.Progress(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;False&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End
Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; CollapseAll() &lt;/span&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt; &lt;span style="color: #000000"&gt; DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate() &lt;/span&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt; &lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008080"&gt;16&lt;/span&gt; &lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; solutionWindow &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; EnvDTE.Window &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; DTE.ActiveWindow &lt;/span&gt;&lt;span style="color: #008080"&gt;17&lt;/span&gt; &lt;span style="color: #000000"&gt; solutionWindow.Visible &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;False&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008080"&gt;18&lt;/span&gt; &lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; solution &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; UIHierarchyItem &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; GetSolution() &lt;/span&gt;&lt;span style="color: #008080"&gt;19&lt;/span&gt; &lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008080"&gt;20&lt;/span&gt; &lt;span style="color: #000000"&gt; CollapseHierarchy(solution.UIHierarchyItems, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;True&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;False&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #008080"&gt;21&lt;/span&gt; &lt;span style="color: #000000"&gt; solutionWindow.Visible &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;True&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008080"&gt;22&lt;/span&gt; &lt;span style="color: #000000"&gt; DTE.StatusBar.Clear() &lt;/span&gt;&lt;span style="color: #008080"&gt;23&lt;/span&gt; &lt;span style="color: #000000"&gt; DTE.StatusBar.Progress(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;False&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #008080"&gt;24&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End
Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008080"&gt;25&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; CollapseHierarchy(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByRef&lt;/span&gt;&lt;span style="color: #000000"&gt; items &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; UIHierarchyItems, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; IsRoot &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Boolean&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; OnlyCollapseRootLevel &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Boolean&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #008080"&gt;26&lt;/span&gt; &lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;For&lt;/span&gt;&lt;span style="color: #000000"&gt; i &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Int32 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;To&lt;/span&gt;&lt;span style="color: #000000"&gt; items.Count &lt;/span&gt;&lt;span style="color: #008080"&gt;27&lt;/span&gt; &lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; IsRoot &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt; DTE.StatusBar.Progress(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;True&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;Collapsing&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;,
i, items.Count) &lt;/span&gt;&lt;span style="color: #008080"&gt;28&lt;/span&gt; &lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; (items.Item(i).UIHierarchyItems.Count &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;0&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;And&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Not&lt;/span&gt;&lt;span style="color: #000000"&gt; OnlyCollapseRootLevel) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008080"&gt;29&lt;/span&gt; &lt;span style="color: #000000"&gt; DTE.StatusBar.Text &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;Collapsing &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt; items.Item(i).Name &lt;/span&gt;&lt;span style="color: #008080"&gt;30&lt;/span&gt; &lt;span style="color: #000000"&gt; CollapseHierarchy(items.Item(i).UIHierarchyItems, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;False&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;False&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #008080"&gt;31&lt;/span&gt; &lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008080"&gt;32&lt;/span&gt; &lt;span style="color: #000000"&gt; items.Item(i).UIHierarchyItems.Expanded &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;False&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008080"&gt;33&lt;/span&gt; &lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Next&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008080"&gt;34&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End
Sub&lt;/span&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
There are two different methods here to collapse the solution, CollapseTopLevel and
CollapseAll.&amp;nbsp; CollapseTopLevel only collapses project items in the UI, while
CollapseAll will drill down and collapse every item.&amp;nbsp; The first is fast, takes
less than a second to collapse 36 items, while the later takes about 15 seconds.&amp;nbsp;
If you notice lines 4, 5 we grab a reference to the solution window, and then hide
it.&amp;nbsp; If the solution window is visible while the projects are collapsed, the
whole process takes much longer while the UI repaints.
&lt;/p&gt;
&lt;h4&gt;&lt;a name="OpeningAFile"&gt;Opening a Particular File&lt;/a&gt;
&lt;/h4&gt;
&lt;p&gt;
When working on our data access layer (DAL), I do a lot of editing of our SQL upgrade
script.&amp;nbsp; I don't really like to try and find this file in the solution explorer.&amp;nbsp;
More than that, when I'm editing this file, I'm always adding to the bottom of this
file.&amp;nbsp; Can we do all that with a macro?&amp;nbsp; Sure enough!
&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:88ce2c1b-c3e5-4639-bd78-2808d3ce17fc" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color: #ffff80; word-wrap: break-word"&gt;
&lt;div&gt;
&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #008080"&gt;1&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; DbScripts() &lt;/span&gt;&lt;span style="color: #008080"&gt;2&lt;/span&gt; &lt;span style="color: #000000"&gt; DTE.Windows.Item(Constants.vsWindowKindSolutionExplorer).Activate() &lt;/span&gt;&lt;span style="color: #008080"&gt;3&lt;/span&gt; &lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; project &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; UIHierarchyItem &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; GetSolution().UIHierarchyItems.Item(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;SchemaUpgradeManagerProject&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #008080"&gt;4&lt;/span&gt; &lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; scripts &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; ProjectItem &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; project.UIHierarchyItems.Item(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;Scripts&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).UIHierarchyItems.Item(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;DbScripts.sql&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).Object &lt;/span&gt;&lt;span style="color: #008080"&gt;5&lt;/span&gt; &lt;span style="color: #000000"&gt; scripts.Open().Activate() &lt;/span&gt;&lt;span style="color: #008080"&gt;6&lt;/span&gt; &lt;span style="color: #000000"&gt; DTE.ActiveDocument.Selection.EndOfDocument() &lt;/span&gt;&lt;span style="color: #008080"&gt;7&lt;/span&gt; &lt;span style="color: #000000"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;End
Sub&lt;/span&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;h4&gt;&lt;a name="FixingThings"&gt;Fixing Things in the Solution&lt;/a&gt;
&lt;/h4&gt;
&lt;p&gt;
One of the frustrating things about creating NHibernate mapping files is remembering
to set the build action to Embedded Resource.&amp;nbsp; Or remembering to set the build
action of images, sounds and movie clips and other files to Embedded Resource.&amp;nbsp;
Why not let a macro fix this mess for you too?
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:f7f2285d-9603-4135-bbc5-aa62bd882289" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color: #ffff80"&gt;
&lt;div&gt;
&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; FixThings() &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; project &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Project &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; projectItem &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; UIHierarchyItem &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; folder &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; UIHierarchyItem
projectItem &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; GetProject(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;DataAccessProject&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)
folder &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; projectItem.UIHierarchyItems.Item(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;Mappings&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)
EmbeddResources(folder, &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;hbm.xml&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)
project &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; projectItem.Object
project.Save() projectItem &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; GetProject(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;UserInterfaceProject&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)
folder &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; projectItem.UIHierarchyItems.Item(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;Icons&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)
EmbeddResources(folder, &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;png&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)
project &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; projectItem.Object
project.Save() DTE.StatusBar.Clear() DTE.StatusBar.Progress(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;False&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Catch&lt;/span&gt;&lt;span style="color: #000000"&gt; ex &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Exception &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End
Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;&lt;span style="color: #000000"&gt; EmbeddResources(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByRef&lt;/span&gt;&lt;span style="color: #000000"&gt; folder &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; UIHierarchyItem, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt;&lt;span style="color: #000000"&gt; extension &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;&lt;span style="color: #000000"&gt;) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt;&lt;span style="color: #000000"&gt; file &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; ProjectItem &lt;/span&gt;&lt;span style="color: #0000ff"&gt;For&lt;/span&gt;&lt;span style="color: #000000"&gt; i &lt;/span&gt;&lt;span style="color: #0000ff"&gt;As&lt;/span&gt;&lt;span style="color: #000000"&gt; Int32 &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;1&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;To&lt;/span&gt;&lt;span style="color: #000000"&gt; folder.UIHierarchyItems.Count
file &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; folder.UIHierarchyItems.Item(i).Object
DTE.StatusBar.Progress(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;True&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;Setting
BuildAction in &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000"&gt; folder.Name,
i, folder.UIHierarchyItems.Count) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; file.Name.EndsWith(extension) &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;&lt;span style="color: #000000"&gt; file.Properties.Item(&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;BuildAction&lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;).Value &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;3&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #008000"&gt;'&lt;/span&gt;&lt;span style="color: #008000"&gt; Embedded
Resource&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;If&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;Next&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;End
Sub&lt;/span&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
There you have it, some simple Visual Studio macros to make your development much
easier!&amp;nbsp; Questions, comments, concerns, leave me a comment.
&lt;/p&gt;
&lt;h3&gt;Your Macros, Now Only a Click Away!
&lt;/h3&gt;
&lt;p&gt;
Now that we have all of these macros, we need a way to quickly and easily access them.&amp;nbsp;
Custom Visual Studio toolbars to the rescue!&amp;nbsp; To create a custom toolbar, click
on Tools -&amp;gt; Customize -&amp;gt; Toolbars.&amp;nbsp; From there click on the "New" button
and give it a name.&amp;nbsp; I choose the very original name of "My Macros" :). Dock
your toolbar if you'd like.
&lt;/p&gt;
&lt;p&gt;
With that done, click over to "Commands" tab and click on "Macros" in the left-side.
All of your macros, as well as the sample macros will show up in the right-side.&amp;nbsp;
Drag the macros you want to the toolbar you just created.&amp;nbsp; You'll notice that
your macro has a really long name like "Macros.MyMacros.SomeName.CollapseTopLevel."&amp;nbsp;
Long names like that will quickly eat up your valuable screen real estate.
&lt;/p&gt;
&lt;p&gt;
Thankfully we can fix that.&amp;nbsp; While still in Customize mode, you can right-click
on your macro in the toolbar (and indeed any item in any toolbar) and the third option
down is "Name."&amp;nbsp; Set this to what ever you want.&amp;nbsp; Since screen real-estate
is precious to me, I named my "Macros.MyMacros.ProjectName.CollapseTopLevel" macro
to "ClpseTopLvl".
&lt;/p&gt;
&lt;h3&gt;Update
&lt;/h3&gt;
&lt;p&gt;
In my haste to publish this article at around 1 AM I failed to mention how to create
a custom tool bar to give you quick access to all of your macros.
&lt;/p&gt;
&lt;p&gt;
11-Feb-2009 - &lt;a href="http://dotnetbutchering.blogspot.com" target="_blank"&gt;Johnny
Idol&lt;/a&gt; has referenced this blog post, and &lt;a href="http://dotnetbutchering.blogspot.com/2009/02/visualstudio-collapse-all-projects-in.html" target="_blank"&gt;gone
into detail about how to actually create the macros and bind keyboard shortcuts to
them&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.milkcarton.com/blog/aggbug.ashx?id=bc7483b7-025b-45b7-9c8b-9a29ae90da5a" /&gt;</description>
      <comments>http://www.milkcarton.com/blog/CommentView,guid,bc7483b7-025b-45b7-9c8b-9a29ae90da5a.aspx</comments>
      <category>Macros</category>
      <category>VisualStudio</category>
    </item>
  </channel>
</rss>