// GraphTea Project: http://github.com/graphtheorysoftware/GraphTea
// Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com
// Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology
// Distributed under the terms of the GNU General Public License (GPL): http://www.gnu.org/licenses/
package graphtea.ui.actions;

import graphtea.platform.core.BlackBoard;
import graphtea.ui.UIUtils;
import graphtea.ui.components.GComponentInterface;

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.plaf.basic.BasicButtonUI;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * @author Azin Azadi
 */
public class MemoryUsageStatusAction extends graphtea.platform.core.AbstractAction implements ActionListener, GComponentInterface {
    /**
     * constructor
     *
     * @param bb the blackboard of the action
     */
    public MemoryUsageStatusAction(BlackBoard bb) {
        super(bb);
        new Timer(1000, this).start();
        bname = UIUtils.getComponentVariableKeyNameInBlackBoard("memory usage");
        blackboard.addListener(bname, this);
    }

    /**
     * called when the variable bname is changed
     *
     * @param eventName The event name
     * @param value The value
     */
    public void performAction(String eventName, Object value) {
        button = blackboard.getData(bname);
        button.setToolTipText("Press to free the memory");
        button.setBorder(new EmptyBorder(0, 0, 0, 0));
        button.addActionListener(e -> System.gc());
    }

    /**
     * occurs when the button pressed
     */
    public void actionPerformed(ActionEvent e) {
        long totalmem = Runtime.getRuntime().totalMemory();
        long used = totalmem - Runtime.getRuntime().freeMemory();
        try {
            button.setText(getOutStr(used, totalmem));
            button.setSize(100, 15);
        } catch (Exception ignored) {
        }
    }

    /**
     * :)) my simple formating methods. :D
     */
    private String getOutStr(long usedmem, long totalmem) {
        return "<html><body>" +
                _strout("mem(kb): ") +
                _numout(usedmem / 1000) +
                _strout(" of ") +
                _numout(totalmem / 1000);
    }

    /**
     * :)) my simple formating methods. :D
     */
    private String _numout(long num) {
        return "<font color='#222244'>" + num + "</font>";
    }

    /**
     * :)) my simple formating methods. :D
     */
    private String _strout(String str) {
        return "<font color='#444477'>" + str + "</font>";
    }

    private final String bname;
    private JButton button = new JButton("memory usage");

    public Component getComponent(BlackBoard b) {
        button.setUI(new BasicButtonUI());
        return button;
    }
}