/** * 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; } }