MathGroup Archive 2009

[Date Index] [Thread Index] [Author Index]

Search the Archive

Clickable options

  • To: mathgroup at smc.vnet.net
  • Subject: [mg99571] Clickable options
  • From: Thomas Münch <thomas.muench at gmail.com>
  • Date: Fri, 8 May 2009 00:15:58 -0400 (EDT)
  • References: <gtnjqr$3e9$1@smc.vnet.net> <gtrl4a$1pp$1@smc.vnet.net>

[From former thread:  Introducing the Wolfram Mathematica Tutorial
Collection]

> Another user interface issue I would like to see -- it would be so
> nice to have some sort of "auto completion" mode your could turn on or
> off as you needed -- perhaps a template of the command as you type.
> Something that would supply the complete command and you simply change
> it as you go to fit your needs, plus once you have the basic command,
> there should be some way to modify it by perhaps right-clicking and
> have all the optional parameters displayed and you pick and choose
> which are needed. This would be so much more productive than looking
> up the command in the DC, reading thru pages and pages of options
> sometimes and finally finding the one that is needed, and then back to
> the notebook and type in the just found optional parameter.
>
> -Bob

Dear Bob -

there IS an autocompletion function - simply press Ctrl-K after the
first couple of characters of your function name.

As for the options of a function: Here is a nifty little routine that
I have written to do just what you want. Execute the following code,
which will create a small palette with 2 buttons. Then, highlight a
function name in your notebook (or simply have your cursor within or
directly after the function name, for example "Plot"), and press one
of the buttons. You will get another palette with all the options of
your function. Clicking one of the options will insert it into your
notebook (together with a preceding comma), including the default
value, which will be highlighted so that you can immediately start
typing to replace it with your value of choice, or keep clicking on as
many options as you want. Clicking on the question mark next to an
option will open the appropriate help page in the Documentation
Center. Clicking on the function name at the top of the palette will
open the function's help page.

Normally, the button 'Options (tooltips)' will be the preferred
choice, as you will get informative tooltips in your palette which
show you the default value of the option (when hovering over the
option name), and the usage of the option (when hovering over the
question mark). However, some functions have an enormous amount of
options. Try, for example, 'CreateWindow'. Then it can take quite some
time (several seconds) to create the  Options palette. But, the added
benefit of the tooltips might be worth the wait.

If you call the options for another function while an option palette
is still open, the currently open palette will be replaced by the new
one in a way that the top right corner of the new palette window is at
the same position as the previous one. To implement this, I save the
option palette notebook object in the global variable
$optionPaletteCreatedByThisFunction. (This behavior is a feature, as
people might want to move the palette to a second screen, and want it
to remember the position when they call the options for another
function). However, I am not sure that this is the perfect way to
implement it. If you move a wide palette window (many options, e.g.
for 'CreateWindow') off to the side, so that its right corner is far
off-screen, and call a narrow window (with few options, e.g.
'Column'), the new window will be invisible. Maybe someone has a
better idea.

Version restriction: This works only for version 7, as I am using
scroll bars within 'Pane'. It does sort of work with version 6, but
not really.

Note: The original idea for this came from Syd Geraghty, who should be
acknowledged for his work. We worked together to improve the
functionality of the code.

Here is the code:

makeOptionsButton[tooltips_: True] :=
 Button[If[tooltips, "Options (tooltips)", "Options (no tooltips)"],
  Module[{fun, clen, len, buttons, title, columns, opts,
    maxPanelHight = 800, windowPos, insert,
    maximumNumberOfColumns = 3, tooltipfunction},
   tooltipfunction =
    If[tooltips, # &,
     First];(*determines whether or not to show tooltips*)

   (*Extract the currently selected funtion*)
   SelectionMove[InputNotebook[], All, Word];
   fun = ToExpression@ NotebookRead[InputNotebook[]];
   SelectionMove[InputNotebook[], After, Word];
   If[Head[fun] =!= Symbol, Return[]];

   opts = Options[fun]; (*read the options*)
   len = Length[opts];
   columns = Max[1, Min[maximumNumberOfColumns, Ceiling[len/30]]];
   clen = Ceiling[len, columns];(*some numbers for formatting*)

   (*This is the function that inserts the option into the notebook \
when the button is pressed, and selects the option value*)
   insert[
     option_] := (NotebookWrite[InputNotebook[],
      RowBox[{",", ToBoxes[option[[1]]],
        StringJoin["\[", ToString@Head@option, "]"]}]];
     NotebookWrite[InputNotebook[], ToBoxes[option[[2]]], All]);

   If[len > 0,
    (* If fun has Options: *)
    buttons =
     Grid[{{tooltipfunction@
           Tooltip[
            ReleaseHold@
             MakeExpression@
              ButtonBox["\" ? \"",
               ButtonData ->
                "paclet:ref/" <> ToString[Evaluate[#[[1]]]],
               Appearance -> "Palette", BaseStyle -> "Link",
               ButtonFrame -> None], Evaluate[#[[1]]]::usage],
          tooltipfunction@
           Tooltip[
            Button[#[[1]], insert[#], Alignment -> Left,
             Appearance -> "Palette"],
            Column[{"Default value:", #}]]}}] & /@
      opts;(*For each option,
    create a 'help' button and a button for pasting the option*)
    buttons =
     Grid[Partition[PadRight[buttons, clen, ""],
        clen/columns]\[Transpose], Spacings -> {0, 0.05},
      Alignment -> Left];(*arrange into a Grid*)
    title =
     "Options for " <> ToString@fun <> "   (Click option to insert)",

    (* If fun does not have any Options: *)
    buttons =
     Style[ToString[fun] <> " does not have any Options", Bold,
White];
    title = "Usage of " <> ToString@fun
    ];

   (*Some code to keep the upper right corner of the new options \
palette window identical to the currently open one.*)
   With[{test =
      AbsoluteOptions[$optionPaletteCreatedByThisFunction,
       WindowMargins]},
    windowPos =
     If[Head[test] === List, test[[1, 2]], {{0, 0}, {0, 0}}];
    windowPos[[All, 1]] = Automatic];

   (*This closes the previous Options Pallette*)
   NotebookClose[$optionPaletteCreatedByThisFunction];

   (*This creates a new palette and assigns it to the global variable
\
$optionPaletteCreatedByThisFunction*)
   $optionPaletteCreatedByThisFunction =
    CreateWindow[
     PaletteNotebook[
      Column[{Tooltip[
         ToExpression@
          ButtonBox[Style[ToString[fun] <> " =BB", Bold],
           ButtonData -> "paclet:ref/" <> ToString[fun],
           BaseStyle -> "Link", ButtonFrame -> None],
         ToExpression[ToString[fun] <> "::usage"]],
        Pane[buttons, ImageSize -> {Automatic, {maxPanelHight}},
         Scrollbars -> Automatic]}], ShowStringCharacters -> False,
      WindowTitle -> title, Saveable -> False,
      WindowMargins -> windowPos]];
   ]]

CreatePalette[Row[makeOptionsButton /@ {True, False}],
  Saveable -> False, WindowTitle -> "Options for selected function"];


  • Prev by Date: Re: New Wolfram Tutorial Collection documentation is ready
  • Next by Date: Errorlistplot and array of graphs
  • Previous by thread: Re: couple of questions about ListPlot3D
  • Next by thread: Re: Clickable options