/*
 * OrderForm.java
 *
 */

import java.util.List;
import java.util.ArrayList;
import javax.swing.table.*;
import javax.swing.ImageIcon;
/**
 *
 * @author  jim
 */
public class OrderForm extends javax.swing.JFrame {
    private Order order;
    private OrderLineTableModel olTableModel;
    private int rowIndicator = 0;
    
    /** Creates new form DVDForm */
    public OrderForm() {
        order = createOrder();
        olTableModel = new OrderLineTableModel();
        olTableModel.setData(order.getOrderLines());
        initComponents();
        this.getRootPane().setDefaultButton(jButton_save);
        jTextField_lineNumber.setText(jTable1.getValueAt(rowIndicator,0).toString());
        jTextField_productName.setText((String)jTable1.getValueAt(rowIndicator,1));
        jTextField_quantity.setText(jTable1.getValueAt(rowIndicator,2).toString());
        jTextField_cost.setText(jTable1.getValueAt(rowIndicator,3).toString());
        //jTextField_category.setText((String)jTable1.getValueAt(rowIndicator,4));
    }
    
    private Order createOrder()
    {
        Product product1 = new Product("P1", "Fender Stratocaster", 699.00);
        Product product2 = new Product("P2", "Musicman Silhouette", 1299.00);
        Product product3 = new Product("P3", "Squier Telecaster", 299.00);
        Product product4 = new Product("P4", "PRS Custom 24", 2299.00);
        Product product5 = new Product("P5", "Line 6 Variax", 599.00);
        OrderLine orderLin1 = new OrderLine(1, product1, 2);
        OrderLine orderLin2 = new OrderLine(2, product2, 3);
        OrderLine orderLin3 = new DiscountOrderLine(3, product1, 2,'B');
        OrderLine orderLin4 = new OrderLine(4, product4, 1);
        OrderLine orderLin5 = new OrderLine(5, product5, 1);
        OrderLine orderLin6 = new DiscountOrderLine(6, product5, 3,'C');
        OrderLine orderLin7 = new OrderLine(7, product2, 2);
        OrderLine orderLin8 = new OrderLine(8, product3, 4);
        Order order1 = new Order("my order");
        order1.addOrderLine(orderLin1);
        order1.addOrderLine(orderLin2);
        order1.addOrderLine(orderLin3);
        order1.addOrderLine(orderLin4);
        order1.addOrderLine(orderLin5);
        order1.addOrderLine(orderLin6);
        order1.addOrderLine(orderLin7);
        order1.addOrderLine(orderLin8);
        return order1;
    }
    
