使ってみよう! Windows Live SDK/API

第8回Windows Live Writer ―― プラグインの作成 Part II

挿入プラグイン

前回はWindows Live Writer(WLW)のURL貼り付けを契機とし動作する少しマイナーなプラグインを作成しました。今回はWLWのプラグインとして代表的な挿入プラグインを作ります。

プラグインには大きく分類して2種類あります。ContentSourceクラスを継承したブログ記事にHTMLを挿入するだけの単純なものと、SmartContentSourceクラスを継承した挿入後もサイドバーを使って編集が可能なプラグインのふたつです。前者をシンプルなプラグイン、後者をスマートなプラグインと本記事では呼んでいます。また、サイドバーによる編集部分をサイドバーエディタと表現しています。

クラスの作成

本連載第7回「プロジェクトの作成」および「クラスの作成」にてWriterPlugin属性を指定するところまでは、ほぼ同様の作業になります。本記事と併せて参照してください。

Visual Studio 2008にてクラスライブラリのプロジェクトを作成し、WindowsLive.Writer.Api.dllを参照します。挿入プラグインの場合は、System.Windows.Formsも参照する必要があります。.NETタブから選択し参照を追加します図1⁠。

図1 System.Windows.Formsの参照
図1 System.Windows.Formsの参照

次にプラグインに共通して必要なWriterPlugin属性をクラスに指定します。ここまでが前回の内容と同じ部分です。サンプルコードはこの後示します。

InsertableContentSource属性

挿入プラグインを作るにはInsertableContentSource属性を付けます。パラメータは以下のとおりです。プラグイン名とは別に挿入するものの名称を指定します。

menuText 挿入メニューに表示される名前
SidebarText サイドバーの挿入項目に表示される名前(オプション)

ここまでのコードは次のようになります。このあと使用するシンプルなプラグインの場合を示しています。シンプルなプラグインの場合はContentSourceクラスを継承し、サイドバーにて編集できるプラグインの場合はSmartContentSourceクラスを継承します。GUID部分は適当に変更してください。

Imports WindowsLive.Writer.Api
<WriterPlugin("27328a8c-94d3-40b4-b369-1e6019e3571e", _
              "シンプル挿入プラグイン", _
              Description:="シンプルな挿入プラグインのサンプル", _
              HasEditableOptions:=False), _
 InsertableContentSource("Hello, world.")> _
Public Class SimplePlugin
    Inherits ContentSource ' シンプルなプラグインンの場合
    'Inherits SmartContentSource ' スマートプラグインの場合
End Class

シンプルな挿入プラグイン:「Hello, world」の挿入

まずはContentSourceクラスを使った「Hello, world.」と挿入するだけのプラグインを作成してみましょう。既に示したコードを使用します。ContentSourceクラスを使用した挿入プラグインに最低限 必要なメソッドはCreateContentメソッドのみです。ユーザがWLWで挿入する項目をクリックしたときこのメソッドが呼ばれます。CreateContentメソッドをオーバーライドします。

Public Overrides Function CreateContent(ByVal dialogOwner As System.Windows.Forms.IWin32Window, ByRef content As String) As System.Windows.Forms.DialogResult
    Return MyBase.CreateContent(dialogOwner, content)
End Function

CreateContentメソッドの引数にString型のcontentがあります。参照渡しになっており、この変数にブログ記事へ挿入するHTMLを格納します。戻り値にWindows.Forms.DialogResult.OKを返すことでcontentの内容が挿入されます。Windows.Forms.DialogResult.Cancelを返すと挿入はキャンセルされます。メソッド内を次のように変更します。

Public Overrides Function CreateContent(ByVal dialogOwner As System.Windows.Forms.IWin32Window, ByRef content As String) As System.Windows.Forms.DialogResult
    content = "Hello, world."
    Return Windows.Forms.DialogResult.OK
End Function

さっそく、このプラグインを実行してみましょう。ビルド後、できたDLLファイルをWLWのPluginsフォルダに配置します。配置に関しても前回の記事を参照してください。

WLWを起動するとメニューとサイドバーの挿入項目に「Hello, world.」が追加されていると思います図2⁠。クリックすると記事に「Hello, world.」という文字列が挿入されます。うまく動きましたでしょうか。もし項目がなければ、メニュー「ツール」「オプション」よりプラグインが有効になっているか確認してください。

図2 ⁠Hello, world」挿入プラグイン
図2 「Hello, world」挿入プラグイン

入力ウィンドウの利用

CreateContetが呼び出されたときユーザに何か値を入力させ、それに基づき挿入する内容を決めることもできます。たとえば図3のようなWindowsフォームを用意します。フォームにTextBoxを貼り付け、そのTextプロパティの値をStyleTextという名前のプロパティを通して取得できるようにしました。フォームを使用するためSystem.Drawingも参照します。

