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"];