use of org.olat.core.gui.components.tree.TreeNode in project OpenOLAT by OpenOLAT.
the class StatisticCourseNodesController method buildTreeModel.
private TreeModel buildTreeModel(final UserRequest ureq, final UserCourseEnvironment userCourseEnv) {
final GenericTreeModel gtm = new GenericTreeModel();
final GenericTreeNode rootTreeNode = new GenericTreeNode();
rootTreeNode.setTitle("start");
gtm.setRootNode(rootTreeNode);
ICourse course = CourseFactory.loadCourse(userCourseEnv.getCourseEnvironment().getCourseResourceableId());
new TreeVisitor(new Visitor() {
@Override
public void visit(INode node) {
CourseNode courseNode = (CourseNode) node;
StatisticResourceResult result = courseNode.createStatisticNodeResult(ureq, getWindowControl(), userCourseEnv, options, types);
if (result != null) {
StatisticResourceNode courseNodeTreeNode = new StatisticResourceNode(courseNode, result);
rootTreeNode.addChild(courseNodeTreeNode);
TreeModel subTreeModel = result.getSubTreeModel();
if (subTreeModel != null) {
TreeNode subRootNode = subTreeModel.getRootNode();
List<INode> subNodes = new ArrayList<>();
for (int i = 0; i < subRootNode.getChildCount(); i++) {
subNodes.add(subRootNode.getChildAt(i));
}
for (INode subNode : subNodes) {
courseNodeTreeNode.addChild(subNode);
}
}
}
}
}, course.getRunStructure().getRootNode(), true).visitAll();
return gtm;
}
use of org.olat.core.gui.components.tree.TreeNode in project OpenOLAT by OpenOLAT.
the class QTIEditorMainController method updateWarning.
private void updateWarning() {
boolean warningEssay = false;
if (qtiPackage.getQTIDocument() != null && !qtiPackage.getQTIDocument().isSurvey()) {
// check if the test contains some essay
List<TreeNode> flattedTree = new ArrayList<TreeNode>();
TreeHelper.makeTreeFlat(menuTreeModel.getRootNode(), flattedTree);
for (TreeNode node : flattedTree) {
Object uo = node.getUserObject();
if (uo instanceof String && ((String) uo).startsWith("QTIEDIT:ESSAY")) {
warningEssay = true;
break;
}
}
}
main.contextPut("warningEssay", new Boolean(warningEssay));
}
use of org.olat.core.gui.components.tree.TreeNode in project OpenOLAT by OpenOLAT.
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.core.gui.components.tree.TreeNode in project OpenOLAT by OpenOLAT.
the class QuestionPoolMenuTreeModel method buildPoolTreeNodes.
private void buildPoolTreeNodes(TreeNode parentNode) {
if (!securityCallback.canUsePools())
return;
List<Pool> pools = qpoolService.getPools(identity, roles).stream().sorted(Comparator.comparing(Pool::getName)).collect(Collectors.toList());
for (Pool pool : pools) {
TreeNode node = new PoolTreeNode(stackPanel, securityCallback, pool);
parentNode.addChild(node);
}
}
use of org.olat.core.gui.components.tree.TreeNode in project OpenOLAT by OpenOLAT.
the class QuestionPoolMenuTreeModel method buildCollectionTreeNodes.
private void buildCollectionTreeNodes(TreeNode parentNode) {
if (!securityCallback.canUseCollections())
return;
List<QuestionItemCollection> collections = qpoolService.getCollections(identity).stream().sorted(Comparator.comparing(QuestionItemCollection::getName)).collect(Collectors.toList());
for (QuestionItemCollection coll : collections) {
TreeNode node = new CollectionTreeNode(stackPanel, securityCallback, coll);
parentNode.addChild(node);
}
}
Aggregations