package bluej.stride.framedjava.elements;

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

import bluej.stride.generic.InteractionManager;
import nu.xom.Attribute;
import nu.xom.Element;
import bluej.stride.framedjava.ast.AccessPermission;
import bluej.stride.framedjava.ast.AccessPermissionFragment;
import bluej.stride.framedjava.ast.FilledExpressionSlotFragment;
import bluej.stride.framedjava.ast.HighlightedBreakpoint;
import bluej.stride.framedjava.ast.JavaFragment;
import bluej.stride.framedjava.ast.JavaSingleLineDebugHandler;
import bluej.stride.framedjava.ast.JavaSource;
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.VarFrame;
import bluej.stride.generic.Frame;
import bluej.stride.generic.Frame.ShowReason;

public class VarElement
extends CodeElement implements JavaSingleLineDebugHandler{    
   public static final String ELEMENT = "variable";
   
   private final AccessPermissionFragment varAccess;
   
   private boolean staticModifier = false;
   
   private boolean finalModifier = false;
   
   private final TypeSlotFragment varType;
   
   private final NameDefSlotFragment varName;
   
   private final FilledExpressionSlotFragment varValue;
   
   private VarFrame frame;
    
   
   
   public VarElement(VarFrame frame, AccessPermissionFragment varAccess, boolean staticModifier, 
           
   boolean finalModifier, TypeSlotFragment varType, NameDefSlotFragment varName, 
           
   FilledExpressionSlotFragment varValue, boolean enabled)
   {        
      this.frame = frame;
       
      this.varAccess = varAccess;
       
      this.staticModifier = staticModifier;
       
      this.finalModifier = finalModifier;
       
      this.varType = varType;
       
      this.varName = varName;
       
      this.varValue = varValue;
       
      this.enable = enabled;     
      }
    
   
   public VarElement(Element el)
   {
      Attribute accessAttribute = el.getAttribute("access");
      varAccess = (accessAttribute == null) ? null : 
           
      new AccessPermissionFragment(AccessPermission.fromString(accessAttribute.getValue()));
        
      Attribute staticAttribute = el.getAttribute("static");
      staticModifier = (staticAttribute == null) ? false : Boolean.valueOf(staticAttribute.getValue());
        
      Attribute finalAttribute = el.getAttribute("final");
      finalModifier = (finalAttribute == null) ? false : Boolean.valueOf(finalAttribute.getValue());
        
       
      varType = new TypeSlotFragment(el.getAttributeValue("type"), el.getAttributeValue("type-java"));
       
      varName = new NameDefSlotFragment(el.getAttributeValue("name"));
        
      Attribute valueAttribute = el.getAttribute("value");
       
      varValue = (valueAttribute == null) ? null : new FilledExpressionSlotFragment(valueAttribute.getValue(), el.getAttributeValue("value-java"));
        
      enable = Boolean.valueOf(el.getAttributeValue("enable"));     
      }

   
   public VarElement(String access, String type, String name, String value)
   {        
      varAccess = (access == null) ? null : new AccessPermissionFragment(AccessPermission.fromString(access));
       
      varType = new TypeSlotFragment(type, type);
       
      varName = new NameDefSlotFragment(name);
       
      varValue = (value == null) ? null : new FilledExpressionSlotFragment(value, value);     
      }

   
   @Override
   
   public JavaSource toJavaSource()
   {        
      List<JavaFragment> fragments = new ArrayList<JavaFragment>();
      if (varAccess != null) {
         fragments.addAll(Arrays.asList(varAccess, space()));         
         }
      if (staticModifier) {
         fragments.add(f(frame, "static "));         
         }
      if (finalModifier) {
         fragments.add(f(frame, "final "));         
         }
        
      fragments.addAll(Arrays.asList(varType, space(), varName));
      if (varValue != null) {
         fragments.addAll(Arrays.asList(f(null, " = "), varValue));         
         }
      fragments.add(f(frame, ";"));
       
      return new JavaSource(this, fragments);     
      }

   
   @Override
   
   public LocatableElement toXML()
   {        
      LocatableElement varEl = new LocatableElement(this, ELEMENT);
      if (varAccess != null) {
         varEl.addAttributeAccess("access", varAccess);         
         }
      if (staticModifier) {            
         varEl.addAttribute(new Attribute("static", "true"));         
         }
      if (finalModifier) {            
         varEl.addAttribute(new Attribute("final", "true"));         
         }
      varEl.addAttributeStructured("type", varType);
      varEl.addAttributeCode("name", varName);
      if (varValue != null) {
         varEl.addAttributeStructured("value", varValue);         
         }
      addEnableAttribute(varEl);
       
      return varEl;     
      }
    
   
   @Override
   
   public Frame createFrame(InteractionManager editor)
   {        
      frame = new VarFrame(editor, varAccess, staticModifier, finalModifier, varType, varName, varValue, isEnable() );
       
      return frame;     
      }

   
   @Override
   
   public List getDeclaredVariablesAfter()
   {        
      return Collections.singletonList(new LocalParamInfo(varType.getContent(), varName.getContent(), false, this));     
      }

   
   @Override
   
   public HighlightedBreakpoint showDebugBefore(DebugInfo debug)
   {
      return frame.showDebugBefore(debug);     
      }
    
   
   @Override
   
   public void show(ShowReason reason)
   {
      frame.show(reason);             
      }

   
   @Override
   
   protected Stream getDirectSlotFragments()
   {
      return Stream.<SlotFragment>of(varType, varName, varValue).filter(s -> s != null);     
      }

   
   public boolean isStatic()
   {        
      return staticModifier;     
      }

   
   public boolean isFinal()
   {        
      return finalModifier;     
      }

   
   public String getType()
   {
      return varType.getContent();     
      }

   
   public String getName()
   {
      return varName.getContent();     
      }

   
   public String getValue()
   {
      return varValue != null ? varValue.getContent() : null;     
      } 
   }
top, use, map, class VarElement

.   VarElement
.   VarElement
.   VarElement
.   toJavaSource
.   toXML
.   createFrame
.   getDeclaredVariablesAfter
.   showDebugBefore
.   show
.   getDirectSlotFragments
.   isStatic
.   isFinal
.   getType
.   getName
.   getValue




237 neLoCode + 0 LoComm