[aquaskk-changes 316] CVS update: AquaSKK

Back to archive index

Tomotaka SUWA t-suw****@users*****
2007年 6月 14日 (木) 21:00:17 JST


Index: AquaSKK/AsciiConversionMode.cpp
diff -u AquaSKK/AsciiConversionMode.cpp:1.10 AquaSKK/AsciiConversionMode.cpp:1.11
--- AquaSKK/AsciiConversionMode.cpp:1.10	Sat Feb  3 13:04:21 2007
+++ AquaSKK/AsciiConversionMode.cpp	Thu Jun 14 21:00:16 2007
@@ -1,5 +1,5 @@
 /*
-  $Id: AsciiConversionMode.cpp,v 1.10 2007/02/03 04:04:21 t-suwa Exp $
+  $Id: AsciiConversionMode.cpp,v 1.11 2007/06/14 12:00:16 t-suwa Exp $
 
   MacOS X implementation of the SKK input method.
 
@@ -33,7 +33,8 @@
 
 AsciiConversionMode::AsciiConversionMode(ParentInputMode& src)
     :ChildInputMode(src),
-     word_register_mode(NULL),
+     word_register_mode(0),
+     old_word_register_mode(0),
      status(STATUS_NULL),
      show_cands_window_after_Nth_cand(5),
      completion_mode(false),
@@ -42,9 +43,8 @@
 }
 
 AsciiConversionMode::~AsciiConversionMode() {
-    if(word_register_mode) {
-	delete word_register_mode;
-    }
+    delete word_register_mode;
+    delete old_word_register_mode;
 }
 
 void AsciiConversionMode::start() {
@@ -61,12 +61,12 @@
 bool AsciiConversionMode::handleInputChar(SKKChar skkchar) {
     if(word_register_mode) {
 	word_register_mode->handleInput(skkchar);
-	return false; // WordRegisterMode::handleInput()‚ª‰½‚ð•Ô‚»‚¤‚Æ‚àŠm’è‚Í‚µ‚È‚¢B
+	return false; // WordRegisterMode::handleInput()が何を返そうとも確定はしない。
     }
 
     if(SKKConfig::AbbrevNextKey() == skkchar) {
 	if(status == STATUS_WHITE && completion_mode) {
-	    // ŽŸ‚ÌŒó•â‚ցBÅŒã‚܂ōs‚Á‚½‚çÅ‰‚É–ß‚éB
+	    // 次の候補へ。最後まで行ったら最初に戻る。
 	    current_completion_index++;
 	    if (current_completion_index >= completions.size()) {
 		current_completion_index = 0;
@@ -78,7 +78,7 @@
 
     if(SKKConfig::AbbrevPrevKey() == skkchar) {
 	if(status == STATUS_WHITE && completion_mode) {
-	    // ‘O‚ÌŒó•â‚ցBÅ‰‚܂ōs‚Á‚½‚çÅŒã‚É–ß‚éB
+	    // 前の候補へ。最初まで行ったら最後に戻る。
 	    if(current_completion_index == 0) {
 		current_completion_index = completions.size() - 1;
 	    } else {
@@ -89,14 +89,14 @@
 	}
     }
 
-    // tab,ƒsƒŠƒIƒh,ƒJƒ“ƒ}ˆÈŠO‚Ì‚¢‚©‚Ȃ镶Žš‚ª“ü—Í‚³‚ê‚Ä‚à•âŠ®ƒ‚[ƒh‚𔲂¯‚éB
+    // tab,ピリオド,カンマ以外のいかなる文字が入力されても補完モードを抜ける。
     completion_mode = false;
 
     if(SKKConfig::ToggleKanaKey() == skkchar) {
 	if(status == STATUS_BLACK || status == STATUS_BLACK_WITH_WINDOW) {
-	    // Œ»Ý‚ÌŒó•â‚ðŠm’èB
-	    // 1) •½‰¼–¼ƒ‚[ƒh‚È‚ç‘SŠp•Ð‰¼–¼ƒ‚[ƒh‚Ö
-	    // 2) ‚»‚êˆÈŠO‚Ȃ畽‰¼–¼ƒ‚[ƒh‚Ö
+	    // 現在の候補を確定。
+	    // 1) 平仮名モードなら全角片仮名モードへ
+	    // 2) それ以外なら平仮名モードへ
 	    parent->setEnabledKanjiMode(false);
 	    if(parent->isHiraganaInputMode()) {
 		parent->goZenKataInputMode();
@@ -109,7 +109,7 @@
 
     if(SKKConfig::PrevKouhoKey() == skkchar) {
 	if(status == STATUS_BLACK) {
-	    // ˆê‚‘O‚ÌŒó•â‚ցBÅ‰‚ÌŒó•â‚¾‚Á‚½‚灤ƒ‚[ƒh‚Ö–ß‚éB
+	    // 一つ前の候補へ。最初の候補だったら▽モードへ戻る。
 	    if(current_candidate_index > 0) {
 		current_candidate_index--;
 	    } else {
@@ -118,17 +118,17 @@
 	    return false;
 	}
 	else if(status == STATUS_BLACK_WITH_WINDOW) {
-	    // delete‚ª‰Ÿ‚³‚ꂽ‚à‚Ì‚ÆŒ©˜ô‚·
+	    // deleteが押されたものと見做す
 	    handleBackSpace();
 	    return false;
 	}
-	// ‚»‚êˆÈŠO‚È‚ç‘f’Ê‚è
+	// それ以外なら素通り
     }
 
     if(SKKConfig::PurgeFromJisyoKey() == skkchar) {
 	if(status == STATUS_BLACK) {
-	    // íœƒvƒƒ“ƒvƒg‚ðo‚·B‚±‚Ì•ÏŠ·‚ªŽÀ‚̓†[ƒU[Ž«‘‚ɍڂÁ‚Ä‚¢‚È‚©‚Á‚½‚Æ‚µ‚Ä‚à
-	    // –Ê“|‚È‚Ì‚Å‚»‚ÌŽ–‚ð‚í‚´‚í‚´Šm”F‚µ‚È‚¢B—v–]‚Å‚à‚ ‚ê‚Εʂ¾‚ªB
+	    // 削除プロンプトを出す。この変換が実はユーザー辞書に載っていなかったとしても
+	    // 面倒なのでその事をわざわざ確認しない。要望でもあれば別だが。
 	    status = STATUS_PROMPT;
 	    prompt_type = PROMPT_DELETE_FROM_USER_DIC;
 	    prompt_input.clear();
@@ -144,7 +144,7 @@
 
     if(SKKConfig::ToggleKatakanaKey() == skkchar) {
 	if(status == STATUS_WHITE) {
-	    // ”¼Šp‰p”Žš‚ð‘SŠp‰p”Žš‚É•ÏŠ·‚µ‚Ä‚©‚çŠm’肵‚ďI—¹
+	    // 半角英数字を全角英数字に変換してから確定して終了
 	    parent->fix(ZenAscInputMode::convert(index));
 
 	    parent->setEnabledAsciiConversionMode(false);
@@ -153,9 +153,9 @@
 	    return false;
 	}
 	if(status == STATUS_BLACK || status == STATUS_BLACK_WITH_WINDOW) {
-	    // Œ»Ý‚ÌŒó•â‚ðŠm’肵‚Ä‚©‚çA
-	    // 1) ”¼Šp•Ð‰¼–¼ƒ‚[ƒh‚Ȃ畽‰¼–¼ƒ‚[ƒh‚Ö
-	    // 2) ‚»‚êˆÈŠO‚Ȃ甼Šp•Ð‰¼–¼‰¼–¼ƒ‚[ƒh‚Ö
+	    // 現在の候補を確定してから、
+	    // 1) 半角片仮名モードなら平仮名モードへ
+	    // 2) それ以外なら半角片仮名仮名モードへ
 	    parent->setEnabledAsciiConversionMode(false);
 	    if (parent->isHanKataInputMode()) {
 		parent->goHiraganaInputMode();
@@ -167,12 +167,12 @@
     }
 
     if(SKKConfig::KakuteiKey() == skkchar) {
-	return true; // Šm’è‚Ì‚Ý
+	return true; // 確定のみ
     }
 
     if(SKKConfig::LatinModeKey() == skkchar || SKKConfig::Jisx0208LatinModeKey() == skkchar) {
 	if(status == STATUS_BLACK) {
-	    // ‚»‚ꂼ‚ê‚ðŠm’肵‚Ä”¼Šp/‘SŠp‰p”Žšƒ‚[ƒh‚ցB
+	    // それぞれを確定して半角/全角英数字モードへ。
 	    if(SKKConfig::LatinModeKey() == skkchar) {
 		parent->goHanAscInputMode();
 	    } else {
@@ -180,7 +180,7 @@
 	    }
 	    return true;
 	}
-	// ¤ƒ‚[ƒh‚âŒó•â‘I‘ð‰æ–Ê‚È‚ç‘f’Ê‚èB
+	// ▽モードや候補選択画面なら素通り。
     }
 
     if(SKKConfig::SetHenkanPointKey() == skkchar) {
@@ -201,67 +201,67 @@
     if(SKKConfig::NextKouhoKey() == skkchar) {
 	if(status == STATUS_WHITE) {
 	    if(index.length() == 0) {
-		// I—¹
+		// 終了
 		parent->setEnabledAsciiConversionMode(false);
 		parent->display(CppCFString());
 		initialize();
 		return false;
 	    }
 
-	    // ŽI‚É–â‚¢‡‚킹
+	    // 鯖に問い合わせ
 	    askServerTheCandidates();
 
 	    if(candidates.size() > 0) {
-		// Œó•â‚ª‘¶Ý‚µ‚½B¥ƒ‚[ƒh‚ցB
+		// 候補が存在した。▼モードへ。
 		status = STATUS_BLACK;
-		current_candidate_index = 0; // Å‰‚ÌŒó•âB
+		current_candidate_index = 0; // 最初の候補。
 	    } else {
-		// ˆê‚‚àŒó•â‚ª–³‚¢B’PŒê“o˜^ŠJŽnB
+		// 一つも候補が無い。単語登録開始。
 		startRegisteringWord();
 	    }
 	}
 	else if(status == STATUS_BLACK) {
-	    // ŽŸ‚ÌŒó•â‚Ö
+	    // 次の候補へ
 	    current_candidate_index++;
 
-	    if(current_candidate_index >= candidates.size()) { // I‚í‚è‚܂ōs‚Á‚½‚ç’PŒê“o˜^ŠJŽnB
+	    if(current_candidate_index >= candidates.size()) { // 終わりまで行ったら単語登録開始。
 		startRegisteringWord();
 	    }
 	    else if(current_candidate_index >= show_cands_window_after_Nth_cand - 1) {
-		// ‚±‚êˆÈ~‚̃[ƒe[ƒVƒ‡ƒ“‚ÅŒó•â‘I‘ðƒEƒCƒ“ƒhƒE‚ð•\Ž¦‚·‚éB
+		// これ以降のローテーションで候補選択ウインドウを表示する。
 		status = STATUS_BLACK_WITH_WINDOW;
 		openCandidatesWindow();
 	    }
 	}
 	else if(status == STATUS_BLACK_WITH_WINDOW) {
 	    if(candidates_window_current_frame < candidates_window_num_of_frames - 1) {
-		// ÅŒã‚̃tƒŒ[ƒ€‚Å‚È‚¯‚ê‚΁AŽŸ‚̃tƒŒ[ƒ€‚֍s‚­B
+		// 最後のフレームでなければ、次のフレームへ行く。
 		goToNextCandidatesFrame();
 	    } else {
-		// ÅŒã‚̃tƒŒ[ƒ€‚¾‚Á‚½‚çA’PŒê“o˜^‚ðŠJŽnB
+		// 最後のフレームだったら、単語登録を開始。
 		closeCandidatesWindow();
 		startRegisteringWord();
 	    }
 	}
     } else {
 	if(status == STATUS_WHITE) {
-	    // index‚É‚½‚¾’ljÁB
+	    // indexにただ追加。
 	    index += skkchar;
 	}
 	else if(status == STATUS_BLACK) {
-	    // Œ»Ý‚ÌŒó•â‚ðŠm’肵‚ďˆ—‚ðŒp‘±
+	    // 現在の候補を確定して処理を継続
 	    parent->fix(getStringToFix());
 	    return parent->handleInput(skkchar);
 	}
 	else if(status == STATUS_BLACK_WITH_WINDOW) {
-	    // asdfjkli1ƒtƒŒ[ƒ€“–‚½‚è‚ÌŒó•â”‚ª7‚æ‚菭‚È‚¯‚ê‚΂±‚ê‚àŒ¸‚éBj‚Ì•¶Žš‚Å‚ ‚ê‚Î
-	    // ‚»‚ÌŒó•â‚ð‚½‚¾Šm’è‚·‚éB
-	    // ‚»‚¤‚Å‚È‚¯‚ê‚ÎŒ»Ý‚ÌŒó•â‚ð‚½‚¾Šm’è‚·‚éB
+	    // asdfjkl(1フレーム当たりの候補数が7より少なければこれも減る。)の文字であれば
+	    // その候補をただ確定する。
+	    // そうでなければ現在の候補をただ確定する。
 	    int cand_index = CppCFString("asdfjkl").substring(0, candidates_window_cands_per_frame).indexOf(skkchar);
 	    if(cand_index != -1) {
 		unsigned new_index = current_candidate_index + cand_index;
 		if(new_index < candidates.size()) {
-		    // ‚±‚̃Cƒ“ƒfƒBƒbƒNƒX‚ª‹–‚³‚ê‚é‚È‚çŠm’èB
+		    // このインディックスが許されるなら確定。
 		    current_candidate_index = new_index;
 		    return true;
 		}
@@ -269,7 +269,7 @@
 	    return false;
 	}
 	else if(status == STATUS_PROMPT) {
-	    // ‚»‚Ì‚Ü‚Üprompt_input‚ɒljÁB
+	    // そのままprompt_inputに追加。
 	    prompt_input += skkchar;
 	}
     }
@@ -284,7 +284,7 @@
 bool AsciiConversionMode::handleBackSpace() {
     if(word_register_mode) {
 	word_register_mode->handleBackSpace();
-	return true; // WordRegisterMode::handleBackSpace()‚ª‰½‚ð•Ô‚»‚¤‚Æ‚à–{•¶‚͏Á‚³‚È‚¢B
+	return true; // WordRegisterMode::handleBackSpace()が何を返そうとも本文は消さない。
     }
 
     if(status == STATUS_NULL) {
@@ -292,32 +292,32 @@
     }
 
     if(status == STATUS_WHITE) {
-	// index‚ª‹ó‚Ȃ珉Šú‰»‚µ‚ďI—¹
-	// ‹ó‚Å‚È‚¯‚ê‚Îindex‚̍Ōã‚Ì•¶Žš‚ðÁ‚·B
+	// indexが空なら初期化して終了
+	// 空でなければindexの最後の文字を消す。
 	if(index.length() == 0) {
 	    parent->setEnabledAsciiConversionMode(false);
 	    parent->display(CppCFString());
 	    initialize();
 	} else {
-	    completion_mode = false; // •âŠ®ƒ‚[ƒh‚¾‚Á‚½ê‡‚͕⊮ƒ‚[ƒh‚𔲂¯‚éB
+	    completion_mode = false; // 補完モードだった場合は補完モードを抜ける。
 	    index.eraseLast(1);
 	}
     }
     else if(status == STATUS_BLACK) {
-	// Œ»Ý‚ÌŒó•â‚ðŠm’肵‚ĈꕶŽšíœ
+	// 現在の候補を確定して一文字削除
 	CppCFString str(getStringToFix());
 	str.eraseLast(1);
 	parent->fix(str);
 	parent->display(CppCFString());
     }
     else if(status == STATUS_BLACK_WITH_WINDOW) {
-	// Å‰‚̃tƒŒ[ƒ€‚È‚çA¥ƒ‚[ƒh‚Ö–ß‚é
-	// ‚»‚¤‚Å‚È‚¯‚ê‚ΑO‚̃tƒŒ[ƒ€‚ցB
+	// 最初のフレームなら、▼モードへ戻る
+	// そうでなければ前のフレームへ。
 	if(candidates_window_current_frame == 0) {
-	    // ƒEƒCƒ“ƒhƒE‚ðŠJ‚­‘O‚É–ß‚·
+	    // ウインドウを開く前に戻す
 	    current_candidate_index = show_cands_window_after_Nth_cand - 2;
 
-	    // ƒEƒCƒ“ƒhƒE‚ð•Â‚¶‚éB
+	    // ウインドウを閉じる。
 	    closeCandidatesWindow();
 
 	    status = STATUS_BLACK;
@@ -326,7 +326,7 @@
 	}
     }
     else if(status == STATUS_PROMPT) {
-	// prompt_input‚ª‹ó‚Å‚È‚¯‚ê‚΍Ōã‚Ì•¶Žš‚ðÁ‚·B
+	// prompt_inputが空でなければ最後の文字を消す。
 	if(prompt_input.length() > 0) {
 	    prompt_input.eraseLast(1);
 	}
@@ -339,23 +339,23 @@
 	word_register_mode->handleReturn();
 
 	if(word_register_mode) {
-	    // handleReturn‚©‚çwordRegistrationFinished‚ªŒÄ‚΂ꂽ‚çword_register_mode‚Í”jŠü‚³‚ê‚邽‚߁B
+	    // handleReturnからwordRegistrationFinishedが呼ばれたらword_register_modeは破棄されるため。
 	    word_register_mode->redisplay();
 	}
 
-	return true; // í‚Étrue‚ð•Ô‚·B
+	return true; // 常にtrueを返す。
     }
 
     if(status == STATUS_PROMPT) {
 	switch(prompt_type) {
 	case PROMPT_DELETE_FROM_USER_DIC: {
-	    // prompt_input‚ªyes‚È‚çíœ‚µ‚ÄSTATUS_WHITE‚É–ß‚éB
-	    // ‚»‚êˆÈŠO‚È‚çSTATUS_BLACK‚É–ß‚éB
+	    // prompt_inputがyesなら削除してSTATUS_WHITEに戻る。
+	    // それ以外ならSTATUS_BLACKに戻る。
 	    if(prompt_input == "yes") {
-		// íœ
+		// 削除
 		makeServerRemoveWord();
 
-		// STATUS_WHITE‚Ö
+		// STATUS_WHITEへ
 		status = STATUS_WHITE;
 	    } else {
 		status = STATUS_BLACK;
@@ -370,8 +370,8 @@
     }
 
     if(ClientConfiguration::theInstance().isSkkEggLikeNewline()) {
-	// skk-egglike-newlineƒ‚[ƒh‚È‚çAŽ©—Í‚ÅŠm’肳‚¹‚Ä‚©‚珉Šú‰»‚µ‚Ätrue‚ð•Ô‚·B
-	// ŽI‚É‘—M
+	// skk-egglike-newlineモードなら、自力で確定させてから初期化してtrueを返す。
+	// 鯖に送信
 	parent->fix(getStringToFix());
 	return true;
     } else {
@@ -381,15 +381,15 @@
 
 bool AsciiConversionMode::handleArrow(SKKChar skkchar) {
     if(word_register_mode) {
-	return word_register_mode->handleArrow(skkchar); // ˆÏ÷
+	return word_register_mode->handleArrow(skkchar); // 委譲
     }
     
     if(status == STATUS_BLACK || status == STATUS_BLACK_WITH_WINDOW) {
-	// Œ»Ý‚ÌŒó•â‚ðŠm’è‚·‚é
+	// 現在の候補を確定する
 	parent->fix(getStringToFix());
     }
     
-    // ƒAƒXƒL[•ÏŠ·ƒ‚[ƒh‚ðI—¹‚·‚éB
+    // アスキー変換モードを終了する。
     parent->setEnabledAsciiConversionMode(false);
     initialize();
     return false;
@@ -400,18 +400,18 @@
 	return word_register_mode->handleCg();
     }
     
-    // •½‰¼–¼ƒCƒ“ƒvƒbƒgƒ‚[ƒh‚ÌhandleCg‚ðŒÄ‚сAgetStringToFix()‚àŒÄ‚Ô‚ªAŒÄ‚Ô‚¾‚¯B
+    // 平仮名インプットモードのhandleCgを呼び、getStringToFix()も呼ぶが、呼ぶだけ。
     parent->getCurrentInputMode().handleCg();
     parent->getCurrentInputMode().getStringToFix();
     
     if(status == STATUS_WHITE) {
-	// ƒAƒXƒL[•ÏŠ·ƒ‚[ƒhI—¹
+	// アスキー変換モード終了
 	parent->setEnabledAsciiConversionMode(false);
 	initialize();
     }
     else if(status == STATUS_BLACK || status == STATUS_BLACK_WITH_WINDOW) {
-	// okuri‚ª‹ó‚È‚çSTATUS_WHITE_ROOT‚ցB‚»‚¤‚Å‚È‚¯‚ê‚ÎSTATUS_WHITE_OKURI‚ցB
-	// ƒEƒCƒ“ƒhƒE‚ªŠJ‚©‚ê‚Ä‚¢‚½‚ç•Â‚¶‚éB
+	// okuriが空ならSTATUS_WHITE_ROOTへ。そうでなければSTATUS_WHITE_OKURIへ。
+	// ウインドウが開かれていたら閉じる。
 	if(status == STATUS_BLACK_WITH_WINDOW) {
 	    closeCandidatesWindow();
 	}
@@ -436,17 +436,17 @@
     
     if(status == STATUS_WHITE) {
 	if(completion_mode) {
-	    // ŽŸ‚ÌŒó•â‚ցBÅŒã‚܂ōs‚Á‚½‚çÅ‰‚É–ß‚éB
+	    // 次の候補へ。最後まで行ったら最初に戻る。
 	    current_completion_index++;
 	    if(current_completion_index >= completions.size()) {
 		current_completion_index = 0;
 	    }
 	    index = completions[current_completion_index];
 	} else {
-	    // ŽI‚É–â‚¢‡‚킹‚éB
+	    // 鯖に問い合わせる。
 	    askServerTheCompletions();
 
-	    // •âŠ®‚ÌŒó•â‚ª‚ ‚ê‚Ε⊮ŠJŽnB–³‚¯‚ê‚Ή½‚à‚¹‚¸‚É–ß‚éB
+	    // 補完の候補があれば補完開始。無ければ何もせずに戻る。
 	    if(completions.size() > 0) {
 		completion_mode = true;
 		index = completions[0];
@@ -461,72 +461,78 @@
 void AsciiConversionMode::terminate() {
     if(word_register_mode) {
 	word_register_mode->terminate();
+	resetRegistrationMode();
     }
 
-    parent->fix(getStringToFix()); // Šm’è‚·‚é
+    parent->fix(getStringToFix()); // 確定する
     parent->setEnabledAsciiConversionMode(false);
     initialize();
 }
 
+// 直前の単語登録モードを削除し、現在の単語登録モードを退避する
+void AsciiConversionMode::resetRegistrationMode() {
+    delete old_word_register_mode;
+    old_word_register_mode = word_register_mode;
+    word_register_mode = 0;
+}
+
 void AsciiConversionMode::wordRegistrationFinished() {
     if(word_register_mode) {
 	CppCFString content = word_register_mode->getContent();
 	if(content.length() > 0) {
-	    // ŽI‚É‘—M
+	    // 鯖に送信
 	    sendWordToServerToRegister(index,content);
 
-	    // Šm’è
+	    // 確定
 	    parent->fix(content);
 
-	    // I—¹
+	    // 終了
 	    parent->setEnabledAsciiConversionMode(false);
 	    initialize();
 	} else {
 	    status = STATUS_WHITE;
 	}
 
-	delete word_register_mode;
-	word_register_mode = NULL;
+	resetRegistrationMode();
 	parent->updatePencilMenuIcon();
     }
 }
 
 void AsciiConversionMode::wordRegistrationCanceled() {
-    delete word_register_mode;
-    word_register_mode = NULL;
+    resetRegistrationMode();
     parent->updatePencilMenuIcon();
     
     if(status == STATUS_WHITE) {
 	// do nothing
     }
     else if(status == STATUS_BLACK) {
-	current_candidate_index = candidates.size() - 1; // ÅŒã‚ÌŒó•â‚ցB
+	current_candidate_index = candidates.size() - 1; // 最後の候補へ。
     }
     else if(status == STATUS_BLACK_WITH_WINDOW) {
-	// ƒEƒCƒ“ƒhƒE‚ðŠJ‚¢‚čŌã‚̃tƒŒ[ƒ€‚ðo‚·
-	current_candidate_index = show_cands_window_after_Nth_cand - 1; // goToNextCandidatesFrame()‚Å‚¸‚ê‚éB
+	// ウインドウを開いて最後のフレームを出す
+	current_candidate_index = show_cands_window_after_Nth_cand - 1; // goToNextCandidatesFrame()でずれる。
 	openCandidatesWindow(OpenReverse);
     }
 }
 
 CppCFString AsciiConversionMode::getStringToDisplay() {
     if(word_register_mode) {
-	// –³Ž‹‚³‚¹‚éB‚³‚à‚È‚¢‚Ɛ܊pWordRegisterMode‚ªÝ’肵‚½•¶Žš‚ð’ׂµ‚Ä‚µ‚Ü‚¤B
+	// 無視させる。さもないと折角WordRegisterModeが設定した文字を潰してしまう。
 	return CppCFString().append(kIgnoreThis);
     }
     
     if(status == STATUS_WHITE) {
-	// ¤index
+	// â–½index
 	return CppCFString().append(0x25bd).append(index);
     }
     else if(status == STATUS_BLACK || status == STATUS_BLACK_WITH_WINDOW) {
 	CppCFString str(convertNumeric(numconv_, candidates[current_candidate_index]));
 
-	// ¥Œ»Ý‚ÌŒó•â
+	// ▼現在の候補
 	return CppCFString().append(0x25bc).append(str);
     }
     else if(status == STATUS_PROMPT) {
-	// [ƒvƒƒ“ƒvƒg][“ü—Í]
+	// [プロンプト][入力]
 	return CppCFString('[').append(prompt).append("][").append(prompt_input).append(kCaret).append(']');
     } else {
 	return CppCFString().append(kIgnoreThis);
@@ -541,24 +547,24 @@
     else if(status == STATUS_BLACK) {
 	result = convertNumeric(numconv_, candidates[current_candidate_index]);
 
-	// ŽI‚É‘—M
+	// 鯖に送信
 	sendCurrentCandidateToServerToRegister();
     }
     else if(status == STATUS_BLACK_WITH_WINDOW) {
 	result = convertNumeric(numconv_, candidates[current_candidate_index]);
 
-	// ŽI‚É‘—M
+	// 鯖に送信
 	sendCurrentCandidateToServerToRegister();
 
-	// ƒEƒCƒ“ƒhƒE‚ð•Â‚¶‚éB
+	// ウインドウを閉じる。
 	closeCandidatesWindow();
     }
     else /* if (status == STATUS_NULL) */ {
 	result = CppCFString().append(kIgnoreThis);
     }
     
