Revision: 7355
Author:   deton.kih
Date:     Mon Oct 31 04:14:47 2011
Log:      * scm/tutcode.scm
  - (tutcode-commit-with-auto-help):
    Add call of tutcode-undo-prepare to undo commit
    of prefix mazegaki conversion.
  - (tutcode-begin-kanji-code-input):
    Add call of tutcode-undo-prepare.
  - (tutcode-commit-editor-context,
     tutcode-begin-postfix-bushu-conversion,
     tutcode-proc-state-converting):
    Follow the rename of tutcode-undo-prepare-postfix.
  - (tutcode-proc-state-on):
    Add reset of undo data before starting bushu conversion.
  - (tutcode-undo): Change to support prefix conversion.
  - (tutcode-undo-prepare):
    Add state argument to distinguish type of prefix conversion.
  - (tutcode-undo-prepare-postfix):
    New function rename from tutcode-undo-prepare.
  - (tutcode-proc-state-bushu): Change to support undo.
  - (tutcode-bushu-commit): Ditto.

http://code.google.com/p/uim/source/detail?r=7355

Modified:
 /trunk/scm/tutcode.scm

=======================================
--- /trunk/scm/tutcode.scm      Mon Oct 31 04:10:32 2011
+++ /trunk/scm/tutcode.scm      Mon Oct 31 04:14:47 2011
@@ -243,6 +243,16 @@
 ;;;   ´Á»ú¥³¡¼¥ÉÆþÎϤdzÎÄꤷ¤¿Ê¸»úÎó¤òºÆÆþÎϤ¹¤ë¥â¡¼¥É¡£
 ;;;   tutcode-history-size¤ò1°Ê¾å¤ËÀßÄꤹ¤ë¤ÈÍ­¸ú¤Ë¤Ê¤ê¤Þ¤¹¡£
 ;;;
+;;; ¡Ú¥¢¥ó¥É¥¥¡Û
+;;;   °Ê²¼¤ÎÊÑ´¹¤Ç¤Ï¡¢ÊÑ´¹¸å¤Ë³ÎÄꤵ¤ì¤ëʸ»úÎó¤ò³Îǧ¤¹¤ëµ¡²ñ̵¤·¤Ë
+;;;   ³ÎÄê¤ò¹Ô¤¦¤Î¤Ç¡¢°Õ¿Þ¤·¤Ê¤¤´Á»ú¤Ë³ÎÄꤵ¤ì¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£
+;;;   ¤½¤Î¤è¤¦¤Ê¾ì¹ç¤Ç¤â¡¢ºÇ½é¤«¤éÆþÎϤ·Ä¾¤µ¤Ê¤¯¤Æ¤¹¤à¤è¤¦¤Ë¡¢
+;;;   ¥¢¥ó¥É¥¥µ¡Ç½¤òÄɲä·¤Þ¤·¤¿¡£
+;;;   (³ÎÄêºÑʸ»úÎó¤òºï½ü¤¹¤ë¤¿¤á¡¢uim¤Îsurrounding text API¤ò»È¤¤¤Þ¤¹)
+;;; + Éô¼ó¹çÀ®ÊÑ´¹: 2ʸ»úÌܤÎÉô¼óÆþÎϤˤè¤êÊÑ´¹¡¦³ÎÄ곫»Ï(ÆÃ¤ËºÆµ¢Åª¤Ê¾ì¹ç)
+;;;   + ´Á»ú¥³¡¼¥ÉÆþÎÏ
+;;;   + ¸ò¤¼½ñ¤­ÊÑ´¹: ¸õÊä¿ô¤¬1¸Ä¤Î»þ¤Î¼«Æ°³ÎÄê
+;;;
 ;;; ¡ÚÀßÄêÎã¡Û
;;; * ¥³¡¼¥Éɽ¤Î°ìÉô¤òÊѹ¹¤·¤¿¤¤¾ì¹ç¤Ï¡¢Î㤨¤Ð~/.uim¤Ç°Ê²¼¤Î¤è¤¦¤Ëµ­½Ò¤¹¤ë¡£
 ;;;   (require "tutcode.scm")
@@ -1304,13 +1314,21 @@
          (yomi (and (> yomi-len 0)
(take (tutcode-context-mazegaki-yomi-all pc) yomi-len)))
          (suffix (tutcode-context-mazegaki-suffix pc))
