1 /*
   2  *
   3  * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
   4  *
   5  * Redistribution and use in source and binary forms, with or without
   6  * modification, are permitted provided that the following conditions
   7  * are met:
   8  *
   9  *   - Redistributions of source code must retain the above copyright
  10  *     notice, this list of conditions and the following disclaimer.
  11  *
  12  *   - Redistributions in binary form must reproduce the above copyright
  13  *     notice, this list of conditions and the following disclaimer in the
  14  *     documentation and/or other materials provided with the distribution.
  15  *
  16  *   - Neither the name of Oracle nor the names of its
  17  *     contributors may be used to endorse or promote products derived
  18  *     from this software without specific prior written permission.
  19  *
  20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
  21  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  23  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  28  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  29  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31  */
  32 package java2d.demos.Fonts;
  33 
  34 
  35 import static java.awt.Color.BLACK;
  36 import static java.awt.Color.GRAY;
  37 import static java.awt.Color.WHITE;
  38 import java.awt.Component;
  39 import java.awt.Dimension;
  40 import java.awt.Font;
  41 import java.awt.FontMetrics;
  42 import java.awt.Graphics2D;
  43 import java.awt.GraphicsEnvironment;
  44 import java.awt.event.ActionEvent;
  45 import java.awt.event.ActionListener;
  46 import java.util.ArrayList;
  47 import java.util.List;
  48 import java2d.AnimatingControlsSurface;
  49 import java2d.CustomControls;
  50 import javax.swing.JMenu;
  51 import javax.swing.JMenuBar;
  52 import javax.swing.JMenuItem;
  53 import javax.swing.JSlider;
  54 import javax.swing.SwingConstants;
  55 import javax.swing.border.EtchedBorder;
  56 import javax.swing.event.ChangeEvent;
  57 import javax.swing.event.ChangeListener;
  58 
  59 
  60 /**
  61  * Scrolling text of fonts returned from GraphicsEnvironment.getAllFonts().
  62  */
  63 @SuppressWarnings("serial")
  64 public class AllFonts extends AnimatingControlsSurface {
  65 
  66     private static final List<Font> fonts = new ArrayList<Font>();
  67 
  68     static {
  69         GraphicsEnvironment ge =
  70                 GraphicsEnvironment.getLocalGraphicsEnvironment();
  71         for (Font font : ge.getAllFonts()) {
  72             if (font.canDisplayUpTo(font.getName()) != 0) {
  73                 fonts.add(font);
  74             }
  75         }
  76     }
  77     private int nStrs;
  78     private int strH;
  79     private int fi;
  80     protected int fsize = 14;
  81     protected List<Font> v = new ArrayList<Font>();
  82 
  83     public AllFonts() {
  84         setBackground(WHITE);
  85         setSleepAmount(500);
  86         setControls(new Component[] { new DemoControls(this) });
  87     }
  88 
  89     public void handleThread(int state) {
  90     }
  91 
  92     @Override
  93     public void reset(int w, int h) {
  94         v.clear();
  95         Font f = fonts.get(0).deriveFont(Font.PLAIN, fsize);
  96         FontMetrics fm = getFontMetrics(f);
  97         strH = (fm.getAscent() + fm.getDescent());
  98         nStrs = h / strH + 1;
  99         fi = 0;
 100     }
 101 
 102     @Override
 103     public void step(int w, int h) {
 104         if (fi < fonts.size()) {
 105             v.add(fonts.get(fi).deriveFont(Font.PLAIN, fsize));
 106         }
 107         if (v.size() == nStrs && !v.isEmpty() || fi > fonts.size()) {
 108             v.remove(0);
 109         }
 110         fi = v.isEmpty() ? 0 : ++fi;
 111     }
 112 
 113     @Override
 114     public void render(int w, int h, Graphics2D g2) {
 115 
 116         g2.setColor(BLACK);
 117 
 118         int yy = (fi >= fonts.size()) ? 0 : h - v.size() * strH - strH / 2;
 119 
 120         for (int i = 0; i < v.size(); i++) {
 121             Font f = v.get(i);
 122             int sw = getFontMetrics(f).stringWidth(f.getName());
 123             g2.setFont(f);
 124             g2.drawString(f.getName(), (w / 2 - sw / 2), yy += strH);
 125         }
 126     }
 127 
 128     public static void main(String[] argv) {
 129         createDemoFrame(new AllFonts());
 130     }
 131 
 132 
 133     static class DemoControls extends CustomControls implements ActionListener,
 134             ChangeListener {
 135 
 136         AllFonts demo;
 137         JSlider slider;
 138         int[] fsize = { 8, 14, 18, 24 };
 139         JMenuItem[] menuitem = new JMenuItem[fsize.length];
 140         Font[] font = new Font[fsize.length];
 141 
 142         @SuppressWarnings("LeakingThisInConstructor")
 143         public DemoControls(AllFonts demo) {
 144             this.demo = demo;
 145             setBackground(GRAY);
 146 
 147             int sleepAmount = (int) demo.getSleepAmount();
 148             slider = new JSlider(SwingConstants.HORIZONTAL, 0, 999, sleepAmount);
 149             slider.setBorder(new EtchedBorder());
 150             slider.setPreferredSize(new Dimension(90, 22));
 151             slider.addChangeListener(this);
 152             add(slider);
 153             JMenuBar menubar = new JMenuBar();
 154             add(menubar);
 155             JMenu menu = menubar.add(new JMenu("Font Size"));
 156             for (int i = 0; i < fsize.length; i++) {
 157                 font[i] = new Font(Font.SERIF, Font.PLAIN, fsize[i]);
 158                 menuitem[i] = menu.add(new JMenuItem(String.valueOf(fsize[i])));
 159                 menuitem[i].setFont(font[i]);
 160                 menuitem[i].addActionListener(this);
 161             }
 162         }
 163 
 164         @Override
 165         public void actionPerformed(ActionEvent e) {
 166             for (int i = 0; i < fsize.length; i++) {
 167                 if (e.getSource().equals(menuitem[i])) {
 168                     demo.fsize = fsize[i];
 169                     Dimension d = demo.getSize();
 170                     demo.reset(d.width, d.height);
 171                     break;
 172                 }
 173             }
 174         }
 175 
 176         @Override
 177         public void stateChanged(ChangeEvent e) {
 178             demo.setSleepAmount(slider.getValue());
 179         }
 180     }
 181 }