package bluej.stride.framedjava.elements;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

import bluej.debugger.gentype.ConstructorReflective;
import bluej.stride.framedjava.ast.FrameFragment;
import bluej.stride.framedjava.ast.TypeSlotFragment;
import bluej.stride.generic.AssistContentThreadSafe;
import bluej.stride.generic.InteractionManager;
import nu.xom.Attribute;
import nu.xom.Element;
import nu.xom.Elements;
import threadchecker.OnThread;
import threadchecker.Tag;
import bluej.parser.ExpressionTypeInfo;
import bluej.parser.entity.EntityResolver;
import bluej.stride.framedjava.ast.JavaFragment.PosInSourceDoc;
import bluej.stride.framedjava.ast.JavaSource;
import bluej.stride.framedjava.ast.Loader;
import bluej.stride.framedjava.errors.SyntaxCodeError;
import bluej.stride.framedjava.frames.TopLevelFrame;
import bluej.stride.framedjava.slots.ExpressionSlot;

public interface TopLevelCodeElement
{       

   
    
   
   
   public static ArrayList xmlToTypeList(Element el, String container, String itemName, String itemAttribute)
   {        
      ArrayList<TypeSlotFragment> members = new ArrayList<>();
      Element collectionChildElement = el.getFirstChildElement(container);
      if (collectionChildElement != null ) {
         Elements children = collectionChildElement.getChildElements();
           
         for (int i = 0; i < children.size(); i++) {
            final Element child = children.get(i);
            if (child.getLocalName().equals(itemName)) {                    
               members.add(new TypeSlotFragment(child.getAttributeValue(itemAttribute), child.getAttributeValue(itemAttribute + "-java")));                 
               }
               

            else {
            bluej.utility.Debug.reportError("Wrong element format: expected '" + itemName + "', found '" + child.getLocalName() + "'.");                 
            }             
         }         
      }
       
   return members;     
   }


public static Element typeListToXML(List<TypeSlotFragment> items, String container, String itemName, String itemAttribute)
   {        
   Element el = new Element(container);
       
   for (TypeSlotFragment s : items)
       {            
      LocatableElement child = new LocatableElement(null, itemName);
      child.addAttributeStructured(itemAttribute, s);
      el.appendChild(child);         
      }
       
   return el;     
   }

   
public static List fillChildrenElements(ContainerCodeElement parent, Element el, String string)
   {        
   List<CodeElement> members = new ArrayList<CodeElement>();
   Element collectionChildElement = el.getFirstChildElement(string);
   if (collectionChildElement != null ) {
      Elements children = collectionChildElement.getChildElements();
           
      for (int i = 0; i < children.size(); i++) {
         CodeElement member = Loader.loadElement(children.get(i));
         members.add(member);
         member.setParent(parent);             
         }         
      }
       
   return members;     
   }

   
public static Attribute getStrideVersionAttribute()
   {        
   return new Attribute("strideversion", "1");     
   }

@OnThread(Tag.FXPlatform)
   
public ExpressionTypeInfo getCodeSuggestions(PosInSourceDoc pos, ExpressionSlot<?> completing);

@OnThread(Tag.FX)
   
public TopLevelFrame createTopLevelFrame(InteractionManager editor);

   
public List getImports();

   
public String getName();
    
   

public String getStylePrefix();

@OnThread(Tag.FXPlatform)
   
public EntityResolver getResolver();

   
public @OnThread(Tag.FX) InteractionManager getEditor();

   

public LocatableElement toXML();

   
public TopLevelFrame getFrame();

   
public Stream streamContained();

@OnThread(Tag.FXPlatform)
   
public Stream findEarlyErrors();

@OnThread(Tag.FXPlatform)
   
public JavaSource toJavaSource();

@OnThread(Tag.FXPlatform)
   
public default JavaSource toJavaSource(boolean warning)
   {
   JavaSource java = toJavaSource();
   if (warning) {            
      

           
      
      java = new JavaSource(java);
           
      java.prependLine(Arrays.asList(new FrameFragment(null, (CodeElement)this, "// WARNING: This file is auto-generated and any changes to it will be overwritten")), null);         
      }
       
   return java;     
   }

@OnThread(Tag.FXPlatform)
void updateSourcePositions();

@OnThread(Tag.FXPlatform)
List<ConstructorReflective> getSuperConstructors();

@OnThread(Tag.FXPlatform)
List<AssistContentThreadSafe> getThisConstructors(); 
}
top, use, map, interface TopLevelCodeElement

.   xmlToTypeList
.   typeListToXML
.   fillChildrenElements
.   getStrideVersionAttribute
.   getCodeSuggestions
.   createTopLevelFrame
.   getImports
.   getName
.   getStylePrefix
.   getResolver
.   toXML
.   getFrame
.   streamContained
.   findEarlyErrors
.   toJavaSource
.   toJavaSource
.   updateSourcePositions




154 neLoCode + 0 LoComm