From b52990a6c302cff31a4a085b889741989fa28d38 Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Wed, 8 Jun 2016 21:28:07 +0200 Subject: [PATCH] OO-1593: convert hint from QTI 1.2, handle disabled math extension, better behavior of the dropdown tree in assessment tool... --- .../AssessmentIdentityCourseController.java | 14 ++++++- .../tool/CourseNodeSelectionController.java | 37 ++++++++++++++++--- .../ims/qti21/pool/QTI12To21Converter.java | 7 ++++ .../qti21/ui/_i18n/LocalStrings_en.properties | 2 + .../AssessmentObjectComponentRenderer.java | 7 ++++ .../unsupportedCustomInteraction.html | 2 +- .../DateDisplayPropertyHandler.java | 5 +++ 7 files changed, 66 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityCourseController.java b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityCourseController.java index 18786de6321..423ea79b6e4 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityCourseController.java +++ b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityCourseController.java @@ -74,6 +74,8 @@ public class AssessmentIdentityCourseController extends BasicController implemen private CourseNodeSelectionController courseNodeChooserCtrl; private CloseableCalloutWindowController courseNodeChooserCalloutCtrl; + private CourseNode currentCourseNode; + @Autowired private BaseSecurity securityManager; @@ -182,6 +184,11 @@ public class AssessmentIdentityCourseController extends BasicController implemen courseNodeChooserCtrl = new CourseNodeSelectionController(ureq, getWindowControl(), courseEntry); listenTo(courseNodeChooserCtrl); + if(currentCourseNode != null) { + courseNodeChooserCtrl.selectedCourseNode(currentCourseNode); + } else { + courseNodeChooserCtrl.selectedCourseNode(treeOverviewCtrl.getSelectedCourseNode()); + } courseNodeChooserCalloutCtrl = new CloseableCalloutWindowController(ureq, getWindowControl(), courseNodeChooserCtrl.getInitialComponent(), courseNodeSelectionLink, "", true, ""); @@ -210,7 +217,8 @@ public class AssessmentIdentityCourseController extends BasicController implemen private void doSelectCourseNode(UserRequest ureq, CourseNode courseNode) { if(courseNode == null) { return; - } + } + currentCourseNode = courseNode; stackPanel.popUpToController(this); if(treeOverviewCtrl.isRoot(courseNode)) { return; @@ -241,7 +249,9 @@ public class AssessmentIdentityCourseController extends BasicController implemen nextLink = LinkFactory.createToolLink("nextelement", translate("next"), this, "o_icon_next"); nextLink.setTitle(translate("command.next")); - nextLink.setEnabled(index > 0 && index < numOfNodes); + CourseNode nextNode = treeOverviewCtrl.getNextNode(courseNode); + boolean hasNext = (nextNode != null && nextNode.getParent() != null); + nextLink.setEnabled(hasNext); stackPanel.addTool(nextLink, Align.rightEdge, false); } } diff --git a/src/main/java/org/olat/course/assessment/ui/tool/CourseNodeSelectionController.java b/src/main/java/org/olat/course/assessment/ui/tool/CourseNodeSelectionController.java index 4102b829d3d..64478f027ac 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/CourseNodeSelectionController.java +++ b/src/main/java/org/olat/course/assessment/ui/tool/CourseNodeSelectionController.java @@ -22,16 +22,21 @@ package org.olat.course.assessment.ui.tool; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.tree.MenuTree; +import org.olat.core.gui.components.tree.TreeEvent; import org.olat.core.gui.components.tree.TreeModel; +import org.olat.core.gui.components.tree.TreeNode; import org.olat.core.gui.components.velocity.VelocityContainer; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; +import org.olat.core.util.tree.TreeHelper; import org.olat.course.CourseFactory; import org.olat.course.ICourse; import org.olat.course.assessment.AssessmentHelper; import org.olat.course.assessment.ui.tool.event.CourseNodeEvent; +import org.olat.course.nodes.AssessableCourseNode; import org.olat.course.nodes.CourseNode; +import org.olat.course.nodes.STCourseNode; import org.olat.repository.RepositoryEntry; /** @@ -53,6 +58,7 @@ public class CourseNodeSelectionController extends BasicController { menuTree = new MenuTree("menuTree"); TreeModel tm = AssessmentHelper.assessmentTreeModel(course); menuTree.setTreeModel(tm); + menuTree.setExpandSelectedNode(true); menuTree.setSelectedNodeId(tm.getRootNode().getIdent()); menuTree.addListener(this); @@ -65,15 +71,36 @@ public class CourseNodeSelectionController extends BasicController { protected void doDispose() { // } + + public void selectedCourseNode(CourseNode courseNode) { + TreeNode selectedNode = TreeHelper.findNodeByUserObject(courseNode, menuTree.getTreeModel().getRootNode()); + if(selectedNode != null) { + menuTree.setSelectedNode(selectedNode); + } + } @Override protected void event(UserRequest ureq, Component source, Event event) { if (source == menuTree) { - if (event.getCommand().equals(MenuTree.COMMAND_TREENODE_CLICKED)) { - Object uo = menuTree.getSelectedNode().getUserObject(); - if(uo instanceof CourseNode) { - CourseNode selectedNode = (CourseNode)uo; - fireEvent(ureq, new CourseNodeEvent(CourseNodeEvent.SELECT_COURSE_NODE, selectedNode.getIdent())); + if(event instanceof TreeEvent) { + TreeEvent te = (TreeEvent)event; + if(TreeEvent.COMMAND_TREENODE_OPEN.equals(te.getSubCommand()) || TreeEvent.COMMAND_TREENODE_CLOSE.equals(te.getSubCommand())) { + Object uo = menuTree.getSelectedNode().getUserObject(); + if(menuTree.getSelectedNode() == menuTree.getTreeModel().getRootNode()) { + //do nothing + } else if(uo instanceof AssessableCourseNode && !(uo instanceof STCourseNode)) { + AssessableCourseNode selectedNode = (AssessableCourseNode)uo; + fireEvent(ureq, new CourseNodeEvent(CourseNodeEvent.SELECT_COURSE_NODE, selectedNode.getIdent())); + } + } else if (event.getCommand().equals(MenuTree.COMMAND_TREENODE_CLICKED)) { + Object uo = menuTree.getSelectedNode().getUserObject(); + if(menuTree.getSelectedNode() == menuTree.getTreeModel().getRootNode()) { + CourseNode rootNode = (CourseNode)uo; + fireEvent(ureq, new CourseNodeEvent(CourseNodeEvent.SELECT_COURSE_NODE, rootNode.getIdent())); + } else if(uo instanceof AssessableCourseNode && !(uo instanceof STCourseNode)) { + AssessableCourseNode selectedNode = (AssessableCourseNode)uo; + fireEvent(ureq, new CourseNodeEvent(CourseNodeEvent.SELECT_COURSE_NODE, selectedNode.getIdent())); + } } } } diff --git a/src/main/java/org/olat/ims/qti21/pool/QTI12To21Converter.java b/src/main/java/org/olat/ims/qti21/pool/QTI12To21Converter.java index f58ffed61e2..35c58576e2a 100644 --- a/src/main/java/org/olat/ims/qti21/pool/QTI12To21Converter.java +++ b/src/main/java/org/olat/ims/qti21/pool/QTI12To21Converter.java @@ -473,6 +473,12 @@ public class QTI12To21Converter { String questionText = question.getQuestion().renderAsHtmlForEditor(); itemBuilder.setQuestion(questionText); + String hintText = question.getHintText(); + if(StringHelper.containsNonWhitespace(hintText)) { + ModalFeedbackBuilder hint = itemBuilder.createHint(); + hint.setText(hintText); + } + String feedbackMastery = QTIEditHelper.getFeedbackMasteryText(item); if(StringHelper.containsNonWhitespace(feedbackMastery)) { ModalFeedbackBuilder feedback = itemBuilder.createCorrectFeedback(); @@ -484,6 +490,7 @@ public class QTI12To21Converter { ModalFeedbackBuilder feedback = itemBuilder.createIncorrectFeedback(); feedback.setText(feedbackFail); } + } private void convertDuration(Duration duration, ControlObject<?> parent) { diff --git a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties index a13c81485bf..45a342ffaf3 100644 --- a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties @@ -97,3 +97,5 @@ test.complete=Test complete test.entry.page.text=This test consists of up to {0} parts. test.entry.page.title=Test entry test.part.complete=Test part complete +unsupported.custom.interaction=Unsupported custom interaction + diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectComponentRenderer.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectComponentRenderer.java index cb29ac41fb7..48640f47fb8 100644 --- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectComponentRenderer.java +++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectComponentRenderer.java @@ -82,6 +82,7 @@ import org.olat.core.logging.Tracing; import org.olat.core.util.CodeHelper; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; +import org.olat.ims.qti21.QTI21Module; import org.olat.ims.qti21.QTI21Service; import org.olat.ims.qti21.XmlUtilities; import org.xml.sax.InputSource; @@ -595,6 +596,12 @@ public abstract class AssessmentObjectComponentRenderer extends DefaultComponent } break; } + case "mathEntryInteraction": { + if(!CoreSpringFactory.getImpl(QTI21Module.class).isMathAssessExtensionEnabled()) { + interactionName = "mathEntryInteractionNotEnabled"; + break; + } + } default: interactionName = interaction.getQtiClassName(); break; } diff --git a/src/main/java/org/olat/ims/qti21/ui/components/_content/unsupportedCustomInteraction.html b/src/main/java/org/olat/ims/qti21/ui/components/_content/unsupportedCustomInteraction.html index 03b3761d054..b4e165e9ada 100644 --- a/src/main/java/org/olat/ims/qti21/ui/components/_content/unsupportedCustomInteraction.html +++ b/src/main/java/org/olat/ims/qti21/ui/components/_content/unsupportedCustomInteraction.html @@ -1 +1 @@ -<h1>Unsupported custom interaction</h1> \ No newline at end of file +<div class="o_warning">$r.translate("unsupported.custom.interaction") <strong><$localName></strong></div> \ No newline at end of file diff --git a/src/main/java/org/olat/user/propertyhandlers/DateDisplayPropertyHandler.java b/src/main/java/org/olat/user/propertyhandlers/DateDisplayPropertyHandler.java index f770c83c5f1..de3d7b7dc3d 100644 --- a/src/main/java/org/olat/user/propertyhandlers/DateDisplayPropertyHandler.java +++ b/src/main/java/org/olat/user/propertyhandlers/DateDisplayPropertyHandler.java @@ -142,4 +142,9 @@ public class DateDisplayPropertyHandler extends AbstractUserPropertyHandler { public String getStringValue(String displayValue, Locale locale) { return displayValue; } + + @Override + protected void setInternalGetterSetter(String name) { + //do nothing, artificial value + } } \ No newline at end of file -- GitLab