/** * $RCSfile: ,v $ * $Revision: $ * $Date: $ * * Copyright (C) 2004-2011 Jive Software. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jivesoftware.sparkimpl.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.resource.Res; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.spark.PresenceManager; import org.jivesoftware.spark.SparkManager; import org.jivesoftware.spark.component.RolloverButton; import org.jivesoftware.spark.ui.status.StatusBar; import org.jivesoftware.spark.util.TaskEngine; import org.jivesoftware.spark.util.log.Log; import org.jivesoftware.sparkimpl.plugin.gateways.transports.Transport; import org.jivesoftware.sparkimpl.plugin.gateways.transports.TransportUtils; /** * */ public class GatewayButton extends JPanel implements GatewayItem { private static final long serialVersionUID = -2692869826501622612L; 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 = SparkManager.getWorkspace().getStatusBar(); final JPanel commandPanel = SparkManager.getWorkspace().getCommandPanel(); if (PresenceManager.isOnline(transport.getServiceName())) { button.setIcon(transport.getIcon()); } else { button.setIcon(transport.getInactiveIcon()); } button.setToolTipText(transport.getName()); commandPanel.add(button); button.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent mouseEvent) { handlePopup(mouseEvent); } }); commandPanel.updateUI(); final Runnable registerThread = new Runnable() { public void run() { // Send directed presence if registered with this transport. final boolean isRegistered = TransportUtils.isRegistered(SparkManager.getConnection(), transport); if (isRegistered) { // Check if auto login is set. 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()); SparkManager.getConnection().sendPacket(presence); } } } }; TaskEngine.getInstance().submit(registerThread); } /** * Handles the display of a popup menu when a transport button is clicked. * * @param event the MouseEvent. */ private void handlePopup(MouseEvent event) { final JPopupMenu popupMenu = new JPopupMenu(); // Create action to sign off of transport. final JMenuItem signOutMenu = new JMenuItem(Res.getString("menuitem.sign.out")); signOutMenu.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { final Presence offlinePresence = new Presence(Presence.Type.unavailable); offlinePresence.setTo(transport.getServiceName()); SparkManager.getConnection().sendPacket(offlinePresence); } }); // Create menu to sign in. final JMenuItem signInMenu = new JMenuItem(Res.getString("menuitem.sign.in")); signInMenu.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { final Presence onlinePresence = new Presence(Presence.Type.available); onlinePresence.setTo(transport.getServiceName()); SparkManager.getConnection().sendPacket(onlinePresence); } }); // Create menu item to toggle signing in at startup. final JCheckBoxMenuItem signInAtLoginMenu = new JCheckBoxMenuItem(); signInAtLoginMenu.setText(Res.getString("menuitem.sign.in.at.login")); signInAtLoginMenu.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { TransportUtils.setAutoJoin(transport.getServiceName(), signInAtLoginMenu.isSelected()); } }); final JMenuItem registerMenu = new JMenuItem(Res.getString("menuitem.enter.login.information")); registerMenu.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { TransportRegistrationDialog registrationDialog = new TransportRegistrationDialog(transport.getServiceName()); registrationDialog.invoke(); } }); // Create action to delete login information final JMenuItem unregisterMenu = new JMenuItem(Res.getString("menuitem.delete.login.information")); unregisterMenu.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { int confirm = JOptionPane.showConfirmDialog(SparkManager.getMainWindow(), Res.getString("message.disable.transport", transport.getName()), Res.getString("title.disable.transport"), JOptionPane.YES_NO_OPTION); if (confirm == JOptionPane.YES_OPTION) { try { TransportUtils.unregister(SparkManager.getConnection(), transport.getServiceName()); } catch (XMPPException e1) { Log.error(e1); } } } }); // If user is not registered with the gateway boolean reg = TransportUtils.isRegistered(SparkManager.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; } }