diff --git a/src/main/java/org/olat/core/id/context/StateMapped.java b/src/main/java/org/olat/core/id/context/StateMapped.java index eb132c0fab3b91baf4fe2d2824b7427af621ff1f..8cf89b158189f6c5af9f7bc227d384cbd077e08d 100644 --- a/src/main/java/org/olat/core/id/context/StateMapped.java +++ b/src/main/java/org/olat/core/id/context/StateMapped.java @@ -37,6 +37,10 @@ public class StateMapped implements StateEntry{ public StateMapped() { //make XStream happy } + + public StateMapped(String key, String value) { + delegate.put(key, value); + } public Map<String, String> getDelegate() { return delegate; diff --git a/src/main/java/org/olat/modules/wiki/WikiMainController.java b/src/main/java/org/olat/modules/wiki/WikiMainController.java index af7136a59f8f49238440c2a5a8a4dd7395c8c647..c9c3766bf08286681df0421cc10134d18fcb91e1 100644 --- a/src/main/java/org/olat/modules/wiki/WikiMainController.java +++ b/src/main/java/org/olat/modules/wiki/WikiMainController.java @@ -28,6 +28,7 @@ package org.olat.modules.wiki; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -88,6 +89,7 @@ import org.olat.core.util.vfs.VFSLeaf; import org.olat.core.util.vfs.VFSMediaResource; import org.olat.modules.fo.Forum; import org.olat.modules.fo.ForumCallback; +import org.olat.modules.fo.ForumController; import org.olat.modules.fo.ForumManager; import org.olat.modules.fo.ForumUIFactory; import org.olat.modules.wiki.gui.components.wikiToHtml.ErrorEvent; @@ -103,6 +105,7 @@ import org.olat.portfolio.EPUIFactory; import org.olat.util.logging.activity.LoggingResourceable; + /** * Description:<br> * This controller creates the whole GUI for a wiki with a tabbed pane contaning an article @@ -123,6 +126,7 @@ public class WikiMainController extends BasicController implements CloneableCont private VFSContainer wikiContainer; private OLATResourceable ores; private VelocityContainer articleContent, navigationContent, discussionContent, editContent, content, versioningContent, mediaMgntContent, imageDisplay, fileListVC; + private ForumController forumController; private WikiEditArticleForm wikiEditForm; private WikiMarkupComponent wikiMenuComp, wikiArticleComp, wikiVersionDisplayComp; private ContextualSubscriptionController cSubscriptionCtrl; @@ -328,15 +332,54 @@ public class WikiMainController extends BasicController implements CloneableCont public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) { if(entries == null || entries.isEmpty()) return; - String path = BusinessControlFactory.getInstance().getPath(entries.get(0)); - Wiki wiki = getWiki(); - String activatePageId = WikiManager.generatePageId(FilterUtil.normalizeWikiLink(path)); - if(wiki.pageExists(activatePageId)) { - WikiPage page = wiki.getPage(activatePageId, true); - if(page != null) { - this.pageId = page.getPageId(); + ContextEntry ce = entries.get(0); + String typ = ce.getOLATResourceable().getResourceableTypeName(); + if("az".equals(typ)) { + openAtoZPage(ureq, getWiki()); + } else if ("lastChanges".equals(typ)) { + openLastChangesPage(ureq, getWiki()); + } else if ("index".equals(typ)) { + WikiPage page = openIndexPage(ureq, getWiki()); + pageId = page.getPageId(); + } else if ("Forum".equals(typ)) { + Wiki wiki = getWiki(); + Long forumKey = ce.getOLATResourceable().getResourceableId(); + for(WikiPage page:wiki.getAllPagesWithContent()) { + if(forumKey.longValue() == page.getForumKey()) { + if(page != null) { + this.pageId = page.getPageId(); + } + updatePageContext(ureq, page); + + OLATResourceable ores = OresHelper.createOLATResourceableInstance("tab", 1l); + ContextEntry tabCe = BusinessControlFactory.getInstance().createContextEntry(ores); + tabs.activate(ureq, Collections.singletonList(tabCe), null); + if(forumController != null && entries.size() > 1) { + List<ContextEntry> subEntries = entries.subList(1, entries.size()); + forumController.activate(ureq, subEntries, null); + } + break; + } + } + } else { + String path = BusinessControlFactory.getInstance().getPath(ce); + Wiki wiki = getWiki(); + String activatePageId = WikiManager.generatePageId(FilterUtil.normalizeWikiLink(path)); + if(wiki.pageExists(activatePageId)) { + WikiPage page = wiki.getPage(activatePageId, true); + if(page != null) { + this.pageId = page.getPageId(); + } + updatePageContext(ureq, page); + + if(entries.size() > 1) { + List<ContextEntry> subEntries = entries.subList(1, entries.size()); + String subTyp = subEntries.get(0).getOLATResourceable().getResourceableTypeName(); + if("tab".equals(subTyp)) { + tabs.activate(ureq, subEntries, ce.getTransientState()); + } + } } - updatePageContext(ureq, page); } } @@ -362,68 +405,11 @@ public class WikiMainController extends BasicController implements CloneableCont /************************************************************************* * tabbed pane events ************************************************************************/ - // first release a potential lock on this page. only when the edit tab is acitve - // a lock will be created. in all other cases it is save to release an existing lock - doReleaseEditLock(); + TabbedPaneChangedEvent tabEvent = (TabbedPaneChangedEvent) event; Component comp = tabEvent.getNewComponent(); String compName = comp.getComponentName(); - if (command.equals(TabbedPaneChangedEvent.TAB_CHANGED)) { - updatePageContext(ureq, page); - } - if (command.equals(TabbedPaneChangedEvent.TAB_CHANGED) && compName.equals("vc_article")) { - /*********************************************************************** - * tabbed pane change to article - **********************************************************************/ - // if(page.getContent().equals("")) wikiArticleComp.setVisible(false); - // FIXME:guido: ... && comp == articleContent)) etc. - } else if (command.equals(TabbedPaneChangedEvent.TAB_CHANGED) && compName.equals("vc_edit")) { - /*********************************************************************** - * tabbed pane change to edit tab - **********************************************************************/ - wikiEditForm.resetUpdateComment(); - editContent.contextPut("mayDeleteArticle", Boolean.valueOf(ident.getKey().equals(Long.valueOf(page.getInitalAuthor() )) || securityCallback.mayEditWikiMenu() )); - editContent.contextPut("linkList", wiki.getListOfAllPageNames()); - editContent.contextPut("fileList", wiki.getMediaFileList()); - // try to edit acquire lock for this page - tryToSetEditLock(page, ureq, ores); - } else if (command.equals(TabbedPaneChangedEvent.TAB_CHANGED) && compName.equals("vc_versions")) { - /*********************************************************************** - * tabbed pane change to versioning tab - **********************************************************************/ - versioningTableModel = new HistoryTableDateModel(wiki.getHistory(page), getTranslator()); - removeAsListenerAndDispose(versioningTableCtr); - versioningTableCtr = new TableController(tableConfig, ureq, getWindowControl(), getTranslator()); - listenTo(versioningTableCtr); - versioningTableModel.addColumnDescriptors(versioningTableCtr); - versioningTableCtr.setTableDataModel(versioningTableModel); - versioningTableCtr.modelChanged(); - versioningTableCtr.setSortColumn(1, false); - versioningContent.put("versions", versioningTableCtr.getInitialComponent()); - versioningContent.contextPut("diffs", diffs); - } else if (command.equals(TabbedPaneChangedEvent.TAB_CHANGED) && compName.equals("vc_discuss")) { - /*********************************************************************** - * tabbed pane change to discussion tab - **********************************************************************/ - Forum forum = null; - if (page.getForumKey() == 0) { - forum = ForumManager.getInstance().addAForum(); - page.setForumKey(forum.getKey().longValue()); - WikiManager.getInstance().updateWikiPageProperties(ores, page); - } - forum = ForumManager.getInstance().loadForum(Long.valueOf(page.getForumKey())); - // TODO enhance forum callback with subscription stuff - boolean isModerator = securityCallback.mayModerateForum(); - ForumCallback forumCallback = new WikiForumCallback(ureq.getUserSession().getRoles().isGuestOnly(), isModerator); - - // calculate the new businesscontext for the coursenode being called. - //FIXME:pb:mannheim discussion should not be "this.ores" -> may be the "forum" should go in here. - // - ContextEntry ce = BusinessControlFactory.getInstance().createContextEntry(forum); - WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ce, getWindowControl()); - - discussionContent.put("articleforum", ForumUIFactory.getStandardForumController(ureq, bwControl, forum, forumCallback).getInitialComponent()); - } + selectTab(ureq, command, compName, page, wiki); } else if (source == wikiArticleComp || source == wikiMenuComp) { /************************************************************************* * wiki component events @@ -469,27 +455,11 @@ public class WikiMainController extends BasicController implements CloneableCont tabs.setSelectedPane(2); } } else if (source == toMainPageLink){ // home link - page = wiki.getPage(WikiPage.WIKI_INDEX_PAGE, true); - page.incrementViewCount(); - breadCrumpCtr.addLink(page.getPageName(), page.getPageName()); - updatePageContext(ureq, page); - tabs.setSelectedPane(0); + page = openIndexPage(ureq, wiki); } else if (source == a2zLink){ - WikiPage a2zPage = wiki.getPage(WikiPage.WIKI_A2Z_PAGE); - articleContent.contextPut("page", a2zPage); - a2zPage.setContent(translate("nav.a-z.desc")+wiki.getAllPageNamesSorted()); - wikiArticleComp.setWikiContent(a2zPage.getContent()); - clearPortfolioLink(); - setTabsEnabled(false); - tabs.setSelectedPane(0); + openAtoZPage(ureq, wiki); } else if (source == changesLink){ - WikiPage recentChanges = wiki.getPage(WikiPage.WIKI_RECENT_CHANGES_PAGE); - recentChanges.setContent(translate("nav.changes.desc")+wiki.getRecentChanges(ureq.getLocale())); - clearPortfolioLink(); - articleContent.contextPut("page", recentChanges); - wikiArticleComp.setWikiContent(recentChanges.getContent()); - setTabsEnabled(false); - tabs.setSelectedPane(0); + openLastChangesPage(ureq, wiki); } else if (source == editMenuButton){ page = wiki.getPage(WikiPage.WIKI_MENU_PAGE); editContent.contextPut("linkList", wiki.getListOfAllPageNames()); @@ -536,6 +506,106 @@ public class WikiMainController extends BasicController implements CloneableCont //set recent page id to the page currently used if(page != null)this.pageId = page.getPageId(); } + + private void selectTab(UserRequest ureq, String command, String compName, WikiPage page, Wiki wiki) { + // first release a potential lock on this page. only when the edit tab is acitve + // a lock will be created. in all other cases it is save to release an existing lock + doReleaseEditLock(); + if (command.equals(TabbedPaneChangedEvent.TAB_CHANGED)) { + updatePageContext(ureq, page); + } + + if (command.equals(TabbedPaneChangedEvent.TAB_CHANGED) && compName.equals("vc_article")) { + /*********************************************************************** + * tabbed pane change to article + **********************************************************************/ + // if(page.getContent().equals("")) wikiArticleComp.setVisible(false); + // FIXME:guido: ... && comp == articleContent)) etc. + } else if (command.equals(TabbedPaneChangedEvent.TAB_CHANGED) && compName.equals("vc_edit")) { + /*********************************************************************** + * tabbed pane change to edit tab + **********************************************************************/ + wikiEditForm.resetUpdateComment(); + editContent.contextPut("mayDeleteArticle", Boolean.valueOf(ident.getKey().equals(Long.valueOf(page.getInitalAuthor() )) || securityCallback.mayEditWikiMenu() )); + editContent.contextPut("linkList", wiki.getListOfAllPageNames()); + editContent.contextPut("fileList", wiki.getMediaFileList()); + // try to edit acquire lock for this page + tryToSetEditLock(page, ureq, ores); + } else if (command.equals(TabbedPaneChangedEvent.TAB_CHANGED) && compName.equals("vc_versions")) { + /*********************************************************************** + * tabbed pane change to versioning tab + **********************************************************************/ + versioningTableModel = new HistoryTableDateModel(wiki.getHistory(page), getTranslator()); + removeAsListenerAndDispose(versioningTableCtr); + versioningTableCtr = new TableController(tableConfig, ureq, getWindowControl(), getTranslator()); + listenTo(versioningTableCtr); + versioningTableModel.addColumnDescriptors(versioningTableCtr); + versioningTableCtr.setTableDataModel(versioningTableModel); + versioningTableCtr.modelChanged(); + versioningTableCtr.setSortColumn(1, false); + versioningContent.put("versions", versioningTableCtr.getInitialComponent()); + versioningContent.contextPut("diffs", diffs); + } else if (command.equals(TabbedPaneChangedEvent.TAB_CHANGED) && compName.equals("vc_discuss")) { + /*********************************************************************** + * tabbed pane change to discussion tab + **********************************************************************/ + Forum forum = null; + if (page.getForumKey() == 0) { + forum = ForumManager.getInstance().addAForum(); + page.setForumKey(forum.getKey().longValue()); + WikiManager.getInstance().updateWikiPageProperties(ores, page); + } + forum = ForumManager.getInstance().loadForum(Long.valueOf(page.getForumKey())); + // TODO enhance forum callback with subscription stuff + boolean isModerator = securityCallback.mayModerateForum(); + ForumCallback forumCallback = new WikiForumCallback(ureq.getUserSession().getRoles().isGuestOnly(), isModerator); + + ContextEntry ce = BusinessControlFactory.getInstance().createContextEntry(forum); + WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ce, getWindowControl()); + + removeAsListenerAndDispose(forumController); + forumController = ForumUIFactory.getStandardForumController(ureq, bwControl, forum, forumCallback); + listenTo(forumController); + discussionContent.put("articleforum", forumController.getInitialComponent()); + } + + OLATResourceable pageRes = OresHelper.createOLATResourceableTypeWithoutCheck("path=" + page.getPageName()); + WindowControl wc = addToHistory(ureq, pageRes, null); + OLATResourceable tabOres = tabs.getTabResource(); + addToHistory(ureq, tabOres, null, wc, true); + } + + private WikiPage openIndexPage(UserRequest ureq, Wiki wiki) { + WikiPage page = wiki.getPage(WikiPage.WIKI_INDEX_PAGE, true); + page.incrementViewCount(); + breadCrumpCtr.addLink(page.getPageName(), page.getPageName()); + updatePageContext(ureq, page); + tabs.setSelectedPane(0); + addToHistory(ureq, OresHelper.createOLATResourceableTypeWithoutCheck("index"), null); + return page; + } + + private void openLastChangesPage(UserRequest ureq, Wiki wiki) { + WikiPage recentChanges = wiki.getPage(WikiPage.WIKI_RECENT_CHANGES_PAGE); + recentChanges.setContent(translate("nav.changes.desc")+wiki.getRecentChanges(ureq.getLocale())); + clearPortfolioLink(); + articleContent.contextPut("page", recentChanges); + wikiArticleComp.setWikiContent(recentChanges.getContent()); + setTabsEnabled(false); + tabs.setSelectedPane(0); + addToHistory(ureq, OresHelper.createOLATResourceableTypeWithoutCheck("lastChanges"), null); + } + + private void openAtoZPage(UserRequest ureq, Wiki wiki) { + WikiPage a2zPage = wiki.getPage(WikiPage.WIKI_A2Z_PAGE); + articleContent.contextPut("page", a2zPage); + a2zPage.setContent(translate("nav.a-z.desc")+wiki.getAllPageNamesSorted()); + wikiArticleComp.setWikiContent(a2zPage.getContent()); + clearPortfolioLink(); + setTabsEnabled(false); + tabs.setSelectedPane(0); + addToHistory(ureq, OresHelper.createOLATResourceableTypeWithoutCheck("az"), null); + } private void deliverMediaFile(UserRequest ureq, String command) {