001 package org.springframework.richclient.util;
002
003 import java.awt.AWTEvent;
004 import java.awt.Font;
005 import java.awt.Frame;
006 import java.awt.Toolkit;
007 import java.awt.Window;
008 import java.awt.event.AWTEventListener;
009 import java.awt.event.MouseWheelEvent;
010
011 import javax.swing.SwingUtilities;
012 import javax.swing.UIManager;
013 import javax.swing.plaf.FontUIResource;
014
015 public class FontSizeAdjuster {
016 private static final AWTEventListener listener = new AWTEventListener() {
017 public void eventDispatched(AWTEvent e) {
018 MouseWheelEvent event = (MouseWheelEvent) e;
019 if (event.isControlDown()) {
020 adjust(event.getWheelRotation() < 0 ? -1 : 1);
021 }
022 }
023 };
024
025 private static int adjustment = 0;
026
027 private FontSizeAdjuster() {
028 // static class only
029 }
030
031 public static void init() {
032 Toolkit.getDefaultToolkit().addAWTEventListener(listener,
033 AWTEvent.MOUSE_WHEEL_EVENT_MASK);
034 }
035
036 public static void dispose() {
037 Toolkit.getDefaultToolkit().removeAWTEventListener(listener);
038 }
039
040 public static void adjust(int amount) {
041 Object[] objs = UIManager.getLookAndFeel().getDefaults().keySet()
042 .toArray();
043 for (int i = 0; i < objs.length; i++) {
044 if (objs[i].toString().toUpperCase().indexOf("FONT") != -1) {
045 Font font = UIManager.getFont(objs[i]);
046 if (font != null) {
047 UIManager.put(objs[i], new FontUIResource(font
048 .deriveFont((float)font.getSize() + amount)));
049 }
050 }
051 }
052
053 adjustment = adjustment + amount;
054
055 updateUI();
056 }
057
058 public static int getAdjustment() {
059 return adjustment;
060 }
061
062 private static void updateUI() {
063 Frame[] frames = Frame.getFrames();
064 for (int i = 0; i < frames.length; i++) {
065 update(frames[i]);
066 }
067 }
068
069 private static void update(Window window) {
070 SwingUtilities.updateComponentTreeUI(window);
071 window.pack();
072
073 // update the owned windows and dialogs
074 Window[] ownedWindows = window.getOwnedWindows();
075 for (int i = 0; i < ownedWindows.length; i++) {
076 Window childWindow = ownedWindows[i];
077 update(childWindow);
078 }
079 }
080 }