Just as added information: what Simon says holds true also for
standard JSF (non-Trinidad components)...

regards,

Martin

On 8/13/07, Simon Lessard <[EMAIL PROTECTED]> wrote:
> 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.
> > >
> > >
> >
> >
>
>


-- 

http://www.irian.at

Your JSF powerhouse -
JSF Consulting, Development and
Courses in English and German

Professional Support for Apache MyFaces

Reply via email to