Java/Swing Components — различия между версиями

Материал из Java эксперт
Перейти к: навигация, поиск
 
Строка 44: Строка 44:
 
* [[Java/Swing Components/TreeTable | TreeTable]]
 
* [[Java/Swing Components/TreeTable | TreeTable]]
 
* [[Java/Swing Components/Wizard | Wizard]]
 
* [[Java/Swing Components/Wizard | Wizard]]
−
 
−
== A dialog allow selection and a font and its associated info. ==
 
−
 
−
 
−
 
−
 
−
 
−
 
−
 
 
−
  <!-- start source code -->
 
−
 
 
−
    <source lang="java">
 
−
 
 
−
/*
 
−
* Copyright (C) 2001-2004 Colin Bell
 
−
* colbell@users.sourceforge.net
 
−
*
 
−
* This library is free software; you can redistribute it and/or
 
−
* modify it under the terms of the GNU Lesser General Public
 
−
* License as published by the Free Software Foundation; either
 
−
* version 2.1 of the License, or (at your option) any later version.
 
−
*
 
−
* This library 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
 
−
* Lesser General Public License for more details.
 
−
*
 
−
* You should have received a copy of the GNU Lesser General Public
 
−
* License along with this library; if not, write to the Free Software
 
−
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
−
*/
 
−
import java.awt.BorderLayout;
 
−
import java.awt.Dialog;
 
−
import java.awt.Dimension;
 
−
import java.awt.Font;
 
−
import java.awt.Frame;
 
−
import java.awt.GraphicsEnvironment;
 
−
import java.awt.GridBagConstraints;
 
−
import java.awt.GridBagLayout;
 
−
import java.awt.Insets;
 
−
import java.awt.event.ActionEvent;
 
−
import java.awt.event.ActionListener;
 
−
import java.io.Serializable;
 
−
import javax.swing.BorderFactory;
 
−
import javax.swing.JButton;
 
−
import javax.swing.JCheckBox;
 
−
import javax.swing.JComboBox;
 
−
import javax.swing.JDialog;
 
−
import javax.swing.JLabel;
 
−
import javax.swing.JPanel;
 
−
/**
 
−
* A dialog allow selection and a font and its associated info.
 
−
*
 
−
* @author
 
−
*/
 
−
public class FontChooser extends JDialog
 
−
{
 
−
  private final boolean _selectStyles;
 
−
  private JComboBox _fontNamesCmb;
 
−
  private final JComboBox _fontSizesCmb = new JComboBox(new String[]
 
−
                        { "8", "9", "10", "12", "14" });
 
−
  private final JCheckBox _boldChk = new JCheckBox("Bold");
 
−
  private final JCheckBox _italicChk = new JCheckBox("Italic");
 
−
  private final JLabel _previewLbl = new JLabel("PreviewText");
 
−
  private Font _font;
 
−
  private ActionListener _previewUpdater;
 
−
  /**
 
−
  * Default ctor.
 
−
  */
 
−
  public FontChooser()
 
−
  {
 
−
    this((Frame)null);
 
−
  }
 
−
  /**
 
−
  * ctor specifying whether styles can be selected.
 
−
  *
 
−
  * @param selectStyles  If <TT>true</TT> bold and italic checkboxes displayed.
 
−
  */
 
−
  public FontChooser(boolean selectStyles)
 
−
  {
 
−
    this((Frame)null, selectStyles);
 
−
  }
 
−
  /**
 
−
  * ctor specifying the parent frame.
 
−
  *
 
−
  * @param owner Parent frame.
 
−
  */
 
−
  public FontChooser(Frame owner)
 
−
  {
 
−
    super(owner, "Font Chooser", true);
 
−
    _selectStyles = true;
 
−
    createUserInterface();
 
−
  }
 
−
  /**
 
−
  * ctor specifying the parent frame and whether styles can be selected.
 
−
  *
 
−
  * @param owner    Parent frame.
 
−
  * @param selectStyles  If <TT>true</TT> bold and italic checkboxes displayed.
 
−
  */
 
−
  public FontChooser(Frame owner, boolean selectStyles)
 
−
  {
 
−
    super(owner, "Font Chooser", true);
 
−
    _selectStyles = selectStyles;
 
−
    createUserInterface();
 
−
  }
 
−
  /**
 
−
  * ctor specifying the parent dialog.
 
−
  *
 
−
  * @param owner Parent frame.
 
−
  */
 
−
  public FontChooser(Dialog owner)
 
−
  {
 
−
    super(owner, "Font Chooser", true);
 
−
    _selectStyles = true;
 
−
    createUserInterface();
 
−
  }
 
−
  /**
 
−
  * ctor specifying the parent dialog and whether styles can be selected.
 
−
  *
 
−
  * @param owner Parent frame.
 
−
  * @param selectStyles  If <TT>true</TT> bold and italic checkboxes displayed.
 
−
  */
 
−
  public FontChooser(Dialog owner, boolean selectStyles)
 
−
  {
 
−
    super(owner, "Font Chooser", true);
 
−
    _selectStyles = selectStyles;
 
−
    createUserInterface();
 
−
  }
 
−
  /**
 
−
  * Component is being added to its parent.
 
−
  */
 
−
  public void addNotify()
 
−
  {
 
−
    super.addNotify();
 
−
    if (_previewUpdater == null)
 
−
    {
 
−
      _previewUpdater = new PreviewLabelUpdater();
 
−
      _fontNamesCmb.addActionListener(_previewUpdater);
 
−
      _fontSizesCmb.addActionListener(_previewUpdater);
 
−
      _boldChk.addActionListener(_previewUpdater);
 
−
      _italicChk.addActionListener(_previewUpdater);
 
−
    }
 
−
  }
 
−
  /**
 
−
  * Component is being removed from its parent.
 
−
  */
 
−
  public void removeNotify()
 
−
  {
 
−
    super.removeNotify();
 
−
    if (_previewUpdater != null)
 
−
    {
 
−
      _fontNamesCmb.removeActionListener(_previewUpdater);
 
−
      _fontSizesCmb.removeActionListener(_previewUpdater);
 
−
      _boldChk.removeActionListener(_previewUpdater);
 
−
      _italicChk.removeActionListener(_previewUpdater);
 
−
      _previewUpdater = null;
 
−
    }
 
−
  }
 
−
  public Font showDialog()
 
−
  {
 
−
    return showDialog(null);
 
−
  }
 
−
  /**
 
−
  * Show dialog defaulting to the passed font.
 
−
  *
 
−
  * @param font  The font to default to.
 
−
  */
 
−
  public Font showDialog(Font font)
 
−
  {
 
−
    if (font != null)
 
−
    {
 
−
      _fontNamesCmb.setSelectedItem(font.getName());
 
−
      _fontSizesCmb.setSelectedItem("" + font.getSize());
 
−
      _boldChk.setSelected(_selectStyles && font.isBold());
 
−
      _italicChk.setSelected(_selectStyles && font.isItalic());
 
−
    }
 
−
    else
 
−
    {
 
−
      _fontNamesCmb.setSelectedIndex(0);
 
−
      _fontSizesCmb.setSelectedIndex(0);
 
−
      _boldChk.setSelected(false);
 
−
      _italicChk.setSelected(false);
 
−
    }
 
−
    setupPreviewLabel();
 
−
    setVisible(true);
 
−
    return _font;
 
−
  }
 
−
  public Font getSelectedFont()
 
−
  {
 
−
    return _font;
 
−
  }
 
−
  protected void setupFontFromDialog()
 
−
  {
 
−
    int size = 12;
 
−
    try
 
−
    {
 
−
      size = Integer.parseInt((String)_fontSizesCmb.getSelectedItem());
 
−
    }
 
−
    catch (Exception ignore)
 
−
    {
 
−
      // Ignore.
 
−
    }
 
−
    FontInfo fi = new FontInfo();
 
−
    fi.setFamily((String)_fontNamesCmb.getSelectedItem());
 
−
    fi.setSize(size);
 
−
    fi.setIsBold(_boldChk.isSelected());
 
−
    fi.setIsItalic(_italicChk.isSelected());
 
−
    _font = fi.createFont();
 
−
  }
 
−
  private void createUserInterface()
 
−
  {
 
−
    final JPanel content = new JPanel(new GridBagLayout());
 
−
    final GridBagConstraints gbc = new GridBagConstraints();
 
−
    setContentPane(content);
 
−
    content.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
 
−
    gbc.anchor = GridBagConstraints.WEST;
 
−
    gbc.insets = new Insets(2, 2, 2, 2);
 
−
    gbc.fill = GridBagConstraints.HORIZONTAL;
 
−
    gbc.gridx = gbc.gridy = 0;
 
−
    content.add(new JLabel("Font"), gbc);
 
−
    ++gbc.gridx;
 
−
    content.add(new JLabel("Size"), gbc);
 
−
    if (_selectStyles)
 
−
    {
 
−
      ++gbc.gridx;
 
−
      content.add(new JLabel("Style"), gbc);
 
−
    }
 
−
    ++gbc.gridy;
 
−
    gbc.gridx = 0;
 
−
    _fontNamesCmb = new JComboBox(GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames());
 
−
    content.add(_fontNamesCmb, gbc);
 
−
    ++gbc.gridx;
 
−
    _fontSizesCmb.setEditable(true);
 
−
    content.add(_fontSizesCmb, gbc);
 
−
    if (_selectStyles)
 
−
    {
 
−
      ++gbc.gridx;
 
−
      content.add(_boldChk, gbc);
 
−
      ++gbc.gridy;
 
−
      content.add(_italicChk, gbc);
 
−
    }
 
−
    gbc.gridx = 0;
 
−
    ++gbc.gridy;
 
−
    gbc.gridwidth = GridBagConstraints.REMAINDER;
 
−
    gbc.fill = GridBagConstraints.BOTH;
 
−
    gbc.anchor = GridBagConstraints.CENTER;
 
−
    content.add(createPreviewPanel(), gbc);
 
−
    ++gbc.gridy;
 
−
    gbc.fill = GridBagConstraints.HORIZONTAL;
 
−
    content.add(createButtonsPanel(), gbc);
 
−
    pack();
 
−
    setResizable(true);
 
−
  }
 
−
  private JPanel createPreviewPanel()
 
−
  {
 
−
    final JPanel pnl = new JPanel(new BorderLayout());
 
−
    pnl.setBorder(BorderFactory.createTitledBorder("PreviewTitle"));
 
−
    Dimension prefSize = _previewLbl.getPreferredSize();
 
−
    prefSize.height = 50;
 
−
    _previewLbl.setPreferredSize(prefSize);
 
−
    pnl.add(_previewLbl, BorderLayout.CENTER);
 
−
    setupPreviewLabel();
 
−
    return pnl;
 
−
  }
 
−
  private JPanel createButtonsPanel()
 
−
  {
 
−
    JPanel pnl = new JPanel();
 
−
    JButton okBtn = new JButton("OK");
 
−
    okBtn.addActionListener(new ActionListener()
 
−
    {
 
−
      public void actionPerformed(ActionEvent evt)
 
−
      {
 
−
        setupFontFromDialog();
 
−
        dispose();
 
−
      }
 
−
    });
 
−
    JButton cancelBtn = new JButton("Cancel");
 
−
    cancelBtn.addActionListener(new ActionListener()
 
−
    {
 
−
      public void actionPerformed(ActionEvent evt)
 
−
      {
 
−
        FontChooser.this._font = null;
 
−
        dispose();
 
−
      }
 
−
    });
 
−
    pnl.add(okBtn);
 
−
    pnl.add(cancelBtn);
 
−
    getRootPane().setDefaultButton(okBtn);
 
−
    return pnl;
 
−
  }
 
−
  private void setupPreviewLabel()
 
−
  {
 
−
    setupFontFromDialog();
 
−
    _previewLbl.setFont(_font);
 
−
  }
 
−
  private final class PreviewLabelUpdater implements ActionListener
 
−
  {
 
−
    public void actionPerformed(ActionEvent evt)
 
−
    {
 
−
      setupPreviewLabel();
 
−
    }
 
−
  }
 
−
}
 
−
 
−
/*
 
−
* Copyright (C) 2001-2003 Colin Bell
 
−
* colbell@users.sourceforge.net
 
−
*
 
−
* This library is free software; you can redistribute it and/or
 
−
* modify it under the terms of the GNU Lesser General Public
 
−
* License as published by the Free Software Foundation; either
 
−
* version 2.1 of the License, or (at your option) any later version.
 
−
*
 
−
* This library 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
 
−
* Lesser General Public License for more details.
 
−
*
 
−
* You should have received a copy of the GNU Lesser General Public
 
−
* License along with this library; if not, write to the Free Software
 
−
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
−
*/
 
−
class FontInfo implements Cloneable, Serializable
 
−
{
 
−
    private static final long serialVersionUID = 1L;
 
−
    public interface IPropertyNames
 
−
  {
 
−
    String FAMILY = "family";
 
−
    String IS_BOLD = "isBold";
 
−
    String IS_ITALIC = "isItalic";
 
−
    String SIZE = "size";
 
−
  }
 
−
  private static String DEFAULT_FAMILY = "Monospaced";
 
−
  private String _familyName;
 
−
  private boolean _isBold;
 
−
  private boolean _isItalic;
 
−
  private int _size;
 
−
  public FontInfo()
 
−
  {
 
−
    super();
 
−
    setFamily(DEFAULT_FAMILY);
 
−
    setSize(12);
 
−
  }
 
−
  public FontInfo(Font font)
 
−
  {
 
−
    super();
 
−
    if (font == null)
 
−
    {
 
−
      throw new IllegalArgumentException("Null Font passed");
 
−
    }
 
−
    setFont(font);
 
−
  }
 
−
  /**
 
−
  * Return a copy of this object.
 
−
  */
 
−
  public Object clone()
 
−
  {
 
−
    try
 
−
    {
 
−
      return super.clone();
 
−
    }
 
−
    catch (CloneNotSupportedException ex)
 
−
    {
 
−
      throw new InternalError(ex.getMessage()); // Impossible.
 
−
    }
 
−
  }
 
−
  public String getFamily()
 
−
  {
 
−
    return _familyName;
 
−
  }
 
−
  public void setFamily(String value)
 
−
  {
 
−
    _familyName = value != null ? value : DEFAULT_FAMILY;
 
−
  }
 
−
  public boolean isBold()
 
−
  {
 
−
    return _isBold;
 
−
  }
 
−
  public void setIsBold(boolean value)
 
−
  {
 
−
    _isBold = value;
 
−
  }
 
−
  public boolean isItalic()
 
−
  {
 
−
    return _isItalic;
 
−
  }
 
−
  public void setIsItalic(boolean value)
 
−
  {
 
−
    _isItalic = value;
 
−
  }
 
−
  public int getSize()
 
−
  {
 
−
    return _size;
 
−
  }
 
−
  public void setSize(int value)
 
−
  {
 
−
    _size = value;
 
−
  }
 
−
  public void setFont(Font font) throws IllegalArgumentException
 
−
  {
 
−
    if (font == null)
 
−
    {
 
−
      throw new IllegalArgumentException("Null Font passed");
 
−
    }
 
−
    _familyName = font.getFamily();
 
−
    _isBold = font.isBold();
 
−
    _isItalic = font.isItalic();
 
−
    _size = font.getSize();
 
−
  }
 
−
  public boolean doesFontMatch(Font font)
 
−
  {
 
−
    if (font == null)
 
−
    {
 
−
      return false;
 
−
    }
 
−
    return font.getFamily().equals(_familyName)
 
−
      && font.getSize() == getSize()
 
−
      && font.getStyle() == generateStyle();
 
−
  }
 
−
  public int generateStyle()
 
−
  {
 
−
    int style = 0;
 
−
    if (!_isBold && !_isItalic)
 
−
    {
 
−
      style = Font.PLAIN;
 
−
    }
 
−
    else
 
−
    {
 
−
      if (_isBold)
 
−
      {
 
−
        style |= Font.BOLD;
 
−
      }
 
−
      if (_isItalic)
 
−
      {
 
−
        style |= Font.ITALIC;
 
−
      }
 
−
    }
 
−
    return style;
 
−
  }
 
−
  public Font createFont()
 
−
  {
 
−
    return new Font(_familyName, generateStyle(), _size);
 
−
  }
 
−
  // i18n ? What is this used for?
 
−
  public String toString()
 
−
  {
 
−
    StringBuffer buf = new StringBuffer();
 
−
    buf.append(_familyName).append(", " + _size);
 
−
    if (_isBold)
 
−
    {
 
−
      buf.append(", bold");
 
−
    }
 
−
    if (_isItalic)
 
−
    {
 
−
      buf.append(", italic");
 
−
    }
 
−
    return buf.toString();
 
−
  }
 
−
    /**
 
−
    * @see java.lang.Object#hashCode()
 
−
    */
 
−
    @Override
 
−
    public int hashCode() {
 
−
        final int PRIME = 31;
 
−
        int result = 1;
 
−
        result = PRIME * result + ((_familyName == null) ? 0 : _familyName.hashCode());
 
−
        result = PRIME * result + (_isBold ? 1231 : 1237);
 
−
        result = PRIME * result + (_isItalic ? 1231 : 1237);
 
−
        result = PRIME * result + _size;
 
−
        return result;
 
−
    }
 
−
    /**
 
−
    * @see java.lang.Object#equals(java.lang.Object)
 
−
    */
 
−
    @Override
 
−
    public boolean equals(Object obj) {
 
−
        if (this == obj)
 
−
            return true;
 
−
        if (obj == null)
 
−
            return false;
 
−
        if (getClass() != obj.getClass())
 
−
            return false;
 
−
        final FontInfo other = (FontInfo) obj;
 
−
        if (_familyName == null) {
 
−
            if (other._familyName != null)
 
−
                return false;
 
−
        } else if (!_familyName.equals(other._familyName))
 
−
            return false;
 
−
        if (_isBold != other._isBold)
 
−
            return false;
 
−
        if (_isItalic != other._isItalic)
 
−
            return false;
 
−
        if (_size != other._size)
 
−
            return false;
 
−
        return true;
 
−
    }
 
−
}
 
−
 
 
−
   
 
−
   
 
−
  </source>
 
−
   
 
−
 
 
−
  <!-- end source code -->
 
−
 
 
−
 
−
 
−
 
−
 
−
== FontChooser, adapted from NwFontChooserS by Noah Wairauch ==
 
−
 
−
 
−
 
−
 
−
 
−
 
−
 
 
−
  <!-- start source code -->
 
−
 
 
−
    <source lang="java">
 
−
 
 
−
/*BEGIN_COPYRIGHT_BLOCK
 
−
*
 
−
* Copyright (c) 2001-2008, JavaPLT group at Rice University (drjava@rice.edu)
 
−
* All rights reserved.
 
−
*
 
−
* Redistribution and use in source and binary forms, with or without
 
−
* modification, are permitted provided that the following conditions are met:
 
−
*    * Redistributions of source code must retain the above copyright
 
−
*      notice, this list of conditions and the following disclaimer.
 
−
*    * Redistributions in binary form must reproduce the above copyright
 
−
*      notice, this list of conditions and the following disclaimer in the
 
−
*      documentation and/or other materials provided with the distribution.
 
−
*    * Neither the names of DrJava, the JavaPLT group, Rice University, nor the
 
−
*      names of its contributors may be used to endorse or promote products
 
−
*      derived from this software without specific prior written permission.
 
−
*
 
−
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 
−
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 
−
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 
−
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 
−
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 
−
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 
−
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 
−
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 
−
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 
−
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 
−
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
−
*
 
−
* This software is Open Source Initiative approved Open Source Software.
 
−
* Open Source Initative Approved is a trademark of the Open Source Initiative.
 
−
*
 
−
* This file is part of DrJava.  Download the current version of this project
 
−
* from http://www.drjava.org/ or http://sourceforge.net/projects/drjava/
 
−
*
 
−
* END_COPYRIGHT_BLOCK*/
 
−
 
−
import javax.swing.*;
 
−
import javax.swing.event.ListSelectionEvent;
 
−
import javax.swing.event.ListSelectionListener;
 
−
import java.awt.*;
 
−
import java.awt.event.*;
 
−
/**
 
−
* FontChooser, adapted from NwFontChooserS by Noah Wairauch.
 
−
* (see http:///forum.java.sun.ru/thread.jsp?forum=57&thread=195067)
 
−
*
 
−
* @version $Id: FontChooser.java 4872 2009-04-06 21:37:28Z mgricken $
 
−
*/
 
−
public class FontChooser extends JDialog {
 
−
  /** Available font styles.
 
−
  */
 
−
  private static final String[] STYLES =
 
−
      new String[] { "Plain", "Bold", "Italic", "Bold Italic" };
 
−
  /** Available font sizes.
 
−
  */
 
−
  private static final String[] SIZES =
 
−
      new String[] { "3", "4", "5", "6", "7", "8", "9", "10", "11", "12",
 
−
                    "13", "14", "15", "16", "17", "18", "19", "20", "22",
 
−
                    "24", "27", "30", "34", "39", "45", "51", "60"};
 
−
  // Lists to display
 
−
  private NwList _styleList;
 
−
  private NwList _fontList;
 
−
  private NwList _sizeList;
 
−
  // Swing elements
 
−
  private JButton _okButton;
 
−
  private JButton _cancelButton;
 
−
  private JLabel _sampleText = new JLabel();
 
−
  private boolean _clickedOK = false;
 
−
  /** Constructs a new modal FontChooser for the given frame,
 
−
  * using the specified font.
 
−
  */
 
−
  private FontChooser(Frame parent, Font font) {
 
−
    super(parent, true);
 
−
    initAll();
 
−
    if (font == null) font = _sampleText.getFont();
 
−
    _fontList.setSelectedItem(font.getName());
 
−
    _sizeList.setSelectedItem(font.getSize() + "");
 
−
    _styleList.setSelectedItem(STYLES[font.getStyle()]);
 
−
    //this.setResizable(false);
 
−
    resize();
 
−
  }
 
−
  /** Method used to show the font chooser, and select a new font.
 
−
  *
 
−
  * @param parent The parent frame.
 
−
  * @param title  The title for this window.
 
−
  * @param font  The previously chosen font.
 
−
  * @return the newly chosen font.
 
−
  */
 
−
  public static Font showDialog(Frame parent, String title, Font font) {
 
−
    FontChooser fd = new FontChooser(parent, font);
 
−
    fd.setTitle(title);
 
−
   
 
−
    fd.setVisible(true);
 
−
    Font chosenFont = null;
 
−
    if (fd.clickedOK()) {
 
−
      chosenFont = fd.getFont();
 
−
    }
 
−
    fd.dispose();
 
−
    return (chosenFont);
 
−
  }
 
−
  /** Shows the font chooser with a standard title ("Font Chooser").
 
−
  */
 
−
  public static Font showDialog(Frame parent, Font font) {
 
−
    return showDialog(parent, "Font Chooser", font);
 
−
  }
 
−
  private void initAll() {
 
−
    getContentPane().setLayout(null);
 
−
    setBounds(50, 50, 425, 400);
 
−
    _sampleText = new JLabel();
 
−
    addLists();
 
−
    addButtons();
 
−
    _sampleText.setForeground(Color.black);
 
−
    getContentPane().add(_sampleText);
 
−
    addWindowListener(new WindowAdapter() {
 
−
      public void windowClosing(java.awt.event.WindowEvent e) {
 
−
        setVisible(false);
 
−
      }
 
−
    });
 
−
    addComponentListener(new ComponentAdapter() {
 
−
      public void componentResized(ComponentEvent evt) {
 
−
        resize();
 
−
      }
 
−
    });
 
−
  }
 
−
  private void resize() {
 
−
    int w = getWidth();
 
−
    int h = getHeight();
 
−
    double wf = (double) w / 425;
 
−
    int w2 = (int) (80 * wf);
 
−
    int w3 = (int) (50 * wf);
 
−
    if (w3 < 30) w3 = 30;
 
−
    int w1 = w - w2 - w3 - 25;
 
−
    _fontList.setBounds(5, 5, w1, h - 91);
 
−
    _styleList.setBounds(w1 + 10, 5, w2, h - 91);
 
−
    _sizeList.setBounds(w1 + w2 + 15, 5, w3, h - 91);
 
−
    _sampleText.setBounds(10, h - 78, w - 20, 45);
 
−
    _okButton.setBounds(w - 165, h - 55, 70, 20);
 
−
    _cancelButton.setBounds(w - 81, h - 55, 70, 20);
 
−
    validate();
 
−
  }
 
−
  private void addLists() {
 
−
    _fontList = new NwList(GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames());
 
−
    _styleList = new NwList(STYLES);
 
−
    _sizeList = new NwList(SIZES);
 
−
    getContentPane().add(_fontList);
 
−
    getContentPane().add(_styleList);
 
−
    getContentPane().add(_sizeList);
 
−
  }
 
−
  private void addButtons() {
 
−
    _okButton = new JButton("OK");
 
−
    _okButton.setMargin(new Insets(0, 0, 0, 0));
 
−
    _cancelButton = new JButton("Cancel");
 
−
    _cancelButton.setMargin(new Insets(0, 0, 0, 0));
 
−
    _okButton.setFont(new Font(" ", 1, 11));
 
−
    _cancelButton.setFont(new Font(" ", 1, 12));
 
−
    getContentPane().add(_okButton);
 
−
    getContentPane().add(_cancelButton);
 
−
    _okButton.addActionListener(new ActionListener() {
 
−
      public void actionPerformed(ActionEvent e) {
 
−
        setVisible(false);
 
−
        _clickedOK = true;
 
−
      }
 
−
    });
 
−
    _cancelButton.addActionListener(new ActionListener() {
 
−
      public void actionPerformed(ActionEvent e) {
 
−
        setVisible(false);
 
−
        _clickedOK = false;
 
−
      }
 
−
    });
 
−
  }
 
−
  private void showSample() {
 
−
    int g = 0;
 
−
    try { g = Integer.parseInt(_sizeList.getSelectedValue()); }
 
−
    catch (NumberFormatException nfe) { /* do nothing */ }
 
−
    String st = _styleList.getSelectedValue();
 
−
    int s = Font.PLAIN;
 
−
    if (st.equalsIgnoreCase("Bold")) s = Font.BOLD;
 
−
    if (st.equalsIgnoreCase("Italic")) s = Font.ITALIC;
 
−
    if (st.equalsIgnoreCase("Bold Italic")) s = Font.BOLD | Font.ITALIC;
 
−
    _sampleText.setFont(new Font(_fontList.getSelectedValue(), s, g));
 
−
    _sampleText.setText("The quick brown fox jumped over the lazy dog.");
 
−
    _sampleText.setVerticalAlignment(SwingConstants.TOP);
 
−
  }
 
−
  /** Returns whether the user clicked OK when the dialog was closed. (If false, the user clicked cancel.) */
 
−
  public boolean clickedOK() { return _clickedOK; }
 
−
  /** Returns the currently selected Font. */
 
−
  public Font getFont() { return _sampleText.getFont(); }
 
−
  /** Private inner class for a list which displays a list of options in addition to a label indicating the currently
 
−
    * selected item.
 
−
    */
 
−
  public class NwList extends JPanel {
 
−
    JList jl;
 
−
    JScrollPane sp;
 
−
    JLabel jt;
 
−
    String si = " ";
 
−
    public NwList(String[] values) {
 
−
      setLayout(null);
 
−
      jl = new JList(values);
 
−
      sp = new JScrollPane(jl);
 
−
      jt = new JLabel();
 
−
      jt.setBackground(Color.white);
 
−
      jt.setForeground(Color.black);
 
−
      jt.setOpaque(true);
 
−
      jt.setBorder(new JTextField().getBorder());
 
−
      jt.setFont(getFont());
 
−
      jl.addListSelectionListener(new ListSelectionListener() {
 
−
        public void valueChanged(ListSelectionEvent e) {
 
−
          jt.setText((String) jl.getSelectedValue());
 
−
          si = (String) jl.getSelectedValue();
 
−
          showSample();
 
−
        }
 
−
      });
 
−
      add(sp);
 
−
      add(jt);
 
−
    }
 
−
    public void setBounds(int x, int y, int w, int h) {
 
−
      super.setBounds(x, y, w, h);
 
−
      sp.setBounds(0, y + 16, w, h - 23);
 
−
      sp.revalidate();
 
−
      jt.setBounds(0, 0, w, 20);
 
−
    }
 
−
    public String getSelectedValue() { return (si); }
 
−
    public void setSelectedItem(String s) { jl.setSelectedValue(s, true);}
 
−
  }
 
−
}
 
−
 
 
−
   
 
−
   
 
−
  </source>
 
−
   
 
−
 
 
−
  <!-- end source code -->
 
−
 
 
−
 
−
 
−
 
−
 
−
== FontChooser by Noah w ==
 
−
 
−
 
−
 
−
 
−
 
−
 
−
 
 
−
  <!-- start source code -->
 
−
 
 
−
    <source lang="java">
 
−
 
 
−
/* This code was found posted on a forum without any copyright
 
−
* restrictions. It was written by someone named Noah W.
 
−
* That"s all I know */
 
−
/* I have modified the original code but claim no copyright on it of any kind */
 
−
 
−
/*
 
−
This file is part of BORG.
 
−
    BORG 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 of the License, or
 
−
    (at your option) any later version.
 
−
    BORG 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 BORG; if not, write to the Free Software
 
−
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
−
Copyright 2003 by Mike Berger
 
−
*/
 
−
 
−
import java.awt.Color;
 
−
import java.awt.Font;
 
−
import java.awt.Frame;
 
−
import java.awt.GraphicsEnvironment;
 
−
import java.awt.Insets;
 
−
import java.awt.event.ActionEvent;
 
−
import java.awt.event.ActionListener;
 
−
import java.awt.event.WindowAdapter;
 
−
import java.awt.event.WindowEvent;
 
−
import java.util.Enumeration;
 
−
import javax.swing.JButton;
 
−
import javax.swing.JDialog;
 
−
import javax.swing.JLabel;
 
−
import javax.swing.JList;
 
−
import javax.swing.JPanel;
 
−
import javax.swing.JScrollPane;
 
−
import javax.swing.JTextField;
 
−
import javax.swing.UIManager;
 
−
import javax.swing.event.ListSelectionEvent;
 
−
import javax.swing.event.ListSelectionListener;
 
−
import javax.swing.plaf.FontUIResource;
 
−
 
−
//
 
−
// FontChooser by Noah w.
 
−
//
 
