Advertisement
Guest User

Scheduling.java

a guest
Aug 28th, 2014
278
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 73.47 KB | None | 0 0
  1. package info.chrismcgee.sky;
  2.  
  3. import info.chrismcgee.beans.Day;
  4. import info.chrismcgee.beans.Job;
  5. import info.chrismcgee.beans.OrderDetail;
  6. import info.chrismcgee.components.DateManager;
  7. import info.chrismcgee.sky.treetable.SchedulingTreeTableModel;
  8. import info.chrismcgee.sky.treetable.SkyCheckTreeManager;
  9. import info.chrismcgee.sky.treetable.SkyCheckTreeTableManager;
  10. import info.chrismcgee.tables.DayManager;
  11. import info.chrismcgee.tables.JobManager;
  12. import info.chrismcgee.tables.OrderDetailManager;
  13. import info.chrismcgee.treetable.TreeUtils;
  14.  
  15. import java.awt.Color;
  16. import java.awt.Dimension;
  17. import java.awt.EventQueue;
  18. import java.awt.Font;
  19. import java.awt.Insets;
  20. import java.awt.event.ActionEvent;
  21. import java.awt.event.ActionListener;
  22. import java.awt.event.FocusAdapter;
  23. import java.awt.event.FocusEvent;
  24. import java.awt.event.KeyAdapter;
  25. import java.awt.event.KeyEvent;
  26. import java.awt.event.MouseAdapter;
  27. import java.awt.event.MouseEvent;
  28. import java.beans.PropertyChangeEvent;
  29. import java.beans.PropertyChangeListener;
  30. import java.beans.PropertyVetoException;
  31. import java.beans.VetoableChangeListener;
  32. import java.sql.SQLException;
  33. import java.sql.Timestamp;
  34. import java.text.NumberFormat;
  35. import java.text.ParseException;
  36. import java.util.ArrayList;
  37. import java.util.Arrays;
  38. import java.util.Date;
  39. import java.util.Enumeration;
  40. import java.util.HashMap;
  41. import java.util.List;
  42. import java.util.Locale;
  43. import java.util.Map;
  44. import java.util.regex.Matcher;
  45. import java.util.regex.Pattern;
  46.  
  47. import javax.swing.ImageIcon;
  48. import javax.swing.JButton;
  49. import javax.swing.JFrame;
  50. import javax.swing.JLabel;
  51. import javax.swing.JLayeredPane;
  52. import javax.swing.JOptionPane;
  53. import javax.swing.JPanel;
  54. import javax.swing.JScrollPane;
  55. import javax.swing.JSeparator;
  56. import javax.swing.JTextField;
  57. import javax.swing.ScrollPaneConstants;
  58. import javax.swing.SwingConstants;
  59. import javax.swing.SwingUtilities;
  60. import javax.swing.Timer;
  61. import javax.swing.border.EmptyBorder;
  62. import javax.swing.border.EtchedBorder;
  63. import javax.swing.border.LineBorder;
  64. import javax.swing.event.TreeSelectionEvent;
  65. import javax.swing.event.TreeSelectionListener;
  66. import javax.swing.tree.TreePath;
  67.  
  68. import net.miginfocom.swing.MigLayout;
  69.  
  70. import org.apache.logging.log4j.LogManager;
  71. import org.apache.logging.log4j.Logger;
  72. import org.jdesktop.swingx.JXMonthView;
  73. import org.jdesktop.swingx.JXSearchField;
  74. import org.jdesktop.swingx.JXTreeTable;
  75. import org.jdesktop.swingx.treetable.DefaultMutableTreeTableNode;
  76. import org.jdesktop.swingx.treetable.MutableTreeTableNode;
  77. import org.joda.time.DateTimeUtils;
  78. import org.joda.time.LocalDate;
  79.  
  80. public class Scheduling extends JFrame {
  81.    
  82.     static final Logger log = LogManager.getLogger(Scheduling.class.getName());
  83.  
  84. /**
  85.      *
  86.      */
  87.     private static final long serialVersionUID = -1536140709597909040L;
  88.     private static final Date[] EMPTY_DATE_ARRAY = new Date[0];
  89.     private final String DASH = "------";
  90.     private NumberFormat usFormat = NumberFormat.getIntegerInstance(Locale.US);
  91.     private JXTreeTable treeTable;
  92.     private JTextField tfAvailableScreen;
  93.     private JTextField tfAvailablePad;
  94.     private JTextField tfAvailableHotstamp;
  95.     private JTextField tfAvailableOffsetCups;
  96.     private JTextField tfAvailableOffsetNaps;
  97.     private JTextField tfAvailableDigital;
  98.     private JTextField tfAvailableTotal;
  99.     private JLabel lblToCompleteScreen;
  100.     private JLabel lblToCompletePad;
  101.     private JLabel lblToCompleteHotstamp;
  102.     private JLabel lblToCompleteOffsetCups;
  103.     private JLabel lblToCompleteOffsetNaps;
  104.     private JLabel lblToCompleteDigital;
  105.     private JLabel lblToCompleteTotal;
  106.     private JLabel lblScheduledScreen;
  107.     private JLabel lblScheduledPad;
  108.     private JLabel lblScheduledHotstamp;
  109.     private JLabel lblScheduledOffsetCups;
  110.     private JLabel lblScheduledOffsetNaps;
  111.     private JLabel lblScheduledDigital;
  112.     private JLabel lblScheduledTotal;
  113.     private JLabel lblRemainScreen;
  114.     private JLabel lblRemainPad;
  115.     private JLabel lblRemainHotstamp;
  116.     private JLabel lblRemainOffsetCups;
  117.     private JLabel lblRemainOffsetNaps;
  118.     private JLabel lblRemainDigital;
  119.     private long completedScreen;
  120.     private long completedPad;
  121.     private long completedHotstamp;
  122.     private long completedOffsetCups;
  123.     private long completedOffsetNaps;
  124.     private long completedDigital;
  125.     private long earlyScreen;
  126.     private long earlyPad;
  127.     private long earlyHotstamp;
  128.     private long earlyOffsetCups;
  129.     private long earlyOffsetNaps;
  130.     private long earlyDigital;
  131.     private long scheduledScreen;
  132.     private long scheduledPad;
  133.     private long scheduledHotstamp;
  134.     private long scheduledOffsetCups;
  135.     private long scheduledOffsetNaps;
  136.     private long scheduledDigital;
  137.     private static JLabel lblDate;
  138.     private JLabel lblRemainTotal;
  139.     private long totalCompleted;
  140.     private long totalAvailable;
  141.     private long totalScheduled;
  142.     private long totalEarly;
  143.     private long totalRemaining;
  144.     private long tempLong;
  145.     private boolean someCollapsed = false;
  146.     private List<Job> jobList = new ArrayList<Job>();
  147.     private List<Job> narrowedJobList = new ArrayList<Job>();
  148.     private Day todaysBean;
  149.     private ActionListener refresher = new ActionListener() {
  150.        
  151.         @Override
  152.         public void actionPerformed(ActionEvent evt) {
  153.             log.trace("Timer refreshed TreeTable.");
  154.             thisDay = DateManager.stringToJDate(getDisplayedDate());
  155.             monthView.ensureDateVisible(thisDay);
  156.             monthView.setSelectionDate(thisDay);
  157.             updateTreeTable(DateManager.getLocalDate(getDisplayedDate()));
  158.         }
  159.     };
  160.     private Timer timer = new Timer(30*1000, refresher);
  161.     private JXSearchField searchField;
  162.     private Pattern jobNumberPattern = Pattern.compile("\\b(\\d+|P\\d+)\\b", Pattern.CASE_INSENSITIVE);
  163.     private Matcher jobNumberMatcher;
  164.     private SkyCheckTreeManager manager;
  165.     private CheckTreeTableSelectionListener selectionListener = new CheckTreeTableSelectionListener();
  166.     private Color warningColor = Color.RED;
  167.     private Date thisDay = new Date();
  168.     private final JXMonthView monthView;
  169.     private String currentDateStr;
  170.     private JButton btnPY;
  171.     private JButton btnPM;
  172.     private JButton btnPD;
  173.     private JButton btnND;
  174.     private JButton btnNM;
  175.     private JButton btnNY;
  176.     private static int accessLevel = 1;
  177.     private JLabel redbarScreen;
  178.     private JLabel redbarPad;
  179.     private JLabel redbarHotstamp;
  180.     private JLabel redbarOffsetCups;
  181.     private JLabel redbarOffsetNaps;
  182.     private JLabel redbarDigital;
  183.     private JLabel redbarTotal;
  184.     private JLabel lblCompletedScreen;
  185.     private JLabel lblCompletedPad;
  186.     private JLabel lblCompletedHotstamp;
  187.     private JLabel lblCompletedOffsetCups;
  188.     private JLabel lblCompletedOffsetNaps;
  189.     private JLabel lblCompletedDigital;
  190.     private JLabel lblCompletedTotal;
  191. //  private MigLayout quantitiesLayout = new MigLayout("", "[][][grow][grow][][grow][][grow][][grow]", "[][][][][][][][][]");
  192.  
  193.    
  194.     /**
  195.      * Launch the application.
  196.      */
  197.     public static void main(String[] args) {
  198.         if (args.length > 0) accessLevel = Integer.parseInt(args[0]);
  199.         log.trace("Access Level is " + accessLevel);
  200.         EventQueue.invokeLater(new Runnable() {
  201.             public void run() {
  202.                 log.entry("main");
  203.                 try {
  204.                     Scheduling frame = new Scheduling();
  205.                     frame.setTitle("Sky Scheduling v1.0");
  206.                     frame.setVisible(true);
  207.                     frame.updateDay(getDisplayedDate());
  208.                     frame.timer.start();
  209.                 } catch (Exception e) {
  210.                     e.printStackTrace();
  211.                 }
  212.             }
  213.         });
  214.     }
  215.    
  216.     /**
  217.      * Create the frame.
  218.      */
  219.     public Scheduling() {
  220.         setMinimumSize(new Dimension(1200, 1000));
  221.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  222.         setBounds(100, 100, 546, 600);
  223.         JPanel contentPane = new JPanel();
  224.         contentPane.setOpaque(false);
  225.         contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
  226.         setContentPane(contentPane);
  227.         contentPane.setLayout(new MigLayout("", "[grow][grow][grow][grow][grow][grow][grow][][250px][250px]", "[][][][650.00,grow][]"));
  228.                
  229.         searchField = new JXSearchField();
  230.         searchField.setPrompt("Customer Name / Order Number");
  231.         searchField.addActionListener(new ActionListener() {
  232.             public void actionPerformed(ActionEvent e) {
  233.                 if (e.getActionCommand() == null || e.getActionCommand().equals(""))
  234.                     updateTreeTable(DateManager.getLocalDate(lblDate.getText()));
  235.                 else
  236.                     narrowResults(e.getActionCommand());
  237.             }
  238.         });
  239.         contentPane.add(searchField, "cell 0 0 8 1,growx");
  240.        
  241.         JButton btnOnHold = new JButton("On Hold");
  242.         btnOnHold.addActionListener(new ActionListener() {
  243.             public void actionPerformed(ActionEvent e) {
  244.                 currentDateStr = "On Hold";
  245.                 setDisplayedDate(currentDateStr);
  246.                 updateTreeTable(DateManager.getLocalDate(currentDateStr));
  247.                 disableArrows();
  248.                 clearQuantities();
  249.                 monthView.clearSelection();
  250.                 timer.restart();
  251.             }
  252.         });
  253.         contentPane.add(btnOnHold, "cell 8 0,growx");
  254.        
  255.         JButton btnProofing = new JButton("Proofing");
  256.         btnProofing.addActionListener(new ActionListener() {
  257.             public void actionPerformed(ActionEvent e) {
  258.                 currentDateStr = "Proofs";
  259.                 setDisplayedDate(currentDateStr);
  260.                 updateTreeTable(DateManager.getLocalDate(currentDateStr));
  261.                 disableArrows();
  262.                 clearQuantities();
  263.                 monthView.clearSelection();
  264.                 timer.restart();
  265.             }
  266.         });
  267.         contentPane.add(btnProofing, "cell 9 0,growx");
  268.        
  269.         monthView = new JXMonthView();
  270.         monthView.setFont(new Font("Arial", Font.PLAIN, 16));
  271.         monthView.setFlaggedDayForeground(Color.LIGHT_GRAY);
  272.         monthView.setTraversable(true);
  273.         monthView.setBoxPaddingY(9);
  274.         monthView.setBoxPaddingX(17);
  275.         monthView.setPreferredRowCount(2);
  276. //      monthView.ensureDateVisible(DateManager.stringToJDate(DateManager.getPreviousMonth(DateManager.getToday())));
  277.         monthView.addActionListener(new ActionListener() {
  278.             public void actionPerformed(ActionEvent e) {
  279.                 enableArrows();
  280.                 currentDateStr = DateManager.jDateToString(monthView.getLastSelectionDate());
  281.                 setDisplayedDate(currentDateStr);
  282.                 updateTreeTable(DateManager.getLocalDate(currentDateStr));
  283.                 timer.restart();
  284.             }
  285.         });
  286.         monthView.addKeyListener(new KeyAdapter() {
  287.             @Override
  288.             public void keyReleased(KeyEvent e) {
  289.                 if (e.getKeyCode() == KeyEvent.VK_LEFT
  290.                         || e.getKeyCode() == KeyEvent.VK_RIGHT
  291.                         || e.getKeyCode() == KeyEvent.VK_UP
  292.                         || e.getKeyCode() == KeyEvent.VK_DOWN)
  293.                 {
  294.                     currentDateStr = DateManager.jDateToString(monthView.getLastSelectionDate());
  295.                     setDisplayedDate(currentDateStr);
  296.                     updateTreeTable(DateManager.getLocalDate(currentDateStr));
  297.                     timer.restart();
  298.                 }
  299.             }
  300.         });
  301.         monthView.addPropertyChangeListener(new PropertyChangeListener() {
  302.            
  303.             @Override
  304.             public void propertyChange(PropertyChangeEvent evt) {
  305.                 if ("firstDisplayedDay".equals(evt.getPropertyName()))
  306.                     flagDates();
  307.             }
  308.         });
  309.         contentPane.add(monthView, "cell 8 2 2 2,grow");
  310.        
  311.        
  312.         btnPY = new JButton("");
  313.         btnPY.setContentAreaFilled(false);
  314.         btnPY.setPressedIcon(new ImageIcon(Scheduling.class.getResource("/img/triple_left_down.png")));
  315.         btnPY.setRolloverIcon(new ImageIcon(Scheduling.class.getResource("/img/triple_left_over.png")));
  316.         btnPY.setDisabledIcon(new ImageIcon(Scheduling.class.getResource("/img/triple_left_down.png")));
  317.         btnPY.setMinimumSize(new Dimension(32, 32));
  318.         btnPY.setMaximumSize(new Dimension(32, 32));
  319.         btnPY.setPreferredSize(new Dimension(32, 32));
  320.         btnPY.setRolloverEnabled(true);
  321.         btnPY.setBorderPainted(false);
  322.         btnPY.setIcon(new ImageIcon(Scheduling.class.getResource("/img/triple_left_up.png")));
  323.         btnPY.setMargin(new Insets(0, 0, 0, 0));
  324.         btnPY.addActionListener(new ActionListener() {
  325.             public void actionPerformed(ActionEvent e) {
  326.                 currentDateStr = DateManager.getPreviousYear(getDisplayedDate());
  327.                 updateDay(currentDateStr);
  328.             }
  329.         });
  330.         contentPane.add(btnPY, "flowx,cell 0 2,alignx center");
  331.        
  332.         btnPM = new JButton("");
  333.         btnPM.setContentAreaFilled(false);
  334.         btnPM.setPressedIcon(new ImageIcon(Scheduling.class.getResource("/img/double_left_down.png")));
  335.         btnPM.setRolloverIcon(new ImageIcon(Scheduling.class.getResource("/img/double_left_over.png")));
  336.         btnPM.setDisabledIcon(new ImageIcon(Scheduling.class.getResource("/img/double_left_down.png")));
  337.         btnPM.setMinimumSize(new Dimension(32, 32));
  338.         btnPM.setMaximumSize(new Dimension(32, 32));
  339.         btnPM.setPreferredSize(new Dimension(32, 32));
  340.         btnPM.setRolloverEnabled(true);
  341.         btnPM.setBorderPainted(false);
  342.         btnPM.setMargin(new Insets(0, 0, 0, 0));
  343.         btnPM.setIcon(new ImageIcon(Scheduling.class.getResource("/img/double_left_up.png")));
  344.         btnPM.addActionListener(new ActionListener() {
  345.             public void actionPerformed(ActionEvent e) {
  346.                 currentDateStr = DateManager.getPreviousMonth(getDisplayedDate());
  347.                 updateDay(currentDateStr);
  348.             }
  349.         });
  350.         contentPane.add(btnPM, "cell 1 2,alignx center");
  351.        
  352.         btnPD = new JButton("");
  353.         btnPD.setContentAreaFilled(false);
  354.         btnPD.setPressedIcon(new ImageIcon(Scheduling.class.getResource("/img/single_left_down.png")));
  355.         btnPD.setRolloverIcon(new ImageIcon(Scheduling.class.getResource("/img/single_left_over.png")));
  356.         btnPD.setDisabledIcon(new ImageIcon(Scheduling.class.getResource("/img/single_left_down.png")));
  357.         btnPD.setPreferredSize(new Dimension(32, 32));
  358.         btnPD.setMinimumSize(new Dimension(32, 32));
  359.         btnPD.setMaximumSize(new Dimension(32, 32));
  360.         btnPD.setRolloverEnabled(true);
  361.         btnPD.setMargin(new Insets(0, 0, 0, 0));
  362.         btnPD.setIcon(new ImageIcon(Scheduling.class.getResource("/img/single_left_up.png")));
  363.         btnPD.setBorderPainted(false);
  364.         btnPD.addActionListener(new ActionListener() {
  365.             public void actionPerformed(ActionEvent e) {
  366.                 currentDateStr = DateManager.getPreviousDay(getDisplayedDate());
  367.                 updateDay(currentDateStr);
  368.             }
  369.         });
  370.         contentPane.add(btnPD, "cell 2 2,alignx center");
  371.        
  372.         lblDate = new JLabel(DateManager.getToday());
  373.         lblDate.addMouseListener(new MouseAdapter() {
  374.             @Override
  375.             public void mouseClicked(MouseEvent arg0) {
  376.                 currentDateStr = DateManager.getToday();
  377.                 updateDay(currentDateStr);
  378.                 enableArrows();
  379.             }
  380.         });
  381.         lblDate.setHorizontalAlignment(SwingConstants.CENTER);
  382.         lblDate.setFont(new Font("Lucida Grande", Font.PLAIN, 24));
  383.         contentPane.add(lblDate, "cell 3 2,growx");
  384.        
  385.         btnND = new JButton("");
  386.         btnND.setContentAreaFilled(false);
  387.         btnND.setPressedIcon(new ImageIcon(Scheduling.class.getResource("/img/single_right_down.png")));
  388.         btnND.setRolloverIcon(new ImageIcon(Scheduling.class.getResource("/img/single_right_over.png")));
  389.         btnND.setDisabledIcon(new ImageIcon(Scheduling.class.getResource("/img/single_right_down.png")));
  390.         btnND.setRolloverEnabled(true);
  391.         btnND.setPreferredSize(new Dimension(32, 32));
  392.         btnND.setMinimumSize(new Dimension(32, 32));
  393.         btnND.setMaximumSize(new Dimension(32, 32));
  394.         btnND.setMargin(new Insets(0, 0, 0, 0));
  395.         btnND.setIcon(new ImageIcon(Scheduling.class.getResource("/img/single_right_up.png")));
  396.         btnND.setBorderPainted(false);
  397.         btnND.addActionListener(new ActionListener() {
  398.             @Override
  399.             public void actionPerformed(ActionEvent arg0) {
  400.                 currentDateStr = DateManager.getNextDay(getDisplayedDate());
  401.                 updateDay(currentDateStr);
  402.             }
  403.         });
  404.         contentPane.add(btnND, "cell 4 2,alignx center");
  405.        
  406.         btnNM = new JButton("");
  407.         btnNM.setContentAreaFilled(false);
  408.         btnNM.setPressedIcon(new ImageIcon(Scheduling.class.getResource("/img/double_right_down.png")));
  409.         btnNM.setRolloverIcon(new ImageIcon(Scheduling.class.getResource("/img/double_right_over.png")));
  410.         btnNM.setDisabledIcon(new ImageIcon(Scheduling.class.getResource("/img/double_right_down.png")));
  411.         btnNM.setRolloverEnabled(true);
  412.         btnNM.setPreferredSize(new Dimension(32, 32));
  413.         btnNM.setMinimumSize(new Dimension(32, 32));
  414.         btnNM.setMaximumSize(new Dimension(32, 32));
  415.         btnNM.setMargin(new Insets(0, 0, 0, 0));
  416.         btnNM.setIcon(new ImageIcon(Scheduling.class.getResource("/img/double_right_up.png")));
  417.         btnNM.setBorderPainted(false);
  418.         btnNM.addActionListener(new ActionListener() {
  419.             public void actionPerformed(ActionEvent e) {
  420.                 currentDateStr = DateManager.getNextMonth(getDisplayedDate());
  421.                 updateDay(currentDateStr);
  422.             }
  423.         });
  424.         contentPane.add(btnNM, "cell 5 2,alignx center");
  425.        
  426.         btnNY = new JButton("");
  427.         btnNY.setContentAreaFilled(false);
  428.         btnNY.setPressedIcon(new ImageIcon(Scheduling.class.getResource("/img/triple_right_down.png")));
  429.         btnNY.setRolloverIcon(new ImageIcon(Scheduling.class.getResource("/img/triple_right_over.png")));
  430.         btnNY.setDisabledIcon(new ImageIcon(Scheduling.class.getResource("/img/triple_right_down.png")));
  431.         btnNY.setRolloverEnabled(true);
  432.         btnNY.setPreferredSize(new Dimension(32, 32));
  433.         btnNY.setMinimumSize(new Dimension(32, 32));
  434.         btnNY.setMaximumSize(new Dimension(32, 32));
  435.         btnNY.setMargin(new Insets(0, 0, 0, 0));
  436.         btnNY.setBorderPainted(false);
  437.         btnNY.setIcon(new ImageIcon(Scheduling.class.getResource("/img/triple_right_up.png")));
  438.         btnNY.addActionListener(new ActionListener() {
  439.             public void actionPerformed(ActionEvent e) {
  440.                 currentDateStr = DateManager.getNextYear(getDisplayedDate());
  441.                 updateDay(currentDateStr);
  442.             }
  443.         });
  444.         contentPane.add(btnNY, "cell 6 2,alignx center");
  445.  
  446.         JButton button = new JButton("+/-");
  447.         button.addActionListener(new ActionListener() {
  448.             public void actionPerformed(ActionEvent e) {
  449.                 if (someCollapsed)
  450.                 {
  451.                     treeTable.expandAll();
  452.                 }
  453.                 else
  454.                 {
  455.                     treeTable.collapseAll();
  456.                 }
  457.                 someCollapsed = !someCollapsed;
  458.             }
  459.         });
  460.         button.setPreferredSize(new Dimension(29, 29));
  461.         button.setMinimumSize(new Dimension(29, 29));
  462.         button.setMaximumSize(new Dimension(29, 29));
  463.         button.setMargin(new Insets(0, 0, 0, 0));
  464.         contentPane.add(button, "cell 7 2,grow");
  465.  
  466.        
  467.         DefaultMutableTreeTableNode root = new DefaultMutableTreeTableNode(DateManager.getToday());
  468.         for (Job j : jobList) {
  469.             // Adding jobs to the root tree node
  470.             DefaultMutableTreeTableNode curJob = new DefaultMutableTreeTableNode(j);
  471.             root.add(curJob);
  472.            
  473.             // Adding details to each job
  474.             for (OrderDetail od : j.getOrderDetailList()) {
  475.                 curJob.add(new DefaultMutableTreeTableNode(od));
  476.             }
  477.         }
  478.  
  479.         SchedulingTreeTableModel sttModel = new SchedulingTreeTableModel(root);
  480.         treeTable = new JXTreeTable(sttModel);
  481.         treeTable.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
  482.         treeTable.getTableHeader().setReorderingAllowed(false);
  483.         treeTable.setAutoCreateColumnsFromModel(false);
  484.         treeTable.getColumn(0).setPreferredWidth(200);
  485.         treeTable.getColumn(1).setPreferredWidth(75);
  486.         treeTable.getColumn(2).setPreferredWidth(15);
  487.             treeTable.getColumn(2).setMinWidth(15);
  488.             treeTable.getColumn(2).setMaxWidth(15);
  489.         treeTable.getColumn(3).setPreferredWidth(50);
  490.             treeTable.getColumn(3).setMaxWidth(50);
  491.         treeTable.getColumn(4).setPreferredWidth(25);
  492. //      treeTable.addTreeExpansionListener(tel);
  493.         treeTable.setEditable(true);
  494.         treeTable.setRootVisible(false);
  495.         manager = new SkyCheckTreeTableManager(treeTable, true, true);
  496.         manager.getSelectionModel().addTreeSelectionListener(selectionListener);
  497.         manager.setVetoableChangeListener(new CheckStateChangeListener());
  498.         manager.setCheckBoxCustomizer(new SkyCheckTreeManager.CheckBoxCustomizer() {
  499.            
  500.             @Override
  501.             public boolean showCheckBox(TreePath path) {
  502.                 DefaultMutableTreeTableNode ttNode = (DefaultMutableTreeTableNode) path.getLastPathComponent();
  503.                 if (ttNode.getUserObject() instanceof OrderDetail)
  504.                     ttNode = (DefaultMutableTreeTableNode) ttNode.getParent();
  505.                 Job jobNode = (Job) ttNode.getUserObject();
  506.                 java.sql.Date sqlDate = jobNode.getShipDate();
  507.                 return !DateManager.isOnHoldDate(sqlDate) && !DateManager.isProofingDate(sqlDate) && accessLevel == 1;
  508.             }
  509.         });
  510.        
  511.         JScrollPane scrollPane = new JScrollPane(treeTable);
  512.         scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
  513.         contentPane.add(scrollPane, "cell 0 3 8 2,grow");
  514.  
  515.        
  516.                     JPanel stretchyPanel = new JPanel();
  517.                     stretchyPanel.setOpaque(false);
  518.                     contentPane.add(stretchyPanel, "cell 8 4 2 1,growx,aligny bottom");
  519.                     stretchyPanel.setLayout(new MigLayout("insets 0", "[510px]", "[310]"));
  520.                    
  521.                     JLayeredPane layeredPane = new JLayeredPane();
  522.                     stretchyPanel.add(layeredPane, "cell 0 0,grow");
  523.                    
  524.             JPanel quantitiesPanel = new JPanel();
  525.             quantitiesPanel.setLocation(0, 0);
  526.             quantitiesPanel.setSize(510, 271);
  527.             layeredPane.add(quantitiesPanel);
  528.             layeredPane.setLayer(quantitiesPanel, 1);
  529.             quantitiesPanel.setLayout(new MigLayout("", "[][][grow][grow][][grow][][grow][][grow]", "[][][][][][][][][]"));
  530.            
  531.                 // Header row (first):
  532.                 JLabel lblProductType = new JLabel("Product Type");
  533.                 lblProductType.setFont(new Font("Arial", lblProductType.getFont().getStyle() | Font.ITALIC, 12));
  534.                 lblProductType.setBounds(0, 0, 99, 16);
  535.                 quantitiesPanel.add(lblProductType, "cell 0 0,growx");
  536.                 lblProductType.setHorizontalAlignment(SwingConstants.CENTER);
  537.                
  538.                 JLabel lblToComplete = new JLabel("To Complete");
  539.                 lblToComplete.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() | Font.ITALIC));
  540.                 lblToComplete.setBounds(0, 0, 80, 16);
  541.                 quantitiesPanel.add(lblToComplete, "cell 2 0,growx");
  542.                 lblToComplete.setHorizontalAlignment(SwingConstants.CENTER);
  543.                
  544.                 JLabel lblMaximums = new JLabel("Maximums");
  545.                 lblMaximums.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() | Font.ITALIC));
  546.                 lblMaximums.setBounds(0, 0, 174, 16);
  547.                 quantitiesPanel.add(lblMaximums, "cell 3 0,growx");
  548.                 lblMaximums.setHorizontalAlignment(SwingConstants.CENTER);
  549.                
  550.                 JLabel lblScheduled = new JLabel("Scheduled");
  551.                 lblScheduled.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() | Font.ITALIC));
  552.                 lblScheduled.setBounds(0, 0, 64, 16);
  553.                 quantitiesPanel.add(lblScheduled, "cell 5 0,growx");
  554.                 lblScheduled.setHorizontalAlignment(SwingConstants.CENTER);
  555.                
  556.                 JLabel lblCompleted = new JLabel("Completed");
  557.                 lblCompleted.setHorizontalAlignment(SwingConstants.CENTER);
  558.                 lblCompleted.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() | Font.ITALIC));
  559.                 quantitiesPanel.add(lblCompleted, "cell 7 0");
  560.                
  561.                 JLabel lblRemaining = new JLabel("Remaining");
  562.                 lblRemaining.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() | Font.ITALIC));
  563.                 lblRemaining.setHorizontalAlignment(SwingConstants.CENTER);
  564.                 quantitiesPanel.add(lblRemaining, "cell 9 0,growx");
  565.                
  566.                 JSeparator headerSeparator = new JSeparator(SwingConstants.HORIZONTAL);
  567.                 headerSeparator.setBorder(new LineBorder(new Color(0, 0, 0)));
  568.                 quantitiesPanel.add(headerSeparator, "cell 0 1 10 1,grow");
  569.                
  570.                 // Screen row (second):
  571.                 JLabel lblScreen = new JLabel("Screen:");
  572.                 lblScreen.setFont(new Font("Arial", Font.PLAIN, 13));
  573.                 quantitiesPanel.add(lblScreen, "cell 0 2,growx,aligny center");
  574.                
  575.                 lblToCompleteScreen = new JLabel((String) null);
  576.                 lblToCompleteScreen.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  577.                 lblToCompleteScreen.setHorizontalAlignment(SwingConstants.RIGHT);
  578.                 quantitiesPanel.add(lblToCompleteScreen, "cell 2 2,alignx trailing");
  579.                
  580.                                 tfAvailableScreen = new JTextField();
  581.                                 tfAvailableScreen.setName("Screen");
  582.                                 tfAvailableScreen.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  583.                                 tfAvailableScreen.setHorizontalAlignment(SwingConstants.TRAILING);
  584.                                 tfAvailableScreen.addFocusListener(new FocusAdapter() {
  585.                                     @Override
  586.                                     public void focusLost(FocusEvent e) {
  587.                                         updateThisField(tfAvailableScreen, true);
  588.                                     }
  589.                                 });
  590.                                 tfAvailableScreen.addActionListener(new ActionListener() {
  591.                                     public void actionPerformed(ActionEvent e) {
  592.                                         updateThisField(tfAvailableScreen, true);
  593.                                     }
  594.                                 });
  595.                                
  596.                                 quantitiesPanel.add(tfAvailableScreen, "cell 3 2,growx");
  597.                                
  598.                                 JLabel lblMinusScreen = new JLabel("-");
  599.                                 lblMinusScreen.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  600.                                 lblMinusScreen.setHorizontalAlignment(SwingConstants.CENTER);
  601.                                 quantitiesPanel.add(lblMinusScreen, "cell 4 2,growx");
  602.                                
  603.                                 lblScheduledScreen = new JLabel((String) null);
  604.                                 lblScheduledScreen.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  605.                                 lblScheduledScreen.setHorizontalAlignment(SwingConstants.RIGHT);
  606.                                 quantitiesPanel.add(lblScheduledScreen, "cell 5 2,growx");
  607.                                
  608.                                 JLabel lblPlusScreen = new JLabel("+");
  609.                                 lblPlusScreen.setHorizontalAlignment(SwingConstants.CENTER);
  610.                                 lblPlusScreen.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  611.                                 quantitiesPanel.add(lblPlusScreen, "cell 6 2,growx");
  612.                                
  613.                                 lblCompletedScreen = new JLabel((String) null);
  614.                                 lblCompletedScreen.setHorizontalAlignment(SwingConstants.RIGHT);
  615.                                 lblCompletedScreen.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  616.                                 quantitiesPanel.add(lblCompletedScreen, "cell 7 2,growx");
  617.                                
  618.                                 JLabel lblEqualsScreen = new JLabel("=");
  619.                                 lblEqualsScreen.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  620.                                 lblEqualsScreen.setHorizontalAlignment(SwingConstants.CENTER);
  621.                                 quantitiesPanel.add(lblEqualsScreen, "cell 8 2,growx");
  622.                                
  623.                                 lblRemainScreen = new JLabel(usFormat.format(completedScreen));
  624.                                 lblRemainScreen.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  625.                                 quantitiesPanel.add(lblRemainScreen, "cell 9 2,growx");
  626.                                 lblRemainScreen.setHorizontalAlignment(SwingConstants.RIGHT);
  627.                                
  628.                                 JLabel lblPad = new JLabel("Pad:");
  629.                                 lblPad.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  630.                                 quantitiesPanel.add(lblPad, "cell 0 3,growx");
  631.                                
  632.                                 lblToCompletePad = new JLabel((String) null);
  633.                                 lblToCompletePad.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  634.                                 lblToCompletePad.setHorizontalAlignment(SwingConstants.RIGHT);
  635.                                 quantitiesPanel.add(lblToCompletePad, "cell 2 3,growx");
  636.                                
  637.                                 tfAvailablePad = new JTextField();
  638.                                 tfAvailablePad.setName("Pad");
  639.                                 tfAvailablePad.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  640.                                 tfAvailablePad.setHorizontalAlignment(SwingConstants.TRAILING);
  641.                                 tfAvailablePad.addFocusListener(new FocusAdapter() {
  642.                                     @Override
  643.                                     public void focusLost(FocusEvent e) {
  644.                                         updateThisField(tfAvailablePad, true);
  645.                                     }
  646.                                 });
  647.                                 tfAvailablePad.addActionListener(new ActionListener() {
  648.                                     public void actionPerformed(ActionEvent e) {
  649.                                         updateThisField(tfAvailablePad, true);
  650.                                     }
  651.                                 });
  652.                                 quantitiesPanel.add(tfAvailablePad, "cell 3 3,growx");
  653.                                
  654.                                 JLabel lblMinusPad = new JLabel("-");
  655.                                 lblMinusPad.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  656.                                 lblMinusPad.setHorizontalAlignment(SwingConstants.CENTER);
  657.                                 quantitiesPanel.add(lblMinusPad, "cell 4 3,growx");
  658.                                
  659.                                 lblScheduledPad = new JLabel((String) null);
  660.                                 lblScheduledPad.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  661.                                 lblScheduledPad.setHorizontalAlignment(SwingConstants.RIGHT);
  662.                                 quantitiesPanel.add(lblScheduledPad, "cell 5 3,growx");
  663.                                
  664.                                 JLabel lblPlusPad = new JLabel("+");
  665.                                 lblPlusPad.setHorizontalAlignment(SwingConstants.CENTER);
  666.                                 lblPlusPad.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  667.                                 quantitiesPanel.add(lblPlusPad, "cell 6 3,growx");
  668.                                
  669.                                 lblCompletedPad = new JLabel((String) null);
  670.                                 lblCompletedPad.setHorizontalAlignment(SwingConstants.RIGHT);
  671.                                 lblCompletedPad.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  672.                                 quantitiesPanel.add(lblCompletedPad, "cell 7 3,growx");
  673.                                
  674.                                 JLabel lblEqualsPad = new JLabel("=");
  675.                                 lblEqualsPad.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  676.                                 lblEqualsPad.setHorizontalAlignment(SwingConstants.CENTER);
  677.                                 quantitiesPanel.add(lblEqualsPad, "cell 8 3,growx");
  678.                                
  679.                                 lblRemainPad = new JLabel(usFormat.format(completedPad));
  680.                                 lblRemainPad.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  681.                                 lblRemainPad.setHorizontalAlignment(SwingConstants.RIGHT);
  682.                                 quantitiesPanel.add(lblRemainPad, "cell 9 3,growx");
  683.                                
  684.                                 JLabel lblHotstamp = new JLabel("Hotstamp:");
  685.                                 lblHotstamp.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  686.                                 quantitiesPanel.add(lblHotstamp, "cell 0 4,growx");
  687.                                
  688.                                 lblToCompleteHotstamp = new JLabel((String) null);
  689.                                 lblToCompleteHotstamp.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  690.                                 lblToCompleteHotstamp.setHorizontalAlignment(SwingConstants.RIGHT);
  691.                                 quantitiesPanel.add(lblToCompleteHotstamp, "cell 2 4,growx");
  692.                                
  693.                                 tfAvailableHotstamp = new JTextField();
  694.                                 tfAvailableHotstamp.setName("Hotstamp");
  695.                                 tfAvailableHotstamp.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  696.                                 tfAvailableHotstamp.setHorizontalAlignment(SwingConstants.TRAILING);
  697.                                 tfAvailableHotstamp.addFocusListener(new FocusAdapter() {
  698.                                     @Override
  699.                                     public void focusLost(FocusEvent e) {
  700.                                         updateThisField(tfAvailableHotstamp, true);
  701.                                     }
  702.                                 });
  703.                                 tfAvailableHotstamp.addActionListener(new ActionListener() {
  704.                                     public void actionPerformed(ActionEvent e) {
  705.                                         updateThisField(tfAvailableHotstamp, true);
  706.                                     }
  707.                                 });
  708.                                 quantitiesPanel.add(tfAvailableHotstamp, "cell 3 4,growx");
  709.                                
  710.                                 JLabel lblMinusHotstamp = new JLabel("-");
  711.                                 lblMinusHotstamp.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  712.                                 lblMinusHotstamp.setHorizontalAlignment(SwingConstants.CENTER);
  713.                                 quantitiesPanel.add(lblMinusHotstamp, "cell 4 4,growx");
  714.                                
  715.                                 lblScheduledHotstamp = new JLabel((String) null);
  716.                                 lblScheduledHotstamp.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  717.                                 lblScheduledHotstamp.setHorizontalAlignment(SwingConstants.RIGHT);
  718.                                 quantitiesPanel.add(lblScheduledHotstamp, "cell 5 4,growx");
  719.                                
  720.                                 JLabel lblPlusHotstamp = new JLabel("+");
  721.                                 lblPlusHotstamp.setHorizontalAlignment(SwingConstants.CENTER);
  722.                                 lblPlusHotstamp.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  723.                                 quantitiesPanel.add(lblPlusHotstamp, "cell 6 4,growx");
  724.                                
  725.                                 lblCompletedHotstamp = new JLabel((String) null);
  726.                                 lblCompletedHotstamp.setHorizontalAlignment(SwingConstants.RIGHT);
  727.                                 lblCompletedHotstamp.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  728.                                 quantitiesPanel.add(lblCompletedHotstamp, "cell 7 4,growx");
  729.                                
  730.                                 JLabel lblEqualsHotstamp = new JLabel("=");
  731.                                 lblEqualsHotstamp.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  732.                                 lblEqualsHotstamp.setHorizontalAlignment(SwingConstants.CENTER);
  733.                                 quantitiesPanel.add(lblEqualsHotstamp, "cell 8 4,growx");
  734.                                
  735.                                 lblRemainHotstamp = new JLabel(usFormat.format(completedHotstamp));
  736.                                 lblRemainHotstamp.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  737.                                 lblRemainHotstamp.setHorizontalAlignment(SwingConstants.RIGHT);
  738.                                 quantitiesPanel.add(lblRemainHotstamp, "cell 9 4,growx");
  739.                                
  740.                                 JLabel lblOffsetCups = new JLabel("Offset Cups:");
  741.                                 lblOffsetCups.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  742.                                 quantitiesPanel.add(lblOffsetCups, "cell 0 5,growx");
  743.                                
  744.                                 lblToCompleteOffsetCups = new JLabel((String) null);
  745.                                 lblToCompleteOffsetCups.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  746.                                 lblToCompleteOffsetCups.setHorizontalAlignment(SwingConstants.RIGHT);
  747.                                 quantitiesPanel.add(lblToCompleteOffsetCups, "cell 2 5,growx");
  748.                                
  749.                                 tfAvailableOffsetCups = new JTextField();
  750.                                 tfAvailableOffsetCups.setName("OffsetCups");
  751.                                 tfAvailableOffsetCups.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  752.                                 tfAvailableOffsetCups.setHorizontalAlignment(SwingConstants.TRAILING);
  753.                                 tfAvailableOffsetCups.addFocusListener(new FocusAdapter() {
  754.                                     @Override
  755.                                     public void focusLost(FocusEvent e) {
  756.                                         updateThisField(tfAvailableOffsetCups, true);
  757.                                     }
  758.                                 });
  759.                                 tfAvailableOffsetCups.addActionListener(new ActionListener() {
  760.                                     public void actionPerformed(ActionEvent e) {
  761.                                         updateThisField(tfAvailableOffsetCups, true);
  762.                                     }
  763.                                 });
  764.                                 quantitiesPanel.add(tfAvailableOffsetCups, "cell 3 5,growx");
  765.                                
  766.                                 JLabel lblMinusOffsetCups = new JLabel("-");
  767.                                 lblMinusOffsetCups.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  768.                                 lblMinusOffsetCups.setHorizontalAlignment(SwingConstants.CENTER);
  769.                                 quantitiesPanel.add(lblMinusOffsetCups, "cell 4 5,growx");
  770.                                
  771.                                 lblScheduledOffsetCups = new JLabel((String) null);
  772.                                 lblScheduledOffsetCups.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  773.                                 lblScheduledOffsetCups.setHorizontalAlignment(SwingConstants.RIGHT);
  774.                                 quantitiesPanel.add(lblScheduledOffsetCups, "cell 5 5,growx");
  775.                                
  776.                                 JLabel lblPlusOffsetCups = new JLabel("+");
  777.                                 lblPlusOffsetCups.setHorizontalAlignment(SwingConstants.CENTER);
  778.                                 lblPlusOffsetCups.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  779.                                 quantitiesPanel.add(lblPlusOffsetCups, "cell 6 5,growx");
  780.                                
  781.                                 lblCompletedOffsetCups = new JLabel((String) null);
  782.                                 lblCompletedOffsetCups.setHorizontalAlignment(SwingConstants.RIGHT);
  783.                                 lblCompletedOffsetCups.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  784.                                 quantitiesPanel.add(lblCompletedOffsetCups, "cell 7 5,growx");
  785.                                
  786.                                 JLabel lblEqualsOffsetCups = new JLabel("=");
  787.                                 lblEqualsOffsetCups.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  788.                                 lblEqualsOffsetCups.setHorizontalAlignment(SwingConstants.CENTER);
  789.                                 quantitiesPanel.add(lblEqualsOffsetCups, "cell 8 5,growx");
  790.                                
  791.                                 lblRemainOffsetCups = new JLabel(usFormat.format(completedOffsetCups));
  792.                                 lblRemainOffsetCups.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  793.                                 lblRemainOffsetCups.setHorizontalAlignment(SwingConstants.RIGHT);
  794.                                 quantitiesPanel.add(lblRemainOffsetCups, "cell 9 5,growx");
  795.                                
  796.                                 JLabel lblOffsetNaps = new JLabel("Offset Napkins:");
  797.                                 lblOffsetNaps.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  798.                                 quantitiesPanel.add(lblOffsetNaps, "cell 0 6,growx");
  799.                                
  800.                                 lblToCompleteOffsetNaps = new JLabel((String) null);
  801.                                 lblToCompleteOffsetNaps.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  802.                                 lblToCompleteOffsetNaps.setHorizontalAlignment(SwingConstants.RIGHT);
  803.                                 quantitiesPanel.add(lblToCompleteOffsetNaps, "cell 2 6,growx");
  804.                                
  805.                                 tfAvailableOffsetNaps = new JTextField();
  806.                                 tfAvailableOffsetNaps.setName("OffsetNaps");
  807.                                 tfAvailableOffsetNaps.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  808.                                 tfAvailableOffsetNaps.setHorizontalAlignment(SwingConstants.TRAILING);
  809.                                 tfAvailableOffsetNaps.addFocusListener(new FocusAdapter() {
  810.                                     @Override
  811.                                     public void focusLost(FocusEvent e) {
  812.                                         updateThisField(tfAvailableOffsetNaps, true);
  813.                                     }
  814.                                 });
  815.                                 tfAvailableOffsetNaps.addActionListener(new ActionListener() {
  816.                                     public void actionPerformed(ActionEvent e) {
  817.                                         updateThisField(tfAvailableOffsetNaps, true);
  818.                                     }
  819.                                 });
  820.                                 quantitiesPanel.add(tfAvailableOffsetNaps, "cell 3 6,growx");
  821.                                
  822.                                 JLabel lblMinusOffsetNaps = new JLabel("-");
  823.                                 lblMinusOffsetNaps.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  824.                                 lblMinusOffsetNaps.setHorizontalAlignment(SwingConstants.CENTER);
  825.                                 quantitiesPanel.add(lblMinusOffsetNaps, "cell 4 6,growx");
  826.                                
  827.                                 lblScheduledOffsetNaps = new JLabel((String) null);
  828.                                 lblScheduledOffsetNaps.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  829.                                 lblScheduledOffsetNaps.setHorizontalAlignment(SwingConstants.RIGHT);
  830.                                 quantitiesPanel.add(lblScheduledOffsetNaps, "cell 5 6,growx");
  831.                                
  832.                                 JLabel lblPlusOffsetNaps = new JLabel("+");
  833.                                 lblPlusOffsetNaps.setHorizontalAlignment(SwingConstants.CENTER);
  834.                                 lblPlusOffsetNaps.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  835.                                 quantitiesPanel.add(lblPlusOffsetNaps, "cell 6 6,growx");
  836.                                
  837.                                 lblCompletedOffsetNaps = new JLabel((String) null);
  838.                                 lblCompletedOffsetNaps.setHorizontalAlignment(SwingConstants.RIGHT);
  839.                                 lblCompletedOffsetNaps.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  840.                                 quantitiesPanel.add(lblCompletedOffsetNaps, "cell 7 6,growx");
  841.                                
  842.                                 JLabel lblEqualsOffsetNaps = new JLabel("=");
  843.                                 lblEqualsOffsetNaps.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  844.                                 lblEqualsOffsetNaps.setHorizontalAlignment(SwingConstants.CENTER);
  845.                                 quantitiesPanel.add(lblEqualsOffsetNaps, "cell 8 6,growx");
  846.                                
  847.                                 lblRemainOffsetNaps = new JLabel(usFormat.format(completedOffsetNaps));
  848.                                 lblRemainOffsetNaps.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  849.                                 lblRemainOffsetNaps.setHorizontalAlignment(SwingConstants.RIGHT);
  850.                                 quantitiesPanel.add(lblRemainOffsetNaps, "cell 9 6,growx");
  851.                                
  852.                                 JLabel lblDigital = new JLabel("Digital:");
  853.                                 lblDigital.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  854.                                 quantitiesPanel.add(lblDigital, "cell 0 7,growx");
  855.                                
  856.                                 lblToCompleteDigital = new JLabel((String) null);
  857.                                 lblToCompleteDigital.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  858.                                 lblToCompleteDigital.setHorizontalAlignment(SwingConstants.RIGHT);
  859.                                 quantitiesPanel.add(lblToCompleteDigital, "cell 2 7,growx");
  860.                                
  861.                                 tfAvailableDigital = new JTextField();
  862.                                 tfAvailableDigital.setName("Digital");
  863.                                 tfAvailableDigital.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  864.                                 tfAvailableDigital.setHorizontalAlignment(SwingConstants.TRAILING);
  865.                                 tfAvailableDigital.addFocusListener(new FocusAdapter() {
  866.                                     @Override
  867.                                     public void focusLost(FocusEvent e) {
  868.                                         updateThisField(tfAvailableDigital, true);
  869.                                     }
  870.                                 });
  871.                                 tfAvailableDigital.addActionListener(new ActionListener() {
  872.                                     public void actionPerformed(ActionEvent e) {
  873.                                         updateThisField(tfAvailableDigital, true);
  874.                                     }
  875.                                 });
  876.                                 quantitiesPanel.add(tfAvailableDigital, "cell 3 7,growx");
  877.                                
  878.                                 JLabel lblMinusDigital = new JLabel("-");
  879.                                 lblMinusDigital.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  880.                                 lblMinusDigital.setHorizontalAlignment(SwingConstants.CENTER);
  881.                                 quantitiesPanel.add(lblMinusDigital, "cell 4 7,growx");
  882.                                
  883.                                 lblScheduledDigital = new JLabel((String) null);
  884.                                 lblScheduledDigital.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  885.                                 lblScheduledDigital.setHorizontalAlignment(SwingConstants.RIGHT);
  886.                                 quantitiesPanel.add(lblScheduledDigital, "cell 5 7,growx");
  887.                                
  888.                                 JLabel lblPlusDigital = new JLabel("+");
  889.                                 lblPlusDigital.setHorizontalAlignment(SwingConstants.CENTER);
  890.                                 lblPlusDigital.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  891.                                 quantitiesPanel.add(lblPlusDigital, "cell 6 7,growx");
  892.                                
  893.                                 lblCompletedDigital = new JLabel((String) null);
  894.                                 lblCompletedDigital.setHorizontalAlignment(SwingConstants.RIGHT);
  895.                                 lblCompletedDigital.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  896.                                 quantitiesPanel.add(lblCompletedDigital, "cell 7 7,growx");
  897.                                
  898.                                 JLabel lblEqualsDigital = new JLabel("=");
  899.                                 lblEqualsDigital.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  900.                                 lblEqualsDigital.setHorizontalAlignment(SwingConstants.CENTER);
  901.                                 quantitiesPanel.add(lblEqualsDigital, "cell 8 7,growx");
  902.                                
  903.                                 lblRemainDigital = new JLabel(usFormat.format(completedDigital));
  904.                                 lblRemainDigital.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC, lblProductType.getFont().getSize() + 1f));
  905.                                 lblRemainDigital.setHorizontalAlignment(SwingConstants.RIGHT);
  906.                                 quantitiesPanel.add(lblRemainDigital, "cell 9 7,growx");
  907.                                
  908.                                 JLabel lblTotal = new JLabel("Total:");
  909.                                 lblTotal.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC | Font.BOLD, lblProductType.getFont().getSize() + 4f));
  910.                                 quantitiesPanel.add(lblTotal, "cell 0 8,growx");
  911.                                
  912.                                 lblToCompleteTotal = new JLabel((String) null);
  913.                                 lblToCompleteTotal.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC | Font.BOLD, lblProductType.getFont().getSize() + 4f));
  914.                                 lblToCompleteTotal.setHorizontalAlignment(SwingConstants.RIGHT);
  915.                                 quantitiesPanel.add(lblToCompleteTotal, "cell 2 8,growx");
  916.                                
  917.                                 tfAvailableTotal = new JTextField();
  918.                                 tfAvailableTotal.setEditable(false);
  919.                                 tfAvailableTotal.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC | Font.BOLD, lblProductType.getFont().getSize() + 4f));
  920.                                 tfAvailableTotal.setText(usFormat.format(totalAvailable));
  921.                                 tfAvailableTotal.setHorizontalAlignment(SwingConstants.TRAILING);
  922.                                 quantitiesPanel.add(tfAvailableTotal, "cell 3 8,growx");
  923.                                
  924.                                 JLabel lblMinusTotal = new JLabel("-");
  925.                                 lblMinusTotal.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC | Font.BOLD, lblProductType.getFont().getSize() + 4f));
  926.                                 lblMinusTotal.setHorizontalAlignment(SwingConstants.CENTER);
  927.                                 quantitiesPanel.add(lblMinusTotal, "cell 4 8,growx");
  928.                                
  929.                                 lblScheduledTotal = new JLabel((String) null);
  930.                                 lblScheduledTotal.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC | Font.BOLD, lblProductType.getFont().getSize() + 4f));
  931.                                 lblScheduledTotal.setHorizontalAlignment(SwingConstants.RIGHT);
  932.                                 quantitiesPanel.add(lblScheduledTotal, "cell 5 8,growx");
  933.                                
  934.                                 JLabel lblPlusTotal = new JLabel("+");
  935.                                 lblPlusTotal.setHorizontalAlignment(SwingConstants.CENTER);
  936.                                 lblPlusTotal.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC | Font.BOLD, lblProductType.getFont().getSize() + 4f));
  937.                                 quantitiesPanel.add(lblPlusTotal, "cell 6 8,growx");
  938.                                
  939.                                 lblCompletedTotal = new JLabel((String) null);
  940.                                 lblCompletedTotal.setHorizontalAlignment(SwingConstants.RIGHT);
  941.                                 lblCompletedTotal.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC | Font.BOLD, lblProductType.getFont().getSize() + 4f));
  942.                                 quantitiesPanel.add(lblCompletedTotal, "cell 7 8,growx");
  943.                                
  944.                                 JLabel lblEqualsTotal = new JLabel("=");
  945.                                 lblEqualsTotal.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC | Font.BOLD, lblProductType.getFont().getSize() + 4f));
  946.                                 lblEqualsTotal.setHorizontalAlignment(SwingConstants.CENTER);
  947.                                 quantitiesPanel.add(lblEqualsTotal, "cell 8 8,growx");
  948.                                
  949.                                     lblRemainTotal = new JLabel();
  950.                                     lblRemainTotal.setFont(lblProductType.getFont().deriveFont(lblProductType.getFont().getStyle() & ~Font.ITALIC | Font.BOLD, lblProductType.getFont().getSize() + 4f));
  951.                                     lblRemainTotal.setHorizontalAlignment(SwingConstants.RIGHT);
  952.                                     quantitiesPanel.add(lblRemainTotal, "cell 9 8,growx");
  953.                                    
  954.                                    
  955.                                     JPanel redBarPanel = new JPanel();
  956.                                     redBarPanel.setOpaque(false);
  957.                                     redBarPanel.setLocation(0, 0);
  958.                                     redBarPanel.setSize(510, 271);
  959.                                     layeredPane.add(redBarPanel);
  960.                                     layeredPane.setLayer(redBarPanel, 0);
  961.                                     redBarPanel.setLayout(new MigLayout("", "[][][grow][grow][][grow][][grow][][grow]", "[::16][0][::22][::21][::21][::21][::21][::21][28:n]"));
  962.  
  963.                                    
  964.                                     redbarScreen = new JLabel("");
  965.                                     redbarScreen.setOpaque(true);
  966.                                         redbarScreen.setVisible(true);
  967. //                                      layeredPane.setLayer(redbarScreen, 0);
  968.                                         redbarScreen.setBackground(warningColor);
  969. //                                      redbarScreen.setBounds(0, 37, 510, 31);
  970.                                         redBarPanel.add(redbarScreen, "cell 0 2 10 1,grow");
  971.                                        
  972.                                         redbarPad = new JLabel("");
  973.                                         redbarPad.setVisible(true);
  974. //                                      layeredPane.setLayer(redbarPad, 0);
  975.                                         redbarPad.setBackground(warningColor);
  976.                                         redbarPad.setBounds(0, 68, 510, 32);
  977.                                         redBarPanel.add(redbarPad, "cell 0 3 10 1,grow");
  978.                                        
  979.                                         redbarHotstamp = new JLabel("");
  980.                                         redbarHotstamp.setVisible(true);
  981. //                                      layeredPane.setLayer(redbarHotstamp, 0);
  982.                                         redbarHotstamp.setBackground(warningColor);
  983.                                         redbarHotstamp.setBounds(0, 100, 510, 32);
  984.                                         redBarPanel.add(redbarHotstamp, "cell 0 4 10 1,grow");
  985.                                        
  986.                                         redbarOffsetCups = new JLabel("");
  987.                                         redbarOffsetCups.setVisible(true);
  988. //                                      layeredPane.setLayer(redbarOffsetCups, 0);
  989.                                         redbarOffsetCups.setBackground(warningColor);
  990.                                         redbarOffsetCups.setBounds(0, 132, 510, 32);
  991.                                         redBarPanel.add(redbarOffsetCups, "cell 0 5 10 1,grow");
  992.                                        
  993.                                         redbarOffsetNaps = new JLabel("");
  994.                                         redbarOffsetNaps.setVisible(true);
  995. //                                      layeredPane.setLayer(redbarOffsetNaps, 0);
  996.                                         redbarOffsetNaps.setBackground(warningColor);
  997.                                         redbarOffsetNaps.setBounds(0, 164, 510, 32);
  998.                                         redBarPanel.add(redbarOffsetNaps, "cell 0 6 10 1,grow");
  999.                                        
  1000.                                         redbarDigital = new JLabel("");
  1001.                                         redbarDigital.setVisible(true);
  1002. //                                      layeredPane.setLayer(redbarDigital, 0);
  1003.                                         redbarDigital.setBackground(warningColor);
  1004.                                         redbarDigital.setBounds(0, 196, 510, 32);
  1005.                                         redBarPanel.add(redbarDigital, "cell 0 7 10 1,grow");
  1006.                                        
  1007.                                         redbarTotal = new JLabel("");
  1008.                                         redbarTotal.setVisible(true);
  1009. //                                      layeredPane.setLayer(redbarTotal, 0);
  1010.                                         redbarTotal.setBackground(warningColor);
  1011.                                         redbarTotal.setBounds(0, 228, 510, 38);
  1012.                                         redBarPanel.add(redbarTotal, "cell 0 8 10 1,grow");
  1013.     }
  1014.    
  1015.    
  1016.     private void checkForOverscheduling ()
  1017.     {
  1018.         log.entry("Checking to see if any jobs have been over-scheduled.");
  1019.         try {
  1020.             if (usFormat.parse(lblScheduledScreen.getText()).longValue() > usFormat.parse(tfAvailableScreen.getText()).longValue())
  1021.                 redbarScreen.setOpaque(true);
  1022.             else
  1023.                 redbarScreen.setOpaque(false);
  1024.            
  1025.             if (usFormat.parse(lblScheduledPad.getText()).longValue() > usFormat.parse(tfAvailablePad.getText()).longValue())
  1026.                 redbarPad.setOpaque(true);
  1027.             else
  1028.                 redbarPad.setOpaque(false);
  1029.            
  1030.             if (usFormat.parse(lblScheduledHotstamp.getText()).longValue() > usFormat.parse(tfAvailableHotstamp.getText()).longValue())
  1031.                 redbarHotstamp.setOpaque(true);
  1032.             else
  1033.                 redbarHotstamp.setOpaque(false);
  1034.            
  1035.             if (usFormat.parse(lblScheduledOffsetCups.getText()).longValue() > usFormat.parse(tfAvailableOffsetCups.getText()).longValue())
  1036.                 redbarOffsetCups.setOpaque(true);
  1037.             else
  1038.                 redbarOffsetCups.setOpaque(false);
  1039.            
  1040.             if (usFormat.parse(lblScheduledOffsetNaps.getText()).longValue() > usFormat.parse(tfAvailableOffsetNaps.getText()).longValue())
  1041.                 redbarOffsetNaps.setOpaque(true);
  1042.             else
  1043.                 redbarOffsetNaps.setOpaque(false);
  1044.            
  1045.             if (usFormat.parse(lblScheduledDigital.getText()).longValue() > usFormat.parse(tfAvailableDigital.getText()).longValue())
  1046.                 redbarDigital.setOpaque(true);
  1047.             else
  1048.                 redbarDigital.setOpaque(false);
  1049.            
  1050.             if (usFormat.parse(lblScheduledTotal.getText()).longValue() > usFormat.parse(tfAvailableTotal.getText()).longValue())
  1051.                 redbarTotal.setOpaque(true);
  1052.             else
  1053.                 redbarTotal.setOpaque(false);
  1054.         } catch (ParseException e) {
  1055.             // TODO Auto-generated catch block
  1056.             e.printStackTrace();
  1057.         }
  1058.     }
  1059.    
  1060.     private void disableArrows ()
  1061.     {
  1062.         btnPY.setEnabled(false);
  1063.         btnPM.setEnabled(false);
  1064.         btnPD.setEnabled(false);
  1065.         btnND.setEnabled(false);
  1066.         btnNM.setEnabled(false);
  1067.         btnNY.setEnabled(false);
  1068.        
  1069.         tfAvailableScreen.setEnabled(false);
  1070.         tfAvailablePad.setEnabled(false);
  1071.         tfAvailableHotstamp.setEnabled(false);
  1072.         tfAvailableOffsetCups.setEnabled(false);
  1073.         tfAvailableOffsetNaps.setEnabled(false);
  1074.         tfAvailableDigital.setEnabled(false);
  1075.     }
  1076.  
  1077.     private void enableArrows ()
  1078.     {
  1079.         btnPY.setEnabled(true);
  1080.         btnPM.setEnabled(true);
  1081.         btnPD.setEnabled(true);
  1082.         btnND.setEnabled(true);
  1083.         btnNM.setEnabled(true);
  1084.         btnNY.setEnabled(true);
  1085.        
  1086.         tfAvailableScreen.setEnabled(true);
  1087.         tfAvailablePad.setEnabled(true);
  1088.         tfAvailableHotstamp.setEnabled(true);
  1089.         tfAvailableOffsetCups.setEnabled(true);
  1090.         tfAvailableOffsetNaps.setEnabled(true);
  1091.         tfAvailableDigital.setEnabled(true);
  1092.     }
  1093.    
  1094.     private void clearQuantities ()
  1095.     {
  1096.         lblToCompleteScreen.setText(DASH);
  1097.         lblToCompletePad.setText(DASH);
  1098.         lblToCompleteHotstamp.setText(DASH);
  1099.         lblToCompleteOffsetCups.setText(DASH);
  1100.         lblToCompleteOffsetNaps.setText(DASH);
  1101.         lblToCompleteDigital.setText(DASH);
  1102.         lblToCompleteTotal.setText(DASH);
  1103.        
  1104.         tfAvailableScreen.setText(DASH);
  1105.         tfAvailablePad.setText(DASH);
  1106.         tfAvailableHotstamp.setText(DASH);
  1107.         tfAvailableOffsetCups.setText(DASH);
  1108.         tfAvailableOffsetNaps.setText(DASH);
  1109.         tfAvailableDigital.setText(DASH);
  1110.         tfAvailableTotal.setText(DASH);
  1111.        
  1112.         lblRemainScreen.setText(DASH);
  1113.         lblRemainPad.setText(DASH);
  1114.         lblRemainHotstamp.setText(DASH);
  1115.         lblRemainOffsetCups.setText(DASH);
  1116.         lblRemainOffsetNaps.setText(DASH);
  1117.         lblRemainDigital.setText(DASH);
  1118.         lblRemainTotal.setText(DASH);
  1119.     }
  1120.    
  1121.     /**
  1122.      * Returns a String value of the date at the top of the window.
  1123.      *
  1124.      * @return the text of the lblDate
  1125.      */
  1126.     public static String getDisplayedDate()
  1127.     {
  1128.         return lblDate.getText();
  1129.     }
  1130.  
  1131.     /**
  1132.      * Sets a String value to the date area at the top of the window.
  1133.      *
  1134.      * @param newDate the lblDate to set
  1135.      */
  1136.     public void setDisplayedDate(String newDate)
  1137.     {
  1138.         lblDate.setText(newDate);
  1139.     }
  1140.  
  1141.     public void updateGrandTotals ()
  1142.     {
  1143.         totalCompleted = completedScreen + completedPad + completedHotstamp +
  1144.                 completedOffsetCups + completedOffsetNaps + completedDigital;
  1145.         totalScheduled = scheduledScreen + scheduledPad + scheduledHotstamp +
  1146.                 scheduledOffsetCups + scheduledOffsetNaps + scheduledDigital;
  1147.         totalEarly = earlyScreen + earlyPad + earlyHotstamp +
  1148.                 earlyOffsetCups + earlyOffsetNaps + earlyDigital;
  1149.         totalRemaining = todaysBean.getRemainScreen() + todaysBean.getRemainPad() +
  1150.                 todaysBean.getRemainHotstamp() + todaysBean.getRemainOffsetCups() +
  1151.                 todaysBean.getRemainOffsetNaps() + todaysBean.getRemainDigital();
  1152.         try {
  1153.             totalAvailable = usFormat.parse(tfAvailableScreen.getText()).longValue() +
  1154.                     usFormat.parse(tfAvailablePad.getText()).longValue() +
  1155.                     usFormat.parse(tfAvailableHotstamp.getText()).longValue() +
  1156.                     usFormat.parse(tfAvailableOffsetCups.getText()).longValue() +
  1157.                     usFormat.parse(tfAvailableOffsetNaps.getText()).longValue() +
  1158.                     usFormat.parse(tfAvailableDigital.getText()).longValue();
  1159.         } catch (ParseException e) {
  1160.             // TODO Auto-generated catch block
  1161.             e.printStackTrace();
  1162.         }
  1163.        
  1164.         lblToCompleteTotal.setText(usFormat.format(totalScheduled - totalCompleted));
  1165.         tfAvailableTotal.setText(usFormat.format(totalAvailable));
  1166.         lblScheduledTotal.setText(usFormat.format(totalScheduled));
  1167.         lblCompletedTotal.setText(usFormat.format(totalEarly));
  1168.         lblRemainTotal.setText(usFormat.format(totalRemaining));
  1169.    
  1170.         checkForOverscheduling();
  1171.     }
  1172.    
  1173.     public void updateTreeTable (LocalDate ldDate)
  1174.     {
  1175.         log.entry("updateTreeTable");
  1176.        
  1177.         manager.getSelectionModel().removeTreeSelectionListener(selectionListener);
  1178.         DefaultMutableTreeTableNode root = new DefaultMutableTreeTableNode(ldDate.toString());
  1179.         try {
  1180.             jobList = JobManager.getJobsByDate(ldDate);
  1181.             todaysBean = DayManager.getRow(ldDate);
  1182.             List<TreePath> paths = new ArrayList<TreePath>();
  1183.             if (todaysBean == null)
  1184.             {
  1185.                 if (DayManager.insert(ldDate)) todaysBean = DayManager.getRow(ldDate);
  1186.             }
  1187.             if (jobList != null)
  1188.             {
  1189.                 for (Job j : jobList) {
  1190.                     // Adding jobs to the root tree node
  1191.                     DefaultMutableTreeTableNode curJob = new DefaultMutableTreeTableNode(j);
  1192.                     root.add(curJob);
  1193.                     TreePath curJobPath = TreeUtils.getPath(curJob);
  1194.                     log.debug("Checking to see of the current Job is completed.");
  1195.                     if (j.getJobCompleted() != null)
  1196.                     {
  1197.                         paths.add(curJobPath);
  1198.                         for (OrderDetail od : j.getOrderDetailList()) {
  1199.                             log.debug("Assigning the Job's completion Timestamp to one of its OrderDetail's completion Timestamp.");
  1200.                             od.setItemCompleted(j.getJobCompleted());
  1201.     //                      od.setItemCompleted(true);
  1202.                             OrderDetailManager.setItemCompleted(od);
  1203.                         }
  1204.                     }
  1205.                    
  1206.                     // Adding details to each job
  1207.                     boolean allCompleted = true;
  1208.                     List<OrderDetail> completedOrderDetails = new ArrayList<OrderDetail>();
  1209.                     for (OrderDetail od : j.getOrderDetailList()) {
  1210.                         DefaultMutableTreeTableNode curDetail = new DefaultMutableTreeTableNode(od);
  1211.                         curJob.add(curDetail);
  1212.                         TreePath curDetailPath = TreeUtils.getPath(curDetail);
  1213.                         if (od.getItemCompleted() != null && j.getJobCompleted() == null)
  1214.                         {
  1215.                             paths.add(curDetailPath);
  1216.                             completedOrderDetails.add(od);
  1217.                         }
  1218.                         else
  1219.                             allCompleted = false;
  1220.                     }
  1221.                     if (allCompleted)
  1222.                     {
  1223.     //                  j.setCompleted(true);
  1224.                         j.setJobCompleted(OrderDetailManager.getLatestCompletionDate(completedOrderDetails));
  1225.                         JobManager.setCompleted(j);
  1226.                     }
  1227.                 }
  1228.                 TreePath[] treePaths = paths.toArray(new TreePath[0]);
  1229.                 log.trace("Refreshed TreeTable, selection paths is: " + paths.toString());
  1230.                 manager.getSelectionModel().setSelectionPaths(treePaths);
  1231.                 manager.getSelectionModel().addTreeSelectionListener(selectionListener);
  1232.                
  1233.                 treeTable.setTreeTableModel(new SchedulingTreeTableModel(root));
  1234.                
  1235.                 updateMaximumFields();
  1236.                
  1237.                 treeTable.expandAll();
  1238.                 someCollapsed = false;
  1239.                
  1240.                 // Select current day
  1241.                
  1242.                 // Flag days that are completed in the calendars
  1243.                 flagDates();
  1244.             }
  1245.         } catch (Exception e) {
  1246.             log.error("Exception when updating the TreeTable.", e);
  1247.         }
  1248.        
  1249.         log.exit("updateTreeTable");
  1250.     }
  1251.  
  1252.     public void flagDates() {
  1253.         try {
  1254.             Date[] flagDates = DateManager.getDateRange(monthView.getFirstDisplayedDay(), monthView.getLastDisplayedDay());
  1255.             List<Date> dateList = new ArrayList<Date>(Arrays.asList(flagDates));
  1256.             Day dayCheckingBean = new Day();
  1257.             Date dateToCheck = new Date();
  1258.             int i = 0;
  1259.             int endCond = dateList.size();
  1260.             while (i < endCond) {
  1261.                 dateToCheck = dateList.get(i);
  1262.                 dayCheckingBean = DayManager.getRow(LocalDate.fromDateFields(dateToCheck));
  1263.                 if (dayCheckingBean == null || dayCheckingBean.getDayCompleted() == null)
  1264.                 {
  1265.                     dateList.remove(dateToCheck);
  1266.                     endCond--;
  1267.                 }
  1268.                 else
  1269.                     i++;
  1270.             }
  1271.             flagDates = dateList.toArray(EMPTY_DATE_ARRAY);
  1272.             monthView.setFlaggedDates(flagDates);
  1273.         } catch (SQLException e) {
  1274.             log.error("SQLException thrown when flagging dates.", e);
  1275.         }
  1276.     }
  1277.    
  1278.     public void narrowResults (String searchString)
  1279.     {
  1280.         manager.getSelectionModel().removeTreeSelectionListener(selectionListener);
  1281.         DefaultMutableTreeTableNode root = new DefaultMutableTreeTableNode(getDisplayedDate());
  1282.         narrowedJobList.clear();
  1283.         jobNumberMatcher = jobNumberPattern.matcher(searchString);
  1284.         List<TreePath> paths = new ArrayList<TreePath>();
  1285.         try {
  1286.             if (jobNumberMatcher.lookingAt())
  1287.             {
  1288.                 for (Job thisJob : jobList)
  1289.                     if (thisJob.getJobId().toLowerCase().contains(searchString.toLowerCase()))
  1290.                         narrowedJobList.add(thisJob);
  1291.             }
  1292.             else
  1293.             {
  1294.                 for (Job thisJob : jobList)
  1295.                     if (thisJob.getCustomerName().toLowerCase().contains(searchString.toLowerCase()))
  1296.                         narrowedJobList.add(thisJob);
  1297.             }
  1298.    
  1299.             for (Job j : narrowedJobList) {
  1300.                 // Adding jobs to the root tree node
  1301.                 DefaultMutableTreeTableNode curJob = new DefaultMutableTreeTableNode(j);
  1302.                 root.add(curJob);
  1303.                 TreePath curJobPath = TreeUtils.getPath(curJob);
  1304.                 if (j.getJobCompleted() != null)
  1305.                 {
  1306.                     paths.add(curJobPath);
  1307.                     for (OrderDetail od : j.getOrderDetailList()) {
  1308.                         od.setItemCompleted(j.getJobCompleted());
  1309.                         OrderDetailManager.setItemCompleted(od);
  1310.                     }
  1311.                 }
  1312.                
  1313.                 // Adding details to each job
  1314.                 boolean allCompleted = true;
  1315.                 List<OrderDetail> completedOrderDetails = new ArrayList<OrderDetail>();
  1316.                 for (OrderDetail od : j.getOrderDetailList()) {
  1317.                     DefaultMutableTreeTableNode curDetail = new DefaultMutableTreeTableNode(od);
  1318.                     curJob.add(curDetail);
  1319.                     TreePath curDetailPath = TreeUtils.getPath(curDetail);
  1320.                     if (od.getItemCompleted() != null && j.getJobCompleted() == null)
  1321.                     {
  1322.                         paths.add(curDetailPath);
  1323.                         completedOrderDetails.add(od);
  1324.                     }
  1325.                     else
  1326.                         allCompleted = false;
  1327.                 }
  1328.                 if (allCompleted)
  1329.                 {
  1330.                     j.setJobCompleted(OrderDetailManager.getLatestCompletionDate(completedOrderDetails));
  1331.                     JobManager.setCompleted(j);
  1332.                 }
  1333.             }
  1334.    
  1335.             TreePath[] treePaths = paths.toArray(new TreePath[0]);
  1336.             log.trace("Narrowed TreeTable, selection paths is: " + paths.toString());
  1337.             manager.getSelectionModel().setSelectionPaths(treePaths);
  1338.             manager.getSelectionModel().addTreeSelectionListener(selectionListener);
  1339.  
  1340.             treeTable.setTreeTableModel(new SchedulingTreeTableModel(root));
  1341.            
  1342.             treeTable.expandAll();
  1343.             someCollapsed = false;
  1344.            
  1345.             timer.stop();
  1346.            
  1347.         } catch (Exception e) {
  1348.             // TODO Auto-generated catch block
  1349.             e.printStackTrace();
  1350.         }
  1351.     }
  1352.    
  1353.    
  1354.     public void updateThisField (JTextField textField, boolean updateRemaining)
  1355.     {
  1356.         try {
  1357.             tempLong = usFormat.parse(textField.getText()).longValue();
  1358.             textField.setText(usFormat.format(tempLong));
  1359.             switch (textField.getName())
  1360.             {
  1361.                 case "Screen":
  1362.                     todaysBean.setAvailableScreen(tempLong);
  1363.                     break;
  1364.                 case "Pad":
  1365.                     todaysBean.setAvailablePad(tempLong);
  1366.                     break;
  1367.                 case "Hotstamp":
  1368.                     todaysBean.setAvailableHotstamp(tempLong);
  1369.                     break;
  1370.                 case "OffsetCups":
  1371.                     todaysBean.setAvailableOffsetCups(tempLong);
  1372.                     break;
  1373.                 case "OffsetNaps":
  1374.                     todaysBean.setAvailableOffsetNaps(tempLong);
  1375.                     break;
  1376.                 case "Digital":
  1377.                     todaysBean.setAvailableDigital(tempLong);
  1378.                     break;
  1379.                 default:
  1380.                     log.error("When setting the DAY bean after updating the text fields, " +
  1381.                             "could not determine which type of job.");
  1382.             }
  1383.             DayManager.update(todaysBean);
  1384.  
  1385.             updateRemainingFields();
  1386.            
  1387.         } catch (Exception e) {
  1388.             JOptionPane.showMessageDialog(null, e.toString(), "Error", JOptionPane.ERROR_MESSAGE);
  1389.             e.printStackTrace();
  1390.         }      
  1391.     }
  1392.  
  1393.    
  1394.     public void updateMaximumFields ()
  1395.     {
  1396.         tfAvailableScreen.setText(usFormat.format(todaysBean.getAvailableScreen()));
  1397.         tfAvailablePad.setText(usFormat.format(todaysBean.getAvailablePad()));
  1398.         tfAvailableHotstamp.setText(usFormat.format(todaysBean.getAvailableHotstamp()));
  1399.         tfAvailableOffsetCups.setText(usFormat.format(todaysBean.getAvailableOffsetCups()));
  1400.         tfAvailableOffsetNaps.setText(usFormat.format(todaysBean.getAvailableOffsetNaps()));
  1401.         tfAvailableDigital.setText(usFormat.format(todaysBean.getAvailableDigital()));
  1402.        
  1403.         updateScheduledFields();
  1404.     }
  1405.    
  1406.     public void updateRemainingFields ()
  1407.     {
  1408.         try {
  1409.             todaysBean.setRemainScreen(usFormat.parse(tfAvailableScreen.getText()).longValue() - scheduledScreen + earlyScreen);
  1410.             todaysBean.setRemainPad(usFormat.parse(tfAvailablePad.getText()).longValue() - scheduledPad + earlyPad);
  1411.             todaysBean.setRemainHotstamp(usFormat.parse(tfAvailableHotstamp.getText()).longValue() - scheduledHotstamp + earlyHotstamp);
  1412.             todaysBean.setRemainOffsetCups(usFormat.parse(tfAvailableOffsetCups.getText()).longValue() - scheduledOffsetCups + earlyOffsetCups);
  1413.             todaysBean.setRemainOffsetNaps(usFormat.parse(tfAvailableOffsetNaps.getText()).longValue() - scheduledOffsetNaps + earlyOffsetNaps);
  1414.             todaysBean.setRemainDigital(usFormat.parse(tfAvailableDigital.getText()).longValue() - scheduledDigital + earlyDigital);
  1415.             DayManager.update(todaysBean);
  1416.         } catch (Exception e) {
  1417.             // TODO Auto-generated catch block
  1418.             e.printStackTrace();
  1419.         }
  1420.        
  1421.         lblRemainScreen.setText(usFormat.format(todaysBean.getRemainScreen()));
  1422.         lblRemainPad.setText(usFormat.format(todaysBean.getRemainPad()));
  1423.         lblRemainHotstamp.setText(usFormat.format(todaysBean.getRemainHotstamp()));
  1424.         lblRemainOffsetCups.setText(usFormat.format(todaysBean.getRemainOffsetCups()));
  1425.         lblRemainOffsetNaps.setText(usFormat.format(todaysBean.getRemainOffsetNaps()));
  1426.         lblRemainDigital.setText(usFormat.format(todaysBean.getRemainDigital()));
  1427.        
  1428.         updateToCompleteFields();
  1429.     }
  1430.    
  1431.     public void updateScheduledFields ()
  1432.     {
  1433.         scheduledScreen = 0;
  1434.         scheduledPad = 0;
  1435.         scheduledHotstamp = 0;
  1436.         scheduledOffsetCups = 0;
  1437.         scheduledOffsetNaps = 0;
  1438.         scheduledDigital = 0;
  1439.         List<OrderDetail> odList;
  1440.        
  1441.         for (Job job : jobList) {
  1442.             odList = job.getOrderDetailList();
  1443.             for (OrderDetail od : odList) {
  1444.                 switch (od.getPrintType())
  1445.                 {
  1446.                     case SCREEN: scheduledScreen += od.getNumColors() * od.getQuantity(); break;
  1447.                     case PAD: scheduledPad += od.getNumColors() * od.getQuantity(); break;
  1448.                     case HOTSTAMP: scheduledHotstamp += od.getNumColors() * od.getQuantity(); break;
  1449.                     case OFFSET_CUPS: scheduledOffsetCups += od.getNumColors() * od.getQuantity(); break;
  1450.                     case OFFSET_NAPKINS: scheduledOffsetNaps += od.getNumColors() * od.getQuantity(); break;
  1451.                     case DIGITAL: scheduledDigital += od.getQuantity(); break;
  1452.                     default: log.error("Could not figure out PrintType!");
  1453.                 }
  1454.             }
  1455.         }
  1456.  
  1457.         lblScheduledScreen.setText(usFormat.format(scheduledScreen));
  1458.         lblScheduledPad.setText(usFormat.format(scheduledPad));
  1459.         lblScheduledHotstamp.setText(usFormat.format(scheduledHotstamp));
  1460.         lblScheduledOffsetCups.setText(usFormat.format(scheduledOffsetCups));
  1461.         lblScheduledOffsetNaps.setText(usFormat.format(scheduledOffsetNaps));
  1462.         lblScheduledDigital.setText(usFormat.format(scheduledDigital));
  1463.        
  1464.         updateCompletedEarlyFields();
  1465.     }
  1466.    
  1467.     public void updateCompletedEarlyFields ()
  1468.     {
  1469.         earlyScreen = 0;
  1470.         earlyPad = 0;
  1471.         earlyHotstamp = 0;
  1472.         earlyOffsetCups = 0;
  1473.         earlyOffsetNaps = 0;
  1474.         earlyDigital = 0;
  1475.         List<OrderDetail> odList;
  1476.        
  1477.         for (Job job : jobList) {
  1478.             odList = job.getOrderDetailList();
  1479.             for (OrderDetail od : odList) {
  1480.                 if (od.getItemCompleted() != null &&
  1481.                         LocalDate.fromDateFields(od.getItemCompleted()).isBefore(DateManager.getLocalDate(getDisplayedDate())))
  1482.                 {
  1483.                     switch (od.getPrintType())
  1484.                     {
  1485.                         case SCREEN: earlyScreen += od.getNumColors() * od.getQuantity(); break;
  1486.                         case PAD: earlyPad += od.getNumColors() * od.getQuantity(); break;
  1487.                         case HOTSTAMP: earlyHotstamp += od.getNumColors() * od.getQuantity(); break;
  1488.                         case OFFSET_CUPS: earlyOffsetCups += od.getNumColors() * od.getQuantity(); break;
  1489.                         case OFFSET_NAPKINS: earlyOffsetNaps += od.getNumColors() * od.getQuantity(); break;
  1490.                         case DIGITAL: earlyDigital += od.getNumColors() * od.getQuantity(); break;
  1491.                         default: log.error("Could not figure out PrintType!");
  1492.                     }
  1493.                 }
  1494.             }
  1495.         }
  1496.        
  1497.         lblCompletedScreen.setText(usFormat.format(earlyScreen));
  1498.         lblCompletedPad.setText(usFormat.format(earlyPad));
  1499.         lblCompletedHotstamp.setText(usFormat.format(earlyHotstamp));
  1500.         lblCompletedOffsetCups.setText(usFormat.format(earlyOffsetCups));
  1501.         lblCompletedOffsetNaps.setText(usFormat.format(earlyOffsetNaps));
  1502.         lblCompletedDigital.setText(usFormat.format(earlyDigital));
  1503.        
  1504.         updateRemainingFields();
  1505.     }
  1506.    
  1507.     public void updateToCompleteFields ()
  1508.     {
  1509.         completedScreen = 0;
  1510.         completedPad = 0;
  1511.         completedHotstamp = 0;
  1512.         completedOffsetCups = 0;
  1513.         completedOffsetNaps = 0;
  1514.         completedDigital = 0;
  1515.         List<OrderDetail> odList;
  1516.        
  1517.         for (Job job : jobList) {
  1518.             odList = job.getOrderDetailList();
  1519.             for (OrderDetail od : odList) {
  1520.                 if (od.getItemCompleted() != null)
  1521.                 {
  1522.                     switch (od.getPrintType())
  1523.                     {
  1524.                         case SCREEN: completedScreen += od.getNumColors() * od.getQuantity(); break;
  1525.                         case PAD: completedPad += od.getNumColors() * od.getQuantity(); break;
  1526.                         case HOTSTAMP: completedHotstamp += od.getNumColors() * od.getQuantity(); break;
  1527.                         case OFFSET_CUPS: completedOffsetCups += od.getNumColors() * od.getQuantity(); break;
  1528.                         case OFFSET_NAPKINS: completedOffsetNaps += od.getNumColors() * od.getQuantity(); break;
  1529.                         case DIGITAL: completedDigital += od.getQuantity(); break;
  1530.                         default: log.error("Could not figure out PrintType!");
  1531.                     }
  1532.                 }
  1533.             }
  1534.         }
  1535.        
  1536.         lblToCompleteScreen.setText(usFormat.format(scheduledScreen - completedScreen));
  1537.         lblToCompletePad.setText(usFormat.format(scheduledPad - completedPad));
  1538.         lblToCompleteHotstamp.setText(usFormat.format(scheduledHotstamp - completedHotstamp));
  1539.         lblToCompleteOffsetCups.setText(usFormat.format(scheduledOffsetCups - completedOffsetCups));
  1540.         lblToCompleteOffsetNaps.setText(usFormat.format(scheduledOffsetNaps - completedOffsetNaps));
  1541.         lblToCompleteDigital.setText(usFormat.format(scheduledDigital - completedDigital));
  1542.        
  1543.         updateGrandTotals();
  1544.     }
  1545.    
  1546.     private void updateDay(String dateStr) {
  1547.         thisDay = DateManager.stringToJDate(dateStr);
  1548.         monthView.ensureDateVisible(thisDay);
  1549.         monthView.setSelectionDate(thisDay);
  1550.         setDisplayedDate(dateStr);
  1551.         updateTreeTable(DateManager.getLocalDate(dateStr));
  1552.         timer.restart();
  1553.     }
  1554.  
  1555.     private class CheckStateChangeListener implements VetoableChangeListener{
  1556.  
  1557.         @Override
  1558.         public void vetoableChange(PropertyChangeEvent event) throws PropertyVetoException
  1559.         {
  1560.             if (event.getNewValue() != null) // user about to uncheck
  1561.             {
  1562.                 log.debug("User is about to un-check an item.");
  1563.                 if (JOptionPane.showConfirmDialog(rootPane,
  1564.                         "Are you sure you want to re-set this item as being NOT completed?",
  1565.                         "Item Not Completed?",
  1566.                         JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION)
  1567.                     throw new PropertyVetoException("user cancelled", event);
  1568.  
  1569.             }
  1570.         }
  1571.     }
  1572.  
  1573.    
  1574.     private class CheckTreeTableSelectionListener implements TreeSelectionListener, Runnable
  1575.     {
  1576.         private Map<DefaultMutableTreeTableNode, Boolean> status;
  1577.  
  1578.         @Override
  1579.         public void valueChanged (TreeSelectionEvent event)
  1580.         {
  1581.             if (status==null)
  1582.             {
  1583.                 status = new HashMap<DefaultMutableTreeTableNode, Boolean>();
  1584.                 SwingUtilities.invokeLater(this);
  1585.             }
  1586.            
  1587.             TreePath[] paths = event.getPaths();
  1588.             for (int i = 0; i < paths.length; i++){
  1589.                 DefaultMutableTreeTableNode node = (DefaultMutableTreeTableNode)paths[i].getLastPathComponent();
  1590.                 log.trace("Current path is " + paths[i].toString());
  1591.                 boolean checked = event.isAddedPath(i);
  1592.                 status.put(node, checked);
  1593.                 setSelected(node, checked);
  1594.             }
  1595.         }
  1596.        
  1597.         private void setSelected(DefaultMutableTreeTableNode node, boolean checked)
  1598.         {
  1599.             log.debug("Inside setSelected");
  1600.             if(checked)
  1601.                 status.put(node, true);
  1602.             else if(!status.containsKey(node))
  1603.                 status.put(node, false);
  1604.  
  1605.             Enumeration<? extends MutableTreeTableNode> children = node.children();
  1606.             while (children.hasMoreElements()) {
  1607.                 log.debug("Recursively calling setSelected");
  1608.                 setSelected((DefaultMutableTreeTableNode) children.nextElement(), checked);
  1609.             }
  1610.         }
  1611.  
  1612.         @Override
  1613.         public void run()
  1614.         {
  1615.             for(Map.Entry<DefaultMutableTreeTableNode, Boolean> entry: status.entrySet()){
  1616.                 if(entry.getKey().getParent() == null)
  1617.                 {
  1618.                     todaysBean.setDayCompleted(entry.getValue() ? new Timestamp(DateTimeUtils.currentTimeMillis()) : null);
  1619.                     DayManager.setCompleted(todaysBean);
  1620.                     flagDates();
  1621.                 }
  1622.                 if(entry.getKey().getUserObject() instanceof Job){
  1623.                     try {
  1624.                         Job job = (Job)entry.getKey().getUserObject();
  1625.                         log.debug("Found Job! Setting its completed boolean as " + entry.getValue());
  1626.                         job.setJobCompleted(entry.getValue() ? new Timestamp(DateTimeUtils.currentTimeMillis()) : null);
  1627.                         JobManager.setCompleted(job);
  1628.                         log.debug("Job: " + job.getCustomerName() + ", Order #: " + job.getJobId());
  1629.                     } catch (Exception e) {
  1630. //                        e.printStackTrace();
  1631.                     }
  1632.                 }else{
  1633.                     try {
  1634.                         OrderDetail od = (OrderDetail)entry.getKey().getUserObject();
  1635.                         log.debug("Found OrderDetail! Setting its completed boolean as " + entry.getValue());
  1636.                         od.setItemCompleted(entry.getValue() ? new Timestamp(DateTimeUtils.currentTimeMillis()) : null);
  1637. //                        if (od.isItemCompleted()) od.setDateCompleted(new Timestamp(DateTimeUtils.currentTimeMillis()));
  1638. //                        else od.setDateCompleted(null);
  1639.                         OrderDetailManager.setItemCompleted(od);
  1640.                         log.debug("Detail: " + od.getProductDetail() + ", Total Colors: " + (od.getQuantity() * od.getNumColors()));
  1641.                     } catch (Exception e) {
  1642. //                        e.printStackTrace();
  1643.                     }
  1644.                 }
  1645.             }
  1646.             status = null;
  1647.             updateToCompleteFields();
  1648.         }
  1649.     }
  1650. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement