На главную ↑

Оглавление

Введение

Функции

Формат файла подсветки *.syn

Структура tedit

Введение

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

Внешний вид программы, с элементом text_editor.

Возможности элемента

О работе элемента

Раздел для программистов (и интересующихся людей), в котором расказаны некоторые идеи, на которых построена данная программа.

Для работы с текстом программа использует структуры:

struct symbol
  c db ?	;  +0 символ
  col db ?	;  +1 цвет
  perv dd ? ;  +2
  next dd ? ;  +6 указатели
  tc dd ?	; +10 врем. создания
  td dd ?	; +14 врем. удаления
ends

Каждая из таких структур сохраняет один символ в переменной 'c'. Переменные 'perv' и 'next' хранят индексы первого и следующего символов. Благодаря чему текст создается в виде цепочки символов (двунаправленный список).

'tc' - время создания символа, при отмене действия текстовый редактор "знает" какие символы отображать, а какие нет (хотя все символы "висят" в памяти).

'td' - время удаления символа, заполняется при удалении, при отмене действия удаления символов, текст может быть восстановлен.

'col' - используется для цветовой разметки, содержит индекс цвета в массиве цветов ted_text_colors.

Функции

Функции на экспорт:

ted_but_copy

Функция которая будет вызываться при нажатии на кнопку копирования в буфер или на Ctrl+C. Текст копируется в буфер ted_buffer, максимальный размер буфера указывается в ted_buffer_size.

Пример использования:

stdcall [ted_but_copy], tedit0

ted_but_cut

Функция вырезает выделенный текст и копирует его в буфер.

Пример использования:

stdcall [ted_but_cut], tedit0

ted_but_find_next

Функция для поиска текста. Ищет текст из буфера ted_buffer_find, при нахождении перемещает курсор к найденому тексту и выделяет его.

Пример использования:

stdcall [ted_but_find_next], tedit0

ted_but_paste

Функция вставляет текст из буфера ted_buffer.

Пример использования:

stdcall [ted_but_paste], tedit0

ted_but_redo

Повторяет отмененные действия по редактированию текста.

Пример использования:

stdcall [ted_but_redo], tedit0

ted_but_reverse

Меняет порядок следования символов в выделенном тексте.

Пример использования:

stdcall [ted_but_reverse], tedit0

ted_but_save_file

Функция для сохранения файла. Принимает 3 параметра:

1) структура tedit,

2) структура для работы 70-й функции (до вызова функции заполнения не требует),

3) строка с путем и именем файла.

Пример использования:

stdcall [ted_but_save_file], tedit0,run_file_70,[edit1.text]

ted_but_select_word

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

Пример использования:

stdcall [ted_but_select_word], tedit0

ted_but_sumb_lover

Переводит выделенные символы к нижнему регистру.

Пример использования:

stdcall [ted_but_sumb_lover], tedit0

ted_but_sumb_upper

Переводит выделенные символы к верхнему регистру.

Пример использования:

stdcall [ted_but_sumb_upper], tedit0

ted_but_undo

Отменяет действия по редактированию текста. Действия функции ted_but_reverse не отменяются.

Пример использования:

stdcall [ted_but_undo], tedit0

ted_can_save

Функция которая проверяет были ли не сохраненные изменения в тексте. Результат возвращается в регистр al, если изменения были то возвращает 1 иначе 0.

Пример использования:

push eax
	stdcall [ted_can_save], tedit0
	cmp al,1
.........
pop eax

ted_clear

Очистка текста в окне редактора. Принимает 2 параметра:

1) структура tedit,

2) параметр определяет будет ли очистка памяти полной.

Если 2-й параметр равен 1, то очистка будет полной, при 0 нет. Пользователю нужно вызывать функцию с параметром 1, параметр 0 для внутреннего использования.

Пример использования:

stdcall [ted_clear], tedit0,1

ted_delete

Деструктор элемента, освобождает память занятую элементом.

Пример использования:

stdcall [ted_delete], tedit0

ted_draw

Перерисовка всего окна редактора, включая дочерние скроллинги.

Пример использования:

stdcall [ted_draw], tedit0

ted_init

Конструктор элемента, выделяет память необходимую для работы текстового редактора.

Пример использования:

stdcall [ted_init], tedit0

ted_init_scroll_bars

Устанавливает цвет скроллингов и настраивает их размеры в зависимости от размеров окна. Можно вызывать эту функцию при изменении размеров окна в пользовательской программе. Принимает 2 параметра:

1) структура tedit,

2) опции, указывают какие нужно изменить параметры:

Параметры можно комбинировать через логическое или.

Пример использования:

stdcall [ted_init_scroll_bars], tedit0,2

ted_init_syntax_file

Функция для загрузки цветов интерфейса и ключевых слов из файла синтаксиса. Принимает 3 параметра:

1) структура tedit,

2) структура для работы 70-й функции (до вызова функции заполнения не требует),

