Package org.fenixedu.academic.ui.renderers

Source Code of org.fenixedu.academic.ui.renderers.PagesRenderer

/**
* Copyright © 2002 Instituto Superior Técnico
*
* This file is part of FenixEdu Academic.
*
* FenixEdu Academic is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* FenixEdu Academic 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with FenixEdu Academic.  If not, see <http://www.gnu.org/licenses/>.
*/
package org.fenixedu.academic.ui.renderers;

import java.util.List;

import org.fenixedu.academic.dto.PageContainerBean;

import pt.ist.fenixWebFramework.rendererExtensions.converters.DomainObjectKeyConverter;
import pt.ist.fenixWebFramework.renderers.CollectionRenderer;
import pt.ist.fenixWebFramework.renderers.InputRenderer;
import pt.ist.fenixWebFramework.renderers.components.HtmlBlockContainer;
import pt.ist.fenixWebFramework.renderers.components.HtmlComponent;
import pt.ist.fenixWebFramework.renderers.components.HtmlContainer;
import pt.ist.fenixWebFramework.renderers.components.HtmlHiddenField;
import pt.ist.fenixWebFramework.renderers.components.HtmlSimpleValueComponent;
import pt.ist.fenixWebFramework.renderers.components.HtmlSubmitButton;
import pt.ist.fenixWebFramework.renderers.components.HtmlTable;
import pt.ist.fenixWebFramework.renderers.components.HtmlTableCell;
import pt.ist.fenixWebFramework.renderers.components.HtmlTableRow;
import pt.ist.fenixWebFramework.renderers.components.HtmlText;
import pt.ist.fenixWebFramework.renderers.components.controllers.HtmlSubmitButtonController;
import pt.ist.fenixWebFramework.renderers.components.state.IViewState;
import pt.ist.fenixWebFramework.renderers.components.state.ViewDestination;
import pt.ist.fenixWebFramework.renderers.contexts.PresentationContext;
import pt.ist.fenixWebFramework.renderers.layouts.Layout;
import pt.ist.fenixWebFramework.renderers.model.MetaObject;
import pt.ist.fenixWebFramework.renderers.model.MetaObjectFactory;
import pt.ist.fenixWebFramework.renderers.schemas.Schema;
import pt.ist.fenixWebFramework.renderers.utils.RenderKit;
import pt.ist.fenixWebFramework.renderers.utils.RenderMode;
import pt.ist.fenixWebFramework.renderers.utils.RenderUtils;
import pt.ist.fenixframework.DomainObject;

public class PagesRenderer extends InputRenderer {

    private String subSchema;

    private String objectsPerPage;

    private String paged;

    private boolean pagedValue = true;

    private int defaultObjectsPerPage = 100;

    private String buttonLabel;

    private boolean key = true;

    private String bundle;

    private CollectionRenderer renderer;

    private PageContainerBean pageContainerBean;

    public PagesRenderer() {
        super();
        this.renderer = new CollectionRenderer();
    }

    @Override
    public HtmlComponent render(Object object, Class type) {
        PageContainerBean bean = (PageContainerBean) object;
        setPageContainerBean(bean);

        List<? extends DomainObject> objects = getPageObjects(bean.getObjects());

        Schema schema = RenderKit.getInstance().findSchema(getSubSchema());
        MetaObject listMetaObject = MetaObjectFactory.createObject(objects, schema);

        PresentationContext context = getContext().createSubContext(listMetaObject);
        context.setRenderMode(RenderMode.OUTPUT);

        HtmlTable table = (HtmlTable) RenderKit.getInstance().renderUsing(getRenderer(), context, objects, objects.getClass());
        return decorateTable(table, objects);
    }

    private List<? extends DomainObject> getPageObjects(List<? extends DomainObject> objects) {
        if (!this.pagedValue) {
            return getPageContainerBean().getAllObjects();
        }
        return getPageContainerBean().getPageByPageSize(getDefaultObjectsPerPage());
    }

