Handling INTViewer Events

There are several important events fired when application state changes. To be in sync with rest of application each layer has to subscribe for these events and properly handle them.

There is a class EventBroadcaster which is responsible for sending events and handling subscription. We modified HorizonLayer constructor and subscribe for following events:

DataSynchronizeEvent, PointDataEvent and WindowScaleEvent.

EVENT SUBSCRIPTION

public HorizonLayer(ILayeredWindow w, int id){
        super(w, id);
        EventBroadcaster.getInstance().subscribe(DataSynchronizeEvent.class, dataSynchronizeSubscriber, true);
        EventBroadcaster.getInstance().subscribe(PointDataEvent.class, horizonPointSubscriber, true);
        EventBroadcaster.getInstance().subscribe(WindowScaleEvent.class, windowScaleSubscriber, true);
    }

DataSynchronizeEvent is sent when user change selection in seismic layer, PointDataEvent is sent when someone modifies horizon data (we may have several layers pointing to the same data, WindowScaleEvent is propagated when user change window scale factor.

EventBroabcaster's subscribe method accepts event handler. We have three of them:

EVENT HANDLERS

IEventSubscriber<DataSynchronizeEvent> dataSynchronizeSubscriber =new IEventSubscriber<DataSynchronizeEvent>() {
            @Override
            public void onEvent(DataSynchronizeEvent event) {
                if(refLayer != event.getSource())
                    return;
                shape.clearData();
            }
        };
    IEventSubscriber<PointDataEvent> horizonPointSubscriber =  new IEventSubscriber<PointDataEvent>() {
            public void onEvent(PointDataEvent) {
                if(t.getData() != getData())
                    return;
                shape.clearData();
            }
        };
    IEventSubscriber<WindowScaleEvent> windowScaleSubscriber =  new IEventSubscriber<WindowScaleEvent>(){
        public void onEvent(WindowScaleEvent t) {
            if(t.getSource() == getWindow())
                updateDisplay();
        }
    };

As you can see event handling is simple - for DataSynchronizeEvent and PointDataEvent we just clear horizon shape. Next time it will paint itself properly. For WindowScaleEvent we call updateDisplay() which gets right transformation from seismic layer.

One important thing. We use a weak subscription (last argument in subscribe method indicates this), which means we don't have to unsubscribe explicitly. In that case Eventbroabcaster uses weak references to our subscribers.

So, there are no strong references VM will collect them. To make it working we have to create class fields and assign them subscribers we created. If we do something like this

WRONG WAY TO SUBSCRIBE

EventBroadcaster.getInstance().subscribe(DataSynchronizeEvent.class, 
      new IEventSubscriber<DataSynchronizeEvent>() {
            @Override
            public void onEvent(DataSynchronizeEvent event) {
                if(refLayer != event.getSource())
                    return;
                shape.clearData();
            },
       true);

VM immediately collects our subscriber, so no events will be received.