// 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: InvalidDiscoveryDialog.java,v 1.11 2006/11/22 10:05:01 spyromus Exp $
//
package com.salas.bb.dialogs;
import com.jgoodies.forms.factories.ButtonBarFactory;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.uif.AbstractDialog;
import com.jgoodies.uif.util.Resizer;
import com.salas.bb.utils.uif.HeaderPanelExt;
import com.salas.bb.utils.uif.SelectableLabel;
import com.salas.bb.utils.i18n.Strings;
import com.salas.bb.utils.StringUtils;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.net.URL;
import java.net.MalformedURLException;
/**
* The dialog telling user when the discovery was not helpful.
*/
public class InvalidDiscoveryDialog extends AbstractDialog
{
/** Leave invalid feed as is. */
public static final int OPTION_LEAVE = 0;
/** Use entered URL to make another try. */
public static final int OPTION_NEW_DISCOVERY = 1;
/** Use entered URL to test and report to service associated data URL. */
public static final int OPTION_SUGGEST_URL = 2;
/** Cancels the subscription request. */
public static final int OPTION_CANCEL = 3;
private JTextField lbLink;
private JRadioButton rbLeave;
private JRadioButton rbNewDiscovery;
private JRadioButton rbSuggest;
private JRadioButton rbRemove;
private JTextField tfSuggestedUrl;
private JTextField tfNewDiscoveryUrl;
private static int lastSelection = OPTION_LEAVE;
/**
* Creates dialog.
*
* @param owner owner frame.
*/
public InvalidDiscoveryDialog(Frame owner)
{
super(owner);
initComponents();
}
// Builds content.
protected JComponent buildContent()
{
JPanel content = new JPanel(new BorderLayout());
content.add(buildMainPanel(), BorderLayout.CENTER);
content.add(ButtonBarFactory.buildOKBar(createOKButton(true)), BorderLayout.SOUTH);
return content;
}
// Creates header
protected JComponent buildHeader()
{
return new HeaderPanelExt(Strings.message("invalid.discovery.dialog.title"),
Strings.message("invalid.discovery.dialog.header"),
null);
}
// Creates main panel
private Component buildMainPanel()
{
FormLayout layout = new FormLayout(
"7dlu, pref, 2dlu, min:grow",
"min:grow, " +
"pref, 2dlu, pref, 7dlu, " +
"pref, 2dlu, " +
"pref, 2dlu, " +
"pref, 2dlu, " +
"pref, 2dlu, " +
"pref, " +
"min:grow");
JPanel panel = new JPanel(layout);
CellConstraints cc = new CellConstraints();
panel.add(new JLabel(Strings.message("invalid.discovery.wording")), cc.xyw(1, 2, 4));
panel.add(lbLink, cc.xyw(2, 4, 3));
panel.add(new JLabel(Strings.message("invalid.discovery.query")), cc.xyw(1, 6, 4));
panel.add(rbNewDiscovery, cc.xy(2, 8));
panel.add(tfNewDiscoveryUrl, cc.xy(4, 8));
panel.add(rbSuggest, cc.xy(2, 10));
panel.add(tfSuggestedUrl, cc.xy(4, 10));
panel.add(rbLeave, cc.xy(2, 12));
panel.add(rbRemove, cc.xy(2, 14));
return panel;
}
// Initialization of components
private void initComponents()
{
lbLink = new SelectableLabel();
lbLink.setOpaque(false);
// Init radio-buttons
rbLeave = new JRadioButton(Strings.message("invalid.discovery.fix.it.later"));
rbNewDiscovery = new JRadioButton(Strings.message("invalid.discovery.try.again"));
rbSuggest = new JRadioButton(Strings.message("invalid.discovery.suggest.xmlurl"));
rbRemove = new JRadioButton(Strings.message("invalid.discovery.cancel"));
ButtonGroup group = new ButtonGroup();
group.add(rbNewDiscovery);
group.add(rbSuggest);
group.add(rbLeave);
group.add(rbRemove);
tfNewDiscoveryUrl = new JTextField();
tfNewDiscoveryUrl.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
rbNewDiscovery.setSelected(true);
}
});
tfSuggestedUrl = new JTextField();
tfSuggestedUrl.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
rbSuggest.setSelected(true);
}
});
}
// Resizing hook
protected void resizeHook(JComponent component)
{
component.setPreferredSize(Resizer.DEFAULT.fromHeight(component.getPreferredSize().height));
}
/**
* Open dialog and show the previous URL.
*
* @param discoveryUrl discovery URL to set.
* @param suggestedUrl suggested URL to set.
* @param canSuggest TRUE to enable suggestions.
*
* @return selected option.
*
* @see #OPTION_LEAVE
* @see #OPTION_NEW_DISCOVERY
* @see #OPTION_SUGGEST_URL
*/
public int open(URL discoveryUrl, String suggestedUrl, boolean canSuggest)
{
String url = discoveryUrl == null ? null : discoveryUrl.toString();
lbLink.setText(url);
tfNewDiscoveryUrl.setText(url);
tfSuggestedUrl.setText(suggestedUrl);
JRadioButton selectedButton;
rbSuggest.setEnabled(canSuggest);
tfSuggestedUrl.setEnabled(canSuggest);
if (suggestedUrl != null && canSuggest)
{
selectedButton = rbSuggest;
} else
{
if (!canSuggest && lastSelection == OPTION_SUGGEST_URL) lastSelection = OPTION_LEAVE;
selectedButton = getComponentByOption(lastSelection);
}
selectedButton.setSelected(true);
open();
lastSelection = getSelectedOption();
return lastSelection;
}
// Returns radio-button corresponding to option.
private JRadioButton getComponentByOption(int option)
{
JRadioButton button;
switch (option)
{
case OPTION_CANCEL:
button = rbRemove;
break;
case OPTION_LEAVE:
button = rbLeave;
break;
case OPTION_NEW_DISCOVERY:
button = rbNewDiscovery;
break;
default:
button = rbSuggest;
break;
}
return button;
}
/**
* Returns the option selected by user with radio-buttons.
*
* @return the option.
*
* @see #OPTION_LEAVE
* @see #OPTION_CANCEL
* @see #OPTION_NEW_DISCOVERY
* @see #OPTION_SUGGEST_URL
*/
public int getSelectedOption()
{
int option;
if (rbLeave.isSelected())
{
option = OPTION_LEAVE;
} else if (rbNewDiscovery.isSelected())
{
option = OPTION_NEW_DISCOVERY;
} else if (rbSuggest.isSelected())
{
option = OPTION_SUGGEST_URL;
} else if (rbLeave.isSelected())
{
option = OPTION_LEAVE;
} else
{
option = OPTION_CANCEL;
}
return option;
}
/**
* Returns URL entereed by user in field for New Discovery URL.
*
* @return new discovery URL.
*/
public URL getNewDiscoveryUrl()
{
URL url = null;
String str = tfNewDiscoveryUrl.getText();
try
{
if (!StringUtils.isEmpty(str)) url = new URL(str);
} catch (MalformedURLException e)
{
url = null;
}
return url;
}
/**
* Returns URL entered by user in field for Suggested Feed URL.
*
* @return suggested Feed URL.
*/
public String getSuggestedFeedUrl()
{
return tfSuggestedUrl.getText();
}
}