/* See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* Esri Inc. 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 com.esri.gpt.framework.jsf.components;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.component.UIComponent;
import javax.faces.component.UIComponentBase;
import javax.faces.component.UIOutput;
import javax.faces.component.html.HtmlCommandLink;
import javax.faces.component.html.HtmlForm;
import javax.faces.component.html.HtmlInputHidden;
import javax.faces.component.html.HtmlOutputLink;
import javax.faces.component.html.HtmlOutputText;
import javax.faces.component.html.HtmlPanelGrid;
import javax.faces.context.FacesContext;
import javax.faces.el.MethodBinding;
import javax.faces.el.ValueBinding;
import javax.servlet.http.HttpServletRequest;
import com.esri.gpt.control.search.SearchController;
import com.esri.gpt.framework.context.ConfigurationException;
import com.esri.gpt.framework.jsf.FacesContextBroker;
import com.esri.gpt.framework.jsf.MessageBroker;
import com.esri.gpt.framework.jsf.PageContext;
import com.esri.gpt.framework.request.PageCursor;
import com.esri.gpt.framework.util.Val;
/**
* The Class UIPagination. JSF Component class that outputs a pagination
* control
*/
public class UIPagination extends UIComponentBase {
//class variables =============================================================
/**
* The Enum ComponentMapKeys.
*/
public static enum ComponentMapKeys {
/** The action listener. */
actionListener,
/** The action. */
action,
/** The page cursor. */
pageCursor,
/** The criteria page cursor. */
criteriaCursor,
/** The max enumerated pages. */
maxEnumeratedPages,
/** The page cursor total pages. */
pageCursorTotalPages,
/** The page cursor current page. */
pageCursorCurrentPage,
/** The css prefix. */
cssPrefix,
/** The id prefix. */
idPrefix,
/** The property prefix. */
propertyPrefix,
/** The render first page link. */
renderFirstPageLink,
/** The render last page link. */
renderLastPageLink,
/** The css of first page link. */
cssFirstPageLink,
/** The css of last page link. */
cssLastPageLink,
/** The css of next page link. */
cssNextPageLink,
/** The css of prev page link. */
cssPrevPageLink,
/** The css of other enumerated page links. */
cssOtherEnumdPageLinks,
/** The css of the main panel. */
cssMainPanel,
/** The css current page enum link. */
cssCurrentPageEnumLink,
}
/**
* The Label.
*/
public static enum Label {
/** The label. */
label,
/** The label values. */
labelValueList,
/** The label position. */
labelPosition,
/** The label CSS. */
labelCSS,
/** The label when there are no results */
labelNoResults,
/** Position string for label above. */
above,
/** Position string for label below. */
below,
/** Position string for label on left side. */
leftSide,
/** Position string for label on right side. */
rightSide,
}
/**
* The Page Events.
*/
public static enum PageEvents {
goToPage
}
/**
* The Enum SaveStateKeys.
*/
private static enum SaveStateKeys {
/** The super object. */
superObject,
/** The added components. */
addedComponents,
/** The id prefix. */
idPrefix
}
/** The JSF Component type. */
public static final String COMPONENT_TYPE = "com.esri.gpt.faces.Pagination"; //$NON-NLS-1$
/** The JSF Component family. */
public static final String COMPONENT_FAMILY = COMPONENT_TYPE;
/** The variable to store in the request so as to identify
* how many UIPagination components are in the JSF page. */
private static String REQUEST_VARNAME = "PAGINATION_OBJ_"; //$NON-NLS-1$
/** The class logger *. */
private static Logger LOG = Logger
.getLogger(UIPagination.class
.getCanonicalName());
/** The message broker. */
private MessageBroker msgBroker = null;
/** The Constant JSFBEAN_SEARCH_CONTROLLER. */
private static final String JSFBEAN_SEARCH_CONTROLLER = "SearchController";
//instance variables ==========================================================
/** The id prefix. */
private String idPrefix;
/** The added components. */
private boolean addedComponents = false;
/** The ui support. */
private final UISupport uiSupport = new UISupport();
/** The page cursor for the component. */
private PageCursor pageCursor = null;
/** The actionlistener method. */
private final MethodBinding actionListenerMethod = null;
/** The action method. */
private MethodBinding actionMethod = null;
/** The propertyPrefix */
private final String propertyPrefix = null;
/** The css prefix. */
private String cssPrefix = null;
private boolean useAjax = true;
//properties ==================================================================
/**
* Sets the id prefix.
*
* @param idPrefix the new id prefix
*/
public void setIdPrefix(String idPrefix) {
this.idPrefix = idPrefix;
}
/**
* Gets the id prefix.
*
* @return the id prefix
*/
public String getIdPrefix() {
if (idPrefix != null && !"".equals(idPrefix)) { //$NON-NLS-1$
return idPrefix;
}
/*idPrefix = (String) this.getAttributes()
.get(ComponentMapKeys.idPrefix.name());
if (idPrefix != null && !"".equals(idPrefix)) {
return idPrefix;
}*/
FacesContextBroker broker = new FacesContextBroker();
HttpServletRequest req = broker.extractHttpServletRequest();
Integer index = (Integer) req.getAttribute(REQUEST_VARNAME);
if (index == null) {
index = 0;
} else {
index = index + 1;
}
req.setAttribute(REQUEST_VARNAME, index);
idPrefix = this.getId() + "_UIPagination" + index + "_"; //$NON-NLS-1$ //$NON-NLS-2$
return idPrefix;
}
private PageCursor getCriteriaPageCursor() {
PageCursor pageCursor = null;
try {
Object pageCursorObj = this.getAttributes()
.get(ComponentMapKeys.criteriaCursor.name());
pageCursorObj = ((ValueBinding) pageCursorObj)
.getValue(this.getFacesContext());
if(pageCursorObj instanceof PageCursor) {
pageCursor = (PageCursor) pageCursorObj;
} else {
throw new ConfigurationException("Search Criteria PageCursor in JSF " +
"Paginator should be an" //$NON-NLS-1$
+ "instance of " + PageCursor.class.getCanonicalName()); //$NON-NLS-1$
}
} catch (Throwable t) {
// for backward compatibility
return this.getPageCursor();
}
return pageCursor;
}
/**
* Gets the page cursor associated with this Component.
*
*
* @return the page cursor
*/
private PageCursor getPageCursor() {
/*if(this.pageCursor != null) {
return pageCursor;
}*/
//this.pageCursor = this.readController().getSearchResult().getPageCursor();
Object pageCursorObj = this.getAttributes()
.get(ComponentMapKeys.pageCursor.name());
pageCursorObj = ((ValueBinding) pageCursorObj)
.getValue(this.getFacesContext());
if(pageCursorObj instanceof PageCursor) {
pageCursor = (PageCursor) pageCursorObj;
} else {
throw new ConfigurationException("PageCursor in JSF Paginator should be an" //$NON-NLS-1$
+ "instance of " + PageCursor.class.getCanonicalName()); //$NON-NLS-1$
}
return this.pageCursor;
}
/**
* Gets the actionListener method object.
*
* @return the actionListener method object
*/
private MethodBinding getActionListenerMethod() {
if(actionListenerMethod != null) {
return actionListenerMethod;
}
if(!this.getAttributes().containsKey
(ComponentMapKeys.actionListener.name())) {
return null;
}
Object actionListener = this.getAttributes()
.get(ComponentMapKeys.actionListener.name());
if(!(actionListener instanceof MethodBinding)) {
throw new ConfigurationException("ActionListener for Pagintor should " + //$NON-NLS-1$
" be a valid method binding. Object derived = " + actionListener) ; //$NON-NLS-1$
}
return (MethodBinding) actionListener;
}
/**
* Gets the css class prefix.
*
* @return the css prefix
*/
private String getCssClassPrefix() {
if(this.cssPrefix != null ) {
return cssPrefix;
}
if(!this.getAttributes().containsKey(ComponentMapKeys.cssPrefix.name())) {
cssPrefix = ""; //$NON-NLS-1$
} else {
cssPrefix = (String)
this.getAttributes().get(ComponentMapKeys.cssPrefix.name());
}
return cssPrefix;
}
/**
* Gets the label.
*
* @return the label (never null)
*/
@SuppressWarnings("unchecked") //$NON-NLS-1$
private String getLabel() {
String propName = Label.label.name();
if(this.getPageCursor().getTotalRecordCount() <= 0) {
propName = Label.labelNoResults.name();
}
String label = null;
Object tmp = null;
if(this.getAttributes().containsKey(propName)) {
tmp = this.getAttributes().get(propName);
if(tmp instanceof ValueBinding) {
tmp = ((ValueBinding) tmp).getValue(this.getFacesContext());
}
if(tmp != null) {
label = tmp.toString();
}
}
if (label == null || "".equals(label)) { //$NON-NLS-1$
return ""; //$NON-NLS-1$
}
if(this.getPageCursor().getTotalRecordCount() <= 0) {
return label;
}
List labelVals = null;
if(this.getAttributes().containsKey(Label.labelValueList.name())) {
labelVals = (List)
this.getAttributes().get(Label.labelValueList.name());
}
if(labelVals == null || labelVals.size() <= 0) {
return label;
}
int i = 0;
for(Object tknValue : labelVals) {
if(tknValue != null && tknValue instanceof String) {
label = label.replaceAll("\\{"+ i + "\\}", //$NON-NLS-1$ //$NON-NLS-2$
tknValue.toString());
} else if (tknValue != null && tknValue instanceof ValueBinding) {
label = label.replaceAll("\\{"+ i + "\\}", //$NON-NLS-1$ //$NON-NLS-2$
((ValueBinding) tknValue).getValue(this.getFacesContext()).toString());
}
i++;
}
return label;
}
/**
* Gets the label position.
*
* @return the label position
*/
private String getLabelPosition() {
if(!this.getAttributes().containsKey(Label.labelPosition.name())) {
return Label.rightSide.name();
}
String strPos = null;
Object obj = this.getAttributes().get(Label.labelPosition.name());
if(obj instanceof String) {
strPos = obj.toString();
}
if(obj instanceof ValueBinding) {
strPos = ((ValueBinding) obj).getValue(this.getFacesContext()).toString();
}
if(strPos == null) {
return Label.rightSide.name();
}
strPos = strPos.trim();
if(strPos.equalsIgnoreCase(Label.above.name()) ||
strPos.equalsIgnoreCase(Label.below.toString()) ||
strPos.equalsIgnoreCase(Label.leftSide.name()) ||
strPos.equalsIgnoreCase(Label.rightSide.name())) {
return strPos;
}
return Label.rightSide.name();
}
/**
* Gets the action biding.
*
* @return the action biding (possibly null)
*/
@SuppressWarnings("unused") //$NON-NLS-1$
private MethodBinding getActionBinding() {
if(this.actionMethod == null) {
if(!this.getAttributes().containsKey(ComponentMapKeys.action.name())) {
return null;
}
this.actionMethod = (MethodBinding)
this.getAttributes().get(ComponentMapKeys.action.name());
}
return this.actionMethod;
}
//methods =====================================================================
/**
* Inits the components.
*/
@SuppressWarnings("unchecked") //$NON-NLS-1$
private void initComponents() {
if (addedComponents) {
return;
}
MethodBinding actionListenerMethod = this.getActionListenerMethod();
MethodBinding actionMethod = this.getActionBinding();
// Statistics tag
HtmlOutputText txtLabel = new HtmlOutputText();
txtLabel.setId(this.getIdTxtStats());
txtLabel.setValue(this.getLabel());
txtLabel.setStyleClass(Messages.getString("gpt.jsfcomponent.pageCursorStatisticsLabel")); //$NON-NLS-1$
txtLabel.setEscape(false);
String lblPosition = this.getLabelPosition();
// rz
HtmlPanelGrid mainPanel = new HtmlPanelGrid();
mainPanel.setColumns(100);
mainPanel.setId(this.getIdMainPanel());
mainPanel.setStyleClass(Messages.getString("gpt.jsfcomponent.pageCursorMainPanel")); //$NON-NLS-1$
mainPanel.setCellpadding("0"); //$NON-NLS-1$
mainPanel.setCellspacing("0"); //$NON-NLS-1$
// Add label as header if applicable
if(Label.above.name().equalsIgnoreCase(lblPosition)) {
mainPanel.getFacets().put("header", txtLabel); //$NON-NLS-1$
}
// Add label as footer if applicable
if(Label.below.name().equalsIgnoreCase(lblPosition)) {
mainPanel.getFacets().put("footer", txtLabel); //$NON-NLS-1$
}
// Add label to left side if applicable
if(Label.leftSide.name().equalsIgnoreCase(lblPosition)) {
mainPanel.getChildren().add(txtLabel);
}
// firstPage link
UIComponent link = null;
if (!useAjax) {
HtmlCommandLink commandLink = new HtmlCommandLink();
if (actionListenerMethod != null) {
commandLink.setActionListener(actionListenerMethod);
}
if (actionMethod != null) {
commandLink.setAction(actionMethod);
}
commandLink.setStyleClass(this.getCssClassFirstPage());
commandLink.setTitle(this
.getProperty("catalog.general.pageCursor.first.alt"));
link = commandLink;
} else {
HtmlOutputLink outputLink = new HtmlOutputLink();
outputLink.setStyleClass(this.getCssClassFirstPage());
outputLink.setValue("#");
outputLink.setTitle(this
.getProperty("catalog.general.pageCursor.first.alt"));
link = outputLink;
}
link.getAttributes().put(PageEvents.goToPage.name(), 1);
link.setId(this.getIdFirstPage());
HtmlOutputText linkText = new HtmlOutputText();
linkText.setId(this.getIdPrefix() + "txtFirstPage"); //$NON-NLS-1$
linkText.setValue(this.getProperty("catalog.general.pageCursor.first")); //$NON-NLS-1$
link.getChildren().add(linkText);
mainPanel.getChildren().add(link);
// previousPage link
link = null;
if (!useAjax) {
HtmlCommandLink commandLink = new HtmlCommandLink();
if (actionListenerMethod != null) {
commandLink.setActionListener(actionListenerMethod);
}
if (actionMethod != null) {
commandLink.setAction(actionMethod);
}
commandLink.setStyleClass(this.getCssClassPreviousPage());
commandLink.setTitle(this
.getProperty("catalog.general.pageCursor.previous.alt"));
link = commandLink;
} else {
HtmlOutputLink outputLink = new HtmlOutputLink();
outputLink.setValue("#");
outputLink.setStyleClass(this.getCssClassPreviousPage());
outputLink.setTitle(this
.getProperty("catalog.general.pageCursor.previous.alt"));
link = outputLink;
}
link.setId(this.getIdPreviousPage());
linkText = new HtmlOutputText();
linkText.setId(this.getIdPrefix() + "txtPreviousPage"); //$NON-NLS-1$
linkText.setValue(this.getProperty("catalog.general.pageCursor.previous")); //$NON-NLS-1$
link.getChildren().add(linkText);
mainPanel.getChildren().add(link);
// Enumerated Pages link
HtmlPanelGrid grid = new HtmlPanelGrid();
grid.setId(this.getIdEnumPagesPanel());
mainPanel.getChildren().add(grid);
grid.setCellpadding("0"); //$NON-NLS-1$
grid.setCellspacing("0"); //$NON-NLS-1$
// nextPage link
link = null;
if (!useAjax) {
HtmlCommandLink commandLink = new HtmlCommandLink();
if (actionListenerMethod != null) {
commandLink.setActionListener(actionListenerMethod);
}
if (actionMethod != null) {
commandLink.setAction(actionMethod);
}
commandLink.setStyleClass(this.getCssClassNextPage());
link = commandLink;
} else {
HtmlOutputLink outputLink = new HtmlOutputLink();
outputLink.setValue("#");
outputLink.setStyleClass(this.getCssClassNextPage());
outputLink.setTitle(this.getProperty("catalog.general.pageCursor.next.alt"));
link = outputLink;
}
link.setId(this.getIdNextPage());
linkText = new HtmlOutputText();
linkText.setId(this.getIdPrefix() + "txtNextPage"); //$NON-NLS-1$
linkText.setValue(this.getProperty("catalog.general.pageCursor.next")); //$NON-NLS-1$
link.getChildren().add(linkText);
mainPanel.getChildren().add(link);
// lastPage link
link = null;
if (!useAjax) {
HtmlCommandLink commandLink = new HtmlCommandLink();
if (actionListenerMethod != null) {
commandLink.setActionListener(actionListenerMethod);
}
if (actionMethod != null) {
commandLink.setAction(actionMethod);
}
commandLink.setStyleClass(this.getCssClassLastPage());
commandLink.setTitle(this
.getProperty("catalog.general.pageCursor.last.alt"));
link = commandLink;
} else {
HtmlOutputLink outputLink = new HtmlOutputLink();
outputLink.setValue("#");
outputLink.setStyleClass(this.getCssClassLastPage());
outputLink.setTitle(this
.getProperty("catalog.general.pageCursor.last.alt"));
link = outputLink;
}
link.setId(this.getIdLastPage());
linkText = new HtmlOutputText();
linkText.setId(this.getIdPrefix() + "txtLastPage"); //$NON-NLS-1$
linkText.setValue(this.getProperty("catalog.general.pageCursor.last")); //$NON-NLS-1$
link.getChildren().add(linkText);
mainPanel.getChildren().add(link);
HtmlInputHidden inpHidden = new HtmlInputHidden();
inpHidden.setId(this.getIdPrefix() + "pageCursorTotalRecords");
Object obj =
this.getAttributes().get(ComponentMapKeys.pageCursorTotalPages.name());
if(obj instanceof ValueBinding) {
inpHidden.setValueBinding("value", (ValueBinding)obj);
mainPanel.getChildren().add(inpHidden);
}
inpHidden = new HtmlInputHidden();
inpHidden.setId(this.getIdPrefix() + "pageCurrentPage");
obj =
this.getAttributes().get(ComponentMapKeys.pageCursorCurrentPage.name());
if(obj instanceof ValueBinding) {
inpHidden.setValueBinding("value", (ValueBinding)obj);
mainPanel.getChildren().add(inpHidden);
}
// Add label to right side if applicable
if(Label.rightSide.name().equalsIgnoreCase(lblPosition)) {
mainPanel.getChildren().add(txtLabel);
}
// enclose in form if necessary
if (uiSupport.enclosedInForm(this)) {
this.getChildren().add(mainPanel);
} else {
HtmlForm form = new HtmlForm();
form.setId(this.getIdPrefix() + "frmPagination"); //$NON-NLS-1$
form.getChildren().add(mainPanel);
this.getChildren().add(form);
}
addedComponents = true;
}
/**
* Decides which components should be rendered for the current view.
*
* @param context the context
*/
@SuppressWarnings("unchecked")
private void setRenderComponents() {
PageCursor pageCursor = this.getPageCursor();
UIComponent component = null;
// Next component
component = uiSupport.findComponent(this, this.getIdNextPage());
component.setRendered(pageCursor.getHasNextPage());
if(component.isRendered()) {
component.getAttributes().put
(PageEvents.goToPage.name(), pageCursor.getNextPage());
if(component instanceof HtmlOutputLink) {
((HtmlOutputLink)component).setOnclick(this.readJscriptOnclickPage(
pageCursor.getCurrentPage() + 1));
}
}
// Previous component
component = uiSupport.findComponent(this, this.getIdPreviousPage());
component.setRendered(pageCursor.getHasPreviousPage());
if(component.isRendered()) {
component.getAttributes().put
(PageEvents.goToPage.name(), pageCursor.getPreviousPage());
if(component instanceof HtmlOutputLink) {
((HtmlOutputLink)component).setOnclick(this.readJscriptOnclickPage(
pageCursor.getCurrentPage() - 1));
}
}
// First page component
component = uiSupport.findComponent(this, this.getIdFirstPage());
component.setRendered((pageCursor.getCurrentPage() > 1 )
&& this.getRenderFirstPageLink());
if(component instanceof HtmlOutputLink) {
((HtmlOutputLink)component).setOnclick(this.readJscriptOnclickPage(1));
}
// this.getRenderFirstPageLink();
// Last page component
component = uiSupport.findComponent(this, this.getIdLastPage());
component.setRendered(
(pageCursor.getCurrentPage() != pageCursor.getTotalPageCount())
&& (pageCursor.getTotalPageCount() > 0)
&& this.getRenderFirstPageLink());
if(component.isRendered()) {
component.getAttributes().put
(PageEvents.goToPage.name(), this.getPageCursor().getTotalPageCount());
if(component instanceof HtmlOutputLink) {
((HtmlOutputLink)component).setOnclick(this.readJscriptOnclickPage(
pageCursor.getTotalPageCount()));
}
}
// Label component
component = uiSupport.findComponent(this, this.getIdTxtStats());
((UIOutput) component).setValue(getLabel());
}
/**
* Render numbers that represent pages.
*/
@SuppressWarnings("unchecked") //$NON-NLS-1$
public void renderPageNumbers() {
UIComponent pnlEnumPages = uiSupport.findComponent(this,
this.getIdEnumPagesPanel());
if(!pnlEnumPages.isRendered()) {
return;
}
Object obj =
this.getAttributes().get(ComponentMapKeys.maxEnumeratedPages.name());
if(obj == null) {
return;
}
double numEnumPages = Val.chkInt(obj.toString(), -1);
if(numEnumPages < 2) {
LOG.warning(this.getClass().getCanonicalName() + " recieved attribute " + //$NON-NLS-1$
" maxEnumeratedPages not null but less than 2. " + //$NON-NLS-1$
" if this number is defined in your JSP page it should be" + //$NON-NLS-1$
" >= 2."); //$NON-NLS-1$
return;
}
PageCursor pageCursor = this.getPageCursor();
if(pageCursor.getTotalPageCount() <= 1) {
pnlEnumPages.getChildren().clear();
return;
}
MethodBinding pActionMethodBind = this.getActionListenerMethod();
MethodBinding actionMethod = this.getActionBinding();
int currentPage = pageCursor.getCurrentPage();
int lowNum = currentPage -
(int) Math.floor((numEnumPages / 2.0));
int highNum = currentPage
+ (int) Math.floor(numEnumPages / 2.0);
if(lowNum <= 0) {
highNum = highNum + Math.abs(lowNum) + 1;
}
if(highNum > pageCursor.getTotalPageCount() && lowNum > 1) {
lowNum = lowNum - (highNum - pageCursor.getTotalPageCount());
}
pnlEnumPages.getChildren().clear();
if(pnlEnumPages instanceof HtmlPanelGrid) {
((HtmlPanelGrid) pnlEnumPages).setColumns((int)numEnumPages);
}
UIComponent link = null;
HtmlOutputText outputText = null;
String propertyPrefix =
this.getProperty("catalog.general.pageCursor.pagesPrefix.alt"); //$NON-NLS-1$
for(int i = lowNum; i <= highNum && i <= pageCursor.getTotalPageCount(); i++) {
if(i <= 0) {
continue;
}
if (useAjax) {
link = new HtmlOutputLink();
} else {
link = new HtmlCommandLink();
}
link.setId(this.getIdEnumPageLink(i));
// commandLink.setValue(i);
if (!useAjax) {
HtmlCommandLink commandLink = (HtmlCommandLink) link;
if (pActionMethodBind != null) {
commandLink.setActionListener(pActionMethodBind);
}
if (actionMethod != null) {
commandLink.setAction(actionMethod);
}
if (i != currentPage) {
commandLink.setStyleClass(this.getCssClassOtherEnumPageLinks());
} else {
commandLink.setStyleClass(this.getCssClassCurrentEnumPageLink());
// If you change this then change decode
link.getAttributes().put(PageEvents.goToPage.name(), i);
commandLink.setTitle(propertyPrefix + " " + i);
}
} else {
HtmlOutputLink outputLink = (HtmlOutputLink) link;
if (i != currentPage) {
outputLink.setStyleClass(this.getCssClassOtherEnumPageLinks());
} else {
outputLink.setStyleClass(this.getCssClassCurrentEnumPageLink());
outputLink.setValue("#");
link.getAttributes().put(PageEvents.goToPage.name(), i);
outputLink.setTitle(propertyPrefix + " " + i);
}
outputLink.setOnclick(this.readJscriptOnclickPage(i));
}
outputText = new HtmlOutputText();
outputText.setValue(i);
outputText.setId(this.getIdPrefix() + "txtPageNum" + i); //$NON-NLS-1$
link.getChildren().add(outputText);
pnlEnumPages.getChildren().add(link);
}
}
/**
* Encode begin.
*
* @param context the context
*
* @throws IOException Signals that an I/O exception has occurred.
*
* @see javax.faces.component.UIComponentBase#encodeBegin(javax.faces.context.FacesContext)
*/
@Override
public void encodeBegin(FacesContext context) throws IOException {
super.encodeBegin(context);
if (!this.isRendered()) {
return;
}
if (LOG.isLoggable(Level.FINE)) {
LOG.fine("Beginning encoding of " + this.getClass().getCanonicalName()); //$NON-NLS-1$
}
this.initComponents();
this.setRenderComponents();
this.renderPageNumbers();
}
/**
* Encode end.
*
* @param context the context
*
* @throws IOException Signals that an I/O exception has occurred.
*
* @see javax.faces.component.UIComponentBase#encodeEnd(javax.faces.context.FacesContext)
*/
@Override
public void encodeEnd(FacesContext context) throws IOException {
if (!this.isRendered()) {
return;
}
if (LOG.isLoggable(Level.FINE)) {
LOG.fine("Ending encoding of " + this.getClass().getCanonicalName()); //$NON-NLS-1$
}
super.encodeEnd(context);
}
/**
* Restore state.
*
* @param context the context
* @param state the state
*
* @see javax.faces.component.UIComponentBase#restoreState(javax.faces.context.FacesContext,
* java.lang.Object)
*/
@SuppressWarnings("unchecked") //$NON-NLS-1$
@Override
public void restoreState(FacesContext context, Object state) {
Map map = (Map) state;
Object superObject = map.get(SaveStateKeys.superObject.name());
this.setIdPrefix((String) map.get(SaveStateKeys.idPrefix.name()));
this.addedComponents = (Boolean) map
.get(SaveStateKeys.addedComponents.name());
super.restoreState(context, superObject);
}
/**
* Save state.
*
* @param context the context
*
* @return the object
*
* @see javax.faces.component.UIComponentBase#saveState(javax.faces.context.FacesContext)
*/
@SuppressWarnings("unchecked") //$NON-NLS-1$
@Override
public Object saveState(FacesContext context) {
Object superObject = super.saveState(context);
Map map = new HashMap();
map.put(SaveStateKeys.superObject.name(), superObject);
map.put(SaveStateKeys.idPrefix.name(), this.getIdPrefix());
map.put(SaveStateKeys.addedComponents.name(), this.addedComponents);
return map;
}
/**
* Gets the family.
*
* @return The family the object belongs to.
*/
@Override
public String getFamily() {
return COMPONENT_FAMILY;
}
/**
* Gets the id main panel.
*
* @return the id main panel
*/
private String getIdMainPanel() {
return getIdPrefix() + "pnlMain"; //$NON-NLS-1$
}
/**
* Gets the id next.
*
* @return the id next
*/
private String getIdNextPage() {
return this.getIdPrefix() + "lnkNext"; //$NON-NLS-1$
}
/**
* Gets the id previous.
*
* @return the id previous
*/
private String getIdPreviousPage() {
return this.getIdPrefix() + "lnkPrevious"; //$NON-NLS-1$
}
/**
* Gets the id number panel.
*
* @return the id number panel
*/
private String getIdNumberPanel() {
return this.getIdPrefix() + "pnlNumpanel"; //$NON-NLS-1$
}
/**
* Gets the id first page.
*
* @return the id first page
*/
private String getIdFirstPage() {
return this.getIdPrefix() + "lnkFirstPage"; //$NON-NLS-1$
}
/**
* Gets the id last page.
*
* @return the id last page
*/
private String getIdLastPage() {
return this.getIdPrefix() + "lnkLastPage"; //$NON-NLS-1$
}
/**
* Gets the id of the enumerated pages panel.
*
* @return the id enumerated pages panel
*/
private String getIdEnumPagesPanel() {
return this.getIdPrefix() + "pnlEnumedPages"; //$NON-NLS-1$
}
/**
* Gets the id of the page link.
*
* @param i the page index number
*
* @return the id of the page (never null)
*/
private String getIdEnumPageLink(int i) {
return this.getIdPrefix() + "lnkEnumedPage_" + i; //$NON-NLS-1$
}
/**
* Gets the id txt stats.
*
* @return the id txt stats
*/
private String getIdTxtStats() {
return this.getIdPrefix() + "txtStats"; //$NON-NLS-1$
}
/**
* Gets the CSS of the main panel.
*
* @return the CSS class name
*/
private String getCssClassMainPanel() {
return getCssClassPrefix() + "pnlMain"; //$NON-NLS-1$
}
/**
* Gets the CSS class of the next page component.
*
* @return the CSS class name
*/
private String getCssClassNextPage() {
return this.getCssClassPrefix() +
Messages.getString("gpt.jsfcomponent.cssnextPage"); //$NON-NLS-1$
}
/**
* Gets the CSS class name of the previous component.
*
* @return the CSS class name
*/
private String getCssClassPreviousPage() {
return this.getCssClassPrefix() +
Messages.getString("gpt.jsfcomponen.cssprevPage"); //$NON-NLS-1$
}
/**
* Gets the CSS class of first page.
*
* @return the CSS class of the first page
*/
private String getCssClassFirstPage() {
return this.getCssClassPrefix()
+ Messages.getString("gpt.jsfcomponent.cssfirstPage"); //$NON-NLS-1$
}
/**
* Gets the CSS class of the last page.
*
* @return the CSS class of the last page
*/
private String getCssClassLastPage() {
return this.getCssClassPrefix() +
Messages.getString("gpt.jsfcomponent.csslastPage"); //$NON-NLS-1$
}
/**
* Gets the Css class other page links.
*
* *
* @return the CSS class of a page link
*/
private String getCssClassOtherEnumPageLinks() {
return Messages.getString("gpt.jsfcomponent.pageCursorNonCurrentPage"); //$NON-NLS-1$
}
/**
* Gets the CSS of the current page link.
*
*
* @return the CSS class of a page link
*/
private String getCssClassCurrentEnumPageLink() {
return Messages.getString("gpt.jsfcomponent.pageCursorCurrentPage"); //$NON-NLS-1$
}
/**
* Gets the render first page link.
*
* @return the render first page link (default true)
*/
@SuppressWarnings("unchecked") //$NON-NLS-1$
public boolean getRenderFirstPageLink() {
String key = ComponentMapKeys.renderFirstPageLink.name();
Map map = this.getAttributes();
if(!map.containsKey(key)) {
return true;
}
Object obj = map.get(key);
if(obj == null) {
return true;
}
return Val.chkBool(obj.toString(), true);
}
/**
* Gets the render last page link.
*
* @return the render last page link
*/
@SuppressWarnings("unchecked") //$NON-NLS-1$
public boolean getRenderLastPageLink() {
String key = ComponentMapKeys.renderLastPageLink.name();
Map map = this.getAttributes();
if(!map.containsKey(key)) {
return true;
}
Object obj = map.get(key);
if(obj == null) {
return true;
}
return Val.chkBool(obj.toString(), true);
}
/**
* Gets the property prefix.
*
* @return the property prefix (trimmed, never null)
*/
public String getPropertyPrefix() {
if(this.propertyPrefix != null) {
return this.propertyPrefix;
}
/*
Object obj = this.getAttributes().get(ComponentMapKeys.propertyPrefix);
if(obj == null) {
this.propertyPrefix = ""; //$NON-NLS-1$
}
else if(obj instanceof String) {
this.propertyPrefix = obj.toString().trim();
}
else if(obj instanceof ValueBinding) {
this.propertyPrefix =
((ValueBinding)obj).getValue(this.getFacesContext()).toString().trim();
} */
//return this.propertyPrefix;
return ""; //$NON-NLS-1$
}
/**
* Gets the property from the property file.
*
* @param property the property key
*
* @return the property
*/
private String getProperty(String property) {
String propPrefix = this.getPropertyPrefix();
if(this.msgBroker == null) {
this.msgBroker = PageContext.extractMessageBroker();
}
return this.msgBroker.getMessage(propPrefix + property).getSummary();
}
/**
* Deals with interpretating the incoming prameters to fill in
* pagination details
*
* @param context
*/
@Override
public void decode(FacesContext context) {
PageCursor cursor = this.getCriteriaPageCursor();
if(cursor == null) {
return;
}
UISupport support = new UISupport();
Map requestMap = context.getExternalContext().getRequestParameterMap();
String clientId = getClientId(context);
String prefix = this.getIdPrefix();
Iterator iter = requestMap.values().iterator();
while(iter.hasNext()) {
try {
Object obj = iter.next();
if (obj == null) {
continue;
}
String value = null;
UIComponent component = null;
HtmlCommandLink link = null;
HtmlOutputText txt = null;
value = obj.toString();
if (value.contains(clientId) && value.contains(prefix)) {
component = support.findComponent(this, value.substring(value
.indexOf(":") + 1));
}
if (!(component instanceof HtmlCommandLink )) {
continue;
}
link = (HtmlCommandLink) component;
if (link.getId().contains(this.getIdFirstPage())) {
cursor.setCurrentPage(1);
} else if (link.getId().contains(this.getIdLastPage())) {
cursor.setCurrentPage(cursor.getTotalPageCount());
} else if (link.getId().contains(this.getIdNextPage())) {
cursor.setCurrentPage(cursor.getCurrentPage() + 1);
} else if (link.getId().contains(this.getIdPreviousPage())) {
cursor.setCurrentPage(cursor.getCurrentPage() - 1);
} else {
txt = (HtmlOutputText) component.getChildren().get(0);
int page = Val.chkInt(txt.getValue().toString(), Integer.MIN_VALUE);
if (page >= 1) {
cursor.setCurrentPage(page);
}
}
} catch (Throwable e) {
LOG.log(Level.FINER, "", e);
}
}
}
private String readJscriptOnclickPage(int page) {
return "javascript:return scSetPageTo("+ page +");";
}
}