001    package org.apache.myfaces.tobago.component;
002    
003    /*
004     * Licensed to the Apache Software Foundation (ASF) under one or more
005     * contributor license agreements.  See the NOTICE file distributed with
006     * this work for additional information regarding copyright ownership.
007     * The ASF licenses this file to You under the Apache License, Version 2.0
008     * (the "License"); you may not use this file except in compliance with
009     * the License.  You may obtain a copy of the License at
010     *
011     *      http://www.apache.org/licenses/LICENSE-2.0
012     *
013     * Unless required by applicable law or agreed to in writing, software
014     * distributed under the License is distributed on an "AS IS" BASIS,
015     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016     * See the License for the specific language governing permissions and
017     * limitations under the License.
018     */
019    
020    import static org.apache.myfaces.tobago.TobagoConstants.ATTR_TAB_INDEX;
021    import org.apache.myfaces.tobago.util.MessageFactory;
022    
023    import javax.faces.application.FacesMessage;
024    import javax.faces.context.FacesContext;
025    import javax.faces.el.ValueBinding;
026    import java.io.IOException;
027    
028    /*
029     * User: weber
030     * Date: May 31, 2005
031     * Time: 7:47:11 PM
032     */
033    public class UISelectOne extends javax.faces.component.UISelectOne implements SupportsMarkup {
034    
035      public static final String COMPONENT_TYPE = "org.apache.myfaces.tobago.SelectOne";
036      public static final String MESSAGE_VALUE_REQUIRED = "tobago.SelectOne.MESSAGE_VALUE_REQUIRED";
037    
038      private String[] markup;
039      private Integer tabIndex;
040    
041      public void restoreState(FacesContext context, Object state) {
042        Object[] values = (Object[]) state;
043        super.restoreState(context, values[0]);
044        markup = (String[]) values[1];
045        tabIndex = (Integer) values[2];
046      }
047    
048      public Object saveState(FacesContext context) {
049        Object[] values = new Object[3];
050        values[0] = super.saveState(context);
051        values[1] = markup;
052        values[2] = tabIndex;
053        return values;
054      }
055    
056      public void encodeBegin(FacesContext facesContext) throws IOException {
057        // TODO change this should be renamed to DimensionUtils.prepare!!!
058        UILayout.getLayout(this).layoutBegin(facesContext, this);
059        super.encodeBegin(facesContext);
060      }
061    
062      public void validate(FacesContext facesContext) {
063        if (isRequired()) {
064    
065          Object submittedValue = getSubmittedValue();
066          if (submittedValue == null || "".equals(submittedValue)) {
067            FacesMessage facesMessage = MessageFactory.createFacesMessage(
068                facesContext, MESSAGE_VALUE_REQUIRED, FacesMessage.SEVERITY_ERROR);
069            facesContext.addMessage(getClientId(facesContext), facesMessage);
070            setValid(false);
071          }
072        }
073        super.validate(facesContext);
074      }
075    
076      public String[] getMarkup() {
077        if (markup != null) {
078          return markup;
079        }
080        return ComponentUtil.getMarkupBinding(getFacesContext(), this);
081      }
082    
083      public void setMarkup(String[] markup) {
084        this.markup = markup;
085      }
086    
087      public Integer getTabIndex() {
088        if (tabIndex != null) {
089          return tabIndex;
090        }
091        ValueBinding vb = getValueBinding(ATTR_TAB_INDEX);
092        if (vb != null) {
093          Number number = (Number) vb.getValue(getFacesContext());
094          if (number != null) {
095            return Integer.valueOf(number.intValue());
096          }
097        }
098        return null;
099      }
100    
101      public void setTabIndex(Integer tabIndex) {
102        this.tabIndex = tabIndex;
103      }
104    
105    }