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. > > > > >