/*
 * Copyright (C) 2017 patrick
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package screenstudio.panel.editor;

import java.awt.Color;
import screenstudio.gui.LabelText;
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JMenuItem;
import javax.swing.JSeparator;
import screenstudio.sources.SourceText;
import screenstudio.targets.Source.View;

/**
 *
 * @author patrick
 */
public class TextEditor extends javax.swing.JDialog {

    private final TextViewer mTextViewer;
    private final SourceText mSource;
    private final LabelText mText;

    /**
     * Creates new form TextEditor
     *
     * @param width
     * @param height
     * @param text
     * @param parent
     * @param modal
     */
    public TextEditor(int width, int height, LabelText text, java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        this.setIconImage(parent.getIconImage());
        mText = text;
        Rectangle r = new Rectangle(width, height);
        ArrayList<View> views = new ArrayList<>();
        View v = new View();
        v.Height = height;
        v.Width = width;
        views.add(v);
        slideFontSize.setValue(text.getFontSize());

        setControls();
        txtText.setText(text.getText());
        cboFonts.setSelectedItem(text.getFontName());

        slideFGRed.setValue(new Color(text.getForegroundColor()).getRed());
        slideFGGreen.setValue(new Color(text.getForegroundColor()).getGreen());
        slideFGBlue.setValue(new Color(text.getForegroundColor()).getBlue());
        slideFGAlpha.setValue(new Color(text.getForegroundColor(), true).getAlpha());

        slideBGRed.setValue(new Color(text.getBackgroundColor()).getRed());
        slideBGGreen.setValue(new Color(text.getBackgroundColor()).getGreen());
        slideBGBlue.setValue(new Color(text.getBackgroundColor()).getBlue());
        slideBGAlpha.setValue(new Color(text.getBackgroundColor(), true).getAlpha());

        slideBGRedArea.setValue(new Color(text.getBackgroundAreaColor()).getRed());
        slideBGGreenArea.setValue(new Color(text.getBackgroundAreaColor()).getGreen());
        slideBGBlueArea.setValue(new Color(text.getBackgroundAreaColor()).getBlue());
        slideBGAlphaArea.setValue(new Color(text.getBackgroundAreaColor(), true).getAlpha());

        mSource = new SourceText(views, text);
        mTextViewer = new TextViewer(mSource);
        mTextViewer.setOpaque(true);
        panViewer.add(mTextViewer, java.awt.BorderLayout.CENTER);
        panViewer.setPreferredSize(r.getSize());
        panViewer.setSize(r.getSize());
        mTextViewer.setSize(r.getSize());
        mTextViewer.setPreferredSize(r.getSize());

        pack();

    }

