APPLY button doesn't redraw layer with changed style
----------------------------------------------------
Key: UDIG-619
URL: http://jira.codehaus.org/browse/UDIG-619
Project: uDIG
Type: Bug
Components: style
Versions: UDIG 1.0.1
Environment: trunk!
Reporter: Diatchkov Vitali
Assigned to: Justin Deoliveira
Interesting bug!
When RenderExecutorImpl is created for specified renderer, the last one is
registered using RenderExecutorImpl .setRenderer(Renderer r) method.
We have shapefile, so two layers are created - LayerImpl (actual layer) and
SelectionLayer.
There are two renderers for them: ShapefileFeatureRenderer and
BasicFeatureRenderer
Now lets consider the following order of creating of executors for renderers:
1. ShapefileFeatureRenderer
2. BasicFeatureRenderer
When the method RenderExecutorImpl .setRenderer(Renderer r) is called wth a
instance of BasicFeatureRenderer as an argument,
RenderExecutorImpl.LayerListener instance is set to Layer instance in method:
==============
protected void addLayerListener(RenderContext context) {
if (context.getLayer() != null ) {
removeLayerListener(context);
context.getLayerInternal().eAdapters().add(layerListener);
}
}
=============
But just because of SelectionLayer is a decorator for actual LayerImpl, the
following method returns the same list of adapters in both cases when context
is for ShapefileFeatureRenderer instance and for BasicFeatureRenderer:
context.getLayerInternal().eAdapters()
In both cases different LayerListener instances will be added to one LayerImpl
!!! They will overwrite each other and only the last one will present in list
of adapters of LayerImpl.
But the problem that LayerListener contains different RendererExecutorImpl
(they are different for ShapefileFeatureRenderer and for BasicFeatureRenderer
instances).
So when BasicFeatureRenderer is registered in its own executor after
ShapefileFeatureRenderer has been registered - it overwrites LayerListener
instance from first step in list of adapters from LayerImpl, because
context.getLayerInternal().eAdapters() returns the same list of adapters for
LayerImpl and for its SelectionLayer.
Now we get a problem!!
When LayerImpl.setStyleBlackboard(... ) is called with new styles...
====================
public void notifyChanged( Notification msg ) {
Layer layer = (Layer) msg.getNotifier();
switch( msg.getFeatureID(Layer.class) ) {
case ProjectPackage.LAYER__STYLE_BLACKBOARD:
if (executor.getContext().getLayer() instanceof SelectionLayer)
return;
styleBlackboardChanged(msg);
break;
..........
==================
this method from LayerListener is called and in the next line we have the
following:
executor.getContext().getLayer()
returns SelectionLayer... because as mentioned above, executor object in this
LayerListener instance is for BasicFeatureRenderer (because it has been
registered last) , so it is for SelectionLayer and as a result
styleBlackboardChanged(msg); is not called!
Solution:
no need to register LayerListener in SelectionLayer
====================
class RenderExecutorImpl(.....
protected void addLayerListener(RenderContext context) {
if (context.getLayer() != null && !(context.getLayer()
instanceof SelectionLayer)) {
removeLayerListener(context);
context.getLayerInternal().eAdapters().add(layerListener);
}
}
...
====================
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira
_______________________________________________
User-friendly Desktop Internet GIS (uDig)
http://udig.refractions.net
http://lists.refractions.net/mailman/listinfo/udig-devel