package usda.weru.mcrew.timeline;


import java.text.ParseException;
import javax.swing.JOptionPane;
import javax.swing.text.DefaultFormatter;
import javax.swing.text.DefaultFormatterFactory;

import usda.weru.mcrew.JulianCalendar;
import usda.weru.mcrew.timeline.TimelinePanel.StepType;

/**
 * This panel handles the buttons and navigation for the timeline view of management
 * files.
 * @author jonathanhornbaker
 */
public class TimelineControls extends javax.swing.JPanel 
{
    private TimelinePanel parent;
    public static final long serialVersionUID = 78972L;
    
    /**
     * Creates new form TimelineControls
     */
    public TimelineControls(TimelinePanel orig) 
    {
        parent = orig;
        this.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
        initComponents();
    }

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

        jScrollPane2 = new javax.swing.JScrollPane();
        jTextArea2 = new javax.swing.JTextArea();
        zoomBox = new javax.swing.JTextField();
        zoomType = new javax.swing.JComboBox<>();
        shiftLeft = new javax.swing.JButton();
        moveLeft = new javax.swing.JButton();
        zoomUnits = new javax.swing.JLabel();
        zoom = new javax.swing.JLabel();
        moveRight = new javax.swing.JButton();
        shiftRight = new javax.swing.JButton();
        firstDate = new javax.swing.JLabel();
        offset = new javax.swing.JTextField();
        currentDateLabel = new javax.swing.JLabel();
        currentOpLabel = new javax.swing.JLabel();
        currentDate = new javax.swing.JFormattedTextField();
        currentOp = new javax.swing.JFormattedTextField();

        jTextArea2.setColumns(20);
        jTextArea2.setRows(5);
        jScrollPane2.setViewportView(jTextArea2);

