mirror of
https://github.com/autc04/Retro68.git
synced 2024-12-12 11:29:30 +00:00
293 lines
8.2 KiB
Java
293 lines
8.2 KiB
Java
|
/* BasicToolTipUI.java --
|
||
|
Copyright (C) 2004, 2005 Free Software Foundation, Inc.
|
||
|
|
||
|
This file is part of GNU Classpath.
|
||
|
|
||
|
GNU Classpath 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, or (at your option)
|
||
|
any later version.
|
||
|
|
||
|
GNU Classpath 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 GNU Classpath; see the file COPYING. If not, write to the
|
||
|
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||
|
02110-1301 USA.
|
||
|
|
||
|
Linking this library statically or dynamically with other modules is
|
||
|
making a combined work based on this library. Thus, the terms and
|
||
|
conditions of the GNU General Public License cover the whole
|
||
|
combination.
|
||
|
|
||
|
As a special exception, the copyright holders of this library give you
|
||
|
permission to link this library with independent modules to produce an
|
||
|
executable, regardless of the license terms of these independent
|
||
|
modules, and to copy and distribute the resulting executable under
|
||
|
terms of your choice, provided that you also meet, for each linked
|
||
|
independent module, the terms and conditions of the license of that
|
||
|
module. An independent module is a module which is not derived from
|
||
|
or based on this library. If you modify this library, you may extend
|
||
|
this exception to your version of the library, but you are not
|
||
|
obligated to do so. If you do not wish to do so, delete this
|
||
|
exception statement from your version. */
|
||
|
|
||
|
|
||
|
package javax.swing.plaf.basic;
|
||
|
|
||
|
import java.awt.Color;
|
||
|
import java.awt.Dimension;
|
||
|
import java.awt.Font;
|
||
|
import java.awt.FontMetrics;
|
||
|
import java.awt.Graphics;
|
||
|
import java.awt.Insets;
|
||
|
import java.awt.Rectangle;
|
||
|
import java.beans.PropertyChangeEvent;
|
||
|
import java.beans.PropertyChangeListener;
|
||
|
|
||
|
import javax.swing.JComponent;
|
||
|
import javax.swing.JToolTip;
|
||
|
import javax.swing.LookAndFeel;
|
||
|
import javax.swing.plaf.ComponentUI;
|
||
|
import javax.swing.plaf.ToolTipUI;
|
||
|
import javax.swing.text.View;
|
||
|
|
||
|
/**
|
||
|
* This is the Basic Look and Feel UI class for JToolTip.
|
||
|
*/
|
||
|
public class BasicToolTipUI extends ToolTipUI
|
||
|
{
|
||
|
|
||
|
/**
|
||
|
* Receives notification when a property of the JToolTip changes.
|
||
|
* This updates the HTML renderer if appropriate.
|
||
|
*/
|
||
|
private class PropertyChangeHandler
|
||
|
implements PropertyChangeListener
|
||
|
{
|
||
|
|
||
|
public void propertyChange(PropertyChangeEvent e)
|
||
|
{
|
||
|
String prop = e.getPropertyName();
|
||
|
if (prop.equals("tiptext") || prop.equals("font")
|
||
|
|| prop.equals("foreground"))
|
||
|
{
|
||
|
JToolTip tip = (JToolTip) e.getSource();
|
||
|
String text = tip.getTipText();
|
||
|
BasicHTML.updateRenderer(tip, text);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
/** The shared instance of BasicToolTipUI used for all ToolTips. */
|
||
|
private static BasicToolTipUI shared;
|
||
|
|
||
|
/** The tooltip's text */
|
||
|
private String text;
|
||
|
|
||
|
/**
|
||
|
* Handles property changes.
|
||
|
*/
|
||
|
private PropertyChangeListener propertyChangeHandler;
|
||
|
|
||
|
/**
|
||
|
* Creates a new BasicToolTipUI object.
|
||
|
*/
|
||
|
public BasicToolTipUI()
|
||
|
{
|
||
|
super();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* This method creates a new BasicToolTip UI for the given
|
||
|
* JComponent.
|
||
|
*
|
||
|
* @param c The JComponent to create a UI for.
|
||
|
*
|
||
|
* @return A BasicToolTipUI that can be used by the given JComponent.
|
||
|
*/
|
||
|
public static ComponentUI createUI(JComponent c)
|
||
|
{
|
||
|
if (shared == null)
|
||
|
shared = new BasicToolTipUI();
|
||
|
return shared;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* This method returns the msximum size of the given JComponent.
|
||
|
*
|
||
|
* @param c The JComponent to find a maximum size for.
|
||
|
*
|
||
|
* @return The maximum size.
|
||
|
*/
|
||
|
public Dimension getMaximumSize(JComponent c)
|
||
|
{
|
||
|
Dimension d = getPreferredSize(c);
|
||
|
View view = (View) c.getClientProperty(BasicHTML.propertyKey);
|
||
|
if (view != null)
|
||
|
d.width += view.getMaximumSpan(View.X_AXIS)
|
||
|
- view.getPreferredSpan(View.X_AXIS);
|
||
|
return d;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* This method returns the minimum size of the given JComponent.
|
||
|
*
|
||
|
* @param c The JComponent to find a minimum size for.
|
||
|
*
|
||
|
* @return The minimum size.
|
||
|
*/
|
||
|
public Dimension getMinimumSize(JComponent c)
|
||
|
{
|
||
|
Dimension d = getPreferredSize(c);
|
||
|
View view = (View) c.getClientProperty(BasicHTML.propertyKey);
|
||
|
if (view != null)
|
||
|
d.width -= view.getPreferredSpan(View.X_AXIS)
|
||
|
- view.getMinimumSpan(View.X_AXIS);
|
||
|
return d;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* This method returns the preferred size of the given JComponent.
|
||
|
*
|
||
|
* @param c The JComponent to find a preferred size for.
|
||
|
*
|
||
|
* @return The preferred size.
|
||
|
*/
|
||
|
public Dimension getPreferredSize(JComponent c)
|
||
|
{
|
||
|
JToolTip tip = (JToolTip) c;
|
||
|
String str = tip.getTipText();
|
||
|
FontMetrics fm = c.getFontMetrics(c.getFont());
|
||
|
Insets i = c.getInsets();
|
||
|
Dimension d = new Dimension(i.left + i.right, i.top + i.bottom);
|
||
|
if (str != null && ! str.equals(""))
|
||
|
{
|
||
|
View view = (View) c.getClientProperty(BasicHTML.propertyKey);
|
||
|
if (view != null)
|
||
|
{
|
||
|
d.width += (int) view.getPreferredSpan(View.X_AXIS);
|
||
|
d.height += (int) view.getPreferredSpan(View.Y_AXIS);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
d.width += fm.stringWidth(str) + 6;
|
||
|
d.height += fm.getHeight();
|
||
|
}
|
||
|
}
|
||
|
return d;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* This method installs the defaults for the given JComponent.
|
||
|
*
|
||
|
* @param c The JComponent to install defaults for.
|
||
|
*/
|
||
|
protected void installDefaults(JComponent c)
|
||
|
{
|
||
|
LookAndFeel.installColorsAndFont(c, "ToolTip.background",
|
||
|
"ToolTip.foreground", "ToolTip.font");
|
||
|
LookAndFeel.installBorder(c, "ToolTip.border");
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* This method installs the listeners for the given JComponent.
|
||
|
*
|
||
|
* @param c The JComponent to install listeners for.
|
||
|
*/
|
||
|
protected void installListeners(JComponent c)
|
||
|
{
|
||
|
propertyChangeHandler = new PropertyChangeHandler();
|
||
|
c.addPropertyChangeListener(propertyChangeHandler);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* This method installs the UI for the given JComponent.
|
||
|
*
|
||
|
* @param c The JComponent to install the UI for.
|
||
|
*/
|
||
|
public void installUI(JComponent c)
|
||
|
{
|
||
|
c.setOpaque(true);
|
||
|
installDefaults(c);
|
||
|
BasicHTML.updateRenderer(c, ((JToolTip) c).getTipText());
|
||
|
installListeners(c);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* This method paints the given JComponent with the given Graphics object.
|
||
|
*
|
||
|
* @param g The Graphics object to paint with.
|
||
|
* @param c The JComponent to paint.
|
||
|
*/
|
||
|
public void paint(Graphics g, JComponent c)
|
||
|
{
|
||
|
JToolTip tip = (JToolTip) c;
|
||
|
|
||
|
String text = tip.getTipText();
|
||
|
Font font = c.getFont();
|
||
|
FontMetrics fm = c.getFontMetrics(font);
|
||
|
int ascent = fm.getAscent();
|
||
|
Insets i = c.getInsets();
|
||
|
Dimension size = c.getSize();
|
||
|
Rectangle paintR = new Rectangle(i.left, i.top,
|
||
|
size.width - i.left - i.right,
|
||
|
size.height - i.top - i.bottom);
|
||
|
Color saved = g.getColor();
|
||
|
Font oldFont = g.getFont();
|
||
|
g.setColor(Color.BLACK);
|
||
|
|
||
|
View view = (View) c.getClientProperty(BasicHTML.propertyKey);
|
||
|
if (view != null)
|
||
|
view.paint(g, paintR);
|
||
|
else
|
||
|
g.drawString(text, paintR.x + 3, paintR.y + ascent);
|
||
|
|
||
|
g.setFont(oldFont);
|
||
|
g.setColor(saved);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* This method uninstalls the defaults for the given JComponent.
|
||
|
*
|
||
|
* @param c The JComponent to uninstall defaults for.
|
||
|
*/
|
||
|
protected void uninstallDefaults(JComponent c)
|
||
|
{
|
||
|
c.setForeground(null);
|
||
|
c.setBackground(null);
|
||
|
c.setFont(null);
|
||
|
c.setBorder(null);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* This method uninstalls listeners for the given JComponent.
|
||
|
*
|
||
|
* @param c The JComponent to uninstall listeners for.
|
||
|
*/
|
||
|
protected void uninstallListeners(JComponent c)
|
||
|
{
|
||
|
if (propertyChangeHandler != null)
|
||
|
{
|
||
|
c.removePropertyChangeListener(propertyChangeHandler);
|
||
|
propertyChangeHandler = null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* This method uninstalls the UI for the given JComponent.
|
||
|
*
|
||
|
* @param c The JComponent to uninstall.
|
||
|
*/
|
||
|
public void uninstallUI(JComponent c)
|
||
|
{
|
||
|
uninstallDefaults(c);
|
||
|
BasicHTML.updateRenderer(c, "");
|
||
|
uninstallListeners(c);
|
||
|
}
|
||
|
}
|