/*
* MemoryStatusWidgetFactory.java - The memory status widget service
* :tabSize=4:indentSize=4:noTabs=false:
* :folding=explicit:collapseFolds=1:
*
* Copyright (C) 2008 Matthieu Casanova
* Portions Copyright (C) 2001, 2004 Slava Pestov
* Portions copyright (C) 2001 Mike Dillon
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or any later version.
*
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.gjt.sp.jedit.gui.statusbar;
//{{{ Imports
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.font.FontRenderContext;
import java.awt.font.LineMetrics;
import java.awt.geom.Rectangle2D;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.Timer;
import javax.swing.ToolTipManager;
import org.gjt.sp.jedit.View;
import org.gjt.sp.jedit.jEdit;
//}}}
/**
* @author Matthieu Casanova
* @since jEdit 4.3pre14
*/
public class MemoryStatusWidgetFactory implements StatusWidgetFactory
{
//{{{ getWidget() constructor
public Widget getWidget(View view)
{
Widget memory = new MemoryStatusWidget(view);
return memory;
} //}}}
//{{{ MemoryStatusWidget class
private static class MemoryStatusWidget implements Widget
{
private final MemoryStatus memoryStatus;
public MemoryStatusWidget(View view)
{
memoryStatus = new MemoryStatus(view);
}
public JComponent getComponent()
{
return memoryStatus;
}
public void update()
{
}
public void propertiesChanged()
{
}
} //}}}
//{{{ MemoryStatus class
private static class MemoryStatus extends JComponent implements ActionListener
{
private View view;
//{{{ MemoryStatus constructor
MemoryStatus(View view)
{
this.view = view;
// fucking GTK look and feel
Font font = new JLabel().getFont();
//Font font = UIManager.getFont("Label.font");
MemoryStatus.this.setFont(font);
FontRenderContext frc = new FontRenderContext(
null,false,false);
Rectangle2D bounds = font.getStringBounds(
memoryTestStr,frc);
Dimension dim = new Dimension((int)bounds.getWidth(),
(int)bounds.getHeight());
setPreferredSize(dim);
setMaximumSize(dim);
lm = font.getLineMetrics(memoryTestStr,frc);
setForeground(jEdit.getColorProperty("view.status.foreground"));
setBackground(jEdit.getColorProperty("view.status.background"));
progressForeground = jEdit.getColorProperty(
"view.status.memory.foreground");
progressBackground = jEdit.getColorProperty(
"view.status.memory.background");
addMouseListener(new MouseHandler());
} //}}}
//{{{ addNotify() method
@Override
public void addNotify()
{
super.addNotify();
timer = new Timer(2000,this);
timer.start();
ToolTipManager.sharedInstance().registerComponent(this);
} //}}}
//{{{ removeNotify() method
@Override
public void removeNotify()
{
timer.stop();
ToolTipManager.sharedInstance().unregisterComponent(this);
super.removeNotify();
} //}}}
//{{{ getToolTipText() method
@Override
public String getToolTipText()
{
Runtime runtime = Runtime.getRuntime();
long free = runtime.freeMemory();
long total = runtime.totalMemory();
long used = total - free;
args[0] = (int) (used / 1024);
args[1] = (int) (total / 1024);
return jEdit.getProperty("view.status.memory-tooltip",args);
} //}}}
//{{{ getToolTipLocation() method
@Override
public Point getToolTipLocation(MouseEvent event)
{
return new Point(event.getX(),-20);
} //}}}
//{{{ actionPerformed() method
public void actionPerformed(ActionEvent evt)
{
MemoryStatus.this.repaint();
} //}}}
//{{{ paintComponent() method
@Override
public void paintComponent(Graphics g)
{
Insets insets = new Insets(0,0,0,0);//MemoryStatus.this.getBorder().getBorderInsets(this);
Runtime runtime = Runtime.getRuntime();
long free = runtime.freeMemory();
long total = runtime.totalMemory();
long used = total - free;
int width = MemoryStatus.this.getWidth()
- insets.left - insets.right;
int height = MemoryStatus.this.getHeight()
- insets.top - insets.bottom - 1;
float fraction = ((float)used) / total;
g.setColor(progressBackground);
g.fillRect(insets.left,insets.top,
(int)(width * fraction),
height);
String str = (used / 1024 / 1024) + "/"
+ (total / 1024 / 1024) + "MB";
FontRenderContext frc = new FontRenderContext(null,false,false);
Rectangle2D bounds = g.getFont().getStringBounds(str,frc);
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2.setClip(insets.left,insets.top,
(int)(width * fraction),
height);
g2.setColor(progressForeground);
g2.drawString(str,
insets.left + ((int) (width - bounds.getWidth()) / 2),
(int)(insets.top + lm.getAscent()));
g2.setClip(insets.left + (int)(width * fraction),
insets.top,MemoryStatus.this.getWidth()
- insets.left - (int)(width * fraction),
height);
g2.setColor(MemoryStatus.this.getForeground());
g2.drawString(str,
insets.left + ((int) (width - bounds.getWidth()) >> 1),
(int)(insets.top + lm.getAscent()));
g2.dispose();
} //}}}
//{{{ Private members
private static final String memoryTestStr = "9999/9999MB";
private final LineMetrics lm;
private final Color progressForeground;
private final Color progressBackground;
private final Integer[] args = new Integer[2];
private Timer timer;
//}}}
//{{{ MouseHandler class
class MouseHandler extends MouseAdapter
{
@Override
public void mousePressed(MouseEvent evt)
{
if(evt.getClickCount() == 2)
{
jEdit.showMemoryDialog(view);
repaint();
}
}
} //}}}
} //}}}
}