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

Reply via email to