annotate lisp/gtk-file-dialog.el @ 5619:75ad4969a16d

Replace the 'flush face property with the opposite 'shrink one. lisp/ChangeLog addition: 2011-12-26 Didier Verna <didier@xemacs.org> * cl-macs.el (face-flush-p): Removed. * cl-macs.el (face-shrink-p): New. * faces.el (face-flush-p): Removed. * faces.el (face-shrink-p): New. * faces.el (set-face-flush-p): Removed. * faces.el (set-face-shrink-p): New. * cus-face.el (custom-face-attributes): * faces.el (set-face-property): * faces.el (face-equal): * x-faces.el (x-init-face-from-resources): * x-faces.el (make-face-x-resource-internal): Replace the 'flush property with the opposite 'shrink one. src/ChangeLog addition: 2011-12-26 Didier Verna <didier@xemacs.org> * lisp.h: * faces.c (mark_face): * faces.c (face_equal): * faces.c (face_getprop): * faces.c (face_putprop): * faces.c (face_remprop): * faces.c (face_plist): * faces.c (reset_face): * faces.c (update_face_inheritance_mapper): * faces.c (Fmake_face): * faces.c (update_face_cachel_data): * faces.c (merge_face_cachel_data): * faces.c (Fcopy_face): * faces.c (syms_of_faces): * faces.c (vars_of_faces): * faces.c (complex_vars_of_faces): * faces.h (struct Lisp_Face): * faces.h (struct face_cachel): * faces.h (WINDOW_FACE_CACHEL_SHRINK_P): * faces.h (FACE_SHRINK_P): * fontcolor.c (face_boolean_validate): Replace the 'flush property with the opposite 'shrink one. * redisplay.c (create_text_block): * redisplay.c (create_string_text_block): Ditto. Invert the logic for storing a new clear_findex in the display lines.
author Didier Verna <didier@xemacs.org>
date Mon, 26 Dec 2011 15:04:25 +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)