        zoomBox.setText(org.openide.util.NbBundle.getMessage(TimelineControls.class, "TimelineControls.zoomBox.text")); // NOI18N
        zoomBox.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusLost(java.awt.event.FocusEvent evt) {
                zoomBoxFocusLost(evt);
            }
        });
        zoomBox.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                zoomBoxActionPerformed(evt);
            }
        });

        zoomType.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Day", "Week", "Month", "Year" }));
        zoomType.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusLost(java.awt.event.FocusEvent evt) {
                zoomTypeFocusLost(evt);
            }
        });
        zoomType.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                zoomTypeActionPerformed(evt);
            }
        });

        org.openide.awt.Mnemonics.setLocalizedText(shiftLeft, org.openide.util.NbBundle.getMessage(TimelineControls.class, "TimelineControls.shiftLeft.text")); // NOI18N
        shiftLeft.setMaximumSize(new java.awt.Dimension(32, 32));
        shiftLeft.setMinimumSize(new java.awt.Dimension(8, 8));
        shiftLeft.setPreferredSize(new java.awt.Dimension(50, 31));
        shiftLeft.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                shiftLeftActionPerformed(evt);
            }
        });

        org.openide.awt.Mnemonics.setLocalizedText(moveLeft, org.openide.util.NbBundle.getMessage(TimelineControls.class, "TimelineControls.moveLeft.text")); // NOI18N
        moveLeft.setMaximumSize(new java.awt.Dimension(32, 32));
        moveLeft.setMinimumSize(new java.awt.Dimension(8, 8));
        moveLeft.setPreferredSize(new java.awt.Dimension(50, 31));
        moveLeft.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                moveLeftActionPerformed(evt);
            }
        });

        org.openide.awt.Mnemonics.setLocalizedText(zoomUnits, org.openide.util.NbBundle.getMessage(TimelineControls.class, "TimelineControls.zoomUnits.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(zoom, org.openide.util.NbBundle.getMessage(TimelineControls.class, "TimelineControls.zoom.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(moveRight, org.openide.util.NbBundle.getMessage(TimelineControls.class, "TimelineControls.moveRight.text")); // NOI18N
        moveRight.setMaximumSize(new java.awt.Dimension(32, 32));
        moveRight.setMinimumSize(new java.awt.Dimension(8, 8));
        moveRight.setPreferredSize(new java.awt.Dimension(50, 31));
        moveRight.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                moveRightActionPerformed(evt);
            }
        });

        org.openide.awt.Mnemonics.setLocalizedText(shiftRight, org.openide.util.NbBundle.getMessage(TimelineControls.class, "TimelineControls.shiftRight.text")); // NOI18N
        shiftRight.setMaximumSize(new java.awt.Dimension(32, 32));
        shiftRight.setMinimumSize(new java.awt.Dimension(8, 8));
        shiftRight.setPreferredSize(new java.awt.Dimension(50, 31));
        shiftRight.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                shiftRightActionPerformed(evt);
            }
        });

        org.openide.awt.Mnemonics.setLocalizedText(firstDate, org.openide.util.NbBundle.getMessage(TimelineControls.class, "TimelineControls.firstDate.text")); // NOI18N

        offset.setText(org.openide.util.NbBundle.getMessage(TimelineControls.class, "TimelineControls.offset.text")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(currentDateLabel, org.openide.util.NbBundle.getMessage(TimelineControls.class, "TimelineControls.currentDateLabel.text")); // NOI18N
        currentDateLabel.setToolTipText(org.openide.util.NbBundle.getMessage(TimelineControls.class, "TimelineControls.currentDateLabel.toolTipText")); // NOI18N

        org.openide.awt.Mnemonics.setLocalizedText(currentOpLabel, org.openide.util.NbBundle.getMessage(TimelineControls.class, "TimelineControls.currentOpLabel.text")); // NOI18N

        currentDate.setEditable(false);
        currentDate.setFormatterFactory(new DefaultFormatterFactory(new DateFormatter()));
        currentDate.setText(org.openide.util.NbBundle.getMessage(TimelineControls.class, "TimelineControls.currentDate.text")); // NOI18N
        currentDate.setMinimumSize(new java.awt.Dimension(90, 19));

        currentOp.setEditable(false);
        currentOp.setColumns(64);
        currentOp.setFormatterFactory(new DefaultFormatterFactory(new StringFormatter()));
        currentOp.setText(org.openide.util.NbBundle.getMessage(TimelineControls.class, "TimelineControls.currentOp.text")); // NOI18N

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(zoom)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(zoomBox, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(zoomUnits)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(zoomType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(48, 48, 48)
                        .addComponent(shiftLeft, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(moveLeft, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(firstDate)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(offset, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(moveRight, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(shiftRight, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(currentDateLabel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(currentDate, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(currentOpLabel)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(currentOp, javax.swing.GroupLayout.PREFERRED_SIZE, 1, Short.MAX_VALUE)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(offset, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(firstDate)
                    .addComponent(shiftRight, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(moveRight, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(zoom)
                    .addComponent(zoomType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(zoomBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(shiftLeft, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(moveLeft, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(zoomUnits))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(currentDateLabel)
                    .addComponent(currentOpLabel)
                    .addComponent(currentDate, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(currentOp, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(18, Short.MAX_VALUE))
        );
    }// </editor-fold>//GEN-END:initComponents

    private void zoomTypeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_zoomTypeActionPerformed
        String type = (String) zoomType.getSelectedItem();
        switch(type)
        {
            case "Day":
                parent.setZoomType(StepType.DAY);
                break;
            case "Week":
                parent.setZoomType(StepType.WEEK);
                break;
            case "Month":
                parent.setZoomType(StepType.MONTH);
                break;
            case "Year":
                parent.setZoomType(StepType.YEAR);
                break;
            default:
        }
    }//GEN-LAST:event_zoomTypeActionPerformed

    private void zoomBoxFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_zoomBoxFocusLost
        String newVal = zoomBox.getText();
        try
        {
            int zoom = Integer.parseInt(newVal);
//            if(zoom < (TimelineConfig.height * parent.getScale().days))
//            {
//                JOptionPane.showMessageDialog(null, "Pixels per day less than 10 are"
//                        + "Not currenty allowed.", "Invalid number", JOptionPane.OK_OPTION);
//                zoomBox.setText(Integer.toString(parent.getPixelZoom()));
//            }
//            else 
                parent.setZoom(zoom);
        }
        catch(NumberFormatException nfe) {}
    }//GEN-LAST:event_zoomBoxFocusLost

    private void zoomBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_zoomBoxActionPerformed
        String newVal = zoomBox.getText();
        try
        {
            int zoom = Integer.parseInt(newVal);
//            if(zoom < (TimelineConfig.height * parent.getScale().days))
//            {
//                JOptionPane.showMessageDialog(null, "Pixels per day less than 10 are"
//                        + "Not currenty allowed.", "Invalid number", JOptionPane.OK_OPTION);
//                zoomBox.setText(Integer.toString(parent.getPixelZoom()));
//            }
//            else 
                parent.setZoom(zoom);
        }
        catch(NumberFormatException nfe) {}
    }//GEN-LAST:event_zoomBoxActionPerformed

    public void resetZoom(int value) { zoomBox.setText(Integer.toString(parent.getPixelZoom())); }
    public void resetZoomType(StepType value) { zoomType.setSelectedItem(value); }
    
    private void zoomTypeFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_zoomTypeFocusLost
        String type = (String) zoomType.getSelectedItem();
        switch(type)
        {
            case "Day":
                parent.setZoomType(StepType.DAY);
                break;
            case "Week":
                parent.setZoomType(StepType.WEEK);
                break;
            case "Month":
                parent.setZoomType(StepType.MONTH);
                break;
            case "Year":
                parent.setZoomType(StepType.YEAR);
                break;
            default:
        }
    }//GEN-LAST:event_zoomTypeFocusLost

    private void shiftLeftActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_shiftLeftActionPerformed
        parent.shiftLeft();
    }//GEN-LAST:event_shiftLeftActionPerformed

    private void moveLeftActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_moveLeftActionPerformed
        parent.moveLeft();
    }//GEN-LAST:event_moveLeftActionPerformed

    private void moveRightActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_moveRightActionPerformed
        parent.moveRight();
    }//GEN-LAST:event_moveRightActionPerformed

    private void shiftRightActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_shiftRightActionPerformed
        parent.shiftRight();
    }//GEN-LAST:event_shiftRightActionPerformed

    public class StringFormatter extends DefaultFormatter
    {
        public static final long serialVersionUID = 3294289347L;

        @Override
        public Object stringToValue(String string) throws ParseException {
            return super.stringToValue(string);
        }

        @Override
        public String valueToString(Object value) throws ParseException {
            if (value instanceof String) {
                String text = (String) value;
                return text.substring(0, 24 < text.length() ? 24 : text.length());
            } else {
                return null;
            }
        }

        @Override
        public Class<?> getValueClass() {
            return String.class;
        }
    }
    
    public class DateFormatter extends DefaultFormatter
    {
        public static final long serialVersionUID = 3294289348L;

        @Override
        public Object stringToValue(String string) throws ParseException {
            return super.stringToValue(string);
        }

        @Override
        public String valueToString(Object value) throws ParseException {
            if (value instanceof JulianCalendar) {
                JulianCalendar date = (JulianCalendar) value;
                return date.getDate();
            } else {
                return null;
            }
        }

        @Override
        public Class<?> getValueClass() {
            return JulianCalendar.class;
        }
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    javax.swing.JFormattedTextField currentDate;
    private javax.swing.JLabel currentDateLabel;
    javax.swing.JFormattedTextField currentOp;
    private javax.swing.JLabel currentOpLabel;
    private javax.swing.JLabel firstDate;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTextArea jTextArea2;
    private javax.swing.JButton moveLeft;
    private javax.swing.JButton moveRight;
    private javax.swing.JTextField offset;
    private javax.swing.JButton shiftLeft;
    private javax.swing.JButton shiftRight;
    private javax.swing.JLabel zoom;
    private javax.swing.JTextField zoomBox;
    private javax.swing.JComboBox<String> zoomType;
    private javax.swing.JLabel zoomUnits;
    // End of variables declaration//GEN-END:variables
}
