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 static org.apache.myfaces.tobago.TobagoConstants.ATTR_READONLY;
022    import org.apache.myfaces.tobago.util.MessageFactory;
023    
024    import javax.faces.application.FacesMessage;
025    import javax.faces.context.FacesContext;
026    import javax.faces.el.ValueBinding;
027    import java.io.IOException;
028    
029    /*
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      private Boolean readonly;
041    
042      public void restoreState(FacesContext context, Object state) {
043        Object[] values = (Object[]) state;
044        super.restoreState(context, values[0]);
045        markup = (String[]) values[1];
046        tabIndex = (Integer) values[2];
047        readonly = (Boolean) values[3];
048      }
049    
050      public Object saveState(FacesContext context) {
051        Object[] values = new Object[4];
052        values[0] = super.saveState(context);
053        values[1] = markup;
054        values[2] = tabIndex;
055        values[3] = readonly;
056        return values;
057      }
058    
059      public void encodeBegin(FacesContext facesContext) throws IOException {
060        // TODO change this should be renamed to DimensionUtils.prepare!!!
061        UILayout.getLayout(this).layoutBegin(facesContext, this);
062        super.encodeBegin(facesContext);
063      }
064    
065      public void validate(FacesContext facesContext) {
066        if (isRequired() && !isReadonly()) {
067    
068          Object submittedValue = getSubmittedValue();
069          if (submittedValue == null || "".equals(submittedValue)) {
070            FacesMessage facesMessage = MessageFactory.createFacesMessage(
071                facesContext, MESSAGE_VALUE_REQUIRED, FacesMessage.SEVERITY_ERROR);
072            facesContext.addMessage(getClientId(facesContext), facesMessage);
073            setValid(false);
074          }
075        }
076        super.validate(facesContext);
077      }
078    
079      public String[] getMarkup() {
080        if (markup != null) {
081          return markup;
082        }
083        return ComponentUtil.getMarkupBinding(getFacesContext(), this);
084      }
085    
086      public void setMarkup(String[] markup) {
087        this.markup = markup;
088      }
089    
090      public Integer getTabIndex() {
091        if (tabIndex != null) {
092          return tabIndex;
093        }
094        ValueBinding vb = getValueBinding(ATTR_TAB_INDEX);
095        if (vb != null) {
096          Number number = (Number) vb.getValue(getFacesContext());
097          if (number != null) {
098            return Integer.valueOf(number.intValue());
099          }
100        }
101        return null;
102      }
103    
104      public void setTabIndex(Integer tabIndex) {
105        this.tabIndex = tabIndex;
106      }
107    
108      public boolean isReadonly() {
109        if (readonly != null) {
110           return readonly;
111        }
112        javax.faces.el.ValueBinding vb = getValueBinding(ATTR_READONLY);
113        if (vb != null) {
114          Boolean bool = (Boolean) vb.getValue(getFacesContext());
115          if (bool != null) {
116            return bool;
117          }
118        }
119        return false;
120      }
121    
122      public void setReadonly(boolean readonly) {
123        this.readonly = readonly;
124      }
125    }