SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

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

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

サイドバー(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ドキュメントにひととおり目を通すことを強くお勧めします。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

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

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Scott Lovegrove(Scott Lovegrove)

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2783 2008/07/25 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング