One aspect that can be annoying when creating value models creating bindings for their enabled and visible states. The following shows a simple example where certain components are enabled and disabled based on the value of others.
In this screen, the “Use Proxy” is only enabled when “Automatically Check for Updates” is selected, and both the “Host” and “Port” fields are only enabled when both check boxes are selected.
To simplify this kind of operation I’ve been playing around with ANTLR grammars. First off, if you’re like me and have never built a language parser before, just go ahead and buy the book. Building an abstract syntax tree would have been near impossible without it.
So far I’ve been able to get a basic language up and going. The syntax is simple and lets you assign model properties from simple expressions involving other models, for example:
useProxy.enabled = checkForUpdates.value
This binds the enabled property of “useProxy” to the value of “checkForUpdates”. I also let you omit the “.value” for simplicity, so then we get:
useProxy.enabled = checkForUpdates
So state of the all the components in the above image is controlled by the three “bind” lines of code in the PresentationModel.
// install the value models... installValueModel("checkForUpdates", ..); installValueModel("useProxy", ..); installValueModel("proxyHost", ..); installValueModel("proxyPort", ..); // and create the bindings bind("useProxy.enabled = checkForUpdates"); bind("proxyHost.enabled = checkForUpdates && useProxy"); bind("proxyPort.enabled = checkForUpdates && useProxy");
Normally I don’t like putting code in strings, but in this case I think it’s worth it. To limit any possible issues the library barfs during the call to bind if any of the models are missing or don’t define the required properties.