/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package org.thingml.tradfri.ui;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Handler;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import javax.swing.SwingUtilities;
import javax.swing.text.DefaultCaret;
import org.thingml.tradfri.TradfriGateway;

/**
 *
 * @author franck
 */
public class LoggingPanel extends javax.swing.JPanel {

    public final int maxLogSize = 2048;
    
    /**
     * Creates new form LoggingPanel
     */
    public LoggingPanel() {
        Logger.getLogger(TradfriGateway.class.getName()).addHandler(new LoggingPanel.LogHandler());
        initComponents();
    }
    
    
    public void appendLog(String text) {
        jTextArea1.append(text);
    }

    /**
     * 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() {

        jScrollPaneLog = new javax.swing.JScrollPane();
        jTextArea1 = new javax.swing.JTextArea();
        jCheckBoxLog = new javax.swing.JCheckBox();
        jButtonClear = new javax.swing.JButton();
        jCheckBox1 = new javax.swing.JCheckBox();

        jTextArea1.setEditable(false);
        jTextArea1.setBackground(new java.awt.Color(51, 51, 51));
        jTextArea1.setColumns(20);
        jTextArea1.setFont(new java.awt.Font("DejaVu Sans Mono", 1, 12)); // NOI18N
        jTextArea1.setForeground(new java.awt.Color(0, 153, 255));
        jTextArea1.setRows(5);
        jTextArea1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jTextArea1MouseClicked(evt);
            }
        });
        jScrollPaneLog.setViewportView(jTextArea1);

        jCheckBoxLog.setSelected(true);
        jCheckBoxLog.setText("Auto Scroll");
        jCheckBoxLog.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jCheckBoxLogActionPerformed(evt);
            }
        });

        jButtonClear.setText("Clear Log");
        jButtonClear.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonClearActionPerformed(evt);
            }
        });

        jCheckBox1.setText("Line Wrap");
        jCheckBox1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jCheckBox1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPaneLog)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jButtonClear)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 250, Short.MAX_VALUE)
                .addComponent(jCheckBox1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jCheckBoxLog)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jScrollPaneLog, javax.swing.GroupLayout.DEFAULT_SIZE, 162, Short.MAX_VALUE)
                .addGap(7, 7, 7)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jCheckBoxLog)
                    .addComponent(jButtonClear)
                    .addComponent(jCheckBox1))
                .addGap(5, 5, 5))
        );
    }// </editor-fold>//GEN-END:initComponents

    private void jButtonClearActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonClearActionPerformed
        jTextArea1.setText("");
    }//GEN-LAST:event_jButtonClearActionPerformed

    private void jCheckBoxLogActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckBoxLogActionPerformed
        DefaultCaret caret = (DefaultCaret) jTextArea1.getCaret();
        if (jCheckBoxLog.isSelected()) { 
           caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
           jTextArea1.setCaretPosition(jTextArea1.getDocument().getLength());
           jScrollPaneLog.setViewportView(jTextArea1);
        }
        else caret.setUpdatePolicy(DefaultCaret.NEVER_UPDATE);
        
    }//GEN-LAST:event_jCheckBoxLogActionPerformed

    private void jCheckBox1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckBox1ActionPerformed
        jTextArea1.setLineWrap(jCheckBox1.isSelected());
    }//GEN-LAST:event_jCheckBox1ActionPerformed

    private void jTextArea1MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTextArea1MouseClicked
        jCheckBoxLog.setSelected(false);
    }//GEN-LAST:event_jTextArea1MouseClicked


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButtonClear;
    private javax.swing.JCheckBox jCheckBox1;
    private javax.swing.JCheckBox jCheckBoxLog;
    private javax.swing.JScrollPane jScrollPaneLog;
    private javax.swing.JTextArea jTextArea1;
    // End of variables declaration//GEN-END:variables

    class LogHandler extends Handler {
        
        StringBuilder b = new StringBuilder();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");


        @Override
        public void publish(LogRecord record) {
            final String msg = "[" + sdf.format(new Date(record.getMillis())) + "] [" +record.getLevel().getName() + "] " + record.getMessage() + "\n" ;
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                  appendLog(msg);
                }
              });
        }

        @Override
        public void flush() {
           
        }

        @Override
        public void close() throws SecurityException {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                  appendLog("[CLOSED]");
                }
              });
        }
        
    }

}