KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > mail > gui > config > filter > ConfigFrame


1 //The contents of this file are subject to the Mozilla Public License Version 1.1
2
//(the "License"); you may not use this file except in compliance with the
3
//License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
4
//
5
//Software distributed under the License is distributed on an "AS IS" basis,
6
//WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
7
//for the specific language governing rights and
8
//limitations under the License.
9
//
10
//The Original Code is "The Columba Project"
11
//
12
//The Initial Developers of the Original Code are Frederik Dietz and Timo Stich.
13
//Portions created by Frederik Dietz and Timo Stich are Copyright (C) 2003.
14
//
15
//All Rights Reserved.
16
package org.columba.mail.gui.config.filter;
17
18 import java.awt.BorderLayout JavaDoc;
19 import java.awt.Color JavaDoc;
20 import java.awt.Component JavaDoc;
21 import java.awt.Dimension JavaDoc;
22 import java.awt.GridBagConstraints JavaDoc;
23 import java.awt.GridBagLayout JavaDoc;
24 import java.awt.GridLayout JavaDoc;
25 import java.awt.event.ActionEvent JavaDoc;
26 import java.awt.event.ActionListener JavaDoc;
27 import java.awt.event.KeyEvent JavaDoc;
28 import java.awt.event.MouseAdapter JavaDoc;
29 import java.awt.event.MouseEvent JavaDoc;
30 import java.io.File JavaDoc;
31 import java.io.FileNotFoundException JavaDoc;
32 import java.io.FileOutputStream JavaDoc;
33 import java.io.IOException JavaDoc;
34 import java.net.MalformedURLException JavaDoc;
35
36 import javax.swing.BorderFactory JavaDoc;
37 import javax.swing.Box JavaDoc;
38 import javax.swing.BoxLayout JavaDoc;
39 import javax.swing.DefaultListSelectionModel JavaDoc;
40 import javax.swing.JButton JavaDoc;
41 import javax.swing.JComponent JavaDoc;
42 import javax.swing.JDialog JavaDoc;
43 import javax.swing.JFileChooser JavaDoc;
44 import javax.swing.JLabel JavaDoc;
45 import javax.swing.JOptionPane JavaDoc;
46 import javax.swing.JPanel JavaDoc;
47 import javax.swing.JScrollPane JavaDoc;
48 import javax.swing.JTextField JavaDoc;
49 import javax.swing.KeyStroke JavaDoc;
50 import javax.swing.ListSelectionModel JavaDoc;
51 import javax.swing.SwingConstants JavaDoc;
52 import javax.swing.event.ListSelectionEvent JavaDoc;
53 import javax.swing.event.ListSelectionListener JavaDoc;
54 import javax.swing.filechooser.FileFilter JavaDoc;
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 /**
71  * JDialog that displays Filter actions for one message folder.
72  *
73  * @author Erik Mattsson
74  */

