All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.yaoqiang.collaboration.MainPanel Maven / Gradle / Ivy

package org.yaoqiang.collaboration;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.DefaultListCellRenderer;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextField;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;

import org.jivesoftware.smack.ChatManager;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.PacketListener;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.RosterGroup;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.filter.PacketFilter;
import org.jivesoftware.smack.filter.PacketTypeFilter;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.packet.Presence.Mode;
import org.jivesoftware.smack.packet.RosterPacket;
import org.jivesoftware.smack.util.StringUtils;
import org.yaoqiang.collaboration.dialog.CollaborationDialog;
import org.yaoqiang.collaboration.panels.RosterGroupPane;
import org.yaoqiang.collaboration.panels.VerticalFlowLayout;
import org.yaoqiang.dialog.WarningDialog;
import org.yaoqiang.util.Constants;
import org.yaoqiang.util.Encryptor;
import org.yaoqiang.util.Resources;
import org.yaoqiang.util.Utils;

/**
 * MainPanel
 * 
 * @author Shi Yaoqiang([email protected])
 */
public class MainPanel extends JPanel implements PacketListener {

	private static final long serialVersionUID = -746233381593187919L;

	protected static XMPPConnection connection;

	protected JSplitPane mainPane;

	protected RosterGroupPane selectedGroupPane;
	protected RosterEntry selectedEntry;

	protected JPanel rosterListPane = new JPanel();

	protected Map rosterGroups = new HashMap();

	protected Set requestJIDList = new HashSet();

	protected CollaborationDialog dialog;

	protected Map chatRooms = new HashMap();

	protected ChatManager chatManager;

	protected PacketFilter messageFilter = new PacketTypeFilter(Packet.class);

	protected JComboBox statusBox;
	protected JLabel account;
	protected static TextPanel jabberIdPanel;
	protected TextPanel passwordPanel;
	protected CheckboxPanel rememberPasswordPanel;
	protected ComboPanel serverPanel;
	protected JTextField serverAddress;

	protected CheckboxPanel autoLoginPanel;
	protected JComboBox loginStatusBox;
	protected JButton loginButton;

	protected Action loginAction = new AbstractAction("login") {
		private static final long serialVersionUID = 7531442215618957596L;

		public void actionPerformed(ActionEvent e) {
			loginButton.setEnabled(false);
			SwingUtilities.invokeLater(new Runnable() {
				public void run() {
					boolean success = login();
					if (success) {
						statusBox.setEnabled(true);
						statusBox.setSelectedIndex(loginStatusBox.getSelectedIndex());
						Utils.saveToConfigureFile("autoLogin", autoLoginPanel.isSelected() ? "1" : "0");
						Utils.saveToConfigureFile("jabberId", jabberIdPanel.getText());
						Utils.saveToConfigureFile("xmppServer", serverPanel.getSelectedItem().toString());
						Utils.saveToConfigureFile("xmppServerAddress", serverAddress.getText());
						if (rememberPasswordPanel.isSelected()) {
							Utils.saveToConfigureFile("pwd" + Encryptor.encrypt(jabberIdPanel.getText()), Encryptor.encrypt(passwordPanel.getText()));
						} else {
							Utils.removeConfigure("pwd" + Encryptor.encrypt(jabberIdPanel.getText()));
						}
						mainPane.setBottomComponent(createRosterPane());
						mainPane.setDividerLocation(45);
						buildRosterList();
					} else {

					}
				}
			});
		}
	};
	protected JPanel loginPanel;

