Subversion Repositories Kolibri OS

Rev

Rev 6274 | Go to most recent revision | 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
  • 1457 IgorA 40
    1458 IgorA 41

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

    1464 IgorA 42

    Структура tedit

    1457 IgorA 43
     
    44

    Введение

    1476 IgorA 45

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

    1457 IgorA 46

    47

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

    48
     
    1476 IgorA 49

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

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

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

      1457 IgorA 57

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

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

      59
       
      60

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

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

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

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

      72

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

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

      74

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

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

      1476 IgorA 76

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

      1457 IgorA 77
       
      78

      Функции

      1476 IgorA 79

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

      1457 IgorA 80
       
      81

      ted_but_copy

      1458 IgorA 82

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

      1457 IgorA 83

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

      84
      stdcall [ted_but_copy], tedit0
      85
       
      1458 IgorA 86

      ted_but_cut

      87

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

      88

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

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

      ted_but_find

      92

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

      93

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

      94

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

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

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

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

        ted_but_find_next

        7576 IgorA 104

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

        1458 IgorA 105

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

        106
        stdcall [ted_but_find_next], tedit0
        107
         
        108

        ted_but_paste

        109

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

        110

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

        111
        stdcall [ted_but_paste], tedit0
        112
         
        113

        ted_but_redo

        114

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

        115

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

        116
        stdcall [ted_but_redo], tedit0
        117
         
        118

        ted_but_reverse

        119

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

        120

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

        121
        stdcall [ted_but_reverse], tedit0
        122
         
        123

        ted_but_save_file

        124

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

        125

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

        126

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

        127

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

        128

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

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

        ted_but_select_word

        132

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

        133

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

        134
        stdcall [ted_but_select_word], tedit0
        135
         
        136

        ted_but_sumb_lover

        137

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

        138

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

        139
        stdcall [ted_but_sumb_lover], tedit0
        140
         
        141

        ted_but_sumb_upper

        142

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

        143

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

        144
        stdcall [ted_but_sumb_upper], tedit0
        145
         
        146

        ted_but_undo

        147

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

        148

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

        149
        stdcall [ted_but_undo], tedit0
        150
         
        151

        ted_can_save

        152

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

        153

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

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

        ted_clear

        161

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

        162

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

        163

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

        164

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

        165

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

        166
        stdcall [ted_clear], tedit0,1
        167
         
        168

        ted_delete

        169

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

        170

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

        171
        stdcall [ted_delete], tedit0
        172
         
        173

        ted_draw

        174

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

        175

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

        176
        stdcall [ted_draw], tedit0
        177
         
        178

        ted_init

        179

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

        180

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

        181
        stdcall [ted_init], tedit0
        182
         
        183

        ted_init_scroll_bars

        184

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

        185

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

        1459 IgorA 186

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

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

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

          1458 IgorA 193

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

          194
          stdcall [ted_init_scroll_bars], tedit0,2
          195
           
          196

          ted_init_syntax_file

          197

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

          198

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

          199

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

          200

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

          201

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

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

          ted_is_select

          205

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

          206

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

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

          ted_key

          215

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

          216

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

          217

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

          218

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

          219

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

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

          ted_mouse

          247

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

          248

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

          249
          stdcall [ted_mouse], tedit0
          250
           
          251

          ted_open_file

          252

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

          253

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

          254

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

          255

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

          1459 IgorA 256

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

          257

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

          258

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

          1458 IgorA 259

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

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

          ted_text_add

          266

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

          267

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

          268

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

          269

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

          270

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

          271

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

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

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

          277

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

          278
           
          279

          ted_text_colored

          280

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

          281

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

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

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

          1457 IgorA 288

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

          289

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

          290

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

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

          292

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

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

          294

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

          295
           
          296

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

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

          298

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

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

          300

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

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

          302
           
          1458 IgorA 303

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

          1457 IgorA 304
          305
          ЭлементРазмер (байт)
          306
          Количество цветов текста
          307
            
          4
          308
          Количество подсвечиваемых слов
          309
            
          4
          310
          Цвета интерфейса
          311
            
          4*6
          312
          Цвета для текста
          313
            
          4*(кол. цв. текста)
          314
          Структуры со свойствами и описаниями слов
          315
            
          sizeof(TexColViv)*(кол. слов)
          316
          Разделительный символ, означающий начало описаний слов (всегда равен 0)
          317
            
          1 байт
          318
          Описания слов (строки текста с 0-ми в конце)
          319
            
          (длинна справочного текста + 1)
          320
          321

          Замечания.

          322
            323
          • Все слова должны быть расположены в порядке следования их ASCII кодов.
          • 324
              Возможно в будущих версиях формат файлов подсветки будет изменен.
            325
            326
             
            1464 IgorA 327

            Структура tedit

            328

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

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

            7576 IgorA 391

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

            1457 IgorA 392
             
            393
            394