Subversion Repositories Kolibri OS

Rev

Rev 1464 | 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
  • 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

    Введение

    1476 IgorA 44

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

    1457 IgorA 45

    46

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

    47
     
    1476 IgorA 48

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

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

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

      1457 IgorA 56

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

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

      58
       
      59

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

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

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

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

      71

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

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

      73

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

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

      1476 IgorA 75

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

      1457 IgorA 76
       
      77

      Функции

      1476 IgorA 78

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

      1457 IgorA 79
       
      80

      ted_but_copy

      1458 IgorA 81

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

      1457 IgorA 82

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

      83
      stdcall [ted_but_copy], tedit0
      84
       
      1458 IgorA 85

      ted_but_cut

      86

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

      87

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

      88
      stdcall [ted_but_cut], tedit0
      1457 IgorA 89
       
      1458 IgorA 90

      ted_but_find_next

      91

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

      92

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

      93
      stdcall [ted_but_find_next], tedit0
      94
       
      95

      ted_but_paste

      96

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

      97

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

      98
      stdcall [ted_but_paste], tedit0
      99
       
      100

      ted_but_redo

      101

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

      102

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

      103
      stdcall [ted_but_redo], tedit0
      104
       
      105

      ted_but_reverse

      106

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

      107

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

      108
      stdcall [ted_but_reverse], tedit0
      109
       
      110

      ted_but_save_file

      111

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

      112

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

      113

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

      114

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

      115

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

      116
      stdcall [ted_but_save_file], tedit0,run_file_70,[edit1.text]
      117
       
      118

      ted_but_select_word

      119

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

      120

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

      121
      stdcall [ted_but_select_word], tedit0
      122
       
      123

      ted_but_sumb_lover

      124

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

      125

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

      126
      stdcall [ted_but_sumb_lover], tedit0
      127
       
      128

      ted_but_sumb_upper

      129

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

      130

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

      131
      stdcall [ted_but_sumb_upper], tedit0
      132
       
      133

      ted_but_undo

      134

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

      135

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

      136
      stdcall [ted_but_undo], tedit0
      137
       
      138

      ted_can_save

      139

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

      140

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

      141
      push eax
      142
      	stdcall [ted_can_save], tedit0
      143
      	cmp al,1
      144
      .........
      145
      pop eax
      146
       
      147

      ted_clear

      148

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

      149

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

      150

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

      151

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

      152

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

      153
      stdcall [ted_clear], tedit0,1
      154
       
      155

      ted_delete

      156

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

      157

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

      158
      stdcall [ted_delete], tedit0
      159
       
      160

      ted_draw

      161

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

      162

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

      163
      stdcall [ted_draw], tedit0
      164
       
      165

      ted_init

      166

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

      167

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

      168
      stdcall [ted_init], tedit0
      169
       
      170

      ted_init_scroll_bars

      171

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

      172

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

      1459 IgorA 173

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

      174
        175
      • 1 - изменить цвета скроллингов
      • 176
      • 2 - изменился размер окна
      • 177
      • 4 - изменился размер документа
      • 178
        179

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

        1458 IgorA 180

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

        181
        stdcall [ted_init_scroll_bars], tedit0,2
        182
         
        183

        ted_init_syntax_file

        184

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

        185

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

        186

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

        187

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

        188

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

        189
        stdcall [ted_init_syntax_file], tedit0,run_file_70,file_name
        190
         
        191

        ted_is_select

        192

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

        193

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

        194
        push eax edi
        195
        	mov edi,tedit0
        196
        	call [ted_is_select]
        197
        	cmp al,0
        198
        .........
        199
        pop edi eax
        200
         
        201

        ted_key

        202

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

        203

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

        204

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

        205

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

        206

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

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

        ted_mouse

        234

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

        235

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

        236
        stdcall [ted_mouse], tedit0
        237
         
        238

        ted_open_file

        239

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

        240

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

        241

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

        242

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

        1459 IgorA 243

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

        244

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

        245

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

        1458 IgorA 246

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

        1459 IgorA 247
        push eax ebx
        248
        stdcall [ted_open_file], tedit0,run_file_70,[edit1.text]
        249
        .........
        250
        pop ebx eax
        1458 IgorA 251
         
        252

        ted_text_add

        253

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

        254

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

        255

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

        256

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

        257

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

        258

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

        1459 IgorA 259
        text_buffer db 500 dup(0)
        260
        .........
        261
        mov ebx,ted_opt_ed_change_time+ted_opt_ed_move_cursor
        262
        stdcall [ted_text_add], tedit0,text_buffer,30,ebx
        1458 IgorA 263

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

        264

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

        265
         
        266

        ted_text_colored

        267

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

        268

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

        269
        push edi
        270
        	mov edi,tedit0
        271
        	call [ted_text_colored]
        272
        pop edi
        273
         
        1476 IgorA 274

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

        1457 IgorA 275

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

        276

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

        277

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

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

        279

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

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

        281

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

        282
         
        283

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

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

        285

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

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

        287

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

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

        289
         
        1458 IgorA 290

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

        1457 IgorA 291
        292
        ЭлементРазмер (байт)
        293
        Количество цветов текста
        294
          
        4
        295
        Количество подсвечиваемых слов
        296
          
        4
        297
        Цвета интерфейса
        298
          
        4*6
        299
        Цвета для текста
        300
          
        4*(кол. цв. текста)
        301
        Структуры со свойствами и описаниями слов
        302
          
        sizeof(TexColViv)*(кол. слов)
        303
        Разделительный символ, означающий начало описаний слов (всегда равен 0)
        304
          
        1 байт
        305
        Описания слов (строки текста с 0-ми в конце)
        306
          
        (длинна справочного текста + 1)
        307
        308

        Замечания.

        309
          310
        • Все слова должны быть расположены в порядке следования их ASCII кодов.
        • 311
            Возможно в будущих версиях формат файлов подсветки будет изменен.
          312
          313
           
          1464 IgorA 314

          Структура tedit

          315

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

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

          1476 IgorA 377

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

          1457 IgorA 378
           
          379
          380