;; lisp file for xyzzy ver0.2.2.233
;;;ddwin-search.l
;;;DDwinの辞書を使えるようにする

;(load-library "ddwin-search")

;;;original product was made by suda.
;;;remodel my dictionary

(provide "ddwin-search")

(in-package "editor")

(export '(ddwin-app
	  ddwin-search-kanjigen-selection
	  ddwin-search-koujien-selection
	  ddwin-search-chujiten-selection
	  ddwin-search-pc-selection
	  ddwin-search-group-j-selection
	  ddwin-search-group-e-selection
	  ddwin-search-group-bible-selection
	  ddwin-search-group-pc-selection
	  ddwin-search-group-all-selection
	  get-current-word-or-selection
	  backward-word-stop
	  ;goto-word-head
	  ;init-ddwin-menu
	  ))

;;;;;;;;;;;;;;;;DDwin
(defun ddwin-app ()
  (interactive)
  (launch-application "C:/Program Files/DDwin/ddwin.exe"))

;;launch-applicationの指定例  引数はDDwinへ;;(ddwin-search-chujiten-selection)
;; "C:/Program Files/DDwin/ddwin.exe" DDwinのパス
;; , "2" DDwinを複数起動しない
;; , "日本語" グループ
;; , "5番目" 研究社
;; , "word" 検索文字 

;;;;;;;;;;;;;;;;単辞書指定
;;"日本語" グループ
;; , １番目　漢字源
(defun ddwin-search-kanjigen-selection ()
  (interactive)
  (let ((word (get-current-word-or-selection)))
	(launch-application (concat "C:/Program Files/DDwin/ddwin.exe ,2,日本語,1," word))))

;; , ２番目　広辞苑
(defun ddwin-search-koujien-selection ()
  (interactive)
  (let ((word (get-current-word-or-selection)))
	(launch-application (concat "C:/Program Files/DDwin/ddwin.exe ,2,日本語,2," word))))

;; , ５番目　研究社（英和　和英）
(defun ddwin-search-chujiten-selection ()
  (interactive)
  (let ((word (get-current-word-or-selection)))
	(launch-application (concat "C:/Program Files/DDwin/ddwin.exe ,2,日本語,5," word))))

;;"PC" グループ
;; , ３番目 通信用
(defun ddwin-search-pc-selection ()
  (interactive)
  (let ((word (get-current-word-or-selection)))
	(launch-application (concat "C:/Program Files/DDwin/ddwin.exe ,2,PC,3," word))))

;;;;;;;;;;;;;;;;グループ辞書指定
;;グループ串刺し検索 / 日本語 : 漢字源 広辞苑 付属資 三省堂 研究社 ５ヶ国
(defun ddwin-search-group-j-selection ()
  (interactive)
  (let ((word (get-current-word-or-selection)))
    (launch-application (concat "C:/Program Files/DDwin/ddwin.exe ,2,日本語,G1," word))))

;;グループ串刺し検索 / 外国語 : 研究社 英スペ スペ英 英イタ イタ英 英-仏 仏-英 コ英独 コ独英 英-中
(defun ddwin-search-group-e-selection ()
  (interactive)
  (let ((word (get-current-word-or-selection)))
    (launch-application (concat "C:/Program Files/DDwin/ddwin.exe ,2,外国語,G1," word))))

;;グループ串刺し検索 / Bible : Eas HIT 研究社
(defun ddwin-search-group-bible-selection ()
  (interactive)
  (let ((word (get-current-word-or-selection)))
    (launch-application (concat "C:/Program Files/DDwin/ddwin.exe ,2,Bible,G1," word))))

;;グループ串刺し検索 / PC : FOL VER 通信用 研究社
(defun ddwin-search-group-pc-selection ()
  (interactive)
  (let ((word (get-current-word-or-selection)))
    (launch-application (concat "C:/Program Files/DDwin/ddwin.exe ,2,PC,G1," word))))

