001    package net.provision.soap;
002    
003    import java.awt.Container;
004    import java.awt.Dimension;
005    import java.awt.FlowLayout;
006    import java.awt.FontMetrics;
007    import java.awt.GridBagConstraints;
008    import java.awt.GridBagLayout;
009    import java.awt.Insets;
010    import java.awt.KeyboardFocusManager;
011    import java.awt.Toolkit;
012    import java.awt.event.*;
013    
014    import java.util.*;
015    
016    import javax.swing.BorderFactory;
017    import javax.swing.JButton;
018    import javax.swing.JFrame;
019    import javax.swing.JLabel;
020    import javax.swing.JOptionPane;
021    import javax.swing.JPanel;
022    import javax.swing.JScrollPane;
023    import javax.swing.JTable;
024    import javax.swing.JTextArea;
025    import javax.swing.JToolBar;
026    import javax.swing.KeyStroke;
027    import javax.swing.ListSelectionModel;
028    import javax.swing.SwingConstants;
029    import javax.swing.UIManager;
030    import javax.swing.border.*;
031    import javax.swing.event.*;
032    import javax.swing.table.*;
033    
034    
035    //import com.jgoodies.plaf.HeaderStyle;
036    //import com.jgoodies.plaf.Options;
037    public class PrayerLog extends JFrame implements ListSelectionListener {
038       Container c = getContentPane();
039       DateButton dateBTN = new DateButton(new Date(), this);
040       DefaultTableModel prayerTableMDL = new DefaultTableModel(3, 3);
041       FlowLayout buttonLayout = new FlowLayout();
042       GridBagConstraints gb;
043       JButton cancelBTN;
044       JButton deleteBTN;
045       JButton editBTN;
046       JButton newBTN;
047       JButton saveBTN;
048       JPanel buttonPNL = new JPanel(buttonLayout);
049       JScrollPane prayerTableSP;
050       JTable prayerTBL = new JTable();
051       JTextArea answerTXA = new JTextArea(7, 20);
052       JTextArea prayerTXA = new JTextArea(7, 20);
053       ListSelectionModel rowSM;
054       Storage storage;
055       TableSorter prayerTableSorter;
056       Vector data = new Vector();
057       private boolean newEdit;
058       private int currentItemLocation;
059       private int selectedRow;
060    
061       public PrayerLog(Storage s) {
062          this.storage = s;
063          data = storage.getPLData();
064    
065          //display items from vector (data) in table
066          Vector tableData = new Vector();
067    
068          for(int i = 0; i < data.size(); i++) {
069             Vector row = new Vector();
070             PrayerItem tmpItem = (PrayerItem)data.get(i);
071             row.add(tmpItem.getDate());
072             row.add(tmpItem.getPrayer());
073             row.add(tmpItem.getAnswer());
074             tableData.add(row);
075          }
076    
077          //display column names
078          Vector columnNames = new Vector();
079          columnNames.add("Date");
080          columnNames.add("Prayer");
081          columnNames.add("Answer");
082    
083          prayerTableMDL = new DefaultTableModel(data, columnNames) {
084                   public boolean isCellEditable(int row, int column) {
085                      return false;
086                   }
087                };
088    
089          prayerTableSorter = new TableSorter(prayerTableMDL);
090    
091          Vector v = new Vector();
092          v.add("Brett");
093          v.add("One");
094          v.add("two");
095          prayerTableMDL.addRow(v);
096          prayerTBL = new JTable(prayerTableSorter) {
097                   // Override this method so that it returns the preferred
098                   // size of the JTable instead of the default fixed size
099                   public Dimension getPreferredScrollableViewportSize() {
100                      return getPreferredSize();
101                   }
102                };
103    
104          prayerTableSorter.setTableHeader(prayerTBL.getTableHeader());
105          prayerTableSorter.setSortingStatus(0, TableSorter.DESCENDING);
106          prayerTBL.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
107          prayerTBL.setAlignmentX(JTable.CENTER_ALIGNMENT);
108          prayerTBL.getTableHeader().setReorderingAllowed(false);
109    
110          //set the width for the date column
111          TableColumnModel colModel = prayerTBL.getColumnModel();
112          FontMetrics fm = getFontMetrics(prayerTBL.getFont());
113          int dateWidth = fm.stringWidth("00/00/000000");
114          colModel.getColumn(0).setMaxWidth(dateWidth);
115          colModel.getColumn(0).setMinWidth(dateWidth);
116          colModel.getColumn(0).setPreferredWidth(dateWidth);
117    
118          //remove border around selected cell
119          UIManager.put("Table.focusCellHighlightBorder", new EmptyBorder(1, 1, 1, 1));
120    
121          //set the formatting for the "Date" column with DateRenderer and center
122          //align all columns
123          DateRenderer dateRenderer = new DateRenderer();
124          dateRenderer.setHorizontalAlignment(SwingConstants.CENTER);
125    
126          //prayerTBL.getColumn("Date").setCellRenderer(dateRenderer);
127          DefaultTableCellRenderer dtcr = new DefaultTableCellRenderer();
128          dtcr.setHorizontalAlignment(SwingConstants.CENTER);
129    
130          //prayerTBL.getColumn("Prayer").setCellRenderer(dtcr);
131          //prayerTBL.getColumn("Answer").setCellRenderer(dtcr);
132          rowSM = prayerTBL.getSelectionModel();
133          rowSM.addListSelectionListener(this);
134    
135          if(prayerTBL.getRowCount() > 0) {
136             rowSM.setSelectionInterval(0, 0);
137          }
138    
139          prayerTableSP = new JScrollPane(prayerTBL);
140          prayerTableSP.setBorder(BorderFactory.createEmptyBorder());
141    
142          buttonLayout.setHgap(20);
143    
144          c.setLayout(new GridBagLayout());
145    
146          saveBTN = new JButton("Save");
147          cancelBTN = new JButton("Cancel");
148          editBTN = new JButton("Edit");
149          deleteBTN = new JButton("Delete");
150          newBTN = new JButton("New");
151    
152          newBTN.setFocusPainted(false);
153          editBTN.setFocusPainted(false);
154          deleteBTN.setFocusPainted(false);
155    
156          //      saveBTN.setFont(SOAPGUI.BUTTON_FONT);
157          //      cancelBTN.setFont(SOAPGUI.BUTTON_FONT);
158          //      saveBTN.setBorder(SOAPGUI.BUTTON_BORDER);
159          //      cancelBTN.setBorder(SOAPGUI.BUTTON_BORDER);
160          buttonPNL.add(saveBTN);
161          buttonPNL.add(cancelBTN);
162    
163          JToolBar toolbar = new JToolBar();
164    
165          //toolbar.putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH);
166          toolbar.setBorderPainted(true);
167          toolbar.setBorder(BorderFactory.createEtchedBorder());
168          toolbar.setRollover(true);
169          toolbar.setFloatable(false);
170    
171          toolbar.add(newBTN);
172          toolbar.add(editBTN);
173          toolbar.add(deleteBTN);
174    
175          //      prayerTXA.setFont(SOAPGUI.DEFAULT_FONT);
176          prayerTXA.setLineWrap(true);
177          prayerTXA.setWrapStyleWord(true);
178    
179          //      prayerTXA.setMargin(SOAPGUI.TEXT_INS);
180          //      answerTXA.setFont(SOAPGUI.DEFAULT_FONT);
181          answerTXA.setLineWrap(true);
182          answerTXA.setWrapStyleWord(true);
183    
184          //      answerTXA.setMargin(SOAPGUI.TEXT_INS);
185          JScrollPane prayerSP = new JScrollPane(prayerTXA);
186          JScrollPane answerSP = new JScrollPane(answerTXA);
187    
188          //      prayerSP.setBorder(SOAPGUI.BLACK_LINE_BORDER);
189          //      answerSP.setBorder(SOAPGUI.BLACK_LINE_BORDER);
190          newBTN.addActionListener(new ActionListener() {
191                public void actionPerformed(ActionEvent e) {
192                   prayerTXA.setText("");
193                   answerTXA.setText("");
194                   dateBTN.setDate(new Date());
195                   newEdit = true;
196                   edit(true);
197                }
198             });
199    
200          editBTN.addActionListener(new ActionListener() {
201                public void actionPerformed(ActionEvent e) {
202                   newEdit = false;
203                   edit(true);
204                }
205             });
206    
207          deleteBTN.addActionListener(new ActionListener() {
208                public void actionPerformed(ActionEvent e) {
209                }
210             });
211    
212          saveBTN.addActionListener(new ActionListener() {
213                public void actionPerformed(ActionEvent e) {
214                   Date date = dateBTN.getDate();
215                   String prayer = prayerTXA.getText();
216                   String answer = answerTXA.getText();
217                   PrayerItem item = new PrayerItem(date, prayer, answer);
218    
219                   //trying to add an item that has already been added.
220                   if((data.indexOf(item) != -1) && newEdit) {
221                      JOptionPane.showMessageDialog(PrayerLog.this,
222                         "Duplicate Record: A new record cannot be \n" +
223                         "added that contains the same date, title, \n" +
224                         "and topic as an existing entry. \n\n" +
225                         "Please change one of these values in order \n" +
226                         "to add the entry.");
227                   } else if(newEdit) {
228                      data.add(item);
229    
230                      //add item to row in table
231                      Vector tempVector = new Vector();
232                      tempVector.add(date);
233                      tempVector.add(prayer);
234                      tempVector.add(answer);
235                      prayerTableMDL.addRow(tempVector);
236    
237                      int row = prayerTableMDL.getRowCount() - 1;
238                      rowSM.setSelectionInterval(row, row);
239                   } else {
240                      //update item in vector
241                      data.setElementAt(item, currentItemLocation);
242    
243                      //update item in table
244                      prayerTableSorter.setValueAt(date, selectedRow, 0);
245                      prayerTableSorter.setValueAt(prayer, selectedRow, 1);
246                      prayerTableSorter.setValueAt(answer, selectedRow, 2);
247                      prayerTableSorter.fireTableDataChanged();
248    
249                      //reselect the row the user just edited.
250                      rowSM.setSelectionInterval(selectedRow, selectedRow);
251                   }
252    
253                   edit(false);
254                }
255             });
256    
257          cancelBTN.addActionListener(new ActionListener() {
258                public void actionPerformed(ActionEvent e) {
259                   edit(false);
260                }
261             });
262    
263          gb = new GridBagConstraints();
264    
265          gb.gridx = 0;
266          gb.gridy = 0;
267          gb.gridwidth = 2;
268          gb.fill = GridBagConstraints.HORIZONTAL;
269          c.add(toolbar, gb);
270    
271          gb.gridx = 0;
272          gb.gridy = 1;
273          gb.gridwidth = 2;
274          c.add(prayerTableSP, gb);
275    
276          gb.gridx = 0;
277          gb.gridy = 2;
278          gb.gridwidth = 1;
279          gb.insets = new Insets(10, 20, 0, 20);
280          c.add(new JLabel("Date:"), gb);
281    
282          gb.gridx = 1;
283          gb.insets = new Insets(10, 0, 10, 20);
284          c.add(dateBTN, gb);
285    
286          gb.gridx = 0;
287          gb.gridy = 3;
288          gb.insets = new Insets(10, 20, 0, 20);
289          c.add(new JLabel("Prayer:"), gb);
290    
291          gb.gridx = 1;
292          gb.insets = new Insets(10, 0, 10, 20);
293          c.add(prayerSP, gb);
294    
295          gb.gridx = 0;
296          gb.gridy = 4;
297          gb.insets = new Insets(10, 20, 0, 20);
298          c.add(new JLabel("Answer:"), gb);
299    
300          gb.gridx = 1;
301          gb.insets = new Insets(10, 0, 10, 20);
302          c.add(answerSP, gb);
303    
304          pack();
305    
306          Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
307          int y = (d.height / 2) - (getHeight() / 2);
308          setLocation((d.width / 2) - (getWidth() / 2), y);
309          setTitle("SOAP - created by Brett Batie");
310          setDefaultCloseOperation(DISPOSE_ON_CLOSE);
311          setResizable(false);
312          setVisible(true);
313    
314          addWindowListener(new WindowAdapter() {
315                public void windowClosing(WindowEvent evt) {
316                   try {
317                      //update data in storage and write to file.
318                      storage.setPLData(data);
319                   } catch(Exception e) {
320                      JOptionPane.showMessageDialog(PrayerLog.this,
321                         "Could not access the " +
322                         "database! Make sure the database exist and has read/write " +
323                         "permission.");
324                   }
325                }
326             });
327    
328          edit(false);
329       } //end of constructor
330    
331       /**
332        * DOCUMENT ME!
333        *
334        * @param edit DOCUMENT ME!
335        */
336       public void edit(boolean edit) {
337          if(edit) {
338             answerTXA.setEnabled(true);
339             prayerTXA.setEnabled(true);
340    
341             //            answerTXA.setBackground(SOAPGUI.TEXT_BACKGROUND);
342             //            prayerTXA.setBackground(SOAPGUI.TEXT_BACKGROUND);
343             dateBTN.setBorder(BorderFactory.createRaisedBevelBorder());
344             dateBTN.setFocusable(true);
345             dateBTN.setButtonState(true);
346             c.remove(prayerTableSP);
347             pack();
348             c.repaint();
349             newBTN.setEnabled(false);
350             editBTN.setEnabled(false);
351             deleteBTN.setEnabled(false);
352    
353             //display save and cancel buttons
354             gb.gridx = 0;
355             gb.gridy = 5;
356             gb.gridwidth = 2;
357             gb.weighty = 0;
358             gb.weightx = 0;
359             gb.insets = new Insets(10, 20, 10, 20);
360             gb.anchor = GridBagConstraints.CENTER;
361             gb.fill = GridBagConstraints.BOTH;
362             c.add(buttonPNL, gb);
363             pack();
364    
365             //make tab go to next focusable item for textareas and jtable
366             Set forwardTraversalKeys = new TreeSet();
367             forwardTraversalKeys.add(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0));
368    
369             Set backwardTraversalKeys = new TreeSet();
370             backwardTraversalKeys.add(KeyStroke.getKeyStroke(KeyEvent.VK_TAB,
371                   InputEvent.SHIFT_MASK));
372             answerTXA.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS,
373                forwardTraversalKeys);
374             answerTXA.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS,
375                backwardTraversalKeys);
376             prayerTXA.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS,
377                forwardTraversalKeys);
378             prayerTXA.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS,
379                backwardTraversalKeys);
380    
381             answerTXA.addKeyListener(new TextAreaTab());
382             prayerTXA.addKeyListener(new TextAreaTab());
383          } else {
384             answerTXA.setEnabled(false);
385             prayerTXA.setEnabled(false);
386             answerTXA.setBackground(super.getBackground());
387             prayerTXA.setBackground(super.getBackground());
388             dateBTN.setBackground(super.getBackground());
389             dateBTN.setFocusable(true);
390             dateBTN.setButtonState(true);
391             newBTN.setEnabled(true);
392             editBTN.setEnabled(true);
393             deleteBTN.setEnabled(true);
394    
395             if(data.isEmpty()) {
396                editBTN.setEnabled(false);
397                deleteBTN.setEnabled(false);
398             } else {
399                editBTN.setEnabled(true);
400                deleteBTN.setEnabled(true);
401             }
402    
403             //add the table back
404             gb.gridx = 0;
405             gb.gridy = 1;
406             gb.gridwidth = 2;
407             c.add(prayerTableSP, gb);
408    
409             //remove save and cancel buttons
410             c.remove(buttonPNL);
411             pack();
412          }
413       }
414    
415       /**
416        * DOCUMENT ME!
417        *
418        * @param e DOCUMENT ME!
419        */
420       public void valueChanged(ListSelectionEvent e) {
421          //Ignore extra message
422          if(e.getValueIsAdjusting() || (prayerTBL.getSelectedRow() == -1)) {
423             return;
424          }
425    
426          //update selected row
427          selectedRow = prayerTBL.getSelectedRow();
428    
429          //        if (selectedRow == -1) {
430          //            return;
431          //        }
432          //I think the below is what updates all the values in the non-editable display
433          //      Object[] obj = new Object[prayerTBL.getColumnCount()];
434          //
435          //      for(int column = 0; (column < obj.length) && (selectedRow != -1); column++) {
436          //         obj[column] = prayerTBL.getValueAt(selectedRow, column);
437          //      }
438          //
439          //      PrayerItem tempItem = new PrayerItem((Date)obj[0], (String)obj[1], (String)obj[2]);
440          //
441          //      currentItemLocation = data.indexOf(tempItem);
442          //
443          //      if(currentItemLocation != -1) {
444          //         //            currentItem = (DailyItem) dailyItems.elementAt(currentItemLocation);
445          //         //            verseTopicTXF.setText(currentItem.getTopic());
446          //         //            dateBTN.setDate(currentItem.getDate());
447          //         //            titleTXF.setText(currentItem.getTitle());
448          //         //            scriptureTXA.setText(currentItem.getScripture());
449          //         //            observationTXA.setText(currentItem.getObservation());
450          //         //            applicationTXA.setText(currentItem.getApplication());
451          //         //            prayerTXA.setText(currentItem.getPrayer());
452          //      }
453       }
454    }