package org.jivesoftware.sparkimpl.plugin.gateways; import java.awt.Color; import java.awt.EventQueue; import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.DefaultListModel; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.SwingConstants; import javax.swing.UIManager; import org.jivesoftware.resource.Res; import org.jivesoftware.resource.SparkRes; 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.component.panes.CollapsiblePane; import org.jivesoftware.spark.component.renderer.JPanelRenderer; 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 GatewayTabItem extends CollapsiblePane implements GatewayItem { /** * */ private static final long serialVersionUID = 5589644402913737488L; /** * */ private boolean signedIn; private Transport _transport; private DefaultListModel model = new DefaultListModel(); private JList _transportMenu = new JList(model); private JLabel _status = new JLabel(); private JPanel _listPanel = new JPanel(new GridBagLayout()); private JLabel _statusIcon = new JLabel(); private RolloverButton _signInOut = new RolloverButton(); private RolloverButton _registerButton = new RolloverButton(); private JCheckBox _autoJoin = new JCheckBox(); private boolean _transportRegistered = false; private RolloverButton _autoJoinButton = new RolloverButton(); public GatewayTabItem(final Transport transport) { this._transport = transport; _transportRegistered = TransportUtils.isRegistered( SparkManager.getConnection(), _transport); _autoJoin.setEnabled(false); _autoJoin.setBackground((Color)UIManager.get("ContactItem.background")); this.setIcon(transport.getIcon()); _status.setForeground((Color)UIManager.get("ContactItemDescription.foreground")); _status.setFont(new Font(getFont().getName(), Font.ITALIC, getFont() .getSize())); getTitlePane().add(_status); this.setTitle(transport.getName()); _listPanel.setBackground((Color)UIManager.get("ContactItem.background")); _transportMenu.setCellRenderer(new JPanelRenderer()); this.setContentPane(_listPanel); setCollapsed(true); // Check if transport is already registered if (_transportRegistered) { // If yes, check if it is online if (PresenceManager.isOnline(transport.getServiceName())) { getTitlePane().setIcon(transport.getIcon()); _status.setText(Res.getString("online")); setOnline(); } else { getTitlePane().setIcon(transport.getInactiveIcon()); _status.setText(Res.getString("offline")); setOffline(); } } else { // If not. set that transport is not registered yet getTitlePane().setIcon(transport.getInactiveIcon()); _status.setText(Res.getString("offline")); setNotRegistered(); } createTransportMenu(); // Check if autojoin is enabled an join automatically final StatusBar statusBar = SparkManager.getWorkspace().getStatusBar(); 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); } private void createTransportMenu() { _signInOut.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (signedIn) { final Presence offlinePresence = new Presence( Presence.Type.unavailable); offlinePresence.setTo(_transport.getServiceName()); SparkManager.getConnection().sendPacket(offlinePresence); _statusIcon.setIcon(SparkRes .getImageIcon(SparkRes.YELLOW_BALL)); } else { final Presence onlinePresence = new Presence( Presence.Type.available); onlinePresence.setTo(_transport.getServiceName()); SparkManager.getConnection().sendPacket(onlinePresence); _statusIcon.setIcon(SparkRes .getImageIcon(SparkRes.YELLOW_BALL)); } } }); //_autoJoin.setText(Res.getString("menuitem.sign.in.at.login")); // If transport is registered, we can check if the autojoin is enabled if (_transportRegistered) { _autoJoin.setSelected(TransportUtils.autoJoinService(_transport .getServiceName())); _registerButton.setText(Res .getString("menuitem.delete.login.information")); _signInOut.setEnabled(true); } else { setNotRegistered(); } _autoJoinButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { _autoJoin.setSelected(!_autoJoin.isSelected()); TransportUtils.setAutoJoin(_transport.getServiceName(), _autoJoin.isSelected()); } }); _registerButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // If transport is registered we should show the // "delete information" gui if (TransportUtils.isRegistered(SparkManager.getConnection(), _transport)) { 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()); setNotRegistered(); } catch (XMPPException e1) { Log.error(e1); } } } else { // If transport is not registered we should show the // register gui TransportRegistrationDialog registrationDialog = new TransportRegistrationDialog( _transport.getServiceName()); registrationDialog.invoke(); // Set user as offline while he fills in the login // information setOffline(); ActionListener al = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // If user canceled the register window, he is sill // not registrated setNotRegistered(); } }; registrationDialog.addCancelActionListener(al); } } }); _autoJoinButton.setText(Res.getString("menuitem.sign.in.at.login")); _autoJoinButton.setHorizontalAlignment(SwingConstants.LEFT); // JPanel signPanel = new JPanel(new BorderLayout()); // signPanel.setBackground(Color.lightGray); // signPanel.add(_statusIcon, BorderLayout.WEST); // signPanel.add(_signInOut, BorderLayout.CENTER); _registerButton.setHorizontalAlignment(SwingConstants.LEFT); _signInOut.setHorizontalAlignment(SwingConstants.LEFT); _listPanel.add(new JLabel(), new GridBagConstraints(0, 0, 1, 1, 0.1, 0.0,GridBagConstraints.PAGE_START, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); _listPanel.add(_statusIcon, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 3, 0, 0), 0, 0)); _listPanel.add(_signInOut, new GridBagConstraints(2, 0, 1, 1, 0.9, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 5, 0, 0), 0, 0)); _listPanel.add(_autoJoin, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); _listPanel.add(_autoJoinButton, new GridBagConstraints(2, 1, 1, 1, 0.9, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 5, 0, 0), 0, 0)); _listPanel.add(_registerButton, new GridBagConstraints(2, 2, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 5, 0, 0), 0, 0)); //_listPanel.add(_autoJoin); //_listPanel.add(_registerButton); } // Set GUI when user is not registered private void setNotRegistered() { _transportRegistered = false; _autoJoin.setSelected(false); _registerButton.setText(Res .getString("menuitem.enter.login.information")); _signInOut.setEnabled(false); _signInOut.setText(Res.getString("menuitem.sign.in")); _autoJoinButton.setEnabled(false); _statusIcon.setIcon(SparkRes.getImageIcon(SparkRes.BLUE_BALL)); } // Set GUI when user is registered but offline private void setOffline() { _transportRegistered = true; _autoJoin.setSelected(TransportUtils.autoJoinService(_transport .getServiceName())); _registerButton.setText(Res .getString("menuitem.delete.login.information")); _signInOut.setEnabled(true); _signInOut.setText(Res.getString("menuitem.sign.in")); _autoJoinButton.setEnabled(true); _statusIcon.setIcon(SparkRes.getImageIcon(SparkRes.RED_BALL)); } // Set GUI when user is online with rigistered transport private void setOnline() { _statusIcon.setIcon(SparkRes.getImageIcon(SparkRes.GREEN_BALL)); EventQueue.invokeLater(new Runnable() { @Override public void run() { _autoJoin.setSelected(TransportUtils.autoJoinService(_transport .getServiceName())); } }); _signInOut.setText(Res.getString("menuitem.sign.out")); _signInOut.setEnabled(true); _autoJoinButton.setEnabled(true); _registerButton.setText(Res .getString("menuitem.delete.login.information")); } // Change gui if transport signed on or off public void signedIn(final boolean signedIn) { if (!signedIn) { getTitlePane().setIcon(_transport.getInactiveIcon()); _status.setText(Res.getString("offline")); if (!_transportRegistered) { _statusIcon.setIcon(SparkRes.getImageIcon(SparkRes.BLUE_BALL)); _signInOut.setText(Res.getString("menuitem.sign.in")); } else { _statusIcon.setIcon(SparkRes.getImageIcon(SparkRes.RED_BALL)); setOffline(); } } else { getTitlePane().setIcon(_transport.getIcon()); _status.setText(Res.getString("online")); setOnline(); } this.signedIn = signedIn; } public boolean isLoggedIn() { return signedIn; } }