t2form.pp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. program form_test_2;
  2. {$MODE OBJFPC}
  3. uses
  4. ncurses, form, libc;
  5. var
  6. my_bg: Smallint = COLOR_BLACK;
  7. field: array[0..5] of PFIELD;
  8. my_form: PFORM;
  9. i, ch: Longint;
  10. begin
  11. try
  12. setlocale(LC_ALL, ''); { Tested with Russian UTF-8 locale }
  13. (* Initialize curses *)
  14. initscr();
  15. cbreak();
  16. noecho();
  17. keypad(stdscr, TRUE);
  18. (* Initialize colors *)
  19. if has_colors() then
  20. begin
  21. start_color();
  22. if (use_default_colors() = OK) then
  23. my_bg := -1
  24. else
  25. my_bg := COLOR_BLACK;
  26. init_pair(1, COLOR_YELLOW, my_bg);
  27. init_pair(2, COLOR_MAGENTA, my_bg);
  28. init_pair(3, COLOR_WHITE, my_bg);
  29. init_pair(4, COLOR_WHITE, COLOR_BLUE);
  30. init_pair(5, COLOR_WHITE, COLOR_GREEN);
  31. init_pair(6, COLOR_YELLOW, COLOR_GREEN);
  32. init_pair(7, COLOR_BLACK, COLOR_CYAN);
  33. end;
  34. (* Initialize the fields *)
  35. for i := 0 to 3 do
  36. begin
  37. field[i] := new_field(1, 30, 2 + i * 2, 10, 0, 0);
  38. field_opts_off(field[i], O_AUTOSKIP);
  39. end;
  40. field[4] := new_field(7, 30, 2, 42, 0, 0);
  41. field[5] := nil;
  42. (* Set field options *)
  43. set_field_fore(field[0], COLOR_PAIR(2));
  44. set_field_back(field[0], A_UNDERLINE OR COLOR_PAIR(3));
  45. set_field_fore(field[1], COLOR_PAIR(1));
  46. set_field_back(field[1], A_UNDERLINE OR COLOR_PAIR(1));
  47. field_opts_off(field[1], O_ACTIVE);
  48. set_field_fore(field[2], COLOR_PAIR(4));
  49. set_field_back(field[2], A_UNDERLINE OR COLOR_PAIR(4));
  50. field_opts_off(field[2], O_PUBLIC);
  51. set_field_fore(field[3], COLOR_PAIR(5));
  52. set_field_back(field[3], A_UNDERLINE OR COLOR_PAIR(5));
  53. field_opts_off(field[3], O_STATIC);
  54. set_field_fore(field[4], COLOR_PAIR(7));
  55. set_field_back(field[4], COLOR_PAIR(7));
  56. (* Create the form and post it *)
  57. my_form := new_form(field);
  58. post_form(my_form);
  59. (* Center Justification *)
  60. set_field_just(field[0], JUSTIFY_CENTER);
  61. set_field_buffer(field[0], 0, 'This is a static Field');
  62. set_field_just(field[1], JUSTIFY_CENTER);
  63. set_field_buffer(field[1], 0, 'This is a inactive Field');
  64. (* Set focus to the blue field *)
  65. set_current_field(my_form, field[0]);
  66. for i := 0 to 3 do
  67. mvprintw(2 + i * 2, 2, 'Value %d:', i + 1);
  68. mvaddstr(LINES - 2, 0, 'F1 to Exit');
  69. refresh();
  70. (* Loop through to get user requests *)
  71. ch := getch();
  72. while (ch <> KEY_F(1)) AND (ch <> 27) do
  73. begin
  74. case ch of
  75. 9: { TAB }
  76. begin
  77. if form_driver(my_form, REQ_NEXT_WORD) <> E_OK then
  78. begin
  79. form_driver(my_form, REQ_VALIDATION);
  80. form_driver(my_form, REQ_NEXT_FIELD);
  81. form_driver(my_form, REQ_END_LINE);
  82. end;
  83. end;
  84. KEY_NPAGE:
  85. (* Go to next field *)
  86. begin
  87. form_driver(my_form, REQ_VALIDATION);
  88. form_driver(my_form, REQ_NEXT_FIELD);
  89. { Go to the end of the present buffer
  90. Leaves nicely at the last character }
  91. form_driver(my_form, REQ_END_LINE);
  92. end;
  93. KEY_PPAGE:
  94. (* Go to previous field *)
  95. begin
  96. form_driver(my_form, REQ_VALIDATION);
  97. form_driver(my_form, REQ_PREV_FIELD);
  98. form_driver(my_form, REQ_END_LINE);
  99. end;
  100. KEY_DOWN:
  101. if form_driver(my_form, REQ_DOWN_CHAR) <> E_OK then
  102. begin
  103. form_driver(my_form, REQ_VALIDATION);
  104. form_driver(my_form, REQ_DOWN_FIELD);
  105. form_driver(my_form, REQ_END_LINE);
  106. end;
  107. KEY_UP:
  108. if form_driver(my_form, REQ_UP_CHAR) <> E_OK then
  109. begin
  110. form_driver(my_form, REQ_VALIDATION);
  111. form_driver(my_form, REQ_UP_FIELD);
  112. form_driver(my_form, REQ_END_LINE);
  113. end;
  114. KEY_LEFT:
  115. if form_driver(my_form, REQ_LEFT_CHAR) <> E_OK then
  116. begin
  117. form_driver(my_form, REQ_VALIDATION);
  118. form_driver(my_form, REQ_LEFT_FIELD);
  119. form_driver(my_form, REQ_END_LINE);
  120. end;
  121. KEY_RIGHT:
  122. if form_driver(my_form, REQ_RIGHT_CHAR) <> E_OK then
  123. begin
  124. form_driver(my_form, REQ_VALIDATION);
  125. form_driver(my_form, REQ_RIGHT_FIELD);
  126. end;
  127. KEY_BACKSPACE: form_driver(my_form, REQ_DEL_PREV);
  128. 10: { ENTER }
  129. begin
  130. form_driver(my_form, 10);
  131. if form_driver(my_form, REQ_NEXT_LINE) <> E_OK then
  132. begin
  133. form_driver(my_form, REQ_VALIDATION);
  134. form_driver(my_form, REQ_NEXT_FIELD);
  135. form_driver(my_form, REQ_END_LINE);
  136. end;
  137. end;
  138. else
  139. { If this is a normal character, it gets
  140. Printed }
  141. form_driver(my_form, ch);
  142. end;
  143. ch := getch();
  144. end;
  145. refresh();
  146. finally
  147. unpost_form(my_form);
  148. free_form(my_form);
  149. endwin();
  150. for i := 0 to 4 do
  151. begin
  152. if field_status(field[i]) then
  153. begin
  154. writeln;
  155. writeln('Value ', i,':');
  156. writeln(field_buffer(field[i], 0));
  157. end;
  158. free_field(field[i]);
  159. end
  160. end;
  161. end.