Ignore:
Timestamp:
Sep 10, 2009, 1:57:04 PM (10 years ago)
Author:
gfoy
Message:

Snazzy new notification dialog, I think.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/contrib/foy/context-menu-cm/context-menu-dialogs.lisp

    r12778 r12802  
    2121
    2222(export '(notify window-with-path active-hemlock-window window-path echo-msg))
     23
     24(defparameter *clozure-jpg* (merge-pathnames ";Clozure.jpg" cl-user::*context-menu-directory*))
     25(defparameter *graphic-p* t "To use, or not to use the Clozure graphic.")
     26
    2327
    2428(defun active-hemlock-window ()
     
    6064        (hi::message string args)))))
    6165
    62 (defun notify (message)
     66(defun notify (message &rest args)
    6367  "FYI"
    64   (gui::alert-window :title "Notification" :message message))
     68  (let ((message-string (apply #'format nil message args)))
     69    (if *graphic-p*
     70      (open-notification-dialog message-string)
     71      (gui::alert-window :title "Notification" :message message-string))))
     72
     73(defparameter *notify-dialog* nil "The notification-dialog instance.")
     74
     75;;; ----------------------------------------------------------------------------
     76;;;
     77(defclass NOTIFICATION-DIALOG (ns:ns-window)
     78  ((message-field :initform nil :accessor nd-message-field)
     79   (okay-button :initform nil :accessor nd-okay-button))
     80  (:documentation "A dialog for displaying messages.")
     81  (:metaclass ns:+ns-object))
     82
     83(objc:defmethod (#/okayAction: :void) ((d notification-dialog) (sender :id))
     84  (declare (ignore sender))
     85  (#/stopModalWithCode: ccl::*nsapp* 0))
     86
     87(defun open-notification-dialog (message)
     88  "Open the notification-dialog and display MESSAGE."
     89  (let ((message-string (#/initWithString:attributes: (#/alloc ns:ns-attributed-string)
     90                                                      (ccl::%make-nsstring message)
     91                                                      cmenu::*tool-doc-dictionary*)))
     92    (cond (*notify-dialog*
     93           (#/setStringValue: (nd-message-field *notify-dialog*) message-string)
     94           (#/makeKeyAndOrderFront: *notify-dialog* nil)
     95           (#/runModalForWindow: ccl::*nsapp* *notify-dialog*)
     96           (#/close *notify-dialog*))
     97          (t
     98           (let ((dialog (#/alloc notification-dialog)))
     99             (setq *notify-dialog* dialog)
     100             (ns:with-ns-rect (r 10 300 400 127)
     101               (#/initWithContentRect:styleMask:backing:defer:
     102                dialog
     103                r
     104                #$NSTitledWindowMask
     105                #$NSBackingStoreBuffered
     106                #$NO))
     107             (dolist (item (get-notify-items dialog))
     108               (#/addSubview: (#/contentView dialog) item))
     109             (#/setTitle: dialog #@"Notification")
     110             (#/setReleasedWhenClosed: dialog nil)
     111             (#/setDefaultButtonCell: dialog (nd-okay-button dialog))
     112             (#/setStringValue: (nd-message-field dialog) message-string)
     113             (#/center dialog)
     114             (#/makeKeyAndOrderFront: dialog nil)
     115             (#/runModalForWindow: ccl::*nsapp* dialog)
     116             (#/close dialog))))))
     117
     118#|
     119(open-notification-dialog "foobear")
     120|#
     121
     122(defmethod get-notify-items ((d notification-dialog))
     123  (append
     124   (make-notify-graphic)
     125   ;; (make-notify-prompt)
     126   (make-notify-message d)
     127   (make-notify-button d)))
     128
     129(defun make-notify-graphic ()
     130  "Create the Clozure graphic."
     131  (when (probe-file *clozure-jpg*)
     132    (let ((image (#/alloc ns:ns-image))
     133          (image-view (#/alloc ns:ns-image-view)))
     134      (ns:with-ns-rect (frame 0 0 108 127)
     135        (#/initWithFrame: image-view frame))
     136      (#/setImageScaling: image-view #$NSScaleToFit)
     137      (#/initWithContentsOfFile: image (ccl::%make-nsstring (namestring *clozure-jpg*)))
     138      (#/setImage: image-view image)
     139      (list image-view))))
     140
     141(defun make-notify-prompt ()
     142  "Create the prompt text-field."
     143  (list
     144   (let* ((string (#/initWithString:attributes:
     145                   (#/alloc ns:ns-attributed-string)
     146                   #@"Notification"
     147                   cmenu::*tool-label-dictionary*))
     148          (title (#/alloc ns:ns-text-field)))
     149     (ns:with-ns-rect (frame 120 90 150 32)
     150       (#/initWithFrame: title frame))
     151     (#/setEditable: title nil)
     152     (#/setDrawsBackground: title nil)
     153     (#/setBordered: title nil)
     154     (#/setStringValue: title string)
     155     title)))
     156
     157(defun make-notify-message (dialog)
     158  "Create the documentation text-view."
     159  (list
     160   (let ((field (#/alloc ns:ns-text-field)))
     161     (ns:with-ns-rect (frame 120 50 270 60)
     162       (#/initWithFrame: field frame))
     163     (#/setEditable: field nil)
     164     (#/setDrawsBackground: field nil)
     165     (#/setBordered: field nil)
     166     (setf (nd-message-field dialog) field))))
     167
     168(defun make-notify-button (dialog)
     169  "Construct the button."
     170  (list
     171   (let ((button (#/alloc ns:ns-button)))
     172     (ns:with-ns-rect (frame 310 10 80 32)
     173       (#/initWithFrame: button frame))
     174     (#/setButtonType: button #$NSMomentaryPushInButton)
     175     (#/setBezelStyle: button #$NSRoundedBezelStyle)
     176     (#/setTitle: button #@"Okay")
     177     (#/setTarget: button dialog)
     178     (#/setAction: button (ccl::@selector "okayAction:"))
     179     (setf (nd-okay-button dialog) button))))
    65180
    66181
    67182
    68183
     184
Note: See TracChangeset for help on using the changeset viewer.