Visual Studio 2010のIDEはWPFで作成されていることは有名になりつつありますが、MEF (Managed Extentions Framework) による拡張ができるのも特徴の1つです。
このMEFを使えばテキストエディタの背景に好きな画像を表示した痛IDEがつくれるのではないかとしばやんが今年の6月くらいにVS2010 β1のテキストエディタを痛化していたので秘かに色々調べていたりしました。今回のコード作成にあたっても、しばやんのまめしば雑記をすごく参考にしています。
新しいプロジェクトのテンプレートの中にも「Extensibility」がありテキストエディタ部分を拡張するための「Editor Viewpoint Adornment」もあります。
このテンプレートで生成したプロジェクトには次のファイルが含まれています。
- My Project\AssemblyInfo.vb
- source.extension.vsixmanifest
- Adornment.vb
- AdornmentFactory.vb
source.extension.vsixmanifest
絶対忘れてはいけないのは、このvsixmanifestファイルのAuthor項目の設定です。Author項目を設定せずにビルドしたものをインストールするとIDEの[ツール]-[機能拡張マネージャ]で無効化やアンインストールができなくなってしまいますので注意してください。
Adornment.vb
テキストエディタの痛化のキモはAdorment.vbに記述されているクラスのNewメソッドとOnSizeChangeイベントプロシージャのコードにあります。この2つのメンバはテンプレートからの初期生成時にすでに作成されています。
今回は画像ファイルの差し替えを考慮してNewメソッドに題にパラメタを追加してそこに表示する画像ファイル名を渡すようにしています。
Public Sub New(ByVal view As IWpfTextView, ByVal imageFilename As String)
_view = view
_adornmentLayer = _view.GetAdornmentLayer("ItaBackgroundImage")
_image = New Image
_image.Stretch = Stretch.Uniform
_image.HorizontalAlignment = Windows.HorizontalAlignment.Right
_image.MinHeight = 300
_image.Source = New Imaging.BitmapImage(New System.Uri(imageFilename,
System.UriKind.Absolute))
_image.Opacity = 0.25
End Sub
Private Sub OnSizeChange() Handles _view.ViewportHeightChanged,
_view.ViewportWidthChanged
_adornmentLayer.RemoveAllAdornments()
Canvas.SetTop(_image, 0)
Canvas.SetLeft(_image, 0)
_image.Height = _view.ViewportHeight
_image.Width = _view.ViewportWidth
_adornmentLayer.AddAdornment(AdornmentPositioningBehavior.ViewportRelative,
Nothing,
Nothing,
_image,
Nothing)
End Sub
なお、adornmentLayer名としては「"ItaBackgroundImage"」という名前を付けてみました。
OnSizeChangeイベントプロシージャはスクロールしたときに背景画像はスクロールしないようにしてます。
もし、一緒にスクロールさせたい場合は、OnSizeChangeイベントプロシージャの内容をNewプロシージャの最後に付与すれば、OnSizeChagngeイベントプロシージャは不要です。
AdrnmentFactory.vb
AdrnmentFactory.vbにはMEF拡張用の属性とAdornment.vbに書かれたクラスをNewする処理を書きます。
実際のコードではここで画像ファイル名を取得する処理を記述しています。
NotInheritable Class EditorAdornmentFactory
Implements IWpfTextViewCreationListener
Public _editorAdornmentLayer As AdornmentLayerDefinition
Public Sub TextViewCreated(ByVal textView As IWpfTextView)
Implements IWpfTextViewCreationListener.TextViewCreated
Dim TempPurpleCornerBox = New ItaBackgroundImage(textView,
imageFilename)
End Sub
End Class
テンプレートから生成されたコードからの変更点はほとんどないのですが、_editorAdornmentLayerのName属性にadornmentLayer名として決めた「"ItaBackgroundImage"」を設定しわすれないようにしましょう。
テスト方法
出来上がったコードをIDEで実行すれば、自動的に別のIDEが「実験的なインスタンス」として立ち上がります。
この実験的なインスタンスのIDEで[ファイル]-[新しいプロジェクト]からクラスライブラリテンプレートを選んで作成するとテキストエディタが開いた状態でプロジェクトが生成されるので確認するのが便利です。
ただし、すごく遅いですのでビルドしたものをインストールして確認してしまう方が断然早いので、今回のように簡単なロジックであればインストールして確認する方法をお勧めします。
配布&インストール方法
このプロジェクトをビルドするとbin\releaseフォルダに「ItaBackgroundImage.vsix」ファイルが作成されるので、このファイルを配布します。
インストール方法はこのvsixファイルをダブルクリックするだけです。
使い方
Visual Studio 2010 Beta 2のテキストエディタの背景に選択した画像を左寄せで表示します。
画像指定はインストールして最初に起動したときにファイル指定ダイアログが表示されますのでそこで指定してください。
別の画像に切り替える機能は実装してませんので、環境変数LOCALAPPDATAのMicrosoft\VisualStudio\10.0\Extensions\HATSUNE, Akira\ItaBackgroundImage\1.0\ItaBackgroundImage.configファイルの中のファイル名を直接書き換えてください。
なお、画像ファイルは含まれていませんので、お好きな画像をご指定ください。