package Common.Visual;
import Common.Utils.Utils_;
import _VisualDVM.Visual.Menus.StableMenuItem;
import Common.Database.Objects.DBObject;
import Common.Database.Tables.DataSet;

import javax.swing.*;
//одиночный фильтр, пункт фильтрационного меню.
public abstract class DBObjectFilter<D extends DBObject> {
    public JMenuItem menuItem;   //пункт меню фильтра. ( возможно потом сделать и кнопку)
    //--
    String description;
    boolean active = true; //включен ли фильтр
    int count = 0;
    //--
    static String getNotActiveIconPath() {
        return "/Common/icons/NotPick.png";
    }
    static String getActiveIconPath() {
        return "/Common/icons/Pick.png";
    }
    void Mark() {
        menuItem.setIcon(Utils_.getIcon(active ? getActiveIconPath() : getNotActiveIconPath()));
    }
    //-------
    public boolean Validate(D object) {
        boolean valid = validate(object);
        if (valid)
            count++;
        return valid & active;
    }
    public DBObjectFilter(DataSet dataSet, String description_in, boolean active_in) {
        menuItem = new StableMenuItem((description = description_in) + " (0)");
        active = active_in;
        menuItem.addActionListener(e -> {
            active = !active;
            Mark();
            dataSet.ShowUI();
        });
        Mark();
    }
    public DBObjectFilter(DataSet dataSet, String description_in) {
        this(dataSet, description_in, true);
    }
    public void setActive(boolean flag) {
        active = flag;
        Mark();
    }
    //--
    protected abstract boolean validate(D object);
    //--
    public void Drop() {
        count = 0;
    }
    public void Refresh() {
        menuItem.setText(description + " " + Utils_.RBrackets(count));
    }
    public boolean isActive() {
        return active;
    }
    //--
}
