// GraphTea Project: http://github.com/graphtheorysoftware/GraphTea
// Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com
// Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology
// Distributed under the terms of the GNU General Public License (GPL): http://www.gnu.org/licenses/

package graphtea.ui.components.gpropertyeditor.utils;

import java.util.List;
import javax.swing.*;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.ActionListener;

public class JFontChooser extends JComponent {
    /**
     *
     */
    private static final long serialVersionUID = 660143495474577287L;
    public static int OK_OPTION = 0;
    public static int CANCEL_OPTION = 1;

    private final JList<String> fontList;
    private final JList<String> sizeList;
    private final JCheckBox cbBold;
    private final JCheckBox cbItalic;
    private final JTextArea txtSample;

    private final String[] sizes = new String[]
            {"2", "4", "6", "8", "10", "12", "13", "14", "16", "18", "20", "22", "24", "30", "36", "48", "72"};

    public JFontChooser() {
        // create all components

        fontList = new JList<String>(GraphicsEnvironment.getLocalGraphicsEnvironment().
                getAvailableFontFamilyNames()) {
            private static final long serialVersionUID = 2307765155498619149L;

            public Dimension getPreferredScrollableViewportSize() {
                return new Dimension(150, 144);
            }
        };
        fontList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);


        sizeList = new JList<String>(sizes) {
            private static final long serialVersionUID = -2474666139561694389L;

            public Dimension getPreferredScrollableViewportSize() {
                return new Dimension(25, 144);
            }
        };
        sizeList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);


        cbBold = new JCheckBox("Bold");

        cbItalic = new JCheckBox("Italic");


        txtSample = new JTextArea() {
            /**
             *
             */
            private static final long serialVersionUID = 1805024865116989603L;

            public Dimension getPreferredScrollableViewportSize() {
                return new Dimension(385, 80);
            }

            public void paint(Graphics g) {
                ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
                super.paint(g);
            }
        };
        txtSample.setText("The quick brown fox jumped over the fence");

        // set the default font

        setFont(null);

        // add the listeners

        ListSelectionListener listListener = e -> txtSample.setFont(getCurrentFont());

        fontList.addListSelectionListener(listListener);
        sizeList.addListSelectionListener(listListener);


        ActionListener cbListener = e -> txtSample.setFont(getCurrentFont());

        cbBold.addActionListener(cbListener);
        cbItalic.addActionListener(cbListener);

        // build the container

        setLayout(new java.awt.BorderLayout());

        JPanel leftPanel = new JPanel();
        leftPanel.setLayout(new java.awt.BorderLayout());

        leftPanel.add(new JScrollPane(fontList), java.awt.BorderLayout.CENTER);
        leftPanel.add(new JScrollPane(sizeList), java.awt.BorderLayout.EAST);

        add(leftPanel, java.awt.BorderLayout.CENTER);


        JPanel rightPanel = new JPanel();
        rightPanel.setLayout(new java.awt.BorderLayout());

        JPanel rightPanelSub1 = new JPanel();
        rightPanelSub1.setLayout(new java.awt.FlowLayout());

        rightPanelSub1.add(cbBold);
        rightPanelSub1.add(cbItalic);

        rightPanel.add(rightPanelSub1, java.awt.BorderLayout.NORTH);

        JPanel rightPanelSub2 = new JPanel();
        rightPanelSub2.setLayout(new java.awt.GridLayout(2, 1));

        rightPanel.add(rightPanelSub2, java.awt.BorderLayout.SOUTH);

        add(rightPanel, java.awt.BorderLayout.EAST);

        add(new JScrollPane(txtSample), java.awt.BorderLayout.SOUTH);

        setSize(200, 200);
    }

    public void setFont(Font font) {
        if (font == null) font = txtSample.getFont();

        fontList.setSelectedValue(font.getName(), true);
        fontList.ensureIndexIsVisible(fontList.getSelectedIndex());
        sizeList.setSelectedValue("" + font.getSize(), true);
        sizeList.ensureIndexIsVisible(sizeList.getSelectedIndex());

        cbBold.setSelected(font.isBold());
        cbItalic.setSelected(font.isItalic());
    }

    public Font getFont() {
        return getCurrentFont();
    }

    private Font getCurrentFont() {
        String fontFamily = (String) fontList.getSelectedValue();
        int fontSize=24;
        if(sizeList.getSelectedValue()!=null)
          fontSize = Integer.parseInt((String) sizeList.getSelectedValue());

        int fontType = Font.PLAIN;

        if (cbBold.isSelected()) fontType += Font.BOLD;
        if (cbItalic.isSelected()) fontType += Font.ITALIC;

        return new Font(fontFamily, fontType, fontSize);
    }
}