diff lisp/w3/w3-prefs.el @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children ac2d302a0011
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/w3/w3-prefs.el	Mon Aug 13 08:45:50 2007 +0200
@@ -0,0 +1,528 @@
+;;; w3-prefs.el,v --- Preferences panels for Emacs-W3
+;; Author: wmperry
+;; Created: 1996/06/06 14:14:34
+;; Version: 1.10
+;; Keywords: hypermedia, preferences
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1996 by William M. Perry (wmperry@spry.com)
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to
+;;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Preferences panels for Emacs-W3
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(require 'widget)
+(require 'widget-edit)
+(require 'w3-vars)
+(require 'w3-keyword)
+(require 'w3-widget)
+
+(defvar w3-preferences-glyph nil)
+(defvar w3-preferences-map nil)
+(defvar w3-preferences-panel-begin-marker nil)
+(defvar w3-preferences-panel-end-marker nil)
+(defvar w3-preferences-panels '(
+				(appearance    . "Appearance")
+				(images        . "Images")
+				(cookies       . "HTTP Cookies")
+				(hooks         . "Various Hooks")
+				(compatibility . "Compatibility")
+				(proxy         . "Proxy")))
+
+(defun w3-preferences-setup-glyph-map ()
+  (let* ((x 0)
+	 (height (and w3-preferences-glyph
+		      (glyph-height w3-preferences-glyph)))
+	 (width (and height (/ (glyph-width w3-preferences-glyph)
+			       (length w3-preferences-panels)))))
+    (mapcar
+     (function
+      (lambda (region)
+	(vector "rect" (list (vector (if width (* x width) 0) 0)
+			     (vector (if width (* (setq x (1+ x)) width) 0)
+				     (or height 0)))
+		(car region) (cdr region))))
+     w3-preferences-panels)))     
+
+(defun w3-preferences-generic-variable-callback (widget &rest ignore)
+  (condition-case ()
+      (set (widget-get widget 'variable) (widget-value widget))
+    (error (message "Invalid or incomplete data..."))))
+
+(defun w3-preferences-restore-variables (vars)
+  (let ((temp nil))
+    (while vars
+      (setq temp (intern (format "w3-preferences-temp-%s" (car vars))))
+      (set (car vars) (symbol-value temp))
+      (setq vars (cdr vars)))))
+					 
+(defun w3-preferences-create-temp-variables (vars)
+  (let ((temp nil))
+    (while vars
+      (setq temp (intern (format "w3-preferences-temp-%s" (car vars))))
+      (set (make-local-variable temp) (symbol-value (car vars)))
+      (setq vars (cdr vars)))))
+  
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Appearance of the frame / pages
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun w3-preferences-init-appearance-panel ()
+  (let ((vars '(w3-toolbar-orientation
+		w3-use-menus
+		w3-honor-stylesheets
+		w3-default-stylesheet
+		w3-default-homepage
+		w3-toolbar-type))
+	(temp nil))
+    (set (make-local-variable 'w3-preferences-temp-use-home-page)
+	 (and w3-default-homepage t))
+    (w3-preferences-create-temp-variables vars)))
+
+(defun w3-preferences-create-appearance-panel ()
+  ;; First the toolbars
+  (widget-insert "\nToolbars\n--------\n")
+  (widget-insert "\tShow Toolbars as:\t")
+  (widget-put
+   (widget-create 'radio
+		  :value (symbol-value 'w3-preferences-temp-w3-toolbar-type)
+		  :notify 'w3-preferences-generic-variable-callback
+		  (list 'item :format "%t\t" :tag "Pictures" :value 'pictures)
+		  (list 'item :format "%t\t" :tag "Text"     :value 'text)
+		  (list 'item :format "%t" :tag "Both" :value 'both))
+   'variable 'w3-preferences-temp-w3-toolbar-type)
+  (widget-insert "\n\tToolbars appear on ")
+  (widget-put
+   (widget-create 'choice
+		  :value (symbol-value 'w3-preferences-temp-w3-toolbar-orientation)
+		  :notify 'w3-preferences-generic-variable-callback
+		  :format "%v"
+		  :tag "Toolbar Position"
+		  (list 'choice-item :format "%[%t%]" :tag "XEmacs Default" :value 'default)
+		  (list 'choice-item :format "%[%t%]" :tag "Top" :value 'top)
+		  (list 'choice-item :format "%[%t%]" :tag "Bottom" :value 'bottom)
+		  (list 'choice-item :format "%[%t%]" :tag "Right" :value 'right)
+		  (list 'choice-item :format "%[%t%]" :tag "Left" :value 'left)
+		  (list 'choice-item :format "%[%t%]" :tag "No Toolbar" :value 'none))
+   'variable 'w3-preferences-temp-w3-toolbar-orientation)
+  (widget-insert " side of window.\n")
+
+  ;; Home page
+  (widget-insert "\nStartup\n--------\n\tBrowser starts with:\t")
+  (widget-put
+   (widget-create
+    'radio
+    :value (symbol-value 'w3-preferences-temp-use-home-page)
+    :notify 'w3-preferences-generic-variable-callback
+    (list 'item :format "%t\t" :tag "Blank Page" :value nil)
+    (list 'item :format "%t" :tag "Home Page Location" :value t))
+   'variable 'w3-preferences-temp-use-home-page)
+  (widget-insert "\n\t\tURL: ")
+  (widget-put
+   (widget-create
+    'field
+    :value (or (symbol-value 'w3-preferences-temp-w3-default-homepage) "None")
+    :notify 'w3-preferences-generic-variable-callback)
+   'variable 'w3-preferences-temp-w3-default-homepage)
+
+  ;; Stylesheet
+  (widget-insert "\nStyle\n--------\n\tDefault stylesheet:\t")
+  (widget-put
+   (widget-create
+    'file
+    :value (or (symbol-value 'w3-preferences-temp-w3-default-stylesheet) "")
+    :must-match t
+    :notify 'w3-preferences-generic-variable-callback)
+   'variable 'w3-preferences-temp-w3-default-stylesheet)
+  (widget-setup)
+  )
+
+(defun w3-preferences-save-appearance-panel ()
+  (let ((vars '(w3-toolbar-orientation
+		w3-use-menus
+		w3-honor-stylesheets
+		w3-default-stylesheet
+		w3-toolbar-type))
+	(temp nil))
+  (if (symbol-value 'w3-preferences-temp-use-home-page)
+      (setq vars (cons 'w3-default-homepage vars))
+    (setq w3-default-homepage nil))
+  (w3-preferences-restore-variables vars)
+  (w3-toolbar-make-buttons)))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; The images panel
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun w3-preferences-init-images-panel ()
+  (let ((vars '(w3-delay-image-loads
+		w3-image-mappings)))
+    (w3-preferences-create-temp-variables vars)))
+
+(defun w3-preferences-create-images-panel ()
+  (widget-insert "\n")
+  (widget-put
+   (widget-create
+    'checkbox
+    :notify 'w3-preferences-generic-variable-callback
+    :value (symbol-value 'w3-preferences-temp-w3-delay-image-loads))
+   'variable 'w3-preferences-temp-w3-delay-image-loads)
+  (widget-insert " Delay Image Loads\n"
+;;;		 "\nAllowed Image Types\n"
+;;;		 "-------------------\n")
+;;;  (set
+;;;   (make-local-variable 'w3-preferences-image-type-widget)
+;;;   (widget-create
+;;;    'repeat
+;;;    :entry-format "%i %d %v"
+;;;    :value (mapcar
+;;;	    (function
+;;;	     (lambda (x)
+;;;	       (list 'item :format "%t" :tag (car x) :value (cdr x))))
+;;;	    w3-image-mappings)
+;;;    '(item :tag "*/*" :value 'unknown)))
+  ))
+
+(defun w3-preferences-save-images-panel ()
+  (let ((vars '(w3-delay-image-loads
+		w3-image-mappings)))
+    (w3-preferences-restore-variables vars)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; The cookies panel
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun w3-preferences-init-cookies-panel ()
+  (let ((cookies url-cookie-storage)
+	(secure-cookies url-cookie-secure-storage))
+    )
+  )
+
+(defun w3-preferences-create-cookies-panel ()
+  (widget-insert "\n\t\tSorry, not yet implemented.\n\n"))
+
+(defun w3-preferences-save-cookies-panel ()
+  )
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; The hooks panel
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar w3-preferences-hooks-variables
+  '(w3-file-done-hook
+    w3-file-prepare-hook
+    w3-load-hook
+    w3-mode-hook
+    w3-preferences-cancel-hook
+    w3-preferences-default-hook
+    w3-preferences-ok-hook
+    w3-preferences-setup-hook
+    w3-source-file-hook))
+		
+(defun w3-preferences-init-hooks-panel ()
+  (w3-preferences-create-temp-variables w3-preferences-hooks-variables))
+
+(defun w3-preferences-create-hooks-panel ()
+  (let ((todo w3-preferences-hooks-variables)
+	(cur nil)
+	(pt nil)
+	(doc nil))
+    (widget-insert "\n")
+    (while todo
+      (setq cur (car todo)
+	    todo (cdr todo)
+	    doc (get cur 'variable-documentation))
+      (if (string-match "^\\*" doc)
+	  (setq doc (substring doc 1 nil)))
+      (setq pt (point))
+      (widget-insert "\n" (symbol-name cur) " - " doc)
+      (fill-region-as-paragraph pt (point))
+      (setq cur (intern (format "w3-preferences-temp-%s" cur)))
+      (widget-put
+       (widget-create
+	'sexp
+	:notify 'w3-preferences-generic-variable-callback
+	:value (or (symbol-value cur) "nil"))
+       'variable cur))
+    (widget-setup)))
+
+(defun w3-preferences-save-hooks-panel ()
+  (w3-preferences-restore-variables w3-preferences-hooks-variables))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; The compatibility panel
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar w3-preferences-compatibility-variables
+  '(
+    (w3-style-ie-compatibility
+     . "Internet Explorer (tm) 3.0 compatible stylesheet parsing")
+    (w3-netscape-compatible-comments
+     . "Allow Netscape compatible comments")
+    (w3-user-colors-take-precedence
+     . "Ignore netscape document color control")
+    (url-honor-refresh-requests
+     . "Allow Netscape `Client Pull'"))
+  "A list of variables that the preferences compability pane knows about.")
+
+(defun w3-preferences-init-compatibility-panel ()
+  (let ((compat w3-preferences-compatibility-variables)
+	(cur nil)
+	(var nil))
+    (w3-preferences-create-temp-variables
+     (mapcar 'car w3-preferences-compatibility-variables))))
+
+(defun w3-preferences-create-compatibility-panel ()
+  (let ((compat w3-preferences-compatibility-variables)
+	(cur nil)
+	(var nil))
+    (widget-insert "\n")
+    (while compat
+      (setq cur (car compat)
+	    compat (cdr compat)
+	    var (intern (format "w3-preferences-temp-%s" (car cur))))
+      (widget-put
+       (widget-create 'checkbox
+		      :notify 'w3-preferences-generic-variable-callback
+		      :value (symbol-value var))
+       'variable var)
+      (widget-insert " " (cdr cur) "\n\n"))
+    (widget-setup)))
+
+(defun w3-preferences-save-compatibility-panel ()
+  (w3-preferences-restore-variables
+   (mapcar 'car w3-preferences-compatibility-variables)))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; The proxy configuration panel
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun w3-preferences-init-proxy-panel ()
+  (let ((proxies '("FTP" "Gopher" "HTTP" "Security" "WAIS" "SHTTP" "News"))
+	(proxy nil)
+	(host-var nil)
+	(port-var nil)
+	(urlobj nil))
+    (widget-insert "\n")
+    (while proxies
+      (setq proxy (car proxies)
+	    proxies (cdr proxies)
+	    host-var (intern (format "w3-%s-proxy-host" (downcase proxy)))
+	    port-var (intern (format "w3-%s-proxy-port" (downcase proxy)))
+	    urlobj (url-generic-parse-url
+		    (cdr-safe
+		     (assoc (downcase proxy) url-proxy-services))))
+      (set (make-local-variable host-var) (or (url-host urlobj) ""))
+      (set (make-local-variable port-var) (or (url-port urlobj) "")))))
+
+(defun w3-preferences-create-proxy-panel ()
+  (let ((proxies '("FTP" "Gopher" "HTTP" "Security" "WAIS" "SHTTP" "News"))
+	(proxy nil)
+	(host-var nil)
+	(port-var nil)
+	(urlobj nil))
+    (widget-insert "\n")
+    (while proxies
+      (setq proxy (car proxies)
+	    proxies (cdr proxies)
+	    host-var (intern (format "w3-%s-proxy-host" (downcase proxy)))
+	    port-var (intern (format "w3-%s-proxy-port" (downcase proxy))))
+      (widget-insert (format "%10s Proxy: " proxy))
+      (widget-put
+       (widget-create 'field
+		      :size 20
+		      :value-face 'underline
+		      :notify 'w3-preferences-generic-variable-callback
+		      :value (format "%-20s" (symbol-value host-var)))
+       'variable host-var)
+      (widget-insert "  Port: ")
+      (widget-put
+       (widget-create 'field
+		      :size 5
+		      :value-face 'underline
+		      :notify 'w3-preferences-generic-variable-callback
+		      :value (format "%5s" (symbol-value port-var)))
+       'variable port-var)
+      (widget-insert "\n\n"))
+    (widget-setup)))
+
+(defun w3-preferences-save-proxy-panel ()
+  (let ((proxies '("FTP" "Gopher" "HTTP" "Security" "WAIS" "SHTTP" "News"))
+	(proxy nil)
+	(host-var nil)
+	(port-var nil)
+	(urlobj nil)
+	(host nil)
+	(port nil)
+	(new-proxy-services nil))
+    (while proxies
+      (setq proxy (car proxies)
+	    proxies (cdr proxies)
+	    host-var (intern (format "w3-%s-proxy-host" (downcase proxy)))
+	    port-var (intern (format "w3-%s-proxy-port" (downcase proxy)))
+	    urlobj (url-generic-parse-url
+		    (cdr-safe
+		     (assoc (downcase proxy) url-proxy-services)))
+	    host (symbol-value host-var)
+	    port (symbol-value port-var))
+      (if (and host (/= 0 (length host)))
+	  (setq new-proxy-services (cons (cons (downcase proxy)
+					       (format "http://%s:%s/" host
+						       (or port "80")))
+					 new-proxy-services))))
+    (setq url-proxy-services new-proxy-services)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun w3-preferences-create-panel (panel)
+  (let ((func (intern (format "w3-preferences-create-%s-panel" panel)))
+	(inhibit-read-only t))
+    (goto-char w3-preferences-panel-begin-marker)
+    (delete-region w3-preferences-panel-begin-marker
+		   w3-preferences-panel-end-marker)
+    (set-marker-insertion-type w3-preferences-panel-end-marker t)
+    (if (fboundp func)
+	(funcall func)
+      (insert (format "You should be seeing %s right now.\n" panel))))
+  (set-marker-insertion-type w3-preferences-panel-end-marker nil)
+  (set-marker w3-preferences-panel-end-marker (point))
+  (goto-char w3-preferences-panel-begin-marker)
+  (condition-case ()
+      (widget-forward 1)
+    (error nil)))
+
+(defun w3-preferences-notify (widget widget-ignore &optional event)
+  (let* ((glyph (and event w3-running-xemacs (event-glyph event)))
+	 (x     (and glyph (w3-glyphp glyph) (event-glyph-x-pixel event)))
+	 (y     (and glyph (w3-glyphp glyph) (event-glyph-y-pixel event)))
+	 (map   (widget-get widget 'usemap))
+	 (value (widget-value widget)))
+    (if (and map x y)
+	(setq value (w3-point-in-map (vector x y) map)))
+    (if value
+	(w3-preferences-create-panel value))))
+
+(defun w3-preferences-save-options ()
+  (w3-menu-save-options))
+
+(defun w3-preferences-ok-callback (widget &rest ignore)
+  (let ((panels w3-preferences-panels)
+	(buffer (current-buffer))
+	(func nil))
+    (run-hooks 'w3-preferences-ok-hook)
+    (while panels
+      (setq func (intern
+		  (format "w3-preferences-save-%s-panel" (caar panels)))
+	    panels (cdr panels))
+      (if (fboundp func)
+	  (funcall func)))
+    (w3-preferences-save-options)
+    (message "Options saved")
+    (sit-for 1)
+    (kill-buffer (current-buffer))))
+
+(defun w3-preferences-reset-all-panels ()
+  (let ((panels w3-preferences-panels)
+	(func nil))
+    (while panels
+      (setq func (intern (format "w3-preferences-init-%s-panel"
+				 (caar panels)))
+	    panels (cdr panels))
+      (if (and func (fboundp func))
+	  (funcall func)))))
+
+(defun w3-preferences-cancel-callback (widget &rest ignore)
+  (if (not (funcall url-confirmation-func "Cancel and lose all changes? "))
+      (error "Not cancelled!"))
+  (w3-preferences-reset-all-panels)
+  (kill-buffer (current-buffer))
+  (run-hooks 'w3-preferences-cancel-hook))
+
+(defun w3-preferences-reset-callback (widget &rest ignore)
+  (w3-preferences-reset-all-panels)
+  (run-hooks 'w3-preferences-default-hook)
+  (w3-preferences-create-panel (caar w3-preferences-panels)))
+
+(defvar w3-preferences-setup-hook nil
+  "*Hooks to be run before setting up the preferences buffer.")
+
+(defvar w3-preferences-cancel-hook nil
+  "*Hooks to be run when cancelling the preferences (Cancel was chosen).")
+
+(defvar w3-preferences-default-hook nil
+  "*Hooks to be run when resetting preference defaults (Defaults was chosen).")
+
+(defvar w3-preferences-ok-hook nil
+  "*Hooks to be run before saving the preferences (OK was chosen).")
+
+(defun w3-preferences-init-all-panels ()
+  (let ((todo w3-preferences-panels)
+	(func nil))
+    (while todo
+      (setq func (intern (format "w3-preferences-init-%s-panel" (caar todo)))
+	    todo (cdr todo))
+      (and (fboundp func) (funcall func)))))
+
+(defun w3-preferences-edit ()
+  (interactive)
+  (if (not w3-preferences-map)
+      (setq w3-preferences-map (w3-preferences-setup-glyph-map)))
+  (let* ((prefs-buffer (get-buffer-create "W3 Preferences"))
+	 (widget nil)
+	 (inhibit-read-only t)
+	 (window-conf (current-window-configuration)))
+    (delete-other-windows)
+    (set-buffer prefs-buffer)
+    (w3-preferences-init-all-panels)
+    (set-window-buffer (selected-window) prefs-buffer)
+    (make-local-variable 'widget-field-face)
+    (setq w3-preferences-panel-begin-marker (make-marker)
+	  w3-preferences-panel-end-marker (make-marker))
+    (set-marker-insertion-type w3-preferences-panel-begin-marker nil)
+    (set-marker-insertion-type w3-preferences-panel-end-marker t)
+    (use-local-map widget-keymap)
+    (erase-buffer)
+    (run-hooks 'w3-preferences-setup-hook)
+    (setq widget (widget-create 'image
+				:notify 'w3-preferences-notify
+				:value 'appearance
+				:tag "Panel"
+				'usemap w3-preferences-map))
+    (goto-char (point-max))
+    (insert "\n\n")
+    (set-marker w3-preferences-panel-begin-marker (point))
+    (set-marker w3-preferences-panel-end-marker (point))
+    (w3-preferences-create-panel (caar w3-preferences-panels))
+    (goto-char (point-max))
+    (widget-insert "\n\n")
+    (widget-create 'push
+		   :notify 'w3-preferences-ok-callback
+		   :value "Ok")
+    (widget-insert "  ")
+    (widget-create 'push
+		   :notify 'w3-preferences-cancel-callback
+		   :value "Cancel")
+    (widget-insert "  ")
+    (widget-create 'push
+		   :notify 'w3-preferences-reset-callback
+		   :value "Reset")
+    (center-region (point-min) w3-preferences-panel-begin-marker)
+    (center-region w3-preferences-panel-end-marker (point-max))))
+
+(provide 'w3-prefs)