+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