]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/actions/style/FontChooser.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / actions / style / FontChooser.java
diff --git a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/actions/style/FontChooser.java b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/actions/style/FontChooser.java
new file mode 100644 (file)
index 0000000..d762947
--- /dev/null
@@ -0,0 +1,192 @@
+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