diff --git a/src/main/java/org/olat/ims/qti/qpool/QTIQPoolServiceProvider.java b/src/main/java/org/olat/ims/qti/qpool/QTIQPoolServiceProvider.java index a2c0d19048cc3226e11d9a85ad04096929267c98..7ee6bd4cbce439432e38279eeefc0eba021440ed 100644 --- a/src/main/java/org/olat/ims/qti/qpool/QTIQPoolServiceProvider.java +++ b/src/main/java/org/olat/ims/qti/qpool/QTIQPoolServiceProvider.java @@ -104,7 +104,7 @@ public class QTIQPoolServiceProvider implements QPoolSPI { @Autowired private QuestionItemDAO questionItemDao; - private static final List<ExportFormatOptions> formats = new ArrayList<ExportFormatOptions>(2); + private static final List<ExportFormatOptions> formats = new ArrayList<>(2); static { formats.add(DefaultExportFormat.ZIP_EXPORT_FORMAT); formats.add(DefaultExportFormat.DOCX_EXPORT_FORMAT); @@ -296,7 +296,7 @@ public class QTIQPoolServiceProvider implements QPoolSPI { } private List<Long> toKeys(List<? extends QuestionItemShort> items) { - List<Long> keys = new ArrayList<Long>(items.size()); + List<Long> keys = new ArrayList<>(items.size()); for(QuestionItemShort item:items) { keys.add(item.getKey()); } @@ -321,7 +321,7 @@ public class QTIQPoolServiceProvider implements QPoolSPI { } public void assembleTest(List<QuestionItemShort> items, ZipOutputStream zout) { - List<Long> itemKeys = new ArrayList<Long>(); + List<Long> itemKeys = new ArrayList<>(); for(QuestionItemShort item:items) { itemKeys.add(item.getKey()); } @@ -375,6 +375,11 @@ public class QTIQPoolServiceProvider implements QPoolSPI { QTI12EditorController previewCtrl = new QTI12EditorController(ureq, wControl, item); return previewCtrl; } + + @Override + public Controller getReadOnlyController(UserRequest ureq, WindowControl wControl, QuestionItem item) { + return getPreviewController(ureq, wControl, item, false); + } } \ No newline at end of file diff --git a/src/main/java/org/olat/ims/qti21/pool/QTI21EditorController.java b/src/main/java/org/olat/ims/qti21/pool/QTI21EditorController.java index e0dd19bbe077168c31607d14459b9cd945d99d5c..aa10c849839dcccd0615e4f1d72b6ca8a882ae93 100644 --- a/src/main/java/org/olat/ims/qti21/pool/QTI21EditorController.java +++ b/src/main/java/org/olat/ims/qti21/pool/QTI21EditorController.java @@ -62,7 +62,8 @@ public class QTI21EditorController extends BasicController implements QPoolItemE @Autowired private QTI21Service qtiService; - public QTI21EditorController(UserRequest ureq, WindowControl wControl, QuestionItem questionItem) { + public QTI21EditorController(UserRequest ureq, WindowControl wControl, QuestionItem questionItem, + boolean readonly) { super(ureq, wControl); this.questionItem = questionItem; mainVC = createVelocityContainer("pool_editor"); @@ -75,8 +76,8 @@ public class QTI21EditorController extends BasicController implements QPoolItemE ResolvedAssessmentItem resolvedAssessmentItem = qtiService .loadAndResolveAssessmentItem(assessmentItemUri, resourceDirectory); - editorCtrl = new AssessmentItemEditorController(ureq, wControl, - resolvedAssessmentItem, resourceDirectory, resourceContainer, resourceFile, false, false); + editorCtrl = new AssessmentItemEditorController(ureq, wControl, resolvedAssessmentItem, resourceDirectory, + resourceContainer, resourceFile, false, readonly); listenTo(editorCtrl); mainVC.put("editor", editorCtrl.getInitialComponent()); diff --git a/src/main/java/org/olat/ims/qti21/pool/QTI21QPoolServiceProvider.java b/src/main/java/org/olat/ims/qti21/pool/QTI21QPoolServiceProvider.java index c4c19e158f3db933436e38195f3cfe0cf5be5ef2..9f3249be9e23052dfbfc7160a933898bd4098523 100644 --- a/src/main/java/org/olat/ims/qti21/pool/QTI21QPoolServiceProvider.java +++ b/src/main/java/org/olat/ims/qti21/pool/QTI21QPoolServiceProvider.java @@ -132,7 +132,7 @@ public class QTI21QPoolServiceProvider implements QPoolSPI { @Autowired private QuestionItemDAO questionItemDao; - private static final List<ExportFormatOptions> formats = new ArrayList<ExportFormatOptions>(4); + private static final List<ExportFormatOptions> formats = new ArrayList<>(4); static { formats.add(DefaultExportFormat.ZIP_EXPORT_FORMAT); formats.add(DefaultExportFormat.DOCX_EXPORT_FORMAT); @@ -182,7 +182,7 @@ public class QTI21QPoolServiceProvider implements QPoolSPI { @Override public List<QItemFactory> getItemfactories() { - List<QItemFactory> factories = new ArrayList<QItemFactory>(); + List<QItemFactory> factories = new ArrayList<>(); for(QTI21QuestionType type:QTI21QuestionType.values()) { if(type.hasEditor()) { factories.add(new QTI21AssessmentItemFactory(type)); @@ -320,10 +320,15 @@ public class QTI21QPoolServiceProvider implements QPoolSPI { @Override public Controller getEditableController(UserRequest ureq, WindowControl wControl, QuestionItem qitem) { - Controller editorCtrl = new QTI21EditorController(ureq, wControl, qitem); - return editorCtrl; + return new QTI21EditorController(ureq, wControl, qitem, false); } + @Override + public Controller getReadOnlyController(UserRequest ureq, WindowControl wControl, QuestionItem item) { + return new QTI21EditorController(ureq, wControl, item, true); + } + + public QuestionItem createItem(Identity identity, QTI21QuestionType type, String title, Locale locale) { AssessmentItemBuilder itemBuilder = null; Translator translator = Util.createPackageTranslator(AssessmentTestComposerController.class, locale); @@ -523,12 +528,11 @@ public class QTI21QPoolServiceProvider implements QPoolSPI { } private List<Long> toKeys(List<? extends QuestionItemShort> items) { - List<Long> keys = new ArrayList<Long>(items.size()); + List<Long> keys = new ArrayList<>(items.size()); for(QuestionItemShort item:items) { keys.add(item.getKey()); } return keys; } - } \ No newline at end of file diff --git a/src/main/java/org/olat/modules/qpool/QPoolSPI.java b/src/main/java/org/olat/modules/qpool/QPoolSPI.java index 8fad01a0f9ca102778894bfbe42fd774c752be29..2b741bc40e01391e9b611b5753aad8d5fd3106ae 100644 --- a/src/main/java/org/olat/modules/qpool/QPoolSPI.java +++ b/src/main/java/org/olat/modules/qpool/QPoolSPI.java @@ -117,6 +117,7 @@ public interface QPoolSPI { public boolean isTypeEditable(); /** + * Return the controller to edit the question. * * @param ureq * @param wControl @@ -124,4 +125,16 @@ public interface QPoolSPI { * @return */ public Controller getEditableController(UserRequest ureq, WindowControl wControl, QuestionItem item); + + /** + * Return the editable controller in a read only modus. This controller is e.g. + * used to review a question. If the editable controller has no read only modus, + * this method should return a preview controller. + * + * @param ureq + * @param wControl + * @param item + * @return + */ + public Controller getReadOnlyController(UserRequest ureq, WindowControl wControl, QuestionItem item); } diff --git a/src/main/java/org/olat/modules/qpool/impl/FileQPoolServiceProvider.java b/src/main/java/org/olat/modules/qpool/impl/FileQPoolServiceProvider.java index 071c4a080a6f86a2a6e188e3476aa46256f17ddb..61ed07a21cb5bfad49767b57d50c3a9be58c6d4c 100644 --- a/src/main/java/org/olat/modules/qpool/impl/FileQPoolServiceProvider.java +++ b/src/main/java/org/olat/modules/qpool/impl/FileQPoolServiceProvider.java @@ -100,4 +100,9 @@ public class FileQPoolServiceProvider extends AbstractQPoolServiceProvider { FilePreviewController fileController = new FilePreviewController(ureq, wControl, item); return fileController; } + + @Override + public Controller getReadOnlyController(UserRequest ureq, WindowControl wControl, QuestionItem item) { + return getEditableController(ureq, wControl, item); + } } \ No newline at end of file diff --git a/src/main/java/org/olat/modules/qpool/impl/TextQPoolServiceProvider.java b/src/main/java/org/olat/modules/qpool/impl/TextQPoolServiceProvider.java index 27d21081fc82aafdea43bf0f5b148248209510e6..de5c43b21c6188f8518481bd0143b11e6481a694 100644 --- a/src/main/java/org/olat/modules/qpool/impl/TextQPoolServiceProvider.java +++ b/src/main/java/org/olat/modules/qpool/impl/TextQPoolServiceProvider.java @@ -98,4 +98,9 @@ public class TextQPoolServiceProvider extends AbstractQPoolServiceProvider { TextPreviewController txtController = new TextPreviewController(ureq, wControl, item, false); return txtController; } + + @Override + public Controller getReadOnlyController(UserRequest ureq, WindowControl wControl, QuestionItem item) { + return getEditableController(ureq, wControl, item); + } } diff --git a/src/main/java/org/olat/modules/qpool/ui/QuestionItemDetailsController.java b/src/main/java/org/olat/modules/qpool/ui/QuestionItemDetailsController.java index 65b53e6314c0fda2900fdc6acff9339397b69e90..e76a561ca81df381b4b1320f5f569a29154bb19a 100644 --- a/src/main/java/org/olat/modules/qpool/ui/QuestionItemDetailsController.java +++ b/src/main/java/org/olat/modules/qpool/ui/QuestionItemDetailsController.java @@ -22,7 +22,6 @@ package org.olat.modules.qpool.ui; import java.util.Collections; import java.util.List; -import org.olat.core.commons.fullWebApp.LayoutMain3ColsController; import org.olat.core.commons.services.commentAndRating.CommentAndRatingDefaultSecurityCallback; import org.olat.core.commons.services.commentAndRating.CommentAndRatingSecurityCallback; import org.olat.core.commons.services.commentAndRating.ui.UserCommentsAndRatingsController; @@ -32,7 +31,6 @@ import org.olat.core.gui.components.dropdown.Dropdown; import org.olat.core.gui.components.dropdown.DropdownOrientation; import org.olat.core.gui.components.link.Link; import org.olat.core.gui.components.link.LinkFactory; -import org.olat.core.gui.components.stack.PopEvent; import org.olat.core.gui.components.stack.TooledController; import org.olat.core.gui.components.stack.TooledStackedPanel; import org.olat.core.gui.components.stack.TooledStackedPanel.Align; @@ -42,12 +40,9 @@ 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.Roles; -import org.olat.core.id.context.ContextEntry; -import org.olat.core.id.context.StateEntry; import org.olat.core.util.StringHelper; import org.olat.core.util.prefs.Preferences; import org.olat.group.BusinessGroup; @@ -77,10 +72,10 @@ import org.springframework.beans.factory.annotation.Autowired; * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ -public class QuestionItemDetailsController extends BasicController implements TooledController, Activateable2 { +public class QuestionItemDetailsController extends BasicController implements TooledController { private static final String GUIPREF_KEY_SHOW_METADATAS = "show.metadatas"; - private Link editItem; + private Link statusDraftLink; private Link statusReviewLink; private Link statusFinalLink; @@ -101,25 +96,24 @@ public class QuestionItemDetailsController extends BasicController implements To private Dropdown statusDropdown; private Dropdown commandDropdown; - private Controller editCtrl; - private Controller previewCtrl; - private CloseableModalController cmc; private final VelocityContainer mainVC; + private final TooledStackedPanel stackPanel; + private Controller questionCtrl; + private MetadatasController metadatasCtrl; + private UserCommentsAndRatingsController commentsAndRatingCtr; + private CommentAndRatingSecurityCallback commentAndRatingSecurityCallback; + private CloseableModalController cmc; private ReviewStartController reviewStartCtrl; private ReviewController reviewCtrl; private DialogBoxController confirmEndOfLifeCtrl; private DialogBoxController confirmDeleteBox; - private LayoutMain3ColsController editMainCtrl; private SelectBusinessGroupController selectGroupCtrl; - private final MetadatasController metadatasCtrl; - private UserCommentsAndRatingsController commentsAndRatingCtr; - private final CommentAndRatingSecurityCallback commentAndRatingSecurityCallback; - private final TooledStackedPanel stackPanel; private final QuestionItemsSource itemSource; private final QuestionItemSecurityCallback securityCallback; private final Integer itemIndex; private final int numberOfItems; + private Boolean showMetadatas; @Autowired private QuestionPoolModule poolModule; @@ -127,7 +121,6 @@ public class QuestionItemDetailsController extends BasicController implements To private QPoolService qpoolService; @Autowired private ReviewService reviewService; - private Boolean showMetadatas; public QuestionItemDetailsController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel, QuestionItem item, QuestionItemSecurityCallback securityCallback, QuestionItemsSource itemSource, @@ -139,33 +132,57 @@ public class QuestionItemDetailsController extends BasicController implements To this.itemIndex = itemIndex; this.numberOfItems = numberOfItems; this.itemSource = itemSource; - mainVC = createVelocityContainer("item_details"); - - metadatasCtrl = new MetadatasController(ureq, wControl, item, securityCallback); - mainVC.put("metadatas", metadatasCtrl.getInitialComponent()); - listenTo(metadatasCtrl); Preferences guiPrefs = ureq.getUserSession().getGuiPreferences(); showMetadatas = (Boolean) guiPrefs.get(QuestionItemDetailsController.class, GUIPREF_KEY_SHOW_METADATAS); - Roles roles = ureq.getUserSession().getRoles(); - boolean moderator = roles.isOLATAdmin(); - boolean anonymous = roles.isGuestOnly() || roles.isInvitee(); - commentAndRatingSecurityCallback = new CommentAndRatingDefaultSecurityCallback(getIdentity(), moderator, anonymous); + mainVC = createVelocityContainer("item_details"); + setMetadatasController(ureq, wControl, item, securityCallback); + setQuestionController(ureq, item, securityCallback); setCommentsController(ureq); + putInitialPanel(mainVC); + } + + private void setMetadatasController(UserRequest ureq, WindowControl wControl, QuestionItem item, + QuestionItemSecurityCallback securityCallback) { + metadatasCtrl = new MetadatasController(ureq, wControl, item, securityCallback); + mainVC.put("metadatas", metadatasCtrl.getInitialComponent()); + listenTo(metadatasCtrl); + } + private void setQuestionController(UserRequest ureq, QuestionItem item, + QuestionItemSecurityCallback securityCallback) { + removeAsListenerAndDispose(questionCtrl); + questionCtrl = null; + QPoolSPI spi = poolModule.getQuestionPoolProvider(item.getFormat()); boolean canEditContent = securityCallback.canEditQuestion() && (spi != null && spi.isTypeEditable()); - if(canEditContent) { - editItem = LinkFactory.createButton("edit", mainVC, this); - editItem.setIconLeftCSS("o_icon o_icon_edit"); - } - setPreviewController(ureq, item); - putInitialPanel(mainVC); + if (spi != null) { + if (canEditContent) { + questionCtrl = spi.getEditableController(ureq, getWindowControl(), item); + } else { + questionCtrl = spi.getReadOnlyController(ureq, getWindowControl(), item); + } + } + if (questionCtrl == null && spi != null) { + questionCtrl = spi.getPreviewController(ureq, getWindowControl(), item, false); + } + if (questionCtrl == null) { + questionCtrl = new QuestionItemRawController(ureq, getWindowControl()); + } + listenTo(questionCtrl); + + if(mainVC != null) { + mainVC.put("type_specifics", questionCtrl.getInitialComponent()); + } } - private void setCommentsController(UserRequest ureq) { + private void setCommentsController(UserRequest ureq) { + Roles roles = ureq.getUserSession().getRoles(); + boolean moderator = roles.isOLATAdmin(); + boolean anonymous = roles.isGuestOnly() || roles.isInvitee(); + commentAndRatingSecurityCallback = new CommentAndRatingDefaultSecurityCallback(getIdentity(), moderator, anonymous); removeAsListenerAndDispose(commentsAndRatingCtr); commentsAndRatingCtr = new UserCommentsAndRatingsController(ureq, getWindowControl(), metadatasCtrl.getItem(), null, commentAndRatingSecurityCallback, true, this.securityCallback.canRate(), true); @@ -287,22 +304,6 @@ public class QuestionItemDetailsController extends BasicController implements To } } - protected void setPreviewController(UserRequest ureq, QuestionItem item) { - QPoolSPI spi = poolModule.getQuestionPoolProvider(item.getFormat()); - if(spi == null) { - previewCtrl = new QuestionItemRawController(ureq, getWindowControl()); - } else { - previewCtrl = spi.getPreviewController(ureq, getWindowControl(), item, false); - if(previewCtrl == null) { - previewCtrl = new QuestionItemRawController(ureq, getWindowControl()); - } - } - listenTo(previewCtrl); - if(mainVC != null) { - mainVC.put("type_specifics", previewCtrl.getInitialComponent()); - } - } - @Override protected void doDispose() { if(stackPanel != null) { @@ -310,18 +311,6 @@ public class QuestionItemDetailsController extends BasicController implements To } } - @Override - public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { - if(entries == null || entries.isEmpty()) return; - - String resourceTypeName = entries.get(0).getOLATResourceable().getResourceableTypeName(); - if("edit".equalsIgnoreCase(resourceTypeName)) { - if(securityCallback.canEditQuestion() || metadatasCtrl.getItem() != null) { - doEdit(ureq, metadatasCtrl.getItem()); - } - } - } - @Override protected void event(UserRequest ureq, Component source, Event event) { if (source == statusDraftLink) { @@ -346,8 +335,6 @@ public class QuestionItemDetailsController extends BasicController implements To doSelectGroup(ureq, metadatasCtrl.getItem()); } else if(source == exportItemLink) { doExport(ureq, metadatasCtrl.getItem()); - } else if(source == editItem) { - doEdit(ureq, metadatasCtrl.getItem()); } else if(source == copyItemLink) { doCopy(ureq, metadatasCtrl.getItem()); } else if(source == nextItemLink) { @@ -358,13 +345,6 @@ public class QuestionItemDetailsController extends BasicController implements To doShowMetadata(ureq); } else if(source == hideMetadataLink) { doHideMetadata(ureq); - } else if(source == stackPanel) { - if(event instanceof PopEvent) { - PopEvent pop = (PopEvent)event; - if(pop.getController() == editMainCtrl) { - reloadData(ureq); - } - } } } @@ -403,15 +383,17 @@ public class QuestionItemDetailsController extends BasicController implements To QuestionItem item = (QuestionItem)confirmEndOfLifeCtrl.getUserObject(); doEndOfLife(ureq, item); } + cleanUp(); } else if(source == confirmDeleteBox) { boolean delete = DialogBoxUIFactory.isYesEvent(event) || DialogBoxUIFactory.isOkEvent(event); if(delete) { QuestionItem item = (QuestionItem)confirmDeleteBox.getUserObject(); doDelete(ureq, item); } + cleanUp(); } else if(source == cmc) { cleanUp(); - } else if(source == editCtrl) { + } else if(source == questionCtrl) { if(event instanceof QItemEdited) { fireEvent(ureq, event); } @@ -429,10 +411,14 @@ public class QuestionItemDetailsController extends BasicController implements To removeAsListenerAndDispose(selectGroupCtrl); removeAsListenerAndDispose(reviewCtrl); removeAsListenerAndDispose(reviewStartCtrl); + removeAsListenerAndDispose(confirmDeleteBox); + removeAsListenerAndDispose(confirmEndOfLifeCtrl); cmc = null; selectGroupCtrl = null; reviewCtrl = null; reviewStartCtrl = null; + confirmDeleteBox = null; + confirmEndOfLifeCtrl = null; } private void doConfirmStartReview(UserRequest ureq, QuestionItem item) { @@ -524,6 +510,7 @@ public class QuestionItemDetailsController extends BasicController implements To setCommentsController(ureq); QuestionItem reloadedItem = qpoolService.loadItemById(itemView.getKey()); metadatasCtrl.setItem(reloadedItem, securityCallback); + setQuestionController(ureq, reloadedItem, securityCallback); } } @@ -535,17 +522,6 @@ public class QuestionItemDetailsController extends BasicController implements To } } - private void doEdit(UserRequest ureq, QuestionItem item) { - removeAsListenerAndDispose(editCtrl); - - QPoolSPI spi = poolModule.getQuestionPoolProvider(item.getFormat()); - editCtrl = spi.getEditableController(ureq, getWindowControl(), item); - listenTo(editCtrl); - - editMainCtrl = new LayoutMain3ColsController(ureq, getWindowControl(), editCtrl); - stackPanel.pushController("Edition", editMainCtrl); - } - private void doSelectGroup(UserRequest ureq, QuestionItem item) { removeAsListenerAndDispose(selectGroupCtrl); selectGroupCtrl = new SelectBusinessGroupController(ureq, getWindowControl()); diff --git a/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java b/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java index e3945c04f0c2196b8f5e9d4f00d57fd5cf196837..6643b1a084a8bf5ffc8bf86d3985d0e370dc2022 100644 --- a/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java +++ b/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java @@ -255,7 +255,7 @@ public class QuestionListController extends AbstractItemListController implement if(row == null) { //TODO xhr } else { - doSelectActivateable2(ureq, row); + doOpenDetails(ureq, row); } } } @@ -520,7 +520,7 @@ public class QuestionListController extends AbstractItemListController implement QItemEvent qce = (QItemEvent)event; if("copy-item".equals(qce.getCommand())) { stackPanel.popUpToRootController(ureq); - doSelectNewItem(ureq, qce.getItem()); + doOpenDetails(ureq, qce.getItem()); } else if("previous".equals(qce.getCommand())) { doPrevious(ureq, qce.getItem()); } else if("next".equals(qce.getCommand())) { @@ -596,7 +596,7 @@ public class QuestionListController extends AbstractItemListController implement private void doSelectOrReset(UserRequest ureq, ItemRow row) { if(row != null) { stackPanel.popUpToRootController(ureq); - doSelectActivateable2(ureq, row); + doOpenDetails(ureq, row); } else { getItemsTable().reset(true, true, true); } @@ -695,9 +695,7 @@ public class QuestionListController extends AbstractItemListController implement QPoolEvent qce = new QPoolEvent(QPoolEvent.ITEM_CREATED); fireEvent(ureq, qce); - - List<ContextEntry> entries = BusinessControlFactory.getInstance().createCEListFromResourceType("Edit"); - doSelectNewItem(ureq, item).activate(ureq, entries, null); + doOpenDetails(ureq, item); } private void doOpenImport(UserRequest ureq) { @@ -1172,22 +1170,22 @@ public class QuestionListController extends AbstractItemListController implement @Override protected void doSelect(UserRequest ureq, ItemRow row) { - doSelectActivateable2(ureq, row); + doOpenDetails(ureq, row); } - protected Activateable2 doSelectActivateable2(UserRequest ureq, ItemRow row) { + protected void doOpenDetails(UserRequest ureq, ItemRow row) { Integer index = getIndex(row.getKey()); int count = getModel().getRowCount(); - return doSelectActivateable2(ureq, row, index, count); + doOpenDetails(ureq, row, index, count); } - private Activateable2 doSelectNewItem(UserRequest ureq, QuestionItem newItem) { + private void doOpenDetails(UserRequest ureq, QuestionItem newItem) { ItemRow row = wrapNewItem(newItem); itemCollectionDirty = true; - return doSelectActivateable2(ureq, row, 0, 1); + doOpenDetails(ureq, row, 0, 1); } - private Activateable2 doSelectActivateable2(UserRequest ureq, ItemRow row, int index, int count) { + private void doOpenDetails(UserRequest ureq, ItemRow row, int index, int count) { removeAsListenerAndDispose(currentDetailsCtrl); QuestionItem item = qpoolService.loadItemById(row.getKey()); @@ -1196,7 +1194,6 @@ public class QuestionListController extends AbstractItemListController implement getSource(), index, count); listenTo(currentDetailsCtrl); stackPanel.pushController(item.getTitle(), currentDetailsCtrl); - return currentDetailsCtrl; } }