KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > mail > gui > config > account > OutgoingServerPanel


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

17 package org.columba.mail.gui.config.account;
18
19 import java.awt.Font JavaDoc;
20 import java.awt.GridBagConstraints JavaDoc;
21 import java.awt.GridBagLayout JavaDoc;
22 import java.awt.Insets JavaDoc;
23 import java.awt.event.ActionEvent JavaDoc;
24 import java.awt.event.ActionListener JavaDoc;
25 import java.io.File JavaDoc;
26 import java.util.Iterator JavaDoc;
27 import java.util.LinkedList JavaDoc;
28 import java.util.List JavaDoc;
29 import java.util.logging.Logger JavaDoc;
30 import java.util.regex.Matcher JavaDoc;
31 import java.util.regex.Pattern JavaDoc;
32
33 import javax.swing.BorderFactory JavaDoc;
34 import javax.swing.JButton JavaDoc;
35 import javax.swing.JCheckBox JavaDoc;
36 import javax.swing.JComboBox JavaDoc;
37 import javax.swing.JDialog JavaDoc;
38 import javax.swing.JLabel JavaDoc;
39 import javax.swing.JOptionPane JavaDoc;
40 import javax.swing.JPanel JavaDoc;
41 import javax.swing.JSpinner JavaDoc;
42 import javax.swing.JTextField JavaDoc;
43 import javax.swing.SpinnerNumberModel JavaDoc;
44
45 import org.columba.core.config.DefaultConfigDirectory;
46 import org.columba.core.gui.base.ButtonWithMnemonic;
47 import org.columba.core.gui.base.CheckBoxWithMnemonic;
48 import org.columba.core.gui.base.LabelWithMnemonic;
49 import org.columba.core.gui.exception.ExceptionHandler;
50 import org.columba.mail.config.AccountItem;
51 import org.columba.mail.config.MailConfig;
52 import org.columba.mail.config.OutgoingItem;
53 import org.columba.mail.smtp.SMTPServer;
54 import org.columba.mail.util.AuthenticationManager;
55 import org.columba.mail.util.MailResourceLoader;
56 import org.columba.ristretto.smtp.SMTPException;
57
58 import com.jgoodies.forms.builder.DefaultFormBuilder;
59 import com.jgoodies.forms.layout.FormLayout;
60
61 /**
62  * @author fdietz
63  */