−
public class NwFontChooserS extends JDialog {
 
−
    String[] styleList = new String[] { "Plain", "Bold", "Italic" };
 
−
    String[] sizeList =
 
−
    new String[] {
 
−
        "3",
 
−
        "4",
 
−
        "5",
 
−
        "6",
 
−
        "7",
 
−
        "8",
 
−
        "9",
 
−
        "10",
 
−
        "11",
 
−
        "12",
 
−
        "13",
 
−
        "14",
 
−
        "15",
 
−
        "16",
 
−
        "17",
 
−
        "18",
 
−
        "19",
 
−
        "20",
 
−
        "22",
 
−
        "24",
 
−
        "27",
 
−
        "30",
 
−
        "34",
 
−
        "39",
 
−
        "45",
 
−
        "51",
 
−
        "60" };
 
−
        NwList StyleList;
 
−
        NwList FontList;
 
−
        NwList SizeList;
 
−
        static JLabel Sample = new JLabel();
 
−
        boolean ob = false;
 
−
       
 
−
        private NwFontChooserS(Frame parent, boolean modal, Font font) {
 
−
            super(parent, modal);
 
−
            initAll();
 
−
            setTitle("Font Choosr");
 
−
            if (font == null)
 
−
                font = Sample.getFont();
 
−
            FontList.setSelectedItem(font.getName());
 
−
            SizeList.setSelectedItem(font.getSize() + "");
 
−
            StyleList.setSelectedItem(styleList[font.getStyle()]);
 
−
           
 
−
        }
 
−
        public static Font showDialog(Frame parent, String s, Font font) {
 
−
            NwFontChooserS fd = new NwFontChooserS(parent, true, font);
 
−
            if (s != null)
 
−
                fd.setTitle(s);
 
−
            fd.setVisible(true);
 
−
            Font fo = null;
 
−
            if (fd.ob)
 
−
                fo = Sample.getFont();
 
−
            fd.dispose();
 
−
            return (fo);
 
−
        }
 
−
        private void initAll() {
 
−
            getContentPane().setLayout(null);
 
−
            setBounds(50, 50, 450, 450);
 
−
            addLists();
 
−
            addButtons();
 
−
            Sample.setBounds(10, 320, 415, 25);
 
−
            Sample.setForeground(Color.black);
 
−
            getContentPane().add(Sample);
 
−
            addWindowListener(new WindowAdapter() {
 
−
                public void windowClosing(WindowEvent e) {
 
−
                    setVisible(false);
 
−
                }
 
−
            });
 
−
        }
 
−
        private void addLists() {
 
−
            FontList =
 
−
            new NwList(
 
−
            GraphicsEnvironment
 
−
            .getLocalGraphicsEnvironment()
 
−
            .getAvailableFontFamilyNames());
 
−
            StyleList = new NwList(styleList);
 
−
            SizeList = new NwList(sizeList);
 
−
            FontList.setBounds(10, 10, 260, 295);
 
−
            StyleList.setBounds(280, 10, 80, 295);
 
−
            SizeList.setBounds(370, 10, 40, 295);
 
−
            getContentPane().add(FontList);
 
−
            getContentPane().add(StyleList);
 
−
            getContentPane().add(SizeList);
 
−
        }
 
−
        private void addButtons() {
 
−
            JButton ok = new JButton("OK");
 
−
            ok.setMargin(new Insets(0, 0, 0, 0));
 
−
            JButton ca = new JButton("Cancel");
 
−
            ca.setMargin(new Insets(0, 0, 0, 0));
 
−
            ok.setBounds(260, 350, 70, 20);
 
−
            ok.setFont(new Font(" ", 1, 11));
 
−
            ca.setBounds(340, 350, 70, 20);
 
−
            ca.setFont(new Font(" ", 1, 12));
 
−
            getContentPane().add(ok);
 
−
            getContentPane().add(ca);
 
−
            ok.addActionListener(new ActionListener() {
 
−
                public void actionPerformed(ActionEvent e) {
 
−
                    setVisible(false);
 
−
                    ob = true;
 
−
                }
 
−
            });
 
−
            ca.addActionListener(new ActionListener() {
 
−
                public void actionPerformed(ActionEvent e) {
 
−
                    setVisible(false);
 
−
                    ob = false;
 
−
                }
 
−
            });
 
−
        }
 
−
        private void showSample() {
 
−
            int g = 0;
 
−
            try {
 
−
                g = Integer.parseInt(SizeList.getSelectedValue());
 
−
            }
 
−
            catch (NumberFormatException nfe) {
 
−
            }
 
−
            String st = StyleList.getSelectedValue();
 
−
            int s = Font.PLAIN;
 
−
            if (st.equalsIgnoreCase("Bold"))
 
−
                s = Font.BOLD;
 
−
            if (st.equalsIgnoreCase("Italic"))
 
−
                s = Font.ITALIC;
 
−
            Sample.setFont(new Font(FontList.getSelectedValue(), s, g));
 
−
            Sample.setText("The quick brown fox jumped over the lazy dog.");
 
−
        }
 
−
        //////////////////////////////////////////////////////////////////////
 
−
        private class NwList extends JPanel {
 
−
            JList jl;
 
−
            JScrollPane sp;
 
−
            JLabel jt;
 
−
            String si = " ";
 
−
           
 
−
            public NwList(String[] values) {
 
−
                setLayout(null);
 
−
                jl = new JList(values);
 
−
                sp = new JScrollPane(jl);
 
−
                jt = new JLabel();
 
−
                jt.setBackground(Color.white);
 
−
                jt.setForeground(Color.black);
 
−
                jt.setOpaque(true);
 
−
                jt.setBorder(new JTextField().getBorder());
 
−
                jt.setFont(getFont());
 
−
                jl.setBounds(0, 0, 100, 1000);
 
−
                jl.setBackground(Color.white);
 
−
                jl.addListSelectionListener(new ListSelectionListener() {
 
−
                    public void valueChanged(ListSelectionEvent e) {
 
−
                        jt.setText((String) jl.getSelectedValue());
 
−
                        si = (String) jl.getSelectedValue();
 
−
                        showSample();
 
−
                    }
 
−
                });
 
−
                add(sp);
 
−
                add(jt);
 
−
            }
 
−
            public String getSelectedValue() {
 
−
                return (si);
 
−
            }
 
−
            public void setSelectedItem(String s) {
 
−
                jl.setSelectedValue(s, true);
 
−
            }
 
−
            public void setBounds(int x, int y, int w, int h) {
 
−
                super.setBounds(x, y, w, h);
 
−
                sp.setBounds(0, y + 12, w, h - 23);
 
−
                sp.revalidate();
 
−
                jt.setBounds(0, 0, w, 20);
 
−
            }
 
−
        }
 
−
       
 
−
        static public String fontString(Font font) {
 
−
            String fs = font.getFamily();
 
−
            if( !font.isPlain() ) {
 
−
                fs += "-";
 
−
                if( font.isBold()) {
 
−
                    fs += "BOLD";
 
−
                }
 
−
                if( font.isItalic()) {
 
−
                    fs += "ITALIC";
 
−
                }
 
−
            }
 
−
            fs += "-" + font.getSize();
 
−
            return(fs);
 
−
        }
 
−
       
 
−
        static public void setDefaultFont(Font f ) {
 
−
            FontUIResource fui = new FontUIResource(f);
 
−
            Enumeration<Object> keys = UIManager.getDefaults().keys();
 
−
            while (keys.hasMoreElements()) {
 
−
                Object key = keys.nextElement();
 
−
                Object value = UIManager.get(key);
 
−
                if (value instanceof FontUIResource)
 
−
                    UIManager.put(key, fui);
 
−
            }
 
−
           
 
−
        }
 
−
       
 
−
        public static void main(String args[]) {
 
−
            Font font = null;
 
−
            font = NwFontChooserS.showDialog(null, null, null);
 
−
           
 
−
            System.out.println(fontString(font));
 
−
        }
 
−
}
 
−
 
 
−
   
 
−
   
 
−
  </source>
 
−
   
 
−
 
 
−
  <!-- end source code -->
 
−
 
 
−
 
−
 
−
 
−
 
−
== Font Chooser extends javax.swing.JDialog ==
 
−
 
−
 
−
 
−
 
−
 
−
 
−
 
 
−
  <!-- start source code -->
 
−
 
 
−
    <source lang="java">
 
−
 
 
−
/*
 
−
Atlantida is an open source (GPL) multilingual dictionary written in Java.
 
−
It can translate words from one language to another and pronounce them.
 
−
Copyright (C) 2006 Sergey S. http://atla.revdanica.ru/
 
−
This program 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
 
−
of the License, or (at your option) any later version.
 
−
This program 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 this program; if not, write to the Free Software
 
−
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
−
*/
 
−
/**
 
−
* FontChooser
 
−
* @author Janos Szatmary, Sergei S.
 
−
* @version 003
 
−
*/
 
−
/*
 
−
* http://forum.java.sun.ru/thread.jsp?forum=57&thread=124810
 
−
* For those who asked where"s the constructor, have in mind that the constructor provided
 
−
* is private. As the author of the code says, the use of this class is as
 
−
* follows (supposing we are in a Frame class):
 
−
* FontChooser.showDialog(this,"FontChooser",new Font("Dialog", 0, 12));
 
−
* This file originally writter by Janos Szatmary, then modifyed by Sergei S. for
 
−
* Atlantida Multilingual Dictionary http://atla.sf.net
 
−
*/
 
−
 
−
import java.awt.*;
 
−
import java.awt.event.*;
 
−
import java.util.*;
 
−
import javax.swing.*;
 
−
 
−
public class FontChooser extends javax.swing.JDialog
 
−
{
 
−
  String[] styleList = new String[]
 
−
  { "Plain","Bold","Italic"};
 
−
  String[] sizeList = new String[]
 
−
  { "2","4","6","8","10","12","14","16","18","20","22","24","30","36","48","72"};
 
−
  String currentFont = null;
 
−
  int currentStyle = -1;
 
−
  int currentSize = -1;
 
−
  public boolean ok = false;
 
−
  /* ------------------------------------------------------------- */
 
−
  private FontChooser(java.awt.Frame parent,boolean modal)
 
−
  {
 
−
    super (parent,modal);
 
−
    initComponents();
 
−
    setListValues(jFontList,GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames());
 
−
    setListValues(jStyleList,styleList);
 
−
    setListValues(jSizeList,sizeList);
 
−
    setCurrentFont(jSample.getFont());
 
−
    pack();
 
−
  }
 
−
  private FontChooser(java.awt.Frame parent,boolean modal,Font font)
 
−
  {
 
−
    this(parent,modal);
 
−
    setCurrentFont(font);
 
−
  }
 
−
  /* ------------------------------------------------------------- */
 
−
  private void setListValues(JList list,String[] values)
 
−
  {
 
−
    if(list.getModel() instanceof DefaultListModel)
 
−
    {
 
−
      DefaultListModel model = (DefaultListModel)
 
−
                              list.getModel();
 
−
      model.removeAllElements();
 
−
      for( String value : values )
 
−
      {
 
−
        model.addElement( value );
 
−
      }
 
−
    }
 
−
  }
 
−
  /* ------------------------------------------------------------- */
 
−
  private void setSampleFont()
 
−
  {
 
−
    if(currentFont != null && currentStyle >= 0 && currentSize > 0)
 
−
    {
 
−
      jSample.setFont(new Font
 
−
                      (currentFont,currentStyle,currentSize));
 
−
    }
 
−
  }
 
−
  private String styleToString(int style)
 
−
  {
 
−
    String str = "";
 
−
    if((style&Font.BOLD) == Font.BOLD)
 
−
    {
 
−
      if(str.length() > 0)
 
−
      {
 
−
        str += ",";
 
−
      }
 
−
      str += "Bold";
 
−
    }
 
−
    if((style&Font.ITALIC) == Font.ITALIC)
 
−
    {
 
−
      if(str.length() > 0)
 
−
      {
 
−
        str += ",";
 
−
      }
 
−
      str += "Italic";
 
−
    }
 
−
    if( str.length() <= 0 )
 
−
    {
 
−
      str = "Plain";
 
−
    }
 
−
    return str;
 
−
  }
 
−
  /* ------------------------------------------------------------- */
 
−
  public Font getCurrentFont()
 
−
  {
 
−
    return jSample.getFont();
 
−
  }
 
−
  /* ------------------------------------------------------------- */
 
−
  public void setCurrentFont(Font font)
 
−
  {
 
−
    if(font==null)
 
−
    {
 
−
      font = jSample.getFont();
 
−
    }
 
−
    jFont.setText(font.getName());
 
−
    jFontActionPerformed(null);
 
−
    jStyle.setText(styleToString(font.getStyle()));
 
−
    jStyleActionPerformed(null);
 
−
    jSize.setText(Integer.toString(font.getSize()));
 
−
    jSizeActionPerformed(null);
 
−
  }
 
−
 
−
  // Create font chooser dialog.
 
−
  // If user selected a font (i.e. clicked OK button) - return the font that user has selected.
 
−
  // If user didn"t click OK button - return "null".
 
−
  public static Font showDialog( Frame parent, String title, Font font)
 
−
  {
 
−
    FontChooser dialog = new FontChooser(parent,true,font);
 
−
    Point p1 = parent.getLocation();
 
−
    Dimension d1 = parent.getSize();
 
−
    Dimension d2 = dialog.getSize();
 
−
    int x = p1.x+(d1.width-d2.width)/2;
 
−
    int y = p1.y+(d1.height-d2.height)/2;
 
−
    if(x < 0)
 
−
    {
 
−
      x = 0;
 
−
    }
 
−
    if(y < 0)
 
−
    {
 
−
      y = 0;
 
−
    }
 
−
    if(title!=null)
 
−
    {
 
−
      dialog.setTitle(title);
 
−
    }
 
−
    dialog.setLocation(x,y);
 
−
    dialog.setVisible(true);
 
−
    Font newfont = null;
 
−
    if(dialog.ok)
 
−
    {
 
−
      newfont = dialog.getCurrentFont();
 
−
    }
 
−
    dialog.dispose();
 
−
    return newfont;
 
−
  }
 
−
  /** This method is called from within the constructor to
 
−
  * initialize the form.
 
−
  * WARNING: Do NOT modify this code. The content of this method is
 
−
  * always regenerated by the FormEditor.
 
−
  */
 
−
  private void initComponents()
 
−
  {
 
−
    jPanel3 = new javax.swing.JPanel();
 
−
    jFont = new javax.swing.JTextField();
 
−
    jScrollPane1 = new javax.swing.JScrollPane();
 
−
    jFontList = new javax.swing.JList();
 
−
    jPanel4 = new javax.swing.JPanel();
 
−
    jStyle = new javax.swing.JTextField();
 
−
    jScrollPane2 = new javax.swing.JScrollPane();
 
−
    jStyleList = new javax.swing.JList();
 
−
    jPanel5 = new javax.swing.JPanel();
 
−
    jSize = new javax.swing.JTextField();
 
−
    jScrollPane3 = new javax.swing.JScrollPane();
 
−
    jSizeList = new javax.swing.JList();
 
−
    jPanel1 = new javax.swing.JPanel();
 
−
    jScrollPane4 = new javax.swing.JScrollPane();
 
−
    jSample = new javax.swing.JTextArea();
 
−
    jButtons = new javax.swing.JPanel();
 
−
    jOk = new javax.swing.JButton();
 
−
    jCancel = new javax.swing.JButton();
 
−
    jLabel6 = new javax.swing.JLabel();
 
−
    getContentPane().setLayout(new java.awt.GridBagLayout());
 
−
    java.awt.GridBagConstraints gridBagConstraints1;
 
−
    setTitle("Font Chooser");
 
−
    addWindowListener(new java.awt.event.WindowAdapter()
 
−
                      {
 
−
                        public void windowClosing(java.awt.event.WindowEvent evt)
 
−
                        {
 
−
                          closeDialog(evt);
 
−
                        }
 
−
                      }
 
−
                    );
 
−
    jPanel3.setLayout(new java.awt.GridBagLayout());
 
−
    java.awt.GridBagConstraints gridBagConstraints2;
 
−
    jPanel3.setBorder(new javax.swing.border.TitledBorder(new javax.swing.border.EtchedBorder(), " Font "));
 
−
    jFont.setColumns(24);
 
−
    jFont.addActionListener(new java.awt.event.ActionListener()
 
−
                            {
 
−
                              public void actionPerformed(java.awt.event.ActionEvent evt)
 
−
                              {
 
−
                                jFontActionPerformed(evt);
 
−
                              }
 
−
                            }
 
−
                          );
 
−
    gridBagConstraints2 = new java.awt.GridBagConstraints();
 
−
    gridBagConstraints2.gridwidth = 0;
 
−
    gridBagConstraints2.fill =
 
−
    java.awt.GridBagConstraints.HORIZONTAL;
 
−
    gridBagConstraints2.insets = new java.awt.Insets(0, 3, 0, 3);
 
−
    gridBagConstraints2.anchor = java.awt.GridBagConstraints.NORTHWEST;
 
−
    gridBagConstraints2.weightx = 1.0;
 
−
    jPanel3.add(jFont, gridBagConstraints2);
 
−
 
−
    jFontList.setModel(new DefaultListModel());
 
−
    jFontList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
 
−
    jFontList.addListSelectionListener(new javax.swing.event.ListSelectionListener()
 
−
                                      {
 
−
                                        public void valueChanged(javax.swing.event.ListSelectionEvent evt)
 
−
                                        {
 
−
                                          jFontListValueChanged(evt);
 
−
                                        }
 
−
                                      }
 
−
                                      );
 
−
    jScrollPane1.setViewportView(jFontList);
 
−
    gridBagConstraints2 = new java.awt.GridBagConstraints();
 
−
    gridBagConstraints2.fill = java.awt.GridBagConstraints.BOTH;
 
−
    gridBagConstraints2.insets = new java.awt.Insets(3, 3, 3, 3);
 
−
    gridBagConstraints2.anchor = java.awt.GridBagConstraints.NORTHWEST;
 
−
    gridBagConstraints2.weightx = 1.0;
 
−
    gridBagConstraints2.weighty = 1.0;
 
−
    jPanel3.add(jScrollPane1, gridBagConstraints2);
 
−
 
−
    gridBagConstraints1 = new java.awt.GridBagConstraints();
 
−
    gridBagConstraints1.fill = java.awt.GridBagConstraints.BOTH;
 
−
    gridBagConstraints1.insets = new java.awt.Insets(5, 5, 0, 0);
 
−
    gridBagConstraints1.weightx = 0.5;
 
−
    gridBagConstraints1.weighty = 1.0;
 
−
    getContentPane().add(jPanel3, gridBagConstraints1);
 
−
 
−
    jPanel4.setLayout(new java.awt.GridBagLayout());
 
−
    java.awt.GridBagConstraints gridBagConstraints3;
 
−
    jPanel4.setBorder(new javax.swing.border.TitledBorder(new javax.swing.border.EtchedBorder(), " Style "));
 
−
    jStyle.setColumns(18);
 
−
    jStyle.addActionListener(new java.awt.event.ActionListener()
 
−
                            {
 
−
                              public void actionPerformed(java.awt.event.ActionEvent evt)
 
−
                              {
 
−
                                jStyleActionPerformed(evt);
 
−
                              }
 
−
                            }
 
−
                            );
 
−
    gridBagConstraints3 = new java.awt.GridBagConstraints();
 
−
    gridBagConstraints3.gridwidth = 0;
 
−
    gridBagConstraints3.fill =
 
−
    java.awt.GridBagConstraints.HORIZONTAL;
 
−
    gridBagConstraints3.insets = new java.awt.Insets(0, 3, 0, 3);
 
−
    gridBagConstraints3.anchor = java.awt.GridBagConstraints.NORTHWEST;
 
−
    gridBagConstraints3.weightx = 1.0;
 
−
    jPanel4.add(jStyle, gridBagConstraints3);
 
−
    jStyleList.setModel(new DefaultListModel());
 
−
    jStyleList.setVisibleRowCount(4);
 
−
    jStyleList.addListSelectionListener(new javax.swing.event.ListSelectionListener()
 
−
                                        {
 
−
                                          public void valueChanged(javax.swing.event.ListSelectionEvent evt)
 
−
                                          {
 
−
                                            jStyleListValueChanged(evt);
 
−
                                          }
 
−
                                        }
 
−
                                      );
 
−
    jScrollPane2.setViewportView(jStyleList);
 
−
    gridBagConstraints3 = new java.awt.GridBagConstraints();
 
−
    gridBagConstraints3.fill = java.awt.GridBagConstraints.BOTH;
 
−
    gridBagConstraints3.insets = new java.awt.Insets(3, 3, 3, 3);
 
−
    gridBagConstraints3.anchor = java.awt.GridBagConstraints.NORTHWEST;
 
−
    gridBagConstraints3.weightx = 0.5;
 
−
    gridBagConstraints3.weighty = 1.0;
 
−
    jPanel4.add(jScrollPane2, gridBagConstraints3);
 
−
    gridBagConstraints1 = new java.awt.GridBagConstraints();
 
−
    gridBagConstraints1.fill = java.awt.GridBagConstraints.BOTH;
 
−
    gridBagConstraints1.insets = new java.awt.Insets(5, 5, 0, 0);
 
−
    gridBagConstraints1.weightx = 0.375;
 
−
    gridBagConstraints1.weighty = 1.0;
 
−
    getContentPane().add(jPanel4, gridBagConstraints1);
 
−
    jPanel5.setLayout(new java.awt.GridBagLayout());
 
−
    java.awt.GridBagConstraints gridBagConstraints4;
 
−
    jPanel5.setBorder(new javax.swing.border.TitledBorder(new javax.swing.border.EtchedBorder(), " Size "));
 
−
    jSize.setColumns(6);
 
−
    jSize.addActionListener(new
 
−
                            java.awt.event.ActionListener()
 
−
                            {
 
−
                              public void actionPerformed(java.awt.event.ActionEvent evt)
 
−
                              {
 
−
                                jSizeActionPerformed(evt);
 
−
                              }
 
−
                            }
 
−
                          );
 
−
    gridBagConstraints4 = new java.awt.GridBagConstraints();
 
−
    gridBagConstraints4.gridwidth = 0;
 
−
    gridBagConstraints4.fill = java.awt.GridBagConstraints.HORIZONTAL;
 
−
    gridBagConstraints4.insets = new java.awt.Insets(0, 3, 0, 3);
 
−
    gridBagConstraints4.anchor = java.awt.GridBagConstraints.NORTHWEST;
 
−
    gridBagConstraints4.weightx = 1.0;
 
−
    jPanel5.add(jSize, gridBagConstraints4);
 
−
    jSizeList.setModel(new DefaultListModel());
 
−
    jSizeList.setVisibleRowCount(4);
 
−
    jSizeList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
 
−
    jSizeList.addListSelectionListener(new javax.swing.event.ListSelectionListener()
 
−
                                      {
 
−
                                        public void valueChanged(javax.swing.event.ListSelectionEvent evt)
 
−
                                        {
 
−
                                          jSizeListValueChanged(evt);
 
−
                                        }
 
−
                                      }
 
−
                                      );
 
−
    jScrollPane3.setViewportView(jSizeList);
 
−
    gridBagConstraints4 = new java.awt.GridBagConstraints();
 
−
    gridBagConstraints4.fill = java.awt.GridBagConstraints.BOTH;
 
−
    gridBagConstraints4.insets = new java.awt.Insets(3, 3, 3, 3);
 
−
    gridBagConstraints4.anchor = java.awt.GridBagConstraints.NORTHWEST;
 
−
    gridBagConstraints4.weightx = 0.25;
 
−
    gridBagConstraints4.weighty = 1.0;
 
−
    jPanel5.add(jScrollPane3, gridBagConstraints4);
 
−
    gridBagConstraints1 = new java.awt.GridBagConstraints();
 
−
    gridBagConstraints1.gridwidth = 0;
 
−
    gridBagConstraints1.fill = java.awt.GridBagConstraints.BOTH;
 
−
    gridBagConstraints1.insets = new java.awt.Insets(5, 5, 0, 5);
 
−
    gridBagConstraints1.weightx = 0.125;
 
−
    gridBagConstraints1.weighty = 1.0;
 
−
    getContentPane().add(jPanel5, gridBagConstraints1);
 
−
    jPanel1.setLayout(new java.awt.GridBagLayout());
 
−
    java.awt.GridBagConstraints gridBagConstraints5;
 
−
    jPanel1.setBorder(new javax.swing.border.TitledBorder(new javax.swing.border.EtchedBorder(), " Sample "));
 
−
    jSample.setWrapStyleWord(true);
 
−
    jSample.setLineWrap(true);
 
−
    jSample.setColumns(20);
 
−
    jSample.setRows(3);
 
−
    jSample.setText("The quick brown fox jumped over the lazy dog.");
 
−
    jScrollPane4.setViewportView(jSample);
 
−
    gridBagConstraints5 = new java.awt.GridBagConstraints();
 
−
    gridBagConstraints5.fill = java.awt.GridBagConstraints.BOTH;
 
−
    gridBagConstraints5.insets = new java.awt.Insets(0, 3, 3, 3);
 
−
    gridBagConstraints5.weightx = 1.0;
 
−
    gridBagConstraints5.weighty = 1.0;
 
−
    jPanel1.add(jScrollPane4, gridBagConstraints5);
 
−
    gridBagConstraints1 = new java.awt.GridBagConstraints();
 
−
    gridBagConstraints1.gridwidth = 0;
 
−
    gridBagConstraints1.fill = java.awt.GridBagConstraints.BOTH;
 
−
    gridBagConstraints1.insets = new java.awt.Insets(0, 5, 0, 5);
 
−
    gridBagConstraints1.anchor = java.awt.GridBagConstraints.NORTHWEST;
 
−
    gridBagConstraints1.weightx = 1.0;
 
−
    getContentPane().add(jPanel1, gridBagConstraints1);
 
−
    jButtons.setLayout(new java.awt.GridBagLayout());
 
−
    java.awt.GridBagConstraints gridBagConstraints6;
 
−
    jOk.setMnemonic(KeyEvent.VK_O);
 
−
    jOk.setText("OK");
 
−
    jOk.setRequestFocusEnabled(false);
 
−
    jOk.addActionListener(new java.awt.event.ActionListener()
 
−
                          {
 
−
                            public void actionPerformed(java.awt.event.ActionEvent evt)
 
−
                            {
 
−
                              jOkActionPerformed(evt);
 
−
                            }
 
−
                          }
 
−
                        );
 
−
    gridBagConstraints6 = new java.awt.GridBagConstraints();
 
−
    gridBagConstraints6.insets = new java.awt.Insets(5, 5, 5, 0);
 
−
    gridBagConstraints6.anchor = java.awt.GridBagConstraints.WEST;
 
−
    jButtons.add(jOk, gridBagConstraints6);
 
−
 
−
    jCancel.setMnemonic(KeyEvent.VK_C);
 
−
    jCancel.setText("Cancel");
 
−
    jCancel.setRequestFocusEnabled(false);
 
−
    jCancel.addActionListener(new
 
−
                              java.awt.event.ActionListener()
 
−
                              {
 
−
                                public void actionPerformed(java.awt.event.ActionEvent evt)
 
−
                                {
 
−
                                  jCancelActionPerformed(evt);
 
−
                                }
 
−
                              }
 
−
                            );
 
−
    gridBagConstraints6 = new java.awt.GridBagConstraints();
 
−
    gridBagConstraints6.gridwidth = 0;
 
−
    gridBagConstraints6.insets = new java.awt.Insets(5, 5, 5, 5);
 
−
    gridBagConstraints6.anchor = java.awt.GridBagConstraints.WEST;
 
−
    gridBagConstraints6.weightx = 1.0;
 
−
    jButtons.add(jCancel, gridBagConstraints6);
 
−
    gridBagConstraints6 = new java.awt.GridBagConstraints();
 
−
    gridBagConstraints6.weightx = 1.0;
 
−
    jButtons.add(jLabel6, gridBagConstraints6);
 
−
    gridBagConstraints1 = new java.awt.GridBagConstraints();
 
−
    gridBagConstraints1.gridwidth = 0;
 
−
    gridBagConstraints1.anchor = java.awt.GridBagConstraints.SOUTHWEST;
 
−
    gridBagConstraints1.weightx = 1.0;
 
−
    getContentPane().add(jButtons, gridBagConstraints1);
 
−
  }
 
−
  private void jCancelActionPerformed(java.awt.event.ActionEvent evt)
 
−
  {
 
−
    // Add your handling code here:
 
−
    setVisible(false);
 
−
  }
 
−
  private void jOkActionPerformed (java.awt.event.ActionEvent evt)
 
−
  {
 
−
    // Add your handling code here:
 
−
    ok = true;
 
−
    setVisible(false);
 
−
  }
 
−
  private void jSizeActionPerformed (java.awt.event.ActionEvent evt)
 
−
  {
 
−
    // Add your handling code here:
 
−
    int size = Integer.parseInt(jSize.getText());
 
−
    if(size > 0)
 
−
    {
 
−
      currentSize = size;
 
−
      setSampleFont();
 
−
    }
 
−
  }
 
−
  private void jStyleActionPerformed (java.awt.event.ActionEvent evt)
 
−
  {
 
−
    // Add your handling code here:
 
−
    StringTokenizer st = new StringTokenizer(jStyle.getText(),",");
 
−
    int style = 0;
 
−
    while(st.hasMoreTokens())
 
−
    {
 
−
      String str = st.nextToken().trim();
 
−
      if(str.equalsIgnoreCase("Plain"))
 
−
      {
 
−
        style |= Font.PLAIN;
 
−
      }
 
−
      else
 
−
        if(str.equalsIgnoreCase("Bold"))
 
−
      {
 
−
        style |= Font.BOLD;
 
−
      }
 
−
      else
 
−
        if(str.equalsIgnoreCase("Italic"))
 
−
      {
 
−
        style |= Font.ITALIC;
 
−
      }
 
−
    }
 
−
    if(style >= 0)
 
−
    {
 
−
      currentStyle = style;
 
−
      setSampleFont();
 
−
    }
 
−
  }
 
−
  private void jFontActionPerformed (java.awt.event.ActionEvent evt)
 
−
  {
 
−
    // Add your handling code here:
 
−
    DefaultListModel model = (DefaultListModel)
 
−
                            jFontList.getModel();
 
−
    if(model.indexOf(jFont.getText()) >= 0)
 
−
    {
 
−
      currentFont = jFont.getText();
 
−
      setSampleFont();
 
−
    }
 
−
  }
 
−
  private void jStyleListValueChanged(javax.swing.event.ListSelectionEvent evt)
 
−
  {
 
−
    // Add your handling code here:
 
−
    String str = "";
 
−
    Object[] values = jStyleList.getSelectedValues();
 
−
    if(values.length > 0)
 
−
    {
 
−
      int j;
 
−
      for(j=0; j < values.length; j++)
 
−
      {
 
−
        String s = (String) values[j];
 
−
        if(s.equalsIgnoreCase("Plain"))
 
−
        {
 
−
          str = "Plain";  break;
 
−
        }
 
−
        if(str.length() > 0)
 
−
        {
 
−
          str += ",";
 
−
        }
 
−
        str += (String) values[j];
 
−
      }
 
−
    }
 
−
    else
 
−
    {
 
−
      str = styleToString(currentStyle);
 
−
    }
 
−
    jStyle.setText(str);
 
−
    jStyleActionPerformed(null);
 
−
  }
 
−
  private void jSizeListValueChanged(javax.swing.event.ListSelectionEvent evt)
 
−
  {
 
−
    // Add your handling code here:
 
−
    String str = (String) jSizeList.getSelectedValue();
 
−
    if(str==null || str.length() <= 0)
 
−
    {
 
−
      str = Integer.toString(currentSize);
 
−
    }
 
−
    jSize.setText(str);
 
−
    jSizeActionPerformed(null);
 
−
  }
 
−
  private void jFontListValueChanged(javax.swing.event.ListSelectionEvent evt)
 
−
  {
 
−
    // Add your handling code here:
 
−
    String str = (String) jFontList.getSelectedValue();
 
−
    if(str==null || str.length() <= 0)
 
−
    {
 
−
      str = currentFont;
 
−
    }
 
−
    jFont.setText(str);
 
−
    jFontActionPerformed(null);
 
−
  }
 
−
  /** Closes the dialog */
 
−
  private void closeDialog(java.awt.event.WindowEvent evt)
 
−
  {
 
−
    setVisible (false);
 
−
  }
 
−
  // Variables declaration - do not modify
 
−
  private javax.swing.JPanel jPanel3;
 
−
  private javax.swing.JTextField jFont;
 
−
  private javax.swing.JScrollPane jScrollPane1;
 
−
  private javax.swing.JList jFontList;
 
−
  private javax.swing.JPanel jPanel4;
 
−
  private javax.swing.JTextField jStyle;
 
−
  private javax.swing.JScrollPane jScrollPane2;
 
−
  private javax.swing.JList jStyleList;
 
−
  private javax.swing.JPanel jPanel5;
 
−
  private javax.swing.JTextField jSize;
 
−
  private javax.swing.JScrollPane jScrollPane3;
 
−
  private javax.swing.JList jSizeList;
 
−
  private javax.swing.JPanel jPanel1;
 
−
  private javax.swing.JScrollPane jScrollPane4;
 
−
  private javax.swing.JTextArea jSample;
 
−
  private javax.swing.JPanel jButtons;
 
−
  private javax.swing.JButton jOk;
 
−
  private javax.swing.JButton jCancel;
 
−
  private javax.swing.JLabel jLabel6;
 
−
  // End of variables declaration
 
−
}
 
−
 
 
−
   
 
−
   
 
−
  </source>
 
−
   
 
−
 
 
−
  <!-- end source code -->
 
−
 
 
−
 
−
 
−
 
−
 
−
== Font Chooser Source Code ==
 
−
 
−
 
−
 
−
 
−
 
−
 
−
 
−
 
−
 
−
== Font dialog ==
 
−
 
−
 
−
 
−
 
−
 
−
 
−
 
 
−
  <!-- start source code -->
 
−
 
 
−
    <source lang="java">
 
−
 
−
/*
 
−
* JCommon : a free general purpose class library for the Java(tm) platform
 
−
*
 
−
*
 
−
* (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
 
−
*
 
−
* Project Info:  http://www.jfree.org/jcommon/index.html
 
−
*
 
−
* This library is free software; you can redistribute it and/or modify it
 
−
* under the terms of the GNU Lesser General Public License as published by
 
−
* the Free Software Foundation; either version 2.1 of the License, or
 
−
* (at your option) any later version.
 
−
*
 
−
* This library 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 Lesser General Public
 
−
* License for more details.
 
−
*
 
−
* You should have received a copy of the GNU Lesser General Public
 
−
* License along with this library; if not, write to the Free Software
 
−
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
 
−
* USA. 
 
−
*
 
−
* [Java is a trademark or registered trademark of Sun Microsystems, Inc.
 
−
* in the United States and other countries.]
 
−
*
 
−
* ----------------------
 
−
* FontChooserDialog.java
 
−
* ----------------------
 
−
* (C) Copyright 2000-2004, by Object Refinery Limited.
 
−
*
 
−
* Original Author:  David Gilbert (for Object Refinery Limited);
 
−
* Contributor(s):  -;
 
−
*
 
−
* $Id: FontChooserDialog.java,v 1.5 2007/11/02 17:50:36 taqua Exp $
 
−
*
 
−
* Changes (from 26-Oct-2001)
 
−
* --------------------------
 
−
* 26-Oct-2001 : Changed package to com.jrefinery.ui.*;
 
−
* 14-Oct-2002 : Fixed errors reported by Checkstyle (DG);
 
−
*
 
−
*/
 
−
import java.awt.BorderLayout;
 
−
import java.awt.Dialog;
 
−
import java.awt.Font;
 
−
import java.awt.Frame;
 
−
import java.awt.GraphicsEnvironment;
 
−
import java.awt.GridLayout;
 
−
import java.awt.event.ActionEvent;
 
−
import java.awt.event.ActionListener;
 
−
import javax.swing.BorderFactory;
 
−
import javax.swing.JButton;
 
−
import javax.swing.JCheckBox;
 
−
import javax.swing.JDialog;
 
−
import javax.swing.JList;
 
−
import javax.swing.JPanel;
 
−
import javax.swing.JScrollPane;
 
−
import javax.swing.JTextField;
 
−
import javax.swing.ListModel;
 
−
/**
 
−
* A dialog for choosing a font from the available system fonts.
 
−
*
 
−
* @author David Gilbert
 
−
*/
 
−
public class FontChooserDialog extends StandardDialog {
 
−
    /** The panel within the dialog that contains the font selection controls. */
 
−
    private FontChooserPanel fontChooserPanel;
 
−
    /**
 
−
    * Standard constructor - builds a font chooser dialog owned by another dialog.
 
−
    *
 
−
    * @param owner  the dialog that "owns" this dialog.
 
−
    * @param title  the title for the dialog.
 
−
    * @param modal  a boolean that indicates whether or not the dialog is modal.
 
−
    * @param font  the initial font displayed.
 
−
    */
 
−
    public FontChooserDialog(final Dialog owner, final String title, final boolean modal, final Font font) {
 
−
        super(owner, title, modal);
 
−
        setContentPane(createContent(font));
 
−
    }
 
−
    /**
 
−
    * Standard constructor - builds a font chooser dialog owned by a frame.
 
−
    *
 
−
    * @param owner  the frame that "owns" this dialog.
 
−
    * @param title  the title for the dialog.
 
−
    * @param modal  a boolean that indicates whether or not the dialog is modal.
 
−
    * @param font  the initial font displayed.
 
−
    */
 
−
    public FontChooserDialog(final Frame owner, final String title, final boolean modal, final Font font) {
 
−
        super(owner, title, modal);
 
−
        setContentPane(createContent(font));
 
−
    }
 
−
    /**
 
−
    * Returns the selected font.
 
−
    *
 
−
    * @return the font.
 
−
    */
 
−
    public Font getSelectedFont() {
 
−
        return this.fontChooserPanel.getSelectedFont();
 
−
    }
 
−
    /**
 
−
    * Returns the panel that is the user interface.
 
−
    *
 
−
    * @param font  the font.
 
−
    *
 
−
    * @return the panel.
 
−
    */
 
−
    private JPanel createContent(Font font) {
 
−
        final JPanel content = new JPanel(new BorderLayout());
 
−
        content.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
 
−
        if (font == null) {
 
−
            font = new Font("Dialog", 10, Font.PLAIN);
 
−
        }
 
−
        this.fontChooserPanel = new FontChooserPanel(font);
 
−
        content.add(this.fontChooserPanel);
 
−
        final JPanel buttons = createButtonPanel();
 
−
        buttons.setBorder(BorderFactory.createEmptyBorder(4, 0, 0, 0));
 
−
        content.add(buttons, BorderLayout.SOUTH);
 
−
        return content;
 
−
    }
 
−
}
 
