annotate lisp/hyperbole/hbdata.el @ 143:50e7fedfe353

Added tag r20-2b5 for changeset 1856695b1fa9
author cvs
date Mon, 13 Aug 2007 09:33:20 +0200
parents 376386a54a3c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1 ;;!emacs
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3 ;; FILE: hbdata.el
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4 ;; SUMMARY: Hyperbole button attribute accessor methods.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5 ;; USAGE: GNU Emacs Lisp Library
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6 ;; KEYWORDS: hypermedia
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8 ;; AUTHOR: Bob Weiner
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9 ;; ORG: Brown U.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
10 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
11 ;; ORIG-DATE: 2-Apr-91
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
12 ;; LAST-MOD: 14-Apr-95 at 15:59:49 by Bob Weiner
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
13 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
14 ;; This file is part of Hyperbole.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
15 ;; Available for use and distribution under the same terms as GNU Emacs.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
16 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
17 ;; Copyright (C) 1991-1995, Free Software Foundation, Inc.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
18 ;; Developed with support from Motorola Inc.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
19 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
20 ;; DESCRIPTION:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
21 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
22 ;; This module handles Hyperbole button data/attribute storage. In
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
23 ;; general, it should not be extended by anyone other than Hyperbole
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
24 ;; maintainers. If you alter the formats or accessors herein, you are
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
25 ;; likely to make your buttons incompatible with future releases.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
26 ;; System developers should instead work with and extend the "hbut.el"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
27 ;; module which provides much of the Hyperbole application programming
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
28 ;; interface and which hides the low level details handled by this
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
29 ;; module.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
30 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
31 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
32 ;; Button data is typically stored within a file that holds the button
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
33 ;; data for all files within that directory. The name of this file is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
34 ;; given by the variable 'hattr:filename,' usually it is ".hypb".
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
35 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
36 ;; Here is a sample from a Hyperbole V2 button data file. Each button
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
37 ;; data entry is a list of fields:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
38 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
39 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
40 ;; "TO-DO"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
41 ;; (Key Placeholders LinkType <arg-list> creator and modifier with times)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
42 ;; ("alt.mouse.el" nil nil link-to-file ("./ell/alt-mouse.el") "zzz@cs.brown.edu" "19911027:09:19:26" "zzz" "19911027:09:31:36")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
43 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
44 ;; which means: button \<(alt.mouse.el)> found in file "TO-DO" in the current
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
45 ;; directory provides a link to the local file "./ell/alt-mouse.el". It was
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
46 ;; created and last modified by zzz@cs.brown.edu.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
47 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
48 ;; All link entries that originate from the same source file are stored
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
49 ;; contiguously, one per line, in reverse order of creation.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
50 ;; Preceding all such entries is the source name (in the case of a file
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
51 ;; used as a source, no directory information is included, since only
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
52 ;; sources within the same directory as the button data file are used as
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
53 ;; source files within it.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
54 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
55 ;; DESCRIP-END.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
56
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
57 ;;; ************************************************************************
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
58 ;;; Other required Elisp libraries
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
59 ;;; ************************************************************************
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
60
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
61 (require 'hbmap)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
62
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
63 ;;; ************************************************************************
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
64 ;;; Public functions
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
65 ;;; ************************************************************************
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
66
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
67 ;;; ------------------------------------------------------------------------
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
68 ;;; Button data accessor functions
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
69 ;;; ------------------------------------------------------------------------
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
70 (defun hbdata:action (hbdata)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
71 "[Hyp V2] Returns action overriding button's action type or nil."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
72 (nth 1 hbdata))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
73
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
74 (defun hbdata:actype (hbdata)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
75 "Returns the action type in HBDATA as a string."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
76 (let ((nm (symbol-name (nth 3 hbdata))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
77 (and nm (if (or (= (length nm) 2) (string-match "::" nm))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
78 nm (concat "actypes::" nm)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
79
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
80 (defun hbdata:args (hbdata)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
81 "Returns the list of any arguments given in HBDATA."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
82 (nth 4 hbdata))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
83
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
84 (defun hbdata:categ (hbdata)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
85 "Returns the category of HBDATA's button."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
86 'explicit)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
87
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
88 (defun hbdata:creator (hbdata)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
89 "Returns the user-id of the original creator of HBDATA's button."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
90 (nth 5 hbdata))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
91
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
92 (defun hbdata:create-time (hbdata)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
93 "Returns the original creation time given for HBDATA's button."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
94 (nth 6 hbdata))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
95
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
96 (defun hbdata:key (hbdata)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
97 "Returns the indexing key in HBDATA as a string."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
98 (car hbdata))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
99
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
100 (defun hbdata:loc-p (hbdata)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
101 "[Hyp V1] Returns 'L iff HBDATA referent is within a local file system.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
102 Returns 'R if remote and nil if irrelevant for button action type."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
103 (nth 1 hbdata))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
104
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
105 (defun hbdata:modifier (hbdata)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
106 "Returns the user-id of the most recent modifier of HBDATA's button.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
107 Nil is returned when button has not been modified."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
108 (nth 7 hbdata))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
109
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
110 (defun hbdata:mod-time (hbdata)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
111 "Returns the time of the most recent change to HBDATA's button.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
112 Nil is returned when button has not beened modified."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
113 (nth 8 hbdata))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
114
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
115 (defun hbdata:referent (hbdata)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
116 "Returns the referent name in HBDATA."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
117 (nth 2 hbdata))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
118
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
119 (defun hbdata:search (buf label partial)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
120 "Go to Hyperbole hbdata BUF and find LABEL whole or PARTIAL matches.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
121 Search is case-insensitive. Returns list with elements:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
122 (<button-src> <label-key1> ... <label-keyN>)."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
123 (set-buffer buf)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
124 (let ((case-fold-search t) (src-matches) (src) (matches) (end))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
125 (goto-char (point-min))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
126 (while (re-search-forward "^\^L\n\"\\([^\"]+\\)\"" nil t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
127 (setq src (buffer-substring (match-beginning 1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
128 (match-end 1))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
129 matches nil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
130 (save-excursion
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
131 (setq end (if (re-search-forward "^\^L" nil t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
132 (1- (point)) (point-max))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
133 (while (re-search-forward
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
134 (concat "^(\"\\(" (if partial "[^\"]*")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
135 (regexp-quote (ebut:label-to-key label))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
136 (if partial "[^\"]*") "\\)\"") nil t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
137 (setq matches (cons
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
138 (buffer-substring (match-beginning 1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
139 (match-end 1))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
140 matches)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
141 (if matches
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
142 (setq src-matches (cons (cons src matches) src-matches)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
143 (goto-char end))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
144 src-matches))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
145
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
146 ;;; ------------------------------------------------------------------------
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
147 ;;; Button data operators
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
148 ;;; ------------------------------------------------------------------------
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
149
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
150 (defun hbdata:build (&optional mod-lbl-key but-sym)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
151 "Tries to construct button data from optional MOD-LBL-KEY and BUT-SYM.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
152 MOD-LBL-KEY nil means create a new entry, otherwise modify existing one.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
153 BUT-SYM nil means use 'hbut:current'. If successful, returns a cons of
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
154 (button-data . button-instance-str), else nil."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
155 (let* ((but)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
156 (b (hattr:copy (or but-sym 'hbut:current) 'but))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
157 (l (hattr:get b 'loc))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
158 (key (or mod-lbl-key (hattr:get b 'lbl-key)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
159 (new-key (if mod-lbl-key (hattr:get b 'lbl-key) key))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
160 (lbl-instance) (creator) (create-time) (modifier) (mod-time)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
161 (entry) loc dir)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
162 (if (null l)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
163 nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
164 (setq loc (if (bufferp l) l (file-name-nondirectory l))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
165 dir (if (bufferp l) nil (file-name-directory l)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
166 (if (setq entry (hbdata:to-entry key loc dir (not mod-lbl-key)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
167 (if mod-lbl-key
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
168 (progn
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
169 (setq creator (hbdata:creator entry)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
170 create-time (hbdata:create-time entry)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
171 modifier (let* ((user (user-login-name))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
172 (addr (concat user
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
173 hyperb:host-domain)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
174 (if (equal creator addr)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
175 user addr))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
176 mod-time (htz:date-sortable-gmt)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
177 entry (cons new-key (cdr entry)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
178 (hbdata:delete-entry-at-point)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
179 (if (setq lbl-instance (hbdata:instance-last new-key loc dir))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
180 (progn
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
181 (setq lbl-instance (concat ebut:instance-sep
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
182 (1+ lbl-instance)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
183 ;; This line is needed to ensure that the highest
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
184 ;; numbered instance of a label appears before
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
185 ;; other instances, so 'hbdata:instance-last' will work.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
186 (if (hbdata:to-entry-buf loc dir) (forward-line 1))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
187 )
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
188 (let ((inst-num (hbdata:instance-last new-key loc dir)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
189 (setq lbl-instance (if inst-num
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
190 (hbdata:instance-next
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
191 (concat new-key ebut:instance-sep
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
192 (int-to-string inst-num))))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
193 ))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
194 (if (or entry (not mod-lbl-key))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
195 (cons
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
196 (list (concat new-key lbl-instance)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
197 (hattr:get b 'action)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
198 ;; Hyperbole V1 referent compatibility, always nil in V2
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
199 (hattr:get b 'referent)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
200 ;; Save actype without class prefix
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
201 (let ((actype (hattr:get b 'actype)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
202 (and actype (symbolp actype)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
203 (setq actype (symbol-name actype))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
204 (intern
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
205 (substring actype (if (string-match "::" actype)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
206 (match-end 0) 0)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
207 (let ((mail-dir (and (fboundp 'hmail:composing-dir)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
208 (hmail:composing-dir l)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
209 (args (hattr:get b 'args)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
210 ;; Replace matches for Emacs Lisp directory variable
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
211 ;; values with their variable names in any pathname args.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
212 (mapcar 'hpath:substitute-var
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
213 (if mail-dir
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
214 ;; Make pathname args absolute for outgoing mail and
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
215 ;; news messages.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
216 (action:path-args-abs args mail-dir)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
217 args)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
218 (or creator (concat (user-login-name) hyperb:host-domain))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
219 (or create-time (htz:date-sortable-gmt))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
220 modifier
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
221 mod-time)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
222 lbl-instance)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
223 ))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
224
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
225 (defun hbdata:get-entry (lbl-key key-src &optional directory)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
226 "Returns button data entry given by LBL-KEY, KEY-SRC and optional DIRECTORY.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
227 Returns nil if no matching entry is found.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
228 A button data entry is a list of attribute values. Use methods from
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
229 class 'hbdata' to operate on the entry."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
230 (hbdata:apply-entry
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
231 (function (lambda () (read (current-buffer))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
232 lbl-key key-src directory))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
233
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
234 (defun hbdata:instance-next (lbl-key)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
235 "Returns string for button instance number following LBL-KEY's.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
236 nil if LBL-KEY is nil."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
237 (and lbl-key
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
238 (if (string-match
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
239 (concat (regexp-quote ebut:instance-sep) "[0-9]+$") lbl-key)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
240 (concat ebut:instance-sep
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
241 (int-to-string
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
242 (1+ (string-to-int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
243 (substring lbl-key (1+ (match-beginning 0)))))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
244 ":2")))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
245
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
246 (defun hbdata:instance-last (lbl-key key-src &optional directory)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
247 "Returns highest instance number for repeated button label.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
248 1 if not repeated, nil if no instance.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
249 Takes arguments LBL-KEY, KEY-SRC and optional DIRECTORY."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
250 (hbdata:apply-entry
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
251 (function (lambda ()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
252 (if (looking-at "[0-9]+")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
253 (string-to-int (buffer-substring (match-beginning 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
254 (match-end 0)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
255 1)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
256 lbl-key key-src directory nil 'instance))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
257
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
258 (defun hbdata:delete-entry (lbl-key key-src &optional directory)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
259 "Deletes button data entry given by LBL-KEY, KEY-SRC and optional DIRECTORY.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
260 Returns entry deleted (a list of attribute values) or nil.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
261 Use methods from class 'hbdata' to operate on the entry."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
262 (hbdata:apply-entry
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
263 (function
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
264 (lambda ()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
265 (prog1 (read (current-buffer))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
266 (let ((empty-file-entry "[ \t\n]*\\(\^L\\|\\'\\)")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
267 (kill))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
268 (beginning-of-line)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
269 (hbdata:delete-entry-at-point)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
270 (if (looking-at empty-file-entry)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
271 (let ((end (point))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
272 (empty-hbdata-file "[ \t\n]*\\'"))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
273 (forward-line -1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
274 (if (= (following-char) ?\")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
275 ;; Last button entry for filename, so del filename.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
276 (progn (forward-line -1) (delete-region (point) end)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
277 (save-excursion
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
278 (goto-char (point-min))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
279 (if (looking-at empty-hbdata-file)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
280 (setq kill t)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
281 (if kill
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
282 (let ((fname buffer-file-name))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
283 (erase-buffer) (save-buffer) (kill-buffer nil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
284 (hbmap:dir-remove (file-name-directory fname))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
285 (call-process "rm" nil 0 nil "-f" fname)))))))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
286 lbl-key key-src directory))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
287
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
288 (defun hbdata:delete-entry-at-point ()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
289 (delete-region (point) (progn (forward-line 1) (point))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
290
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
291 (defun hbdata:to-entry (but-key key-src &optional directory instance)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
292 "Returns button data entry indexed by BUT-KEY, KEY-SRC, optional DIRECTORY.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
293 Returns nil if entry is not found. Leaves point at start of entry when
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
294 successful or where entry should be inserted if unsuccessful.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
295 A button entry is a list. Use methods from class 'hbdata' to operate on the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
296 entry. Optional INSTANCE non-nil means search for any button instance matching
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
297 but-key."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
298 (let ((pos-entry-cons
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
299 (hbdata:apply-entry
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
300 (function
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
301 (lambda ()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
302 (beginning-of-line)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
303 (cons (point) (read (current-buffer)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
304 but-key key-src directory 'create instance)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
305 (hbdata:to-entry-buf key-src directory)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
306 (forward-line 1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
307 (if pos-entry-cons
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
308 (progn
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
309 (goto-char (car pos-entry-cons))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
310 (cdr pos-entry-cons)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
311
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
312 ;;; ************************************************************************
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
313 ;;; Private functions
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
314 ;;; ************************************************************************
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
315
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
316 (defun hbdata:apply-entry (function lbl-key key-src &optional directory
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
317 create instance)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
318 "Invokes FUNCTION with point at hbdata entry given by LBL-KEY, KEY-SRC, optional DIRECTORY.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
319 With optional CREATE, if no such line exists, inserts a new file entry at the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
320 beginning of the hbdata file (which is created if necessary).
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
321 INSTANCE non-nil means search for any button instance matching LBL-KEY and
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
322 call FUNCTION with point right after any 'ebut:instance-sep' in match.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
323 Returns value of evaluation when a matching entry is found or nil."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
324 (let ((found)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
325 (rtn)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
326 (opoint)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
327 (end-func))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
328 (save-excursion
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
329 (unwind-protect
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
330 (progn
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
331 (if (not (bufferp key-src))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
332 nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
333 (set-buffer key-src)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
334 (cond ((hmail:editor-p)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
335 (setq end-func (function (lambda ()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
336 (hmail:msg-narrow)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
337 ((and (hmail:lister-p)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
338 (progn (rmail:summ-msg-to) (rmail:to)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
339 (setq opoint (point)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
340 key-src (current-buffer)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
341 end-func (function (lambda ()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
342 (hmail:msg-narrow)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
343 (goto-char opoint)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
344 (lmail:to)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
345 ((and (hnews:lister-p)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
346 (progn (rnews:summ-msg-to) (rnews:to)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
347 (setq opoint (point)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
348 key-src (current-buffer)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
349 end-func (function (lambda ()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
350 (hmail:msg-narrow)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
351 (goto-char opoint)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
352 (lnews:to)))))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
353 (setq found (hbdata:to-entry-buf key-src directory create)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
354 (if found
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
355 (let ((case-fold-search t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
356 (qkey (regexp-quote lbl-key))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
357 (end (save-excursion (if (search-forward "\n\^L" nil t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
358 (point) (point-max)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
359 (if (if instance
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
360 (re-search-forward
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
361 (concat "\n(\"" qkey "["
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
362 ebut:instance-sep "\"]") end t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
363 (search-forward (concat "\n(\"" lbl-key "\"") end t))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
364 (progn
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
365 (or instance (beginning-of-line))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
366 (let (buffer-read-only)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
367 (setq rtn (funcall function)))))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
368 (if end-func (funcall end-func))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
369 rtn))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
370
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
371 (defun hbdata:to-hbdata-buffer (dir &optional create)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
372 "Reads in the file containing DIR's button data, if any, and returns buffer.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
373 If it does not exist and optional CREATE is non-nil, creates a new
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
374 one and returns buffer, otherwise returns nil."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
375 (let* ((file (expand-file-name hattr:filename (or dir default-directory)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
376 (existing-file (or (file-exists-p file) (get-file-buffer file)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
377 (buf (or (get-file-buffer file)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
378 (and (or create existing-file)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
379 (find-file-noselect file)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
380 (if buf
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
381 (progn (set-buffer buf)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
382 (or (verify-visited-file-modtime (get-file-buffer file))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
383 (cond ((yes-or-no-p
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
384 "Hyperbole button data file has changed, read new contents? ")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
385 (revert-buffer t t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
386 )))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
387 (or (= (point-max) 1) (eq (char-after 1) ?\^L)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
388 (error "File %s is not a valid Hyperbole button data table." file))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
389 (or (equal (buffer-name) file) (rename-buffer file))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
390 (setq buffer-read-only nil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
391 (or existing-file (hbmap:dir-add (file-name-directory file)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
392 buf))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
393
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
394
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
395 (defun hbdata:to-entry-buf (key-src &optional directory create)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
396 "Moves point to end of line in but data buffer matching KEY-SRC.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
397 Uses hbdata file in KEY-SRC's directory, or optional DIRECTORY or if nil, uses
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
398 default-directory.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
399 With optional CREATE, if no such line exists, inserts a new file entry at the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
400 beginning of the hbdata file (which is created if necessary).
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
401 Returns non-nil if KEY-SRC is found or created, else nil."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
402 (let ((rtn) (ln-dir))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
403 (if (bufferp key-src)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
404 ;; Button buffer has no file attached
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
405 (progn (setq rtn (set-buffer key-src)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
406 buffer-read-only nil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
407 (if (not (hmail:hbdata-to-p))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
408 (insert "\n" hmail:hbdata-sep "\n"))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
409 (backward-char 1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
410 )
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
411 (setq directory (or (file-name-directory key-src) directory))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
412 (let ((ln-file) (link-p key-src))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
413 (while (setq link-p (file-symlink-p link-p))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
414 (setq ln-file link-p))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
415 (if ln-file
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
416 (setq ln-dir (file-name-directory ln-file)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
417 key-src (file-name-nondirectory ln-file))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
418 (setq key-src (file-name-nondirectory key-src))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
419 (if (or (hbdata:to-hbdata-buffer directory create)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
420 (and ln-dir (hbdata:to-hbdata-buffer ln-dir nil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
421 (setq create nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
422 directory ln-dir)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
423 (progn
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
424 (goto-char 1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
425 (cond ((search-forward (concat "\^L\n\"" key-src "\"")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
426 nil t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
427 (setq rtn t))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
428 (create
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
429 (setq rtn t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
430 (insert "\^L\n\"" key-src "\"\n")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
431 (backward-char 1))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
432 ))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
433 rtn
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
434 ))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
435
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
436 (defun hbdata:write (&optional orig-lbl-key but-sym)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
437 "Tries to write Hyperbole button data from optional ORIG-LBL-KEY and BUT-SYM.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
438 ORIG-LBL-KEY nil means create a new entry, otherwise modify existing one.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
439 BUT-SYM nil means use 'hbut:current'. If successful, returns
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
440 a button instance string to append to button label or t when first instance.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
441 On failure, returns nil."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
442 (let ((cns (hbdata:build orig-lbl-key but-sym))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
443 entry lbl-instance)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
444 (if (or (and buffer-file-name
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
445 (not (file-writable-p buffer-file-name)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
446 (null cns))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
447 nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
448 (setq entry (car cns) lbl-instance (cdr cns))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
449 (prin1 entry (current-buffer))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
450 (terpri (current-buffer))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
451 (or lbl-instance t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
452 )))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
453
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
454
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
455 ;;; ************************************************************************
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
456 ;;; Private variables
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
457 ;;; ************************************************************************
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
458
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
459 (provide 'hbdata)