package org.openslx.dozmod.gui.window; import java.awt.Color; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.List; import javax.swing.JTable; import javax.swing.RowFilter; import javax.swing.UIManager; import org.apache.log4j.Logger; import org.openslx.bwlp.thrift.iface.UserInfo; import org.openslx.dozmod.gui.Gui; import org.openslx.dozmod.gui.helper.TextChangeListener; import org.openslx.dozmod.gui.helper.UiFeedback; import org.openslx.dozmod.gui.window.layout.UserListWindowLayout; import org.openslx.dozmod.thrift.cache.UserCache; import org.openslx.util.QuickTimer; import org.openslx.util.QuickTimer.Task; @SuppressWarnings("serial") public class UserListWindow extends UserListWindowLayout implements UiFeedback { private final static Logger LOGGER = Logger.getLogger(UserListWindow.class); private final UserListWindow me = this; private String ownerId = null; public interface UserAddedCallback { public void userAdded(UserInfo user, UserListWindow window); } public UserListWindow(final Window modalParent, final UserAddedCallback callback, String buttonCaption) { super(modalParent, buttonCaption); addWindowListener(new WindowAdapter() { @Override public void windowOpened(WindowEvent e) { // load the user cache async QuickTimer.scheduleOnce(new Task() { @Override public void fire() { final List cacheList = UserCache.getAll(); final List userList = new ArrayList<>(cacheList.size() - 1); for (UserInfo user : cacheList) { if (ownerId != null && user.getUserId().equals(ownerId)) continue; userList.add(user); } Gui.asyncExec(new Runnable() { @Override public void run() { userTable.setData(userList, true); // Scale the window after getting the list of users. int calcHeight = 150 + userList.size() * 20; calcHeight = calcHeight > 350 ? calcHeight : 350; me.setPreferredSize(Gui.getScaledDimension(450, (calcHeight < 600) ? calcHeight : 600)); me.pack(); userTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); } }); } }); } }); // filter the objects in the table depending on the search field txtSearch.getDocument().addDocumentListener(new TextChangeListener() { @Override public void changed() { try { userTable.getRowSorter().setRowFilter( RowFilter.regexFilter("(?i)" + txtSearch.getText())); txtSearch.setForeground(UIManager.getColor("TextField.foreground")); } catch (IllegalArgumentException ex) { txtSearch.setForeground(Color.RED); } } }); btnConfirm.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { final UserInfo user = userTable.getSelectedItem(); if (user == null) return; callback.userAdded(user, me); } }); btnCancel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { dispose(); } }); getRootPane().setDefaultButton(btnConfirm); userTable.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { btnConfirm.doClick(); } } }); Gui.centerShellOverShell(modalParent, this); // this.setLocationRelativeTo(SwingUtilities.getWindowAncestor(modalParent)); } /** * Open a new UserListWindow * * @param modalParent * @param callback * @param buttonCaption * @param ownerId The Id of the owner of an image or lecture. Should not be * shown in the list. Can be null */ public static void open(Window modalParent, UserAddedCallback callback, String buttonCaption, String ownerId) { UserListWindow win = new UserListWindow(modalParent, callback, buttonCaption); win.ownerId = ownerId; win.setVisible(true); } @Override public boolean wantConfirmQuit() { return false; } @Override public void escapePressed() { dispose(); } }