サイドバー(ContextEditor)
Live Writerのエディタ内でSmartContentSourceを選択すると、Live Writerウィンドウの右側にあるサイドバーがアクティブになります(図8を参照)。
このようなサイドバーを表示するためには、プラグインプロジェクト内に新しいユーザーコントロールを作成する必要があります。この例ではContextEditorと名付けています。UserControlインタフェースを継承するのではなく、SmartContentEditorインタフェースから継承する必要があります(WindowsLive.Writer.APIを使用することを忘れないでください)。
public partial class ContextEditor : SmartContentEditor
エディタのコンストラクタは次のようなものでなければなりません。そうでないと、プラグインがおかしな動作をする可能性があります。
PluginSettings m_settings; ISmartContent m_content; public ContextEditor() { InitializeComponent(); this.SelectedContentChanged += new EventHandler( SelectedContentNowChanged); }
このコードでEventHandlerをどのようにリスンしているかに注目してください。これにより、別のSmartContentSourceオブジェクトインスタンスが選択されたことを検出することができます(ユーザーがこのプラグインを使用して2つの異なるオブジェクトをブログエントリに挿入する可能性があることを忘れないでください)。
イベントハンドラメソッドのコードも重要です。
void SelectedContentNowChanged (object sender, EventArgs e) { m_content = SelectedContent; m_settings = new PluginSettings(m_content.Properties); textBox1.Text = m_settings.PlaceHolder; textBox2.Text = m_settings.FinalText; }
SelectedContent.Properties
を使用しないでください(正しく機能しません)。代わりに、SelectedContentをローカル変数に割り当て、IPropertiesオブジェクトをPluginSettingsクラスに渡すときに、そのローカル変数を使用してください。ベストプラクティスとしては、このイベントハンドラメソッドを使用して、現在の設定をサイドバー内の設定に反映させるか、これらの設定を反映させるメソッドを呼び出すようにします。
ユーザーがサイドバーを使用してコンテンツを変更しても、OnContentEdited()
メソッドを呼び出すまでエディタ内では何も変化しません。このメソッドは、すべての変更が行われた後に1つのボタンから呼び出すことも、変更が行われるたびに呼び出すこともできます。エディタを更新するタイミングは開発者に任されています。
リスト5に、サンプルプラグインのContextEditorに必要なコードを示します。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; using WindowsLive.Writer.Api; namespace EditPublish { public class ContextEditor : SmartContentEditor { PluginSettings m_settings; ISmartContent m_content; public ContextEditor() { InitializeComponent(); this.SelectedContentChanged += new EventHandler( SelectedContentNowChanged); } void SelectedContentNowChanged (object sender, EventArgs e) { m_content = SelectedContent; m_settings = new PluginSettings(m_content.Properties); textBox1.Text = m_settings.PlaceHolder; textBox2.Text = m_settings.FinalText; } private void button1_Click (object sender, EventArgs e) { if (textBox1.Text != "") { m_settings.PlaceHolder = textBox1.Text; } else { MessageBox.Show("No placeholder", "Big Fat Hairy Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (textBox2.Text != "") { m_settings.FinalText = textBox2.Text; } else { MessageBox.Show("No text", "Big Fat Hairy Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } OnContentEdited(); } /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be /// disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Component Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.textBox1 = new System.Windows.Forms.TextBox(); this.label1 = new System.Windows.Forms.Label(); this.textBox2 = new System.Windows.Forms.TextBox(); this.label2 = new System.Windows.Forms.Label(); this.button1 = new System.Windows.Forms.Button(); this.label3 = new System.Windows.Forms.Label(); this.SuspendLayout(); // // textBox1 // this.textBox1.Location = new System.Drawing.Point(3, 91); this.textBox1.Multiline = true; this.textBox1.Name = "textBox1"; this.textBox1.Size = new System.Drawing.Size(178, 58); this.textBox1.TabIndex = 0; // // label1 // this.label1.AutoSize = true; this.label1.Location = new System.Drawing.Point(0, 73); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(168, 13); this.label1.TabIndex = 3; this.label1.Text = "Text to appear in the Writer editor:"; // // textBox2 // this.textBox2.Location = new System.Drawing.Point(3, 182); this.textBox2.Multiline = true; this.textBox2.Name = "textBox2"; this.textBox2.Size = new System.Drawing.Size(178, 58); this.textBox2.TabIndex = 4; // // label2 // this.label2.AutoSize = true; this.label2.Location = new System.Drawing.Point(0, 164); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(171, 13); this.label2.TabIndex = 5; this.label2.Text = "Text to appear in actual blog entry:"; // // button1 // this.button1.Location = new System.Drawing.Point(3, 255); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 6; this.button1.Text = "Apply"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click); // // label3 // this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)( ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.label3.BackColor = System.Drawing.Color.White; this.label3.Font = new System.Drawing.Font("Microsoft Sans Serif", 14F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label3.Location = new System.Drawing.Point(0, 0); this.label3.Name = "label3"; this.label3.Size = new System.Drawing.Size(190, 32); this.label3.TabIndex = 7; this.label3.Text = "Insert Placeholder"; // // ContextEditor // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Controls.Add(this.label3); this.Controls.Add(this.button1); this.Controls.Add(this.label2); this.Controls.Add(this.textBox2); this.Controls.Add(this.label1); this.Controls.Add(this.textBox1); this.Name = "ContextEditor"; this.Size = new System.Drawing.Size(190, 482); this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.Label label1; private System.Windows.Forms.TextBox textBox2; private System.Windows.Forms.Label label2; private System.Windows.Forms.Button button1; private System.Windows.Forms.Label label3; } }
開発のヒント
Live Writer APIをよく調べると、プラグインではもっと多くの、高度な機能を実現できることに気づくでしょう。たとえば、指定したURLのスクリーンショットを撮ってイメージを返す、優れたスクリーンスクレーピングメソッドなどがあります。MSDNのAPIドキュメントにひととおり目を通すことを強くお勧めします。