/*!
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.reporting.designer.core.status;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.SystemColor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.Timer;
import javax.swing.text.StyleContext;
import org.pentaho.reporting.designer.core.Messages;
import org.pentaho.reporting.libraries.designtime.swing.MacOSXIntegration;
/**
* Todo: Document me!
*
* @author : Thomas Morgner
*/
public class MemoryStatusGadget extends JLabel
{
private static final Color BG = SystemColor.textHighlight;
private double tm;
private double fm;
private Timer timer;
public MemoryStatusGadget()
{
if (MacOSXIntegration.MAC_OS_X)
{
setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(0, 0, 0, 10),
BorderFactory.createLineBorder(SystemColor.controlShadow)));
}
else
{
setBorder(BorderFactory.createLineBorder(SystemColor.controlShadow));
}
setFont(StyleContext.getDefaultStyleContext().getFont(getFont().getName(), Font.PLAIN, getFont().getSize() - 2));
setHorizontalAlignment(JLabel.CENTER);
timer = new Timer(500, new MemoryStatusUpdateAction());
timer.setRepeats(true);
timer.start();
addMouseListener(new GarbageCollectorAction());
}
@Override
protected void paintComponent(final Graphics g)
{
final Color origColor = g.getColor();
g.setColor(SystemColor.control);
g.fillRect(0, 0, getWidth(), getHeight());
final int w = (int) (getWidth() * ((tm - fm) / tm));
g.setColor(BG);
g.fillRect(0, 0, w, getHeight());
g.setColor(origColor);
super.paintComponent(g);
}
public void dispose()
{
timer.stop();
}
private static class GarbageCollectorAction extends MouseAdapter
{
@Override
public void mouseClicked(final MouseEvent e)
{
System.gc();
}
}
private class MemoryStatusUpdateAction implements ActionListener
{
public void actionPerformed(final ActionEvent e)
{
final long totalMemory = Runtime.getRuntime().totalMemory();
final long freeMemory = Runtime.getRuntime().freeMemory();
tm = (totalMemory / (1024. * 1024));
fm = (freeMemory / (1024. * 1024));
setText(Messages.getString("MemoryStatusGadget.Text", Double.valueOf(tm - fm), Double.valueOf(tm)));
}
}
}