|
|
Строка 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 -->
| |