/*
* 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;
}
}