View Javadoc
1   /*
2    * Copyright (C) 2003-2011 eXo Platform SAS.
3    *
4    * This program is free software; you can redistribute it and/or
5    * modify it under the terms of the GNU Affero General Public License
6    * as published by the Free Software Foundation; either version 3
7    * of the License, or (at your option) any later version.
8    *
9    * This program is distributed in the hope that it will be useful,
10   * but WITHOUT ANY WARRANTY; without even the implied warranty of
11   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   * GNU General Public License for more details.
13   *
14   * You should have received a copy of the GNU General Public License
15   * along with this program; if not, see<http://www.gnu.org/licenses/>.
16   */
17  package org.exoplatform.ecm.webui.core;
18  
19  import java.util.Arrays;
20  
21  import org.exoplatform.commons.serialization.api.annotations.Serialized;
22  import org.exoplatform.commons.utils.PageList;
23  import org.exoplatform.webui.config.annotation.ComponentConfig;
24  import org.exoplatform.webui.config.annotation.EventConfig;
25  import org.exoplatform.webui.core.UIComponent;
26  import org.exoplatform.webui.core.UIPageIterator;
27  import org.exoplatform.webui.event.Event;
28  import org.exoplatform.webui.event.EventListener;
29  
30  /**
31   * Created by The eXo Platform SAS
32   * Author : Dang Viet Ha
33   *          hadv@exoplatform.com
34   * 19-05-2011
35   */
36  /**
37   * A component that allows pagination, with an iterator to change pages
38   *
39   */
40  @ComponentConfig(template = "classpath:groovy/ecm/webui/core/UIPageIterator.gtmpl", events = {
41      @EventConfig(listeners = UIECMPageIterator.ShowPageActionListener.class),
42      @EventConfig(listeners = UIECMPageIterator.ChangeMaxSizePageActionListener.class) })
43  @Serialized
44  public class UIECMPageIterator extends UIPageIterator {
45  
46    /**
47     * The list of pages
48     */
49    private int               itemsPerPage_      = 0;
50  
51    private int               totalItems         = 0;
52  
53    private boolean           useMaxSizeSetting_ = false;
54  
55    public static final int[] MAX_ITEMS_PER_PAGE = new int[] { 5, 10, 15, 20, 30, 60, 100 };
56  
57    private boolean justPaginated_ = false;
58  
59    public boolean isJustPaginated() { return justPaginated_; }
60  
61    public void setJustPaginated(boolean value) {
62      justPaginated_ = value;
63    }
64  
65    public UIECMPageIterator() {
66    }
67  
68    public int[] getMaxItemPerPageList() {
69      int pageSize = this.getItemsPerPage();
70      if (isPageSizeInList(pageSize)) {
71        return MAX_ITEMS_PER_PAGE;
72      } else {
73        int length = MAX_ITEMS_PER_PAGE.length + 1;
74        int[] pageSizeList = new int[length];
75        System.arraycopy(MAX_ITEMS_PER_PAGE, 0, pageSizeList, 0, MAX_ITEMS_PER_PAGE.length);
76        pageSizeList[pageSizeList.length - 1] = pageSize;
77        Arrays.sort(pageSizeList);
78        return pageSizeList;
79      }
80    }
81  
82    public int getItemsPerPage() {
83      if (itemsPerPage_ <= 0) {
84        itemsPerPage_ = 10;
85      }
86      return itemsPerPage_;
87    }
88  
89    public void setItemsPerPage(int itemsPerPage) {
90      this.itemsPerPage_ = itemsPerPage;
91    }
92  
93    public int getTotalItems() {
94      return totalItems;
95    }
96  
97    public void setTotalItems(int totalItems) {
98      this.totalItems = totalItems;
99    }
100 
101   /**
102    * @param useMaxSizeSetting_ the useMaxSizeSetting_ to set
103    */
104   public void setUseMaxSizeSetting(boolean useMaxSizeSetting_) {
105     this.useMaxSizeSetting_ = useMaxSizeSetting_;
106   }
107 
108   /**
109    * @return the useMaxSizeSetting_
110    */
111   public boolean isUseMaxSizeSetting() {
112     return useMaxSizeSetting_;
113   }
114 
115   public void setPageList(PageList pageList)
116   {
117      super.setPageList(pageList);
118      this.itemsPerPage_ = pageList.getPageSize();
119   }
120 
121   private boolean isPageSizeInList(int pageSize) {
122     for (int size : MAX_ITEMS_PER_PAGE) {
123       if (size == pageSize) {
124         return true;
125       }
126     }
127     return false;
128   }
129 
130   static public class ShowPageActionListener extends EventListener<UIECMPageIterator> {
131     public void execute(Event<UIECMPageIterator> event) throws Exception {
132       UIECMPageIterator uiPageIterator = event.getSource();
133       int page = Integer.parseInt(event.getRequestContext().getRequestParameter(OBJECTID));
134       uiPageIterator.setCurrentPage(page);
135       uiPageIterator.setJustPaginated(true);
136       UIComponent parent = uiPageIterator.getParent();
137       if (parent == null)
138         return;
139       event.getRequestContext().addUIComponentToUpdateByAjax(parent);
140       parent.broadcast(event, event.getExecutionPhase());
141     }
142   }
143 
144   static public class ChangeMaxSizePageActionListener extends EventListener<UIECMPageIterator>{
145 
146     public void execute(Event<UIECMPageIterator> event) throws Exception {
147       UIECMPageIterator uiPageIterator = event.getSource();
148       int itemsPerPage = Integer.parseInt(event.getRequestContext().getRequestParameter(OBJECTID));
149       uiPageIterator.setItemsPerPage(itemsPerPage);
150       UIComponent parent = uiPageIterator.getParent();
151       if (parent == null)
152         return;
153       if (parent instanceof UIPagingGrid ) {
154         ((UIPagingGrid)parent).refresh(uiPageIterator.getCurrentPage());
155       } else if (parent instanceof UIPagingGridDecorator) {
156         ((UIPagingGridDecorator)parent).refresh(uiPageIterator.getCurrentPage());
157       }
158       event.getRequestContext().addUIComponentToUpdateByAjax(parent);
159     }
160 
161   }
162 
163 }