3) строка с путем и именем файла синтаксиса.

Пример использования:

stdcall [ted_init_syntax_file], tedit0,run_file_70,file_name

ted_is_select

Определяет есть в окне редактора выделенный текст. Если есть в регистр al записывается 1 иначе 0. Функция необходима для создания панелей инстрементов, в которых в зависимости от выделения будут доступны или заблокированы определенные кнопки (действия). Например кнопку для копирования в буфер можно заблокировать если нет выбранного текста.

Пример использования:

push eax edi
	mov edi,tedit0
	call [ted_is_select]
	cmp al,0
.........
pop edi eax

ted_key

Функция вызываемая для реакции на клавиатуру. В регистре eax должен быть код нажатой клавиши. Принимает 3 параметра:

1) структура tedit,

2) таблица для конвертации scan кодов в ascii,

3) управляющие символы.

Пример использования:

mcall 66,3 ;66.3 получить состояние управляющих клавиш
xor esi,esi
mov ecx,1
test al,0x03 ;[Shift]
jz @f
	mov cl,2
	or esi,KM_SHIFT
@@:
test al,0x0c ;[Ctrl]
jz @f
	or esi,KM_CTRL
@@:
test al,0x30 ;[Alt]
jz @f
mov cl,3
	or esi,KM_ALT
@@:
test al,0x80 ;[NumLock]
jz @f
	or esi,KM_NUMLOCK
@@:

mcall 26,2,,conv_tabl ;26.2 получить раскладку клавиатуры
mcall 2 ;получаем код нажатой клавиши
stdcall [ted_key], tedit0, conv_tabl,esi

ted_mouse

Функция на перемещение или нажатие мыши.

Пример использования:

stdcall [ted_mouse], tedit0

ted_open_file

Функция для открытия файла. Принимает 3 параметра:

1) структура tedit,

2) структура для работы 70-й функции (до вызова функции заполнения не требует),

3) строка с путем и именем файла.

Возвращает 2 параметра:

1) eax = код ошибки

2) ebx = колличество прочитанных байт

Пример использования:

push eax ebx
stdcall [ted_open_file], tedit0,run_file_70,[edit1.text]
.........
pop ebx eax

ted_text_add

Функция для добавления текста. Принимает 4 параметра:

1) структура tedit,

2) указатель на буфер с текстом,

3) длина текста,

4) опции вставки.

Пример использования:

text_buffer db 500 dup(0)
.........
mov ebx,ted_opt_ed_change_time+ted_opt_ed_move_cursor
stdcall [ted_text_add], tedit0,text_buffer,30,ebx

ted_opt_ed_change_time - фиксировать изменения документа, что-бы их можно было отменить. Например если нужно сделать несколько изменений текста, которые будут отменяться за один раз, то 1-е изменение идет с этой константой а остальные нет.

ted_opt_ed_move_cursor - константа которая определяет сдвиг курсора после добавления текста.

ted_text_colored

Функция для разметки текста цветом. Обычно вызывается внутри самой библиотеки, при изменениях текста. В некоторых случаях может понадобиться вызвать принудительно из внешней программы.

Пример использования:

push edi
	mov edi,tedit0
	call [ted_text_colored]
pop edi

Внутренние функции:

ted_get_text_perv_pos - переход на предыдущий символ в цепи (через указатель 'perv')

ted_get_text_next_pos - переход на следующий символ в цепи (через указатель 'next')

ted_symbol_not_vis - определяет видимый ли указанный символ на экране (в зависимости от значений 'tc' и 'td')

ted_iterat_next - переход на следующий видимый символ в цепи. Использует для работы функции ted_get_text_next_pos и ted_symbol_not_vis.

ted_iterat_perv - переход на предедущий видимый символ в цепи.

ted_iterat_next_pos_char - найти следующую позицию указанного символа (edx-поз. начала поиска, bl->код искомого символа)

ted_get_pos_by_coords - берет позицию символа по координатам (esi->коорд. x, знак; ecx->коорд. y, строка)

ted_go_to_pos - переставляет курсор в указанную позицию, если указанная позиция находится вне экрана, то также переставляются скролинги (ecx->коорд. x, знак; edx->коорд. y, строка)

Формат файла подсветки *.syn

ЭлементРазмер (байт)
Количество цветов текста
4
Количество подсвечиваемых слов
4
Цвета интерфейса
4*6
Цвета для текста
4*(кол. цв. текста)
Структуры со свойствами и описаниями слов
sizeof(TexColViv)*(кол. слов)
Разделительный символ, означающий начало описаний слов (всегда равен 0)
1 байт
Описания слов (строки текста с 0-ми в конце)
(длинна справочного текста + 1)

Замечания.

Структура tedit

Макроса для создания структуры текстового редактора нет. Потому данные для него задаются вручную. Пример структуры для текстового редактора:

