3.5.4.2.2. Стандартные действия поля выбора

В платформе определен набор стандартных действий для компонентов выбора PickerField, LookupPickerField и SearchPickerField.

Пример использования стандартных действий в компоненте выбора:

<pickerField id="userPickerField" dataContainer="employeeDc" property="user">
    <actions>
        <action id="lookup" type="picker_lookup"/>
        <action id="open" type="picker_open"/>
        <action id="clear" type="picker_clear"/>
    </actions>
</pickerField>

Стандартные действия для компонентов выбора включают в себя следующие типы:

  • picker_lookup - действие, определяемое классом com.haulmont.cuba.gui.actions.picker.LookupAction. It is designed to select an entity instance from a lookup screen and set it to the picker field. Предназначено для выбора экземпляра сущности в отдельном экране выбора и установки его в качестве значения компонента.

  • picker_open - действие, определяемое классом com.haulmont.cuba.gui.actions.picker.OpenAction. Предназначено для открытия экрана редактирования экземпляра сущности, являющегося текущим значением компонента.

  • picker_clear - действие, определяемое классом com.haulmont.cuba.gui.actions.picker.ClearAction. Предназначено для очистки (то есть установки в null) текущего значения компонента.

Для основных параметров стандартных действий определены значения по умолчанию: заголовки, значки, горячие клавиши, а также стандартное поведение при вызове действия. Вы можете передать свои собственные значения основных параметров декларативно в XML так же, как и для любого другого действия. Например, можно установить для действия другой значок:

<action id="open" type="picker_open" icon="USER"/>

Для того чтобы изменить стандартное поведение действия, необходимо подписаться на событие ActionPerformedEvent для этого действия в контроллере экрана. Код стандартного действия не будет выполняться, если для него определён альтернативный action listener. По сути, обработчик события ActionPerformedEvent переопределяет стандартное поведение действия.

В следующем примере мы переопределяем стандартное поведение действия picker_lookup, чтобы выбирать экземпляр сущности User в конкретном экране, открываемом в режиме модального диалога:

public class CustomerBrowse extends StandardLookup<Customer> {
    @Inject
    private ScreenBuilders screenBuilders;
    @Inject
    private PickerField<User> userPickerField;

    @Subscribe("userPickerField.lookup")
    protected void onUserPickerFieldLookupActionPerformed(Action.ActionPerformedEvent event) {
        screenBuilders.lookup(User.class, this)
                .withField(userPickerField)
                .withScreenClass(UserBrowser.class) // specific lookup screen
                .withLaunchMode(OpenMode.DIALOG)    // open as modal dialog
                .build()
                .show();
    }

Более подробно о переопределении действий см. в описании бина ScreenBuilders.