/*
* Copyright 2008 Eckhart Arnold (eckhart_arnold@hotmail.com).
*
* 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 de.eckhartarnold.client;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.ResizeEvent;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.Panel;
/**
* Ties together the gallery and the
* slide show.
*
* <p>The user can switch between the gallery and
* the slide show by clicking on a picture or on the "start slide show"
* button in the gallery, or by clicking on the gallery button of the
* control panel in the slide show.
*
* <p>Thus, class <code>GalleryPresentation</code> selects between two types
* of web pages, the "gallery page" and the "slide show page". The
* "slide show page" is selected when a pick image or start slide show event
* is received or when an the "slide show page" for a particular image is
* found on top of the browser history. The "gallery page" is selected
* when an <code>onClick</code> event is received
* (usually from the gallery button on the control panel) or when a gallery
* token is at top of the browser history or when none of the previous
* conditions for selecting either the "slide show page" or the "gallery page"
* holds.
*
* @author ecki
*
*/
public class GalleryPresentation extends Presentation implements GalleryListener,
ClickHandler, ValueChangeHandler<String>, SlideshowListener {
/** The gallery widget that makes up the gallery page */
protected GalleryBase gallery;
/** true, if the slideshow has been started from the gallery page; in this
* case the slideshow will return to the gallery page after finishing. */
private boolean slideshowInitiated = false;
/**
* The constructor of class <code>GalleryPresentation</code>.
*
* @param parent the parent widget of the gallery and the slide show
* respectively
* @param gallery the gallery widget
* @param layout the layout that contains the slide show
*/
public GalleryPresentation(Panel parent, GalleryBase gallery, Layout layout) {
super(parent, layout);
this.gallery = gallery;
layout.setHomeButtonListener(this);
gallery.addGalleryListener(this);
layout.slideshow.addSlideshowListener(this);
int imageNr = Presentation.parseSlideToken(History.getToken());
if (imageNr < 0) {
parent.add(gallery);
}
else onPickImage(imageNr);
History.addValueChangeHandler(this);
Debugger.consoleLog("GWTPhotoAlbum started");
}
/**
* Reports whether the gallery page is active at the moment.
* @return <code>true</code> if gallery page is active and
* <code>false</code> if the slide show page is active
*/
public boolean isGalleryActive() {
return !slideshowActive;
}
/**
* This method ought to be called in order to request a switch to
* the gallery page.
*
* @param event a click event This may also be <code>null</code>
* if the caller is not a widget object.
*/
public void onClick(ClickEvent event) {
returnToGallery();
}
/* (non-Javadoc)
* @see com.google.gwt.event.logical.shared.ValueChangeHandler#onValueChange(com.google.gwt.event.logical.shared.ValueChangeEvent)
*/
@Override
public void onValueChange(ValueChangeEvent<String> event) {
String historyToken = event.getValue();
GWT.log("GalleryPresentation.onValueChanged: "+historyToken);
if (historyToken.equals(GalleryBase.GALLERY_TOKEN)) {
if (slideshowActive) {
onClick(null);
}
} else if (slideshowActive) {
super.onValueChange(event);
} else {
int slideNr = Presentation.parseSlideToken(historyToken);
if (slideNr >= 0) {
onPickImage(slideNr);
} else {
History.back();
}
}
}
/* (non-Javadoc)
* @see de.eckhartarnold.client.GalleryListener#onPickImage(int)
*/
public void onPickImage(int imageNr) {
parent.remove(gallery);
layout.getSlideshow().show(-1);
layout.getSlideshow().showImmediately(imageNr);
activateSlideshow();
}
/* (non-Javadoc)
* @see de.eckhartarnold.client.GalleryListener#onStartSlideshow()
*/
public void onStartSlideshow() {
parent.remove(gallery);
layout.getSlideshow().show(-1);
activateSlideshow();
slideshowInitiated = true;
layout.getSlideshow().start();
}
/* (non-Javadoc)
* @see com.google.gwt.event.logical.shared.ResizeHandler#onResize(com.google.gwt.event.logical.shared.ResizeEvent)
*/
public void onResize(ResizeEvent event) {
if (isGalleryActive()) {
gallery.onResized();
} else {
super.onResize(event);
}
}
/* (non-Javadoc)
* @see de.eckhartarnold.client.SlideshowListener#onFade()
*/
public void onFade() { }
/* (non-Javadoc)
* @see de.eckhartarnold.client.SlideshowListener#onShow()
*/
public void onShow(int slideNr) { }
/* (non-Javadoc)
* @see de.eckhartarnold.client.SlideshowListener#onStart()
*/
public void onStart() { }
/* (non-Javadoc)
* @see de.eckhartarnold.client.SlideshowListener#onStop()
*/
public void onStop() {
if (layout.slideshow.getCurrentSlide() == layout.slideshow.size()-1) {
Timer timer = new Timer() {
public void run() {
if (slideshowInitiated) {
returnToGallery();
}
}
};
timer.schedule(layout.slideshow.getDuration()*120/100); // let the last image stay a little longer...
} else {
slideshowInitiated = false;
}
}
/**
* Switches back to the gallery if slideshow is active
*/
private void returnToGallery() {
if (slideshowActive) {
slideshowInitiated = false;
deactivateSlideshow();
parent.add(gallery);
}
}
}