align 4
tedit0: ;структура текстового редактора
	.wnd BOX 195,5+20,325,260 ;+ 0
	.rec BOX 30,13,7,10   ;+16
	.drag_m db 0 ;+32 выделение от мыши
	.drag_k db 0 ;+33 выделение от клавиатуры
	.sel  TexSelect 0,0,0,0 ;+34 структура выделения
	.seln TexSelect ;+50 дополнительная структура выделения
	.tex	  dd 0 ;+66 text memory pointer
	.tex_1	  dd 0 ;+70 text first symbol pointer
	.tex_end  dd 0 ;+74 text end memory pointer
	.cur_x	  dd 0 ;+78 координата x курсора
	.cur_y	  dd 0 ;+82 координата y курсора
	.max_chars dd 5002 ;+86 максимальное число символов в одном документе
	.count_colors_text dd 1 ;+90 колличество цветов текста
	.count_key_words   dd 0 ;+94 колличество ключевых слов
	.color_cursor	   dd 0xff0000 ;+98 цвет курсора
	.color_wnd_capt    dd 0x0080c0 ;+102 цвет полей вокруг окна
	.color_wnd_work    dd	   0x0 ;+106 цвет фона окна
	.color_wnd_bord    dd 0xffffff ;+110 цвет текста на полях
	.color_select	   dd 0x0000ff ;+114 цвет выделения
	.color_cur_text    dd 0xffff00 ;+118 цвет символа под курсором
	.color_wnd_text    dd 0x80ffff ;+122 цвет текста в окне
	.syntax_file	   dd 0 ;+126 указатель на начало файла синтаксиса
	.syntax_file_size  dd 500 ;+130 максимальный размер файла синтаксиса
	.text_colors	   dd 0 ;+134 указатель на массив цветов текста
	.help_text_f1	   dd 0 ;+138 указатель на текст справки (по нажатии F1)
	.help_id	   dd -1 ;+142 идентификатор для справки
	.key_words_data    dd 0 ;+146 указатель на структуры ключевых слов TexColViv
	.tim_ch      dd ? ;+150 количество изменений в файле
	.tim_undo    dd ? ;+154 количество отмененных действий
	.tim_ls      dd ? ;+158 время последнего сохранения
	.tim_co      dd ? ;+162 время последней цветовой разметки
	.el_focus    dd el_focus ;+166 указатель на переменную элемента в фокусе
	.err_save    db 0 ;+170 ошибка сохранения файла
	.panel_id    db 0 ;+171 номер открытой панели
	.key_new     db 0 ;+172 символ, который будет добавлятся с клавиатуры
	.symbol_new_line db 20 ;+173 символ завершения строки
	.scr_w	     dd scrol_w1 ;+174 вертикальный скроллинг
	.scr_h	     dd scrol_h1 ;+178 горизонтальный скроллинг
	.arr_key_pos dd 0 ;+182 указатель на массив позиций ключевых слов
	.buffer      dd buf ;+186 указатель на буфер копирования/вставки
	.buffer_find dd 0 ;+190 указатель на буфер для поиска
	.cur_ins     db 1 ;+194 режим работы курсора (обычный или замена)
	.mode_color  db 1 ;+195 режим выделения слов цветом (0-выкл. 1-вкл.)
	.mode_invis  db 0 ;+196 режим показа непечатаемых символов
	.gp_opt      db 0 ;+197 опции возвращаемые функцией ted_get_pos_by_cursor
	.fun_on_key_ctrl_o dd but_ctrl_o ;+198 указатель на функцию вызываемую при нажатии Ctrl+O (открытие файла)
	.fun_on_key_ctrl_f dd 0 ;+202 ... Ctrl+F (вызова/скрытия панели поиска)
	.fun_on_key_ctrl_n dd but_ctrl_n ;+206 ... Ctrl+N (создание нового документа)
	.fun_on_key_ctrl_s dd 0 ;+210 ... Ctrl+S
	.buffer_size	   dd BUF_SIZE ;+214 размер буфера копирования/вставки
	.fun_find_err	   dd 0 ;+218 указатель на функцию вызываемую если поиск закончился неудачно
	.fun_init_synt_err dd 0 ;+222 указатель на функцию вызываемую при ошибочном открытии файла синтаксиса
	.fun_draw_panel_buttons dd 0 ;+226 указатель на функцию рисования панели с кнопками
	.fun_draw_panel_find	dd 0 ;+230 указатель на функцию рисования панели поиска
	.fun_draw_panel_syntax	dd 0 ;+234 указатель на функцию рисования панели синтаксиса
	.fun_save_err		dd 0 ;+238 указатель на функцию вызываемую если сохранение файла закончилось неудачно
	.increase_size dd 225 ;+242 число символов на которые будет увечиваться память при нехватке
	.ptr_free_symb dd   ? ;+246 указатель на свободную память, в которую можно добавлять символ (используется внутри элемента для ускорения вставки текста)

Документация обновлялась последний раз 30.05.10.