Mercurial > hg > xemacs-beta
diff lisp/psgml/psgml-xemacs.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/psgml/psgml-xemacs.el Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,363 @@ +;;;; psgml-xemacs.el --- Part of SGML-editing mode with parsing support +;; $Id: psgml-xemacs.el,v 1.1.1.1 1996/12/18 03:35:23 steve Exp $ + +;; Copyright (C) 1994 Lennart Staflin + +;; Author: Lennart Staflin <lenst@lysator.liu.se> +;; William M. Perry <wmperry@indiana.edu> + +;; +;; This program 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 +;; of the License, or (at your option) any later version. +;; +;; This program 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 this program; if not, write to the Free Software +;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + +;;;; Commentary: + +;;; Part of psgml.el + +;;; Menus for use with XEmacs + + +;;;; Code: + +(require 'psgml) +;;(require 'easymenu) + +(eval-and-compile + (autoload 'sgml-do-set-option "psgml-edit")) + +(defvar sgml-max-menu-size (/ (* (frame-height) 2) 3) + "*Max number of entries in Tags and Entities menus before they are split +into several panes.") + +;;;; Pop Up Menus + +(defun sgml-popup-menu (event title entries) + "Display a popup menu." + (setq entries + (loop for ent in entries collect + (vector (car ent) + (list 'setq 'value (list 'quote (cdr ent))) + t))) + (cond ((> (length entries) sgml-max-menu-size) + (setq entries + (loop for i from 1 while entries collect + (let ((submenu + (subseq entries 0 (min (length entries) + sgml-max-menu-size)))) + (setq entries (nthcdr sgml-max-menu-size + entries)) + (cons + (format "%s '%s'-'%s'" + title + (sgml-range-indicator (aref (car submenu) 0)) + (sgml-range-indicator + (aref (car (last submenu)) 0))) + submenu)))))) + (sgml-xemacs-get-popup-value (cons title entries))) + + +(defun sgml-range-indicator (string) + (substring string + 0 + (min (length string) sgml-range-indicator-max-length))) + + +(defun sgml-xemacs-get-popup-value (menudesc) + (let ((value nil) + (event nil)) + (popup-menu menudesc) + (while (popup-menu-up-p) + (setq event (next-command-event event)) + (cond ((menu-event-p event) + (cond + ((eq (event-object event) 'abort) + (signal 'quit nil)) + ((eq (event-object event) 'menu-no-selection-hook) + nil) + (t + (eval (event-object event))))) + ((button-release-event-p event) ; don't beep twice + nil) + ((and (fboundp 'event-matches-key-specifier-p) + (event-matches-key-specifier-p event (quit-char))) + (signal 'quit nil)) + (t + (beep) + (message "please make a choice from the menu.")))) + value)) + +(defun sgml-popup-multi-menu (pos title menudesc) + "Display a popup menu. +MENUS is a list of menus on the form (TITLE ITEM1 ITEM2 ...). +ITEM should have to form (STRING EXPR) or STRING. The EXPR gets evaluated +if the item is selected." + (popup-menu + (cons title + (loop for menu in menudesc collect + (cons (car menu) ; title + (loop for item in (cdr menu) collect + (if (stringp item) + item + (vector (car item) (cadr item) t)))))))) + + +;;;; XEmacs menu bar + +(defvar sgml-dtd-menu + '("DTD" + ["Parse DTD" sgml-parse-prolog t] + ("Info" + ["Describe element type" sgml-describe-element-type t] + ["Describe entity" sgml-describe-entity t] + ["List elements" sgml-list-elements t] + ["List attributes" sgml-list-attributes t] + ["List terminals" sgml-list-terminals t] + ["List content elements" sgml-list-content-elements t] + ["List occur in elements" sgml-list-occur-in-elements t] + ) + "---" + ["Load Parsed DTD" sgml-load-dtd t] + ["Save Parsed DTD" sgml-save-dtd t] + )) + +(defvar sgml-fold-menu + '("Fold" + ["Fold Element" sgml-fold-element t] + ["Fold Subelement" sgml-fold-subelement t] + ["Fold Region" sgml-fold-region t] + ["Unfold Line" sgml-unfold-line t] + ["Unfold Element" sgml-unfold-element t] + ["Unfold All" sgml-unfold-all t] + ["Expand" sgml-expand-element t] + )) + +(defvar sgml-markup-menu + '("Markup" + ["Insert Element" (sgml-element-menu last-command-event) t] + ["Insert Start-Tag" (sgml-start-tag-menu last-command-event) t] + ["Insert End-Tag" (sgml-end-tag-menu last-command-event) t] + ["Tag Region" (sgml-tag-region-menu last-command-event) t] + ["Insert Attribute" (sgml-attrib-menu last-command-event) t] + ["Insert Entity" (sgml-entities-menu last-command-event) t] + )) + +(defvar + sgml-move-menu + '("Move" + ["Next trouble spot" sgml-next-trouble-spot t] + ["Next data field" sgml-next-data-field t] + ["Forward element" sgml-forward-element t] + ["Backward element" sgml-backward-element t] + ["Up element" sgml-up-element t] + ["Down element" sgml-down-element t] + ["Backward up element" sgml-backward-up-element t] + ["Beginning of element" sgml-beginning-of-element t] + ["End of element" sgml-end-of-element t] + ) + "Menu of move commands" + ) + +(defvar + sgml-modify-menu + '("Modify" + ["Normalize" sgml-normalize t] + ["Expand All Short References" sgml-expand-all-shortrefs t] + ["Expand Entity Reference" sgml-expand-entity-reference t] + ["Normalize Element" sgml-normalize-element t] + ["Make Character Reference" sgml-make-character-reference t] + ["Unmake Character Reference" (sgml-make-character-reference t) t] + ["Fill Element" sgml-fill-element t] + ["Change Element Name..." sgml-change-element-name t] + ["Edit Attributes..." sgml-edit-attributes t] + ["Kill Markup" sgml-kill-markup t] + ["Kill Element" sgml-kill-element t] + ["Untag Element" sgml-untag-element t] + ["Decode Character Entities" sgml-charent-to-display-char t] + ["Encode Characters" sgml-display-char-to-charent t] + ) + "Menu of modification commands" + ) + +(defun sgml-make-options-menu (vars) + (loop for var in vars + for type = (sgml-variable-type var) + for desc = (sgml-variable-description var) + collect + (cond + ((eq type 'toggle) + (vector desc (list 'setq var (list 'not var)) + ':style 'toggle ':selected var)) + ((consp type) + (cons desc + (loop for c in type collect + (if (atom c) + (vector (prin1-to-string c) + (`(setq (, var) (, c))) + :style 'toggle + :selected (`(eq (, var) '(, c)))) + (vector (car c) + (`(setq (, var) '(,(cdr c)))) + :style 'toggle + :selected (`(eq (, var) '(,(cdr c))))))))) + (t + (vector desc + (`(sgml-do-set-option '(, var))) + t))))) + +(defvar sgml-sgml-menu + (append + '("SGML" + ["Reset Buffer" normal-mode t] + ["Show Context" sgml-show-context t] + ["What Element" sgml-what-element t] + ["Show Valid Tags" sgml-list-valid-tags t] + ["Show/Hide Warning Log" sgml-show-or-clear-log t] + ["Validate" sgml-validate t]) + (if (or (not (boundp 'emacs-major-version)) + (and (boundp 'emacs-minor-version) + (< emacs-minor-version 10))) + '( + ["File Options" sgml-file-options-menu t] + ["User Options" sgml-user-options-menu t] + ) + (list + (cons "File Options" (sgml-make-options-menu sgml-file-options)) + (cons "User Options" (sgml-make-options-menu sgml-user-options)))) + '(["Save File Options" sgml-save-options t] + ["Submit Bug Report" sgml-submit-bug-report t] + ))) + +(defun sgml-install-xemacs-menus () + "Install xemacs menus for psgml mode" + (set-buffer-menubar (copy-sequence current-menubar)) + (add-menu nil (car sgml-sgml-menu) (cdr sgml-sgml-menu)) + (add-menu nil (car sgml-markup-menu) (copy-sequence (cdr sgml-markup-menu))) + (add-menu nil (car sgml-modify-menu) (cdr sgml-modify-menu)) + (add-menu nil (car sgml-move-menu) (cdr sgml-move-menu)) + (add-menu nil (car sgml-fold-menu) (cdr sgml-fold-menu)) + (add-menu nil (car sgml-dtd-menu) (cdr sgml-dtd-menu)) +) + + +;;;; Custom menus + +(defun sgml-build-custom-menus () + (and sgml-custom-markup (add-menu-item '("Markup") "------------" nil t + "Insert Element")) + (mapcar (function + (lambda (x) + (add-menu-item '("Markup") (nth 0 x) + (list 'sgml-insert-markup (nth 1 x)) + t + "------------"))) + sgml-custom-markup) + (and sgml-custom-dtd (add-menu-item '("DTD") "-------------" nil t)) + (mapcar (function + (lambda (x) + (add-menu-item '("DTD") (nth 0 x) + (list 'apply ''sgml-doctype-insert + (cadr x) + (list 'quote (cddr x))) + t))) + sgml-custom-dtd)) + + +;;;; Key definitions + +(define-key sgml-mode-map [button3] 'sgml-tags-menu) + + +;;;; Insert with properties + +(defun sgml-insert (props format &rest args) + (let ((start (point)) + tem) + (insert (apply (function format) + format + args)) + (remf props 'rear-nonsticky) ; not useful in XEmacs + + ;; Copy face prop from category + (when (setq tem (getf props 'category)) + (when (setq tem (get tem 'face)) + (set-face-underline-p (make-face 'underline) t) + (setf (getf props 'face) tem))) + + (add-text-properties start (point) props) + + ;; A read-only value of 1 is used for the text after values + ;; and this should in XEmacs be open at the front. + (if (eq 1 (getf props 'read-only)) + (set-extent-property + (extent-at start nil 'read-only) + 'start-open t)))) + + +;;;; Set face of markup + +(defun sgml-set-face-for (start end type) + (let ((face (cdr (assq type sgml-markup-faces))) + o) + (loop for e being the extents from start to end + do (when (extent-property e 'type) + (cond ((and (null o) + (eq type (extent-property e 'type))) + (setq o e)) + (t (delete-extent e))))) + + (cond (o + (set-extent-endpoints o start end)) + (face + (setq o (make-extent start end)) + (set-extent-property o 'type type) + (set-extent-property o 'face face) + (set-extent-face o face))))) + +(defun sgml-set-face-after-change (start end &optional pre-len) + (when sgml-set-face + (let ((o (extent-at start nil 'type))) + (cond + ((null o)) + ((= start (extent-start-position o)) + (set-extent-endpoints o end (extent-end-position o))) + (t (delete-extent o)))))) + +;(defalias 'next-overlay-at 'next-overlay-change) ; fix bug in cl.el + +(defun sgml-clear-faces () + (interactive) + (loop for o being the overlays + if (extent-property o 'type) + do (delete-extent o))) + + +;;;; Functions not in XEmacs + +(unless (fboundp 'frame-width) + (defalias 'frame-width 'screen-width)) + +(unless (fboundp 'frame-height) + (defalias 'frame-height 'screen-height)) + +(unless (fboundp 'buffer-substring-no-properties) + (defalias 'buffer-substring-no-properties 'buffer-substring)) + + +;;;; Provide + +(provide 'psgml-xemacs) + + +;;; psgml-xemacs.el ends here