/* * Created by JFormDesigner on Fri May 30 15:30:55 CEST 2014 */ package op.training; import com.jidesoft.popup.JidePopup; import com.jidesoft.swing.SelectAllUtils; import com.toedter.calendar.JCalendar; import entity.staff.Training; import entity.staff.Training2Users; import entity.staff.Training2UsersTools; import entity.staff.TrainingTools; import entity.system.Users; import entity.system.UsersTools; import op.OPDE; import op.care.sysfiles.DlgFiles; import op.threads.DisplayManager; import gui.GUITools; import op.tools.RiverLayout; import op.tools.SYSConst; import op.tools.SYSTools; import org.apache.commons.collections.Closure; import javax.persistence.EntityManager; import javax.persistence.LockModeType; import javax.persistence.OptimisticLockException; import javax.swing.*; import javax.swing.border.EmptyBorder; import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.text.DateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.GregorianCalendar; /** * @author Torsten Löhr */ public class PnlUserlistEditor extends JPanel { private final Training training; private final Closure editAction; private final boolean editmode; JTextField txtUsers; JPanel pnlUsersearch, pnlSelectedUsers; JList lstUsersFound; int MAXLINE = 4; public PnlUserlistEditor(Training training, Closure editAction) { this.training = training; this.editAction = editAction; this.editmode = editAction != null; setLayout(new BorderLayout(5, 5)); initPanel(); } private void initPanel() { pnlSelectedUsers = new JPanel(new RiverLayout(5, 5)); add(pnlSelectedUsers, BorderLayout.CENTER); ArrayList<Training2Users> training2UsersArrayList = new ArrayList<>(training.getAttendees()); Collections.sort(training2UsersArrayList); int i = 0; for (Training2Users training2Users : training2UsersArrayList) { if (i % MAXLINE == 0) { pnlSelectedUsers.add(createUserPanel(training2Users), RiverLayout.PARAGRAPH_BREAK); } else { pnlSelectedUsers.add(createUserPanel(training2Users), RiverLayout.LEFT); } i++; } if (editmode) { pnlUsersearch = new JPanel(); pnlUsersearch.setLayout(new BoxLayout(pnlUsersearch, BoxLayout.PAGE_AXIS)); add(pnlUsersearch, BorderLayout.WEST); lstUsersFound = new JList(new DefaultListModel()); lstUsersFound.addListSelectionListener(e -> { if (e.getValueIsAdjusting()) return; if (lstUsersFound.getSelectedValue() == null) return; final Users thisUser = (Users) lstUsersFound.getSelectedValue(); if (!Training2UsersTools.contains(training.getAttendees(), thisUser)) { Training2Users training2Users = new Training2Users(training.getStarting(), thisUser, training); EntityManager em = OPDE.createEM(); try { em.getTransaction().begin(); Training2Users myT2U = em.merge(training2Users); Training myTraining = em.merge(training); em.lock(myTraining, LockModeType.OPTIMISTIC_FORCE_INCREMENT); myTraining.getAttendees().add(myT2U); em.getTransaction().commit(); editAction.execute(myTraining); } catch (OptimisticLockException ole) { OPDE.warn(ole); OPDE.warn(ole); if (em.getTransaction().isActive()) { em.getTransaction().rollback(); } OPDE.getDisplayManager().addSubMessage(DisplayManager.getLockMessage()); editAction.execute(null); } catch (Exception ex) { if (em.getTransaction().isActive()) { em.getTransaction().rollback(); } OPDE.fatal(ex); } finally { em.close(); } // SwingUtilities.invokeLater(new Runnable() { // @Override // public void run() { // revalidate(); // repaint(); // } // }); } }); txtUsers = new JTextField(15); txtUsers.addCaretListener(e -> SwingUtilities.invokeLater(() -> { lstUsersFound.setModel(SYSTools.list2dlm(UsersTools.getUsers(txtUsers.getText(), false))); lstUsersFound.revalidate(); lstUsersFound.repaint(); })); SelectAllUtils.install(txtUsers); txtUsers.addKeyListener(new KeyAdapter() { @Override public void keyTyped(KeyEvent e) { char c = e.getKeyChar(); if (Character.isAlphabetic(c) || Character.isDigit(c)) { super.keyTyped(e); } else { e.consume(); } } }); pnlUsersearch.add(txtUsers); pnlUsersearch.add(new JScrollPane(lstUsersFound)); } } private JPanel createUserPanel(final Training2Users training2Users) { final JPanel pnlButton = new JPanel(); pnlButton.setBorder(new EmptyBorder(0, 0, 0, 10)); pnlButton.setToolTipText(training2Users.getAttendee().getUID() + "; " + DateFormat.getDateInstance(DateFormat.SHORT).format(training2Users.getPit())); pnlButton.add(new JLabel(training2Users.getAttendee().getFullname())); if (editmode) { JButton btnDelUser = GUITools.getTinyButton("misc.msg.delete", SYSConst.icon16userDel); btnDelUser.setPressedIcon(SYSConst.icon16Pressed); btnDelUser.setFont(SYSConst.ARIAL12); btnDelUser.setHorizontalTextPosition(SwingConstants.LEADING); // btnDelUser.setForeground(SYSConst.green2[SYSConst.dark4]); btnDelUser.addActionListener(e -> { EntityManager em = OPDE.createEM(); try { em.getTransaction().begin(); Training myTraining = em.merge(training); em.lock(myTraining, LockModeType.OPTIMISTIC_FORCE_INCREMENT); Training2Users myT2U = em.merge(training2Users); myTraining.getAttendees().remove(myT2U); em.remove(myT2U); em.getTransaction().commit(); editAction.execute(myTraining); } catch (OptimisticLockException ole) { OPDE.warn(ole); OPDE.warn(ole); if (em.getTransaction().isActive()) { em.getTransaction().rollback(); } OPDE.getDisplayManager().addSubMessage(DisplayManager.getLockMessage()); editAction.execute(null); } catch (Exception ex) { if (em.getTransaction().isActive()) { em.getTransaction().rollback(); } OPDE.fatal(ex); } finally { em.close(); } }); pnlButton.add(btnDelUser); } JButton btnState = GUITools.getTinyButton(Training2UsersTools.getTooltip(training2Users), Training2UsersTools.getIcon(training2Users)); btnState.setPressedIcon(SYSConst.icon16Pressed); if (editmode) { btnState.addActionListener(e -> { EntityManager em = OPDE.createEM(); try { em.getTransaction().begin(); Training myTraining = em.merge(training); em.lock(myTraining, LockModeType.OPTIMISTIC_FORCE_INCREMENT); Training2Users myT2U = em.merge(training2Users); myTraining.getAttendees().remove(myT2U); byte state = myT2U.getState(); state++; if (state > Training2UsersTools.STATE_REFUSED) state = Training2UsersTools.STATE_OPEN; myT2U.setState(state); myTraining.getAttendees().add(myT2U); em.getTransaction().commit(); editAction.execute(myTraining); } catch (OptimisticLockException ole) { OPDE.warn(ole); OPDE.warn(ole); if (em.getTransaction().isActive()) { em.getTransaction().rollback(); } OPDE.getDisplayManager().addSubMessage(DisplayManager.getLockMessage()); editAction.execute(null); } catch (Exception ex) { if (em.getTransaction().isActive()) { em.getTransaction().rollback(); } OPDE.fatal(ex); } finally { em.close(); } }); } pnlButton.add(btnState); if (training.getState() == TrainingTools.STATE_WORK_PLACE_RELATED) { final JButton btnDate = GUITools.getTinyButton("misc.msg.date", SYSConst.icon16date); btnDate.setPressedIcon(SYSConst.icon16Pressed); if (editmode) { btnDate.addActionListener(e -> { JCalendar jdc = new JCalendar(training2Users.getPit()); jdc.addPropertyChangeListener("calendar", evt -> { if (evt.getNewValue() == null) return; Date date = ((GregorianCalendar) evt.getNewValue()).getTime(); EntityManager em = OPDE.createEM(); try { em.getTransaction().begin(); Training myTraining = em.merge(training); em.lock(myTraining, LockModeType.OPTIMISTIC_FORCE_INCREMENT); Training2Users myT2U = em.merge(training2Users); myTraining.getAttendees().remove(myT2U); myT2U.setPit(date); myTraining.getAttendees().add(myT2U); em.getTransaction().commit(); editAction.execute(myTraining); } catch (OptimisticLockException ole) { OPDE.warn(ole); OPDE.warn(ole); if (em.getTransaction().isActive()) { em.getTransaction().rollback(); } OPDE.getDisplayManager().addSubMessage(DisplayManager.getLockMessage()); editAction.execute(null); } catch (Exception ex) { if (em.getTransaction().isActive()) { em.getTransaction().rollback(); } OPDE.fatal(ex); } finally { em.close(); } }); final JidePopup popupInfo = new JidePopup(); popupInfo.setMovable(false); popupInfo.setContentPane(jdc); popupInfo.removeExcludedComponent(jdc); popupInfo.setDefaultFocusComponent(jdc); popupInfo.setOwner(btnDate); GUITools.showPopup(popupInfo, SwingConstants.CENTER); }); } pnlButton.add(btnDate); } final JButton btnFiles = GUITools.getTinyButton(null, training2Users.getAttachedFilesConnections().isEmpty() ? SYSConst.icon16attach : SYSConst.icon16greenStar); if (!training2Users.getAttachedFilesConnections().isEmpty()){ btnFiles.setText(Integer.toString(training2Users.getAttachedFilesConnections().size())); } btnFiles.setToolTipText(SYSTools.xx("misc.btnfiles.tooltip")); btnFiles.setForeground(Color.BLUE); btnFiles.setFont(SYSConst.ARIAL12BOLD); btnFiles.setHorizontalTextPosition(SwingUtilities.CENTER); btnFiles.setPressedIcon(SYSConst.icon16Pressed); btnFiles.setAlignmentX(Component.RIGHT_ALIGNMENT); btnFiles.setAlignmentY(Component.TOP_ALIGNMENT); btnFiles.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); btnFiles.addActionListener(actionEvent -> { Closure fileHandleClosure = !editmode ? null : o -> { EntityManager em = OPDE.createEM(); final Training myTraining = em.find(Training.class, training2Users.getId()); em.close(); editAction.execute(myTraining); }; new DlgFiles(training2Users, fileHandleClosure); }); btnFiles.setEnabled(OPDE.isFTPworking()); pnlButton.add(btnFiles); return pnlButton; } // JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables // JFormDesigner - End of variables declaration //GEN-END:variables }