• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /macosx-10.9.5/emacs-92/emacs/lisp/progmodes/

Lines Matching +defs:ebrowse +defs:tags +defs:find +defs:definition +defs:other +defs:frame

0 ;;; ebrowse.el --- Emacs C++ class browser & tags facility
9 ;; Keywords: C++ tags tools
33 ;; - A complete set of tags-like functions working on class trees
52 (defgroup ebrowse nil
57 (defcustom ebrowse-search-path nil
60 to find source files relative to the location of the BROWSE file loaded."
61 :group 'ebrowse
66 (defcustom ebrowse-view/find-hook nil
68 :group 'ebrowse
72 (defcustom ebrowse-not-found-hook nil
74 :group 'ebrowse
78 (defcustom ebrowse-electric-list-mode-hook nil
79 "*Hook called by `ebrowse-electric-position-mode'."
80 :group 'ebrowse
84 (defcustom ebrowse-max-positions 50
86 :group 'ebrowse
92 (defgroup ebrowse-tree nil
94 :group 'ebrowse)
97 (defcustom ebrowse-tree-mode-hook nil
99 :group 'ebrowse-tree
103 (defcustom ebrowse-tree-buffer-name "*Tree*"
105 :group 'ebrowse-tree
109 (defcustom ebrowse--indentation 4
111 :group 'ebrowse-tree
115 (defcustom ebrowse-source-file-column 40
117 :group 'ebrowse-tree
121 (defcustom ebrowse-tree-left-margin 2
124 :group 'ebrowse-tree
130 (defgroup ebrowse-member nil
132 :group 'ebrowse)
135 (defcustom ebrowse-default-declaration-column 25
137 :group 'ebrowse-member
141 (defcustom ebrowse-default-column-width 25
143 :group 'ebrowse-member
147 (defcustom ebrowse-member-buffer-name "*Members*"
149 :group 'ebrowse-member
153 (defcustom ebrowse-member-mode-hook nil
155 :group 'ebrowse-member
161 (defgroup ebrowse-faces nil
163 :group 'ebrowse)
166 (defface ebrowse-tree-mark
170 :group 'ebrowse-faces)
172 (put 'ebrowse-tree-mark-face 'face-alias 'ebrowse-tree-mark)
175 (defface ebrowse-root-class
179 :group 'ebrowse-faces)
181 (put 'ebrowse-root-class-face 'face-alias 'ebrowse-root-class)
184 (defface ebrowse-file-name
187 :group 'ebrowse-faces)
189 (put 'ebrowse-file-name-face 'face-alias 'ebrowse-file-name)
192 (defface ebrowse-default
194 "*Face for everything else in the tree not having other faces."
195 :group 'ebrowse-faces)
197 (put 'ebrowse-default-face 'face-alias 'ebrowse-default)
200 (defface ebrowse-member-attribute
204 :group 'ebrowse-faces)
206 (put 'ebrowse-member-attribute-face 'face-alias 'ebrowse-member-attribute)
209 (defface ebrowse-member-class
212 :group 'ebrowse-faces)
214 (put 'ebrowse-member-class-face 'face-alias 'ebrowse-member-class)
217 (defface ebrowse-progress
221 :group 'ebrowse-faces)
223 (put 'ebrowse-progress-face 'face-alias 'ebrowse-progress)
230 (defun ebrowse-some (predicate vector)
242 (defun ebrowse-every (predicate vector)
253 (defun ebrowse-position (item list &optional test)
270 (defun ebrowse-delete-if-not (predicate list)
283 (defmacro ebrowse-output (&rest body)
286 (let ((modified (make-symbol "--ebrowse-output--")))
293 (defmacro ebrowse-ignoring-completion-case (&rest body)
299 (defmacro ebrowse-save-selective (&rest body)
308 (defmacro ebrowse-for-all-trees (spec &rest body)
314 as ,spec-var = (get ,var 'ebrowse-root) do
320 (put 'ebrowse-output 'lisp-indent-hook 0)
321 (put 'ebrowse-ignoring-completion-case 'lisp-indent-hook 0)
322 (put 'ebrowse-save-selective 'lisp-indent-hook 0)
323 (put 'ebrowse-for-all-trees 'lisp-indent-hook 1)
326 (defsubst ebrowse-set-face (start end face)
331 (defun ebrowse-completing-read-value (prompt table initial-input)
341 (ebrowse-ignoring-completion-case
345 (defun ebrowse-value-in-buffer (sym buffer)
355 (defun ebrowse-rename-buffer (new-name)
365 (defun ebrowse-trim-string (string)
375 (defun ebrowse-width-of-drawable-area ()
378 otherwise use the current frame's width."
382 (frame-width))))
388 (defstruct (ebrowse-hs (:type vector) :named)
405 (defstruct (ebrowse-ts (:type vector) :named)
408 of `ebrowse-ts' structures, each one describing one root class of
410 ;; A `ebrowse-cs' structure describing the root class.
412 ;; A list of `ebrowse-ts' structures for all subclasses.
414 ;; Lists of `ebrowse-ms' structures for each member in a group of
418 ;; List of `ebrowse-ts' structures for base classes. This slot is
425 (defstruct (ebrowse-bs (:type vector) :named)
438 ;; `ebrowse-ms' member description structure, and FILE is nil, then
452 (defstruct (ebrowse-cs (:include ebrowse-bs) (:type vector) :named)
454 This is the structure stored in the CLASS slot of a `ebrowse-ts'
459 (defstruct (ebrowse-ms (:include ebrowse-bs) (:type vector) :named)
461 This is the structure describing a single member. The `ebrowse-ts'
466 ;; The file in which the member's definition can be found.
467 definition-file
468 ;; Same as PATTERN above, but for the member definition.
469 definition-pattern
470 ;; Same as POINT above but for member definition.
471 definition-point)
478 (defsubst ebrowse-member-bit-set-p (member bit)
480 (/= 0 (logand (ebrowse-bs-flags member) bit)))
483 (defsubst ebrowse-virtual-p (member)
485 (ebrowse-member-bit-set-p member 1))
488 (defsubst ebrowse-inline-p (member)
490 (ebrowse-member-bit-set-p member 2))
493 (defsubst ebrowse-const-p (member)
495 (ebrowse-member-bit-set-p member 4))
498 (defsubst ebrowse-pure-virtual-p (member)
500 (ebrowse-member-bit-set-p member 8))
503 (defsubst ebrowse-mutable-p (member)
505 (ebrowse-member-bit-set-p member 16))
508 (defsubst ebrowse-template-p (member)
510 (ebrowse-member-bit-set-p member 32))
513 (defsubst ebrowse-explicit-p (member)
515 (ebrowse-member-bit-set-p member 64))
518 (defsubst ebrowse-throw-list-p (member)
520 (ebrowse-member-bit-set-p member 128))
523 (defsubst ebrowse-extern-c-p (member)
525 (ebrowse-member-bit-set-p member 256))
528 (defsubst ebrowse-define-p (member)
530 (ebrowse-member-bit-set-p member 512))
533 (defconst ebrowse-version-string "ebrowse 5.0"
537 (defconst ebrowse-globals-name "*Globals*"
539 This must be the same that `ebrowse' uses.")
542 (defvar ebrowse--last-regexp nil
545 (make-variable-buffer-local 'ebrowse--last-regexp)
548 (defconst ebrowse-member-list-accessors
549 '(ebrowse-ts-member-variables
550 ebrowse-ts-member-functions
551 ebrowse-ts-static-variables
552 ebrowse-ts-static-functions
553 ebrowse-ts-friends
554 ebrowse-ts-types)
558 in an `ebrowse-ts' structure.")
563 (defvar ebrowse--tree-obarray nil
564 "Obarray holding all `ebrowse-ts' structures of a class tree.
568 (defvar ebrowse--tags-file-name nil
573 (defvar ebrowse--header nil
574 "Header structure of type `ebrowse-hs' of a class tree.
578 (defvar ebrowse--frozen-flag nil
583 (defvar ebrowse--show-file-names-flag nil
588 (defvar ebrowse--long-display-flag nil
593 (defvar ebrowse--n-columns nil
598 (defvar ebrowse--column-width nil
603 (defvar ebrowse--virtual-display-flag nil
608 (defvar ebrowse--inline-display-flag nil
613 (defvar ebrowse--const-display-flag nil
618 (defvar ebrowse--pure-display-flag nil
623 (defvar ebrowse--filters nil
630 (defvar ebrowse--show-inherited-flag nil
635 (defvar ebrowse--attributes-flag nil
640 (defvar ebrowse--source-regexp-flag nil
645 (defvar ebrowse--displayed-class nil
646 "Class displayed in a member buffer, a `ebrowse-ts' structure.
650 (defvar ebrowse--accessor nil
652 This is a symbol whose function definition is an accessor for the
653 member list in `ebrowse-cs' structures.
657 (defvar ebrowse--member-list nil
658 "The list of `ebrowse-ms' structures displayed in a member buffer.
662 (defvar ebrowse--decl-column nil
667 (defvar ebrowse--frame-configuration nil
668 "Frame configuration saved when viewing a class/member in another frame.
672 (defvar ebrowse--view-exit-action nil
678 (defvar ebrowse--tree nil
683 ;;; Temporaries used to communicate with `ebrowse-find-pattern'.
685 (defvar ebrowse-temp-position-to-view nil)
686 (defvar ebrowse-temp-info-to-view nil)
689 (defvar ebrowse-tree-mode-map ()
693 (defvar ebrowse--member-mode-strings nil
697 (defvar ebrowse-member-mode-map ()
703 (put 'ebrowse-ts-member-variables 'ebrowse-title "Member Variables")
704 (put 'ebrowse-ts-member-functions 'ebrowse-title "Member Functions")
705 (put 'ebrowse-ts-static-variables 'ebrowse-title "Static Variables")
706 (put 'ebrowse-ts-static-functions 'ebrowse-title "Static Functions")
707 (put 'ebrowse-ts-friends 'ebrowse-title "Friends")
708 (put 'ebrowse-ts-types 'ebrowse-title "Types")
710 (put 'ebrowse-ts-member-variables 'ebrowse-global-title "Global Variables")
711 (put 'ebrowse-ts-member-functions 'ebrowse-global-title "Global Functions")
712 (put 'ebrowse-ts-static-variables 'ebrowse-global-title "Static Variables")
713 (put 'ebrowse-ts-static-functions 'ebrowse-global-title "Static Functions")
714 (put 'ebrowse-ts-friends 'ebrowse-global-title "Defines")
715 (put 'ebrowse-ts-types 'ebrowse-global-title "Types")
720 ;;; Operations on `ebrowse-ts' structures
722 (defun ebrowse-files-table (&optional marked-only)
724 The tree is expected in the buffer-local variable `ebrowse--tree-obarray'.
728 (ebrowse-for-all-trees (tree ebrowse--tree-obarray)
729 (when (or (not marked-only) (ebrowse-ts-mark tree))
730 (let ((class (ebrowse-ts-class tree)))
732 (ebrowse-show-progress "Preparing file list" (zerop i)))
734 (let ((source-file (ebrowse-cs-source-file class))
735 (file (ebrowse-cs-file class)))
741 (loop for accessor in ebrowse-member-list-accessors do
743 for file = (ebrowse-ms-file m)
744 for def-file = (ebrowse-ms-definition-file m) do
752 (defun ebrowse-files-list (&optional marked-only)
757 (ebrowse-files-table marked-only))
761 (defun* ebrowse-marked-classes-p ()
763 (ebrowse-for-all-trees (tree ebrowse--tree-obarray)
764 (when (ebrowse-ts-mark tree)
765 (return-from ebrowse-marked-classes-p tree))))
768 (defsubst ebrowse-globals-tree-p (tree)
770 (string= (ebrowse-bs-name (ebrowse-ts-class tree))
771 ebrowse-globals-name))
774 (defsubst ebrowse-qualified-class-name (class)
776 (if (ebrowse-cs-scope class)
777 (concat (ebrowse-cs-scope class) "::" (ebrowse-cs-name class))
778 (ebrowse-cs-name class)))
781 (defun ebrowse-tree-obarray-as-alist (&optional qualified-names-p)
787 The class tree is found in the buffer-local variable `ebrowse--tree-obarray'."
790 (ebrowse-for-all-trees (tree ebrowse--tree-obarray)
792 (acons (ebrowse-qualified-class-name (ebrowse-ts-class tree))
794 (ebrowse-for-all-trees (tree ebrowse--tree-obarray)
796 (acons (ebrowse-cs-name (ebrowse-ts-class tree))
801 (defun ebrowse-sort-tree-list (list)
802 "Sort a LIST of `ebrowse-ts' structures by qualified class names."
805 (string< (ebrowse-qualified-class-name (ebrowse-ts-class a))
806 (ebrowse-qualified-class-name (ebrowse-ts-class b))))))
809 (defun ebrowse-class-in-tree (class tree)
814 (let ((tclass (ebrowse-ts-class class))
818 (when (string= (ebrowse-qualified-class-name (ebrowse-ts-class (car root-ptr)))
819 (ebrowse-qualified-class-name tclass))
825 (defun ebrowse-base-classes (tree)
830 (or (ebrowse-ts-base-classes tree)
831 (setf (ebrowse-ts-base-classes tree)
836 do (ebrowse-for-all-trees (ti ebrowse--tree-obarray)
837 (when (memq search (ebrowse-ts-subclasses ti))
843 (defun ebrowse-direct-base-classes (tree)
846 (dolist (s (ebrowse-base-classes tree))
847 (when (memq tree (ebrowse-ts-subclasses s))
856 (defun ebrowse-name/accessor-alist (tree accessor)
862 collect (cons (ebrowse-ms-name member) accessor)))
865 (defun ebrowse-name/accessor-alist-for-visible-members ()
869 accessor with which the member's list can be accessed in an `ebrowse-ts'
871 (let* ((list (ebrowse-name/accessor-alist ebrowse--displayed-class
872 ebrowse--accessor)))
873 (if ebrowse--show-inherited-flag
875 (loop for tree in (ebrowse-base-classes
876 ebrowse--displayed-class)
877 nconc (ebrowse-name/accessor-alist
878 tree ebrowse--accessor)))
882 (defun ebrowse-name/accessor-alist-for-class-members ()
883 "Like `ebrowse-name/accessor-alist-for-visible-members'.
887 (dolist (func ebrowse-member-list-accessors list)
888 (setq list (nconc list (ebrowse-name/accessor-alist
889 ebrowse--displayed-class func)))
890 (when ebrowse--show-inherited-flag
891 (dolist (class (ebrowse-base-classes ebrowse--displayed-class))
893 (nconc list (ebrowse-name/accessor-alist class func))))))))
899 (defvar ebrowse-n-boxes 0)
900 (defconst ebrowse-max-boxes 60)
902 (defun ebrowse-show-progress (title &optional start)
907 (when start (setq ebrowse-n-boxes 0))
908 (setq ebrowse-n-boxes (mod (1+ ebrowse-n-boxes) ebrowse-max-boxes))
910 (propertize (make-string ebrowse-n-boxes
912 'face 'ebrowse-progress)))))
918 (defun ebrowse-read ()
919 "Read `ebrowse-hs' and `ebrowse-ts' structures in the current buffer.
921 and TREE is a list of `ebrowse-ts' structures forming the class tree."
927 (unless (ebrowse-hs-p header)
929 (unless (string= (ebrowse-hs-version header) ebrowse-version-string)
931 (ebrowse-hs-version header) ebrowse-version-string))
937 (old-root-ptr (ebrowse-class-in-tree root tree)))
938 (ebrowse-show-progress "Reading data" (null tree))
946 (defun ebrowse-revert-tree-buffer-from-file (ignore-auto-save noconfirm)
951 (loop for member-buffer in (ebrowse-same-tree-member-buffer-list)
955 (insert-file (or buffer-file-name ebrowse--tags-file-name)))
956 (ebrowse-tree-mode)
960 (defun ebrowse-create-tree-buffer (tree tags-file header obarray pop)
967 (let ((name ebrowse-tree-buffer-name))
969 (ebrowse-tree-mode)
970 (setq ebrowse--tree tree
971 ebrowse--tags-file-name tags-file
972 ebrowse--tree-obarray obarray
973 ebrowse--header header
974 ebrowse--frozen-flag nil)
975 (ebrowse-redraw-tree)
987 (defun ebrowse-fill-member-table ()
991 extracted from the buffer-local tree `ebrowse--tree-obarray'.
993 Each symbol has its property `ebrowse-info' set to a list (TREE MEMBER-LIST
999 type `ebrowse-hs' is set to the resulting obarray."
1002 (setf (ebrowse-hs-member-table ebrowse--header) nil)
1005 (ebrowse-for-all-trees (c ebrowse--tree-obarray)
1007 (ebrowse-show-progress "Preparing member lookup" (zerop i)))
1008 (loop for f in ebrowse-member-list-accessors do
1010 (let* ((member-name (ebrowse-ms-name m))
1014 (setf (ebrowse-hs-member-table ebrowse--header) members)))
1017 (defun ebrowse-member-table (header)
1020 (when (null (ebrowse-hs-member-table header))
1021 (loop for buffer in (ebrowse-browser-buffer-list)
1022 until (eq header (ebrowse-value-in-buffer 'ebrowse--header buffer))
1026 (ebrowse-fill-member-table))))
1027 (ebrowse-hs-member-table header))
1034 (defun ebrowse-build-tree-obarray (tree)
1041 (intern (ebrowse-qualified-class-name (ebrowse-ts-class root)) classes)
1042 do (unless (get sym 'ebrowse-root)
1043 (setf (get sym 'ebrowse-root) root)))
1045 (ebrowse-insert-supers tree classes)
1049 (defun ebrowse-insert-supers (tree classes)
1053 Helper function for `ebrowse-build-tree-obarray'. Base classes should
1062 as subclasses = (ebrowse-ts-subclasses class) do
1066 (ebrowse-qualified-class-name (ebrowse-ts-class (car subclass)))
1079 (if (get sym 'ebrowse-root)
1080 (setf (car subclass) (get sym 'ebrowse-root))
1081 (setf (get sym 'ebrowse-root) (car subclass))))
1083 (ebrowse-insert-supers subclasses classes)))
1089 (unless ebrowse-tree-mode-map
1091 (setf ebrowse-tree-mode-map map)
1095 (define-key map [down-mouse-3] 'ebrowse-mouse-3-in-tree-buffer)
1096 (define-key map [mouse-2] 'ebrowse-mouse-2-in-tree-buffer)
1097 (define-key map [down-mouse-1] 'ebrowse-mouse-1-in-tree-buffer))
1102 (define-key map1 "d" 'ebrowse-tree-command:show-friends)
1103 (define-key map1 "f" 'ebrowse-tree-command:show-member-functions)
1104 (define-key map1 "F" 'ebrowse-tree-command:show-static-member-functions)
1105 (define-key map1 "t" 'ebrowse-tree-command:show-types)
1106 (define-key map1 "v" 'ebrowse-tree-command:show-member-variables)
1107 (define-key map1 "V" 'ebrowse-tree-command:show-static-member-variables))
1112 (define-key map1 "a" 'ebrowse-mark-all-classes)
1113 (define-key map1 "t" 'ebrowse-toggle-mark-at-point))
1118 (define-key map1 "f" 'ebrowse-toggle-file-name-display)
1119 (define-key map1 "s" 'ebrowse-show-file-name-at-point)
1120 (define-key map1 "w" 'ebrowse-set-tree-indentation)
1121 (define-key map "x" 'ebrowse-statistics))
1123 (define-key map "n" 'ebrowse-repeat-member-search)
1125 (define-key map "*" 'ebrowse-expand-all)
1126 (define-key map "+" 'ebrowse-expand-branch)
1127 (define-key map "-" 'ebrowse-collapse-branch)
1128 (define-key map "/" 'ebrowse-read-class-name-and-go)
1129 (define-key map " " 'ebrowse-view-class-declaration)
1131 (define-key map "\C-i" 'ebrowse-pop/switch-to-member-buffer-for-same-tree)
1132 (define-key map "\C-k" 'ebrowse-remove-class-at-point)
1133 (define-key map "\C-l" 'ebrowse-redraw-tree)
1134 (define-key map "\C-m" 'ebrowse-find-class-declaration)))
1142 (defun ebrowse-tree-mode ()
1150 \\{ebrowse-tree-mode-map}"
1156 (use-local-map ebrowse-tree-mode-map)
1160 (multiple-value-setq (header tree) (ebrowse-read))
1162 (setq tree (ebrowse-sort-tree-list tree))
1167 '(ebrowse--tags-file-name
1168 ebrowse--indentation
1169 ebrowse--tree
1170 ebrowse--header
1171 ebrowse--show-file-names-flag
1172 ebrowse--frozen-flag
1173 ebrowse--tree-obarray
1176 (setf ebrowse--show-file-names-flag nil
1177 ebrowse--tree-obarray (make-vector 127 0)
1178 ebrowse--frozen-flag nil
1179 major-mode 'ebrowse-tree-mode
1185 revert-buffer-function 'ebrowse-revert-tree-buffer-from-file
1186 ebrowse--header header
1187 ebrowse--tree tree
1188 ebrowse--tags-file-name (buffer-file-name)
1189 ebrowse--tree-obarray (and tree (ebrowse-build-tree-obarray tree))
1190 ebrowse--frozen-flag nil)
1192 (add-hook 'local-write-file-hooks 'ebrowse-write-file-hook-fn)
1195 (ebrowse-redraw-tree)
1197 (run-mode-hooks 'ebrowse-tree-mode-hook)))
1201 (defun ebrowse-update-tree-buffer-mode-line ()
1203 (ebrowse-rename-buffer (if ebrowse--frozen-flag
1204 (ebrowse-frozen-tree-buffer-name
1205 ebrowse--tags-file-name)
1206 ebrowse-tree-buffer-name))
1214 (defun ebrowse-remove-class-and-kill-member-buffers (tree class)
1217 (let ((sym (intern-soft (ebrowse-cs-name (ebrowse-ts-class class))
1218 ebrowse--tree-obarray)))
1220 (get sym 'ebrowse-root) nil)
1222 (setf (ebrowse-ts-subclasses root)
1223 (delq class (ebrowse-ts-subclasses root))
1224 (ebrowse-ts-base-classes root) nil)
1225 (ebrowse-remove-class-and-kill-member-buffers
1226 (ebrowse-ts-subclasses root) class))
1227 (ebrowse-kill-member-buffers-displaying class)
1231 (defun ebrowse-remove-class-at-point (forced)
1235 (let* ((class (ebrowse-tree-at-point))
1236 (class-name (ebrowse-cs-name (ebrowse-ts-class class)))
1237 (subclasses (ebrowse-ts-subclasses class)))
1240 (setf ebrowse--tree (ebrowse-remove-class-and-kill-member-buffers
1241 ebrowse--tree class))
1245 (ebrowse-redraw-tree))
1253 (defun ebrowse-toggle-mark-at-point (&optional n-times)
1259 ;; ebrowse-tree-at-point might issue an error.
1262 as tree = (ebrowse-tree-at-point)
1264 (setf (ebrowse-ts-mark tree) (not (ebrowse-ts-mark tree)))
1273 (ebrowse-output
1277 (ebrowse-cs-name (ebrowse-ts-class tree)))
1285 (insert-char (if (ebrowse-ts-mark tree) ?> ? ) 1)
1286 (ebrowse-set-mark-props (1- (point)) (point) tree)
1290 (defun ebrowse-mark-all-classes (prefix)
1293 (ebrowse-for-all-trees (tree ebrowse--tree-obarray)
1294 (setf (ebrowse-ts-mark tree) prefix))
1295 (ebrowse-redraw-marks (point-min) (point-max)))
1298 (defun ebrowse-redraw-marks (start end)
1302 (ebrowse-output
1305 (dolist (root ebrowse--tree)
1306 (ebrowse-draw-marks-fn root start end))))
1307 (ebrowse-update-tree-buffer-mode-line)))
1310 (defun ebrowse-draw-marks-fn (tree start end)
1314 (insert (if (ebrowse-ts-mark tree) ?> ? ))
1315 (ebrowse-set-mark-props (1- (point)) (point) tree))
1319 (dolist (sub (ebrowse-ts-subclasses tree))
1320 (ebrowse-draw-marks-fn sub start end)))
1327 (defun ebrowse-show-file-name-at-point (prefix)
1331 (unless ebrowse--show-file-names-flag
1332 (ebrowse-output
1334 (let ((tree (ebrowse-tree-at-point))
1343 (indent-to ebrowse-source-file-column)
1344 (insert "(" (or (ebrowse-cs-file
1345 (ebrowse-ts-class tree))
1348 (ebrowse-set-face start (point) 'ebrowse-file-name)
1353 (defun ebrowse-toggle-file-name-display ()
1356 (setf ebrowse--show-file-names-flag (not ebrowse--show-file-names-flag))
1358 (ebrowse-redraw-tree)
1366 (defun ebrowse-member-buffer-p (buffer)
1369 'ebrowse-member-mode))
1372 (defun ebrowse-tree-buffer-p (buffer)
1375 'ebrowse-tree-mode))
1378 (defun ebrowse-buffer-p (buffer)
1381 '(ebrowse-tree-mode ebrowse-member-mode)))
1384 (defun ebrowse-browser-buffer-list ()
1386 (ebrowse-delete-if-not 'ebrowse-buffer-p (buffer-list)))
1389 (defun ebrowse-member-buffer-list ()
1391 (ebrowse-delete-if-not 'ebrowse-member-buffer-p (buffer-list)))
1394 (defun ebrowse-tree-buffer-list ()
1396 (ebrowse-delete-if-not 'ebrowse-tree-buffer-p (buffer-list)))
1399 (defun ebrowse-known-class-trees-buffer-list ()
1403 (let ((buffers (nconc (ebrowse-tree-buffer-list)
1404 (ebrowse-member-buffer-list)))
1408 (let ((tree (ebrowse-value-in-buffer 'ebrowse--tree buffer)))
1415 (defun ebrowse-same-tree-member-buffer-list ()
1417 (ebrowse-delete-if-not
1419 (eq (ebrowse-value-in-buffer 'ebrowse--tree buffer)
1420 ebrowse--tree))
1421 (ebrowse-member-buffer-list)))
1426 (defun ebrowse-pop/switch-to-member-buffer-for-same-tree (arg)
1431 (let ((buf (or (first (ebrowse-same-tree-member-buffer-list))
1432 (get-buffer ebrowse-member-buffer-name)
1433 (ebrowse-tree-command:show-member-functions))))
1441 (defun ebrowse-switch-to-next-member-buffer ()
1444 (let* ((list (ebrowse-member-buffer-list))
1453 (defun ebrowse-kill-member-buffers-displaying (tree)
1455 (loop for buffer in (ebrowse-member-buffer-list)
1456 as class = (ebrowse-value-in-buffer 'ebrowse--displayed-class buffer)
1460 (defun ebrowse-frozen-tree-buffer-name (tags-file-name)
1462 (concat ebrowse-tree-buffer-name " (" tags-file-name ")"))
1465 (defun ebrowse-pop-to-browser-buffer (arg)
1466 "Pop to a browser buffer from any other buffer.
1470 ebrowse-tree-buffer-name
1471 ebrowse-member-buffer-name))))
1475 ebrowse-member-buffer-name
1476 ebrowse-tree-buffer-name))))
1486 (defun ebrowse-set-tree-indentation ()
1491 (int-to-string ebrowse--indentation)
1494 (setf ebrowse--indentation width)
1495 (ebrowse-redraw-tree))))
1498 (defun ebrowse-read-class-name-and-go (&optional class)
1502 (ebrowse-ignoring-completion-case
1507 (ebrowse-tree-obarray-as-alist) nil t)))
1508 (ebrowse-save-selective
1512 (setq ebrowse--last-regexp (concat "\\b" class "\\b"))
1513 (if (re-search-forward ebrowse--last-regexp nil t)
1516 (ebrowse-unhide-base-classes))
1524 (defun ebrowse-tree-command:show-member-variables (arg)
1527 (ebrowse-display-member-buffer 'ebrowse-ts-member-variables arg))
1530 (defun ebrowse-tree-command:show-member-functions (&optional arg)
1533 (ebrowse-display-member-buffer 'ebrowse-ts-member-functions arg))
1536 (defun ebrowse-tree-command:show-static-member-variables (arg)
1539 (ebrowse-display-member-buffer 'ebrowse-ts-static-variables arg))
1542 (defun ebrowse-tree-command:show-static-member-functions (arg)
1545 (ebrowse-display-member-buffer 'ebrowse-ts-static-functions arg))
1548 (defun ebrowse-tree-command:show-friends (arg)
1551 (ebrowse-display-member-buffer 'ebrowse-ts-friends arg))
1554 (defun ebrowse-tree-command:show-types (arg)
1557 (ebrowse-display-member-buffer 'ebrowse-ts-types arg))
1564 (defun ebrowse-tree-at-point ()
1566 (or (get-text-property (point) 'ebrowse-tree)
1570 (defun* ebrowse-view/find-class-declaration (&key view where)
1571 "View or find the declarator of the class point is on.
1573 (let* ((class (ebrowse-ts-class (ebrowse-tree-at-point)))
1574 (file (ebrowse-cs-file class))
1575 (browse-struct (make-ebrowse-bs
1576 :name (ebrowse-cs-name class)
1577 :pattern (ebrowse-cs-pattern class)
1578 :flags (ebrowse-cs-flags class)
1579 :file (ebrowse-cs-file class)
1580 :point (ebrowse-cs-point class))))
1581 (ebrowse-view/find-file-and-search-pattern
1583 (list ebrowse--header class nil)
1585 ebrowse--tags-file-name
1590 (defun ebrowse-find-class-declaration (prefix-arg)
1592 PREFIX-ARG 4 means find it in another window.
1593 PREFIX-ARG 5 means find it in another frame."
1595 (ebrowse-view/find-class-declaration
1597 :where (cond ((= prefix-arg 4) 'other-window)
1598 ((= prefix-arg 5) 'other-frame)
1602 (defun ebrowse-view-class-declaration (prefix-arg)
1605 PREFIX-ARG 5 means view it in another frame."
1607 (ebrowse-view/find-class-declaration
1609 :where (cond ((= prefix-arg 4) 'other-window)
1610 ((= prefix-arg 5) 'other-frame)
1618 (defun ebrowse-find-source-file (file tags-file-name)
1622 and (b) in the directories named in `ebrowse-search-path'."
1625 (file-name-directory tags-file-name))))
1628 (let ((search-in ebrowse-search-path))
1640 (defun ebrowse-view-file-other-window (file)
1642 This is a replacement for `view-file-other-window' which does not
1647 (buf-to-view (find-file-noselect file)))
1648 (switch-to-buffer-other-window buf-to-view)
1655 (defun ebrowse-view-exit-fn (buffer)
1657 Restore frame configuration active before viewing the file,
1659 (let (exit-action original-frame-configuration)
1662 (setq original-frame-configuration ebrowse--frame-configuration
1663 exit-action ebrowse--view-exit-action))
1664 ;; Delete the frame in which we viewed.
1665 (mapcar 'delete-frame
1666 (loop for frame in (frame-list)
1667 when (not (assq frame original-frame-configuration))
1668 collect frame))
1673 (defun ebrowse-view-file-other-frame (file)
1674 "View a file FILE in another frame.
1675 The new frame is deleted when it is no longer used."
1677 (let ((old-frame-configuration (current-frame-configuration))
1680 (buf-to-view (find-file-noselect file)))
1681 (switch-to-buffer-other-frame buf-to-view)
1682 (make-local-variable 'ebrowse--frame-configuration)
1683 (setq ebrowse--frame-configuration old-frame-configuration)
1684 (make-local-variable 'ebrowse--view-exit-action)
1685 (setq ebrowse--view-exit-action
1689 (view-mode-enter old-arrangement 'ebrowse-view-exit-fn)))
1692 (defun ebrowse-view/find-file-and-search-pattern
1693 (struc info file tags-file-name &optional view where)
1695 STRUC is an `ebrowse-bs' structure (or a structure including that)
1699 `ebrowse-ms' or `ebrowse-cs' structure depending on what is searched.
1701 if MEMBER-OR-CLASS is an `ebrowse-ms'.
1707 If VIEW is non-nil, view file else find the file.
1708 WHERE is either `other-window', `other-frame' or `this-window' and
1709 specifies where to find/view the result."
1712 (ebrowse-bs-name struc)))
1713 ;; Get the source file to view or find.
1714 (setf file (ebrowse-find-source-file file tags-file-name))
1715 ;; If current window is dedicated, use another frame.
1717 (setf where 'other-window))
1719 (setf ebrowse-temp-position-to-view struc
1720 ebrowse-temp-info-to-view info)
1723 (push 'ebrowse-find-pattern view-mode-hook)
1725 (other-window (ebrowse-view-file-other-window file))
1726 (other-frame (ebrowse-view-file-other-frame file))
1730 (other-window (find-file-other-window file))
1731 (other-frame (find-file-other-frame file))
1732 (t (find-file file)))
1733 (ebrowse-find-pattern struc info))))
1736 (defun ebrowse-symbol-regexp (name)
1752 (defun ebrowse-class-declaration-regexp (name)
1756 (ebrowse-symbol-regexp name)
1760 (defun ebrowse-variable-declaration-regexp (name)
1762 (concat "\\S_" (ebrowse-symbol-regexp name) "\\S_"))
1765 (defun ebrowse-function-declaration/definition-regexp (name)
1768 (ebrowse-symbol-regexp name)
1772 (defun ebrowse-pp-define-regexp (name)
1777 (defun* ebrowse-find-pattern (&optional position info &aux viewing)
1780 This is a kluge: Ebrowse allows you to find or view a file containing
1783 `ebrowse-temp-position-to-view' holds what to search for.
1789 position ebrowse-temp-position-to-view
1790 info ebrowse-temp-info-to-view))
1792 (let* ((pattern (ebrowse-bs-pattern position))
1793 (start (ebrowse-bs-point position))
1803 (ebrowse-ms
1805 ((ebrowse-ts-member-variables
1806 ebrowse-ts-static-variables
1807 ebrowse-ts-types)
1808 (setf pattern (ebrowse-variable-declaration-regexp
1809 (ebrowse-bs-name position))))
1811 (if (ebrowse-define-p class-or-member)
1812 (setf pattern (ebrowse-pp-define-regexp (ebrowse-bs-name position)))
1813 (setf pattern (ebrowse-function-declaration/definition-regexp
1814 (ebrowse-bs-name position)))))))
1815 (ebrowse-cs
1816 (setf pattern (ebrowse-class-declaration-regexp
1817 (ebrowse-bs-name position))))))
1821 ;; member definition/declaration was not seen by the parser,
1823 (when (and (boundp 'ebrowse-debug)
1824 (symbol-value 'ebrowse-debug))
1834 (run-hooks 'ebrowse-view/find-hook))
1835 ((numberp (ebrowse-bs-pattern position))
1837 (if ebrowse-not-found-hook
1838 (run-hooks 'ebrowse-not-found-hook)
1842 (if ebrowse-not-found-hook
1843 (run-hooks 'ebrowse-not-found-hook)
1853 (defun ebrowse-redraw-tree (&optional quietly)
1859 (ebrowse-output
1861 (ebrowse-draw-tree-fn)))
1862 (ebrowse-update-tree-buffer-mode-line)
1866 (defun ebrowse-set-mark-props (start end tree)
1871 `(mouse-face highlight ebrowse-what mark ebrowse-tree ,tree
1873 (ebrowse-set-face start end 'ebrowse-tree-mark))
1876 (defun* ebrowse-draw-tree-fn (&aux stack1 stack2 start)
1879 (setq stack1 (make-list (length ebrowse--tree) 0)
1880 stack2 (copy-sequence ebrowse--tree))
1884 as class = (ebrowse-ts-class tree) do
1888 (insert (if (ebrowse-ts-mark tree) ">" " "))
1891 (indent-to (+ (* level ebrowse--indentation)
1892 ebrowse-tree-left-margin))
1894 (insert (ebrowse-qualified-class-name class))
1897 (when (ebrowse-template-p class)
1899 (ebrowse-set-face start (point) (if (zerop level)
1900 'ebrowse-root-class
1901 'ebrowse-default))
1905 (when ebrowse--show-file-names-flag
1906 (indent-to ebrowse-source-file-column)
1909 (or (ebrowse-cs-file class)
1912 (ebrowse-set-face start (point) 'ebrowse-file-name))
1913 (ebrowse-set-mark-props start-of-line (1+ start-of-line) tree)
1916 `(mouse-face highlight ebrowse-what class-name
1917 ebrowse-tree ,tree
1921 (when (ebrowse-ts-subclasses tree)
1923 (nconc (copy-sequence (ebrowse-ts-subclasses tree)) stack2)
1925 (nconc (make-list (length (ebrowse-ts-subclasses tree))
1933 (defun ebrowse-expand-branch (arg)
1938 (ebrowse-expand-all arg)
1939 (ebrowse-collapse-fn nil)))
1942 (defun ebrowse-collapse-branch (arg)
1947 (ebrowse-expand-all (not arg))
1948 (ebrowse-collapse-fn t)))
1951 (defun ebrowse-expand-all (collapse)
1957 (ebrowse-output
1969 (defun ebrowse-unhide-base-classes ()
1971 (ebrowse-output
1991 (defun ebrowse-hide-line (collapse)
1995 (ebrowse-output
2001 (defun ebrowse-collapse-fn (collapse)
2004 (ebrowse-output
2015 (ebrowse-hide-line collapse)
2023 (defvar ebrowse-electric-list-mode-map ()
2027 (unless ebrowse-electric-list-mode-map
2030 (setq ebrowse-electric-list-mode-map map)
2031 (fillarray (car (cdr map)) 'ebrowse-electric-list-undefined)
2032 (fillarray (car (cdr submap)) 'ebrowse-electric-list-undefined)
2038 (define-key map "\C-c\C-c" 'ebrowse-electric-list-quit)
2039 (define-key map "q" 'ebrowse-electric-list-quit)
2040 (define-key map " " 'ebrowse-electric-list-select)
2047 (define-key map "v" 'ebrowse-electric-view-buffer)
2050 (define-key map "\e\C-v" 'scroll-other-window)
2055 (put 'ebrowse-electric-list-mode 'mode-class 'special)
2056 (put 'ebrowse-electric-list-undefined 'suppress-keymap t)
2059 (defun ebrowse-electric-list-mode ()
2062 (use-local-map ebrowse-electric-list-mode-map)
2072 major-mode 'ebrowse-electric-list-mode)
2073 (run-mode-hooks 'ebrowse-electric-list-mode-hook))
2076 (defun ebrowse-list-tree-buffers ()
2082 (dolist (buffer (ebrowse-known-class-trees-buffer-list))
2088 (defun ebrowse-electric-choose-tree ()
2091 (unless (car (ebrowse-known-class-trees-buffer-list))
2095 (save-window-excursion (ebrowse-list-tree-buffers))
2102 (ebrowse-electric-list-mode)
2104 (catch 'ebrowse-electric-list-select
2114 (Electric-command-loop 'ebrowse-electric-list-select
2117 'ebrowse-electric-list-looper
2124 (setq select (ebrowse-electric-get-buffer select)))
2129 (defun ebrowse-electric-list-looper (state condition)
2148 (defun ebrowse-electric-list-undefined ()
2155 (defun ebrowse-electric-list-quit ()
2158 (throw 'ebrowse-electric-list-select nil))
2161 (defun ebrowse-electric-list-select ()
2164 (throw 'ebrowse-electric-list-select (point)))
2167 (defun ebrowse-electric-get-buffer (point)
2170 (nth index (ebrowse-known-class-trees-buffer-list))))
2175 (defun ebrowse-electric-view-buffer ()
2178 (let ((buffer (ebrowse-electric-get-buffer (point))))
2185 (defun ebrowse-choose-from-browser-buffers ()
2187 (let* ((buffers (ebrowse-known-class-trees-buffer-list)))
2191 (or (ebrowse-electric-choose-tree) (error "No tree buffer")))
2195 (find-file file))
2196 (find-buffer-visiting file)))))
2202 (unless ebrowse-member-mode-map
2204 (setf ebrowse-member-mode-map map)
2208 (define-key map [down-mouse-3] 'ebrowse-member-mouse-3)
2209 (define-key map [mouse-2] 'ebrowse-member-mouse-2))
2214 (define-key map1 "b" 'ebrowse-switch-member-buffer-to-base-class)
2215 (define-key map1 "c" 'ebrowse-switch-member-buffer-to-any-class)
2216 (define-key map1 "d" 'ebrowse-switch-member-buffer-to-derived-class)
2217 (define-key map1 "n" 'ebrowse-switch-member-buffer-to-next-sibling-class)
2218 (define-key map1 "p" 'ebrowse-switch-member-buffer-to-previous-sibling-class))
2223 (define-key map1 "a" 'ebrowse-toggle-member-attributes-display)
2224 (define-key map1 "b" 'ebrowse-toggle-base-class-display)
2225 (define-key map1 "f" 'ebrowse-freeze-member-buffer)
2226 (define-key map1 "l" 'ebrowse-toggle-long-short-display)
2227 (define-key map1 "r" 'ebrowse-toggle-regexp-display)
2228 (define-key map1 "w" 'ebrowse-set-member-buffer-column-width))
2236 (define-key map2 "i" 'ebrowse-toggle-private-member-filter)
2237 (define-key map2 "o" 'ebrowse-toggle-protected-member-filter)
2238 (define-key map2 "u" 'ebrowse-toggle-public-member-filter))
2239 (define-key map1 "c" 'ebrowse-toggle-const-member-filter)
2240 (define-key map1 "i" 'ebrowse-toggle-inline-member-filter)
2241 (define-key map1 "p" 'ebrowse-toggle-pure-member-filter)
2242 (define-key map1 "r" 'ebrowse-remove-all-member-filters)
2243 (define-key map1 "v" 'ebrowse-toggle-virtual-member-filter))
2248 (define-key map1 "d" 'ebrowse-display-friends-member-list)
2249 (define-key map1 "f" 'ebrowse-display-function-member-list)
2250 (define-key map1 "F" 'ebrowse-display-static-functions-member-list)
2251 (define-key map1 "n" 'ebrowse-display-next-member-list)
2252 (define-key map1 "p" 'ebrowse-display-previous-member-list)
2253 (define-key map1 "t" 'ebrowse-display-types-member-list)
2254 (define-key map1 "v" 'ebrowse-display-variables-member-list)
2255 (define-key map1 "V" 'ebrowse-display-static-variables-member-list))
2260 (define-key map1 "m" 'ebrowse-goto-visible-member/all-member-lists)
2261 (define-key map1 "n" 'ebrowse-repeat-member-search)
2262 (define-key map1 "v" 'ebrowse-goto-visible-member))
2264 (define-key map "f" 'ebrowse-find-member-declaration)
2265 (define-key map "m" 'ebrowse-switch-to-next-member-buffer)
2267 (define-key map "t" 'ebrowse-show-displayed-class-in-tree)
2268 (define-key map "v" 'ebrowse-view-member-declaration)
2269 (define-key map " " 'ebrowse-view-member-definition)
2271 (define-key map "\C-i" 'ebrowse-pop-from-member-to-tree-buffer)
2272 (define-key map "\C-l" 'ebrowse-redisplay-member-buffer)
2273 (define-key map "\C-m" 'ebrowse-find-member-definition)))
2281 (defun ebrowse-member-mode ()
2284 \\{ebrowse-member-mode-map}"
2286 (use-local-map ebrowse-member-mode-map)
2287 (setq major-mode 'ebrowse-member-mode)
2289 '(ebrowse--decl-column ;display column
2290 ebrowse--n-columns ;number of short columns
2291 ebrowse--column-width ;width of columns above
2292 ebrowse--show-inherited-flag ;include inherited members?
2293 ebrowse--filters ;public, protected, private
2294 ebrowse--accessor ;vars, functions, friends
2295 ebrowse--displayed-class ;class displayed
2296 ebrowse--long-display-flag ;display with regexps?
2297 ebrowse--source-regexp-flag ;show source regexp?
2298 ebrowse--attributes-flag ;show `virtual' and `inline'
2299 ebrowse--member-list ;list of members displayed
2300 ebrowse--tree ;the class tree
2301 ebrowse--member-mode-strings ;part of mode line
2302 ebrowse--tags-file-name ;
2303 ebrowse--header
2304 ebrowse--tree-obarray
2305 ebrowse--virtual-display-flag
2306 ebrowse--inline-display-flag
2307 ebrowse--const-display-flag
2308 ebrowse--pure-display-flag
2309 ebrowse--frozen-flag)) ;buffer not automagically reused
2314 ebrowse--long-display-flag nil
2315 ebrowse--attributes-flag t
2316 ebrowse--show-inherited-flag t
2317 ebrowse--source-regexp-flag nil
2318 ebrowse--filters [0 1 2]
2319 ebrowse--decl-column ebrowse-default-declaration-column
2320 ebrowse--column-width ebrowse-default-column-width
2321 ebrowse--virtual-display-flag nil
2322 ebrowse--inline-display-flag nil
2323 ebrowse--const-display-flag nil
2324 ebrowse--pure-display-flag nil)
2326 (run-mode-hooks 'ebrowse-member-mode-hook))
2333 (defsubst ebrowse-class-name-displayed-in-member-buffer ()
2335 (ebrowse-cs-name (ebrowse-ts-class ebrowse--displayed-class)))
2338 (defsubst ebrowse-member-list-name ()
2340 (get ebrowse--accessor (if (ebrowse-globals-tree-p ebrowse--displayed-class)
2341 'ebrowse-global-title
2342 'ebrowse-title)))
2345 (defun ebrowse-update-member-buffer-mode-line ()
2347 (let* ((name (when ebrowse--frozen-flag
2348 (concat (ebrowse-class-name-displayed-in-member-buffer)
2350 (ident (concat name (ebrowse-member-list-name))))
2353 (ebrowse-rename-buffer (if name ident ebrowse-member-buffer-name))
2359 (defun ebrowse-freeze-member-buffer ()
2362 (setq ebrowse--frozen-flag (not ebrowse--frozen-flag))
2363 (ebrowse-redisplay-member-buffer))
2366 (defun ebrowse-show-displayed-class-in-tree (arg)
2370 (let ((class-name (ebrowse-class-name-displayed-in-member-buffer)))
2371 (when (ebrowse-pop-from-member-to-tree-buffer arg)
2372 (ebrowse-read-class-name-and-go class-name))))
2375 (defun ebrowse-set-member-buffer-column-width ()
2382 (int-to-string (if ebrowse--long-display-flag
2383 ebrowse--decl-column
2384 ebrowse--column-width))
2387 (if ebrowse--long-display-flag
2388 (setq ebrowse--decl-column width)
2389 (setq ebrowse--column-width width))
2390 (ebrowse-redisplay-member-buffer))))
2393 (defun ebrowse-pop-from-member-to-tree-buffer (arg)
2398 (let ((buf (or (get-buffer (ebrowse-frozen-tree-buffer-name
2399 ebrowse--tags-file-name))
2400 (get-buffer ebrowse-tree-buffer-name)
2401 (ebrowse-create-tree-buffer ebrowse--tree
2402 ebrowse--tags-file-name
2403 ebrowse--header
2404 ebrowse--tree-obarray
2415 (defun ebrowse-display-member-list-for-accessor (accessor)
2417 (setf ebrowse--accessor accessor
2418 ebrowse--member-list (funcall accessor ebrowse--displayed-class))
2419 (ebrowse-redisplay-member-buffer))
2422 (defun ebrowse-cyclic-display-next/previous-member-list (incr)
2424 (let ((index (ebrowse-position ebrowse--accessor
2425 ebrowse-member-list-accessors)))
2426 (setf ebrowse--accessor
2429 ebrowse-member-list-accessors)
2430 (first ebrowse-member-list-accessors)))
2434 ebrowse-member-list-accessors))
2435 (first (last ebrowse-member-list-accessors))))))
2436 (ebrowse-display-member-list-for-accessor ebrowse--accessor)))
2439 (defun ebrowse-display-next-member-list ()
2442 (ebrowse-cyclic-display-next/previous-member-list 1))
2445 (defun ebrowse-display-previous-member-list ()
2448 (ebrowse-cyclic-display-next/previous-member-list -1))
2451 (defun ebrowse-display-function-member-list ()
2454 (ebrowse-display-member-list-for-accessor 'ebrowse-ts-member-functions))
2457 (defun ebrowse-display-variables-member-list ()
2460 (ebrowse-display-member-list-for-accessor 'ebrowse-ts-member-variables))
2463 (defun ebrowse-display-static-variables-member-list ()
2466 (ebrowse-display-member-list-for-accessor 'ebrowse-ts-static-variables))
2469 (defun ebrowse-display-static-functions-member-list ()
2472 (ebrowse-display-member-list-for-accessor 'ebrowse-ts-static-functions))
2475 (defun ebrowse-display-friends-member-list ()
2478 (ebrowse-display-member-list-for-accessor 'ebrowse-ts-friends))
2481 (defun ebrowse-display-types-member-list ()
2484 (ebrowse-display-member-list-for-accessor 'ebrowse-ts-types))
2489 ;;; Filters and other display attributes
2491 (defun ebrowse-toggle-member-attributes-display ()
2494 (setq ebrowse--attributes-flag (not ebrowse--attributes-flag))
2495 (ebrowse-redisplay-member-buffer))
2498 (defun ebrowse-toggle-base-class-display ()
2501 (setf ebrowse--show-inherited-flag (not ebrowse--show-inherited-flag))
2502 (ebrowse-redisplay-member-buffer))
2505 (defun ebrowse-toggle-pure-member-filter ()
2508 (setf ebrowse--pure-display-flag (not ebrowse--pure-display-flag))
2509 (ebrowse-redisplay-member-buffer))
2512 (defun ebrowse-toggle-const-member-filter ()
2515 (setf ebrowse--const-display-flag (not ebrowse--const-display-flag))
2516 (ebrowse-redisplay-member-buffer))
2519 (defun ebrowse-toggle-inline-member-filter ()
2522 (setf ebrowse--inline-display-flag (not ebrowse--inline-display-flag))
2523 (ebrowse-redisplay-member-buffer))
2526 (defun ebrowse-toggle-virtual-member-filter ()
2529 (setf ebrowse--virtual-display-flag (not ebrowse--virtual-display-flag))
2530 (ebrowse-redisplay-member-buffer))
2533 (defun ebrowse-remove-all-member-filters ()
2537 (aset ebrowse--filters i i))
2538 (setq ebrowse--pure-display-flag nil
2539 ebrowse--const-display-flag nil
2540 ebrowse--virtual-display-flag nil
2541 ebrowse--inline-display-flag nil)
2542 (ebrowse-redisplay-member-buffer))
2545 (defun ebrowse-toggle-public-member-filter ()
2548 (ebrowse-set-member-access-visibility 0)
2549 (ebrowse-redisplay-member-buffer))
2552 (defun ebrowse-toggle-protected-member-filter ()
2555 (ebrowse-set-member-access-visibility 1)
2556 (ebrowse-redisplay-member-buffer))
2559 (defun ebrowse-toggle-private-member-filter ()
2562 (ebrowse-set-member-access-visibility 2)
2563 (ebrowse-redisplay-member-buffer))
2566 (defun ebrowse-set-member-access-visibility (vis)
2567 (setf (aref ebrowse--filters vis)
2568 (if (aref ebrowse--filters vis) nil vis)))
2571 (defun ebrowse-toggle-long-short-display ()
2574 (setf ebrowse--long-display-flag (not ebrowse--long-display-flag))
2575 (ebrowse-redisplay-member-buffer))
2578 (defun ebrowse-toggle-regexp-display ()
2579 "Toggle declaration/definition regular expression display.
2582 (setf ebrowse--source-regexp-flag (not ebrowse--source-regexp-flag))
2583 (ebrowse-redisplay-member-buffer))
2590 (defun ebrowse-find-member-definition (&optional prefix)
2591 "Find the file containing a member definition.
2592 With PREFIX 4. find file in another window, with prefix 5
2593 find file in another frame."
2595 (ebrowse-view/find-member-declaration/definition prefix nil t))
2598 (defun ebrowse-view-member-definition (prefix)
2599 "View the file containing a member definition.
2600 With PREFIX 4. find file in another window, with prefix 5
2601 find file in another frame."
2603 (ebrowse-view/find-member-declaration/definition prefix t t))
2606 (defun ebrowse-find-member-declaration (prefix)
2608 With PREFIX 4. find file in another window, with prefix 5
2609 find file in another frame."
2611 (ebrowse-view/find-member-declaration/definition prefix nil))
2614 (defun ebrowse-view-member-declaration (prefix)
2616 With PREFIX 4. find file in another window, with prefix 5
2617 find file in another frame."
2619 (ebrowse-view/find-member-declaration/definition prefix t))
2622 (defun* ebrowse-view/find-member-declaration/definition
2623 (prefix view &optional definition info header tags-file-name)
2624 "Find or view a member declaration or definition.
2625 With PREFIX 4. find file in another window, with prefix 5
2626 find file in another frame.
2627 DEFINITION non-nil means find the definition, otherwise find the
2633 (setq header ebrowse--header))
2634 (unless tags-file-name
2635 (setq tags-file-name ebrowse--tags-file-name))
2637 (where (if (= prefix 4) 'other-window
2638 (if (= prefix 5) 'other-frame 'this-window))))
2646 (ebrowse-member-info-from-point))
2647 (setq accessor ebrowse--accessor))
2648 ;; View/find class if on a line containing a class name.
2650 (return-from ebrowse-view/find-member-declaration/definition
2651 (ebrowse-view/find-file-and-search-pattern
2652 (ebrowse-ts-class tree)
2653 (list ebrowse--header (ebrowse-ts-class tree) nil)
2654 (ebrowse-cs-file (ebrowse-ts-class tree))
2655 tags-file-name view where)))
2657 ;; a definition. If this is requested, silently search for the
2659 (when (and definition
2660 (eq accessor 'ebrowse-ts-member-variables))
2661 (setq definition nil))
2663 (when definition
2664 (setf member (make-ebrowse-ms
2665 :name (ebrowse-ms-name member)
2666 :file (ebrowse-ms-definition-file member)
2667 :pattern (ebrowse-ms-definition-pattern
2669 :flags (ebrowse-ms-flags member)
2670 :point (ebrowse-ms-definition-point
2673 (setf file (or (ebrowse-ms-file member)
2674 (if definition
2675 (ebrowse-cs-source-file (ebrowse-ts-class tree))
2676 (ebrowse-cs-file (ebrowse-ts-class tree)))))
2678 ;; indication that the parser hasn't seen a definition/declaration
2680 (if (or (null file) (zerop (ebrowse-ms-point member)))
2682 (if definition "definition" "declaration")
2684 (if definition "declaration" "definition")
2686 (ebrowse-ms-name member)
2691 (ebrowse-view/find-member-declaration/definition
2692 prefix view (not definition) info header tags-file-name))
2695 (ebrowse-view/find-file-and-search-pattern
2696 (make-ebrowse-bs :name (ebrowse-ms-name member)
2697 :pattern (ebrowse-ms-pattern member)
2698 :file (ebrowse-ms-file member)
2699 :flags (ebrowse-ms-flags member)
2700 :point (ebrowse-ms-point member))
2703 tags-file-name
2712 (defun ebrowse-redisplay-member-buffer ()
2715 (let ((display-fn (if ebrowse--long-display-flag
2716 'ebrowse-draw-member-long-fn
2717 'ebrowse-draw-member-short-fn)))
2718 (ebrowse-output
2721 (ebrowse-draw-member-buffer-class-line)
2722 (funcall display-fn ebrowse--member-list ebrowse--displayed-class)
2724 (when ebrowse--show-inherited-flag
2725 (dolist (super (ebrowse-base-classes ebrowse--displayed-class))
2728 (ebrowse-draw-member-buffer-class-line super)
2729 (funcall display-fn (funcall ebrowse--accessor super) super)))
2730 (ebrowse-update-member-buffer-mode-line))))
2733 (defun ebrowse-draw-member-buffer-class-line (&optional class)
2738 (tree (or class ebrowse--displayed-class))
2743 (insert (ebrowse-qualified-class-name (ebrowse-ts-class tree)))
2744 (when (ebrowse-template-p (ebrowse-ts-class tree))
2748 (ebrowse-set-face start (point) 'ebrowse-member-class)
2751 '(ebrowse-what class-name
2754 (put-text-property start class-name-end 'ebrowse-tree tree)))
2757 (defun ebrowse-display-member-buffer (list &optional stand-alone class)
2761 (let* ((classes ebrowse--tree-obarray)
2762 (tree ebrowse--tree)
2763 (tags-file-name ebrowse--tags-file-name)
2764 (header ebrowse--header)
2766 (temp-buffer (get-buffer ebrowse-member-buffer-name)))
2770 (setq class (ebrowse-tree-at-point)))
2774 (pop-to-buffer (get-buffer-create ebrowse-member-buffer-name))
2776 (ebrowse-member-mode))
2778 (setq ebrowse--member-list (funcall list class)
2779 ebrowse--displayed-class class
2780 ebrowse--accessor list
2781 ebrowse--tree-obarray classes
2782 ebrowse--frozen-flag stand-alone
2783 ebrowse--tags-file-name tags-file-name
2784 ebrowse--header header
2785 ebrowse--tree tree
2787 (ebrowse-redisplay-member-buffer)
2791 (defun ebrowse-member-display-p (member)
2793 (if (and (aref ebrowse--filters (ebrowse-ms-visibility member))
2794 (or (null ebrowse--const-display-flag)
2795 (ebrowse-const-p member))
2796 (or (null ebrowse--inline-display-flag)
2797 (ebrowse-inline-p member))
2798 (or (null ebrowse--pure-display-flag)
2799 (ebrowse-bs-p member))
2800 (or (null ebrowse--virtual-display-flag)
2801 (ebrowse-virtual-p member)))
2805 (defun ebrowse-draw-member-attributes (member)
2807 (insert (if (ebrowse-template-p member) "T" "-")
2808 (if (ebrowse-extern-c-p member) "C" "-")
2809 (if (ebrowse-virtual-p member) "v" "-")
2810 (if (ebrowse-inline-p member) "i" "-")
2811 (if (ebrowse-const-p member) "c" "-")
2812 (if (ebrowse-pure-virtual-p member) "0" "-")
2813 (if (ebrowse-mutable-p member) "m" "-")
2814 (if (ebrowse-explicit-p member) "e" "-")
2815 (if (ebrowse-throw-list-p member) "t" "-")))
2818 (defun ebrowse-draw-member-regexp (member-struc)
2820 (let ((pattern (if ebrowse--source-regexp-flag
2821 (ebrowse-ms-definition-pattern
2823 (ebrowse-ms-pattern member-struc))))
2825 (insert (ebrowse-trim-string pattern) "...\n")
2827 (move-to-column (+ 4 ebrowse--decl-column))
2836 (defun ebrowse-draw-member-long-fn (member-list tree)
2839 (dolist (member-struc (mapcar 'ebrowse-member-display-p member-list))
2841 (let ((name (ebrowse-ms-name member-struc))
2847 (1- ebrowse--decl-column))))
2850 `(mouse-face highlight ebrowse-what member-name
2851 ebrowse-member ,member-struc
2852 ebrowse-tree ,tree
2853 help-echo "mouse-2: view definition; mouse-3: menu"))
2856 (indent-to ebrowse--decl-column)
2858 (when ebrowse--attributes-flag
2861 (ebrowse-draw-member-attributes member-struc)
2863 (ebrowse-set-face start (point)
2864 'ebrowse-member-attribute)))
2866 (ebrowse-draw-member-regexp member-struc))))
2871 (defun ebrowse-draw-member-short-fn (member-list tree)
2875 (column-width (+ ebrowse--column-width
2876 (if ebrowse--attributes-flag 12 0))))
2878 (setq ebrowse--n-columns
2879 (max 1 (/ (ebrowse-width-of-drawable-area) column-width)))
2880 (dolist (member (mapcar #'ebrowse-member-display-p member-list))
2882 (let ((name (ebrowse-ms-name member))
2890 (when ebrowse--attributes-flag
2892 (ebrowse-draw-member-attributes member)
2894 (ebrowse-set-face start-of-entry (point)
2895 'ebrowse-member-attribute))
2900 (1- ebrowse--column-width))))
2904 `(ebrowse-what member-name
2905 ebrowse-member ,member
2907 ebrowse-tree ,tree
2908 help-echo "mouse-2: view definition; mouse-3: menu"))
2910 (when (>= i ebrowse--n-columns)
2922 (defun ebrowse-member-info-from-point ()
2927 (let ((tree (or (get-text-property (point) 'ebrowse-tree)
2929 (member (get-text-property (point) 'ebrowse-member)))
2937 (defun ebrowse-goto-visible-member/all-member-lists (prefix)
2942 (ebrowse-ignoring-completion-case
2943 (let* ((completion-list (ebrowse-name/accessor-alist-for-class-members))
2948 (unless (eq accessor ebrowse--accessor)
2949 (setf ebrowse--accessor accessor
2950 ebrowse--member-list (funcall accessor ebrowse--displayed-class))
2951 (ebrowse-redisplay-member-buffer))
2952 (ebrowse-move-point-to-member member))))
2955 (defun ebrowse-goto-visible-member (repeat)
2961 (ebrowse-ignoring-completion-case
2963 (let* ((completion-list (ebrowse-name/accessor-alist-for-visible-members))
2965 (ebrowse-move-point-to-member member repeat))))
2972 (defun ebrowse-repeat-member-search (repeat)
2976 (unless ebrowse--last-regexp
2981 (if (re-search-forward ebrowse--last-regexp nil t repeat)
2987 (if (re-search-forward ebrowse--last-regexp nil t)
2994 (defun* ebrowse-move-point-to-member (name &optional count &aux member)
3000 (substring name 0 (min (length name) (1- ebrowse--column-width)))
3001 ebrowse--last-regexp
3003 (if (re-search-forward ebrowse--last-regexp nil t count)
3012 (defun ebrowse-switch-member-buffer-to-other-class (title compl-list)
3018 (class (or (ebrowse-completing-read-value title compl-list initial)
3020 (setf ebrowse--displayed-class class
3021 ebrowse--member-list (funcall ebrowse--accessor ebrowse--displayed-class))
3022 (ebrowse-redisplay-member-buffer)))
3025 (defun ebrowse-switch-member-buffer-to-any-class ()
3028 (ebrowse-switch-member-buffer-to-other-class
3029 "Goto class: " (ebrowse-tree-obarray-as-alist)))
3032 (defun ebrowse-switch-member-buffer-to-base-class (arg)
3035 (let ((supers (or (ebrowse-direct-base-classes ebrowse--displayed-class)
3039 collect (cons (ebrowse-qualified-class-name
3040 (ebrowse-ts-class s))
3042 (ebrowse-switch-member-buffer-to-other-class
3044 (setq ebrowse--displayed-class (first supers)
3045 ebrowse--member-list
3046 (funcall ebrowse--accessor ebrowse--displayed-class))
3047 (ebrowse-redisplay-member-buffer))))
3049 (defun ebrowse-switch-member-buffer-to-next-sibling-class (arg)
3052 (ebrowse-switch-member-buffer-to-sibling-class arg))
3055 (defun ebrowse-switch-member-buffer-to-previous-sibling-class (arg)
3058 (ebrowse-switch-member-buffer-to-sibling-class (- arg)))
3061 (defun ebrowse-switch-member-buffer-to-sibling-class (inc)
3065 (let ((containing-list ebrowse--tree)
3067 (supers (ebrowse-direct-base-classes ebrowse--displayed-class)))
3070 collect (cons (ebrowse-cs-name
3071 (ebrowse-ts-class tr)) tr))))
3074 (ebrowse-completing-read-value
3079 (setq containing-list (ebrowse-ts-subclasses tree)))))
3080 (setq index (+ inc (ebrowse-position ebrowse--displayed-class
3086 (setf ebrowse--displayed-class cls
3087 ebrowse--member-list (funcall ebrowse--accessor cls))
3088 (ebrowse-redisplay-member-buffer)))
3091 (defun ebrowse-switch-member-buffer-to-derived-class (arg)
3096 (flet ((ebrowse-tree-obarray-as-alist ()
3097 (loop for s in (ebrowse-ts-subclasses
3098 ebrowse--displayed-class)
3099 collect (cons (ebrowse-cs-name
3100 (ebrowse-ts-class s)) s))))
3101 (let ((subs (or (ebrowse-ts-subclasses ebrowse--displayed-class)
3104 (ebrowse-switch-member-buffer-to-other-class
3105 "Goto derived class: " (ebrowse-tree-obarray-as-alist))
3106 (setq ebrowse--displayed-class (first subs)
3107 ebrowse--member-list
3108 (funcall ebrowse--accessor ebrowse--displayed-class))
3109 (ebrowse-redisplay-member-buffer)))))
3116 (defun ebrowse-displaying-functions ()
3117 (eq ebrowse--accessor 'ebrowse-ts-member-functions))
3118 (defun ebrowse-displaying-variables ()
3119 (eq ebrowse--accessor 'ebrowse-ts-member-variables))
3120 (defun ebrowse-displaying-static-functions ()
3122 (defun ebrowse-displaying-static-variables ()
3124 (defun ebrowse-displaying-types ()
3125 (eq ebrowse--accessor 'ebrowse-ts-types))
3126 (defun ebrowse-displaying-friends ()
3127 (eq ebrowse--accessor 'ebrowse-ts-friends))
3130 ebrowse-member-buffer-object-menu ebrowse-member-mode-map
3134 ["Functions" ebrowse-display-function-member-list
3137 :selected (eq ebrowse--accessor 'ebrowse-ts-member-functions)
3139 ["Variables" ebrowse-display-variables-member-list
3142 :selected (eq ebrowse--accessor 'ebrowse-ts-member-variables)
3144 ["Static Functions" ebrowse-display-static-functions-member-list
3147 :selected (eq ebrowse--accessor 'ebrowse-ts-static-functions)
3149 ["Static Variables" ebrowse-display-static-variables-member-list
3152 :selected (eq ebrowse--accessor 'ebrowse-ts-static-variables)
3154 ["Types" ebrowse-display-types-member-list
3157 :selected (eq ebrowse--accessor 'ebrowse-ts-types)
3159 ["Friends/Defines" ebrowse-display-friends-member-list
3162 :selected (eq ebrowse--accessor 'ebrowse-ts-friends)
3165 ["Up" ebrowse-switch-member-buffer-to-base-class
3168 ["Down" ebrowse-switch-member-buffer-to-derived-class
3171 ["Next Sibling" ebrowse-switch-member-buffer-to-next-sibling-class
3174 ["Previous Sibling" ebrowse-switch-member-buffer-to-previous-sibling-class
3178 ["Show in Tree" ebrowse-show-displayed-class-in-tree
3181 ["Find in this Class" ebrowse-goto-visible-member
3184 ["Find in Tree" ebrowse-goto-visible-member/all-member-lists
3188 ["Inherited" ebrowse-toggle-base-class-display
3191 :selected ebrowse--show-inherited-flag
3193 ["Attributes" ebrowse-toggle-member-attributes-display
3196 :selected ebrowse--attributes-flag
3198 ["Long Display" ebrowse-toggle-long-short-display
3201 :selected ebrowse--long-display-flag
3203 ["Column Width" ebrowse-set-member-buffer-column-width
3207 ["Public" ebrowse-toggle-public-member-filter
3210 :selected (not (aref ebrowse--filters 0))
3212 ["Protected" ebrowse-toggle-protected-member-filter
3215 :selected (not (aref ebrowse--filters 1))
3217 ["Private" ebrowse-toggle-private-member-filter
3220 :selected (not (aref ebrowse--filters 2))
3222 ["Virtual" ebrowse-toggle-virtual-member-filter
3225 :selected ebrowse--virtual-display-flag
3227 ["Inline" ebrowse-toggle-inline-member-filter
3230 :selected ebrowse--inline-display-flag
3232 ["Const" ebrowse-toggle-const-member-filter
3235 :selected ebrowse--const-display-flag
3237 ["Pure" ebrowse-toggle-pure-member-filter
3240 :selected ebrowse--pure-display-flag
3243 ["Show all" ebrowse-remove-all-member-filters
3247 ["Tree" ebrowse-pop-from-member-to-tree-buffer
3250 ["Next Member Buffer" ebrowse-switch-to-next-member-buffer
3253 ["Freeze" ebrowse-freeze-member-buffer
3258 (defun ebrowse-on-class-name ()
3260 (eq (get-text-property (point) 'ebrowse-what) 'class-name))
3263 (defun ebrowse-on-member-name ()
3265 (eq (get-text-property (point) 'ebrowse-what) 'member-name))
3269 ebrowse-member-class-name-object-menu ebrowse-member-mode-map
3272 ["Find" ebrowse-find-member-definition
3274 :active (eq (get-text-property (point) 'ebrowse-what) 'class-name)]
3275 ["View" ebrowse-view-member-definition
3277 :active (eq (get-text-property (point) 'ebrowse-what) 'class-name)]))
3281 ebrowse-member-name-object-menu ebrowse-member-mode-map
3284 ["Find Definition" ebrowse-find-member-definition
3285 :help "Find this member's definition in the source files"
3286 :active (ebrowse-on-member-name)]
3287 ["Find Declaration" ebrowse-find-member-declaration
3289 :active (ebrowse-on-member-name)]
3290 ["View Definition" ebrowse-view-member-definition
3291 :help "View this member's definition in the source files"
3292 :active (ebrowse-on-member-name)]
3293 ["View Declaration" ebrowse-view-member-declaration
3295 :active (ebrowse-on-member-name)]))
3298 (defun ebrowse-member-mouse-3 (event)
3304 (2 (ebrowse-find-member-definition))
3306 'ebrowse-what)
3308 (ebrowse-popup-menu ebrowse-member-name-object-menu event))
3310 (ebrowse-popup-menu ebrowse-member-class-name-object-menu event))
3312 (ebrowse-popup-menu ebrowse-member-buffer-object-menu event))))))
3315 (defun ebrowse-member-mouse-2 (event)
3321 (2 (ebrowse-find-member-definition))
3323 'ebrowse-what)
3325 (ebrowse-view-member-definition 0))))))
3330 ;;; Tags view/find
3332 (defun ebrowse-class-alist-for-member (tree-header name)
3340 `ebrowse-class/index/member-for-member'."
3341 (let ((table (ebrowse-member-table tree-header))
3347 (setf alist (acons (ebrowse-qualified-class-name
3348 (ebrowse-ts-class (first info)))
3353 (defun ebrowse-choose-tree ()
3359 (let* ((buffer (ebrowse-choose-from-browser-buffers)))
3360 (if buffer (list (ebrowse-value-in-buffer 'ebrowse--tree buffer)
3361 (ebrowse-value-in-buffer 'ebrowse--header buffer)
3365 (defun ebrowse-tags-read-name (header prompt)
3367 HEADER is the `ebrowse-hs' structure of the class tree.
3371 (let* (start member-info (members (ebrowse-member-table header)))
3373 (ebrowse-tags-read-member+class-name)
3377 (let* ((name (ebrowse-ignoring-completion-case
3385 (or (first (ebrowse-list-of-matching-members
3393 (defun ebrowse-tags-read-member+class-name ()
3408 (defun ebrowse-tags-choose-class (tree header name initial-class-name)
3415 (let ((alist (or (ebrowse-class-alist-for-member header name)
3417 (ebrowse-ignoring-completion-case
3426 (defun* ebrowse-tags-view/find-member-decl/defn
3427 (prefix &key view definition member-name)
3428 "If VIEW is t, view, else find an occurrence of MEMBER-NAME.
3430 If DEFINITION is t, find or view the member definition else its
3434 the user choose the class to use. As a last step, a tags search
3436 definition."
3438 (tree header tree-buffer) (ebrowse-choose-tree)
3446 (ebrowse-tags-read-name
3449 (if definition "definition" "declaration") ": "))))
3450 (setq info (ebrowse-tags-choose-class tree header name class-name))
3451 (ebrowse-push-position marker info)
3453 (ebrowse-view/find-member-declaration/definition
3454 prefix view definition info
3456 (ebrowse-value-in-buffer 'ebrowse--tags-file-name tree-buffer))
3458 (ebrowse-push-position (point-marker) info t))))
3462 (defun ebrowse-tags-view-declaration ()
3465 (ebrowse-tags-view/find-member-decl/defn 0 :view t :definition nil))
3469 (defun ebrowse-tags-find-declaration ()
3472 (ebrowse-tags-view/find-member-decl/defn 0 :view nil :definition nil))
3476 (defun ebrowse-tags-view-definition ()
3477 "View definition of member at point."
3479 (ebrowse-tags-view/find-member-decl/defn 0 :view t :definition t))
3483 (defun ebrowse-tags-find-definition ()
3484 "Find definition of member at point."
3486 (ebrowse-tags-view/find-member-decl/defn 0 :view nil :definition t))
3489 (defun ebrowse-tags-view-declaration-other-window ()
3490 "View declaration of member at point in other window."
3492 (ebrowse-tags-view/find-member-decl/defn 4 :view t :definition nil))
3496 (defun ebrowse-tags-find-declaration-other-window ()
3497 "Find declaration of member at point in other window."
3499 (ebrowse-tags-view/find-member-decl/defn 4 :view nil :definition nil))
3503 (defun ebrowse-tags-view-definition-other-window ()
3504 "View definition of member at point in other window."
3506 (ebrowse-tags-view/find-member-decl/defn 4 :view t :definition t))
3510 (defun ebrowse-tags-find-definition-other-window ()
3511 "Find definition of member at point in other window."
3513 (ebrowse-tags-view/find-member-decl/defn 4 :view nil :definition t))
3516 (defun ebrowse-tags-view-declaration-other-frame ()
3517 "View definition of member at point in other frame."
3519 (ebrowse-tags-view/find-member-decl/defn 5 :view t :definition nil))
3523 (defun ebrowse-tags-find-declaration-other-frame ()
3524 "Find definition of member at point in other frame."
3526 (ebrowse-tags-view/find-member-decl/defn 5 :view nil :definition nil))
3530 (defun ebrowse-tags-view-definition-other-frame ()
3531 "View definition of member at point in other frame."
3533 (ebrowse-tags-view/find-member-decl/defn 5 :view t :definition t))
3537 (defun ebrowse-tags-find-definition-other-frame ()
3538 "Find definition of member at point in other frame."
3540 (ebrowse-tags-view/find-member-decl/defn 5 :view nil :definition t))
3543 (defun ebrowse-tags-select/create-member-buffer (tree-buffer info)
3547 (let ((buffer (get-buffer ebrowse-member-buffer-name)))
3550 (switch-to-buffer (ebrowse-display-member-buffer
3554 (setq ebrowse--displayed-class (first info)
3555 ebrowse--accessor (second info)
3556 ebrowse--member-list (funcall ebrowse--accessor ebrowse--displayed-class))
3557 (ebrowse-redisplay-member-buffer)))
3558 (ebrowse-move-point-to-member (ebrowse-ms-name (third info)))))
3561 (defun ebrowse-tags-display-member-buffer (&optional fix-name)
3567 (tree header tree-buffer) (ebrowse-choose-tree)
3572 (ebrowse-tags-read-name header
3574 (setq info (ebrowse-tags-choose-class tree header name class-name))
3575 (ebrowse-push-position marker info)
3576 (ebrowse-tags-select/create-member-buffer tree-buffer info))))
3579 (defun ebrowse-list-of-matching-members (members regexp &optional name)
3593 (defun ebrowse-tags-apropos ()
3596 (let* ((buffer (or (ebrowse-choose-from-browser-buffers)
3598 (header (ebrowse-value-in-buffer 'ebrowse--header buffer))
3599 (members (ebrowse-member-table header))
3606 (loop for s in (ebrowse-list-of-matching-members members regexp) do
3608 (ebrowse-draw-file-member-info info))))))
3611 (defun ebrowse-tags-list-members-in-file ()
3615 (let* ((buffer (or (ebrowse-choose-from-browser-buffers)
3617 (files (save-excursion (set-buffer buffer) (ebrowse-files-table)))
3619 (header (ebrowse-value-in-buffer 'ebrowse--header buffer))
3621 (members (ebrowse-member-table header)))
3628 as class = (ebrowse-ts-class (first info))
3629 when (or (and (null (ebrowse-ms-file member))
3630 (string= (ebrowse-cs-file class) file))
3631 (string= file (ebrowse-ms-file member)))
3632 do (ebrowse-draw-file-member-info info "decl.")
3633 when (or (and (null (ebrowse-ms-definition-file member))
3634 (string= (ebrowse-cs-source-file class) file))
3635 (string= file (ebrowse-ms-definition-file member)))
3636 do (ebrowse-draw-file-member-info info "defn.")))
3640 (defun* ebrowse-draw-file-member-info (info &optional (kind ""))
3648 (globals-p (ebrowse-globals-tree-p tree)))
3650 (insert (ebrowse-cs-name (ebrowse-ts-class tree))))
3651 (insert "::" (ebrowse-ms-name (third info)))
3656 ('ebrowse-ts-member-functions "member function")
3657 ('ebrowse-ts-member-variables "member variable")
3658 ('ebrowse-ts-static-functions "static function")
3659 ('ebrowse-ts-static-variables "static variable")
3660 ('ebrowse-ts-friends (if globals-p "define" "friend"))
3661 ('ebrowse-ts-types "type")
3665 (defvar ebrowse-last-completion nil
3669 (defvar ebrowse-last-completion-start nil
3673 (defvar ebrowse-last-completion-location nil
3677 (defvar ebrowse-last-completion-obarray nil
3681 (make-variable-buffer-local 'ebrowse-last-completion-obarray)
3682 (make-variable-buffer-local 'ebrowse-last-completion-location)
3683 (make-variable-buffer-local 'ebrowse-last-completion)
3684 (make-variable-buffer-local 'ebrowse-last-completion-start)
3689 (defun ebrowse-some-member-table ()
3693 (let* ((buffers (ebrowse-known-class-trees-buffer-list))
3696 (t (or (ebrowse-electric-choose-tree)
3698 (header (ebrowse-value-in-buffer 'ebrowse--header buffer)))
3699 (ebrowse-member-table header)))
3702 (defun ebrowse-cyclic-successor-in-string-list (string list)
3705 (or (nth (1+ (ebrowse-position string list 'string=)) list)
3713 (defun* ebrowse-tags-complete-symbol (prefix)
3726 (let* ((members (ebrowse-some-member-table))
3730 (setf ebrowse-last-completion-location nil)
3735 ((eq (point) ebrowse-last-completion-location)
3736 (setf list (all-completions ebrowse-last-completion-start
3737 ebrowse-last-completion-obarray)
3738 completion (ebrowse-cyclic-successor-in-string-list
3739 ebrowse-last-completion list))
3747 (setf ebrowse-last-completion completion
3748 ebrowse-last-completion-location (point)))))
3752 (let* ((members (ebrowse-some-member-table))
3756 (error "Can't find completion for `%s'" pattern))
3761 (setf ebrowse-last-completion-location (point)
3762 ebrowse-last-completion-start pattern
3763 ebrowse-last-completion completion
3764 ebrowse-last-completion-obarray members))))))))
3770 (defvar ebrowse-tags-loop-form ()
3771 "Form for `ebrowse-loop-continue'.
3775 (defvar ebrowse-tags-next-file-list ()
3779 (defvar ebrowse-tags-next-file-path nil
3783 (defvar ebrowse-tags-loop-last-file nil
3784 "The last file visited via `ebrowse-tags-loop'.")
3787 (defun ebrowse-tags-next-file (&optional initialize tree-buffer)
3797 (let ((buffer (or tree-buffer (ebrowse-choose-from-browser-buffers))))
3800 (setq ebrowse-tags-next-file-list
3801 (ebrowse-files-list (ebrowse-marked-classes-p))
3802 ebrowse-tags-loop-last-file
3804 ebrowse-tags-next-file-path
3805 (file-name-directory ebrowse--tags-file-name)))))
3807 (unless ebrowse-tags-next-file-list
3809 ;; ebrowse-tags-loop-last-file is the last file that was visited due
3813 (when ebrowse-tags-loop-last-file
3814 (let ((buffer (get-file-buffer ebrowse-tags-loop-last-file)))
3819 ;; wasn't visited by other means.
3820 (let ((file (expand-file-name (car ebrowse-tags-next-file-list)
3821 ebrowse-tags-next-file-path)))
3822 (setq ebrowse-tags-loop-last-file (if (get-file-buffer file) nil file))
3827 (pop ebrowse-tags-next-file-list)
3828 (find-file file)))
3832 (defun ebrowse-tags-loop-continue (&optional first-time tree-buffer)
3838 (ebrowse-tags-next-file first-time tree-buffer)
3840 (while (not (eval ebrowse-tags-loop-form))
3841 (ebrowse-tags-next-file)
3847 (defun ebrowse-tags-search (regexp)
3853 (eq (car ebrowse-tags-loop-form) 're-search-forward))
3854 (ebrowse-tags-loop-continue)
3855 (setq ebrowse-tags-loop-form (list 're-search-forward regexp nil t))
3856 (ebrowse-tags-loop-continue 'first-time)))
3860 (defun ebrowse-tags-query-replace (from to)
3865 (setq ebrowse-tags-loop-form
3869 (ebrowse-tags-loop-continue 'first-time))
3873 (defun ebrowse-tags-search-member-use (&optional fix-name)
3882 (ebrowse-choose-tree)
3889 (ebrowse-tags-read-name header "Find calls of: ")))
3890 ;; Set tags loop form to search for member and begin loop.
3892 ebrowse-tags-loop-form (list 're-search-forward regexp nil t))
3893 (ebrowse-tags-loop-continue 'first-time tree-buffer))))
3902 (defstruct (ebrowse-position (:type vector) :named)
3909 (defvar ebrowse-position-stack ()
3910 "Stack of `ebrowse-position' structured.")
3913 (defvar ebrowse-position-index 0
3917 (defun ebrowse-position-name (position)
3920 (let ((info (ebrowse-position-info position)))
3921 (concat (if (ebrowse-position-target position) "at " "to ")
3922 (ebrowse-cs-name (ebrowse-ts-class (first info)))
3923 "::" (ebrowse-ms-name (third info)))))
3926 (defun ebrowse-view/find-position (position &optional view)
3928 If VIEW is non-nil, view the position, otherwise find it."
3930 (find-file (ebrowse-position-file-name position))
3931 (goto-char (ebrowse-position-point position)))
3937 (goto-char (ebrowse-position-point position))))
3939 (view-file (ebrowse-position-file-name position)))
3943 (defun ebrowse-push-position (marker info &optional target)
3950 (let ((too-much (- (length ebrowse-position-stack)
3951 ebrowse-max-positions)))
3954 (setq ebrowse-position-stack
3955 (butlast ebrowse-position-stack too-much)))
3957 (push (make-ebrowse-position
3962 ebrowse-position-stack))))
3965 (defun ebrowse-move-in-position-stack (increment)
3967 (let ((length (length ebrowse-position-stack)))
3970 (setq ebrowse-position-index
3971 (mod (+ increment ebrowse-position-index) length))
3972 (message "Position %d of %d " ebrowse-position-index length)
3973 (ebrowse-view/find-position (nth ebrowse-position-index
3974 ebrowse-position-stack))))
3978 (defun ebrowse-back-in-position-stack (arg)
3982 (ebrowse-move-in-position-stack (max 1 arg)))
3986 (defun ebrowse-forward-in-position-stack (arg)
3990 (ebrowse-move-in-position-stack (min -1 (- arg))))
3997 (defvar ebrowse-electric-position-mode-map ()
4001 (defvar ebrowse-electric-position-mode-hook nil
4002 "If non-nil, its value is called by `ebrowse-electric-position-mode'.")
4005 (unless ebrowse-electric-position-mode-map
4008 (setq ebrowse-electric-position-mode-map map)
4009 (fillarray (car (cdr map)) 'ebrowse-electric-position-undefined)
4010 (fillarray (car (cdr submap)) 'ebrowse-electric-position-undefined)
4016 (define-key map "\C-c\C-c" 'ebrowse-electric-position-quit)
4017 (define-key map "q" 'ebrowse-electric-position-quit)
4018 (define-key map " " 'ebrowse-electric-select-position)
4025 (define-key map "v" 'ebrowse-electric-view-position)
4028 (define-key map "\e\C-v" 'scroll-other-window)
4033 (put 'ebrowse-electric-position-mode 'mode-class 'special)
4034 (put 'ebrowse-electric-position-undefined 'suppress-keymap t)
4037 (defun ebrowse-electric-position-mode ()
4039 Runs the hook `ebrowse-electric-position-mode-hook'."
4041 (use-local-map ebrowse-electric-position-mode-map)
4051 major-mode 'ebrowse-electric-position-mode)
4052 (run-mode-hooks 'ebrowse-electric-position-mode-hook))
4055 (defun ebrowse-draw-position-buffer ()
4062 (dolist (position ebrowse-position-stack)
4063 (insert (file-name-nondirectory (ebrowse-position-file-name position)))
4065 (insert (int-to-string (ebrowse-position-point position)))
4067 (insert (ebrowse-position-name position) "\n"))
4072 (defun ebrowse-electric-position-menu ()
4075 (unless ebrowse-position-stack
4079 (save-window-excursion (ebrowse-draw-position-buffer))
4086 (ebrowse-electric-position-mode)
4088 (catch 'ebrowse-electric-select-position
4098 (Electric-command-loop 'ebrowse-electric-select-position
4100 'ebrowse-electric-position-looper
4107 (ebrowse-electric-find-position select))
4111 (defun ebrowse-electric-position-looper (state condition)
4130 (defun ebrowse-electric-position-undefined ()
4137 (defun ebrowse-electric-position-quit ()
4140 (throw 'ebrowse-electric-select-position nil))
4143 (defun ebrowse-electric-select-position ()
4146 (throw 'ebrowse-electric-select-position (point)))
4149 (defun ebrowse-electric-find-position (point &optional view)
4150 "View/find what is described by the line at POINT.
4151 If VIEW is non-nil, view else find source files."
4153 (ebrowse-view/find-position (nth index
4154 ebrowse-position-stack) view)))
4157 (defun ebrowse-electric-view-position ()
4160 (ebrowse-electric-find-position (point) t))
4167 (defun ebrowse-write-file-hook-fn ()
4170 (ebrowse-save-tree)
4175 (defun ebrowse-save-tree ()
4178 (ebrowse-save-tree-as (or buffer-file-name ebrowse--tags-file-name)))
4182 (defun ebrowse-save-tree-as (&optional file-name)
4189 (header (copy-ebrowse-hs ebrowse--header))
4190 (tree ebrowse--tree))
4195 (setf (ebrowse-hs-member-table header) nil)
4197 (mapcar 'ebrowse-save-class tree)
4202 (ebrowse-update-tree-buffer-mode-line)
4206 (defun ebrowse-save-class (class)
4208 (message "%s..." (ebrowse-cs-name (ebrowse-ts-class class)))
4209 (insert "[ebrowse-ts ")
4210 (prin1 (ebrowse-ts-class class)) ;class name
4212 (mapcar 'ebrowse-save-class (ebrowse-ts-subclasses class))
4214 (dolist (func ebrowse-member-list-accessors)
4218 (prin1 (ebrowse-ts-mark class))
4227 (defun ebrowse-statistics ()
4235 (ebrowse-gather-statistics)
4239 (ebrowse-print-statistics-line "Number of classes:" classes)
4240 (ebrowse-print-statistics-line "Number of member functions:"
4242 (ebrowse-print-statistics-line "Number of member variables:"
4244 (ebrowse-print-statistics-line "Number of static functions:"
4246 (ebrowse-print-statistics-line "Number of static variables:"
4250 (defun ebrowse-print-statistics-line (title value)
4259 (defun ebrowse-gather-statistics ()
4266 (ebrowse-for-all-trees (tree ebrowse--tree-obarray)
4268 (incf member-functions (length (ebrowse-ts-member-functions tree)))
4269 (incf member-variables (length (ebrowse-ts-member-variables tree)))
4270 (incf static-functions (length (ebrowse-ts-static-functions tree)))
4271 (incf static-variables (length (ebrowse-ts-static-variables tree))))
4283 (defvar ebrowse-global-map nil
4287 (defvar ebrowse-global-prefix-key "\C-c\C-m"
4291 (defvar ebrowse-global-submap-4 nil
4292 "Keymap used for `ebrowse-global-prefix' followed by `4'.")
4295 (defvar ebrowse-global-submap-5 nil
4296 "Keymap used for `ebrowse-global-prefix' followed by `5'.")
4299 (unless ebrowse-global-map
4300 (setq ebrowse-global-map (make-sparse-keymap))
4301 (setq ebrowse-global-submap-4 (make-sparse-keymap))
4302 (setq ebrowse-global-submap-5 (make-sparse-keymap))
4303 (define-key ebrowse-global-map "a" 'ebrowse-tags-apropos)
4304 (define-key ebrowse-global-map "b" 'ebrowse-pop-to-browser-buffer)
4305 (define-key ebrowse-global-map "-" 'ebrowse-back-in-position-stack)
4306 (define-key ebrowse-global-map "+" 'ebrowse-forward-in-position-stack)
4307 (define-key ebrowse-global-map "l" 'ebrowse-tags-list-members-in-file)
4308 (define-key ebrowse-global-map "m" 'ebrowse-tags-display-member-buffer)
4309 (define-key ebrowse-global-map "n" 'ebrowse-tags-next-file)
4310 (define-key ebrowse-global-map "p" 'ebrowse-electric-position-menu)
4311 (define-key ebrowse-global-map "s" 'ebrowse-tags-search)
4312 (define-key ebrowse-global-map "u" 'ebrowse-tags-search-member-use)
4313 (define-key ebrowse-global-map "v" 'ebrowse-tags-view-definition)
4314 (define-key ebrowse-global-map "V" 'ebrowse-tags-view-declaration)
4315 (define-key ebrowse-global-map "%" 'ebrowse-tags-query-replace)
4316 (define-key ebrowse-global-map "." 'ebrowse-tags-find-definition)
4317 (define-key ebrowse-global-map "f" 'ebrowse-tags-find-definition)
4318 (define-key ebrowse-global-map "F" 'ebrowse-tags-find-declaration)
4319 (define-key ebrowse-global-map "," 'ebrowse-tags-loop-continue)
4320 (define-key ebrowse-global-map " " 'ebrowse-electric-buffer-list)
4321 (define-key ebrowse-global-map "\t" 'ebrowse-tags-complete-symbol)
4322 (define-key ebrowse-global-map "4" ebrowse-global-submap-4)
4323 (define-key ebrowse-global-submap-4 "." 'ebrowse-tags-find-definition-other-window)
4324 (define-key ebrowse-global-submap-4 "f" 'ebrowse-tags-find-definition-other-window)
4325 (define-key ebrowse-global-submap-4 "v" 'ebrowse-tags-find-declaration-other-window)
4326 (define-key ebrowse-global-submap-4 "F" 'ebrowse-tags-view-definition-other-window)
4327 (define-key ebrowse-global-submap-4 "V" 'ebrowse-tags-view-declaration-other-window)
4328 (define-key ebrowse-global-map "5" ebrowse-global-submap-5)
4329 (define-key ebrowse-global-submap-5 "." 'ebrowse-tags-find-definition-other-frame)
4330 (define-key ebrowse-global-submap-5 "f" 'ebrowse-tags-find-definition-other-frame)
4331 (define-key ebrowse-global-submap-5 "v" 'ebrowse-tags-find-declaration-other-frame)
4332 (define-key ebrowse-global-submap-5 "F" 'ebrowse-tags-view-definition-other-frame)
4333 (define-key ebrowse-global-submap-5 "V" 'ebrowse-tags-view-declaration-other-frame)
4334 (define-key global-map ebrowse-global-prefix-key ebrowse-global-map))
4353 (defun ebrowse-hack-electric-buffer-menu ()
4363 (if (or (ebrowse-buffer-p b)
4378 (defun ebrowse-select-1st-to-9nth ()
4387 (defun ebrowse-install-1-to-9-keys ()
4391 'ebrowse-select-1st-to-9nth)))
4394 (defun ebrowse-electric-buffer-list ()
4400 'ebrowse-hack-electric-buffer-menu)
4402 'ebrowse-install-1-to-9-keys)
4405 'ebrowse-hack-electric-buffer-menu)))
4411 (defun ebrowse-mouse-find-member (event)
4412 "Find the member clicked on in another frame.
4422 (ebrowse-tags-view/find-member-decl/defn
4423 5 :view nil :definition t :member-name name)))
4426 (defun ebrowse-popup-menu (menu event)
4440 ebrowse-tree-buffer-class-object-menu ebrowse-tree-mode-map
4443 ["Functions" ebrowse-tree-command:show-member-functions
4446 ["Variables" ebrowse-tree-command:show-member-variables
4449 ["Static Functions" ebrowse-tree-command:show-static-member-functions
4452 ["Static Variables" ebrowse-tree-command:show-static-member-variables
4455 ["Friends/ Defines" ebrowse-tree-command:show-friends
4458 ["Types" ebrowse-tree-command:show-types
4462 ["View" ebrowse-view-class-declaration
4464 :active (eq (get-text-property (point) 'ebrowse-what) 'class-name)]
4465 ["Find" ebrowse-find-class-declaration
4467 :active (eq (get-text-property (point) 'ebrowse-what) 'class-name)]
4469 ["Mark" ebrowse-toggle-mark-at-point
4471 :active (eq (get-text-property (point) 'ebrowse-what) 'class-name)]
4473 ["Collapse" ebrowse-collapse-branch
4475 :active (eq (get-text-property (point) 'ebrowse-what) 'class-name)]
4476 ["Expand" ebrowse-expand-branch
4478 :active (eq (get-text-property (point) 'ebrowse-what) 'class-name)]))
4482 ebrowse-tree-buffer-object-menu ebrowse-tree-mode-map
4485 ["Filename Display" ebrowse-toggle-file-name-display
4488 :selected ebrowse--show-file-names-flag
4490 ["Tree Indentation" ebrowse-set-tree-indentation
4493 ["Unmark All Classes" ebrowse-mark-all-classes
4496 ["Expand All" ebrowse-expand-all
4499 ["Statistics" ebrowse-statistics
4502 ["Find Class" ebrowse-read-class-name-and-go
4505 ["Member Buffer" ebrowse-pop/switch-to-member-buffer-for-same-tree
4510 (defun ebrowse-mouse-3-in-tree-buffer (event)
4516 (property (get-text-property where 'ebrowse-what)))
4521 (ebrowse-popup-menu ebrowse-tree-buffer-class-object-menu event))
4523 (ebrowse-popup-menu ebrowse-tree-buffer-object-menu event)))))))
4526 (defun ebrowse-mouse-2-in-tree-buffer (event)
4532 (property (get-text-property where 'ebrowse-what)))
4536 (ebrowse-tree-command:show-member-functions)))))))
4539 (defun ebrowse-mouse-1-in-tree-buffer (event)
4545 (property (get-text-property where 'ebrowse-what)))
4551 (ebrowse-collapse-fn (not collapsed))))
4553 (ebrowse-toggle-mark-at-point 1)))))))
4558 (provide 'ebrowse)
4561 ;;; eval:(put 'ebrowse-output 'lisp-indent-hook 0)
4562 ;;; eval:(put 'ebrowse-ignoring-completion-case 'lisp-indent-hook 0)
4563 ;;; eval:(put 'ebrowse-save-selective 'lisp-indent-hook 0)
4564 ;;; eval:(put 'ebrowse-for-all-trees 'lisp-indent-hook 1)
4568 ;;; ebrowse.el ends here