| /** |
| * 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 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * Florian Pirchner - Initial implementation |
| */ |
| package org.eclipse.osbp.vaaclipse.addons.ecview; |
| |
| import java.util.Collections; |
| import java.util.List; |
| |
| import javax.inject.Inject; |
| |
| import org.eclipse.e4.core.contexts.IEclipseContext; |
| import org.eclipse.e4.ui.model.application.MApplication; |
| import org.eclipse.e4.ui.model.application.commands.MBindingContext; |
| import org.eclipse.e4.ui.model.application.ui.MContext; |
| import org.eclipse.e4.ui.model.application.ui.MElementContainer; |
| import org.eclipse.e4.ui.model.application.ui.MUIElement; |
| import org.eclipse.e4.ui.model.application.ui.advanced.MPerspective; |
| import org.eclipse.e4.ui.model.application.ui.basic.MPart; |
| import org.eclipse.e4.ui.model.application.ui.menu.MMenuFactory; |
| import org.eclipse.e4.ui.model.application.ui.menu.MToolBar; |
| import org.eclipse.e4.ui.workbench.modeling.EModelService; |
| import org.eclipse.e4.ui.workbench.modeling.EPartService; |
| import org.eclipse.e4.ui.workbench.modeling.EPartService.PartState; |
| import org.eclipse.osbp.dsl.dto.lib.impl.DtoServiceAccess; |
| import org.eclipse.osbp.ecview.core.common.context.IViewContext; |
| import org.eclipse.osbp.ecview.core.common.model.core.YBeanSlot; |
| import org.eclipse.osbp.ecview.core.common.model.core.YView; |
| import org.eclipse.osbp.ecview.xtext.builder.participant.IECViewAddonsMetadataService; |
| import org.eclipse.osbp.runtime.common.filter.IDTOService; |
| import org.eclipse.osbp.runtime.common.state.ISharedStateContext; |
| import org.eclipse.osbp.runtime.common.state.ISharedStateContextProvider; |
| import org.eclipse.osbp.vaaclipse.addons.common.api.IE4Constants; |
| import org.eclipse.osbp.vaaclipse.addons.ecview.impl.Activator; |
| import org.osgi.util.tracker.ServiceTracker; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| /** |
| * The Class DynamicViewSupport. |
| */ |
| @SuppressWarnings("restriction") |
| public class DynamicViewSupport { |
| |
| /** The Constant ECVIEW_GENERIC__BINDING_CONTEXT. */ |
| private static final String ECVIEW_GENERIC__BINDING_CONTEXT = "org.eclipse.osbp.samples.carstore.ui.application.contexts.ecviewgeneric"; |
| |
| /** The Constant LOGGER. */ |
| private static final Logger LOGGER = LoggerFactory |
| .getLogger(DynamicViewSupport.class); |
| |
| /** The Constant PROP_VIEW_ID. */ |
| private static final String PROP_VIEW_ID = "org.eclipse.osbp.vaaclipse.addons.ecview.viewId"; |
| |
| /** The shared state provider. */ |
| @Inject |
| private ISharedStateContextProvider sharedStateProvider; |
| |
| /** The model service. */ |
| @Inject |
| private EModelService modelService; |
| |
| /** |
| * Instantiates a new dynamic view support. |
| */ |
| public DynamicViewSupport() { |
| } |
| |
| /** |
| * Opens a new generic ECView view. |
| * |
| * @param id |
| * the id |
| * @param label |
| * the label |
| * @param description |
| * the description |
| * @param iconURI |
| * the icon uri |
| * @param context |
| * the context |
| */ |
| @SuppressWarnings({ "rawtypes", "unchecked" }) |
| public void openNewGenericECViewView(String id, String label, |
| String description, String iconURI, IEclipseContext context) { |
| |
| MApplication app = context.get(MApplication.class); |
| EPartService partService = context.get(EPartService.class); |
| EModelService modelService = context.get(EModelService.class); |
| MUIElement activeElement = modelService.find(id, |
| context.get(MPerspective.class)); |
| |
| if (activeElement != null) { |
| // show the part |
| partService.activate((MPart) activeElement, true); |
| } else { |
| |
| YView yView = findViewModel(id); |
| if (yView == null) { |
| LOGGER.error("Could not find view for {}", id); |
| return; |
| } |
| |
| // determine the view category |
| String viewCategory = yView.getCategory(); |
| if (viewCategory == null) { |
| viewCategory = IE4Constants.ID__PARTSTACK__MAIN; |
| } |
| |
| // find a parent container for the category |
| MElementContainer container = null; |
| List<MElementContainer> containers = modelService.findElements(app, |
| null, MElementContainer.class, |
| Collections.singletonList(viewCategory), |
| EModelService.PRESENTATION); |
| if (!containers.isEmpty()) { |
| container = containers.get(0); |
| } else { |
| LOGGER.error("Could not container for category {}", |
| viewCategory); |
| return; |
| } |
| |
| MPart part = modelService.createModelElement(MPart.class); |
| part.setElementId(id); |
| part.setLabel(label); |
| part.setDescription(description); |
| part.setIconURI(iconURI); |
| part.setContributionURI(IE4Constants.BUNDLECLASS_GENERIC_ECVIEW_VIEWPART); |
| part.setCloseable(true); |
| part.setOnTop(true); |
| part.setToBeRendered(true); |
| part.setVisible(true); |
| part.getTags().add(EPartService.REMOVE_ON_HIDE_TAG); |
| MToolBar mToolbar = MMenuFactory.INSTANCE.createToolBar(); |
| part.setToolbar(mToolbar); |
| |
| // get the proper binding context for the generic ecview view |
| MBindingContext bindingContext = findBindingContext( |
| ECVIEW_GENERIC__BINDING_CONTEXT, app); |
| if (bindingContext != null) { |
| part.getBindingContexts().add(bindingContext); |
| } |
| |
| // |
| // create a child context and configure with the view model |
| // |
| IEclipseContext partContext = getContext(container).createChild(); |
| part.setContext(partContext); |
| initializePartContext(part, partContext, yView, id); |
| |
| // add the part to its container |
| container.getChildren().add(part); // Add part to stack |
| |
| // show the part |
| partService.showPart(part, PartState.ACTIVATE); // Show |
| } |
| } |
| |
| /** |
| * Find binding context. |
| * |
| * @param id |
| * the id |
| * @param app |
| * the app |
| * @return the m binding context |
| */ |
| private MBindingContext findBindingContext(String id, MApplication app) { |
| // initialize the binding context that should be used |
| List<MBindingContext> bindingContexts = app.getRootContext(); |
| for (MBindingContext b : bindingContexts) { |
| if (b.getElementId().equals(id)) { |
| return b; |
| } |
| MBindingContext result = findBindingContext(id, b.getChildren()); |
| if (result != null) { |
| return result; |
| } |
| } |
| |
| return null; |
| } |
| |
| /** |
| * Find binding context. |
| * |
| * @param id |
| * the id |
| * @param bindingContexts |
| * the binding contexts |
| * @return the m binding context |
| */ |
| private MBindingContext findBindingContext(String id, |
| List<MBindingContext> bindingContexts) { |
| // initialize the binding context that should be used |
| for (MBindingContext b : bindingContexts) { |
| if (b.getElementId().equals(id)) { |
| return b; |
| } |
| |
| MBindingContext result = findBindingContext(id, b.getChildren()); |
| if (result != null) { |
| return result; |
| } |
| } |
| |
| return null; |
| } |
| |
| /** |
| * Gets the context. |
| * |
| * @param parent |
| * the parent |
| * @return the context |
| */ |
| private IEclipseContext getContext(MUIElement parent) { |
| if (parent instanceof MContext) { |
| return ((MContext) parent).getContext(); |
| } |
| return modelService.getContainingContext(parent); |
| } |
| |
| /** |
| * Creates the context for a part that is already opened and was persisted |
| * in the user specific application model. |
| * |
| * @param part |
| * the part |
| * @return the y view |
| */ |
| public YView createPartContextForPersisted(MPart part) { |
| String viewId = part.getPersistedState().get(PROP_VIEW_ID); |
| if (viewId == null) { |
| return null; |
| } |
| |
| YView yView = findViewModel(viewId); |
| if (yView == null) { |
| return null; |
| } |
| |
| IEclipseContext context = part.getContext(); |
| String id = part.getElementId(); |
| |
| initializePartContext(part, context, yView, id); |
| |
| return yView; |
| } |
| |
| /** |
| * Creates a child context for the part that should be opened. |
| * |
| * @param part |
| * the part |
| * @param partContext |
| * the part context |
| * @param yView |
| * the y view |
| * @param id |
| * the id |
| */ |
| private void initializePartContext(MPart part, IEclipseContext partContext, |
| YView yView, String id) { |
| |
| // Store the view id in the part for later reloading |
| part.getPersistedState().put(PROP_VIEW_ID, yView.getName()); |
| |
| // initialize the context -> so no delegation to OSGi services is |
| // processed later |
| partContext.set(ISharedStateContext.class, null); |
| partContext.set(IDTOService.class, null); |
| |
| partContext.set(YView.class, yView); |
| |
| if (yView != null) { |
| // create shared state |
| if (yView.getSharedStateGroup() != null |
| && !yView.getSharedStateGroup().trim().equals("")) { |
| ISharedStateContext sharedState = sharedStateProvider |
| .getContext(yView.getSharedStateGroup(), null); |
| partContext.set(ISharedStateContext.class, sharedState); |
| } |
| |
| // put the main DTO service into the context |
| YBeanSlot yBeanSlot = yView |
| .getBeanSlot(IViewContext.MAIN_BEAN_SLOT); |
| if (yBeanSlot != null) { |
| @SuppressWarnings({ "unchecked" }) |
| IDTOService<Object> dtoService = (IDTOService<Object>) DtoServiceAccess |
| .getService(yBeanSlot.getValueType()); |
| partContext.set(IDTOService.class, dtoService); |
| } |
| } |
| } |
| |
| /** |
| * Tries to find the view model using the ecview addons service. |
| * |
| * @param viewId |
| * the view id |
| * @return the y view |
| */ |
| private YView findViewModel(String viewId) { |
| ServiceTracker<IECViewAddonsMetadataService, IECViewAddonsMetadataService> tracker = new ServiceTracker<IECViewAddonsMetadataService, IECViewAddonsMetadataService>( |
| Activator.getContext(), IECViewAddonsMetadataService.class, |
| null); |
| tracker.open(); |
| try { |
| IECViewAddonsMetadataService uiService = tracker |
| .waitForService(5000); |
| return uiService.getViewMetadata(viewId); |
| } catch (InterruptedException e) { |
| e.printStackTrace(); |
| } finally { |
| tracker.close(); |
| } |
| return null; |
| } |
| |
| } |