Thank you very much, Simon and Adam!
With (slowly but surely) growing insight,
Carsten
Adam Winer wrote:
>
> The critical thing, which is easy to overlook, is that you
> have to pass your component's Type object to the Renderer
> superclasses constructor, which is what Simon's code is doing.
>
> -- Adam
>
>
>
> On 8/14/07, Simon Lessard <[EMAIL PROTECTED]> wrote:
>> Hello Carsten,
>>
>> Trinidad input components, as you most likely figured, include a label
>> and
>> its message. However, to allow maximum reuse, its renderer is splitted in
>> two. There's always the "label and message renderer", ie
>> InputTextRenderer
>> that render the layout including the label and message and also delegate
>> some work to the "field renderer" which is SimpleInputTextRenderer in the
>> case of CoreInputText component. The shortDesc attribute is rendered on
>> the
>> field part so, for your override of getShortDesc to work, you'll have to
>> also override SimpleInputTextRenderer and have your new
>> InputTextRenderer's
>> getFormInputRenderer returns your new SimpleInputTextRenderer.
>>
>> Here's a small example:
>>
>> public class MyNewInputTextRenderer extends InputTextRenderer
>> {
>> public MyNewInputTextRenderer()
>> {
>> this(MyNewInputComponent.TYPE);
>> }
>>
>> protected MyNewInputTextRenderer(FacesBean.Type type)
>> {
>> super(type);
>> }
>>
>> @Override
>> protected void findTypeConstants(FacesBean.Type type)
>> {
>> super.findTypeConstants(type);
>> simpleRenderer = new
>> MyNewSimpleInputTextRenderer(type);
>> }
>>
>> @Override
>> protected FormInputRenderer getFormInputRenderer()
>> {
>> return simpleRenderer;
>> }
>>
>> private FormInputRenderer simpleRenderer;
>> }
>>
>> public class MyNewSimpleInputTextRenderer extends SimpleInputTextRenderer
>> {
>> public MyNewSimpleInputTextRenderer(FacesBean.Type type)
>> {
>> super(type);
>> }
>>
>> @Override
>> protected String getShortDesc(FacesBean bean)
>> {
>> return super.getShortDesc (bean) + whateverExtraInfo;
>> }
>> }
>>
>> Regads,
>>
>> ~ Simon
>>
>>
>>
>> On 8/14/07, Carsten Pieper < [EMAIL PROTECTED]> wrote:
>> >
>> > Hi,
>> >
>> > I tried to debug the strange InputTextRenderer behaviour (in short: the
>> > result of
>> > my getShortDesc(FacesBean) seems to be overruled somehow) without any
>> big
>> > clue
>> > where to start...
>> >
>> > Well, I put a breakpoint in the
>> > org.apache.myfaces.trinidad.bean.FacesBeanImpl's
>> > method setProperty(PropertyKey key, Object value) and looked at the
>> millions
>> > of keys and
>> > values. When I almost gave up, I finally saw my "original" shortDesc as
>> > value (and
>> > shortDesc as key...). This is what the stack looked like:
>> >
>> > Thread [btpool0-1] (Suspended (breakpoint at line 100 in
>> FacesBeanImpl))
>> >
>> UIXEditableFacesBeanImpl(FacesBeanImpl).setProperty(PropertyKey,
>> Object)
>> > line: 100
>> > UIXEditableFacesBeanImpl.setProperty(PropertyKey,
>> Object) line: 33
>> >
>> CoreInputText(UIXComponentBase).setProperty(PropertyKey,
>> Object) line: 1112
>> > CoreInputText.setShortDesc(String) line: 305
>> > NativeMethodAccessorImpl.invoke0(Method, Object,
>> Object[]) line: not
>> > available [native method]
>> > NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
>> > DelegatingMethodAccessorImpl.invoke(Object,
>> Object[]) line: 25
>> > Method.invoke(Object, Object...) line: 585
>> >
>>
>> BeanPropertyTagRule$LiteralPropertyMetadata.applyMetadata(FaceletContext,
>> > Object) line: 49
>> > MetadataImpl.applyMetadata(FaceletContext, Object) line: 36
>> >
>>
>> TrinidadComponentHandler(MetaTagHandler).setAttributes(FaceletContext,
>> > Object) line: 62
>> >
>> TrinidadComponentHandler(ComponentHandler).apply(FaceletContext,
>> > UIComponent) line: 144
>> > DefineHandler.apply(FaceletContext, UIComponent) line: 58
>> > CompositionHandler.apply(FaceletContext, UIComponent, String)
>> line: 128
>> >
>> DefaultFaceletContext$TemplateManager.apply(FaceletContext,
>> UIComponent,
>> > String) line: 306
>> >
>> DefaultFaceletContext.includeDefinition(UIComponent,
>> String) line: 279
>> > InsertHandler.apply(FaceletContext, UIComponent) line: 68
>> > CompositeFaceletHandler.apply(FaceletContext, UIComponent)
>> line:
>> 47
>> >
>>
>> TrinidadComponentHandler(ComponentHandler).applyNextHandler(FaceletContext,
>> > UIComponent) line: 314
>> >
>> TrinidadComponentHandler(ComponentHandler).apply(FaceletContext,
>> > UIComponent) line: 169
>> > CompositeFaceletHandler.apply(FaceletContext, UIComponent)
>> line:
>> 47
>> >
>>
>> TrinidadComponentHandler(ComponentHandler).applyNextHandler(FaceletContext,
>> > UIComponent) line: 314
>> >
>> TrinidadComponentHandler(ComponentHandler).apply(FaceletContext,
>> > UIComponent) line: 169
>> >
>>
>> TrinidadComponentHandler(ComponentHandler).applyNextHandler(FaceletContext,
>> > UIComponent) line: 314
>> >
>> TrinidadComponentHandler(ComponentHandler).apply(FaceletContext,
>> > UIComponent) line: 169
>> > CompositeFaceletHandler.apply(FaceletContext, UIComponent)
>> line:
>> 47
>> >
>>
>> TrinidadComponentHandler(ComponentHandler).applyNextHandler(FaceletContext,
>> > UIComponent) line: 314
>> >
>> TrinidadComponentHandler(ComponentHandler).apply(FaceletContext,
>> > UIComponent) line: 169
>> > NamespaceHandler.apply(FaceletContext, UIComponent) line: 49
>> > CompositeFaceletHandler.apply(FaceletContext, UIComponent)
>> line:
>> 47
>> > EncodingHandler.apply(FaceletContext, UIComponent) line: 25
>> > DefaultFacelet.include(DefaultFaceletContext, UIComponent)
>> line:
>> 248
>> > DefaultFacelet.include(DefaultFaceletContext, UIComponent, URL)
>> line: 294
>> > DefaultFacelet.include(DefaultFaceletContext, UIComponent,
>> String)
>> line:
>> > 273
>> > DefaultFaceletContext.includeFacelet(UIComponent,
>> String) line: 143
>> > CompositionHandler.apply(FaceletContext, UIComponent) line: 113
>> > NamespaceHandler.apply(FaceletContext, UIComponent) line: 49
>> > EncodingHandler.apply(FaceletContext, UIComponent) line: 25
>> > DefaultFacelet.apply(FacesContext, UIComponent) line: 95
>> > FaceletViewHandler.buildView(FacesContext, UIViewRoot) line:
>> 503
>> > FaceletViewHandler.renderView(FacesContext, UIViewRoot) line:
>> 546
>> > ViewHandlerImpl.renderView(FacesContext, UIViewRoot) line: 182
>> > RenderResponseExecutor.execute(FacesContext) line: 41
>> > LifecycleImpl.render (FacesContext) line: 138
>> > FacesServlet.service(ServletRequest, ServletResponse) line: 141
>> > ServletHolder.handle(ServletRequest, ServletResponse) line: 487
>> >
>> ServletHandler$CachedChain.doFilter(ServletRequest,
>> ServletResponse) line:
>> > 1098
>> >
>> TrinidadFilterImpl._invokeDoFilter(ServletRequest,
>> ServletResponse,
>> > FilterChain) line: 241
>> > TrinidadFilterImpl._doFilterImpl(ServletRequest,
>> ServletResponse,
>> > FilterChain) line: 198
>> > TrinidadFilterImpl.doFilter(ServletRequest, ServletResponse,
>> FilterChain)
>> > line: 152
>> > TrinidadFilter.doFilter(ServletRequest, ServletResponse,
>> FilterChain) line:
>> > 92
>> >
>> ServletHandler$CachedChain.doFilter(ServletRequest,
>> ServletResponse) line:
>> > 1089
>> > ServletHandler(ServletHandler).handle(String,
>> HttpServletRequest,
>> > HttpServletResponse, int) line: 365
>> > SecurityHandler.handle(String, HttpServletRequest,
>> HttpServletResponse,
>> > int) line: 216
>> > SessionHandler.handle(String, HttpServletRequest,
>> HttpServletResponse, int)
>> > line: 181
>> > WebAppContext(ContextHandler).handle(String,
>> HttpServletRequest,
>> > HttpServletResponse, int) line: 712
>> > WebAppContext.handle(String, HttpServletRequest,
>> HttpServletResponse, int)
>> > line: 405
>> > ContextHandlerCollection.handle(String, HttpServletRequest,
>> > HttpServletResponse, int) line: 211
>> > HandlerCollection.handle (String, HttpServletRequest,
>> HttpServletResponse,
>> > int) line: 114
>> > Server(HandlerWrapper).handle(String,
>> HttpServletRequest,
>> > HttpServletResponse, int) line: 139
>> > Server.handle(HttpConnection) line: 285
>> > HttpConnection.handleRequest() line: 502
>> > HttpConnection$RequestHandler.headerComplete()
>> line: 821
>> > HttpParser.parseNext() line: 513
>> > HttpParser.parseAvailable() line: 208
>> > HttpConnection.handle() line: 378
>> >
>>
>> SelectChannelConnector$ConnectorEndPoint(SelectChannelEndPoint).run()
>> line:
>> > 368
>> > BoundedThreadPool$PoolThread.run() line: 442
>> >
>> > Note:
>> > I don't know, if this is important in this context, but I forgot to say
>> (and
>> > you'll notice
>> > by looking at the stack), we're working in a Facelets context.
>> >
>> > One thing which I notice in the stack is that the CoreInputText's
>> > setShortDesc(String) is
>> > called. Setting a breakpoint there shows that it's just called once per
>> > inputText instance,
>> > setting the original shortDesc and not the "concatenated" one.
>> >
>> > I got the impression, that this one call sets the shortDesc in the
>> > FacesBeanImpl instance
>> > which then somehow "wins over" my
>> > InputTextExtRenderer.getShortDesc(FacesBean).
>> > Am I right about this and if yes, is this the expected behaviour or is
>> > something wrong there?
>> >
>> > By the way, does the CoreInputText come into play via the
>> > InputTextRenderer's constructor (shown below) or is there some other
>> > mechanism?
>> >
>> > public InputTextRenderer()
>> > {
>> > super(CoreInputText.TYPE);
>> > }
>> >
>> > Help would be greatly appreciated,
>> > Carsten
>> >
>> >
>> >
>> > Carsten Pieper wrote:
>> > >
>> > > Hi,
>> > >
>> > > as Simon adviced, I'm implementing the getXyz(FacesBean) methods now.
>> In
>> > > my
>> > > new OutputTextSkinnedRenderer (extending CoreOutputTextRenderer) this
>> > > method
>> > > worked fine (if no tooltip is given, the value itself should be
>> presented,
>> > > if a tooltip
>> > > is given, original tooltip and value should both she shown):
>> > >
>> > > @Override
>> > > protected String getShortDesc(FacesBean bean)
>> > > {
>> > > String originalShortDesc = super.getShortDesc(bean);
>> > > String shortDesc = null;
>> > > String valueAsString = (String) getValue(bean);
>> > >
>> > > if (originalShortDesc != null && originalShortDesc.length() > 0)
>> > > {
>> > > shortDesc = originalShortDesc + " - Field value: " +
>> valueAsString;
>> > > }
>> > > else
>> > > {
>> > > shortDesc = valueAsString;
>> > > }
>> > >
>> > > return shortDesc;
>> > > }
>> > >
>> > > The same method also works fine in OutputTextExtRenderer (extends
>> > > OutputTextRenderer).
>> > >
>> > > A similar method (with slight variations as there seems to be no
>> > > getValue(FacesBean)
>> > > neither in InputTextRenderer nor in the rest of the hierarchy) in
>> > > InputTextExtRenderer (extends InputTextRenderer) doesn't lead to the
>> > > desired
>> > > result.
>> > >
>> > > If a shortDesc is defined, only this and not the concatenated form is
>> > > presented as tooltip.
>> > > The method itself still seems to function properly, but I got the
>> > > impression, that afterwards
>> > > something else is called, which then resets the shortDesc to "just
>> the
>> > > shortDesc" :-O
>> > >
>> > > Any ideas?
>> > >
>> > > Thanks in advance,
>> > > Carsten
>> > >
>> > >
>> > >
>> > > Carsten Pieper wrote:
>> > >>
>> > >> 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#a12145017
>> > Sent from the MyFaces - Users mailing list archive at Nabble.com.
>> >
>> >
>>
>>
>
>
--
View this message in context:
http://www.nabble.com/-Trinidad--Skinning---no-CSS-selector-for-tr%3AoutputText--tf4247489.html#a12156801
Sent from the MyFaces - Users mailing list archive at Nabble.com.