Hello again,

I forgot to mention another issue with pushing values in the FacesBean
inside renderer code. Assume that your styleClass attribute is set to an EL.
If the EL returns "readOnly" during a rendering, you're going to alter the
component attributes permanently and the JavaScript events will continue to
return false even if the styleClass is no longer "readOnly" for further
requests.


Regards,

~ Simon

On 8/13/07, Simon Lessard <[EMAIL PROTECTED]> wrote:
>
> Hello Carsten,
>
> You shouldn't alter the bean value in the renderer. It's not right to do
> so. Instead, you should override the various getXyz(FacesBean) method of the
> renderer. This will ensure that you safely overhaul all properties without
> pushing value strange values in the saved state.
>
> Also, since the renderer is the most complex part of component creation,
> why don't you create a new custom one like outputSkinnedText or something?
> The component can extends CoreOutputText simply using a different renderer
> type. The renderer can extends CoreOutputTextRenderer and simply use the
> following code:
>
> public OutputSkinnedRenderer extends OutputTextRenderer
> {
>   public OutputSkinnedRenderer()
>   {
>     super(CoreOutputSkinned.TYPE);
>   }
>
>   public void encodeAll(FacesContext     context,
>                         RenderingContext rc,
>                         UIComponent      component,
>                         FacesBean        bean) throws IOException
>   {
>     ResponseWriter writer = context.getResponseWriter();
>
>     // Create a wrapping span
>     writer.startElement("span", component);
>
>     // Write our new skin selector
>     renderStyleClass(context, rc, "af|outputSkinnedText");
>
>     // Render the text normally
>     super.encodeAll(context, rc, component, bean);
>
>     // Close the wrapping span element
>     writer.endElement("span");
>   }
> }
>
>
> Regards,
>
> ~ Simon
>
> On 8/13/07, Carsten Pieper <[EMAIL PROTECTED]> wrote:
> >
> >
> > Hi,
> >
> > as most of you might have noticed the topic of this thread somehow
> > drifted
> > from
> > tr:outputText to tr:inputText...
> >
> > Anyhow, I implemented my option 2) (new styleClass "readOnly"), which is
> >
> > running fine except of
> > one issue (inherent to this approach with onxxx --> return false;). If
> > the
> > text is getting to long
> > for my inputText it's now accessible via the mouse but not (since the
> > onkeyxxx stuff...) via
> > the keyboard.
> >
> > If anybody is interested in this non-keyboard-only solution, here it is:
> >
> > In CSS (just note the "nested selector"; the stuff between the brackets
> > isn't important/belongs to you...):
> >
> > -----------------------------------------------------------------------------------------------------
> > .readOnly af|inputText::content{
> >     -tr-rule-ref: selector(".AFTextBackground:alias");
> >     -tr-rule-ref: selector(".MyDisplayTextBorder:alias");
> > }
> >
> > Extending InputTextRenderer:
> > ----------------------------
> > package bla;
> >
> > import java.io.IOException;
> >
> > import javax.faces.component.UIComponent;
> > import javax.faces.context.FacesContext;
> >
> > import org.apache.myfaces.trinidad.bean.FacesBean;
> > import org.apache.myfaces.trinidad.bean.PropertyKey;
> > import org.apache.myfaces.trinidad.context.RenderingContext;
> > import
> >
> > org.apache.myfaces.trinidadinternal.renderkit.core.xhtml.InputTextRenderer;
> >
> > public class InputTextExtRenderer extends InputTextRenderer
> > {
> >
> >   public InputTextExtRenderer()
> >   {
> >     super();
> >   }
> >
> >   @Override
> >   protected void findTypeConstants(FacesBean.Type type)
> >   {
> >     super.findTypeConstants(type);
> >     _styleClassKey = type.findKey("styleClass");
> >     _onkeyupKey = type.findKey("onkeyup");
> >     _onkeydownKey = type.findKey("onkeydown");
> >     _onkeypressKey = type.findKey("onkeypress");
> >   }
> >
> >   @Override
> >   protected void encodeAll(FacesContext        context,
> >       RenderingContext arc,
> >       UIComponent         component,
> >       FacesBean           bean) throws IOException
> >   {
> >     String styleClass = (String)bean.getProperty(_styleClassKey);
> >     if (READONLY_INPUT_TEXT_SELECTOR.equalsIgnoreCase(styleClass))
> >     {
> >       bean.setProperty(_onkeyupKey, RETURN_FALSE);
> >       bean.setProperty (_onkeydownKey, RETURN_FALSE);
> >       bean.setProperty(_onkeypressKey, RETURN_FALSE);
> >     }
> >
> >     super.encodeAll(context, arc, component, bean);
> >   }
> >
> >   private static String READONLY_INPUT_TEXT_SELECTOR = "readOnly";
> >   private static String RETURN_FALSE = "return false;";
> >
> >   private PropertyKey _styleClassKey;
> >   private PropertyKey _onkeyupKey;
> >   private PropertyKey _onkeydownKey;
> >   private PropertyKey _onkeypressKey;
> > }
> >
> > Configuring the faces-config.xml:
> > -------------------------------
> >                 <renderer>
> >                         <component-family>
> >                                 org.apache.myfaces.trinidad.Input
> >                         </component-family>
> >                         <renderer-type>
> >                                 org.apache.myfaces.trinidad.Text
> >                         </renderer-type>
> >                         <renderer-class>
> >
> > de.continentale.vu.jsf.base.component.trinidad.InputTextExtRenderer
> >                         </renderer-class>
> >                 </renderer>
> >
> > Using it in the JSF page:
> > -----------------------
> > <tr:inputText label="My short inputText (styleClass: readOnly;)"
> >         value="Hello inputText" contentStyle="width: 50px;"
> >         styleClass="readOnly"></tr:inputText>
> >
> > Cheers, Carsten
> >
> > -
> >
> > Carsten Pieper wrote:
> > >
> > > Hi Martin,
> > >
> > > yes, that works, thank you!
> > >
> > > Some thoughts, though:  Without touching the renderer this would mean
> > that
> > > (as in your example) the inputText's attribute readOnly must not be
> > set or
> > > else the effect of these onxxx methods returning false would be
> > bypassed.
> > >
> > > When chosing to extend the InputTextRenderer there are two options (at
> >
> > > least ;-) ):
> > >
> > > 1) If attribute readOnly (or attribute disabled; should be treated
> > equally
> > > in our application, but
> > > this, of course, isn't the default...) is set to true, do this in the
> > new
> > > renderer:
> > > - get rid of default readOnly-behaviour (which might be tricky to
> > "extract
> > > and eliminate")
> > > - set those onxxx to "return false;"
> > >
> > > 2) Alternatively, leave attribute readOnly and according behaviour
> > > untouched. Instead,
> > > - invent a new style class (e.g. "readOnly")
> > > - in the CSS, for this style class use the same settings as for
> > > "af|inputText:disabled::content"
> > > - in the renderer, if styleClass = "readOnly" set those onxxx to
> > "return
> > > false;"
> > >
> > > In principle, option 1) would be my favourite solution, but due to the
> > > intricate situation
> > > (InputTextRenderer has quite a line of ancestors...) and me being new
> > to
> > > the fine art of
> > > extending Trinidad renderers, which both makes it hard to isolate what
> > > happens where and
> > > how to replace it, I think option 2) is the way for us to go (just
> > > injecting the new behaviour
> > > for styleClass "readOnly" and delegating everything else to
> > > InputTextRenderer seems to be
> > > a lot easier...).
> > >
> > > Best regards,
> > > Carsten
> > >
> > >
> > >
> > > Martin Marinschek wrote:
> > >>
> > >> Hi Carsten,
> > >>
> > >> (for reference, I'm also posting this message in the original thread)
> > >>
> > >> I've played around with the options a bit more, and this is what
> > could
> > >> work - with this you'd have an input field (and therefore automatic
> > >> text-control by the browser), and then you could also effectively
> > >> disable the keyboard:
> > >>
> > >>   <label for="text">Textfield:</label><input id="text" name="text"
> > >> type="text" value="irgendwas" onkeyup="return false;"
> > >> onkeydown="return false;" onkeypress="return false;" />
> > >>
> > >> regards,
> > >>
> > >> Martin
> > >>
> > >> ...
> > >>
> > >> --
> > >>
> > >> http://www.irian.at
> > >>
> > >> Your JSF powerhouse -
> > >> JSF Consulting, Development and
> > >> Courses in English and German
> > >>
> > >> Professional Support for Apache MyFaces
> > >>
> > >>
> > >
> > >
> >
> > --
> > View this message in context:
> > http://www.nabble.com/-Trinidad--Skinning---no-CSS-selector-for-tr%3AoutputText--tf4247489.html#a12127815
> > Sent from the MyFaces - Users mailing list archive at Nabble.com.
> >
> >
>

Reply via email to