1 package org.columba.mail.gui.config.filter; 17 18 import java.awt.BorderLayout ; 19 import java.awt.Color ; 20 import java.awt.Component ; 21 import java.awt.Dimension ; 22 import java.awt.GridBagConstraints ; 23 import java.awt.GridBagLayout ; 24 import java.awt.GridLayout ; 25 import java.awt.event.ActionEvent ; 26 import java.awt.event.ActionListener ; 27 import java.awt.event.KeyEvent ; 28 import java.awt.event.MouseAdapter ; 29 import java.awt.event.MouseEvent ; 30 import java.io.File ; 31 import java.io.FileNotFoundException ; 32 import java.io.FileOutputStream ; 33 import java.io.IOException ; 34 import java.net.MalformedURLException ; 35 36 import javax.swing.BorderFactory ; 37 import javax.swing.Box ; 38 import javax.swing.BoxLayout ; 39 import javax.swing.DefaultListSelectionModel ; 40 import javax.swing.JButton ; 41 import javax.swing.JComponent ; 42 import javax.swing.JDialog ; 43 import javax.swing.JFileChooser ; 44 import javax.swing.JLabel ; 45 import javax.swing.JOptionPane ; 46 import javax.swing.JPanel ; 47 import javax.swing.JScrollPane ; 48 import javax.swing.JTextField ; 49 import javax.swing.KeyStroke ; 50 import javax.swing.ListSelectionModel ; 51 import javax.swing.SwingConstants ; 52 import javax.swing.event.ListSelectionEvent ; 53 import javax.swing.event.ListSelectionListener ; 54 import javax.swing.filechooser.FileFilter ; 55 56 import org.columba.api.gui.frame.IFrameMediator; 57 import org.columba.core.facade.DialogFacade; 58 import org.columba.core.filter.Filter; 59 import org.columba.core.filter.FilterList; 60 import org.columba.core.filter.IFilter; 61 import org.columba.core.filter.IFilterList; 62 import org.columba.core.gui.base.ButtonWithMnemonic; 63 import org.columba.core.gui.base.SingleSideEtchedBorder; 64 import org.columba.core.help.HelpManager; 65 import org.columba.core.xml.XmlElement; 66 import org.columba.core.xml.XmlIO; 67 import org.columba.mail.folder.IMailbox; 68 import org.columba.mail.util.MailResourceLoader; 69 70 75 76 public class ConfigFrame extends JDialog implements ListSelectionListener , 77 ActionListener { 78 86 private FilterListTable listView; 87 88 private IFilterList filterList; 90 91 private JTextField nameTextField = new JTextField (); 94 95 private JButton addButton; 96 97 private JButton removeButton; 98 99 private JButton editButton; 100 101 104 private JButton moveupButton; 105 106 private JButton movedownButton; 107 108 private JButton importButton; 109 110 private JButton exportButton; 111 112 private IMailbox folder; 113 114 private IFrameMediator mediator; 115 116 122 public ConfigFrame(IFrameMediator mediator, IMailbox messageFolder) { 123 super(mediator.getView().getFrame(), true); 124 this.mediator = mediator; 125 126 folder = messageFolder; 127 128 setTitle(MailResourceLoader.getString("dialog", "filter", 129 "dialog_title")); 130 filterList = folder.getFilterList(); 131 132 initComponents(); 133 pack(); 134 setLocationRelativeTo(null); 135 setVisible(true); 136 } 137 138 144 public IFilter getSelected() { 145 IFilter filter = null; 146 ListSelectionModel model = listView.getSelectionModel(); 147 148 if (!model.isSelectionEmpty()) { 149 int index = model.getAnchorSelectionIndex(); 150 filter = filterList.get(index); 151 } 152 153 return filter; 154 } 155 156 162 public void setSelected(IFilter f) { 163 int index = filterList.indexOf(f); 164 165 if (index != -1) { 166 listView.getSelectionModel().setSelectionInterval(index, index); 167 } 168 } 169 170 173 private void initComponents() { 174 JPanel mainPanel = new JPanel (); 175 mainPanel.setLayout(new BorderLayout ()); 176 mainPanel.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12)); 177 getContentPane().add(mainPanel); 178 179 addButton = new ButtonWithMnemonic(MailResourceLoader.getString( 180 "dialog", "filter", "add_filter")); 181 addButton.setActionCommand("ADD"); 182 addButton.addActionListener(this); 183 184 removeButton = new ButtonWithMnemonic(MailResourceLoader.getString( 185 "dialog", "filter", "remove_filter")); 186 removeButton.setActionCommand("REMOVE"); 187 removeButton.setEnabled(false); 188 removeButton.addActionListener(this); 189 190 editButton = new ButtonWithMnemonic(MailResourceLoader.getString( 191 "dialog", "filter", "edit_filter")); 192 editButton.setActionCommand("EDIT"); 193 editButton.setEnabled(false); 194 editButton.addActionListener(this); 195 196 moveupButton = new ButtonWithMnemonic(MailResourceLoader.getString( 197 "dialog", "filter", "moveup")); 198 moveupButton.setActionCommand("MOVEUP"); 199 moveupButton.setEnabled(false); 200 moveupButton.addActionListener(this); 201 202 movedownButton = new ButtonWithMnemonic(MailResourceLoader.getString( 203 "dialog", "filter", "movedown")); 204 movedownButton.setActionCommand("MOVEDOWN"); 205 movedownButton.setEnabled(false); 206 movedownButton.addActionListener(this); 207 208 importButton = new ButtonWithMnemonic(MailResourceLoader.getString( 209 "dialog", "filter", "import")); 210 importButton.setActionCommand("IMPORT"); 211 importButton.setEnabled(true); 212 importButton.addActionListener(this); 213 214 exportButton = new ButtonWithMnemonic(MailResourceLoader.getString( 215 "dialog", "filter", "export")); 216 exportButton.setActionCommand("EXPORT"); 217 exportButton.setEnabled(false); 218 exportButton.addActionListener(this); 219 220 JPanel topPanel = new JPanel (); 222 topPanel.setLayout(new BoxLayout (topPanel, BoxLayout.X_AXIS)); 223 224 GridBagLayout gridBagLayout = new GridBagLayout (); 225 GridBagConstraints c = new GridBagConstraints (); 226 227 JPanel topBorderPanel = new JPanel (); 229 topBorderPanel.setLayout(new BorderLayout ()); 230 231 topBorderPanel.add(topPanel); 234 235 JLabel nameLabel = new JLabel ("name"); 237 nameLabel.setEnabled(false); 238 topPanel.add(nameLabel); 239 240 topPanel.add(Box.createRigidArea(new java.awt.Dimension (10, 0))); 241 topPanel.add(Box.createHorizontalGlue()); 242 243 nameTextField.setText("name"); 244 nameTextField.setEnabled(false); 245 topPanel.add(nameTextField); 246 247 Component glue = Box.createVerticalGlue(); 248 c.anchor = GridBagConstraints.EAST; 249 c.gridwidth = GridBagConstraints.REMAINDER; 250 251 gridBagLayout.setConstraints(glue, c); 253 254 gridBagLayout = new GridBagLayout (); 255 c = new GridBagConstraints (); 256 257 JPanel eastPanel = new JPanel (gridBagLayout); 258 mainPanel.add(eastPanel, BorderLayout.EAST); 259 260 c.fill = GridBagConstraints.HORIZONTAL; 261 c.weightx = 1.0; 262 c.gridwidth = GridBagConstraints.REMAINDER; 263 gridBagLayout.setConstraints(addButton, c); 264 eastPanel.add(addButton); 265 266 Component strut1 = Box.createRigidArea(new Dimension (30, 6)); 267 gridBagLayout.setConstraints(strut1, c); 268 eastPanel.add(strut1); 269 270 gridBagLayout.setConstraints(editButton, c); 271 eastPanel.add(editButton); 272 273 Component strut = Box.createRigidArea(new Dimension (30, 6)); 274 gridBagLayout.setConstraints(strut, c); 275 eastPanel.add(strut); 276 277 gridBagLayout.setConstraints(removeButton, c); 278 eastPanel.add(removeButton); 279 280 strut = Box.createRigidArea(new Dimension (30, 12)); 281 gridBagLayout.setConstraints(strut, c); 282 eastPanel.add(strut); 283 284 gridBagLayout.setConstraints(moveupButton, c); 285 eastPanel.add(moveupButton); 286 287 strut = Box.createRigidArea(new Dimension (30, 6)); 288 gridBagLayout.setConstraints(strut, c); 289 eastPanel.add(strut); 290 291 gridBagLayout.setConstraints(movedownButton, c); 292 eastPanel.add(movedownButton); 293 294 strut = Box.createRigidArea(new Dimension (30, 12)); 295 gridBagLayout.setConstraints(strut, c); 296 eastPanel.add(strut); 297 298 gridBagLayout.setConstraints(importButton, c); 299 eastPanel.add(importButton); 300 301 strut = Box.createRigidArea(new Dimension (30, 6)); 302 gridBagLayout.setConstraints(strut, c); 303 eastPanel.add(strut); 304 305 gridBagLayout.setConstraints(exportButton, c); 306 eastPanel.add(exportButton); 307 308 glue = Box.createVerticalGlue(); 309 c.fill = GridBagConstraints.BOTH; 310 c.weighty = 1.0; 311 gridBagLayout.setConstraints(glue, c); 312 eastPanel.add(glue); 313 314 JPanel centerPanel = new JPanel (new BorderLayout ()); 316 centerPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 6)); 317 listView = new FilterListTable(filterList, this); 318 listView.getSelectionModel().addListSelectionListener(this); 319 listView.addMouseListener(new MouseTableListener()); 320 listView.setTransferHandler(new FilterTransferHandler()); 321 listView.setDragEnabled(true); 322 323 JScrollPane scrollPane = new JScrollPane (listView); 324 scrollPane.setPreferredSize(new Dimension (300, 250)); 325 scrollPane.getViewport().setBackground(Color.white); 326 scrollPane.setTransferHandler(new FilterTransferHandler()); 327 centerPanel.add(scrollPane); 328 329 mainPanel.add(centerPanel); 330 331 JPanel bottomPanel = new JPanel (new BorderLayout ()); 332 bottomPanel.setBorder(new SingleSideEtchedBorder(SwingConstants.TOP)); 333 334 JPanel buttonPanel = new JPanel (new GridLayout (1, 2, 6, 0)); 335 buttonPanel.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12)); 336 337 ButtonWithMnemonic closeButton = new ButtonWithMnemonic( 338 MailResourceLoader.getString("global", "close")); 339 closeButton.setActionCommand("CLOSE"); closeButton.addActionListener(this); 341 buttonPanel.add(closeButton); 342 343 ButtonWithMnemonic helpButton = new ButtonWithMnemonic( 344 MailResourceLoader.getString("global", "help")); 345 buttonPanel.add(helpButton); 346 bottomPanel.add(buttonPanel, BorderLayout.EAST); 347 getContentPane().add(bottomPanel, BorderLayout.SOUTH); 348 getRootPane().setDefaultButton(closeButton); 349 getRootPane().registerKeyboardAction(this, "CLOSE", 350 KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), 351 JComponent.WHEN_IN_FOCUSED_WINDOW); 352 353 HelpManager.getInstance().enableHelpOnButton(helpButton, 355 "organising_and_managing_your_email_3"); 356 HelpManager.getInstance().enableHelpKey(getRootPane(), 357 "organising_and_managing_your_email_3"); 358 } 359 360 361 public void valueChanged(ListSelectionEvent e) { 362 if (e.getValueIsAdjusting()) { 363 return; 364 } 365 366 DefaultListSelectionModel theList = (DefaultListSelectionModel ) e 367 .getSource(); 368 369 if (theList.isSelectionEmpty()) { 370 removeButton.setEnabled(false); 371 editButton.setEnabled(false); 372 movedownButton.setEnabled(false); 373 moveupButton.setEnabled(false); 374 exportButton.setEnabled(false); 375 } else { 376 removeButton.setEnabled(true); 377 exportButton.setEnabled(true); 378 379 int[] selectedRows = listView.getSelectedRows(); 380 int minIndex = selectedRows[0]; 381 int maxIndex = selectedRows[selectedRows.length - 1]; 382 383 if (minIndex == maxIndex) { 384 editButton.setEnabled(true); 385 } else { 386 editButton.setEnabled(false); 387 } 388 389 if (minIndex == 0) { 390 moveupButton.setEnabled(false); 391 } else { 392 moveupButton.setEnabled(true); 393 } 394 395 if (maxIndex == (filterList.count() - 1)) { 396 movedownButton.setEnabled(false); 397 } else { 398 movedownButton.setEnabled(true); 399 } 400 } 401 } 402 403 414 public boolean showFilterDialog(IFilter filter) { 415 boolean saveFilter = false; 416 417 if (filter != null) { 418 FilterDialog dialog = new FilterDialog(mediator, filter); 419 saveFilter = !dialog.wasCancelled(); 420 } 421 422 return saveFilter; 423 } 424 425 428 public void actionPerformed(ActionEvent e) { 429 String action = e.getActionCommand(); 430 431 if (action.equals("CLOSE")) { 432 433 setVisible(false); 434 } else if (action.equals("ADD")) { 435 IFilter filter = FilterList.createDefaultFilter(); 436 437 if (showFilterDialog(filter)) { 438 filterList.add(filter); 439 listView.update(); 440 setSelected(filter); 441 } 442 } else if (action.equals("REMOVE")) { 443 int[] selectedRows = listView.getSelectedRows(); 444 445 for (int i = selectedRows.length - 1; i >= 0; i--) { 447 filterList.remove(selectedRows[i]); 448 } 449 450 listView.update(); 451 } else if (action.equals("EDIT")) { 452 editSelectedFilter(); 453 } else if (action.equals("MOVEUP")) { 454 int[] selectedRows = listView.getSelectedRows(); 455 456 for (int i = 0; i < selectedRows.length; i++) { 457 filterList.move(selectedRows[i], -1); 458 selectedRows[i]--; 459 } 460 461 listView.setRowSelection(selectedRows); 462 } else if (action.equals("MOVEDOWN")) { 463 int[] selectedRows = listView.getSelectedRows(); 464 465 for (int i = selectedRows.length - 1; i >= 0; i--) { 468 filterList.move(selectedRows[i], 1); 469 selectedRows[i]++; 470 } 471 472 listView.setRowSelection(selectedRows); 473 } else if (action.equals("EXPORT")) { 474 exportFilterList(); 475 } else if (action.equals("IMPORT")) { 476 importFilterList(); 477 } 478 } 479 480 483 private void exportFilterList() { 484 int[] selectedRows = listView.getSelectedRows(); 485 FilterList newFilterList = new FilterList(); 486 487 for (int i = 0; i < selectedRows.length; i++) { 488 newFilterList.add(filterList.get(i)); 489 } 490 491 JFileChooser chooser = new JFileChooser (); 493 chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); 494 chooser.setMultiSelectionEnabled(false); 495 chooser.setFileFilter(new XmlFileFilter()); 496 497 int result = chooser.showSaveDialog(this); 498 499 if (result == JFileChooser.APPROVE_OPTION) { 500 File file = chooser.getSelectedFile(); 501 502 XmlIO xmlIO = new XmlIO(newFilterList.getRoot()); 503 504 try { 505 xmlIO.write(new FileOutputStream (file)); 506 } catch (FileNotFoundException fnfe) { 507 DialogFacade.showExceptionDialog(fnfe); 508 } catch (IOException ioe) { 509 DialogFacade.showExceptionDialog(ioe); 510 } 511 } 512 } 513 514 518 private void importFilterList() { 519 JFileChooser chooser = new JFileChooser (); 521 chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); 522 chooser.setMultiSelectionEnabled(false); 523 chooser.setFileFilter(new XmlFileFilter()); 524 525 int result = chooser.showOpenDialog(this); 526 527 if (result == JFileChooser.APPROVE_OPTION) { 528 File file = chooser.getSelectedFile(); 529 XmlIO xmlIO; 530 531 try { 532 xmlIO = new XmlIO(file.toURL()); 533 534 if (xmlIO.load()) { 535 XmlElement root = xmlIO.getRoot().getElement( 536 FilterList.XML_NAME); 537 538 if (root != null) { 539 FilterList newFilterList = new FilterList(root); 540 filterList.addAll(newFilterList); 541 listView.update(); 542 } else { 543 JOptionPane.showMessageDialog(this, 544 "Could not import filters from the selected file. Make sure it" 545 + " contains Columba filters.", 546 "Error while importing filters", 547 JOptionPane.ERROR_MESSAGE); 548 } 549 } else { 550 JOptionPane 551 .showMessageDialog( 552 this, 553 "Could not parse the selected file. Make sure it" 554 + " is an XML file containing Columba filters.", 555 "Error while parsing file", 556 JOptionPane.ERROR_MESSAGE); 557 } 558 } catch (MalformedURLException mue) { 559 DialogFacade.showExceptionDialog(mue); 560 } 561 } 562 } 563 564 567 private void editSelectedFilter() { 568 IFilter oldFilter = getSelected(); 569 570 if (oldFilter != null) { 571 Filter newFilter = (Filter ) oldFilter.clone(); 572 573 if (showFilterDialog(newFilter)) { 574 int index = listView.getSelectedRow(); 575 filterList.insert(newFilter, index); 576 filterList.remove(index + 1); 577 listView.update(index); 578 } 579 } 580 } 581 582 586 private class MouseTableListener extends MouseAdapter { 587 588 public void mouseClicked(MouseEvent e) { 589 if ((e.getButton() == MouseEvent.BUTTON1) 590 && (e.getClickCount() >= 2)) { 591 editSelectedFilter(); 592 } 593 } 594 } 595 596 601 private class XmlFileFilter extends FileFilter { 602 603 public boolean accept(File f) { 604 boolean fileIsOk = false; 605 606 if (f.isDirectory()) { 607 fileIsOk = true; 608 } else { 609 fileIsOk = f.getName().toLowerCase().endsWith("xml"); 610 } 611 612 return fileIsOk; 613 } 614 615 616 public String getDescription() { 617 return "XML file filter"; 618 } 619 } 620 } | Popular Tags |