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 }