/***************************************************************************
* Copyright (C) 2003-2009 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.exoplatform.container.ExoContainerContext;
import org.exoplatform.forum.ForumUtils;
import org.exoplatform.forum.bbcode.api.BBCode;
import org.exoplatform.forum.bbcode.api.BBCodeService;
import org.exoplatform.forum.bbcode.core.BBCodeRenderer;
import org.exoplatform.forum.common.CommonUtils;
import org.exoplatform.forum.webui.BaseForumForm;
import org.exoplatform.forum.webui.UIForumPortlet;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
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;
import org.exoplatform.webui.form.UIFormStringInput;
import org.exoplatform.webui.form.UIFormTextAreaInput;
import org.exoplatform.webui.form.input.UICheckBoxInput;
import org.exoplatform.webui.form.validator.MandatoryValidator;
@ComponentConfig(
lifecycle = UIFormLifecycle.class,
template = "app:/templates/forum/webui/popup/UIAddBBCodeForm.gtmpl",
events = {
@EventConfig(listeners = UIAddBBCodeForm.SaveActionListener.class),
@EventConfig(listeners = UIAddBBCodeForm.PreviewActionListener.class),
@EventConfig(listeners = UIAddBBCodeForm.ApplyActionListener.class),
@EventConfig(listeners = UIAddBBCodeForm.CancelActionListener.class, phase=Phase.DECODE)
}
)
public class UIAddBBCodeForm extends BaseForumForm implements UIPopupComponent {
public static final String FIELD_TAGNAME_INPUT = "TagName";
public static final String FIELD_REPLACEMENT_TEXTARE = "Replacement";
public static final String FIELD_DESCRIPTION_TEXTARE = "Description";
public static final String FIELD_EXAMPLE_TEXTARE = "Example";
public static final String FIELD_USEOPTION_CHECKBOX = "UseOption";
public static final String PREVIEW = "priview";
private boolean isPriview = false;
private BBCodeService bbCodeService;
private String example = ForumUtils.EMPTY_STR;
private List<BBCode> listBBCode = new ArrayList<BBCode>();
private BBCode bbcode = new BBCode();
private static Log log = ExoLogger.getLogger(UIAddBBCodeForm.class);
public UIAddBBCodeForm() throws Exception {
if (ForumUtils.isEmpty(this.getId()))
this.setId("UIAddBBCodeForm");
bbCodeService = (BBCodeService) ExoContainerContext.getCurrentContainer().getComponentInstanceOfType(BBCodeService.class);
UIFormStringInput tagNameInput = new UIFormStringInput(FIELD_TAGNAME_INPUT, FIELD_TAGNAME_INPUT, null);
tagNameInput.addValidator(MandatoryValidator.class);
UIFormTextAreaInput replacementInput = new UIFormTextAreaInput(FIELD_REPLACEMENT_TEXTARE, FIELD_REPLACEMENT_TEXTARE, null);
replacementInput.addValidator(MandatoryValidator.class);
UIFormTextAreaInput description = new UIFormTextAreaInput(FIELD_DESCRIPTION_TEXTARE, FIELD_DESCRIPTION_TEXTARE, null);
UIFormTextAreaInput example = new UIFormTextAreaInput(FIELD_EXAMPLE_TEXTARE, FIELD_EXAMPLE_TEXTARE, null);
example.addValidator(MandatoryValidator.class);
UICheckBoxInput isOption = new UICheckBoxInput(FIELD_USEOPTION_CHECKBOX, FIELD_USEOPTION_CHECKBOX, false);
addUIFormInput(tagNameInput);
addUIFormInput(replacementInput);
addUIFormInput(description);
addUIFormInput(example);
addUIFormInput(isOption);
this.setActions(new String[] { "Save", "ResetField", "Cancel" });
}
public void activate() {
}
public void deActivate() {
}
protected boolean getPriview() {
return isPriview;
}
public void setEditBBcode(BBCode bbcode) throws Exception {
this.bbcode.setId(bbcode.getId());
this.getUIStringInput(FIELD_TAGNAME_INPUT).setValue(bbcode.getTagName());
UIFormTextAreaInput replacement = this.getUIFormTextAreaInput(FIELD_REPLACEMENT_TEXTARE);
replacement.setValue(bbcode.getReplacement());
if (bbcode.getTagName().equalsIgnoreCase("list")) {
replacement.setReadOnly(true);
}
this.getUIFormTextAreaInput(FIELD_DESCRIPTION_TEXTARE).setValue(CommonUtils.decodeSpecialCharToHTMLnumber(bbcode.getDescription()));
this.getUIFormTextAreaInput(FIELD_EXAMPLE_TEXTARE).setValue(bbcode.getExample());
this.getUICheckBoxInput(FIELD_USEOPTION_CHECKBOX).setChecked(bbcode.isOption());
}
private boolean setBBcode() throws Exception {
String tagName = getUIStringInput(FIELD_TAGNAME_INPUT).getValue();
if (CommonUtils.hasSpecialCharacter(tagName)) {
warning("ForumNameValidator.msg.Invalid-char", getLabel(FIELD_TAGNAME_INPUT));
return false;
}
String replacement = getUIFormTextAreaInput(FIELD_REPLACEMENT_TEXTARE).getValue();
String description = getUIFormTextAreaInput(FIELD_DESCRIPTION_TEXTARE).getValue();
String example = getUIFormTextAreaInput(FIELD_EXAMPLE_TEXTARE).getValue();
boolean isOption = (Boolean) getUICheckBoxInput(FIELD_USEOPTION_CHECKBOX).getValue();
if (ForumUtils.isEmpty(description))
description = " ";
description = CommonUtils.encodeSpecialCharInTitle(description);
bbcode.setTagName(tagName.toUpperCase());
bbcode.setReplacement(replacement);
bbcode.setDescription(description);
bbcode.setExample(example);
bbcode.setOption(isOption);
if (bbcode.getId() == null) {
bbcode.setId(bbcode.getTagName() + ((bbcode.isOption()) ? "=" : ForumUtils.EMPTY_STR));
}
this.example = example;
return true;
}
protected String getReplaceByBBCode() throws Exception {
return (new BBCodeRenderer()).renderExample(example, bbcode);
}
static public class SaveActionListener extends EventListener<UIAddBBCodeForm> {
public void execute(Event<UIAddBBCodeForm> event) throws Exception {
UIAddBBCodeForm uiForm = event.getSource();
if(uiForm.setBBcode() == false){
return;
}
uiForm.listBBCode = new ArrayList<BBCode>();
try {
uiForm.listBBCode.addAll(uiForm.bbCodeService.getAll());
} catch (Exception e) {
if (log.isDebugEnabled()){
log.debug("Failed to get all BB codes", e);
}
}
for (BBCode code : uiForm.listBBCode) {
if (uiForm.bbcode.getTagName().equals(code.getTagName()) && (uiForm.bbcode.isOption() == code.isOption()) && !uiForm.bbcode.getId().equals(code.getId())) {
uiForm.warning("UIAddBBCodeForm.msg.addDuplicateBBCode");
return;
}
}
try {
List<BBCode> bbcodes = new ArrayList<BBCode>();
bbcodes.add(uiForm.bbcode);
uiForm.bbCodeService.save(bbcodes);
} catch (Exception e) {
log.error("Can not save BBCode has name: " + uiForm.bbcode.getTagName(), e);
}
try {
UIBBCodeManagerForm codeManagerForm = uiForm.getAncestorOfType(UIForumPortlet.class).findFirstComponentOfType(UIBBCodeManagerForm.class);
codeManagerForm.loadBBCodes(false);
event.getRequestContext().addUIComponentToUpdateByAjax(codeManagerForm);
} catch (Exception e) {
log.error("Can not update from: UIBBCodeManagerForm", e);
}
uiForm.cancelChildPopupAction();
}
}
static public class PreviewActionListener extends EventListener<UIAddBBCodeForm> {
public void execute(Event<UIAddBBCodeForm> event) throws Exception {
UIAddBBCodeForm uiForm = event.getSource();
String priview = event.getRequestContext().getRequestParameter(OBJECTID);
if (priview.equals(PREVIEW)) {
uiForm.isPriview = true;
uiForm.setBBcode();
} else {
uiForm.isPriview = false;
uiForm.listBBCode = new ArrayList<BBCode>();
uiForm.getUIStringInput(FIELD_TAGNAME_INPUT).setValue(uiForm.bbcode.getTagName());
uiForm.getUIFormTextAreaInput(FIELD_REPLACEMENT_TEXTARE).setValue(uiForm.bbcode.getReplacement());
uiForm.getUIFormTextAreaInput(FIELD_DESCRIPTION_TEXTARE).setValue(uiForm.bbcode.getDescription());
uiForm.getUICheckBoxInput(FIELD_USEOPTION_CHECKBOX).setChecked(uiForm.bbcode.isOption());
}
event.getRequestContext().addUIComponentToUpdateByAjax(uiForm);
}
}
static public class ApplyActionListener extends EventListener<UIAddBBCodeForm> {
public void execute(Event<UIAddBBCodeForm> event) throws Exception {
UIAddBBCodeForm uiForm = event.getSource();
String example = uiForm.getUIFormTextAreaInput(FIELD_EXAMPLE_TEXTARE).getValue();
uiForm.example = example;
event.getRequestContext().addUIComponentToUpdateByAjax(uiForm);
}
}
static public class CancelActionListener extends EventListener<UIAddBBCodeForm> {
public void execute(Event<UIAddBBCodeForm> event) throws Exception {
event.getSource().cancelChildPopupAction();
}
}
}