package bluej.stride.generic;

import java.util.List;
import java.util.stream.Collectors;

import bluej.stride.generic.ExtensionDescription.ExtensionSource;
import threadchecker.OnThread;
import threadchecker.Tag;

public interface CanvasParent
extends CursorFinder{
   p.public FrameTypeCheck check(FrameCanvas childCanvas);

   p.public default FrameCursor getCursorBefore(FrameCanvas c)
   {
      List<FrameCanvas> canvases = getFrame().getCanvases().collect(Collectors.toList());
      int index = canvases.indexOf(c);
      if (index == -1)
           
      throw new IllegalStateException("Canvas not known by parent frame");

       
      FrameCursor candidate = null;
      while (index > 0 && (candidate = canvases.get(index - 1).getLastCursor()) == null)
       {            
         index -= 1;         
         }

      if (candidate != null)
           
      return candidate;
       
      else{ return getFrame().getCursorBefore();
         }     
      }

   p.public default FrameCursor getCursorAfter(FrameCanvas c)
   {
      List<FrameCanvas> canvases = getFrame().getCanvases().collect(Collectors.toList());
      int index = canvases.indexOf(c);
      if (index == -1)
           
      throw new IllegalStateException("Canvas not known by parent frame");

       
      FrameCursor candidate = null;
      while (index + 1 < canvases.size() && (candidate = canvases.get(index + 1).getFirstCursor()) == null)
       {            
         index += 1;         
         }

      if (candidate != null)
           
      return candidate;
       
      else{ return getFrame().getCursorAfter();
         }     
      }

   List<ExtensionDescription> getAvailableExtensions(FrameCanvas canvas, FrameCursor cursorInCanvas);

   InteractionManager getEditor();

   default void modifiedCanvasContent()
   {        
      
      getEditor().modifiedFrame(null, false);     
      }

   
   
   @OnThread(Tag.FXPlatform)
   p.public static boolean processInnerExtensionKey(CanvasParent p, FrameCanvas canvas, FrameCursor cursor, char c, RecallableFocus rc, boolean atTop)
   {
      List<ExtensionDescription> candidates = p.getAvailableExtensions(canvas, cursor).stream()
      .filter(e -> e.getShortcutKey() == c && e.validFor(atTop ? ExtensionSource.INSIDE_FIRST : ExtensionSource.INSIDE_LATER))
      .collect(Collectors.toList());
        
      if (candidates.size() == 0) {            
         return false;         
         }
      if (candidates.size() > 1) {            
         throw new IllegalStateException("Ambiguous inner extension for: " + (int)c);         
         }

      p.getEditor().beginRecordingState(rc);
      candidates.get(0).activate();
      p.getEditor().endRecordingState(rc);
       
      return true;     
      }

   Frame getFrame();

   
   enum CanvasKind
   {        
      FIELDS, CONSTRUCTORS, METHODS, STATEMENTS, IMPORTS;     
      }
    
   
   default CanvasKind getChildKind(FrameCanvas c) { return CanvasKind.STATEMENTS; 
      } 
   }
top, use, map, interface CanvasParent

.   check
.   getCursorBefore
.   getCursorAfter
.   modifiedCanvasContent
.   processInnerExtensionKey




96 neLoCode + 0 LoComm