	public MainPanel() {
		setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
		setBorder(BorderFactory.createTitledBorder(Resources.get("collaboration")));
		setMinimumSize(new Dimension(250, 500));
		setPreferredSize(new Dimension(250, 500));
		setMaximumSize(new Dimension(250, 500));

		dialog = new CollaborationDialog(this);

		account = new JLabel(Resources.get("notLoggedin"));
		statusBox = new JComboBox(new String[] { "online", "away", "busy", "invisible", "offline" });
		statusBox.setMaximumSize(new Dimension(45, 27));
		statusBox.setSelectedIndex(4);
		statusBox.setEnabled(false);
		statusBox.setRenderer(new DefaultListCellRenderer() {
			private static final long serialVersionUID = 6965999033448909940L;

			public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
				setIcon(new ImageIcon(MainPanel.class.getResource("/org/yaoqiang/collaboration/images/" + value + ".png")));
				setToolTipText(Resources.get(value.toString()));
				return this;
			}
		});
		statusBox.addActionListener(new AbstractAction("changeStatus") {
			private static final long serialVersionUID = 8463516976837545849L;

			public void actionPerformed(ActionEvent e) {
				SwingUtilities.invokeLater(new Runnable() {
					public void run() {
						if ("offline".equals(statusBox.getSelectedItem())) {
							account.setText(Resources.get("notLoggedin"));
							statusBox.setEnabled(false);
							loginButton.setEnabled(true);
							mainPane.setBottomComponent(loginPanel);
							mainPane.setDividerLocation(45);
							connection.disconnect();
							rosterListPane.removeAll();
						} else {
							Presence presence = new Presence(Presence.Type.available);
							Mode mode = Mode.available;
							if ("online".equals(statusBox.getSelectedItem())) {
								mode = Mode.available;
							} else if ("away".equals(statusBox.getSelectedItem())) {
								mode = Mode.away;
							} else if ("busy".equals(statusBox.getSelectedItem())) {
								mode = Mode.dnd;
							} else if ("invisible".equals(statusBox.getSelectedItem())) {
								presence = new Presence(Presence.Type.unavailable);
							}
							presence.setMode(mode);
							connection.sendPacket(presence);
						}
					}
				});
			}
		});
		JPanel accountPanel = new JPanel();
		accountPanel.setLayout(new BoxLayout(accountPanel, BoxLayout.X_AXIS));
		accountPanel.add(statusBox);
		accountPanel.add(Box.createHorizontalStrut(5));
		accountPanel.add(account);

		jabberIdPanel = new TextPanel(Resources.get("jabberId"), Constants.SETTINGS.getProperty("jabberId", ""));
		passwordPanel = new TextPanel(Resources.get("password"), Utils.getUserPassword(jabberIdPanel.getText()), true);

		serverAddress = new JTextField();
		Dimension textDim = new Dimension(200, 27);
		serverAddress.setMinimumSize(textDim);
		serverAddress.setMaximumSize(textDim);
		serverAddress.setPreferredSize(textDim);
		serverAddress.setHorizontalAlignment(JTextField.CENTER);
		serverAddress.setEnabled(false);
		serverAddress.setText("talk.google.com");

		List choices = new ArrayList();
		choices.add("Google Talk");
		choices.add("Gabbler.de");
		choices.add(Resources.get("otherXMPPServer"));
		serverPanel = new ComboPanel("server", choices, false, false, true);
		serverPanel.addActionListener(new AbstractAction("server") {
			private static final long serialVersionUID = -5617178924964235514L;

			public void actionPerformed(ActionEvent e) {
				String server = serverPanel.getSelectedItem().toString();
				if (Resources.get("otherXMPPServer").equals(server)) {
					serverAddress.setEnabled(true);
					serverAddress.setText(Constants.SETTINGS.getProperty("xmppServerAddress", ""));
				} else {
					serverAddress.setEnabled(false);
					if ("Google Talk".equals(server)) {
						serverAddress.setText("talk.google.com");
					} else if ("Jabber.org".equals(server)) {
						serverAddress.setText("jabber.org");
					} else if ("Gabbler.de".equals(server)) {
						serverAddress.setText("gabbler.de");
					}
				}
			}
		});
		serverPanel.setSelectedItem(Constants.SETTINGS.getProperty("xmppServer", "Google Talk"));
		rememberPasswordPanel = new CheckboxPanel(Resources.get("rememberPassword"));
		if (passwordPanel.getText().length() == 0) {
			rememberPasswordPanel.setSelected(false);
		} else {
			rememberPasswordPanel.setSelected(true);
		}
		autoLoginPanel = new CheckboxPanel(Resources.get("autoLogin"));
		if (rememberPasswordPanel.isSelected()) {
			autoLoginPanel.setSelected(Constants.SETTINGS.getProperty("autoLogin", "").equals("1"));
		} else {
			autoLoginPanel.setEnabled(false);
			autoLoginPanel.setSelected(false);
		}
		rememberPasswordPanel.addActionListener(new AbstractAction("rememberPassword") {
			private static final long serialVersionUID = -7268240816836427651L;

			public void actionPerformed(ActionEvent e) {
				if (rememberPasswordPanel.isSelected()) {
					autoLoginPanel.setEnabled(true);
				} else {
					autoLoginPanel.setEnabled(false);
					autoLoginPanel.setSelected(false);
				}
			}
		});
		loginButton = new JButton(Resources.get("login"));
		loginButton.addActionListener(loginAction);

