codeEditor

codeEditor — это многострочный редактор исходного кода с подсветкой синтаксиса и дополнительными средствами редактирования кода.

XML-элемент

codeEditor

Java-класс

CodeEditor

Основы

В следующем примере codeEditor используется вместе с элементами управления основными параметрами отображения:

XML
<hbox width="100%" wrap="true">
    <checkbox id="highlightCheckbox" label="Highlight active line" value="true"/>
    <checkbox id="highlightGutterCheckbox" label="Highlight gutter line" value="true"/>
    <checkbox id="gutterCheckbox" label="Show Gutter" value="true"/>
    <checkbox id="lineNumbersCheckbox" label="Line numbers" value="true"/>
    <checkbox id="printMarginCheckbox" label="Print margin" value="true"/>
    <checkbox id="useSoftTabsCheckbox" label="Use soft tabs" value="true"/>
    <checkbox id="textWrapCheckbox" label="Text wrap" value="false"/>
</hbox>
<codeEditor id="codeEditor"/>
code editor basics
Java
@ViewComponent
protected CodeEditor codeEditor;

@Subscribe("highlightCheckbox")
protected void onHighlightCheckboxValueChange(ComponentValueChangeEvent<JmixCheckbox, Boolean> event) {
    codeEditor.setHighlightActiveLine(event.getValue());
}

@Subscribe("highlightGutterCheckbox")
protected void onHighlightGutterCheckboxValueChange(ComponentValueChangeEvent<JmixCheckbox, Boolean> event) {
    codeEditor.setHighlightGutterLine(event.getValue());
}

@Subscribe("gutterCheckbox")
protected void onGutterCheckboxValueChange(ComponentValueChangeEvent<JmixCheckbox, Boolean> event) {
    codeEditor.setShowGutter(event.getValue());
}

@Subscribe("lineNumbersCheckbox")
protected void onLineNumbersCheckboxValueChange(ComponentValueChangeEvent<JmixCheckbox, Boolean> event) {
    codeEditor.setShowLineNumbers(event.getValue());
}

@Subscribe("printMarginCheckbox")
protected void onPrintMarginCheckboxValueChange(ComponentValueChangeEvent<JmixCheckbox, Boolean> event) {
    codeEditor.setShowPrintMargin(event.getValue());
}

@Subscribe("useSoftTabsCheckbox")
protected void onUseSoftTabsCheckboxValueChange(ComponentValueChangeEvent<JmixCheckbox, Boolean> event) {
    codeEditor.setUseSoftTabs(event.getValue());
}

@Subscribe("textWrapCheckbox")
protected void onTextWrapCheckboxValueChange(ComponentValueChangeEvent<JmixCheckbox, Boolean> event) {
    codeEditor.setTextWrap(event.getValue());
}

codeEditor связанный с данными

Привязка данных означает связывание визуального компонента с контейнером данных. Изменения в визуальном компоненте или соответствующем контейнере данных могут вызывать обновления друг друга. Смотрите Использование компонентов данных для получения дополнительной информации.

Следующий пример создаёт codeEditor, связанный с данными.

<data>
    <instance id="orderReportDc"
              class="com.company.onboarding.entity.OrderReport"> (1)
        <loader id="orderReportDl"/>
        <fetchPlan extends="_base"/> (2)
    </instance>
</data>
    <codeEditor mode="XML"
                dataContainer="orderReportDc"
                property="code"/> (3)
1 InstanceContainer для сущности OrderReport.
2 Встроенный фетч-план экземпляра сущности в контейнере.
3 Привязка компонента к контейнеру данных и свойству. Атрибут dataContainer содержит ссылку на контейнер данных orderReportDc, а атрибут property ссылается на атрибут сущности code.

Режим отображения кода

Атрибут mode указывает язык программирования или язык разметки, для которого должен быть настроен редактор. Эта настройка определяет подсветку синтаксиса, соответствующую выбранному языку.

По умолчанию режим подсветки синтаксиса - CodeEditorMode.PLAIN_TEXT.

Пример:

XML
<hbox width="100%" wrap="true">
    <select id="modeComboBox" label="Mode"/>
    <select id="themeComboBox" label="Theme"/>
