package org.openslx.dozmod.gui.configurator; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.swing.AbstractAction; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.event.ChangeListener; import org.apache.log4j.Logger; import org.openslx.bwlp.thrift.iface.ImagePermissions; import org.openslx.bwlp.thrift.iface.UserInfo; import org.openslx.dozmod.gui.changemonitor.GenericControlWindow; import org.openslx.dozmod.gui.control.table.ImagePermissionTable; import org.openslx.dozmod.gui.control.table.ImagePermissionTable.UserImagePermissions; import org.openslx.dozmod.gui.control.table.QScrollPane; import org.openslx.dozmod.gui.helper.GridManager; import org.openslx.dozmod.gui.window.UserListWindow; import org.openslx.dozmod.gui.window.UserListWindow.UserAddedCallback; import org.openslx.dozmod.thrift.cache.UserCache; import org.openslx.dozmod.util.FormatHelper; /** * Panel including ImagePermissionTable and add/remove buttons for setting * customImagePermissions. */ @SuppressWarnings("serial") public class ImagePermissionConfigurator extends JPanel implements GenericControlWindow> { protected ImagePermissionTable permissionTable; protected JButton btnAddUser; protected JButton btnRemoveUser; private String ownerId; private ArrayList permissionList = new ArrayList(); private ImagePermissions defaultPermissions; private static final Logger LOGGER = Logger.getLogger(ImagePermissionConfigurator.class); public ImagePermissionConfigurator() { super(); GridManager grid = new GridManager(this, 1); permissionTable = new ImagePermissionTable(); // Panel for the add- and remove buttons JPanel userButtonPane = new JPanel(); userButtonPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); userButtonPane.setLayout(new BoxLayout(userButtonPane, BoxLayout.LINE_AXIS)); btnAddUser = new JButton("Benutzer hinzufügen"); userButtonPane.add(btnAddUser); btnRemoveUser = new JButton("Benutzer entfernen"); userButtonPane.add(btnRemoveUser); userButtonPane.add(Box.createGlue()); // Put everything into the grid QScrollPane jsp = new QScrollPane(permissionTable); jsp.setBackground(UIManager.getColor("Table.background")); grid.add(jsp).fill(true, true).expand(true, true); grid.nextRow(); grid.add(userButtonPane).fill(true, false).expand(true, false); grid.nextRow(); grid.finish(false); // add user button listener btnAddUser.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { UserListWindow.open(SwingUtilities.getWindowAncestor(ImagePermissionConfigurator.this), new UserAddedCallback() { @Override public void userAdded(final UserInfo newUser, UserListWindow window) { // check if we have this user already for (UserImagePermissions current : permissionList) { if (current.userId.equals(newUser.userId)) { LOGGER.debug("User already present in the list, skipping!"); return; } } // add it to the list with default permissions permissionList.add(new UserImagePermissions(newUser.userId, new ImagePermissions(defaultPermissions))); permissionTable.setData(permissionList, false); fireUserChangeEvent(); } }, "Hinzufügen", ownerId); } }); // delete user button listener btnRemoveUser.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { final UserImagePermissions selected = permissionTable.getSelectedItem(); if (selected != null && !permissionList.remove(selected)) { LOGGER.debug("Could not remove: " + selected); } permissionTable.setData(permissionList, false); fireUserChangeEvent(); } }); // keyboard shortcut permissionTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT) .put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), "delete"); permissionTable.getActionMap().put("delete", new AbstractAction() { @Override public void actionPerformed(ActionEvent ae) { btnRemoveUser.doClick(); } }); permissionTable.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { // TODO: This is stupid; permissionTable should fire an event // if one of the check boxes changes. fireUserChangeEvent(); } }); } /** * Initialize the PermissionManager. Note that the given permissionMap and * defaultPermissions reference * will get changed when the user interacts with the controls. * * @param permissionMap the old permission, to initialize the table with, * null creates empty table. * @param defaultPermissions the permissions for a newly added user * @param ownerId The user to exclude from the add user list. Can be null. */ public void initPanel(Map permissionMap, final ImagePermissions defaultPermissions, String ownerId) { this.ownerId = ownerId; this.defaultPermissions = defaultPermissions; permissionList.clear(); if (permissionMap != null) { for (Entry e : permissionMap.entrySet()) { permissionList.add(new UserImagePermissions(e.getKey(), e.getValue())); } } // lexicographic sort on the last names Collections.sort(permissionList, new Comparator() { @Override public int compare(UserImagePermissions o1, UserImagePermissions o2) { UserInfo u1 = UserCache.find(o1.userId); UserInfo u2 = UserCache.find(o2.userId); if (u1 != null && u2 != null) return FormatHelper.userName(u1).compareTo(FormatHelper.userName(u2)); else return 0; } }); permissionTable.setData(permissionList, false); } /** * Get map with the permissions set in the table of the manager. * * @return Map with new custom permissions, null if something went wrong */ public Map getPermissions() { Map newPermissionMap = new HashMap<>(permissionList.size()); // put permissions of the list into the map for (UserImagePermissions perm : permissionList) { newPermissionMap.put(perm.userId, new ImagePermissions(perm.permissions)); } return newPermissionMap; } /* * For dialog change monitor */ void fireUserChangeEvent() { for (ChangeListener cl : listeners) { cl.stateChanged(null); } } @Override public Map getState() { return getPermissions(); } private final List listeners = new ArrayList<>(1); @Override public void addChangeListener(ChangeListener l) { listeners.add(l); } }