001: // The contents of this file are subject to the Mozilla Public License Version
002: // 1.1
003: //(the "License"); you may not use this file except in compliance with the
004: //License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
005: //
006: //Software distributed under the License is distributed on an "AS IS" basis,
007: //WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
008: //for the specific language governing rights and
009: //limitations under the License.
010: //
011: //The Original Code is "The Columba Project"
012: //
013: //The Initial Developers of the Original Code are Frederik Dietz and Timo
014: // Stich.
015: //Portions created by Frederik Dietz and Timo Stich are Copyright (C) 2003.
016: //
017: //All Rights Reserved.
018: package org.columba.mail.gui.config.filter;
019:
020: import java.awt.BorderLayout;
021: import java.awt.Component;
022: import java.awt.Dimension;
023: import java.awt.GridBagConstraints;
024: import java.awt.GridBagLayout;
025: import java.awt.GridLayout;
026: import java.awt.Insets;
027: import java.awt.event.ActionEvent;
028: import java.awt.event.ActionListener;
029: import java.awt.event.ItemEvent;
030: import java.awt.event.ItemListener;
031: import java.util.Iterator;
032: import java.util.List;
033: import java.util.Vector;
034:
035: import javax.swing.BorderFactory;
036: import javax.swing.Box;
037: import javax.swing.JButton;
038: import javax.swing.JPanel;
039: import javax.swing.JScrollPane;
040:
041: import org.columba.api.plugin.IExtension;
042: import org.columba.api.plugin.IExtensionHandler;
043: import org.columba.api.plugin.PluginHandlerNotFoundException;
044: import org.columba.core.filter.Filter;
045: import org.columba.core.filter.FilterCriteria;
046: import org.columba.core.filter.FilterRule;
047: import org.columba.core.filter.IFilter;
048: import org.columba.core.filter.IFilterCriteria;
049: import org.columba.core.filter.IFilterRule;
050: import org.columba.core.gui.dialog.ErrorDialog;
051: import org.columba.core.plugin.PluginManager;
052: import org.columba.core.resourceloader.IconKeys;
053: import org.columba.core.resourceloader.ImageLoader;
054: import org.columba.mail.gui.config.filter.plugins.DefaultCriteriaRow;
055: import org.columba.mail.plugin.IExtensionHandlerKeys;
056:
057: public class CriteriaList extends JPanel implements ActionListener,
058: ItemListener {
059: private IFilter filter;
060:
061: private List list;
062:
063: private JPanel panel;
064:
065: private IExtensionHandler pluginHandler;
066:
067: private IExtensionHandler pluginUIHandler;
068:
069: public CriteriaList(IFilter filter) {
070: super ();
071:
072: try {
073: pluginHandler = PluginManager
074: .getInstance()
075: .getExtensionHandler(
076: IExtensionHandlerKeys.ORG_COLUMBA_MAIL_FILTER);
077: pluginUIHandler = PluginManager
078: .getInstance()
079: .getExtensionHandler(
080: IExtensionHandlerKeys.ORG_COLUMBA_MAIL_FILTERUI);
081: } catch (PluginHandlerNotFoundException ex) {
082: ErrorDialog.createDialog(ex.getMessage(), ex);
083: }
084:
085: this .filter = filter;
086:
087: list = new Vector();
088:
089: panel = new JPanel();
090:
091: JScrollPane scrollPane = new JScrollPane(panel);
092: setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
093:
094: scrollPane.setPreferredSize(new Dimension(500, 100));
095: setLayout(new BorderLayout());
096:
097: add(scrollPane, BorderLayout.CENTER);
098:
099: update();
100: }
101:
102: public void updateComponents(boolean b) {
103: if (!b) {
104: for (Iterator it = list.iterator(); it.hasNext();) {
105: DefaultCriteriaRow row = (DefaultCriteriaRow) it.next();
106:
107: row.updateComponents(false);
108: }
109: }
110: }
111:
112: public void add() {
113: IFilterRule rule = filter.getFilterRule();
114: rule.addEmptyCriteria();
115:
116: updateComponents(false);
117: update();
118: }
119:
120: public void remove(int i) {
121: IFilterRule rule = filter.getFilterRule();
122:
123: if (rule.count() > 1) {
124: updateComponents(false);
125: rule.remove(i);
126: update();
127: }
128: }
129:
130: public void update() {
131: panel.removeAll();
132: list.clear();
133:
134: GridBagLayout gridbag = new GridBagLayout();
135: GridBagConstraints c = new GridBagConstraints();
136: panel.setLayout(gridbag);
137:
138: IFilterRule rule = filter.getFilterRule();
139:
140: for (int i = 0; i < rule.count(); i++) {
141: IFilterCriteria criteria = rule.get(i);
142: String type = criteria.getTypeString();
143: DefaultCriteriaRow column = null;
144:
145: c.fill = GridBagConstraints.NONE;
146:
147: c.gridx = GridBagConstraints.RELATIVE;
148: c.gridy = i;
149: c.weightx = 1.0;
150: c.anchor = GridBagConstraints.NORTHWEST;
151: c.insets = new Insets(0, 0, 0, 0);
152: c.gridwidth = 1;
153:
154: Object[] args = { pluginHandler, this , criteria };
155:
156: try {
157: IExtension extension = pluginHandler.getExtension(type);
158: String uiId = extension.getMetadata()
159: .getAttribute("ui");
160: IExtension uiExtension = pluginUIHandler
161: .getExtension(uiId);
162:
163: column = (DefaultCriteriaRow) uiExtension
164: .instanciateExtension(args);
165: } catch (Exception ex) {
166: ex.printStackTrace();
167: }
168:
169: // fall-back if error occurs
170: if (column == null) {
171: try {
172: IExtension extension = pluginHandler
173: .getExtension("Subject");
174: String uiId = extension.getMetadata().getAttribute(
175: "ui");
176: IExtension uiExtension = pluginUIHandler
177: .getExtension(uiId);
178:
179: column = (DefaultCriteriaRow) uiExtension
180: .instanciateExtension(args);
181: } catch (Exception ex) {
182: ex.printStackTrace();
183: }
184:
185: criteria.setTypeString("Subject");
186: }
187:
188: gridbag.setConstraints(column.getContentPane(), c);
189: list.add(column);
190:
191: panel.add(column.getContentPane());
192:
193: JButton addButton = new JButton(ImageLoader
194: .getIcon(IconKeys.LIST_ADD));
195: addButton.setActionCommand("ADD");
196: addButton.setMargin(new Insets(0, 0, 0, 0));
197: addButton.addActionListener(new ActionListener() {
198: public void actionPerformed(ActionEvent e) {
199: add();
200: }
201: });
202:
203: JButton removeButton = new JButton(ImageLoader
204: .getIcon(IconKeys.LIST_REMOVE));
205: removeButton.setMargin(new Insets(0, 0, 0, 0));
206: removeButton.setActionCommand(Integer.toString(i));
207:
208: final int index = i;
209: removeButton.addActionListener(new ActionListener() {
210: public void actionPerformed(ActionEvent e) {
211: remove(index);
212: }
213: });
214:
215: JPanel buttonPanel = new JPanel();
216: buttonPanel.setLayout(new GridLayout(0, 2, 2, 2));
217: buttonPanel.add(removeButton);
218: buttonPanel.add(addButton);
219:
220: c.insets = new Insets(2, 2, 2, 2);
221: c.gridx = GridBagConstraints.REMAINDER;
222: c.anchor = GridBagConstraints.NORTHEAST;
223: gridbag.setConstraints(buttonPanel, c);
224: panel.add(buttonPanel);
225: }
226:
227: c.weighty = 1.0;
228:
229: Component box = Box.createVerticalGlue();
230: gridbag.setConstraints(box, c);
231: panel.add(box);
232:
233: validate();
234: repaint();
235: }
236:
237: public void actionPerformed(ActionEvent e) {
238: updateComponents(false);
239: update();
240: }
241:
242: /**
243: * @see java.awt.event.ItemListener#itemStateChanged(java.awt.event.ItemEvent)
244: */
245: public void itemStateChanged(ItemEvent arg0) {
246: updateComponents(false);
247: update();
248:
249: }
250: }
|