MODULE test_text ; (* m2-GTK4 test - text extras: tags, tag table, marks, iterators, GtkEntryBuffer and GtkEntryCompletion. Requires a display. *) FROM Gio IMPORT g_application_run, g_application_quit; FROM GtkApplication IMPORT gtk_application_new; FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_child; FROM GtkBox IMPORT gtk_box_new, gtk_box_append; FROM GtkEnums IMPORT GtkVertical; FROM GtkTextView IMPORT gtk_text_view_new_with_buffer; FROM GtkTextBuffer IMPORT gtk_text_buffer_new, gtk_text_buffer_set_text, gtk_text_buffer_get_char_count, gtk_text_buffer_get_tag_table, gtk_text_buffer_create_tag, gtk_text_buffer_create_mark, gtk_text_buffer_get_mark, gtk_text_buffer_get_iter_at_offset, gtk_text_buffer_get_iter_at_mark, gtk_text_buffer_apply_tag, gtk_text_buffer_remove_tag, gtk_text_buffer_remove_all_tags, gtk_text_buffer_insert_at_cursor, gtk_text_buffer_insert_markup; FROM GtkTextIter IMPORT gtk_text_iter_get_offset, GtkTextIter; FROM GtkTextTag IMPORT gtk_text_tag_new, gtk_text_tag_set_priority, gtk_text_tag_get_priority; FROM GtkTextTagTable IMPORT gtk_text_tag_table_add, gtk_text_tag_table_lookup, gtk_text_tag_table_get_size; FROM GtkTextMark IMPORT gtk_text_mark_get_name, gtk_text_mark_set_visible, gtk_text_mark_get_visible, gtk_text_mark_get_deleted; FROM GtkEntry IMPORT gtk_entry_new, gtk_entry_get_buffer, gtk_entry_set_completion, gtk_entry_get_completion; FROM GtkEntryBuffer IMPORT gtk_entry_buffer_set_text, gtk_entry_buffer_get_text, gtk_entry_buffer_get_length, gtk_entry_buffer_set_max_length, gtk_entry_buffer_get_max_length; FROM GtkEntryCompletion IMPORT gtk_entry_completion_new, gtk_entry_completion_set_text_column, gtk_entry_completion_get_text_column, gtk_entry_completion_set_minimum_key_length, gtk_entry_completion_get_minimum_key_length, gtk_entry_completion_set_popup_completion; FROM GtkUtils IMPORT Connect, CStrToM2; FROM SYSTEM IMPORT ADDRESS, ADR; FROM libc IMPORT printf; CONST AppId = "org.example.m2gtk4.TestText"; VAR app: ADDRESS; passed: BOOLEAN; PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS); VAR window, box, view, buffer, table, tag, tag2, tag3, mark, entry, eb, completion, it0, it1, it2: ADDRESS; iter0, iter1, iter2: GtkTextIter; buf: ARRAY [0..63] OF CHAR; size0: INTEGER; ok: BOOLEAN; BEGIN ok := TRUE; buffer := gtk_text_buffer_new(NIL); table := gtk_text_buffer_get_tag_table(buffer); IF table = NIL THEN printf("tag table NIL\n"); ok := FALSE END; size0 := gtk_text_tag_table_get_size(table); (* tag + tag table *) tag := gtk_text_tag_new("bold"); gtk_text_tag_table_add(table, tag); IF gtk_text_tag_table_lookup(table, "bold") # tag THEN printf("tag lookup wrong\n"); ok := FALSE END; IF gtk_text_tag_table_get_size(table) # size0 + 1 THEN printf("tag table size wrong\n"); ok := FALSE END; tag3 := gtk_text_tag_new("italic"); gtk_text_tag_table_add(table, tag3); IF gtk_text_tag_table_get_size(table) # size0 + 2 THEN ok := FALSE END; (* priority must be < the tag table size *) gtk_text_tag_set_priority(tag, 1); IF gtk_text_tag_get_priority(tag) # 1 THEN printf("tag priority wrong\n"); ok := FALSE END; (* text + iterators + tags *) gtk_text_buffer_set_text(buffer, "hello world", -1); IF gtk_text_buffer_get_char_count(buffer) # 11 THEN printf("char count wrong\n"); ok := FALSE END; gtk_text_buffer_get_iter_at_offset(buffer, iter0, 0); gtk_text_buffer_get_iter_at_offset(buffer, iter1, 5); IF gtk_text_iter_get_offset(iter0) # 0 THEN ok := FALSE END; IF gtk_text_iter_get_offset(iter1) # 5 THEN ok := FALSE END; gtk_text_buffer_apply_tag(buffer, tag, iter0, iter1); gtk_text_buffer_remove_tag(buffer, tag, iter0, iter1); gtk_text_buffer_remove_all_tags(buffer, iter0, iter1); (* mark *) mark := gtk_text_buffer_create_mark(buffer, "m1", iter0, 1); IF gtk_text_buffer_get_mark(buffer, "m1") # mark THEN printf("mark lookup wrong\n"); ok := FALSE END; CStrToM2(gtk_text_mark_get_name(mark), buf); IF (buf[0] # 'm') OR (buf[2] # 0C) THEN printf("mark name wrong: [%s]\n", buf); ok := FALSE END; gtk_text_mark_set_visible(mark, 1); IF gtk_text_mark_get_visible(mark) # 1 THEN ok := FALSE END; IF gtk_text_mark_get_deleted(mark) # 0 THEN ok := FALSE END; gtk_text_buffer_get_iter_at_mark(buffer, iter2, mark); IF gtk_text_iter_get_offset(iter2) # 0 THEN ok := FALSE END; (* inserts *) gtk_text_buffer_insert_at_cursor(buffer, "X", -1); IF gtk_text_buffer_get_char_count(buffer) # 12 THEN printf("insert_at_cursor wrong\n"); ok := FALSE END; gtk_text_buffer_get_iter_at_offset(buffer, iter0, 0); gtk_text_buffer_insert_markup(buffer, iter0, "hi", -1); IF gtk_text_buffer_get_char_count(buffer) # 14 THEN printf("insert_markup wrong\n"); ok := FALSE END; tag2 := gtk_text_buffer_create_tag(buffer, "red", NIL); IF tag2 = NIL THEN printf("create_tag NIL\n"); ok := FALSE END; (* entry buffer *) entry := gtk_entry_new(); eb := gtk_entry_get_buffer(entry); IF eb = NIL THEN printf("entry buffer NIL\n"); ok := FALSE END; gtk_entry_buffer_set_text(eb, "abcdef", -1); IF gtk_entry_buffer_get_length(eb) # 6 THEN printf("entry buffer length wrong\n"); ok := FALSE END; CStrToM2(gtk_entry_buffer_get_text(eb), buf); IF (buf[0] # 'a') OR (buf[5] # 'f') OR (buf[6] # 0C) THEN printf("entry buffer text wrong: [%s]\n", buf); ok := FALSE END; gtk_entry_buffer_set_max_length(eb, 10); IF gtk_entry_buffer_get_max_length(eb) # 10 THEN ok := FALSE END; (* entry completion *) completion := gtk_entry_completion_new(); gtk_entry_completion_set_text_column(completion, 0); IF gtk_entry_completion_get_text_column(completion) # 0 THEN ok := FALSE END; gtk_entry_completion_set_minimum_key_length(completion, 2); IF gtk_entry_completion_get_minimum_key_length(completion) # 2 THEN ok := FALSE END; gtk_entry_completion_set_popup_completion(completion, 1); gtk_entry_set_completion(entry, completion); IF gtk_entry_get_completion(entry) # completion THEN printf("entry completion wrong\n"); ok := FALSE END; view := gtk_text_view_new_with_buffer(buffer); box := gtk_box_new(GtkVertical, 4); gtk_box_append(box, view); gtk_box_append(box, entry); window := gtk_application_window_new(application); gtk_window_set_child(window, box); passed := ok; g_application_quit(application) END OnActivate; VAR rc: INTEGER; BEGIN passed := FALSE; app := gtk_application_new(AppId, 0); IF app = NIL THEN printf("test_text: FAIL (no app)\n"); HALT(1) END; Connect(app, "activate", ADR(OnActivate), NIL); rc := g_application_run(app, 0, NIL); IF passed THEN printf("test_text: PASS\n"); HALT(0) ELSE printf("test_text: FAIL\n"); HALT(1) END END test_text.