use of org.olat.ims.qti.editor.beecom.objects.Section in project openolat by klemens.
the class QTI12ResultDetailsController method checkEssay.
private boolean checkEssay() {
QTIDocument doc = TestFileResource.getQTIDocument(repositoryEntry.getOlatResource());
if (doc != null && doc.getAssessment() != null) {
Assessment ass = doc.getAssessment();
// Sections with their Items
List<Section> sections = ass.getSections();
for (Section section : sections) {
List<Item> items = section.getItems();
for (Item item : items) {
String ident = item.getIdent();
if (ident != null && ident.startsWith("QTIEDIT:ESSAY")) {
return true;
}
}
}
}
return false;
}
use of org.olat.ims.qti.editor.beecom.objects.Section in project openolat by klemens.
the class QTIEditHelper method getControl.
/**
* Get controls.
* @param object
* @return Controls.
*/
public static Control getControl(QTIObject object) {
Control control = null;
List controls = null;
if (Item.class.isAssignableFrom(object.getClass())) {
Item item = (Item) object;
controls = item.getItemcontrols();
} else if (Section.class.isAssignableFrom(object.getClass())) {
Section section = (Section) object;
controls = section.getSectioncontrols();
} else if (Assessment.class.isAssignableFrom(object.getClass())) {
Assessment assessment = (Assessment) object;
controls = assessment.getAssessmentcontrols();
}
for (Iterator i = controls.iterator(); i.hasNext(); ) {
Control tmp = (Control) i.next();
if (tmp.getView() != null) {
if (tmp.getView().equalsIgnoreCase("all")) {
control = tmp;
break;
}
} else {
control = tmp;
}
}
return control;
}
use of org.olat.ims.qti.editor.beecom.objects.Section in project openolat by klemens.
the class QTIEditorMainController method doExportQItem.
private void doExportQItem() {
GenericQtiNode selectedNode = menuTreeModel.getQtiNode(menuTree.getSelectedNodeId());
if (selectedNode instanceof ItemNode) {
ItemNode itemNode = (ItemNode) selectedNode;
QTIObject qtiObject = itemNode.getUnderlyingQTIObject();
if (qtiObject instanceof Item) {
ItemAndMetadata item = new ItemAndMetadata((Item) qtiObject);
VFSContainer editorContainer = qtiPackage.getBaseDir();
qtiQpoolServiceProvider.importBeecomItem(getIdentity(), item, editorContainer, getLocale());
showInfo("export.qpool.successful", "1");
}
} else if (selectedNode instanceof SectionNode) {
SectionNode sectionNode = (SectionNode) selectedNode;
QTIObject qtiObject = sectionNode.getUnderlyingQTIObject();
if (qtiObject instanceof Section) {
int count = doExportSection((Section) qtiObject);
showInfo("export.qpool.successful", Integer.toString(count));
}
} else if (selectedNode instanceof AssessmentNode) {
AssessmentNode assessmentNode = (AssessmentNode) selectedNode;
QTIObject qtiObject = assessmentNode.getUnderlyingQTIObject();
if (qtiObject instanceof Assessment) {
int count = doExportAssessment((Assessment) qtiObject);
showInfo("export.qpool.successful", Integer.toString(count));
}
}
}
use of org.olat.ims.qti.editor.beecom.objects.Section in project openolat by klemens.
the class QTIEditorMainController method event.
/**
* @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
* org.olat.core.gui.components.Component,
* org.olat.core.gui.control.Event)
*/
public void event(UserRequest ureq, Component source, Event event) {
//
if (source == menuTree) {
// catch menu tree clicks
if (event.getCommand().equals(MenuTree.COMMAND_TREENODE_CLICKED)) {
GenericQtiNode clickedNode;
clickedNode = menuTreeModel.getQtiNode(menuTree.getSelectedNodeId());
Component tabbedPane = clickedNode.createEditTabbedPane(ureq, getWindowControl(), getTranslator(), this);
if (tabbedPane != null) {
main.put("tabbedPane", tabbedPane);
} else {
VelocityContainer itemNotEditable = createVelocityContainer("tab_itemAlien");
main.put("tabbedPane", itemNotEditable);
return;
}
// only available in full edit mode
if (clickedNode instanceof AssessmentNode) {
deleteLink.setEnabled(false);
moveLink.setEnabled(false);
copyLink.setEnabled(false);
stackedPanel.setDirty(true);
} else {
deleteLink.setEnabled(true && !restrictedEdit);
moveLink.setEnabled(true && !restrictedEdit);
if (clickedNode instanceof ItemNode) {
copyLink.setEnabled(true && !restrictedEdit);
} else {
copyLink.setEnabled(false);
}
stackedPanel.setDirty(true);
}
}
} else if (source == exitVC) {
if (CMD_EXIT_SAVE.equals(event.getCommand())) {
if (isRestrictedEdit() && history.size() > 0) {
// changes were recorded
// start work flow:
// -sending an e-mail to everybody being a stake holder of this qti
// resource
// -email with change message
// -after sending email successfully -> saveNexit is called.
chngMsgFormVC = createVelocityContainer("changeMsgForm");
// FIXME:pb:a Bitte diesen Velocity container entfernen und statt
// dessen den
// ContentOnlyController verwenden. Es ist äusserst wichtig dass das
// Layout nie selber gemacht
// wird sondern immer die Layout controller verwendet werden, d.h. den
// ContentOnlyController oder
// den MenuAndToolController. Dort kann das Tool übrigens auch null
// sein wenn man nur ein Menü braucht.
// TODO:pb:a extend ContentOnlyController to work also if menu and
// tool are null, hence only content is desired
String userN = UserManager.getInstance().getUserDisplayEmail(ureq.getIdentity(), ureq.getLocale());
String lastN = ureq.getIdentity().getUser().getProperty(UserConstants.LASTNAME, ureq.getLocale());
String firstN = ureq.getIdentity().getUser().getProperty(UserConstants.FIRSTNAME, ureq.getLocale());
String changeMsg = "Changed by: " + firstN + " " + lastN + " [" + userN + "]\n";
changeMsg += createChangeMessage();
changeEmail.setBodyText(changeMsg);
chngMsgFormVC.contextPut("chngMsg", changeEmail.getBodyText());
removeAsListenerAndDispose(chngMsgFrom);
chngMsgFrom = new ChangeMessageForm(ureq, getWindowControl());
listenTo(chngMsgFrom);
chngMsgFormVC.put("chngMsgForm", chngMsgFrom.getInitialComponent());
exitPanel.setContent(chngMsgFormVC);
return;
} else {
// remove modal dialog and proceed with exit process
cmcExit.deactivate();
removeAsListenerAndDispose(cmcExit);
cmcExit = null;
// remove lock, clean tmp dir, fire done event to close editor
saveAndExit(ureq);
}
} else if (CMD_EXIT_DISCARD.equals(event.getCommand())) {
// remove modal dialog and proceed with exit process
cmcExit.deactivate();
removeAsListenerAndDispose(cmcExit);
cmcExit = null;
// cleanup, so package does not get resumed
qtiPackage.cleanupTmpPackageDir();
// remove lock
removeLocksAndExit(ureq);
} else if (CMD_EXIT_CANCEL.equals(event.getCommand())) {
// remove modal dialog and go back to edit mode
cmcExit.deactivate();
removeAsListenerAndDispose(cmcExit);
cmcExit = null;
}
} else if (source == notEditableButton) {
// close editor
fireEvent(ureq, Event.DONE_EVENT);
} else if (closeLink == source) {
// exitVC hook:
// save package back to repository
exitVC = createVelocityContainer("exitDialog");
exitPanel = new Panel("exitPanel");
exitPanel.setContent(exitVC);
cmcExit = new CloseableModalController(getWindowControl(), translate("editor.preview.close"), exitPanel, true, translate("exit.header"));
cmcExit.activate();
listenTo(cmcExit);
return;
} else if (previewLink == source) {
// preview
previewController = CoreSpringFactory.getImpl(IQManager.class).createIQDisplayController(new QTIEditorResolver(qtiPackage), qtiPackage.getQTIDocument().isSurvey() ? AssessmentInstance.QMD_ENTRY_TYPE_SURVEY : AssessmentInstance.QMD_ENTRY_TYPE_SELF, new IQPreviewSecurityCallback(), ureq, getWindowControl());
if (previewController.isReady()) {
// in case previewController was unable to initialize, a message was
// set by displayController
// this is the case if no more attempts or security check was
// unsuccessfull
previewController.addControllerListener(this);
cmcPrieview = new CloseableModalController(getWindowControl(), translate("editor.preview.close"), previewController.getInitialComponent());
cmcPrieview.activate();
listenTo(cmcPrieview);
} else {
getWindowControl().setWarning(translate("error.preview"));
}
} else if (deleteLink == source) {
// multi return in Firefox
if (deleteDialog != null)
return;
GenericQtiNode clickedNode = menuTreeModel.getQtiNode(menuTree.getSelectedNodeId());
String msg = "";
if (clickedNode instanceof SectionNode) {
if (QTIEditHelper.countSections(qtiPackage.getQTIDocument().getAssessment()) == 1) {
// At least one section
getWindowControl().setError(translate("error.atleastonesection"));
return;
}
msg = translate("delete.section", clickedNode.getTitle());
} else if (clickedNode instanceof ItemNode) {
if (((SectionNode) clickedNode.getParent()).getChildCount() == 1) {
// At least one item
getWindowControl().setError(translate("error.atleastoneitem"));
return;
}
msg = translate("delete.item", clickedNode.getTitle());
}
deleteDialog = activateYesNoDialog(ureq, null, msg, deleteDialog);
deleteDialog.setUserObject(clickedNode);
return;
} else if (moveLink == source) {
// cannot move the last item
GenericQtiNode clickedNode = menuTreeModel.getQtiNode(menuTree.getSelectedNodeId());
if (clickedNode instanceof ItemNode && ((SectionNode) clickedNode.getParent()).getChildCount() == 1) {
getWindowControl().setError(translate("error.move.atleastoneitem"));
} else {
TreeNode selectedNode = menuTree.getSelectedNode();
int type = (selectedNode instanceof SectionNode) ? InsertItemTreeModel.INSTANCE_ASSESSMENT : InsertItemTreeModel.INSTANCE_SECTION;
InsertItemTreeModel treeModel = new InsertItemTreeModel(menuTreeModel, selectedNode, type);
moveCtrl = new InsertNodeController(ureq, getWindowControl(), treeModel);
listenTo(moveCtrl);
cmc = new CloseableModalController(getWindowControl(), "close", moveCtrl.getInitialComponent(), true, translate("title.move"));
cmc.activate();
listenTo(cmc);
}
} else if (copyLink == source) {
InsertItemTreeModel treeModel = new InsertItemTreeModel(menuTreeModel, menuTree.getSelectedNode(), InsertItemTreeModel.INSTANCE_SECTION);
copyCtrl = new InsertNodeController(ureq, getWindowControl(), treeModel);
listenTo(copyCtrl);
cmc = new CloseableModalController(getWindowControl(), "close", copyCtrl.getInitialComponent(), true, translate("title.copy"));
cmc.activate();
listenTo(cmc);
} else if (addPoolLink == source) {
doSelectQItem(ureq);
} else if (exportPoolLink == source) {
doExportQItem();
} else if (exportDocLink == source) {
doExportDocx(ureq);
} else if (convertQTI21Link == source) {
doConvertToQTI21(ureq);
} else if (importTableLink == source) {
doImportTable(ureq);
} else if (addSectionLink == source) {
Section newSection = QTIEditHelper.createSection(getTranslator());
Item newItem = QTIEditHelper.createSCItem(getTranslator());
newSection.getItems().add(newItem);
SectionNode scNode = new SectionNode(newSection, qtiPackage);
ItemNode itemNode = new ItemNode(newItem, qtiPackage);
scNode.addChild(itemNode);
doSelectInsertionPoint(ureq, CMD_TOOLS_ADD_SECTION, scNode);
} else if (addSCLink == source) {
ItemNode insertObject = new ItemNode(QTIEditHelper.createSCItem(getTranslator()), qtiPackage);
doSelectInsertionPoint(ureq, CMD_TOOLS_ADD_SINGLECHOICE, insertObject);
} else if (addMCLink == source) {
ItemNode insertObject = new ItemNode(QTIEditHelper.createMCItem(getTranslator()), qtiPackage);
doSelectInsertionPoint(ureq, CMD_TOOLS_ADD_MULTIPLECHOICE, insertObject);
} else if (addKPrimLink == source) {
ItemNode insertObject = new ItemNode(QTIEditHelper.createKPRIMItem(getTranslator()), qtiPackage);
doSelectInsertionPoint(ureq, CMD_TOOLS_ADD_KPRIM, insertObject);
} else if (addFIBLink == source) {
ItemNode insertObject = new ItemNode(QTIEditHelper.createFIBItem(getTranslator()), qtiPackage);
doSelectInsertionPoint(ureq, CMD_TOOLS_ADD_FIB, insertObject);
} else if (addEssayLink == source) {
ItemNode insertObject = new ItemNode(QTIEditHelper.createEssayItem(getTranslator()), qtiPackage);
doSelectInsertionPoint(ureq, CMD_TOOLS_ADD_FREETEXT, insertObject);
}
}
use of org.olat.ims.qti.editor.beecom.objects.Section in project openolat by klemens.
the class SectionParser method parse.
public Object parse(Element element) {
// assert element.getName().equalsIgnoreCase("questestinterop");
Section section = new Section();
// attributes
section.setIdent(element.attribute("ident").getValue());
section.setTitle(element.attribute("title").getValue());
// elements
// DURATION
Duration duration = (Duration) parserManager.parse(element.element("duration"));
section.setDuration(duration);
List sectioncontrolsXML = element.elements("sectioncontrol");
List<Object> sectioncontrols = new ArrayList<>();
for (Iterator i = sectioncontrolsXML.iterator(); i.hasNext(); ) {
sectioncontrols.add(parserManager.parse((Element) i.next()));
}
if (sectioncontrols.size() == 0) {
sectioncontrols.add(new Control());
}
section.setSectioncontrols(sectioncontrols);
// SELECTION ORDERING
SelectionOrdering selectionOrdering = (SelectionOrdering) parserManager.parse(element.element("selection_ordering"));
if (selectionOrdering != null) {
section.setSelection_ordering(selectionOrdering);
} else {
section.setSelection_ordering(new SelectionOrdering());
}
// SECTIONS
List sectionsXML = element.elements("section");
List<Object> sections = new ArrayList<>();
for (Iterator i = sectionsXML.iterator(); i.hasNext(); ) {
sections.add(parserManager.parse((Element) i.next()));
}
section.setSections(sections);
// ITEMS
List itemsXML = element.elements("item");
List<Object> items = new ArrayList<>();
for (Iterator i = itemsXML.iterator(); i.hasNext(); ) {
items.add(parserManager.parse((Element) i.next()));
}
section.setItems(items);
// OBJECTIVES
Element mattext = (Element) element.selectSingleNode("./objectives/material/mattext");
if (mattext != null)
section.setObjectives(mattext.getTextTrim());
// FEEDBACKS
List feedbacksXML = element.elements("sectionfeedback");
List<QTIObject> feedbacks = new ArrayList<>();
for (Iterator i = feedbacksXML.iterator(); i.hasNext(); ) {
QTIObject tmp = (QTIObject) parserManager.parse((Element) i.next());
feedbacks.add(tmp);
}
section.setSectionfeedbacks(feedbacks);
// OUTCOMES_PROCESSING
// TODO: maybe we should use the OutcomesProcessing object and parser here? Same as on
// assessment level?
QTIObject outcomes_processing = (QTIObject) parserManager.parse(element.element("outcomes_processing"));
section.setOutcomes_processing(outcomes_processing);
return section;
}
Aggregations