/*******************************************************************************
* Copyright (c) 2008 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.smooks.graphical.editors;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.util.FeatureMap;
import org.eclipse.emf.ecore.util.FeatureMapUtil;
import org.eclipse.emf.edit.command.CommandParameter;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
import org.eclipse.gef.palette.CombinedTemplateCreationEntry;
import org.eclipse.gef.palette.ConnectionCreationToolEntry;
import org.eclipse.gef.palette.MarqueeToolEntry;
import org.eclipse.gef.palette.PaletteDrawer;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.palette.SelectionToolEntry;
import org.eclipse.gef.requests.CreationFactory;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.jboss.tools.smooks.configuration.SmooksConfigurationActivator;
import org.jboss.tools.smooks.configuration.editors.GraphicsConstants;
import org.jboss.tools.smooks.configuration.editors.utils.SmooksUIUtils;
import org.jboss.tools.smooks.editor.ISmooksModelProvider;
import org.jboss.tools.smooks.gef.tree.model.TriggerConnection;
import org.jboss.tools.smooks.model.javabean12.BeanType;
import org.jboss.tools.smooks.model.smooks.ConditionType;
import org.jboss.tools.smooks.model.smooks.SmooksResourceListType;
/**
* @author Dart dpeng@redhat.com
*
*/
public class SmooksGraphicalEditorPaletteRootCreator {
protected AdapterFactoryEditingDomain editingDomain;
protected SmooksResourceListType resourceList;
protected ISmooksModelProvider smooksModelProvider;
public SmooksGraphicalEditorPaletteRootCreator(ISmooksModelProvider provider,
AdapterFactoryEditingDomain editingDomain, SmooksResourceListType resourceList) {
this.editingDomain = editingDomain;
this.resourceList = resourceList;
this.smooksModelProvider = provider;
}
protected CreationFactory createConnectionCreationFactory() {
return new CreationFactory() {
public Object getObjectType() {
return TriggerConnection.class;
}
public Object getNewObject() {
return null;
}
};
}
public PaletteRoot createPaletteRoot() {
PaletteRoot root = new PaletteRoot();
PaletteDrawer drawer = new PaletteDrawer(Messages.SmooksGraphicalEditorPaletteRootCreator_General_Palette_Drawer);
drawer.add(new SelectionToolEntry());
drawer.add(new MarqueeToolEntry());
CreationFactory factory = createConnectionCreationFactory();
ImageRegistry imageRegistry = SmooksConfigurationActivator.getDefault().getImageRegistry();
drawer.add(new ConnectionCreationToolEntry(Messages.SmooksGraphicalEditorPaletteRootCreator_Link_Tool_Text, Messages.SmooksGraphicalEditorPaletteRootCreator_Link_Tool_Tooltip, factory, imageRegistry
.getDescriptor(GraphicsConstants.IMAGE_LINK16), imageRegistry
.getDescriptor(GraphicsConstants.IMAGE_LINK24)));
root.add(drawer);
return root;
}
private boolean isIgnoreType(Object element) {
if (element instanceof ConditionType) {
return true;
}
return false;
}
private void fillDrawer(PaletteDrawer drawer, Collection<?> allchildren) {
for (Iterator<?> iterator = allchildren.iterator(); iterator.hasNext();) {
Object object = (Object) iterator.next();
if (object instanceof CommandParameter) {
Object v = ((CommandParameter) object).getValue();
v = AdapterFactoryEditingDomain.unwrap(v);
v = EcoreUtil.copy((EObject) v);
IItemLabelProvider itemLabelProvider = (IItemLabelProvider) editingDomain.getAdapterFactory().adapt(v,
IItemLabelProvider.class);
String entryName = null;
ImageDescriptor smallImage = null;
if (itemLabelProvider != null) {
entryName = itemLabelProvider.getText(v);
Object imageObj = itemLabelProvider.getImage(v);
smallImage = ExtendedImageRegistry.getInstance().getImageDescriptor(imageObj);
}
if (SmooksUIUtils.isUnSupportElement(smooksModelProvider.getPlatformVersion(), (EObject) v)) {
continue;
}
if (isIgnoreType(v)) {
continue;
}
EClass clazz = ((EObject) v).eClass();
Object newModel = ((CommandParameter) object).getValue();
if (newModel instanceof FeatureMap.Entry) {
v = FeatureMapUtil.createEntry(((FeatureMap.Entry) newModel).getEStructuralFeature(), v);
}
if (entryName == null) {
entryName = clazz.getName();
}
EStructuralFeature feature = ((CommandParameter) object).getEStructuralFeature();
CombinedTemplateCreationEntry toolEntry = new CombinedTemplateCreationEntry(entryName, entryName,
new SmooksModelCreationFactory(v, feature), smallImage, smallImage);
drawer.add(toolEntry);
if (needtToCreateChildrenEntry(v)) {
IEditingDomainItemProvider provider = (IEditingDomainItemProvider) editingDomain
.getAdapterFactory().adapt(v, IEditingDomainItemProvider.class);
fillDrawer(drawer, provider.getNewChildDescriptors(v, editingDomain, null));
}
}
}
}
private boolean needtToCreateChildrenEntry(Object element) {
if (element instanceof BeanType) {
return true;
}
// if (element instanceof BindingsType) {
// return true;
// }
return false;
}
public class SmooksModelCreationFactory implements CreationFactory {
private Object type = null;
private Object model;
public SmooksModelCreationFactory(Object model, Object type) {
this.model = model;
this.type = type;
}
public Object getNewObject() {
return model;
}
public Object getObjectType() {
return type;
}
}
}