annotate lisp/gtk-file-dialog.el @ 5750:66d2f63df75f

Correct some spelling and formatting in behavior.el. Mentioned in tracker issue 826, the third thing mentioned there (the file name at the bottom of the file) had already been fixed. lisp/ChangeLog addition: 2013-08-05 Aidan Kehoe <kehoea@parhasard.net> * behavior.el: (override-behavior): Correct some spelling and formatting here, thank you Steven Mitchell in tracker issue 826.
author Aidan Kehoe <kehoea@parhasard.net>
date Mon, 05 Aug 2013 10:05:32 +0100
parents 308d34e9f07d
children bbe4146603db
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))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
106 (components (reverse
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
107 (delete ""
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
108 (split-string dir
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
109 (concat "[" (char-to-string directory-sep-char) "]")))))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
110 (entries nil))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
111
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
112 (while components
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
113 (push (concat "/" (mapconcat 'identity (reverse components)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
114 (char-to-string directory-sep-char)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
115 entries)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
116 (pop components))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
117 (push (expand-file-name "." "~/") entries)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
118 (gtk-combo-set-popdown-strings combo-box (nreverse entries))))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
119
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
120 (defun gtk-file-dialog-select-directory (dialog dir)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
121 (gtk-file-dialog-fill-directory-list dialog dir)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
122 (gtk-file-dialog-fill-file-list dialog dir)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
123 (gtk-file-dialog-update-dropdown dialog dir))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
124
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
125 (defun gtk-file-dialog-new (&rest keywords)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
126 "Create a XEmacs file selection dialog.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
127 Optional keyword arguments allowed:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
128
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
129 :title The title of the dialog
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
130 :initial-directory Initial directory to show
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
131 :filter-list List of filter descriptions and filters
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
132 :file-must-exist Whether the file must exist or not
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
133 :directory Look for a directory instead
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
134 :callback Function to call with one arg, the selection
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
135 "
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
136 (let* ((dialog (gtk-dialog-new))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
137 (vbox (gtk-dialog-vbox dialog))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
138 (dir (plist-get keywords :initial-directory default-directory))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
139 (button-area (gtk-dialog-action-area dialog))
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
140 ;(initializing-gtk-file-dialog t)
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
141 (select-box nil)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
142 button hbox)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
143
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
144 (put dialog 'type 'dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
145
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
146 (gtk-window-set-title dialog (plist-get keywords :title "Select a file..."))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
147
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
148 (setq button (gtk-button-new-with-label "OK"))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
149 (gtk-container-add button-area button)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
150 (gtk-signal-connect button 'clicked
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
151 (lambda (button dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
152 (funcall
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
153 (get dialog 'x-file-dialog-callback 'ignore)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
154 (gtk-entry-get-text
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
155 (get dialog 'x-file-dialog-entry nil)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
156 (gtk-widget-destroy dialog))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
157 dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
158 (put dialog 'x-file-dialog-ok-button button)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
159
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
160 (setq button (gtk-button-new-with-label "Cancel"))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
161 (gtk-container-add button-area button)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
162 (gtk-signal-connect button 'clicked
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
163 (lambda (button dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
164 (gtk-widget-destroy dialog)) dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
165
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
166 (put dialog 'x-file-dialog-cancel-button button)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
167 (put dialog 'x-file-dialog-callback (plist-get keywords :callback 'ignore))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
168 (put dialog 'x-file-dialog-construct-args keywords)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
169 (put dialog 'x-file-dialog-current-dir dir)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
170
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
171 ;; Dropdown list of directories...
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
172 (setq select-box (gtk-combo-new))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
173 (gtk-combo-disable-activate select-box)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
174 (gtk-box-pack-start vbox select-box nil nil 5)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
175 (put dialog 'x-file-dialog-select-list select-box)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
176
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
177 ;; Hitting return in the entry will change dirs...
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
178 (gtk-signal-connect (gtk-combo-entry select-box) 'activate
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
179 (lambda (entry dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
180 (gtk-file-dialog-select-directory dialog
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
181 (gtk-entry-get-text entry)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
182 dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
183
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
184 ;; Start laying out horizontally...
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
185 (setq hbox (gtk-hbox-new nil 0))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
186 (gtk-box-pack-start vbox hbox t t 5)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
187
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
188 ;; Directory listing
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
189 (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
190 (scrolled (gtk-scrolled-window-new nil nil)))
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
191 (gtk-container-add scrolled directories)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
192 (gtk-widget-set-usize scrolled 200 300)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
193 (gtk-box-pack-start hbox scrolled t t 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
194 (put dialog 'x-file-dialog-directory-list directories)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
195 (put dialog 'x-file-dialog-directory-scrolled scrolled)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
196
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
197 (gtk-signal-connect directories 'select-row
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
198 (lambda (list row column event dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
199 (let ((dir (expand-file-name
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
200 (gtk-clist-get-text
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
201 (get dialog 'x-file-dialog-directory-list)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
202 row column)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
203 (get dialog 'x-file-dialog-current-dir))))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
204 (if (and (misc-user-event-p event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
205 (event-function event))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
206 (gtk-file-dialog-select-directory dialog dir)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
207 (gtk-entry-set-text
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
208 (get dialog 'x-file-dialog-entry)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
209 dir))))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
210 dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
211 )
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
212
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
213 (if (plist-get keywords :directory nil)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
214 ;; Directory listings only do not need the file or filters buttons.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
215 nil
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
216 ;; File listing
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
217 (let ((list (gtk-clist-new-with-titles 1 '("Files")))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
218 (scrolled (gtk-scrolled-window-new nil nil)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
219 (gtk-container-add scrolled list)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
220 (gtk-widget-set-usize scrolled 200 300)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
221 (gtk-box-pack-start hbox scrolled t t 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
222
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
223 (gtk-signal-connect list 'select-row
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
224 (lambda (list row column event dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
225 (gtk-entry-set-text
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
226 (get dialog 'x-file-dialog-entry nil)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
227 (expand-file-name
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
228 (gtk-clist-get-text list row column)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
229 (get dialog 'x-file-dialog-current-dir nil)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
230 (if (and (misc-user-event-p event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
231 (event-function event))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
232 ;; Got a double or triple click event...
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
233 (gtk-button-clicked
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
234 (get dialog 'x-file-dialog-ok-button nil))))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
235 dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
236
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
237 (put dialog 'x-file-dialog-files-list list))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
238
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
239 ;; Filters
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
240 (if (not (plist-get keywords :filter-list nil))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
241 ;; Don't need to bother packing this
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
242 nil
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
243 (setq hbox (gtk-hbox-new nil 0))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
244 (gtk-box-pack-start vbox hbox nil nil 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
245
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
246 (let ((label nil)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
247 (options (plist-get keywords :filter-list nil))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
248 (omenu nil)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
249 (menu nil)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
250 (item nil))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
251 (setq omenu (gtk-option-menu-new)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
252 menu (gtk-menu-new)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
253 label (gtk-label-new "Filter: "))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
254
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
255 (put dialog 'x-file-dialog-active-filter (cdr (car options)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
256 (mapc (lambda (o)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
257 (setq item (gtk-menu-item-new-with-label (car o)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
258 (gtk-signal-connect item 'activate
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
259 (lambda (obj data)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
260 (put (car data) 'x-file-dialog-active-filter (cdr data))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
261 (gtk-file-dialog-fill-file-list (car data) nil))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
262 (cons dialog (cdr o)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
263 (gtk-menu-append menu item)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
264 (gtk-widget-show item)) options)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
265 (gtk-option-menu-set-menu omenu menu)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
266 (gtk-box-pack-end hbox omenu nil nil 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
267 (gtk-box-pack-end hbox label nil nil 0))))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
268
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
269 ;; Entry
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
270 (let ((entry (gtk-entry-new)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
271 (if (plist-get keywords :directory nil)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
272 nil
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
273 (gtk-box-pack-start vbox entry nil nil 0))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
274 (if (plist-get keywords :file-must-exist nil)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
275 (progn
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
276 (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
277 (gtk-signal-connect entry 'changed
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
278 (lambda (entry dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
279 (gtk-widget-set-sensitive
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
280 (get dialog 'x-file-dialog-ok-button)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
281 (file-exists-p (gtk-entry-get-text entry))))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
282 dialog)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
283 (put dialog 'x-file-dialog-entry entry))
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 (gtk-widget-realize dialog)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
286
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
287
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
288 ;; Populate the file list if necessary
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
289 (gtk-file-dialog-select-directory dialog dir)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
290 dialog))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
291
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
292 (provide 'gtk-file-dialog)