Changeset 6711


Ignore:
Timestamp:
Jun 12, 2007, 12:59:09 PM (17 years ago)
Author:
Gary Byers
Message:

Lisp menu stuff (restarts dialog, etc.)
Listener window menu validation to move cmd-l key equivalent around.


File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/ide-1.0/ccl/examples/cocoa-listener.lisp

    r6682 r6711  
    101101         
    102102
     103(defclass hemlock-listener-frame (hemlock-frame)
     104    ()
     105  (:metaclass ns:+ns-object))
    103106
    104107
     
    229232
    230233(defun hemlock::listener-document-send-string (document string)
    231   (let* ((controller (#/objectAtIndex: (#/windowControllers document) 0))
    232          (filehandle (slot-value controller 'filehandle))
    233          (len (length string))
    234          (data (#/autorelease (make-instance 'ns:ns-mutable-data
    235                                              :with-length len)))
    236          (bytes (#/mutableBytes data)))
    237     (%cstr-pointer string bytes nil)
    238     (#/writeData: filehandle data)
    239     (#/synchronizeFile filehandle)))
     234  (let* ((buffer (hemlock-document-buffer document))
     235         (process (if buffer (hi::buffer-process buffer))))
     236    (if process
     237      (hi::send-string-to-listener-process process string))))
    240238
    241239
     
    269267  nil)
    270268
     269
     270
    271271(objc:defmethod #/init ((self hemlock-listener-document))
    272272  (let* ((doc (call-next-method)))
     
    292292(defloadvar *next-listener-y-pos* nil) ; likewise
    293293
     294(objc:defmethod (#/close :void) ((self hemlock-listener-document))
     295  (if (zerop (decf *cocoa-listener-count*))
     296    (setq *next-listener-x-pos* nil
     297          *next-listener-y-pos* nil))
     298  (call-next-method))
     299
    294300(objc:defmethod (#/makeWindowControllers :void) ((self hemlock-listener-document))
    295301  (let* ((textstorage (slot-value self 'textstorage))
    296302         (window (%hemlock-frame-for-textstorage
     303                  hemlock-listener-frame
    297304                  textstorage
    298305                  *listener-columns*
     
    335342      (ccl::force-break-in-listener process))))
    336343
     344(objc:defmethod (#/continue: :void) ((self hemlock-listener-document) sender)
     345  (declare (ignore sender))
     346  (let* ((buffer (hemlock-document-buffer self))
     347         (process (if buffer (hi::buffer-process buffer))))
     348    (when (typep process 'cocoa-listener-process)
     349      (process-interrupt process #'continue))))
     350
     351(objc:defmethod (#/exitBreak: :void) ((self hemlock-listener-document) sender)
     352  (declare (ignore sender))
     353  (let* ((buffer (hemlock-document-buffer self))
     354         (process (if buffer (hi::buffer-process buffer))))
     355    (when (typep process 'cocoa-listener-process)
     356      (process-interrupt process #'abort-break))))
     357
    337358(defmethod listener-backtrace-context ((proc cocoa-listener-process))
    338359  (car (cocoa-listener-process-backtrace-contexts proc)))
    339360
    340361(objc:defmethod (#/backtrace: :void) ((self hemlock-listener-document) sender)
    341   (declare (ignore sender))
    342362  (let* ((buffer (hemlock-document-buffer self))
    343363         (process (if buffer (hi::buffer-process buffer))))
     
    345365      (let* ((context (listener-backtrace-context process)))
    346366        (when context
    347           (#/showWindow: (backtrace-controller-for-context context) +null-ptr+))))))
     367          (#/showWindow: (backtrace-controller-for-context context) sender))))))
     368
     369(defun restarts-controller-for-context (context)
     370  (or (car (bt.restarts context))
     371      (setf (car (bt.restarts context))
     372            (let* ((tcr (bt.tcr context))
     373                   (tsp-range (inspector::make-tsp-stack-range tcr context))
     374                   (vsp-range (inspector::make-vsp-stack-range tcr context))
     375                   (csp-range (inspector::make-csp-stack-range tcr context))
     376                   (process (tcr->process (bt.tcr context))))
     377              (make-instance 'sequence-window-controller
     378                             :sequence (cdr (bt.restarts context))
     379                             :result-callback #'(lambda (r)
     380                                                  (process-interrupt
     381                                                   process
     382                                                   #'invoke-restart-interactively
     383                                                   r))
     384                             :display #'(lambda (item stream)
     385                                          (let* ((ccl::*aux-vsp-ranges* vsp-range)
     386                                                 (ccl::*aux-tsp-ranges* tsp-range)
     387                                                 (ccl::*aux-csp-ranges* csp-range))
     388                                          (princ item stream)))
     389                             :title (format nil "Restarts for ~a(~d), break level ~d"
     390                                            (process-name process)
     391                                            (process-serial-number process)
     392                                            (bt.break-level context)))))))
     393                           
     394(objc:defmethod (#/restarts: :void) ((self hemlock-listener-document) sender)
     395  (let* ((buffer (hemlock-document-buffer self))
     396         (process (if buffer (hi::buffer-process buffer))))
     397    (when (typep process 'cocoa-listener-process)
     398      (let* ((context (listener-backtrace-context process)))
     399        (when context
     400          (#/showWindow: (restarts-controller-for-context context) sender))))))
    348401
    349402(objc:defmethod (#/continue: :void) ((self hemlock-listener-document) sender)
     
    354407      (let* ((context (listener-backtrace-context process)))
    355408        (when context
    356           (hi::send-string-to-listener-process process ":go
    357 "))))))
     409          (process-interrupt process #'invoke-restart-interactively 'continue))))))
     410
     411
     412
    358413
    359414
     
    374429          ((eql action (@selector #/revertDocumentToSaved:))
    375430           (values t nil))
     431          ((eql action (@selector #/makeKeyAndOrderFront:))
     432           (let* ((target (#/target item))
     433                  (window (cocoa-listener-process-window process)))
     434             (if (eql target window)
     435               (progn
     436                 (#/setKeyEquivalent: item #@"L")
     437                 (#/setKeyEquivalentModifierMask: item #$NSCommandKeyMask))
     438               (#/setKeyEquivalent: item #@""))
     439             (values t t)))
    376440          ((eql action (@selector #/interrupt:)) (values t t))
    377           ((eql action (@selector #/backtrace:))
     441          ((eql action (@selector #/continue:))
     442           (let* ((context (listener-backtrace-context process)))
     443             (values
     444              t
     445              (and context
     446                   (find 'continue (cdr (bt.restarts context))
     447                         :key #'restart-name)))))
     448          ((or (eql action (@selector #/backtrace:))
     449               (eql action (@selector #/exitBreak:))
     450               (eql action (@selector #/restarts:)))
    378451           (values t
    379452                   (not (null (listener-backtrace-context process)))))))
     
    455528      (destructuring-bind (package path string) selection
    456529        (hi::send-string-to-listener-process target-listener string :package package :path path)))))
    457  
     530
     531;;; Give the windows menu item for the top listener a command-key
     532;;; equivalent of cmd-L.  Remove command-key equivalents from other windows.
     533;;; (There are probably other ways of doing this.)
     534(objc:defmethod (#/validateMenuItem: :<BOOL>) ((self hemlock-listener-frame)
     535                                               item)
     536  (let* ((action (#/action item)))
     537    (when (eql action (@selector #/makeKeyAndOrderFront:))
     538      (let* ((target (#/target item)))
     539        (when (eql target self)
     540          (let* ((top-doc (#/topListener hemlock-listener-document))
     541                 (our-doc (#/document (#/windowController self))))
     542            (if (eql our-doc top-doc)
     543              (progn
     544                (#/setKeyEquivalent: item #@"l")
     545                (#/setKeyEquivalentModifierMask: item #$NSCommandKeyMask))
     546              (#/setKeyEquivalent: item +null-ptr+)))))))
     547  (call-next-method item))
    458548
    459549
Note: See TracChangeset for help on using the changeset viewer.