読者です 読者をやめる 読者になる 読者になる

かんたん fub のプラグイン

ぼんやりしてたら間隔が開いてしまった!。ここでとっておきの、fubプラグインは超簡単に作れちゃいますの体験談をひとつ。fub 使いのみなさまにおかれましては、何か不便があったらプラグイン作っちゃうというのもこりゃ充分ありえる話です。自分は、Visual Studio をこれで初めて使った、というくらいの人間ですが、良い勉強と思ってやれば、なんとでもなります!。多分!

必要なもの

これだけ。

手順1 - コントロールライブラリ準備

フォーラムの答え通り、クラスライブラリか空のプロジェクトを作った後、ソリューションエクスプローラのプロジェクト名右クリックから[追加]-[ユーザーコントロール]で終了。これだけ。

手順2 - そのコントロールライブラリをプラグインとして整形する

次に、その新しくできたクラスをダブルクリック…、すると、『Nantara.cs[デザイン]』というフォームのデザインのタブが開くので、画面の余白どこでもいいので右クリックして[コードの表示]をします。

あとは fub の作者さんが書いている通りに中身を書き換えます。

  1. using fubPlugin; を頭に追加
  2. すぐ下の namespace なんたら、を namespace fubPlugin に変更
    すると Microsoft 製品おなじみ、何か追加で操作できるときの箱が右下に出るので、そこからずばっと全体で名前変更。
  3. PluginBase を継承して、あとはプラグインの形態に合わせてお好きなインターフェースを実装
    自分はこうなりました。
public partial class NavigationBar : PluginBase, IToolbar

作者さんのページだと partial 無いですが、ツールバーかエクスローラバーに「出現」させる場合はデザインが必要だと思うので、partial そのまんまです。partial って C# やるまで見たこと無かったですが、一つのクラスを、別々の cs ファイル上で部分部分に定義してコンパイルするときに合体してくれる宣言らしいです。

ここまでででとりあえず、頭の方はこうなりました。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using fubPlugin;

namespace fubPlugin
{
    public partial class NavigationBar : PluginBase, IToolbar
    {
        public NavigationBar()
        {
            PluginName = "NavigationBar";
            InitializeComponent();
        }

InitializeComponent(); も、上の partial と同じ理由でデザインを初期化するのに必要なんだと思うので、テンプレートそのまんまで残してあります。PluginName プロパティは PluginBase で定義されてるので、ここで設定。

作者さんの説明では「後はお好きなように。」とありますが、本当に後はお好きなようにでした。説明ページの「本体から呼び出されるメソッド」は、必要なら実装しますが、とりあえずいらなそうなので何もせず。あ、そうそう、ちなみに何を作りたかったかと言えば、link タグの rel="prev" と rel="next" を取って移動してくれるボタンです。Opera にある奴です。Firefox もエクステンションであるかな?

手順3 - ボタンを作る

このプラグインツールバーに置いておくつもりだったので、デザインを作らねばなりません。コードからデザインに戻って(例によって右クリックすると[デザインを表示]がある)、ツールボックスから適当にボタンを二個配置!。Previous と Next!。それだけ!。

あと、ステージというか、台?。これが大きいままだと fub を立ち上げたとき「俺のプラグインだけ随分でけえな!」となるので、ボタンギリギリまでちっちゃくします。マウス操作だとアナログ極まりないので、「プロパティ ウィンドウ」を表示して、数値をいじる。できあがりはこんな感じ。こんなアバウトでいいのかな?!

手順4 - ボタン押した時の実行コードを書く

あとはボタン押したら何するかである。適当に書きます。僕は HTML ソースを拝見する必要があったので、作者さんの言うとおり mshtml を参照に追加して、using して、GetActiveFrameDocument() メソッドを使ってアクティブなタブのドキュメントを IHTMLDocument2 として拝借して使いました。この辺のことは、MSDN のこのあたりの記事とリファレンスをどうぞ。

要するに、ここに一番時間かかります!。当たり前だけど!。はいもう、ソースはどん!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using fubPlugin;
using mshtml;

namespace fubPlugin
{
    public partial class NavigationBar : PluginBase, IToolbar
    {
        public NavigationBar()
        {
            PluginName = "NavigationBar";
            InitializeComponent();
        }

        private void prev_button_Click(object sender, EventArgs e)
        {
            get_and_move("prev");
        }

        private void next_button_Click(object sender, EventArgs e)
        {
            get_and_move("next");
        }

        private bool get_and_move(string prev_next)
        {
            if (prev_next != "next" && prev_next != "prev")
            {
                return false;
            }

            IHTMLDocument2 HTMLDocument = (IHTMLDocument2)GetActiveFrameDocument();
            IHTMLElementCollection link_elements
                = (IHTMLElementCollection)HTMLDocument.all.tags("link");

            if (link_elements.length > 0)
            {
                foreach (HTMLLinkElement link_element in link_elements)
                {
                    if (link_element.rel == prev_next)
                    {
                        HTMLDocument.url = link_element.href;
                        return true;
                    }
                }
            }
            return false;
        }
    }
}

いやー、我ながらゆるいソースですね。これで動いてるってのがすごい。動いてるんですけど。これがほとんど「初めて書いた C#」だったでどうかご容赦ください。

そうそう、我ら ECMA スクリプターとしては、「Alert/Traceどうやんのよ!」と思うと思いますが(僕は思いました!)、System.Windows.Forms.MessageBox.Show(文字列) でした!。ここでは using System.Windows.Forms; なので、MessageBox.Show です。

        private void next_button_Click(object sender, EventArgs e)
        {
            MessageBox.Show("unko");
        }

とかやると非常に意味のないツールバーが出来ます。最初やりました。ブラウザ上でこんなこと言われるとちょっと楽しいです。

手順5 - コンパイルして、dll をコピー

以上!。あとは F6 押してコンパイルして、出来あがったほかほかの dll ファイルを fub の Plugins フォルダに入れて fub を再起動したら、あら不思議!。さっき作ったゆるいボタンが僕の fub に搭載されました!!(こんな感じ)。適当にボタン作ったせいで、他のツールバーよりちょっと高さが余分に高いですが、動くのでまあいいか的な。

ちなみに僕がこの Navigation 機能を使うのは主に、主にというかもっぱらにはてな読むときです。はてなちゃんと prev と next 付けてくれてるのでどこまでもこのボタン二つで読めます!。これが欲しかった!。

手順6 - ショートカットキーとか設定できるようにする

これはえーと、まだやってないのでこれからやります。やってみて出来たらまた書きます!。

というわけで、欲しい機能はすぐ書けます!。ブックマークレット感覚で書けます!。カジュアル感覚でどんどん書こう!。fubプラグイン!。落ちても自分の fub が落ちるだけ!