/* * 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.pages.master; import java.util.HashSet; import java.util.List; import org.eurekastreams.commons.client.ActionProcessor; import org.eurekastreams.server.domain.AvatarUrlGenerator; import org.eurekastreams.server.domain.Page; import org.eurekastreams.server.domain.SystemSettings; import org.eurekastreams.server.domain.TutorialVideoDTO; import org.eurekastreams.server.search.modelview.PersonModelView; import org.eurekastreams.web.client.events.GetTutorialVideoResponseEvent; import org.eurekastreams.web.client.events.Observer; import org.eurekastreams.web.client.events.SetBannerEvent; import org.eurekastreams.web.client.events.SwitchedHistoryViewEvent; import org.eurekastreams.web.client.events.data.GotSystemSettingsResponseEvent; import org.eurekastreams.web.client.jsni.WidgetJSNIFacadeImpl; import org.eurekastreams.web.client.model.SystemSettingsModel; import org.eurekastreams.web.client.model.TutorialVideoModel; import org.eurekastreams.web.client.ui.PeriodicEventManager; import org.eurekastreams.web.client.ui.Session; import org.eurekastreams.web.client.ui.common.FooterComposite; import org.eurekastreams.web.client.ui.common.HeaderComposite; import org.eurekastreams.web.client.ui.common.dialog.Dialog; import org.eurekastreams.web.client.ui.common.dialog.optoutvideo.OptOutableVideoDialogContent; import org.eurekastreams.web.client.ui.common.notifier.UINotifier; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; /** * A "Master" page, has a header and a footer and content. */ public class MasterComposite extends Composite { /** * Panel to use. */ FlowPanel panel; /** * The header panel. */ FlowPanel headerPanel = new FlowPanel(); /** * The site Labing Text. */ String siteLabelingText = ""; /** * The footer panel. */ FooterComposite footerPanel = new FooterComposite(); /** * The content panel. */ FlowPanel contentPanel = new FlowPanel(); /** * Wraps the content panel. */ FlowPanel mainContents = new FlowPanel(); /** * The actino processor to use. */ private final ActionProcessor actionProcessor; /** * The composite representing the content. */ Composite contentComposite; /** * The header panel. */ private final HeaderComposite header = new HeaderComposite(); /** * Banner. */ private final BannerPanel banner = new BannerPanel(); /** * Notifier. */ UINotifier notifier = new UINotifier(); /** * Page factory. */ private final PageFactory factory = new PageFactory(); /** * Tracks page we are currently on. */ private Page currentPage; /** * List of the currentViews. */ private List<String> currentViews; /** To tell event manager when system is active. */ private PeriodicEventManager evtMgr; /** * Have any pages been loaded (prevents an infinite loop for IE only start page refreshing.). */ private boolean pageHasBeenLoaded = false; /** * Default constructor. * */ public MasterComposite() { actionProcessor = Session.getInstance().getActionProcessor(); evtMgr = Session.getInstance().getPeriodicEventManager(); panel = new FlowPanel() { @Override public void onBrowserEvent(final Event ev) { super.onBrowserEvent(ev); evtMgr.userActivityDetected(); } }; panel.sinkEvents(Event.KEYEVENTS | Event.FOCUSEVENTS | Event.MOUSEEVENTS & ~Event.ONMOUSEMOVE); panel.addStyleName(StaticResourceBundle.INSTANCE.coreCss().main()); headerPanel.addStyleName(StaticResourceBundle.INSTANCE.coreCss().headerContainer()); notifier.addStyleName(StaticResourceBundle.INSTANCE.coreCss().masterNotifier()); panel.add(notifier); mainContents.addStyleName(StaticResourceBundle.INSTANCE.coreCss().mainContents()); mainContents.add(headerPanel); mainContents.add(contentPanel); contentPanel.addStyleName(StaticResourceBundle.INSTANCE.coreCss().content()); panel.add(mainContents); initWidget(panel); Session.getInstance().getEventBus() .addObserver(GetTutorialVideoResponseEvent.class, new Observer<GetTutorialVideoResponseEvent>() { public void update(final GetTutorialVideoResponseEvent event) { HashSet<TutorialVideoDTO> tutVids = event.getResponse(); PersonModelView currentPerson = Session.getInstance().getCurrentPerson(); for (TutorialVideoDTO vid : tutVids) { if (vid.getPage() == currentPage) { if (currentPage == Page.PEOPLE && !(currentViews.contains(currentPerson.getAccountId()))) { // if you are on the person profile tab but it's not you then don't show this // dialog. break; } if (!(currentPerson.getOptOutVideos().contains(vid.getEntityId()))) { final Integer videoWidth = vid.getVideoWidth() != null ? vid.getVideoWidth() : OptOutableVideoDialogContent.DEFAULT_VIDEO_WIDTH; OptOutableVideoDialogContent dialogContent = new OptOutableVideoDialogContent(vid); Dialog dialog = new Dialog(dialogContent) { { getPopupPanel().setModal(true); } @Override public void center() { getPopupPanel().setWidth( videoWidth + OptOutableVideoDialogContent.CONTENT_WIDTH + OptOutableVideoDialogContent.MARGIN_OFFSET + "px"); super.center(); getPopupPanel().setPopupPosition(getPopupPanel().getAbsoluteLeft(), OptOutableVideoDialogContent.DIALOG_HEIGHT_OFFSET); } }; dialog.show(); } break; } } } }); Session.getInstance().getEventBus() .addObserver(SwitchedHistoryViewEvent.class, new Observer<SwitchedHistoryViewEvent>() { public void update(final SwitchedHistoryViewEvent event) { mainContents.remove(banner); notifier.setVisible(false); contentPanel.clear(); contentPanel.add(factory.createPage(event.getPage(), event.getViews())); currentPage = event.getPage(); currentViews = event.getViews(); pageHasBeenLoaded = true; TutorialVideoModel.getInstance().fetch(null, true); } }); Session.getInstance().getEventBus().addObserver(SetBannerEvent.class, new Observer<SetBannerEvent>() { public void update(final SetBannerEvent event) { mainContents.insert(banner, 1); // Banner exists and should override the banner the theme is supplying. (i.e. profile page.) if (event.getBannerableEntity() != null) { AvatarUrlGenerator urlGen = new AvatarUrlGenerator(null); new WidgetJSNIFacadeImpl().setBanner(urlGen .getBannerUrl(event.getBannerableEntity().getBannerId())); } // Start page, the bannerable entity is null, just clear out the banner value // to let the theme take over again. else { new WidgetJSNIFacadeImpl().clearBanner(false); } } }); } /** * Get the user agent (for detecting IE7). * * @return the user agent. */ public static native String getUserAgent() /*-{ return navigator.userAgent.toLowerCase(); }-*/; /** * Render header and footer. * */ public void renderHeaderAndFooter() { PersonModelView person = Session.getInstance().getCurrentPerson(); headerPanel.clear(); headerPanel.add(getHeaderComposite(person)); } /** * Get the header composite. * * @param viewer * the user. * @return the header composite. */ HeaderComposite getHeaderComposite(final PersonModelView viewer) { panel.add(footerPanel); header.render(viewer); Session.getInstance().getEventBus() .addObserver(GotSystemSettingsResponseEvent.class, new Observer<GotSystemSettingsResponseEvent>() { public void update(final GotSystemSettingsResponseEvent event) { final SystemSettings settings = event.getResponse(); header.setSiteLabelTemplate(settings.getHeaderTemplate(), settings.getSiteLabel()); footerPanel.setSiteLabelTemplate(settings.getFooterTemplate(), settings.getSiteLabel()); } }); SystemSettingsModel.getInstance().fetch(null, true); return header; } }