-    // ‚±‚ꂪŒÄ‚΂ꂽ‚Æ‚¢‚¤‚±‚Æ‚Ífix‚³‚ê‚é‚Æ‚¢‚¤‚±‚ƂȂ̂ŃAƒXƒL[•ÏŠ·ƒ‚[ƒhI—¹B
-    // ‰Šú‰»‚·‚éB
+    // これが呼ばれたということはfixされるということなのでアスキー変換モード終了。
+    // 初期化する。
     parent->setEnabledAsciiConversionMode(false);
     initialize();
     
@@ -580,14 +586,14 @@
 
     str.append(index);
 
-    // ahya@¨@-ahya
+    // ahya → -ahya
     CppCFData query;
     query.own(str.toCFData());
 
     current_candidate_index = 0;
     ::askServerTheCandidates(query, candidates);
 
-    // ”’l•ÏŠ·‚ª—LŒø‚©H
+    // 数値変換が有効か?
     if(ClientConfiguration::theInstance().useNumericConversion() &&
        numconv_.Setup(index.toStdString(kCFStringEncodingUTF8))) {
 	CppCFString normalized(numconv_.NormalizedKey().c_str(), kCFStringEncodingUTF8);
@@ -603,7 +609,7 @@
 }
 
 void AsciiConversionMode::askServerTheCompletions() {
-    // ŽI‚ɐq‚Ë‚é
+    // 鯖に尋ねる
     CppCFData cfdata_query;
     cfdata_query.own(index.toCFData());
 
@@ -612,16 +618,16 @@
 }
 
 void AsciiConversionMode::sendCurrentCandidateToServerToRegister() {
-    // ŽI‚É‘—M
+    // 鯖に送信
     sendWordToServerToRegister(index,candidates[current_candidate_index]);
 }
 
 void AsciiConversionMode::makeServerRemoveWord() {
     CppCFString query;
-    // ahya i߁Í߁j@¨@-ahya i߁Í߁j
+    // ahya (゚∀゚) → -ahya (゚∀゚)
     query.append('-').append(index).append(SKK_MSG_DELIMITER).append(candidates[current_candidate_index]);
     
-    // ŽI‚É“n‚·
+    // 鯖に渡す
     CppCFData cfdata_query;
     cfdata_query.own(query.toCFData());
     ::makeServerRemoveWord(cfdata_query);
@@ -645,35 +651,35 @@
 }
 
 void AsciiConversionMode::goToNextCandidatesFrame() {
-    // ƒEƒCƒ“ƒhƒEID(UInt16)‚ðŠÜ‚ÞCFData‚ðì¬‚µAŽI‚Ö‘—‚éB
+    // ウインドウID(UInt16)を含むCFDataを作成し、鯖へ送る。
     CppCFData reply(ServerConnectionFactory::theInstance().newConnection().
 		    send(kSKKCandidatesWindowNext, newCFDataRefWithWindowID(candidates_window_id),
 			 kAquaSKKServerRunLoopMode));
 
-    // Œ»Ý‚̃tƒŒ[ƒ€”ԍ†‚ðƒCƒ“ƒNƒŠƒƒ“ƒg
+    // 現在のフレーム番号をインクリメント
     ++ candidates_window_current_frame;
 
-    // Œ»Ý‚ÌŒó•â”ԍ†‚ðƒtƒŒ[ƒ€“–‚½‚è‚ÌŒó•â”•ª‘‚â‚·B
+    // 現在の候補番号をフレーム当たりの候補数分増やす。
     current_candidate_index += candidates_window_cands_per_frame;
     candidates_window_cands_per_frame = CFSwapInt16BigToHost(reply.getUInt16(0));
 }
 
 void AsciiConversionMode::goToPrevCandidatesFrame() {
-    // ƒEƒCƒ“ƒhƒEID(UInt16)‚ðŠÜ‚ÞCFData‚ðì¬‚µAŽI‚Ö‘—‚éB
+    // ウインドウID(UInt16)を含むCFDataを作成し、鯖へ送る。
     CppCFData reply(ServerConnectionFactory::theInstance().newConnection().
 		    send(kSKKCandidatesWindowPrev, newCFDataRefWithWindowID(candidates_window_id),
 			 kAquaSKKServerRunLoopMode));
 
-    // Œ»Ý‚̃tƒŒ[ƒ€”ԍ†‚ðƒfƒNƒŠƒƒ“ƒg
+    // 現在のフレーム番号をデクリメント
     -- candidates_window_current_frame;
 
-    // Œ»Ý‚ÌŒó•â”ԍ†‚ðƒtƒŒ[ƒ€“–‚½‚è‚ÌŒó•â”•ªŒ¸‚ç‚·B
+    // 現在の候補番号をフレーム当たりの候補数分減らす。
     candidates_window_cands_per_frame = CFSwapInt16BigToHost(reply.getUInt16(0));
     current_candidate_index -= candidates_window_cands_per_frame;
 }
 
 void AsciiConversionMode::closeCandidatesWindow() {
-    // ƒEƒCƒ“ƒhƒEID(UInt16)‚ðŠÜ‚ÞCFData‚ðì¬‚µAŽI‚Ö‘—‚éB
+    // ウインドウID(UInt16)を含むCFDataを作成し、鯖へ送る。
     ServerConnectionFactory::theInstance().newConnection().
 	send(kSKKCloseCandidatesWindow, newCFDataRefWithWindowID(candidates_window_id));
 }
