package _VisualDVM.ProjectData.SapforData.Functions;
import Common.Utils.Utils_;
import _VisualDVM.ProjectData.SapforData.FileObjectWithMessages;
import _VisualDVM.ProjectData.SapforData.Functions.Json.FunctionParameterJson;
import com.google.gson.annotations.Expose;
import com.mxgraph.model.mxCell;

import javax.swing.*;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Vector;
public class FuncInfo extends FileObjectWithMessages {
    //JSON--------------------------------------------
    @Expose
    public String funcName;
    @Expose
    public int lineEnd; //строка где кончается тело объявления
    @Expose
    public int isMain; //является ли гпе
    @Expose
    public int needToInline;
    @Expose
    public int doNotInline;
    @Expose
    public int doNotAnalyze;
    @Expose
    public List<FunctionParameterJson> params = new Vector<>();
    //END OF JSON-----------------------------------------
    public FunctionType type = FunctionType.Default;
    //вызовы функций в теле этой функции
    @Expose
    public Vector<FuncCall> callsFrom = new Vector<>();
    //----
    //вызовы этой самой функции, рассортированные по файлам.
    public LinkedHashMap<String, Vector<FuncCall>> ownCalls = new LinkedHashMap<>();
    //Узел фуннкции при отрисовке графа процедур.
    //Нужен для сохранения всех позиций графа.
    public mxCell functionsGraphCell = null;
    //функция без объявления. у нее есть только имя и тип.
    public FuncInfo(String f_name, FunctionType type_in) {
        funcName = f_name;
        type = type_in;
        doNotInline = 1;
    }
    //--
    @Override
    public String getSelectionText() {
        return type.getDescription() + " " + Utils_.Brackets(funcName);
    }
    //------------------------------------------------
    @Override
    public boolean isSelectionEnabled() {
        return false;
    }
    @Override
    public ImageIcon GetDisabledIcon() {
        return Utils_.getIcon("/icons/Function.png");
    }
    public void SelectAllChildren(boolean select) {
        for (String file_name : ownCalls.keySet())
            for (FuncCall fc : ownCalls.get(file_name))
                fc.Select(select);
    }
    public boolean isDeclared() {
        return type.equals(FunctionType.Main) || type.equals(FunctionType.Default);
    }
    @Override
    public String Description() {
        return type.getDescription() + " " + Utils_.Brackets(funcName);
    }
}
