blob: 37982dd6b2be35931c32b307fbfa90c15a050024 [file] [log] [blame]
/*
*
* Copyright (c) 2011, 2016 - 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
* Loetz GmbH&Co.KG
*
*/
package org.eclipse.osbp.vaadin.emf.data;
import java.net.URL;
import java.util.Set;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.osbp.runtime.web.vaadin.common.resource.IResourceProvider;
import org.eclipse.osbp.vaadin.emf.api.IModelingContext;
import org.eclipse.xtext.common.types.JvmDeclaredType;
import com.vaadin.data.Item;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.server.Resource;
/**
* The base container to provide SubTypes for a given type
* <p>
* ATTENTION: This container MUST be disposed!
*/
@SuppressWarnings("serial")
public class JvmSubTypesContainer extends IndexedContainer {
/** The Constant ICON. */
public static final String ICON = "icon";
/** The Constant KEY. */
public static final String LABEL = "LABEL";
/** The root element. */
private JvmDeclaredType rootElement;
/** The editing domain. */
@SuppressWarnings("unused")
private final EditingDomain editingDomain;
/** The adapter factory. */
private final AdapterFactory adapterFactory;
private final IResourceProvider resourceProvider;
private final SubTypesCallback callback;
/**
* Instantiates a new emf properties container.
*
* @param modelingContext
* the modeling context
* @param resourceProvider
* the resource provider
*/
public JvmSubTypesContainer(IModelingContext modelingContext,
IResourceProvider resourceProvider, SubTypesCallback callback) {
this.editingDomain = modelingContext.getEditingDomain();
this.adapterFactory = modelingContext.getAdapterFactory();
this.resourceProvider = resourceProvider;
this.callback = callback;
addContainerProperty(LABEL, String.class, "");
addContainerProperty(ICON, Resource.class, null);
}
/**
* Gets the root element.
*
* @return the root element
*/
public EObject getRootElement() {
return rootElement;
}
/**
* Sets the root element.
*
* @param rootElement
* the new root element
*/
@SuppressWarnings("unchecked")
public void setRootElement(JvmDeclaredType rootElement) {
if (this.rootElement == rootElement) {
return;
}
this.rootElement = rootElement;
removeAllItems();
if (rootElement != null) {
for (JvmDeclaredType subType : callback.getSubTypes(rootElement)) {
IItemLabelProvider labelProvider = (IItemLabelProvider) adapterFactory
.adapt(subType, IItemLabelProvider.class);
Item item = addItem(subType);
item.getItemProperty(LABEL).setValue(
labelProvider.getText(subType));
URL url = ((URL) labelProvider.getImage(subType));
item.getItemProperty(ICON).setValue(
resourceProvider.getResource(url.toString()));
}
}
}
/**
* Returns a set with sub types for the given root type.
*/
public interface SubTypesCallback {
/**
* Returns a set with sub types for the given root type.
*
* @param type
* @return
*/
Set<JvmDeclaredType> getSubTypes(JvmDeclaredType type);
}
}