I’ve got another weird one in my Eclipse RCP based app.
In my architechture, I extend JGoView (ProcessJGoView) to act as visual editor for my domain model. For example, when the user draws a link between ports on two nodes, events are sent up to the domain model that create a data representation of that link. A number of different views listen to events on the domain model and update themselves accordingly.
In fact, my extension of the JGoDocument (ProcessJGoDocument) shown by the above ProcessJGoView is such a listener. So when the user draws a new link this is what I want to happen:
- The creation of the default new JGoLink in the JGoDocument is cancelled.
- An event is fired from ProcessJGoView to request the creation of the domain model’s analog to the link the user just indicated.
- Domain model creates the analog and fires an event to all listeners that this new element has been added.
- ProcessJGoDocument creates and adds a VisualLink (extension of JGoLink) to the document which creates the actual link the user indicated.
To do this I’ve overridden ProcessJGoView.newLink:
public void newLink(JGoPort from, JGoPort to) {
//Cancel the drawing of the link
doCancelMouse();
//Create a link
JGoLink link = new JGoLink(from, to);
//Send a request for a new link up the chain
fireUpdate(REQUEST_LINK_EVENT, 0, link);
}
This works beautifully when I first open the editor (Eclipse RCP) that contains the ProcessJGoView. But when I close the editor and then reopen it, then use the mouse to gesture a new link, the domain model updates correctly, but the new VisualLink is not displayed. An error occurs when trying to add it to the document with:
transitionLayer.addObjectAtTail(visualLink);
where transitionLayer is a JGoLayer where I locate such objects.
Specifically, somewhere in the call stack after this call it gets to the ProcessJGoView.checkWidget method (actually from org.eclipse.swt.widgets.Widget)
protected void checkWidget () {
Display display = this.display;
if (display == null) error (SWT.ERROR_WIDGET_DISPOSED);
if (display.thread != Thread.currentThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS);
if ((state & DISPOSED) != 0) error (SWT.ERROR_WIDGET_DISPOSED);
}
display for some reason is now null and so an exception is thrown and my new VisualLink is never displayed.
All of which is a long winded way of saying, do you see what I’m doing wrong? How did display get set to null? Am I forgetting something in newLink? Maybe it’s an Eclipse issue but I though I’d start with you.
Thanks!