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    }