it.appify.view.AppJsPageManager.java Source code

Java tutorial

Introduction

Here is the source code for it.appify.view.AppJsPageManager.java

Source

/*
 * Appify - a tiny frontend framework to build complex mobile apps.
 * 
 * Copyright (C) 2015 Luigi Bifulco Appify is free software: you can
 * redistribute it and/or modify it under the terms of the GNU General Public
 * License as published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU General Public License along with
 * this program. If not, see <http://www.gnu.org/licenses/>.
 */
package it.appify.view;

import it.appify.api.Page;
import it.appify.api.PageManager;
import it.appify.logging.ConsoleLogger;

import java.util.HashMap;
import java.util.Map;

import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.dom.client.Element;

public class AppJsPageManager implements PageManager<Element> {

    private Map<String, Page<Element>> pages;

    private String currentPage;

    private PageListener<Element> listener;

    private String menuOpened;

    public AppJsPageManager() {
        pages = new HashMap<String, Page<Element>>();
    }

    @Override
    public void showPage(String name) {
        _addPage(name);
        _showPage(name);

    }

    @Override
    public void showPage(String pageName, String transitionType) {
        _addPage(pageName);
        _showPage(pageName, transitionType);

    }

    @Override
    public Page<Element> getCurrentPage() {
        return this.pages.get(currentPage);
    }

    @Override
    public void setPageListener(PageListener<Element> pageListener) {
        this.listener = pageListener;

    }

    protected void onPageShow(Page<Element> p) {
        ConsoleLogger.getConsoleLogger().log("AppJsPageManager onPageShow: " + p.getPageId());
        currentPage = p.getPageId();
        this.pages.put(p.getPageId(), p);
        // if (p.isWasHidden()) {
        // p.reattachHandlers();
        // p.setWasHidden(false);
        // }
        if (this.listener != null) {
            this.listener.onPageShow(p);
        }
    }

    protected void onPageHide(Page<Element> p) {
        if (this.listener != null) {
            this.listener.onPageHide(p);
        }
    }

    private void onPageShowed(String name, JavaScriptObject e) {
        ConsoleLogger.getConsoleLogger().log("AppJsPageManager onPageShowed: " + name);
        Page<Element> currentPage = this.pages.get(name);
        Element el = e.cast();
        if (currentPage == null) {
            currentPage = new WebPage(el);
        } else {
            ((WebPage) currentPage).setPageElement(el);
        }
        this.pages.put("name", currentPage);
        onPageShow(currentPage);
    }

    private void onPageHidden(String name, JavaScriptObject e) {
        ConsoleLogger.getConsoleLogger().log("Page " + name + "destroyed");
        Page<Element> p = this.pages.get(name);
        this.pages.remove(name);
        onPageHide(p);
        // this.pages.get(name).setWasHidden(true);
    }

    private native void _showPage(String name, String transition)/*-{
                                                                 var that = this;
                                                                 try {
                                                                     
                                                                 $wnd.App.load(name, transition, function() {
                                                                 console.log('page loaded ' + name)
                                                                     
                                                                 });
                                                                 } catch (err) {
                                                                 console.log(err);
                                                                     
                                                                 }
                                                                 }-*/;

    private native void _showPage(String name)/*-{
                                              var that = this;
                                              try {
                                                  
                                              $wnd.App.load(name, function() {
                                              console.log('page loaded ' + name)
                                              $wnd.App._layout();
                                              console.log('layout triggered ' + name)   
                                                  
                                              });
                                              } catch (err) {
                                              console.log(err);
                                                  
                                              }
                                              }-*/;

    private void onPageCreated(String pageName, JavaScriptObject e) {
        Page<Element> currentPage = this.pages.get(pageName);
        Element el = e.cast();
        if (currentPage == null) {
            currentPage = new WebPage(el);
        } else {
            ((WebPage) currentPage).setPageElement(el);
        }
        this.pages.put("name", currentPage);
        onPageCreate(currentPage);
    }

    private void onPageLoaded(String pageName, JavaScriptObject e) {
        Page<Element> currentPage = this.pages.get(pageName);
        Element el = e.cast();
        if (currentPage == null) {
            currentPage = new WebPage(el);
        } else {
            ((WebPage) currentPage).setPageElement(el);
        }
        this.pages.put("name", currentPage);
        // onPageReady(currentPage);
    }

    protected void onPageCreate(Page<Element> page) {
        if (this.listener != null) {
            this.listener.onPageCreate(page);
        }
    }

    protected void onPageReady(Page<Element> page) {
        if (this.listener != null) {
            this.listener.onPageReady(page);
        }
    }

    private native void _addPage(final String pageName)/*-{
                                                       var that = this;
                                                       $wnd.App
                                                       .controller(
                                                       pageName,
                                                       function(page) {
                                                       that.@it.appify.view.AppJsPageManager::onPageCreated(Ljava/lang/String;Lcom/google/gwt/core/client/JavaScriptObject;)(pageName, page);
                                                       $wnd
                                                       .$(page)
                                                       .on(
                                                       'appShow',
                                                       function() {
                                                       that.@it.appify.view.AppJsPageManager::onPageShowed(Ljava/lang/String;Lcom/google/gwt/core/client/JavaScriptObject;)(pageName, page);
                                                       });
                                                       $wnd
                                                       .$(page)
                                                       .on(
                                                       'appHide',
                                                       function() {
                                                       that.@it.appify.view.AppJsPageManager::onPageHidden(Ljava/lang/String;Lcom/google/gwt/core/client/JavaScriptObject;)(pageName, page);
                                                       });
                                                           
                                                       });
                                                       }-*/;

    private native void _setDefaultTransition(String transitionName)/*-{
                                                                    $wnd.App.setDefaultTransition(transitionName);
                                                                    }-*/;

    @Override
    public void setDefaultTransition(String transitionName) {
        _setDefaultTransition(transitionName);
    }

    private native String _getMenuState()/*-{
                                         if (typeof $wnd.snapper != 'undefined') {
                                         return $wnd.snapper.state().state;
                                         }
                                         }-*/;

    private native void _snapCloseMenu(String viewId)/*-{
                                                     if (typeof $wnd.snapper != 'undefined') {
                                                     $wnd.snapper.close();
                                                     }
                                                     }-*/;

    private native void _snapOpenMenu(String viewId, String from)/*-{
                                                                 $wnd.snapper = new $wnd.Snap({
                                                                 element : $doc.getElementById(viewId)
                                                                 });
                                                                 //left or right
                                                                 $wnd.snapper.open(from);
                                                                 }-*/;

    @Override
    public void openContextMenu(String viewId) {
        menuOpened = viewId;
        _snapOpenMenu(viewId, "left");
    }

    @Override
    public void closeContextMenu() {
        if (menuOpened != null) {
            _snapCloseMenu(menuOpened);
            menuOpened = null;
        }
    }

    @Override
    public boolean isContextMenuOpened() {
        return _getMenuState().equals("left");
    }

}