package bluej.stride.framedjava.elements;

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

import bluej.stride.framedjava.ast.AccessPermission;
import bluej.stride.generic.InteractionManager;
import nu.xom.Element;
import bluej.stride.framedjava.ast.AccessPermissionFragment;
import bluej.stride.framedjava.ast.JavaFragment;
import bluej.stride.framedjava.ast.JavaSource;
import bluej.stride.framedjava.ast.JavadocUnit;
import bluej.stride.framedjava.ast.ParamFragment;
import bluej.stride.framedjava.ast.SlotFragment;
import bluej.stride.framedjava.ast.SuperThis;
import bluej.stride.framedjava.ast.SuperThisFragment;
import bluej.stride.framedjava.ast.SuperThisParamsExpressionFragment;
import bluej.stride.framedjava.ast.ThrowsTypeFragment;
import bluej.stride.framedjava.frames.ConstructorFrame;
import bluej.stride.generic.Frame;
import bluej.stride.generic.Frame.ShowReason;

public class ConstructorElement
extends MethodWithBodyElement{    
   public static final String ELEMENT = "constructor";
   
   private final SuperThisFragment delegate;
   
   private final SuperThisParamsExpressionFragment delegateParams;
    
   
   public ConstructorElement(ConstructorFrame frame, AccessPermissionFragment access, List<ParamFragment> params,
                             
   List<ThrowsTypeFragment> throwsTypes, SuperThisFragment delegate,
                             
   SuperThisParamsExpressionFragment delegateParams, List<CodeElement> contents,
                             
   JavadocUnit documentation, boolean enabled)
   {
      super(frame, access, params, throwsTypes, contents, documentation, enabled);
       
      this.delegate = delegate;
       
      this.delegateParams = delegateParams;     
      }

   
   public ConstructorElement(String javaDoc)
   {        
      this(null, new AccessPermissionFragment(AccessPermission.PUBLIC), Collections.emptyList(), Collections.emptyList(),
               
      null, null, Collections.emptyList(), new JavadocUnit(javaDoc), true);     
      }
    
   
   public ConstructorElement(Element el)
   {
      super(el);

       
      SuperThisFragment loadedDelegate = null;
       
      SuperThisParamsExpressionFragment loadedDelegateParams = null;
       
      for (int i = 0; i < el.getChildElements().size(); i++) {
         final Element section = el.getChildElements().get(i);
         if (section.getLocalName().equals("delegate"))
           {
            String target = section.getAttributeValue("target");
            switch (target)
               {                    
               case "super":
                   
               case "this":
                       
               loadedDelegate = new SuperThisFragment(SuperThis.fromString(target));
                       
               loadedDelegateParams = new SuperThisParamsExpressionFragment(section.getAttributeValue("params"), section.getAttributeValue("params-java"));
                       
               break;                 
               }             
            }         
         }
       
      delegate = loadedDelegate;
       
      delegateParams = loadedDelegateParams;     
      }

   
   @Override
   
   public JavaSource toJavaSource()
   {           
      List<JavaFragment> header = new ArrayList<>();
        
      Collections.addAll(header, access, space(), ((ClassElement)getParent()).getNameElement((ConstructorFrame)frame), f(frame, "("));
                
      ParamFragment.addParamsToHeader(frame, this, params, header);
      header.add(f(frame, ")"));

      header.addAll(throwsToJava());
        
       
      List<JavaSource> effectiveContents = new ArrayList<>();
        
      if (delegate != null) {            
         effectiveContents.add(new JavaSource(this, delegate, f(frame, "("), delegateParams, f(frame, ");")));         
         }
        
      effectiveContents.addAll(CodeElement.toJavaCodes(contents));
        
      return JavaSource.createMethod(frame, this, this, documentation, header, effectiveContents);     
      }

   
   @Override
   
   public LocatableElement toXML()
   {        
      LocatableElement methodEl = new LocatableElement(this, ELEMENT);
      accessToXML(methodEl);
      addEnableAttribute(methodEl);

      methodEl.appendChild(documentation.toXML());
        
      paramsToXML(methodEl);
      throwsToXML(methodEl);
        
       
      LocatableElement delegateEl;
      if (delegate != null) {            
         delegateEl = new LocatableElement(null, "delegate");
         delegateEl.addAttributeSuperThis("target", delegate);
         delegateEl.addAttributeStructured("params", delegateParams);
         methodEl.appendChild(delegateEl);         
         }
        
      bodyToXML(methodEl);
       
      return methodEl;     
      }

   
   @Override
   
   public Frame createFrame(InteractionManager editor)
   {        
      frame = new ConstructorFrame(editor, access, documentation.toString(), delegate, delegateParams, isEnable());
      setupFrame(editor);
       
      return frame;     
      }
    
   
   @Override
   
   public String getType()
   {
      
      return null;     
      }
    
   
   @Override
   
   public void show(ShowReason reason)
   {
      frame.show(reason);             
      }
    
   
   @Override
   
   protected Stream getDirectSlotFragments()
   {
      Stream<SlotFragment> s = params.stream().flatMap(p -> Stream.of(p.getParamType(), p.getParamName()));
      if (delegate != null)
      s = Stream.concat(s, Stream.of(delegateParams));
      return Stream.concat(s, throwsTypes.stream().map(ThrowsTypeFragment::getJavaSource));     
      }

   
   public boolean hasDelegate()
   {        
      return delegate != null;     
      }

   
   public SuperThis getDelegate()
   {
      return delegate == null ? null : delegate.getValue();     
      }

   
   public String getDelegateParams()
   {
      return delegateParams == null ? null : delegateParams.getContent();     
      }

   
   public String getDelegateParamsJava()
   {
      return delegateParams == null ? null : delegateParams.getJavaCode();     
      } 
   }
top, use, map, class ConstructorElement

.   ConstructorElement
.   ConstructorElement
.   ConstructorElement
.   toJavaSource
.   toXML
.   createFrame
.   getType
.   show
.   getDirectSlotFragments
.   hasDelegate
.   getDelegate
.   getDelegateParams
.   getDelegateParamsJava




211 neLoCode + 0 LoComm