package bluej.stride.framedjava.elements;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Stream;

import bluej.stride.generic.InteractionManager;
import nu.xom.Element;
import bluej.stride.framedjava.ast.FilledExpressionSlotFragment;
import bluej.stride.framedjava.ast.HighlightedBreakpoint;
import bluej.stride.framedjava.ast.JavaContainerDebugHandler;
import bluej.stride.framedjava.ast.JavaSingleLineDebugHandler;
import bluej.stride.framedjava.ast.JavaSource;
import bluej.stride.framedjava.ast.Loader;
import bluej.stride.framedjava.ast.NameDefSlotFragment;
import bluej.stride.framedjava.ast.SlotFragment;
import bluej.stride.framedjava.ast.TypeSlotFragment;
import bluej.stride.framedjava.frames.DebugInfo;
import bluej.stride.framedjava.frames.ForeachFrame;
import bluej.stride.generic.Frame;
import bluej.stride.generic.Frame.ShowReason;

public class ForeachElement
extends ContainerCodeElement
 
implements JavaSingleLineDebugHandler, JavaContainerDebugHandler{    
   public static final String ELEMENT = "foreach";
   
   private final TypeSlotFragment type;
   
   private final NameDefSlotFragment var;
   
   private final FilledExpressionSlotFragment collection;
   
   private final List<CodeElement> contents;
   
   private ForeachFrame frame;

   
   public ForeachElement(ForeachFrame frame, TypeSlotFragment type, NameDefSlotFragment var, FilledExpressionSlotFragment collection, List<CodeElement> contents, 
           
   boolean enabled)
   {        
      this.frame = frame;
       
      this.type = type;
       
      this.var = var;
       
      this.collection = collection;
       
      this.contents = contents;
       
      this.enable = enabled;
      contents.forEach(c -> c.setParent(this));     
      }

   
   @Override
   
   public List childrenUpTo(CodeElement c)
   {
      return contents.subList(0, contents.indexOf(c));     
      }

   
   @Override
   
   public JavaSource toJavaSource()
   {
      Pattern p = Pattern.compile("^\\s*([+-]?[0-9]+)\\s*\\.\\.\\s*([+-]?[0-9]+)\\s*$");
      Matcher m = p.matcher(collection.getContent());
      if (m.find())
       {
         String lower = m.group(1);
         String upper = m.group(2);
           
         
         return JavaSource.createCompoundStatement(frame, this, this, this, Arrays.asList(f(frame, "for ("), type, space(), var, f(frame, " = "), f(frame, lower + ";"), var, f(frame, " <= "), f(frame, upper + ";"), var, f(frame, "++)")
         ), CodeElement.toJavaCodes(contents));         
         }
        
       
      return JavaSource.createCompoundStatement(frame, this, this, this, Arrays.asList(f(frame, "for (final "), type, space(), var, f(frame, " : "), collection,
      f(frame, ")")), CodeElement.toJavaCodes(contents));     
      }

   
   @Override
   
   public LocatableElement toXML()
   {        
      LocatableElement loopEl = new LocatableElement(this, ELEMENT);
      loopEl.addAttributeStructured("type", type);
      loopEl.addAttributeCode("var", var);
      loopEl.addAttributeStructured("collection", collection);
      addEnableAttribute(loopEl);
       
      for (CodeElement c : contents)
       {
         loopEl.appendChild(c.toXML());         
         }
       
      return loopEl;     
      }
    
   
   public ForeachElement(Element el)
   {        
      type = new TypeSlotFragment(el.getAttributeValue("type"), el.getAttributeValue("type-java"));
       
      var = new NameDefSlotFragment(el.getAttributeValue("var"));
       
      collection = new FilledExpressionSlotFragment(el.getAttributeValue("collection"), el.getAttributeValue("collection-java"));
       
      contents = new ArrayList<CodeElement>();
       
      for (int i = 0; i < el.getChildElements().size(); i++)
       {
         final Element child = el.getChildElements().get(i);
         CodeElement member = Loader.loadElement(child);
         contents.add(member);
         member.setParent(this);         
         }
      enable = Boolean.valueOf(el.getAttributeValue("enable"));     
      }

   
   @Override
   
   public Frame createFrame(InteractionManager editor)
   {        
      frame = new ForeachFrame(editor, type, var, collection, isEnable());
       
      for (CodeElement c : contents)
       {
         frame.getCanvas().insertBlockAfter(c.createFrame(editor), null);         
         }
       
      return frame;     
      }

   
   @Override
   
   public HighlightedBreakpoint showDebugBefore(DebugInfo debug)
   {
      return frame.showDebugBefore(debug);     
      }

   
   @Override
   
   public HighlightedBreakpoint showDebugAtEnd(DebugInfo debug)
   {
      return frame.showDebugAtEnd(debug);     
      }

   
   @Override
   
   public void show(ShowReason reason)
   {
      frame.show(reason);             
      }

   
   @Override
   
   public Stream streamContained()
   {
      return streamContained(contents);     
      }
    
   
   @Override
   
   protected Stream getDirectSlotFragments()
   {
      return Stream.of(type, var, collection);     
      }
    
   
   @Override
   
   public List getDeclaredVariablesWithin(CodeElement child)
   {        
      return Collections.singletonList(new LocalParamInfo(type.getContent(), var.getContent(), false, this));     
      } 
   }
top, use, map, class ForeachElement

.   ForeachElement
.   childrenUpTo
.   toJavaSource
.   toXML
.   ForeachElement
.   createFrame
.   showDebugBefore
.   showDebugAtEnd
.   show
.   streamContained
.   getDirectSlotFragments
.   getDeclaredVariablesWithin




195 neLoCode + 0 LoComm