64 public class OutgoingServerPanel extends DefaultPanel implements ActionListener JavaDoc {
65
66     /** JDK 1.4+ logging framework logger, used for logging. */
67     private static final Logger JavaDoc LOG = Logger
68             .getLogger("org.columba.mail.gui.config.account");
69
70     private static final Pattern JavaDoc AUTH_MODE_TOKENIZE_PATTERN = Pattern
71             .compile("(\\d+);?");
72
73     private JLabel JavaDoc hostLabel;
74
75     private JTextField JavaDoc hostTextField;
76
77     private JLabel JavaDoc portLabel;
78
79     private JSpinner JavaDoc portSpinner;
80
81     private JLabel JavaDoc loginLabel;
82
83     private JTextField JavaDoc loginTextField;
84
85     private JCheckBox JavaDoc secureCheckBox;
86
87     private JCheckBox JavaDoc needAuthCheckBox;
88
89     private JCheckBox JavaDoc storePasswordCheckBox;
90
91     private JLabel JavaDoc authenticationLabel;
92
93     private JComboBox JavaDoc authenticationComboBox;
94
95     private JCheckBox JavaDoc defaultAccountCheckBox;
96
97     private OutgoingItem item;
98
99     private AccountItem accountItem;
100
101     private JButton JavaDoc checkAuthMethods;
102
103     private JDialog JavaDoc dialog;
104
105     public OutgoingServerPanel(JDialog JavaDoc parent, AccountItem accountItem) {
106         super();
107         this.accountItem = accountItem;
108         item = accountItem.getSmtpItem();
109         dialog = parent;
110
111         initComponents();
112         updateComponents(true);
113     }
114
115     public String JavaDoc getHost() {
116         return hostTextField.getText();
117     }
118
119     public String JavaDoc getLogin() {
120         return loginTextField.getText();
121     }
122
123     public boolean isESmtp() {
124         return needAuthCheckBox.isSelected();
125     }
126
127     protected void updateComponents(boolean b) {
128         if (b) {
129             hostTextField.setText(item.get(OutgoingItem.HOST));
130             String JavaDoc port = item.get(OutgoingItem.PORT);
131             portSpinner.setValue(new Integer JavaDoc(port));
132             loginTextField.setText(item.get(OutgoingItem.USER));
133             storePasswordCheckBox.setSelected(item
134                     .getBoolean(OutgoingItem.SAVE_PASSWORD));
135             secureCheckBox.setSelected(item.getBooleanWithDefault(
136                     OutgoingItem.ENABLE_SSL, false));
137
138             if (!(item.get(OutgoingItem.LOGIN_METHOD).equals(
139                     Integer.toString(AuthenticationManager.NONE)) || item.get(
140                     OutgoingItem.LOGIN_METHOD).equals(OutgoingItem.NONE))) {
141                 needAuthCheckBox.setSelected(true);
142
143                 storePasswordCheckBox.setEnabled(true);
144                 loginLabel.setEnabled(true);
145                 loginTextField.setEnabled(true);
146
147                 String JavaDoc loginMethod = item.get(OutgoingItem.LOGIN_METHOD);
148                 try {
149                     authenticationComboBox.setSelectedItem(new Integer JavaDoc(
150                             loginMethod));
151                 } catch (NumberFormatException JavaDoc e) {
152                 }
153             } else {
154                 needAuthCheckBox.setSelected(false);
155
156                 storePasswordCheckBox.setEnabled(false);
157                 loginLabel.setEnabled(false);
158                 loginTextField.setEnabled(false);
159                 authenticationLabel.setEnabled(false);
160                 authenticationComboBox.setEnabled(false);
161             }
162
163             defaultAccountCheckBox.setEnabled(MailConfig.getInstance()
164                     .getAccountList().getDefaultAccountUid() != accountItem
165                     .getInteger(OutgoingItem.UID));
166
167             if (defaultAccountCheckBox.isEnabled()
168                     && defaultAccountCheckBox.isSelected()) {
169                 showDefaultAccountWarning();
170             } else {
171                 layoutComponents();
172             }
173         } else {
174             item.setString(OutgoingItem.USER, loginTextField.getText());
175             item.setBoolean(OutgoingItem.SAVE_PASSWORD, storePasswordCheckBox
176                     .isSelected());
177             item.setString(OutgoingItem.PORT,
178                     ((Integer JavaDoc) portSpinner.getValue()).toString());
179             item.setString(OutgoingItem.HOST, hostTextField.getText());
180
181             item.setBoolean(OutgoingItem.ENABLE_SSL, secureCheckBox
182                     .isSelected());
183
184             if (needAuthCheckBox.isSelected()) {
185                 item.setString(OutgoingItem.LOGIN_METHOD,
186                         authenticationComboBox.getSelectedItem().toString());
187             } else {
188                 item.setString(OutgoingItem.LOGIN_METHOD, Integer
189                         .toString(AuthenticationManager.NONE));
190             }
191
192             item.setBoolean(OutgoingItem.USE_DEFAULT_ACCOUNT,
193                     defaultAccountCheckBox.isSelected());
194
195             item.getRoot().notifyObservers();
196         }
197     }
198
199     protected void layoutComponents() {
200         // Create a FormLayout instance.
201
FormLayout layout = new FormLayout(
202                 "10dlu, 10dlu, max(60dlu;default), 3dlu, fill:max(150dlu;default):grow, 3dlu, default, 3dlu, default ",
203
204                 // 2 columns
205
""); // rows are added dynamically (no need to define them
206
// here)
207

208         DefaultFormBuilder builder = new DefaultFormBuilder(layout, this);
209
210         // create EmptyBorder between components and dialog-frame
211
builder.setDefaultDialogBorder();
212
213         // skip the first column
214
builder.setLeadingColumnOffset(1);
215
216         // Add components to the panel:
217
// builder.append(defaultAccountCheckBox, 7);
218
// builder.nextLine();
219

220         builder.appendSeparator(MailResourceLoader.getString("dialog",
221                 "account", "configuration"));
222         builder.nextLine();
223
224         // builder.setLeadingColumnOffset(1);
225

226         builder.append(loginLabel, 2);
227         builder.append(loginTextField, 5);
228         builder.nextLine();
229
230         builder.append(hostLabel, 2);
231         builder.append(hostTextField);
232         // builder.nextLine();
233

234         builder.append(portLabel);
235         builder.append(portSpinner);
236         builder.nextLine();
237
238         builder.setLeadingColumnOffset(1);
239
240         builder.appendSeparator(MailResourceLoader.getString("dialog",
241                 "account", "security"));
242         builder.nextLine();
243
244         builder.append(needAuthCheckBox, 8);
245         builder.nextLine();
246
247         builder.setLeadingColumnOffset(2);
248
249         JPanel JavaDoc panel = new JPanel JavaDoc();
250         FormLayout l = new FormLayout(
251                 "default, 3dlu, left:pref:grow, 3dlu, left:pref:grow",
252
253                 // 2 columns
254
"fill:default:grow"); // rows are added dynamically (no need
255
// to
256
// define them here)
257

258         // create a form builder
259
DefaultFormBuilder b = new DefaultFormBuilder(l, panel);
260         b.append(authenticationLabel, authenticationComboBox, checkAuthMethods);
261         // b.nextLine();
262
// b.append(loginLabel, loginTextField);
263
builder.append(panel, 5);
264         builder.nextLine();
265
266         // builder.setLeadingColumnOffset(1);
267
builder.append(secureCheckBox, 6);
268         builder.nextLine();
269
270         JPanel JavaDoc panel2 = new JPanel JavaDoc();
271         FormLayout l2 = new FormLayout("default, 3dlu, left:pref",
272
273         // 2 columns
274
"fill:default:grow"); // rows are added dynamically (no need
275
// to
276
// define them here)
277

278         // create a form builder
279
DefaultFormBuilder b2 = new DefaultFormBuilder(l2, panel2);
280         b2.setRowGroupingEnabled(true);
281         builder.append(panel2, 3);
282         builder.nextLine();
283
284         builder.append(storePasswordCheckBox, 5);
285         builder.nextLine();
286
287         // builder.setLeadingColumnOffset(1);
288
}
289
290     protected void showDefaultAccountWarning() {
291         setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
292
293         GridBagLayout JavaDoc mainLayout = new GridBagLayout JavaDoc();
294         GridBagConstraints JavaDoc mainConstraints = new GridBagConstraints JavaDoc();
295
296         setLayout(mainLayout);
297
298         mainConstraints.gridwidth = GridBagConstraints.REMAINDER;
299         mainConstraints.anchor = GridBagConstraints.NORTHWEST;
300         mainConstraints.weightx = 1.0;
301         mainConstraints.insets = new Insets JavaDoc(0, 10, 5, 0);
302         mainLayout.setConstraints(defaultAccountCheckBox, mainConstraints);
303         add(defaultAccountCheckBox);
304
305         mainConstraints = new GridBagConstraints JavaDoc();
306         mainConstraints.weighty = 1.0;
307         mainConstraints.gridwidth = GridBagConstraints.REMAINDER;
308
309         JLabel JavaDoc label = new JLabel JavaDoc(MailResourceLoader.getString("dialog",
310                 "account", "using_default_account_settings"));
311         Font JavaDoc newFont = label.getFont().deriveFont(Font.BOLD);
312         label.setFont(newFont);
313         mainLayout.setConstraints(label, mainConstraints);
314         add(label);
315     }
316
317     protected void initComponents() {
318         defaultAccountCheckBox = new CheckBoxWithMnemonic(MailResourceLoader
319                 .getString("dialog", "account", "use_default_account_settings"));
320
321         // defaultAccountCheckBox.setEnabled(false);
322
defaultAccountCheckBox.setActionCommand("DEFAULT_ACCOUNT");
323         defaultAccountCheckBox.addActionListener(this);
324
325         hostLabel = new LabelWithMnemonic(MailResourceLoader.getString(
326                 "dialog", "account", OutgoingItem.HOST)); //$NON-NLS-1$
327

328         hostTextField = new JTextField JavaDoc();
329         hostLabel.setLabelFor(hostTextField);
330         portLabel = new LabelWithMnemonic(MailResourceLoader.getString(
331                 "dialog", "account", OutgoingItem.PORT)); //$NON-NLS-1$
332

333         portSpinner = new JSpinner JavaDoc(new SpinnerNumberModel JavaDoc(100, 1, 65535, 1));
334         portLabel.setLabelFor(portSpinner);
335
336         needAuthCheckBox = new CheckBoxWithMnemonic(
337                 MailResourceLoader.getString(
338                         "dialog", "account", "server_needs_authentification")); //$NON-NLS-1$
339

340         needAuthCheckBox.setActionCommand("AUTH"); //$NON-NLS-1$
341
needAuthCheckBox.addActionListener(this);
342
343         storePasswordCheckBox = new CheckBoxWithMnemonic(MailResourceLoader
344                 .getString("dialog", "account",
345                         "store_password_in_configuration_file"));
346
347         storePasswordCheckBox.setActionCommand("SAVE");
348         storePasswordCheckBox.addActionListener(this);
349
350         secureCheckBox = new CheckBoxWithMnemonic(MailResourceLoader.getString(
351                 "dialog", "account", "use_SSL_for_secure_connection"));
352
353         authenticationLabel = new LabelWithMnemonic(MailResourceLoader
354                 .getString("dialog", "account", "authentication_type"));
355
356         authenticationComboBox = new JComboBox JavaDoc();
357         authenticationComboBox
358                 .setRenderer(new AuthenticationListCellRenderer());
359         authenticationLabel.setLabelFor(authenticationComboBox);
360
361         updateAuthenticationComboBox();
362
363         checkAuthMethods = new ButtonWithMnemonic(MailResourceLoader.getString(
364                 "dialog", "account", "authentication_checkout_methods"));
365         checkAuthMethods.setActionCommand("CHECK_AUTHMETHODS");
366         checkAuthMethods.addActionListener(this);
367
368         // authenticationComboBox.addActionListener(this);
369
authenticationLabel.setLabelFor(authenticationComboBox);
370
371         loginLabel = new LabelWithMnemonic(MailResourceLoader.getString(
372                 "dialog", "account", "login"));
373
374         loginTextField = new JTextField JavaDoc();
375         loginLabel.setLabelFor(loginTextField);
376     }
377
378     /**
379      *
380      */

381     private void updateAuthenticationComboBox() {
382         authenticationComboBox.removeAllItems();
383         authenticationComboBox.addItem(new Integer JavaDoc(0));
384
385         if (accountItem.isPopAccount()) {
386             authenticationComboBox.addItem(new Integer JavaDoc(
387                     AuthenticationManager.POP_BEFORE_SMTP));
388         }
389
390         String JavaDoc authMethods = accountItem.getString("smtpserver",
391                 "authentication_methods");
392
393         // Add previously fetch authentication modes
394
if (authMethods != null) {
395             Matcher JavaDoc matcher = AUTH_MODE_TOKENIZE_PATTERN.matcher(authMethods);
396             while (matcher.find()) {
397                 authenticationComboBox.addItem(new Integer JavaDoc(matcher.group(1)));
398             }
399         }
400     }
401
402     public void actionPerformed(ActionEvent JavaDoc e) {
403         String JavaDoc action = e.getActionCommand();
404
405         if (e.getSource() == authenticationComboBox) {
406             loginLabel.setEnabled(true);
407             loginTextField.setEnabled(true);
408             storePasswordCheckBox.setEnabled(true);
409         } else if (action.equals("DEFAULT_ACCOUNT")) {
410             removeAll();
411
412             if (defaultAccountCheckBox.isSelected()) {
413                 showDefaultAccountWarning();
414             } else {
415                 layoutComponents();
416             }
417
418             revalidate();
419         } else if (action.equals("AUTH")) {
420             boolean enabled = needAuthCheckBox.isSelected();
421             loginLabel.setEnabled(enabled);
422             loginTextField.setEnabled(enabled);
423             storePasswordCheckBox.setEnabled(enabled);
424             authenticationLabel.setEnabled(enabled);
425             authenticationComboBox.setEnabled(enabled);
426             checkAuthMethods.setEnabled(enabled);
427         } else if (action.equals("CHECK_AUTHMETHODS")) {
428             fetchSupportedAuthenticationMechanisms();
429         } else if (action.equals("SAVE")) {
430             if (!storePasswordCheckBox.isSelected()) {
431                 return;
432             } else {
433                 File JavaDoc configPath = DefaultConfigDirectory.getInstance().getCurrentPath();
434                 File JavaDoc defaultConfigPath = DefaultConfigDirectory.getDefaultPath();
435                 while (!configPath.equals(defaultConfigPath)) {
436                     configPath = configPath.getParentFile();
437                     if (configPath == null) {
438                         JOptionPane.showMessageDialog(dialog,
439                                 MailResourceLoader.getString("dialog",
440                                         "password", "warn_save_msg"),
441                                 MailResourceLoader.getString("dialog",
442                                         "password", "warn_save_title"),
443                                 JOptionPane.WARNING_MESSAGE);
444                         return;
445                     }
446                 }
447             }
448         }
449     }
450
451     private AccountItem getCurrentDialogSettings() {
452         AccountItem account = (AccountItem) accountItem.clone();
453         OutgoingItem item = account.getSmtpItem();
454         item.setString(OutgoingItem.USER, loginTextField.getText());
455         item.setBoolean(OutgoingItem.SAVE_PASSWORD, storePasswordCheckBox
456                 .isSelected());
457         item.setString(OutgoingItem.PORT, ((Integer JavaDoc) portSpinner.getValue())
458                 .toString());
459         item.setString(OutgoingItem.HOST, hostTextField.getText());
460         item.setBoolean(OutgoingItem.ENABLE_SSL, secureCheckBox.isSelected());
461
462         return account;
463     }
464
465     private void fetchSupportedAuthenticationMechanisms() {
466         List JavaDoc list = new LinkedList JavaDoc();
467
468         try {
469             SMTPServer server = new SMTPServer(getCurrentDialogSettings());
470             list = server.checkSupportedAuthenticationMethods();
471         } catch (SMTPException e1) {
472             LOG.severe("Server does not support the CAPA command");
473         } catch (Exception JavaDoc e) {
474             // let exception handler process other errors
475
new ExceptionHandler().processException(e);
476         }
477
478         // Save the authentication modes
479
if (list.size() > 0) {
480             StringBuffer JavaDoc authMethods = new StringBuffer JavaDoc();
481             Iterator JavaDoc it = list.iterator();
482             authMethods.append(it.next());
483
484             while (it.hasNext()) {
485                 authMethods.append(';');
486                 authMethods.append(it.next());
487             }
488
489             accountItem.setString("smtpserver", "authentication_methods",
490                     authMethods.toString());
491         } else {
492             accountItem.setString("smtpserver", "authentication_methods", "");
493         }
494
495         updateAuthenticationComboBox();
496     }
497
498     public boolean isFinished() {
499         String JavaDoc host = getHost();
500         boolean esmtp = isESmtp();
501
502         if (host.length() == 0) {
503             JOptionPane.showMessageDialog(this, MailResourceLoader.getString(
504                     "dialog", "account", "You_have_to_enter_a_host_name"));
505
506             return false;
507         } else if (esmtp) {
508             String JavaDoc login = getLogin();
509
510             if (login.length() == 0) {
511                 JOptionPane.showMessageDialog(this, MailResourceLoader
512                         .getString("dialog", "account",
513                                 "You_have_to_enter_a_login_name"));
514
515                 return false;
516             }
517         }
518
519         return true;
520     }
521 }
Popular Tags