<?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:georss="http://www.georss.org/georss" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Static Void - Coderush</title>
    <link>http://martinwilley.com/blog/</link>
    <description>What next?</description>
    <language>en-us</language>
    <copyright>Martin Willey</copyright>
    <lastBuildDate>Sun, 06 Jun 2010 15:30:02 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>me@martinwilley.com</managingEditor>
    <webMaster>me@martinwilley.com</webMaster>
    <item>
      <trackback:ping>http://martinwilley.com/blog/Trackback.aspx?guid=3c13f5c7-17e1-42e1-be64-3e4bea605a5a</trackback:ping>
      <pingback:server>http://martinwilley.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://martinwilley.com/blog/PermaLink,guid,3c13f5c7-17e1-42e1-be64-3e4bea605a5a.aspx</pingback:target>
      <dc:creator>Martin</dc:creator>
      <wfw:comment>http://martinwilley.com/blog/CommentView,guid,3c13f5c7-17e1-42e1-be64-3e4bea605a5a.aspx</wfw:comment>
      <wfw:commentRss>http://martinwilley.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=3c13f5c7-17e1-42e1-be64-3e4bea605a5a</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
One of the really useful Visual Studio add-ins is <a href="http://weblogs.asp.net/alex_papadimoulis/archive/2004/05/25/Smart-Paster-1.1-Add-In---StringBuilder-and-Better-C_2300_-Handling.aspx" target="_blank">Smart
Paster</a>. It adds a "Paste As." context menu that allows you to paste in the clipboard
text as a comment, a correctly quoted string or a string builder.
</p>
        <p>
          <a href="http://www.martinwilley.com/blog/content/binary/SmartPastein2010_E81F/smartpaster.png">
            <img style="border-width: 0px; display: inline;" title="smartpaster" alt="smartpaster" src="http://www.martinwilley.com/blog/content/binary/SmartPastein2010_E81F/smartpaster_thumb.png" height="46" border="0" width="244" />
          </a>
        </p>
        <p>
There are versions for VS 2003, 2005 and 2008. But not 2010.
</p>
        <p>