−
/*
 
−
* JCommon : a free general purpose class library for the Java(tm) platform
 
−
* s
 
−
*
 
−
* (C) Copyright 2000-2008, by Object Refinery Limited and Contributors.
 
−
*
 
−
* Project Info:  http://www.jfree.org/jcommon/index.html
 
−
*
 
−
* This library is free software; you can redistribute it and/or modify it
 
−
* under the terms of the GNU Lesser General Public License as published by
 
−
* the Free Software Foundation; either version 2.1 of the License, or
 
−
* (at your option) any later version.
 
−
*
 
−
* This library 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 Lesser General Public
 
−
* License for more details.
 
−
*
 
−
* You should have received a copy of the GNU Lesser General Public
 
−
* License along with this library; if not, write to the Free Software
 
−
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
 
−
* USA.
 
−
*
 
−
* [Java is a trademark or registered trademark of Sun Microsystems, Inc.
 
−
* in the United States and other countries.]
 
−
*
 
−
* ---------------------
 
−
* FontChooserPanel.java
 
−
* ---------------------
 
−
* (C) Copyright 2000-2008, by Object Refinery Limited.
 
−
*
 
−
* Original Author:  David Gilbert (for Object Refinery Limited);
 
−
* Contributor(s):  Arnaud Lelievre;
 
−
*
 
−
* $Id: FontChooserPanel.java,v 1.6 2008/12/18 09:57:32 mungady Exp $
 
−
*
 
−
* Changes (from 26-Oct-2001)
 
−
* --------------------------
 
−
* 26-Oct-2001 : Changed package to com.jrefinery.ui.*;
 
−
* 14-Oct-2002 : Fixed errors reported by Checkstyle (DG);
 
−
* 08-Sep-2003 : Added internationalization via use of properties resourceBundle (RFE 690236) (AL);
 
−
* 21-Feb-2004 : The FontParameter of the constructor was never used (TM);
 
−
* 18-Dec-2008 : Use ResourceBundleWrapper - see JFreeChart patch 1607918 by
 
−
*              Jess Thrysoee (DG);
 
−
*
 
−
*/
 
−
/**
 
−
* A panel for choosing a font from the available system fonts - still a bit of
 
−
* a hack at the moment, but good enough for demonstration applications.
 
−
*
 
−
* @author David Gilbert
 
−
*/
 
−
class FontChooserPanel extends JPanel {
 
−
    /** The font sizes that can be selected. */
 
−
    public static final String[] SIZES = {"9", "10", "11", "12", "14", "16",
 
−
            "18", "20", "22", "24", "28", "36", "48", "72"};
 
−
    /** The list of fonts. */
 
−
    private JList fontlist;
 
−
    /** The list of sizes. */
 
−
    private JList sizelist;
 
−
    /** The checkbox that indicates whether the font is bold. */
 
−
    private JCheckBox bold;
 
−
    /** The checkbox that indicates whether or not the font is italic. */
 
−
    private JCheckBox italic;
 
−
 
−
    /**
 
−
    * Standard constructor - builds a FontChooserPanel initialised with the
 
−
    * specified font.
 
−
    *
 
−
    * @param font  the initial font to display.
 
−
    */
 
−
    public FontChooserPanel(final Font font) {
 
−
        final GraphicsEnvironment g
 
−
                = GraphicsEnvironment.getLocalGraphicsEnvironment();
 
−
        final String[] fonts = g.getAvailableFontFamilyNames();
 
−
        setLayout(new BorderLayout());
 
−
        final JPanel right = new JPanel(new BorderLayout());
 
−
        final JPanel fontPanel = new JPanel(new BorderLayout());
 
−
        fontPanel.setBorder(BorderFactory.createTitledBorder(
 
−
                            BorderFactory.createEtchedBorder(),
 
−
                            "Font"));
 
−
        this.fontlist = new JList(fonts);
 
−
        final JScrollPane fontpane = new JScrollPane(this.fontlist);
 
−
        fontpane.setBorder(BorderFactory.createEtchedBorder());
 
−
        fontPanel.add(fontpane);
 
−
        add(fontPanel);
 
−
        final JPanel sizePanel = new JPanel(new BorderLayout());
 
−
        sizePanel.setBorder(BorderFactory.createTitledBorder(
 
−
                            BorderFactory.createEtchedBorder(),
 
−
                            "Size"));
 
−
        this.sizelist = new JList(SIZES);
 
−
        final JScrollPane sizepane = new JScrollPane(this.sizelist);
 
−
        sizepane.setBorder(BorderFactory.createEtchedBorder());
 
−
        sizePanel.add(sizepane);
 
−
        final JPanel attributes = new JPanel(new GridLayout(1, 2));
 
−
        this.bold = new JCheckBox("Bold");
 
−
        this.italic = new JCheckBox("Italic");
 
−
        attributes.add(this.bold);
 
−
        attributes.add(this.italic);
 
−
        attributes.setBorder(BorderFactory.createTitledBorder(
 
−
                BorderFactory.createEtchedBorder(),
 
−
                "Attributes"));
 
−
        right.add(sizePanel, BorderLayout.CENTER);
 
−
        right.add(attributes, BorderLayout.SOUTH);
 
−
        add(right, BorderLayout.EAST);
 
−
        setSelectedFont(font);
 
−
    }
 
−
    /**
 
−
    * Returns a Font object representing the selection in the panel.
 
−
    *
 
−
    * @return the font.
 
−
    */
 
−
    public Font getSelectedFont() {
 
−
        return new Font(getSelectedName(), getSelectedStyle(),
 
−
                getSelectedSize());
 
−
    }
 
−
    /**
 
−
    * Returns the selected name.
 
−
    *
 
−
    * @return the name.
 
−
    */
 
−
    public String getSelectedName() {
 
−
        return (String) this.fontlist.getSelectedValue();
 
−
    }
 
−
    /**
 
−
    * Returns the selected style.
 
−
    *
 
−
    * @return the style.
 
−
    */
 
−
    public int getSelectedStyle() {
 
−
        if (this.bold.isSelected() && this.italic.isSelected()) {
 
−
            return Font.BOLD + Font.ITALIC;
 
−
        }
 
−
        if (this.bold.isSelected()) {
 
−
            return Font.BOLD;
 
−
        }
 
−
        if (this.italic.isSelected()) {
 
−
            return Font.ITALIC;
 
−
        }
 
−
        else {
 
−
            return Font.PLAIN;
 
−
        }
 
−
    }
 
−
    /**
 
−
    * Returns the selected size.
 
−
    *
 
−
    * @return the size.
 
−
    */
 
−
    public int getSelectedSize() {
 
−
        final String selected = (String) this.sizelist.getSelectedValue();
 
−
        if (selected != null) {
 
−
            return Integer.parseInt(selected);
 
−
        }
 
−
        else {
 
−
            return 10;
 
−
        }
 
−
    }
 
−
    /**
 
−
    * Initializes the contents of the dialog from the given font
 
−
    * object.
 
−
    *
 
−
    * @param font the font from which to read the properties.
 
−
    */
 
−
    public void setSelectedFont (final Font font) {
 
−
        if (font == null) {
 
−
            throw new NullPointerException();
 
−
        }
 
−
        this.bold.setSelected(font.isBold());
 
−
        this.italic.setSelected(font.isItalic());
 
−
        final String fontName = font.getName();
 
−
        ListModel model = this.fontlist.getModel();
 
−
        this.fontlist.clearSelection();
 
−
        for (int i = 0; i < model.getSize(); i++) {
 
−
            if (fontName.equals(model.getElementAt(i))) {
 
−
                this.fontlist.setSelectedIndex(i);
 
−
                break;
 
−
            }
 
−
        }
 
−
        final String fontSize = String.valueOf(font.getSize());
 
−
        model = this.sizelist.getModel();
 
−
        this.sizelist.clearSelection();
 
−
        for (int i = 0; i < model.getSize(); i++) {
 
−
            if (fontSize.equals(model.getElementAt(i))) {
 
−
                this.sizelist.setSelectedIndex(i);
 
−
                break;
 
−
            }
 
−
        }
 
−
    }
 
−
}
 
−
/*
 
−
* JCommon : a free general purpose class library for the Java(tm) platform
 
−
*
 
−
*
 
−
* (C) Copyright 2000-2008, by Object Refinery Limited and Contributors.
 
−
*
 
−
* Project Info:  http://www.jfree.org/jcommon/index.html
 
−
*
 
−
* This library is free software; you can redistribute it and/or modify it
 
−
* under the terms of the GNU Lesser General Public License as published by
 
−
* the Free Software Foundation; either version 2.1 of the License, or
 
−
* (at your option) any later version.
 
−
*
 
−
* This library 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 Lesser General Public
 
−
* License for more details.
 
−
*
 
−
* You should have received a copy of the GNU Lesser General Public
 
−
* License along with this library; if not, write to the Free Software
 
−
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
 
−
* USA.
 
−
*
 
−
* [Java is a trademark or registered trademark of Sun Microsystems, Inc.
 
−
* in the United States and other countries.]
 
−
*
 
−
* -------------------
 
−
* StandardDialog.java
 
−
* -------------------
 
−
* (C) Copyright 2000-2008, by Object Refinery Limited.
 
−
*
 
−
* Original Author:  David Gilbert (for Object Refinery Limited);
 
−
* Contributor(s):  Arnaud Lelievre;
 
−
*
 
−
* $Id: StandardDialog.java,v 1.7 2008/12/18 09:57:32 mungady Exp $
 
−
*
 
−
* Changes (from 26-Oct-2001)
 
−
* --------------------------
 
−
* 26-Oct-2001 : Changed package to com.jrefinery.ui.*;
 
−
* 08-Sep-2003 : Added internationalization via use of properties
 
−
*              resourceBundle (RFE 690236) (AL);
 
−
* 18-Dec-2008 : Use ResourceBundleWrapper - see JFreeChart patch 1607918 by
 
−
*              Jess Thrysoee (DG);
 
−
*
 
−
*/
 
−
 
−
/**
 
−
* The base class for standard dialogs.
 
−
*
 
−
* @author David Gilbert
 
−
*/
 
−
class StandardDialog extends JDialog implements ActionListener {
 
−
    /** Flag that indicates whether or not the dialog was cancelled. */
 
−
    private boolean cancelled;
 
−
 
−
    /**
 
−
    * Standard constructor - builds a dialog...
 
−
    *
 
−
    * @param owner  the owner.
 
−
    * @param title  the title.
 
−
    * @param modal  modal?
 
−
    */
 
−
    public StandardDialog(final Frame owner, final String title,
 
−
            final boolean modal) {
 
−
        super(owner, title, modal);
 
−
        this.cancelled = false;
 
−
    }
 
−
    /**
 
−
    * Standard constructor - builds a dialog...
 
−
    *
 
−
    * @param owner  the owner.
 
−
    * @param title  the title.
 
−
    * @param modal  modal?
 
−
    */
 
−
    public StandardDialog(final Dialog owner, final String title,
 
−
            final boolean modal) {
 
−
        super(owner, title, modal);
 
−
        this.cancelled = false;
 
−
    }
 
−
    /**
 
−
    * Returns a flag that indicates whether or not the dialog has been
 
−
    * cancelled.
 
−
    *
 
−
    * @return boolean.
 
−
    */
 
−
    public boolean isCancelled() {
 
−
        return this.cancelled;
 
−
    }
 
−
    /**
 
−
    * Handles clicks on the standard buttons.
 
−
    *
 
−
    * @param event  the event.
 
−
    */
 
−
    public void actionPerformed(final ActionEvent event) {
 
−
        final String command = event.getActionCommand();
 
−
        if (command.equals("helpButton")) {
 
−
            // display help information
 
−
        }
 
−
        else if (command.equals("okButton")) {
 
−
            this.cancelled = false;
 
−
            setVisible(false);
 
−
        }
 
−
        else if (command.equals("cancelButton")) {
 
−
            this.cancelled = true;
 
−
            setVisible(false);
 
−
        }
 
−
    }
 
−
    /**
 
−
    * Builds and returns the user interface for the dialog.  This method is
 
−
    * shared among the constructors.
 
−
    *
 
−
    * @return the button panel.
 
−
    */
 
−
    protected JPanel createButtonPanel() {
 
−
        final L1R2ButtonPanel buttons = new L1R2ButtonPanel(
 
−
                "Help",
 
−
                "OK",
 
−
                "Cancel");
 
−
        final JButton helpButton = buttons.getLeftButton();
 
−
        helpButton.setActionCommand("helpButton");
 
−
        helpButton.addActionListener(this);
 
−
        final JButton okButton = buttons.getRightButton1();
 
−
        okButton.setActionCommand("okButton");
 
−
        okButton.addActionListener(this);
 
−
        final JButton cancelButton = buttons.getRightButton2();
 
−
        cancelButton.setActionCommand("cancelButton");
 
−
        cancelButton.addActionListener(this);
 
−
        buttons.setBorder(BorderFactory.createEmptyBorder(4, 0, 0, 0));
 
−
        return buttons;
 
−
    }
 
−
}
 
−
/*
 
−
* JCommon : a free general purpose class library for the Java(tm) platform
 
−
*
 
−
*
 
−
* (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
 
−
*
 
−
* Project Info:  http://www.jfree.org/jcommon/index.html
 
−
*
 
−
* This library is free software; you can redistribute it and/or modify it
 
−
* under the terms of the GNU Lesser General Public License as published by
 
−
* the Free Software Foundation; either version 2.1 of the License, or
 
−
* (at your option) any later version.
 
−
*
 
−
* This library 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 Lesser General Public
 
−
* License for more details.
 
−
*
 
−
* You should have received a copy of the GNU Lesser General Public
 
−
* License along with this library; if not, write to the Free Software
 
−
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
 
−
* USA. 
 
−
*
 
−
* [Java is a trademark or registered trademark of Sun Microsystems, Inc.
 
−
* in the United States and other countries.]
 
−
*
 
−
* --------------------
 
−
* L1R2ButtonPanel.java
 
−
* --------------------
 
−
* (C) Copyright 2000-2004, by Object Refinery Limited.
 
−
*
 
−
* Original Author:  David Gilbert (for Object Refinery Limited);
 
−
* Contributor(s):  -;
 
−
*
 
−
* $Id: L1R2ButtonPanel.java,v 1.4 2007/11/02 17:50:36 taqua Exp $
 
−
*
 
−
* Changes (from 26-Oct-2001)
 
−
* --------------------------
 
−
* 26-Oct-2001 : Changed package to com.jrefinery.ui.*;
 
−
* 26-Jun-2002 : Removed unnecessary import (DG);
 
−
* 14-Oct-2002 : Fixed errors reported by Checkstyle (DG);
 
−
*
 
−
*/
 
−
 
−
/**
 
−
* A "ready-made" panel that has one button on the left and two buttons on the right - nested
 
−
* panels and layout managers take care of resizing.
 
−
*
 
−
* @author David Gilbert
 
−
*/
 
−
class L1R2ButtonPanel extends JPanel {
 
−
    /** The left button. */
 
−
    private JButton left;
 
−
    /** The first button on the right of the panel. */
 
−
    private JButton right1;
 
−
    /** The second button on the right of the panel. */
 
−
    private JButton right2;
 
−
    /**
 
−
    * Standard constructor - creates a three button panel with the specified button labels.
 
−
    *
 
−
    * @param label1  the label for button 1.
 
−
    * @param label2  the label for button 2.
 
−
    * @param label3  the label for button 3.
 
−
    */
 
−
    public L1R2ButtonPanel(final String label1, final String label2, final String label3) {
 
−
        setLayout(new BorderLayout());
 
−
        // create the pieces...
 
−
        this.left = new JButton(label1);
 
−
        final JPanel rightButtonPanel = new JPanel(new GridLayout(1, 2));
 
−
        this.right1 = new JButton(label2);
 
−
        this.right2 = new JButton(label3);
 
−
        rightButtonPanel.add(this.right1);
 
−
        rightButtonPanel.add(this.right2);
 
−
        // ...and put them together
 
−
        add(this.left, BorderLayout.WEST);
 
−
        add(rightButtonPanel, BorderLayout.EAST);
 
−
    }
 
−
    /**
 
−
    * Returns a reference to button 1, allowing the caller to set labels, action-listeners etc.
 
−
    *
 
−
    * @return the left button.
 
−
    */
 
−
    public JButton getLeftButton() {
 
−
        return this.left;
 
−
    }
 
−
    /**
 
−
    * Returns a reference to button 2, allowing the caller to set labels, action-listeners etc.
 
−
    *
 
−
    * @return the right button 1.
 
−
    */
 
−
    public JButton getRightButton1() {
 
−
        return this.right1;
 
−
    }
 
−
    /**
 
−
    * Returns a reference to button 3, allowing the caller to set labels, action-listeners etc.
 
−
    *
 
−
    * @return  the right button 2.
 
−
    */
 
−
    public JButton getRightButton2() {
 
−
        return this.right2;
 
−
    }
 
−
}
 
−
/*
 
−
* JCommon : a free general purpose class library for the Java(tm) platform
 
−
*
 
−
*
 
−
* (C) Copyright 2000-2008, by Object Refinery Limited and Contributors.
 
−
*
 
−
* Project Info:  http://www.jfree.org/jcommon/index.html
 
−
*
 
−
* This library is free software; you can redistribute it and/or modify it
 
−
* under the terms of the GNU Lesser General Public License as published by
 
−
* the Free Software Foundation; either version 2.1 of the License, or
 
−
* (at your option) any later version.
 
−
*
 
−
* This library 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 Lesser General Public
 
−
* License for more details.
 
−
*
 
−
* You should have received a copy of the GNU Lesser General Public
 
−
* License along with this library; if not, write to the Free Software
 
−
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
 
−
* USA.
 
−
*
 
−
* [Java is a trademark or registered trademark of Sun Microsystems, Inc.
 
−
* in the United States and other countries.]
 
−
*
 
−
* ---------------------
 
−
* FontDisplayField.java
 
−
* ---------------------
 
−
* (C) Copyright 2000-2008, by Object Refinery Limited.
 
−
*
 
−
* Original Author:  David Gilbert (for Object Refinery Limited);
 
−
* Contributor(s):  Arnaud Lelievre;
 
−
*
 
−
* $Id: FontDisplayField.java,v 1.6 2008/12/18 09:57:32 mungady Exp $
 
−
*
 
−
* Changes (from 26-Oct-2001)
 
−
* ----------------------------------
 
−
* 26-Oct-2001 : Changed package to com.jrefinery.ui.*;
 
−
* 14-Oct-2002 : Fixed errors reported by Checkstyle (DG);
 
−
* 08-Sep-2003 : Added internationalization via use of properties
 
−
*              resourceBundle (RFE 690236) (AL);
 
−
* 18-Dec-2008 : Use ResourceBundleWrapper - see JFreeChart patch 1607918 by
 
−
*              Jess Thrysoee (DG);
 
−
*
 
−
*/
 
−
 
−
/**
 
−
* A field for displaying a font selection.  The display field itself is
 
−
* read-only, to the developer must provide another mechanism to allow the
 
−
* user to change the font.
 
−
*
 
−
* @author David Gilbert
 
−
*/
 
−
class FontDisplayField extends JTextField {
 
−
    /** The current font. */
 
−
    private Font displayFont;
 
−
 
−
    /**
 
−
    * Standard constructor - builds a FontDescriptionField initialised with
 
−
    * the specified font.
 
−
    *
 
−
    * @param font  the font.
 
−
    */
 
−
    public FontDisplayField(final Font font) {
 
−
        super("");
 
−
        setDisplayFont(font);
 
−
        setEnabled(false);
 
−
    }
 
−
    /**
 
−
    * Returns the current font.
 
−
    *
 
−
    * @return the font.
 
−
    */
 
−
    public Font getDisplayFont() {
 
−
        return this.displayFont;
 
−
    }
 
−
    /**
 
−
    * Sets the font.
 
−
    *
 
−
    * @param font  the font.
 
−
    */
 
−
    public void setDisplayFont(final Font font) {
 
−
        this.displayFont = font;
 
−
        setText(fontToString(this.displayFont));
 
−
    }
 
−
    /**
 
−
    * Returns a string representation of the specified font.
 
−
    *
 
−
    * @param font  the font.
 
−
    *
 
−
    * @return a string describing the font.
 
−
    */
 
−
    private String fontToString(final Font font) {
 
−
        if (font != null) {
 
−
            return font.getFontName() + ", " + font.getSize();
 
−
        }
 
−
        else {
 
−
            return "No Font Selected";
 
−
        }
 
−
    }
 
−
}
 
−
 
 
−
  </source>
 
−
   
 
−
 
 
−
  <!-- end source code -->
 
−
 
 
−
 
−
 
−
 
−
 
−
== Font Dialog from claribole ==
 
−
 
−
 
−
 
−
 
−
 
−
 
−
 
 
−
  <!-- start source code -->
 
−
 
 
−
    <source lang="java">
 
−
 
 
−
/*  FILE: FontDialog.java
 
−
*  DATE OF CREATION:  Wed Jan 15 17:07:07 2002
 
−
*  AUTHOR :            Emmanuel Pietriga (emmanuel@w3.org)
 
−
*  MODIF:              Emmanuel Pietriga (emmanuel.pietriga@inria.fr)
 
−
*  Copyright (c) Emmanuel Pietriga, 2002. All Rights Reserved
 
−
*  Copyright (c) INRIA, 2008. All Rights Reserved
 
−
*  Licensed under the GNU LGPL. For full terms see the file COPYING.
 
−
*
 
−
* $Id: FontDialog.java 1207 2008-08-13 16:03:07Z epietrig $
 
−
*/
 
−
 
−
import java.awt.Container;
 
−
import java.awt.Dialog;
 
−
import java.awt.FlowLayout;
 
−
import java.awt.Font;
 
−
import java.awt.Frame;
 
−
import java.awt.GridBagConstraints;
 
−
import java.awt.GridBagLayout;
 
−
import java.awt.Window;
 
−
import java.awt.event.ActionEvent;
 
−
import java.awt.event.ActionListener;
 
−
import java.awt.event.ruponentAdapter;
 
−
import java.awt.event.ruponentEvent;
 
−
import java.awt.event.WindowAdapter;
 
−
import java.awt.event.WindowEvent;
 
−
import java.util.StringTokenizer;
 
−
import javax.swing.JButton;
 
−
import javax.swing.JDialog;
 
−
import javax.swing.JList;
 
−
import javax.swing.JPanel;
 
−
import javax.swing.JScrollPane;
 
−
public class FontDialog extends JDialog implements ActionListener {
 
−
  static final String ZVTM_FONT_CHOOSER = "ZVTM Font Chooser";
 
−
    static String DEFAULT_FAMILY="Dialog";
 
−
    static int DEFAULT_STYLE=Font.PLAIN;
 
−
    static int DEFAULT_SIZE=10;
 
−
    FontTracker ft;
 
−
    JButton okBt,cancelBt;
 
−
    JList familyList,styleList,sizeList;
 
−
    String[] allFontFamilies=java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
 
−
    String[] allFontStyles={"Plain","Bold","Italic","BoldItalic"};
 
−
    String[] allFontSizes={"4","6","8","10","12","14","16","18","20","24"};
 
−
   
 
−
    /** Call a FontDialog window that will return  the font selected in the window
 
−
    *@param owner application frame that owns this Modal component
 
−
    */
 
−
    public static Font getFontDialog(Frame owner){
 
−
  FontTracker res=new FontTracker();
 
−
  FontDialog fd=new FontDialog(res,owner);
 
−
  fd.addWindowListener(new FontDialog.Closer());
 
−
        fd.addComponentListener(new FontDialog.DisposeOnClose());
 
−
  fd.setLocationRelativeTo(owner);
 
−
  fd.setVisible(true);  //blocks until the dialog is closed
 
−
  return res.getFont();
 
−
    }
 
−
    /** Call a FontDialog window that will return  the font selected in the window
 
−
    *@param owner application dialog that owns this Modal component
 
−
    */
 
−
    public static Font getFontDialog(Dialog owner){
 
−
  FontTracker res=new FontTracker();
 
−
  FontDialog fd=new FontDialog(res,owner);
 
−
  fd.addWindowListener(new FontDialog.Closer());
 
−
        fd.addComponentListener(new FontDialog.DisposeOnClose());
 
−
  fd.setLocationRelativeTo(owner);
 
−
  fd.setVisible(true);  //blocks until the dialog is closed
 
−
  return res.getFont();
 
−
    }
 
−
    /** Call a FontDialog window that will return  the font selected in the window
 
−
    *@param owner application frame that owns this Modal component
 
−
    *@param f a font giving the default parameters with which the dialog should be initialized (family, size, style)
 
−
    */
 
−
    public static Font getFontDialog(Frame owner,Font f){
 
−
  if (f!=null){
 
−
      DEFAULT_FAMILY=f.getFamily();
 
−
      DEFAULT_STYLE=f.getStyle();
 
−
      DEFAULT_SIZE=f.getSize();
 
−
  }
 
−
  FontTracker res=new FontTracker();
 
−
  FontDialog fd=new FontDialog(res,owner);
 
−
  fd.addWindowListener(new FontDialog.Closer());
 
−
        fd.addComponentListener(new FontDialog.DisposeOnClose());
 
−
  fd.setLocationRelativeTo(owner);
 
−
  fd.setVisible(true);  //blocks until the dialog is closed
 
−
  return res.getFont();
 
−
    }
 
−
    /** Call a FontDialog window that will return  the font selected in the window
 
−
    *@param owner application dialog that owns this Modal component
 
−
    *@param f a font giving the default parameters with which the dialog should be initialized (family, size, style)
 
−
    */
 
−
    public static Font getFontDialog(Dialog owner,Font f){
 
−
  if (f!=null){
 
−
      DEFAULT_FAMILY=f.getFamily();
 
−
      DEFAULT_STYLE=f.getStyle();
 
−
      DEFAULT_SIZE=f.getSize();
 
−
  }
 
−
  FontTracker res=new FontTracker();
 
−
  FontDialog fd=new FontDialog(res,owner);
 
−
  fd.addWindowListener(new FontDialog.Closer());
 
−
        fd.addComponentListener(new FontDialog.DisposeOnClose());
 
−
  fd.setLocationRelativeTo(owner);
 
−
  fd.setVisible(true);  //blocks until the dialog is closed
 
−
  return res.getFont();
 
−
    }
 
−
    /**
 
−
    * Font.decode does not seem to work that well, or I don;t understand how it is supposed to work
 
−
    * Anyway, this one does what I want (decodes family+" "+style+" "+size)
 
−
    */
 
−
    public static Font decode(String fontSpec){
 
−
  if (fontSpec!=null && fontSpec.length()>0){
 
−
      StringTokenizer st=new StringTokenizer(fontSpec," ",false);
 
−
      String[] tokens=new String[st.countTokens()];
 
−
      if (tokens.length>=3){
 
−
    int i=0;
 
−
    while (st.hasMoreTokens()) {
 
−
        tokens[i++]=st.nextToken();
 
−
    }
 
−
    String tokenizedFamily="";
 
−
    for (int j=0;j<tokens.length-3;j++){
 
−
        tokenizedFamily+=tokens[j]+" ";
 
−
    }
 
−
    tokenizedFamily+=tokens[tokens.length-3];
 
−
    String family=tokenizedFamily;if (family==null){family=DEFAULT_FAMILY;}
 
−
    String tokenizedStyle=tokens[tokens.length-2];
 
−
    String tokenizedSize=tokens[tokens.length-1];
 
−
    int style;
 
−
    if (tokenizedStyle.equals("Bold")){style=Font.BOLD;}
 
−
    else if (tokenizedStyle.equals("Italic")){style=Font.ITALIC;}
 
−
    else if (tokenizedStyle.equals("BoldItalic")){style=Font.BOLD+Font.ITALIC;}
 
−
    else {style=Font.PLAIN;}//"Plain"
 
−
    int size;
 
−
    try {
 
−
        size=Integer.parseInt(tokenizedSize);
 
−
        if (size<=0){size=DEFAULT_SIZE;}
 
−
    }
 
−
    catch (NumberFormatException ex){size=DEFAULT_SIZE;}
 
−
    return new Font(family,style,size);
 
−
      }
 
−
      else {return new Font(DEFAULT_FAMILY,DEFAULT_STYLE,DEFAULT_SIZE);}
 
−
  }
 
−
  else {return new Font(DEFAULT_FAMILY,DEFAULT_STYLE,DEFAULT_SIZE);}
 
−
    }
 
−
    FontDialog(FontTracker ftt,Frame owner){
 
−
  super(owner,ZVTM_FONT_CHOOSER,true);
 
−
  setLocation(owner.getLocation());
 
−
  ft=ftt;
 
−
  initUI();
 
−
    }
 
−
    FontDialog(FontTracker ftt,Dialog owner){
 
−
  super(owner,ZVTM_FONT_CHOOSER,true);
 
−
  setLocation(owner.getLocation());
 
−
  ft=ftt;
 
−
  initUI();
 
−
    }
 
−
    void initUI(){//depending on selected item/default shape type
 
−
  Container cp=this.getContentPane();
 
−
  try {
 
−
    okBt.removeActionListener(this);
 
−
    cancelBt.removeActionListener(this);
 
−
  }
 
−
  catch (NullPointerException ex){/*all these might be null (for instance when poping up a GlyphFactory for the first time)*/}
 
−
  cp.removeAll();
 
−
  //main font panel
 
−
  JPanel mainPanel=new JPanel();
 
−
  GridBagLayout gridBag1=new GridBagLayout();
 
−
  GridBagConstraints constraints1=new GridBagConstraints();
 
−
  mainPanel.setLayout(gridBag1);
 
−
  constraints1.fill=GridBagConstraints.BOTH;
 
−
  constraints1.anchor=GridBagConstraints.CENTER;
 
−
  familyList=new JList(allFontFamilies);
 
−
  JScrollPane sp1=new JScrollPane(familyList);
 
−
  buildConstraints(constraints1,0,0,1,1,30,100);
 
−
  gridBag1.setConstraints(sp1,constraints1);
 
−
  mainPanel.add(sp1);
 
−
  styleList=new JList(allFontStyles);
 
−
  JScrollPane sp2=new JScrollPane(styleList);
 
−
  buildConstraints(constraints1,1,0,1,1,30,0);
 
−
  gridBag1.setConstraints(sp2,constraints1);
 
−
  mainPanel.add(sp2);
 
−
  sizeList=new JList(allFontSizes);
 
−
  JScrollPane sp3=new JScrollPane(sizeList);
 
−
  buildConstraints(constraints1,2,0,1,1,25,0);
 
−
  gridBag1.setConstraints(sp3,constraints1);
 
−
  mainPanel.add(sp3);
 
−
  //ok, cancel, reset buttons
 
−
  JPanel btPanel=new JPanel();
 
−
  btPanel.setLayout(new FlowLayout());
 
−
  okBt=new JButton("OK");
 
−
  okBt.addActionListener(this);
 
−
  btPanel.add(okBt);
 
−
  cancelBt=new JButton("Cancel");
 
−
  cancelBt.addActionListener(this);
 
−
  btPanel.add(cancelBt);
 
−
  //main components
 
−
  GridBagLayout gridBag=new GridBagLayout();
 
−
  GridBagConstraints constraints=new GridBagConstraints();
 
−
  cp.setLayout(gridBag);
 
−
  constraints.fill=GridBagConstraints.BOTH;
 
−
  constraints.anchor=GridBagConstraints.CENTER;
 
−
  buildConstraints(constraints,0,0,1,1,100,99);
 
−
  gridBag.setConstraints(mainPanel,constraints);
 
−
  cp.add(mainPanel);
 
−
  buildConstraints(constraints,0,1,1,1,100,1);
 
−
  gridBag.setConstraints(btPanel,constraints);
 
−
  cp.add(btPanel);
 
−
  this.setSize(350,200);
 
−
  this.setResizable(false);
 
−
  familyList.setSelectedValue(DEFAULT_FAMILY,true);
 
−
  if (DEFAULT_STYLE==Font.PLAIN){styleList.setSelectedValue("Plain",true);}
 
−
  else if (DEFAULT_STYLE==Font.BOLD){styleList.setSelectedValue("Bold",true);}
 
−
  else if (DEFAULT_STYLE==Font.ITALIC){styleList.setSelectedValue("Italic",true);}
 
−
  else if (DEFAULT_STYLE==Font.BOLD+Font.ITALIC){styleList.setSelectedValue("BoldItalic",true);}
 
−
  sizeList.setSelectedValue((new Integer(DEFAULT_SIZE)).toString(),true);
 
−
    }
 
−
    public void actionPerformed(ActionEvent e){
 
−
  Object source=e.getSource();
 
−
  if (source==okBt){
 
−
      ft.setFont(getSelectedFont());
 
−
      this.dispose();
 
−
  }
 
−
  else if (source==cancelBt){
 
−
      ft.setFont(null);
 
−
      this.dispose();
 
−
  }
 
−
    }
 
−
   
 
−
    Font getSelectedFont(){
 
−
  String family=(String)familyList.getSelectedValue();if (family==null){family=DEFAULT_FAMILY;}
 
−
  String selectedStyle=(String)styleList.getSelectedValue();
 
−
  int style;
 
−
  if (selectedStyle.equals("Bold")){style=Font.BOLD;}
 
−
  else if (selectedStyle.equals("Italic")){style=Font.ITALIC;}
 
−
  else if (selectedStyle.equals("BoldItalic")){style=Font.BOLD+Font.ITALIC;}
 
−
  else {style=Font.PLAIN;}//"Plain"
 
−
  int size;
 
−
  try {
 
−
      String selectedSize=(String)sizeList.getSelectedValue();
 
−
      size=Integer.parseInt(selectedSize);
 
−
      if (size<=0){size=DEFAULT_SIZE;}
 
−
  }
 
−
  catch (NumberFormatException ex){size=DEFAULT_SIZE;}
 
−
  return new Font(family,style,size);
 
−
    }
 
−
    static void buildConstraints(GridBagConstraints gbc, int gx,int gy,int gw,int gh,int wx,int wy){
 
−
  gbc.gridx=gx;
 
−
  gbc.gridy=gy;
 
−
  gbc.gridwidth=gw;
 
−
  gbc.gridheight=gh;
 
−
  gbc.weightx=wx;
 
−
  gbc.weighty=wy;
 
−
    }
 
−
   
 
−
    static class Closer extends WindowAdapter {
 
−
        public void windowClosing(WindowEvent e) {
 
−
            Window w = e.getWindow();
 
−
            w.setVisible(false);
 
−
        }
 
−
    }
 
−
    static class DisposeOnClose extends ComponentAdapter {
 
−
        public void componentHidden(ComponentEvent e) {
 
−
            Window w = (Window)e.getComponent();
 
−
            w.dispose();
 
−
        }
 
−
    }
 
−
    public static String getFontStyleName(int i){
 
−
  if (i==java.awt.Font.BOLD){return "Bold";}
 
−
  else if (i==java.awt.Font.ITALIC){return "Italic";}
 
−
  else if (i==java.awt.Font.BOLD+java.awt.Font.ITALIC){return "BoldItalic";}
 
−
  else {return "Plain";}
 
−
    }
 
−
}
 
