home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / browser2.zip / br-membe.el < prev    next >
Lisp/Scheme  |  1995-02-17  |  42KB  |  1,296 lines

  1. ;;; CLASS BROWSER FOR C++
  2. ;;; $Id: br-membe.el,v 3.1 1995/02/17 18:19:36 mmann Exp $
  3. ;;;
  4. ;;; **********************************************************************
  5. ;;; Copyright (C) 1993, 1994 Gerd Moellmann. All rights reserved.
  6. ;;; Altenbergstr. 6, D-40235 Duesseldorf, Germany
  7. ;;; 100025.3303@COMPUSERVE.COM
  8. ;;; Suggestions, comments and requests for improvements are welcome.
  9. ;;; **********************************************************************
  10. ;;;
  11. ;;; This version works with both Emacs version 18 and 19, and I want
  12. ;;; to keep it that way. It requires the CL-19 Common Lisp compatibility
  13. ;;; package for Emacs 18 and 19.
  14. ;;;
  15. ;;; This file contains the code for member-mode.
  16. ;;; 
  17.  
  18. ;; This file may be made part of the Emacs distribution at the option
  19. ;; of the FSF.
  20.  
  21. ;; This code is distributed in the hope that it will be useful,
  22. ;; but WITHOUT ANY WARRANTY.  No author or distributor
  23. ;; accepts responsibility to anyone for the consequences of using it
  24. ;; or for whether it serves any particular purpose or works at all,
  25. ;; unless he says so in writing.  Refer to the GNU Emacs General Public
  26. ;; License for full details.
  27.  
  28. ;; Everyone is granted permission to copy, modify and redistribute
  29. ;; this code, but only under the conditions described in the
  30. ;; GNU Emacs General Public License.   A copy of this license is
  31. ;; supposed to have been given to you along with GNU Emacs so you
  32. ;; can know your rights and responsibilities.  It should be in a
  33. ;; file named COPYING.  Among other things, the copyright notice
  34. ;; and this notice must be preserved on all copies.
  35.  
  36. (require 'cl-19 "cl")
  37. (require 'backquote)
  38. (require 'br-struc)
  39. (require 'br-macro)
  40.  
  41. (defvar member-mode-map ()
  42.   "The keymap used in the member buffers.")
  43.  
  44. (defvar member-default-decl-column 25
  45.   "*The column in which member declarations are displayed in member
  46. buffers.")
  47.  
  48. (defvar member-default-column-width 19
  49.   "*The width of the columns in member buffers (short display form).")
  50.  
  51. (defvar member-mode-hook nil
  52.   "Run in each new member buffer.")
  53.  
  54. ;;;
  55. ;;; Define mode line titles for each member list.
  56. ;;;
  57.  
  58. (put 'tree-member-variables 'browse-title "Member Variables")
  59. (put 'tree-member-functions 'browse-title "Member Functions")
  60. (put 'tree-static-variables 'browse-title "Static Variables")
  61. (put 'tree-static-functions 'browse-title "Static Functions")
  62. (put 'tree-friends 'browse-title "Friends")
  63. (put 'tree-types 'browse-title "Types")
  64.  
  65. (put 'tree-member-variables 'browse-global-title "Global Variables")
  66. (put 'tree-member-functions 'browse-global-title "Global Functions")
  67. (put 'tree-static-variables 'browse-global-title "Static Variables")
  68. (put 'tree-static-functions 'browse-global-title "Static Functions")
  69. (put 'tree-friends 'browse-global-title "Friends")
  70. (put 'tree-types 'browse-global-title "Types")
  71.  
  72. ;;;
  73. ;;; Faces used to hilight member mode buffers in Emacs 19.
  74. ;;; 
  75.  
  76. (defvar member-attributes-faces 'red
  77.   "*Face used to display member attributes.")
  78.  
  79. (defvar member-class-face 'purple
  80.   "*Face used to display the class title in member buffers.")
  81.  
  82. (tree-make-face member-attributes-faces)
  83. (tree-make-face member-class-face)
  84.  
  85. ;;;
  86. ;;; Initialize the member mode keymap.
  87. ;;; 
  88.  
  89. (unless member-mode-map
  90.   (setf member-mode-map (make-keymap))
  91.   (suppress-keymap member-mode-map)
  92.  
  93.   (when (and (browse-emacs-19-p) window-system)
  94.     (define-key member-mode-map [mouse-2] 'member-mouse-2))
  95.  
  96.   (define-key member-mode-map "a" 'member-display-attributes)
  97.   (define-key member-mode-map "c" 'member-show-some-class)
  98.   (define-key member-mode-map "d" 'member-show-class-down)
  99.   (define-key member-mode-map "f" 'member-find-definition)
  100.   (define-key member-mode-map "g" 'member-position-over-all-members)
  101.   (define-key member-mode-map "l" 'member-redisplay)
  102.   (define-key member-mode-map "m" 'member-next-member-buffer)
  103.   (define-key member-mode-map "n" 'member-show-next-sibling)
  104.   (define-key member-mode-map "q" 'bury-buffer)
  105.   (define-key member-mode-map "p" 'member-show-previous-sibling)
  106.   (define-key member-mode-map "r" 'member-toggle-regexp)
  107.   (define-key member-mode-map "t" 'member-show-class-in-tree)
  108.   (define-key member-mode-map "u" 'member-show-class-up)
  109.   (define-key member-mode-map "v" 'member-view-definition)
  110.   (define-key member-mode-map "w" 'member-set-column-width)
  111.   (define-key member-mode-map "F" 'member-find-declaration)
  112.   (define-key member-mode-map "L" 'member-toggle-long-short)
  113.   (define-key member-mode-map "V" 'member-view-declaration)
  114.   (define-key member-mode-map "\M-g" 'member-position-on-member)
  115.   (define-key member-mode-map "\C-d" 'member-kill)
  116.   (define-key member-mode-map "\C-i" 'member-pop-to-tree)
  117.   (define-key member-mode-map "\C-m" 'member-find-definition)
  118.   (define-key member-mode-map "+" 'member-view-next)
  119.   (define-key member-mode-map "-" 'member-view-previous)
  120.   (define-key member-mode-map "*" 'member-toggle-superclasses)
  121.   (define-key member-mode-map " " 'member-view-definition)
  122.   (define-key member-mode-map "~" 'member-mark-stand-alone)
  123.   (define-key member-mode-map "/" 'member-position-over-all-members)
  124.   (define-key member-mode-map "?" 'describe-mode)
  125.   (define-key member-mode-map "." 'browse-repeat-search)
  126.   (define-key member-mode-map "0" 'member-all-visible)
  127.   (define-key member-mode-map "1" 'member-public)
  128.   (define-key member-mode-map "2" 'member-protected)
  129.   (define-key member-mode-map "3" 'member-private)
  130.   (define-key member-mode-map "4" 'member-virtual)
  131.   (define-key member-mode-map "5" 'member-inline)
  132.   (define-key member-mode-map "6" 'member-const)
  133.   (define-key member-mode-map "7" 'member-pure))
  134.  
  135. ;;;
  136. ;;; Switch on member-mode.
  137. ;;; 
  138.  
  139. ;;###autoload
  140. (defun member-mode ()
  141.   "Major mode in member buffers.
  142. \\<member-mode-map>
  143. \\[member-display-attributes] -- display member attributes.
  144. \\[member-show-some-class] -- switch to some other class.
  145. \\[member-show-class-down] -- switch to some derived class.
  146. \\[member-find-definition] -- find file containing member definition.
  147. \\[member-position-over-all-members] -- position point on some member.
  148. \\[member-redisplay] -- redisplay buffer.
  149. \\[member-next-member-buffer] -- switch to next member buffer for same tree.
  150. \\[member-show-next-sibling] -- show next sibling class.
  151. \\[bury-buffer] -- bury the buffer.
  152. \\[member-show-previous-sibling] -- show previous sibling class.
  153. \\[member-toggle-regexp] -- toggle declaration/definition regexp display.
  154. \\[member-show-class-in-tree] -- show class in tree.
  155. \\[member-show-class-up] -- switch to some base class.
  156. \\[member-view-definition] -- view file containing member definition.
  157. \\[member-set-column-width] -- set display column width.
  158. \\[member-find-declaration] -- find file containing member declaration.
  159. \\[member-toggle-long-short] -- toggle long/short display.
  160. \\[member-view-declaration] -- view member declaration.
  161. \\[member-view-next] -- switch to next member list.
  162. \\[member-view-previous] -- switch to previous member list.
  163. \\[member-toggle-superclasses] -- toggle inherited member display.
  164. \\[member-mark-stand-alone] -- freeze buffer.
  165. \\[describe-mode] -- describe mode.
  166. \\[browse-repeat-search] -- repeat last search.
  167. \\[member-all-visible] -- switch off all display filters.
  168. \\[member-public] -- toggle display of public members.
  169. \\[member-protected] -- toggle display of protected members.
  170. \\[member-private] -- toggle display of private members.
  171. \\[member-inline] -- toggle display of inline members.
  172. \\[member-virtual] -- toggle display of virtual members.
  173. \\[member-const] -- toggle display of const members.
  174. \\[member-pure] -- toggle display of pure virtual members.
  175. \\[member-kill] -- delete member from tree.
  176. \\[member-position-on-member] -- go to some member.
  177.  
  178. \\{member-mode-map}"
  179.   (kill-all-local-variables)
  180.   (use-local-map member-mode-map)
  181.   (setq major-mode 'member-mode)
  182.   (setq mode-name "Member")
  183.   (mapcar 'make-local-variable
  184.       '(@decl-column        ;display column
  185.         @n-columns            ;number of short columns
  186.         @column-width        ;width of columns above
  187.         @show-inherited-p        ;include inherited members?
  188.         @filters            ;public, protected, private
  189.         @accessor            ;vars, functions, friends
  190.         @displayed-class        ;class displayed
  191.         @long-display-p        ;display with regexps?
  192.         @source-regexp-p        ;show source regexp?
  193.         @attributes-p        ;show `virtual' and `inline'
  194.         @member-list        ;list of members displayed
  195.         @tree            ;the class tree
  196.         @mode-line            ;part of mode line
  197.         member-mode-strings        ;part of mode line
  198.         @tags-filename        ;
  199.         @header
  200.         @tree-obarray
  201.         @virtual-display-p
  202.         @inline-display-p
  203.         @const-display-p
  204.         @pure-display-p
  205.         @frozen))            ;buffer not automagically reused
  206.   (setq mode-line-format (list "-- "
  207.                    '@mode-line
  208.                    " -- "
  209.                    'member-mode-strings
  210.                    " %-")
  211.     buffer-read-only t)
  212.   (setf @long-display-p nil
  213.     @attributes-p t
  214.     @show-inherited-p t
  215.     @source-regexp-p nil
  216.     @filters [0 1 2]
  217.     @decl-column member-default-decl-column
  218.     @column-width member-default-column-width
  219.     @virtual-display-p nil
  220.     @inline-display-p nil
  221.     @const-display-p nil
  222.     @pure-display-p nil)
  223.   (run-hooks 'member-mode-hook))
  224.  
  225. ;;;
  226. ;;; Return the name of the class displayed in the member buffer.
  227. ;;; 
  228.  
  229. (defun member-class-name ()
  230.   (class-name (tree-class @displayed-class)))
  231.  
  232. ;;;
  233. ;;; Switch to the next member buffer in buffer list.
  234. ;;; 
  235.  
  236. (defun member-next-member-buffer ()
  237.   "Switch to next member buffer."
  238.   (interactive)
  239.   (let* ((list (member-buffers))
  240.      (next-list (cdr (memq (current-buffer) list)))
  241.      (next-buffer (if next-list (car next-list) (car list))))
  242.     (if (eq next-buffer (current-buffer))
  243.     (error "No next buffer!")
  244.       (bury-buffer)
  245.       (switch-to-buffer next-buffer))))
  246.  
  247. ;;;
  248. ;;; Construct and update the mode line.     The mode line is made of two
  249. ;;; parts:
  250. ;;;
  251. ;;; |-- <Major part> -- <Minor part> --------------------------------|
  252. ;;;
  253. ;;; The major part displays what kinds of members are displayed in the
  254. ;;; buffer: instance vars, instance functions, static vars, static fns,
  255. ;;; or friends.     If the buffer is not a temporary buffer, the major
  256. ;;; part also includes the name of the class to which the members belong.
  257. ;;;
  258. ;;; The minor part displays the hiding
  259.  
  260. (defmacro member-list-name ()
  261.   (` (get @accessor (if (browse-global-tree-p @displayed-class)
  262.             'browse-global-title 'browse-title))))
  263.  
  264. (defun member-update-mode-line ()
  265.   (let ((class-name (if @frozen (concat (member-class-name) " "))))
  266.  
  267.     ;; Major title set to class-name plus member list name
  268.     (setq @mode-line
  269.       (concat class-name (member-list-name)))
  270.  
  271.     ;; Strings for public, protected, private
  272.     (setf member-mode-strings
  273.       (cond ((notany 'null @filters) "(All)")
  274.         ((every 'null @filters) "(None)")
  275.         (t nil)))
  276.  
  277.     (unless member-mode-strings
  278.       (dotimes (i 3)
  279.     (when (aref @filters i)
  280.       (when member-mode-strings
  281.         (setq member-mode-strings (concat member-mode-strings ", ")))
  282.       (setq member-mode-strings
  283.         (concat member-mode-strings
  284.             (aref ["public" "protected" "private"] i))))))
  285.  
  286.     ;; Inline and virtual
  287.     (when @virtual-display-p
  288.       (setf member-mode-strings (concat member-mode-strings " virtual")))
  289.     (when @inline-display-p
  290.       (setf member-mode-strings (concat member-mode-strings " inline")))
  291.     (when @const-display-p
  292.       (setf member-mode-strings (concat member-mode-strings " const")))
  293.     (when @pure-display-p
  294.       (setf member-mode-strings (concat member-mode-strings " pure")))
  295.  
  296.     ;; Long or short display form: add regexp displayed
  297.     (when @long-display-p
  298.       (setq member-mode-strings
  299.         (concat member-mode-strings
  300.             (if @source-regexp-p
  301.             " (definitions)"
  302.               " (declarations)"))))
  303.  
  304.     ;; Set buffer name
  305.     (browse-rename-buffer-safe (if class-name
  306.                    (concat class-name (member-list-name))
  307.                  member-buffer-name))
  308.  
  309.     ;; Force mode line redisplay
  310.     (set-buffer-modified-p (buffer-modified-p))))
  311.  
  312. ;;;
  313. ;;; Toggle display of attributes.
  314. ;;; 
  315.  
  316. (defun member-display-attributes ()
  317.   "Toggle display of `virtual', `inline', `const'."
  318.   (interactive)
  319.   (setq @attributes-p (not @attributes-p))
  320.   (member-redisplay))
  321.  
  322. ;;;
  323. ;;; Toggle reusablity of member buffer.
  324. ;;; 
  325.  
  326. (defun member-mark-stand-alone ()
  327.   "Toggle frozen status of current buffer."
  328.   (interactive)
  329.   (setq @frozen (not @frozen))
  330.   (member-redisplay))
  331.  
  332. ;;;
  333. ;;; Show currently displayed class in tree.
  334. ;;; 
  335.  
  336. (defun member-show-class-in-tree (arg)
  337.   "Show the currently displayed class in the tree window. With prefix
  338. arg switch to the tree buffer else pop to it."
  339.   (interactive "P")
  340.   (let ((class-name (member-class-name)))
  341.     (when (member-pop-to-tree arg)
  342.       (tree-position-on-class class-name))))
  343.  
  344. ;;;
  345. ;;; Set width of display.
  346. ;;; 
  347.  
  348. (defun member-set-column-width ()
  349.   "Set the column width of the member display."
  350.   (interactive)
  351.   (let ((width (string-to-int
  352.         (read-from-minibuffer
  353.          (concat "Column width ("
  354.              (int-to-string (if @long-display-p
  355.                         @decl-column
  356.                       @column-width))
  357.              "): ")))))
  358.     (when (plusp width)
  359.       (if @long-display-p
  360.       (setq @decl-column width)
  361.     (setq @column-width width))
  362.       (member-redisplay))))
  363.  
  364. ;;;
  365. ;;; Switch buffer to next/previous member list.
  366. ;;; 
  367.  
  368. (defun member-view-next ()
  369.   "Switch buffer to next member list."
  370.   (interactive)
  371.   (brm$view 1))
  372.  
  373. (defun member-view-previous ()
  374.   "Switch buffer to previous member list."
  375.   (interactive)
  376.   (brm$view -1))
  377.  
  378. ;;;
  379. ;;; View the tree buffer belonging to the current member
  380. ;;; buffer.  First, a standalone tree buffer is searched
  381. ;;; corresponding to the tags filename of the member buffer.
  382. ;;; If such a buffer is not found, try the default tree
  383. ;;; buffer.  If this buffer doesn't exist either, create
  384. ;;; the default tree buffer with the tree of the member
  385. ;;; buffer.
  386. ;;; 
  387.  
  388. (defun member-pop-to-tree (arg)
  389.   "Pop to the buffer displaying the class tree. Switch
  390. to the buffer if prefix arg. If no tree buffer exists,
  391. make one."
  392.   (interactive "P")
  393.   (let ((buf (or (get-buffer (tree-frozen-buffer-name
  394.                   @tags-filename))
  395.          (get-buffer tree-buffer-name)
  396.          (tree-create-buffer @tree
  397.                      @tags-filename
  398.                      @header
  399.                      @tree-obarray
  400.                      'pop))))
  401.     (and buf
  402.      (funcall (if arg 'switch-to-buffer 'pop-to-buffer) buf))
  403.     buf))
  404.  
  405. ;;;
  406. ;;; Helper routine for cyclic movement through member lists.
  407. ;;; 
  408.  
  409. (defun* brm$view (incr
  410.           &aux (index (position @accessor member-lists)))
  411.   "Switch buffer to next/previous subsection of members."
  412.   (setf @accessor
  413.     (cond ((plusp incr) (or (nth (1+ index) member-lists)
  414.                 (first member-lists)))
  415.           ((minusp incr) (or (and (>= (decf index) 0)
  416.                       (nth index member-lists))
  417.                  (first (last member-lists))))))
  418.   (member-display-list @accessor))
  419.  
  420. ;;;
  421. ;;; Show specific lists
  422. ;;;
  423.  
  424. (defun member-display-list (accessor)
  425.   (setf @accessor accessor
  426.     @member-list (funcall accessor @displayed-class))
  427.   (member-redisplay))
  428.  
  429. (defun member-display-fns ()
  430.   (interactive)
  431.   (member-display-list 'tree-member-functions))
  432.  
  433. (defun member-display-vars ()
  434.   (interactive)
  435.   (member-display-list 'tree-member-variables))
  436.  
  437. (defun member-display-svars ()
  438.   (interactive)
  439.   (member-display-list 'tree-static-variables))
  440.  
  441. (defun member-display-sfns ()
  442.   (interactive)
  443.   (member-display-list 'tree-static-functions))
  444.  
  445. (defun member-display-friends ()
  446.   (interactive)
  447.   (member-display-list 'tree-friends))
  448.  
  449. (defun member-display-types ()
  450.   (interactive)
  451.   (member-display-list 'tree-types))
  452.  
  453. ;;;
  454. ;;; Toggle display of inherited members.
  455. ;;;
  456.  
  457. (defun member-toggle-superclasses ()
  458.   "Toggle the display of members inherited from base classes."
  459.   (interactive)
  460.   (setf @show-inherited-p (not @show-inherited-p))
  461.   (member-redisplay))
  462.  
  463. ;;;
  464. ;;; Toggle display of pure virtual members, const members etc.
  465. ;;; 
  466.  
  467. (defun member-pure ()
  468.   "Toggle display of pure virtual members."
  469.   (interactive)
  470.   (setf @pure-display-p (not @pure-display-p))
  471.   (member-redisplay))
  472.  
  473. (defun member-const ()
  474.   "Toggle display of const members."
  475.   (interactive)
  476.   (setf @const-display-p (not @const-display-p))
  477.   (member-redisplay))
  478.  
  479. (defun member-inline ()
  480.   "Toggle display of inline members."
  481.   (interactive)
  482.   (setf @inline-display-p (not @inline-display-p))
  483.   (member-redisplay))
  484.  
  485. (defun member-virtual ()
  486.   "Toggle display of virtual members."
  487.   (interactive)
  488.   (setf @virtual-display-p (not @virtual-display-p))
  489.   (member-redisplay))
  490.  
  491. (defun member-all-visible ()
  492.   "Remove all filters."
  493.   (interactive)
  494.   (dotimes (i 3)
  495.     (aset @filters i i))
  496.   (setq @pure-display-p nil
  497.     @const-display-p nil
  498.     @virtual-display-p nil
  499.     @inline-display-p nil)
  500.   (member-redisplay))
  501.  
  502. (defun member-public ()
  503.   "Toggle visibility of public members."
  504.   (interactive)
  505.   (member-set-visibility 0)
  506.   (member-redisplay))
  507.  
  508. (defun member-protected ()
  509.   "Toggle visibility of protected members."
  510.   (interactive)
  511.   (member-set-visibility 1)
  512.   (member-redisplay))
  513.  
  514. (defun member-private ()
  515.   "Toggle visibility of private members."
  516.   (interactive)
  517.   (member-set-visibility 2)
  518.   (member-redisplay))
  519.  
  520. (defun member-set-visibility (vis)
  521.   (setf (aref @filters vis)
  522.     (if (aref @filters vis) nil vis)))
  523.  
  524. ;;;
  525. ;;; Toggle display form.
  526. ;;; 
  527.  
  528. (defun member-toggle-long-short ()
  529.   "Toggle between long and short display form."
  530.   (interactive)
  531.   (setf @long-display-p (not @long-display-p))
  532.   (member-redisplay))
  533.  
  534. ;;;
  535. ;;; Toggle regexp display.
  536. ;;; 
  537.  
  538. (defun member-toggle-regexp ()
  539.   "Toggle between display of declaration and definition
  540. regular expressions in the long display form."
  541.   (interactive)
  542.   (setf @source-regexp-p (not @source-regexp-p))
  543.   (member-redisplay))
  544.  
  545. ;;;
  546. ;;; Find or view  declarations/ definitions. If the member list displayed
  547. ;;; cannot contain declarations, make declaration and definition
  548. ;;; equaivalent.
  549. ;;;
  550.  
  551. (defun member-find-definition ()
  552.   "Find the file containing a member definition."
  553.   (interactive)
  554.   (member-goto nil t))
  555.  
  556. (defun member-view-definition ()
  557.   "View the file containing a member definition."
  558.   (interactive)
  559.   (member-goto t t))
  560.  
  561. (defun member-find-declaration ()
  562.   "Find the file containing a member's declaration."
  563.   (interactive)
  564.   (member-goto nil))
  565.  
  566. (defun member-view-declaration ()
  567.   "View the file containing a member's declaration."
  568.   (interactive)
  569.   (member-goto t))
  570.  
  571. ;;;
  572. ;;; INFO is (TREE MEMBER-LIST MEMBER) list.
  573. ;;; 
  574.  
  575. (defun* member-goto (view 
  576.              &optional definition info 
  577.              (header @header)
  578.              (tags-filename @tags-filename))
  579.   (let (tree member accessor file on-class)
  580.  
  581.     ;; If not given as parameters, get the necessary information
  582.     ;; out of the member buffer.
  583.  
  584.     (if info
  585.     (setq tree (first info) accessor (second info) member (third info))
  586.       (multiple-value-setq (tree member on-class) (member-get))
  587.       (setq accessor @accessor))
  588.  
  589.     ;; View/find class if on a line containing a class name.
  590.  
  591.     (when on-class
  592.       (return-from member-goto
  593.     (browse-find-pattern (tree-class tree)
  594.                  (list @header (tree-class tree) nil)
  595.                  (class-file (tree-class tree))
  596.                  tags-filename view)))
  597.  
  598.     ;; For some member lists, it doesn't make sense to search for
  599.     ;; a definition. If this is requested, silently search for the
  600.     ;; declaration.
  601.  
  602.     (when (and definition
  603.            (eq accessor 'tree-member-variables))
  604.       (setq definition nil))
  605.     
  606.     (when definition
  607.       (setf member (make-member
  608.             :name (member-name member)
  609.             :file (member-definition-file member)
  610.             :pattern (member-definition-pattern member)
  611.             :point (member-definition-point member))))
  612.  
  613.     ;; When no file information in member, use that of the class
  614.  
  615.     (setf file (or (member-file member)
  616.            (if definition
  617.                (class-source-file (tree-class tree))
  618.              (class-file (tree-class tree)))))
  619.  
  620.     ;; When we have no regular expressions in the database the only
  621.     ;; indication that the parser hasn't seen a definition/declaration
  622.     ;; is that the search start point will be zero.
  623.  
  624.     (if (or (null file) (zerop (member-point member)))
  625.     (if (y-or-n-p (concat "No information about "
  626.                   (if definition "definition" "declaration")
  627.                   ".  Search for "
  628.                   (if definition "declaration" "definition")
  629.                   " of `"
  630.                   (member-name member)
  631.                   "'? "))
  632.         (progn
  633.           (message "")
  634.           (member-goto view (not definition) info))
  635.       (error "Search canceled."))
  636.  
  637.       (browse-find-pattern (make-browse :name (member-name member)
  638.                     :pattern (member-pattern member)
  639.                     :file (member-file member)
  640.                     :point (member-point member))
  641.                (list header member accessor)
  642.                file tags-filename view))))
  643.  
  644. ;;;
  645. ;;; Given the name of a class CLASS-NAME, return a pair
  646. ;;; of class structure and associated member list. Search space
  647. ;;; for the class name is the class displayed in the buffer
  648. ;;; and its superclasses.
  649. ;;; 
  650.  
  651. (defun member-class-and-member (class-name)
  652.   (if (string= class-name (member-class-name))
  653.       (list @displayed-class @member-list)
  654.     (some (function (lambda (s)
  655.               (if (string= class-name (class-name (tree-class s)))
  656.               (list s (funcall @accessor s)))))
  657.       (browse-superclasses @displayed-class))))
  658.  
  659. ;;;
  660. ;;; Get the MEMBER structure for the member point is on.
  661. ;;; 
  662.  
  663. (defun* member-get (&aux on-class)
  664.   (save-excursion
  665.     (save-restriction
  666.       (widen)
  667.       (beginning-of-line)
  668.       (when (looking-at "^[ \t]*$") (error "Nothing on this line."))
  669.       (setq on-class (looking-at "class .*:"))))
  670.  
  671.   (let ((line (browse-current-line))
  672.     class-name
  673.     class-and-member
  674.     class
  675.     list-of-members
  676.     index)
  677.     (save-excursion
  678.       (save-restriction
  679.     (widen)
  680.     (when on-class (forward-line 1))
  681.     (unless (re-search-backward "class \\([*a-zA-Z0-9_]+\\):" nil t)
  682.       (error "Class name not found."))
  683.     (setf class-name (buffer-substring (match-beginning 1) (match-end 1)))
  684.     (decf line (browse-current-line))))
  685.  
  686.     (setf index (if @long-display-p
  687.             (- line 2)
  688.           (+ (* (- line 2) @n-columns)
  689.              (/ (current-column)
  690.             (+ @column-width
  691.                (if @attributes-p 7 0))))))
  692.  
  693.     ;; Get the class structure and the corresponding member list
  694.     ;; displayed in the buffer
  695.     (setf class-and-member (member-class-and-member class-name)
  696.       list-of-members (second class-and-member)
  697.       class (first class-and-member))
  698.  
  699.     (values class
  700.         (nth index (delq nil (mapcar 'member-display-p list-of-members)))
  701.         on-class)))
  702.  
  703.  
  704. ;;;
  705. ;;; Redisplay buffer.
  706. ;;;
  707.  
  708. (defun member-redisplay ()
  709.   "Force buffer re-display."
  710.   (interactive)
  711.   (let ((display (if @long-display-p
  712.              'member-long-display 'member-short-display)))
  713.     (browse-output
  714.       (erase-buffer)
  715.  
  716.       ;; Show this class
  717.       (member-title)
  718.       (funcall display @member-list)
  719.  
  720.       ;; Show inherited members if corresponding switch is on
  721.       (when @show-inherited-p
  722.     (mapcar (function
  723.          (lambda (super)
  724.            (goto-char (point-max))
  725.            (unless (bolp)
  726.              (insert "\n"))
  727.            (insert "\n")
  728.            (member-title super)
  729.            (funcall display (funcall @accessor super))))
  730.         (browse-superclasses @displayed-class)))
  731.  
  732.       ;; Update the mode line
  733.       (member-update-mode-line)
  734.  
  735.       ;; Re-highlight buffer if Emacs 19 is running.
  736.  
  737.       (if (and (browse-emacs-19-p)
  738.            browse-hilit-on-redisplay)
  739.       (hilit-rehighlight-buffer t)))))
  740.  
  741. ;;;
  742. ;;; Return a string to be used as the title for a class'
  743. ;;; section in the member buffer display.
  744. ;;; 
  745.  
  746. (defun member-title (&optional class)
  747.   (let ((start (point))
  748.     class-name-start class-name-end)
  749.     (insert "class ")
  750.     (setq class-name-start (point))
  751.     (insert (class-name (tree-class (or class @displayed-class))))
  752.     (setq class-name-end (point))
  753.     (insert ":\n\n")
  754.     (browse-set-face start (point) member-class-face)
  755.     (browse-put-text-property class-name-start class-name-end
  756.                   'browser 'class-name)
  757.     (browse-put-text-property class-name-start class-name-end
  758.                   'mouse-face 'highlight)))
  759.  
  760.  
  761. ;;;
  762. ;;; Start point for member buffer creation.
  763. ;;; 
  764.  
  765. (defun member-display (list &optional stand-alone class)
  766.   (let* ((classes @tree-obarray)
  767.      (tree @tree)
  768.      (tags-filename @tags-filename)
  769.      (header @header)
  770.      (temp-buffer (get-buffer member-buffer-name)))
  771.  
  772.     ;; Get the class description from the name the cursor
  773.     ;; is on if no specified as an argument.
  774.     (unless class
  775.       (setq class (tree-get-tree-at-point)))
  776.  
  777.     (with-output-to-temp-buffer member-buffer-name
  778.       (save-excursion
  779.     (set-buffer standard-output)
  780.  
  781.     ;; If new buffer, set the mode and initial values of locals
  782.     (unless temp-buffer
  783.       (member-mode))
  784.  
  785.     ;; Set local variables
  786.     (setq @member-list (funcall list class)
  787.           @displayed-class class
  788.           @accessor list
  789.           @tree-obarray classes
  790.           @frozen stand-alone
  791.           @tags-filename tags-filename
  792.           @header header
  793.           @tree tree
  794.           buffer-read-only t)
  795.  
  796.     (member-redisplay)
  797.     (current-buffer)))))
  798.  
  799. ;;;
  800. ;;; This predicate function returns T if MEMBER must be
  801. ;;; displayed under the current filter settings.
  802. ;;; 
  803.  
  804. (defun member-display-p (member)
  805.   (if (and (aref @filters (member-visibility member))
  806.        (or (null @const-display-p)
  807.            (member-const-p member))
  808.        (or (null @inline-display-p)
  809.            (member-inline-p member))
  810.        (or (null @pure-display-p)
  811.            (member-pure-p member))
  812.        (or (null @virtual-display-p)
  813.            (member-virtual-p member)))
  814.       member))
  815.  
  816. ;;;
  817. ;;; Insert a string for the attributes of a member.
  818. ;;; 
  819.  
  820. (defun member-insert-attributes (member)
  821.   (insert (if (member-virtual-p member) "v" "-")
  822.       (if (member-inline-p member)  "i" "-")
  823.       (if (member-const-p member)   "c" "-")
  824.       (if (member-pure-p member)    "0" "-")))
  825.  
  826. ;;;
  827. ;;; Insert string for regular expression.
  828. ;;; 
  829.  
  830. (defun member-insert-pattern (member-struc)
  831.   (let ((pattern (if @source-regexp-p
  832.              (member-definition-pattern member-struc)
  833.            (member-pattern member-struc))))
  834.     (cond ((stringp pattern)
  835.        (insert (browse-trim pattern) "...\n")
  836.        (beginning-of-line 0)
  837.        (move-to-column (+ 4 @decl-column))
  838.        (while (re-search-forward "[ \t]+" nil t)
  839.          (delete-region (match-beginning 0) (match-end 0))
  840.          (insert " "))
  841.        (beginning-of-line 2))
  842.       ((numberp pattern)
  843.        (insert "[" (tree-header-regexp-file @header)
  844.            " (" (int-to-string pattern) ")]\n"))
  845.       (t
  846.        (insert "[not recorded or unknown]\n")))))
  847.  
  848. ;;;
  849. ;;; Display member buffer in long form.
  850. ;;; 
  851.  
  852. (defun member-long-display (member-list)
  853.   (mapcar (function 
  854.        (lambda (member-struc)
  855.          (when member-struc
  856.            (let ((name (member-name member-struc))
  857.              (start (point)))
  858.          ;; Insert member name truncated to the right length
  859.          (insert (substring name
  860.                     0
  861.                     (min (length name)
  862.                      (1- @decl-column))))
  863.          (browse-put-text-property start (point)
  864.                        'mouse-face 'highlight)
  865.          (browse-put-text-property start (point)
  866.                        'browser 'member-name)
  867.          ;; Display virtual, inline, and const status
  868.          (setf start (point))
  869.          (browse-move-to-column @decl-column)
  870.          (browse-put-text-property start (point) 'mouse-face nil)
  871.          (when @attributes-p
  872.            (let ((start (point)))
  873.              (insert "<")
  874.              (member-insert-attributes member-struc)
  875.              (insert ">")
  876.              (browse-set-face start (point) member-attributes-faces)))
  877.          (insert " ")
  878.          (member-insert-pattern member-struc)))))
  879.       (mapcar 'member-display-p member-list))
  880.   (insert "\n")
  881.   (goto-char (point-min)))
  882.  
  883. ;;;
  884. ;;; Return the width of the display to be able to adjust
  885. ;;; the number columns that must be drawn in the short
  886. ;;; display form.  This functions cycles thru the window
  887. ;;; window list to find the window displaying the current
  888. ;;; buffer, if any.  If none is found, the buffer isn't
  889. ;;; displayed, and the width of the screen is used for
  890. ;;; the display width.
  891. ;;; 
  892.  
  893. (defun member-display-width ()
  894.   (let* ((start-window (selected-window))
  895.      done
  896.      (window start-window))
  897.  
  898.     ;; Find the window displaying the current buffer
  899.     (while (and (not (eq (window-buffer window) (current-buffer)))
  900.         (not done))
  901.       (setq window (next-window window)
  902.         done (eq window start-window)))
  903.  
  904.     ;; If a window is found use its width, else screen width.
  905.     (if (eq (window-buffer window) (current-buffer))
  906.     (window-width window)
  907.       (browse-frame-width))))
  908.  
  909. ;;;
  910. ;;; Display the member list in short form.
  911. ;;; 
  912.  
  913. (defun member-short-display (member-list)
  914.   (let ((i 0)
  915.     (column-width (+ @column-width (if @attributes-p 7 0))))
  916.  
  917.     ;; Get the number of columns to draw.
  918.     (setq @n-columns
  919.       (max 1 (/ (member-display-width) column-width)))
  920.  
  921.     (mapcar (function
  922.          (lambda (member)
  923.            (when member
  924.          (let ((name (member-name member))
  925.                (start (point)))
  926.            (browse-move-to-column (* i column-width))
  927.            (browse-put-text-property start (point)
  928.                          'mouse-face nil)
  929.            (when @attributes-p
  930.              (let ((start (point)))
  931.                (insert "<")
  932.                (member-insert-attributes member)
  933.                (insert "> ")
  934.                (browse-set-face start (point)
  935.                     member-attributes-faces)))
  936.  
  937.            (setf start (point))
  938.            (insert (substring name 0
  939.                       (min (length name) (1- @column-width))))
  940.            (browse-put-text-property start (point)
  941.                          'mouse-face 'highlight)
  942.            (browse-put-text-property start (point)
  943.                          'browser 'member-name)
  944.            (incf i)
  945.            (when (>= i @n-columns)
  946.              (setf i 0)
  947.              (insert "\n"))))))
  948.         (mapcar 'member-display-p member-list))
  949.  
  950.     (when (plusp i)
  951.       (insert "\n"))
  952.     (goto-char (point-min))))
  953.  
  954.  
  955. ;;;
  956. ;;; Assign a new value to a member list.
  957. ;;; 
  958.  
  959. (defun tree-set-member-list (class what newlist)
  960.   (eval (` (setf ((, what) class) newlist))))
  961.  
  962. ;;;
  963. ;;; Delete a member from the tree.
  964. ;;; 
  965.  
  966. (defun member-kill ()
  967.   "Delete member structure from tree."
  968.   (interactive)
  969.   (multiple-value-bind (class member) (member-get)
  970.     (when (y-or-n-p (format "Delete member `%s' from tree? "
  971.                 (member-name member)))
  972.       (let ((newlist (delq member (funcall @accessor class))))
  973.     (tree-set-member-list class @accessor newlist))
  974.       (member-redisplay))))
  975.  
  976.  
  977. ;;;
  978. ;;; Construct an ALIST containing all members visible in the buffer. Elements
  979. ;;; of the ALIST have the form (NAME . ACCESSOR).
  980. ;;; 
  981.  
  982. (defmacro member-alist-from-list (tree accessor)
  983.   (` (loop for m in (funcall (, accessor) (, tree))
  984.        collect (cons (member-name m) (, accessor)))))
  985.  
  986. (defun member-member-completions ()
  987.   (let ((list (member-alist-from-list @displayed-class @accessor)))
  988.     (if @show-inherited-p
  989.     (nconc list
  990.            (loop for tree in (browse-superclasses @displayed-class)
  991.              nconc (member-alist-from-list tree @accessor)))
  992.       list)))
  993.  
  994. ;;;
  995. ;;; The same as above but for all members of a class including
  996. ;;; those of superclasses if superclasses are shown in the
  997. ;;; member buffer.
  998. ;;; 
  999.  
  1000. (defun* member-all-member-completions (&aux list)
  1001.   (dolist (func member-lists list)
  1002.     (setq list (nconc list (member-alist-from-list @displayed-class func)))
  1003.     (when @show-inherited-p
  1004.       (dolist (class (browse-superclasses @displayed-class))
  1005.     (setq list (nconc list (member-alist-from-list class func)))))))
  1006.  
  1007. ;;;
  1008. ;;; Set point on a given member in the member buffer
  1009. ;;; 
  1010.  
  1011. (defun* member-set-point-to-member (name &optional repeat &aux member)
  1012.   (goto-char (point-min))
  1013.   (widen)
  1014.   (setq member
  1015.     (substring name 0 (min (length name) (1- @column-width)))
  1016.     browse-last-regexp
  1017.     (concat "[ \t\n]" (regexp-quote member) "[ \n\t]"))
  1018.   (if (re-search-forward browse-last-regexp nil t repeat)
  1019.       (goto-char (1+ (match-beginning 0)))
  1020.     (error "Not found.")))
  1021.  
  1022. ;;;
  1023. ;;; Let the user choose among all members of a class and its
  1024. ;;; superclasses (optional), and position point on the
  1025. ;;; member.
  1026. ;;; 
  1027.  
  1028. (defun member-position-over-all-members (prefix)
  1029.   "Read a member name from the minibuffer with completion and
  1030. position cursor on member. With prefix, position over all members
  1031. in the tree."
  1032.   (interactive "p")
  1033.   (browse-completion-ignoring-case
  1034.     (let* ((completion-list (member-all-member-completions))
  1035.        (member (completing-read "Goto member: " completion-list nil t))
  1036.        (accessor (cdr (assoc member completion-list))))
  1037.       (unless accessor (error "%s not found." member))
  1038.       (unless (eq accessor @accessor)
  1039.     (setf @accessor accessor
  1040.           @member-list (funcall accessor @displayed-class))
  1041.     (member-redisplay))
  1042.       (member-set-point-to-member member))))
  1043.  
  1044. ;;;
  1045. ;;; Simple positioning command on members only that are
  1046. ;;; currently visible in the buffer.
  1047. ;;; 
  1048.  
  1049. (defun member-position-on-member (repeat)
  1050.   "Read a member name from the minibuffer with completion and
  1051. position cursor on member."
  1052.   (interactive "p")
  1053.   (browse-completion-ignoring-case
  1054.     ;; Read member name
  1055.     (let* ((completion-list (member-member-completions))
  1056.        (member (completing-read "Goto member: " completion-list nil t)))
  1057.       (member-set-point-to-member member repeat))))
  1058.  
  1059. ;;;
  1060. ;;; Read a class name from the minibuffer and switch this
  1061. ;;; buffer to display that class.
  1062. ;;; 
  1063.  
  1064. (defun member-goto-other-class (title compl-list)
  1065.   (let* ((initial (unless (second compl-list)
  1066.             (first (first compl-list))))
  1067.      (class (browse-completing-read-value title compl-list initial)))
  1068.     (unless class
  1069.       (error "Not found."))
  1070.     (setf @displayed-class class
  1071.       @member-list (funcall @accessor @displayed-class))
  1072.     (member-redisplay)))
  1073.  
  1074. ;;;
  1075. ;;; Let the user choose an arbitrary class to be displayed
  1076. ;;; in the current member buffer.
  1077. ;;; 
  1078.  
  1079. (defun member-show-some-class ()
  1080.   "Switch buffer to some other class read from the minibuffer."
  1081.   (interactive)
  1082.   (member-goto-other-class "Goto class: " (tree-alist)))
  1083.  
  1084. ;;;
  1085. ;;; Return the list of direct super classes for TREE.
  1086. ;;; 
  1087.  
  1088. (defun browse-direct-supers (tree)
  1089.   (remove-if-not (function (lambda (s) (memq tree (tree-subclasses s))))
  1090.          (browse-superclasses tree)))
  1091.  
  1092. ;;;
  1093. ;;; Let the user choose among the superclasses of the current
  1094. ;;; class in the member buffer and redisplay the member buffer
  1095. ;;; with the class chosen.
  1096. ;;; 
  1097.  
  1098. (defun member-show-class-up (arg)
  1099.   "Switch buffer to a base class."
  1100.   (interactive "P")
  1101.   (flet ((tree-alist () (loop for s in supers
  1102.                   collect (cons (class-name (tree-class s)) s)))
  1103.      (no-bases () (error "No base classes.")))
  1104.     (let ((supers (or (browse-direct-supers @displayed-class) (no-bases))))
  1105.       (if (and arg (second supers))
  1106.       (member-goto-other-class "Goto base class: " (tree-alist))
  1107.     (setq @displayed-class (first supers)
  1108.           @member-list (funcall @accessor @displayed-class))
  1109.     (member-redisplay)))))
  1110.  
  1111. ;;;
  1112. ;;; Switch the member to display a sibling class.  If a root class is
  1113. ;;; currently displayed, a sibling is defined as another root class.
  1114. ;;; If more than one base class exists for the class displayed, get
  1115. ;;; the base class to position relative to from the minibuffer.
  1116. ;;; 
  1117.  
  1118. (defun member-show-next-sibling (arg)
  1119.   "Move to nth next sibling class; n given by prefix arg."
  1120.   (interactive "p")
  1121.   (member-show-sibling-class arg))
  1122.  
  1123. (defun member-show-previous-sibling (arg)
  1124.   "Move to nth previous sibling class; n given by prefix arg."
  1125.   (interactive "p")
  1126.   (member-show-sibling-class (- arg)))
  1127.  
  1128. (defun* member-show-sibling-class
  1129.   (inc &aux (containing-list @tree) index cls
  1130.        (supers (browse-direct-supers @displayed-class)))
  1131.   (interactive "p")
  1132.   (flet ((trees-alist (trees)
  1133.        (loop for tr in trees
  1134.          collect (cons (class-name (tree-class tr)) tr))))
  1135.     (when supers
  1136.       (let ((tree (if (second supers)
  1137.               (browse-completing-read-value
  1138.                "Relative to base class: " (trees-alist supers) nil)
  1139.             (first supers))))
  1140.     (unless tree (error "Not found."))
  1141.     (setq containing-list (tree-subclasses tree)))))
  1142.   (setq index (+ inc (position @displayed-class containing-list :test 'eq)))
  1143.   (cond ((minusp index) (message "No previous class."))
  1144.     ((null (nth index containing-list)) (message "No next class.")))
  1145.   (setq index (max 0 (min index (1- (length containing-list)))))
  1146.   (setq cls (nth index containing-list))
  1147.   (setf @displayed-class cls
  1148.     @member-list (funcall @accessor cls))
  1149.   (member-redisplay))
  1150.  
  1151. ;;;
  1152. ;;; Let the user choose among the subclasses of the current
  1153. ;;; class in the member buffer and redisplay the member buffer
  1154. ;;; with the class chosen.
  1155. ;;; 
  1156.  
  1157. (defun member-show-class-down (arg)
  1158.   "Switch buffer to the first derived class or to some other derived class
  1159. if called with prefix arg."
  1160.   (interactive "P")
  1161.   (flet ((no-derived () (error "No derived classes."))
  1162.      (tree-alist () (loop for s in (tree-subclasses @displayed-class)
  1163.                   collect (cons (class-name (tree-class s)) s))))
  1164.     (let ((subs (or (tree-subclasses @displayed-class) (no-derived))))
  1165.       (if (and arg (second subs))
  1166.       (member-goto-other-class "Goto derived class: " (tree-alist))
  1167.     (setq @displayed-class (first subs)
  1168.           @member-list (funcall @accessor @displayed-class))
  1169.     (member-redisplay)))))
  1170.  
  1171. ;;;
  1172. ;;; Repeat the search for the last regular expression.
  1173. ;;; 
  1174.  
  1175. (defun browse-repeat-search (repeat)
  1176.   "Repeat the last regular expression search."
  1177.   (interactive "p")
  1178.   (unless browse-last-regexp
  1179.     (error "No regular expression remembered!"))
  1180.  
  1181.   ;; Skip over word the point is on
  1182.   (skip-chars-forward "^ \t\n")
  1183.  
  1184.   ;; Search for regexp from point
  1185.   (if (re-search-forward browse-last-regexp nil t repeat)
  1186.       (progn
  1187.     (goto-char (match-beginning 0))
  1188.     (skip-chars-forward " \t\n"))
  1189.  
  1190.     ;; If not found above, repeat search from buffer start
  1191.     (goto-char (point-min))
  1192.     (if (re-search-forward browse-last-regexp nil t)
  1193.     (progn
  1194.       (goto-char (match-beginning 0))
  1195.       (skip-chars-forward " \t\n"))
  1196.       (error "Not found."))))
  1197.  
  1198.  
  1199. ;;;
  1200. ;;; Pop to a browser buffer from any other buffer.
  1201. ;;;
  1202.  
  1203. (defun browse-pop-to-browser-buffer (arg)
  1204.   "Pop to a browser buffer from any other buffer. Pop to member
  1205. buffer if no prefix, to tree buffer otherwise."
  1206.   (interactive "P")
  1207.   (let ((buffer (get-buffer (if arg 
  1208.                 tree-buffer-name member-buffer-name))))
  1209.     (unless buffer
  1210.       (setq buffer 
  1211.         (get-buffer (if arg member-buffer-name tree-buffer-name))))
  1212.     (unless buffer
  1213.       (error "No browser buffer found!"))
  1214.     (pop-to-buffer buffer)))
  1215.  
  1216.  
  1217. ;;;
  1218. ;;; Mouse support for Emacs 19. Find definition of member clicked on.
  1219. ;;;
  1220.  
  1221. (defun member-name-object-menu (event)
  1222.   (let* ((menu '("" (""
  1223.             ("Find definition" . member-find-definition)
  1224.             ("Find declaration" . member-find-declaration)
  1225.             ("View definition" . member-view-definition)
  1226.             ("View declaration" . member-view-declaration))))
  1227.      (selection (x-popup-menu event menu)))
  1228.     (when selection
  1229.       (call-interactively selection))))
  1230.  
  1231. (defun member-class-object-menu (event)
  1232.   (let* ((menu '("" (""
  1233.             ("Find" . member-find-definition)
  1234.             ("View" . member-view-definition))))
  1235.      (selection (x-popup-menu event menu)))
  1236.     (when selection
  1237.       (call-interactively selection))))
  1238.  
  1239. (defun member-buffer-object-menu (event)
  1240.   (let* ((menu '("Member Buffer"
  1241.          ("List"
  1242.           ("Functions" . member-display-fns)
  1243.           ("Variables" . member-display-vars)
  1244.           ("Static variables" . member-display-svars)
  1245.           ("Static functions" . member-display-sfns)
  1246.           ("Types" . member-display-types)
  1247.           ("Friends" . member-display-friends))
  1248.          ("Class"
  1249.           ("Up" . member-show-class-up)
  1250.           ("Down" . member-show-class-down)
  1251.           ("Next sibling" . member-show-next-sibling)
  1252.           ("Previous sibling" . member-show-previous-sibling))
  1253.          ("Member"
  1254.           ("Show in tree" . member-show-class-in-tree)
  1255.           ("Find in this class" . member-position-on-member)
  1256.           ("Find in tree" . member-position-over-all-members))
  1257.          ("Display" 
  1258.           ("Inherited" . member-toggle-superclasses)
  1259.           ("Attributes" . member-display-attributes)
  1260.           ("Long/short" . member-toggle-long-short)
  1261.           ("Column width" . member-set-column-width))
  1262.          ("Filter"
  1263.           ("Public" . member-public)
  1264.           ("Protected" . member-protected)
  1265.           ("Private" . member-private)
  1266.           ("Virtual" . member-virtual)
  1267.           ("Inline" . member-inline)
  1268.           ("Const" . member-const)
  1269.           ("Pure" . member-pure)
  1270.           ("--")
  1271.           ("Show all" . member-all-visible))
  1272.          ("Buffer"
  1273.           ("Tree" . member-pop-to-tree)
  1274.           ("Next member buffer" . member-next-member-buffer)
  1275.           ("Freeze" . member-mark-stand-alone))
  1276.           ))
  1277.      (selection (x-popup-menu event menu)))
  1278.     (when selection
  1279.       (call-interactively selection))))
  1280.  
  1281. (defun member-mouse-2 (event)
  1282.   (interactive "e")
  1283.   (mouse-set-point event)
  1284.   (case (event-click-count event)
  1285.     (2 (member-find-definition))
  1286.     (1
  1287.      (case (browse-get-text-property (posn-point (event-start event)) 'browser)
  1288.        (member-name (member-name-object-menu event))
  1289.        (class-name (member-class-object-menu event))
  1290.        (t (member-buffer-object-menu event))))))
  1291.  
  1292. (provide 'br-membe)
  1293.  
  1294. ;; end of `member.el'
  1295.  
  1296.