
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.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