/* * SlideNavigationPresenter.java * * Copyright (C) 2009-12 by RStudio, Inc. * * Unless you have received this program directly from RStudio pursuant * to the terms of a commercial license agreement with RStudio, then * this program is licensed to you under the terms of version 3 of the * GNU Affero General Public License. This program is distributed WITHOUT * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT, * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details. * */ package org.rstudio.studio.client.common.presentation; import org.rstudio.studio.client.common.presentation.events.SlideIndexChangedEvent; import org.rstudio.studio.client.common.presentation.events.SlideNavigationChangedEvent; import org.rstudio.studio.client.common.presentation.model.SlideNavigation; import org.rstudio.studio.client.common.presentation.model.SlideNavigationItem; import com.google.gwt.core.client.JsArray; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.ui.MenuItem; public class SlideNavigationPresenter implements SlideNavigationChangedEvent.Handler, SlideIndexChangedEvent.Handler { public interface Display { void navigate(int index); void editCurrentSlide(); SlideNavigationMenu getNavigationMenu(); HandlerRegistration addSlideNavigationChangedHandler( SlideNavigationChangedEvent.Handler handler); HandlerRegistration addSlideIndexChangedHandler( SlideIndexChangedEvent.Handler handler); } public SlideNavigationPresenter(Display view) { view_ = view; view_.addSlideNavigationChangedHandler(this); view_.addSlideIndexChangedHandler(this); view_.getNavigationMenu().getHomeButton().addClickHandler( new ClickHandler() { @Override public void onClick(ClickEvent event) { view_.navigate(0); } }); view_.getNavigationMenu().getEditButton().addClickHandler( new ClickHandler() { @Override public void onClick(ClickEvent event) { view_.editCurrentSlide(); } }); } @Override public void onSlideNavigationChanged(SlideNavigationChangedEvent event) { slideNavigation_ = event.getNavigation(); SlideNavigationMenu navigationMenu = view_.getNavigationMenu(); navigationMenu.clear(); if (slideNavigation_ != null) { JsArray<SlideNavigationItem> items = slideNavigation_.getItems(); for (int i=0; i<items.length(); i++) { // get slide final SlideNavigationItem item = items.get(i); // build html SafeHtmlBuilder menuHtml = new SafeHtmlBuilder(); for (int j=0; j<item.getIndent(); j++) menuHtml.appendHtmlConstant("   "); menuHtml.appendEscaped(item.getTitle()); navigationMenu.addItem(new MenuItem(menuHtml.toSafeHtml(), new Command() { @Override public void execute() { view_.navigate(item.getIndex()); } })); } navigationMenu.setVisible(true); navigationMenu.setDropDownVisible( slideNavigation_.getItems().length() > 1); } else { navigationMenu.setVisible(false); } } @Override public void onSlideIndexChanged(SlideIndexChangedEvent event) { // find the first navigation item that is <= to the index int index = event.getIndex(); if (slideNavigation_ != null) { JsArray<SlideNavigationItem> items = slideNavigation_.getItems(); for (int i=(items.length()-1); i>=0; i--) { if (items.get(i).getIndex() <= index) { String caption = items.get(i).getTitle(); caption += " (" + (index+1) + "/" + slideNavigation_.getTotalSlides() + ")"; view_.getNavigationMenu().setCaption(caption); break; } } } } private final Display view_; private SlideNavigation slideNavigation_ = null; }