/*
* :tabSize=4:indentSize=4:noTabs=false:
* :folding=explicit:collapseFolds=1:
*
* Copyright (C) 2000, 2003 Slava Pestov
* Portions copyright (C) 1999 Jason Ginchereau
* Portions copyright (C) 2003 mike dillon
*
* 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 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.gjt.sp.jedit.gui;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import java.util.ArrayList;
import java.util.List;
import org.gjt.sp.jedit.*;
import org.gjt.sp.util.GenericGUIUtilities;
import org.gjt.sp.util.Log;
/**
* A dialog for choosing fonts.
*
* @author Slava Pestov
* @version $Id$
* @since jEdit 4.4pre1
*/
public class FontSelectorDialog extends EnhancedDialog
{
//{{{ FontSelectorDialog constructor
public FontSelectorDialog(Frame parent,
Font font)
{
super(parent,jEdit.getProperty("font-selector.title"),true);
init(font);
} //}}}
//{{{ FontSelectorDialog constructor
public FontSelectorDialog(Dialog parent,
Font font)
{
super(parent,jEdit.getProperty("font-selector.title"),true);
init(font);
} //}}}
//{{{ FontSelectorDialog constructor
FontSelectorDialog(Frame parent,
Font font,
FontSelector fontSelector)
{
super(parent,jEdit.getProperty("font-selector.title"),true);
this.fontSelector = fontSelector;
init(font);
} //}}}
//{{{ FontSelectorDialog constructor
FontSelectorDialog(Dialog parent,
Font font,
FontSelector fontSelector)
{
super(parent,jEdit.getProperty("font-selector.title"),true);
this.fontSelector = fontSelector;
init(font);
} //}}}
//{{{ ok() method
public void ok()
{
isOK = true;
dispose();
} //}}}
//{{{ cancel() method
public void cancel()
{
dispose();
} //}}}
//{{{ getSelectedFont() method
public Font getSelectedFont()
{
if(!isOK)
return null;
int size;
try
{
size = Integer.parseInt(sizeField.getText());
}
catch(Exception e)
{
size = 12;
}
return new Font(familyField.getText(),styleList
.getSelectedIndex(),size);
} //}}}
//{{{ Private members
//{{{ Instance variables
private FontSelector fontSelector;
private boolean isOK;
private JTextField familyField;
private JList<String> familyList;
private JTextField sizeField;
private JList<String> sizeList;
private JTextField styleField;
private JList<String> styleList;
private JLabel preview;
private JButton ok;
private JButton cancel;
//}}}
/**
* For some reason the default Java fonts show up in the
* list with .bold, .bolditalic, and .italic extensions.
*/
private static final String[] HIDEFONTS = {
".bold",
".italic"
};
//{{{ init() method
private void init(Font font)
{
JPanel content = new JPanel(new BorderLayout());
content.setBorder(new EmptyBorder(12,12,12,12));
setContentPane(content);
JPanel listPanel = new JPanel(new GridLayout(1,3,6,6));
String[] fonts;
try
{
fonts = getFontList();
}
catch(Exception e)
{
Log.log(Log.ERROR,this,"Broken Java implementation!");
/* Log.log(Log.ERROR,this,"Using deprecated Toolkit.getFontList()"); */
Log.log(Log.ERROR,this,e);
/* fonts = getToolkit().getFontList(); */
fonts = new String[] { "Broken Java implementation!" };
}
JPanel familyPanel = createTextFieldAndListPanel(
"font-selector.family",
familyField = new JTextField(),
familyList = new JList<String>(fonts));
listPanel.add(familyPanel);
String[] sizes = { "9", "10", "12", "14", "16", "18", "24", "30", "36", "42" };
JPanel sizePanel = createTextFieldAndListPanel(
"font-selector.size",
sizeField = new JTextField(),
sizeList = new JList<String>(sizes));
listPanel.add(sizePanel);
String[] styles = {
jEdit.getProperty("font-selector.plain"),
jEdit.getProperty("font-selector.bold"),
jEdit.getProperty("font-selector.italic"),
jEdit.getProperty("font-selector.bolditalic")
};
JPanel stylePanel = createTextFieldAndListPanel(
"font-selector.style",
styleField = new JTextField(),
styleList = new JList<String>(styles));
styleField.setEditable(false);
listPanel.add(stylePanel);
if (font != null)
{
familyList.setSelectedValue(font.getFamily(),true);
familyField.setText(font.getFamily());
sizeList.setSelectedValue(String.valueOf(font.getSize()),true);
sizeField.setText(String.valueOf(font.getSize()));
styleList.setSelectedIndex(font.getStyle());
}
else
{
sizeList.setSelectedValue("12", true);
styleList.setSelectedIndex(Font.PLAIN);
}
styleField.setText((String)styleList.getSelectedValue());
ListHandler listHandler = new ListHandler();
familyList.addListSelectionListener(listHandler);
sizeList.addListSelectionListener(listHandler);
styleList.addListSelectionListener(listHandler);
content.add(BorderLayout.NORTH,listPanel);
preview = new JLabel(jEdit.getProperty("font-selector.long-text"))
{
public void paintComponent(Graphics g)
{
if(fontSelector != null)
fontSelector.setAntiAliasEnabled(g);
super.paintComponent(g);
}
};
preview.setBorder(new TitledBorder(jEdit.getProperty(
"font-selector.preview")));
updatePreview();
Dimension prefSize = preview.getPreferredSize();
prefSize.height = 100;
preview.setPreferredSize(prefSize);
content.add(BorderLayout.CENTER,preview);
JPanel buttons = new JPanel();
buttons.setLayout(new BoxLayout(buttons,BoxLayout.X_AXIS));
buttons.setBorder(new EmptyBorder(17, 0, 0, 0));
ok = new JButton(jEdit.getProperty("common.ok"));
ok.addActionListener(new ActionHandler());
getRootPane().setDefaultButton(ok);
cancel = new JButton(jEdit.getProperty("common.cancel"));
cancel.addActionListener(new ActionHandler());
GenericGUIUtilities.makeSameSize(ok, cancel);
buttons.add(Box.createGlue());
buttons.add(ok);
buttons.add(Box.createHorizontalStrut(6));
buttons.add(cancel);
content.add(BorderLayout.SOUTH,buttons);
pack();
setLocationRelativeTo(getParent());
setVisible(true);
} //}}}
//{{{ getFontList() method
private static String[] getFontList()
{
String[] nameArray = GraphicsEnvironment
.getLocalGraphicsEnvironment()
.getAvailableFontFamilyNames();
List<String> nameVector = new ArrayList<String>(nameArray.length);
for(int i = 0; i < nameArray.length; i++)
{
int j;
for(j = 0; j < HIDEFONTS.length; j++)
{
if(nameArray[i].contains(HIDEFONTS[j]))
break;
}
if(j == HIDEFONTS.length)
nameVector.add(nameArray[i]);
}
String[] _array = new String[nameVector.size()];
return nameVector.toArray(_array);
} //}}}
//{{{ createTextFieldAndListPanel() method
private static JPanel createTextFieldAndListPanel(String label,
JTextField textField, JList list)
{
GridBagLayout layout = new GridBagLayout();
JPanel panel = new JPanel(layout);
GridBagConstraints cons = new GridBagConstraints();
cons.gridx = cons.gridy = 0;
cons.gridwidth = cons.gridheight = 1;
cons.fill = GridBagConstraints.BOTH;
cons.weightx = 1.0f;
JLabel _label = new JLabel(jEdit.getProperty(label));
layout.setConstraints(_label,cons);
panel.add(_label);
cons.gridy = 1;
Component vs = Box.createVerticalStrut(6);
layout.setConstraints(vs,cons);
panel.add(vs);
cons.gridy = 2;
layout.setConstraints(textField,cons);
panel.add(textField);
cons.gridy = 3;
vs = Box.createVerticalStrut(6);
layout.setConstraints(vs,cons);
panel.add(vs);
cons.gridy = 4;
cons.gridheight = GridBagConstraints.REMAINDER;
cons.weighty = 1.0f;
JScrollPane scroller = new JScrollPane(list);
layout.setConstraints(scroller,cons);
panel.add(scroller);
return panel;
} //}}}
//{{{ updatePreview() method
private void updatePreview()
{
String family = familyField.getText();
int size;
try
{
size = Integer.parseInt(sizeField.getText());
}
catch(Exception e)
{
size = 12;
}
int style = styleList.getSelectedIndex();
preview.setFont(new Font(family,style,size));
} //}}}
//}}}
//{{{ ActionHandler class
class ActionHandler implements ActionListener
{
public void actionPerformed(ActionEvent evt)
{
if(evt.getSource() == ok)
ok();
else if(evt.getSource() == cancel)
cancel();
}
} //}}}
//{{{ ListHandler class
class ListHandler implements ListSelectionListener
{
public void valueChanged(ListSelectionEvent evt)
{
Object source = evt.getSource();
if(source == familyList)
{
String family = (String)familyList.getSelectedValue();
if(family != null)
familyField.setText(family);
}
else if(source == sizeList)
{
String size = (String)sizeList.getSelectedValue();
if(size != null)
sizeField.setText(size);
}
else if(source == styleList)
{
String style = (String)styleList.getSelectedValue();
if(style != null)
styleField.setText(style);
}
updatePreview();
}
} //}}}
}