Package com.google.livingstories.client.ui

Source Code of com.google.livingstories.client.ui.Slideshow

/**
* Copyright 2010 Google Inc.
*
* 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 com.google.livingstories.client.ui;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.PopupPanel.PositionCallback;
import com.google.livingstories.client.AssetContentItem;
import com.google.livingstories.client.lsp.event.EventBus;
import com.google.livingstories.client.lsp.event.PopupImageLoadedEvent;
import com.google.livingstories.client.lsp.views.contentitems.ImagePopupView;
import com.google.livingstories.client.util.Constants;
import com.google.livingstories.client.util.LivingStoryControls;

import java.util.List;

/**
* Simple slideshow widget.
*/
public class Slideshow {
  private static final int WINDOW_PADDING = 200;
 
  private AutoHidePopupPanel popup;
  private AutoHidePopupPanel filmstripPopup;
  private Filmstrip filmstrip;
  private VerticalPanel contentPanel;
  private SimplePanel imagePanel;
 
  private List<AssetContentItem> allImages;
  private HandlerRegistration popupImageLoadedHandler;

  public Slideshow(List<AssetContentItem> images) {
    allImages = images;
   
    Image closeButton = new Image(Constants.CLOSE_IMAGE_URL);
    closeButton.addClickHandler(new ClickHandler() {
      public void onClick(ClickEvent e) {
        hide();
      }
    });
   
    HorizontalPanel controlsPanel = new HorizontalPanel();
    controlsPanel.setWidth("100%");
    controlsPanel.add(closeButton);
    controlsPanel.setCellHorizontalAlignment(closeButton, HorizontalPanel.ALIGN_RIGHT);
   
    imagePanel = new SimplePanel();
   
    // Note that this needs to be a VerticalPanel, which is backed by a table,
    // rather than a flow panel, which is backed by a div.  Otherwise, the
    // width is unconstrained in chrome and the popup takes up the whole
    // width of the screen.
    contentPanel = new VerticalPanel();
    contentPanel.add(controlsPanel);
    contentPanel.add(imagePanel);
   
    popup = new AutoHidePopupPanel(true);
    popup.add(contentPanel);
    popup.addCloseHandler(new CloseHandler<PopupPanel>() {
      @Override
      public void onClose(CloseEvent<PopupPanel> event) {
        hide();
      }
    });
   
    filmstrip = new Filmstrip() {
      @Override
      public void onNavigate(int newIndex) {
        displayImage(newIndex);
      }
    };
    filmstrip.loadImages(allImages);

    filmstripPopup = new AutoHidePopupPanel(true);
    filmstripPopup.add(filmstrip);
   
    popup.addAutoHidePartner(filmstripPopup.getElement());
    filmstripPopup.addAutoHidePartner(popup.getElement());
  }
  
  public void show(int startIndex) {
    LivingStoryControls.showGlass(true);
    filmstrip.startHandlingKeys();
    filmstrip.navigate(startIndex);
   
    if (popupImageLoadedHandler != null) {
      popupImageLoadedHandler.removeHandler();
    }
    popupImageLoadedHandler = EventBus.INSTANCE.addHandler(PopupImageLoadedEvent.TYPE,
        new PopupImageLoadedEvent.Handler() {
          public void onImageLoaded(PopupImageLoadedEvent e) {
            // Reposition the popup/filmstrip to take image size changes, window size changes,
            // and scrolling into account.
            showPopup();
            showFilmstrip();
          }
        });
  }
 
  public void hide() {
    filmstrip.stopHandlingKeys();
    LivingStoryControls.showGlass(false);
    popup.hide();
    filmstripPopup.hide();
    if (popupImageLoadedHandler != null) {
      popupImageLoadedHandler.removeHandler();
      popupImageLoadedHandler = null;
    }
  }

  private void displayImage(int index) {
    final AssetContentItem currentImage = allImages.get(index);
    imagePanel.setWidget(new ImagePopupView(currentImage));
    // Reposition the popup/filmstrip to take image size changes, window size changes,
    // and scrolling into account.
    showPopup();
    showFilmstrip();
  }
 
  private void showFilmstrip() {
    if (allImages.size() > 1) {
      filmstripPopup.setPopupPositionAndShow(new PositionCallback() {
        @Override
        public void setPosition(int offsetWidth, int offsetHeight) {
          filmstripPopup.setPopupPosition(
              Window.getScrollLeft() + (Window.getClientWidth() - offsetWidth) / 2,
              Window.getScrollTop() + (Window.getClientHeight() - offsetHeight));
        }
      });
    }
  }
 
  private void showPopup() {
    popup.setPopupPositionAndShow(new PositionCallback() {
      @Override
      public void setPosition(int offsetWidth, int offsetHeight) {
        popup.setPopupPosition(
            Window.getScrollLeft() + (Window.getClientWidth() - offsetWidth) / 2,
            Window.getScrollTop() + (Window.getClientHeight() - offsetHeight) / 2
                - WINDOW_PADDING / 4);
      }     
    });
  }
}
TOP

Related Classes of com.google.livingstories.client.ui.Slideshow

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.