Coding explore methods
An "explore method" is a customization that can be applied to a workspace object to specialize it in some way. Yes, that is a vague definition. More importantly, explore methods provide a way for you to add a custom tab to a workspace object, which you can use to do pretty much anything.
Explore methods are the things that you access from the Specialize tab. I call them explore methods because the Specialize tab used to be called the "Explore tab," and all the references in the code still use "explore". (Including that the tab itself is created in exploretab.m)
Explore methods live in the rave\exploremethods\ folder. Just like everything other rave plugin, each explore method goes in its own folder, whose name serves as the KEYWORD. All the files related to the explore method will also contain this KEYWORD, which is how Rave knows which files to use for which purposes.
In order for an explore method to be useable on a particular workspace object, one of the following conditions must be true:
- The explore method keyword is listed in the workspace object's graphproperties file under properties.exploremethods
- The workspace object key word is listed in the explore method's exploreproperties file under properties.workspaceobjects
This way, if you code a new workspace object you can let it access exising explore methods without having to change the explore methods' code, and if you code a new explore method you can let it access existing workspace objects without changing the workspace objects' code.
Each explore method requires 2 files, but will probably also have several "update" files that run in response to certain user actions and maybe other functions used by your uicontrol callbacks.
- exploreproperties<KEWORD> - this is similar to the graphproperties file used by workspace objects, although it contains fewer properties. Note that the properties stored in this file should all be static. You should not add your own properties to this file... those things should be stored in the workspace object's udata.explore field as described below. This file must contain the following properties:
- properties.longname = the string that appears in the menu on the Specialize tab. This is the name of this method that the user will see.
- properties.updates = a cell array of strings that lists the events and updates that trigger an update for this explore method. This list should contain all events that require an update for ANY workspace object, i.e. if the event causes some workspace objects to require an update, but others to not require an update, the event SHOULD appear in this list.
- makeuicontrols<KEYWORD> - this file creates the uicontrols on the Specialize tab that appear when the user selects this explore method from the menu on the Specialize tab. You can also store the callbacks for these uicontrols in this file, or you can put them in their own files. The output of this function is a row vector (must be a row) of handles of all objects that were created. (Rave will append this to handles.tabobjects for you; you shouldn't do that in this function). For most explore methods, this function should create a button that toggles the method on and off (although this doesn't make sense for all methods and is by no means required).
Everything else is optional, but you will probably have one or more "update" files with filenames using this naming convention:
raveupdateexplore<EXPLORE METHOD KEYWORD><UPDATE TYPE>
Rave will automatically run such files in response to the event specified by "update type".
You may also have other files containing functions that are used by this explore method, for example callbacks for the uicontrols created by the makeuicontrols function. Rave DOES NOT automatically run these functions, they would only run in response to being called as a uicontrol callback you define, or called from one of your other functions. For example, many explore methods have an "Enable" button created in their makeuicontrols function, and they have a function named "raveenable<KEYWORD>". Rave does not recognize this function name as being meaningful... it could be called anything. It is only referenced in the code for makeuincontrols as the callback function of the Enable button.
Overloading Explore Methods for Particular Workspace Objects
You can also "overload" the makeuicontrols function or any "update" function for a particular workspace object by including a file named:
- makeuicontrols<EXPLORE METHOD KEYWORD><WORKSPACE OBJECT KEYWORD>
- raveupdateexplore<EXPLORE METHOD KEYWORD><WORKSPACE OBJECT KEYWORD><UPDATE TYPE>
If you include any of these files, they will be used when you are working with the specified workspace object in place of the corresponding "generic" version of the function. You can use this syntax as an alternative to creating an entirely new explore method for a particular workspace object(s). This option may be preferable when the customization required for a particular workspace object is fairly minor. (Note: You are allowed to include only files named using this syntax and not include any generic versions of these functions. Just make sure that you include a function for every workspace object that uses this explore method, otherwise Matlab will give you a "function not found" error in any situation where Rave would normally have used the generic version of the function.)
Note: You cannot include a specialized version of the exploreproperties function. If you need to specialize the properties for a particular workspace object, you must create an entire new explore method.
For example, if your explore method's keyword is "zoomzoom" and it updates in response to the user changing the selection, and you need a special update behavior for histograms, you would include a function named:
Rave will run this function when you have a histogram that is using the zoomzoom explore method and the user changes the selected data for the dataset/analysis used by the histogram.
One potential issue is that these filenames can get very long. For example, raveupdateexplorezoomzoomhistogramisselected is 44 characters. The maximum allowable function name in matlab is 64 characters, so try not to use excessively long keywords.
How does Rave know which explore methods a workspace object is using?
It doesn't know unless you tell it.
You indicate that an explore method is "active" by appending its keyword to the field udata.explore.method, which is a cell array of strings. You should do this somewhere in one of the callbacks/functions for the explore method that serves as an activation function. Rave uses this list to determine when to run the update functions.
Similarly, you must take care to remove the method's keyword from udata.explorel.method when the method is turned off. (Use the setdiff function for this.)
Rave uses this information to determine which "update" functions to run in response to events. If you do not append the explore method keyword to this list, Rave will not run your update functions.