use of org.olat.ims.qti.editor.tree.ItemNode in project OpenOLAT by OpenOLAT.
the class QTIEditorMainController method doConvertItemToQtiNode.
private GenericQtiNode doConvertItemToQtiNode(QuestionItemView qitemv) {
VFSContainer editorContainer = qtiPackage.getBaseDir();
Item theItem = qtiQpoolServiceProvider.exportToQTIEditor(qitemv, editorContainer);
GenericQtiNode node = new ItemNode(theItem, qtiPackage);
return node;
}
use of org.olat.ims.qti.editor.tree.ItemNode in project OpenOLAT by OpenOLAT.
the class QTIEditorMainController method doCopy.
private void doCopy(UserRequest ureq, TreePosition tp) {
// user chose a position to insert the node to be copied
int targetPos = tp.getChildpos();
ItemNode selectedNode = (ItemNode) menuTree.getSelectedNode();
// only items are moveable
// use XStream instead of ObjectCloner
// Item qtiItem =
// (Item)xstream.fromXML(xstream.toXML(selectedNode.getUnderlyingQTIObject()));
Item toClone = (Item) selectedNode.getUnderlyingQTIObject();
Item qtiItem = (Item) XStreamHelper.xstreamClone(toClone);
// copy flow label class too, olat-2791
Question orgQuestion = toClone.getQuestion();
if (orgQuestion instanceof ChoiceQuestion) {
String flowLabelClass = ((ChoiceQuestion) orgQuestion).getFlowLabelClass();
Question copyQuestion = qtiItem.getQuestion();
if (copyQuestion instanceof ChoiceQuestion) {
((ChoiceQuestion) copyQuestion).setFlowLabelClass(flowLabelClass);
} else {
throw new AssertException("Could not copy flow-label-class, wrong type of copy question , must be 'ChoiceQuestion' but is " + copyQuestion);
}
}
String editorIdentPrefix = "";
if (qtiItem.getIdent().startsWith(ItemParser.ITEM_PREFIX_SCQ))
editorIdentPrefix = ItemParser.ITEM_PREFIX_SCQ;
else if (qtiItem.getIdent().startsWith(ItemParser.ITEM_PREFIX_MCQ))
editorIdentPrefix = ItemParser.ITEM_PREFIX_MCQ;
else if (qtiItem.getIdent().startsWith(ItemParser.ITEM_PREFIX_KPRIM))
editorIdentPrefix = ItemParser.ITEM_PREFIX_KPRIM;
else if (qtiItem.getIdent().startsWith(ItemParser.ITEM_PREFIX_FIB))
editorIdentPrefix = ItemParser.ITEM_PREFIX_FIB;
else if (qtiItem.getIdent().startsWith(ItemParser.ITEM_PREFIX_ESSAY))
editorIdentPrefix = ItemParser.ITEM_PREFIX_ESSAY;
// set new ident... this is all it needs for our engine to recognise it
// as a new item.
qtiItem.setIdent(editorIdentPrefix + CodeHelper.getForeverUniqueID());
// insert into menutree (insert on GenericNode do a remove from parent)
GenericQtiNode parentTargetNode = (GenericQtiNode) tp.getParentTreeNode();
GenericQtiNode newNode = new ItemNode(qtiItem, qtiPackage);
parentTargetNode.insert(newNode, targetPos);
// insert into model
parentTargetNode.insertQTIObjectAt(qtiItem, targetPos);
// activate copied node
menuTree.setSelectedNodeId(newNode.getIdent());
event(ureq, menuTree, new Event(MenuTree.COMMAND_TREENODE_CLICKED));
qtiPackage.serializeQTIDocument();
parentTargetNode.childNodeChanges();
}
use of org.olat.ims.qti.editor.tree.ItemNode 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.tree.ItemNode in project openolat by klemens.
the class QTIEditorMainController method doCopy.
private void doCopy(UserRequest ureq, TreePosition tp) {
// user chose a position to insert the node to be copied
int targetPos = tp.getChildpos();
ItemNode selectedNode = (ItemNode) menuTree.getSelectedNode();
// only items are moveable
// use XStream instead of ObjectCloner
// Item qtiItem =
// (Item)xstream.fromXML(xstream.toXML(selectedNode.getUnderlyingQTIObject()));
Item toClone = (Item) selectedNode.getUnderlyingQTIObject();
Item qtiItem = (Item) XStreamHelper.xstreamClone(toClone);
// copy flow label class too, olat-2791
Question orgQuestion = toClone.getQuestion();
if (orgQuestion instanceof ChoiceQuestion) {
String flowLabelClass = ((ChoiceQuestion) orgQuestion).getFlowLabelClass();
Question copyQuestion = qtiItem.getQuestion();
if (copyQuestion instanceof ChoiceQuestion) {
((ChoiceQuestion) copyQuestion).setFlowLabelClass(flowLabelClass);
} else {
throw new AssertException("Could not copy flow-label-class, wrong type of copy question , must be 'ChoiceQuestion' but is " + copyQuestion);
}
}
String editorIdentPrefix = "";
if (qtiItem.getIdent().startsWith(ItemParser.ITEM_PREFIX_SCQ))
editorIdentPrefix = ItemParser.ITEM_PREFIX_SCQ;
else if (qtiItem.getIdent().startsWith(ItemParser.ITEM_PREFIX_MCQ))
editorIdentPrefix = ItemParser.ITEM_PREFIX_MCQ;
else if (qtiItem.getIdent().startsWith(ItemParser.ITEM_PREFIX_KPRIM))
editorIdentPrefix = ItemParser.ITEM_PREFIX_KPRIM;
else if (qtiItem.getIdent().startsWith(ItemParser.ITEM_PREFIX_FIB))
editorIdentPrefix = ItemParser.ITEM_PREFIX_FIB;
else if (qtiItem.getIdent().startsWith(ItemParser.ITEM_PREFIX_ESSAY))
editorIdentPrefix = ItemParser.ITEM_PREFIX_ESSAY;
// set new ident... this is all it needs for our engine to recognise it
// as a new item.
qtiItem.setIdent(editorIdentPrefix + CodeHelper.getForeverUniqueID());
// insert into menutree (insert on GenericNode do a remove from parent)
GenericQtiNode parentTargetNode = (GenericQtiNode) tp.getParentTreeNode();
GenericQtiNode newNode = new ItemNode(qtiItem, qtiPackage);
parentTargetNode.insert(newNode, targetPos);
// insert into model
parentTargetNode.insertQTIObjectAt(qtiItem, targetPos);
// activate copied node
menuTree.setSelectedNodeId(newNode.getIdent());
event(ureq, menuTree, new Event(MenuTree.COMMAND_TREENODE_CLICKED));
qtiPackage.serializeQTIDocument();
parentTargetNode.childNodeChanges();
}
use of org.olat.ims.qti.editor.tree.ItemNode 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);
}
}
Aggregations