wrb 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. checksums.yaml +7 -0
  2. data/README +28 -0
  3. data/Rakefile +66 -0
  4. data/bin/wrb +41 -0
  5. data/bin/wrb.bat +6 -0
  6. data/ext/rwin/aatree.c +192 -0
  7. data/ext/rwin/aatree.h +55 -0
  8. data/ext/rwin/extconf.rb +47 -0
  9. data/ext/rwin/rw_api.c +2058 -0
  10. data/ext/rwin/rw_devices.c +215 -0
  11. data/ext/rwin/rw_gdiplus.h +278 -0
  12. data/ext/rwin/rw_graphics.c +1583 -0
  13. data/ext/rwin/rw_resources.c +1988 -0
  14. data/ext/rwin/rw_ubfuncs.c +281 -0
  15. data/ext/rwin/rw_windows.c +1936 -0
  16. data/ext/rwin/rwin.c +451 -0
  17. data/ext/rwin/rwin.h +442 -0
  18. data/lib/rwin.rb +820 -0
  19. data/lib/wrb.rb +20 -0
  20. data/lib/wrb/applications/frmdesigner/angle.cur +0 -0
  21. data/lib/wrb/applications/frmdesigner/angle2.cur +0 -0
  22. data/lib/wrb/applications/frmdesigner/controls/Button.bmp +0 -0
  23. data/lib/wrb/applications/frmdesigner/controls/Button.rb +34 -0
  24. data/lib/wrb/applications/frmdesigner/controls/Checkbox.bmp +0 -0
  25. data/lib/wrb/applications/frmdesigner/controls/Checkbox.rb +10 -0
  26. data/lib/wrb/applications/frmdesigner/controls/Combobox.bmp +0 -0
  27. data/lib/wrb/applications/frmdesigner/controls/Combobox.rb +88 -0
  28. data/lib/wrb/applications/frmdesigner/controls/ComboboxEx.rb +97 -0
  29. data/lib/wrb/applications/frmdesigner/controls/Comboboxex.bmp +0 -0
  30. data/lib/wrb/applications/frmdesigner/controls/DateTimePicker.bmp +0 -0
  31. data/lib/wrb/applications/frmdesigner/controls/DateTimePicker.rb +11 -0
  32. data/lib/wrb/applications/frmdesigner/controls/Edit.bmp +0 -0
  33. data/lib/wrb/applications/frmdesigner/controls/Edit.rb +8 -0
  34. data/lib/wrb/applications/frmdesigner/controls/Groupbox.bmp +0 -0
  35. data/lib/wrb/applications/frmdesigner/controls/Groupbox.rb +9 -0
  36. data/lib/wrb/applications/frmdesigner/controls/Hotkeyctrl.bmp +0 -0
  37. data/lib/wrb/applications/frmdesigner/controls/Hotkeyctrl.rb +9 -0
  38. data/lib/wrb/applications/frmdesigner/controls/Imagelist.bmp +0 -0
  39. data/lib/wrb/applications/frmdesigner/controls/Imagelist.rb +115 -0
  40. data/lib/wrb/applications/frmdesigner/controls/Listbox.bmp +0 -0
  41. data/lib/wrb/applications/frmdesigner/controls/Listbox.rb +77 -0
  42. data/lib/wrb/applications/frmdesigner/controls/Listview.bmp +0 -0
  43. data/lib/wrb/applications/frmdesigner/controls/Listview.rb +157 -0
  44. data/lib/wrb/applications/frmdesigner/controls/Menu.bmp +0 -0
  45. data/lib/wrb/applications/frmdesigner/controls/Menu.rb +198 -0
  46. data/lib/wrb/applications/frmdesigner/controls/Menubar.bmp +0 -0
  47. data/lib/wrb/applications/frmdesigner/controls/Menubar.rb +9 -0
  48. data/lib/wrb/applications/frmdesigner/controls/MonthCalender.bmp +0 -0
  49. data/lib/wrb/applications/frmdesigner/controls/Monthcalender.rb +9 -0
  50. data/lib/wrb/applications/frmdesigner/controls/Panel.bmp +0 -0
  51. data/lib/wrb/applications/frmdesigner/controls/Panel.rb +30 -0
  52. data/lib/wrb/applications/frmdesigner/controls/Progressbar.rb +10 -0
  53. data/lib/wrb/applications/frmdesigner/controls/Radiobutton.bmp +0 -0
  54. data/lib/wrb/applications/frmdesigner/controls/Radiobutton.rb +13 -0
  55. data/lib/wrb/applications/frmdesigner/controls/Rebar.bmp +0 -0
  56. data/lib/wrb/applications/frmdesigner/controls/Rebar.rb +162 -0
  57. data/lib/wrb/applications/frmdesigner/controls/Splitter.bmp +0 -0
  58. data/lib/wrb/applications/frmdesigner/controls/Splitter.rb +66 -0
  59. data/lib/wrb/applications/frmdesigner/controls/Static.bmp +0 -0
  60. data/lib/wrb/applications/frmdesigner/controls/Static.rb +9 -0
  61. data/lib/wrb/applications/frmdesigner/controls/Statusbar.bmp +0 -0
  62. data/lib/wrb/applications/frmdesigner/controls/Statusbar.rb +103 -0
  63. data/lib/wrb/applications/frmdesigner/controls/Tabctrl.bmp +0 -0
  64. data/lib/wrb/applications/frmdesigner/controls/Tabctrl.rb +136 -0
  65. data/lib/wrb/applications/frmdesigner/controls/Timer.bmp +0 -0
  66. data/lib/wrb/applications/frmdesigner/controls/Timer.rb +36 -0
  67. data/lib/wrb/applications/frmdesigner/controls/Toolbar.bmp +0 -0
  68. data/lib/wrb/applications/frmdesigner/controls/Toolbar.rb +165 -0
  69. data/lib/wrb/applications/frmdesigner/controls/Trackbar.bmp +0 -0
  70. data/lib/wrb/applications/frmdesigner/controls/Trackbar.rb +34 -0
  71. data/lib/wrb/applications/frmdesigner/controls/Treeview.bmp +0 -0
  72. data/lib/wrb/applications/frmdesigner/controls/Treeview.rb +107 -0
  73. data/lib/wrb/applications/frmdesigner/controls/Updown.bmp +0 -0
  74. data/lib/wrb/applications/frmdesigner/controls/Updown.rb +31 -0
  75. data/lib/wrb/applications/frmdesigner/controls/default.bmp +0 -0
  76. data/lib/wrb/applications/frmdesigner/controls/progressbar.bmp +0 -0
  77. data/lib/wrb/applications/frmdesigner/controls/unselect.bmp +0 -0
  78. data/lib/wrb/applications/frmdesigner/fddialogs.rb +87 -0
  79. data/lib/wrb/applications/frmdesigner/fdesign.rb +1315 -0
  80. data/lib/wrb/applications/frmdesigner/fdmodules.rb +1394 -0
  81. data/lib/wrb/applications/frmdesigner/fdparseform.rb +197 -0
  82. data/lib/wrb/applications/frmdesigner/img13.bmp +0 -0
  83. data/lib/wrb/base.rb +1294 -0
  84. data/lib/wrb/combocommon.rb +77 -0
  85. data/lib/wrb/commctrlconst.rb +139 -0
  86. data/lib/wrb/commdlg.rb +77 -0
  87. data/lib/wrb/components/animate.rb +114 -0
  88. data/lib/wrb/components/bitmap.rb +116 -0
  89. data/lib/wrb/components/button.rb +134 -0
  90. data/lib/wrb/components/canvas.rb +266 -0
  91. data/lib/wrb/components/checkbox.rb +118 -0
  92. data/lib/wrb/components/choosecolordlg.rb +87 -0
  93. data/lib/wrb/components/choosefontdlg.rb +142 -0
  94. data/lib/wrb/components/clipboard.rb +174 -0
  95. data/lib/wrb/components/combobox.rb +282 -0
  96. data/lib/wrb/components/comboboxex.rb +574 -0
  97. data/lib/wrb/components/cursor.rb +91 -0
  98. data/lib/wrb/components/datetimepicker.rb +197 -0
  99. data/lib/wrb/components/ddeclient.rb +180 -0
  100. data/lib/wrb/components/ddeserver.rb +131 -0
  101. data/lib/wrb/components/dialog.rb +228 -0
  102. data/lib/wrb/components/edit.rb +412 -0
  103. data/lib/wrb/components/font.rb +35 -0
  104. data/lib/wrb/components/form.rb +65 -0
  105. data/lib/wrb/components/groupbox.rb +122 -0
  106. data/lib/wrb/components/header.rb +479 -0
  107. data/lib/wrb/components/hotkeyctrl.rb +72 -0
  108. data/lib/wrb/components/icon.rb +109 -0
  109. data/lib/wrb/components/imagelist.rb +396 -0
  110. data/lib/wrb/components/inifile.rb +97 -0
  111. data/lib/wrb/components/listbox.rb +149 -0
  112. data/lib/wrb/components/listview.rb +1467 -0
  113. data/lib/wrb/components/menu.rb +592 -0
  114. data/lib/wrb/components/menubar.rb +84 -0
  115. data/lib/wrb/components/monthcalender.rb +164 -0
  116. data/lib/wrb/components/openfilenamedlg.rb +147 -0
  117. data/lib/wrb/components/pager.rb +199 -0
  118. data/lib/wrb/components/panel.rb +103 -0
  119. data/lib/wrb/components/picture.rb +55 -0
  120. data/lib/wrb/components/printdlg.rb +148 -0
  121. data/lib/wrb/components/printdlgex.rb +117 -0
  122. data/lib/wrb/components/printer.rb +97 -0
  123. data/lib/wrb/components/progressbar.rb +140 -0
  124. data/lib/wrb/components/radiobutton.rb +49 -0
  125. data/lib/wrb/components/rebar.rb +830 -0
  126. data/lib/wrb/components/registry.rb +408 -0
  127. data/lib/wrb/components/richedit.rb +1181 -0
  128. data/lib/wrb/components/savefilenamedlg.rb +27 -0
  129. data/lib/wrb/components/scintilla.rb +1298 -0
  130. data/lib/wrb/components/scrollbar.rb +239 -0
  131. data/lib/wrb/components/splitter.rb +494 -0
  132. data/lib/wrb/components/static.rb +198 -0
  133. data/lib/wrb/components/statusbar.rb +490 -0
  134. data/lib/wrb/components/tabctrl.rb +686 -0
  135. data/lib/wrb/components/timer.rb +117 -0
  136. data/lib/wrb/components/toolbar.rb +1107 -0
  137. data/lib/wrb/components/tooltip.rb +651 -0
  138. data/lib/wrb/components/trackbar.rb +298 -0
  139. data/lib/wrb/components/treeview.rb +845 -0
  140. data/lib/wrb/components/updown.rb +198 -0
  141. data/lib/wrb/ddeml.rb +241 -0
  142. data/lib/wrb/documents/animate.html +46 -0
  143. data/lib/wrb/documents/bitmap.html +69 -0
  144. data/lib/wrb/documents/button.html +78 -0
  145. data/lib/wrb/documents/canvas.html +137 -0
  146. data/lib/wrb/documents/checkbox.html +77 -0
  147. data/lib/wrb/documents/choosecolordlg.html +29 -0
  148. data/lib/wrb/documents/choosefontdlg.html +31 -0
  149. data/lib/wrb/documents/clipboard.html +31 -0
  150. data/lib/wrb/documents/combobox.html +117 -0
  151. data/lib/wrb/documents/comboboxex.html +139 -0
  152. data/lib/wrb/documents/control.html +53 -0
  153. data/lib/wrb/documents/cursor.html +45 -0
  154. data/lib/wrb/documents/datetimepicker.html +70 -0
  155. data/lib/wrb/documents/ddeclient.html +33 -0
  156. data/lib/wrb/documents/ddeserver.html +26 -0
  157. data/lib/wrb/documents/dialog.html +78 -0
  158. data/lib/wrb/documents/edit.html +169 -0
  159. data/lib/wrb/documents/empty.html +11 -0
  160. data/lib/wrb/documents/favicon.png +0 -0
  161. data/lib/wrb/documents/font.html +38 -0
  162. data/lib/wrb/documents/form.html +63 -0
  163. data/lib/wrb/documents/groupbox.html +57 -0
  164. data/lib/wrb/documents/header.html +85 -0
  165. data/lib/wrb/documents/hotkeyctrl.html +42 -0
  166. data/lib/wrb/documents/icon.html +45 -0
  167. data/lib/wrb/documents/imagelist.html +101 -0
  168. data/lib/wrb/documents/images/button.png +0 -0
  169. data/lib/wrb/documents/images/checkbox.png +0 -0
  170. data/lib/wrb/documents/images/combobox.png +0 -0
  171. data/lib/wrb/documents/images/comboboxex.png +0 -0
  172. data/lib/wrb/documents/images/datetimepicker.png +0 -0
  173. data/lib/wrb/documents/images/edit.png +0 -0
  174. data/lib/wrb/documents/images/groupbox.png +0 -0
  175. data/lib/wrb/documents/images/hotkeyctrl.png +0 -0
  176. data/lib/wrb/documents/images/listbox.png +0 -0
  177. data/lib/wrb/documents/images/listview.png +0 -0
  178. data/lib/wrb/documents/images/menu.png +0 -0
  179. data/lib/wrb/documents/images/menubar.png +0 -0
  180. data/lib/wrb/documents/images/monthcalender.png +0 -0
  181. data/lib/wrb/documents/images/progressbar.png +0 -0
  182. data/lib/wrb/documents/images/radiobutton.png +0 -0
  183. data/lib/wrb/documents/images/rebar.png +0 -0
  184. data/lib/wrb/documents/images/richedit.png +0 -0
  185. data/lib/wrb/documents/images/splitter.png +0 -0
  186. data/lib/wrb/documents/images/static.png +0 -0
  187. data/lib/wrb/documents/images/statusbar.png +0 -0
  188. data/lib/wrb/documents/images/tabctrl.png +0 -0
  189. data/lib/wrb/documents/images/toolbar.png +0 -0
  190. data/lib/wrb/documents/images/tooltip.png +0 -0
  191. data/lib/wrb/documents/images/trackbar.png +0 -0
  192. data/lib/wrb/documents/images/treeview.png +0 -0
  193. data/lib/wrb/documents/images/updown.png +0 -0
  194. data/lib/wrb/documents/index.html +155 -0
  195. data/lib/wrb/documents/inifile.html +36 -0
  196. data/lib/wrb/documents/license.txt +22 -0
  197. data/lib/wrb/documents/listbox.html +96 -0
  198. data/lib/wrb/documents/listview.html +277 -0
  199. data/lib/wrb/documents/make_doc.rb +596 -0
  200. data/lib/wrb/documents/menu.html +144 -0
  201. data/lib/wrb/documents/menubar.html +54 -0
  202. data/lib/wrb/documents/monthcalender.html +48 -0
  203. data/lib/wrb/documents/openfilenamedlg.html +36 -0
  204. data/lib/wrb/documents/pager.html +63 -0
  205. data/lib/wrb/documents/panel.html +32 -0
  206. data/lib/wrb/documents/picture.html +48 -0
  207. data/lib/wrb/documents/printdlg.html +35 -0
  208. data/lib/wrb/documents/printdlgex.html +35 -0
  209. data/lib/wrb/documents/printer.html +40 -0
  210. data/lib/wrb/documents/progressbar.html +69 -0
  211. data/lib/wrb/documents/radiobutton.html +51 -0
  212. data/lib/wrb/documents/rebar.html +143 -0
  213. data/lib/wrb/documents/registry.html +36 -0
  214. data/lib/wrb/documents/richedit.html +232 -0
  215. data/lib/wrb/documents/samples/editimg.bmp +0 -0
  216. data/lib/wrb/documents/samples/editimg.iml +0 -0
  217. data/lib/wrb/documents/samples/fileimg.bmp +0 -0
  218. data/lib/wrb/documents/samples/fileimg.iml +0 -0
  219. data/lib/wrb/documents/samples/sample_button.rb +21 -0
  220. data/lib/wrb/documents/samples/sample_checkbox.rb +18 -0
  221. data/lib/wrb/documents/samples/sample_combobox.rb +18 -0
  222. data/lib/wrb/documents/samples/sample_comboboxex.rb +23 -0
  223. data/lib/wrb/documents/samples/sample_datetimepicker.rb +11 -0
  224. data/lib/wrb/documents/samples/sample_edit.rb +25 -0
  225. data/lib/wrb/documents/samples/sample_groupbox.rb +19 -0
  226. data/lib/wrb/documents/samples/sample_hotkeyctrl.rb +12 -0
  227. data/lib/wrb/documents/samples/sample_listbox.rb +12 -0
  228. data/lib/wrb/documents/samples/sample_listview.rb +32 -0
  229. data/lib/wrb/documents/samples/sample_menu.rb +21 -0
  230. data/lib/wrb/documents/samples/sample_menubar.rb +23 -0
  231. data/lib/wrb/documents/samples/sample_monthcalender.rb +11 -0
  232. data/lib/wrb/documents/samples/sample_progressbar.rb +14 -0
  233. data/lib/wrb/documents/samples/sample_radiobutton.rb +14 -0
  234. data/lib/wrb/documents/samples/sample_rebar.rb +25 -0
  235. data/lib/wrb/documents/samples/sample_richedit.rb +60 -0
  236. data/lib/wrb/documents/samples/sample_splitter.rb +33 -0
  237. data/lib/wrb/documents/samples/sample_static.rb +15 -0
  238. data/lib/wrb/documents/samples/sample_statusbar.rb +17 -0
  239. data/lib/wrb/documents/samples/sample_tabctrl.rb +19 -0
  240. data/lib/wrb/documents/samples/sample_toolbar.rb +29 -0
  241. data/lib/wrb/documents/samples/sample_tooltip.rb +50 -0
  242. data/lib/wrb/documents/samples/sample_trackbar.rb +30 -0
  243. data/lib/wrb/documents/samples/sample_treeview.rb +19 -0
  244. data/lib/wrb/documents/samples/sample_updown.rb +18 -0
  245. data/lib/wrb/documents/samples/sampleimg16.iml +0 -0
  246. data/lib/wrb/documents/samples/sampleimg32.iml +0 -0
  247. data/lib/wrb/documents/samples/samplemg16.png +0 -0
  248. data/lib/wrb/documents/samples/samplemg32.png +0 -0
  249. data/lib/wrb/documents/samples/wrb.ico +0 -0
  250. data/lib/wrb/documents/savefilenamedlg.html +19 -0
  251. data/lib/wrb/documents/scrollbar.html +60 -0
  252. data/lib/wrb/documents/splitter.html +96 -0
  253. data/lib/wrb/documents/static.html +84 -0
  254. data/lib/wrb/documents/statusbar.html +110 -0
  255. data/lib/wrb/documents/tabctrl.html +151 -0
  256. data/lib/wrb/documents/timer.html +43 -0
  257. data/lib/wrb/documents/toolbar.html +181 -0
  258. data/lib/wrb/documents/tooltip.html +131 -0
  259. data/lib/wrb/documents/trackbar.html +107 -0
  260. data/lib/wrb/documents/treeview.html +210 -0
  261. data/lib/wrb/documents/updown.html +85 -0
  262. data/lib/wrb/documents/wincontrol.html +258 -0
  263. data/lib/wrb/documents/window.html +499 -0
  264. data/lib/wrb/documents/wrb.css +228 -0
  265. data/lib/wrb/gmem.rb +26 -0
  266. data/lib/wrb/imecommon.rb +59 -0
  267. data/lib/wrb/listcommon.rb +185 -0
  268. data/lib/wrb/lzss.rb +126 -0
  269. data/lib/wrb/scrollinfo.rb +142 -0
  270. data/lib/wrb/toplevelcommon.rb +634 -0
  271. metadata +315 -0
