/**
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.portal.webui.application;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.exoplatform.webui.application.WebuiRequestContext;
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.UIDropDownControl;
import org.exoplatform.webui.core.model.SelectItemOption;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.Event.Phase;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.UIForm;
import org.exoplatform.webui.form.UIFormInput;
import org.exoplatform.webui.form.UIFormInputBase;
/**
* Created by The eXo Platform SARL Author : Tung Pham tung.pham@exoplatform.com Modify : dang.tung tungcnw@gmail.com Nov 5,
* 2007
*/
@ComponentConfigs({
@ComponentConfig(template = "system:/groovy/webui/form/UIItemThemeSelector.gtmpl", events = {
@EventConfig(listeners = UIItemThemeSelector.SelectThemeActionListener.class, phase = Phase.DECODE),
@EventConfig(listeners = UIItemThemeSelector.SetDefaultActionListener.class, phase = Phase.DECODE) }),
@ComponentConfig(type = UIDropDownControl.class, id = "ThemeDropDown", template = "system:/groovy/webui/core/UIDropDownControl.gtmpl", events = { @EventConfig(listeners = UIItemThemeSelector.ChangeOptionActionListener.class) }
) })
public class UIItemThemeSelector extends UIFormInputBase<String> {
private String selectedTheme;
private List<ThemeCategory> categories = new ArrayList<ThemeCategory>();
private ThemeCategory selectedCategory;
public static final String DEFAULT_THEME = "DefaultTheme";
public UIItemThemeSelector(String name, String bindingField) throws Exception {
super(name, bindingField, String.class);
setComponentConfig(UIItemThemeSelector.class, null);
addChild(UIDropDownControl.class, "ThemeDropDown", null);
}
@SuppressWarnings("unchecked")
public UIFormInput setValue(String value) {
setSelectedTheme(value);
return this;
}
public String getValue() {
return getSelectedTheme();
}
public void decode(Object input, WebuiRequestContext context) {
String value = String.valueOf(input);
if (value.equals("null") || value.trim().length() < 1)
selectedTheme = null;
else
selectedTheme = value;
}
public String event(String name, String beanId) throws Exception {
UIForm uiForm = getAncestorOfType(UIForm.class);
return uiForm.event(name, beanId);
}
public String event(String name) throws Exception {
UIForm uiForm = getAncestorOfType(UIForm.class);
return uiForm.event(name);
}
public void reset() {
super.reset();
selectedCategory = null;
selectedTheme = DEFAULT_THEME;
getChild(UIDropDownControl.class).setValue(0);
}
public void setValues(Map<String, Set<String>> themeSet) {
categories.clear();
if (themeSet == null) {
selectedCategory = null;
selectedTheme = null;
return;
}
Iterator<Entry<String, Set<String>>> itr = themeSet.entrySet().iterator();
while (itr.hasNext()) {
Entry<String, Set<String>> cateEntry = itr.next();
ThemeCategory category = new ThemeCategory(cateEntry.getKey());
List<String> themes = new ArrayList<String>(cateEntry.getValue());
for (String theme : themes) {
category.addTheme(theme);
}
categories.add(category);
}
setSelectedCategory(categories.get(0));
getChild(UIDropDownControl.class).setOptions(getDropDownOptions());
}
public ThemeCategory getSelectedCategory() {
if (selectedCategory == null && categories.size() > 0)
return categories.get(0);
return selectedCategory;
}
public void setSelectedCategory(ThemeCategory selectedCate) {
if (selectedCate == null) {
setSelectedCategory((String) null);
return;
}
String cateName = selectedCate.getName();
setSelectedCategory(cateName);
}
public void setSelectedCategory(String cateName) {
selectedCategory = null;
if (cateName == null)
return;
UIDropDownControl uiDropDown = getChild(UIDropDownControl.class);
for (ThemeCategory cate : categories) {
if (cate.getName().equals(cateName)) {
selectedCategory = cate;
uiDropDown.setValue(cateName);
return;
}
}
}
public String getSelectedTheme() {
if (selectedTheme == null || selectedTheme.trim().length() < 1)
selectedTheme = DEFAULT_THEME;
return selectedTheme;
}
public void setSelectedTheme(String value) {
selectedTheme = null;
for (ThemeCategory cate : categories) {
List<String> themes = cate.getThemes();
if (themes == null)
continue;
for (String theme : themes) {
if (theme.equals(value)) {
selectedTheme = value;
setSelectedCategory(cate);
return;
}
}
}
}
public List<ThemeCategory> getCategories() {
if (categories == null)
return new ArrayList<ThemeCategory>();
return categories;
}
public void setCategories(List<ThemeCategory> list) {
categories = list;
getChild(UIDropDownControl.class).setOptions(getDropDownOptions());
}
private List<SelectItemOption<String>> getDropDownOptions() {
List<SelectItemOption<String>> options = new ArrayList<SelectItemOption<String>>();
if (categories != null) {
for (ThemeCategory ele : categories) {
String cateName = ele.getName();
options.add(new SelectItemOption<String>(cateName, cateName));
}
}
return options;
}
public static class SelectThemeActionListener extends EventListener<UIItemThemeSelector> {
public void execute(Event<UIItemThemeSelector> event) throws Exception {
UIItemThemeSelector uiFormInput = event.getSource();
String theme = event.getRequestContext().getRequestParameter(OBJECTID);
uiFormInput.setSelectedTheme(theme);
UIForm uiForm = uiFormInput.getAncestorOfType(UIForm.class);
event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getParent());
}
}
public static class ChangeOptionActionListener extends EventListener<UIDropDownControl> {
public void execute(Event<UIDropDownControl> event) throws Exception {
UIDropDownControl uiDropDown = event.getSource();
String category = event.getRequestContext().getRequestParameter(OBJECTID);
UIItemThemeSelector uiFormInput = uiDropDown.getParent();
uiFormInput.setSelectedCategory(category);
UIPortletForm uiportletForm = uiFormInput.getAncestorOfType(UIPortletForm.class);
uiportletForm.setSelectedTab(uiportletForm.getChild(UIFormInputThemeSelector.class).getId());
event.getRequestContext().addUIComponentToUpdateByAjax(uiFormInput);
}
}
public static class SetDefaultActionListener extends EventListener<UIItemThemeSelector> {
public void execute(Event<UIItemThemeSelector> event) throws Exception {
UIItemThemeSelector uiFormInput = event.getSource();
uiFormInput.reset();
UIForm uiForm = uiFormInput.getAncestorOfType(UIForm.class);
event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getParent());
}
}
public static class ThemeCategory {
private String name_;
private String description_;
private List<String> themes_;
public ThemeCategory(String name) {
name_ = name;
description_ = name;
}
public ThemeCategory(String name, String description) {
name_ = name;
description_ = description;
}
public String getName() {
return name_;
}
public void setName(String name) {
name_ = name;
}
public String getDescription() {
return description_;
}
public void setDescription(String description) {
description_ = description;
}
public List<String> getThemes() {
return themes_;
}
public void setThemes(List<String> themes) {
themes_ = themes;
}
public void addTheme(String theme) {
if (themes_ == null)
themes_ = new ArrayList<String>();
themes_.add(theme);
}
}
}