codeEditor
codeEditor — это многострочный редактор исходного кода с подсветкой синтаксиса и дополнительными средствами редактирования кода.
XML-элемент |
|
|---|---|
Java-класс |
|
Основы
В следующем примере codeEditor используется вместе с элементами управления основными параметрами отображения:
<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"/>
@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.
Пример:
<hbox width="100%" wrap="true">
<select id="modeComboBox" label="Mode"/>
<select id="themeComboBox" label="Theme"/>
</hbox>
<codeEditor id="codeEditor"/>
@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:
<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"/>
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, например:
<codeEditor id="codeEditor" height="100%" minHeight="15em"
suggestOn="\."/>
@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 имеет следующие уникальные атрибуты:
| Имя | Описание | По умолчанию |
|---|---|---|
Параметры автодополнения suggests по умолчанию в зависимости от языка mode. |
|
|
Устанавливает размер шрифта для кода в редакторе. |
|
|
Устанавливает подсветку активной строки. Если подсветка включена, строка, на которой находится курсор, будет выделена. |
|
|
Устанавливает подсветку текущей линии переплета. Если подсветка включена, линия желоба, на которой находится курсор, будет выделена. |
|
|
Автоматически открывайте всплывающее окно suggestions по мере ввода пользователем. |
|
|
Устанавливает подсветку синтаксиса для определённого режима. Список поддерживаемых режимов определяется перечислением |
|
|
Управляет положением столбца поля печати. Этот столбец представляет собой визуальную вертикальную линию, которая помогает форматировать и читабельность кода, особенно во время печати. |
|
|
Определяет, отображается ли переплет (вертикальная область в левой части редактора). В полях обычно отображаются номера строк, что упрощает навигацию и ссылки на определённые строки кода. |
|
|
Управляет отображением номеров строк в редакторе. Эта функция помогает в навигации и ссылках на определённые строки кода. |
|
|
Используется для управления видимостью линии поля печати. Эта линия представляет собой вертикальную направляющую, которая появляется в редакторе кода и помогает разработчикам визуально отделить код, который поместится на печатной странице, от кода, который будет обрезан. |
|
|
Регулярное выражение для запуска autocompletion, когда пользователь вводит соответствующую строку. |
— |
|
Он определяет, должны ли длинные строки кода переноситься (разбиваться на несколько строк), чтобы поместиться в видимую область редактора, или они должны отображаться как одна строка, выходящая за пределы ширины окна. |
|
|
Устанавливает визуальную тему |
|
|
Устанавливает символ табуляции, представляющий режим. В режиме программных вкладок символ табуляции отображается в виде ряда пробелов. В режиме жестких вкладок символ табуляции отображается как специальный символ |
|
codeEditor имеет следующие общие атрибуты:
id - alignSelf - classNames - colspan - css - dataContainer - enabled - errorMessage - focusShortcut - height - helperText - label - maxHeight - maxWidth - minHeight - minWidth - property - readOnly - required - requiredMessage - tabIndex - title - visible - width