    /** 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.
     */
    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
    private void initComponents() {
        java.awt.GridBagConstraints gridBagConstraints;

        jPanel2 = new javax.swing.JPanel();
        jLabel_lineNumber = new javax.swing.JLabel();
        jTextField_lineNumber = new javax.swing.JTextField();
        jLabel_productName = new javax.swing.JLabel();
        jTextField_productName = new javax.swing.JTextField();
        jLabel_quantity = new javax.swing.JLabel();
        jTextField_quantity = new javax.swing.JTextField();
        jLabel_cost = new javax.swing.JLabel();
        jTextField_cost = new javax.swing.JTextField();
        jLabel_category = new javax.swing.JLabel();
        jTextField_category = new javax.swing.JTextField();
        jPanel1 = new javax.swing.JPanel();
        jButton_new = new javax.swing.JButton();
        jButton_save = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        jMenuBar1 = new javax.swing.JMenuBar();
        fileMenu = new javax.swing.JMenu();
        aboutMenuItem = new javax.swing.JMenuItem();
        exitMenuItem = new javax.swing.JMenuItem();

        getContentPane().setLayout(new java.awt.BorderLayout(0, 10));

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Order Application");
        //setIconImage(new ImageIcon("collogo.gif").getImage()
        //);
        setLocationByPlatform(true);
        jPanel2.setLayout(new java.awt.GridBagLayout());

        jPanel2.setBorder(new javax.swing.border.EmptyBorder(new java.awt.Insets(12, 12, 12, 12)));
        jLabel_lineNumber.setText("Line Number:");
        jLabel_lineNumber.setMaximumSize(new java.awt.Dimension(42, 14));
        jLabel_lineNumber.setMinimumSize(new java.awt.Dimension(42, 14));
        jLabel_lineNumber.setPreferredSize(new java.awt.Dimension(42, 14));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
        gridBagConstraints.insets = new java.awt.Insets(0, 0, 12, 6);
        jPanel2.add(jLabel_lineNumber, gridBagConstraints);

        jTextField_lineNumber.setColumns(20);
        jTextField_lineNumber.setHorizontalAlignment(javax.swing.JTextField.LEFT);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.insets = new java.awt.Insets(0, 0, 12, 0);
        jPanel2.add(jTextField_lineNumber, gridBagConstraints);
        jTextField_lineNumber.setEditable(false);

        jLabel_productName.setText("Product:");
        jLabel_productName.setMaximumSize(new java.awt.Dimension(42, 14));
        jLabel_productName.setMinimumSize(new java.awt.Dimension(42, 14));
        jLabel_productName.setPreferredSize(new java.awt.Dimension(42, 14));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
        gridBagConstraints.insets = new java.awt.Insets(0, 0, 12, 6);
        jPanel2.add(jLabel_productName, gridBagConstraints);

        jTextField_productName.setColumns(20);
        jTextField_productName.setHorizontalAlignment(javax.swing.JTextField.LEFT);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.insets = new java.awt.Insets(0, 0, 12, 0);
        jPanel2.add(jTextField_productName, gridBagConstraints);
        jTextField_productName.setEditable(false);

        jLabel_quantity.setText("Quantity:");
        jLabel_quantity.setMaximumSize(new java.awt.Dimension(42, 14));
        jLabel_quantity.setMinimumSize(new java.awt.Dimension(42, 14));
        jLabel_quantity.setPreferredSize(new java.awt.Dimension(42, 14));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
        gridBagConstraints.insets = new java.awt.Insets(0, 0, 12, 6);
        jPanel2.add(jLabel_quantity, gridBagConstraints);

        jTextField_quantity.setColumns(20);
        jTextField_quantity.setHorizontalAlignment(javax.swing.JTextField.LEFT);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.insets = new java.awt.Insets(0, 0, 12, 0);
        jPanel2.add(jTextField_quantity, gridBagConstraints);

        jLabel_cost.setText("Cost:");
        jLabel_cost.setMaximumSize(new java.awt.Dimension(42, 14));
        jLabel_cost.setMinimumSize(new java.awt.Dimension(42, 14));
        jLabel_cost.setPreferredSize(new java.awt.Dimension(42, 14));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
        gridBagConstraints.insets = new java.awt.Insets(0, 0, 12, 6);
        jPanel2.add(jLabel_cost, gridBagConstraints);

        jTextField_cost.setColumns(20);
        jTextField_cost.setHorizontalAlignment(javax.swing.JTextField.LEFT);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.insets = new java.awt.Insets(0, 0, 12, 0);
        jPanel2.add(jTextField_cost, gridBagConstraints);
        jTextField_cost.setEditable(false);

        /*jLabel_category.setText("Category:");
        jLabel_category.setMaximumSize(new java.awt.Dimension(55, 14));
        jLabel_category.setMinimumSize(new java.awt.Dimension(55, 14));
        jLabel_category.setPreferredSize(new java.awt.Dimension(55, 14));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
        gridBagConstraints.insets = new java.awt.Insets(0, 0, 12, 6);
        jPanel2.add(jLabel_category, gridBagConstraints);

        jTextField_category.setColumns(20);
        jTextField_category.setHorizontalAlignment(javax.swing.JTextField.LEFT);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridwidth = java.awt.GridBagConstraints.RELATIVE;
        gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.insets = new java.awt.Insets(0, 0, 12, 0);
        jPanel2.add(jTextField_category, gridBagConstraints);*/

        jPanel1.setLayout(new java.awt.GridBagLayout());

        jPanel1.setBorder(new javax.swing.border.EmptyBorder(new java.awt.Insets(1, 1, 1, 1)));
        jPanel1.setAlignmentX(0.0F);
        jPanel1.setAlignmentY(0.0F);
        jButton_new.setText("New");
        jButton_new.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton_newActionPerformed(evt);
            }
        });

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridheight = java.awt.GridBagConstraints.REMAINDER;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHEAST;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.weighty = 1.0;
        gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 6);
        jPanel1.add(jButton_new, gridBagConstraints);

        jButton_save.setText("Save");
        jButton_save.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton_saveActionPerformed(evt);
            }
        });

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
        gridBagConstraints.gridheight = java.awt.GridBagConstraints.REMAINDER;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHEAST;
        gridBagConstraints.weighty = 1.0;
        jPanel1.add(jButton_save, gridBagConstraints);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 5;
        gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
        gridBagConstraints.gridheight = java.awt.GridBagConstraints.REMAINDER;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.weighty = 1.0;
        jPanel2.add(jPanel1, gridBagConstraints);

        getContentPane().add(jPanel2, java.awt.BorderLayout.CENTER);

        jScrollPane1.setPreferredSize(new java.awt.Dimension(452, 100));
        jTable1.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0)));
        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {

            }
        ));
        jTable1.setModel(olTableModel);
        TableColumn column = null;
        column = jTable1.getColumnModel().getColumn(1);
        column.setPreferredWidth(200);
        column = jTable1.getColumnModel().getColumn(3);
        column.setPreferredWidth(150);
        jTable1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jTable1MouseClicked(evt);
            }
        });

        jScrollPane1.setViewportView(jTable1);

        getContentPane().add(jScrollPane1, java.awt.BorderLayout.NORTH);

        fileMenu.setText("Menu");
        aboutMenuItem.setText("About Order Application");
        aboutMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                aboutMenuItemActionPerformed(evt);
            }
        });

        fileMenu.add(aboutMenuItem);

        exitMenuItem.setText("Exit");
        exitMenuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                exitMenuItemActionPerformed(evt);
            }
        });

        fileMenu.add(exitMenuItem);

        jMenuBar1.add(fileMenu);

        setJMenuBar(jMenuBar1);

        pack();
    }
    // </editor-fold>//GEN-END:initComponents
    
    private void jTable1MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTable1MouseClicked
        rowIndicator = jTable1.getSelectedRow();
        
        jTextField_lineNumber.setText(jTable1.getValueAt(rowIndicator,0).toString());
        jTextField_productName.setText((String)jTable1.getValueAt(rowIndicator,1));
        jTextField_quantity.setText(jTable1.getValueAt(rowIndicator,2).toString());
        jTextField_cost.setText(jTable1.getValueAt(rowIndicator,3).toString());

        //jTextField_category.setText((String)jTable1.getValueAt(rowIndicator,4));
    }//GEN-LAST:event_jTable1MouseClicked
    
    private void aboutMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_aboutMenuItemActionPerformed
        new About(this).setVisible(true);
    }//GEN-LAST:event_aboutMenuItemActionPerformed
    
    private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitMenuItemActionPerformed
        System.exit(0);
    }//GEN-LAST:event_exitMenuItemActionPerformed
    
    private void jButton_saveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton_saveActionPerformed     
         if (rowIndicator == -1){
            OrderLine orderLine = new OrderLine(
                Integer.parseInt(jTextField_lineNumber.getText()), 
                new Product(
                    "UNDEFINED",
                     jTextField_productName.getText(), 
                     Double.parseDouble(jTextField_cost.getText())
                     ),
                Integer.parseInt(jTextField_quantity.getText())
            );
            rowIndicator = order.getOrderLines().size();
            order.addOrderLine(orderLine);   
        } else {
            Product prod = order.getOrderLines().get(rowIndicator).getProduct();
            prod.setProductName(jTextField_productName.getText());
             OrderLine orderLine = new OrderLine(
                Integer.parseInt(jTextField_lineNumber.getText()), 
                prod,
                Integer.parseInt(jTextField_quantity.getText())
            );
            
            /*OrderLine orderLine = new OrderLine(
                Integer.parseInt(jTextField_lineNumber.getText()), 
                new Product(
                    "UNDEFINED",
                     jTextField_productName.getText(), 
                     order.getOrderLines().get(rowIndicator).getProduct().getCost()
                     ),
                Integer.parseInt(jTextField_quantity.getText())
            );*/
            order.getOrderLines().set(rowIndicator, orderLine);
        }
        olTableModel.setData(order.getOrderLines());
        jTextField_lineNumber.setEditable(false);
        jTextField_productName.setEditable(false);
        jTextField_cost.setEditable(false);
    }//GEN-LAST:event_jButton_saveActionPerformed
    
    private void jButton_newActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton_newActionPerformed
        rowIndicator = -1;
        jTextField_lineNumber.setText("");
        jTextField_productName.setText("");
        jTextField_quantity.setText("");
        jTextField_cost.setText("");
        jTextField_category.setText("");
        jTextField_lineNumber.setEditable(true);
        jTextField_productName.setEditable(true);
        jTextField_cost.setEditable(true);
    }//GEN-LAST:event_jButton_newActionPerformed
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        try {
            javax.swing.UIManager.setLookAndFeel(
                    javax.swing.UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) { }
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new OrderForm().setVisible(true);
            }
        });
    }
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JMenuItem aboutMenuItem;
    private javax.swing.JMenuItem exitMenuItem;
    private javax.swing.JMenu fileMenu;
    private javax.swing.JButton jButton_new;
    private javax.swing.JButton jButton_save;
    private javax.swing.JLabel jLabel_category;
    private javax.swing.JLabel jLabel_lineNumber;
    private javax.swing.JLabel jLabel_cost;
    private javax.swing.JLabel jLabel_productName;
    private javax.swing.JLabel jLabel_quantity;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    private javax.swing.JTextField jTextField_category;
    private javax.swing.JTextField jTextField_lineNumber;
    private javax.swing.JTextField jTextField_cost;
    private javax.swing.JTextField jTextField_productName;
    private javax.swing.JTextField jTextField_quantity;
    // End of variables declaration//GEN-END:variables
    
    private class OrderLineTableModel extends AbstractTableModel {
        private String[] columnNames = {"Line number","Product","Quantity","Cost"};
        private List<OrderLine> data;
        
        public void setData(List<OrderLine> orderlines){
            this.data = orderlines;
            fireTableDataChanged();
        }
        
        public int getColumnCount() {
            return columnNames.length;
        }
        
        public int getRowCount() {
            return data.size();
        }
        
        public String getColumnName(int col) {
            return columnNames[col];
        }
        
        public Object getValueAt(int row, int col) {
            OrderLine ol = data.get(row);
            Object value = null;
            switch (col){
                case 0 : value=ol.getLineNumber(); break;
                case 1 : value=ol.getProduct().getProductName(); break;
                case 2 : value=ol.getQuantity(); break;
                case 3 : value=ol.getCost(); break;
            }
            return value;
        }
        
        public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }
        
    /*
     * Don't need to implement this method unless your table's
     * editable.
     */
        public boolean isCellEditable(int row, int col) {
            //Note that the data/cell address is constant,
            //no matter where the cell appears onscreen.
            if (col < 2) {
                return false;
            } else {
                return true;
            }
        }
        
    /*
     * Don't need to implement this method unless your table's
     * data can change.
     */
        public void setValueAt(Object value, int row, int col) {
            //data[row][col] = value;
            //fireTableCellUpdated(row, col);
        }
    }
}
