blob: d3a3944b29c25ebdf0ccdb3bb46e1c329f613877 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 Kai Toedter, Rushan R. Gilmullin 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:
* Kai Toedter - initial API and implementation
* Rushan R. Gilmullin - adoption to vaaclipse and other changes
******************************************************************************/
package org.eclipse.osbp.vaaclipse.presentation.renderers;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import org.eclipse.e4.core.contexts.IEclipseContext;
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.workbench.modeling.EModelService;
import org.eclipse.osbp.commons.general.Condition;
import com.vaadin.ui.AbstractComponent;
import com.vaadin.ui.Component;
import com.vaadin.ui.ComponentContainer;
@SuppressWarnings("restriction")
public class VaadinRenderer implements GenericRenderer {
// public static final String OWNING_ME = "modelElement";
protected IEclipseContext context;
protected EModelService modelService;
@Override
public boolean isLazy() {
return false;
}
@PostConstruct
public void postConstruct(IEclipseContext context) {
this.context = context;
this.modelService = (EModelService) context.get(EModelService.class
.getName());
}
public void createWidget(MUIElement element,
MElementContainer<MUIElement> parent) {
}
public void disposeWidget(MUIElement element) {
}
public void processContents(MElementContainer<MUIElement> element) {
}
public void addChildGui(MUIElement child,
MElementContainer<MUIElement> element) {
throw new RuntimeException("addChildGui not implemented for renderer "
+ this);
}
public void removeChildGui(MUIElement element,
MElementContainer<MUIElement> parent) {
if (parent.getWidget() instanceof ComponentContainer
&& element.getWidget() != null) {
((ComponentContainer) parent.getWidget())
.removeComponent((Component) element.getWidget());
}
}
protected List<? extends MUIElement> filterRenderableAndVisibleElements(
MElementContainer<?> sash) {
List<MUIElement> renderableAndVisible = new ArrayList<MUIElement>();
for (MUIElement e : sash.getChildren()) {
if (e.isToBeRendered() && e.isVisible() && e.getWidget() != null /*
* element
* can
* be
* renderable
* but
* has
* no
* widget
* when
* removeGui
* called
* for
* element
*/)
renderableAndVisible.add(e);
}
return renderableAndVisible;
}
protected MUIElement findFirstRenderableAndVisibleElement(
MElementContainer<?> container) {
for (MUIElement p : container.getChildren()) {
if (p.isToBeRendered() && p.isVisible()) {
return p;
}
}
return null;
}
protected MUIElement findNextRendarableAndVisible(MUIElement element,
MElementContainer<MUIElement> parent) {
MUIElement nextRenderableAndVisible = null;
for (int i = parent.getChildren().indexOf(element) + 1; i < parent
.getChildren().size(); i++) {
MUIElement child = parent.getChildren().get(i);
if (child.isToBeRendered() && child.isVisible()
&& child.getWidget() != null) {
nextRenderableAndVisible = child;
break;
}
}
return nextRenderableAndVisible;
}
protected int indexOf(MUIElement element,
MElementContainer<MUIElement> parent) {
return indexOf(element, parent, null);
}
protected int indexOf(MUIElement element,
MElementContainer<MUIElement> parent,
Condition<MUIElement> condition) {
int i = 0;
for (MUIElement child : parent.getChildren()) {
boolean additionalConditionRes = condition != null ? condition
.check(child) : true;
if (child.isToBeRendered() && additionalConditionRes) {
if (child.equals(element))
return i;
i++;
}
}
return -1;
}
public void hookControllerLogic(MUIElement element) {
}
// public IEclipseContext getContext(MUIElement element) {
// if (element instanceof MContext) {
// return ((MContext) element).getContext();
// }
// IEclipseContext parentContext = getContextForParent(element);
// if (parentContext == null)
// return null; //element is not attached
// return parentContext.createChild();
// }
/**
* Return a context for this part.
*
* @param part
* the part to start searching from
* @return the closest context, or global context if none in the hierarchy
*/
public IEclipseContext getContext(MUIElement part) {
if (part instanceof MContext) {
return ((MContext) part).getContext();
}
return getContextForParent(part);
}
protected IEclipseContext getContextForParent(MUIElement element) {
return modelService.getContainingContext(element);
}
public void setVisible(MUIElement changedElement, boolean visible) {
((Component) changedElement.getWidget()).setVisible(visible);
}
public void unbindWidget(MUIElement element) {
if (element.getWidget() != null
&& element.getWidget() instanceof AbstractComponent) {
AbstractComponent component = (AbstractComponent) element
.getWidget();
component.setData(null);
}
}
@Override
public void bindWidget(MUIElement element) {
if (element.getWidget() != null
&& element.getWidget() instanceof AbstractComponent) {
AbstractComponent component = (AbstractComponent) element
.getWidget();
component.setData(element);
}
}
}