[aquaskk-changes 421] CVS update: AquaSKK/src/statemachine

Back to archive index

t-suw****@users***** t-suw****@users*****
2007年 10月 20日 (土) 12:17:17 JST


Index: AquaSKK/src/statemachine/GenericStateMachine.h
diff -u AquaSKK/src/statemachine/GenericStateMachine.h:1.1.2.4 AquaSKK/src/statemachine/GenericStateMachine.h:1.1.2.5
--- AquaSKK/src/statemachine/GenericStateMachine.h:1.1.2.4	Fri Oct  5 23:58:29 2007
+++ AquaSKK/src/statemachine/GenericStateMachine.h	Sat Oct 20 12:17:17 2007
@@ -246,7 +246,7 @@
 	    iter->second.push(event);
         }
 
-	void Transfer(const Handler key) {
+	void Commit(const Handler key) {
 	    QueueIterator iter = find(key, arrival_);
 
 	    if(iter != arrival_.end()) {
@@ -334,7 +334,7 @@
                 history_.Save(handler, prior_, active_);
             }
 
-	    queue_.Transfer(handler);
+	    queue_.Commit(handler);
 
             prior_ = handler;
 
@@ -504,15 +504,18 @@
 		}
 
 		if(next.IsTransition() || next.IsDeepHistory() || next.IsForward() || next.IsDeepForward()) {
+		    State target = next;
+
 		    if(next.IsDeepHistory() || next.IsDeepForward()) {
-			next = history_.Deep(next);
-			assert(next != 0 && "*** Deep history not found ***");
+			target = history_.Deep(next);
+			assert(target != 0 && "*** Deep history not found ***");
 		    }
 
-		    transition(source, next);
-		    initialize(next);
+		    transition(source, target);
+		    initialize(target);
 
 		    if(next.IsForward() || next.IsDeepForward()) {
+			next = target;
 			continue;
 		    }
 
Index: AquaSKK/src/statemachine/SKKCompletePolicy.h
diff -u /dev/null AquaSKK/src/statemachine/SKKCompletePolicy.h:1.1.2.1
--- /dev/null	Sat Oct 20 12:17:17 2007
+++ AquaSKK/src/statemachine/SKKCompletePolicy.h	Sat Oct 20 12:17:17 2007
@@ -0,0 +1,37 @@
+/* -*- C++ -*-
+   MacOS X implementation of the SKK input method.
+
+   Copyright (C) 2007 Tomotaka SUWA <t.suw****@mac*****>
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef INC__SKKCompletePolicy__
+#define INC__SKKCompletePolicy__
+
+#include "SKKBackEnd.h"
+
+class SKKNormalComplete {
+    std::string entry_;
+
+public:
+    SKKNormalComplete(const std::string& entry) : entry_(entry) {}
+
+    void operator()(std::vector<std::string>& buffer) const {
+	SKKBackEnd::Complete(entry_, buffer);
+    }
+};
+
+#endif
Index: AquaSKK/src/statemachine/SKKState.cpp
diff -u AquaSKK/src/statemachine/SKKState.cpp:1.1.2.1 AquaSKK/src/statemachine/SKKState.cpp:1.1.2.2
--- AquaSKK/src/statemachine/SKKState.cpp:1.1.2.1	Fri Oct  5 23:58:29 2007
+++ AquaSKK/src/statemachine/SKKState.cpp	Sat Oct 20 12:17:17 2007
@@ -24,6 +24,7 @@
 #include "SKKStateKanaEntryHandler.h"
 #include "SKKStateOkuriEntryHandler.h"
 #include "SKKStateAsciiEntryHandler.h"
+#include "SKKStateEntryCompletionHandler.h"
 #include "jconv.h"
 
 typedef SKKState::Event Event;
@@ -327,19 +328,30 @@
 State SKKState::EntryCompletion(const Event& event) {
     const SKKEventParam& param = event.Param();
 
+    // ENTRY 以外のシステムイベントは上位状態にルーティング
+    if(event.IsSystem() && event != ENTRY_EVENT) {
+	return &SKKState::Compose;
+    }
+
     switch(event) {
     case ENTRY_EVENT:
-	//controller_->ChangeState(SKK::Completion);
-	return 0;
-    }
+    case SKK_HIRAKANA:
+    case SKK_KATAKANA:
+    case SKK_JISX0201KANA:
+    case SKK_ASCII:
+    case SKK_JISX0208LATIN:
+	return EntryCompletionHandler<ENTRY_EVENT>();
 
-    // システムイベントと変換は無視する
-    if(event.IsSystem() ||
-       event == SKK_TAB ||
-       (event == SKK_CHAR && (param.IsNextCandidate() ||
-			      param.IsNextCompletion() ||
-			      param.IsPrevCompletion()))) {
-	return &SKKState::Compose;
+    case SKK_TAB:
+	return EntryCompletionHandler<SKK_TAB>();
+
+    case SKK_CHAR:
+	if(param.IsNextCompletion() || param.IsPrevCompletion()) {
+	    return EntryCompletionHandler<SKK_CHAR>(param);
+	}
+	if(param.IsNextCandidate()) {
+	    return &SKKState::Compose;
+	}
     }
 
     // 補完キー以外なら履歴に転送する
@@ -458,23 +470,23 @@
 void SKKState::composeDisplay() {
     SKKOutputPort& port = context().OutputPort();
     SKKInputBuffer& input = context().InputBuffer();
-    SKKEditBuffer edit(context().EditBuffer());
+    SKKEditBuffer tmp(context().EditBuffer());
 
     if(!input.IsEmpty()) {
-	edit.Insert(input.InputString());
+	tmp.Insert(input.InputString());
     }
     
-    port.DisplayString("â–½" + edit.EditString(), 1 + edit.CursorPosition());
+    port.DisplayString("â–½" + tmp.EditString(), 1 + tmp.CursorPosition());
 }
 
 void SKKState::okuriDisplay() {
     SKKOutputPort& port = context().OutputPort();
     SKKOkuriBuffer& okuri = context().OkuriBuffer();
-    SKKEditBuffer edit(context().EditBuffer());
+    SKKEditBuffer tmp(context().EditBuffer());
 
-    edit.Insert("*" + okuri.KanaString());
+    tmp.Insert("*" + okuri.KanaString());
     
-    port.DisplayString("â–½" + edit.EditString(), 1 + edit.CursorPosition());
+    port.DisplayString("â–½" + tmp.EditString(), 1 + tmp.CursorPosition());
 }
 
 void SKKState::toggleKana() {
Index: AquaSKK/src/statemachine/SKKState.h
diff -u AquaSKK/src/statemachine/SKKState.h:1.1.2.1 AquaSKK/src/statemachine/SKKState.h:1.1.2.2
--- AquaSKK/src/statemachine/SKKState.h:1.1.2.1	Fri Oct  5 23:58:29 2007
+++ AquaSKK/src/statemachine/SKKState.h	Sat Oct 20 12:17:17 2007
@@ -40,12 +40,19 @@
     // イベントハンドラ
     template <int Signal> State DirectHandler();
     template <int Signal> State DirectHandler(const SKKEventParam& param);
+    
     template <int Signal> State ComposeHandler();
+    
     template <int Signal> State KanaEntryHandler(const SKKEventParam& event);
+    
     template <int Signal> State OkuriEntryHandler();
     template <int Signal> State OkuriEntryHandler(const SKKEventParam& event);
+    
     template <int Signal> State AsciiEntryHandler(const SKKEventParam& event);
 
+    template <int Signal> State EntryCompletionHandler();
+    template <int Signal> State EntryCompletionHandler(const SKKEventParam& event);
+
     // 表示
     void composeDisplay();
     void okuriDisplay();
Index: AquaSKK/src/statemachine/SKKStateComposeHandler.h
diff -u AquaSKK/src/statemachine/SKKStateComposeHandler.h:1.1.2.1 AquaSKK/src/statemachine/SKKStateComposeHandler.h:1.1.2.2
--- AquaSKK/src/statemachine/SKKStateComposeHandler.h:1.1.2.1	Fri Oct  5 23:58:29 2007
+++ AquaSKK/src/statemachine/SKKStateComposeHandler.h	Sat Oct 20 12:17:17 2007
@@ -22,6 +22,7 @@
 #define INC__SKKStateComposeHandler__
 
 #include "SKKState.h"
+#include "SKKCompletePolicy.h"
 
 typedef SKKState::State State;
 
@@ -106,13 +107,14 @@
 
 template <>
 State SKKState::ComposeHandler<SKK_TAB>() {
-    // 検索できた?
-    if(0) {
-	// 補完モード
+    SKKEditBuffer& edit = context().EditBuffer();
+    SKKCompletionBuffer& comp = context().CompletionBuffer();
+
+    if(comp.Complete(SKKNormalComplete(edit.EditString()))) {
 	return State::Transition(&SKKState::EntryCompletion);
-    } else {
-	return 0;
     }
+
+    return 0;
 }
 
 template <>
Index: AquaSKK/src/statemachine/SKKStateEntryCompletionHandler.h
diff -u /dev/null AquaSKK/src/statemachine/SKKStateEntryCompletionHandler.h:1.1.2.1
--- /dev/null	Sat Oct 20 12:17:17 2007
+++ AquaSKK/src/statemachine/SKKStateEntryCompletionHandler.h	Sat Oct 20 12:17:17 2007
@@ -0,0 +1,66 @@
+/* -*- C++ -*-
+   MacOS X implementation of the SKK input method.
+
+   Copyright (C) 2007 Tomotaka SUWA <t.suw****@mac*****>
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef INC__SKKEntryCompletionHandler__
+#define INC__SKKEntryCompletionHandler__
+
+#include "SKKState.h"
+#include <iostream>
+
+typedef SKKState::State State;
+
+// ======================================================================
+// 補完
+// ======================================================================
+
+template <>
+State SKKState::EntryCompletionHandler<ENTRY_EVENT>() {
+    SKKEditBuffer& edit = context().EditBuffer();
+    SKKCompletionBuffer& comp = context().CompletionBuffer();
+
+    edit.Clear();
+    edit.Insert(comp.CurrentString());
+
+    composeDisplay();
+
+    return 0;
+}
+
+template <>
+State SKKState::EntryCompletionHandler<SKK_TAB>() {
+    context().CompletionBuffer().Next();
+
+    return State::Transition(&SKKState::EntryCompletion);
+}
+
+template <>
+State SKKState::EntryCompletionHandler<SKK_CHAR>(const SKKEventParam& param) {
+    if(param.IsNextCompletion()) {
+	return EntryCompletionHandler<SKK_TAB>();
+    }
+
+    if(param.IsPrevCompletion()) {
+	context().CompletionBuffer().Prev();
+    }
+
+    return State::Transition(&SKKState::EntryCompletion);
+}
+
+#endif


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