pup.pp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. { Demo: complete pop-ups.
  2. * test font/cursor change
  3. * test attaching pup to menu
  4. }
  5. program popup;
  6. uses xforms,strings;
  7. var
  8. pup : PFL_FORM;
  9. done, pret, b1, b2, b3, menu : PFL_OBJECT;
  10. var
  11. aa : TFL_IOPT;
  12. mask : cardinal;
  13. const
  14. subm : longint = -1;
  15. m : longint = -1;
  16. ssm : longint = 0;
  17. n1 : longint = -1;
  18. n2 : longint = -1;
  19. n : longint = 0;
  20. { post-handler }
  21. function post(ob : PFL_OBJECT; ev : Longint; mx,y : TFL_Coord; key : longint; xev : pointer) : Longint;
  22. begin
  23. if (n1 = -1) then
  24. begin
  25. n1 := fl_defpup(FL_ObjWin(ob),'line1|line2');
  26. fl_setpup_shadow(n1,0);
  27. fl_setpup_bw(n1,0);
  28. fl_setpup_pad(n1,3,0);
  29. n2 := fl_defpup(FL_ObjWin(ob),'button1|button2');
  30. fl_setpup_shadow(n2,0);
  31. fl_setpup_bw(n2,-1);
  32. fl_setpup_pad(n2,3,0);
  33. end;
  34. if (ev = FL_ENTER) then
  35. begin
  36. if (ob=b3) then
  37. fl_show_oneliner('button3',ob^.form^.x+ob^.x,
  38. ob^.form^.y+ob^.y + ob^.h + 5)
  39. else
  40. begin
  41. fl_setpup_position(ob^.form^.x+ob^.x, ob^.form^.y+ob^.y+ob^.h + 5);
  42. if ob=b1 then
  43. fl_showpup(n1)
  44. else
  45. fl_showpup(n2);
  46. end
  47. end
  48. else if(ev <> FL_MOTION) then
  49. begin
  50. if (ob=b3) then
  51. fl_hide_oneliner
  52. else
  53. if ob=b1 then
  54. fl_hidepup(n1)
  55. else
  56. fl_hidepup(n2);
  57. end;
  58. end;
  59. procedure show_return_val(i : longint);
  60. var
  61. buf : string[128];
  62. begin
  63. str(i,buf);
  64. buf:= 'Returned '+buf;
  65. if i>0 then
  66. buf:=buf+'('++strpas(fl_getpup_text(m,i))+')'#0;
  67. fl_set_object_label(pret, @buf[1]);
  68. end;
  69. function ssm_cb(a : longint) : longint;
  70. begin
  71. show_return_val(a);
  72. ssm_cb:=a;
  73. end;
  74. procedure do_pup(ob : PFL_OBJECT; q : longint);
  75. begin
  76. if (subm = -1) then
  77. begin
  78. ssm := fl_newpup(FL_ObjWin(ob));
  79. subm := fl_newpup(FL_ObjWin(ob));
  80. m := fl_newpup(FL_ObjWin(ob));
  81. { Problem, variable nr. of arguments in c code !!!!}
  82. { fl_addtopup(ssm,'SubSubM%F%t',ssm_cb); }
  83. fl_addtopup(ssm,'SSMItem20%x20%R1');
  84. fl_addtopup(ssm,'SSMItem21%x21%r1');
  85. fl_addtopup(ssm,'SSMItem22%x22%r1%l');
  86. fl_addtopup(ssm,'SSMitem30%x30%R2');
  87. fl_addtopup(ssm,'SSMItem31%x31%r2');
  88. fl_addtopup(ssm,'SSMItem32%x32%r2');
  89. fl_addtopup(subm,'SubMenu%t');
  90. fl_addtopup(subm,'SMItemA\tAlt-A%x10%h','#a');
  91. fl_addtopup(subm,'SMItemB\tAlt-B%x11%h','#b');
  92. fl_addtopup(subm,'SMItemC\tAlt-C%x12%h','#c');
  93. fl_addtopup(subm,'SMItemD\tAlt-F5%x13%h%m','#&5',ssm);
  94. fl_addtopup(subm,'SMItemE\tAlt-E%x14','#E');
  95. fl_setpup_mode(subm, 14, FL_PUP_GREY);
  96. fl_addtopup(m,'PopUP%t');
  97. fl_addtopup(m,'MenuItem1%h','1#1');
  98. fl_addtopup(m,'MenuItem2%h','2#2');
  99. fl_setpup_submenu(m, 2, subm);
  100. fl_addtopup(m,'MenuItem3%h','3#3');
  101. fl_addtopup(m,'MenuItem4%h','4#4');
  102. end;
  103. if (fl_get_button_numb(ob) >= FL_SHORTCUT) then
  104. fl_setpup_position(ob^.form^.x + ob^.x,
  105. ob^.form^.y + ob^.y + ob^.h);
  106. show_return_val(fl_dopup(m));
  107. { test if changing size/style ok }
  108. n := not(n);
  109. if n<>0 then
  110. begin
  111. fl_setpup_fontsize(14);
  112. fl_setpup_fontstyle(FL_TIMES_STYLE);
  113. fl_setpup_cursor(m, XC_hand2);
  114. end
  115. else
  116. begin
  117. fl_setpup_fontsize(12);
  118. fl_setpup_fontstyle(FL_BOLDITALIC_STYLE);
  119. fl_setpup_cursor(m,XC_sb_right_arrow);
  120. end;
  121. end;
  122. procedure init_menu;
  123. var
  124. mm,smm : longint;
  125. begin
  126. mm := fl_newpup(fl_default_win);
  127. fl_setpup_bw(mm, -2);
  128. fl_setpup_shadow(mm, 0);
  129. smm := fl_newpup(0);
  130. fl_setpup_shadow(smm, 0);
  131. fl_addtopup(mm,'MenuItem1|MenuItem2%m|MenuItem3',smm);
  132. fl_addtopup(smm,'SubItem1%x11|SubItem2%x12|SubItem3%x13');
  133. { attach pup to menu }
  134. fl_set_menu_popup(menu, mm);
  135. end;
  136. procedure do_menu(ob : PFL_OBJECT; data : longint);
  137. var
  138. buf : string[128];
  139. begin
  140. str(fl_get_menu(ob),buf);
  141. if (fl_get_menu(ob) >= 0) then
  142. buf:=buf+strpas(fl_get_menu_text(ob));
  143. buf:=buf+#0;
  144. fl_set_object_label(pret, @buf[1]);
  145. end;
  146. procdure done_cb(ob : PFL_OBJECT; data : longint);
  147. begin
  148. halt(0)
  149. end;
  150. procedure create_form_pup;
  151. var
  152. obj : PFL_OBJECT ;
  153. begin
  154. if (pup<>nil) then
  155. exit;
  156. pup := fl_bgn_form(FL_UP_BOX,260,210);
  157. obj := fl_add_button(FL_NORMAL_BUTTON,150,150,90,35,'Done');
  158. fl_set_object_callback(obj,PFL_CALLBACKPTR(@done_cb), 0);
  159. done := obj;
  160. obj := fl_add_button(FL_MENU_BUTTON,30,90,100,30,'PopUp');
  161. fl_set_button_shortcut(obj,'Pp#p',1);
  162. fl_set_object_callback(obj, PFL_CALLBACKPTR(@do_pup), 0);
  163. obj := fl_add_menu(FL_PULLDOWN_MENU,160,95,60,25,'Menu');
  164. fl_set_object_callback(obj, PFL_CALLBACKPTR(@do_menu), 0);
  165. menu := obj;
  166. obj := fl_add_text(FL_NORMAL_TEXT,20,60,220,30,'');
  167. fl_set_object_lalign(obj,FL_ALIGN_CENTER);
  168. pret := obj;
  169. b1 := fl_add_button(FL_NORMAL_BUTTON, 20, 10, 60, 30,'Button1');
  170. b2 := fl_add_button(FL_NORMAL_BUTTON, 90, 10, 60, 30,'Button2');
  171. b3 := fl_add_button(FL_NORMAL_BUTTON, 160, 10, 60, 30,'Button3');
  172. fl_end_form();
  173. end;
  174. begin
  175. mask := FL_PDVisual;
  176. aa.vclass := FL_DefaultVisual;
  177. fl_set_defaults(mask, @aa);
  178. fl_initialize(@argc, argv, 'FormDemo', nil, 0);
  179. create_form_pup();
  180. { initialize }
  181. fl_set_object_posthandler(b1, @post);
  182. fl_set_object_posthandler(b2, @post);
  183. fl_set_object_posthandler(b3, @post);
  184. fl_show_form(pup, FL_PLACE_MOUSE, FL_TRANSIENT,'PupDemo');
  185. init_menu;
  186. fl_do_forms;
  187. end.