// BlogBridge -- RSS feed reader, manager, and web based service // Copyright (C) 2002-2006 by R. Pito Salas // // This program is free software; you can redistribute it and/or modify it under // the terms of the GNU General Public License as published by the Free Software Foundation; // either version 2 of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License along with this program; // if not, write to the Free Software Foundation, Inc., 59 Temple Place, // Suite 330, Boston, MA 02111-1307 USA // // Contact: R. Pito Salas // mailto:pitosalas@users.sourceforge.net // More information: about BlogBridge // http://www.blogbridge.com // http://sourceforge.net/projects/blogbridge // // $Id: ImportGuidesDialog.java,v 1.24 2006/05/30 14:51:22 spyromus Exp $ // package com.salas.bb.dialogs.guide; import com.jgoodies.uif.AbstractDialog; import com.salas.bb.core.actions.guide.OPMLSelectionAction; import com.salas.bb.utils.Constants; import com.salas.bb.utils.i18n.Strings; import com.salas.bb.utils.uif.BBFormBuilder; import com.salas.bb.utils.uif.ComponentsFactory; import com.salas.bb.utils.uif.HeaderPanelExt; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.URL; import java.net.MalformedURLException; import java.text.MessageFormat; /** * Dialog for importing of Channel Guides. */ public class ImportGuidesDialog extends AbstractDialog { private JTextField tfUrl; private JButton btnBrowse; private JRadioButton rbFromURL; protected JRadioButton rbFromBloglines; private JRadioButton rbAsSingle; private JRadioButton rbAsMultiple; private JLabel lbEmail; private JTextField tfBloglinesEmail; private JLabel lbPass; private JPasswordField tfBloglinesPassword; protected JCheckBox chReplace; /** * Creates dialog box for entering properties of new guide. * * @param owner owner-frame. */ public ImportGuidesDialog(final Frame owner) { super(owner, Strings.message("import.guides.dialog.title")); } /** * Build header panel. * * @return header panel. */ protected JComponent buildHeader() { return new HeaderPanelExt( Strings.message("import.guides.dialog.title"), Strings.message("import.guides.dialog.header")); } /** * Returns content of the dialog box. * * @return content component. */ protected JComponent buildContent() { JPanel content = new JPanel(new BorderLayout()); content.add(buildBody(), BorderLayout.CENTER); content.add(buildButtonBarWithOKCancel(), BorderLayout.SOUTH); return content; } /** * Main dialog body. * * @return body. */ private JComponent buildBody() { setupComponents(); BBFormBuilder builder = new BBFormBuilder("7dlu, 7dlu, pref:grow, 2dlu, 150dlu, 1dlu, p"); builder.append(rbFromURL, 7); builder.setLeadingColumnOffset(4); builder.append(tfUrl, btnBrowse); builder.nextLine(); builder.setLeadingColumnOffset(0); builder.append(rbFromBloglines, 7); builder.setLeadingColumnOffset(2); builder.append(lbEmail, tfBloglinesEmail); builder.nextLine(); builder.append(lbPass, tfBloglinesPassword); builder.appendUnrelatedComponentsGapRow(2); builder.setLeadingColumnOffset(0); builder.appendSeparator(Strings.message("import.guides.options")); builder.setLeadingColumnOffset(1); builder.append(rbAsSingle, 6); builder.append(rbAsMultiple, 6); builder.setLeadingColumnOffset(2); builder.append(chReplace, 5); return builder.getPanel(); } private void setupComponents() { ButtonGroup bg; lbEmail = ComponentsFactory.createLabel(Strings.message("import.guides.email")); lbPass = ComponentsFactory.createLabel(Strings.message("import.guides.password")); tfUrl = new JTextField(); btnBrowse = new JButton("\u2026"); tfBloglinesEmail = new JTextField(); tfBloglinesPassword = new JPasswordField(); rbFromURL = ComponentsFactory.createRadioButton(Strings.message("import.guides.from.file.or.url")); rbFromURL.setToolTipText(Strings.message("import.guides.from.file.or.url.tooltip")); rbFromBloglines = ComponentsFactory.createRadioButton(Strings.message("import.guides.from.bloglines")); bg = new ButtonGroup(); bg.add(rbFromURL); bg.add(rbFromBloglines); rbAsSingle = ComponentsFactory.createRadioButton(Strings.message("import.guides.single.guide")); rbAsMultiple = ComponentsFactory.createRadioButton(Strings.message("import.guides.multiple.guides")); bg = new ButtonGroup(); bg.add(rbAsSingle); bg.add(rbAsMultiple); chReplace = ComponentsFactory.createCheckBox(Strings.message("import.guides.replace")); SingleMultiListener l = new SingleMultiListener(); rbAsSingle.addActionListener(l); rbAsMultiple.addActionListener(l); rbFromURL.addActionListener(l); rbFromBloglines.addActionListener(l); rbFromURL.setSelected(true); rbAsSingle.setSelected(true); chReplace.setSelected(false); reviewOptionsState(); btnBrowse.setAction(new OPMLSelectionAction(OPMLSelectionAction.MODE_OPEN, tfUrl)); btnBrowse.setMargin(Constants.INSETS_NONE); btnBrowse.setPreferredSize(new Dimension(20, 20)); } /** * Enables / disabled 'Append' and 'Replace' radio-buttons depending on * selection state of 'Multi'-mode. */ private void reviewOptionsState() { chReplace.setEnabled(rbAsMultiple.isSelected()); boolean fromBloglines = rbFromBloglines.isSelected(); lbEmail.setEnabled(fromBloglines); tfBloglinesEmail.setEnabled(fromBloglines); lbPass.setEnabled(fromBloglines); tfBloglinesPassword.setEnabled(fromBloglines); } /** * Accepts or declines entry. */ public void doAccept() { String error = validateEntry(); if (error == null) { super.doAccept(); } else { JOptionPane.showMessageDialog(this, MessageFormat.format(Strings.message("import.guides.error"), new Object[] { error }), this.getTitle(), JOptionPane.WARNING_MESSAGE); } } /** * Validates entry. * * @return entry. */ private String validateEntry() { String error = null; if (rbFromBloglines.isSelected()) { String email = tfBloglinesEmail.getText(); if (email.trim().length() == 0) { error = Strings.message("import.guides.validation.unspecified.email"); } else if (tfBloglinesPassword.getPassword().length == 0) { error = Strings.message("import.guides.unspecified.password"); } } else { String urlString = tfUrl.getText().trim(); if (urlString.length() == 0) { error = Strings.message("import.guides.unspecified.link.or.path"); } else { try { new URL(urlString); } catch (MalformedURLException e) { error = Strings.message("import.guides.invalid.url"); } } } return error; } /** * Returns <code>TRUE</code> if user selected to get OPML from URL. * * @return <code>TRUE</code> if user selected to get OPML from URL. */ public boolean isFromURL() { return rbFromURL.isSelected(); } /** * Returns Bloglines account email. * * @return Bloglines account email. */ public String getBloglinesEmail() { return tfBloglinesEmail.getText(); } /** * Returns Bloglines account password. * * @return Bloglines account password. */ public String getBloglinesPassword() { return new String(tfBloglinesPassword.getPassword()); } /** * Returns TRUE if user selected 'Single guide import' mode. * * @return TRUE if in single-guide mode. */ public boolean isSingleMode() { return rbAsSingle.isSelected(); } /** * Returns TRUE if user selected appending mode. * * @return TRUE - appending, FALSE - replacing. */ public boolean isAppendingMode() { return !chReplace.isSelected(); } /** * Returns entered string in OPML-URL field. * * @return entered URL. */ public String getUrlString() { return tfUrl.getText(); } /** * Class listens for radio-selection of single-multiple mode and enables/disabled multiple * mode options. */ private class SingleMultiListener implements ActionListener { /** * Invoked when an action occurs. */ public void actionPerformed(ActionEvent e) { reviewOptionsState(); } } }