1 17 package org.columba.mail.gui.config.folder; 18 19 import java.awt.BorderLayout ; 20 import java.awt.Color ; 21 import java.awt.Dimension ; 22 import java.awt.Font ; 23 import java.awt.GridLayout ; 24 import java.awt.event.ActionEvent ; 25 import java.awt.event.ActionListener ; 26 import java.awt.event.KeyEvent ; 27 import java.io.File ; 28 29 import javax.swing.BorderFactory ; 30 import javax.swing.DefaultListSelectionModel ; 31 import javax.swing.JButton ; 32 import javax.swing.JCheckBox ; 33 import javax.swing.JComponent ; 34 import javax.swing.JDialog ; 35 import javax.swing.JFileChooser ; 36 import javax.swing.JLabel ; 37 import javax.swing.JPanel ; 38 import javax.swing.JScrollPane ; 39 import javax.swing.JTextField ; 40 import javax.swing.KeyStroke ; 41 import javax.swing.UIManager ; 42 import javax.swing.event.ListSelectionEvent ; 43 import javax.swing.event.ListSelectionListener ; 44 45 import org.columba.core.command.CommandProcessor; 46 import org.columba.core.gui.base.ButtonWithMnemonic; 47 import org.columba.core.gui.base.CTabbedPane; 48 import org.columba.core.gui.base.LabelWithMnemonic; 49 import org.columba.core.gui.base.MultiLineLabel; 50 import org.columba.core.help.HelpManager; 51 import org.columba.core.xml.XmlElement; 52 import org.columba.mail.command.MailFolderCommandReference; 53 import org.columba.mail.config.IFolderItem; 54 import org.columba.mail.folder.AbstractLocalFolder; 55 import org.columba.mail.folder.IMailbox; 56 import org.columba.mail.folder.IMailboxInfo; 57 import org.columba.mail.folder.command.ExportFolderCommand; 58 import org.columba.mail.folder.command.RenameFolderCommand; 59 import org.columba.mail.folder.command.SyncSearchEngineCommand; 60 import org.columba.mail.folder.search.LuceneQueryEngine; 61 import org.columba.mail.folderoptions.FolderOptionsController; 62 import org.columba.mail.gui.frame.MailFrameMediator; 63 import org.columba.mail.gui.table.command.ViewHeaderListCommand; 64 import org.columba.mail.util.MailResourceLoader; 65 import org.frapuccino.checkablelist.CheckableItem; 66 import org.frapuccino.checkablelist.CheckableItemListTableModel; 67 68 import com.jgoodies.forms.builder.ButtonStackBuilder; 69 import com.jgoodies.forms.builder.PanelBuilder; 70 import com.jgoodies.forms.layout.CellConstraints; 71 import com.jgoodies.forms.layout.FormLayout; 72 73 81 82 public class FolderOptionsDialog extends JDialog implements ActionListener , 83 ListSelectionListener { 84 public final static String [] tooltips = { "columns", "sorting", "filter", 85 "threadedview", "selection" }; 86 87 private IMailbox folder; 88 89 private JLabel nameLabel; 90 91 private JTextField nameTextField; 92 93 private JLabel totalLabel; 94 95 private JLabel totalLabel2; 96 97 private JLabel unreadLabel; 98 99 private JLabel unreadLabel2; 100 101 private JLabel recentLabel; 102 103 private JLabel recentLabel2; 104 105 private JLabel locationLabel; 106 107 private JLabel locationLabel2; 108 109 private JLabel sizeLabel; 110 111 private JLabel sizeLabel2; 112 113 private JButton exportButton; 114 115 private MultiLineLabel enableLabel; 116 117 119 private JCheckBox enableTextIndexingCheckBox; 120 121 private boolean renameFolder; 122 123 private String oldFolderName = null; 124 125 private MultiLineLabel overwriteLabel; 126 127 private JButton resetButton; 128 129 private JButton enableButton; 130 131 private JButton disableButton; 132 133 private CheckableTooltipList checkableList; 135 136 private MailFrameMediator mediator; 137 138 146 public FolderOptionsDialog(IMailbox folder, boolean renameFolder, 147 MailFrameMediator mediator) { 148 super(mediator.getView().getFrame(), MailResourceLoader.getString( 149 "dialog", "folderoptions", "dialog_title"), false); 150 151 this.folder = folder; 152 this.renameFolder = renameFolder; 153 this.mediator = mediator; 154 155 oldFolderName = folder.getName(); 156 157 initComponents(); 158 updateComponents(true); 159 pack(); 160 setLocationRelativeTo(null); 161 162 if (renameFolder) { 164 nameTextField.selectAll(); 165 nameTextField.requestFocus(); 166 } 167 168 setVisible(true); 169 } 170 171 177 public FolderOptionsDialog(IMailbox folder, MailFrameMediator mediator) { 178 super(mediator.getView().getFrame(), MailResourceLoader.getString( 179 "dialog", "folderoptions", "dialog_title"), true); 180 181 this.folder = folder; 182 this.mediator = mediator; 183 184 initComponents(); 185 updateComponents(true); 186 pack(); 187 setLocationRelativeTo(null); 188 189 nameTextField.selectAll(); 190 nameTextField.requestFocus(); 191 192 setVisible(true); 193 } 194 195 protected JPanel createGeneralPanel() { 196 FormLayout layout = new FormLayout( 198 "6dlu, right:max(25dlu;default), 3dlu, fill:default:grow, fill:0dlu:grow", 200 "pref, 3dlu, pref, 6dlu, pref, 3dlu, pref, 3dlu, pref, 3dlu, pref, 6dlu, pref, 24dlu, pref, 3dlu, pref, 6dlu, default, 0dlu"); 203 PanelBuilder builder = new PanelBuilder(layout); 205 CellConstraints cc = new CellConstraints(); 206 207 builder.setDefaultDialogBorder(); 209 210 builder.addSeparator(MailResourceLoader.getString("dialog", 212 "folderoptions", "general_info"), cc.xywh(1, 1, 5, 1)); 214 builder.add(nameLabel, cc.xy(2, 3)); 215 builder.add(nameTextField, cc.xywh(4, 3, 2, 1)); 216 217 builder.add(totalLabel, cc.xy(2, 5)); 218 builder.add(totalLabel2, cc.xy(4, 5)); 219 220 builder.add(unreadLabel, cc.xy(2, 7)); 221 builder.add(unreadLabel2, cc.xy(4, 7)); 222 223 builder.add(recentLabel, cc.xy(2, 9)); 224 builder.add(unreadLabel2, cc.xy(4, 9)); 225 226 builder.add(sizeLabel, cc.xy(2, 11)); 227 builder.add(sizeLabel2, cc.xy(4, 11)); 228 229 builder.add(enableTextIndexingCheckBox, cc.xywh(2, 13, 4, 1)); 232 233 builder.appendGlueRow(); 234 235 builder.addSeparator(MailResourceLoader.getString("dialog", 236 "folderoptions", "archiving_messages"), cc.xywh(1, 15, 5, 1)); 238 builder.add(locationLabel, cc.xy(2, 17)); 239 builder.add(locationLabel2, cc.xy(4, 17)); 240 241 JPanel panel = new JPanel (); 242 panel.setLayout(new BorderLayout ()); 243 244 panel.add(exportButton, BorderLayout.EAST); 245 builder.add(panel, cc.xywh(4, 19, 2, 1)); 246 247 return builder.getPanel(); 248 } 249 250 256 protected JPanel createAdvancedPanel() { 257 FormLayout layout = new FormLayout("fill:default:grow, 6px, default", 260 "pref, 6px, fill:pref:grow"); 263 PanelBuilder builder = new PanelBuilder(layout); 265 CellConstraints cc = new CellConstraints(); 266 267 builder.setDefaultDialogBorder(); 269 270 builder.add(overwriteLabel, cc.xywh(1, 1, 3, 1)); 271 272 JScrollPane sp = new JScrollPane (checkableList); 273 sp.setPreferredSize(new Dimension (200, 200)); 274 sp.getViewport().setBackground(Color.white); 275 builder.add(sp, cc.xy(1, 3)); 276 277 ButtonStackBuilder b = new ButtonStackBuilder(); 278 b.addGridded(enableButton); 279 b.addRelatedGap(); 280 b.addGridded(disableButton); 281 b.addUnrelatedGap(); 282 b.addGlue(); 283 b.addFixed(resetButton); 284 285 JPanel buttonPanel = b.getPanel(); 286 builder.add(buttonPanel, cc.xy(3, 3)); 287 288 293 299 return builder.getPanel(); 300 } 301 302 protected void initComponents() { 303 Font boldFont = (Font ) UIManager.get("Label.font"); boldFont = boldFont.deriveFont(Font.BOLD); 305 306 nameLabel = new LabelWithMnemonic(MailResourceLoader.getString( 307 "dialog", "folderoptions", "name")); nameTextField = new JTextField (); 310 311 totalLabel = new JLabel (MailResourceLoader.getString("dialog", 312 "folderoptions", "total")); totalLabel2 = new JLabel ("0"); 316 unreadLabel = new JLabel (MailResourceLoader.getString("dialog", 317 "folderoptions", "unread")); unreadLabel2 = new JLabel ("0"); 321 recentLabel = new JLabel (MailResourceLoader.getString("dialog", 322 "folderoptions", "recent")); recentLabel2 = new JLabel ("0"); 326 sizeLabel = new JLabel (MailResourceLoader.getString("dialog", 327 "folderoptions", "mailbox_size")); sizeLabel2 = new JLabel (); 331 locationLabel = new JLabel (MailResourceLoader.getString("dialog", 332 "folderoptions", "location")); locationLabel2 = new JLabel (""); 336 exportButton = new ButtonWithMnemonic(MailResourceLoader.getString( 337 "dialog", "folderoptions", "export")); exportButton.setActionCommand("EXPORT"); exportButton.addActionListener(this); 340 341 342 enableTextIndexingCheckBox = new JCheckBox (MailResourceLoader.getString( 343 "dialog", "folderoptions", "enable_full-text_indexing")); enableTextIndexingCheckBox.setToolTipText(MailResourceLoader.getString( 345 "dialog", "folderoptions", "enable_full-text_indexing_tooltip")); 346 347 enableLabel = new MultiLineLabel(MailResourceLoader.getString( 348 "dialog", "folderoptions", "this_is_an_experimental_feature")); 351 overwriteLabel = new MultiLineLabel(MailResourceLoader.getString( 352 "dialog", "folderoptions", "select_individual_options")); 353 354 resetButton = new ButtonWithMnemonic(MailResourceLoader.getString( 355 "dialog", "folderoptions", "reset")); resetButton.setActionCommand("RESET"); resetButton.addActionListener(this); 358 359 enableButton = new ButtonWithMnemonic(MailResourceLoader.getString( 360 "dialog", "folderoptions", "overwrite")); enableButton.setActionCommand("ENABLED"); enableButton.addActionListener(this); 363 disableButton = new ButtonWithMnemonic(MailResourceLoader.getString( 364 "dialog", "folderoptions", "use_default")); disableButton.setActionCommand("DISABLED"); disableButton.addActionListener(this); 367 enableButton.setEnabled(false); 368 disableButton.setEnabled(false); 369 370 375 checkableList = new CheckableTooltipList(); 376 checkableList.setOptionsCellRenderer(new OptionsRenderer()); 377 checkableList.getSelectionModel().addListSelectionListener(this); 378 379 CTabbedPane tp = new CTabbedPane(); 380 tp.setBorder(BorderFactory.createEmptyBorder(0, 6, 0, 6)); 381 382 tp.add(MailResourceLoader.getString("dialog", "folderoptions", 383 "general_options"), createGeneralPanel()); tp.add(MailResourceLoader.getString("dialog", "folderoptions", 385 "advanced"), createAdvancedPanel()); 387 getContentPane().add(tp, BorderLayout.CENTER); 388 389 getContentPane().add(createButtonPanel(), BorderLayout.SOUTH); 390 getRootPane().registerKeyboardAction(this, "CANCEL", KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), 392 JComponent.WHEN_IN_FOCUSED_WINDOW); 393 } 394 395 protected JPanel createButtonPanel() { 396 JPanel bottom = new JPanel (); 397 bottom.setLayout(new BorderLayout ()); 398 399 ButtonWithMnemonic cancelButton = new ButtonWithMnemonic( 403 MailResourceLoader.getString("global", "cancel")); 405 cancelButton.addActionListener(this); 407 cancelButton.setActionCommand("CANCEL"); 409 ButtonWithMnemonic okButton = new ButtonWithMnemonic(MailResourceLoader 410 .getString("global", "ok")); 412 okButton.addActionListener(this); 414 okButton.setActionCommand("OK"); okButton.setDefaultCapable(true); 416 getRootPane().setDefaultButton(okButton); 417 418 ButtonWithMnemonic helpButton = new ButtonWithMnemonic( 419 MailResourceLoader.getString("global", "help")); 421 HelpManager.getInstance().enableHelpOnButton(helpButton, 423 "folder_options"); 424 HelpManager.getInstance() 425 .enableHelpKey(getRootPane(), "folder_options"); 426 427 JPanel buttonPanel = new JPanel (); 428 buttonPanel.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12)); 429 buttonPanel.setLayout(new GridLayout (1, 3, 6, 0)); 430 buttonPanel.add(okButton); 431 buttonPanel.add(cancelButton); 432 buttonPanel.add(helpButton); 433 434 bottom.add(buttonPanel, BorderLayout.EAST); 436 437 return bottom; 438 } 439 440 public void updateComponents(boolean b) { 441 if (b) { 442 IMailboxInfo info = folder.getMessageFolderInfo(); 443 444 nameTextField.setText(folder.getName()); 445 446 totalLabel2.setText(Integer.toString(info.getExists())); 447 unreadLabel2.setText(Integer.toString(info.getUnseen())); 448 recentLabel2.setText(Integer.toString(info.getRecent())); 449 450 locationLabel2.setText(folder.getDirectoryFile().getPath()); 451 452 IFolderItem item = folder.getConfiguration(); 453 XmlElement property = item.getElement("property"); 455 CheckableItemListTableModel model = new CheckableItemListTableModel(); 456 457 for (int i = 0; i < property.count(); i++) { 458 OptionsItem optionsItem = new OptionsItem((XmlElement) property 459 .getElement(i).clone()); 460 461 model.addElement(optionsItem); 462 } 463 464 checkableList.setModel(model); 465 466 471 472 if (folder instanceof AbstractLocalFolder) { 474 item = folder.getConfiguration(); 475 boolean bool = item.getBooleanWithDefault("property", "enable_lucene", true); 478 enableTextIndexingCheckBox.setSelected(bool); 479 } else { 480 enableTextIndexingCheckBox.setEnabled(false); 482 } 483 } else { 484 if (renameFolder) { 485 if (!oldFolderName.equals(nameTextField.getText())) { 486 MailFolderCommandReference r = new MailFolderCommandReference( 488 folder); 489 r.setFolderName(nameTextField.getText()); 490 CommandProcessor.getInstance().addOp( 491 new RenameFolderCommand(r)); 492 } 493 } 494 495 IFolderItem item = folder.getConfiguration(); 496 XmlElement property = item.getElement("property"); 498 property.removeAllElements(); 500 501 CheckableItemListTableModel model = (CheckableItemListTableModel) checkableList 502 .getModel(); 503 504 for (int i = 0; i < model.count(); i++) { 505 OptionsItem optionsItem = (OptionsItem) model.getElement(i); 506 507 property.addElement(optionsItem.getElement()); 509 } 510 511 if (folder instanceof AbstractLocalFolder) { 513 item = folder.getConfiguration(); 514 515 boolean bool = enableTextIndexingCheckBox.isSelected(); 516 item.setBoolean("property", "enable_lucene", bool); 518 AbstractLocalFolder localFolder = (AbstractLocalFolder) folder; 520 521 if (bool) { 522 localFolder.getSearchEngine().setNonDefaultEngine( 523 new LuceneQueryEngine(localFolder)); 524 525 MailFolderCommandReference r = new MailFolderCommandReference( 527 folder); 528 CommandProcessor.getInstance().addOp( 529 new SyncSearchEngineCommand(r)); 530 } else { 531 localFolder.setSearchEngine(null); 532 } 533 } 534 535 getMediator().getFolderOptionsController().load( 537 FolderOptionsController.STATE_BEFORE); 538 539 MailFolderCommandReference r = new MailFolderCommandReference( 541 folder); 542 CommandProcessor.getInstance().addOp( 543 new ViewHeaderListCommand(getMediator(), r)); 544 } 545 } 546 547 public void actionPerformed(ActionEvent arg0) { 548 String action = arg0.getActionCommand(); 549 550 if (action.equals("CANCEL")) { setVisible(false); 552 } else if (action.equals("OK")) { setVisible(false); 554 updateComponents(false); 555 } else if (action.equals("EXPORT")) { 557 File destFile = null; 558 559 JFileChooser chooser = new JFileChooser (); 561 chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); 562 chooser.setMultiSelectionEnabled(false); 563 564 int result = chooser.showSaveDialog(this); 565 566 if (result == JFileChooser.APPROVE_OPTION) { 567 File file = chooser.getSelectedFile(); 568 569 destFile = file; 570 } else { 571 return; 572 } 573 574 setVisible(false); 575 576 MailFolderCommandReference r = new MailFolderCommandReference( 577 folder); 578 r.setDestFile(destFile); 579 CommandProcessor.getInstance().addOp(new ExportFolderCommand(r)); 580 } else if (action.equals("RESET")) { 582 IFolderItem item = folder.getConfiguration(); 583 XmlElement property = item.getElement("property"); 585 property.removeAllElements(); 587 588 getMediator().getFolderOptionsController().createDefaultSettings( 590 folder); 591 592 599 600 CheckableItemListTableModel model = new CheckableItemListTableModel(); 602 603 for (int i = 0; i < property.count(); i++) { 604 OptionsItem optionsItem = new OptionsItem((XmlElement) property 605 .getElement(i).clone()); 606 607 model.addElement(optionsItem); 608 } 609 610 checkableList.setModel(model); 611 } else if (action.equals("ENABLED")) { 613 CheckableItem item = (CheckableItem) checkableList.getSelected(); 614 item.setSelected(!item.isSelected()); 615 ((CheckableItemListTableModel) checkableList.getModel()) 616 .updateRow(item); 617 updateButtonState(item.isSelected()); 618 } else if (action.equals("DISABLED")) { 620 CheckableItem item = (CheckableItem) checkableList.getSelected(); 621 item.setSelected(!item.isSelected()); 622 ((CheckableItemListTableModel) checkableList.getModel()) 623 .updateRow(item); 624 updateButtonState(item.isSelected()); 625 } 626 } 627 628 private void updateButtonState(boolean selected) { 629 if (selected) { 630 enableButton.setEnabled(false); 631 disableButton.setEnabled(true); 632 } else { 633 enableButton.setEnabled(true); 634 disableButton.setEnabled(false); 635 } 636 } 637 638 public void valueChanged(ListSelectionEvent e) { 639 if (e.getValueIsAdjusting()) { 640 return; 641 } 642 643 DefaultListSelectionModel theList = (DefaultListSelectionModel ) e 644 .getSource(); 645 646 if (!theList.isSelectionEmpty()) { 647 648 CheckableItem item = (CheckableItem) checkableList.getSelected(); 649 updateButtonState(item.isSelected()); 650 } 651 } 652 653 659 public void setMailboxSize(int sizeInKB) { 660 StringBuffer buf = new StringBuffer (); 661 662 if (sizeInKB > 1000) 664 buf.append(new Integer (sizeInKB / 1000).toString() + " MB"); 665 else 666 buf.append(new Integer (sizeInKB).toString() + " KB"); 667 668 sizeLabel2.setText(buf.toString()); 669 } 670 671 674 public MailFrameMediator getMediator() { 675 return mediator; 676 } 677 } | Popular Tags |