// // Copyright (c) 2008, Brian Frank and Andy Frank // Licensed under the Academic Free License version 3.0 // // History: // 21 Jul 08 Brian Frank Creation // using fwt ** ** Flux specialization of normal fwt commands. All FluxCommands ** are identified by a string id which is used to map the command ** in various APIs and bind to localized resources and key bindings. ** Command id should be globally scoped. Common built-in commands ** are identified with a simple string like "cut" and a constant ** in `CommandId`. Custom commands implemented by plugin pods should ** be prefixed with their pod name such as "imageEditor.resizeImage". ** ** All FluxCommands are assumed to be localized by mapping their name, ** icon, and default accelerator to a localized properties file. The ** default 'make' constructor routes to `fwt::Command.makeLocale`. ** ** If a FluxCommand supports undo/redo, then it should be posted to ** the 'View.commandStack'. However it should not maintain references ** to a specific view instance since the command stack is persisted ** between hyperlinks for a given URI. ** class FluxCommand : Command { ** ** Construct with id and optional pod. The pod defines where ** to look for localized name, icon, and default accelerator. ** If pod is omitted, it defaults to the "flux" pod. This ** method routes to `fwt::Command.makeLocale` where 'id' is ** passed as the 'keyBase'. ** ** The default accelerator is defined by the localized property ** definition. But we allow the user to redefine key bindings ** via `KeyOptions`. This constructor automatically checks for ** additional key bindings. ** new make(Str id, Pod pod := Flux#.pod) : super.makeLocale(pod, id) { this.id = id // check for explicit binding binding := KeyOptions.load.bindings[id] try { if (binding != null) accelerator = Key(binding) } catch Pod.of(this).log.err("FluxCommand: invalid syntax in @keysBindings '$id:$binding'") } ** ** The id serves as the string identifer for processing ** the command and looking up resources such as localization ** and key bindings. ** const Str id ** ** Get the flux Frame associated with this command. ** Frame? frame { get { return &frame ?: Desktop.focus?.window } internal set } ** ** Get the flux View associated with this command. ** View? view() { return frame?.view } }