ページ

2009年7月8日水曜日

ホットキー変更対応(22) - ふたたびキー表示

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

ホットキー登録ができるようになったので今度は登録キーの表示を行う。以前の検証を思い出しつつ Hotkeyクラスを拡張して表示ロジックを組み込む。動作確認の為、前回のサンプルにキーを表示させてみよう。

まずキーの文字表現から。以前の設計では HotkeyCharConverter なんて大げさな名前のクラスを用意するつもりだったが、ホットキー用のモデルクラス Hotkey を用意することになったので、ここに文字表現の責務を持たせることにする。

Hotkey を次のように拡張する。

Hotkey.h

@class HotkeyRegister;
@interface Hotkey : NSObject {
:
}

- (NSString*)string;
- (BOOL)isHotkey;

@end


- [Hotkey string] で修飾キーを含めた文字表現を取得できる。
例えば Command+Option+P なら @"⌥⌘P" を返す。


実装はこんな感じ。まずマッピング用の構造体配列を定義する。
Hotkey.m
static const struct {
UInt32 keycode;
NSString* description;
NSString* string;
BOOL is_hotkey;
}
keymap[] = {
{ kVK_ANSI_A, @"A" , @"A" , YES },
{ kVK_ANSI_S, @"S" , @"S" , YES },
:


続いて追加メソッドの実装。
- (NSString*)string
{
NSString* key_desc = @"";

if (self.modifier & controlKey) {
key_desc = [key_desc stringByAppendingFormat:@"%C", kControlUnicode];
}
if (self.modifier & optionKey) {
key_desc = [key_desc stringByAppendingFormat:@"%C", kOptionUnicode];
}
if (self.modifier & cmdKey) {
key_desc = [key_desc stringByAppendingFormat:@"%C", kCommandUnicode];
}
if (self.modifier & shiftKey) {
key_desc = [key_desc stringByAppendingFormat:@"%C", kShiftUnicode];
}
key_desc = [key_desc stringByAppendingFormat:@"%@", _keymap[[self indexOfKeymap]].string];

return key_desc;
}


- (BOOL)isHotkey
{
return _keymap[[self indexOfKeymap]].is_hotkey;
}


それとキーマップのインデックスを取得するメソッドを用意。
- (UInt32)indexOfKeymap
{
UInt32 index;
UInt32 max = sizeof(_keymap)/sizeof(_keymap[0]);
for (index=0; index < max; index++) {
if (_keymap[index].keycode == self.code) {
break;
}
}
if (index == max) {
index = 0; // DUMMY
}
return index;
}



さて実行してみよう。今回は押したキーの文字表現をデバッガコンソールへ表示するようにしてみた。
@implementation AppController

- (void)keyDown:(Hotkey*)hotkey
{
NSLog(@"keyDown: keycode=%x [%@]", hotkey.code, [hotkey string]);
}
:



結果はこう。


おお出た。


サンプル:HotKey-2.zip