-package org.simantics.modeling.ui.actions.style;\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.Color;\r
-import java.awt.Component;\r
-import java.awt.Dimension;\r
-import java.awt.Font;\r
-import java.awt.GraphicsEnvironment;\r
-import java.awt.event.ActionEvent;\r
-import java.awt.event.ActionListener;\r
-\r
-import javax.swing.BorderFactory;\r
-import javax.swing.JCheckBox;\r
-import javax.swing.JComboBox;\r
-import javax.swing.JLabel;\r
-import javax.swing.JList;\r
-import javax.swing.JPanel;\r
-import javax.swing.JScrollPane;\r
-import javax.swing.ListCellRenderer;\r
-import javax.swing.ListSelectionModel;\r
-import javax.swing.SwingConstants;\r
-import javax.swing.event.ListSelectionEvent;\r
-import javax.swing.event.ListSelectionListener;\r
-\r
-@SuppressWarnings({"rawtypes", "unchecked"})\r
-public class FontChooser extends JPanel {\r
-\r
- private static final long serialVersionUID = -53650261362110193L;\r
-\r
- private static Font DEFAULT_FONT = new Font("Arial", Font.PLAIN, 16);\r
-\r
- private String sampleText;\r
- private JLabel text;\r
-\r
- private JList fontList;\r
- private JComboBox sizeComboBox;\r
- private JCheckBox boldCheckBox;\r
- private JCheckBox italicCheckBox;\r
-\r
- private String fonts[];\r
-\r
- private Font originalFont;\r
- private Font font;\r
-\r
- public FontChooser(String sampleText) {\r
- super();\r
-\r
- this.sampleText = sampleText;\r
- JPanel textPanel = new JPanel();\r
- text = new JLabel(sampleText, SwingConstants.CENTER);\r
- text.setVerticalAlignment(SwingConstants.CENTER);\r
- this.setLayout(new BorderLayout());\r
- textPanel.setBorder(BorderFactory.createLineBorder(Color.darkGray));\r
- textPanel.add(text);\r
- textPanel.setMinimumSize(new Dimension(100, 100));\r
- textPanel.setPreferredSize(new Dimension(200, 100));\r
- this.add(textPanel,BorderLayout.NORTH);\r
-\r
- GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();\r
- String[] ff = ge.getAvailableFontFamilyNames();\r
- fonts = new String[ff.length + 1];\r
- fonts[0] = "-- keep current font --";\r
- System.arraycopy(ff, 0, fonts, 1, ff.length);\r
-\r
- fontList = new JList(fonts);\r
- fontList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
- fontList.setLayoutOrientation(JList.VERTICAL);\r
- fontList.setVisibleRowCount(-1);\r
-\r
- fontList.addListSelectionListener(new ListSelectionListener() {\r
-\r
- @Override\r
- public void valueChanged(ListSelectionEvent e) {\r
- if (!e.getValueIsAdjusting()) {\r
- int index = fontList.getSelectedIndex();\r
- if (index != -1) {\r
- selectFont(index);\r
- }\r
- }\r
- }\r
- });\r
-\r
- fontList.setCellRenderer(new FontListRenderer());\r
-\r
-\r
- JScrollPane listScrollPane = new JScrollPane(fontList);\r
- listScrollPane.setPreferredSize(new Dimension(400, 200));\r
- this.add(listScrollPane, BorderLayout.CENTER);\r
-\r
- JPanel controlPanel = new JPanel();\r
- this.add(controlPanel,BorderLayout.SOUTH);\r
-\r
- ActionListener listener = new ActionListener() {\r
- @Override\r
- public void actionPerformed(ActionEvent e) {\r
- selectFont(fontList.getSelectedIndex());\r
- }\r
- };\r
-\r
- // FIXME: hack\r
- Integer[] sizes = {4, 6, 7, 8, 9, 10, 11, 12, 14, 18, 20, 22, 24, 36, 40, 48, 56, 64, 72, 144};\r
- sizeComboBox = new JComboBox(sizes);\r
- sizeComboBox.addActionListener(listener);\r
- sizeComboBox.setSelectedIndex(7);\r
- controlPanel.add(new JLabel("Size: "));\r
- controlPanel.add(sizeComboBox);\r
-\r
- boldCheckBox = new JCheckBox("Bold");\r
- boldCheckBox.addActionListener(listener);\r
- controlPanel.add(boldCheckBox);\r
-\r
- italicCheckBox = new JCheckBox("Italic");\r
- italicCheckBox.addActionListener(listener);\r
- controlPanel.add(italicCheckBox);\r
-\r
- fontList.setSelectedIndex(0);\r
- }\r
-\r
- private void selectFont(int index) {\r
- if (index < 0)\r
- return;\r
- String name = fonts[index];\r
- Integer size = (Integer)sizeComboBox.getSelectedItem();\r
- int style = Font.PLAIN; // plain == 0\r
- if (boldCheckBox.isSelected())\r
- style = style | Font.BOLD;\r
- if (italicCheckBox.isSelected())\r
- style = style | Font.ITALIC;\r
- Font original = originalFont != null ? originalFont : DEFAULT_FONT;\r
- // Index 0 is reserved for keeping the original font (family)\r
- Font f = index == 0 ? original.deriveFont(style, size) : new Font(name, style, size);\r
- font = !f.equals(original) ? f : null;\r
- text.setText(sampleText);\r
- text.setFont(f);\r
- }\r
-\r
- public Font getFont() {\r
- return font;\r
- }\r
-\r
- public void setCurrentFont(Font font) {\r
- int index = -1;\r
- for (int i = 0; i < fonts.length; i++) {\r
- if (fonts[i].equals(font.getFamily())) {\r
- index = i;\r
- break;\r
- }\r
- }\r
- if (index == -1)\r
- return;\r
- fontList.setSelectedIndex(index);\r
- fontList.scrollRectToVisible(fontList.getCellBounds(index, index));\r
- boldCheckBox.setSelected((font.getStyle() & Font.BOLD) > 0);\r
- italicCheckBox.setSelected((font.getStyle() & Font.ITALIC) > 0);\r
- sizeComboBox.setSelectedItem(font.getSize());\r
- this.originalFont = font;\r
- selectFont(index);\r
- }\r
-\r
- public class FontListRenderer extends JLabel implements ListCellRenderer {\r
-\r
- private static final long serialVersionUID = 1237633327794383545L;\r
-\r
- public FontListRenderer() {\r
- setOpaque(true);\r
- setHorizontalAlignment(LEFT);\r
- setVerticalAlignment(CENTER);\r
- };\r
-\r
- @Override\r
- public Component getListCellRendererComponent(JList list, Object value,\r
- int index, boolean isSelected, boolean cellHasFocus) {\r
- if (isSelected) {\r
- setBackground(list.getSelectionBackground());\r
- setForeground(list.getSelectionForeground());\r
- } else {\r
- setBackground(list.getBackground());\r
- setForeground(list.getForeground());\r
- }\r
-\r
- String text = (String) value;\r
- setText(text);\r
-\r
- // Not really that helpful when one can't even read the name of\r
- // some fonts with the sample text. Also keeps the list visually cleaner.\r
- // Thus removed.\r
- //setFont(index > 0 ? new Font(text,Font.PLAIN,16) : DEFAULT_FONT);\r
-\r
- return this;\r
- }\r
- }\r
-}\r
+package org.simantics.modeling.ui.actions.style;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.GraphicsEnvironment;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.BorderFactory;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.ListCellRenderer;
+import javax.swing.ListSelectionModel;
+import javax.swing.SwingConstants;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+
+@SuppressWarnings({"rawtypes", "unchecked"})
+public class FontChooser extends JPanel {
+
+ private static final long serialVersionUID = -53650261362110193L;
+
+ private static Font DEFAULT_FONT = new Font("Arial", Font.PLAIN, 16);
+
+ private String sampleText;
+ private JLabel text;
+
+ private JList fontList;
+ private JComboBox sizeComboBox;
+ private JCheckBox boldCheckBox;
+ private JCheckBox italicCheckBox;
+
+ private String fonts[];
+
+ private Font originalFont;
+ private Font font;
+
+ public FontChooser(String sampleText) {
+ super();
+
+ this.sampleText = sampleText;
+ JPanel textPanel = new JPanel();
+ text = new JLabel(sampleText, SwingConstants.CENTER);
+ text.setVerticalAlignment(SwingConstants.CENTER);
+ this.setLayout(new BorderLayout());
+ textPanel.setBorder(BorderFactory.createLineBorder(Color.darkGray));
+ textPanel.add(text);
+ textPanel.setMinimumSize(new Dimension(100, 100));
+ textPanel.setPreferredSize(new Dimension(200, 100));
+ this.add(textPanel,BorderLayout.NORTH);
+
+ GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
+ String[] ff = ge.getAvailableFontFamilyNames();
+ fonts = new String[ff.length + 1];
+ fonts[0] = "-- keep current font --";
+ System.arraycopy(ff, 0, fonts, 1, ff.length);
+
+ fontList = new JList(fonts);
+ fontList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+ fontList.setLayoutOrientation(JList.VERTICAL);
+ fontList.setVisibleRowCount(-1);
+
+ fontList.addListSelectionListener(new ListSelectionListener() {
+
+ @Override
+ public void valueChanged(ListSelectionEvent e) {
+ if (!e.getValueIsAdjusting()) {
+ int index = fontList.getSelectedIndex();
+ if (index != -1) {
+ selectFont(index);
+ }
+ }
+ }
+ });
+
+ fontList.setCellRenderer(new FontListRenderer());
+
+
+ JScrollPane listScrollPane = new JScrollPane(fontList);
+ listScrollPane.setPreferredSize(new Dimension(400, 200));
+ this.add(listScrollPane, BorderLayout.CENTER);
+
+ JPanel controlPanel = new JPanel();
+ this.add(controlPanel,BorderLayout.SOUTH);
+
+ ActionListener listener = new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ selectFont(fontList.getSelectedIndex());
+ }
+ };
+
+ // FIXME: hack
+ Integer[] sizes = {4, 6, 7, 8, 9, 10, 11, 12, 14, 18, 20, 22, 24, 36, 40, 48, 56, 64, 72, 144};
+ sizeComboBox = new JComboBox(sizes);
+ sizeComboBox.addActionListener(listener);
+ sizeComboBox.setSelectedIndex(7);
+ controlPanel.add(new JLabel("Size: "));
+ controlPanel.add(sizeComboBox);
+
+ boldCheckBox = new JCheckBox("Bold");
+ boldCheckBox.addActionListener(listener);
+ controlPanel.add(boldCheckBox);
+
+ italicCheckBox = new JCheckBox("Italic");
+ italicCheckBox.addActionListener(listener);
+ controlPanel.add(italicCheckBox);
+
+ fontList.setSelectedIndex(0);
+ }
+
+ private void selectFont(int index) {
+ if (index < 0)
+ return;
+ String name = fonts[index];
+ Integer size = (Integer)sizeComboBox.getSelectedItem();
+ int style = Font.PLAIN; // plain == 0
+ if (boldCheckBox.isSelected())
+ style = style | Font.BOLD;
+ if (italicCheckBox.isSelected())
+ style = style | Font.ITALIC;
+ Font original = originalFont != null ? originalFont : DEFAULT_FONT;
+ // Index 0 is reserved for keeping the original font (family)
+ Font f = index == 0 ? original.deriveFont(style, size) : new Font(name, style, size);
+ font = !f.equals(original) ? f : null;
+ text.setText(sampleText);
+ text.setFont(f);
+ }
+
+ public Font getFont() {
+ return font;
+ }
+
+ public void setCurrentFont(Font font) {
+ int index = -1;
+ for (int i = 0; i < fonts.length; i++) {
+ if (fonts[i].equals(font.getFamily())) {
+ index = i;
+ break;
+ }
+ }
+ if (index == -1)
+ return;
+ fontList.setSelectedIndex(index);
+ fontList.scrollRectToVisible(fontList.getCellBounds(index, index));
+ boldCheckBox.setSelected((font.getStyle() & Font.BOLD) > 0);
+ italicCheckBox.setSelected((font.getStyle() & Font.ITALIC) > 0);
+ sizeComboBox.setSelectedItem(font.getSize());
+ this.originalFont = font;
+ selectFont(index);
+ }
+
+ public class FontListRenderer extends JLabel implements ListCellRenderer {
+
+ private static final long serialVersionUID = 1237633327794383545L;
+
+ public FontListRenderer() {
+ setOpaque(true);
+ setHorizontalAlignment(LEFT);
+ setVerticalAlignment(CENTER);
+ };
+
+ @Override
+ public Component getListCellRendererComponent(JList list, Object value,
+ int index, boolean isSelected, boolean cellHasFocus) {
+ if (isSelected) {
+ setBackground(list.getSelectionBackground());
+ setForeground(list.getSelectionForeground());
+ } else {
+ setBackground(list.getBackground());
+ setForeground(list.getForeground());
+ }
+
+ String text = (String) value;
+ setText(text);
+
+ // Not really that helpful when one can't even read the name of
+ // some fonts with the sample text. Also keeps the list visually cleaner.
+ // Thus removed.
+ //setFont(index > 0 ? new Font(text,Font.PLAIN,16) : DEFAULT_FONT);
+
+ return this;
+ }
+ }
+}