+         (state (tutcode-context-state pc))
+ ;; ¸õÊä1¸Ä¤Ç¼«Æ°³ÎÄꤵ¤ì¤¿´Á»ú¤¬°Õ¿Þ¤·¤¿¤â¤Î¤Ç¤Ê¤«¤Ã¤¿¾ì¹ç¤Îundo¤òÁÛÄê + ;; (ÆÉ¤ßÆþÎϾõÂÖ¤òºÆ¸½¡£¸õÊäÁªÂò¾õÂ֤ǤϤʤ¯¡£ÁªÂòÃæ¤Î¸õÊäÈÖ¹æ¤ÏÉÔÍ×)
+         (undo-data (and (eq? state 'tutcode-state-converting)
+                         (list head (tutcode-context-latin-conv pc))))
(res (tutcode-prepare-commit-string pc))) ; flush¤Ë¤è¤êheadÅù¤¬¥¯¥ê¥¢
     (if (> yomi-len 0)
       (begin
         (tutcode-postfix-delete-text pc yomi-len)
         (tutcode-commit pc res)
-        (tutcode-undo-prepare pc res yomi))
-      (tutcode-commit pc res))
+        (tutcode-undo-prepare-postfix pc res yomi))
+      (begin
+        (tutcode-commit pc res)
+        (if undo-data
+          (tutcode-undo-prepare pc state res undo-data))))
     (tutcode-check-auto-help-window-begin pc
       (drop (string-to-list res) (length suffix))
       (append suffix head))))
@@ -1595,6 +1613,7 @@
       (begin
         (tutcode-commit pc kanji)
         (tutcode-flush pc)
+        (tutcode-undo-prepare pc 'tutcode-state-code kanji str-list)
         (tutcode-check-auto-help-window-begin pc (list kanji) ())))))

 ;;; »Ò¥³¥ó¥Æ¥­¥¹¥È¤òºîÀ®¤¹¤ë¡£
@@ -2343,7 +2362,7 @@
         (tutcode-postfix-delete-text pc yomi-len)
         (tutcode-flush pc)
         (tutcode-commit pc commit-str)
-        (tutcode-undo-prepare pc commit-str yomi))
+        (tutcode-undo-prepare-postfix pc commit-str yomi))
       (begin
         (tutcode-flush pc)
         (tutcode-commit pc commit-str)))
