package de.uni_passau.fim.pkjab.view;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Iterator;
import java.util.TreeSet;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.border.BevelBorder;
import de.uni_passau.fim.pkjab.model.Connection;
import de.uni_passau.fim.pkjab.model.Contact;
import de.uni_passau.fim.pkjab.model.messages.Message;
import de.uni_passau.fim.pkjab.util.Jid;
import de.uni_passau.fim.pkjab.util.Observer;
import de.uni_passau.fim.pkjab.util.UserState;
public class PKjab extends JFrame implements Observer {
private static final String APP_NAME = "PKjab";
private Connection connection;
private final String user;
private JPanel viewport;
private final JPanel bottomPanel = new JPanel();
private JComboBox stateCombo;
private JButton menuButton;
private static final String ICON_ONLINE = PKjabToolkit.ICON_DIR + "user_online.png";
private static final String ICON_OFFLINE = PKjabToolkit.ICON_DIR + "user_offline.png";
private static final String ICON_AWAY = PKjabToolkit.ICON_DIR + "user_away.png";
private static final String ICON_XA = PKjabToolkit.ICON_DIR + "user_xa.png";
private static final String ICON_DND = PKjabToolkit.ICON_DIR + "user_dnd.png";
private static final String ICON_CHAT = PKjabToolkit.ICON_DIR + "user_online.png";
private static final String INPUT_JID = "Geben Sie die JID ein: ";
private static final String ENTER_USERDATA = "Benutzerdaten";
private static final String CMD_ADDCONTACT = "<html>Kontakt hinzufügen</html>";
private static final String MENU_BUTTON = "<html>Menü</html>";
private static final String CMD_EXIT = "<html>Beenden</html>";
protected final TreeSet contactPanels = new TreeSet();
public PKjab(final String user, final String domain, final String password) {
super(APP_NAME + ": " + user);
connection = new Connection(new Jid(user, domain, APP_NAME), password);
this.user = user;
readStatusIcons();
setupGui();
update((Message) null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setPreferredSize(new Dimension(200, 400));
pack();
setVisible(true);
connection.attach(this);
}
private void readStatusIcons() {
HashMap statusIcons = PKjabToolkit.getStatusIcons();
statusIcons.put(UserState.ONLINE, PKjabToolkit.getImageIcon(ICON_ONLINE));
statusIcons.put(UserState.OFFLINE, PKjabToolkit.getImageIcon(ICON_OFFLINE));
statusIcons.put(UserState.AWAY, PKjabToolkit.getImageIcon(ICON_AWAY));
statusIcons.put(UserState.XA, PKjabToolkit.getImageIcon(ICON_XA));
statusIcons.put(UserState.DND, PKjabToolkit.getImageIcon(ICON_DND));
statusIcons.put(UserState.CHAT, PKjabToolkit.getImageIcon(ICON_CHAT));
}
private void setupGui() {
JPanel contentPane = new JPanel();
contentPane.setLayout(new BorderLayout());
setContentPane(contentPane);
createStateCombo();
createMenu();
createScrollPane();
createBottomPanel();
getContentPane().add(bottomPanel, BorderLayout.PAGE_END);
}
private void createStateCombo() {
UserState[] items = new UserState[6];
items[0] = UserState.ONLINE;
items[1] = UserState.AWAY;
items[2] = UserState.XA;
items[3] = UserState.DND;
items[4] = UserState.CHAT;
items[5] = UserState.OFFLINE;
stateCombo = new JComboBox(items);
stateCombo.setSelectedItem(connection.getUserState());
stateCombo.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
connection.setUserState((UserState) stateCombo.getSelectedItem(), null);
}
});
}
private void createMenu() {
final JPopupMenu menu = new JPopupMenu();
JMenuItem item;
/* item = new JMenuItem(CMD_ADDCONTACT);
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String jid = showInputDialog(INPUT_JID, CMD_ADDCONTACT);
System.out.println(jid);
}
});
menu.add(item);
menu.addSeparator();
*/
item = new JMenuItem(CMD_EXIT);
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
connection.disconnect();
System.exit(0);
}
});
menu.add(item);
menuButton = new JButton(MENU_BUTTON);
menuButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
menu.show(menuButton, 0, menuButton.getHeight());
}
});
}
private void createScrollPane() {
viewport = new JPanel();
viewport.setLayout(new BoxLayout(viewport, BoxLayout.Y_AXIS));
getContentPane().add(
new JScrollPane(viewport,
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER),
BorderLayout.PAGE_START);
}
private void createBottomPanel() {
bottomPanel.setLayout(new BorderLayout());
bottomPanel.setBorder(BorderFactory
.createBevelBorder(BevelBorder.LOWERED));
bottomPanel.add(menuButton, BorderLayout.LINE_START);
bottomPanel.add(new JPanel(), BorderLayout.CENTER);
bottomPanel.add(stateCombo, BorderLayout.LINE_END);
}
private String showInputDialog(String message, String title) {
return JOptionPane.showInputDialog(this, message,
title, JOptionPane.PLAIN_MESSAGE);
}
public void update(Message msg) {
//System.out.println("update");
stateCombo.setSelectedItem(connection.getUserState());
setIconImage(((ImageIcon) PKjabToolkit
.getStatusIcons()
.get(connection.getUserState()))
.getImage());
viewport.removeAll();
Iterator it = connection.getRoster().getContacts().iterator();
for (; it.hasNext();) {
Contact contact = (Contact) it.next();
if (!contactPanels.add(contact)) {
viewport.add(new ContactPanel(contact, user));
}
}
getContentPane().validate();
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
PKjabToolkit.setupUI();
StartupDialog dialog = new StartupDialog(null,
APP_NAME + " - " + ENTER_USERDATA,
true);
if (dialog.getUser() == null
|| dialog.getUser().equalsIgnoreCase(""))
new PKjab("pkjab", "jabber.ccc.de", "pkjab");
else
new PKjab(dialog.getUser(), dialog.getDomain(), dialog.getPassword());
}
});
}
}