Osm написал(а):
HTML+javascript было бы хорошо.
В cl_gui_html_viewer есть событие sapevent, т.е. я мы мог обработать его через javascript, но мне нужно документ редактировать, а не отображать
Но вот в cl_gui_html_editor нет события sapevent.
Просмотрел все классы cl_gui_*edit*. Нужное мне событие есть только в sourceedit, но он мне совсем не подходит по внешнему виду.
Кто-нибудь видел в sap транзакцию с подобной функциональностью? Кроме редактора кода.
А вам и не нужен редактор html, вам нужен редактор текста, написанный на html, для чего вполне достаточно cl_gui_html_viewer.
Делаете контрол вместо стандартного поля ввода саповского, выводите туда html, в html рисуете один textarea и растягиваете его на весь контрол. Можно еще там шрифтами поиграться есть есть желание.
Для передачи событий в SAP используете любую имитацию сабмита. Если прям в лоб: делаем форму, в ней делаем textarea и input, input скрываем, по событию mouseover находим слово в textarea(тут уж сами думайте как это делать), кладем это слово в инпут и делаем сабмит формы. В abap части делаем обработчик событий html'ки, в методе on_sapevent получаем значение нашего инпута, делаем магию, формируем данные(например, json), и передаем это обратно в html. Как вариант отнаследоваться от стандартного cl_gui_html_viewer, сделать там свой метод(например, run_js):
Code:
CALL METHOD me->set_script
EXPORTING
script = script.
CALL METHOD me->execute_script.
Далее все что нам нужно это сформировать код и передать его в этот метод.
Code:
lv_source_code = |showHint("{ lv_search_word }",{ json });|.
WHILE strlen( lv_source_code ) > 30000.
CLEAR: lv_line.
CALL FUNCTION 'TEXT_SPLIT'
EXPORTING
length = 30000
text = CONV ze_30k( lv_source_code(30000) )
IMPORTING
line = lv_line.
lv_len = strlen( lv_line ).
lv_source_code = lv_source_code+lv_len.
APPEND lv_line TO lt_source_code.
ENDWHILE.
IF lv_source_code IS NOT INITIAL.
lt_source_code = VALUE #( BASE lt_source_ code ( CONV #( lv_source_code ) ) ).
ENDIF.
go_html_viewer->run_script_on_demand( script = lt_source_code ).
Реализация же метода showHint уже чисто JS задача, и отношения к вопросу не имеет.
Для формирования html'ки можно использовать XSLT.