@@ -0,0 +1,1315 @@
1
+ require_relative './fdmodules'
2
+ require_relative './fdparseform'
3
+ require_relative './fddialogs'
4
+ require 'pathname'
5
+
6
+ module WR
7
+ FdDir = File.dirname(__FILE__)
8
+ class FDMain < Form
9
+ attr_accessor :selected_klass, :frm, :modified
10
+ attr_reader :selected_ctrl, :selected_rs_klass, :selected_cursor, :selected_rsc_cursor
11
+ attr_reader :forms
12
+
13
+ def initialize()
14
+ $fd_main_frm = self # Set only one global variable
15
+ _<< Imagelist.new(:image0, 13, 13, true) << Bitmap.fromfile(FdDir+'/img13.bmp')
16
+ @selected_cursor = Cursor.fromfile(FdDir+'/angle.cur')
17
+ @selected_rsc_cursor = Cursor.fromfile(FdDir+'/angle2.cur')
18
+ # @selected_cursor = Cursor.loadb64( "AAAAQAAIACAQAEAYACAFgAAAAAtAEAUQCAgJgABBAQAAwIAgLgAAAAAAAAAA
19
+ #AAAAAAABAPp/v9/wH/gkA8IJgJAAAAAJAAAAAJAAAAAJCAhCfcAAACAguggI
20
+ #MIP+AYEEMX/BHB/v8AACAYoPgrgD3+AAAD3+AAAD3+AABAQkAB+FSAfAAAAE
21
+ #AhA=")
22
+ self.caption = "FormDesigner"
23
+ self.visible = false
24
+ self.style &= ~WS_MAXIMIZEBOX
25
+ self.size = 1100, 600
26
+ self.font = Font['Yu Gothic UI', -12]
27
+ self.inheritfont = :force
28
+ _<< Menubar[:main1, Menu[:file1, 'File', Menu[:new1, "New", :newform1, "Form", :newdialog1, "Dialog"], :open1, "Open", :save1, "Save\tCtrl+S", :saveas1, "Save as", :sep, :exit1, "Exit"], Menu[:insert1, "Insert", :insdlg1, "Dialog", :insfrm1, "Form"], Menu[:window1, "Window", :sep, :delfrm1, "Delete this"], Menu[:prf1, "Preferences", MFT_RIGHTJUSTIFY, :raise1, "RaiseForTest"]]
29
+ @spl1 = _<< Splitter[:spl1, 200, 224, 6, 6, :horiz, :dot]
30
+
31
+ @tabs1 = @spl1.upper << Tabctrl[:tabs1, 0, 0, 200, 200, :mintabwidth=>0, :margin=>[0,0,0,0]]
32
+ _tabs1[0, 0] = "Standard", "Common", "Resources", "Hierarchy"
33
+
34
+ @stbr1 = _<< Statusbar[:stbr1, '', 0,0,0,0, :simple=>true]
35
+ @lvstd = _tabs1[0] << Listview[:lvstd, 0, 0, 200, 200, :smalliconview, :margin=>[0,24,0,0]]
36
+ @lvcmn = _tabs1[1] << Listview[:lvcmn, 0, 0, 200, 200, :smalliconview, :margin=>[0,24,0,0]]
37
+ @spl2 = _tabs1[2] << Splitter[:spl2, 180, 24, 3, 3, :face=>:none, :margin=>[nil,24,100,0]]
38
+ @lvrs1 = _tabs1._spl2.rl_pane << Listview[:lvrs1, 0, 0, 110, 200, :smalliconview, :margin=>[0,0,0,0], :visible=>false]
39
+ @lvrs2 = _tabs1._spl2.lu_pane << Listview[:lvrs2, 0, 0, 100, 200, :smalliconview, :showselalways, :sortascending, :margin=>[0,0,0,0], :bkcolor=>0xf0f0f0, :textbkcolor=>0xf0f0f0, :visible=>false]
40
+ # _tabs1._spl2.lu_pane << _tabs1._lvrs2
41
+ # _tabs1._spl2.rl_pane << _tabs1._lvrs1
42
+ # _tabs1[2] << Button[:btrscadd, '<', 96, 0, 16, 200, :margin=>[nil, 34, 100, 10]]
43
+ @tvhrc = _tabs1[3] << Treeview[:tvhrc, 0, 0, 200, 200, :showselalways, :margin=>[0,24,20,0]]
44
+ @udhrc = _tabs1[3] << Updown[:udhrc, 0, 0, 20, 50, :margin=>[nil, 24, 0, nil]]
45
+ @tabs2 = @spl1.lower << Tabctrl[:tabs2, 0,0,200,200, :mintabwidth=>0, :margin=>[0,0,0,24]]
46
+ # _tabs2 << ["Attributes", "Styles", "Events"]
47
+ _tabs2[0, 0] = "Attributes", "Styles", "Events"
48
+ @lvattr = _tabs2[0] << Listview[:lvattr, 0, 0, 200,200, :reportview, :nocolumnheader, :gridlines, :fullrowselect, :margin=>[0,24,0,0], :columns=>[['',116],['',144]], :imagelist=>_image0]
49
+ @lvstyles = _tabs2[1] << Listview[:lvstyles, 0, 0, 200,200,:listview, :checkboxes, :margin=>[0,24,0,0]]
50
+ @lvevents = _tabs2[2] << Listview[:lvevents, 0, 0, 200,200, :listview, :checkboxes, :margin=>[0,24,0,0]]
51
+ @lvitems = _tabs2[1] << Listview[:lvitems, 0,0, 100, 100, :listview, :gridlines, :nocolumnheader, :fullrowselect, :margin=>[0, 24, 0, 0], :columns=>[['',120],['', 144]], :visible=>false]
52
+
53
+ @ied1 = _<< Edit[:ied1, "", 0, 0, 80, 18, :autohscroll, :wantreturn, :visible=>false]
54
+ @ied1.exstyle &= ~WS_EX_CLIENTEDGE
55
+ @ied1.set_subclass.register_event WM_KEYDOWN, 'key_down', 'ii'
56
+ class << @ied1
57
+ attr_accessor :iitem, :isubitem
58
+ def key_down(wp, lp)
59
+ case wp
60
+ when 13, 9
61
+ $fd_main_frm.PostMessage(WM_KEYDOWN, wp, lp)
62
+ CancelDefWindowProc
63
+ when 38, 40
64
+ parent.PostMessage(WM_KEYDOWN, wp, lp)
65
+ CancelDefWindowProc
66
+ end
67
+ end
68
+ end
69
+ _<< Menu[:popup1]
70
+ _<< Menu[:popup2, :deleteitem2, "Delete"]
71
+ _<< Menu[:popup3, :deleteitem3, "Delete"]
72
+ # _<< Menu[:popup3, :additem3, "Add", :deleteitem3, "Delete"]
73
+ # _<< Menu[:popup4, :additem4, "Add Item", :addmenu4, "Add Menu", :sep, :deleteitem4, "Delete"]
74
+ # _<< Menu[:popup5, :additemunder4, "Add Item under", :addmenuunder4, "Add Menu under",:additem4, "Add Item", :addmenu4, "Add Menu", :sep, :deleteitem4, "Delete"]
75
+
76
+ @forms = []
77
+ @lvattr.events = :keydown
78
+ @lvrs1.events = :dblclk
79
+ @lvrs2.events = :rclick
80
+ @lvitems.events = :rclick, :beginlabeledit, :endlabeledit
81
+ @tvhrc.events = :rclick
82
+ self.events = :keydown, :activate
83
+ @selected_rs_klass = nil
84
+ @selected_klass = nil
85
+ @opend_file = nil
86
+ @modified = nil
87
+ load_controls
88
+ end
89
+
90
+ def load_controls()
91
+ @imgstdctl = Imagelist.new(20, 20, true)
92
+ @imgcmnctl = Imagelist.new(20, 20, true)
93
+ @imgrscctl = Imagelist.new(20, 20, true)
94
+ @fdstdctls = [['Unselect', 0]]
95
+ @fdcmnctls = [['Unselect', 0]]
96
+ @fdrscctls = [['Unselect', 0]]
97
+ dir = FdDir + '/controls/'
98
+ @imgstdctl << Bitmap.fromfile(dir+'unselect.bmp')
99
+ @imgcmnctl << Bitmap.fromfile(dir+'unselect.bmp')
100
+ @imgrscctl << Bitmap.fromfile(dir+'unselect.bmp')
101
+ istd = icmn = irsc = 0
102
+ Dir.glob(dir+"*.rb"){|i|
103
+ next unless File.basename(i) =~ /^[A-Z]/
104
+ load i
105
+ klassname = File.basename(i, '.rb')
106
+ klass = WR.module_eval(klassname)
107
+ case klass::FDConfig[:classify]
108
+ when :commonctrl
109
+ @imgcmnctl << klass::FDConfig[:bitmap]
110
+ @fdcmnctls << [klassname, icmn+=1, 0, klass]
111
+ when :resources
112
+ @imgrscctl << klass::FDConfig[:bitmap]
113
+ @fdrscctls << [klassname, irsc+=1, 0, klass]
114
+ else
115
+ @imgstdctl << klass::FDConfig[:bitmap]
116
+ @fdstdctls << [klassname, istd+=1, 0, klass]
117
+ end
118
+ }
119
+ @imgstdctl << Bitmap.fromfile(dir + 'default.bmp')
120
+ end
121
+
122
+ def created()
123
+ move(x+800, y, w-800, h).show
124
+ register_hotkey(_main1.file1.save1.idcmd, 'Ctrl+S')
125
+ @lvstd.imagelist = @imgstdctl
126
+ @lvcmn.imagelist = @imgcmnctl
127
+ @lvrs1.imagelist = @imgrscctl
128
+ @lvrs2.set_subclass(true)
129
+ @lvrs2.register_event(WM_SETCURSOR, 'lvrs2_setcursor', 'ih')
130
+ class << @lvrs2
131
+ def lvrs2_setcursor(hwnd, hittest, msg)
132
+ return unless hittest == 1
133
+ return unless $fd_main_frm.selected_rs_klass
134
+ APP.SetCursor $fd_main_frm.selected_rsc_cursor
135
+ CancelDefWindowProc
136
+ end
137
+ end
138
+ @lvrs2.imagelist = @imgrscctl
139
+
140
+ insert_toplevelwin('Form').move(self.x-800, self.y, 800, 600).show
141
+ self.SetFocus
142
+ accept_events :move, :resize, :close
143
+ update_attributes(@frm)
144
+ @ied1.parent = @lvattr
145
+ update_hierarchy()
146
+ @fdrscctls.each{|i| @lvrs1 << i}
147
+ @fdstdctls.each{|i| @lvstd << i}
148
+ @fdcmnctls.each{|i| @lvcmn << i}
149
+ unless ARGV.empty?
150
+ fname=ARGV.shift
151
+ begin
152
+ open1(fname)
153
+ rescue => err
154
+ STDERR.puts err
155
+ end
156
+ end
157
+ end
158
+
159
+ def self_move(*) #; dpp self.x, self.y
160
+ @forms.each{|i| i.move(self.x-i.w, self.y) unless i.active?}
161
+ end
162
+
163
+ def self_resize(*)
164
+ @forms.each{|i| i.move(self.x-i.w, self.y) unless i.active?}
165
+ end
166
+
167
+ def check_winclassname(nm)
168
+ base = nm.sub(/\d+$/, '')
169
+ suffix = $~[0].to_i
170
+ while
171
+ @forms.find{|i| i.class.to_s.split('::').last == base+suffix.to_s}
172
+ suffix += 1
173
+ end
174
+ base + suffix.to_s
175
+ end
176
+
177
+ def insert_toplevelwin(cname)
178
+ nm = check_winclassname(cname + '1')
179
+ @frm = WR.module_eval(
180
+ "class #{nm}<#{cname};
181
+ if defined? FDConfig
182
+ FDConfig.clear
183
+ else
184
+ FDConfig={}
185
+ end
186
+ def initialize();end
187
+ end;
188
+ #{nm}.new"
189
+ )
190
+ @frm.visible = false
191
+ # @frm.size = 640, 480
192
+ @frm.extend(ModToplevelHook).create
193
+ @forms << @frm
194
+ _main1.window1.insert(_main1.window1.count-2, [:windows1, nm])
195
+ update_attributes(@frm)
196
+ update_hierarchy
197
+ @modified = true if @forms.size > 1
198
+ @frm
199
+ end
200
+
201
+ def insdlg1_clicked(*)
202
+ dlg = insert_toplevelwin('Dialog')
203
+ dlg.show.move(x-dlg.w, y)
204
+ end
205
+
206
+ def insfrm1_clicked(*)
207
+ _x, _y = self.position
208
+ frm = insert_toplevelwin('Form')
209
+ frm.show.move(_x-640, _y, 640, 480)
210
+ end
211
+
212
+ def delfrm1_clicked(*)
213
+ return msgbox("This form is last one.", "Formdesigner", 0x10) if @forms.size==1
214
+ @forms.delete(@frm)
215
+ classname = @frm.class.to_s.split("::").last
216
+ _main1.window1.each{|i|
217
+ if i.caption == classname
218
+ i.delete
219
+ break
220
+ end
221
+ } #; dpp @frm.__fd_src[:classname]
222
+ unless @frm.__fd_src.empty?
223
+ lns = @frm.__fd_src[:lines]
224
+ soc = ModFDCommon.index_of_src(lns, @frm.__fd_src[:classname][2])
225
+ eoc = ModFDCommon.index_of_src(lns,@frm.__fd_src[:endofclass][2])
226
+ while lns[eoc+=1] =~ /^\s*$/; end
227
+ eoc -= 1
228
+ lns.slice!(soc..eoc)
229
+ end
230
+ @frm.close
231
+ @frm = @forms.last
232
+ @modified = true
233
+ update_attributes(@frm)
234
+ end
235
+
236
+ def windows1_clicked(id, st)
237
+ if @frm!=@forms[_main1.window1.index(id)]
238
+ (@frm=@forms[_main1.window1.index(id)]).activate
239
+ update_attributes(@frm)
240
+ end
241
+ end
242
+
243
+ def check_modified()
244
+ case msgbox("Would you like to save this project?", "FormDesigner", 0x23) # QUESTION + YESNOCANCEL
245
+ when 6 # Yes
246
+ return save1_clicked
247
+ when 2 # Cancel
248
+ return nil
249
+ end if @modified
250
+ true
251
+ end
252
+
253
+ def close_current_project()
254
+ @forms.each{|i| i.close if i.alive?}
255
+ @forms.clear
256
+ _main1.window1.clear
257
+ GC.start
258
+ @modified = nil
259
+ end
260
+
261
+ def newform1_clicked(*)
262
+ return unless check_modified
263
+ _x, _y = self.position
264
+ close_current_project
265
+ @binded_files = nil
266
+ insert_toplevelwin('Form')
267
+ frm.show.move(_x-800, _y, 800, 600)
268
+ _main1.window1 << [:sep, [:delfrm1, "Delete this"]]
269
+ end
270
+
271
+ def newdialog1_clicked(*)
272
+ return unless check_modified
273
+ close_current_project
274
+ dlg = insert_toplevelwin('Dialog')
275
+ dlg.show.move(x-dlg.w, y)
276
+ _main1.window1 << [:sep, [:delfrm1, "Delete this"]]
277
+ end
278
+
279
+ def open1_clicked(*)
280
+ return unless check_modified
281
+ if fname = OpenFileNameDlg.show(self, caption: "Please select file")
282
+ open1(fname)
283
+ end
284
+ end
285
+
286
+ def open1(fname)
287
+ current_src = open(fname){|f| f.read}
288
+ Dir.chdir(File.dirname(fname))
289
+ src = FDParseForm.new(current_src, fname)
290
+ src.parse
291
+ res = src.result #; PP.pp res, STDERR, 95
292
+ return MessageBox("No Form class in this file.", "FormDesigner", 0x10) if res.empty?
293
+ close_current_project
294
+
295
+ lines = current_src.lines
296
+ res.reverse_each{|fm|
297
+ classname = fm.shift #; dpp classname
298
+ WR.module_eval(classname +
299
+ ";defined?(FDConfig) ? FDConfig.clear : FDConfig={};def initialize();end;end\n")
300
+ klass = WR.module_eval(classname.sub(/class\s+(\w+).*/m, '\1'))
301
+ frm = klass.new
302
+ frm.extend(ModToplevelHook)
303
+ frm.__fd_src[:filename] = fname
304
+ frm.__fd_src[:lines] = lns = lines
305
+ frm.__fd_src[:classname] = classname.column, classname.size, lns[classname.line]
306
+ endline = fm.pop
307
+ frm.__fd_src[:endofclass] = endline.column, endline.size, lns[endline.line]
308
+
309
+ thickframeP = frm.style & WS_THICKFRAME
310
+ contexthelpP = frm.style & 0x00000002
311
+ frm.style |= WS_THICKFRAME
312
+ frm.style &= ~0x00000002
313
+ # if frm.is_a?(Dialog)
314
+ # frm.move self.x-(frm.w||800), self.y, frm.w||400, frm.h||300
315
+ # else
316
+ # frm.move self.x-(frm.w||800), self.y, frm.w||800, frm.h||600
317
+ # end
318
+
319
+ self_x = self.x
320
+ self_y = self.y
321
+ frm.create
322
+
323
+ fm.each{|i|
324
+ ln = i.line
325
+ cl = i.column
326
+ lsrc = lns[ln].extend(ModFDSrcLine)
327
+ asrc = [cl, i.size, lsrc]
328
+ if i =~ /^\s*self\.(\w+)\s*\=/
329
+ k = $1
330
+ next if !ModToplevelHook::FDAttributes.index{|i| i[0]==k} &&
331
+ k!='events' && k!='style'
332
+ k.extend(ModFDAttrSrcLine)
333
+ frm.__fd_src[k] = [cl, i.size, lsrc]
334
+ k.__fd_src = [cl, i.size, lsrc]
335
+ lsrc.binded_obj = k
336
+ if k=='events'
337
+ frm.__fd_events.clear
338
+ if (evs=eval(i.sub(/^\s*self\.\w+\s*\=/,''))).is_a?(Array)
339
+ frm.__fd_events.concat(evs)
340
+ else
341
+ frm.__fd_events << evs
342
+ end
343
+ elsif k=='style'
344
+ frm.style = eval(i.sub(/^\s*self\.\w+\s*\=/,''))
345
+ else
346
+ frm.instance_eval(i)
347
+ end
348
+ elsif i=~/^(s*[a-z_][\w\.\[\]]*\.?)\s*<<(.+)/m
349
+ lcount = $~.to_s.lines.size
350
+ begin
351
+ sobj = $1
352
+ sln = $~.to_s
353
+ sobj.sub!(/\.$/, '')
354
+ obj = frm.instance_eval(sobj)
355
+ ct = frm.instance_eval(sln)
356
+ rescue => err
357
+ MessageBox "At line#{ln}: #{err} (Skipped)", "FormDesigner", 0x10
358
+ next
359
+ end
360
+ lsrc.binded_obj = ct
361
+ if ct.is_a?(Window)
362
+ ct.class.module_eval "FDConfig={} unless defined?(FDConfig);" # for unregisterd
363
+ ct.extend(ModControlHook) unless ct.respond_to?(:__fd_destroy)
364
+ ct.__fd_src = [cl, i.size, lsrc, lcount]
365
+ i.match(/:events=>\[(.+?)\]/);
366
+ if evs=$1
367
+ ar = evs.split(',').map{|i| i.strip.tr(':', '').intern}
368
+ ct.__fd_events.concat(ar)
369
+ end
370
+ elsif ct.is_a?(Menu) || ct.is_a?(Timer)
371
+ ct.extend(ModResourceHook)
372
+ ct.__fd_src = [cl, i.size, lsrc]
373
+ elsif ct.is_a?(Imagelist)
374
+ ct.extend(ModResourceHook)
375
+ class << ct
376
+ attr_accessor :__fd_bindedfile, :__fd_toplevelwin
377
+ end
378
+ if i =~ /.*Imagelist.fromfile\W/
379
+ bf = i.split(",")
380
+ ct.__fd_bindedfile = bf.last.tr(' "()\'', '') if bf
381
+ end
382
+ ct.__fd_toplevelwin = frm
383
+ ct.__fd_src = [cl, i.size, lsrc, lcount]
384
+ else #if ct.is_a?(Array)#; dpp ln, i, ct # have items # obj is child
385
+ ct.each{|j|
386
+ (j.extend(ModControlHook) rescue nil) if j.is_a?(WinControl)
387
+ } if ct.respond_to?(:each)
388
+ if obj.is_a?(WinControl)
389
+ robj = obj
390
+ obj.__fd_item_loaded(ct, asrc) if obj.respond_to?(:__fd_item_loaded)
391
+ elsif obj.is_a?(Menu)
392
+ obj.extend(ModResourceHook)
393
+ obj.__fd_src = [cl, i.size, lsrc]
394
+ sobj.match(/^((:?_|_.|controls\.)\w+)\./)
395
+ owner = frm.instance_eval($1)
396
+ owner.__fd_item_loaded(ct, asrc) if obj.respond_to?(:__fd_item_loaded)
397
+ elsif obj.respond_to?(:owner)
398
+ obj.extend ModFDItemsSrcLine
399
+ obj.owner.__fd_item_loaded(ct, asrc) if obj.owner.respond_to?(:__fd_item_loaded)
400
+ else
401
+ dp "@%s", "At line #{ln}: \"#{i}\" was igonored."
402
+ end
403
+ end
404
+ else
405
+ dp "@%s", "At line #{ln}: \"#{i}\" was igonored."
406
+ end
407
+ }
408
+
409
+ frm.style &= ~WS_THICKFRAME if thickframeP==0
410
+ frm.style |= contexthelpP
411
+ frm.SendMessage(WM_SIZE, 0, MAKELPARAM(*frm.clientsize))
412
+ frm.refresh
413
+ if frm.is_a?(Dialog)
414
+ frm.move self_x-(frm.w||800), self_y, frm.w||400, frm.h||300
415
+ else
416
+ frm.move self_x-(frm.w||800), self_y, frm.w||800, frm.h||600
417
+ end
418
+ @forms << frm
419
+ _main1.window1 << [:windows1, klass.to_s.split('::')[1]]
420
+ }
421
+ _main1.window1 << [:sep, [:delfrm1, "Delete this"]]
422
+ @binded_files = {fname=>lines}
423
+ @frm = @forms[0]
424
+ @frm.activate
425
+ _tabs1.cursel = 0
426
+ _tabs2.cursel = 0
427
+ update_attributes(@frm)
428
+ update_hierarchy
429
+ self.caption = File.basename(fname)
430
+ end
431
+
432
+ def save1_clicked(*)
433
+ return saveas1_clicked unless @binded_files # if new file
434
+ insert_point = nil
435
+ lns = nil
436
+ indentlevel = [' ', 0]
437
+ @forms.each{|frm|
438
+ if frm.__fd_src.empty? # Newly added form/dialog
439
+ frm.__fd_src[:lines] = lns
440
+ ar = frm.__fd_frm2str(indentlevel)
441
+ lns[insert_point, 0] = ar + [indentlevel[0] * indentlevel[1] + "\n"]
442
+ lns.flatten
443
+ else
444
+ frm.__fd_modify_src
445
+ lns = frm.__fd_src[:lines]
446
+ lsrc = frm.__fd_src[:classname][2]
447
+ insert_point = ModFDCommon.index_of_src(lns, lsrc)
448
+ end
449
+ }
450
+ @binded_files.each{|fname, lns| open(fname, 'w'){|f| f.write(lns.join)}}
451
+ @modified = nil
452
+ true
453
+ end
454
+
455
+ def saveas1_clicked(*) # need revise if exists file opned
456
+ return unless fname = SaveFileNameDlg.show(self, caption: "Save as",
457
+ flags: OFN_OVERWRITEPROMPT)
458
+ if @binded_files
459
+ k = @binded_files.keys[0]
460
+ @binded_files[fname] = @binded_files.delete(k)
461
+ save1_clicked
462
+ else # new file
463
+ indentlevel = [' ', 0]
464
+ lns = ["require 'wrb'\n", "module WR\n"]
465
+ @forms.reverse_each{|frm|
466
+ ar = frm.__fd_frm2str(indentlevel, frm==@forms[0])
467
+ frm.__fd_src[:lines] = lns
468
+ frm.__fd_src[:filename] = fname
469
+ lns.concat(ar)
470
+ lns << "#{indentlevel[0]*indentlevel[1]}\n" unless frm==@forms[0]
471
+ indentlevel[1] -= 1
472
+ }
473
+ lns << "end\n"
474
+ open(fname, 'w'){|f| f.write(lns.join)}
475
+ @binded_files = {fname=>lns}
476
+ @modified = nil
477
+ end
478
+ true
479
+ end
480
+
481
+ def exit1_clicked(*) #; dp "@exit: hwnd=%#x", _hwnd
482
+ return unless check_modified
483
+ @forms.each{|i| i.close if i.alive?}
484
+ APP.quit!
485
+ end
486
+
487
+ def self_close(*) #; dp "@close: hwnd=%#x", _hwnd
488
+ return CancelDefWindowProc unless check_modified
489
+ @forms.each{|i| i.close if i.alive?}
490
+ end
491
+
492
+ def lvstd_click(nm)
493
+ @selected_klass = @lvstd[nm.iItem].data
494
+ end
495
+
496
+ def lvcmn_click(nm)
497
+ @selected_klass = @lvcmn[nm.iItem].data
498
+ end
499
+
500
+ def lvrs1_click(nm)
501
+ @selected_rs_klass = @lvrs1[nm.iItem].data
502
+ end
503
+
504
+
505
+ def get_attributes(ctrl, ar)
506
+ ar.map{|i|
507
+ str, tp , defval = i #; dpp str, tp #, ctrl.__send__(str).to_s
508
+ if atr=parse_template4rd(ctrl, str, tp, defval)
509
+ [str + "\t" + atr, nil, nil, tp]
510
+ end
511
+ }.compact
512
+ end
513
+
514
+ def parse_template4rd(ctrl, cmd, tp, defval=nil) #; dpp cmd, atr, tp, defval
515
+ begin
516
+ atr = ctrl.__send__(cmd)
517
+ rescue => err #; dpp err if err
518
+ if cmd=ctrl.class::FDConfig[(cmd+"_get").intern]
519
+ (atr = cmd.call(ctrl, atr)) rescue return nil
520
+ else
521
+ return nil
522
+ end
523
+ end
524
+ return atr.to_s unless tp
525
+ return '' if atr == defval
526
+
527
+ tps = tp.split(',') #; dpp cmd, atr, tps[0]
528
+ atr = atr.to_a if tps[0].size>1 && atr.respond_to?(:to_a)
529
+
530
+ # if atr.is_a?(Array)
531
+ # tp = tps[0]
532
+ # elsif atr.is_a?(Margin)
533
+ # tp = tps[0]
534
+ # atr = atr.to_a
535
+ if atr.is_a?(RWin::Font)
536
+ tp = tps[0]
537
+ atr = [atr.facename, atr.height, atr.attrstr]
538
+ atr.delete("")
539
+ else
540
+ if (c=@selected_ctrl.class) < WinControl && (f=c::FDConfig["#{cmd}_get".intern])
541
+ r = f.call(@selected_ctrl, atr)
542
+ return r && r.to_s.tr('"', '')
543
+ end
544
+ tp = tps.last
545
+ case tp
546
+ when 'h'
547
+ return atr ? sprintf("%#x", atr) : ''
548
+ when 'n'
549
+ return atr.respond_to?(:name) ? atr.name.to_s : atr.to_s
550
+ when 't'
551
+ return atr.nil? ? '' : sprintf("%p", atr).tr(':"', '')
552
+ else
553
+ return atr.to_s
554
+ end if tp.size==1
555
+ end #; dpp cmd, tp
556
+ res = []
557
+ [tp.size, atr.size].min.times{|i| #dpp i, tp[i], ar[i]
558
+ if (c=@selected_ctrl.class) < WinControl && (f=c::FDConfig["#{cmd}_get".intern])
559
+ break res << f.call(@selected_ctrl, atr).to_s.tr('":', '')
560
+ end
561
+ case tp[i]
562
+ when 'h' # parse as Hex
563
+ res << sprintf("%#x", atr[i])
564
+ when 'i', 'b' # parse as Integer or true / false / nil
565
+ res << sprintf("%p", atr[i])
566
+ # when 's', 'm' # parse as cmdid or Symbol
567
+ # res << atr[i].to_s
568
+ when 'n'# parse as control's name
569
+ res << (atr[i].respond_to?(:name) ? atr[i].name : (atr[i] ? atr[i].to_s : 'nil'))
570
+ when 't' # parse as 3 state value
571
+ res << (atr[i].nil? ? '' : sprintf("%p", atr[i]).tr(':"', ''))
572
+ when 'a'
573
+ break res << atr.to_s
574
+ else
575
+ res << atr[i].to_s
576
+ end
577
+ }
578
+ res.size > 1 ? "[#{res.join(', ')}]" : res[0].to_s
579
+ end
580
+
581
+ def get_styles(ctrl)
582
+ ctrl.class::FDConfig[:styles] || ctrl.class::WinStyles.keys.map{|i| i.to_s}
583
+ end
584
+
585
+ def get_events(ctrl) #dpp ctrl, ctrl.acceptable_events
586
+ # ctrl.class::FDConfig[:events] || ctrl.class::PreDefinedEvents.keys #rescue nil
587
+ ctrl.class::FDConfig[:events] || ctrl.acceptable_events.keys
588
+ end
589
+
590
+ def update_attributes(ctrl) #; dpp ctrl, caller[0]
591
+ attrs = ctrl.__fd_attributes__
592
+ cursel = @tabs2.cursel
593
+ @tabs2.tabs = ctrl.class::FDConfig[:attr_tabs] || ['Attributes', 'Styles', 'Events']
594
+ @tabs2.tabs.each{|i| i.controls.clear}
595
+ @tabs2.controls.each{|i| i.hide}
596
+ @tabs2[0] << @lvattr
597
+ case @tabs2.count
598
+ when 2
599
+ @tabs2[1] << @lvitems
600
+ when 3
601
+ @tabs2[1] << @lvstyles
602
+ @tabs2[2] << @lvevents
603
+ when 4, 5
604
+ @tabs2[1] << @lvstyles
605
+ @tabs2[2] << @lvevents
606
+ @tabs2[3] << @lvitems
607
+ set_object2lvitems(ctrl)
608
+ end
609
+ @tabs2.cursel = cursel
610
+ tabs2_selchange(nil)
611
+
612
+ if ctrl.is_a?(RWin::Window)
613
+ @lvrs2.selections.clear
614
+ @lvrs2.focused = nil
615
+ @lvstyles.clear
616
+ if as = get_styles(ctrl)
617
+ @_lvstyles_updating = true
618
+ @lvstyles[0, 0] = as
619
+ ass = ctrl.style2symbols
620
+ @lvstyles.each{|i| i.checked = true if ass.index(i.text.intern)}
621
+ @_lvstyles_updating = nil
622
+ end
623
+
624
+ @lvevents.clear
625
+ if ev = get_events(ctrl)
626
+ @_lvevents_updating = true
627
+ ev.each_with_index{|v, i|
628
+ @lvevents << v.to_s
629
+ @lvevents[i].checked = true if ctrl.__fd_events && ctrl.__fd_events.index(v.intern)
630
+ }
631
+ @_lvevents_updating = nil
632
+ end
633
+ end
634
+ @stbr1.caption = if ctrl.respond_to?(:name)
635
+ "#{ctrl.class}: #{ctrl.name}"
636
+ else
637
+ "#{ctrl.class} < #{ctrl.class.ancestors[1].to_s.split('::')[1]}"
638
+ end
639
+ @selected_ctrl = ctrl
640
+ @lvattr.clear
641
+ @ied1.visible = false
642
+ @lvattr[0, 0] = get_attributes(ctrl, attrs)
643
+ tvhrc_select_ctrl()
644
+ end
645
+
646
+ def update_inpledit(lv, i, j)
647
+ l, t, r, b = lv[i].rect
648
+ cw0 = lv.columns[0].width
649
+ cw1 = lv.columns[1].width
650
+ cw2 = lv.columns[2].width
651
+ cw3 = lv.columns[3].width
652
+ cw4 = lv.columns[4].width
653
+ @ied1.iitem = i
654
+ @ied1.isubitem = j
655
+ @ied1.visible = true
656
+ @ied1.show
657
+ @ied1.font = lv.font #; dpp @ied1.visible, @ied1.caption, @ied1.position, @ied1.size
658
+ case j
659
+ when 0
660
+ offset = 4 + 13 + lv[i].indent*13 # Bad magic numbers...
661
+ @ied1.move(offset, t+2, cw0-offset, b-t-4)
662
+ when 1
663
+ @ied1.move(cw0+5, t+2, cw1-5, b-t-4)
664
+ when 2
665
+ @ied1.move(cw0+cw1+5, t+2, cw2-5, b-t-4)
666
+ when 3
667
+ @ied1.move(cw0+cw1+cw2+5, t+2, cw3-5, b-t-4)
668
+ when 4
669
+ @ied1.move(cw0+cw1+cw2+cw3+5, t+2, cw4-5, b-t-4)
670
+ else
671
+ return @ied1.visible = false
672
+ end
673
+ @ied1.caption = lv[i][j]
674
+ @ied1.selection = 0, @ied1.length;
675
+ @ied1.readonly = lv[i].data ? false : true if lv==@lvattr
676
+ @ied1.SetFocus
677
+ end
678
+
679
+ def parse_template4wr(cmd, str, tp)
680
+ tps = tp.split(',')
681
+ ar = str.sub(/^\[(.*)\]$/,'\1').split(',').map{|i| i.strip}
682
+ if ar.empty?
683
+ return tp=='s' ? '' : nil
684
+ end
685
+
686
+ tp = tps.find{|i| i.size==ar.size} || tps[0]
687
+ res = []
688
+ [tp.size, ar.size].min.times{|i| #dpp i, tp[i], ar[i]
689
+ if (c=@selected_ctrl.class)<WinControl && (f=c::FDConfig["#{cmd}_set".intern])
690
+ begin
691
+ res << f.call(@selected_ctrl, ar[i, ar.size-i])
692
+ rescue => err
693
+ MessageBox "#{err}", "FormDesigner", 0x10
694
+ end
695
+ break
696
+ end
697
+ case tp[i]
698
+ when 'h', 'i' # parse as Integer with prefix
699
+ res << (ar[i].nil?||ar[i]=='nil'||ar[i]=='n'||ar[i].empty? ? nil : ar[i].to_i(0))
700
+ when 's' # parse as String
701
+ res << ar[i].to_s
702
+ when 'm' # parse as Symbol
703
+ res << ar[i].intern
704
+ when 'b' # parse as true or false
705
+ res << (ar[i].empty?||ar[i]=='false'||ar[i]=='nil'||ar[i]=='f'||ar[i]=='n' ? false : true)
706
+ when 'n' # parse as control's name
707
+ res << (@frm.controls.__send__(ar[i]) if !ar[i].nil? && ar[i]!='nil' rescue nil)
708
+ when 't' # parse as 3 state value and :parent
709
+ res << case ar[i]
710
+ when 'false', 'f'
711
+ false
712
+ when 'nil', 'n', '', nil
713
+ nil
714
+ when 'parent', 'p'
715
+ :parent
716
+ when 'force'
717
+ :force
718
+ else
719
+ true
720
+ end
721
+ when 'a'
722
+ res.concat ar[i, ar.size-i]
723
+ break
724
+ else
725
+ raise "Unknown template '#{tp[i]}'"
726
+ end
727
+ }
728
+ res.size==1 ? res[0] : res
729
+ end
730
+
731
+ def reset_toplevelwin(newfrm, ctrl)
732
+ ctrl.parent = newfrm
733
+ ctrl._toplevelwin = newfrm
734
+ ctrl.controls.each{|i| reset_toplevelwin(newfrm, i)} if ctrl.respond_to?(:controls)
735
+ end
736
+
737
+ API.defun "SetParent(hwndself, hwndparent)"
738
+
739
+ def modify_class_name(frm, newname)
740
+ mod, oldname = frm.class.to_s.split('::')
741
+ newname = newname.split('::').last.to_s
742
+ # newname.split('::').last
743
+
744
+ unless newname =~ /[A-Z]\w*/
745
+ return msgbox "Invalid class name: #{newname}", "FormDesigner", 0x10
746
+ end
747
+ return if oldname == newname #; dpp frm, newname
748
+ if @forms.find{|i| i.class.to_s.split('::').last == newname}
749
+ return msgbox "#{newname} is already exists.", "FormDesigner", 0x10
750
+ end
751
+ superclass = frm.class.ancestors[1].to_s
752
+ newfrm = WR.module_eval("
753
+ class #{mod}::#{newname}<#{superclass}
754
+ FDConfig={} unless defined? FDConfig
755
+ def intialize();end
756
+ end
757
+ #{newname}.new")
758
+ newfrm.extend(ModToplevelHook)
759
+ newfrm.move(@frm.x, @frm.y, @frm.w, @frm.h)
760
+ newfrm.__fd_attributes__.each{|k, v| next if k=='class' || k=='clientsize'
761
+ newfrm.__send__((k+"=").intern, @frm.__send__(k.intern))
762
+ }
763
+ newfrm.__fd_src.update(@frm.__fd_src)
764
+ oldfrm = @frm
765
+ newfrm.create
766
+ oldfrm.controls.each{|i|
767
+ reset_toplevelwin(newfrm, i) if i.is_a?(Window)
768
+ newfrm.controls[newfrm.controls.count, 0] = i
769
+ if i.is_a?(Menubar)
770
+ oldfrm.SetMenu(nil)
771
+ i.parent = newfrm
772
+ newfrm.SetMenu(i)
773
+ end
774
+ }
775
+ oldfrm.close
776
+ idx = @forms.index(oldfrm)
777
+ @selected_ctrl = @frm = newfrm
778
+ @forms[idx] = @frm
779
+ _main1.window1[idx].caption = newname
780
+ GC.start
781
+ end
782
+
783
+ def refrect2ctrl(lvitem)
784
+ cmd = (lvitem[0] + "=").intern
785
+ template = lvitem.data #; dpp cmd, template
786
+ return if template.nil?
787
+ return modify_class_name(@selected_ctrl, lvitem[1]) if cmd == :class= && template == 'c'
788
+ return unless @selected_ctrl.respond_to?(cmd)
789
+ args = parse_template4wr(lvitem[0], lvitem[1], template) #; dpp cmd, args
790
+ begin
791
+ @selected_ctrl.__send__(cmd, args) #; dpp @selected_ctrl.__send__(lvitem[0].intern)
792
+ rescue => err
793
+ MessageBox "#{err}\n#{cmd}, #{args}", 'FormDesigner error', 0x10
794
+ end
795
+ if @selected_ctrl.is_a?(Window)
796
+ if @selected_ctrl.respond_to?(:_toplevelwin)
797
+ @selected_ctrl._toplevelwin.move_end
798
+ else
799
+ @selected_ctrl.move_end
800
+ end
801
+ elsif @selected_ctrl.is_a?(Dialog)
802
+ @selected_ctrl.x = self.x - @selected_ctrl.w
803
+ update_lvrs2()
804
+ else
805
+ update_lvrs2()
806
+ end
807
+ end
808
+
809
+ def lvattr_click(nm) # Show inplace editor
810
+ return if API.uint2int(nm.iItem) < 0
811
+ update_inpledit(@lvattr, nm.iItem, 1)
812
+ end
813
+
814
+ def lvattr_itemchanged(nm)
815
+ if nm.uOldState == LVIS_FOCUSED
816
+ lvitem = @lvattr[nm.iItem]
817
+ lvitem[1] = @ied1.caption #; dpp lvitem[1]
818
+ return if !lvitem.data || lvitem[1].empty?
819
+ refrect2ctrl(lvitem)
820
+ elsif nm.uNewState == LVIS_FOCUSED | LVIS_SELECTED
821
+ update_inpledit(@lvattr, nm.iItem, 1)
822
+ end
823
+ end
824
+
825
+ def self_activate(state, minimize, hwnd)
826
+ return if state!=2
827
+ return unless @frm
828
+ # @frm.setorder(self)
829
+ # setorder(@frm)
830
+ end
831
+
832
+ def self_keydown(vk, *) #; dpp vk
833
+ case vk
834
+ when 13 # LF
835
+ lv = @lvitems.visible ? @lvitems : @lvattr
836
+ lvitem = lv[f=@ied1.iitem]
837
+ itm, subitm = lv.hittest(@ied1.x, @ied1.y)
838
+ lvitem[subitm] = @ied1.caption
839
+ if @lvitems.visible
840
+ so = @selected_object
841
+ if so.respond_to?(:__fd_edit_item)
842
+ so.__fd_edit_item(@lvitems, itm, subitm, @ied1)
843
+ else
844
+ so.class::FDConfig[:edit_item].call(so, @lvitems, itm, subitm, @ied1)
845
+ end
846
+ else
847
+ refrect2ctrl(lvitem)
848
+ end
849
+ lv[f].focused = true
850
+ update_inpledit(lv, f, subitm)
851
+ when 9 # TAB
852
+ end
853
+ end
854
+
855
+ def update_nested_hierarchy(node, ctrl)
856
+ ctrl.controls.each{|i|
857
+ node << [i.name.to_s, nil, nil, i] if i.is_a?(WinControl)
858
+ node.expand
859
+ update_nested_hierarchy(node.last, i) if i.respond_to?(:controls)
860
+ }
861
+ end
862
+
863
+ def update_hierarchy(ctrl=nil)
864
+ @tvhrc.clear.root << [@frm.class.to_s.sub(/^.*::/, ''), nil, nil, @frm]
865
+ @frm.controls.each{|i|
866
+ @tvhrc.root[0] << [i.name.to_s, nil, nil, i] if i.is_a?(WinControl)
867
+ update_nested_hierarchy(@tvhrc.root[0].last, i) if i.respond_to?(:controls)
868
+ }
869
+ @tvhrc.root.each{|i| i.expand}
870
+ tvhrc_select_ctrl
871
+ end
872
+
873
+ def tvhrc_selchanged(nmtreeview)
874
+ ctrl = @tvhrc.hitem2ref(nmtreeview.itemNew.hItem).data
875
+ @frm.select_control_from_main(ctrl) if ctrl != @selected_ctrl
876
+ end
877
+
878
+ def tvhrc_select_ctrl(node=nil)
879
+ if node
880
+ node.each{|i|
881
+ if i.data == (@selected_ctrl || @frm)
882
+ return i.select
883
+ elsif i.count>0
884
+ tvhrc_select_ctrl(i)
885
+ end
886
+ }
887
+ else
888
+ tvhrc_select_ctrl(@tvhrc.root)
889
+ end
890
+ end
891
+
892
+ # def lvrs1_dblclk(*)
893
+ # add_resource2form()
894
+ # end
895
+ # def btrscadd_clicked(*)
896
+ # add_resource2form()
897
+ # klass = @lvrs1[@lvrs1.focused].data
898
+ # end
899
+
900
+ def add_resource2form
901
+ klass = @selected_rs_klass
902
+ @selected_rs_klass = nil
903
+ @lvrs1[@lvrs1.focused].focused = false
904
+ return unless klass.is_a?(Class)
905
+
906
+ conf = klass::FDConfig
907
+ defcap = klass.to_s.sub(/.*::/, '')
908
+ capt = conf[:default_caption] || defcap
909
+ name = conf[:default_name] || defcap.downcase
910
+ name = @frm.suffixed_name(name + "1").intern
911
+ ctls = @frm.controls
912
+ if klass <= Imagelist
913
+ iml = ImageSizeInput.open_modal(self, [klass, @frm])
914
+ return unless iml
915
+ iml.name = name
916
+ ct = ctls << iml
917
+ itemcap = "#{name} (#{w}, #{h})"
918
+ else #; dpp @frm
919
+ ct = ctls << klass.new(name, capt)
920
+ itemcap = name.to_s
921
+ end
922
+
923
+ if (sz=ctls._size) > 1
924
+ a_mnb = []; s_mnb = []
925
+ a_mnu = []; s_mnu = []
926
+ a_tim = []; s_tim = []
927
+ a_iml = []; s_iml = []
928
+ lns = @frm.__fd_src[:lines]
929
+ sol = lns ? lns.size : 0
930
+ ctls._size.times{|j| # Sort by priority
931
+ i = sz-j-1;
932
+ c = ctls[i]
933
+ if c.is_a?(Menubar)
934
+ a_mnb << ctls._delete_at(i)
935
+ if c.respond_to?(:__fd_src) && c.__fd_src
936
+ l = lns.index(lsrc=c.__fd_src[2])
937
+ sol = l if l && sol > l
938
+ s_mnb << lns.delete(lsrc)
939
+ end
940
+ elsif c.is_a?(Menu)
941
+ a_mnu << ctls._delete_at(i)
942
+ if c.respond_to?(:__fd_src) && c.__fd_src
943
+ l = lns.index(lsrc=c.__fd_src[2])
944
+ sol = l if l && sol > l
945
+ s_mnu << lns.delete(lsrc)
946
+ end
947
+ elsif c.is_a?(Timer)
948
+ a_tim << ctls._delete_at(i)
949
+ if c.respond_to?(:__fd_src) && c.__fd_src
950
+ l = lns.index(lsrc=c.__fd_src[2])
951
+ sol = l if l && sol > l
952
+ s_tim << lns.delete(lsrc)
953
+ end
954
+ elsif c.is_a?(Imagelist)
955
+ a_iml << ctls._delete_at(i)
956
+ if c.respond_to?(:__fd_src) && c.__fd_src
957
+ lsrc, lcount = c.__fd_src[2, 2]
958
+ l = lns.index(lsrc)
959
+ sol = l if l && sol > l
960
+ if lcount
961
+ ll = lns.index(lsrc)
962
+ s_iml << lns.slice!(ll, lcount)
963
+ else
964
+ s_iml << lns.delete(lsrc)
965
+ end #; dpp s_iml
966
+ end
967
+ end
968
+ }
969
+
970
+ ar = (a_mnb + a_mnu + a_tim + a_iml).compact
971
+ ar.each{|c| ctls[0, 0] = c}
972
+ if lns
973
+ as = (s_iml + s_tim + s_mnu + s_mnb ).compact.flatten
974
+ lns[sol, 0] = as
975
+ end
976
+ end
977
+ # dpp ctls.map{|i| i.name}
978
+
979
+ ct.extend(ModResourceHook)
980
+ @tabs2.cursel = 0
981
+ @lvattr.visible=true
982
+ update_lvrs2
983
+ @lvrs2.SetFocus
984
+ selidx = @lvrs2.find(param: ct.__id__)
985
+ @lvrs2.selections.clear
986
+ @lvrs2[selidx].selected = true
987
+ @lvrs2[selidx].focused = true
988
+ set_object2lvitems(ct)
989
+ end
990
+
991
+ def tabs1_selchange(nmhdr)
992
+ @selected_rs_klass = nil
993
+ @selected_klass = nil
994
+ case @tabs1.cursel
995
+ when 0
996
+ @lvstd.clear
997
+ @fdstdctls.each{|i| @lvstd << i}
998
+ when 1
999
+ @lvcmn.clear
1000
+ @fdcmnctls.each{|i| @lvcmn << i}
1001
+ when 2
1002
+ @lvrs1.clear
1003
+ @fdrscctls.each{|i| @lvrs1 << i}
1004
+ update_lvrs2
1005
+ when 3
1006
+ update_hierarchy()
1007
+ tvhrc_select_ctrl()
1008
+ end
1009
+ end
1010
+
1011
+ def tabs2_selchange(nmhdr)
1012
+ @ied1.visible = false
1013
+ @ied1.caption = ''
1014
+ obj = @selected_ctrl
1015
+ case @tabs2.cursel
1016
+ when 0
1017
+ @ied1.parent = @lvattr
1018
+ @stbr1.caption = obj.respond_to?(:name) ? "#{obj.class}: #{obj.name}" : obj.class.to_s
1019
+ when 1
1020
+ if @tabs2[1].text != "Styles"
1021
+ @ied1.parent = @lvitems
1022
+ @stbr1.caption = "Right click to add an item."
1023
+ if obj.respond_to?(:__fd_update_lv)
1024
+ obj.__fd_update_lv(@lvitems)
1025
+ else
1026
+ (prc=obj.class::FDConfig[:update_lv]) && prc.call(obj, @lvitems)
1027
+ end
1028
+ else
1029
+ @ied1.hide
1030
+ @stbr1.caption = obj.respond_to?(:name) ? "#{obj.class}: #{obj.name}" : obj.class.to_s
1031
+ end
1032
+ when 3
1033
+ @ied1.parent = @lvitems
1034
+ @stbr1.caption = "Right click to add an item."
1035
+ if obj.respond_to?(:__fd_update_lv)
1036
+ obj.__fd_update_lv(@lvitems)
1037
+ else
1038
+ (prc=obj.class::FDConfig[:update_lv]) && prc.call(obj, @lvitems)
1039
+ end
1040
+ when 4
1041
+ @lvitems.show
1042
+ @ied1.parent = @lvitems
1043
+ @stbr1.caption = "Right click to add an item."
1044
+ # (prc=obj.class::FDConfig[:update_lv_alt]) && prc.call(obj, @lvitems)
1045
+ obj.__fd_update_lv_alt(@lvitems)
1046
+ else
1047
+ @ied1.hide
1048
+ @stbr1.caption = obj.respond_to?(:name) ? "#{obj.class}: #{obj.name}" : obj.class.to_s
1049
+ end
1050
+ end
1051
+
1052
+ def update_lvrs2()
1053
+ selidx = @lvrs2.focused
1054
+ @lvrs2.clear
1055
+ @frm.controls.each{|i|
1056
+ unless i.is_a?(Window)
1057
+ if i.is_a?(Menubar)
1058
+ nm = i.name
1059
+ img = 3
1060
+ elsif i.is_a?(Menu)
1061
+ nm = i.name
1062
+ img = 2
1063
+ elsif i.is_a?(Imagelist)
1064
+ w, h = i.iconsize
1065
+ nm = "#{i.name} (#{w}, #{h})"
1066
+ img = 1
1067
+ elsif i.is_a?(Timer)
1068
+ nm = i.name
1069
+ img = 4
1070
+ end #;dpp [nm, img, nil, i]
1071
+ @lvrs2 << [nm.to_s, img, nil, i]
1072
+ end
1073
+ }
1074
+ return if selidx < 0
1075
+ @lvrs2[selidx].focused = true
1076
+ @lvrs2[selidx].selected = true
1077
+ end
1078
+
1079
+ def lvrs2_click(nmitem)
1080
+ return add_resource2form() if @selected_rs_klass
1081
+ # @selected_rs_klass = nil
1082
+ obj = @lvrs2[nmitem.iItem].data
1083
+ @frm.TrackPopupMenu(obj, 0,0) if obj.is_a?(Menu) && !obj.is_a?(Menubar)
1084
+ end
1085
+
1086
+ def lvrs2_itemchanged(nmlv)
1087
+ return if nmlv.uNewState & LVIS_FOCUSED == 0
1088
+ obj = @lvrs2[nmlv.iItem].data
1089
+ update_attributes(obj)
1090
+ set_object2lvitems(obj)
1091
+ end
1092
+
1093
+ def set_object2lvitems(obj)
1094
+ @ied1.visible = false
1095
+ @ied1.caption = ''
1096
+ if obj.respond_to?(:__fd_set_lvitem)
1097
+ @selected_object = obj
1098
+ @frm.select_control_from_main(nil) unless obj.is_a?(Window)
1099
+ obj.__fd_set_lvitem(@lvitems, _image0)
1100
+ elsif setobject=obj.class::FDConfig[:setobject]
1101
+ @selected_object = obj
1102
+ @frm.select_control_from_main(nil) unless obj.is_a?(Window)
1103
+ setobject.call(obj, @lvitems, _image0) if setobject
1104
+ else
1105
+ return
1106
+ end
1107
+ case @tabs2.cursel
1108
+ when 0
1109
+ @stbr1.caption = obj.respond_to?(:name) ? "#{obj.class}: #{obj.name}" : obj.class
1110
+ when 1
1111
+ @stbr1.caption = "Right click to add an item."
1112
+ end
1113
+ end
1114
+
1115
+ def lvrs2_rclick(nmitem)
1116
+ cx, cy = nmitem.ptAction.to_a
1117
+ TrackPopupMenu(_.popup2, @lvrs2.x + cx, @lvrs2.y + cy)
1118
+ end
1119
+
1120
+ def additem_clicked(idcmd, state)
1121
+ return unless so = @selected_object
1122
+ if so.respond_to?(:__fd_on_additem)
1123
+ so.__fd_on_additem(@lvitems, @lvitems.focused, _popup1, idcmd)
1124
+ return
1125
+ end
1126
+ so.class::FDConfig[:on_additem].call(so, @lvitems, @lvitems.focused, _popup1, idcmd)
1127
+ end
1128
+ def insertitem_clicked(*)
1129
+ return unless so = @selected_object
1130
+ if so.respond_to?(:__fd_on_insertitem)
1131
+ so.__fd_on_insertitem(@lvitems, @lvitems.focused)
1132
+ return
1133
+ end
1134
+ so.class::FDConfig[:on_insertitem].call(so, @lvitems, @lvitems.focused)
1135
+ end
1136
+ def additem_under_clicked(*)
1137
+ return unless so = @selected_object
1138
+ if so.respond_to?(:__fd_on_additem_under)
1139
+ so.__fd_on_additem_under(@lvitems, @lvitems.focused)
1140
+ return
1141
+ end
1142
+ so.class::FDConfig[:on_additem_under].call(so, @lvitems, @lvitems.focused)
1143
+ end
1144
+ def addnode_clicked(*)
1145
+ return unless so = @selected_object
1146
+ if so.respond_to?(:__fd_on_addnode)
1147
+ so.__fd_on_addnode(@lvitems, @lvitems.focused)
1148
+ return
1149
+ end
1150
+ so.class::FDConfig[:on_addnode].call(so, @lvitems, @lvitems.focused)
1151
+ end
1152
+ def addnode_under_clicked(*)
1153
+ return unless so = @selected_object
1154
+ if so.respond_to?(:__fd_on_addnode_under)
1155
+ so.__fd_on_addnode_under(@lvitems, @lvitems.focused)
1156
+ return
1157
+ end
1158
+ so.class::FDConfig[:on_addnode_under].call(so, @lvitems, @lvitems.focused)
1159
+ end
1160
+ def deleteitem_clicked(*)
1161
+ return unless so = @selected_object
1162
+ if so.respond_to?(:__fd_on_deleteitem)
1163
+ so.__fd_on_deleteitem(@lvitems, @lvitems.focused)
1164
+ return
1165
+ end
1166
+ so.class::FDConfig[:on_deleteitem].call(so, @lvitems, @lvitems.focused)
1167
+ end
1168
+
1169
+ def deleteitem2_clicked(*)
1170
+ obj = @lvrs2[@lvrs2.focused].data
1171
+ obj.__fd_on_delete_this() if obj.respond_to?(:__fd_on_delete_this)
1172
+ @lvrs2[@lvrs2.focused].delete
1173
+ @frm.controls.delete(obj)
1174
+ @frm.SetMenu(nil) if obj.is_a?(Menubar)
1175
+ @lvrs2.selections.clear
1176
+ @lvrs2.clear
1177
+ update_lvrs2
1178
+ end
1179
+
1180
+ def tvhrc_rclick(nmhdr)
1181
+ cx, cy = @tvhrc.ScreenToClient(*APP.GetCursorPos)
1182
+ if caret = @tvhrc.hittest(cx, cy)
1183
+ caret.select
1184
+ TrackPopupMenu(_popup3, cx, cy) if caret.data != @frm
1185
+ end
1186
+ end
1187
+
1188
+ def udhrc_deltapos(ud)
1189
+ ctl = @tvhrc.selection.data
1190
+ return if !ctl || ctl==@frm
1191
+ ctls = ctl.parent.controls
1192
+ idx = ctls.index(ctl)
1193
+ if ud.iDelta < 0 # UP
1194
+ return if idx == 0
1195
+ ctls.delete_at(idx)
1196
+ ctls[idx-1, 0] = ctl
1197
+ else # DOWN
1198
+ ctls.delete_at(idx)
1199
+ ctls[idx+1, 0] = ctl
1200
+ end
1201
+ ctls.compact!
1202
+ update_hierarchy()
1203
+ tvhrc_select_ctrl()
1204
+ end
1205
+
1206
+ def deleteitem3_clicked(*)
1207
+ @tvhrc.selection.data.delete
1208
+ @tvhrc.selection.delete
1209
+ end
1210
+
1211
+ def lvitems_rclick(nmitem) #; dpp nmitem
1212
+ @ied1.visible = false
1213
+ so = @selected_object || @selected_ctrl
1214
+ idx = nmitem.iItem #; dpp so, idx
1215
+ if so.respond_to?(:__fd_on_lv_rclick) #; dpp so, _popup1, _popup1.count
1216
+ _popup1.clear
1217
+ r = so.__fd_on_lv_rclick(@lvitems, idx)#; dpp idx, r
1218
+ _popup1[0, 0] = r
1219
+ else
1220
+ _popup1.clear[0, 0] = so.class::FDConfig[:on_lv_rclick].call(so, @lvitems, idx)
1221
+ end
1222
+ cx, cy = ScreenToClient(*APP.GetCursorPos)
1223
+ TrackPopupMenu(_popup1, cx, cy)
1224
+ end
1225
+
1226
+ def lvitems_click(nmia)
1227
+ if @ied1.iitem && @ied1.isubitem &&
1228
+ (nmia.iItem==@ied1.iitem && nmia.iSubItem!=@ied1.isubitem)
1229
+ so = @selected_object
1230
+ update_inpledit(@lvitems, nmia.iItem, nmia.iSubItem)
1231
+ if so.respond_to?(:__fd_edit_item)
1232
+ so.__fd_edit_item(@lvitems, nmia.iItem, nmia.iSubItem, @ied1)
1233
+ elsif prc=so.class::FDConfig[:edit_item]
1234
+ prc.call(so, @lvitems, nmia.iItem, nmia.iSubItem, @ied1)
1235
+ end
1236
+ else
1237
+ update_inpledit(@lvitems, nmia.iItem, nmia.iSubItem)
1238
+ end
1239
+ @lvitems_cursubitem = nmia.iSubItem
1240
+ end
1241
+
1242
+ def lvitems_itemchanged(nmlv)
1243
+ if nmlv.uOldState == LVIS_FOCUSED
1244
+ so = @selected_object
1245
+ lvitem = @lvitems[nmlv.iItem]
1246
+ @lvitems[nmlv.iItem][@lvitems_cursubitem] = @ied1.caption
1247
+ if so.respond_to?(:__fd_edit_item)
1248
+ so.__fd_edit_item(@lvitems, nmlv.iItem, @lvitems_cursubitem, @ied1)
1249
+ elsif prc=so.class::FDConfig[:edit_item]
1250
+ prc.call(so, @lvitems, nmlv.iItem, @lvitems_cursubitem, @ied1)
1251
+ end
1252
+ elsif nmlv.uNewState == LVIS_FOCUSED | LVIS_SELECTED
1253
+ update_inpledit(@lvitems, nmlv.iItem, @lvitems_cursubitem)
1254
+ end
1255
+ end
1256
+
1257
+ def lvstyles_itemchanged(nmlv)
1258
+ return if @_lvstyles_updating
1259
+ win = (@selected_ctrl || @frm)
1260
+ nm = @lvstyles[nmlv.iItem].text.intern
1261
+ st = win.class::WinStyles[nm]
1262
+ altmask = win.class::FDConfig[:altanate_mask]
1263
+ m = altmask.find{|i| i&st > 0 || (i&1>0 && st==0)} if altmask # check LSB of mask
1264
+ mm = win.class::WinStyles.inject([]){|r, v|
1265
+ r << v[0] if (v[1]&m > 0) || (v[1]==0 && m&1==1)
1266
+ r
1267
+ } if m
1268
+ case nmlv.uNewState >> 12
1269
+ when 1 # not checked
1270
+ win.style &= ~st
1271
+ when 2 # checked
1272
+ if m
1273
+ mm.each{|i|
1274
+ if (fi=@lvstyles.find(string: i.to_s)) >= 0 && i != nm
1275
+ @_lvstyles_updating = true
1276
+ @lvstyles[fi].checked = false
1277
+ @_lvstyles_updating = nil
1278
+ end
1279
+ }
1280
+ win.style = (win.style & ~m) | st
1281
+ else
1282
+ win.style |= st
1283
+ end
1284
+ end
1285
+ if win.respond_to?(:__fd_recreate_this)
1286
+ @selected_ctrl = win.__fd_recreate_this()
1287
+ elsif win.class::FDConfig[:need_recreate]
1288
+ @selected_ctrl = win.__fd_recreate
1289
+ end
1290
+ win.refresh
1291
+ end
1292
+
1293
+ def lvevents_itemchanged(nmlv)
1294
+ return if @_lvevents_updating
1295
+ win = (@selected_ctrl || @frm)
1296
+ case nmlv.uNewState >> 12
1297
+ when 1 # not checked
1298
+ if win.class::DefaultEvents.index(@lvevents[nmlv.iItem].text.intern)
1299
+ @lvevents[nmlv.iItem].checked = true
1300
+ else
1301
+ win.__fd_events.delete(@lvevents[nmlv.iItem].text.intern)
1302
+ end
1303
+ when 2 # checkd
1304
+ win.__fd_events << @lvevents[nmlv.iItem].text.intern
1305
+ win.__fd_events.uniq!
1306
+ end
1307
+ end
1308
+
1309
+ def raise1_clicked(*)
1310
+ raise
1311
+ end
1312
+
1313
+ self.start if $0==__FILE__
1314
+ end
1315
+ end