changeset 48952:ac7ebc63415a

New file.
author Richard M. Stallman <rms@gnu.org>
date Mon, 23 Dec 2002 18:41:50 +0000
parents d77bc55dd27b
children b6cceff9402d
files lisp/cus-theme.el
diffstat 1 files changed, 156 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/cus-theme.el	Mon Dec 23 18:41:50 2002 +0000
@@ -0,0 +1,156 @@
+;;; cus-theme.el -- custom theme creation user interface
+;;
+;; Copyright (C) 2001 Free Software Foundation, Inc.
+;;
+;; Author: Alex Schroeder <alex@gnu.org>
+;; Maintainer: FSF
+;; Keywords: help, faces
+
+;; This file is part of GNU Emacs.
+
+;; 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, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Code:
+
+(require 'widget)
+(require 'cus-edit)
+
+(eval-when-compile
+  (require 'wid-edit))
+
+(defun custom-theme-create ()
+  "Create a custom theme."
+  (interactive)
+  (if (get-buffer "*New Custom Theme*")
+      (kill-buffer "*New Custom Theme*"))
+  (switch-to-buffer "*New Custom Theme*")
+  (kill-all-local-variables)
+  (make-local-variable 'custom-theme-name)
+  (make-local-variable 'custom-theme-variables)
+  (make-local-variable 'custom-theme-faces)
+  (make-local-variable 'custom-theme-description)
+  (let ((inhibit-read-only t))
+    (erase-buffer))
+  (widget-insert "This buffer helps you write a custom theme elisp file.
+This will help you share your customizations with other people.\n\n")
+  (widget-insert "Theme name: ")
+  (setq custom-theme-name
+	(widget-create 'editable-field
+		       :size 10
+		       user-login-name))
+  (widget-insert "\n\nDocumentation:\n")
+  (setq custom-theme-description
+	(widget-create 'text 
+		       :value (format-time-string "Created %Y-%m-%d.")))
+  (widget-insert "\nVariables:\n\n")
+  (setq custom-theme-variables
+     	(widget-create 'editable-list
+     		       :entry-format "%i %d %v"
+		       'variable))
+  (widget-insert "\nFaces:\n\n")
+  (setq custom-theme-faces
+     	(widget-create 'editable-list
+     		       :entry-format "%i %d %v"
+		       'face))
+  (widget-insert "\n")
+  (widget-create 'push-button
+     		 :notify (function custom-theme-write)
+     		 "Done")
+  (widget-insert " ")
+  (widget-create 'push-button
+     		 :notify (lambda (&rest ignore)
+     			   (custom-theme-create))
+     		 "Reset")
+  (widget-insert " ")
+  (widget-create 'push-button
+     		 :notify (lambda (&rest ignore)
+     			   (bury-buffer))
+     		 "Bury Buffer")
+  (widget-insert "\n")
+  (use-local-map widget-keymap)
+  (widget-setup))
+
+(defun custom-theme-write (&rest ignore)
+  (let ((name (widget-value custom-theme-name))
+	(doc (widget-value custom-theme-description))
+	(variables (widget-value custom-theme-variables))
+	(faces (widget-value custom-theme-faces)))
+    (switch-to-buffer (concat name "-theme.el"))
+    (setq buffer-file-name (expand-file-name (concat name "-theme.el")))
+    (let ((inhibit-read-only t))
+      (erase-buffer))
+    (insert "(deftheme " name)
+    (when doc
+      (newline)
+      (insert "  \"" doc "\""))
+    (insert  ")\n")
+    (custom-theme-write-variables name variables)
+    (custom-theme-write-faces name faces)
+    (insert "\n(provide-theme '" name ")\n")))
+
+(defun custom-theme-write-variables (theme vars)
+  "Write a `custom-theme-set-variables' command for THEME.
+It includes all variables in list VARS."
+  ;; Most code is stolen from `custom-save-variables'.
+  (when vars
+    (let ((standard-output (current-buffer)))
+      (princ "\n(custom-theme-set-variables\n")
+      (princ " '")
+      (princ theme)
+      (princ "\n")
+      (mapc (lambda (symbol)
+	      (when (boundp symbol)
+		(unless (bolp)
+		  (princ "\n"))
+		(princ " '(")
+		(prin1 symbol)
+		(princ " ")
+		(prin1 (symbol-value symbol))
+		(princ ")")))
+	      vars)
+      (if (bolp)
+	  (princ " "))
+      (princ ")")
+      (unless (looking-at "\n")
+	(princ "\n")))))
+
+(defun custom-theme-write-faces (theme faces)
+  "Write a `custom-theme-set-faces' command for THEME.
+It includes all faces in list FACES."
+  (when faces
+    (let ((standard-output (current-buffer)))
+      (princ "\n(custom-theme-set-faces\n")
+      (princ " '")
+      (princ theme)
+      (princ "\n")
+      (mapc (lambda (symbol)
+	      (when (facep symbol)
+		(unless (bolp)
+		  (princ "\n"))
+		(princ " '(")
+		(prin1 symbol)
+		(princ " ")
+		(prin1 (or (get symbol 'customized-face)
+			   (get symbol 'face-defface-spec)))
+		(princ ")")))
+	      faces)
+      (if (bolp)
+	  (princ " "))
+      (princ ")")
+      (unless (looking-at "\n")
+	(princ "\n")))))
+
+;;; cus-theme.el ends here