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). 16: Show in browse mode. 32: Show in layout mode. 64: Show in Script Workspace For compatibilty we also show items in the script workspace, where none of the three flags above is set. |
0 | Optional |
keyEquivalent | The key equivalent. Is shown right in the menu and can be pressed while menu is open. |
"T" | Optional Added in version 10.0. |
KeyEquivalentModifierMask | 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 Added in version 10.0. |
AvailabilityExpression | An optional expression to calculate when building the menu. The expression needs to return a boolean. Return 0 to hide menu entry or 1 to show it. If the expression won't compile, we hide the menu entry. Trace function will log the expressions with results to help debugging. To speed up menu building, we cache results, so if multiple entries hve the same calculation, we only perform it once. |
Optional Added in version 15.1. |
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 )
Add a menu command to print contact, which only shows up if we have primary key for contacts:
MBS( "SyntaxColoring.AddContextMenuCommand";
"Print Contact";
"MBS(\"FM.RunScript\"; \"Contacts\"; \"Print Contact\")"; // run a script
16; // show in browse mode
""; "";
"Not IsEmpty(Contacts::Primary Key)" )
// if current layout has no relationship to contacts, this errors and the menu entry doesn't show.
See also
- ListDialog.AddItemsToList
- ListDialog.GetSelectedTag
- ListDialog.SetPrompt
- ListDialog.ShowDialog
- Menubar.RunMenuCommand
- ScriptWorkspace.CurrentTab
- SyntaxColoring.Clear
- SyntaxColoring.ClearContextMenuCommands
- SyntaxColoring.ListContextMenuCommand
- SyntaxColoring.RemoveContextMenuCommand
Release notes
- Version 15.1
- Added AvailabilityExpression parameter to SyntaxColoring.AddContextMenuCommand function.
- Fixed memory issue for SyntaxColoring.AddContextMenuCommand causing crashes.
- Improved SyntaxColoring.AddContextMenuCommand to add entries to the menu, if you have a spelling suggestion.
- Improved SyntaxColoring.AddContextMenuCommand to better detect layout vs. browse mode.
- Version 15.0
- Improved SyntaxColoring.AddContextMenuCommand function to allow them to show in browse and layout mode.
- 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
- MBS Plugin 15.1 for Claris FileMaker
- MBS FileMaker Plugin, version 15.1pr3
- MBS FileMaker Plugin, version 15.1pr2
- MBS Plugin 15.0 for Claris FileMaker
- Extend the context menu for layout and browse mode in FileMaker
- 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
FileMaker Magazin
This function is free to use.
Created 18th October 2019, last changed 11st April 2025
