source: trunk/source/cocoa-ide/xinspector.lisp @ 12006

Last change on this file since 12006 was 12006, checked in by rme, 10 years ago

Checkpoint work-in-progress.

File size: 4.6 KB
Line 
1(in-package "INSPECTOR")
2
3(defloadvar *inspector-cascade-point* (ns:make-ns-point 0 0))
4
5(defclass xinspector-window-controller (ns:ns-window-controller)
6  ((inspector :initarg :inspector :reader inspector)
7   ;; outlets
8   (action-menu :foreign-type :id :accessor action-menu)
9   (refresh-button :foreign-type :id :accessor refresh-button)
10   (back-forward-control :foreign-type :id :accessor back-forward-control)
11   (table-view :foreign-type :id :accessor table-view)
12   (contextual-menu :foreign-type :id :accessor contextual-menu)
13  ;; data source variables
14   (row-objects :foreign-type :id :reader row-objects))
15  (:metaclass ns:+ns-object))
16
17(defmethod (setf inspector) (new-inspector (wc xinspector-window-controller))
18  (update-line-count new-inspector)
19  (#/removeAllObjects (row-objects wc))
20  (let ((n (#/null ns:ns-null)))
21    (dotimes (i (inspector-line-count new-inspector))
22      (#/addObject: (row-objects wc) n)))
23  (setf (slot-value wc 'inspector) new-inspector))
24
25(objc:defmethod #/init ((wc xinspector-window-controller))
26  ;; Lisp slots are not set up yet when we are called.
27  (let ((self (#/initWithWindowNibName: wc #@"xinspector")))
28    (unless (%null-ptr-p self)
29      (with-slots (row-objects) wc
30        (setf row-objects (make-instance 'ns:ns-mutable-array))))
31    self))
32
33(defmethod initialize-instance :after ((wc xinspector-window-controller) &key inspector 
34                                       &allow-other-keys)
35  (setf (inspector wc) inspector))
36
37(objc:defmethod (#/dealloc :void) ((wc xinspector-window-controller))
38  (#/release (slot-value wc 'row-objects))
39  (call-next-method))
40
41(objc:defmethod (#/windowDidLoad :void) ((wc xinspector-window-controller))
42  (#/setDoubleAction: (table-view wc) (ccl::@selector #/inspect:))
43  (setq *inspector-cascade-point*
44        (#/cascadeTopLeftFromPoint: (#/window wc) *inspector-cascade-point*)))
45
46(objc:defmethod (#/windowWillClose: :void) ((wc xinspector-window-controller) notification)
47  (declare (ignore notification))
48  (#/autorelease wc))
49
50(objc:defmethod (#/backOrForward: :void) ((wc xinspector-window-controller) sender)
51  (if (= (#/selectedSegment sender) 0)
52    (format *trace-output* "~&go back")
53    (format *trace-output* "~&go forward")))
54
55(objc:defmethod (#/inspect: :void) ((wc xinspector-window-controller) sender)
56  (declare (ignore sender))
57  (let* ((row (#/selectedRow (table-view wc)))
58         (clicked-row (#/clickedRow (table-view wc))))
59    (when (/= clicked-row -1)
60      (setq row clicked-row))
61    (inspector::cocoa-inspect (inspector::line-n (slot-value wc 'inspector) row))))
62
63;;; NSTableView data source methods
64
65(objc:defmethod (#/numberOfRowsInTableView: #>NSInteger) ((self xinspector-window-controller)
66                                                          table-view)
67  (declare (ignore table-view))
68  (#/count (row-objects self)))
69
70(objc:defmethod #/tableView:objectValueForTableColumn:row: ((self xinspector-window-controller)
71                                                            table-view table-column
72                                                            (row #>NSInteger))
73  (declare (ignore table-view table-column))
74  (with-slots (inspector row-objects) self
75    (when (eql (#/objectAtIndex: row-objects row) (#/null ns:ns-null))
76      (let* ((name (ccl::%make-nsstring (with-output-to-string (s)
77                                          (prin1-line-n inspector s row)))))
78        (#/replaceObjectAtIndex:withObject: row-objects row name)
79        (#/release name)))
80    (#/objectAtIndex: row-objects row)))
81
82(objc:defmethod (#/tableView:isGroupRow: #>BOOL) ((wc xinspector-window-controller)
83                                                  table-view
84                                                  (row #>NSInteger))
85  (declare (ignore table-view))
86  (with-accessors ((seq sequence)) wc
87    (let ((type (nth-value 2 (inspector::line-n (slot-value wc 'inspector) row))))
88      (if (consp type) (setq type (car type)))
89      (eq type :comment))))
90
91(objc:defmethod (#/tableView:shouldSelectRow: #>BOOL) ((wc xinspector-window-controller)
92                                                       table-view
93                                                       (row #>NSInteger))
94  (declare (ignore table-view))
95  (with-accessors ((seq sequence)) wc
96    (let ((type (nth-value 2 (inspector::line-n (slot-value wc 'inspector) row))))
97      (if (consp type) (setq type (car type)))
98      (neq type :comment))))
99
100(defun cocoa-inspect (thing)
101  (gui::execute-in-gui #'(lambda ()
102                           (let ((wc (make-instance 'xinspector-window-controller
103                                       :inspector (make-inspector thing))))
104                             (#/showWindow: wc nil)))))
105
Note: See TracBrowser for help on using the repository browser.