;; $Id: mlh+wnn7-egg.el,v 1.2 1998/03/24 10:18:04 kuwada Exp $

(setq henkan-region-function 'wnn7-henkan-region)
;;;;;;; This code are based on wnn-egg.el

(defvar mlh-henkan-mode-map (make-keymap)
  "henkan-mode-map in mlh")

;;; acutually this map is not necessary now. for future extention
(defvar mlh-henkan-mode-esc-map (make-keymap)
  "henkan-mode-esc-map in mlh")

(define-key mlh-henkan-mode-map [t] 'undefined)
(define-key mlh-henkan-mode-esc-map [t] 'undefined)

(let ((ch 32))
  (while (< ch 127)
    (define-key mlh-henkan-mode-map (char-to-string ch)
      'mlh-henkan-kakutei-unread-events)
    (setq ch (1+ ch))))

;(define-key mlh-henkan-mode-map "\e"    mlh-henkan-mode-esc-map)       ; CHANGE
;(define-key mlh-henkan-mode-map "\ei"  'henkan-inspect-bunsetu)
(define-key mlh-henkan-mode-map "\ei"  'henkan-bunsetu-chijime-sho)
(define-key mlh-henkan-mode-map "\eo"  'henkan-bunsetu-nobasi-sho)
(define-key mlh-henkan-mode-map "\es"  'henkan-select-kouho-dai)
(define-key mlh-henkan-mode-map "\eh"  'henkan-hiragana)
(define-key mlh-henkan-mode-map "\ek"  'henkan-katakana)
(define-key mlh-henkan-mode-map "\ez"  'henkan-select-kouho-sho)
(define-key mlh-henkan-mode-map "\e<"  'henkan-saishou-bunsetu)
(define-key mlh-henkan-mode-map "\e>"  'henkan-saichou-bunsetu)
(define-key mlh-henkan-mode-map " "    'henkan-next-kouho)
(define-key mlh-henkan-mode-map "\C-@" 'henkan-kakutei-first-char)
(define-key mlh-henkan-mode-map "\C-a" 'henkan-first-bunsetu)
(define-key mlh-henkan-mode-map "\C-b" 'henkan-backward-bunsetu)
(define-key mlh-henkan-mode-map "\C-c" 'mlh-henkan-quit)               ; CHANGE
(define-key mlh-henkan-mode-map "\C-d" 'undefined)
(define-key mlh-henkan-mode-map "\C-e" 'henkan-last-bunsetu)
(define-key mlh-henkan-mode-map "\C-f" 'henkan-forward-bunsetu)
(define-key mlh-henkan-mode-map "\C-g" 'mlh-henkan-quit)               ; CHANGE
(define-key mlh-henkan-mode-map "\C-h" 'henkan-help-command)
(define-key mlh-henkan-mode-map "\C-i" 'henkan-bunsetu-chijime-dai)
(define-key mlh-henkan-mode-map "\C-j" 'undefined)
(define-key mlh-henkan-mode-map "\C-k" 'undefined)                     ; CHANGE
(define-key mlh-henkan-mode-map "\C-l" 'mlh-henkan-kakutei)            ; CHANGE
;(define-key mlh-henkan-mode-map "\C-m" 'mlh-henkan-kakutei-unread-events); CHANGE
(define-key mlh-henkan-mode-map "\C-m" 'mlh-henkan-kakutei); CHANGE
(define-key mlh-henkan-mode-map "\C-n" 'henkan-next-kouho)
(define-key mlh-henkan-mode-map "\C-o" 'henkan-bunsetu-nobasi-dai)
(define-key mlh-henkan-mode-map "\C-p" 'henkan-previous-kouho)
(define-key mlh-henkan-mode-map "\C-q" 'undefined)
(define-key mlh-henkan-mode-map "\C-r" 'undefined)
(define-key mlh-henkan-mode-map "\C-s" 'undefined)
(define-key mlh-henkan-mode-map "\C-t" 'toroku-henkan-mode)
(define-key mlh-henkan-mode-map "\C-u" 'undefined)
(define-key mlh-henkan-mode-map "\C-v" 'henkan-inspect-bunsetu)
(define-key mlh-henkan-mode-map "\C-w" 'henkan-next-kouho-dai)
(define-key mlh-henkan-mode-map "\C-x" 'undefined)
(define-key mlh-henkan-mode-map "\C-y" 'undefined)
(define-key mlh-henkan-mode-map "\C-z" 'henkan-next-kouho-sho)
(define-key mlh-henkan-mode-map "\C-_" 'mlh-henkan-kakutei-unread-events)
(define-key mlh-henkan-mode-map [?\C-/] 'mlh-henkan-kakutei-unread-events)
(define-key mlh-henkan-mode-map "/" 'mlh-henkan-kakutei)
(define-key mlh-henkan-mode-map "\177" 'mlh-henkan-quit)               ; CHANGE

(if (eq window-system 'x)
    (let ()
      ;(define-key mlh-henkan-mode-map [return] 'mlh-henkan-kakutei-unread-events)
      (define-key mlh-henkan-mode-map [return] 'mlh-henkan-kakutei)
      (define-key mlh-henkan-mode-map [delete] 'mlh-henkan-quit)
      (define-key mlh-henkan-mode-map [escape]  mlh-henkan-mode-esc-map)
      ))

(defun mlh-henkan-quit ()
  "henkan-quit in mlh.
Not entering fence mode, do quit."
  (interactive)
  (egg:bunsetu-face-off)
  (egg:henkan-face-off)
  (delete-region (- egg:*region-start* (length egg:*henkan-open*))
		 egg:*region-start*)
  (delete-region egg:*region-start* egg:*region-end*)
  (delete-region egg:*region-end*
                 (+ egg:*region-end* (length egg:*henkan-close*)))
  (goto-char egg:*region-start*)
  (egg:fence-face-on)
  (wnn-server-henkan-quit)
  ;(setq egg:*mode-on* t)  ;; changed by M.Kuwada on 1998.04.23
  (setq egg:henkan-mode-in-use nil)
  (egg:mode-line-display)
  (funcall major-mode)     ;; added by M.Kuwada on 1998.04.23
  (signal 'quit nil))

;;; modified version of henkan-kakutei in wnn-egg.el
(defun mlh-henkan-kakutei ()
  "Do `kakutei'.  Not set undo-boundary."
  (interactive)
  (egg:bunsetu-face-off)
  (egg:henkan-face-off)
  (delete-region (- egg:*region-start* (length egg:*henkan-open*))
		 egg:*region-start*)
  (delete-region egg:*region-start* egg:*region-end*)
  (delete-region egg:*region-end* (+ egg:*region-end* (length egg:*henkan-close*)))
  (goto-char egg:*region-start*)
  (setq egg:*sai-henkan-start* (point))
  (let ((i 0) (max (wnn-server-bunsetu-suu)))
    (setq egg:*old-bunsetu-suu* max)
    (while (< i max)
      (insert (car (wnn-server-bunsetu-kanji i )))
;;      (if (not overwrite-mode)
;;	  (undo-boundary))
      (setq i (1+ i))
      ))
  (setq egg:*sai-henkan-end* (point))
  (wnn-server-hindo-update)
  (setq egg:henkan-mode-in-use nil)
  (egg:quit-egg-mode)
  (run-hooks 'egg:henkan-end-hook)
  )

(defun mlh-henkan-kakutei-unread-events ()
  "Set unread-command-events for next reading of input,
and call mlh-henkan-kakutei to do `kakutei'."
  (interactive)
  (setq unread-command-events (list last-command-event))
  (mlh-henkan-kakutei))