branch: externals/idlwave commit 46ac2bca8eb952c712368d2f7a97e11b59c0d66a Author: jdsmith <jdsmith> Commit: jdsmith <jdsmith>
Initial seed of IDLWAVE v4.10 (added after the fact, forgot to add) --- idlw-help.el | 3060 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3060 insertions(+) diff --git a/idlw-help.el b/idlw-help.el new file mode 100644 index 0000000000..e3b5b84c9e --- /dev/null +++ b/idlw-help.el @@ -0,0 +1,3060 @@ +;;; idlw-help.el --- Help code and topics for IDLWAVE +;; Copyright (c) 2000 Carsten Dominik +;; Copyright (c) 2001 J.D.Smith +;; +;; Author: Carsten Dominik <domi...@astro.uva.nl> +;; Maintainer: J.D. Smith <jdsm...@alum.mit.edu> +;; Version: 4.10 + +;; This file is not part of GNU Emacs. + +;; This file 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. + +;; This file 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. + +;;; Commentary: + +;; The constants which contain the topics information for IDLWAVE's +;; online help feature. This information is extracted automatically from +;; the IDL documentation. +;; +;; Created by get_rinfo on Tue Nov 27 16:14:14 2001 +;; IDL version: 5.5 +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;; Code: + + +(defvar idlwave-completion-help-info) +(defvar idlwave-help-use-dedicated-frame) +(defvar idlwave-help-frame-parameters) + +(defvar idlwave-help-frame nil + "The frame for display of IDL online help.") +(defvar idlwave-help-frame-width 102 + "The default width of the help frame.") + +(defvar idlwave-help-file nil + "The file containing the ASCII help for IDLWAVE.") + +(defvar idlwave-help-topics nil + "List of helptopics and byte positions in `idlw-help.txt'.") + +(defvar idlwave-help-current-topic nil + "The topic currently loaded into the IDLWAVE Help buffer.") + +(defvar idlwave-help-mode-line-indicator "" + "Used for the special mode line in the idlwave-help-mode.") + +(defvar idlwave-help-window-configuration nil) +(defvar idlwave-help-name-translations nil) ; defined by get_rinfo +(defvar idlwave-help-alt-names nil) ; defined by get_rinfo +(defvar idlwave-help-special-topic-words) ; defined by get_rinfo + +(defvar idlwave-help-stack-back nil + "Help topic stack for backwards motion.") +(defvar idlwave-help-stack-forward nil + "Help topic stack for forward motion. +Only gets populated when moving back.") + + +;; Define the key bindings for the Help application + +(defvar idlwave-help-mode-map (make-sparse-keymap) + "The keymap used in idlwave-help-mode.") + +(define-key idlwave-help-mode-map "q" 'idlwave-help-quit) +(define-key idlwave-help-mode-map "w" 'widen) +(define-key idlwave-help-mode-map "\C-m" (lambda (arg) + (interactive "p") + (scroll-up arg))) +(define-key idlwave-help-mode-map "n" 'idlwave-help-next-topic) +(define-key idlwave-help-mode-map "p" 'idlwave-help-previous-topic) +(define-key idlwave-help-mode-map " " 'scroll-up) +(define-key idlwave-help-mode-map [delete] 'scroll-down) +(define-key idlwave-help-mode-map "b" 'idlwave-help-back) +(define-key idlwave-help-mode-map "f" 'idlwave-help-forward) +(define-key idlwave-help-mode-map "c" 'idlwave-help-clear-history) +(define-key idlwave-help-mode-map "o" 'idlwave-online-help) +(define-key idlwave-help-mode-map "*" 'idlwave-help-load-entire-file) +(define-key idlwave-help-mode-map "h" 'idlwave-help-find-header) +(define-key idlwave-help-mode-map "H" 'idlwave-help-find-first-header) +(define-key idlwave-help-mode-map "L" 'idlwave-help-activate-aggressively) +(define-key idlwave-help-mode-map "." 'idlwave-help-toggle-header-match-and-def) +(define-key idlwave-help-mode-map "F" 'idlwave-help-fontify) +(define-key idlwave-help-mode-map "\M-?" 'idlwave-help-return-to-calling-frame) +(define-key idlwave-help-mode-map "x" 'idlwave-help-return-to-calling-frame) + +;; Define the menu for the Help application + +(easy-menu-define + idlwave-help-menu idlwave-help-mode-map + "Menu for Help IDLWAVE system" + '("IDLHelp" + ["Open topic" idlwave-online-help t] + ["History: Backward" idlwave-help-back t] + ["History: Forward" idlwave-help-forward t] + ["History: Clear" idlwave-help-clear-history t] + "---" + ["Follow Link" idlwave-help-follow-link (not idlwave-help-is-source)] + ["Browse: Next Topic" idlwave-help-next-topic (not idlwave-help-is-source)] + ["Browse: Previous Topic" idlwave-help-previous-topic + (not idlwave-help-is-source)] + ["Load Entire Help File" idlwave-help-load-entire-file t] + "---" + ["Definition <-> Help Text" idlwave-help-toggle-header-match-and-def + idlwave-help-is-source] + ["Find DocLib Header" idlwave-help-find-header idlwave-help-is-source] + ["Find First DocLib Header" idlwave-help-find-first-header + idlwave-help-is-source] + ["Fontify help buffer" idlwave-help-fontify idlwave-help-is-source] + "--" + ["Quit" idlwave-help-quit t])) + +(defun idlwave-help-mode () + "Major mode for displaying IDL Help. + +This is a VIEW mode for the ASCII version of IDL Help files, +with some extras. Its main purpose is speed - so don't +expect a fully hyper-linked help. + +Scrolling: SPC DEL RET +Topic Histrory: [b]ackward [f]orward +Topic Browsing: [n]ext [p]revious +Choose new Topic: [o]pen +Follow Link: Mouse button 2 finds help on word at point +Text Searches: Inside Topic: Use Emacs search functions + Global: Press `*' to load entire help file +Exit: [q]uit or mouse button 3 will kill the frame + +When the hep text is a source file, the following commands are available + +Fontification: [F]ontify the buffer like source code +Jump: [h] to function doclib header + [H] to file doclib header + [.] back and forward between header and definition + +Here are all keybindings. +\\{idlwave-help-mode-map}" + (kill-all-local-variables) + (buffer-disable-undo) + (setq major-mode 'idlwave-help-mode + mode-name "IDLWAVE Help") + (use-local-map idlwave-help-mode-map) + (easy-menu-add idlwave-help-menu idlwave-help-mode-map) + (setq truncate-lines t) + (setq case-fold-search t) + (setq mode-line-format + (list "" + 'mode-line-modified + 'mode-line-buffer-identification + ": " 'idlwave-help-mode-line-indicator + " -%-")) + (setq buffer-read-only t) + (set (make-local-variable 'idlwave-help-def-pos) nil) + (set (make-local-variable 'idlwave-help-args) nil) + (set (make-local-variable 'idlwave-help-in-header) nil) + (set (make-local-variable 'idlwave-help-is-source) nil) + (run-hooks 'idlwave-help-mode-hook)) + +(defvar idlwave-current-obj_new-class) +(defvar idlwave-help-diagnostics) +(defvar idlwave-experimental) +(defvar idlwave-last-context-help-pos) +(defun idlwave-do-context-help (&optional arg) + "Wrapper around the call to idlwave-context-help1. +It collects and pronts the diagnostics messages." + (let ((marker (list (current-buffer) (point))) + (idlwave-help-diagnostics nil)) + ;; Check for frame switching. When the command is invoked twice + ;; at the same position, we try to switch to the help frame + ;; FIXME: Frame switching works only on XEmacs + (if (and idlwave-experimental + (equal last-command this-command) + (equal idlwave-last-context-help-pos marker)) + (idlwave-help-select-help-frame) + ;; Do the real thing. + (setq idlwave-last-context-help-pos marker) + (idlwave-do-context-help1 arg) + (if idlwave-help-diagnostics + (message "%s" (mapconcat 'identity + (nreverse idlwave-help-diagnostics) + "; ")))))) + + +(defun idlwave-do-context-help1 (&optional arg) + "The work-horse version of `idlwave-context-help', which see." + (save-excursion + (if (equal (char-after) ?/) + (forward-char 1) + (if (equal (char-before) ?=) + (backward-char 1))) + (let* ((idlwave-query-class nil) + (idlwave-force-class-query (equal arg '(4))) + (chars "a-zA-Z0-9_$.!") + (beg (save-excursion (skip-chars-backward chars) (point))) + (end (save-excursion (skip-chars-forward chars) (point))) + (this-word (buffer-substring beg end)) + (st-ass (assoc (downcase this-word) idlwave-help-special-topic-words)) + module keyword cw mod1 mod2 mod3) + (if (or arg + (and (not (member (string-to-char this-word) '(?! ?.))) + (not st-ass))) + ;; Need the module information + (progn + (setq module (idlwave-what-module-find-class) + cw (nth 2 (idlwave-where))) + ;; Correct for OBJ_NEW, we may need an INIT method instead. + (if (equal (idlwave-downcase-safe (car module)) "obj_new") + (let* ((bos (save-excursion (idlwave-beginning-of-statement) + (point))) + (str (buffer-substring bos (point)))) + (if (string-match "OBJ_NEW([ \t]*['\"]\\([a-zA-Z][a-zA-Z0-9$_]+\\)['\"]" + str) + (setq module (list "init" 'fun (match-string 1 str)) + idlwave-current-obj_new-class (match-string 1 str)) + ))))) + (cond (arg (setq mod1 module)) + (st-ass (setq mod1 (list (or (cdr st-ass) (car st-ass)) + nil nil nil))) + ((string-match "\\`![a-zA-Z0-9_]+" this-word) + ;; A system variable + (setq mod1 (list "system variables" nil nil + (match-string 0 this-word)))) + ((string-match "^\\." this-word) + ;; An executive command + (setq mod1 (list this-word nil nil nil))) + ((and (eq cw 'class) + (or (idlwave-in-quote) ; e.g. obj_new + (re-search-backward "\\<inherits[ \t]+[A-Za-z0-9_]*\\=" + (max (point-min) (- (point) 40)) t)) + ) + ;; Class completion insite string delimiters should be + ;; the class inside OBJ_NEW. + ;; FIXME: Do we really need the in-quotes restriction? + ;; This is why it does not work after INHERITS. + (setq mod1 (list nil nil this-word nil))) + ((and (memq cw '(function-keyword procedure-keyword)) + (stringp this-word) + (string-match "\\S-" this-word) + (not (string-match "!" this-word))) + (cond ((or (= (char-before beg) ?/) + (save-excursion (goto-char end) + (looking-at "[ \t]*="))) + ;; Certainly a keyword. Check for abbreviation etc. + (setq keyword (idlwave-expand-keyword this-word module)) + (cond + ((null keyword) + (idlwave-help-diagnostics + (format "%s does not accept `%s' kwd" + (idlwave-make-full-name (nth 2 module) + (car module)) + (upcase this-word)) + 'ding)) + ((consp keyword) + (idlwave-help-diagnostics + (format "%d matches for kwd abbrev `%s'" + (length keyword) this-word) + 'ding) + ;; We continue anyway with the first match... + (setq keyword (car keyword)))) + (setq mod1 (append module (list keyword))) + (setq mod2 module)) + ((equal (char-after end) ?\() + ;; A function - what-module will have caught this + (setq mod1 module)) + (t + ;; undecided - try function, keyword, then enclosing mod. + ;; Check for keyword abbreviations, but do not report + ;; errors, because it might something else. + ;; FIXME: is this a good way to handle this? + (setq keyword (idlwave-expand-keyword this-word module)) + (if (consp keyword) (setq keyword (car keyword))) + (setq mod1 (append module (list keyword)) + mod2 (list this-word 'fun nil) + mod3 module)))) + (t + (setq mod1 module))) + (if mod3 + (condition-case nil + (apply 'idlwave-online-help nil mod1) + (error (condition-case nil + (apply 'idlwave-online-help nil mod2) + (error (apply 'idlwave-online-help nil mod3))))) + (if mod2 + (condition-case nil + (apply 'idlwave-online-help nil mod1) + (error (apply 'idlwave-online-help nil mod2))) + (if mod1 + (apply 'idlwave-online-help nil mod1) + (error "Don't know which routine to show help for."))))))) + +(defvar idlwave-extra-help-function) +(defun idlwave-do-mouse-completion-help (ev) + "Display online help on n item in the *Completions* buffer. +Need additional info stored in `idlwave-completion-help-info'." + (let* ((cw (selected-window)) + (info idlwave-completion-help-info) + (what (nth 0 info)) + (name (nth 1 info)) + (type (nth 2 info)) + (class (nth 3 info)) + (need-class class) + (kwd (nth 4 info)) + (sclasses (nth 5 info)) + word) + (mouse-set-point ev) + (setq word (idlwave-this-word)) + (select-window cw) + (cond ((memq what '(procedure function routine)) + (setq name word) + (if (or (eq class t) + (and (stringp class) sclasses)) + (let* ((classes (idlwave-all-method-classes + (idlwave-sintern-method name) + type))) + (if sclasses + (setq classes (idlwave-members-only + classes (cons class sclasses)))) + (if (not idlwave-extra-help-function) + (setq classes (idlwave-grep-help-topics classes))) + (setq class (idlwave-help-popup-select ev classes)))) + (if (stringp class) + (setq class (idlwave-find-inherited-class + (idlwave-sintern-routine-or-method name class) + type (idlwave-sintern-class class))))) + ((eq what 'keyword) + (setq kwd word) + (if (or (eq class t) + (and (stringp class) sclasses)) + (let ((classes (idlwave-all-method-keyword-classes + (idlwave-sintern-method name) + (idlwave-sintern-keyword kwd) + type))) + (if sclasses + (setq classes (idlwave-members-only + classes (cons class sclasses)))) + (if (not idlwave-extra-help-function) + (setq classes (idlwave-grep-help-topics classes))) + (setq class (idlwave-help-popup-select ev classes)))) + (if (stringp class) + (setq class (idlwave-find-inherited-class + (idlwave-sintern-routine-or-method name class) + type (idlwave-sintern-class class))))) + ((eq what 'class) + (setq class word)) + ((and (symbolp what) ;; FIXME: document this. + (fboundp what)) + (funcall what 'set word)) + (t (error "Cannot help with this item"))) + (if (and need-class (not class)) + (error "Cannot help with this item")) + (idlwave-online-help nil name type class kwd))) + +(defvar idlwave-highlight-help-links-in-completion) +(defun idlwave-highlight-linked-completions () + "Highlight all completions for which help is available. +`idlwave-help-link-face' is used for this." + (if idlwave-highlight-help-links-in-completion + (save-excursion + (set-buffer (get-buffer "*Completions*")) + (save-excursion + (let* ((buffer-read-only nil) + (case-fold-search t) + (props (list 'face 'idlwave-help-link-face)) + (info idlwave-completion-help-info) + (what (nth 0 info)) + (name (nth 1 info)) + (type (nth 2 info)) + (class (nth 3 info)) + ;; (kwd (nth 4 info)) + (sclasses (nth 5 info)) + (kwd-doit + (and (eq what 'keyword) + (if (equal (idlwave-downcase-safe name) "obj_new") + (idlwave-is-help-topic + (idlwave-make-full-name + idlwave-current-obj_new-class "Init")) + (idlwave-is-help-topic + (idlwave-make-full-name class name))))) + word beg end doit) + (goto-char (point-min)) + (re-search-forward "possible completions are:" nil t) + (while (re-search-forward "\\s-\\([A-Za-z0-9_]+\\)\\(\\s-\\|\\'\\)" + nil t) + (setq beg (match-beginning 1) end (match-end 1) + word (match-string 1) doit nil) + (cond + ((eq what 'class) + (setq doit (idlwave-is-help-topic word))) + ((memq what '(procedure function routine)) + (if (eq class t) + (setq doit (idlwave-any-help-topic + (idlwave-all-method-classes + (idlwave-sintern-method word) type))) + (if sclasses + (setq doit (idlwave-any-help-topic + (mapcar (lambda (x) + (idlwave-make-full-name x word)) + (idlwave-members-only + (idlwave-all-method-classes + (idlwave-sintern-method word) type) + (cons class sclasses))))) + (setq doit (idlwave-is-help-topic + (idlwave-make-full-name class word)))))) + ((eq what 'keyword) + (if (eq class t) + (setq doit (idlwave-any-help-topic + (idlwave-all-method-classes + (idlwave-sintern-method name) type))) + (if sclasses + (setq doit (idlwave-any-help-topic + (mapcar + (lambda (x) + (idlwave-make-full-name x name)) + (idlwave-members-only + (idlwave-all-method-keyword-classes + (idlwave-sintern-method name) + (idlwave-sintern-keyword word) + type) + (cons class sclasses))))) + (setq doit kwd-doit)))) + ((and (symbolp what) ; FIXME: document this. + (fboundp what)) + (setq doit (funcall what 'test word)))) + (if doit + (add-text-properties beg end props)) + (goto-char end))))))) + +;; Arrange for this function to be called after completion +(add-hook 'idlwave-completion-setup-hook + 'idlwave-highlight-linked-completions) + +(defvar idlwave-help-return-frame nil + "The frame to return to from the help frame.") + +(defun idlwave-help-quit () + "Exit IDLWAVE Help buffer. Kill the dedicated frame if any." + (interactive) + (cond ((and idlwave-help-use-dedicated-frame + (eq (selected-frame) idlwave-help-frame)) + (if (and idlwave-experimental + (frame-live-p idlwave-help-return-frame)) + ;; Try to select the return frame. + ;; This can crash on slow network connections, obviously when + ;; we kill the help frame before the return-frame is selected. + ;; To protect the workings, we wait for up to one second + ;; and check if the return-frame *is* now selected. + ;; This is marked "eperimental" since we are not sure when its OK. + (let ((maxtime 1.0) (time 0.) (step 0.1)) + (select-frame idlwave-help-return-frame) + (while (and (sit-for step) + (not (eq (selected-frame) idlwave-help-return-frame)) + (< (setq time (+ time step)) maxtime))))) + (delete-frame idlwave-help-frame)) + ((window-configuration-p idlwave-help-window-configuration) + (set-window-configuration idlwave-help-window-configuration) + (select-window (previous-window))) + (t (kill-buffer (idlwave-help-get-help-buffer))))) + +(defun idlwave-help-follow-link (ev) + "Try the word at point as a help topic. If positive, display topic." + (interactive "e") + (mouse-set-point ev) + (let* ((beg (or (previous-single-property-change (1+ (point)) + 'idlwave-help-link) + (point-min))) + (end (or (next-single-property-change (point) 'idlwave-help-link) + (point-max))) + (this-word (downcase (buffer-substring beg end))) + (ass (assoc this-word idlwave-help-special-topic-words)) + (topic (if ass (or (cdr ass) (car ass)) this-word))) + (cond ((idlwave-is-help-topic topic) + (idlwave-online-help + (idlwave-help-maybe-translate topic))) + ((string-match "::" this-word) + (let* ((l (split-string this-word "::")) + (class (car l)) + (method (nth 1 l))) + (idlwave-online-help nil method nil class))) + (t + (error "Cannot find help for \"%s\"" this-word))))) + +(defun idlwave-help-next-topic () + "Select next topic in the physical sequence in the Help file." + (interactive) + (if (stringp idlwave-help-current-topic) + (let* ((topic (car (car (cdr (memq (assoc idlwave-help-current-topic + idlwave-help-topics) + idlwave-help-topics)))))) + (if topic + (idlwave-online-help topic) + (error "Already in last topic"))) + (error "No \"next\" topic"))) + +(defun idlwave-help-previous-topic () + "Select previous topic in the physical sequence in the Help file." + (interactive) + (if (stringp idlwave-help-current-topic) + (let* ((topic (car (nth (- (length idlwave-help-topics) + (length (memq (assoc idlwave-help-current-topic + idlwave-help-topics) + idlwave-help-topics)) + 1) + idlwave-help-topics)))) + (if topic + (idlwave-online-help topic) + (error "Already in first topic"))) + (error "No \"previous\" topic"))) + +(defun idlwave-help-back () + "Select previous topic as given by help history stack." + (interactive) + (if idlwave-help-stack-back + (let* ((back idlwave-help-stack-back) + (fwd idlwave-help-stack-forward) + (goto (car back))) + (setq back (cdr back)) + (setq fwd (cons (cons idlwave-help-current-topic (window-start)) fwd)) + (if (consp (car goto)) + (apply 'idlwave-online-help nil (car goto)) + (idlwave-online-help (car goto))) + (set-window-start (selected-window) (cdr goto)) + (setq idlwave-help-stack-forward fwd + idlwave-help-stack-back back)) + (error "Cannot go back any further in history"))) + +(defun idlwave-help-forward () + "Select next topic as given by help history stack. +Only accessible if you have walked back with `idlwave-help-back' first." + (interactive) + (if idlwave-help-stack-forward + (let* ((back idlwave-help-stack-back) + (fwd idlwave-help-stack-forward) + (goto (car fwd))) + (setq fwd (cdr fwd)) + (setq back (cons (cons idlwave-help-current-topic (window-start)) back)) + (if (consp (car goto)) + (apply 'idlwave-online-help nil (car goto)) + (idlwave-online-help (car goto))) + (set-window-start (selected-window) (cdr goto)) + (setq idlwave-help-stack-forward fwd + idlwave-help-stack-back back)) + (error "Cannot go forward any further in history"))) + +(defun idlwave-help-clear-history () + "Clear the history." + (interactive) + (setq idlwave-help-stack-back nil + idlwave-help-stack-forward nil)) + +(defun idlwave-help-load-entire-file () + "Load the entire help file for global searches." + (interactive) + (let ((buffer-read-only nil)) + (idlwave-help-load-topic "***") + (message "Entire Help file loaded"))) + +(defun idlwave-find-help (class1 routine1 keyword1) + "Find help corresponding to the arguments." + (let ((search-list (idlwave-help-make-search-list class1 routine1 keyword1)) + class routine keyword topic + entry pre-re pos-re found kwd-re + pos-p not-first) + + (save-excursion + (set-buffer (idlwave-help-get-help-buffer)) + ;; Loop over all possible search compinations + (while (and (not found) + (setq entry (car search-list))) + (setq search-list (cdr search-list)) + (catch 'next + (setq class (nth 0 entry) + routine (nth 1 entry) + keyword (nth 2 entry)) + + ;; The [XYZ] keywords need a special search strategy + (if (and keyword (string-match "^[xyz]" keyword)) + (setq kwd-re (format "\\(%s\\|\\[[xyz]+\\]\\)%s" + (substring keyword 0 1) + (substring keyword 1))) + (setq kwd-re keyword)) + + ;; Determine the topic, and the regular expressions for narrowing and + ;; window start during display. + (setq topic (if class + (if routine (concat class "::" routine) class) + routine)) + (setq pre-re nil pos-re nil found nil) + (setq pos-p nil) + (cond ((and (stringp keyword) (string-match "^!" keyword)) + ;; A system keyword + (setq pos-re (concat "^[ \t]*" + "\\(![a-zA-Z0-9_]+ *, *\\)*" + keyword + "\\( *, *![a-zA-Z0-9_]+ *\\)*" + " *\\([sS]ystem +[vV]ariables?\\)?" + "[ \t]*$"))) + ((and class routine) + ;; A class method + (if keyword + (setq pos-re (concat + "^ *" + kwd-re + " *\\(( *\\(get *, *set\\|get\\|set\\) *)\\)?" + " *$")))) + (routine + ;; A normal routine + (if keyword + (setq pre-re "^ *keywords *$" + pos-re (concat + "^ *" + kwd-re + " *$")))) + (class + ;; Just a class + (if keyword + (setq pre-re "^ *keywords *$" + pos-re (concat + "^ *" + kwd-re + " *\\(( *\\(get *, *set\\|get\\|set\\) *)\\)?" + " *$"))))) + ;; Load the correct help topic into this buffer + (widen) + (if (not (equal topic idlwave-help-current-topic)) + ;; The last topic was different - load the new one. + (let ((buffer-read-only nil)) + (or (idlwave-help-load-topic topic) + (throw 'next nil)))) + (goto-char (point-min)) + + ;; Position cursor and window start. + (if pre-re + (re-search-forward pre-re nil t)) + (if (and pos-re + (setq pos-p (re-search-forward pos-re nil t))) + (progn (goto-char (match-beginning 0)))) + ;; Determine if we found what we wanted + (setq found (if pos-re + pos-p + (not not-first))) + (setq not-first t))) + (if found + (point) + (or idlwave-help-use-dedicated-frame + (idlwave-help-quit)) + nil)))) + +(defvar default-toolbar-visible-p) +(defvar idlwave-help-activate-links-aggressively) +(defun idlwave-help-display-help-window (pos &optional nolinks) + "Display the help window and move window start to POS. +See `idlwave-help-use-dedicated-frame'." + (let ((cw (selected-window)) + (buf (idlwave-help-get-help-buffer))) + (if (and window-system idlwave-help-use-dedicated-frame) + (progn + ;; Use a special frame for this + (if (frame-live-p idlwave-help-frame) + nil + (setq idlwave-help-frame + (make-frame idlwave-help-frame-parameters)) + ;; Strip menubar (?) and toolbar from the Help frame. + (if (fboundp 'set-specifier) + (progn + ;; XEmacs + (let ((sval (cons idlwave-help-frame nil))) + ;; (set-specifier menubar-visible-p sval) + (set-specifier default-toolbar-visible-p sval))) + ;; Emacs + (modify-frame-parameters idlwave-help-frame + '(;;(menu-bar-lines . 0) + (tool-bar-lines . 0))))) + ;; We should use display-buffer here, but there are problems on Emacs + (select-frame idlwave-help-frame) + (switch-to-buffer buf)) + ;; Do it in this frame and save the window configuration + (if (not (get-buffer-window buf nil)) + (setq idlwave-help-window-configuration + (current-window-configuration))) + (display-buffer buf nil (selected-frame)) + (select-window (get-buffer-window buf))) + (raise-frame) + (goto-char pos) + (recenter 0) + (if nolinks + nil + (idlwave-help-activate-see-also) + (idlwave-help-activate-methods) + (idlwave-help-activate-class) + (if idlwave-help-activate-links-aggressively + (idlwave-help-activate-aggressively))) + (select-window cw))) + + +(defun idlwave-help-select-help-frame () + "Select the help frame." + (if (and (frame-live-p idlwave-help-frame) + (not (eq (selected-frame) idlwave-help-frame))) + (progn + (setq idlwave-help-return-frame (selected-frame)) + (select-frame idlwave-help-frame)))) +(defun idlwave-help-return-to-calling-frame () + "Select the frame from which the help frame was selected." + (interactive) + (if (and (frame-live-p idlwave-help-return-frame) + (not (eq (selected-frame) idlwave-help-return-frame))) + (select-frame idlwave-help-return-frame))) + +(defvar idlwave-help-is-source) +(defun idlwave-help-load-topic (topic) + "Load topic TOPIC into the current buffer." + (setq idlwave-help-is-source nil) + (let* ((entry (assoc topic idlwave-help-topics)) + beg end) + (if (equal topic "***") + ;; Make it load the whole file + (setq entry (cons t nil))) + (if entry + (progn + (setq beg (cdr entry) + end (cdr (car (cdr (memq entry idlwave-help-topics))))) + (erase-buffer) + (setq idlwave-help-current-topic topic) + (setq idlwave-help-mode-line-indicator (upcase topic)) + (insert-file-contents idlwave-help-file nil beg end) + (set-buffer-modified-p nil) + t) + nil))) + +(defvar idlwave-extra-help-function) +(defun idlwave-online-help (topic &optional name type class keyword) + "Display help on a certain topic. +Note that the topics are the section headings in the IDL documentation. +Thus the right topic may not always be easy to guess." + (interactive (list (completing-read "Topic: " idlwave-help-topics))) + (let ((last-topic idlwave-help-current-topic) + (last-ws (window-start (get-buffer-window "*IDLWAVE Help*" t)))) + ;; Push the current topic on the history stack + (if last-topic + (progn + (if (equal last-topic (car (car idlwave-help-stack-back))) + (setcdr (car idlwave-help-stack-back) (or last-ws 1)) + (setq idlwave-help-stack-back + (cons (cons last-topic (or last-ws 1)) + idlwave-help-stack-back))))) + (if (> (length idlwave-help-stack-back) 20) + (setcdr (nthcdr 17 idlwave-help-stack-back) nil)) + (setq idlwave-help-stack-forward nil) + (if topic + ;; A specific topic + (progn + (save-excursion + (set-buffer (idlwave-help-get-help-buffer)) + (let ((buffer-read-only nil)) + (idlwave-help-load-topic (downcase topic)))) + (idlwave-help-display-help-window 0)) + ;; Find the right topic and place + (if idlwave-extra-help-function + (condition-case nil + (idlwave-routine-info-help name type class keyword) + (error + (idlwave-help-get-special-help name type class keyword))) + (idlwave-routine-info-help name type class keyword))))) + +(defun idlwave-routine-info-help (routine type class &optional keyword) + "Show help about KEYWORD of ROUTINE in CLASS. TYPE is currently ignored. +When CLASS is nil, look for a normal routine. +When ROUTINE is nil, display the info about the entire class. +When KEYWORD is non-nil, position window start at the description of that +keyword, but still have the whole topic in the buffer." + (let ((cw (selected-window)) + (help-pos (idlwave-find-help class routine keyword))) + (if help-pos + (idlwave-help-display-help-window help-pos) + (idlwave-help-error routine type class keyword)) + (select-window cw))) + +(defun idlwave-help-get-special-help (name type class keyword) + "Call the function given by `idlwave-extra-help-function'." + (let* ((cw (selected-window)) + (idlwave-min-frame-width nil) + (help-pos (save-excursion + (set-buffer (idlwave-help-get-help-buffer)) + (let ((buffer-read-only nil)) + (funcall idlwave-extra-help-function + name type class keyword))))) + (if help-pos + (progn + (setq idlwave-help-current-topic (list name type class keyword)) + (idlwave-help-display-help-window help-pos 'no-links) + ;; Check if we have to widen the frame + (if (and (integerp idlwave-min-frame-width) + (framep idlwave-help-frame) + (< (frame-width idlwave-help-frame) idlwave-min-frame-width)) + (set-frame-width idlwave-help-frame idlwave-min-frame-width))) + (setq idlwave-help-current-topic nil) + (idlwave-help-error name type class keyword)) + (select-window cw))) + +(defvar idlwave-min-frame-width) +(defvar idlwave-help-def-pos) +(defvar idlwave-help-args) +(defvar idlwave-help-in-header) +(defvar idlwave-help-is-source) +(defvar idlwave-help-fontify-source-code) +(defvar idlwave-help-source-try-header) + +(defun idlwave-help-with-source (name type class keyword) + "Provide help for routines not documented in the IDL manual. +Works by loading the routine source file into the help buffer. +Depending on the value of `idlwave-help-source-try-header', it shows +the routine definition or the header description. + +This function can be used as `idlwave-extra-help-function'." + (let* ((entry (idlwave-best-rinfo-assoc + name (or type t) class (idlwave-routines))) + (case-fold-search t) + (file (cdr (nth 3 entry))) + header-pos def-pos) + (setq idlwave-help-def-pos nil) + (setq idlwave-help-args (list name type class keyword)) + (setq idlwave-help-in-header nil) + (setq idlwave-help-is-source t) + (if (stringp file) + (progn + (setq file (idlwave-expand-lib-file-name file)) + (if (and (> (buffer-size) 3) + (equal file (get-text-property 1 :idlwave-file)) + nil) ;; force reloading the file each time + ;; FIXME: store and check the modification time? + nil ; Do nothing: this is already the correct file + ;; load the file + (if (file-exists-p file) + (progn + (erase-buffer) + (insert-file-contents file nil nil nil 'replace)) + (idlwave-help-error name type class keyword)) + (if idlwave-help-fontify-source-code + (idlwave-help-fontify)))) + (idlwave-help-error name type class keyword)) + (setq idlwave-help-mode-line-indicator file) + (put-text-property 1 2 :idlwave-file file) + + ;; Try to find a good place to display + ;; First, find the definition + (setq def-pos (idlwave-help-find-routine-definition + name type class keyword)) + (setq idlwave-help-def-pos def-pos) + + (if idlwave-help-source-try-header + ;; Check if we can find the header + (save-excursion + (goto-char (or def-pos (point-max))) + (setq header-pos (idlwave-help-find-in-doc-header + name type class keyword 'exact) + idlwave-help-in-header header-pos))) + + (if (or header-pos def-pos) + (progn + (if (boundp 'idlwave-min-frame-width) + (setq idlwave-min-frame-width 80)) + (goto-char (or header-pos def-pos))) + (idlwave-help-error name type class keyword)) + + (point))) + + +;; FIXME: Should use type here. +(defun idlwave-help-find-routine-definition (name type class keyword) + "Find the definition of routine CLASS::NAME in current buffer. +TYPE and KEYWORD are ignored. +Returns hte point of match if successful, nil otherwise." + (save-excursion + (goto-char (point-max)) + (if (re-search-backward + (concat "^[ \t]*\\(pro\\|function\\)[ \t]+" + (regexp-quote (downcase (idlwave-make-full-name class name))) + "[, \t\r\n]") + nil t) + (match-beginning 0) + nil))) + +(defvar idlwave-doclib-start) +(defvar idlwave-doclib-end) + +(defun idlwave-help-find-in-doc-header (name type class keyword + &optional exact) + "Find the requested help in the doc-header above point. +First checks if there is a doc-lib header which describes the correct routine. +Then tries to find the KEYWORDS section and the KEYWORD, if given. +Returns the point which should be window start of the help window. +If EXACT is non-nil, the full help position must be found - down to the +keyword requested. This setting is for context help, if the exact +spot is needed. +If EXACT is nil, the position of the header is returned if it +describes the correct routine - even if the keyword description cannot +be found. +TYPE is ignored. + +This function expects a more or less standard routine header. In +particlar it looks for the `NAME:' tag, either with a colon, or alone +on a line. Then `NAME:' must be followed by the routine name on the +same or the next line. +When KEYWORD is non-nil, looks first for a `KEYWORDS' section. It is +amazing how inconsisten this is through some IDL libraries I have +seen. We settle for a line containing an upper case \"KEYWORD\" +string. If this line is not fould we search for the keyword anyway to +increase the hit-rate + +When one of these sections exists we check for a line starting with any of + + /KEYWORD KEYWORD- KEYWORD= KEYWORD + +with spaces allowed between the keyword and the following dash or equal sign. +If there is a match, we assume it is the keyword description." + (let* ((case-fold-search t) + ;; NAME tag plus the routine name. The new version is from JD. + (name-re (concat + "\\(^;+\\*?[ \t]*name\\([ \t]*:\\|[ \t]*$\\)[ \t]*\\(\n;+[ \t]*\\)*" + (if (stringp class) + (concat "\\(" (regexp-quote (downcase class)) + "::\\)?") + "") + (regexp-quote (downcase name)) + "\\>\\)" + "\\|" + "\\(^;+[ \t]*" + (regexp-quote (downcase name)) + ":[ \t]*$\\)")) +; (name-re (concat +; "\\(^;+\\*?[ \t]*name\\([ \t]*:\\|[ \t]*$\\)[ \t]*\\(\n;+[ \t]*\\)?" +; (if (stringp class) +; (concat "\\(" (regexp-quote (downcase class)) +; "::\\)?") +; "") +; (regexp-quote (downcase name)) +; "\\>")) + ;; Header start plus name + (header-re (concat "\\(" idlwave-doclib-start "\\).*\n" + "\\(^;+.*\n\\)*" + "\\(" name-re "\\)")) + ;; A keywords section + (kwds-re "^;+[ \t]+KEYWORD PARAMETERS:[ \t]*$") ; hard + (kwds-re2 (concat ; forgiving + "^;+\\*?[ \t]*" + "\\([-A-Z_ ]*KEYWORD[-A-Z_ ]*\\)" + "\\(:\\|[ \t]*\n\\)")) + ;; The keyword description line. + (kwd-re (if keyword ; hard (well...) + (concat + "^;+[ \t]+" + "\\(/" (regexp-quote (upcase keyword)) + "\\|" (regexp-quote (upcase keyword)) "[ \t]*[-=:\n]" + "\\)"))) + (kwd-re2 (if keyword ; forgiving + (concat + "^;+[ \t]+" + (regexp-quote (upcase keyword)) + "\\>"))) + dstart dend name-pos kwds-pos kwd-pos) + (catch 'exit + (save-excursion + (goto-char (point-min)) + (while (and (setq dstart (re-search-forward idlwave-doclib-start nil t)) + (setq dend (re-search-forward idlwave-doclib-end nil t))) + ;; found a routine header + (goto-char dstart) + (if (setq name-pos (re-search-forward name-re dend t)) + (progn + (if keyword + ;; We do need a keyword + (progn + ;; Try to find a keyword section, but don't force it. + (goto-char name-pos) + (if (let ((case-fold-search nil)) + (or (re-search-forward kwds-re dend t) + (re-search-forward kwds-re2 dend t))) + (setq kwds-pos (match-beginning 0))) + ;; Find the keyword description + (if (or (let ((case-fold-search nil)) + (re-search-forward kwd-re dend t)) + (re-search-forward kwd-re dend t) + (let ((case-fold-search nil)) + (re-search-forward kwd-re2 dend t)) + (re-search-forward kwd-re2 dend t)) + (setq kwd-pos (match-beginning 0)) + (if exact + (progn + (idlwave-help-diagnostics + (format "Could not find description of kwd %s" + (upcase keyword))) + (throw 'exit nil)))))) + ;; Return the best position we got + (throw 'exit (or kwd-pos kwds-pos name-pos dstart))) + (goto-char dend)))) + (idlwave-help-diagnostics "Could not find doclib header") + (throw 'exit nil)))) + +(defun idlwave-help-diagnostics (string &optional ding) + "Add a diagnostics string to the list. +When DING is non-nil, ring the bell as well." + (if (boundp 'idlwave-help-diagnostics) + (progn + (setq idlwave-help-diagnostics + (cons string idlwave-help-diagnostics)) + (if ding (ding))))) + +(defun idlwave-help-toggle-header-top-and-def (arg) + (interactive "P") + (if (not idlwave-help-is-source) + (error "This is not a source file")) + (let (pos) + (if idlwave-help-in-header + ;; Header was the last thing displayed + (progn + (setq idlwave-help-in-header nil) + (setq pos idlwave-help-def-pos)) + ;; Try to display header + (setq pos (idlwave-help-find-in-doc-header + (nth 0 idlwave-help-args) + (nth 1 idlwave-help-args) + (nth 2 idlwave-help-args) + nil)) + (if pos + (setq idlwave-help-in-header t) + (error "Cannot find doclib header for routine %s" + (idlwave-make-full-name (nth 2 idlwave-help-args) + (nth 0 idlwave-help-args))))) + (if pos + (progn + (goto-char pos) + (recenter 0))))) + +(defun idlwave-help-find-first-header (arg) + (interactive "P") + (let (pos) + (save-excursion + (goto-char (point-min)) + (if (re-search-forward idlwave-doclib-start nil t) + (setq pos (match-beginning 0)))) + (if pos + (progn + (goto-char pos) + (recenter 0)) + (error "No DocLib Header in current file")))) + +(defun idlwave-help-find-header (arg) + "Jump to the DocLib Header." + (interactive "P") + (if arg + (idlwave-help-find-first-header nil) + (setq idlwave-help-in-header nil) + (idlwave-help-toggle-header-match-and-def arg 'top))) + +(defun idlwave-help-toggle-header-match-and-def (arg &optional top) + (interactive "P") + (if (not idlwave-help-is-source) + (error "This is not a source file")) + (let ((args idlwave-help-args) + pos) + (if idlwave-help-in-header + ;; Header was the last thing displayed + (progn + (setq idlwave-help-in-header nil) + (setq pos idlwave-help-def-pos)) + ;; Try to display header + (setq pos (apply 'idlwave-help-find-in-doc-header + (if top + (list (car args) (nth 1 args) (nth 2 args) nil) + args))) + (if pos + (setq idlwave-help-in-header t) + (error "Cannot find doclib header for routine %s" + (idlwave-make-full-name (nth 2 idlwave-help-args) + (nth 0 idlwave-help-args))))) + (if pos + (progn + (goto-char pos) + (recenter 0))))) + +(defvar font-lock-verbose) +(defvar idlwave-mode-syntax-table) +(defvar idlwave-font-lock-defaults) +(defun idlwave-help-fontify () + "Fontify the Help buffer as source code. +Useful when source code is displayed as help. See the option +`idlwave-help-fontify-source-code'." + (interactive) + (if (not idlwave-help-is-source) + (error "Fontification only for source files...") + (if (and (featurep 'font-lock) + idlwave-help-is-source) + (let ((major-mode 'idlwave-mode) + (font-lock-verbose + (if (interactive-p) font-lock-verbose nil)) + (syntax-table (syntax-table))) + (unwind-protect + (progn + (set-syntax-table idlwave-mode-syntax-table) + (set (make-local-variable 'font-lock-defaults) + idlwave-font-lock-defaults) + (font-lock-fontify-buffer)) + (set-syntax-table syntax-table)))))) + +(defun idlwave-help-error (name type class keyword) + (error "Cannot find help on %s%s" + (idlwave-make-full-name class name) + (if keyword (format ", keyword %s" (upcase keyword)) ""))) + +(defun idlwave-help-get-help-buffer () + "Return the IDLWAVE Help buffer. Make it first if necessary." + (let ((buf (get-buffer "*IDLWAVE Help*"))) + (if buf + nil + (setq buf (get-buffer-create "*IDLWAVE Help*")) + (save-excursion + (set-buffer buf) + (idlwave-help-mode))) + buf)) + +(defun idlwave-help-make-search-list (class routine keyword) + "Return a list of all possible search compinations. +For some routines, keywords are described under a different topic or routine. +This function returns a list of entries (class routine keyword) to be +searched. It also makes everything downcase, to make sure the regexp +searches will work properly with `case-fold-search'" + (let (routines list) + (setq routine (idlwave-downcase-safe routine) + class (idlwave-downcase-safe class) + keyword (idlwave-downcase-safe keyword)) + (setq routine (or (cdr (assoc routine idlwave-help-name-translations)) + routine)) + (setq routines (append (cdr (assoc routine idlwave-help-alt-names)) + (list routine))) + (if (equal routine "obj_new") + (setq routines (cons (list (idlwave-downcase-safe + idlwave-current-obj_new-class) + "init" keyword) + routines))) + (while routines + (if (consp (car routines)) + (setq list (cons (car routines) list)) + (setq list (cons (list class (car routines) keyword) list))) + (setq routines (cdr routines))) + list)) + +(defvar idlwave-help-link-map (copy-keymap idlwave-help-mode-map) + "The keymap for activated stuff in the Help application.") + +(define-key idlwave-help-link-map (if (featurep 'xemacs) [button1] [mouse-1]) + 'idlwave-help-follow-link) +(define-key idlwave-help-link-map (if (featurep 'xemacs) [button2] [mouse-2]) + 'idlwave-help-follow-link) +(define-key idlwave-help-link-map (if (featurep 'xemacs) [button3] [mouse-3]) + 'idlwave-help-follow-link) + +(defun idlwave-help-activate-see-also () + "Highlight the items under `See Also' in indicate they may be used as links." + (save-excursion + (if (re-search-forward "^ *See Also *$" nil t) + (let ((lim (+ (point) 500)) + (case-fold-search nil) + (props (list 'face 'idlwave-help-link-face + 'idlwave-help-link t + (if (featurep 'xemacs) 'keymap 'local-map) + idlwave-help-link-map + 'mouse-face 'highlight)) + (buffer-read-only nil)) + (while (re-search-forward "\\(\\.?[A-Z][A-Z0-9_]+\\)" lim t) + (if (idlwave-is-help-topic (match-string 1)) + (add-text-properties (match-beginning 1) (match-end 1) props))))))) + +(defun idlwave-help-activate-methods () + "Highlight the items under `See Also' in indicate they may be used as links." + (save-excursion + (if (re-search-forward "^ *Methods *$" nil t) + (let ((lim (+ (point) 1000)) + (case-fold-search t) + (props (list 'face 'idlwave-help-link-face + 'idlwave-help-link t + (if (featurep 'xemacs) 'keymap 'local-map) + idlwave-help-link-map + 'mouse-face 'highlight)) + (buffer-read-only nil)) + (while (re-search-forward + "^ *\\* +\"?\\([A-Z][A-Z0-9_]+::[A-Z][A-Z0-9_]+\\)\"?\\( *on +page +[0-9]*\\)? *" lim t) + (add-text-properties (match-beginning 1) (match-end 1) props)))))) + +(defun idlwave-help-activate-class () + "Highlight the items under `See Also' in indicate they may be used as links." + (save-excursion + (goto-char (point-min)) + (if (looking-at "\\([A-Z][A-Z0-9_]+\\)::[A-Z][A-Z0-9_]+ *$") + (let ((props (list 'face 'idlwave-help-link-face + 'idlwave-help-link t + (if (featurep 'xemacs) 'keymap 'local-map) + idlwave-help-link-map + 'mouse-face 'highlight)) + (buffer-read-only nil)) + (add-text-properties (match-beginning 1) (match-end 1) props))))) + +(defun idlwave-help-activate-aggressively () + (interactive) + (let ((props (list 'face 'idlwave-help-link-face + 'idlwave-help-link t + (if (featurep 'xemacs) 'keymap 'local-map) + idlwave-help-link-map + 'mouse-face 'highlight)) + (except + '("For" "If" "Example" "Wait" "Do" "Events" "Fonts" "Device" + "Reference" "Guide" "Routines" "Return" "Print" "Reverse" + "Function" "Pro" "Where" "Plot")) + (case-fold-search nil) + (buffer-read-only nil) + b e s bc ac) + (save-excursion + (goto-char (point-min)) + (while (re-search-forward "\\.?[A-Z][a-zA-Z0-9_:]+" nil t) + (setq b (match-beginning 0) e (match-end 0) s (match-string 0) + bc (char-before b) ac (char-after e)) + (if (and (idlwave-is-help-topic s) + (not (member s except)) + (not (eq bc ?/)) (not (eq ac ?=)) + (string-match "[A-Z]" (substring s 1)) ; 2nd UPPER char + (not (equal (downcase s) idlwave-help-current-topic))) + (add-text-properties b e props))) + (goto-char (point-min)) + (while (re-search-forward "\"" nil t) + (when (looking-at "\\([^\"]+\\)\"") + (setq b (match-beginning 1) e (match-end 1) s (match-string 1)) + (when (< (length s) 100) + (while (string-match "\\s-\\s-+" s) + (setq s (replace-match " " t t s))) + (if (idlwave-is-help-topic s) + (add-text-properties b e props)))))))) + +(defvar idlwave-max-popup-menu-items) +(defun idlwave-help-popup-select (ev list) + "Selected an item in LIST with a popup menu." + (let ((maxpopup idlwave-max-popup-menu-items) + rtn menu resp) + (cond ((null list)) + ((= 1 (length list)) + (setq rtn (car list))) + ((featurep 'xemacs) + (setq list (sort list (lambda (a b) + (string< (upcase a) (upcase b))))) + (setq menu + (append (list "Select Class") + (mapcar (lambda (x) (vector x (list 'idlwave-help-pset + x))) + list))) + (setq menu (idlwave-help-split-menu-xemacs menu maxpopup)) + (setq resp (get-popup-menu-response menu)) + (funcall (event-function resp) (event-object resp))) + (t + (setq list (sort list (lambda (a b) + (string< (upcase a) (upcase b))))) + (setq menu (cons "Select Class" + (list + (append (list "") + (mapcar (lambda(x) (cons x x)) list))))) + (setq menu (idlwave-help-split-menu-emacs menu maxpopup)) + (setq rtn (x-popup-menu ev menu)))) + rtn)) + +(defun idlwave-help-split-menu-xemacs (menu N) + "Split the MENU into submenus of maximum length N." + (if (<= (length menu) (1+ N)) + ;; No splitting needed + menu + (let* ((title (car menu)) + (entries (cdr menu)) + (menu (list title)) + (cnt 0) + (nextmenu nil)) + (while entries + (while (and entries (< cnt N)) + (setq cnt (1+ cnt) + nextmenu (cons (car entries) nextmenu) + entries (cdr entries))) + (setq nextmenu (nreverse nextmenu)) + (setq nextmenu (cons (format "%s...%s" + (aref (car nextmenu) 0) + (aref (nth (1- cnt) nextmenu) 0)) + nextmenu)) + (setq menu (cons nextmenu menu) + nextmenu nil + cnt 0)) + (nreverse menu)))) + +(defun idlwave-help-split-menu-emacs (menu N) + "Split the MENU into submenus of maximum length N." + (if (<= (length (nth 1 menu)) (1+ N)) + ;; No splitting needed + menu + (let* ((title (car menu)) + (entries (cdr (nth 1 menu))) + (menu nil) + (cnt 0) + (nextmenu nil)) + (while entries + (while (and entries (< cnt N)) + (setq cnt (1+ cnt) + nextmenu (cons (car entries) nextmenu) + entries (cdr entries))) + (setq nextmenu (nreverse nextmenu)) + (prin1 nextmenu) + (setq nextmenu (cons (format "%s...%s" + (car (car nextmenu)) + (car (nth (1- cnt) nextmenu))) + nextmenu)) + (setq menu (cons nextmenu menu) + nextmenu nil + cnt 0)) + (setq menu (nreverse menu)) + (setq menu (cons title menu)) + menu))) + +(defvar rtn) +(defun idlwave-help-pset (item) + (set 'rtn item)) + +(defun idlwave-grep (regexp list) + (let (rtn) + (while list + (if (string-match regexp (car list)) + (setq rtn (cons (car list) rtn))) + (setq list (cdr list))) + (nreverse rtn))) + +(defun idlwave-is-help-topic (word) + "Try if this could be a help topic. +Also checks special translation lists." + (setq word (downcase word)) + (car + (or (assoc word idlwave-help-topics) + (assoc word idlwave-help-name-translations) + (assoc word idlwave-help-special-topic-words)))) + +(defun idlwave-help-maybe-translate (word) + "Return the real topic assiciated with WORD." + (setq word (downcase word)) + (or (car (assoc word idlwave-help-topics)) + (cdr (assoc word idlwave-help-name-translations)) + (cdr (assoc word idlwave-help-special-topic-words)))) + +(defun idlwave-grep-help-topics (list) + "Return only the classis in LIST which are also help topics." + (delq nil (mapcar 'idlwave-is-help-topic list))) + +(defun idlwave-any-help-topic (list) + "Return the first member in LIST which is also a help topic." + (catch 'exit + (while list + (if (idlwave-is-help-topic (car list)) + (throw 'exit (car list)) + (setq list (cdr list)))))) + +(setq idlwave-help-topics + '( + ("### idlw-help.txt --- help file for idlwave" . 0) + ("reference" . 539) + ("idl syntax" . 1476) + (".compile" . 13151) + (".continue" . 14546) + (".edit" . 15456) + (".full_reset_session" . 15933) + (".go" . 16861) + (".out" . 17128) + (".reset_session" . 17405) + (".return" . 19747) + (".rnew" . 20271) + (".run" . 22240) + (".skip" . 25132) + (".step" . 26334) + (".stepover" . 26878) + (".trace" . 27702) + ("a_correlate" . 28021) + ("abs" . 30635) + ("acos" . 31528) + ("adapt_hist_equal" . 32394) + ("alog" . 35609) + ("alog10" . 36338) + ("amoeba" . 36743) + ("annotate" . 43240) + ("arg_present" . 46034) + ("array_equal" . 47890) + ("arrow" . 49769) + ("ascii_template" . 51834) + ("asin" . 53421) + ("assoc" . 54001) + ("atan" . 58059) + ("axis" . 59363) + ("bar_plot" . 66135) + ("begin...end" . 71836) + ("beseli" . 74670) + ("beselj" . 76451) + ("beselk" . 78203) + ("besely" . 79986) + ("beta" . 81765) + ("bilinear" . 82615) + ("bin_date" . 85473) + ("binary_template" . 86583) + ("bindgen" . 89643) + ("binomial" . 90872) + ("blas_axpy" . 93400) + ("blk_con" . 95902) + ("box_cursor" . 97920) + ("break" . 99831) + ("breakpoint" . 100414) + ("broyden" . 104899) + ("bytarr" . 108580) + ("byte" . 109510) + ("byteorder" . 111185) + ("bytscl" . 117619) + ("c_correlate" . 120044) + ("caldat" . 123221) + ("calendar" . 126586) + ("call_external" . 127601) + ("call_function" . 159898) + ("call_method" . 161156) + ("call_procedure" . 162362) + ("case" . 163576) + ("catch" . 165841) + ("cd" . 169263) + ("cdf routines" . 173587) + ("chebyshev" . 174915) + ("check_math" . 175629) + ("chisqr_cvf" . 184014) + ("chisqr_pdf" . 185254) + ("choldc" . 187218) + ("cholsol" . 188231) + ("cindgen" . 189830) + ("cir_3pnt" . 190900) + ("close" . 192364) + ("clust_wts" . 194324) + ("cluster" . 196126) + ("color_convert" . 198920) + ("color_quan" . 200953) + ("colormap_applicable" . 207862) + ("comfit" . 209163) + ("common" . 212996) + ("compile_opt" . 213258) + ("complex" . 217712) + ("complexarr" . 221100) + ("complexround" . 222043) + ("compute_mesh_normals" . 222770) + ("cond" . 223390) + ("congrid" . 225107) + ("conj" . 229814) + ("constrained_min" . 230572) + ("continue" . 242230) + ("contour" . 243235) + ("graphics keywords accepted" . 265243) + ("examples" . 265807) + ("convert_coord" . 268043) + ("convol" . 271194) + ("coord2to3" . 278263) + ("correlate" . 279857) + ("cos" . 282137) + ("cosh" . 283026) + ("cramer" . 283850) + ("create_struct" . 285316) + ("create_view" . 287070) + ("crossp" . 291434) + ("crvlength" . 291768) + ("ct_luminance" . 293389) + ("cti_test" . 295087) + ("cursor" . 299084) + ("curvefit" . 303379) + ("cv_coord" . 309235) + ("cvttobm" . 312199) + ("cw_animate" . 314583) + ("cw_animate_getp" . 321153) + ("cw_animate_load" . 322921) + ("cw_animate_run" . 325962) + ("cw_arcball" . 327860) + ("cw_bgroup" . 333892) + ("keywords to widget_control and widget_info" . 340474) + ("widget events returned by the cw_bgroup widget" . 341511) + ("see also" . 341887) + ("cw_clr_index" . 341924) + ("cw_colorsel" . 345764) + ("cw_defroi" . 348356) + ("cw_field" . 352966) + ("cw_filesel" . 360253) + ("cw_form" . 366331) + ("cw_fslider" . 381044) + ("cw_light_editor" . 387213) + ("cw_light_editor_get" . 394348) + ("cw_light_editor_set" . 397610) + ("cw_orient" . 400553) + ("cw_palette_editor" . 403310) + ("cw_palette_editor_get" . 414553) + ("cw_palette_editor_set" . 415150) + ("cw_pdmenu" . 416116) + ("cw_rgbslider" . 428334) + ("cw_tmpl" . 433135) + ("cw_zoom" . 434297) + ("dblarr" . 442470) + ("dcindgen" . 443400) + ("dcomplex" . 444479) + ("dcomplexarr" . 447730) + ("define_key" . 448670) + ("defroi" . 464670) + ("defsysv" . 467290) + ("delete_symbol" . 469065) + ("dellog" . 469705) + ("delvar" . 470218) + ("deriv" . 470930) + ("derivsig" . 471604) + ("determ" . 472470) + ("device" . 474245) + ("dfpmin" . 480834) + ("dialog_message" . 484843) + ("dialog_pickfile" . 489330) + ("example" . 494511) + ("see also" . 494785) + ("dialog_printersetup" . 494806) + ("dialog_read_image" . 498062) + ("dialog_write_image" . 501416) + ("digital_filter" . 504234) + ("dilate" . 505914) + ("dindgen" . 515299) + ("dissolve" . 516319) + ("dist" . 517468) + ("dlm_load" . 518253) + ("dlm_register" . 518898) + ("do_apple_script" . 519958) + ("doc_library" . 521718) + ("double" . 525028) + ("draw_roi" . 526853) + ("efont" . 529379) + ("eigenql" . 531066) + ("eigenvec" . 534404) + ("elmhes" . 537476) + ("empty" . 538968) + ("enable_sysrtn" . 539564) + ("eof" . 542412) + ("eos_* routines" . 544036) + ("erase" . 544144) + ("erode" . 545428) + ("errorf" . 552879) + ("errplot" . 553730) + ("execute" . 555232) + ("exit" . 556704) + ("exp" . 557588) + ("expand" . 558537) + ("expand_path" . 559578) + ("expint" . 565896) + ("extrac" . 567726) + ("extract_slice" . 571222) + ("f_cvf" . 577220) + ("f_pdf" . 578652) + ("factorial" . 580496) + ("fft" . 582069) + ("file_chmod" . 589542) + ("file_delete" . 596495) + ("file_expand_path" . 598719) + ("file_mkdir" . 600247) + ("file_test" . 601350) + ("filepath" . 609294) + ("findfile" . 611760) + ("findgen" . 614640) + ("finite" . 615721) + ("fix" . 618881) + ("flick" . 622088) + ("float" . 622647) + ("floor" . 624341) + ("see also" . 625451) + ("flow3" . 625489) + ("fltarr" . 627319) + ("flush" . 628261) + ("for" . 628761) + ("format_axis_values" . 629536) + ("forward_function" . 630472) + ("free_lun" . 630902) + ("fstat" . 632515) + ("fulstr" . 638089) + ("funct" . 639514) + ("function" . 640675) + ("fv_test" . 640957) + ("fx_root" . 643632) + ("fz_roots" . 646470) + ("gamma" . 648790) + ("gamma_ct" . 649666) + ("gauss_cvf" . 650962) + ("gauss_pdf" . 651990) + ("gauss2dfit" . 653634) + ("gaussfit" . 658177) + ("gaussint" . 662099) + ("get_drive_list" . 663150) + ("get_kbrd" . 664616) + ("get_lun" . 666431) + ("get_screen_size" . 667817) + ("get_symbol" . 669100) + ("getenv" . 669803) + ("goto" . 675538) + ("grid_tps" . 677060) + ("grid3" . 681991) + ("gs_iter" . 686735) + ("h_eq_ct" . 690230) + ("h_eq_int" . 691213) + ("hanning" . 692750) + ("hdf_* routines" . 694141) + ("hdf_browser" . 694346) + ("hdf_read" . 699634) + ("heap_gc" . 705089) + ("help" . 707124) + ("hilbert" . 720419) + ("hist_2d" . 722017) + ("hist_equal" . 724002) + ("histogram" . 727689) + ("hls" . 736981) + ("hqr" . 751232) + ("hsv" . 753176) + ("ibeta" . 754500) + ("identity" . 757310) + ("idl_container object class" . 758480) + ("idlanroi object class" . 758569) + ("idlanroigroup object class" . 758653) + ("idlffdicom object class" . 758741) + ("idlffdxf object class" . 758826) + ("idlfflanguagecat object class" . 758909) + ("idlffshape object class" . 759000) + ("idlgr* object classes" . 759085) + ("if...then...else" . 759802) + ("igamma" . 760885) + ("image_cont" . 764051) + ("image_statistics" . 765217) + ("imaginary" . 769760) + ("indgen" . 770942) + ("int_2d" . 773086) + ("int_3d" . 777479) + ("int_tabulated" . 781441) + ("intarr" . 783829) + ("interpol" . 784580) + ("interpolate" . 787302) + ("invert" . 794048) + ("ioctl" . 795877) + ("ishft" . 800968) + ("isocontour" . 801733) + ("isosurface" . 808148) + ("journal" . 811126) + ("julday" . 812520) + ("keyword_set" . 816170) + ("krig2d" . 817214) + ("kurtosis" . 824187) + ("kw_test" . 825466) + ("l64indgen" . 829630) + ("label_date" . 830639) + ("label_region" . 836110) + ("ladfit" . 839140) + ("laguerre" . 841287) + ("leefilt" . 844013) + ("legendre" . 845719) + ("linbcg" . 849843) + ("lindgen" . 853043) + ("linfit" . 854060) + ("linkimage" . 857803) + ("syntax" . 860192) + ("arguments" . 860361) + ("live_contour" . 872683) + ("live_control" . 886512) + ("live_destroy" . 889737) + ("live_export" . 892115) + ("live_image" . 896410) + ("live_info" . 906943) + ("live_line" . 923909) + ("live_load" . 929605) + ("live_oplot" . 930025) + ("live_plot" . 937828) + ("live_print" . 951321) + ("live_rect" . 952783) + ("live_style" . 957611) + ("live_surface" . 968053) + ("ljlct" . 987683) + ("ll_arc_distance" . 988762) + ("lmfit" . 990480) + ("lmgr" . 998235) + ("lngamma" . 1002618) + ("lnp_test" . 1003252) + ("loadct" . 1007006) + ("locale_get" . 1008907) + ("lon64arr" . 1009110) + ("lonarr" . 1009875) + ("long" . 1010766) + ("long64" . 1012333) + ("lsode" . 1013888) + ("lu_complex" . 1021415) + ("ludc" . 1023934) + ("lumprove" . 1025270) + ("lusol" . 1027568) + ("m_correlate" . 1029584) + ("machar" . 1032694) + ("make_array" . 1035844) + ("make_dll" . 1039398) + ("map_2points" . 1050855) + ("map_continents" . 1055987) + ("map_grid" . 1062274) + ("map_image" . 1071631) + ("map_patch" . 1077816) + ("map_proj_info" . 1083755) + ("map_set" . 1086754) + ("matrix_multiply" . 1105252) + ("max" . 1107939) + ("md_test" . 1111034) + ("mean" . 1113420) + ("meanabsdev" . 1114543) + ("median" . 1116152) + ("memory" . 1118932) + ("mesh_clip" . 1123109) + ("mesh_decimate" . 1124905) + ("mesh_issolid" . 1128828) + ("mesh_merge" . 1130007) + ("mesh_numtriangles" . 1131498) + ("mesh_obj" . 1132019) + ("mesh_smooth" . 1144726) + ("mesh_surfacearea" . 1146419) + ("mesh_validate" . 1148134) + ("mesh_volume" . 1149925) + ("message" . 1150808) + ("min" . 1154160) + ("min_curve_surf" . 1156644) + ("mk_html_help" . 1164695) + ("modifyct" . 1169596) + ("moment" . 1171124) + ("morph_close" . 1174930) + ("morph_distance" . 1178982) + ("morph_gradient" . 1183244) + ("morph_hitormiss" . 1186369) + ("morph_open" . 1189972) + ("morph_thin" . 1194184) + ("morph_tophat" . 1195884) + ("mpeg_close" . 1198617) + ("mpeg_open" . 1199478) + ("mpeg_put" . 1205330) + ("mpeg_save" . 1207271) + ("msg_cat_close" . 1208502) + ("msg_cat_compile" . 1208810) + ("msg_cat_open" . 1210560) + ("multi" . 1212268) + ("n_elements" . 1213039) + ("n_params" . 1214401) + ("n_tags" . 1215128) + ("ncdf_* routines" . 1216822) + ("newton" . 1216930) + ("norm" . 1220602) + ("obj_class" . 1223196) + ("obj_destroy" . 1224824) + ("obj_isa" . 1226343) + ("obj_new" . 1227154) + ("obj_valid" . 1231207) + ("objarr" . 1234562) + ("on_error" . 1235753) + ("on_ioerror" . 1236746) + ("online_help" . 1238136) + ("open" . 1242442) + ("oplot" . 1265115) + ("oploterr" . 1268777) + ("p_correlate" . 1269727) + ("particle_trace" . 1271476) + ("pcomp" . 1275345) + ("plot" . 1281098) + ("plot_3dbox" . 1287958) + ("plot_field" . 1292191) + ("ploterr" . 1293670) + ("plots" . 1294675) + ("pnt_line" . 1298221) + ("point_lun" . 1299827) + ("polar_contour" . 1303040) + ("polar_surface" . 1305820) + ("poly" . 1308526) + ("poly_2d" . 1309107) + ("poly_area" . 1315252) + ("poly_fit" . 1316715) + ("polyfill" . 1322078) + ("polyfillv" . 1329135) + ("polyshade" . 1332078) + ("polywarp" . 1338568) + ("popd" . 1341804) + ("powell" . 1342505) + ("primes" . 1346107) + ("print/printf" . 1346857) + ("printd" . 1350561) + ("pro" . 1351083) + ("profile" . 1351908) + ("profiler" . 1353971) + ("profiles" . 1356801) + ("project_vol" . 1358942) + ("ps_show_fonts" . 1363308) + ("psafm" . 1364164) + ("pseudo" . 1365014) + ("ptr_free" . 1366492) + ("ptr_new" . 1367695) + ("ptr_valid" . 1369385) + ("ptrarr" . 1372574) + ("pushd" . 1374196) + ("qromb" . 1375035) + ("qromo" . 1377635) + ("qsimp" . 1381290) + ("query_* routines" . 1384103) + ("query_bmp" . 1387048) + ("query_dicom" . 1387923) + ("query_image" . 1389595) + ("query_jpeg" . 1393658) + ("query_pict" . 1394505) + ("query_png" . 1395357) + ("query_ppm" . 1397153) + ("query_srf" . 1398215) + ("query_tiff" . 1399059) + ("query_wav" . 1401221) + ("r_correlate" . 1402349) + ("r_test" . 1405781) + ("radon" . 1408097) + ("randomn" . 1423183) + ("randomu" . 1431232) + ("ranks" . 1438871) + ("rdpix" . 1440851) + ("read/readf" . 1441907) + ("read_ascii" . 1446842) + ("read_binary" . 1451566) + ("read_bmp" . 1454707) + ("read_dicom" . 1457750) + ("read_image" . 1459055) + ("read_interfile" . 1460420) + ("read_jpeg" . 1461759) + ("read_pict" . 1468134) + ("read_png" . 1469562) + ("read_ppm" . 1473071) + ("read_spr" . 1474867) + ("read_srf" . 1475879) + ("read_sylk" . 1477377) + ("read_tiff" . 1482497) + ("read_wav" . 1495578) + ("read_wave" . 1496407) + ("read_x11_bitmap" . 1498639) + ("read_xwd" . 1500317) + ("reads" . 1501691) + ("readu" . 1504088) + ("rebin" . 1507551) + ("recall_commands" . 1511517) + ("recon3" . 1512141) + ("reduce_colors" . 1522784) + ("reform" . 1524189) + ("regress" . 1526447) + ("repeat...until" . 1532830) + ("replicate" . 1533747) + ("replicate_inplace" . 1535015) + ("resolve_all" . 1537221) + ("resolve_routine" . 1539481) + ("restore" . 1541229) + ("retall" . 1544696) + ("return" . 1544989) + ("reverse" . 1547544) + ("rewind" . 1549360) + ("rk4" . 1549893) + ("roberts" . 1552163) + ("rot" . 1553757) + ("rotate" . 1557733) + ("round" . 1561187) + ("routine_info" . 1562480) + ("rs_test" . 1567144) + ("s_test" . 1570562) + ("save" . 1572502) + ("savgol" . 1576238) + ("scale3" . 1581599) + ("scale3d" . 1583203) + ("search2d" . 1583966) + ("search3d" . 1588960) + ("set_plot" . 1594341) + ("set_shading" . 1597397) + ("set_symbol" . 1600228) + ("setenv" . 1600959) + ("setlog" . 1601936) + ("setup_keys" . 1603640) + ("sfit" . 1607596) + ("shade_surf" . 1609555) + ("shade_surf_irr" . 1618863) + ("shade_volume" . 1621614) + ("shift" . 1627244) + ("show3" . 1629295) + ("showfont" . 1632001) + ("sin" . 1633654) + ("sindgen" . 1634782) + ("sinh" . 1635827) + ("size" . 1636929) + ("skewness" . 1643430) + ("skipf" . 1644680) + ("slicer3" . 1646193) + ("slide_image" . 1670427) + ("smooth" . 1677045) + ("sobel" . 1682373) + ("socket" . 1684206) + ("sort" . 1691492) + ("spawn" . 1693572) + ("sph_4pnt" . 1708332) + ("sph_scat" . 1709830) + ("spher_harm" . 1713264) + ("spl_init" . 1717507) + ("spl_interp" . 1720122) + ("spline" . 1722390) + ("spline_p" . 1723643) + ("sprsab" . 1726475) + ("sprsax" . 1729282) + ("sprsin" . 1730553) + ("sprstp" . 1734235) + ("sqrt" . 1735028) + ("standardize" . 1736038) + ("stddev" . 1738715) + ("stop" . 1739750) + ("strarr" . 1740545) + ("strcmp" . 1741217) + ("strcompress" . 1742965) + ("streamline" . 1743963) + ("stregex" . 1746201) + ("stretch" . 1752291) + ("string" . 1754329) + ("strjoin" . 1759071) + ("strlen" . 1760131) + ("strlowcase" . 1760963) + ("strmatch" . 1761806) + ("strmessage" . 1765092) + ("strmid" . 1766490) + ("strpos" . 1769186) + ("strput" . 1772360) + ("strsplit" . 1774066) + ("strtrim" . 1780209) + ("struct_assign" . 1781645) + ("struct_hide" . 1785296) + ("strupcase" . 1787991) + ("surface" . 1788784) + ("surfr" . 1798798) + ("svdc" . 1799522) + ("svdfit" . 1802698) + ("svsol" . 1809912) + ("swap_endian" . 1812366) + ("switch" . 1813284) + ("systime" . 1815708) + ("t_cvf" . 1819880) + ("t_pdf" . 1821113) + ("t3d" . 1822728) + ("tag_names" . 1826610) + ("tan" . 1828054) + ("tanh" . 1828792) + ("taprd" . 1829888) + ("tapwrt" . 1831485) + ("tek_color" . 1832817) + ("temporary" . 1833609) + ("tetra_clip" . 1834681) + ("tetra_surface" . 1836566) + ("tetra_volume" . 1837231) + ("thin" . 1838875) + ("threed" . 1841198) + ("time_test2" . 1842212) + ("timegen" . 1843093) + ("tm_test" . 1852126) + ("total" . 1855266) + ("trace" . 1858663) + ("trackball object" . 1859519) + ("transpose" . 1859597) + ("tri_surf" . 1861451) + ("triangulate" . 1867138) + ("trigrid" . 1873332) + ("triql" . 1886194) + ("trired" . 1888806) + ("trisol" . 1889914) + ("trnlog" . 1892304) + ("ts_coef" . 1895740) + ("ts_diff" . 1897273) + ("ts_fcast" . 1898696) + ("ts_smooth" . 1901134) + ("tv" . 1904249) + ("tvcrs" . 1911137) + ("tvlct" . 1913415) + ("tvrd" . 1917417) + ("tvscl" . 1923810) + ("uindgen" . 1926876) + ("uint" . 1927890) + ("uintarr" . 1929577) + ("ul64indgen" . 1930482) + ("ulindgen" . 1931515) + ("ulon64arr" . 1932531) + ("ulonarr" . 1933463) + ("ulong" . 1934397) + ("ulong64" . 1935996) + ("uniq" . 1937726) + ("usersym" . 1939644) + ("value_locate" . 1941536) + ("variance" . 1943922) + ("vax_float" . 1945216) + ("vector_field" . 1947687) + ("vel" . 1949494) + ("velovect" . 1951100) + ("vert_t3d" . 1953823) + ("voigt" . 1956595) + ("voronoi" . 1958855) + ("voxel_proj" . 1961304) + ("wait" . 1971041) + ("warp_tri" . 1971656) + ("watershed" . 1973921) + ("wdelete" . 1977624) + ("weof" . 1978496) + ("wf_draw" . 1979122) + ("where" . 1983517) + ("while...do" . 1989020) + ("widget_base" . 1989752) + ("widget_button" . 2037186) + ("widget_control" . 2056882) + ("widget_draw" . 2117983) + ("widget_droplist" . 2143969) + ("widget_event" . 2158751) + ("widget_info" . 2165038) + ("widget_label" . 2186521) + ("widget_list" . 2198925) + ("widget_slider" . 2214980) + ("widget_table" . 2231579) + ("widget_text" . 2262181) + ("window" . 2281635) + ("write_bmp" . 2287417) + ("write_image" . 2290729) + ("write_jpeg" . 2292100) + ("write_nrif" . 2297705) + ("write_pict" . 2299868) + ("write_png" . 2301220) + ("write_ppm" . 2304585) + ("write_spr" . 2305834) + ("write_srf" . 2306627) + ("write_sylk" . 2308689) + ("write_tiff" . 2310633) + ("write_wav" . 2322235) + ("write_wave" . 2323025) + ("writeu" . 2324623) + ("wset" . 2327042) + ("wshow" . 2328751) + ("wtn" . 2329900) + ("xbm_edit" . 2336392) + ("xdisplayfile" . 2339109) + ("xdxf" . 2342873) + ("xfont" . 2346783) + ("xinteranimate" . 2347872) + ("xloadct" . 2360122) + ("xmanager" . 2363823) + ("xmng_tmpl" . 2381473) + ("xmtool" . 2383196) + ("xobjview" . 2384540) + ("xpalette" . 2398767) + ("xpcolor" . 2405599) + ("xplot3d" . 2407026) + ("xregistered" . 2416315) + ("xroi" . 2417903) + ("xsq_test" . 2435729) + ("xsurface" . 2439394) + ("xvaredit" . 2441301) + ("xvolume" . 2442767) + ("xvolume_rotate" . 2452633) + ("xvolume_write_image" . 2455476) + ("xyouts" . 2456629) + ("zoom" . 2462694) + ("zoom_24" . 2465276) + ("idl_container" . 2473579) + ("idl_container::add" . 2474368) + ("idl_container::cleanup" . 2475117) + ("idl_container::count" . 2475832) + ("idl_container::get" . 2476084) + ("idl_container::init" . 2477564) + ("idl_container::iscontained" . 2478300) + ("idl_container::move" . 2478960) + ("idl_container::remove" . 2480051) + ("idlanroi" . 2480878) + ("idlanroi::appenddata" . 2482033) + ("idlanroi::cleanup" . 2484901) + ("idlanroi::computegeometry" . 2485632) + ("idlanroi::computemask" . 2488343) + ("idlanroi::containspoints" . 2492185) + ("idlanroi::getproperty" . 2493876) + ("idlanroi::init" . 2495800) + ("idlanroi::removedata" . 2500371) + ("idlanroi::replacedata" . 2502248) + ("idlanroi::rotate" . 2506896) + ("idlanroi::scale" . 2507615) + ("idlanroi::setproperty" . 2508420) + ("idlanroi::translate" . 2508769) + ("idlanroigroup" . 2509614) + ("idlanroigroup::add" . 2510564) + ("idlanroigroup::cleanup" . 2511145) + ("idlanroigroup::computemask" . 2511889) + ("idlanroigroup::computemesh" . 2515601) + ("idlanroigroup::containspoints" . 2518753) + ("idlanroigroup::getproperty" . 2521247) + ("idlanroigroup::init" . 2522971) + ("idlanroigroup::rotate" . 2523700) + ("idlanroigroup::scale" . 2524465) + ("idlanroigroup::translate" . 2525285) + ("idlffdicom" . 2526159) + ("idlffdicom::cleanup" . 2535570) + ("idlffdicom::dumpelements" . 2536674) + ("idlffdicom::getchildren" . 2537837) + ("idlffdicom::getdescription" . 2539569) + ("idlffdicom::getelement" . 2541514) + ("idlffdicom::getgroup" . 2543468) + ("idlffdicom::getlength" . 2545373) + ("idlffdicom::getparent" . 2547149) + ("idlffdicom::getpreamble" . 2548660) + ("idlffdicom::getreference" . 2549425) + ("idlffdicom::getvalue" . 2552040) + ("idlffdicom::getvr" . 2555933) + ("idlffdicom::init" . 2557719) + ("idlffdicom::read" . 2559008) + ("idlffdicom::reset" . 2559975) + ("idlffdxf" . 2560544) + ("idlffdxf::cleanup" . 2563525) + ("idlffdxf::getcontents" . 2564229) + ("idlffdxf::getentity" . 2567642) + ("idlffdxf::getpalette" . 2581797) + ("idlffdxf::init" . 2582258) + ("idlffdxf::putentity" . 2583140) + ("idlffdxf::read" . 2584062) + ("idlffdxf::removeentity" . 2584865) + ("idlffdxf::reset" . 2585549) + ("idlffdxf::setpalette" . 2585740) + ("idlffdxf::write" . 2586218) + ("idlfflanguagecat" . 2587739) + ("idlfflanguagecat::isvalid" . 2588456) + ("idlfflanguagecat::query" . 2588719) + ("idlfflanguagecat::setcatalog" . 2589473) + ("idlffshape" . 2590454) + ("idlffshape::addattribute" . 2607158) + ("idlffshape::cleanup" . 2609732) + ("idlffshape::close" . 2610879) + ("idlffshape::destroyentity" . 2611530) + ("idlffshape::getattributes" . 2612797) + ("idlffshape::getentity" . 2614554) + ("idlffshape::getproperty" . 2617165) + ("idlffshape::init" . 2621861) + ("idlffshape::open" . 2623701) + ("idlffshape::putentity" . 2624923) + ("idlffshape::setattributes" . 2626928) + ("idlgraxis" . 2630338) + ("idlgraxis::cleanup" . 2631054) + ("idlgraxis::getctm" . 2631770) + ("idlgraxis::getproperty" . 2633875) + ("idlgraxis::init" . 2636320) + ("idlgraxis::setproperty" . 2659052) + ("idlgrbuffer" . 2659404) + ("idlgrbuffer::cleanup" . 2660648) + ("idlgrbuffer::draw" . 2661388) + ("idlgrbuffer::erase" . 2662776) + ("idlgrbuffer::getcontiguouspixels" . 2663174) + ("idlgrbuffer::getdeviceinfo" . 2664347) + ("idlgrbuffer::getfontnames" . 2666797) + ("idlgrbuffer::getproperty" . 2668759) + ("idlgrbuffer::gettextdimensions" . 2670406) + ("idlgrbuffer::init" . 2672532) + ("idlgrbuffer::pickdata" . 2676554) + ("idlgrbuffer::read" . 2680010) + ("idlgrbuffer::select" . 2680304) + ("idlgrbuffer::setproperty" . 2682729) + ("idlgrclipboard" . 2683099) + ("idlgrclipboard::cleanup" . 2684212) + ("idlgrclipboard::draw" . 2684930) + ("idlgrclipboard::getcontiguouspixels" . 2687166) + ("idlgrclipboard::getdeviceinfo" . 2688352) + ("idlgrclipboard::getfontnames" . 2690730) + ("idlgrclipboard::getproperty" . 2692608) + ("idlgrclipboard::gettextdimensions" . 2693581) + ("idlgrclipboard::init" . 2695650) + ("idlgrclipboard::setproperty" . 2699875) + ("idlgrcolorbar" . 2700270) + ("idlgrcolorbar::cleanup" . 2701385) + ("idlgrcolorbar::computedimensions" . 2702100) + ("idlgrcolorbar::getproperty" . 2703750) + ("idlgrcolorbar::init" . 2705692) + ("idlgrcolorbar::setproperty" . 2716865) + ("idlgrcontour" . 2717247) + ("idlgrcontour::cleanup" . 2718268) + ("idlgrcontour::getctm" . 2718981) + ("idlgrcontour::getproperty" . 2721098) + ("idlgrcontour::init" . 2724664) + ("idlgrcontour::setproperty" . 2744918) + ("idlgrfont" . 2746856) + ("idlgrfont::cleanup" . 2747346) + ("idlgrfont::getproperty" . 2748062) + ("idlgrfont::init" . 2748973) + ("idlgrfont::setproperty" . 2752561) + ("idlgrimage" . 2752923) + ("idlgrimage::cleanup" . 2755202) + ("idlgrimage::getctm" . 2755909) + ("idlgrimage::getproperty" . 2758086) + ("idlgrimage::init" . 2760078) + ("idlgrimage::setproperty" . 2773698) + ("idlgrlegend" . 2774058) + ("idlgrlegend::cleanup" . 2775791) + ("idlgrlegend::computedimensions" . 2776513) + ("idlgrlegend::getproperty" . 2778146) + ("idlgrlegend::init" . 2780039) + ("idlgrlegend::setproperty" . 2790163) + ("idlgrlight" . 2790883) + ("idlgrlight::cleanup" . 2791794) + ("idlgrlight::getctm" . 2792522) + ("idlgrlight::getproperty" . 2794659) + ("idlgrlight::init" . 2795757) + ("idlgrlight::setproperty" . 2803418) + ("idlgrmodel" . 2803787) + ("idlgrmodel::add" . 2804968) + ("idlgrmodel::cleanup" . 2805969) + ("idlgrmodel::draw" . 2806697) + ("idlgrmodel::getbyname" . 2807667) + ("idlgrmodel::getctm" . 2809180) + ("idlgrmodel::getproperty" . 2811317) + ("idlgrmodel::init" . 2812225) + ("idlgrmodel::reset" . 2815821) + ("idlgrmodel::rotate" . 2816240) + ("idlgrmodel::scale" . 2817048) + ("idlgrmodel::setproperty" . 2817739) + ("idlgrmodel::translate" . 2818097) + ("idlgrmpeg" . 2818850) + ("idlgrmpeg::cleanup" . 2819654) + ("idlgrmpeg::getproperty" . 2820370) + ("idlgrmpeg::init" . 2821014) + ("idlgrmpeg::put" . 2830103) + ("idlgrmpeg::save" . 2831145) + ("idlgrmpeg::setproperty" . 2832038) + ("idlgrpalette" . 2832403) + ("idlgrpalette::cleanup" . 2833064) + ("idlgrpalette::getrgb" . 2833777) + ("idlgrpalette::getproperty" . 2834437) + ("idlgrpalette::init" . 2835541) + ("idlgrpalette::loadct" . 2839554) + ("idlgrpalette::nearestcolor" . 2840158) + ("idlgrpalette::setrgb" . 2840912) + ("idlgrpalette::setproperty" . 2841528) + ("idlgrpattern" . 2841917) + ("idlgrpattern::cleanup" . 2842554) + ("idlgrpattern::getproperty" . 2843306) + ("idlgrpattern::init" . 2844236) + ("idlgrplot" . 2848505) + ("idlgrplot::cleanup" . 2849205) + ("idlgrplot::getctm" . 2849915) + ("idlgrplot::getproperty" . 2852041) + ("idlgrplot::init" . 2853842) + ("idlgrplot::setproperty" . 2866899) + ("idlgrpolygon" . 2867253) + ("idlgrpolygon::cleanup" . 2868257) + ("idlgrpolygon::getctm" . 2868970) + ("idlgrpolygon::getproperty" . 2871142) + ("idlgrpolygon::init" . 2873313) + ("idlgrpolygon::setproperty" . 2893530) + ("idlgrpolyline" . 2893903) + ("idlgrpolyline::cleanup" . 2894665) + ("idlgrpolyline::getctm" . 2895381) + ("idlgrpolyline::getproperty" . 2897534) + ("idlgrpolyline::init" . 2899675) + ("idlgrpolyline::setproperty" . 2911673) + ("idlgrprinter" . 2912054) + ("idlgrprinter::cleanup" . 2913073) + ("idlgrprinter::draw" . 2914014) + ("idlgrprinter::getcontiguouspixels" . 2915368) + ("idlgrprinter::getfontnames" . 2916599) + ("idlgrprinter::getproperty" . 2918477) + ("idlgrprinter::gettextdimensions" . 2920257) + ("idlgrprinter::init" . 2922402) + ("idlgrprinter::newdocument" . 2928014) + ("idlgrprinter::newpage" . 2928357) + ("idlgrprinter::setproperty" . 2928591) + ("idlgrroi" . 2928961) + ("idlgrroi::cleanup" . 2929780) + ("idlgrroi::getproperty" . 2930512) + ("idlgrroi::init" . 2932523) + ("idlgrroi::pickvertex" . 2940290) + ("idlgrroi::setproperty" . 2941824) + ("idlgrroigroup" . 2942320) + ("idlgrroigroup::add" . 2943161) + ("idlgrroigroup::cleanup" . 2943740) + ("idlgrroigroup::getproperty" . 2944507) + ("idlgrroigroup::init" . 2946544) + ("idlgrroigroup::pickregion" . 2949413) + ("idlgrroigroup::setproperty" . 2950988) + ("idlgrscene" . 2951384) + ("idlgrscene::add" . 2952181) + ("idlgrscene::cleanup" . 2952759) + ("idlgrscene::getbyname" . 2953487) + ("idlgrscene::getproperty" . 2954964) + ("idlgrscene::init" . 2955882) + ("idlgrscene::setproperty" . 2958251) + ("idlgrsurface" . 2958610) + ("idlgrsurface::cleanup" . 2959325) + ("idlgrsurface::getctm" . 2960038) + ("idlgrsurface::getproperty" . 2962184) + ("idlgrsurface::init" . 2964448) + ("idlgrsurface::setproperty" . 2984949) + ("idlgrsymbol" . 2985322) + ("idlgrsymbol::cleanup" . 2985879) + ("idlgrsymbol::getproperty" . 2986601) + ("idlgrsymbol::init" . 2987525) + ("idlgrsymbol::setproperty" . 2991450) + ("idlgrtessellator" . 2991814) + ("idlgrtessellator::addpolygon" . 2993472) + ("idlgrtessellator::cleanup" . 2995172) + ("idlgrtessellator::init" . 2995896) + ("idlgrtessellator::reset" . 2996627) + ("idlgrtessellator::tessellate" . 2996968) + ("idlgrtext" . 2998369) + ("idlgrtext::cleanup" . 2999649) + ("idlgrtext::getctm" . 3000365) + ("idlgrtext::getproperty" . 3002491) + ("idlgrtext::init" . 3004917) + ("idlgrtext::setproperty" . 3016133) + ("idlgrview" . 3016485) + ("idlgrview::add" . 3017289) + ("idlgrview::cleanup" . 3017691) + ("idlgrview::getbyname" . 3018407) + ("idlgrview::getproperty" . 3019828) + ("idlgrview::init" . 3020949) + ("idlgrview::setproperty" . 3029273) + ("idlgrviewgroup" . 3029627) + ("idlgrviewgroup::add" . 3030760) + ("idlgrviewgroup::cleanup" . 3031510) + ("idlgrviewgroup::getbyname" . 3032234) + ("idlgrviewgroup::getproperty" . 3033667) + ("idlgrviewgroup::init" . 3034523) + ("idlgrviewgroup::setproperty" . 3036176) + ("idlgrvolume" . 3036567) + ("idlgrvolume::cleanup" . 3037447) + ("idlgrvolume::computebounds" . 3038185) + ("idlgrvolume::getctm" . 3039386) + ("idlgrvolume::getproperty" . 3041607) + ("idlgrvolume::init" . 3043958) + ("idlgrvolume::pickvoxel" . 3060232) + ("idlgrvolume::setproperty" . 3061794) + ("idlgrvrml" . 3062158) + ("idlgrvrml::cleanup" . 3065409) + ("idlgrvrml::draw" . 3066113) + ("idlgrvrml::getdeviceinfo" . 3066482) + ("idlgrvrml::getfontnames" . 3068859) + ("idlgrvrml::getproperty" . 3070728) + ("idlgrvrml::gettextdimensions" . 3071766) + ("idlgrvrml::init" . 3073804) + ("idlgrvrml::setproperty" . 3078331) + ("idlgrwindow" . 3078695) + ("idlgrwindow::cleanup" . 3080115) + ("idlgrwindow::draw" . 3080837) + ("idlgrwindow::erase" . 3082220) + ("idlgrwindow::getcontiguouspixels" . 3082656) + ("idlgrwindow::getdeviceinfo" . 3083829) + ("idlgrwindow::getfontnames" . 3086201) + ("idlgrwindow::getproperty" . 3088078) + ("idlgrwindow::gettextdimensions" . 3090472) + ("idlgrwindow::iconify" . 3092494) + ("idlgrwindow::init" . 3093372) + ("idlgrwindow::pickdata" . 3102311) + ("idlgrwindow::read" . 3105149) + ("idlgrwindow::select" . 3105429) + ("idlgrwindow::setcurrentcursor" . 3107801) + ("idlgrwindow::setproperty" . 3109967) + ("idlgrwindow::show" . 3110331) + ("trackball" . 3110646) + ("trackball::init" . 3111406) + ("trackball::reset" . 3113100) + ("trackball::update" . 3114572) + ("supported devices" . 3119039) + ("keywords accepted by the idl devices" . 3121015) + ("window systems" . 3205928) + ("printing graphics output files" . 3213514) + ("the cgm device" . 3220728) + ("the hp-gl device" . 3224165) + ("the lj device" . 3227974) + ("the macintosh display device" . 3235007) + ("the metafile display device" . 3235714) + ("the null display device" . 3237558) + ("the pcl device" . 3237825) + ("the printer device" . 3241355) + ("the postscript device" . 3242565) + ("the regis terminal device" . 3261928) + ("the tektronix device" . 3263935) + ("the microsoft windows device" . 3269040) + ("the x windows device" . 3269786) + ("the z-buffer device" . 3288369) + ("graphics keywords" . 3295987) + ("system variables" . 3328787) + ("idl operators" . 3386933) + ("reserved words" . 3405930) + ("fonts" . 3407247) + ("overview" . 3407909) + ("fonts in idl direct vs. object graphics" . 3409610) + ("about vector fonts" . 3411328) + ("about truetype fonts" . 3416492) + ("about device fonts" . 3427493) + ("choosing a font type" . 3441764) + ("embedded formatting commands" . 3446157) + ("formatting command examples" . 3452624) + ("truetype font samples" . 3457408) + ("vector font samples" . 3458339) + ("formats overview" . 3477526) + ("supports cdf v2.6r7. note that cdf v2.6 files" . 3481568) + ("variables and attributes" . 3481958) + ("cdf file options" . 3486138) + ("creating cdf files" . 3487723) + ("alphabetical listing of cdf routines" . 3491495) + ("cdf_attcreate" . 3491618) + ("cdf_attdelete" . 3492646) + ("cdf_attexists" . 3495320) + ("cdf_attget" . 3497882) + ("cdf_attinq" . 3500615) + ("cdf_attnum" . 3501882) + ("cdf_attput" . 3502372) + ("cdf_attrename" . 3507081) + ("cdf_close" . 3507661) + ("cdf_compression" . 3508359) + ("cdf_control" . 3514865) + ("cdf_create" . 3527602) + ("cdf_delete" . 3536192) + ("cdf_doc" . 3536717) + ("cdf_encode_epoch" . 3537916) + ("cdf_epoch" . 3540465) + ("cdf_error" . 3543405) + ("cdf_exists" . 3543670) + ("cdf_inquire" . 3544238) + ("cdf_lib_info" . 3547567) + ("cdf_open" . 3549359) + ("cdf_parse_epoch" . 3550016) + ("cdf_varcreate" . 3551494) + ("cdf_vardelete" . 3557671) + ("cdf_varget" . 3560524) + ("cdf_varget1" . 3564943) + ("cdf_varinq" . 3566456) + ("cdf_varnum" . 3568615) + ("cdf_varput" . 3569353) + ("cdf_varrename" . 3571835) + ("supports hdf 4.1r3. the following" . 3572778) + ("hdf interfaces" . 3573089) + ("creating hdf files" . 3576399) + ("hdf scientific dataset id numbers" . 3578880) + ("alphabetical listing of hdf routines" . 3584538) + ("hdf_an_annlen" . 3585062) + ("hdf_an_annlist" . 3585477) + ("hdf_an_atype2tag" . 3586450) + ("hdf_an_create" . 3587419) + ("hdf_an_createf" . 3588596) + ("hdf_an_end" . 3589554) + ("hdf_an_endaccess" . 3589923) + ("hdf_an_fileinfo" . 3590343) + ("hdf_an_get_tagref" . 3591628) + ("hdf_an_id2tagref" . 3593186) + ("hdf_an_numann" . 3594037) + ("hdf_an_readann" . 3595598) + ("hdf_an_select" . 3596385) + ("hdf_an_start" . 3597296) + ("hdf_an_tag2atype" . 3597994) + ("hdf_an_tagref2id" . 3598942) + ("hdf_an_writeann" . 3599647) + ("hdf_browser" . 3600549) + ("hdf_close" . 3600609) + ("hdf_deldd" . 3600890) + ("hdf_df24_addimage" . 3601278) + ("hdf_df24_getimage" . 3604365) + ("hdf_df24_getinfo" . 3605259) + ("hdf_df24_lastref" . 3606720) + ("hdf_df24_nimages" . 3608098) + ("hdf_df24_readref" . 3608939) + ("hdf_df24_restart" . 3609313) + ("hdf_dfan_addfds" . 3609502) + ("hdf_dfan_addfid" . 3609852) + ("hdf_dfan_getdesc" . 3611126) + ("hdf_dfan_getfds" . 3612907) + ("hdf_dfan_getfid" . 3614953) + ("hdf_dfan_getlabel" . 3615589) + ("hdf_dfan_lablist" . 3616619) + ("hdf_dfan_lastref" . 3618980) + ("hdf_dfan_putdesc" . 3619180) + ("hdf_dfan_putlabel" . 3620326) + ("hdf_dfp_addpal" . 3621439) + ("hdf_dfp_getpal" . 3621821) + ("hdf_dfp_lastref" . 3622148) + ("hdf_dfp_npals" . 3622345) + ("hdf_dfp_putpal" . 3622678) + ("hdf_dfp_readref" . 3624658) + ("hdf_dfp_restart" . 3625021) + ("hdf_dfp_writeref" . 3625201) + ("hdf_dfr8_addimage" . 3625685) + ("hdf_dfr8_getimage" . 3629933) + ("hdf_dfr8_getinfo" . 3630503) + ("hdf_dfr8_lastref" . 3631777) + ("hdf_dfr8_nimages" . 3633080) + ("hdf_dfr8_putimage" . 3633767) + ("hdf_dfr8_readref" . 3637527) + ("hdf_dfr8_restart" . 3637901) + ("hdf_dfr8_setpalette" . 3638088) + ("hdf_dupdd" . 3638646) + ("hdf_exists" . 3639207) + ("hdf_gr_attrinfo" . 3639740) + ("hdf_gr_create" . 3641157) + ("hdf_gr_end" . 3643058) + ("hdf_gr_endaccess" . 3643995) + ("hdf_gr_fileinfo" . 3644547) + ("hdf_gr_findattr" . 3645728) + ("hdf_gr_getattr" . 3646434) + ("hdf_gr_getchunkinfo" . 3647737) + ("hdf_gr_getiminfo" . 3649046) + ("hdf_gr_getlutid" . 3650628) + ("hdf_gr_getlutinfo" . 3651219) + ("hdf_gr_idtoref" . 3652350) + ("hdf_gr_luttoref" . 3652916) + ("hdf_gr_nametoindex" . 3653422) + ("hdf_gr_readimage" . 3654001) + ("hdf_gr_readlut" . 3656417) + ("hdf_gr_reftoindex" . 3657065) + ("hdf_gr_select" . 3657495) + ("hdf_gr_setattr" . 3658112) + ("hdf_gr_setchunk" . 3659980) + ("hdf_gr_setchunkcache" . 3661325) + ("hdf_gr_setcompress" . 3662004) + ("hdf_gr_setexternalfile" . 3662921) + ("hdf_gr_start" . 3664016) + ("hdf_gr_writeimage" . 3664899) + ("hdf_gr_writelut" . 3667885) + ("hdf_hdf2idltype" . 3669231) + ("hdf_idl2hdftype" . 3669799) + ("hdf_ishdf" . 3670400) + ("hdf_lib_info" . 3671043) + ("hdf_newref" . 3673860) + ("hdf_number" . 3674122) + ("hdf_open" . 3674809) + ("hdf_packdata" . 3676149) + ("hdf_read" . 3679367) + ("hdf_sd_adddata" . 3679423) + ("hdf_sd_attrfind" . 3683049) + ("hdf_sd_attrinfo" . 3684582) + ("hdf_sd_attrset" . 3687502) + ("hdf_sd_create" . 3692837) + ("hdf_sd_dimget" . 3697611) + ("hdf_sd_dimgetid" . 3699365) + ("hdf_sd_dimset" . 3700048) + ("hdf_sd_end" . 3703232) + ("hdf_sd_endaccess" . 3704325) + ("hdf_sd_fileinfo" . 3705292) + ("hdf_sd_getdata" . 3706647) + ("hdf_sd_getinfo" . 3708121) + ("hdf_sd_idtoref" . 3712225) + ("hdf_sd_iscoordvar" . 3713773) + ("hdf_sd_nametoindex" . 3714115) + ("hdf_sd_reftoindex" . 3715045) + ("hdf_sd_select" . 3715897) + ("hdf_sd_setcompress" . 3716932) + ("hdf_sd_setextfile" . 3719358) + ("hdf_sd_setinfo" . 3721610) + ("hdf_sd_start" . 3725821) + ("hdf_unpackdata" . 3727463) + ("hdf_vd_attach" . 3730780) + ("hdf_vd_detach" . 3731603) + ("hdf_vd_fdefine" . 3732010) + ("hdf_vd_fexist" . 3733312) + ("hdf_vd_find" . 3733730) + ("hdf_vd_get" . 3734180) + ("hdf_vd_getid" . 3736409) + ("hdf_vd_getinfo" . 3736972) + ("hdf_vd_getnext" . 3738394) + ("hdf_vd_insert" . 3739175) + ("hdf_vd_isvd" . 3739583) + ("hdf_vd_isvg" . 3740078) + ("hdf_vd_lone" . 3740564) + ("hdf_vd_read" . 3741318) + ("hdf_vd_seek" . 3743001) + ("hdf_vd_setinfo" . 3743380) + ("hdf_vd_write" . 3744276) + ("hdf_vg_addtr" . 3746906) + ("hdf_vg_attach" . 3747436) + ("hdf_vg_detach" . 3748330) + ("hdf_vg_getid" . 3748876) + ("hdf_vg_getinfo" . 3749448) + ("hdf_vg_getnext" . 3750677) + ("hdf_vg_gettr" . 3751463) + ("hdf_vg_gettrs" . 3751960) + ("hdf_vg_inqtr" . 3752601) + ("hdf_vg_insert" . 3753071) + ("hdf_vg_isvd" . 3753479) + ("hdf_vg_isvg" . 3753952) + ("hdf_vg_lone" . 3754433) + ("hdf_vg_number" . 3755192) + ("hdf_vg_setinfo" . 3755464) + ("eos routines" . 3756597) + ("feature routines" . 3756941) + ("hdf-eos programming model" . 3758516) + ("alphabetic listing of eos routines" . 3759169) + ("eos_eh_convang" . 3759295) + ("eos_eh_getversion" . 3760236) + ("eos_eh_idinfo" . 3761177) + ("eos_exists" . 3762142) + ("eos_gd_attach" . 3762476) + ("eos_gd_attrinfo" . 3763212) + ("eos_gd_blksomoffset" . 3764044) + ("eos_gd_close" . 3764687) + ("eos_gd_compinfo" . 3764995) + ("eos_gd_create" . 3765861) + ("eos_gd_defboxregion" . 3770176) + ("eos_gd_defcomp" . 3771198) + ("eos_gd_defdim" . 3773752) + ("eos_gd_deffield" . 3774610) + ("eos_gd_deforigin" . 3776331) + ("eos_gd_defpixreg" . 3777072) + ("eos_gd_defproj" . 3777808) + ("eos_gd_deftile" . 3779517) + ("eos_gd_deftimeperiod" . 3781308) + ("eos_gd_defvrtregion" . 3783132) + ("eos_gd_detach" . 3786732) + ("eos_gd_diminfo" . 3787261) + ("eos_gd_dupregion" . 3787810) + ("eos_gd_extractregion" . 3788964) + ("eos_gd_fieldinfo" . 3789942) + ("eos_gd_getfillvalue" . 3790982) + ("eos_gd_getpixels" . 3791614) + ("eos_gd_getpixvalues" . 3793019) + ("eos_gd_gridinfo" . 3794063) + ("eos_gd_inqattrs" . 3795203) + ("eos_gd_inqdims" . 3796090) + ("eos_gd_inqfields" . 3797014) + ("eos_gd_inqgrid" . 3798194) + ("eos_gd_interpolate" . 3799039) + ("eos_gd_nentries" . 3801024) + ("eos_gd_open" . 3801855) + ("eos_gd_origininfo" . 3802720) + ("eos_gd_pixreginfo" . 3803255) + ("eos_gd_projinfo" . 3803671) + ("eos_gd_query" . 3804632) + ("eos_gd_readattr" . 3807742) + ("eos_gd_readfield" . 3808372) + ("eos_gd_readtile" . 3809731) + ("eos_gd_regioninfo" . 3810858) + ("eos_gd_setfillvalue" . 3812644) + ("eos_gd_settilecache" . 3813378) + ("eos_gd_tileinfo" . 3814227) + ("eos_gd_writeattr" . 3815185) + ("eos_gd_writefield" . 3816422) + ("eos_gd_writefieldmeta" . 3818235) + ("eos_gd_writetile" . 3818927) + ("eos_pt_attach" . 3820078) + ("eos_pt_attrinfo" . 3820928) + ("eos_pt_bcklinkinfo" . 3821747) + ("eos_pt_close" . 3822480) + ("eos_pt_create" . 3822792) + ("eos_pt_defboxregion" . 3823558) + ("eos_pt_deflevel" . 3824883) + ("eos_pt_deflinkage" . 3828271) + ("eos_pt_deftimeperiod" . 3829068) + ("eos_pt_defvrtregion" . 3830051) + ("eos_pt_detach" . 3832611) + ("eos_pt_extractperiod" . 3833096) + ("eos_pt_extractregion" . 3834261) + ("eos_pt_fwdlinkinfo" . 3835356) + ("eos_pt_getlevelname" . 3836086) + ("eos_pt_getrecnums" . 3836953) + ("eos_pt_inqattrs" . 3838521) + ("eos_pt_inqpoint" . 3839276) + ("eos_pt_levelindx" . 3840141) + ("eos_pt_levelinfo" . 3840763) + ("eos_pt_nfields" . 3841855) + ("eos_pt_nlevels" . 3842472) + ("eos_pt_nrecs" . 3842936) + ("eos_pt_open" . 3843512) + ("eos_pt_periodinfo" . 3844345) + ("eos_pt_periodrecs" . 3845202) + ("eos_pt_query" . 3846180) + ("eos_pt_readattr" . 3847184) + ("eos_pt_readlevel" . 3847832) + ("eos_pt_regioninfo" . 3849227) + ("eos_pt_regionrecs" . 3850137) + ("eos_pt_sizeof" . 3851125) + ("eos_pt_updatelevel" . 3851889) + ("eos_pt_writeattr" . 3853392) + ("eos_pt_writelevel" . 3854507) + ("eos_query" . 3855572) + ("eos_sw_attach" . 3856711) + ("eos_sw_attrinfo" . 3857477) + ("eos_sw_close" . 3858294) + ("eos_sw_compinfo" . 3858603) + ("eos_sw_create" . 3859439) + ("eos_sw_defboxregion" . 3860202) + ("eos_sw_defcomp" . 3862188) + ("eos_sw_defdatafield" . 3864699) + ("eos_sw_defdim" . 3866458) + ("eos_sw_defdimmap" . 3867714) + ("eos_sw_defgeofield" . 3869764) + ("eos_sw_defidxmap" . 3871791) + ("eos_sw_deftimeperiod" . 3873078) + ("eos_sw_defvrtregion" . 3874876) + ("eos_sw_detach" . 3878840) + ("eos_sw_diminfo" . 3879317) + ("eos_sw_dupregion" . 3879816) + ("eos_sw_extractperiod" . 3880950) + ("eos_sw_extractregion" . 3882142) + ("eos_sw_fieldinfo" . 3883373) + ("eos_sw_getfillvalue" . 3884553) + ("eos_sw_idxmapinfo" . 3885185) + ("eos_sw_inqattrs" . 3886145) + ("eos_sw_inqdatafields" . 3886927) + ("eos_sw_inqdims" . 3888011) + ("eos_sw_inqgeofields" . 3888867) + ("eos_sw_inqidxmaps" . 3890025) + ("eos_sw_inqmaps" . 3891045) + ("eos_sw_inqswath" . 3892199) + ("eos_sw_mapinfo" . 3893003) + ("eos_sw_nentries" . 3893958) + ("eos_sw_open" . 3895072) + ("eos_sw_periodinfo" . 3895902) + ("eos_sw_query" . 3897291) + ("eos_sw_readattr" . 3899674) + ("eos_sw_readfield" . 3900310) + ("eos_sw_regioninfo" . 3901722) + ("eos_sw_setfillvalue" . 3903047) + ("eos_sw_writeattr" . 3903793) + ("eos_sw_writedatameta" . 3905032) + ("eos_sw_writefield" . 3906034) + ("eos_sw_writegeometa" . 3907888) + ("idl supports netcdf 2.4. the following" . 3909058) + ("netcdf data modes" . 3909545) + ("creating netcdf files" . 3911625) + ("type conversion" . 3916130) + ("specifying attributes and variables" . 3916492) + ("string data in netcdf files" . 3917024) + ("alphabetical listing of ncdf routines" . 3919304) + ("ncdf_attcopy" . 3919429) + ("ncdf_attdel" . 3920850) + ("ncdf_attget" . 3921699) + ("ncdf_attinq" . 3922677) + ("ncdf_attname" . 3925785) + ("ncdf_attput" . 3926831) + ("ncdf_attrename" . 3929461) + ("ncdf_close" . 3930224) + ("ncdf_control" . 3930665) + ("ncdf_create" . 3933696) + ("ncdf_dimdef" . 3935071) + ("ncdf_dimid" . 3935879) + ("ncdf_diminq" . 3936325) + ("ncdf_dimrename" . 3937310) + ("ncdf_exists" . 3938047) + ("ncdf_inquire" . 3938635) + ("ncdf_open" . 3939518) + ("ncdf_vardef" . 3940083) + ("ncdf_varget" . 3943444) + ("ncdf_varget1" . 3945859) + ("ncdf_varid" . 3947412) + ("ncdf_varinq" . 3947809) + ("ncdf_varput" . 3948891) + ("ncdf_varrename" . 3953145) + ("overview" . 3955823) + ("introduction to idl dataminer and odbc" . 3956535) + ("odbc conformance levels" . 3960490) + ("where to find additional information" . 3964040) + ("about this volume" . 3964667) + ("conventions" . 3966086) + ("network access requirements" . 3966862) + ("installation on unix systems" . 3967510) + ("initialization" . 3968855) + ("mappings" . 3969540) + ("error messages" . 3970814) + ("to use idl dataminer classes to perform actions" . 3973597) + ("components" . 3974348) + ("using the db_exists function" . 3975795) + ("creating a database object" . 3976335) + ("connecting to a database" . 3978231) + ("finding tables" . 3981774) + ("connecting to a table" . 3982852) + ("working with table data" . 3984111) + ("example" . 3985963) + ("odbc sql syntax notes" . 3989359) + ("idl dataminer api" . 3993210) + ("dialog_dbconnect()" . 3999021) + ("db_exists()" . 4000317) + ("idldbdatabase" . 4000670) + ("idldbdatabase::connect" . 4001879) + ("idldbdatabase::executesql" . 4003035) + ("idldbdatabase::getdatasources" . 4003786) + ("idldbdatabase::getproperty" . 4004406) + ("idldbdatabase::gettables" . 4007378) + ("idldbdatabase::setproperty" . 4008146) + ("idldbrecordset" . 4010071) + ("idldbrecordset::addrecord" . 4012072) + ("idldbrecordset::currentrecord" . 4013491) + ("idldbrecordset::deleterecord" . 4014132) + ("idldbrecordset::getfield" . 4014556) + ("idldbrecordset::getproperty" . 4015473) + ("idldbrecordset::getrecord" . 4018737) + ("idldbrecordset::movecursor" . 4019824) + ("idldbrecordset::nfields" . 4020806) + ("idldbrecordset::setfield" . 4021016) + ("overview" . 4022025) + ("odbc.ini file format" . 4023981) + ("odbc.ini file example" . 4029551) + ("supported drivers" . 4030741) + ("connect odbc for informix" . 4034280) + ("connect odbc for oracle" . 4060281) + ("connect odbc for sybase" . 4088922) + ("connect odbc for text" . 4120823) + ("the unix environment" . 4162804) + ("locking and isolation levels" . 4168078) + ("which you use in sql statements." . 4176823) + ("api functions" . 4176989) + ("scalar functions" . 4180843) + ("overview" . 4197766) + ("backwards compatibility" . 4197986) + ("dde routines" . 4200475) + ("demo_mode" . 4201683) + ("gethelp" . 4202020) + ("handle_create" . 4205285) + ("handle_free" . 4209987) + ("handle_info" . 4210627) + ("handle_move" . 4212602) + ("handle_value" . 4214278) + ("hdf_dfsd_adddata" . 4216061) + ("hdf_dfsd_dimget" . 4217461) + ("hdf_dfsd_dimset" . 4218270) + ("hdf_dfsd_endslice" . 4219682) + ("hdf_dfsd_getdata" . 4220083) + ("hdf_dfsd_getinfo" . 4220850) + ("hdf_dfsd_getslice" . 4223543) + ("hdf_dfsd_putslice" . 4224940) + ("hdf_dfsd_readref" . 4225886) + ("hdf_dfsd_setinfo" . 4226355) + ("hdf_dfsd_startslice" . 4231459) + ("pickfile" . 4235427) + ("polyfitw" . 4235689) + ("riemann" . 4238182) + ("rstrpos" . 4245653) + ("size executive command" . 4246933) + ("slicer" . 4250011) + ("str_sep" . 4260608) + ("tiff_dump" . 4262351) + ("tiff_read" . 4262970) + ("tiff_write" . 4265631) + ("wided" . 4269010) + ("widget_message" . 4269350) + ("calls" . 4269632) + ("using idl as an rpc server" . 4271232) + ("the idl rpc library" . 4274271) + ("free_idl_variable" . 4274688) + ("get_idl_variable" . 4275190) + ("idl_server_interactive" . 4278398) + ("kill_server" . 4279100) + ("register_idl_client" . 4279494) + ("send_idl_command" . 4280530) + ("set_idl_timeout" . 4281799) + ("set_idl_variable" . 4282278) + ("set_rpc_verbosity" . 4284190) + ("unregister_idl_client" . 4284730) + ("the varinfo_t structure" . 4285243) + ("v_make_byte" . 4286194) + ("v_make_complex" . 4286390) + ("v_make_dcomplex" . 4286584) + ("v_make_double" . 4286808) + ("v_make_float" . 4287002) + ("v_make_int" . 4287196) + ("v_make_long" . 4287365) + ("v_make_string" . 4287531) + ("v_fill_array" . 4287695) + ("more variable manipulation macros" . 4288808) + ("management" . 4290680) + ("rpc examples" . 4294944) + ("features in idl 5.5" . 4295304) + ("visualization enhancements" . 4296200) + ("analysis enhancements" . 4311825) + ("language enhancements" . 4324661) + ("user interface toolkit enhancements" . 4353611) + ("file access enhancements" . 4360942) + ("development environment enhancements" . 4368573) + ("scientific data formats enhancements" . 4369025) + ("idl activex control enhancements" . 4372171) + ("idl dataminer enhancements" . 4374057) + ("documentation enhancements" . 4379981) + ("enhanced idl utilities" . 4380467) + ("new and enhanced idl objects" . 4386412) + ("idlgrbuffer::pickdata" . 4387208) + ("idlgrcontour::getproperty" . 4388287) + ("idlgrcontour::init" . 4390742) + ("idlgrcontour::setproperty" . 4392763) + ("idlgrpolygon::getproperty" . 4395218) + ("idlgrpolygon::init" . 4397267) + ("idlgrpolygon::setproperty" . 4399736) + ("idlgrsurface::getproperty" . 4401785) + ("idlgrsurface::init" . 4404322) + ("idlgrsurface::setproperty" . 4407967) + ("idlgrwindow::pickdata" . 4410051) + ("new and enhanced idl routines" . 4411125) + ("new and updated system variables" . 4496983) + ("platforms supported in this release" . 4500833) + ("multi-threading in idl" . 4502530) + ("accelerate your computations." . 4502649) + ("the idl thread pool" . 4502841) + ("controlling the thread pool in idl" . 4507313) + ("routines supporting the thread pool" . 4521598) + ("in idl" . 4524173) + ("introduction to idl com objects" . 4524477) + ("skills required to use com objects" . 4526577) + ("idl com naming schemes" . 4527834) + ("using idl idispatch com objects" . 4530048) + ("using activex controls in idl" . 4543047) + ("menu widget" . 4558714) + ("introduction to the shortcut menu widget" . 4559064) + ("creating a base widget shortcut menu" . 4562401) + ("creating a draw widget shortcut menu" . 4565394) + ("creating a list widget shortcut menu" . 4571696) + ("creating a text widget shortcut menu" . 4578799) + ("new objects" . 4584989) + ("idlcomidispatch" . 4585207) + ("idlcomidispatch::init" . 4586383) + ("idlcomidispatch::getproperty" . 4588154) + ("idlcomidispatch::setproperty" . 4589374) + ("idlffmrsid" . 4590212) + ("idlffmrsid::cleanup" . 4590726) + ("idlffmrsid::getdimsatlevel" . 4591145) + ("idlffmrsid::getimagedata" . 4593058) + ("idlffmrsid::getproperty" . 4596841) + ("idlffmrsid::init" . 4600876) + ("new idl routines" . 4601742) + ("cpu" . 4601839) + ("define_msgblk" . 4606723) + ("define_msgblk_from_file" . 4610890) + ("erf" . 4616320) + ("erfc" . 4617231) + ("erfcx" . 4618172) + ("file_info" . 4618927) + ("file_search" . 4625314) + ("grid_input" . 4653386) + ("griddata" . 4659995) + ("hdf_vd_attrfind" . 4704978) + ("hdf_vd_attrinfo" . 4705945) + ("hdf_vd_attrset" . 4707770) + ("hdf_vd_isattr" . 4716743) + ("hdf_vd_nattrs" . 4717351) + ("heap_free" . 4718172) + ("interval_volume" . 4722176) + ("path_sep" . 4727191) + ("qgrid3" . 4728170) + ("qhull" . 4734980) + ("query_mrsid" . 4738793) + ("read_mrsid" . 4742348) + ("real_part" . 4745899) + ("region_grow" . 4746955) + ("simplex" . 4751429) + ("widget_activex" . 4758008) + ("widget_displaycontextmenu" . 4770895) + ("xobjview_rotate" . 4773351) + ("xobjview_write_image" . 4775014) + ("xroi" . 4776155) + ("new examples" . 4805873) + ("overview of new examples" . 4807045) + ("mapping an image onto a surface" . 4811182) + ("centering an image object" . 4814421) + ("image object" . 4819242) + ("working with mesh objects and routines" . 4824244) + ("copying and printing objects" . 4852950) + ("capturing idl direct graphics displays" . 4868029) + ("creating and restoring .sav files" . 4874242) + ("handling table widgets in guis" . 4883124) + ("finding straight lines in images" . 4892226) + ("color density contrasting in an image" . 4894955) + ("removing noise from an image with fft" . 4898764) + ("using double and triple integration" . 4902163) + ("obtaining irregular grid intervals" . 4907951) + ("functions" . 4910703) + ("determining bessel function accuracy" . 4915271) + )) + +;; Some routines need to be searched under a different name. +;; Here are the required translations. +(setq idlwave-help-name-translations + '( + ("openr" . "open") + ("openu" . "open") + ("openw" . "open") + ("print" . "print/printf") + ("printf" . "print/printf") + ("read" . "read/readf") + ("readf" . "read/readf") + )) + +;; The description for a keyword is not always in the same topic. +;; Some keywords apply to many routines (graphics keywords). Keywords +;; listed by INIT methods are not repeated for GETPROPERTY or SETPROPERTY. +;; Thus, if a keyword description is not found, we sometimes must search +;; the description of additional routines as well. +;; The following list associates routines with other routines where keyword +;; descriptions might be found. Currently we assume that we do not need to +;; look in different object classes. This would be necessary for inheritance, +;; but we do not treat this case currently. +(setq idlwave-help-alt-names + '( + ("axis" "graphics keywords") + ("contour" "plot" "graphics keywords") + ("draw_roi" "graphics keywords") + ("map_continents" "graphics keywords") + ("map_grid" "graphics keywords") + ("map_set" "graphics keywords") + ("oplot" "graphics keywords") + ("plot" "graphics keywords") + ("plot_3dbox" "plot" "graphics keywords") + ("plots" "graphics keywords") + ("polyfill" "graphics keywords") + ("shade_surf" "graphics keywords") + ("surface" "plot" "graphics keywords") + ("xyouts" "graphics keywords") + ("getproperty" "init") + ("setproperty" "init") + ("device" "keywords accepted by the idl devices") + ("system variables" "controlling the thread pool in idl") + )) + +;; Special words in the source files with associated help topics +(defconst idlwave-help-special-topic-words + '( + ("pro") + ("end" . "pro") + ("function") + ("return") + ("if" . "if...then...else") + ("then" . "if...then...else") + ("endif" . "if...then...else") + ("else" . "if...then...else") + ("endelse" . "if...then...else") + ("for") + ("endfor" . "for") + ("while" . "while...do") + ("endwhile" . "while...do") + ("do" . "while...do") + ("repeat" . "repeat...until") + ("endrep" . "repeat...until") + ("until" . "repeat...until") + ("case") + ("of" . "case") + ("endcase" . "case") + ("switch") + ("endswitch" . "switch") + ("break") + ("continue") + ("begin" . "begin...end") + ("common") + ("goto") + ("forward_function") + ("compile_opt") + ("on_ioerror") +) + "Association list of help topics for special context words.") + + ;; What would be a good width for a dedicated help frame? +(setq idlwave-help-frame-width 67) + +;;; idlw-help.el ends here