Thanks a lot for the valued advice, Simon and Martin,
so I'll have a go at Simon's recommendation. Just a question concerning your
remarks
to my approach with pushing things into the bean: Would that approach be OK,
if I'd tidied everything up? Something like the following (in my overwritten
encodeAll(...)):
// storing old bean values, altering bean values...
super.encodeAll(context, arc, component, bean);
// restoring old bean values
Well, this (incl. tidying up) is how I've been showed to do this but
probably I've been a little
careless as I've never made use of these onkeyxxx properties ...
Best regards,
Carsten
Martin Marinschek wrote:
>
> 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
>
>
--
View this message in context:
http://www.nabble.com/-Trinidad--Skinning---no-CSS-selector-for-tr%3AoutputText--tf4247489.html#a12139094
Sent from the MyFaces - Users mailing list archive at Nabble.com.