/*
* OffenePflege
* Copyright (C) 2006-2012 Torsten Löhr
* This program is free software; you can redistribute it and/or modify it under the terms of the
* GNU General Public License V2 as published by the Free Software Foundation
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program; if not, write to
* the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
* www.offene-pflege.de
* ------------------------
* Auf deutsch (freie Übersetzung. Rechtlich gilt die englische Version)
* Dieses Programm ist freie Software. Sie können es unter den Bedingungen der GNU General Public License,
* wie von der Free Software Foundation veröffentlicht, weitergeben und/oder modifizieren, gemäß Version 2 der Lizenz.
*
* Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen von Nutzen sein wird, aber
* OHNE IRGENDEINE GARANTIE, sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN
* BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License.
*
* Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem Programm erhalten haben. Falls nicht,
* schreiben Sie an die Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA.
*
*/
package op.care.bhp;
import com.jidesoft.pane.CollapsiblePane;
import com.jidesoft.pane.CollapsiblePanes;
import com.jidesoft.pane.event.CollapsiblePaneAdapter;
import com.jidesoft.pane.event.CollapsiblePaneEvent;
import com.jidesoft.popup.JidePopup;
import com.jidesoft.swing.JideBoxLayout;
import com.jidesoft.swing.JideButton;
import com.jidesoft.utils.ColorUtils;
import com.toedter.calendar.JDateChooser;
import entity.EntityTools;
import entity.files.SYSFilesTools;
import entity.info.Resident;
import entity.info.ResidentTools;
import entity.prescription.*;
import gui.GUITools;
import gui.interfaces.DefaultCPTitle;
import op.OPDE;
import op.system.InternalClassACL;
import op.system.Validator;
import op.threads.DisplayManager;
import op.threads.DisplayMessage;
import op.tools.*;
import org.apache.commons.collections.Closure;
import org.jdesktop.swingx.HorizontalLayout;
import org.jdesktop.swingx.VerticalLayout;
import org.joda.time.DateMidnight;
import org.joda.time.LocalDate;
import javax.persistence.EntityManager;
import javax.persistence.LockModeType;
import javax.persistence.OptimisticLockException;
import javax.persistence.RollbackException;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.util.*;
/**
* @author tloehr
* @see <a href="https://offene-pflege.de/doku.php?id=en:dev:pnlbhp">Developer's website</a>
*/
public class PnlBHP extends NursingRecordsPanel {
private Resident resident;
private boolean initPhase;
private Map<BHP, CollapsiblePane> mapBHP2Pane;
private Map<Byte, ArrayList<BHP>> mapShift2BHP;
private Map<Byte, CollapsiblePane> mapShift2Pane;
private Map<Prescription, MedStock> mapPrescription2Stock;
private int MAX_TEXT_LENGTH = 65;
private JScrollPane jspSearch;
private CollapsiblePanes searchPanes;
private JDateChooser jdcDatum;
// private JPanel thisPanel;
private String outcomeText = null;
private BigDecimal weight = null;
/**
*
* @param resident
* @param jspSearch
* @see <a href="https://offene-pflege.de/doku.php?id=en:dev:pnlbhp">Developer's website</a>
*/
public PnlBHP(Resident resident, JScrollPane jspSearch) {
super("nursingrecords.bhp");
initComponents();
this.jspSearch = jspSearch;
// thisPanel = this;
initPanel();
switchResident(resident);
}
@Override
public String getInternalClassID() {
return internalClassID;
}
@Override
public void switchResident(Resident res) {
this.resident = EntityTools.find(Resident.class, res.getRID());
GUITools.setResidentDisplay(resident);
initPhase = true;
jdcDatum.setMinSelectableDate(BHPTools.getMinDatum(resident));
jdcDatum.setDate(new Date());
jdcDatum.setMaxSelectableDate(new Date());
initPhase = false;
reloadDisplay();
}
private void initPanel() {
mapBHP2Pane = Collections.synchronizedMap(new HashMap<BHP, CollapsiblePane>());
mapShift2Pane = Collections.synchronizedMap(new HashMap<Byte, CollapsiblePane>());
mapShift2BHP = Collections.synchronizedMap(new HashMap<Byte, ArrayList<BHP>>());
mapPrescription2Stock = Collections.synchronizedMap(new HashMap<Prescription, MedStock>());
prepareSearchArea();
}
@Override
public void cleanup() {
super.cleanup();
jdcDatum.cleanup();
synchronized (mapShift2BHP) {
SYSTools.clear(mapShift2BHP);
}
synchronized (mapShift2Pane) {
SYSTools.clear(mapShift2Pane);
}
synchronized (mapPrescription2Stock) {
SYSTools.clear(mapPrescription2Stock);
}
synchronized (mapBHP2Pane) {
SYSTools.clear(mapBHP2Pane);
}
SYSTools.unregisterListeners(this);
}
@Override
public void reload() {
reloadDisplay();
}
private void reloadDisplay() {
/***
* _ _ ____ _ _
* _ __ ___| | ___ __ _ __| | _ \(_)___ _ __ | | __ _ _ _
* | '__/ _ \ |/ _ \ / _` |/ _` | | | | / __| '_ \| |/ _` | | | |
* | | | __/ | (_) | (_| | (_| | |_| | \__ \ |_) | | (_| | |_| |
* |_| \___|_|\___/ \__,_|\__,_|____/|_|___/ .__/|_|\__,_|\__, |
* |_| |___/
*/
initPhase = true;
final boolean withworker = true;
if (withworker) {
OPDE.getMainframe().setBlocked(true);
OPDE.getDisplayManager().setProgressBarMessage(new DisplayMessage(SYSTools.xx("misc.msg.wait"), -1, 100));
synchronized (mapPrescription2Stock) {
SYSTools.clear(mapPrescription2Stock);
}
synchronized (mapBHP2Pane) {
SYSTools.clear(mapBHP2Pane);
}
synchronized (mapShift2BHP) {
if (mapShift2BHP != null) {
for (Byte key : mapShift2BHP.keySet()) {
mapShift2BHP.get(key).clear();
}
mapShift2BHP.clear();
}
}
synchronized (mapShift2Pane) {
if (mapShift2Pane != null) {
for (Byte key : mapShift2Pane.keySet()) {
mapShift2Pane.get(key).removeAll();
}
mapShift2Pane.clear();
}
}
SwingWorker worker = new SwingWorker() {
@Override
protected Object doInBackground() throws Exception {
try {
int progress = 0;
OPDE.getDisplayManager().setProgressBarMessage(new DisplayMessage(SYSTools.xx("misc.msg.wait"), -1, 100));
synchronized (mapShift2BHP) {
for (BHP bhp : BHPTools.getBHPs(resident, jdcDatum.getDate())) {
if (!mapShift2BHP.containsKey(bhp.getShift())) {
mapShift2BHP.put(bhp.getShift(), new ArrayList<BHP>());
}
mapShift2BHP.get(bhp.getShift()).add(bhp);
}
if (!mapShift2BHP.containsKey(SYSCalendar.SHIFT_ON_DEMAND)) {
mapShift2BHP.put(SYSCalendar.SHIFT_ON_DEMAND, new ArrayList<BHP>());
}
mapShift2BHP.get(SYSCalendar.SHIFT_ON_DEMAND).addAll(BHPTools.getBHPsOnDemand(resident, jdcDatum.getDate()));
if (!mapShift2BHP.containsKey(SYSCalendar.SHIFT_OUTCOMES)) {
mapShift2BHP.put(SYSCalendar.SHIFT_OUTCOMES, new ArrayList<BHP>());
}
mapShift2BHP.get(SYSCalendar.SHIFT_OUTCOMES).addAll(BHPTools.getOutcomeBHPs(resident, new LocalDate(jdcDatum.getDate())));
}
synchronized (mapShift2Pane) {
for (Byte shift : new Byte[]{SYSCalendar.SHIFT_ON_DEMAND, SYSCalendar.SHIFT_OUTCOMES, SYSCalendar.SHIFT_VERY_EARLY, SYSCalendar.SHIFT_EARLY, SYSCalendar.SHIFT_LATE, SYSCalendar.SHIFT_VERY_LATE}) {
mapShift2Pane.put(shift, createCP4(shift));
try {
mapShift2Pane.get(shift).setCollapsed(shift == SYSCalendar.SHIFT_ON_DEMAND || shift == SYSCalendar.SHIFT_OUTCOMES || shift != SYSCalendar.whatShiftIs(new Date()));
} catch (PropertyVetoException e) {
OPDE.debug(e);
}
progress += 20;
OPDE.getDisplayManager().setProgressBarMessage(new DisplayMessage(SYSTools.xx("misc.msg.wait"), progress, 100));
}
}
} catch (Exception exc) {
OPDE.fatal(exc);
}
return null;
}
@Override
protected void done() {
buildPanel(true);
initPhase = false;
OPDE.getDisplayManager().setProgressBarMessage(null);
OPDE.getMainframe().setBlocked(false);
}
};
worker.execute();
} else {
mapBHP2Pane.clear();
if (mapShift2BHP != null) {
for (Byte key : mapShift2BHP.keySet()) {
mapShift2BHP.get(key).clear();
}
mapShift2BHP.clear();
}
if (mapShift2Pane != null) {
for (Byte key : mapShift2Pane.keySet()) {
mapShift2Pane.get(key).removeAll();
}
mapShift2Pane.clear();
}
for (BHP bhp : BHPTools.getBHPs(resident, jdcDatum.getDate())) {
if (!mapShift2BHP.containsKey(bhp.getShift())) {
mapShift2BHP.put(bhp.getShift(), new ArrayList<BHP>());
}
mapShift2BHP.get(bhp.getShift()).add(bhp);
}
if (!mapShift2BHP.containsKey(SYSCalendar.SHIFT_ON_DEMAND)) {
mapShift2BHP.put(SYSCalendar.SHIFT_ON_DEMAND, new ArrayList<BHP>());
}
mapShift2BHP.get(SYSCalendar.SHIFT_ON_DEMAND).addAll(BHPTools.getBHPsOnDemand(resident, jdcDatum.getDate()));
if (!mapShift2BHP.containsKey(SYSCalendar.SHIFT_OUTCOMES)) {
mapShift2BHP.put(SYSCalendar.SHIFT_OUTCOMES, new ArrayList<BHP>());
}
mapShift2BHP.get(SYSCalendar.SHIFT_OUTCOMES).addAll(BHPTools.getOutcomeBHPs(resident, new LocalDate(jdcDatum.getDate())));
for (Byte shift : new Byte[]{SYSCalendar.SHIFT_ON_DEMAND, SYSCalendar.SHIFT_OUTCOMES, SYSCalendar.SHIFT_VERY_EARLY, SYSCalendar.SHIFT_EARLY, SYSCalendar.SHIFT_LATE, SYSCalendar.SHIFT_VERY_LATE}) {
mapShift2Pane.put(shift, createCP4(shift));
try {
mapShift2Pane.get(shift).setCollapsed(shift == SYSCalendar.SHIFT_ON_DEMAND || shift == SYSCalendar.SHIFT_OUTCOMES || shift != SYSCalendar.whatShiftIs(new Date()));
} catch (PropertyVetoException e) {
OPDE.debug(e);
}
}
buildPanel(true);
}
initPhase = false;
}
private void buildPanel(boolean resetCollapseState) {
synchronized (mapShift2Pane) {
cpBHP.removeAll();
cpBHP.setLayout(new JideBoxLayout(cpBHP, JideBoxLayout.Y_AXIS));
for (Byte shift : new Byte[]{SYSCalendar.SHIFT_ON_DEMAND, SYSCalendar.SHIFT_OUTCOMES, SYSCalendar.SHIFT_VERY_EARLY, SYSCalendar.SHIFT_EARLY, SYSCalendar.SHIFT_LATE, SYSCalendar.SHIFT_VERY_LATE}) {
cpBHP.add(mapShift2Pane.get(shift));
if (resetCollapseState) {
try {
LocalDate day = new LocalDate(jdcDatum.getDate());
if (shift == SYSCalendar.SHIFT_ON_DEMAND) {
mapShift2Pane.get(SYSCalendar.SHIFT_ON_DEMAND).setCollapsed(!BHPTools.isOnDemandBHPs(resident, day));
} else if (shift == SYSCalendar.SHIFT_OUTCOMES) {
mapShift2Pane.get(SYSCalendar.SHIFT_OUTCOMES).setCollapsed(BHPTools.getOutcomeBHPs(resident, day).isEmpty());
} else {
mapShift2Pane.get(shift).setCollapsed(shift != SYSCalendar.whatShiftIs(new Date()));
}
} catch (PropertyVetoException e) {
OPDE.debug(e);
}
}
}
}
cpBHP.addExpansion();
}
private CollapsiblePane createCP4(Byte shift) {
if (shift == SYSCalendar.SHIFT_ON_DEMAND) {
return createCP4OnDemand();
} else if (shift == SYSCalendar.SHIFT_OUTCOMES) {
return createCP4Outcome();
} else {
return createCP4Shift(shift);
}
}
private CollapsiblePane createCP4Outcome() {
/***
* ____ ____ _ _ ___ _
* / ___| _ \| || | / _ \ _ _| |_ ___ ___ _ __ ___ ___
* | | | |_) | || |_| | | | | | | __/ __/ _ \| '_ ` _ \ / _ \
* | |___| __/|__ _| |_| | |_| | || (_| (_) | | | | | | __/
* \____|_| |_| \___/ \__,_|\__\___\___/|_| |_| |_|\___|
*
*/
String title = "<html><font size=+1><b>" + SYSTools.xx("nursingrecords.prescription.dlgOnDemand.outcomeCheck") + "</b></font></html>";
final CollapsiblePane mainPane = new CollapsiblePane(title);
mainPane.setSlidingDirection(SwingConstants.SOUTH);
mainPane.setBackground(SYSCalendar.getBGSHIFT(SYSCalendar.SHIFT_OUTCOMES));
mainPane.setForeground(SYSCalendar.getFGSHIFT(SYSCalendar.SHIFT_OUTCOMES));
mainPane.setLayout(new VerticalLayout());
mainPane.setOpaque(false);
if (!mapShift2BHP.get(SYSCalendar.SHIFT_OUTCOMES).isEmpty()) {
// Prescription currentPrescription = null;
// CollapsiblePane sitPane = null;
// JPanel sitPanel = null;
// JPanel panel = new JPanel();
// panel.setLayout(new VerticalLayout());
for (BHP bhp : mapShift2BHP.get(SYSCalendar.SHIFT_OUTCOMES)) {
mapBHP2Pane.put(bhp, createCP4(bhp));
mainPane.add(mapBHP2Pane.get(bhp));
}
// mainPane.setContentPane(sitOuterPanel);
mainPane.setCollapsible(true);
} else {
mainPane.setContentPane(new JPanel());
mainPane.setCollapsible(false);
}
return mainPane;
}
private CollapsiblePane createCP4OnDemand() {
/***
* _ ____ ____ _ _ ___ ____ _
* ___ _ __ ___ __ _| |_ ___ / ___| _ \| || | / _ \ _ __ | _ \ ___ _ __ ___ __ _ _ __ __| |
* / __| '__/ _ \/ _` | __/ _ \ | | |_) | || |_| | | | '_ \| | | |/ _ \ '_ ` _ \ / _` | '_ \ / _` |
* | (__| | | __/ (_| | || __/ |___| __/|__ _| |_| | | | | |_| | __/ | | | | | (_| | | | | (_| |
* \___|_| \___|\__,_|\__\___|\____|_| |_| \___/|_| |_|____/ \___|_| |_| |_|\__,_|_| |_|\__,_|
*
*/
String title = "<html><font size=+1><b>" + SYSTools.xx("msg.shift.ondemand") + "</b></font></html>";
final CollapsiblePane mainPane = new CollapsiblePane(title);
mainPane.setSlidingDirection(SwingConstants.SOUTH);
mainPane.setBackground(SYSCalendar.getBGSHIFT(SYSCalendar.SHIFT_ON_DEMAND));
mainPane.setForeground(SYSCalendar.getFGSHIFT(SYSCalendar.SHIFT_ON_DEMAND));
mainPane.setOpaque(false);
if (!mapShift2BHP.get(SYSCalendar.SHIFT_ON_DEMAND).isEmpty()) {
Prescription currentPrescription = null;
CollapsiblePane sitPane = null;
JPanel sitPanel = null;
JPanel sitOuterPanel = new JPanel();
sitOuterPanel.setLayout(new VerticalLayout());
for (BHP bhp : mapShift2BHP.get(SYSCalendar.SHIFT_ON_DEMAND)) {
if (currentPrescription == null || bhp.getPrescription().getID() != currentPrescription.getID()) {
if (currentPrescription != null) {
sitPane.setContentPane(sitPanel);
sitOuterPanel.add(sitPane);
}
currentPrescription = bhp.getPrescription();
sitPanel = new JPanel();
sitPanel.setLayout(new VerticalLayout());
sitPanel.setBackground(SYSCalendar.getBGItem(bhp.getShift()));
sitPane = new CollapsiblePane(SYSTools.toHTMLForScreen("<b>" + currentPrescription.getSituation().getText()) + "</b>");
sitPane.setSlidingDirection(SwingConstants.SOUTH);
sitPane.setBackground(ColorUtils.getDerivedColor(SYSCalendar.getBGSHIFT(SYSCalendar.SHIFT_ON_DEMAND), 0.4f)); // a little darker
sitPane.setForeground(Color.BLACK);
sitPane.setOpaque(false);
}
sitPane.setContentPane(sitPanel);
sitOuterPanel.add(sitPane);
mapBHP2Pane.put(bhp, createCP4(bhp));
sitPanel.add(mapBHP2Pane.get(bhp));
}
mainPane.setContentPane(sitOuterPanel);
mainPane.setCollapsible(true);
} else {
mainPane.setContentPane(new JPanel());
mainPane.setCollapsible(false);
}
return mainPane;
}
private CollapsiblePane createCP4Shift(final Byte shift) {
/***
* _ ____ ____ _ _
* ___ _ __ ___ __ _| |_ ___ / ___| _ \| || |
* / __| '__/ _ \/ _` | __/ _ \ | | |_) | || |_
* | (__| | | __/ (_| | || __/ |___| __/|__ _|
* \___|_| \___|\__,_|\__\___|\____|_| |_|
*
*/
String title = "<html><font size=+1><b>" + GUITools.getLocalizedMessages(SYSCalendar.SHIFT_TEXT)[shift] + "</b></font></html>";
final CollapsiblePane prPane = new CollapsiblePane(title);
prPane.setSlidingDirection(SwingConstants.SOUTH);
prPane.setBackground(SYSCalendar.getBGSHIFT(shift));
prPane.setForeground(SYSCalendar.getFGSHIFT(shift));
prPane.setOpaque(false);
JPanel prPanel = new JPanel();
prPanel.setLayout(new VerticalLayout());
if (mapShift2BHP.containsKey(shift)) {
if (shift == SYSCalendar.SHIFT_EARLY) {
final CollapsiblePane morning = new CollapsiblePane("<html><font size=+1>" + SYSTools.xx("misc.msg.morning.long") + "</font></html>", null);
morning.setSlidingDirection(SwingConstants.SOUTH);
morning.setBackground(SYSCalendar.getBGSHIFT(shift).darker());
morning.setForeground(Color.white);
morning.setOpaque(false);
JPanel pnlMorning = new JPanel();
pnlMorning.setLayout(new VerticalLayout());
morning.setContentPane(pnlMorning);
final CollapsiblePane noon = new CollapsiblePane("<html><font size=+1>" + SYSTools.xx("misc.msg.noon.long") + "</font></html>", null);
noon.setSlidingDirection(SwingConstants.SOUTH);
noon.setBackground(SYSCalendar.getBGSHIFT(shift).darker());
noon.setForeground(Color.white);
noon.setOpaque(false);
JPanel pnlNoon = new JPanel();
pnlNoon.setLayout(new VerticalLayout());
noon.setContentPane(pnlNoon);
final CollapsiblePane clock = new CollapsiblePane("<html><font size=+1>" + SYSTools.xx("misc.msg.Time.long") + "</font></html>", null);
clock.setSlidingDirection(SwingConstants.SOUTH);
clock.setBackground(SYSCalendar.getBGSHIFT(shift).darker());
clock.setForeground(Color.white);
clock.setOpaque(false);
JPanel pnlClock = new JPanel();
pnlClock.setLayout(new VerticalLayout());
clock.setContentPane(pnlClock);
for (BHP bhp : mapShift2BHP.get(shift)) {
prPanel.setBackground(SYSCalendar.getBGItem(bhp.getShift()));
mapBHP2Pane.put(bhp, createCP4(bhp));
if (bhp.getSollZeit() == SYSCalendar.BYTE_MORNING) {
pnlMorning.add(mapBHP2Pane.get(bhp));
} else if (bhp.getSollZeit() == SYSCalendar.BYTE_NOON) {
pnlNoon.add(mapBHP2Pane.get(bhp));
} else {
pnlClock.add(mapBHP2Pane.get(bhp));
}
}
if (pnlClock.getComponentCount() > 0) {
prPanel.add(clock);
}
if (pnlMorning.getComponentCount() > 0) {
prPanel.add(morning);
}
if (pnlNoon.getComponentCount() > 0) {
prPanel.add(noon);
}
} else if (shift == SYSCalendar.SHIFT_LATE) {
final CollapsiblePane afternoon = new CollapsiblePane("<html><font size=+1>" + SYSTools.xx("misc.msg.afternoon.long") + "</font></html>", null);
afternoon.setSlidingDirection(SwingConstants.SOUTH);
afternoon.setBackground(SYSCalendar.getBGSHIFT(shift).darker());
afternoon.setForeground(Color.white);
afternoon.setOpaque(false);
JPanel pnlAfternoon = new JPanel();
pnlAfternoon.setLayout(new VerticalLayout());
afternoon.setContentPane(pnlAfternoon);
final CollapsiblePane evening = new CollapsiblePane("<html><font size=+1>" + SYSTools.xx("misc.msg.evening.long") + "</font></html>", null);
evening.setSlidingDirection(SwingConstants.SOUTH);
evening.setBackground(SYSCalendar.getBGSHIFT(shift).darker());
evening.setForeground(Color.white);
evening.setOpaque(false);
JPanel pnlEvening = new JPanel();
pnlEvening.setLayout(new VerticalLayout());
evening.setContentPane(pnlEvening);
final CollapsiblePane clock = new CollapsiblePane("<html><font size=+1>" + SYSTools.xx("misc.msg.Time.long") + "</font></html>", null);
clock.setSlidingDirection(SwingConstants.SOUTH);
clock.setBackground(SYSCalendar.getBGSHIFT(shift).darker());
clock.setForeground(Color.white);
clock.setOpaque(false);
JPanel pnlClock = new JPanel();
pnlClock.setLayout(new VerticalLayout());
clock.setContentPane(pnlClock);
for (BHP bhp : mapShift2BHP.get(shift)) {
prPanel.setBackground(SYSCalendar.getBGItem(bhp.getShift()));
mapBHP2Pane.put(bhp, createCP4(bhp));
if (bhp.getSollZeit() == SYSCalendar.BYTE_AFTERNOON) {
pnlAfternoon.add(mapBHP2Pane.get(bhp));
} else if (bhp.getSollZeit() == SYSCalendar.BYTE_EVENING) {
pnlEvening.add(mapBHP2Pane.get(bhp));
} else {
pnlClock.add(mapBHP2Pane.get(bhp));
}
}
if (pnlClock.getComponentCount() > 0) {
prPanel.add(clock);
}
if (pnlAfternoon.getComponentCount() > 0) {
prPanel.add(afternoon);
}
if (pnlEvening.getComponentCount() > 0) {
prPanel.add(evening);
}
} else {
for (BHP bhp : mapShift2BHP.get(shift)) {
prPanel.setBackground(SYSCalendar.getBGItem(bhp.getShift()));
mapBHP2Pane.put(bhp, createCP4(bhp));
prPanel.add(mapBHP2Pane.get(bhp));
}
}
prPane.setContentPane(prPanel);
prPane.setCollapsible(true);
} else {
prPane.setContentPane(prPanel);
prPane.setCollapsible(false);
}
return prPane;
}
private CollapsiblePane createCP4(final BHP bhp) {
final CollapsiblePane bhpPane = new CollapsiblePane();
bhpPane.setCollapseOnTitleClick(false);
// only for BHPs with state OPEN
ActionListener applyActionListener = actionEvent -> {
if (bhp.getState() != BHPTools.STATE_OPEN) {
return;
}
if (bhp.getPrescription().isClosed()) {
return;
}
if (BHPTools.bhp2Old(bhp)){
OPDE.getDisplayManager().addSubMessage(new DisplayMessage("nursingrecords.bhp.notchangeable", DisplayMessage.WARNING));
return;
}
if (BHPTools.isChangeable(bhp)) {
outcomeText = null;
if (bhp.getNeedsText()) {
currentEditor = new DlgYesNo(SYSConst.icon48comment, o -> {
if (SYSTools.catchNull(o).isEmpty()) {
outcomeText = null;
} else {
outcomeText = o.toString();
}
currentEditor = null;
}, "nursingrecords.bhp.describe.outcome", null, null);
currentEditor.setVisible(true);
}
if (bhp.getNeedsText() && outcomeText == null) {
OPDE.getDisplayManager().addSubMessage(new DisplayMessage("nursingrecords.bhp.notext.nooutcome", DisplayMessage.WARNING));
return;
}
if (bhp.getPrescription().isWeightControlled()) {
currentEditor = new DlgYesNo(SYSConst.icon48scales, o -> {
if (SYSTools.catchNull(o).isEmpty()) {
weight = null;
} else {
weight = (BigDecimal) o;
}
currentEditor = null;
}, "nursingrecords.bhp.weight", null, new Validator<BigDecimal>() {
@Override
public boolean isValid(String value) {
BigDecimal bd = parse(value);
return bd != null && bd.compareTo(BigDecimal.ZERO) > 0;
}
@Override
public BigDecimal parse(String text) {
return SYSTools.parseDecimal(text);
}
});
currentEditor.setVisible(true);
}
if (bhp.getPrescription().isWeightControlled() && weight == null) {
OPDE.getDisplayManager().addSubMessage(new DisplayMessage("nursingrecords.bhp.noweight.nosuccess", DisplayMessage.WARNING));
return;
}
EntityManager em = OPDE.createEM();
try {
em.getTransaction().begin();
em.lock(em.merge(resident), LockModeType.OPTIMISTIC);
BHP myBHP = em.merge(bhp);
em.lock(myBHP, LockModeType.OPTIMISTIC);
if (myBHP.isOnDemand()) {
em.lock(myBHP.getPrescriptionSchedule(), LockModeType.OPTIMISTIC_FORCE_INCREMENT);
em.lock(myBHP.getPrescription(), LockModeType.OPTIMISTIC_FORCE_INCREMENT);
} else {
em.lock(myBHP.getPrescriptionSchedule(), LockModeType.OPTIMISTIC);
em.lock(myBHP.getPrescription(), LockModeType.OPTIMISTIC);
}
myBHP.setState(BHPTools.STATE_DONE);
myBHP.setUser(em.merge(OPDE.getLogin().getUser()));
myBHP.setIst(new Date());
myBHP.setiZeit(SYSCalendar.whatTimeIDIs(new Date()));
myBHP.setMDate(new Date());
myBHP.setText(outcomeText);
Prescription involvedPresciption = null;
if (myBHP.shouldBeCalculated()) {
MedInventory inventory = TradeFormTools.getInventory4TradeForm(resident, myBHP.getTradeForm());
MedInventoryTools.withdraw(em, em.merge(inventory), myBHP.getDose(), weight, myBHP);
// Was the prescription closed during this withdraw ?
involvedPresciption = em.find(Prescription.class, myBHP.getPrescription().getID());
}
BHP outcomeBHP = null;
// add outcome check BHP if necessary
if (!myBHP.isOutcomeText() && myBHP.getPrescriptionSchedule().getCheckAfterHours() != null) {
outcomeBHP = em.merge(new BHP(myBHP)); // the outcome BHPs are created on the fly, if necessary
mapShift2BHP.get(SYSCalendar.SHIFT_ON_DEMAND).add(outcomeBHP);
}
em.getTransaction().commit();
if (myBHP.shouldBeCalculated() && involvedPresciption.isClosed()) { // &&
reload();
} else if (outcomeBHP != null) {
reload();
} else {
mapBHP2Pane.put(myBHP, createCP4(myBHP));
int position = mapShift2BHP.get(myBHP.getShift()).indexOf(bhp);
mapShift2BHP.get(myBHP.getShift()).remove(position);
mapShift2BHP.get(myBHP.getShift()).add(position, myBHP);
if (myBHP.isOnDemand()) {
// This whole thing here is only to handle the BPHs on Demand
// Fix the other BHPs on demand. If not, you will get locking exceptions,
// we FORCED INCREMENTED LOCKS on the Schedule and the Prescription.
ArrayList<BHP> changeList = new ArrayList<BHP>();
for (BHP bhp1 : mapShift2BHP.get(SYSCalendar.SHIFT_ON_DEMAND)) {
if (bhp1.getPrescription().getID() == myBHP.getPrescription().getID() && bhp1.getBHPid() != myBHP.getBHPid()) {
bhp1.setPrescription(myBHP.getPrescription());
bhp1.setPrescriptionSchedule(myBHP.getPrescriptionSchedule());
changeList.add(bhp1);
}
}
for (BHP bhp1 : changeList) {
mapBHP2Pane.put(bhp1, createCP4(myBHP));
position = mapShift2BHP.get(bhp1.getShift()).indexOf(bhp1);
mapShift2BHP.get(myBHP.getShift()).remove(position);
mapShift2BHP.get(myBHP.getShift()).add(position, bhp1);
}
Collections.sort(mapShift2BHP.get(myBHP.getShift()), BHPTools.getOnDemandComparator());
} else {
Collections.sort(mapShift2BHP.get(myBHP.getShift()));
}
mapShift2Pane.put(myBHP.getShift(), createCP4(myBHP.getShift()));
buildPanel(false);
}
} catch (OptimisticLockException ole) {
OPDE.warn(ole);
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
if (ole.getMessage().indexOf("Class> entity.info.Resident") > -1) {
OPDE.getMainframe().emptyFrame();
OPDE.getMainframe().afterLogin();
}
OPDE.getDisplayManager().addSubMessage(DisplayManager.getLockMessage());
} catch (RollbackException ole) {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
if (ole.getMessage().indexOf("Class> entity.info.Resident") > -1) {
OPDE.getMainframe().emptyFrame();
OPDE.getMainframe().afterLogin();
}
OPDE.getDisplayManager().addSubMessage(DisplayManager.getLockMessage());
} catch (Exception e) {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
OPDE.fatal(e);
} finally {
em.close();
}
} else {
OPDE.getDisplayManager().addSubMessage(new DisplayMessage(SYSTools.xx("nursingrecords.bhp.notchangeable")));
}
};
// JPanel titlePanelleft = new JPanel();
// titlePanelleft.setLayout(new BoxLayout(titlePanelleft, BoxLayout.LINE_AXIS));
MedStock stock = mapPrescription2Stock.get(bhp.getPrescription());
if (bhp.hasMed() && stock == null) {
stock = MedStockTools.getStockInUse(TradeFormTools.getInventory4TradeForm(resident, bhp.getTradeForm()));
mapPrescription2Stock.put(bhp.getPrescription(), stock);
}
String title;
if (bhp.isOutcomeText()) {
title = "<html><font size=+1>" +
SYSConst.html_italic(
SYSTools.left("“" + PrescriptionTools.getShortDescriptionAsCompactText(bhp.getPrescriptionSchedule().getPrescription()), MAX_TEXT_LENGTH) +
BHPTools.getScheduleText(bhp, "”, ", "")
)
// https://github.com/tloehr/Offene-Pflege.de/issues/63
+ " [" + bhp.getPrescriptionSchedule().getCheckAfterHours() + " " + SYSTools.xx("misc.msg.Hour(s)") + "] " + (bhp.isOpen() ? "--" : DateFormat.getTimeInstance(DateFormat.SHORT).format(bhp.getIst()) + " " + SYSTools.xx("misc.msg.Time.short")) +
(bhp.getPrescription().isWeightControlled() ? " " + SYSConst.html_16x16_scales_internal + (bhp.isOpen() ? "" : (bhp.getStockTransaction().isEmpty() ? " " : SYSTools.formatBigDecimal(bhp.getStockTransaction().get(0).getWeight()) + "g ")) : "") +
(bhp.getUser() != null ? ", <i>" + SYSTools.anonymizeUser(bhp.getUser().getUID()) + "</i>" : "") +
"</font></html>";
} else {
title = "<html><font size=+1>" +
SYSTools.left(PrescriptionTools.getShortDescriptionAsCompactText(bhp.getPrescriptionSchedule().getPrescription()), MAX_TEXT_LENGTH) +
(bhp.hasMed() ? ", <b>" + SYSTools.formatBigDecimal(bhp.getDose()) +
" " + DosageFormTools.getUsageText(bhp.getPrescription().getTradeForm().getDosageForm()) + "</b>" : "") +
BHPTools.getScheduleText(bhp, ", ", "") +
(bhp.getPrescription().isWeightControlled() ? " " + SYSConst.html_16x16_scales_internal + (bhp.isOpen() ? "" : (bhp.getStockTransaction().isEmpty() ? " " : SYSTools.formatBigDecimal(bhp.getStockTransaction().get(0).getWeight()) + "g ")) : "") +
(bhp.getUser() != null ? ", <i>" + SYSTools.anonymizeUser(bhp.getUser().getUID()) + "</i>" : "") +
"</font></html>";
}
DefaultCPTitle cptitle = new DefaultCPTitle(title, OPDE.getAppInfo().isAllowedTo(InternalClassACL.UPDATE, internalClassID) ? applyActionListener : null);
JLabel icon1 = new JLabel(BHPTools.getIcon(bhp));
icon1.setOpaque(false);
if (!bhp.isOpen()) {
icon1.setToolTipText("[" + bhp.getBHPid() + "] " + DateFormat.getDateTimeInstance().format(bhp.getIst()));
}
JLabel icon2 = new JLabel(BHPTools.getWarningIcon(bhp, stock));
icon2.setOpaque(false);
cptitle.getAdditionalIconPanel().add(icon1);
cptitle.getAdditionalIconPanel().add(icon2);
if (bhp.getPrescription().isClosed()) {
JLabel icon3 = new JLabel(SYSConst.icon22stopSign);
icon3.setOpaque(false);
cptitle.getAdditionalIconPanel().add(icon3);
}
if (bhp.isOutcomeText()) {
JLabel icon4 = new JLabel(SYSConst.icon22comment);
icon4.setOpaque(false);
cptitle.getAdditionalIconPanel().add(icon4);
}
if (!bhp.isOutcomeText() && bhp.getPrescriptionSchedule().getCheckAfterHours() != null) {
JLabel icon4 = new JLabel(SYSConst.icon22intervalBySecond);
icon4.setOpaque(false);
cptitle.getAdditionalIconPanel().add(icon4);
}
if (OPDE.getAppInfo().isAllowedTo(InternalClassACL.UPDATE, internalClassID)) {
if (!bhp.getPrescription().isClosed()) {
/***
* _ _ _ _
* | |__ | |_ _ __ / \ _ __ _ __ | |_ _
* | '_ \| __| '_ \ / _ \ | '_ \| '_ \| | | | |
* | |_) | |_| | | |/ ___ \| |_) | |_) | | |_| |
* |_.__/ \__|_| |_/_/ \_\ .__/| .__/|_|\__, |
* |_| |_| |___/
*/
JButton btnApply = new JButton(SYSConst.icon22apply);
btnApply.setPressedIcon(SYSConst.icon22applyPressed);
btnApply.setAlignmentX(Component.RIGHT_ALIGNMENT);
btnApply.setToolTipText(SYSTools.xx("nursingrecords.bhp.btnApply.tooltip"));
btnApply.addActionListener(applyActionListener);
btnApply.setContentAreaFilled(false);
btnApply.setBorder(null);
btnApply.setEnabled(bhp.isOpen() && (!bhp.hasMed() || mapPrescription2Stock.containsKey(bhp.getPrescription())));
cptitle.getRight().add(btnApply);
/***
* ____ _ _
* ___ _ __ ___ _ __ / ___|| |_ ___ ___| | __
* / _ \| '_ \ / _ \ '_ \\___ \| __/ _ \ / __| |/ /
* | (_) | |_) | __/ | | |___) | || (_) | (__| <
* \___/| .__/ \___|_| |_|____/ \__\___/ \___|_|\_\
* |_|
*/
if (bhp.hasMed() && stock == null && MedInventoryTools.getNextToOpen(TradeFormTools.getInventory4TradeForm(resident, bhp.getTradeForm())) != null) {
final JButton btnOpenStock = new JButton(SYSConst.icon22ledGreenOn);
btnOpenStock.setPressedIcon(SYSConst.icon22ledGreenOff);
btnOpenStock.setAlignmentX(Component.RIGHT_ALIGNMENT);
btnOpenStock.setContentAreaFilled(false);
btnOpenStock.setBorder(null);
btnOpenStock.setToolTipText(SYSTools.toHTMLForScreen(SYSTools.xx("nursingrecords.inventory.stock.btnopen.tooltip")));
btnOpenStock.addActionListener(actionEvent -> {
EntityManager em = OPDE.createEM();
try {
em.getTransaction().begin();
em.lock(em.merge(resident), LockModeType.OPTIMISTIC);
BHP myBHP = em.merge(bhp);
em.lock(myBHP, LockModeType.OPTIMISTIC);
em.lock(myBHP.getPrescriptionSchedule(), LockModeType.OPTIMISTIC);
em.lock(myBHP.getPrescription(), LockModeType.OPTIMISTIC);
MedStock myStock = em.merge(MedInventoryTools.openNext(TradeFormTools.getInventory4TradeForm(resident, myBHP.getTradeForm())));
em.lock(myStock, LockModeType.OPTIMISTIC);
em.getTransaction().commit();
OPDE.getDisplayManager().addSubMessage(new DisplayMessage(String.format(SYSTools.xx("newstocks.stock.has.been.opened"), myStock.getID().toString())));
reload();
} catch (OptimisticLockException ole) {
OPDE.warn(ole);
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
if (ole.getMessage().indexOf("Class> entity.info.Resident") > -1) {
OPDE.getMainframe().emptyFrame();
OPDE.getMainframe().afterLogin();
}
OPDE.getDisplayManager().addSubMessage(DisplayManager.getLockMessage());
} catch (Exception e) {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
OPDE.fatal(e);
} finally {
em.close();
}
});
cptitle.getRight().add(btnOpenStock);
}
if (!bhp.isOutcomeText()) {
/***
* _ _ ____ __
* | |__ | |_ _ __ | _ \ ___ / _|_ _ ___ ___
* | '_ \| __| '_ \| |_) / _ \ |_| | | / __|/ _ \
* | |_) | |_| | | | _ < __/ _| |_| \__ \ __/
* |_.__/ \__|_| |_|_| \_\___|_| \__,_|___/\___|
*
*/
final JButton btnRefuse = new JButton(SYSConst.icon22cancel);
btnRefuse.setPressedIcon(SYSConst.icon22cancelPressed);
btnRefuse.setAlignmentX(Component.RIGHT_ALIGNMENT);
btnRefuse.setContentAreaFilled(false);
btnRefuse.setBorder(null);
btnRefuse.setToolTipText(SYSTools.toHTMLForScreen(SYSTools.xx("nursingrecords.bhp.btnRefuse.tooltip")));
btnRefuse.addActionListener(actionEvent -> {
if (bhp.getState() != BHPTools.STATE_OPEN) {
return;
}
if (bhp.getPrescription().isClosed()) {
return;
}
if (BHPTools.isChangeable(bhp)) {
EntityManager em = OPDE.createEM();
try {
em.getTransaction().begin();
em.lock(em.merge(resident), LockModeType.OPTIMISTIC);
BHP myBHP = em.merge(bhp);
em.lock(myBHP, LockModeType.OPTIMISTIC);
em.lock(myBHP.getPrescriptionSchedule(), LockModeType.OPTIMISTIC);
em.lock(myBHP.getPrescription(), LockModeType.OPTIMISTIC);
myBHP.setState(BHPTools.STATE_REFUSED);
myBHP.setUser(em.merge(OPDE.getLogin().getUser()));
myBHP.setIst(new Date());
myBHP.setiZeit(SYSCalendar.whatTimeIDIs(new Date()));
myBHP.setMDate(new Date());
mapBHP2Pane.put(myBHP, createCP4(myBHP));
int position = mapShift2BHP.get(myBHP.getShift()).indexOf(bhp);
mapShift2BHP.get(bhp.getShift()).remove(position);
mapShift2BHP.get(bhp.getShift()).add(position, myBHP);
if (myBHP.isOnDemand()) {
Collections.sort(mapShift2BHP.get(myBHP.getShift()), BHPTools.getOnDemandComparator());
} else {
Collections.sort(mapShift2BHP.get(myBHP.getShift()));
}
em.getTransaction().commit();
mapShift2Pane.put(myBHP.getShift(), createCP4(myBHP.getShift()));
buildPanel(false);
} catch (OptimisticLockException ole) {
OPDE.warn(ole);
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
if (ole.getMessage().indexOf("Class> entity.info.Resident") > -1) {
OPDE.getMainframe().emptyFrame();
OPDE.getMainframe().afterLogin();
}
OPDE.getDisplayManager().addSubMessage(DisplayManager.getLockMessage());
} catch (Exception e) {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
OPDE.fatal(e);
} finally {
em.close();
}
} else {
OPDE.getDisplayManager().addSubMessage(new DisplayMessage(SYSTools.xx("nursingrecords.bhp.notchangeable")));
}
});
btnRefuse.setEnabled(!bhp.isOnDemand() && bhp.isOpen());
cptitle.getRight().add(btnRefuse);
/***
* _ _ ____ __ ____ _ _
* | |__ | |_ _ __ | _ \ ___ / _|_ _ ___ ___| _ \(_)___ ___ __ _ _ __ __| |
* | '_ \| __| '_ \| |_) / _ \ |_| | | / __|/ _ \ | | | / __|/ __/ _` | '__/ _` |
* | |_) | |_| | | | _ < __/ _| |_| \__ \ __/ |_| | \__ \ (_| (_| | | | (_| |
* |_.__/ \__|_| |_|_| \_\___|_| \__,_|___/\___|____/|_|___/\___\__,_|_| \__,_|
*
*/
final JButton btnRefuseDiscard = new JButton(SYSConst.icon22deleteall);
btnRefuseDiscard.setPressedIcon(SYSConst.icon22deleteallPressed);
btnRefuseDiscard.setAlignmentX(Component.RIGHT_ALIGNMENT);
btnRefuseDiscard.setContentAreaFilled(false);
btnRefuseDiscard.setBorder(null);
btnRefuseDiscard.setToolTipText(SYSTools.toHTMLForScreen(SYSTools.xx("nursingrecords.bhp.btnRefuseDiscard.tooltip")));
btnRefuseDiscard.addActionListener(actionEvent -> {
if (bhp.getState() != BHPTools.STATE_OPEN) {
return;
}
if (bhp.getPrescription().isClosed()) {
return;
}
if (BHPTools.isChangeable(bhp)) {
if (bhp.getPrescription().isWeightControlled()) {
currentEditor = new DlgYesNo(SYSConst.icon48scales, o -> {
if (SYSTools.catchNull(o).isEmpty()) {
weight = null;
} else {
weight = (BigDecimal) o;
}
currentEditor = null;
}, "nursingrecords.bhp.weight", null, new Validator<BigDecimal>() {
@Override
public boolean isValid(String value) {
BigDecimal bd = parse(value);
return bd != null && bd.compareTo(BigDecimal.ZERO) > 0;
}
@Override
public BigDecimal parse(String text) {
return SYSTools.parseDecimal(text);
}
});
currentEditor.setVisible(true);
}
if (bhp.getPrescription().isWeightControlled() && weight == null) {
OPDE.getDisplayManager().addSubMessage(new DisplayMessage("nursingrecords.bhp.noweight.nosuccess", DisplayMessage.WARNING));
return;
}
EntityManager em = OPDE.createEM();
try {
em.getTransaction().begin();
em.lock(em.merge(resident), LockModeType.OPTIMISTIC);
BHP myBHP = em.merge(bhp);
em.lock(myBHP, LockModeType.OPTIMISTIC);
em.lock(myBHP.getPrescriptionSchedule(), LockModeType.OPTIMISTIC);
em.lock(myBHP.getPrescription(), LockModeType.OPTIMISTIC);
myBHP.setState(BHPTools.STATE_REFUSED_DISCARDED);
myBHP.setUser(em.merge(OPDE.getLogin().getUser()));
myBHP.setIst(new Date());
myBHP.setiZeit(SYSCalendar.whatTimeIDIs(new Date()));
myBHP.setMDate(new Date());
if (myBHP.shouldBeCalculated()) {
MedInventory inventory = TradeFormTools.getInventory4TradeForm(resident, myBHP.getTradeForm());
if (inventory != null) {
MedInventoryTools.withdraw(em, em.merge(inventory), myBHP.getDose(), weight, myBHP);
} else {
OPDE.getDisplayManager().addSubMessage(new DisplayMessage("nursingrecords.bhp.NoInventory"));
}
}
mapBHP2Pane.put(myBHP, createCP4(myBHP));
int position = mapShift2BHP.get(myBHP.getShift()).indexOf(bhp);
mapShift2BHP.get(bhp.getShift()).remove(position);
mapShift2BHP.get(bhp.getShift()).add(position, myBHP);
if (myBHP.isOnDemand()) {
Collections.sort(mapShift2BHP.get(myBHP.getShift()), BHPTools.getOnDemandComparator());
} else {
Collections.sort(mapShift2BHP.get(myBHP.getShift()));
}
em.getTransaction().commit();
mapShift2Pane.put(myBHP.getShift(), createCP4(myBHP.getShift()));
buildPanel(false);
} catch (OptimisticLockException ole) {
OPDE.warn(ole);
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
if (ole.getMessage().indexOf("Class> entity.info.Resident") > -1) {
OPDE.getMainframe().emptyFrame();
OPDE.getMainframe().afterLogin();
}
OPDE.getDisplayManager().addSubMessage(DisplayManager.getLockMessage());
} catch (Exception e) {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
OPDE.fatal(e);
} finally {
em.close();
}
} else {
OPDE.getDisplayManager().addSubMessage(new DisplayMessage(SYSTools.xx("nursingrecords.bhp.notchangeable")));
}
});
btnRefuseDiscard.setEnabled(!bhp.isOnDemand() && bhp.hasMed() && bhp.shouldBeCalculated() && bhp.isOpen());
cptitle.getRight().add(btnRefuseDiscard);
}
/***
* _ _ _
* | | | |_ __ __| | ___
* | | | | '_ \ / _` |/ _ \
* | |_| | | | | (_| | (_) |
* \___/|_| |_|\__,_|\___/
*
*/
final JButton btnUndo = new JButton(SYSConst.icon22empty);
btnUndo.setPressedIcon(SYSConst.icon22emptyPressed);
btnUndo.setAlignmentX(Component.RIGHT_ALIGNMENT);
btnUndo.setContentAreaFilled(false);
btnUndo.setBorder(null);
btnUndo.setToolTipText(SYSTools.xx("nursingrecords.bhp.btnEmpty.tooltip"));
btnUndo.addActionListener(actionEvent -> {
if (bhp.getState() == BHPTools.STATE_OPEN) {
return;
}
if (bhp.getPrescription().isClosed()) {
return;
}
BHP outcomeBHP = BHPTools.getComment(bhp);
if (outcomeBHP != null && !outcomeBHP.isOpen()) {
// already commented
return;
}
if (BHPTools.isChangeable(bhp)) {
EntityManager em = OPDE.createEM();
try {
em.getTransaction().begin();
em.lock(em.merge(resident), LockModeType.OPTIMISTIC);
BHP myBHP = em.merge(bhp);
em.lock(myBHP, LockModeType.OPTIMISTIC);
em.lock(myBHP.getPrescriptionSchedule(), LockModeType.OPTIMISTIC);
em.lock(myBHP.getPrescription(), LockModeType.OPTIMISTIC);
// the normal BHPs (those assigned to a NursingProcess) are reset to the OPEN state.
// TXs are deleted
myBHP.setState(BHPTools.STATE_OPEN);
myBHP.setUser(null);
myBHP.setIst(null);
myBHP.setiZeit(null);
myBHP.setMDate(new Date());
myBHP.setText(null);
if (myBHP.shouldBeCalculated()) {
for (MedStockTransaction tx : myBHP.getStockTransaction()) {
em.remove(tx);
}
myBHP.getStockTransaction().clear();
}
if (outcomeBHP != null) {
BHP myOutcomeBHP = em.merge(outcomeBHP);
em.remove(myOutcomeBHP);
}
if (myBHP.isOnDemand()) {
em.remove(myBHP);
}
em.getTransaction().commit();
if (myBHP.isOnDemand()) {
reload();
} else {
mapBHP2Pane.put(myBHP, createCP4(myBHP));
int position = mapShift2BHP.get(myBHP.getShift()).indexOf(bhp);
mapShift2BHP.get(bhp.getShift()).remove(position);
mapShift2BHP.get(bhp.getShift()).add(position, myBHP);
if (myBHP.isOnDemand()) {
Collections.sort(mapShift2BHP.get(myBHP.getShift()), BHPTools.getOnDemandComparator());
} else {
Collections.sort(mapShift2BHP.get(myBHP.getShift()));
}
mapShift2Pane.put(myBHP.getShift(), createCP4(myBHP.getShift()));
buildPanel(false);
}
} catch (OptimisticLockException ole) {
OPDE.warn(ole);
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
if (ole.getMessage().indexOf("Class> entity.info.Resident") > -1) {
OPDE.getMainframe().emptyFrame();
OPDE.getMainframe().afterLogin();
}
OPDE.getDisplayManager().addSubMessage(DisplayManager.getLockMessage());
} catch (Exception e) {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
OPDE.fatal(e);
} finally {
em.close();
}
} else {
OPDE.getDisplayManager().addSubMessage(new DisplayMessage(SYSTools.xx("nursingrecords.bhp.notchangeable")));
}
});
btnUndo.setEnabled(!bhp.isOpen());
cptitle.getRight().add(btnUndo);
}
/***
* _ _ ___ __
* | |__ | |_ _ __ |_ _|_ __ / _| ___
* | '_ \| __| '_ \ | || '_ \| |_ / _ \
* | |_) | |_| | | || || | | | _| (_) |
* |_.__/ \__|_| |_|___|_| |_|_| \___/
*
*/
final JButton btnInfo = new JButton(SYSConst.icon22info);
btnInfo.setPressedIcon(SYSConst.icon22infoPressed);
btnInfo.setAlignmentX(Component.RIGHT_ALIGNMENT);
btnInfo.setContentAreaFilled(false);
btnInfo.setBorder(null);
btnInfo.setToolTipText(SYSTools.xx("nursingrecords.bhp.btnInfo.tooltip"));
final JTextPane txt = new JTextPane();
txt.setContentType("text/html");
txt.setEditable(false);
final JidePopup popupInfo = new JidePopup();
popupInfo.setMovable(false);
popupInfo.setContentPane(new JScrollPane(txt));
popupInfo.removeExcludedComponent(txt);
popupInfo.setDefaultFocusComponent(txt);
btnInfo.addActionListener(actionEvent -> {
popupInfo.setOwner(btnInfo);
if (bhp.isOutcomeText() && !bhp.isOpen()) {
txt.setText(SYSTools.toHTML(SYSConst.html_div(bhp.getText())));
} else {
txt.setText(SYSTools.toHTML(SYSConst.html_div(bhp.getPrescription().getText())));
}
// txt.setText(SYSTools.toHTML(SYSConst.html_div(bhp.getPrescription().getText())));
GUITools.showPopup(popupInfo, SwingConstants.SOUTH_WEST);
});
if (bhp.isOutcomeText() && !bhp.isOpen()) {
btnInfo.setEnabled(true);
} else {
btnInfo.setEnabled(!SYSTools.catchNull(bhp.getPrescription().getText()).isEmpty());
}
cptitle.getRight().add(btnInfo);
}
bhpPane.setTitleLabelComponent(cptitle.getMain());
bhpPane.setSlidingDirection(SwingConstants.SOUTH);
final JTextPane contentPane = new JTextPane();
contentPane.setEditable(false);
contentPane.setContentType("text/html");
bhpPane.setContentPane(contentPane);
bhpPane.setBackground(SYSCalendar.getBGItem(bhp.getShift()));
bhpPane.setForeground(SYSCalendar.getFGItem(bhp.getShift()));
try {
bhpPane.setCollapsed(true);
} catch (PropertyVetoException e) {
OPDE.error(e);
}
bhpPane.addCollapsiblePaneListener(new CollapsiblePaneAdapter() {
@Override
public void paneExpanded(CollapsiblePaneEvent collapsiblePaneEvent) {
contentPane.setText(SYSTools.toHTML(PrescriptionTools.getPrescriptionAsHTML(bhp.getPrescription(), false, false, true, false)));
}
});
bhpPane.setHorizontalAlignment(SwingConstants.LEADING);
bhpPane.setOpaque(false);
return bhpPane;
}
/**
* This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the PrinterForm Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jspBHP = new JScrollPane();
cpBHP = new CollapsiblePanes();
//======== this ========
setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
//======== jspBHP ========
{
jspBHP.setBorder(null);
//======== cpBHP ========
{
cpBHP.setLayout(new BoxLayout(cpBHP, BoxLayout.X_AXIS));
}
jspBHP.setViewportView(cpBHP);
}
add(jspBHP);
}// </editor-fold>//GEN-END:initComponents
private void prepareSearchArea() {
searchPanes = new CollapsiblePanes();
searchPanes.setLayout(new JideBoxLayout(searchPanes, JideBoxLayout.Y_AXIS));
jspSearch.setViewportView(searchPanes);
JPanel mypanel = new JPanel();
mypanel.setLayout(new VerticalLayout());
mypanel.setBackground(Color.WHITE);
CollapsiblePane searchPane = new CollapsiblePane(SYSTools.xx(internalClassID));
searchPane.setStyle(CollapsiblePane.PLAIN_STYLE);
searchPane.setCollapsible(false);
try {
searchPane.setCollapsed(false);
} catch (PropertyVetoException e) {
OPDE.error(e);
}
GUITools.addAllComponents(searchPanes, addCommands());
GUITools.addAllComponents(searchPanes, addFilter());
GUITools.addAllComponents(searchPanes, addKey());
searchPanes.addExpansion();
}
private java.util.List<Component> addKey() {
java.util.List<Component> list = new ArrayList<Component>();
list.add(new JSeparator());
list.add(new JLabel(SYSTools.xx("misc.msg.key")));
list.add(new JLabel(SYSTools.xx("nursingrecords.bhp.keydescription3"), SYSConst.icon22stopSign, SwingConstants.LEADING));
list.add(new JLabel(SYSTools.xx("nursingrecords.bhp.keydescription1"), SYSConst.icon22ledYellowOn, SwingConstants.LEADING));
list.add(new JLabel(SYSTools.xx("nursingrecords.bhp.keydescription2"), SYSConst.icon22ledRedOn, SwingConstants.LEADING));
list.add(new JLabel(SYSTools.xx("nursingrecords.bhp.keydescription4"), SYSConst.icon22ledOrangeOn, SwingConstants.LEADING));
return list;
}
private java.util.List<Component> addFilter() {
java.util.List<Component> list = new ArrayList<Component>();
jdcDatum = new JDateChooser(new Date());
jdcDatum.setFont(new Font("Arial", Font.PLAIN, 18));
jdcDatum.setMinSelectableDate(BHPTools.getMinDatum(resident));
jdcDatum.setBackground(Color.WHITE);
jdcDatum.addPropertyChangeListener(evt -> {
if (initPhase) {
return;
}
if (evt.getPropertyName().equals("date")) {
reloadDisplay();
}
});
list.add(jdcDatum);
JPanel buttonPanel = new JPanel();
buttonPanel.setBackground(Color.WHITE);
buttonPanel.setLayout(new HorizontalLayout(5));
buttonPanel.setBorder(new EmptyBorder(0, 0, 0, 0));
JButton homeButton = new JButton(new ImageIcon(getClass().getResource("/artwork/32x32/bw/player_start.png")));
homeButton.addActionListener(actionEvent -> jdcDatum.setDate(jdcDatum.getMinSelectableDate()));
homeButton.setPressedIcon(new ImageIcon(getClass().getResource("/artwork/32x32/bw/player_start_pressed.png")));
homeButton.setBorder(null);
homeButton.setBorderPainted(false);
homeButton.setOpaque(false);
homeButton.setContentAreaFilled(false);
homeButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
JButton backButton = new JButton(new ImageIcon(getClass().getResource("/artwork/32x32/bw/player_back.png")));
backButton.addActionListener(actionEvent -> {
DateMidnight current = new DateMidnight(jdcDatum.getDate());
DateMidnight min = new DateMidnight(jdcDatum.getMinSelectableDate());
if (current.equals(min)) {
return;
}
jdcDatum.setDate(SYSCalendar.addDate(jdcDatum.getDate(), -1));
});
backButton.setPressedIcon(new ImageIcon(getClass().getResource("/artwork/32x32/bw/player_back_pressed.png")));
backButton.setBorder(null);
backButton.setBorderPainted(false);
backButton.setOpaque(false);
backButton.setContentAreaFilled(false);
backButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
JButton fwdButton = new JButton(new ImageIcon(getClass().getResource("/artwork/32x32/bw/player_play.png")));
fwdButton.addActionListener(actionEvent -> {
DateMidnight current = new DateMidnight(jdcDatum.getDate());
if (current.equals(new DateMidnight())) {
return;
}
jdcDatum.setDate(SYSCalendar.addDate(jdcDatum.getDate(), 1));
});
fwdButton.setPressedIcon(new ImageIcon(getClass().getResource("/artwork/32x32/bw/player_play_pressed.png")));
fwdButton.setBorder(null);
fwdButton.setBorderPainted(false);
fwdButton.setOpaque(false);
fwdButton.setContentAreaFilled(false);
fwdButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
JButton endButton = new JButton(new ImageIcon(getClass().getResource("/artwork/32x32/bw/player_end.png")));
endButton.addActionListener(actionEvent -> jdcDatum.setDate(new Date()));
endButton.setPressedIcon(new ImageIcon(getClass().getResource("/artwork/32x32/bw/player_end_pressed.png")));
endButton.setBorder(null);
endButton.setBorderPainted(false);
endButton.setOpaque(false);
endButton.setContentAreaFilled(false);
endButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
buttonPanel.add(homeButton);
buttonPanel.add(backButton);
buttonPanel.add(fwdButton);
buttonPanel.add(endButton);
list.add(buttonPanel);
// panelFilter.setContentPane(labelPanel);
return list;
}
private java.util.List<Component> addCommands() {
java.util.List<Component> list = new ArrayList<Component>();
if (OPDE.getAppInfo().isAllowedTo(InternalClassACL.PRINT, internalClassID)) {
final JideButton printPrescription = GUITools.createHyperlinkButton("nursingrecords.dfn.print", SYSConst.icon22print2, actionEvent -> {
String html = "";
synchronized (mapShift2BHP) {
html += "<h1 id=\"fonth1\" >" + ResidentTools.getFullName(resident) + "</h1>";
html += SYSConst.html_h2(SYSTools.xx("nursingrecords.bhp") + ": " + SYSConst.html_bold(DateFormat.getDateInstance().format(jdcDatum.getDate())));
for (Byte shift : new Byte[]{SYSCalendar.SHIFT_ON_DEMAND, SYSCalendar.SHIFT_OUTCOMES, SYSCalendar.SHIFT_VERY_EARLY, SYSCalendar.SHIFT_EARLY, SYSCalendar.SHIFT_LATE, SYSCalendar.SHIFT_VERY_LATE}) {
if (mapShift2BHP.containsKey(shift)) {
html += BHPTools.getBHPsAsHTMLtable(mapShift2BHP.get(shift), true);
}
}
}
SYSFilesTools.print(html, true);
});
list.add(printPrescription);
}
return list;
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private JScrollPane jspBHP;
private CollapsiblePanes cpBHP;
// End of variables declaration//GEN-END:variables
}