/**
* 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.lsp.views;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Element;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.livingstories.client.AssetContentItem;
import com.google.livingstories.client.BaseContentItem;
import com.google.livingstories.client.ContentRpcService;
import com.google.livingstories.client.ContentRpcServiceAsync;
import com.google.livingstories.client.lsp.ContentItemPopupWidget;
import com.google.livingstories.client.lsp.SourcePopupWidget;
import com.google.livingstories.client.lsp.views.contentitems.PopupViewFactory;
import com.google.livingstories.client.ui.GlassPanel;
import com.google.livingstories.client.ui.Lightbox;
import com.google.livingstories.client.ui.Slideshow;
import com.google.livingstories.client.util.HistoryManager;
import com.google.livingstories.client.util.LivingStoryData;
import java.util.ArrayList;
import java.util.List;
/**
* Chrome around a living story.
*/
public class LivingStoryPage extends Composite {
private static LivingStoryPageUiBinder uiBinder = GWT.create(LivingStoryPageUiBinder.class);
interface LivingStoryPageUiBinder extends UiBinder<Widget, LivingStoryPage> {
}
private final ContentRpcServiceAsync contentService = GWT.create(ContentRpcService.class);
@UiField Image logo;
@UiField LivingStoryManagementLinks managementLinks;
@UiField SimplePanel canvas;
@UiField GlassPanel glass;
private Lightbox lightbox = new Lightbox();
private ContentItemPopupWidget contentItemPopup = new ContentItemPopupWidget();
private SourcePopupWidget sourcePopup = new SourcePopupWidget();
public LivingStoryPage() {
initWidget(uiBinder.createAndBindUi(this));
String logoLocation = LivingStoryData.getLogoLocation();
if (logoLocation != null) {
logo.setUrl(logoLocation);
}
exportMethods();
}
public Widget getCurrentPage() {
return canvas.getWidget();
}
public void goToPage(Widget page) {
Window.scrollTo(0, 0);
canvas.setWidget(page);
}
public void goToOverview() {
HistoryManager.loadMainPage();
}
public void showGlass(boolean show) {
glass.setVisible(show);
}
public void showLightbox(String title, BaseContentItem contentItem) {
lightbox.showItem(title, PopupViewFactory.createView(contentItem));
}
// pass in an int ID because JSNI doesn't work with longs.
public void showLightboxForContentItem(final String title, int contentItemId) {
// TODO: Go through ClientCaches in some way rather than going right to
// the contentService.
contentService.getContentItem((long)contentItemId, false, new AsyncCallback<BaseContentItem>() {
@Override
public void onFailure(Throwable t) {}
@Override
public void onSuccess(final BaseContentItem contentItem) {
showLightbox(title, contentItem);
}
});
}
public void showContentItemPopup(int contentItemId, final Element showRelativeTo) {
// TODO: Go through ClientCaches in some way rather than going right to
// the contentService.
contentService.getContentItem((long)contentItemId, false, new AsyncCallback<BaseContentItem>() {
public void onFailure(Throwable t) {}
public void onSuccess(BaseContentItem contentItem) {
contentItemPopup.show(contentItem, showRelativeTo);
}
});
}
public void showSourcePopup(final String description, int contentItemId,
final Element showRelativeTo) {
if (contentItemId <= 0) {
sourcePopup.show(description, null, showRelativeTo);
} else {
// TODO: Go through ClientCaches in some way rather than going right to
// the contentService.
contentService.getContentItem((long)contentItemId, false,
new AsyncCallback<BaseContentItem>() {
public void onFailure(Throwable t) {}
public void onSuccess(BaseContentItem contentItem) {
sourcePopup.show(description, contentItem, showRelativeTo);
}
});
}
}
//pass in int ids because JSNI doesn't work with longs.
public void showSlideshow(int[] contentItemIds) {
List<Long> imageIds = new ArrayList<Long>();
for (int contentItemId : contentItemIds) {
imageIds.add((long)contentItemId);
}
contentService.getContentItems(imageIds, new AsyncCallback<List<BaseContentItem>>() {
@Override
public void onFailure(Throwable t) {}
@Override
public void onSuccess(List<BaseContentItem> contentItems) {
List<AssetContentItem> images = new ArrayList<AssetContentItem>(contentItems.size());
for (BaseContentItem contentItem : contentItems) {
images.add((AssetContentItem)contentItem);
}
new Slideshow(images).show(0);
}
});
}
public native void exportMethods() /*-{
var instance = this;
$wnd.getCurrentPage = function() {
return instance.@com.google.livingstories.client.lsp.views.LivingStoryPage::getCurrentPage()
.call(instance);
};
$wnd.goToPage = function(widget) {
instance.
@com.google.livingstories.client.lsp.views.LivingStoryPage::goToPage(Lcom/google/gwt/user/client/ui/Widget;)
.call(instance, widget);
};
$wnd.goToOverview = function() {
instance.@com.google.livingstories.client.lsp.views.LivingStoryPage::goToOverview()
.call(instance);
};
$wnd.showGlass = function(show) {
instance.
@com.google.livingstories.client.lsp.views.LivingStoryPage::showGlass(Z)
.call(instance, show);
};
$wnd.showLightbox = function(title, contentItem) {
instance.
@com.google.livingstories.client.lsp.views.LivingStoryPage::showLightbox(Ljava/lang/String;Lcom/google/livingstories/client/BaseContentItem;)
.call(instance, title, contentItem);
};
$wnd.showLightboxForContentItem = function(title, contentItemId) {
instance.
@com.google.livingstories.client.lsp.views.LivingStoryPage::showLightboxForContentItem(Ljava/lang/String;I)
.call(instance, title, contentItemId);
};
$wnd.showContentItemPopup = function(contentItemId, showRelativeTo) {
instance.
@com.google.livingstories.client.lsp.views.LivingStoryPage::showContentItemPopup(ILcom/google/gwt/dom/client/Element;)
.call(instance, contentItemId, showRelativeTo);
};
$wnd.showSourcePopup = function(description, contentItemId, showRelativeTo) {
instance.
@com.google.livingstories.client.lsp.views.LivingStoryPage::showSourcePopup(Ljava/lang/String;ILcom/google/gwt/dom/client/Element;)
.call(instance, description, contentItemId, showRelativeTo);
};
$wnd.showSlideshow = function(contentItemIds) {
instance.
@com.google.livingstories.client.lsp.views.LivingStoryPage::showSlideshow([I)
.call(instance, contentItemIds);
};
}-*/;
}