Mercurial > hg > xemacs-beta
diff lisp/eos/sun-eos-menubar.el @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | 538048ae2ab8 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/eos/sun-eos-menubar.el Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,555 @@ +;;; sun-eos-menu.el --- Implements the XEmacs/SPARCworks menubar + +;; Copyright (C) 1995 Sun Microsystems, Inc. + +;; Maintainer: Eduardo Pelegri-Llopart <eduardo.pelegri-llopart@Eng.Sun.COM> +;; Author: Eduardo Pelegri-Llopart <eduardo.pelegri-llopart@Eng.Sun.COM> + +;; Keywords: SPARCworks EOS Era on SPARCworks menubar + +;;; Commentary: +;; This file contains functions that populate a SPARCworks menu +;; Please send feedback to eduardo.pelegri-llopart@eng.sun.com + +;;; Code: + +(require 'eos-common "sun-eos-common") + +(defun eos::toggle-sbrowser-selected-frame () + ;; Toggle whether this frame is selected for SBrowser + (interactive) + (if (equal eos::sbrowser-frame (selected-frame)) + (eos::select-sbrowser-frame nil) + (eos::select-sbrowser-frame (selected-frame))) + ) + +(defun eos::toggle-debugger-selected-frame () + ;; Toggle whether this frame is selected for Debugger + (interactive) + (if (equal eos::debugger-frame (selected-frame)) + (eos::select-debugger-frame nil) + (eos::select-debugger-frame (selected-frame))) + ) + +(defvar eos::long-menu + '( + ["Read and Execute a Dbx Command" eos::dbx-cmd (not (eq eos::key-mode 'none))] + ["Run" eos::run (not (eq eos::key-mode 'none))] + ["Fix" eos::fix (not (eq eos::key-mode 'none))] + "-----" + ["Print" eos::print (not (eq eos::key-mode 'none))] + ["Print *" eos::print* (not (eq eos::key-mode 'none))] + ["Dismiss Print" eos::dismiss-print-frame (not (eq eos::key-mode 'none))] + "-----" + ["Continue" eos::cont (not (eq eos::key-mode 'none))] + ["Stop" eos::stop-at (not (eq eos::key-mode 'none))] + ["Clear" eos::clear-at (not (eq eos::key-mode 'none))] + ["Next" eos::next (not (eq eos::key-mode 'none))] + ["Step" eos::step (not (eq eos::key-mode 'none))] + ["Step Up" eos::step-up (not (eq eos::key-mode 'none))] + ["Continue To" eos::cont-to (not (eq eos::key-mode 'none))] + "-----" + ["Stack Up" eos::up (not (eq eos::key-mode 'none))] + ["Stack Down" eos::down (not (eq eos::key-mode 'none))] + "-----" + ("Start Tool and Enable Frame" + ["Debugger" eos::start-debugger t] + ["Dbx" eos::start-dbx t] + ["SBrowser" eos::start-sbrowser t] + ) + "-----" + ["Enable Frame for SBrowser" + eos::toggle-sbrowser-selected-frame + :style toggle + :selected (equal eos::sbrowser-frame + (selected-frame))] + ["Enable Frame for Debugger and Dbx" + eos::toggle-debugger-selected-frame + :style toggle + :selected (equal eos::debugger-frame + (selected-frame))] + "-----" + ["News..." eos::sw-news t] + ) + ) + +(defvar eos::short-menu + '( + ("Start Tool and Enable Frame" + ["Debugger" eos::start-debugger t] + ["Dbx" eos::start-dbx t] + ["SBrowser" eos::start-sbrowser t] + ) + "-----" + ["Enable Frame for SBrowser" + eos::toggle-sbrowser-selected-frame + :style toggle + :selected (equal eos::sbrowser-frame + (selected-frame))] + ["Enable Frame for Debugger and Dbx" + eos::toggle-debugger-selected-frame + :style toggle + :selected (equal eos::debugger-frame + (selected-frame))] + "-----" + ["News..." eos::sw-news t] + ) + ) + +(defun eos::menubar-startup () + ;; Actions to do at startup for eos-menubar.el + (if (and (eq (device-type (selected-device)) 'x) + (or (not (local-variable-p 'current-menubar (current-buffer))) + (yes-or-no-p + "SPARCworks menu will be local (menubar is buffer-local); proceed?"))) + (progn + (add-menu-button '("Help") ["SPARCworks..." eos::sw-intro t]) + (add-submenu nil + (append '("SPARCworks") (copy-tree eos::short-menu)) + "VC" + ) + ))) + +;; +;; Insertion of text with a font +;; + +(defun eos::insert-italics (a-string) + (eos::insert-with-font a-string 'italic)) + +(defun eos::insert-bold (a-string) + (eos::insert-with-font a-string 'bold)) + +(defun eos::insert-with-font (a-string a-font) + (interactive "") + (let (a b ext) + (setq a (point)) + (insert a-string) + (setq b (point)) + (setq ext (make-extent a b)) + (set-extent-face ext (find-face a-font)) + )) + +;; +;; Generic insert code +;; + +(defun eos::insert (s) + (let ((len (length s)) + (pos 0) + (newpos 0) + (state 'normal)) + (while (< pos len) + (setq newpos (string-match "#[bnir]" s pos)) + (if (and newpos (> newpos pos)) + (progn + (cond ((equal (aref s (+ newpos 1)) ?b) ; bold + (if (equal state 'normal) + (progn + (insert (substring s pos newpos)) + (setq state 'bold)) + (error "found bold when not in normal"))) + ((equal (aref s (+ newpos 1)) ?r) ; red + (if (equal state 'normal) + (progn + (insert (substring s pos newpos)) + (setq state 'red)) + (error "found red when not in normal"))) + ((equal (aref s (+ newpos 1)) ?i) ; italics + (if (equal state 'normal) + (progn + (insert (substring s pos newpos)) + (setq state 'italics)) + (error "found italics when not in normal"))) + ((equal (aref s (+ newpos 1)) ?n) ; normal + (cond ((equal state 'italics) + (eos::insert-italics (substring s pos newpos)) + (setq state 'normal)) + ((equal state 'bold) + (eos::insert-bold (substring s pos newpos)) + (setq state 'normal)) + ((equal state 'normal) + (error "found normal when in normal")))) + (t + (error "internal error")) + ) + (setq pos (+ newpos 2)) + ) + (if (equal state 'normal) + (progn + (insert (substring s pos)) + (setq pos len)) + (error "eos::insert with unclosed special font")) + )) + )) + +;; +;; Introduction File +;; + +(defun eos::sw-intro () + "Generate an intro buffer." + (interactive) + (let ((buffer1 (get-buffer-create " *SPARCworks Intro*")) + ) + (switch-to-buffer buffer1) + (setq buffer-read-only nil) + (delete-region (point-min) (point-max)) + (eos::insert " + #bSPARCworks Editor Integration#n + Eos is copyright (c) 1995 by Sun Microsystems. + +#bIntroduction (for Eos 1.5.x)#n + +#iSPARCworks#n is a set of integrated programming tools from SunSoft that +support the program development cycle. #iXEmacs#n is a version of the Emacs +editor that includes interfaces to the selection service and to the +#iToolTalk#n service. The #iEos#n package uses these two interfaces to provide +a simple yet useful editor integration with three SPARCworks tools: +the #iSourceBrowser#n, the #iDebugger#n and #iDbx#n. Eos requires XEmacs 19.12 +or above, and SW3.0.1 or above. + +When used with Eos, the Debugger and SourceBrowser do not include a +source pane for displaying of sources and instead use an XEmacs frame. +Then the user can interact with the XEmacs frame in a way very similar +to how the source panes of the SW tools would be used. The user can also +start Dbx and request that sources be shown in XEmacs. + +#bSimple Startup#n + +In most cases, the user will start an interaction with Eos as follows: + + (1) Start XEmacs, + + (2) Load \"eos.el\" to add a SPARCworks submenu to the menubar (this +step might not be needed if Eos is preloaded to your XEmacs binary), and + + (3) On some XEmacs frame use the SPARCworks submenu and start the +desired tool and simultaneously enable that frame to display sources. + +The toolbar for the enabled frame will change after (3) to show that +this frame will behave as the source display for the SW tool and to +indicate that some actions on the tool can be performed from this frame. + +The actions available depend on the SW tool. The interaction model for +the Debugger and the SourceBrowser can be described as #iselect on the +XEmacs frame and then click on the button on the SW tool#n. As an example, +a browser query can be performed by selecting some text and then clicking +on the query button on the SBrowser tool; the source for the first match +will appear in the XEmacs frame, together with a glyph showing the match. + +The Debugger and Dbx can also be driven from XEmacs. Most frequently +this will be done using the ToolBar. Entries in the toolbar of a frame +enabled for debugging are deactivated when there is not enough information +to invoke their associated commands (due to technical reasons, it is +necessary for XEmacs to have had a frame enabled for Debugger/Dbx when +a debug or attach command was issued to Debugger/Dbx to make most toolbar +commands active). As an example, to set a breakpoint at some line, select +a position in that line and then click on the toolbar icon with the stop +with the arrow inside. + +#bDetails#n + +#iManual Startup#n + +In the scenario described above, the user simultaneously starts a tool +and enables a frame for that tool. The two actions can also be done +independently. The tools (Source Browser, Debugger, and Dbx) have to +be started with the \"-editor\" option and the XEmacs frame can be +enabled manually using the SPARCworks submenu. The most common use +of this feature is to disable and re-enable a frame, be it to recover +the default toolbar, or to avoid conflicts with other active tools +(see the paragraph below on multiple active tools). + +#iFrame Enabling#n + +At any given time there can be at most one frame enabled to display +Source Browser sources, and at most one frame enabled to display +Debugger and Dbx sources. The same XEmacs frame can be used for both +types of sources. The toolbar of an enabled frame always starts with +an informational icon. This icon is a large-font #ii#n with either a +smaller-font #iB#n, if the frame has browsing enabled, and/or a smaller-font +#iD#n, if the frame has debugging enabled. + +If no frames are enabled for a given tool, the editor integration for +that tool is disabled. This means that XEmacs deregisters the TT +patterns relevant to this tool, and XEmacs does not receive any +messages from that tool. + +#iMultiple Active Tools#n + +In order to provide a simpler user model, Eos has no provisions to +#igracefully#n support more than one simultaneous active tool of a +given class per TT session. A Debugger and a SourceBrowser, or a Dbx +and a SourceBrowser, can coexist gracefully, but a Debugger and a Dbx +cannot, and neither can two SourceBrowsers, two Debuggers, or two +dbxs. This simplification is consistent with the needs of most users. + +The implementation of Eos notifies the user if she attempts to start two +conflicting tools, but it does not enforce the restriction. In some +cases two conflicting tools can be used profitably by a careful user, +but in others the result is likely to be chaos. An example of the first +is using two SourceBrowsers, and one of the later is attempting to send +debugging commands from XEmacs to two debuggers. + +If a user really needs to have multiple active tools, she can do this +in a safe way by creating several TT sessions (e.g. using #ittsession +-c /bin/csh#n, see the man page for ttsession), and placing the tools +with their own XEmacses in separate TT sessions. + +#iA Visual Data Inspector in XEmacs#n + +Users that choose to drive the debugger from XEmacs also have +available a #ivery simple#n but fast visual data inspector. The results +of #iprint#n and #iprint*#n commands are formatted into an XEmacs buffer +(#i\"*Eos Print Output*\"#n) and presented into a separate frame. +This frame is mapped and unmapped so that, except for the first time, +it appears quickly. + +#iBuffers for Debugger/Dbx Interaction#n + +When starting dbx as a subprocess, a buffer will be created to interact +with dbx. The name of this buffer is of the form #i\"*Eos dbx*\"#n. + +If a dbx engine is receiving requests from both Debugger and XEmacs +(e.g. it was started via #idebugger -editor#n), the responses to +commands sent by XEmacs will be shown in the echo area and will be +recorded in a read-only buffer (#i\"*Eos Debugger Log*\"#n), but responses +to Debugger commands will not appear. Conversely, responses to Debugger +commands will appear in the Debugger transcript pane but not in XEmacs's +log buffer. This is a limitation of the underlying TT protocols. + +#bTTY Support#n + +Although tty support is not an official part of Eos, it is possible +with some extra effort and specialized knowledge from the user. + +#iStarting a ToolTalk Session#n + +Eos requires a ToolTalk communication. This may require starting a TT +session by: + + (0) Start a ToolTalk session, and a shell so that all processes +started from this shell will use the new TT session. Do this by +executing \"ttsession -c /bin/csh\" - or whatever shell you use + +At this point, you can start your XEmacs on that shell, as shown in +step (1) above. Note that, since there is no TTY toolbar in 19.12 +(nor 19.13), an alternative mechanism must be used to enable the +(tty) frame. + +A typical use for tty is to interact with dbx. The command +#ieos::start-dbx#n will select the tty frame for debugging and will start +a dbx buffer. From this point on, dbx will use this tty frame to show +its sources. The introduction and news messages can be generated +using the commands #ieos::sw-intro#n and #ieos::sw-news#n. You can interact +with the dbx subprocess by typing to its associated input buffer or +using some key bindings. + +#iKey Bindings#n + +A tty user can interact with Eos by invoking directly the Eos +commands, evaluating elisp expressions, or through some key-bindings. +The expert user may provide her own key bindings. Eos also provides two +set of global bindings, which are activated by evaluating the +expressions (eos::set-key-mode 'prefix) or (eos::set-key-mode +'function). + +#bKnown Bugs#n + +Due to a bug in the internal subprocess machinery of XEmacs 19.12, the +default prompt of dbx subprocesses will show the full path to the binary. +The prompt can be overridden using the ksh variable PS1\; one way to do +this is by adding the following line to your ~/.dbxrc: + + PS1='(dbx) ' + +#bFeedback#n + +You are encouraged to send us feedback via the Comments button in +the About Box of either SPARCworks tool, or directly to +eos-comments@cs.uiuc.edu. + +#bEnjoy.#n") + (setq buffer-read-only t) + (goto-char (point-min)) + (view-mode nil 'kill-buffer) ;; assume the new view-less + )) + +;; +;; Cheat Sheets for keyboard mappings +;; +;; This depends on the mapping being used! +;; + +(defun eos::sw-cheat-sheet () + "Generate buffer that has a description of the key maps that can be +printed, cut and then taped somewhere (like on the keyboard or on your +monitor). This is particularly useful for the function keys" + (interactive) + (let ((buffer1 (get-buffer-create " *Cheat Sheets*")) + ) + (switch-to-buffer buffer1) + (setq buffer-read-only nil) + (delete-region (point-min) (point-max)) + (eos::insert " + #bCheat Sheets for Eos#n + +This buffer has a description of the key maps that can be printed, cut +and then taped somewhere (like on the keyboard or on your monitor). +This is particularly useful for the function keys since their numbers +don't any particular mnemonic value. + + +#bWhen using function keys#n #i[Options->SPARCworks->Use Function Keys]#n + +---------------------------------------- + +F6 F7 F8 F9 + +Do Print Cont ---- Next +Run Print* Stop <Ctrl> Step +Fix Dismiss Clear <Shft> Step Up + + +---------------------------------------- + +#bWhen using prefix map#n #i[Options->SPARCworks->Use C-c d Prefix Map]#n + +---------------------------------------- +Basic prefix: C-c d + + + Do % + Run r + Fix f + + Print p + Print* C-p + + Cont c + Stop b (for breakpoint) + Clear C-b + + Next n + Step s + Step up C-s + + Up u + Down d +---------------------------------------- + +") + (setq buffer-read-only t) + (goto-char (point-min)) + (view-mode nil 'kill-buffer) ;; assume the new view-less + )) + +;; +;; News files +;; + +(defun eos::sw-news () + "Generate a News buffer." + (interactive) + (let ((buffer1 (get-buffer-create " *Eos News*")) + ) + (switch-to-buffer buffer1) + (setq buffer-read-only nil) + (delete-region (point-min) (point-max)) + (eos::insert " + #bEos News#n + +See the #iHelp#n top-level menu for additional information on the +SPARCworks lightweight editor integration (Eos). The current version +of Eos is available as the contents of the variable eos::version. + +#bversion 1.5.2#n + + Support for 19.12 and 19.13. Works on TTYs. Uses real ToolBar. + Toolbars for debugger & content inspector are frame-local. + Better icons and glyphs. Support for (load-library \"eos\"). + Ease-of-use: startup for tools. + Icon files are now defined \"in-line\" to simplify administration. + + Removed the following to simplify use: + - Textual toolbar (from 1.4). + - Option submenu to add keymaps for debugger use. + - Popup menu. + - Any pretenses to support SW3.0; use SW3.0.1 instead. + +#bversion 1.4.1#n + + Added eos::add-button interface. + +#bversion 1.4#n + + Added toolbar like in dbxtool. Toolbar uses echo-help to show + meaning of buttons, (setq inhibit-help-echo t) if you don't + want it. + + Selection now remains after \"print\"-like commands. Now it + is possible to have the *debugger* buffer in the frame selected + for displaying debugged sources. + + Added a command to relayout debugger buffers so they show in + a layout similar to that of dbxtool. + +#bversion 1.3#n + + Provided popup-menu bindings for those debugger actions + that operate on the contents of the selection or its position; + selectable via options. + + The *debugger* buffer now support M-p and M-n. + +#bversion 1.2#n + + Better support for interactions via *debugger* buffer and directly + using a prefix map and function keys. + + Converted to use new toggle and radio menus, reorganizing + SPARCworks menu to factor out help and options into submenus, + which are now available under the Options and Help top-level menus. + +#bversion 1.1#n + + Some internal cleanup. + + Eos now provides basic machinery to drive the debugger + engine directly using ToolTalk messages. This feature is + not yet very well polished. You can try using it at your own risk, + or await for release 1.2 (soon to come) that will provide a better + interface and improved functionality, as well as documentation + for the interface. + +#bversion 1.0#n + + First widely available release. Supports simple #iselect and click#n model. + +#bPossible Future Enhancements#n + +* Add a \"peek-in-source\" mechanism to show the values of + expressions in the sources. + +* The comint package should be generalized to allow for TT-based + interpreters and it should be used in Eos. + +* Key & popup bindings should probably be a minor mode (currently + it conflicts with cc-mode). + +* Should support locking a print frame to force new print frames. Also, + should allow for following fields in print frames. + + +#bFeedback#n + + Send feedback to #ieos-comments@cs.uiuc.edu#n") + (setq buffer-read-only t) + (goto-char (point-min)) + (view-mode nil 'kill-buffer) ;; assume the new view-less + )) + +(provide 'eos-menubar) + +;;; sun-eos-debugger.el ends here