package com.iambookmaster.client.iphone; import java.util.Iterator; import com.google.code.gwt.database.client.service.DataServiceException; import com.google.code.gwt.database.client.service.ScalarCallback; import com.google.code.gwt.database.client.service.VoidCallback; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.ErrorEvent; import com.google.gwt.event.dom.client.ErrorHandler; import com.google.gwt.event.dom.client.LoadEvent; import com.google.gwt.event.dom.client.LoadHandler; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Label; import com.iambookmaster.client.beans.Picture; import com.iambookmaster.client.iphone.common.IPhoneButton; import com.iambookmaster.client.iphone.data.IPhoneDataService; import com.iambookmaster.client.iphone.images.IPhoneImages; import com.iambookmaster.client.iphone.images.IPhoneStyles; import com.iambookmaster.client.locale.AppConstants; import com.iambookmaster.client.locale.AppLocale; import com.iambookmaster.client.locale.AppMessages; import com.iambookmaster.client.model.Model; public class IPhoneThankyouPanel { private static final AppConstants appConstants = AppLocale.getAppConstants(); private static final AppMessages appMessages = AppLocale.getAppMessages(); private static final IPhoneStyles css = IPhoneImages.INSTANCE.css(); private static final int MODE_GET_PRODUCTS = 0; private static final int MODE_GOT_PRICE = 1; private static final int MODE_DONATION = 2; private static final int MODE_THANKS = 3; protected static final int MODE_PRICE_ERROR = 4; private Model model; private IPhoneThankyouPanelListener owner; private IPhoneCanvas canvas; private ClickHandler back; private IPhoneViewListenerAdapter listener; private IPhoneDataService ds; private int mode=MODE_GET_PRODUCTS; private String priceValue; private ClickHandler donateHandler; private ScalarCallback<String> priceCallback; private VoidCallback donateCallback; private String errorMessage; private ClickHandler tryAgain; private boolean performAction; private Timer timer; private Image titleImage; private LoadHandler imageLoadHandler; private ErrorHandler imageErrorHandler; public IPhoneThankyouPanel(Model md, IPhoneDataService dbService) { this.model = md; this.ds = dbService; listener = new IPhoneViewListenerAdapter(){ @Override public void back() { } @Override public void redraw(IPhoneCanvas viewer) { draw(viewer,false,false); } @Override public void forward() { } @Override public void drawn() { if (performAction) { performAction = false; switch (mode) { case MODE_GET_PRODUCTS: ds.calculateDonate(priceCallback); break; case MODE_GOT_PRICE: break; case MODE_DONATION: ds.donate(donateCallback); break; case MODE_THANKS: break; case MODE_PRICE_ERROR: break; } } } }; imageLoadHandler = new LoadHandler() { public void onLoad(LoadEvent event) { titleImage.setVisible(true); int w = canvas.getClientWidth() - titleImage.getWidth(); if (w>20) { titleImage.getElement().getStyle().setMarginLeft((w-20)/2, Unit.PX); } else { titleImage.getElement().getStyle().setMarginLeft(0, Unit.PX); } } }; imageErrorHandler = new ErrorHandler() { public void onError(ErrorEvent event) { titleImage.setVisible(false); } }; priceCallback = new ScalarCallback<String>() { public void onFailure(DataServiceException error) { processError(error); mode = MODE_PRICE_ERROR; draw(canvas,false,false); } public void onSuccess(String result) { errorMessage = null; priceValue = result; mode = MODE_GOT_PRICE; draw(canvas,false,false); } }; donateCallback = new VoidCallback() { public void onFailure(DataServiceException error) { processError(error); mode = MODE_GOT_PRICE; draw(canvas,false,false); } public void onSuccess() { errorMessage = null; mode = MODE_THANKS; draw(canvas,false,false); } }; back = new ClickHandler() { public void onClick(ClickEvent event) { ds.cancelRequest(); timer.cancel(); owner.close(); } }; donateHandler = new ClickHandler() { public void onClick(ClickEvent event) { mode = MODE_DONATION; performAction = true; draw(canvas,false,false); } }; tryAgain = new ClickHandler() { public void onClick(ClickEvent event) { mode = MODE_GET_PRODUCTS; performAction = true; draw(canvas,true,false); } }; timer = new Timer() { Iterator<Picture> iterator=model.getPictures().iterator(); @Override public void run() { if (iterator.hasNext()==false) { iterator=model.getPictures().iterator(); } if (titleImage != null && iterator.hasNext()) { if (mode==MODE_THANKS) { //show all images titleImage.setUrl(iterator.next().getUrl()); } else { //show fillers only Picture picture; do { picture = iterator.next(); } while (picture.isFiller()==false && iterator.hasNext()); if (picture.isFiller()) { titleImage.setUrl(picture.getUrl()); } } } } }; timer.scheduleRepeating(3000); } private void processError(DataServiceException error) { switch (error.getCode()) { case -1: errorMessage = appConstants.iphoneCannotConnectAppStore(); break; case -2: errorMessage = appConstants.iphoneThankyouErrorNoItem(); break; default: errorMessage = error.getMessage(); break; } } private void draw(IPhoneCanvas canvas,boolean animate,boolean leftToRight) { this.canvas = canvas; canvas.setListener(listener); if (animate) { canvas.clearWithAnimation(leftToRight); } else { canvas.clear(); } // if (mode == MODE_THANKS) { // //thanks // } else if (mode != MODE_GOT_PRICE){ // //connection // FlowPanel panel = new FlowPanel(); // panel.setWidth("100%"); // Image image = new Image(IPhoneImages.IPHONE); // panel.add(image); // image = new Image(IPhoneImages.SERVER); // panel.add(image); // canvas.add(panel); // } Label label; label = new Label(model.getSettings().getBookTitle()); label.setStyleName(css.bookName()); canvas.add(label); label = new Label(model.getSettings().getBookAuthors()); label.setStyleName(css.bookAuthors()); canvas.add(label); switch (mode) { case MODE_GET_PRODUCTS: //getting list of products from iTunes label = new Label(appConstants.iphoneThankyouRetrievingPrice()); label.setStyleName(css.thankyouTitle()); canvas.add(label); break; case MODE_GOT_PRICE: if (errorMessage == null) { label = new Label(appConstants.iphoneThankyouGotPrice()); label.setStyleName(css.thankyouTitle()); label.addStyleName(css.thankyouBottom()); canvas.add(label); } else { //we connected to App Store but could not pay (user canceled transaction?) label = new Label(errorMessage); label.setStyleName(css.thankyouTitleError()); canvas.add(label); label = new Label(appConstants.iphoneThankyouDonateError()); label.setStyleName(css.thankyouBottom()); canvas.add(label); } addButton(canvas,appMessages.iphoneDonate(priceValue),donateHandler); break; case MODE_DONATION: //processing the donation label = new Label(appConstants.iphoneThankyouPaying()); label.setStyleName(css.thankyouTitle()); label.addStyleName(css.thankyouBottom()); canvas.add(label); break; case MODE_THANKS: //donation was successful createImage(canvas); label = new Label(appConstants.iphoneThankyouForDonation()); label.setStyleName(css.thankyouTitle()); label.addStyleName(css.thankyouBottom()); canvas.add(label); break; case MODE_PRICE_ERROR: //error connection to the server label = new Label(errorMessage); label.setStyleName(css.thankyouTitleError()); canvas.add(label); label = new Label(appConstants.iphoneThankyouDonateError()); label.setStyleName(css.thankyouBottom()); canvas.add(label); addButton(canvas, appConstants.iphoneThankyouTryAgain(),tryAgain); break; } addButton(canvas, mode==MODE_THANKS ? appConstants.iphoneBack():appConstants.iphoneThankyouCancel(),back); if (mode==MODE_PRICE_ERROR || mode==MODE_GOT_PRICE && errorMessage != null) { titleImage = null; } else { createImage(canvas); } canvas.done(); } private void createImage(IPhoneCanvas canvas) { titleImage = new Image(); titleImage.setStyleName(css.thanksTitleImage()); titleImage.addLoadHandler(imageLoadHandler); titleImage.addErrorHandler(imageErrorHandler); titleImage.setVisible(false); canvas.add(titleImage); } private void addButton(IPhoneCanvas canvas, String title, ClickHandler handler) { IPhoneButton button = new IPhoneButton(title,handler); canvas.add(button); canvas.addClickHandler(button, handler); if (canvas.isVertical()) { button.setWidth(IPhoneViewerOldBook.toPixels(canvas.getClientWidth()-30)); } } public void show(IPhoneThankyouPanelListener owner, IPhoneCanvas canvas,boolean leftToRight) { this.owner = owner; performAction = true; mode=MODE_GET_PRODUCTS; draw(canvas,true,leftToRight); } }