// 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$
//
package com.salas.bb.twitter;
import com.jgoodies.binding.adapter.ToggleButtonAdapter;
import com.jgoodies.binding.beans.PropertyAdapter;
import com.jgoodies.binding.value.BufferedValueModel;
import com.jgoodies.binding.value.ValueModel;
import com.salas.bb.utils.i18n.Strings;
import com.salas.bb.utils.swingworker.AbstractSwingWorkerAction;
import com.salas.bb.utils.swingworker.SwingWorker;
import com.salas.bb.utils.uif.*;
import oauth.signpost.exception.OAuthException;
import oauth.signpost.exception.OAuthExpectationFailedException;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.net.URL;
import java.util.concurrent.ExecutionException;
/**
* Twitter preferences.
*/
public class TwitterPreferencesPanel extends JPanel
{
private final TwitterPreferences prefs;
private ProgressSpinner spinner;
private JTextField tfPIN;
private JPanel setupPanel;
private JPanel authPanel;
private JTextField tfScreenName;
/**
* Creates the panel.
*
* @param parent parent dialog.
* @param trigger trigger.
* @param preferences preferences object to manipulate.
*/
public TwitterPreferencesPanel(JDialog parent, ValueModel trigger, TwitterPreferences preferences)
{
prefs = preferences;
configureSetupPanel(trigger);
configureAuthPanel();
this.setLayout(new BorderLayout());
setCorrectPanel();
}
private void setCorrectPanel()
{
JPanel setPanel, removePanel;
if (prefs.isAuthorized())
{
setPanel = setupPanel;
removePanel = authPanel;
} else {
setPanel = authPanel;
removePanel = setupPanel;
tfPIN.setText("");
}
remove(removePanel);
add(setPanel, BorderLayout.CENTER);
revalidate();
repaint();
}
private void configureAuthPanel()
{
BBFormBuilder builder = new BBFormBuilder("p, 4dlu, 50dlu, 4dlu, p, p:grow");
builder.setDefaultDialogBorder();
Component tfWording = ComponentsFactory.createWrappedMultilineLabel(Strings.message("userprefs.tab.twitter.unauthorized"));
JLabel lbStep1 = new JLabel(Strings.message("userprefs.tab.twitter.step1"));
LinkLabel llLink = new TwitterAuthLinkLabel(Strings.message("userprefs.tab.twitter.authPage"));
spinner = new ProgressSpinner();
JLabel lbStep2 = new JLabel(Strings.message("userprefs.tab.twitter.step2"));
tfPIN = new JTextField();
JButton btnAuthorize = new JButton(new AuthorizeAction());
JPanel linkAndSpinner = new JPanel(new FlowLayout(FlowLayout.LEFT));
linkAndSpinner.add(llLink);
linkAndSpinner.add(spinner);
builder.append(tfWording, 6);
builder.appendUnrelatedComponentsGapRow(2);
builder.append(lbStep1);
builder.append(linkAndSpinner, 4);
builder.appendRelatedComponentsGapRow(2);
builder.append(lbStep2, tfPIN);
builder.append(btnAuthorize);
authPanel = builder.getPanel();
}
private void configureSetupPanel(ValueModel trigger)
{
// Layout
BBFormBuilder builder = new BBFormBuilder("7dlu, p, 4dlu, p:grow, 4dlu, p");
builder.setDefaultDialogBorder();
Component tfWording = ComponentsFactory.createWrappedMultilineLabel(
Strings.message("userprefs.tab.twitter.wording"));
JCheckBox chEnabled = ComponentsFactory.createCheckBox(
Strings.message("userprefs.tab.twitter.enable"),
new ToggleButtonAdapter(new BufferedValueModel(
new PropertyAdapter(prefs, TwitterPreferences.PROP_ENABLED),
trigger)));
JCheckBox chProfilePics = ComponentsFactory.createCheckBox(
Strings.message("userprefs.tab.twitter.profile.pics"),
new ToggleButtonAdapter(new BufferedValueModel(
new PropertyAdapter(prefs, TwitterPreferences.PROP_PROFILE_PICS),
trigger)));
JCheckBox chPasteLink = ComponentsFactory.createCheckBox(
Strings.message("userprefs.tab.twitter.paste.link"),
new ToggleButtonAdapter(new BufferedValueModel(
new PropertyAdapter(prefs, TwitterPreferences.PROP_PASTE_LINK),
trigger)));
JLabel lbScreenName = new JLabel(Strings.message("userprefs.tab.twitter.screenname"));
JLabel lbPassword = new JLabel(Strings.message("userprefs.tab.twitter.password"));
tfScreenName = new JTextField();
tfScreenName.setEditable(false);
tfScreenName.setText(prefs.getScreenName());
JButton btnChange = new JButton(new UnauthorizeAction());
StateUpdatingToggleListener.install(chEnabled, lbScreenName, tfScreenName, lbPassword, chProfilePics, chPasteLink);
builder.append(tfWording, 6);
builder.appendUnrelatedComponentsGapRow(2);
builder.append(chEnabled, 6);
builder.setLeadingColumnOffset(1);
builder.nextLine();
builder.append(lbScreenName, tfScreenName);
builder.append(btnChange);
builder.setLeadingColumnOffset(3);
builder.nextLine();
builder.append(chProfilePics, 3);
builder.append(chPasteLink, 3);
setupPanel = builder.getPanel();
}
// Custom Twitter AUTH link label
class TwitterAuthLinkLabel extends LinkLabel
{
public TwitterAuthLinkLabel(String text)
{
super(text, "http://twitter.com/oauth/authorize");
}
protected void doAction()
{
spinner.start();
SwingWorker<Object, Integer> worker = new SwingWorker<Object, Integer>()
{
protected Object doInBackground()
throws Exception
{
String link = prefs.getAuthURL();
if (link != null) setLink(new URL(link));
return null;
}
protected void done()
{
spinner.stop();
TwitterAuthLinkLabel.super.doAction();
}
};
worker.execute();
}
}
class UnauthorizeAction extends AbstractAction
{
public UnauthorizeAction()
{
super(Strings.message("userprefs.tab.twitter.changeAccount"));
}
public void actionPerformed(ActionEvent actionEvent)
{
prefs.unauthorize();
setCorrectPanel();
}
}
class AuthorizeAction extends AbstractSwingWorkerAction<Object, Object>
{
public AuthorizeAction()
{
super(Strings.message("userprefs.tab.twitter.authorize"));
setDisableWhenWorking(true);
}
protected Object performInBackground() throws OAuthException
{
prefs.acquireAccessTokens(tfPIN.getText());
return null;
}
protected void done()
{
try
{
get();
tfScreenName.setText(prefs.getScreenName());
setCorrectPanel();
} catch (ExecutionException e)
{
if (e.getCause() instanceof OAuthExpectationFailedException)
{
JOptionPane.showMessageDialog(TwitterPreferencesPanel.this, Strings.message("userprefs.tab.twitter.pleaseVisit"));
}
} catch (InterruptedException ignore)
{
}
}
}
}