001 /* BEE - Book Editing Environment for PAVLOV 002 * Copyright (C) 2004 T.J. Willis 003 * 004 * This program is free software; you can redistribute it and/or 005 * modify it under the terms of the GNU General Public License 006 * as published by the Free Software Foundation; either version 2 007 * of the License, or (at your option) any later version. 008 * 009 * This program is distributed in the hope that it will be useful, 010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 012 * GNU General Public License for more details. 013 * 014 * You should have received a copy of the GNU General Public License 015 * along with this program; if not, write to the Free Software 016 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. 017 * 018 * $Header: /cvsroot/pavlov/net/sourceforge/bee/ChapterEditor.java,v 1.7 2004/07/01 05:50:19 tj_willis Exp $ 019 */ 020 package net.sourceforge.bee; 021 022 import javax.swing.*; 023 import javax.swing.event.*; 024 import java.text.DecimalFormat; 025 import java.awt.*; 026 import java.awt.event.*; 027 import net.sourceforge.pavlov.library.*; 028 import java.util.*; 029 import java.net.URL; 030 031 /** 032 * User interface for editing a chapter within a book. 033 * 034 * @author <a href="mailto:tj_willis@users.sourceforge.net">T.J. Willis</a> 035 * @version $Id: ChapterEditor.java,v 1.7 2004/07/01 05:50:19 tj_willis Exp $ 036 */ 037 public class ChapterEditor 038 extends JInternalFrame 039 implements ActionListener, ListSelectionListener 040 { 041 //private JLabel lTitle, lAuthor, lDescription; 042 private JTextField fTitle, fAuthor; 043 private JTextArea aDescription; 044 //private Box bQuestions; 045 private ListSelectionJTable tQuestions; 046 private ChapterTableModel tmod; 047 private JButton bUpdate; 048 private JMenuItem byID,byText,byRightAnswer; 049 private JMenuItem copy, paste, insert, inserts, delete, mUndo, mNormalize, mDruid; 050 private String cName; 051 private Object clipboard; 052 private java.util.List undo; 053 private Chapter chapter; 054 private BookEditor bookEditor; 055 private long base = 0; 056 private QuestionDruid druid; 057 private InsertMultipleFrame wiz; 058 private AbstractAction copyAction, pasteAction, insertAction, deleteAction; 059 private AbstractAction insertMultipleAction, questionDruidAction, sortByIDAction; 060 private AbstractAction undoAction, normalizeAction, smallerRowsAction; 061 private AbstractAction biggerRowsAction; 062 063 /** 064 * Creates a new <code>ChapterEditor</code> instance, editing the given 065 * chapter and registering itself as an open editor of the given 066 * bookEditor. 067 * 068 * @param parent a <code>BookEditor</code> value 069 * @param c a <code>Chapter</code> value 070 */ 071 public ChapterEditor(BookEditor parent,Chapter c) 072 { 073 super("Chapter Editor",true,true,true); 074 bookEditor = parent; 075 chapter = c; 076 cName = c.getName(); 077 super.setTitle("Chapter Editor"); 078 setResizable(true); 079 080 Container content = getContentPane(); 081 content.setLayout(new BorderLayout()); 082 083 Collection<Question> col = chapter.getQuestionsCollection(); 084 // guaranteed 1 question by bookeditor/create chapter 085 Question arr[] = new Question[1]; 086 arr = (Question [])col.toArray(arr); 087 tmod = new ChapterTableModel(arr); 088 089 Box box = new Box(BoxLayout.Y_AXIS); 090 091 JPanel pan = new JPanel(); 092 pan.setLayout(new java.awt.GridLayout(2,1)); 093 094 Box b0 = new Box(BoxLayout.Y_AXIS); 095 Box b1 = new Box(BoxLayout.X_AXIS); 096 Box b2 = new Box(BoxLayout.X_AXIS); 097 098 b1.setBorder( BorderFactory.createTitledBorder( "Title" ) ); 099 b2.setBorder( BorderFactory.createTitledBorder( "Author" ) ); 100 101 //lTitle = new JLabel("Title:"); 102 //lTitle.setMinimumSize(new Dimension(50,20)); 103 fTitle = new JTextField(); 104 fTitle.addActionListener(this); 105 b1.add(fTitle); 106 pan.add(b1); 107 108 //lAuthor = new JLabel("Author:"); 109 //lAuthor.setMinimumSize(new Dimension(50,20)); 110 fAuthor = new JTextField(); 111 fAuthor.addActionListener(this); 112 b2.add(fAuthor); 113 114 pan.add(b2); 115 116 b0.add(pan); 117 118 Box b3 = new Box(BoxLayout.X_AXIS); 119 b3.setBorder( BorderFactory.createTitledBorder( "Description" ) ); 120 aDescription = new JTextArea(); 121 JScrollPane sp1 = new JScrollPane(aDescription); 122 bUpdate = new JButton("Update"); 123 bUpdate.addActionListener(this); 124 b3.add(sp1); 125 b3.add(bUpdate); 126 b0.add(b3); 127 box.add(b0); 128 129 Box b4 = new Box(BoxLayout.X_AXIS); 130 b4.setBorder( BorderFactory.createTitledBorder( "Questions" ) ); 131 tQuestions = new ListSelectionJTable(tmod); 132 tQuestions.addListSelectionListener((ListSelectionListener)this); 133 tmod.addTableModelListener(tQuestions);//FIXME: might be redundant 134 tQuestions.setDragEnabled(true); 135 //String la = new String(); 136 Class cl = null; 137 try { 138 cl = java.lang.Class.forName("java.lang.String"); 139 } catch (Exception e) { 140 // FIXME: don't ignore exception 141 } 142 VerificationTableCellRenderer r = new VerificationTableCellRenderer(tmod); 143 // 15feb tQuestions.setDefaultRenderer(cl,r); 144 JScrollPane sp = new JScrollPane(tQuestions); 145 b4.add(sp); 146 box.add(b4); 147 //======================== test ====================== 148 //TableCellEditor tce = tQuestions.getCellEditor(3,3); 149 //Component charlie = tQuestions.prepareEditor(tce,3,3); 150 //charlie.setBackground(Color.red); 151 //charlie.setForeground(Color.yellow); 152 //======================== test ====================== 153 Box b5 = new Box(BoxLayout.X_AXIS); 154 box.add(b5); 155 156 content.add(box,BorderLayout.CENTER); 157 158 //============================================================ 159 // DEFINE ACTIONS 160 161 copyAction = ( new AbstractAction() { 162 public void actionPerformed(ActionEvent e) { 163 copy(); 164 } 165 } 166 ); 167 copyAction.putValue(Action.NAME,"Copy"); 168 copyAction.putValue(Action.SHORT_DESCRIPTION,"Copy Selected Question"); 169 170 pasteAction = ( new AbstractAction() { 171 public void actionPerformed(ActionEvent e) { 172 paste(); 173 } 174 } 175 ); 176 pasteAction.putValue(Action.NAME,"Paste"); 177 pasteAction.putValue(Action.SHORT_DESCRIPTION,"Paste Question in Clipboard"); 178 179 insertAction = ( new AbstractAction() { 180 public void actionPerformed(ActionEvent e) { 181 insert(); 182 } 183 } 184 ); 185 insertAction.putValue(Action.NAME,"Insert"); 186 insertAction.putValue(Action.SHORT_DESCRIPTION,"Insert Question(s)"); 187 188 deleteAction = ( new AbstractAction() { 189 public void actionPerformed(ActionEvent e) { 190 delete(); 191 } 192 } 193 ); 194 deleteAction.putValue(Action.NAME,"Delete"); 195 deleteAction.putValue(Action.SHORT_DESCRIPTION,"Delete Selected Question(s)"); 196 197 insertMultipleAction = ( new AbstractAction() { 198 public void actionPerformed(ActionEvent e) { 199 insertWizard(); 200 } 201 } 202 ); 203 insertMultipleAction.putValue(Action.NAME,"Add Blank..."); 204 insertMultipleAction.putValue(Action.SHORT_DESCRIPTION,"Add Blank Questions"); 205 206 questionDruidAction = ( new AbstractAction() { 207 public void actionPerformed(ActionEvent e) { 208 druid(); 209 } 210 } 211 ); 212 questionDruidAction.putValue(Action.NAME,"Factory..."); 213 questionDruidAction.putValue(Action.SHORT_DESCRIPTION,"Generate Many Questions at Once"); 214 215 sortByIDAction = ( new AbstractAction() { 216 public void actionPerformed(ActionEvent e) { 217 tmod.sortByID(); 218 } 219 } 220 ); 221 sortByIDAction.putValue(Action.NAME,"Sort"); 222 sortByIDAction.putValue(Action.SHORT_DESCRIPTION,"Sort Questions by ID"); 223 224 normalizeAction = ( new AbstractAction() { 225 public void actionPerformed(ActionEvent e) { 226 normalizeIDs(); 227 } 228 } 229 ); 230 normalizeAction.putValue(Action.NAME,"Normalize"); 231 normalizeAction.putValue(Action.SHORT_DESCRIPTION,"Reassign Question ID's Sequentially"); 232 233 undoAction = ( new AbstractAction() { 234 public void actionPerformed(ActionEvent e) { 235 undo(); 236 } 237 } 238 ); 239 undoAction.putValue(Action.NAME,"Undo"); 240 undoAction.putValue(Action.SHORT_DESCRIPTION,"Undo"); 241 242 243 smallerRowsAction = ( new AbstractAction() { 244 public void actionPerformed(ActionEvent e) { 245 smallerRows(); 246 } 247 } 248 ); 249 smallerRowsAction.putValue(Action.NAME,"Smaller Rows"); 250 smallerRowsAction.putValue(Action.SHORT_DESCRIPTION,"Decrease Height of Rows"); 251 252 biggerRowsAction = ( new AbstractAction() { 253 public void actionPerformed(ActionEvent e) { 254 biggerRows(); 255 } 256 } 257 ); 258 biggerRowsAction.putValue(Action.NAME,"Bigger Rows"); 259 biggerRowsAction.putValue(Action.SHORT_DESCRIPTION,"Increase Height of Rows"); 260 261 undoAction.setEnabled(false); 262 copyAction.setEnabled(false); 263 pasteAction.setEnabled(false); 264 insertAction.setEnabled(false); 265 deleteAction.setEnabled(false); 266 267 //============================================================ 268 269 JMenuBar menu = new JMenuBar(); 270 271 JMenu edit = new JMenu("Edit"); 272 copy =makeJMenuItem(copyAction,"resources/icons/tb_copy.jpg"); 273 paste =makeJMenuItem(pasteAction,"resources/icons/tb_paste.jpg"); 274 insert=makeJMenuItem(insertAction,"resources/icons/tb_insert.jpg"); 275 delete = makeJMenuItem(deleteAction,"resources/icons/tb_delete.jpg"); 276 mUndo = makeJMenuItem(undoAction,"resources/icons/tb_undo.jpg"); 277 278 edit.add(copy); 279 edit.add(paste); 280 edit.add(insert); 281 edit.add(delete); 282 edit.addSeparator(); 283 edit.add(mUndo); 284 285 JMenu tools = new JMenu("Tools"); 286 inserts = makeJMenuItem(insertMultipleAction,"resources/icons/tb_add_multiple.jpg"); 287 //new JMenuItem("Add Blank Questions..."); 288 mNormalize = makeJMenuItem(normalizeAction,"resources/icons/normalize.jpg"); 289 mDruid = makeJMenuItem(questionDruidAction,"resources/icons/questiondruid.jpg"); 290 tools.add(inserts); 291 tools.add(mNormalize); 292 tools.add(mDruid); 293 294 JMenu sort = new JMenu("Sort"); 295 byID = makeJMenuItem(sortByIDAction,"resources/icons/tb_sort.jpg"); 296 new JMenuItem("By ID"); 297 byText = new JMenuItem("By Question Text"); 298 byRightAnswer = new JMenuItem("By Correct Answer"); 299 sort.add(byID); 300 sort.add(byText); 301 sort.add(byRightAnswer); 302 byText.addActionListener(this); 303 byRightAnswer.addActionListener(this); 304 305 306 menu.add(edit); 307 menu.add(tools); 308 menu.add(sort); 309 310 setJMenuBar(menu); 311 312 //======================== toolbar ====================== 313 JToolBar toolbar = new JToolBar("BookEditor Tools"); 314 toolbar.setRollover(true); 315 316 JButton s1 =makeJButton(copyAction,"resources/icons/tb_copy.jpg"); 317 JButton s2 =makeJButton(pasteAction,"resources/icons/tb_paste.jpg"); 318 JButton s3 =makeJButton(insertAction,"resources/icons/tb_insert.jpg"); 319 JButton s4 = makeJButton(deleteAction,"resources/icons/tb_delete.jpg"); 320 JButton s5 = makeJButton(undoAction,"resources/icons/tb_undo.jpg"); 321 JButton s6 = makeJButton(insertMultipleAction,"resources/icons/tb_add_multiple.jpg"); 322 //new JMenuItem("Add Blank Questions..."); 323 JButton s7= makeJButton(normalizeAction,"resources/icons/normalize.jpg"); 324 JButton s8 = makeJButton(questionDruidAction,"resources/icons/questiondruid.jpg"); 325 JButton s9 = makeJButton(sortByIDAction,"resources/icons/tb_sort.jpg"); 326 JButton s10 = makeJButton(smallerRowsAction,"resources/icons/smaller_rows.jpg"); 327 JButton s11 = makeJButton(biggerRowsAction,"resources/icons/bigger_rows.jpg"); 328 toolbar.add(s1); 329 toolbar.add(s2); 330 toolbar.add(s3); 331 toolbar.add(s4); 332 toolbar.addSeparator(); 333 toolbar.add(s5); 334 toolbar.add(s6); 335 toolbar.addSeparator(); 336 toolbar.add(s7); 337 toolbar.add(s8); 338 toolbar.add(s9); 339 toolbar.add(s10); 340 toolbar.add(s11); 341 342 content.add(toolbar,BorderLayout.PAGE_START); 343 344 //======================== test ====================== 345 TabDelimitedTransferHandler th = new TabDelimitedTransferHandler(tmod); 346 347 setTitle(c.getName()); 348 setAuthor(c.getAuthor()); 349 setDescription(c.getDescription()); 350 pack(); 351 352 } 353 354 /** 355 * Sets the title of this chapter <b>not the internalframe</b>. 356 * FIXME: change this method name. 357 * @param t a <code>String</code> value 358 */ 359 public void setTitle(String t) 360 { 361 fTitle.setText(t); 362 chapter.setName(t); 363 } 364 private void setAuthor(String t) 365 { 366 fAuthor.setText(t); 367 chapter.setAuthor(t); 368 } 369 private void setDescription(String t) 370 { 371 aDescription.setText(t); 372 chapter.setDescription(t); 373 } 374 375 private void smallerRows() 376 { 377 int x = tQuestions.getRowHeight(); 378 x-=5; 379 if(x<10) x = 10; 380 tQuestions.setRowHeight(x); 381 } 382 383 private void biggerRows() 384 { 385 int x = tQuestions.getRowHeight(); 386 x+=5; 387 //if(x<10) x = 10; 388 tQuestions.setRowHeight(x); 389 } 390 391 392 /** 393 * Overridden to remove references to this chapter editor and closes any 394 * dependent windows. 395 * 396 */ 397 public void dispose() 398 { 399 bookEditor.removeEditorKey(chapter.getName()); 400 // JOptionPane.showInternalMessageDialog(bookEditor.getDesktopPane(), 401 // "Changes to this chapter will be saved when you save this book.", 402 // "Information", 403 // JOptionPane.INFORMATION_MESSAGE); 404 if(wiz!=null) wiz.dispose(); 405 if(druid!=null) druid.dispose(); 406 super.dispose(); 407 } 408 409 private void copy() 410 { 411 int rc = tQuestions.getSelectedRowCount(); 412 if(rc<1) return; 413 else if(rc==1) 414 { 415 copyOneRow(); 416 return; 417 } 418 else 419 copyMultipleRows(); 420 } 421 422 private void copyOneRow() 423 { 424 int row = tQuestions.getSelectedRow(); 425 if(row<0) return; 426 Question q = tmod.getQuestion(row); 427 clipboard = q.deepCopy(); 428 clipboardActive(true); 429 } 430 431 private void copyMultipleRows() 432 { 433 clipboard = new Vector(); 434 int rs[] = tQuestions.getSelectedRows(); 435 int x = java.lang.reflect.Array.getLength(rs); 436 for(int i=0;i<x;i++) 437 { 438 Question q = tmod.getQuestion(rs[i]); 439 Question r = q.deepCopy(); 440 r.setId(getUniqueID()); 441 ((Vector)clipboard).add(r); 442 } 443 clipboardActive(true); 444 } 445 446 447 // sets the chapter's questions to the tablemodel's questions 448 private void synchChapter() 449 { 450 java.util.List<Question> qs = tmod.getQuestions(); 451 chapter.setQuestions(qs); 452 453 } 454 455 private void paste() 456 { 457 if(clipboard==null) return; 458 459 if(clipboard instanceof Question) 460 { 461 pasteSingleRow(); 462 } 463 else if(clipboard instanceof Vector) 464 { 465 pasteMultipleRows(); 466 } 467 } 468 469 private void pasteSingleRow() 470 { 471 int row = tQuestions.getSelectedRow(); 472 if(row<0) return; 473 Question q = (Question) clipboard; 474 setUndo(true); 475 q.setId(getUniqueID()); 476 tmod.setQuestion(row,q.deepCopy()); 477 synchChapter(); 478 clipboardActive(false); 479 } 480 481 482 private void pasteMultipleRows() 483 { 484 int rs[] = tQuestions.getSelectedRows(); 485 int x = java.lang.reflect.Array.getLength(rs); 486 if(!(clipboard instanceof Vector)) 487 return; 488 Vector c = (Vector) clipboard; 489 int y = c.size(); 490 if(x!=y) return; 491 492 setUndo(true); 493 for(int i=0;i<x;i++) 494 { 495 Question q = (Question)c.elementAt(i); 496 Question r = q.deepCopy(); 497 r.setId(getUniqueID()); 498 synchChapter(); 499 tmod.setQuestion(rs[i],r); 500 } 501 synchChapter(); 502 clipboardActive(false); 503 } 504 505 private void delete() 506 { 507 int rc = tQuestions.getSelectedRowCount(); 508 if(rc<1) return; 509 else if(rc==1) 510 { 511 deleteOneRow(); 512 return; 513 } 514 else 515 deleteMultipleRows(); 516 } 517 518 private void deleteOneRow() 519 { 520 int row = tQuestions.getSelectedRow(); 521 if(row<0) return; 522 setUndo(true); 523 tmod.deleteQuestion(row); 524 synchChapter(); 525 clipboardActive(false); 526 } 527 528 private void deleteMultipleRows() 529 { 530 int rs[] = tQuestions.getSelectedRows(); 531 setUndo(true); 532 tmod.deleteQuestions(rs); 533 synchChapter(); 534 clipboardActive(false); 535 } 536 537 private void insert() 538 { 539 if(clipboard instanceof Question) 540 insertOneRow(); 541 if(clipboard instanceof Vector) 542 insertMultipleRows(); 543 } 544 545 546 private void insertOneRow() 547 { 548 Question tmp; 549 if(clipboard!=null) 550 tmp = (Question)clipboard; 551 else { 552 tmp = Question.makeBlankQuestion(); 553 } 554 tmp = tmp.deepCopy(); 555 tmp.setId(getUniqueID()); 556 setUndo(true); // much easier to duplicate this code for undos 557 int row = tQuestions.getSelectedRow(); 558 if(row<0) row = 0; 559 tmod.insertQuestion(row,tmp); 560 synchChapter(); 561 clipboardActive(false); 562 } 563 564 565 private void insert(Question q) 566 { 567 int row = tQuestions.getSelectedRow(); 568 if(row<0) row = 0; 569 q.setId(getUniqueID()); 570 tmod.insertQuestion(row,q.deepCopy()); 571 synchChapter(); 572 } 573 574 private void insertMultipleRows() 575 { 576 int r = tQuestions.getSelectedRow(); 577 if(!(clipboard instanceof Vector)) 578 return; 579 Vector c = (Vector) clipboard; 580 int y = c.size(); 581 setUndo(true); 582 for(int i=0;i<y;i++) 583 { 584 Question q = (Question)c.elementAt(i); 585 q = q.deepCopy(); 586 q.setId(getUniqueID()); 587 tmod.insertQuestion(r,q); 588 synchChapter(); // if you don't do it here, ids wont be unique 589 } 590 clipboardActive(false); 591 } 592 593 /** 594 * Allows other classes to add a vector of generated questions to this 595 * chapter. Note that ID's may be changed to ensure uniqueness. 596 * 597 * @param v a <code>Vector</code> value 598 */ 599 public void addGenerated(Vector<Question> v) 600 { 601 setUndo(true); 602 for(Question da: v) { 603 // insert assigns unique ID 604 insert(da); 605 } 606 synchChapter(); 607 } 608 609 private void normalizeIDs() 610 { 611 String msg = "<HTML>Normalizing IDs is not suggested for chapters<BR>" + 612 "that have already been used in Pavlov. Question IDs are<BR>" + 613 "cross-referenced in user files. <BR>" + 614 "Do you really want to normalize ID's?"; 615 int ret = 616 JOptionPane.showInternalConfirmDialog(getDesktopPane(), 617 msg, 618 "Normalize IDs", 619 JOptionPane.YES_NO_OPTION); 620 if( ret == JOptionPane.NO_OPTION) 621 return; 622 623 DecimalFormat nf = new DecimalFormat("00000"); 624 625 for(int i=0;i<tmod.getRowCount();i++) { 626 tmod.setValueAt(nf.format(i), i, 0); 627 } 628 synchChapter(); 629 } 630 631 private String getUniqueID() 632 { 633 DecimalFormat nf = new DecimalFormat("00000"); 634 635 for(long i=base;i<99999;i++) 636 { 637 String x = nf.format(i); 638 Question q = chapter.getQuestion(x); 639 if(q==null) 640 { 641 base = i; 642 return x; 643 } 644 } 645 return "TOOMANY"; 646 } 647 648 649 private void insertWizard() 650 { 651 if(wiz==null){ 652 wiz = new InsertMultipleFrame(this); 653 getDesktopPane().add(wiz); 654 } 655 wiz.setVisible(true); 656 try { wiz.setSelected(true); } catch (Exception e) {} 657 } 658 659 private void druid() 660 { 661 if(druid==null){ 662 druid = new QuestionDruid(this); 663 getDesktopPane().add(druid); 664 } 665 druid.setVisible(true); 666 try { druid.setSelected(true); } catch (Exception e) {} 667 668 } 669 670 private void setUndo(boolean state) 671 { 672 if(state==true) 673 { 674 undoAction.setEnabled(true); 675 undo = tmod.getQuestions(); 676 } 677 else 678 { 679 undoAction.setEnabled(false); 680 undo = null; 681 } 682 } 683 684 private void undo() 685 { 686 if(undo==null) return; 687 tmod.setQuestions(undo); 688 undo = null; 689 setUndo(false); 690 synchChapter(); 691 } 692 693 private void clipboardActive(boolean state) 694 { 695 pasteAction.setEnabled(state); 696 } 697 698 /** 699 * Handles menu events. 700 * 701 * @param e an <code>ActionEvent</code> value 702 */ 703 public void actionPerformed(ActionEvent e) 704 { 705 if(e.getSource().equals(byText)) 706 tmod.sortByText(); 707 else if(e.getSource().equals(byRightAnswer)) 708 tmod.sortByRightAnswer(); 709 else if(e.getSource().equals(copy)) 710 copy(); 711 else if(e.getSource().equals(paste)) 712 paste(); 713 else if(e.getSource().equals(insert)) 714 insert(); 715 else if(e.getSource().equals(delete)) 716 delete(); 717 else if(e.getSource().equals(inserts)) 718 insertWizard(); 719 else if(e.getSource().equals(mDruid)) 720 druid(); 721 else if(e.getSource().equals(fTitle)) 722 editTitle(); 723 else if(e.getSource().equals(fAuthor)) 724 editAuthor(); 725 else if(e.getSource().equals(aDescription)) 726 editDescription(); 727 else if(e.getSource().equals(bUpdate)) 728 editDescription(); 729 } 730 731 private void editTitle() 732 { 733 // FIXME: check that it's unique 734 String t = fTitle.getText(); 735 if(!validCharacters(t)) 736 { 737 // FIXME: add a convenience method for JOptionPane.... 738 JOptionPane.showInternalMessageDialog(getDesktopPane(), 739 "Invalid Characters in Title", 740 "Invalid Characters in Title", 741 JOptionPane.INFORMATION_MESSAGE); 742 return; 743 } 744 bookEditor.changeEditorKey(t,cName); 745 cName = t; 746 chapter.setName(t); 747 } 748 749 private void editAuthor() 750 { 751 String t = fAuthor.getText(); 752 if(!validCharacters(t)) 753 { 754 JOptionPane.showInternalMessageDialog(getDesktopPane(), 755 "Invalid Characters in Author", 756 "Invalid Characters in Author", 757 JOptionPane.INFORMATION_MESSAGE); 758 return; 759 } 760 chapter.setAuthor(t); 761 } 762 763 764 765 private void editDescription() 766 { 767 String t = aDescription.getText(); 768 if(!validCharacters(t)) 769 { 770 JOptionPane.showInternalMessageDialog(getDesktopPane(), 771 "Invalid Characters in Description", 772 "Invalid Characters in Description", 773 JOptionPane.INFORMATION_MESSAGE); 774 return; 775 } 776 //System.out.println("Did edit description"); 777 chapter.setDescription(t); 778 } 779 780 private boolean validCharacters(String s) 781 { 782 if(s.indexOf('<')>0) return false; 783 if(s.indexOf('\"')>0) return false; 784 if(s.indexOf('&')>0) return false; 785 return true; 786 } 787 788 789 private JMenuItem makeJMenuItem(Action ac, String url) 790 { 791 JMenuItem x = new JMenuItem(ac); 792 //x.setText(ac.getProperty(Action.NAME)); 793 try { 794 URL u = new URL("file:" + url);//getClass().getResource(url); 795 ImageIcon tmp = new ImageIcon(u); 796 x.setIcon(tmp ); 797 } catch (Exception e) {} 798 return x; 799 } 800 801 802 private JButton makeJButton(Action ac, String url) 803 { 804 JButton x = new JButton(ac); 805 //x.setText(ac.getProperty(Action.Name)); 806 try { 807 URL u = new URL("file:"+url);//getClass().getResource(url); 808 ImageIcon tmp = new ImageIcon(u); 809 x.setIcon(tmp ); 810 Font g = x.getFont(); 811 int style = g.getStyle(); 812 String n = g.getFontName(); 813 Font f = new Font(n,style,8); 814 x.setFont(f); 815 x.setVerticalTextPosition(SwingConstants.BOTTOM); 816 x.setHorizontalTextPosition(SwingConstants.CENTER); 817 } catch (Exception e) {} 818 return x; 819 820 } 821 822 private void noRowsSelected() 823 { 824 copyAction.setEnabled(false); 825 pasteAction.setEnabled(false); 826 insertAction.setEnabled(false); 827 deleteAction.setEnabled(false); 828 } 829 830 private void oneRowSelected() 831 { 832 copyAction.setEnabled(true); 833 pasteAction.setEnabled(true); 834 insertAction.setEnabled(true); 835 deleteAction.setEnabled(true); 836 } 837 838 private void multipleRowsSelected() 839 { 840 copyAction.setEnabled(true); 841 pasteAction.setEnabled(true); 842 insertAction.setEnabled(true); 843 deleteAction.setEnabled(true); 844 } 845 846 /** 847 * Called when the row selection of the JTable has changed. 848 * 849 * @param e a <code>ListSelectionEvent</code> value 850 */ 851 public void valueChanged(ListSelectionEvent e) 852 { 853 int i = tQuestions.getSelectedRowCount(); 854 if(i<1) 855 noRowsSelected(); 856 else if(i==1) 857 oneRowSelected(); 858 else 859 multipleRowsSelected(); 860 } 861 } 862 863 864 865 866