/**
* <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.gui.control;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.olat.admin.user.tools.UserTool;
import org.olat.admin.user.tools.UserToolExtension;
import org.olat.admin.user.tools.UserToolsModule;
import org.olat.core.commons.fullWebApp.LockableController;
import org.olat.core.dispatcher.DispatcherModule;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.link.Link;
import org.olat.core.gui.components.link.LinkFactory;
import org.olat.core.gui.components.velocity.VelocityContainer;
import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.Disposable;
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.id.User;
import org.olat.core.id.UserConstants;
import org.olat.core.util.StringHelper;
import org.olat.core.util.prefs.Preferences;
import org.olat.user.DisplayPortraitController;
import org.springframework.beans.factory.annotation.Autowired;
/**
*
* Initial date: 21.01.2014<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class OlatTopNavController extends BasicController implements LockableController {
private Link loginLink;
private VelocityContainer topNavVC;
private List<Disposable> disposableTools = new ArrayList<>();
@Autowired
private UserToolsModule userToolsModule;
public OlatTopNavController(UserRequest ureq, WindowControl wControl) {
super(ureq, wControl);
topNavVC = createVelocityContainer("topnav");
topNavVC.setDomReplacementWrapperRequired(false); // we provide our own DOM replacmenet ID
boolean isGuest = ureq.getUserSession().getRoles().isGuestOnly();
boolean isInvitee = ureq.getUserSession().getRoles().isInvitee();
topNavVC.contextPut("isGuest", new Boolean(isGuest));
topNavVC.contextPut("isInvitee", new Boolean(isInvitee));
// login link
if (ureq.getIdentity() == null) {
loginLink = LinkFactory.createLink("topnav.login", topNavVC, this);
loginLink.setIconLeftCSS("o_icon o_icon_login o_icon-lg");
loginLink.setTooltip("topnav.login.alt");
}
if(ureq.getIdentity() != null && !isGuest && !isInvitee) {
loadPersonalTools(ureq);
// the user profile
Component portrait = getPortraitCmp(ureq);
topNavVC.put("portrait", portrait);
// the label to open the personal menu
User user = getIdentity().getUser();
String[] attr = new String[] {
StringHelper.escapeHtml(user.getProperty(UserConstants.FIRSTNAME, getLocale())),
StringHelper.escapeHtml(user.getProperty(UserConstants.LASTNAME, getLocale())),
getIdentity().getName()
};
String myMenuText = translate("topnav.my.menu.label", attr);
topNavVC.contextPut("myMenuLabel", myMenuText);
}
topNavVC.contextPut("locked", Boolean.FALSE);
putInitialPanel(topNavVC);
}
@Override
public void lock() {
topNavVC.contextPut("locked", Boolean.TRUE);
}
@Override
public void unlock() {
topNavVC.contextPut("locked", Boolean.FALSE);
}
@Override
public void event(UserRequest ureq, Component source, Event event) {
if (source == loginLink) {
DispatcherModule.redirectToDefaultDispatcher(ureq.getHttpResp());
}
}
private Component getPortraitCmp(UserRequest ureq) {
Controller ctr = new DisplayPortraitController(ureq, getWindowControl(), getIdentity(), false, false, false, true);
listenTo(ctr);
return ctr.getInitialComponent();
}
private void loadPersonalTools(UserRequest ureq) {
List<Tool> toolSetLinksName = new ArrayList<Tool>();
Preferences prefs = ureq.getUserSession().getGuiPreferences();
String selectedTools = userToolsModule.getUserTools(prefs);
if(!StringHelper.containsNonWhitespace(selectedTools)) {
selectedTools = userToolsModule.getDefaultPresetOfUserTools();
}
Set<String> selectedToolSet = new HashSet<>();
if(StringHelper.containsNonWhitespace(selectedTools)) {
String[] selectedToolArr = selectedTools.split(",");
for(String selectedTool:selectedToolArr) {
selectedToolSet.add(UserToolsModule.stripToolKey(selectedTool));
}
}
List<UserToolExtension> toolExtensions = userToolsModule.getUserToolExtensions(ureq);
for (UserToolExtension toolExtension : toolExtensions) {
// check for sites
if(toolExtension.isShortCutOnly() || selectedToolSet.contains(toolExtension.getUniqueExtensionID())) {
UserTool tool = toolExtension.createUserTool(ureq, getWindowControl(), getLocale());
if(tool != null) {
Component cmp = tool.getMenuComponent(ureq, topNavVC);
String cssId = toolExtension.getShortCutCssId();
String cssClass = toolExtension.getShortCutCssClass();
toolSetLinksName.add(new Tool(cssId, cssClass, cmp.getComponentName()));
disposableTools.add(tool);
}
}
}
topNavVC.contextPut("toolSet", toolSetLinksName);
}
@Override
protected void doDispose() {
for(Disposable disposableTool:disposableTools) {
disposableTool.dispose();
}
}
public static class Tool {
private final String shortCutCssId;
private final String shortCutCssClass;
private final String shortCutComponentName;
public Tool(String shortCutCssId, String shortCutCssClass, String shortCutComponentName) {
this.shortCutCssId = shortCutCssId;
this.shortCutCssClass = shortCutCssClass;
this.shortCutComponentName = shortCutComponentName;
}
public String getShortCutCssId() {
return shortCutCssId;
}
public String getShortCutCssClass() {
return shortCutCssClass;
}
public String getShortCutComponentName() {
return shortCutComponentName;
}
}
}