CodeZine(コードジン)

特集ページ一覧

Windows Live Writer用のプラグインを開発する

Windows Live Writer自作プラグインの開発

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2008/07/25 14:00

目次

サイドバー(ContextEditor)

 Live Writerのエディタ内でSmartContentSourceを選択すると、Live Writerウィンドウの右側にあるサイドバーがアクティブになります(図8を参照)。

図8 ユーザーがSmartContentSourceを選択すると右側にLive Writerサイドバー表示される
図8 ユーザーがSmartContentSourceを選択すると右側にLive Writerサイドバー表示される

 このようなサイドバーを表示するためには、プラグインプロジェクト内に新しいユーザーコントロールを作成する必要があります。この例では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;
}
重要
 ISmartContentのIPropertiesプロパティを取得したい場合は、SelectedContent.Propertiesを使用しないでください(正しく機能しません)。代わりに、SelectedContentをローカル変数に割り当て、IPropertiesオブジェクトをPluginSettingsクラスに渡すときに、そのローカル変数を使用してください。

 ベストプラクティスとしては、このイベントハンドラメソッドを使用して、現在の設定をサイドバー内の設定に反映させるか、これらの設定を反映させるメソッドを呼び出すようにします。

 ユーザーがサイドバーを使用してコンテンツを変更しても、OnContentEdited()メソッドを呼び出すまでエディタ内では何も変化しません。このメソッドは、すべての変更が行われた後に1つのボタンから呼び出すことも、変更が行われるたびに呼び出すこともできます。エディタを更新するタイミングは開発者に任されています。

 リスト5に、サンプルプラグインのContextEditorに必要なコードを示します。

リスト5 SmartContentSourceプラグインの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ドキュメントにひととおり目を通すことを強くお勧めします。



  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:japan.internet.com翻訳記事

もっと読む

著者プロフィール

  • Scott Lovegrove(Scott Lovegrove)

    Windows Live MVP for Microsoftであり、Windows Live Writerだけでなく、Windows Live全般に深く関係している。Windows Live専用のコミュニティWebサイト「LiveSide.net」の主要な寄稿者の1人であり、Windows Live...

  • japan.internet.com(ジャパンインターネットコム)

    japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.com や EarthWeb.c...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5