w_menugroup.srw 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. $PBExportHeader$w_menugroup.srw
  2. forward
  3. global type w_menugroup from w_publ_base_v2
  4. end type
  5. end forward
  6. global type w_menugroup from w_publ_base_v2
  7. integer width = 3867
  8. integer height = 2840
  9. string title = "菜单"
  10. boolean resizable = false
  11. windowstate windowstate = normal!
  12. end type
  13. global w_menugroup w_menugroup
  14. type variables
  15. uo_button ins_button_top[]
  16. uo_button ins_button_arr[]
  17. int ins_groupindex_arr[]
  18. groupbox ins_groupbox_arr[]
  19. GraphicObject ins_pgoobject
  20. Int ins_topindex
  21. String ins_itemkey = "menugroup_top_"
  22. groupbox gb_history
  23. windowobject ins_movable_controls[]
  24. Int ins_movable_initY[]
  25. end variables
  26. forward prototypes
  27. public subroutine wf_handleevent (string arg_event)
  28. public subroutine wf_settop (windowobject arg_control)
  29. public function uo_button wf_createbtn (string arg_eventtag)
  30. public subroutine wf_canceltop (uo_button arg_control)
  31. public subroutine wf_updown (long arg_long)
  32. end prototypes
  33. public subroutine wf_handleevent (string arg_event);ins_pgoobject.postevent(arg_event)
  34. close(this)
  35. end subroutine
  36. public subroutine wf_settop (windowobject arg_control);String ls_tag
  37. ls_tag = arg_control.tag
  38. wf_canceltop(arg_control)
  39. uo_button arr_newtop[]
  40. uo_button luo_tmpbtn
  41. luo_tmpbtn = wf_createbtn(ls_tag)
  42. luo_tmpbtn.ins_istop = true
  43. ins_topindex++
  44. This.OpenUserObject(luo_tmpbtn, "topbutton_" + String(ins_topindex), 700,0)
  45. arr_newtop[1] = luo_tmpbtn
  46. Int li_i
  47. FOR li_i = 1 TO UpperBound(ins_button_top)
  48. arr_newtop[UpperBound(arr_newtop)+1] = ins_button_top[li_i]
  49. NEXT
  50. ins_button_top = arr_newtop
  51. this.postevent(resize!)
  52. end subroutine
  53. public function uo_button wf_createbtn (string arg_eventtag);u_Dfc_Base_Func duFunc
  54. String ls_label, ls_event, ls_msgid, ls_picname
  55. ls_label = duFunc.uf_GetKeyValue(arg_eventtag, "Text")
  56. ls_event = duFunc.uf_GetKeyValue(arg_eventtag, "Event")
  57. ls_msgid = duFunc.uf_GetKeyValue(arg_eventtag, "MsgID")
  58. ls_picname = duFunc.uf_GetKeyValue(arg_eventtag, "ICON")
  59. uo_button tmp_button
  60. tmp_button = CREATE uo_button
  61. tmp_button.Tag = arg_eventtag
  62. tmp_button.label = ls_label
  63. tmp_button.ins_parentwindow = this
  64. tmp_button.menuevent = ls_event
  65. tmp_button.ins_msgid = ls_msgid
  66. tmp_button.picname = ls_picname
  67. tmp_button.width = 716
  68. RETURN tmp_button
  69. end function
  70. public subroutine wf_canceltop (uo_button arg_control);IF UpperBound(ins_button_top) <= 0 THEN RETURN
  71. uo_button arr_newtop[], luo_tmpbtn
  72. Int li_i, li_remove_i
  73. FOR li_i = 1 TO UpperBound(ins_button_top)
  74. luo_tmpbtn = ins_button_top[li_i]
  75. IF luo_tmpbtn.tag = arg_control.tag THEN
  76. li_remove_i = li_i
  77. ELSE
  78. arr_newtop[UpperBound(arr_newtop)+1] = luo_tmpbtn
  79. END IF
  80. NEXT
  81. IF li_remove_i > 0 THEN
  82. This.closeuserobject(ins_button_top[li_remove_i])
  83. ins_button_top = arr_newtop
  84. this.postevent(resize!)
  85. END IF
  86. end subroutine
  87. public subroutine wf_updown (long arg_long);if arg_long < 0 then arg_long = 0
  88. if arg_long > vsb_1.MaxPosition then arg_long = vsb_1.MaxPosition
  89. Int li_i
  90. FOR li_i = 1 TO UpperBound(ins_movable_controls)
  91. IF ins_movable_controls[li_i].classname() = "uo_button" THEN
  92. uo_button tmp_btn
  93. tmp_btn = ins_movable_controls[li_i]
  94. tmp_btn.Y = ins_movable_initY[li_i] - arg_long * 100
  95. ELSEIF ins_movable_controls[li_i].classname() = "groupbox" THEN
  96. groupbox tmp_gb
  97. tmp_gb = ins_movable_controls[li_i]
  98. tmp_gb.Y = ins_movable_initY[li_i] - arg_long * 100
  99. END IF
  100. NEXT
  101. end subroutine
  102. on w_menugroup.create
  103. call super::create
  104. end on
  105. on w_menugroup.destroy
  106. call super::destroy
  107. end on
  108. event open;call super::open;uo_menugroup luo_open
  109. luo_open = Message.powerobjectparm
  110. ins_pgoobject = luo_open.ins_pgoobject
  111. ins_itemkey = "menugroup_top_" + luo_open.ins_menukey
  112. IF luo_open.ins_menutitle <> "" THEN
  113. This.title = luo_open.ins_menutitle
  114. END IF
  115. u_Dfc_Base_Func duFunc
  116. String dsList[]
  117. Integer i
  118. duFunc.uf_Split(luo_open.ins_psmenulist, "|", dsList)
  119. String ls_label
  120. uo_button tmp_button
  121. groupbox tmp_group
  122. For i = 1 To UpperBound(dsList)
  123. ls_label = duFunc.uf_GetKeyValue(dsList[i], "Text")
  124. IF ls_label = "-" THEN
  125. ins_groupindex_arr[UpperBound(ins_groupindex_arr)+1] = UpperBound(ins_button_arr)
  126. tmp_group = CREATE groupbox
  127. tmp_group.backcolor = 134217739
  128. ins_groupbox_arr[UpperBound(ins_groupbox_arr)+1] = tmp_group
  129. This.OpenUserObject(tmp_group, "gb_" + String(UpperBound(ins_groupbox_arr)), 0,(UpperBound(ins_groupbox_arr)-1)*700)
  130. ELSE
  131. tmp_button = wf_createbtn(dsList[i])
  132. ins_button_arr[UpperBound(ins_button_arr)+1] = tmp_button
  133. This.OpenUserObject(tmp_button, "menubutton_" + String(UpperBound(ins_button_arr)), (UpperBound(ins_button_arr)-1)*700,0)
  134. END IF
  135. Next
  136. ins_groupindex_arr[UpperBound(ins_groupindex_arr)+1] = UpperBound(ins_button_arr)
  137. tmp_group = CREATE groupbox
  138. tmp_group.backcolor = 134217739
  139. ins_groupbox_arr[UpperBound(ins_groupbox_arr)+1] = tmp_group
  140. This.OpenUserObject(tmp_group, "gb_" + String(UpperBound(ins_groupbox_arr)), 0,(UpperBound(ins_groupbox_arr)-1)*700)
  141. // 置顶
  142. gb_history = CREATE groupbox
  143. gb_history.backcolor = 134217739
  144. gb_history.text = "置顶"
  145. gb_history.textsize = -9
  146. gb_history.facename = "宋体"
  147. This.OpenUserObject(gb_history, "gb_history", 0,0)
  148. String ls_tophistory, hisList[]
  149. ls_tophistory = f_ProfileString (sys_empid,"w_menugroup",ins_itemkey,'')
  150. String ls_tmplabel, ls_tmpevent
  151. Int j
  152. IF ls_tophistory <> "" THEN
  153. duFunc.uf_Split(ls_tophistory, "|", hisList)
  154. For i = UpperBound(hisList) TO 1 STEP -1
  155. ls_tmplabel = duFunc.uf_GetKeyValue(hisList[i], "Text")
  156. ls_tmpevent = duFunc.uf_GetKeyValue(hisList[i], "Event")
  157. FOR j = 1 TO UpperBound(ins_button_arr)
  158. tmp_button = ins_button_arr[j]
  159. IF tmp_button.label = ls_tmplabel AND tmp_button.menuevent = ls_tmpevent THEN
  160. wf_settop(tmp_button)
  161. EXIT
  162. END IF
  163. NEXT
  164. NEXT
  165. END IF
  166. this.postevent(resize!)
  167. end event
  168. event deactivate;call super::deactivate;close(this)
  169. end event
  170. event resize;call super::resize;windowobject arr_empty_controls[]
  171. Int arr_empty_Y[]
  172. ins_movable_controls = arr_empty_controls
  173. ins_movable_initY = arr_empty_Y
  174. IF UpperBound(ins_button_arr) <= 0 THEN RETURN
  175. Int li_group_i
  176. Int li_button_i, li_tmpx, li_tmpy, li_marginh, li_marginv, li_lineheight, li_itemwidth, li_groupY
  177. li_marginh = 24
  178. li_marginv = 12
  179. li_lineheight = ins_button_arr[1].height + li_marginv
  180. li_itemwidth = ins_button_arr[1].width + li_marginh
  181. //TODO:置顶
  182. IF UpperBound(ins_button_top) <= 0 THEN
  183. //gb_history.visible = false
  184. gb_history.Y = -500
  185. gb_history.height = 1
  186. ELSE
  187. // gb_history.visible = true
  188. li_tmpx = li_marginh*2
  189. li_tmpy = 60
  190. Int li_top_i
  191. FOR li_top_i = 1 TO UpperBound(ins_button_top)
  192. IF li_tmpx = li_marginh THEN
  193. ELSEIF li_tmpx + li_itemwidth > this.workspacewidth() THEN
  194. li_tmpx = li_marginh*2
  195. li_tmpy += li_lineheight
  196. ELSE
  197. END IF
  198. ins_button_top[li_top_i].X = li_tmpx
  199. ins_button_top[li_top_i].Y = li_tmpy
  200. ins_button_top[li_top_i].bringtotop = true
  201. li_tmpx += li_itemwidth
  202. ins_movable_controls[UpperBound(ins_movable_controls)+1] = ins_button_top[li_top_i]
  203. ins_movable_initY[UpperBound(ins_movable_initY)+1] = ins_button_top[li_top_i].Y
  204. NEXT
  205. gb_history.X = li_marginh
  206. gb_history.Y = 0
  207. gb_history.height = li_tmpy + li_lineheight + 4
  208. gb_history.width = this.workspacewidth() - li_marginh * 2 - vsb_1.width
  209. ins_movable_controls[UpperBound(ins_movable_controls)+1] = gb_history
  210. ins_movable_initY[UpperBound(ins_movable_initY)+1] = gb_history.Y
  211. li_tmpy += 24
  212. END IF
  213. FOR li_group_i = 1 TO UpperBound(ins_groupindex_arr)
  214. IF li_tmpy = 0 THEN
  215. li_tmpx = li_marginh*2
  216. li_tmpy = 0
  217. li_groupY = 0
  218. li_tmpy = 60
  219. ELSE
  220. li_tmpx = li_marginh*2
  221. li_tmpy += li_lineheight
  222. li_groupY = li_tmpy - 24
  223. li_tmpy += 36
  224. END IF
  225. DO WHILE li_button_i < ins_groupindex_arr[li_group_i]
  226. li_button_i++
  227. IF li_tmpx = li_marginh THEN
  228. ELSEIF li_tmpx + li_itemwidth > this.workspacewidth() THEN
  229. li_tmpx = li_marginh*2
  230. li_tmpy += li_lineheight
  231. ELSE
  232. END IF
  233. ins_button_arr[li_button_i].X = li_tmpx
  234. ins_button_arr[li_button_i].Y = li_tmpy
  235. li_tmpx += li_itemwidth
  236. ins_movable_controls[UpperBound(ins_movable_controls)+1] = ins_button_arr[li_button_i]
  237. ins_movable_initY[UpperBound(ins_movable_initY)+1] = ins_button_arr[li_button_i].Y
  238. LOOP
  239. ins_groupbox_arr[li_group_i].X = li_marginh
  240. ins_groupbox_arr[li_group_i].Y = li_groupY
  241. ins_groupbox_arr[li_group_i].height = li_tmpy + li_lineheight - li_groupY + 4
  242. ins_groupbox_arr[li_group_i].width = this.workspacewidth() - li_marginh * 2 - vsb_1.width
  243. ins_movable_controls[UpperBound(ins_movable_controls)+1] = ins_groupbox_arr[li_group_i]
  244. ins_movable_initY[UpperBound(ins_movable_initY)+1] = ins_groupbox_arr[li_group_i].Y
  245. NEXT
  246. Long ll_dif
  247. ll_dif = Ceiling(dec(ins_groupbox_arr[UpperBound(ins_groupindex_arr)].Y+ins_groupbox_arr[UpperBound(ins_groupindex_arr)].height - this.workspaceheight()) / 100)
  248. IF ll_dif > 0 THEN
  249. vsb_1.maxposition = ll_dif
  250. vsb_1.x = this.workspacewidth() - vsb_1.width
  251. vsb_1.Y = 0
  252. vsb_1.height = this.workspaceheight() - vsb_1.y
  253. vsb_1.Visible = true
  254. ELSE
  255. vsb_1.Visible = false
  256. END IF
  257. end event
  258. event close;call super::close;string ls_top_history
  259. IF UpperBound(ins_button_top) > 0 THEN
  260. Int li_i
  261. FOR li_i = 1 TO UpperBound(ins_button_top)
  262. IF ls_top_history <> "" THEN ls_top_history+= "|"
  263. ls_top_history+=ins_button_top[li_i].tag
  264. NEXT
  265. END IF
  266. f_SetProfileString(sys_empid,"w_menugroup",ins_itemkey, ls_top_history)
  267. end event
  268. type vsb_1 from w_publ_base_v2`vsb_1 within w_menugroup
  269. end type
  270. type cb_func from w_publ_base_v2`cb_func within w_menugroup
  271. boolean visible = false
  272. boolean enabled = false
  273. end type
  274. type cb_exit from w_publ_base_v2`cb_exit within w_menugroup
  275. boolean visible = false
  276. boolean enabled = false
  277. end type