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