
org.yaoqiang.collaboration.MainPanel Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of yaoqiang-bpmn-editor Show documentation
Show all versions of yaoqiang-bpmn-editor Show documentation
an Open Source BPMN 2.0 Modeler
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