;;グループ串刺し検索 / 全ての辞書
(defun ddwin-search-group-all-selection ()
  (interactive)
  (let ((word (get-current-word-or-selection)))
    (launch-application (concat "C:/Program Files/DDwin/ddwin.exe ,2,全ての辞書,G1," word))))
    
;;;;;;;;;;;;;;;;文字列の取得
(defun get-current-word-or-selection ()
  (interactive)
  (let (word)
    (if (pre-selection-p)
	(let ((start (selection-point))
	      (end (selection-mark)))
	  (setq word (buffer-substring start end)))
      (save-excursion ;;カーソル位置、インサーションポイントを戻してやる
	(setq word
	      (buffer-substring
	       ;(progn (goto-word-head) (point))
	       ;(progn (backward-word) (point))
	       ;(point) ;;上手く頭が取れないのでカーソル位置に頭
	       (progn (backward-word-stop) (point)) ;;単語の頭で移動を止める
	       (progn (forward-word) (point)))
	      )
	))
    word))

;;;;;;;;;;;;;;;;単語の頭で移動を止める
;(char= (preceding-char) #\LFD) ;#\SPC ;#\^ ;#\TAB
;(char= (following-char) (character "^")
;(setq pchar (preceding-char))
;(when (/= 0 (point))
;(forward-char 1)
;(looking-back " ")

;;forward-word -1 記号などはとばしてしまうので
;;(unless (looking-at "\\<");;単語の行頭にマッチは英数字のみなので
;;漢字とカタカナは単語、ひらがなはとばすみたいなので
;;前のキャラが空白などの時は止まるようにする
;;でも後のキャラが同じく空白などの時は移動する

;;動的に。。。はダメ。仕方ないので動的なものは捨てて、確実に止まる形で固定
;;英数字の単語の頭なら止める
;;前が空白で、後ろが空白でないなら止める
(defun backward-word-stop ()
  (interactive)
  (when (forward-char -1)
    (setq bchar (looking-at "\\([ \t　\n]\\)"))
    (forward-char 1)
    (setq fchar (looking-at "\\([ \t　\n]\\)"))
    (unless (or (looking-at "\\<")
		(and bchar
		     (null fchar)))
      (forward-word -1))
    )
  )

#|
;;動的にストップと動くを繰り返せるように。。。と、だが、
;;変数で２回目のチェックはだめ。ユーザーの任意でカーソルの位置が変わってくる。。。
(defvar-local *b-w-stop* nil)

(defun backward-word-stop ()
  (interactive)
  ;;英数字の単語の頭をチェック
  (if (looking-at "\\<")

      ;;頭なら
      (if *b-w-stop*
	  (progn
	    (forward-word -1) ;;２回目は動いて
	    (setq *b-w-stop* nil) ;;初期化
	    )
	(setq *b-w-stop* t) ;;最初の１回は止まって
	)

    ;;頭でないなら ;;後ろの空白タブ改行をチェック
    (if (looking-at "\\([ \t　\n]\\)")
	;;空白なら動いて頭へ
	(progn
	  (forward-word -1)
	  (setq *b-w-stop* nil))
      ;;空白でないなら ;;前の空白タブ改行をチェック
      (if (looking-back "\\([ \t　\n]\\)")
	  ;;頭なら
	  (if *b-w-stop*
	      (progn
		(forward-word -1) ;;２回目は動いて
		(setq *b-w-stop* nil) ;;初期化
		)
	    (setq *b-w-stop* t) ;;最初の１回は止まって
	    )
	;;頭でないなら動く
	(progn
	  (forward-word -1)
	  (setq *b-w-stop* nil))
	)
      )
    )
  )
|#

#|
;;;;;;;;;;;;;;;;
;; 単語の先頭
(defun goto-word-head ()
  (cond ((looking-at " ")
		 (backward-word 1))
		((looking-at "\\<"))
		(t
		 (backward-word 1))))
|#

;;;;;;;;;;;;;;;; 挿入メニュー６　insert menu tools ツール
;;ツールの頭に挿入 menu item 0
(defvar *ddwin-popup-menu* nil)

;;Altの割り当てキーに困るな。。。とりあえずAlt-Q
(add-hook '*init-app-menus-hook*
	  #'(lambda ()
	      (init-ddwin-menu)
	      (when (setq menu (get-menu *app-menu* 'ed::tools))
		(insert-popup-menu menu 0 *ddwin-popup-menu* "辞書DDwin(&Q)")
		(insert-menu-separator menu 1 'tool-ddwin-sep)
		)
	      )
	  )

(defun init-ddwin-menu ()
  (or *ddwin-popup-menu*
      (setq *ddwin-popup-menu* (create-popup-menu)))

  (setq *ddwin-popup-menu*
	(define-popup-menu
	  (:item nil "ddwin起動(&D)"
	   'ddwin-app)
	  :sep
	  (:item nil "漢字源(&J)"
	   'ddwin-search-kanjigen-selection)
	  (:item nil "広辞苑(&K)"
	   'ddwin-search-koujien-selection)
	  (:item nil "研究社（英和和英）(&E)"
	   'ddwin-search-chujiten-selection)
	  (:item nil "PC：通信用(&P)"
	   'ddwin-search-pc-selection)
	  :sep
	  (:item nil "ｸﾞﾙｰﾌﾟ：日本語(&N)"
	   'ddwin-search-group-j-selection)
	  (:item nil "ｸﾞﾙｰﾌﾟ：外国語(&F)"
	   'ddwin-search-group-e-selection)
	  (:item nil "ｸﾞﾙｰﾌﾟ：Bible(&B)"
	   'ddwin-search-group-bible-selection)
	  (:item nil "ｸﾞﾙｰﾌﾟ：PC(&C)"
	   'ddwin-search-group-pc-selection)
	  (:item nil "ｸﾞﾙｰﾌﾟ：全ての辞書(&A)"
	   'ddwin-search-group-all-selection)
	  )
	)
  )

;;;;;;;;;;;;;;;; 挿入メニュー　右クリック　バッファー
(add-hook '*init-app-menus-hook*
	  #'(lambda ()
	      (init-ddwin-menu)
	      (when *app-popup-menu*
		(setq ip -1)
		(while (get-menu *app-popup-menu* (incf ip) t))
		(insert-menu-separator *app-popup-menu* ip 'ddwin-sep)
		(insert-popup-menu *app-popup-menu* (incf ip) *ddwin-popup-menu* "辞書DDwin(&Q)")
		)
	      )
	  )

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#|
;;;これを呼び出す
(defun launch-application (app)
  (interactive "e% " :history0 'execute)
  (call-process app :no-std-handles t :show :show
		:exec-directory *launch-app-directory*))
|#

;;;;;;;;;;;;;;;;(defun launch-application (app) の指定
;;;original product was made by suda.
;;;arranged by TKI.
;;;parameter は DDWIN を参照してください。とのこと。。。

;;;まとめ　グループのあるとき
;;;DDwinパス　DDwinの起動方法　グループ名　辞書番号またはサブグループ　検索文字

;;;DDwinのパス
;"C:/Program Files/DDwin/ddwin.exe"

;;;1 環境設定ファイル　env-file ;;この指定はないのかな？よくわからない。１つずれるようのでなしで。。。
;1

;;;DDwinの起動　0/未指定…制限しない 1…同じグループは起動しない 2…複数起動しない
;2

;;;未指定なら前回使用したグループが開かれる
;"日本語"

;;;辞書番号 単独の辞書またはサブグループを指定する
;;;1…一つ目の辞書を開く  以下2、3など
;;;G1…一つ目のグループに対して串刺し検索  以下G2、G3など
;;;未指定…選択状態の辞書で串刺し検索
;5 ;;５番目研究社

;;;検索文字
;word


;;(launch-application (concat "C:/Program Files/DDwin/ddwin.exe ,1,研究社,1," word))
;;(launch-application (concat "C:/Program Files/DDwin/ddwin.exe ,1,日本語,5," word));;5番目研究社