    private void setControls() {
        DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>(GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames());
        cboFonts.setModel(model);
        String[] tags = {"@CURRENTDATE", "@CURRENTTIME", "@STARTTIME", "@RECORDINGTIME", "@UPDATE 60 SEC@", "@UPDATE 5 MIN@", "@ONCHANGEONLY", "@ONELINER", "@SCROLLVERTICAL", "@SCROLLHORIZONTAL", "@TYPEWRITER", "", "file:///path/to/file.txt"};
        for (String t : tags) {
            if (t.length() > 0) {
                JMenuItem m = new JMenuItem(t);
                m.setActionCommand(t);
                m.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        txtText.insert(e.getActionCommand(), txtText.getCaretPosition());
                        mTextViewer.setText(txtText.getText());
                        mText.setText(txtText.getText());
                    }
                });
                mnuTags.add(m);
            } else {
                mnuTags.add(new JSeparator());
            }

        }
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        splitter = new javax.swing.JSplitPane();
        panEditor = new javax.swing.JPanel();
        textScroller = new javax.swing.JScrollPane();
        txtText = new javax.swing.JTextArea();
        cboFonts = new javax.swing.JComboBox<>();
        slideFontSize = new javax.swing.JSlider();
        tabsColor = new javax.swing.JTabbedPane();
        panFGGroup = new javax.swing.JPanel();
        slideFGRed = new javax.swing.JSlider();
        slideFGGreen = new javax.swing.JSlider();
        slideFGBlue = new javax.swing.JSlider();
        slideFGAlpha = new javax.swing.JSlider();
        panBGGroup = new javax.swing.JPanel();
        slideBGRed = new javax.swing.JSlider();
        slideBGGreen = new javax.swing.JSlider();
        slideBGBlue = new javax.swing.JSlider();
        slideBGAlpha = new javax.swing.JSlider();
        panBGGroupArea = new javax.swing.JPanel();
        slideBGRedArea = new javax.swing.JSlider();
        slideBGGreenArea = new javax.swing.JSlider();
        slideBGBlueArea = new javax.swing.JSlider();
        slideBGAlphaArea = new javax.swing.JSlider();
        scrollViewer = new javax.swing.JScrollPane();
        panViewer = new javax.swing.JPanel();
        jMenuBar1 = new javax.swing.JMenuBar();
        mnuTags = new javax.swing.JMenu();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("ScreenStudio Editor");
        setAlwaysOnTop(true);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }
        });

        splitter.setDividerLocation(300);

        txtText.setColumns(20);
        txtText.setRows(5);
        txtText.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                txtTextKeyPressed(evt);
            }
        });
        textScroller.setViewportView(txtText);

        cboFonts.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        cboFonts.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cboFontsActionPerformed(evt);
            }
        });

        slideFontSize.setMajorTickSpacing(32);
        slideFontSize.setMaximum(256);
        slideFontSize.setMinimum(8);
        slideFontSize.setMinorTickSpacing(8);
        slideFontSize.setPaintLabels(true);
        slideFontSize.setPaintTicks(true);
        slideFontSize.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                slideFontSizeMouseDragged(evt);
            }
        });
        slideFontSize.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                slideFontSizeMouseDragged(evt);
            }
        });

        panFGGroup.setLayout(new javax.swing.BoxLayout(panFGGroup, javax.swing.BoxLayout.PAGE_AXIS));

        slideFGRed.setMaximum(255);
        slideFGRed.setBorder(javax.swing.BorderFactory.createTitledBorder("Red"));
        slideFGRed.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                slideTextForegroundColor(evt);
            }
        });
        slideFGRed.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                slideTextForegroundColor(evt);
            }
        });
        panFGGroup.add(slideFGRed);

        slideFGGreen.setMaximum(255);
        slideFGGreen.setBorder(javax.swing.BorderFactory.createTitledBorder("Green"));
        slideFGGreen.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                slideTextForegroundColor(evt);
            }
        });
        slideFGGreen.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                slideTextForegroundColor(evt);
            }
        });
        panFGGroup.add(slideFGGreen);

        slideFGBlue.setMaximum(255);
        slideFGBlue.setBorder(javax.swing.BorderFactory.createTitledBorder("Blue"));
        slideFGBlue.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                slideTextForegroundColor(evt);
            }
        });
        slideFGBlue.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                slideTextForegroundColor(evt);
            }
        });
        panFGGroup.add(slideFGBlue);

        slideFGAlpha.setMaximum(255);
        slideFGAlpha.setValue(255);
        slideFGAlpha.setBorder(javax.swing.BorderFactory.createTitledBorder("Alpha"));
        slideFGAlpha.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                slideTextForegroundColor(evt);
            }
        });
        slideFGAlpha.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                slideTextForegroundColor(evt);
            }
        });
        panFGGroup.add(slideFGAlpha);

        tabsColor.addTab("Foreground", panFGGroup);

        panBGGroup.setLayout(new javax.swing.BoxLayout(panBGGroup, javax.swing.BoxLayout.Y_AXIS));

        slideBGRed.setMaximum(255);
        slideBGRed.setBorder(javax.swing.BorderFactory.createTitledBorder("Red"));
        slideBGRed.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                slideBGColor(evt);
            }
        });
        slideBGRed.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                slideBGColor(evt);
            }
        });
        panBGGroup.add(slideBGRed);

        slideBGGreen.setMaximum(255);
        slideBGGreen.setBorder(javax.swing.BorderFactory.createTitledBorder("Green"));
        slideBGGreen.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                slideBGColor(evt);
            }
        });
        slideBGGreen.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                slideBGColor(evt);
            }
        });
        panBGGroup.add(slideBGGreen);

        slideBGBlue.setMaximum(255);
        slideBGBlue.setBorder(javax.swing.BorderFactory.createTitledBorder("Blue"));
        slideBGBlue.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                slideBGColor(evt);
            }
        });
        slideBGBlue.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                slideBGColor(evt);
            }
        });
        panBGGroup.add(slideBGBlue);

        slideBGAlpha.setMaximum(255);
        slideBGAlpha.setValue(255);
        slideBGAlpha.setBorder(javax.swing.BorderFactory.createTitledBorder("Alpha"));
        slideBGAlpha.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                slideBGColor(evt);
            }
        });
        slideBGAlpha.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                slideBGColor(evt);
            }
        });
        panBGGroup.add(slideBGAlpha);

        tabsColor.addTab("Shadow", panBGGroup);

        panBGGroupArea.setLayout(new javax.swing.BoxLayout(panBGGroupArea, javax.swing.BoxLayout.Y_AXIS));

        slideBGRedArea.setMaximum(255);
        slideBGRedArea.setBorder(javax.swing.BorderFactory.createTitledBorder("Red"));
        slideBGRedArea.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                slideBGAreaColor(evt);
            }
        });
        slideBGRedArea.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                slideBGAreaColor(evt);
            }
        });
        panBGGroupArea.add(slideBGRedArea);

        slideBGGreenArea.setMaximum(255);
        slideBGGreenArea.setBorder(javax.swing.BorderFactory.createTitledBorder("Green"));
        slideBGGreenArea.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                slideBGAreaColor(evt);
            }
        });
        slideBGGreenArea.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                slideBGAreaColor(evt);
            }
        });
        panBGGroupArea.add(slideBGGreenArea);

        slideBGBlueArea.setMaximum(255);
        slideBGBlueArea.setBorder(javax.swing.BorderFactory.createTitledBorder("Blue"));
        slideBGBlueArea.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                slideBGAreaColor(evt);
            }
        });
        slideBGBlueArea.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                slideBGAreaColor(evt);
            }
        });
        panBGGroupArea.add(slideBGBlueArea);

        slideBGAlphaArea.setMaximum(255);
        slideBGAlphaArea.setValue(255);
        slideBGAlphaArea.setBorder(javax.swing.BorderFactory.createTitledBorder("Alpha"));
        slideBGAlphaArea.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                slideBGAreaColor(evt);
            }
        });
        slideBGAlphaArea.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                slideBGAreaColor(evt);
            }
        });
        panBGGroupArea.add(slideBGAlphaArea);

        tabsColor.addTab("Background", panBGGroupArea);

        javax.swing.GroupLayout panEditorLayout = new javax.swing.GroupLayout(panEditor);
        panEditor.setLayout(panEditorLayout);
        panEditorLayout.setHorizontalGroup(
            panEditorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panEditorLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panEditorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(textScroller, javax.swing.GroupLayout.DEFAULT_SIZE, 275, Short.MAX_VALUE)
                    .addComponent(cboFonts, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(slideFontSize, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(tabsColor))
                .addContainerGap())
        );
        panEditorLayout.setVerticalGroup(
            panEditorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panEditorLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(textScroller, javax.swing.GroupLayout.PREFERRED_SIZE, 143, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(cboFonts, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(slideFontSize, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(tabsColor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        splitter.setLeftComponent(panEditor);

        panViewer.setBackground(new java.awt.Color(0, 0, 0));
        panViewer.setLayout(new java.awt.BorderLayout());
        scrollViewer.setViewportView(panViewer);

        splitter.setRightComponent(scrollViewer);

        getContentPane().add(splitter, java.awt.BorderLayout.CENTER);

        mnuTags.setText("Tags");
        jMenuBar1.add(mnuTags);

        setJMenuBar(jMenuBar1);

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void txtTextKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtTextKeyPressed
        mTextViewer.setText((txtText.getText() + evt.getKeyChar()).trim());
        mText.setText((txtText.getText() + evt.getKeyChar()).trim());
    }//GEN-LAST:event_txtTextKeyPressed

    private void cboFontsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cboFontsActionPerformed
        if (mSource != null) {
            mSource.setFont(new Font(cboFonts.getSelectedItem().toString(), Font.PLAIN, slideFontSize.getValue()));
            mText.setFontName(cboFonts.getSelectedItem().toString());
        }
    }//GEN-LAST:event_cboFontsActionPerformed

    private void slideFontSizeMouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_slideFontSizeMouseDragged
        if (mSource != null) {
            mSource.setFont(new Font(cboFonts.getSelectedItem().toString(), Font.PLAIN, slideFontSize.getValue()));
            mText.setFontSize(slideFontSize.getValue());
        }
    }//GEN-LAST:event_slideFontSizeMouseDragged

    private void slideTextForegroundColor(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_slideTextForegroundColor
        setTextForeground();
    }//GEN-LAST:event_slideTextForegroundColor

    private void slideBGColor(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_slideBGColor
        setTextBackground();
    }//GEN-LAST:event_slideBGColor

    private void slideBGAreaColor(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_slideBGAreaColor
        setTextBackgroundArea();

    }//GEN-LAST:event_slideBGAreaColor

    private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
        try {
            mTextViewer.finalize();
        } catch (Throwable ex) {
            Logger.getLogger(TextEditor.class.getName()).log(Level.SEVERE, null, ex);
        }

    }//GEN-LAST:event_formWindowClosing

    private void setTextForeground() {
        if (mSource != null) {
            int c = (slideFGAlpha.getValue() << 24) + (slideFGRed.getValue() << 16) + (slideFGGreen.getValue() << 8) + slideFGBlue.getValue();
            mSource.setForeground(c);
            mText.setForegroundColor(c);
        }
    }

    private void setTextBackground() {
        if (mSource != null) {
            int c = (slideBGAlpha.getValue() << 24) + (slideBGRed.getValue() << 16) + (slideBGGreen.getValue() << 8) + slideBGBlue.getValue();
            mSource.setBackground(c);
            mText.setBackgroundColor(c);
        }
    }

    private void setTextBackgroundArea() {
        if (mSource != null) {
            int c = (slideBGAlphaArea.getValue() << 24) + (slideBGRedArea.getValue() << 16) + (slideBGGreenArea.getValue() << 8) + slideBGBlueArea.getValue();
            mSource.setBackgroundArea(c);
            mText.setBackgroundAreaColor(c);
        }
    }


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JComboBox<String> cboFonts;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenu mnuTags;
    private javax.swing.JPanel panBGGroup;
    private javax.swing.JPanel panBGGroupArea;
    private javax.swing.JPanel panEditor;
    private javax.swing.JPanel panFGGroup;
    private javax.swing.JPanel panViewer;
    private javax.swing.JScrollPane scrollViewer;
    private javax.swing.JSlider slideBGAlpha;
    private javax.swing.JSlider slideBGAlphaArea;
    private javax.swing.JSlider slideBGBlue;
    private javax.swing.JSlider slideBGBlueArea;
    private javax.swing.JSlider slideBGGreen;
    private javax.swing.JSlider slideBGGreenArea;
    private javax.swing.JSlider slideBGRed;
    private javax.swing.JSlider slideBGRedArea;
    private javax.swing.JSlider slideFGAlpha;
    private javax.swing.JSlider slideFGBlue;
    private javax.swing.JSlider slideFGGreen;
    private javax.swing.JSlider slideFGRed;
    private javax.swing.JSlider slideFontSize;
    private javax.swing.JSplitPane splitter;
    private javax.swing.JTabbedPane tabsColor;
    private javax.swing.JScrollPane textScroller;
    private javax.swing.JTextArea txtText;
    // End of variables declaration//GEN-END:variables
}