org.unitime.timetable.gwt.client.solver.TimetablePage.java Source code

Java tutorial

Introduction

Here is the source code for org.unitime.timetable.gwt.client.solver.TimetablePage.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.solver;

import java.util.ArrayList;
import java.util.List;

import org.unitime.timetable.gwt.client.ToolBox;
import org.unitime.timetable.gwt.client.ToolBox.Page;
import org.unitime.timetable.gwt.client.page.UniTimeNotifications;
import org.unitime.timetable.gwt.client.widgets.LoadingWidget;
import org.unitime.timetable.gwt.client.widgets.P;
import org.unitime.timetable.gwt.client.widgets.SimpleForm;
import org.unitime.timetable.gwt.client.widgets.UniTimeHeaderPanel;
import org.unitime.timetable.gwt.command.client.GwtRpcService;
import org.unitime.timetable.gwt.command.client.GwtRpcServiceAsync;
import org.unitime.timetable.gwt.resources.GwtMessages;
import org.unitime.timetable.gwt.shared.FilterInterface;
import org.unitime.timetable.gwt.shared.EventInterface.EncodeQueryRpcRequest;
import org.unitime.timetable.gwt.shared.EventInterface.EncodeQueryRpcResponse;
import org.unitime.timetable.gwt.shared.SolverInterface.PageMessage;
import org.unitime.timetable.gwt.shared.SolverInterface.PageMessageType;
import org.unitime.timetable.gwt.shared.TimetableGridInterface.TimetableGridFilterRequest;
import org.unitime.timetable.gwt.shared.TimetableGridInterface.TimetableGridFilterResponse;
import org.unitime.timetable.gwt.shared.TimetableGridInterface.TimetableGridLegend;
import org.unitime.timetable.gwt.shared.TimetableGridInterface.TimetableGridModel;
import org.unitime.timetable.gwt.shared.TimetableGridInterface.TimetableGridRequest;
import org.unitime.timetable.gwt.shared.TimetableGridInterface.TimetableGridResponse;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
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.Window;
import com.google.gwt.user.client.Window.Location;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.SimplePanel;

/**
 * @author Tomas Muller
 */
public class TimetablePage extends Composite {
    private static final GwtMessages MESSAGES = GWT.create(GwtMessages.class);
    protected static GwtRpcServiceAsync RPC = GWT.create(GwtRpcService.class);
    private PageFilter iFilter;
    private SimplePanel iRootPanel;
    private SimpleForm iPanel;
    private FilterInterface iLastFilter;
    private TimetableGridResponse iLastResponse;