−
class FontTracker {
 
−
    Font font;
 
−
    public void setFont(Font f){
 
−
  font=f;
 
−
    }
 
−
    public Font getFont() {
 
−
        return font;
 
−
    }
 
−
}
 
−
 
 
−
   
 
−
   
 
−
  </source>
 
−
   
 
−
 
 
−
  <!-- end source code -->
 
−
 
 
−
 
−
 
−
 
−
 
−
== Font Loader Dialog ==
 
−
 
−
 
−
 
−
 
−
 
−
 
−
 
 
−
  <!-- start source code -->
 
−
 
 
−
    <source lang="java">
 
−
 
 
−
/*
 
−
* FontLoaderDialog.java
 
−
*
 
−
* Created on November 13, 2006, 8:30 AM
 
−
*/
 
−
 
−
// Revised from jaspersoft designer
 
−
import java.lang.reflect.InvocationTargetException;
 
−
import javax.swing.SwingUtilities;
 
−
/**
 
−
*
 
−
* @author  gtoffoli
 
−
*/
 
−
public class FontLoaderDialog extends javax.swing.JDialog {
 
−
   
 
−
    /** Creates new form FontLoaderDialog */
 
−
    public FontLoaderDialog(java.awt.Frame parent, boolean modal) {
 
−
        super(parent, modal);
 
−
        initComponents();
 
−
        //applyI18n();
 
−
        this.pack();
 
−
       
 
−
        setLocationRelativeTo(null);
 
−
    }
 
−
   
 
−
    /** This method is called from within the constructor to
 
−
    * initialize the form.
 
−
    * WARNING: Do NOT modify this code. The content of this method is
 
−
    * always regenerated by the Form Editor.
 
−
    */
 
−
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
 
−
    private void initComponents() {
 
−
        java.awt.GridBagConstraints gridBagConstraints;
 
−
        jLabelStatus = new javax.swing.JLabel();
 
−
        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
 
−
        getContentPane().setLayout(new java.awt.GridBagLayout());
 
−
        jLabelStatus.setText("FontLoaderDialog.Label.LoadingStatus"); // NOI18N
 
−
        jLabelStatus.setVerticalAlignment(javax.swing.SwingConstants.TOP);
 
−
        jLabelStatus.setPreferredSize(new java.awt.Dimension(391, 51));
 
−
        gridBagConstraints = new java.awt.GridBagConstraints();
 
−
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
 
−
        gridBagConstraints.weightx = 1.0;
 
−
        gridBagConstraints.weighty = 1.0;
 
−
        gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
 
−
        getContentPane().add(jLabelStatus, gridBagConstraints);
 
−
        pack();
 
−
    }// </editor-fold>//GEN-END:initComponents
 
−
   
 
−
    public void setStatus(String s)
 
−
    {
 
−
        jLabelStatus.setText(s);
 
−
    }
 
−
   
 
−
    public void fontsLoadingStatusUpdated(String statusMsg) {
 
−
       
 
−
        final String s = statusMsg;
 
−
        try {
 
−
            SwingUtilities.invokeAndWait( new Runnable()
 
−
            {
 
−
                public void run()
 
−
                {
 
−
                    setStatus(s);
 
−
                }
 
−
            }
 
−
            );
 
−
        } catch (InterruptedException ex) {
 
−
            ex.printStackTrace();
 
−
        } catch (InvocationTargetException ex) {
 
−
            ex.printStackTrace();
 
−
        }
 
−
       
 
−
    }
 
−
    public void fontsLoadingStarted() {
 
−
       
 
−
        try {
 
−
            SwingUtilities.invokeAndWait( new Runnable()
 
−
            {
 
−
                public void run()
 
−
                {
 
−
                    setVisible(true);
 
−
                }
 
−
            }
 
−
            );
 
−
        } catch (InterruptedException ex) {
 
−
            ex.printStackTrace();
 
−
        } catch (InvocationTargetException ex) {
 
−
            ex.printStackTrace();
 
−
        }
 
−
    }
 
−
    public void fontsLoadingFinished() {
 
−
        try {
 
−
            SwingUtilities.invokeAndWait( new Runnable()
 
−
            {
 
−
                public void run()
 
−
                {
 
−
                    setVisible(false);
 
−
                }
 
−
            }
 
−
            );
 
−
        } catch (InterruptedException ex) {
 
−
            ex.printStackTrace();
 
−
        } catch (InvocationTargetException ex) {
 
−
            ex.printStackTrace();
 
−
        }
 
−
    }
 
−
   
 
−
    // Variables declaration - do not modify//GEN-BEGIN:variables
 
−
    private javax.swing.JLabel jLabelStatus;
 
−
    // End of variables declaration//GEN-END:variables
 
−
   
 
−
//    public void applyI18n(){
 
−
//                // Start autogenerated code ----------------------
 
−
//                jLabelStatus.setText(I18n.getString("fontLoaderDialog.labelStatus","Loading status"));
 
−
//                // End autogenerated code ----------------------
 
−
//    }
 
−
}
 
−
 
 
−
   
 
−
   
 
−
  </source>
 
−
   
 
−
 
 
−
  <!-- end source code -->
 
−
 
 
−
 
−
 
−
 
−
 
−
== JFont Chooser ==
 
−
 
−
 
−
 
−
 
−
 
−
 
−
 
 
−
  <!-- start source code -->
 
−
 
 
−
    <source lang="java">
 
−
 
 
−
// revised from greef ui
 
−
import java.awt.BorderLayout;
 
−
import java.awt.ruponent;
 
−
import java.awt.Container;
 
−
import java.awt.FlowLayout;
 
−
import java.awt.Font;
 
−
import java.awt.GraphicsEnvironment;
 
−
import java.awt.GridBagConstraints;
 
−
import java.awt.GridBagLayout;
 
−
import java.awt.HeadlessException;
 
−
import java.awt.Insets;
 
−
import java.awt.Window;
 
−
import java.awt.event.ActionEvent;
 
−
import java.awt.event.ActionListener;
 
−
import java.awt.event.ruponentAdapter;
 
−
import java.awt.event.ruponentEvent;
 
−
import java.awt.event.KeyEvent;
 
−
import java.awt.event.WindowAdapter;
 
−
import java.awt.event.WindowEvent;
 
−
import java.io.Serializable;
 
−
import javax.swing.AbstractAction;
 
−
import javax.swing.Action;
 
−
import javax.swing.ActionMap;
 
−
import javax.swing.InputMap;
 
−
import javax.swing.JButton;
 
−
import javax.swing.JCheckBox;
 
−
import javax.swing.JComponent;
 
−
import javax.swing.JDialog;
 
−
import javax.swing.JLabel;
 
−
import javax.swing.JList;
 
−
import javax.swing.JOptionPane;
 
−
import javax.swing.JPanel;
 
−
import javax.swing.JScrollPane;
 
−
import javax.swing.KeyStroke;
 
−
import javax.swing.ListSelectionModel;
 
−
import javax.swing.UIManager;
 
−
import javax.swing.event.ChangeEvent;
 
−
import javax.swing.event.ChangeListener;
 
−
import javax.swing.event.EventListenerList;
 
−
import javax.swing.event.ListSelectionEvent;
 
−
import javax.swing.event.ListSelectionListener;
 
−
/**
 
−
* <code>JFontChooser</code> provides a pane of controls designed to allow
 
−
* a user to manipulate and select a font.
 
−
*
 
−
* This class provides three levels of API:
 
−
* <ol>
 
−
* <li>A static convenience method which shows a modal font-chooser
 
−
* dialog and returns the font selected by the user.
 
−
* <li>A static convenience method for creating a font-chooser dialog
 
−
* where <code>ActionListeners</code> can be specified to be invoked when
 
−
* the user presses one of the dialog buttons.
 
−
* <li>The ability to create instances of <code>JFontChooser</code> panes
 
−
* directly (within any container). <code>PropertyChange</code> listeners
 
−
* can be added to detect when the current "font" property changes.
 
−
* </ol>
 
−
* <p>
 
−
*
 
−
* @author Adrian BER
 
−
*/
 
−
public class JFontChooser extends JComponent {
 
−
    /** The list of possible font sizes. */
 
−
    private static final Integer[] SIZES =
 
−
            {8, 9, 10, 11, 12, 13, 14, 16, 18, 20, 24, 26, 28, 32, 36, 40, 48, 56, 64, 72};
 
−
    /** The list of possible fonts. */
 
−
    private static final String[] FONTS = GraphicsEnvironment.getLocalGraphicsEnvironment()
 
−
            .getAvailableFontFamilyNames();
 
−
 
−
    private FontSelectionModel selectionModel;
 
−
    private JList fontList;
 
−
    private JList sizeList;
 
−
    private JCheckBox boldCheckBox;
 
−
    private JCheckBox italicCheckBox;
 
−
    private JLabel previewLabel;
 
−
    /** The preview text, if null the font name will be the preview text. */
 
−
    private String previewText;
 
−
    /** Listener used to update the font of the selection model. */
 
−
    private SelectionUpdater selectionUpdater = new SelectionUpdater();
 
−
    /** Listener used to update the font in the components. This should be registered
 
−
    * with the selection model. */
 
−
    private LabelUpdater labelUpdater = new LabelUpdater();
 
−
    /** True if the components are being updated and no event should be generated. */
 
−
    private boolean updatingComponents = false;
 
−
    /** Listener class used to update the font in the components. This should be registered
 
−
      * with the selection model. */
 
−
    private class LabelUpdater implements ChangeListener {
 
−
        public void stateChanged(ChangeEvent e) {
 
−
            updateComponents();
 
−
        }
 
−
    }
 
−
    /** Listener class used to update the font of the preview label. */
 
−
    private class SelectionUpdater implements ChangeListener, ListSelectionListener {
 
−
        public void stateChanged(ChangeEvent e) {
 
−
            if (!updatingComponents) {
 
−
                setFont(buildFont());
 
−
            }
 
−
        }
 
−
        public void valueChanged(ListSelectionEvent e) {
 
−
            if (!updatingComponents) {
 
−
                setFont(buildFont());
 
−
            }
 
−
        }
 
−
    }
 
−
    /**
 
−
    * Shows a modal font-chooser dialog and blocks until the
 
−
    * dialog is hidden.  If the user presses the "OK" button, then
 
−
    * this method hides/disposes the dialog and returns the selected color.
 
−
    * If the user presses the "Cancel" button or closes the dialog without
 
−
    * pressing "OK", then this method hides/disposes the dialog and returns
 
−
    * <code>null</code>.
 
−
    *
 
−
    * @param component    the parent <code>Component</code> for the dialog
 
−
    * @param title        the String containing the dialog"s title
 
−
    * @return the selected font or <code>null</code> if the user opted out
 
−
    * @exception HeadlessException if GraphicsEnvironment.isHeadless()
 
−
    * returns true.
 
−
    * @see java.awt.GraphicsEnvironment#isHeadless
 
−
    */
 
−
    public Font showDialog(Component component, String title) {
 
−
        FontTracker ok = new FontTracker(this);
 
−
        JDialog dialog = createDialog(component, title, true, ok, null);
 
−
        dialog.addWindowListener(new FontChooserDialog.Closer());
 
−
        dialog.addComponentListener(new FontChooserDialog.DisposeOnClose());
 
−
        dialog.setVisible(true); // blocks until user brings dialog down...
 
−
        return ok.getFont();
 
−
    }
 
−
 
−
    /**
 
−
    * Creates and returns a new dialog containing the specified
 
−
    * <code>ColorChooser</code> pane along with "OK", "Cancel", and "Reset"
 
−
    * buttons. If the "OK" or "Cancel" buttons are pressed, the dialog is
 
−
    * automatically hidden (but not disposed).  If the "Reset"
 
−
    * button is pressed, the color-chooser"s color will be reset to the
 
−
    * font which was set the last time <code>show</code> was invoked on the
 
−
    * dialog and the dialog will remain showing.
 
−
    *
 
−
    * @param c              the parent component for the dialog
 
−
    * @param title          the title for the dialog
 
−
    * @param modal          a boolean. When true, the remainder of the program
 
−
    *                      is inactive until the dialog is closed.
 
−
    * @param okListener    the ActionListener invoked when "OK" is pressed
 
−
    * @param cancelListener the ActionListener invoked when "Cancel" is pressed
 
−
    * @return a new dialog containing the font-chooser pane
 
−
    * @exception HeadlessException if GraphicsEnvironment.isHeadless()
 
−
    * returns true.
 
−
    * @see java.awt.GraphicsEnvironment#isHeadless
 
−
    */
 
−
    public JDialog createDialog(Component c, String title, boolean modal,
 
−
        ActionListener okListener, ActionListener cancelListener) {
 
−
        return new FontChooserDialog(c, title, modal, this,
 
−
                okListener, cancelListener);
 
−
    }
 
−
    /**
 
−
    * Creates a color chooser pane with an initial font which is the same font
 
−
    * as the default font for labels.
 
−
    */
 
−
    public JFontChooser() {
 
−
        this(new DefaultFontSelectionModel());
 
−
    }
 
−
    /**
 
−
    * Creates a font chooser pane with the specified initial font.
 
−
    *
 
−
    * @param initialFont the initial font set in the chooser
 
−
    */
 
−
    public JFontChooser(Font initialFont) {
 
−
        this(new DefaultFontSelectionModel(initialFont));
 
−
    }
 
−
    /**
 
−
    * Creates a font chooser pane with the specified
 
−
    * <code>FontSelectionModel</code>.
 
−
    *
 
−
    * @param model the font selection model used by this component
 
−
    */
 
−
    public JFontChooser(FontSelectionModel model) {
 
−
        selectionModel = model;
 
−
        init(model.getSelectedFont());
 
−
        selectionModel.addChangeListener(labelUpdater);
 
−
    }
 
−
    private void init(Font font) {
 
−
        setLayout(new GridBagLayout());
 
−
        Insets ins = new Insets(2, 2, 2, 2);
 
−
        fontList = new JList(FONTS);
 
−
        fontList.setVisibleRowCount(10);
 
−
        fontList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
 
−
        add(new JScrollPane(fontList), new GridBagConstraints(0, 0, 1, 1, 2, 2,
 
−
                GridBagConstraints.CENTER, GridBagConstraints.BOTH,
 
−
                ins, 0, 0));
 
−
        sizeList = new JList(SIZES);
 
−
        ((JLabel)sizeList.getCellRenderer()).setHorizontalAlignment(JLabel.RIGHT);
 
−
        sizeList.setVisibleRowCount(10);
 
−
        sizeList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
 
−
        add(new JScrollPane(sizeList), new GridBagConstraints(1, 0, 1, 1, 1, 2,
 
−
                GridBagConstraints.CENTER, GridBagConstraints.BOTH,
 
−
                ins, 0, 0));
 
−
        boldCheckBox = new JCheckBox("Bold");
 
−
        add(boldCheckBox, new GridBagConstraints(0, 1, 2, 1, 1, 0,
 
−
                GridBagConstraints.WEST, GridBagConstraints.NONE,
 
−
                ins, 0, 0));
 
−
        italicCheckBox = new JCheckBox("Italic");
 
−
        add(italicCheckBox, new GridBagConstraints(0, 2, 2, 1, 1, 0,
 
−
                GridBagConstraints.WEST, GridBagConstraints.NONE,
 
−
                ins, 0, 0));
 
−
        previewLabel = new JLabel("");
 
−
        previewLabel.setHorizontalAlignment(JLabel.CENTER);
 
−
        previewLabel.setVerticalAlignment(JLabel.CENTER);
 
−
        add(new JScrollPane(previewLabel), new GridBagConstraints(0, 3, 2, 1, 1, 1,
 
−
                GridBagConstraints.CENTER, GridBagConstraints.BOTH,
 
−
                ins, 0, 0));
 
−
        setFont(font == null ? previewLabel.getFont() : font);
 
−
        fontList.addListSelectionListener(selectionUpdater);
 
−
        sizeList.addListSelectionListener(selectionUpdater);
 
−
        boldCheckBox.addChangeListener(selectionUpdater);
 
−
        italicCheckBox.addChangeListener(selectionUpdater);
 
−
    }
 
−
    private Font buildFont() {
 
−
//        Font labelFont = previewLabel.getFont();
 
−
        String fontName = (String)fontList.getSelectedValue();
 
−
        if (fontName == null) {
 
−
            return null;
 
−
//            fontName = labelFont.getName();
 
−
        }
 
−
        Integer sizeInt = (Integer)sizeList.getSelectedValue();
 
−
        if (sizeInt == null) {
 
−
//            size = labelFont.getSize();
 
−
            return null;
 
−
        }
 
−
        // create the font
 
−
//        // first create the font attributes
 
−
//        HashMap map = new HashMap();
 
−
//        map.put(TextAttribute.BACKGROUND, Color.white);
 
−
//        map.put(TextAttribute.FAMILY, fontName);
 
−
//        map.put(TextAttribute.FOREGROUND, Color.black);
 
−
//        map.put(TextAttribute.SIZE , new Float(size));
 
−
//        map.put(TextAttribute.UNDERLINE, italicCheckBox.isSelected() ? TextAttribute.UNDERLINE_LOW_ONE_PIXEL : TextAttribute.UNDERLINE_LOW_TWO_PIXEL);
 
−
//        map.put(TextAttribute.STRIKETHROUGH, italicCheckBox.isSelected() ? TextAttribute.STRIKETHROUGH_ON : Boolean.FALSE);
 
−
//        map.put(TextAttribute.WEIGHT, boldCheckBox.isSelected() ? TextAttribute.WEIGHT_BOLD : TextAttribute.WEIGHT_REGULAR);
 
−
//        map.put(TextAttribute.POSTURE,
 
−
//                italicCheckBox.isSelected() ? TextAttribute.POSTURE_OBLIQUE : TextAttribute.POSTURE_REGULAR);
 
−
//
 
−
//        return new Font(map);
 
−
        return new Font(fontName,
 
−
                (italicCheckBox.isSelected() ? Font.ITALIC : Font.PLAIN)
 
−
                | (boldCheckBox.isSelected() ? Font.BOLD : Font.PLAIN),
 
−
                sizeInt);
 
−
    }
 
−
    /** Updates the font in the preview component according to the selected values. */
 
−
    private void updateComponents() {
 
−
        updatingComponents = true;
 
−
        Font font = getFont();
 
−
        fontList.setSelectedValue(font.getName(), true);
 
−
        sizeList.setSelectedValue(font.getSize(), true);
 
−
        boldCheckBox.setSelected(font.isBold());
 
−
        italicCheckBox.setSelected(font.isItalic());
 
−
        if (previewText == null) {
 
−
            previewLabel.setText(font.getName());
 
−
        }
 
−
        // set the font and fire a property change
 
−
        Font oldValue = previewLabel.getFont();
 
−
        previewLabel.setFont(font);
 
−
        firePropertyChange("font", oldValue, font);
 
−
        updatingComponents = false;
 
−
    }
 
−
    /**
 
−
    * Returns the data model that handles font selections.
 
−
    *
 
−
    * @return a FontSelectionModel object
 
−
    */
 
−
    public FontSelectionModel getSelectionModel() {
 
−
        return selectionModel;
 
−
    }
 
−
 
−
    /**
 
−
    * Set the model containing the selected font.
 
−
    *
 
−
    * @param newModel  the new FontSelectionModel object
 
−
    */
 
−
    public void setSelectionModel(FontSelectionModel newModel ) {
 
−
        FontSelectionModel oldModel = selectionModel;
 
−
        selectionModel = newModel;
 
−
        oldModel.removeChangeListener(labelUpdater);
 
−
        newModel.addChangeListener(labelUpdater);
 
−
        firePropertyChange("selectionModel", oldModel, newModel);
 
−
    }
 
−
    /**
 
−
    * Gets the current font value from the font chooser.
 
−
    *
 
−
    * @return the current font value of the font chooser
 
−
    */
 
−
    public Font getFont() {
 
−
        return selectionModel.getSelectedFont();
 
−
    }
 
−
    /**
 
−
    * Sets the current font of the font chooser to the specified font.
 
−
    * The <code>ColorSelectionModel</code> will fire a <code>ChangeEvent</code>
 
−
    * @param font the font to be set in the font chooser
 
−
    * @see JComponent#addPropertyChangeListener
 
−
    */
 
−
    public void setFont(Font font) {
 
−
        selectionModel.setSelectedFont(font);
 
−
    }
 
−
    /** Returns the preview text displayed in the preview component.
 
−
    * @return the preview text, if null the font name will be displayed
 
−
    */
 
−
    public String getPreviewText() {
 
−
        return previewText;
 
−
    }
 
−
    /** Sets the preview text displayed in the preview component.
 
−
    * @param previewText the preview text, if null the font name will be displayed
 
−
    */
 
−
    public void setPreviewText(String previewText) {
 
−
        this.previewText = previewText;
 
−
        previewLabel.setText("");
 
−
        updateComponents();
 
−
    }
 
−
}
 
−
 
−
/*
 
−
* Class which builds a font chooser dialog consisting of
 
−
* a JFontChooser with "Ok", "Cancel", and "Reset" buttons.
 
−
*
 
−
* Note: This needs to be fixed to deal with localization!
 
−
*/
 
−
class FontChooserDialog extends JDialog {
 
−
    private Font initialFont;
 
−
    private JFontChooser chooserPane;
 
−
    public FontChooserDialog(Component c, String title, boolean modal,
 
−
              JFontChooser chooserPane,
 
−
              ActionListener okListener, ActionListener cancelListener) {
 
−
        super(JOptionPane.getFrameForComponent(c), title, modal);
 
−
        //setResizable(false);
 
−
        String okString = UIManager.getString("ColorChooser.okText");
 
−
        String cancelString = UIManager.getString("ColorChooser.cancelText");
 
−
        String resetString = UIManager.getString("ColorChooser.resetText");
 
−
        /*
 
−
        * Create Lower button panel
 
−
        */
 
−
        JPanel buttonPane = new JPanel();
 
−
        buttonPane.setLayout(new FlowLayout(FlowLayout.CENTER));
 
−
        JButton okButton = new JButton(okString);
 
−
        getRootPane().setDefaultButton(okButton);
 
−
        okButton.setActionCommand("OK");
 
−
        if (okListener != null) {
 
−
            okButton.addActionListener(okListener);
 
−
        }
 
−
        okButton.addActionListener(new ActionListener() {
 
−
            public void actionPerformed(ActionEvent e) {
 
−
                setVisible(false);
 
−
            }
 
−
        });
 
−
        buttonPane.add(okButton);
 
−
        JButton cancelButton = new JButton(cancelString);
 
−
        // The following few lines are used to register esc to close the dialog
 
−
        Action cancelKeyAction = new AbstractAction() {
 
−
            public void actionPerformed(ActionEvent e) {
 
−
                // todo make it in 1.3
 
−
//                ActionListener[] listeners
 
−
//                        = ((AbstractButton) e.getSource()).getActionListeners();
 
−
//                for (int i = 0; i < listeners.length; i++) {
 
−
//                    listeners[i].actionPerformed(e);
 
−
//                }
 
−
            }
 
−
        };
 
−
        KeyStroke cancelKeyStroke = KeyStroke.getKeyStroke((char) KeyEvent.VK_ESCAPE);
 
−
        InputMap inputMap = cancelButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
 
−
        ActionMap actionMap = cancelButton.getActionMap();
 
−
        if (inputMap != null && actionMap != null) {
 
−
            inputMap.put(cancelKeyStroke, "cancel");
 
−
            actionMap.put("cancel", cancelKeyAction);
 
−
        }
 
−
        // end esc handling
 
−
        cancelButton.setActionCommand("cancel");
 
−
        if (cancelListener != null) {
 
−
            cancelButton.addActionListener(cancelListener);
 
−
        }
 
−
        cancelButton.addActionListener(new ActionListener() {
 
−
            public void actionPerformed(ActionEvent e) {
 
−
                setVisible(false);
 
−
            }
 
−
        });
 
−
        buttonPane.add(cancelButton);
 
−
        JButton resetButton = new JButton(resetString);
 
−
        resetButton.addActionListener(new ActionListener() {
 
−
            public void actionPerformed(ActionEvent e) {
 
−
                reset();
 
−
            }
 
−
        });
 
−
        int mnemonic = UIManager.getInt("ColorChooser.resetMnemonic");
 
−
        if (mnemonic != -1) {
 
−
            resetButton.setMnemonic(mnemonic);
 
−
        }
 
−
        buttonPane.add(resetButton);
 
−
 
−
        // initialiase the content pane
 
−
        this.chooserPane = chooserPane;
 
−
        Container contentPane = getContentPane();
 
−
        contentPane.setLayout(new BorderLayout());
 
−
        contentPane.add(chooserPane, BorderLayout.CENTER);
 
−
        contentPane.add(buttonPane, BorderLayout.SOUTH);
 
−
        pack();
 
−
        setLocationRelativeTo(c);
 
−
    }
 
−
    public void setVisible(boolean visible) {
 
−
        if (visible)
 
−
            initialFont = chooserPane.getFont();
 
−
        super.setVisible(visible);
 
−
    }
 
−
    public void reset() {
 
−
        chooserPane.setFont(initialFont);
 
−
    }
 
−
    static class Closer extends WindowAdapter implements Serializable {
 
−
        public void windowClosing(WindowEvent e) {
 
−
            Window w = e.getWindow();
 
−
            w.setVisible(false);
 
−
        }
 
−
    }
 
−
    static class DisposeOnClose extends ComponentAdapter implements Serializable {
 
−
        public void componentHidden(ComponentEvent e) {
 
−
            Window w = (Window) e.getComponent();
 
−
            w.dispose();
 
−
        }
 
−
    }
 
−
}
 
−
class FontTracker implements ActionListener, Serializable {
 
−
    JFontChooser chooser;
 
−
    Font color;
 
−
    public FontTracker(JFontChooser c) {
 
−
        chooser = c;
 
−
    }
 
−
    public void actionPerformed(ActionEvent e) {
 
−
        color = chooser.getFont();
 
−
    }
 
−
    public Font getFont() {
 
−
        return color;
 
−
    }
 
−
}
 
−
 
−
/**
 
−
* A generic implementation of <code>{@link FontSelectionModel}</code>.
 
−
*
 
−
* @author Adrian BER
 
−
*/
 
−
class DefaultFontSelectionModel implements FontSelectionModel {
 
−
    /** The default selected font. */
 
−
    private static final Font DEFAULT_INITIAL_FONT = new Font("Dialog", Font.PLAIN, 12);
 
−
   
 
−
    /** The selected font. */
 
−
    private Font selectedFont;
 
−
    /** The change listeners notified by a change in this model. */
 
−
    private EventListenerList listeners = new EventListenerList();
 
−
    /**
 
−
    * Creates a <code>DefaultFontSelectionModel</code> with the
 
−
    * current font set to <code>Dialog, 12</code>.  This is
 
−
    * the default constructor.
 
−
    */
 
−
    public DefaultFontSelectionModel() {
 
−
        this(DEFAULT_INITIAL_FONT);
 
−
    }
 
−
    /**
 
−
    * Creates a <code>DefaultFontSelectionModel</code> with the
 
−
    * current font set to <code>font</code>, which should be
 
−
    * non-<code>null</code>.  Note that setting the font to
 
−
    * <code>null</code> is undefined and may have unpredictable
 
−
    * results.
 
−
    *
 
−
    * @param selectedFont the new <code>Font</code>
 
−
    */
 
−
    public DefaultFontSelectionModel(Font selectedFont) {
 
−
        if (selectedFont == null) {
 
−
            selectedFont = DEFAULT_INITIAL_FONT;
 
−
        }
 
−
        this.selectedFont = selectedFont;
 
−
    }
 
−
    public Font getSelectedFont() {
 
−
        return selectedFont;
 
−
    }
 
−
    public void setSelectedFont(Font selectedFont) {
 
−
        if (selectedFont != null) {
 
−
            this.selectedFont = selectedFont;
 
−
            fireChangeListeners();
 
−
        }
 
−
    }
 
−
    public void addChangeListener(ChangeListener listener) {
 
−
        listeners.add(ChangeListener.class, listener);
 
−
    }
 
−
    public void removeChangeListener(ChangeListener listener) {
 
−
        listeners.remove(ChangeListener.class, listener);
 
−
    }
 
−
    /** Fires the listeners registered with this model. */
 
−
    protected void fireChangeListeners() {
 
−
        ChangeEvent ev = new ChangeEvent(this);
 
−
        Object[] l = listeners.getListeners(ChangeListener.class);
 
−
        for (Object listener : l) {
 
−
            ((ChangeListener) listener).stateChanged(ev);
 
−
        }
 
−
    }
 
−
}
 
−
 
−
/**
 
−
* A model that supports selecting a <code>Font</code>.
 
−
*
 
−
* @author Adrian BER
 
−
*
 
−
* @see java.awt.Font
 
−
*/
 
−
interface FontSelectionModel {
 
−
    /**
 
−
    * Returns the selected <code>Font</code> which should be
 
−
    * non-<code>null</code>.
 
−
    *
 
−
    * @return  the selected <code>Font</code>
 
−
    * @see    #setSelectedFont
 
−
    */
 
−
    Font getSelectedFont();
 
−
    /**
 
−
    * Sets the selected font to <code>font</code>.
 
−
    * Note that setting the font to <code>null</code>
 
−
    * is undefined and may have unpredictable results.
 
−
    * This method fires a state changed event if it sets the
 
−
    * current font to a new non-<code>null</code> font.
 
−
    *
 
−
    * @param font the new <code>Font</code>
 
−
    * @see  #getSelectedFont
 
−
    * @see  #addChangeListener
 
−
    */
 
−
    void setSelectedFont(Font font);
 
−
    /**
 
−
    * Adds <code>listener</code> as a listener to changes in the model.
 
−
    * @param listener the <code>ChangeListener</code> to be added
 
−
    */
 
−
    void addChangeListener(ChangeListener listener);
 
−
    /**
 
−
    * Removes <code>listener</code> as a listener to changes in the model.
 
−
    * @param listener the <code>ChangeListener</code> to be removed
 
−
    */
 
−
    void removeChangeListener(ChangeListener listener);
 
−
}
 
−
//////////////////////////////
 
−
package com.greef.ui.font;
 
−
import com.greef.ui.UIUtilities;
 
−
import javax.swing.*;
 
−
import javax.swing.event.ChangeListener;
 
−
import javax.swing.event.ChangeEvent;
 
−
import javax.swing.event.DocumentListener;
 
−
import javax.swing.event.DocumentEvent;
 
−
import java.awt.*;
 
−
import java.awt.event.ActionListener;
 
−
import java.awt.event.ActionEvent;
 
−
/**
 
−
* @author Adrian BER (beradrian@yahoo.ru)
 
−
*/
 
