package no.ntnu.fp.gui; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.util.ArrayList; import java.util.List; import javax.swing.AbstractAction; import javax.swing.DefaultListSelectionModel; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.ListModel; import javax.swing.ListSelectionModel; import javax.swing.border.EmptyBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import no.ntnu.fp.model.User; import no.ntnu.fp.net.network.client.CommunicationController; public class UserListPanel extends JFrame implements ListSelectionListener { public static final String FRAME_TITLE = "Brukere"; public static final String OK_BUTTON_LABEL = "Ok"; public static final String CANCEL_BUTTON_LABEL = "Cancel"; private ListModel listModel; private ListSelectionModel selectionModel; private JButton okButton; private JButton cancelButton; private CommunicationController communication = CommunicationController.getInstance(); private JList list; public UserListPanel() { JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); JLabel titleLabel = new JLabel(FRAME_TITLE); titleLabel.setFont(StylingDefinition.FRAME_TITLE_FONT); titleLabel.setBorder(new EmptyBorder(10, 10, 10, 10)); panel.add(titleLabel, BorderLayout.NORTH); listModel = new UserListModel(); list = new JList(listModel); list.setCellRenderer(new UserListCellRenderer()); selectionModel = list.getSelectionModel(); //selectionModel = new UserListSelectionModel(); //list.setSelectionModel(selectionModel); selectionModel.addListSelectionListener(this); panel.add(list, BorderLayout.CENTER); initSelection(); JPanel buttons = new JPanel(); okButton = new JButton(OK_BUTTON_LABEL); okButton.addActionListener(new OkButtonAction()); buttons.add(okButton); cancelButton = new JButton(CANCEL_BUTTON_LABEL); cancelButton.addActionListener(new CancelButtonAction()); buttons.add(cancelButton); panel.add(buttons, BorderLayout.SOUTH); setContentPane(panel); setDefaultCloseOperation(DISPOSE_ON_CLOSE); pack(); setLocationRelativeTo(null); setVisible(true); } private void initSelection() { List<User> users = communication.getSelectedUsers(); for(int i=0; i<listModel.getSize(); i++) { User user = (User)listModel.getElementAt(i); if (users.contains(user)) { list.setSelectedIndex(i); } } } @Override public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { int index = selectionModel.getAnchorSelectionIndex(); User user = (User)listModel.getElementAt(index); if (selectionModel.isSelectedIndex(index)) { communication.addSelectedUser(user); } else { communication.removeSelectedUser(user); System.out.println(user.getName()); } } } /*private class UserListSelectionModel extends DefaultListSelectionModel { @Override public void setSelectionInterval(int index0, int index1) { if (super.isSelectedIndex(index0)) { super.removeIndexInterval(index0, index1); } else { super.addSelectionInterval(index0, index1); } } }*/ private class OkButtonAction extends AbstractAction { private List<User> cachedUsers = new ArrayList<User>(); public OkButtonAction() { for (User user : communication.getSelectedUsers()) { cachedUsers.add(user); } } @Override public void actionPerformed(ActionEvent e) { for (User user : communication.getSelectedUsers()) { if (!cachedUsers.contains(user)) { System.out.println(user.getUsername()); User fullUser = communication.getFullUser(user.getUsername()); communication.addFullUser(fullUser); } } for (User user : cachedUsers) { System.out.println("user:"+user.getName()); if (!communication.getSelectedUsers().contains(user)) { System.out.println("not:"+user.getName()); communication.cancelView(user.getUsername()); } } dispose(); } } private class CancelButtonAction extends AbstractAction { private List<User> cachedUsers = new ArrayList<User>(); public CancelButtonAction() { for (User user : communication.getSelectedUsers()) { cachedUsers.add(user); } } @Override public void actionPerformed(ActionEvent e) { for (User user : communication.getSelectedUsers()) { System.out.println(user.getName()); if (!cachedUsers.contains(user)) { System.out.println(user.getName()); communication.removeSelectedUser(user); } } dispose(); } } }