;;;; it-lookup.lisp
(defpackage #:it-lookup-clim
(:use #:clim #:clim-lisp #:it-lookup))
(in-package #:it-lookup-clim)
(declaim (optimize (debug 3)))
(define-application-frame
it-lookup ()
((results :initform (make-instance 'it-lookup::it-results :query "amicus")
:accessor results)
(cursor :initform 0 :accessor cursor))
(:pointer-documentation t)
(:panes
(app :application
:height 400 :width 600
:incremental-redisplay t
:double-buffering t
;:display-time nil
:display-function #'display-app
)
(int :interactor :height 100 :width 600))
(:layouts
(default (horizontally () app int))))
(defun display-app (frame pane)
(let ((history (stream-output-history pane)))
(loop for element across (it-lookup::cases (results frame))
do (add-output-record (with-output-to-output-record (pane)
(terpri pane)
(it-lookup::format-result element pane)
(terpri pane))
history))
(climacs-flexichain-output-history:change-space-requirements history)
(clim:replay history pane)))
(define-presentation-type reference ())
(defmethod it-lookup::format-reference :around ((it-case it-lookup::it-case)
(stream clim:extended-output-stream))
(clim:with-text-style (stream '(:serif :bold 16))
(with-output-as-presentation (stream it-case 'reference)
(call-next-method))))
(defmethod it-lookup::format-reference :around ((it-case it-lookup::it-case)
(stream sb-pretty:pretty-stream))
(let ((real-stream (it-lookup::get-real-stream stream)))
(terpri stream)
(it-lookup::format-reference it-case real-stream)))
(defun display-data (&rest args)
(get-data))
(defun get-data ()
(return-from get-data)
(let* ((pane (find-pane-named *application-frame* 'app))
(history (stream-output-history pane)))
(loop for element across (it-lookup::cases (results *application-frame*))
for n from 0
do (let ((record (clim:with-output-to-output-record (pane)
(it-lookup::format-result element pane)
(terpri pane))))
#|(climb:ou history record n)|#))
(climacs-flexichain-output-history:change-space-requirements history)
(clim:replay history pane)))
(defclass no-clear-output-history (climacs-flexichain-output-history:flexichain-output-history)
())
(defmethod clear-output-record ((h no-clear-output-history)))
(defmethod generate-panes :after ((fm frame-manager) (frame it-lookup))
(let ((*application-frame* frame))
(let ((pane (clim:find-pane-named frame 'app)))
(unless pane (break))
(setf (clim:stream-recording-p pane) nil)
(setf (clim:stream-end-of-line-action pane) :allow)
(change-class (clim:stream-output-history pane)
;'climacs-flexichain-output-history:flexichain-output-history
'no-clear-output-history
:parent pane))))
(defun app-main ()
(let* ((frame (make-application-frame 'it-lookup))
(*application-frame* frame))
(with-accessors ((results results)) frame
(parse-results results
(run-query results)))
(run-frame-top-level frame)))
(define-it-lookup-command (com-inspect :name t) ()
(clouseau:inspector
(clim:stream-output-history
(clim:find-pane-named clim:*application-frame* 'app))))
(define-it-lookup-command (get-records :name t) ()
(get-data))
(define-it-lookup-command (com-quit :name t) ()
(frame-exit *application-frame*))
(defparameter *saved-cases* nil)
(defun save-case (case) (push case *saved-cases*))
(define-it-lookup-command (com-save :name t) ((it-case 'reference))
(save-case it-case)
it-case)
(define-it-lookup-command (com-prev :name t) ()
(let ((results (results *application-frame*)))
(with-accessors ((page it-lookup::page)) results
(when (> page 0)
(decf page)))
(parse-results results
(run-query results))))
(define-it-lookup-command (com-next :name t) ()
(let ((results (results *application-frame*)))
(incf (it-lookup::page results))
(parse-results results
(run-query results))))
(setf mcclim-truetype:*truetype-font-path* "/Library/Fonts/")
(app-main)
|