/* * Copyright (C) 2007 Clam <clamisgood@gmail.com> * Copyright (C) 2008 IsmAvatar <IsmAvatar@gmail.com> * Copyright (C) 2008, 2009 Quadduc <quadduc@gmail.com> * * This file is part of LateralGM. * LateralGM is free software and comes with ABSOLUTELY NO WARRANTY. * See LICENSE for details. */ package org.lateralgm.subframes; import static java.lang.Integer.MAX_VALUE; import static javax.swing.GroupLayout.DEFAULT_SIZE; import java.awt.BorderLayout; import java.awt.GraphicsEnvironment; import java.awt.event.ActionEvent; import javax.swing.BorderFactory; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingConstants; import javax.swing.GroupLayout.Alignment; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.lateralgm.components.NumberField; import org.lateralgm.components.impl.ResNode; import org.lateralgm.messages.Messages; import org.lateralgm.resources.Font; import org.lateralgm.resources.Font.PFont; import org.lateralgm.ui.swing.propertylink.ComboBoxLink.IndexComboBoxConversion; import org.lateralgm.util.PropertyMap.PropertyUpdateEvent; import org.lateralgm.util.PropertyMap.PropertyUpdateListener; public class FontFrame extends ResourceFrame<Font,PFont> { private static final long serialVersionUID = 1L; public JComboBox fonts; public NumberField size; public JCheckBox italic, bold; public JComboBox aa; public NumberField charMin, charMax; public JLabel preview; public JTextField previewText; private FontPropertyListener fpl = new FontPropertyListener(); public FontFrame(Font res, ResNode node) { super(res,node); res.properties.updateSource.addListener(fpl); setResizable(false); setMaximizable(false); GroupLayout layout = new GroupLayout(getContentPane()); layout.setAutoCreateGaps(true); layout.setAutoCreateContainerGaps(true); setLayout(layout); JLabel lName = new JLabel(Messages.getString("FontFrame.NAME")); //$NON-NLS-1$ JLabel lFont = new JLabel(Messages.getString("FontFrame.FONT")); //$NON-NLS-1$ fonts = new JComboBox( GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames()); fonts.setEditable(true); plf.make(fonts,PFont.FONT_NAME,null); JLabel lSize = new JLabel(Messages.getString("FontFrame.SIZE")); //$NON-NLS-1$ size = new NumberField(1,99); plf.make(size,PFont.SIZE); bold = new JCheckBox(Messages.getString("FontFrame.BOLD")); //$NON-NLS-1$ plf.make(bold,PFont.BOLD); italic = new JCheckBox(Messages.getString("FontFrame.ITALIC")); //$NON-NLS-1$ plf.make(italic,PFont.ITALIC); String aaprefix = "FontFrame.AA"; //$NON-NLS-1$ String aalevels[] = new String[4]; for (int i = 0; i < aalevels.length; i++) aalevels[i] = Messages.getString(aaprefix + i); aa = new JComboBox(aalevels); plf.make(aa,PFont.ANTIALIAS,new IndexComboBoxConversion()); JLabel aaLabel = new JLabel(Messages.getString("FontFrame.ANTIALIAS")); //$NON-NLS-1$ // aa.addActionListener(this); JPanel crPane = makeCRPane(); JLabel lPreview = new JLabel(Messages.getString("FontFrame.PREVIEW")); //$NON-NLS-1$ previewText = new JTextField(Messages.getString("FontFrame.PREVIEW_DEFAULT")); previewText.setColumns(10); previewText.getDocument().addDocumentListener(new DocumentListener() { public void changedUpdate(DocumentEvent e) { } public void insertUpdate(DocumentEvent e) { preview.setText(previewText.getText()); } public void removeUpdate(DocumentEvent e) { preview.setText(previewText.getText()); } }); JPanel prev = new JPanel(new BorderLayout()); prev.setBorder(BorderFactory.createEtchedBorder()); preview = new JLabel(previewText.getText()); preview.setHorizontalAlignment(SwingConstants.CENTER); prev.add(preview,"Center"); //$NON-NLS-1$ updatePreview(); save.setText(Messages.getString("FontFrame.SAVE")); //$NON-NLS-1$ layout.setHorizontalGroup(layout.createParallelGroup() /**/.addGroup(layout.createSequentialGroup() /* */.addGroup(layout.createParallelGroup(Alignment.TRAILING) /* */.addComponent(lName) /* */.addComponent(lFont) /* */.addComponent(lSize)) /* */.addGroup(layout.createParallelGroup() /* */.addComponent(name,DEFAULT_SIZE,120,MAX_VALUE) /* */.addComponent(fonts,120,160,MAX_VALUE) /* */.addComponent(size))) /**/.addGroup(layout.createSequentialGroup() /* */.addComponent(bold) /* */.addComponent(italic) /* */.addComponent(aa).addComponent(aaLabel)) /**/.addComponent(crPane) /**/.addGroup(layout.createSequentialGroup() /* */.addComponent(lPreview) /* */.addComponent(previewText)) /**/.addComponent(prev,120,220,MAX_VALUE) /**/.addComponent(save,DEFAULT_SIZE,DEFAULT_SIZE,MAX_VALUE)); layout.setVerticalGroup(layout.createSequentialGroup() /**/.addGroup(layout.createParallelGroup(Alignment.BASELINE) /* */.addComponent(lName) /* */.addComponent(name)) /**/.addGroup(layout.createParallelGroup(Alignment.BASELINE) /* */.addComponent(lFont) /* */.addComponent(fonts)) /**/.addGroup(layout.createParallelGroup(Alignment.BASELINE) /* */.addComponent(lSize) /* */.addComponent(size)) /**/.addGroup(layout.createParallelGroup(Alignment.BASELINE) /* */.addComponent(bold) /* */.addComponent(italic) /* */.addComponent(aa).addComponent(aaLabel)) /**/.addComponent(crPane) /**/.addGroup(layout.createParallelGroup(Alignment.BASELINE) /* */.addComponent(lPreview) /* */.addComponent(previewText)) /**/.addComponent(prev,DEFAULT_SIZE,120,MAX_VALUE) /**/.addComponent(save)); pack(); } private JPanel makeCRPane() { JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder(Messages.getString("FontFrame.CHARRANGE"))); GroupLayout layout = new GroupLayout(panel); layout.setAutoCreateGaps(true); layout.setAutoCreateContainerGaps(true); panel.setLayout(layout); charMin = new NumberField(0,255); charMin.setCommitsOnValidEdit(false); plf.make(charMin,PFont.RANGE_MIN); JLabel lTo = new JLabel(Messages.getString("FontFrame.TO")); //$NON-NLS-1$ charMax = new NumberField(0,255); charMax.setCommitsOnValidEdit(false); plf.make(charMax,PFont.RANGE_MAX); JButton crNormal = new JButton(Messages.getString("FontFrame.NORMAL")); //$NON-NLS-1$ crNormal.setActionCommand("Normal"); //$NON-NLS-1$ crNormal.addActionListener(this); JButton crAll = new JButton(Messages.getString("FontFrame.ALL")); //$NON-NLS-1$ crAll.setActionCommand("All"); //$NON-NLS-1$ crAll.addActionListener(this); JButton crDigits = new JButton(Messages.getString("FontFrame.DIGITS")); //$NON-NLS-1$ crDigits.setActionCommand("Digits"); //$NON-NLS-1$ crDigits.addActionListener(this); JButton crLetters = new JButton(Messages.getString("FontFrame.LETTERS")); //$NON-NLS-1$ crLetters.setActionCommand("Letters"); //$NON-NLS-1$ crLetters.addActionListener(this); layout.setHorizontalGroup(layout.createParallelGroup() /**/.addGroup(layout.createSequentialGroup() /* */.addComponent(charMin) /* */.addComponent(lTo) /* */.addComponent(charMax)) /**/.addGroup(layout.createSequentialGroup() /* */.addGroup(layout.createParallelGroup() /* */.addComponent(crNormal,DEFAULT_SIZE,DEFAULT_SIZE,MAX_VALUE) /* */.addComponent(crDigits,DEFAULT_SIZE,DEFAULT_SIZE,MAX_VALUE)) /* */.addGroup(layout.createParallelGroup() /* */.addComponent(crAll,DEFAULT_SIZE,DEFAULT_SIZE,MAX_VALUE) /* */.addComponent(crLetters,DEFAULT_SIZE,DEFAULT_SIZE,MAX_VALUE)))); layout.setVerticalGroup(layout.createSequentialGroup() /**/.addGroup(layout.createParallelGroup(Alignment.BASELINE) /* */.addComponent(charMin) /* */.addComponent(lTo) /* */.addComponent(charMax)) /**/.addGroup(layout.createSequentialGroup() /* */.addGroup(layout.createParallelGroup() /* */.addComponent(crNormal) /* */.addComponent(crAll)) /* */.addGroup(layout.createParallelGroup() /* */.addComponent(crDigits) /* */.addComponent(crLetters)))); return panel; } public void commitChanges() { charMin.commitOrRevert(); charMax.commitOrRevert(); res.setName(name.getText()); } public void actionPerformed(ActionEvent e) { if (e.getActionCommand() == "Normal") //$NON-NLS-1$ { res.setRange(32,127); return; } if (e.getActionCommand() == "All") //$NON-NLS-1$ { res.setRange(0,255); return; } if (e.getActionCommand() == "Digits") //$NON-NLS-1$ { res.setRange(48,57); return; } if (e.getActionCommand() == "Letters") //$NON-NLS-1$ { res.setRange(65,122); return; } super.actionPerformed(e); } public void updatePreview() { int s = res.get(PFont.SIZE); String fn = res.get(PFont.FONT_NAME); boolean b = res.get(PFont.BOLD); boolean i = res.get(PFont.ITALIC); /* Java assumes 72 dpi, but we shouldn't depend on the native resolution either. * For consistent pixel size across different systems, we should pick a common default. * AFAIK, the default in Windows (and thus GM) is 96 dpi. */ int fontSize = (int) Math.round(s * 96.0 / 72.0); preview.setFont(new java.awt.Font(fn,makeStyle(b,i),fontSize)); } public static int makeStyle(boolean bold, boolean italic) { return (italic ? java.awt.Font.ITALIC : 0) | (bold ? java.awt.Font.BOLD : 0); } private class FontPropertyListener extends PropertyUpdateListener<PFont> { public void updated(PropertyUpdateEvent<PFont> e) { switch (e.key) { case RANGE_MIN: case RANGE_MAX: break; default: updatePreview(); } } } }