/* * 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.supervisor; 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.swing.JideBoxLayout; import com.jidesoft.swing.JideButton; import entity.building.Homes; import entity.building.HomesTools; import entity.files.SYSFilesTools; import entity.info.Resident; import entity.info.ResidentTools; import entity.reports.*; import entity.system.SYSPropsTools; import gui.GUITools; import gui.interfaces.DefaultCPTitle; import op.OPDE; import op.system.InternalClassACL; import op.threads.DisplayManager; import op.threads.DisplayMessage; import op.tools.*; import org.apache.commons.collections.Closure; import org.jdesktop.swingx.JXComboBox; import org.jdesktop.swingx.JXSearchField; import org.jdesktop.swingx.VerticalLayout; import org.joda.time.DateTime; import org.joda.time.DateTimeConstants; import org.joda.time.LocalDate; import org.joda.time.MutableInterval; import javax.persistence.EntityManager; 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.beans.PropertyVetoException; import java.text.DateFormat; import java.text.Format; import java.text.SimpleDateFormat; import java.util.*; import java.util.List; public class PnlHandover extends NursingRecordsPanel { private JXSearchField txtSearch; private JComboBox yearCombo; private JScrollPane jspSearch; private CollapsiblePanes searchPanes; private Map<String, CollapsiblePane> cpMap; private Map<String, ArrayList<Handovers>> cacheHO; private Map<String, ArrayList<NReport>> cacheNR; private HashMap<LocalDate, String> hollidays; private JComboBox cmbHomes; private JToggleButton tbResidentFirst; private Comparator myComparator; Format monthFormatter = new SimpleDateFormat("MMMM yyyy"); Format dayFormat = new SimpleDateFormat("EEEE, dd.MM.yyyy"); int checkWeeksbackForNewReports = 4; /** * Creates new form PnlHandover */ public PnlHandover(JScrollPane jspSearch) { super("nursingrecords.handover"); this.jspSearch = jspSearch; initComponents(); initPanel(); // jdcDatum.setDate(SYSCalendar.today_date()); reloadDisplay(); } @Override public void reload() { reloadDisplay(); } 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.handover.keydescription1"), SYSConst.icon22ledRedOn, SwingConstants.LEADING)); list.add(new JLabel(SYSTools.xx("nursingrecords.handover.keydescription2"), SYSConst.icon22ledGreenOn, SwingConstants.LEADING)); return list; } private void initPanel() { myComparator = (Comparator<NReport>) (o1, o2) -> { if (!tbResidentFirst.isSelected()) { return o1.getPit().compareTo(o2.getPit()); } else { int comp = o1.getResident().getRID().compareTo(o2.getResident().getRID()); if (comp == 0) { comp = o1.getPit().compareTo(o2.getPit()); } return comp; } }; cpMap = Collections.synchronizedMap(new HashMap<String, CollapsiblePane>()); cacheHO = Collections.synchronizedMap(new HashMap<String, ArrayList<Handovers>>()); cacheNR = Collections.synchronizedMap(new HashMap<String, ArrayList<NReport>>()); OPDE.getDisplayManager().setMainMessage(SYSTools.xx(internalClassID)); prepareSearchArea(); } @Override public void switchResident(Resident resident) { } /** * 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() { jspHandover = new JScrollPane(); cpsHandover = new CollapsiblePanes(); //======== this ======== setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); //======== jspHandover ======== { //======== cpsHandover ======== { cpsHandover.setLayout(new BoxLayout(cpsHandover, BoxLayout.X_AXIS)); } jspHandover.setViewportView(cpsHandover); } add(jspHandover); }// </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(2)); 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(mypanel, addCommands()); GUITools.addAllComponents(mypanel, addFilters()); GUITools.addAllComponents(mypanel, addKey()); searchPane.setContentPane(mypanel); searchPanes.add(searchPane); searchPanes.addExpansion(); } @Override public void cleanup() { super.cleanup(); cpsHandover.removeAll(); synchronized (cpMap) { SYSTools.clear(cpMap); } synchronized (cacheHO) { SYSTools.clear(cacheHO); } synchronized (cacheNR) { SYSTools.clear(cacheNR); } SYSTools.clear(hollidays); } @Override public String getInternalClassID() { return internalClassID; } private void reloadDisplay() { /*** * _ _ ____ _ _ * _ __ ___| | ___ __ _ __| | _ \(_)___ _ __ | | __ _ _ _ * | '__/ _ \ |/ _ \ / _` |/ _` | | | | / __| '_ \| |/ _` | | | | * | | | __/ | (_) | (_| | (_| | |_| | \__ \ |_) | | (_| | |_| | * |_| \___|_|\___/ \__,_|\__,_|____/|_|___/ .__/|_|\__,_|\__, | * |_| |___/ */ synchronized (cpMap) { SYSTools.clear(cpMap); } synchronized (cacheHO) { SYSTools.clear(cacheHO); } synchronized (cacheNR) { SYSTools.clear(cacheNR); } MutableInterval minmax = NReportTools.getMinMax(); if (minmax != null) { hollidays = SYSCalendar.getHolidays(minmax.getStart().getYear(), minmax.getEnd().getYear()); LocalDate start = SYSCalendar.bom(minmax.getStart()).toLocalDate(); LocalDate end = new LocalDate(); for (int year = end.getYear(); year >= start.getYear(); year--) { createCP4Year(year, start, end); } } expandDay(new LocalDate()); buildPanel(); } private void expandDay(LocalDate day) { final String keyYear = Integer.toString(day.getYear()) + ".year"; if (cpMap.containsKey(keyYear) && cpMap.get(keyYear).isCollapsed()) { try { cpMap.get(keyYear).setCollapsed(false); } catch (PropertyVetoException e) { // bah! } } final String keyMonth = monthFormatter.format(day.toDate()) + ".month"; if (cpMap.containsKey(keyMonth) && cpMap.get(keyMonth).isCollapsed()) { try { cpMap.get(keyMonth).setCollapsed(false); } catch (PropertyVetoException e) { // bah! } } final String keyDay = DateFormat.getDateInstance().format(day.toDate()); if (cpMap.containsKey(keyDay) && cpMap.get(keyDay).isCollapsed()) { try { cpMap.get(keyDay).setCollapsed(false); } catch (PropertyVetoException e) { // bah! } } } private CollapsiblePane createCP4Year(final int year, LocalDate min, LocalDate max) { /*** * _ ____ ____ __ __ _______ _ ____ * ___ _ __ ___ __ _| |_ ___ / ___| _ \ / _| ___ _ __ \ \ / / ____| / \ | _ \ * / __| '__/ _ \/ _` | __/ _ \ | | |_) | | |_ / _ \| '__| \ V /| _| / _ \ | |_) | * | (__| | | __/ (_| | || __/ |___| __/ | _| (_) | | | | | |___ / ___ \| _ < * \___|_| \___|\__,_|\__\___|\____|_| |_| \___/|_| |_| |_____/_/ \_\_| \_\ * */ final LocalDate start = new LocalDate(year, 1, 1).isBefore(min.dayOfMonth().withMinimumValue()) ? min.dayOfMonth().withMinimumValue() : new LocalDate(year, 1, 1); final LocalDate end = new LocalDate(year, 12, 31).isAfter(max.dayOfMonth().withMaximumValue()) ? max.dayOfMonth().withMaximumValue() : new LocalDate(year, 12, 31); final String keyYear = Integer.toString(year) + ".year"; synchronized (cpMap) { if (!cpMap.containsKey(keyYear)) { cpMap.put(keyYear, new CollapsiblePane()); try { cpMap.get(keyYear).setCollapsed(true); } catch (PropertyVetoException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } } final CollapsiblePane cpYear = cpMap.get(keyYear); String title = "<html><font size=+1>" + "<b>" + Integer.toString(year) + "</b>" + "</font></html>"; DefaultCPTitle cptitle = new DefaultCPTitle(title, e -> { try { cpYear.setCollapsed(!cpYear.isCollapsed()); } catch (PropertyVetoException pve) { // BAH! } }); cpYear.setTitleLabelComponent(cptitle.getMain()); cpYear.setSlidingDirection(SwingConstants.SOUTH); cpYear.setBackground(SYSConst.orange1[SYSConst.medium3]); cpYear.setOpaque(true); /*** * _ _ _ _ * ___| (_) ___| | _____ __| | ___ _ __ _ _ ___ __ _ _ __ * / __| | |/ __| |/ / _ \/ _` | / _ \| '_ \ | | | |/ _ \/ _` | '__| * | (__| | | (__| < __/ (_| | | (_) | | | | | |_| | __/ (_| | | * \___|_|_|\___|_|\_\___|\__,_| \___/|_| |_| \__, |\___|\__,_|_| * |___/ */ cpYear.addCollapsiblePaneListener(new CollapsiblePaneAdapter() { @Override public void paneExpanded(CollapsiblePaneEvent collapsiblePaneEvent) { JPanel pnlContent = new JPanel(new VerticalLayout()); // somebody clicked on the year for (LocalDate month = end; month.compareTo(start) >= 0; month = month.minusMonths(1)) { pnlContent.add(createCP4Month(month)); } cpYear.setContentPane(pnlContent); } }); if (!cpYear.isCollapsed()) { JPanel pnlContent = new JPanel(new VerticalLayout()); for (LocalDate month = end; month.compareTo(start) >= 0; month = month.minusMonths(1)) { pnlContent.add(createCP4Month(month)); } cpYear.setContentPane(pnlContent); cpYear.setOpaque(false); } cpYear.setHorizontalAlignment(SwingConstants.LEADING); cpYear.setOpaque(false); return cpYear; } private CollapsiblePane createCP4Month(final LocalDate month) { /*** * _ ____ ____ __ __ __ ___ _ _ _____ _ _ * ___ _ __ ___ __ _| |_ ___ / ___| _ \ / _| ___ _ __ __ _ | \/ |/ _ \| \ | |_ _| | | | * / __| '__/ _ \/ _` | __/ _ \ | | |_) | | |_ / _ \| '__| / _` | | |\/| | | | | \| | | | | |_| | * | (__| | | __/ (_| | || __/ |___| __/ | _| (_) | | | (_| | | | | | |_| | |\ | | | | _ | * \___|_| \___|\__,_|\__\___|\____|_| |_| \___/|_| \__,_| |_| |_|\___/|_| \_| |_| |_| |_| * */ final String key = monthFormatter.format(month.toDate()) + ".month"; synchronized (cpMap) { if (!cpMap.containsKey(key)) { cpMap.put(key, new CollapsiblePane()); try { cpMap.get(key).setCollapsed(true); } catch (PropertyVetoException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } } final CollapsiblePane cpMonth = cpMap.get(key); String title = "<html><font size=+1><b>" + monthFormatter.format(month.toDate()) + "</b>" + "</font></html>"; DefaultCPTitle cptitle = new DefaultCPTitle(title, e -> { try { cpMonth.setCollapsed(!cpMonth.isCollapsed()); } catch (PropertyVetoException pve) { // BAH! } }); cpMonth.setTitleLabelComponent(cptitle.getMain()); cpMonth.setSlidingDirection(SwingConstants.SOUTH); cpMonth.setBackground(SYSConst.orange1[SYSConst.medium2]); cpMonth.setOpaque(true); cpMonth.setHorizontalAlignment(SwingConstants.LEADING); cpMonth.addCollapsiblePaneListener(new CollapsiblePaneAdapter() { @Override public void paneExpanded(CollapsiblePaneEvent collapsiblePaneEvent) { cpMonth.setContentPane(createContentPanel4Month(month)); } }); if (!cpMonth.isCollapsed()) { cpMonth.setContentPane(createContentPanel4Month(month)); } return cpMonth; } private JPanel createContentPanel4Month(LocalDate month) { /*** * _ _ __ __ __ ___ _ _ _____ _ _ * ___ ___ _ __ | |_ ___ _ __ | |_ / _| ___ _ __ | \/ |/ _ \| \ | |_ _| | | | * / __/ _ \| '_ \| __/ _ \ '_ \| __| | |_ / _ \| '__| | |\/| | | | | \| | | | | |_| | * | (_| (_) | | | | || __/ | | | |_ | _| (_) | | | | | | |_| | |\ | | | | _ | * \___\___/|_| |_|\__\___|_| |_|\__| |_| \___/|_| |_| |_|\___/|_| \_| |_| |_| |_| * */ JPanel pnlMonth = new JPanel(new VerticalLayout()); pnlMonth.setOpaque(false); LocalDate now = new LocalDate(); boolean sameMonth = now.dayOfMonth().withMaximumValue().equals(month.dayOfMonth().withMaximumValue()); final LocalDate start = sameMonth ? now : month.dayOfMonth().withMaximumValue(); final LocalDate end = month.dayOfMonth().withMinimumValue(); for (LocalDate day = start; end.compareTo(day) <= 0; day = day.minusDays(1)) { pnlMonth.add(createCP4Day(day)); } return pnlMonth; } private CollapsiblePane createCP4Day(final LocalDate day) { final String key = DateFormat.getDateInstance().format(day.toDate()); synchronized (cpMap) { if (!cpMap.containsKey(key)) { cpMap.put(key, new CollapsiblePane()); try { cpMap.get(key).setCollapsed(true); } catch (PropertyVetoException e) { e.printStackTrace(); } } } final CollapsiblePane cpDay = cpMap.get(key); if (hollidays == null) { hollidays = SYSCalendar.getHolidays(day.getYear(), day.getYear()); } String titleDay = "<html><font size=+1>" + dayFormat.format(day.toDate()) + SYSTools.catchNull(hollidays.get(day), " (", ")") + "</font></html>"; final DefaultCPTitle titleCPDay = new DefaultCPTitle(titleDay, e -> { try { cpDay.setCollapsed(!cpDay.isCollapsed()); } catch (PropertyVetoException pve) { // BAH! } }); final JButton btnAcknowledge = new JButton(SYSConst.icon163ledGreenOn); btnAcknowledge.setAlignmentX(Component.RIGHT_ALIGNMENT); btnAcknowledge.setToolTipText(SYSTools.xx("nursingrecords.handover.tooltips.btnAcknowledge")); btnAcknowledge.addActionListener(actionEvent -> { EntityManager em = OPDE.createEM(); try { em.getTransaction().begin(); synchronized (cacheHO) { ArrayList<Handovers> listHO = new ArrayList<Handovers>(cacheHO.get(key)); for (final Handovers ho : listHO) { if (!Handover2UserTools.containsUser(em, ho, OPDE.getLogin().getUser())) { Handovers myHO = em.merge(ho); Handover2User connObj = em.merge(new Handover2User(myHO, em.merge(OPDE.getLogin().getUser()))); myHO.getUsersAcknowledged().add(connObj); } } } synchronized (cacheNR) { ArrayList<NReport> listNR = new ArrayList<NReport>(cacheNR.get(key)); for (final NReport nreport : listNR) { if (!NR2UserTools.containsUser(em, nreport, OPDE.getLogin().getUser())) { NReport myNR = em.merge(nreport); NR2User connObj = em.merge(new NR2User(myNR, em.merge(OPDE.getLogin().getUser()))); myNR.getUsersAcknowledged().add(connObj); } } } em.getTransaction().commit(); createCP4Day(day); buildPanel(); } 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(); } }); titleCPDay.getRight().add(btnAcknowledge); cpDay.setTitleLabelComponent(titleCPDay.getMain()); cpDay.setSlidingDirection(SwingConstants.SOUTH); if (hollidays.containsKey(day)) { cpDay.setBackground(SYSConst.red1[SYSConst.medium1]); } else if (day.getDayOfWeek() == DateTimeConstants.SATURDAY || day.getDayOfWeek() == DateTimeConstants.SUNDAY) { cpDay.setBackground(SYSConst.red1[SYSConst.light3]); } else { cpDay.setBackground(SYSConst.orange1[SYSConst.light3]); } cpDay.setOpaque(true); cpDay.setHorizontalAlignment(SwingConstants.LEADING); cpDay.setStyle(CollapsiblePane.PLAIN_STYLE); cpDay.addCollapsiblePaneListener(new CollapsiblePaneAdapter() { @Override public void paneExpanded(CollapsiblePaneEvent collapsiblePaneEvent) { createContentPanel4Day(day, cpDay); btnAcknowledge.setEnabled(true); } @Override public void paneCollapsed(CollapsiblePaneEvent collapsiblePaneEvent) { btnAcknowledge.setEnabled(false); } }); btnAcknowledge.setEnabled(!cpDay.isCollapsed()); if (!cpDay.isCollapsed()) { createContentPanel4Day(day, cpDay); } return cpDay; } private void createContentPanel4Day(final LocalDate day, final CollapsiblePane cpDay) { final JPanel dayPanel = new JPanel(new VerticalLayout()); OPDE.getDisplayManager().setProgressBarMessage(new DisplayMessage(SYSTools.xx("misc.msg.wait"), -1, 100)); OPDE.getMainframe().setBlocked(true); SwingWorker worker = new SwingWorker() { @Override protected Object doInBackground() throws Exception { // final JPanel dayPanel = new JPanel(new VerticalLayout()); dayPanel.setOpaque(false); ArrayList<Handovers> listHO = HandoversTools.getBy(day, (Homes) cmbHomes.getSelectedItem()); ArrayList<NReport> listNR = NReportTools.getNReports4Handover(day, (Homes) cmbHomes.getSelectedItem()); Collections.sort(listNR, myComparator); int max = listHO.size() + listNR.size(); int i = 0; // for zebra pattern and progress for (final Handovers handover : listHO) { OPDE.getDisplayManager().setProgressBarMessage(new DisplayMessage(SYSTools.xx("misc.msg.wait"), i, max)); String title = "<html><table border=\"0\">" + "<tr valign=\"top\">" + "<td width=\"100\" align=\"left\">" + DateFormat.getTimeInstance(DateFormat.SHORT).format(handover.getPit()) + " " + SYSTools.xx("misc.msg.Time.short") + "</td>" + "<td width=\"100\" align=\"center\">--</td>" + "<td width=\"400\" align=\"left\">" + handover.getText() + "</td>" + "<td width=\"100\" align=\"left\">" + handover.getUser().getFullname() + "</td>" + "</tr>" + "</table>" + "</html>"; final DefaultCPTitle pnlSingle = new DefaultCPTitle(SYSTools.toHTMLForScreen(title), evt -> { EntityManager em = OPDE.createEM(); if (Handover2UserTools.containsUser(em, handover, OPDE.getLogin().getUser())) { em.close(); return; } try { em.getTransaction().begin(); Handovers myHO = em.merge(handover); Handover2User connObj = em.merge(new Handover2User(myHO, em.merge(OPDE.getLogin().getUser()))); myHO.getUsersAcknowledged().add(connObj); em.getTransaction().commit(); createCP4Day(day); buildPanel(); } 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(); } }); final JButton btnInfo = new JButton(SYSConst.icon22info); btnInfo.setPressedIcon(SYSConst.icon22infoPressed); btnInfo.setAlignmentX(Component.RIGHT_ALIGNMENT); btnInfo.setAlignmentY(Component.TOP_ALIGNMENT); btnInfo.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); btnInfo.setContentAreaFilled(false); btnInfo.setBorder(null); btnInfo.addActionListener(e -> { OPDE.getDisplayManager().setProgressBarMessage(new DisplayMessage(SYSTools.xx("misc.msg.wait"), -1, 100)); OPDE.getMainframe().setBlocked(true); SwingWorker worker1 = new SwingWorker() { @Override protected Object doInBackground() throws Exception { SYSFilesTools.print(Handover2UserTools.getAsHTML(handover), false); return null; } @Override protected void done() { try { get(); } catch (Exception ex1) { OPDE.fatal(ex1); } OPDE.getDisplayManager().setProgressBarMessage(null); OPDE.getMainframe().setBlocked(false); } }; worker1.execute(); }); pnlSingle.getRight().add(btnInfo); EntityManager em = OPDE.createEM(); pnlSingle.getButton().setIcon(Handover2UserTools.containsUser(em, handover, OPDE.getLogin().getUser()) ? SYSConst.icon22ledGreenOn : SYSConst.icon22ledRedOn); em.close(); pnlSingle.getButton().setVerticalTextPosition(SwingConstants.TOP); JPanel zebra = new JPanel(); zebra.setLayout(new BoxLayout(zebra, BoxLayout.LINE_AXIS)); zebra.setOpaque(true); if (i % 2 == 0) { zebra.setBackground(SYSConst.orange1[SYSConst.light2]); } else { zebra.setBackground(Color.WHITE); } zebra.add(pnlSingle.getMain()); i++; dayPanel.add(zebra); } for (final NReport nreport : listNR) { OPDE.getDisplayManager().setProgressBarMessage(new DisplayMessage(SYSTools.xx("misc.msg.wait"), i, max)); String title = "<html><table border=\"0\">" + "<tr valign=\"top\">" + "<td width=\"100\" align=\"left\">" + DateFormat.getTimeInstance(DateFormat.SHORT).format(nreport.getPit()) + " " + SYSTools.xx("misc.msg.Time.short") + "<br/>" + nreport.getMinutes() + " " + SYSTools.xx("misc.msg.Minute(s)") + "</td>" + "<td width=\"100\" align=\"left\">" + ResidentTools.getTextCompact(nreport.getResident()) + "</td>" + "<td width=\"400\" align=\"left\">" + nreport.getText() + "</td>" + "<td width=\"100\" align=\"left\">" + nreport.getNewBy().getFullname() + "</td>" + "</tr>" + "</table>" + "</html>"; final DefaultCPTitle pnlSingle = new DefaultCPTitle(SYSTools.toHTMLForScreen(title), evt -> { EntityManager em = OPDE.createEM(); if (NR2UserTools.containsUser(em, nreport, OPDE.getLogin().getUser())) { em.close(); return; } try { em.getTransaction().begin(); NReport myNR = em.merge(nreport); NR2User connObj = em.merge(new NR2User(myNR, em.merge(OPDE.getLogin().getUser()))); myNR.getUsersAcknowledged().add(connObj); em.getTransaction().commit(); createCP4Day(day); buildPanel(); } 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(); } }); final JButton btnInfo = new JButton(SYSConst.icon22info); btnInfo.setPressedIcon(SYSConst.icon22infoPressed); btnInfo.setAlignmentX(Component.RIGHT_ALIGNMENT); btnInfo.setAlignmentY(Component.TOP_ALIGNMENT); btnInfo.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); btnInfo.setContentAreaFilled(false); btnInfo.setBorder(null); btnInfo.addActionListener(e -> { SYSFilesTools.print(NR2UserTools.getAsHTML(nreport), false); // OPDE.getDisplayManager().setProgressBarMessage(new DisplayMessage(SYSTools.xx("misc.msg.wait"), -1, 100)); // OPDE.getMainframe().setBlocked(true); // // SwingWorker worker = new SwingWorker() { // // @Override // protected Object doInBackground() throws Exception { // // return null; // } // // @Override // protected void done() { // OPDE.getDisplayManager().setProgressBarMessage(null); // OPDE.getMainframe().setBlocked(false); // } // // }; // worker.execute(); }); pnlSingle.getRight().add(btnInfo); EntityManager em = OPDE.createEM(); pnlSingle.getButton().setIcon(NR2UserTools.containsUser(em, nreport, OPDE.getLogin().getUser()) ? SYSConst.icon22ledGreenOn : SYSConst.icon22ledRedOn); em.close(); pnlSingle.getButton().setVerticalTextPosition(SwingConstants.TOP); JPanel zebra = new JPanel(); zebra.setLayout(new BoxLayout(zebra, BoxLayout.LINE_AXIS)); zebra.setOpaque(true); if (i % 2 == 0) { zebra.setBackground(SYSConst.orange1[SYSConst.light2]); } else { zebra.setBackground(Color.WHITE); } zebra.add(pnlSingle.getMain()); i++; dayPanel.add(zebra); } final String key = DateFormat.getDateInstance().format(day.toDate()); synchronized (cacheHO) { cacheHO.put(key, listHO); } synchronized (cacheNR) { cacheNR.put(key, listNR); } return null; } @Override protected void done() { try { get(); } catch (Exception ex2) { OPDE.fatal(ex2); } cpDay.setContentPane(dayPanel); OPDE.getDisplayManager().setProgressBarMessage(null); OPDE.getMainframe().setBlocked(false); } }; worker.execute(); } // Variables declaration - do not modify//GEN-BEGIN:variables private JScrollPane jspHandover; private CollapsiblePanes cpsHandover; // End of variables declaration//GEN-END:variables private void buildPanel() { cpsHandover.removeAll(); cpsHandover.setLayout(new JideBoxLayout(cpsHandover, JideBoxLayout.Y_AXIS)); MutableInterval minmax = NReportTools.getMinMax(); if (minmax != null) { LocalDate start = SYSCalendar.bom(minmax.getStart()).toLocalDate(); LocalDate end = new LocalDate(); for (int year = end.getYear(); year >= start.getYear(); year--) { final String keyYear = Integer.toString(year) + ".year"; cpsHandover.add(cpMap.get(keyYear)); } } cpsHandover.addExpansion(); } private java.util.List<Component> addCommands() { java.util.List<Component> list = new ArrayList<Component>(); /*** * _ _ * | \ | | _____ __ * | \| |/ _ \ \ /\ / / * | |\ | __/\ V V / * |_| \_|\___| \_/\_/ * */ if (OPDE.getAppInfo().isAllowedTo(InternalClassACL.INSERT, internalClassID)) { JideButton addButton = GUITools.createHyperlinkButton(SYSTools.xx("nursingrecords.handover.tooltips.btnadd"), SYSConst.icon22add, actionEvent -> { currentEditor = new DlgHOReport(new Handovers((Homes) cmbHomes.getSelectedItem()), report -> { if (report != null) { EntityManager em = OPDE.createEM(); try { em.getTransaction().begin(); final Handovers myHO = em.merge((Handovers) report); myHO.getUsersAcknowledged().add(em.merge(new Handover2User(myHO, OPDE.getLogin().getUser()))); em.getTransaction().commit(); LocalDate day = new LocalDate(myHO.getPit()); final String key = DateFormat.getDateInstance().format(myHO.getPit()); createCP4Day(day); expandDay(day); buildPanel(); GUITools.scroll2show(jspHandover, cpMap.get(key), cpsHandover, o -> { // GUITools.flashBackground(linemapHO.get(myHO), Color.YELLOW, 2); }); } 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(); } } currentEditor = null; }); currentEditor.setVisible(true); }); list.add(addButton); } //https://github.com/tloehr/Offene-Pflege.de/issues/43 final JideButton btnFindOpenHandovers = GUITools.createHyperlinkButton(SYSTools.xx("nursingrecords.handover.tooltips.btnFindOpenHandovers"), SYSConst.icon22RedFlag, null); btnFindOpenHandovers.addActionListener(actionEvent -> { // OPDE.getMainframe().setBlocked(true); // OPDE.getDisplayManager().setProgressBarMessage(new DisplayMessage(SYSTools.xx("misc.msg.wait"), -1, 100)); final long time = System.currentTimeMillis(); SwingWorker worker = new SwingWorker() { Date max = null; @Override protected Object doInBackground() throws Exception { LocalDate start = new LocalDate().minusWeeks(checkWeeksbackForNewReports); LocalDate end = new LocalDate(); int maxdays = checkWeeksbackForNewReports * 7; int running = 0; for (LocalDate day = start; day.compareTo(end) <= 0; day = day.plusDays(1)) { OPDE.getDisplayManager().setProgressBarMessage(new DisplayMessage(SYSTools.xx("misc.msg.wait"), running, maxdays)); running++; if (NR2UserTools.hasOpenReports(day, OPDE.getLogin().getUser(), (Homes) cmbHomes.getSelectedItem())) { expandDay(day); } } return null; } @Override protected void done() { OPDE.getDisplayManager().setProgressBarMessage(null); OPDE.getMainframe().setBlocked(false); } }; worker.execute(); }); list.add(btnFindOpenHandovers); final JideButton btnControllingToday = GUITools.createHyperlinkButton(SYSTools.xx("nursingrecords.handover.tooltips.btnControllingToday"), SYSConst.icon22magnify1, null); btnControllingToday.addActionListener(actionEvent -> { btnControllingToday.setEnabled(false); HandoversTools.printSupervision(new LocalDate(), (Homes) cmbHomes.getSelectedItem(), o -> btnControllingToday.setEnabled(true)); }); list.add(btnControllingToday); final JideButton btnControllingYesterday = GUITools.createHyperlinkButton(SYSTools.xx("nursingrecords.handover.tooltips.btnControllingYesterday"), SYSConst.icon22magnify1, null); btnControllingYesterday.addActionListener(actionEvent -> { btnControllingYesterday.setEnabled(false); HandoversTools.printSupervision(new LocalDate().minusDays(1), (Homes) cmbHomes.getSelectedItem(), o -> btnControllingYesterday.setEnabled(true)); }); list.add(btnControllingYesterday); return list; } private List<Component> addFilters() { List<Component> list = new ArrayList<Component>(); MutableInterval minmax = NReportTools.getMinMax(); if (minmax != null) { final DefaultComboBoxModel yearModel = new DefaultComboBoxModel(); for (int year = new LocalDate().getYear(); year >= minmax.getStart().getYear(); year--) { yearModel.addElement(year); } JPanel innerPanel = new JPanel(); innerPanel.setOpaque(false); innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.PAGE_AXIS)); txtSearch = new JXSearchField(SYSTools.xx("misc.msg.searchphrase")); txtSearch.setInstantSearchDelay(100000); txtSearch.setFont(SYSConst.ARIAL14); txtSearch.addActionListener(e -> { if (SYSTools.catchNull(txtSearch.getText()).trim().length() > 3) { SYSFilesTools.print(NReportTools.getReportsAndHandoversAsHTML(NReportTools.getNReports4Handover((Homes) cmbHomes.getSelectedItem(), txtSearch.getText().trim(), Integer.parseInt(yearModel.getSelectedItem().toString())), txtSearch.getText().trim(), Integer.parseInt(yearModel.getSelectedItem().toString())), false); } }); innerPanel.add(txtSearch); JButton btnSearchGeneralReports = GUITools.createHyperlinkButton("nursingrecords.handover.searchHandovers", null, null); btnSearchGeneralReports.addActionListener(e -> { List listHandovers = HandoversTools.getBy(Integer.parseInt(yearModel.getSelectedItem().toString()), (Homes) cmbHomes.getSelectedItem()); SYSFilesTools.print(NReportTools.getReportsAndHandoversAsHTML(listHandovers, "", Integer.parseInt(yearModel.getSelectedItem().toString())), false); }); innerPanel.add(btnSearchGeneralReports); yearCombo = new JXComboBox(yearModel); yearCombo.addItemListener(e -> txtSearch.postActionEvent()); JPanel myPanel = new JPanel(); myPanel.setOpaque(false); myPanel.setLayout(new BoxLayout(myPanel, BoxLayout.LINE_AXIS)); myPanel.add(innerPanel); myPanel.add(yearCombo); list.add(myPanel); } cmbHomes = new JComboBox(); cmbHomes.setFont(SYSConst.ARIAL14); HomesTools.setComboBox(cmbHomes); cmbHomes.addItemListener(itemEvent -> { if (itemEvent.getStateChange() != ItemEvent.SELECTED) return; reloadDisplay(); }); list.add(cmbHomes); tbResidentFirst = GUITools.getNiceToggleButton("nursingrecords.handover.residentFirst"); SYSPropsTools.restoreState("nursingrecords.handover.tbResidentFirst", tbResidentFirst); tbResidentFirst.addItemListener(e -> { SYSPropsTools.storeState("nursingrecords.handover.tbResidentFirst", tbResidentFirst); reload(); }); tbResidentFirst.setHorizontalAlignment(SwingConstants.LEFT); list.add(tbResidentFirst); return list; } }