/* * OffenePflege * Copyright (C) 2011 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.sysfiles; import com.jidesoft.pane.CollapsiblePane; import com.jidesoft.pane.CollapsiblePanes; import com.jidesoft.popup.JidePopup; import com.jidesoft.swing.JideBoxLayout; import entity.EntityTools; import entity.files.SYSFiles; import entity.files.SYSFilesTools; import entity.info.Resident; import gui.GUITools; import op.OPDE; import op.system.FileDrop; import op.system.InternalClassACL; import op.threads.DisplayMessage; import op.tools.DlgYesNo; import op.tools.NursingRecordsPanel; import op.tools.SYSConst; import op.tools.SYSTools; import org.apache.commons.collections.Closure; import org.jdesktop.swingx.VerticalLayout; import tablerenderer.RNDHTML; import javax.persistence.EntityManager; import javax.persistence.Query; import javax.swing.*; import javax.swing.border.EmptyBorder; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableRowSorter; import java.awt.*; import java.awt.event.*; import java.beans.PropertyVetoException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.HashSet; /** * @author tloehr */ public class PnlFiles extends NursingRecordsPanel { private JPopupMenu menu; private Resident resident; private JScrollPane jspSearch; private CollapsiblePanes searchPanes; // private RowFilter<TMSYSFiles, Integer> textFilter; private TableRowSorter<TMSYSFiles> sorter; private TMSYSFiles tmSYSFiles; /** * Creates new form PnlFiles */ public PnlFiles(Resident resident, JScrollPane jspSearch) { super("nursingrecords.files"); initComponents(); this.jspSearch = jspSearch; initPanel(); switchResident(resident); } private void initPanel() { prepareSearchArea(); } @Override public void cleanup() { super.cleanup(); SYSTools.unregisterListeners(menu); SYSTools.unregisterListeners(this); } @Override public void switchResident(Resident res) { this.resident = EntityTools.find(Resident.class, res.getRID()); GUITools.setResidentDisplay(resident); reloadTable(); } @Override public void reload() { reloadTable(); } @Override public String getInternalClassID() { return internalClassID; } void reloadTable() { HashSet<SYSFiles> filesSet = new HashSet<>(); EntityManager em = OPDE.createEM(); Query query0 = em.createQuery("SELECT s FROM SYSFiles s JOIN s.residentAssignCollection res WHERE res.resident = :resident"); query0.setParameter("resident", resident); filesSet.addAll(query0.getResultList()); Query query1 = em.createQuery("SELECT s FROM SYSFiles s JOIN s.nrAssignCollection nr WHERE nr.nReport.resident = :resident"); query1.setParameter("resident", resident); filesSet.addAll(query1.getResultList()); Query query2 = em.createQuery("SELECT s FROM SYSFiles s JOIN s.bwiAssignCollection bwi WHERE bwi.bwinfo.resident = :resident"); query2.setParameter("resident", resident); filesSet.addAll(query2.getResultList()); Query query3 = em.createQuery("SELECT s FROM SYSFiles s JOIN s.preAssignCollection pre WHERE pre.prescription.resident = :resident"); query3.setParameter("resident", resident); filesSet.addAll(query3.getResultList()); Query query4 = em.createQuery("SELECT s FROM SYSFiles s JOIN s.valAssignCollection val WHERE val.value.resident = :resident"); query4.setParameter("resident", resident); filesSet.addAll(query4.getResultList()); Query query5 = em.createQuery("SELECT s FROM SYSFiles s JOIN s.npAssignCollection np WHERE np.nursingProcess.resident = :resident"); query5.setParameter("resident", resident); filesSet.addAll(query5.getResultList()); em.close(); ArrayList<SYSFiles> listFiles = new ArrayList<>(filesSet); Collections.sort(listFiles); // createFilters(); tmSYSFiles = new TMSYSFiles(listFiles); tblFiles.setModel(tmSYSFiles); sorter = new TableRowSorter(tmSYSFiles); sorter.setSortsOnUpdates(true); tblFiles.setRowSorter(sorter); // sorter.setComparator(TMSYSFiles.COL_PIT, new Comparator<Date>() { // @Override // public int compare(Date o1, Date o2) { // return o1.compareTo(o2); // } // }); // sorter.setRowFilter(textFilter); tblFiles.getColumnModel().getColumn(0).setCellRenderer(new DefaultTableCellRenderer() { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd.MM.yyyy HH:mm"); return super.getTableCellRendererComponent(table, sdf.format((Date) value), isSelected, hasFocus, row, column); } }); tblFiles.getColumnModel().getColumn(1).setCellRenderer(new RNDHTML()); tblFiles.getColumnModel().getColumn(2).setCellRenderer(new RNDHTML()); tblFiles.getColumnModel().getColumn(3).setCellRenderer(new RNDHTML()); tblFiles.getColumnModel().getColumn(0).setHeaderValue(SYSTools.xx("nursingrecords.files.tabheader1")); tblFiles.getColumnModel().getColumn(1).setHeaderValue(SYSTools.xx("nursingrecords.files.tabheader2")); tblFiles.getColumnModel().getColumn(2).setHeaderValue(SYSTools.xx("nursingrecords.files.tabheader3")); tblFiles.getColumnModel().getColumn(3).setHeaderValue(SYSTools.xx("nursingrecords.files.tabheader4")); jspFiles.dispatchEvent(new ComponentEvent(jspFiles, ComponentEvent.COMPONENT_RESIZED)); } private void createFilters() { // textFilter = new RowFilter<TMSYSFiles, Integer>() { // @Override // public boolean include(Entry<? extends TMSYSFiles, ? extends Integer> entry) { // int row = entry.getIdentifier(); // SYSFiles sysFile = entry.getModel().getRow(row); // // if (!tbOldStocks.isSelected() && stock.isAusgebucht()) return false; // // if (!treeIngredients.getSelectionModel().isSelectionEmpty() && !treeIngredients.getSelectionModel().getLeadSelectionPath().getLastPathComponent().equals(treeIngredients.getModel().getRoot())) { // for (TreePath path : treeIngredients.getSelectionModel().getSelectionPaths()) { // DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent(); // if (node.getUserObject() instanceof Recipes) { // if (!RecipeTools.contains((Recipes) node.getUserObject(), stock.getProdukt().getIngTypes())) { // return false; // } // } else if (node.getUserObject() instanceof Ingtypes2Recipes) { // if (!stock.getProdukt().getIngTypes().equals(((Ingtypes2Recipes) node.getUserObject()).getIngType())) { // return false; // } // } // } // } // // String textKriterium = searchUnAss.getText().trim().toLowerCase(); // if (textKriterium.isEmpty()) return true; // // return (stock.getProdukt().getBezeichnung().toLowerCase().indexOf(textKriterium) >= 0 || // Long.toString(stock.getId()).equals(textKriterium) || // Tools.catchNull(stock.getProdukt().getGtin()).indexOf(textKriterium) >= 0 || // stock.getProdukt().getIngTypes().getBezeichnung().toLowerCase().indexOf(textKriterium) >= 0 || // stock.getProdukt().getIngTypes().getWarengruppe().getBezeichnung().toLowerCase().indexOf(textKriterium) >= 0); // // // } // }; } /** * 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. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { pnlMain = new JPanel(); jspFiles = new JScrollPane(); tblFiles = new JTable(); //======== this ======== setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); //======== pnlMain ======== { pnlMain.setLayout(new BoxLayout(pnlMain, BoxLayout.X_AXIS)); //======== jspFiles ======== { jspFiles.addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { jspFilesComponentResized(e); } }); //---- tblFiles ---- tblFiles.setModel(new DefaultTableModel( new Object[][]{ {null, null, null, null}, {null, null, null, null}, {null, null, null, null}, {null, null, null, null}, }, new String[]{ "Title 1", "Title 2", "Title 3", "Title 4" } )); tblFiles.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); tblFiles.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); tblFiles.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { tblFilesMousePressed(e); } }); jspFiles.setViewportView(tblFiles); } pnlMain.add(jspFiles); } add(pnlMain); }// </editor-fold>//GEN-END:initComponents private void tblFilesMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tblFilesMousePressed Point p = evt.getPoint(); ListSelectionModel lsm = tblFiles.getSelectionModel(); Point p2 = evt.getPoint(); SwingUtilities.convertPointToScreen(p2, tblFiles); final Point screenposition = p2; boolean singleRowSelected = lsm.getMaxSelectionIndex() == lsm.getMinSelectionIndex(); final int row = tblFiles.rowAtPoint(p); final int col = tblFiles.columnAtPoint(p); if (singleRowSelected) { lsm.setSelectionInterval(row, row); } final TMSYSFiles tm = (TMSYSFiles) tblFiles.getModel(); final SYSFiles sysfile = tm.getRow(tblFiles.convertRowIndexToModel(row)); if (SwingUtilities.isRightMouseButton(evt)) { SYSTools.unregisterListeners(menu); menu = new JPopupMenu(); // SELECT JMenuItem itemPopupShow = new JMenuItem(SYSTools.xx("misc.commands.show"), SYSConst.icon22magnify1); itemPopupShow.addActionListener(evt12 -> SYSFilesTools.handleFile(sysfile, Desktop.Action.OPEN)); menu.add(itemPopupShow); if (col == TMSYSFiles.COL_DESCRIPTION && OPDE.getAppInfo().isAllowedTo(InternalClassACL.UPDATE, internalClassID)) { final JMenuItem itemPopupEdit = new JMenuItem(SYSTools.xx("misc.commands.edit"), SYSConst.icon22edit3); itemPopupEdit.addActionListener(evt1 -> { final JidePopup popup = new JidePopup(); popup.setMovable(false); popup.getContentPane().setLayout(new BoxLayout(popup.getContentPane(), BoxLayout.LINE_AXIS)); final JComponent editor = new JTextArea(sysfile.getBeschreibung(), 10, 40); ((JTextArea) editor).setLineWrap(true); ((JTextArea) editor).setWrapStyleWord(true); ((JTextArea) editor).setEditable(true); popup.getContentPane().add(new JScrollPane(editor)); final JButton saveButton = new JButton(SYSConst.icon22apply); saveButton.addActionListener(actionEvent -> { EntityManager em = OPDE.createEM(); try { em.getTransaction().begin(); popup.hidePopup(); SYSFiles mySysfile = em.merge(sysfile); mySysfile.setBeschreibung(((JTextArea) editor).getText().trim()); em.getTransaction().commit(); tm.setSYSFile(tblFiles.convertRowIndexToModel(row), mySysfile); } catch (Exception e) { em.getTransaction().rollback(); OPDE.fatal(e); } finally { em.close(); } }); saveButton.setHorizontalAlignment(SwingConstants.RIGHT); JPanel pnl = new JPanel(new BorderLayout(10, 10)); JScrollPane pnlEditor = new JScrollPane(editor); pnl.add(pnlEditor, BorderLayout.CENTER); JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.LINE_AXIS)); buttonPanel.add(saveButton); pnl.setBorder(new EmptyBorder(10, 10, 10, 10)); pnl.add(buttonPanel, BorderLayout.SOUTH); popup.setOwner(tblFiles); popup.removeExcludedComponent(tblFiles); popup.getContentPane().add(pnl); popup.setDefaultFocusComponent(editor); popup.showPopup(screenposition.x, screenposition.y); }); menu.add(itemPopupEdit); } if (OPDE.getAppInfo().isAllowedTo(InternalClassACL.DELETE, internalClassID)) { JMenuItem itemPopupDelete = new JMenuItem(SYSTools.xx("misc.commands.delete"), SYSConst.icon22delete); itemPopupDelete.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { currentEditor = new DlgYesNo(SYSTools.xx("misc.questions.delete1") + "<br/><b>" + sysfile.getFilename() + "</b><br/>" + SYSTools.xx("misc.questions.delete2"), new ImageIcon(getClass().getResource("/artwork/48x48/bw/trashcan_empty.png")), o -> { if (o.equals(JOptionPane.YES_OPTION)) { SYSFilesTools.deleteFile(sysfile); reloadTable(); } currentEditor = null; }); currentEditor.setVisible(true); } }); menu.add(itemPopupDelete); itemPopupDelete.setEnabled(singleRowSelected); } menu.show(evt.getComponent(), (int) p.getX(), (int) p.getY()); } else if (evt.getClickCount() == 2) { SYSFilesTools.handleFile(sysfile, Desktop.Action.OPEN); } }//GEN-LAST:event_tblFilesMousePressed private void jspFilesComponentResized(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_jspFilesComponentResized JScrollPane jsp = (JScrollPane) evt.getComponent(); Dimension dim = jsp.getSize(); // Größe der Text Spalte im TB ändern. // Summe der fixen Spalten = 210 + ein bisschen int textWidth = dim.width - 250; tblFiles.getColumnModel().getColumn(0).setPreferredWidth(170); tblFiles.getColumnModel().getColumn(1).setPreferredWidth(80); tblFiles.getColumnModel().getColumn(2).setPreferredWidth(textWidth / 3 * 2); tblFiles.getColumnModel().getColumn(3).setPreferredWidth(textWidth / 3); // tblFiles.getColumnModel().getColumn(2).setPreferredWidth(100); // SYSTools.packTable(tblFiles, 0); }//GEN-LAST:event_jspFilesComponentResized private void prepareSearchArea() { searchPanes = new CollapsiblePanes(); searchPanes.setLayout(new JideBoxLayout(searchPanes, JideBoxLayout.Y_AXIS)); jspSearch.setViewportView(searchPanes); if (OPDE.getAppInfo().isAllowedTo(InternalClassACL.UPDATE, internalClassID)) { searchPanes.add(addCommands()); } searchPanes.addExpansion(); } private CollapsiblePane addCommands() { JPanel mypanel = new JPanel(); mypanel.setLayout(new VerticalLayout()); mypanel.setBackground(Color.WHITE); CollapsiblePane cmdPane = new CollapsiblePane(SYSTools.xx(internalClassID)); cmdPane.setStyle(CollapsiblePane.PLAIN_STYLE); cmdPane.setCollapsible(false); try { cmdPane.setCollapsed(false); } catch (PropertyVetoException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } mypanel.add(GUITools.getDropPanel(files -> { java.util.List<SYSFiles> successful = SYSFilesTools.putFiles(files, resident); if (!successful.isEmpty()) { OPDE.getDisplayManager().addSubMessage(new DisplayMessage(successful.size() + " " + SYSTools.xx("misc.msg.Files") + " " + SYSTools.xx("misc.msg.added"))); } reloadTable(); })); cmdPane.setContentPane(mypanel); return cmdPane; } // Variables declaration - do not modify//GEN-BEGIN:variables private JPanel pnlMain; private JScrollPane jspFiles; private JTable tblFiles; // End of variables declaration//GEN-END:variables }