001    package org.apache.myfaces.tobago.component;
002    
003    /*
004     * Licensed to the Apache Software Foundation (ASF) under one or more
005     * contributor license agreements.  See the NOTICE file distributed with
006     * this work for additional information regarding copyright ownership.
007     * The ASF licenses this file to You under the Apache License, Version 2.0
008     * (the "License"); you may not use this file except in compliance with
009     * the License.  You may obtain a copy of the License at
010     *
011     *      http://www.apache.org/licenses/LICENSE-2.0
012     *
013     * Unless required by applicable law or agreed to in writing, software
014     * distributed under the License is distributed on an "AS IS" BASIS,
015     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016     * See the License for the specific language governing permissions and
017     * limitations under the License.
018     */
019    
020    import org.apache.commons.logging.Log;
021    import org.apache.commons.logging.LogFactory;
022    import org.apache.myfaces.tobago.event.PageActionEvent;
023    import static org.apache.myfaces.tobago.TobagoConstants.ATTR_FIRST;
024    
025    import javax.faces.context.FacesContext;
026    import javax.faces.el.EvaluationException;
027    import javax.faces.el.MethodBinding;
028    import javax.faces.el.MethodNotFoundException;
029    import javax.faces.el.ValueBinding;
030    
031    public class Pager extends MethodBinding {
032    
033      private static final Log LOG = LogFactory.getLog(Pager.class);
034    
035      public Class getType(FacesContext facescontext)
036          throws MethodNotFoundException {
037        return String.class;
038      }
039    
040      public Object invoke(FacesContext facesContext, Object[] aobj)
041          throws EvaluationException {
042        if (aobj[0] instanceof PageActionEvent) {
043          PageActionEvent pageEvent = (PageActionEvent) aobj[0];
044    
045          UIData sheet = pageEvent.getSheet();
046          int first = -1;
047    
048          if (LOG.isDebugEnabled()) {
049            LOG.debug("action = '" + pageEvent.getAction().name() + "'");
050          }
051    
052          int start;
053          switch(pageEvent.getAction()) {
054            case FIRST:
055              first = 0;
056              break;
057            case PREV:
058              start = sheet.getFirst() - sheet.getRows();
059              first = start < 0 ? 0 : start;
060              break;
061            case NEXT:
062              if (sheet.hasRowCount()) {
063                start = sheet.getFirst() + sheet.getRows();
064                first = start > sheet.getRowCount() ? sheet.getLastPageIndex() : start;
065              } else {
066                if (sheet.isAtEnd()) {
067                  first = sheet.getFirst();
068                } else {
069                  first = sheet.getFirst() + sheet.getRows();
070                }
071              }
072              break;
073            case LAST:
074              first = sheet.getLastPageIndex();
075              break;
076            case TO_ROW:
077              start = pageEvent.getValue() -1;
078              if (start > sheet.getLastPageIndex()) {
079                start = sheet.getLastPageIndex();
080              } else if (start < 0) {
081                start = 0;
082              }
083              first = start;
084              break;
085            case TO_PAGE:
086              start = pageEvent.getValue() -1;
087              if (LOG.isDebugEnabled()) {
088                LOG.debug("start = " + start + "  sheet.getRows() = "
089                    + sheet.getRows() + " => start = " + (start * sheet.getRows()));
090              }
091              start = start * sheet.getRows();
092              if (start > sheet.getLastPageIndex()) {
093                start = sheet.getLastPageIndex();
094              } else if (start < 0) {
095                start = 0;
096              }
097              first = start;
098              break;
099            default:
100              // can't happen
101          }
102          ValueBinding valueBinding = sheet.getValueBinding(ATTR_FIRST);
103          if (valueBinding != null) {
104            valueBinding.setValue(facesContext, first);
105          } else {
106            sheet.setFirst(first);
107          }
108    
109          sheet.getSheetState(facesContext).setFirst(first);
110    //      sheet.queueEvent(new SheetStateChangeEvent(sheet));
111        } else {
112          if (LOG.isDebugEnabled()) {
113            LOG.debug("aobj[0] instanceof '" + aobj[0] + "'");
114          }
115        }
116    
117        return null;
118      }
119    }
120