図3 入力ウィンドウの例
図3 入力ウィンドウの例

コードを次のように書きます。以下では選択したテキストに入力ウィンドウで指定したスタイル属性を付ける処理をしています。挿入項目をクリック時にブログ記事中のテキストを選択していた場合、引数のcontentにはその文字列が格納されているため、このようなことが可能です。

Public Overrides Function CreateContent(ByVal dialogOwner As System.Windows.Forms.IWin32Window, ByRef content As String) As System.Windows.Forms.DialogResult
    Dim frm = New StyleSelectionForm ' 自作ウィンドウ
    Dim result = frm.ShowDialog(dialogOwner)
    If result = Windows.Forms.DialogResult.OK Then
        content = "<span style=""" & frm.StyleText & """>" & content & "</span>"
    End If
    frm.Dispose()
    Return result
End Function

また、CreateContentメソッドにはSystem.Windows.Forms.IWin32Window型のdialogOwnerという引数もあります。WindowsフォームのShowDialogメソッドを呼ぶときに指定することでオーナーフォームの指定が可能になっています。

スマート挿入プラグイン

次は、SmartContentSourceクラスを継承した挿入プラグインを作ってみましょう。プロジェクト作成やクラスの属性については、これまでと同じです。クラスには次のメソッドが必要になります。

CreateContent

挿入するたびに1度だけ最初に呼ばれます。引数はContentSourceクラスのときと異なっています。参照渡しのString型の引数の代わりにISmartContentというオブジェクトが渡されます。挿入するHTMLはここでは決定せずGeneratePublishHtmlメソッドを使います。

CreateEditor

プラグインの種別ごとに最初の挿入時にただ1度だけ呼ばれるメソッドです。サイドバーに表示するエディタとなるSmartContentEditorクラスのインスタンスを生成し戻り値として返すことになります。

GeneratePublishHtml

ブログ記事へ挿入するHTMLを戻り値に指定するメソッドになります。戻り値がString型になっています。

挿入した内容の保持

スマートプラグインは1度 挿入した後にも内容を変更することができます。その内容を保持するためにISmartContentインタフェースにあるPropertiesというプロパティを利用します。このプロパティの型はIPropertiesというインタフェースになっています。

IPropertiesインタフェースは、SetStringやGetStringといったメソッドを持っています。SetString・GetStringは名前が示すようにString型の情報を保持するためのものです。

SetString

値を設定するときに使用します。引数は次のとおりです。戻り値はありません。ここでいうプロパティ名とは、設定した値を単に識別するためのもので、自由に名前を決めて構いません。

name(String型) プロパティ名
value(String型) 設定する値
GetString

値を取得するときに使用します。引数は次のとおりです。戻り値は指定したプロパティ名の値になります。もしその名前のプロパティが存在しない場合、規定値に指定した値が返ってきます。

name(String型) プロパティ名
defaultValue(String型) 指定したプロパティが存在しないときの規定値

GetString・SetStringのほかに、GetBoolean、GetDecimal、GetFloat、GetIntなど基本的な型のものが用意されています。

ISmartContentインタフェースはCreateContentとGeneratePublishHtmlメソッドの引数にあり、たとえば次のように使用します。CreateContentメソッド内でTextというプロパティ名を指定して「こんにちは」という値を格納しています。そして、GeneratePublishHtmlメソッドにて、その値を取り出して戻り値に指定しています。

Public Overrides Function CreateContent(ByVal dialogOwner As System.Windows.Forms.IWin32Window, ByVal newContent As WindowsLive.Writer.Api.ISmartContent) As System.Windows.Forms.DialogResult
    newContent.Properties.SetString("Text", "こんにちは")
    Return Windows.Forms.DialogResult.OK
End Function

Public Overrides Function GeneratePublishHtml(ByVal content As WindowsLive.Writer.Api.ISmartContent, ByVal publishingContext As WindowsLive.Writer.Api.IPublishingContext) As String
    Return content.Properties.GetString("Text", "Hello, world.")
End Function

注目すべき点は、どちらもメソッドの引数で渡された変数を使用して値の設定・取得をしています。WLWによって適切なオブジェクトが渡されるためグローバル(Private)な領域に通常は記憶しておく必要はありません。ただし、上記のコードはCreateEditorメソッドを実装していないため、正常にプラグインは動きません。

サイドバーエディタの作成

スマートプラグインでのサイドバーに表示するエディタ部分を作ります。これはSmartContentEditorクラスを継承したものになります。プロジェクトにユーザコントロールを追加し図4これを変更して使います。ソリューションエクスプローラからプロジェクト名を右クリックし、メニューの「追加」の中の項目に「ユーザコントロール」があります。

図4 ユーザコントロールの追加
図4 ユーザコントロールの追加

ユーザコントロールが継承しているクラスをSmartContentEditorに変更します。ソリューションエクスプローラのボタンからすべてのファイルを表示します図5⁠。

図5 すべてのファイルを表示
図5 すべてのファイルを表示

Visual Studioによって生成されたファイルを選択しコードを編集します。System.Windows.Forms.UserControlからWindowsLive.Writer.Api.SmartContentEditorに変更しましょう。

Inherits WindowsLive.Writer.Api.SmartContentEditor

以上で自動生成されたコードはもう編集しませんので、すべてのファイルの表示は元に戻して構いません。

この状態でコントロールをデザイナで見ると縦長のコントロールが表示されると思います。試しにTextBoxとButtonを配置します。ここでは、ひとつのString型の値の編集ができ、⁠適用]ボタンをクリックすると挿入した内容を変更するものと想定します。図6にここまでの作業を行ったコントロールを示します。

図6 SmartContentEditorコントロール
図6 SmartContentEditorコントロール

次にサイドバーエディタが処理するコードを記述します。コントロールのコードを表示するにはソリューションエクスプローラでコントロールのファイルを選択した状態で[コードの表示]ボタンをクリックします。

ブログ記事へ挿入した内容が選択されると、SelectedContentChangedイベントが起こります。このタイミングでサイドバーエディタ上のTextBoxの値などを更新します。SmartContentEditorクラスはSelectedContentというISmartContent型のプロパティを持っているので、これを通して必要な情報を取得します。コード例は次のようになります。⁠TextBox」はサイドバーエディタに貼り付けたTextBoxの名前です。GetStringメソッドを使い、先ほどからのコードに登場しているプロパティ名がTextの値を取得しています。

Private Sub Editor_SelectedContentChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SelectedContentChanged
    Me.TextBox.Text = Me.SelectedContent.Properties.GetString("Text", "Hello, world.")
End Sub

サイドバーエディタでの編集を反映するには、OnContentEditedメソッドを呼ぶことで行います。Buttonがクリックされたときに内容を更新しブログの記事に反映するコードは以下になります。

Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button.Click
    Me.SelectedContent.Properties.SetString("Text", Me.TextBox.Text)
    OnContentEdited()
End Sub

スマート挿入プラグインの実行

CreateEditorメソッドの実装だけが残っていました。プラグインのクラスに以下のコードを追加しましょう。作成したサイドバーエディタのインスタンスを生成しています。

Public Overrides Function CreateEditor(ByVal editorSite As WindowsLive.Writer.Api.ISmartContentEditorSite) As WindowsLive.Writer.Api.SmartContentEditor
    Dim editor = New Editor ' SmartContentEditorオブジェクトの生成
    Return editor
End Function

以上でとりあえず動くものができました。ビルド後、DLLファイルをPluginsフォルダに配置してWLWを起動して挿入プラグインを試してみましょう。⁠こんにちは」という文字が挿入され、サイドバーエディタを使って内容が編集できるはずです図7⁠。

図7 スマート挿入プラグインの実行結果
図7 スマート挿入プラグインの実行結果

何のおもしろみもなく役に立たないプラグインですが、スマート挿入プラグインの基本的な作り方が理解できたかと思います。

おわりに

いかがでしたでしょうか。記事では実用的でないプラグインしか紹介できませんでしたので、最後に挿入プラグインの実用的な可能性とシンプル・スマートプラグインの違いを少し示しておきます。

シンプルなプラグインとスマートなプラグインは、挿入後に編集が可能かどうかにあります。編集機能を実現するためにWLWは挿入した情報を保存し、プラグイン自身が設定した情報も記憶しています。また挿入したときにWLWが管理するためのHTMLタグが自動で挿入されています。これはブログ記事の表示を「HTMLコード」にすることでわかります。これによってブログへ投降後に再度ブログから記事を開いても、挿入した箇所の識別が可能になっています。

以上のことからプラグイン作成のとき無闇にスマートプラグインを選択することはお勧めできません。挿入後でも編集できたほうが便利なものに使用しましょう。たとえばGoogle Chart API[1]を使ったチャート挿入プラグインはどうでしょう。後からチャートデータの変更を考えると、これはスマートプラグインがより便利だと思います。Google Chart APIは指定できるパラメータが多いので便利なプラグインを作るのはたいへんですが、基本的なものは今回作成したスマートプラグインを少し変更するだけで作成可能です。Google Chart APIに最低限必要なパラメータは3個の文字列です。つまり3個のString型を設定・取得するような作りに変更します。作成例を示しておきます図8⁠。ぜひこれに限らず便利なプラグインを作ってみてください。

図8 プラグイン作成例: Google Chart APIによるチャートの挿入
図8 プラグイン作成例: Google Chart APIによるチャートの挿入

おすすめ記事

記事・ニュース一覧