dmolony-DiskBrowser/src/com/bytezone/diskbrowser/gui/FontAction.java

154 lines
5.4 KiB
Java

package com.bytezone.diskbrowser.gui;
import java.awt.Canvas;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.EventListener;
import java.util.prefs.Preferences;
import javax.swing.Action;
import javax.swing.KeyStroke;
import javax.swing.event.EventListenerList;
import com.bytezone.diskbrowser.utilities.DefaultAction;
// -----------------------------------------------------------------------------------//
public class FontAction extends DefaultAction implements QuitListener
// -----------------------------------------------------------------------------------//
{
private static final String prefsFontName = "prefsFontName";
private static final String prefsFontSize = "prefsFontSize";
private static Canvas canvas;
private final EventListenerList listenerList = new EventListenerList ();
private FontFrame frame;
private String fontName;
private String fontSize;
private String text;
// ---------------------------------------------------------------------------------//
public FontAction ()
// ---------------------------------------------------------------------------------//
{
super ("Set Font...", "Set display to a different font or font size",
"/com/bytezone/loadlister/");
int mask = Toolkit.getDefaultToolkit ().getMenuShortcutKeyMaskEx ();
putValue (Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke (KeyEvent.VK_F, mask));
}
// ---------------------------------------------------------------------------------//
@Override
public void actionPerformed (ActionEvent e)
// ---------------------------------------------------------------------------------//
{
if (frame == null)
{
frame = new FontFrame (this);
frame.setSelectedValue (fontName);
frame.setSelectedSize (fontSize);
frame.setText (text);
}
frame.setVisible (true);
}
// ---------------------------------------------------------------------------------//
@Override
public void quit (Preferences preferences)
// ---------------------------------------------------------------------------------//
{
if (frame != null)
{
String fontName = frame.getSelectedValue ();
preferences.put (prefsFontName, fontName == null ? "Monospaced" : fontName);
String fontSize = frame.getSelectedSize ();
preferences.put (prefsFontSize, fontSize == null ? "12 point" : fontSize);
}
}
// ---------------------------------------------------------------------------------//
@Override
public void restore (Preferences preferences)
// ---------------------------------------------------------------------------------//
{
String fontName = preferences.get (prefsFontName, "Monospaced");
if (fontName.isEmpty ())
fontName = "Monospaced";
this.fontName = fontName;
if (frame != null)
frame.setSelectedValue (fontName);
String fontSize = preferences.get (prefsFontSize, "12 point");
if (fontSize.isEmpty ())
fontSize = "12 point";
this.fontSize = fontSize;
if (frame != null)
frame.setSelectedSize (fontSize);
int pos = fontSize.indexOf (' ');
int size = Integer.parseInt (fontSize.substring (0, pos));
fireFontChangeEvent (new Font (fontName, Font.PLAIN, size));
}
// ---------------------------------------------------------------------------------//
public void setSampleText (String text)
// ---------------------------------------------------------------------------------//
{
this.text = text;
if (frame != null)
frame.setText (text);
}
// ---------------------------------------------------------------------------------//
public interface FontChangeListener extends EventListener
// ---------------------------------------------------------------------------------//
{
public void changeFont (FontChangeEvent fontChangeEvent);
}
// ---------------------------------------------------------------------------------//
public class FontChangeEvent
// ---------------------------------------------------------------------------------//
{
public final Font font;
public final FontMetrics fontMetrics;
public FontChangeEvent (Font font)
{
this.font = font;
if (canvas == null)
canvas = new Canvas ();
fontMetrics = canvas.getFontMetrics (font);
}
}
// ---------------------------------------------------------------------------------//
public void addFontChangeListener (FontChangeListener listener)
// ---------------------------------------------------------------------------------//
{
listenerList.add (FontChangeListener.class, listener);
}
// ---------------------------------------------------------------------------------//
public void removeFontChangeListener (FontChangeListener listener)
// ---------------------------------------------------------------------------------//
{
listenerList.remove (FontChangeListener.class, listener);
}
// ---------------------------------------------------------------------------------//
public void fireFontChangeEvent (Font font)
// ---------------------------------------------------------------------------------//
{
FontChangeEvent fontChangeEvent = new FontChangeEvent (font);
FontChangeListener[] listeners = (listenerList.getListeners (FontChangeListener.class));
for (FontChangeListener listener : listeners)
listener.changeFont (fontChangeEvent);
}
}