/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.myfaces.custom.tabbedpane;
import java.util.Iterator;
import java.util.List;
import org.apache.myfaces.shared_tomahawk.util._ComponentUtils;
import javax.faces.component.UIComponent;
import javax.faces.component.UIForm;
import javax.faces.component.UINamingContainer;
import javax.faces.component.html.HtmlPanelGroup;
import javax.faces.context.FacesContext;
import javax.faces.el.EvaluationException;
import javax.faces.el.MethodBinding;
import javax.faces.el.ValueBinding;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.FacesEvent;
/**
* @author Manfred Geiler (latest modification by $Author: grantsmith $)
* @version $Revision: 473124 $ $Date: 2006-11-09 23:52:21 +0100 (Do, 09 Nov 2006) $
*/
public class HtmlPanelTabbedPane
extends HtmlPanelGroup
{
//private static final Log log = LogFactory.getLog(HtmlPanelTabbedPane.class);
private MethodBinding _tabChangeListener = null;
//TODO: additional HTML Table attributes (see HtmlPanelTabbedPaneTag)
public void decode(FacesContext context)
{
super.decode(context); //To change body of overridden methods use File | Settings | File Templates.
}
public void processDecodes(javax.faces.context.FacesContext context)
{
if (context == null) throw new NullPointerException("context");
decode(context);
int tabIdx = 0;
int selectedIndex = getSelectedIndex();
Iterator it = getFacetsAndChildren();
while (it.hasNext())
{
UIComponent childOrFacet = getUIComponent((UIComponent) it.next());
if (childOrFacet instanceof HtmlPanelTab) {
if (isClientSide() || selectedIndex == tabIdx) {
childOrFacet.processDecodes(context);
}
tabIdx++;
} else {
childOrFacet.processDecodes(context);
}
}
}
public void processValidators(FacesContext context)
{
if (context == null) throw new NullPointerException("context");
if (!isRendered()) return;
int tabIdx = 0;
int selectedIndex = getSelectedIndex();
Iterator it = getFacetsAndChildren();
while (it.hasNext())
{
UIComponent childOrFacet = getUIComponent((UIComponent) it.next());
if (childOrFacet instanceof HtmlPanelTab) {
if (isClientSide() || selectedIndex == tabIdx) {
childOrFacet.processValidators(context);
}
tabIdx++;
} else {
childOrFacet.processValidators(context);
}
}
}
public void processUpdates(FacesContext context)
{
if (context == null) throw new NullPointerException("context");
if (!isRendered()) return;
int tabIdx = 0;
int selectedIndex = getSelectedIndex();
Iterator it = getFacetsAndChildren();
while (it.hasNext())
{
UIComponent childOrFacet = getUIComponent((UIComponent) it.next());
if (childOrFacet instanceof HtmlPanelTab) {
if (isClientSide() || selectedIndex == tabIdx) {
childOrFacet.processUpdates(context);
}
tabIdx++;
} else {
childOrFacet.processUpdates(context);
}
}
}
private UIComponent getUIComponent(UIComponent uiComponent)
{
/*todo: checking for UIForm is not enough - Trinidad form, etc.*/
if (uiComponent instanceof UINamingContainer || uiComponent instanceof UIForm)
{
List children = uiComponent.getChildren();
for (int i = 0, len = children.size(); i < len; i++)
{
uiComponent = getUIComponent((UIComponent)children.get(i));
}
}
return uiComponent;
}
public void addTabChangeListener(TabChangeListener listener)
{
addFacesListener(listener);
}
public void removeTabChangeListener(TabChangeListener listener)
{
removeFacesListener(listener);
}
public MethodBinding getTabChangeListener()
{
return _tabChangeListener;
}
public void setTabChangeListener(MethodBinding tabChangeListener)
{
_tabChangeListener = tabChangeListener;
}
public void broadcast(FacesEvent event) throws AbortProcessingException
{
if (event instanceof TabChangeEvent)
{
TabChangeEvent tabChangeEvent = (TabChangeEvent)event;
if (tabChangeEvent.getComponent() == this)
{
setSelectedIndex(tabChangeEvent.getNewTabIndex());
getFacesContext().renderResponse();
}
}
super.broadcast(event);
MethodBinding tabChangeListenerBinding = getTabChangeListener();
if (tabChangeListenerBinding != null)
{
try
{
tabChangeListenerBinding.invoke(getFacesContext(), new Object[]{event});
}
catch (EvaluationException e)
{
Throwable cause = e.getCause();
if (cause != null && cause instanceof AbortProcessingException)
{
throw (AbortProcessingException)cause;
}
else
{
throw e;
}
}
}
}
/**
* Write out information about the toggling mode - the component might
* be toggled server side or client side.
*/
public boolean isClientSide()
{
return !getServerSideTabSwitch();
}
//------------------ GENERATED CODE BEGIN (do not modify!) --------------------
public static final String COMPONENT_TYPE = "org.apache.myfaces.HtmlPanelTabbedPane";
public static final String COMPONENT_FAMILY = "javax.faces.Panel";
private static final String DEFAULT_RENDERER_TYPE = "org.apache.myfaces.TabbedPane";
private static final int DEFAULT_SELECTEDINDEX = 0;
private static final boolean DEFAULT_SERVER_SIDE_TAB_SWITCH = false;
private Integer _selectedIndex = null;
private String _bgcolor = null;
private String _activeTabStyleClass = null;
private String _inactiveTabStyleClass = null;
private String _disabledTabStyleClass = null;
private String _activeSubStyleClass = null;
private String _inactiveSubStyleClass = null;
private String _tabContentStyleClass = null;
private Boolean _serverSideTabSwitch = null;
private String _activePanelTabVar;
public HtmlPanelTabbedPane()
{
setRendererType(DEFAULT_RENDERER_TYPE);
}
public String getFamily()
{
return COMPONENT_FAMILY;
}
public String getActiveTabVar() {
if (_activePanelTabVar != null) return _activePanelTabVar;
ValueBinding vb = getValueBinding("activeTabVar");
return vb != null ? _ComponentUtils.getStringValue(getFacesContext(), vb) : null;
}
public void setActiveTabVar(String activeTabVar) {
_activePanelTabVar = activeTabVar;
}
public void setSelectedIndex(int selectedIndex)
{
_selectedIndex = new Integer(selectedIndex);
}
public int getSelectedIndex()
{
if (_selectedIndex != null) return _selectedIndex.intValue();
ValueBinding vb = getValueBinding("selectedIndex");
Number v = vb != null ? (Number)vb.getValue(getFacesContext()) : null;
return v != null ? v.intValue() : DEFAULT_SELECTEDINDEX;
}
public void setBgcolor(String bgcolor)
{
_bgcolor = bgcolor;
}
public String getBgcolor()
{
if (_bgcolor != null) return _bgcolor;
ValueBinding vb = getValueBinding("bgcolor");
return vb != null ? _ComponentUtils.getStringValue(getFacesContext(), vb) : null;
}
public void setActiveTabStyleClass(String activeTabStyleClass)
{
_activeTabStyleClass = activeTabStyleClass;
}
public String getActiveTabStyleClass()
{
if (_activeTabStyleClass != null) return _activeTabStyleClass;
ValueBinding vb = getValueBinding("activeTabStyleClass");
return vb != null ? _ComponentUtils.getStringValue(getFacesContext(), vb) : null;
}
public void setInactiveTabStyleClass(String inactiveTabStyleClass)
{
_inactiveTabStyleClass = inactiveTabStyleClass;
}
public String getInactiveTabStyleClass()
{
if (_inactiveTabStyleClass != null) return _inactiveTabStyleClass;
ValueBinding vb = getValueBinding("inactiveTabStyleClass");
return vb != null ? _ComponentUtils.getStringValue(getFacesContext(), vb) : null;
}
public void setActiveSubStyleClass(String activeSubStyleClass)
{
_activeSubStyleClass = activeSubStyleClass;
}
public String getActiveSubStyleClass()
{
if (_activeSubStyleClass != null) return _activeSubStyleClass;
ValueBinding vb = getValueBinding("activeSubStyleClass");
return vb != null ? _ComponentUtils.getStringValue(getFacesContext(), vb) : null;
}
public void setInactiveSubStyleClass(String inactiveSubStyleClass)
{
_inactiveSubStyleClass = inactiveSubStyleClass;
}
public String getInactiveSubStyleClass()
{
if (_inactiveSubStyleClass != null) return _inactiveSubStyleClass;
ValueBinding vb = getValueBinding("inactiveSubStyleClass");
return vb != null ? _ComponentUtils.getStringValue(getFacesContext(), vb) : null;
}
public void setTabContentStyleClass(String tabContentStyleClass)
{
_tabContentStyleClass = tabContentStyleClass;
}
public String getTabContentStyleClass()
{
if (_tabContentStyleClass != null) return _tabContentStyleClass;
ValueBinding vb = getValueBinding("tabContentStyleClass");
return vb != null ? _ComponentUtils.getStringValue(getFacesContext(), vb) : null;
}
public String getDisabledTabStyleClass()
{
return _disabledTabStyleClass;
}
public void setDisabledTabStyleClass(String disabledTabStyleClass)
{
this._disabledTabStyleClass = disabledTabStyleClass;
}
public boolean getServerSideTabSwitch()
{
if (_serverSideTabSwitch != null) return _serverSideTabSwitch.booleanValue();
ValueBinding vb = getValueBinding("serverSideTabSwitch");
Boolean v = vb != null ? (Boolean) vb.getValue(getFacesContext()) : null;
return v != null ? v.booleanValue() : DEFAULT_SERVER_SIDE_TAB_SWITCH;
}
public void setServerSideTabSwitch( boolean serverSideTabSwitch )
{
_serverSideTabSwitch = new Boolean( serverSideTabSwitch );
}
public Object saveState(FacesContext context)
{
Object values[] = new Object[12];
values[0] = super.saveState(context);
values[1] = _selectedIndex;
values[2] = _bgcolor;
values[3] = saveAttachedState(context, _tabChangeListener);
values[4] = _activeTabStyleClass;
values[5] = _inactiveTabStyleClass;
values[6] = _activeSubStyleClass;
values[7] = _inactiveSubStyleClass;
values[8] = _tabContentStyleClass;
values[9] = _disabledTabStyleClass;
values[10] = _serverSideTabSwitch;
values[11] = _activePanelTabVar;
return ((Object) (values));
}
public void restoreState(FacesContext context, Object state)
{
Object values[] = (Object[])state;
super.restoreState(context, values[0]);
_selectedIndex = (Integer)values[1];
_bgcolor = (String)values[2];
_tabChangeListener = (MethodBinding)restoreAttachedState(context, values[3]);
_activeTabStyleClass = (String)values[4];
_inactiveTabStyleClass = (String)values[5];
_activeSubStyleClass = (String)values[6];
_inactiveSubStyleClass = (String)values[7];
_tabContentStyleClass = (String)values[8];
_disabledTabStyleClass = (String)values[9];
_serverSideTabSwitch = (Boolean) values[10];
_activePanelTabVar = (String) values[11];
}
//------------------ GENERATED CODE END ---------------------------------------
}