		loginStatusBox = new JComboBox(new String[] { "online", "away", "busy", "invisible" });
		loginStatusBox.setRenderer(new DefaultListCellRenderer() {
			private static final long serialVersionUID = 5499544291833060088L;

			public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
				setIcon(new ImageIcon(MainPanel.class.getResource("/org/yaoqiang/collaboration/images/" + value + ".png")));
				setText(Resources.get(value.toString()));
				setToolTipText(Resources.get(value.toString()));
				return this;
			}
		});
		loginStatusBox.setSelectedItem(Constants.SETTINGS.getProperty("loginStatus", "online"));
		JPanel loginBtnPanel = new JPanel();
		loginBtnPanel.setLayout(new BoxLayout(loginBtnPanel, BoxLayout.X_AXIS));
		loginBtnPanel.add(loginStatusBox);
		loginBtnPanel.add(loginButton);

		JPanel buttonPanel = new JPanel();
		buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS));
		buttonPanel.add(rememberPasswordPanel);
		buttonPanel.add(autoLoginPanel);
		buttonPanel.add(loginBtnPanel);

		loginPanel = new JPanel();
		loginPanel.add(jabberIdPanel);
		loginPanel.add(passwordPanel);
		loginPanel.add(serverPanel);
		loginPanel.add(serverAddress);
		loginPanel.add(buttonPanel);

		mainPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, accountPanel, loginPanel) {
			private static final long serialVersionUID = 8521042854973349995L;

			private final int location = 45;

			public int getDividerLocation() {
				return location;
			}

			public int getLastDividerLocation() {
				return location;
			}
		};
		mainPane.setBorder(null);
		mainPane.setDividerSize(6);
		add(mainPane);

		if (autoLoginPanel.isSelected()) {
			SwingUtilities.invokeLater(new Runnable() {
				public void run() {
					loginAction.actionPerformed(new ActionEvent(this, 0, ""));
				}
			});
		}
	}

	private JPanel createRosterPane() {
		JPanel rosterPane = new JPanel();
		rosterPane.setLayout(new BorderLayout());

		JToolBar toolbar = new JToolBar();
		toolbar.setFloatable(false);
		toolbar.add(createToolbarButton(CollaborationActions.getAction(CollaborationActions.ADD_CONTACT)));
		toolbar.add(createToolbarButton(CollaborationActions.getAction(CollaborationActions.DELETE)));

		rosterListPane.setLayout(new VerticalFlowLayout(VerticalFlowLayout.TOP, 0, 0, true, false));
		JScrollPane rosterScrollPane = new JScrollPane(rosterListPane);
		rosterScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
		rosterScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

		rosterPane.add(toolbar, BorderLayout.NORTH);
		rosterPane.add(rosterScrollPane, BorderLayout.CENTER);
		return rosterPane;
	}

	private void buildRosterList() {
		rosterGroups.clear();
		RosterGroupPane group = null;
		Roster roster = connection.getRoster();
		for (RosterGroup g : roster.getGroups()) {
			group = addContactGroup(g.getName());
			for (RosterEntry entry : g.getEntries()) {
				if (entry.getStatus() == null) {
					group.addContactItem(entry);
				}
			}
		}
		group = addContactGroup("Ungrouped");
		for (RosterEntry entry : roster.getUnfiledEntries()) {
			if (entry.getStatus() == null) {
				group.addContactItem(entry);
			}
		}
	}

	private RosterGroupPane addContactGroup(String name) {
		RosterGroupPane group = new RosterGroupPane(this, name);
		rosterListPane.add(group);
		rosterGroups.put(name, group);
		return group;
	}

	protected JButton createToolbarButton(Action a) {
		String actionName = (String) a.getValue(Action.NAME);
		String toolTip = Resources.get(actionName);
		ImageIcon curIc = null;
		if ("addContact".equals(actionName)) {
			curIc = new ImageIcon(MainPanel.class.getResource("/org/yaoqiang/collaboration/images/add_contact.png"));
		} else if ("delete".equals(actionName)) {
			curIc = new ImageIcon(MainPanel.class.getResource("/org/yaoqiang/collaboration/images/delete.png"));
		}
		JButton b = new JButton(curIc);
		b.setName(actionName);
		b.addActionListener(a);
		b.setToolTipText(toolTip);
		return b;
	}

	public final class ChatRoomCloser extends WindowAdapter {
		private String name;

		public ChatRoomCloser(String name) {
			this.name = name;
		}

		public void windowClosing(WindowEvent e) {
			chatRooms.remove(name);
		}
	}

	public void showChatRoom(RosterEntry user) {
		ChatRoom chatRoom = chatRooms.get(user.getUser());
		if (chatRoom == null) {
			String title = user.getName();
			if (title == null || title.length() == 0) {
				title = user.getUser();
			}
			chatRoom = new ChatRoom(title, user.getUser());
			chatRoom.addWindowListener(new ChatRoomCloser(user.getUser()));
			chatRooms.put(user.getUser(), chatRoom);
		}
		if (!chatRoom.isVisible()) {
			chatRoom.setVisible(true);
		}
		chatRoom.setState(Frame.NORMAL);
		chatRoom.toFront();
	}

	private boolean login() {
		boolean success = false;
		ConnectionConfiguration connConfig = null;
		String server = serverAddress.getText().trim();
		String serviceName = null;
		if (server.lastIndexOf(".") == server.indexOf(".")) {
			serviceName = server;
		}
		connConfig = new ConnectionConfiguration(server, 5222, serviceName);
		connConfig.setCompressionEnabled(true);
		connConfig.setSendPresence(false);
		connection = new XMPPConnection(connConfig);

		try {
			connection.connect();
		} catch (XMPPException ex) {
			System.out.println("Failed to connect to " + connection.getHost());
			ex.printStackTrace();
			loginButton.setEnabled(true);
			JOptionPane.showMessageDialog(null, Resources.get("couldNotConnectToServer"), Resources.get("loginFailed"), JOptionPane.ERROR_MESSAGE);
			return success;
		}
		try {
			String user = jabberIdPanel.getText();
			if (user.lastIndexOf("@") == -1) {
				if ("talk.google.com".equals(server)) {
					user += "@gmail.com";
				}
			} else {
				if ("gabbler.de".equals(server)) {
					user = user.substring(0, user.lastIndexOf("@"));
				}
			}
			connection.login(user, passwordPanel.getText(), "Y-" + Constants.VERSION);
			System.out.println("Logged in as " + connection.getUser());
			account.setText(connection.getUser().substring(0, connection.getUser().lastIndexOf("/")));
			Utils.saveToConfigureFile("loginStatus", loginStatusBox.getSelectedItem().toString());
			if (!"invisible".equals(loginStatusBox.getSelectedItem())) {
				Presence presence = new Presence(Presence.Type.available);
				Mode mode = Mode.available;
				if ("busy".equals(loginStatusBox.getSelectedItem())) {
					mode = Mode.dnd;
				} else if ("away".equals(loginStatusBox.getSelectedItem())) {
					mode = Mode.away;
				}
				presence.setMode(mode);
				connection.sendPacket(presence);
			}
			chatManager = connection.getChatManager();
			connection.addPacketListener(this, null);
			connection.getRoster().setSubscriptionMode(Roster.SubscriptionMode.manual);
			success = true;
		} catch (XMPPException ex) {
			System.out.println("Failed to log in as " + jabberIdPanel.getText());
			loginButton.setEnabled(true);
			if (ex.getMessage().endsWith("not-authorized")) {
				JOptionPane.showMessageDialog(null, Resources.get("checkNameAndPassword"), Resources.get("loginFailed"), JOptionPane.ERROR_MESSAGE);
			}
		}

		return success;
	}

	public CollaborationDialog getDialog() {
		return dialog;
	}

	public CollaborationDialog createDialog() {
		return new CollaborationDialog(this);
	}

	public RosterGroupPane getSelectedGroupPane() {
		return selectedGroupPane;
	}

	public RosterEntry getSelectedEntry() {
		return selectedEntry;
	}

	public Map getRosterGroups() {
		return rosterGroups;
	}

	public Set getRequestJIDList() {
		return requestJIDList;
	}

	public void setSelectedContact(RosterGroupPane selectedGroupPane, RosterEntry selectedEntry) {
		this.selectedGroupPane = selectedGroupPane;
		this.selectedEntry = selectedEntry;
	}

	public JSplitPane getMainPane() {
		return mainPane;
	}

	public static XMPPConnection getConnection() {
		return connection;
	}

	public ChatManager getChatManager() {
		return chatManager;
	}

	public static String getLoginName() {
		return jabberIdPanel.getText();
	}

	public void processPacket(final Packet packet) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				if (packet instanceof Message && ((Message) packet).getBody() != null) {
					Message message = (Message) packet;
					String bareJID = StringUtils.parseBareAddress(message.getFrom());
					if (message.getType().equals(Message.Type.chat)) {
						createChatRoom(bareJID, message);
					}
				} else if (packet instanceof Presence) {
					Presence presence = (Presence) packet;
					String bareJID = StringUtils.parseBareAddress(presence.getFrom());
					if (Presence.Type.subscribe.equals(presence.getType())) {
						int o = JOptionPane.NO_OPTION;
						o = JOptionPane.showConfirmDialog(null, Resources.get("allow") + " " + bareJID + " " + Resources.get("addYouToContactList"),
								Resources.get("subscriptionRequest"), JOptionPane.YES_NO_OPTION);
						if (o == JOptionPane.YES_OPTION) {
							Presence response = new Presence(Presence.Type.subscribed);
							response.setTo(presence.getFrom());
							connection.sendPacket(response);
							Presence presencePacket = new Presence(Presence.Type.subscribe);
					        presencePacket.setTo(presence.getFrom());
					        connection.sendPacket(presencePacket);
						} else {
							Presence response = new Presence(Presence.Type.unsubscribed);
							response.setTo(presence.getFrom());
							connection.sendPacket(response);
						}
					} else if (Presence.Type.subscribed.equals(presence.getType())) {
						if (Constants.SETTINGS.getProperty("infoContactItemAdded", "1").equals("1")) {
							new WarningDialog("jidadded: " + bareJID).setVisible(true);
						}
						RosterEntry entry = connection.getRoster().getEntry(bareJID);
						RosterGroupPane groupPane = null;
						for (RosterGroup group : entry.getGroups()) {
							groupPane = rosterGroups.get(group.getName());
							if (groupPane == null) {
								groupPane = addContactGroup(group.getName());
							}
							groupPane.addContactItem(entry);
						}
						if (groupPane == null) {
							rosterGroups.get("Ungrouped").addContactItem(entry);
						}
					} else if (Presence.Type.unsubscribed.equals(presence.getType())) {
						RosterEntry entry = connection.getRoster().getEntry(bareJID);
						if (entry != null) {
							RosterGroupPane groupPane = null;
							for (RosterGroup group : entry.getGroups()) {
								groupPane = rosterGroups.get(group.getName());
								if (groupPane != null) {
									groupPane.removeContactItem(entry);
								}
							}
							if (groupPane == null) {
								rosterGroups.get("Ungrouped").removeContactItem(entry);
							}
							try {
								connection.getRoster().removeEntry(entry);
							} catch (XMPPException e1) {
								e1.printStackTrace();
							}
						}
					} else if (Presence.Type.unsubscribe.equals(presence.getType())) {
						if (Constants.SETTINGS.getProperty("infoContactItemRemoved", "1").equals("1")) {
							new WarningDialog("jidremoved: " + bareJID).setVisible(true);
						}
						RosterEntry entry = connection.getRoster().getEntry(bareJID);
						if (entry != null) {
							RosterGroupPane groupPane = null;
							for (RosterGroup group : entry.getGroups()) {
								groupPane = rosterGroups.get(group.getName());
								if (groupPane != null) {
									groupPane.removeContactItem(entry);
								}
							}
							if (groupPane == null) {
								rosterGroups.get("Ungrouped").removeContactItem(entry);
							}
							try {
								connection.getRoster().removeEntry(entry);
							} catch (XMPPException e) {
								e.printStackTrace();
							}
						}
					}
					System.out.println("Presence: " + presence.toXML());
				} else if (packet instanceof RosterPacket) {
					System.out.println("RosterPacket: " + packet.toXML());
				} else {
					System.out.println("Other: " + packet.toXML());
				}
			}
		});
	}

	private void createChatRoom(String bareJID, Message message) {
		ChatRoom chatRoom = chatRooms.get(bareJID);
		if (chatRoom == null) {
			chatRoom = new ChatRoom(bareJID);
			chatRoom.addWindowListener(new ChatRoomCloser(bareJID));
			chatRooms.put(bareJID, chatRoom);
		}
		chatRoom.insertMessage(message);
		if (!chatRoom.isVisible()) {
			chatRoom.setVisible(true);
		}
		chatRoom.setState(Frame.NORMAL);
		chatRoom.toFront();
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy