Staring to sort this one out as well
1. TooProxy.notifyResultObtained( boolean result ) is passed directly on to
setEnabled
public void notifyResultObtained( boolean result ) {
setEnabled(result);
}
2. This actually comes from the interface ILazyOpListener
3. This is called from LazyOpFilter ... which is a wrapper around a OpFilter
(probably for thread safety)
4. OpFilter contains the various objects that are defined by enablement xml
blob provided with a tool such as Polygon Tool
<modalTool
categoryId="net.refractions.udig.tool.edit.create"
class="net.refractions.udig.tools.edit.impl.PolygonTool"
icon="icons/etool16/new_polygon_mode.gif"
id="net.refractions.udig.tools.polygonEdit"
name="%edit.polygon.name"
onToolbar="true"
toolCursorId="arrowCursor"
tooltip="%edit.polygon.tooltip">
<cursor
hotspotX="10"
hotspotY="10"
image="icons/pointers/edit_source.gif"/>
<enablement>
<and>
<property
propertyId="net.refractions.udig.project.FeatureStoreResourceProperty"
expectedValue=""/>
<or>
<property propertyId="net.refractions.udig.project.ui.GeometryType"
expectedValue="com.vividsolutions.jts.geom.MultiPolygon"/>
<property propertyId="net.refractions.udig.project.ui.GeometryType"
expectedValue="com.vividsolutions.jts.geom.Polygon"/>
</or>
</and>
</enablement>
</modalTool>
5. Looking for where these are registered as listeners .. end up with only a
single listener provided
when LazyOpFilter is constructed. So they make a new one each time they need
enablement provided somewhere.
This is used by TooProxy constructor
OpFilter parseEnablement = EnablementUtil.parseEnablement(
extension.getNamespaceIdentifier()+"."+tool.getName(),
tool.getChildren("enablement")); //$NON-NLS-1$ //$NON-NLS-2$;
enablement = new LazyOpFilter(this, parseEnablement);
And by ToolManager.setEnabled( IMap map, Collection<? extends ToolCategory>
categories)
OpFilter enablesFor = item.getEnablesFor();
ILayer selectedLayer = map.getEditManager().getSelectedLayer();
assert enablesFor instanceof LazyOpFilter;
if( !(enablesFor instanceof LazyOpFilter) ){
enablesFor = new LazyOpFilter(item, enablesFor);
}
boolean accept = enablesFor.accept(selectedLayer);
item.setEnabled(accept);
So this is probably our best example
6. So either:
a) ModalItem provides us an event we can detect when enablement changes; or ..
b) We force our MapToolPalette stuff to implement ILazyOpListener in order to
be told about enablement state changes
--
Jody Garnett
_______________________________________________
User-friendly Desktop Internet GIS (uDig)
http://udig.refractions.net
http://lists.refractions.net/mailman/listinfo/udig-devel