/******************************************************************************* * Copyright (c) 2010, 2016 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.e4.ui.internal.di; import java.util.logging.Level; import java.util.logging.Logger; import javax.inject.Inject; import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.e4.core.di.annotations.Optional; import org.eclipse.e4.core.di.internal.extensions.EventObjectSupplier; import org.eclipse.e4.core.di.suppliers.ExtendedObjectSupplier; import org.eclipse.e4.core.di.suppliers.IObjectDescriptor; import org.eclipse.e4.core.di.suppliers.IRequestor; import org.eclipse.e4.ui.di.UIEventTopic; import org.eclipse.e4.ui.di.UISynchronize; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; import org.osgi.service.event.EventAdmin; import org.osgi.service.event.EventHandler; @Component(service = { ExtendedObjectSupplier.class, EventHandler.class }, property = { "dependency.injection.annotation=org.eclipse.e4.ui.di.UIEventTopic", "event.topics=" + IEclipseContext.TOPIC_DISPOSE }) public class UIEventObjectSupplier extends EventObjectSupplier { class UIEventHandler implements EventHandler { final protected IRequestor requestor; final private String topic; public UIEventHandler(String topic, IRequestor requestor) { this.topic = topic; this.requestor = requestor; } @Override public void handleEvent(org.osgi.service.event.Event event) { if (!requestor.isValid()) { unsubscribe(requestor); return; } addCurrentEvent(topic, event); requestor.resolveArguments(false); removeCurrentEvent(topic); if( uiSync == null ) { if (logger != null) logger.log(Level.WARNING, "No realm found to process UI event " + event); return; } else { uiSync.syncExec(new Runnable() { @Override public void run() { requestor.execute(); } }); } } } @Override @Reference public void setEventAdmin(EventAdmin eventAdmin) { super.setEventAdmin(eventAdmin); } @Inject protected UISynchronize uiSync; @Inject @Optional protected Logger logger; @Override protected EventHandler makeHandler(String topic, IRequestor requestor) { return new UIEventHandler(topic, requestor); } @Override protected String getTopic(IObjectDescriptor descriptor) { if (descriptor == null) return null; UIEventTopic qualifier = descriptor.getQualifier(UIEventTopic.class); return qualifier.value(); } }