package com.bagri.tools.vvm.ui;
import javax.swing.*;
import com.bagri.tools.vvm.event.*;
import com.bagri.tools.vvm.model.*;
import com.bagri.tools.vvm.service.ServiceException;
import com.bagri.tools.vvm.service.UserManagementService;
import com.bagri.tools.vvm.util.ErrorUtil;
import static com.bagri.tools.vvm.util.Icons.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;
import java.util.logging.Logger;
public class UserManagementPanel extends JPanel {
private static final Logger LOGGER = Logger.getLogger(UserManagementPanel.class.getName());
private final UserManagementService userService;
private final EventBus<ApplicationEvent> eventBus;
private XTable grid;
private JToolBar toolBar;
private JTabbedPane tabbedPane;
public UserManagementPanel(UserManagementService service, EventBus<ApplicationEvent> bus) {
super(new GridLayout(1, 1));
this.userService = service;
this.eventBus = bus;
tabbedPane = new JTabbedPane();
tabbedPane.addTab(UserManagement.USER_MANAGEMENT, createMainPanel());
add(tabbedPane);
tabbedPane.setBorder(BorderFactory.createEmptyBorder());
setBorder(BorderFactory.createEmptyBorder());
}
private JPanel createMainPanel() {
JPanel panel = new JPanel(new BorderLayout());
toolBar = new JToolBar();
// "Add User" button
JButton addUser = new JButton("Add");
addUser.setToolTipText("Adds new user");
addUser.setIcon(ADD_ICON);
addUser.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
onAdd();
}
});
toolBar.add(addUser);
toolBar.addSeparator();
// "Delete User" button
JButton deleteUser = new JButton("Delete");
deleteUser.setToolTipText("Deletes selected user");
deleteUser.setIcon(DELETE_ICON);
deleteUser.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
onDelete();
}
});
toolBar.add(deleteUser);
toolBar.addSeparator();
// "Activate User" button
JButton activateUser = new JButton("Activate");
activateUser.setToolTipText("Activates/Deactivates user");
activateUser.setIcon(EDIT_ICON);
activateUser.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
onActivate();
}
});
toolBar.add(activateUser);
toolBar.addSeparator();
// "Change User Password" button
JButton changePass = new JButton("Change Password");
changePass.setToolTipText("Change user password");
changePass.setIcon(EDIT_ICON);
changePass.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
onChangePass();
}
});
toolBar.add(changePass);
toolBar.setRollover(true);
toolBar.addSeparator();
// disable dragging
toolBar.setFloatable(false);
panel.add(toolBar, BorderLayout.PAGE_START);
// Column configs
ArrayList<ColumnConfig> configs = new ArrayList<ColumnConfig>();
ColumnConfig c = new ColumnConfig();
c.setHeader("User name");
c.setColumnClass(String.class);
c.setWidth(40);
c.setResizable(true);
configs.add(c);
c = new ColumnConfig();
c.setHeader("Active");
c.setColumnClass(Boolean.class);
c.setFixedWidth(45);
configs.add(c);
grid = new XTable(configs, new GridDataLoader() {
@Override
public List<GridRow> loadData() {
List<User> users;
try {
users = userService.getUsers();
} catch (ServiceException e) {
ErrorUtil.showError(UserManagementPanel.this, e);
return null;
}
List<GridRow> rows = new ArrayList<GridRow>();
for (User u : users) {
rows.add(new DefaultGridRow(u.getUserName(), new Object[]{u.getUserName(), u.isActive()}));
}
return rows;
}
});
panel.add(new JScrollPane(grid), BorderLayout.CENTER);
eventBus.addEventHandler(new EventHandler<ApplicationEvent>() {
@Override
public void handleEvent(ApplicationEvent e) {
if (UserManagement.USER_STATE_CHANGED.equals(e.getCommand())) {
grid.reload();
}
}
});
return panel;
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
if (!enabled) {
grid.clearSelection();
grid.getTableHeader().setEnabled(false);
grid.setEnabled(false);
for (Component c : toolBar.getComponents()) {
c.setEnabled(false);
}
toolBar.setEnabled(false);
for (Component c : tabbedPane.getComponents()) {
c.setEnabled(false);
}
tabbedPane.setEnabled(false);
}
}
@Override
public void invalidate() {
super.invalidate();
if (!grid.isLoaded()) {
grid.reload();
}
}
// --- Event Handlers --- //
private void onAdd() {
final AddUserDialog dlg = new AddUserDialog(UserManagementPanel.this);
dlg.setSuccessListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
userService.addUser(dlg.getUsername(), dlg.getPassword());
} catch (ServiceException e1) {
LOGGER.throwing(UserManagementPanel.class.getName(), "onAddUser", e1);
ErrorUtil.showError(UserManagementPanel.this, e1);
}
eventBus.fireEvent(new ApplicationEvent(dlg, UserManagement.USER_STATE_CHANGED));
}
});
}
});
dlg.setVisible(true);
}
private void onDelete() {
int selectedIndex = grid.getSelectionModel().getLeadSelectionIndex();
if (selectedIndex >= 0 && selectedIndex < grid.getModel().getRowCount()) {
final GridRow row = ((GridTableModel) grid.getModel()).getRow(selectedIndex);
int n = JOptionPane.showConfirmDialog(
UserManagementPanel.this,
"Are you sure you want to delete selected user \"" + row.getId().toString() + "\"?",
"Confirm deletion",
JOptionPane.YES_NO_OPTION);
if (JOptionPane.YES_OPTION == n) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
userService.deleteUser(row.getId().toString());
} catch (ServiceException e1) {
LOGGER.throwing(UserManagementPanel.class.getName(), "onDeleteUser", e1);
ErrorUtil.showError(UserManagementPanel.this, e1);
}
eventBus.fireEvent(new ApplicationEvent(UserManagementPanel.this, UserManagement.USER_STATE_CHANGED));
}
});
}
}
}
private void onActivate() {
int selectedIndex = grid.getSelectionModel().getLeadSelectionIndex();
if (selectedIndex >= 0 && selectedIndex < grid.getModel().getRowCount()) {
final GridRow row = ((GridTableModel) grid.getModel()).getRow(selectedIndex);
int n = JOptionPane.showConfirmDialog(
UserManagementPanel.this,
"Are you sure you want to Activate selected user \"" + row.getId().toString() + "\"?",
"Confirm activation",
JOptionPane.YES_NO_OPTION);
if (JOptionPane.YES_OPTION == n) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
userService.activateUser(row.getId().toString(), true);
} catch (ServiceException e1) {
LOGGER.throwing(UserManagementPanel.class.getName(), "onActivateUser", e1);
ErrorUtil.showError(UserManagementPanel.this, e1);
}
eventBus.fireEvent(new ApplicationEvent(UserManagementPanel.this, UserManagement.USER_STATE_CHANGED));
}
});
}
}
}
private void onChangePass() {
int selectedIndex = grid.getSelectionModel().getLeadSelectionIndex();
if (selectedIndex >= 0 && selectedIndex < grid.getModel().getRowCount()) {
final GridRow row = ((GridTableModel) grid.getModel()).getRow(selectedIndex);
final ChangePasswordDialog dlg = new ChangePasswordDialog(UserManagementPanel.this);
dlg.setSuccessListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
userService.changePassword(row.getId().toString(), dlg.getNewPassword());
} catch (ServiceException e1) {
LOGGER.throwing(UserManagementPanel.class.getName(), "onChangePassword", e1);
ErrorUtil.showError(UserManagementPanel.this, e1);
}
eventBus.fireEvent(new ApplicationEvent(dlg, UserManagement.USER_STATE_CHANGED));
}
});
}
});
dlg.setVisible(true);
}
}
// --- FOR TESTING AND DEBUGGING PURPOSES ONLY --- //
public static void main(String[] args) throws Exception {
// Look and feel
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
WindowListener windowAdapter = new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0);}
};
UserManagementPanel panel = new UserManagementPanel(new UserManagementService() {
@Override
public List<User> getUsers() throws ServiceException {
ArrayList<User> users = new ArrayList<User>();
users.add(new User("Test 1"));
users.add(new User("Test 2"));
users.add(new User("Test 3"));
return users;
}
@Override
public boolean addUser(String user, String password) throws ServiceException {
return false;
}
@Override
public boolean deleteUser(String user) throws ServiceException {
return false;
}
@Override
public boolean activateUser(String user, boolean activate) throws ServiceException {
return false;
}
@Override
public boolean changePassword(String user, String password) throws ServiceException {
return false;
}
}, new EventBus<ApplicationEvent>());
JFrame frame = new JFrame("User management");
frame.addWindowListener(windowAdapter);
frame.getContentPane().add("Center", panel);
frame.pack();
frame.setSize(new Dimension(400, 500));
frame.setVisible(true);
}
}