I've filed https://javafx-jira.kenai.com/browse/RT-30881 and hoping to get this 
resolved for 8.

Richard

On Dec 4, 2012, at 8:23 AM, Richard Bair <richard.b...@oracle.com> wrote:

> Hi Mark,
> 
> Sorry for being slow -- you will at least be glad to know you are in such 
> auspicious company as Jonathan Giles, who has to regularly bribe (or 
> threaten) me to get timely responses :-)
> 
> On first read, this seems very nice. The Filter interface is a 
> single-abstract-method interface, so it will play perfectly well with 
> Lambda's. It can be reused among multiple controls and types of text input 
> controls which seems ideal. It seems to plug into the pipeline quite 
> naturally.
> 
> One question is, should the filter start off as null and have an additional 
> filter (newlines and such) always applied, or should it start out as non-null 
> where the built in filter handles newlines (and such) and new filters also 
> will have to either wrap the existing filter or add support for newlines (and 
> such!) or not as necessary? The safest thing for an implementor would be to 
> delegate in case we change the built-in behavior.
> 
> The next step would be to create a diff and attach it to the JIRA issue (and 
> make sure you have signed the Oracle Contributor Agreement (OCA)). I think we 
> can then integrate the patch and start the discussion around formatted text 
> field. Jonathan, what do you think? Have you had a chance to review?
> 
> Thanks
> Richard
> 
> On Nov 26, 2012, at 7:44 PM, Mark Claassen <markclaass...@gmail.com> wrote:
> 
>> I sent a potential API change to Richard Bair a few weeks ago.  He has not
>> responded to me, which makes me think it was too complicated at this point
>> and wasn't going to fly.  I think for a good InputMaskField, the Content
>> and the eventual caret position and selection needs to be controlled by the
>> "model".  This makes the solution a bit complex.
>> 
>> However, for filtering, this is not the case.  Doing both of these in one
>> shot is, perhaps, a mistake.  Here is another idea which takes care of the
>> easy cases...easily.  A more complex InputMask control I will save for
>> later.
>> 
>> So, here is the simplified idea:  Add the ability to "filter".  And by
>> filter, I mean the ability to modify the input and only the input:
>> 
>> Add the following sub-interface to the Content interface.  No methods are
>> added to the Content interface.
>>   interface Filter {
>>        String filter(int index, String text, String currentContent);
>>   }
>> 
>> Add the following to TextFieldContent and TextAreaContent:
>>   private Content.Filter filter;
>>   public void setContentFilter(Content.Filter filter) {
>>        this.filter = filter;
>>   }
>> 
>> Change the "insert" method of TextFieldContent and TextAreaContent to start
>> with:
>>   @Override public void insert(int index, String text, boolean
>> notifyListeners) {
>>        text = TextInputControl.filterInput(text, [boolean], [boolean]);
>>        if (filter != null)
>>             text = filter.filter(index, text, get());
>> 
>> Add a method in TextField:
>>   public void setContentFilter(Content.Filter filter) {
>>        ((TextFieldContent)getContent()).setContentFilter(filter);
>>   }
>> 
>> Add a method in TextArea:
>>   public void setContentFilter(Content.Filter filter) {
>>        ((TextAreaContent)getContent()).setContentFilter(filter);
>>   }
>> 
>> This would do a few things:
>> 1) Use the current "TextInputControl.filterInput" mechanisms of TextField
>> and TextArea (like to strip out special chars and newlines).
>> 2) By specifying the Filter interface outside of TextField and TextArea, it
>> allows the same filter to be used for TextField and TextArea
>> 3) Makes it simple to do things like translate all input to upper case or
>> limit the overall length
>> 4) By not adding a method to Content directly, something like the
>> InputMaskContent would not be forced to deal with the Filter interface at
>> all.
>> 
>> This implementation would allow someone creating a filter to "filter" the
>> text to have illegal characters.  I thought it was more validate this
>> first, so that the implementer would only have to deal with proper input.
>> However, TextInputControl.filterInput could be done both before and after
>> the Filter.filter() call.
>>        text = TextInputControl.filterInput(text, [boolean], [boolean]);
>>        if (filter != null) {
>>             text = filter.filter(index, text, get());
>>             text = TextInputControl.filterInput(text, [boolean],
>> [boolean]);
>>        }
>> 
>> Another possible addition to this may be to allow the filter to return
>> null, signifying an error input and causing the system to "beep".
>> 
>> Thanks for your consideration,
>> Mark
> 

Reply via email to