Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8098032

Add contentFilter property to TextInputControl

    XMLWordPrintable

    Details

    • Type: Enhancement
    • Status: Resolved
    • Priority: P3
    • Resolution: Duplicate
    • Affects Version/s: 8
    • Fix Version/s: 8u40
    • Component/s: javafx

      Description

      http://mail.openjdk.java.net/pipermail/openjfx-dev/2012-December/004685.html

      Mark Claassen proposed an API that seemed really simple and straightforward and allowed developers to add filtering capabilities very easily to TextInputControls. Here is the idea:

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

        Attachments

        1. rt-30881_14000_proposal.patch
          65 kB
        2. rt-30881_8u20.diff
          52 kB
        3. RT-30881.01.zip
          411 kB
        4. RT-30881.02.zip
          377 kB
        5. RT-30881.diff
          22 kB

          Issue Links

            Activity

              People

              Assignee:
              msladecek Martin Sládeček
              Reporter:
              rbair Richard Bair (Inactive)
              Votes:
              1 Vote for this issue
              Watchers:
              10 Start watching this issue

                Dates

                Created:
                Updated:
                Resolved:
                Imported: