Hatena::Groupsubtech

ういはるかぜの化学

Friday, March 30, 2007

fub に無理やり手を入れて自分好みにする 11:47  fub に無理やり手を入れて自分好みにする - ういはるかぜの化学 を含むブックマーク はてなブックマーク -  fub に無理やり手を入れて自分好みにする - ういはるかぜの化学

using System;
using System.Collections.Generic;
using System.Text;
using fubPlugin;
using System.Diagnostics;
using System.Reflection;
using fub;
using System.Windows.Forms;

namespace fubPlugin
{
    public class TestPlugin : PluginBase, IModule
    {
        private Timer _timer;
        private Timer _timerSearchReset;
        private MainForm _mainForm;
        private ComboBox _cmbKeyword = null;

        public TestPlugin()
        {
            this.PluginName = this.GetType().ToString();

            // OnLoadが呼ばれないので初期化タイマーで。
            _timer = new Timer();
            _timer.Interval = 2000; // 2秒もあれば余裕
            _timer.Tick += new EventHandler(_timer_Tick);
            _timer.Start();
        }

        void _timer_Tick(object sender, EventArgs e)
        {
            _timer.Stop();
            Setup();
        }

        public override void OnLoad()
        {
        }

        /// <summary>
        /// 
        /// </summary>
        private void Setup()
        {
            // フォームをとってくる
            MulticastDelegate mdel = _<MulticastDelegate>(this, "PluginHandler");
            MainForm mainForm = mdel.Target as MainForm;
            _mainForm = mainForm;

            // 終了確認ダイアログ
            mainForm.FormClosing += new FormClosingEventHandler(mainForm_FormClosing);

            // アドレスバーのオートコンプリートの方法を変更
            Object tbAddress = _<Object>(mainForm, "tbAddress");
            TextBox cmbAddress = _<TextBox>(tbAddress, "cmbAddress");
            cmbAddress.AutoCompleteMode = AutoCompleteMode.Suggest;

            // 検索バーのテキストボックスを入力後5秒で削除する
            PluginInfo[] plugins = _<PluginInfo[]>(mainForm, "plugins");
            foreach (PluginInfo plugin in plugins)
            {
                if (plugin.ID == "Searchbar")
                {
                    _cmbKeyword = _<ComboBox>(plugin.Plugin, "cmbKeyword");
                    _cmbKeyword.TextChanged += new EventHandler(cmbKeyword_TextChanged);
                }
            }
            _timerSearchReset = new Timer();
            _timerSearchReset.Interval = 5000;
            _timerSearchReset.Tick += new EventHandler(_timerSearchReset_Tick);

        }

        void cmbKeyword_TextChanged(object sender, EventArgs e)
        {
            _timerSearchReset.Stop();
            _timerSearchReset.Start();
        }

        void _timerSearchReset_Tick(object sender, EventArgs e)
        {
            _cmbKeyword.Text = "";
            _timerSearchReset.Stop();
        }

        void mainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (e.CloseReason != CloseReason.UserClosing)
                return;

            if (MessageBox.Show("すべてのタブを閉じて、fub を終了しますか?", "fub", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.No)
            {
                // キャンセル
                e.Cancel = true;
                _mainForm.Show();
            }
        }

        #region IModule メンバ

         public void Execute(string command)
        {
            //throw new Exception("The method or operation is not implemented.");
        }

        #endregion

        public T _<T>(Object target, String name)
        {
            return GetPrivateFieldValue<T>(target, name);
        }
        public T GetPrivateFieldValue<T>(Object target, String name)
        {
            Type t = target.GetType();
            FieldInfo f = null;

            while (f == null && t != null)
            {
                f = t.GetField(name, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.OptionalParamBinding | BindingFlags.GetField | BindingFlags.SetField);
                t = t.BaseType;
            }

            Object o = f.GetValue(target);
            return (T)o;
        }
    }
}
トラックバック - http://subtech.g.hatena.ne.jp/mayuki/20070330