org.sigmah.client.page.report.ReportListPageView.java Source code

Java tutorial

Introduction

Here is the source code for org.sigmah.client.page.report.ReportListPageView.java

Source

/*
 * All Sigmah code is released under the GNU General Public License v3
 * See COPYRIGHT.txt and LICENSE.txt.
 */

package org.sigmah.client.page.report;

import com.extjs.gxt.ui.client.event.BaseEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.GridEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.store.Store;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.grid.*;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.menu.Menu;
import com.extjs.gxt.ui.client.widget.menu.MenuItem;
import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.inject.Inject;
import org.sigmah.client.dispatch.Dispatcher;
import org.sigmah.client.dispatch.callback.Got;
import org.sigmah.client.dispatch.monitor.MaskingAsyncMonitor;
import org.sigmah.client.i18n.I18N;
import org.sigmah.client.icon.IconImageBundle;
import org.sigmah.client.page.common.grid.AbstractEditorGridView;
import org.sigmah.client.page.common.widget.MappingComboBox;
import org.sigmah.shared.command.GetSchema;
import org.sigmah.shared.dto.ReportDefinitionDTO;
import org.sigmah.shared.dto.SchemaDTO;
import org.sigmah.shared.dto.UserDatabaseDTO;
import org.sigmah.shared.report.model.ReportFrequency;

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

/**
 * View of the ReportList Page
 */