Index: AquaSKK/AsciiConversionMode.h
diff -u AquaSKK/AsciiConversionMode.h:1.5 AquaSKK/AsciiConversionMode.h:1.6
--- AquaSKK/AsciiConversionMode.h:1.5	Sat Jun  3 10:23:18 2006
+++ AquaSKK/AsciiConversionMode.h	Thu Jun 14 21:00:16 2007
@@ -1,5 +1,5 @@
 /*
-  $Id: AsciiConversionMode.h,v 1.5 2006/06/03 01:23:18 t-suwa Exp $
+  $Id: AsciiConversionMode.h,v 1.6 2007/06/14 12:00:16 t-suwa Exp $
 
   MacOS X implementation of the SKK input method.
 
@@ -38,35 +38,36 @@
     NumericConverter numconv_;
 
 protected:
-    static const int STATUS_NULL = 0; // ƒAƒXƒL[•ÏŠ·ƒ‚[ƒh‚É‚È‚Á‚Ä‚¢‚È‚¢ó‘ԁBæ“ª‚Ɂ¤‚à¥‚à–³‚¢B
-    static const int STATUS_WHITE = 1; // ¤ƒ‚[ƒh
-    static const int STATUS_BLACK = 2; // ¥ƒ‚[ƒh
-    static const int STATUS_BLACK_WITH_WINDOW = 3; // ¥ƒ‚[ƒh‚ŁAŒó•â‘I‘ðƒEƒCƒ“ƒhƒE‚ªŠJ‚¢‚Ä‚¢‚éB
-    static const int STATUS_PROMPT = 4; // ƒvƒƒ“ƒvƒg‚ðo‚µ‚Ä‚¢‚éB
+    static const int STATUS_NULL = 0; // アスキー変換モードになっていない状態。先頭に▽も▼も無い。
+    static const int STATUS_WHITE = 1; // ▽モード
+    static const int STATUS_BLACK = 2; // ▼モード
+    static const int STATUS_BLACK_WITH_WINDOW = 3; // ▼モードで、候補選択ウインドウが開いている。
+    static const int STATUS_PROMPT = 4; // プロンプトを出している。
 
-    WordRegisterMode* word_register_mode; // NULL‚Å‚È‚¢Žž‚Í’PŒê“o˜^ƒ‚[ƒh‚ª‹N“®’†B
+    WordRegisterMode* word_register_mode; // NULLでない時は単語登録モードが起動中。
+    WordRegisterMode* old_word_register_mode; // 直前まで有効だった単語登録モード
 
     int status;
-    CppCFString index; // Œ©o‚µŒê
+    CppCFString index; // 見出し語
 
-    static const int PROMPT_DELETE_FROM_USER_DIC = 1; // ƒ†[ƒU[Ž«‘‚©‚ç’PŒê‚ðíœ
-    int prompt_type; // ƒvƒƒ“ƒvƒg‚ÌŽí—ށB
-    CppCFString prompt; // ƒvƒƒ“ƒvƒg
-    CppCFString prompt_input; // ƒvƒƒ“ƒvƒg‚Ƀ†[ƒU[‚ª“ü—Í‚µ‚½•¶Žš—ñ
-
-    std::vector<CppCFString> candidates; // ‘S‚Ä‚ÌŒó•â
-    unsigned current_candidate_index; // Œ»Ý‚ÌŒó•â”ԍ†
-
-    unsigned show_cands_window_after_Nth_cand; // ‰½ŒÂ–ڈȍ~‚ÌŒó•â‚ðŒó•â‘I‘ðƒEƒCƒ“ƒhƒE‚É•\Ž¦‚·‚é‚©B
-
-    unsigned candidates_window_id; // status‚ªSTATUS_BLACK_WITH_WINDOW‚Ì‚Æ‚«AŒó•â‘I‘ðƒEƒCƒ“ƒhƒE‚ÌIDB
-    unsigned candidates_window_current_frame; // Œó•â‘I‘ðƒEƒCƒ“ƒhƒE‚ÌŒ»Ý‚̃tƒŒ[ƒ€
-    unsigned candidates_window_cands_per_frame; // Œó•â‘I‘ðƒEƒCƒ“ƒhƒE‚Ì1ƒtƒŒ[ƒ€“–‚½‚è‚ÌŒó•â”
-    unsigned candidates_window_num_of_frames; // Œó•â‘I‘ðƒEƒCƒ“ƒhƒE‚̃tƒŒ[ƒ€”
-
-    bool completion_mode; // Œ©o‚µŒê•âŠ®ƒ‚[ƒhB‚±‚̃‚[ƒh‚ł̓sƒŠƒIƒh‚ƃJƒ“ƒ}‚ª•âŠ®‚Ì‘€ì‚ÉŽg‚í‚ê‚éB
-    std::vector<CppCFString> completions; // •âŠ®‚ÌŒó•â
-    unsigned current_completion_index; // Œ»Ý‚̕⊮‚ÌŒó•â”ԍ†
+    static const int PROMPT_DELETE_FROM_USER_DIC = 1; // ユーザー辞書から単語を削除
+    int prompt_type; // プロンプトの種類。
+    CppCFString prompt; // プロンプト
+    CppCFString prompt_input; // プロンプトにユーザーが入力した文字列
+
+    std::vector<CppCFString> candidates; // 全ての候補
+    unsigned current_candidate_index; // 現在の候補番号
+
+    unsigned show_cands_window_after_Nth_cand; // 何個目以降の候補を候補選択ウインドウに表示するか。
+
+    unsigned candidates_window_id; // statusがSTATUS_BLACK_WITH_WINDOWのとき、候補選択ウインドウのID。
+    unsigned candidates_window_current_frame; // 候補選択ウインドウの現在のフレーム
+    unsigned candidates_window_cands_per_frame; // 候補選択ウインドウの1フレーム当たりの候補数
+    unsigned candidates_window_num_of_frames; // 候補選択ウインドウのフレーム数
+
+    bool completion_mode; // 見出し語補完モード。このモードではピリオドとカンマが補完の操作に使われる。
+    std::vector<CppCFString> completions; // 補完の候補
+    unsigned current_completion_index; // 現在の補完の候補番号
 
     bool henkanModeStatus;
 
@@ -80,12 +81,13 @@
     virtual void goToNextCandidatesFrame();
     virtual void closeCandidatesWindow();
     virtual void initialize();
+    virtual void resetRegistrationMode();
 	
 public:
     AsciiConversionMode(class ParentInputMode& parent);
     virtual ~AsciiConversionMode();
 
-    virtual void start(); // ‚±‚ꂪŒÄ‚΂ê‚é‚Ɓ¤ƒ‚[ƒh‚É‚È‚éB
+    virtual void start(); // これが呼ばれると▽モードになる。
     virtual bool handleInput(SKKChar skkchar);
     virtual bool handleBackSpace();
     virtual bool handleReturn();
@@ -97,8 +99,8 @@
     virtual CppCFString getStringToDisplay();
     virtual CppCFString getStringToFix();
 
-    virtual void wordRegistrationFinished(); // WordRegisterModeê—pB
-    virtual void wordRegistrationCanceled(); // WordRegisterModeê—pB
+    virtual void wordRegistrationFinished(); // WordRegisterMode専用。
+    virtual void wordRegistrationCanceled(); // WordRegisterMode専用。
 };
 
 #endif	// INC__AsciiConversionMode__
Index: AquaSKK/ChangeLog
diff -u AquaSKK/ChangeLog:1.41 AquaSKK/ChangeLog:1.42
--- AquaSKK/ChangeLog:1.41	Tue Jun 12 23:25:08 2007
+++ AquaSKK/ChangeLog	Thu Jun 14 21:00:16 2007
@@ -1,3 +1,12 @@
+2007-06-14  Tomotaka SUWA  <t.suw****@mac*****>
+
+	* *ConversionMode.*: 単語登録モードを安全に削除するように修正。
+
+	* KanjiConversionMode.*:
+	(1) 補完結果を現在の文字種別と合わせるように修正
+	(2) 単語登録時に見出し語が「ひらかな」に正規化されない不具合を修正
+	(3) 単語登録前の入力モードが復元されない不具合を修正
+
 2007-06-12  Tomotaka SUWA  <t.suw****@mac*****>
 
 	* ServerMessageReceiver.* (registerToggleEntry): トグル変換の結果を
Index: AquaSKK/KanjiConversionMode.cpp
diff -u AquaSKK/KanjiConversionMode.cpp:1.12 AquaSKK/KanjiConversionMode.cpp:1.13
--- AquaSKK/KanjiConversionMode.cpp:1.12	Tue Jun 12 23:25:08 2007
+++ AquaSKK/KanjiConversionMode.cpp	Thu Jun 14 21:00:16 2007
@@ -1,5 +1,5 @@
 /*
-  $Id: KanjiConversionMode.cpp,v 1.12 2007/06/12 14:25:08 t-suwa Exp $
+  $Id: KanjiConversionMode.cpp,v 1.13 2007/06/14 12:00:16 t-suwa Exp $
 
   MacOS X implementation of the SKK input method.
 
@@ -56,18 +56,19 @@
 
 KanjiConversionMode::KanjiConversionMode(ParentInputMode& src)
     :ChildInputMode(src),
-     word_register_mode(NULL),
+     word_register_mode(0),
+     old_word_register_mode(0),
      status(STATUS_NULL),
      show_cands_window_after_Nth_cand(5),
      completion_mode(false),
-     henkanModeStatus(false) {
-    
+     henkanModeStatus(false),
+     priorInputMode_(Hirakana) {
+    // empty
 }
 
 KanjiConversionMode::~KanjiConversionMode() {
-    if(word_register_mode) {
-	delete word_register_mode;
-    }
+    delete word_register_mode;
+    delete old_word_register_mode;
 }
 
 bool KanjiConversionMode::handleInput(SKKChar skkchar) {
@@ -477,15 +478,25 @@
 
 void KanjiConversionMode::startRegisteringWord() {
     CppCFString register_title;
-    if (okuri.length() > 0) {
+
+    if(okuri.length() > 0) {
 	register_title.append(root).append('*').append(okuri);
-    }
-    else {
+    } else {
 	register_title = root;
     }
-    register_title = HiraganaInputMode::convert(register_title); // 片仮名は平仮名に変換
-	
-    word_register_mode = new WordRegisterMode(*this,register_title);
+
+    // 現在の入力モードを保存しておく
+    if(parent->isHiraganaInputMode()) {
+	priorInputMode_ = Hirakana;
+    }
+    if(parent->isZenKataInputMode()) {
+	priorInputMode_ = Katakana;
+    }
+    if(parent->isHanKataInputMode()) {
+	priorInputMode_ = Jisx0201Kana;
+    }
+
+    word_register_mode = new WordRegisterMode(*this, HiraganaInputMode::convert(register_title));
     word_register_mode->redisplay();
     word_register_mode->updatePencilMenuIcon();
 }
@@ -737,8 +748,7 @@
     
     if (word_register_mode) {
 	word_register_mode->terminate();
-	delete word_register_mode;
-	word_register_mode = NULL;
+	resetRegistrationMode();
     }
 
     // currenInputModeをterminateして、rootにgetStringToFix()の戻り値を追加する。
@@ -753,6 +763,30 @@
     initialize();
 }
 
+// 直前の単語登録モードを削除し、現在の単語登録モードを退避する
+void KanjiConversionMode::resetRegistrationMode() {
+    delete old_word_register_mode;
+    old_word_register_mode = word_register_mode;
+    word_register_mode = 0;
+}
+
+// 単語登録前の入力モードを復元する
+void KanjiConversionMode::restoreInputMode() {
+    switch(priorInputMode_) {
+    case Hirakana:
+	parent->goHiraganaInputMode();
+	break;
+    case Katakana:
+	parent->goZenKataInputMode();
+	break;
+    case Jisx0201Kana:
+	parent->goHanKataInputMode();
+	break;
+    }
+
+    parent->updatePencilMenuIcon();
+}
+
 void KanjiConversionMode::wordRegistrationFinished() {
     if(word_register_mode) {
 	CppCFString content = word_register_mode->getContent();
@@ -760,15 +794,16 @@
 	    // 鯖に送信。
 	    if(okuri.length() > 0) {
 		if(SKKConfig::UseKanaToOkuri()) {
-#ifdef DEBUG
-		    cerr << "(A)OKURI-HEAD: " << okuri[0] << " - " << SKKConfig::ConvertKanaToOkuri(okuri[0]) << endl;
-#endif
-		    sendWordToServerToRegister(root + SKKConfig::ConvertKanaToOkuri(okuri[0]), okuri, content);
+		    sendWordToServerToRegister(
+			HiraganaInputMode::convert(root) + SKKConfig::ConvertKanaToOkuri(okuri[0]),
+			HiraganaInputMode::convert(okuri), content);
 		} else {
-		    sendWordToServerToRegister(root + okuri_head, okuri, content);
+		    sendWordToServerToRegister(
+			HiraganaInputMode::convert(root) + okuri_head,
+			HiraganaInputMode::convert(okuri), content);
 		}
 	    } else {
-		sendWordToServerToRegister(root, content);
+		sendWordToServerToRegister(HiraganaInputMode::convert(root), content);
 	    }
 
 	    // 確定。
@@ -785,17 +820,15 @@
 	    }
 	}
 
-	delete word_register_mode;
-	word_register_mode = NULL;
-	parent->updatePencilMenuIcon();
+	resetRegistrationMode();
+	restoreInputMode();
     }
 }
 
 void KanjiConversionMode::wordRegistrationCanceled() {
-    delete word_register_mode;
-    word_register_mode = NULL;
-    parent->updatePencilMenuIcon();
-    
+    resetRegistrationMode();
+    restoreInputMode();
+
     if (status == STATUS_WHITE_ROOT || status == STATUS_WHITE_OKURI) {
 	// rootにokuriをくっつけてSTATUS_WHITE_ROOTへ
 	root += okuri;
@@ -898,9 +931,6 @@
     // 片仮名は平仮名に変換する。
     if(okuri.length() > 0) {
 	if(SKKConfig::UseKanaToOkuri()) {
-#ifdef DEBUG
-	    cerr << "(B)OKURI-HEAD: " << okuri[0] << " - " << SKKConfig::ConvertKanaToOkuri(okuri[0]) << endl;
-#endif
 	    sendWordToServerToRegister(
 		HiraganaInputMode::convert(root) + SKKConfig::ConvertKanaToOkuri(okuri[0]), 
 		HiraganaInputMode::convert(okuri),
@@ -1022,6 +1052,24 @@
 
     current_completion_index = 0;
     ::askServerTheCompletions(cfdata_query, completions);
+
+    // 変換用ファンクタ
+    struct convert {
+	static void ToZenKana(CppCFString& str) {
+	    str = ZenKataInputMode::convert(str);
+	}
+	static void ToHanKana(CppCFString& str) {
+	    str = HanKataInputMode::convert(str);
+	}
+    };
+
+    // カタカナ、半角カナの場合は見出し語の文字種を変換する
+    if(parent->isZenKataInputMode()) {
+	std::for_each(completions.begin(), completions.end(), &convert::ToZenKana);
+    }
+    if(parent->isHanKataInputMode()) {
+	std::for_each(completions.begin(), completions.end(), &convert::ToHanKana);
+    }
 }
 
 void askServerTheCompletions(const CppCFData& query, std::vector<CppCFString>& completions) {
Index: AquaSKK/KanjiConversionMode.h
diff -u AquaSKK/KanjiConversionMode.h:1.8 AquaSKK/KanjiConversionMode.h:1.9
--- AquaSKK/KanjiConversionMode.h:1.8	Tue Jun 12 23:25:08 2007
+++ AquaSKK/KanjiConversionMode.h	Thu Jun 14 21:00:16 2007
@@ -1,5 +1,5 @@
 /*
-  $Id: KanjiConversionMode.h,v 1.8 2007/06/12 14:25:08 t-suwa Exp $
+  $Id: KanjiConversionMode.h,v 1.9 2007/06/14 12:00:16 t-suwa Exp $
 
   MacOS X implementation of the SKK input method.
 
@@ -37,6 +37,9 @@
 class KanjiConversionMode: public ChildInputMode, public RegistrationStarter {
     bool handleInputChar(SKKChar skkchar);
     NumericConverter numconv_;
+    int priorInputMode_;
+
+    enum { Hirakana, Katakana, Jisx0201Kana };
 
 protected:
     static const int STATUS_NULL = 0; // 漢字変換モードになっていない状態。先頭に▽も▼も無い。
@@ -47,6 +50,7 @@
     static const int STATUS_PROMPT = 5; // プロンプトを出している。
 
     WordRegisterMode* word_register_mode; // NULLでない時は単語登録モードが起動中。
+    WordRegisterMode* old_word_register_mode; // 直前まで有効だった単語登録モード
 
     int status;
     CppCFString root; // 送り仮名の無い部分。例:「送り」なら「おく」
@@ -85,6 +89,8 @@
     virtual void goToNextCandidatesFrame();
     virtual void closeCandidatesWindow();
     virtual void initialize();
+    virtual void resetRegistrationMode();
+    virtual void restoreInputMode();
 
 public:
     KanjiConversionMode(class ParentInputMode& parent);


aquaskk-changes メーリングリストの案内
Back to archive index