package op.users;
import com.jidesoft.swing.JideButton;
import entity.system.Acl;
import entity.system.SYSGROUPS2ACL;
import entity.system.SYSGROUPS2ACLTools;
import op.OPDE;
import op.system.InternalClass;
import op.system.InternalClassACL;
import op.threads.DisplayManager;
import op.threads.DisplayMessage;
import gui.GUITools;
import op.tools.RiverLayout;
import op.tools.SYSConst;
import op.tools.SYSTools;
import javax.persistence.EntityManager;
import javax.persistence.LockModeType;
import javax.persistence.OptimisticLockException;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.net.URI;
/**
* Created by IntelliJ IDEA.
* User: tloehr
* Date: 01.09.12
* Time: 11:36
* To change this template use File | Settings | File Templates.
*/
public class PnlEditACL extends JPanel {
private SYSGROUPS2ACL sysgroups2ACL;
public PnlEditACL(SYSGROUPS2ACL sysgroups2ACL) {
super();
this.sysgroups2ACL = sysgroups2ACL;
setLayout(new RiverLayout(5, 0));
// setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
initPanel();
}
private void initPanel() {
final InternalClass ic = OPDE.getAppInfo().getInternalClasses().get(sysgroups2ACL.getInternalClassID());
add(RiverLayout.PARAGRAPH_BREAK + " " + RiverLayout.HFILL, new JLabel(SYSTools.toHTMLForScreen(SYSConst.html_paragraph(SYSConst.html_italic(ic.getLongDescription())))));
if (!SYSTools.catchNull(ic.getHelpurl()).isEmpty()) {
JideButton helpButton = GUITools.createHyperlinkButton("misc.msg.explain.this.to.me", SYSConst.icon22helpMe, e -> {
try {
URI uri = new URI(SYSTools.xx(ic.getHelpurl()));
Desktop.getDesktop().browse(uri);
} catch (Exception ex) {
OPDE.getDisplayManager().addSubMessage(new DisplayMessage("opde.mainframe.noHelpAvailable"));
}
});
helpButton.setFont(SYSConst.ARIAL14ITALIC);
add(RiverLayout.LEFT, helpButton);
}
for (final InternalClassACL possibleACL : ic.getPossibleACLs()) {
JCheckBox cbACL = new JCheckBox(InternalClassACL.strACLS[possibleACL.getACLcode()]);
// cbACL.setToolTipText();
cbACL.setFont(SYSConst.ARIAL14BOLD);
// The CB should be selected if (and only if) the IntClass (with the fitting internalClassesID) is assigned to the group and
// a ACL is assigned to the SYSGROUPS2ACL object with the same SHORT code for the acl.
cbACL.setSelected(SYSGROUPS2ACLTools.findACLbyCODE(sysgroups2ACL, possibleACL.getACLcode()) != null);
cbACL.addItemListener(itemEvent -> {
EntityManager em = OPDE.createEM();
try {
em.getTransaction().begin();
SYSGROUPS2ACL mySYSGROUPS2ACL = em.merge(sysgroups2ACL);
em.lock(mySYSGROUPS2ACL, LockModeType.OPTIMISTIC);
if (itemEvent.getStateChange() == ItemEvent.SELECTED) {
mySYSGROUPS2ACL.getAclCollection().add(em.merge(new Acl(possibleACL.getACLcode(), mySYSGROUPS2ACL)));
} else {
Acl myAcl = em.merge(SYSGROUPS2ACLTools.findACLbyCODE(mySYSGROUPS2ACL, possibleACL.getACLcode()));
mySYSGROUPS2ACL.getAclCollection().remove(myAcl);
em.remove(myAcl);
}
em.getTransaction().commit();
sysgroups2ACL = mySYSGROUPS2ACL;
} catch (OptimisticLockException ole) {
OPDE.warn(ole);
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
OPDE.getDisplayManager().addSubMessage(DisplayManager.getLockMessage());
} catch (Exception e) {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
OPDE.fatal(e);
} finally {
em.close();
}
});
add(RiverLayout.PARAGRAPH_BREAK+ " "+ RiverLayout.VTOP, cbACL);
add(RiverLayout.LEFT + " "+ RiverLayout.HFILL, new JLabel(SYSTools.toHTMLForScreen(SYSConst.html_paragraph(possibleACL.getDescription()))));
}
}
}