NSViewへのテキスト入力を実装してみた

NSViewにNSTextInputを実装してみた。

ことえりでしかテストしてないけど、一応日本語も可能。ATOK欲しいけど余裕無し。

実装したもの、してないもの:

  • 変換リストの表示位置の制御はできてない。やり方がわからない。
  • テキストの矢印キーでの前後の移動は実装した。上下は実装してない。
  • deleteBackward/Forwardは実装した。
  • 選択範囲の変更は未実装。
  • いくつかのNSTextInputのメソッドが未実装。

まぁ、未実装なモノのほとんどが今回の件には不要だから、気にしない。 ことえちの変換リストの表示位置だけは必須かな。

あとあとのために、実装する際のメモ:

  • selectedRangeは、基本的にはキャレットの表示位置。ただしlengthが0でない場合には、キャレットの描画は不要。
  • markedRangeは、日本語入力中にはその範囲を表す。それ以外の時(hasMarkedText == NO)には不要なので、selectedRangeの結果を返すようにしている。
  • setMarkedText:(id)aString selectedRange:(NSRange)selRangeについて
    • aStringはIMへの入力によって更新された、未確定文字列。
    • selRangeは、aString内における選択範囲。
  • insertText: (id)aString が呼び出されるのは、未確定文字列などが確定されたときや半角英数字を入力したときなど。この内部では、再び確定した文字列でmarkedRange内を置き換えたり、unmarkTextを呼び出す必要アリ。

読んだら分かるように、キモとなるのはinsertText:とsetMarkedText:selectedRange:によるselectedRangeとmarkedRangeの取り扱い。半角英数字のみならmarkedRangeは不要なのかもしれないけど、日本語入力を可能にするためには必須。

ちなみに、このアーカイブに含まれる内容は、煮るなり焼くなり本当に好きにしてもらって構わない(NYSLの文章を添付すべきだったかな)。ってか、むしろより良いモノを作って公開してもらいたい。これは希望

参考にしたのは、Java-Cocoaだけど、みるくCocoaの文字列入力。これだけだと半角英数字しか使えないけど、とっかかりには十分。 あとは、マニュアルと、あとなんだろう?とにかく情報が少なかった気がする。

あとは、まぁ、追々。

そういやCaminoも参考にしたなぁ。nsChildView.mmにNSTextInputが実装されてたから。まぁC++で実装された関数を使ってばかりだし、流れぐらいしかわからなかったけど。今はBug 4586を参考に、候補ウィンドウ(変換パレットだったり、入力リストだったり)の表示位置制御にとりかかってる。