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

Reply via email to