    private HtmlComponent decorateTable(HtmlTable table, List<? extends DomainObject> objects) {
        MetaObject bean = getContext().getMetaObject();

        HtmlHiddenField page = new HtmlHiddenField();
        HtmlHiddenField selected = new HtmlHiddenField();

        page.setValue(getCurrentPage());

        page.bind(bean, "page");
        selected.bind(bean, "selected");
        selected.setConverter(new DomainObjectKeyConverter());

        HtmlContainer container = new HtmlBlockContainer();
        container.addChild(page);
        container.addChild(selected);

        addPreviousNextButtons(container, page, "previous", "next");

        container.addChild(table);

        if (table.getHeader() != null) {
            for (HtmlTableRow row : table.getHeader().getRows()) {
                row.createCell("");
            }
        }

        String buttonText = getButtonText();
        int i = 0;
        for (HtmlTableRow row : table.getRows()) {
            HtmlTableCell cell = row.createCell();
            HtmlSubmitButton htmlSubmitButton = new HtmlSubmitButton();
            htmlSubmitButton.setName(getLocalName("select" + i));
            htmlSubmitButton.setText(buttonText);
            htmlSubmitButton.setController(new ButtonsController(MetaObjectFactory.createObject(objects.get(i), null), selected));
            cell.setBody(htmlSubmitButton);
            i++;
        }

        addPreviousNextButtons(container, page, "previousAfter", "nextAfter");

        return container;
    }

    private void addPreviousNextButtons(HtmlContainer container, HtmlHiddenField page, String previousName, String nextName) {
        if (this.pagedValue && getPageContainerBean().getNumberOfPages(getDefaultObjectsPerPage()) > 0) {
            if (getPageContainerBean().hasPreviousPage(getDefaultObjectsPerPage())) {
                HtmlSubmitButton previousButton = new HtmlSubmitButton();
                previousButton.setText(RenderUtils.getResourceString(getBundle(), "pages.button.previous"));
                previousButton.setName(getLocalName(previousName));
                previousButton.setController(new PreviousController(page));
                container.addChild(previousButton);
            }

            container.addChild(new HtmlText(getPageContainerBean().getPage() + " / "
                    + getPageContainerBean().getNumberOfPages(getDefaultObjectsPerPage())));

            if (getPageContainerBean().hasNextPage(getDefaultObjectsPerPage())) {
                HtmlSubmitButton nextButton = new HtmlSubmitButton();
                nextButton.setText(RenderUtils.getResourceString(getBundle(), "pages.button.next"));
                nextButton.setName(getLocalName(nextName));
                nextButton.setController(new NextController(page));
                container.addChild(nextButton);
            }
        }
    }

    private String getButtonText() {
        if (isKey()) {
            return RenderUtils.getResourceString(getBundle(), getButtonLabel());
        } else {
            return getButtonLabel();
        }
    }

    private String getLocalName(String string) {
        return getContext().getViewState().getId() + "renderers.page." + string;
    }

    public static class PreviousController extends HtmlSubmitButtonController {

        private final HtmlSimpleValueComponent component;

        public PreviousController(HtmlSimpleValueComponent component) {
            super();

            this.component = component;
        }

        @Override
        protected void buttonPressed(IViewState viewState, HtmlSubmitButton button) {
            viewState.setSkipUpdate(false);

            ViewDestination destination = viewState.getDestination("input");
            if (destination == null) {
                destination = viewState.getInputDestination();
            }

            viewState.setCurrentDestination(destination);

            Integer previous = getCurrentValue() - 1;
            this.component.setValue(previous.toString());
        }

        public int getCurrentValue() {
            String value = this.component.getValue();

            if (value == null) {
                return 0;
            } else {
                return Integer.parseInt(value);
            }
        }
    }

    public static class NextController extends HtmlSubmitButtonController {

        private final HtmlSimpleValueComponent component;

        public NextController(HtmlSimpleValueComponent component) {
            super();
            this.component = component;
        }

