Mercurial > hg > xemacs-beta
diff lisp/hyperbole/hui-epV4-b.el @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/hyperbole/hui-epV4-b.el Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,214 @@ +;;!emacs +;; +;; FILE: hui-epV4-b.el +;; SUMMARY: Support color and flashing of hyper-buttons under Epoch V4 +;; USAGE: Epoch Lisp Library +;; KEYWORDS: faces, hypermedia +;; +;; AUTHOR: Bob Weiner +;; ORG: Brown U. +;; +;; ORIG-DATE: 27-Apr-91 at 05:37:10 +;; LAST-MOD: 14-Apr-95 at 16:10:55 by Bob Weiner +;; +;; This file is part of Hyperbole. +;; It is for use with Epoch, a modified version of GNU Emacs. +;; Available for use and distribution under the same terms as GNU Emacs. +;; +;; Copyright (C) 1991-1995, Free Software Foundation, Inc. +;; Developed with support from Motorola Inc. +;; +;; DESCRIPTION: +;; +;; Requires Epoch 4.0a or greater. +;; +;; This is truly prototype code. +;; +;; DESCRIP-END. + +(if (and (boundp 'epoch::version) (stringp epoch::version) + (or noninteractive (not (string-lessp epoch::version "Epoch 4")))) + nil + (error "(hui-epV4-b.el): Load only under Epoch V4 or higher.")) + +(load "button") +(require 'hui-ep-but) + +(defun hproperty:background () + "Returns default background color for selected frame." + (epoch::background)) + +(defun hproperty:foreground () + "Returns default foreground color for selected frame." + (epoch::foreground)) + +;;; ************************************************************************ +;;; Public variables +;;; ************************************************************************ + +(defvar hproperty:item-highlight-color (foreground) + "Color with which to highlight list/menu selections. +Call (hproperty:set-item-highlight <color>) to change value.") + +;;; ************************************************************************ +;;; Public functions +;;; ************************************************************************ + +(defun hproperty:but-create (&optional start-delim end-delim regexp-match) + "Mark all hyper-buttons in buffer as Epoch buttons, for later highlighting. +Will use optional strings START-DELIM and END-DELIM instead of default values. +If END-DELIM is a symbol, e.g. t, then START-DELIM is taken as a regular +expression which matches an entire button string. +If REGEXP-MATCH is non-nil, only buttons matching this argument are +highlighted." + ;; Clear out Hyperbole button zones. + (hproperty:but-clear) + ;; Then recreate them. + (hproperty:but-create-all start-delim end-delim regexp-match)) + +(defun hproperty:but-clear () + "Delete all Hyperbole button zones from current buffer." + (interactive) + (mapcar (function (lambda (zone) + (if (eq (epoch::zone-style zone) hproperty:but) + (epoch::delete-zone zone)))) + (epoch::zone-list))) + +(defun hproperty:cycle-but-color (&optional color) + "Switches button color to optional COLOR name or next item referenced by hproperty:color-ptr." + (interactive "sHyperbole button color: ") + (if (<= (epoch::number-of-colors) 2) + nil + (if color (setq hproperty:color-ptr nil)) + (epoch::set-style-foreground + hproperty:but + (or color (car (hproperty:list-cycle + hproperty:color-ptr hproperty:good-colors)))) + (hproperty:set-flash-color) + (redraw-display) + t)) + +(defun hproperty:but-flash () + "Flash a Hyperbole button at point to indicate selection, when using Epoch." + (interactive) + (let ((ibut) (prev) + (start (hattr:get 'hbut:current 'lbl-start)) + (end (hattr:get 'hbut:current 'lbl-end)) + (b) (a)) + (if (and start end (setq prev (epoch::button-at start) + ibut t)) + (progn (if (not prev) (hproperty:but-add start end hproperty:but)) + (setq b (and start (epoch::button-at start)))) + (setq b (button-at (point)))) + (if (setq a (and (epoch::buttonp b) (epoch::button-style b))) + (progn + (epoch::set-button-style b hproperty:flash-face) + (epoch::redisplay-screen) + ;; Delay before redraw button + (let ((i 0)) (while (< i hproperty:but-flash-time) (setq i (1+ i)))) + (epoch::set-button-style b a) + (epoch::redisplay-screen) + )) + (if (and ibut (not prev)) (hproperty:but-delete start)) + )) + +(defun hproperty:set-item-highlight (&optional background foreground) + "Setup or reset item highlight style using optional BACKGROUND and FOREGROUND." + (make-local-variable 'hproperty:item-face) + (if (stringp background) (setq hproperty:item-highlight-color background)) + (if (not hproperty:highlight-face) + (progn + (setq hproperty:highlight-face (make-style)) + (set-style-foreground hproperty:highlight-face (background)) + (set-style-underline hproperty:highlight-face nil))) + + (let ((update-rolo-highlight-flag + (and (boundp 'rolo-highlight-face) (stylep rolo-highlight-face) + (or (null (style-foreground rolo-highlight-face)) + (equal (style-foreground hproperty:highlight-face) + (style-foreground rolo-highlight-face)))))) + (if (not (equal (style-background hproperty:highlight-face) + (get-color hproperty:item-highlight-color))) + (set-style-background hproperty:highlight-face + hproperty:item-highlight-color)) + (and background (not (equal (style-background hproperty:highlight-face) + (get-color background))) + (set-style-background hproperty:highlight-face background)) + (and foreground (not (equal (style-foreground hproperty:highlight-face) + (get-color foreground))) + (set-style-foreground hproperty:highlight-face foreground)) + (setq hproperty:item-face hproperty:highlight-face) + (if update-rolo-highlight-flag + (progn + (set-style-background rolo-highlight-face + (style-background hproperty:highlight-face)) + (set-style-foreground rolo-highlight-face + (style-foreground hproperty:highlight-face)) + (set-style-font rolo-highlight-face + (style-font hproperty:highlight-face)) + (set-style-underline rolo-highlight-face + (style-underline hproperty:highlight-face)))))) + +(defun hproperty:select-item (&optional pnt) + "Select item in current buffer at optional position PNT using hproperty:item-face." + (or hproperty:item-button + (setq hproperty:item-button (add-button (point) (point) hproperty:item-face))) + (if pnt (goto-char pnt)) + (skip-chars-forward " \t") + (skip-chars-backward "^ \t\n") + (let ((start (point))) + (save-excursion + (skip-chars-forward "^ \t\n") + (move-button hproperty:item-button start (point)) + )) + (epoch::redisplay-screen) + ) + +(defun hproperty:select-line (&optional pnt) + "Select line in current buffer at optional position PNT using hproperty:item-face." + (or hproperty:item-button + (setq hproperty:item-button (add-button (point) (point) hproperty:item-face))) + (if pnt (goto-char pnt)) + (save-excursion + (beginning-of-line) + (move-button hproperty:item-button (point) (progn (end-of-line) (point))) + ) + (epoch::redisplay-screen) + ) + +;;; ************************************************************************ +;;; Private functions +;;; ************************************************************************ + +(defun hproperty:set-flash-color () + "Set button flashing colors based upon current color set." + (if (<= (epoch::number-of-colors) 2) + nil + (epoch::set-style-background hproperty:flash-face (hproperty:but-color)) + (epoch::set-style-foreground hproperty:flash-face (hproperty:background)) + )) + +;;; ************************************************************************ +;;; Private variables +;;; ************************************************************************ + +(defvar hproperty:but (epoch::make-style) "Style for hyper-buttons.") +(epoch::set-style-foreground hproperty:but (hproperty:but-color)) +(epoch::set-style-background hproperty:but (hproperty:background)) + +(defvar hproperty:flash-face (epoch::make-style) + "Style for flashing hyper-buttons.") +(hproperty:set-flash-color) + +(defvar hproperty:item-button nil + "Button used to highlight an item in a listing buffer.") +(make-variable-buffer-local 'hproperty:item-button) +(defvar hproperty:item-face nil "Style for item marking.") +(defvar hproperty:highlight-face nil + "Item highlighting face. Use (hproperty:set-item-highlight) to set.") +(if hproperty:highlight-face + nil + ;; Reverse foreground and background colors for default block-style highlighting. + (hproperty:set-item-highlight (hproperty:foreground) (hproperty:background))) + +(provide 'hui-epV4-b)