diff lisp/hyperbole/hsys-hbase.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/hsys-hbase.el	Mon Aug 13 08:45:50 2007 +0200
@@ -0,0 +1,177 @@
+;;!emacs
+;;
+;; FILE:         hsys-hbase.el
+;; SUMMARY:      Hyperbole support for the Hyperbase system.
+;; USAGE:        GNU Emacs Lisp Library
+;; KEYWORDS:     comm, hypermedia
+;;
+;; AUTHOR:       Bob Weiner
+;; ORG:          Brown U.
+;;
+;; ORIG-DATE:    16-Oct-91 at 04:35:09
+;; LAST-MOD:     30-Oct-95 at 22:31:23 by Bob Weiner
+;;
+;; This file is part of Hyperbole.
+;; 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:  
+;;
+;;   For information and the source to HyperBase and follow-on hypermedia
+;;   work, see:  ftp://ftp.iesd.auc.dk/pub/packages/hypertext/
+;;
+;;   In order to use this package, you must have the HyperBase system
+;;   and must start up a HyperBase server and then load the HyperBase
+;;   Epoch support software that comes with the HyperBase system.
+;;
+;;   Then load this package and Hyperbole will do the following when
+;;   in a Hyperbase buffer:
+;;
+;;     Action Key press on a button follows the link, within any other
+;;     text, closes current Epoch screen and kills node buffer.
+;;
+;;     Assist Key press shows attributes for the current button or
+;;     for the current node buffer, if no current button.
+;;
+;; DESCRIP-END.
+
+;;; ************************************************************************
+;;; Other required Elisp libraries
+;;; ************************************************************************
+
+(require 'hbut)
+
+;;; ************************************************************************
+;;; Public variables
+;;; ************************************************************************
+
+(defib hyperbase ()
+  "Detects link buttons in buffers that communicate with the Hyperbase system.
+Hyperbase is a hypertext database system that interfaces to Emacs."
+  (and (boundp 'ehts-mode) ehts-mode
+       (let ((lbl (or (ebut:label-p 'as-label "[-> " "]")
+		      "no-but")))
+	 (ibut:label-set lbl)
+	 (hact 'hyperbase lbl))))
+
+(defact hyperbase (linkname)
+  "Follows LINKNAME in a buffer that communicates with the Hyperbase system.
+If LINKNAME equals t, closes the current Epoch screen and kill the
+buffer of the current Hyperbase node.
+Hyperbase is a hypertext database system that interfaces to Emacs."
+  ;; From hb-EHTS.el by:
+  ;;	Uffe Kock Wiil 		(kock@iesd.auc.dk)
+  ;;	Claus Bo Nielsen 	(cbn@cci.dk)
+  ;;
+  (if (equal linkname "no-but")
+      (progn (ehts-mouse-kill-screen-and-buffer t)
+	     (and (fboundp 'epoch::select-screen)
+		  (epoch::select-screen)))
+    (let ((linknum (cdr (assoc linkname ehts-node-link-alist))) tonode)
+      (ehts-command t)
+      (if (< (ehts-hb-sys-call "read" linknum "to data node no" nil t) 0)
+	  (progn
+	    (ehts-command nil)
+	    (error "Can't read \"to data node no\" in link, panic !!!")))
+      (ehts-read-4bytes)
+      (setq tonode (ehts-read-4bytes))
+      (if (< (ehts-hb-sys-call "read" tonode "n name" nil t) 0)
+	  (progn
+	    (ehts-command nil)
+	    (error "Can't read \"name\" in data node, panic !!!")))
+      (ehts-get-node (ehts-read-null-string))
+      (and (fboundp 'hproperty:but-create-all)
+	   (hproperty:but-create-all "[-> " "]"))
+      (ehts-command nil))))
+
+;;; ************************************************************************
+;;; Public functions
+;;; ************************************************************************
+
+(defun hyperbase:init ()
+  "Show initial set of Hyperbase buttons."
+  (if (assoc (user-full-name) ehts-node-name-alist)
+      (progn
+	(ehts-get-node (user-full-name))
+	(let (buffer screen)
+	  (setq buffer "*Ehts Welcome*")
+	  (setq screen (ehts-find-buffer-screen buffer))
+	  (kill-buffer buffer)
+	  (switch-to-buffer (user-full-name))
+	  (remove-screen screen)))
+    (if (assoc "dir ehts help" ehts-node-name-alist)
+	(progn
+	  (ehts-get-node "dir ehts help")
+	  (let (buffer screen)
+	    (setq buffer "*Ehts Welcome*")
+	    (setq screen (ehts-find-buffer-screen buffer))
+	    (kill-buffer buffer)
+	    (switch-to-buffer "dir ehts help")
+	    (remove-screen screen)
+	    (hproperty:but-create "[-> " "]"))))))
+
+(defun hyperbase:help (&optional but)
+  "Displays attributes of a link button BUT if on one or of the current node.
+Hyperbase is a hypertext database system that interfaces to Emacs."
+  (interactive (list (ibut:at-p)))
+  (or (and (boundp 'ehts-mode) ehts-mode)
+      (error "(hyperbase:help): Not in a Hyperbase mode buffer."))
+  (hyperbase:attr-help
+   (or (and (symbolp but) 
+	    (let ((lbl (ebut:key-to-label (hattr:get but 'lbl-key))))
+	      (if (not (equal lbl "no-but")) lbl)))
+       (current-buffer))))
+
+;;; ************************************************************************
+;;; Private functions
+;;; ************************************************************************
+
+(defun hyperbase:already-displayed-p (name)
+  "Test if a buffer allready is displayed."
+  (let (screenid)
+    (setq screenid (ehts-find-buffer-screen name))
+    (if screenid
+	(progn
+	  (switch-screen screenid)
+	  t)
+      nil)))
+
+(defun hyperbase:attr-help (node-link-spec)
+  "Show the attributes of a node or a button link from NODE-LINK-SPEC.
+A string value of NODE-LINK-SPEC means show attributes for that button link.
+A buffer value means show attributes for the node in that buffer."
+  (interactive)
+  (or (stringp node-link-spec) (bufferp node-link-spec)
+      (error "(hyperbase-show-attributes): Non-string or buffer argument."))
+  (let (entity name string number buffer screenid)
+    (setq buffer (if (bufferp node-link-spec) (buffer-name node-link-spec))
+	  entity (cdr (assoc (if buffer "node" "link") node-link-list))
+	  buffer (or buffer (buffer-name)))
+    (if (eq (string-match "Attributes - " buffer) 0)
+	nil
+      (if (= entity 0)
+	  (progn
+	    (setq name (concat "Attributes - " buffer))
+	    (if (not (hyperbase:already-displayed-p name))
+		(progn
+		  (setq number (cdr (assoc buffer ehts-node-name-alist))
+			string (ehts-create-node-attribute-string number))
+		  (ehts-setup-attribute-screen name string entity buffer))))
+	(if (eq ehts-node-link-alist '())
+	    (error "No links in this node."))
+	(setq name (concat "Attributes - "
+			   (car (assoc node-link-spec ehts-node-link-alist))))
+	(if (not (hyperbase:already-displayed-p name))
+	    (progn
+	      (setq number (cdr (assoc (substring name 13)
+				       ehts-node-link-alist))
+		    string (ehts-create-link-attribute-string number))
+	      (ehts-setup-attribute-screen name string entity buffer)))))))
+
+;;; ************************************************************************
+;;; Private variables
+;;; ************************************************************************
+
+(provide 'hsys-hbase)