|
|
@@ -0,0 +1,181 @@
|
|
|
+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, "<b>hi</b>", -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.
|