Sometimes you can just copy in the dll and addin file into the VS 2010 Addins folder
(.\Documents\Visual Studio 2010\Addins) and edit the addin file (it's just xml) to
say "10.0" instead of "9.0". But that doesn't work for SmartPaster - VS 2010 shows
an error and insists on disabling the addin.
</p>
        <p>
The VS 2008 download includes the source, so I tried to upgrade it.
</p>
        <p>
It turns out the problem is when it creates the context menus it sets the CommandBarButton.FaceId
property (to show an image next to the text). But in VS2010 that throws a DeprecatedException. 
</p>
        <p>
Ok, simple fix, but the original source is old code with a fairly high WTF-per-line
ratio (well, it was written 2004, .Net 1.1). Before long I had ported it from VB.Net
to C# (thanks <a href="http://converter.telerik.com/" target="_blank">Telerik</a>)
and rewritten large parts (mostly refactoring with Coderush). I simplified by dropping
the "regionize" stuff (never use it), the VB support and the configuration form. Here's
my code- you can create a new Extensibility Addin project, replace the Connect class
and add the SmartPaster class- see below.
</p>
        <p>
It's still a port, so certainly not as clean as something just written from scratch.
And perhaps VS2010 has nicer ways of doing all these things now the code window is
a WPF control - the EnvDTE objects are ugly and hard to use. Anyway, thanks to Alex
Papadimoulis for the original code.
</p>
        <p>
          <b>
            <font color="#ff0000">Update: <a href="http://www.martinwilley.com/download/?p=sp2010">download
the binary</a> and unzip into your Addins folder.</font>
          </b> 
</p>
        <p>
          <b>
            <font color="#FF0000">Update 2: source and binary are also on</font>
            <font color="#000080">
              <a href="http://smartpaster2010.codeplex.com/">Codeplex</a>
            </font>
          </b>.<font color="#FF0000"> (It's
exactly the same as shown here.)</font></p>
        <p>
          <font color="#FF0000">
            <b>Update 3 (March 2012): The <a href="http://smartpaster2010.codeplex.com/">Codeplex
version</a> is updated to support VB.Net and is compatible with Visual Studio 11</b>
          </font>
          <br />
        </p>
        <p>
          <br />
        </p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="lnum"> 1: </span>
            <span class="kwrd">using</span> System;</pre>
          <pre>
            <span class="lnum"> 2: </span>
            <span class="kwrd">using</span> System.Collections;</pre>
          <pre class="alt">
            <span class="lnum"> 3: </span>
            <span class="kwrd">using</span> EnvDTE;</pre>
          <pre>
            <span class="lnum"> 4: </span>
            <span class="kwrd">using</span> EnvDTE80;</pre>
          <pre class="alt">
            <span class="lnum"> 5: </span>
            <span class="kwrd">using</span> Extensibility;</pre>
          <pre>
            <span class="lnum"> 6: </span>
            <span class="kwrd">using</span> Microsoft.VisualStudio.CommandBars;</pre>
          <pre class="alt">
            <span class="lnum"> 7: </span> </pre>
          <pre>
            <span class="lnum"> 8: </span>
            <span class="kwrd">namespace</span> SmartPaster2010</pre>
          <pre class="alt">
            <span class="lnum"> 9: </span>{</pre>
          <pre>
            <span class="lnum"> 10: </span>
            <span class="rem">///&lt;summary&gt;The object
for implementing an Add-in.&lt;/summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 11: </span>
            <span class="rem">///&lt;seealso
class='IDTExtensibility2' /&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 12: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">class</span> Connect
: IDTExtensibility2</pre>
          <pre class="alt">
            <span class="lnum"> 13: </span> {</pre>
          <pre>
            <span class="lnum"> 14: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">readonly</span> ArrayList
_pasteAsButtons;</pre>
          <pre class="alt">
            <span class="lnum"> 15: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">readonly</span> SmartPaster
_smartPaster;</pre>
          <pre>
            <span class="lnum"> 16: </span>
            <span class="kwrd">private</span> CommandBarPopup
_pasteAsPopup;</pre>
          <pre class="alt">
            <span class="lnum"> 17: </span> </pre>
          <pre>
            <span class="lnum"> 18: </span>
            <span class="rem">///&lt;summary&gt;Implements
the constructor for the Add-in object. Place your initialization code within this
method.&lt;/summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 19: </span>
            <span class="kwrd">public</span> Connect()</pre>
          <pre>
            <span class="lnum"> 20: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 21: </span> _pasteAsButtons = <span class="kwrd">new</span> ArrayList();</pre>
          <pre>
            <span class="lnum"> 22: </span> _smartPaster = <span class="kwrd">new</span> SmartPaster();</pre>
          <pre class="alt">
            <span class="lnum"> 23: </span> }</pre>
          <pre>
            <span class="lnum"> 24: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 25: </span>
            <span class="rem">///&lt;summary&gt;Implements
the OnConnection method of the IDTExtensibility2 interface. Receives notification
that the Add-in is being loaded.&lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 26: </span>
            <span class="rem">///&lt;param term='application'&gt;Root
object of the host application.&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 27: </span>
            <span class="rem">///&lt;param term='connectMode'&gt;Describes
how the Add-in is being loaded.&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 28: </span>
            <span class="rem">///&lt;param term='addInInst'&gt;Object
representing this Add-in.&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 29: </span>
            <span class="rem">///&lt;seealso
class='IDTExtensibility2' /&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 30: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> OnConnection(<span class="kwrd">object</span> application,
ext_ConnectMode connectMode, </pre>
          <pre>
            <span class="kwrd">object</span> addInInst, <span class="kwrd">ref</span> Array
custom)</pre>
          <pre class="alt">
            <span class="lnum"> 31: </span> {</pre>
          <pre>
            <span class="lnum"> 32: </span> _applicationObject = (DTE2)application;</pre>
          <pre class="alt">
            <span class="lnum"> 33: </span> _addInInstance = (AddIn)addInInst;</pre>
          <pre>
            <span class="lnum"> 34: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 35: </span> </pre>
          <pre>
            <span class="lnum"> 36: </span>
            <span class="rem">//check for the commands</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 37: </span>
            <span class="kwrd">bool</span> cmdExists
= <span class="kwrd">false</span>;</pre>
          <pre>
            <span class="lnum"> 38: </span>
            <span class="kwrd">foreach</span> (Command cmd <span class="kwrd">in</span> _applicationObject.Commands)</pre>
          <pre class="alt">
            <span class="lnum"> 39: </span> {</pre>
          <pre>
            <span class="lnum"> 40: </span>
            <span class="kwrd">if</span> (cmd.Name.EndsWith(<span class="str">"PasteAsComment"</span>,
StringComparison.OrdinalIgnoreCase))</pre>
          <pre class="alt">
            <span class="lnum"> 41: </span> {</pre>
          <pre>
            <span class="lnum"> 42: </span> cmdExists = <span class="kwrd">true</span>;</pre>
          <pre class="alt">
            <span class="lnum"> 43: </span>
            <span class="kwrd">break</span>;</pre>
          <pre>
            <span class="lnum"> 44: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 45: </span> }</pre>
          <pre>
            <span class="lnum"> 46: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 47: </span>
            <span class="kwrd">try</span>
          </pre>
          <pre>
            <span class="lnum"> 48: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 49: </span>
            <span class="kwrd">if</span> (!cmdExists)</pre>
          <pre>
            <span class="lnum"> 50: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 51: </span> AddPasteAsCommands();</pre>
          <pre>
            <span class="lnum"> 52: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 53: </span> </pre>
          <pre>
            <span class="lnum"> 54: </span>
            <span class="kwrd">if</span> (connectMode ==
ext_ConnectMode.ext_cm_Startup &amp;&amp; _pasteAsPopup == <span class="kwrd">null</span>)</pre>
          <pre class="alt">
            <span class="lnum"> 55: </span> {</pre>
          <pre>
            <span class="lnum"> 56: </span>
            <span class="rem">//Add items to the Context
(Right-Click) Menu</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 57: </span>
            <span class="rem">//find the position
of the &amp;Paste command</span>
          </pre>
          <pre>
            <span class="lnum"> 58: </span>
            <span class="kwrd">int</span> position = 0;</pre>
          <pre class="alt">
            <span class="lnum"> 59: </span> </pre>
          <pre>
            <span class="lnum"> 60: </span> CommandBar codeWindow = _applicationObject.CommandBars[<span class="str">"Code
Window"</span>];</pre>
          <pre class="alt">
            <span class="lnum"> 61: </span> </pre>
          <pre>
            <span class="lnum"> 62: </span>
            <span class="kwrd">for</span> (<span class="kwrd">int</span> i
= 1; i &lt;= codeWindow.Controls.Count; i++)</pre>
          <pre class="alt">
            <span class="lnum"> 63: </span> {</pre>
          <pre>
            <span class="lnum"> 64: </span>
            <span class="kwrd">if</span> (codeWindow.Controls[i].Caption
== <span class="str">"&amp;Paste"</span>)</pre>
          <pre class="alt">
            <span class="lnum"> 65: </span> {</pre>
          <pre>
            <span class="lnum"> 66: </span> position = i;</pre>
          <pre class="alt">
            <span class="lnum"> 67: </span>
            <span class="kwrd">break</span>;</pre>
          <pre>
            <span class="lnum"> 68: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 69: </span> }</pre>
          <pre>
            <span class="lnum"> 70: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 71: </span>
            <span class="rem">//add the popup
menu "Paste As...", which may already be on the menu</span>
          </pre>
          <pre>
            <span class="lnum"> 72: </span> _pasteAsPopup = (CommandBarPopup)codeWindow.Controls.Add(</pre>
          <pre>(<span class="kwrd">int</span>)MsoControlType.msoControlPopup, 1, Type.Missing,
position + 1, Type.Missing);</pre>
          <pre class="alt">
            <span class="lnum"> 73: </span> _pasteAsPopup.Caption = <span class="str">"Paste
As ..."</span>;</pre>
          <pre>
            <span class="lnum"> 74: </span> AddPasteAsButtons();</pre>
          <pre class="alt">
            <span class="lnum"> 75: </span> }</pre>
          <pre>
            <span class="lnum"> 76: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 77: </span> }</pre>
          <pre>
            <span class="lnum"> 78: </span>
            <span class="kwrd">catch</span> (Exception ex)</pre>
          <pre class="alt">
            <span class="lnum"> 79: </span> {</pre>
          <pre>
            <span class="lnum"> 80: </span> System.Diagnostics.Debug.WriteLine(ex.Message);</pre>
          <pre class="alt">
            <span class="lnum"> 81: </span> }</pre>
          <pre>
            <span class="lnum"> 82: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 83: </span> </pre>
          <pre>
            <span class="lnum"> 84: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">void</span> AddPasteAsCommands()</pre>
          <pre class="alt">
            <span class="lnum"> 85: </span> {</pre>
          <pre>
            <span class="lnum"> 86: </span>
            <span class="rem">//no configure or regionize
because I never use 'em</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 87: </span> _applicationObject.Commands.AddNamedCommand(_addInInstance, <span class="str">"PasteAsComment"</span>, <span class="str">"Paste
As Comment"</span>, <span class="str">"Pastes clipboard text as a comment."</span>, <span class="kwrd">true</span>,
22, <span class="kwrd">null</span>, Convert.ToInt32(vsCommandStatus.vsCommandStatusSupported)
+ Convert.ToInt32(vsCommandStatus.vsCommandStatusEnabled));</pre>
          <pre>
            <span class="lnum"> 88: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 89: </span> _applicationObject.Commands.AddNamedCommand(_addInInstance, <span class="str">"PasteAsString"</span>, <span class="str">"Paste
As String"</span>, <span class="str">"Pastes clipboard text as a string literal."</span>, <span class="kwrd">true</span>,
22, <span class="kwrd">null</span>, Convert.ToInt32(vsCommandStatus.vsCommandStatusSupported)
+ Convert.ToInt32(vsCommandStatus.vsCommandStatusEnabled));</pre>
          <pre>
            <span class="lnum"> 90: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 91: </span> _applicationObject.Commands.AddNamedCommand(_addInInstance, <span class="str">"PasteAsStringBuilder"</span>, <span class="str">"Paste
As StringBuilder"</span>, <span class="str">"Pastes clipboard text as a stringbuilder."</span>, <span class="kwrd">true</span>,
22, <span class="kwrd">null</span>, Convert.ToInt32(vsCommandStatus.vsCommandStatusSupported)
+ Convert.ToInt32(vsCommandStatus.vsCommandStatusEnabled));</pre>
          <pre>
            <span class="lnum"> 92: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 93: </span> </pre>
          <pre>
            <span class="lnum"> 94: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 95: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">void</span> AddPasteAsButtons()</pre>
          <pre>
            <span class="lnum"> 96: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 97: </span> </pre>
          <pre>
            <span class="lnum"> 98: </span>
            <span class="rem">//now the buttons</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 99: </span> CommandBarButton pasteAsButton;</pre>
          <pre>
            <span class="lnum"> 100: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 101: </span>
            <span class="rem">//add "Comment"</span>
          </pre>
          <pre>
            <span class="lnum"> 102: </span> pasteAsButton = AddCommandButton();</pre>
          <pre class="alt">
            <span class="lnum"> 103: </span> pasteAsButton.Caption = <span class="str">"Comment"</span>;</pre>
          <pre>
            <span class="lnum"> 104: </span> pasteAsButton.TooltipText = <span class="str">"Inserts
clipboard with each line prefixed with a comment character"</span>;</pre>
          <pre class="alt">
            <span class="lnum"> 105: </span> pasteAsButton.Click += PasteAsComment;</pre>
          <pre>
            <span class="lnum"> 106: </span> _pasteAsButtons.Add(pasteAsButton);</pre>
          <pre class="alt">
            <span class="lnum"> 107: </span> </pre>
          <pre>
            <span class="lnum"> 108: </span>
            <span class="rem">//add "String"</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 109: </span> pasteAsButton = AddCommandButton();</pre>
          <pre>
            <span class="lnum"> 110: </span> pasteAsButton.Caption = <span class="str">"String"</span>;</pre>
          <pre class="alt">
            <span class="lnum"> 111: </span> pasteAsButton.TooltipText = <span class="str">"Inserts
enquoted clipboard text with line breaks and other characters escaped"</span>;</pre>
          <pre>
            <span class="lnum"> 112: </span> pasteAsButton.Click += PasteAsString;</pre>
          <pre class="alt">
            <span class="lnum"> 113: </span> _pasteAsButtons.Add(pasteAsButton);</pre>
          <pre>
            <span class="lnum"> 114: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 115: </span>
            <span class="rem">//add "StringBuilder"</span>
          </pre>
          <pre>
            <span class="lnum"> 116: </span> pasteAsButton = AddCommandButton();</pre>
          <pre class="alt">
            <span class="lnum"> 117: </span> pasteAsButton.Caption = <span class="str">"StringBuilder"</span>;</pre>
          <pre>
            <span class="lnum"> 118: </span> pasteAsButton.TooltipText = <span class="str">"Inserts
enquoted clipboard text built up by a stringbuilder."</span>;</pre>
          <pre class="alt">
            <span class="lnum"> 119: </span> pasteAsButton.Click += PasteAsStringBuilder;</pre>
          <pre>
            <span class="lnum"> 120: </span> _pasteAsButtons.Add(pasteAsButton);</pre>
          <pre class="alt">
            <span class="lnum"> 121: </span> </pre>
          <pre>
            <span class="lnum"> 122: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 123: </span> </pre>
          <pre>
            <span class="lnum"> 124: </span>
            <span class="kwrd">private</span> CommandBarButton
AddCommandButton()</pre>
          <pre class="alt">
            <span class="lnum"> 125: </span> {</pre>
          <pre>
            <span class="lnum"> 126: </span> var pasteAsButton = (CommandBarButton)_pasteAsPopup.Controls.Add((<span class="kwrd">int</span>)MsoControlType.msoControlButton);</pre>
          <pre class="alt">
            <span class="lnum"> 127: </span>
            <span class="rem">//in 2010, CommandBarButton.FaceId
throws a DeprecatedException.</span>
          </pre>
          <pre>
            <span class="lnum"> 128: </span>
            <span class="rem">//pasteAsButton.FaceId = 22;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 129: </span> pasteAsButton.Visible = <span class="kwrd">true</span>;</pre>
          <pre>
            <span class="lnum"> 130: </span>
            <span class="kwrd">return</span> pasteAsButton;</pre>
          <pre class="alt">
            <span class="lnum"> 131: </span> }</pre>
          <pre>
            <span class="lnum"> 132: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 133: </span>
            <span class="preproc">#region</span>
            <span class="str">"PasteAs
Handlers"</span>
          </pre>
          <pre>
            <span class="lnum"> 134: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 135: </span>
            <span class="rem">///&lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 136: </span>
            <span class="rem">///Occurs when the user clicks
the PasteAsString button.</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 137: </span>
            <span class="rem">///&lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 138: </span>
            <span class="rem">///&lt;param name="ctrl"&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 139: </span>
            <span class="rem">///Denotes the
CommandBarButton control that initiated the event. </span>
          </pre>
          <pre>
            <span class="lnum"> 140: </span>
            <span class="rem">///&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 141: </span>
            <span class="rem">///&lt;param name="cancelDefault"&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 142: </span>
            <span class="rem">///False if the default behavior
associated with the CommandBarButton control occurs, unless its canceled by another
process or add-in. </span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 143: </span>
            <span class="rem">///&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 144: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">void</span> PasteAsString(CommandBarButton
ctrl, <span class="kwrd">ref</span><span class="kwrd">bool</span> cancelDefault)</pre>
          <pre class="alt">
            <span class="lnum"> 145: </span> {</pre>
          <pre>
            <span class="lnum"> 146: </span> _smartPaster.PasteAsString(_applicationObject);</pre>
          <pre class="alt">
            <span class="lnum"> 147: </span> }</pre>
          <pre>
            <span class="lnum"> 148: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 149: </span> </pre>
          <pre>
            <span class="lnum"> 150: </span>
            <span class="rem">///&lt;summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 151: </span>
            <span class="rem">///Occurs when
the user clicks the PasteAsComment button.</span>
          </pre>
          <pre>
            <span class="lnum"> 152: </span>
            <span class="rem">///&lt;/summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 153: </span>
            <span class="rem">///&lt;param name="ctrl"&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 154: </span>
            <span class="rem">///Denotes the CommandBarButton
control that initiated the event. </span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 155: </span>
            <span class="rem">///&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 156: </span>
            <span class="rem">///&lt;param name="cancelDefault"&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 157: </span>
            <span class="rem">///False if the
default behavior associated with the CommandBarButton control occurs, unless its canceled
by another process or add-in. </span>
          </pre>
          <pre>
            <span class="lnum"> 158: </span>
            <span class="rem">///&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 159: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">void</span> PasteAsComment(CommandBarButton
ctrl, <span class="kwrd">ref</span><span class="kwrd">bool</span> cancelDefault)</pre>
          <pre>
            <span class="lnum"> 160: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 161: </span> _smartPaster.PasteAsComment(_applicationObject);</pre>
          <pre>
            <span class="lnum"> 162: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 163: </span> </pre>
          <pre>
            <span class="lnum"> 164: </span>
            <span class="rem">///&lt;summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 165: </span>
            <span class="rem">///Occurs when
the user clicks the PasteAsStringBuilder button.</span>
          </pre>
          <pre>
            <span class="lnum"> 166: </span>
            <span class="rem">///&lt;/summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 167: </span>
            <span class="rem">///&lt;param name="ctrl"&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 168: </span>
            <span class="rem">///Denotes the CommandBarButton
control that initiated the event. </span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 169: </span>
            <span class="rem">///&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 170: </span>
            <span class="rem">///&lt;param name="cancelDefault"&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 171: </span>
            <span class="rem">///False if the
default behavior associated with the CommandBarButton control occurs, unless its canceled
by another process or add-in. </span>
          </pre>
          <pre>
            <span class="lnum"> 172: </span>
            <span class="rem">///&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 173: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">void</span> PasteAsStringBuilder(CommandBarButton
ctrl, <span class="kwrd">ref</span><span class="kwrd">bool</span> cancelDefault)</pre>
          <pre>
            <span class="lnum"> 174: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 175: </span> _smartPaster.PasteAsStringBuilder(_applicationObject);</pre>
          <pre>
            <span class="lnum"> 176: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 177: </span>
            <span class="preproc">#endregion</span>
          </pre>
          <pre>
            <span class="lnum"> 178: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 179: </span>
            <span class="preproc">#region</span>
            <span class="str">"Exec"</span>
          </pre>
          <pre>
            <span class="lnum"> 180: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 181: </span>
            <span class="rem">///&lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 182: </span>
            <span class="rem">/// Implements the Exec method
of the IDTCommandTarget interface.</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 183: </span>
            <span class="rem">/// This is called
when the command is invoked.</span>
          </pre>
          <pre>
            <span class="lnum"> 184: </span>
            <span class="rem">///&lt;/summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 185: </span>
            <span class="rem">///&lt;param name='commandName'&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 186: </span>
            <span class="rem">/// The name of the command
to execute.</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 187: </span>
            <span class="rem">///&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 188: </span>
            <span class="rem">///&lt;param name='executeOption'&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 189: </span>
            <span class="rem">/// Describes
how the command should be run.</span>
          </pre>
          <pre>
            <span class="lnum"> 190: </span>
            <span class="rem">///&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 191: </span>
            <span class="rem">///&lt;param name='varIn'&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 192: </span>
            <span class="rem">/// Parameters passed from
the caller to the command handler.</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 193: </span>
            <span class="rem">///&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 194: </span>
            <span class="rem">///&lt;param name='varOut'&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 195: </span>
            <span class="rem">/// Parameters
passed from the command handler to the caller.</span>
          </pre>
          <pre>
            <span class="lnum"> 196: </span>
            <span class="rem">///&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 197: </span>
            <span class="rem">///&lt;param name='handled'&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 198: </span>
            <span class="rem">/// Informs the caller if
the command was handled or not.</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 199: </span>
            <span class="rem">///&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 200: </span>
            <span class="rem">///&lt;seealso class='Exec'
/&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 201: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> Exec(<span class="kwrd">string</span> commandName,
vsCommandExecOption executeOption, <span class="kwrd">ref</span><span class="kwrd">object</span> varIn, <span class="kwrd">ref</span><span class="kwrd">object</span> varOut, <span class="kwrd">ref</span><span class="kwrd">bool</span> handled)</pre>
          <pre>
            <span class="lnum"> 202: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 203: </span> handled = <span class="kwrd">false</span>;</pre>
          <pre>
            <span class="lnum"> 204: </span>
            <span class="kwrd">if</span> ((executeOption
== vsCommandExecOption.vsCommandExecOptionDoDefault))</pre>
          <pre class="alt">
            <span class="lnum"> 205: </span> {</pre>
          <pre>
            <span class="lnum"> 206: </span> handled = <span class="kwrd">true</span>;</pre>
          <pre class="alt">
            <span class="lnum"> 207: </span>
            <span class="kwrd">switch</span> (commandName)</pre>
          <pre>
            <span class="lnum"> 208: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 209: </span>
            <span class="rem">//case "SmartPaster.Connect.Configure":</span>
          </pre>
          <pre>
            <span class="lnum"> 210: </span>
            <span class="rem">// //show the config form</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 211: </span>
            <span class="rem">// SmartPasterForm
myForm = new SmartPasterForm();</span>
          </pre>
          <pre>
            <span class="lnum"> 212: </span>
            <span class="rem">// myForm.ShowDialog();</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 213: </span>
            <span class="rem">// //since config
may have changed, show/hide buttons</span>
          </pre>
          <pre>
            <span class="lnum"> 214: </span>
            <span class="rem">// EnableContextMenuButtons();</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 215: </span> </pre>
          <pre>
            <span class="lnum"> 216: </span>
            <span class="rem">// break;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 217: </span>
            <span class="kwrd">case</span>
            <span class="str">"SmartPaster.Connect.PasteAsComment"</span>:</pre>
          <pre>
            <span class="lnum"> 218: </span> _smartPaster.PasteAsComment(_applicationObject);</pre>
          <pre class="alt">
            <span class="lnum"> 219: </span>
            <span class="kwrd">break</span>;</pre>
          <pre>
            <span class="lnum"> 220: </span>
            <span class="kwrd">case</span>
            <span class="str">"SmartPaster.Connect.PasteAsString"</span>:</pre>
          <pre class="alt">
            <span class="lnum"> 221: </span> _smartPaster.PasteAsString(_applicationObject);</pre>
          <pre>
            <span class="lnum"> 222: </span>
            <span class="kwrd">break</span>;</pre>
          <pre class="alt">
            <span class="lnum"> 223: </span>
            <span class="kwrd">case</span>
            <span class="str">"SmartPaster.Connect.PasteAsStringBuilder"</span>:</pre>
          <pre>
            <span class="lnum"> 224: </span> _smartPaster.PasteAsStringBuilder(_applicationObject);</pre>
          <pre class="alt">
            <span class="lnum"> 225: </span>
            <span class="kwrd">break</span>;</pre>
          <pre>
            <span class="lnum"> 226: </span>
            <span class="rem">//case "SmartPaster.Connect.PasteAsRegion":</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 227: </span>
            <span class="rem">// _smartPaster.PasteAsRegion(_applicationObject);</span>
          </pre>
          <pre>
            <span class="lnum"> 228: </span>
            <span class="rem">// break;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 229: </span>
            <span class="kwrd">default</span>:</pre>
          <pre>
            <span class="lnum"> 230: </span> handled = <span class="kwrd">false</span>;</pre>
          <pre class="alt">
            <span class="lnum"> 231: </span>
            <span class="kwrd">break</span>;</pre>
          <pre>
            <span class="lnum"> 232: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 233: </span> }</pre>
          <pre>
            <span class="lnum"> 234: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 235: </span>
            <span class="preproc">#endregion</span>
          </pre>
          <pre>
            <span class="lnum"> 236: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 237: </span>
            <span class="preproc">#region</span> Standard
Template Stuff</pre>
          <pre>
            <span class="lnum"> 238: </span>
            <span class="rem">///&lt;summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 239: </span>
            <span class="rem">///Implements
the OnDisconnection method of the IDTExtensibility2 interface. Receives notification
that the Add-in is being unloaded.</span>
          </pre>
          <pre>
            <span class="lnum"> 240: </span>
            <span class="rem">///&lt;/summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 241: </span>
            <span class="rem">///&lt;param name="disconnectMode"&gt;The
disconnect mode.&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 242: </span>
            <span class="rem">///&lt;param name="custom"&gt;The
custom.&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 243: </span>
            <span class="rem">///&lt;seealso
class="IDTExtensibility2"/&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 244: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> OnDisconnection(ext_DisconnectMode
disconnectMode, <span class="kwrd">ref</span> Array custom)</pre>
          <pre class="alt">
            <span class="lnum"> 245: </span> {</pre>
          <pre>
            <span class="lnum"> 246: </span>
            <span class="kwrd">if</span> (_pasteAsPopup
!= <span class="kwrd">null</span> &amp;&amp; </pre>
          <pre class="alt">
            <span class="lnum"> 247: </span> (disconnectMode == ext_DisconnectMode.ext_dm_UserClosed
|| disconnectMode == ext_DisconnectMode.ext_dm_HostShutdown))</pre>
          <pre>
            <span class="lnum"> 248: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 249: </span> _pasteAsPopup.Delete(<span class="kwrd">true</span>);</pre>
          <pre>
            <span class="lnum"> 250: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 251: </span> }</pre>
          <pre>
            <span class="lnum"> 252: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 253: </span>
            <span class="rem">///&lt;summary&gt;Implements
the OnAddInsUpdate method of the IDTExtensibility2 interface. Receives notification
when the collection of Add-ins has changed.&lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 254: </span>
            <span class="rem">///&lt;param term='custom'&gt;Array
of parameters that are host application specific.&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 255: </span>
            <span class="rem">///&lt;seealso
class='IDTExtensibility2' /&gt; </span>
          </pre>
          <pre>
            <span class="lnum"> 256: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> OnAddInsUpdate(<span class="kwrd">ref</span> Array
custom)</pre>
          <pre class="alt">
            <span class="lnum"> 257: </span> {</pre>
          <pre>
            <span class="lnum"> 258: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 259: </span> </pre>
          <pre>
            <span class="lnum"> 260: </span>
            <span class="rem">///&lt;summary&gt;Implements
the OnStartupComplete method of the IDTExtensibility2 interface. Receives notification
that the host application has completed loading.&lt;/summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 261: </span>
            <span class="rem">///&lt;param term='custom'&gt;Array
of parameters that are host application specific.&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 262: </span>
            <span class="rem">///&lt;seealso class='IDTExtensibility2'
/&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 263: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> OnStartupComplete(<span class="kwrd">ref</span> Array
custom)</pre>
          <pre>
            <span class="lnum"> 264: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 265: </span> }</pre>
          <pre>
            <span class="lnum"> 266: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 267: </span>
            <span class="rem">///&lt;summary&gt;Implements
the OnBeginShutdown method of the IDTExtensibility2 interface. Receives notification
that the host application is being unloaded.&lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 268: </span>
            <span class="rem">///&lt;param term='custom'&gt;Array
of parameters that are host application specific.&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 269: </span>
            <span class="rem">///&lt;seealso
class='IDTExtensibility2' /&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 270: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> OnBeginShutdown(<span class="kwrd">ref</span> Array
custom)</pre>
          <pre class="alt">
            <span class="lnum"> 271: </span> {</pre>
          <pre>
            <span class="lnum"> 272: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 273: </span> </pre>
          <pre>
            <span class="lnum"> 274: </span>
            <span class="kwrd">private</span> DTE2 _applicationObject;</pre>
          <pre class="alt">
            <span class="lnum"> 275: </span>
            <span class="kwrd">private</span> AddIn
_addInInstance;</pre>
          <pre>
            <span class="lnum"> 276: </span>
            <span class="preproc">#endregion</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 277: </span> </pre>
          <pre>
            <span class="lnum"> 278: </span>
            <span class="rem">///&lt;summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 279: </span>
            <span class="rem">///Queries the
status.</span>
          </pre>
          <pre>
            <span class="lnum"> 280: </span>
            <span class="rem">///&lt;/summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 281: </span>
            <span class="rem">///&lt;param name="commandName"&gt;Name
of the command.&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 282: </span>
            <span class="rem">///&lt;param name="neededText"&gt;The
needed text.&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 283: </span>
            <span class="rem">///&lt;param name="statusOption"&gt;The
status option.&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 284: </span>
            <span class="rem">///&lt;param name="commandText"&gt;The
command text.&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 285: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> QueryStatus(<span class="kwrd">string</span> commandName,
vsCommandStatusTextWanted neededText, <span class="kwrd">ref</span> vsCommandStatus
statusOption, <span class="kwrd">ref</span><span class="kwrd">object</span> commandText)</pre>
          <pre>
            <span class="lnum"> 286: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 287: </span>
            <span class="kwrd">if</span> (neededText
== vsCommandStatusTextWanted.vsCommandStatusTextWantedNone)</pre>
          <pre>
            <span class="lnum"> 288: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 289: </span>
            <span class="kwrd">if</span> (commandName.StartsWith(<span class="str">"SmartPaster.Connect"</span>))</pre>
          <pre>
            <span class="lnum"> 290: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 291: </span>
            <span class="kwrd">if</span> (((_applicationObject.ActiveDocument
!= <span class="kwrd">null</span>)) &amp;&amp; ((_applicationObject.ActiveDocument.Object(<span class="str">"TextDocument"</span>)
!= <span class="kwrd">null</span>)))</pre>
          <pre>
            <span class="lnum"> 292: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 293: </span> statusOption = vsCommandStatus.vsCommandStatusEnabled
| vsCommandStatus.vsCommandStatusSupported;</pre>
          <pre>
            <span class="lnum"> 294: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 295: </span>
            <span class="kwrd">else</span>
          </pre>
          <pre>
            <span class="lnum"> 296: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 297: </span> statusOption = vsCommandStatus.vsCommandStatusSupported;</pre>
          <pre>
            <span class="lnum"> 298: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 299: </span> }</pre>
          <pre>
            <span class="lnum"> 300: </span>
            <span class="kwrd">else</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 301: </span> {</pre>
          <pre>
            <span class="lnum"> 302: </span> statusOption = vsCommandStatus.vsCommandStatusUnsupported;</pre>
          <pre class="alt">
            <span class="lnum"> 303: </span> }</pre>
          <pre>
            <span class="lnum"> 304: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 305: </span> }</pre>
          <pre>
            <span class="lnum"> 306: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 307: </span>}</pre>
        </div>
        <style type="text/css">

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
Here's the SmartPaster class.
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="lnum"> 1: </span>
            <span class="kwrd">using</span> System;</pre>
          <pre>
            <span class="lnum"> 2: </span>
            <span class="kwrd">using</span> System.IO;</pre>
          <pre class="alt">
            <span class="lnum"> 3: </span>
            <span class="kwrd">using</span> System.Text;</pre>
          <pre>
            <span class="lnum"> 4: </span>
            <span class="kwrd">using</span> System.Windows.Forms; <span class="rem">//clipboard</span></pre>
          <pre class="alt">
            <span class="lnum"> 5: </span>
            <span class="kwrd">using</span> EnvDTE;</pre>
          <pre>
            <span class="lnum"> 6: </span>
            <span class="kwrd">using</span> EnvDTE80;</pre>
          <pre class="alt">
            <span class="lnum"> 7: </span> </pre>
          <pre>
            <span class="lnum"> 8: </span>
            <span class="kwrd">namespace</span> SmartPaster2010</pre>
          <pre class="alt">
            <span class="lnum"> 9: </span>{</pre>
          <pre>
            <span class="lnum"> 10: </span>
            <span class="rem">/// &lt;summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 11: </span>
            <span class="rem">/// Class responsible
for doing the pasting/manipulating of clipdata.</span>
          </pre>
          <pre>
            <span class="lnum"> 12: </span>
            <span class="rem">/// &lt;/summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 13: </span>
            <span class="kwrd">internal</span>
            <span class="kwrd">sealed</span>
            <span class="kwrd">class</span> SmartPaster</pre>
          <pre>
            <span class="lnum"> 14: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 15: </span>
            <span class="rem">/// &lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 16: </span>
            <span class="rem">/// Convient property to retrieve
the clipboard text from the clipboard</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 17: </span>
            <span class="rem">/// &lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 18: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">static</span>
            <span class="kwrd">string</span> ClipboardText</pre>
          <pre class="alt">
            <span class="lnum"> 19: </span> {</pre>
          <pre>
            <span class="lnum"> 20: </span> get</pre>
          <pre class="alt">
            <span class="lnum"> 21: </span> {</pre>
          <pre>
            <span class="lnum"> 22: </span> IDataObject iData = Clipboard.GetDataObject();</pre>
          <pre class="alt">
            <span class="lnum"> 23: </span>
            <span class="kwrd">if</span> (iData.GetDataPresent(DataFormats.Text))</pre>
          <pre>
            <span class="lnum"> 24: </span>
            <span class="kwrd">return</span> Convert.ToString(iData.GetData(DataFormats.Text));</pre>
          <pre class="alt">
            <span class="lnum"> 25: </span>
            <span class="kwrd">return</span>
            <span class="kwrd">string</span>.Empty;</pre>
          <pre>
            <span class="lnum"> 26: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 27: </span> }</pre>
          <pre>
            <span class="lnum"> 28: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 29: </span>
            <span class="preproc">#region</span>
            <span class="str">"Stringinize"</span>
          </pre>
          <pre>
            <span class="lnum"> 30: </span>
            <span class="rem">/// &lt;summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 31: </span>
            <span class="rem">/// Stringinizes
text passed to it for use in C#</span>
          </pre>
          <pre>
            <span class="lnum"> 32: </span>
            <span class="rem">/// &lt;/summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 33: </span>
            <span class="rem">/// &lt;param name="txt"&gt;Text
to be Stringinized&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 34: </span>
            <span class="rem">/// &lt;returns&gt;C# Stringinized
text&lt;/returns&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 35: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">static</span>
            <span class="kwrd">string</span> StringinizeInCs(<span class="kwrd">string</span> txt)</pre>
          <pre>
            <span class="lnum"> 36: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 37: </span>
            <span class="rem">//c# quote character
-- really just a "</span>
          </pre>
          <pre>
            <span class="lnum"> 38: </span>
            <span class="kwrd">const</span>
            <span class="kwrd">string</span> qChr
= <span class="str">"\""</span>;</pre>
          <pre class="alt">
            <span class="lnum"> 39: </span> </pre>
          <pre>
            <span class="lnum"> 40: </span>
            <span class="rem">//sb to work with</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 41: </span> var sb = <span class="kwrd">new</span> StringBuilder(txt);</pre>
          <pre>
            <span class="lnum"> 42: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 43: </span>
            <span class="rem">//escape appropriately</span>
          </pre>
          <pre>
            <span class="lnum"> 44: </span>
            <span class="rem">//escape the quotes with ""</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 45: </span> sb.Replace(qChr, qChr + qChr);</pre>
          <pre>
            <span class="lnum"> 46: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 47: </span>
            <span class="rem">//insert " at beginning
and end</span>
          </pre>
          <pre>
            <span class="lnum"> 48: </span> sb.Insert(0, <span class="str">"@"</span> + qChr);</pre>
          <pre class="alt">
            <span class="lnum"> 49: </span> sb.Append(qChr);</pre>
          <pre>
            <span class="lnum"> 50: </span>
            <span class="kwrd">return</span> sb.ToString();</pre>
          <pre class="alt">
            <span class="lnum"> 51: </span> }</pre>
          <pre>
            <span class="lnum"> 52: </span>
            <span class="preproc">#endregion</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 53: </span> </pre>
          <pre>
            <span class="lnum"> 54: </span>
            <span class="preproc">#region</span>
            <span class="str">"Commentize"</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 55: </span>
            <span class="rem">/// &lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 56: </span>
            <span class="rem">/// Commentizes text passed
to it for use in C#</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 57: </span>
            <span class="rem">/// &lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 58: </span>
            <span class="rem">/// &lt;param name="txt"&gt;Text
to be Stringinized&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 59: </span>
            <span class="rem">/// &lt;returns&gt;C#
Commentized text&lt;/returns&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 60: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">static</span>
            <span class="kwrd">string</span> CommentizeInCs(<span class="kwrd">string</span> txt)</pre>
          <pre class="alt">
            <span class="lnum"> 61: </span> {</pre>
          <pre>
            <span class="lnum"> 62: </span>
            <span class="kwrd">const</span>
            <span class="kwrd">string</span> cmtChar
= <span class="str">"//"</span>;</pre>
          <pre class="alt">
            <span class="lnum"> 63: </span> </pre>
          <pre>
            <span class="lnum"> 64: </span> var sb = <span class="kwrd">new</span> StringBuilder(txt.Length);</pre>
          <pre class="alt">
            <span class="lnum"> 65: </span> </pre>
          <pre>
            <span class="lnum"> 66: </span>
            <span class="rem">//process the passed string
(txt), one line at a time</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 67: </span>
            <span class="rem">//the original
was horrible WTF code</span>
          </pre>
          <pre>
            <span class="lnum"> 68: </span>
            <span class="kwrd">using</span> (var reader = <span class="kwrd">new</span> StringReader(txt))</pre>
          <pre class="alt">
            <span class="lnum"> 69: </span> {</pre>
          <pre>
            <span class="lnum"> 70: </span>
            <span class="kwrd">string</span> line;</pre>
          <pre class="alt">
            <span class="lnum"> 71: </span>
            <span class="kwrd">while</span> ((line
= reader.ReadLine()) != <span class="kwrd">null</span>)</pre>
          <pre>
            <span class="lnum"> 72: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 73: </span> sb.AppendLine(cmtChar + line);</pre>
          <pre>
            <span class="lnum"> 74: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 75: </span> }</pre>
          <pre>
            <span class="lnum"> 76: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 77: </span>
            <span class="kwrd">return</span> sb.ToString();</pre>
          <pre>
            <span class="lnum"> 78: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 79: </span>
            <span class="preproc">#endregion</span>
          </pre>
          <pre>
            <span class="lnum"> 80: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 81: </span>
            <span class="preproc">#region</span>
            <span class="str">"Stringbuilderize"</span>
          </pre>
          <pre>
            <span class="lnum"> 82: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">static</span>
            <span class="kwrd">string</span> StringbuilderizeInCs(<span class="kwrd">string</span> txt, <span class="kwrd">string</span> sbName)</pre>
          <pre class="alt">
            <span class="lnum"> 83: </span> {</pre>
          <pre>
            <span class="lnum"> 84: </span>
            <span class="rem">//c# quote character -- really
just a "</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 85: </span>
            <span class="kwrd">const</span>
            <span class="kwrd">string</span> qChr
= <span class="str">"\""</span>;</pre>
          <pre>
            <span class="lnum"> 86: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 87: </span>
            <span class="rem">//sb to work with</span>
          </pre>
          <pre>
            <span class="lnum"> 88: </span> var sb = <span class="kwrd">new</span> StringBuilder(txt);</pre>
          <pre class="alt">
            <span class="lnum"> 89: </span> </pre>
          <pre>
            <span class="lnum"> 90: </span>
            <span class="rem">//escape \,", and {}</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 91: </span> sb.Replace(qChr, qChr + qChr);</pre>
          <pre>
            <span class="lnum"> 92: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 93: </span>
            <span class="rem">//process the passed
string (txt), one line at a time</span>
          </pre>
          <pre>
            <span class="lnum"> 94: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 95: </span>
            <span class="rem">//dump the stringbuilder
into a temp string</span>
          </pre>
          <pre>
            <span class="lnum"> 96: </span>
            <span class="kwrd">string</span> fullString =
sb.ToString();</pre>
          <pre class="alt">
            <span class="lnum"> 97: </span> sb.Clear(); <span class="rem">//lovely
.net 4 - sb.Remove(0, sb.Length);</span></pre>
          <pre>
            <span class="lnum"> 98: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 99: </span>
            <span class="rem">//the original
was horrible WTF code</span>
          </pre>
          <pre>
            <span class="lnum"> 100: </span>
            <span class="kwrd">using</span> (var reader
= <span class="kwrd">new</span> StringReader(fullString))</pre>
          <pre class="alt">
            <span class="lnum"> 101: </span> {</pre>
          <pre>
            <span class="lnum"> 102: </span>
            <span class="kwrd">string</span> line;</pre>
          <pre class="alt">
            <span class="lnum"> 103: </span>
            <span class="kwrd">while</span> ((line
= reader.ReadLine()) != <span class="kwrd">null</span>)</pre>
          <pre>
            <span class="lnum"> 104: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 105: </span> sb.Append(sbName + <span class="str">".AppendLine("</span>);</pre>
          <pre>
            <span class="lnum"> 106: </span> sb.Append(<span class="str">"@"</span> + qChr);</pre>
          <pre class="alt">
            <span class="lnum"> 107: </span> sb.Append(line.Replace(<span class="str">"\t"</span>, <span class="str">"\\t"</span>));</pre>
          <pre>
            <span class="lnum"> 108: </span> sb.AppendLine(qChr + <span class="str">");"</span>);</pre>
          <pre class="alt">
            <span class="lnum"> 109: </span> }</pre>
          <pre>
            <span class="lnum"> 110: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 111: </span> </pre>
          <pre>
            <span class="lnum"> 112: </span>
            <span class="rem">//TODO: Better '@"" + ' replacement
to not cover inside strings</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 113: </span> sb.Replace(<span class="str">"@"</span> +
qChr + qChr + <span class="str">" + "</span>, <span class="str">""</span>);</pre>
          <pre>
            <span class="lnum"> 114: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 115: </span>
            <span class="rem">//add the dec
statement</span>
          </pre>
          <pre>
            <span class="lnum"> 116: </span> sb.Insert(0, <span class="str">"StringBuilder
"</span> + sbName + <span class="str">" = new StringBuilder("</span> + txt.Length
+ <span class="str">");"</span> + Environment.NewLine);</pre>
          <pre class="alt">
            <span class="lnum"> 117: </span> </pre>
          <pre>
            <span class="lnum"> 118: </span>
            <span class="rem">//and return</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 119: </span>
            <span class="kwrd">return</span> sb.ToString();</pre>
          <pre>
            <span class="lnum"> 120: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 121: </span>
            <span class="preproc">#endregion</span>
          </pre>
          <pre>
            <span class="lnum"> 122: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 123: </span>
            <span class="rem">/// &lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 124: </span>
            <span class="rem">/// Inserts text at current
cursor location in the application</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 125: </span>
            <span class="rem">/// &lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 126: </span>
            <span class="rem">/// &lt;param name="application"&gt;application
with activewindow&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 127: </span>
            <span class="rem">/// &lt;param
name="text"&gt;text to insert&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 128: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">static</span>
            <span class="kwrd">void</span> Paste(DTE2
application, <span class="kwrd">string</span> text)</pre>
          <pre class="alt">
            <span class="lnum"> 129: </span> {</pre>
          <pre>
            <span class="lnum"> 130: </span>
            <span class="rem">//get the text document</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 131: </span> var txt = (TextDocument)application.ActiveDocument.Object(<span class="str">"TextDocument"</span>);</pre>
          <pre>
            <span class="lnum"> 132: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 133: </span>
            <span class="rem">//get an edit
point</span>
          </pre>
          <pre>
            <span class="lnum"> 134: </span> EditPoint ep = txt.Selection.ActivePoint.CreateEditPoint();</pre>
          <pre class="alt">
            <span class="lnum"> 135: </span> </pre>
          <pre>
            <span class="lnum"> 136: </span>
            <span class="rem">//get a start point</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 137: </span> EditPoint sp = txt.Selection.ActivePoint.CreateEditPoint();</pre>
          <pre>
            <span class="lnum"> 138: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 139: </span>
            <span class="rem">//open the undo
context</span>
          </pre>
          <pre>
            <span class="lnum"> 140: </span>
            <span class="kwrd">bool</span> isOpen = application.UndoContext.IsOpen;</pre>
          <pre class="alt">
            <span class="lnum"> 141: </span>
            <span class="kwrd">if</span> (!isOpen)</pre>
          <pre>
            <span class="lnum"> 142: </span> application.UndoContext.Open(<span class="str">"SmartPaster"</span>);</pre>
          <pre class="alt">
            <span class="lnum"> 143: </span> </pre>
          <pre>
            <span class="lnum"> 144: </span>
            <span class="rem">//clear the selection</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 145: </span>
            <span class="kwrd">if</span> (!txt.Selection.IsEmpty)</pre>
          <pre>
            <span class="lnum"> 146: </span> txt.Selection.Delete();</pre>
          <pre class="alt">
            <span class="lnum"> 147: </span> </pre>
          <pre>
            <span class="lnum"> 148: </span>
            <span class="rem">//insert the text</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 149: </span>
            <span class="rem">//ep.Insert(Indent(text,
ep.LineCharOffset))</span>
          </pre>
          <pre>
            <span class="lnum"> 150: </span> ep.Insert(text);</pre>
          <pre class="alt">
            <span class="lnum"> 151: </span> </pre>
          <pre>
            <span class="lnum"> 152: </span>
            <span class="rem">//smart format</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 153: </span> sp.SmartFormat(ep);</pre>
          <pre>
            <span class="lnum"> 154: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 155: </span>
            <span class="rem">//close the context</span>
          </pre>
          <pre>
            <span class="lnum"> 156: </span>
            <span class="kwrd">if</span> (!isOpen)</pre>
          <pre class="alt">
            <span class="lnum"> 157: </span> application.UndoContext.Close();</pre>
          <pre>
            <span class="lnum"> 158: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 159: </span> </pre>
          <pre>
            <span class="lnum"> 160: </span>
            <span class="preproc">#region</span>
            <span class="str">"Paste
As ..."</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 161: </span> </pre>
          <pre>
            <span class="lnum"> 162: </span>
            <span class="rem">/// &lt;summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 163: </span>
            <span class="rem">/// Public method
to paste and format clipboard text as string the cursor </span>
          </pre>
          <pre>
            <span class="lnum"> 164: </span>
            <span class="rem">/// location for the configured
or active window's langage .</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 165: </span>
            <span class="rem">/// &lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 166: </span>
            <span class="rem">/// &lt;param name="application"&gt;application
to insert&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 167: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> PasteAsString(DTE2
application)</pre>
          <pre>
            <span class="lnum"> 168: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 169: </span> Paste(application, StringinizeInCs(ClipboardText));</pre>
          <pre>
            <span class="lnum"> 170: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 171: </span> </pre>
          <pre>
            <span class="lnum"> 172: </span>
            <span class="rem">/// &lt;summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 173: </span>
            <span class="rem">/// Public method
to paste and format clipboard text as comment the cursor </span>
          </pre>
          <pre>
            <span class="lnum"> 174: </span>
            <span class="rem">/// location for the configured
or active window's langage .</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 175: </span>
            <span class="rem">/// &lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 176: </span>
            <span class="rem">/// &lt;param name="application"&gt;application
to insert&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 177: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> PasteAsComment(DTE2
application)</pre>
          <pre>
            <span class="lnum"> 178: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 179: </span> Paste(application, CommentizeInCs(ClipboardText));</pre>
          <pre>
            <span class="lnum"> 180: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 181: </span> </pre>
          <pre>
            <span class="lnum"> 182: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 183: </span>
            <span class="rem">/// &lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 184: </span>
            <span class="rem">/// Public method to paste
format clipboard text into a specified region</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 185: </span>
            <span class="rem">/// &lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 186: </span>
            <span class="rem">/// &lt;param name="application"&gt;application
to insert&lt;/param&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 187: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> PasteAsRegion(DTE2
application)</pre>
          <pre>
            <span class="lnum"> 188: </span> {</pre>
          <pre class="alt">
            <span class="lnum"> 189: </span>
            <span class="rem">//get the region
name</span>
          </pre>
          <pre>
            <span class="lnum"> 190: </span>
            <span class="kwrd">const</span>
            <span class="kwrd">string</span> region
= <span class="str">"myRegion"</span>;</pre>
          <pre class="alt">
            <span class="lnum"> 191: </span> </pre>
          <pre>
            <span class="lnum"> 192: </span>
            <span class="rem">//it's so simple, we really
don't need a function</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 193: </span>
            <span class="kwrd">string</span> csRegionized
= <span class="str">"#region "</span> + region + Environment.NewLine + ClipboardText
+ Environment.NewLine + <span class="str">"#endregion"</span>;</pre>
          <pre>
            <span class="lnum"> 194: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 195: </span>
            <span class="rem">//and paste</span>
          </pre>
          <pre>
            <span class="lnum"> 196: </span> Paste(application, csRegionized);</pre>
          <pre class="alt">
            <span class="lnum"> 197: </span> }</pre>
          <pre>
            <span class="lnum"> 198: </span> </pre>
          <pre class="alt">
            <span class="lnum"> 199: </span>
            <span class="rem">/// &lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 200: </span>
            <span class="rem">/// Public method to paste
and format clipboard text as stringbuilder the cursor </span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 201: </span>
            <span class="rem">/// location for
the configured or active window's langage .</span>
          </pre>
          <pre>
            <span class="lnum"> 202: </span>
            <span class="rem">/// &lt;/summary&gt;</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 203: </span>
            <span class="rem">/// &lt;param
name="application"&gt;application to insert&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 204: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> PasteAsStringBuilder(DTE2
application)</pre>
          <pre class="alt">
            <span class="lnum"> 205: </span> {</pre>
          <pre>
            <span class="lnum"> 206: </span>
            <span class="kwrd">const</span>
            <span class="kwrd">string</span> stringbuilder
= <span class="str">"sb"</span>;</pre>
          <pre class="alt">
            <span class="lnum"> 207: </span> Paste(application, StringbuilderizeInCs(ClipboardText,
stringbuilder));</pre>
          <pre>
            <span class="lnum"> 208: </span> }</pre>
          <pre class="alt">
            <span class="lnum"> 209: </span> </pre>
          <pre>
            <span class="lnum"> 210: </span>
            <span class="preproc">#endregion</span>
          </pre>
          <pre class="alt">
            <span class="lnum"> 211: </span> }</pre>
          <pre>
            <span class="lnum"> 212: </span>}</pre>
        </div>
        <style type="text/css">

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=3c13f5c7-17e1-42e1-be64-3e4bea605a5a" />
      </body>
      <title>Smart Paste in 2010</title>
      <guid isPermaLink="false">http://martinwilley.com/blog/PermaLink,guid,3c13f5c7-17e1-42e1-be64-3e4bea605a5a.aspx</guid>
      <link>http://martinwilley.com/blog/2010/06/06/SmartPasteIn2010.aspx</link>
      <pubDate>Sun, 06 Jun 2010 15:30:02 GMT</pubDate>
      <description>&lt;p&gt;
One of the really useful Visual Studio add-ins is &lt;a href="http://weblogs.asp.net/alex_papadimoulis/archive/2004/05/25/Smart-Paster-1.1-Add-In---StringBuilder-and-Better-C_2300_-Handling.aspx" target="_blank"&gt;Smart
Paster&lt;/a&gt;. It adds a "Paste As." context menu that allows you to paste in the clipboard
text as a comment, a correctly quoted string or a string builder.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.martinwilley.com/blog/content/binary/SmartPastein2010_E81F/smartpaster.png"&gt;&lt;img style="border-width: 0px; display: inline;" title="smartpaster" alt="smartpaster" src="http://www.martinwilley.com/blog/content/binary/SmartPastein2010_E81F/smartpaster_thumb.png" height="46" border="0" width="244"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
There are versions for VS 2003, 2005 and 2008. But not 2010.
&lt;/p&gt;
&lt;p&gt;
Sometimes you can just copy in the dll and addin file into the VS 2010 Addins folder
(.\Documents\Visual Studio 2010\Addins) and edit the addin file (it's just xml) to
say "10.0" instead of "9.0". But that doesn't work for SmartPaster - VS 2010 shows
an error and insists on disabling the addin.
&lt;/p&gt;
&lt;p&gt;
The VS 2008 download includes the source, so I tried to upgrade it.
&lt;/p&gt;
&lt;p&gt;
It turns out the problem is when it creates the context menus it sets the CommandBarButton.FaceId
property (to show an image next to the text). But in VS2010 that throws a DeprecatedException. 
&lt;/p&gt;
&lt;p&gt;
Ok, simple fix, but the original source is old code with a fairly high WTF-per-line
ratio (well, it was written 2004, .Net 1.1). Before long I had ported it from VB.Net
to C# (thanks &lt;a href="http://converter.telerik.com/" target="_blank"&gt;Telerik&lt;/a&gt;)
and rewritten large parts (mostly refactoring with Coderush). I simplified by dropping
the "regionize" stuff (never use it), the VB support and the configuration form. Here's
my code- you can create a new Extensibility Addin project, replace the Connect class
and add the SmartPaster class- see below.
&lt;/p&gt;
&lt;p&gt;
It's still a port, so certainly not as clean as something just written from scratch.
And perhaps VS2010 has nicer ways of doing all these things now the code window is
a WPF control - the EnvDTE objects are ugly and hard to use. Anyway, thanks to Alex
Papadimoulis for the original code.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;&lt;font color="#ff0000"&gt;Update: &lt;a href="http://www.martinwilley.com/download/?p=sp2010"&gt;download
the binary&lt;/a&gt; and unzip into your Addins folder.&lt;/font&gt;&lt;/b&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;&lt;font color="#FF0000"&gt;Update 2: source and binary are also on&lt;/font&gt; &lt;font color="#000080"&gt;&lt;a href="http://smartpaster2010.codeplex.com/"&gt;Codeplex&lt;/a&gt;&lt;/font&gt;&lt;/b&gt;.&lt;font color="#FF0000"&gt; (It's
exactly the same as shown here.)&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#FF0000"&gt;&lt;b&gt;Update 3 (March 2012): The &lt;a href="http://smartpaster2010.codeplex.com/"&gt;Codeplex
version&lt;/a&gt; is updated to support VB.Net and is compatible with Visual Studio 11&lt;/b&gt;&lt;/font&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 3: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; EnvDTE;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 4: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; EnvDTE80;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 5: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Extensibility;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 6: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; Microsoft.VisualStudio.CommandBars;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 7: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 8: &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SmartPaster2010&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 9: &lt;/span&gt;{&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 10: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;The object
for implementing an Add-in.&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 11: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;seealso
class='IDTExtensibility2' /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 12: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Connect
: IDTExtensibility2&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 13: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 14: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; ArrayList
_pasteAsButtons;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 15: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; SmartPaster
_smartPaster;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 16: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; CommandBarPopup
_pasteAsPopup;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 17: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 18: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;Implements
the constructor for the Add-in object. Place your initialization code within this
method.&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 19: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; Connect()&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 20: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 21: &lt;/span&gt; _pasteAsButtons = &lt;span class="kwrd"&gt;new&lt;/span&gt; ArrayList();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 22: &lt;/span&gt; _smartPaster = &lt;span class="kwrd"&gt;new&lt;/span&gt; SmartPaster();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 23: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 24: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 25: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;Implements
the OnConnection method of the IDTExtensibility2 interface. Receives notification
that the Add-in is being loaded.&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 26: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param term='application'&amp;gt;Root
object of the host application.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 27: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param term='connectMode'&amp;gt;Describes
how the Add-in is being loaded.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 28: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param term='addInInst'&amp;gt;Object
representing this Add-in.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 29: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;seealso
class='IDTExtensibility2' /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 30: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnConnection(&lt;span class="kwrd"&gt;object&lt;/span&gt; application,
ext_ConnectMode connectMode, &lt;/pre&gt;
&lt;pre&gt;&lt;span class="kwrd"&gt;object&lt;/span&gt; addInInst, &lt;span class="kwrd"&gt;ref&lt;/span&gt; Array
custom)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 31: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 32: &lt;/span&gt; _applicationObject = (DTE2)application;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 33: &lt;/span&gt; _addInInstance = (AddIn)addInInst;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 34: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 35: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 36: &lt;/span&gt; &lt;span class="rem"&gt;//check for the commands&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 37: &lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; cmdExists
= &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 38: &lt;/span&gt; &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (Command cmd &lt;span class="kwrd"&gt;in&lt;/span&gt; _applicationObject.Commands)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 39: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 40: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (cmd.Name.EndsWith(&lt;span class="str"&gt;"PasteAsComment"&lt;/span&gt;,
StringComparison.OrdinalIgnoreCase))&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 41: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 42: &lt;/span&gt; cmdExists = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 43: &lt;/span&gt; &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 44: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 45: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 46: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 47: &lt;/span&gt; &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 48: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 49: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (!cmdExists)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 50: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 51: &lt;/span&gt; AddPasteAsCommands();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 52: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 53: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 54: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (connectMode ==
ext_ConnectMode.ext_cm_Startup &amp;amp;&amp;amp; _pasteAsPopup == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 55: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 56: &lt;/span&gt; &lt;span class="rem"&gt;//Add items to the Context
(Right-Click) Menu&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 57: &lt;/span&gt; &lt;span class="rem"&gt;//find the position
of the &amp;amp;Paste command&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 58: &lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; position = 0;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 59: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 60: &lt;/span&gt; CommandBar codeWindow = _applicationObject.CommandBars[&lt;span class="str"&gt;"Code
Window"&lt;/span&gt;];&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 61: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 62: &lt;/span&gt; &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i
= 1; i &amp;lt;= codeWindow.Controls.Count; i++)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 63: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 64: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (codeWindow.Controls[i].Caption
== &lt;span class="str"&gt;"&amp;amp;Paste"&lt;/span&gt;)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 65: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 66: &lt;/span&gt; position = i;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 67: &lt;/span&gt; &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 68: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 69: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 70: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 71: &lt;/span&gt; &lt;span class="rem"&gt;//add the popup
menu "Paste As...", which may already be on the menu&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 72: &lt;/span&gt; _pasteAsPopup = (CommandBarPopup)codeWindow.Controls.Add(&lt;/pre&gt;
&lt;pre&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt;)MsoControlType.msoControlPopup, 1, Type.Missing,
position + 1, Type.Missing);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 73: &lt;/span&gt; _pasteAsPopup.Caption = &lt;span class="str"&gt;"Paste
As ..."&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 74: &lt;/span&gt; AddPasteAsButtons();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 75: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 76: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 77: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 78: &lt;/span&gt; &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 79: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 80: &lt;/span&gt; System.Diagnostics.Debug.WriteLine(ex.Message);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 81: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 82: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 83: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 84: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; AddPasteAsCommands()&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 85: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 86: &lt;/span&gt; &lt;span class="rem"&gt;//no configure or regionize
because I never use 'em&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 87: &lt;/span&gt; _applicationObject.Commands.AddNamedCommand(_addInInstance, &lt;span class="str"&gt;"PasteAsComment"&lt;/span&gt;, &lt;span class="str"&gt;"Paste
As Comment"&lt;/span&gt;, &lt;span class="str"&gt;"Pastes clipboard text as a comment."&lt;/span&gt;, &lt;span class="kwrd"&gt;true&lt;/span&gt;,
22, &lt;span class="kwrd"&gt;null&lt;/span&gt;, Convert.ToInt32(vsCommandStatus.vsCommandStatusSupported)
+ Convert.ToInt32(vsCommandStatus.vsCommandStatusEnabled));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 88: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 89: &lt;/span&gt; _applicationObject.Commands.AddNamedCommand(_addInInstance, &lt;span class="str"&gt;"PasteAsString"&lt;/span&gt;, &lt;span class="str"&gt;"Paste
As String"&lt;/span&gt;, &lt;span class="str"&gt;"Pastes clipboard text as a string literal."&lt;/span&gt;, &lt;span class="kwrd"&gt;true&lt;/span&gt;,
22, &lt;span class="kwrd"&gt;null&lt;/span&gt;, Convert.ToInt32(vsCommandStatus.vsCommandStatusSupported)
+ Convert.ToInt32(vsCommandStatus.vsCommandStatusEnabled));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 90: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 91: &lt;/span&gt; _applicationObject.Commands.AddNamedCommand(_addInInstance, &lt;span class="str"&gt;"PasteAsStringBuilder"&lt;/span&gt;, &lt;span class="str"&gt;"Paste
As StringBuilder"&lt;/span&gt;, &lt;span class="str"&gt;"Pastes clipboard text as a stringbuilder."&lt;/span&gt;, &lt;span class="kwrd"&gt;true&lt;/span&gt;,
22, &lt;span class="kwrd"&gt;null&lt;/span&gt;, Convert.ToInt32(vsCommandStatus.vsCommandStatusSupported)
+ Convert.ToInt32(vsCommandStatus.vsCommandStatusEnabled));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 92: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 93: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 94: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 95: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; AddPasteAsButtons()&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 96: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 97: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 98: &lt;/span&gt; &lt;span class="rem"&gt;//now the buttons&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 99: &lt;/span&gt; CommandBarButton pasteAsButton;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 100: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 101: &lt;/span&gt; &lt;span class="rem"&gt;//add "Comment"&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 102: &lt;/span&gt; pasteAsButton = AddCommandButton();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 103: &lt;/span&gt; pasteAsButton.Caption = &lt;span class="str"&gt;"Comment"&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 104: &lt;/span&gt; pasteAsButton.TooltipText = &lt;span class="str"&gt;"Inserts
clipboard with each line prefixed with a comment character"&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 105: &lt;/span&gt; pasteAsButton.Click += PasteAsComment;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 106: &lt;/span&gt; _pasteAsButtons.Add(pasteAsButton);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 107: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 108: &lt;/span&gt; &lt;span class="rem"&gt;//add "String"&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 109: &lt;/span&gt; pasteAsButton = AddCommandButton();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 110: &lt;/span&gt; pasteAsButton.Caption = &lt;span class="str"&gt;"String"&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 111: &lt;/span&gt; pasteAsButton.TooltipText = &lt;span class="str"&gt;"Inserts
enquoted clipboard text with line breaks and other characters escaped"&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 112: &lt;/span&gt; pasteAsButton.Click += PasteAsString;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 113: &lt;/span&gt; _pasteAsButtons.Add(pasteAsButton);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 114: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 115: &lt;/span&gt; &lt;span class="rem"&gt;//add "StringBuilder"&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 116: &lt;/span&gt; pasteAsButton = AddCommandButton();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 117: &lt;/span&gt; pasteAsButton.Caption = &lt;span class="str"&gt;"StringBuilder"&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 118: &lt;/span&gt; pasteAsButton.TooltipText = &lt;span class="str"&gt;"Inserts
enquoted clipboard text built up by a stringbuilder."&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 119: &lt;/span&gt; pasteAsButton.Click += PasteAsStringBuilder;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 120: &lt;/span&gt; _pasteAsButtons.Add(pasteAsButton);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 121: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 122: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 123: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 124: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; CommandBarButton
AddCommandButton()&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 125: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 126: &lt;/span&gt; var pasteAsButton = (CommandBarButton)_pasteAsPopup.Controls.Add((&lt;span class="kwrd"&gt;int&lt;/span&gt;)MsoControlType.msoControlButton);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 127: &lt;/span&gt; &lt;span class="rem"&gt;//in 2010, CommandBarButton.FaceId
throws a DeprecatedException.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 128: &lt;/span&gt; &lt;span class="rem"&gt;//pasteAsButton.FaceId = 22;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 129: &lt;/span&gt; pasteAsButton.Visible = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 130: &lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; pasteAsButton;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 131: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 132: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 133: &lt;/span&gt; &lt;span class="preproc"&gt;#region&lt;/span&gt; &lt;span class="str"&gt;"PasteAs
Handlers"&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 134: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 135: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 136: &lt;/span&gt; &lt;span class="rem"&gt;///Occurs when the user clicks
the PasteAsString button.&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 137: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 138: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name="ctrl"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 139: &lt;/span&gt; &lt;span class="rem"&gt;///Denotes the
CommandBarButton control that initiated the event. &lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 140: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 141: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name="cancelDefault"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 142: &lt;/span&gt; &lt;span class="rem"&gt;///False if the default behavior
associated with the CommandBarButton control occurs, unless its canceled by another
process or add-in. &lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 143: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 144: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; PasteAsString(CommandBarButton
ctrl, &lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; cancelDefault)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 145: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 146: &lt;/span&gt; _smartPaster.PasteAsString(_applicationObject);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 147: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 148: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 149: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 150: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 151: &lt;/span&gt; &lt;span class="rem"&gt;///Occurs when
the user clicks the PasteAsComment button.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 152: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 153: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name="ctrl"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 154: &lt;/span&gt; &lt;span class="rem"&gt;///Denotes the CommandBarButton
control that initiated the event. &lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 155: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 156: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name="cancelDefault"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 157: &lt;/span&gt; &lt;span class="rem"&gt;///False if the
default behavior associated with the CommandBarButton control occurs, unless its canceled
by another process or add-in. &lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 158: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 159: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; PasteAsComment(CommandBarButton
ctrl, &lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; cancelDefault)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 160: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 161: &lt;/span&gt; _smartPaster.PasteAsComment(_applicationObject);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 162: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 163: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 164: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 165: &lt;/span&gt; &lt;span class="rem"&gt;///Occurs when
the user clicks the PasteAsStringBuilder button.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 166: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 167: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name="ctrl"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 168: &lt;/span&gt; &lt;span class="rem"&gt;///Denotes the CommandBarButton
control that initiated the event. &lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 169: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 170: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name="cancelDefault"&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 171: &lt;/span&gt; &lt;span class="rem"&gt;///False if the
default behavior associated with the CommandBarButton control occurs, unless its canceled
by another process or add-in. &lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 172: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 173: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; PasteAsStringBuilder(CommandBarButton
ctrl, &lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; cancelDefault)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 174: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 175: &lt;/span&gt; _smartPaster.PasteAsStringBuilder(_applicationObject);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 176: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 177: &lt;/span&gt; &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 178: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 179: &lt;/span&gt; &lt;span class="preproc"&gt;#region&lt;/span&gt; &lt;span class="str"&gt;"Exec"&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 180: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 181: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 182: &lt;/span&gt; &lt;span class="rem"&gt;/// Implements the Exec method
of the IDTCommandTarget interface.&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 183: &lt;/span&gt; &lt;span class="rem"&gt;/// This is called
when the command is invoked.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 184: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 185: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name='commandName'&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 186: &lt;/span&gt; &lt;span class="rem"&gt;/// The name of the command
to execute.&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 187: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 188: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name='executeOption'&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 189: &lt;/span&gt; &lt;span class="rem"&gt;/// Describes
how the command should be run.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 190: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 191: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name='varIn'&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 192: &lt;/span&gt; &lt;span class="rem"&gt;/// Parameters passed from
the caller to the command handler.&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 193: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 194: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name='varOut'&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 195: &lt;/span&gt; &lt;span class="rem"&gt;/// Parameters
passed from the command handler to the caller.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 196: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 197: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name='handled'&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 198: &lt;/span&gt; &lt;span class="rem"&gt;/// Informs the caller if
the command was handled or not.&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 199: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 200: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;seealso class='Exec'
/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 201: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Exec(&lt;span class="kwrd"&gt;string&lt;/span&gt; commandName,
vsCommandExecOption executeOption, &lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; varIn, &lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; varOut, &lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; handled)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 202: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 203: &lt;/span&gt; handled = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 204: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; ((executeOption
== vsCommandExecOption.vsCommandExecOptionDoDefault))&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 205: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 206: &lt;/span&gt; handled = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 207: &lt;/span&gt; &lt;span class="kwrd"&gt;switch&lt;/span&gt; (commandName)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 208: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 209: &lt;/span&gt; &lt;span class="rem"&gt;//case "SmartPaster.Connect.Configure":&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 210: &lt;/span&gt; &lt;span class="rem"&gt;// //show the config form&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 211: &lt;/span&gt; &lt;span class="rem"&gt;// SmartPasterForm
myForm = new SmartPasterForm();&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 212: &lt;/span&gt; &lt;span class="rem"&gt;// myForm.ShowDialog();&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 213: &lt;/span&gt; &lt;span class="rem"&gt;// //since config
may have changed, show/hide buttons&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 214: &lt;/span&gt; &lt;span class="rem"&gt;// EnableContextMenuButtons();&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 215: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 216: &lt;/span&gt; &lt;span class="rem"&gt;// break;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 217: &lt;/span&gt; &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;"SmartPaster.Connect.PasteAsComment"&lt;/span&gt;:&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 218: &lt;/span&gt; _smartPaster.PasteAsComment(_applicationObject);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 219: &lt;/span&gt; &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 220: &lt;/span&gt; &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;"SmartPaster.Connect.PasteAsString"&lt;/span&gt;:&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 221: &lt;/span&gt; _smartPaster.PasteAsString(_applicationObject);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 222: &lt;/span&gt; &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 223: &lt;/span&gt; &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;"SmartPaster.Connect.PasteAsStringBuilder"&lt;/span&gt;:&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 224: &lt;/span&gt; _smartPaster.PasteAsStringBuilder(_applicationObject);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 225: &lt;/span&gt; &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 226: &lt;/span&gt; &lt;span class="rem"&gt;//case "SmartPaster.Connect.PasteAsRegion":&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 227: &lt;/span&gt; &lt;span class="rem"&gt;// _smartPaster.PasteAsRegion(_applicationObject);&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 228: &lt;/span&gt; &lt;span class="rem"&gt;// break;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 229: &lt;/span&gt; &lt;span class="kwrd"&gt;default&lt;/span&gt;:&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 230: &lt;/span&gt; handled = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 231: &lt;/span&gt; &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 232: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 233: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 234: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 235: &lt;/span&gt; &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 236: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 237: &lt;/span&gt; &lt;span class="preproc"&gt;#region&lt;/span&gt; Standard
Template Stuff&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 238: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 239: &lt;/span&gt; &lt;span class="rem"&gt;///Implements
the OnDisconnection method of the IDTExtensibility2 interface. Receives notification
that the Add-in is being unloaded.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 240: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 241: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name="disconnectMode"&amp;gt;The
disconnect mode.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 242: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name="custom"&amp;gt;The
custom.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 243: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;seealso
class="IDTExtensibility2"/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 244: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnDisconnection(ext_DisconnectMode
disconnectMode, &lt;span class="kwrd"&gt;ref&lt;/span&gt; Array custom)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 245: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 246: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (_pasteAsPopup
!= &lt;span class="kwrd"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; &lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 247: &lt;/span&gt; (disconnectMode == ext_DisconnectMode.ext_dm_UserClosed
|| disconnectMode == ext_DisconnectMode.ext_dm_HostShutdown))&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 248: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 249: &lt;/span&gt; _pasteAsPopup.Delete(&lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 250: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 251: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 252: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 253: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;Implements
the OnAddInsUpdate method of the IDTExtensibility2 interface. Receives notification
when the collection of Add-ins has changed.&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 254: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param term='custom'&amp;gt;Array
of parameters that are host application specific.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 255: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;seealso
class='IDTExtensibility2' /&amp;gt; &lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 256: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnAddInsUpdate(&lt;span class="kwrd"&gt;ref&lt;/span&gt; Array
custom)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 257: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 258: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 259: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 260: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;Implements
the OnStartupComplete method of the IDTExtensibility2 interface. Receives notification
that the host application has completed loading.&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 261: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param term='custom'&amp;gt;Array
of parameters that are host application specific.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 262: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;seealso class='IDTExtensibility2'
/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 263: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnStartupComplete(&lt;span class="kwrd"&gt;ref&lt;/span&gt; Array
custom)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 264: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 265: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 266: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 267: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;Implements
the OnBeginShutdown method of the IDTExtensibility2 interface. Receives notification
that the host application is being unloaded.&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 268: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param term='custom'&amp;gt;Array
of parameters that are host application specific.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 269: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;seealso
class='IDTExtensibility2' /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 270: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnBeginShutdown(&lt;span class="kwrd"&gt;ref&lt;/span&gt; Array
custom)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 271: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 272: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 273: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 274: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; DTE2 _applicationObject;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 275: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; AddIn
_addInInstance;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 276: &lt;/span&gt; &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 277: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 278: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 279: &lt;/span&gt; &lt;span class="rem"&gt;///Queries the
status.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 280: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 281: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name="commandName"&amp;gt;Name
of the command.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 282: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name="neededText"&amp;gt;The
needed text.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 283: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name="statusOption"&amp;gt;The
status option.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 284: &lt;/span&gt; &lt;span class="rem"&gt;///&amp;lt;param name="commandText"&amp;gt;The
command text.&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 285: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; QueryStatus(&lt;span class="kwrd"&gt;string&lt;/span&gt; commandName,
vsCommandStatusTextWanted neededText, &lt;span class="kwrd"&gt;ref&lt;/span&gt; vsCommandStatus
statusOption, &lt;span class="kwrd"&gt;ref&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; commandText)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 286: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 287: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (neededText
== vsCommandStatusTextWanted.vsCommandStatusTextWantedNone)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 288: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 289: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (commandName.StartsWith(&lt;span class="str"&gt;"SmartPaster.Connect"&lt;/span&gt;))&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 290: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 291: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (((_applicationObject.ActiveDocument
!= &lt;span class="kwrd"&gt;null&lt;/span&gt;)) &amp;amp;&amp;amp; ((_applicationObject.ActiveDocument.Object(&lt;span class="str"&gt;"TextDocument"&lt;/span&gt;)
!= &lt;span class="kwrd"&gt;null&lt;/span&gt;)))&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 292: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 293: &lt;/span&gt; statusOption = vsCommandStatus.vsCommandStatusEnabled
| vsCommandStatus.vsCommandStatusSupported;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 294: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 295: &lt;/span&gt; &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 296: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 297: &lt;/span&gt; statusOption = vsCommandStatus.vsCommandStatusSupported;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 298: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 299: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 300: &lt;/span&gt; &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 301: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 302: &lt;/span&gt; statusOption = vsCommandStatus.vsCommandStatusUnsupported;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 303: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 304: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 305: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 306: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 307: &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;p&gt;
Here's the SmartPaster class.
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.IO;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 3: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 4: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows.Forms; &lt;span class="rem"&gt;//clipboard&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 5: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; EnvDTE;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 6: &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; EnvDTE80;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 7: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 8: &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SmartPaster2010&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 9: &lt;/span&gt;{&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 10: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 11: &lt;/span&gt; &lt;span class="rem"&gt;/// Class responsible
for doing the pasting/manipulating of clipdata.&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 12: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 13: &lt;/span&gt; &lt;span class="kwrd"&gt;internal&lt;/span&gt; &lt;span class="kwrd"&gt;sealed&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; SmartPaster&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 14: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 15: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 16: &lt;/span&gt; &lt;span class="rem"&gt;/// Convient property to retrieve
the clipboard text from the clipboard&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 17: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 18: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; ClipboardText&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 19: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 20: &lt;/span&gt; get&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 21: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 22: &lt;/span&gt; IDataObject iData = Clipboard.GetDataObject();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 23: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (iData.GetDataPresent(DataFormats.Text))&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 24: &lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; Convert.ToString(iData.GetData(DataFormats.Text));&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 25: &lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 26: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 27: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 28: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 29: &lt;/span&gt; &lt;span class="preproc"&gt;#region&lt;/span&gt; &lt;span class="str"&gt;"Stringinize"&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 30: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 31: &lt;/span&gt; &lt;span class="rem"&gt;/// Stringinizes
text passed to it for use in C#&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 32: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 33: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;param name="txt"&amp;gt;Text
to be Stringinized&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 34: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;C# Stringinized
text&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 35: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; StringinizeInCs(&lt;span class="kwrd"&gt;string&lt;/span&gt; txt)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 36: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 37: &lt;/span&gt; &lt;span class="rem"&gt;//c# quote character
-- really just a "&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 38: &lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; qChr
= &lt;span class="str"&gt;"\""&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 39: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 40: &lt;/span&gt; &lt;span class="rem"&gt;//sb to work with&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 41: &lt;/span&gt; var sb = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder(txt);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 42: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 43: &lt;/span&gt; &lt;span class="rem"&gt;//escape appropriately&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 44: &lt;/span&gt; &lt;span class="rem"&gt;//escape the quotes with ""&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 45: &lt;/span&gt; sb.Replace(qChr, qChr + qChr);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 46: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 47: &lt;/span&gt; &lt;span class="rem"&gt;//insert " at beginning
and end&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 48: &lt;/span&gt; sb.Insert(0, &lt;span class="str"&gt;"@"&lt;/span&gt; + qChr);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 49: &lt;/span&gt; sb.Append(qChr);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 50: &lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; sb.ToString();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 51: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 52: &lt;/span&gt; &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 53: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 54: &lt;/span&gt; &lt;span class="preproc"&gt;#region&lt;/span&gt; &lt;span class="str"&gt;"Commentize"&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 55: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 56: &lt;/span&gt; &lt;span class="rem"&gt;/// Commentizes text passed
to it for use in C#&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 57: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 58: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;param name="txt"&amp;gt;Text
to be Stringinized&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 59: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;C#
Commentized text&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 60: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; CommentizeInCs(&lt;span class="kwrd"&gt;string&lt;/span&gt; txt)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 61: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 62: &lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; cmtChar
= &lt;span class="str"&gt;"//"&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 63: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 64: &lt;/span&gt; var sb = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder(txt.Length);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 65: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 66: &lt;/span&gt; &lt;span class="rem"&gt;//process the passed string
(txt), one line at a time&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 67: &lt;/span&gt; &lt;span class="rem"&gt;//the original
was horrible WTF code&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 68: &lt;/span&gt; &lt;span class="kwrd"&gt;using&lt;/span&gt; (var reader = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringReader(txt))&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 69: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 70: &lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; line;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 71: &lt;/span&gt; &lt;span class="kwrd"&gt;while&lt;/span&gt; ((line
= reader.ReadLine()) != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 72: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 73: &lt;/span&gt; sb.AppendLine(cmtChar + line);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 74: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 75: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 76: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 77: &lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; sb.ToString();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 78: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 79: &lt;/span&gt; &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 80: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 81: &lt;/span&gt; &lt;span class="preproc"&gt;#region&lt;/span&gt; &lt;span class="str"&gt;"Stringbuilderize"&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 82: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; StringbuilderizeInCs(&lt;span class="kwrd"&gt;string&lt;/span&gt; txt, &lt;span class="kwrd"&gt;string&lt;/span&gt; sbName)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 83: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 84: &lt;/span&gt; &lt;span class="rem"&gt;//c# quote character -- really
just a "&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 85: &lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; qChr
= &lt;span class="str"&gt;"\""&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 86: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 87: &lt;/span&gt; &lt;span class="rem"&gt;//sb to work with&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 88: &lt;/span&gt; var sb = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder(txt);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 89: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 90: &lt;/span&gt; &lt;span class="rem"&gt;//escape \,", and {}&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 91: &lt;/span&gt; sb.Replace(qChr, qChr + qChr);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 92: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 93: &lt;/span&gt; &lt;span class="rem"&gt;//process the passed
string (txt), one line at a time&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 94: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 95: &lt;/span&gt; &lt;span class="rem"&gt;//dump the stringbuilder
into a temp string&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 96: &lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; fullString =
sb.ToString();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 97: &lt;/span&gt; sb.Clear(); &lt;span class="rem"&gt;//lovely
.net 4 - sb.Remove(0, sb.Length);&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 98: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 99: &lt;/span&gt; &lt;span class="rem"&gt;//the original
was horrible WTF code&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 100: &lt;/span&gt; &lt;span class="kwrd"&gt;using&lt;/span&gt; (var reader
= &lt;span class="kwrd"&gt;new&lt;/span&gt; StringReader(fullString))&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 101: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 102: &lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; line;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 103: &lt;/span&gt; &lt;span class="kwrd"&gt;while&lt;/span&gt; ((line
= reader.ReadLine()) != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 104: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 105: &lt;/span&gt; sb.Append(sbName + &lt;span class="str"&gt;".AppendLine("&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 106: &lt;/span&gt; sb.Append(&lt;span class="str"&gt;"@"&lt;/span&gt; + qChr);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 107: &lt;/span&gt; sb.Append(line.Replace(&lt;span class="str"&gt;"\t"&lt;/span&gt;, &lt;span class="str"&gt;"\\t"&lt;/span&gt;));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 108: &lt;/span&gt; sb.AppendLine(qChr + &lt;span class="str"&gt;");"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 109: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 110: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 111: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 112: &lt;/span&gt; &lt;span class="rem"&gt;//TODO: Better '@"" + ' replacement
to not cover inside strings&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 113: &lt;/span&gt; sb.Replace(&lt;span class="str"&gt;"@"&lt;/span&gt; +
qChr + qChr + &lt;span class="str"&gt;" + "&lt;/span&gt;, &lt;span class="str"&gt;""&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 114: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 115: &lt;/span&gt; &lt;span class="rem"&gt;//add the dec
statement&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 116: &lt;/span&gt; sb.Insert(0, &lt;span class="str"&gt;"StringBuilder
"&lt;/span&gt; + sbName + &lt;span class="str"&gt;" = new StringBuilder("&lt;/span&gt; + txt.Length
+ &lt;span class="str"&gt;");"&lt;/span&gt; + Environment.NewLine);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 117: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 118: &lt;/span&gt; &lt;span class="rem"&gt;//and return&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 119: &lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; sb.ToString();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 120: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 121: &lt;/span&gt; &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 122: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 123: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 124: &lt;/span&gt; &lt;span class="rem"&gt;/// Inserts text at current
cursor location in the application&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 125: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 126: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;param name="application"&amp;gt;application
with activewindow&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 127: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;param
name="text"&amp;gt;text to insert&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 128: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Paste(DTE2
application, &lt;span class="kwrd"&gt;string&lt;/span&gt; text)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 129: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 130: &lt;/span&gt; &lt;span class="rem"&gt;//get the text document&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 131: &lt;/span&gt; var txt = (TextDocument)application.ActiveDocument.Object(&lt;span class="str"&gt;"TextDocument"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 132: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 133: &lt;/span&gt; &lt;span class="rem"&gt;//get an edit
point&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 134: &lt;/span&gt; EditPoint ep = txt.Selection.ActivePoint.CreateEditPoint();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 135: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 136: &lt;/span&gt; &lt;span class="rem"&gt;//get a start point&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 137: &lt;/span&gt; EditPoint sp = txt.Selection.ActivePoint.CreateEditPoint();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 138: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 139: &lt;/span&gt; &lt;span class="rem"&gt;//open the undo
context&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 140: &lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; isOpen = application.UndoContext.IsOpen;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 141: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (!isOpen)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 142: &lt;/span&gt; application.UndoContext.Open(&lt;span class="str"&gt;"SmartPaster"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 143: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 144: &lt;/span&gt; &lt;span class="rem"&gt;//clear the selection&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 145: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (!txt.Selection.IsEmpty)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 146: &lt;/span&gt; txt.Selection.Delete();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 147: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 148: &lt;/span&gt; &lt;span class="rem"&gt;//insert the text&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 149: &lt;/span&gt; &lt;span class="rem"&gt;//ep.Insert(Indent(text,
ep.LineCharOffset))&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 150: &lt;/span&gt; ep.Insert(text);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 151: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 152: &lt;/span&gt; &lt;span class="rem"&gt;//smart format&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 153: &lt;/span&gt; sp.SmartFormat(ep);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 154: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 155: &lt;/span&gt; &lt;span class="rem"&gt;//close the context&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 156: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (!isOpen)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 157: &lt;/span&gt; application.UndoContext.Close();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 158: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 159: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 160: &lt;/span&gt; &lt;span class="preproc"&gt;#region&lt;/span&gt; &lt;span class="str"&gt;"Paste
As ..."&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 161: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 162: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 163: &lt;/span&gt; &lt;span class="rem"&gt;/// Public method
to paste and format clipboard text as string the cursor &lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 164: &lt;/span&gt; &lt;span class="rem"&gt;/// location for the configured
or active window's langage .&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 165: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 166: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;param name="application"&amp;gt;application
to insert&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 167: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; PasteAsString(DTE2
application)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 168: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 169: &lt;/span&gt; Paste(application, StringinizeInCs(ClipboardText));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 170: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 171: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 172: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 173: &lt;/span&gt; &lt;span class="rem"&gt;/// Public method
to paste and format clipboard text as comment the cursor &lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 174: &lt;/span&gt; &lt;span class="rem"&gt;/// location for the configured
or active window's langage .&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 175: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 176: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;param name="application"&amp;gt;application
to insert&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 177: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; PasteAsComment(DTE2
application)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 178: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 179: &lt;/span&gt; Paste(application, CommentizeInCs(ClipboardText));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 180: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 181: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 182: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 183: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 184: &lt;/span&gt; &lt;span class="rem"&gt;/// Public method to paste
format clipboard text into a specified region&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 185: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 186: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;param name="application"&amp;gt;application
to insert&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 187: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; PasteAsRegion(DTE2
application)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 188: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 189: &lt;/span&gt; &lt;span class="rem"&gt;//get the region
name&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 190: &lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; region
= &lt;span class="str"&gt;"myRegion"&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 191: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 192: &lt;/span&gt; &lt;span class="rem"&gt;//it's so simple, we really
don't need a function&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 193: &lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; csRegionized
= &lt;span class="str"&gt;"#region "&lt;/span&gt; + region + Environment.NewLine + ClipboardText
+ Environment.NewLine + &lt;span class="str"&gt;"#endregion"&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 194: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 195: &lt;/span&gt; &lt;span class="rem"&gt;//and paste&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 196: &lt;/span&gt; Paste(application, csRegionized);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 197: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 198: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 199: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 200: &lt;/span&gt; &lt;span class="rem"&gt;/// Public method to paste
and format clipboard text as stringbuilder the cursor &lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 201: &lt;/span&gt; &lt;span class="rem"&gt;/// location for
the configured or active window's langage .&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 202: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 203: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;param
name="application"&amp;gt;application to insert&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 204: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; PasteAsStringBuilder(DTE2
application)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 205: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 206: &lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; stringbuilder
= &lt;span class="str"&gt;"sb"&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 207: &lt;/span&gt; Paste(application, StringbuilderizeInCs(ClipboardText,
stringbuilder));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 208: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 209: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 210: &lt;/span&gt; &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt; 211: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 212: &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=3c13f5c7-17e1-42e1-be64-3e4bea605a5a" /&gt;</description>
      <comments>http://martinwilley.com/blog/CommentView,guid,3c13f5c7-17e1-42e1-be64-3e4bea605a5a.aspx</comments>
      <category>.net 4</category>
      <category>Coderush</category>
      <category>VS2010</category>
    </item>
    <item>
      <trackback:ping>http://martinwilley.com/blog/Trackback.aspx?guid=734bf37c-2055-4fd4-ab69-57e59d74621f</trackback:ping>
      <pingback:server>http://martinwilley.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://martinwilley.com/blog/PermaLink,guid,734bf37c-2055-4fd4-ab69-57e59d74621f.aspx</pingback:target>
      <dc:creator>Martin</dc:creator>
      <wfw:comment>http://martinwilley.com/blog/CommentView,guid,734bf37c-2055-4fd4-ab69-57e59d74621f.aspx</wfw:comment>
      <wfw:commentRss>http://martinwilley.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=734bf37c-2055-4fd4-ab69-57e59d74621f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In a large Visual Studio solution, there are better ways of finding a particular class
or method than visually hunting through the solution explorer tree.
</p>
        <h2>Visual Studio 2008
</h2>
        <p>
          <br />
Good old <strong>Goto Definition (F12)</strong> is great. 
<br />
To quickly go back to where you pressed F12, <strong>Control - (minus)</strong> is
useful but not very well known. 
</p>
        <p>
 <img style="border: 0px none; display: inline; margin-left: 0px; margin-right: 0px;" title="vs_findallrefs" alt="vs_findallrefs" src="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/vs_findallrefs_thumb.png" align="right" border="0" height="126" width="244" />But
what if you want to find where an interface is implemented, a method overridden or
called from elsewhere? 
<br /><strong>Find All References (Control K, R)</strong> is painfully slow and it dumps
everything in the Find Symbol Results window with the full file path (you can hack
the registry to fix the format, but still...). 
</p>
        <p>
Within a source file, <strong>incremental search (Control I)</strong> is a great hidden
secret - no dialog box, just start type and it immediately jumps to the first match.
It has a big flaw: it doesn't look in hidden sections (closed regions). 
</p>
        <p>
To find a class or method which isn't in the source in front of you, you use <strong>Quick
Find (Control F)</strong> or <strong>Find In Finds (Control Shift F).</strong> It's
slow, and opens in a docked Find window. All those docked windows quickly become confusing.
</p>
        <p>
 <a href="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/vs_quickfind.png"><img style="border: 0px none; display: inline; margin-left: 0px; margin-right: 0px;" title="vs_quickfind" alt="vs_quickfind" src="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/vs_quickfind_thumb.png" border="0" height="244" width="230" /></a></p>
        <h2>Visual Studio 2010
</h2>
        <p>
          <br />
VS 2010 still has Slowly Find All References, but it now has a couple of extra goodies. 
</p>
        <p>
          <strong>
            <a href="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/vs2010_callhierarchy.png">
              <img style="border: 0px none; display: inline;" title="vs2010_callhierarchy" alt="vs2010_callhierarchy" src="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/vs2010_callhierarchy_thumb.png" border="0" height="102" width="244" />
            </a> View
Call Hierarchy (Control K, T)</strong> has a nice graph of calls to/ calls from which
is recursive. In other words, just like Reflector's Analyzer. 
</p>
        <p>
          <a href="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/vs2010_navigateto.png">
            <img style="border: 0px none; display: inline;" title="vs2010_navigateto" alt="vs2010_navigateto" src="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/vs2010_navigateto_thumb.png" border="0" height="180" width="244" />
          </a> There's
a neat new <strong>Navigate To window (Control comma).</strong> It's not a docked
window, and has a really cool incremental search of the solution. The search box allows
camel hump searching (just the capitals), as well as sub-strings. 
</p>
        <h2>Coderush
</h2>
        <p>
          <br />
          <a href="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/coderush_references.png">
            <img style="border: 0px none; display: inline;" title="coderush_references" alt="coderush_references" src="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/coderush_references_thumb.png" border="0" height="120" width="244" />
          </a>If
you're using <a href="http://www.devexpress.com/Products/Visual_Studio_Add-in/Coding_Assistance/" target="_blank">Coderush</a> Pro,
you've had a nice version of call hierarchy in VS 2005 and 2008- it's the <strong>References</strong> window.
There's a live-sync mode (overkill really), or you update it with Shift-F12 (or use
the Refresh button).  
</p>
        <p>
          <a href="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/coderush_jumpto.png">
            <img style="border: 0px none; display: inline; margin-left: 0px; margin-right: 0px;" title="coderush_jumpto" alt="coderush_jumpto" src="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/coderush_jumpto_thumb.png" align="right" border="0" height="221" width="244" />
          </a> Also
in Coderush, the <strong>jump to... context menu</strong> also shows context-sensitive
overrides/ implementations and the next/prev reference can be tabbed to within a file
(VS 2010 catches up with some features of this by highlighting other uses of a variable
when the caret is on it). 
</p>
        <p>
My favourite feature of Coderush (and the free version, <a href="http://www.devexpress.com/Products/Visual_Studio_Add-in/CodeRushX/" target="_blank">Coderush
Xpress</a>) is the <strong>Quick Nav dialog (Control Shift Q),</strong> which VS2010's
Navigate To emulates. Quick incremental search, with camel-humps and substrings, and
filter by members. <a href="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/coderush_quicknav.png"><img style="border: 0px none; display: inline;" title="coderush_quicknav" alt="coderush_quicknav" src="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/coderush_quicknav_thumb.png" border="0" height="179" width="244" /></a></p>
        <p>
          <b>UPDATE</b>: <i>In the forthcoming Coderush Xpress for 2010, Quick Nav is <a href="http://stackoverflow.com/questions/2719782/experience-with-coderush-xpress-and-visual-studio-2010">gone</a>.
Damn. You must have the full Coderush or Resharper (see below). Okay, the built-in
Navigate-To does the basic task, without the filtering, but still... </i><br /></p>
        <h2>Resharper
</h2>
        <p>
          <br />
          <a href="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/resharper_findsymbol.png">
            <img style="border: 0px none; display: inline; margin-left: 0px; margin-right: 0px;" title="resharper_findsymbol" alt="resharper_findsymbol" src="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/resharper_findsymbol_thumb.png" border="0" height="69" width="244" />
          </a>
          <a href="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/resharper_findtype.png">
            <img style="border: 0px none; display: inline; margin-left: 0px; margin-right: 0px;" title="resharper_findtype" alt="resharper_findtype" src="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/resharper_findtype_thumb.png" border="0" height="78" width="244" />
          </a>
        </p>
        <p>
          <a href="http://www.jetbrains.com/resharper/" target="_blank">Resharper</a> also has
an equivalent of QuickNav/NavigateTo, with all the camel humps goodness (no substrings,
but you can do * and ? wildcards). <em>(Note that Resharper has two keyboard mappings;
I'm using the Visual Studio mappings here).</em><br /><strong>Find Symbol - Shift Alt T  -</strong> finds types and type members. <strong>Find
Type - Control T</strong> - just looks at types.  
<br /></p>
        <p>
          <a href="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/resharper_contextnav.png">
            <img style="border: 0px none; display: inline; margin-left: 0px; margin-right: 0px;" title="resharper_contextnav" alt="resharper_contextnav" src="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/resharper_contextnav_thumb.png" border="0" height="170" width="207" />
          </a> The
right-click context menus for implementors, base and especially usages very handy. 
<br /><a href="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/resharper_findusages.png"><img style="border: 0px none; display: inline; margin-left: 0px; margin-right: 0px;" title="resharper_findusages" alt="resharper_findusages" src="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/resharper_findusages_thumb.png" align="right" border="0" height="244" width="236" /></a> You
can get to <strong>Find Usages with Shift-F12</strong>. If there's only one usage
(or base or inheritor), you go straight to it. 
</p>
        <p>
The reason that Coderush and Resharper can do the quick navigation is that they parse
the solution, so for the first minute or so a large solution will show one of their
processing messages (theoretically you can type away, but things are slow while they
are working).
</p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <h2>NDepend
</h2>
        <p>
I've just started playing with <a href="http://www.ndepend.com/" target="_blank">NDepend</a>.
There's a lot here to find your way around large code bases - even graphs - but for
now I'll just note that the Visual Studio integration includes context menus which
have similar functionality to the find usages described above:
</p>
        <p>
          <a href="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/ndepend_selectmethods.png">
            <img style="border: 0px none; display: inline;" title="ndepend_selectmethods" alt="ndepend_selectmethods" src="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/ndepend_selectmethods_thumb.png" border="0" height="184" width="244" />
          </a>
        </p>
        <p>
 
</p>
        <h2>Wrap Up
</h2>
        <p>
Having been a Resharper user for many years, the powerful find symbol / type commands
became something I used practically every few minutes while coding. It was a shock
to find myself in an office with no Resharper, but fortunately the free Coderush Xpress
came to the rescue. Visual Studio 2010 vanilla edition with no Resharper or Coderush
is actually not as bad as VS 2008 and earlier were- Navigate To/control comma is quite
handy and an easy key combo too. Of course I then installed the betas/ trials of the
latest Coderush/ Resharper and saw what I was missing. Please boss, can I have a license???
:)
</p>
        <img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=734bf37c-2055-4fd4-ab69-57e59d74621f" />
      </body>
      <title>Visual Studio navigation</title>
      <guid isPermaLink="false">http://martinwilley.com/blog/PermaLink,guid,734bf37c-2055-4fd4-ab69-57e59d74621f.aspx</guid>
      <link>http://martinwilley.com/blog/2010/05/04/VisualStudioNavigation.aspx</link>
      <pubDate>Tue, 04 May 2010 20:18:54 GMT</pubDate>
      <description>&lt;p&gt;
In a large Visual Studio solution, there are better ways of finding a particular class
or method than visually hunting through the solution explorer tree.
&lt;/p&gt;
&lt;h2&gt;Visual Studio 2008
&lt;/h2&gt;
&lt;p&gt;
&lt;br&gt;
Good old &lt;strong&gt;Goto Definition (F12)&lt;/strong&gt; is great. 
&lt;br&gt;
To quickly go back to where you pressed F12, &lt;strong&gt;Control - (minus)&lt;/strong&gt; is
useful but not very well known. 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&lt;img style="border: 0px none; display: inline; margin-left: 0px; margin-right: 0px;" title="vs_findallrefs" alt="vs_findallrefs" src="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/vs_findallrefs_thumb.png" align="right" border="0" height="126" width="244"&gt;But
what if you want to find where an interface is implemented, a method overridden or
called from elsewhere? 
&lt;br&gt;
&lt;strong&gt;Find All References (Control K, R)&lt;/strong&gt; is painfully slow and it dumps
everything in the Find Symbol Results window with the full file path (you can hack
the registry to fix the format, but still...). 
&lt;/p&gt;
&lt;p&gt;
Within a source file, &lt;strong&gt;incremental search (Control I)&lt;/strong&gt; is a great hidden
secret - no dialog box, just start type and it immediately jumps to the first match.
It has a big flaw: it doesn't look in hidden sections (closed regions). 
&lt;/p&gt;
&lt;p&gt;
To find a class or method which isn't in the source in front of you, you use &lt;strong&gt;Quick
Find (Control F)&lt;/strong&gt; or &lt;strong&gt;Find In Finds (Control Shift F).&lt;/strong&gt; It's
slow, and opens in a docked Find window. All those docked windows quickly become confusing.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&lt;a href="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/vs_quickfind.png"&gt;&lt;img style="border: 0px none; display: inline; margin-left: 0px; margin-right: 0px;" title="vs_quickfind" alt="vs_quickfind" src="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/vs_quickfind_thumb.png" border="0" height="244" width="230"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;h2&gt;Visual Studio 2010
&lt;/h2&gt;
&lt;p&gt;
&lt;br&gt;
VS 2010 still has Slowly Find All References, but it now has a couple of extra goodies. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;a href="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/vs2010_callhierarchy.png"&gt;&lt;img style="border: 0px none; display: inline;" title="vs2010_callhierarchy" alt="vs2010_callhierarchy" src="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/vs2010_callhierarchy_thumb.png" border="0" height="102" width="244"&gt;&lt;/a&gt; View
Call Hierarchy (Control K, T)&lt;/strong&gt; has a nice graph of calls to/ calls from which
is recursive. In other words, just like Reflector's Analyzer. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/vs2010_navigateto.png"&gt;&lt;img style="border: 0px none; display: inline;" title="vs2010_navigateto" alt="vs2010_navigateto" src="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/vs2010_navigateto_thumb.png" border="0" height="180" width="244"&gt;&lt;/a&gt; There's
a neat new &lt;strong&gt;Navigate To window (Control comma).&lt;/strong&gt; It's not a docked
window, and has a really cool incremental search of the solution. The search box allows
camel hump searching (just the capitals), as well as sub-strings. 
&lt;/p&gt;
&lt;h2&gt;Coderush
&lt;/h2&gt;
&lt;p&gt;
&lt;br&gt;
&lt;a href="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/coderush_references.png"&gt;&lt;img style="border: 0px none; display: inline;" title="coderush_references" alt="coderush_references" src="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/coderush_references_thumb.png" border="0" height="120" width="244"&gt;&lt;/a&gt;If
you're using &lt;a href="http://www.devexpress.com/Products/Visual_Studio_Add-in/Coding_Assistance/" target="_blank"&gt;Coderush&lt;/a&gt; Pro,
you've had a nice version of call hierarchy in VS 2005 and 2008- it's the &lt;strong&gt;References&lt;/strong&gt; window.
There's a live-sync mode (overkill really), or you update it with Shift-F12 (or use
the Refresh button).&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/coderush_jumpto.png"&gt;&lt;img style="border: 0px none; display: inline; margin-left: 0px; margin-right: 0px;" title="coderush_jumpto" alt="coderush_jumpto" src="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/coderush_jumpto_thumb.png" align="right" border="0" height="221" width="244"&gt;&lt;/a&gt; Also
in Coderush, the &lt;strong&gt;jump to... context menu&lt;/strong&gt; also shows context-sensitive
overrides/ implementations and the next/prev reference can be tabbed to within a file
(VS 2010 catches up with some features of this by highlighting other uses of a variable
when the caret is on it). 
&lt;/p&gt;
&lt;p&gt;
My favourite feature of Coderush (and the free version, &lt;a href="http://www.devexpress.com/Products/Visual_Studio_Add-in/CodeRushX/" target="_blank"&gt;Coderush
Xpress&lt;/a&gt;) is the &lt;strong&gt;Quick Nav dialog (Control Shift Q),&lt;/strong&gt; which VS2010's
Navigate To emulates. Quick incremental search, with camel-humps and substrings, and
filter by members. &lt;a href="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/coderush_quicknav.png"&gt;&lt;img style="border: 0px none; display: inline;" title="coderush_quicknav" alt="coderush_quicknav" src="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/coderush_quicknav_thumb.png" border="0" height="179" width="244"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;UPDATE&lt;/b&gt;: &lt;i&gt;In the forthcoming Coderush Xpress for 2010, Quick Nav is &lt;a href="http://stackoverflow.com/questions/2719782/experience-with-coderush-xpress-and-visual-studio-2010"&gt;gone&lt;/a&gt;.
Damn. You must have the full Coderush or Resharper (see below). Okay, the built-in
Navigate-To does the basic task, without the filtering, but still... &lt;/i&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;h2&gt;Resharper
&lt;/h2&gt;
&lt;p&gt;
&lt;br&gt;
&lt;a href="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/resharper_findsymbol.png"&gt;&lt;img style="border: 0px none; display: inline; margin-left: 0px; margin-right: 0px;" title="resharper_findsymbol" alt="resharper_findsymbol" src="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/resharper_findsymbol_thumb.png" border="0" height="69" width="244"&gt;&lt;/a&gt; &lt;a href="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/resharper_findtype.png"&gt;&lt;img style="border: 0px none; display: inline; margin-left: 0px; margin-right: 0px;" title="resharper_findtype" alt="resharper_findtype" src="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/resharper_findtype_thumb.png" border="0" height="78" width="244"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.jetbrains.com/resharper/" target="_blank"&gt;Resharper&lt;/a&gt; also has
an equivalent of QuickNav/NavigateTo, with all the camel humps goodness (no substrings,
but you can do * and ? wildcards). &lt;em&gt;(Note that Resharper has two keyboard mappings;
I'm using the Visual Studio mappings here).&lt;/em&gt; 
&lt;br&gt;
&lt;strong&gt;Find Symbol - Shift Alt T&amp;nbsp; -&lt;/strong&gt; finds types and type members. &lt;strong&gt;Find
Type - Control T&lt;/strong&gt; - just looks at types.&amp;nbsp; 
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/resharper_contextnav.png"&gt;&lt;img style="border: 0px none; display: inline; margin-left: 0px; margin-right: 0px;" title="resharper_contextnav" alt="resharper_contextnav" src="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/resharper_contextnav_thumb.png" border="0" height="170" width="207"&gt;&lt;/a&gt; The
right-click context menus for implementors, base and especially usages very handy. 
&lt;br&gt;
&lt;a href="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/resharper_findusages.png"&gt;&lt;img style="border: 0px none; display: inline; margin-left: 0px; margin-right: 0px;" title="resharper_findusages" alt="resharper_findusages" src="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/resharper_findusages_thumb.png" align="right" border="0" height="244" width="236"&gt;&lt;/a&gt; You
can get to &lt;strong&gt;Find Usages with Shift-F12&lt;/strong&gt;. If there's only one usage
(or base or inheritor), you go straight to it. 
&lt;/p&gt;
&lt;p&gt;
The reason that Coderush and Resharper can do the quick navigation is that they parse
the solution, so for the first minute or so a large solution will show one of their
processing messages (theoretically you can type away, but things are slow while they
are working).
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;h2&gt;NDepend
&lt;/h2&gt;
&lt;p&gt;
I've just started playing with &lt;a href="http://www.ndepend.com/" target="_blank"&gt;NDepend&lt;/a&gt;.
There's a lot here to find your way around large code bases - even graphs - but for
now I'll just note that the Visual Studio integration includes context menus which
have similar functionality to the find usages described above:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/ndepend_selectmethods.png"&gt;&lt;img style="border: 0px none; display: inline;" title="ndepend_selectmethods" alt="ndepend_selectmethods" src="http://www.martinwilley.com/blog/content/binary/VisualStudionavigation_12F4E/ndepend_selectmethods_thumb.png" border="0" height="184" width="244"&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;h2&gt;Wrap Up
&lt;/h2&gt;
&lt;p&gt;
Having been a Resharper user for many years, the powerful find symbol / type commands
became something I used practically every few minutes while coding. It was a shock
to find myself in an office with no Resharper, but fortunately the free Coderush Xpress
came to the rescue. Visual Studio 2010 vanilla edition with no Resharper or Coderush
is actually not as bad as VS 2008 and earlier were- Navigate To/control comma is quite
handy and an easy key combo too. Of course I then installed the betas/ trials of the
latest Coderush/ Resharper and saw what I was missing. Please boss, can I have a license???
:)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=734bf37c-2055-4fd4-ab69-57e59d74621f" /&gt;</description>
      <comments>http://martinwilley.com/blog/CommentView,guid,734bf37c-2055-4fd4-ab69-57e59d74621f.aspx</comments>
      <category>Coderush</category>
      <category>NDepend</category>
      <category>Resharper</category>
      <category>VS2010</category>
    </item>
  </channel>
</rss>