Package at.bestsolution.efxclipse.runtime.workbench.renderers.base

Source Code of at.bestsolution.efxclipse.runtime.workbench.renderers.base.BasePlaceholderRenderer

/*******************************************************************************
* Copyright (c) 2012 BestSolution.at 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:
*     Tom Schindl<tom.schindl@bestsolution.at> - initial API and implementation
*******************************************************************************/
package at.bestsolution.efxclipse.runtime.workbench.renderers.base;

import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.inject.Inject;
import javax.inject.Named;

import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.ui.model.application.ui.MContext;
import org.eclipse.e4.ui.model.application.ui.MUIElement;
import org.eclipse.e4.ui.model.application.ui.advanced.MPlaceholder;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;

import at.bestsolution.efxclipse.runtime.workbench.renderers.base.widget.WLayoutedWidget;
import at.bestsolution.efxclipse.runtime.workbench.renderers.base.widget.WPlaceholderWidget;


@SuppressWarnings("restriction")
public abstract class BasePlaceholderRenderer<N> extends BaseRenderer<MPlaceholder, WPlaceholderWidget> {
 
  @Inject
  @Named(BaseWorkbenchRendererFactory.SHARED_ELEMENTS_MAP)
  private Map<MUIElement, Set<MPlaceholder>> renderedMap;
 
  private Set<MPlaceholder> getRenderedPlaceholders(MUIElement element) {
    Set<MPlaceholder> set = renderedMap.get(element);
    if( set == null ) {
      set = new HashSet<MPlaceholder>();
      renderedMap.put(element, set);
    }
   
    return set;
  }
 
  @Override
  protected void initWidget(MPlaceholder element, WPlaceholderWidget widget) {
    super.initWidget(element, widget);
   
    MUIElement ref = element.getRef();
    ref.setCurSharedRef(element);
   
    Set<MPlaceholder> set = getRenderedPlaceholders(ref);
    if( ! set.contains(element) ) {
      set.add(element);
    }
   
    @SuppressWarnings("unchecked")
    WLayoutedWidget<MUIElement> refWidget = (WLayoutedWidget<MUIElement>) ref.getWidget();
    if( refWidget == null ) {
      ref.setToBeRendered(true);
      refWidget = engineCreateWidget(ref,getContextForParent(ref));
    }
   
    widget.setContent(refWidget);
   
    if( ref instanceof MContext ) {
      IEclipseContext context = ((MContext) ref).getContext();
      IEclipseContext newParentContext = getModelContext(element);
      if (context.getParent() != newParentContext) {
        context.setParent(newParentContext);
      }
    }
  }
 
  @Override
  public void destroyWidget(MPlaceholder element) {
    MUIElement refElement = element.getRef();
   
    Set<MPlaceholder> set = renderedMap.get(refElement);
    if( set == null || ! set.remove(element) ) {
//      super.destroyWidget(element);
//      return;
    }
   
    // Last reference removed so we can destroy it
    if( set.isEmpty() ) {
      if (refElement instanceof MPart) {
        MPart thePart = (MPart) refElement;
        String imageURI = thePart.getIconURI();
        thePart.setIconURI(null);
        thePart.setIconURI(imageURI);
      }
      getPresentationEngine().removeGui(refElement);
    } else {
      IEclipseContext curContext = modelService.getContainingContext(element);
      MPlaceholder currentRef = refElement.getCurSharedRef();
      IEclipseContext newParentContext = modelService
          .getContainingContext(currentRef);
      List<MContext> allContexts = modelService.findElements(
          refElement, null, MContext.class, null);
      for (MContext ctxtElement : allContexts) {
        IEclipseContext theContext = ctxtElement.getContext();
        // this may be null if it hasn't been rendered yet
        if (theContext != null
            && theContext.getParent() == curContext) {
          // about to reparent the context, if we're the
          // active child of the current parent, deactivate
          // ourselves first
          if (curContext.getActiveChild() == theContext) {
            theContext.deactivate();
          }
          theContext.setParent(newParentContext);
        }
      }
    }
   
    super.destroyWidget(element);
  }
 
  @Override
  protected void doProcessContent(MPlaceholder element) {
   
  }

  @Override
  public void childRendered(MPlaceholder parentElement, MUIElement element) {
   
  }

  @Override
  public void hideChild(MPlaceholder container, MUIElement changedObj) {
   
  }
}
TOP

Related Classes of at.bestsolution.efxclipse.runtime.workbench.renderers.base.BasePlaceholderRenderer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.