package se.cambio.cds.view.swing.dialogs;
import se.cambio.cds.util.Domains;
import se.cambio.cds.view.swing.applicationobjects.DomainsUI;
import se.cambio.cm.model.util.CMElement;
import se.cambio.openehr.controller.session.data.ArchetypeManager;
import se.cambio.openehr.controller.session.data.Archetypes;
import se.cambio.openehr.controller.session.data.Templates;
import se.cambio.openehr.util.*;
import se.cambio.openehr.util.exceptions.InstanceNotFoundException;
import se.cambio.openehr.util.exceptions.InternalErrorException;
import se.cambio.openehr.view.panels.SelectionPanel;
import se.cambio.openehr.view.trees.SelectableNode;
import se.cambio.openehr.view.trees.SelectableNodeBuilder;
import se.cambio.openehr.view.util.ImportUtils;
import se.cambio.openehr.view.util.NodeConversor;
import se.cambio.openehr.view.util.ScreenUtil;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Collection;
public class DialogArchetypeChooser extends JDialog{
private static final long serialVersionUID = 1L;
private JButton acceptButton;
private JButton cancelButton;
private JPanel jPanel;
private JPanel bottonPanel;
private boolean _answer = false;
private AcceptChangesAction acceptChangesAction;
private CancelChangesAction cancelChangesAction;
private SelectionPanel archetypeSelectionPanel;
private SelectionPanel templateSelectionPanel;
private SelectableNode<String> archetypeNode = null;
private SelectableNode<String> templateNode = null;
private JComboBox domainComboBox;
private JTabbedPane tabbedPane;
private JCheckBox lastCB;
private String ANY_DOMAIN = "*";
public DialogArchetypeChooser(Window owner){
super(owner,
OpenEHRLanguageManager.getMessage("Archetypes") + "/" + OpenEHRLanguageManager.getMessage("Templates"),
ModalityType.APPLICATION_MODAL);
init(new Dimension(500,500), false);
}
public DialogArchetypeChooser(Window owner, String archetypeId, String domainId,boolean selectTemplates, boolean onlyShowCDS){
super(
owner,
OpenEHRLanguageManager.getMessage("Archetypes") + "/" + OpenEHRLanguageManager.getMessage("Templates"),
ModalityType.APPLICATION_MODAL);
if (onlyShowCDS){
getComboBox().setSelectedItem(Domains.CDS_ID);
getComboBox().setEnabled(false);
}else if (archetypeId!=null){
if (domainId==null){
domainId = ANY_DOMAIN;
}
if (!Domains.EHR_ID.equals(domainId)){//Select only if it is not EHR (the one by default) because it will activate the 'Last' ComboBox
getComboBox().setSelectedItem(domainId);
}
}
init(new Dimension(500,500), selectTemplates);
}
private void init(Dimension size, boolean selectTemplates){
this.setSize(size);
ScreenUtil.centerComponentOnScreen(this, this.getOwner());
this.setResizable(true);
this.addWindowListener(getCancelChangesAction());
this.setContentPane(getJPanel());
/* Enter KeyStroke */
KeyStroke enter = KeyStroke.getKeyStroke( KeyEvent.VK_ENTER,0,true);
getJPanel().registerKeyboardAction(getAcceptChangesAction(), enter, JComponent.WHEN_IN_FOCUSED_WINDOW);
KeyStroke esc = KeyStroke.getKeyStroke( KeyEvent.VK_ESCAPE,0,true);
getJPanel().registerKeyboardAction(getCancelChangesAction(), esc, JComponent.WHEN_IN_FOCUSED_WINDOW);
if (selectTemplates){
getArchetypeTemplateTabbedPane().setSelectedIndex(1);
}else{
getArchetypeTemplateTabbedPane().setSelectedIndex(0);
}
}
private JPanel getJPanel() {
if (jPanel == null) {
jPanel = new JPanel(new BorderLayout());
JPanel aux = new JPanel(new FlowLayout(FlowLayout.LEFT));
aux.add(new JLabel(OpenEHRLanguageManager.getMessage("Domain") + ":"));
aux.add(getComboBox());
jPanel.add(aux, BorderLayout.NORTH);
jPanel.add(getArchetypeTemplateTabbedPane(), BorderLayout.CENTER);
JPanel panelAux = new JPanel(new BorderLayout());
jPanel.add(panelAux, BorderLayout.SOUTH);
panelAux.add(getBottonPanel(), BorderLayout.SOUTH);
}
return jPanel;
}
private JComboBox getComboBox(){
if (domainComboBox==null){
domainComboBox = new JComboBox();
domainComboBox.addItem(ANY_DOMAIN);
domainComboBox.addItem(Domains.EHR_ID);
domainComboBox.addItem(Domains.CDS_ID);
domainComboBox.setRenderer(new DomainComboBoxRenderer());
domainComboBox.setSelectedItem(Domains.EHR_ID);
}
return domainComboBox;
}
private class DomainComboBoxRenderer extends JLabel implements ListCellRenderer{
private static final long serialVersionUID = 1L;
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
}else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
if (value instanceof String){
String idDomain = (String)value;
if (idDomain.equals(ANY_DOMAIN)){
idDomain = null;
}
setText(DomainsUI.getName(idDomain));
setToolTipText(DomainsUI.getDescription(idDomain));
setIcon(DomainsUI.getIcon(idDomain));
}else{
setText(null);
setToolTipText(null);
setIcon(null);
}
return this;
}
}
private JTabbedPane getArchetypeTemplateTabbedPane() {
if (tabbedPane == null){
tabbedPane = new JTabbedPane();
refreshArchetypeSelectionPanel();
refreshTemplateSelectionPanel();
}
return tabbedPane;
}
private JPanel getArchetypeSelectionPanel() {
if(archetypeSelectionPanel==null){
archetypeSelectionPanel = new SelectionPanel(getArchetypeNode());
archetypeSelectionPanel.getJTree().expand(getArchetypeNode());
archetypeSelectionPanel.getJTree().addExtraMouseListener(new DoubleClickMouseListener());
JButton addArchetypeButton = new JButton(OpenEHRLanguageManager.getMessage("Import"));
addArchetypeButton.setIcon(OpenEHRImageUtil.FOLDER_ICON);
addArchetypeButton.addActionListener(new ImportArchetypeActionListener(this));
archetypeSelectionPanel.getFilterPanel().add(addArchetypeButton);
}
return archetypeSelectionPanel;
}
private class ImportArchetypeActionListener implements ActionListener {
private DialogArchetypeChooser _dialog = null;
public ImportArchetypeActionListener(DialogArchetypeChooser dialog){
_dialog = dialog;
}
public void actionPerformed(ActionEvent e) {
try {
ImportUtils.showImportArchetypeDialogAndAddToRepo(_dialog, null);
} catch (InternalErrorException e1) {
ExceptionHandler.handle(e1);
} catch (InstanceNotFoundException e1) {
ExceptionHandler.handle(e1);
}
refreshArchetypeSelectionPanel();
}
}
public void refreshArchetypeSelectionPanel() {
archetypeSelectionPanel = null;
archetypeNode = null;
getArchetypeSelectionPanel();
if (getArchetypeTemplateTabbedPane().getTabCount()>0){
getArchetypeTemplateTabbedPane().removeTabAt(0);
}
getArchetypeTemplateTabbedPane().insertTab(OpenEHRLanguageManager.getMessage("Archetypes"), Archetypes.ICON, getArchetypeSelectionPanel(), OpenEHRLanguageManager.getMessage("Archetypes"), 0);
getArchetypeTemplateTabbedPane().setSelectedIndex(0);
}
private JPanel getTemplateSelectionPanel() {
if(templateSelectionPanel==null){
templateSelectionPanel = new SelectionPanel(getTemplateNode());
templateSelectionPanel.getJTree().expand(getTemplateNode());
templateSelectionPanel.getJTree().addExtraMouseListener(new DoubleClickMouseListener());
JButton addTemplateButton = new JButton(OpenEHRLanguageManager.getMessage("Import"));
addTemplateButton.setIcon(OpenEHRImageUtil.FOLDER_ICON);
addTemplateButton.addActionListener(new ImportTemplateActionListener(this));
templateSelectionPanel.getFilterPanel().add(addTemplateButton);
}
return templateSelectionPanel;
}
private class ImportTemplateActionListener implements ActionListener {
private DialogArchetypeChooser _dialog = null;
public ImportTemplateActionListener(DialogArchetypeChooser dialog){
_dialog = dialog;
}
public void actionPerformed(ActionEvent e) {
try {
ImportUtils.showImportTemplateDialog(_dialog, null);
} catch (InternalErrorException e1) {
ExceptionHandler.handle(e1);
} catch (InstanceNotFoundException e1) {
ExceptionHandler.handle(e1);
}
refreshTemplateSelectionPanel();
}
}
public void refreshTemplateSelectionPanel() {
templateSelectionPanel = null;
templateNode = null;
getTemplateSelectionPanel();
if (getArchetypeTemplateTabbedPane().getTabCount()>1){
getArchetypeTemplateTabbedPane().removeTabAt(1);
}
getArchetypeTemplateTabbedPane().insertTab(
OpenEHRLanguageManager.getMessage("Templates"),
Templates.ICON, getTemplateSelectionPanel(),
OpenEHRLanguageManager.getMessage("Templates"), 1);
getArchetypeTemplateTabbedPane().setSelectedIndex(1);
}
class DoubleClickMouseListener extends MouseAdapter{
public void mouseClicked(MouseEvent e) {
if(e.getClickCount()>1){
CMElement cmElement = getSelectedCMElement();
if (cmElement!=null){
accept();
}
}
}
}
protected final void accept() {
_answer = true;
setVisible(false);
}
protected final void exit() {
_answer = false;
setVisible(false);
}
private JPanel getBottonPanel() {
if (bottonPanel==null){
bottonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
bottonPanel.add(getAcceptButton());
bottonPanel.add(getCancelButton());
}
return bottonPanel;
}
private JButton getAcceptButton() {
if (acceptButton == null) {
acceptButton = new JButton();
acceptButton.setText(OpenEHRLanguageManager.getMessage("Accept"));
acceptButton.setIcon(OpenEHRImageUtil.ACCEPT_ICON);
acceptButton.setEnabled(true);
acceptButton.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
acceptButton.addActionListener(getAcceptChangesAction());
}
return acceptButton;
}
/**
* This method initializes cancelButton
*
* @return javax.swing.JButton
*/
private JButton getCancelButton() {
if (cancelButton == null) {
cancelButton = new JButton();
cancelButton.setText(OpenEHRLanguageManager.getMessage("Cancel"));
cancelButton.setIcon(OpenEHRImageUtil.CANCEL_ICON);
cancelButton.setEnabled(true);
cancelButton.addActionListener(getCancelChangesAction());
}
return cancelButton;
}
private AcceptChangesAction getAcceptChangesAction() {
if (acceptChangesAction == null){
acceptChangesAction = new AcceptChangesAction();
}
return acceptChangesAction;
}
public class AcceptChangesAction extends AbstractAction {
private static final long serialVersionUID = -8058749276509227718L;
public void actionPerformed(ActionEvent e) {
accept();
}
}
private CancelChangesAction getCancelChangesAction() {
if (cancelChangesAction == null){
cancelChangesAction = new CancelChangesAction();
}
return cancelChangesAction;
}
private class CancelChangesAction extends WindowAdapter implements ActionListener{
public void windowOpened(WindowEvent e){
}
public void actionPerformed(ActionEvent e) {
exit();
}
public void windowClosing(WindowEvent we) {
exit();
}
}
public SelectableNode<String> getArchetypeNode() {
if(archetypeNode==null){
archetypeNode = new SelectableNodeBuilder<String>()
.setName(OpenEHRLanguageManager.getMessage("Archetypes"))
.setIcon(Archetypes.ICON)
.createSelectableNode();
try {
Collection<String> archetypeIds = ArchetypeManager.getInstance().getArchetypes().getAllIds();
insertArchetypeNodes(archetypeNode, archetypeIds, OpenEHRConst.OBSERVATION);
insertArchetypeNodes(archetypeNode, archetypeIds, OpenEHRConst.ACTION);
insertArchetypeNodes(archetypeNode, archetypeIds, OpenEHRConst.EVALUATION);
insertArchetypeNodes(archetypeNode, archetypeIds, OpenEHRConst.INSTRUCTION);
insertArchetypeNodes(archetypeNode, archetypeIds, OpenEHRConst.ENTRY);
} catch (InternalErrorException e) {
ExceptionHandler.handle(e);
}
}
return archetypeNode;
}
private static void insertArchetypeNodes(SelectableNode<String> root, Collection<String> archetypeIds, String rmName) {
SelectableNode<Object> entryRoot = new SelectableNodeBuilder<Object>()
.setName(OpenEHRConstUI.getName(rmName))
.setDescription(OpenEHRConstUI.getDescription(rmName))
.setIcon(OpenEHRConstUI.getIcon(rmName))
.createSelectableNode();
for (String archetypeId : archetypeIds) {
String entryType = Archetypes.getEntryType(archetypeId);
if (entryType!=null && entryType.equals(rmName)) {
SelectableNode<String> rnode = new SelectableNodeBuilder<String>()
.setName(archetypeId)
.setDescription(archetypeId)
.setIcon(Archetypes.getIcon(archetypeId))
.setObject(archetypeId)
.createSelectableNode();
entryRoot.add(rnode);
}
}
root.add(entryRoot);
}
public SelectableNode<String> getTemplateNode() {
if (templateNode==null){
templateNode = generateTemplateNode();
}
return templateNode;
}
public static SelectableNode<String> generateTemplateNode() {
SelectableNode templateNode = new SelectableNodeBuilder<String>()
.setName(OpenEHRLanguageManager.getMessage("Templates"))
.setIcon(Templates.ICON)
.createSelectableNode();
try {
Collection<String> templateIds = ArchetypeManager.getInstance().getTemplates().getAllIds();
insertTemplateNodes(templateNode, templateIds);
} catch (InternalErrorException e){
ExceptionHandler.handle(e);
}
return templateNode;
}
private static void insertTemplateNodes(SelectableNode<String> rootNode, Collection<String> templateIds) {
for (String templateId : templateIds) {
SelectableNode<String> node = new SelectableNodeBuilder<String>()
.setName(templateId)
.setObject(templateId)
.setIcon(Templates.ICON)
.createSelectableNode();
rootNode.add(node);
}
}
public boolean getAnswer(){
return _answer;
}
public CMElement getSelectedCMElement() {
boolean isArchetypeTabSelected = getArchetypeTemplateTabbedPane().getSelectedIndex() == 0;
try {
String id = getSelectedId(isArchetypeTabSelected);
if (id == null){
return null;
} else {
return getCmElement(id, isArchetypeTabSelected);
}
} catch (InternalErrorException e1) {
ExceptionHandler.handle(e1);
} catch (InstanceNotFoundException e1) {
ExceptionHandler.handle(e1);
}
return null;
}
private CMElement getCmElement(String id, boolean isArchetypeTabSelected) throws InstanceNotFoundException, InternalErrorException {
if (isArchetypeTabSelected) {
return ArchetypeManager.getInstance().getArchetypes().getCMElement(id);
} else {
return ArchetypeManager.getInstance().getTemplates().getCMElement(id);
}
}
private String getSelectedId(boolean isArchetypeTabSelected) {
if (isArchetypeTabSelected) {
return NodeConversor.getSelectedElement(getArchetypeNode());
} else {
return NodeConversor.getSelectedElement(getTemplateNode());
}
}
public String getSelectedDomain() {
String idDomain = (String)getComboBox().getSelectedItem();
if (idDomain.equals(ANY_DOMAIN)){
idDomain = null;
}
return idDomain;
}
}
/*
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 2.0/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 2.0 (the 'License'); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an 'AS IS' basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
*
* The Initial Developers of the Original Code are Iago Corbal and Rong Chen.
* Portions created by the Initial Developer are Copyright (C) 2012-2013
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Software distributed under the License is distributed on an 'AS IS' basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* ***** END LICENSE BLOCK *****
*/