public class ReportListPageView extends AbstractEditorGridView<ReportDefinitionDTO, ReportListPagePresenter>
        implements ReportListPagePresenter.View {

    private MappingComboBox<Integer> dayCombo;
    private String[] weekdays;
    private NumberFormat numberFormat;
    private final Dispatcher service;

    @Inject
    public ReportListPageView(Dispatcher service) {
        super();
        this.service = service;

        setLayout(new FitLayout());
        setHeaderVisible(false);
        weekdays = LocaleInfo.getCurrentLocale().getDateTimeConstants().weekdays();
        numberFormat = NumberFormat.getFormat("0");
    }

    public void init(ReportListPagePresenter presenter, ListStore<ReportDefinitionDTO> store) {
        super.init(presenter, store);
    }

    @Override
    protected Grid<ReportDefinitionDTO> createGridAndAddToContainer(Store store) {

        EditorGrid<ReportDefinitionDTO> grid = new EditorGrid<ReportDefinitionDTO>((ListStore) store,
                createColumnModel());
        grid.addListener(Events.BeforeEdit, new Listener<GridEvent<ReportDefinitionDTO>>() {
            public void handleEvent(GridEvent<ReportDefinitionDTO> be) {
                ReportDefinitionDTO report = be.getModel();
                be.setCancelled(!(report.getFrequency() == ReportFrequency.Monthly
                        || report.getFrequency() == ReportFrequency.Weekly
                        || report.getFrequency() == ReportFrequency.Daily));
            }
        });

        GroupingView view = new GroupingView();
        view.setShowGroupedColumn(false);
        view.setForceFit(true);
        view.setGroupRenderer(new GridGroupRenderer() {
            public String render(GroupColumnData data) {
                return data.group;
            }
        });
        grid.setView(view);

        grid.setAutoExpandColumn("title");
        grid.setAutoExpandMin(250);

        grid.addListener(Events.CellDoubleClick, new Listener<GridEvent<ReportDefinitionDTO>>() {
            public void handleEvent(GridEvent<ReportDefinitionDTO> event) {
                if (event.getColIndex() == 1) {
                    presenter.onTemplateSelected(event.getModel());
                }
            }
        });

        add(grid);

        return grid;
    }

    private ColumnModel createColumnModel() {
        List<ColumnConfig> columns = new ArrayList<ColumnConfig>();

        columns.add(new ColumnConfig("databaseName", I18N.CONSTANTS.database(), 100));

        ColumnConfig name = new ColumnConfig("title", I18N.CONSTANTS.name(), 250);
        name.setRenderer(new GridCellRenderer<ReportDefinitionDTO>() {
            public Object render(ReportDefinitionDTO model, String property, ColumnData config, int rowIndex,
                    int colIndex, ListStore listStore, Grid grid) {
                return "<b>" + model.getTitle() + "</b><br>" + model.getDescription();
            }
        });
        columns.add(name);

        ColumnConfig frequency = new ColumnConfig("frequency", I18N.CONSTANTS.reportingFrequency(), 100);
        frequency.setRenderer(new GridCellRenderer<ReportDefinitionDTO>() {
            public Object render(ReportDefinitionDTO model, String property, ColumnData config, int rowIndex,
                    int colIndex, ListStore listStore, Grid grid) {
                if (model.getFrequency() == ReportFrequency.Monthly) {
                    return I18N.CONSTANTS.monthly();
                } else if (model.getFrequency() == ReportFrequency.Weekly) {
                    return I18N.CONSTANTS.weekly();
                } else if (model.getFrequency() == ReportFrequency.Daily) {
                    return I18N.CONSTANTS.daily();
                } else if (model.getFrequency() == ReportFrequency.Adhoc) {
                    return "ad hoc";
                }
                return "-";
            }
        });
        columns.add(frequency);

        ColumnConfig day = new ColumnConfig("day", I18N.CONSTANTS.day(), 100);
        day.setRenderer(new GridCellRenderer<ReportDefinitionDTO>() {
            public Object render(ReportDefinitionDTO model, String property, ColumnData config, int rowIndex,
                    int colIndex, ListStore<ReportDefinitionDTO> store, Grid<ReportDefinitionDTO> grid) {
                if (model.getFrequency() == ReportFrequency.Weekly) {
                    return model.getDay() < 7 ? weekdays[model.getDay()] : weekdays[6];
                } else if (model.getFrequency() == ReportFrequency.Monthly) {
                    return Integer.toString(model.getDay());
                } else {
                    return "";
                }
            }
        });
        columns.add(day);

        ColumnConfig subscribed = new ColumnConfig("subscribed", I18N.CONSTANTS.subscribed(), 100);
        subscribed.setRenderer(new GridCellRenderer<ReportDefinitionDTO>() {
            @Override
            public Object render(ReportDefinitionDTO model, String property, ColumnData columnData, int rowIndex,
                    int colIndex, ListStore<ReportDefinitionDTO> store, Grid<ReportDefinitionDTO> grid) {
                if (model.isSubscribed()) {
                    return I18N.CONSTANTS.yes();
                } else {
                    return "";
                }
            }
        });

        final MappingComboBox<Boolean> subCombo = new MappingComboBox();
        subCombo.add(true, I18N.CONSTANTS.yes());
        subCombo.add(false, I18N.CONSTANTS.no());

        CellEditor subEditor = new CellEditor(subCombo) {
            @Override
            public Object preProcessValue(Object o) {
                return subCombo.wrap((Boolean) o);
            }

            @Override
            public Object postProcessValue(Object o) {
                return ((MappingComboBox.Wrapper) o).getWrappedValue();
            }
        };
        subscribed.setEditor(subEditor);
        columns.add(subscribed);

        return new ColumnModel(columns);
    }

    @Override
    protected void initToolBar() {
        toolBar.addSaveSplitButton();
        toolBar.add(new SeparatorToolItem());

        final Menu dbMenu = new Menu();
        dbMenu.addListener(Events.BeforeShow, new Listener<BaseEvent>() {
            @Override
            public void handleEvent(BaseEvent be) {
                if (dbMenu.getItemCount() == 0) {
                    service.execute(new GetSchema(),
                            new MaskingAsyncMonitor(ReportListPageView.this, I18N.CONSTANTS.loading()),
                            new Got<SchemaDTO>() {

                                @Override
                                public void got(SchemaDTO result) {
                                    for (final UserDatabaseDTO db : result.getDatabases()) {
                                        MenuItem item = new MenuItem(db.getName());
                                        item.setIcon(IconImageBundle.ICONS.database());
                                        item.addListener(Events.Select, new Listener<BaseEvent>() {
                                            @Override
                                            public void handleEvent(BaseEvent be) {
                                                presenter.onNewReport(db.getId());
                                            }
                                        });
                                        dbMenu.add(item);
                                    }
                                }
                            });
                }
            }
        });

        Button newButton = new Button(I18N.CONSTANTS.newText(), IconImageBundle.ICONS.add());
        newButton.setMenu(dbMenu);
        toolBar.add(newButton);
    }

}