−
public class JFontChooserDemo extends JPanel {
 
−
    private static final Insets INSETS = new Insets(5, 5, 5, 5);
 
−
    private JFontChooser fontChooser;
 
−
    private JCheckBox defaultPreviewCheckBox;
 
−
    private JTextField previewTextField;
 
−
    private JLabel previewLabel;
 
−
    private JTextArea codeTextArea;
 
−
    public JFontChooserDemo() {
 
−
        init();
 
−
    }
 
−
    private void init() {
 
−
        setLayout(new GridBagLayout());
 
−
        defaultPreviewCheckBox = new JCheckBox("Use font name as the preview text");
 
−
        defaultPreviewCheckBox.addChangeListener(new ChangeListener() {
 
−
            public void stateChanged(ChangeEvent e) {
 
−
                boolean selected = defaultPreviewCheckBox.isSelected();
 
−
                fontChooser.setPreviewText(selected ? null : previewTextField.getText());
 
−
                previewLabel.setEnabled(!selected);
 
−
                previewTextField.setEnabled(!selected);
 
−
                updateCode();
 
−
            }
 
−
        });
 
−
        add(defaultPreviewCheckBox, new GridBagConstraints(0, 0, 2, 1, 0, 0, GridBagConstraints.WEST,
 
−
                GridBagConstraints.NONE, INSETS, 0, 0));
 
−
        previewLabel = new JLabel("Preview text:");
 
−
        add(previewLabel, new GridBagConstraints(0, 1, 1, 1, 0, 0, GridBagConstraints.EAST,
 
−
                GridBagConstraints.NONE, INSETS, 0, 0));
 
−
        previewTextField = new JTextField();
 
−
        previewTextField.getDocument().addDocumentListener(new DocumentListener() {
 
−
            private void changePreviewText() {
 
−
                fontChooser.setPreviewText(previewTextField.getText());
 
−
                updateCode();
 
−
            }
 
−
            public void insertUpdate(DocumentEvent e) {
 
−
                changePreviewText();
 
−
            }
 
−
            public void removeUpdate(DocumentEvent e) {
 
−
                changePreviewText();
 
−
            }
 
−
            public void changedUpdate(DocumentEvent e) {
 
−
                changePreviewText();
 
−
            }
 
−
        });
 
−
        add(previewTextField, new GridBagConstraints(1, 1, 1, 1, 1, 0, GridBagConstraints.WEST,
 
−
                GridBagConstraints.HORIZONTAL, INSETS, 0, 0));
 
−
        JButton testButton = new JButton("Test");
 
−
        testButton.addActionListener(new ActionListener() {
 
−
            public void actionPerformed(ActionEvent e) {
 
−
                Font font = fontChooser.showDialog(JFontChooserDemo.this, "Choose a font");
 
−
                JOptionPane.showMessageDialog(JFontChooserDemo.this, font == null ? "You canceled the dialog."
 
−
                        : "You have selected " + font.getName() + ", " + font.getSize()
 
−
                        + (font.isBold() ? ", Bold" : "") + (font.isItalic() ? ", Italic" : ""));
 
−
            }
 
−
        });
 
−
        add(testButton, new GridBagConstraints(0, 2, 2, 1, 1, 0, GridBagConstraints.NORTHEAST,
 
−
                GridBagConstraints.NONE, INSETS, 0, 0));
 
−
        codeTextArea = new JTextArea(5, 30);
 
−
        codeTextArea.setOpaque(false);
 
−
        codeTextArea.setEditable(false);
 
−
        codeTextArea.setBorder(BorderFactory.createTitledBorder("Code"));
 
−
        add(codeTextArea, new GridBagConstraints(0, 3, 2, 1, 1, 1, GridBagConstraints.CENTER,
 
−
                GridBagConstraints.BOTH, INSETS, 0, 0));
 
−
        setFontChooser(new JFontChooser());
 
−
    }
 
−
    private void setFontChooser(JFontChooser fontChooser) {
 
−
        this.fontChooser = fontChooser;
 
−
        String previewText = fontChooser.getPreviewText();
 
−
        defaultPreviewCheckBox.setSelected(previewText == null);
 
−
        previewTextField.setText(previewText);
 
−
        updateCode();
 
−
    }
 
−
    private void updateCode() {
 
−
        codeTextArea.setText("JFontChooser fontChooser = new JFontChooser();\n"
 
−
                + (defaultPreviewCheckBox.isSelected() ? "" : "fontChooser.setPreviewText(\""
 
−
                    + previewTextField.getText() + "\");\n")
 
−
                + "Font font = fontChooser.showDialog(invokerComponent, \"Choose a font\");\n"
 
−
                + "System.out.println(font == null ? \"You have canceled the dialog.\" : \"You have selected \" + font);");
 
−
    }
 
−
    public void updateUI() {
 
−
        super.updateUI();
 
−
        if (fontChooser != null)
 
−
            SwingUtilities.updateComponentTreeUI(fontChooser);
 
−
    }
 
−
}
 
−
 
 
−
   
 
−
   
 
−
  </source>
 
−
   
 
−
 
 
−
  <!-- end source code -->
 
−
 
 
−
 
−
 
−
 
−
 
−
== JFreeChart: Font Dialog ==
 
−
 
−
 
−
 
−
 
−
 
−
 
−
 
−
 
−
 
−
== Word like special font chooser ==
 
−
 
−
 
−
 
−
 
−
 
−
 
−
 
 
−
  <!-- start source code -->
 
−
 
 
−
    <source lang="java">
 
−
 
 
−
/*
 
−
* @(#)Font2DTest.java  1.28 05/11/17
 
−
*
 
−
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
 
−
*
 
−
* Redistribution and use in source and binary forms, with or without
 
−
* modification, are permitted provided that the following conditions are met:
 
−
*
 
−
* -Redistribution of source code must retain the above copyright notice, this
 
−
*  list of conditions and the following disclaimer.
 
−
*
 
−
* -Redistribution in binary form must reproduce the above copyright notice,
 
−
*  this list of conditions and the following disclaimer in the documentation
 
−
*  and/or other materials provided with the distribution.
 
−
*
 
−
* Neither the name of Sun Microsystems, Inc. or the names of contributors may
 
−
* be used to endorse or promote products derived from this software without
 
−
* specific prior written permission.
 
−
*
 
−
* This software is provided "AS IS," without a warranty of any kind. ALL
 
−
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
 
−
* ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
 
−
* OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN")
 
−
* AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
 
−
* AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
 
−
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
 
−
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
 
−
* INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY
 
−
* OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
 
−
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 
−
*
 
−
* You acknowledge that this software is not designed, licensed or intended
 
−
* for use in the design, construction, operation or maintenance of any
 
−
* nuclear facility.
 
−
*/
 
−
/*
 
−
* @(#)Font2DTest.java  1.28 05/11/17
 
−
*/
 
−
import static java.awt.RenderingHints.KEY_ANTIALIASING;
 
−
import static java.awt.RenderingHints.KEY_FRACTIONALMETRICS;
 
−
import static java.awt.RenderingHints.KEY_TEXT_ANTIALIASING;
 
−
import static java.awt.RenderingHints.KEY_TEXT_LCD_CONTRAST;
 
−
import static java.awt.RenderingHints.VALUE_ANTIALIAS_OFF;
 
−
import static java.awt.RenderingHints.VALUE_ANTIALIAS_ON;
 
−
import static java.awt.RenderingHints.VALUE_FRACTIONALMETRICS_DEFAULT;
 
−
import static java.awt.RenderingHints.VALUE_FRACTIONALMETRICS_OFF;
 
−
import static java.awt.RenderingHints.VALUE_FRACTIONALMETRICS_ON;
 
−
import static java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT;
 
−
import static java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_GASP;
 
−
import static java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HBGR;
 
−
import static java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB;
 
−
import static java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_VBGR;
 
−
import static java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_VRGB;
 
−
import static java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_OFF;
 
−
import static java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_ON;
 
−
import java.awt.BorderLayout;
 
−
import java.awt.Color;
 
−
import java.awt.ruponent;
 
−
import java.awt.Container;
 
−
import java.awt.Cursor;
 
−
import java.awt.Dimension;
 
−
import java.awt.Font;
 
−
import java.awt.FontMetrics;
 
−
import java.awt.Graphics;
 
−
import java.awt.Graphics2D;
 
−
import java.awt.GraphicsConfiguration;
 
−
import java.awt.GraphicsEnvironment;
 
−
import java.awt.GridBagConstraints;
 
−
import java.awt.GridBagLayout;
 
−
import java.awt.GridLayout;
 
−
import java.awt.Insets;
 
−
import java.awt.Point;
 
−
import java.awt.RenderingHints;
 
−
import java.awt.Toolkit;
 
−
import java.awt.event.ActionEvent;
 
−
import java.awt.event.ActionListener;
 
−
import java.awt.event.AdjustmentEvent;
 
−
import java.awt.event.AdjustmentListener;
 
−
import java.awt.event.ruponentAdapter;
 
−
import java.awt.event.ruponentEvent;
 
−
import java.awt.event.ItemEvent;
 
−
import java.awt.event.ItemListener;
 
−
import java.awt.event.MouseEvent;
 
−
import java.awt.event.MouseListener;
 
−
import java.awt.event.MouseMotionListener;
 
−
import java.awt.event.WindowAdapter;
 
−
import java.awt.event.WindowEvent;
 
−
import java.awt.font.FontRenderContext;
 
−
import java.awt.font.GlyphVector;
 
−
import java.awt.font.LineBreakMeasurer;
 
−
import java.awt.font.TextLayout;
 
−
import java.awt.geom.AffineTransform;
 
−
import java.awt.geom.NoninvertibleTransformException;
 
−
import java.awt.geom.Rectangle2D;
 
−
import java.awt.image.BufferedImage;
 
−
import java.awt.print.PageFormat;
 
−
import java.awt.print.Printable;
 
−
import java.awt.print.PrinterJob;
 
−
import java.io.BufferedInputStream;
 
−
import java.io.BufferedOutputStream;
 
−
import java.io.File;
 
−
import java.io.FileInputStream;
 
−
import java.io.FileOutputStream;
 
−
import java.text.AttributedString;
 
−
import java.util.BitSet;
 
−
import java.util.EnumSet;
 
−
import java.util.StringTokenizer;
 
−
import java.util.Vector;
 
−
import javax.imageio.ImageIO;
 
−
import javax.swing.ButtonGroup;
 
−
import javax.swing.DefaultListCellRenderer;
 
−
import javax.swing.ImageIcon;
 
−
import javax.swing.JButton;
 
−
import javax.swing.JCheckBoxMenuItem;
 
−
import javax.swing.JComboBox;
 
−
import javax.swing.JComponent;
 
−
import javax.swing.JDialog;
 
−
import javax.swing.JFileChooser;
 
−
import javax.swing.JFrame;
 
−
import javax.swing.JLabel;
 
−
import javax.swing.JList;
 
−
import javax.swing.JMenu;
 
−
import javax.swing.JMenuBar;
 
−
import javax.swing.JMenuItem;
 
−
import javax.swing.JPanel;
 
−
import javax.swing.JRadioButton;
 
−
import javax.swing.JScrollBar;
 
−
import javax.swing.JScrollPane;
 
−
import javax.swing.JSlider;
 
−
import javax.swing.JTextArea;
 
−
import javax.swing.JTextField;
 
−
import javax.swing.JWindow;
 
−
import javax.swing.UIManager;
 
−
import javax.swing.event.ChangeEvent;
 
−
import javax.swing.event.ChangeListener;
 
−
/**
 
−
* Font2DTest.java
 
−
*
 
−
* @version
 
−
* @(#)Font2DTest.java 1.2 00/08/22
 
−
* @author Shinsuke Fukuda
 
−
* @author Ankit Patel [Conversion to Swing - 01/07/30]
 
−
*/
 
−
// / Main Font2DTest Class
 
−
public final class Font2DTest extends JPanel implements ActionListener, ItemListener,
 
−
    ChangeListener {
 
−
  // / JFrame that will contain Font2DTest
 
−
  private final JFrame parent;
 
−
  // / FontPanel class that will contain all graphical output
 
−
  private final FontPanel fp;
 
−
  // / RangeMenu class that contains info about the unicode ranges
 
−
  private final RangeMenu rm;
 
−
  // / Other menus to set parameters for text drawing
 
−
  private final ChoiceV2 fontMenu;
 
−
  private final JTextField sizeField;
 
−
  private final ChoiceV2 styleMenu;
 
−
  private final ChoiceV2 textMenu;
 
−
  private int currentTextChoice = 0;
 
−
  private final ChoiceV2 transformMenu;
 
−
  private final ChoiceV2 transformMenuG2;
 
−
  private final ChoiceV2 methodsMenu;
 
−
  private final JComboBox antiAliasMenu;
 
−
  private final JComboBox fracMetricsMenu;
 
−
  private final JSlider contrastSlider;
 
−
  // / CheckboxMenuItems
 
−
  private CheckboxMenuItemV2 displayGridCBMI;
 
−
  private CheckboxMenuItemV2 force16ColsCBMI;
 
−
  private CheckboxMenuItemV2 showFontInfoCBMI;
 
−
  // / JDialog boxes
 
−
  private JDialog userTextDialog;
 
−
  private JTextArea userTextArea;
 
−
  private JDialog printDialog;
 
−
  private JDialog fontInfoDialog;
 
−
  private LabelV2 fontInfos[] = new LabelV2[2];
 
−
  private JFileChooser filePromptDialog = null;
 
−
  private ButtonGroup printCBGroup;
 
−
  private JRadioButton printModeCBs[] = new JRadioButton[3];
 
−
  // / Status bar
 
−
  private final LabelV2 statusBar;
 
−
  private int fontStyles[] = { Font.PLAIN, Font.BOLD, Font.ITALIC, Font.BOLD | Font.ITALIC };
 
−
  // / Text filename
 
−
  private String tFileName;
 
−
  // Enabled or disabled status of canDisplay check
 
−
  private static boolean canDisplayCheck = true;
 
−
  // / Initialize GUI variables and its layouts
 
−
  public Font2DTest(JFrame f, boolean isApplet) {
 
−
    parent = f;
 
−
    rm = new RangeMenu(this, parent);
 
−
    fp = new FontPanel(this, parent);
 
−
    statusBar = new LabelV2("");
 
−
    fontMenu = new ChoiceV2(this, canDisplayCheck);
 
−
    sizeField = new JTextField("12", 3);
 
−
    sizeField.addActionListener(this);
 
−
    styleMenu = new ChoiceV2(this);
 
−
    textMenu = new ChoiceV2(); // listener added later
 
−
    transformMenu = new ChoiceV2(this);
 
−
    transformMenuG2 = new ChoiceV2(this);
 
−
    methodsMenu = new ChoiceV2(this);
 
−
    antiAliasMenu = new JComboBox(EnumSet.allOf(FontPanel.AAValues.class).toArray());
 
−
    antiAliasMenu.addActionListener(this);
 
−
    fracMetricsMenu = new JComboBox(EnumSet.allOf(FontPanel.FMValues.class).toArray());
 
−
    fracMetricsMenu.addActionListener(this);
 
−
    contrastSlider = new JSlider(JSlider.HORIZONTAL, 100, 250, FontPanel.getDefaultLCDContrast()
 
−
        .intValue());
 
−
    contrastSlider.setEnabled(false);
 
−
    contrastSlider.setMajorTickSpacing(20);
 
−
    contrastSlider.setMinorTickSpacing(10);
 
−
    contrastSlider.setPaintTicks(true);
 
−
    contrastSlider.setPaintLabels(true);
 
−
    contrastSlider.addChangeListener(this);
 
−
    setupPanel();
 
−
    setupMenu(isApplet);
 
−
    setupDialog(isApplet);
 
−
    if (canDisplayCheck) {
 
−
      fireRangeChanged();
 
−
    }
 
−
  }
 
−
  // / Set up the main interface panel
 
−
  private void setupPanel() {
 
−
    GridBagLayout gbl = new GridBagLayout();
 
−
    GridBagConstraints gbc = new GridBagConstraints();
 
−
    gbc.fill = GridBagConstraints.HORIZONTAL;
 
−
    gbc.weightx = 1;
 
−
    gbc.insets = new Insets(2, 0, 2, 2);
 
−
    this.setLayout(gbl);
 
−
    addLabeledComponentToGBL("Font: ", fontMenu, gbl, gbc, this);
 
−
    addLabeledComponentToGBL("Size: ", sizeField, gbl, gbc, this);
 
−
    gbc.gridwidth = GridBagConstraints.REMAINDER;
 
−
    addLabeledComponentToGBL("Font Transform:", transformMenu, gbl, gbc, this);
 
−
    gbc.gridwidth = 1;
 
−
    addLabeledComponentToGBL("Range: ", rm, gbl, gbc, this);
 
−
    addLabeledComponentToGBL("Style: ", styleMenu, gbl, gbc, this);
 
−
    gbc.gridwidth = GridBagConstraints.REMAINDER;
 
−
    addLabeledComponentToGBL("Graphics Transform: ", transformMenuG2, gbl, gbc, this);
 
−
    gbc.gridwidth = 1;
 
−
    gbc.anchor = GridBagConstraints.WEST;
 
−
    addLabeledComponentToGBL("Method: ", methodsMenu, gbl, gbc, this);
 
−
    addLabeledComponentToGBL("", null, gbl, gbc, this);
 
−
    gbc.anchor = GridBagConstraints.EAST;
 
−
    gbc.gridwidth = GridBagConstraints.REMAINDER;
 
−
    addLabeledComponentToGBL("Text to use:", textMenu, gbl, gbc, this);
 
−
    gbc.weightx = 1;
 
−
    gbc.gridwidth = 1;
 
−
    gbc.fill = GridBagConstraints.HORIZONTAL;
 
−
    gbc.anchor = GridBagConstraints.WEST;
 
−
    addLabeledComponentToGBL("LCD contrast: ", contrastSlider, gbl, gbc, this);
 
−
    gbc.gridwidth = 1;
 
−
    gbc.fill = GridBagConstraints.NONE;
 
−
    addLabeledComponentToGBL("Antialiasing: ", antiAliasMenu, gbl, gbc, this);
 
−
    gbc.anchor = GridBagConstraints.EAST;
 
−
    gbc.gridwidth = GridBagConstraints.REMAINDER;
 
−
    addLabeledComponentToGBL("Fractional metrics: ", fracMetricsMenu, gbl, gbc, this);
 
−
    gbc.weightx = 1;
 
−
    gbc.weighty = 1;
 
−
    gbc.anchor = GridBagConstraints.WEST;
 
−
    gbc.insets = new Insets(2, 0, 0, 2);
 
−
    gbc.fill = GridBagConstraints.BOTH;
 
−
    gbl.setConstraints(fp, gbc);
 
−
    this.add(fp);
 
−
    gbc.weighty = 0;
 
−
    gbc.insets = new Insets(0, 2, 0, 0);
 
−
    gbl.setConstraints(statusBar, gbc);
 
−
    this.add(statusBar);
 
−
  }
 
−
  // / Adds a component to a container with a label to its left in GridBagLayout
 
−
  private void addLabeledComponentToGBL(String name, JComponent c, GridBagLayout gbl,
 
−
      GridBagConstraints gbc, Container target) {
 
−
    LabelV2 l = new LabelV2(name);
 
−
    GridBagConstraints gbcLabel = (GridBagConstraints) gbc.clone();
 
−
    gbcLabel.insets = new Insets(2, 2, 2, 0);
 
−
    gbcLabel.gridwidth = 1;
 
−
    gbcLabel.weightx = 0;
 
−
    if (c == null)
 
−
      c = new JLabel("");
 
−
    gbl.setConstraints(l, gbcLabel);
 
−
    target.add(l);
 
−
    gbl.setConstraints(c, gbc);
 
−
    target.add(c);
 
−
  }
 
−
  // / Sets up menu entries
 
−
  private void setupMenu(boolean isApplet) {
 
−
    JMenu fileMenu = new JMenu("File");
 
−
    JMenu optionMenu = new JMenu("Option");
 
−
    fileMenu.add(new MenuItemV2("Save Selected Options...", this));
 
−
    fileMenu.add(new MenuItemV2("Load Options...", this));
 
−
    fileMenu.addSeparator();
 
−
    fileMenu.add(new MenuItemV2("Save as PNG...", this));
 
−
    fileMenu.add(new MenuItemV2("Load PNG File to Compare...", this));
 
−
    fileMenu.add(new MenuItemV2("Page Setup...", this));
 
−
    fileMenu.add(new MenuItemV2("Print...", this));
 
−
    fileMenu.addSeparator();
 
−
    if (!isApplet)
 
−
      fileMenu.add(new MenuItemV2("Exit", this));
 
−
    else
 
−
      fileMenu.add(new MenuItemV2("Close", this));
 
−
    displayGridCBMI = new CheckboxMenuItemV2("Display Grid", true, this);
 
−
    force16ColsCBMI = new CheckboxMenuItemV2("Force 16 Columns", false, this);
 
−
    showFontInfoCBMI = new CheckboxMenuItemV2("Display Font Info", false, this);
 
−
    optionMenu.add(displayGridCBMI);
 
−
    optionMenu.add(force16ColsCBMI);
 
−
    optionMenu.add(showFontInfoCBMI);
 
−
    JMenuBar mb = parent.getJMenuBar();
 
−
    if (mb == null)
 
−
      mb = new JMenuBar();
 
−
    mb.add(fileMenu);
 
−
    mb.add(optionMenu);
 
−
    parent.setJMenuBar(mb);
 
−
    String fontList[] = GraphicsEnvironment.getLocalGraphicsEnvironment()
 
−
        .getAvailableFontFamilyNames();
 
−
    for (int i = 0; i < fontList.length; i++)
 
−
      fontMenu.addItem(fontList[i]);
 
−
    fontMenu.setSelectedItem("Dialog");
 
−
    styleMenu.addItem("Plain");
 
−
    styleMenu.addItem("Bold");
 
−
    styleMenu.addItem("Italic");
 
−
    styleMenu.addItem("Bold Italic");
 
−
    transformMenu.addItem("None");
 
−
    transformMenu.addItem("Scale");
 
−
    transformMenu.addItem("Shear");
 
−
    transformMenu.addItem("Rotate");
 
−
    transformMenuG2.addItem("None");
 
−
    transformMenuG2.addItem("Scale");
 
−
    transformMenuG2.addItem("Shear");
 
−
    transformMenuG2.addItem("Rotate");
 
−
    methodsMenu.addItem("drawString");
 
−
    methodsMenu.addItem("drawChars");
 
−
    methodsMenu.addItem("drawBytes");
 
−
    methodsMenu.addItem("drawGlyphVector");
 
−
    methodsMenu.addItem("TextLayout.draw");
 
−
    methodsMenu.addItem("GlyphVector.getOutline + draw");
 
−
    methodsMenu.addItem("TextLayout.getOutline + draw");
 
−
    textMenu.addItem("Unicode Range");
 
−
    textMenu.addItem("All Glyphs");
 
−
    textMenu.addItem("User Text");
 
−
    textMenu.addItem("Text File");
 
−
    textMenu.addActionListener(this); // listener added later so unneeded events
 
−
                                      // not thrown
 
−
  }
 
−
  // / Sets up the all dialogs used in Font2DTest...
 
−
  private void setupDialog(boolean isApplet) {
 
−
    if (!isApplet)
 
−
      filePromptDialog = new JFileChooser();
 
−
    else
 
−
      filePromptDialog = null;
 
−
    // / Prepare user text dialog...
 
−
    userTextDialog = new JDialog(parent, "User Text", false);
 
−
    JPanel dialogTopPanel = new JPanel();
 
−
    JPanel dialogBottomPanel = new JPanel();
 
−
    LabelV2 message1 = new LabelV2("Enter text below and then press update");
 
−
    LabelV2 message2 = new LabelV2("(Unicode char can be denoted by \\uXXXX)");
 
−
    LabelV2 message3 = new LabelV2("(Supplementary chars can be denoted by \\UXXXXXX)");
 
−
    userTextArea = new JTextArea("Java2D!");
 
−
    ButtonV2 bUpdate = new ButtonV2("Update", this);
 
−
    userTextArea.setFont(new Font("dialog", Font.PLAIN, 12));
 
−
    dialogTopPanel.setLayout(new GridLayout(3, 1));
 
−
    dialogTopPanel.add(message1);
 
−
    dialogTopPanel.add(message2);
 
−
    dialogTopPanel.add(message3);
 
−
    dialogBottomPanel.add(bUpdate);
 
−
    // ABP
 
−
    JScrollPane userTextAreaSP = new JScrollPane(userTextArea);
 
−
    userTextAreaSP.setPreferredSize(new Dimension(300, 100));
 
−
    userTextDialog.getContentPane().setLayout(new BorderLayout());
 
−
    userTextDialog.getContentPane().add("North", dialogTopPanel);
 
−
    userTextDialog.getContentPane().add("Center", userTextAreaSP);
 
−
    userTextDialog.getContentPane().add("South", dialogBottomPanel);
 
−
    userTextDialog.pack();
 
−
    userTextDialog.addWindowListener(new WindowAdapter() {
 
−
      public void windowClosing(WindowEvent e) {
 
−
        userTextDialog.hide();
 
−
      }
 
−
    });
 
−
    // / Prepare printing dialog...
 
−
    printCBGroup = new ButtonGroup();
 
−
    printModeCBs[fp.ONE_PAGE] = new JRadioButton(
 
−
        "Print one page from currently displayed character/line", true);
 
−
    printModeCBs[fp.CUR_RANGE] = new JRadioButton(
 
−
        "Print all characters in currently selected range", false);
 
−
    printModeCBs[fp.ALL_TEXT] = new JRadioButton("Print all lines of text", false);
 
−
    LabelV2 l = new LabelV2(
 
−
        "Note: Page range in native \"Print\" dialog will not affect the result");
 
−
    JPanel buttonPanel = new JPanel();
 
−
    printModeCBs[fp.ALL_TEXT].setEnabled(false);
 
−
    buttonPanel.add(new ButtonV2("Print", this));
 
−
    buttonPanel.add(new ButtonV2("Cancel", this));
 
−
    printDialog = new JDialog(parent, "Print...", true);
 
−
    printDialog.setResizable(false);
 
−
    printDialog.addWindowListener(new WindowAdapter() {
 
−
      public void windowClosing(WindowEvent e) {
 
−
        printDialog.hide();
 
−
      }
 
−
    });
 
−
    printDialog.getContentPane().setLayout(new GridLayout(printModeCBs.length + 2, 1));
 
−
    printDialog.getContentPane().add(l);
 
−
    for (int i = 0; i < printModeCBs.length; i++) {
 
−
      printCBGroup.add(printModeCBs[i]);
 
−
      printDialog.getContentPane().add(printModeCBs[i]);
 
−
    }
 
−
    printDialog.getContentPane().add(buttonPanel);
 
−
    printDialog.pack();
 
−
    // / Prepare font information dialog...
 
−
    fontInfoDialog = new JDialog(parent, "Font info", false);
 
−
    fontInfoDialog.setResizable(false);
 
−
    fontInfoDialog.addWindowListener(new WindowAdapter() {
 
−
      public void windowClosing(WindowEvent e) {
 
−
        fontInfoDialog.hide();
 
−
        showFontInfoCBMI.setState(false);
 
−
      }
 
−
    });
 
−
    JPanel fontInfoPanel = new JPanel();
 
−
    fontInfoPanel.setLayout(new GridLayout(fontInfos.length, 1));
 
−
    for (int i = 0; i < fontInfos.length; i++) {
 
−
      fontInfos[i] = new LabelV2("");
 
−
      fontInfoPanel.add(fontInfos[i]);
 
−
    }
 
−
    fontInfoDialog.getContentPane().add(fontInfoPanel);
 
−
    // / Move the location of the dialog...
 
−
    userTextDialog.setLocation(200, 300);
 
−
    fontInfoDialog.setLocation(0, 400);
 
−
  }
 
−
  // / RangeMenu object signals using this function
 
−
  // / when Unicode range has been changed and text needs to be redrawn
 
−
  public void fireRangeChanged() {
 
−
    int range[] = rm.getSelectedRange();
 
−
    fp.setTextToDraw(fp.RANGE_TEXT, range, null, null);
 
−
    if (canDisplayCheck) {
 
−
      setupFontList(range[0], range[1]);
 
−
    }
 
−
    if (showFontInfoCBMI.getState())
 
−
      fireUpdateFontInfo();
 
−
  }
 
−
  // / Changes the message on the status bar
 
−
  public void fireChangeStatus(String message, boolean error) {
 
−
    // / If this is not ran as an applet, use own status bar,
 
−
    // / Otherwise, use the appletviewer/browser"s status bar
 
−
    statusBar.setText(message);
 
−
    if (error)
 
−
      fp.showingError = true;
 
−
    else
 
−
      fp.showingError = false;
 
−
  }
 
−
  // / Updates the information about the selected font
 
−
  public void fireUpdateFontInfo() {
 
−
    if (showFontInfoCBMI.getState()) {
 
−
      String infos[] = fp.getFontInfo();
 
−
      for (int i = 0; i < fontInfos.length; i++)
 
−
        fontInfos[i].setText(infos[i]);
 
−
      fontInfoDialog.pack();
 
−
    }
 
−
  }
 
−
  private void setupFontList(int rangeStart, int rangeEnd) {
 
−
    int listCount = fontMenu.getItemCount();
 
−
    int size = 16;
 
−
    try {
 
−
      size = Float.valueOf(sizeField.getText()).intValue();
 
−
    } catch (Exception e) {
 
−
      System.out.println("Invalid font size in the size textField. Using default value of 16");
 
−
    }
 
−
    int style = fontStyles[styleMenu.getSelectedIndex()];
 
−
    Font f;
 
−
    for (int i = 0; i < listCount; i++) {
 
−
      String fontName = (String) fontMenu.getItemAt(i);
 
−
      f = new Font(fontName, style, size);
 
−
      if ((rm.getSelectedIndex() != RangeMenu.SURROGATES_AREA_INDEX)
 
−
          && canDisplayRange(f, rangeStart, rangeEnd)) {
 
−
        fontMenu.setBit(i, true);
 
−
      } else {
 
−
        fontMenu.setBit(i, false);
 
−
      }
 
−
    }
 
−
    fontMenu.repaint();
 
−
  }
 
−
  protected boolean canDisplayRange(Font font, int rangeStart, int rangeEnd) {
 
−
    for (int i = rangeStart; i < rangeEnd; i++) {
 
−
      if (font.canDisplay(i)) {
 
−
        return true;
 
−
      }
 
−
    }
 
−
    return false;
 
−
  }
 
−
  // / Displays a file load/save dialog and returns the specified file
 
−
  private String promptFile(boolean isSave, String initFileName) {
 
−
    int retVal;
 
−
    String str;
 
−
    // / ABP
 
−
    if (filePromptDialog == null)
 
−
      return null;
 
−
    if (isSave) {
 
−
      filePromptDialog.setDialogType(JFileChooser.SAVE_DIALOG);
 
−
      filePromptDialog.setDialogTitle("Save...");
 
−
      str = "Save";
 
−
    } else {
 
−
      filePromptDialog.setDialogType(JFileChooser.OPEN_DIALOG);
 
−
      filePromptDialog.setDialogTitle("Load...");
 
−
      str = "Load";
 
−
    }
 
−
    if (initFileName != null)
 
−
      filePromptDialog.setSelectedFile(new File(initFileName));
 
−
    retVal = filePromptDialog.showDialog(this, str);
 
−
    if (retVal == JFileChooser.APPROVE_OPTION) {
 
−
      File file = filePromptDialog.getSelectedFile();
 
−
      String fileName = file.getAbsolutePath();
 
−
      if (fileName != null) {
 
−
        return fileName;
 
−
      }
 
−
    }
 
−
    return null;
 
−
  }
 
−
  // / Converts user text into arrays of String, delimited at newline character
 
−
  // / Also replaces any valid escape sequence with appropriate unicode
 
−
  // character
 
−
  // / Support \\UXXXXXX notation for surrogates
 
−
  private String[] parseUserText(String orig) {
 
−
    int length = orig.length();
 
−
    StringTokenizer perLine = new StringTokenizer(orig, "\n");
 
−
    String textLines[] = new String[perLine.countTokens()];
 
−
    int lineNumber = 0;
 
−
    while (perLine.hasMoreElements()) {
 
−
      StringBuffer converted = new StringBuffer();
 
−
      String oneLine = perLine.nextToken();
 
−
      int lineLength = oneLine.length();
 
−
      int prevEscapeEnd = 0;
 
−
      int nextEscape = -1;
 
−
      do {
 
−
        int nextBMPEscape = oneLine.indexOf("\\u", prevEscapeEnd);
 
−
        int nextSupEscape = oneLine.indexOf("\\U", prevEscapeEnd);
 
−
        nextEscape = (nextBMPEscape < 0) ? ((nextSupEscape < 0) ? -1 : nextSupEscape)
 
−
            : ((nextSupEscape < 0) ? nextBMPEscape : Math.min(nextBMPEscape, nextSupEscape));
 
−
        if (nextEscape != -1) {
 
−
          if (prevEscapeEnd < nextEscape)
 
−
            converted.append(oneLine.substring(prevEscapeEnd, nextEscape));
 
−
          prevEscapeEnd = nextEscape + (nextEscape == nextBMPEscape ? 6 : 8);
 
−
          try {
 
−
            String hex = oneLine.substring(nextEscape + 2, prevEscapeEnd);
 
−
            if (nextEscape == nextBMPEscape) {
 
−
              converted.append((char) Integer.parseInt(hex, 16));
 
−
            } else {
 
−
              converted.append(new String(Character.toChars(Integer.parseInt(hex, 16))));
 
−
            }
 
−
          } catch (Exception e) {
 
−
            int copyLimit = Math.min(lineLength, prevEscapeEnd);
 
−
            converted.append(oneLine.substring(nextEscape, copyLimit));
 
−
          }
 
−
        }
 
−
      } while (nextEscape != -1);
 
−
      if (prevEscapeEnd < lineLength)
 
−
        converted.append(oneLine.substring(prevEscapeEnd, lineLength));
 
−
      textLines[lineNumber++] = converted.toString();
 
−
    }
 
−
    return textLines;
 
−
  }
 
−
  // / Reads the text from specified file, detecting UTF-16 encoding
 
−
  // / Then breaks the text into String array, delimited at every line break
 
−
  private void readTextFile(String fileName) {
 
−
    try {
 
−
      String fileText, textLines[];
 
−
      BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fileName));
 
−
      int numBytes = bis.available();
 
−
      if (numBytes == 0) {
 
−
        throw new Exception("Text file " + fileName + " is empty");
 
−
      }
 
−
      byte byteData[] = new byte[numBytes];
 
−
      bis.read(byteData, 0, numBytes);
 
−
      bis.close();
 
−
      // / If byte mark is found, then use UTF-16 encoding to convert bytes...
 
−
      if (numBytes >= 2
 
−
          && ((byteData[0] == (byte) 0xFF && byteData[1] == (byte) 0xFE) || (byteData[0] == (byte) 0xFE && byteData[1] == (byte) 0xFF)))
 
−
        fileText = new String(byteData, "UTF-16");
 
−
      // / Otherwise, use system default encoding
 
−
      else
 
−
        fileText = new String(byteData);
 
−
      int length = fileText.length();
 
−
      StringTokenizer perLine = new StringTokenizer(fileText, "\n");
 
−
      // / Determine "Return Char" used in this file
 
−
      // / This simply finds first occurrence of CR, CR+LF or LF...
 
−
      for (int i = 0; i < length; i++) {
 
−
        char iTh = fileText.charAt(i);
 
−
        if (iTh == "\r") {
 
−
          if (i < length - 1 && fileText.charAt(i + 1) == "\n")
 
−
            perLine = new StringTokenizer(fileText, "\r\n");
 
−
          else
 
−
            perLine = new StringTokenizer(fileText, "\r");
 
−
          break;
 
−
        } else if (iTh == "\n")
 
−
          // / Use the one already created
 
−
          break;
 
−
      }
 
−
      int lineNumber = 0, numLines = perLine.countTokens();
 
−
      textLines = new String[numLines];
 
−
      while (perLine.hasMoreElements()) {
 
−
        String oneLine = perLine.nextToken();
 
−
        if (oneLine == null)
 
−
          // / To make LineBreakMeasurer to return a valid TextLayout
 
−
          // / on an empty line, simply feed it a space char...
 
−
          oneLine = " ";
 
−
        textLines[lineNumber++] = oneLine;
 
−
      }
 
−
      fp.setTextToDraw(fp.FILE_TEXT, null, null, textLines);
 
−
      rm.setEnabled(false);
 
−
      methodsMenu.setEnabled(false);
 
−
    } catch (Exception ex) {
 
−
      fireChangeStatus("ERROR: Failed to Read Text File; See Stack Trace", true);
 
−
      ex.printStackTrace();
 
−
    }
 
