package mediathek.gui;
import mSearch.tool.Functions.OperatingSystemType;
import javax.swing.*;
import java.awt.*;
import static mSearch.tool.Functions.getOs;
@SuppressWarnings("serial")
public class MVMemoryUsageButton extends JButton {
private final Runtime rt = Runtime.getRuntime();
private final String MEMORY_STRING;
private static final int MEGABYTE = 1000 * 1000;
private static final int BAR_HEIGHT = 16;
public MVMemoryUsageButton() {
final long maxMemory = Math.min(rt.maxMemory() / MEGABYTE, 9999);
MEMORY_STRING = maxMemory + " von " + maxMemory + "MiB ";
setOpaque(false);
setFocusable(false);
//we may want to explicitly garbage collect :)
addActionListener(e -> System.gc());
updateUI();
//Update every second...
Timer updateTimer = new Timer(1000, e -> repaint());
updateTimer.start();
}
@Override
public void paintComponent(final Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
final long maxMem;
if (getOs() == OperatingSystemType.LINUX) {
maxMem = rt.totalMemory();
} else {
maxMem = rt.maxMemory();
}
final long totalMemory = rt.totalMemory();
final long freeMemory = rt.freeMemory();
final long usedMem = totalMemory - freeMemory;
Insets insets = getInsets();
final Dimension size = getSize();
final int totalBarLength = size.width - insets.left - insets.right;
final int yOffset = (size.height - BAR_HEIGHT) / 2;
final int xOffset = insets.left;
// Hintergrund (Mac-Style)
g2d.setColor(new Color(190, 190, 190));
g2d.fillRect(xOffset, yOffset, totalBarLength, BAR_HEIGHT);
// Balken benutzter Speicher
g2d.setColor(Color.RED);
final int usedBarLength = (int) (totalBarLength * usedMem / maxMem);
g2d.fillRect(xOffset, yOffset, usedBarLength, BAR_HEIGHT);
// Balken unbenutzter Speicher
g2d.setColor(Color.GREEN);
final int unusedBarLength = (int) (totalBarLength * freeMemory / maxMem);
g2d.fillRect(xOffset + usedBarLength, yOffset, unusedBarLength, BAR_HEIGHT);
// Rahmen rund um die Grafik
g2d.setColor(Color.BLACK);
g2d.drawRect(xOffset, yOffset, totalBarLength, BAR_HEIGHT);
// Info Text
g2d.setFont(getFont());
final long used = usedMem / MEGABYTE;
final long total = maxMem / MEGABYTE;
final String info = used + " von " + total + "MB";
final FontMetrics fontMetrics = g2d.getFontMetrics();
final int infoWidth = fontMetrics.charsWidth(info.toCharArray(), 0, info.length());
final int infoHeight = fontMetrics.getAscent();
g2d.setColor(Color.BLACK);
g2d.drawString(info, xOffset + (totalBarLength - infoWidth) / 2, yOffset + infoHeight + (BAR_HEIGHT - infoHeight) / 2 - 1);
g2d.dispose();
}
@Override
public Dimension getPreferredSize() {
final Insets insets = getInsets();
int width = getFontMetrics(getFont()).stringWidth(MEMORY_STRING) + insets.left + insets.right + 2;
int height = getFontMetrics(getFont()).getHeight() + insets.top + insets.bottom + 2;
return new Dimension(width, height);
}
@Override
public Dimension getMinimumSize() {
return getPreferredSize();
}
@Override
public Dimension getMaximumSize() {
return getPreferredSize();
}
}