        @Override
        protected void buttonPressed(IViewState viewState, HtmlSubmitButton button) {
            viewState.setSkipUpdate(false);

            ViewDestination destination = viewState.getDestination("input");
            if (destination == null) {
                destination = viewState.getInputDestination();
            }

            viewState.setCurrentDestination(destination);

            Integer next = getCurrentValue() + 1;
            this.component.setValue(next.toString());
        }

        public int getCurrentValue() {
            String value = this.component.getValue();

            if (value == null) {
                return 0;
            } else {
                return Integer.parseInt(value);
            }
        }
    }

    public static class ButtonsController extends HtmlSubmitButtonController {

        private final HtmlSimpleValueComponent component;
        private final MetaObject metaObject;

        public ButtonsController(MetaObject metaObject, HtmlSimpleValueComponent component) {
            this.component = component;
            this.metaObject = metaObject;
        }

        @Override
        protected void buttonPressed(IViewState viewState, HtmlSubmitButton button) {
            viewState.setSkipUpdate(false);
            this.component.setValue(this.metaObject.getKey().toString());
        }

    }

    private String getCurrentPage() {
        MetaObject metaObject = getContext().getMetaObject();
        PageContainerBean bean = (PageContainerBean) metaObject.getObject();

        return bean.getPage() == null ? null : bean.getPage().toString();
    }

    public String getSubSchema() {
        return subSchema;
    }

    public void setSubSchema(String subSchema) {
        this.subSchema = subSchema;
    }

    private Schema translateSchema(String name) {
        return RenderKit.getInstance().findSchema(name);
    }

    @Override
    public String getClasses() {
        return this.renderer.getClasses();
    }

    @Override
    public void setClasses(String classes) {
        this.renderer.setClasses(classes);
    }

    public String getColumnClasses() {
        return this.renderer.getColumnClasses();
    }

    public void setColumnClasses(String columnClasses) {
        this.renderer.setColumnClasses(columnClasses);
    }

    public String getHeaderClasses() {
        return this.renderer.getHeaderClasses();
    }

    public void setHeaderClasses(String headerClasses) {
        this.renderer.setHeaderClasses(headerClasses);
    }

    public String getRowClasses() {
        return this.renderer.getRowClasses();
    }

    public void setRowClasses(String rowClasses) {
        this.renderer.setRowClasses(rowClasses);
    }

    @Override
    public String getStyle() {
        return this.renderer.getStyle();
    }

    @Override
    public void setStyle(String style) {
        this.renderer.setStyle(style);
    }

    public String getObjectsPerPage() {
        return objectsPerPage;
    }

    public void setObjectsPerPage(String objectsPerPage) {
        this.objectsPerPage = objectsPerPage;
        if (objectsPerPage != null && objectsPerPage.length() != 0) {
            defaultObjectsPerPage = Integer.valueOf(objectsPerPage).intValue();
        }
    }

    private int getDefaultObjectsPerPage() {
        return defaultObjectsPerPage;
    }

    @Override
    protected Layout getLayout(Object object, Class type) {
        return null;
    }

    public String getPaged() {
        return paged;
    }

    public void setPaged(String paged) {
        this.paged = paged;
        this.pagedValue = Boolean.valueOf(getPaged()).booleanValue();
    }

    public String getBundle() {
        return bundle;
    }

    public void setBundle(String bundle) {
        this.bundle = bundle;
    }

    public String getButtonLabel() {
        return buttonLabel;
    }

    public void setButtonLabel(String buttonLabel) {
        this.buttonLabel = buttonLabel;
    }

    public boolean isKey() {
        return key;
    }

    public void setKey(boolean key) {
        this.key = key;
    }

    public PageContainerBean getPageContainerBean() {
        return pageContainerBean;
    }

    public void setPageContainerBean(PageContainerBean pageContainerBean) {
        this.pageContainerBean = pageContainerBean;
    }

    public CollectionRenderer getRenderer() {
        return renderer;
    }

    public void setRenderer(CollectionRenderer renderer) {
        this.renderer = renderer;
    }

}
TOP

Related Classes of org.fenixedu.academic.ui.renderers.PagesRenderer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.