−
  }
 
−
  // / Returns a String storing current configuration
 
−
  private void writeCurrentOptions(String fileName) {
 
−
    try {
 
−
      String curOptions = fp.getCurrentOptions();
 
−
      BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fileName));
 
−
      // / Prepend title and the option that is only obtainable here
 
−
      int range[] = rm.getSelectedRange();
 
−
      String completeOptions = ("Font2DTest Option File\n" + displayGridCBMI.getState() + "\n"
 
−
          + force16ColsCBMI.getState() + "\n" + showFontInfoCBMI.getState() + "\n"
 
−
          + rm.getSelectedItem() + "\n" + range[0] + "\n" + range[1] + "\n" + curOptions + tFileName);
 
−
      byte toBeWritten[] = completeOptions.getBytes("UTF-16");
 
−
      bos.write(toBeWritten, 0, toBeWritten.length);
 
−
      bos.close();
 
−
    } catch (Exception ex) {
 
−
      fireChangeStatus("ERROR: Failed to Save Options File; See Stack Trace", true);
 
−
      ex.printStackTrace();
 
−
    }
 
−
  }
 
−
  // / Updates GUI visibility/status after some parameters have changed
 
−
  private void updateGUI() {
 
−
    int selectedText = textMenu.getSelectedIndex();
 
−
    // / Set the visibility of User Text dialog
 
−
    if (selectedText == fp.USER_TEXT)
 
−
      userTextDialog.show();
 
−
    else
 
−
      userTextDialog.hide();
 
−
    // / Change the visibility/status/availability of Print JDialog buttons
 
−
    printModeCBs[fp.ONE_PAGE].setSelected(true);
 
−
    if (selectedText == fp.FILE_TEXT || selectedText == fp.USER_TEXT) {
 
−
      // / ABP
 
−
      // / update methodsMenu to show that TextLayout.draw is being used
 
−
      // / when we are in FILE_TEXT mode
 
−
      if (selectedText == fp.FILE_TEXT)
 
−
        methodsMenu.setSelectedItem("TextLayout.draw");
 
−
      methodsMenu.setEnabled(selectedText == fp.USER_TEXT);
 
−
      printModeCBs[fp.CUR_RANGE].setEnabled(false);
 
−
      printModeCBs[fp.ALL_TEXT].setEnabled(true);
 
−
    } else {
 
−
      // / ABP
 
−
      // / update methodsMenu to show that drawGlyph is being used
 
−
      // / when we are in ALL_GLYPHS mode
 
−
      if (selectedText == fp.ALL_GLYPHS)
 
−
        methodsMenu.setSelectedItem("drawGlyphVector");
 
−
      methodsMenu.setEnabled(selectedText == fp.RANGE_TEXT);
 
−
      printModeCBs[fp.CUR_RANGE].setEnabled(true);
 
−
      printModeCBs[fp.ALL_TEXT].setEnabled(false);
 
−
    }
 
−
    // / Modify RangeMenu and fontInfo label availabilty
 
−
    if (selectedText == fp.RANGE_TEXT) {
 
−
      fontInfos[1].setVisible(true);
 
−
      rm.setEnabled(true);
 
−
    } else {
 
−
      fontInfos[1].setVisible(false);
 
−
      rm.setEnabled(false);
 
−
    }
 
−
  }
 
−
  // / Loads saved options and applies them
 
−
  private void loadOptions(String fileName) {
 
−
    try {
 
−
      BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fileName));
 
−
      int numBytes = bis.available();
 
−
      byte byteData[] = new byte[numBytes];
 
−
      bis.read(byteData, 0, numBytes);
 
−
      bis.close();
 
−
      if (numBytes < 2 || (byteData[0] != (byte) 0xFE || byteData[1] != (byte) 0xFF))
 
−
        throw new Exception("Not a Font2DTest options file");
 
−
      String options = new String(byteData, "UTF-16");
 
−
      StringTokenizer perLine = new StringTokenizer(options, "\n");
 
−
      String title = perLine.nextToken();
 
−
      if (!title.equals("Font2DTest Option File"))
 
−
        throw new Exception("Not a Font2DTest options file");
 
−
      // / Parse all options
 
−
      boolean displayGridOpt = Boolean.parseBoolean(perLine.nextToken());
 
−
      boolean force16ColsOpt = Boolean.parseBoolean(perLine.nextToken());
 
−
      boolean showFontInfoOpt = Boolean.parseBoolean(perLine.nextToken());
 
−
      String rangeNameOpt = perLine.nextToken();
 
−
      int rangeStartOpt = Integer.parseInt(perLine.nextToken());
 
−
      int rangeEndOpt = Integer.parseInt(perLine.nextToken());
 
−
      String fontNameOpt = perLine.nextToken();
 
−
      float fontSizeOpt = Float.parseFloat(perLine.nextToken());
 
−
      int fontStyleOpt = Integer.parseInt(perLine.nextToken());
 
−
      int fontTransformOpt = Integer.parseInt(perLine.nextToken());
 
−
      int g2TransformOpt = Integer.parseInt(perLine.nextToken());
 
−
      int textToUseOpt = Integer.parseInt(perLine.nextToken());
 
−
      int drawMethodOpt = Integer.parseInt(perLine.nextToken());
 
−
      int antialiasOpt = Integer.parseInt(perLine.nextToken());
 
−
      int fractionalOpt = Integer.parseInt(perLine.nextToken());
 
−
      int lcdContrast = Integer.parseInt(perLine.nextToken());
 
−
      String userTextOpt[] = { "Java2D!" }, dialogEntry = "Java2D!";
 
−
      if (textToUseOpt == fp.USER_TEXT) {
 
−
        int numLines = perLine.countTokens(), lineNumber = 0;
 
−
        if (numLines != 0) {
 
−
          userTextOpt = new String[numLines];
 
−
          dialogEntry = "";
 
−
          for (; perLine.hasMoreElements(); lineNumber++) {
 
−
            userTextOpt[lineNumber] = perLine.nextToken();
 
−
            dialogEntry += userTextOpt[lineNumber] + "\n";
 
−
          }
 
−
        }
 
−
      }
 
−
      // / Reset GUIs
 
−
      displayGridCBMI.setState(displayGridOpt);
 
−
      force16ColsCBMI.setState(force16ColsOpt);
 
−
      showFontInfoCBMI.setState(showFontInfoOpt);
 
−
      rm.setSelectedRange(rangeNameOpt, rangeStartOpt, rangeEndOpt);
 
−
      fontMenu.setSelectedItem(fontNameOpt);
 
−
      sizeField.setText(String.valueOf(fontSizeOpt));
 
−
      styleMenu.setSelectedIndex(fontStyleOpt);
 
−
      transformMenu.setSelectedIndex(fontTransformOpt);
 
−
      transformMenuG2.setSelectedIndex(g2TransformOpt);
 
−
      textMenu.setSelectedIndex(textToUseOpt);
 
−
      methodsMenu.setSelectedIndex(drawMethodOpt);
 
−
      antiAliasMenu.setSelectedIndex(antialiasOpt);
 
−
      fracMetricsMenu.setSelectedIndex(fractionalOpt);
 
−
      contrastSlider.setValue(lcdContrast);
 
−
      userTextArea.setText(dialogEntry);
 
−
      updateGUI();
 
−
      if (textToUseOpt == fp.FILE_TEXT) {
 
−
        tFileName = perLine.nextToken();
 
−
        readTextFile(tFileName);
 
−
      }
 
−
      // / Reset option variables and repaint
 
−
      fp.loadOptions(displayGridOpt, force16ColsOpt, rangeStartOpt, rangeEndOpt, fontNameOpt,
 
−
          fontSizeOpt, fontStyleOpt, fontTransformOpt, g2TransformOpt, textToUseOpt, drawMethodOpt,
 
−
          antialiasOpt, fractionalOpt, lcdContrast, userTextOpt);
 
−
      if (showFontInfoOpt) {
 
−
        fireUpdateFontInfo();
 
−
        fontInfoDialog.show();
 
−
      } else
 
−
        fontInfoDialog.hide();
 
−
    } catch (Exception ex) {
 
−
      fireChangeStatus("ERROR: Failed to Load Options File; See Stack Trace", true);
 
−
      ex.printStackTrace();
 
−
    }
 
−
  }
 
−
  // / Loads a previously saved image
 
−
  private void loadComparisonPNG(String fileName) {
 
−
    try {
 
−
      BufferedImage image = javax.imageio.ImageIO.read(new File(fileName));
 
−
      JFrame f = new JFrame("Comparison PNG");
 
−
      ImagePanel ip = new ImagePanel(image);
 
−
      f.setResizable(false);
 
−
      f.getContentPane().add(ip);
 
−
      f.addWindowListener(new WindowAdapter() {
 
−
        public void windowClosing(WindowEvent e) {
 
−
          ((JFrame) e.getSource()).dispose();
 
−
        }
 
−
      });
 
−
      f.pack();
 
−
      f.show();
 
−
    } catch (Exception ex) {
 
−
      fireChangeStatus("ERROR: Failed to Load PNG File; See Stack Trace", true);
 
−
      ex.printStackTrace();
 
−
    }
 
−
  }
 
−
  // / Interface functions...
 
−
  // / ActionListener interface function
 
−
  // / Responds to JMenuItem, JTextField and JButton actions
 
−
  public void actionPerformed(ActionEvent e) {
 
−
    Object source = e.getSource();
 
−
    if (source instanceof JMenuItem) {
 
−
      JMenuItem mi = (JMenuItem) source;
 
−
      String itemName = mi.getText();
 
−
      if (itemName.equals("Save Selected Options...")) {
 
−
        String fileName = promptFile(true, "options.txt");
 
−
        if (fileName != null)
 
−
          writeCurrentOptions(fileName);
 
−
      } else if (itemName.equals("Load Options...")) {
 
−
        String fileName = promptFile(false, "options.txt");
 
−
        if (fileName != null)
 
−
          loadOptions(fileName);
 
−
      } else if (itemName.equals("Save as PNG...")) {
 
−
        String fileName = promptFile(true, fontMenu.getSelectedItem() + ".png");
 
−
        if (fileName != null)
 
−
          fp.doSavePNG(fileName);
 
−
      } else if (itemName.equals("Load PNG File to Compare...")) {
 
−
        String fileName = promptFile(false, null);
 
−
        if (fileName != null)
 
−
          loadComparisonPNG(fileName);
 
−
      } else if (itemName.equals("Page Setup..."))
 
−
        fp.doPageSetup();
 
−
      else if (itemName.equals("Print..."))
 
−
        printDialog.show();
 
−
      else if (itemName.equals("Close"))
 
−
        parent.dispose();
 
−
      else if (itemName.equals("Exit"))
 
−
        System.exit(0);
 
−
    }
 
−
    else if (source instanceof JTextField) {
 
−
      JTextField tf = (JTextField) source;
 
−
      float sz = 12f;
 
−
      try {
 
−
        sz = Float.parseFloat(sizeField.getText());
 
−
        if (sz < 1f || sz > 120f) {
 
−
          sz = 12f;
 
−
          sizeField.setText("12");
 
−
        }
 
−
      } catch (Exception se) {
 
−
        sizeField.setText("12");
 
−
      }
 
−
      if (tf == sizeField)
 
−
        fp.setFontParams(fontMenu.getSelectedItem(), sz, styleMenu.getSelectedIndex(),
 
−
            transformMenu.getSelectedIndex());
 
−
    }
 
−
    else if (source instanceof JButton) {
 
−
      String itemName = ((JButton) source).getText();
 
−
      // / Print dialog buttons...
 
−
      if (itemName.equals("Print")) {
 
−
        for (int i = 0; i < printModeCBs.length; i++)
 
−
          if (printModeCBs[i].isSelected()) {
 
−
            printDialog.hide();
 
−
            fp.doPrint(i);
 
−
          }
 
−
      } else if (itemName.equals("Cancel"))
 
−
        printDialog.hide();
 
−
      // / Update button from Usert Text JDialog...
 
−
      else if (itemName.equals("Update"))
 
−
        fp.setTextToDraw(fp.USER_TEXT, null, parseUserText(userTextArea.getText()), null);
 
−
    } else if (source instanceof JComboBox) {
 
−
      JComboBox c = (JComboBox) source;
 
−
      // / RangeMenu handles actions by itself and then calls fireRangeChanged,
 
−
      // / so it is not listed or handled here
 
−
      if (c == fontMenu || c == styleMenu || c == transformMenu) {
 
−
        float sz = 12f;
 
−
        try {
 
−
          sz = Float.parseFloat(sizeField.getText());
 
−
          if (sz < 1f || sz > 120f) {
 
−
            sz = 12f;
 
−
            sizeField.setText("12");
 
−
          }
 
−
        } catch (Exception se) {
 
−
          sizeField.setText("12");
 
−
        }
 
−
        fp.setFontParams(fontMenu.getSelectedItem(), sz, styleMenu.getSelectedIndex(),
 
−
            transformMenu.getSelectedIndex());
 
−
      } else if (c == methodsMenu)
 
−
        fp.setDrawMethod(methodsMenu.getSelectedIndex());
 
−
      else if (c == textMenu) {
 
−
        if (canDisplayCheck) {
 
−
          fireRangeChanged();
 
−
        }
 
−
        int selected = textMenu.getSelectedIndex();
 
−
        if (selected == fp.RANGE_TEXT)
 
−
          fp.setTextToDraw(fp.RANGE_TEXT, rm.getSelectedRange(), null, null);
 
−
        else if (selected == fp.USER_TEXT)
 
−
          fp.setTextToDraw(fp.USER_TEXT, null, parseUserText(userTextArea.getText()), null);
 
−
        else if (selected == fp.FILE_TEXT) {
 
−
          String fileName = promptFile(false, null);
 
−
          if (fileName != null) {
 
−
            tFileName = fileName;
 
−
            readTextFile(fileName);
 
−
          } else {
 
−
            // / User cancelled selection; reset to previous choice
 
−
            c.setSelectedIndex(currentTextChoice);
 
−
            return;
 
−
          }
 
−
        } else if (selected == fp.ALL_GLYPHS)
 
−
          fp.setTextToDraw(fp.ALL_GLYPHS, null, null, null);
 
−
        updateGUI();
 
−
        currentTextChoice = selected;
 
−
      } else if (c == transformMenuG2) {
 
−
        fp.setTransformG2(transformMenuG2.getSelectedIndex());
 
−
      } else if (c == antiAliasMenu || c == fracMetricsMenu) {
 
−
        if (c == antiAliasMenu) {
 
−
          boolean enabled = FontPanel.AAValues.isLCDMode(antiAliasMenu.getSelectedItem());
 
−
          contrastSlider.setEnabled(enabled);
 
−
        }
 
−
        fp.setRenderingHints(antiAliasMenu.getSelectedItem(), fracMetricsMenu.getSelectedItem(),
 
−
            contrastSlider.getValue());
 
−
      }
 
−
    }
 
−
  }
 
−
  public void stateChanged(ChangeEvent e) {
 
−
    Object source = e.getSource();
 
−
    if (source instanceof JSlider) {
 
−
      fp.setRenderingHints(antiAliasMenu.getSelectedItem(), fracMetricsMenu.getSelectedItem(),
 
−
          contrastSlider.getValue());
 
−
    }
 
−
  }
 
−
  // / ItemListener interface function
 
−
  // / Responds to JCheckBoxMenuItem, JComboBox and JCheckBox actions
 
−
  public void itemStateChanged(ItemEvent e) {
 
−
    Object source = e.getSource();
 
−
    if (source instanceof JCheckBoxMenuItem) {
 
−
      JCheckBoxMenuItem cbmi = (JCheckBoxMenuItem) source;
 
−
      if (cbmi == displayGridCBMI)
 
−
        fp.setGridDisplay(displayGridCBMI.getState());
 
−
      else if (cbmi == force16ColsCBMI)
 
−
        fp.setForce16Columns(force16ColsCBMI.getState());
 
−
      else if (cbmi == showFontInfoCBMI) {
 
−
        if (showFontInfoCBMI.getState()) {
 
−
          fireUpdateFontInfo();
 
−
          fontInfoDialog.show();
 
−
        } else
 
−
          fontInfoDialog.hide();
 
−
      }
 
−
    }
 
−
  }
 
−
  private static void printUsage() {
 
−
    String usage = "Usage: java -jar Font2DTest.jar [options]\n" + "\nwhere options include:\n"
 
−
        + "    -dcdc | -disablecandisplaycheck disable canDisplay check for font\n"
 
−
        + "    -?    | -help                  print this help message\n" + "\nExample :\n"
 
−
        + "    To disable canDisplay check on font for ranges\n"
 
−
        + "    java -jar Font2DTest.jar -dcdc";
 
−
    System.out.println(usage);
 
−
    System.exit(0);
 
−
  }
 
−
  // / Main function
 
−
  public static void main(String argv[]) {
 
−
    if (argv.length > 0) {
 
−
      if (argv[0].equalsIgnoreCase("-disablecandisplaycheck") || argv[0].equalsIgnoreCase("-dcdc")) {
 
−
        canDisplayCheck = false;
 
−
      } else {
 
−
        printUsage();
 
−
      }
 
−
    }
 
−
    UIManager.put("swing.boldMetal", Boolean.FALSE);
 
−
    final JFrame f = new JFrame("Font2DTest");
 
−
    final Font2DTest f2dt = new Font2DTest(f, false);
 
−
    f.addWindowListener(new WindowAdapter() {
 
−
      public void windowOpening(WindowEvent e) {
 
−
        f2dt.repaint();
 
−
      }
 
−
      public void windowClosing(WindowEvent e) {
 
−
        System.exit(0);
 
−
      }
 
−
    });
 
−
    f.getContentPane().add(f2dt);
 
−
    f.pack();
 
−
    f.show();
 
−
  }
 
−
  // / Inner class definitions...
 
−
  // / Class to display just an image file
 
−
  // / Used to show the comparison PNG image
 
−
  private final class ImagePanel extends JPanel {
 
−
    private final BufferedImage bi;
 
−
    public ImagePanel(BufferedImage image) {
 
−
      bi = image;
 
−
    }
 
−
    public Dimension getPreferredSize() {
 
−
      return new Dimension(bi.getWidth(), bi.getHeight());
 
−
    }
 
−
    public void paintComponent(Graphics g) {
 
−
      g.drawImage(bi, 0, 0, this);
 
−
    }
 
−
  }
 
−
  // / Classes made to avoid repetitive calls... (being lazy)
 
−
  private final class ButtonV2 extends JButton {
 
−
    public ButtonV2(String name, ActionListener al) {
 
−
      super(name);
 
−
      this.addActionListener(al);
 
−
    }
 
−
  }
 
−
  private final class ChoiceV2 extends JComboBox {
 
−
    private BitSet bitSet = null;
 
−
    public ChoiceV2() {
 
−
      ;
 
−
    }
 
−
    public ChoiceV2(ActionListener al) {
 
−
      super();
 
−
      this.addActionListener(al);
 
−
    }
 
−
    public ChoiceV2(ActionListener al, boolean fontChoice) {
 
−
      this(al);
 
−
      if (fontChoice) {
 
−
        // Register this component in ToolTipManager
 
−
        setToolTipText("");
 
−
        bitSet = new BitSet();
 
−
        setRenderer(new ChoiceV2Renderer(this));
 
−
      }
 
−
    }
 
−
    public String getToolTipText() {
 
−
      int index = this.getSelectedIndex();
 
−
      String fontName = (String) this.getSelectedItem();
 
−
      if (fontName != null && (textMenu.getSelectedIndex() == fp.RANGE_TEXT)) {
 
−
        if (getBit(index)) {
 
−
          return "Font \"" + fontName + "\" can display some characters in \""
 
−
              + rm.getSelectedItem() + "\" range";
 
−
        } else {
 
−
          return "Font \"" + fontName + "\" cannot display any characters in \""
 
−
              + rm.getSelectedItem() + "\" range";
 
−
        }
 
−
      }
 
−
      return super.getToolTipText();
 
−
    }
 
−
    public void setBit(int bitIndex, boolean value) {
 
−
      bitSet.set(bitIndex, value);
 
−
    }
 
−
    public boolean getBit(int bitIndex) {
 
−
      return bitSet.get(bitIndex);
 
−
    }
 
−
  }
 
−
  private final class ChoiceV2Renderer extends DefaultListCellRenderer {
 
−
    private ImageIcon yesImage, blankImage;
 
−
    private ChoiceV2 choice = null;
 
−
    public ChoiceV2Renderer(ChoiceV2 choice) {
 
−
      try {
 
−
        yesImage = new ImageIcon(getClass().getResource("yes.gif"));
 
−
        blankImage = new ImageIcon(getClass().getResource("blank.gif"));
 
−
      } catch (Exception exception) {
 
−
        System.out.println("Exception : " + exception);
 
−
      }
 
−
      this.choice = choice;
 
−
    }
 
−
    public Component getListCellRendererComponent(JList list, Object value, int index,
 
−
        boolean isSelected, boolean cellHasFocus) {
 
−
      if (textMenu.getSelectedIndex() == fp.RANGE_TEXT) {
 
−
        super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
 
−
        // For JComboBox if index is -1, its rendering the selected index.
 
−
        if (index == -1) {
 
−
          index = choice.getSelectedIndex();
 
−
        }
 
−
        if (choice.getBit(index)) {
 
−
          setIcon(yesImage);
 
−
        } else {
 
−
          setIcon(blankImage);
 
−
        }
 
−
      } else {
 
−
        super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
 
−
        setIcon(blankImage);
 
−
      }
 
−
      return this;
 
−
    }
 
−
  }
 
−
  private final class LabelV2 extends JLabel {
 
−
    public LabelV2(String name) {
 
−
      super(name);
 
−
    }
 
−
  }
 
−
  private final class MenuItemV2 extends JMenuItem {
 
−
    public MenuItemV2(String name, ActionListener al) {
 
−
      super(name);
 
−
      this.addActionListener(al);
 
−
    }
 
−
  }
 
−
  private final class CheckboxMenuItemV2 extends JCheckBoxMenuItem {
 
−
    public CheckboxMenuItemV2(String name, boolean b, ItemListener il) {
 
−
      super(name, b);
 
−
      this.addItemListener(il);
 
−
    }
 
−
  }
 
−
}
 
−
/*
 
−
* @(#)FontPanel.java 1.20 05/11/17
 
−
*
 
−
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
 
−
*
 
−
* Redistribution and use in source and binary forms, with or without
 
−
* modification, are permitted provided that the following conditions are met:
 
−
*
 
−
* -Redistribution of source code must retain the above copyright notice, this
 
−
* list of conditions and the following disclaimer.
 
−
*
 
−
* -Redistribution in binary form must reproduce the above copyright notice,
 
−
* this list of conditions and the following disclaimer in the documentation
 
−
* and/or other materials provided with the distribution.
 
−
*
 
−
* Neither the name of Sun Microsystems, Inc. or the names of contributors may
 
−
* be used to endorse or promote products derived from this software without
 
−
* specific prior written permission.
 
−
*
 
−
* This software is provided "AS IS," without a warranty of any kind. ALL
 
−
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
 
−
* IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
 
−
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS
 
−
* LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A
 
−
* RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
 
−
* IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT
 
−
* OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
 
−
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
 
−
* ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS
 
−
* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 
−
*
 
−
* You acknowledge that this software is not designed, licensed or intended for
 
−
* use in the design, construction, operation or maintenance of any nuclear
 
−
* facility.
 
−
*/
 
−
/*
 
−
* @(#)FontPanel.java 1.20 05/11/17
 
−
*/
 
−
/**
 
−
* FontPanel.java
 
−
*
 
−
* @version
 
−
* @(#)FontPanel.java 1.1 00/08/22
 
−
* @author Shinsuke Fukuda
 
−
* @author Ankit Patel [Conversion to Swing - 01/07/30]
 
−
*/
 
−
// / This panel is combination of the text drawing area of Font2DTest
 
−
// / and the custom controlled scroll bar
 
