// 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: SendFeedbackAction.java,v 1.12 2008/08/06 14:44:46 spyromus Exp $
//
package com.salas.bb.core.actions;
import com.jgoodies.forms.factories.ButtonBarFactory;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.uif.AbstractDialog;
import com.jgoodies.uif.application.Application;
import com.jgoodies.uif.util.ResourceUtils;
import com.salas.bb.core.ApplicationLauncher;
import com.salas.bb.core.GlobalModel;
import com.salas.bb.dialogs.SendFeedbackDialog;
import com.salas.bb.service.ServerService;
import com.salas.bb.service.ServicePreferences;
import com.salas.bb.utils.i18n.Strings;
import com.salas.bb.utils.uif.BBFormBuilder;
import com.salas.bb.utils.uif.LinkLabel;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
/**
* The action is called when someone wishes to send us a feedback.
*/
public final class SendFeedbackAction extends AbstractAction
{
private static SendFeedbackAction instance;
private SendFeedbackDialog dialog;
/**
* Hidden singleton constructor.
*/
private SendFeedbackAction()
{
setEnabled(ApplicationLauncher.getConnectionState().isServiceAccessible());
}
/**
* Returns action instance.
*
* @return instance.
*/
public static synchronized SendFeedbackAction getInstance()
{
if (instance == null) instance = new SendFeedbackAction();
return instance;
}
/**
* Invoked when an action occurs.
*
* @param e event object.
*/
public void actionPerformed(ActionEvent e)
{
final SendFeedbackDialog dlg = getDialog();
ServicePreferences servicePreferences = GlobalModel.SINGLETON.getServicePreferences();
dlg.open(servicePreferences.getFullName(), servicePreferences.getEmail());
if (!dlg.hasBeenCanceled())
{
String name = dlg.getFullName();
String email = dlg.getEmail();
int forumId = dlg.getForumId();
String subject = dlg.getSubject();
String message = dlg.getMessage();
Thread thread = new SendForumMessage(name, email, forumId, subject, message);
thread.setDaemon(true);
thread.start();
}
}
// Returns dialog.
private synchronized SendFeedbackDialog getDialog()
{
if (dialog == null) dialog = new SendFeedbackDialog(Application.getDefaultParentFrame());
return dialog;
}
/**
* Sends feedback message to the service.
*/
private static class SendForumMessage extends Thread
{
private static final String THREAD_NAME_SENDING_FEEDBACK = "Sending Feedback";
private final String name;
private final String email;
private final int forumId;
private final String subject;
private final String message;
/**
* Creates sending action.
*
* @param aName name of the author.
* @param aEmail email address of the author.
* @param aForumId ID of selected forum.
* @param aSubject subject of the message.
* @param aMessage message text.
*/
public SendForumMessage(String aName, String aEmail, int aForumId, String aSubject,
String aMessage)
{
super(THREAD_NAME_SENDING_FEEDBACK);
name = aName;
email = aEmail;
forumId = aForumId;
subject = aSubject;
message = aMessage;
}
/** Invoked on execution. */
public void run()
{
boolean sent = ServerService.forumPost(name, email, forumId, subject, message);
// Show status message
FeedbackDialog dialog = new FeedbackDialog(sent, forumId);
dialog.open();
}
/**
* Feedback results dialog.
*/
private static class FeedbackDialog extends AbstractDialog
{
private final boolean sent;
private final int forumId;
/**
* Creates the dialog.
*
* @param sent TRUE if the message was sent.
* @param forumId ID of the target forum.
*/
public FeedbackDialog(boolean sent, int forumId)
{
super(Application.getDefaultParentFrame(), Strings.message("feedback.dialog.title"));
this.sent = sent;
this.forumId = forumId;
}
protected JComponent buildContent()
{
BBFormBuilder builder = new BBFormBuilder("p, 8dlu, p:grow");
builder.setDefaultDialogBorder();
builder.append(new JLabel(ResourceUtils.getIcon("application.64.icon")),
1, CellConstraints.DEFAULT, CellConstraints.TOP);
builder.append(buildMainPanel());
builder.appendUnrelatedComponentsGapRow(2);
builder.append(ButtonBarFactory.buildCenteredBar(createOKButton(true)), 3);
return builder.getPanel();
}
private Component buildMainPanel()
{
BBFormBuilder builder = new BBFormBuilder("p");
builder.append(sent
? Strings.message("feedback.success")
: Strings.message("feedback.failure"));
if (sent)
{
LinkLabel linkLabel = new LinkLabel(Strings.message("feedback.forum"),
"http://forum.blogbridge.com/viewforum.php?id=" + forumId);
linkLabel.setForeground(LinkLabel.HIGHLIGHT_COLOR);
builder.appendUnrelatedComponentsGapRow(2);
builder.append(Strings.message("feedback.please.visit"));
builder.append(linkLabel, 1, CellConstraints.CENTER, CellConstraints.DEFAULT);
}
return builder.getPanel();
}
}
}
}