/** * <a href="http://www.openolat.org"> * OpenOLAT - Online Learning and Training</a><br> * <p> * Licensed under the Apache License, Version 2.0 (the "License"); <br> * you may not use this file except in compliance with the License.<br> * You may obtain a copy of the License at the * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> * <p> * Unless required by applicable law or agreed to in writing,<br> * software distributed under the License is distributed on an "AS IS" BASIS, <br> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> * See the License for the specific language governing permissions and <br> * limitations under the License. * <p> * Initial code contributed and copyrighted by<br> * frentix GmbH, http://www.frentix.com * <p> */ package org.olat.modules.qpool.ui; import static java.util.Collections.singletonList; import java.util.ArrayList; import java.util.List; import org.olat.core.CoreSpringFactory; import org.olat.core.commons.fullWebApp.LayoutMain3ColsController; import org.olat.core.commons.services.mark.MarkManager; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.panel.Panel; import org.olat.core.gui.components.stack.BreadcrumbPanel; import org.olat.core.gui.components.stack.BreadcrumbPanelAware; import org.olat.core.gui.components.tree.GenericTreeNode; import org.olat.core.gui.components.tree.MenuTree; import org.olat.core.gui.components.tree.TreeDropEvent; import org.olat.core.gui.components.tree.TreeModel; import org.olat.core.gui.components.tree.TreeNode; import org.olat.core.gui.control.Controller; 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.gui.control.generic.closablewrapper.CloseableModalController; import org.olat.core.gui.control.generic.dtabs.Activateable2; import org.olat.core.gui.control.generic.modal.DialogBoxController; import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; import org.olat.core.id.OLATResourceable; import org.olat.core.id.Persistable; import org.olat.core.id.Roles; import org.olat.core.id.context.ContextEntry; import org.olat.core.id.context.StateEntry; import org.olat.core.util.nodes.INode; import org.olat.core.util.resource.OresHelper; import org.olat.core.util.tree.TreeHelper; import org.olat.group.BusinessGroup; import org.olat.group.BusinessGroupService; import org.olat.modules.qpool.Pool; import org.olat.modules.qpool.QPoolService; import org.olat.modules.qpool.QuestionItem; import org.olat.modules.qpool.QuestionItemCollection; import org.olat.modules.qpool.QuestionItemShort; import org.olat.modules.qpool.ui.admin.PoolsAdminController; import org.olat.modules.qpool.ui.admin.QEducationalContextsAdminController; import org.olat.modules.qpool.ui.admin.QItemTypesAdminController; import org.olat.modules.qpool.ui.admin.QLicensesAdminController; import org.olat.modules.qpool.ui.admin.TaxonomyAdminController; import org.olat.modules.qpool.ui.datasource.CollectionOfItemsSource; import org.olat.modules.qpool.ui.datasource.DefaultItemsSource; import org.olat.modules.qpool.ui.datasource.MarkedItemsSource; import org.olat.modules.qpool.ui.datasource.MyItemsSource; import org.olat.modules.qpool.ui.datasource.PoolItemsSource; import org.olat.modules.qpool.ui.datasource.SharedItemsSource; import org.olat.modules.qpool.ui.events.QItemMarkedEvent; import org.olat.modules.qpool.ui.events.QPoolEvent; /** * * Initial date: 21.01.2013<br> * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ public class QuestionPoolMainEditorController extends BasicController implements Activateable2, BreadcrumbPanelAware { public static final OLATResourceable QITEM_MARKED = OresHelper.createOLATResourceableType("QItemMark"); private final MenuTree menuTree; private GenericTreeNode sharesNode, myNode, myOwnNode; private final Panel content; private BreadcrumbPanel stackPanel; private QuestionsController currentCtrl; private QuestionsController myQuestionsCtrl; private QuestionsController markedQuestionsCtrl; private Controller presentationCtrl, sharePresentationCtrl; private CloseableModalController cmc; private PoolsAdminController poolAdminCtrl; private QItemTypesAdminController typesCtrl; private QEducationalContextsAdminController levelsCtrl; private QLicensesAdminController licensesCtrl; private TaxonomyAdminController taxonomyCtrl; private ShareItemOptionController shareItemsCtrl; private LayoutMain3ColsController columnLayoutCtr; private QuestionPoolAdminStatisticsController adminStatisticsCtrl; private DialogBoxController copyToMyCtrl; private final Roles roles; private final MarkManager markManager; private final QPoolService qpoolService; private final BusinessGroupService businessGroupService; public QuestionPoolMainEditorController(UserRequest ureq, WindowControl wControl) { super(ureq, wControl); roles = ureq.getUserSession().getRoles(); markManager = CoreSpringFactory.getImpl(MarkManager.class); qpoolService = CoreSpringFactory.getImpl(QPoolService.class); businessGroupService = CoreSpringFactory.getImpl(BusinessGroupService.class); menuTree = new MenuTree("qpoolTree"); menuTree.setTreeModel(buildTreeModel()); menuTree.setSelectedNode(menuTree.getTreeModel().getRootNode()); menuTree.setDragEnabled(false); menuTree.setDropEnabled(true); menuTree.setDropSiblingEnabled(false); menuTree.setDndAcceptJSMethod("treeAcceptDrop"); menuTree.setExpandSelectedNode(false); menuTree.addListener(this); menuTree.setRootVisible(false); //open the nodes shared and my at start List<String> openNodeIds = new ArrayList<String>(2); openNodeIds.add(myNode.getIdent()); openNodeIds.add(sharesNode.getIdent()); menuTree.setOpenNodeIds(openNodeIds); content = new Panel("list"); columnLayoutCtr = new LayoutMain3ColsController(ureq, getWindowControl(), menuTree, content, "qpool"); doSelectPresentation(ureq); putInitialPanel(columnLayoutCtr.getInitialComponent()); } @Override public void setBreadcrumbPanel(BreadcrumbPanel stackPanel) { this.stackPanel = stackPanel; if(myQuestionsCtrl != null) myQuestionsCtrl.setBreadcrumbPanel(stackPanel); if(markedQuestionsCtrl != null) markedQuestionsCtrl.setBreadcrumbPanel(stackPanel); if(currentCtrl != null) currentCtrl.setBreadcrumbPanel(stackPanel); } @Override protected void doDispose() { // } @Override protected void event(UserRequest ureq, Component source, Event event) { if(menuTree == source) { if(event instanceof TreeDropEvent) { TreeDropEvent e = (TreeDropEvent)event; String targetId = e.getTargetNodeId(); String dropId = e.getDroppedNodeId(); //drop id w_o_fi1000002357-4 doDrop(ureq, targetId, dropId); } else if(menuTree.getSelectedNode() != null){ TreeNode node = menuTree.getSelectedNode(); doSelectControllerTreeNode(ureq, node, null, null); } } } private void doSelectControllerTreeNode(UserRequest ureq, TreeNode node, List<ContextEntry> entries, StateEntry state) { Object uNode = node.getUserObject(); if("Presentation".equals(uNode)) { doSelectPresentation(ureq); } else if("SharePresentation".equals(uNode)) { doSelectSharePresentation(ureq); } else if("Statistics".equals(uNode)) { doSelectAdmin(ureq, entries, state); } else if("Taxonomy".equals(uNode)) { doSelectAdminStudyFields(ureq, entries, state); } else if("Pools".equals(uNode)) { doSelectAdminPools(ureq, entries, state); } else if("Types".equals(uNode)) { doSelectAdminTypes(ureq, entries, state); } else if("EduContexts".equals(uNode)) { doSelectAdminLevels(ureq, entries, state); } else if("Licenses".equals(uNode)) { doSelectAdminLicenses(ureq, entries, state); } else if("My".equals(uNode)) { doSelectMyQuestions(ureq, entries, state); } else if("Marked".equals(uNode)) { doSelectMarkedQuestions(ureq, entries, state); } else if(uNode instanceof Pool) { Pool pool = (Pool)uNode; doSelectPool(ureq, pool, node, entries, state); } else if(uNode instanceof BusinessGroup) { BusinessGroup group = (BusinessGroup)uNode; doSelectGroup(ureq, group, node, entries, state); } else if(uNode instanceof QuestionItemCollection) { QuestionItemCollection coll = (QuestionItemCollection)uNode; doSelectCollection(ureq, coll, node, entries, state); } } @Override protected void event(UserRequest ureq, Controller source, Event event) { if(shareItemsCtrl == source) { if(QPoolEvent.ITEM_SHARED.equals(event.getCommand())) { List<QuestionItemShort> items = shareItemsCtrl.getItems(); if(items.size() > 0) {//can only drop one item QuestionItemShort item = items.get(0); if(shareItemsCtrl.getGroups() != null) { showInfo("item.shared", item.getTitle()); } else if(shareItemsCtrl.getPools() != null) { showInfo("item.pooled", item.getTitle()); } } buildShareSubTreeModel(sharesNode); menuTree.setDirty(true); } cmc.deactivate(); cleanUp(); } else if(event instanceof QPoolEvent) { if(QPoolEvent.ITEM_SHARED.equals(event.getCommand())) { buildShareSubTreeModel(sharesNode); menuTree.setDirty(true); } else if(QPoolEvent.COLL_CREATED.equals(event.getCommand()) || QPoolEvent.COLL_CHANGED.equals(event.getCommand())) { buildMySubTreeModel(myNode); Long collKey = ((QPoolEvent)event).getObjectKey(); GenericTreeNode nodeToSelect = findNodeByPersistableUserObject(myNode, collKey); if(nodeToSelect != null) { menuTree.setSelectedNode(nodeToSelect); QuestionItemCollection coll = (QuestionItemCollection)nodeToSelect.getUserObject(); doSelectCollection(ureq, coll, nodeToSelect, null, null); } menuTree.setDirty(true); } else if(QPoolEvent.COLL_DELETED.equals(event.getCommand())) { buildMySubTreeModel(myNode); menuTree.setSelectedNode(myOwnNode); doSelectMyQuestions(ureq, null, null); } else if(QPoolEvent.POOL_CREATED.equals(event.getCommand()) || QPoolEvent.POOL_DELETED.equals(event.getCommand())) { buildShareSubTreeModel(sharesNode); menuTree.setDirty(true); } } else if(copyToMyCtrl == source) { if(DialogBoxUIFactory.isYesEvent(event) || DialogBoxUIFactory.isOkEvent(event)) { QuestionItemShort item = (QuestionItemShort)copyToMyCtrl.getUserObject(); doCopyToMy(item); } } else if(cmc == source) { cleanUp(); } super.event(ureq, source, event); } private void cleanUp() { removeAsListenerAndDispose(shareItemsCtrl); removeAsListenerAndDispose(cmc); shareItemsCtrl = null; cmc = null; } @Override public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { if(entries == null || entries.isEmpty()) return; ContextEntry entry = entries.get(0); OLATResourceable resource = entry.getOLATResourceable(); TreeNode rootNode = menuTree.getTreeModel().getRootNode(); TreeNode node = TreeHelper.findNodeByResourceableUserObject(resource, rootNode); if(node == null) { node = TreeHelper.findNodeByUserObject(resource.getResourceableTypeName(), rootNode); } if(node != null) { List<ContextEntry> subEntries = entries.subList(1, entries.size()); stackPanel.popUpToRootController(ureq); doSelectControllerTreeNode(ureq, node, subEntries, entry.getTransientState()); menuTree.setSelectedNode(node); } } private void doDrop(UserRequest ureq, String targetId, String dropId) { try { int lastIndex = dropId.lastIndexOf('-'); String rowStr = dropId.substring(lastIndex+1, dropId.length()); int row = Integer.parseInt(rowStr); QuestionItemShort item = currentCtrl.getQuestionAt(row); TreeNode node = menuTree.getTreeModel().getNodeById(targetId); if(node != null) { Object userObj = node.getUserObject(); if(userObj instanceof BusinessGroup) { doShareItemsOptions(ureq, singletonList(item), singletonList((BusinessGroup)userObj), null); } else if(userObj instanceof Pool) { doShareItemsOptions(ureq, singletonList(item), null, singletonList((Pool)userObj)); } else if(userObj instanceof QuestionItemCollection) { qpoolService.addItemToCollection(singletonList(item), singletonList((QuestionItemCollection)userObj)); showInfo("item.collectioned", item.getTitle()); } else if("My".equals(userObj)) { doCopyToMyConfirmation(ureq, item); } else if("Marked".equals(userObj)) { String businessPath = "[QuestionItem:" + item.getKey() + "]"; markManager.setMark(item, getIdentity(), null, businessPath); QItemMarkedEvent event = new QItemMarkedEvent("marked", item.getKey(), true); ureq.getUserSession().getSingleUserEventCenter().fireEventToListenersOf(event, QITEM_MARKED); } } } catch (Exception e) { logError("Cannot drop with id: " + dropId, e); } } private void doShareItemsOptions(UserRequest ureq, List<QuestionItemShort> items, List<BusinessGroup> groups, List<Pool> pools) { removeAsListenerAndDispose(cmc); removeAsListenerAndDispose(shareItemsCtrl); shareItemsCtrl = new ShareItemOptionController(ureq, getWindowControl(), items, groups, pools); listenTo(shareItemsCtrl); cmc = new CloseableModalController(getWindowControl(), translate("close"), shareItemsCtrl.getInitialComponent(), true, translate("share.item")); cmc.activate(); listenTo(cmc); } private void doCopyToMyConfirmation(UserRequest ureq, QuestionItemShort item) { String title = translate("copy"); String text = translate("copy.confirmation"); copyToMyCtrl = activateYesNoDialog(ureq, title, text, copyToMyCtrl); copyToMyCtrl.setUserObject(item); } private void doCopyToMy(QuestionItemShort item) { List<QuestionItem> copiedItems = qpoolService.copyItems(getIdentity(), singletonList(item)); showInfo("item.copied", Integer.toString(copiedItems.size())); if(myQuestionsCtrl != null) { myQuestionsCtrl.updateSource(); } } private void setContent(UserRequest ureq, Controller controller, List<ContextEntry> entries, StateEntry state) { addToHistory(ureq, controller); if(controller instanceof Activateable2) { ((Activateable2)controller).activate(ureq, entries, state); } content.setContent(controller.getInitialComponent()); } private void doSelectPresentation(UserRequest ureq) { if(presentationCtrl == null) { WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableType("Presentation"), null); presentationCtrl = new PresentationController(ureq, swControl); listenTo(presentationCtrl); } setContent(ureq, presentationCtrl, null, null); } private void doSelectSharePresentation(UserRequest ureq) { if(sharePresentationCtrl == null) { WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableType("SharePresentation"), null); sharePresentationCtrl = new SharePresentationController(ureq, swControl); listenTo(sharePresentationCtrl); } setContent(ureq, sharePresentationCtrl, null, null); } private void doSelectAdmin(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { if(adminStatisticsCtrl == null) { WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableType("Statistics"), null); adminStatisticsCtrl = new QuestionPoolAdminStatisticsController(ureq, swControl); listenTo(adminStatisticsCtrl); } setContent(ureq, adminStatisticsCtrl, entries, state); } private void doSelectAdminStudyFields(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { if(taxonomyCtrl == null) { WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableType("Taxonomy"), null); taxonomyCtrl = new TaxonomyAdminController(ureq, swControl); listenTo(taxonomyCtrl); } setContent(ureq, taxonomyCtrl, entries, state); } private void doSelectAdminPools(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { if(poolAdminCtrl == null) { WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableType("Pools"), null); poolAdminCtrl = new PoolsAdminController(ureq, swControl); listenTo(poolAdminCtrl); } setContent(ureq, poolAdminCtrl, entries, state); } private void doSelectAdminTypes(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { if(typesCtrl == null) { WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableType("Types"), null); typesCtrl = new QItemTypesAdminController(ureq, swControl); listenTo(typesCtrl); } setContent(ureq, typesCtrl, entries, state); } private void doSelectAdminLevels(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { if(levelsCtrl == null) { WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableType("EduContexts"), null); levelsCtrl = new QEducationalContextsAdminController(ureq, swControl); listenTo(levelsCtrl); } setContent(ureq, levelsCtrl, entries, state); } private void doSelectAdminLicenses(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { if(licensesCtrl == null) { WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableType("Licenses"), null); licensesCtrl = new QLicensesAdminController(ureq, swControl); listenTo(licensesCtrl); } setContent(ureq, licensesCtrl, entries, state); } private void doSelectMyQuestions(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { DefaultItemsSource source = new MyItemsSource(getIdentity(), ureq.getUserSession().getRoles(), "My"); if(myQuestionsCtrl == null) { WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableType("My"), null); myQuestionsCtrl = new QuestionsController(ureq, swControl, source, "my"); myQuestionsCtrl.setBreadcrumbPanel(stackPanel); listenTo(myQuestionsCtrl); } else { myQuestionsCtrl.updateSource(source); } currentCtrl = myQuestionsCtrl; setContent(ureq, myQuestionsCtrl, entries, state); } private void doSelectMarkedQuestions(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { DefaultItemsSource source = new MarkedItemsSource(getIdentity(), ureq.getUserSession().getRoles(), "Fav"); if(markedQuestionsCtrl == null) { WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableType("Marked"), null); markedQuestionsCtrl = new QuestionsController(ureq, swControl, source, "favorit"); markedQuestionsCtrl.setBreadcrumbPanel(stackPanel); listenTo(markedQuestionsCtrl); } else { markedQuestionsCtrl.updateSource(source); } currentCtrl = markedQuestionsCtrl; setContent(ureq, markedQuestionsCtrl, entries, state); } private void doSelectPool(UserRequest ureq, Pool pool, TreeNode node, List<ContextEntry> entries, StateEntry state) { ControlledTreeNode cNode = (ControlledTreeNode)node; QuestionsController selectedPoolCtrl = cNode.getController(); DefaultItemsSource source = new PoolItemsSource(getIdentity(), roles, pool); source.setRemoveEnabled(isShareAdmin(pool)); if(selectedPoolCtrl == null) { WindowControl swControl = addToHistory(ureq, pool, null); selectedPoolCtrl = new QuestionsController(ureq, swControl, source, "poll-" + pool.getKey()); selectedPoolCtrl.setBreadcrumbPanel(stackPanel); listenTo(selectedPoolCtrl); cNode.setController(selectedPoolCtrl); } else { selectedPoolCtrl.updateSource(source); } currentCtrl = selectedPoolCtrl; setContent(ureq, selectedPoolCtrl, entries, state); } /** * Can administrate if has role OLAT admin or Pool admin, if the pool is public, * if owner of the pool * @param pool * @return */ private boolean isShareAdmin(Pool pool) { return roles != null && (roles.isOLATAdmin() || roles.isPoolAdmin() || pool.isPublicPool() || qpoolService.isOwner(getIdentity(), pool)); } private void doSelectGroup(UserRequest ureq, BusinessGroup group, TreeNode node, List<ContextEntry> entries, StateEntry state) { ControlledTreeNode cNode = (ControlledTreeNode)node; QuestionsController sharedItemsCtrl = cNode.getController(); boolean shareAdmin = isShareAdmin(group); SharedItemsSource source = new SharedItemsSource(group, getIdentity(), roles, shareAdmin); if(sharedItemsCtrl == null) { WindowControl swControl = addToHistory(ureq, group, null); sharedItemsCtrl = new QuestionsController(ureq, swControl, source, "share-" + group.getKey()); sharedItemsCtrl.setBreadcrumbPanel(stackPanel); listenTo(sharedItemsCtrl); cNode.setController(sharedItemsCtrl); } else { sharedItemsCtrl.updateSource(source); } currentCtrl = sharedItemsCtrl; setContent(ureq, sharedItemsCtrl, entries, state); } private boolean isShareAdmin(BusinessGroup group) { return roles != null && (roles.isOLATAdmin() || roles.isPoolAdmin() || businessGroupService.isIdentityInBusinessGroup(getIdentity(), group.getKey(), true, false, null)); } private void doSelectCollection(UserRequest ureq, QuestionItemCollection coll, TreeNode node, List<ContextEntry> entries, StateEntry state) { ControlledTreeNode cNode = (ControlledTreeNode)node; QuestionsController collItemsCtrl = cNode.getController(); CollectionOfItemsSource source = new CollectionOfItemsSource(coll, getIdentity(), ureq.getUserSession().getRoles()); if(collItemsCtrl == null) { WindowControl swControl = addToHistory(ureq, coll, null); collItemsCtrl = new QuestionsController(ureq, swControl, source, "coll-" + coll.getKey()); collItemsCtrl.setQuestionItemCollection(coll); collItemsCtrl.setBreadcrumbPanel(stackPanel); listenTo(collItemsCtrl); cNode.setController(collItemsCtrl); } else { collItemsCtrl.updateSource(source); } collItemsCtrl.activate(ureq, entries, state); currentCtrl = collItemsCtrl; setContent(ureq, collItemsCtrl, entries, state); } private TreeModel buildTreeModel() { QuestionPoolMenuTreeModel gtm = new QuestionPoolMenuTreeModel(); GenericTreeNode rootNode = new GenericTreeNode(translate("topnav.qpool"), "topnav.qpool.alt"); rootNode.setCssClass("o_sel_qpool_home"); gtm.setRootNode(rootNode); //question database myNode = new GenericTreeNode(translate("menu.database"), "Presentation"); myNode.setCssClass("o_sel_qpool_database"); rootNode.addChild(myNode); buildMySubTreeModel(myNode); //pools + shares sharesNode = new GenericTreeNode(translate("menu.share"), "SharePresentation"); sharesNode.setCssClass("o_sel_qpool_shares"); rootNode.addChild(sharesNode); buildShareSubTreeModel(sharesNode); //administration if(roles.isOLATAdmin() || roles.isPoolAdmin()) { GenericTreeNode adminNode = new GenericTreeNode(translate("menu.admin"), "Statistics"); adminNode.setCssClass("o_sel_qpool_admin"); rootNode.addChild(adminNode); buildAdminSubTreeModel(adminNode); } return gtm; } private void buildShareSubTreeModel(GenericTreeNode parentNode) { parentNode.removeAllChildren(); List<Pool> pools = qpoolService.getPools(getIdentity(), roles); for(Pool pool:pools) { GenericTreeNode node = new ControlledTreeNode(pool.getName(), pool); node.setIconCssClass("o_icon_pool_pool o_sel_qpool_pool"); parentNode.addChild(node); } List<BusinessGroup> groups = qpoolService.getResourcesWithSharedItems(getIdentity()); for(BusinessGroup group:groups) { GenericTreeNode node = new ControlledTreeNode(group.getName(), group); node.setIconCssClass("o_icon_pool_share o_sel_qpool_share"); parentNode.addChild(node); } } private void buildAdminSubTreeModel(GenericTreeNode parentNode) { if(!roles.isOLATAdmin() && !roles.isPoolAdmin()) return; parentNode.removeAllChildren(); GenericTreeNode node = new GenericTreeNode(translate("menu.admin.studyfields"), "Taxonomy"); node.setIconCssClass("o_sel_qpool_study_fields"); parentNode.addChild(node); parentNode.setDelegate(node); node = new GenericTreeNode(translate("menu.admin.pools"), "Pools"); node.setIconCssClass("o_sel_qpool_admin_pools"); parentNode.addChild(node); node = new GenericTreeNode(translate("menu.admin.types"), "Types"); node.setIconCssClass("o_sel_qpool_admin_types"); parentNode.addChild(node); node = new GenericTreeNode(translate("menu.admin.levels"), "EduContexts"); node.setIconCssClass("o_sel_qpool_admin_levels"); parentNode.addChild(node); node = new GenericTreeNode(translate("menu.admin.licenses"), "Licenses"); node.setIconCssClass("o_sel_qpool_admin_licenses"); parentNode.addChild(node); } private void buildMySubTreeModel(GenericTreeNode parentNode) { parentNode.removeAllChildren(); myOwnNode = new GenericTreeNode(translate("menu.database.my"), "My"); myOwnNode.setIconCssClass("o_icon_pool_my_items o_sel_qpool_my_items"); parentNode.addChild(myOwnNode); GenericTreeNode node = new GenericTreeNode(translate("menu.database.favorit"), "Marked"); node.setIconCssClass("o_icon_pool_favorits o_sel_qpool_favorits"); parentNode.addChild(node); List<QuestionItemCollection> collections = qpoolService.getCollections(getIdentity()); for(QuestionItemCollection coll: collections) { node = new ControlledTreeNode(coll.getName(), coll); node.setIconCssClass("o_icon_pool_collection o_sel_qpool_collection"); parentNode.addChild(node); } } private GenericTreeNode findNodeByPersistableUserObject(GenericTreeNode parentNode, Long id) { if(parentNode == null || id == null) { return null; } for(int i=parentNode.getChildCount(); i-->0; ) { INode node = parentNode.getChildAt(i); if(node instanceof GenericTreeNode) { GenericTreeNode treeNode = (GenericTreeNode)node; Object userObj = treeNode.getUserObject(); if(userObj instanceof Persistable) { Persistable obj = (Persistable)userObj; if(id.equals(obj.getKey())) { return treeNode; } } } } return null; } private static class ControlledTreeNode extends GenericTreeNode { private static final long serialVersionUID = 768640290449143804L; private QuestionsController controller; public ControlledTreeNode(String title, Object userObject) { super(title, userObject); } public QuestionsController getController() { return controller; } public void setController(QuestionsController controller) { this.controller = controller; } } }