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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to