/***************************************************************************
* Copyright (C) 2003-2008 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.forum.webui.popup;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.forum.ForumUtils;
import org.exoplatform.forum.service.ForumPageList;
import org.exoplatform.forum.service.ForumService;
import org.exoplatform.forum.service.JCRPageList;
import org.exoplatform.forum.service.Utils;
import org.exoplatform.forum.webui.BaseForumForm;
import org.exoplatform.forum.webui.UICategory;
import org.exoplatform.forum.webui.UIForumPageIterator;
import org.exoplatform.forum.webui.UIForumPortlet;
import org.exoplatform.forum.webui.UITopicContainer;
import org.exoplatform.forum.webui.UITopicDetail;
import org.exoplatform.portal.application.PortalRequestContext;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.web.application.ApplicationMessage;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIPopupComponent;
import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.Event.Phase;
import org.exoplatform.webui.event.EventListener;
@ComponentConfig(
lifecycle = UIFormLifecycle.class,
template = "app:/templates/forum/webui/popup/UIWatchToolsForm.gtmpl",
events = {
@EventConfig(listeners = UIWatchToolsForm.DeleteEmailActionListener.class, phase=Phase.DECODE),
@EventConfig(listeners = UIWatchToolsForm.EditEmailActionListener.class, phase=Phase.DECODE),
@EventConfig(listeners = UIWatchToolsForm.CloseActionListener.class, phase=Phase.DECODE)
}
)
public class UIWatchToolsForm extends BaseForumForm implements UIPopupComponent {
public final String WATCHTOOLS_ITERATOR = "WatchToolsPageIterator";
private String path = ForumUtils.EMPTY_STR;
private String[] emails = new String[] {};
private boolean isTopic = false;
@SuppressWarnings("unchecked")
private JCRPageList pageList;
UIForumPageIterator pageIterator;
private List<String> listEmail = new ArrayList<String>();
private Log log = ExoLogger.getLogger(UIWatchToolsForm.class);
public UIWatchToolsForm() throws Exception {
pageIterator = addChild(UIForumPageIterator.class, null, WATCHTOOLS_ITERATOR);
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public boolean getIsTopic() {
return isTopic;
}
public void setIsTopic(boolean isTopic) {
this.isTopic = isTopic;
}
public String[] getEmails() throws Exception {
emails = getListEmail().toArray(new String[] {});
return emails;
}
@SuppressWarnings("deprecation")
public void setEmails(String[] emails) {
listEmail.clear();
listEmail.addAll(Arrays.asList(emails));
pageList = new ForumPageList(6, listEmail.size());
pageList.setPageSize(6);
pageIterator = this.getChild(UIForumPageIterator.class);
pageIterator.initPage(pageList.getPageSize(), pageList.getCurrentPage(),
pageList.getAvailable(), pageList.getAvailablePage());
try {
if (pageIterator.getInfoPage().get(3) <= 1)
pageIterator.setRendered(false);
} catch (Exception e) {
log.error("\nA UIComponent could not rendered: ", e);
}
}
@SuppressWarnings("unchecked")
public List<String> getListEmail() {
int pageSelect = pageIterator.getPageSelected();
List<String> list = new ArrayList<String>();
list.addAll(this.pageList.getPageList(pageSelect, this.listEmail));
if (list.isEmpty()) {
while (list.isEmpty() && pageSelect > 1) {
list.addAll(this.pageList.getPageList(--pageSelect, this.listEmail));
pageIterator.setSelectPage(pageSelect);
}
}
return list;
}
public void setUnWatchEmail(String[] emails, String unwatchEmail) {
if (emails.length == 1) {
setEmails(emails);
} else if (emails.length > 1) {
List<String> temp = new ArrayList<String>();
for (String em : emails) {
if (!em.equals(unwatchEmail)) {
temp.add(em);
}
}
String[] tempEmails = (String[]) temp.toArray(new String[0]);
setEmails(tempEmails);
}
}
public void activate() {
}
public void deActivate() {
}
static public class DeleteEmailActionListener extends EventListener<UIWatchToolsForm> {
public void execute(Event<UIWatchToolsForm> event) throws Exception {
String email = event.getRequestContext().getRequestParameter(OBJECTID);
UIWatchToolsForm uiForm = event.getSource();
UIForumPortlet forumPortlet = uiForm.getAncestorOfType(UIForumPortlet.class);
ForumService forumService = (ForumService) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(ForumService.class);
try {
String path = uiForm.path;
forumService.removeWatch(1, path, ForumUtils.SLASH + email);
String[] strings = new String[(uiForm.listEmail.size() - 1)];
int j = 0;
for (String string : uiForm.listEmail) {
if (string.equals(email))
continue;
strings[j] = string;
++j;
}
uiForm.setEmails(strings);
if (uiForm.getIsTopic()) {
UITopicDetail topicDetail = forumPortlet.findFirstComponentOfType(UITopicDetail.class);
topicDetail.setIsEditTopic(true);
uiForm.isTopic = false;
event.getRequestContext().addUIComponentToUpdateByAjax(topicDetail);
} else if (path.indexOf(Utils.CATEGORY) < path.lastIndexOf(Utils.FORUM)) {
UITopicContainer topicContainer = forumPortlet.findFirstComponentOfType(UITopicContainer.class);
event.getRequestContext().addUIComponentToUpdateByAjax(topicContainer);
} else {
UICategory uicategory = forumPortlet.findFirstComponentOfType(UICategory.class);
uicategory.setIsEditCategory(true);
event.getRequestContext().addUIComponentToUpdateByAjax(uicategory);
}
event.getRequestContext().addUIComponentToUpdateByAjax(uiForm);
} catch (Exception e) {
event.getRequestContext()
.getUIApplication()
.addMessage(new ApplicationMessage("UIWatchToolsForm.msg.fail-delete-email", null, ApplicationMessage.WARNING));
((PortalRequestContext) event.getRequestContext().getParentAppRequestContext()).ignoreAJAXUpdateOnPortlets(true);
}
}
}
static public class EditEmailActionListener extends EventListener<UIWatchToolsForm> {
public void execute(Event<UIWatchToolsForm> event) throws Exception {
UIForumPortlet forumPortlet = event.getSource().getAncestorOfType(UIForumPortlet.class);
forumPortlet.cancelAction();
}
}
static public class CloseActionListener extends EventListener<UIWatchToolsForm> {
public void execute(Event<UIWatchToolsForm> event) throws Exception {
UIForumPortlet forumPortlet = event.getSource().getAncestorOfType(UIForumPortlet.class);
forumPortlet.cancelAction();
}
}
}