InputMethodKit超⼊門
                 Cocoa勉強会�#39�/�2010.02.11�(祝)�/�⽊村渡




Powered by Rabbit 0.6.4 and COZMIXNG
Input�Method
✓ 効率の良い⼊⼒
✓ さまざまなアプリケーションとコ
  ミュニケート
InputMethodKitは、
後者を⽀援するフレームワーク
InputMethodKit
✓ かな漢字変換などの⼊⼒プログラム
  をつくるためのフレームワーク
✓ アプリとして⼊⼒プログラムを作成
✓ Cocoa
✓ Leopardで導⼊された
さまざまな⽇本語⼊⼒プログラム
✓ ことえり
✓ かわせみ
✓ AquaSKK
✓ Google⽇本語⼊⼒
        などなど
InputMethodKitの構成
 +----------+    +------------------------+
 |=user app=|    | =input method app=     |
 | Client <------->(Server)<-> Controller |
 +----------+    +------------------------+
IMK�Classes
IMKServer
   ユーザ操作と⼊⼒操作を仲介
IMKInputController
   ⼊⼒プログラムの処理本体
IMKCandidates
   選択候補のユーザインターフェイスを制御
IMK�Protocols
IMKServerInput
   ⼊⼒プログラムのインターフェイス
IMKTextInput
   ⼊⼒プログラムとやりとりするアプリのイ
   ンターフェイス
IMKStateSetting
IMKMouseHandling
3つの実装手段
IMKServerInputプロトコル
✓ キーバインディング
✓ ⼊⼒⽂字+修飾キーを解釈
✓ TSMのイベントを利用
キーバインディング
inputText:client:
    ⼊⼒された⽂字を受け取る
didCommandBySelector:client:
    キーバインディングで定義されたコマンド
    を受け取る
"apple"が⼊⼒された
"moveForward:"コマンドが指⽰され
た
キーバインディング
キー(の組み合わせ)をObjective-C
メッセージに割り当て
StandardKeyBinding.dictを参照

 <key>^f</key>
 <string>moveForward:</string>
⼊⼒⽂字+修飾キーを解釈
inputText:key:modifiers:client:
   ⼊⼒された⽂字と修飾キーを受け取る
"apple"が⼊⼒された
"f"とCtrlキーが⼊⼒された
TSMのイベントを利用
handleEvent:client:
よくわからん。
たぶん従来のコンポーネントからの移
⾏しやすいんじゃないかな。
3つの実装手段
IMKServerInputプロトコル
✓ キーバインディング
✓ ⼊⼒⽂字+修飾キーを解釈
✓ TSMのイベントを利用
上のふたつのどちらか
つくってみよう
偉大なるお手本
AppleのサンプルNumberInput
NumberInput作成の手順
1.�⼊⼒メニューに表⽰
2.�ユーザ操作から⼊⼒⽂字を決定
3.�複数の変換モード
4.�変換候補の表⽰
5.�環境設定のUI
今回のサンプル
単純のため次のように
✓ 英数字のみ扱う
✓ 英単語を候補から選択できる
✓ (できれば)⼊⼒中のテキストから候
  補を抽出する
実装手順
1.�最⼩限。⼊⼒プログラムとして選
   択できる
2.�試験的な変換⼊⼒
3.�目的の変換処理、変換候補の選択
最⼩限の実装
✓ Info.plistに記述
✓ main()でIMKServerを⽣成
✓ IMKServerControllerのサブクラス
Info.plist
LSBackgroundOnly
InputMethodConnectionName
InputMethodServerControllerClas
s
tsInputMethodIconFileKey
tsInputMethodCharacterRepertoir
eKey
Info.plist
LSBackgroundOnly
1に。アプリケーションをバックグラ
ウンドにします。
Info.plist
InputMethodConnectionName
アプリケーションと⼊⼒プログラムの
通信に利用する名前を指定します。こ
の名前はほかの⼊⼒プログラムと重複
しないように注意してください。
Info.plist
InputMethodServerControllerClas
s
⼊⼒サービスを提供するクラスを指定
このクラスはIMKServerControllerの
サブクラス
Info.plist
tsInputMethodIconFileKey
⼊⼒メニューに表⽰するアイコン(こ
とえりなら[あ])の画像ファイルを指
定
Info.plist
tsInputMethodCharacterRepertoir
eKey
⼊⼒するキャラクタセットをISO1592
で指定(複数可)
プログラム
✓ main.m
✓ IMKServerControllerのサブクラス
main.m
ここでIMKServerのインスタンスを⽣
成し、コネクションの名前などを指定
します。
IMKInputController
inputText:client:
この⼊⼒プログラムで⼊⼒テキストを
処理するならYESを、そうでなければ
NOを返します。
とりあえず常にNOにしておきます。
動作確認�0
⼊⼒メニューに表⽰できる
✓ /Library/Input Methodsに
✓ ログオフ〜再ログオン
開発時はユーザースイッチを利用する
のがよいかも
試験的な変換⼊⼒を実装
 -(BOOL)inputText:(NSString*)string
            client:(id)sender
 {
   if ([string hasPrefix:@"o"]) {
       [sender insertText:@"Objective-C"
         replacementRange:NSMakeRange(0, 0)];
       return YES;
   } else {
       return NO;
動作確認�1
"o"を⼊⼒すると"Objective-C"が
他の⽂字はそのまま

 abc..lmnObjective-Cpq..xyz
変換候補の表示
cancdidates:
   候補の配列を返す
candidateSelected:
   候補が選択された
candidateSelectionChanged:
   選択候補が変更された
動作確認�2
✓ ⼊⼒中にスペースキーで変換候補を
  表⽰
✓ ⼊⼒中の⽂字が表⽰されない...
インライン⼊⼒
これは宿題っ
setMarkedText:selectionRange:re
placementRange:
終
質問などあれば
               どうぞ

Powered by Rabbit 0.6.4 and COZMIXNG

InputMethodKit超入門