package se.cambio.cds.gdl.editor.controller; import se.cambio.cds.gdl.editor.util.DefinitionDependencyChecker; import se.cambio.cds.gdl.editor.view.dialog.*; import se.cambio.cds.gdl.editor.view.panels.DVLocalCodedTextPanel; import se.cambio.cds.gdl.editor.view.util.AttributeFunctionContainerNode; import se.cambio.cds.gdl.editor.view.util.NodeDefinitionConversor; import se.cambio.cds.gdl.model.Term; import se.cambio.cds.gdl.model.expression.ExpressionItem; import se.cambio.cds.gdl.model.expression.OperatorKind; import se.cambio.cds.gdl.model.expression.StringConstant; import se.cambio.cds.gdl.model.readable.rule.lines.*; import se.cambio.cds.gdl.model.readable.rule.lines.elements.*; import se.cambio.cds.gdl.model.readable.rule.lines.interfaces.ActionRuleLine; import se.cambio.cds.gdl.model.readable.rule.lines.interfaces.ArchetypeReferenceRuleLine; import se.cambio.cds.gdl.model.readable.util.PredicateAttributeVO; import se.cambio.cds.model.instance.ArchetypeReference; import se.cambio.cds.util.Domains; import se.cambio.cds.view.swing.dialogs.DialogArchetypeChooser; import se.cambio.cm.model.archetype.dto.ArchetypeDTO; import se.cambio.cm.model.archetype.vo.ArchetypeElementVO; import se.cambio.cm.model.template.dto.TemplateDTO; import se.cambio.cm.model.util.CMElement; import se.cambio.openehr.util.OpenEHRDataValues; import se.cambio.openehr.util.OpenEHRLanguageManager; import se.cambio.openehr.util.UserConfigurationManager; import se.cambio.openehr.util.exceptions.InstanceNotFoundException; import se.cambio.openehr.util.exceptions.InternalErrorException; import se.cambio.openehr.view.dialogs.DVDialogEditor; import se.cambio.openehr.view.dialogs.DialogEditorNullValue; import se.cambio.openehr.view.trees.SelectableNode; import java.awt.*; import java.util.Collection; import java.util.Iterator; public class RuleElementEditor { public static void edit(RuleLineElementWithValue<?> ruleLineElementWithValue) throws InternalErrorException, InstanceNotFoundException { if (ruleLineElementWithValue instanceof ArchetypeReferenceRuleLineDefinitionElement){ editArchetype((ArchetypeReferenceRuleLineDefinitionElement)ruleLineElementWithValue); }else if (ruleLineElementWithValue instanceof GTCodeRuleLineElement){ rename((GTCodeRuleLineElement)ruleLineElementWithValue); }else if (ruleLineElementWithValue instanceof ArchetypeElementRuleLineDefinitionElement){ editArchetypeElement((ArchetypeElementRuleLineDefinitionElement)ruleLineElementWithValue); }else if (ruleLineElementWithValue instanceof CDSEntryRuleLineElement){ selectCDSEntry((CDSEntryRuleLineElement) ruleLineElementWithValue); }else if (ruleLineElementWithValue instanceof ArchetypeElementRuleLineElement){ selectArchetypeElement((ArchetypeElementRuleLineElement) ruleLineElementWithValue); }else if (ruleLineElementWithValue instanceof DataValueRuleLineElement){ editDataValue((DataValueRuleLineElement) ruleLineElementWithValue); }else if (ruleLineElementWithValue instanceof NullValueRuleLineElement){ editNullValue((NullValueRuleLineElement) ruleLineElementWithValue); }else if (ruleLineElementWithValue instanceof PredicateArchetypeElementAttributeRuleLineElement){ editPredicateAttribute((PredicateArchetypeElementAttributeRuleLineElement) ruleLineElementWithValue); }else if (ruleLineElementWithValue instanceof ArchetypeElementAttributeRuleLineElement){ editAttribute((ArchetypeElementAttributeRuleLineElement) ruleLineElementWithValue); }else if (ruleLineElementWithValue instanceof ExpressionRuleLineElement){ editExpression((ExpressionRuleLineElement)ruleLineElementWithValue); } } public static void editArchetype(ArchetypeReferenceRuleLineDefinitionElement arrlde){ ArchetypeInstantiationRuleLine airl = (ArchetypeInstantiationRuleLine)arrlde.getParentRuleLine(); boolean showOnlyCDS = DefinitionDependencyChecker.isBeingUsedInAction(airl, EditorManager.getActiveGDLEditor()); editArchetype(arrlde, showOnlyCDS); } public static void editArchetype(ArchetypeReferenceRuleLineDefinitionElement arrlde, boolean showOnlyCDS){ Window owner = EditorManager.getActiveEditorWindow(); ArchetypeReference ar = arrlde.getValue(); String idArchetype = ar!=null?ar.getIdArchetype():null; String idTemplate = ar!=null?ar.getIdTemplate():null; boolean isTemplate = idTemplate!=null; String domainId = ar!=null?ar.getIdDomain():null; DialogArchetypeChooser dialog = new DialogArchetypeChooser(owner, idArchetype, domainId, isTemplate, showOnlyCDS); dialog.setVisible(true); if (dialog.getAnswer()){ CMElement cmElement = dialog.getSelectedCMElement(); if (cmElement instanceof ArchetypeDTO){ idArchetype = cmElement.getId(); } else if (cmElement instanceof TemplateDTO){ idArchetype = ((TemplateDTO)cmElement).getArcehtypeId(); idTemplate = cmElement.getId(); } if (idArchetype==null){ if (ar!=null){ idArchetype = ar.getIdArchetype(); idTemplate = ar.getIdTemplate(); } } if (idArchetype!=null){ String idDomain = dialog.getSelectedDomain(); ar = new ArchetypeReference(idDomain, idArchetype, idTemplate); arrlde.setValue(ar); } } } public static void rename(GTCodeRuleLineElement gtCodeRuleLineElement){ Window owner = EditorManager.getActiveEditorWindow(); String title = null; RuleLine ruleLine = gtCodeRuleLineElement.getParentRuleLine(); if (ruleLine instanceof ArchetypeInstantiationRuleLine){ title = ((ArchetypeInstantiationRuleLine)ruleLine).getArchetypeReferenceRuleLineDefinitionElement().getText(); }else if (ruleLine instanceof ArchetypeElementInstantiationRuleLine){ title = ((ArchetypeElementInstantiationRuleLine)ruleLine).getArchetypeElementRuleLineDefinitionElement().getText(); } Term term = EditorManager.getActiveGDLEditor().getTerm(gtCodeRuleLineElement.getValue()); String oldValue = term.getText(); DialogNameInsert dialog = new DialogNameInsert(owner, title, oldValue); if (dialog.getAnswer()){ term.setText(dialog.getValue()); } } public static void editArchetypeElement(ArchetypeElementRuleLineDefinitionElement aerlde) throws InstanceNotFoundException, InternalErrorException { ArchetypeReference ar = aerlde.getArchetypeReference(); if (ar!=null){ SelectableNode<Object> node = NodeDefinitionConversor.getElementsInArchetypeNode(ar.getIdArchetype(), ar.getIdTemplate(), true, true, aerlde.getArchetypeManager()); DialogElementSelection dialog = new DialogElementSelection(EditorManager.getActiveEditorWindow(), node); dialog.setVisible(true); if (dialog.getAnswer()){ Object obj = dialog.getSelectedObject(); if (obj instanceof ArchetypeElementVO){ aerlde.setValue((ArchetypeElementVO)obj); RuleLine ruleLine = aerlde.getParentRuleLine(); if (ruleLine instanceof ArchetypeElementInstantiationRuleLine){ ArchetypeElementInstantiationRuleLine aeirl = (ArchetypeElementInstantiationRuleLine)ruleLine; String gtCode = aeirl.getGTCodeRuleLineElement().getValue(); Term term = EditorManager.getActiveGDLEditor().getTerm(gtCode); if (term.getText()==null || term.getText().isEmpty()){ String name = aerlde.getArchetypeManager().getArchetypeElements().getText(aerlde.getValue(), UserConfigurationManager.getLanguage()); String desc = aerlde.getArchetypeManager().getArchetypeElements().getDescription(aerlde.getValue(), UserConfigurationManager.getLanguage()); term.setText(name); term.setDescription(desc); } } } } } } public static void selectArchetypeElement(ArchetypeElementRuleLineElement arrle){ GDLEditor controller = EditorManager.getActiveGDLEditor(); boolean onlyCDSDomain = onlyCDSDomain(arrle); Object selectedObject = null; ArchetypeReference ar = getArchetypeReferenceFromCreateInstanceRuleLine(arrle, onlyCDSDomain); DialogElementInstanceSelection dialog = new DialogElementInstanceSelection(EditorManager.getActiveEditorWindow(), controller, onlyCDSDomain, ar); dialog.setVisible(true); if (dialog.getAnswer()){ selectedObject = dialog.getSelectedObject(); } if (selectedObject instanceof GTCodeRuleLineElement){ GTCodeRuleLineElement gtCodeRuleLineElement = (GTCodeRuleLineElement)selectedObject; if (gtCodeRuleLineElement.getParentRuleLine() instanceof ArchetypeElementInstantiationRuleLine){ arrle.setValue(gtCodeRuleLineElement); } }else if (selectedObject instanceof ArchetypeInstantiationRuleLine){ ArchetypeInstantiationRuleLine airl = (ArchetypeInstantiationRuleLine)selectedObject; ArchetypeElementInstantiationRuleLine aeirl = controller.addArchetypeElement(airl); if (aeirl!=null){ arrle.setValue(aeirl.getGTCodeRuleLineElement()); } } } private static ArchetypeReference getArchetypeReferenceFromCreateInstanceRuleLine(RuleLineElementWithValue<?> ruleLineElement, boolean onlyCDSDomain){ //If the set is inside a create instance action, we limit the selection to the created archetype reference if (onlyCDSDomain && ruleLineElement.getParentRuleLine().getParentRuleLine() instanceof CreateInstanceActionRuleLine){ return ((CreateInstanceActionRuleLine)ruleLineElement.getParentRuleLine().getParentRuleLine()).getArchetypeReference(); }else{ return null; } } //This method creates a dialog, if the user selects a valid object (ArchetypeInstantiationRuleLine) // it sets the referring element's value (CDSEntryRuleLineElement) to the GTCode of the archetype instance. public static void selectCDSEntry(CDSEntryRuleLineElement cdserle){ GDLEditor controller = EditorManager.getActiveGDLEditor(); boolean onlyCDSDomain = true; Object selectedObject = null; //if (!emptyDefinitions(controller.getDefinitionRuleLines(), onlyCDSDomain)){ DialogEntrySelection dialog = new DialogEntrySelection(EditorManager.getActiveEditorWindow(), controller, onlyCDSDomain); dialog.setVisible(true); if (dialog.getAnswer()){ selectedObject = dialog.getSelectedObject(); } if (selectedObject instanceof ArchetypeInstantiationRuleLine){ ArchetypeInstantiationRuleLine airl = (ArchetypeInstantiationRuleLine)selectedObject; if (airl!=null){ cdserle.setValue(airl.getGTCodeRuleLineElement()); } } } public static boolean emptyDefinitions(Collection<RuleLine> definitionRuleLines, boolean onlyShowCDS){ if (!onlyShowCDS){ return definitionRuleLines.isEmpty(); }else{ Iterator<RuleLine> i = definitionRuleLines.iterator(); while(i.hasNext()){ RuleLine ruleLine = i.next(); if (ruleLine instanceof ArchetypeReferenceRuleLine){ ArchetypeReference ar = ((ArchetypeReferenceRuleLine)ruleLine).getArchetypeReference(); if (Domains.CDS_ID.equals(ar.getIdDomain())){ return false; } } } return true; } } public static void editDataValue(DataValueRuleLineElement dvrle){ ArchetypeElementVO archetypeElementVO = getArchetypeElementVO(dvrle.getParentRuleLine()); if (archetypeElementVO!=null){ DVDialogEditor dialog = new DVDialogEditor( EditorManager.getActiveEditorWindow(), archetypeElementVO, true, true); //Change the behaviour if IS_A (IS_NOT_A) DV_TEXT => allow local term selection if (isAnISAComparatorWithDV(dvrle.getParentRuleLine())){ dialog.setDVGenericPanel(new DVLocalCodedTextPanel(EditorManager.getActiveGDLEditor())); } dialog.getDVGenericPanel().setDataValue(dvrle.getValue()); dialog.setVisible(true); if(dialog.getAnswer()){ dvrle.setValue(dialog.getDataValue()); } } } public static void editNullValue(NullValueRuleLineElement nvrle){ ArchetypeElementVO archetypeElementVO = getArchetypeElementVO(nvrle.getParentRuleLine()); if (archetypeElementVO!=null){ DialogEditorNullValue dialog = new DialogEditorNullValue(EditorManager.getActiveEditorWindow()); dialog.setNullValue(nvrle.getValue()); dialog.setVisible(true); if(dialog.getAnswer()){ nvrle.setValue(dialog.getSelectedNullValue()); } } } private static ArchetypeElementVO getArchetypeElementVO(RuleLine ruleLine){ ArchetypeElementVO archetypeElementVO = null; for (RuleLineElement ruleLineElement : ruleLine.getRuleLineElements()) { if (ruleLineElement instanceof ArchetypeElementRuleLineElement){ ArchetypeElementRuleLineElement aerle = (ArchetypeElementRuleLineElement) ruleLineElement; archetypeElementVO = aerle.getArchetypeElementVO(); break; }else if (ruleLineElement instanceof ArchetypeElementRuleLineDefinitionElement){ archetypeElementVO = ((ArchetypeElementRuleLineDefinitionElement)ruleLineElement).getValue(); }else if (ruleLineElement instanceof PredicateArchetypeElementAttributeRuleLineElement){ archetypeElementVO = ((PredicateArchetypeElementAttributeRuleLineElement)ruleLineElement).getValue(); }else if (ruleLineElement instanceof ArchetypeElementAttributeRuleLineElement){ ArchetypeElementRuleLineElement aerle = ((ArchetypeElementAttributeRuleLineElement)ruleLineElement).getValue(); if (aerle!=null){ archetypeElementVO = aerle.getArchetypeElementVO(); } } } return archetypeElementVO; } private static boolean isAnISAComparatorWithDV(RuleLine ruleLine){ if (ruleLine instanceof ElementComparisonWithDVConditionRuleLine){ OperatorKind operatorKind = ((ElementComparisonWithDVConditionRuleLine)ruleLine).getComparisonOperatorRuleLineElement().getValue(); return operatorKind!=null && (operatorKind.equals(OperatorKind.IS_A) || operatorKind.equals(OperatorKind.IS_NOT_A)); }else if (ruleLine instanceof WithElementPredicateAttributeDefinitionRuleLine){ OperatorKind operatorKind = ((WithElementPredicateAttributeDefinitionRuleLine)ruleLine).getComparisonOperatorRuleLineElement().getValue(); return operatorKind!=null && (operatorKind.equals(OperatorKind.IS_A) || operatorKind.equals(OperatorKind.IS_NOT_A)); }else{ return false; } } public static void editAttribute(ArchetypeElementAttributeRuleLineElement aearle){ GDLEditor controller = EditorManager.getActiveGDLEditor(); boolean onlyCDSDomain = (aearle.getParentRuleLine() instanceof ActionRuleLine); Object selectedObject = null; ArchetypeReference ar = getArchetypeReferenceFromCreateInstanceRuleLine(aearle, onlyCDSDomain); DialogElementAttributeFunctionInstanceSelection dialog = new DialogElementAttributeFunctionInstanceSelection(EditorManager.getActiveEditorWindow(), controller, onlyCDSDomain, ar); dialog.setVisible(true); if (dialog.getAnswer()){ selectedObject = dialog.getSelectedObject(); } if (selectedObject instanceof AttributeFunctionContainerNode){ AttributeFunctionContainerNode attributeContainerNode = (AttributeFunctionContainerNode) selectedObject; ArchetypeElementRuleLineElement archetypeElementRuleLineElement = new ArchetypeElementRuleLineElement(aearle.getParentRuleLine()); archetypeElementRuleLineElement.setValue(attributeContainerNode.getGtCodeRuleLineElement()); aearle.setValue(archetypeElementRuleLineElement); aearle.setAttribute(attributeContainerNode.getAttributeFunction()); }else if (selectedObject instanceof GTCodeRuleLineElement){ GTCodeRuleLineElement gtCodeRuleLineElement = (GTCodeRuleLineElement)selectedObject; if (gtCodeRuleLineElement.getParentRuleLine() instanceof ArchetypeInstantiationRuleLine){ ArchetypeInstantiationRuleLine airl = (ArchetypeInstantiationRuleLine)gtCodeRuleLineElement.getParentRuleLine(); controller.addArchetypeElement(airl); editAttribute(aearle); } } } private static void editPredicateAttribute(PredicateArchetypeElementAttributeRuleLineElement paearle){ GDLEditor controller = EditorManager.getActiveGDLEditor(); WithElementPredicateExpressionDefinitionRuleLine wepedrl = (WithElementPredicateExpressionDefinitionRuleLine)paearle.getParentRuleLine(); DialogPredicateElementAttributeInstanceSelection dialog = new DialogPredicateElementAttributeInstanceSelection( EditorManager.getActiveEditorWindow(), controller, wepedrl.getArchetypeReference().getIdArchetype(), wepedrl.getArchetypeReference().getIdTemplate()); dialog.setVisible(true); if (dialog.getAnswer()){ Object obj = dialog.getSelectedObject(); if (obj instanceof PredicateAttributeVO){ PredicateAttributeVO predicateAttributeVO = (PredicateAttributeVO)obj; paearle.setAttribute(predicateAttributeVO.getAttribute()); paearle.setValue(predicateAttributeVO.getArchetypeElementVO()); } } } private static boolean onlyCDSDomain(ArchetypeElementRuleLineElement aearle){ if (aearle.getParentRuleLine() instanceof ActionRuleLine){ if (aearle.getParentRuleLine() instanceof SetElementWithElementActionRuleLine){ return !aearle.equals(((SetElementWithElementActionRuleLine)aearle.getParentRuleLine()).getSecondArchetypeElementRuleLineElement()); }else{ return true; } }else{ return false; } } public static void editExpression(ExpressionRuleLineElement arle){ ArchetypeElementVO archetypeElementVO = getArchetypeElementVO(arle.getParentRuleLine()); if (archetypeElementVO!=null){ String attribute = getAttributeValue(arle); if (OpenEHRDataValues.UNITS_ATT.equals(attribute)){ Collection<String> units = arle.getArchetypeManager().getUnits().getUnits(archetypeElementVO.getIdTemplate(), archetypeElementVO.getId()); String oldValue = null; if (arle.getValue() instanceof StringConstant){ oldValue = ((StringConstant)arle.getValue()).getValue(); } DialogComboBoxInsert dialog = new DialogComboBoxInsert(EditorManager.getActiveEditorWindow(), OpenEHRLanguageManager.getMessage("Units"), oldValue, units); dialog.setVisible(true); if (dialog.getAnswer()){ String unit = dialog.getSelectedItem(); arle.setValue(new StringConstant(unit)); } }else{ boolean inPredicate = false; if (arle.getParentRuleLine() instanceof WithElementPredicateExpressionDefinitionRuleLine){ inPredicate = true; } ArchetypeReference ar = getArchetypeReferenceFromCreateInstanceRuleLine(arle, true); DialogExpressionEditor dialog = new DialogExpressionEditor(EditorManager.getActiveEditorWindow(), archetypeElementVO, arle, inPredicate, ar); dialog.setVisible(true); if (dialog.getAnswer()){ ExpressionItem expressionItem = dialog.getExpressionItem(); arle.setValue(expressionItem); } } } } private static String getAttributeValue(ExpressionRuleLineElement arle){ Iterator<RuleLineElement> i = arle.getParentRuleLine().getRuleLineElements().iterator(); while (i.hasNext()){ RuleLineElement rle = i.next(); if (rle instanceof ArchetypeElementAttributeRuleLineElement){ return ((ArchetypeElementAttributeRuleLineElement)rle).getAttribute(); } } return null; } } /* * ***** 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 ***** */