−
final class FontPanel extends JPanel implements AdjustmentListener {
 
−
  // / Drawing Option Constants
 
−
  private final String STYLES[] = { "plain", "bold", "italic", "bold italic" };
 
−
  private final int NONE = 0;
 
−
  private final int SCALE = 1;
 
−
  private final int SHEAR = 2;
 
−
  private final int ROTATE = 3;
 
−
  private final String TRANSFORMS[] = { "with no transforms", "with scaling", "with Shearing",
 
−
      "with rotation" };
 
−
  private final int DRAW_STRING = 0;
 
−
  private final int DRAW_CHARS = 1;
 
−
  private final int DRAW_BYTES = 2;
 
−
  private final int DRAW_GLYPHV = 3;
 
−
  private final int TL_DRAW = 4;
 
−
  private final int GV_OUTLINE = 5;
 
−
  private final int TL_OUTLINE = 6;
 
−
  private final String METHODS[] = { "drawString", "drawChars", "drawBytes", "drawGlyphVector",
 
−
      "TextLayout.draw", "GlyphVector.getOutline", "TextLayout.getOutline" };
 
−
  public final int RANGE_TEXT = 0;
 
−
  public final int ALL_GLYPHS = 1;
 
−
  public final int USER_TEXT = 2;
 
−
  public final int FILE_TEXT = 3;
 
−
  private final String MS_OPENING[] = { " Unicode ", " Glyph Code ", " lines ", " lines " };
 
−
  private final String MS_CLOSING[] = { "", "", " of User Text ",
 
−
      " of LineBreakMeasurer-reformatted Text " };
 
−
  // / General Graphics Variable
 
−
  private final JScrollBar verticalBar;
 
−
  private final FontCanvas fc;
 
−
  private boolean updateBackBuffer = true;
 
−
  private boolean updateFontMetrics = true;
 
−
  private boolean updateFont = true;
 
−
  private boolean force16Cols = false;
 
−
  public boolean showingError = false;
 
−
  private int g2Transform = NONE; // / ABP
 
−
  // / Printing constants and variables
 
−
  public final int ONE_PAGE = 0;
 
−
  public final int CUR_RANGE = 1;
 
−
  public final int ALL_TEXT = 2;
 
−
  private int printMode = ONE_PAGE;
 
−
  private PageFormat page = null;
 
−
  private PrinterJob printer = null;
 
−
  // / Text drawing variables
 
−
  private String fontName = "Dialog";
 
−
  private float fontSize = 12;
 
−
  private int fontStyle = Font.PLAIN;
 
−
  private int fontTransform = NONE;
 
−
  private Font testFont = null;
 
−
  private Object antiAliasType = VALUE_TEXT_ANTIALIAS_DEFAULT;
 
−
  private Object fractionalMetricsType = VALUE_FRACTIONALMETRICS_DEFAULT;
 
−
  private Object lcdContrast = getDefaultLCDContrast();
 
−
  private int drawMethod = DRAW_STRING;
 
−
  private int textToUse = RANGE_TEXT;
 
−
  private String userText[] = null;
 
−
  private String fileText[] = null;
 
−
  private int drawRange[] = { 0x0000, 0x007f };
 
−
  private String fontInfos[] = new String[2];
 
−
  private boolean showGrid = true;
 
−
  // / Parent Font2DTest panel
 
−
  private final Font2DTest f2dt;
 
−
  private final JFrame parent;
 
−
  public FontPanel(Font2DTest demo, JFrame f) {
 
−
    f2dt = demo;
 
−
    parent = f;
 
−
    verticalBar = new JScrollBar(JScrollBar.VERTICAL);
 
−
    fc = new FontCanvas();
 
−
    this.setLayout(new BorderLayout());
 
−
    this.add("Center", fc);
 
−
    this.add("East", verticalBar);
 
−
    verticalBar.addAdjustmentListener(this);
 
−
    this.addComponentListener(new ComponentAdapter() {
 
−
      public void componentResized(ComponentEvent e) {
 
−
        updateBackBuffer = true;
 
−
        updateFontMetrics = true;
 
−
      }
 
−
    });
 
−
    // / Initialize font and its infos
 
−
    testFont = new Font(fontName, fontStyle, (int) fontSize);
 
−
    if ((float) ((int) fontSize) != fontSize) {
 
−
      testFont = testFont.deriveFont(fontSize);
 
−
    }
 
−
    updateFontInfo();
 
−
  }
 
−
  public Dimension getPreferredSize() {
 
−
    return new Dimension(600, 200);
 
−
  }
 
−
  // / Functions called by the main programs to set the various parameters
 
−
  public void setTransformG2(int transform) {
 
−
    g2Transform = transform;
 
−
    updateBackBuffer = true;
 
−
    updateFontMetrics = true;
 
−
    fc.repaint();
 
−
  }
 
−
  // / convenience fcn to create AffineTransform of appropriate type
 
−
  private AffineTransform getAffineTransform(int transform) {
 
−
    // / ABP
 
−
    AffineTransform at = new AffineTransform();
 
−
    switch (transform) {
 
−
    case SCALE:
 
−
      at.setToScale(1.5f, 1.5f);
 
−
      break;
 
−
    case ROTATE:
 
−
      at.setToRotation(Math.PI / 6);
 
−
      break;
 
−
    case SHEAR:
 
−
      at.setToShear(0.4f, 0);
 
−
      break;
 
−
    case NONE:
 
−
      break;
 
−
    default:
 
−
      // System.err.println( "Illegal G2 Transform Arg: " + transform);
 
−
      break;
 
−
    }
 
−
    return at;
 
−
  }
 
−
  public void setFontParams(Object obj, float size, int style, int transform) {
 
−
    setFontParams((String) obj, size, style, transform);
 
−
  }
 
−
  public void setFontParams(String name, float size, int style, int transform) {
 
−
    boolean fontModified = false;
 
−
    if (!name.equals(fontName) || style != fontStyle)
 
−
      fontModified = true;
 
−
    fontName = name;
 
−
    fontSize = size;
 
−
    fontStyle = style;
 
−
    fontTransform = transform;
 
−
    // / Recreate the font as specified
 
−
    testFont = new Font(fontName, fontStyle, (int) fontSize);
 
−
    if ((float) ((int) fontSize) != fontSize) {
 
−
      testFont = testFont.deriveFont(fontSize);
 
−
    }
 
−
    if (fontTransform != NONE) {
 
−
      AffineTransform at = getAffineTransform(fontTransform);
 
−
      testFont = testFont.deriveFont(at);
 
−
    }
 
−
    updateBackBuffer = true;
 
−
    updateFontMetrics = true;
 
−
    fc.repaint();
 
−
    if (fontModified) {
 
−
      // / Tell main panel to update the font info
 
−
      updateFontInfo();
 
−
      f2dt.fireUpdateFontInfo();
 
−
    }
 
−
  }
 
−
  public void setRenderingHints(Object aa, Object fm, Object contrast) {
 
−
    antiAliasType = ((AAValues) aa).getHint();
 
−
    fractionalMetricsType = ((FMValues) fm).getHint();
 
−
    lcdContrast = contrast;
 
−
    updateBackBuffer = true;
 
−
    updateFontMetrics = true;
 
−
    fc.repaint();
 
−
  }
 
−
  public void setDrawMethod(int i) {
 
−
    drawMethod = i;
 
−
    updateBackBuffer = true;
 
−
    fc.repaint();
 
−
  }
 
−
  public void setTextToDraw(int i, int range[], String textSet[], String fileData[]) {
 
−
    textToUse = i;
 
−
    if (textToUse == RANGE_TEXT)
 
−
      drawRange = range;
 
−
    else if (textToUse == ALL_GLYPHS)
 
−
      drawMethod = DRAW_GLYPHV;
 
−
    else if (textToUse == USER_TEXT)
 
−
      userText = textSet;
 
−
    else if (textToUse == FILE_TEXT) {
 
−
      fileText = fileData;
 
−
      drawMethod = TL_DRAW;
 
−
    }
 
−
    updateBackBuffer = true;
 
−
    updateFontMetrics = true;
 
−
    fc.repaint();
 
−
    updateFontInfo();
 
−
  }
 
−
  public void setGridDisplay(boolean b) {
 
−
    showGrid = b;
 
−
    updateBackBuffer = true;
 
−
    fc.repaint();
 
−
  }
 
−
  public void setForce16Columns(boolean b) {
 
−
    force16Cols = b;
 
−
    updateBackBuffer = true;
 
−
    updateFontMetrics = true;
 
−
    fc.repaint();
 
−
  }
 
−
  // / Prints out the text display area
 
−
  public void doPrint(int i) {
 
−
    if (printer == null) {
 
−
      printer = PrinterJob.getPrinterJob();
 
−
      page = printer.defaultPage();
 
−
    }
 
−
    printMode = i;
 
−
    printer.setPrintable(fc, page);
 
−
    if (printer.printDialog()) {
 
−
      try {
 
−
        printer.print();
 
−
      } catch (Exception e) {
 
−
        f2dt.fireChangeStatus("ERROR: Printing Failed; See Stack Trace", true);
 
−
      }
 
−
    }
 
−
  }
 
−
  // / Displays the page setup dialog and updates PageFormat info
 
−
  public void doPageSetup() {
 
−
    if (printer == null) {
 
−
      printer = PrinterJob.getPrinterJob();
 
−
      page = printer.defaultPage();
 
−
    }
 
−
    page = printer.pageDialog(page);
 
−
  }
 
−
  // / Obtains the information about selected font
 
−
  private void updateFontInfo() {
 
−
    int numGlyphs = 0, numCharsInRange = drawRange[1] - drawRange[0] + 1;
 
−
    fontInfos[0] = "Font Face Name: " + testFont.getFontName();
 
−
    fontInfos[1] = "Glyphs in This Range: ";
 
−
    if (textToUse == RANGE_TEXT) {
 
−
      for (int i = drawRange[0]; i < drawRange[1]; i++)
 
−
        if (testFont.canDisplay(i))
 
−
          numGlyphs++;
 
−
      fontInfos[1] = fontInfos[1] + numGlyphs + " / " + numCharsInRange;
 
−
    } else
 
−
      fontInfos[1] = null;
 
−
  }
 
−
  // / Accessor for the font information
 
−
  public String[] getFontInfo() {
 
−
    return fontInfos;
 
−
  }
 
−
  // / Collects the currectly set options and returns them as string
 
−
  public String getCurrentOptions() {
 
−
    // / Create a new String to store the options
 
−
    // / The array will contain all 8 setting (font name, size...) and
 
−
    // / character range or user text data used (no file text data)
 
−
    int userTextSize = 0;
 
−
    String options;
 
−
    options = (fontName + "\n" + fontSize + "\n" + fontStyle + "\n" + fontTransform + "\n"
 
−
        + g2Transform + "\n" + textToUse + "\n" + drawMethod + "\n"
 
−
        + AAValues.getHintVal(antiAliasType) + "\n" + FMValues.getHintVal(fractionalMetricsType)
 
−
        + "\n" + lcdContrast + "\n");
 
−
    if (textToUse == USER_TEXT)
 
−
      for (int i = 0; i < userText.length; i++)
 
−
        options += (userText[i] + "\n");
 
−
    return options;
 
−
  }
 
−
  // / Reload all options and refreshes the canvas
 
−
  public void loadOptions(boolean grid, boolean force16, int start, int end, String name,
 
−
      float size, int style, int transform, int g2transform, int text, int method, int aa, int fm,
 
−
      int contrast, String user[]) {
 
−
    int range[] = { start, end };
 
−
    // / Since repaint call has a low priority, these functions will finish
 
−
    // / before the actual repainting is done
 
−
    setGridDisplay(grid);
 
−
    setForce16Columns(force16);
 
−
    // previous call to readTextFile has already set the text to draw
 
−
    if (textToUse != FILE_TEXT) {
 
−
      setTextToDraw(text, range, user, null);
 
−
    }
 
−
    setFontParams(name, size, style, transform);
 
−
    setTransformG2(g2transform); // ABP
 
−
    setDrawMethod(method);
 
−
    setRenderingHints(AAValues.getValue(aa), FMValues.getValue(fm), new Integer(contrast));
 
−
  }
 
−
  // / Writes the current screen to PNG file
 
−
  public void doSavePNG(String fileName) {
 
−
    fc.writePNG(fileName);
 
−
  }
 
−
  // / When scrolled using the scroll bar, update the backbuffer
 
−
  public void adjustmentValueChanged(AdjustmentEvent e) {
 
−
    updateBackBuffer = true;
 
−
    fc.repaint();
 
−
  }
 
−
  public void paintComponent(Graphics g) {
 
−
    // Windows does not repaint correctly, after
 
−
    // a zoom. Thus, we need to force the canvas
 
−
    // to repaint, but only once. After the first repaint,
 
−
    // everything stabilizes. [ABP]
 
−
    fc.repaint();
 
−
  }
 
−
  // / Inner class definition...
 
−
  // / Inner panel that holds the actual drawing area and its routines
 
−
  private class FontCanvas extends JPanel implements MouseListener, MouseMotionListener, Printable {
 
−
    // / Number of characters that will fit across and down this canvas
 
−
    private int numCharAcross, numCharDown;
 
−
    // / First and last character/line that will be drawn
 
−
    // / Limit is the end of range/text where no more draw will be done
 
−
    private int drawStart, drawEnd, drawLimit;
 
−
    // / FontMetrics variables
 
−
    // / Here, gridWidth is equivalent to maxAdvance (slightly bigger though)
 
−
    // / and gridHeight is equivalent to lineHeight
 
−
    private int maxAscent, maxDescent, gridWidth = 0, gridHeight = 0;
 
−
    // / Offset from the top left edge of the canvas where the draw will start
 
−
    private int canvasInset_X = 5, canvasInset_Y = 5;
 
−
    // / Offscreen buffer of this canvas
 
−
    private BufferedImage backBuffer = null;
 
−
    // / LineBreak"ed TextLayout vector
 
−
    private Vector lineBreakTLs = null;
 
−
    // / Whether the current draw command requested is for printing
 
−
    private boolean isPrinting = false;
 
−
    // / Other printing infos
 
−
    private int lastPage, printPageNumber, currentlyShownChar = 0;
 
−
    private final int PR_OFFSET = 10;
 
−
    private final int PR_TITLE_LINEHEIGHT = 30;
 
−
    // / Information about zooming (used with range text draw)
 
−
    private final JWindow zoomWindow;
 
−
    private BufferedImage zoomImage = null;
 
−
    private int mouseOverCharX = -1, mouseOverCharY = -1;
 
−
    private int currMouseOverChar = -1, prevZoomChar = -1;
 
−
    private float ZOOM = 2.0f;
 
−
    private boolean nowZooming = false;
 
−
    private boolean firstTime = true;
 
−
    // ABP
 
−
    // / Status bar message backup
 
−
    private String backupStatusString = null;
 
−
    // / Error constants
 
−
    private final String ERRORS[] = {
 
−
        "ERROR: drawBytes cannot handle characters beyond 0x00FF. Select different range or draw methods.",
 
−
        "ERROR: Cannot fit text with the current font size. Resize the window or use smaller font size.",
 
−
        "ERROR: Cannot print with the current font size. Use smaller font size.", };
 
−
    private final int DRAW_BYTES_ERROR = 0;
 
−
    private final int CANT_FIT_DRAW = 1;
 
−
    private final int CANT_FIT_PRINT = 2;
 
−
    // / Other variables
 
−
    private final Cursor blankCursor;
 
−
    public FontCanvas() {
 
−
      this.addMouseListener(this);
 
−
      this.addMouseMotionListener(this);
 
−
      this.setForeground(Color.black);
 
−
      this.setBackground(Color.white);
 
−
      // / Creates an invisble pointer by giving it bogus image
 
−
      // / Possibly find a workaround for this...
 
−
      Toolkit tk = Toolkit.getDefaultToolkit();
 
−
      byte bogus[] = { (byte) 0 };
 
−
      blankCursor = tk.createCustomCursor(tk.createImage(bogus), new Point(0, 0), "");
 
−
      zoomWindow = new JWindow(parent) {
 
−
        public void paint(Graphics g) {
 
−
          g.drawImage(zoomImage, 0, 0, zoomWindow);
 
−
        }
 
−
      };
 
−
      zoomWindow.setCursor(blankCursor);
 
−
      zoomWindow.pack();
 
−
    }
 
−
    public boolean firstTime() {
 
−
      return firstTime;
 
−
    }
 
−
    public void refresh() {
 
−
      firstTime = false;
 
−
      updateBackBuffer = true;
 
−
      repaint();
 
−
    }
 
−
    // / Sets the font, hints, according to the set parameters
 
−
    private void setParams(Graphics2D g2) {
 
−
      g2.setFont(testFont);
 
−
      g2.setRenderingHint(KEY_TEXT_ANTIALIASING, antiAliasType);
 
−
      g2.setRenderingHint(KEY_FRACTIONALMETRICS, fractionalMetricsType);
 
−
      g2.setRenderingHint(KEY_TEXT_LCD_CONTRAST, lcdContrast);
 
−
      /*
 
−
      * I am preserving a somewhat dubious behaviour of this program. Outline
 
−
      * text would be drawn anti-aliased by setting the graphics anti-aliasing
 
−
      * hint if the text anti-aliasing hint was set. The dubious element here
 
−
      * is that people simply using this program may think this is built-in
 
−
      * behaviour but its not - at least not when the app explictly draws
 
−
      * outline text. This becomes more dubious in cases such as "GASP" where
 
−
      * the size at which text is AA"ed is not something you can easily
 
−
      * calculate, so mimicing that behaviour isn"t going to be easy. So I
 
−
      * precisely preserve the behaviour : this is done only if the AA value is
 
−
      * "ON". Its not applied in the other cases.
 
−
      */
 
−
      if (antiAliasType == VALUE_TEXT_ANTIALIAS_ON
 
−
          && (drawMethod == TL_OUTLINE || drawMethod == GV_OUTLINE)) {
 
−
        g2.setRenderingHint(KEY_ANTIALIASING, VALUE_ANTIALIAS_ON);
 
−
      } else {
 
−
        g2.setRenderingHint(KEY_ANTIALIASING, VALUE_ANTIALIAS_OFF);
 
−
      }
 
−
    }
 
−
    // / Draws the grid (Used for unicode/glyph range drawing)
 
−
    private void drawGrid(Graphics2D g2) {
 
−
      int totalGridWidth = numCharAcross * gridWidth;
 
−
      int totalGridHeight = numCharDown * gridHeight;
 
−
      g2.setColor(Color.black);
 
−
      for (int i = 0; i < numCharDown + 1; i++)
 
−
        g2.drawLine(canvasInset_X, i * gridHeight + canvasInset_Y, canvasInset_X + totalGridWidth,
 
−
            i * gridHeight + canvasInset_Y);
 
−
      for (int i = 0; i < numCharAcross + 1; i++)
 
−
        g2.drawLine(i * gridWidth + canvasInset_X, canvasInset_Y, i * gridWidth + canvasInset_X,
 
−
            canvasInset_Y + totalGridHeight);
 
−
    }
 
−
    // / Draws one character at time onto the canvas according to
 
−
    // / the method requested (Used for RANGE_TEXT and ALL_GLYPHS)
 
−
    public void modeSpecificDrawChar(Graphics2D g2, int charCode, int baseX, int baseY) {
 
−
      GlyphVector gv;
 
−
      int oneGlyph[] = { charCode };
 
−
      char charArray[] = Character.toChars(charCode);
 
−
      FontRenderContext frc = g2.getFontRenderContext();
 
−
      AffineTransform oldTX = g2.getTransform();
 
−
      // / Create GlyphVector to measure the exact visual advance
 
−
      // / Using that number, adjust the position of the character drawn
 
−
      if (textToUse == ALL_GLYPHS)
 
−
        gv = testFont.createGlyphVector(frc, oneGlyph);
 
−
      else
 
−
        gv = testFont.createGlyphVector(frc, charArray);
 
−
      Rectangle2D r2d2 = gv.getPixelBounds(frc, 0, 0);
 
−
      int shiftedX = baseX;
 
−
      // getPixelBounds returns a result in device space.
 
−
      // we need to convert back to user space to be able to
 
−
      // calculate the shift as baseX is in user space.
 
−
      try {
 
−
        double pt[] = new double[4];
 
−
        pt[0] = r2d2.getX();
 
−
        pt[1] = r2d2.getY();
 
−
        pt[2] = r2d2.getX() + r2d2.getWidth();
 
−
        pt[3] = r2d2.getY() + r2d2.getHeight();
 
−
        oldTX.inverseTransform(pt, 0, pt, 0, 2);
 
−
        shiftedX = baseX - (int) (pt[2] / 2 + pt[0]);
 
−
      } catch (NoninvertibleTransformException e) {
 
−
      }
 
−
      // / ABP - keep track of old tform, restore it later
 
−
      g2.translate(shiftedX, baseY);
 
−
      g2.transform(getAffineTransform(g2Transform));
 
−
      if (textToUse == ALL_GLYPHS)
 
−
        g2.drawGlyphVector(gv, 0f, 0f);
 
−
      else {
 
−
        if (testFont.canDisplay(charCode))
 
−
          g2.setColor(Color.black);
 
−
        else {
 
−
          g2.setColor(Color.lightGray);
 
−
        }
 
−
        switch (drawMethod) {
 
−
        case DRAW_STRING:
 
−
          g2.drawString(new String(charArray), 0, 0);
 
−
          break;
 
−
        case DRAW_CHARS:
 
−
          g2.drawChars(charArray, 0, 1, 0, 0);
 
−
          break;
 
−
        case DRAW_BYTES:
 
−
          if (charCode > 0xff)
 
−
            throw new CannotDrawException(DRAW_BYTES_ERROR);
 
−
          byte oneByte[] = { (byte) charCode };
 
−
          g2.drawBytes(oneByte, 0, 1, 0, 0);
 
−
          break;
 
−
        case DRAW_GLYPHV:
 
−
          g2.drawGlyphVector(gv, 0f, 0f);
 
−
          break;
 
−
        case TL_DRAW:
 
−
          TextLayout tl = new TextLayout(new String(charArray), testFont, frc);
 
−
          tl.draw(g2, 0f, 0f);
 
−
          break;
 
−
        case GV_OUTLINE:
 
−
          r2d2 = gv.getVisualBounds();
 
−
          shiftedX = baseX - (int) (r2d2.getWidth() / 2 + r2d2.getX());
 
−
          g2.draw(gv.getOutline(0f, 0f));
 
−
          break;
 
−
        case TL_OUTLINE:
 
−
          r2d2 = gv.getVisualBounds();
 
−
          shiftedX = baseX - (int) (r2d2.getWidth() / 2 + r2d2.getX());
 
−
          TextLayout tlo = new TextLayout(new String(charArray), testFont, g2
 
−
              .getFontRenderContext());
 
−
          g2.draw(tlo.getOutline(null));
 
−
        }
 
−
      }
 
−
      // / ABP - restore old tform
 
−
      g2.setTransform(oldTX);
 
−
    }
 
−
    // Java2D!\\U01d586\\U01d587\\U01d588
 
−
    // / Draws one line of text at given position
 
−
    private void modeSpecificDrawLine(Graphics2D g2, String line, int baseX, int baseY) {
 
−
      // / ABP - keep track of old tform, restore it later
 
−
      AffineTransform oldTx = null;
 
−
      oldTx = g2.getTransform();
 
−
      g2.translate(baseX, baseY);
 
−
      g2.transform(getAffineTransform(g2Transform));
 
−
      switch (drawMethod) {
 
−
      case DRAW_STRING:
 
−
        g2.drawString(line, 0, 0);
 
−
        break;
 
−
      case DRAW_CHARS:
 
−
        g2.drawChars(line.toCharArray(), 0, line.length(), 0, 0);
 
−
        break;
 
−
      case DRAW_BYTES:
 
−
        try {
 
−
          byte lineBytes[] = line.getBytes("ISO-8859-1");
 
−
          g2.drawBytes(lineBytes, 0, lineBytes.length, 0, 0);
 
−
        } catch (Exception e) {
 
−
          e.printStackTrace();
 
−
        }
 
−
        break;
 
−
      case DRAW_GLYPHV:
 
−
        GlyphVector gv = testFont.createGlyphVector(g2.getFontRenderContext(), line);
 
−
        g2.drawGlyphVector(gv, (float) 0, (float) 0);
 
−
        break;
 
−
      case TL_DRAW:
 
−
        TextLayout tl = new TextLayout(line, testFont, g2.getFontRenderContext());
 
−
        tl.draw(g2, (float) 0, (float) 0);
 
−
        break;
 
−
      case GV_OUTLINE:
 
−
        GlyphVector gvo = testFont.createGlyphVector(g2.getFontRenderContext(), line);
 
−
        g2.draw(gvo.getOutline((float) 0, (float) 0));
 
−
        break;
 
−
      case TL_OUTLINE:
 
−
        TextLayout tlo = new TextLayout(line, testFont, g2.getFontRenderContext());
 
−
        AffineTransform at = new AffineTransform();
 
−
        g2.draw(tlo.getOutline(at));
 
−
      }
 
−
      // / ABP - restore old tform
 
−
      g2.setTransform(oldTx);
 
−
    }
 
−
    // / Draws one line of text at given position
 
−
    private void tlDrawLine(Graphics2D g2, TextLayout tl, float baseX, float baseY) {
 
−
      // / ABP - keep track of old tform, restore it later
 
−
      AffineTransform oldTx = null;
 
−
      oldTx = g2.getTransform();
 
−
      g2.translate(baseX, baseY);
 
−
      g2.transform(getAffineTransform(g2Transform));
 
−
      tl.draw(g2, (float) 0, (float) 0);
 
−
      // / ABP - restore old tform
 
−
      g2.setTransform(oldTx);
 
−
    }
 
−
    // / If textToUse is set to range drawing, then convert
 
−
    // / int to hex string and prepends 0s to make it length 4
 
−
    // / Otherwise line number was fed; simply return number + 1 converted to
 
−
    // String
 
−
    // / (This is because first line is 1, not 0)
 
−
    private String modeSpecificNumStr(int i) {
 
−
      if (textToUse == USER_TEXT || textToUse == FILE_TEXT)
 
−
        return String.valueOf(i + 1);
 
−
      StringBuffer s = new StringBuffer(Integer.toHexString(i));
 
−
      while (s.length() < 4)
 
−
        s.insert(0, "0");
 
−
      return s.toString().toUpperCase();
 
−
    }
 
−
    // / Resets the scrollbar to display correct range of text currently on
 
−
    // screen
 
−
    // / (This scrollbar is not part of a "ScrollPane". It merely simulates its
 
−
    // effect by
 
−
    // / indicating the necessary area to be drawn within the panel.
 
−
    // / By doing this, it prevents creating gigantic panel when large text
 
−
    // range,
 
−
    // / i.e. CJK Ideographs, is requested)
 
−
    private void resetScrollbar(int oldValue) {
 
−
      int totalNumRows = 1, numCharToDisplay;
 
−
      if (textToUse == RANGE_TEXT || textToUse == ALL_GLYPHS) {
 
−
        if (textToUse == RANGE_TEXT)
 
−
          numCharToDisplay = drawRange[1] - drawRange[0];
 
−
        else
 
−
          // / textToUse == ALL_GLYPHS
 
−
          numCharToDisplay = testFont.getNumGlyphs();
 
−
        totalNumRows = numCharToDisplay / numCharAcross;
 
−
        if (numCharToDisplay % numCharAcross != 0)
 
−
          totalNumRows++;
 
−
        if (oldValue / numCharAcross > totalNumRows)
 
−
          oldValue = 0;
 
−
        verticalBar.setValues(oldValue / numCharAcross, numCharDown, 0, totalNumRows);
 
−
      } else {
 
−
        if (textToUse == USER_TEXT)
 
−
          totalNumRows = userText.length;
 
−
        else
 
−
          // / textToUse == FILE_TEXT;
 
−
          totalNumRows = lineBreakTLs.size();
 
−
        verticalBar.setValues(oldValue, numCharDown, 0, totalNumRows);
 
−
      }
 
−
      if (totalNumRows <= numCharDown && drawStart == 0) {
 
−
        verticalBar.setEnabled(false);
 
−
      } else {
 
−
        verticalBar.setEnabled(true);
 
−
      }
 
−
    }
 
−
    // / Calculates the font"s metrics that will be used for draw
 
−
    private void calcFontMetrics(Graphics2D g2d, int w, int h) {
 
−
      FontMetrics fm;
 
−
      Graphics2D g2 = (Graphics2D) g2d.create();
 
−
      // / ABP
 
−
      if (g2Transform != NONE && textToUse != FILE_TEXT) {
 
−
        g2.setFont(g2.getFont().deriveFont(getAffineTransform(g2Transform)));
 
−
        fm = g2.getFontMetrics();
 
−
      } else {
 
−
        fm = g2.getFontMetrics();
 
−
      }
 
−
      maxAscent = fm.getMaxAscent();
 
−
      maxDescent = fm.getMaxDescent();
 
−
      if (maxAscent == 0)
 
−
        maxAscent = 10;
 
−
      if (maxDescent == 0)
 
−
        maxDescent = 5;
 
−
      if (textToUse == RANGE_TEXT || textToUse == ALL_GLYPHS) {
 
−
        // / Give slight extra room for each character
 
−
        maxAscent += 3;
 
−
        maxDescent += 3;
 
−
        gridWidth = fm.getMaxAdvance() + 6;
 
−
        gridHeight = maxAscent + maxDescent;
 
−
        if (force16Cols)
 
−
          numCharAcross = 16;
 
−
        else
 
−
          numCharAcross = (w - 10) / gridWidth;
 
−
        numCharDown = (h - 10) / gridHeight;
 
−
        canvasInset_X = (w - numCharAcross * gridWidth) / 2;
 
−
        canvasInset_Y = (h - numCharDown * gridHeight) / 2;
 
−
        if (numCharDown == 0 || numCharAcross == 0)
 
−
          throw new CannotDrawException(isPrinting ? CANT_FIT_PRINT : CANT_FIT_DRAW);
 
−
        if (!isPrinting)
 
−
          resetScrollbar(verticalBar.getValue() * numCharAcross);
 
−
      } else {
 
−
        maxDescent += fm.getLeading();
 
−
        canvasInset_X = 5;
 
−
        canvasInset_Y = 5;
 
−
        // / gridWidth and numCharAcross will not be used in this mode...
 
−
        gridHeight = maxAscent + maxDescent;
 
−
        numCharDown = (h - canvasInset_Y * 2) / gridHeight;
 
−
        if (numCharDown == 0)
 
−
          throw new CannotDrawException(isPrinting ? CANT_FIT_PRINT : CANT_FIT_DRAW);
 
−
        // / If this is text loaded from file, prepares the LineBreak"ed
 
−
        // / text layout at this point
 
−
        if (textToUse == FILE_TEXT) {
 
−
          if (!isPrinting)
 
−
            f2dt.fireChangeStatus("LineBreaking Text... Please Wait", false);
 
−
          lineBreakTLs = new Vector();
 
−
          for (int i = 0; i < fileText.length; i++) {
 
−
            AttributedString as = new AttributedString(fileText[i], g2.getFont().getAttributes());
 
−
            LineBreakMeasurer lbm = new LineBreakMeasurer(as.getIterator(), g2
 
−
                .getFontRenderContext());
 
−
            while (lbm.getPosition() < fileText[i].length())
 
−
              lineBreakTLs.add(lbm.nextLayout((float) w));
 
−
          }
 
−
        }
 
−
        if (!isPrinting)
 
−
          resetScrollbar(verticalBar.getValue());
 
−
      }
 
−
    }
 
−
    // / Calculates the amount of text that will be displayed on screen
 
−
    private void calcTextRange() {
 
−
      String displaying = null;
 
−
      if (textToUse == RANGE_TEXT || textToUse == ALL_GLYPHS) {
 
−
        if (isPrinting)
 
−
          if (printMode == ONE_PAGE)
 
−
            drawStart = currentlyShownChar;
 
−
          else
 
−
            // / printMode == CUR_RANGE
 
−
            drawStart = numCharAcross * numCharDown * printPageNumber;
 
−
        else
 
−
          drawStart = verticalBar.getValue() * numCharAcross;
 
−
        if (textToUse == RANGE_TEXT) {
 
−
          drawStart += drawRange[0];
 
−
          drawLimit = drawRange[1];
 
−
        } else
 
−
          drawLimit = testFont.getNumGlyphs();
 
−
        drawEnd = drawStart + numCharAcross * numCharDown - 1;
 
−
        if (drawEnd >= drawLimit)
 
−
          drawEnd = drawLimit;
 
−
      } else {
 
−
        if (isPrinting)
 
−
          if (printMode == ONE_PAGE)
 
−
            drawStart = currentlyShownChar;
 
−
          else
 
−
            // / printMode == ALL_TEXT
 
−
            drawStart = numCharDown * printPageNumber;
 
−
        else {
 
−
          drawStart = verticalBar.getValue();
 
−
        }
 
−
        drawEnd = drawStart + numCharDown - 1;
 
−
        if (textToUse == USER_TEXT)
 
−
          drawLimit = userText.length - 1;
 
−
        else
 
−
          drawLimit = lineBreakTLs.size() - 1;
 
−
        if (drawEnd >= drawLimit)
 
−
          drawEnd = drawLimit;
 
−
      }
 
−
      // ABP
 
−
      if (drawStart > drawEnd) {
 
−
        drawStart = 0;
 
−
        verticalBar.setValue(drawStart);
 
−
      }
 
−
      // / Change the status bar if not printing...
 
−
      if (!isPrinting) {
 
−
        backupStatusString = ("Displaying" + MS_OPENING[textToUse] + modeSpecificNumStr(drawStart)
 
−
            + " to " + modeSpecificNumStr(drawEnd) + MS_CLOSING[textToUse]);
 
−
        f2dt.fireChangeStatus(backupStatusString, false);
 
−
      }
 
−
    }
 
−
    // / Draws text according to the parameters set by Font2DTest GUI
 
−
    private void drawText(Graphics g, int w, int h) {
 
−
      Graphics2D g2;
 
−
      // / Create back buffer when not printing, and its Graphics2D
 
−
      // / Then set drawing parameters for that Graphics2D object
 
−
      if (isPrinting)
 
−
        g2 = (Graphics2D) g;
 
−
      else {
 
−
        backBuffer = (BufferedImage) this.createImage(w, h);
 
−
        g2 = backBuffer.createGraphics();
 
−
        g2.setColor(Color.white);
 
−
        g2.fillRect(0, 0, w, h);
 
−
        g2.setColor(Color.black);
 
−
      }
 
−
      // / sets font, RenderingHints.
 
−
      setParams(g2);
 
−
      // / If flag is set, recalculate fontMetrics and reset the scrollbar
 
−
      if (updateFontMetrics || isPrinting) {
 
−
        // / NOTE: re-calculates in case G2 transform
 
−
        // / is something other than NONE
 
−
        calcFontMetrics(g2, w, h);
 
−
        updateFontMetrics = false;
 
−
      }
 
−
      // / Calculate the amount of text that can be drawn...
 
−
      calcTextRange();
 
−
      // / Draw according to the set "Text to Use" mode
 
−
      if (textToUse == RANGE_TEXT || textToUse == ALL_GLYPHS) {
 
−
        int charToDraw = drawStart;
 
−
        if (showGrid)
 
−
          drawGrid(g2);
 
−
        if (!isPrinting)
 
−
          g.drawImage(backBuffer, 0, 0, this);
 
−
        for (int i = 0; i < numCharDown && charToDraw <= drawEnd; i++) {
 
−
          for (int j = 0; j < numCharAcross && charToDraw <= drawEnd; j++, charToDraw++) {
 
−
            int gridLocX = j * gridWidth + canvasInset_X;
 
−
            int gridLocY = i * gridHeight + canvasInset_Y;
 
−
            modeSpecificDrawChar(g2, charToDraw, gridLocX + gridWidth / 2, gridLocY + maxAscent);
 
−
            // if ( !isPrinting ) {
 
−
            // g.setClip( gridLocX, gridLocY, gridWidth + 1, gridHeight + 1 );
 
−
            // g.drawImage( backBuffer, 0, 0, this );
 
−
            // }
 
−
          }
 
−
        }
 
−
      } else if (textToUse == USER_TEXT) {
 
−
        g2.drawRect(0, 0, w - 1, h - 1);
 
−
        if (!isPrinting)
 
−
          g.drawImage(backBuffer, 0, 0, this);
 
−
        for (int i = drawStart; i <= drawEnd; i++) {
 
−
          int lineStartX = canvasInset_Y;
 
−
          int lineStartY = (i - drawStart) * gridHeight + maxAscent;
 
−
          modeSpecificDrawLine(g2, userText[i], lineStartX, lineStartY);
 
−
        }
 
−
      } else {
 
−
        float xPos, yPos = (float) canvasInset_Y;
 
−
        g2.drawRect(0, 0, w - 1, h - 1);
 
−
        if (!isPrinting)
 
−
          g.drawImage(backBuffer, 0, 0, this);
 
−
        for (int i = drawStart; i <= drawEnd; i++) {
 
−
          TextLayout oneLine = (TextLayout) lineBreakTLs.elementAt(i);
 
−
          xPos = oneLine.isLeftToRight() ? canvasInset_X
 
−
              : ((float) w - oneLine.getAdvance() - canvasInset_X);
 
−
          float fmData[] = { 0, oneLine.getAscent(), 0, oneLine.getDescent(), 0,
 
−
              oneLine.getLeading() };
 
−
          if (g2Transform != NONE) {
 
−
            AffineTransform at = getAffineTransform(g2Transform);
 
−
            at.transform(fmData, 0, fmData, 0, 3);
 
−
          }
 
−
          // yPos += oneLine.getAscent();
 
−
          yPos += fmData[1]; // ascent
 
−
          // oneLine.draw( g2, xPos, yPos );
 
−
          tlDrawLine(g2, oneLine, xPos, yPos);
 
−
          // yPos += oneLine.getDescent() + oneLine.getLeading();
 
−
          yPos += fmData[3] + fmData[5]; // descent + leading
 
−
        }
 
−
      }
 
−
      if (!isPrinting)
 
−
        g.drawImage(backBuffer, 0, 0, this);
 
−
      g2.dispose();
 
−
    }
 
−
    // / Component paintComponent function...
 
−
    // / Draws/Refreshes canvas according to flag(s) set by other functions
 
−
    public void paintComponent(Graphics g) {
 
−
      if (updateBackBuffer) {
 
−
        Dimension d = this.getSize();
 
−
        isPrinting = false;
 
−
        try {
 
−
          drawText(g, d.width, d.height);
 
−
        } catch (CannotDrawException e) {
 
−
          f2dt.fireChangeStatus(ERRORS[e.id], true);
 
−
          super.paintComponent(g);
 
−
          return;
 
−
        }
 
−
      } else {
 
−
        // / Screen refresh
 
−
        g.drawImage(backBuffer, 0, 0, this);
 
−
      }
 
−
      showingError = false;
 
−
      updateBackBuffer = false;
 
−
    }
 
−
    // / Printable interface function
 
−
    // / Component print function...
 
−
    public int print(Graphics g, PageFormat pf, int pageIndex) {
 
−
      if (pageIndex == 0) {
 
−
        // / Reset the last page index to max...
 
−
        lastPage = Integer.MAX_VALUE;
 
−
        currentlyShownChar = verticalBar.getValue() * numCharAcross;
 
−
      }
 
−
      if (printMode == ONE_PAGE) {
 
−
        if (pageIndex > 0)
 
−
          return NO_SUCH_PAGE;
 
−
      } else {
 
−
        if (pageIndex > lastPage)
 
−
          return NO_SUCH_PAGE;
 
−
      }
 
−
      int pageWidth = (int) pf.getImageableWidth();
 
−
      int pageHeight = (int) pf.getImageableHeight();
 
−
      // / Back up metrics and other drawing info before printing modifies it
 
−
      int backupDrawStart = drawStart, backupDrawEnd = drawEnd;
 
−
      int backupNumCharAcross = numCharAcross, backupNumCharDown = numCharDown;
 
−
      Vector backupLineBreakTLs = null;
 
−
      if (textToUse == FILE_TEXT)
 
−
        backupLineBreakTLs = (Vector) lineBreakTLs.clone();
 
−
      printPageNumber = pageIndex;
 
−
      isPrinting = true;
 
−
      // / Push the actual draw area 60 down to allow info to be printed
 
−
      g.translate((int) pf.getImageableX(), (int) pf.getImageableY() + 60);
 
−
      try {
 
−
        drawText(g, pageWidth, pageHeight - 60);
 
−
      } catch (CannotDrawException e) {
 
−
        f2dt.fireChangeStatus(ERRORS[e.id], true);
 
−
        return NO_SUCH_PAGE;
 
−
      }
 
−
      // / Draw information about what is being printed
 
−
      String hints = (" with antialias " + antiAliasType + "and" + " fractional metrics "
 
−
          + fractionalMetricsType + " and lcd contrast = " + lcdContrast);
 
−
      String infoLine1 = ("Printing" + MS_OPENING[textToUse] + modeSpecificNumStr(drawStart)
 
−
          + " to " + modeSpecificNumStr(drawEnd) + MS_CLOSING[textToUse]);
 
−
      String infoLine2 = ("With " + fontName + " " + STYLES[fontStyle] + " at " + fontSize
 
−
          + " point size " + TRANSFORMS[fontTransform]);
 
−
      String infoLine3 = "Using " + METHODS[drawMethod] + hints;
 
−
      String infoLine4 = "Page: " + (pageIndex + 1);
 
−
      g.setFont(new Font("dialog", Font.PLAIN, 12));
 
−
      g.setColor(Color.black);
 
−
      g.translate(0, -60);
 
−
      g.drawString(infoLine1, 15, 10);
 
−
      g.drawString(infoLine2, 15, 22);
 
−
      g.drawString(infoLine3, 15, 34);
 
−
      g.drawString(infoLine4, 15, 46);
 
−
      if (drawEnd == drawLimit)
 
−
        // / This indicates that the draw will be completed with this page
 
−
        lastPage = pageIndex;
 
−
      // / Restore the changed values back...
 
−
      // / This is important for JScrollBar settings and LineBreak"ed TLs
 
−
      drawStart = backupDrawStart;
 
−
      drawEnd = backupDrawEnd;
 
−
      numCharAcross = backupNumCharAcross;
 
−
      numCharDown = backupNumCharDown;
 
−
      if (textToUse == FILE_TEXT)
 
−
        lineBreakTLs = backupLineBreakTLs;
 
−
      return PAGE_EXISTS;
 
−
    }
 
−
    // / Ouputs the current canvas into a given PNG file
 
−
    public void writePNG(String fileName) {
 
−
      try {
 
−
        ImageIO.write(backBuffer, "png", new java.io.File(fileName));
 
−
      } catch (Exception e) {
 
−
        f2dt.fireChangeStatus("ERROR: Failed to Save PNG image; See stack trace", true);
 
−
        e.printStackTrace();
 
−
      }
 
−
    }
 
−
    // / Figures out whether a character at the pointer location is valid
 
−
    // / And if so, updates mouse location informations, as well as
 
−
    // / the information on the status bar
 
−
    private boolean checkMouseLoc(MouseEvent e) {
 
−
      if (gridWidth != 0 && gridHeight != 0)
 
−
        if (textToUse == RANGE_TEXT || textToUse == ALL_GLYPHS) {
 
−
          int charLocX = (e.getX() - canvasInset_X) / gridWidth;
 
−
          int charLocY = (e.getY() - canvasInset_Y) / gridHeight;
 
−
          // / Check to make sure the mouse click location is within drawn area
 
−
          if (charLocX >= 0 && charLocY >= 0 && charLocX < numCharAcross && charLocY < numCharDown) {
 
−
            int mouseOverChar = charLocX + (verticalBar.getValue() + charLocY) * numCharAcross;
 
−
            if (textToUse == RANGE_TEXT)
 
−
              mouseOverChar += drawRange[0];
 
−
            if (mouseOverChar > drawEnd)
 
−
              return false;
 
−
            mouseOverCharX = charLocX;
 
−
            mouseOverCharY = charLocY;
 
−
            currMouseOverChar = mouseOverChar;
 
−
            // / Update status bar
 
−
            f2dt.fireChangeStatus("Pointing to" + MS_OPENING[textToUse]
 
−
                + modeSpecificNumStr(mouseOverChar), false);
 
−
            return true;
 
−
          }
 
−
        }
 
−
      return false;
 
−
    }
 
−
    // / Shows (updates) the character zoom window
 
−
    public void showZoomed() {
 
−
      GlyphVector gv;
 
−
      Font backup = testFont;
 
−
      Point canvasLoc = this.getLocationOnScreen();
 
−
      // / Calculate the zoom area"s location and size...
 
−
      int dialogOffsetX = (int) (gridWidth * (ZOOM - 1) / 2);
 
−
      int dialogOffsetY = (int) (gridHeight * (ZOOM - 1) / 2);
 
−
      int zoomAreaX = mouseOverCharX * gridWidth + canvasInset_X - dialogOffsetX;
 
−
      int zoomAreaY = mouseOverCharY * gridHeight + canvasInset_Y - dialogOffsetY;
 
−
      int zoomAreaWidth = (int) (gridWidth * ZOOM);
 
−
      int zoomAreaHeight = (int) (gridHeight * ZOOM);
 
−
      // / Position and set size of zoom window as needed
 
−
      zoomWindow.setLocation(canvasLoc.x + zoomAreaX, canvasLoc.y + zoomAreaY);
 
−
      if (!nowZooming) {
 
−
        if (zoomWindow.getWarningString() != null)
 
−
          // / If this is not opened as a "secure" window,
 
−
          // / it has a banner below the zoom dialog which makes it look really
 
−
          // BAD
 
−
          // / So enlarge it by a bit
 
−
          zoomWindow.setSize(zoomAreaWidth + 1, zoomAreaHeight + 20);
 
−
        else
 
−
          zoomWindow.setSize(zoomAreaWidth + 1, zoomAreaHeight + 1);
 
−
      }
 
−
      // / Prepare zoomed image
 
−
      zoomImage = (BufferedImage) zoomWindow.createImage(zoomAreaWidth + 1, zoomAreaHeight + 1);
 
−
      Graphics2D g2 = (Graphics2D) zoomImage.getGraphics();
 
−
      testFont = testFont.deriveFont(fontSize * ZOOM);
 
−
      setParams(g2);
 
−
      g2.setColor(Color.white);
 
−
      g2.fillRect(0, 0, zoomAreaWidth, zoomAreaHeight);
 
−
      g2.setColor(Color.black);
 
−
      g2.drawRect(0, 0, zoomAreaWidth, zoomAreaHeight);
 
−
      modeSpecificDrawChar(g2, currMouseOverChar, zoomAreaWidth / 2, (int) (maxAscent * ZOOM));
 
−
      g2.dispose();
 
−
      if (!nowZooming)
 
−
        zoomWindow.show();
 
−
      // / This is sort of redundant... since there is a paint function
 
−
      // / inside zoomWindow definition that does the drawImage.
 
−
      // / (I should be able to call just repaint() here)
 
−
      // / However, for some reason, that paint function fails to respond
 
−
      // / from second time and on; So I have to force the paint here...
 
−
      zoomWindow.getGraphics().drawImage(zoomImage, 0, 0, this);
 
−
      nowZooming = true;
 
−
      prevZoomChar = currMouseOverChar;
 
−
      testFont = backup;
 
−
      // Windows does not repaint correctly, after
 
−
      // a zoom. Thus, we need to force the canvas
 
−
      // to repaint, but only once. After the first repaint,
 
−
      // everything stabilizes. [ABP]
 
−
      if (firstTime()) {
 
−
        refresh();
 
−
      }
 
−
    }
 
−
    // / Listener Functions
 
−
    // / MouseListener interface function
 
−
    // / Zooms a character when mouse is pressed above it
 
−
    public void mousePressed(MouseEvent e) {
 
−
      if (!showingError) {
 
−
        if (checkMouseLoc(e)) {
 
−
          showZoomed();
 
−
          this.setCursor(blankCursor);
 
−
        }
 
−
      }
 
−
    }
 
−
    // / MouseListener interface function
 
−
    // / Redraws the area that was drawn over by zoomed character
 
−
    public void mouseReleased(MouseEvent e) {
 
−
      if (textToUse == RANGE_TEXT || textToUse == ALL_GLYPHS) {
 
−
        if (nowZooming)
 
−
          zoomWindow.hide();
 
−
        nowZooming = false;
 
−
      }
 
−
      this.setCursor(Cursor.getDefaultCursor());
 
−
    }
 
−
    // / MouseListener interface function
 
−
    // / Resets the status bar to display range instead of a specific character
 
−
    public void mouseExited(MouseEvent e) {
 
−
      if (!showingError && !nowZooming)
 
−
        f2dt.fireChangeStatus(backupStatusString, false);
 
−
    }
 
−
    // / MouseMotionListener interface function
 
−
    // / Adjusts the status bar message when mouse moves over a character
 
−
    public void mouseMoved(MouseEvent e) {
 
−
      if (!showingError) {
 
−
        if (!checkMouseLoc(e))
 
−
          f2dt.fireChangeStatus(backupStatusString, false);
 
−
      }
 
−
    }
 
−
    // / MouseMotionListener interface function
 
−
    // / Scrolls the zoomed character when mouse is dragged
 
−
    public void mouseDragged(MouseEvent e) {
 
−
      if (!showingError)
 
−
        if (nowZooming) {
 
−
          if (checkMouseLoc(e) && currMouseOverChar != prevZoomChar)
 
−
            showZoomed();
 
−
        }
 
−
    }
 
−
    // / Empty function to comply with interface requirement
 
−
    public void mouseClicked(MouseEvent e) {
 
−
    }
 
−
    public void mouseEntered(MouseEvent e) {
 
−
    }
 
−
  }
 
−
  private final class CannotDrawException extends RuntimeException {
 
−
    // / Error ID
 
−
    public final int id;
 
−
    public CannotDrawException(int i) {
 
−
      id = i;
 
−
    }
 
−
  }
 
−
  enum FMValues {
 
−
    FMDEFAULT("DEFAULT", VALUE_FRACTIONALMETRICS_DEFAULT), FMOFF("OFF", VALUE_FRACTIONALMETRICS_OFF), FMON(
 
−
        "ON", VALUE_FRACTIONALMETRICS_ON);
 
−
    private String name;
 
−
    private Object hint;
 
−
    private static FMValues[] valArray;
 
−
    FMValues(String s, Object o) {
 
−
      name = s;
 
−
      hint = o;
 
−
    }
 
−
    public String toString() {
 
−
      return name;
 
−
    }
 
−
    public Object getHint() {
 
−
      return hint;
 
−
    }
 
−
    public static Object getValue(int ordinal) {
 
−
      if (valArray == null) {
 
−
        valArray = (FMValues[]) EnumSet.allOf(FMValues.class).toArray(new FMValues[0]);
 
−
      }
 
−
      for (int i = 0; i < valArray.length; i++) {
 
−
        if (valArray[i].ordinal() == ordinal) {
 
−
          return valArray[i];
 
−
        }
 
−
      }
 
−
      return valArray[0];
 
−
    }
 
−
    private static FMValues[] getArray() {
 
−
      if (valArray == null) {
 
−
        valArray = (FMValues[]) EnumSet.allOf(FMValues.class).toArray(new FMValues[0]);
 
−
      }
 
−
      return valArray;
 
−
    }
 
−
    public static int getHintVal(Object hint) {
 
−
      getArray();
 
−
      for (int i = 0; i < valArray.length; i++) {
 
−
        if (valArray[i].getHint() == hint) {
 
−
          return i;
 
−
        }
 
−
      }
 
−
      return 0;
 
−
    }
 
−
  }
 
−
  enum AAValues {
 
−
    AADEFAULT("DEFAULT", VALUE_TEXT_ANTIALIAS_DEFAULT), AAOFF("OFF", VALUE_TEXT_ANTIALIAS_OFF), AAON(
 
−
        "ON", VALUE_TEXT_ANTIALIAS_ON), AAGASP("GASP", VALUE_TEXT_ANTIALIAS_GASP), AALCDHRGB(
 
−
        "LCD_HRGB", VALUE_TEXT_ANTIALIAS_LCD_HRGB), AALCDHBGR("LCD_HBGR",
 
−
        VALUE_TEXT_ANTIALIAS_LCD_HBGR), AALCDVRGB("LCD_VRGB", VALUE_TEXT_ANTIALIAS_LCD_VRGB), AALCDVBGR(
 
−
        "LCD_VBGR", VALUE_TEXT_ANTIALIAS_LCD_VBGR);
 
−
    private String name;
 
−
    private Object hint;
 
−
    private static AAValues[] valArray;
 
−
    AAValues(String s, Object o) {
 
−
      name = s;
 
−
      hint = o;
 
−
    }
 
−
    public String toString() {
 
−
      return name;
 
−
    }
 
−
    public Object getHint() {
 
−
      return hint;
 
−
    }
 
−
    public static boolean isLCDMode(Object o) {
 
−
      return (o instanceof AAValues && ((AAValues) o).ordinal() >= AALCDHRGB.ordinal());
 
−
    }
 
−
    public static Object getValue(int ordinal) {
 
−
      if (valArray == null) {
 
−
        valArray = (AAValues[]) EnumSet.allOf(AAValues.class).toArray(new AAValues[0]);
 
−
      }
 
−
      for (int i = 0; i < valArray.length; i++) {
 
−
        if (valArray[i].ordinal() == ordinal) {
 
−
          return valArray[i];
 
−
        }
 
−
      }
 
−
      return valArray[0];
 
−
    }
 
−
    private static AAValues[] getArray() {
 
−
      if (valArray == null) {
 
−
        Object[] oa = EnumSet.allOf(AAValues.class).toArray(new AAValues[0]);
 
−
        valArray = (AAValues[]) (EnumSet.allOf(AAValues.class).toArray(new AAValues[0]));
 
−
      }
 
−
      return valArray;
 
−
    }
 
−
    public static int getHintVal(Object hint) {
 
−
      getArray();
 
−
      for (int i = 0; i < valArray.length; i++) {
 
−
        if (valArray[i].getHint() == hint) {
 
−
          return i;
 
−
        }
 
−
      }
 
−
      return 0;
 
−
    }
 
−
  }
 
−
  private static Integer defaultContrast;
 
−
  static Integer getDefaultLCDContrast() {
 
−
    if (defaultContrast == null) {
 
−
      GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment()
 
−
          .getDefaultScreenDevice().getDefaultConfiguration();
 
−
      Graphics2D g2d = (Graphics2D) (gc.createCompatibleImage(1, 1).getGraphics());
 
−
      defaultContrast = (Integer) g2d.getRenderingHint(RenderingHints.KEY_TEXT_LCD_CONTRAST);
 
−
    }
 
−
    return defaultContrast;
 
−
  }
 
−
}
 
