| /** |
| * Copyright (c) 2011, 2014 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&Co.KG (69115 Heidelberg, Germany) |
| * 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: |
| * Florian Pirchner - Initial implementation |
| */ |
| package org.eclipse.osbp.vaaclipse.common.ecview; |
| |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.List; |
| |
| import javax.annotation.PostConstruct; |
| import javax.annotation.PreDestroy; |
| import javax.inject.Inject; |
| |
| import org.eclipse.e4.core.services.events.IEventBroker; |
| import org.eclipse.e4.ui.model.application.MApplication; |
| import org.eclipse.e4.ui.model.application.ui.advanced.MPerspective; |
| import org.eclipse.e4.ui.model.application.ui.basic.MWindow; |
| import org.eclipse.e4.ui.workbench.modeling.EModelService; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.osbp.ecview.core.common.context.IViewContext; |
| import org.eclipse.osbp.ecview.core.common.editpart.IViewEditpart; |
| import org.eclipse.osbp.ecview.core.common.model.core.YElement; |
| import org.eclipse.osbp.ecview.core.common.notification.ILifecycleEvent; |
| import org.eclipse.osbp.ecview.core.common.services.IWidgetAssocationsService; |
| import org.eclipse.osbp.vaaclipse.common.ecview.api.IECViewContainer; |
| import org.eclipse.osbp.vaaclipse.publicapi.events.IWidgetModelAssociations; |
| import org.osgi.service.event.Event; |
| import org.osgi.service.event.EventHandler; |
| |
| public class ECViewContainer implements IECViewContainer, EventHandler, IWidgetModelAssociations { |
| |
| private static final String ECVIEWS = "ecviews"; |
| |
| @Inject |
| private IEventBroker eventBroker; |
| |
| @Inject |
| private EModelService modelService; |
| |
| @Inject |
| private MApplication mApp; |
| |
| @Inject |
| private IWidgetModelAssociations masterAssociations; |
| |
| private List<IViewEditpart> views = Collections.synchronizedList(new ArrayList<IViewEditpart>()); |
| |
| @Override |
| public List<IViewEditpart> getECViews() { |
| return Collections.unmodifiableList(views); |
| } |
| |
| @Override |
| public void handleEvent(Event event) { |
| ILifecycleEvent lifecycle = (ILifecycleEvent) event.getProperty(IEventBroker.DATA); |
| if (lifecycle.getType().equals(ILifecycleEvent.CONTEXT_CREATED)) { |
| IViewEditpart editpart = (IViewEditpart) lifecycle.getEditpart(); |
| if (!views.contains(editpart)) { |
| views.add(editpart); |
| |
| MPerspective mPersp = modelService.getActivePerspective(mApp.getChildren().get(0)); |
| if (mPersp != null) { |
| @SuppressWarnings("unchecked") |
| List<IViewContext> contexts = (List<IViewContext>) mPersp.getTransientData().get(ECVIEWS); |
| if (contexts == null) { |
| contexts = new ArrayList<>(); |
| mPersp.getTransientData().put(ECVIEWS, contexts); |
| } |
| contexts.add(editpart.getContext()); |
| } |
| |
| } |
| } else if (lifecycle.getType().equals(ILifecycleEvent.CONTEXT_DISPOSED)) { |
| IViewEditpart editpart = (IViewEditpart) lifecycle.getEditpart(); |
| views.remove(editpart); |
| MPerspective mPersp = modelService.getActivePerspective(mApp.getChildren().get(0)); |
| if (mPersp != null) { |
| @SuppressWarnings("unchecked") |
| List<IViewContext> contexts = (List<IViewContext>) mPersp.getTransientData().get(ECVIEWS); |
| if (contexts != null) { |
| contexts.remove(editpart.getContext()); |
| } |
| } |
| } |
| } |
| |
| @PostConstruct |
| protected void setup() { |
| // lets register this manager as a thirdparty delegate to find |
| // assocations |
| masterAssociations.addThirdParty(this); |
| eventBroker.subscribe(IViewContext.TOPIC_LIFECYCLE, this); |
| } |
| |
| @PreDestroy |
| protected void destroy() { |
| eventBroker.unsubscribe(this); |
| masterAssociations.removeThirdParty(this); |
| } |
| |
| @Override |
| public EObject getElement(Object component) { |
| synchronized (views) { |
| for (IViewEditpart ep : views) { |
| IWidgetAssocationsService<Object, YElement> service = ep.getContext() |
| .getService(IWidgetAssocationsService.ID); |
| EObject result = service.getModelElement(component); |
| if (result != null) { |
| return result; |
| } |
| } |
| } |
| |
| return null; |
| } |
| |
| @Override |
| public Object getWidget(EObject element) { |
| if (!(element instanceof YElement)) { |
| return null; |
| } |
| synchronized (views) { |
| for (IViewEditpart ep : views) { |
| IWidgetAssocationsService<Object, YElement> service = ep.getContext() |
| .getService(IWidgetAssocationsService.ID); |
| Object result = service.getWidget((YElement) element); |
| if (result != null) { |
| return result; |
| } |
| } |
| } |
| |
| return null; |
| } |
| |
| @Override |
| public boolean addThirdParty(IWidgetModelAssociations e) { |
| throw new UnsupportedOperationException( |
| "Not allowed for a thirdparty assocation! Use the main assocation instance to register thirdparties."); |
| } |
| |
| @Override |
| public boolean removeThirdParty(IWidgetModelAssociations o) { |
| throw new UnsupportedOperationException( |
| "Not allowed for a thirdparty assocation! Use the main assocation instance to register thirdparties."); |
| } |
| |
| @Override |
| public List<IViewContext> getECViews(MPerspective perspective) { |
| MPerspective mPersp = modelService.getActivePerspective(mApp.getChildren().get(0)); |
| if (mPersp != null) { |
| @SuppressWarnings("unchecked") |
| List<IViewContext> contexts = (List<IViewContext>) mPersp.getTransientData().get(ECVIEWS); |
| if (contexts != null) { |
| return Collections.unmodifiableList(contexts); |
| } |
| } |
| return Collections.emptyList(); |
| } |
| |
| } |