Skip to main content



      Home
Home » Eclipse Projects » Eclipse Scout » Get source from DataChangeEvent
Get source from DataChangeEvent [message #1856078] Sun, 20 November 2022 06:04 Go to next message
Eclipse UserFriend
Hello,

I was playing with dataChange events, and have one question.

This is example I was working on:


1. Example

Send event
ItemDataChangeEvent event = new ItemDataChangeEvent(invoiceObject, Invoice.class, ChangeStatus.Inserted, null, null);
					IDesktop.CURRENT.get().fireDataChangeEvent(event);


Attach listeners
@Override
	protected void execInitForm() {
		registerDataChangeListener(Invoice.class);
}


Reload data on when event is fired
@Override
	protected void execDataChanged(Object... dataTypes) {
		fetchInvoices();
	}


Everything is working ok, but my question is: How can I fetch source object from event in this example?

2. Example
I tried with another way, creating listener and geting event as parameter like this:
@Override
protected void execInitForm() {
	IDesktop.CURRENT.get().addDataChangeListener(new DataChangeListener(){
             //use dataChanged metod and get the event.
});
}


This example works also, but problem is listeners is registered everytime when I open form. So if I open and close form 6 times, listener will fire dataChange 6 times, even if I have:
unregisterDataChangeListener(Invoice.class);

on execDisposeForm...


Do I need manualy delete all listeners of that event in execInit and register it again to work?

Thank you


Re: Get source from DataChangeEvent [message #1856386 is a reply to message #1856078] Thu, 08 December 2022 04:57 Go to previous message
Eclipse UserFriend
Unforunately, you can't access the event data in execDataChanged(). This is a convenience function with a limited API. But you can easily add your own IDataChangeListener to the desktop. The dataChanged() callback gives you full access to the original event.

Your implementation is almost correct. Yes, you add the listener in execInitForm(), and remove it again in execDisposeForm(). However, you need to unregister the same listener instance.

Something like this:

public class MyForm extends AbstractForm {
  protected final IDataChangeListener m_dataChangeListener = this::dataChanged;

  @Override
  protected void execInitForm() {
    super.execInitForm();
    IDesktop desktop = IDesktop.CURRENT.get();
    if (desktop != null) {
      desktop.addDataChangeListener(m_dataChangeListener);
    }
  }

  @Override
  protected void execDisposeForm() {
    super.execDisposeForm();
    IDesktop desktop = IDesktop.CURRENT.get();
    if (desktop != null) {
      desktop.removeDataChangeListener(m_dataChangeListener);
    }
  }

  protected void dataChanged(DataChangeEvent event) {
    if (event instanceof MyCustomEvent) {
      // handle event
    }
  }
}


Regards,
Beat
Previous Topic:How get http request header fields?
Next Topic:Update parent form subTitle from inner WrappedFormField values
Goto Forum:
  


Current Time: Sun Jun 22 11:54:11 EDT 2025

Powered by FUDForum. Page generated in 0.07929 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top