/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ro.nextreports.designer.ui; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Insets; import java.awt.Point; 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.*; import ro.nextreports.designer.util.I18NSupport; /** * @author Decebal Suiu */ public class MemoryStatus extends JComponent implements ActionListener { private static final String MEMORY_TEST_STRING = "9999/9999M"; private static final Color PROGRESS_FOREGROUND = Color.DARK_GRAY; // private static final Color PROGRESS_BACKGROUND = Color.LIGHT_GRAY; // private static final Color PROGRESS_BACKGROUND = new Color(255, 210, 150); private static final Color PROGRESS_BACKGROUND = new Color(165, 180, 229); private LineMetrics lineMetrics; private Timer timer; public MemoryStatus() { // Font font = new JLabel().getFont(); Font font = UIManager.getFont("Label.font"); MemoryStatus.this.setFont(font); FontRenderContext fontRendererContext = new FontRenderContext(null, false, false); Rectangle2D bounds = font.getStringBounds(MEMORY_TEST_STRING, fontRendererContext); Dimension dimension = new Dimension((int) bounds.getWidth(), (int) bounds.getHeight()); setPreferredSize(dimension); setMaximumSize(dimension); lineMetrics = font.getLineMetrics(MEMORY_TEST_STRING, fontRendererContext); addMouseListener(new MouseHandler()); } @Override public void addNotify() { super.addNotify(); timer = new Timer(2000, this); timer.start(); ToolTipManager.sharedInstance().registerComponent(this); } @Override public void removeNotify() { timer.stop(); ToolTipManager.sharedInstance().unregisterComponent(this); super.removeNotify(); } @Override public String getToolTipText() { Runtime runtime = Runtime.getRuntime(); int freeMemory = (int) (runtime.freeMemory() / 1024); int totalMemory = (int) (runtime.totalMemory() / 1024); int usedMemory = (totalMemory - freeMemory); Integer[] args = { new Integer(usedMemory), new Integer(totalMemory) }; return I18NSupport.getString("memory") + " " + usedMemory/1024 + "M"; } @Override public Point getToolTipLocation(MouseEvent event) { return new Point(event.getX(), -20); } public void actionPerformed(ActionEvent event) { MemoryStatus.this.repaint(); } @Override public void paintComponent(Graphics g) { Insets insets = new Insets(0, 0, 0, 0); // MemoryStatus.this.getBorder().getBorderInsets(this); Runtime runtime = Runtime.getRuntime(); int freeMemory = (int) (runtime.freeMemory() / 1024); int totalMemory = (int) (runtime.totalMemory() / 1024); int usedMemory = (totalMemory - freeMemory); int width = MemoryStatus.this.getWidth() - insets.left - insets.right; // int height = MemoryStatus.this.getHeight() - insets.top - insets.bottom - 1; int height = MemoryStatus.this.getHeight() - insets.top - insets.bottom; float fraction = ((float) usedMemory) / totalMemory; g.setColor(PROGRESS_BACKGROUND); g.fillRect(insets.left, insets.top, (int) (width * fraction), height); String str = (usedMemory / 1024) + "/" + (totalMemory / 1024) + "M"; FontRenderContext fontRendererContext = new FontRenderContext(null, false, false); Rectangle2D bounds = g.getFont().getStringBounds(str, fontRendererContext); Graphics g2 = g.create(); g2.setClip(insets.left, insets.top, (int) (width * fraction), height); g2.setColor(PROGRESS_FOREGROUND); g2.drawString(str, insets.left + (int) (width - bounds.getWidth()) / 2, (int) (insets.top + lineMetrics.getAscent())); g2.dispose(); g2 = g.create(); 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()) / 2, (int) (insets.top + lineMetrics.getAscent())); g2.dispose(); } class MouseHandler extends MouseAdapter { @Override public void mousePressed(MouseEvent event) { if (event.getClickCount() == 2) { Memory.showMemoryDialog((JFrame) SwingUtilities.getWindowAncestor(MemoryStatus.this)); repaint(); } } } }