Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Eclipse Projects » Eclipse Scout » Get source from DataChangeEvent
Get source from DataChangeEvent [message #1856078] Sun, 20 November 2022 11:04 Go to next message
Mr Robot is currently offline Mr RobotFriend
Messages: 70
Registered: March 2020
Member
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 09:57 Go to previous message
Beat Schwarzentrub is currently offline Beat SchwarzentrubFriend
Messages: 205
Registered: November 2010
Senior Member
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: Fri Apr 19 18:18:19 GMT 2024

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

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

Back to the top