Subversion Repositories Kolibri OS

Rev

Rev 1459 | Rev 1476 | 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
  • 17
  • ted_but_find_next
  • 18
  • ted_but_paste
  • 19
  • ted_but_redo
  • 20
  • ted_but_reverse
  • 21
  • ted_but_save_file
  • 22
  • ted_but_select_word
  • 23
  • ted_but_sumb_lover
  • 24
  • ted_but_sumb_upper
  • 25
  • ted_but_undo
  • 26
  • ted_can_save
  • 27
  • ted_clear
  • 28
  • ted_delete
  • 29
  • ted_draw
  • 30
  • ted_init
  • 31
  • ted_init_scroll_bars
  • 32
  • ted_init_syntax_file
  • 33
  • ted_is_select
  • 34
  • ted_key
  • 35
  • ted_mouse
  • 36
  • ted_open_file
  • 37
  • ted_text_add
  • 38
  • ted_text_colored
  • 1457 IgorA 39
    1458 IgorA 40

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

    1464 IgorA 41

    Структура tedit

    1457 IgorA 42
     
    43

    Введение

    44

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

    45

    46

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

    47
     
    48

    Возможности

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

      Некоторые недоработки

      56
        57
      • Если открыть большой файл, размер которого больше чем:
      • 58
            maxChars equ 100002 ;(...+2)
        59
          он откроется не весь, а первые maxChars-2 символов из файла
        60
          (о чем выдается сообщение).
        61
      • При сохранении программа не спрашивает о замене существ. файла.
      • 62
        63
         
        64

        О работе программы

        65

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

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

        67
         
        68

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

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

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

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

        80

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

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

        82

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

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

        84

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

        85
         
        86

        Функции

        87

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

        88
         
        89

        ted_but_copy

        1458 IgorA 90

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

        1457 IgorA 91

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

        92
        stdcall [ted_but_copy], tedit0
        93
         
        1458 IgorA 94

        ted_but_cut

        95

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

        96

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

        97
        stdcall [ted_but_cut], tedit0
        1457 IgorA 98
         
        1458 IgorA 99

        ted_but_find_next

        100

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

        101

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

        102
        stdcall [ted_but_find_next], tedit0
        103
         
        104

        ted_but_paste

        105

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

        106

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

        107
        stdcall [ted_but_paste], tedit0
        108
         
        109

        ted_but_redo

        110

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

        111

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

        112
        stdcall [ted_but_redo], tedit0
        113
         
        114

        ted_but_reverse

        115

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

        116

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

        117
        stdcall [ted_but_reverse], tedit0
        118
         
        119

        ted_but_save_file

        120

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

        121

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

        122

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

        123

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

        124

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

        125
        stdcall [ted_but_save_file], tedit0,run_file_70,[edit1.text]
        126
         
        127

        ted_but_select_word

        128

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

        129

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

        130
        stdcall [ted_but_select_word], tedit0
        131
         
        132

        ted_but_sumb_lover

        133

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

        134

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

        135
        stdcall [ted_but_sumb_lover], tedit0
        136
         
        137

        ted_but_sumb_upper

        138

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

        139

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

        140
        stdcall [ted_but_sumb_upper], tedit0
        141
         
        142

        ted_but_undo

        143

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

        144

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

        145
        stdcall [ted_but_undo], tedit0
        146
         
        147

        ted_can_save

        148

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

        149

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

        150
        push eax
        151
        	stdcall [ted_can_save], tedit0
        152
        	cmp al,1
        153
        .........
        154
        pop eax
        155
         
        156

        ted_clear

        157

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

        158

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

        159

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

        160

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

        161

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

        162
        stdcall [ted_clear], tedit0,1
        163
         
        164

        ted_delete

        165

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

        166

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

        167
        stdcall [ted_delete], tedit0
        168
         
        169

        ted_draw

        170

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

        171

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

        172
        stdcall [ted_draw], tedit0
        173
         
        174

        ted_init

        175

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

        176

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

        177
        stdcall [ted_init], tedit0
        178
         
        179

        ted_init_scroll_bars

        180

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

        181

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

        1459 IgorA 182

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

        183
          184
        • 1 - изменить цвета скроллингов
        • 185
        • 2 - изменился размер окна
        • 186
        • 4 - изменился размер документа
        • 187
          188

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

          1458 IgorA 189

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

          190
          stdcall [ted_init_scroll_bars], tedit0,2
          191
           
          192

          ted_init_syntax_file

          193

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

          194

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

          195

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

          196

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

          197

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

          198
          stdcall [ted_init_syntax_file], tedit0,run_file_70,file_name
          199
           
          200

          ted_is_select

          201

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

          202

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

          203
          push eax edi
          204
          	mov edi,tedit0
          205
          	call [ted_is_select]
          206
          	cmp al,0
          207
          .........
          208
          pop edi eax
          209
           
          210

          ted_key

          211

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

          212

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

          213

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

          214

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

          215

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

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

          ted_mouse

          243

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

          244

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

          245
          stdcall [ted_mouse], tedit0
          246
           
          247

          ted_open_file

          248

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

          249

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

          250

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

          251

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

          1459 IgorA 252

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

          253

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

          254

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

          1458 IgorA 255

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

          1459 IgorA 256
          push eax ebx
          257
          stdcall [ted_open_file], tedit0,run_file_70,[edit1.text]
          258
          .........
          259
          pop ebx eax
          1458 IgorA 260
           
          261

          ted_text_add

          262

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

          263

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

          264

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

          265

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

          266

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

          267

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

          1459 IgorA 268
          text_buffer db 500 dup(0)
          269
          .........
          270
          mov ebx,ted_opt_ed_change_time+ted_opt_ed_move_cursor
          271
          stdcall [ted_text_add], tedit0,text_buffer,30,ebx
          1458 IgorA 272

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

          273

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

          274
           
          275

          ted_text_colored

          276

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

          277

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

          278
          push edi
          279
          	mov edi,tedit0
          280
          	call [ted_text_colored]
          281
          pop edi
          282
           
          1457 IgorA 283

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

          284

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

          285

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

          286

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

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

          288

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

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

          290

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

          291
           
          292

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

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

          294

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

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

          296

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

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

          298
           
          1458 IgorA 299

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

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

          Замечания.

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

            Структура tedit

            324

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

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

            1464 IgorA 386

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

            1457 IgorA 387
             
            388
            389