</hbox>
<codeEditor id="codeEditor"/>
Java
@ViewComponent
protected CodeEditor codeEditor;
@Subscribe("modeComboBox")
protected void onModeComboBoxValueChange(
        ComponentValueChangeEvent<JmixSelect<CodeEditorMode>, CodeEditorMode> event) {
    codeEditor.setMode(event.getValue());
    codeEditor.setValue(resources.getResourceAsString(DEFAULT_FILE_PATH + event.getValue()));
}

В этом примере режим изменяется программно, после чего загружается содержимое для выбранного языка.

Подсветка синтаксиса и тема

Атрибут theme используется для определения визуального оформления и стиля редактора. Он позволяет выбрать предопределённую тему, которая изменяет цветовую схему, шрифт и другие эстетические элементы редактора кода.

Список поддерживаемых тем определяется в перечислении CodeEditorTheme.

@ViewComponent
protected CodeEditor codeEditor;
@Subscribe("themeComboBox")
protected void onThemeComboBoxValueChange(
        ComponentValueChangeEvent<JmixSelect<CodeEditorTheme>, CodeEditorTheme> event) {
    codeEditor.setTheme(event.getValue());
}

Автодополнение

Компонент codeEditor поддерживает функции автодополнения.

Автодополнение может предлагать стандартные варианты в зависимости от режима, если установить атрибут defaultSuggestionsEnabled в true:

XML
<hbox width="100%" wrap="true" alignItems="BASELINE">
    <select id="modeSelect" label="Mode"/>
    <checkbox id="defaultSuggestionsCheckbox" label="Default suggestions" value="true"/>
    <checkbox id="liveSuggestionsCheckbox" label="Live suggestions" value="true"/>
</hbox>
<codeEditor id="codeEditor" height="100%" minHeight="15em"
            defaultSuggestionsEnabled="true"
            liveSuggestionsEnabled="true"/>
Java
private static final String DEFAULT_FILE_PATH = "io/jmix/uisamples/codeeditorexample/";

@ViewComponent
private CodeEditor codeEditor;
@ViewComponent
private JmixSelect<CodeEditorMode> modeSelect;

@Autowired
private Resources resources;

@Subscribe
public void onInit(InitEvent event) {
    ComponentUtils.setItemsMap(modeSelect, getModeItemsMap());
    modeSelect.setValue(CodeEditorMode.SQL);
}

@Subscribe("defaultSuggestionsCheckbox")
public void onDefaultSuggestionsCheckboxValueChange(ComponentValueChangeEvent<JmixCheckbox, Boolean> event) {
    codeEditor.setDefaultSuggestionsEnabled(event.getValue());
}

@Subscribe("liveSuggestionsCheckbox")
public void liveSuggestionsCheckboxValueChange(ComponentValueChangeEvent<JmixCheckbox, Boolean> event) {
    codeEditor.setLiveSuggestionsEnabled(event.getValue());
}

@Subscribe("modeSelect")
public void onModeSelectValueChange(
        ComponentValueChangeEvent<JmixSelect<CodeEditorMode>, CodeEditorMode> event) {
    codeEditor.setMode(event.getValue());
    codeEditor.setValue(resources.getResourceAsString(DEFAULT_FILE_PATH + event.getValue()));
}

private Map<CodeEditorMode, String> getModeItemsMap() {
    LinkedHashMap<CodeEditorMode, String> map = new LinkedHashMap<>();
    map.put(CodeEditorMode.JAVA, "Java");
    map.put(CodeEditorMode.CSS, "CSS");
    map.put(CodeEditorMode.XML, "XML");
    map.put(CodeEditorMode.JSON, "JSON");
    map.put(CodeEditorMode.JAVASCRIPT, "JavaScript");
    map.put(CodeEditorMode.HTML, "HTML");
    map.put(CodeEditorMode.TEXT, "Text");
    map.put(CodeEditorMode.GROOVY, "Groovy");
    map.put(CodeEditorMode.PROPERTIES, "Properties");
    map.put(CodeEditorMode.SQL, "SQL");
    map.put(CodeEditorMode.PYTHON, "Python");
    map.put(CodeEditorMode.SWIFT, "Swift");
    map.put(CodeEditorMode.C_CPP, "C++");
    return map;
}

Вы можете предоставить свои варианты, используя обработчик suggester, например:

XML
<codeEditor id="codeEditor" height="100%" minHeight="15em"
            suggestOn="\."/>
Java
@Autowired
private DataManager dataManager;