    public TimetablePage() {
        iFilter = new PageFilter();
        iFilter.getHeader().setCollapsible(SolverCookie.getInstance().isTimeGridFilter());
        iFilter.getHeader().addCollapsibleHandler(new ValueChangeHandler<Boolean>() {
            @Override
            public void onValueChange(ValueChangeEvent<Boolean> event) {
                SolverCookie.getInstance().setTimeGridFilter(event.getValue());
            }
        });

        iPanel = new SimpleForm(2);
        iPanel.removeStyleName("unitime-NotPrintableBottomLine");
        iPanel.addRow(iFilter);

        iFilter.getFooter().addButton("search", MESSAGES.buttonSearch(), new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                String token = iFilter.getQuery();
                if (!History.getToken().equals(token))
                    History.newItem(token, false);
                search(null);
            }
        });
        iFilter.getFooter().setEnabled("search", false);
        iFilter.getFooter().addButton("print", MESSAGES.buttonPrint(), new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                print();
            }
        });
        iFilter.getFooter().setEnabled("print", false);
        iFilter.getFooter().addButton("export", MESSAGES.buttonExportPDF(), new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                exportData("pdf");
            }
        });
        iFilter.getFooter().setEnabled("export", false);
        iFilter.getFooter().addButton("export-xls", MESSAGES.buttonExportXLS(), new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                exportData("xls");
            }
        });
        iFilter.getFooter().setEnabled("export-xls", false);
        iRootPanel = new SimplePanel(iPanel);
        iRootPanel.addStyleName("unitime-TimetablePage");
        initWidget(iRootPanel);
        init();

        History.addValueChangeHandler(new ValueChangeHandler<String>() {
            @Override
            public void onValueChange(ValueChangeEvent<String> event) {
                iFilter.setQuery(event.getValue(), true);
                if (iPanel.getRowCount() > 1)
                    search(null);
            }
        });
    }

    protected void init() {
        iFilter.getFooter().showLoading();
        RPC.execute(new TimetableGridFilterRequest(), new AsyncCallback<TimetableGridFilterResponse>() {
            @Override
            public void onFailure(Throwable caught) {
                iFilter.getFooter().setErrorMessage(MESSAGES.failedToInitialize(caught.getMessage()));
                UniTimeNotifications.error(MESSAGES.failedToInitialize(caught.getMessage()), caught);
                ToolBox.checkAccess(caught);
            }

            @Override
            public void onSuccess(TimetableGridFilterResponse result) {
                iFilter.getFooter().clearMessage();
                iFilter.setValue(result);
                iFilter.getFooter().setEnabled("search", true);
                createTriggers();
                if (!iFilter.getHeader().isCollapsible() || "1".equals(Location.getParameter("search")))
                    search(null);
            }
        });
    }

    public static native void createTriggers()/*-{
                                              $wnd.refreshPage = function() {
                                              @org.unitime.timetable.gwt.client.solver.TimetablePage::__search()();
                                              };
                                              }-*/;

    public static void __search() {
        final int left = Window.getScrollLeft();
        final int top = Window.getScrollTop();
        TimetablePage page = (TimetablePage) RootPanel.get("UniTimeGWT:Body").getWidget(0);
        page.search(new AsyncCallback<Boolean>() {
            @Override
            public void onFailure(Throwable caught) {
            }

            @Override
            public void onSuccess(Boolean result) {
                if (result)
                    Window.scrollTo(left, top);
            }
        });
    }

    protected void search(final AsyncCallback<Boolean> callback) {
        final TimetableGridRequest request = new TimetableGridRequest();
        request.setFilter(iFilter.getValue());
        iFilter.getFooter().clearMessage();
        for (int row = iPanel.getRowCount() - 1; row > 0; row--)
            iPanel.removeRow(row);
        iFilter.getFooter().showLoading();
        iFilter.getFooter().setEnabled("search", false);
        LoadingWidget.showLoading(MESSAGES.waitLoadingData());
        RPC.execute(request, new AsyncCallback<TimetableGridResponse>() {
            @Override
            public void onFailure(Throwable caught) {
                LoadingWidget.hideLoading();
                iFilter.getFooter().setErrorMessage(MESSAGES.failedToLoadTimetableGrid(caught.getMessage()));
                UniTimeNotifications.error(MESSAGES.failedToLoadTimetableGrid(caught.getMessage()), caught);
                iFilter.getFooter().setEnabled("search", true);
                if (callback != null)
                    callback.onFailure(caught);
            }

            @Override
            public void onSuccess(TimetableGridResponse result) {
                LoadingWidget.hideLoading();
                iFilter.getFooter().clearMessage();
                populate(request.getFilter(), result);
                iFilter.getFooter().setEnabled("search", true);
                if (callback != null)
                    callback.onSuccess(!result.getModels().isEmpty());
            }
        });
    }

    protected void print() {
        List<Page> pages = new ArrayList<Page>();
        int index = 0;
        for (final TimetableGridModel model : iLastResponse.getModels()) {
            final TimetableGrid grid = new TimetableGrid(iLastFilter, model, index++, 1000,
                    iLastResponse.getWeekOffset());
            pages.add(new Page() {
                @Override
                public String getName() {
                    return model.getName();
                }

                @Override
                public String getUser() {
                    return "";
                }

                @Override
                public String getSession() {
                    return "";
                }

                @Override
                public Element getBody() {
                    return grid.getElement();
                }

            });
        }
        ToolBox.print(pages);
    }

    private void exportData(String format) {
        String query = "output=timetable." + format + iFilter.getQuery();
        RPC.execute(EncodeQueryRpcRequest.encode(query), new AsyncCallback<EncodeQueryRpcResponse>() {
            @Override
            public void onFailure(Throwable caught) {
            }

            @Override
            public void onSuccess(EncodeQueryRpcResponse result) {
                ToolBox.open(GWT.getHostPageBaseURL() + "export?q=" + result.getQuery());
            }
        });
    }

    protected void populate(FilterInterface filter, TimetableGridResponse response) {
        iLastFilter = filter;
        iLastResponse = response;
        iFilter.getFooter().setEnabled("print", false);
        iFilter.getFooter().setEnabled("export", false);
        iFilter.getFooter().setEnabled("export-xls", false);
        for (int row = iPanel.getRowCount() - 1; row > 0; row--)
            iPanel.removeRow(row);

        if (response.getModels().isEmpty()) {
            iFilter.getFooter().setMessage(MESSAGES.errorTimetableGridNoDataReturned());
            iFilter.getFooter().setEnabled("print", false);
            iFilter.getFooter().setEnabled("export", false);
            iFilter.getFooter().setEnabled("export-xls", false);
            return;
        }

        UniTimeHeaderPanel header = new UniTimeHeaderPanel(MESSAGES.sectTimetables());
        iPanel.addHeaderRow(header);

        int index = 0;
        int width = ToolBox.getClientWidth() - 20;
        P timetables = new P("timetables");
        timetables.getElement().getStyle().clearOverflow();
        for (TimetableGridModel model : response.getModels()) {
            timetables.add(new TimetableGrid(filter, model, index++, width, response.getWeekOffset()));
        }
        ScrollPanel scroll = new ScrollPanel(timetables);
        scroll.addStyleName("scroll-panel");
        iPanel.addRow(scroll);
        iFilter.getFooter().setEnabled("print", true);
        iFilter.getFooter().setEnabled("export", true);
        iFilter.getFooter().setEnabled("export-xls", true);

        if (!response.getAssignedLegend().isEmpty() || !response.getNotAssignedLegend().isEmpty()) {
            iPanel.addHeaderRow(new UniTimeHeaderPanel(MESSAGES.sectLegend()));
            P legend = new P("legend");
            if (!response.getAssignedLegend().isEmpty()) {
                P hl = new P("header-line");
                P h = new P("text");
                h.setText(MESSAGES.legendAssignedClasses());
                hl.add(h);
                legend.add(hl);
                for (TimetableGridLegend lg : response.getAssignedLegend()) {
                    P ll = new P("legend-line");
                    P b = new P("box");
                    b.getElement().getStyle().setBackgroundColor(lg.getColor());
                    P t = new P("text");
                    t.setHTML(lg.getLabel());
                    ll.add(b);
                    ll.add(t);
                    legend.add(ll);
                }
            }
            if (!response.getNotAssignedLegend().isEmpty()) {
                P hl = new P("header-line");
                P h = new P("text");
                h.setText(MESSAGES.legendFreeTimes());
                hl.add(h);
                legend.add(hl);
                for (TimetableGridLegend lg : response.getNotAssignedLegend()) {
                    P ll = new P("legend-line");
                    P b = new P("box");
                    b.getElement().getStyle().setBackgroundColor(lg.getColor());
                    P t = new P("text");
                    t.setHTML(lg.getLabel());
                    ll.add(b);
                    ll.add(t);
                    legend.add(ll);
                }
            }
            iPanel.addRow(legend);
        }

        RootPanel cpm = RootPanel.get("UniTimeGWT:CustomPageMessages");
        if (cpm != null) {
            cpm.clear();
            if (response.hasPageMessages()) {
                for (final PageMessage pm : response.getPageMessages()) {
                    P p = new P(pm.getType() == PageMessageType.ERROR ? "unitime-PageError"
                            : pm.getType() == PageMessageType.WARNING ? "unitime-PageWarn" : "unitime-PageMessage");
                    p.setHTML(pm.getMessage());
                    if (pm.hasUrl()) {
                        p.addStyleName("unitime-ClickablePageMessage");
                        p.addClickHandler(new ClickHandler() {
                            @Override
                            public void onClick(ClickEvent event) {
                                if (pm.hasUrl())
                                    ToolBox.open(GWT.getHostPageBaseURL() + pm.getUrl());
                            }
                        });
                    }
                    cpm.add(p);
                }
            }
        }
    }
}