KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > mail > gui > filtertoolbar > FilterToolbar


1 // The contents of this file are subject to the Mozilla Public License Version
2
// 1.1
3
//(the "License"); you may not use this file except in compliance with the
4
//License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
5
//
6
//Software distributed under the License is distributed on an "AS IS" basis,
7
//WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
8
//for the specific language governing rights and
9
//limitations under the License.
10
//
11
//The Original Code is "The Columba Project"
12
//
13
//The Initial Developers of the Original Code are Frederik Dietz and Timo
14
// Stich.
15
//Portions created by Frederik Dietz and Timo Stich are Copyright (C) 2003.
16
//
17
//All Rights Reserved.
18
package org.columba.mail.gui.filtertoolbar;
19
20 import java.awt.event.ActionEvent JavaDoc;
21 import java.awt.event.ActionListener JavaDoc;
22 import java.awt.event.ItemEvent JavaDoc;
23 import java.awt.event.ItemListener JavaDoc;
24 import java.awt.event.KeyEvent JavaDoc;
25 import java.awt.event.KeyListener JavaDoc;
26
27 import javax.swing.BorderFactory JavaDoc;
28 import javax.swing.JButton JavaDoc;
29 import javax.swing.JPanel JavaDoc;
30 import javax.swing.JRadioButtonMenuItem JavaDoc;
31 import javax.swing.JTextField JavaDoc;
32 import javax.swing.event.DocumentEvent JavaDoc;
33 import javax.swing.event.DocumentListener JavaDoc;
34
35 import org.columba.api.selection.ISelectionListener;
36 import org.columba.api.selection.SelectionChangedEvent;
37 import org.columba.core.command.CommandProcessor;
38 import org.columba.core.filter.FilterCriteria;
39 import org.columba.core.folder.api.IFolder;
40 import org.columba.core.gui.base.ButtonWithMnemonic;
41 import org.columba.core.gui.base.ComboMenu;
42 import org.columba.core.gui.util.CTextField;
43 import org.columba.mail.command.IMailFolderCommandReference;
44 import org.columba.mail.command.MailFolderCommandReference;
45 import org.columba.mail.filter.MailFilterFactory;
46 import org.columba.mail.folder.IMailbox;
47 import org.columba.mail.folder.virtual.VirtualFolder;
48 import org.columba.mail.gui.config.search.SearchFrame;
49 import org.columba.mail.gui.frame.MailFrameMediator;
50 import org.columba.mail.gui.table.command.ViewHeaderListCommand;
51 import org.columba.mail.gui.tree.FolderTreeModel;
52 import org.columba.mail.resourceloader.MailImageLoader;
53 import org.columba.mail.util.MailResourceLoader;
54
55 import com.jgoodies.forms.builder.PanelBuilder;
56 import com.jgoodies.forms.layout.CellConstraints;
57 import com.jgoodies.forms.layout.FormLayout;
58
59 /**
60  * Filter toolbar lets you do quick searches on folder contents.
61  *
62  * @author fdietz
63  */

