org.unitime.timetable.gwt.client.Client.java Source code

Java tutorial

Introduction

Here is the source code for org.unitime.timetable.gwt.client.Client.java

Source

/*
 * Licensed to The Apereo Foundation under one or more contributor license
 * agreements. See the NOTICE file distributed with this work for
 * additional information regarding copyright ownership.
 *
 * The Apereo Foundation licenses this file to you 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 org.unitime.timetable.gwt.client;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.unitime.timetable.gwt.client.page.UniTimeMenu;
import org.unitime.timetable.gwt.client.page.UniTimePageLabel;
import org.unitime.timetable.gwt.client.widgets.LoadingWidget;
import org.unitime.timetable.gwt.resources.GwtConstants;
import org.unitime.timetable.gwt.resources.GwtMessages;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.GWT.UncaughtExceptionHandler;
import com.google.gwt.core.client.RunAsyncCallback;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NodeList;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;

/**
 * @author Tomas Muller
 */
public class Client implements EntryPoint {
    protected static final GwtMessages MESSAGES = GWT.create(GwtMessages.class);
    public static final GwtConstants CONSTANTS = GWT.create(GwtConstants.class);
    public static List<GwtPageChangedHandler> iGwtPageChangedHandlers = new ArrayList<GwtPageChangedHandler>();
    public static Logger sLogger = Logger.getLogger(Client.class.getName());

    public void onModuleLoad() {
        GWT.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
            @Override
            public void onUncaughtException(Throwable e) {
                Throwable u = ToolBox.unwrap(e);
                sLogger.log(Level.WARNING, MESSAGES.failedUncaughtException(u.getMessage()), u);
            }
        });
        Scheduler.get().scheduleDeferred(new ScheduledCommand() {
            @Override
            public void execute() {
                onModuleLoadDeferred();
            }
        });
    }

    public void onModuleLoadDeferred() {
        // register triggers
        GWT.runAsync(new RunAsyncCallback() {
            @Override
            public void onSuccess() {
                for (Triggers t : Triggers.values())
                    t.register();
                callGwtOnLoadIfExists();
            }

            @Override
            public void onFailure(Throwable reason) {
            }
        });

        // load page
        if (RootPanel.get("UniTimeGWT:Body") != null) {
            LoadingWidget.getInstance().show(MESSAGES.waitLoadingPage());
            Scheduler.get().scheduleDeferred(new ScheduledCommand() {
                @Override
                public void execute() {
                    initPageAsync(Window.Location.getParameter("page"));
                }
            });
        }

        // load components
        for (final Components c : Components.values()) {
            final RootPanel p = RootPanel.get(c.id());
            if (p != null) {
                Scheduler.get().scheduleDeferred(new ScheduledCommand() {
                    @Override
                    public void execute() {
                        initComponentAsync(p, c);
                    }
                });
            }
            if (p == null && c.isMultiple()) {
                NodeList<Element> x = getElementsByName(c.id());
                if (x != null && x.getLength() > 0)
                    for (int i = 0; i < x.getLength(); i++) {
                        Element e = x.getItem(i);
                        e.setId(DOM.createUniqueId());
                        final RootPanel q = RootPanel.get(e.getId());
                        Scheduler.get().scheduleDeferred(new ScheduledCommand() {
                            @Override
                            public void execute() {
                                initComponentAsync(q, c);
                            }
                        });
                    }
            }
        }
    }

    public void initPageAsync(final String page) {
        GWT.runAsync(new RunAsyncCallback() {
            public void onSuccess() {
                init(page);
                LoadingWidget.getInstance().hide();
            }

            public void onFailure(Throwable reason) {
                Label error = new Label(MESSAGES.failedToLoadPage(reason.getMessage()));
                error.setStyleName("unitime-ErrorMessage");
                RootPanel loading = RootPanel.get("UniTimeGWT:Loading");
                if (loading != null)
                    loading.setVisible(false);
                RootPanel.get("UniTimeGWT:Body").add(error);
                LoadingWidget.getInstance().hide();
            }
        });
    }

    public void init(String page) {
        try {
            RootPanel loading = RootPanel.get("UniTimeGWT:Loading");
            if (loading != null)
                loading.setVisible(false);
            for (Pages p : Pages.values()) {
                if (p.name().equals(page)) {
                    LoadingWidget.getInstance().setMessage(MESSAGES.waitLoading(p.name(MESSAGES)));
                    UniTimePageLabel.getInstance().setPageName(p.name(MESSAGES));
                    Window.setTitle("UniTime " + CONSTANTS.version() + "| " + p.name(MESSAGES));
                    RootPanel.get("UniTimeGWT:Body").add(p.widget());
                    return;
                }
            }
            Label error = new Label(page == null ? MESSAGES.failedToLoadPageNotProvided()
                    : MESSAGES.failedToLoadPageNotRegistered(page));
            error.setStyleName("unitime-ErrorMessage");
            RootPanel.get("UniTimeGWT:Body").add(error);
        } catch (Exception e) {
            Label error = new Label(MESSAGES.failedToLoadPage(e.getMessage()));
            error.setStyleName("unitime-ErrorMessage");
            RootPanel.get("UniTimeGWT:Body").add(error);
        }
    }

    public void initComponentAsync(final RootPanel panel, final Components comp) {
        GWT.runAsync(new RunAsyncCallback() {
            public void onSuccess() {
                comp.insert(panel);
            }

            public void onFailure(Throwable reason) {
            }
        });
    }

    public static class GwtPageChangeEvent {

    }

    public interface GwtPageChangedHandler {
        public void onChange(GwtPageChangeEvent event);
    }

    public static void addGwtPageChangedHandler(GwtPageChangedHandler h) {
        iGwtPageChangedHandlers.add(h);
    }

    public static void fireGwtPageChanged(GwtPageChangeEvent event) {
        for (GwtPageChangedHandler h : iGwtPageChangedHandlers)
            h.onChange(event);
    }

    public static native void callGwtOnLoadIfExists()/*-{
                                                     if ($wnd.gwtOnLoad)
                                                     $wnd.gwtOnLoad();
                                                     }-*/;

    public static void reloadMenu() {
        for (final Components c : Components.values()) {
            final RootPanel p = RootPanel.get(c.id());
            if (p != null) {
                for (int i = 0; i < p.getWidgetCount(); i++)
                    if (p.getWidget(i) instanceof UniTimeMenu)
                        ((UniTimeMenu) p.getWidget(i)).reload();
            }
        }
    }

    public final native static NodeList<Element> getElementsByName(String name) /*-{
                                                                                return $doc.getElementsByName(name);
                                                                                }-*/;
}