X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=gnuplot%2Fgnuplot-gui.el;fp=gnuplot%2Fgnuplot-gui.el;h=02960b0fbc534fe220428f02191e3ff7c9835ccd;hb=4ef831f9faaf8ca7ee36ca656c0d511be00ae1bc;hp=0000000000000000000000000000000000000000;hpb=e727f3a809b3bc2e06e6217f919e3def88254b4a;p=emacs-init.git diff --git a/gnuplot/gnuplot-gui.el b/gnuplot/gnuplot-gui.el new file mode 100644 index 0000000..02960b0 --- /dev/null +++ b/gnuplot/gnuplot-gui.el @@ -0,0 +1,1748 @@ +;;;; gnuplot-gui.el -- GUI interface to setting options in gnuplot-mode + +;; Copyright (C) 1998-2000 Bruce Ravel + +;; Author: Bruce Ravel +;; Maintainer: Bruce Ravel +;; Created: 19 December 1998 +;; Updated: 16 November 2000 +;; Version: (same as gnuplot.el) +;; Keywords: gnuplot, plotting, interactive, GUI + +;; This file is not part of GNU Emacs. + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. +;; +;; This lisp script 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. +;; +;; Permission is granted to distribute copies of this lisp script +;; provided the copyright notice and this permission are preserved in +;; all copies. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, you can either send email to this +;; program's maintainer or write to: The Free Software Foundation, +;; Inc.; 675 Massachusetts Avenue; Cambridge, MA 02139, USA. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; send bug reports to the authors (ravel@phys.washington.edu) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: +;; +;; This file provides a graphical user interface to setting arguments +;; to gnuplot commands. Positioning point near a command and invoking +;; `gnuplot-gui-set-options-and-insert' (C-c C-c or shift-mouse-2) +;; will pop open a frame with widgets for setting the various +;; arguments appropriate the the item that was near point. The goal +;; is to provide point-and-click functionality to gnuplot-mode. +;; +;; gnuplot-gui is designed for gnuplot 3.7, but since much of 3.7 is +;; backward compatible to 3.5, it will work well for that version +;; also. +;; +;; gnuplot-gui.el was developed using Emacs 19.34 and is known to work +;; on Emacs 20.x and XEmacs 20.x. I do not know what is the earliest +;; version for which it will work, but I make no guarantees for +;; versions before 19.34. Note that this makes heavy use of the +;; widget package, so this will not work on Emacs 19.34 unless you +;; install the widget package separately. +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; To do: +;; +;; Widgets I need: +;; -- 'position: two or three comma separated numbers used to denote a +;; position or a tic start/end/increment (see arrow, +;; need a prefix) +;; -- 'modifier: colon separated fields used for datafile modifiers +;; +;; command types which are currently unsupported or contain mistakes +;; -- unsupported: cntrparam +;; -- plot, splot, fit: rather lame +;; -- label: position information missing +;; -- label: font string handled in overly simple manner +;; -- hidden3d: not really suited to 'list, but all options are exclusive... +;; -- pointstyle argument to "set label" +;; +;; overall: +;; -- continuation lines (ugh!) +;; -- multiple frames end up displaying same window after setting options +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Code: + +(require 'gnuplot) +(eval-and-compile + (condition-case () + (progn + (require 'widget) + (require 'wid-edit)) + (error nil))) +(require 'cl) +(eval-when-compile ; suppress some compiler warnings + (defvar gnuplot-xemacs-p nil) + (defvar gnuplot-quote-character nil) + (defvar gnuplot-info-display nil) + (defvar gnuplot-mode-map nil)) + +;; (eval-when-compile +;; (require 'wid-edit)) + +(eval-and-compile ; I need this! + (if (fboundp 'split-string) + () + (defun split-string (string &optional pattern) + "Return a list of substrings of STRING which are separated by PATTERN. +If PATTERN is omitted, it defaults to \"[ \\f\\t\\n\\r\\v]+\"." + (or pattern + (setq pattern "[ \f\t\n\r\v]+")) + ;; The FSF version of this function takes care not to cons in case + ;; of infloop. Maybe we should synch? + (let (parts (start 0)) + (while (string-match pattern string start) + (setq parts (cons (substring string start (match-beginning 0)) parts) + start (match-end 0))) + (nreverse (cons (substring string start) parts)))) )) + + + +;;; customizable variables + +(defgroup gnuplot-gui nil + "Graphical interface to setting arguments in gnuplot scrips." + :prefix "gnuplot-gui-" + :group 'gnuplot) + +(defcustom gnuplot-gui-popup-flag nil + "*Non-nil means to open arguments pop-ups automatically. +This would be done after menu insertion of Gnuplot commands." + :group 'gnuplot-gui + :type 'boolean) + +(defvar gnuplot-gui-frame nil + "Frame used to hold the buffer for setting options.") +(defcustom gnuplot-gui-frame-plist + '(height 18 width 65 border-width 0 + user-position t top 150 left 150 + internal-border-width 0 unsplittable t + default-toolbar-visible-p nil has-modeline-p nil + menubar-visible-p nil) + "Frame plist for the input run-time display frame in XEmacs." + :type '(repeat (group :inline t + (symbol :tag "Property") + (sexp :tag "Value"))) + :group 'gnuplot-gui) +(defcustom gnuplot-gui-frame-parameters + '((height . 18) + (width . 65) + (user-position . t) + (top . 150) + (left . 150) + (border-width . 0) + (menu-bar-lines . 0) + (unsplittable . t)) + "Frame parameters for the input run-time display frame in Emacs." + :group 'gnuplot-gui + :type '(repeat (sexp :tag "Parameter:"))) + +(defcustom gnuplot-gui-fontname-list + '(" " "\"Helvetica\"" "\"Times-Roman\"") + "List of known font names. +These *must* be quoted, like so \"\\\"Helvetica\\\"\". This allows +for fonts with names like \"\\\"Arial Bold Italic\\\"\" to be treated +as single entries in the menu-buttons. And it is really important that +the first entry in the list be a blank string." + :group 'gnuplot-gui + :type '(repeat (string :tag "Font name:"))) + +;; some global variables +(defvar gnuplot-current-frame nil) +(defvar gnuplot-current-buffer nil) +(defvar gnuplot-current-buffer-point nil) +(defvar gnuplot-gui-alist nil) +(defvar gnuplot-gui-current-string nil) + + +;;; various tools for handling data structures and text in the buffer + +;; tools for accessing the elements of the lists in `gnuplot-gui-all-types' +(defsubst gnuplot-gui-type-tag (obj) (elt obj 0)) +(defsubst gnuplot-gui-type-symbol (obj) (elt obj 1)) +(defsubst gnuplot-gui-type-default (obj) (elt obj 2)) +(defsubst gnuplot-gui-type-prefix (obj) (elt obj 3)) ; also 'range seperator +(defsubst gnuplot-gui-type-fourth (obj) (elt obj 4)) +(defsubst gnuplot-gui-type-list (obj) (cddr obj)) + +(defun gnuplot-this-word () + "Return the word under point." + (let ((begin (save-excursion (beginning-of-line) (point-marker))) + (end (save-excursion (end-of-line) (point-marker)))) + (save-excursion + (or (looking-at "\\<") (= (current-column) 0) (forward-word -1)) + (if (> (point) begin) (setq begin (point-marker))) + (forward-word 1) + (if (> (point) end) (goto-char end)) + (buffer-substring-no-properties begin (point))))) + + + +;;; data structures containing regarding options in Gnuplot 3.7 + +;; various constants used for options that take the same sorts of arguments +(defconst gnuplot-gui-mtics-list + '(("FREQUENCY" 'number " ") + ("DEFAULT" 'list " " "default"))) +(defconst gnuplot-gui-data-list + '(("DATA TYPE" 'list " " "time"))) +(defconst gnuplot-gui-label-list + '(("LABEL" 'string " ") + ("POSITION" 'position " " "" 2) + ("FONTNAME" 'list " " gnuplot-gui-fontname-list) + ("FONTSIZE" 'fontsize " "))) +(defconst gnuplot-gui-range-list + '(("RANGE" 'range (" " . " ") ":") + ("REVERSE" 'list " " "reverse" "noreverse") + ("WRITEBACK" 'list " " "writeback" "nowriteback"))) +(defconst gnuplot-gui-tics-list + '(("WHERE" 'list " " "axis" "border") + ("MIRROR" 'list " " "mirror" "nomirror") + ("ROTATE" 'list " " "rotate" "norotate") + ("SERIES" 'position " " "" 3) + ("LABEL ARRAY" 'labels () ))) +(defconst gnuplot-gui-zeroaxis-list + '(("LINETYPE" 'number " "))) + +(defvar gnuplot-gui-terminal-types nil + "Associated list of terminal descriptions. +See the doc-string for `gnuplot-gui-all-types'.") +(setq gnuplot-gui-terminal-types + (list (cons "aifm" + '(("COLOR" 'list " " "monochrome" "gray" "color") + ("FONTNAME" 'list " " gnuplot-gui-fontname-list) + ("FONTSIZE" 'fontsize " "))) + (cons "cgm" + '(("MODE" 'list " " "landscape" "portrait" "default") + ("COLOR" 'list " " "color" "monochrome") + ("ROTATION" 'list " " "rotate" "norotate") + ("WIDTH" 'number " " "width") + ("LINEWIDTH" 'number " " "linewidth") + ("FONTNAME" 'list " " "\"Arial\"" "\"Arial Italic\"" + "\"Arial Bold\"" "\"Arial Bold Italic\"" + "\"Times Roman\"" "\"Times Roman Italic\"" + "\"Times Roman Bold\"" "\"Times Roman Bold Italic\"" + "\"Helvetica\"" "\"Roman\"") + ("FONTSIZE" 'fontsize " "))) + (cons "corel" + '(("COLOR" 'list " " "default" "color" "monochrome") + ("FONTNAME" 'list " " "\"SwitzerlandLight\"" + "\"Helvetica\"" "\"Times-Roman\"") + ("FONTSIZE " 'number " ") + ("X-SIZE " 'number " ") + ("Y-SIZE " 'number " ") + ("LINEWIDTH" 'number " "))) + (cons "dumb" + '(("LINEFEED" 'list " " "feed" "nofeed") + ("X-SIZE" 'number " ") + ("Y-SIZE" 'number " "))) + (cons "emf" + '(("COLOR" 'list " " "color" "monochrome") + ("LINE" 'list " " "solid" "dashed") + ("FONTNAME" 'string " ") + ("FONTSIZE" 'number " "))) + (cons "emtex" + '(("FONTNAME" 'list " " "courier" "roman") + ("FONTSIZE" 'fontsize " "))) + (cons "fig" + '(("COLOR" 'list " " "color" "monochrome") + ("FRAMESIZE" 'list " " "small" "big") + ("POINTSMAX" 'number " " "pointsmax") + ("ORIENTATION" 'list " " "landscape" "portrait") + ("UNITS" 'list " " "metric" "inches") + ("FONT SIZE" 'number " " "fontsize") + ("SIZE" 'pair (" " . " ") "size") + ("LINE THICKNESS" 'number " " "thickness") + ("LAYER DEPTH" 'number " " "depth"))) + (cons "hp500c" + '(("RESOLUTION" 'list " " "75" "100" "150" "300") + ("COMPRESSION" 'list " " "rle" "tiff"))) + (cons "hpgl" + '(("PENS" 'number " ") + ("EJECT" 'list " " "eject"))) + (cons "hpdj" + '(("RESOLUTION" 'list " " "75" "100" "150" "300"))) + (cons "hpljii" + '(("RESOLUTION" 'list " " "75" "100" "150" "300"))) + (cons "hppj" + '(("FONT" 'list " " "FNT9X17" "FNT5X9" "FNT13X25"))) + (cons "imagen" + '(("FONT SIZE" 'number " ") + ("LAYOUT" 'list " " "portrait" "landscape") + ("NUMBER OF GRAPHS" 'range (" " . " ") ","))) + (cons "gpic" + '(("X ORIGIN" 'number " ") + ("Y ORIGIN" 'number " " ","))) + (cons "latex" + '(("FONTNAME" 'list " " "courier" "roman") + ("FONTSIZE" 'fontsize " "))) + (cons "mif" + '(("COLOUR" 'list " " "colour" "monochrome") + ("LINETYPE" 'list " " "polyline" "vectors"))) + (cons "nec-cp6" + '(("MODE" 'list " " "monochrome" "colour" "draft"))) + (cons "pbm" + '(("SIZE" 'list " " "small" "medium" "large") + ("COLOR" 'list " " "monochrome" "gray" "color"))) + (cons "pcl5L" + '(("MODE" 'list " " "landscape" "portrait") + ("FONTNAME" 'list " " "stick" "univers" "cg_times") + ("FONTSIZE" 'fontsize " "))) + (cons "png" + '(("SIZE" 'list " " "small" "medium" "large") + ("COLOR" 'list " " "monochrome" "gray" "color"))) + (cons "postscript" + '(("MODE" 'list " " "landscape" "portrait" "eps" "default") + ("ENHANCED" 'list " " "enhanced" "noenhanced") + ("COLOR" 'list " " "color" "monochrome") + ("SOLID" 'list " " "solid" "dashed") + ("DUPLEXING" 'list " " "defaultplex" "simplex" "duplex") + ("FONTNAME" 'list " " gnuplot-gui-fontname-list) + ("FONTSIZE" 'fontsize " "))) + (cons "pslatex" + '(("COLOR" 'list " " "monochrome" "color") + ("DASHED" 'list " " "dashed") + ("ROTATION" 'list " " "rotate" "norotate") + ("AUXFILE" 'list " " "auxfile"))) + (cons "pstex" + '(("COLOR" 'list " " "monochrome" "color") + ("DASHED" 'list " " "dashed") + ("ROTATION" 'list " " "rotate" "norotate") + ("AUXFILE" 'list " " "auxfile"))) + (cons "pstricks" + '(("HACK TEXT" 'list " " "hacktext" "nohacktext") + ("PLOT SCALING" 'list " " "nounit" "unit"))) + (cons "regis" + '(("COLOR DEPTH" 'list "4" "16"))) + (cons "tgif" + '(("LAYOUT" 'list " " "portrait" "landscape") + ("NUMBER OF GRAPHS" 'range (" " . " ") ",") + ("LINE TYPE" 'list " " "solid" "dashed") + ("FONTNAME" 'list " " gnuplot-gui-fontname-list) + ("FONTSIZE" 'fontsize " "))) + (cons "tpic" + '(("POINTSIZE" 'number " ") + ("LINEWIDTH" 'number " ") + ("INTERVAL " 'number " "))) + (cons "vgagl" ; for pm3d patch (also persist, raise in x11) + '(("BACKGROUND" 'position " " "background" 3) + ("INTERPOLATION" 'list " " "uniform" "interpolate") + ("DUMP" 'file " ") + ("MODE" 'string " " ""))) + (cons "x11" + '(("RESET" 'list " " "reset") + ("TERMINAL NUMBER" 'number " ") + ("PERSIST" 'list " " "persist" "nopersist") + ("RAISE" 'list " " "raise" "noraise"))) )) + +(defvar gnuplot-gui-terminal-list nil) +(setq gnuplot-gui-terminal-list + (append (list " ") (mapcar 'car gnuplot-gui-terminal-types))) + +(defvar gnuplot-gui-set-types nil + "Associated list of set option descriptions. +See the doc-string for `gnuplot-gui-all-types'.") +(setq gnuplot-gui-set-types + (list (cons "angles" + '(("UNITS" 'list " " "degrees" "radians"))) + (cons "arrow" + '(("TAG" 'tag " ") + ("FROM" 'position " " "from" 3) + ("TO" 'position " " "to" 3) + ("HEAD" 'list " " "head" "nohead") + ("LINESTYLE" 'number " " "ls") + ("LINETYPE " 'number " " "lt") + ("LINEWIDTH" 'number " " "lw"))) + (cons "noarrow" + '(("TAG" 'tag " "))) + (cons "autoscale" + '(("AXIS" 'list " " "x" "y" "z" "x2" "y2" "xy" + "xmin" "ymin" "zmin" "x2min" "y2min" "xymin" + "xmax" "ymax" "zmax" "x2max" "y2max" "xymax"))) + (cons "noautoscale" + '(("AXIS" 'list " " "x" "y" "z" "x2" "y2" "xy" + "xmin" "ymin" "zmin" "x2min" "y2min" "xymin" + "xmax" "ymax" "zmax" "x2max" "y2max" "xymax"))) + (cons "bar" + '(("SIZE" 'list " " "small" "large"))) + (cons "border" + '(("BORDER CODE" 'number " ") + ("LINE STYLE" 'list " " "lines" + "dots" "points" "linespoints") + ("LINESTYLE" 'number " " "ls") + ("LINETYPE" 'number " " "lt") + ("LINEWIDTH" 'number " " "lw") + )) + (cons "boxwidth" + '(("WIDTH" 'number " "))) + (cons "clabel" + '(("FORMAT" 'format " "))) + (cons "clip" + '(("CLIP TYPE" 'list " " "points" "one" "two"))) + (cons "noclip" + '(("CLIP TYPE" 'list " " "points" "one" "two"))) + ;;(cons "cntrparam" + ;; '(("INTERPOLATION" 'list " " "linear" "cubicspline" "bspline") + ;; ("POINTS" 'number " " "points") + ;; ("ORDER" 'number " " "order"))) + (cons "contour" + '(("WHERE" 'list " " "base" "surface" "both"))) + (cons "dgrid3d" + '(("ROW,COLUMN,NORM" 'position " " "" 3))) + (cons "encoding" + '(("ENCODING" 'list " " "default" "iso_8859_1" + "cp850" "cp437"))) + (cons "format" + '(("AXIS" 'list " " "x" "y" "z" "xy" "x2" "y2") + ("FORMAT" 'format " "))) + (cons "dummy" + '(("VAR 1" 'string " " "") + ("VAR 2" 'string " " ","))) + (cons "grid" + '(("XTICS" 'list " " "xtics" "mxtics" "noxtics" "nomxtics") + ("YTICS" 'list " " "ytics" "mytics" "noytics" "nomytics") + ("ZTICS" 'list " " "ztics" "mztics" "noztics" "nomztics") + ("X2TICS" 'list " " "x2tics" "mx2tics" "nox2tics" "nomx2tics") + ("Y2TICS" 'list " " "y2tics" "my2tics" "noy2tics" "nomy2tics") + ("POLAR" 'number " " "polar") + ("MAJOR LINETYPE" 'number " ") + ("MINOR LINETYPE" 'number " "))) + (cons "hidden3d" + '(("ALGORITHM" 'list " " "defaults" + "offset" + "nooffset" + ;;"trianglepattern # bitpattern between 0 and 7" + "trianglepattern 0" "trianglepattern 1" + "trianglepattern 2" "trianglepattern 3" + "trianglepattern 4" "trianglepattern 5" + "trianglepattern 6" "trianglepattern 7" + ;;"undefined # level between 0 and 3" + "undefined 0" "undefined 1" "undefined 2" "undefined 3" + "noundefined" "altdiagonal" "noaltdiagonal" + "bentover" "nobentover"))) + (cons "historysize" + '(("SIZE" 'number " "))) + (cons "isosamples" + '(("ISO_U LINES" 'number " ") + ("ISO_V LINES" 'number " " ","))) + (cons "key" + '(("LOCATION" 'list " " "left" "right" "top" "bottom" + "outside" "below") + ("POSITION" 'position " " "" 3) + ("JUSTIFICATION" 'list " " "Left" "Right") + ("REVERSE" 'list " " "reverse" "noreverse") + ("SAMPLE LENGTH" 'number " " "samplen") + ("SPACING" 'number " " "spacing") + ("WIDTH" 'number " " "width") + ("TITLE" 'string " " "title ") + ("BOX LINETYPE" 'number " " "box") ;; linetype data + ("NOBOX" 'list " " "nobox"))) + (cons "label" + '(("TAG" 'tag " ") + ("LABEL TEXT" 'string " ") + ("POSITION" 'position " " "at" 3) + ;; first, second, graph, screen + ("JUSTIFICATION" 'list " " "left" "right" "center") + ("ROTATE" 'list " " "rotate" "norotate") + ("FONT" 'string " " "font"))) ;; font "name,size" + (cons "nolabel" + '(("TAG" 'tag " "))) + (cons "linestyle" + '(("TAG " 'tag " ") + ("LINE STYLE" 'list " " "boxerrorbars" "boxes" + "boxxyerrorbars" "candlesticks" "dots" + "financebars" "fsteps" "histeps" "impulses" + "lines" "linespoints" "points" "steps" "vector" + "xerrorbars" "xyerrorbars" "yerrorbars") + ("LINETYPE " 'number " " "lt") + ("LINEWIDTH" 'number " " "lw") + ("POINTTYPE" 'number " " "pt") + ("POINTSIZE" 'number " " "ps"))) + (cons "locale" + '(("LOCALE" 'string " "))) + (cons "logscale" + '(("AXIS" 'list " " "x" "y" "z" "xy" "xz" "yz" "xyz" + "x2" "y2") + ("BASE" 'number " "))) + (cons "nologscale" + '(("AXIS" 'list " " "x" "y" "z" "xy" "xz" "yz" "xyz" + "x2" "y2"))) + (cons "mapping" + '(("COORDINATE SYSTEM" 'list " " "cartesian" "spherical" + "cylindrical"))) + ; _margin + (cons "bmargin" + '(("BOTTOM MARGIN" 'number " "))) + (cons "lmargin" + '(("LEFT MARGIN" 'number " "))) + (cons "rmargin" + '(("RIGHT MARGIN" 'number " "))) + (cons "tmargin" + '(("TOP MARGIN" 'number " "))) + + (cons "missing" + '(("CHARACTER" 'string " " 1))) + ; m_tics + (cons "mxtics" gnuplot-gui-mtics-list) + (cons "mytics" gnuplot-gui-mtics-list) + (cons "mztics" gnuplot-gui-mtics-list) + (cons "mx2tics" gnuplot-gui-mtics-list) + (cons "my2tics" gnuplot-gui-mtics-list) + + ; pm3d additions + (cons "mouse" + '(("DOUBLECLICK" 'number " " "doubleclick") + ("ZOOM" 'list " " "zoomcoordinates" "nozoomcoordinates") + ("POLAR" 'list " " "polarcoordinates" "nopolarcoordinates") + ("FORMAT" 'string " " "format") + ("CLIPBOARDFORMAT" 'string " " "clipboardformat") + ("MOUSEFORMAT" 'string " " "mouseformat") + ("LABELS" 'list " " "labels" "nolabels") + ("LABELOPTIONS" 'string " " "labeloptions") + ("ZOOMJUMP" 'list " " "zoomjump" "nozoomjump") + ("VERBOSE" 'list " " "verbose" "noverbose"))) + (cons "palette" + '(("COLOR" 'list " " "gray" "color") + ("RGBFORMULAE" 'position " " "rgbformulae" 3) + ("PARITY" 'list " " "positive" "negative") + ("FORMULAE" 'list " " "nops_allcF" "ps_allcF") + ("MAXCOLORS" 'number " ") + ("COLOR_BOX" 'list " " "nocb" "cbdefault" "cbuser") + ("ORIENTATION" 'list " " "cbvertical" "cbhorizontal") + ("ORIGIN" 'position " " "origin" 2) + ("SIZE" 'position " " "size" 2) + ("BORDER" 'number " ") + ("NOBORDER" 'list " " "bdefault" "noborder"))) + (cons "pm3d" + '(("AT" 'list* " " "b" "s" "t" "bs" "bt" "st" "bst") + ("SCANS" 'list " " "scansautomatic" "scansforward" "scansbackward") + ("FLUSH" 'list* " " "begin" "center" "end") + ("CLIP" 'list " " "clip1in" "clip4in") + ("ZRANGE" 'range (" " . " ") ":") + ("HIDDEN3D" 'number " ") + ("NOHIDDEN3D" 'list " " "nohidden3d") + ("FILLING" 'list " " "transparent" "solid") + ("MAP" 'list " " "map"))) + + (cons "offsets" + '(("LEFT " 'number " ") + ("RIGHT " 'number " " ",") + ("TOP " 'number " " ",") + ("BOTTOM" 'number " " ","))) + (cons "origin" + '(("X ORIGIN" 'number " ") + ("Y ORIGIN" 'number " " ","))) + (cons "output" + '(("FILENAME" 'file " "))) + (cons "pointsize" + '(("MULTIPLIER" 'number " "))) + (cons "samples" + '(("2D PLOT" 'number " ") + ("3D PLOT" 'number " " ","))) + (cons "size" + '(("ASPECT" 'list " " "square" "nosquare" + "ratio" "noratio") + ("X-SCALE OR RATIO" 'number " ") + ("Y-SCALE" 'number " " ","))) + (cons "style" + '(("DATA TYPE" 'list " " "data" "function") + ("PLOT STYLE" 'list " " "boxerrorbars" "boxes" + "boxxyerrorbars" "candlesticks" "dots" + "financebars" "fsteps" "histeps" "impulses" + "lines" "linespoints" "points" "steps" "vector" + "xerrorbars" "xyerrorbars" "yerrorbars"))) + (cons "terminal" + '(("TERMINAL TYPE" 'list " " gnuplot-gui-terminal-list))) + (cons "tics" + '(("DIRECTION" 'list " " "in" "out"))) + (cons "ticslevel" + '(("RELATIVE HEIGHT" 'number " "))) + (cons "ticscale" + '(("MAJOR" 'number " ") + ("MINOR" 'number " "))) + (cons "timestamp" + '(("FORMAT STRING" 'format " ") + ("WHERE" 'list " " "top" "bottom") + ("ROTATE" 'list " " "rotate" "norotate") + ("X-OFFSET" 'number " ") + ("Y-OFFSET" 'number " " ",") + ("FONTNAME" 'list " " gnuplot-gui-fontname-list))) + (cons "timefmt" + '(("FORMAT STRING" 'string " "))) + (cons "title" + '(("TITLE" 'string " "))) + (cons "view" + '(("X-ROTATION" 'number " ") + ("Z-ROTATION" 'number " " ",") + ("SCALE" 'number " " ",") + ("Z-SCALE" 'number " " ","))) + ;; ("SCALE" 'position " " "," 4) + ; _data + (cons "xdata" gnuplot-gui-data-list) + (cons "ydata" gnuplot-gui-data-list) + (cons "zdata" gnuplot-gui-data-list) + (cons "x2data" gnuplot-gui-data-list) + (cons "y2data" gnuplot-gui-data-list) + ; _label + (cons "xlabel" gnuplot-gui-label-list) + (cons "ylabel" gnuplot-gui-label-list) + (cons "zlabel" gnuplot-gui-label-list) + (cons "x2label" gnuplot-gui-label-list) + (cons "y2label" gnuplot-gui-label-list) + ; _range, note that the [] syntax for + ; the writeback argument is + ; not properly supported + (cons "xrange" gnuplot-gui-range-list) + (cons "yrange" gnuplot-gui-range-list) + (cons "zrange" gnuplot-gui-range-list) + (cons "x2range" gnuplot-gui-range-list) + (cons "y2range" gnuplot-gui-range-list) + (cons "trange" gnuplot-gui-range-list) + (cons "rrange" gnuplot-gui-range-list) + (cons "urange" gnuplot-gui-range-list) + (cons "vrange" gnuplot-gui-range-list) + ; _tics + (cons "xtics" gnuplot-gui-tics-list) + (cons "ytics" gnuplot-gui-tics-list) + (cons "ztics" gnuplot-gui-tics-list) + (cons "x2tics" gnuplot-gui-tics-list) + (cons "y2tics" gnuplot-gui-tics-list) + ; zeroaxis + (cons "zeroaxis" gnuplot-gui-zeroaxis-list) + (cons "xzeroaxis" gnuplot-gui-zeroaxis-list) + (cons "yzeroaxis" gnuplot-gui-zeroaxis-list) + (cons "y2zeroaxis" gnuplot-gui-zeroaxis-list) + (cons "x2zeroaxis" gnuplot-gui-zeroaxis-list) + + (cons "zero" + '(("THRESHOLD" 'number " "))) + )) + +(defvar gnuplot-gui-command-types nil + "Associated list of command descriptions. +See the doc-string for `gnuplot-gui-all-types'.") +(setq gnuplot-gui-command-types + (list (cons "cd" + '(("FILENAME" 'file " "))) + (cons "call" + '(("INPUT FILE" 'file " ") + ("PARAMETER LIST" 'string " "))) + (cons "load" + '(("INPUT FILE" 'file " "))) + (cons "pause" + '(("TIME" 'number " ") + ("MESSAGE" 'string " "))) + (cons "print" + '(("EXPRESSION" 'string " "))) + (cons "save" + '(("SAVE" 'list " " "functions" "variables" "set") + ("FILE" 'file " "))) + (cons "update" + '(("INITIAL FILE" 'file " " t) + ("UPDATED FILE" 'file " " t))) )) + + +(defcustom gnuplot-gui-plot-splot-fit-style 'simple + "Control the complexity of the GUI display for plot, splot, and fit. +The values are 'simple, which causes a limited set of plot, splot, or +fit options to be displayed, and 'complete, which attempts to display +all options. The 'complete setting is prone to making errors when +parsing values already in the script buffer." + :group 'gnuplot-gui + :type '(radio (const :tag "Simple listing" simple) + (const :tag "Complete listing" complete))) + + +(defconst gnuplot-gui-plot-simple-list + '(("X RANGE" 'range (" " . " ") ":") + ("Y RANGE" 'range (" " . " ") ":") + ("DATA FILE" 'file " ") + ("THRU" 'string* " " "thru") + ("USING" 'modifier " ") + ("TITLE" 'string " ") + ("WITH" 'list* " " "boxerrorbars" "boxes" + "boxxyerrorbars" "candlesticks" "dots" "financebars" + "fsteps" "histeps" "impulses" "lines" "linespoints" + "points" "steps" "vector" "xerrorbars" "xyerrorbars" + "yerrorbars"))) +(defconst gnuplot-gui-plot-full-list + '(;;("T RANGE" 'range (" " . " ") ":") + ("X RANGE" 'range (" " . " ") ":") + ("Y RANGE" 'range (" " . " ") ":") + ("xa" 'text "\t---------------------") + ("FUNCTION" 'string " ") + ("xc" 'text " or") + ("DATA FILE" 'file " ") + ("INDEX" 'modifier " ") + ("EVERY" 'modifier " ") + ("THRU" 'string* " " "thru") + ("USING" 'modifier " ") + ("SMOOTH" 'list* " " "unique" "csplines" "acsplines" + "bezier" "sbezier") + ;; datafile modifiers + ("AXES" 'list* " " "x1y1" "x2y2" "x1y2" "x2y1") + ("TITLE" 'string " ") + ("NOTITLE" 'list " " "notitle") + ("xf" 'text "\t---------------------") + ("xi" 'text "Select a standard plotting style") + ("WITH" 'list* " " "boxerrorbars" "boxes" + "boxxyerrorbars" "candlesticks" "dots" "financebars" + "fsteps" "histeps" "impulses" "lines" "linespoints" + "points" "steps" "vector" "xerrorbars" "xyerrorbars" + "yerrorbars") + ("xo" 'text " or a previously defined style") + ("LINE STYLE " 'number " " "ls") + ("xr" 'text " or specify a style in-line") + ("LINE TYPE " 'number " " "lt") + ("LINE WIDTH " 'number " " "lw") + ("POINT TYPE " 'number " " "pt") + ("POINT STYLE" 'number " " "ps") + )) +(defconst gnuplot-gui-splot-simple-list + '(("DATA FILE" 'file " ") + ("TITLE" 'string " ") + ("WITH" 'list* " " "lines" "linespoints" "points" "dots" "impulses"))) +(defconst gnuplot-gui-splot-full-list + '(;;("U RANGE" 'range (" " . " ") ":") + ;;("V RANGE" 'range (" " . " ") ":") + ("X RANGE" 'range (" " . " ") ":") + ("Y RANGE" 'range (" " . " ") ":") + ("Z RANGE" 'range (" " . " ") ":") + ("xa" 'text "\t---------------------") + ("FUNCTION" 'string " ") + ("xc" 'text " or") + ("DATA FILE" 'file " ") + ("INDEX" 'modifier " ") + ("EVERY" 'modifier " ") + ("THRU" 'string* " " "thru") + ("USING" 'modifier " ") + ("SMOOTH" 'list* " " "unique" "csplines" "acsplines" + "bezier" "sbezier") + ("TITLE" 'string " ") + ("NOTITLE" 'list " " "notitle") + ("WITH" 'list* " " "lines" "linespoints" "points" "dots" "impulses"))) +(defconst gnuplot-gui-fit-simple-list + '(("FUNCTION" 'string* " " "") + ("DATA FILE" 'file " ") + ("VIA (params)" 'string* " " "via") )) +(defconst gnuplot-gui-fit-full-list + '(("X RANGE" 'range (" " . " ") ":") + ("Y RANGE" 'range (" " . " ") ":") + ("xa" 'text "----- fitting functionn and file --------") + ("FUNCTION" 'string* " " "") + ("DATA FILE" 'file " ") + ("xb" 'text "----- datafile modifiers ----------------") + ("INDEX" 'modifier " ") + ("EVERY" 'modifier " ") + ("THRU" 'string* " " "thru") + ("USING" 'modifier " ") + ("SMOOTH" 'list* " " "unique" "csplines" "acsplines" + "bezier" "sbezier") + ("xc" 'text "----- parameters (file or parameters) ---") + ("VIA (file)" 'string " " "via") + ("VIA (params)" 'string* " " "via") )) + +(defvar gnuplot-gui-plot-splot-fit nil + "Associated list of plot, splot, and fit descriptions. +See the doc-string for `gnuplot-gui-all-types'.") +(setq gnuplot-gui-plot-splot-fit + (list (cons "plot" (if (equal gnuplot-gui-plot-splot-fit-style 'complete) + gnuplot-gui-plot-full-list + gnuplot-gui-plot-simple-list)) + (cons "splot" (if (equal gnuplot-gui-plot-splot-fit-style 'complete) + gnuplot-gui-splot-full-list + gnuplot-gui-splot-simple-list)) + (cons "fit" (if (equal gnuplot-gui-plot-splot-fit-style 'complete) + gnuplot-gui-fit-full-list + gnuplot-gui-fit-simple-list))) ) + + +(defvar gnuplot-gui-test-type nil) +(setq gnuplot-gui-test-type + (list (cons "test" + '(("TAG" 'tag " ") + ("LIST" 'list " " "1" "2" "3") + ("LIST*" 'list* " " "1" "2" "3") + ("NUMBER" 'number " " "number") + ("RANGE" 'range (" " . " ") ":") + ("PAIR" 'pair (" " . " ") "pair") + ("LABELS" 'labels ()) + ("FILE" 'file " ") + ("TEXT" 'text "this is text") + ("STRING" 'string " ") + ("STRING*" 'string* " " "string*") + ("FORMAT" 'format " ") + ("POSITION" 'position " " "at" 3) + ("FONTSIZE" 'fontsize " ") )))) + +(defvar gnuplot-gui-all-types nil + "Associated list of terminal, set option, and command arguments. + +Each entry in the list is a cons cell of the form + (OPTION . ALIST) +where OPTION is one of the recognized options in Gnuplot, either a +command, something that is set, or a terminal type. Only those +commands, set options, and terminal types that actually take arguments +are in this associated list. + +ALIST is itself an associated list where each entry is of the form: + + (TAG TYPE DEFAULT REST) + +TAG is the name used on the widget and indicates one of the options +for this command, set option, or terminal type. + +TYPE is one of + 'list a menu-list of strings + 'list* a menu-list of strings with a prefix + 'number a number with an optional prefix + 'tag like number but must be the first argument + 'fontsize like number but must be the last argument + 'range a pair of numbers like [#,#] or [#:#] + 'pair a pair of numbers with no punctuation and a prefix + 'file a quoted string and a file browser + 'string a quoted string with an optional prefix + 'string* an unquoted string with a prefix + 'format a quoted string and an info-link to (gnuplot)format + 'labels an array as needed for xtics, ytics, etc + 'position 2 or 3 comma separated numbers with an optional prefix + +DEFAULT is the default value for this option. Note that the default +for 'range and 'pair is a cons cell and the default for 'labels is a +list. For most things, the best choice of DEFAULT is a string of +white space or a cons cell of two strings of white space. Strings of +white space are better defaults than empty strings or nil. + +The value of REST depends upon TYPE: + + For 'list & REST is the list of options that will go into the + 'list* menu-button. This can also be a symbol which + evaluates to a list containing the options to go into + the menu-button. This list variable must contain the + DEFAULT. + For 'number REST is the prefix string (if it exists) for that number. + For 'range REST is the separator, \":\" for plot ranges and + \",\" for plot dimensions (see for example the tgif + terminal type) + For 'string & REST may a number denoting the width of the editable-text + 'string* field or it may be a string denoting a prefix. By + default, the width is half the width of the frame + and there is no prefix. It may be useful to + specify \"1\" when the input is a single character + as in 'set missing'. + For 'file REST determines the label placed before the file insertion + field. If non-nil, then TAG is used. If nil, then + the default \"File\" is used. + For 'position REST is the prefix and the number of comma separated numbers + For others REST is not used. + +Here is an example entry for the png terminal type: + + (cons \"png\" + '((\"SIZE\" 'list \" \" \"small\" \"medium\" \"large\") + (\"COLOR\" 'list \" \" \"monochrome\" \"gray\" \"color\"))) + +This alist is formed at load time by appending together +`gnuplot-gui-terminal-types', `gnuplot-gui-set-types' and +`gnuplot-gui-command-types'.") + +(setq gnuplot-gui-all-types (append gnuplot-gui-terminal-types + gnuplot-gui-set-types + gnuplot-gui-command-types + gnuplot-gui-plot-splot-fit + gnuplot-gui-test-type + )) + + +(defun gnuplot-gui-swap-simple-complete () + (interactive) + (setq gnuplot-gui-plot-splot-fit-style + (if (equal gnuplot-gui-plot-splot-fit-style 'complete) + 'simple 'complete)) + (if (equal gnuplot-gui-plot-splot-fit-style 'complete) + (progn + (setcdr (assoc "plot" gnuplot-gui-all-types) gnuplot-gui-plot-full-list) + (setcdr (assoc "splot" gnuplot-gui-all-types) gnuplot-gui-splot-full-list) + (setcdr (assoc "fit" gnuplot-gui-all-types) gnuplot-gui-fit-full-list)) + (setcdr (assoc "plot" gnuplot-gui-all-types) gnuplot-gui-plot-simple-list) + (setcdr (assoc "splot" gnuplot-gui-all-types) gnuplot-gui-splot-simple-list) + (setcdr (assoc "fit" gnuplot-gui-all-types) gnuplot-gui-fit-simple-list)) + (message "Using %s lists for plot, splot, and fit." + gnuplot-gui-plot-splot-fit-style) ) + + + + +;;; user interface to the widget-y stuff + +(defun gnuplot-gui-mouse-set (event) + "Use the mouse to begin setting options using a GUI interface. +EVENT is a mouse event. Bound to \\[gnuplot-gui-mouse-set] +Note that \"plot\", \"splot\", \"fit\", and \"cntrparam\" are not +currently supported." + (interactive "@e") + (when (fboundp 'widget-create) + (save-excursion + (mouse-set-point event) + (gnuplot-gui-set-options-and-insert)))) + +(defun gnuplot-gui-get-frame-param (param) + (if gnuplot-xemacs-p + (plist-get gnuplot-gui-frame-plist param) + (cdr (assoc param gnuplot-gui-frame-parameters)))) +(defun gnuplot-gui-set-frame-param (param value) + (if gnuplot-xemacs-p + (plist-put gnuplot-gui-frame-plist param value) + (setcdr (assoc param gnuplot-gui-frame-parameters) value))) + +(defun gnuplot-gui-set-options-and-insert () + "Insert arguments using a GUI interface. +Determine contents of current line and set up the appropriate GUI +frame. Bound to \\[gnuplot-gui-set-options-and-insert] +Note that \"cntrparam\" is not currently supported." + (interactive) + (when (fboundp 'widget-create) + (let ((begin (gnuplot-point-at-beginning-of-command)) + (end (save-excursion (end-of-line) (point-marker))) + (termin (concat "\\(,\\s-*" (regexp-quote "\\") "\\|;\\)")) + (set nil) (term nil)) + (save-excursion + ;; there can be more then one command per line + (if (re-search-forward termin end "to_limit") + (progn (backward-char (length (match-string 1))) + (setq end (point-marker)))) + (goto-char begin) + (skip-syntax-forward "-" end) + ;; various constructions are recognized here. at the end of this + ;; cond, point should be just after the word whose arguments are + ;; to be set + (cond ((looking-at "set\\s-+") + (setq set t) + (goto-char (match-end 0)) + (if (looking-at "\\sw+") (goto-char (match-end 0))) + (when (string-match "^ter" (gnuplot-this-word)) ; terminal? + (setq term t) + (forward-word 1)) + (when (string-match "^\\(da\\|fu\\)" (gnuplot-this-word)) + (unless (looking-at "\\s-+st") + (insert " style") (forward-word 1)) + (forward-word 1))) + ((looking-at (concat "\\(cd\\|ca\\|lo\\|pa\\|pr\\|sa\\|u\\)" + "\\w*" + "[\\s-\\']")) + (forward-word 1)) + ;;(goto-char (match-end 0))) + (t + (forward-word 1))) + (if (> (point) end) (goto-char end)) + (let* ((w (gnuplot-this-word)) + (wd (try-completion w gnuplot-gui-all-types)) + (word "") wrd list) + (cond ((equal wd t) (setq word w)) + ((equal wd nil) (setq word w)) + ((assoc wd gnuplot-gui-all-types) (setq word wd)) + (t (setq wd nil))) + (cond ((equal (string-match "^\\s-*$" w) 0) + (message "Blank line")) + ((and wd (stringp word)) + (gnuplot-gui-correct-command word set term begin) + (setq gnuplot-gui-alist nil + gnuplot-gui-current-string + (buffer-substring-no-properties (point) end)) + (gnuplot-gui-set-alist word gnuplot-gui-current-string) + (let* ((old-height (gnuplot-gui-get-frame-param 'height)) + (old-top (gnuplot-gui-get-frame-param 'top))) + (when (or + (and (equal gnuplot-gui-plot-splot-fit-style 'complete) + (member* word '("plot" "splot" "fit") + :test 'string=)) + (equal word "test")) + (gnuplot-gui-set-frame-param 'height 32) + (gnuplot-gui-set-frame-param 'top 50)) + (gnuplot-gui-prompt-for-frame word) + (when (or + (and (equal gnuplot-gui-plot-splot-fit-style 'complete) + (member* word '("plot" "splot" "fit") + :test 'string=)) + (equal word "test")) + (gnuplot-gui-set-frame-param 'height old-height) + (gnuplot-gui-set-frame-param 'top old-top)) )) + ((setq wrd (car (all-completions w '(("cntrparam"))))) + (message + "Setting arguments for %S is currently unsuported in gnuplot-mode" + wrd)) + ((setq list (all-completions w gnuplot-gui-all-types)) + (message "%S could be one of %S" w list)) + (t + (message + "%S is not a gnuplot command which takes options" w)))) )))) + +(defun gnuplot-gui-toggle-popup () + (interactive) + (setq gnuplot-gui-popup-flag (not gnuplot-gui-popup-flag)) + (message (if gnuplot-gui-popup-flag + "Argument popup will appear after insertions." + "Argument popup will no longer appear after insertions."))) + + +(defun gnuplot-gui-y-n (foo)) +(if gnuplot-xemacs-p + (defalias 'gnuplot-gui-y-n 'y-or-n-p-maybe-dialog-box) + (defalias 'gnuplot-gui-y-n 'y-or-n-p)) + +(defun gnuplot-gui-correct-command (word set term begin) + "Check syntax of set command and terminal specifications. +WORD is the item being set. SET and TERM are non-nil if the words +\"set\" and \"terminal\" were found preceding WORD in the buffer. +BEGIN is the beginning of the command." + (save-excursion + (cond ((assoc word gnuplot-gui-terminal-types) + (when (and (not (and set term)) + (gnuplot-gui-y-n + (format + "%S must be preceded by \"set terminal\". Add it? " + word))) + (backward-word 1) + (let ((e (point-marker))) + (goto-char begin) + (skip-syntax-forward "-" e) + (delete-region (point) e) + (insert "set terminal ")))) + ((assoc word gnuplot-gui-set-types) + (when (and (not set) + (gnuplot-gui-y-n + (format + "%S must be preceded by \"set\". Add \"set\"? " word))) + (backward-word 1) + (let ((e (point-marker))) + (goto-char begin) + (skip-syntax-forward "-" e) + (delete-region (point) e) + (insert "set ")))))) + (message nil)) + + + +;;; handle the actual arguments + +(defun gnuplot-gui-fix-arg-list (list) + "Correct the result of splitting `gnuplot-gui-current-string'. +LIST is the split string. This removes empty and all-blank strings +from the list and concatenates the strings that are part of a quoted +argument, for example an axis label or a font name. It also replaces +bounding single quotes with double quotes, since double quotes are +used in `gnuplot-gui-all-types'." + (let (fixed-list quote quoted) ; remove blanks + (setq list (remove* "\\s-+" list :test 'string-match) + list (remove* "" list :test 'string=)) + (while list ; concatinate parts of quoted string + (if (not (string-match "^\\([\]\[()'\"]\\)" (car list))) + (setq fixed-list (append fixed-list (list (car list)))) + (setq quote (match-string 1 (car list)) + quoted (car list)) + (if (string= quote "[") (setq quote "]")) + (if (string= quote "(") (setq quote ")")) + (while (and list + (or (equal (length quoted) 1) + (not (string-match (concat (regexp-quote quote) "$") + quoted)))) + (setq quoted (concat quoted " " (cadr list)) + list (cdr list))) + (if (string= quote "'") + (setq quoted (concat "\"" (substring quoted 1)) + quoted (concat (substring quoted 0 -1) "\""))) + (setq fixed-list (append fixed-list (list quoted)))) + (setq list (cdr list)) ) + fixed-list)) + +(defun gnuplot-gui-set-alist (word string) + "Set defaults for arguments, using text from buffer if appropriate. +WORD is the Gnuplot expression whose arguments are being set. STRING +is text from the buffer containing the previous values for WORD's +arguments." + (let ((alist (cdr (assoc word gnuplot-gui-all-types))) + (arg-list (gnuplot-gui-fix-arg-list (split-string string)) )) + ;; arg-list contains the arguments taken from the buffer + (setq gnuplot-gui-alist nil) + (while alist + (let* ((list (car alist)) + (tag (gnuplot-gui-type-tag list)) + (symbol (eval (gnuplot-gui-type-symbol list))) + (default (gnuplot-gui-type-default list)) + (prefix (gnuplot-gui-type-prefix list)) + (values (gnuplot-gui-type-list list)) + (this-cons (cond ((stringp default) (cons tag default)) + ((consp default) ; set cons valued default w/care + (cons tag (cons (car default) (cdr default)))) + (t (cons tag default)))) + (temp-list arg-list) ) + ;;(message "%S" temp-list) ; want to lop values off arg-list + ; as they are found + (if (symbolp (cadr values)) + (setq values (symbol-value (cadr values)))) + ;; check if an argument of this type is in arg-list + ;; set the current cons cell if it is + (while temp-list + (cond + ;; ---------------------------- list + ((member* symbol '(list list*) :test 'equal) + (let* ((case-fold-search nil) + (match-cons (member* (concat "^" (car temp-list)) + values :test 'string-match))) + (if (and (car match-cons) ; " " may be first elem. of list + (not (string= " " (car match-cons)))) + (setq this-cons (cons tag (car match-cons)) + arg-list (remove* (car temp-list) arg-list + :test 'string= :count 1) + temp-list nil) + (setq temp-list (cdr temp-list))))) + ;; ---------------------------- tag (first number in list) + ((equal symbol 'tag) + (if (string-match "^[-0-9.]+$" (car arg-list)) + (setq this-cons (cons tag (car arg-list)) + temp-list nil) + (setq temp-list (cdr temp-list))) ) + ;; ---------------------------- fontsize (last number in list) + ((equal symbol 'fontsize) + (if (string-match "^[-0-9.]+$" (car (last arg-list))) + (setq this-cons (cons tag (car (last arg-list))) + temp-list nil) + (setq temp-list (cdr temp-list))) ) + ;; ---------------------------- number with prefix + ((equal symbol 'number) + (cond ((and (string= prefix (car temp-list)) + (string-match "^[-0-9.]+$" (cadr temp-list))) + (setq this-cons (cons tag (cadr temp-list)) + arg-list (remove* (car temp-list) arg-list + :test 'string= :count 1) + arg-list (remove* (cadr temp-list) arg-list + :test 'string= :count 1) + temp-list nil)) + ;; --------------------- number without prefix + ((and (not prefix) + (string-match "^[-0-9.]+$" (car temp-list))) + (setq this-cons (cons tag (car temp-list)) + arg-list (remove* (car temp-list) arg-list + :test 'string= :count 1) + temp-list nil)) + (t + (setq temp-list (cdr temp-list))))) + ;; ---------------------------- pair with prefix + ((equal symbol 'pair) + (if (and (string= prefix (car temp-list)) + (string-match "^[-0-9.]+$" (cadr temp-list))) + (let ((this-car (cadr temp-list)) + (this-cdr (if (string-match "^[-0-9.]+$" (caddr temp-list)) + (caddr temp-list) ""))) + (setq this-cons (cons tag (cons this-car this-cdr)) + temp-list nil)) + (setq temp-list (cdr temp-list)))) + ;; ---------------------------- range + ((equal symbol 'range) + (if (string-match (concat "\\[\\s-*" ; opening bracket + "\\([^:, \t]*\\)" ; first argument + "\\s-*[:,]\\s-*" ; separator + "\\([^\] \t]*\\)" ; second argument + "\\s-*\\]") ; closing bracket + (car temp-list)) + (setq this-cons + (cons tag (cons (match-string 1 (car temp-list)) + (match-string 2 (car temp-list)))) + arg-list (remove* (car temp-list) arg-list + :test 'string= :count 1) + temp-list nil) + (setq temp-list (cdr temp-list)) )) + ;; ---------------------------- labels + ((equal symbol 'labels) + (if (string-match (concat "(" ; opening paren + "\\([^\)]*\\)" ; string + ")") ; closing paren + (car temp-list)) + (let* ((list (split-string (car temp-list) "[ \t(),]+")) + (list (remove* "" list :test 'string=)) + (return ())) + (while list + (if (string-match "['\"]\\([^'\"]*\\)['\"]" (car list)) + (setq return (append return + (list (match-string 1 (car list)))) + list (cdr list) + return (append return (list (car list))) ) + (setq return (append return (list "" (car list))))) + (setq list (cdr list)) ) + (setq this-cons (cons tag return) + arg-list (remove* (car temp-list) arg-list + :test 'string= :count 1) + temp-list nil)) + (setq temp-list (cdr temp-list))) ) + ;; ---------------------------- string, file, format + ((member* symbol '(string file format) :test 'equal) + (if (string-match (concat "['\"]" ; opening quote + "\\([^'\"]*\\)" ; string + "['\"]") ; closing quote + (car temp-list)) + (setq this-cons (cons tag (match-string 0 (car temp-list))) + arg-list (remove* (car temp-list) arg-list + :test 'string= :count 1) + temp-list nil) + (setq temp-list (cdr temp-list)) )) + ;; ---------------------------- string* + ((equal symbol 'string*) + (if (string= prefix (car temp-list)) + (setq this-cons (cons tag (cadr temp-list)) + arg-list (remove* (car temp-list) arg-list + :test 'string= :count 1) + arg-list (remove* (cadr temp-list) arg-list + :test 'string= :count 1) + temp-list nil) + (setq temp-list (cdr temp-list)) ) ) + ;; ---------------------------- other or unknown + (t + (setq temp-list nil)) + )) + (setq gnuplot-gui-alist + (append gnuplot-gui-alist (list this-cons)))) + (setq alist (cdr alist))) )) + + +(defun gnuplot-gui-post-process-alist (type) + "A few types need some additional processing. +'range, 'pair, and 'labels are cons or list valued and need to b made +into strings. This is called right before inserting the arguments +into the buffer. TYPE is the object whose arguments are being set." + (let ((alist gnuplot-gui-alist) + (types (cdr (assoc type gnuplot-gui-all-types))) ) + (while alist ;; loop thru alist looking for tyeps needing post-processing + (let* ((list (assoc (caar alist) types)) + (value (cdr (assoc (caar alist) gnuplot-gui-alist))) + (prefix (gnuplot-gui-type-prefix list)) + (symb (gnuplot-gui-type-symbol list)) ) + (cond + ;;-------------------------- flat text + ((equal (eval symb) 'text) + (setcdr (assoc (caar alist) gnuplot-gui-alist) "")) + ;;-------------------------- range [#:#] or [#,#] + ((equal (eval symb) 'range) + (if (and (string-match "^\\s-*$" (car value)) + (string-match "^\\s-*$" (cdr value))) + (setcdr (assoc (caar alist) gnuplot-gui-alist) "") + (setcdr (assoc (caar alist) gnuplot-gui-alist) + (concat "[" (car value) prefix (cdr value) "]")) ) ) + ;;-------------------------- pair + ((equal (eval symb) 'pair) + (if (and (string-match "^\\s-*$" (car value)) + (string-match "^\\s-*$" (cdr value))) + (setcdr (assoc (caar alist) gnuplot-gui-alist) "") + (setcdr (assoc (caar alist) gnuplot-gui-alist) + (concat prefix " " (car value) " " (cdr value) )) ) ) + ;;-------------------------- labels + ((equal (eval symb) 'labels) + (if (consp value) + (let ((word "") (list value)) + (while list + (if (string-match "^\\s-*$" (car list)) + (setq word (concat word (format "%s, " (cadr list)))) + (setq word (concat word (format "%S %s, " (car list) + (cadr list))))) + (setq list (cddr list)) ) + (setq value (concat "(" (substring word 0 -2) ")"))) + (setq value "") ) + (setcdr (assoc (caar alist) gnuplot-gui-alist) value) )) + + (setq alist (cdr alist))) ))) + + +;;; GUI frames + +(defun gnuplot-gui-prompt-for-frame (&optional option save-frame) + (setq option (or option (completing-read "Option: " gnuplot-gui-all-types + nil t nil t))) + (gnuplot-gui-make-frame + option (cdr (assoc option gnuplot-gui-all-types)) save-frame) ) + + +(defface gnuplot-gui-error-face '((((class color) (background light)) + (:foreground "grey30")) + (((class color) (background dark)) + (:foreground "grey70"))) + "Face used to display message about unknown widget types." + :group 'gnuplot-faces) + +(defface gnuplot-gui-flat-text-face '((((class color) (background light)) + (:foreground "MediumBlue")) + (((class color) (background dark)) + (:foreground "LightSteelBlue"))) + "Face used to display message about unknown widget types." + :group 'gnuplot-faces) + +(defun gnuplot-gui-make-frame (item alist &optional save-frame) + "Open the frame and populate it with widgets. +ITEM is the object for which arguments are being set. ALIST is +the alist of arguments for ITEM taken from `gnuplot-gui-all-types'. +SAVE-FRAME is non-nil when the widgets are being reset." + (unless save-frame + (setq gnuplot-current-frame (selected-frame) + gnuplot-current-buffer (current-buffer) + gnuplot-current-buffer-point (point-marker)) + (unless (and gnuplot-gui-frame (frame-live-p gnuplot-gui-frame)) + (setq gnuplot-gui-frame (if gnuplot-xemacs-p + (make-frame gnuplot-gui-frame-plist) + (make-frame gnuplot-gui-frame-parameters)))) + (select-frame gnuplot-gui-frame) + ;;(set-frame-position gnuplot-gui-frame 150 150) ;; so herky-jerky + (if gnuplot-xemacs-p + (set-mouse-position (selected-window) 0 0) + (set-mouse-position gnuplot-gui-frame 0 0))) + (kill-buffer (get-buffer-create "*Gnuplot GUI*")) + (switch-to-buffer (get-buffer-create "*Gnuplot GUI*")) + (kill-all-local-variables) + (if gnuplot-xemacs-p + (progn + (set (make-local-variable 'frame-title-format) + "Set Gnuplot Options") + (set (make-local-variable 'frame-icon-title-format) + "Set Gnuplot Options")) + (modify-frame-parameters (selected-frame) + '((title . "Set Gnuplot Options"))) ) + (widget-insert "\nSet options for \"" item "\" ") + (let (tag help val) + (cond ((string-match "^[xyz]2?tics" item) + (setq tag "info on tic labels" + help "Open a frame displaying the info entry for tic labels" + val "xtics")) + ((string-match "^no" item) + (setq tag (concat "info on " (substring item 2)) + help (format "Open a frame displaying the info entry for %S" + item) + val item)) + (t + (setq tag (concat "info on " item) + help (format "Open a frame displaying the info entry for %S" + item) + val item))) + (widget-create 'gnuplot-gui-info-link :tag tag :help-echo help :value val)) + + (widget-insert "\n\n") + (while alist + (let* ((this (car alist)) + (tag (gnuplot-gui-type-tag this)) + (wtype (gnuplot-gui-type-symbol this)) + (prefix (gnuplot-gui-type-prefix this)) + (default (cdr (assoc tag gnuplot-gui-alist))) + (list (gnuplot-gui-type-list this))) + (if (symbolp (cadr list)) + (setq list (symbol-value (cadr list)))) + (widget-insert "\t") ; insert the appropriate widget + (cond + ;;------------------------------ list, list* ------------ + ((member* (eval wtype) '(list list*) :test 'equal) + (let ((starred (if (equal (eval wtype) 'list*) t nil))) + (gnuplot-gui-menu-choice tag default list starred))) + ;;------------------------------ number, tag, fontsize -- + ((member* (eval wtype) '(number tag fontsize) :test 'equal) + (gnuplot-gui-number tag default prefix)) + ;;------------------------------ position --------------- + ;;------------------------------ range, pair ------------ + ((member* (eval wtype) '(range pair) :test 'equal) + (let ((is-range (equal (eval wtype) 'range))) + (gnuplot-gui-range tag default prefix is-range))) + ;;------------------------------ string, string* -------- + ((member* (eval wtype) '(string string*) :test 'equal) + (let ((starred (if (equal (eval wtype) 'string) nil t))) + (gnuplot-gui-string tag default prefix starred))) + ;;------------------------------ format ----------------- + ((equal (eval wtype) 'format) + (gnuplot-gui-format tag default)) + ;;------------------------------ file ------------------- + ((equal (eval wtype) 'file) + (gnuplot-gui-file tag default prefix)) + ;;------------------------------ labels ----------------- + ((equal (eval wtype) 'labels) + (gnuplot-gui-labels tag default)) + ;;------------------------------ text ------------------- + ((equal (eval wtype) 'text) + (let ((str (gnuplot-gui-type-default this))) + (put-text-property 0 (length str) 'face 'gnuplot-gui-flat-text-face str) + (widget-insert str "\n"))) + ;;------------------------------ unknown ---------------- + (t + (let ((str (concat "<" (downcase tag) "> ('" + (symbol-name (eval wtype)) + " arguments are not yet supported)\n"))) + (put-text-property 0 (length str) 'face 'gnuplot-gui-error-face str) + (widget-insert str)) ))) + (setq alist (cdr alist))) + ;; insert control buttons: [Set options] [Reset] [Clear] [Cancel] + (widget-insert "\n\t") + (widget-create 'push-button + :value "Set options" + :doc item + :button-face 'gnuplot-gui-button-face + :help-echo "Push this button to set options" + :notify + (lambda (widget &rest ignore) + (kill-buffer (get-buffer-create "*Gnuplot GUI*")) + (delete-frame) + (select-frame gnuplot-current-frame) + (switch-to-buffer gnuplot-current-buffer) + (goto-char gnuplot-current-buffer-point) + (gnuplot-gui-post-process-alist + (widget-get widget :doc)) + (let ((alist gnuplot-gui-alist) marker + (eol (save-excursion (end-of-line) (point-marker) )) ) + (if (re-search-forward ";" eol "to_limit") + (backward-char 1)) + (delete-region gnuplot-current-buffer-point (point-marker)) + (delete-horizontal-space) + (setq marker (point-marker)) + (while alist + (let ((val (cdar alist))) + (if (string-match "^\\s-+$" val) () + (if (string-match "^['\"]\\(.*\\)['\"]$" val) + (setq val (concat gnuplot-quote-character + (match-string 1 val) + gnuplot-quote-character))) + (insert (format " %s" val)))) + (setq alist (cdr alist))) + (setq eol (point-marker)) + (goto-char marker) + (while (< (point) eol) ; a few odd cases + (unless (looking-at (concat "[" (regexp-quote "(") + (regexp-quote "*") ",]")) + (just-one-space)) + (forward-sexp))) + (delete-horizontal-space) + (if (string= "terminal" (widget-get widget :doc)) + (gnuplot-gui-set-options-and-insert)) )) + (widget-insert " ") + (widget-create 'push-button :value "Reset" + :help-echo "Push this button to reset all values" + :button-face 'gnuplot-gui-button-face + :doc item + :notify + (lambda (widget &rest ignore) + (let ((word (widget-get widget :doc))) + (gnuplot-gui-set-alist word gnuplot-gui-current-string) + (gnuplot-gui-prompt-for-frame word t)))) + (widget-insert " ") + (widget-create 'push-button :value "Clear" + :help-echo "Push this button to clear all values" + :button-face 'gnuplot-gui-button-face + :doc item + :notify + (lambda (widget &rest ignore) + (let* ((word (widget-get widget :doc)) + (alist (cdr (assoc word gnuplot-gui-all-types)))) + (while alist + (setcdr (assoc (gnuplot-gui-type-tag (car alist)) + gnuplot-gui-alist) + (gnuplot-gui-type-default (car alist))) + (setq alist (cdr alist))) + (gnuplot-gui-prompt-for-frame word t))) ) + (widget-insert " ") + (widget-create 'push-button :value "Cancel" + :help-echo "Quit setting options and dismiss frame" + :button-face 'gnuplot-gui-button-face + :notify (lambda (widget &rest ignore) + (kill-buffer (get-buffer-create "*Gnuplot GUI*")) + (setq gnuplot-gui-alist nil + gnuplot-gui-current-string nil) + (delete-frame) + (select-frame gnuplot-current-frame))) + (goto-char (point-min)) + (use-local-map widget-keymap) + (widget-setup)) + + +;;; widgets + +(defface gnuplot-gui-menu-face '((((class color) (background light)) + (:bold t :foreground "darkolivegreen")) + (((class color) (background dark)) + (:bold t :foreground "seagreen")) + (t + (:italic t))) + "Face used for menu-buttons." + :group 'gnuplot-faces) +(defface gnuplot-gui-button-face '((((class color) (background light)) + (:bold t :foreground "sienna")) + (((class color) (background dark)) + (:bold t :foreground "tan")) + (t + (:italic t))) + "Face used for push-buttons. +Only used in Emacs. XEmacs displays push-buttons with a pixmap." + :group 'gnuplot-faces) +(defface gnuplot-gui-labels-face '((((class color) (background light)) + (:bold t :foreground "darkslateblue")) + (((class color) (background dark)) + (:bold t :foreground "lightslateblue")) + (t + (:italic t))) + "Face used for insert and delete button in the labels widget." + :group 'gnuplot-faces) + +(defun gnuplot-gui-menu-choice (item default list &optional starred) + "Create a menu widget for the Gnuplot GUI. +ITEM is the object whose arguments are set by this widget, DEFAULT +is the default argument value, LIST contains the items for the pop-up +menu. STARRED is true if this a 'list* widget." + (let ((widget + (apply 'widget-create + 'menu-choice :value default :tag item :doc starred + :button-face 'gnuplot-gui-menu-face + :button-prefix "[" :button-suffix "]" + :help-echo (format "Mouse-2 to view the %S menu" (downcase item)) + :notify + (lambda (widget &rest ignore) + (let ((lab (if (widget-get widget :doc) + (concat (downcase (widget-get widget :tag)) " ") + "" ))) + (setcdr (assoc (widget-get widget :tag) gnuplot-gui-alist) + (if (string= (widget-value widget) " ") "" + (format "%s%s" lab (widget-value widget))) ))) + (mapcar (lambda (x) (list 'item :value x)) + list)))) + (widget-value-set widget default) + (if (and starred (not (string-match "^\\s-*$" default))) + (setcdr (assoc item gnuplot-gui-alist) + (format "%s %s" (downcase item) default))) + widget)) + +(defun gnuplot-gui-number (item default &optional prefix) + "Create a number widget for the Gnuplot GUI. +ITEM is the object whose arguments are set by this widget, DEFAULT +is the default value for the widget, PREFIX is a text string preceding +the numerical argument." + (let ((help-label (or prefix (downcase item)))) + (widget-insert (capitalize item) ": ") + (widget-create 'editable-field + :size 2 :tag item :value default :doc prefix + :help-echo (format "Insert new value of %S here" help-label) + :notify (lambda (widget &rest ignore) + (let ((val (widget-value widget)) + (pre (concat (widget-get widget :doc) " "))) + (setcdr (assoc (widget-get widget :tag) + gnuplot-gui-alist) + (if (string-match + "^\\s-*[-0-9.*]+\\s-*$" val) + (format "%s%s" pre val) "") ))))) + (unless (string-match "^\\s-*$" default) + (setcdr (assoc item gnuplot-gui-alist) (format "%s %s" prefix default))) + (widget-insert " " (make-string (- 40 (current-column)) ?.) + " (numeric value)\n")) + +(defun gnuplot-gui-string (item default &optional width_or_prefix starred) + "Create a string widget for the Gnuplot GUI. +ITEM is the object whose arguments are set by this widget, DEFAULT is +the default value for the widget, and WIDTH_OR_PREFIX is the width of +the text entry field (which defaults to half the frame width) or the +prefix for the string. STARRED is t if quotes are not to be used." + (let ((help-label (downcase item)) width (prefix "") (pp "")) + (cond ((stringp width_or_prefix) + (setq prefix width_or_prefix + pp prefix) + (if starred (setq prefix (concat prefix "_star"))) ) + ((numberp width_or_prefix) + (setq width width_or_prefix))) + (setq width (or width (/ (frame-width) 2))) + (if (string-match "^['\"]" default) + (setq default (replace-match "" nil nil default))) + (if (string-match "['\"]$" default) + (setq default (replace-match "" nil nil default))) + (widget-insert (capitalize item) ": ") + (widget-create + 'editable-field + :size width :tag item :doc prefix :value default + :help-echo (format "Insert new value of %S here" help-label) + :notify (lambda (widget &rest ignore) + (let ((val (widget-value widget)) + (q gnuplot-quote-character) + (p (widget-get widget :doc)) ) + (setcdr (assoc (widget-get widget :tag) gnuplot-gui-alist) + (if (string-match "^\\s-*$" val) + "" + (progn + (if (string-match "_star$" p) + (setq p (concat (substring p 0 -5) " ") + q "")) + (if (string-match "^\\s-+" val) + (setq val (replace-match "" nil nil val))) + (if (string-match "\\s-+$" val) + (setq val (replace-match "" nil nil val))) + (format "%s%s%s%s" p q val q))))))) + (unless (string-match "^\\s-*$" default) + (setcdr (assoc item gnuplot-gui-alist) (format "%s %s" pp default))) + (widget-insert "\n"))) + +(defun gnuplot-gui-format (item default) + "Create a string widget for the Gnuplot GUI. +ITEM is the object whose arguments are set by this widget, DEFAULT is +the default value for the widget, and WIDTH_OR_PREFIX is the width of +the text entry field (which defaults to half the frame width) or the +prefix for the string." + (if (string-match "^['\"]" default) + (setq default (replace-match "" nil nil default))) + (if (string-match "['\"]$" default) + (setq default (replace-match "" nil nil default))) + (widget-insert (capitalize item) ": ") + (widget-create 'editable-field + :size (/ (frame-width) 3) :tag item :value default + :help-echo (format "Insert new format string here") + :notify (lambda (widget &rest ignore) + (let ((val (widget-value widget))) + (setcdr (assoc (widget-get widget :tag) + gnuplot-gui-alist) + (format "%s%s%s" + gnuplot-quote-character + val + gnuplot-quote-character))))) + (widget-insert " ") + (widget-create 'gnuplot-gui-info-link + :tag (concat "info on format") + :help-echo "Open a frame displaying the info entry for format" + :value "format") + (widget-insert "\n")) + + +;; swiped from widget-color-complete +(defun gnuplot-gui-file-completion (widget) + "Complete the filename in WIDGET." + (let* ((str (buffer-substring-no-properties (widget-field-start widget) + (point))) + (file (or (file-name-nondirectory str) "")) + (dir (or (file-name-directory str) "./")) + (val (file-name-completion file dir)) ) + (cond ((eq val t) + (message "Exact match")) + ((null val) + (error "Can't find completion for \"%s\"" str)) + ((not (string-equal str val)) + (insert (substring val (length file)))) + (t + (message "Making completion list...") + (let ((list (file-name-all-completions file dir))) + (with-output-to-temp-buffer "*Completions*" + (display-completion-list list))) + (message "Making completion list...done"))))) + +(defun gnuplot-gui-file (item default &optional tag) + "Create a file widget for the Gnuplot GUI. +ITEM is the object whose arguments is set by this widget, DEFAULT is +the default value for the argument. TAG is non-nil if ITEM rather than +\"File:\" is to be used as the tag." + (setq tag (if tag (capitalize item) "File")) + (if (string-match "^['\"]" default) + (setq default (replace-match "" nil nil default))) + (if (string-match "['\"]$" default) + (setq default (replace-match "" nil nil default))) + (let ((widg (widget-create + 'file + :value default :tag tag + :size (- (/ (frame-width) 2) 3) + :doc item :help-echo "Insert a filename here" + :complete 'gnuplot-gui-file-completion + :notify + (lambda (widget &rest ignore) + (setcdr (assoc (widget-get widget :doc) gnuplot-gui-alist) + (format "%s%s%s" gnuplot-quote-character + (widget-value widget) + gnuplot-quote-character)) )) )) + (widget-insert " ") + (widget-create + 'push-button :value "Browse" + :doc item :help-echo "Browse directories for a filename." + :parent widg + :notify (lambda (widget &rest ignore) + (let ((fname (file-relative-name (read-file-name "File: ") + default-directory)) + (q gnuplot-quote-character)) + (widget-value-set (widget-get widget :parent) fname) + (setcdr (assoc (widget-get widget :doc) gnuplot-gui-alist) + (format "%s%s%s" q fname q)) + (widget-setup)))) + (widget-insert "\n"))) + +(defun gnuplot-gui-labels (item default) + "Create a labels widget for the Gnuplot GUI. +ITEM is the object whose arguments is set by this widget, DEFAULT is +the default value for the argument." + (widget-create + '(editable-list + (list :inline t :tag "Tic label" + (string :tag "label" :size 10 + :help-echo "Enter the tic label here" ) + (string :tag " position" :size 10 + :help-echo "Enter an expression for the tic location here" ))) + :tag (capitalize item) + :value default + :format "%{%t%}:\n%v\t %i\n" + :entry-format "\t %i %d %v\n" + :button-face 'gnuplot-gui-labels-face + :notify (lambda (widget &rest ignore) + (setcdr (assoc (upcase (widget-get widget :tag)) + gnuplot-gui-alist) + (widget-value widget))))) + +(defun gnuplot-gui-range (item default separator is-range) + "Create a range or pair widget for the Gnuplot GUI. +ITEM is the object whose arguments are set by this widget, DEFAULT is +the default value for the widget, SEPARATOR is a text string preceding +the numerical argument, or the prefix for a pair operator. IS-RANGE +is non-nil if this is a 'range widget." + (widget-insert (capitalize item) ": ") + (if is-range (widget-insert "[")) + (widget-create 'editable-field + :size 4 :tag item :value (car default) + :help-echo (format "Insert the first value of the %S here" + (downcase item)) + :notify (lambda (widget &rest ignore) + (setcar (cdr (assoc (widget-get widget :tag) + gnuplot-gui-alist)) + (format "%s" (widget-value widget))))) + (if is-range (widget-insert separator) (widget-insert " ")) + (widget-create 'editable-field + :size 4 :tag item :value (cdr default) + :help-echo (format "Insert the second value of the %S here" + (downcase item)) + :notify (lambda (widget &rest ignore) + (setcdr (cdr (assoc (widget-get widget :tag) + gnuplot-gui-alist)) + (format "%s" (widget-value widget))))) + (if is-range (widget-insert "]")) + (widget-insert " " (make-string (- 39 (current-column)) ?.) + " (numeric values)\n")) + + +;; suppress compiler warning +;;(eval-when-compile (defun gnuplot-info-lookup-symbol (sym mode))) +(define-widget 'gnuplot-gui-info-link 'info-link + "A link to an info file for the Gnuplot GUI." + :action '(lambda (widget &optional event) + (let ((gnuplot-info-display 'frame)) + (if gnuplot-keywords-pending ; + (gnuplot-setup-info-look)) + (gnuplot-info-lookup-symbol (widget-value widget) + 'gnuplot-mode)))) + + +;;; just about done + +(provide 'gnuplot-gui) +;;;============================================================================ +;;; +;;; gnuplot-gui.el ends here