64
65 public class FilterToolbar extends JPanel JavaDoc implements ActionListener JavaDoc,
66         ItemListener JavaDoc, ISelectionListener {
67
68     public JButton JavaDoc clearButton;
69
70     private JButton JavaDoc searchButton;
71
72     private ComboMenu criteriaComboMenu;
73
74     private JTextField JavaDoc textField;
75
76     private MailFrameMediator frameMediator;
77
78     private IFolder sourceFolder;
79
80     private String JavaDoc selectedItem;
81
82     private boolean active;
83
84     String JavaDoc[] strs = new String JavaDoc[] { "subject_contains", "from_contains",
85             "to_contains", "cc_contains", "bcc_contains", "body_contains",
86             "separator", "unread_messages", "flagged_messages",
87             "high_priority", "spam_message", "separator", "custom_search" };
88
89     private IFolder selectedFolder;
90
91     public FilterToolbar(MailFrameMediator frameMediator) {
92         super();
93         this.frameMediator = frameMediator;
94
95         selectedItem = strs[0];
96
97         initComponents();
98         layoutComponents();
99
100         frameMediator.registerTreeSelectionListener(this);
101     }
102
103     private ComboMenu createComboMenu() {
104         ComboMenu c = new ComboMenu();
105         for (int i = 0; i < strs.length; i++) {
106             if (strs[i].equals("separator"))
107                 c.addSeparator();
108             else {
109                 JRadioButtonMenuItem JavaDoc m = c.addMenuItem(strs[i],
110                         MailResourceLoader.getString("filter", "filter",
111                                 strs[i]));
112
113                 switch (i) {
114                 case 7:
115                     m.setIcon(MailImageLoader
116                             .getSmallIcon("message-mail-unread.png"));
117                     break;
118                 case 8:
119                     m.setIcon(MailImageLoader.getSmallIcon("flag.png"));
120                     break;
121                 case 9:
122                     m
123                             .setIcon(MailImageLoader
124                                     .getSmallIcon("priority-high.png"));
125                     break;
126                 case 10:
127                     m.setIcon(MailImageLoader
128                             .getSmallIcon("mail-mark-junk.png"));
129                     break;
130                 }
131             }
132         }
133
134         return c;
135     }
136
137     public void initComponents() {
138
139         criteriaComboMenu = createComboMenu();
140         criteriaComboMenu.addItemListener(this);
141
142         textField = new CTextField();
143
144         textField.addActionListener(this);
145         textField.setActionCommand("TEXTFIELD");
146         textField.addKeyListener(new MyKeyListener());
147
148         clearButton = new ButtonWithMnemonic(MailResourceLoader.getString(
149                 "menu", "mainframe", "filtertoolbar_clear"));
150         clearButton.setToolTipText(MailResourceLoader.getString("menu",
151                 "mainframe", "filtertoolbar_clear_tooltip"));
152         clearButton.setActionCommand("CLEAR");
153         clearButton.addActionListener(this);
154         clearButton.setEnabled(false);
155
156         searchButton = new JButton JavaDoc("Search");
157         searchButton.setActionCommand("SEARCH");
158         searchButton.addActionListener(this);
159         searchButton.setDefaultCapable(true);
160         searchButton.setEnabled(false);
161     }
162
163     public void layoutComponents() {
164         setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
165
166         FormLayout l = new FormLayout(
167                 "default, 3dlu, fill:default:grow, 3dlu, default, 3dlu, default",
168                 "fill:default:grow");
169         PanelBuilder b = new PanelBuilder(l, this);
170
171         CellConstraints c = new CellConstraints();
172
173         b.add(criteriaComboMenu, c.xy(1, 1));
174
175         b.add(textField, c.xy(3, 1));
176
177         b.add(searchButton, c.xy(5, 1));
178
179         b.add(clearButton, c.xy(7, 1));
180
181     }
182
183     private int getIndex(String JavaDoc name) {
184         for (int i = 0; i < strs.length; i++) {
185             if (name.equals(strs[i]))
186                 return i;
187         }
188
189         return -1;
190     }
191
192     public void actionPerformed(ActionEvent JavaDoc e) {
193         String JavaDoc action = e.getActionCommand();
194
195         if (action.equals("SEARCH")) {
196             executeSearch();
197
198         } else if (action.equals("CLEAR")) {
199
200             resetToolbar();
201
202             // select search folder
203
MailFolderCommandReference r = new MailFolderCommandReference(
204                     sourceFolder);
205             frameMediator.setTreeSelection(r);
206
207             frameMediator.setTableSelection(r);
208             CommandProcessor.getInstance().addOp(
209                     new ViewHeaderListCommand(frameMediator, r));
210         }
211
212     }
213
214     /**
215      *
216      */

217     private void resetToolbar() {
218         active = false;
219         clearButton.setEnabled(false);
220
221         textField.setText("");
222     }
223
224     /**
225      * Execute search.
226      */

227     private void executeSearch() {
228         clearButton.setEnabled(true);
229         active = true;
230
231         // get selected search criteria
232
int index = getIndex(selectedItem);
233
234         // create filter criteria based on selected type
235
FilterCriteria c = createFilterCriteria(index);
236
237         if (!selectedFolder.getId().equals("106"))
238             sourceFolder = selectedFolder;
239         
240         // set criteria for search folder
241
VirtualFolder searchFolder = prepareSearchFolder(c, sourceFolder);
242
243         try {
244             // add search to history
245
searchFolder.addSearchToHistory();
246         } catch (Exception JavaDoc e) {
247             e.printStackTrace();
248         }
249
250         // select search folder
251

252         MailFolderCommandReference r = new MailFolderCommandReference(
253                 searchFolder);
254
255         frameMediator.setTableSelection(r);
256
257         CommandProcessor.getInstance().addOp(
258                 new ViewHeaderListCommand(frameMediator, r));
259     }
260
261     /**
262      * Create new virtual folder with filter criteria settings and selected it.
263      *
264      * @param c
265      * filter criteria settings
266      * @return source folder
267      */

268     private VirtualFolder prepareSearchFolder(FilterCriteria c, IFolder folder) {
269         // get search folder
270
VirtualFolder searchFolder = (VirtualFolder) FolderTreeModel
271                 .getInstance().getFolder("106");
272
273         // remove old filters
274
searchFolder.getFilter().getFilterRule().removeAll();
275
276         // add filter criteria
277
searchFolder.getFilter().getFilterRule().add(c);
278
279         // don't search in subfolders recursively
280
searchFolder.getConfiguration().setString("property",
281                 "include_subfolders", "false");
282
283         String JavaDoc uid = folder.getId();
284
285         // set source folder UID
286
searchFolder.getConfiguration().setString("property", "source_uid",
287                 uid);
288
289         searchFolder.deactivate();
290
291         return searchFolder;
292     }
293
294     /**
295      * Create filter criteria, based on current selection.
296      *
297      * @param index
298      * selected criteria
299      * @return newly created filter criteria
300      */

301     private FilterCriteria createFilterCriteria(int index) {
302         String JavaDoc pattern = textField.getText();
303         FilterCriteria c = null;
304         switch (index) {
305
306         case 0:
307             c = MailFilterFactory.createSubjectContains(pattern);
308             break;
309         case 1:
310             c = MailFilterFactory.createFromContains(pattern);
311             break;
312         case 2:
313             c = MailFilterFactory.createToContains(pattern);
314             break;
315         case 3:
316             c = MailFilterFactory.createCcContains(pattern);
317             break;
318         case 4:
319             c = MailFilterFactory.createBccContains(pattern);
320             break;
321         case 5:
322             c = MailFilterFactory.createBodyContains(pattern);
323             break;
324         case 7:
325             c = MailFilterFactory.createUnreadMessages();
326             break;
327         case 8:
328             c = MailFilterFactory.createFlaggedMessages();
329             break;
330         case 9:
331             c = MailFilterFactory.createHighPriority();
332             break;
333         case 10:
334             c = MailFilterFactory.createSpamMessages();
335             break;
336
337         }
338
339         return c;
340     }
341
342     public void setPattern(String JavaDoc pattern) {
343         textField.setText(pattern);
344     }
345
346     /**
347      * Execute search when pressing RETURN in the textfield.
348      *
349      * @author fdietz
350      */

351     class MyKeyListener implements KeyListener JavaDoc {
352         public void keyTyped(KeyEvent JavaDoc e) {
353         }
354
355         public void keyPressed(KeyEvent JavaDoc e) {
356         }
357
358         public void keyReleased(KeyEvent JavaDoc e) {
359             char ch = e.getKeyChar();
360
361             if (ch == KeyEvent.VK_ENTER) {
362                 executeSearch();
363             }
364         }
365     }
366
367     /**
368      * Execute search while user is typing pattern in textfield.
369      *
370      * @author fdietz
371      */

372     class MyDocumentListener implements DocumentListener JavaDoc {
373
374         public void insertUpdate(DocumentEvent JavaDoc e) {
375             update();
376         }
377
378         public void removeUpdate(DocumentEvent JavaDoc e) {
379             update();
380         }
381
382         public void changedUpdate(DocumentEvent JavaDoc e) {
383             // Plain text components don't fire these events
384
}
385
386         public void update() {
387             if (sourceFolder == null)
388                 return;
389
390         }
391     }
392
393     /**
394      * @see java.awt.event.ItemListener#itemStateChanged(java.awt.event.ItemEvent)
395      */

396     public void itemStateChanged(ItemEvent JavaDoc event) {
397         selectedItem = (String JavaDoc) event.getItem();
398
399         // execute custom search
400
if (selectedItem.equals("custom_search")) {
401             executeCustomSearch();
402             criteriaComboMenu.setSelectedItem(0);
403             return;
404         }
405
406         // enable/disable textfield in-dependency of selected criteria
407
int selectedIndex = getIndex(selectedItem);
408         if (selectedIndex >= 0 && selectedIndex <= 5) {
409             textField.setEnabled(true);
410             textField.requestFocus();
411         } else {
412             textField.setEnabled(false);
413
414             // directly execute search
415
executeSearch();
416         }
417
418     }
419
420     /**
421      * Open the search dialog, with pre-filled settings.
422      *
423      */

424     private void executeCustomSearch() {
425         IMailbox searchFolder = (IMailbox) FolderTreeModel.getInstance()
426                 .getFolder("106");
427
428         IMailbox folder = (IMailbox) frameMediator.getTableSelection()
429                 .getSourceFolder();
430
431         if (folder == null) {
432             return;
433         }
434
435         new SearchFrame(frameMediator, searchFolder, folder);
436     }
437
438     /*
439      * (non-Javadoc)
440      *
441      * @see org.columba.core.gui.selection.ISelectionListener#selectionChanged(org.columba.core.gui.selection.SelectionChangedEvent)
442      */

443     public void selectionChanged(SelectionChangedEvent e) {
444         // get currently selected folder
445
IMailFolderCommandReference ref = frameMediator.getTreeSelection();
446
447         if (ref != null) {
448             selectedFolder = ref.getSourceFolder();
449             searchButton.setEnabled(true);
450         } else {
451             searchButton.setEnabled(false);
452         }
453
454         if (active) {
455             resetToolbar();
456             active = false;
457         }
458     }
459 }
Popular Tags