/***************************************************************************
* 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.List;
import org.apache.commons.lang.StringUtils;
import org.exoplatform.forum.ForumUtils;
import org.exoplatform.forum.service.ForumPrivateMessage;
import org.exoplatform.forum.service.UserProfile;
import org.exoplatform.forum.webui.BaseForumForm;
import org.exoplatform.forum.webui.UIForumPortlet;
import org.exoplatform.ks.common.UserHelper;
import org.exoplatform.ks.common.Utils;
import org.exoplatform.ks.common.webui.UIPopupAction;
import org.exoplatform.ks.common.webui.UIPopupContainer;
import org.exoplatform.ks.common.webui.UISelector;
import org.exoplatform.ks.common.webui.UIUserSelect;
import org.exoplatform.ks.common.webui.WebUIUtils;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.ComponentConfigs;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIPopupComponent;
import org.exoplatform.webui.core.UIPopupWindow;
import org.exoplatform.webui.core.UITree;
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;
import org.exoplatform.webui.form.UIFormInputWithActions;
import org.exoplatform.webui.form.UIFormInputWithActions.ActionData;
import org.exoplatform.webui.form.UIFormStringInput;
import org.exoplatform.webui.form.UIFormTextAreaInput;
import org.exoplatform.webui.form.validator.MandatoryValidator;
import org.exoplatform.webui.form.wysiwyg.UIFormWYSIWYGInput;
import org.exoplatform.webui.organization.account.UIUserSelector;
/**
* Created by The eXo Platform SAS
* Author : Vu Duy Tu
* tu.duy@exoplatform.com
* May 9, 2008 - 8:19:24 AM
*/
@ComponentConfigs (
{
@ComponentConfig(
lifecycle = UIFormLifecycle.class,
template = "app:/templates/forum/webui/popup/UIPrivateMessegeForm.gtmpl",
events = {
@EventConfig(listeners = UIPrivateMessageForm.AddValuesUserActionListener.class, phase=Phase.DECODE),
@EventConfig(listeners = UIPrivateMessageForm.AddUserActionListener.class, phase=Phase.DECODE),
@EventConfig(listeners = UIPrivateMessageForm.SelectTabActionListener.class, phase=Phase.DECODE),
@EventConfig(listeners = UIPrivateMessageForm.CancelActionListener.class, phase=Phase.DECODE),
@EventConfig(listeners = UIPrivateMessageForm.SendPrivateMessageActionListener.class)
}
),
@ComponentConfig(
id = "UIPMUserPopupWindow",
type = UIPopupWindow.class,
template = "system:/groovy/webui/core/UIPopupWindow.gtmpl",
events = {
@EventConfig(listeners = UIPrivateMessageForm.ClosePopupActionListener.class, name = "ClosePopup") ,
@EventConfig(listeners = UIPrivateMessageForm.AddActionListener.class, name = "Add", phase = Phase.DECODE),
@EventConfig(listeners = UIPrivateMessageForm.CloseActionListener.class, name = "Close", phase = Phase.DECODE)
}
)
}
)
public class UIPrivateMessageForm extends BaseForumForm implements UIPopupComponent, UISelector {
private String userName;
private int id = 0;
private boolean fullMessage = true;
public static final String FIELD_SENDTO_TEXTAREA = "SendTo";
public static final String FIELD_MAILTITLE_INPUT = "MailTitle";
public static final String FIELD_MAILMESSAGE_INPUT = "MailMessage";
public static final String FIELD_SENDMESSAGE_TAB = "MessageTab";
public static final String FIELD_REPLY_LABEL = "Reply";
public static final String FIELD_FORWARD_LABEL = "Forward";
public static final String USER_SELECTOR_POPUPWINDOW = "UIPMUserPopupWindow";
public UIPrivateMessageForm() throws Exception {
UIFormTextAreaInput SendTo = new UIFormTextAreaInput(FIELD_SENDTO_TEXTAREA, FIELD_SENDTO_TEXTAREA, null);
SendTo.addValidator(MandatoryValidator.class);
UIFormStringInput MailTitle = new UIFormStringInput(FIELD_MAILTITLE_INPUT, FIELD_MAILTITLE_INPUT, null);
MailTitle.addValidator(MandatoryValidator.class);
UIFormWYSIWYGInput formWYSIWYGInput = new UIFormWYSIWYGInput(FIELD_MAILMESSAGE_INPUT, FIELD_MAILMESSAGE_INPUT, ForumUtils.EMPTY_STR);
formWYSIWYGInput.addValidator(MandatoryValidator.class);
formWYSIWYGInput.setToolBarName("Basic");
formWYSIWYGInput.setFCKConfig(WebUIUtils.getFCKConfig());
UIFormInputWithActions sendMessageTab = new UIFormInputWithActions(FIELD_SENDMESSAGE_TAB);
sendMessageTab.addUIFormInput(SendTo);
sendMessageTab.addUIFormInput(MailTitle);
sendMessageTab.addUIFormInput(formWYSIWYGInput);
String[] strings = new String[] { "SelectUser", "SelectMemberShip", "SelectGroup" };
ActionData ad;
int i = 0;
List<ActionData> actions = new ArrayList<ActionData>();
for (String string : strings) {
ad = new ActionData();
if (i == 0)
ad.setActionListener("AddUser");
else
ad.setActionListener("AddValuesUser");
ad.setActionParameter(String.valueOf(i));
ad.setCssIconClass(string + "Icon");
ad.setActionName(string);
actions.add(ad);
++i;
}
sendMessageTab.setActionField(FIELD_SENDTO_TEXTAREA, actions);
addUIFormInput(sendMessageTab);
addChild(UIListInBoxPrivateMessage.class, null, null);
addChild(UIListSentPrivateMessage.class, null, null);
}
public void activate() throws Exception {
}
public void deActivate() throws Exception {
}
public void setUserProfile(UserProfile userProfile) {
this.userProfile = userProfile;
this.userName = userProfile.getUserId();
}
public void setSendtoField(String str) {
this.getUIFormTextAreaInput(FIELD_SENDTO_TEXTAREA).setValue(str);
}
public void updateSelect(String selectField, String value) throws Exception {
UIFormTextAreaInput fieldInput = getUIFormTextAreaInput(selectField);
String values = fieldInput.getValue();
fieldInput.setValue(ForumUtils.updateMultiValues(value, values));
}
private String removeCurrentUser(String s) throws Exception {
if (s.equals(userName))
return ForumUtils.EMPTY_STR;
if (s.contains(userName + ForumUtils.COMMA))
s = StringUtils.remove(s, userName + ForumUtils.COMMA);
if (s.contains(ForumUtils.COMMA + userName))
s = StringUtils.remove(s, ForumUtils.COMMA + userName);
return s;
}
@SuppressWarnings("unused")
private int getIsSelected() {
return this.id;
}
static public class SelectTabActionListener extends EventListener<UIPrivateMessageForm> {
public void execute(Event<UIPrivateMessageForm> event) throws Exception {
String id = event.getRequestContext().getRequestParameter(OBJECTID);
UIPrivateMessageForm messageForm = event.getSource();
messageForm.id = Integer.parseInt(id);
event.getRequestContext().addUIComponentToUpdateByAjax(messageForm);
}
}
static public class SendPrivateMessageActionListener extends EventListener<UIPrivateMessageForm> {
public void execute(Event<UIPrivateMessageForm> event) throws Exception {
UIPrivateMessageForm messageForm = event.getSource();
UIFormInputWithActions MessageTab = messageForm.getChildById(FIELD_SENDMESSAGE_TAB);
UIFormTextAreaInput areaInput = messageForm.getUIFormTextAreaInput(FIELD_SENDTO_TEXTAREA);
String sendTo = areaInput.getValue();
sendTo = ForumUtils.removeSpaceInString(sendTo);
sendTo = ForumUtils.removeStringResemble(sendTo);
sendTo = messageForm.removeCurrentUser(sendTo);
if (ForumUtils.isEmpty(sendTo)) {
messageForm.warning("UIPrivateMessageForm.msg.sendToCurrentUser", new String[] { messageForm.getLabel(FIELD_SENDTO_TEXTAREA) });
return;
}
String erroUser = UserHelper.checkValueUser(sendTo);
if (!ForumUtils.isEmpty(erroUser)) {
messageForm.warning("NameValidator.msg.erroUser-input", new String[] { messageForm.getLabel(FIELD_SENDTO_TEXTAREA), erroUser });
return;
}
UIFormStringInput stringInput = MessageTab.getUIStringInput(FIELD_MAILTITLE_INPUT);
String mailTitle = stringInput.getValue();
int maxText = 80;
if (mailTitle.length() > maxText) {
messageForm.warning("NameValidator.msg.warning-long-text", new String[] { messageForm.getLabel(FIELD_MAILTITLE_INPUT), String.valueOf(maxText) });
return;
}
mailTitle = Utils.encodeSpecialCharInTitle(mailTitle);
UIFormWYSIWYGInput formWYSIWYGInput = MessageTab.getChild(UIFormWYSIWYGInput.class);
String message = formWYSIWYGInput.getValue();
if (!ForumUtils.isEmpty(message)) {
ForumPrivateMessage privateMessage = new ForumPrivateMessage();
privateMessage.setFrom(messageForm.userName);
privateMessage.setSendTo(sendTo);
privateMessage.setName(mailTitle);
privateMessage.setMessage(message);
try {
messageForm.getForumService().savePrivateMessage(privateMessage);
} catch (Exception e) {
}
areaInput.setValue(ForumUtils.EMPTY_STR);
stringInput.setValue(ForumUtils.EMPTY_STR);
formWYSIWYGInput.setValue(ForumUtils.EMPTY_STR);
messageForm.info("UIPrivateMessageForm.msg.sent-successfully");
if (messageForm.fullMessage) {
messageForm.id = 1;
event.getRequestContext().addUIComponentToUpdateByAjax(messageForm.getParent());
} else {
UIForumPortlet forumPortlet = event.getSource().getAncestorOfType(UIForumPortlet.class);
forumPortlet.cancelAction();
}
} else {
messageForm.warning("NameValidator.msg.empty-input", new String[] { messageForm.getLabel(FIELD_MAILMESSAGE_INPUT) });
}
}
}
static public class AddValuesUserActionListener extends EventListener<UIPrivateMessageForm> {
public void execute(Event<UIPrivateMessageForm> event) throws Exception {
UIPrivateMessageForm messageForm = event.getSource();
String type = event.getRequestContext().getRequestParameter(OBJECTID);
if (!ForumUtils.isEmpty(type)) {
UIPopupContainer popupContainer = messageForm.getAncestorOfType(UIPopupContainer.class);
UIPopupAction popupAction = popupContainer.getChild(UIPopupAction.class);
UIUserSelect uiUserSelect = popupContainer.findFirstComponentOfType(UIUserSelect.class);
if (uiUserSelect != null) {
UIPopupWindow popupWindow = uiUserSelect.getParent();
closePopupWindow(popupWindow);
}
UIGroupSelector uiGroupSelector = popupAction.activate(UIGroupSelector.class, 600);
if (type.equals(UIGroupSelector.TYPE_MEMBERSHIP))
uiGroupSelector.setId("UIMemberShipSelector");
else if (type.equals(UIGroupSelector.TYPE_GROUP))
uiGroupSelector.setId("UIGroupSelector");
uiGroupSelector.setType(type);
uiGroupSelector.setSelectedGroups(null);
uiGroupSelector.setComponent(messageForm, new String[] { FIELD_SENDTO_TEXTAREA });
uiGroupSelector.getChild(UITree.class).setId(UIGroupSelector.TREE_GROUP_ID);
uiGroupSelector.getChild(org.exoplatform.webui.core.UIBreadcumbs.class).setId(UIGroupSelector.BREADCUMB_GROUP_ID);
event.getRequestContext().addUIComponentToUpdateByAjax(popupContainer);
}
}
}
public void setUpdate(ForumPrivateMessage privateMessage, boolean isReply) throws Exception {
UIFormInputWithActions MessageTab = this.getChildById(FIELD_SENDMESSAGE_TAB);
UIFormStringInput stringInput = MessageTab.getUIStringInput(FIELD_MAILTITLE_INPUT);
UIFormWYSIWYGInput message = MessageTab.getChild(UIFormWYSIWYGInput.class);
String content = privateMessage.getMessage();
String label = this.getLabel(FIELD_REPLY_LABEL);
String title = privateMessage.getName();
if (isReply) {
UIFormTextAreaInput areaInput = this.getUIFormTextAreaInput(FIELD_SENDTO_TEXTAREA);
areaInput.setValue(privateMessage.getFrom());
if (title.indexOf(label) < 0) {
title = label + ": " + title;
}
stringInput.setValue(title);
content = "<br/><br/><br/><div style=\"padding: 5px; border-left:solid 2px blue;\">" + content + "</div>";
message.setValue(content);
} else {
label = this.getLabel(FIELD_FORWARD_LABEL);
if (title.indexOf(label) < 0) {
title = label + ": " + title;
}
stringInput.setValue(title);
}
message.setValue(content);
this.id = 2;
}
public boolean isFullMessage() {
return fullMessage;
}
public void setFullMessage(boolean fullMessage) {
this.fullMessage = fullMessage;
}
static public class CancelActionListener extends EventListener<UIPrivateMessageForm> {
public void execute(Event<UIPrivateMessageForm> event) throws Exception {
UIForumPortlet forumPortlet = event.getSource().getAncestorOfType(UIForumPortlet.class);
forumPortlet.cancelAction();
}
}
static public class CloseActionListener extends EventListener<UIUserSelector> {
public void execute(Event<UIUserSelector> event) throws Exception {
UIUserSelector uiUserSelector = event.getSource();
UIPopupWindow popupWindow = uiUserSelector.getParent();
closePopupWindow(popupWindow);
}
}
static public class ClosePopupActionListener extends EventListener<UIPopupWindow> {
public void execute(Event<UIPopupWindow> event) throws Exception {
UIPopupWindow popupWindow = event.getSource();
closePopupWindow(popupWindow);
}
}
static public class AddActionListener extends EventListener<UIUserSelect> {
public void execute(Event<UIUserSelect> event) throws Exception {
UIUserSelect uiUserSelector = event.getSource();
String values = uiUserSelector.getSelectedUsers();
UIForumPortlet forumPortlet = uiUserSelector.getAncestorOfType(UIForumPortlet.class);
UIPrivateMessageForm messageForm = forumPortlet.findFirstComponentOfType(UIPrivateMessageForm.class);
if (messageForm != null) {
messageForm.updateSelect(FIELD_SENDTO_TEXTAREA, values);
}
UIPopupWindow popupWindow = uiUserSelector.getParent();
closePopupWindow(popupWindow);
event.getRequestContext().addUIComponentToUpdateByAjax(messageForm);
}
}
static public class AddUserActionListener extends EventListener<UIPrivateMessageForm> {
public void execute(Event<UIPrivateMessageForm> event) throws Exception {
UIPrivateMessageForm messageForm = event.getSource();
UIPopupContainer uiPopupContainer = messageForm.getAncestorOfType(UIPopupContainer.class);
messageForm.showUIUserSelect(uiPopupContainer, USER_SELECTOR_POPUPWINDOW, ForumUtils.EMPTY_STR);
event.getRequestContext().addUIComponentToUpdateByAjax(uiPopupContainer);
}
}
}