Components | All | New | MacOS | Windows | Linux | iOS | ||||
Examples | Mac & Win | Server | Client | Guides | Statistic | FMM | Blog | Deprecated | Old |
SyntaxColoring.AddContextMenuCommand
Adds a new command for contextual menu.
Component | Version | macOS | Windows | Linux | Server | iOS SDK |
SyntaxColoring | 9.5 | ✅ Yes | ❌ No | ❌ No | ❌ No | ❌ No |
Parameters
Parameter | Description | Example | Flags |
---|---|---|---|
Title | The title for the menu command. If multi line, we build submenus based on the path descripted. If title is just "-", we add a separator. |
"MyCommands¶Hello" | |
Expression | The expression to evaluate in FileMaker when menu command is choosen. | ||
InstallWhen | Whether to enable only if selection is present. 0: always on (default) 1: need no row selected 2: need exactly one row selected 3: need one or more rows selected 4: need all rows selected Add 8 to allow for discontinuous selections (in version 10.0 or later). |
0 | Optional |
keyEquivalent | Available in MBS FileMaker Plugin 10.0 or newer. The key equivalent. Is shown right in the menu and can be pressed while menu is open. |
"T" | Optional |
KeyEquivalentModifierMask | Available in MBS FileMaker Plugin 10.0 or newer. The menu items's keyboard equivalent modifiers. NSShiftKeyMask is a valid modifier for any key equivalent in mask. This allows you to specify key-equivalents such as Command-Shift-1 that are consistent across all keyboards. However, with a few exceptions (such as the German "ß” character), a lowercase character with NSShiftKeyMask is interpreted the same as the uppercase character without that mask. For example, Command-Shift-c and Command-C are considered to be identical key equivalents. NSShiftKeyMask 131072 Shift Key NSControlKeyMask 262144 Control Key NSAlternateKeyMask 524288 Alternate/Option Key NSCommandKeyMask 1048576 Command Key |
524288 + 131072 | Optional |
Result
Returns OK or error.
Description
Adds a new command for contextual menu.Given commands are added to contextual menu in Script Workspace when right clicking on script steps.
Commands are stored in preferences file and can be removed via SyntaxColoring.ClearContextMenuCommands function.
If you use Clipboard.GetFileMakerData and Clipboard.SetFileMakerData functions, you can get the XML for the current step. You may want to use Menubar.RunMenuCommand to run cut/copy/paste/delete commands from the FileMaker menu with the respective command IDs: 57635 for cut, 57634 for copy, 57637 for paste, 57632 for delete and 57642 for select all.
Possible uses include commands
- to add new script steps.
- to check scripts for errors.
- to search and replace things
- to add common snippets, possibly using SQL or text file functions to read the XML for them.
- to pass script steps as XML to external tools.
Examples
Add a greeting command:
MBS( "SyntaxColoring.AddContextMenuCommand"; "Greeting"; "MBS(\"Msgbox\"; \"Hello World\")"; 0 )
Add a rename command for variable:
MBS( "SyntaxColoring.AddContextMenuCommand";
"Rename $I to $counter";
"Let ([ r = MBS( \"Menubar.RunMenuCommand\"; 57634 /* copy */ ); xml = MBS( \"Clipboard.GetFileMakerData\"; \"ScriptStep\" ); xml = Substitute ( xml; \"$i\"; \"$counter\"); r = MBS( \"Clipboard.SetFileMakerData\"; \"ScriptStep\"; xml ); r = MBS( \"Menubar.RunMenuCommand\"; 57637 /* paste */ ) ]; \"\" )"; 0 )
Add an insert loop command:
MBS( "SyntaxColoring.AddContextMenuCommand";
"Insert For Loop";
"Let ([
xml = \"<fmxmlsnippet type=\\\"FMObjectList\\\"><Step enable=\\\"True\\\" id=\\\"89\\\" name=\\\"# (comment)\\\"><Text>loop counting up from 1 to $count</Text></Step><Step enable=\\\"True\\\" id=\\\"141\\\" name=\\\"Set Variable\\\"><Value><Calculation><![CDATA[\\\"/* add count here */\\\"]]></Calculation></Value><Repetition><Calculation><![CDATA[1]]></Calculation></Repetition><Name>$count</Name></Step><Step enable=\\\"True\\\" id=\\\"141\\\" name=\\\"Set Variable\\\"><Value><Calculation><![CDATA[1]]></Calculation></Value><Repetition><Calculation><![CDATA[1]]></Calculation></Repetition><Name>$index</Name></Step><Step enable=\\\"True\\\" id=\\\"68\\\" name=\\\"If\\\"><Calculation><![CDATA[$index ≤ $count]]></Calculation></Step><Step enable=\\\"True\\\" id=\\\"71\\\" name=\\\"Loop\\\"></Step><Step enable=\\\"True\\\" id=\\\"89\\\" name=\\\"# (comment)\\\"><Text>your script steps here</Text></Step><Step enable=\\\"True\\\" id=\\\"89\\\" name=\\\"# (comment)\\\"></Step><Step enable=\\\"True\\\" id=\\\"89\\\" name=\\\"# (comment)\\\"><Text>next</Text></Step><Step enable=\\\"True\\\" id=\\\"141\\\" name=\\\"Set Variable\\\"><Value><Calculation><![CDATA[$index + 1]]></Calculation></Value><Repetition><Calculation><![CDATA[1]]></Calculation></Repetition><Name>$index</Name></Step><Step enable=\\\"True\\\" id=\\\"72\\\" name=\\\"Exit Loop If\\\"><Calculation><![CDATA[$index > $count]]></Calculation></Step><Step enable=\\\"True\\\" id=\\\"73\\\" name=\\\"End Loop\\\"></Step><Step enable=\\\"True\\\" id=\\\"70\\\" name=\\\"End If\\\"></Step></fmxmlsnippet>\";
r = MBS( \"Clipboard.SetFileMakerData\"; \"ScriptStep\"; xml );
r = MBS( \"Menubar.RunMenuCommand\"; 57637 /* paste */ )
]; \"\" )"; 0 )
Add a search and replace command:
MBS( "SyntaxColoring.AddContextMenuCommand";
"Search and Replace";
"Let ([
/* ask for search text via dialog */
ResetResult = MBS( \"Dialog.Reset\" );
ClearResult = MBS( \"Dialog.ClearFields\" );
MessageResult = MBS( \"Dialog.SetMessage\"; \"Search and replace in script:\" );
InfoResult = MBS( \"Dialog.SetInformativeText\"; \"Search text can include XML tags.\" );
Field1Result = MBS( \"Dialog.AddField\"; \"Search for:\" );
Field2Result = MBS( \"Dialog.AddField\"; \"Replace with:\" );
Button1Result = MBS( \"Dialog.SetDefaultButton\"; \"Replace\");
Button2Result = MBS( \"Dialog.SetAlternateButton\"; \"Cancel\");
DialogResult = MBS( \"Dialog.Run\" );
SearchText = MBS( \"Dialog.GetFieldText\"; 0 );
ReplaceText = MBS( \"Dialog.GetFieldText\"; 1 );
/* do replace */
r = If(DialogResult = \"Replace\"; Let([
/* copy script steps */
r = MBS( \"Menubar.RunMenuCommand\"; 57634 );
/* get XML from clipboard */
xml = MBS( \"Clipboard.GetFileMakerData\"; \"ScriptStep\" );
/* search and replace */
xml = Substitute ( xml; SearchText; ReplaceText);
/* put XML back on clipboard */
r = MBS( \"Clipboard.SetFileMakerData\"; \"ScriptStep\"; xml );
/* paste script steps */
r = MBS( \"Menubar.RunMenuCommand\"; 57637 )
]; 1))
];1)"; 3 )
Add an insert JSONSetElement command:
MBS( "SyntaxColoring.AddContextMenuCommand";
"Insert set variable for JSONSetElement";
"Let ([
xml = \"<fmxmlsnippet type=\\\"FMObjectList\\\"><Step enable=\\\"True\\\" id=\\\"141\\\" name=\\\"Variable setzen\\\"><Value><Calculation><![CDATA[JSONSetElement ( \" & Char(10) & \" \\\"{}\\\" ;\" & Char(10) & \" [ \\\"keyOrIndexOrPath\\\" ; \\\"value\\\" ; JSONString ] ;\" & Char(10) & \" [ \\\"keyOrIndexOrPath\\\" ; \\\"value\\\" ; JSONString ]¶)]]></Calculation></Value><Repetition><Calculation><![CDATA[1]]></Calculation></Repetition><Name>$json</Name></Step></fmxmlsnippet>\";
r = MBS( \"Clipboard.SetFileMakerData\"; \"ScriptStep\"; xml );
r = MBS( \"Menubar.RunMenuCommand\"; 57637 /* paste */ )
]; \"\" )"; 0 )
// we use Char(10) to get the new line in the XML. And we use \\\ to escape quotes in escaped calculation.
Add menu command to write script to desktop:
MBS( "SyntaxColoring.AddContextMenuCommand";
"Write script to desktop";
"MBS( \"Text.WriteTextFile\";
MBS( \"ScriptWorkspace.ScriptText\" );
MBS( \"Path.AddPathComponent\";
MBS( \"Folders.UserDesktop\" );
\"Script \" & substitute(substitute(MBS( \"ScriptWorkspace.CurrentTab\" ); \":\"; \"-\"); \"/\"; \"-\") & \".txt\" );
\"UTF-8\"
)"; 0 )
Add separator item:
MBS( "SyntaxColoring.AddContextMenuCommand"; "-"; "-"; 0 )
// needs version 10.0 of the plugin.
Add function header:
MBS( "SyntaxColoring.AddContextMenuCommand";
"Insert function header";
"Let ([
xml = \"<fmxmlsnippet type=\\\"FMObjectList\\\"><Step enable=\\\"True\\\" id=\\\"89\\\" name=\\\"# (comment)\\\"><Text>Description</Text></Step><Step enable=\\\"True\\\" id=\\\"89\\\" name=\\\"# (comment)\\\"><Text>Author</Text></Step><Step enable=\\\"True\\\" id=\\\"89\\\" name=\\\"# (comment)\\\"><Text>Modifications</Text></Step><Step enable=\\\"True\\\" id=\\\"89\\\" name=\\\"# (comment)\\\"></Step><Step enable=\\\"True\\\" id=\\\"85\\\" name=\\\"Allow User Abort\\\"><Set state=\\\"False\\\"></Set></Step><Step enable=\\\"True\\\" id=\\\"86\\\" name=\\\"Set Error Capture\\\"><Set state=\\\"True\\\"></Set></Step><Step enable=\\\"True\\\" id=\\\"89\\\" name=\\\"# (comment)\\\"></Step><Step enable=\\\"True\\\" id=\\\"141\\\" name=\\\"Set Variable\\\"><Value><Calculation><![CDATA[Get(ScriptParameter)]]></Calculation></Value><Repetition><Calculation><![CDATA[1]]></Calculation></Repetition><Name>$param</Name></Step><Step enable=\\\"True\\\" id=\\\"89\\\" name=\\\"# (comment)\\\"></Step><Step enable=\\\"True\\\" id=\\\"89\\\" name=\\\"# (comment)\\\"></Step><Step enable=\\\"True\\\" id=\\\"89\\\" name=\\\"# (comment)\\\"></Step><Step enable=\\\"True\\\" id=\\\"141\\\" name=\\\"Set Variable\\\"><Value><Calculation><![CDATA[\\\"\\\"]]></Calculation></Value><Repetition><Calculation><![CDATA[1]]></Calculation></Repetition><Name>$result</Name></Step><Step enable=\\\"True\\\" id=\\\"103\\\" name=\\\"Exit Script\\\"><Calculation><![CDATA[$result]]></Calculation></Step></fmxmlsnippet>\";
r = MBS( \"Clipboard.SetFileMakerData\"; \"ScriptStep\"; xml );
r = MBS( \"Menubar.RunMenuCommand\"; 57637 /* paste */ )
]; \"\" )"; 0 )
Add command to paste snippet from folder picked by dialog:
// put snippets as xml files into ~/Library/Application Support/FileMaker/Snippets folder.
MBS( "SyntaxColoring.AddContextMenuCommand";
"Insert snippet from snippet folder";
"Let([
Path = MBS( \"Path.AddPathComponent\"; MBS( \"Folders.UserHome\" ); \"Library\"; \"Application Support\"; \"FileMaker\"; \"Snippets\");
Files = MBS( \"Files.List\"; Path; 1+4);
Names = MBS( \"List.RemovePostfix\"; Files; \".xml\"; 1);
r = MBS( \"ListDialog.Reset\" ) & MBS( \"ListDialog.AddItemsToList\"; Names; Files) & MBS( \"ListDialog.SetPrompt\"; \"Choose snippet to insert:\" );
answer = MBS( \"ListDialog.ShowDialog\" );
r = If(answer = \"OK\"; MBS( \"Clipboard.SetFileMakerData\"; \"ScriptStep\"; MBS( \"Text.ReadTextFile\"; MBS( \"Path.AddPathComponent\"; Path; MBS( \"ListDialog.GetSelectedTag\" )); \"UTF-8\") ) & MBS( \"Menubar.RunMenuCommand\"; 57637 /* paste */ ))]; 0)"; 0 )
Add duplicate context menu entry:
MBS( "SyntaxColoring.AddContextMenuCommand"; "Duplicate";
"Let ([ r = MBS( \"Menubar.RunMenuCommand\"; 49182 /* duplicate */ )]; \"\" )"; 3 )
See also
- ListDialog.AddItemsToList
- ListDialog.SetPrompt
- ListDialog.ShowDialog
- Menubar.RunMenuCommand
- ScriptWorkspace.ScriptText
- SyntaxColoring.Clear
- SyntaxColoring.ListContextMenuCommand
- SyntaxColoring.RemoveContextMenuCommand
- Text.ReadTextFile
- Text.WriteTextFile
Release notes
- Version 10.0
- Added keyEquivalent and KeyEquivalentModifierMask parameters to SyntaxColoring.AddContextMenuCommand function.
- Added option for SyntaxColoring.AddContextMenuCommand to create separator items.
- Added option to SyntaxColoring.AddContextMenuCommand to mark whether a command can work with discontinuous selections.
- Version 9.5
Example Databases
Blog Entries
- Goodies 33: Custom context menu commands for FileMaker ScriptWorkspace
- Adding ChatGPT to the ScriptWorkspace context menu
- MBS FileMaker Plugin 10.0 - More than 6000 Functions In One Plugin
- Formatting and error checking expressions in FileMaker
- New functions of the MBS Plugin Version 9.5
- Insert snippet for FileMaker on Windows
- MBS FileMaker Plugin 9.5 video
- Add a search and replace command for FileMaker Script Workspace
- MBS FileMaker Plugin 9.5 - More than 5900 Functions In One Plugin
- Custom context menu commands for FileMaker ScriptWorkspace
FileMaker Magazin
This function is free to use.
Created 18th October 2019, last changed 14th July 2022