/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.kapti.administration; import com.kapti.client.user.User; import com.kapti.client.user.UserFactory; import com.kapti.administration.tablemodels.UsersTableModel; import com.kapti.exceptions.StockPlayException; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.List; import java.util.ResourceBundle; import java.util.concurrent.ExecutionException; import java.util.regex.Pattern; import javax.swing.*; import javax.swing.event.*; import javax.swing.table.TableColumn; import javax.swing.table.TableModel; import org.apache.log4j.Logger; import org.jdesktop.swingx.JXErrorPane; import org.jdesktop.swingx.JXTable; import org.jdesktop.swingx.decorator.HighlighterFactory; import org.jdesktop.swingx.error.ErrorInfo; /** * * @author Thijs */ public class UsersListPanel extends JPanel implements TableModelListener, ListSelectionListener, ActionListener { private static final String REFRESH_ACTION = "REFRESH"; private static final String EDIT_USER_ACTION = "EDIT_USER"; private static final String CREATE_USER_ACTION = "CREATE_USER"; private static final String DELETE_USER_ACTION = "DELETE_USER"; private static Logger logger = Logger.getLogger(UsersListPanel.class); private UserFactory usersFactory = UserFactory.getInstance(); private static UsersListPanel instance = new UsersListPanel(); private final ResourceBundle translations = ResourceBundle.getBundle("com/kapti/administration/translations"); private JLabel selectedLabel = new JLabel(translations.getString("SELECTED_USERS_COUNT") + " 0"); private JLabel titleLabel = new JLabel(translations.getString("OVERVIEW")); private JXTable usersTable = null; private UsersTableModel usersTableModel = null; private JButton refreshButton = new JButton(translations.getString("REFRESH")); private JButton createUser = new JButton(translations.getString("CREATE_USER")); private JButton editUser = new JButton(translations.getString("EDIT_USER")); private JButton deleteUser = new JButton(translations.getString("DELETE_USER")); //filtering private NicknameRowFilter nicknameRowFilter = null; private RegTimeRowFilter regTimeRowFilter = null; private StringRowFilter stringRowFilter = null; private JLabel searchLabel = new JLabel(translations.getString("SEARCH_USER")); private JTextField searchField = new JTextField(); public static UsersListPanel getInstance() { return instance; } private UsersListPanel() { setLayout(new BorderLayout()); setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); titleLabel.setFont(titleLabel.getFont().deriveFont(Font.BOLD, 30)); add(titleLabel, BorderLayout.NORTH); //We stellen hier onze securities-JXTable in usersTableModel = new UsersTableModel(); usersTable = new JXTable(usersTableModel); usersTable.setColumnControlVisible(true); usersTable.setShowGrid(false, false); usersTable.setHighlighters(HighlighterFactory.createAlternateStriping()); usersTable.setAutoCreateRowSorter(true); usersTable.setAutoResizeMode(JXTable.AUTO_RESIZE_OFF); usersTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); usersTable.getSelectionModel().addListSelectionListener(this); usersTableModel.addTableModelListener(this); //we passen nog enkele weergave-dingen aan TableColumn roleColumn = usersTable.getColumn(5); JComboBox rolesComboBox = new JComboBox(User.Role.values()); roleColumn.setCellEditor(new DefaultCellEditor(rolesComboBox)); JScrollPane usersTableScrollPane = new JScrollPane(usersTable); usersTableScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); add(usersTableScrollPane, BorderLayout.CENTER); //de onderste balk add(new UsersListActionPanel(), BorderLayout.SOUTH); //we stellen de acties in refreshButton.setActionCommand(REFRESH_ACTION); refreshButton.addActionListener(this); createUser.setActionCommand(CREATE_USER_ACTION); createUser.addActionListener(this); editUser.setEnabled(false); editUser.setActionCommand(EDIT_USER_ACTION); editUser.addActionListener(this); deleteUser.setEnabled(false); deleteUser.setActionCommand(DELETE_USER_ACTION); deleteUser.addActionListener(this); //we laden hier onze gegevens in fetchUsersTable(); } private void fetchUsersTable() { SwingWorker<Collection<User>, Void> worker = new SwingWorker<Collection<User>, Void>() { @Override protected Collection<User> doInBackground() throws Exception { return UserFactory.getInstance().getAllUsersWithDetails(); } @Override protected void done() { try { usersTableModel.setUsers(get()); usersTableModel.fireTableDataChanged(); } catch (InterruptedException ex) { JXErrorPane.showDialog(new Exception(translations.getString("ERROR_FETCH_USERS_THREAD"), ex)); } catch (ExecutionException ex) { JXErrorPane.showDialog(new Exception(translations.getString("ERROR_FETCH_USERS_EXECUTION_EXCEPTION"), ex)); } } }; worker.execute(); } public void filterByNickname(String nicknameFilter, String friendlyName) { if (nicknameFilter != null) { regTimeRowFilter = null; nicknameRowFilter = new NicknameRowFilter(nicknameFilter, friendlyName); } else { nicknameRowFilter = null; } updateFilters(); } public void resetFilters() { nicknameRowFilter = null; regTimeRowFilter = null; searchField.setText(""); updateFilters(); } private class NicknameRowFilter extends javax.swing.RowFilter<TableModel, Integer> { private Pattern nicknameFilterPattern; private String friendlyName = ""; public NicknameRowFilter(String nicknameFilter, String friendlyName) { nicknameFilterPattern = Pattern.compile(nicknameFilter); this.friendlyName = friendlyName; } public String getFriendlyName() { return friendlyName; } @Override public boolean include(Entry<? extends TableModel, ? extends Integer> entry) { UsersTableModel model = (UsersTableModel) entry.getModel(); User u = model.getUserAt(entry.getIdentifier()); return nicknameFilterPattern.matcher(u.getNickname()).matches(); } } public void filterByRegtime(long period, String friendlyName) { if (period > 0) { nicknameRowFilter = null; regTimeRowFilter = new RegTimeRowFilter(period, friendlyName); } else { regTimeRowFilter = null; } updateFilters(); } private class RegTimeRowFilter extends javax.swing.RowFilter<TableModel, Integer> { private long period; private String friendlyName = ""; public RegTimeRowFilter(long period, String friendlyName) { this.period = period; this.friendlyName = friendlyName; } public String getFriendlyName() { return friendlyName; } @Override public boolean include(Entry<? extends TableModel, ? extends Integer> entry) { UsersTableModel model = (UsersTableModel) entry.getModel(); User u = model.getUserAt(entry.getIdentifier()); return Calendar.getInstance().getTime().getTime() - u.getRegdate().getTime() <= period; } } private class StringRowFilter extends javax.swing.RowFilter<TableModel, Integer> { private String str; public StringRowFilter(String str) { this.str = str; } @Override public boolean include(Entry<? extends TableModel, ? extends Integer> entry) { UsersTableModel model = (UsersTableModel) entry.getModel(); User u = model.getUserAt(entry.getIdentifier()); Pattern p = Pattern.compile(str + ".*", Pattern.CASE_INSENSITIVE); if (p.matcher(u.getFirstname()).matches()) { return true; } if (p.matcher(u.getLastname()).matches()) { return true; } if (p.matcher(u.getNickname()).matches()) { return true; } if (p.matcher(u.getEmail()).matches()) { return true; } if (p.matcher(u.getRijksregisternummer().toString()).matches()) { return true; } return false; } } private void updateFilters() { List<RowFilter<TableModel, Integer>> filters = new ArrayList<RowFilter<TableModel, Integer>>(); String title = translations.getString("OVERVIEW"); if (nicknameRowFilter != null) { filters.add(nicknameRowFilter); title = translations.getString("USER_NICKNAME_FILTER") + " '" + nicknameRowFilter.getFriendlyName() + "'"; } if (regTimeRowFilter != null) { filters.add(regTimeRowFilter); title = translations.getString("USER_REGTIME_FILTER") + " '" + regTimeRowFilter.getFriendlyName() + "'"; } if (stringRowFilter != null) { filters.add(stringRowFilter); title = title.concat(" " + translations.getString("FILTERED")); } if (!filters.isEmpty()) { RowFilter<TableModel, Integer> comboFilter = RowFilter.andFilter(filters); usersTable.setRowFilter(comboFilter); } else { usersTable.setRowFilter(null); } titleLabel.setText(title); } public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals(REFRESH_ACTION)) { fetchUsersTable(); } else if (e.getActionCommand().equals(CREATE_USER_ACTION)) { User newUser = usersFactory.createUser(); EditUserDialog editDialog = new EditUserDialog((JFrame) this.getTopLevelAncestor(), newUser, translations.getString("NEW_USER_TITLE"), true); editDialog.setVisible(true); editDialog.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { EditUserDialog editDialog = (EditUserDialog) e.getSource(); if (editDialog.isSuccess()) { usersTableModel.addUser(editDialog.getUser()); } } }); } else if (e.getActionCommand().equals(EDIT_USER_ACTION)) { for (int rownr : usersTable.getSelectedRows()) { int realrownr = usersTable.convertRowIndexToModel(rownr); EditUserDialog editFrame = new EditUserDialog((JFrame) this.getTopLevelAncestor(), usersTableModel.getUserAt(realrownr), String.format(translations.getString("EDIT_USER_TITLE"), usersTableModel.getUserAt(realrownr).getId())); editFrame.setVisible(true); editFrame.addActionListener(new EditUserFinishedActionListener(realrownr, editFrame)); } } else if (e.getActionCommand().equals(DELETE_USER_ACTION)) { //we stellen eerst de vraag op String question = ""; if (usersTable.getSelectedRowCount() > 1) { String selectedUsers = ""; for (int rownr : usersTable.getSelectedRows()) { int realrownr = usersTable.convertRowIndexToModel(rownr); User user = usersTableModel.getUserAt(realrownr); selectedUsers += user.getNickname() + " (ID: " + user.getId() + "), "; } selectedUsers = selectedUsers.substring(0, selectedUsers.length() - 2); question = String.format(translations.getString("CONFIRM_USERS_DELETION"), selectedUsers); } else { User user = usersTableModel.getUserAt(usersTable.convertRowIndexToModel(usersTable.getSelectedRow())); question = String.format(translations.getString("CONFIRM_USER_DELETION"), user.getNickname() + " (ID: " + user.getId() + ")"); } if (JOptionPane.showConfirmDialog(this, question, translations.getString("CONFIRM_USER_DELETION_TITLE"), JOptionPane.YES_NO_CANCEL_OPTION) == JOptionPane.YES_OPTION) { for (int rownr : usersTable.getSelectedRows()) { try { usersFactory.removeUser(usersTableModel.getUserAt(rownr)); usersTableModel.removeUserAt(rownr); } catch (StockPlayException ex) { JXErrorPane.showDialog(this, new ErrorInfo(translations.getString("ERROR"), translations.getString("ERROR_DELETING_USER"), null, null, ex, null, null)); } } } } } private class EditUserFinishedActionListener implements ActionListener{ int rownr; EditUserDialog dialog; public EditUserFinishedActionListener(int rownr, EditUserDialog dialog) { this.rownr = rownr; this.dialog = dialog; } public void actionPerformed(ActionEvent e) { usersTableModel.setUserAt(rownr, dialog.getUser()); } } public void tableChanged(TableModelEvent e) { checkButtons(); } public void valueChanged(ListSelectionEvent e) { selectedLabel.setText(translations.getString("SELECTED_USERS_COUNT") + " " + usersTable.getSelectedRowCount()); checkButtons(); } private void checkButtons() { editUser.setEnabled(usersTable.getSelectedRowCount() > 0); deleteUser.setEnabled(usersTable.getSelectedRowCount() > 0); } private class UsersListActionPanel extends JPanel { public UsersListActionPanel() { setLayout(new BorderLayout()); add(new JPanel() { { setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); add(selectedLabel); add(Box.createHorizontalGlue()); add(createUser); add(editUser); add(deleteUser); } }, BorderLayout.NORTH); add(new JPanel() { { setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); add(searchLabel); add(searchField); add(Box.createHorizontalStrut(300)); add(Box.createHorizontalGlue()); add(refreshButton); } }, BorderLayout.SOUTH); } } }