package Portugol.Language.Criar;
import Portugol.Language.Analisador.Keyword;
import Portugol.Language.Utilitario.CodeLine;
//import VisualFluxogram.Patterns.Forma; // Uso para o fluxograma
public class NodeInstruction {
public static String VERSION = "Versão:2.0 \t(c)Augusto Bilabila e David Silva Barrera";
//posicao no editor texto
/**
*/
protected int charNum;
/**
* nivel do nodo no fluxograma
*/
protected int level;
/**
* posicao x do simbolo
*/
protected double positionX;
/**
* posicao y do simbolo
*/
protected double positionY;
/**
* representacao grafica do simbolo
*/
// protected Forma visual; // fluxograma
/**
* texto
*/
protected String text;
/**
* tipo
*/
protected int type;
/**
* ponteiro par o proximo nodo
*/
protected NodeInstruction next;
/**
* ponteiro par o nodo se verdadeiro
*/
protected NodeInstruction ifTrue;
/**
* ponteiro par o nodo se falso
*/
protected NodeInstruction ifFalse;
public boolean EsReferencia;
public boolean Expanded;
/**
* construtor
* @param instruction linha de codigo
* @param charNum nó do caracter da primeira letra
* @param level nivel do codigo
*/
public NodeInstruction(String instruction, int charNum , int level) {
this.text = CodeLine.GetNormalized(instruction);
this.type = Keyword.GetKey(instruction);
this.level = level;
this.positionX = 0;
this.positionY = 0;
this.next =null;
this.ifTrue =null;
this.ifFalse =null;
this.charNum = charNum;
this.EsReferencia = false;
this.Expanded = false;
}
/**
* construtor cópia
* @param node no original
*/
public NodeInstruction(NodeInstruction node) {
this.text = node.text;
this.type = node.type;
this.level = node.level;
this.next = node.next;
this.positionX = node.positionX;
this.positionY = node.positionY;
this.ifTrue = node.ifTrue;
this.ifFalse = node.ifFalse;
this.charNum = node.charNum;
this.EsReferencia = node.EsReferencia;
}
public int GetType(){
return type;
}
/**
* altera o tipo do nodo
* @param newType novo tipo
*/
public void SetType(int newType){
type = newType;
}
/**
* retorna o texto
* @return texto
*/
public String GetText(){
return text;
}
public String GetTextKey(){
return Keyword.GetTextKey(type);
}
/**
* retorna o texto
* @return texto
*/
public String GetIntruction(){
StringBuffer str = new StringBuffer();
str.append(Keyword.GetTextKey(GetType()) );
str.append("\t");
str.append(text);
return str.toString();
}
/**
* altera o texto
* @param newText novo texto
*/
public void SetText(String newText){
text = CodeLine.GetNormalized(newText);
}
/**
* altera o ponteiro para o proximo nodo
* @param n novo no
*/
public void SetNext(NodeInstruction n){
next = n;
}
/**
* altera o ponteiro para o nodo verdadeiro
* @param n no
*/
public void SetIfTrue(NodeInstruction n){
ifTrue = n;
}
/**
* altera o ponteiro para o nodo falso
* @param n no
*/
public void SetIfFalse(NodeInstruction n){
ifFalse = n;
}
/**
* retorna o proximo nodo
* @return retorna o proximo nodo
*/
public NodeInstruction GetNext(){
return next;
}
/**
* retorna o nodo se verdadeiro
* @return retorna o nodo se verdadeiro
*/
public NodeInstruction GetIfTrue(){
return ifTrue;
}
/**
* retorna o nodo se falso
* @return retorna o nodo se falso
*/
public NodeInstruction GetIfFalse(){
return ifFalse;
}
/**
* retorna o nivel do nodo
* @return nivel
*/
public int GetLevel(){
return level;
}
/**
* altera o nivel
* @param lv novo nivel
*/
public void SetLevel(int lv){
level=lv;
}
/**
* incrementa o nivel do nodo
*/
public void IncrementLevel(){
level++;
}
/**
* decrementa o nivel do nodo
*/
public void DecrementLevel(){
level--;
}
/**
* retorna a posicao x
* @return retorna a posicao x
*/
public double GetPositionX(){
return positionX;
}
/**
* Atera a posicao x
* @param p novo x
*/
public void SetPositionX(double p){
positionX = p;
}
/**
* retorna a posicao y
* @return retorna a posicao x
*/
public double GetPositionY(){
return positionY;
}
/**
* Atera a posicao y
* @param p posicao y
*/
public void SetPositionY(double p){
positionY = p;
}
/**
* numero do caracter
* @return numero do caracter
*/
public int GetCharNum(){
return charNum;
}
/**
* altera o numero do caracter
* @param cn novo numero do caracter
*/
public void SetCharNum(int cn){
charNum=cn;
}
/**
* se is um nodo que abre um ciclo
* @return se for um no que abre um ciclo
*/
public boolean IsNodeOpen(){
return
type == Keyword.INICIO ||
type == Keyword.SE ||
type == Keyword.PARA ||
type == Keyword.ENQUANTO ||
type == Keyword.FAZ ||
type == Keyword.ESCOLHA ||
type == Keyword.REGISTO ||
type == Keyword.PROCEDIMENTO ||
type == Keyword.FUNCAO ||
type == Keyword.CONSTRUTOR ||
type == Keyword.REPETE ;
}
/**
* se for um no que fecha um ciclo
* @return se for um no que fecha um ciclo
*/
public boolean IsNodeClose(){
return
type == Keyword.FIM ||
type == Keyword.FIMSE ||
type == Keyword.FIMPARA ||
type == Keyword.FAZENQUANTO ||
type == Keyword.FIMENQUANTO ||
type == Keyword.FIMESCOLHE ||
type == Keyword.FIMREGISTO ||
type == Keyword.FIMPROCEDIMENTO ||
type == Keyword.FIMFUNCAO ||
type == Keyword.FIMCONSTRUTOR ||
type == Keyword.ATE ;
}
/**
* texto
* @return texto
*/
public String toString(){
StringBuffer str = new StringBuffer();
str.append(level + "\t");
str.append("[" + positionY + "," + positionX + "]\t");
str.append(Keyword.GetTextKey(GetType()) );
while( str.length() < 35)
str.append(" ");
str.append("\t");
for(int i=0; i< level ; i++)
str.append("\t");
str.append(text);
return str.toString();
}
}