package org.chartsy.chatsy.chatimpl.plugin.gateways;
import java.awt.Component;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Presence;
import org.chartsy.chatsy.chat.PresenceManager;
import org.chartsy.chatsy.chat.ChatsyManager;
import org.chartsy.chatsy.chat.component.RolloverButton;
import org.chartsy.chatsy.chat.ui.status.StatusBar;
import org.chartsy.chatsy.chat.util.TaskEngine;
import org.chartsy.chatsy.chat.util.log.Log;
import org.chartsy.chatsy.chatimpl.plugin.gateways.transports.Transport;
import org.chartsy.chatsy.chatimpl.plugin.gateways.transports.TransportUtils;
/**
*
*/
public class GatewayButton extends JPanel
{
private final RolloverButton button = new RolloverButton();
private Transport transport;
private boolean signedIn;
public GatewayButton(final Transport transport)
{
setLayout(new GridBagLayout());
setOpaque(false);
this.transport = transport;
final StatusBar statusBar = ChatsyManager.getWorkspace().getStatusBar();
final JPanel commandPanel = ChatsyManager.getWorkspace().getCommandPanel();
if (PresenceManager.isOnline(transport.getServiceName()))
{
button.setIcon(transport.getIcon());
}
else
{
button.setIcon(transport.getInactiveIcon());
}
button.setToolTipText(transport.getName());
button.addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent mouseEvent)
{
handlePopup(mouseEvent);
}
});
commandPanel.add(button);
commandPanel.updateUI();
final Runnable registerThread = new Runnable()
{
public void run()
{
final boolean isRegistered = TransportUtils.isRegistered(ChatsyManager.getConnection(), transport);
if (isRegistered)
{
boolean autoJoin = TransportUtils.autoJoinService(transport.getServiceName());
if (autoJoin)
{
Presence oldPresence = statusBar.getPresence();
Presence presence = new Presence(oldPresence.getType(), oldPresence.getStatus(), oldPresence.getPriority(), oldPresence.getMode());
presence.setTo(transport.getServiceName());
ChatsyManager.getConnection().sendPacket(presence);
}
}
}
};
TaskEngine.getInstance().submit(registerThread);
}
private void handlePopup(MouseEvent event)
{
final JPopupMenu popupMenu = new JPopupMenu();
final JMenuItem signOutMenu = new JMenuItem("Sign Out");
signOutMenu.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent actionEvent)
{
final Presence offlinePresence = new Presence(Presence.Type.unavailable);
offlinePresence.setTo(transport.getServiceName());
ChatsyManager.getConnection().sendPacket(offlinePresence);
}
});
final JMenuItem signInMenu = new JMenuItem("Sing In");
signInMenu.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent actionEvent)
{
final Presence onlinePresence = new Presence(Presence.Type.available);
onlinePresence.setTo(transport.getServiceName());
ChatsyManager.getConnection().sendPacket(onlinePresence);
}
});
final JCheckBoxMenuItem signInAtLoginMenu = new JCheckBoxMenuItem();
signInAtLoginMenu.setText("Sign in at login");
signInAtLoginMenu.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent actionEvent)
{
TransportUtils.setAutoJoin(transport.getServiceName(), signInAtLoginMenu.isSelected());
}
});
final JMenuItem registerMenu = new JMenuItem("Enter login information");
registerMenu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
TransportRegistrationDialog registrationDialog = new TransportRegistrationDialog(transport.getServiceName());
registrationDialog.invoke();
}
});
final JMenuItem unregisterMenu = new JMenuItem("Delete login information");
unregisterMenu.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent actionEvent)
{
int confirm = JOptionPane.showConfirmDialog(
ChatsyManager.getMainWindow(),
"Remove login information from " + transport.getName() + "?",
"Remove login information",
JOptionPane.YES_NO_OPTION);
if (confirm == JOptionPane.YES_OPTION)
{
try
{
TransportUtils.unregister(ChatsyManager.getConnection(), transport.getServiceName());
}
catch (XMPPException e1)
{
Log.error(e1);
}
}
}
});
boolean reg = TransportUtils.isRegistered(ChatsyManager.getConnection(), transport);
if (!reg)
{
popupMenu.add(registerMenu);
popupMenu.addSeparator();
signInMenu.setEnabled(false);
popupMenu.add(signInMenu);
signInAtLoginMenu.setEnabled(false);
popupMenu.add(signInAtLoginMenu);
popupMenu.show((Component)event.getSource(), event.getX(), event.getY());
return;
}
if (signedIn)
{
popupMenu.add(signOutMenu);
}
else
{
popupMenu.add(signInMenu);
}
boolean autoJoin = TransportUtils.autoJoinService(transport.getServiceName());
signInAtLoginMenu.setSelected(autoJoin);
popupMenu.add(signInAtLoginMenu);
popupMenu.addSeparator();
popupMenu.add(unregisterMenu);
popupMenu.show((Component)event.getSource(), event.getX(), event.getY());
}
public void signedIn(boolean signedIn)
{
if (!signedIn)
{
button.setIcon(transport.getInactiveIcon());
}
else
{
button.setIcon(transport.getIcon());
}
this.signedIn = signedIn;
}
public boolean isLoggedIn()
{
return signedIn;
}
}