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

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

There is a newer version: 2.2.18
Show newest version
package org.yaoqiang.collaboration;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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.JToolBar;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;

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.util.StringUtils;
import org.yaoqiang.collaboration.dialog.CollaborationDialog;
import org.yaoqiang.graph.util.Constants;
import org.yaoqiang.graph.util.Encryptor;
import org.yaoqiang.graph.util.Utils;

import com.mxgraph.util.mxResources;

/**
 * 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 JTree rosterTree;

	protected CollaborationDialog dialog;

	protected Map chatRooms = new HashMap();

	protected ChatManager chatManager;

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

	protected JComboBox statusBox;
	protected JLabel account;
	protected static TextPanel jabberIdPanel;
	protected TextPanel passwordPanel;
	protected CheckboxPanel rememberPasswordPanel;
	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());
						account.setText(jabberIdPanel.getText());
						Utils.saveToConfigureFile("autoLogin", autoLoginPanel.isSelected() ? "1" : "0");
						Utils.saveToConfigureFile("jabberId", jabberIdPanel.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);
					} else {

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

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

		dialog = new CollaborationDialog(this);

		account = new JLabel(mxResources.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(mxResources.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(mxResources.get("notLoggedin"));
							statusBox.setEnabled(false);
							loginButton.setEnabled(true);
							mainPane.setBottomComponent(loginPanel);
							mainPane.setDividerLocation(45);
							connection.disconnect();
						} 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(mxResources.get("jabberId"), Constants.SETTINGS.getProperty("jabberId", ""));
		passwordPanel = new TextPanel(mxResources.get("password"), Utils.getUserPassword(jabberIdPanel.getText()), true);
		rememberPasswordPanel = new CheckboxPanel(mxResources.get("rememberPassword"));
		if (passwordPanel.getText().length() == 0) {
			rememberPasswordPanel.setSelected(false);
		} else {
			rememberPasswordPanel.setSelected(true);
		}
		autoLoginPanel = new CheckboxPanel(mxResources.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(mxResources.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(mxResources.get(value.toString()));
				setToolTipText(mxResources.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(new JLabel(mxResources.get("supportGTalkOnly")));
		loginPanel.add(jabberIdPanel);
		loginPanel.add(new JLabel(mxResources.get("sampleAccount")));
		loginPanel.add(passwordPanel);
		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, ""));
				}
			});
		}
	}

	public void recreateRosterList() {
		mainPane.setBottomComponent(createRosterPane());
	}

	public JPanel createRosterPane() {
		JPanel rosterPane = new JPanel();
		rosterPane.setLayout(new BorderLayout());
		rosterPane.add(createRosterToolbar(), BorderLayout.NORTH);
		rosterPane.add(createRosterList(), BorderLayout.CENTER);
		return rosterPane;
	}

	private JScrollPane createRosterList() {
		rosterTree = new JTree(createRosterEntryList().toArray());
		rosterTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
		rosterTree.setCellRenderer(new ContactTreeCellRenderer());
		rosterTree.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent me) {
				int xClick = me.getX();
				int yClick = me.getY();
				TreePath path = rosterTree.getPathForLocation(xClick, yClick);

				if (path != null) {
					rosterTree.setAnchorSelectionPath(path);
					if (me.getClickCount() > 1 && !SwingUtilities.isRightMouseButton(me)) {
						RosterEntry user = (RosterEntry) ((DefaultMutableTreeNode) path.getLastPathComponent()).getUserObject();
						showChatRoom(user);
					} else if (SwingUtilities.isRightMouseButton(me)) {
						if (!rosterTree.isPathSelected(path)) {
							rosterTree.setSelectionPath(path);
						}
					}
				} else {
					TreePath close = rosterTree.getClosestPathForLocation(xClick, yClick);
					Rectangle rect = rosterTree.getPathBounds(close);
					if (rosterTree.getSelectionPath() != close || rect == null || !(rect.y < yClick && rect.y + rect.height > yClick)) {
						rosterTree.clearSelection();
					}
				}

				rosterTree.getParent().requestFocus();
			}
		});
		JScrollPane rosterPane = new JScrollPane(rosterTree);
		rosterPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
		rosterPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		return rosterPane;
	}

	public List createRosterEntryList() {
		List rosterEntryList = new ArrayList();
		Roster roster = connection.getRoster();
		for (RosterGroup group : roster.getGroups()) {
			for (RosterEntry entry : group.getEntries()) {
				rosterEntryList.add(entry);
			}
		}
		for (RosterEntry entry : roster.getUnfiledEntries()) {
			rosterEntryList.add(entry);
		}
		return rosterEntryList;
	}

	private JToolBar createRosterToolbar() {
		JToolBar toolbar = new JToolBar();
		toolbar.setFloatable(false);
		toolbar.add(createToolbarButton(CollaborationActions.getAction(CollaborationActions.ADD_CONTACT)));
		toolbar.add(createToolbarButton(CollaborationActions.getAction(CollaborationActions.DELETE)));
		return toolbar;
	}

	protected JButton createToolbarButton(Action a) {
		String actionName = (String) a.getValue(Action.NAME);
		String toolTip = mxResources.get(actionName);
		ImageIcon curIc = null;
		if ("addContact".equals(actionName)) {
			curIc = new ImageIcon(MainPanel.class.getResource("/org/yaoqiang/collaboration/images/add_contact.png"));
		} else if ("addGroup".equals(actionName)) {
			curIc = new ImageIcon(MainPanel.class.getResource("/org/yaoqiang/collaboration/images/add_group.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);
		}
	}

	private 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 = new ConnectionConfiguration("talk.google.com", 5222, "gmail.com");
		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, mxResources.get("couldNotConnectToServer"), mxResources.get("loginFailed"), JOptionPane.ERROR_MESSAGE);
			return success;
		}
		try {
			connection.login(jabberIdPanel.getText(), passwordPanel.getText(), "Y-" + Constants.VERSION);
			System.out.println("Logged in as " + connection.getUser());
			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, messageFilter);
			success = true;
		} catch (XMPPException ex) {
			System.out.println("Failed to log in as " + jabberIdPanel.getText());
			ex.printStackTrace();
			loginButton.setEnabled(true);
			if (ex.getMessage().endsWith("not-authorized")) {
				JOptionPane.showMessageDialog(null, mxResources.get("checkNameAndPassword"), mxResources.get("loginFailed"), JOptionPane.ERROR_MESSAGE);
			}
		}

		return success;
	}

	public CollaborationDialog getDialog() {
		return dialog;
	}

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

	public JTree getRosterTree() {
		return rosterTree;
	}

	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);
					}
				}
			}
		});
	}

	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