[richfaces-svn-commits] JBoss Rich Faces SVN: r2592 - in trunk/ui/tabPanel: src/main/java/org/richfaces/component and 2 other directories.
richfaces-svn-commits at lists.jboss.org
richfaces-svn-commits at lists.jboss.org
Wed Aug 29 19:59:15 EDT 2007
Author: nbelaevski
Date: 2007-08-29 19:59:15 -0400 (Wed, 29 Aug 2007)
New Revision: 2592
Added:
trunk/ui/tabPanel/src/test/java/org/richfaces/renderkit/TabsIteratorHelperTest.java
Removed:
trunk/ui/tabPanel/src/main/java/org/richfaces/component/TabsIterator.java
Modified:
trunk/ui/tabPanel/
trunk/ui/tabPanel/src/main/java/org/richfaces/component/UITabPanel.java
trunk/ui/tabPanel/src/main/java/org/richfaces/renderkit/TabPanelRendererBase.java
Log:
http://jira.jboss.com/jira/browse/RF-750
Property changes on: trunk/ui/tabPanel
___________________________________________________________________
Name: svn:ignore
- target
.settings
.classpath
.project
+ target
.settings
.classpath
.project
.clover
Deleted: trunk/ui/tabPanel/src/main/java/org/richfaces/component/TabsIterator.java
===================================================================
--- trunk/ui/tabPanel/src/main/java/org/richfaces/component/TabsIterator.java 2007-08-29 18:02:10 UTC (rev 2591)
+++ trunk/ui/tabPanel/src/main/java/org/richfaces/component/TabsIterator.java 2007-08-29 23:59:15 UTC (rev 2592)
@@ -1,117 +0,0 @@
-/**
- * License Agreement.
- *
- * JBoss RichFaces - Ajax4jsf Component Library
- *
- * Copyright (C) 2007 Exadel, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License version 2.1 as published by the Free Software Foundation.
- *
- * This library 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 library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-package org.richfaces.component;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * "sublist" iterator for iterate over child components instantiate from {@link UITab}
- *
- * @author shura (latest modification by $Author$)
- * @version $Revision$ $Date$
- */
-class TabsIterator implements Iterator {
-
- static interface FilterCondition {
- public boolean isSuitable(UITab tab);
- }
-
- private FilterCondition filterCondition;
-
- /**
- *
- */
- private final UITabPanel tabsIterator;
-
- /**
- * Original component iterator for children
- */
- private Iterator _childs;
-
- /**
- * Next UITab in children.
- */
- private Object _next = null;
-
- public TabsIterator(UITabPanel tabPanel, FilterCondition filterCondition) {
- super();
-
- this.filterCondition = filterCondition;
-
- tabsIterator = tabPanel;
- _childs = tabsIterator.getChildren().iterator();
- _next = getNextTab();
- }
-
- /**
- * @param tabPanel TODO
- */
- public TabsIterator(UITabPanel tabPanel) {
- this(tabPanel, null);
- }
-
- /* (non-Javadoc)
- * @see java.util.Iterator#hasNext()
- */
- public boolean hasNext() {
- return _next != null;
- }
-
- /* (non-Javadoc)
- * @see java.util.Iterator#next()
- */
- public Object next() {
- if (null == _next) {
- throw new NoSuchElementException();
- }
- Object next = _next;
- _next = getNextTab();
- return next;
- }
-
- /* (non-Javadoc)
- * @see java.util.Iterator#remove()
- */
- public void remove() {
- throw new UnsupportedOperationException("tabs Iterator not support remove operation");
-
- }
-
- /**
- * Find next {@link UITab} components in children
- * @return next tab
- */
- private Object getNextTab() {
- while (_childs.hasNext()) {
- Object element = _childs.next();
- if (element instanceof UITab) {
- UITab tab = (UITab) element;
- if (filterCondition == null || filterCondition.isSuitable(tab))
- {
- return tab;
- }
- }
- }
- return null;
- }
-}
\ No newline at end of file
Modified: trunk/ui/tabPanel/src/main/java/org/richfaces/component/UITabPanel.java
===================================================================
--- trunk/ui/tabPanel/src/main/java/org/richfaces/component/UITabPanel.java 2007-08-29 18:02:10 UTC (rev 2591)
+++ trunk/ui/tabPanel/src/main/java/org/richfaces/component/UITabPanel.java 2007-08-29 23:59:15 UTC (rev 2592)
@@ -26,6 +26,10 @@
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.Predicate;
+import org.apache.commons.collections.iterators.FilterIterator;
+
/**
* JSF component class
*/
@@ -39,20 +43,15 @@
protected Iterator getSwitchedFacetsAndChildren() {
final Object renderedValue = this.restoredRenderedValue;
- return new TabsIterator(this, new TabsIterator.FilterCondition() {
+ return new FilterIterator(getRenderedTabs(), new Predicate() {
- public boolean isSuitable(UITab tab) {
- if (CLIENT_METHOD.equals(tab.getSwitchTypeOrDefault())) {
-
- return true;
- }
-
- Object name = tab.getName();
-
- return name != null && name.equals(renderedValue);
- }
-
- });
+ public boolean evaluate(Object object) {
+ UITab tab = (UITab) object;
+ return !tab.isDisabled() && (CLIENT_METHOD.equals(tab.getSwitchTypeOrDefault())) ||
+ (renderedValue != null && renderedValue.equals(tab.getName()));
+ }
+
+ });
}
public Object convertSwitchValue(UIComponent component, Object object) {
@@ -120,14 +119,32 @@
this.restoredRenderedValue = getRenderedValue();
}
+ private static final Predicate RENDERED_TAB_PREDICATE = new Predicate() {
+
+ public boolean evaluate(Object object) {
+ if (object instanceof UITab) {
+ UITab tab = (UITab) object;
+
+ return tab.isRendered();
+ }
+
+ return false;
+ }
+
+ };
+
/**
- * Create iterator for all tabs in this component ( in future, can be added special attribute for tabs collection.
+ * Create iterator for all rendered tabs in this component
* {@link Iterator#next()} method will return tab model - {@link Tab}
*
* @return Iterator
*/
- public Iterator getTabs() {
- return new TabsIterator(this);
+ public Iterator getRenderedTabs() {
+ if (getChildCount() > 0) {
+ return new FilterIterator(getChildren().iterator(), RENDERED_TAB_PREDICATE);
+ } else {
+ return CollectionUtils.EMPTY_COLLECTION.iterator();
+ }
}
/**
Modified: trunk/ui/tabPanel/src/main/java/org/richfaces/renderkit/TabPanelRendererBase.java
===================================================================
--- trunk/ui/tabPanel/src/main/java/org/richfaces/renderkit/TabPanelRendererBase.java 2007-08-29 18:02:10 UTC (rev 2591)
+++ trunk/ui/tabPanel/src/main/java/org/richfaces/renderkit/TabPanelRendererBase.java 2007-08-29 23:59:15 UTC (rev 2592)
@@ -42,6 +42,7 @@
import org.richfaces.component.UITab;
import org.richfaces.component.UITabPanel;
import org.richfaces.component.util.HtmlUtil;
+import org.richfaces.component.util.MessageUtil;
import org.richfaces.event.SwitchablePanelSwitchEvent;
@@ -69,11 +70,11 @@
UITab eventTab = null;
- for (Iterator tabsIterator = panel.getTabs();
+ for (Iterator tabsIterator = panel.getRenderedTabs();
tabsIterator.hasNext() && eventTab == null;) {
UITab tab = (UITab) tabsIterator.next();
- if (!tab.isRendered() || tab.isDisabled()) {
+ if (tab.isDisabled()) {
continue;
}
@@ -185,31 +186,6 @@
return getUtils().getValueAsString(context, tabPanel);
}
- public String getTabsCount(FacesContext context, UITabPanel tabPanel){
- int count = 0;
- String ret = "1";
- for (Iterator iter = tabPanel.getTabs(); iter.hasNext();){
- iter.next();
- count++;
- }
- //center tabs group
- ret = String.valueOf(count*2 - 1);
- return ret;
- }
-/*
- public void writeColgroups(FacesContext context, UITabPanel tabPanel) throws IOException{
- StringBuffer buff = new StringBuffer();
- if("left".equals(tabPanel.getHeaderAlignment())){
- buff.append("<colgroup/>").append("<colgroup span=\"" + getTabsCount(context, tabPanel) + "\"/>").append("<colgroup width=\"100%\"/>");
- } else if("center".equals(tabPanel.getHeaderAlignment())){
- buff.append("<colgroup width=\"33%\"/>").append("<colgroup width=\"34%\" span=\"" + getTabsCount(context, tabPanel) + "\"/>").append("<colgroup width=\"33%\"/>");
- } else {
- buff.append("<colgroup width=\"100%\"/>").append("<colgroup span=\"" + getTabsCount(context, tabPanel) + "\"/>").append("<colgroup/>");
- }
- context.getResponseWriter().write(buff.toString());
- //return null;
- }
-*/
private Object checkValue(Object value) {
if (value instanceof String) {
String s = (String) value;
@@ -224,75 +200,127 @@
return value;
}
+ protected static class TabsIteratorHelper {
+ private Iterator tabs;
+
+ private UITab namedTab = null;
+ private UITab firstApplicableTab = null;
+ private boolean fallback;
+
+ public TabsIteratorHelper(Iterator tabs, Object name) {
+ super();
+ this.tabs = tabs;
+
+ if (name != null) {
+ //findTabByName
+ while (tabs.hasNext()) {
+ UITab tab = nextTab();
+ if (name.equals(tab.getName())) {
+ this.namedTab = tab;
+ break;
+ }
+ }
+ }
+
+ if (namedTab == null) {
+ if (name != null) {
+ //tried but failed
+ fallback = true;
+ }
+
+ this.namedTab = findAnyTab();
+ } else if (namedTab.isDisabled()) {
+ UITab tab = findAnyTab();
+ if (this.namedTab != tab && tab != null && !tab.isDisabled()) {
+ fallback = true;
+ this.namedTab = tab;
+ } else {
+ //use disabled tab found by name
+ }
+ }
+ }
+
+ private UITab nextTab() {
+ UITab tab = (UITab) tabs.next();
+
+ if (firstApplicableTab == null) {
+ firstApplicableTab = tab;
+ } else if (firstApplicableTab.isDisabled() && !tab.isDisabled()) {
+ //more appropriate
+ firstApplicableTab = tab;
+ }
+
+ return tab;
+ }
+
+ public UITab getTab() {
+ return this.namedTab;
+ }
+
+ public boolean isFallback() {
+ return fallback;
+ }
+
+ private UITab findAnyTab() {
+ while ((firstApplicableTab == null || firstApplicableTab.isDisabled()) && tabs.hasNext()) {
+ nextTab();
+ }
+
+ return firstApplicableTab;
+ }
+ }
+
public void encodeTabs(FacesContext context, UITabPanel tabPanel) throws IOException {
ComponentVariables componentVariables = ComponentsVariableResolver.getVariables(this, tabPanel);
tabPanel.setRenderedValue(null);
Object checkedValue = checkValue(tabPanel.getValue());
- boolean useFirstRenderedTab = checkedValue == null;
UITabPanel pane = tabPanel;
- UITab firstRenderedTab = null;
UITab activeTab = null;
- for (Iterator iter = pane.getTabs(); iter.hasNext() && activeTab == null;)
- {
- UITab tab = (UITab) iter.next();
+ TabsIteratorHelper helper = new TabsIteratorHelper(pane.getRenderedTabs(), checkedValue);
+ activeTab = helper.getTab();
- if (tab.isRendered() && !tab.isDisabled()) {
- if (firstRenderedTab == null) {
- firstRenderedTab = tab;
- }
+ if (activeTab == null) {
+ Object label = MessageUtil.getLabel(context, tabPanel);
+ String message = label + ": tab panel has no enabled or rendered tabs!";
+ context.getExternalContext().log(message);
+ return ;
+ }
- if (useFirstRenderedTab) {
- activeTab = firstRenderedTab;
- } else if (checkedValue.equals(tab.getName())) {
- activeTab = tab;
- }
+ if (helper.isFallback()) {
+ Object label = MessageUtil.getLabel(context, tabPanel);
+ String message = label + ": tab panel [@selectedTab=" + checkedValue +
+ "] has no enabled or rendered tab with such name. Tab: " + activeTab.getName() +
+ " will be used instead!";
+ context.getExternalContext().log(message);
- } else {
- if (!useFirstRenderedTab) {
- if (checkedValue.equals(tab.getName())) {
- if (firstRenderedTab != null) {
- activeTab = firstRenderedTab;
- } else {
- useFirstRenderedTab = true;
- }
- }
- }
- }
- }
+ tabPanel.setRenderedValue(activeTab.getName());
+ } else {
+ tabPanel.setRenderedValue(null);
+ }
+
+ helper = null;
- if (activeTab == null) {
- throw new IllegalStateException("No active tabs!");
- } else {
- if (useFirstRenderedTab) {
- tabPanel.setRenderedValue(activeTab.getName());
- } else {
- tabPanel.setRenderedValue(null);
- }
- }
-
ArrayList tabs = new ArrayList();
boolean clientSide = UISwitchablePanel.CLIENT_METHOD.equals(pane.getSwitchType());
TabInfoCollector tabInfoCollector = getTabInfoCollector();
- for (Iterator iter = pane.getTabs(); iter.hasNext();) {
+ for (Iterator iter = pane.getRenderedTabs(); iter.hasNext();) {
UITab tab = (UITab) iter.next();
boolean active = activeTab == tab;
tab.setActive(active);
- if (tab.isRendered()) {
- if (!clientSide) {
- clientSide = UISwitchablePanel.CLIENT_METHOD.equals(tab.getSwitchTypeOrDefault());
- }
+ if (!clientSide) {
+ clientSide = UISwitchablePanel.CLIENT_METHOD.equals(tab.getSwitchTypeOrDefault());
+ }
- tab.encodeTab(context, active);
+ tab.encodeTab(context, active);
- if (!tab.isDisabled()) {
- tabs.add(tabInfoCollector.collectTabInfo(context, tab));
- }
+ if (!tab.isDisabled()) {
+ tabs.add(tabInfoCollector.collectTabInfo(context, tab));
}
}
Added: trunk/ui/tabPanel/src/test/java/org/richfaces/renderkit/TabsIteratorHelperTest.java
===================================================================
--- trunk/ui/tabPanel/src/test/java/org/richfaces/renderkit/TabsIteratorHelperTest.java (rev 0)
+++ trunk/ui/tabPanel/src/test/java/org/richfaces/renderkit/TabsIteratorHelperTest.java 2007-08-29 23:59:15 UTC (rev 2592)
@@ -0,0 +1,119 @@
+/**
+ * License Agreement.
+ *
+ * JBoss RichFaces - Ajax4jsf Component Library
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library 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 library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package org.richfaces.renderkit;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.ajax4jsf.tests.AbstractAjax4JsfTestCase;
+import org.richfaces.component.UITab;
+import org.richfaces.renderkit.TabPanelRendererBase.TabsIteratorHelper;
+
+public class TabsIteratorHelperTest extends AbstractAjax4JsfTestCase {
+
+ public TabsIteratorHelperTest(String name) {
+ super(name);
+ }
+
+ private List tabsList;
+
+ public void setUp() throws Exception {
+ super.setUp();
+
+ tabsList = new ArrayList();
+
+ for (int i = 0; i < 3; i++) {
+ UITab tab = (UITab) application.createComponent(UITab.COMPONENT_TYPE);
+ tab.setName("tab" + i);
+ tabsList.add(tab);
+ }
+ }
+
+ public void tearDown() throws Exception {
+ super.tearDown();
+ tabsList = null;
+ }
+
+ public void testFindByName() throws Exception {
+ TabsIteratorHelper helper = new TabsIteratorHelper(tabsList.iterator(), "tab2");
+ assertSame(tabsList.get(2), helper.getTab());
+ assertFalse(helper.isFallback());
+ }
+
+ public void testFindByName1() throws Exception {
+ TabsIteratorHelper helper = new TabsIteratorHelper(tabsList.iterator(), "taba");
+ assertSame(tabsList.get(0), helper.getTab());
+ assertTrue(helper.isFallback());
+ }
+
+ public void testFindAnyTabDefault() throws Exception {
+ TabsIteratorHelper helper = new TabsIteratorHelper(tabsList.iterator(), null);
+ assertSame(tabsList.get(0), helper.getTab());
+ assertFalse(helper.isFallback());
+ }
+
+ public void testFindAnyTab() throws Exception {
+ ((UITab) tabsList.get(0)).setDisabled(true);
+ ((UITab) tabsList.get(1)).setDisabled(true);
+
+ TabsIteratorHelper helper = new TabsIteratorHelper(tabsList.iterator(), "taba");
+ assertSame(tabsList.get(2), helper.getTab());
+ assertTrue(helper.isFallback());
+ }
+
+ public void testFindAnyTabUnnamed() throws Exception {
+ ((UITab) tabsList.get(0)).setDisabled(true);
+
+ TabsIteratorHelper helper = new TabsIteratorHelper(tabsList.iterator(), null);
+ assertSame(tabsList.get(1), helper.getTab());
+ assertFalse(helper.isFallback());
+ }
+
+ public void testFindAnyTabAllDisabled() throws Exception {
+ ((UITab) tabsList.get(0)).setDisabled(true);
+ ((UITab) tabsList.get(1)).setDisabled(true);
+ ((UITab) tabsList.get(2)).setDisabled(true);
+
+ TabsIteratorHelper helper = new TabsIteratorHelper(tabsList.iterator(), null);
+ assertSame(tabsList.get(0), helper.getTab());
+ assertFalse(helper.isFallback());
+ }
+
+ public void testFindTabByNameDisabled() throws Exception {
+ ((UITab) tabsList.get(0)).setDisabled(true);
+ ((UITab) tabsList.get(1)).setDisabled(true);
+ ((UITab) tabsList.get(2)).setDisabled(true);
+
+ TabsIteratorHelper helper = new TabsIteratorHelper(tabsList.iterator(), "tab1");
+ assertSame(tabsList.get(1), helper.getTab());
+ assertFalse(helper.isFallback());
+ }
+
+ public void testFindTabByNameBeforeDisabled() throws Exception {
+ ((UITab) tabsList.get(0)).setDisabled(true);
+ ((UITab) tabsList.get(2)).setDisabled(true);
+
+ TabsIteratorHelper helper = new TabsIteratorHelper(tabsList.iterator(), "tab2");
+ assertSame(tabsList.get(1), helper.getTab());
+ assertTrue(helper.isFallback());
+ }
+}
More information about the richfaces-svn-commits
mailing list