com.google.livingstories.client.ui.Slideshow.java Source code

Java tutorial

Introduction

Here is the source code for com.google.livingstories.client.ui.Slideshow.java

Source

/**
 * 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);
            }
        });
    }
}