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,574 @@
1
+ require 'wrb/commctrlconst'
2
+ require 'wrb/imecommon'
3
+ require 'wrb/combocommon'
4
+
5
+ module WR
6
+ module RC
7
+ CBEIF_TEXT = 0x1
8
+ CBEIF_IMAGE = 0x2
9
+ CBEIF_SELECTEDIMAGE = 0x4
10
+ CBEIF_OVERLAY = 0x8
11
+ CBEIF_INDENT = 0x10
12
+ CBEIF_LPARAM = 0x20
13
+ CBEIF_DI_SETITEM = 0x10000000
14
+ CBEIF_STANDARD = CBEIF_TEXT | CBEIF_IMAGE | CBEIF_SELECTEDIMAGE | CBEIF_INDENT | CBEIF_LPARAM
15
+
16
+ CBEM_INSERTITEMA = WM_USER+1
17
+ CBEM_SETIMAGELIST = WM_USER+2
18
+ CBEM_GETIMAGELIST = WM_USER+3
19
+ CBEM_GETITEMA = WM_USER+4
20
+ CBEM_SETITEMA = WM_USER+5
21
+ CBEM_DELETEITEM = 0x0144 # CB_DELETESTRING
22
+ CBEM_GETCOMBOCONTROL = WM_USER+6
23
+ CBEM_GETEDITCONTROL = WM_USER+7
24
+ CBEM_SETEXSTYLE = WM_USER+8
25
+ CBEM_SETEXTENDEDSTYLE = WM_USER+14
26
+ CBEM_GETEXSTYLE = WM_USER+9
27
+ CBEM_GETEXTENDEDSTYLE = WM_USER+9
28
+ CBEM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT
29
+ CBEM_GETUNICODEFORMAT = CCM_GETUNICODEFORMAT
30
+ CBEM_HASEDITCHANGED = WM_USER+10
31
+ CBEM_INSERTITEMW = WM_USER+11
32
+ CBEM_SETITEMW = WM_USER+12
33
+ CBEM_GETITEMW = WM_USER+13
34
+
35
+ if RWin::UNICODE
36
+ CBEM_INSERTITEM = CBEM_INSERTITEMW
37
+ CBEM_SETITEM = CBEM_SETITEMW
38
+ CBEM_GETITEM = CBEM_GETITEMW
39
+ else
40
+ CBEM_INSERTITEM = CBEM_INSERTITEMA
41
+ CBEM_SETITEM = CBEM_SETITEMA
42
+ CBEM_GETITEM = CBEM_GETITEMA
43
+ end
44
+
45
+ CBEM_SETWINDOWTHEME = CCM_SETWINDOWTHEME
46
+
47
+ CBES_EX_NOEDITIMAGE = 0x1
48
+ CBES_EX_NOEDITIMAGEINDENT = 0x2
49
+ CBES_EX_PATHWORDBREAKPROC = 0x4
50
+ CBES_EX_NOSIZELIMIT = 0x8
51
+ CBES_EX_CASESENSITIVE = 0x10
52
+
53
+ CBEN_FIRST = -800
54
+ CBEN_GETDISPINFOA = CBEN_FIRST-0
55
+ CBEN_INSERTITEM = CBEN_FIRST-1
56
+ CBEN_DELETEITEM = CBEN_FIRST-2
57
+ CBEN_BEGINEDIT = CBEN_FIRST-4
58
+ CBEN_ENDEDITA = CBEN_FIRST-5
59
+ CBEN_ENDEDITW = CBEN_FIRST-6
60
+ CBEN_GETDISPINFOW = CBEN_FIRST-7
61
+ CBEN_DRAGBEGINA = CBEN_FIRST-8
62
+ CBEN_DRAGBEGINW = CBEN_FIRST-9
63
+
64
+ if defined?(Encoding)
65
+ CBEN_GETDISPINFO = CBEN_GETDISPINFOW
66
+ CBEN_DRAGBEGIN = CBEN_DRAGBEGINW
67
+ CBEN_ENDEDIT = CBEN_ENDEDITW
68
+ else
69
+ CBEN_GETDISPINFO = CBEN_GETDISPINFOA
70
+ CBEN_DRAGBEGIN = CBEN_DRAGBEGINA
71
+ CBEN_ENDEDIT = CBEN_ENDEDITA
72
+ end
73
+
74
+ CBENF_KILLFOCUS = 1
75
+ CBENF_RETURN = 2
76
+ CBENF_ESCAPE = 3
77
+ CBENF_DROPDOWN = 4
78
+
79
+ CBEMAXSTRLEN = 260
80
+ end
81
+
82
+ # A combo box control which provides native support for item images.
83
+ #<br>See also <a href="https://docs.microsoft.com/en-us/windows/desktop/Controls/
84
+ #window-controls">Windows Control section of Microsoft Docs.</a>
85
+ class ComboboxEx < WinControl
86
+ include ModCommCtrl
87
+ include ModComboCommon
88
+ # include Enumerable
89
+
90
+ API.typealias("INT_PTR", 'I')
91
+ COMBOBOXEXITEM = API.defstruct "
92
+ UINT mask;
93
+ INT_PTR iItem;
94
+ LPTSTR pszText;
95
+ int cchTextMax;
96
+ int iImage;
97
+ int iSelectedImage;
98
+ int iOverlay;
99
+ int iIndent;
100
+ LPARAM lParam;"
101
+
102
+ NMCOMBOBOXEX = API.defstruct "
103
+ NMHDR hdr;
104
+ COMBOBOXEXITEM ceItem;"
105
+
106
+ NMCBEDRAGBEGIN = API.defstruct "
107
+ NMHDR hdr;
108
+ int iItemid;
109
+ TCHAR szText[#{CBEMAXSTRLEN}];"
110
+
111
+ NMCBEENDEDIT = API.defstruct "
112
+ NMHDR hdr;
113
+ BOOL fChanged;
114
+ int iNewSelection;
115
+ TCHAR szText[#{CBEMAXSTRLEN}];
116
+ int iWhy;"
117
+
118
+ # Wrapper of the index of an item
119
+ class Item
120
+ include RC
121
+
122
+ def initialize(owner, idx)
123
+ @owner = owner
124
+ @index = idx
125
+ end
126
+
127
+ def text()
128
+ if @owner.alive?
129
+ buff = TCHAR[CBEMAXSTRLEN]
130
+ cbxitem = COMBOBOXEXITEM[CBEIF_TEXT, @index, buff, CBEMAXSTRLEN]
131
+ @owner.SendMessage(CBEM_GETITEM, 0, cbxitem)
132
+ buff.to_s
133
+ else
134
+ @owner._items[@index][0]
135
+ end
136
+ end
137
+ def text=(txt)
138
+ if @owner.alive?
139
+ cbxitem = COMBOBOXEXITEM[CBEIF_TEXT, @index, txt, txt.size]
140
+ @owner.SendMessage(CBEM_SETITEM, 0, cbxitem)
141
+ else
142
+ @owner._items[@index][0] = txt
143
+ end
144
+ end
145
+
146
+ def image()
147
+ if @owner.alive?
148
+ cbxitem = COMBOBOXEXITEM[CBEIF_IMAGE, @index]
149
+ @owner.SendMessage(CBEM_GETITEM, 0, cbxitem)
150
+ cbxitem.iImage
151
+ else
152
+ @owner._items[@index][1]
153
+ end
154
+ end
155
+ def image=(img)
156
+ if @owner.alive?
157
+ cbxitem = COMBOBOXEXITEM[CBEIF_IMAGE | CBEIF_SELECTEDIMAGE, @index]
158
+ cbxitem.iImage = img
159
+ @owner.SendMessage(CBEM_SETITEM, 0, cbxitem)
160
+ else
161
+ if @owner._items[@index][1].is_a?(Array)
162
+ @owner._items[@index][1][0] = img
163
+ else
164
+ @owner._items[@index][1] = img
165
+ end
166
+ end
167
+ end
168
+
169
+ def selectedimage()
170
+ if @owner.alive?
171
+ cbxitem = COMBOBOXEXITEM[CBEIF_SELECTEDIMAGE, @index]
172
+ @owner.SendMessage(CBEM_GETITEM, 0, cbxitem)
173
+ cbxitem.iSelectedImage
174
+ else
175
+ @owner._items[@index][2]
176
+ end
177
+ end
178
+ def selectedimage=(isel)
179
+ if @owner.alive?
180
+ cbxitem = COMBOBOXEXITEM[CBEIF_SELECTEDIMAGE, @index]
181
+ cbxitem.iSelectedImage = isel
182
+ @owner.SendMessage(CBEM_SETITEM, 0, cbxitem)
183
+ else
184
+ @owner._items[@index][2] = isel
185
+ end
186
+ end
187
+
188
+ def overlay()
189
+ if @owner.alive?
190
+ cbxitem = COMBOBOXEXITEM[CBEIF_OVERLAY, @index]
191
+ @owner.SendMessage(CBEM_GETITEM, 0, cbxitem)
192
+ cbxitem.iOverlay
193
+ else
194
+ @owner._items[@index][3]
195
+ end
196
+ end
197
+ def overlay=(ovl)
198
+ if @owner.alive?
199
+ cbxitem = COMBOBOXEXITEM[CBEIF_OVERLAY, @index]
200
+ cbxitem.iOverlay = ovl
201
+ @owner.SendMessage(CBEM_SETITEM, 0, cbxitem)
202
+ else
203
+ @owner._items[@index][3] = ovl
204
+ end
205
+ end
206
+
207
+ def indent()
208
+ if @owner.alive?
209
+ cbxitem = COMBOBOXEXITEM[CBEIF_INDENT, @index]
210
+ @owner.SendMessage(CBEM_GETITEM, 0, cbxitem)
211
+ cbxitem.iIndent
212
+ else
213
+ @owner._items[@index][4]
214
+ end
215
+ end
216
+ def indent=(idt)
217
+ if @owner.alive?
218
+ cbxitem = COMBOBOXEXITEM[CBEIF_OVERLAY, @index]
219
+ cbxitem.iIndent = idt
220
+ @owner.SendMessage(CBEM_SETITEM, 0, cbxitem)
221
+ else
222
+ @owner._items[@index][4] = idt
223
+ end
224
+ end
225
+
226
+ def data()
227
+ if @owner.alive?
228
+ cbxitem = COMBOBOXEXITEM[CBEIF_LPARAM, @index]
229
+ @owner.SendMessage(CBEM_GETITEM, 0, cbxitem)
230
+ ObjectSpace._id2ref(cbxitem.lParam)
231
+ else
232
+ @owner._items[@index][5]
233
+ end
234
+ end
235
+ def data=(dat)
236
+ if @owner.alive?
237
+ cbxitem = cbxitem[CBEIF_LPARAM, @index]
238
+ @owner.SendMessage(CBEM_GETITEM, 0, cbxitem)
239
+ lp = cbxitem.lParam
240
+ if (lp&1)==0 && lp>NilID
241
+ @owner._ar_data.delete(ObjectSpace._id2ref(cbxitem.lParam)) # delete old data
242
+ @owner._ar_data << dat
243
+ end
244
+ cbxitem.lParam = dat.__id__
245
+ @owner.SendMessage(CBEM_SETITEM, 0, cbxitem)
246
+ else
247
+ @owner._items[@index][5] = dat
248
+ end
249
+ end
250
+ end
251
+
252
+ ####################### Main #######################
253
+
254
+ WinStyles = {
255
+ :simple => CBS_SIMPLE,
256
+ :dropdown => CBS_DROPDOWN,
257
+ :dropdownlist => CBS_DROPDOWNLIST
258
+ }
259
+ # def self.sym2style(*args) _sym2style(WinStyles, args); end
260
+
261
+ CbesExStyles = {
262
+ :noeditimage => CBES_EX_NOEDITIMAGE,
263
+ :noeditimageindent => CBES_EX_NOEDITIMAGEINDENT,
264
+ :pathwordbreakproc => CBES_EX_PATHWORDBREAKPROC,
265
+ :nosizelimit => CBES_EX_NOSIZELIMIT,
266
+ :casesensitive => CBES_EX_CASESENSITIVE
267
+ }
268
+ # def self.sym2exstyle(*args) _sym2style(CbesExStyles, args); end
269
+
270
+ PreDefinedEvents = {
271
+ :selchange => [WM_COMMAND, CBN_SELCHANGE, 'hi'],
272
+ :dblclk => [WM_COMMAND, CBN_DBLCLK, 'hi'],
273
+ :setfocus => [WM_COMMAND, CBN_SETFOCUS, 'hi'],
274
+ :killfocus => [WM_COMMAND, CBN_KILLFOCUS, 'hi'],
275
+ :editchange => [WM_COMMAND, CBN_EDITCHANGE, 'hi'],
276
+ :editupdate => [WM_COMMAND, CBN_EDITUPDATE, 'hi'],
277
+ :dropdown => [WM_COMMAND, CBN_DROPDOWN, 'hi'],
278
+ :closeup => [WM_COMMAND, CBN_CLOSEUP, 'hi'],
279
+ :selendok => [WM_COMMAND, CBN_SELENDOK, 'hi'],
280
+ :selendcancel => [WM_COMMAND, CBN_SELENDCANCEL, 'hi'],
281
+ :setcursor => [WM_NOTIFY, NM_SETCURSOR, 'xs', NMMOUSE],
282
+ :getdispinfo => [WM_NOTIFY, CBEN_GETDISPINFO, 'xs', NMCOMBOBOXEX],
283
+ :insertitem => [WM_NOTIFY, CBEN_INSERTITEM, 'xs', NMCOMBOBOXEX],
284
+ :deleteitem => [WM_NOTIFY, CBEN_DELETEITEM, 'xs', NMCOMBOBOXEX],
285
+ :beginedit => [WM_NOTIFY, CBEN_BEGINEDIT, 'xs', NMCBEENDEDIT],
286
+ :endedit => [WM_NOTIFY, CBEN_ENDEDIT, 'xs', NMCBEENDEDIT],
287
+ :dragbegin => [WM_NOTIFY, CBEN_DRAGBEGIN, 'xs', NMCBEDRAGBEGIN]
288
+ }
289
+ DefaultEvents = [:selchange]
290
+ include ModIME
291
+
292
+ attr_reader :_items, :_ar_data
293
+
294
+ def initialize(*args)
295
+ super
296
+ @_classname = "ComboBoxEx32"
297
+ @_extendedstyle = 0
298
+ @_items ||= []
299
+ @_ar_data = []
300
+ @_cbeitem4delete = COMBOBOXEXITEM[CBEIF_LPARAM] # for delete method
301
+ @_acceptable_events = PreDefinedEvents.dup
302
+ self.style |= CBS_DROPDOWNLIST if (st = self.style & 0x00000003) == 0
303
+ @_droppedheight = @_h
304
+ end
305
+
306
+ #
307
+ def idcmd=(id)
308
+ case self.style # show editbox
309
+ when CBS_SIMPLE , CBS_DROPDOWN # for IME
310
+ parent.register_event(id, WM_COMMAND, CBN_SETFOCUS, "__gotfocus", 'hi', self)
311
+ parent.register_event(id, WM_COMMAND, CBN_KILLFOCUS, "__lostfocus",'hi', self)
312
+ @editable = true
313
+ end
314
+ parent.set_msgtranslator(WM_NOTIFY) unless parent.get_msgtranslator(WM_NOTIFY)
315
+ parent.register_event(id, WM_NOTIFY, CBEN_DELETEITEM, "__deleteitem__", 'xs',
316
+ NMCOMBOBOXEX, self) # for internal use
317
+ super
318
+ end
319
+
320
+ #
321
+ def create()
322
+ super
323
+ self.extendedstyle = @_extendedstyle if @_extendedstyle != 0
324
+ self.imagelist = @_imagelist if @_imagelist
325
+ self.droppedwidth = @_droppedwidth if @_droppedwidth
326
+ @_items.each_with_index{|val, idx| insert_item(idx, *val)}
327
+ self.cursel = @_cursel if @_cursel
328
+ end
329
+
330
+ # Gets the extended styles of this control.<br>
331
+ # Retuens combination of the integer values.
332
+ def extendedstyle()
333
+ alive? ? SendMessage(CBEM_GETEXTENDEDSTYLE, 0, 0) : @_extendedstyle
334
+ end
335
+
336
+ # Sets the extended styles of this control.<br>
337
+ # Give combination of the integer values.
338
+ def extendedstyle=(es)
339
+ alive? ? SendMessage(CBEM_SETEXTENDEDSTYLE, 0, es) : @_extendedstyle = es
340
+ end
341
+
342
+ # Gets an imagelist assigned to this ComboboxEx control.
343
+ def imagelist()
344
+ alive? ? APP.hrsc2ref(SendMessage(CBEM_GETIMAGELIST, 0, 0)) : @_imagelist
345
+ end
346
+
347
+ # Assignes an imagelist to this ComboboxEx control.
348
+ def imagelist=(il)
349
+ il = Imagelist.loadb64(il) if il.is_a?(String)
350
+ alive? ? SendMessage(CBEM_SETIMAGELIST,0,il._himagelist) : @_imagelist=il
351
+ end
352
+
353
+ # Gets the minimum allowable width of this Combobox control.
354
+ def droppedwidth()
355
+ if alive?
356
+ hchildcombo = SendMessage(CBEM_GETCOMBOCONTROL, 0, 0)
357
+ API.SendMessage(hchildcombo, CB_GETDROPPEDWIDTH, 0, 0)
358
+ else
359
+ @_droppedwidth
360
+ end
361
+ end
362
+
363
+ # Sets the minimum allowable width of this Combobox control.
364
+ def droppedwidth=(w)
365
+ alive? ? SendMessage(CB_SETDROPPEDWIDTH, w.to_i, 0) : @_droppedwidth = w
366
+ end
367
+
368
+ # Sets the items to this ComboboxEx control befor creation.<br>
369
+ # Give arrays of [[<i>text</i>, <i>image</i>, <i>indent</i>, <i>data</i>], ... ] as <i> args</i>.
370
+ def items=(*args)
371
+ raise "This method can only use before create." if self.alive?
372
+ args = args[0].is_a?(Array) ? args[0] : args
373
+ @_items ||= []
374
+ args.each{|i|
375
+ txt, image, indent, data = i
376
+ @_items << [txt, image, indent, data]
377
+ }
378
+ end
379
+
380
+ # Retreives a number of the items in this Combobox control.
381
+ def count()
382
+ alive? ? SendMessage(CB_GETCOUNT, 0, 0) : @_items.size
383
+ end
384
+
385
+ # Inserts an item with specified arguments.
386
+ # `image' can be an integer or array of [iImage, iSelectedImage, iOverlay]
387
+ def insert_item(index, text, image=nil, indent=nil, data=nil)
388
+ if alive?
389
+ cbxitem = COMBOBOXEXITEM[CBEIF_STANDARD, index.to_i]#, text.to_s, text.to_s.size]
390
+ if image.is_a?(Array)
391
+ cbxitem.iImage = image[0] ? image[0].to_i : -1
392
+ cbxitem.iSelectedImage = image[1] ? image[1].to_i : -1
393
+ if image[2]
394
+ cbxitem.mask |= CBEIF_OVERLAY
395
+ cbxitem.iOverlay = image[2].to_i
396
+ end
397
+ else
398
+ cbxitem.iImage = image ? image.to_i : -1
399
+ cbxitem.iSelectedImage = image ? image.to_i : -1
400
+ end
401
+ cbxitem.pszText = text.to_s
402
+ cbxitem.cchTextMax = text.size
403
+ cbxitem.iIndent = indent.to_i
404
+ lparam = data.__id__
405
+ @_ar_data << data if !data.nil? && (lparam&1)==0 && lparam>NilID
406
+ cbxitem.lParam = lparam
407
+ SendMessage(CBEM_INSERTITEM, index.to_i, cbxitem)
408
+ else
409
+ @_items.insert(index, [text, image, indent, data])
410
+ end
411
+ end
412
+
413
+ # Deletes specified index of this CombobxEx control.
414
+ def delete_item(index)
415
+ if alive?
416
+ SendMessage(CBEM_DELETEITEM, index, 0) == 0 ? false : true
417
+ else
418
+ @_items.delete_at(index)
419
+ end
420
+ end
421
+
422
+ def delete(*args)
423
+ return super() if args.empty?
424
+ idx, len = args
425
+ len ||= 1
426
+ len.times{ delete_item(idx) }
427
+ end
428
+
429
+ # insert(index, length=1, *args)
430
+ # Inserts and replaces at the specified <i>index</i> and <i>length</i> with the <i>items</i>.<br>
431
+ # Give the arrays of [[<i>text</i>, <i>image</i>, <i>indent</i>, <i>data</i>], ... ] as <i>args</i>.
432
+ def insert(*args)
433
+ idx = args.shift
434
+ idx = self.count if idx == -1
435
+ case args.size
436
+ when 2
437
+ len = args.shift
438
+ when 1
439
+ len = 1
440
+ else
441
+ raise ArgumentError "Illegal num of args: #{args.size + 1}"
442
+ end
443
+ args = args[0]
444
+ len.times{delete_item(idx)}
445
+ if args[0].is_a?(Array)
446
+ args.each_with_index{|arg, i| insert_item(idx + i, *arg)}
447
+ else
448
+ insert_item(idx, *args)
449
+ end
450
+ end
451
+ alias []= insert
452
+
453
+ # Retreives a ComboboxEx::Item at specified <i>index</i>.
454
+ def fetch(index)
455
+ ComboboxEx::Item.new(self, index)
456
+ end
457
+
458
+ # Retreives the array of ComboboxEx::Item at the specified index and length.
459
+ def slice(idx, num=1)
460
+ if num == 1
461
+ fetch(idx)
462
+ else
463
+ ret = []
464
+ num.times{|i| ret << fetch(idx + i)}
465
+ ret
466
+ end
467
+ end
468
+ alias [] slice
469
+
470
+ # Adds the args at last of the items.<br>
471
+ # Give the arrays of [[<i>text</i>, <i>image</i>, <i>indent</i>, <i>data</i>], ... ] as <i>args</i>.
472
+ def add(args)
473
+ if args[0].is_a?(Array) || args[0].is_a?(Item)
474
+ args.each{|i| insert_item(self.count, *i)}
475
+ else
476
+ insert_item(self.count, *args)
477
+ end
478
+ end
479
+ alias << add
480
+
481
+ # each(){|item| ... }
482
+ # Performs the block for each <i>item</i> in this combobox as a block parameter.
483
+ def each()
484
+ count.times{|i| yield fetch(i)}
485
+ end
486
+
487
+ # Retrieves the index of the currently selected item.
488
+ def cursel()
489
+ alive? ? SendMessage(CB_GETCURSEL, 0, 0) : @_cursel
490
+ end
491
+
492
+ # Changes the currently selected item to specified index.
493
+ def cursel=(idx)
494
+ alive? ? SendMessage(CB_SETCURSEL, idx, 0) : @_cursel = idx
495
+ end
496
+
497
+ # Retrieves the currently selected item as String.
498
+ def selection()
499
+ (i=cursel) >= 0 ? fetch(i) : nil
500
+ end
501
+
502
+ protected
503
+ def _apply_options(arg)
504
+ if es=CbesExStyles[arg]
505
+ @_extendedstyle |= es
506
+ end
507
+ if st=WinStyles[arg]
508
+ self.style |= st
509
+ return nil
510
+ end
511
+ super
512
+ end
513
+
514
+ private
515
+ def __deleteitem__(nmcomboboxex)
516
+ return unless alive?
517
+ return unless nmcomboboxex.hdr.hwndFrom == self._hwnd
518
+ return unless @_cbeitem4delete
519
+ item = nmcomboboxex.ceItem
520
+ SendMessage(CBEM_GETITEM, 0, @_cbeitem4delete)
521
+ lparam = @_cbeitem4delete.lParam
522
+ if (lparam&1)==0 && lparam>NilID
523
+ data = ObjectSpace._id2ref(lparam) #; dp "@data=%p", data
524
+ if n = @_ar_data.index(data)
525
+ @_ar_data.delete_at(n)
526
+ end
527
+ end
528
+ end
529
+ end
530
+
531
+ end
532
+
533
+ #__END__
534
+
535
+ module WR
536
+ class Form1 < Form
537
+ def initialize()
538
+ img = "JJMAIBAYAAwAAgABoABoAf7/f7/AsAYoBQkImnYAAAAACAIEAgRRAMAaQEADUBQADAwCA2LYAUCFAAAAAAAAAIBsIAAABAQPQQCAgDnANCAWAAYDAYAAQEAkQA/wAAH/BdB/v+AOcBAIBYQgBgo/Bj+Dr8If4TPwq/he/DP+HD8PP4gvxF/iU/E7+Kb8V/4uPxg/jK/Gn+Nz8cv47sIhEIhER0RkIoCIBkABHyNwgISiJGxwLyR6IRCPgWTA5MEQIygcaAIHJIiC4UDjQBByGDsEFwYHHypwg6hCVGDh8oYQBKOJHv98QxJg3nLiSFQD4lmRDgx8Q75l51EYCYH8xX5pAEImj6ackAgZp1gGbQTQmm/OAKcsE2f5vPzi/nO/Ov+eDlAIX9OZJ/vADT/gc7/gEG83+34CBPl/o+AwT8f4ngQE/j8c4CBvx8wIDfr9gcE84HAA6CAgegoJEAGDAoA="
539
+ resize 640, 480
540
+ self.font = Font['Meiryo', 18]
541
+ @cboxx1 = controls << ComboboxEx[:cboxx1, "", 4, 4, 126, 168, :dropdown, :imagelist=>img]
542
+ @cboxx2 = controls << ComboboxEx[:cboxx2, "", 132, 4, 126, 168, :droppedwidth=>150]
543
+ @cboxx1 << [["s1", 1, 0, 1], ["s2", 1, 0, 1]]
544
+
545
+ # list = ['open', 1, 0, 1], ['doc1', 2, 1], ['doc2', 2, 1]
546
+ # @cboxx1[0, 0] = list
547
+ # @cboxx1[-1, 0] = list.map{|i| i[0]+='1'; i}
548
+ # @cboxx1[-1, 0] = ['close', 0]
549
+ # list = list + list << ['closed', 0]
550
+ #
551
+ # (1..7).each{|i| @cboxx2 << ["item#{i}", nil, nil, "data=item#{i}"] }
552
+ # @cboxx1.cursel = 4
553
+ # @cboxx2.cursel = 6
554
+ end
555
+
556
+ def created()
557
+ @s = 'open'
558
+ @cboxx1 << [["s1", 1, 0, 1], ["s2", 1, 0, 1]]
559
+ # @cboxx1[0].text = ""
560
+ # dpp @cboxx1.imagelist
561
+ # dpp @cboxx2.droppedwidth
562
+ # @cboxx1[4].image = -1
563
+ # @cboxx1[4].selectedimage = -1
564
+ # @cboxx2.style = @cboxx2.style & ~3 | 2
565
+ end
566
+
567
+ def cboxx1_selchange(*args)
568
+ dpp @cboxx1.cursel
569
+ end
570
+
571
+ self.start
572
+ end
573
+ end if $0 == __FILE__
574
+