/*
 * Copyright (C) 2003-2007 eXo Platform SAS.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Affero General Public License
 * as published by the Free Software Foundation; either version 3
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, see<http://www.gnu.org/licenses/>.
 */
package org.exoplatform.ecm.webui.component.explorer.sidebar;

import java.util.Set;

import org.exoplatform.ecm.webui.component.explorer.UIDocumentContainer;
import org.exoplatform.ecm.webui.component.explorer.UIDocumentInfo;
import org.exoplatform.ecm.webui.component.explorer.UIDocumentWorkspace;
import org.exoplatform.ecm.webui.component.explorer.UIJCRExplorer;
import org.exoplatform.ecm.webui.component.explorer.search.UISearchResult;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIPageIterator;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;

/**
 * Created by The eXo Platform SAS
 * Author : Hoa Pham
 *          hoa.pham@exoplatform.com
 * Sep 26, 2007
 */
@ComponentConfig(
    template =  "app:/groovy/webui/component/explorer/sidebar/UITreeNodePageIterator.gtmpl",
    events = @EventConfig(listeners = UITreeNodePageIterator.ShowPageActionListener.class, csrfCheck = false )
)
public class UITreeNodePageIterator extends UIPageIterator {
  private String selectedPath_ ;

  public UITreeNodePageIterator() {
  }

  public String getSelectedPath() { return selectedPath_ ; }
  public void setSelectedPath(String path) { this.selectedPath_ = path ; }
  static  public class ShowPageActionListener extends EventListener<UITreeNodePageIterator> {
    public void execute(Event<UITreeNodePageIterator> event) throws Exception {
      UITreeNodePageIterator uiPageIterator = event.getSource() ;
      int page = Integer.parseInt(event.getRequestContext().getRequestParameter(OBJECTID)) ;
      if(uiPageIterator.getAvailablePage() < page) page = uiPageIterator.getAvailablePage();	    
      uiPageIterator.setCurrentPage(page) ;
      if(uiPageIterator.getParent() == null) return ;
      UIJCRExplorer uiExplorer = uiPageIterator.getAncestorOfType(UIJCRExplorer.class);
      event.getRequestContext().addUIComponentToUpdateByAjax(uiExplorer);
      UIDocumentWorkspace uiDocumentWorkspace = uiExplorer.findFirstComponentOfType(UIDocumentWorkspace.class) ;
      UISearchResult uiSearchResult = uiDocumentWorkspace.getChild(UISearchResult.class) ;
      if(uiSearchResult.isRendered()) return ;
      UIDocumentContainer uiDocumentContainer = uiDocumentWorkspace.getChild(UIDocumentContainer.class);
      UIDocumentInfo uiDocumentInfo = null ;
      if(uiExplorer.isShowViewFile()) {
        uiDocumentInfo = uiDocumentContainer.getChildById("UIDocumentWithTree") ;
      } else {
        Set<String> allItemByTypeFilterMap = uiExplorer.getAllItemByTypeFilterMap();
        if (allItemByTypeFilterMap.size() > 0)
          uiDocumentInfo = uiDocumentContainer.getChildById("UIDocumentWithTree");
        else
          uiDocumentInfo = uiDocumentContainer.getChildById("UIDocumentInfo");
      }

      if (uiDocumentInfo == null) return;

      String currentPath = uiExplorer.getCurrentNode().getPath();
      if(!currentPath.equalsIgnoreCase(uiPageIterator.getSelectedPath())) return ;

      UIPageIterator iterator = uiDocumentInfo.getContentPageIterator();
      if(iterator.getAvailablePage() >= page) iterator.setCurrentPage(page);

      if (uiDocumentWorkspace.isRendered() && uiDocumentContainer.isRendered() && uiDocumentInfo.isRendered()) {
        event.getRequestContext().addUIComponentToUpdateByAjax(uiDocumentInfo);
      }
    }
  }
}
