package org.rhq.enterprise.gui.test; import java.util.ArrayList; import java.util.List; import javax.faces.event.ValueChangeEvent; import javax.faces.model.SelectItem; //@Scope(ScopeType.PAGE) //@Name("TestConditionalFormUIBean") public class TestConditionalFormUIBean { private String currentType = ""; private String currentItem = ""; private String favoriteCharacter = ""; private String result; public List<SelectItem> firstList = new ArrayList<SelectItem>(); public List<SelectItem> secondList = new ArrayList<SelectItem>(); public List<SelectItem> thirdList = new ArrayList<SelectItem>(); private static final String[] FRUITS = { "Banana", "Cranberry", "Blueberry", "Orange" }; private static final String[] VEGETABLES = { "Potatoes", "Broccoli", "Garlic", "Carrot" }; private boolean debug = true; public TestConditionalFormUIBean() { init(); } public void init() { firstList.add(new SelectItem("none", "Select...")); firstList.add(new SelectItem("fruits", "Fruits")); firstList.add(new SelectItem("vegetables", "Vegetables")); } public List<SelectItem> getFirstList() { debug("getFirstList() -> " + prettyPrint(firstList)); return firstList; } public List<SelectItem> getSecondList() { debug("getSecondList() -> " + prettyPrint(secondList)); return secondList; } public List<SelectItem> getThirdList() { debug("getThirdList() -> " + prettyPrint(thirdList)); return thirdList; } private String prettyPrint(List<SelectItem> list) { StringBuilder results = new StringBuilder(); boolean first = true; for (SelectItem nextItem : list) { if (first) { first = false; } else { results.append(", "); } results.append(nextItem.getValue() + ":" + nextItem.getLabel()); } return results.toString(); } private boolean noEffect(ValueChangeEvent event) { Object oldValue = event.getOldValue(); if (event.getNewValue() == null) { debug("noEffect: nothing selected"); return true; // nothing was actually selected, thus no effect } Object newValue = event.getNewValue(); if (oldValue != null && newValue != null && oldValue.equals(newValue)) { debug("nothing changed"); return true; // nothing was changed, thus no effect // NOTE: ValueChangeEvent is sometimes suppressed client-side for no-change events; depends on the component } debug("noEffect: change detected"); return false; } public void currentTypeChanged(ValueChangeEvent event) { debug("currentTypeChanged: event fired"); if (noEffect(event)) { // nothing was change or nothing was selected, so do nothing return; } // edit stuff as a result of the change secondList.clear(); String[] currentItems; String selectedCurrentType = (String) event.getNewValue(); if (selectedCurrentType.equals("none")) { currentItems = new String[0]; } else { secondList.add(new SelectItem("none", "Select...")); if (selectedCurrentType.equals("fruits")) { currentItems = FRUITS; } else { currentItems = VEGETABLES; } } for (int i = 0; i < currentItems.length; i++) { SelectItem item = new SelectItem(currentItems[i]); secondList.add(item); } // clean-up dependent form elements debug("currentTypeChanged: clearing thirdList, nulling-out result"); thirdList.clear(); result = null; } public void currentItemChanged(ValueChangeEvent event) { debug("currentItemChanged: event fired"); if (noEffect(event)) { // nothing was change or nothing was selected, so do nothing return; } // edit stuff as a result of the change thirdList.clear(); thirdList.add(new SelectItem("none", "Select...")); String selectedCurrentItem = (String) event.getNewValue(); if (selectedCurrentItem.equals("none") == false) { for (char nextChar : selectedCurrentItem.toCharArray()) { SelectItem item = new SelectItem(nextChar); thirdList.add(item); } } // clean-up dependent form elements debug("currentItemChanged: nulling-out result"); result = null; } public void currentCharChanged(ValueChangeEvent event) { debug("currentCharChanged: event fired"); if (noEffect(event)) { // nothing was change or nothing was selected, so do nothing return; } // edit stuff as a result of the change // NOTE: calling getFavoriteCharacter results stale data here, because the // ValueChangeEvent is fired before the setFavoriteCharacter method result = null; String selectedCurrentChar = (String) event.getNewValue(); if (selectedCurrentChar.equals("none") == false) { result = getCurrentType() + " : " + getCurrentItem() + " : " + selectedCurrentChar; } // no dependent form elements } public String getCurrentType() { debug("getCurrentType() -> " + currentType); return currentType; } public void setCurrentType(String currentType) { debug("setCurrentType(" + currentType + ")"); this.currentType = currentType; } public String getCurrentItem() { debug("getCurrentItem() -> " + currentItem); return currentItem; } public void setCurrentItem(String currentItem) { debug("setCurrentItem(" + currentItem + ")"); this.currentItem = currentItem; } public String getFavoriteCharacter() { debug("getFavoriteCharacter() -> " + favoriteCharacter); return favoriteCharacter; } public void setFavoriteCharacter(String favoriteCharacter) { debug("setFavoriteCharacter(" + favoriteCharacter + ")"); this.favoriteCharacter = favoriteCharacter; } public String getResult() { debug("getResult() -> " + result); return result; } public void setResult(String result) { debug("setResult(" + result + ")"); this.result = result; } private void debug(String message) { if (debug) { System.out.println(message); } } }