package com.jpaulmorrison.graphics; import java.awt.Color; import java.awt.Component; import java.awt.Dialog; import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.GraphicsEnvironment; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.util.LinkedList; import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; //import com.jpaulmorrison.graphics.DrawFBP.FontType; public class MyFontChooser implements ListSelectionListener, WindowListener { //private static final long serialVersionUID = 1L; //JFrame frame; // Graphics2D osg; DrawFBP driver; //FontType ft = null; //String result; JDialog jDialog; //String[] selFonts; String[] fixedFonts, generalFonts; JList<String> jlF = null; JList<String> jlG = null; //String fontDesc; JScrollPane lsF, lsG; //CellRenderer cr; String fixedFont, generalFont; boolean fFChanged, gFChanged; JLabel lb1, lb2; MyFontChooser(JFrame frm, DrawFBP drawFBP) { // type = t; // true if general text; false if fixed-width //frame = frm; driver = drawFBP; //ft = ftyp; //cr = new CellRenderer(); } void buildFontLists() { Font[] allfonts = GraphicsEnvironment.getLocalGraphicsEnvironment() .getAllFonts(); LinkedList<String> llF = new LinkedList<String>(); LinkedList<String> llG = new LinkedList<String>(); for (int j = 0; j < allfonts.length; j++) { llG.add(allfonts[j].getName()); FontMetrics fontMetrics = driver.osg.getFontMetrics(allfonts[j]); if (fontMetrics.charWidth('i') == fontMetrics .charWidth('m')) llF.add(allfonts[j].getName()); } fixedFonts = new String[llF.size()]; llF.toArray(fixedFonts); generalFonts = new String[llG.size()]; llG.toArray(generalFonts); String prompt = ""; jDialog = new JDialog(driver.frame, Dialog.ModalityType.APPLICATION_MODAL); jDialog.setFocusable(true); DrawFBP.applyOrientation(jDialog); jDialog.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { jDialog.dispose(); } // } }); //Dimension dim = driver.frame.getSize(); //jDialog.setPreferredSize(dim); jDialog.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent ev) { if (ev.getKeyCode() == KeyEvent.VK_ESCAPE) { jDialog.dispose(); } } }); //fontDesc = (ft == FontType.GENERAL) ? "general text" : "fixed width"; JPanel p = new JPanel(); Box b1 = new Box(BoxLayout.Y_AXIS); Box b2 = new Box(BoxLayout.Y_AXIS); prompt = "Select fonts for fixed and/or general characters"; jDialog.setTitle(prompt); DrawFBP.applyOrientation(jDialog); p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS)); jlF = new JList<String>(fixedFonts); jlF.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); jlF.setLayoutOrientation(JList.VERTICAL); jlF.setCellRenderer(new CellRenderer()); jlG = new JList<String>(generalFonts); jlG.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); jlG.setLayoutOrientation(JList.VERTICAL); jlG.setCellRenderer(new CellRenderer()); lsF = new JScrollPane(jlF); lsF.setPreferredSize(new Dimension(800, 800)); lsG = new JScrollPane(jlG); lsG.setPreferredSize(new Dimension(800, 800)); fixedFont = driver.fixedFont; lb1 = new JLabel("Fixed Fonts (current: " + fixedFont + ")"); b1.add(lb1); b1.add(lsF); jlF.setSelectedValue(fixedFont, true); generalFont = driver.generalFont; lb2 = new JLabel("General Fonts (current: " + generalFont + ")"); b2.add(lb2); b2.add(lsG); jlG.setSelectedValue(generalFont, true); p.add(b1); p.add(Box.createRigidArea(new Dimension(10, 0))); p.add(b2); jDialog.add(p); //popup.setBounds(100, 100, 800, 800); jlF.addListSelectionListener(this); jlG.addListSelectionListener(this); lsF.revalidate(); lsG.revalidate(); jDialog.revalidate(); lsF.repaint(); lsG.repaint(); //popup.pack(); jDialog.setLocation(50, 100); jDialog.pack(); //frame.pack(); //jl.setVisible(true); //ls.setVisible(true); jDialog.setVisible(true); } public String getFixedFont() { if (fFChanged) return fixedFont; else return null; } public String getGeneralFont() { if (gFChanged) return generalFont; else return null; } void done() { jDialog.setVisible(false); driver.frame.repaint(); } public void valueChanged(ListSelectionEvent e) { //if (e.getValueIsAdjusting() == false) { @SuppressWarnings("unchecked") JList<String> l = (JList<String>) e.getSource(); int i = l.getSelectedIndex(); if (i > -1) { if (l == jlF) { fixedFont = fixedFonts[i]; fFChanged = true; MyOptionPane .showMessageDialog(driver.frame, "Font '" + fixedFont + "' selected as font for fixed-size characters."); lb1.setText("Fixed Fonts (current: " + fixedFont + ")"); lb1.repaint(); } else { generalFont = generalFonts[i]; gFChanged = true; MyOptionPane .showMessageDialog(driver.frame, "Font '" + generalFont + "' selected as font for general characters."); lb2.setText("General Fonts (current: " + generalFont + ")"); lb2.repaint(); } jDialog.repaint(); //popup.setVisible(false); } //} } class CellRenderer implements ListCellRenderer<Object> { //private static final long serialVersionUID = 1L; public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) { JPanel jp = new JPanel(); BoxLayout gb = new BoxLayout(jp, BoxLayout.X_AXIS); jp.setLayout(gb); jp.setBackground(Color.WHITE); Dimension minSize2; Dimension prefSize2; Dimension maxSize2; Dimension minSize = new Dimension(100, 15); Dimension prefSize = new Dimension(100, 15); Dimension maxSize = new Dimension(Short.MAX_VALUE, 15); JLabel lab1 = new JLabel((String) value); lab1.setFont(new Font("Arial", Font.PLAIN, (int) driver.defaultFontSize)); lab1.setMinimumSize(minSize); lab1.setMaximumSize(maxSize); lab1.setPreferredSize(prefSize); jp.add(lab1); minSize2 = new Dimension(20, 15); prefSize2 = new Dimension(20, 15); maxSize2 = new Dimension(Short.MAX_VALUE, 15); jp.add(new Box.Filler(minSize2, prefSize2, maxSize2)); JLabel lab2 = new JLabel("Sample English Text \\"); lab2.setFont(new Font((String) value, Font.PLAIN, (int) driver.defaultFontSize)); minSize = new Dimension(150, 15); prefSize = new Dimension(150, 15); lab2.setMinimumSize(minSize); lab2.setMaximumSize(maxSize); lab2.setPreferredSize(prefSize); jp.add(lab2); jp.add(new Box.Filler(minSize2, prefSize2, maxSize2)); JLabel lab3 = new JLabel("\u0420\u0443\u0441\u0441\u043a\u0438\u0439 " + "\u043e\u0431\u0440\u0430\u0437\u0435\u0446 " + "\u0442\u0435\u043a\u0441\u0442\u0430"); // Russian for "Russian text sample" lab3.setFont(new Font((String) value, Font.PLAIN, (int) driver.defaultFontSize)); minSize = new Dimension(150, 15); prefSize = new Dimension(150, 15); lab3.setMinimumSize(minSize); lab3.setMaximumSize(maxSize); lab3.setPreferredSize(prefSize); jp.add(lab3); jp.add(new Box.Filler(minSize2, prefSize2, maxSize2)); JLabel lab4 = new JLabel("\u0939\u093f\u0902\u0926\u0940 \u092a\u093e\u0920 \u0928\u092e\u0942\u0928\u093e"); // Hindi for "Hindi text sample" lab4.setFont(new Font((String) value, Font.PLAIN, (int) driver.defaultFontSize)); minSize = new Dimension(150, 15); prefSize = new Dimension(150, 15); lab4.setMinimumSize(minSize); lab4.setMaximumSize(maxSize); lab4.setPreferredSize(prefSize); jp.add(lab4); jp.add(new Box.Filler(minSize2, prefSize2, maxSize2)); JLabel lab40 = new JLabel("\u65e5\u672c\u8a9e\u306e\u30c6\u30ad\u30b9\u30c8\u4f8b"); // Japanese for "japanese text sample" lab40.setFont(new Font((String) value, Font.PLAIN, (int) driver.defaultFontSize)); minSize = new Dimension(150, 15); prefSize = new Dimension(150, 15); lab40.setMinimumSize(minSize); lab40.setMaximumSize(maxSize); lab40.setPreferredSize(prefSize); jp.add(lab40); jp.add(new Box.Filler(minSize2, prefSize2, maxSize2)); JLabel lab5 = new JLabel("\u4e2d\u6587\u6587\u672c\u793a\u4f8b"); // Chinese for "Chinese text sample" lab5.setFont(new Font((String) value, Font.PLAIN, (int) driver.defaultFontSize)); minSize = new Dimension(100, 15); prefSize = new Dimension(100, 15); lab5.setMinimumSize(minSize); lab5.setMaximumSize(maxSize); lab5.setPreferredSize(prefSize); jp.add(lab5); Color vLightBlue = new Color(220, 235, 255); if (isSelected) { jp.setBackground(vLightBlue); } return jp; } } public void windowClosed(WindowEvent arg0) { jDialog.setVisible(false); } public void windowDeiconified(WindowEvent arg0) { // TODO Auto-generated method stub } public void windowIconified(WindowEvent arg0) { // TODO Auto-generated method stub } public void windowOpened(WindowEvent arg0) { // TODO Auto-generated method stub //jl.repaint(); //ls.repaint(); } public void windowActivated(WindowEvent e) { // TODO Auto-generated method stub } public void windowClosing(WindowEvent e) { jDialog.setVisible(false); } public void windowDeactivated(WindowEvent e) { // TODO Auto-generated method stub } }