/* * Copyright (c) 2009-2011 Lockheed Martin Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.eurekastreams.web.client.ui.common; import java.util.HashMap; import org.eurekastreams.server.domain.Page; import org.eurekastreams.server.search.modelview.AuthenticationType; import org.eurekastreams.server.search.modelview.PersonModelView; import org.eurekastreams.server.search.modelview.PersonModelView.Role; import org.eurekastreams.web.client.events.Observer; import org.eurekastreams.web.client.events.SwitchedHistoryViewEvent; import org.eurekastreams.web.client.history.CreateUrlRequest; import org.eurekastreams.web.client.ui.Session; import org.eurekastreams.web.client.ui.common.notification.NotificationCountWidget; import org.eurekastreams.web.client.ui.pages.master.StaticResourceBundle; import org.eurekastreams.web.client.ui.pages.search.GlobalSearchComposite; import org.eurekastreams.web.client.events.EventBus; import org.eurekastreams.web.client.events.data.GotSystemSettingsResponseEvent; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Hyperlink; /** * HeaderComposite draws the header bar for the user. */ public class HeaderComposite extends Composite { /** * Link Panel to encapsulate external links in header. */ FlowPanel startPageLinkPanel = new FlowPanel(); /** * Link Panel to encapsulate external links in header. */ FlowPanel externalPageLinkPanel = new FlowPanel(); /** * Link Panel to encapsulate external links in header. */ FlowPanel activityLinkPanel = new FlowPanel(); /** * Link Panel to encapsulate external links in header. */ FlowPanel settingsLinkPanel = new FlowPanel(); /** * Link Panel to encapsulate external links in header. */ FlowPanel directoryLinkPanel = new FlowPanel(); /** * Link Panel to encapsulate external links in header. */ FlowPanel galleryLinkPanel = new FlowPanel(); /** * Link Panel to encapsulate external links in header. */ FlowPanel learnMoreLinkPanel = new FlowPanel(); /** The search box. */ private final GlobalSearchComposite profileSearchBox = new GlobalSearchComposite("Find a Stream"); /** * Notification Count widget. */ private final NotificationCountWidget notif = new NotificationCountWidget(); /** * The link map. */ private final HashMap<Page, Hyperlink> linkMap = new HashMap<Page, Hyperlink>(); /** * Primary constructor for the Header composite. */ public HeaderComposite() { Session.getInstance().getEventBus().addObserver(SwitchedHistoryViewEvent.class, new Observer<SwitchedHistoryViewEvent>() { public void update(final SwitchedHistoryViewEvent eventArg) { if (eventArg != null) { if (eventArg.getPage() != null) { setActive(eventArg.getPage()); } } } }, true); } /** * Render the header. * * @param viewer * - user to display. */ public void render(final PersonModelView viewer) { HorizontalULPanel userNav; FlowPanel panel = new FlowPanel(); FlowPanel navPanel = new FlowPanel(); Anchor externalLink = new Anchor("EurekaStreams.org", "http://www.eurekastreams.org", "_blank"); externalLink.addStyleName(StaticResourceBundle.INSTANCE.coreCss().navBarButton()); Hyperlink startPageLink = new Hyperlink("Start", Session.getInstance().generateUrl( new CreateUrlRequest(Page.START))); startPageLink.addStyleName(StaticResourceBundle.INSTANCE.coreCss().navBarButton()); Hyperlink activityLink = new Hyperlink("Activity", Session.getInstance().generateUrl( new CreateUrlRequest(Page.ACTIVITY))); activityLink.addStyleName(StaticResourceBundle.INSTANCE.coreCss().navBarButton()); Hyperlink directoryLink = new Hyperlink("Discover", Session.getInstance().generateUrl( new CreateUrlRequest(Page.DISCOVER))); directoryLink.addStyleName(StaticResourceBundle.INSTANCE.coreCss().navBarButton()); Hyperlink settingsLink = new Hyperlink("Settings", Session.getInstance().generateUrl( new CreateUrlRequest(Page.SETTINGS))); settingsLink.addStyleName(StaticResourceBundle.INSTANCE.coreCss().navBarButton()); Hyperlink myProfileLink = new Hyperlink("My Stream", Session.getInstance().generateUrl( new CreateUrlRequest(Page.PEOPLE, viewer.getAccountId()))); myProfileLink.addStyleName(StaticResourceBundle.INSTANCE.coreCss().navBarButton()); externalPageLinkPanel.add(externalLink); externalPageLinkPanel.addStyleName(StaticResourceBundle.INSTANCE.coreCss().externalHeaderButton()); startPageLinkPanel.add(startPageLink); startPageLinkPanel.addStyleName(StaticResourceBundle.INSTANCE.coreCss().startHeaderButton()); activityLinkPanel.add(activityLink); activityLinkPanel.addStyleName(StaticResourceBundle.INSTANCE.coreCss().activityHeaderButton()); directoryLinkPanel.add(directoryLink); directoryLinkPanel.addStyleName(StaticResourceBundle.INSTANCE.coreCss().discoverHeaderButton()); linkMap.put(Page.START, startPageLink); linkMap.put(Page.ACTIVITY, activityLink); linkMap.put(Page.DISCOVER, directoryLink); linkMap.put(Page.GROUPS, directoryLink); linkMap.put(Page.PEOPLE, directoryLink); linkMap.put(Page.GROUP_SETTINGS, directoryLink); linkMap.put(Page.PERSONAL_SETTINGS, directoryLink); linkMap.put(Page.SETTINGS, settingsLink); final HorizontalULPanel mainNav = new HorizontalULPanel(); userNav = new HorizontalULPanel(); mainNav.add(externalPageLinkPanel); // The user IS logged in mainNav.add(startPageLinkPanel); mainNav.add(activityLinkPanel); mainNav.add(directoryLinkPanel); mainNav.add(galleryLinkPanel); // Add learn more conditionally if support stream exists EventBus.getInstance().addObserver(GotSystemSettingsResponseEvent.class, new Observer<GotSystemSettingsResponseEvent>() { public void update(final GotSystemSettingsResponseEvent event) { if (event.getResponse().getSupportStreamGroupShortName() != null && event.getResponse().getSupportStreamGroupShortName().length() > 0 && event.getResponse().getSupportStreamWebsite() != null && event.getResponse().getSupportStreamWebsite().length() > 0) { Anchor learnMoreLink = new Anchor("Learn", event.getResponse().getSupportStreamWebsite(), "_blank"); learnMoreLink.addStyleName(StaticResourceBundle.INSTANCE.coreCss().navBarButton()); learnMoreLinkPanel.add(learnMoreLink); learnMoreLinkPanel.addStyleName( StaticResourceBundle.INSTANCE.coreCss().learnmoreHeaderButton()); mainNav.add(learnMoreLinkPanel); } } }); notif.init(); FlowPanel myProfileLinkPanel = new FlowPanel(); myProfileLinkPanel.add(myProfileLink); userNav.add(myProfileLinkPanel); userNav.add(notif, StaticResourceBundle.INSTANCE.coreCss().notifHeader()); if (Session.getInstance().getCurrentPersonRoles().contains(Role.SYSTEM_ADMIN)) { settingsLinkPanel.add(settingsLink); settingsLinkPanel.addStyleName(StaticResourceBundle.INSTANCE.coreCss().settingsHeaderButton()); userNav.add(settingsLinkPanel); } if (Session.getInstance().getAuthenticationType() == AuthenticationType.FORM) { userNav.add(new Anchor("Logout", "/j_spring_security_logout")); } // Note: The profile search box is created at constructor time because it registers listeners on the event // bus which needs to happen before the call to bufferObservers. The profile search box is created only once // (not replaced on page changes), so its listeners must be buffered, else they would be lost on the first // page change. userNav.add(profileSearchBox, StaticResourceBundle.INSTANCE.coreCss().globalSearchBoxNav()); // Style the Elements panel.addStyleName(StaticResourceBundle.INSTANCE.coreCss().headerBar()); navPanel.addStyleName(StaticResourceBundle.INSTANCE.coreCss().navBar()); mainNav.addStyleName(StaticResourceBundle.INSTANCE.coreCss().mainNav()); userNav.addStyleName(StaticResourceBundle.INSTANCE.coreCss().userBar()); // Add the elements to the main panel navPanel.add(mainNav); navPanel.add(userNav); panel.add(navPanel); initWidget(panel); setActive(Session.getInstance().getUrlPage()); } /** * Set the top button as active. * * @param page * the page to activate. */ public void setActive(final Page page) { for (Page specificPage : linkMap.keySet()) { linkMap.get(specificPage).removeStyleName(StaticResourceBundle.INSTANCE.coreCss().active()); } if (linkMap.containsKey(page)) { linkMap.get(page).addStyleName(StaticResourceBundle.INSTANCE.coreCss().active()); } } }