You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Adam Zimowski <zi...@gmail.com> on 2008/03/20 11:55:23 UTC
[T5] Why is TextField a final class?
I need to save some additional state into textfield, something similar
to form context. I would have simply done:
public class TextFieldWithMap extends TextField {
@Parameter(defaultPrefix="prop")
private Map<String, Object> _dataMap;
public void setDataMap(Map<String, Object> aDataMap) {
_dataMap = aDataMap;
}
public Object getDataValue(String aKey) {
try { return _dataMap.get(aKey); }
catch(NullPointerException npe) { return null; }
}
}
but TextField is a final class. Instead, I had to duplicate Tapestry
code and extend AbstractTextField:
public class TextFieldWithMap extends AbstractTextField {
@Parameter(defaultPrefix="prop")
private Map<String, Object> _dataMap;
// This is very UGLY (copied from TextField)
@Override
protected final void writeFieldTag(MarkupWriter aWriter, String aValue) {
aWriter.element(
"input","type", "text","name",
getControlName(),"id", getClientId(),
"value", aValue,"size", getWidth());
}
// This too, is very UGLY (copied from TextField)
final void afterRender(MarkupWriter writer) {
writer.end();
}
public void setDataMap(Map<String, Object> aDataMap) {
_dataMap = aDataMap;
}
public Object getDataValue(String aKey) {
try { return _dataMap.get(aKey); }
catch(NullPointerException npe) { return null; }
}
}
My TextFieldWithMap component works as expected, I'm only asking what
are the reasons for TextField being a final class, and is my way of
building TextFieldWithMap typical "Tapestry 5" approach or should I do
it differently.
-adam
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org
Re: [T5] Why is TextField a final class?
Posted by Adam Zimowski <zi...@gmail.com>.
Hmmm.... but this way requires I have a markup, doesn't it? All I want
is to "decorate" existing text field to carry attached map which can
be populated with arbitrary bits of data. This isn't even a change to
how the component works visually. Plus, assuming that this works, I'm
loosing all the method of TextField component such as getClientId()
getLabel() etc. I could generate delegates, but then I'm loosing
JavaDoc for those methods.
A natural way as I see this would be to extend TextField class, but
again it's final. Another interesting thing is that on Tapestry 5
website, specifically here:
http://tapestry.apache.org/tapestry5/tapestry-core/guide/mixins.html
under "Implementation Mixins" section, there is example where
AutocompleteField extends TextField.
-adam
On Thu, Mar 20, 2008 at 6:13 AM, Kristian Marinkovic
<kr...@porsche.co.at> wrote:
> there is a new way in tapestry (i think since 5.0.11) to inherit
> from (core) components. all you need to do is let your
> component have a reference to the component it wants to
> extend. futhermore the inheritInformalParameters of the
> @Component annotation has to be set to true...
>
>
> public class MyTextField() {
> @Component(inheritInformalParameters=true,...)
> private TextField field;
>
> }
>
> g,
> kris
>
>
>
>
>
> "Adam Zimowski" <zi...@gmail.com>
> 20.03.2008 11:58
> Bitte antworten an
> "Tapestry users" <us...@tapestry.apache.org>
>
>
> An
> "Tapestry users" <us...@tapestry.apache.org>
> Kopie
>
> Thema
> Re: [T5] Why is TextField a final class?
>
>
>
>
>
>
>
>
>
> Is this the situation where Mixin could be of good use?
>
> On Thu, Mar 20, 2008 at 5:55 AM, Adam Zimowski <zi...@gmail.com>
> wrote:
> > I need to save some additional state into textfield, something similar
> > to form context. I would have simply done:
> >
> > public class TextFieldWithMap extends TextField {
> >
> > @Parameter(defaultPrefix="prop")
> > private Map<String, Object> _dataMap;
> >
> >
> > public void setDataMap(Map<String, Object> aDataMap) {
> > _dataMap = aDataMap;
> > }
> >
> > public Object getDataValue(String aKey) {
> > try { return _dataMap.get(aKey); }
> > catch(NullPointerException npe) { return null; }
> > }
> > }
> >
> > but TextField is a final class. Instead, I had to duplicate Tapestry
> > code and extend AbstractTextField:
> >
> > public class TextFieldWithMap extends AbstractTextField {
> >
> > @Parameter(defaultPrefix="prop")
> > private Map<String, Object> _dataMap;
> >
> >
> > // This is very UGLY (copied from TextField)
> > @Override
> > protected final void writeFieldTag(MarkupWriter aWriter, String
> aValue) {
> > aWriter.element(
> > "input","type", "text","name",
> > getControlName(),"id", getClientId(),
> > "value", aValue,"size", getWidth());
> > }
> >
> > // This too, is very UGLY (copied from TextField)
> > final void afterRender(MarkupWriter writer) {
> > writer.end();
> > }
> >
> > public void setDataMap(Map<String, Object> aDataMap) {
> > _dataMap = aDataMap;
> > }
> >
> > public Object getDataValue(String aKey) {
> > try { return _dataMap.get(aKey); }
> > catch(NullPointerException npe) { return null; }
> > }
> > }
> >
> > My TextFieldWithMap component works as expected, I'm only asking what
> > are the reasons for TextField being a final class, and is my way of
> > building TextFieldWithMap typical "Tapestry 5" approach or should I do
> > it differently.
> >
> > -adam
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
> For additional commands, e-mail: users-help@tapestry.apache.org
>
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org
Re: [T5] Why is TextField a final class?
Posted by Kristian Marinkovic <kr...@porsche.co.at>.
there is a new way in tapestry (i think since 5.0.11) to inherit
from (core) components. all you need to do is let your
component have a reference to the component it wants to
extend. futhermore the inheritInformalParameters of the
@Component annotation has to be set to true...
public class MyTextField() {
@Component(inheritInformalParameters=true,...)
private TextField field;
}
g,
kris
"Adam Zimowski" <zi...@gmail.com>
20.03.2008 11:58
Bitte antworten an
"Tapestry users" <us...@tapestry.apache.org>
An
"Tapestry users" <us...@tapestry.apache.org>
Kopie
Thema
Re: [T5] Why is TextField a final class?
Is this the situation where Mixin could be of good use?
On Thu, Mar 20, 2008 at 5:55 AM, Adam Zimowski <zi...@gmail.com>
wrote:
> I need to save some additional state into textfield, something similar
> to form context. I would have simply done:
>
> public class TextFieldWithMap extends TextField {
>
> @Parameter(defaultPrefix="prop")
> private Map<String, Object> _dataMap;
>
>
> public void setDataMap(Map<String, Object> aDataMap) {
> _dataMap = aDataMap;
> }
>
> public Object getDataValue(String aKey) {
> try { return _dataMap.get(aKey); }
> catch(NullPointerException npe) { return null; }
> }
> }
>
> but TextField is a final class. Instead, I had to duplicate Tapestry
> code and extend AbstractTextField:
>
> public class TextFieldWithMap extends AbstractTextField {
>
> @Parameter(defaultPrefix="prop")
> private Map<String, Object> _dataMap;
>
>
> // This is very UGLY (copied from TextField)
> @Override
> protected final void writeFieldTag(MarkupWriter aWriter, String
aValue) {
> aWriter.element(
> "input","type", "text","name",
> getControlName(),"id", getClientId(),
> "value", aValue,"size", getWidth());
> }
>
> // This too, is very UGLY (copied from TextField)
> final void afterRender(MarkupWriter writer) {
> writer.end();
> }
>
> public void setDataMap(Map<String, Object> aDataMap) {
> _dataMap = aDataMap;
> }
>
> public Object getDataValue(String aKey) {
> try { return _dataMap.get(aKey); }
> catch(NullPointerException npe) { return null; }
> }
> }
>
> My TextFieldWithMap component works as expected, I'm only asking what
> are the reasons for TextField being a final class, and is my way of
> building TextFieldWithMap typical "Tapestry 5" approach or should I do
> it differently.
>
> -adam
>
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org
Re: [T5] Why is TextField a final class?
Posted by Adam Zimowski <zi...@gmail.com>.
Is this the situation where Mixin could be of good use?
On Thu, Mar 20, 2008 at 5:55 AM, Adam Zimowski <zi...@gmail.com> wrote:
> I need to save some additional state into textfield, something similar
> to form context. I would have simply done:
>
> public class TextFieldWithMap extends TextField {
>
> @Parameter(defaultPrefix="prop")
> private Map<String, Object> _dataMap;
>
>
> public void setDataMap(Map<String, Object> aDataMap) {
> _dataMap = aDataMap;
> }
>
> public Object getDataValue(String aKey) {
> try { return _dataMap.get(aKey); }
> catch(NullPointerException npe) { return null; }
> }
> }
>
> but TextField is a final class. Instead, I had to duplicate Tapestry
> code and extend AbstractTextField:
>
> public class TextFieldWithMap extends AbstractTextField {
>
> @Parameter(defaultPrefix="prop")
> private Map<String, Object> _dataMap;
>
>
> // This is very UGLY (copied from TextField)
> @Override
> protected final void writeFieldTag(MarkupWriter aWriter, String aValue) {
> aWriter.element(
> "input","type", "text","name",
> getControlName(),"id", getClientId(),
> "value", aValue,"size", getWidth());
> }
>
> // This too, is very UGLY (copied from TextField)
> final void afterRender(MarkupWriter writer) {
> writer.end();
> }
>
> public void setDataMap(Map<String, Object> aDataMap) {
> _dataMap = aDataMap;
> }
>
> public Object getDataValue(String aKey) {
> try { return _dataMap.get(aKey); }
> catch(NullPointerException npe) { return null; }
> }
> }
>
> My TextFieldWithMap component works as expected, I'm only asking what
> are the reasons for TextField being a final class, and is my way of
> building TextFieldWithMap typical "Tapestry 5" approach or should I do
> it differently.
>
> -adam
>
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org