package org.etsi.mts.tdl.graphical.sirius.part;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.LayoutManager;
import org.eclipse.draw2d.RectangleFigure;
import org.eclipse.draw2d.RoundedRectangle;
import org.eclipse.draw2d.StackLayout;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.gmf.runtime.notation.impl.NodeImpl;
import org.eclipse.sirius.diagram.business.internal.metamodel.spec.DNodeListSpec;
import org.eclipse.sirius.diagram.business.internal.metamodel.spec.DNodeSpec;
import org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures.SiriusWrapLabel;
import org.eclipse.sirius.viewpoint.DMappingBased;

public class Util {

	public static void disableOutlines(IFigure f) {
		
		if (f instanceof RectangleFigure)
			((RectangleFigure) f).setOutline(false);
		if (f instanceof RoundedRectangle)
			((RoundedRectangle) f).setOutline(false);
		
		if (f instanceof SiriusWrapLabel) {
			LayoutManager layout = f.getParent().getLayoutManager();
			if (layout == null)
				f.getParent().setLayoutManager(new StackLayout());
		}
		
		for (Object c: f.getChildren())
			disableOutlines((IFigure) c);
	}
	
    @SuppressWarnings({ "unchecked", "restriction", "rawtypes" })
	public static List getModelChildren(Object model) {
    	//this determines the order of compartments
    	//the current approach is not ideal and makes some unsound assumptions 
    	//but it does the job for the time being
        if(model!=null && model instanceof View){
        	ArrayList children = new ArrayList();
        	EList vc = ((View)model).getVisibleChildren();
        	for (Object c : vc) {
        		if (((NodeImpl)c).getElement() instanceof DNodeSpec || 
        				(((NodeImpl)c).getElement() instanceof DNodeListSpec) 
        				&& ((DNodeListSpec)((NodeImpl)c).getElement()).getActualMapping().getName().endsWith(".name")) {
        			children.add(c);
        		}        		
        	}
        	for (Object c : vc) {
        		if (!children.contains(c)) {
        			children.add(c);
        		}        		
        	}
            return children;
        }
        return Collections.EMPTY_LIST;
    }
    
    public static String getMappingId(IGraphicalEditPart part) {
		EObject semantic = part.resolveSemanticElement();
		if (semantic instanceof DMappingBased)
			return ((DMappingBased)semantic).getMapping().getName();
    	return null;
    }
}
