/* * 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.med.structure; import com.jidesoft.pane.CollapsiblePane; import com.jidesoft.pane.CollapsiblePanes; import com.jidesoft.popup.JidePopup; import com.jidesoft.swing.JideBoxLayout; import com.jidesoft.swing.JideButton; import com.jidesoft.wizard.WizardDialog; import entity.prescription.*; import gui.GUITools; import gui.interfaces.CleanablePanel; import op.OPDE; import op.care.med.inventory.DlgNewStocks; import op.care.med.prodassistant.MedProductWizard; import op.system.InternalClassACL; import op.tools.SYSConst; import op.tools.SYSTools; import org.jdesktop.swingx.JXSearchField; import org.jdesktop.swingx.VerticalLayout; import javax.persistence.EntityManager; import javax.persistence.Query; import javax.swing.*; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; import java.awt.*; import java.awt.event.*; import java.beans.PropertyVetoException; import java.util.ArrayList; /** * @author tloehr */ public class PnlMed extends CleanablePanel { private DefaultTreeModel tree; private MedProducts product; private JPopupMenu menu; private CollapsiblePanes searchPanes; private JScrollPane jspSearch; private JXSearchField txtSuche; private JList lstPraep; private JToggleButton tbIDs; private JidePopup currentPopup; /** * Creates new form FrmMed */ public PnlMed(JScrollPane jspSearch) { super("opde.medication"); this.jspSearch = jspSearch; initComponents(); initDialog(); } @Override public void cleanup() { super.cleanup(); // https://github.com/tloehr/Offene-Pflege.de/issues/62 // closes an open modal dialog, if necessary. // when the timeout occurs if (currentPopup != null && currentPopup.isShowing()) { currentPopup.hidePopup(); } SYSTools.unregisterListeners(menu); menu = null; SYSTools.unregisterListeners(this); } @Override public void reload() { createTree(); } private void initDialog() { prepareSearchArea(); product = null; treeMed.setModel(new DefaultTreeModel(new DefaultMutableTreeNode())); treeMed.setVisible(false); } /** * 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() { jScrollPane1 = new JScrollPane(); treeMed = new JTree(); panel1 = new JPanel(); label1 = new JLabel(); //======== this ======== setLayout(new CardLayout()); //======== jScrollPane1 ======== { //---- treeMed ---- treeMed.setFont(new Font("Arial", Font.PLAIN, 14)); treeMed.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { treeMedMousePressed(e); } }); jScrollPane1.setViewportView(treeMed); } add(jScrollPane1, "card1"); //======== panel1 ======== { panel1.setLayout(new BoxLayout(panel1, BoxLayout.X_AXIS)); //---- label1 ---- label1.setText("text"); label1.setIcon(null); panel1.add(label1); } add(panel1, "card2"); }// </editor-fold>//GEN-END:initComponents private void lstPraepValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_lstPraepValueChanged if (!evt.getValueIsAdjusting() && lstPraep.getSelectedValue() != null) { product = (MedProducts) lstPraep.getSelectedValue(); createTree(); } }//GEN-LAST:event_lstPraepValueChanged @Override public String getInternalClassID() { return internalClassID; } private void txtSucheActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtSucheActionPerformed // treeMed.setCellRenderer(new DefaultTreeCellRenderer()); treeMed.setModel(new DefaultTreeModel(new DefaultMutableTreeNode())); // treeMed.setVisible(false); if (txtSuche.getText().isEmpty()) { lstPraep.setModel(new DefaultListModel()); } else { EntityManager em = OPDE.createEM(); Query query = em.createQuery("SELECT m FROM MedProducts m WHERE m.text LIKE :bezeichnung ORDER BY m.text"); query.setParameter("bezeichnung", "%" + txtSuche.getText() + "%"); lstPraep.setModel(SYSTools.list2dlm(query.getResultList())); em.close(); } }//GEN-LAST:event_txtSucheActionPerformed private void treeMedMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_treeMedMousePressed if (product == null) return; if (!OPDE.getAppInfo().isAllowedTo(InternalClassACL.MANAGER, internalClassID)) return; if (SwingUtilities.isRightMouseButton(evt)) { // Dieses Popupmenu für den Table SYSTools.unregisterListeners(menu); menu = new JPopupMenu(); if (treeMed.getRowForLocation(evt.getX(), evt.getY()) != -1 && OPDE.getAppInfo().isAllowedTo(InternalClassACL.UPDATE, internalClassID)) { JMenuItem itemedit = null; JMenuItem itemUPRedit = null; TreePath curPath = treeMed.getPathForLocation(evt.getX(), evt.getY()); final DefaultMutableTreeNode dmtn = (DefaultMutableTreeNode) curPath.getLastPathComponent(); treeMed.setSelectionPath(curPath); if (dmtn.getUserObject() instanceof TradeForm) { final TradeForm tradeForm = (TradeForm) dmtn.getUserObject(); itemedit = new JMenuItem(SYSTools.xx("misc.msg.edit")); itemedit.addActionListener(evt14 -> { currentEditor = new DlgTradeForm(tradeForm); currentEditor.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { super.windowClosing(e); currentEditor = null; } }); currentEditor.setVisible(true); createTree(); }); itemUPRedit = new JMenuItem(SYSTools.xx("upreditor.tooltip")); itemUPRedit.addActionListener(evt13 -> new DlgUPREditor(tradeForm, o -> reload())); itemUPRedit.setEnabled(tradeForm.getDosageForm().isUPRn()); } else if (dmtn.getUserObject() instanceof MedPackage) { final MedPackage packung = (MedPackage) dmtn.getUserObject(); itemedit = new JMenuItem(SYSTools.xx("misc.msg.edit")); itemedit.addActionListener(evt12 -> { currentEditor = new DlgPack(SYSTools.xx("misc.msg.edit"), packung); currentEditor.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { super.windowClosing(e); currentEditor = null; } }); currentEditor.setVisible(true); createTree(); }); } else if (dmtn.getUserObject() instanceof MedProducts) { itemedit = new JMenuItem(SYSTools.xx("misc.msg.edit")); itemedit.addActionListener(evt1 -> { currentEditor = new DlgProduct(SYSTools.xx("misc.msg.edit"), (MedProducts) dmtn.getUserObject()); currentEditor.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { super.windowClosing(e); product = ((DlgProduct) currentEditor).getProduct(); currentEditor = null; } }); currentEditor.setVisible(true); createTree(); }); } if (itemedit != null) menu.add(itemedit); if (itemUPRedit != null) menu.add(itemUPRedit); } menu.show(evt.getComponent(), evt.getX(), evt.getY()); } }//GEN-LAST:event_treeMedMousePressed private void createTree() { if (product == null) return; treeMed.setVisible(true); tree = new DefaultTreeModel(getRoot()); treeMed.setModel(tree); treeMed.setCellRenderer(new TreeRenderer()); SYSTools.expandAll(treeMed); } private DefaultMutableTreeNode getRoot() { DefaultMutableTreeNode root; root = new DefaultMutableTreeNode(product); SYSTools.addAllNodes(root, getTradeForms()); return root; } private java.util.List<TradeForm> getTradeForms() { java.util.List result = new ArrayList(); EntityManager em = OPDE.createEM(); Query query = em.createQuery("SELECT m FROM TradeForm m WHERE m.medProduct = :medProdukt ORDER BY m.dosageForm.preparation"); query.setParameter("medProdukt", product); java.util.List<TradeForm> listDAF = query.getResultList(); em.close(); for (TradeForm daf : listDAF) { DefaultMutableTreeNode nodeDAF = new DefaultMutableTreeNode(daf); SYSTools.addAllNodes(nodeDAF, getPackung(daf)); result.add(nodeDAF); } return result; } private java.util.List getPackung(TradeForm darreichung) { java.util.List result = new ArrayList(); for (MedPackage aPackage : darreichung.getPackages()) { result.add(new DefaultMutableTreeNode(aPackage)); } return result; } // Variables declaration - do not modify//GEN-BEGIN:variables private JScrollPane jScrollPane1; private JTree treeMed; private JPanel panel1; private JLabel label1; // End of variables declaration//GEN-END:variables private class TreeRenderer extends DefaultTreeCellRenderer { TreeRenderer() { super(); } @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { JLabel component = (JLabel) super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); DefaultMutableTreeNode node = (DefaultMutableTreeNode) value; if (node.getUserObject() instanceof MedProducts) { component.setIcon(new ImageIcon(getClass().getResource("/artwork/16x16/info.png"))); MedProducts myprod = (MedProducts) node.getUserObject(); component.setText((tbIDs.isSelected() ? "[" + ((MedProducts) node.getUserObject()).getMedPID() + "] " : "") + myprod.getText() + ", " + myprod.getACME().getName() + ", " + myprod.getACME().getCity()); } else if (node.getUserObject() instanceof TradeForm) { component.setIcon(new ImageIcon(getClass().getResource("/artwork/16x16/medical.png"))); component.setText((tbIDs.isSelected() ? "[" + ((TradeForm) node.getUserObject()).getID() + "] " : "") + TradeFormTools.toPrettyStringMediumWithExpiry((TradeForm) node.getUserObject())); } else if (node.getUserObject() instanceof MedPackage) { component.setIcon(new ImageIcon(getClass().getResource("/artwork/16x16/package.png"))); component.setText((tbIDs.isSelected() ? "[" + ((MedPackage) node.getUserObject()).getID() + "] " : "") + MedPackageTools.toPrettyString((MedPackage) node.getUserObject())); } else { component.setIcon(new ImageIcon(getClass().getResource("/artwork/16x16/filenew.png"))); component.setText(null); } component.setFont(SYSConst.ARIAL14); // setBackground(selected ? SYSConst.lightblue : Color.WHITE); return component; } } 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(3)); 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()); searchPane.setContentPane(mypanel); searchPanes.add(searchPane); searchPanes.addExpansion(); } private java.util.List<Component> addFilters() { java.util.List<Component> list = new ArrayList<Component>(); tbIDs = GUITools.getNiceToggleButton("misc.msg.showIDs"); tbIDs.addItemListener(e -> reload()); tbIDs.setHorizontalAlignment(SwingConstants.LEFT); list.add(tbIDs); txtSuche = new JXSearchField("Suchen"); txtSuche.setFont(SYSConst.ARIAL14); txtSuche.addActionListener(actionEvent -> txtSucheActionPerformed(actionEvent)); txtSuche.addFocusListener(new FocusAdapter() { @Override public void focusGained(FocusEvent focusEvent) { SYSTools.markAllTxt(txtSuche); } }); list.add(txtSuche); lstPraep = new JList(new DefaultListModel()); lstPraep.setCellRenderer(MedProductsTools.getMedProdukteRenderer()); lstPraep.setFont(SYSConst.ARIAL14); lstPraep.addListSelectionListener(listSelectionEvent -> lstPraepValueChanged(listSelectionEvent)); lstPraep.setFixedCellWidth(200); list.add(new JScrollPane(lstPraep)); return list; } private java.util.List<Component> addCommands() { java.util.List<Component> list = new ArrayList<Component>(); if (OPDE.getAppInfo().isAllowedTo(InternalClassACL.INSERT, internalClassID)) { final JideButton addButton = GUITools.createHyperlinkButton(MedProductWizard.internalClassID, SYSConst.icon22wizard, null); addButton.addActionListener(actionEvent -> { currentPopup = new JidePopup(); WizardDialog wizard = new MedProductWizard(o -> { currentPopup.hidePopup(); // keine Maßnahme nötig }).getWizard(); currentPopup.setMovable(false); currentPopup.setPreferredSize((new Dimension(800, 450))); currentPopup.setResizable(false); currentPopup.getContentPane().setLayout(new BoxLayout(currentPopup.getContentPane(), BoxLayout.LINE_AXIS)); currentPopup.getContentPane().add(wizard.getContentPane()); currentPopup.setOwner(addButton); currentPopup.removeExcludedComponent(addButton); currentPopup.setTransient(false); currentPopup.setDefaultFocusComponent(wizard.getContentPane()); // currentPopup.addPropertyChangeListener("visible", propertyChangeEvent -> currentPopup.getContentPane().getComponentCount()); GUITools.showPopup(currentPopup, SwingConstants.NORTH_EAST); }); list.add(addButton); } if (OPDE.isCalcMediUPR1() && OPDE.getAppInfo().isAllowedTo(InternalClassACL.INSERT, internalClassID)) { JideButton buchenButton = GUITools.createHyperlinkButton("nursingrecords.inventory.newstocks", SYSConst.icon22addrow, actionEvent -> { currentEditor = new DlgNewStocks(null); currentEditor.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { super.windowClosing(e); currentEditor = null; } }); currentEditor.setVisible(true); }); list.add(buchenButton); } return list; } }