@@ -2774,6 +2793,7 @@
               ((eq? res 'tutcode-kanji-code-input-start)
                 (tutcode-context-set-state! pc 'tutcode-state-code))
               ((eq? res 'tutcode-bushu-start)
+ (tutcode-context-set-undo! pc ()) ; ºÆµ¢ÅªÉô¼ó¹çÀ®ÊÑ´¹¤ÎundoÍÑ
                 (tutcode-context-set-state! pc 'tutcode-state-bushu)
                 (tutcode-append-string pc "¢¥"))
               ((eq? res 'tutcode-interactive-bushu-start)
@@ -2848,24 +2868,46 @@
(tutcode-bushu-convert (cadr former-seq) (car former-seq)))))
     (tutcode-postfix-delete-text pc 2)
     (tutcode-commit pc res)
-    (tutcode-undo-prepare pc res former-seq)
+    (tutcode-undo-prepare-postfix pc res former-seq)
     (tutcode-check-auto-help-window-begin pc (list res) ())))

-;;; ¸åÃÖ·¿ÊÑ´¹¤Î³ÎÄê¤òundo¤¹¤ë
+;;; ¸åÃÖ·¿/Á°ÃÖ·¿ÊÑ´¹¤Î³ÎÄê¤òundo¤¹¤ë
 (define (tutcode-undo pc)
-  (and-let*
-    ((undo (tutcode-context-undo pc))
-     (len (and (pair? undo) (car undo)))
-     (strs (cdr undo)))
-    (tutcode-postfix-delete-text pc len)
-    (tutcode-commit pc (string-list-concat strs) #t #t)))
+  (let ((undo (tutcode-context-undo pc)))
+    (if (pair? undo)
+      (let ((state (list-ref undo 0))
+            (commit-len (list-ref undo 1))
+            (data (list-ref undo 2)))
+        (tutcode-postfix-delete-text pc commit-len)
+        (case state
+          ((tutcode-state-off) ; ¸åÃÖ·¿ÊÑ´¹
+            (tutcode-commit pc (string-list-concat data) #t #t))
+          ((tutcode-state-converting)
+            (tutcode-context-set-head! pc (list-ref data 0))
+            (tutcode-context-set-latin-conv! pc (list-ref data 1))
+            (tutcode-context-set-state! pc 'tutcode-state-yomi))
+          ((tutcode-state-bushu)
+            (tutcode-context-set-head! pc data)
+            (tutcode-context-set-state! pc 'tutcode-state-bushu))
+          ((tutcode-state-code)
+            (tutcode-context-set-head! pc data)
+            (tutcode-context-set-state! pc 'tutcode-state-code))
+          )))))
+
+;;; ¸åÃÖ·¿/Á°ÃÖ·¿ÊÑ´¹¤Î³ÎÄê¤òundo¤¹¤ë¤¿¤á¤Î½àÈ÷
+;;; @param state ÊÑ´¹¤Î¼ïÎà('tutcode-state-converting)
+;;; @param commit-str ³ÎÄêʸ»úÎó
+;;; @param data ³ÎÄêÁ°¤Î¾õÂÖ¤òºÆ¸½¤¹¤ë¤Î¤ËɬÍפʾðÊó
+(define (tutcode-undo-prepare pc state commit-str data)
+  (let ((commit-len (length (string-to-list commit-str))))
+    ;; XXX: ¿ÃÊundo¤Ï̤Âбþ
+    (tutcode-context-set-undo! pc (list state commit-len data))))

 ;;; ¸åÃÖ·¿ÊÑ´¹¤Î³ÎÄê¤òundo¤¹¤ë¤¿¤á¤Î½àÈ÷
 ;;; @param commit-str ³ÎÄêʸ»úÎó
 ;;; @param yomi-str ÊÑ´¹¸µ¤Îʸ»úÎó(ÆÉ¤ß/Éô¼ó)¤Î¥ê¥¹¥È(µÕ½ç)
-(define (tutcode-undo-prepare pc commit-str yomi-list)
-  (let ((commit-len (length (string-to-list commit-str))))
-    (tutcode-context-set-undo! pc (cons commit-len yomi-list))))
+(define (tutcode-undo-prepare-postfix pc commit-str yomi-list)
+  (tutcode-undo-prepare pc 'tutcode-state-off commit-str yomi-list))

 ;;; ¸åÃÖ·¿¸ò¤¼½ñ¤­ÊÑ´¹¤ò³«»Ï¤¹¤ë
 ;;; @param yomi-len »ØÄꤵ¤ì¤¿ÆÉ¤ß¤Îʸ»ú¿ô¡£»ØÄꤵ¤ì¤Æ¤Ê¤¤¾ì¹ç¤Ï#f¡£
@@ -3633,10 +3675,19 @@
         ((eq? res 'tutcode-auto-help-redisplay)
           (tutcode-auto-help-redisplay pc)
           (set! res #f))
+        ((eq? res 'tutcode-undo) ; ºÆµ¢Åª¤ÊÉô¼ó¹çÀ®ÊÑ´¹¤òundo¤¹¤ë
+          (let ((undo (tutcode-context-undo pc)))
+            (if (pair? undo)
+              (tutcode-context-set-head! pc (list-ref undo 2))))
+          (set! res #f))
         ((symbol? res) ;XXX Éô¼ó¹çÀ®ÊÑ´¹Ãæ¤Ï¸ò¤¼½ñ¤­ÊÑ´¹Åù¤Ï̵¸ú¤Ë¤¹¤ë
           (set! res #f)))))
     (if res
-      (tutcode-begin-bushu-conversion pc res))))
+      (begin
+        ;; ºÆµ¢Åª¤ËÉô¼ó¹çÀ®¤µ¤ì¤ë¾ì¹ç¤¬¤¢¤ë¤Î¤Ç¡¢headÁ´ÂΤòundoÍѤËÊÝ»ý
+ (tutcode-undo-prepare pc 'tutcode-state-bushu " " ; " ":³ÎÄê¸å¤Ï1ʸ»ú
+          (tutcode-context-head pc))
+        (tutcode-begin-bushu-conversion pc res)))))

 ;;; Éô¼ó¹çÀ®ÊÑ´¹³«»Ï
 ;;; @param char ¿·¤¿¤ËÆþÎϤµ¤ì¤¿Ê¸»ú(2ÈÖÌܤÎÉô¼ó)
@@ -3667,9 +3718,10 @@
   (tutcode-context-set-head! pc (cddr (tutcode-context-head pc)))
   (if (null? (tutcode-context-head pc))
     ;; ÊÑ´¹ÂÔ¤Á¤ÎÉô¼ó¤¬»Ä¤Ã¤Æ¤Ê¤±¤ì¤Ð¡¢³ÎÄꤷ¤Æ½ªÎ»
-    (begin
+    (let ((undo-data (tutcode-context-undo pc))) ; commit¤¹¤ë¤È¥¯¥ê¥¢¤µ¤ì¤ë
       (tutcode-commit pc convchar)
       (tutcode-flush pc)
+      (tutcode-context-set-undo! pc undo-data)
       (tutcode-check-auto-help-window-begin pc (list convchar) ()))
     ;; Éô¼ó¤¬¤Þ¤À»Ä¤Ã¤Æ¤ì¤Ð¡¢ºÆ³Îǧ¡£
     ;; (¹çÀ®¤·¤¿Ê¸»ú¤¬2ʸ»úÌܤʤé¤Ð¡¢Ï¢Â³¤·¤ÆÉô¼ó¹çÀ®ÊÑ´¹)
@@ -3982,7 +4034,7 @@
             (begin
               (tutcode-postfix-delete-text pc postfix-yomi-len)
               (tutcode-commit pc commit-str)
-              (tutcode-undo-prepare pc commit-str yomi))
+              (tutcode-undo-prepare-postfix pc commit-str yomi))
             (tutcode-commit pc commit-str)))
         (tutcode-proc-state-on pc key key-state)))))

Reply via email to