annotate lisp/gtk-file-dialog.el @ 5889:bd644055ef44

Correct a bug in #'check-type, non-setf'able PLACEs lisp/ChangeLog addition: 2015-04-11 Aidan Kehoe <kehoea@parhasard.net> * cl-macs.el: * cl-macs.el (check-type): Correct the sense of the type test here when PLACE is not setf'able, something which gave confusing errors with literal fixnums or, e.g., (+ 30 40). tests/ChangeLog addition: 2015-04-11 Aidan Kehoe <kehoea@parhasard.net> * automated/lisp-tests.el: Check for a bug just fixed in cl-macs.el.
author Aidan Kehoe <kehoea@parhasard.net>
date Sat, 11 Apr 2015 18:06:17 +0100
parents bbe4146603db
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1 ;;; gtk-file-dialog.el --- A nicer file selection dialog for XEmacs w/GTK primitives
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
3 ;; Copyright (C) 2000 Free Software Foundation, Inc.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
4
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
5 ;; Maintainer: William M. Perry <wmperry@gnu.org>
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
6 ;; Keywords: extensions, internal
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
7
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
8 ;; This file is part of XEmacs.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
9
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 502
diff changeset
10 ;; XEmacs is free software: you can redistribute it and/or modify it
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 502
diff changeset
11 ;; under the terms of the GNU General Public License as published by the
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 502
diff changeset
12 ;; Free Software Foundation, either version 3 of the License, or (at your
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 502
diff changeset
13 ;; option) any later version.
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
14
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 502
diff changeset
15 ;; XEmacs is distributed in the hope that it will be useful, but WITHOUT
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 502
diff changeset
16 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 502
diff changeset
17 ;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 502
diff changeset
18 ;; for more details.
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
19
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
20 ;; You should have received a copy of the GNU General Public License
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 502
diff changeset
21 ;; along with XEmacs. If not, see <http://www.gnu.org/licenses/>.
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
22
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
23 ;;; Synched up with: Not in FSF.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
24
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
25 ;;; Commentary:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
26
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
27 ;; The default GTK file selection dialog is not sufficient for our
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
28 ;; needs. Limitations include:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
29 ;;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
30 ;; - not derived from GtkDialog
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
31 ;; - no support for filters based on file types
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
32 ;; - no support for setting an initial directory
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
33 ;; - no way to tell it 'file must exist'
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
34 ;; - no easy way to tell it to look at directories only
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
35 ;; - ugly as sin
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
36 ;;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
37 ;; This attempts to rectify the situation.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
38
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
39 (globally-declare-fboundp
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
40 '(gtk-clist-clear
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
41 gtk-clist-freeze gtk-clist-append
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
42 gtk-clist-thaw gtk-combo-set-popdown-strings gtk-dialog-new
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
43 gtk-dialog-vbox gtk-dialog-action-area gtk-window-set-title
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
44 gtk-button-new-with-label gtk-container-add gtk-signal-connect
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
45 gtk-entry-get-text gtk-widget-destroy gtk-combo-new
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
46 gtk-combo-disable-activate gtk-box-pack-start gtk-combo-entry
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
47 gtk-hbox-new gtk-clist-new-with-titles gtk-scrolled-window-new
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
48 gtk-widget-set-usize gtk-clist-get-text gtk-entry-set-text
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
49 gtk-button-clicked gtk-option-menu-new gtk-menu-new
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
50 gtk-label-new gtk-menu-item-new-with-label gtk-menu-append
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
51 gtk-widget-show gtk-option-menu-set-menu gtk-box-pack-end
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
52 gtk-entry-new gtk-widget-set-sensitive gtk-widget-realize))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
53
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
54 (defun gtk-file-dialog-fill-file-list (dialog dir)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
55 (if (not dir)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
56 (setq dir (get dialog 'x-file-dialog-current-dir nil)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
57
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
58 (put dialog 'x-file-dialog-current-dir dir)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
59
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
60 (let ((list (get dialog 'x-file-dialog-files-list nil))
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
61 ;(remotep (file-remote-p dir))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
62 )
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
63 (if (not list)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
64 nil
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
65 (gtk-clist-clear list)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
66 (gtk-clist-freeze list)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
67 ;; NOTE: Current versions of efs / ange-ftp do not honor the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
68 ;; files-only flag to directory-files, but actually DOING these
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
69 ;; checks is hideously expensive. Leave it turned off for now.
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
70 (mapc #'(lambda (f)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
71 (if (or t ; Lets just wait for EFS to
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
72 ;(not remotep) ; fix itself, shall we?
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
73 ;(not (file-directory-p (expand-file-name f dir)))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
74 )
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
75 (gtk-clist-append list (list f))))
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
76 (directory-files dir nil
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
77 (get dialog 'x-file-dialog-active-filter nil)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
78 nil t))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
79 (gtk-clist-thaw list))))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
80
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
81 (defun gtk-file-dialog-fill-directory-list (dialog dir)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
82 (let ((subdirs (directory-files dir nil nil nil 5))
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
83 ;(remotep (file-remote-p dir))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
84 ;(selected-dir (get dialog 'x-file-dialog-current-dir "/"))
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
85 (directory-list (get dialog 'x-file-dialog-directory-list)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
86
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
87 (gtk-clist-freeze directory-list)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
88 (gtk-clist-clear directory-list)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
89
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
90 (while subdirs
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
91 (if (equal "." (car subdirs))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
92 nil
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
93 ;; NOTE: Current versions of efs / ange-ftp do not honor the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
94 ;; files-only flag to directory-files, but actually DOING these
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
95 ;; checks is hideously expensive. Leave it turned off for now.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
96 (if (or t ; Lets just wait for EFS to
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
97 ;(not remotep) ; fix itself, shall we?
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
98 ;(file-directory-p (expand-file-name (car subdirs) dir))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
99 )
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
100 (gtk-clist-append directory-list (list (car subdirs)))))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
101 (pop subdirs))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
102 (gtk-clist-thaw directory-list)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
103
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
104 (defun gtk-file-dialog-update-dropdown (dialog dir)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
105 (let ((combo-box (get dialog 'x-file-dialog-select-list))
5882
bbe4146603db Reduce regexp usage, now CL-oriented non-regexp code available, core Lisp
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
106 (components (nreverse
bbe4146603db Reduce regexp usage, now CL-oriented non-regexp code available, core Lisp
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
107 (delete "" (split-string-by-char dir directory-sep-char))))
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
108 (entries nil))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
109 (while components
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
110 (push (concat "/" (mapconcat 'identity (reverse components)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
111 (char-to-string directory-sep-char)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
112 entries)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
113 (pop components))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
114 (push (expand-file-name "." "~/") entries)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
115 (gtk-combo-set-popdown-strings combo-box (nreverse entries))))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
116
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
117 (defun gtk-file-dialog-select-directory (dialog dir)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
118 (gtk-file-dialog-fill-directory-list dialog dir)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
119 (gtk-file-dialog-fill-file-list dialog dir)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
120 (gtk-file-dialog-update-dropdown dialog dir))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
121
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
122 (defun gtk-file-dialog-new (&rest keywords)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
123 "Create a XEmacs file selection dialog.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
124 Optional keyword arguments allowed:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
125
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
126 :title The title of the dialog
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
127 :initial-directory Initial directory to show
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
128 :filter-list List of filter descriptions and filters
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
129 :file-must-exist Whether the file must exist or not
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
130 :directory Look for a directory instead
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
131 :callback Function to call with one arg, the selection
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
132 "
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
133 (let* ((dialog (gtk-dialog-new))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
134 (vbox (gtk-dialog-vbox dialog))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
135 (dir (plist-get keywords :initial-directory default-directory))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
136 (button-area (gtk-dialog-action-area dialog))
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
137 ;(initializing-gtk-file-dialog t)
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
138 (select-box nil)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
139 button hbox)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
140
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
141 (put dialog 'type 'dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
142
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
143 (gtk-window-set-title dialog (plist-get keywords :title "Select a file..."))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
144
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
145 (setq button (gtk-button-new-with-label "OK"))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
146 (gtk-container-add button-area button)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
147 (gtk-signal-connect button 'clicked
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
148 (lambda (button dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
149 (funcall
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
150 (get dialog 'x-file-dialog-callback 'ignore)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
151 (gtk-entry-get-text
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
152 (get dialog 'x-file-dialog-entry nil)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
153 (gtk-widget-destroy dialog))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
154 dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
155 (put dialog 'x-file-dialog-ok-button button)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
156
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
157 (setq button (gtk-button-new-with-label "Cancel"))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
158 (gtk-container-add button-area button)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
159 (gtk-signal-connect button 'clicked
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
160 (lambda (button dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
161 (gtk-widget-destroy dialog)) dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
162
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
163 (put dialog 'x-file-dialog-cancel-button button)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
164 (put dialog 'x-file-dialog-callback (plist-get keywords :callback 'ignore))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
165 (put dialog 'x-file-dialog-construct-args keywords)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
166 (put dialog 'x-file-dialog-current-dir dir)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
167
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
168 ;; Dropdown list of directories...
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
169 (setq select-box (gtk-combo-new))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
170 (gtk-combo-disable-activate select-box)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
171 (gtk-box-pack-start vbox select-box nil nil 5)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
172 (put dialog 'x-file-dialog-select-list select-box)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
173
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
174 ;; Hitting return in the entry will change dirs...
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
175 (gtk-signal-connect (gtk-combo-entry select-box) 'activate
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
176 (lambda (entry dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
177 (gtk-file-dialog-select-directory dialog
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
178 (gtk-entry-get-text entry)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
179 dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
180
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
181 ;; Start laying out horizontally...
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
182 (setq hbox (gtk-hbox-new nil 0))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
183 (gtk-box-pack-start vbox hbox t t 5)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
184
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
185 ;; Directory listing
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
186 (let ((directories (gtk-clist-new-with-titles 1 '("Directories")))
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
187 (scrolled (gtk-scrolled-window-new nil nil)))
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
188 (gtk-container-add scrolled directories)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
189 (gtk-widget-set-usize scrolled 200 300)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
190 (gtk-box-pack-start hbox scrolled t t 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
191 (put dialog 'x-file-dialog-directory-list directories)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
192 (put dialog 'x-file-dialog-directory-scrolled scrolled)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
193
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
194 (gtk-signal-connect directories 'select-row
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
195 (lambda (list row column event dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
196 (let ((dir (expand-file-name
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
197 (gtk-clist-get-text
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
198 (get dialog 'x-file-dialog-directory-list)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
199 row column)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
200 (get dialog 'x-file-dialog-current-dir))))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
201 (if (and (misc-user-event-p event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
202 (event-function event))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
203 (gtk-file-dialog-select-directory dialog dir)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
204 (gtk-entry-set-text
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
205 (get dialog 'x-file-dialog-entry)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
206 dir))))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
207 dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
208 )
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
209
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
210 (if (plist-get keywords :directory nil)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
211 ;; Directory listings only do not need the file or filters buttons.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
212 nil
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
213 ;; File listing
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
214 (let ((list (gtk-clist-new-with-titles 1 '("Files")))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
215 (scrolled (gtk-scrolled-window-new nil nil)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
216 (gtk-container-add scrolled list)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
217 (gtk-widget-set-usize scrolled 200 300)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
218 (gtk-box-pack-start hbox scrolled t t 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
219
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
220 (gtk-signal-connect list 'select-row
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
221 (lambda (list row column event dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
222 (gtk-entry-set-text
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
223 (get dialog 'x-file-dialog-entry nil)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
224 (expand-file-name
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
225 (gtk-clist-get-text list row column)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
226 (get dialog 'x-file-dialog-current-dir nil)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
227 (if (and (misc-user-event-p event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
228 (event-function event))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
229 ;; Got a double or triple click event...
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
230 (gtk-button-clicked
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
231 (get dialog 'x-file-dialog-ok-button nil))))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
232 dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
233
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
234 (put dialog 'x-file-dialog-files-list list))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
235
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
236 ;; Filters
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
237 (if (not (plist-get keywords :filter-list nil))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
238 ;; Don't need to bother packing this
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
239 nil
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
240 (setq hbox (gtk-hbox-new nil 0))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
241 (gtk-box-pack-start vbox hbox nil nil 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
242
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
243 (let ((label nil)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
244 (options (plist-get keywords :filter-list nil))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
245 (omenu nil)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
246 (menu nil)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
247 (item nil))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
248 (setq omenu (gtk-option-menu-new)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
249 menu (gtk-menu-new)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
250 label (gtk-label-new "Filter: "))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
251
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
252 (put dialog 'x-file-dialog-active-filter (cdr (car options)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
253 (mapc (lambda (o)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
254 (setq item (gtk-menu-item-new-with-label (car o)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
255 (gtk-signal-connect item 'activate
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
256 (lambda (obj data)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
257 (put (car data) 'x-file-dialog-active-filter (cdr data))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
258 (gtk-file-dialog-fill-file-list (car data) nil))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
259 (cons dialog (cdr o)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
260 (gtk-menu-append menu item)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
261 (gtk-widget-show item)) options)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
262 (gtk-option-menu-set-menu omenu menu)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
263 (gtk-box-pack-end hbox omenu nil nil 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
264 (gtk-box-pack-end hbox label nil nil 0))))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
265
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
266 ;; Entry
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
267 (let ((entry (gtk-entry-new)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
268 (if (plist-get keywords :directory nil)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
269 nil
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
270 (gtk-box-pack-start vbox entry nil nil 0))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
271 (if (plist-get keywords :file-must-exist nil)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
272 (progn
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
273 (gtk-widget-set-sensitive (get dialog 'x-file-dialog-ok-button nil) nil)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
274 (gtk-signal-connect entry 'changed
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
275 (lambda (entry dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
276 (gtk-widget-set-sensitive
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
277 (get dialog 'x-file-dialog-ok-button)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
278 (file-exists-p (gtk-entry-get-text entry))))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
279 dialog)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
280 (put dialog 'x-file-dialog-entry entry))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
281
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
282 (gtk-widget-realize dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
283
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
284
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
285 ;; Populate the file list if necessary
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
286 (gtk-file-dialog-select-directory dialog dir)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
287 dialog))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
288
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
289 (provide 'gtk-file-dialog)