Skip to content

Что такое слот

Mikhail Artemev edited this page Oct 28, 2016 · 2 revisions

Слот - это позиция для вставки символа. Слоты организуются в двусвязный список с помощью ссылок Slot#nextSlot и Slot#prevSlot. Слот работает с форматированием на уровне одного символа, определяя возможность этого символа находиться в данной позиции.

Существует два способа вставки символа в слот: вставка сверху и вставка слева.

  • Вставка сверху (вставка по умолчанию) происходит когда внешний источник (например, маска) устанавливает значение в слот (однако при помощи метода Slot#setValue(Character, boolean) внешние источники могу осуществлять вставку слева).
  • Вставка слева происходит когда один слот "проталкивает" значение в следующий слот (см. ниже). Различие между этими методами существует только для hardcoded (неизменяемых) слотов и определяется правилом RULE_REPLACE (см. ниже).

Возможность вставки символа в слот определяется правилами вставки в слот и его валидаторами.

Правила вставки

  1. Режим вставки (правило по умолчанию) - новое значение слота сдвигает текущее значение в следующий слот. При удалении значения из слота на его место устанавливается значение из следующего слота. Это поведение по умолчанию и оно соответствует обычному режиму ввода текста в текстовом редакторе. Все слоты в режиме замены

  2. RULE_INPUT_REPLACE - новое значение заменяет текущее значение слота, не изменяя состояние соседних слотов. Это поведение аналогично вводу с нажатой кнопкой INSERT на PC. Обычно используется в комбинации с правилом RULE_INPUT_MOVES_INPUT. В такой hardcoded слот можно записать уже существующее в нем значение. Если же в hardcoded слот с этим правилом приходит значение слева, то оно не "перезаписывает" текущее значение, а "проталкивается" в следующий слот. Все слоты в режиме вставки

  3. RULE_INPUT_MOVES_INPUT - при попытке вставить новое значение оно не заменяет текущее значение в слоте, а "проталкивается" в следующий слот. При попытке удаления значения из такого слота, ничего не происходит. Данное правило является необходимым для создания hardcoded-слотов. Такой слот имеет предустановленное значение и правило RULE_INPUT_MOVES_INPUT. Его значение нельзя изменить. По умолчанию в hardcoded слот невозможно вставить новое значение. При попытке вставки в начало "телефонной" маски символы проталкиваются через цепочку hardcoded слотов +43 (

Валидаторы (SlotValidator)

С помощью валидаторов можно ограничивать множество символов, доступных для вставки в слот. Если новое значение удовлетворяет хотя бы одному валидатору, то такое значение является допустимым для слота.

SlotValidator является интерфейсом:

 public interface SlotValidator extends Serializable {
    boolean validate(final char value);
}

Пример простейшего валидатора - SlotValidators.DigitValidator. Если данный валидатор установлен на слот, в слот можно будет вписать только цифру.

public static class DigitValidator implements Slot.SlotValidator {

    @Override
    public boolean validate(final char value) {
        return Character.isDigit(value);
    }

    // <...>
}

Теги и декоративные слоты

Помимо правил и валидаторов каждый слот может иметь набор тегов. Тег - это некоторый Integer, ассоциированный со слотом. Теги внутри слота хранятся во множестве (Set<Integer>). Класс Slot не содержит никакого кода по работе с тегами (кроме их установки, получения и проверки наличия).

Однако, в классе объявлена константа Slot#TAG_DECORATION. Слоты помеченные данным тегом являются декоративными и по особому обрабатываются маской для получения неформатированной строки. Подробнее оба этом в разделе о масках ввода.