@Install(to = "codeEditor", subject = "suggester")
public List<Suggestion> codeEditorSuggestions(Suggester.SuggestionContext context) {
    return loadCustomers().stream()
            .map(customer -> new Suggestion(customer.getInstanceName(), customer.getInstanceName(), "Customer"))
            .toList();
}

private List<Customer> loadCustomers() {
    return dataManager.load(Customer.class)
            .all()
            .fetchPlan(FetchPlan.INSTANCE_NAME)
            .list();
}

По умолчанию всплывающее окно автодополнения открывается при нажатии пользователем сочетания клавиш:

  • Windows и Linux: Ctrl-Space

  • macOS: ⌥-Space или ⌃-Space (в зависимости от настроек системы)

Если атрибут suggestOn установлен в регулярное выражение, всплывающее окно автодополнения открывается автоматически при вводе пользователем соответствующей строки. Например, если suggestOn="\.", автодополнение сработает после ввода точки.

Если атрибут liveSuggestionsEnabled установлен в true, предложения будут появляться автоматически по мере ввода текста, без необходимости ручного вызова или настройки атрибута suggestOn. Все обработчики suggester будут запрашивать варианты, как только пользователь введёт какой-либо символ слова. Обратите внимание, что живое автодополнение может потреблять значительные ресурсы при работе с большим объёмом контента или сложными обработчиками, поэтому по умолчанию liveSuggestionsEnabled имеет значение false.

Валидация

Чтобы проверить значения, введённые в компонент codeEditor вы можете использовать валидатор в элементе validators.

Доступны следующие предопределённые валидаторы для codeEditor:

XML-элемент

validators

Предопределённые валидаторы

custom - email - notBlank - notEmpty - notNull - regexp - size

Атрибуты

codeEditor имеет следующие уникальные атрибуты:

Имя Описание По умолчанию

defaultSuggestionsEnabled

Параметры автодополнения suggests по умолчанию в зависимости от языка mode.

false

fontSize

Устанавливает размер шрифта для кода в редакторе.

1rem

highlightActiveLine

Устанавливает подсветку активной строки. Если подсветка включена, строка, на которой находится курсор, будет выделена.

true

highlightGutterLine

Устанавливает подсветку текущей линии переплета. Если подсветка включена, линия желоба, на которой находится курсор, будет выделена.

true

liveSuggestionsEnabled

Автоматически открывайте всплывающее окно suggestions по мере ввода пользователем.

false

mode

Устанавливает подсветку синтаксиса для определённого режима. Список поддерживаемых режимов определяется перечислением CodeEditorMode. См. Mode.

CodeEditorMode.PLAIN_TEXT

printMarginColumn

Управляет положением столбца поля печати. Этот столбец представляет собой визуальную вертикальную линию, которая помогает форматировать и читабельность кода, особенно во время печати.

80

showGutter

Определяет, отображается ли переплет (вертикальная область в левой части редактора). В полях обычно отображаются номера строк, что упрощает навигацию и ссылки на определённые строки кода.

true

showLineNumbers

Управляет отображением номеров строк в редакторе. Эта функция помогает в навигации и ссылках на определённые строки кода.

true

showPrintMargin

Используется для управления видимостью линии поля печати. Эта линия представляет собой вертикальную направляющую, которая появляется в редакторе кода и помогает разработчикам визуально отделить код, который поместится на печатной странице, от кода, который будет обрезан.

true

suggestOn

Регулярное выражение для запуска autocompletion, когда пользователь вводит соответствующую строку.

textWrap

Он определяет, должны ли длинные строки кода переноситься (разбиваться на несколько строк), чтобы поместиться в видимую область редактора, или они должны отображаться как одна строка, выходящая за пределы ширины окна.

false

theme

Устанавливает визуальную тему codeEditor. См. Тема.

CodeEditorTheme.TEXTMATE

useSoftTabs

Устанавливает символ табуляции, представляющий режим. В режиме программных вкладок символ табуляции отображается в виде ряда пробелов. В режиме жестких вкладок символ табуляции отображается как специальный символ \t.

true

codeEditor имеет следующие общие атрибуты:

Обработчики

codeEditor имеет следующие уникальные обработчики:

Имя Описание

validator

Проверяет значение компонента.

codeEditor имеет следующие общие обработчики:

Элементы

Компонент codeEditor может содержать следующие вложенные элементы: tooltip и validator.