package com.dgex.offspring.application.addon;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.inject.Inject;
import org.apache.log4j.Logger;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.contexts.RunAndTrack;
import org.eclipse.e4.core.services.events.IEventBroker;
import org.eclipse.e4.ui.di.UISynchronize;
import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
import org.eclipse.e4.ui.workbench.UIEvents;
import org.eclipse.e4.ui.workbench.modeling.IWindowCloseHandler;
import org.eclipse.swt.widgets.Display;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
import com.dgex.offspring.application.utils.Shutdown;
import com.dgex.offspring.dataprovider.service.IDataProviderPool;
import com.dgex.offspring.nxtCore.service.INxtService;
public class QuitHandlerAddon {
static Logger logger = Logger.getLogger(QuitHandlerAddon.class);
@Inject
private IEventBroker broker;
@Inject
private UISynchronize sync;
private INxtService nxt;
private Display display;
private final IWindowCloseHandler quitHandler = new IWindowCloseHandler() {
@Override
public boolean close(final MWindow inWindow) {
logger.trace("IWindowCloseHandler.close");
return Shutdown
.execute(display.getActiveShell(), broker, sync, nxt, pool);
}
};
private final EventHandler eventHandler = new EventHandler() {
@Override
public void handleEvent(final Event inEvent) {
if (!UIEvents.isSET(inEvent)) {
return;
}
final Object lElement = inEvent.getProperty(UIEvents.EventTags.ELEMENT);
if (!(lElement instanceof MWindow)) {
return;
}
final MWindow lWindow = (MWindow) lElement;
if ("com.dgex.offspring.application.mainwindow".equals(lWindow
.getElementId())) {
logger.trace(UIEvents.Context.TOPIC_CONTEXT);
if (lWindow.equals(inEvent.getProperty("ChangedElement"))
&& lWindow.getContext() != null) {
lWindow.getContext().runAndTrack(new RunAndTrack() {
@Override
public boolean changed(final IEclipseContext inContext) {
final Object lHandler = inContext.get(IWindowCloseHandler.class);
if (!quitHandler.equals(lHandler)) {
inContext.set(IWindowCloseHandler.class, quitHandler);
}
return true;
}
});
}
}
}
};
private IDataProviderPool pool;
@PostConstruct
void hookListeners(INxtService nxt, Display display, IDataProviderPool pool) {
this.nxt = nxt;
this.display = display;
this.pool = pool;
broker.subscribe(UIEvents.Context.TOPIC_CONTEXT, eventHandler);
}
@PreDestroy
void unhookListeners() {
broker.unsubscribe(eventHandler);
}
}