package bluej.stride.framedjava.frames;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;

import bluej.stride.generic.Frame;
import bluej.stride.generic.FrameCanvas;
import bluej.stride.generic.FrameCursor;
import bluej.utility.Utility;
import threadchecker.OnThread;
import threadchecker.Tag;

public class FrameHelper
{   
@OnThread(Tag.FXPlatform)
   
   public static void flagErrorsAsOld(FrameCanvas canvas)
   {
      canvas.getBlockContents().forEach(f -> f.flagErrorsAsOld());     
      }

   @OnThread(Tag.FXPlatform)
   
   public static void removeOldErrors(FrameCanvas canvas)
   {
      canvas.getBlockContents().forEach(f -> f.removeOldErrors());     
      }

   p.public static void pullUpContents(Frame f, FrameCanvas innerCanvas)
   {        
      
      FrameCursor cursorBefore = f.getCursorBefore();
       
      
      ArrayList<Frame> contents = new ArrayList<>(innerCanvas.getBlockContents());
      contents.forEach(c -> innerCanvas.removeBlock(c));
      cursorBefore.insertFramesAfter(contents);
      f.getParentCanvas().removeBlock(f);     
      }

   
   public static void processVarScopesAfter(FrameCanvas parentCanvas,
           
   Frame afterFrame, BiConsumer<Map<String, List<Frame>> 
| scopes, excluding cur
|
Frame 
| cur
|
process)
   {        
      processVarScopesAfter(parentCanvas, afterFrame, new HashMap<>(), process);     
      }
        
   
   private static void processVarScopesAfter(FrameCanvas parentCanvas,
               
   Frame afterFrame, Map<String, List<Frame>> parentVars, BiConsumer<Map<String, List<Frame>> 
| scopes, excluding cur
|
Frame 
| cur
|
process)
   {        
      
      Map<String, List<Frame>> vars = new HashMap<>(parentVars);
       
      for (Frame f : Utility.iterableStream(parentCanvas.getFramesAfter(afterFrame)))
       {
         process.accept(vars, f);
            
           
         for (FrameCanvas c : Utility.iterableStream(f.getCanvases()))
           {                
            Map<String, List<Frame>> extraVarsWithin = new HashMap<>();
               
            for (String v : f.getDeclaredVariablesWithin(c))
               {
               extraVarsWithin.put(v, Arrays.asList(f));                 
               }
            Map<String, List<Frame>> varsInside = Utility.mergeMaps(vars, extraVarsWithin, Utility::concat);
            processVarScopesAfter(c, null, varsInside, process);             
            }
            
           
         for (String var : f.getDeclaredVariablesAfter())
           {                
            vars.merge(var, new ArrayList<Frame>(Arrays.asList(f)), Utility::concat);             
            }         
         }     
      } 
   }
top, use, map, class FrameHelper

.   flagErrorsAsOld
.   removeOldErrors
.   pullUpContents
.   processVarScopesAfter
.   processVarScopesAfter




91 neLoCode + 4 LoComm