「キーワードの変更時に前のキーワードを削除」機能の実装

今後の追加で、XULファイルがカオスになりそう・・・な気がしたので、

とりあえず、XULファイルから、処理が記述してある部分をJSファイルに抜き出した。

なので、ファイル構成は以下のようになった。

subjecthelper
 ├ install.rdf
 ┠ chrome.manifest
 └ content
   ┠ overlay.xul
   ┠ subjectHelper.css
   ┠ subjectHelper.xml
   ┠ subjectHelper.js
   └ img
    └ icon.png

削除処理を実装

subjectHelper.jsの中身はこんな感じ。

var SubjectHelper = { 
    insert: function( evt ) { 
        const keyHead = "【"; 
        const keyTail = "】"; 
 
        var key         = keyHead + evt.label + keyTail;            // キーワード作成 
        var msgSubject  = document.getElementById( "msgSubject" ); 
        var subjectLine = msgSubject.value;                         // 件名取得 
 
        // 件名からキーワードを除外 
        subjectLine = subjectLine.substr( subjectLine.indexOf( keyTail ) + 1 ); 
 
        msgSubject.value = key + subjectLine; 
         
        // 件名にフォーカスをあてる 
        msgSubject.focus(); 
 
        gContentChanged = true; 
 
        // ウインドウタイトルを更新 
        SetComposeWindowTitle(); 
    } 
}; 

削除処理は、件名取得して、件名からキーワードの末尾から後ろを取り出し、

選択したキーワードと、さっき取り出した件名をくっつけて新しい件名にする。

これで、キーワードを変更時に以前のキーワードが削除される。

元からあるコードの理解

ということで、元からあるコードを読んでみると、件名を変更する処理以外に次の3つの処理がされている。

・msgSubject.focus();
・gContentChanged = true;
・SetComposeWindowTitle();

gContentChangedは、不明のままだったけど、他の2つは何とかわかった。

gContentChangedがグローバル変数であることはわかるけど、それが何を意味するのか不明。

msgSubject.focus()

なんとなく使われてる関数の名前でわかるけど、msgSubject.focus()は件名を入力する箇所にフォーカスを当てている。

これによって、キーワードを変更した際に、件名部分にカーソルが合わさるようになっている。

SetComposeWindowTitle()

これは、最初まったく意味がわからなかったけど、ソースコードを見るとなんとなくわかった。*1

function SetComposeWindowTitle()
{
  var newTitle = GetMsgSubjectElement().value;

  var bundle = document.getElementById("bundle_composeMsgs");
  if (newTitle == "" )
    newTitle = bundle.getString("defaultSubject");

  newTitle += GetCharsetUIString();
  document.title = bundle.getString("windowTitlePrefix") + " " + newTitle;
}

最終行のdocument.titleで、ウインドウタイトルを変更していることがわかる。

実際に、キーワード変更時のウインドウタイトルの挙動に注目してみると、確かに変わっていた。

また、SetComposeWindowTitle()をコメントアウトして、キーワードを変更した場合、ウインドウタイトルに変化はなかった。

つまり、SetComposeWindowTitle()は、ウインドウタイトルに件名を反映させるための関数であることが推測できる。

感想

プロトタイプは、まだよくわかってないけど・・・とりあえず、こんなんでいいのかな?

あと関数とか、グローバル変数を知るためのリファレンスが欲しい・・・。

*1:後から考えると関数名でバレバレなんだけど^^;