package org.basex.gui.layout;
import static org.basex.core.Text.*;
import static org.basex.gui.GUIConstants.*;
import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Window;
import java.awt.event.MouseEvent;
import org.basex.gui.dialog.Dialog;
import org.basex.util.Performance;
/**
* This component visualizes the current memory consumption.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public final class BaseXMem extends BaseXPanel {
/** Default width of the memory status box. */
private static final int DWIDTH = 70;
/**
* Constructor.
* @param win parent reference
* @param mouse mouse interaction
*/
public BaseXMem(final Window win, final boolean mouse) {
super(win);
BaseXLayout.setWidth(this, DWIDTH);
BaseXLayout.setHeight(this, getFont().getSize() + 6);
if(mouse) {
setCursor(CURSORHAND);
addMouseListener(this);
addMouseMotionListener(this);
}
}
@Override
public void paintComponent(final Graphics g) {
super.paintComponent(g);
final Runtime rt = Runtime.getRuntime();
final long max = rt.maxMemory();
final long used = rt.totalMemory() - rt.freeMemory();
final int ww = getWidth();
final int hh = getHeight();
// draw memory box
g.setColor(Color.white);
g.fillRect(0, 0, ww - 3, hh - 3);
g.setColor(GRAY);
g.drawLine(0, 0, ww - 4, 0);
g.drawLine(0, 0, 0, hh - 4);
g.drawLine(ww - 3, 0, ww - 3, hh - 3);
g.drawLine(0, hh - 3, ww - 3, hh - 3);
// show current memory usage
final boolean full = used * 6 / 5 > max;
g.setColor(full ? colormark4 : color1);
g.fillRect(2, 2, Math.max(1, (int) (used * (ww - 6) / max)), hh - 6);
// print current memory usage
final FontMetrics fm = g.getFontMetrics();
final String mem = Performance.format(used, true);
final int fw = (ww - fm.stringWidth(mem)) / 2;
final int h = fm.getHeight() - 3;
g.setColor(full ? colormark3 : DGRAY);
g.drawString(mem, fw, h);
}
@Override
public void mousePressed(final MouseEvent e) {
Performance.gc(3);
repaint();
final Runtime rt = Runtime.getRuntime();
final long occ = rt.totalMemory();
final long max = rt.maxMemory();
final long used = occ - rt.freeMemory();
final String inf = TOTAL_MEM_C + Performance.format(max, true) + NL
+ RESERVED_MEM_C + Performance.format(occ, true) + NL + MEMUSED_C
+ Performance.format(used, true) + NL + NL + H_USED_MEM;
Dialog.info(gui, inf);
}
}