-
Notifications
You must be signed in to change notification settings - Fork 31
Что такое слот
Слот - это позиция для вставки символа. Слоты организуются в двусвязный список с помощью ссылок Slot#nextSlot
и Slot#prevSlot
.
Слот работает с форматированием на уровне одного символа, определяя возможность этого символа находиться
в данной позиции.
Существует два способа вставки символа в слот: вставка сверху и вставка слева.
- Вставка сверху (вставка по умолчанию) происходит когда внешний источник (например, маска) устанавливает значение в слот (однако при помощи метода Slot#setValue(Character, boolean) внешние источники могу осуществлять вставку слева).
- Вставка слева происходит когда один слот "проталкивает" значение в следующий слот (см. ниже). Различие между этими методами существует только для hardcoded (неизменяемых) слотов и определяется правилом RULE_REPLACE (см. ниже).
Возможность вставки символа в слот определяется правилами вставки в слот и его валидаторами.
-
Режим вставки (правило по умолчанию) - новое значение слота сдвигает текущее значение в следующий слот. При удалении значения из слота на его место устанавливается значение из следующего слота. Это поведение по умолчанию и оно соответствует обычному режиму ввода текста в текстовом редакторе.
-
RULE_INPUT_REPLACE - новое значение заменяет текущее значение слота, не изменяя состояние соседних слотов. Это поведение аналогично вводу с нажатой кнопкой INSERT на PC. Обычно используется в комбинации с правилом RULE_INPUT_MOVES_INPUT. В такой hardcoded слот можно записать уже существующее в нем значение. Если же в hardcoded слот с этим правилом приходит значение слева, то оно не "перезаписывает" текущее значение, а "проталкивается" в следующий слот.
-
RULE_INPUT_MOVES_INPUT - при попытке вставить новое значение оно не заменяет текущее значение в слоте, а "проталкивается" в следующий слот. При попытке удаления значения из такого слота, ничего не происходит. Данное правило является необходимым для создания hardcoded-слотов. Такой слот имеет предустановленное значение и правило RULE_INPUT_MOVES_INPUT. Его значение нельзя изменить. По умолчанию в hardcoded слот невозможно вставить новое значение.
С помощью валидаторов можно ограничивать множество символов, доступных для вставки в слот. Если новое значение удовлетворяет хотя бы одному валидатору, то такое значение является допустимым для слота.
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
. Слоты помеченные данным тегом
являются декоративными и по особому обрабатываются маской для получения неформатированной
строки. Подробнее оба этом в разделе о масках ввода.