Subversion Repositories Kolibri OS

Rev

Rev 7576 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1457 IgorA 1
2
3
элемент Text Editor
4
5
6
7
 
8
9

На главную ↑

10

Оглавление

11
 
12

Введение

13

Функции

14
    15
  • ted_but_copy
  • 1458 IgorA 16
  • ted_but_cut
  • 7576 IgorA 17
  • ted_but_find
  • 1458 IgorA 18
  • ted_but_find_next
  • 19
  • ted_but_paste
  • 20
  • ted_but_redo
  • 21
  • ted_but_reverse
  • 22
  • ted_but_save_file
  • 23
  • ted_but_select_word
  • 24
  • ted_but_sumb_lover
  • 25
  • ted_but_sumb_upper
  • 26
  • ted_but_undo
  • 27
  • ted_can_save
  • 28
  • ted_clear
  • 29
  • ted_delete
  • 30
  • ted_draw
  • 31
  • ted_init
  • 32
  • ted_init_scroll_bars
  • 33
  • ted_init_syntax_file
  • 34
  • ted_is_select
  • 35
  • ted_key
  • 36
  • ted_mouse
  • 37
  • ted_open_file
  • 38
  • ted_text_add
  • 39
  • ted_text_colored
  • 7579 IgorA 40
  • ted_go_to_position
  • 1457 IgorA 41
    1458 IgorA 42

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

    1464 IgorA 43

    Структура tedit

    1457 IgorA 44
     
    45

    Введение

    1476 IgorA 46

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

    1457 IgorA 47

    48

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

    49
     
    1476 IgorA 50

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

    1457 IgorA 51
      7579 IgorA 52
        
    • Открытие (Ctrl+O), Сохранение файла (Ctrl+S, Ctrl+Shift+S).
    • 53
        
    • Редактирование: Повтор/Отмена действия (Ctrl+Z), Вырезать, Копировать (Ctrl+C), Вставить (Ctrl+V), Поиск (Ctrl+F, F3), Замена (Ctrl+H), Переход на строку (Ctrl+G).
    • 1457 IgorA 54
        
    • Выделение цветом слов, заданных в файле синтаксиса. Вывод справки по ним, если она есть (нажатием F1 когда курсор на слове).
    • 55
      56
       
      1476 IgorA 57

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

      1457 IgorA 58

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

      59
        некоторые идеи, на которых построена данная программа.

      60
       
      61

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

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

      Каждая из таких структур сохраняет один символ в переменной 'c'. Переменные

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

      73

      'tc' - время создания символа, при отмене действия текстовый редактор "знает"

      74
        какие символы отображать, а какие нет (хотя все символы "висят" в памяти).

      75

      'td' - время удаления символа, заполняется при удалении, при отмене действия

      76
        удаления символов, текст может быть восстановлен.

      1476 IgorA 77

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

      1457 IgorA 78
       
      79

      Функции

      1476 IgorA 80

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

      1457 IgorA 81
       
      82

      ted_but_copy

      1458 IgorA 83

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

      1457 IgorA 84

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

      85
      stdcall [ted_but_copy], tedit0
      86
       
      1458 IgorA 87

      ted_but_cut

      88

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

      89

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

      90
      stdcall [ted_but_cut], tedit0
      1457 IgorA 91
       
      7576 IgorA 92

      ted_but_find

      93

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

      94

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

      95

      2) параметры поиска:

      96
        97
      • 0 - искать ниже курсора
      • 98
      • 1 - искать выше курсора
      • 99
      • 2 - искать от начала документа
      • 100
        101

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

        102
        stdcall [ted_but_find], tedit0, 2
        103
         
        1458 IgorA 104

        ted_but_find_next

        7576 IgorA 105

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

        1458 IgorA 106

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

        107
        stdcall [ted_but_find_next], tedit0
        108
         
        109

        ted_but_paste

        110

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

        111

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

        112
        stdcall [ted_but_paste], tedit0
        113
         
        114

        ted_but_redo

        115

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

        116

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

        117
        stdcall [ted_but_redo], tedit0
        118
         
        119

        ted_but_reverse

        120

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

        121

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

        122
        stdcall [ted_but_reverse], tedit0
        123
         
        124

        ted_but_save_file

        125

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

        126

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

        127

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

        128

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

        129

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

        130
        stdcall [ted_but_save_file], tedit0,run_file_70,[edit1.text]
        131
         
        132

        ted_but_select_word

        133

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

        134

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

        135
        stdcall [ted_but_select_word], tedit0
        136
         
        137

        ted_but_sumb_lover

        138

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

        139

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

        140
        stdcall [ted_but_sumb_lover], tedit0
        141
         
        142

        ted_but_sumb_upper

        143

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

        144

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

        145
        stdcall [ted_but_sumb_upper], tedit0
        146
         
        147

        ted_but_undo

        148

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

        149

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

        150
        stdcall [ted_but_undo], tedit0
        151
         
        152

        ted_can_save

        153

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

        154

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

        155
        push eax
        156
        	stdcall [ted_can_save], tedit0
        157
        	cmp al,1
        158
        .........
        159
        pop eax
        160
         
        161

        ted_clear

        162

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

        163

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

        164

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

        165

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

        166

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

        167
        stdcall [ted_clear], tedit0,1
        168
         
        169

        ted_delete

        170

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

        171

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

        172
        stdcall [ted_delete], tedit0
        173
         
        174

        ted_draw

        175

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

        176

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

        177
        stdcall [ted_draw], tedit0
        178
         
        179

        ted_init

        180

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

        181

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

        182
        stdcall [ted_init], tedit0
        183
         
        184

        ted_init_scroll_bars

        185

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

        186

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

        1459 IgorA 187

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

        188
          189
        • 1 - изменить цвета скроллингов
        • 190
        • 2 - изменился размер окна
        • 191
        • 4 - изменился размер документа
        • 192
          193

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

          1458 IgorA 194

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

          195
          stdcall [ted_init_scroll_bars], tedit0,2
          196
           
          197

          ted_init_syntax_file

          198

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

          199

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

          200

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

          201

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

          202

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

          203
          stdcall [ted_init_syntax_file], tedit0,run_file_70,file_name
          204
           
          205

          ted_is_select

          206

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

          207

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

          208
          push eax edi
          209
          	mov edi,tedit0
          210
          	call [ted_is_select]
          211
          	cmp al,0
          212
          .........
          213
          pop edi eax
          214
           
          215

          ted_key

          216

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

          217

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

          218

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

          219

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

          220

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

          221
          mcall 66,3 ;66.3 получить состояние управляющих клавиш
          222
          xor esi,esi
          223
          mov ecx,1
          224
          test al,0x03 ;[Shift]
          225
          jz @f
          226
          	mov cl,2
          227
          	or esi,KM_SHIFT
          228
          @@:
          229
          test al,0x0c ;[Ctrl]
          230
          jz @f
          231
          	or esi,KM_CTRL
          232
          @@:
          233
          test al,0x30 ;[Alt]
          234
          jz @f
          235
          mov cl,3
          236
          	or esi,KM_ALT
          237
          @@:
          238
          test al,0x80 ;[NumLock]
          239
          jz @f
          240
          	or esi,KM_NUMLOCK
          241
          @@:
          242
           
          243
          mcall 26,2,,conv_tabl ;26.2 получить раскладку клавиатуры
          244
          mcall 2 ;получаем код нажатой клавиши
          245
          stdcall [ted_key], tedit0, conv_tabl,esi
          246
           
          247

          ted_mouse

          248

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

          249

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

          250
          stdcall [ted_mouse], tedit0
          251
           
          252

          ted_open_file

          253

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

          254

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

          255

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

          256

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

          1459 IgorA 257

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

          258

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

          259

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

          1458 IgorA 260

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

          1459 IgorA 261
          push eax ebx
          262
          stdcall [ted_open_file], tedit0,run_file_70,[edit1.text]
          263
          .........
          264
          pop ebx eax
          1458 IgorA 265
           
          266

          ted_text_add

          267

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

          268

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

          269

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

          270

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

          271

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

          272

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

          1459 IgorA 273
          text_buffer db 500 dup(0)
          274
          .........
          275
          mov ebx,ted_opt_ed_change_time+ted_opt_ed_move_cursor
          276
          stdcall [ted_text_add], tedit0,text_buffer,30,ebx
          1458 IgorA 277

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

          278

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

          279
           
          280

          ted_text_colored

          281

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

          282

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

          283
          push edi
          284
          	mov edi,tedit0
          285
          	call [ted_text_colored]
          286
          pop edi
          287
           
          7579 IgorA 288

          ted_go_to_position

          289

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

          290

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

          291

          2) номер строки,

          292

          3) номер символа.

          293

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

          294
          stdcall [ted_go_to_position], tedit0,50,3
          295
           
          1476 IgorA 296

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

          1457 IgorA 297

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

          298

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

          299

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

          300
                от значений 'tc' и 'td')

          301

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

          302
                работы функции ted_get_text_next_pos и ted_symbol_not_vis.

          303

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

          304
           
          305

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

          306
                поиска, bl->код искомого символа)

          307

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

          308
                ecx->коорд. y, строка)

          309

          ted_go_to_pos - переставляет курсор в указанную позицию, если указанная позиция

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

          311
           
          1458 IgorA 312

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

          1457 IgorA 313
          314
          ЭлементРазмер (байт)
          315
          Количество цветов текста
          316
            
          4
          317
          Количество подсвечиваемых слов
          318
            
          4
          319
          Цвета интерфейса
          320
            
          4*6
          321
          Цвета для текста
          322
            
          4*(кол. цв. текста)
          323
          Структуры со свойствами и описаниями слов
          324
            
          sizeof(TexColViv)*(кол. слов)
          325
          Разделительный символ, означающий начало описаний слов (всегда равен 0)
          326
            
          1 байт
          327
          Описания слов (строки текста с 0-ми в конце)
          328
            
          (длинна справочного текста + 1)
          329
          330

          Замечания.

          331
            332
          • Все слова должны быть расположены в порядке следования их ASCII кодов.
          • 333
              Возможно в будущих версиях формат файлов подсветки будет изменен.
            334
            335
             
            1464 IgorA 336

            Структура tedit

            337

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

            338
            align 4
            339
            tedit0: ;структура текстового редактора
            340
            	.wnd BOX 195,5+20,325,260 ;+ 0
            341
            	.rec BOX 30,13,7,10   ;+16
            342
            	.drag_m db 0 ;+32 выделение от мыши
            343
            	.drag_k db 0 ;+33 выделение от клавиатуры
            344
            	.sel  TexSelect 0,0,0,0 ;+34 структура выделения
            345
            	.seln TexSelect ;+50 дополнительная структура выделения
            346
            	.tex	  dd 0 ;+66 text memory pointer
            347
            	.tex_1	  dd 0 ;+70 text first symbol pointer
            348
            	.tex_end  dd 0 ;+74 text end memory pointer
            349
            	.cur_x	  dd 0 ;+78 координата x курсора
            350
            	.cur_y	  dd 0 ;+82 координата y курсора
            351
            	.max_chars dd 5002 ;+86 максимальное число символов в одном документе
            352
            	.count_colors_text dd 1 ;+90 колличество цветов текста
            353
            	.count_key_words   dd 0 ;+94 колличество ключевых слов
            354
            	.color_cursor	   dd 0xff0000 ;+98 цвет курсора
            355
            	.color_wnd_capt    dd 0x0080c0 ;+102 цвет полей вокруг окна
            356
            	.color_wnd_work    dd	   0x0 ;+106 цвет фона окна
            357
            	.color_wnd_bord    dd 0xffffff ;+110 цвет текста на полях
            358
            	.color_select	   dd 0x0000ff ;+114 цвет выделения
            359
            	.color_cur_text    dd 0xffff00 ;+118 цвет символа под курсором
            360
            	.color_wnd_text    dd 0x80ffff ;+122 цвет текста в окне
            361
            	.syntax_file	   dd 0 ;+126 указатель на начало файла синтаксиса
            362
            	.syntax_file_size  dd 500 ;+130 максимальный размер файла синтаксиса
            363
            	.text_colors	   dd 0 ;+134 указатель на массив цветов текста
            364
            	.help_text_f1	   dd 0 ;+138 указатель на текст справки (по нажатии F1)
            365
            	.help_id	   dd -1 ;+142 идентификатор для справки
            366
            	.key_words_data    dd 0 ;+146 указатель на структуры ключевых слов TexColViv
            367
            	.tim_ch      dd ? ;+150 количество изменений в файле
            368
            	.tim_undo    dd ? ;+154 количество отмененных действий
            369
            	.tim_ls      dd ? ;+158 время последнего сохранения
            370
            	.tim_co      dd ? ;+162 время последней цветовой разметки
            371
            	.el_focus    dd el_focus ;+166 указатель на переменную элемента в фокусе
            372
            	.err_save    db 0 ;+170 ошибка сохранения файла
            373
            	.panel_id    db 0 ;+171 номер открытой панели
            374
            	.key_new     db 0 ;+172 символ, который будет добавлятся с клавиатуры
            375
            	.symbol_new_line db 20 ;+173 символ завершения строки
            376
            	.scr_w	     dd scrol_w1 ;+174 вертикальный скроллинг
            377
            	.scr_h	     dd scrol_h1 ;+178 горизонтальный скроллинг
            378
            	.arr_key_pos dd 0 ;+182 указатель на массив позиций ключевых слов
            379
            	.buffer      dd buf ;+186 указатель на буфер копирования/вставки
            380
            	.buffer_find dd 0 ;+190 указатель на буфер для поиска
            381
            	.cur_ins     db 1 ;+194 режим работы курсора (обычный или замена)
            382
            	.mode_color  db 1 ;+195 режим выделения слов цветом (0-выкл. 1-вкл.)
            383
            	.mode_invis  db 0 ;+196 режим показа непечатаемых символов
            384
            	.gp_opt      db 0 ;+197 опции возвращаемые функцией ted_get_pos_by_cursor
            7579 IgorA 385
            	.fun_on_key_ctrl_all dd but_ctrl_all ;+198 указатель на функцию вызываемую при нажатии Ctrl+N,O,S,F,H,G
            386
            	dd 0,0,0 ;зарезервировано
            387
            	.buffer_size       dd BUF_SIZE ;+214 размер буфера копирования/вставки
            388
            	.fun_find_err      dd 0 ;+218 указатель на функцию вызываемую если поиск закончился неудачно
            1464 IgorA 389
            	.fun_init_synt_err dd 0 ;+222 указатель на функцию вызываемую при ошибочном открытии файла синтаксиса
            390
            	.fun_draw_panel_buttons dd 0 ;+226 указатель на функцию рисования панели с кнопками
            7579 IgorA 391
            	.fun_draw_panels   dd 0 ;+230 указатель на функцию рисования панели поиска/замены/перехода/синтаксиса
            392
            	dd 0 ;зарезервировано
            393
            	.fun_save_err      dd 0 ;+238 указатель на функцию вызываемую если сохранение файла закончилось неудачно
            1464 IgorA 394
            	.increase_size dd 225 ;+242 число символов на которые будет увечиваться память при нехватке
            6274 IgorA 395
            	.ptr_free_symb dd   ? ;+246 указатель на свободную память, в которую можно добавлять символ (используется внутри элемента для ускорения вставки текста)
            396
            	.font_s dd ? ;+250 стили для шрифта (от 0 до 7 множитель для размера, +16 для второго системного шрифта)
            1457 IgorA 397

            7579 IgorA 398

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

            1457 IgorA 399
             
            400
            401