75
76 public class ConfigFrame extends JDialog JavaDoc implements ListSelectionListener JavaDoc,
77         ActionListener JavaDoc {
78     /*
79      * private JTextField textField; private JPanel leftPanel; private
80      * JTabbedPane rightPanel; private JButton addButton; private JButton
81      * removeButton; private JButton editButton; private JButton upButton;
82      * private JButton downButton;
83      *
84      * private JFrame frame;
85      */

86     private FilterListTable listView;
87
88     // private AdapterNode actNode;
89
private IFilterList filterList;
90
91     // private Filter filter;
92
// private JDialog dialog;
93
private JTextField JavaDoc nameTextField = new JTextField JavaDoc();
94
95     private JButton JavaDoc addButton;
96
97     private JButton JavaDoc removeButton;
98
99     private JButton JavaDoc editButton;
100
101     /*
102      * private JButton enableButton; private JButton disableButton;
103      */

104     private JButton JavaDoc moveupButton;
105
106     private JButton JavaDoc movedownButton;
107
108     private JButton JavaDoc importButton;
109
110     private JButton JavaDoc exportButton;
111
112     private IMailbox folder;
113
114     private IFrameMediator mediator;
115
116     /**
117      * Constructs a ConfigFrame for the specified folder.
118      *
119      * @param messageFolder
120      * folder to set filter actions for.
121      */

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     /**
139      * Returns the <code>Filter</code> that is selected in the list.
140      *
141      * @return null if there is no filter selected; otherwise returns the
142      * selected <code>Filter</code>.
143      */

144     public IFilter getSelected() {
145         IFilter filter = null;
146         ListSelectionModel JavaDoc 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     /**
157      * Selects the filter in the list.
158      *
159      * @param f
160      * filter to select in list.
161      */

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     /**
171      * Inits the GUI components.
172      */

173     private void initComponents() {
174         JPanel JavaDoc mainPanel = new JPanel JavaDoc();
175         mainPanel.setLayout(new BorderLayout JavaDoc());
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         // top panel
221
JPanel JavaDoc topPanel = new JPanel JavaDoc();
222         topPanel.setLayout(new BoxLayout JavaDoc(topPanel, BoxLayout.X_AXIS));
223
224         GridBagLayout JavaDoc gridBagLayout = new GridBagLayout JavaDoc();
225         GridBagConstraints JavaDoc c = new GridBagConstraints JavaDoc();
226
227         // topPanel.setLayout( );
228
JPanel JavaDoc topBorderPanel = new JPanel JavaDoc();
229         topBorderPanel.setLayout(new BorderLayout JavaDoc());
230
231         // topBorderPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 5,
232
// 0));
233
topBorderPanel.add(topPanel);
234
235         // mainPanel.add( topBorderPanel, BorderLayout.NORTH );
236
JLabel JavaDoc nameLabel = new JLabel JavaDoc("name");
237         nameLabel.setEnabled(false);
238         topPanel.add(nameLabel);
239
240         topPanel.add(Box.createRigidArea(new java.awt.Dimension JavaDoc(10, 0)));
241         topPanel.add(Box.createHorizontalGlue());
242
243         nameTextField.setText("name");
244         nameTextField.setEnabled(false);
245         topPanel.add(nameTextField);
246
247         Component JavaDoc glue = Box.createVerticalGlue();
248         c.anchor = GridBagConstraints.EAST;
249         c.gridwidth = GridBagConstraints.REMAINDER;
250
251         // c.fill = GridBagConstraints.HORIZONTAL;
252
gridBagLayout.setConstraints(glue, c);
253
254         gridBagLayout = new GridBagLayout JavaDoc();
255         c = new GridBagConstraints JavaDoc();
256
257         JPanel JavaDoc eastPanel = new JPanel JavaDoc(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 JavaDoc strut1 = Box.createRigidArea(new Dimension JavaDoc(30, 6));
267         gridBagLayout.setConstraints(strut1, c);
268         eastPanel.add(strut1);
269
270         gridBagLayout.setConstraints(editButton, c);
271         eastPanel.add(editButton);
272
273         Component JavaDoc strut = Box.createRigidArea(new Dimension JavaDoc(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 JavaDoc(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 JavaDoc(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 JavaDoc(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 JavaDoc(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         // centerpanel
315
JPanel JavaDoc centerPanel = new JPanel JavaDoc(new BorderLayout JavaDoc());
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 JavaDoc scrollPane = new JScrollPane JavaDoc(listView);
324         scrollPane.setPreferredSize(new Dimension JavaDoc(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 JavaDoc bottomPanel = new JPanel JavaDoc(new BorderLayout JavaDoc());
332         bottomPanel.setBorder(new SingleSideEtchedBorder(SwingConstants.TOP));
333
334         JPanel JavaDoc buttonPanel = new JPanel JavaDoc(new GridLayout JavaDoc(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"); //$NON-NLS-1$
340
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         // associate with JavaHelp
354
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     /** {@inheritDoc} */
361     public void valueChanged(ListSelectionEvent JavaDoc e) {
362         if (e.getValueIsAdjusting()) {
363             return;
364         }
365
366         DefaultListSelectionModel JavaDoc theList = (DefaultListSelectionModel JavaDoc) 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     /**
404      * Shows the edit filter dialog. Method returns false if the dialog was
405      * cancelled by the user or if the specified filter was null. It returns
406      * true if the user has pressed <code>Close</code> in order to save the
407      * filter into the filter list.
408      *
409      * @param filter
410      * the filter to edit.
411      * @return true if the filter dialog was closed (not cancelled); false if
412      * the editing was cancelled or if the argument was null.
413      */

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     /**
426      * {@inheritDoc}
427      */

428     public void actionPerformed(ActionEvent JavaDoc e) {
429         String JavaDoc 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             // Must go backwards or else the list will remove the wrong filters.
446
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             // Must go backwards or else the filters will swap places with each
466
// other.
467
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     /**
481      * Exports the selected filters into a user selected file.
482      */

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         // ask the user about the destination file
492
JFileChooser JavaDoc chooser = new JFileChooser JavaDoc();
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 JavaDoc file = chooser.getSelectedFile();
501
502             XmlIO xmlIO = new XmlIO(newFilterList.getRoot());
503
504             try {
505                 xmlIO.write(new FileOutputStream JavaDoc(file));
506             } catch (FileNotFoundException JavaDoc fnfe) {
507                 DialogFacade.showExceptionDialog(fnfe);
508             } catch (IOException JavaDoc ioe) {
509                 DialogFacade.showExceptionDialog(ioe);
510             }
511         }
512     }
513
514     /**
515      * Imports filters from a File. This method pops up a dialog asking which
516      * file it should import filters from.
517      */

518     private void importFilterList() {
519         // ask the user about the destination file
520
JFileChooser JavaDoc chooser = new JFileChooser JavaDoc();
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 JavaDoc 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 JavaDoc mue) {
559                 DialogFacade.showExceptionDialog(mue);
560             }
561         }
562     }
563
564     /**
565      * Opens the filter edit dialog for the selected filter.
566      */

567     private void editSelectedFilter() {
568         IFilter oldFilter = getSelected();
569
570         if (oldFilter != null) {
571             Filter JavaDoc newFilter = (Filter JavaDoc) 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     /**
583      * Mouse adapter that listens for double clicks on a filter in the filter
584      * table.
585      */

586     private class MouseTableListener extends MouseAdapter JavaDoc {
587         /** {@inheritDoc} */
588         public void mouseClicked(MouseEvent JavaDoc e) {
589             if ((e.getButton() == MouseEvent.BUTTON1)
590                     && (e.getClickCount() >= 2)) {
591                 editSelectedFilter();
592             }
593         }
594     }
595
596     /**
597      * File filter that only accepts XML files (or those ending with it).
598      *
599      * @author redsolo
600      */

601     private class XmlFileFilter extends FileFilter JavaDoc {
602         /** {@inheritDoc} */
603         public boolean accept(File JavaDoc 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         /** {@inheritDoc} */
616         public String JavaDoc getDescription() {
617             return "XML file filter";
618         }
619     }
620 }
Popular Tags