dialog.inc 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. (* Dialog and Message Boxes
  2. *
  3. * Dialog widgets are used to pop up a transient window for user feedback.
  4. *)
  5. var
  6. dialog_entry1,
  7. dialog_entry2,
  8. dialog_window : PGtkWidget;
  9. dialog_i : gint;
  10. procedure message_dialog_clicked (button : PGtkButton;
  11. user_data : gpointer);
  12. var
  13. dialog : PGtkWidget;
  14. begin
  15. dialog := gtk_message_dialog_new (GTK_WINDOW (dialog_window),
  16. GTK_DIALOG_MODAL or GTK_DIALOG_DESTROY_WITH_PARENT,
  17. GTK_MESSAGE_INFO,
  18. GTK_BUTTONS_OK,
  19. 'This message box has been popped up the following'#13#10+
  20. 'number of times:'#13#10#13#10+
  21. '%d', [dialog_i]);
  22. gtk_dialog_run (GTK_DIALOG (dialog));
  23. gtk_widget_destroy (dialog);
  24. inc(dialog_i);
  25. end;
  26. procedure interactive_dialog_clicked ( button : PGtkButton;
  27. user_data : gpointer);
  28. var
  29. dialog,
  30. hbox,
  31. stock,
  32. table,
  33. local_entry1,
  34. local_entry2,
  35. thelabel : PGtkWidget;
  36. response : gint;
  37. begin
  38. dialog := gtk_dialog_new_with_buttons ('Interactive Dialog',
  39. GTK_WINDOW (dialog_window),
  40. GTK_DIALOG_MODAL or
  41. GTK_DIALOG_DESTROY_WITH_PARENT,
  42. GTK_STOCK_OK,
  43. [ GTK_RESPONSE_OK,
  44. '_Non-stock Button',
  45. GTK_RESPONSE_CANCEL,
  46. NULL]);
  47. hbox := gtk_hbox_new (FALSE, 8);
  48. gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
  49. gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)^.vbox), hbox, FALSE, FALSE, 0);
  50. stock := gtk_image_new_from_stock (GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG);
  51. gtk_box_pack_start (GTK_BOX (hbox), stock, FALSE, FALSE, 0);
  52. table := gtk_table_new (2, 2, FALSE);
  53. gtk_table_set_row_spacings (GTK_TABLE (table), 4);
  54. gtk_table_set_col_spacings (GTK_TABLE (table), 4);
  55. gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);
  56. thelabel := gtk_label_new_with_mnemonic ('_Entry 1');
  57. gtk_table_attach_defaults (GTK_TABLE (table),
  58. thelabel,
  59. 0, 1, 0, 1);
  60. local_entry1 := gtk_entry_new ();
  61. gtk_entry_set_text (GTK_ENTRY (local_entry1), gtk_entry_get_text (GTK_ENTRY (dialog_entry1)));
  62. gtk_table_attach_defaults (GTK_TABLE (table), local_entry1, 1, 2, 0, 1);
  63. gtk_label_set_mnemonic_widget (GTK_LABEL (thelabel), local_entry1);
  64. thelabel := gtk_label_new_with_mnemonic ('E_ntry 2');
  65. gtk_table_attach_defaults (GTK_TABLE (table),
  66. thelabel,
  67. 0, 1, 1, 2);
  68. local_entry2 := gtk_entry_new ();
  69. gtk_entry_set_text (GTK_ENTRY (local_entry2), gtk_entry_get_text (GTK_ENTRY (dialog_entry2)));
  70. gtk_table_attach_defaults (GTK_TABLE (table), local_entry2, 1, 2, 1, 2);
  71. gtk_label_set_mnemonic_widget (GTK_LABEL (thelabel), local_entry2);
  72. gtk_widget_show_all (hbox);
  73. response := gtk_dialog_run (GTK_DIALOG (dialog));
  74. if response = GTK_RESPONSE_OK then
  75. begin
  76. gtk_entry_set_text (GTK_ENTRY (dialog_entry1), gtk_entry_get_text (GTK_ENTRY (local_entry1)));
  77. gtk_entry_set_text (GTK_ENTRY (dialog_entry2), gtk_entry_get_text (GTK_ENTRY (local_entry2)));
  78. end;
  79. gtk_widget_destroy (dialog);
  80. end;
  81. function do_dialog : PGtkWidget;
  82. var
  83. frame,
  84. vbox,
  85. vbox2,
  86. hbox,
  87. button,
  88. table,
  89. thelabel : PGtkWidget;
  90. begin
  91. dialog_i := 1;
  92. if dialog_window = NULL then
  93. begin
  94. dialog_window := gtk_window_new (GTK_WINDOW_TOPLEVEL);
  95. gtk_window_set_title (GTK_WINDOW (dialog_window), 'Dialogs');
  96. g_signal_connect (dialog_window, 'destroy', G_CALLBACK (@gtk_widget_destroyed), @dialog_window);
  97. gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 8);
  98. frame := gtk_frame_new ('Dialogs');
  99. gtk_container_add (GTK_CONTAINER (dialog_window), frame);
  100. vbox := gtk_vbox_new (FALSE, 8);
  101. gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
  102. gtk_container_add (GTK_CONTAINER (frame), vbox);
  103. (* Standard message dialog *)
  104. hbox := gtk_hbox_new (FALSE, 8);
  105. gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
  106. button := gtk_button_new_with_mnemonic ('_Message Dialog');
  107. g_signal_connect (button, 'clicked',
  108. G_CALLBACK (@message_dialog_clicked), @dialog_window);
  109. gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
  110. gtk_box_pack_start (GTK_BOX (vbox), gtk_hseparator_new (), FALSE, FALSE, 0);
  111. (* Interactive dialog*)
  112. hbox := gtk_hbox_new (FALSE, 8);
  113. gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
  114. vbox2 := gtk_vbox_new (FALSE, 0);
  115. button := gtk_button_new_with_mnemonic ('_Interactive Dialog');
  116. g_signal_connect (button, 'clicked',
  117. G_CALLBACK (@interactive_dialog_clicked), @dialog_window);
  118. gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);
  119. gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
  120. table := gtk_table_new (2, 2, FALSE);
  121. gtk_table_set_row_spacings (GTK_TABLE (table), 4);
  122. gtk_table_set_col_spacings (GTK_TABLE (table), 4);
  123. gtk_box_pack_start (GTK_BOX (hbox), table, FALSE, FALSE, 0);
  124. thelabel := gtk_label_new_with_mnemonic ('_Entry 1');
  125. gtk_table_attach_defaults (GTK_TABLE (table),
  126. thelabel,
  127. 0, 1, 0, 1);
  128. dialog_entry1 := gtk_entry_new ();
  129. gtk_table_attach_defaults (GTK_TABLE (table), dialog_entry1, 1, 2, 0, 1);
  130. gtk_label_set_mnemonic_widget (GTK_LABEL (thelabel), dialog_entry1);
  131. thelabel := gtk_label_new_with_mnemonic ('E_ntry 2');
  132. gtk_table_attach_defaults (GTK_TABLE (table),
  133. thelabel,
  134. 0, 1, 1, 2);
  135. dialog_entry2 := gtk_entry_new ();
  136. gtk_table_attach_defaults (GTK_TABLE (table), dialog_entry2, 1, 2, 1, 2);
  137. gtk_label_set_mnemonic_widget (GTK_LABEL (thelabel), dialog_entry2);
  138. end;
  139. if not GTK_WIDGET_VISIBLE (dialog_window) then
  140. gtk_widget_show_all (dialog_window)
  141. else begin
  142. gtk_widget_destroy (dialog_window);
  143. dialog_window := NULL;
  144. end;
  145. do_dialog := dialog_window;
  146. end;