−
/*
 
−
* @(#)RangeMenu.java 1.18 05/11/17
 
−
*
 
−
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
 
−
*
 
−
* Redistribution and use in source and binary forms, with or without
 
−
* modification, are permitted provided that the following conditions are met:
 
−
*
 
−
* -Redistribution of source code must retain the above copyright notice, this
 
−
* list of conditions and the following disclaimer.
 
−
*
 
−
* -Redistribution in binary form must reproduce the above copyright notice,
 
−
* this list of conditions and the following disclaimer in the documentation
 
−
* and/or other materials provided with the distribution.
 
−
*
 
−
* Neither the name of Sun Microsystems, Inc. or the names of contributors may
 
−
* be used to endorse or promote products derived from this software without
 
−
* specific prior written permission.
 
−
*
 
−
* This software is provided "AS IS," without a warranty of any kind. ALL
 
−
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
 
−
* IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
 
−
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS
 
−
* LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A
 
−
* RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
 
−
* IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT
 
−
* OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
 
−
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
 
−
* ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS
 
−
* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 
−
*
 
−
* You acknowledge that this software is not designed, licensed or intended for
 
−
* use in the design, construction, operation or maintenance of any nuclear
 
−
* facility.
 
−
*/
 
−
/*
 
−
* @(#)RangeMenu.java 1.18 05/11/17
 
−
*/
 
−
/**
 
−
* RangeMenu.java
 
−
*
 
−
* @version
 
−
* @(#)RangeMenu.java 1.1 00/08/22
 
−
* @author Shinsuke Fukuda
 
−
* @author Ankit Patel [Conversion to Swing - 01/07/30]
 
−
*/
 
−
// / Custom made choice menu that holds data for unicode range
 
−
final class RangeMenu extends JComboBox implements ActionListener {
 
−
  // / Painfully extracted from java.lang.Character.UnicodeBlock. Arrrgh!
 
−
  // / Unicode 3.0 data.
 
−
  private final int[][] UNICODE_RANGES = { { 0x000000, 0x00007f }, // /
 
−
                                                                    // BASIC_LATIN
 
−
      { 0x000080, 0x0000ff }, // / LATIN_1_SUPPLEMENT
 
−
      { 0x000100, 0x00017f }, // / LATIN_EXTENDED_A
 
−
      { 0x000180, 0x00024f }, // / LATIN_EXTENDED_B
 
−
      { 0x000250, 0x0002af }, // / IPA_EXTENSIONS
 
−
      { 0x0002b0, 0x0002ff }, // / SPACING_MODIFIER_LETTERS
 
−
      { 0x000300, 0x00036f }, // / COMBINING_DIACRITICAL_MARKS
 
−
      { 0x000370, 0x0003ff }, // / GREEK
 
−
      { 0x000400, 0x0004ff }, // / CYRILLIC
 
−
      { 0x000500, 0x00052f }, // / CYRILLIC_SUPPLEMENTARY
 
−
      { 0x000530, 0x00058f }, // / ARMENIAN
 
−
      { 0x000590, 0x0005ff }, // / HEBREW
 
−
      { 0x000600, 0x0006ff }, // / ARABIC
 
−
      { 0x000700, 0x00074f }, // / SYRIAC
 
−
      { 0x000780, 0x0007bf }, // / THAANA
 
−
      { 0x000900, 0x00097f }, // / DEVANAGARI
 
−
      { 0x000980, 0x0009ff }, // / BENGALI
 
−
      { 0x000a00, 0x000a7f }, // / GURMUKHI
 
−
      { 0x000a80, 0x000aff }, // / GUJARATI
 
−
      { 0x000b00, 0x000b7f }, // / ORIYA
 
−
      { 0x000b80, 0x000bff }, // / TAMIL
 
−
      { 0x000c00, 0x000c7f }, // / TELUGU
 
−
      { 0x000c80, 0x000cff }, // / KANNADA
 
−
      { 0x000d00, 0x000d7f }, // / MALAYALAM
 
−
      { 0x000d80, 0x000dff }, // / SINHALA
 
−
      { 0x000e00, 0x000e7f }, // / THAI
 
−
      { 0x000e80, 0x000eff }, // / LAO
 
−
      { 0x000f00, 0x000fff }, // / TIBETAN
 
−
      { 0x001000, 0x00109f }, // / MYANMAR
 
−
      { 0x0010a0, 0x0010ff }, // / GEORGIAN
 
−
      { 0x001100, 0x0011ff }, // / HANGUL_JAMO
 
−
      { 0x001200, 0x00137f }, // / ETHIOPIC
 
−
      { 0x0013a0, 0x0013ff }, // / CHEROKEE
 
−
      { 0x001400, 0x00167f }, // / UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS
 
−
      { 0x001680, 0x00169f }, // / OGHAM
 
−
      { 0x0016a0, 0x0016ff }, // / RUNIC
 
−
      { 0x001700, 0x00171f }, // / TAGALOG
 
−
      { 0x001720, 0x00173f }, // / HANUNOO
 
−
      { 0x001740, 0x00175f }, // / BUHID
 
−
      { 0x001760, 0x00177f }, // / TAGBANWA
 
−
      { 0x001780, 0x0017ff }, // / KHMER
 
−
      { 0x001800, 0x0018af }, // / MONGOLIAN
 
−
      { 0x001900, 0x00194f }, // / LIMBU
 
−
      { 0x001950, 0x00197f }, // / TAI_LE
 
−
      { 0x0019e0, 0x0019ff }, // / KHMER_SYMBOLS
 
−
      { 0x001d00, 0x001d7f }, // / PHONETIC_EXTENSIONS
 
−
      { 0x001e00, 0x001eff }, // / LATIN_EXTENDED_ADDITIONAL
 
−
      { 0x001f00, 0x001fff }, // / GREEK_EXTENDED
 
−
      { 0x002000, 0x00206f }, // / GENERAL_PUNCTUATION
 
−
      { 0x002070, 0x00209f }, // / SUPERSCRIPTS_AND_SUBSCRIPTS
 
−
      { 0x0020a0, 0x0020cf }, // / CURRENCY_SYMBOLS
 
−
      { 0x0020d0, 0x0020ff }, // / COMBINING_MARKS_FOR_SYMBOLS
 
−
      { 0x002100, 0x00214f }, // / LETTERLIKE_SYMBOLS
 
−
      { 0x002150, 0x00218f }, // / NUMBER_FORMS
 
−
      { 0x002190, 0x0021ff }, // / ARROWS
 
−
      { 0x002200, 0x0022ff }, // / MATHEMATICAL_OPERATORS
 
−
      { 0x002300, 0x0023ff }, // / MISCELLANEOUS_TECHNICAL
 
−
      { 0x002400, 0x00243f }, // / CONTROL_PICTURES
 
−
      { 0x002440, 0x00245f }, // / OPTICAL_CHARACTER_RECOGNITION
 
−
      { 0x002460, 0x0024ff }, // / ENCLOSED_ALPHANUMERICS
 
−
      { 0x002500, 0x00257f }, // / BOX_DRAWING
 
−
      { 0x002580, 0x00259f }, // / BLOCK_ELEMENTS
 
−
      { 0x0025a0, 0x0025ff }, // / GEOMETRIC_SHAPES
 
−
      { 0x002600, 0x0026ff }, // / MISCELLANEOUS_SYMBOLS
 
−
      { 0x002700, 0x0027bf }, // / DINGBATS
 
−
      { 0x0027c0, 0x0027ef }, // / MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A
 
−
      { 0x0027f0, 0x0027ff }, // / SUPPLEMENTAL_ARROWS_A
 
−
      { 0x002800, 0x0028ff }, // / BRAILLE_PATTERNS
 
−
      { 0x002900, 0x00297f }, // / SUPPLEMENTAL_ARROWS_B
 
−
      { 0x002980, 0x0029ff }, // / MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B
 
−
      { 0x002a00, 0x002aff }, // / SUPPLEMENTAL_MATHEMATICAL_OPERATORS
 
−
      { 0x002b00, 0x002bff }, // / MISCELLANEOUS_SYMBOLS_AND_ARROWS
 
−
      { 0x002e80, 0x002eff }, // / CJK_RADICALS_SUPPLEMENT
 
−
      { 0x002f00, 0x002fdf }, // / KANGXI_RADICALS
 
−
      { 0x002ff0, 0x002fff }, // / IDEOGRAPHIC_DESCRIPTION_CHARACTERS
 
−
      { 0x003000, 0x00303f }, // / CJK_SYMBOLS_AND_PUNCTUATION
 
−
      { 0x003040, 0x00309f }, // / HIRAGANA
 
−
      { 0x0030a0, 0x0030ff }, // / KATAKANA
 
−
      { 0x003100, 0x00312f }, // / BOPOMOFO
 
−
      { 0x003130, 0x00318f }, // / HANGUL_COMPATIBILITY_JAMO
 
−
      { 0x003190, 0x00319f }, // / KANBUN
 
−
      { 0x0031a0, 0x0031bf }, // / BOPOMOFO_EXTENDED
 
−
      { 0x0031f0, 0x0031ff }, // / KATAKANA_PHONETIC_EXTENSIONS
 
−
      { 0x003200, 0x0032ff }, // / ENCLOSED_CJK_LETTERS_AND_MONTHS
 
−
      { 0x003300, 0x0033ff }, // / CJK_COMPATIBILITY
 
−
      { 0x003400, 0x004dbf }, // / CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
 
−
      { 0x004dc0, 0x004dff }, // / YIJING_HEXAGRAM_SYMBOLS
 
−
      { 0x004e00, 0x009fff }, // / CJK_UNIFIED_IDEOGRAPHS
 
−
      { 0x00a000, 0x00a48f }, // / YI_SYLLABLES
 
−
      { 0x00a490, 0x00a4cf }, // / YI_RADICALS
 
−
      { 0x00ac00, 0x00d7af }, // / HANGUL_SYLLABLES
 
−
      { 0x00d800, 0x00dfff }, // / SURROGATES_AREA
 
−
      { 0x00e000, 0x00f8ff }, // / PRIVATE_USE_AREA
 
−
      { 0x00f900, 0x00faff }, // / CJK_COMPATIBILITY_IDEOGRAPHS
 
−
      { 0x00fb00, 0x00fb4f }, // / ALPHABETIC_PRESENTATION_FORMS
 
−
      { 0x00fb50, 0x00fdff }, // / ARABIC_PRESENTATION_FORMS_A
 
−
      { 0x00fe00, 0x00fe0f }, // / VARIATION_SELECTORS
 
−
      { 0x00fe20, 0x00fe2f }, // / COMBINING_HALF_MARKS
 
−
      { 0x00fe30, 0x00fe4f }, // / CJK_COMPATIBILITY_FORMS
 
−
      { 0x00fe50, 0x00fe6f }, // / SMALL_FORM_VARIANTS
 
−
      { 0x00fe70, 0x00feff }, // / ARABIC_PRESENTATION_FORMS_B
 
−
      { 0x00ff00, 0x00ffef }, // / HALFWIDTH_AND_FULLWIDTH_FORMS
 
−
      { 0x00fff0, 0x00ffff }, // / SPECIALS
 
−
      { 0x010000, 0x01007f }, // / LINEAR_B_SYLLABARY
 
−
      { 0x010080, 0x0100ff }, // / LINEAR_B_IDEOGRAMS
 
−
      { 0x010100, 0x01013f }, // / AEGEAN_NUMBERS
 
−
      { 0x010300, 0x01032f }, // / OLD_ITALIC
 
−
      { 0x010330, 0x01034f }, // / GOTHIC
 
−
      { 0x010380, 0x01039f }, // / UGARITIC
 
−
      { 0x010400, 0x01044f }, // / DESERET
 
−
      { 0x010450, 0x01047f }, // / SHAVIAN
 
−
      { 0x010480, 0x0104af }, // / OSMANYA
 
−
      { 0x010800, 0x01083f }, // / CYPRIOT_SYLLABARY
 
−
      { 0x01d000, 0x01d0ff }, // / BYZANTINE_MUSICAL_SYMBOLS
 
−
      { 0x01d100, 0x01d1ff }, // / MUSICAL_SYMBOLS
 
−
      { 0x01d300, 0x01d35f }, // / TAI_XUAN_JING_SYMBOLS
 
−
      { 0x01d400, 0x01d7ff }, // / MATHEMATICAL_ALPHANUMERIC_SYMBOLS
 
−
      { 0x020000, 0x02a6df }, // / CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B
 
−
      { 0x02f800, 0x02fa1f }, // / CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT
 
−
      { 0x0e0000, 0x0e007f }, // / TAGS
 
−
      { 0x0e0100, 0x0e01ef }, // / VARIATION_SELECTORS_SUPPLEMENT
 
−
      { 0x0f0000, 0x0fffff }, // / SUPPLEMENTARY_PRIVATE_USE_AREA_A
 
−
      { 0x100000, 0x10ffff }, // / SUPPLEMENTARY_PRIVATE_USE_AREA_B
 
−
      { 0x000000, 0x00007f }, // / OTHER [USER DEFINED RANGE]
 
−
  };
 
−
  private final String[] UNICODE_RANGE_NAMES = { "Basic Latin", "Latin-1 Supplement",
 
−
      "Latin Extended-A", "Latin Extended-B", "IPA Extensions", "Spacing Modifier Letters",
 
−
      "Combining Diacritical Marks", "Greek", "Cyrillic", "Cyrillic Supplement", "Armenian",
 
−
      "Hebrew", "Arabic", "Syriac", "Thaana", "Devanagari", "Bengali", "Gurmukhi", "Gujarati",
 
−
      "Oriya", "Tamil", "Telugu", "Kannada", "Malayalam", "Sinhala", "Thai", "Lao", "Tibetan",
 
−
      "Myanmar", "Georgian", "Hangul Jamo", "Ethiopic", "Cherokee",
 
−
      "Unified Canadian Aboriginal Syllabics", "Ogham", "Runic", "Tagalog", "Hanunoo", "Buhid",
 
−
      "Tagbanwa", "Khmer", "Mongolian", "Limbu", "Tai Le", "Khmer Symbols", "Phonetic Extensions",
 
−
      "Latin Extended Additional", "Greek Extended", "General Punctuation",
 
−
      "Superscripts and Subscripts", "Currency Symbols", "Combining Marks for Symbols",
 
−
      "Letterlike Symbols", "Number Forms", "Arrows", "Mathematical Operators",
 
−
      "Miscellaneous Technical", "Control Pictures", "Optical Character Recognition",
 
−
      "Enclosed Alphanumerics", "Box Drawing", "Block Elements", "Geometric Shapes",
 
−
      "Miscellaneous Symbols", "Dingbats", "Miscellaneous Mathematical Symbols-A",
 
−
      "Supplemental Arrows-A", "Braille Patterns", "Supplemental Arrows-B",
 
−
      "Miscellaneous Mathematical Symbols-B", "Supplemental Mathematical Operators",
 
−
      "Miscellaneous Symbols and Arrows", "CJK Radicals Supplement", "Kangxi Radicals",
 
−
      "Ideographic Description Characters", "CJK Symbols and Punctuation", "Hiragana", "Katakana",
 
−
      "Bopomofo", "Hangul Compatibility Jamo", "Kanbun", "Bopomofo Extended",
 
−
      "Katakana Phonetic Extensions", "Enclosed CJK Letters and Months", "CJK Compatibility",
 
−
      "CJK Unified Ideographs Extension A", "Yijing Hexagram Symbols", "CJK Unified Ideographs",
 
−
      "Yi Syllables", "Yi Radicals", "Hangul Syllables", "Surrogates Area", // High
 
−
                                                                            // Surrogates,
 
−
                                                                            // High
 
−
                                                                            // Private
 
−
                                                                            // Use
 
−
                                                                            // Surrogates,
 
−
                                                                            // Low
 
−
                                                                            // Surrogates
 
−
      "Private Use Area", "CJK Compatibility Ideographs", "Alphabetic Presentation Forms",
 
−
      "Arabic Presentation Forms-A", "Variation Selectors", "Combining Half Marks",
 
−
      "CJK Compatibility Forms", "Small Form Variants", "Arabic Presentation Forms-B",
 
−
      "Halfwidth and Fullwidth Forms", "Specials", "Linear B Syllabary", "Linear B Ideograms",
 
−
      "Aegean Numbers", "Old Italic", "Gothic", "Ugaritic", "Deseret", "Shavian", "Osmanya",
 
−
      "Cypriot Syllabary", "Byzantine Musical Symbols", "Musical Symbols", "Tai Xuan Jing Symbols",
 
−
      "Mathematical Alphanumeric Symbols", "CJK Unified Ideographs Extension B",
 
−
      "CJK Compatibility Ideographs Supplement", "Tags", "Variation Selectors Supplement",
 
−
      "Supplementary Private Use Area-A", "Supplementary Private Use Area-B", "Custom...", };
 
−
  private boolean useCustomRange = false;
 
−
  private int[] customRange = { 0x0000, 0x007f };
 
−
  // / Custom range dialog variables
 
−
  private final JDialog customRangeDialog;
 
−
  private final JTextField customRangeStart = new JTextField("0000", 4);
 
−
  private final JTextField customRangeEnd = new JTextField("007F", 4);
 
−
  private final int CUSTOM_RANGE_INDEX = UNICODE_RANGE_NAMES.length - 1;
 
−
  // / Parent Font2DTest Object holder
 
−
  private final Font2DTest parent;
 
−
  public static final int SURROGATES_AREA_INDEX = 91;
 
−
  public RangeMenu(Font2DTest demo, JFrame f) {
 
−
    super();
 
−
    parent = demo;
 
−
    for (int i = 0; i < UNICODE_RANGE_NAMES.length; i++)
 
−
      addItem(UNICODE_RANGE_NAMES[i]);
 
−
    setSelectedIndex(0);
 
−
    addActionListener(this);
 
−
    // / Set up custom range dialog...
 
−
    customRangeDialog = new JDialog(f, "Custom Unicode Range", true);
 
−
    customRangeDialog.setResizable(false);
 
−
    JPanel dialogTop = new JPanel();
 
−
    JPanel dialogBottom = new JPanel();
 
−
    JButton okButton = new JButton("OK");
 
−
    JLabel from = new JLabel("From:");
 
−
    JLabel to = new JLabel("To:");
 
−
    Font labelFont = new Font("dialog", Font.BOLD, 12);
 
−
    from.setFont(labelFont);
 
−
    to.setFont(labelFont);
 
−
    okButton.setFont(labelFont);
 
−
    dialogTop.add(from);
 
−
    dialogTop.add(customRangeStart);
 
−
    dialogTop.add(to);
 
−
    dialogTop.add(customRangeEnd);
 
−
    dialogBottom.add(okButton);
 
−
    okButton.addActionListener(this);
 
−
    customRangeDialog.getContentPane().setLayout(new BorderLayout());
 
−
    customRangeDialog.getContentPane().add("North", dialogTop);
 
−
    customRangeDialog.getContentPane().add("South", dialogBottom);
 
−
    customRangeDialog.pack();
 
−
  }
 
−
  // / Return the range that is currently selected
 
−
  public int[] getSelectedRange() {
 
−
    if (useCustomRange) {
 
−
      int startIndex, endIndex;
 
−
      String startText, endText;
 
−
      String empty = "";
 
−
      try {
 
−
        startText = customRangeStart.getText().trim();
 
−
        endText = customRangeEnd.getText().trim();
 
−
        if (startText.equals(empty) && !endText.equals(empty)) {
 
−
          endIndex = Integer.parseInt(endText, 16);
 
−
          startIndex = endIndex - 7 * 25;
 
−
        } else if (!startText.equals(empty) && endText.equals(empty)) {
 
−
          startIndex = Integer.parseInt(startText, 16);
 
−
          endIndex = startIndex + 7 * 25;
 
−
        } else {
 
−
          startIndex = Integer.parseInt(customRangeStart.getText(), 16);
 
−
          endIndex = Integer.parseInt(customRangeEnd.getText(), 16);
 
−
        }
 
−
      } catch (Exception e) {
 
−
        // / Error in parsing the hex number ---
 
−
        // / Reset the range to what it was before and return that
 
−
        customRangeStart.setText(Integer.toString(customRange[0], 16));
 
−
        customRangeEnd.setText(Integer.toString(customRange[1], 16));
 
−
        return customRange;
 
−
      }
 
−
      if (startIndex < 0)
 
−
        startIndex = 0;
 
−
      if (endIndex > 0xffff)
 
−
        endIndex = 0xffff;
 
−
      if (startIndex > endIndex)
 
−
        startIndex = endIndex;
 
−
      customRange[0] = startIndex;
 
−
      customRange[1] = endIndex;
 
−
      return customRange;
 
−
    } else
 
−
      return UNICODE_RANGES[getSelectedIndex()];
 
−
  }
 
−
  // / Function used by loadOptions in Font2DTest main panel
 
−
  // / to reset setting and range selection
 
−
  public void setSelectedRange(String name, int start, int end) {
 
−
    setSelectedItem(name);
 
−
    customRange[0] = start;
 
−
    customRange[1] = end;
 
−
    parent.fireRangeChanged();
 
−
  }
 
−
  // / ActionListener interface function
 
−
  // / ABP
 
−
  // / moved JComboBox event code into this fcn from
 
−
  // / itemStateChanged() method. Part of change to Swing.
 
−
  public void actionPerformed(ActionEvent e) {
 
−
    Object source = e.getSource();
 
−
    if (source instanceof JComboBox) {
 
−
      String rangeName = (String) ((JComboBox) source).getSelectedItem();
 
−
      if (rangeName.equals("Custom...")) {
 
−
        useCustomRange = true;
 
−
        customRangeDialog.setLocationRelativeTo(parent);
 
−
        customRangeDialog.show();
 
−
      } else {
 
−
        useCustomRange = false;
 
−
      }
 
−
      parent.fireRangeChanged();
 
−
    } else if (source instanceof JButton) {
 
−
      // / Since it is only "OK" button that sends any action here...
 
−
      customRangeDialog.hide();
 
−
    }
 
−
  }
 
−
}
 
−
         
 
−
   
 
−
  </source>
 
−
   
 
−
 
 
−
  <!-- end source code -->
 

Текущая версия на 07:45, 1 июня 2010