/*
* $Id: ExtendedDropdownDouble.java,v 1.7 2004/02/26 09:10:01 laddi Exp $
*
* Copyright (C) 2003 Agura IT. All Rights Reserved.
*
* This software is the proprietary information of Agura IT AB.
* Use is subject to license terms.
*
*/
package se.idega.idegaweb.commune.accounting.regulations.presentation;
import java.util.*;
import java.lang.reflect.*;
import com.idega.presentation.*;
import com.idega.presentation.ui.DropdownMenu;
import com.idega.presentation.ui.InterfaceObject;
import com.idega.presentation.ui.SelectOption;
import com.idega.data.GenericEntity;
import se.idega.idegaweb.commune.presentation.CommuneBlock;
/**
* @author originally Laddis (SelectDropDownDouble)
* @author Kelly
*
* Thanks Anders for helping me with this :-)
*
* The purpose with this is to present a double drop down menu that gets populated
* from many different beans, business collections etc.
*
* Modifications as follows:
*
* Can serve many selectors on one web page ;-) (hehe Laddi)
* Checkout getKey and getValue. I use reflection to make this
* functional for ConditionHolders (Pointing to either Generic entities or
* Business methods)
* Supports localize on values = getLocalizationKey
*
* @see se.idega.idegaweb.commune.accounting.business.ConditionHolder#
* @see se.idega.idegaweb.commune.accounting.business.RegulationsBusiness#
*
* If you interested in how to use this. See findAllOperations in RegulationsBusiness and
* RegulationListEditor
*
* Kelly
*
*/
public class ExtendedDropdownDouble extends InterfaceObject {
private String _styleClass;
private String _primarySelected;
private String _secondarySelected;
private String primaryName;
private String secondaryName;
private DropdownMenu primary;
private DropdownMenu secondary;
private Collection _primaryCollection;
protected Map _secondaryMap;
protected Map _methodNameMap;
private int _spaceBetween;
private ExtendedDropdownDouble _objectToDisable;
private String _disableValue;
private boolean _disabled;
static int _nameCounter = 0;
private CommuneBlock _parent = null;
public ExtendedDropdownDouble(CommuneBlock parent)
{
primaryName = "primary";
secondaryName = "secondary";
primary = null;
secondary = null;
_spaceBetween = 3;
_disabled = false;
_parent = parent;
}
public ExtendedDropdownDouble(CommuneBlock parent, String primaryName, String secondaryName)
{
this.primaryName = "primary";
this.secondaryName = "secondary";
primary = null;
secondary = null;
_spaceBetween = 3;
_disabled = false;
this.primaryName = primaryName;
this.secondaryName = secondaryName;
_parent = parent;
}
public void main(IWContext iwc)
throws Exception
{
if(getStyleAttribute() != null)
{
getPrimaryDropdown().setStyleAttribute(getStyleAttribute());
getSecondaryDropdown().setStyleAttribute(getStyleAttribute());
}
addElementsToPrimary();
getPrimaryDropdown().setOnChange("setDropdownOptions"+_nameCounter+"(this, findObj('" + secondaryName + "'), -1);");
if(_objectToDisable != null)
{
getSecondaryDropdown().setToDisableWhenSelected(_objectToDisable.getPrimaryName(), _disableValue);
getSecondaryDropdown().setToDisableWhenSelected(_objectToDisable.getSecondaryName(), _disableValue);
}
getPrimaryDropdown().setDisabled(_disabled);
getSecondaryDropdown().setDisabled(_disabled);
Table table = new Table();
table.setCellpadding(0);
table.setCellspacing(0);
add(table);
int column = 1;
table.add(getPrimaryDropdown(), column++, 1);
if(_spaceBetween > 0)
table.setWidth(column++, _spaceBetween);
table.add(getSecondaryDropdown(), column, 1);
if(_styleClass != null)
{
getPrimaryDropdown().setStyleClass(_styleClass);
getSecondaryDropdown().setStyleClass(_styleClass);
}
Script script = getParentPage().getAssociatedScript();
script.addFunction("setDropdownOptions"+_nameCounter, getSelectorScript());
if(_secondarySelected == null)
_secondarySelected = "-1";
getParentPage().setOnLoad("setDropdownOptions"+_nameCounter+"(findObj('" + primaryName + "'),findObj('" + secondaryName + "'), '" + _secondarySelected + "')");
_nameCounter++;
}
private void addElementsToPrimary()
{
if(_primaryCollection != null)
{
Iterator iter = _primaryCollection.iterator();
boolean hasSelected = false;
while(iter.hasNext())
{
SelectOption option = (SelectOption)iter.next();
getPrimaryDropdown().addOption(option);
if(!hasSelected)
{
getPrimaryDropdown().setSelectedOption(option.getValueAsString());
hasSelected = true;
}
}
if(_primarySelected != null)
getPrimaryDropdown().setSelectedElement(_primarySelected);
}
}
private String getSelectorScript()
{
StringBuffer s = new StringBuffer();
s.append("function setDropdownOptions"+_nameCounter+"(input, inputToChange, selected) {").append("\n\t");
s.append("var dropdownValues = new Array();").append("\n\t");
int column = 0;
if(_secondaryMap != null)
{
for(Iterator iter = _secondaryMap.keySet().iterator(); iter.hasNext();)
{
column = 0;
String key = (String)iter.next();
Map map = (Map)_secondaryMap.get(key);
String methodName = (String)_methodNameMap.get(key);
s.append("\n\t").append("dropdownValues[\"" + key + "\"] = new Array();").append("\n\t");
String secondKey;
String value;
for(Iterator iterator = map.keySet().iterator(); iterator.hasNext(); s.append("dropdownValues[\"" + key + "\"][" + column++ + "] = new Option('" + value + "','" + secondKey + "');").append("\n\t"))
{
Object element = iterator.next();
secondKey = getKey(element);
value = getValue(map.get(element), methodName);
}
}
}
s.append("\n\t");
s.append("var chosen = input.options[input.selectedIndex].value;").append("\n\t");
s.append("inputToChange.options.length = 0;").append("\n\n\t");
s.append("var array = dropdownValues[chosen];").append("\n\t");
s.append("for (var a=0; a < array.length; a++)").append("{\n\t\t");
s.append("var index = inputToChange.options.length;").append("\n\t\t");
s.append("inputToChange.options[index] = array[a];").append("\n\t\t");
s.append("var option = inputToChange.options[index];").append("\n\t\t");
s.append("if (option.value == selected)").append("\n\t\t\t");
s.append("option.selected = true;").append("\n\t\t");
s.append("else").append("\n\t\t\t");
s.append("option.selected = false;").append("\n\t");
s.append("}").append("\n").append("}");
return s.toString();
}
protected String getKey(Object key)
{
if (key instanceof GenericEntity) {
GenericEntity ge = (GenericEntity) key;
return ge.getPrimaryKey().toString();
} else if (key instanceof Object []){
Object [] o = (Object []) key;
return o[0].toString();
} else {
return key.toString();
}
}
protected String getValue(Object value, String methodName)
{
if (value instanceof GenericEntity) {
// Bean OBJ
Object o = value;
Class c = o.getClass();
String s = "";
try {
Method m = c.getMethod(methodName, null);
if (methodName.compareTo("getLocalizationKey") == 0) {
s = localize((String)m.invoke(o, null), (String)m.invoke(o, null));
} else {
s = (String)m.invoke(o, null);
}
} catch (Exception e) {
}
return s;
} else if (value instanceof Object []){
// Direct call to Business
Object [] o = (Object []) value;
return o[1].toString();
} else {
// Some dummy data
return value.toString();
}
}
public void addMenuElement(String value, String nameKey, Map values, String dataMethodName)
{
if(_primaryCollection == null)
_primaryCollection = new Vector();
if(_secondaryMap == null) {
_secondaryMap = new HashMap();
_methodNameMap = new HashMap();
}
_primaryCollection.add(new SelectOption(localize(nameKey, nameKey), value));
_secondaryMap.put(value, values);
_methodNameMap.put(value, dataMethodName);
}
public void addEmptyElement(String primaryDisplayString, String secondaryDisplayString)
{
Map map = new HashMap();
map.put("-1", secondaryDisplayString);
addMenuElement("-1", primaryDisplayString, map, "");
}
public DropdownMenu getPrimaryDropdown()
{
if(primary == null)
primary = new DropdownMenu(primaryName);
return primary;
}
public DropdownMenu getSecondaryDropdown()
{
if(secondary == null)
secondary = new DropdownMenu(secondaryName);
return secondary;
}
public String getPrimaryName()
{
return primaryName;
}
public String getSecondaryName()
{
return secondaryName;
}
public void setSpaceBetween(int spaceBetween)
{
_spaceBetween = spaceBetween;
}
public void setPrimaryName(String string)
{
primaryName = string;
}
public void setSecondaryName(String string)
{
secondaryName = string;
}
public void setSelectedValues(String primaryValue, String secondaryValue)
{
_primarySelected = primaryValue;
_secondarySelected = secondaryValue;
}
public void setToEnableWhenNotSelected(ExtendedDropdownDouble doubleDropdown, String disableValue)
{
_objectToDisable = doubleDropdown;
_disableValue = disableValue;
}
public void setDisabled(boolean disabled)
{
_disabled = disabled;
}
public void setStyleClass(String styleClass)
{
_styleClass = styleClass;
}
protected Map getSecondaryMap()
{
return _secondaryMap;
}
public String localize(String textKey, String defaultText) {
if (_parent != null) {
return _parent.localize(textKey, defaultText);
} else {
return defaultText;
}
}
/* (non-Javadoc)
* @see com.idega.presentation.ui.InterfaceObject#handleKeepStatus(com.idega.presentation.IWContext)
*/
public void handleKeepStatus(IWContext iwc) {
}
/* (non-Javadoc)
* @see com.idega.presentation.PresentationObject#isContainer()
*/
public boolean isContainer() {
return false;
}
}