Ladies_Man

phon number cursor 1488 bug

May 26th, 2017
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.86 KB | None | 0 0
  1. private void setTexts() {
  2.         Locale locale = getLocale();
  3.         singInLabel.setValue(messageSource.getMessage("login.singInLabel", null, locale));
  4.         loginTextField.setCaption(messageSource.getMessage("login.login", null, locale));
  5.         loginTextField.setValue("Ext-N.Ovcharenko");
  6.         passwordTextField.setCaption(messageSource.getMessage("login.password", null, locale));
  7.         forgotLink.setCaption(messageSource.getMessage("login.forgot", null, locale));
  8.         singInButton.setCaption(messageSource.getMessage("login.singIn", null, locale));
  9.  
  10.  
  11.         TextField phoneNumberField = new TextField("phone number");
  12.         String patternPhoneExtended = "^\\+7 \\d{3} \\d{3}-\\d{2}-\\d{2}$";
  13.         Pattern patternPhoneSimple = Pattern.compile("^(8|\\+?7)\\d{10}$");
  14.         phoneNumberField.addValidator(new RegexpValidator(patternPhoneExtended, messageSource.getMessage("fieldPhoneFormat", null, locale)));
  15.         phoneNumberField.addTextChangeListener(textChangeEvent -> {
  16.             String eventString = textChangeEvent.getText();
  17.             String val = phoneNumberField.getValue();
  18.             System.out.println("txt val/event: " + val + " / " + eventString);
  19.  
  20.             phoneNumberField.setValue(eventString.replaceAll("[\\+ ()-]", ""));
  21.  
  22.             int delta = countCursorOffset(eventString, phoneNumberField.getCursorPosition());
  23.  
  24.             System.out.print("cursor: " + phoneNumberField.getCursorPosition() + " -> ");
  25.             System.out.print("(" + (delta > 0 ? "+" : "") + delta + ") -> ");
  26.             phoneNumberField.setCursorPosition(phoneNumberField.getCursorPosition() + delta);
  27.             System.out.println(phoneNumberField.getCursorPosition());
  28.         });
  29.         phoneNumberField.addValueChangeListener(valueChangeEvent -> {
  30.             String val = phoneNumberField.getValue();
  31.             Matcher m = patternPhoneSimple.matcher(val);
  32.             if (m.matches()) {
  33.                 phoneNumberField.setValue(formatPhone(val));
  34.             }
  35.         });
  36.         addComponent(phoneNumberField);
  37.     }
  38.  
  39.     private int countCursorOffset(String number, int currPos) {
  40.         final int PHONE_NUMBER_LEN = 10;
  41.         List<Character> specChars = new ArrayList<>(Arrays.asList('+', '-', ' ', '(', ')'));
  42.  
  43.         if (number.contains(" ")) {
  44.             String formattedPrefix = number.substring(0, currPos);
  45.             String originalPrefix = formattedPrefix.replaceAll("[\\+ ()-]", "");
  46.  
  47.             return originalPrefix.length() - formattedPrefix.length();
  48.  
  49.         } else {
  50.             //we cannot count formatted prefix since we do not have full valid 10-digit number yet
  51.             // so let's extend number to its full len and count prefix len as
  52.             StringBuilder sb = new StringBuilder(number);
  53.             while (sb.length() < PHONE_NUMBER_LEN)
  54.                 sb.append("9");
  55.  
  56.             String formatted = formatPhone(sb.toString());
  57.  
  58.             int i = 0, j = 0, formattedPrefixLen = 0;
  59.             while (i < currPos) {
  60.                 if (!specChars.contains(formatted.charAt(i))) {
  61.                     if (formatted.charAt(i) == number.charAt(j)) {
  62.                         formattedPrefixLen++;
  63.                         j++;
  64.                     }
  65.                 }
  66.                 i++;
  67.             }
  68.             String originalPrefix = number.substring(0, currPos);
  69.  
  70.             return formattedPrefixLen - originalPrefix.length();
  71.         }
  72.     }
  73.  
  74.     private String formatPhone(String val) {
  75.         PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();
  76.         try {
  77.             Phonenumber.PhoneNumber p = phoneNumberUtil.parse(val, "RU");
  78.             return phoneNumberUtil.format(p, PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL);
  79.         } catch (NumberParseException e) {
  80.             LOG.error(ExceptionUtils.getStackTrace(e));
  81.             return val;
  82.         }
  83.     }
Advertisement
Add Comment
Please, Sign In to add comment