'#239#186#170#127#179#217#156#16
+ +'^'#22#199#225#248'+]'#138#227#248#208'e'#223'cL'#1#218#174#199'q'#220'Y,'#22
+ +'k'#196'vp'#2#26#18#192#246#6#189#180#247'`'#216'{s'#127#214#188'a'#253#1'a'
+ +#164'g'#24#170#183'T'#239#198'[*nuu'#211#16'h'#2#13#153'h'#148#246#217#31'P3'
+ +#230'@A'#2'z'#242'Q_'#151#17'{^'#209'r'#251#6#242#202#229#240'N'#185#167'X'
+ +'Bv'#228#127#250#198#159'T'#227#199#247'O'#245'<'#158#215#128'F'#215#190#246
+ +#138#186#242#179#127'Z}'#228'k'#191#161'z/'#127#244#216#190#235'i'#247#210
+ +#230#243#155'F'#30#166#176'G'#156'}'#214#219#15#135'_R'#128#159#157'~'#211'"'
+ ,#236#135#253#193#131#183#9#252#247#11#143'?'#252#4'Y'#170'B/'#153#223'$'#240
+ +#199'~2sC~2'#193#7#167#251'*'#173#250#223#145'\'#255'GF'#245''''#201#143#196
+ +#160#244'8'#165#191#190'.''3'#216#20#248#202'W'#190#226#147#25#16#175#172#172
+ +'4'#8#252']'#250#161#27'2'#185'('#204#0#16#1'G'#5#8#176#157#187#131#149'O'#14
+ +#231#141'K'#202')'#29#230#28#129'f['#245#174#127#146#236#255#150#245#9'0'#17
+ +#196#146#31' '#154#128'I'#27'6'#181#3#158#211'_'#176#152's@'#251#8#220'^'#131
+ +'O'#157#233#229#20#198'w'#254#233'7'#213';'#255#254#159')'#253#12#157#159#1
+ +#226'mn^W'#151'>'#253'e'#245#234'/'#253'U'#181#249#214#23#143#241#203#158#208
+ +#198'/'#175#188#206'H{'''#179'O'#247#242'3'#224#207'X'#234'g'#21#201#207#241
+ +'~'#2'}'#6'{_'#136#0#165#189#147#157#247#24#252#186#181#151#158#212#211#207
+ +#210#228#229#149#237#31#212#130#197#196#181#251#149#14#249#193#238#223#18#213
+ +#31's'#252'q'#200#143#182'w'#8#15#195#231'Y'#236's'#132#203'vb'#195#166#9'_'
+ +#191'~'#29#154'@'#11#181#2#240#7#208#15#191'*aA'#204'1'#8'=p5'#247#252#206
+ +#157#254#234#167#198'I}'#213#23#167#160#23#232','#192#184#217'c'#18#8#26'uM'
+ +#0'l'#18'D'#146')'#136#16#161'4'#18'A'#152#208#180#21#243#29#18'0'#221#133'<'
+ +'!'#0#229#2#255'9D'#12#142'a6'#227#225#253#159#168#255#254#219#191#172#134
+ +#247'~z'#130#183#236#217#6#8#186#190#178#169#214'>'#254#179#234#213'?'#251'+'
+ +#234#218#159#248#165#163#191#249#176'k'#246'<'#158'PG'#218'kG'#191#201#231
+ +#207'm#'#143#194#230'/'#210'{y'#153#27#169#191#208#192#135#148#135#250'O'#132
+ +'0'#217#190#163'F[?"'#146#152'Ks'#15']'#223#143'?7'#187'{o7'#194#217#208#177
+ +#251#231#244'l'#163#197#23#18'='#182'%'#215#159#193'O8'#128#25#176#141#132
+ +#159#157#157#157#169'x'#253#13#248'_'#24#2#224#239's'#19#132#8#248#173'$I'
+ +#216#31'@'#11'B'#130#208#4#216#31'@'#235#149'\'#249#157'w'#247#214'?='#205
+ +#162#14#146#132#152#4#184'7'#0#145'@gMu'#174#189'%'#229#194#162#1#152#252#0
+ +'h'#1#146'-X8'#6#203#154'@a'#18#248#197#228'#N1'#209'Y'#237'='#248#255#254
+ +#205'?R?'#248'w'#255'DMw'#30#158#234'y'#4#245#166'jn\S+'#175'}'#130'$'#252
+ +#159'R7'#190#244#231'T}'#253#202'i_'#158#202#200#203#210'_Rz='#227#236#147'r'
+ +'^'#6#191#163#246'['#240#139#202#15#224#179'z'#207'*'#191#246#1#204'v'#31#168
+ +#193#195#183#233'usn'#238#193#239'Cyo'#154#229'W'#187'{?'#236#196#147#190#168
+ +'l'#214#238#23#167#223'.'#236'~ZX'#245#135#211#143'0'#240#152#222#187'O'#166
+ +#241#4#9'?'#199#233#245#175#142#211'x'#202'}'#152#2#180#6#9'X'#127#0#217'?'
+ +#151#29'S'#0#26#1#252#1#221'$'#243#187#239#246#215'?'#179#200#163#134'o'#204
+ +#1#216#247'$'#233#153#4#174'|'#156'H'#160'nA'#207'f'#128'h'#4'L'#2#145'&'#1
+ +#21#233#168#2#147'@h'#8'@r'#5'|'#129';'#214'2)'#225'Y'#159#166'|'#240#222#219
+ +#234#143#255#249#223'W'#15#254#247#31#208'C99'#190'/'#162'k'#17#183'{'#170'u'
+ +#245'e'#181#250#209#207#168'+'#159#251#170#186#250#249#175#210#245#175#159
+ +#246'%x'#250'03L'#219#130#30'c'#231#23#253#251#140#167#223'H~V'#225#231'I'#1
+ +'x'#6#255#156#155'{'#178'&@'#255#155#238#222'U'#163'G'#210#206'{Q'#168#253' '
+ +#146#203#173'}L'#231#181#131'/q'#156'~H'#245'E'#188#127#15#133'='#180#141'F'
+ +#144'P'#251#225#244'{D'#207#245#222'I'#218#253#238'8'#141'G|'#169'?@f'#22'b'
+ +#167#160#210'Z'#0#182#215#233#1#236#204#147'`'#229#189#254#250#167#19#21#198
+ +''#28#234'#p'#231'R'#217#151'I'
+ +#184#15#142'>'#14#251#137#31'`'#188#253#30'-'#239'jR'#224'i'#188'S'#142#22#0
+ +#252#27#205#193#237#245#198#240#145#11'~z'#182#140#221#15#240'o'#153'J?z'#230
+ +#239#201'4'#223#232#240#131#6' '#199#150#237#247','#151#242#196#190#215#245#7
+ +#208#197'h'#18#248'{'#164#10'm'#18#192#175'Hx'#144#179#4'iY'#3#9#204#210'x'
+ +#237#246#254#250'''3'#207#15'Yr#<'#24'j'#18#8#27'm'#213'!'#18#136#154#29#2'~'
+ +'h'#181#0#228#8'x'#236#20',H'#128#181#129'J'#152#208#212#17#24#18'`'#231' t'
+ +#148#220#153#144#164'`'#132#234#147#246#244'+y'#10#4'1'#219'{'#172#230#253#29
+ +'5'#31#236#210'zO-'#134#251'\9'#217'}'#249#13#213#185#249#250#217#149#224'G'
+ +#189#142'K'#239'C'#17#222's[u'#219#16#159#11#254#170#212#151#220#254'L'#154
+ +'z'#148#9'@K'#255#209#214#143#213'd'#239#30#189'n'#206#145#1'~'#159#228#248
+ +#175#214'F'#15#174#180#251'w'#243#2#252#200#244#131#221#15#240#195#238#127','
+ +'!'#191'{R'#223#15#27'n{:'#157#14#136#0#160#194'%''e'#247#31#245'r'#31#251'w'
+ +'W'#243#3#200#28'@3'#209'Md'#10'*'#237#16#196#26'$'#176'J m'#141#23#181#205
+ +#187#253#213#183#136#4#2'm'#207#11#9'p'#4#160#201#230'@D'#234#170#213#4#156
+ +#181#23#11#17#24'M'#128'L'#2#21'j'#191#130'2s'#17#26's'#192'M'#30'2UEn'#163
+ +#145'3l'#26'|'#232'F^'#10#226#8#224'M'#21#159#210#158'}'#137#239#187'i'#189
+ +#218#230#215#128#207#13#248#173#228'_0'#200#217#241'7'#211#161#190#225#163
+ ,#183#213#172#255'H'#146'|'#140#218#175'k'#251#187#209'd'#235'zw'#239'=m]d'
+ +#153'x'#252#145#236#3#240'#'#151#127'['#233'y'#253#24#252#216'F'#178#207'I'
+ +#198#251#15#27#167#253'('#151'R'#133'I'#11'h#'#25#136#180#128'K'#208#4'h'#31
+ +'Z'#0'H'#0#164#176'B@lM'#147'x'#237'N'#127#245#19#169#23#198#218#179'/>'#1
+ +#174#12#172#17#9'|L'#197#157'uM'#10#198#15'`'#192'/m'#198'=!'#2'_z'#10'('#19
+ +'%'#16#231#160'2'#230#128#239#21#4'`'#174#214#139'>]'#241'y'#25'.'#234']sGl|'
+ +'O'#202'wm'#3#143#170#179#207'8'#250#0'f'#212#243'/'#28#240#27#231#31#175#167
+ +'j'#240#240#7#164'ImK'#140'?'#209#196#145'j'#240#175#213'F'#247'/'#183#145
+ +#226'k'#193#159'I'#154'/g'#250')]'#226#251'H'#230#245#131#228#199#164#30#143
+ +'1'#171#207'|>'#31#31'w'#170#239'Q.'#227'i'#223'F'#207'8'#5#209'@'#4']'#132
+ +#208'P'#212#9#15'"O'#224#138#201#20#4#9'$y'#220#189#189#191#250#214'BE'#245
+ +#18#9#136's'#176's'#249#13#21'w/'#177'/'#192'3'#181#2#177#244#16#176'&A'#164
+ +#253#2'b'#14#168#208'/'#146#134#140'i '#13'F'#172'F`'#175#152#163#10#156#159
+ +':'#163#23'f'#148#146'xl'#171'.}'#140#193#159'i'#201'oc'#251#169'n'#226#1#240
+ +'+'''#204#151'K'#190'>'#171#244'3'#241#250#211#177'\B'#127#201't'#162#6#247
+ +#191#175#18#228#246'''s'#157#21#232#128#127#163'1'#184#189#217#28'>'#210#138
+ +'F'#150';'#146#31'*={'#252#149#238#237#7#240#223#151'p'#223'cH'#254#197'b1'
+ +#186'v'#237#26#156#131''''#234#244#171#142#179#240#236'Z'#18#232't:1'#177'b'
+ +#157'.T'#27#149#131#232'$'#4#2'0$ '#173#198'A'#2#205'L'#133#237#219#253#181
+ +'7gY'#220#214'}'#0#196#174#143't)qk'#243#150'j'#172'^'#215#146#222#1#189#217
+ +'f-'#160#166#147#139'8Dh'#219#142#7#133's0'#240#10#141#192'I rs'#137#205'f~'
+ +#224'''='#225#10'?'#211#173'>'#175']'#130#142#248'h='#245#250','#191#178#185
+ +#211#151#223#5#191#246#238#235#248#190'J'#181#202#175#4#176#156#155#159':'
+ +#246#254'\'#131'?'#183'j'#191'd'#242#17#25'$'#147#161#234#223#255#158'Ji]H~'
+ +#157#225#167#210','#191#220#217#255#201'j<'#217#21#193'o'#193#175#138#190'~'
+ +#166#190#255#1#164#191#132#254#30#163#190#159#198#168#209'h'#204#143';'#207
+ +#255'9'#222#165#227'?'#15'S:'#140#162#161#241'x'#140#134#162#29#169#25#184'd'
+ +'4'#1#165#251#7#160#177'H'#143#174'X'#147#16#218#188#211'_'#251#216'8'#173
+ +#173'x2'#239#160#206#254#211#18#191#190'rU'#181#214'oiM'#192#250#1'B'#157',$'
+ +'d'#224'I%'#161#138#138#190#2#166#152'Hq'#132#192#244#23#240#203#145#2#167
+ +#243'P.'#161#195#234#21#245#202#127#158'q'#228'O'#220'='#179#195'{'#234#129
+ +#167#255#238'|'#201#207#21#144#27#129#175#14#11#237'9'#133'<*-b'#251#197#162
+ +#129#207#210#127#190#144'p'#223'B'#180#129#5#255'o>'#216'a'#155'?'#157#142'u'
+ +''''#31'Z'#148#128#223'#'#241#127#181#187#247#163'n8'#27','#3#191#210#225'>'
+ +#128#31'-'#188#31#144'&'#203#14'?'#228#248'#'#220'G'#175#27#161#200'G'#157
+ +#146#211#239#131#222#157'c='#23#248#3'~'#252#227#31#251'h%F'#154'@'#195#228#8
+ +'`V!'#164#12#131#8'h'#141#164'!4'#26#237#210'Uk'#17#240#234#247#6'k'#175#15
+ +#23#245#13'c'#14'0'#17'DP'#241#145':'#220'Sm2'#9'PG'#224'K?'#193#2#252#142'6'
+ +#192#254#0'c'#14#232'm'#155'8Ti9f'#195#134#158#201'(tr'#207#171#253#7#204#173
+ +'=KW'#250','#143#202#245#202#157#166#156'%'#208#27#162#200#164'eW'#150#29'H'
+ +#231'Ui'#1'z'#227#237'O%'#212#151#207#231#142#195'O|'#0'D'#2#147#221#219'j'
+ +#178#253#158#222'w$?>'#223#167#15#184#222#219'{'#167#21#204#199'K'#192'ob'
+ +#253'h'#234#137'4_+'#249#233#153'}L'#160#223#165#231#23'5'#0' '#137'3'#1'~'
+ +#231'2'#159#153#193'$'#240#189#239'}/@x'#16'$@Z@W'#26#137#184#154#0'"'#3#235
+ +'('#28#162#27#129#18#227#248#254#160'wko'#222#188#234'['#245']k'#2#200#26#244
+ +#227#26#153#4#31'Q'#181#206#166#150#248#174#244#23#223#128#206#17'0'#249#2
+ +#129#205#30'TN'#6#161#237'@'#236#251#5#1'8m'#201#221#26#3#235#164#170#22#27
+ +#157#181'+~F'#134'Wr'#228#185#155#249#1#240'k'''#159'H'#251#180#144#250#165
+ +'t^'#168#251#137#238#215#175#9'@<'#254#226#237'7'#26#0#19#0#166#233#154'N'
+ +#213#136#164#254'|'#180#171#227#251'IR'#2#127#160#146#217'K'#221#221#31#214
+ +#131#197'T'#192'o'#28'~F'#242's'#129#15'r'#252#209#220#3#146#31#26#0#212#254
+ +'('#138'v'#7#131#193#136#180#218#19'M'#243'='#210'u?'#237#19'XvN&<'#184#181
+ +#181#21#211'Ek'#208#5'4$'#128'lA'#180#24#135')'#192'$@'#251']'#248#4#232'X'
+ +#237#209#168#243#210#246#180'}SO8bH@2'#0#137#8#234#189#171#170#185#241'*'#131
+ +#222's'#181#129'H'#147#129'''-'#199#149'q'#14'F'#21'm'#192'u'#16#154'z'#2'&'
+ +#3'eg)'#202#29'2p'#181#255#220'!'#133#15'f'#26#188'(C'#210'u\'#137#159#23#181
+ +#249#202'sT}'#199#201'W'#168#249'"'#245#197#214#231'2'#222#180'p'#242'1'#232
+ +#165#148#215'z'#252#141#234'/'#170'>'#219#254#201'B-'#250#187'j'#184#245#14
+ +#29#27#219#200#128#174#229#151#137';'#189#249#228#165#238#222#15#185#170#143
+ +#235#8'l'#168#143'S|'#149'd'#249')'#237#224'C'#184#15'R'#255#1#212'~'#178#249
+ +'w'#233#249#29'6'#155#205')i'#183#201'iz'#252#151#141#179#250#4#150'H'#160'A'
+ +'c2'#153#160#145#8#155#3'B'#2' '#3#209#4'T'#151#128#136#190#131#181#253'Yc'
+ +#243#225#168#251'Z'#166#194'PKn'#169'!'#8'C1'#9#186#164#13#188#193#213#132#0
+ +'>'#28#129#158'D'#4#220#16#161#155'9'#168#156'Z'#2#229#18#129#231#23#179#22
+ ,#251#198'I'#232'j'#3'E'#30'a'#238#148#25'z'#213#146#195#3#153'mg'#245#182#188
+ +#223#187#249#4#127#134#233#191#167#156#198#28'|'#188#2'zP'#168#3'~'#211#173
+ +#135'U}'#9#239')'#167'O?'#188#245#249#28#251#11'+'#249's)'#238#201'%'#207'?'
+ +''''#240#143'wn'#171')-'#153'y]*R_f'#238'iG'#147#237#171#173#253#219#129#151
+ +'&:'#151'(3e'#189#240#246'3'#248#149#206#242'CO?'#246#248#195#230'G'#168#15
+ +#224#167'eH'#166#236#20#177#254#179#6'~}'#205#207#238#176#133'C'#4#254#136'.'
+ +'b'#147'L'#130'.H@:'#10']6'#225'A%$'#128#16'!H`'#158#133#237#187#131#222#235
+ +#179#172#214#230'y'#3#140'o'#192#132#10#163#186'j_zM'#197#221#205#2#248'f1'#4
+ +#16'W'#142#7#186#211#144#178#243#19#6'em@'#26#143#148'#'#6#158#149#244#172#29
+ +','#137#30#152#249#11#142'zG'#206#204#147#227#222#168#167#189' ?'#252#128'i'
+ +#197#229'y'#14#248'3'''#150#175#28#27#223'Q'#247'y'#31#182#190#27#222'K'#11
+ +#137#159#27#208''':'#181'7/'#145'@'#194#245#19'#'#146#250#243#225#142'h'#11
+ +':'#188#167#138#30'~'#217#165'F'#255#246'Zc'#244#152'S{%'#212#167'tz/O'#223
+ +'-s'#248'A'#237'7'#137'>'#15#207#19#248#143't'#239'N'#251#252#12#9#244#251
+ +#253#184#213'j5'#232#226#162#197#248#154#132#4#225#16#188#12#173'@i'#18#232
+ +'1'#9'('#175#158#7'~'#252'p'#208#189#185'?o]-'#146'|t'#184#15'&'#129'oL'#130
+ +#245'W'#8#236#177#205#9#240'L'#5'a'#172'5'#6#171#9'p'#10'qPT'#21#210':'#15
+ +#220')'#202#140'V'#224#21'D'#160#138#237'"JP'#172'K%'#200#206'f^9'#236'='#235
+ +#173'z'#158'w'#245#153#31#215#188#152'>'#219'='#149#188#188#145';/'#178#245
+ +#249'n'#18#143#177#243'MG^'#145#250'*u$'#191'c'#235#27'/?'#219#237#12#244'E'
+ +#161#254#207#11'R'#192#255#23#240#242'?'#254'!i'#1#19#177#247'u|'#223'|n'#228
+ +'/&'#215#218'{?i'#132's'#174#229#23'G'#4#236'}'#147#222';'#145'P'#31#171#253
+ +'J'#194'}'#178'F'#169#239#222'y'#0#127#233#254#156#209#193#231'W%'#1'd'#12'"'
+ +'Y'#136'.'#178'!'#1#152#5#151'0'#247#128#210'y'#2'm'#186#212'u'#146#184#241
+ +'p'#222'X{0^'#185#149#145#236#215'@-'#155#4'H!'#6#9#196#157#13#201#7#144#136
+ +#128#1#191')$'#10'+$ '#11#147#138'h'#6#156'N,'#145#130'\'#162#6'V'#27'x'#26
+ +#17'8'#221#137'rG;'#240#202'^'#196''''#220#177#147#184#149#249#225#135'+'#167
+ +'i'#140'{'#175#244'6'#167'<'#23#0'WO'#0'~^'#150#248#202#22#239'8N>c'#239#187
+ +'v'#191#149#252#139#18#240'Y'#19#152'N'#213'd'#251#167'j6'#220'b'#130'@'#179
+ +#15'+'#241'3=__'''#154'<'#190#210#234#223'!'#149'?'#205'm'#147'@]'#210#235'd'
+ +#248#245#165#178#15#222#254'G'#146#215#255'H4'#129'}8'#252'666'#206'<'#248
+ +#237#253'9'#227#195#146#128#18#159#128#146'2b"'#130#21'h'#2#146'%h'#178#5'9Y'
+ +#136'$r'#155#192#211#160';'#23'''Y'#212#184';'#236#189'6Kk'#29'S'#0'd'#27#140
+ +#8#184#163#214#26#19'APo'#21#17#1#167#138#208's'#251#10'<'#137#8#220#148'b'
+ +#153#194#220#134#14#205#196'%'#165')'#204#202'k7'#132'h'#230'4'#176#135#14
+ +#132#20#143'n:<'#151'q'#152'*o'#156'v'#246#144#145#236#230#127#249#146#216
+ +#189'~'#157#14#227'I'#230#158'!'#2'k'#227'/Q'#247'S'#145#248#2'|'#181#208#149
+ +'|J'#236'w'#215#222'7'#206'?E'#251#147#254'=5'#221#189#173#19#127#210'%*?}'
+ +#209#229#198#224#189#149#198'h'#199#203'MI'#143#14#243')'#1'?'#173#199#180
+ +#223#151#154'~4k'#132#196'GE'#31#182#183'I('#161#145'''{'#251#201'\=s'#14#191
+ +'e'#227'<'#16#128'=OC'#2#251#251#251#17']'#228':]x'#174#29#136#162'h'#157#246
+ +'a'#6'\'#18''''#225#134#212#14'th'#27'}'#4'b'#210#0#162'G'#195#206'K{U'#147
+ +' '#212#201'C'#138#171#11'#U'#235']S'#245#181#27#156'M'#200#14'@'#199#4#0#1
+ +'(''Dh'#136#192#148#24'+'#153#181'X'#249#229#198'#'#182#21'Y%'#179'P'#231#15
+ +'-'''#3#207#209#255#139#222#4#166#151#161'{UN'#136#4#170#143#176#19#182'+m'
+ +#229#5'Y'#149'CxN'#165#158#27#198'3N='''#150'oA'#159#154'm'#0'>#b'#0#160'u'
+ +#17#143'Z'#20#13';'#173#199'?IJ>'#0#132#0#147#209#158#154#236#252'D-&'#131'B'
+ +#213#135#169#128#207'pU'#254#238#238'O'#234'^2'#245't'#229'@'#213#211'?'#147
+ +#22#222#168#234#219'q'#193#15'O'#127#24#134#232#235#223'_,'#22#227#25#141#243
+ +#2'~'#140#243'B'#0#246'\'#221'<'#1'8'#252#232#194#183#232'p'#143'.'#254#186
+ +'8'#7'A'#4#156','#132'V'#227'$'#129';$u'#27#180'_#'#240'E'#131'i}'#237#193
+ +#164#247'j'#150#235#249#7#180#147'0`'#21#222#244#16#132'Y'#208'X{'#133#139
+ +#138#188#208#137#6#200#220#3#134#8'4q'#4#162#29#136'&`{'#13'8]'#137#131#138
+ +#163'P'#8#161'hF"'#19#152#28'H76'#161#195#162','#185#240#15'T='#3'G'#200'1'
+ +#248#160'%'#203'y^yi'#25#240'z'#229'4'#218'TE|'#159'%'#189#153'l'#195#190#230
+ +#160#154#207#246'~'#154#149#218'r+'#150#250#153#6#173#0'_'#137'='#175#164#131
+ +#143'2'#4#144'h'#239#127':''u'#127#231']5'#239'?'#210#173#186'L'#26'p'#146#10
+ +#209'h'#149#31#149'|'#151'['#253#187'P'#249'9'#188#143#254'}'#160'!m'#239#219
+ +#24#191#1#191#210'e'#189#15'e'#198#222#199'R'#207'? '#1'4>K'#25'~G'#29#231
+ +#137#0#236'9'#155#180'a'#218#142#26#141'F'#13#17#2#164#7#27#231#160'8'#5'/'
+ +#217#218#1#29'&'#132's'#176#6#147' Sa'#252'h'#220'~'#169'?onz@'#166#137#20
+ +#216'f!Z'#226#195',h'#192', B'#176'R'#223#1#188'Bd '#22'B'#16'M@9'#25#132#214
+ +'I'#24'>A+8'#204'GP'#154#242#188#186'v:'#26'['#13#193#161#130#165#190#130'CB'
+ +#143'O'#200#187#183#160'.%'#224#23#26'H.'#234'})Q'#199'%'#0#215#147'/'#158'}'
+ ,#163#226#219'p'#158'q'#240'Y'#208#167'b'#231';'#158'}l'#11#192#181#202#175
+ +#215':'#175#223'8'#2'%vO'#235#217#222'}5'#222#131#186'?'#211#199#229'3y'#157
+ +#167'"'#245#147#201#149#230#254#237'f<'#27'z'#26#247'8'#15#146#250'%{'#223'&'
+ +#248#208#178'C'#210#254'1'#9#153'G'#210#213'g'#155#128#191'K'#160#31#160#149
+ +#23#13#152#8#231#10#252'K'#158#138's3,'#9#208#197#15'k4'#200#12'h"B'#16#4#193
+ +#170#227#23#128'F'#0#18'X'#5'A B &A'#148#19#196''''#139#176#253'p'#178#242
+ +#202','#141'ZE'#235#240#162'('#200#147'9'#10'k'#221'+'#170#182'rM'#5'h'#162
+ +#17#154'y'#8#3#199#28'pM'#3#9#17#134'RK`'#10#140'l'#14'A Z'#129#201'$t'#218
+ +#146'U'#137#160'j*'#148#202#146'+'#21#137#21'G'#162';'#242''''#146'A'#165#216
+ +'f'#217'c'#235'Jw'#222#168#172'e;7'#137'<'#153#27#190'3'#137'<'#142#164'wc'
+ +#249#2'|'#29#203'/'#192#175#137#192#9#241#217't^'#13'r'#237#3'H'#10''' -'#139
+ +#225#14#219#249#9#171#251#186'I'#167#146'L>'#179#246#232#207'j}t'#127#189'1x'
+ +#228#177#180#207'3'#147#214#171'$'#190'O'#203'\j'#249#135#226#233#135's'#15
+ +#210#30#249#252'['#178#191'O'#207#220#160#223#239'O'#187#221#238#156#8' =o'
+ +#224#175'>'#9#231'm'#148'J'#137'I'#19#136'%u'#152#157#131't'#140#181#1#144#0
+ +#250#11#210'z'#141#253#2#202'k#}'#152#182'czDc rw'#218#186#180'=m_'#207'H'
+ +#164#235#226#31#237'$'#132'fP'#168#249#145#170#181'/'#169#6#17#129#31'7'#180
+ +#244'7j'#191'k'#14#24#127'@'#224#164#17#187#166#129#201'!p'#29#133#198'<'#176
+ +#4#224'W'#18#139#180'G'#192#246'.'#180'='#11#141'iP'#152#3'n'#194'Q'#217';'
+ +#239#29'XU"s'#202'Az'#217#181#144#187#161'='#137#215#231'y'#197#214#151'B'#29
+ +#163#226'gy'#145#167'oSu'#139')'#183'\'#201'_H'#253#20'M5'#197'VO-'#9#184'a'
+ +#190#220#170#251#198'!H'#18#127#184#173#166'{wU:'#27#22'f'#129#11'~'#241')'
+ +#180#162#217'.I'#253';'#152#156#211'C/`}n'#172#242'+'#221#187#207#228#244#143
+ +#140#167#159#182#183#197#219#191'Ej'#254'6'#9#24'h'#2'}'#147#215#239#244#241
+ +'3'#192'?7'#224'w'#30#135's;,'#9#16#1#4#8#19#18#27#195'9'#216#154#205'f=h'#3
+ +#244#127#244#26'D'#171'1h'#2#240#11#160'r'#144#211#135#17'% '#192'D'#244#17
+ +'A'#146#249#241#163'I'#247#230'`'#214'X'#247'l'#241'O'#1'^?0 '#142#184#166#0
+ +#206'B'#244#211'3'#166#0#167#13'['#208#23#161'A'#27'!'#136#180#244#207#131
+ +#224'@wb'#235'#p*'#15#11'"P:'#164'h'#211#139#165']'#153'*L'#4#151#24#150'^"'
+ +#175'r'#197#170#26#192'!'#14#190#18#15#184#245#246#216#204#242#146#189'o5'#0
+ +'7W'#223#128#221'z'#244#141#202'/'#246'~'#166#167#219'V'#226#228#179#128#183
+ +#29'{'#202#224#183#197'='#236#253'_'#168#217'`K'#205#246#239#17#240#199#146
+ +#16#148'X'#147#1#251'J:'#246'D^2'#187#212#26#220'n'#215#166'}'#248#28'<'#143
+ +'U~V'#252#233#146#177#163'Oz'#247'Me'#178'Nk'#239'C'#237#151#153'{9'#190#15
+ +#149#159#20#206'1b'#252#245'z'#29#164'a'#234#249#237'U:O'#227#188#19#128#249
+ +#13'H'#24#194#154'#'#4'p'#14#18#1'4E'#27'X5'#190#1'!'#1'6'#9'h'#191#7#191#0
+ +'m'#195'A'#8'm'#128#222#231#251#163'$'#238'>'#28'uo.'#178#168#233#154#5#202
+ +'I+V'#226''''#136#219#27#170#222#187#174#130'F'#235#160#212'7'#170#191'C'#4
+ +#134'L'#148'K'#2#2'z'#229'U'#157#133#14')x'#166#10'Q9~'#130'J7cq$'#30#152#241
+ +#232#176#154#3'[m'#231#188#196'm'#180'a6'#189'B+'#240#158#2'zW'#213#247'*'
+ +#222'|'#29#215#207#172'Df'#7'`R'#168#251#158#1'}'#226'H~'#163#13'd'#134#8'2'
+ +#142#223#207#6#143#24#248#217'bb'#237'~'#227#216#203'\u'#159#132#252'J}'#252
+ +'p'#179'9x'#224#209#142#199#165#130#224#29#218'f%'#198':'#250'f'#210#187#207
+ +'t'#238#133#167#223#130#31#19'v'#160#137#7#254#143#254'}'#163#209'h^'#241#244
+ +'+u'#14#193#127#200#147'q.'#135#141#16#160#156#248#214#173'['#225#214#214'V'
+ +#141#14#213#137#173#17'*'#236#145#250#134'b'#162'u''u'#24#251#200'#hC'#27#160
+ +#237#26#251#6''#204'r'#143#204#130#246#229#221'Y'#243'J'#154#135#145'1'#11
+ +#236':'#8#172#175#0'N'#191#184#181#166#234'+D'#4#245'N'#17#1'p{'#10#28#0#190
+ +#16#131#235#24'tk'#11'l'#152'R'#230'3t'#29#134'Nv!k'#7'jIU'#162'\'#17#175#148
+ +'\T'#190#213#182#143'A'#245'B'#26#233'_r'#240')I'#218#145'}3}'#182#19#194#179
+ +#224#183#251#6#240'N"O'#213#203'/'#241'}'#227#236'c'#144#27#147'@r'#251#141
+ +'6'#144'%s'#246#232'O'#25#248'3'#171#254'g'#198#163#239'F'#17'h'#187'I'#234
+ +#254#229'F'#255'^'#28#192'3O'#146#158#5'>'#199#245'3'#201#231#183'R'#159#22
+ +#19#226'c'#149#31#160#199#2#149'_'#8#1#29'|'#198#244#182')'#217#253' '#140
+ +#132#180#206#236'<'#132#249#142#4#156#23'h'#176's'#240#219#223#254'6'#251#5
+ +#232#166'E'#4#234':'#28#132'259'#155#4'XD'#27'0$'#208#165#183#146'>'#175#26#4
+ +#167#24'f'#1#129'='#160#199'%'#220#157#183'6'#247'&'#173#203#137#10#226#3'D'
+ +#224#23#246'>4'#130#176#209'!'#173'`'#147#8'a]'#249'a,m'#198#140#3#240'0'#167
+ +#224'!'#5'F'#146'3'#224#149'|'#3#166#23'A1'#169#137'%'#2#153#224#196'LuV'#10
+ +#18#10'7'#148#156#132#14#3'xF'#210'Wd'#153#145#246#7#28'{N'#252#222#149#252
+ +#182'B'#207#237#200'c'#192'/'#132#160'\'#167#159#149#242#142#211#207#233#224
+ +#131#255'-'#166#251'j1'#220#162'e'#155'I w'#205#128','#147#150'_'#236#220#195
+ +'~'#222#138'g'#187#27#141#193#131'Z'#184#152#150#212'}'#199#214#151#182']'
+ +#166'c/l'#249'}i'#226#193#158'~Z?Fl'#159#164#252'>='''#3'2/'#199#244','#205
+ ,'{'#189#30#192#127'n'#237#253#165#128'9'#237#19'8'#166#223'T2'#9'h N'#211'di'
+ +'O'#128#167#155'j'#137'@'#204#3#236#19#9#168#14#1#174'A'#251'u:'#30#25#179
+ +#128'@'#21#236#205'Z'#27#187#227#230#229#133#10#235#218'F'#247#203#211#141#17
+ +#1'('#223#183'ZA'#173#177#170'""'#131#176#185#162#163#4#230#181#142'3'#208'H'
+ +'~'#255'0-'#192#152#8'&'#147#208#248#7#248#23'V2'#12#221#28#130#220#137#12#8
+ +#27#152#196#220#131#209#130'Jz'#174#167#172'j/'#255'V'#226#245'+Iyc'#227#27
+ +'{'#223'4'#227#176'Z'#128#1#186#172#165#192#166't'#220'M'#237'u'#215'('#203
+ +#157#13#31'3'#240'S'#132#242'2'']W'#166#220#206'e'#209#192'O'#243'vm'#182#189
+ +#217#24'>'#140'|H|'#28#23#191'>'#171#251#220'%'#208#205#232#227#240#30#242
+ +#249'i'#189'/'#237#187#182#205'"'#206'?'#28#199'k'#166'F'#229''''#205'2;'#207
+ +#246#254'a`y'#17'G'#201'$@'#168#176#213'j'#197#2'lT'#12'v'#197#25#184'J'#140
+ +#143#232#0#22#248#5'D'#27'P-!'#2#152#5'a'#206'd'#128#174#225#190#191'7k'#174
+ +#237#142'[W'#230'y'#216#176#206':'#3'|'#207'H'#242#162#2#17#154'@'#212#222' '
+ +#173'`C'#5#141#142#227#252#11#184#231#160#231'8'#2#139#168'@u'#10'3'#207#2
+ +#222'F'#5#2#209#4'\'#237#192#151#144#161#149#252'U'#7'`%'#159#192#12#183#149
+ +'6'#239'+'#235#28#176#213'zF'#229'O'#171#234'~&fA'#230'T'#234#21#206'?~'#189
+ +#209#0'*a'#191#18#9','#230'j6'#218'f'#208''''#211'A'#161'!'#152'L@'#199'l0}'
+ +#0#16#210#235#198#147#199#27#4'|x'#246'M'#190#241#19#212'}k'#235#211#210#151
+ +#238'='#12'~'#186#207#144#254#216#222#15#130#128#19'{h'#153#145#244'_ '#196
+ +#247#162#168#252'K'#129#242#2#15'k'#18' J'#128#178'b'#186#185'54'#25'!R@'#227
+ +'Q'#152#5'+ '#1#133'Y'#137'5'#9'@'#27#232#209#210#17#179#160#238'{~Lk'#16'A'
+ +#8'"'#240#9'}'#251#179#250#234#206#164'ue'#150'!'#135#192#128#177#144#218#5
+ +#176#3'K'#10'a'#212'Tq'#7'Z'#193#154#10'j'#141'2'#184#157#210'bo'#9'!'#184#9
+ +'C'#133#25#224#21'~'#2'''R`o'#173'u'#11'H'#180#192'M$'#146'W'#185'~'#128#210
+ +#172#185#178'*'#194'}'#174#244#207#156#233#180#225#240#203'd'#178#205#138#183
+ +#191'*'#245#179#188#18#1'H'#212'b'#178#175#230'P'#241#199#187#156#216#147';6'
+ +#189#251'~K '#244'}>1B'#183'6f'#224#7#200#15'6'#192#231#138#221'2'#240#149#6
+ +'?'#128#143'N'#189'#'#201#229#223#23#240#195#185#135#25'y'#25#248#240#240'+M'
+ +#14#211'N'#167'3G'#3#143'7'#223'|'#243#133'R'#249#15#0#228#180'O'#224#132'~#'
+ +#155#4#208#6'h;Z]]'#141#160#13#200#140'D0'#11'z'#162#17#172#233#244'aM'#4#180
+ +'&'#18'Pm'#186#235#220'l'#4'&'#129'o'#136' '#131'F'#224'y'#195#164#209#219
+ +#153'4/O'#211'Z'#7#200#180#192'tH'#160'4'#231#128#152#0#232'I'#16#212'z*jt'
+ +#201#168#232#210'~'#173#210'[`I'#231'!G'#213'/'#171#254'x'#173#18#159#128#241
+ +#234'{'#182#152#168#8#4'x'#149#181'*7'#222'PE'#218#190#178#13'8'#157#146#221
+ +#204#13#241#21#234#190'w'#192#23'P'#201#233'7'#145#0#2'v2'#27#170#20'v'#253
+ +#164'O'#219#131'"'#219#207'x'#239#197#137#231#153#254'~v;'#231'p^'#167'6'#217
+ +'^'#175#143#182'|'#143'sy'#213'2'#224';'#237#185#173#147'O'#233#9':'#160#214
+ +#239#25#240#3#248'$'#12#246#200#222#135#3#16'z'#254#132'l'#253#217#139#230
+ +#232'{'#26'8>,'#227#128'6P'#171#213'bz^0G'#22#166'*G'#159#129#30#28#133#240
+ +#17#28#212#6'T'#211#152#5#4#180#18#17'(.'#25#11#163#253'yc}0k'#172#205#210
+ +#168'Y'#0#180#172#198#27#245'>'#247#202#196#0'B'#8#27'+*'#170'wT'#0'B'#128#19
+ +#209'!'#0#27#14#148#162#162'jc'#210#146#9#224'4"'#177'w'#185#218#140'D'#194
+ +'~n'#233'n)'#12#232'j'#2#198#9#232#168#251'n'#184'/'#207'+I?yA'#0'H'#206'I'
+ +#166'}'#150#244#201'tH'#255'J'#10''' '#155#20'i)4'#200'Q'#0'K&'#184#184'Y'
+ +#138#4#158#149#218'x'#167#25#209#135'i'#204#231#154#160#24#248#0'<'#235#252
+ +'b'#231'/*'#234#254'H'#226#250#198#214'G'#136'oW'#188#251'}'#186#215'C'#168
+ +#251#176#245'www'#23'd'#231'sl'#255#19#159#248'D'#254#162#131#223'yB>4'#163
+ +#164#13#192'7'#176#178#178#18#17#25#208'f'#204'}'#6'h'#1#216#225'(\1'#218#128
+ +#210#26#2#250#18'"'#164'h'#136#0'Y'#132'1a.'#160'g=dg!'#20'r'#210#11#166'i'
+ +#220#216#155'5'#215'G'#179#218'Z'#162#130#200'S'#5#25#20#146#220#169#7#240
+ +#141#243#207#28#15#148#31'7Y;'#8#226#22'}B'#131#9#130#29#141#202'5'#3#156#181
+ +#141#18#136#170#159#171#194'$'#200#171#209#1'U'#16#130#155#244#227'6'#222'4'
+ +#7#149#201#4#212'$'#192' u'#18'}'#12#232#177'dp'#188#211#146'/'#198'l'#199'c'
+ +#201#200'4/'#1#190#186'm'#181#137#204#250#20'`'#195'7'#195'y'#191'S'#159#236
+ +'t'#163#233#158#199'I'#5'b'#143#232#188#131'Ll|l'#1#244#236#224's'#128#143
+ +#134#29'#'#153#153#135#195'{'#198#222'7'#14'>'#216#249't'#175#199't'#159#167
+ +'('#224'[b'#235';W'#224#197#29#31'6'#2#176#191#217'h'#3#155#155#155#254't:'
+ +#13'1S1'#252#3'0'#11#232#223'-'#178#7#225#12'D6'#225#138'8'#7'W'#196'y'#168
+ +#157#132#158#215#164#199#177'A'#159'V;@'#4#30#224#166'Q:'#152#215#187#253'Yc'
+ +'}'#148#196'+'#185#22#233'V'#133'7)'#191'E'#135#225#162#243#176'K'#8#185#152
+ +#0#164'x'#16#25#212#153#28#130#176#206')'#201'>'#214'd>'#148#10#139'J'#191
+ +#244'`'#219#242'"G'#160#236#237#247'Jf@^$'#7#25'3'#1#248'K'#209'H'#19'@'#159
+ +'p'#197']'#150#152#245#212#206#198#163#242#195#0#15#252'f%'#147#1#239'1'#251
+ +#181'`1&'#21#127#167'GK'#232#193'!'#160'L'#237'0'#147'B'#154'iu'#223#177#241
+ ,#171#18#223#216#249#3#1'?'#146'w'#0'~^'#144#194'K'#210#30#197';'#172#238'w'
+ +#187#221#217#214#214'V'#226'x'#248'_X['#255#176#241'a$'#128#210'o_f'#22#208
+ +#225#26#217#130#28'6$'#2#128'F'#208's'#23#209#6#208'k'#160'm'#136#128#128#140
+ +'(CL'#251#16#211'Rc'#204#157#238'|'#180'*O'#9#206#251#179#198#234'h^'#235'M'
+ +#211#168#157#230#162#25#24#199#158'r'#10#131'J'#132'`'#156#127#190'>ig'#187
+ +#152#199#16']'#144#27'*'#8'"q:'#134'tX"'#17#158#164'"'#243#233#232#181'/Z'
+ +#134#150#190#137#216#218'R)'#151'9'#139's'#28#146#28#18#158'_'#207#225'7'#7
+ +#196#182#196#183#240#1#184#0'W'#165#130' 1#8T'#167#242#154#191#24#213#163#249
+ +#176'G*>Zn'#23#17#8#145#246'8'#3#2'>x'#18#206'}''o'#223#134#244#164'K'#207
+ +#184#2'|'#187#208'=d'#224'#'#172#135'L>"'#2#246#238'#'#149#151#8' '#251#176
+ +'I}w|'#152#9#192#140#3'f'#1'B'#127#244'p'#196#198'QH'#255'o'#9#216#187#244' '
+ +#245#184#150#128#136'@4'#2'v'#20'*'#204'T'#164#188':4'#2')4'#10#173'V'#224'#'
+ +#29'E'#251#10#176#13#208#18#9#212#137#12#186#147'E'#220#157'$q'#139#224#16#26
+ +'S'#161#232''''#232';'#205'D+'#246#190#152#2#150','#148#155'*l~'#150#252'@.'
+ +#30':$$'#232#216#255#182'EW'#169'1'#191#201#250'S'#165'\'#0'['#221#167#138
+ +#148'`'#6'u'#166'T'#158'/'#7'<'#214#181' '#25#215#131#249#176#25#207#251#237
+ +'h6'#242#149'8'#243'<61'#140'moA'#175't'#202'.'#24#133#213'|Y'#230#198#179'o'
+ +'T}'#19#211#151#5#158#254'>'#128'OD>'#140#162'h'#12#137'O'#199#167't'#127#23
+ +'t<'#249'0'#170#251#203#198#5#1#20#195's'#205#130';w'#238#4#198'?'#128'9'#7
+ +#232'!B'#205'@'#203#241#19#244'$'#140#200'k'#248#7#20'"'#6'9W'#26#214#161#209
+ +#18#216#17'm@BQ'#24#248#30#200' '#160'c>'#180'^F'#165'/'#229'<'#244'wL$@'#132
+ +#208#153'.'#162#206'4'#141#219#153#14#8#138#237'^T'#4#22'e'#194#170#168#10'T'
+ +#254'R'#240#219#191'U'#207#127#241#207'J'#246'_'#197#7'`Gn'#205#0#3'z'#183
+ +#145'g'#225'G(^g'#0#31#251#201#164#22#206#135#173'h>h'#147#164#15#252'4)^c'
+ +#153#197#128'^Y'#21#255#160#180'/'#169#250#144#248'p'#224')'#1#187#164#242
+ +#150#164#189#1'~'#171#213#154#141'F#'#246#236#147#169#151'~X'#213#253'e'#227
+ +#130#0#202#227#128#127#192#16#1'=H'#28':'#164#127's2'#17#173'['#244#0#162#216
+ +#168'+'#26#129#171#13#176#143#0#175#229#228'#'#223#135'Ya'#200' 8@'#6#128#174
+ +#158'`'#132'a'#142'|<"'#132#246'x'#17#183#146'4'#168#207#179#176#190'H'#131
+ +'Z'#170#160#219'k'#251#221'8'#245#140'K'#191'T'#13#184'$'#239#223#141#8#228
+ +#203'~t5'#20'h'#134'['#251#239#185#210#221#253#191#6'n'#228#167#211#208#207
+ +'fQ'#144#204#234#225'bL'#18'~'#16'.'#3#188#233#18'"'#182'C'#174#127#145#168
+ +#248'E'#214#30'-'#11'g'#218'-'#171#234'+'#157#190#203#224#167'{'#224#18#192
+ +#144'#'#179'I'#194#210#254#2#248'O'#31#23#4#176'|,%'#2'Z'#135#244'@'#177'F'#0
+ +'`'#211#186'I*f'#139#236'J'#214#10#132#16#12#9'X"@'#19#18#218#6'y'#212'@'#6
+ +' '#2#218#14#133#12'|'#218#151#194#2#206#177#169#16#130#178#128'N'#179' '#154
+ +'fQm'#158#16')'#164'!'#19'C'#146#250#181'E'#22#214'r'#195#2'y'#17#247#207#221
+ +#219#235#29#248'y2'#242#165#155#252#170'R'#11'0'#253'7'#240#178'E'#236#167
+ +#179#200'O'#166'Q'#152#206#226' '#153#214'BZ'#252'd^'#10#31#28#4#188#212#222
+ +#235#20']Ro'#178#220#168#19#185'JM'''#30'U'#150#246'('#207#157'J?>'#11'|'#168
+ +#251't'#157#135#0#191#0#30'j>&'#221#132'I0E'#6#159#249#172'%'#192'_'#242'K?'
+ +#188#227#130#0#158'<'#150#18#1'|'#4#237'6'#201#183#217#140';'#20#19#1#160#203
+ +#144#169'5h'#201#186'm'#246#141#198#0#243'@i'#13#2#4#2'2`"'#144#133#181#2'!'
+ +#4#175'B'#8#162#229#235'F'#0'E*'#191#201#243#247#2'"'#129'('#205#252' '#205
+ +#149#159#229'~'#0#19'"'#203#184#160')'#160#181#143#207'&'#158#241#233'8'#142
+ +#249'x'#15' '#233'{y'#202#139#162'Wy'#10#219#153'g'#142'y'#244#137'~'#158#6#4
+ +'N'#218'N#?K0C'#14#127#181#237#249#167#247#204'1}Z'#185#20#11'j'#213#222#145
+ +#240#12'B'#237#197#183'q{+'#237'Mi'#174#210#192#159'HW'#158#145'*'#128#15#169
+ +#143#184'='#239#147#186#143#10#189'1'#173'!'#241#209#140'snl'#252'G'#143#30
+ +'e'#23#192#127#250#184' '#128#163#13'K'#4#223#253#238'w=4%'#5#25#208#161#144
+ +#164'N'#212'l6'#1'd'#214#10#232#129'lxz'#174'B'#180'('#3#240#153#4'h'#223#144
+ +'C'#211#209#10'jB'#6#136#30'DJG'#16't'#20'A'#19#2#242#10#8#139#220#2'Dr'#130
+ +#217'y^'#164#249#225#143#239#219'm'#140#220'sN'#250#224#207#240#14#252'#?'
+ +#176#225#202#240#138#242' '#249#0'z;/'#210#133'9'#25#152#147'!3'#237'P'#212
+ +#21'x'#158#199#217#3'.'#224#233'X"'#221'vy'#150#29#167'@'#7#224#7#152'a'#223
+ +#143' '#229#165' '#135#215't|'#4#208'C'#210#3#244#240#230'c!'#2'^'#192#171'O'
+ +#199#211#11#224'?'#219#184' '#128'g'#27'%"@'#212#224#210#165'K>I'#164#144#30
+ +'D&'#3#180''''#4#168#145'a'#8'2'#192#2'2P'#152#202#220'Y'#132#8#140'i'#192
+ +#230#1'k'#5#30';'#14']B`2'#160'c'#1'b'#8#162#29'0'#17#152#22' '#24'y'#145#223
+ +#167'r'#183#11'`'#165#17#192#129'y'#9#151#254'J'#227#225'We'#253'_)'#227#164
+ +#211'h'#215'L$'#130']'#25#231#157#150#242#136#238#231'6Vo='#248#6#240'R'#142
+ +'k'#194'x'#0#255'd'#137#212#231'E'#18'vX'#189#23#21#127#14#208'c'#166']'#196
+ +#241'WVV2x'#245#137#148#243#11#224'?'#219#184' '#128#247'7l^-'#194#135#244#16
+ +'z'#198'<'#160#135#18#128'E'#143'B6'#17#224'/'#160'}'#16'B'#131#164#22#8#129
+ ,'5'#0#172'}'#157'Q'#216#144'F'#165'L'#4'R'#177#200#239#177'D'#160#29#136#161
+ +#199'A}'#144#129'v '#210#182#246#31'(]'#151' '#219#170#152'}'#132#165's'#209
+ +'4'#200#156#244'!, '#160'Vy^v'#3'j'#183#164'W'#184#253#10'U>7'#157't'#217#129
+ +''''#222'{'#165#165#188#5#190'S'#127#207'^|'#165#165'=/p'#236#161#209#6#253
+ +'~'#168#243#19#172'%'#166'?!'#160'c'#31#196'0C=>'#169#247' '#142#132#142'!y'
+ +#7#128#207#156'8'#190#156#253#5#232#159'e\'#16#192#7#27#150#8#240#0#186'Z'#1
+ +'I'#168'`gg'#7'R;'#132#137#0#243#20'd'#0'p'#139#218'_'#23#240'#'#215#192#128
+ +#159'5'#2'G30D`4'#3#215'g`'#9'Ai'#13#1'$'#16'pI?'#231#28's'#242#156'''`'#247
+ +#12#17'('#19';8D'#19'p'#192#207#0'/'#8'AK~'#165'{'#230#27#213'>'#173#0#222
+ +#196#233#141#138'o'#156'y'#0#191#241#228'O'#5#220'v'#27#199#1'~'#243#127#168
+ +#245'x}'#20'Es'#0#31#210#30#234'='#17'jz'#227#198#141#20#160#135#180'w'#242
+ +#245#249'|O'#251'a8'#143#227#130#0#158#223'8'#160#21#12#6#3#175#211#233#4#180
+ +#248#244#0#179#153#0'I'#14'S'#129#30#234#152#30'n'#164#31'C'#202#215#232'X'
+ +#141#142#25'S'#192#152#5#150#4#232#189#186'eY'#161#21#132'UBP'#154#20'x'#246
+ +'$!'#4#156#147'/'#224#247'DK'#176#219#149#243#182#170#188'2'#210#221#181#225
+ +'s''>/'#210']z'#234#25#208'/'#28#208'W'#213'|+'#245'E'#221#231#181#144#194#12
+ +'*=IwH'#249#5'@O@_'#200'g&'#0'=T|c'#219#11#232#205'y'#186#235#139#241'>'#198
+ +#5#1#28#207'Xj"'#208#218#7#25'@3'#160#7#157'M'#5','#4'nL'#127#142#233#206'"'
+ +#151#16'|'#157'?`4'#6#248#22'P'#189#24#11#17'D'#134#16'@*'#244#186'RD'#1'D@'
+ +#175'E'#196#194#19'2`"'#192#182#28#243#212#146'x`'#201#142'/'#0#159#27#21'_'
+ +#21'j=7'#212#196'B'#223#195#192#167#207#157#211#246#1#2#192'B'#191'k'#230#2
+ +#158#200#14#210#29#239'Y@'#194#131'H'#232'xj$'#189#1'=]'#175#188#162#226#187
+ +#235#139#241#1#199#5#1#28#239#176#215#215'8'#14#141'f'#0'3aoo'#143#9'!@i'#218
+ +'`'#16#192'l'#160#151#134' '#3#172'A'#8' '#7':'#206'k'#128#158'^'#202'k9'#30
+ +#154#227'J'#252#4#202'1'#13#180'I'#192'f'#128'oH'#0#231#148'!.X'#144'@q'#178
+ +#5#208'sQ'#237'-'#240#177#166#247'X'#201#175#196#161''''#4#176'0'#251#134#0
+ +'d!<'''#6#228#144#236#176#223#23'Fk'#0#224#137#3#210#181#181#181#148'~?'#212
+ +#250#140'L'#168#28#160#191'p'#232#157#204#184' '#128#147#27#165'D\'#233'Y'
+ +#168'@'#8#208#12'n'#222#188#233'-#'#4#12#2'M '#160#14#5#212'au'#219#172#149
+ +'&'#14#214#0'0'#0'v'#1'k6'#155#217't:'#205#232#156#243'e'#18'~'#9#224#171#219#23#227#152
+ +#199#5#1#156#141'Q'#186#15#198'\'#192#182'1'#25#8'H'#30'H'#129'H'#192'#py'
+ +#134#24#8#148#30#200#129#128#232#25'r'#160'}'#143'@j'#23':'#206#128#199'6>'
+ +#19#219#4'V'#187#141#181#207#253'L'#148'"'#0#27#192#243'>}/o'#155#133#190'?'
+ +#7#208#137'Dr'#128#156#190'+'#235#247#251'9'#129#222#2#29#146#189#221'n'#231
+ +#6#236#248#156#11#192#159#205'qA'#0'gsT'#239#139''''#192'Q.1`'#13'r'#184'u'
+ +#235#150'7'#28#14'-9'#224'8'#8#2'k'#179'O'#192#230'5'#8#3#235#245#245'u'#187
+ +'m'#6#128#140'5Iy'#11'J'#2';o'#3#220'X?~'#252'8'#199'6@'#142#253'e@'#199#250
+ +#16#176'/'#219#191#24#167'8.'#8#224'|'#141'e'#247#235#0'9`'#24#130'0'#3'D'
+ +#177#236#3#161'Y`]'#175#215#15#0#211#128#218#29#6#224#24#0'9'#214#135#0#253
+ +#176'c'#23#227#12#141#11#2'x1'#198#179#220#199#163#190#246#168#224#189#0#249
+ +'9'#30#23#4'p1.'#198#135'x'#252#127'p'#251'ut'#3#215#244'"'#0#0#0#0'IEND'#174
+ +'B`'#130'('#0#0#0#128#0#0#0#0#1#0#0#1#0' '#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#1#0#0#0#1#0#0#0#1#0#0#0#1#0#0#0#1#0#0#0#1#0#0#0#1#0#0
+ +#0#1#0#0#0#1#0#0#0#1#0#0#0#1#0#0#0#1#0#0#0#1#0#0#0#1#0#0#0#1#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#1#0#0#0#1#0#0#0#2#128#128#128#2'UUU'#3'@@@'#4'333'#5'III'#7'@@@'#8
+ +'999'#9'999'#9'MMM'#10'FFF'#11'FFF'#11'FFF'#11'MMM'#10'999'#9'@@@'#8'@@@'#8
+ +'UUU'#6'333'#5'UUU'#3#128#128#128#2#0#0#0#2#0#0#0#1#0#0#0#1#0#0#0#1#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#1#0#0#0#1#128#128#128#2'UUU'#3'UUU'#6'@@@'#8'FFF'#11'III'#14'<<'
+ +'<'#17'III'#21'EEE'#26'DDD'#30'DDD"EEE%AAA''DDD)AAA+AAA+AAA+DDD)AAA''GGG$FFF'
+ +'!DDD'#30'==='#25'@@@'#20'@@@'#16';;;'#13'FFF'#11'@@@'#8'333'#5'UUU'#3#128
+ +#128#128#2#0#0#0#1#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#0#0#0
+ +#2'UUU'#3'+++'#6'999'#9'NNN'#13'CCC'#19'BBB'#27'GGG$DDD-CCC5DDD'#211'SC6'#219'W@0'#227'[>+'#235']<('#238'^<'''#240
+ +'_<%'#243'`<#'#245'a;"'#247'a:!'#248'a;"'#246'`<$'#245'_<%'#242'^='''#240'\='
+ +')'#237'Z=,'#233'V@1'#225'RD8'#217'NG?'#210'JHD'#204'IHC'#204'HHD'#204'GEC'
+ +#203'FEC'#202'EED'#198'EED'#195'DDC'#190'DDC'#183'DDD'#172'DDD'#157'DDD'#138
+ +'DDDtCCC\DDDDCCC.@@@'#28'DDD'#15'III'#7'UUU'#3#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'UUU'#3'@@'
+ +'@'#8'KKK'#17'HHH CCC5CCCPDDDlCCC'#134'DDC'#156'EED'#172'FEC'#185'GFD'#193'G'
+ +'FC'#198'HFC'#202'IGD'#203'PE;'#213'VA0'#227']<('#239'a;#'#246'd9'#30#254'g:'
+ +#29#255'g:'#30#255'i<'#30#255'j='#31#255'j>'#30#255'k>'#30#255'l?'#31#255'l@'
+ +#31#255'mA'#31#255'nA'#31#255'm@'#31#255'l@'#31#255'l?'#31#255'k>'#30#255'j>'
+ +#30#255'j='#31#255'i<'#30#255'g:'#30#255'f:'#29#255'd9'#31#252'`<#'#245'[=*'
+ +#236'UA3'#223'MF?'#210'IHC'#204'HFD'#204'FFC'#203'FFE'#200'DDC'#197'EED'#191
+ +'DCC'#182'DDD'#170'CCC'#152'CCC'#129'DDDfDDDKDDD1FFF'#29'@@@'#16'III'#7'UUU'
+ +#3#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'UUU'#3'II'
+ +'I'#7'@@@'#16'@@@ FFF7DDDRCCCoCCC'#140'DDC'#163'EED'#180'EED'#191'FFC'#198'I'
+ +'GD'#201'ME?'#208'UA2'#224'\<('#238'b9 '#250'f:'#29#255'h;'#30#255'j>'#30#255
+ +'m@'#31#255'oB '#255'qD '#255'sF '#255'uH!'#255'|L#'#255#128'O$'#255#133'Q%'
+ +#255#136'S&'#255#139'V'''#255#143'X('#255#145'Y)'#255#142'W('#255#139'U'''
+ +#255#135'S&'#255#131'Q%'#255#128'O$'#255'yK"'#255'tG!'#255'rE '#255'pD '#255
+ +'nA '#255'l@'#31#255'j='#31#255'g;'#30#255'e9'#29#255'a;!'#247'Z=+'#234'RB5'
+ +#221'JGC'#207'HFD'#204'FEC'#203'FFE'#200'EED'#196'DDC'#189'DDD'#177'CCC'#159
+ +'DDD'#135'CCCjBBBMBBB2FFF'#29'III'#14'UUU'#6#128#128#128#2#0#0#0#1#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#2'333'#5';;;'#13'BBB'#27'AAA3BBBQDDDqDDD'#142'EED'#165
+ +'EDB'#183'FEC'#194'HFD'#200'IFB'#205'SA3'#223'^;&'#242'e8'#29#255'g;'#30#255
+ +'j>'#31#255'mA'#31#255'pD!'#255'tG!'#255'~M#'#255#141'W('#255#151']*'#255#160
+ +'c-'#255#169'i0'#255#178'n1'#255#181'q2'#255#182's3'#255#183't3'#255#184't3'
+ +#255#184'v3'#255#185'v4'#255#186'w3'#255#185'v3'#255#184'u3'#255#184't3'#255
+ +#183't3'#255#182'r3'#255#181'q2'#255#175'l1'#255#166'h/'#255#158'a,'#255#149
+ ,'\*'#255#138'U('#255'zK"'#255'sF '#255'pC '#255'l@'#31#255'i='#31#255'g;'#30
+ +#255'c8'#31#252'[<*'#237'RC8'#218'IGD'#205'HFD'#204'EED'#201'DDC'#198'EED'
+ +#191'DDD'#179'CCC'#161'DDD'#136'CCCkEEEJDDD-@@@'#24'FFF'#11'@@@'#4#0#0#0#1#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#1'UUU'#3'999'#9'FFF'#22'CCC*DDDGDDDiCCC'#138'EED'#165'FEC'#184'FEC'#194
+ +'HHD'#200'QC9'#216'[<*'#237'c8'#31#253'g;'#30#255'j>'#31#255'nA '#255'sF!'
+ +#255'|M#'#255#141'W('#255#158'a,'#255#173'k1'#255#181'r3'#255#185'v4'#255#187
+ +'y4'#255#189'{4'#255#191'~5'#255#193#129'5'#255#195#131'5'#255#196#132'6'#255
+ +#197#134'6'#255#198#134'6'#255#199#136'6'#255#200#136'6'#255#200#137'6'#255
+ +#199#136'6'#255#198#135'6'#255#198#134'6'#255#197#133'5'#255#196#132'6'#255
+ +#195#131'5'#255#193#128'5'#255#191'~4'#255#188'z4'#255#186'x4'#255#184'u3'
+ +#255#181'q2'#255#168'i/'#255#153'_+'#255#137'T'''#255'yJ"'#255'rE '#255'm@'
+ +#31#255'i<'#31#255'f:'#30#255'b9!'#249'X>.'#232'MD>'#212'HFD'#204'EED'#202'E'
+ +'ED'#198'EED'#192'CCC'#180'CCC'#160'DDD'#132'DDDbCCCACCC&CCC'#19'@@@'#8'UUU'
+ +#3#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'333'#5
+ +'III'#14'>>>!DDD'#255
+ +#232#177'>'#255#234#179'?'#255#236#181'>'#255#236#182'?'#255#237#183'?'#255
+ ,#237#183'?'#255#238#183'@'#255#238#184'?'#255#238#185'?'#255#238#184'?'#255
+ +#238#183'@'#255#237#182'?'#255#237#183'?'#255#236#182'?'#255#236#181'>'#255
+ +#234#179'>'#255#232#176'>'#255#230#175'>'#255#229#172'='#255#227#169'='#255
+ +#224#167'='#255#220#161'<'#255#217#157'<'#255#213#153';'#255#209#148':'#255
+ +#204#142'9'#255#198#135'8'#255#193#129'7'#255#188'{6'#255#183't5'#255#171'k2'
+ +#255#142'W)'#255'tH"'#255'nA '#255'h<'#31#255'd7'#30#255'[:('#240'KD?'#211'G'
+ +'FD'#204'DDC'#201'EDD'#195'CCC'#182'CCC'#159'CCC}EEEUBBB2@@@'#24'999'#9'UUU'
+ +#3#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#1'333'#5'III'#14'BBB#EEECCCCkEEE'#145'DDC'#174'FFE'#192'KE@'#206'Z;)'
+ +#238'c8'#30#255'i<'#31#255'oB!'#255'|M%'#255#153'_-'#255#178'o4'#255#186'x6'
+ +#255#192#128'7'#255#198#135'9'#255#204#142':'#255#209#149';'#255#214#155'='
+ +#255#219#161'>'#255#223#167'>'#255#227#170'>'#255#230#174'?'#255#232#177'@'
+ +#255#235#181'A'#255#237#183'A'#255#238#185'A'#255#240#187'A'#255#241#188'A'
+ +#255#242#189'B'#255#243#190'A'#255#244#191'B'#255#244#192'B'#255#244#191'B'
+ +#255#244#192'B'#255#244#192'B'#255#245#193'A'#255#244#192'B'#255#244#192'B'
+ +#255#244#191'B'#255#244#192'B'#255#244#191'B'#255#243#190'A'#255#242#189'B'
+ +#255#240#187'A'#255#239#186'A'#255#238#184'@'#255#237#183'A'#255#235#179'@'
+ +#255#232#176'?'#255#229#173'?'#255#226#169'?'#255#223#165'>'#255#218#160'='
+ +#255#213#153'<'#255#208#147';'#255#202#140':'#255#196#133'9'#255#190'~7'#255
+ +#184'v6'#255#173'l3'#255#145'Y+'#255'uH$'#255'm@ '#255'g;'#31#255'b7'#31#253
+ +'U>/'#230'IEC'#206'FFE'#202'EED'#199'CCC'#189'DDD'#170'DDD'#139'BBBdCCC=BBB'
+ +#31'@@@'#12'UUU'#3#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#1'UUU'#6'KKK'#17'DDD)EEENDDDxDCC'#157'DDC'#182'GGC'#197'T=1'#225'a7 '
+ +#252'g;'#31#255'l@ '#255'wI$'#255#154'^.'#255#179'o6'#255#186'x7'#255#193#128
+ +'9'#255#200#137':'#255#207#146'<'#255#212#153'>'#255#217#159'>'#255#222#166
+ +'?'#255#227#170'@'#255#231#175'A'#255#234#180'B'#255#236#182'B'#255#238#185
+ +'B'#255#240#187'B'#255#242#190'D'#255#243#191'C'#255#244#192'D'#255#245#193
+ +'C'#255#246#194'D'#255#247#194'D'#255#247#196'E'#255#247#196'D'#255#247#196
+ +'D'#255#248#197'D'#255#248#197'D'#255#248#197'D'#255#248#197'D'#255#248#197
+ +'D'#255#248#197'D'#255#248#196'D'#255#247#196'D'#255#247#196'D'#255#247#195
+ +'E'#255#246#195'D'#255#245#193'D'#255#245#193'C'#255#244#192'D'#255#243#191
+ +'C'#255#242#189'C'#255#240#186'C'#255#238#184'C'#255#236#182'B'#255#233#179
+ +'B'#255#230#174'A'#255#226#169'@'#255#221#164'?'#255#216#157'>'#255#211#151
+ +'='#255#205#143'<'#255#198#135':'#255#191#127'8'#255#184'w7'#255#174'l4'#255
+ +#144'X+'#255'rE"'#255'j> '#255'e9'#30#255'_8"'#247'O@8'#219'GFD'#204'DDC'#201
+ +'CCC'#194'CCC'#178'DDD'#151'DDDqDDDGGGG$III'#14'@@@'#4#0#0#0#1#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#2'III'#7'@@@'#20'CCC.DDDVCCC'#130'EED'#165'DDC'#189
+ +'LB='#207']7$'#244'd7'#31#255'j> '#255'qE"'#255#140'W+'#255#174'l5'#255#186
+ +'x8'#255#193#129':'#255#200#138'<'#255#207#146'>'#255#213#155'?'#255#220#163
+ +'@'#255#225#169'A'#255#229#174'B'#255#233#179'D'#255#236#182'D'#255#239#185
+ +'D'#255#241#189'E'#255#242#190'E'#255#244#192'E'#255#245#194'E'#255#246#195
+ +'F'#255#247#195'F'#255#247#196'G'#255#247#197'F'#255#248#197'F'#255#248#197
+ +'F'#255#249#198'F'#255#249#198'G'#255#249#198'G'#255#249#198'G'#255#249#198
+ +'G'#255#249#198'G'#255#249#198'G'#255#249#198'G'#255#249#198'G'#255#249#198
+ +'G'#255#249#198'G'#255#249#198'G'#255#249#198'F'#255#248#197'F'#255#248#197
+ +'F'#255#247#196'F'#255#247#196'F'#255#247#195'F'#255#246#194'F'#255#244#193
+ +'F'#255#243#191'E'#255#242#190'E'#255#240#188'E'#255#238#185'D'#255#235#181
+ +'D'#255#232#178'C'#255#228#172'C'#255#223#167'B'#255#218#161'@'#255#212#153
+ +'?'#255#205#144'='#255#198#135';'#255#191#127'9'#255#183'u7'#255#167'g3'#255
+ +#130'P('#255'oB"'#255'h< '#255'c7'#30#255'X:*'#237'HFB'#207'EEE'#202'DCC'#197
+ +'DDD'#184'CCC'#160'CCCzEEENFFF(@@@'#16'333'#5#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#2
+ +'III'#7'FFF'#22'BBB2CCC\DDD'#136'DDC'#171'EED'#192'Q?5'#219'a6'#31#252'f:'#31
+ +#255'mA!'#255#127'N'''#255#164'f3'#255#182'u8'#255#190#127':'#255#199#138'='
+ +#255#207#147'?'#255#213#155'A'#255#220#163'B'#255#225#170'D'#255#230#177'E'
+ +#255#234#181'E'#255#237#184'F'#255#240#188'G'#255#242#189'G'#255#243#192'G'
+ +#255#244#193'H'#255#245#194'H'#255#246#195'H'#255#247#196'H'#255#247#197'H'
+ +#255#247#197'H'#255#248#198'H'#255#248#198'H'#255#248#197'H'#255#248#198'H'
+ +#255#248#198'I'#255#249#198'I'#255#249#198'I'#255#249#198'I'#255#249#198'I'
+ +#255#249#198'I'#255#249#198'I'#255#249#198'I'#255#249#198'I'#255#249#198'I'
+ +#255#249#198'I'#255#249#198'I'#255#248#198'I'#255#248#198'H'#255#248#198'H'
+ +#255#248#198'H'#255#248#198'H'#255#247#197'H'#255#247#196'I'#255#247#195'H'
+ +#255#246#195'H'#255#245#195'H'#255#244#193'H'#255#243#191'G'#255#241#189'G'
+ +#255#239#186'G'#255#236#183'F'#255#233#180'F'#255#229#175'D'#255#224#168'D'
+ +#255#218#161'B'#255#211#153'@'#255#205#144'?'#255#196#134'='#255#188'{:'#255
+ +#180'r8'#255#155'_/'#255'wJ$'#255'j? '#255'e8'#30#255']8#'#246'LB<'#213'FEE'
+ +#203'EED'#199'DDD'#188'DDD'#165'DDD'#128'DDDSFFF,GGG'#18'+++'#6#0#0#0#1#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#2'III'#7'CCC'#23'BBB6DDDaCCC'#141'DDC'#174'GDB'#196'V:+'#233'c7'#30#255'h; '
+ +#255'pC#'#255#146'Z-'#255#179'p7'#255#187'{;'#255#196#133'='#255#204#144'?'
+ +#255#212#154'B'#255#219#163'E'#255#225#170'E'#255#230#176'G'#255#234#181'H'
+ +#255#238#185'I'#255#240#189'I'#255#242#190'J'#255#243#192'J'#255#244#193'J'
+ +#255#245#195'J'#255#246#195'J'#255#246#196'J'#255#247#196'K'#255#247#196'K'
+ +#255#247#197'K'#255#247#197'K'#255#247#197'K'#255#247#197'J'#255#247#197'J'
+ +#255#247#198'J'#255#247#198'J'#255#247#198'J'#255#247#198'J'#255#247#198'J'
+ +#255#247#198'J'#255#247#198'J'#255#247#198'J'#255#247#198'J'#255#247#198'J'
+ +#255#247#198'J'#255#247#198'J'#255#247#198'J'#255#247#198'J'#255#247#197'J'
+ +#255#247#197'J'#255#247#197'J'#255#247#197'K'#255#247#197'K'#255#247#197'K'
+ +#255#247#196'K'#255#246#196'K'#255#246#196'J'#255#246#195'J'#255#245#195'J'
+ +#255#244#194'J'#255#243#191'I'#255#241#189'I'#255#239#188'I'#255#236#184'H'
+ +#255#233#180'H'#255#228#174'G'#255#223#168'E'#255#217#160'C'#255#210#151'B'
+ +#255#202#141'?'#255#193#130'<'#255#185'x:'#255#174'm6'#255#134'S*'#255'mA"'
+ +#255'f:'#31#255'a6'#30#253'R>4'#224'FFE'#203'EED'#200'CCC'#190'DDD'#169'CCC'
+ +#133'CCCXAAA/CCC'#19'+++'#6#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#1'III'#7'CCC'#23'BBB6CCCcCCC'#144'EED'#177'JC>'#202
+ +'[6"'#244'c8'#31#255'j?!'#255'xI&'#255#162'd2'#255#183'u:'#255#192#129'='#255
+ +#200#140'@'#255#209#150'B'#255#217#160'E'#255#223#169'G'#255#229#176'H'#255
+ +#233#181'J'#255#236#185'J'#255#239#188'K'#255#241#190'K'#255#242#192'K'#255
+ +#243#193'L'#255#244#194'L'#255#245#195'L'#255#245#195'L'#255#245#195'L'#255
+ +#246#196'L'#255#246#196'L'#255#246#196'L'#255#246#196'L'#255#246#196'M'#255
+ +#246#196'M'#255#246#197'M'#255#246#197'M'#255#246#197'M'#255#246#197'M'#255
+ +#246#197'M'#255#246#197'M'#255#246#197'M'#255#246#197'M'#255#246#197'M'#255
+ +#246#197'M'#255#246#197'M'#255#246#197'M'#255#246#197'M'#255#246#197'M'#255
+ +#246#197'M'#255#246#197'M'#255#246#197'M'#255#246#197'M'#255#246#196'M'#255
+ +#246#196'M'#255#246#196'M'#255#246#196'L'#255#246#196'L'#255#246#196'L'#255
+ +#246#196'L'#255#245#195'L'#255#245#196'L'#255#244#195'M'#255#244#194'L'#255
+ +#243#193'L'#255#242#192'L'#255#241#190'K'#255#238#188'K'#255#236#184'J'#255
+ +#232#179'I'#255#228#173'H'#255#222#166'F'#255#215#158'E'#255#207#148'B'#255
+ +#198#137'?'#255#190'~<'#255#180'r9'#255#150']/'#255'qE$'#255'h< '#255'b6'#30
+ +#255'W9*'#235'GED'#204'DDC'#201'DDD'#192'CCC'#172'CCC'#137'DDDZAAA/GGG'#18'3'
+ +'33'#5#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'+++'#6'II'
+ +'I'#21'CCC5DDDbCCC'#145'DDC'#178'LB;'#206'^6 '#249'd8'#31#255'l@!'#255#131'Q'
+ +'*'#255#172'k7'#255#186'z;'#255#196#133'?'#255#205#146'C'#255#213#156'E'#255
+ +#220#165'G'#255#227#173'I'#255#232#180'K'#255#236#184'L'#255#238#187'L'#255
+ ,#240#189'N'#255#241#191'N'#255#242#192'N'#255#243#193'N'#255#244#194'N'#255
+ +#244#194'N'#255#244#194'O'#255#244#195'O'#255#244#195'O'#255#244#195'O'#255
+ +#244#195'O'#255#244#195'O'#255#244#195'O'#255#244#195'O'#255#244#195'O'#255
+ +#244#195'O'#255#244#195'O'#255#244#195'O'#255#244#195'O'#255#244#195'O'#255
+ +#244#195'O'#255#244#195'O'#255#244#195'O'#255#244#195'O'#255#244#195'O'#255
+ +#244#195'O'#255#244#195'O'#255#244#195'O'#255#244#195'O'#255#244#195'O'#255
+ +#244#195'O'#255#244#195'O'#255#244#195'O'#255#244#195'O'#255#244#195'O'#255
+ +#244#195'O'#255#244#195'O'#255#244#195'O'#255#244#195'O'#255#244#195'O'#255
+ +#244#195'O'#255#244#195'O'#255#244#194'O'#255#244#195'N'#255#244#194'N'#255
+ +#243#193'N'#255#242#192'M'#255#241#190'N'#255#240#189'M'#255#237#186'M'#255
+ +#235#182'L'#255#230#178'K'#255#225#171'I'#255#219#163'G'#255#211#153'D'#255
+ +#202#143'B'#255#192#130'>'#255#183'u:'#255#164'f4'#255'yK&'#255'i=!'#255'c7'
+ +#30#255'Z8%'#241'GEC'#205'DDC'#201'CCC'#193'DDD'#173'DDD'#136'BBBYDDD-KKK'#17
+ +'333'#5#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'333'#5'CCC'#19'BBB2CCC_DD'
+ +'D'#143'DDC'#178'M@8'#211'_5'#31#251'e9'#31#255'lA"'#255#144'Y/'#255#179'r9'
+ +#255#188'}='#255#198#138'B'#255#208#149'D'#255#217#161'H'#255#223#170'K'#255
+ +#229#177'L'#255#234#181'M'#255#236#186'N'#255#239#188'O'#255#240#190'P'#255
+ +#241#191'P'#255#242#192'P'#255#242#192'P'#255#242#193'P'#255#243#193'P'#255
+ +#243#194'P'#255#243#194'P'#255#243#194'P'#255#243#194'P'#255#243#194'P'#255
+ +#243#194'P'#255#243#194'P'#255#243#194'P'#255#243#194'P'#255#243#194'P'#255
+ +#243#194'P'#255#243#194'P'#255#243#194'P'#255#243#194'P'#255#243#194'P'#255
+ +#243#194'P'#255#243#194'P'#255#243#194'P'#255#243#194'P'#255#243#194'P'#255
+ +#243#194'P'#255#243#194'P'#255#243#194'P'#255#243#194'P'#255#243#194'P'#255
+ +#243#194'P'#255#243#194'P'#255#243#194'P'#255#243#194'P'#255#243#194'P'#255
+ +#243#194'P'#255#243#194'P'#255#243#194'P'#255#243#194'P'#255#243#194'P'#255
+ +#243#194'P'#255#243#194'P'#255#243#194'P'#255#243#194'P'#255#243#193'P'#255
+ +#242#193'P'#255#242#192'O'#255#242#192'P'#255#241#192'P'#255#240#190'P'#255
+ +#238#188'O'#255#236#185'N'#255#232#180'M'#255#228#175'L'#255#222#167'I'#255
+ +#215#159'H'#255#205#147'D'#255#196#134'@'#255#186'y<'#255#173'm7'#255#130'O*'
+ +#255'j?!'#255'c8'#31#255'[7#'#245'HDA'#208'DDC'#201'CCC'#193'CCC'#172'CCC'
+ +#134'AAAVAAA+@@@'#16'@@@'#4#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'@@@'#4'<<<'#17'CCC.CC'
+ +'C[CCC'#140'EED'#176'O>5'#213'_5'#30#253'e9'#31#255'nB#'#255#151'\1'#255#181
+ +'s:'#255#191#129'@'#255#201#142'C'#255#211#154'G'#255#219#164'K'#255#226#173
+ +'M'#255#231#179'O'#255#234#184'P'#255#237#187'Q'#255#239#189'Q'#255#240#190
+ +'R'#255#240#191'Q'#255#241#192'R'#255#241#192'R'#255#241#192'R'#255#242#192
+ +'R'#255#242#192'R'#255#242#193'R'#255#242#193'R'#255#242#193'R'#255#242#193
+ +'R'#255#242#193'R'#255#242#193'R'#255#242#193'R'#255#242#193'R'#255#242#193
+ +'R'#255#242#193'R'#255#242#193'R'#255#242#193'R'#255#242#193'R'#255#242#193
+ +'R'#255#242#193'R'#255#242#193'R'#255#242#193'R'#255#242#193'R'#255#242#193
+ +'R'#255#242#193'R'#255#242#193'R'#255#242#193'R'#255#242#193'R'#255#242#193
+ +'R'#255#242#193'R'#255#242#193'R'#255#242#193'R'#255#242#193'R'#255#242#193
+ +'R'#255#242#193'R'#255#242#193'R'#255#242#193'R'#255#242#193'R'#255#242#193
+ +'R'#255#242#193'R'#255#242#193'R'#255#242#193'R'#255#242#193'R'#255#242#193
+ +'R'#255#242#192'R'#255#242#192'R'#255#241#192'R'#255#241#192'R'#255#241#192
+ +'R'#255#240#191'Q'#255#240#190'R'#255#238#189'Q'#255#236#186'P'#255#234#182
+ +'O'#255#230#177'N'#255#224#171'L'#255#217#162'J'#255#208#150'F'#255#198#138
+ +'C'#255#188'}>'#255#177'o:'#255#136'S,'#255'k?"'#255'c8'#31#255'\6!'#248'JC?'
+ +#211'DCC'#201'CCC'#193'CCC'#171'BBB'#131'DDDRAAA''777'#14'UUU'#3#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +'UUU'#3';;;'#13'AAA''CCCTBBB'#135'DDC'#174'N=5'#213'`4'#29#254'e9'#31#255'oC'
+ +'$'#255#156'`3'#255#181'u<'#255#193#131'A'#255#204#146'E'#255#213#157'I'#255
+ +#221#167'M'#255#227#175'O'#255#232#180'Q'#255#235#184'R'#255#237#187'S'#255
+ +#238#189'S'#255#239#190'S'#255#240#191'T'#255#240#191'T'#255#240#191'T'#255
+ +#240#191'T'#255#240#191'T'#255#240#191'T'#255#240#191'T'#255#240#191'T'#255
+ +#240#191'T'#255#240#191'T'#255#240#191'T'#255#240#191'T'#255#240#191'T'#255
+ +#240#191'T'#255#240#191'T'#255#240#191'T'#255#240#191'T'#255#240#191'T'#255
+ ,#240#191'T'#255#240#191'T'#255#240#191'T'#255#240#191'T'#255#240#191'T'#255
+ +#234#187'R'#255#202#161'G'#255#232#185'R'#255#240#191'T'#255#240#191'T'#255
+ +#240#191'T'#255#240#191'T'#255#240#191'T'#255#240#191'T'#255#240#191'T'#255
+ +#240#191'T'#255#240#191'T'#255#240#191'T'#255#240#191'T'#255#240#191'T'#255
+ +#240#191'T'#255#240#191'T'#255#240#191'T'#255#240#191'T'#255#240#191'T'#255
+ +#240#191'T'#255#240#191'T'#255#240#191'T'#255#240#191'T'#255#240#191'T'#255
+ +#240#191'T'#255#240#191'T'#255#240#191'T'#255#240#191'T'#255#240#191'T'#255
+ +#239#189'S'#255#238#188'R'#255#236#186'R'#255#234#184'Q'#255#231#179'Q'#255
+ +#226#173'O'#255#219#165'L'#255#211#154'H'#255#201#142'E'#255#190#128'@'#255
+ +#179'q:'#255#140'V.'#255'l@"'#255'c8'#31#255'\4'#31#250'JC>'#211'CCC'#201'DD'
+ +'D'#192'CCC'#168'CCC~DDDKFFF!MMM'#10#128#128#128#2#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#128#128#2'333'#10'@@@ EEE'
+ +'JCCC~EDD'#169'L?8'#208'^4'#30#253'd8 '#255'pD%'#255#159'b4'#255#182'v='#255
+ +#194#132'C'#255#205#147'H'#255#215#160'L'#255#222#169'O'#255#228#176'Q'#255
+ +#232#181'S'#255#235#185'T'#255#236#187'T'#255#237#188'U'#255#238#189'U'#255
+ +#238#190'U'#255#238#190'U'#255#238#191'U'#255#239#190'U'#255#239#190'U'#255
+ +#239#190'U'#255#239#190'U'#255#239#190'U'#255#239#190'U'#255#239#190'U'#255
+ +#239#190'U'#255#239#190'U'#255#239#190'U'#255#239#190'U'#255#239#190'U'#255
+ +#239#190'U'#255#239#190'U'#255#239#190'U'#255#239#190'U'#255#181#144'@'#255
+ +';/'#21#255#21#16#7#255#9#7#3#255#2#2#1#255#0#0#0#255#0#0#0#255#0#0#0#255#1#1
+ +#1#255#7#6#3#255#17#14#6#255#31#25#11#255'2'''#18#255'SB'#29#255#157'}8'#255
+ +#233#186'S'#255#239#190'U'#255#239#190'U'#255#239#190'U'#255#239#190'U'#255
+ +#239#190'U'#255#239#190'U'#255#239#190'U'#255#239#190'U'#255#239#190'U'#255
+ +#239#190'U'#255#239#190'U'#255#239#190'U'#255#239#190'U'#255#239#190'U'#255
+ +#239#190'U'#255#239#190'U'#255#239#190'U'#255#238#190'U'#255#238#190'U'#255
+ +#238#190'U'#255#238#189'U'#255#237#188'U'#255#236#186'T'#255#234#184'T'#255
+ +#231#180'S'#255#226#175'Q'#255#220#166'N'#255#212#156'K'#255#202#143'F'#255
+ +#190#129'A'#255#179'r<'#255#145'Y0'#255'k?"'#255'c7'#31#255'[4 '#248'IC@'#209
+ +'DDD'#200'CCC'#190'CCC'#163'DDDtCCCAEEE'#26'III'#7#0#0#0#1#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'III'#7'==='#25'AAA?CCCsBBB'
+ +#162'K?;'#202'^4'#30#252'c8 '#255'oB%'#255#160'b5'#255#183'v>'#255#194#134'D'
+ +#255#205#148'J'#255#215#161'M'#255#223#171'Q'#255#228#177'T'#255#232#182'U'
+ +#255#234#185'V'#255#236#187'V'#255#236#187'V'#255#237#188'W'#255#237#189'W'
+ +#255#237#188'W'#255#237#188'W'#255#237#188'W'#255#237#188'W'#255#237#188'W'
+ +#255#237#188'W'#255#237#188'W'#255#237#188'W'#255#237#188'W'#255#237#188'W'
+ +#255#237#188'W'#255#237#188'W'#255#237#188'W'#255#237#188'W'#255#237#188'W'
+ +#255#237#188'W'#255#237#188'W'#255#159'~:'#255#16#13#6#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#1#0#0#255#16#13#6
+ +#255'9-'#21#255'y`,'#255#208#165'M'#255#237#188'W'#255#237#188'W'#255#237#188
+ +'W'#255#237#188'W'#255#237#188'W'#255#237#188'W'#255#237#188'W'#255#237#188
+ +'W'#255#237#188'W'#255#237#188'W'#255#237#188'W'#255#237#188'W'#255#237#188
+ +'W'#255#237#188'W'#255#237#188'W'#255#237#188'W'#255#237#189'W'#255#237#188
+ +'W'#255#236#187'V'#255#235#186'V'#255#234#184'U'#255#231#180'U'#255#227#175
+ +'R'#255#221#169'Q'#255#213#157'L'#255#202#144'H'#255#191#129'C'#255#180's='
+ +#255#145'X0'#255'j>#'#255'b6'#31#255'Z5#'#245'GDB'#206'DDD'#200'CCC'#186'DDD'
+ +#154'EEEhBBB6@@@'#20'333'#5#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#1'@@@'#4'GGG'#18'AAA3DDDfCCC'#152'IA>'#195'\4 '#250'c7'#31#255'm@#'#255
+ +#156'_5'#255#182'v?'#255#194#134'E'#255#206#148'K'#255#215#161'O'#255#223#171
+ +'S'#255#228#178'V'#255#232#182'V'#255#233#185'X'#255#234#186'X'#255#235#187
+ +'X'#255#236#187'X'#255#236#188'X'#255#236#188'X'#255#236#188'X'#255#236#188
+ +'X'#255#236#188'X'#255#236#188'X'#255#236#188'X'#255#236#188'X'#255#236#188
+ +'X'#255#236#188'X'#255#236#188'X'#255#236#188'X'#255#236#188'X'#255#236#188
+ +'X'#255#236#188'X'#255#236#188'X'#255#236#188'X'#255#236#188'X'#255'9-'#21
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#6
+ +#5#2#255'$'#29#14#255'ZH"'#255#169#135'@'#255#234#186'X'#255#236#188'X'#255
+ ,#236#188'X'#255#236#188'X'#255#236#188'X'#255#236#188'X'#255#236#188'X'#255
+ +#236#188'X'#255#236#188'X'#255#236#188'X'#255#236#188'X'#255#236#188'X'#255
+ +#236#188'X'#255#236#187'X'#255#235#187'Y'#255#235#186'X'#255#234#186'X'#255
+ +#233#184'W'#255#231#180'W'#255#227#176'T'#255#221#169'R'#255#213#158'N'#255
+ +#203#145'J'#255#192#130'D'#255#179's='#255#139'U/'#255'i="'#255'a5'#30#255'X'
+ +'7%'#242'FDC'#204'CCC'#198'DDD'#180'CCC'#144'CCC[AAA+III'#14'UUU'#3#0#0#0#1#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#128#128#2'@@@'#12'AAA''CCCWCCC'#140'GB?'
+ +#185'Z4!'#247'a6'#30#255'j?"'#255#151']2'#255#181't>'#255#194#133'F'#255#206
+ +#149'M'#255#215#161'Q'#255#223#170'T'#255#228#178'W'#255#231#181'Y'#255#232
+ +#183'Y'#255#233#185'Z'#255#234#185'Y'#255#234#186'Y'#255#234#186'Y'#255#234
+ +#186'Z'#255#234#186'Z'#255#234#186'Z'#255#234#186'Z'#255#234#186'Z'#255#234
+ +#186'Z'#255#234#186'Z'#255#234#186'Z'#255#234#186'Z'#255#234#186'Z'#255#234
+ +#186'Z'#255#234#186'Z'#255#234#186'Z'#255#234#186'Z'#255#234#186'Z'#255#234
+ +#186'Z'#255#234#186'Z'#255'C5'#26#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#1#1#1#255#20#16#8#255'K;'#29#255#189#150'I'#255#234#186'Z'#255#234#186
+ +'Z'#255#234#186'Z'#255#234#186'Z'#255#234#186'Z'#255#234#186'Z'#255#234#186
+ +'Z'#255#234#186'Z'#255#234#186'Z'#255#234#186'Z'#255#234#186'Y'#255#234#186
+ +'Y'#255#234#185'Y'#255#233#185'Z'#255#232#183'Y'#255#230#181'X'#255#226#176
+ +'W'#255#221#169'T'#255#213#159'O'#255#203#145'K'#255#190#129'D'#255#178'p='
+ +#255#134'Q-'#255'g;"'#255'`4'#29#255'U7('#238'CCC'#202'DDD'#195'DDD'#173'BBB'
+ +#131'CCCL@@@ 999'#9#0#0#0#2#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'III'#7'BBB'#27'CC'
+ +'CEDDD|DDD'#170'V6%'#238'`5'#30#255'h<"'#255#145'Y1'#255#179's?'#255#192#132
+ +'F'#255#205#148'M'#255#215#161'R'#255#222#171'U'#255#227#176'X'#255#230#181
+ +'Z'#255#231#183'Z'#255#232#183'['#255#232#184'['#255#233#185'['#255#233#185
+ +'['#255#233#185'['#255#233#185'['#255#233#185'['#255#233#185'['#255#233#185
+ +'['#255#233#185'['#255#233#185'['#255#233#185'['#255#233#185'['#255#233#185
+ +'['#255#233#185'['#255#233#185'['#255#233#185'['#255#233#185'['#255#233#185
+ +'['#255#233#185'['#255#233#185'['#255#127'd1'#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#13#11#5
+ +#255'N>'#31#255#193#153'L'#255#233#185'['#255#233#185'['#255#233#185'['#255
+ +#233#185'['#255#233#185'['#255#233#185'['#255#233#185'['#255#233#185'['#255
+ +#233#185'['#255#233#184'['#255#232#184'['#255#232#183'Z'#255#231#182'Z'#255
+ +#229#180'Y'#255#226#175'X'#255#220#168'U'#255#213#158'R'#255#201#144'K'#255
+ +#189#127'D'#255#175'n<'#255#128'N+'#255'e9 '#255'_3'#29#255'Q;1'#227'CCC'#201
+ +'CCC'#191'CCC'#163'CCCrAAA;FFF'#22'333'#5#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'@@@'#4'<<<'
+ +#17'AAA3EEEhCCC'#156'R:/'#220'_3'#29#255'e: '#255#134'Q-'#255#178'p>'#255#190
+ +#130'F'#255#203#145'M'#255#213#161'S'#255#221#170'W'#255#226#176'Z'#255#229
+ +#180'Z'#255#230#182'\'#255#231#182'\'#255#231#183'\'#255#231#183'\'#255#231
+ +#183'\'#255#231#183'\'#255#231#183'\'#255#231#183'\'#255#231#183'\'#255#231
+ +#183'\'#255#231#183'\'#255#231#183'\'#255#231#183'\'#255#231#183'\'#255#231
+ +#183'\'#255#231#183'\'#255#231#183'\'#255#231#183'\'#255#231#183'\'#255#231
+ +#183'\'#255#231#183'\'#255#231#183'\'#255#180#142'G'#255#1#1#1#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#15#12#6#255'VE"'#255#215#171'V'#255
+ +#231#183'\'#255#231#183'\'#255#231#183'\'#255#231#183'\'#255#231#183'\'#255
+ +#231#183'\'#255#231#183'\'#255#231#183'\'#255#231#183'\'#255#231#182'\'#255
+ +#230#181'['#255#228#178'['#255#225#175'Y'#255#219#168'W'#255#211#156'Q'#255
+ +#200#142'K'#255#187'|D'#255#172'k<'#255'wF('#255'c7 '#255'^1'#30#254'K@:'#214
+ +'DDD'#199'CCC'#184'CCC'#148'AAA^GGG+NNN'#13'UUU'#3#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#2'MMM'#10'@'
+ +'@@$DDDSDDD'#139'L?8'#197'^1'#29#254'c7 '#255'wG)'#255#173'l<'#255#188#127'E'
+ +#255#201#144'N'#255#212#158'T'#255#220#169'X'#255#225#175'['#255#228#179'\'
+ +#255#229#180'\'#255#230#181']'#255#230#181']'#255#230#182']'#255#230#182']'
+ +#255#230#182']'#255#230#182']'#255#230#182']'#255#230#182']'#255#230#182']'
+ +#255#230#182']'#255#230#182']'#255#230#182']'#255#230#182']'#255#230#182']'
+ +#255#230#182']'#255#230#182']'#255#230#182']'#255#230#182']'#255#230#182']'
+ +#255#230#182']'#255#230#182']'#255#221#175'Y'#255#10#8#4#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#1#1#1#255'4'
+ +')'#21#255#184#146'J'#255#230#182']'#255#230#182']'#255#230#182']'#255#230
+ +#182']'#255#230#182']'#255#230#182']'#255#230#182']'#255#230#181']'#255#229
+ +#182']'#255#228#180']'#255#227#178'\'#255#224#174'['#255#218#166'W'#255#209
+ +#155'R'#255#198#139'K'#255#184'zC'#255#162'd8'#255'l@$'#255'a5'#30#255'Z3 '
+ +#249'FBA'#206'DDD'#196'CCC'#174'CCC'#129'BBBIFFF'#29'@@@'#8#0#0#0#1#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'333'#5'FF'
+ +'F'#22'BBB>CCCvFA?'#174'Z3'#31#248'`5'#30#255'l@$'#255#163'd9'#255#184'{D'
+ +#255#199#142'N'#255#210#156'T'#255#218#167'Y'#255#223#174'\'#255#226#177'^'
+ +#255#228#179'^'#255#228#179'^'#255#228#180'_'#255#228#180'_'#255#228#180'_'
+ +#255#228#180'_'#255#228#180'_'#255#228#180'_'#255#228#180'_'#255#228#180'_'
+ +#255#228#180'_'#255#228#180'_'#255#228#180'_'#255#228#180'_'#255#228#180'_'
+ +#255#228#180'_'#255#228#180'_'#255#228#180'_'#255#228#180'_'#255#228#180'_'
+ +#255#228#180'_'#255#228#180'_'#255#228#180'_'#255'bM)'#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#27#21#11#255#140'o;'#255#228#180'_'#255#228#180
+ +'_'#255#228#180'_'#255#228#180'_'#255#228#180'_'#255#228#180'_'#255#228#180
+ +'_'#255#228#179'^'#255#227#179'^'#255#226#176']'#255#222#172'['#255#216#164
+ +'X'#255#207#152'R'#255#195#137'K'#255#181'tA'#255#149'Z3'#255'g<"'#255'_3'#29
+ +#255'V6'''#239'CCC'#201'CCC'#190'CCC'#159'CCCkCCC5GGG'#18'@@@'#4#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#2'@@@'#12'CCC'
+ +'*DDD^DDD'#150'U6('#230'^2'#28#255'f:!'#255#149'Z3'#255#181'uB'#255#195#137
+ +'K'#255#208#154'T'#255#216#165'Y'#255#221#172']'#255#225#176'^'#255#226#178
+ +'_'#255#227#178'_'#255#227#178'_'#255#227#179'_'#255#227#179'_'#255#227#179
+ +'_'#255#227#179'_'#255#227#179'_'#255#227#179'_'#255#227#179'_'#255#227#179
+ +'_'#255#227#179'_'#255#227#179'_'#255#227#179'_'#255#227#179'_'#255#227#179
+ +'_'#255#227#179'_'#255#227#179'_'#255#227#179'_'#255#227#179'_'#255#227#179
+ +'_'#255#227#179'_'#255#227#179'_'#255#227#179'_'#255#13#10#6#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'&'#30#16#255#208#164
+ +'W'#255#227#179'_'#255#227#179'_'#255#227#179'_'#255#227#179'_'#255#227#178
+ +'_'#255#227#178'_'#255#226#179'`'#255#226#177'_'#255#224#176'^'#255#220#170
+ +'\'#255#214#162'X'#255#205#149'R'#255#191#131'I'#255#177'p?'#255#131'O.'#255
+ +'c7 '#255']1'#29#255'N;3'#222'DDD'#199'DDD'#181'CCC'#140'DDDSDDD"999'#9#0#0#0
+ +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'+++'#6'@@@'#24
+ +'EEECCCC~K=7'#193']0'#28#255'b6'#31#255#129'M,'#255#177'o@'#255#191#131'J'
+ +#255#204#149'S'#255#214#163'Z'#255#220#171']'#255#223#174'_'#255#225#176'`'
+ +#255#225#177'`'#255#226#177'`'#255#226#177'`'#255#226#177'`'#255#226#177'`'
+ +#255#226#177'`'#255#226#177'`'#255#226#177'`'#255#226#177'`'#255#226#177'`'
+ +#255#226#177'`'#255#226#177'`'#255#226#177'`'#255#226#177'`'#255#226#177'`'
+ ,#255#226#177'`'#255#226#177'`'#255#226#177'`'#255#226#177'`'#255#226#177'`'
+ +#255#226#177'`'#255#226#177'`'#255#226#177'`'#255#161'~D'#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#4#3#2
+ +#255#134'i9'#255#226#177'`'#255#226#177'`'#255#226#177'`'#255#226#177'`'#255
+ +#226#177'`'#255#225#178'`'#255#225#177'`'#255#224#176'_'#255#222#174'^'#255
+ +#219#169']'#255#212#159'X'#255#200#144'Q'#255#187'~G'#255#170'j<'#255'qB%'
+ +#255'`5'#30#255'Z2'#31#250'FBA'#205'CCC'#193'DDD'#166'CCCsCCC9CCC'#19'@@@'#4
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#2'@@@'#12'AAA+BBB'
+ +'aDBB'#155'Y3!'#244'_3'#29#255'l?$'#255#167'f;'#255#186'}H'#255#200#144'R'
+ +#255#211#158'Y'#255#218#168']'#255#221#172'`'#255#223#174'a'#255#223#176'a'
+ +#255#224#176'b'#255#224#176'b'#255#224#176'b'#255#224#176'b'#255#224#176'b'
+ +#255#224#176'b'#255#224#176'b'#255#224#176'b'#255#224#176'b'#255#224#176'b'
+ +#255#224#176'b'#255#224#176'b'#255#224#176'b'#255#224#176'b'#255#224#176'b'
+ +#255#224#176'b'#255#224#176'b'#255#224#176'b'#255#224#176'b'#255#224#176'b'
+ +#255#224#176'b'#255#224#176'b'#255#224#176'b'#255'hR.'#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255'qY2'#255#224#176'b'#255#224#176'b'#255#224#176'b'#255#224#176
+ +'b'#255#224#176'b'#255#224#176'b'#255#223#176'a'#255#223#174'`'#255#221#172
+ +'_'#255#217#166']'#255#208#155'W'#255#196#139'O'#255#182'wE'#255#152'\5'#255
+ +'e9!'#255'^2'#29#255'S7*'#233'DDD'#200'CCC'#183'DDD'#143'EEEUDDD"UUU'#9#0#0#0
+ +#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'333'#5'@@@'#24'DDDDCCC~P8-'
+ +#211']0'#29#255'c8!'#255#144'V2'#255#180'uD'#255#196#138'P'#255#207#155'X'
+ +#255#215#165']'#255#220#171'`'#255#221#173'b'#255#222#174'a'#255#222#175'b'
+ +#255#222#175'b'#255#222#175'b'#255#222#175'b'#255#222#175'b'#255#222#175'b'
+ +#255#222#175'b'#255#222#175'b'#255#222#175'b'#255#222#175'b'#255#222#175'b'
+ +#255#222#175'b'#255#222#175'b'#255#222#175'b'#255#222#175'b'#255#222#175'b'
+ +#255#222#175'b'#255#222#175'b'#255#222#175'b'#255#222#175'b'#255#222#175'b'
+ +#255#222#175'b'#255#222#175'b'#255#222#175'b'#255'VD&'#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#1#1#0#255#166#132'J'#255#222#175'b'#255#222#175'b'#255#222#175
+ +'b'#255#222#175'b'#255#222#175'b'#255#222#175'b'#255#222#174'a'#255#221#173
+ +'a'#255#219#170'`'#255#213#163'\'#255#205#150'V'#255#192#132'M'#255#176'oA'
+ +#255'}K,'#255'a5'#31#255'\0'#28#254'I?;'#212'CCC'#194'DDD'#166'CCCrDDD8GGG'
+ +#18'@@@'#4#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#2'FFF'#11'DDD)BBB`G@<'
+ +#164'[1'#29#252'_3'#29#255'uD)'#255#174'l?'#255#189#130'L'#255#204#150'V'#255
+ +#213#162'^'#255#217#168'`'#255#220#172'b'#255#221#173'b'#255#221#173'c'#255
+ +#221#173'c'#255#221#173'c'#255#221#173'c'#255#221#173'c'#255#221#173'c'#255
+ +#221#173'c'#255#221#173'c'#255#221#173'c'#255#221#173'c'#255#221#173'c'#255
+ +#221#173'c'#255#221#173'c'#255#221#173'c'#255#221#173'c'#255#221#173'c'#255
+ +#221#173'c'#255#221#173'c'#255#221#173'c'#255#221#173'c'#255#221#173'c'#255
+ +#221#173'c'#255#221#173'c'#255#221#173'c'#255#221#173'c'#255'gQ.'#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ ,#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#8#6#4#255#207#163']'#255#221#173'c'#255
+ +#221#173'c'#255#221#173'c'#255#221#173'c'#255#221#173'c'#255#221#173'c'#255
+ +#221#172'b'#255#219#171'b'#255#217#167'`'#255#211#159'['#255#200#145'T'#255
+ +#185'{H'#255#164'd;'#255'h<#'#255'^1'#29#255'X3#'#244'DDD'#200'CCC'#183'DDD'
+ +#142'DDDSFFF!@@@'#8#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'@@@'#4'III'#21'EEE?DD'
+ +'D|S5'''#222'\1'#28#255'c8!'#255#158'_8'#255#183'yH'#255#198#142'S'#255#209
+ +#158'\'#255#215#166'`'#255#218#170'b'#255#219#171'c'#255#219#171'd'#255#219
+ +#172'd'#255#219#172'd'#255#219#172'd'#255#219#172'd'#255#219#172'd'#255#219
+ +#172'd'#255#219#172'd'#255#219#172'd'#255#219#172'd'#255#219#172'd'#255#219
+ +#172'd'#255#219#172'd'#255#219#172'd'#255#219#172'd'#255#219#172'd'#255#219
+ +#172'd'#255#219#172'd'#255#219#172'd'#255#219#172'd'#255#219#172'd'#255#219
+ +#172'd'#255#219#172'd'#255#219#172'd'#255#219#172'd'#255#219#172'd'#255#213
+ +#168'b'#255#3#3#1#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'M<#'#255#219#172
+ +'d'#255#219#172'd'#255#219#172'd'#255#219#172'd'#255#219#172'd'#255#219#172
+ +'d'#255#219#171'd'#255#219#170'c'#255#217#168'b'#255#214#164'`'#255#207#153
+ +'Z'#255#194#136'P'#255#178'rD'#255#139'R1'#255'a4'#31#255'\0'#28#255'L<5'#219
+ +'CCC'#193'DDD'#164'CCCoCCC5@@@'#16'UUU'#3#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'@@@'#8
+ +'BBB#CCCWHA='#158'\0'#28#253'_3'#29#255'~I+'#255#175'nB'#255#191#133'O'#255
+ +#205#151'Z'#255#213#163'a'#255#216#167'c'#255#217#169'c'#255#218#170'd'#255
+ +#218#170'd'#255#218#170'd'#255#218#170'd'#255#218#170'd'#255#218#170'd'#255
+ +#218#170'd'#255#218#170'd'#255#218#170'd'#255#218#170'd'#255#218#170'd'#255
+ +#218#170'd'#255#218#170'd'#255#218#170'd'#255#218#170'd'#255#218#170'd'#255
+ +#218#170'd'#255#218#170'd'#255#218#170'd'#255#218#170'd'#255#218#170'd'#255
+ +#218#170'd'#255#218#170'd'#255#218#170'd'#255#218#170'd'#255#218#170'd'#255
+ +#218#170'd'#255#218#170'd'#255'YF)'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#15#12#7#255#218#170'd'#255#218#170'd'#255#218#170'd'#255#218#170'd'#255
+ +#218#170'd'#255#218#170'd'#255#218#170'd'#255#218#169'c'#255#217#168'c'#255
+ +#215#166'b'#255#211#160'_'#255#201#147'W'#255#187#127'L'#255#169'h>'#255'l=$'
+ +#255'^1'#29#255'W3"'#244'DDD'#199'DDD'#180'DDD'#136'DDDKBBB'#27'UUU'#6#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0'UUU'#3'DDD'#15'EEE4BBBpS6)'#215'\1'#28#255'b7!'#255#158'_9'
+ +#255#184'{J'#255#199#144'W'#255#209#158'_'#255#214#165'c'#255#216#168'd'#255
+ +#217#168'd'#255#217#168'd'#255#217#168'd'#255#217#168'd'#255#217#168'd'#255
+ +#217#168'd'#255#217#168'd'#255#217#168'd'#255#217#168'd'#255#217#168'd'#255
+ +#217#168'd'#255#217#168'd'#255#217#168'd'#255#217#168'd'#255#217#168'd'#255
+ +#217#168'd'#255#217#168'd'#255#217#168'd'#255#217#168'd'#255#217#168'd'#255
+ +#217#168'd'#255#217#168'd'#255#217#168'd'#255#217#168'd'#255#217#168'd'#255
+ +#217#168'd'#255#217#168'd'#255#217#168'd'#255#217#168'd'#255#217#168'd'#255
+ +'YD)'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#189#147'W'#255#217#168'd'
+ +#255#217#168'd'#255#217#168'd'#255#217#168'd'#255#217#168'd'#255#217#168'd'
+ +#255#217#168'd'#255#216#168'd'#255#215#167'c'#255#213#164'a'#255#207#154']'
+ +#255#195#138'S'#255#179'tF'#255#139'R1'#255'`5'#30#255'\0'#28#255'K=7'#216'D'
+ +'DD'#191'DDD'#157'CCCcAAA+FFF'#11#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'+++'#6'EEE'#26'BBBIE?='
+ +#144'Z0'#28#252'^2'#29#255'zF*'#255#174'mB'#255#192#135'R'#255#205#152'\'#255
+ +#211#161'b'#255#214#165'd'#255#215#166'd'#255#215#166'd'#255#215#166'd'#255
+ +#215#166'd'#255#215#166'd'#255#215#166'd'#255#215#166'd'#255#215#166'd'#255
+ +#215#166'd'#255#215#166'd'#255#215#166'd'#255#215#166'd'#255#215#166'd'#255
+ +#215#166'd'#255#215#166'd'#255#215#166'd'#255#215#166'd'#255#215#166'd'#255
+ +#215#166'd'#255#215#166'd'#255#215#166'd'#255#215#166'd'#255#215#166'd'#255
+ +#215#166'd'#255#215#166'd'#255#215#166'd'#255#215#166'd'#255#215#166'd'#255
+ +#215#166'd'#255#215#166'd'#255#215#166'd'#255#215#166'd'#255'jR1'#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255'fN/'#255#215#166'd'#255#215#166'd'#255#215#166'd'
+ +#255#215#166'd'#255#215#166'd'#255#215#166'd'#255#215#166'd'#255#215#166'd'
+ +#255#215#167'e'#255#214#164'c'#255#210#159'a'#255#202#148'Z'#255#187#128'N'
+ +#255#168'f='#255'i;#'#255'\1'#28#255'V3#'#242'CCC'#197'DDD'#173'BBB{FFF>@@@'
+ +#20'@@@'#4#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#1'MMM'#10'FFF(CCC_R6*'#206'\0'#28#255'`5'#31#255#154'\8'
+ +#255#182'yJ'#255#199#144'Y'#255#208#156'`'#255#212#163'd'#255#213#165'd'#255
+ +#214#165'e'#255#214#165'e'#255#214#165'e'#255#214#165'e'#255#214#165'e'#255
+ +#214#165'e'#255#214#165'e'#255#214#165'e'#255#214#165'e'#255#214#165'e'#255
+ +#214#165'e'#255#214#165'e'#255#214#165'e'#255#214#165'e'#255#214#165'e'#255
+ +#214#165'e'#255#214#165'e'#255#214#165'e'#255#214#165'e'#255#214#165'e'#255
+ +#214#165'e'#255#214#165'e'#255#214#165'e'#255#214#165'e'#255#214#165'e'#255
+ +#214#165'e'#255#214#165'e'#255#214#165'e'#255#214#165'e'#255#214#165'e'#255
+ +#214#165'e'#255#214#165'e'#255#214#165'e'#255#135'h@'#255#2#1#1#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'b'
+ +'L/'#255#214#165'e'#255#214#165'e'#255#214#165'e'#255#214#165'e'#255#214#165
+ +'e'#255#214#165'e'#255#214#165'e'#255#214#165'e'#255#213#165'e'#255#213#164
+ +'d'#255#211#161'c'#255#206#154'^'#255#194#139'U'#255#177'sF'#255#135'P/'#255
+ +'^3'#29#255'[/'#27#255'J>9'#213'DDD'#185'CCC'#144'DDDSHHH III'#7#0#0#0#1#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'UUU'#3
+ +'<<<'#17'DDD8DBAyZ0'#29#248'\1'#28#255'uB'''#255#172'lA'#255#190#132'Q'#255
+ +#203#151'^'#255#209#160'c'#255#211#162'e'#255#212#163'e'#255#212#163'e'#255
+ +#212#163'e'#255#212#163'e'#255#212#163'e'#255#212#163'e'#255#212#163'e'#255
+ +#212#163'e'#255#212#163'e'#255#212#163'e'#255#212#163'e'#255#212#163'e'#255
+ +#212#163'e'#255#212#163'e'#255#212#163'e'#255#212#163'e'#255#212#163'e'#255
+ +#212#163'e'#255#212#163'e'#255#212#163'e'#255#212#163'e'#255#212#163'e'#255
+ +#212#163'e'#255#212#163'e'#255#212#163'e'#255#212#163'e'#255#212#163'e'#255
+ +#212#163'e'#255#212#163'e'#255#212#163'e'#255#212#163'e'#255#212#163'e'#255
+ +#212#163'e'#255#212#163'e'#255#212#163'e'#255#156'xK'#255#1#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'jQ2'#255#212
+ +#163'e'#255#212#163'e'#255#212#163'e'#255#212#163'e'#255#212#163'e'#255#212
+ +#163'e'#255#212#163'e'#255#212#163'e'#255#212#163'e'#255#212#162'e'#255#211
+ +#162'd'#255#208#158'b'#255#200#147'['#255#186'~M'#255#165'd<'#255'd8!'#255'\'
+ +'0'#28#255'T5'''#237'CCC'#193'DDD'#162'CCCjCCC.@@@'#12#0#0#0#2#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'333'#5'GGG'#25'BB'
+ +'BIN:1'#174'[/'#27#255'^2'#29#255#145'T3'#255#180'vI'#255#196#142'Y'#255#206
+ +#155'a'#255#209#161'e'#255#211#162'e'#255#211#162'e'#255#211#162'e'#255#211
+ +#162'e'#255#211#162'e'#255#211#162'e'#255#211#162'e'#255#211#162'e'#255#211
+ +#162'e'#255#211#162'e'#255#211#162'e'#255#211#162'e'#255#211#162'e'#255#211
+ ,#162'e'#255#211#162'e'#255#211#162'e'#255#211#162'e'#255#211#162'e'#255#211
+ +#162'e'#255#211#162'e'#255#211#162'e'#255#211#162'e'#255#211#162'e'#255#211
+ +#162'e'#255#211#162'e'#255#211#162'e'#255#211#162'e'#255#211#162'e'#255#211
+ +#162'e'#255#211#162'e'#255#211#162'e'#255#211#162'e'#255#211#162'e'#255#211
+ +#162'e'#255#211#162'e'#255#211#162'e'#255#211#162'e'#255'O=&'#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'sX7'#255#211
+ +#162'e'#255#211#162'e'#255#211#162'e'#255#211#162'e'#255#211#162'e'#255#211
+ +#162'e'#255#211#162'e'#255#211#162'e'#255#211#162'e'#255#211#162'e'#255#210
+ +#161'f'#255#209#159'd'#255#204#153'`'#255#192#135'U'#255#175'pE'#255'~H+'#255
+ +']0'#29#255'Z0'#28#253'FBA'#201'DDD'#176'CCC~FFF>CCC'#19'@@@'#4#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'999'#9'EEE%CCC[V3'
+ +'$'#222'\0'#27#255'f7!'#255#167'd>'#255#187#128'Q'#255#200#148'^'#255#207#156
+ +'d'#255#209#159'e'#255#209#160'e'#255#209#160'e'#255#209#160'e'#255#209#160
+ +'e'#255#209#160'e'#255#209#160'e'#255#209#160'e'#255#209#160'e'#255#209#160
+ +'e'#255#209#160'e'#255#209#160'e'#255#209#160'e'#255#209#160'e'#255#209#160
+ +'e'#255#209#160'e'#255#209#160'e'#255#151'tI'#255'2&'#25#255#27#21#13#255#15
+ +#12#7#255#7#5#3#255#7#5#3#255' '#25#16#255'P='''#255#151'tI'#255#209#160'e'
+ +#255#209#160'e'#255#209#160'e'#255#209#160'e'#255#209#160'e'#255#209#160'e'
+ +#255#209#160'e'#255#209#160'e'#255#209#160'e'#255#209#160'e'#255#209#160'e'
+ +#255#209#160'e'#255#209#160'e'#255#6#5#3#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#146'pF'#255#209#160'e'#255#209#160'e'#255
+ +#209#160'e'#255#209#160'e'#255#209#160'e'#255#209#160'e'#255#209#160'e'#255
+ +#209#160'e'#255#209#160'e'#255#209#160'e'#255#209#160'e'#255#209#159'e'#255
+ +#206#155'c'#255#198#143'['#255#182'zM'#255#151'Y6'#255'^3'#29#255'[/'#27#255
+ +'N:1'#222'DDD'#185'DDD'#142'DDDOIII'#28'+++'#6#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#2';;;'#13'DDD1F@=x[/'#28#253'\1'#28
+ +#255'~G+'#255#174'oE'#255#193#137'X'#255#203#151'b'#255#207#156'e'#255#207
+ +#158'f'#255#208#158'f'#255#208#158'f'#255#208#158'f'#255#208#158'f'#255#208
+ +#158'f'#255#208#158'f'#255#208#158'f'#255#208#158'f'#255#208#158'f'#255#208
+ +#158'f'#255#208#158'f'#255#208#158'f'#255#208#158'f'#255#208#158'f'#255'x[;'
+ +#255#15#12#8#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#4#3#2#255'bJ0'#255#208#158'f'#255#208#158'f'
+ +#255#208#158'f'#255#208#158'f'#255#208#158'f'#255#208#158'f'#255#208#158'f'
+ +#255#208#158'f'#255#208#158'f'#255#208#158'f'#255#208#158'f'#255'3'''#25#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#2#2#1#255#208#158'f'
+ +#255#208#158'f'#255#208#158'f'#255#208#158'f'#255#208#158'f'#255#208#158'f'
+ +#255#208#158'f'#255#208#158'f'#255#208#158'f'#255#208#158'f'#255#208#158'f'
+ +#255#208#158'f'#255#207#158'e'#255#206#156'd'#255#201#149'_'#255#189#131'T'
+ +#255#169'h@'#255'j:#'#255'\0'#28#255'V3#'#242'DDD'#191'CCC'#156'BBB`AAA''333'
+ +#10#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'@@@'#4'C'
+ +'CC'#19'EEE?Q7+'#179'[/'#27#255'^1'#29#255#152'X6'#255#181'yM'#255#197#144']'
+ +#255#204#153'c'#255#206#155'f'#255#206#156'e'#255#206#156'e'#255#206#156'e'
+ +#255#206#156'e'#255#206#156'e'#255#206#156'e'#255#206#156'e'#255#206#156'e'
+ +#255#206#156'e'#255#206#156'e'#255#206#156'e'#255#206#156'e'#255#206#156'e'
+ +#255#202#154'c'#255'6)'#27#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#14#10#7#255#178#135'W'#255#206#156'e'#255#206#156'e'#255#206#156'e'
+ +#255#206#156'e'#255#206#156'e'#255#206#156'e'#255#206#156'e'#255#206#156'e'
+ +#255#206#156'e'#255'WB+'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ ,#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#29#22#14#255#206#156'e'#255#206#156'e'#255#206#156'e'#255#206#156'e'
+ +#255#206#156'e'#255#206#156'e'#255#206#156'e'#255#206#156'e'#255#206#156'e'
+ +#255#206#156'e'#255#206#156'e'#255#206#156'e'#255#206#156'e'#255#205#156'e'
+ +#255#203#151'c'#255#194#139'Z'#255#176'qH'#255#131'K-'#255'\1'#28#255'[/'#27
+ +#255'HA='#204'DDD'#169'DDDqEEE4III'#14#128#128#128#2#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'+++'#6'BBB'#27'EEENW2!'#228'[/'#27#255'i9!'
+ +#255#168'e?'#255#187#130'T'#255#200#147'`'#255#203#153'e'#255#205#154'e'#255
+ +#205#154'e'#255#205#154'e'#255#205#154'e'#255#205#154'e'#255#205#154'e'#255
+ +#205#154'e'#255#205#154'e'#255#205#154'e'#255#205#154'e'#255#205#154'e'#255
+ +#205#154'e'#255#205#154'e'#255#199#150'a'#255#19#14#9#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#7#6#4#255#178#133'W'
+ +#255#205#154'e'#255#205#154'e'#255#205#154'e'#255#205#154'e'#255#205#154'e'
+ +#255#205#154'e'#255#205#154'e'#255#205#154'e'#255'S>)'#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#128'a?'#255#205#154'e'#255#205#154'e'
+ +#255#205#154'e'#255#205#154'e'#255#205#154'e'#255#205#154'e'#255#205#154'e'
+ +#255#205#154'e'#255#205#154'e'#255#205#154'e'#255#205#154'e'#255#205#154'e'
+ +#255#205#154'e'#255#204#154'e'#255#203#152'd'#255#197#145'^'#255#182'zO'#255
+ +#157'Z8'#255']1'#29#255'[/'#27#255'P9.'#226'CCC'#179'CCC'#129'CCCA@@@'#20'@@'
+ +'@'#4#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'999'#9'EEE%EA?'
+ +'b[/'#27#253'\0'#27#255#127'F*'#255#173'nG'#255#191#136'Z'#255#200#149'c'#255
+ +#202#152'e'#255#202#152'e'#255#202#153'e'#255#202#153'e'#255#202#153'e'#255
+ +#202#153'e'#255#202#153'e'#255#202#153'e'#255#202#153'e'#255#202#153'e'#255
+ +#202#153'e'#255#202#153'e'#255#202#153'e'#255#202#153'e'#255#31#24#16#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#11#8#6#255#200#151'e'#255#202#153'e'#255#202#153'e'#255#202
+ +#153'e'#255#202#153'e'#255#202#153'e'#255#202#153'e'#255#202#153'e'#255'O;'''
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255''''#29#19#255#202#153'e'#255
+ +#202#153'e'#255#202#153'e'#255#202#153'e'#255#202#153'e'#255#202#153'e'#255
+ +#202#153'e'#255#202#153'e'#255#202#153'e'#255#202#153'e'#255#202#153'e'#255
+ +#202#153'e'#255#202#153'e'#255#202#153'e'#255#202#152'e'#255#202#151'd'#255
+ +#199#147'b'#255#188#130'U'#255#168'e@'#255'k:"'#255'[/'#27#255'V3$'#241'CCC'
+ +#186'BBB'#142'EEENBBB'#27'+++'#6#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#2'@@@'#12'DDD-O:0'#146'[/'#27#255'\0'#28#255#145'R2'#255#179'wM'
+ +#255#194#141'^'#255#200#148'c'#255#201#150'e'#255#201#150'e'#255#201#150'e'
+ +#255#201#150'e'#255#201#150'e'#255#201#150'e'#255#201#150'e'#255#201#150'e'
+ +#255#201#150'e'#255#201#150'e'#255#201#150'e'#255#201#150'e'#255#201#150'e'
+ +#255';,'#30#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'S>*'#255#201#150'e'
+ +#255#201#150'e'#255#201#150'e'#255#201#150'e'#255#201#150'e'#255#201#150'e'
+ +#255#201#150'e'#255'K8&'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#29#22#14#255
+ +#184#138']'#255#201#150'e'#255#201#150'e'#255#201#150'e'#255#201#150'e'#255
+ ,#201#150'e'#255#201#150'e'#255#201#150'e'#255#201#150'e'#255#201#150'e'#255
+ +#201#150'e'#255#201#150'e'#255#201#150'e'#255#201#150'e'#255#201#150'e'#255
+ +#201#150'e'#255#200#149'd'#255#199#148'c'#255#191#136'['#255#173'mG'#255'}D('
+ +#255'\0'#27#255'Z0'#28#253'DBB'#192'CCC'#152'DDDZBBB#@@@'#8#0#0#0#1#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#128#128#2'III'#14'CCC5T5'''#190'[/'#27#255
+ +'_2'#29#255#162'^:'#255#184'}S'#255#195#142'`'#255#198#147'd'#255#199#148'd'
+ +#255#199#148'd'#255#199#148'd'#255#199#148'd'#255#199#148'd'#255#199#148'd'
+ +#255#199#148'd'#255#199#148'd'#255#199#148'd'#255#199#148'd'#255#199#148'd'
+ +#255#199#148'd'#255#147'mJ'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#3#2#1#255#195#144'b'#255#199#148'd'#255#199#148'd'#255#199#148'd'#255
+ +#199#148'd'#255#199#148'd'#255#199#148'd'#255'H6$'#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#3#2#1#255#23#17#12
+ +#255'qT8'#255#199#148'd'#255#199#148'd'#255#199#148'd'#255#199#148'd'#255#199
+ +#148'd'#255#199#148'd'#255#199#148'd'#255#199#148'd'#255#199#148'd'#255#199
+ +#148'd'#255#199#148'd'#255#199#148'd'#255#199#148'd'#255#199#148'd'#255#199
+ +#148'd'#255#199#148'd'#255#199#148'd'#255#199#148'd'#255#198#146'c'#255#193
+ +#140'^'#255#178'uN'#255#143'O1'#255'\0'#28#255'[/'#27#255'J=7'#208'CCC'#161
+ +'DDDfAAA+FFF'#11#0#0#0#2#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'UUU'#3'<<<'
+ +#17'CCC=X1 '#227'[/'#27#255'm:"'#255#167'eA'#255#187#130'X'#255#195#143'a'
+ +#255#196#144'c'#255#197#145'c'#255#197#145'c'#255#197#145'c'#255#197#145'c'
+ +#255#197#145'c'#255#197#145'c'#255#197#145'c'#255#197#145'c'#255#197#145'c'
+ +#255#197#145'c'#255#197#145'c'#255#197#145'c'#255#19#14#10#255#0#0#0#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#135'cD'#255#197#145'c'#255#197
+ +#145'c'#255#197#145'c'#255#197#145'c'#255#197#145'c'#255#197#145'c'#255'I5$'
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#19#14#10#255'4&'#26#255'cI2'#255
+ +#161'vP'#255#197#145'c'#255#197#145'c'#255#197#145'c'#255#197#145'c'#255#197
+ +#145'c'#255#197#145'c'#255#197#145'c'#255#197#145'c'#255#197#145'c'#255#197
+ +#145'c'#255#197#145'c'#255#197#145'c'#255#197#145'c'#255#197#145'c'#255#197
+ +#145'c'#255#197#145'c'#255#197#145'c'#255#197#145'c'#255#197#145'c'#255#197
+ +#145'c'#255#197#145'b'#255#196#144'c'#255#194#140'`'#255#182'|S'#255#159'\:'
+ +#255']2'#28#255'[/'#27#255'Q8-'#226'DDD'#168'DDDqAAA3NNN'#13#128#128#128#2#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'@@@'#4':::'#22'G@/[/'#27
+ +#254'[/'#27#255'}A&'#255#167'gD'#255#180'zW'#255#181'|Y'#255#181'|Y'#255#181
+ +'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'
+ +#255#181'|Y'#255#181'|Y'#255#181'|Y'#255#136']C'#255#0#0#0#255#0#0#0#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#19#13#9#255#151'gJ'#255#181'|Y'#255#181'|Y'#255#181
+ +'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'
+ +#255#181'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'#255#171'vU'#255'1"'#24#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#1#0#0#255'}V>'#255
+ +#181'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'#255#181
+ +'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'
+ +#255#181'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'#255
+ +#181'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'#255#181
+ +'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'#255#181'|Y'
+ +#255#181'|Y'#255#181'|Y'#255#178'wT'#255#161'];'#255'k8 '#255'[/'#27#255'V3#'
+ +#238'DDD'#151'CCCWFFF!@@@'#8#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#2'FFF'#11
+ +'K:3?[/'#27#255'[/'#27#255#131'F*'#255#169'iH'#255#179'xV'#255#180'zW'#255
+ +#180'{W'#255#180'{W'#255#180'{W'#255#180'{W'#255#180'{W'#255#180'{W'#255#180
+ +'{W'#255#180'{W'#255#180'{W'#255#180'{W'#255#180'{W'#255'<)'#29#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#1#1#1#255'O6&'#255#180'{W'#255#180'{W'#255#180'{W'#255#180
+ +'{W'#255#180'{W'#255#180'{W'#255#180'{W'#255#180'{W'#255#180'{W'#255#180'{W'
+ +#255#180'{W'#255#180'{W'#255#180'{W'#255#180'{W'#255#180'{W'#255#180'{W'#255
+ +#180'{W'#255#142'aE'#255#27#19#13#255#2#1#1#255#0#0#0#255#0#0#0#255#0#0#0#255
+ ,#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#8#5#4#255
+ +#135']A'#255#180'{W'#255#180'{W'#255#180'{W'#255#180'{W'#255#180'{W'#255#180
+ +'{W'#255#180'{W'#255#180'{W'#255#180'{W'#255'pL6'#255'+'#29#20#255'('#28#19
+ +#255'*'#28#20#255'+'#29#21#255'-'#30#21#255'fF2'#255#180'{W'#255#180'{W'#255
+ +#180'{W'#255#180'{W'#255#180'{W'#255#180'{W'#255#180'{W'#255#180'{W'#255#180
+ +'{W'#255#180'{W'#255#180'{W'#255#180'{W'#255#180'{W'#255#180'{W'#255#180'{W'
+ +#255#180'{W'#255#180'{W'#255#180'{W'#255#180'zX'#255#178'vU'#255#163'_>'#255
+ +'r<"'#255'[/'#27#255'X2!'#243'CCC'#152'BBBYDDD"@@@'#8#0#0#0#1#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#2'FFF'#11'N8.J[/'#27#255'[/'#27#255#135'H,'#255#170'kI'#255
+ +#178'wV'#255#179'yX'#255#179'yX'#255#179'yX'#255#179'yX'#255#179'yX'#255#179
+ +'yX'#255#179'yX'#255#179'yX'#255#179'yX'#255#179'yX'#255#179'yX'#255#179'yX'
+ +#255#16#11#8#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#19#13#10#255#150'fJ'#255#179'yX'#255#179
+ +'yX'#255#179'yX'#255#179'yX'#255#179'yX'#255#179'yX'#255#179'yX'#255#179'yX'
+ +#255#179'yX'#255#179'yX'#255#179'yX'#255#179'yX'#255#179'yX'#255#179'yX'#255
+ +#179'yX'#255#179'yX'#255#179'yX'#255#179'yX'#255#179'yX'#255#179'yX'#255#179
+ +'yX'#255'~V>'#255'=)'#30#255#19#13#9#255#1#1#1#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255'$'#24#17#255#172'uT'#255#179'yX'#255#179'yX'#255#179'yX'
+ +#255#179'yX'#255#179'yX'#255#179'yX'#255#179'yX'#255#158'kN'#255'=)'#30#255#6
+ +#4#3#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#6#4#3#255'?+'#31#255#164'oP'#255#179'yX'#255#179'yX'#255#179'yX'#255#179
+ +'yX'#255#179'yX'#255#179'yX'#255#179'yX'#255#179'yX'#255#179'yX'#255#179'yX'
+ +#255#179'yX'#255#179'yX'#255#179'yX'#255#179'yX'#255#179'yX'#255#179'yX'#255
+ +#177'uU'#255#164'b@'#255'v?%'#255'[/'#27#255'Y1'#31#246'CCC'#152'BBBYDDD"@@@'
+ +#8#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'FFF'#11'Q7+U[/'#27#255'\0'#28#255
+ +#139'J-'#255#171'lL'#255#177'wW'#255#178'wV'#255#178'wV'#255#178'wV'#255#178
+ +'wV'#255#178'wV'#255#178'wV'#255#178'wV'#255#178'wV'#255#178'wV'#255#178'wV'
+ +#255#178'wV'#255#172'sT'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#1#1#1#255'O5&'#255#178'wV'#255#178'wV'
+ +#255#178'wV'#255#178'wV'#255#178'wV'#255#178'wV'#255#178'wV'#255#178'wV'#255
+ +#178'wV'#255#178'wV'#255#178'wV'#255#178'wV'#255#178'wV'#255#178'wV'#255#178
+ +'wV'#255#178'wV'#255#178'wV'#255#178'wV'#255#178'wV'#255#178'wV'#255#178'wV'
+ +#255#178'wV'#255#178'wV'#255#178'wV'#255#178'wV'#255#178'wV'#255#176'wV'#255
+ +'vO9'#255'7%'#27#255#16#10#8#255#1#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0
+ +#0#255#0#0#0#255#11#8#6#255'9&'#28#255#137'\C'#255#178'wV'#255#178'wV'#255
+ +#178'wV'#255#178'wV'#255#178'wV'#255#178'wV'#255#178'wV'#255#178'wV'#255'M3%'
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#1#0#0#255'4"'#25#255#178'wV'
+ +#255#178'wV'#255#178'wV'#255#178'wV'#255#178'wV'#255#178'wV'#255#178'wV'#255
+ +#178'wV'#255#178'wV'#255#178'wV'#255#178'wV'#255#178'wV'#255#178'wV'#255#178
+ +'wV'#255#178'wV'#255#176'tT'#255#165'cC'#255'yA'''#255'[/'#27#255'Z0'#29#250
+ +'DDD'#150'CCCWFFF!III'#7#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'MMM'#10'R4'
+ +'''^[/'#27#255'\0'#28#255#142'M.'#255#171'nN'#255#177'uV'#255#177'wX'#255#177
+ +'wX'#255#177'wX'#255#177'wX'#255#177'wX'#255#177'wX'#255#177'wX'#255#177'wX'
+ +#255#177'wX'#255#177'wX'#255#177'wX'#255'gF3'#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#23#16#12#255#152'fK'#255#177
+ +'wX'#255#177'wX'#255#177'wX'#255#177'wX'#255#177'wX'#255#177'wX'#255#177'wX'
+ +#255#177'wX'#255#177'wX'#255#177'wX'#255#177'wX'#255#177'wX'#255#177'wX'#255
+ +#177'wX'#255#177'wX'#255#177'wX'#255#177'wX'#255#177'wX'#255#177'wX'#255#177
+ +'wX'#255#177'wX'#255#177'wX'#255#177'wX'#255#177'wX'#255#177'wX'#255#177'wX'
+ +#255#177'wX'#255#177'wX'#255#177'wX'#255#177'wX'#255#177'wX'#255#173'uV'#255
+ +#136'\D'#255#133'YB'#255#131'XA'#255#128'V@'#255#153'gL'#255#177'wX'#255#177
+ +'wX'#255#177'wX'#255#177'wX'#255#177'wX'#255#177'wX'#255#177'wX'#255#177'wX'
+ +#255#177'wX'#255#177'wX'#255'S8)'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255'"'#23#17#255#175'wX'#255#177'wX'#255#177
+ +'wX'#255#177'wX'#255#177'wX'#255#177'wX'#255#177'wX'#255#177'wX'#255#177'wX'
+ +#255#177'wX'#255#177'wX'#255#177'wX'#255#177'wX'#255#177'wX'#255#175'tU'#255
+ +#166'eE'#255'}B)'#255'\0'#28#255'[/'#28#253'CCC'#148'CCCTBBB'#31'III'#7#0#0#0
+ ,#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'999'#9'V4%h[/'#27#255'\0'#28#255#145'O0'
+ +#255#171'mN'#255#175'sU'#255#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255
+ +#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255#175
+ +'uW'#255'*'#29#21#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#2
+ +#1#1#255'X;,'#255#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255
+ +#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255#175
+ +'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'
+ +#255#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255
+ +#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255#175
+ +'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'
+ +#255#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255
+ +#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255'^?/'#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255'$'#24#18#255#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255
+ +#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255#175'uW'#255#175
+ +'uW'#255#175'uW'#255#175'uW'#255#175'sT'#255#166'eE'#255#128'D*'#255'\0'#28
+ +#255'[/'#27#255'ECB'#149'CCCP@@@'#28'UUU'#6#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#1'@@@'#8'W3#q[/'#27#255'\1'#29#255#150'Q1'#255#171'mN'#255#174'sU'#255
+ +#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175
+ +'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#15#10#8#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#4#3#2#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#29#19#14#255#156'iM'#255#175'uV'#255
+ +#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175
+ +'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'
+ +#255#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255
+ +#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175
+ +'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'
+ +#255#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255
+ +#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175
+ +'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#11#7#6#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255'sM9'#255#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255
+ +#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175'uV'#255#175
+ +'tV'#255#174'rS'#255#167'fG'#255#131'G,'#255'\0'#28#255'[/'#27#255'GA?'#150
+ +'CCCLGGG'#25'333'#5#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'III'#7'W3#k[/'#27
+ +#255'\1'#29#255#149'P2'#255#169'lM'#255#174'qT'#255#175'tV'#255#175'tV'#255
+ +#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175
+ +'tV'#255#175'tV'#255#175'tV'#255#9#6#4#255#0#0#0#255#0#0#0#255#0#0#0#255#136
+ +'ZC'#255'T8*'#255#1#1#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#7#5#3#255
+ +'bA0'#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'
+ +#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255
+ +#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175
+ +'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'
+ +#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255
+ +#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175
+ +'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'
+ +#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255
+ +#165'nR'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#10#7#5#255#175'tV'#255#175
+ +'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'#255#175'tV'
+ +#255#175'tV'#255#175'tV'#255#175'tV'#255#174'sU'#255#173'qR'#255#166'eG'#255
+ +#131'F,'#255'\0'#28#255'[/'#27#255'EA?'#145'DDDGFFF'#22'@@@'#4#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#1'333'#5'W3#\[/'#27#255'\1'#29#255#146'P3'#255#168
+ +'jM'#255#173'pT'#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'
+ +#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255
+ +#4#3#2#255#0#0#0#255#0#0#0#255#21#14#10#255#173'rU'#255#173'rU'#255#152'dK'
+ +#255'dB1'#255'A+ '#255'D-!'#255#141']E'#255#173'rU'#255#173'rU'#255#173'rU'
+ +#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255
+ +#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255#173
+ +'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'
+ ,#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255
+ +#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255#173
+ +'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'
+ +#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255
+ +#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255#169'pS'#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#139'\D'#255#173'rU'#255#173'rU'
+ +#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255#173'rU'#255
+ +#173'rU'#255#173'rU'#255#173'qT'#255#172'oR'#255#165'cF'#255#128'E+'#255'\0'
+ +#28#255'[/'#27#255'CBA'#132'DDD@CCC'#19'UUU'#3#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0'@@@'#4'U2"L[/'#27#255'\1'#29#255#143'N3'#255#168'hK'#255#172'oT'
+ +#255#173'qU'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255
+ +#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#1#1#1#255#0#0#0
+ +#255#0#0#0#255'nI7'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173
+ +'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'
+ +#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255
+ +#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173
+ +'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'
+ +#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255
+ +#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173
+ +'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'
+ +#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255
+ +#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#2#1#1#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255'H0$'#255#173'rV'#255#173'rV'#255#173'rV'
+ +#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255#173'rV'#255
+ +#173'rV'#255#173'qU'#255#171'nQ'#255#165'dF'#255'~D+'#255'\1'#29#255'Z0'#28
+ +#252'CCCzCCC9@@@'#16#128#128#128#2#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'U'
+ +'UU'#3'T2#=[/'#27#255'\1'#29#255#140'N1'#255#166'gI'#255#171'oR'#255#173'qU'
+ +#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255
+ +#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#1#1#1#255#27#18#13#255'a@0'
+ +#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255
+ +#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173
+ +'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'
+ +#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255
+ +#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173
+ +'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'
+ +#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255
+ +#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173
+ +'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'
+ +#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255'$'#24#18#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#31#20#15#255#173'qU'#255#173'qU'#255#173'qU'#255
+ +#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173'qU'#255#173
+ +'qU'#255#172'pT'#255#169'lP'#255#164'aD'#255'{C*'#255'\1'#29#255'Y0'#30#247
+ +'CCCoBBB2;;;'#13#0#0#0#2#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#128#128
+ +#2'V6''-[/'#27#255'\1'#29#255#137'L0'#255#165'fH'#255#170'mQ'#255#172'pT'#255
+ +#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#172
+ +'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#166'lS'#255#172'pU'#255#172'pU'
+ +#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255
+ +#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#172
+ +'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'
+ +#255#172'pU'#255#172'pU'#255#172'pU'#255#168'nS'#255#134'WB'#255'b@0'#255'tK'
+ +'9'#255#166'lS'#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'
+ +#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255
+ +#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#172
+ +'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'
+ +#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255
+ +#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#129'T@'#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ ,#255#0#0#0#255#0#0#0#255#22#14#11#255#172'pU'#255#172'pU'#255#172'pU'#255#172
+ +'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'#255#172'pU'
+ +#255#172'oT'#255#170'mP'#255#163'`C'#255'xB*'#255'\1'#29#255'Y1'#31#241'BBBd'
+ +'CCC*MMM'#10#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#2'T7*'#29
+ +'[/'#27#255'\1'#29#255#134'J0'#255#165'dG'#255#169'lQ'#255#171'pU'#255#172'q'
+ +'W'#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'
+ +#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255
+ +#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#172
+ +'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'
+ +#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255
+ +#135'YD'#255'$'#24#18#255#3#2#2#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#8#5#4#255#30#20#16#255'xO='#255#172'qW'#255#172'qW'#255#172'qW'#255
+ +#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#172
+ +'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'
+ +#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255
+ +#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#172
+ +'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#14#9#7#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#20#13#10#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'
+ +#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#172'qW'#255#171'oT'#255
+ +#169'jM'#255#162'_A'#255's>'''#255'\1'#29#255'X2 '#234'CCCXDDD"@@@'#8#0#0#0#1
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'C><'#9'[/'#27#247'\1'#29#255
+ +'}F-'#255#164'bE'#255#169'lO'#255#171'pT'#255#172'qV'#255#172'qV'#255#172'qV'
+ +#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255
+ +#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255#172
+ +'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'
+ +#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255
+ +#172'qV'#255#172'qV'#255#154'eM'#255#22#15#11#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#25#17#13#255#136'ZE'#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'
+ +#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255
+ +#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255#172
+ +'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'
+ +#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255
+ +#172'qV'#255'U7*'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#17#11#9#255#172'qV'#255#172
+ +'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'#255#172'qV'
+ +#255#172'qV'#255#172'qV'#255#171'oT'#255#168'jM'#255#161'^@'#255'k;%'#255'\0'
+ +#28#255'V3#'#220'CCCLEEE'#26'333'#5#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0'+++'#6'[/'#28#214'\1'#29#255't@)'#255#162'`B'#255#168'jO'#255
+ +#172'pV'#255#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#173
+ +'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'
+ +#255#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255
+ +#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#173
+ +'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#144'_I'#255#6#4#3
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'Z;-'#255
+ +#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#173
+ +'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'
+ +#255#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255
+ +#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#173
+ +'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#171'pV'#255#3#2#1#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255'!'#22#17#255#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'
+ +#255#173'rX'#255#173'rX'#255#173'rX'#255#173'rX'#255#172'qX'#255#171'oU'#255
+ +#167'hM'#255#160'[>'#255'b5!'#255'\0'#28#255'S5'''#196'EEE?CCC'#19'@@@'#4#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'UUU'#3'Z0'#29#176'\1'#29
+ +#255'k:%'#255#162'^A'#255#169'jN'#255#173'qV'#255#174'sY'#255#174'sY'#255#174
+ +'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'
+ +#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255
+ +#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174
+ ,'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'
+ +#255#151'dM'#255#4#2#2#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#1#1#1#255#136'YF'#255#174'sY'#255#174'sY'#255#174's'
+ +'Y'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'
+ +#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255
+ +#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174
+ +'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'
+ +#255#174'sY'#255'5#'#27#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'G.$'#255#174'sY'#255#174'sY'#255
+ +#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174
+ +'sY'#255#174'sY'#255#172'pV'#255#167'gK'#255#153'X:'#255'^3'#31#255'\0'#28
+ +#255'Q7+'#166'BBB2777'#14#0#0#0#2#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#2'Z0'#29#137'\0'#28#255'a5!'#255#160']>'#255#168'jN'#255
+ +#173'sY'#255#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255#175
+ +'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'
+ +#255#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255
+ +#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255#175
+ +'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255#29#20#15#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#8
+ +#5#4#255#169'rX'#255#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'
+ +#255#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255
+ +#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255#175
+ +'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'
+ +#255#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255#156'jR'#255#1#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255'yQ?'#255#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255
+ +#175'v\'#255#175'v\'#255#175'v\'#255#175'v\'#255#174'u['#255#172'qV'#255#166
+ +'gJ'#255#143'S6'#255'^2'#31#255'[/'#27#255'O;2'#130'CCC&999'#9#0#0#0#1#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'Z0'#29'a\0'#28#255
+ +'^3'#31#255#153'W;'#255#168'jN'#255#174'tZ'#255#176'x_'#255#176'y_'#255#176
+ +'y_'#255#176'y_'#255#176'y_'#255#176'y_'#255#176'y_'#255#176'y_'#255#176'y_'
+ +#255#176'y_'#255#176'y_'#255#176'y_'#255#176'y_'#255#176'y_'#255#176'y_'#255
+ +#176'y_'#255#176'y_'#255#176'y_'#255#176'y_'#255#176'y_'#255#176'y_'#255#176
+ +'y_'#255#176'y_'#255#176'y_'#255#176'y_'#255#176'y_'#255#176'y_'#255'oL='#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255']@2'#255#176'y_'#255#176'y_'#255#176
+ +'y_'#255#176'y_'#255#176'y_'#255#176'y_'#255'Z=1'#255')'#28#22#255#26#18#14
+ +#255#14#10#8#255#10#7#5#255#23#16#12#255'+'#30#23#255'E0&'#255#138'_J'#255
+ +#176'y_'#255#176'y_'#255#176'y_'#255#176'y_'#255#176'y_'#255#176'y_'#255#176
+ +'y_'#255#176'y_'#255#176'y_'#255#176'y_'#255#176'y_'#255#176'y_'#255#176'y_'
+ +#255#176'y_'#255'#'#24#19#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#172'w]'#255#176'y_'#255#176'y_'#255
+ +#176'y_'#255#176'y_'#255#176'y_'#255#176'y_'#255#176'y_'#255#176'y_'#255#176
+ +'y_'#255#175'w^'#255#172'rW'#255#165'fI'#255#134'K2'#255']1'#30#255'[/'#27
+ +#255'H?:ZBBB'#27'+++'#6#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0'X/'#29'7[/'#27#255'^2'#31#255#141'P5'#255#167'hK'#255#174
+ +'sY'#255#177'x_'#255#177'za'#255#177'za'#255#177'za'#255#177'za'#255#177'za'
+ +#255#177'za'#255#177'za'#255#177'za'#255#177'za'#255#177'za'#255#177'za'#255
+ +#177'za'#255#177'za'#255#177'za'#255#177'za'#255#177'za'#255#177'za'#255#177
+ +'za'#255#177'za'#255#177'za'#255#177'za'#255#177'za'#255#177'za'#255#177'za'
+ +#255#177'za'#255#177'za'#255#9#6#5#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255'%'#25#20#255#177'za'#255#177'za'#255#177'za'#255#177'za'#255'bD6'#255#8
+ +#6#4#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255'>+"'#255#175'za'#255#177'za'#255#177'za'#255#177'za'
+ +#255#177'za'#255#177'za'#255#177'za'#255#177'za'#255#177'za'#255#177'za'#255
+ +#177'za'#255#177'za'#255#177'za'#255#136'^K'#255#0#0#0#255#0#0#0#255#0#0#0
+ ,#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#16#11#9#255#177'za'#255#177
+ +'za'#255#177'za'#255#177'za'#255#177'za'#255#177'za'#255#177'za'#255#177'za'
+ +#255#177'za'#255#177'za'#255#176'x^'#255#172'qV'#255#164'cF'#255'{E,'#255']1'
+ +#30#255'Z0'#29#245'DDD'#255
+ +'`5!'#255'\0'#28#255'T5'''#155'DDD'#30'III'#7#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'Z/'#28'w\0'#28#255
+ +'`5!'#255#157'\?'#255#172'pU'#255#179'}d'#255#181#129'i'#255#182#129'j'#255
+ +#182#129'j'#255#182#129'j'#255#182#129'j'#255#182#129'j'#255#182#129'j'#255
+ +#182#129'j'#255#182#129'j'#255#182#129'j'#255#182#129'j'#255#182#129'j'#255
+ +#182#129'j'#255#182#129'j'#255#182#129'j'#255#182#129'j'#255#182#129'j'#255
+ +#182#129'j'#255#182#129'j'#255#182#129'j'#255#182#129'j'#255#182#129'j'#255
+ +#182#129'j'#255#182#129'j'#255#182#129'j'#255'.!'#27#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#2#1#1#255#166'va'#255#182#129'j'#255#182#129'j'#255'A.&'
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#9#6#5#255#170'yd'#255#182#129'j'#255#182#129'j'#255#182#129'j'#255#182
+ +#129'j'#255#182#129'j'#255#182#129'j'#255#182#129'j'#255#182#129'j'#255#182
+ +#129'j'#255#182#129'j'#255#182#129'j'#255#8#6#5#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#135'`O'#255#182#129'j'#255#182#129'j'#255#182#129'j'#255
+ +#182#129'j'#255#182#129'j'#255#182#129'j'#255#182#129'j'#255#182#129'j'#255
+ +#182#129'j'#255#182#129'j'#255#181#128'h'#255#177'za'#255#169'kP'#255#139'Q7'
+ +#255'^3'#31#255'\0'#28#255'N9/\GGG'#18'UUU'#3#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'X.'#26'4\0'#28#255
+ ,'^3'#31#255#141'S8'#255#170'mQ'#255#179'|c'#255#182#130'k'#255#184#132'm'#255
+ +#184#132'm'#255#184#132'm'#255#184#132'm'#255#184#132'm'#255#184#132'm'#255
+ +#184#132'm'#255#184#132'm'#255#184#132'm'#255#184#132'm'#255#184#132'm'#255
+ +#184#132'm'#255#184#132'm'#255#184#132'm'#255#184#132'm'#255#184#132'm'#255
+ +#184#132'm'#255#184#132'm'#255#184#132'm'#255#184#132'm'#255#184#132'm'#255
+ +#184#132'm'#255#184#132'm'#255#184#132'm'#255#20#15#12#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255'N8.'#255#184#132'm'#255#184#132'm'#255#184#132'm'
+ +#255#22#16#13#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#21#15#13#255#182#130'm'#255#184#132'm'#255#184#132
+ +'m'#255#184#132'm'#255#184#132'm'#255#184#132'm'#255#184#132'm'#255#184#132
+ +'m'#255#184#132'm'#255#184#132'm'#255#184#132'm'#255'N8.'#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#23#17#13#255#184#132'm'#255#184#132'm'#255#184#132'm'#255
+ +#184#132'm'#255#184#132'm'#255#184#132'm'#255#184#132'm'#255#184#132'm'#255
+ +#184#132'm'#255#184#132'm'#255#183#131'l'#255#182#129'j'#255#177'x_'#255#167
+ +'hK'#255'zG/'#255']1'#30#255'Z0'#28#241'@@@(MMM'#10#0#0#0#1#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'='#31
+ +#18#3'[/'#27#238']1'#30#255'{G/'#255#167'hL'#255#177'za'#255#183#131'l'#255
+ +#185#134'p'#255#185#134'p'#255#185#134'p'#255#185#134'p'#255#185#134'p'#255
+ +#185#134'p'#255#185#134'p'#255#185#134'p'#255#185#134'p'#255#185#134'p'#255
+ +#185#134'p'#255#185#134'p'#255#185#134'p'#255#185#134'p'#255#185#134'p'#255
+ +#185#134'p'#255#185#134'p'#255#185#134'p'#255#185#134'p'#255#185#134'p'#255
+ +#185#134'p'#255#185#134'p'#255#185#134'p'#255#185#134'p'#255#26#19#16#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#12#9#7#255#185#134'p'#255#185#134'p'#255#185#134'p'
+ +#255#185#134'p'#255#3#2#2#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'U>4'#255#185#134'p'#255#185
+ +#134'p'#255#185#134'p'#255#185#134'p'#255#185#134'p'#255#185#134'p'#255#185
+ +#134'p'#255#185#134'p'#255#185#134'p'#255#185#134'p'#255#185#134'p'#255#25#18
+ +#15#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255'xWI'#255#185#134'p'#255#185#134'p'#255#185#134
+ +'p'#255#185#134'p'#255#185#134'p'#255#185#134'p'#255#185#134'p'#255#185#134
+ +'p'#255#185#134'p'#255#185#134'p'#255#184#134'o'#255#182#129'j'#255#175'v\'
+ +#255#165'dG'#255'h;&'#255'\1'#29#255'X2 '#193'==='#25'+++'#6#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0'[/'#27#170'\1'#29#255'f9%'#255#164'bG'#255#175'v]'#255#183#131
+ +'l'#255#186#135'r'#255#186#137's'#255#186#137's'#255#186#137's'#255#186#137
+ +'s'#255#186#137's'#255#186#137's'#255#186#137's'#255#186#137's'#255#186#137
+ +'s'#255#186#137's'#255#186#137's'#255#186#137's'#255#186#137's'#255#186#137
+ +'s'#255#186#137's'#255#186#137's'#255#186#137's'#255#186#137's'#255#186#137
+ +'s'#255#186#137's'#255#186#137's'#255#186#137's'#255#186#137's'#255'$'#27#23
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#129'_P'#255#186#137's'#255#186#137's'#255
+ +#186#137's'#255#186#137's'#255#1#1#1#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255' '#23#19#255#186
+ +#137's'#255#186#137's'#255#186#137's'#255#186#137's'#255#186#137's'#255#186
+ +#137's'#255#186#137's'#255#186#137's'#255#186#137's'#255#186#137's'#255#186
+ +#137's'#255#172#127'j'#255#7#5#4#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#12#9#7#255#186#137's'#255#186#137's'
+ +#255#186#137's'#255#186#137's'#255#186#137's'#255#186#137's'#255#186#137's'
+ +#255#186#137's'#255#186#137's'#255#186#137's'#255#186#137's'#255#185#135'q'
+ +#255#181#129'i'#255#173'qW'#255#149'X='#255'`5!'#255'\0'#28#255'V4%'#127'333'
+ +#15#0#0#0#3#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'Z/'#27'O\0'#28#255'_4 '#255#144'U:'
+ +#255#172'qV'#255#182#130'k'#255#187#137't'#255#188#139'u'#255#188#140'v'#255
+ +#188#140'v'#255#188#140'v'#255#188#140'v'#255#188#140'v'#255#188#140'v'#255
+ +#188#140'v'#255#188#140'v'#255#188#140'v'#255#188#140'v'#255#188#140'v'#255
+ ,#188#140'v'#255#188#140'v'#255#188#140'v'#255#188#140'v'#255#188#140'v'#255
+ +#188#140'v'#255#188#140'v'#255#188#140'v'#255#188#140'v'#255#188#140'v'#255
+ +#188#140'v'#255'1$'#31#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255':+$'#255#188#140'v'#255#188#140
+ +'v'#255#188#140'v'#255#188#140'v'#255#188#140'v'#255#1#1#1#255#0#0#0#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#4#3#3#255#188#140'v'#255#188#140'v'#255#188#140'v'#255#188#140'v'#255
+ +#188#140'v'#255#188#140'v'#255#188#140'v'#255#188#140'v'#255#188#140'v'#255
+ +#188#140'v'#255#188#140'v'#255#188#140'v'#255#188#140'v'#255'}]N'#255'6("'
+ +#255#14#11#9#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'S>5'#255
+ +#188#140'v'#255#188#140'v'#255#188#140'v'#255#188#140'v'#255#188#140'v'#255
+ +#188#140'v'#255#188#140'v'#255#188#140'v'#255#188#140'v'#255#188#140'v'#255
+ +#188#139'u'#255#186#136'r'#255#180'~f'#255#169'kP'#255'|H1'#255'^2'#31#255'['
+ +'/'#27#249'L=6+III'#7#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27#5'[/'#27#235
+ +']1'#30#255'wD/'#255#169'jO'#255#180#127'g'#255#187#137'u'#255#189#141'x'#255
+ +#189#142'y'#255#189#142'y'#255#189#142'y'#255#189#142'y'#255#189#142'y'#255
+ +#189#142'y'#255#189#142'y'#255#189#142'y'#255#189#142'y'#255#189#142'y'#255
+ +#189#142'y'#255#189#142'y'#255#189#142'y'#255#189#142'y'#255#189#142'y'#255
+ +#189#142'y'#255#189#142'y'#255#189#142'y'#255#189#142'y'#255#189#142'y'#255
+ +#189#142'y'#255#189#142'y'#255'J7/'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#16#12#11#255#187#140'y'#255
+ +#189#142'y'#255#189#142'y'#255#189#142'y'#255#189#142'y'#255#189#142'y'#255#1
+ +#1#1#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#181#136'u'#255#189#142'y'#255#189#142
+ +'y'#255#189#142'y'#255#189#142'y'#255#189#142'y'#255#189#142'y'#255#189#142
+ +'y'#255#189#142'y'#255#189#142'y'#255#189#142'y'#255#189#142'y'#255#189#142
+ +'y'#255#189#142'y'#255#189#142'y'#255#189#142'y'#255#11#8#7#255#0#0#0#255#0#0
+ +#0#255#0#0#0#255#1#1#1#255#181#136's'#255#189#142'y'#255#189#142'y'#255#189
+ +#142'y'#255#189#142'y'#255#189#142'y'#255#189#142'y'#255#189#142'y'#255#189
+ +#142'y'#255#189#142'y'#255#189#142'y'#255#189#141'x'#255#186#136'q'#255#177
+ +'za'#255#164'dG'#255'f:&'#255'\1'#29#255'Y1'#31#186'@@@'#16'UUU'#3#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'Z/'#27#147'\1'#29#255'b8$'#255#160'bF'#255
+ +#177'y`'#255#186#137's'#255#190#143'z'#255#191#145'|'#255#191#145'|'#255#191
+ +#145'|'#255#191#145'|'#255#191#145'|'#255#191#145'|'#255#191#145'|'#255#191
+ +#145'|'#255#191#145'|'#255#191#145'|'#255#191#145'|'#255#191#145'|'#255#191
+ +#145'|'#255#191#145'|'#255#191#145'|'#255#191#145'|'#255#191#145'|'#255#191
+ +#145'|'#255#191#145'|'#255#191#145'|'#255#191#145'|'#255#191#145'|'#255#162
+ +'{i'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#1#1#1#255#162'{i'#255#191#145'|'#255#191#145'|'#255#191#145'|'#255
+ +#191#145'|'#255#191#145'|'#255#191#145'|'#255#2#1#1#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#1
+ +#1#1#255#191#145'|'#255#191#145'|'#255#191#145'|'#255#191#145'|'#255#191#145
+ +'|'#255#191#145'|'#255#191#145'|'#255#191#145'|'#255#191#145'|'#255#191#145
+ +'|'#255#191#145'|'#255#191#145'|'#255#191#145'|'#255#191#145'|'#255#191#145
+ +'|'#255#191#145'|'#255#5#4#3#255#0#0#0#255#0#0#0#255#0#0#0#255'&'#29#25#255
+ +#191#145'|'#255#191#145'|'#255#191#145'|'#255#191#145'|'#255#191#145'|'#255
+ +#191#145'|'#255#191#145'|'#255#191#145'|'#255#191#145'|'#255#191#145'|'#255
+ +#191#145'|'#255#189#142'y'#255#184#134'o'#255#174'sY'#255#143'U;'#255'`5!'
+ +#255'\0'#28#255'U3$`@@@'#8#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0'Z.'#27'5\0'#28#255'_4 '#255#137'Q8'#255#173'rX'#255#184#134'o'#255#190#144
+ +'{'#255#192#147#127#255#192#147#127#255#192#147#127#255#192#147#127#255#192
+ +#147#127#255#192#147#127#255#192#147#127#255#192#147#127#255#192#147#127#255
+ +#192#147#127#255#192#147#127#255#192#147#127#255#192#147#127#255#192#147#127
+ +#255#192#147#127#255#192#147#127#255#192#147#127#255#192#147#127#255#192#147
+ +#127#255#192#147#127#255#192#147#127#255#192#147#127#255#192#147#127#255#14
+ ,#11#9#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255' '
+ +#24#21#255#192#147#127#255#192#147#127#255#192#147#127#255#192#147#127#255
+ +#192#147#127#255#192#147#127#255#192#147#127#255#4#3#3#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#8#6#5#255#192#147#127#255#192#147#127#255#192#147#127#255#192#147#127
+ +#255#192#147#127#255#192#147#127#255#192#147#127#255#192#147#127#255#192#147
+ +#127#255#192#147#127#255#192#147#127#255#192#147#127#255#192#147#127#255#192
+ +#147#127#255#192#147#127#255#192#147#127#255#1#1#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#137'iZ'#255#192#147#127#255#192#147#127#255#192#147#127#255#192#147
+ +#127#255#192#147#127#255#192#147#127#255#192#147#127#255#192#147#127#255#192
+ +#147#127#255#192#147#127#255#192#146'~'#255#189#142'y'#255#182#129'j'#255#169
+ +'lP'#255'uD.'#255'^2'#31#255'[/'#28#237'NFB'#21'UUU'#3#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27#211']1'#30#255'l>)'#255#167'iM'
+ +#255#181#127'g'#255#190#143'z'#255#193#148#128#255#194#149#130#255#194#149
+ +#130#255#194#149#130#255#194#149#130#255#194#149#130#255#194#149#130#255#194
+ +#149#130#255#194#149#130#255#194#149#130#255#194#149#130#255#194#149#130#255
+ +#194#149#130#255#194#149#130#255#194#149#130#255#194#149#130#255#194#149#130
+ +#255#194#149#130#255#194#149#130#255#194#149#130#255#194#149#130#255#194#149
+ +#130#255#194#149#130#255'G60'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255'ZE<'#255#194#149#130#255#194#149#130#255#194#149#130#255
+ +#194#149#130#255#194#149#130#255#194#149#130#255#194#149#130#255#7#6#5#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#23#17#15#255#194#149#130#255#194#149#130#255#194#149#130
+ +#255#194#149#130#255#194#149#130#255#194#149#130#255#194#149#130#255#194#149
+ +#130#255#194#149#130#255#194#149#130#255#194#149#130#255#194#149#130#255#194
+ +#149#130#255#194#149#130#255#194#149#130#255#179#137'x'#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255'-#'#30#255#194#149#130#255#194#149#130#255#194#149#130#255#194
+ +#149#130#255#194#149#130#255#194#149#130#255#194#149#130#255#194#149#130#255
+ +#194#149#130#255#194#149#130#255#194#149#130#255#192#147#127#255#188#140'v'
+ +#255#177'za'#255#156'_D'#255'a6#'#255'\1'#29#255'Y1'#31#153'@@@'#8#0#0#0#1#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'Z/'#27']\0'#28#255
+ +'`5!'#255#143'V='#255#175'v]'#255#187#138'u'#255#193#149#129#255#195#152#132
+ +#255#195#152#133#255#195#152#133#255#195#152#133#255#195#152#133#255#195#152
+ +#133#255#195#152#133#255#195#152#133#255#195#152#133#255#195#152#133#255#195
+ +#152#133#255#195#152#133#255#195#152#133#255#195#152#133#255#195#152#133#255
+ +#195#152#133#255#195#152#133#255#195#152#133#255#195#152#133#255#195#152#133
+ +#255#195#152#133#255#195#152#133#255#170#133't'#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#172#133'u'#255#195#152#133#255#195#152
+ +#133#255#195#152#133#255#195#152#133#255#195#152#133#255#195#152#133#255#146
+ +'rd'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'_JA'#255#195#152#133#255#195#152#133
+ +#255#195#152#133#255#195#152#133#255#195#152#133#255#195#152#133#255#195#152
+ +#133#255#195#152#133#255#195#152#133#255#195#152#133#255#195#152#133#255#195
+ +#152#133#255#195#152#133#255#195#152#133#255#195#152#133#255#140'm`'#255#0#0
+ +#0#255#0#0#0#255#6#5#4#255#186#145#127#255#195#152#133#255#195#152#133#255
+ +#195#152#133#255#195#152#133#255#195#152#133#255#195#152#133#255#195#152#133
+ +#255#195#152#133#255#195#152#133#255#195#152#133#255#195#152#132#255#192#147
+ +#127#255#185#134'p'#255#172'pU'#255'|I2'#255'^3'#31#255'\0'#28#250'R5()UUU'#3
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27#3
+ +'[/'#27#221']1'#30#255'oA,'#255#169'lP'#255#183#131'l'#255#192#147#127#255
+ +#196#154#135#255#197#155#136#255#197#155#136#255#197#155#136#255#197#155#136
+ +#255#197#155#136#255#197#155#136#255#197#155#136#255#197#155#136#255#197#155
+ +#136#255#197#155#136#255#197#155#136#255#197#155#136#255#197#155#136#255#197
+ +#155#136#255#197#155#136#255#197#155#136#255#197#155#136#255#197#155#136#255
+ +#197#155#136#255#197#155#136#255#197#155#136#255#197#155#136#255#26#20#18#255
+ ,#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#8#6#5#255#197#155#136#255#197
+ +#155#136#255#197#155#136#255#197#155#136#255#197#155#136#255#197#155#136#255
+ +#197#155#136#255#28#22#19#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#4#3#3#255#193#153#134#255
+ +#197#155#136#255#197#155#136#255#197#155#136#255#197#155#136#255#197#155#136
+ +#255#197#155#136#255#197#155#136#255#197#155#136#255#197#155#136#255#197#155
+ +#136#255#197#155#136#255#197#155#136#255#197#155#136#255#197#155#136#255#197
+ +#155#136#255#182#143'~'#255'=0*'#255#7#5#5#255#130'fY'#255#197#155#136#255
+ +#197#155#136#255#197#155#136#255#197#155#136#255#197#155#136#255#197#155#136
+ +#255#197#155#136#255#197#155#136#255#197#155#136#255#197#155#136#255#196#154
+ +#136#255#195#152#133#255#190#144'{'#255#180'~f'#255#159'bG'#255'c8%'#255'\1'
+ +#29#255'Z0'#30#163'III'#7#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27'g\0'#28#255'a6#'#255#147'Y@'#255#177
+ +'za'#255#190#143'z'#255#196#154#135#255#198#157#139#255#198#157#139#255#198
+ +#157#139#255#198#157#139#255#198#157#139#255#198#157#139#255#198#157#139#255
+ +#198#157#139#255#198#157#139#255#198#157#139#255#198#157#139#255#198#157#139
+ +#255#198#157#139#255#198#157#139#255#198#157#139#255#198#157#139#255#198#157
+ +#139#255#198#157#139#255#198#157#139#255#198#157#139#255#198#157#139#255#198
+ +#157#139#255'<0+'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'*!'#29#255
+ +#198#157#139#255#198#157#139#255#198#157#139#255#198#157#139#255#198#157#139
+ +#255#198#157#139#255#164#130's'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'?2,'#255#198
+ +#157#139#255#198#157#139#255#198#157#139#255#198#157#139#255#198#157#139#255
+ +#198#157#139#255#198#157#139#255#198#157#139#255#198#157#139#255#198#157#139
+ +#255#198#157#139#255#198#157#139#255#198#157#139#255#198#157#139#255#198#157
+ +#139#255#198#157#139#255#198#157#139#255#198#157#139#255#198#157#139#255#198
+ +#157#139#255#198#157#139#255#198#157#139#255#198#157#139#255#198#157#139#255
+ +#198#157#139#255#198#157#139#255#198#157#139#255#198#157#139#255#198#157#139
+ +#255#198#157#139#255#198#156#138#255#195#152#132#255#187#138't'#255#173'sY'
+ +#255#127'L5'#255'^3'#31#255'\0'#28#252'U3$,'#128#128#128#2#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27#7
+ +'[/'#27#229'^2'#31#255'qB.'#255#171'nS'#255#185#134'p'#255#194#151#131#255
+ +#198#158#140#255#200#160#142#255#200#160#142#255#200#160#142#255#200#160#142
+ +#255#200#160#142#255#200#160#142#255#200#160#142#255#200#160#142#255#200#160
+ +#142#255#200#160#142#255#200#160#142#255#200#160#142#255#200#160#142#255#200
+ +#160#142#255#200#160#142#255#200#160#142#255#200#160#142#255#200#160#142#255
+ +#200#160#142#255#200#160#142#255#200#160#142#255'9.)'#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255'hSJ'#255#200#160#142#255#200#160#142#255#200#160#142
+ +#255#200#160#142#255#200#160#142#255#200#160#142#255'6+'''#255#0#0#0#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#6#5#5#255#184#148#131#255#200#160#142#255#200#160#142#255#200#160#142
+ +#255#200#160#142#255#200#160#142#255#200#160#142#255#200#160#142#255#200#160
+ +#142#255#200#160#142#255#200#160#142#255#200#160#142#255#200#160#142#255#200
+ +#160#142#255#200#160#142#255#200#160#142#255#200#160#142#255#200#160#142#255
+ +#200#160#142#255#200#160#142#255#200#160#142#255#200#160#142#255#200#160#142
+ +#255#200#160#142#255#200#160#142#255#200#160#142#255#200#160#142#255#200#160
+ +#142#255#200#160#142#255#200#160#142#255#199#159#141#255#198#157#139#255#192
+ +#147#127#255#181#127'g'#255#161'dI'#255'd:&'#255'\1'#29#255'Z0'#29#171'@@@'#4
+ +#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27'q\1'#29#255'a6#'#255#143'W?'#255#177'za'#255
+ +#191#144'|'#255#198#157#139#255#200#161#144#255#201#162#145#255#201#163#145
+ +#255#201#163#145#255#201#163#145#255#201#163#145#255#201#163#145#255#201#163
+ +#145#255#201#163#145#255#201#163#145#255#201#163#145#255#201#163#145#255#201
+ +#163#145#255#201#163#145#255#201#163#145#255#201#163#145#255#201#163#145#255
+ +#201#163#145#255#201#163#145#255#201#163#145#255#201#163#145#255'=2,'#255#0#0
+ ,#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255'!'#27#24#255#197#161#143#255#201#163#145#255
+ +#201#163#145#255#201#163#145#255#201#163#145#255#201#163#145#255#197#161#143
+ +#255#3#2#2#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#1#1#1#255#149'zl'#255#201#163#145#255#201#163#145
+ +#255#201#163#145#255#201#163#145#255#201#163#145#255#201#163#145#255#201#163
+ +#145#255#201#163#145#255#201#163#145#255#201#163#145#255#201#163#145#255#201
+ +#163#145#255#201#163#145#255#201#163#145#255#201#163#145#255#201#163#145#255
+ +#201#163#145#255#201#163#145#255#201#163#145#255#201#163#145#255#201#163#145
+ +#255#201#163#145#255#201#163#145#255#201#163#145#255#201#163#145#255#201#163
+ +#145#255#201#163#145#255#201#163#145#255#201#163#145#255#201#162#145#255#200
+ +#161#143#255#197#155#136#255#187#138'u'#255#173'rX'#255'|I3'#255'_4 '#255'\0'
+ +#28#253'W1 2'#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27#6'\0'#28#216'^2'#31#255
+ +'i=)'#255#165'jP'#255#184#133'n'#255#196#152#134#255#201#162#145#255#202#164
+ +#148#255#202#165#148#255#202#165#148#255#202#165#148#255#202#165#148#255#202
+ +#165#148#255#202#165#148#255#202#165#148#255#202#165#148#255#202#165#148#255
+ +#202#165#148#255#202#165#148#255#202#165#148#255#202#165#148#255#202#165#148
+ +#255#202#165#148#255#202#165#148#255#202#165#148#255#202#165#148#255#202#165
+ +#148#255'E82'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#2#2#2#255#1#1#1#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'.&"'#255#202#165#148#255#202#165#148
+ +#255#202#165#148#255#202#165#148#255#202#165#148#255#202#165#148#255#202#165
+ +#148#255#146'wk'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'eRI'#255#202#165#148#255#202#165#148
+ +#255#202#165#148#255#202#165#148#255#202#165#148#255#202#165#148#255#202#165
+ +#148#255#202#165#148#255#202#165#148#255#202#165#148#255#202#165#148#255#202
+ +#165#148#255#202#165#148#255#202#165#148#255#202#165#148#255#202#165#148#255
+ +#202#165#148#255#202#165#148#255#202#165#148#255#202#165#148#255#202#165#148
+ +#255#202#165#148#255#202#165#148#255#202#165#148#255#202#165#148#255#202#165
+ +#148#255#202#165#148#255#202#165#148#255#202#165#148#255#202#165#148#255#202
+ +#164#147#255#200#160#143#255#193#148#128#255#180'~f'#255#151'^D'#255'a7$'#255
+ +'\1'#29#255'Z0'#28#156'UUU'#3#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27
+ +'D\0'#28#255'`5!'#255#128'N8'#255#175'v]'#255#190#143'{'#255#200#159#142#255
+ +#203#165#150#255#204#167#151#255#204#167#151#255#204#167#151#255#204#167#151
+ +#255#204#167#151#255#204#167#151#255#204#167#151#255#204#167#151#255#204#167
+ +#151#255#204#167#151#255#204#167#151#255#204#167#151#255#204#167#151#255#204
+ +#167#151#255#204#167#151#255#204#167#151#255#204#167#151#255#204#167#151#255
+ +#204#167#151#255'N?9'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'vaW'#255
+ +#204#167#151#255#160#131'w'#255'cRI'#255'WG@'#255#168#137'|'#255#204#167#151
+ +#255#204#167#151#255#204#167#151#255#204#167#151#255#204#167#151#255#204#167
+ +#151#255#204#167#151#255#204#167#151#255#145'wk'#255#0#0#0#255#0#0#0#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'G:4'#255#204#167
+ +#151#255#204#167#151#255#204#167#151#255#204#167#151#255#204#167#151#255#204
+ +#167#151#255#204#167#151#255#204#167#151#255#204#167#151#255#204#167#151#255
+ +#204#167#151#255#204#167#151#255#204#167#151#255#204#167#151#255#204#167#151
+ +#255#204#167#151#255#204#167#151#255#204#167#151#255#204#167#151#255#204#167
+ +#151#255#204#167#151#255#204#167#151#255#204#167#151#255#204#167#151#255#204
+ +#167#151#255#204#167#151#255#204#167#151#255#204#167#151#255#204#167#151#255
+ +#204#167#151#255#204#167#150#255#202#165#148#255#198#155#138#255#186#137's'
+ +#255#171'nU'#255'oB.'#255'^2'#31#255'\0'#28#235'V2"'#21#0#0#0#1#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27#169'\1'#29#255'c9&'#255#155'aH'#255
+ +#182#128'j'#255#195#152#133#255#202#164#148#255#205#169#154#255#206#169#155
+ +#255#206#169#155#255#206#169#155#255#206#169#155#255#206#169#155#255#206#169
+ +#155#255#206#169#155#255#206#169#155#255#206#169#155#255#206#169#155#255#206
+ +#169#155#255#206#169#155#255#206#169#155#255#206#169#155#255#206#169#155#255
+ +#206#169#155#255#206#169#155#255#206#169#155#255'VGA'#255#0#0#0#255#0#0#0#255
+ ,#0#0#0#255#5#4#4#255#206#169#155#255#206#169#155#255#206#169#155#255#206#169
+ +#155#255#206#169#155#255#206#169#155#255#206#169#155#255#206#169#155#255#206
+ +#169#155#255#206#169#155#255#206#169#155#255#206#169#155#255#206#169#155#255
+ +#206#169#155#255#152'}r'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#2#1#1#255'vaY'#255#206#169#155#255#206#169#155#255#206#169
+ +#155#255#206#169#155#255#206#169#155#255#206#169#155#255#206#169#155#255#206
+ +#169#155#255#206#169#155#255#206#169#155#255#206#169#155#255#206#169#155#255
+ +#206#169#155#255#206#169#155#255#206#169#155#255#206#169#155#255#206#169#155
+ +#255#206#169#155#255#206#169#155#255#206#169#155#255#206#169#155#255#206#169
+ +#155#255#206#169#155#255#206#169#155#255#206#169#155#255#206#169#155#255#206
+ +#169#155#255#206#169#155#255#206#169#155#255#206#169#155#255#206#169#155#255
+ +#205#167#152#255#201#162#145#255#192#147#127#255#177'za'#255#138'T='#255'`6"'
+ +#255'\1'#29#255'[0'#29'e'#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0'[/'#27#27'\0'#28#243'^3'#31#255'pC/'#255#171'oU'#255#188#138'u'
+ +#255#199#158#141#255#205#169#154#255#207#171#157#255#207#172#158#255#207#172
+ +#158#255#207#172#158#255#207#172#158#255#207#172#158#255#207#172#158#255#207
+ +#172#158#255#207#172#158#255#207#172#158#255#207#172#158#255#207#172#158#255
+ +#207#172#158#255#207#172#158#255#207#172#158#255#207#172#158#255#207#172#158
+ +#255#207#172#158#255'~i`'#255#0#0#0#255#0#0#0#255#0#0#0#255#22#18#16#255#207
+ +#172#158#255#207#172#158#255#207#172#158#255#207#172#158#255#207#172#158#255
+ +#207#172#158#255#207#172#158#255#207#172#158#255#207#172#158#255#207#172#158
+ +#255#207#172#158#255#207#172#158#255#207#172#158#255#207#172#158#255#207#172
+ +#158#255'/''$'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#9#7#7#255
+ +#164#136'~'#255#207#172#158#255#207#172#158#255#207#172#158#255#207#172#158
+ +#255#207#172#158#255#207#172#158#255#207#172#158#255#207#172#158#255#207#172
+ +#158#255#207#172#158#255#207#172#158#255#207#172#158#255#207#172#158#255#207
+ +#172#158#255#207#172#158#255#207#172#158#255#207#172#158#255#207#172#158#255
+ +#207#172#158#255#207#172#158#255#207#172#158#255#207#172#158#255#207#172#158
+ +#255#207#172#158#255#207#172#158#255#207#172#158#255#207#172#158#255#207#172
+ +#158#255#207#172#158#255#207#172#158#255#207#172#158#255#207#171#157#255#204
+ +#167#151#255#196#153#136#255#183#131'l'#255#160'fK'#255'f;('#255']1'#30#255
+ +'[/'#27#199'te^'#3#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0'[/'#27'q\0'#28#255'`6"'#255#130'P9'#255#177'x`'#255#192#146
+ +#127#255#203#164#149#255#208#173#159#255#209#175#161#255#209#175#161#255#209
+ +#175#161#255#209#175#161#255#209#175#161#255#209#175#161#255#209#175#161#255
+ +#209#175#161#255#209#175#161#255#209#175#161#255#209#175#161#255#209#175#161
+ +#255#209#175#161#255#209#175#161#255#209#175#161#255#209#175#161#255#209#175
+ +#161#255#199#167#153#255#0#0#0#255#0#0#0#255#0#0#0#255'.'#255#209#175#161
+ +#255#209#175#161#255#209#175#161#255#209#175#161#255#209#175#161#255#209#175
+ +#161#255#209#175#161#255#209#175#161#255#209#175#161#255#209#175#161#255#209
+ +#175#161#255#209#175#161#255#209#175#161#255#209#175#161#255#209#175#161#255
+ +#209#175#161#255'*$!'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'"'#28#26#255#197#165#153#255
+ +#209#175#161#255#209#175#161#255#209#175#161#255#209#175#161#255#209#175#161
+ +#255#209#175#161#255#209#175#161#255#209#175#161#255#209#175#161#255#209#175
+ +#161#255#209#175#161#255#209#175#161#255#209#175#161#255#209#175#161#255#209
+ +#175#161#255#209#175#161#255#209#175#161#255#209#175#161#255#209#175#161#255
+ +#209#175#161#255#209#175#161#255#209#175#161#255#209#175#161#255#209#175#161
+ +#255#209#175#161#255#209#175#161#255#209#175#161#255#209#175#161#255#209#175
+ +#161#255#209#175#161#255#209#175#161#255#209#174#160#255#207#171#157#255#200
+ +#160#144#255#188#139'w'#255#171'pV'#255'rD0'#255'^3'#31#255'\0'#28#250'\2'#30
+ +'1'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0'[/'#27#1'[/'#27#184']1'#30#255'c9&'#255#148'^E'#255#182#128'j'#255#197
+ +#154#136#255#206#170#155#255#210#176#163#255#211#178#164#255#211#178#165#255
+ +#211#178#165#255#211#178#165#255#211#178#165#255#211#178#165#255#211#178#165
+ +#255#211#178#165#255#211#178#165#255#211#178#165#255#211#178#165#255#211#178
+ ,#165#255#211#178#165#255#211#178#165#255#211#178#165#255#211#178#165#255#211
+ +#178#165#255#12#10#9#255#0#0#0#255#0#0#0#255'MA<'#255#211#178#165#255#211#178
+ +#165#255#211#178#165#255#211#178#165#255#211#178#165#255#211#178#165#255#211
+ +#178#165#255#211#178#165#255#211#178#165#255#211#178#165#255#211#178#165#255
+ +#211#178#165#255#211#178#165#255#211#178#165#255#211#178#165#255#211#178#165
+ +#255#211#178#165#255#178#150#139#255'D95'#255#9#7#7#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'VIC'#255#211#178#165#255#211#178#165
+ +#255#211#178#165#255#211#178#165#255#211#178#165#255#211#178#165#255#211#178
+ +#165#255#211#178#165#255#211#178#165#255#211#178#165#255#211#178#165#255#211
+ +#178#165#255#211#178#165#255#211#178#165#255#211#178#165#255#211#178#165#255
+ +#211#178#165#255#211#178#165#255#211#178#165#255#211#178#165#255#211#178#165
+ +#255#211#178#165#255#211#178#165#255#211#178#165#255#211#178#165#255#211#178
+ +#165#255#211#178#165#255#211#178#165#255#211#178#165#255#211#178#165#255#211
+ +#178#165#255#211#178#165#255#211#178#164#255#209#176#162#255#204#167#151#255
+ +#193#148#129#255#177'x`'#255#129'P9'#255'`6"'#255'\0'#28#255'[0'#28't'#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0'[/'#27#21'\0'#28#229'^2'#31#255'i?+'#255#163'jP'#255#186#136
+ +'s'#255#200#160#144#255#209#174#160#255#212#180#167#255#213#181#169#255#213
+ +#181#169#255#213#181#169#255#213#181#169#255#213#181#169#255#213#181#169#255
+ +#213#181#169#255#213#181#169#255#213#181#169#255#213#181#169#255#213#181#169
+ +#255#213#181#169#255#213#181#169#255#213#181#169#255#213#181#169#255#213#181
+ +#169#255'.''%'#255#0#0#0#255',%#'#255#200#170#159#255#213#181#169#255#213#181
+ +#169#255#213#181#169#255#213#181#169#255#213#181#169#255#213#181#169#255#213
+ +#181#169#255#213#181#169#255#213#181#169#255#213#181#169#255#213#181#169#255
+ +#213#181#169#255#213#181#169#255#213#181#169#255#213#181#169#255#213#181#169
+ +#255#213#181#169#255#213#181#169#255#213#181#169#255#139'vo'#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'.''$'#255#213#181#169#255#213#181#169
+ +#255#213#181#169#255#213#181#169#255#213#181#169#255#213#181#169#255#213#181
+ +#169#255#213#181#169#255#213#181#169#255#213#181#169#255#213#181#169#255#213
+ +#181#169#255#213#181#169#255#213#181#169#255#213#181#169#255#213#181#169#255
+ +#213#181#169#255#213#181#169#255#213#181#169#255#213#181#169#255#213#181#169
+ +#255#213#181#169#255#213#181#169#255#213#181#169#255#213#181#169#255#213#181
+ +#169#255#213#181#169#255#213#181#169#255#213#181#169#255#213#181#169#255#213
+ +#181#169#255#213#181#169#255#212#180#168#255#211#178#165#255#207#171#157#255
+ +#197#155#137#255#182#128'j'#255#148']E'#255'c9&'#255']1'#30#255'[/'#27#179#0
+ +#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27'?\0'#28#252'_4 '#255'tF1'#255#172
+ +'sY'#255#190#142'z'#255#203#165#150#255#211#178#164#255#213#183#170#255#214
+ +#184#172#255#214#184#172#255#214#184#172#255#214#184#172#255#214#184#172#255
+ +#214#184#172#255#214#184#172#255#214#184#172#255#214#184#172#255#214#184#172
+ +#255#214#184#172#255#214#184#172#255#214#184#172#255#214#184#172#255#214#184
+ +#172#255#127'ng'#255'{ib'#255#214#184#172#255#214#184#172#255#214#184#172#255
+ +#214#184#172#255#214#184#172#255#214#184#172#255#214#184#172#255#214#184#172
+ +#255#214#184#172#255#214#184#172#255#214#184#172#255#214#184#172#255#214#184
+ +#172#255#214#184#172#255#214#184#172#255#214#184#172#255#214#184#172#255#214
+ +#184#172#255#214#184#172#255#214#184#172#255#214#184#172#255' '#28#26#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#14#12#11#255#209#180#168#255#214#184#172
+ +#255#214#184#172#255#214#184#172#255#214#184#172#255#214#184#172#255#214#184
+ +#172#255#214#184#172#255#214#184#172#255#214#184#172#255#214#184#172#255#214
+ +#184#172#255#214#184#172#255#214#184#172#255#214#184#172#255#214#184#172#255
+ +#214#184#172#255#214#184#172#255#214#184#172#255#214#184#172#255#214#184#172
+ +#255#214#184#172#255#214#184#172#255#214#184#172#255#214#184#172#255#214#184
+ +#172#255#214#184#172#255#214#184#172#255#214#184#172#255#214#184#172#255#214
+ +#184#172#255#214#184#172#255#214#184#172#255#213#182#169#255#209#176#161#255
+ +#200#161#143#255#186#135'q'#255#161'gO'#255'h=*'#255'^2'#31#255'\0'#28#226'W'
+ +'-'#26#19#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27'}\1'#29#255'`6"'
+ +#255'|M8'#255#175'x^'#255#192#147#127#255#205#170#154#255#213#181#169#255#215
+ ,#185#173#255#216#187#175#255#216#187#175#255#216#187#175#255#216#187#175#255
+ +#216#187#175#255#216#187#175#255#216#187#175#255#216#187#175#255#216#187#175
+ +#255#216#187#175#255#216#187#175#255#216#187#175#255#216#187#175#255#216#187
+ +#175#255#216#187#175#255#216#187#175#255#216#187#175#255#216#187#175#255#216
+ +#187#175#255#216#187#175#255#216#187#175#255#216#187#175#255#216#187#175#255
+ +#216#187#175#255#216#187#175#255#216#187#175#255#216#187#175#255#216#187#175
+ +#255#216#187#175#255#216#187#175#255#216#187#175#255#216#187#175#255#216#187
+ +#175#255#216#187#175#255#216#187#175#255#216#187#175#255#187#162#151#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#2#2#2#255#180#156#146#255#216#187#175
+ +#255#216#187#175#255#216#187#175#255#216#187#175#255#216#187#175#255#216#187
+ +#175#255#216#187#175#255#216#187#175#255#216#187#175#255#216#187#175#255#216
+ +#187#175#255#216#187#175#255#216#187#175#255#216#187#175#255#216#187#175#255
+ +#216#187#175#255#216#187#175#255#216#187#175#255#216#187#175#255#216#187#175
+ +#255#216#187#175#255#216#187#175#255#216#187#175#255#216#187#175#255#216#187
+ +#175#255#216#187#175#255#216#187#175#255#216#187#175#255#216#187#175#255#216
+ +#187#175#255#216#187#175#255#216#187#175#255#215#185#173#255#211#179#166#255
+ +#202#165#148#255#188#139'w'#255#167'mU'#255'nC/'#255'^3'#31#255'\0'#28#251'Z'
+ +'.'#27';'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27#2'[/'#27
+ +#170'\1'#29#255'a7$'#255#130'Q<'#255#178'{c'#255#195#151#132#255#208#173#159
+ +#255#215#185#173#255#217#189#178#255#217#189#178#255#217#189#178#255#217#189
+ +#178#255#217#189#178#255#217#189#178#255#217#189#178#255#217#189#178#255#217
+ +#189#178#255#217#189#178#255#217#189#178#255#217#189#178#255#217#189#178#255
+ +#217#189#178#255#217#189#178#255#217#189#178#255#217#189#178#255#217#189#178
+ +#255#217#189#178#255#217#189#178#255#217#189#178#255#217#189#178#255#217#189
+ +#178#255#217#189#178#255#217#189#178#255#217#189#178#255#217#189#178#255#217
+ +#189#178#255#217#189#178#255#217#189#178#255#217#189#178#255#217#189#178#255
+ +#217#189#178#255#217#189#178#255#217#189#178#255#217#189#178#255'.(&'#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#128'oi'#255#217#189#178#255#217#189#178
+ +#255#217#189#178#255#217#189#178#255#217#189#178#255#217#189#178#255#217#189
+ +#178#255#217#189#178#255#217#189#178#255#217#189#178#255#217#189#178#255#217
+ +#189#178#255#217#189#178#255#217#189#178#255#217#189#178#255#217#189#178#255
+ +#217#189#178#255#217#189#178#255#217#189#178#255#217#189#178#255#217#189#178
+ +#255#217#189#178#255#217#189#178#255#217#189#178#255#217#189#178#255#217#189
+ +#178#255#217#189#178#255#217#189#178#255#217#189#178#255#217#189#178#255#217
+ +#189#178#255#217#189#178#255#217#188#177#255#213#183#170#255#205#168#153#255
+ +#191#144'|'#255#170'rZ'#255'sF2'#255'`5!'#255'\0'#28#255'Z/'#27'g'#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27#6'[/'#27
+ +#188']1'#30#255'c9&'#255#136'V?'#255#180'~g'#255#197#154#136#255#209#176#162
+ +#255#216#187#176#255#219#192#181#255#219#192#182#255#219#193#183#255#219#193
+ +#183#255#219#193#183#255#219#193#183#255#219#193#183#255#219#193#183#255#219
+ +#193#183#255#219#193#183#255#219#193#183#255#219#193#183#255#219#193#183#255
+ +#219#193#183#255#219#193#183#255#219#193#183#255#219#193#183#255#219#193#183
+ +#255#219#193#183#255#219#193#183#255#219#193#183#255#219#193#183#255#219#193
+ +#183#255#219#193#183#255#219#193#183#255#219#193#183#255#219#193#183#255#219
+ +#193#183#255#219#193#183#255#219#193#183#255#219#193#183#255#219#193#183#255
+ +#219#193#183#255#219#193#183#255#158#138#131#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#1#1#1#255#131'sm'#255#219#193#183#255#219#193#183#255#219#193#183#255
+ +#219#193#183#255#219#193#183#255#219#193#183#255#219#193#183#255#219#193#183
+ +#255#219#193#183#255#219#193#183#255#219#193#183#255#219#193#183#255#219#193
+ +#183#255#219#193#183#255#219#193#183#255#219#193#183#255#219#193#183#255#219
+ +#193#183#255#219#193#183#255#219#193#183#255#219#193#183#255#219#193#183#255
+ +#219#193#183#255#219#193#183#255#219#193#183#255#219#193#183#255#219#193#183
+ +#255#219#193#183#255#219#193#183#255#219#193#183#255#219#193#183#255#219#192
+ +#182#255#218#191#180#255#215#185#173#255#207#172#156#255#193#147#128#255#174
+ +'v^'#255'wJ6'#255'`6"'#255'\1'#29#255'[/'#27'~'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27#12'[/'#27#203
+ +']1'#30#255'c:'''#255#141'YC'#255#181#128'h'#255#198#155#138#255#210#177#164
+ +#255#217#190#178#255#220#194#184#255#221#195#185#255#221#196#186#255#221#196
+ +#186#255#221#196#186#255#221#196#186#255#221#196#186#255#221#196#186#255#221
+ +#196#186#255#221#196#186#255#221#196#186#255#221#196#186#255#221#196#186#255
+ +#221#196#186#255#221#196#186#255#221#196#186#255#221#196#186#255#221#196#186
+ +#255#221#196#186#255#221#196#186#255#221#196#186#255#221#196#186#255#221#196
+ +#186#255#221#196#186#255#221#196#186#255#221#196#186#255#221#196#186#255#221
+ +#196#186#255#221#196#186#255#221#196#186#255#221#196#186#255#221#196#186#255
+ +#221#196#186#255're_'#255#0#0#0#255#0#0#0#255#4#4#4#255#160#142#134#255#221
+ +#196#186#255#221#196#186#255#221#196#186#255#221#196#186#255#221#196#186#255
+ +#221#196#186#255#221#196#186#255#221#196#186#255#221#196#186#255#221#196#186
+ +#255#221#196#186#255#221#196#186#255#221#196#186#255#221#196#186#255#221#196
+ +#186#255#221#196#186#255#221#196#186#255#221#196#186#255#221#196#186#255#221
+ +#196#186#255#221#196#186#255#221#196#186#255#221#196#186#255#221#196#186#255
+ +#221#196#186#255#221#196#186#255#221#196#186#255#221#196#186#255#221#196#186
+ +#255#221#196#186#255#221#196#186#255#221#195#185#255#219#193#183#255#216#187
+ +#175#255#207#172#158#255#194#148#130#255#176'x_'#255'{M8'#255'a6#'#255'\1'#29
+ +#255'[/'#27#148#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27#21'\0'#28#217']1'#30#255'c:'''
+ +#255#138'XB'#255#181#127'h'#255#197#156#137#255#211#178#164#255#218#191#180
+ +#255#221#196#187#255#222#198#188#255#223#198#189#255#223#198#189#255#223#198
+ +#189#255#223#198#189#255#223#198#189#255#223#198#189#255#223#198#189#255#223
+ +#198#189#255#223#198#189#255#223#198#189#255#223#198#189#255#223#198#189#255
+ +#223#198#189#255#223#198#189#255#223#198#189#255#223#198#189#255#223#198#189
+ +#255#223#198#189#255#223#198#189#255#223#198#189#255#223#198#189#255#223#198
+ +#189#255#223#198#189#255#223#198#189#255#223#198#189#255#223#198#189#255#223
+ +#198#189#255#223#198#189#255#223#198#189#255#223#198#189#255#221#196#187#255
+ +#6#6#5#255#10#9#8#255#188#167#159#255#223#198#189#255#223#198#189#255#223#198
+ +#189#255#223#198#189#255#223#198#189#255#223#198#189#255#223#198#189#255#223
+ +#198#189#255#223#198#189#255#223#198#189#255#223#198#189#255#223#198#189#255
+ +#223#198#189#255#223#198#189#255#223#198#189#255#223#198#189#255#223#198#189
+ +#255#223#198#189#255#223#198#189#255#223#198#189#255#223#198#189#255#223#198
+ +#189#255#223#198#189#255#223#198#189#255#223#198#189#255#223#198#189#255#223
+ +#198#189#255#223#198#189#255#223#198#189#255#223#198#189#255#223#198#189#255
+ +#222#198#188#255#221#196#186#255#217#188#177#255#208#173#159#255#193#149#129
+ +#255#174'w^'#255'zM8'#255'a7$'#255'\1'#29#255'[/'#27#170'[/'#27#2#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0'[/'#27' \0'#28#223']1'#30#255'c:'''#255#132'T?'#255#180
+ +'~g'#255#197#155#136#255#211#178#164#255#219#193#181#255#223#198#189#255#224
+ +#201#192#255#224#201#192#255#224#201#192#255#224#201#192#255#224#201#192#255
+ +#224#201#192#255#224#201#192#255#224#201#192#255#224#201#192#255#224#201#192
+ +#255#224#201#192#255#224#201#192#255#224#201#192#255#224#201#192#255#224#201
+ +#192#255#224#201#192#255#224#201#192#255#224#201#192#255#224#201#192#255#224
+ +#201#192#255#224#201#192#255#224#201#192#255#224#201#192#255#224#201#192#255
+ +#224#201#192#255#224#201#192#255#224#201#192#255#224#201#192#255#224#201#192
+ +#255#224#201#192#255#224#201#192#255#134'xr'#255#205#184#176#255#224#201#192
+ +#255#224#201#192#255#224#201#192#255#224#201#192#255#224#201#192#255#224#201
+ +#192#255#224#201#192#255#224#201#192#255#224#201#192#255#224#201#192#255#224
+ +#201#192#255#224#201#192#255#224#201#192#255#224#201#192#255#224#201#192#255
+ +#224#201#192#255#224#201#192#255#224#201#192#255#224#201#192#255#224#201#192
+ +#255#224#201#192#255#224#201#192#255#224#201#192#255#224#201#192#255#224#201
+ +#192#255#224#201#192#255#224#201#192#255#224#201#192#255#224#201#192#255#224
+ +#201#192#255#224#201#192#255#223#200#191#255#222#197#187#255#217#189#178#255
+ +#207#172#158#255#192#147#127#255#171'u\'#255'vI6'#255'a6#'#255'\1'#29#255'[/'
+ +#27#179'[/'#27#6#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27#25'\'
+ +'0'#28#209']1'#30#255'c9&'#255#128'Q='#255#177'{c'#255#195#151#133#255#209
+ +#176#162#255#219#192#181#255#223#200#191#255#225#203#194#255#226#204#196#255
+ +#226#204#196#255#226#204#196#255#226#204#196#255#226#204#196#255#226#204#196
+ +#255#226#204#196#255#226#204#196#255#226#204#196#255#226#204#196#255#226#204
+ +#196#255#226#204#196#255#226#204#196#255#226#204#196#255#226#204#196#255#226
+ +#204#196#255#226#204#196#255#226#204#196#255#226#204#196#255#226#204#196#255
+ +#226#204#196#255#226#204#196#255#226#204#196#255#226#204#196#255#226#204#196
+ +#255#226#204#196#255#226#204#196#255#226#204#196#255#226#204#196#255#226#204
+ +#196#255#226#204#196#255#226#204#196#255#226#204#196#255#226#204#196#255#226
+ +#204#196#255#226#204#196#255#226#204#196#255#226#204#196#255#226#204#196#255
+ +#226#204#196#255#226#204#196#255#226#204#196#255#226#204#196#255#226#204#196
+ +#255#226#204#196#255#226#204#196#255#226#204#196#255#226#204#196#255#226#204
+ +#196#255#226#204#196#255#226#204#196#255#226#204#196#255#226#204#196#255#226
+ +#204#196#255#226#204#196#255#226#204#196#255#226#204#196#255#226#204#196#255
+ +#226#204#196#255#226#204#196#255#226#203#195#255#225#202#193#255#222#198#188
+ +#255#217#188#177#255#206#169#155#255#191#144'|'#255#168'qY'#255'rG3'#255'`6"'
+ +#255'\1'#29#255'[/'#27#159'[/'#27#4#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0'[/'#27#15'\0'#28#193']1'#30#255'b8%'#255'yM8'#255#170
+ +'u\'#255#192#146'~'#255#207#171#156#255#217#189#178#255#223#200#191#255#226
+ +#205#197#255#227#206#198#255#228#207#199#255#228#207#199#255#228#207#199#255
+ +#228#207#199#255#228#207#199#255#228#207#199#255#228#207#199#255#228#207#199
+ +#255#228#207#199#255#228#207#199#255#228#207#199#255#228#207#199#255#228#207
+ +#199#255#228#207#199#255#228#207#199#255#228#207#199#255#228#207#199#255#228
+ +#207#199#255#228#207#199#255#228#207#199#255#228#207#199#255#228#207#199#255
+ +#228#207#199#255#228#207#199#255#228#207#199#255#228#207#199#255#228#207#199
+ +#255#228#207#199#255#228#207#199#255#228#207#199#255#228#207#199#255#228#207
+ +#199#255#228#207#199#255#228#207#199#255#228#207#199#255#228#207#199#255#228
+ +#207#199#255#228#207#199#255#228#207#199#255#228#207#199#255#228#207#199#255
+ +#228#207#199#255#228#207#199#255#228#207#199#255#228#207#199#255#228#207#199
+ +#255#228#207#199#255#228#207#199#255#228#207#199#255#228#207#199#255#228#207
+ +#199#255#228#207#199#255#228#207#199#255#228#207#199#255#228#207#199#255#228
+ +#207#199#255#228#207#199#255#227#206#198#255#226#204#196#255#222#198#188#255
+ +#215#185#173#255#202#165#148#255#187#137'u'#255#159'jR'#255'nD0'#255'`6"'#255
+ +'\1'#29#255'[/'#27#137#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27#8'[/'#27#175'\1'#29#255'`6"'#255'n'
+ +'D0'#255#158'iR'#255#187#137'u'#255#202#165#148#255#215#186#174#255#223#199
+ +#190#255#227#205#198#255#229#208#201#255#229#209#202#255#229#210#202#255#229
+ +#210#202#255#229#210#202#255#229#210#202#255#229#210#202#255#229#210#202#255
+ +#229#210#202#255#229#210#202#255#229#210#202#255#229#210#202#255#229#210#202
+ +#255#229#210#202#255#229#210#202#255#229#210#202#255#229#210#202#255#229#210
+ +#202#255#229#210#202#255#229#210#202#255#229#210#202#255#229#210#202#255#229
+ +#210#202#255#229#210#202#255#229#210#202#255#229#210#202#255#229#210#202#255
+ +#229#210#202#255#229#210#202#255#229#210#202#255#229#210#202#255#229#210#202
+ +#255#229#210#202#255#229#210#202#255#229#210#202#255#229#210#202#255#229#210
+ +#202#255#229#210#202#255#229#210#202#255#229#210#202#255#229#210#202#255#229
+ +#210#202#255#229#210#202#255#229#210#202#255#229#210#202#255#229#210#202#255
+ +#229#210#202#255#229#210#202#255#229#210#202#255#229#210#202#255#229#210#202
+ +#255#229#210#202#255#229#210#202#255#229#210#202#255#229#210#202#255#229#209
+ +#202#255#228#207#201#255#226#204#197#255#221#196#187#255#212#180#168#255#198
+ +#157#140#255#183#130'l'#255#143'^G'#255'g>+'#255'_4 '#255'\1'#29#254'[/'#27
+ +'q'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27#3'[/'#27#132'\1'#29#254'_4 '#255'g>+'
+ +#255#140'[F'#255#181#129'j'#255#198#155#138#255#211#178#165#255#221#195#185
+ +#255#227#204#197#255#230#209#203#255#230#212#205#255#231#212#206#255#231#212
+ +#206#255#231#212#206#255#231#212#206#255#231#212#206#255#231#212#206#255#231
+ +#212#206#255#231#212#206#255#231#212#206#255#231#212#206#255#231#212#206#255
+ +#231#212#206#255#231#212#206#255#231#212#206#255#231#212#206#255#231#212#206
+ +#255#231#212#206#255#231#212#206#255#231#212#206#255#231#212#206#255#231#212
+ +#206#255#231#212#206#255#231#212#206#255#231#212#206#255#231#212#206#255#231
+ +#212#206#255#231#212#206#255#231#212#206#255#231#212#206#255#231#212#206#255
+ +#231#212#206#255#231#212#206#255#231#212#206#255#231#212#206#255#231#212#206
+ +#255#231#212#206#255#231#212#206#255#231#212#206#255#231#212#206#255#231#212
+ +#206#255#231#212#206#255#231#212#206#255#231#212#206#255#231#212#206#255#231
+ +#212#206#255#231#212#206#255#231#212#206#255#231#212#206#255#231#212#206#255
+ +#231#212#206#255#231#211#206#255#230#211#205#255#229#209#201#255#225#203#194
+ +#255#219#191#181#255#208#173#159#255#193#149#129#255#173'w`'#255'~Q='#255'c:'
+ +''''#255'^2'#31#255'\0'#28#238'[/'#27'O'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0'[/'#27'F\0'#28#234'^2'#31#255'c:'''#255'zN:'#255#168's['#255
+ +#190#143'{'#255#205#167#152#255#217#187#177#255#225#201#193#255#229#209#202
+ +#255#232#213#207#255#232#214#209#255#233#215#210#255#233#215#210#255#233#215
+ +#210#255#233#215#210#255#233#215#210#255#233#215#210#255#233#215#210#255#233
+ +#215#210#255#233#215#210#255#233#215#210#255#233#215#210#255#233#215#210#255
+ +#233#215#210#255#233#215#210#255#233#215#210#255#233#215#210#255#233#215#210
+ +#255#233#215#210#255#233#215#210#255#233#215#210#255#233#215#210#255#233#215
+ +#210#255#233#215#210#255#233#215#210#255#233#215#210#255#233#215#210#255#233
+ +#215#210#255#233#215#210#255#233#215#210#255#233#215#210#255#233#215#210#255
+ +#233#215#210#255#233#215#210#255#233#215#210#255#233#215#210#255#233#215#210
+ +#255#233#215#210#255#233#215#210#255#233#215#210#255#233#215#210#255#233#215
+ +#210#255#233#215#210#255#233#215#210#255#233#215#210#255#233#215#210#255#233
+ +#215#210#255#232#215#209#255#232#214#208#255#231#212#206#255#228#207#201#255
+ +#223#198#189#255#213#182#170#255#200#160#144#255#186#136'r'#255#158'iR'#255
+ +'pE2'#255'a7$'#255']1'#30#255'\0'#28#201'[/'#27#31#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27#26'\0'#28#193']1'#30#255'`'
+ +'6"'#255'iA.'#255#142']H'#255#179#128'h'#255#196#153#135#255#210#176#163#255
+ +#220#194#184#255#227#205#198#255#231#212#206#255#233#216#211#255#234#217#212
+ +#255#234#218#213#255#234#218#213#255#234#218#213#255#234#218#213#255#234#218
+ +#213#255#234#218#213#255#234#218#213#255#234#218#213#255#234#218#213#255#234
+ +#218#213#255#234#218#213#255#234#218#213#255#234#218#213#255#234#218#213#255
+ +#234#218#213#255#234#218#213#255#234#218#213#255#234#218#213#255#234#218#213
+ +#255#234#218#213#255#234#218#213#255#234#218#213#255#234#218#213#255#234#218
+ +#213#255#234#218#213#255#234#218#213#255#234#218#213#255#234#218#213#255#234
+ +#218#213#255#234#218#213#255#234#218#213#255#234#218#213#255#234#218#213#255
+ +#234#218#213#255#234#218#213#255#234#218#213#255#234#218#213#255#234#218#213
+ +#255#234#218#213#255#234#218#213#255#234#218#213#255#234#218#213#255#234#217
+ +#212#255#234#216#211#255#233#215#210#255#230#211#205#255#226#203#195#255#218
+ +#190#179#255#206#170#155#255#192#146#127#255#172'v`'#255#129'S?'#255'e<)'#255
+ +'_4 '#255'\1'#29#255'[/'#27#143'[/'#27#5#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27#3'[/'#27#127'\0'#28
+ +#248'^3'#31#255'c:'''#255'sI6'#255#158'kT'#255#186#136's'#255#200#160#143#255
+ ,#213#180#169#255#222#197#187#255#229#208#201#255#232#214#209#255#234#218#213
+ +#255#235#219#215#255#236#220#215#255#236#220#216#255#236#220#216#255#236#220
+ +#216#255#236#220#216#255#236#220#216#255#236#220#216#255#236#220#216#255#236
+ +#220#216#255#236#220#216#255#236#220#216#255#236#220#216#255#236#220#216#255
+ +#236#220#216#255#236#220#216#255#236#220#216#255#236#220#216#255#236#220#216
+ +#255#236#220#216#255#236#220#216#255#236#220#216#255#236#220#216#255#236#220
+ +#216#255#236#220#216#255#236#220#216#255#236#220#216#255#236#220#216#255#236
+ +#220#216#255#236#220#216#255#236#220#216#255#236#220#216#255#236#220#216#255
+ +#236#220#216#255#236#220#216#255#236#220#216#255#236#220#216#255#236#220#216
+ +#255#236#220#216#255#236#220#215#255#235#219#215#255#234#217#212#255#232#213
+ +#207#255#227#205#198#255#219#193#183#255#209#176#162#255#196#153#136#255#181
+ +#129'l'#255#145'`K'#255'lB0'#255'a7$'#255']1'#30#255'\0'#28#231'[/'#27'O'#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27'$\0'#28#185'\1'#29#255'`5!'#255
+ +'f=*'#255#128'S>'#255#166'r['#255#188#139'v'#255#201#161#145#255#213#181#169
+ +#255#223#197#189#255#229#209#202#255#233#216#210#255#235#219#215#255#236#221
+ +#217#255#237#222#219#255#238#223#220#255#238#223#220#255#238#223#220#255#238
+ +#223#220#255#238#223#220#255#238#223#220#255#238#223#220#255#238#223#220#255
+ +#238#223#220#255#238#223#220#255#238#223#220#255#238#223#220#255#238#223#220
+ +#255#238#223#220#255#238#223#220#255#238#223#220#255#238#223#220#255#238#223
+ +#220#255#238#223#220#255#238#223#220#255#238#223#220#255#238#223#220#255#238
+ +#223#220#255#238#223#220#255#238#223#220#255#238#223#220#255#238#223#220#255
+ +#238#223#220#255#238#223#220#255#238#223#220#255#238#223#220#255#238#223#220
+ +#255#237#222#219#255#237#222#218#255#236#221#217#255#235#218#214#255#232#214
+ +#208#255#228#206#199#255#220#193#184#255#210#176#163#255#197#155#137#255#184
+ +#134'o'#255#155'iR'#255'uI7'#255'c:'''#255'^3'#31#255'\1'#29#252'[/'#27#144
+ +'[/'#27#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'['
+ +'/'#27'U\0'#28#228']1'#30#255'`6"'#255'g>,'#255#127'R?'#255#164'qZ'#255#188
+ +#139'v'#255#200#159#144#255#211#179#166#255#220#194#184#255#228#206#199#255
+ +#232#214#209#255#235#219#215#255#237#222#219#255#238#225#221#255#239#225#222
+ +#255#239#225#222#255#239#226#223#255#239#226#223#255#239#226#223#255#239#226
+ +#223#255#239#226#223#255#239#226#223#255#239#226#223#255#239#226#223#255#239
+ +#226#223#255#239#226#223#255#239#226#223#255#239#226#223#255#239#226#223#255
+ +#239#226#223#255#239#226#223#255#239#226#223#255#239#226#223#255#239#226#223
+ +#255#239#226#223#255#239#226#223#255#239#226#223#255#239#226#223#255#239#226
+ +#223#255#239#226#223#255#239#226#223#255#239#225#222#255#238#225#221#255#238
+ +#224#220#255#237#222#218#255#235#218#214#255#231#212#206#255#226#203#195#255
+ +#218#191#180#255#209#174#160#255#197#154#136#255#184#132'o'#255#154'hR'#255
+ +'uK8'#255'e;('#255'_4 '#255'\1'#29#255'\0'#28#197'[/'#27'/'#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27
+ +#12'[/'#27#134'\0'#28#242'^2'#31#255'a5#'#255'g>+'#255'|Q='#255#160'lV'#255
+ +#184#133'p'#255#196#152#134#255#207#170#156#255#216#187#175#255#224#200#192
+ +#255#230#210#203#255#234#216#211#255#236#220#216#255#238#224#220#255#239#226
+ +#223#255#240#227#225#255#240#228#225#255#240#228#225#255#241#229#226#255#241
+ +#229#226#255#241#229#226#255#241#229#226#255#241#229#227#255#241#229#227#255
+ +#241#229#227#255#241#229#227#255#241#229#227#255#241#229#227#255#241#229#227
+ +#255#241#229#227#255#241#229#227#255#241#229#226#255#241#229#226#255#241#229
+ ,#226#255#241#229#226#255#240#228#225#255#240#228#225#255#240#227#224#255#239
+ +#225#222#255#238#223#220#255#236#220#215#255#233#215#210#255#228#207#201#255
+ +#222#196#187#255#213#183#170#255#204#166#150#255#192#147#127#255#179#127'i'
+ +#255#150'fO'#255'tI7'#255'e;('#255'`5!'#255']1'#30#255'\0'#28#223'[/'#27'`[/'
+ +#27#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27#17'[/'#27#127'\0'#28#238']1'
+ +#30#255'`6"'#255'e<)'#255'rI6'#255#142'_J'#255#170'wa'#255#188#140'w'#255#199
+ +#158#141#255#208#173#159#255#216#186#175#255#222#196#187#255#227#206#198#255
+ +#232#213#208#255#235#219#214#255#237#222#218#255#238#224#220#255#239#226#223
+ +#255#240#227#225#255#241#229#226#255#242#230#228#255#242#230#228#255#242#231
+ +#229#255#242#231#229#255#242#231#229#255#242#231#229#255#242#231#229#255#242
+ +#231#229#255#242#231#229#255#242#230#228#255#241#229#227#255#241#229#226#255
+ +#240#227#225#255#239#225#222#255#238#224#220#255#236#221#217#255#234#218#213
+ +#255#231#211#206#255#226#204#196#255#220#194#184#255#214#183#171#255#206#169
+ +#155#255#196#153#135#255#185#135'r'#255#162'q['#255#134'XD'#255'lC1'#255'c:'
+ +''''#255'_4 '#255']0'#30#255'\0'#28#217'[/'#27'`[/'#27#4#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27#13'[/'#27'w\0'#28#233
+ +']1'#30#255'_4 '#255'b8%'#255'h?-'#255'zN;'#255#149'dP'#255#170'xa'#255#187
+ +#137't'#255#194#150#131#255#202#164#148#255#210#176#163#255#216#187#175#255
+ +#220#194#184#255#224#200#192#255#228#207#199#255#231#212#206#255#234#217#211
+ +#255#236#220#215#255#236#222#217#255#237#222#219#255#238#223#220#255#238#223
+ +#220#255#238#224#220#255#238#223#220#255#237#223#219#255#237#223#218#255#236
+ +#221#217#255#235#219#215#255#233#216#210#255#230#211#204#255#227#204#197#255
+ +#223#199#190#255#219#192#183#255#215#185#173#255#208#173#159#255#200#160#144
+ +#255#192#146#127#255#183#133'o'#255#164's\'#255#142']J'#255'rI7'#255'f=*'#255
+ +'a6#'#255'^3'#31#255'\1'#29#255'\0'#28#210'[/'#27'X[/'#27#2#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0'[/'#27#5'[/'#27'P\0'#28#173'\1'#29#249']1'#30#255'`5!'#255'c9&'#255'g'
+ +'>,'#255'qH6'#255#133'YE'#255#153'iT'#255#172'yd'#255#186#136'q'#255#191#144
+ +'}'#255#196#153#136#255#202#162#146#255#207#171#156#255#211#178#165#255#214
+ +#183#171#255#216#186#175#255#217#188#177#255#218#190#179#255#219#191#182#255
+ +#219#192#182#255#219#192#181#255#218#189#179#255#217#187#177#255#215#185#173
+ +#255#213#182#169#255#210#176#163#255#205#169#154#255#200#160#144#255#195#151
+ +#133#255#190#142'z'#255#183#132'o'#255#167'u_'#255#148'eP'#255#127'S@'#255'm'
+ +'E2'#255'f=*'#255'b7%'#255'_4 '#255']1'#30#255'\0'#28#235'[/'#27#147'[/'#27
+ +'5'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'['
+ ,'/'#27#18'[/'#27'i\0'#28#199'\1'#29#254']1'#30#255'_4 '#255'a6#'#255'd9('#255
+ +'g>,'#255'oF3'#255'}Q>'#255#138'[G'#255#149'fQ'#255#160'oZ'#255#170'xa'#255
+ +#176'}h'#255#180#128'l'#255#183#133'p'#255#186#136's'#255#188#138'u'#255#188
+ +#139'v'#255#187#138'u'#255#186#135'r'#255#183#132'n'#255#178#128'j'#255#174
+ +'|e'#255#168'v`'#255#158'mW'#255#146'bN'#255#133'YE'#255'yM;'#255'mC1'#255'g'
+ +'>+'#255'c9&'#255'`6"'#255'^3'#31#255']1'#30#255'\0'#28#248'\0'#28#173'[/'#27
+ +'O[/'#27#5#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27#20'[/'#27'V\0'#28#153
+ +'\0'#28#220'\1'#29#255']1'#30#255'^3'#31#255'`5!'#255'a7$'#255'c9&'#255'e;('
+ +#255'f=*'#255'g>,'#255'i@.'#255'jB0'#255'mE2'#255'qH5'#255'tJ7'#255'qG5'#255
+ +'lC1'#255'jA0'#255'h?-'#255'g>+'#255'e<)'#255'd:('#255'c9&'#255'a6#'#255'`5!'
+ +#255'^2'#31#255']1'#30#255'\1'#29#252'\0'#28#201'[/'#27#134'[/'#27'C[/'#27#8
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0'[/'#27#31'[/'#27'_[/'#27#138'\0'#28#176'\0'#28#213'\0'#28
+ +#248'\1'#29#255'\1'#29#255'\1'#29#255']1'#30#255'^2'#31#255'^2'#31#255'^3'#31
+ +#255'^3'#31#255'^3'#31#255'^2'#31#255']1'#30#255']1'#30#255'\1'#29#255'\1'#29
+ +#255'\1'#29#255'\0'#28#241'\0'#28#203'\0'#28#165'[/'#27#127'[/'#27'N[/'#27#15
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0'[/'#27#2'[/'#27'![/'#27'E[/'#27'U[/'#27'a[/'#27'm[/'#27'y[/'#27
+ +#134'\0'#29#141'[/'#27#130'[/'#27'v[/'#27'j[/'#27'^[/'#27'Q[/'#27'=[/'#27#23
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#255#255#255#128#0#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#224#0#0#3#255#255#255#255#255
+ +#255#255#255#255#255#255#254#0#0#0#0'?'#255#255#255#255#255#255#255#255#255
+ +#255#240#0#0#0#0#7#255#255#255#255#255#255#255#255#255#255#128#0#0#0#0#0#255
+ +#255#255#255#255#255#255#255#255#254#0#0#0#0#0#0'?'#255#255#255#255#255#255
+ +#255#255#248#0#0#0#0#0#0#15#255#255#255#255#255#255#255#255#224#0#0#0#0#0#0#3
+ +#255#255#255#255#255#255#255#255#128#0#0#0#0#0#0#0#255#255#255#255#255#255
+ +#255#254#0#0#0#0#0#0#0#0'?'#255#255#255#255#255#255#252#0#0#0#0#0#0#0#0#31
+ +#255#255#255#255#255#255#240#0#0#0#0#0#0#0#0#7#255#255#255#255#255#255#224#0
+ +#0#0#0#0#0#0#0#3#255#255#255#255#255#255#128#0#0#0#0#0#0#0#0#1#255#255#255
+ +#255#255#255#0#0#0#0#0#0#0#0#0#0#127#255#255#255#255#254#0#0#0#0#0#0#0#0#0#0
+ +'?'#255#255#255#255#252#0#0#0#0#0#0#0#0#0#0#31#255#255#255#255#248#0#0#0#0#0
+ +#0#0#0#0#0#15#255#255#255#255#240#0#0#0#0#0#0#0#0#0#0#7#255#255#255#255#224#0
+ +#0#0#0#0#0#0#0#0#0#3#255#255#255#255#192#0#0#0#0#0#0#0#0#0#0#1#255#255#255
+ +#255#128#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#127
+ +#255#255#254#0#0#0#0#0#0#0#0#0#0#0#0#127#255#255#254#0#0#0#0#0#0#0#0#0#0#0#0
+ +'?'#255#255#252#0#0#0#0#0#0#0#0#0#0#0#0#31#255#255#248#0#0#0#0#0#0#0#0#0#0#0
+ +#0#15#255#255#240#0#0#0#0#0#0#0#0#0#0#0#0#7#255#255#240#0#0#0#0#0#0#0#0#0#0#0
+ +#0#7#255#255#224#0#0#0#0#0#0#0#0#0#0#0#0#3#255#255#192#0#0#0#0#0#0#0#0#0#0#0
+ +#0#3#255#255#192#0#0#0#0#0#0#0#0#0#0#0#0#1#255#255#128#0#0#0#0#0#0#0#0#0#0#0
+ +#0#1#255#255#128#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#127#254#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#127#254#0#0#0#0#0#0#0#0#0#0#0#0#0#0'?'#254#0#0#0#0#0#0#0#0#0#0#0#0#0#0'?'
+ +#252#0#0#0#0#0#0#0#0#0#0#0#0#0#0'?'#252#0#0#0#0#0#0#0#0#0#0#0#0#0#0#31#252#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#31#248#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#248#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#15#248#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#240#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#7#240#0#0#0#0#0#0#0#0#0#0#0#0#0#0#7#240#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#7#224#0#0#0#0#0#0#0#0#0#0#0#0#0#0#7#224#0#0#0#0#0#0#0#0#0#0#0#0#0#0#3
+ +#224#0#0#0#0#0#0#0#0#0#0#0#0#0#0#3#224#0#0#0#0#0#0#0#0#0#0#0#0#0#0#3#224#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#3#224#0#0#0#0#0#0#0#0#0#0#0#0#0#0#3#192#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#3#192#0#0#0#0#0#0#0#0#0#0#0#0#0#0#3#192#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#1#192#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#192#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#1#192#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#192#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#192#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#1#192#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#192#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#1#192#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#192#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#1#192#0#0#0#0#0#0#0#0#0#0#0#0#0#0#3#192#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#3#224#0#0#0#0#0#0#0#0#0#0#0#0#0#0#3#224#0#0#0#0#0#0#0#0#0#0#0#0#0#0#3#224
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#3#224#0#0#0#0#0#0#0#0#0#0#0#0#0#0#3#224#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#3#240#0#0#0#0#0#0#0#0#0#0#0#0#0#0#7#240#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#7#240#0#0#0#0#0#0#0#0#0#0#0#0#0#0#7#240#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#15#248#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#248#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15
+ +#248#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15#252#0#0#0#0#0#0#0#0#0#0#0#0#0#0#31#252#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#31#252#0#0#0#0#0#0#0#0#0#0#0#0#0#0'?'#254#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0'?'#254#0#0#0#0#0#0#0#0#0#0#0#0#0#0'?'#254#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#127#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#127#255#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#255#255#128#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#128#0#0#0#0#0#0#0#0
+ +#0#0#0#0#1#255#255#128#0#0#0#0#0#0#0#0#0#0#0#0#1#255#255#192#0#0#0#0#0#0#0#0
+ +#0#0#0#0#3#255#255#192#0#0#0#0#0#0#0#0#0#0#0#0#3#255#255#224#0#0#0#0#0#0#0#0
+ +#0#0#0#0#7#255#255#224#0#0#0#0#0#0#0#0#0#0#0#0#15#255#255#240#0#0#0#0#0#0#0#0
+ +#0#0#0#0#15#255#255#248#0#0#0#0#0#0#0#0#0#0#0#0#31#255#255#248#0#0#0#0#0#0#0
+ +#0#0#0#0#0'?'#255#255#252#0#0#0#0#0#0#0#0#0#0#0#0#127#255#255#252#0#0#0#0#0#0
+ +#0#0#0#0#0#0#255#255#255#254#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#255#0#0#0#0
+ +#0#0#0#0#0#0#0#1#255#255#255#255#128#0#0#0#0#0#0#0#0#0#0#3#255#255#255#255
+ +#128#0#0#0#0#0#0#0#0#0#0#7#255#255#255#255#192#0#0#0#0#0#0#0#0#0#0#15#255#255
+ +#255#255#224#0#0#0#0#0#0#0#0#0#0#31#255#255#255#255#240#0#0#0#0#0#0#0#0#0#0
+ +#31#255#255#255#255#248#0#0#0#0#0#0#0#0#0#0'?'#255#255#255#255#252#0#0#0#0#0
+ +#0#0#0#0#0#127#255#255#255#255#254#0#0#0#0#0#0#0#0#0#1#255#255#255#255#255
+ +#255#0#0#0#0#0#0#0#0#0#3#255#255#255#255#255#255#128#0#0#0#0#0#0#0#0#7#255
+ +#255#255#255#255#255#224#0#0#0#0#0#0#0#0#15#255#255#255#255#255#255#240#0#0#0
+ +#0#0#0#0#0#31#255#255#255#255#255#255#248#0#0#0#0#0#0#0#0#127#255#255#255#255
+ +#255#255#254#0#0#0#0#0#0#0#0#255#255#255#255#255#255#255#255#128#0#0#0#0#0#0
+ +#3#255#255#255#255#255#255#255#255#192#0#0#0#0#0#0#7#255#255#255#255#255#255
+ +#255#255#240#0#0#0#0#0#0#31#255#255#255#255#255#255#255#255#252#0#0#0#0#0#0
+ +#127#255#255#255#255#255#255#255#255#255#0#0#0#0#0#3#255#255#255#255#255#255
+ +#255#255#255#255#224#0#0#0#0#15#255#255#255#255#255#255#255#255#255#255#252#0
+ +#0#0#0#127#255#255#255#255#255#255#255#255#255#255#255#192#0#0#7#255#255#255
+ +#255#255#255#255#255#255#255#255#255#254#0#1#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255'('#0#0#0'@'#0#0#0#128#0#0#0#1#0' '#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'@@@'#4'III'#7'III'#7
+ +'333'#5#128#128#128#2#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'UUU'#6'DDD'
+ +#15'FFF'#22'EEE'#26'DDD'#30'III#GGG/DDD'#30#255'j>'#31#253'g>#'#249'[>+'#235'PB8'#218'HE'
+ +'C'#203'FEC'#195'EED'#184'DDD'#166'DDDqEEE4@@@'#20'@@@'#4#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1
+ +'999'#9'BBB'#31'CCCPEDD'#143'FFE'#182'NB:'#211'Z?-'#231'g>#'#249'l?'#31#255
+ +'zK$'#253#150']*'#255#165'h.'#255#172'm0'#255#180's2'#255#186'x4'#255#189'{4'
+ +#255#192#127'5'#255#190'|4'#255#187'x4'#255#182'u3'#255#175'p1'#255#167'j/'
+ +#255#156'b+'#255#131'R&'#254'oB '#255'i>!'#253'_>)'#238'S@6'#222'FEB'#203'DD'
+ +'C'#190'DDD'#164'CCCkCCC.PPP'#16'UUU'#3#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#128#128#128#2'CCC'#19'BBBBDDD'#136'EED'#179'LA9'
+ +#209'`=&'#243'k?'#31#255#127'N&'#254#154'`,'#255#176'q1'#255#191'~5'#255#200
+ +#138'7'#255#207#145'8'#255#210#149'9'#255#213#153'9'#255#217#157':'#255#219
+ +#160';'#255#221#162';'#255#220#162':'#255#217#158':'#255#215#155':'#255#211
+ +#151'9'#255#208#146'8'#255#203#141'8'#255#194#129'6'#255#183'v4'#255#163'f.'
+ +#255#137'U('#254'qC"'#254'f'
+ +'>>!+++'#6#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'@@@'#4'BBB'#27'CC'
+ +'C[CCB'#165'LD='#203']<('#238'j> '#255#135'R('#254#176'p3'#255#193#128'7'#255
+ +#202#139'9'#255#211#151';'#255#220#162'<'#255#227#170'>'#255#232#176'?'#255
+ +#234#180'?'#255#237#182'?'#255#239#185'@'#255#241#187'@'#255#242#188'A'#255
+ +#241#187'@'#255#240#185'A'#255#238#183'@'#255#235#180'@'#255#233#178'?'#255
+ +#229#173'>'#255#222#165'='#255#215#156'<'#255#205#144':'#255#196#133'8'#255
+ +#185'x5'#255#152'^-'#255'oC"'#254'd<#'#247'QA7'#220'FFE'#200'CCC'#180'CCC}AA'
+ +'A/UUU'#9#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'III'#7'CCC&DDDpECC'#180'X<,'#232'i='
+ +'!'#254#128'O('#254#170'l3'#255#194#130':'#255#210#150'>'#255#220#163'?'#255
+ +#227#171'A'#255#234#180'B'#255#240#187'D'#255#242#190'D'#255#244#193'E'#255
+ +#246#194'D'#255#247#195'E'#255#248#197'E'#255#249#197'E'#255#249#198'E'#255
+ +#249#197'E'#255#248#196'E'#255#247#195'E'#255#246#195'E'#255#245#194'D'#255
+ +#243#191'D'#255#240#188'C'#255#236#183'C'#255#230#174'B'#255#223#165'@'#255
+ +#215#156'?'#255#200#137';'#255#182'u6'#255#146'[,'#255'm@!'#254'`:%'#244'KA;'
+ +#211'CCC'#189'CCC'#144'BBB>PPP'#16#128#128#128#2#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'999'#9'@@@4CCC'#133
+ +'HD@'#192'_9$'#244'rE%'#254#164'h3'#255#191#127';'#255#206#146'?'#255#219#163
+ +'C'#255#232#178'F'#255#238#185'G'#255#241#189'H'#255#244#193'H'#255#246#195
+ +'I'#255#247#196'I'#255#247#197'J'#255#247#197'I'#255#247#198'I'#255#248#198
+ +'I'#255#248#198'I'#255#248#197'I'#255#248#198'I'#255#248#198'I'#255#248#198
+ +'I'#255#247#197'I'#255#247#197'I'#255#247#196'I'#255#246#196'I'#255#245#194
+ +'H'#255#242#190'H'#255#239#187'H'#255#235#182'G'#255#224#168'D'#255#211#153
+ +'A'#255#196#134'='#255#177'q7'#255#133'Q)'#254'e: '#253'N?7'#218'DDC'#195'CC'
+ +'C'#160'FFFP@@@'#20#0#0#0#2#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0'III'#7'FFF3CCC'#145'LB;'#204'd:"'#250'|L('#254#180's9'#255
+ +#202#143'A'#255#216#159'F'#255#228#174'I'#255#236#184'K'#255#241#191'L'#255
+ +#243#193'M'#255#244#194'M'#255#244#195'M'#255#245#196'M'#255#245#195'M'#255
+ +#245#195'M'#255#245#195'M'#255#245#195'M'#255#245#195'M'#255#245#195'M'#255
+ +#245#195'M'#255#245#195'M'#255#245#195'M'#255#245#195'M'#255#245#195'M'#255
+ +#245#195'M'#255#245#195'M'#255#245#196'M'#255#245#195'M'#255#244#194'M'#255
+ +#243#194'M'#255#242#192'M'#255#238#186'L'#255#232#179'J'#255#220#165'F'#255
+ +#208#150'C'#255#190#127'<'#255#147'[.'#255'h< '#255'S=1'#228'EED'#199'DDD'
+ +#168'BBBUGGG'#18#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +'@@@'#4'FFF(EEE'#134'P?5'#212'e:!'#254#137'U,'#254#186'z='#255#208#150'E'#255
+ +#224#171'L'#255#233#181'O'#255#238#187'P'#255#240#191'P'#255#242#192'Q'#255
+ +#242#193'Q'#255#242#193'Q'#255#242#193'P'#255#242#193'Q'#255#242#193'Q'#255
+ +#242#193'Q'#255#242#193'Q'#255#242#193'Q'#255#242#193'Q'#255#242#193'Q'#255
+ ,#242#193'Q'#255#242#193'Q'#255#242#193'Q'#255#242#193'Q'#255#242#193'Q'#255
+ +#242#193'Q'#255#242#193'Q'#255#242#193'Q'#255#242#193'Q'#255#242#193'Q'#255
+ +#242#193'Q'#255#242#193'Q'#255#241#192'Q'#255#239#189'P'#255#234#184'O'#255
+ +#228#175'M'#255#215#159'I'#255#194#132'@'#255#160'd3'#255'k?"'#254'X:*'#236
+ +'FDC'#201'CCC'#164'AAAG;;;'#13#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'U'
+ +'UU'#3'BBB'#31'CCCvO=3'#211'f:'#31#255#150']2'#255#190#128'A'#255#211#155'I'
+ +#255#226#175'Q'#255#234#185'S'#255#237#188'T'#255#238#190'T'#255#239#191'U'
+ +#255#239#191'U'#255#239#191'U'#255#239#191'U'#255#239#191'U'#255#239#191'U'
+ +#255#239#191'U'#255#239#191'U'#255#235#189'S'#255'|d,'#255'N>'#28#255'4*'#19
+ +#255'=1'#22#255'WE'#31#255'w_*'#255#173#139'='#255#239#191'U'#255#239#191'U'
+ +#255#239#191'U'#255#239#191'U'#255#239#191'U'#255#239#191'U'#255#239#191'U'
+ +#255#239#191'U'#255#239#191'U'#255#239#190'T'#255#238#189'U'#255#236#187'S'
+ +#255#230#179'R'#255#217#162'L'#255#198#138'D'#255#170'l8'#255'pC$'#254'Z8'''
+ +#240'DBB'#197'CCC'#153'FFF:@@@'#8#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#2'FFF'#22
+ +'BBBeJ?9'#195'b8 '#254#150']2'#255#194#133'E'#255#213#158'N'#255#226#176'T'
+ +#255#233#185'W'#255#236#187'W'#255#236#188'X'#255#236#188'X'#255#236#188'X'
+ +#255#236#188'X'#255#236#188'X'#255#236#188'X'#255#236#188'X'#255#236#188'X'
+ +#255#236#188'X'#255'cO%'#255#4#3#1#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#1#1#0#255#18#14#7#255'A4'#24#255#134'k2'
+ +#255#218#174'R'#255#236#188'X'#255#236#188'X'#255#236#188'X'#255#236#188'X'
+ +#255#236#188'X'#255#236#188'X'#255#236#187'W'#255#234#186'W'#255#229#180'U'
+ +#255#218#165'P'#255#201#143'H'#255#173'o<'#255'k>#'#254'S;-'#231'CCC'#193'CC'
+ +'C'#141'DDD-fff'#5#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'@@@'#12'DDDKFA='#179'`7 '#251#137'S-'
+ +#255#192#131'E'#255#214#161'Q'#255#226#176'W'#255#231#183'Y'#255#233#185'['
+ +#255#233#186'['#255#234#185'Z'#255#234#185'Z'#255#234#185'Z'#255#234#185'Z'
+ +#255#234#185'Z'#255#234#185'Z'#255#234#185'Z'#255#234#185'Z'#255'L<'#29#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#8#7#3#255'P'
+ +'?'#31#255#203#161'N'#255#234#185'Z'#255#234#185'Z'#255#234#185'Z'#255#234
+ +#185'Z'#255#233#186'['#255#232#183'Z'#255#228#178'Y'#255#219#167'T'#255#201
+ +#143'K'#255#163'g8'#255'f: '#255'O=4'#222'DDD'#188'CCCzBBB'#27#0#0#0#1#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'U'
+ +'UU'#3'GGG$D@@'#147'\6#'#245'{I*'#254#185'{C'#255#211#157'R'#255#225#175'Z'
+ +#255#229#181'\'#255#230#183']'#255#230#183']'#255#230#183']'#255#230#183']'
+ +#255#230#183']'#255#230#183']'#255#230#183']'#255#230#183']'#255#230#183']'
+ +#255#230#183']'#255#138'm8'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#24#20#10#255'x_0'
+ +#255#226#181'['#255#230#183']'#255#230#183']'#255#230#183']'#255#230#181'\'
+ +#255#227#177'['#255#217#165'V'#255#196#136'J'#255#151']4'#255'b8 '#254'K@9'
+ +#214'CCC'#175'AAAJ...'#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0'@@@'#16'CCC\V6'''#228'nA&'#254#178'tA'#255#205
+ +#151'R'#255#221#172'\'#255#226#179'_'#255#228#180'_'#255#228#180'_'#255#228
+ +#180'_'#255#228#180'_'#255#228#180'_'#255#228#180'_'#255#228#180'_'#255#228
+ +#180'_'#255#228#180'_'#255#228#180'_'#255#228#180'_'#255#17#13#7#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#2#1#1#255'H9'#30#255#224#178']'
+ +#255#228#180'_'#255#228#180'_'#255#227#179'^'#255#224#175']'#255#213#160'W'
+ +#255#190#129'H'#255#137'T/'#255'^4 '#252'FB?'#201'CCC'#140'DDD"'#0#0#0#3#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'@@@'#4'FFF,J=7'
+ +#175'`4'#30#255#165'g;'#255#200#144'Q'#255#217#166'\'#255#223#176'`'#255#225
+ +#177'`'#255#225#177'a'#255#225#177'a'#255#225#177'a'#255#225#177'a'#255#225
+ +#177'a'#255#225#177'a'#255#225#177'a'#255#225#177'a'#255#225#177'a'#255#225
+ +#177'a'#255#218#171'^'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#11#9#5#255#196#154'U'#255#225#177'a'#255#225#177
+ +'`'#255#224#177'a'#255#220#171'^'#255#208#154'W'#255#184'{F'#255'nA%'#254'T8'
+ +'*'#233'DDD'#180'CCCX333'#15#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0'CCC'#19'CCCjY5#'#239'~J,'#254#191#132'M'#255#213#162']'#255
+ ,#220#171'a'#255#221#173'c'#255#222#174'b'#255#222#174'b'#255#222#174'b'#255
+ +#222#174'b'#255#222#174'b'#255#222#174'b'#255#222#174'b'#255#222#174'b'#255
+ +#222#174'b'#255#222#174'b'#255#222#174'b'#255#154'yC'#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#15#11#6
+ +#255#218#172'`'#255#222#174'b'#255#222#174'b'#255#221#173'b'#255#217#167'_'
+ +#255#202#146'T'#255#156'a9'#255'^4'#30#254'G@='#206'DDD'#151'>>>)@@@'#4#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'UUU'#3'AAA+L;4'#188'b6 '#254#170
+ +'l@'#255#206#152'Z'#255#217#168'b'#255#219#171'd'#255#219#171'd'#255#219#171
+ +'d'#255#219#171'd'#255#219#171'd'#255#219#171'd'#255#219#171'd'#255#219#171
+ +'d'#255#219#171'd'#255#219#171'd'#255#219#171'd'#255#219#171'd'#255#219#171
+ +'d'#255#219#171'd'#255#26#20#12#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'oW3'#255#219#171'd'#255#219
+ +#171'd'#255#219#171'd'#255#218#169'c'#255#212#161'_'#255#187#127'L'#255'uD)'
+ +#254'W6('#238'CCC'#182'CCC[III'#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0'@@@'#12'EBBS[3'#31#244#134'O/'#255#192#134'Q'#255#212#162'b'#255#215
+ +#167'd'#255#216#168'd'#255#216#168'd'#255#216#168'd'#255#216#168'd'#255#216
+ +#168'd'#255#216#168'd'#255#216#168'd'#255#216#168'd'#255#216#168'd'#255#216
+ +#168'd'#255#216#168'd'#255#216#168'd'#255#216#168'd'#255#216#168'd'#255#198
+ +#154'\'#255#5#4#2#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255'!'#25#15#255#216#168'd'#255#216#168'd'#255#216#168
+ +'d'#255#216#168'd'#255#214#166'd'#255#202#147'Y'#255#161'e='#255'^2'#29#255
+ +'J?:'#208'CCC'#137'EEE'#26#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'C'
+ +'CC'#23'O9/'#171'`3'#31#254#174'pD'#255#203#150']'#255#212#163'e'#255#213#164
+ +'e'#255#213#164'e'#255#213#164'e'#255#213#164'e'#255#213#164'e'#255#213#164
+ +'e'#255#213#164'e'#255#213#164'e'#255#213#164'e'#255#213#164'e'#255#213#164
+ +'e'#255#213#164'e'#255#213#164'e'#255#213#164'e'#255#213#164'e'#255#213#164
+ +'e'#255#173#133'R'#255#3#2#1#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#22#17#11#255#213#164'e'#255#213#164'e'#255#213#164
+ +'e'#255#213#164'e'#255#213#164'f'#255#209#158'a'#255#187#128'O'#255'yD)'#254
+ +'W4$'#241'BBB'#169'DDD1@@@'#4#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#2'FFF(W4'
+ +'$'#229'{E)'#255#191#134'T'#255#207#157'c'#255#210#160'f'#255#210#160'f'#255
+ +#210#160'f'#255#210#160'f'#255#210#160'f'#255#210#160'f'#255#210#160'f'#255
+ +#210#160'f'#255#152'tJ'#255'[E,'#255'K9$'#255'{]<'#255#196#149'_'#255#210#160
+ +'f'#255#210#160'f'#255#210#160'f'#255#210#160'f'#255#210#160'f'#255#159'yM'
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'"'
+ +#26#17#255#210#160'f'#255#210#160'f'#255#210#160'f'#255#210#160'f'#255#210
+ +#160'f'#255#209#160'e'#255#199#146']'#255#156'_;'#255'\1'#28#254'FBA'#188'FF'
+ +'FXNNN'#13#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'FFF'#11'F@=T\/'#28#253#151'\9'#255
+ +#200#147'_'#255#207#156'e'#255#207#156'e'#255#207#156'e'#255#207#156'e'#255
+ +#207#156'e'#255#207#156'e'#255#207#156'e'#255#178#135'W'#255'$'#27#17#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'N:&'#255#207#156'e'#255#207
+ +#156'e'#255#207#156'e'#255#207#156'e'#255#207#156'e'#255#3#2#1#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'uX9'#255#207#156'e'#255#207
+ +#156'e'#255#207#156'e'#255#207#156'e'#255#207#156'e'#255#207#157'e'#255#204
+ +#153'b'#255#180'wK'#255'a4'#30#254'M;3'#216'DDD'#132'==='#25#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0'CCC'#19'N9.'#159'^2'#30#254#176'rI'#255#202#150'c'#255#203
+ +#153'e'#255#203#153'f'#255#203#153'f'#255#203#153'f'#255#203#153'f'#255#203
+ +#153'f'#255#163'zQ'#255#1#1#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#29#22#15#255#203#153'f'#255#203#153'f'#255#203#153
+ +'f'#255#203#153'f'#255#14#10#7#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ ,#0#0#255#4#3#2#255#203#153'f'#255#203#153'f'#255#203#153'f'#255#203#153'f'
+ +#255#203#153'f'#255#203#153'f'#255#203#153'f'#255#203#152'e'#255#190#134'X'
+ +#255'yC)'#254'V5&'#239'DDD'#165'FFF('#128#128#128#2#0#0#0#0#0#0#0#0#0#0#0#0
+ +'GGG'#25'V4%'#212's@&'#254#186#128'U'#255#199#148'd'#255#200#148'd'#255#200
+ +#148'd'#255#200#148'd'#255#200#148'd'#255#200#148'd'#255#198#146'd'#255#12#9
+ +#6#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#138'fE'#255#200#148'd'#255#200#148'd'#255#200#148'd'#255
+ +#15#11#7#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#1#0#0#255'&'#28#19#255#145'kH'#255
+ +#200#148'd'#255#200#148'd'#255#200#148'd'#255#200#148'd'#255#200#148'd'#255
+ +#200#148'd'#255#200#148'd'#255#200#148'd'#255#194#141'^'#255#146'W6'#255'[0'
+ +#28#254'EBB'#178'CCC9UUU'#6#0#0#0#0#0#0#0#0#0#0#0#0'JAA'#31'\1'#29#249#140'P'
+ +'2'#255#190#135'\'#255#196#143'c'#255#196#143'c'#255#196#143'c'#255#196#143
+ +'c'#255#196#143'c'#255#196#143'c'#255'>-'#31#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'&'
+ +#28#19#255#196#143'c'#255#196#143'c'#255#196#143'c'#255#25#18#12#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#2#2#1
+ +#255'*'#31#21#255'kM6'#255#187#137'_'#255#196#143'c'#255#196#143'c'#255#196
+ +#143'c'#255#196#143'c'#255#196#143'c'#255#196#143'c'#255#196#143'c'#255#196
+ +#143'c'#255#196#143'c'#255#196#143'c'#255#194#141'b'#255#170'kF'#255'\0'#28
+ +#254'L<5'#203'CCCH333'#10#0#0#0#0#0#0#0#0#0#0#0#1'K3+@[/'#27#255#160'`>'#255
+ +#190#136'_'#255#191#137'`'#255#191#137'`'#255#191#137'`'#255#191#137'`'#255
+ +#191#137'`'#255#189#135'`'#255#1#1#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#30#21#15#255
+ +#191#137'`'#255#191#137'`'#255#191#137'`'#255'aF1'#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#5#3#2#255#165'vS'#255#191#137'`'
+ +#255#191#137'`'#255#191#137'`'#255#191#137'`'#255#191#137'`'#255#191#137'`'
+ +#255#191#137'`'#255#191#137'`'#255#191#137'`'#255#191#137'`'#255#191#137'`'
+ +#255#191#137'`'#255#191#137'`'#255#191#136'`'#255#178'vQ'#255'h7 '#253'Q8,'
+ +#220'DDDV;;;'#13#0#0#0#0#0#0#0#0'UUU'#3'R4''^[/'#27#255#169'hF'#255#187#131
+ +']'#255#187#132'^'#255#187#132'^'#255#187#132'^'#255#187#132'^'#255#187#132
+ +'^'#255'uS;'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'{W>'#255#187#132'^'#255
+ +#187#132'^'#255#187#132'^'#255#185#130'^'#255#19#14#10#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#1#1#1#255#158'oO'#255#187#132'^'#255#187#132'^'
+ +#255#187#132'^'#255#187#132'^'#255#187#132'^'#255#187#132'^'#255#187#132'^'
+ +#255#187#132'^'#255#187#132'^'#255#187#132'^'#255#187#132'^'#255#187#132'^'
+ +#255#187#132'^'#255#187#132'^'#255#187#132'^'#255#181'{V'#255'r<"'#255'T6'''
+ +#228'BBBd@@@'#16#0#0#0#0#0#0#0#0'UUU'#6'T5''}_2'#30#253#171'kI'#255#183'}Z'
+ +#255#183'~Z'#255#183'~Z'#255#183'~Z'#255#183'~Z'#255#183'~Z'#255'. '#23#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#1#1#0#255'S9)'#255#183'~Z'#255#183'~Z'#255#183'~Z'#255#183'~Z'
+ +#255#183'~Z'#255#173'xV'#255#31#21#15#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'b'
+ +'C0'#255#183'~Z'#255#183'~Z'#255#183'~Z'#255#183'~Z'#255#183'~Z'#255#183'~Z'
+ +#255#183'~Z'#255#183'~Z'#255#183'~Z'#255#183'~Z'#255#183'~Z'#255#183'~Z'#255
+ +#183'~Z'#255#183'~Z'#255#183'~Z'#255#183'~Z'#255#181'zV'#255'zA%'#255'X4$'
+ +#237'DDDqCCC'#19#0#0#0#0#0#0#0#0'@@@'#8'U4%'#149'f5'#31#252#172'mK'#255#180
+ +'yX'#255#180'yX'#255#180'yX'#255#180'yX'#255#180'yX'#255#180'yX'#255#6#4#3
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#19#13#9#255#153'gK'#255#180'yX'#255#180'yX'#255#180'yX'#255#180'yX'
+ +#255#180'yX'#255#180'yX'#255#180'yX'#255#180'yX'#255'{S<'#255'+'#29#21#255#7
+ +#4#3#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#1#1#1
+ +#255'gF3'#255#180'yX'#255#180'yX'#255#180'yX'#255#139']D'#255'+'#29#21#255#8
+ +#6#4#255#8#6#4#255#16#11#8#255'W:*'#255#178'wV'#255#180'yX'#255#180'yX'#255
+ +#180'yX'#255#180'yX'#255#180'yX'#255#180'yX'#255#180'yX'#255#179'yV'#255#131
+ +'F+'#255'[3!'#245'CCCyIII'#21#0#0#0#0#0#0#0#0'UUU'#6'X3"'#165'n:"'#253#172'p'
+ +'O'#255#177'wW'#255#177'wW'#255#177'wW'#255#177'wW'#255#177'wW'#255#173'uU'
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#1
+ +#0#0#255'P6'''#255#177'wW'#255#177'wW'#255#177'wW'#255#177'wW'#255#177'wW'
+ ,#255#177'wW'#255#177'wW'#255#177'wW'#255#177'wW'#255#177'wW'#255#177'wW'#255
+ +#177'wW'#255#177'wW'#255#158'jM'#255'W;+'#255''''#26#19#255'"'#23#17#255'%'
+ +#25#18#255'W:+'#255#167'qS'#255#177'wW'#255#177'wW'#255#177'wW'#255'@+'#31
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#3#2#1#255
+ +#149'dI'#255#177'wW'#255#177'wW'#255#177'wW'#255#177'wW'#255#177'wW'#255#177
+ +'wW'#255#177'vV'#255#139'M0'#255'[1'#30#250'DDDpCCC'#19#0#0#0#0#0#0#0#0'UUU'
+ +#3'Y1'#31#182'v>%'#255#172'oQ'#255#175'tW'#255#175'tW'#255#175'tW'#255#175't'
+ +'W'#255#175'tW'#255'}S?'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#26#17#13#255#150'cK'#255#175'tW'#255#175'tW'#255#175'tW'#255
+ +#175'tW'#255#175'tW'#255#175'tW'#255#175'tW'#255#175'tW'#255#175'tW'#255#175
+ +'tW'#255#175'tW'#255#175'tW'#255#175'tW'#255#175'tW'#255#175'tW'#255#175'tW'
+ +#255#175'tW'#255#175'tW'#255#175'tW'#255#175'tW'#255#175'tW'#255#175'tW'#255
+ +#175'tW'#255'dC2'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#9#6#4#255#169'pU'#255#175'tW'#255#175'tW'#255#175't'
+ +'W'#255#175'tW'#255#175'tW'#255#174'sU'#255#145'S6'#255']0'#28#254'DBBd@@@'
+ +#16#0#0#0#0#0#0#0#0#0#0#0#0'Z0'#30#175'v=%'#255#171'nP'#255#174'rV'#255#174
+ +'rV'#255#174'rV'#255#174'rV'#255#174'rV'#255'L2&'#255#0#0#0#255'/'#31#23#255
+ +'}R>'#255' '#21#16#255'!'#22#17#255#139'[E'#255#174'rV'#255#174'rV'#255#174
+ +'rV'#255#174'rV'#255#174'rV'#255#174'rV'#255#174'rV'#255#174'rV'#255#174'rV'
+ +#255#174'rV'#255#174'rV'#255#174'rV'#255#174'rV'#255#174'rV'#255#174'rV'#255
+ +#174'rV'#255#174'rV'#255#174'rV'#255#174'rV'#255#174'rV'#255#174'rV'#255#174
+ +'rV'#255#174'rV'#255#174'rV'#255#174'rV'#255'?*'#31#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'6#'#27
+ +#255#174'rV'#255#174'rV'#255#174'rV'#255#174'rV'#255#174'rV'#255#173'qT'#255
+ +#145'S7'#255'\1'#29#254'AAAV;;;'#13#0#0#0#0#0#0#0#0#0#0#0#0'Z1'#30#150'n;$'
+ +#252#169'jM'#255#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255
+ +#149'bI'#255'@* '#255#170'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'
+ +#255#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255
+ +#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255#172
+ +'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'
+ +#255#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255
+ +'G/#'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#24#16#12#255#172'qU'#255#172'qU'#255#172'qU'#255#172
+ +'qU'#255#172'qU'#255#171'oS'#255#138'N3'#255'\2'#31#249'DDDG999'#9#0#0#0#0#0
+ +#0#0#0#0#0#0#0'X1!|g7#'#250#167'gI'#255#172'pT'#255#172'qU'#255#172'qU'#255
+ +#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255#172
+ +'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'
+ +#255#172'qU'#255'P5('#255')'#27#20#255#27#18#13#255'5#'#26#255'pJ8'#255#172
+ +'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'
+ +#255#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255
+ +#172'qU'#255#172'qU'#255#162'jO'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#9#6#4#255#172'qU'#255#172
+ +'qU'#255#172'qU'#255#172'qU'#255#172'qU'#255#170'mR'#255#131'I.'#255'[4"'#241
+ +'FFF7UUU'#6#0#0#0#0#0#0#0#0#0#0#0#0'Y1!`b5 '#251#164'cG'#255#172'pU'#255#173
+ +'rW'#255#173'rW'#255#173'rW'#255#173'rW'#255#173'rW'#255#173'rW'#255#173'rW'
+ +#255#173'rW'#255#173'rW'#255#173'rW'#255#173'rW'#255#173'rW'#255#173'rW'#255
+ +#173'rW'#255'}S?'#255#9#6#5#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#16#11#8#255#152'dM'#255#173'rW'#255#173'rW'#255#173'rW'#255#173'rW'#255
+ +#173'rW'#255#173'rW'#255#173'rW'#255#173'rW'#255#173'rW'#255#173'rW'#255#173
+ +'rW'#255#173'rW'#255#173'rW'#255#173'rW'#255'$'#24#18#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#4#3#2#255#173'r'
+ +'W'#255#173'rW'#255#173'rW'#255#173'rW'#255#173'rW'#255#170'mQ'#255'|C*'#255
+ +'W4$'#229'CCC&'#0#0#0#2#0#0#0#0#0#0#0#0#0#0#0#0'X5!A^2'#31#254#162'bE'#255
+ +#173'rV'#255#175'tY'#255#175'tY'#255#175'tY'#255#175'tY'#255#175'tY'#255#175
+ +'tY'#255#175'tY'#255#175'tY'#255#175'tY'#255#175'tY'#255#175'tY'#255#175'tY'
+ +#255#175'tY'#255'{Q?'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#14#9#7#255#173'tY'#255#175'tY'#255#175'tY'#255
+ +#175'tY'#255#175'tY'#255#175'tY'#255#175'tY'#255#175'tY'#255#175'tY'#255#175
+ +'tY'#255#175'tY'#255#175'tY'#255#175'tY'#255#175'tY'#255#132'XC'#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#21
+ +#14#11#255#175'tY'#255#175'tY'#255#175'tY'#255#175'tY'#255#174'tY'#255#170'm'
+ +'P'#255't?('#254'U5&'#203'@@@'#24#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'X0'#24' ^2'
+ +#31#255#156'\A'#255#175'v\'#255#177'y`'#255#177'y`'#255#177'y`'#255#177'y`'
+ +#255#177'y`'#255#177'y`'#255#177'y`'#255#177'y`'#255#177'y`'#255#177'y`'#255
+ ,#177'y`'#255#177'y`'#255#177'y`'#255#11#8#6#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#136']J'#255#177
+ +'y`'#255#177'y`'#255'7%'#30#255#9#6#5#255#13#9#7#255#16#11#9#255#26#18#14#255
+ +#139'_K'#255#177'y`'#255#177'y`'#255#177'y`'#255#177'y`'#255#177'y`'#255#177
+ +'y`'#255#18#12#9#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255'<)!'#255#177'y`'#255#177'y`'#255#177'y`'#255#177'y`'#255#176
+ +'x^'#255#169'kP'#255'j<&'#253'U4%'#168';;;'#13#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0'^2'#29#234#136'O4'#255#176'x^'#255#180'~f'#255#180'~f'#255#180'~f'
+ +#255#180'~f'#255#180'~f'#255#180'~f'#255#180'~f'#255#180'~f'#255#180'~f'#255
+ +#180'~f'#255#180'~f'#255#180'~f'#255#146'gS'#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#139'bO'#255#170'x`'#255#20#14#11#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255']A4'#255#180'~f'#255#180'~f'#255#180'~f'#255#180'~f'#255
+ +#180'~f'#255'qO@'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#1#1#0#255#165't^'#255#180'~f'#255#180'~f'#255#180'~f'#255#180'~f'#255
+ +#178'zb'#255#162'dH'#255'_3'#31#254'R6)c@@@'#4#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0'[/'#29#153'r?)'#252#174'sZ'#255#182#129'j'#255#183#131'l'#255#183
+ +#131'l'#255#183#131'l'#255#183#131'l'#255#183#131'l'#255#183#131'l'#255#183
+ +#131'l'#255#183#131'l'#255#183#131'l'#255#183#131'l'#255#183#131'l'#255'ZA5'
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#5#3#3#255#179#127'j'#255'uTE'#255#0#0#0#255#0#0#0#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'{XI'#255#183#131'l'
+ +#255#183#131'l'#255#183#131'l'#255#183#131'l'#255#183#131'l'#255#20#15#12#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255':)"'#255#183#131'l'#255
+ +#183#131'l'#255#183#131'l'#255#183#131'l'#255#183#131'l'#255#179'|c'#255#140
+ +'R9'#255'\2'#31#248'@@6'#28#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +'[/'#29'E`5 '#252#166'iO'#255#183#131'l'#255#186#136'q'#255#186#136'q'#255
+ +#186#136'q'#255#186#136'q'#255#186#136'q'#255#186#136'q'#255#186#136'q'#255
+ +#186#136'q'#255#186#136'q'#255#186#136'q'#255#186#136'q'#255'\D8'#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255'oQC'#255#186#136'q'#255'X@6'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#12#9#7#255#186#136'q'#255#186
+ +#136'q'#255#186#136'q'#255#186#136'q'#255#186#136'q'#255#148'lZ'#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#169'|g'#255#186#136'q'#255#186
+ +#136'q'#255#186#136'q'#255#186#136'q'#255#185#134'q'#255#177'y`'#255'tB+'#254
+ +'W2!'#194'III'#14#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'@@'#0#4'^3'
+ +#30#245#144'W='#255#184#134'o'#255#189#141'x'#255#189#141'x'#255#189#141'x'
+ +#255#189#141'x'#255#189#141'x'#255#189#141'x'#255#189#141'x'#255#189#141'x'
+ +#255#189#141'x'#255#189#141'x'#255#189#141'x'#255'tWJ'#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'('#30#26#255
+ +#189#141'x'#255#189#141'x'#255'?/('#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#187#139'v'#255#189#141
+ +'x'#255#189#141'x'#255#189#141'x'#255#189#141'x'#255#189#141'x'#255#172#128
+ +'m'#255'_G<'#255#1#0#0#255#0#0#0#255'-"'#28#255#189#141'x'#255#189#141'x'#255
+ +#189#141'x'#255#189#141'x'#255#189#141'x'#255#186#137's'#255#171'oU'#255'a6"'
+ +#253'T5$jUUU'#3#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'\/'
+ +#27#170'vD,'#252#181#128'h'#255#190#144'{'#255#192#146'~'#255#192#146'~'#255
+ +#192#146'~'#255#192#146'~'#255#192#146'~'#255#192#146'~'#255#192#146'~'#255
+ +#192#146'~'#255#192#146'~'#255#192#146'~'#255#186#142'z'#255#1#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#2#1#1#255#186#142'z'
+ +#255#192#146'~'#255#192#146'~'#255'=.('#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#192#146'~'#255#192
+ +#146'~'#255#192#146'~'#255#192#146'~'#255#192#146'~'#255#192#146'~'#255#192
+ +#146'~'#255#192#146'~'#255#0#0#0#255#0#0#0#255#167#127'n'#255#192#146'~'#255
+ +#192#146'~'#255#192#146'~'#255#192#146'~'#255#191#145'}'#255#186#137's'#255
+ +#149'[A'#255'^1'#31#250'F:.'#22#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0'\.'#28'H`5 '#252#164'jP'#255#190#143'z'#255#194#151#131
+ +#255#194#151#131#255#194#151#131#255#194#151#131#255#194#151#131#255#194#151
+ +#131#255#194#151#131#255#194#151#131#255#194#151#131#255#194#151#131#255#194
+ +#151#131#255#27#21#18#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255' '#25#21#255#194#151#131#255#194#151#131#255#194#151#131#255'7*%'
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#12#9#8#255#194#151#131#255#194#151#131#255#194#151#131#255#194#151
+ +#131#255#194#151#131#255#194#151#131#255#194#151#131#255#190#149#129#255#0#0
+ ,#0#255'0% '#255#194#151#131#255#194#151#131#255#194#151#131#255#194#151#131
+ +#255#194#151#131#255#192#147#127#255#180'~f'#255'q@+'#252'Z0'#29#180#0#0#0#2
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0']0'
+ +#28#199'{H2'#252#184#134'o'#255#196#153#134#255#197#156#137#255#197#156#137
+ +#255#197#156#137#255#197#156#137#255#197#156#137#255#197#156#137#255#197#156
+ +#137#255#197#156#137#255#197#156#137#255#197#156#137#255'G81'#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255'WE='#255#197#156#137#255#197
+ +#156#137#255#191#152#133#255#1#1#1#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#135'k^'#255#197#156#137#255#197
+ +#156#137#255#197#156#137#255#197#156#137#255#197#156#137#255#197#156#137#255
+ +#197#156#137#255#197#156#137#255#16#12#11#255#174#138'y'#255#197#156#137#255
+ +#197#156#137#255#197#156#137#255#197#156#137#255#197#155#136#255#191#145'|'
+ +#255#151'_F'#255'^3'#31#253'T2!-'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[0'#29'5_4 '#254#161'hP'#255#195#152#132
+ +#255#200#161#143#255#200#161#144#255#200#161#144#255#200#161#144#255#200#161
+ +#144#255#200#161#144#255#200#161#144#255#200#161#144#255#200#161#144#255#200
+ +#161#144#255'xaW'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#1#1#1
+ +#255#171#138'{'#255#200#161#144#255#200#161#144#255#127'f\'#255#0#0#0#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255')!'#30#255
+ +#200#161#144#255#200#161#144#255#200#161#144#255#200#161#144#255#200#161#144
+ +#255#200#161#144#255#200#161#144#255#200#161#144#255#200#161#144#255#153'{n'
+ +#255#200#161#144#255#200#161#144#255#200#161#144#255#200#161#144#255#200#161
+ +#144#255#198#156#138#255#181#128'h'#255'l>*'#252'Z1'#30#159#0#0#0#1#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0'^0'#27#173'uE/'#249#186#136'r'#255#201#162#145#255#203#165#150#255#203#165
+ +#150#255#203#165#150#255#203#165#150#255#203#165#150#255#203#165#150#255#203
+ +#165#150#255#203#165#150#255#203#165#150#255#163#132'x'#255#0#0#0#255#0#0#0
+ +#255#26#21#19#255',$!'#255'-%!'#255#156'~s'#255#203#165#150#255#203#165#150
+ +#255#203#165#150#255'@4/'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#4#3#3#255#186#151#138#255#203#165#150#255#203#165
+ +#150#255#203#165#150#255#203#165#150#255#203#165#150#255#203#165#150#255#203
+ +#165#150#255#203#165#150#255#203#165#150#255#203#165#150#255#203#165#150#255
+ +#203#165#150#255#203#165#150#255#203#165#150#255#203#164#149#255#195#152#132
+ +#255#146'\D'#255'_3'#31#247'R3'#30#25#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'Z-'#30'"^4 '#252#155
+ +'cK'#255#196#153#136#255#206#169#155#255#207#171#156#255#207#171#156#255#207
+ +#171#156#255#207#171#156#255#207#171#156#255#207#171#156#255#207#171#156#255
+ +#207#171#156#255#203#167#152#255#0#0#0#255#0#0#0#255#193#159#145#255#207#171
+ +#156#255#207#171#156#255#207#171#156#255#207#171#156#255#207#171#156#255#207
+ +#171#156#255'E94'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#15#12#11#255#182#150#137#255#207#171#156#255#207#171#156#255#207#171#156
+ +#255#207#171#156#255#207#171#156#255#207#171#156#255#207#171#156#255#207#171
+ +#156#255#207#171#156#255#207#171#156#255#207#171#156#255#207#171#156#255#207
+ +#171#156#255#207#171#156#255#206#170#155#255#201#162#145#255#178'}f'#255'h<('
+ +#250'[0'#28#129#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0']1'#29#130'f:&'#250#171'u'
+ +'^'#255#202#164#148#255#210#176#163#255#210#177#164#255#210#177#164#255#210
+ +#177#164#255#210#177#164#255#210#177#164#255#210#177#164#255#210#177#164#255
+ +#210#177#164#255#2#1#1#255#27#22#21#255#210#177#164#255#210#177#164#255#210
+ +#177#164#255#210#177#164#255#210#177#164#255#210#177#164#255#210#177#164#255
+ +#210#177#164#255'I=8'#255#6#5#4#255#0#0#0#255#0#0#0#255#0#0#0#255'''!'#31#255
+ +#206#175#162#255#210#177#164#255#210#177#164#255#210#177#164#255#210#177#164
+ +#255#210#177#164#255#210#177#164#255#210#177#164#255#210#177#164#255#210#177
+ +#164#255#210#177#164#255#210#177#164#255#210#177#164#255#210#177#164#255#210
+ +#177#164#255#210#176#163#255#206#170#155#255#188#139'w'#255'zI4'#252'^2'#29
+ +#222']/'#23#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'^1'#29#181'oA-'
+ +#249#182#132'n'#255#208#173#159#255#213#182#169#255#213#183#170#255#213#183
+ +#170#255#213#183#170#255#213#183#170#255#213#183#170#255#213#183#170#255#213
+ +#183#170#255#12#10#9#255#159#136#127#255#213#183#170#255#213#183#170#255#213
+ +#183#170#255#213#183#170#255#213#183#170#255#213#183#170#255#213#183#170#255
+ +#213#183#170#255#213#183#170#255#139'xo'#255#0#0#0#255#0#0#0#255'% '#30#255
+ +#213#183#170#255#213#183#170#255#213#183#170#255#213#183#170#255#213#183#170
+ +#255#213#183#170#255#213#183#170#255#213#183#170#255#213#183#170#255#213#183
+ ,#170#255#213#183#170#255#213#183#170#255#213#183#170#255#213#183#170#255#213
+ +#183#170#255#213#183#170#255#211#178#165#255#196#152#134#255#136'T?'#254'`1 '
+ +#243'U+'#28'$'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'U+'#21#12
+ +']2'#30#218'zK5'#251#192#146#127#255#212#180#168#255#216#187#176#255#217#188
+ +#177#255#217#188#177#255#217#188#177#255#217#188#177#255#217#188#177#255#217
+ +#188#177#255'o`Z'#255#217#188#177#255#217#188#177#255#217#188#177#255#217#188
+ +#177#255#217#188#177#255#217#188#177#255#217#188#177#255#217#188#177#255#217
+ +#188#177#255#217#188#177#255#27#24#22#255#0#0#0#255#9#8#7#255#209#180#171#255
+ +#217#188#177#255#217#188#177#255#217#188#177#255#217#188#177#255#217#188#177
+ +#255#217#188#177#255#217#188#177#255#217#188#177#255#217#188#177#255#217#188
+ +#177#255#217#188#177#255#217#188#177#255#217#188#177#255#217#188#177#255#217
+ +#188#177#255#215#185#173#255#202#163#147#255#152'cM'#255'`5 '#252'X.'#27'B'#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'].'#23'!_'
+ +'3 '#241#135'V@'#254#197#155#137#255#215#185#173#255#219#193#183#255#220#194
+ +#184#255#220#194#184#255#220#194#184#255#220#194#184#255#220#194#184#255#220
+ +#194#184#255#220#194#184#255#220#194#184#255#220#194#184#255#220#194#184#255
+ +#220#194#184#255#220#194#184#255#220#194#184#255#220#194#184#255#220#194#184
+ +#255#220#194#184#255#4#4#4#255#13#11#11#255#197#173#164#255#220#194#184#255
+ +#220#194#184#255#220#194#184#255#220#194#184#255#220#194#184#255#220#194#184
+ +#255#220#194#184#255#220#194#184#255#220#194#184#255#220#194#184#255#220#194
+ +#184#255#220#194#184#255#220#194#184#255#220#194#184#255#220#194#183#255#218
+ +#190#179#255#205#169#154#255#165'pY'#255'b8$'#252'[/'#27'h'#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'Y1'#28'?_'
+ +'3!'#249#132'T?'#252#193#148#130#255#215#186#174#255#223#198#189#255#223#200
+ +#191#255#223#200#191#255#223#200#191#255#223#200#191#255#223#200#191#255#223
+ +#200#191#255#223#200#191#255#223#200#191#255#223#200#191#255#223#200#191#255
+ +#223#200#191#255#223#200#191#255#223#200#191#255#223#200#191#255#223#200#191
+ +#255#199#179#171#255#215#192#183#255#223#200#191#255#223#200#191#255#223#200
+ +#191#255#223#200#191#255#223#200#191#255#223#200#191#255#223#200#191#255#223
+ +#200#191#255#223#200#191#255#223#200#191#255#223#200#191#255#223#200#191#255
+ +#223#200#191#255#223#200#191#255#223#199#190#255#219#192#183#255#203#165#150
+ +#255#158'kS'#255'c9%'#251']0'#30#147#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'Z-'#25'3_3'#30
+ +#234'wI5'#250#185#138'v'#255#215#186#174#255#225#203#194#255#227#205#197#255
+ +#227#205#197#255#227#205#197#255#227#205#197#255#227#205#197#255#227#205#197
+ +#255#227#205#197#255#227#205#197#255#227#205#197#255#227#205#197#255#227#205
+ +#197#255#227#205#197#255#227#205#197#255#227#205#197#255#227#205#197#255#227
+ +#205#197#255#227#205#197#255#227#205#197#255#227#205#197#255#227#205#197#255
+ +#227#205#197#255#227#205#197#255#227#205#197#255#227#205#197#255#227#205#197
+ +#255#227#205#197#255#227#205#197#255#227#205#197#255#227#205#197#255#226#204
+ +#196#255#220#194#183#255#200#159#143#255#144'_H'#254'a6"'#253'\1'#30'y'#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'\3'#31#25'^2'#29#207'nB.'#249#175'~i'#255
+ +#213#182#169#255#225#202#193#255#230#209#203#255#230#211#205#255#230#211#205
+ +#255#230#211#205#255#230#211#205#255#230#211#205#255#230#211#205#255#230#211
+ +#205#255#230#211#205#255#230#211#205#255#230#211#205#255#230#211#205#255#230
+ +#211#205#255#230#211#205#255#230#211#205#255#230#211#205#255#230#211#205#255
+ +#230#211#205#255#230#211#205#255#230#211#205#255#230#211#205#255#230#211#205
+ +#255#230#211#205#255#230#211#205#255#230#211#205#255#230#211#205#255#230#210
+ +#204#255#227#205#198#255#219#191#181#255#193#149#131#255#131'R='#251'_4 '#247
+ +'Z0'#26'O'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'` '#8']0'
+ +#28#169'e:'''#250#148'aL'#255#196#153#136#255#220#193#183#255#229#209#202#255
+ +#233#216#210#255#234#216#211#255#234#216#211#255#234#216#211#255#234#216#211
+ +#255#234#216#211#255#234#216#211#255#234#216#211#255#234#216#211#255#234#216
+ +#211#255#234#216#211#255#234#216#211#255#234#216#211#255#234#216#211#255#234
+ +#216#211#255#234#216#211#255#234#216#211#255#234#216#211#255#234#216#211#255
+ +#234#216#211#255#234#216#211#255#234#216#211#255#233#216#211#255#231#212#206
+ ,#255#224#200#192#255#207#171#156#255#168'va'#255'rE1'#249'^3'#31#230'Y,'#28
+ +'.'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0'^1'#29'h`3'#31#237'nA/'#249#158'mW'#255#203#165#150#255#224#201#192
+ +#255#232#213#208#255#235#219#215#255#237#222#218#255#237#222#218#255#237#222
+ +#218#255#237#222#218#255#237#222#218#255#237#222#218#255#237#222#218#255#237
+ +#222#218#255#237#222#218#255#237#222#218#255#237#222#218#255#237#222#218#255
+ +#237#222#218#255#237#222#218#255#237#222#218#255#237#222#218#255#237#222#218
+ +#255#236#220#216#255#233#216#211#255#228#206#200#255#213#182#170#255#177#131
+ +'n'#255'}M:'#250'a6"'#253']1'#29#155'U1'#24#21#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'].'#23#11
+ +']1'#29'~`5!'#246'tF5'#249#166'u`'#255#202#164#148#255#221#195#186#255#230
+ +#210#203#255#234#218#213#255#238#224#220#255#240#227#224#255#240#227#225#255
+ +#240#227#225#255#240#227#225#255#240#227#225#255#240#227#225#255#240#227#225
+ +#255#240#227#225#255#240#227#225#255#240#227#225#255#240#227#225#255#239#225
+ +#222#255#236#220#215#255#232#213#207#255#225#203#194#255#210#176#164#255#183
+ +#138'u'#255#133'UA'#252'c9&'#254'^2'#30#178'\.'#26''''#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'U1'#24#21']0'#30#147'`7"'#251'jA-'#249#133'UA'
+ +#253#169'zf'#255#201#162#146#255#220#194#184#255#230#211#205#255#233#215#210
+ +#255#234#217#212#255#236#220#215#255#237#222#218#255#238#223#220#255#237#222
+ +#219#255#236#220#216#255#234#219#213#255#233#216#211#255#231#213#206#255#225
+ +#203#194#255#209#174#160#255#181#136'u'#255#145'`L'#255'sG4'#249'c9&'#255'_2'
+ +#30#198'].'#28'7'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0'U+'#28#18'\.'#27'^_1'#30#179'c7$'#248'h?,'#251#127
+ +'Q;'#251#148'dN'#255#163't_'#255#175#129'n'#255#186#143'~'#255#198#157#141
+ +#255#204#167#151#255#201#161#145#255#191#149#132#255#179#135'u'#255#167'ye'
+ +#255#153'iT'#255#136'WC'#254'pE2'#249'c9&'#255'_3'#31#212'Z/'#27'|].'#29','#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'U9'#28#9'\.'#26'N^0'#29#157'`'
+ +'4 '#203'c6#'#230'c7%'#249'd:('#255'f=*'#255'i?-'#252'g>+'#255'e;('#255'd9&'
+ +#253'b7$'#237'a5!'#214'_1'#30#180'\/'#26'lX,'#26#29#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0'`0 '#16'[1'#24'*].'#27'B]1'#29'4\3'#31#25'UU'#0#3#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#248#15#255
+ +#255#255#255#255#254#0#0#127#255#255#255#255#240#0#0#7#255#255#255#255#192#0
+ +#0#1#255#255#255#255#0#0#0#0#255#255#255#252#0#0#0#0'?'#255#255#248#0#0#0#0
+ +#31#255#255#240#0#0#0#0#7#255#255#192#0#0#0#0#3#255#255#128#0#0#0#0#1#255#255
+ +#128#0#0#0#0#0#255#255#0#0#0#0#0#0#127#254#0#0#0#0#0#0#127#252#0#0#0#0#0#0'?'
+ +#252#0#0#0#0#0#0#31#248#0#0#0#0#0#0#31#248#0#0#0#0#0#0#15#240#0#0#0#0#0#0#15
+ ,#240#0#0#0#0#0#0#7#224#0#0#0#0#0#0#7#224#0#0#0#0#0#0#7#224#0#0#0#0#0#0#3#192
+ +#0#0#0#0#0#0#3#192#0#0#0#0#0#0#3#192#0#0#0#0#0#0#1#192#0#0#0#0#0#0#1#192#0#0
+ +#0#0#0#0#1#128#0#0#0#0#0#0#1#128#0#0#0#0#0#0#1#128#0#0#0#0#0#0#1#128#0#0#0#0
+ +#0#0#1#128#0#0#0#0#0#0#1#128#0#0#0#0#0#0#1#192#0#0#0#0#0#0#1#192#0#0#0#0#0#0
+ +#1#192#0#0#0#0#0#0#1#192#0#0#0#0#0#0#1#192#0#0#0#0#0#0#3#192#0#0#0#0#0#0#3
+ +#224#0#0#0#0#0#0#3#224#0#0#0#0#0#0#7#224#0#0#0#0#0#0#7#224#0#0#0#0#0#0#7#240
+ +#0#0#0#0#0#0#15#240#0#0#0#0#0#0#15#248#0#0#0#0#0#0#31#248#0#0#0#0#0#0#31#252
+ +#0#0#0#0#0#0'?'#252#0#0#0#0#0#0#127#254#0#0#0#0#0#0#127#254#0#0#0#0#0#0#255
+ +#255#0#0#0#0#0#1#255#255#128#0#0#0#0#3#255#255#192#0#0#0#0#7#255#255#224#0#0
+ +#0#0#15#255#255#240#0#0#0#0#31#255#255#248#0#0#0#0'?'#255#255#254#0#0#0#0#127
+ +#255#255#255#0#0#0#1#255#255#255#255#192#0#0#7#255#255#255#255#240#0#0#31#255
+ +#255#255#255#254#0#0#255#255#255#255#255#255#248#31#255#255#255#255#255#255
+ +#255#255#255#255#255'('#0#0#0'0'#0#0#0'`'#0#0#0#1#0' '#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0'UUU'#3'333'#5'UUU'#6'III'#7'@@@'#8'@@@'#8'III'#7
+ +'UUU'#6'333'#5'UUU'#3#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'@@@'
+ +#4'@@@'#8'@@@'#16'DDD1BBBMCCC_FCCrDBB'#129'FDD'#133'CCCvCCCcDDDRDDD('#240'l@!'#252'qE!'
+ +#253'yJ$'#252#129'R&'#252#138'X)'#253#134'T('#253'}N%'#252'uG#'#252'oC"'#253
+ +'h=#'#248'Z>.'#230'OC;'#211'FEC'#198'DDC'#187'BBB|CCC&999'#9#0#0#0#1#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#2'<<<'#17'CCCWEED'#170'OB9'#211'd=&'#244'qE"'#253#137'V)'#253
+ +#164'h.'#255#186'y3'#255#194#130'5'#255#198#135'6'#255#203#140'7'#255#207#145
+ +'8'#255#205#143'7'#255#201#137'7'#255#196#132'6'#255#192#127'5'#255#177'r1'
+ +#255#152'_+'#254'{L%'#252'k?"'#251'[>-'#233'IEA'#203'EDD'#184'DDDq<<<'#30'@@'
+ +'@'#4#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0'@@@'#4'BBB#EDD'#146'KB<'#205'a='''#242'yK&'#252#166'i/'#255#192#128'6'
+ +#255#205#143'9'#255#217#159'<'#255#226#169'>'#255#230#173'>'#255#232#176'>'
+ +#255#235#180'?'#255#237#182'@'#255#236#181'?'#255#234#178'>'#255#231#175'>'
+ +#255#228#171'>'#255#223#165'<'#255#211#150':'#255#199#136'8'#255#182'v5'#255
+ +#146'\,'#253'k@"'#252'W?1'#227'GFE'#199'CCC'#171'???=@@@'#8#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'III'#7'DDD8ECB'#170'[>,'#234'sF$'
+ +#252#160'e0'#255#196#133';'#255#216#158'@'#255#227#170'A'#255#234#180'C'#255
+ +#241#189'D'#255#245#193'E'#255#246#195'F'#255#247#195'F'#255#247#196'E'#255
+ +#248#197'F'#255#248#197'E'#255#247#195'F'#255#247#194'F'#255#246#194'E'#255
+ +#244#192'E'#255#238#184'C'#255#230#176'C'#255#223#166'A'#255#207#147'='#255
+ +#182'w7'#255#138'V+'#253'h>#'#250'NA9'#215'CCC'#186'@@@[;;;'#13#0#0#0#1#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'@@@'#8'EEENGC?'#189'b;%'#245#139'W-'#253#190
+ +#127';'#255#212#153'B'#255#227#172'F'#255#239#186'I'#255#242#191'J'#255#244
+ +#193'K'#255#246#195'K'#255#247#196'K'#255#247#196'K'#255#247#196'L'#255#247
+ +#196'L'#255#247#196'L'#255#247#196'L'#255#247#196'L'#255#247#196'K'#255#247
+ +#196'K'#255#246#196'K'#255#245#195'J'#255#243#193'J'#255#242#190'J'#255#234
+ +#180'H'#255#221#165'E'#255#202#142'@'#255#173'o5'#255'oC$'#252'T?3'#225'CCC'
+ +#193'AAAy@@@'#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'+++'#6'DDD@K@<'#198'g<"'#250#154
+ +'a2'#254#200#141'B'#255#222#168'J'#255#234#183'N'#255#239#189'P'#255#242#192
+ +'P'#255#242#193'P'#255#243#193'P'#255#243#193'P'#255#243#193'P'#255#243#193
+ +'P'#255#243#193'P'#255#243#193'P'#255#243#193'P'#255#243#193'P'#255#243#193
+ ,'P'#255#243#193'P'#255#243#193'P'#255#243#193'P'#255#243#193'P'#255#242#193
+ +'P'#255#242#193'P'#255#241#191'P'#255#238#187'N'#255#229#176'L'#255#214#158
+ +'G'#255#183'y;'#255'yJ)'#252'[=,'#236'CCB'#195'EEEoFFF'#11#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'UUU'#3
+ +'CCC.J?;'#190'g=#'#252#167'k7'#255#205#147'H'#255#226#173'P'#255#235#186'T'
+ +#255#238#189'T'#255#239#190'U'#255#239#190'U'#255#239#190'U'#255#239#190'U'
+ +#255#239#190'U'#255#239#190'U'#255#191#152'D'#255'A4'#23#255'>1'#22#255'D6'
+ +#24#255'H9'#26#255'RA'#29#255#146's4'#255#228#182'Q'#255#239#190'U'#255#239
+ +#190'U'#255#239#190'U'#255#239#190'U'#255#239#190'U'#255#238#190'U'#255#237
+ +#187'T'#255#232#182'S'#255#217#162'M'#255#191#129'B'#255#132'R-'#253'[9('#240
+ +'DDD'#191'CCCW@@@'#8#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#1'>>>'#29'F@='#169'd9#'#250#165'i8'#255#208#151'L'#255
+ +#226#174'U'#255#233#184'Y'#255#235#186'Y'#255#235#187'Y'#255#235#187'Y'#255
+ +#235#187'Y'#255#235#187'Y'#255#235#187'Y'#255#235#187'Y'#255'<0'#23#255#1#1#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#1#1#0#255#0#0#0#255#6
+ +#5#2#255'*!'#16#255'w^-'#255#227#181'W'#255#235#187'Y'#255#235#187'Y'#255#235
+ +#186'Y'#255#234#186'Y'#255#231#181'X'#255#218#164'Q'#255#194#133'E'#255'{J*'
+ +#252'U=/'#230'CCC'#186'EEE?@@@'#4#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0'333'#10'DAAw_9%'#244#150'^4'#254#204#148'N'#255#225#175
+ +'Y'#255#230#181'\'#255#231#183'\'#255#231#183'\'#255#231#183'\'#255#231#183
+ +'\'#255#231#183'\'#255#231#183'\'#255#231#183'\'#255'hR*'#255#1#1#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#1#1#0#255#1#1#0#255'*!'#17#255#164#130'B'#255#231#183'\'
+ +#255#231#183'\'#255#231#182']'#255#228#179'['#255#217#165'V'#255#185'|C'#255
+ +'nA'''#252'N>5'#219'CCC'#163'@@@'#20#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#128#128#128#2'@@@,W8*'#227#132'P/'#253#196#139'M'#255#220
+ +#170'['#255#226#179'_'#255#227#179'_'#255#227#179'_'#255#227#179'_'#255#227
+ +#179'_'#255#227#179'_'#255#227#179'_'#255#227#179'_'#255#227#179'_'#255#4#3#2
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#1#1#0
+ +#255#7#6#3#255#178#141'J'#255#227#179'_'#255#227#179'_'#255#225#176'^'#255
+ +#211#158'U'#255#174'q?'#255'c9"'#252'GA>'#203'BBB]III'#7#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0'FFF'#11'H>:'#150'e:#'#252#186'~H'#255#214#164'\'
+ +#255#222#174'a'#255#223#175'b'#255#223#175'b'#255#223#175'b'#255#223#175'b'
+ +#255#223#175'b'#255#223#175'b'#255#223#175'b'#255#223#175'b'#255#188#148'S'
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#1#1#1#255#154'yC'#255#223#175'b'#255#223#175'a'#255
+ +#220#171'`'#255#204#150'U'#255#145'Y5'#254'Y8('#238'CCC'#175'FFF'#29#0#0#0#1
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'UUU'#3'AAA3Z7'''#236#148'\6'#255#207#154'Z'
+ +#255#218#170'b'#255#219#171'd'#255#219#171'd'#255#219#171'd'#255#219#171'd'
+ +#255#219#171'd'#255#219#171'd'#255#219#171'd'#255#219#171'd'#255#219#171'd'
+ +#255#211#165'`'#255#6#5#3#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#2#2#1#255#219#171'd'#255#219
+ +#171'd'#255#219#171'd'#255#215#166'`'#255#189#129'M'#255'h=$'#252'H>;'#207'E'
+ +'EEhIII'#7#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'III'#7'K<5'#137'h;$'#252#188#130
+ +'O'#255#213#164'b'#255#215#167'd'#255#215#167'd'#255#215#167'd'#255#215#167
+ +'d'#255#215#167'd'#255#215#167'd'#255#215#167'd'#255#215#167'd'#255#215#167
+ +'d'#255#215#167'd'#255#215#167'd'#255#168#130'N'#255#1#1#1#255#0#0#0#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#200#155']'#255#215#167'd'#255#215#167'd'#255#215#166'd'#255#205#153']'
+ +#255#153'`:'#255'[6$'#243'CCC'#164';;;'#13#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'7'
+ +'77'#14'Z5%'#229#150'[8'#255#203#150'^'#255#211#162'e'#255#211#162'e'#255#211
+ +#162'e'#255#211#162'e'#255#211#162'e'#255#211#162'e'#255#211#162'e'#255#211
+ +#162'e'#255#211#162'e'#255#211#162'e'#255#211#162'e'#255#211#162'e'#255#211
+ +#162'e'#255#142'mD'#255#1#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#1#1#0#255#145'pF'#255#211#162'e'#255#211#162
+ +'e'#255#211#162'e'#255#210#159'd'#255#189#131'R'#255'f9#'#252'I@;'#202'===.'
+ +#128#128#128#2#0#0#0#0#0#0#0#0#128#128#128#2'D??4]3'#30#252#181'yM'#255#206
+ +#155'd'#255#207#157'f'#255#207#157'f'#255#207#157'f'#255#207#157'f'#255#205
+ +#155'f'#255'S?('#255#1#1#1#255#1#0#0#255#3#2#1#255#15#11#7#255#169#128'S'#255
+ ,#207#157'f'#255#207#157'f'#255#207#157'f'#255#16#12#8#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#1#0#0#255#186#141'\'
+ +#255#207#157'f'#255#207#157'f'#255#207#157'f'#255#207#157'e'#255#201#148'`'
+ +#255#135'O0'#254'R9-'#226'BBBeIII'#7#0#0#0#0#0#0#0#0'UUU'#6'O8/'#141'o>'''
+ +#251#193#139'['#255#203#151'e'#255#203#152'e'#255#203#152'e'#255#203#152'e'
+ +#255#203#152'e'#255#23#17#11#255#1#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0
+ +#0#255#1#1#1#255#153'rL'#255#203#152'e'#255#203#152'e'#255',!'#22#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#1#0#0#255' '#24#16
+ +#255#203#152'e'#255#203#152'e'#255#203#152'e'#255#203#152'e'#255#203#152'e'
+ +#255#202#150'd'#255#165'jC'#255'\3!'#247'DDD'#151'MMM'#10#0#0#0#0#0#0#0#0'@@'
+ +'@'#8'Z6%'#206#142'T5'#255#195#142'a'#255#198#145'c'#255#198#145'c'#255#198
+ +#145'c'#255#198#145'c'#255'W@,'#255#1#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255'%'#27#19#255#198#145'c'#255#198#145'c'#255'U>+'
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#1#0#0#255#1#1#1#255#27#20#13#255'vW;'
+ +#255#198#145'c'#255#198#145'c'#255#198#145'c'#255#198#145'c'#255#198#145'c'
+ +#255#198#145'c'#255#198#145'c'#255#184'}S'#255'`4 '#252'FA>'#183'@@@'#12#0#0
+ +#0#0#0#0#0#0'999'#9']2'#30#243#166'gD'#255#192#138'`'#255#192#139'a'#255#192
+ +#139'a'#255#192#139'a'#255#190#137'a'#255#1#1#1#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#8#6#4#255#192#139'a'#255#192#139
+ +'a'#255#129']B'#255#1#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#1#0#0#255'Q;)'#255#192#139'a'
+ +#255#192#139'a'#255#192#139'a'#255#192#139'a'#255#192#139'a'#255#192#139'a'
+ +#255#192#139'a'#255#192#139'a'#255#192#139'a'#255#192#139'a'#255#188#132'['
+ +#255'u@'''#252'M;3'#212'999'#18#0#0#0#0#0#0#0#0'FFF'#11'^1'#29#250#174'oK'
+ +#255#186#131'\'#255#186#131'\'#255#186#131'\'#255#186#131'\'#255'vS:'#255#1#1
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#1#0#0#255
+ +'S:)'#255#186#131'\'#255#186#131'\'#255#184#129'\'#255'('#28#20#255#1#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255'Q9('#255#186#131'\'#255#186#131'\'#255#186#131'\'#255#186#131'\'#255#186
+ +#131'\'#255#186#131'\'#255#186#131'\'#255#186#131'\'#255#186#131'\'#255#186
+ +#131'\'#255#186#131'\'#255#186#130'['#255#131'I-'#255'Q9-'#221'FFF!'#0#0#0#1
+ +#0#0#0#0'M33'#20'_2'#30#251#173'pN'#255#180'{X'#255#180'{X'#255#180'{X'#255
+ +#180'{X'#255'-'#30#22#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#2#1#1#255'dE1'#255#180'{X'#255#180'{X'#255#180'{X'#255#180'{X'#255
+ +#180'{X'#255'O6&'#255#2#1#1#255#1#1#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255'G0#'#255#180'{X'#255#180'{X'#255#178'{X'#255'hH3'#255'U:)'#255
+ +'mK5'#255#180'{X'#255#180'{X'#255#180'{X'#255#180'{X'#255#180'{X'#255#180'{X'
+ +#255#180'{X'#255#139'P3'#255'U7)'#231'BBB2UUU'#3#0#0#0#0'T1&,c5 '#249#174'rQ'
+ +#255#178'wW'#255#178'wW'#255#178'wW'#255#178'wW'#255#8#5#4#255#0#0#0#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#1#0#0#255#27#18#13#255#164'nQ'#255#178'wW'#255#178
+ +'wW'#255#178'wW'#255#178'wW'#255#178'wW'#255#178'wW'#255#178'wW'#255#178'wW'
+ +#255#142'_F'#255'H0#'#255#20#13#10#255#25#16#12#255'9'''#28#255'lI5'#255#178
+ +'wW'#255#178'wW'#255'kG4'#255#1#1#1#255#1#1#0#255#1#0#0#255#1#0#0#255#3#2#1
+ +#255'zQ<'#255#178'wW'#255#178'wW'#255#178'wW'#255#178'wW'#255#178'wW'#255#149
+ +'W9'#255'Z5%'#238'DDD-'#128#128#128#2#0#0#0#0'Y3 Bj8#'#248#173'qS'#255#175't'
+ +'W'#255#175'tW'#255#175'tW'#255#175'tW'#255#1#0#0#255#1#1#1#255#0#0#0#255#0#0
+ +#0#255#5#3#3#255'cB2'#255#175'tW'#255#175'tW'#255#175'tW'#255#175'tW'#255#175
+ +'tW'#255#175'tW'#255#175'tW'#255#175'tW'#255#175'tW'#255#175'tW'#255#175'tW'
+ +#255#175'tW'#255#175'tW'#255#175'tW'#255#175'tW'#255#175'tW'#255#175'tW'#255
+ +#173'rU'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#2#1
+ +#1#255#152'eL'#255#175'tW'#255#175'tW'#255#175'tW'#255#175'tW'#255#155'[>'
+ +#255'\4"'#244'@@@'#28#0#0#0#1#0#0#0#0'X0!3g7"'#246#172'oR'#255#174'rV'#255
+ +#174'rV'#255#174'rV'#255#166'lR'#255#7#5#3#255#131'VA'#255#155'fM'#255'oI7'
+ +#255#174'rV'#255#174'rV'#255#174'rV'#255#174'rV'#255#174'rV'#255#174'rV'#255
+ +#174'rV'#255#174'rV'#255#174'rV'#255#174'rV'#255#174'rV'#255#174'rV'#255#174
+ +'rV'#255#174'rV'#255#174'rV'#255#174'rV'#255#174'rV'#255#174'rV'#255#174'rV'
+ +#255#153'dL'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255'<'''#29#255#174'rV'#255#174'rV'#255#174'rV'#255#173'qU'#255#151'Y'
+ +'='#255']6%'#239'333'#15#0#0#0#0#0#0#0#0'O1'''#25'b3'#31#247#168'jN'#255#172
+ +'oU'#255#172'oU'#255#172'oU'#255#172'oU'#255#172'oU'#255#172'oU'#255#172'oU'
+ +#255#172'oU'#255#172'oU'#255#172'oU'#255#172'oU'#255#172'oU'#255#136'XD'#255
+ ,'U7*'#255'^=/'#255'kE5'#255#170'oU'#255#172'oU'#255#172'oU'#255#172'oU'#255
+ +#172'oU'#255#172'oU'#255#172'oU'#255#172'oU'#255#172'oU'#255#172'oU'#255#172
+ +'oU'#255#172'oU'#255#5#3#2#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255'!'#21#16#255#172'oU'#255#172'oU'#255#172'oU'#255#172'oT'#255
+ +#143'R7'#255'Y6('#225'@@@'#12#0#0#0#0#0#0#0#0'333'#5'_2'#31#248#167'hL'#255
+ +#172'qW'#255#172'qX'#255#172'qX'#255#172'qX'#255#172'qX'#255#172'qX'#255#172
+ +'qX'#255#172'qX'#255#172'qX'#255#172'qX'#255#172'qX'#255':&'#30#255#1#0#0#255
+ +#1#1#0#255#1#1#1#255#1#1#0#255#4#2#2#255#133'WD'#255#172'qX'#255#172'qX'#255
+ +#172'qX'#255#172'qX'#255#172'qX'#255#172'qX'#255#172'qX'#255#172'qX'#255#172
+ +'qX'#255#172'qX'#255'E.$'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#30#20#15#255#172'qX'#255#172'qX'#255#172'qX'#255#172'pV'#255
+ +#134'K2'#255'V8)'#199'999'#9#0#0#0#0#0#0#0#0#0#0#0#1'_3'#30#239#164'fJ'#255
+ +#175'w]'#255#175'w^'#255#175'w^'#255#175'w^'#255#175'w^'#255#175'w^'#255#175
+ +'w^'#255#175'w^'#255#175'w^'#255#175'w^'#255'hF7'#255#1#0#0#255#0#0#0#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#7#5#4#255#175'w^'#255#175'w^'#255'{TB'
+ +#255'X;/'#255']?2'#255#127'VD'#255#175'w^'#255#175'w^'#255#175'w^'#255#175'w'
+ +'^'#255#165'qY'#255#1#1#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#1#1#1
+ +#255'fF7'#255#175'w^'#255#175'w^'#255#175'w^'#255#175'v\'#255'{D-'#253'S5('
+ +#154'333'#5#0#0#0#0#0#0#0#0#0#0#0#0'a3'#30#200#149'Z?'#255#179'|c'#255#179'}'
+ +'e'#255#179'}e'#255#179'}e'#255#179'}e'#255#179'}e'#255#179'}e'#255#179'}e'
+ +#255#179'}e'#255#179'}e'#255#19#13#11#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#2#1#1#255#179'}e'#255'E0'''#255#1#0#0#255#1#1#0#255
+ +#1#1#0#255#0#0#0#255'R:/'#255#179'}e'#255#179'}e'#255#179'}e'#255#179'}e'#255
+ +'.!'#26#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#1#1#1#255#177'}e'#255#179
+ +'}e'#255#179'}e'#255#179'}e'#255#175'v\'#255'g8$'#251'W7*O'#0#0#0#1#0#0#0#0#0
+ +#0#0#0#0#0#0#0'[0'#29'lyD-'#249#181#128'i'#255#183#131'l'#255#183#131'l'#255
+ +#183#131'l'#255#183#131'l'#255#183#131'l'#255#183#131'l'#255#183#131'l'#255
+ +#183#131'l'#255#183#131'l'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255'"'#25#20#255#183#131'l'#255#0#0#0#255#0#0#0#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255'B/'''#255#183#131'l'#255#183#131'l'#255
+ +#183#131'l'#255#169'yd'#255#1#1#1#255#0#0#0#255#0#0#0#255#0#0#0#255'#'#25#21
+ +#255#183#131'l'#255#183#131'l'#255#183#131'l'#255#183#131'l'#255#167'lQ'#255
+ +'^3'#31#248'@@@'#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'Y1'#30#26'b5 '#244#178'z'
+ +'c'#255#187#138't'#255#187#138'u'#255#187#138'u'#255#187#138'u'#255#187#138
+ +'u'#255#187#138'u'#255#187#138'u'#255#187#138'u'#255#187#138'u'#255#2#2#1#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#1#1#0#255#170'~j'#255#177
+ +#130'o'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#4#3#3
+ +#255#187#138'u'#255#187#138'u'#255#187#138'u'#255#187#138'u'#255'jNB'#255#11
+ +#8#7#255#0#0#0#255#0#0#0#255#152'p`'#255#187#138'u'#255#187#138'u'#255#187
+ +#138'u'#255#186#136'r'#255#144'W?'#255']6#'#193'333'#5#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0'`4'#31#217#160'gN'#255#190#143'{'#255#191#145'}'#255#191
+ +#145'}'#255#191#145'}'#255#191#145'}'#255#191#145'}'#255#191#145'}'#255#191
+ +#145'}'#255#191#145'}'#255#19#14#12#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255'7*$'#255#191#145'}'#255#164'|k'#255#1#1#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#2#2#1#255#191#145'}'#255#191#145'}'#255
+ +#191#145'}'#255#191#145'}'#255#191#145'}'#255#191#145'}'#255#0#0#0#255#30#23
+ +#20#255#191#145'}'#255#191#145'}'#255#191#145'}'#255#191#145'}'#255#187#138
+ +'t'#255'p>('#249'Y2#U'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27
+ +'huB+'#244#190#142'z'#255#195#152#132#255#195#152#132#255#195#152#132#255#195
+ +#152#132#255#195#152#132#255#195#152#132#255#195#152#132#255#195#152#132#255
+ +'A3,'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#1#0#0#255#183#142'|'#255
+ +#195#152#132#255#138'k]'#255#1#1#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#9#7#6#255#195#152#132#255#195#152#132#255#195#152#132#255#195
+ +#152#132#255#195#152#132#255#195#152#132#255#1#1#1#255#160'}m'#255#195#152
+ +#132#255#195#152#132#255#195#152#132#255#194#150#131#255#167'pW'#255'`4 '#240
+ +'M33'#10#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'@@'#0#4'`3'#30#229
+ +#164'nU'#255#197#156#137#255#199#159#141#255#199#159#141#255#199#159#141#255
+ +#199#159#141#255#199#159#141#255#199#159#141#255#199#159#141#255'x`U'#255#1#1
+ +#1#255#0#0#0#255#0#0#0#255#0#0#0#255#18#14#13#255#199#159#141#255#199#159#141
+ +#255' '#26#23#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#1#1#0#255
+ +#139'oc'#255#199#159#141#255#199#159#141#255#199#159#141#255#199#159#141#255
+ +#199#159#141#255#199#159#141#255'^KC'#255#199#159#141#255#199#159#141#255#199
+ +#159#141#255#199#159#141#255#192#147#127#255'rB-'#249'\1 k'#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'\.'#28'Sn>('#243#194#149#131
+ ,#255#202#165#148#255#203#165#149#255#203#165#149#255#203#165#149#255#203#165
+ +#149#255#203#165#149#255#203#165#149#255#169#138'|'#255#0#0#0#255#1#1#1#255
+ +#16#13#11#255#23#19#17#255#171#139'~'#255#203#165#149#255#203#165#149#255#3#3
+ +#2#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#1#0#0#255'*"'#31#255#203#165
+ +#149#255#203#165#149#255#203#165#149#255#203#165#149#255#203#165#149#255#203
+ +#165#149#255#203#165#149#255#203#165#149#255#203#165#149#255#203#165#149#255
+ +#203#165#149#255#201#162#145#255#163'mU'#255'_3'#31#227'U'#0#0#3#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'a3'#30#213#153
+ +'eM'#254#204#167#151#255#207#172#158#255#207#172#158#255#207#172#158#255#207
+ +#172#158#255#207#172#158#255#207#172#158#255#205#170#156#255#0#0#0#255'<1.'
+ +#255#207#172#158#255#207#172#158#255#207#172#158#255#207#172#158#255#207#172
+ +#158#255#20#16#15#255#1#0#0#255#0#0#0#255#0#0#0#255#1#0#0#255'?40'#255#207
+ +#172#158#255#207#172#158#255#207#172#158#255#207#172#158#255#207#172#158#255
+ +#207#172#158#255#207#172#158#255#207#172#158#255#207#172#158#255#207#172#158
+ +#255#207#172#158#255#207#171#156#255#192#147#127#255'k<'''#244'Z.'#29'L'#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +'^/'#27'&b5!'#240#174'{f'#255#209#176#162#255#212#180#167#255#212#180#167#255
+ +#212#180#167#255#212#180#167#255#212#180#167#255#212#180#167#255#6#5#5#255
+ +#179#151#140#255#212#180#167#255#212#180#167#255#212#180#167#255#212#180#167
+ +#255#212#180#167#255#212#180#167#255'gXR'#255#0#0#0#255#0#0#0#255'gXR'#255
+ +#212#180#167#255#212#180#167#255#212#180#167#255#212#180#167#255#212#180#167
+ +#255#212#180#167#255#212#180#167#255#212#180#167#255#212#180#167#255#212#180
+ +#167#255#212#180#167#255#211#179#166#255#202#162#146#255#127'M7'#248'`2'#31
+ +#169#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0'[/'#26'Fg:#'#242#190#145#127#255#214#184#172#255#216
+ +#187#176#255#216#187#176#255#216#187#176#255#216#187#176#255#216#187#176#255
+ +'k]X'#255#216#187#176#255#216#187#176#255#216#187#176#255#216#187#176#255#216
+ +#187#176#255#216#187#176#255#216#187#176#255'E<8'#255#0#0#0#255'>63'#255#216
+ +#187#176#255#216#187#176#255#216#187#176#255#216#187#176#255#216#187#176#255
+ +#216#187#176#255#216#187#176#255#216#187#176#255#216#187#176#255#216#187#176
+ +#255#216#187#176#255#216#187#175#255#210#176#163#255#147'_H'#252'`4'#31#210
+ +'U++'#6#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'\0'#29'trB-'#242#198#157#140#255#218#191
+ +#180#255#221#195#185#255#221#195#185#255#221#195#185#255#221#195#185#255#221
+ +#195#185#255#221#195#185#255#221#195#185#255#221#195#185#255#221#195#185#255
+ +#221#195#185#255#221#195#185#255#221#195#185#255',''%'#255'920'#255#221#195
+ +#185#255#221#195#185#255#221#195#185#255#221#195#185#255#221#195#185#255#221
+ +#195#185#255#221#195#185#255#221#195#185#255#221#195#185#255#221#195#185#255
+ +#221#195#185#255#220#194#184#255#213#183#170#255#162'oW'#255'b5 '#232'].'#23
+ +#22#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'_1'#30#138'l>)'#242#187#143'|'
+ +#255#221#196#186#255#225#202#193#255#225#203#194#255#225#203#194#255#225#203
+ +#194#255#225#203#194#255#225#203#194#255#225#203#194#255#225#203#194#255#225
+ +#203#194#255#225#203#194#255#225#203#194#255#225#203#194#255#225#203#194#255
+ +#225#203#194#255#225#203#194#255#225#203#194#255#225#203#194#255#225#203#194
+ +#255#225#203#194#255#225#203#194#255#225#203#194#255#225#203#194#255#225#203
+ +#194#255#224#201#192#255#212#180#168#255#149'aK'#252'a5!'#230']2'#25')'#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#28'\d9$'#241#172
+ +'|h'#255#222#197#187#255#228#206#200#255#230#209#203#255#230#209#203#255#230
+ +#209#203#255#230#209#203#255#230#209#203#255#230#209#203#255#230#209#203#255
+ +#230#209#203#255#230#209#203#255#230#209#203#255#230#209#203#255#230#209#203
+ +#255#230#209#203#255#230#209#203#255#230#209#203#255#230#209#203#255#230#209
+ +#203#255#230#209#203#255#230#209#203#255#229#209#202#255#226#204#197#255#208
+ +#173#159#255#131'R;'#245'a3'#31#207'Y3'#26#20#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'].'#28'7a5!'#236#137'WB'#248#201
+ +#163#148#255#229#210#202#255#233#215#210#255#234#217#212#255#234#217#212#255
+ +#234#217#212#255#234#217#212#255#234#217#212#255#234#217#212#255#234#217#212
+ +#255#234#217#212#255#234#217#212#255#234#217#212#255#234#217#212#255#234#217
+ +#212#255#234#217#212#255#234#217#212#255#234#217#212#255#234#216#211#255#231
+ +#212#206#255#221#195#185#255#174#128'm'#255'm>*'#242'`1'#29#163'f33'#5#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0'b'''#20#13'`2'#29#140'd8$'#241#151'hR'#251#211#179#167#255#233#215
+ +#210#255#236#220#215#255#237#222#219#255#238#225#221#255#238#225#221#255#238
+ +#225#221#255#238#225#221#255#238#225#221#255#238#225#221#255#238#225#221#255
+ +#238#225#221#255#238#225#221#255#238#223#220#255#236#221#217#255#234#219#213
+ +#255#227#205#198#255#188#146#128#255'wH2'#242'b5 '#219'].'#27'B'#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'X1'#29#26'a3'#30#168'f:$'#242#134'T?'
+ +#246#179#136'v'#255#214#183#172#255#235#218#214#255#238#225#221#255#239#226
+ +#223#255#240#227#224#255#240#227#225#255#240#227#225#255#239#226#223#255#239
+ +#225#222#255#238#224#220#255#226#204#196#255#199#161#145#255#158'o['#254'rD-'
+ +#239'b4"'#232'^2'#30'\'#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0'`+ '#24']/'#30'fd6#'#197'c8#'#243'vE0'#240#140'ZF'
+ +#247#156'mY'#255#171#127'm'#255#184#143#127#255#178#136'v'#255#164'wd'#255
+ +#148'dP'#252#130'Q;'#243'l<('#239'b6"'#234'b5!'#151'Z-'#29'>UU'#0#3#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0'].'#23#11'Z/'#29'G^4 fa4!'#130'd6!'#166'd7#'#194
+ +'d7"'#182'c6"'#150'_3'#31's\0'#29'YY/'#30'+'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#224#3#255#255#255
+ +#255#255#254#0#0#127#255#255#255#255#248#0#0#31#255#255#255#255#224#0#0#7#255
+ +#255#255#255#192#0#0#3#255#255#255#255#128#0#0#1#255#255#255#255#0#0#0#0#127
+ +#255#255#254#0#0#0#0#127#255#255#252#0#0#0#0'?'#255#255#248#0#0#0#0#31#255
+ +#255#240#0#0#0#0#15#255#255#240#0#0#0#0#15#255#255#224#0#0#0#0#7#255#255#224
+ +#0#0#0#0#3#255#255#192#0#0#0#0#3#255#255#192#0#0#0#0#3#255#255#192#0#0#0#0#1
+ +#255#255#128#0#0#0#0#1#255#255#128#0#0#0#0#1#255#255#128#0#0#0#0#1#255#255
+ +#128#0#0#0#0#1#255#255#128#0#0#0#0#0#255#255#128#0#0#0#0#0#255#255#128#0#0#0
+ +#0#0#255#255#128#0#0#0#0#0#255#255#128#0#0#0#0#1#255#255#128#0#0#0#0#1#255
+ +#255#128#0#0#0#0#1#255#255#128#0#0#0#0#1#255#255#192#0#0#0#0#1#255#255#192#0
+ +#0#0#0#3#255#255#192#0#0#0#0#3#255#255#224#0#0#0#0#7#255#255#224#0#0#0#0#7
+ +#255#255#224#0#0#0#0#15#255#255#240#0#0#0#0#15#255#255#248#0#0#0#0#31#255#255
+ +#248#0#0#0#0'?'#255#255#252#0#0#0#0'?'#255#255#254#0#0#0#0#127#255#255#255#0
+ +#0#0#0#255#255#255#255#128#0#0#1#255#255#255#255#192#0#0#3#255#255#255#255
+ +#224#0#0#15#255#255#255#255#248#0#0#31#255#255#255#255#254#0#0#127#255#255
+ +#255#255#255#192#7#255#255#255#255#255#255#255#255#255#255#255#255'('#0#0#0
+ +' '#0#0#0'@'#0#0#0#1#0' '#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#2'CCC'#19'FFF'#22'UUU'#3#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0'@@@'#12'EAAGDDB'#133'DDC'#181'HC?'#205'LA;'#213
+ +'JB='#212'FC@'#204'EED'#185'DDC'#145'DDDSFFF'#22#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'III'#14'EEBoLA;'#208'eE-'#235'xK('
+ +#246#131'R)'#250#139'W*'#251#149'_,'#252#145'\+'#252#136'V*'#250#128'Q('#249
+ +'rI)'#244'\D2'#227'FB?'#207'CCC'#134'DDD'#30#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0'EEENMA9'#206'oF)'#245#147']-'#252#187'}4'#255#211#150'9'#255#224
+ +#167';'#255#230#174'='#255#234#179'>'#255#233#178'>'#255#228#171'='#255#221
+ +#163'<'#255#205#143'8'#255#175'r2'#255#131'R*'#250'eC,'#238'FB?'#205'CCCoUUU'
+ +#3#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0'@@@'#4'GEA|dB+'#239#142'[.'#252#198#137'<'#255#227#172'C'#255
+ +#236#183'E'#255#242#190'F'#255#246#195'G'#255#248#198'G'#255#249#199'H'#255
+ +#249#198'H'#255#247#196'G'#255#245#193'G'#255#240#188'F'#255#234#180'D'#255
+ +#220#163'A'#255#183'y8'#255'}O*'#250'WA4'#225'CCC'#152'<<<'#17#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1'G@='#148
+ +'lD*'#245#175'u8'#254#221#166'I'#255#234#182'M'#255#242#193'P'#255#243#194'O'
+ +#255#244#195'O'#255#244#195'P'#255#244#195'P'#255#244#195'P'#255#244#195'P'
+ +#255#244#195'P'#255#244#195'P'#255#243#194'O'#255#243#194'O'#255#240#190'O'
+ +#255#230#179'L'#255#212#155'F'#255#148'^1'#252'`A.'#234'CCC'#171'@@@'#12#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'FA>vmB)'#247#189
+ +#130'A'#255#224#172'P'#255#236#187'U'#255#238#189'W'#255#238#190'V'#255#238
+ +#190'V'#255#238#190'V'#255'fQ%'#255#17#14#6#255#17#13#6#255#16#13#6#255',#'
+ +#16#255#155'|8'#255#238#190'V'#255#238#190'V'#255#238#189'V'#255#238#189'W'
+ +#255#233#184'U'#255#217#163'M'#255#164'l8'#254'_>+'#238'DDD'#147#128#128#128
+ +#2#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'FDD=e?*'#243#183'}B'#255
+ +#223#171'W'#255#232#183'['#255#232#183'\'#255#232#183'\'#255#232#183'\'#255
+ +#232#183'\'#255'>1'#25#255#1#1#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#1#1#1#255#5#4#2#255#22#17#9#255'pX,'#255#218#171'V'#255#232#183'\'#255#230
+ +#182'['#255#217#164'T'#255#152'a7'#252'V=1'#228'DDDb'#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#128#128#128#2'Z<-'#215#163'k='#254#217#166'['#255#226#178'`'
+ +#255#226#179'a'#255#226#179'a'#255#226#179'a'#255#226#179'a'#255#226#179'a'
+ +#255#5#4#2#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#3#3#1#255',#'#19#255#226#179'a'#255#225#177'_'
+ +#255#208#154'T'#255#129'O1'#251'H?;'#205'@@@'#20#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0'J@<[vF,'#249#206#153'Y'#255#220#172'b'#255#220#172'c'#255#220#172'c'#255
+ +#220#172'c'#255#220#172'c'#255#220#172'c'#255#205#160']'#255#4#3#2#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#1#0#0#255'.$'#21#255#220#172'c'#255#218#170'a'#255#190#132
+ +'N'#255'c=)'#242'CCCz'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'\9('#218#177'vG'#255
+ +#213#164'c'#255#214#166'e'#255#214#166'e'#255#214#166'e'#255#214#166'e'#255
+ +#214#166'e'#255#214#166'e'#255#214#166'e'#255'v\8'#255#2#2#1#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#11#9#5#255#214#166'e'#255#214#166'e'#255#209#159'a'#255#139'Y'
+ +'6'#252'K>7'#206'333'#5#0#0#0#0#0#0#0#0'?;9'#19'mA+'#247#201#148'^'#255#209
+ +#159'e'#255#209#159'e'#255#209#159'e'#255#146'oF'#255#18#14#9#255#21#16#10
+ +#255'O<&'#255#209#159'e'#255#209#159'e'#255'$'#27#17#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#11#8#5#255#209#159'e'#255#209#159'e'#255#208#158'e'#255#185#128'Q'#255
+ +'^9)'#240'BBB6'#0#0#0#0#0#0#0#0'P8-q'#144'Z:'#252#201#150'd'#255#202#151'd'
+ +#255#202#151'd'#255'uW:'#255#2#1#1#255#0#0#0#255#0#0#0#255#1#0#0#255'-!'#22
+ +#255#202#151'd'#255'ZC-'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#1#1#0#255#5#4#3#255'gM3'#255#202#151'd'
+ +#255#202#151'd'#255#202#151'd'#255#197#145'`'#255'l@*'#248'CCBo'#0#0#0#0#0#0
+ +#0#0'^7$'#194#171'pK'#255#194#140'a'#255#194#140'a'#255#194#140'a'#255#6#4#3
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#7#5#4#255#194#140'a'#255#139'eE'
+ +#255#1#1#1#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#13
+ +#9#6#255'wV<'#255#192#138'a'#255#194#140'a'#255#194#140'a'#255#194#140'a'#255
+ +#194#140'a'#255#193#140'a'#255#137'T7'#252'K=6'#158#0#0#0#0#0#0#0#0'a6#'#220
+ +#177'uQ'#255#185#129'['#255#185#129'['#255#127'Y>'#255#1#1#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#2#1#1#255'8'''#27#255#185#129'['#255#185#129'['#255'+'#30
+ +#21#255#2#1#1#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#13#9#6#255#179'}Y'
+ +#255#185#129'['#255#185#129'['#255#185#129'['#255#185#129'['#255#185#129'['
+ +#255#185#129'['#255#185#129'['#255#152'^>'#255'P:1'#190#0#0#0#0#0#0#0#0'c7#'
+ +#227#175'sS'#255#178'xW'#255#178'xW'#255','#30#21#255#0#0#0#255#0#0#0#255#0#0
+ +#0#255#5#4#3#255'uO:'#255#178'xW'#255#178'xW'#255#178'xW'#255#178'xW'#255'xP'
+ +':'#255'('#26#19#255#10#7#5#255#10#7#5#255#28#19#13#255#168'rS'#255#163'nO'
+ +#255#25#17#12#255#6#4#3#255#17#11#8#255'bB/'#255#178'xW'#255#178'xW'#255#178
+ +'xW'#255#158'aB'#255'V9,'#210#0#0#0#0#0#0#0#0'f7"'#227#173'sT'#255#175'tW'
+ +#255#175'tW'#255#15#10#7#255#13#8#6#255#5#4#3#255'+'#29#21#255#169'pU'#255
+ +#175'tW'#255#175'tW'#255#175'tW'#255#175'tW'#255#175'tW'#255#175'tW'#255#175
+ +'tW'#255#175'tW'#255#175'tW'#255#175'tW'#255#175'tW'#255#17#11#8#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#2#2#1#255#136'ZD'#255#175'tW'#255#175'tW'#255#161'd'
+ +'G'#255'[8('#211#0#0#0#0#0#0#0#0'e6"'#218#171'nR'#255#173'qV'#255#173'qV'#255
+ +#136'YC'#255#173'qV'#255#173'qV'#255#173'qV'#255#173'qV'#255#173'qV'#255'sK9'
+ +#255'uM:'#255#159'gN'#255#173'qV'#255#173'qV'#255#173'qV'#255#173'qV'#255#173
+ +'qV'#255#173'qV'#255#173'qV'#255'5"'#27#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0
+ +#0#255'H/$'#255#173'qV'#255#173'qV'#255#153'^D'#255'Y8*'#188#0#0#0#0#0#0#0#0
+ +'c5 '#203#170'kQ'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'
+ ,#255#174'sY'#255#164'mU'#255#11#7#6#255#1#1#1#255#1#1#1#255#5#3#2#255#127'TA'
+ +#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255#174'sY'#255
+ +#128'UA'#255#2#1#1#255#0#0#0#255#0#0#0#255#0#0#0#255'J1&'#255#174'sY'#255#174
+ +'sY'#255#147'X?'#255'S8,'#140#0#0#0#0#0#0#0#0'd4'#30#153#162'gM'#255#178'{c'
+ +#255#178'{c'#255#178'{c'#255#178'{c'#255#178'{c'#255#178'{c'#255'A-$'#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#20#14#11#255'xSB'#255#6#4#3#255#5#4#3
+ +#255#18#12#10#255#170'u_'#255#178'{c'#255#178'{c'#255#9#6#5#255#0#0#0#255#0#0
+ +#0#255#3#2#2#255#166's]'#255#178'{c'#255#178'{c'#255#131'P8'#252'S3$>'#0#0#0
+ +#0#0#0#0#0'[/'#27'3'#137'T='#247#184#134'o'#255#184#134'o'#255#184#134'o'#255
+ +#184#134'o'#255#184#134'o'#255#184#134'o'#255#14#10#9#255#0#0#0#255#0#0#0#255
+ +#0#0#0#255#1#1#1#255'\C7'#255#14#10#8#255#0#0#0#255#0#0#0#255#0#0#0#255#14#10
+ +#8#255#184#134'o'#255#184#134'o'#255'xWI'#255#2#1#1#255#0#0#0#255#18#14#11
+ +#255#184#134'o'#255#184#134'o'#255#183#131'l'#255'h:&'#240#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0'n<%'#218#189#140'x'#255#190#143'z'#255#190#143'z'#255#190#143
+ +'z'#255#190#143'z'#255#190#143'z'#255',!'#28#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#9#7#6#255#190#143'z'#255#9#7#6#255#0#0#0#255#0#0#0#255#0#0#0#255#5#4#3
+ +#255#190#143'z'#255#190#143'z'#255#190#143'z'#255#159'xe'#255#0#0#0#255#140
+ +'jZ'#255#190#143'z'#255#190#143'z'#255#175'yc'#255'b6"'#193#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0'd4'#30#151#167's\'#254#196#154#135#255#196#154#135#255#196#154
+ +#135#255#196#154#135#255#196#154#135#255'qYN'#255#0#0#0#255#0#0#0#255#1#1#1
+ +#255'v]R'#255#194#152#133#255#5#4#4#255#0#0#0#255#0#0#0#255#0#0#0#255#10#8#7
+ +#255#196#154#135#255#196#154#135#255#196#154#135#255#196#154#135#255'"'#27#24
+ +#255#196#154#135#255#196#154#135#255#196#154#135#255#131'R<'#248'^1'#28'1'#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27#14'o>('#224#198#157#140#255#202#163#146
+ +#255#202#163#146#255#202#163#146#255#202#163#146#255#170#138'{'#255#0#0#0#255
+ +#8#6#6#255#26#21#19#255#202#163#146#255#143'th'#255#1#1#1#255#0#0#0#255#0#0#0
+ +#255#2#2#2#255#143'sg'#255#202#163#146#255#202#163#146#255#202#163#146#255
+ +#202#163#146#255#191#155#138#255#202#163#146#255#202#163#146#255#183#135'r'
+ +#255'd5 '#193#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'd3'#30'{'#156
+ +'jS'#248#209#174#160#255#209#174#160#255#209#174#160#255#209#174#160#255#209
+ +#174#160#255#2#2#2#255#205#172#158#255#209#174#160#255#209#174#160#255#169
+ +#140#129#255#11#9#9#255#1#1#0#255#4#3#3#255#132'oe'#255#209#174#160#255#209
+ +#174#160#255#209#174#160#255#209#174#160#255#209#174#160#255#209#174#160#255
+ +#209#174#160#255#205#167#152#255'yG3'#235'[/'#27'"'#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'd4'#30#181#179#134'r'#254#215#185#173#255#215
+ +#185#173#255#215#185#173#255#215#185#173#255'm^X'#255#215#185#173#255#215#185
+ +#173#255#215#185#173#255#215#185#173#255#133'sk'#255#0#0#0#255#156#134'}'#255
+ +#215#185#173#255#215#185#173#255#215#185#173#255#215#185#173#255#215#185#173
+ +#255#215#185#173#255#215#185#173#255#214#183#172#255#143'^I'#243'b3'#29'`'#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27#8'f6 '
+ +#205#189#148#131#254#222#197#187#255#222#197#187#255#222#197#187#255#222#197
+ +#187#255#222#197#187#255#222#197#187#255#222#197#187#255#222#197#187#255#127
+ +'qk'#255#134'wq'#255#222#197#187#255#222#197#187#255#222#197#187#255#222#197
+ +#187#255#222#197#187#255#222#197#187#255#222#197#187#255#220#193#183#255#159
+ +'o['#247'd3'#30#147#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0'[/'#27#15'c3'#30#193#176#132'q'#248#228#206#199#255
+ +#228#208#201#255#228#208#201#255#228#208#201#255#228#208#201#255#228#208#201
+ +#255#228#208#201#255#228#208#201#255#228#208#201#255#228#208#201#255#228#208
+ +#201#255#228#208#201#255#228#208#201#255#228#208#201#255#228#208#201#255#221
+ +#196#186#255#141']I'#237'c3'#29#129#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27#2'c3'#29#150
+ +#135'XD'#231#208#176#164#255#235#219#215#255#235#219#215#255#235#219#215#255
+ +#235#219#215#255#235#219#215#255#235#219#215#255#235#219#215#255#235#219#215
+ +#255#235#219#215#255#235#219#215#255#235#219#215#255#232#214#209#255#189#149
+ +#133#253'qA+'#220'a2'#29'O'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27
+ +'"e4'#30#185#144'cO'#235#195#158#144#254#230#209#203#255#242#231#229#255#242
+ +#231#229#255#242#231#229#255#242#231#229#255#242#231#229#255#241#230#226#255
+ +#220#193#184#255#180#141'|'#251'zK6'#226'd3'#30#142'[/'#27#10#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27#28'b3'#29'{g5'#30
+ +#198'xH2'#218#137']J'#229#156'r`'#236#151'mZ'#234#132'VB'#227'q?)'#213'f4'#30
+ +#182'_1'#28'W[/'#27#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27#5'[/'
+ +#27#30'[/'#27#22'[/'#27#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#252'?'#255
+ +#255#192#3#255#255#0#0#255#254#0#0'?'#248#0#0#31#240#0#0#15#240#0#0#7#224#0#0
+ +#7#192#0#0#3#192#0#0#3#192#0#0#1#128#0#0#1#128#0#0#1#128#0#0#1#128#0#0#1#128
+ +#0#0#1#128#0#0#1#128#0#0#1#128#0#0#1#128#0#0#1#128#0#0#3#192#0#0#3#192#0#0#3
+ +#192#0#0#7#224#0#0#7#240#0#0#15#240#0#0#31#248#0#0'?'#252#0#0#127#255#0#0#255
+ +#255#192#3#255#255#252'?'#255'('#0#0#0#16#0#0#0' '#0#0#0#1#0' '#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +';;;'#13'ICB7M=4zL>6xFBA;@@@'#16#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0'III'#7'W;,'#171'nC('#245#145'`+'#250#181#127'2'#253#175
+ +'z1'#253#139'\*'#250'h?&'#244'P=3'#159'@@@'#12#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0'K921d;'''#235#191#137'7'#254#249#198'E'#255#251#199'F'#255#251#200
+ +'F'#255#251#200'F'#255#251#199'F'#255#246#194'E'#255#173'y3'#253'\9)'#229'E>'
+ +';2'#0#0#0#0#0#0#0#0#0#0#0#0'>2,'#7'nC'''#238#223#171'N'#255#239#191'U'#255
+ +#240#192'U'#255#164#131':'#255'@3'#23#255'J;'#26#255'~e-'#255#196#157'E'#255
+ +#239#191'U'#255#212#159'J'#255'a<('#231'MMM'#10#0#0#0#0#0#0#0#0'[7('#183#195
+ +#145'N'#254#228#180'_'#255#228#180'_'#255#228#180'_'#255''#25#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#4#3#1#255'9-'#24#255#205#163'U'#255#175'~E'#253'Q:0'#168
+ +#0#0#0#0'[/'#27#10#143'd@'#248#219#174'l'#255#219#173'l'#255#159'~N'#255#206
+ +#163'f'#255'qY7'#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#1#1#0#255#152'x'
+ +'K'#255#218#172'k'#255'zQ5'#246'UUU'#3'W4$H'#178#134'_'#254#213#169'x'#255'Y'
+ +'F2'#255#0#0#0#255'L<+'#255#200#158'p'#255#8#6#4#255#0#0#0#255#0#0#0#255#18
+ +#15#10#255'pY?'#255#213#169'x'#255#213#169'x'#255#157'tR'#251'M=74^6$'#154
+ +#193#151'x'#255#179#144's'#255#6#5#4#255#27#21#17#255#155'|c'#255#206#165#132
+ +#255#130'hS'#255'=1'''#255':/%'#255#170#137'm'#255#141'q['#255#166#133'j'#255
+ +#206#165#132#255#178#135'l'#253'Q8,{c5 '#167#195#154#133#255#163#130'q'#255
+ +#153'zj'#255#192#152#132#255#199#159#138#255#200#159#138#255#201#160#139#255
+ +#201#160#139#255#201#160#139#255#154'zj'#255#1#1#1#255#29#23#20#255#197#157
+ +#136#255#181#139'v'#255'X5%|_1'#28'V'#176#132'r'#254#199#159#141#255#199#159
+ +#141#255#184#147#130#255'#'#28#25#255#27#22#19#255#167#133'v'#255#127'fZ'#255
+ +#172#137'z'#255#197#157#139#255' '#26#23#255#15#12#11#255#187#150#133#255#156
+ +'tb'#251'W1 0[/'#27#30#160'zk'#246#210#176#163#255#210#176#163#255#154#129'x'
+ +#255#0#0#0#255' '#27#25#255#152#128'v'#255#4#3#3#255'>40'#255#210#176#163#255
+ +#148'|s'#255'RD?'#255#210#176#163#255#140'fW'#243'[/'#27#2#0#0#0#0'tI6'#209
+ +#216#188#178#255#221#195#185#255#213#188#178#255'$'#31#30#255#131'sn'#255'sf'
+ +'`'#255#0#0#0#255'eYU'#255#221#195#185#255#221#195#185#255#204#180#170#255
+ +#207#178#166#255'k>+'#182#0#0#0#0#0#0#0#0'[/'#27#31#156'xi'#240#232#213#207
+ +#255#232#213#207#255#180#165#161#255#232#213#207#255#182#167#162#255'ICA'#255
+ +#226#207#201#255#232#213#207#255#232#213#207#255#231#213#206#255#134'_O'#233
+ +'[/'#27#12#0#0#0#0#0#0#0#0#0#0#0#0'd3'#30'e'#171#139'~'#240#239#226#224#255
+ +#242#231#229#255#242#231#229#255#240#229#227#255#242#231#229#255#242#231#229
+ +#255#242#231#229#255#235#221#216#255#153'uh'#236'a2'#29'?'#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0'\0'#27'*'#131'\I'#215#212#191#183#252#239#229#226#255
+ +#253#250#252#255#253#249#250#255#236#223#220#255#204#180#172#250'yM;'#196'[/'
+ +#27#23#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'[/'#27#3'[/'
+ +#27'>c3'#29#131'uI4'#190'oA-'#183'b2'#29'v[/'#27'4'#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#248#31#172'A'#224#7#172'A'#192#3#172'A'#128#1#172'A'#128#1#172
+ +'A'#0#0#172'A'#0#0#172'A'#0#0#172'A'#0#0#172'A'#0#0#172'A'#0#0#172'A'#128#1
+ +#172'A'#128#1#172'A'#192#3#172'A'#224#7#172'A'#240#31#172'A'
+]);
+
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/RxLookup/project1.manifest b/components/rx/version/v2.2_laz_1.2/Demos/RxLookup/project1.manifest
new file mode 100644
index 000000000..515fedeef
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/RxLookup/project1.manifest
@@ -0,0 +1,17 @@
+
+
+
+ Your application description here.
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/RxLookup/project1.rc b/components/rx/version/v2.2_laz_1.2/Demos/RxLookup/project1.rc
new file mode 100644
index 000000000..cd8e7b0d6
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/RxLookup/project1.rc
@@ -0,0 +1,7 @@
+#define RT_MANIFEST 24
+#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1
+#define ISOLATIONAWARE_MANIFEST_RESOURCE_ID 2
+#define ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID 3
+
+CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "project1.manifest"
+MAINICON ICON "project1.ico"
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/RxLookup/unit1.lfm b/components/rx/version/v2.2_laz_1.2/Demos/RxLookup/unit1.lfm
new file mode 100644
index 000000000..bc09adede
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/RxLookup/unit1.lfm
@@ -0,0 +1,213 @@
+object Form1: TForm1
+ Left = 534
+ Height = 368
+ Top = 234
+ Width = 498
+ ActiveControl = RxDBLookupCombo1
+ Caption = 'RxDBLookupCombo test'
+ ClientHeight = 368
+ ClientWidth = 498
+ OnCreate = FormCreate
+ LCLVersion = '0.9.29'
+ object Label1: TLabel
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = Owner
+ Left = 6
+ Height = 18
+ Top = 6
+ Width = 90
+ BorderSpacing.Around = 6
+ Caption = 'Select item...'
+ ParentColor = False
+ end
+ object Label2: TLabel
+ AnchorSideLeft.Control = Button1
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = Button1
+ AnchorSideTop.Side = asrCenter
+ Left = 108
+ Height = 18
+ Top = 70
+ Width = 46
+ BorderSpacing.Around = 6
+ Caption = 'Label2'
+ ParentColor = False
+ end
+ object RxDBLookupCombo1: TRxDBLookupCombo
+ AnchorSideLeft.Control = Label1
+ AnchorSideTop.Control = Label1
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ Left = 12
+ Height = 29
+ Top = 30
+ Width = 480
+ AutoSize = True
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Around = 6
+ ButtonOnlyWhenFocused = False
+ ButtonWidth = 15
+ DataField = 'ID'
+ DataSource = dsData1
+ PopUpFormOptions.Columns = <>
+ Flat = False
+ Glyph.Data = {
+ 72000000424D7200000000000000360000002800000005000000030000000100
+ 2000000000003C00000064000000640000000000000000000000000000000000
+ 0000000000FF000000000000000000000000000000FF000000FF000000FF0000
+ 0000000000FF000000FF000000FF000000FF000000FF
+ }
+ NumGlyphs = 1
+ ParentColor = False
+ ReadOnly = False
+ TabOrder = 0
+ TabStop = True
+ DisplayAllFields = True
+ LookupDisplay = 'ID;Price;Caption'
+ LookupDisplayIndex = 2
+ LookupField = 'ID'
+ LookupSource = dsLookUpData
+ end
+ object Button1: TButton
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = RxDBLookupCombo1
+ AnchorSideTop.Side = asrBottom
+ Left = 6
+ Height = 29
+ Top = 65
+ Width = 96
+ AutoSize = True
+ BorderSpacing.Around = 6
+ Caption = 'Test caption'
+ OnClick = Button1Click
+ TabOrder = 1
+ end
+ object Button2: TButton
+ AnchorSideTop.Control = Button1
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ Left = 427
+ Height = 29
+ Top = 100
+ Width = 65
+ Anchors = [akTop, akRight]
+ AutoSize = True
+ BorderSpacing.Around = 6
+ Caption = 'Set text'
+ OnClick = Button2Click
+ TabOrder = 2
+ end
+ object Edit1: TEdit
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = Button1
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Button2
+ Left = 6
+ Height = 27
+ Top = 100
+ Width = 415
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Around = 6
+ TabOrder = 3
+ Text = 'Edit1'
+ end
+ object DBGrid1: TDBGrid
+ Left = 0
+ Height = 208
+ Top = 160
+ Width = 498
+ Align = alBottom
+ DataSource = dsLookUpData
+ TabOrder = 4
+ end
+ object rxData1: TRxMemoryData
+ FieldDefs = <
+ item
+ Name = 'ID'
+ DataType = ftInteger
+ Precision = 0
+ Size = 0
+ end>
+ left = 320
+ top = 8
+ object rxData1ID: TLongintField
+ DisplayWidth = 10
+ FieldKind = fkData
+ FieldName = 'ID'
+ Index = 0
+ LookupCache = False
+ ProviderFlags = [pfInUpdate, pfInWhere]
+ ReadOnly = False
+ Required = False
+ end
+ end
+ object rxLookUpData: TRxMemoryData
+ FieldDefs = <
+ item
+ Name = 'ID'
+ DataType = ftInteger
+ Precision = 0
+ Size = 0
+ end
+ item
+ Name = 'Caption'
+ DataType = ftString
+ Precision = 0
+ Size = 100
+ end
+ item
+ Name = 'Price'
+ DataType = ftCurrency
+ Precision = 0
+ Size = 0
+ end>
+ left = 208
+ top = 56
+ object rxLookUpDataID: TLongintField
+ DisplayWidth = 10
+ FieldKind = fkData
+ FieldName = 'ID'
+ Index = 0
+ LookupCache = False
+ ProviderFlags = [pfInUpdate, pfInWhere]
+ ReadOnly = False
+ Required = False
+ end
+ object rxLookUpDataCaption: TStringField
+ DisplayWidth = 100
+ FieldKind = fkData
+ FieldName = 'Caption'
+ Index = 1
+ LookupCache = False
+ ProviderFlags = [pfInUpdate, pfInWhere]
+ ReadOnly = False
+ Required = False
+ Size = 100
+ end
+ object rxLookUpDataPrice: TCurrencyField
+ DisplayWidth = 10
+ FieldKind = fkData
+ FieldName = 'Price'
+ Index = 2
+ LookupCache = False
+ ProviderFlags = [pfInUpdate, pfInWhere]
+ ReadOnly = False
+ Required = False
+ MaxValue = 0
+ MinValue = 0
+ Precision = 2
+ end
+ end
+ object dsData1: TDatasource
+ DataSet = rxData1
+ left = 288
+ top = 8
+ end
+ object dsLookUpData: TDatasource
+ DataSet = rxLookUpData
+ left = 176
+ top = 56
+ end
+end
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/RxLookup/unit1.lrs b/components/rx/version/v2.2_laz_1.2/Demos/RxLookup/unit1.lrs
new file mode 100644
index 000000000..5ff800d4f
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/RxLookup/unit1.lrs
@@ -0,0 +1,64 @@
+LazarusResources.Add('TForm1','FORMDATA',[
+ 'TPF0'#6'TForm1'#5'Form1'#4'Left'#3#22#2#6'Height'#3'p'#1#3'Top'#3#234#0#5'Wi'
+ +'dth'#3#242#1#13'ActiveControl'#7#16'RxDBLookupCombo1'#7'Caption'#6#20'RxDBL'
+ +'ookupCombo test'#12'ClientHeight'#3'p'#1#11'ClientWidth'#3#242#1#8'OnCreate'
+ +#7#10'FormCreate'#10'LCLVersion'#6#6'0.9.29'#0#6'TLabel'#6'Label1'#22'Anchor'
+ +'SideLeft.Control'#7#5'Owner'#21'AnchorSideTop.Control'#7#5'Owner'#4'Left'#2
+ +#6#6'Height'#2#18#3'Top'#2#6#5'Width'#2'Z'#20'BorderSpacing.Around'#2#6#7'Ca'
+ +'ption'#6#14'Select item...'#11'ParentColor'#8#0#0#6'TLabel'#6'Label2'#22'An'
+ +'chorSideLeft.Control'#7#7'Button1'#19'AnchorSideLeft.Side'#7#9'asrBottom'#21
+ +'AnchorSideTop.Control'#7#7'Button1'#18'AnchorSideTop.Side'#7#9'asrCenter'#4
+ +'Left'#2'l'#6'Height'#2#18#3'Top'#2'F'#5'Width'#2'.'#20'BorderSpacing.Around'
+ +#2#6#7'Caption'#6#6'Label2'#11'ParentColor'#8#0#0#16'TRxDBLookupCombo'#16'Rx'
+ +'DBLookupCombo1'#22'AnchorSideLeft.Control'#7#6'Label1'#21'AnchorSideTop.Con'
+ +'trol'#7#6'Label1'#18'AnchorSideTop.Side'#7#9'asrBottom'#23'AnchorSideRight.'
+ +'Control'#7#5'Owner'#20'AnchorSideRight.Side'#7#9'asrBottom'#4'Left'#2#12#6
+ +'Height'#2#29#3'Top'#2#30#5'Width'#3#224#1#8'AutoSize'#9#7'Anchors'#11#5'akT'
+ +'op'#6'akLeft'#7'akRight'#0#20'BorderSpacing.Around'#2#6#21'ButtonOnlyWhenFo'
+ +'cused'#8#11'ButtonWidth'#2#15#9'DataField'#6#2'ID'#10'DataSource'#7#7'dsDat'
+ +'a1'#24'PopUpFormOptions.Columns'#14#0#4'Flat'#8#10'Glyph.Data'#10'v'#0#0#0
+ +'r'#0#0#0'BMr'#0#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#5#0#0#0#3#0#0#0#1#0' '#0#0#0#0
+ +#0'<'#0#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#0#0#0#0#255#0#0#0#255
+ +#0#0#0#255#0#0#0#255#0#0#0#255#9'NumGlyphs'#2#1#11'ParentColor'#8#8'ReadOnly'
+ +#8#8'TabOrder'#2#0#7'TabStop'#9#16'DisplayAllFields'#9#13'LookupDisplay'#6#16
+ +'ID;Price;Caption'#18'LookupDisplayIndex'#2#2#11'LookupField'#6#2'ID'#12'Loo'
+ +'kupSource'#7#12'dsLookUpData'#0#0#7'TButton'#7'Button1'#22'AnchorSideLeft.C'
+ +'ontrol'#7#5'Owner'#21'AnchorSideTop.Control'#7#16'RxDBLookupCombo1'#18'Anch'
+ +'orSideTop.Side'#7#9'asrBottom'#4'Left'#2#6#6'Height'#2#29#3'Top'#2'A'#5'Wid'
+ +'th'#2'`'#8'AutoSize'#9#20'BorderSpacing.Around'#2#6#7'Caption'#6#12'Test ca'
+ +'ption'#7'OnClick'#7#12'Button1Click'#8'TabOrder'#2#1#0#0#7'TButton'#7'Butto'
+ +'n2'#21'AnchorSideTop.Control'#7#7'Button1'#18'AnchorSideTop.Side'#7#9'asrBo'
+ +'ttom'#23'AnchorSideRight.Control'#7#5'Owner'#20'AnchorSideRight.Side'#7#9'a'
+ +'srBottom'#4'Left'#3#171#1#6'Height'#2#29#3'Top'#2'd'#5'Width'#2'A'#7'Anchor'
+ +'s'#11#5'akTop'#7'akRight'#0#8'AutoSize'#9#20'BorderSpacing.Around'#2#6#7'Ca'
+ +'ption'#6#8'Set text'#7'OnClick'#7#12'Button2Click'#8'TabOrder'#2#2#0#0#5'TE'
+ +'dit'#5'Edit1'#22'AnchorSideLeft.Control'#7#5'Owner'#21'AnchorSideTop.Contro'
+ +'l'#7#7'Button1'#18'AnchorSideTop.Side'#7#9'asrBottom'#23'AnchorSideRight.Co'
+ +'ntrol'#7#7'Button2'#4'Left'#2#6#6'Height'#2#27#3'Top'#2'd'#5'Width'#3#159#1
+ +#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#20'BorderSpacing.Around'#2#6#8
+ +'TabOrder'#2#3#4'Text'#6#5'Edit1'#0#0#7'TDBGrid'#7'DBGrid1'#4'Left'#2#0#6'He'
+ +'ight'#3#208#0#3'Top'#3#160#0#5'Width'#3#242#1#5'Align'#7#8'alBottom'#10'Dat'
+ +'aSource'#7#12'dsLookUpData'#8'TabOrder'#2#4#0#0#13'TRxMemoryData'#7'rxData1'
+ +#9'FieldDefs'#14#1#4'Name'#6#2'ID'#8'DataType'#7#9'ftInteger'#9'Precision'#2
+ +#0#4'Size'#2#0#0#0#4'left'#3'@'#1#3'top'#2#8#0#13'TLongintField'#9'rxData1ID'
+ +#12'DisplayWidth'#2#10#9'FieldKind'#7#6'fkData'#9'FieldName'#6#2'ID'#5'Index'
+ +#2#0#11'LookupCache'#8#13'ProviderFlags'#11#10'pfInUpdate'#9'pfInWhere'#0#8
+ +'ReadOnly'#8#8'Required'#8#0#0#0#13'TRxMemoryData'#12'rxLookUpData'#9'FieldD'
+ +'efs'#14#1#4'Name'#6#2'ID'#8'DataType'#7#9'ftInteger'#9'Precision'#2#0#4'Siz'
+ +'e'#2#0#0#1#4'Name'#6#7'Caption'#8'DataType'#7#8'ftString'#9'Precision'#2#0#4
+ +'Size'#2'd'#0#1#4'Name'#6#5'Price'#8'DataType'#7#10'ftCurrency'#9'Precision'
+ +#2#0#4'Size'#2#0#0#0#4'left'#3#208#0#3'top'#2'8'#0#13'TLongintField'#14'rxLo'
+ +'okUpDataID'#12'DisplayWidth'#2#10#9'FieldKind'#7#6'fkData'#9'FieldName'#6#2
+ +'ID'#5'Index'#2#0#11'LookupCache'#8#13'ProviderFlags'#11#10'pfInUpdate'#9'pf'
+ +'InWhere'#0#8'ReadOnly'#8#8'Required'#8#0#0#12'TStringField'#19'rxLookUpData'
+ +'Caption'#12'DisplayWidth'#2'd'#9'FieldKind'#7#6'fkData'#9'FieldName'#6#7'Ca'
+ +'ption'#5'Index'#2#1#11'LookupCache'#8#13'ProviderFlags'#11#10'pfInUpdate'#9
+ +'pfInWhere'#0#8'ReadOnly'#8#8'Required'#8#4'Size'#2'd'#0#0#14'TCurrencyField'
+ +#17'rxLookUpDataPrice'#12'DisplayWidth'#2#10#9'FieldKind'#7#6'fkData'#9'Fiel'
+ +'dName'#6#5'Price'#5'Index'#2#2#11'LookupCache'#8#13'ProviderFlags'#11#10'pf'
+ +'InUpdate'#9'pfInWhere'#0#8'ReadOnly'#8#8'Required'#8#8'MaxValue'#2#0#8'MinV'
+ +'alue'#2#0#9'Precision'#2#2#0#0#0#11'TDatasource'#7'dsData1'#7'DataSet'#7#7
+ +'rxData1'#4'left'#3' '#1#3'top'#2#8#0#0#11'TDatasource'#12'dsLookUpData'#7'D'
+ +'ataSet'#7#12'rxLookUpData'#4'left'#3#176#0#3'top'#2'8'#0#0#0
+]);
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/RxLookup/unit1.pas b/components/rx/version/v2.2_laz_1.2/Demos/RxLookup/unit1.pas
new file mode 100644
index 000000000..0a33184af
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/RxLookup/unit1.pas
@@ -0,0 +1,76 @@
+unit Unit1;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, db, FileUtil, LResources, Forms, Controls, Graphics,
+ Dialogs, StdCtrls, DBGrids, rxlookup, rxmemds;
+
+type
+
+ { TForm1 }
+
+ TForm1 = class(TForm)
+ Button1: TButton;
+ Button2: TButton;
+ DBGrid1: TDBGrid;
+ dsData1: TDatasource;
+ dsLookUpData: TDatasource;
+ Edit1: TEdit;
+ Label1: TLabel;
+ Label2: TLabel;
+ rxData1ID: TLongintField;
+ RxDBLookupCombo1: TRxDBLookupCombo;
+ rxData1: TRxMemoryData;
+ rxLookUpData: TRxMemoryData;
+ rxLookUpDataCaption: TStringField;
+ rxLookUpDataID: TLongintField;
+ rxLookUpDataPrice: TCurrencyField;
+ procedure Button1Click(Sender: TObject);
+ procedure Button2Click(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ private
+ { private declarations }
+ public
+ { public declarations }
+ end;
+
+var
+ Form1: TForm1;
+
+implementation
+
+{ TForm1 }
+
+procedure TForm1.Button1Click(Sender: TObject);
+begin
+ Label2.Caption:=RxDBLookupCombo1.Text;
+end;
+
+procedure TForm1.Button2Click(Sender: TObject);
+begin
+ RxDBLookupCombo1.Text:=Edit1.Text;
+end;
+
+procedure TForm1.FormCreate(Sender: TObject);
+begin
+ rxData1.Open;
+ rxData1.Append;
+ rxLookUpData.Open;
+ rxLookUpData.AppendRecord([1, 'Lazarus', 0]);
+ rxLookUpData.AppendRecord([2, 'Delphi', 1000]);
+ rxLookUpData.AppendRecord([3, 'MS Office', 400]);
+ rxLookUpData.AppendRecord([4, 'MS Windows XP', 150]);
+ rxLookUpData.AppendRecord([5, 'MS Windows Vista', 100]);
+ rxLookUpData.AppendRecord([6, 'MS Windows 7', 200]);
+ rxLookUpData.AppendRecord([7, 'Fedora Linux 11', 0]);
+ Label2.Caption:='';
+end;
+
+initialization
+ {$I unit1.lrs}
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/project1.ico b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/project1.ico
new file mode 100644
index 000000000..0341321b5
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/project1.ico differ
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/project1.lpi b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/project1.lpi
new file mode 100644
index 000000000..25e9b31ab
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/project1.lpi
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/project1.lpr b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/project1.lpr
new file mode 100644
index 000000000..fd216e9ac
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/project1.lpr
@@ -0,0 +1,20 @@
+program project1;
+
+{$mode objfpc}{$H+}
+
+uses
+ {$IFDEF UNIX}{$IFDEF UseCThreads}
+ cthreads,
+ {$ENDIF}{$ENDIF}
+ Interfaces, // this includes the LCL widgetset
+ Forms, Unit1, rxnew, Unit2, Unit3, Unit4;
+
+{$R *.res}
+
+begin
+ RequireDerivedFormResource := True;
+ Application.Initialize;
+ Application.CreateForm(TForm1, Form1);
+ Application.Run;
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/project1.lps b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/project1.lps
new file mode 100644
index 000000000..61753a883
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/project1.lps
@@ -0,0 +1,223 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/project1.res b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/project1.res
new file mode 100644
index 000000000..7c6cf3e4b
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/project1.res differ
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/unit1.lfm b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/unit1.lfm
new file mode 100644
index 000000000..6cf0270b4
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/unit1.lfm
@@ -0,0 +1,135 @@
+object Form1: TForm1
+ Left = 527
+ Height = 423
+ Top = 222
+ Width = 581
+ Caption = 'MainForm'
+ ClientHeight = 400
+ ClientWidth = 581
+ Menu = MainMenu1
+ Position = poScreenCenter
+ LCLVersion = '1.1'
+ WindowState = wsMaximized
+ object ToolPanel1: TToolPanel
+ Left = 0
+ Height = 31
+ Top = 0
+ Width = 581
+ Items = <>
+ Options = []
+ Align = alTop
+ BorderWidth = 4
+ ClientHeight = 31
+ ClientWidth = 581
+ TabOrder = 0
+ object RxMDICloseButton1: TRxMDICloseButton
+ AnchorSideTop.Control = ToolPanel1
+ AnchorSideTop.Side = asrCenter
+ AnchorSideRight.Control = ToolPanel1
+ AnchorSideRight.Side = asrBottom
+ Left = 553
+ Height = 22
+ Top = 4
+ Width = 23
+ Anchors = [akTop, akRight]
+ Glyph.Data = {
+ 1A020000424D1A0200000000000036000000280000000B0000000B0000000100
+ 200000000000E401000064000000640000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000FF0000
+ 00FF00000000000000000000000000000000000000FF000000FF000000000000
+ 00000000000000000000000000FF000000FF0000000000000000000000FF0000
+ 00FF000000000000000000000000000000000000000000000000000000FF0000
+ 00FF000000FF000000FF00000000000000000000000000000000000000000000
+ 00000000000000000000000000FF000000FF0000000000000000000000000000
+ 000000000000000000000000000000000000000000FF000000FF000000FF0000
+ 00FF000000000000000000000000000000000000000000000000000000FF0000
+ 00FF0000000000000000000000FF000000FF0000000000000000000000000000
+ 0000000000FF000000FF00000000000000000000000000000000000000FF0000
+ 00FF000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000000
+ }
+ end
+ end
+ object RxMDITasks1: TRxMDITasks
+ Left = 0
+ Height = 25
+ Top = 356
+ Width = 581
+ Align = alBottom
+ end
+ object StatusBar1: TStatusBar
+ Left = 0
+ Height = 19
+ Top = 381
+ Width = 581
+ Panels = <>
+ end
+ object RxMDIPanel1: TRxMDIPanel
+ Left = 0
+ Height = 325
+ Top = 31
+ Width = 581
+ CloseButton = RxMDICloseButton1
+ TaskPanel = RxMDITasks1
+ Align = alClient
+ BevelOuter = bvLowered
+ end
+ object ActionList1: TActionList
+ left = 440
+ top = 72
+ object sysClose: TAction
+ Category = 'System'
+ Caption = 'Close'
+ OnExecute = sysCloseExecute
+ end
+ object Action1: TAction
+ Category = 'MDI forms'
+ Caption = 'Form # 1'
+ OnExecute = Action1Execute
+ end
+ object Action2: TAction
+ Category = 'MDI forms'
+ Caption = 'Form # 2'
+ OnExecute = Action2Execute
+ end
+ object Action3: TAction
+ Category = 'MDI forms'
+ Caption = 'New single MDI form'
+ OnExecute = Action3Execute
+ end
+ end
+ object MainMenu1: TMainMenu
+ left = 408
+ top = 72
+ object MenuItem1: TMenuItem
+ Caption = 'System'
+ object MenuItem2: TMenuItem
+ Action = sysClose
+ end
+ end
+ object MenuItem3: TMenuItem
+ Caption = 'MDI forms'
+ object MenuItem4: TMenuItem
+ Action = Action1
+ end
+ object MenuItem5: TMenuItem
+ Action = Action2
+ end
+ object MenuItem7: TMenuItem
+ Caption = '-'
+ end
+ object MenuItem6: TMenuItem
+ Action = Action3
+ end
+ end
+ end
+ object Timer1: TTimer
+ Interval = 500
+ OnTimer = Timer1Timer
+ left = 451
+ top = 117
+ end
+end
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/unit1.pas b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/unit1.pas
new file mode 100644
index 000000000..8e4f225b3
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/unit1.pas
@@ -0,0 +1,90 @@
+unit Unit1;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, FileUtil, rxtoolbar, RxMDI, Forms, Controls, Graphics,
+ Dialogs, ActnList, Menus, ComCtrls, ExtCtrls;
+
+type
+
+ { TForm1 }
+
+ TForm1 = class(TForm)
+ Action1: TAction;
+ Action2: TAction;
+ Action3: TAction;
+ MenuItem1: TMenuItem;
+ MenuItem2: TMenuItem;
+ MenuItem3: TMenuItem;
+ MenuItem4: TMenuItem;
+ MenuItem5: TMenuItem;
+ MenuItem6: TMenuItem;
+ MenuItem7: TMenuItem;
+ sysClose: TAction;
+ ActionList1: TActionList;
+ MainMenu1: TMainMenu;
+ RxMDICloseButton1: TRxMDICloseButton;
+ RxMDIPanel1: TRxMDIPanel;
+ RxMDITasks1: TRxMDITasks;
+ StatusBar1: TStatusBar;
+ Timer1: TTimer;
+ ToolPanel1: TToolPanel;
+ procedure Action1Execute(Sender: TObject);
+ procedure Action2Execute(Sender: TObject);
+ procedure Action3Execute(Sender: TObject);
+ procedure sysCloseExecute(Sender: TObject);
+ procedure Timer1Timer(Sender: TObject);
+ private
+ { private declarations }
+ public
+ { public declarations }
+ end;
+
+var
+ Form1: TForm1;
+
+implementation
+
+uses Unit2, Unit3, Unit4;
+
+{$R *.lfm}
+
+{ TForm1 }
+
+procedure TForm1.sysCloseExecute(Sender: TObject);
+begin
+ Close;
+end;
+
+procedure TForm1.Timer1Timer(Sender: TObject);
+begin
+ if Assigned(ActiveControl) then
+ StatusBar1.SimpleText:=ActiveControl.Caption
+ else
+ StatusBar1.SimpleText:=''
+ ;
+end;
+
+procedure TForm1.Action1Execute(Sender: TObject);
+begin
+ RxMDIPanel1.ChildWindowsCreate(Form2, TForm2);
+end;
+
+procedure TForm1.Action2Execute(Sender: TObject);
+begin
+ RxMDIPanel1.ChildWindowsCreate(Form3, TForm3);
+end;
+
+procedure TForm1.Action3Execute(Sender: TObject);
+var
+ Form4: TForm4;
+begin
+ Form4:=TForm4.Create(Application);
+ RxMDIPanel1.ChildWindowsAdd(Form4);
+end;
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/unit2.lfm b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/unit2.lfm
new file mode 100644
index 000000000..1e7cf2907
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/unit2.lfm
@@ -0,0 +1,83 @@
+object Form2: TForm2
+ Left = 502
+ Height = 414
+ Top = 245
+ Width = 478
+ Caption = 'MDI form 1'
+ ClientHeight = 414
+ ClientWidth = 478
+ Icon.Data = {
+ 7E04000000000100010010100000010020006804000016000000280000001000
+ 0000200000000100200000000000000400006400000064000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000BE7A45FFBE7A
+ 45FFBE7A45FF0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000BE7A45FFBE7A45FF78553958BE7A45FFE3CD
+ BCFFBE7A45FF78553958BE7A45FFBE7A45FF0000000000000000000000000000
+ 00000000000000000000BE7A45FFE3CDBCFFD2A786FFBE7A45FFC79064FFDAB8
+ 9DFFC79064FFBE7A45FFD2A786FFE3CDBCFFBE7A45FF00000000000000000000
+ 00000000000000000000BE7A45FFD2A786FFDAB89DFFDAB89DFFDAB89DFFDAB8
+ 9DFFDAB89DFFDAB89DFFDAB89DFFD2A786FFBE7A45FF00000000000000000000
+ 0000000000000000000078553958BE7A45FFE3CDBCFFCFA17CFFBD7F4CF8C386
+ 56FFBA7A46F4D5AE8FFFDAB89DFFBE7A45FF7855395800000000000000000000
+ 000000000000BE7A45FFBE7A45FFC79064FFDAB89DFFBD7F4CF8B78256CD7855
+ 3959A56F43C0BA7A46F4DAB89DFFC79064FFBE7A45FFBE7A45FF000000000000
+ 000000000000BE7A45FFE3CDBCFFDAB89DFFDAB89DFFC38656FF785539590000
+ 000078553959C38656FFDAB89DFFDAB89DFFE3CDBCFFBE7A45FF000000000000
+ 000000000000BE7A45FFBE7A45FFC79064FFDAB89DFFBA7A46F49C6B42AE7855
+ 39598F633F97BA7C49EEDAB89DFFC79064FFBE7A45FFBE7A45FF000000000000
+ 0000000000000000000078553958BE7A45FFDAB89DFFCFA17CFFBA7A46F4C386
+ 56FFBA7A46F4D1A582FFDAB89DFFBE7A45FF7855395800000000000000000000
+ 00000000000000000000BE7A45FFD2A786FFDAB89DFFDAB89DFFDAB89DFFDAB8
+ 9DFFDAB89DFFDAB89DFFDAB89DFFD2A786FFBE7A45FF00000000000000000000
+ 00000000000000000000BE7A45FFE3CDBCFFD2A786FFBE7A45FFC79064FFDAB8
+ 9DFFC79064FFBE7A45FFD2A786FFE3CDBCFFBE7A45FF00000000000000000000
+ 0000000000000000000078553958BE7A45FFBE7A45FF78553958BE7A45FFE3CD
+ BCFFBE7A45FF78553958BE7A45FFBE7A45FF0000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000BE7A45FFBE7A
+ 45FFBE7A45FF0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000
+ }
+ OnClose = FormClose
+ LCLVersion = '1.1'
+ object Panel1: TPanel
+ Left = 0
+ Height = 50
+ Top = 0
+ Width = 478
+ Align = alTop
+ Caption = 'MDI form # 1'
+ TabOrder = 0
+ end
+ object Edit1: TEdit
+ Left = 21
+ Height = 25
+ Top = 106
+ Width = 80
+ TabOrder = 1
+ Text = 'Edit1'
+ end
+ object Edit2: TEdit
+ Left = 118
+ Height = 25
+ Top = 105
+ Width = 80
+ TabOrder = 2
+ Text = 'Edit2'
+ end
+ object Edit3: TEdit
+ Left = 223
+ Height = 25
+ Top = 103
+ Width = 80
+ TabOrder = 3
+ Text = 'Edit3'
+ end
+end
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/unit2.pas b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/unit2.pas
new file mode 100644
index 000000000..44b1c5ad5
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/unit2.pas
@@ -0,0 +1,43 @@
+unit Unit2;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
+ StdCtrls;
+
+type
+
+ { TForm2 }
+
+ TForm2 = class(TForm)
+ Edit1: TEdit;
+ Edit2: TEdit;
+ Edit3: TEdit;
+ Panel1: TPanel;
+ procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
+ private
+ { private declarations }
+ public
+ { public declarations }
+ end;
+
+var
+ Form2: TForm2 = nil;
+
+implementation
+
+{$R *.lfm}
+
+{ TForm2 }
+
+procedure TForm2.FormClose(Sender: TObject; var CloseAction: TCloseAction);
+begin
+ CloseAction:=caFree;
+ Form2:=nil;
+end;
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/unit3.lfm b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/unit3.lfm
new file mode 100644
index 000000000..f46270b90
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/unit3.lfm
@@ -0,0 +1,70 @@
+object Form3: TForm3
+ Left = 604
+ Height = 442
+ Top = 239
+ Width = 640
+ Caption = 'MDI form # 2'
+ ClientHeight = 442
+ ClientWidth = 640
+ Icon.Data = {
+ 7E04000000000100010010100000010020006804000016000000280000001000
+ 0000200000000100200000000000000400006400000064000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000E2C0AAFFE2C0AAFF000000000000
+ 00000000000000000000E2C0AAFFE2C0AAFF0000000000000000000000000000
+ 0000000000000000000000000000C8865BFFBE713FFFC58053FF000000000000
+ 00000000000000000000CE946EFFBE703EFFC17746FF00000000000000000000
+ 0000000000000000000000000000BD6E3BFFBD6E3BFFE2C0AAFF000000000000
+ 0000000000000000000000000000BD6E3BFFBD6E3BFFE2C0AAFF000000000000
+ 0000000000000000000000000000BD6E3BFFBD6E3BFFE2C0AAFF000000000000
+ 0000000000000000000000000000BD6E3BFFBD6E3BFFE2C0AAFF000000000000
+ 0000000000000000000000000000BD6E3BFFBD6E3BFFE2C0AAFF000000000000
+ 0000000000000000000000000000BD6E3BFFBD6E3BFFE2C0AAFF000000000000
+ 00000000000000000000D6A586FFC2794AFFCA8A61FF00000000000000000000
+ 0000000000000000000000000000D39E7CFFC2794AFFCC9068FF000000000000
+ 00000000000000000000C9885EFFC07443FFC27849FF00000000000000000000
+ 0000000000000000000000000000C9885EFFC2794AFFC9885EFF000000000000
+ 0000000000000000000000000000BD6E3BFFBD6E3BFFE2C0AAFF000000000000
+ 0000000000000000000000000000BD6E3BFFBD6E3BFFE2C0AAFF000000000000
+ 0000000000000000000000000000BD6E3BFFBD6E3BFFE2C0AAFF000000000000
+ 0000000000000000000000000000BD6E3BFFBD6E3BFFE2C0AAFF000000000000
+ 0000000000000000000000000000BD6E3BFFBD6E3BFFE2C0AAFF000000000000
+ 0000000000000000000000000000BD6E3BFFBD6E3BFFE2C0AAFF000000000000
+ 0000000000000000000000000000D4A17FFFBD6F3CFFBE703DFF000000000000
+ 00000000000000000000C68155FFBF7241FFCC8D66FF00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000
+ }
+ OnClose = FormClose
+ LCLVersion = '1.1'
+ object Panel1: TPanel
+ Left = 0
+ Height = 50
+ Top = 0
+ Width = 640
+ Align = alTop
+ Caption = 'MDI form # 2'
+ TabOrder = 0
+ end
+ object Memo1: TMemo
+ Left = 0
+ Height = 392
+ Top = 50
+ Width = 640
+ Align = alClient
+ Lines.Strings = (
+ 'Memo1'
+ )
+ TabOrder = 1
+ end
+end
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/unit3.pas b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/unit3.pas
new file mode 100644
index 000000000..2214c5c02
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/unit3.pas
@@ -0,0 +1,41 @@
+unit Unit3;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
+ StdCtrls;
+
+type
+
+ { TForm3 }
+
+ TForm3 = class(TForm)
+ Memo1: TMemo;
+ Panel1: TPanel;
+ procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
+ private
+ { private declarations }
+ public
+ { public declarations }
+ end;
+
+var
+ Form3: TForm3 = nil;
+
+implementation
+
+{$R *.lfm}
+
+{ TForm3 }
+
+procedure TForm3.FormClose(Sender: TObject; var CloseAction: TCloseAction);
+begin
+ CloseAction:=caFree;
+ Form3:=nil;
+end;
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/unit4.lfm b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/unit4.lfm
new file mode 100644
index 000000000..5ccc0ac69
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/unit4.lfm
@@ -0,0 +1,84 @@
+object Form4: TForm4
+ Left = 477
+ Height = 446
+ Top = 196
+ Width = 620
+ Caption = 'Form4'
+ ClientHeight = 446
+ ClientWidth = 620
+ Icon.Data = {
+ 7E04000000000100010010100000010020006804000016000000280000001000
+ 0000200000000100200000000000000400006400000064000000000000000000
+ 0000874A2056874A20FF874A20FF874A20FF874A204400000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000874A20FFBEA592FFB89C86FFB89C86FF874A20FF874A2044000000000000
+ 0000000000000000000000000000858A8881858A88D3858A8881000000000000
+ 0000874A20FFCCBBADFFA7917DFFB5957AFFAE8B72FF874A20FF874A20440000
+ 00000000000000000000858A884C858A88FF9EA1A0FF858A88FF000000000000
+ 0000874A20FFCCBBADFFA48D78FFA28A74FFB4957AFFB3937CFF874A20FF0000
+ 000000000000858A884C858A88FFD2D3D4FFC2C3C4FF858A88FF000000000000
+ 0000874A2030874A20FFD4C8BDFFA48D78FFA48D78FFBEA592FF874A20FF0000
+ 0000858A884C858A88FFE2E3E4FFC2C4C6FF858A88FF858A8881000000000000
+ 000000000000874A2019874A20FFCCBBADFFCCBBADFFB3937CFF874A20FF858A
+ 8881858A88FFD3D3D4FFBDBEBFFF858A88FF858A884C00000002000000000000
+ 00000000000000000000874A2019874A20FF874A20FF874A20FF85837DFFAAAD
+ ADFFC8C9CAFFBDBEBFFF858A88FF858A884C0000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000B5B7B8FF858A
+ 88FFB7B8B9FF858A88FF858A884C000000020000000000000000000000000000
+ 000000000000858A884C858A88FF858A88FF858A88FF858A88FFD0D1D2FFA3A4
+ A4FF858A88FF858A888100000000000000000000000000000000000000000000
+ 0000858A884C858A88FFF3F3F3FEEFF0F0FFEDEEEEFEEAECECFEB6B9BAFF858A
+ 88FF858A884C858A88FF858A884C000000000000000000000000000000000000
+ 0000858A88FFF5F6F6FEA9ACABFF858A88FFF7F7F7FFE2E3E5FFAAADADFFECEE
+ EE8100000000858A884C858A88FF858A884C0000000000000000000000000000
+ 0000858A884C858A88FF00000000858A884C858A88FFFAFAFAFF858A88FF0000
+ 00000000000000000000858A884C858A88FF878C8AFF0000004C000000000000
+ 000000000000000000000000000000000000858A88FFEEF0F0FF858A88FF0000
+ 0000000000000000000000000000858A88FFF0F0F0FF858A88FF0000004C0000
+ 0000000000000000000000000000858A88FFE9EBECFF858A88FF858A884C0000
+ 00000000000000000000000000000000004C858A88FFEEEFEFFC858A88FF0000
+ 0000000000000000000000000000858A884C858A88FF858A884C000000000000
+ 0000000000000000000000000000000000000000004C858A88FF858A884C0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000
+ }
+ OnClose = FormClose
+ OnCreate = FormCreate
+ LCLVersion = '1.1'
+ object Panel1: TPanel
+ Left = 0
+ Height = 50
+ Top = 0
+ Width = 620
+ Align = alTop
+ Caption = 'MDI form # ...'
+ TabOrder = 0
+ end
+ object Edit1: TEdit
+ Left = 47
+ Height = 25
+ Top = 84
+ Width = 80
+ TabOrder = 1
+ Text = 'Edit1'
+ end
+ object Edit2: TEdit
+ Left = 43
+ Height = 25
+ Top = 154
+ Width = 80
+ TabOrder = 2
+ Text = 'Edit2'
+ end
+ object Edit3: TEdit
+ Left = 45
+ Height = 25
+ Top = 215
+ Width = 80
+ TabOrder = 3
+ Text = 'Edit3'
+ end
+end
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/unit4.pas b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/unit4.pas
new file mode 100644
index 000000000..31d3c6017
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/RxMDI/unit4.pas
@@ -0,0 +1,49 @@
+unit Unit4;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
+ ExtCtrls, StdCtrls;
+
+type
+
+ { TForm4 }
+
+ TForm4 = class(TForm)
+ Edit1: TEdit;
+ Edit2: TEdit;
+ Edit3: TEdit;
+ Panel1: TPanel;
+ procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
+ procedure FormCreate(Sender: TObject);
+ private
+ { private declarations }
+ public
+ { public declarations }
+ end;
+
+var
+ CntMM:integer = 0;
+implementation
+
+{$R *.lfm}
+
+{ TForm4 }
+
+procedure TForm4.FormClose(Sender: TObject; var CloseAction: TCloseAction);
+begin
+ CloseAction:=caFree;
+end;
+
+procedure TForm4.FormCreate(Sender: TObject);
+begin
+ Inc(CntMM);
+ Panel1.Caption:=Panel1.Caption + IntToStr(CntMM);
+ Caption:=Panel1.Caption;
+end;
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/RxViewsPanel/project1.ico b/components/rx/version/v2.2_laz_1.2/Demos/RxViewsPanel/project1.ico
new file mode 100644
index 000000000..0341321b5
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/Demos/RxViewsPanel/project1.ico differ
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/RxViewsPanel/project1.lpi b/components/rx/version/v2.2_laz_1.2/Demos/RxViewsPanel/project1.lpi
new file mode 100644
index 000000000..33339124f
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/RxViewsPanel/project1.lpi
@@ -0,0 +1,340 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/RxViewsPanel/project1.lpr b/components/rx/version/v2.2_laz_1.2/Demos/RxViewsPanel/project1.lpr
new file mode 100644
index 000000000..737eb0153
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/RxViewsPanel/project1.lpr
@@ -0,0 +1,21 @@
+program project1;
+
+{$mode objfpc}{$H+}
+
+uses
+ {$IFDEF UNIX}{$IFDEF UseCThreads}
+ cthreads,
+ {$ENDIF}{$ENDIF}
+ Interfaces, // this includes the LCL widgetset
+ Forms, lazcontrols, Unit1
+ { you can add units after this };
+
+{$R *.res}
+
+begin
+ Application.Title:='RxViewsPanel demo';
+ Application.Initialize;
+ Application.CreateForm(TForm1, Form1);
+ Application.Run;
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/RxViewsPanel/project1.res b/components/rx/version/v2.2_laz_1.2/Demos/RxViewsPanel/project1.res
new file mode 100644
index 000000000..7c6cf3e4b
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/Demos/RxViewsPanel/project1.res differ
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/RxViewsPanel/unit1.lfm b/components/rx/version/v2.2_laz_1.2/Demos/RxViewsPanel/unit1.lfm
new file mode 100644
index 000000000..c922e92c6
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/RxViewsPanel/unit1.lfm
@@ -0,0 +1,1605 @@
+object Form1: TForm1
+ Left = 292
+ Height = 667
+ Top = 120
+ Width = 935
+ ActiveControl = ToolPanel1
+ Caption = 'RxViewsPanel demo'
+ ClientHeight = 667
+ ClientWidth = 935
+ OnCreate = FormCreate
+ LCLVersion = '1.1'
+ object RxViewsPanel1: TRxViewsPanel
+ Left = 0
+ Height = 617
+ Top = 31
+ Width = 128
+ Align = alLeft
+ ButtonHeght = 50
+ Color = clMoneyGreen
+ Items = <
+ item
+ Visible = True
+ Caption = 'Диаграмма Ганта'
+ ImageIndex = 0
+ end
+ item
+ Visible = True
+ Caption = 'Задачи'
+ ImageIndex = 2
+ end
+ item
+ Visible = True
+ Caption = 'Ресурсы'
+ Tag = 3
+ ImageIndex = 3
+ end
+ item
+ Visible = True
+ Caption = 'Использование ресурсов'
+ Tag = 4
+ ImageIndex = 4
+ end>
+ ImageList = ImageList2
+ OnSelectViewEvent = RxViewsPanel1SelectViewEvent
+ ItemIndex = 0
+ BevelOuter = bvLowered
+ ClientHeight = 617
+ ClientWidth = 128
+ ParentColor = False
+ TabOrder = 0
+ end
+ object Splitter1: TSplitter
+ Left = 128
+ Height = 617
+ Top = 31
+ Width = 5
+ end
+ object ExtendedNotebook1: TExtendedNotebook
+ Left = 133
+ Height = 617
+ Top = 31
+ Width = 802
+ ActivePage = TabSheet4
+ Align = alClient
+ ShowTabs = False
+ TabIndex = 3
+ TabOrder = 2
+ object TabSheet1: TTabSheet
+ Caption = 'TabSheet1'
+ ClientHeight = 611
+ ClientWidth = 796
+ object StringGrid1: TStringGrid
+ Left = 19
+ Height = 302
+ Top = 13
+ Width = 510
+ TabOrder = 0
+ end
+ end
+ object TabSheet2: TTabSheet
+ Caption = 'TabSheet2'
+ ClientHeight = 611
+ ClientWidth = 796
+ object StringGrid2: TStringGrid
+ Left = 151
+ Height = 341
+ Top = 10
+ Width = 509
+ TabOrder = 0
+ end
+ end
+ object TabSheet3: TTabSheet
+ Caption = 'TabSheet3'
+ ClientHeight = 611
+ ClientWidth = 796
+ object StringGrid3: TStringGrid
+ Left = 109
+ Height = 325
+ Top = 146
+ Width = 607
+ TabOrder = 0
+ end
+ end
+ object TabSheet4: TTabSheet
+ Caption = 'TabSheet4'
+ ClientHeight = 611
+ ClientWidth = 796
+ object StringGrid4: TStringGrid
+ Left = 0
+ Height = 177
+ Top = 0
+ Width = 796
+ Align = alTop
+ TabOrder = 0
+ end
+ object Splitter2: TSplitter
+ Cursor = crVSplit
+ Left = 0
+ Height = 5
+ Top = 177
+ Width = 796
+ Align = alTop
+ ResizeAnchor = akTop
+ end
+ object Memo1: TMemo
+ Left = 0
+ Height = 429
+ Top = 182
+ Width = 796
+ Align = alClient
+ Lines.Strings = (
+ 'Memo1'
+ )
+ TabOrder = 2
+ end
+ end
+ end
+ object StatusBar1: TStatusBar
+ Left = 0
+ Height = 19
+ Top = 648
+ Width = 935
+ Panels = <>
+ end
+ object ToolPanel1: TToolPanel
+ Left = 0
+ Height = 31
+ Top = 0
+ Width = 935
+ Items = <>
+ Options = []
+ Align = alTop
+ BorderWidth = 4
+ TabOrder = 4
+ end
+ object ImageList2: TImageList
+ Height = 48
+ Width = 48
+ left = 336
+ top = 384
+ Bitmap = {
+ 4C69050000003000000030000000000000000000000000000000000000000000
+ 0001000000010000000200000002000000020000000200000002000000020000
+ 0002000000020000000200000002000000020000000200000002000000020000
+ 0002000000020000000200000002000000020000000200000002000000020000
+ 0002000000020000000200000002000000020000000200000002000000020000
+ 0002000000020000000200000002000000020000000100000001000000000000
+ 0000000000000000000000000000000000000000000000000001000000020000
+ 0003000000050000000600000007000000070000000700000008000000080000
+ 0008000000080000000800000008000000080000000800000008000000080000
+ 0008000000080000000800000008000000080000000800000008000000080000
+ 0008000000080000000800000008000000080000000800000008000000080000
+ 0008000000070000000700000007000000060000000500000003000000020000
+ 0001000000000000000000000000000000000000000100000002000000050000
+ 00090000000D0000001000000012000000130000001300000014000000140000
+ 0014000000140000001400000014000000140000001400000014000000140000
+ 0014000000140000001400000014000000140000001400000014000000140000
+ 0014000000140000001400000014000000140000001400000014000000140000
+ 0014000000130000001300000012000000100000000D00000009000000050000
+ 0002000000010000000000000000000000000000000200000005000000FF0000
+ 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000200000001A000000120000000A0000
+ 0005000000020000000000000000000000010000000300000008000000FF0000
+ 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000330000002A0000001D000000110000
+ 000800000003000000010000000000000002000000050000000C000000FF0000
+ 00FF00000038000000430000004A0000004B0000004A0000004A000000490000
+ 0049000000490000004900000049000000490000004900000049000000490000
+ 0049000000490000004900000049000000490000004900000049000000490000
+ 0049000000490000004900000049000000490000004900000049000000490000
+ 004A0000004A000000FF000000FF000000430000003800000028000000180000
+ 000C00000005000000020000000000000002000000060000000E000000FF0000
+ 002E0000003F0000004A0000004F0000004E0000004C0000004A000000490000
+ 0049000000490000004900000049000000490000004900000049000000490000
+ 0049000000490000004900000049000000490000004900000049000000490000
+ 0049000000490000004900000049000000490000004900000049000000490000
+ 004A0000004C0000004E000000FF0000004A0000003F0000002E0000001C0000
+ 000E00000006000000020000000000000002000000060000000E000000FF0000
+ 002D0000003D000000460000004700000044000000400000003E0000003C0000
+ 003C0000003C0000003C0000003C0000003C0000003C0000003C0000003C0000
+ 003C0000003C0000003C0000003C0000003B0000003B0000003B0000003B0000
+ 003B0000003B0000003B0000003B0000003B0000003B0000003B0000003B0000
+ 003D0000003F00000043000000FF000000450000003C0000002D0000001C0000
+ 000E00000006000000020000000000000002000000050000000D000000190000
+ 0027000000320000003800000037000000330000002E0000002B0000002A0000
+ 002A0000002A0000002A0000002A0000002A0000002A0000002A0000002A0000
+ 002A0000002A0000002A0000002A000000290000002900000029000000290000
+ 0029000000290000002800000027000000260000002600000026000000260000
+ 00280000002B0000003000000035000000360000003100000026000000180000
+ 000D00000005000000020000000000000002000000040000000A000000140000
+ 001F000000280000002B0000002A00000025000000210000001E0000001D0000
+ 001D0000001D0000001D0000001D0000001D0000001D0000001D0000001D0000
+ 001D0000001D0000001D0000001D0000001C0000001C0000001C0000001C0000
+ 001B0000001A0000001900000017000000160000001500000014000000140000
+ 0016000000180000001C0000002200000024000000220000001B000000120000
+ 000A000000040000000100000000000000010000000300000009000000110000
+ 001A0000002200000026000000260000002400000022000000200000001F0000
+ 001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000
+ 001F0000001F0000001F0000001F0000001E0000001E0000001E0000001E0000
+ 001C0000001A00000016000000110000000D0000000A00000009000000080000
+ 00090000000A0000000E000000120000001500000015000000110000000B0000
+ 0006000000020000000100000000000000010000000300000009000000FF0000
+ 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000260000001E000000160000000E0000000700000004000000030000
+ 00030000000400000006000000080000000A0000000A00000009000000060000
+ 000300000001000000000000000000000001000000040000000A000000FFE5CB
+ 9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB
+ 9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB
+ 9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB9CFFCEB68CFF0000
+ 00FF0000003F0000003100000022000000130000000900000003000000010000
+ 0000000000010000000200000003000000040000000500000004000000020000
+ 000200000000000000000000000000000002000000060000000E000000FFE5CB
+ 9CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB6
+ 8CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB6
+ 8CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFAA9774FF0000
+ 00FF0000005C00000047000000310000001C0000000E00000005000000020000
+ 0000000000000000000000000001000000010000000200000001000000010000
+ 0000000000000000000000000000000000020000000600000012000000FFE5CB
+ 9CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB6
+ 8CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB6
+ 8CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFAA9774FF0000
+ 00FF000000760000005C0000003E000000240000001200000006000000020000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000020000000800000014000000FFE5CB
+ 9CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB6
+ 8CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB6
+ 8CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFAA9774FF0000
+ 00FF000000870000006A000000470000002A0000001400000008000000020000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000020000000800000015000000FFCEB6
+ 8CFFAA9774FFAA9774FFAA9774FFAA9774FFAA9774FFAA9774FFAA9774FFAA97
+ 74FFAA9774FFAA9774FFAA9774FFAA9774FFAA9774FFAA9774FFAA9774FFAA97
+ 74FFAA9774FFAA9774FFAA9774FFAA9774FFAA9774FFAA9774FFAA9774FF0000
+ 00FF0000008D0000006E0000004A0000002B0000001500000008000000020000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000020000000800000014000000FF0000
+ 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000880000006A000000480000002A0000001400000008000000020000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000020000000600000012000000240000
+ 003E0000005C000000760000008900000094000000990000009A0000009A0000
+ 009B0000009B0000009B0000009B0000009B0000009B0000009B0000009B0000
+ 009B0000009B0000009C0000009C0000009D0000009C0000009A000000960000
+ 008B000000790000005E00000041000000260000001400000009000000040000
+ 0002000000020000000200000002000000020000000100000001000000000000
+ 000000000000000000000000000000000002000000050000000E0000001C0000
+ 0031000000470000005C0000006A000000730000007600000078000000780000
+ 0079000000790000007900000079000000790000007900000079000000790000
+ 007A0000007A0000007C0000007E0000008000000081000000800000007C0000
+ 007400000066000000510000003A00000025000000160000000E0000000A0000
+ 0009000000080000000800000007000000060000000500000003000000020000
+ 0001000000000000000000000000000000010000000300000009000000130000
+ 0021000000310000003E000000490000004E0000005100000052000000520000
+ 0052000000520000005200000052000000520000005200000052000000530000
+ 0055000000570000005B00000060000000640000006600000067000000650000
+ 00600000005600000048000000380000002A000000200000001A000000180000
+ 0017000000160000001600000014000000120000000E00000009000000050000
+ 00020000000100000000000000000000000000000002000000050000000A0000
+ 00120000001C000000240000002A0000002D0000002E0000002E0000002E0000
+ 002F0000002F0000002F0000002F0000002F0000002F0000002F000000310000
+ 0034000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000240000001C000000120000000A0000
+ 0005000000020000000000000000000000000000000100000002000000050000
+ 00090000000E0000001200000014000000160000001600000016000000160000
+ 00170000001700000017000000170000001700000017000000180000001A0000
+ 0020000000FFE5CB9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB
+ 9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB
+ 9CFFE5CB9CFFCEB68CFF000000FF0000003E0000003100000021000000130000
+ 0009000000030000000100000000000000000000000000000001000000020000
+ 0003000000050000000600000007000000080000000800000008000000080000
+ 000900000009000000090000000900000009000000090000000A0000000E0000
+ 0016000000FFE5CB9CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB6
+ 8CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB6
+ 8CFFCEB68CFFAA9774FF000000FF0000005C00000047000000310000001C0000
+ 000E000000050000000200000000000000000000000000000000000000000000
+ 0001000000010000000200000002000000020000000200000002000000020000
+ 0002000000020000000200000002000000020000000200000004000000090000
+ 0014000000FFE5CB9CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB6
+ 8CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB6
+ 8CFFCEB68CFFAA9774FF000000FF000000760000005C0000003E000000240000
+ 0012000000060000000200000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000002000000080000
+ 0014000000FFE5CB9CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB6
+ 8CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB6
+ 8CFFCEB68CFFAA9774FF000000FF000000870000006A000000470000002A0000
+ 0014000000080000000200000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000002000000080000
+ 0015000000FFCEB68CFFAA9774FFAA9774FFAA9774FFAA9774FFAA9774FFAA97
+ 74FFAA9774FFAA9774FFAA9774FFAA9774FFAA9774FFAA9774FFAA9774FFAA97
+ 74FFAA9774FFAA9774FF000000FF0000008D0000006E0000004A0000002B0000
+ 0015000000080000000200000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000002000000080000
+ 0014000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000870000006A000000470000002A0000
+ 0014000000080000000200000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000010000
+ 0001000000020000000200000002000000020000000200000004000000090000
+ 001400000026000000410000005E000000790000008B000000950000009A0000
+ 009A0000009B0000009B0000009B0000009B0000009B0000009B0000009A0000
+ 009A000000990000009400000089000000760000005C0000003E000000240000
+ 0012000000060000000200000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000100000002000000030000
+ 000500000006000000070000000800000008000000090000000A0000000E0000
+ 0016000000250000003A000000500000006400000072000000790000007A0000
+ 007A0000007A0000007900000079000000790000007900000079000000780000
+ 007800000076000000730000006A0000005C00000047000000310000001C0000
+ 000E000000050000000200000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000010000000200000005000000090000
+ 000E0000001200000014000000160000001600000017000000180000001A0000
+ 00200000002A0000003800000046000000530000005A0000005C0000005A0000
+ 0057000000550000005300000052000000520000005200000052000000520000
+ 0052000000510000004E000000490000003E0000003100000021000000130000
+ 0009000000030000000100000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000200000005000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000FF0000004E00000049000000420000
+ 003A00000034000000310000002F0000002F0000002F0000002F0000002E0000
+ 002E0000002E0000002D0000002A000000240000001C000000120000000A0000
+ 0005000000020000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000010000000300000009000000FFE5CB9CFFE5CB
+ 9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB9CFFE5CB
+ 9CFFE5CB9CFFE5CB9CFFCEB68CFF000000FF0000005300000046000000380000
+ 002A000000200000001A00000018000000170000001700000017000000160000
+ 0016000000160000001600000014000000120000000E00000009000000050000
+ 0002000000010000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000002000000050000000E000000FFE5CB9CFFCEB6
+ 8CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB6
+ 8CFFCEB68CFFCEB68CFFAA9774FF000000FF00000064000000500000003A0000
+ 0025000000160000000E0000000A000000090000000900000009000000080000
+ 0008000000080000000800000007000000060000000500000003000000020000
+ 0001000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000020000000600000012000000FFE5CB9CFFCEB6
+ 8CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB6
+ 8CFFCEB68CFFCEB68CFFAA9774FF000000FF000000790000005E000000410000
+ 0026000000140000000900000004000000020000000200000002000000020000
+ 0002000000020000000200000002000000020000000100000001000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000020000000800000014000000FFE5CB9CFFCEB6
+ 8CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB68CFFCEB6
+ 8CFFCEB68CFFCEB68CFFAA9774FF000000FF000000880000006A000000480000
+ 002A000000140000000800000002000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000020000000800000015000000FFCEB68CFFAA97
+ 74FFAA9774FFAA9774FFAA9774FFAA9774FFAA9774FFAA9774FFAA9774FFAA97
+ 74FFAA9774FFAA9774FFAA9774FF000000FF0000008D0000006E0000004A0000
+ 002B000000150000000800000002000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000020000000800000014000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000FF000000870000006A000000470000
+ 002A000000140000000800000002000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000020000000600000012000000240000003E0000
+ 005C000000760000008900000094000000990000009A0000009A0000009B0000
+ 009A0000009A000000990000009400000089000000760000005C0000003E0000
+ 0024000000120000000600000002000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000002000000050000000E0000001C000000310000
+ 00470000005C0000006A00000073000000760000007800000078000000790000
+ 00780000007800000076000000730000006A0000005C00000047000000310000
+ 001C0000000E0000000500000002000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000001000000030000000900000013000000210000
+ 00310000003E000000490000004E000000510000005200000052000000520000
+ 005200000052000000510000004E000000490000003E00000031000000210000
+ 0013000000090000000300000001000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000002000000050000000A000000120000
+ 001C00000024282828320A0A0A2F0A0A0A300A0A0A300000002E0000002F0000
+ 002E0000002E0000002E0000002D0000002A000000240000001C000000127878
+ 7813000000050000000200000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000010000000200000005000000090000
+ 000E000000120000001400000016000000160000001600000016000000170000
+ 001600000016000000160000001600000014000000120000000E000000090000
+ 0005000000020000000100000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000100000002000000030000
+ 0005000000060000000700000008000000080000000800000008000000090000
+ 0008000000080000000800000008000000070000000600000005000000030000
+ 0002000000010000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000010000
+ 0001000000020000000200000002000000020000000200000002000000020000
+ 0002000000020000000200000002000000020000000200000001000000010000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009696966B9696
+ 96F6959595FF949494FF949494FF939393FF919191FF909090FF8E8E8EFF8D8D
+ 8DFF8B8B8BFF898989FF878787FF858585FF838383FF818181FF7F7F7FFF7D7D
+ 7DFF7B7B7BFF797979FF777777FF757575FF737373FF707070FF6E6E6EFF6C6C
+ 6CFF6A6A6AFF686868FF666666FF636363FF616161FF5F5F5FFF5D5D5DFF5B5B
+ 5BFF595959FF565656FF545454FF525252FF505050FF4E4E4EFF505050F65353
+ 536BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00989898F6F7F7
+ F7FFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFDFD
+ FDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFCFCFCFFFCFC
+ FCFFFCFCFCFFFCFCFCFFFCFCFCFFFCFCFCFFFBFBFBFFFBFBFBFFFBFBFBFFFBFB
+ FBFFFBFBFBFFFBFBFBFFFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFFAFAFAFFF9F9
+ F9FFF9F9F9FFF9F9F9FFF9F9F9FFF9F9F9FFF9F9F9FFF8F8F8FFF2F2F2FF5050
+ 50F6FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00999999FFFEFE
+ FEFFDCDCDCFFDDDDDDFFDDDDDDFFDEDEDEFFDFDFDFFFDFDFDFFFE0E0E0FFE0E0
+ E0FFE1E1E1FFE1E1E1FFE1E1E1FFE2E2E2FFE2E2E2FFE3E3E3FFE3E3E3FFE3E3
+ E3FFE4E4E4FFE4E4E4FFE5E5E5FFE5E5E5FFE5E5E5FFE5E5E5FFE6E6E6FFE6E6
+ E6FFE6E6E6FFE6E6E6FFE6E6E6FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7
+ E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009B9B9BFFFEFE
+ FEFFDDDDDDFFDDDDDDFFDEDEDEFFDFDFDFFFDFDFDFFFE0E0E0FFE0E0E0FFE1E1
+ E1FFE1E1E1FFE1E1E1FFE2E2E2FFE2E2E2FFE3E3E3FFE3E3E3FFE4E4E4FFE4E4
+ E4FFE4E4E4FFE5E5E5FFE5E5E5FFE5E5E5FFE6E6E6FFE6E6E6FFE6E6E6FFE7E7
+ E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE7E7E7FFE8E8E8FFE8E8E8FFE8E8
+ E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE7E7E7FFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009D9D9DFFFEFE
+ FEFFDDDDDDFFDEDEDEFFDEDEDEFFDFDFDFFFE0E0E0FFE0E0E0FFE1E1E1FFE1E1
+ E1FFE2E2E2FFE2E2E2FFE3E3E3FFE3E3E3FFE3E3E3FFE4E4E4FFE4E4E4FFE5E5
+ E5FFE5E5E5FFE5E5E5FFE6E6E6FFE6E6E6FFE6E6E6FFE7E7E7FFE7E7E7FFE7E7
+ E7FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8
+ E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009F9F9FFFFEFE
+ FEFFDEDEDEFFDEDEDEFFDFDFDFFFE0E0E0FFE0E0E0FFE1E1E1FFE1E1E1FFE2E2
+ E2FFE2E2E2FFE3E3E3FFE3E3E3FFE4E4E4FFE4E4E4FFE4E4E4FFE5E5E5FFE5E5
+ E5FFE6E6E6FFE6E6E6FFE6E6E6FFE7E7E7FFE7E7E7FFE7E7E7FFE8E8E8FFE8E8
+ E8FFE8E8E8FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9
+ E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFE9E9E9FFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009F9F9FFFFEFE
+ FEFFDEDEDEFFDFDFDFFFDCDCDCFF343434FF343434FF343434FF353535FF3535
+ 35FF353535FF353535FF353535FF353535FF353535FF353535FF353535FF3535
+ 35FF353535FF353535FF353535FF353535FF353535FF353535FF353535FF3636
+ 36FF363636FF363636FF363636FF363636FF363636FF363636FF363636FF3636
+ 36FF363636FF363636FF363636FFD5D5D5FFEAEAEAFFEAEAEAFFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009E9E9EFFFEFE
+ FEFFDFDFDFFFDFDFDFFFDFDFDFFF161616FF212121FF4E4E4EFF6C6C6CFF7D7D
+ 7DFF808080FF848484FF878787FF8B8B8BFF8F8F8FFF929292FF969696FF9A9A
+ 9AFF9C9C9CFFA0A0A0FFA4A4A4FFA5A5A5FFA2A2A2FF9F9F9FFF9C9C9CFF9898
+ 98FF959595FF939393FF8F8F8FFF8B8B8BFF898989FF858585FF828282FF7272
+ 72FF545454FF262626FF151515FFD7D7D7FFEAEAEAFFEAEAEAFFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009D9D9DFFFEFE
+ FEFFDFDFDFFFE0E0E0FFE0E0E0FF747474FFD2D2D2FFE2E2E2FFE3E3E3FFE3E3
+ E3FFE4E4E4FFE4E4E4FFE5E5E5FFE5E5E5FFE6E6E6FFE6E6E6FFE7E7E7FFE7E7
+ E7FFE8E8E8FFE8E8E8FFE8E8E8FFE9E9E9FFE9E9E9FFE9E9E9FFEAEAEAFFEAEA
+ EAFFEAEAEAFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEBEBFFEBEB
+ EBFFEBEBEBFFE1E1E1FF767676FFE9E9E9FFEBEBEBFFEBEBEBFFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009A9A9AFFFDFD
+ FDFFE0E0E0FFE0E0E0FFE1E1E1FFE1E1E1FFE2E2E2FFE2E2E2FFE3E3E3FFE4E4
+ E4FFE4E4E4FFE5E5E5FFE5E5E5FFE6E6E6FFE6E6E6FFE7E7E7FFE7E7E7FFE8E8
+ E8FFE8E8E8FFE9E9E9FFE9E9E9FFE9E9E9FFEAEAEAFFEAEAEAFFEAEAEAFFEBEB
+ EBFFEBEBEBFFEBEBEBFFECECECFFECECECFFECECECFFECECECFFECECECFFECEC
+ ECFFECECECFFECECECFFECECECFFECECECFFECECECFFECECECFFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00989898FFFDFD
+ FDFFE0E0E0FFE1E1E1FFE1E1E1FFE2E2E2FFE2E2E2FFE3E3E3FFE3E3E3FFE4E4
+ E4FFE5E5E5FFE5E5E5FFE6E6E6FFE6E6E6FFE7E7E7FFE7E7E7FFE8E8E8FFE8E8
+ E8FFE9E9E9FFE9E9E9FFEAEAEAFFEAEAEAFFEAEAEAFFEBEBEBFFEBEBEBFFEBEB
+ EBFFECECECFFECECECFFECECECFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDED
+ EDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00969696FFFDFD
+ FDFFE0E0E0FFE1E1E1FFE1E1E1FF818788FF576163FF576163FF586163FF5861
+ 63FF586264FF596264FF596264FF596265FF596265FF5A6365FF5A6365FF5A63
+ 65FF5A6365FF5A6365FF5A6365FF5B6466FF5A6365FF707779FFECECECFFECEC
+ ECFFECECECFFEDEDEDFFEDEDEDFFEDEDEDFFEDEDEDFFEEEEEEFFEEEEEEFFEEEE
+ EEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEDEDEDFFEDEDEDFFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00949494FFFDFD
+ FDFFE1E1E1FFE1E1E1FFE2E2E2FF47575CFF74CFD9FF7CCEE1FF7CCEE1FF7CCE
+ E1FF7CCEE1FF7CCEE1FF7CCEE1FF7CCEE1FF7CCEE1FF7CCEE1FF7CCEE1FF7CCE
+ E1FF7CCEE1FF7CCEE1FF7CCEE1FF7CCEE1FF5FBCC4FF334F4FFFECECECFFEDED
+ EDFFEDEDEDFFEDEDEDFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEE
+ EEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFEEEEEEFFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00919191FFFDFD
+ FDFFE1E1E1FFE2E2E2FFE2E2E2FF47585CFF74D3DCFF77C9DFFF77C9DFFF77C9
+ DFFF78CAE0FF78CAE0FF78CAE0FF79CBE1FF79CBE1FF7ACCE2FF7ACCE2FF7ACC
+ E2FF7ACCE2FF7BCDE3FF7BCDE3FF7BCDE3FF5BBCC3FF33504FFFEDEDEDFFEDED
+ EDFFEEEEEEFFEEEEEEFFEEEEEEFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEF
+ EFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF008F8F8FFFFDFD
+ FDFFE1E1E1FFE2E2E2FFE2E2E2FF47585CFF74D3DCFF77C9DFFF77C9DFFF78CA
+ E0FF78CAE0FF78CAE0FF78CAE0FF79CBE1FF7ACCE2FF7ACCE2FF7ACCE2FF7ACC
+ E2FF7BCDE3FF7BCDE3FF7BCDE3FF7BCDE3FF5ABCC2FF33504FFFEEEEEEFFEEEE
+ EEFFEEEEEEFFEFEFEFFFEFEFEFFFEFEFEFFFF0F0F0FFF0F0F0FFF0F0F0FFF0F0
+ F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFEFEFEFFFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF008D8D8DFFFDFD
+ FDFFE1E1E1FFE2E2E2FFE3E3E3FF3B494CFF396F7BFF386D7AFF386D7AFF386D
+ 7AFF386E7AFF386E7AFF386E7AFF386E7AFF386E7AFF386E7AFF386E7AFF396F
+ 7BFF396F7BFF396F7BFF396F7BFF396F7BFF337175FF253738FFEEEEEEFFEFEF
+ EFFFEFEFEFFFEFEFEFFFF0F0F0FFF0F0F0FFF0F0F0FFF1F1F1FFF1F1F1FFF1F1
+ F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF0F0F0FFF0F0F0FFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF008A8A8AFFFCFC
+ FCFFE2E2E2FFE2E2E2FFE3E3E3FFC0C0C0FFABABABFFACACACFFACACACFFACAC
+ ACFFADADADFFAEAEAEFFAEAEAEFFAFAFAFFFAFAFAFFFAFAFAFFFB0B0B0FFB0B0
+ B0FFB1B1B1FFB1B1B1FFB2B2B2FFB2B2B2FFB2B2B2FFBFBFBFFFEFEFEFFFEFEF
+ EFFFF0F0F0FFF0F0F0FFF0F0F0FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1
+ F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF1F1F1FFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00888888FFFCFC
+ FCFFE2E2E2FFE3E3E3FFE3E3E3FFE4E4E4FFE5E5E5FFE5E5E5FFE6E6E6FFE7E7
+ E7FFE7E7E7FFE8E8E8FFE9E9E9FFE9E9E9FFEAEAEAFFEAEAEAFFEBEBEBFFECEC
+ ECFFECECECFFEDEDEDFFEDEDEDFFEEEEEEFFEEEEEEFFEFEFEFFFEFEFEFFFF0F0
+ F0FFF0F0F0FFF1F1F1FFF1F1F1FFF1F1F1FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2
+ F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF2F2F2FFF1F1F1FFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00858585FFFCFC
+ FCFFE2E2E2FFE3E3E3FFE4E4E4FFE4E4E4FFE5E5E5FFE6E6E6FFE6E6E6FFE7E7
+ E7FFE8E8E8FFE8E8E8FFE9E9E9FFE9E9E9FFEAEAEAFFEBEBEBFFEBEBEBFFECEC
+ ECFFEDEDEDFFEDEDEDFFA6AAACFF626B6EFF626C6FFF626C6FFF636D6FFF636D
+ 6FFF636D70FF636D70FF636D70FF636D70FF636D70FF646E70FF646E70FF646E
+ 70FF636D70FFBABEBFFFF3F3F3FFF3F3F3FFF2F2F2FFF2F2F2FFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00838383FFFCFC
+ FCFFE2E2E2FFE3E3E3FFE4E4E4FFE4E4E4FFE5E5E5FFE6E6E6FFE6E6E6FFE7E7
+ E7FFE8E8E8FFE8E8E8FFE9E9E9FFEAEAEAFFEAEAEAFFEBEBEBFFECECECFFECEC
+ ECFFEDEDEDFFEDEDEDFF5F6B6FFF77D6DFFF80D5E8FF80D5E8FF80D5E8FF80D5
+ E8FF80D5E8FF80D6E8FF80D6E8FF80D6E8FF80D6E8FF80D6E8FF80D6E8FF80D6
+ E8FF53ACB5FF727C7FFFF4F4F4FFF3F3F3FFF3F3F3FFF3F3F3FFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00818181FFFCFC
+ FCFFE3E3E3FFE3E3E3FFE4E4E4FFE5E5E5FFE5E5E5FFE6E6E6FFE7E7E7FFE7E7
+ E7FFE8E8E8FFE9E9E9FFE9E9E9FFEAEAEAFFEBEBEBFFEBEBEBFFECECECFFEDED
+ EDFFEDEDEDFFEEEEEEFF5F6B6FFF75D4DDFF7DCFE5FF7DCFE5FF7ED0E6FF7ED0
+ E6FF7ED0E6FF7ED0E6FF7FD1E7FF7FD1E7FF7FD1E7FF7FD1E7FF7FD1E7FF7FD1
+ E7FF52A9B3FF727C7FFFF4F4F4FFF4F4F4FFF4F4F4FFF3F3F3FFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007E7E7EFFFBFB
+ FBFFE3E3E3FFE3E3E3FFE4E4E4FFE5E5E5FFE5E5E5FFE6E6E6FFE7E7E7FFE8E8
+ E8FFE8E8E8FFE9E9E9FFEAEAEAFFEAEAEAFFEBEBEBFFECECECFFECECECFFEDED
+ EDFFEDEDEDFFEEEEEEFF606C6FFF75D4DDFF7DCFE5FF7ED0E6FF7ED0E6FF7ED0
+ E6FF7ED0E6FF7FD1E7FF7FD1E7FF7FD1E7FF7FD1E7FF80D2E8FF80D2E8FF80D2
+ E8FF51A8B2FF727C7FFFF5F5F5FFF5F5F5FFF5F5F5FFF4F4F4FFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007C7C7CFFFBFB
+ FBFFE3E3E3FFE4E4E4FFE4E4E4FFE5E5E5FFE6E6E6FFE6E6E6FFE7E7E7FFE8E8
+ E8FFE8E8E8FFE9E9E9FFEAEAEAFFEAEAEAFFEBEBEBFFECECECFFECECECFFEDED
+ EDFFEEEEEEFFEEEEEEFF5C676AFF3D7782FF3D7582FF3D7582FF3D7582FF3D76
+ 82FF3D7682FF3D7682FF3D7682FF3D7682FF3E7783FF3E7783FF3E7783FF3E77
+ 83FF346F75FF747D80FFF6F6F6FFF5F5F5FFF5F5F5FFF5F5F5FFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF007A7A7AFFFBFB
+ FBFFE3E3E3FFE4E4E4FFE4E4E4FFE5E5E5FFE6E6E6FFE6E6E6FFE7E7E7FFE8E8
+ E8FFE9E9E9FFE9E9E9FFEAEAEAFFEBEBEBFFEBEBEBFFECECECFFEDEDEDFFEDED
+ EDFFEEEEEEFFEFEFEFFFD9D9D9FFBBBBBBFFBCBCBCFFBCBCBCFFBDBDBDFFBEBE
+ BEFFBEBEBEFFBEBEBEFFBEBEBEFFBFBFBFFFC0C0C0FFC0C0C0FFC0C0C0FFC1C1
+ C1FFC1C1C1FFE6E6E6FFF6F6F6FFF6F6F6FFF6F6F6FFF5F5F5FFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00777777FFFBFB
+ FBFFE3E3E3FFE4E4E4FFE4E4E4FFE5E5E5FFE6E6E6FFE7E7E7FFE7E7E7FFE8E8
+ E8FFE9E9E9FFE9E9E9FFEAEAEAFFEBEBEBFFEBEBEBFFECECECFFEDEDEDFFEDED
+ EDFFEEEEEEFFEFEFEFFFEFEFEFFFF0F0F0FFF1F1F1FFF2F2F2FFF2F2F2FFF3F3
+ F3FFF4F4F4FFF4F4F4FFF5F5F5FFF5F5F5FFF6F6F6FFF7F7F7FFF7F7F7FFF7F7
+ F7FFF8F8F8FFF7F7F7FFF7F7F7FFF7F7F7FFF6F6F6FFF6F6F6FFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00757575FFFBFB
+ FBFFE3E3E3FFE4E4E4FFE5E5E5FFE5E5E5FFE6E6E6FFE7E7E7FFE7E7E7FFE8E8
+ E8FFE9E9E9FFBDBFC0FF6D787BFF6D787BFF6D787BFF6E797BFF6E797CFF6F7A
+ 7CFF6F7A7CFF6F7A7DFF707B7DFF707B7DFF707B7EFFA2A8A9FFF2F2F2FFF3F3
+ F3FFF4F4F4FFF4F4F4FFF5F5F5FFF6F6F6FFF6F6F6FFF7F7F7FFF8F8F8FFF8F8
+ F8FFF8F8F8FFF8F8F8FFF8F8F8FFF7F7F7FFF7F7F7FFF6F6F6FFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00737373FFFBFB
+ FBFFE3E3E3FFE4E4E4FFE5E5E5FFE5E5E5FFE6E6E6FFE7E7E7FFE7E7E7FFE8E8
+ E8FFE9E9E9FF808889FF70C8D1FF7ED4E6FF7ED5E6FF7ED5E6FF7ED5E6FF7ED5
+ E6FF7ED5E6FF7ED5E6FF7ED5E6FF7ED5E6FF6AC8D2FF566F6EFFF2F2F2FFF3F3
+ F3FFF4F4F4FFF5F5F5FFF5F5F5FFF6F6F6FFF7F7F7FFF7F7F7FFF8F8F8FFF9F9
+ F9FFF9F9F9FFF9F9F9FFF8F8F8FFF7F7F7FFF7F7F7FFF6F6F6FFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00707070FFFAFA
+ FAFFE3E3E3FFE4E4E4FFE5E5E5FFE5E5E5FFE6E6E6FFE7E7E7FFE7E7E7FFE8E8
+ E8FFE9E9E9FF808889FF6EC6CFFF7BCDE3FF7BCDE3FF7BCDE3FF7CCEE4FF7CCE
+ E4FF7CCEE4FF7DCFE5FF7DCFE5FF7DCFE5FF67C3CFFF546D6CFFF2F2F2FFF3F3
+ F3FFF4F4F4FFF5F5F5FFF5F5F5FFF6F6F6FFF7F7F7FFF7F7F7FFF8F8F8FFF9F9
+ F9FFF9F9F9FFF9F9F9FFF8F8F8FFF8F8F8FFF7F7F7FFF6F6F6FFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006E6E6EFFFAFA
+ FAFFE3E3E3FFE4E4E4FFE5E5E5FFE5E5E5FFE6E6E6FFE7E7E7FFE7E7E7FFE8E8
+ E8FFE9E9E9FF808889FF6FC6D0FF7BCDE3FF7BCDE3FF7BCDE3FF7CCEE4FF7CCE
+ E4FF7CCEE4FF7DCFE5FF7DCFE5FF7DCFE5FF66C2CEFF546D6CFFF2F2F2FFF3F3
+ F3FFF4F4F4FFF4F4F4FFF5F5F5FFF6F6F6FFF6F6F6FFF7F7F7FFF8F8F8FFF8F8
+ F8FFF8F8F8FFF8F8F8FFF8F8F8FFF7F7F7FFF7F7F7FFF6F6F6FFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006B6B6BFFFAFA
+ FAFFE3E3E3FFE4E4E4FFE4E4E4FFE5E5E5FFE6E6E6FFE7E7E7FFE7E7E7FFE8E8
+ E8FFE9E9E9FF81898AFF3D7782FF407C88FF407C88FF417D89FF417D89FF417D
+ 89FF417D89FF417D8AFF417D8AFF417D8AFF3C7D85FF4D6262FFF2F2F2FFF3F3
+ F3FFF4F4F4FFF4F4F4FFF5F5F5FFF6F6F6FFF6F6F6FFF7F7F7FFF7F7F7FFF8F8
+ F8FFF8F8F8FFF8F8F8FFF7F7F7FFF7F7F7FFF6F6F6FFF6F6F6FFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00696969FFFAFA
+ FAFFE3E3E3FFE4E4E4FFE4E4E4FFE5E5E5FFE6E6E6FFE6E6E6FFE7E7E7FFE8E8
+ E8FFE9E9E9FFDEDEDEFFBEBEBEFFBFBFBFFFBFBFBFFFC0C0C0FFC0C0C0FFC0C0
+ C0FFC1C1C1FFC2C2C2FFC2C2C2FFC3C3C3FFC4C4C4FFD9D9D9FFF2F2F2FFF3F3
+ F3FFF3F3F3FFF4F4F4FFF5F5F5FFF5F5F5FFF6F6F6FFF6F6F6FFF7F7F7FFF7F7
+ F7FFF7F7F7FFF7F7F7FFF7F7F7FFF6F6F6FFF6F6F6FFF5F5F5FFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00676767FFFAFA
+ FAFFE3E3E3FFE4E4E4FFE4E4E4FFE5E5E5FFE6E6E6FFE6E6E6FFE7E7E7FFE8E8
+ E8FFE8E8E8FFE9E9E9FFEAEAEAFFEAEAEAFFEBEBEBFFECECECFFECECECFFEDED
+ EDFFEEEEEEFFEEEEEEFFEFEFEFFFF0F0F0FFF0F0F0FFF1F1F1FFF2F2F2FFF2F2
+ F2FFF3F3F3FFF4F4F4FFF4F4F4FFF5F5F5FFF5F5F5FFF6F6F6FFF6F6F6FFF6F6
+ F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF5F5F5FFF5F5F5FFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00646464FFF9F9
+ F9FFE3E3E3FFE3E3E3FFE4E4E4FFE5E5E5FFE5E5E5FFE6E6E6FFE7E7E7FFE8E8
+ E8FFE8E8E8FFE9E9E9FFEAEAEAFFEAEAEAFFEBEBEBFFECECECFFECECECFFEDED
+ EDFFEEEEEEFFEEEEEEFFEFEFEFFFF0F0F0FFF0F0F0FFF1F1F1FFF1F1F1FFF2F2
+ F2FFF3F3F3FFF3F3F3FFF4F4F4FFF4F4F4FFF5F5F5FFF5F5F5FFF5F5F5FFF5F5
+ F5FFF5F5F5FFF5F5F5FFF5F5F5FFF5F5F5FFF5F5F5FFF4F4F4FFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00626262FFF9F9
+ F9FFE3E3E3FFE3E3E3FFE4E4E4FFE5E5E5FFE5E5E5FFE6E6E6FFE7E7E7FFE7E7
+ E7FFE8E8E8FFE9E9E9FFE9E9E9FFEAEAEAFFEBEBEBFFEBEBEBFFECECECFFEDED
+ EDFFEDEDEDFFEEEEEEFFEFEFEFFFEFEFEFFFF0F0F0FFF0F0F0FFF1F1F1FFF2F2
+ F2FFF2F2F2FFF3F3F3FFF3F3F3FFF4F4F4FFF4F4F4FFF4F4F4FFF5F5F5FFF5F5
+ F5FFF5F5F5FFF5F5F5FFF5F5F5FFF4F4F4FFF4F4F4FFF4F4F4FFF8F8F8FF4C4C
+ 4CFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00646464F6F3F3
+ F3FFF9F9F9FFF9F9F9FFF9F9F9FFF9F9F9FFF9F9F9FFF9F9F9FFF9F9F9FFF9F9
+ F9FFF9F9F9FFF9F9F9FFF9F9F9FFF9F9F9FFF9F9F9FFF9F9F9FFF9F9F9FFF9F9
+ F9FFF9F9F9FFF9F9F9FFF8F8F8FFF8F8F8FFF8F8F8FFF8F8F8FFF8F8F8FFF8F8
+ F8FFF8F8F8FFF8F8F8FFF8F8F8FFF8F8F8FFF8F8F8FFF8F8F8FFF8F8F8FFF8F8
+ F8FFF8F8F8FFF8F8F8FFF8F8F8FFF8F8F8FFF8F8F8FFF8F8F8FFF4F4F4FF5050
+ 50F6FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006262626B6060
+ 60F65D5D5DFF5D5D5DFF5D5D5DFF5D5D5DFF5D5D5DFF5C5C5CFF5C5C5CFF5B5B
+ 5BFF5B5B5BFF5A5A5AFF595959FF595959FF585858FF575757FF565656FF5555
+ 55FF545454FF535353FF525252FF515151FF4F4F4FFF4E4E4EFF4D4D4DFF4C4C
+ 4CFF4C4C4CFF4C4C4CFF4C4C4CFF4C4C4CFF4C4C4CFF4C4C4CFF4C4C4CFF4C4C
+ 4CFF4C4C4CFF4C4C4CFF4C4C4CFF4C4C4CFF4C4C4CFF4C4C4CFF505050F65353
+ 536BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00000000010000000A000000110000001900000021000000280000
+ 00300000003800000040000000470000004E000000560000005D000000640000
+ 006B00000071000000770000007B0000007C0000007B00000077000000720000
+ 006B000000650000005E000000560000004F0000004800000040000000380000
+ 003100000029000000210000001A0000001100000006FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF0000000001000000060000000F000000190000
+ 0020000000260000002C00000033000000380000003D00000043000000470000
+ 004B0000004E00000051000000520000005200000052000000510000004E0000
+ 004B00000047000000430000003E00000038000000330000002D000000270000
+ 0020000000160000000B00000003FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000
+ 000100000003000000060000000B0000001000000014000000180000001C0000
+ 001F000000230000002600000028000000280000002700000024000000220000
+ 001E0000001B00000017000000130000000D000000090000000500000002FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006262626B6B6B
+ 6BF6616161FF5F5F5FFF5F5F5FFF5D5D5DFF5A5A5AFF595959FF565656FF5454
+ 54FF515151FF4E4E4EFF4B4B4BFF484848FF454545FF434343FF404040FF3D3D
+ 3DFF3A3A3AFF373737FF343434FF313131FF2E2E2EFF2A2A2AFF272727FF2424
+ 24FF212121FF1E1E1EFF1B1B1BFF161616FF131313FF101010FF0D0D0DFF0A0A
+ 0AFF080808FF030303FF000000FF000000FF000000FF000000FF090909F60000
+ 006BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006E6E6EF6FFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0909
+ 09F6FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00676767FFFFFF
+ FFFFCECECEFFD5D5D5FFD5D5D5FFD6D6D6FFD7D7D7FFD7D7D7FFD9D9D9FFD8D8
+ D8FFDADADAFFDADADAFFDADADAFFDBDBDBFFDBDBDBFFDDDDDDFFDDDDDDFFDCDC
+ DCFFDEDEDEFFDEDEDEFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFE1E1E1FFE1E1
+ E1FFE1E1E1FFE1E1E1FFE1E1E1FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2
+ E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE0E0E0FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00696969FFFFFF
+ FFFFDBDBDBFFEAEAEAFFF1F1F1FFF3F3F3FFF3F3F3FFF5F5F5FFF5F5F5FFF7F7
+ F7FFF6F6F6FFF6F6F6FFF7F7F7FFF7F7F7FFF8F8F8FFF8F8F8FFFAFAFAFFFAFA
+ FAFFF9F9F9FFFBFBFBFFFAFAFAFFFAFAFAFFFCFCFCFFFCFCFCFFFBFBFBFFFDFD
+ FDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFCFCFCFFFEFEFEFFFEFEFEFFFEFE
+ FEFFFEFEFEFFFEFEFEFFFEFEFEFFFAFAFAFFF4F4F4FFE6E6E6FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006C6C6CFFFFFF
+ FFFFDFDFDFFF7C7C7CFF6B6B6BFF7D7D7DFF7F7F7FFF616161FF6F6F6FFF8282
+ 82FF626262FF6F6F6FFF848484FF626262FF707070FF858585FF636363FF7171
+ 71FF848484FF636363FF717171FF848484FF646464FF727272FF858585FF6565
+ 65FF737373FF868686FF666666FF737373FF868686FF666666FF727272FF8585
+ 85FF666666FF727272FF858585FF606060FFAFAFAFFFEAEAEAFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00707070FFFFFF
+ FFFFE5E5E5FFA2A2A2FFA7A7A7FFBBBBBBFFBDBDBDFF9B9B9BFFAAAAAAFFC2C2
+ C2FF9C9C9CFFADADADFFC3C3C3FF9E9E9EFFAEAEAEFFC4C4C4FF9E9E9EFFADAD
+ ADFFC6C6C6FF9F9F9FFFAFAFAFFFC7C7C7FFA0A0A0FFAFAFAFFFC8C8C8FFA1A1
+ A1FFB1B1B1FFC9C9C9FFA2A2A2FFB2B2B2FFC9C9C9FFA2A2A2FFB2B2B2FFC9C9
+ C9FFA2A2A2FFB2B2B2FFC9C9C9FF9A9A9AFFCFCFCFFFEEEEEEFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00707070FFFFFF
+ FFFFE3E3E3FF9E9E9EFFA1A1A1FFB4B4B4FFB8B8B8FF949494FFA5A5A5FFBCBC
+ BCFF979797FFA6A6A6FFBEBEBEFF979797FFA7A7A7FFBEBEBEFF979797FFA8A8
+ A8FFBFBFBFFF9A9A9AFFA9A9A9FFBFBFBFFF9A9A9AFFAAAAAAFFC0C0C0FF9B9B
+ 9BFFABABABFFC2C2C2FF9B9B9BFFABABABFFC2C2C2FF9B9B9BFFABABABFFC1C1
+ C1FF9B9B9BFFABABABFFC1C1C1FF939393FFCDCDCDFFEFEFEFFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006E6E6EFFFFFF
+ FFFFE5E5E5FF9E9E9EFFA1A1A1FFB4B4B4FFB7B7B7FF959595FFA5A5A5FFBDBD
+ BDFF969696FFA7A7A7FFBEBEBEFF979797FFA7A7A7FFBFBFBFFF989898FFA9A9
+ A9FFC0C0C0FF999999FFAAAAAAFFC1C1C1FF9C9C9CFFABABABFFC2C2C2FF9B9B
+ 9BFFABABABFFC1C1C1FF9B9B9BFFABABABFFC1C1C1FF9B9B9BFFACACACFFC3C3
+ C3FF9B9B9BFFACACACFFC3C3C3FF939393FFCFCFCFFFEEEEEEFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006D6D6DFFFFFF
+ FFFFE6E6E6FFA3A3A3FFA6A6A6FFBCBCBCFFBEBEBEFF9C9C9CFFACACACFFC2C2
+ C2FF9D9D9DFFACACACFFC3C3C3FF9C9C9CFFAEAEAEFFC4C4C4FF9F9F9FFFAEAE
+ AEFFC6C6C6FFA0A0A0FFAFAFAFFFC7C7C7FFA0A0A0FFB0B0B0FFC7C7C7FFA0A0
+ A0FFB0B0B0FFC8C8C8FFA0A0A0FFB1B1B1FFC8C8C8FF9F9F9FFFB1B1B1FFC8C8
+ C8FF9F9F9FFFB0B0B0FFC7C7C7FF969696FFD2D2D2FFF0F0F0FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00686868FFFFFF
+ FFFFE7E7E7FF878787FF787878FF8B8B8BFF8E8E8EFF6E6E6EFF7C7C7CFF9292
+ 92FF6D6D6DFF7E7E7EFF919191FF6F6F6FFF7D7D7DFF929292FF707070FF8080
+ 80FF949494FF727272FF808080FF979797FF747474FF838383FF969696FF7373
+ 73FF838383FF989898FF767676FF848484FF999999FF777777FF858585FF9A9A
+ 9AFF777777FF878787FF9C9C9CFF727272FFC2C2C2FFF0F0F0FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00656565FFFFFF
+ FFFFE7E7E7FFA4A4A4FFA6A6A6FFBDBDBDFFBFBFBFFF989898FFCFCFCFFFFFFF
+ FFFFD0D0D0FFE4E4E4FFFFFFFFFFD1D1D1FFE7E7E7FFFFFFFFFFD3D3D3FFE7E7
+ E7FFFFFFFFFFD4D4D4FFE8E8E8FFFFFFFFFFD4D4D4FFE9E9E9FFFFFFFFFFD4D4
+ D4FFEBEBEBFFFFFFFFFFD5D5D5FFEBEBEBFFFFFFFFFFD6D6D6FFEBEBEBFFFFFF
+ FFFFD6D6D6FFEBEBEBFFFFFFFFFFD2D2D2FFE1E1E1FFF0F0F0FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00626262FFFFFF
+ FFFFE5E5E5FFA1A1A1FFA0A0A0FFB6B6B6FFBABABAFF8F8F8FFFC4C4C4FFF3F3
+ F3FFBFBFBFFFD5D5D5FFF1F1F1FFC1C1C1FFD6D6D6FFF3F3F3FFC2C2C2FFD8D8
+ D8FFF4F4F4FFC4C4C4FFD7D7D7FFF7F7F7FFC4C4C4FFD9D9D9FFF8F8F8FFC5C5
+ C5FFDADADAFFF9F9F9FFC6C6C6FFDBDBDBFFF8F8F8FFC7C7C7FFDCDCDCFFFAFA
+ FAFFC7C7C7FFDCDCDCFFFAFAFAFFC7C7C7FFDADADAFFEEEEEEFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005F5F5FFFFFFF
+ FFFFE7E7E7FFA0A0A0FFA1A1A1FFB6B6B6FFBABABAFF919191FFC4C4C4FFF4F4
+ F4FFBFBFBFFFD5D5D5FFF2F2F2FFC1C1C1FFD7D7D7FFF3F3F3FFC3C3C3FFD8D8
+ D8FFF5F5F5FFC4C4C4FFD9D9D9FFF6F6F6FFC5C5C5FFDADADAFFF7F7F7FFC6C6
+ C6FFDBDBDBFFF8F8F8FFC7C7C7FFDCDCDCFFFAFAFAFFC7C7C7FFDCDCDCFFF9F9
+ F9FFC7C7C7FFDCDCDCFFF9F9F9FFC7C7C7FFDCDCDCFFF0F0F0FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005A5A5AFFFFFF
+ FFFFE8E8E8FFA4A4A4FFA5A5A5FFBCBCBCFFBEBEBEFF959595FFCACACAFFF9F9
+ F9FFC5C5C5FFDADADAFFF8F8F8FFC8C8C8FFDDDDDDFFFAFAFAFFC9C9C9FFDDDD
+ DDFFFBFBFBFFCACACAFFDEDEDEFFFDFDFDFFCACACAFFE1E1E1FFFEFEFEFFCBCB
+ CBFFE2E2E2FFFFFFFFFFCCCCCCFFE3E3E3FFFFFFFFFFCECECEFFE3E3E3FFFFFF
+ FFFFCECECEFFE3E3E3FFFFFFFFFFCCCCCCFFE0E0E0FFF2F2F2FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00575757FFFFFF
+ FFFFE8E8E8FF929292FF898989FF9F9F9FFFA2A2A2FF7B7B7BFFA9A9A9FFD5D5
+ D5FFA3A3A3FFB8B8B8FFD0D0D0FFA6A6A6FFBABABAFFD2D2D2FFA8A8A8FFB9B9
+ B9FFD5D5D5FFA7A7A7FFBCBCBCFFD6D6D6FFAAAAAAFFBDBDBDFFD8D8D8FFABAB
+ ABFFBCBCBCFFD9D9D9FFACACACFFBDBDBDFFDBDBDBFFABABABFFBEBEBEFFDBDB
+ DBFFABABABFFBEBEBEFFDBDBDBFFA9A9A9FFD2D2D2FFF2F2F2FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00555555FFFFFF
+ FFFFE8E8E8FF9B9B9BFF999999FFACACACFFB0B0B0FF888888FFB9B9B9FFE7E7
+ E7FFB7B7B7FFC9C9C9FFE5E5E5FFB7B7B7FFCCCCCCFFE7E7E7FFBABABAFFCCCC
+ CCFFE8E8E8FFBABABAFFCDCDCDFFEBEBEBFFBBBBBBFFD0D0D0FFEBEBEBFFBCBC
+ BCFFD1D1D1FFECECECFFBDBDBDFFD1D1D1FFEDEDEDFFBEBEBEFFD3D3D3FFEFEF
+ EFFFBEBEBEFFD3D3D3FFEFEFEFFFBCBCBCFFDBDBDBFFF3F3F3FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00505050FFFFFF
+ FFFFE9E9E9FFA3A3A3FFA4A4A4FFBBBBBBFFBDBDBDFF939393FFC9C9C9FFF8F8
+ F8FFC4C4C4FFDADADAFFF6F6F6FFC6C6C6FFDBDBDBFFF8F8F8FFC7C7C7FFDCDC
+ DCFFFBFBFBFFC8C8C8FFDEDEDEFFFBFBFBFFCACACAFFDFDFDFFFFEFEFEFFCBCB
+ CBFFE1E1E1FFFEFEFEFFCCCCCCFFE2E2E2FFFFFFFFFFCDCDCDFFE2E2E2FFFFFF
+ FFFFCDCDCDFFE2E2E2FFFFFFFFFFCCCCCCFFE0E0E0FFF4F4F4FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004D4D4DFFFFFF
+ FFFFE9E9E9FFA3A3A3FFA2A2A2FFB8B8B8FFBABABAFF909090FFC6C6C6FFF7F7
+ F7FFC1C1C1FFD7D7D7FFF4F4F4FFC3C3C3FFD7D7D7FFF5F5F5FFC4C4C4FFDADA
+ DAFFF7F7F7FFC6C6C6FFDADADAFFFAFAFAFFC7C7C7FFDDDDDDFFFAFAFAFFC9C9
+ C9FFDDDDDDFFFDFDFDFFCACACAFFDFDFDFFFFEFEFEFFCBCBCBFFE0E0E0FFFEFE
+ FEFFCBCBCBFFE0E0E0FFFEFEFEFFCBCBCBFFE0E0E0FFF3F3F3FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00494949FFFFFF
+ FFFFE9E9E9FFA4A4A4FFA5A5A5FFBBBBBBFFBDBDBDFF949494FFC9C9C9FFF9F9
+ F9FFC5C5C5FFDADADAFFF7F7F7FFC6C6C6FFDADADAFFFAFAFAFFC6C6C6FFDDDD
+ DDFFFCFCFCFFC9C9C9FFDFDFDFFFFCFCFCFFCBCBCBFFE0E0E0FFFFFFFFFFCCCC
+ CCFFE2E2E2FFFFFFFFFFCECECEFFE3E3E3FFFFFFFFFFCECECEFFE4E4E4FFFFFF
+ FFFFCDCDCDFFE4E4E4FFFFFFFFFFCDCDCDFFE1E1E1FFF5F5F5FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00464646FFFFFF
+ FFFFEAEAEAFF9B9B9BFF999999FFADADADFFAFAFAFFF898989FFBABABAFFE8E8
+ E8FFB8B8B8FFCACACAFFE6E6E6FFBABABAFFCBCBCBFFE8E8E8FFBABABAFFCDCD
+ CDFFEAEAEAFFBBBBBBFFCFCFCFFFEDEDEDFFBBBBBBFFD2D2D2FFEDEDEDFFBEBE
+ BEFFD2D2D2FFF0F0F0FFBFBFBFFFD5D5D5FFF1F1F1FFBEBEBEFFD6D6D6FFF2F2
+ F2FFBFBFBFFFD6D6D6FFF2F2F2FFBCBCBCFFDEDEDEFFF7F7F7FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00434343FFFFFF
+ FFFFECECECFF939393FF8B8B8BFF9F9F9FFFA1A1A1FF7C7C7CFFACACACFFD4D4
+ D4FFA6A6A6FFBABABAFFD2D2D2FFA8A8A8FFBBBBBBFFD5D5D5FFA9A9A9FFBDBD
+ BDFFD7D7D7FFABABABFFBCBCBCFFD9D9D9FFABABABFFBEBEBEFFDADADAFFACAC
+ ACFFC1C1C1FFDBDBDBFFADADADFFC1C1C1FFDDDDDDFFAEAEAEFFC3C3C3FFDDDD
+ DDFFAFAFAFFFC4C4C4FFDDDDDDFFACACACFFD6D6D6FFF7F7F7FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003E3E3EFFFFFF
+ FFFFEBEBEBFFA5A5A5FFA7A7A7FFBCBCBCFFBEBEBEFF969696FFCCCCCCFFFDFD
+ FDFFC7C7C7FFDEDEDEFFFBFBFBFFCACACAFFDEDEDEFFFDFDFDFFCACACAFFE0E0
+ E0FFFEFEFEFFCCCCCCFFE3E3E3FFFFFFFFFFCFCFCFFFE5E5E5FFFFFFFFFFD1D1
+ D1FFE5E5E5FFFFFFFFFFD2D2D2FFE8E8E8FFFFFFFFFFD2D2D2FFE9E9E9FFFFFF
+ FFFFD2D2D2FFE9E9E9FFFFFFFFFFD1D1D1FFE6E6E6FFF8F8F8FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003C3C3CFFFFFF
+ FFFFEAEAEAFFA2A2A2FFA3A3A3FFB8B8B8FFBCBCBCFF919191FFC7C7C7FFF7F7
+ F7FFC1C1C1FFD8D8D8FFF5F5F5FFC4C4C4FFD9D9D9FFF8F8F8FFC4C4C4FFDBDB
+ DBFFFAFAFAFFC6C6C6FFDDDDDDFFFCFCFCFFC9C9C9FFDFDFDFFFFEFEFEFFCBCB
+ CBFFE1E1E1FFFEFEFEFFCBCBCBFFE3E3E3FFFFFFFFFFCCCCCCFFE4E4E4FFFFFF
+ FFFFCDCDCDFFE4E4E4FFFFFFFFFFCCCCCCFFE3E3E3FFF9F9F9FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00393939FFFFFF
+ FFFFEAEAEAFFA2A2A2FFA3A3A3FFB8B8B8FFBCBCBCFF919191FFC7C7C7FFF7F7
+ F7FFC3C3C3FFD8D8D8FFF5F5F5FFC4C4C4FFD9D9D9FFF8F8F8FFC6C6C6FFDADA
+ DAFFF9F9F9FFC8C8C8FFDDDDDDFFFCFCFCFFCACACAFFDFDFDFFFFEFEFEFFCBCB
+ CBFFE1E1E1FFFFFFFFFFCBCBCBFFE3E3E3FFFFFFFFFFCDCDCDFFE4E4E4FFFFFF
+ FFFFCECECEFFE5E5E5FFFFFFFFFFCDCDCDFFE4E4E4FFF8F8F8FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00343434FFFFFF
+ FFFFECECECFFA6A6A6FFA9A9A9FFBFBFBFFFC2C2C2FF9A9A9AFFCECECEFFFFFF
+ FFFFCCCCCCFFE0E0E0FFFEFEFEFFCDCDCDFFE1E1E1FFFFFFFFFFCFCFCFFFE3E3
+ E3FFFFFFFFFFD1D1D1FFE5E5E5FFFFFFFFFFD3D3D3FFE9E9E9FFFFFFFFFFD3D3
+ D3FFEBEBEBFFFFFFFFFFD5D5D5FFECECECFFFFFFFFFFD8D8D8FFEEEEEEFFFFFF
+ FFFFD9D9D9FFEEEEEEFFFFFFFFFFD6D6D6FFE8E8E8FFFBFBFBFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00313131FFFFFF
+ FFFFECECECFF888888FF7C7C7CFF8E8E8EFF909090FF6E6E6EFF989898FFC0C0
+ C0FF939393FFA5A5A5FFBDBDBDFF959595FFA6A6A6FFBFBFBFFF959595FFA7A7
+ A7FFC1C1C1FF979797FFAAAAAAFFC2C2C2FF999999FFACACACFFC4C4C4FF9A9A
+ 9AFFACACACFFC6C6C6FF9A9A9AFFAEAEAEFFC6C6C6FF9C9C9CFFAFAFAFFFC9C9
+ C9FF9D9D9DFFAFAFAFFFC9C9C9FF9A9A9AFFD1D1D1FFFBFBFBFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002E2E2EFFFFFF
+ FFFFECECECFFA6A6A6FFA9A9A9FFBFBFBFFFC2C2C2FF9A9A9AFFCECECEFFFFFF
+ FFFFCCCCCCFFE0E0E0FFFEFEFEFFCCCCCCFFE3E3E3FFFFFFFFFFCFCFCFFFE5E5
+ E5FFFFFFFFFFD0D0D0FFE7E7E7FFFFFFFFFFD3D3D3FFE9E9E9FFFFFFFFFFD3D3
+ D3FFEBEBEBFFFFFFFFFFD5D5D5FFEDEDEDFFFFFFFFFFD7D7D7FFEEEEEEFFFFFF
+ FFFFDADADAFFEFEFEFFFFFFFFFFFD5D5D5FFE9E9E9FFFBFBFBFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002A2A2AFFFFFF
+ FFFFEAEAEAFFA2A2A2FFA3A3A3FFB8B8B8FFBCBCBCFF939393FFC7C7C7FFF7F7
+ F7FFC3C3C3FFD8D8D8FFF5F5F5FFC4C4C4FFDADADAFFF7F7F7FFC6C6C6FFDCDC
+ DCFFF9F9F9FFC8C8C8FFDEDEDEFFFBFBFBFFCACACAFFE0E0E0FFFEFEFEFFCBCB
+ CBFFE2E2E2FFFFFFFFFFCCCCCCFFE4E4E4FFFFFFFFFFCECECEFFE5E5E5FFFFFF
+ FFFFD1D1D1FFE6E6E6FFFFFFFFFFD0D0D0FFE5E5E5FFFAFAFAFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00272727FFFFFF
+ FFFFEAEAEAFFA2A2A2FFA3A3A3FFB8B8B8FFBCBCBCFF939393FFC7C7C7FFF7F7
+ F7FFC3C3C3FFD8D8D8FFF5F5F5FFC4C4C4FFD9D9D9FFF7F7F7FFC6C6C6FFDCDC
+ DCFFF9F9F9FFC8C8C8FFDEDEDEFFFBFBFBFFCACACAFFE0E0E0FFFEFEFEFFCBCB
+ CBFFE2E2E2FFFFFFFFFFCCCCCCFFE4E4E4FFFFFFFFFFCECECEFFE5E5E5FFFFFF
+ FFFFCFCFCFFFE5E5E5FFFFFFFFFFCECECEFFE5E5E5FFFAFAFAFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00222222FFFFFF
+ FFFFEAEAEAFFA2A2A2FFA3A3A3FFB8B8B8FFBCBCBCFF939393FFC7C7C7FFF7F7
+ F7FFC3C3C3FFD8D8D8FFF5F5F5FFC4C4C4FFD9D9D9FFF8F8F8FFC6C6C6FFDADA
+ DAFFF9F9F9FFC8C8C8FFDEDEDEFFFBFBFBFFCACACAFFE0E0E0FFFEFEFEFFCBCB
+ CBFFE2E2E2FFFFFFFFFFCCCCCCFFE4E4E4FFFFFFFFFFCFCFCFFFE5E5E5FFFFFF
+ FFFFD0D0D0FFE5E5E5FFFFFFFFFFCECECEFFE4E4E4FFFAFAFAFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001F1F1FFFFFFF
+ FFFFECECECFFA6A6A6FFA9A9A9FFBFBFBFFFC2C2C2FF989898FFCFCFCFFFFFFF
+ FFFFCCCCCCFFE0E0E0FFFEFEFEFFCDCDCDFFE1E1E1FFFFFFFFFFCFCFCFFFE3E3
+ E3FFFFFFFFFFD1D1D1FFE5E5E5FFFFFFFFFFD3D3D3FFE7E7E7FFFFFFFFFFD3D3
+ D3FFEAEAEAFFFFFFFFFFD5D5D5FFECECECFFFFFFFFFFD6D6D6FFEEEEEEFFFFFF
+ FFFFD8D8D8FFEEEEEEFFFFFFFFFFD4D4D4FFE8E8E8FFF9F9F9FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001C1C1CFFFFFF
+ FFFFE8E8E8FF7F7F7FFF6E6E6EFF818181FF828282FF606060FF909090FFBBBB
+ BBFF8E8E8EFFA1A1A1FFB9B9B9FF919191FFA2A2A2FFBCBCBCFF919191FFA2A2
+ A2FFBEBEBEFF919191FFA4A4A4FFBEBEBEFF949494FFA7A7A7FFC0C0C0FF9696
+ 96FFA9A9A9FFC2C2C2FF959595FFA9A9A9FFC3C3C3FF979797FFAAAAAAFFC3C3
+ C3FF979797FFAAAAAAFFC3C3C3FF959595FFCCCCCCFFF8F8F8FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00181818FFFFFF
+ FFFFE3E3E3FFF0F0F0FFF7F7F7FFF9F9F9FFF9F9F9FFFAFAFAFFF7F7F7FFF6F6
+ F6FFF4F4F4FFF5F5F5FFF7F7F7FFF6F6F6FFF7F7F7FFF9F9F9FFF8F8F8FFFAFA
+ FAFFFBFBFBFFFAFAFAFFFCFCFCFFFDFDFDFFFDFDFDFFFEFEFEFFFDFDFDFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFDFDFFF5F5F5FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00151515FFFFFF
+ FFFFDADADAFFDDDDDDFFDFDFDFFFE0E0E0FFE0E0E0FFE1E1E1FFE3E3E3FFE2E2
+ E2FFE4E4E4FFE5E5E5FFE5E5E5FFE6E6E6FFE8E8E8FFE7E7E7FFE9E9E9FFEAEA
+ EAFFEAEAEAFFEBEBEBFFEDEDEDFFEDEDEDFFEEEEEEFFEEEEEEFFEFEFEFFFF1F1
+ F1FFF0F0F0FFF2F2F2FFF2F2F2FFF3F3F3FFF3F3F3FFF3F3F3FFF5F5F5FFF5F5
+ F5FFF5F5F5FFF5F5F5FFF5F5F5FFF3F3F3FFF3F3F3FFF3F3F3FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00262626F6FFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0909
+ 09F6FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001414146B1F1F
+ 1FF6232323FF383838FF4D4D4DFF4D4D4DFF4D4D4DFF4C4C4CFF4C4C4CFF4A4A
+ 4AFF4A4A4AFF494949FF474747FF474747FF464646FF444444FF434343FF4141
+ 41FF404040FF3E3E3EFF3D3D3DFF3C3C3CFF393939FF373737FF363636FF3434
+ 34FF343434FF343434FF343434FF343434FF343434FF343434FF343434FF3434
+ 34FF343434FF343434FF343434FF343434FF1F1F1FFF0A0A0AFF090909F60000
+ 006BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00000000010000000A000000110000001900000021000000280000
+ 00300000003800000040000000470000004E000000560000005D000000640000
+ 006B00000071000000770000007B0000007C0000007B00000077000000720000
+ 006B000000650000005E000000560000004F0000004800000040000000380000
+ 003100000029000000210000001A0000001100000006FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF0000000001000000060000000F000000190000
+ 0020000000260000002C00000033000000380000003D00000043000000470000
+ 004B0000004E00000051000000520000005200000052000000510000004E0000
+ 004B00000047000000430000003E00000038000000330000002D000000270000
+ 0020000000160000000B00000003FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000
+ 000100000003000000060000000B0000001000000014000000180000001C0000
+ 001F000000230000002600000028000000280000002700000024000000220000
+ 001E0000001B00000017000000130000000D000000090000000500000002FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006262626B6B6B
+ 6BF6616161FF5F5F5FFF5F5F5FFF5D5D5DFF5A5A5AFF595959FF565656FF5454
+ 54FF515151FF4E4E4EFF4B4B4BFF484848FF454545FF434343FF404040FF3D3D
+ 3DFF3A3A3AFF373737FF343434FF313131FF2E2E2EFF2A2A2AFF272727FF2424
+ 24FF212121FF1E1E1EFF1B1B1BFF161616FF131313FF101010FF0D0D0DFF0A0A
+ 0AFF080808FF030303FF000000FF000000FF000000FF000000FF090909F60000
+ 006BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006E6E6EF6FFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0909
+ 09F6FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00676767FFFFFF
+ FFFFCECECEFFD5D5D5FFD5D5D5FFD6D6D6FFD7D7D7FFD7D7D7FFD9D9D9FFD8D8
+ D8FFDADADAFFDADADAFFDADADAFFDBDBDBFFDBDBDBFFDDDDDDFFDDDDDDFFDCDC
+ DCFFDEDEDEFFDEDEDEFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFE1E1E1FFE1E1
+ E1FFE1E1E1FFE1E1E1FFE1E1E1FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2
+ E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE0E0E0FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00696969FFFFFF
+ FFFFDBDBDBFFEAEAEAFFF1F1F1FFF3F3F3FFF3F3F3FFF5F5F5FFF5F5F5FFF7F7
+ F7FFF6F6F6FFF6F6F6FFF7F7F7FFF7F7F7FFF8F8F8FFF8F8F8FFFAFAFAFFFAFA
+ FAFFF9F9F9FFFBFBFBFFFAFAFAFFFAFAFAFFFCFCFCFFFCFCFCFFFBFBFBFFFDFD
+ FDFFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFCFCFCFFFEFEFEFFFEFEFEFFFEFE
+ FEFFFEFEFEFFFEFEFEFFFEFEFEFFFAFAFAFFF4F4F4FFE6E6E6FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006C6C6CFFFFFF
+ FFFFDFDFDFFF7C7C7CFF6B6B6BFF7D7D7DFF7F7F7FFF616161FF6F6F6FFF8282
+ 82FF626262FF6F6F6FFF848484FF626262FF707070FF858585FF636363FF7171
+ 71FF848484FF636363FF717171FF848484FF646464FF727272FF858585FF6565
+ 65FF737373FF868686FF666666FF737373FF868686FF666666FF727272FF8585
+ 85FF666666FF727272FF858585FF606060FFAFAFAFFFEAEAEAFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00707070FFFFFF
+ FFFFE5E5E5FFA2A2A2FFA7A7A7FFBBBBBBFFBDBDBDFF9B9B9BFFAAAAAAFFC2C2
+ C2FF9C9C9CFFADADADFFC3C3C3FF9E9E9EFFAEAEAEFFC4C4C4FF9E9E9EFFADAD
+ ADFFC6C6C6FF9F9F9FFFAFAFAFFFC7C7C7FFA0A0A0FFAFAFAFFFC8C8C8FFA1A1
+ A1FFB1B1B1FFC9C9C9FFA2A2A2FFB2B2B2FFC9C9C9FFA2A2A2FFB2B2B2FFC9C9
+ C9FFA2A2A2FFB2B2B2FFC9C9C9FF9A9A9AFFCFCFCFFFEEEEEEFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00707070FFFFFF
+ FFFFE3E3E3FF9E9E9EFFA1A1A1FFB4B4B4FFB8B8B8FF949494FFA5A5A5FFBCBC
+ BCFF979797FFA6A6A6FFBEBEBEFF979797FFA7A7A7FFBEBEBEFF979797FFA8A8
+ A8FFBFBFBFFF9A9A9AFFA9A9A9FFBFBFBFFF9A9A9AFFAAAAAAFFC0C0C0FF9B9B
+ 9BFFABABABFFC2C2C2FF9B9B9BFFABABABFFC2C2C2FF9B9B9BFFABABABFFC1C1
+ C1FF9B9B9BFFABABABFFC1C1C1FF939393FFCDCDCDFFEFEFEFFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006E6E6EFFFFFF
+ FFFFE5E5E5FF9E9E9EFFA1A1A1FFB4B4B4FFB7B7B7FF959595FFA5A5A5FFBDBD
+ BDFF969696FFA7A7A7FFBEBEBEFF979797FFA7A7A7FFBFBFBFFF989898FFA9A9
+ A9FFC0C0C0FF999999FFAAAAAAFFC1C1C1FF9C9C9CFFABABABFFC2C2C2FF9B9B
+ 9BFFABABABFFC1C1C1FF9B9B9BFFABABABFFC1C1C1FF9B9B9BFFACACACFFC3C3
+ C3FF9B9B9BFFACACACFFC3C3C3FF939393FFCFCFCFFFEEEEEEFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006D6D6DFFFFFF
+ FFFFE6E6E6FFA3A3A3FFA6A6A6FFBCBCBCFFBEBEBEFF9C9C9CFFACACACFFC2C2
+ C2FF9D9D9DFFACACACFFC3C3C3FF9C9C9CFFAEAEAEFFC4C4C4FF9F9F9FFFAEAE
+ AEFFC6C6C6FFA0A0A0FFAFAFAFFFC7C7C7FFA0A0A0FFB0B0B0FFC7C7C7FFA0A0
+ A0FFB0B0B0FFC8C8C8FFA0A0A0FFB1B1B1FFC8C8C8FF9F9F9FFFB1B1B1FFC8C8
+ C8FF9F9F9FFFB0B0B0FFC7C7C7FF969696FFD2D2D2FFF0F0F0FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00686868FFFFFF
+ FFFFE7E7E7FF878787FF787878FF8B8B8BFF8E8E8EFF6E6E6EFF7C7C7CFF9292
+ 92FF6D6D6DFF7E7E7EFF919191FF6F6F6FFF7D7D7DFF929292FF707070FF8080
+ 80FF949494FF727272FF808080FF979797FF747474FF838383FF969696FF7373
+ 73FF838383FF989898FF767676FF848484FF999999FF777777FF858585FF9A9A
+ 9AFF777777FF878787FF9C9C9CFF727272FFC2C2C2FFF0F0F0FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00656565FFFFFF
+ FFFFE7E7E7FFA4A4A4FFA6A6A6FFBDBDBDFFBFBFBFFF989898FFCFCFCFFFFFFF
+ FFFFD0D0D0FFE4E4E4FFFFFFFFFFD1D1D1FFE7E7E7FFFFFFFFFFD3D3D3FFE7E7
+ E7FFFFFFFFFFD4D4D4FFE8E8E8FFFFFFFFFFD4D4D4FFE9E9E9FFFFFFFFFFD4D4
+ D4FFEBEBEBFFFFFFFFFFD5D5D5FFEBEBEBFFFFFFFFFFD6D6D6FFEBEBEBFFFFFF
+ FFFFD6D6D6FFEBEBEBFFFFFFFFFFD2D2D2FFE1E1E1FFF0F0F0FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00626262FFFFFF
+ FFFFE5E5E5FFA1A1A1FFA0A0A0FFB6B6B6FFBABABAFF8F8F8FFFC4C4C4FFF3F3
+ F3FFBFBFBFFFD5D5D5FFF1F1F1FFC1C1C1FFD6D6D6FFF3F3F3FFC2C2C2FFD8D8
+ D8FFF4F4F4FFC4C4C4FFD7D7D7FFF7F7F7FFC4C4C4FFD9D9D9FFF8F8F8FFC5C5
+ C5FFDADADAFFF9F9F9FFC6C6C6FFDBDBDBFFF8F8F8FFC7C7C7FFDCDCDCFFFAFA
+ FAFFC7C7C7FFDCDCDCFFFAFAFAFFC7C7C7FFDADADAFFEEEEEEFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005F5F5FFFFFFF
+ FFFFE7E7E7FFA0A0A0FFA1A1A1FFB6B6B6FFBABABAFF919191FFC4C4C4FFF4F4
+ F4FFBFBFBFFFD5D5D5FFF2F2F2FFC1C1C1FFD7D7D7FFF3F3F3FFC3C3C3FFD8D8
+ D8FFF5F5F5FFC4C4C4FFD9D9D9FFF6F6F6FFC5C5C5FFDADADAFFF7F7F7FFC6C6
+ C6FFDBDBDBFFF8F8F8FFC7C7C7FFDCDCDCFFFAFAFAFFC7C7C7FFDCDCDCFFF9F9
+ F9FFC7C7C7FFDCDCDCFFF9F9F9FFC7C7C7FFDCDCDCFFF0F0F0FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005A5A5AFFFFFF
+ FFFFE8E8E8FFA4A4A4FFA5A5A5FFBCBCBCFFBEBEBEFF959595FFCACACAFFF9F9
+ F9FFC5C5C5FFDADADAFFF8F8F8FFC8C8C8FFDDDDDDFFFAFAFAFFC9C9C9FFDDDD
+ DDFFFBFBFBFFCACACAFFDEDEDEFFFDFDFDFFCACACAFFE2E2E2FFFFFFFFFFD8D4
+ D1FFEFEBE8FFFFFFFFFFCFCECEFFE3E3E3FFFFFFFFFFCECECEFFE3E3E3FFFFFF
+ FFFFCECECEFFE3E3E3FFFFFFFFFFCCCCCCFFE0E0E0FFF2F2F2FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00575757FFFFFF
+ FFFFE8E8E8FF929292FF898989FF9F9F9FFFA2A2A2FF7B7B7BFFA9A9A9FFD5D5
+ D5FFA3A3A3FFB8B8B8FFD0D0D0FFA6A6A6FFBABABAFFD2D2D2FFA8A8A8FFB9B9
+ B9FFD5D5D5FFA7A7A7FFBCBCBCFFD8D8D7FFB9B4B1FFDCD2CBFFE3DDD9FF7A8B
+ 93FF748A98FFD1D1D1FFCEC2BAFFCFC9C5FFE0DEDDFFABABABFFBEBEBEFFDBDB
+ DBFFABABABFFBEBEBEFFDBDBDBFFA9A9A9FFD2D2D2FFF2F2F2FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00555555FFFFFF
+ FFFFE8E8E8FF9B9B9BFF999999FFACACACFFB0B0B0FF888888FFB9B9B9FFE7E7
+ E7FFB7B7B7FFC9C9C9FFE5E5E5FFB7B7B7FFCCCCCCFFE7E7E7FFBABABAFFCCCC
+ CCFFE8E8E8FFBABABAFFD2D0D0FFFFF8F4FFBBBAB8FF0D4B70FF10547EFF0E58
+ 8AFF0E5B8DFF125481FF004069FFA2ADB7FFFFFFFCFFC8C5C4FFD3D3D3FFEFEF
+ EFFFBEBEBEFFD3D3D3FFEFEFEFFFBCBCBCFFDBDBDBFFF3F3F3FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00505050FFFFFF
+ FFFFE9E9E9FFA3A3A3FFA4A4A4FFBBBBBBFFBDBDBDFF939393FFC9C9C9FFF8F8
+ F8FFC4C4C4FFDADADAFFF6F6F6FFC6C6C6FFDBDBDBFFF8F8F8FFC7C7C7FFDCDC
+ DCFFFBFBFBFFC8C8C8FFF3EDE9FFCFDADDFF00406CFF2B79ACFF3081B4FF2A7D
+ B4FF2779AEFF2777AAFF2371A4FF0D527EFF6F94ABFFEBE2DCFFE5E4E3FFFFFF
+ FFFFCDCDCDFFE2E2E2FFFFFFFFFFCCCCCCFFE0E0E0FFF4F4F4FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004D4D4DFFFFFF
+ FFFFE9E9E9FFA3A3A3FFA2A2A2FFB8B8B8FFBABABAFF909090FFC6C6C6FFF7F7
+ F7FFC1C1C1FFD7D7D7FFF4F4F4FFC3C3C3FFD7D7D7FFF5F5F5FFC4C4C4FFDADA
+ DAFFF7F7F7FFCFCDCBFFF9F0E9FF04436CFF2F7DAEFF2D80B5FF3888BEFF3C8C
+ C1FF3889BFFF2E7FB3FF2071A6FF1C699BFF10537CFFBDC1C3FFF1EBE8FFFEFE
+ FEFFCBCBCBFFE0E0E0FFFEFEFEFFCBCBCBFFE0E0E0FFF3F3F3FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00494949FFFFFF
+ FFFFE9E9E9FFA4A4A4FFA5A5A5FFBBBBBBFFBDBDBDFF949494FFC9C9C9FFF9F9
+ F9FFC5C5C5FFDADADAFFF7F7F7FFC6C6C6FFDADADAFFFAFAFAFFC6C6C6FFDDDD
+ DDFFFCFCFCFFDFD8D4FF6A8B9FFF135E92FF2C7FB3FF398BC0FF4898CFFF4DA0
+ D6FF4898CFFF3B8CBFFF2B7BB0FF16689BFF1F6DA0FF0F486CFFFFFFF4FFFFFF
+ FFFFF2DED0FFFFF3E7FFFFFFFFFFD9D3CFFFE3E2E1FFF5F5F5FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00464646FFFFFF
+ FFFFEAEAEAFF9B9B9BFF999999FFADADADFFAFAFAFFF898989FFBABABAFFE8E8
+ E8FFB8B8B8FFCACACAFFE6E6E6FFBABABAFFCBCBCBFFE8E8E8FFBABABAFFCDCD
+ CDFFEAEAEAFFDCD1CBFF1B5276FF2D7BACFF2D80B5FF4192C7FF53A5DCFF63B6
+ EFFF51A3DBFF4091C7FF3080B4FF1C6CA0FF236D9CFF134665FF97BDD5FF2788
+ C8FF0776B9FF1379BDFF55A0CFFFC1BDBAFFF4E7DEFFFFFBF8FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00434343FFFFFF
+ FFFFECECECFF939393FF8B8B8BFF9F9F9FFFA1A1A1FF7C7C7CFFACACACFFD4D4
+ D4FFA6A6A6FFBABABAFFD2D2D2FFA8A8A8FFBBBBBBFFD5D5D5FFA9A9A9FFBDBD
+ BDFFD7D7D7FFD1C5BDFF0A476DFF2F7AAEFF2C7CB3FF3F90C5FF4FA1D7FF5AAC
+ E3FF4D9FD7FF3F90C5FF2F7FB3FF1C699BFF156496FF0374B9FF3FA1E0FF55B1
+ EAFF53AFEBFF4FAEEAFF36A2E4FF0A7AC1FF68A1C5FFFFFFFBFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003E3E3EFFFFFF
+ FFFFEBEBEBFFA5A5A5FFA7A7A7FFBCBCBCFFBEBEBEFF969696FFCCCCCCFFFDFD
+ FDFFC7C7C7FFDEDEDEFFFBFBFBFFCACACAFFDEDEDEFFFDFDFDFFCACACAFFE0E0
+ E0FFFEFEFEFFF0E5DDFF1B5479FF2777A6FF2676ACFF3688BBFF4192C9FF4598
+ CDFF4192C7FF3686BCFF2A77A9FF125F90FF0F7DC3FF64BBEFFF55B0E9FF57B0
+ E8FF58AFE7FF4FABE5FF3BA2E4FF3BA4E8FF1C8ACFFF91BFDBFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003C3C3CFFFFFF
+ FFFFEAEAEAFFA2A2A2FFA3A3A3FFB8B8B8FFBCBCBCFF919191FFC7C7C7FFF7F7
+ F7FFC1C1C1FFD8D8D8FFF5F5F5FFC4C4C4FFD9D9D9FFF8F8F8FFC4C4C4FFDBDB
+ DBFFFAFAFAFFDED7D2FF61859CFF0F5C8BFF1E6FA4FF297AADFF3282B8FF3586
+ BBFF3282B6FF2B7AAEFF1F699AFF0570B2FF57AFE9FF55AFE8FF6AB8EAFF7BBF
+ ECFF7CC0ECFF6EBAE9FF57AFE6FF37A1E2FF35A0E6FF0A7AC0FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00393939FFFFFF
+ FFFFEAEAEAFFA2A2A2FFA3A3A3FFB8B8B8FFBCBCBCFF919191FFC7C7C7FFF7F7
+ F7FFC3C3C3FFD8D8D8FFF5F5F5FFC4C4C4FFD9D9D9FFF8F8F8FFC6C6C6FFDADA
+ DAFFF9F9F9FFDAD5D3FFFFFCF6FF074470FF2E75A9FF186A9DFF2171A5FF2574
+ A8FF2372A6FF1B689CFF0D5687FF1A83C8FF5FB6EEFF5FB3E7FF80C2EDFF9ACE
+ F0FF9DCFF0FF84C3EDFF67B5E9FF47A7E4FF1F94DFFF2594DAFFC1ECFFFF0B00
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00343434FFFFFF
+ FFFFECECECFFA6A6A6FFA9A9A9FFBFBFBFFFC2C2C2FF9A9A9AFFCECECEFFFFFF
+ FFFFCCCCCCFFE0E0E0FFFEFEFEFFCDCDCDFFE1E1E1FFFFFFFFFFCFCFCFFFE3E3
+ E3FFFFFFFFFFEEE2E3FF96ABA4FF034448FF16517EFF3378AAFF18669AFF0F5F
+ 93FF0F6093FF166597FF23709FFF3095D4FF52AFEBFF64B6E8FF87C6EEFFADD6
+ F3FFB3D9F3FF8CC7EEFF6BB7EAFF4CA9E4FF2395DFFF3AA3E4FF65BDF5FF1706
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00313131FFFFFF
+ FFFFECECECFF888888FF7C7C7CFF8E8E8EFF909090FF6E6E6EFF989898FFC0C0
+ C0FF939393FFA5A5A5FFBDBDBDFF959595FFA6A6A6FFBFBFBFFF959595FFAFAD
+ ADFFE0D4D5FF25524EFF125C54FF288A79FF004F4DFF0B466FFF24608FFF3071
+ A4FF3276A9FF296495FF0A4E78FF2F95D9FF49AAE9FF5DB1E7FF7BBEEBFF92CA
+ EFFF93CAEFFF7EC1EBFF64B4E9FF47A7E3FF1B92DEFF3CA4E6FF53B5F0FF1807
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002E2E2EFFFFFF
+ FFFFECECECFFA6A6A6FFA9A9A9FFBFBFBFFFC2C2C2FF9A9A9AFFCECECEFFFFFF
+ FFFFCCCCCCFFE0E0E0FFFEFEFEFFCCCCCCFFE3E3E3FFFFFFFFFFCFCFCFFFFDF6
+ F6FFA6BDBAFF0D5D55FF22857AFF037366FF056A5CFF055948FF196F64FF0643
+ 52FF00394EFF094948FF15674BFF1E86C9FF49AAECFF4BAAE5FF65B4E8FF73BC
+ EBFF74BCEBFF67B5E8FF52ACE5FF369FE0FF1993E0FF2F99DEFFA8E1FFFF0F02
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002A2A2AFFFFFF
+ FFFFEAEAEAFFA2A2A2FFA3A3A3FFB8B8B8FFBCBCBCFF939393FFC7C7C7FFF7F7
+ F7FFC3C3C3FFD8D8D8FFF5F5F5FFC4C4C4FFDADADAFFF7F7F7FFCFCCCCFFFFF2
+ F4FF00443FFF2B877DFF006C62FF077267FF09796EFF057062FF198172FF055D
+ 4EFF055749FF0A6052FF0E745AFF067CBEFF4AAFF5FF319FE3FF48A6E4FF55AD
+ E5FF54ADE5FF4CA9E4FF39A1E2FF1C92DEFF34A2E8FF127EC4FFFFFFFFFF0100
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00272727FFFFFF
+ FFFFEAEAEAFFA2A2A2FFA3A3A3FFB8B8B8FFBCBCBCFF939393FFC7C7C7FFF7F7
+ F7FFC3C3C3FFD8D8D8FFF5F5F5FFC4C4C4FFD9D9D9FFF7F7F7FFDCD5D6FF7291
+ 8EFF156962FF076E63FF056E63FF0A7267FF09756AFF08776CFF087C71FF087A
+ 6DFF09796EFF05796FFF00786BFF0F6152FF1B83C7FF3EACF2FF2298E2FF2E9B
+ E0FF2F9BE0FF2597DFFF1993DFFF2EA0E7FF39A8EBFF2E79AAFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00222222FFFFFF
+ FFFFEAEAEAFFA2A2A2FFA3A3A3FFB8B8B8FFBCBCBCFF939393FFC7C7C7FFF7F7
+ F7FFC3C3C3FFD8D8D8FFF5F5F5FFC4C4C4FFD9D9D9FFF8F8F8FFE9DEDFFF205A
+ 52FF2B8178FF00695CFF086459FF087167FF0A7366FF097368FF097669FF0976
+ 6BFF05766CFF007770FF255E4AFFBA5F29FF6E7478FF1284CDFF42AEF5FF3DA8
+ EDFF2EA0E7FF3AA7EAFF48B3F6FF2E99DEFF0F70ACFF7B3401FFFFEFDFFF0005
+ 0BFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001F1F1FFFFFFF
+ FFFFECECECFFA6A6A6FFA9A9A9FFBFBFBFFFC2C2C2FF989898FFCFCFCFFFFFFF
+ FFFFCCCCCCFFE0E0E0FFFEFEFEFFCDCDCDFFE1E1E1FFFFFFFFFFF5E8E9FF104F
+ 4BFF2E837BFF00655BFF07574FFF087064FF086E63FF087065FF087167FF0772
+ 67FF00736DFF365A43FFA6663EFFCB824EFFB56120FFA37B57FF0F6DABFF0E7F
+ C6FF1481C7FF107FC6FF0975BDFF4B646BFF9E612DFFB7743EFFA76B3EFF321E
+ 10FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001C1C1CFFFFFF
+ FFFFE8E8E8FF7F7F7FFF6E6E6EFF818181FF828282FF606060FF909090FFBBBB
+ BBFF8E8E8EFFA1A1A1FFB9B9B9FF919191FFA2A2A2FFBCBCBCFFB5AAABFF013F
+ 37FF2D8379FF00574CFF086157FF086B61FF086B60FF086C61FF086C62FF006F
+ 66FF006964FF95542AFFC47F51FFAF6731FFB36A2FFFC28752FF9E561DFFC7B5
+ A9FFA59E9BFFB8ABA4FF8E5931FFA6784CFFA7642FFFA4622CFFB78055FF7941
+ 1CFF5C040019FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00181818FFFFFF
+ FFFFE3E3E3FFF0F0F0FFF7F7F7FFF9F9F9FFF9F9F9FFFAFAFAFFF7F7F7FFF6F6
+ F6FFF4F4F4FFF5F5F5FFF7F7F7FFF6F6F6FFF7F7F7FFF9F9F9FFFFFFFFFF6889
+ 84FF176D64FF054A43FF046358FF08665CFF08675DFF08685EFF08685EFF006C
+ 65FF6A4825FFC8865AFFAA6731FFAD6A34FFB26C35FFBB743CFFB06325FFCAAD
+ 97FFDBE3EAFFE5F0F9FF964D14FFB5733DFFA96631FFA56431FFA0602EFFB385
+ 5EFF702600B8FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00151515FFFFFF
+ FFFFDADADAFFDDDDDDFFDFDFDFFFE0E0E0FFE0E0E0FFE1E1E1FFE3E3E3FFE2E2
+ E2FFE4E4E4FFE5E5E5FFE5E5E5FFE6E6E6FFE8E8E8FFE7E7E7FFF7F4F4FFEAE0
+ E1FF003A32FF24645DFF0B6D62FF006156FF006055FF005F55FF005F55FF0062
+ 5EFF965127FFB87A4AFFA86430FFAA6933FFB06D36FFB36D37FFB4692DFFBF7E
+ 4BFFFFFFFFFFF3EBE5FFA65616FFAC6834FFA76634FF9C6132FF9F602DFFA975
+ 49FF8A4F25E65A070015FFFFFF00FFFFFF00FFFFFF00FFFFFF00262626F6FFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFDCE4E3FF0C524DFF2A7B72FF35877DFF3A8D83FF3B8F85FF388F86FF2C84
+ 7BFFAB6B42FFAC6D3BFFA4632FFFA46633FFAC6935FFAD6C36FFAD6933FFA14E
+ 0DFFF0FFFFFFC8AA92FFA1581EFFA76834FFA56533FFA36533FF8B562AFF9D62
+ 32FFA67551F96517004DFFFFFF00FFFFFF00FFFFFF00FFFFFF001414146B1F1F
+ 1FF6232323FF383838FF4D4D4DFF4D4D4DFF4D4D4DFF4C4C4CFF4C4C4CFF4A4A
+ 4AFF4A4A4AFF494949FF474747FF474747FF464646FF444444FF444444FF4948
+ 48FF544E4EFF534A4BFF3B4645FF224644FF0E4643FF0C4742FF074642FF123E
+ 35FFAD7046FFA86837FF92592BFFA66634FFA76635FFA86734FFA96834FFA155
+ 19FFD4D3D0FFB58862FFA15D26FFA36433FFA06332FFA16433FF7B4C25FF9559
+ 29FFAF805AFF6726008CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00000000010000000A000000110000001900000021000000280000
+ 00300000003800000040000000470000004E000000560000005D000000640000
+ 006B00000071000000780000008400000090000000960000009A0000009B0000
+ 009EA25F35F5AC7247FF8E5529FFA16333FFA16332FFA26432FFA36433FF9E59
+ 21FFBCA99BFFA56B3BFF9F5F2CFF9E6231FF9C6030FF9C6232FF865127FF7245
+ 22FFB17E56FD652A037200000007FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF0000000001000000060000000F000000190000
+ 0020000000260000002C00000033000000380000003D00000043000000470000
+ 004B0000004E0000005100000052000000520000005500000058000000590000
+ 0061944F1FDBAB7E5BFF975A28FF995C2CFF9B5E2DFF9D6030FF9C6030FF9B5A
+ 27FFA9805EFF995826FF9A5F2DFF985E2FFF965B2DFF945A2AFF8B5125FF6E52
+ 3AFF9F5E32ED311A054100000008FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000
+ 000100000003000000060000000B0000001000000014000000180000001C0000
+ 001F000000230000002600000028000000280000002700000024000000220000
+ 00211B02004D99592FEDB3835EFFA37147FF9C673AFF995F31FF9A6030FF995E
+ 2DFF9A5D2EFF985D2EFF985D31FF955E2FFF996137FFA06D46FFAD825CFF9361
+ 3CF7904D1FA80000002400000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF000000000C3E150045A05827D3A36438E7AA6C44F1AE7850F8AC784FF9AD77
+ 50FAAC7750FAAA774EFBAC7650FAAC7650FAAA7149F6A15F34EF9C5621E37C42
+ 1C910000002900000007FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF000000000800000020000000321B0C00574020097B3A1D0686361A
+ 058D3318059133180591361A058E3A1C0589381908780000004B000000370000
+ 001E00000003FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00000000060000001700000028000000320000
+ 00390000003D0000003D0000003A00000034000000260000001200000003FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006262626B6B6B
+ 6BF6616161FF5F5F5FFF5F5F5FFF5D5D5DFF5A5A5AFF595959FF565656FF5454
+ 54FF515151FF4E4E4EFF4B4B4BFF484848FF454545FF434343FF404040FF3D3D
+ 3DFF3A3A3AFF373737FF343434FF313131FF2E2E2EFF2A2A2AFF272727FF2424
+ 24FF212121FF1E1E1EFF1B1B1BFF161616FF131313FF101010FF0D0D0DFF0A0A
+ 0AFF080808FF030303FF000000FF000000FF000000FF000000FF090909F60000
+ 006BFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006E6E6EF6FFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0909
+ 09F6FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00676767FFFFFF
+ FFFFCFCFCFFFD5D5D5FFD5D5D5FFD6D6D6FFD7D7D7FFD7D7D7FFD9D9D9FFD8D8
+ D8FFDADADAFFDADADAFFDADADAFFDBDBDBFFDBDBDBFFDDDDDDFFDDDDDDFFDCDC
+ DCFFDEDEDEFFDEDEDEFFDFDFDFFFDFDFDFFFDFDFDFFFDFDFDFFFE1E1E1FFE1E1
+ E1FFE1E1E1FFE1E1E1FFE1E1E1FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2
+ E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE2E2E2FFE0E0E0FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00696969FFFFFF
+ FFFFD9D9D9FFE5E5E5FFEAE9EAFFEAE9EAFFEBEAEBFFEDECEDFFEDECEDFFEEEE
+ EFFFEEEDEEFFEEEDEEFFEFEEEFFFEFEEEFFFF0F0F0FFF0F0F0FFF2F2F1FFF2F2
+ F1FFF2F2F1FFF3F3F2FFF3F3F2FFF2F2F2FFF4F4F3FFF4F4F3FFF4F4F3FFF5F5
+ F5FFF5F4F5FFF5F4F5FFF5F4F5FFF4F4F4FFF4F4F4FFF6F5F6FFF6F5F6FFF6F5
+ F6FFF6F5F6FFF6F5F6FFF5F5F5FFF3F3F3FFF0F0F0FFE5E5E5FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006C6C6CFFFFFF
+ FFFFDBDBDBFF9C999DFF9D989EFFB6B0B8FFB9B2BBFF938C97FFA69EA8FFBCB6
+ BFFF968E98FFA59FA9FFBFB7C1FF978F99FFA7A0A9FFC1BCBEFF999593FFAAAB
+ A3FFC5C7B9FF9D9E8FFFAEAFA2FFC7C8BAFF9E9F90FFB0B1A2FFC5C3BEFF9896
+ 95FFABA4ADFFC4BCC6FF9A949CFFACA3AFFFC4BCC6FF9A939CFFABA3AFFFC4BC
+ C6FF9A939CFFABA3AFFFC0BAC1FF938D93FFC1C0C1FFE8E8E8FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00707070FFFFFF
+ FFFFDFDFDFFFC6C0C7FF9AC38DFF91CF7EFF96D383FF78AA68FF86BC74FF99D6
+ 86FF78AA68FF85BC74FF99D686FF77AA68FF85BB74FF98DC7DFF7E7CADFF5851
+ B7FF6D65CFFF534DA5FF5E57B6FF6D65CFFF534DA5FF5D57B6FF675AD3FF89A9
+ 86FF83BC6FFF98D585FF76A967FF85BB73FF98D585FF76A967FF85BB73FF98D5
+ 85FF76A967FF85BB73FF90D27CFFADBEA8FFDFDCE0FFEBEBEBFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00707070FFFFFF
+ FFFFDDDDDDFFC4BDC7FF9CBE91FF97CB87FF9ECF8EFF7FA773FF8DB97FFFA1D3
+ 91FF7FA773FF8DB97FFFA1D391FF7FA773FF8DB97FFFA0DC84FF8982B1FF665F
+ B5FF7D77CDFF635EA3FF6E69B5FF7D77CDFF635EA3FF6E69B5FF7466D4FF95B0
+ 8CFF8BBB79FFA1D391FF7FA773FF8DB97FFFA1D391FF7FA773FF8DB97FFFA1D3
+ 91FF7FA773FF8DB97FFF95CF84FFAEBAABFFDFDBE0FFEBEBEBFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006E6E6EFFFFFF
+ FFFFDEDEDEFFC4BCC7FF9CBE91FF97CB87FF9ECF8EFF7FA773FF8DB97FFFA1D3
+ 91FF7FA773FF8DB97FFFA1D391FF7FA773FF8DB97FFFA0DC84FF8984B1FF665F
+ B5FF7D77CDFF635EA3FF6E69B5FF7D77CDFF635EA3FF6E69B5FF7466D4FF95B0
+ 8CFF8BBB79FFA1D391FF7FA773FF8DB97FFFA1D391FF7FA773FF8DB97FFFA1D3
+ 91FF7FA773FF8DB97FFF95CE84FFB0BCABFFDEDAE0FFEBEBEBFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006D6D6DFFFFFF
+ FFFFE0E0E0FFC6C1C8FF99C28CFF90CE7CFF95D282FF76AA67FF84BB73FF98D5
+ 84FF76A966FF84BB72FF97D584FF76A966FF84BB72FF97DB7CFF7D7CAEFF5850
+ B6FF6D65CEFF534CA4FF5D57B6FF6D65CEFF524CA4FF5D57B5FF6659D2FF8AA9
+ 85FF82BB6DFF96D483FF75A865FF83B971FF96D483FF75A865FF83B971FF96D4
+ 83FF75A865FF83B971FF8ED07AFFAEBFA7FFE1DEE2FFEDEDEDFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00686868FFFFFF
+ FFFFE1E1E1FFA19EA2FFA69FA8FFBEB4C2FFC4B9C8FF9D92A1FFB0A5B4FFCABF
+ CEFFA095A4FFB1A6B5FFCBC0CFFFA398A6FFB2A7B6FFCDC5CCFF9F9B9CFFB2B2
+ A6FFCBCCC1FFA4A698FFB5B7A8FFCCCDC0FFA4A598FFB7B8A9FFCAC9C3FFA49E
+ A1FFB7ADB9FFD1C6D5FFA79CABFFB9ADBCFFD1C6D4FFA79CAAFFB8ADBCFFD1C6
+ D4FFA79CAAFFB8ADBCFFCDC4D0FF9B969DFFC9C8CAFFEEEEEEFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00656565FFFFFF
+ FFFFE1E1E1FFC0C0C0FFD7D7D7FFEFEFEFFFF1F1F1FFC6C6C6FFD9D9D9FFF8F8
+ F8FFC8C8C8FFDBDBDBFFFAFAFAFFC9C9C9FFDDDDDDFFFBFBFBFFCACACAFFE0E0
+ DFFFFFFFFEFFCCCCCBFFE2E2E1FFFFFFFFFFCDCDCCFFE3E3E2FFFFFFFFFFCDCD
+ CDFFE3E3E3FFFFFFFFFFCDCDCDFFE4E4E4FFFFFFFFFFCFCFCFFFE4E4E4FFFFFF
+ FFFFCFCFCFFFE4E4E4FFFFFFFFFFCDCDCDFFDFDFDFFFF0F0F0FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00626262FFFFFF
+ FFFFDFDFDFFFBBBBBBFFD0D0D0FFE6E6E6FFEAEAEAFFBDBDBDFFD2D2D2FFEFEF
+ EFFFBFBFBFFFD4D4D4FFF1F1F1FFC0C0C0FFD4D4D4FFF4F4F4FFC1C1C1FFD7D7
+ D7FFF4F4F4FFC3C3C3FFD7D7D7FFF7F7F7FFC4C4C4FFD9D9D9FFF8F8F8FFC5C5
+ C5FFDADADAFFF9F9F9FFC6C6C6FFDBDBDBFFF8F8F8FFC7C7C7FFDCDCDCFFFAFA
+ FAFFC7C7C7FFDCDCDCFFFAFAFAFFC7C7C7FFDADADAFFEEEEEEFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005F5F5FFFFFFF
+ FFFFE1E1E1FFBBBBBBFFD1D1D1FFE6E6E6FFEAEAEAFFBFBFBFFFD1D1D1FFF0F0
+ F0FFBFBFBFFFD4D4D4FFF3F3F3FFC0C0C0FFD6D6D6FFF3F3F3FFC2C2C2FFD7D7
+ D7FFF6F6F6FFC3C3C3FFD9D9D9FFF6F6F6FFC5C5C5FFDADADAFFF7F7F7FFC6C6
+ C6FFDBDBDBFFF8F8F8FFC7C7C7FFDCDCDCFFFAFAFAFFC7C7C7FFDCDCDCFFFAFA
+ FAFFC7C7C7FFDCDCDCFFFAFAFAFFC7C7C7FFDCDCDCFFF0F0F0FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF005A5A5AFFFFFF
+ FFFFE2E2E2FFBFBFBFFFD6D6D6FFEDEDEDFFF0F0F0FFC4C4C4FFD8D8D8FFF6F6
+ F6FFC6C6C6FFD9D9D9FFF8F8F8FFC7C7C7FFDBDBDBFFFAFAFAFFC7C7C7FFDEDE
+ DEFFFBFBFBFFCACACAFFDEDEDEFFFDFDFDFFCACACAFFE3E2E2FFFFFFFFFFD8D4
+ D1FFEFEBE8FFFFFFFFFFCFCECEFFE3E3E3FFFFFFFFFFCCCCCCFFE3E3E3FFFFFF
+ FFFFCCCCCCFFE3E3E3FFFFFFFFFFCBCBCBFFE0E0E0FFF2F2F2FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00575757FFFFFF
+ FFFFE2E2E2FFADADABFFBBBCB5FFD5D6CBFFDCDDD0FFB3B4A7FFC6C7BAFFE1E2
+ D6FFB3B2ABFFC4C1C2FFDDD7DFFFB1AAB3FFC4BDC6FFDFD8E2FFB4ACB6FFC5BD
+ C7FFE2DBE5FFB3ABB5FFC7C0CAFFE3DBE4FFC0B6BAFFDFD2CFFFE2DBD8FF7A8B
+ 93FF748A99FFD0D0D1FFCDC2BCFFD4D0D0FFE4E6EAFFB0B4BAFFC5C9CFFFDFE3
+ E9FFB0B4BAFFC5C9CFFFDEE1E6FFABADB0FFD3D4D5FFF2F2F2FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00555555FFFFFF
+ FFFFE2E2E2FFBDBDB7FF9894B7FF837FC0FF8B86C4FF6E6B9FFF7C77AEFF8F8A
+ C8FF6960A3FF9BB095FFA8CE99FF84A17AFF94B68AFFAACE9DFF86A27AFF93B5
+ 89FFAACE9DFF87A37BFF97B98BFFB8D99EFF80A072FF0B4A6DFF0F537DFF0E58
+ 88FF0E5C8CFF0F507AFF00395FFF888679FFE9C8A0FFAC987DFFB6A58BFFD0BC
+ 9FFFA4947CFFB6A58BFFCDB797FFB3ADA6FFDBDCDEFFF4F4F4FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00505050FFFFFF
+ FFFFE3E3E3FFCBCCC1FF908BC0FF6B64C5FF756ECAFF5D58A4FF6863B6FF7770
+ CEFF5447ABFFA2C792FF9BD588FF7CA86FFF8AB97BFF9DD48CFF7CA86FFF8AB9
+ 7BFF9DD38CFF7CA86FFF97C57DFF7FB67EFF00406EFF307BB2FF3081B5FF2B7D
+ B4FF2779AFFF2878ACFF2574AAFF0E5482FF5B7176FFC09B70FFBCA07AFFD3B6
+ 8CFFA78F6EFFB99F7AFFCEAE80FFC0B8AEFFE2E4E7FFF4F4F4FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF004D4D4DFFFFFF
+ FFFFE2E2E2FFCCCDC2FF928DBFFF6F69C4FF7B75CAFF635EA3FF6E69B5FF7D77
+ CDFF584BABFFA5C893FF9ED48BFF7FA773FF8DB97FFFA1D391FF7FA773FF8DB9
+ 7FFFA1D391FF85AC74FF9FC87DFF06446FFF3680B7FF2D80B5FF3888BEFF3C8C
+ C1FF3889BFFF2E7FB3FF2071A6FF1E6DA1FF11567FFF9C8A70FFC6A780FFD3B8
+ 91FFA79173FFB9A17FFFCDAF83FFBFB8AFFFE2E4E7FFF4F4F4FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00494949FFFFFF
+ FFFFE3E3E3FFCCCDC3FF918CC2FF6A63C5FF746ECAFF5C57A4FF6762B5FF776F
+ CEFF5346ABFFA1C691FF9BD587FF7BA86EFF89B97AFF9DD38CFF7BA76EFF89B9
+ 7AFF9DD38CFF8AB370FF427A70FF1E639FFF2D7FB4FF398BC0FF4898CFFF4DA0
+ D6FF4898CFFF3B8CBFFF2B7BB0FF16699CFF2373A9FF0D4568FFE2AF77FFEEBC
+ 83FFC79764FFD6A670FFE3B37AFFCCBCADFFE5E5E7FFF5F5F5FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00464646FFFFFF
+ FFFFE4E4E4FFBCBCB6FF9997B8FF8783C1FF908CC6FF746FA0FF807DB1FF938E
+ C9FF6E66A5FF9DB39AFFACCF9FFF88A27EFF96B58EFFAFCFA3FF88A380FF98B7
+ 8EFFAECFA2FFA2B787FF134E6DFF317DB1FF2D80B5FF4192C7FF53A5DCFF63B6
+ EFFF51A3DBFF4091C7FF3080B4FF1C6CA0FF246E9EFF134666FF87A3B0FF2586
+ C6FF0E7CC4FF147CC3FF4A91B8FFB7B2A9FFF2E6DFFFFFFBF9FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00434343FFFFFF
+ FFFFE6E6E6FFAEAEACFFBCBCB5FFD7D8CDFFDBDCD0FFB4B5A9FFC7C8BCFFE1E2
+ D6FFB3B3ACFFC5C1C2FFDED8E0FFB3ACB5FFC5BFC8FFE1DAE4FFB3ACB6FFC8C1
+ CAFFE2DBE4FFD9C8C6FF0F4973FF307BAFFF2C7CB3FF3F90C5FF4FA1D7FF5AAC
+ E3FF4D9FD7FF3F90C5FF2F7FB3FF1C699BFF156497FF0577BCFF41A4E5FF57B5
+ EFFF54B2EFFF50B1EEFF39A5E9FF0C7CC5FF69A2C7FFFFFFFBFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003E3E3EFFFFFF
+ FFFFE5E5E5FFC0C0C0FFD6D6D6FFEFEFEFFFF1F1F1FFC6C6C6FFDADADAFFF9F9
+ F9FFC6C6C6FFDDDDDDFFFBFBFBFFC8C8C8FFDEDEDEFFFEFEFEFFCACACAFFE1E1
+ E1FFFEFEFEFFF0E5DDFF1B5479FF2777A6FF2676ACFF3688BBFF4192C9FF4598
+ CDFF4192C7FF3686BCFF2A77A9FF125F90FF0F7DC3FF64BBEFFF55B0E9FF57B0
+ E8FF58AFE7FF4FABE5FF3BA2E4FF3BA4E8FF1C8ACFFF91BFDBFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003C3C3CFFFFFF
+ FFFFE4E4E4FFBFBFBFFFD1D1D1FFE9E9E9FFEDEDEDFFC0C0C0FFD4D4D4FFF4F4
+ F4FFC0C0C0FFD7D7D7FFF6F6F6FFC3C3C3FFD9D9D9FFF8F8F8FFC4C4C4FFDBDB
+ DBFFFAFAFAFFDED7D3FF61859CFF0F5C8BFF1E6FA4FF297AADFF3282B8FF3586
+ BBFF3282B6FF2B7AAEFF1F699AFF0570B2FF57AFE9FF55AFE8FF6AB8EAFF7BBF
+ ECFF7CC0ECFF6EBAE9FF57AFE6FF37A1E2FF35A0E6FF0A7AC0FFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00393939FFFFFF
+ FFFFE4E4E4FFBFBFBFFFD1D1D1FFE9E9E9FFEDEDEDFFC0C0C0FFD4D4D4FFF3F3
+ F3FFC2C2C2FFD7D7D7FFF6F6F6FFC4C4C4FFD9D9D9FFF8F8F8FFC6C6C6FFDADA
+ DAFFFAFAFAFFD8D3D1FFFFFCF6FF074470FF2E75A9FF186A9DFF2171A5FF2574
+ A8FF2372A6FF1B689CFF0D5687FF1A83C8FF5FB6EEFF5FB3E7FF80C2EDFF9ACE
+ F0FF9DCFF0FF84C3EDFF67B5E9FF47A7E4FF1F94DFFF2594DAFFC1ECFFFF0B00
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00343434FFFFFF
+ FFFFE6E6E6FFC3C3C3FFD9D9D9FFF2F2F2FFF6F6F6FFC9C9C9FFDDDDDDFFFCFC
+ FCFFCBCBCBFFDFDFDFFFFEFEFEFFCDCDCDFFE2E2E2FFFFFFFFFFCFCFCFFFE3E3
+ E3FFFFFFFFFFEDE1E2FF96ACA4FF034448FF16517EFF3378AAFF18669AFF0F5F
+ 93FF0F6093FF166597FF23709FFF3095D4FF52AFEBFF64B6E8FF87C6EEFFADD6
+ F3FFB3D9F3FF8CC7EEFF6BB7EAFF4CA9E4FF2395DFFF3AA3E4FF65BDF5FF1706
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00313131FFFFFF
+ FFFFE6E6E6FFA1A3A4FFA4A7ACFFB9BEC7FFBCC2CBFF979DA6FFA9AFB7FFC3C9
+ D1FF9AA0A9FFABB1BAFFC8CDD0FFA4A7A1FFBDBEADFFD9DBC7FFB1B29EFFC7C6
+ B5FFEEE3D9FF2A584FFF135D54FF288A79FF004F4DFF0B466FFF24608FFF3071
+ A4FF3276A9FF296495FF0A4E78FF2F95D9FF49AAE9FF5DB1E7FF7BBEEBFF92CA
+ EFFF93CAEFFF7EC1EBFF64B4E9FF47A7E3FF1B92DEFF3CA4E6FF53B5F0FF1807
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002E2E2EFFFFFF
+ FFFFE6E6E6FFC5C8CCFFC6B296FFCDAA7AFFD1B081FFA98D66FFBA9C72FFD4B3
+ 83FFA88C66FFBA9C72FFDAB67BFF7C76ADFF554FB5FF6B63CDFF504AA3FF6658
+ C1FF3D4E94FF0C5C56FF22857AFF037366FF056A5CFF055948FF196F64FF0643
+ 52FF00394EFF094948FF15674BFF1E86C9FF49AAECFF4BAAE5FF65B4E8FF73BC
+ EBFF74BCEBFF67B5E8FF52ACE5FF369FE0FF1993E0FF2F99DEFFA8E1FFFF0F02
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002A2A2AFFFFFF
+ FFFFE4E4E4FFC2C6CCFFC2B29AFFCAAD85FFCFB48EFFA79173FFB9A17FFFD3B8
+ 91FFA79173FFB9A17FFFDCBD84FF8481B2FF6560B5FF7D77CDFF6760A8FF7D6A
+ C5FF024841FF338F80FF006C62FF077267FF09796EFF057062FF198172FF055D
+ 4EFF055749FF0A6052FF0E745AFF067CBEFF4AAFF5FF319FE3FF48A6E4FF55AD
+ E5FF54ADE5FF4CA9E4FF39A1E2FF1C92DEFF34A2E8FF127EC4FFFFFFFFFF0100
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00272727FFFFFF
+ FFFFE4E4E4FFC2C6CCFFC2B29AFFCAAD85FFCFB48EFFA79173FFB9A17FFFD3B8
+ 91FFA79173FFB9A17FFFDCBD84FF8481B2FF6560B5FF7D77CDFF6E61AFFF3753
+ 79FF257A68FF086F64FF056E63FF0A7267FF09756AFF08776CFF087C71FF087A
+ 6DFF09796EFF05796FFF00786BFF0F6152FF1B83C7FF3EACF2FF2298E2FF2E9B
+ E0FF2F9BE0FF2597DFFF1993DFFF2EA0E7FF39A8EBFF2E79AAFFFFFFFFFF0000
+ 00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00222222FFFFFF
+ FFFFE4E4E4FFC3C6CCFFC0B099FFCAAD85FFCFB48EFFA79173FFB9A17FFFD3B8
+ 91FFA79173FFB9A17FFFDCBC84FF8481B2FF6460B5FF7D76CDFF7463B6FF0D45
+ 4BFF348B7CFF00695CFF086459FF087167FF0A7366FF097368FF097669FF0976
+ 6BFF05766CFF007770FF255E4AFFBA5F29FF6E7478FF1284CDFF42AEF5FF3DA8
+ EDFF2EA0E7FF3AA7EAFF48B3F6FF2E99DEFF0F70ACFF7B3401FFFFEFDFFF0005
+ 0BFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001F1F1FFFFFFF
+ FFFFE6E6E6FFC6C8CCFFC4B194FFCDAB7AFFD1B081FFA98D66FFBA9C72FFD5B3
+ 84FFA98C66FFBA9C72FFDAB67BFF8179ADFF5A52B6FF6F67CFFF6E58BAFF003D
+ 45FF32877CFF00655BFF07574FFF087064FF086E63FF087065FF087167FF0772
+ 67FF00736DFF365A43FFA6663EFFCB824EFFB56120FFA37B57FF0F6DABFF0E7F
+ C6FF1481C7FF107FC6FF0975BDFF4B646BFF9E612DFFB7743EFFA76B3EFF321E
+ 10FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001C1C1CFFFFFF
+ FFFFE4E4E4FF9E9FA1FF9FA2A7FFB8BDC5FFBAC0C9FF949AA2FFA5ABB4FFBFC5
+ CEFF959BA3FFA8AEB6FFC4C9CCFF9EA29BFFB8BAA9FFD5D7C3FFC8BDB0FF0C4A
+ 3BFF2F8579FF00574CFF086157FF086B61FF086B60FF086C61FF086C62FF006F
+ 66FF006964FF95542AFFC47F51FFAF6731FFB36A2FFFC28752FF9E561DFFC7B5
+ A9FFA59E9BFFB8ABA4FF8E5931FFA6784CFFA7642FFFA4622CFFB78055FF7941
+ 1CFF5C040019FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00181818FFFFFF
+ FFFFE1E1E1FFEBEBEBFFEFEFEFFFEFEFEFFFF0F0F0FFF2F2F2FFF4F4F4FFF5F5
+ F5FFF4F4F4FFF6F6F6FFF7F7F7FFF6F6F6FFF8F8F8FFF9F9F9FFFFFFFFFF6889
+ 84FF176D64FF054A43FF046358FF08665CFF08675DFF08685EFF08685EFF006C
+ 65FF6A4825FFC8865AFFAA6731FFAD6A34FFB26C35FFBB743CFFB06325FFCAAD
+ 97FFDBE3EAFFE5F0F9FF964D14FFB5733DFFA96631FFA56431FFA0602EFFB385
+ 5EFF702600B8FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00151515FFFFFF
+ FFFFDADADAFFDDDDDDFFDFDFDFFFE0E0E0FFE0E0E0FFE1E1E1FFE3E3E3FFE2E2
+ E2FFE4E4E4FFE5E5E5FFE5E5E5FFE6E6E6FFE8E8E8FFE7E7E7FFF7F4F4FFEAE0
+ E1FF003A32FF24645DFF0B6D62FF006156FF006055FF005F55FF005F55FF0062
+ 5EFF965127FFB87A4AFFA86430FFAA6933FFB06D36FFB36D37FFB4692DFFBF7E
+ 4BFFFFFFFFFFF3EBE5FFA65616FFAC6834FFA76634FF9C6132FF9F602DFFA975
+ 49FF8A4F25E65A070015FFFFFF00FFFFFF00FFFFFF00FFFFFF00262626F6FFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFDCE4E3FF0C524DFF2A7B72FF35877DFF3A8D83FF3B8F85FF388F86FF2C84
+ 7BFFAB6B42FFAC6D3BFFA4632FFFA46633FFAC6935FFAD6C36FFAD6933FFA14E
+ 0DFFF0FFFFFFC8AA92FFA1581EFFA76834FFA56533FFA36533FF8B562AFF9D62
+ 32FFA67551F96517004DFFFFFF00FFFFFF00FFFFFF00FFFFFF001414146B1F1F
+ 1FF6232323FF383838FF4D4D4DFF4D4D4DFF4D4D4DFF4C4C4CFF4C4C4CFF4A4A
+ 4AFF4A4A4AFF494949FF474747FF474747FF464646FF444444FF444444FF4948
+ 48FF544E4EFF534A4BFF3B4645FF224644FF0E4643FF0C4742FF074642FF123E
+ 35FFAD7046FFA86837FF92592BFFA66634FFA76635FFA86734FFA96834FFA155
+ 19FFD4D3D0FFB58862FFA15D26FFA36433FFA06332FFA16433FF7B4C25FF9559
+ 29FFAF805AFF6726008CFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00000000010000000A000000110000001900000021000000280000
+ 00300000003800000040000000470000004E000000560000005D000000640000
+ 006B00000071000000780000008400000090000000960000009A0000009B0000
+ 009EA25F35F5AC7247FF8E5529FFA16333FFA16332FFA26432FFA36433FF9E59
+ 21FFBCA99BFFA56B3BFF9F5F2CFF9E6231FF9C6030FF9C6232FF865127FF7245
+ 22FFB17E56FD652A037200000007FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF0000000001000000060000000F000000190000
+ 0020000000260000002C00000033000000380000003D00000043000000470000
+ 004B0000004E0000005100000052000000520000005500000058000000590000
+ 0061944F1FDBAB7E5BFF975A28FF995C2CFF9B5E2DFF9D6030FF9C6030FF9B5A
+ 27FFA9805EFF995826FF9A5F2DFF985E2FFF965B2DFF945A2AFF8B5125FF6E52
+ 3AFF9F5E32ED311A054100000008FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000
+ 000100000003000000060000000B0000001000000014000000180000001C0000
+ 001F000000230000002600000028000000280000002700000024000000220000
+ 00211B02004D99592FEDB3835EFFA37147FF9C673AFF995F31FF9A6030FF995E
+ 2DFF9A5D2EFF985D2EFF985D31FF955E2FFF996137FFA06D46FFAD825CFF9361
+ 3CF7904D1FA80000002400000001FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF000000000C3E150045A05827D3A36438E7AA6C44F1AE7850F8AC784FF9AD77
+ 50FAAC7750FAAA774EFBAC7650FAAC7650FAAA7149F6A15F34EF9C5621E37C42
+ 1C910000002900000007FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF000000000800000020000000321B0C00574020097B3A1D0686361A
+ 058D3318059133180591361A058E3A1C0589381908780000004B000000370000
+ 001E00000003FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00000000060000001700000028000000320000
+ 00390000003D0000003D0000003A00000034000000260000001200000003FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00
+ }
+ end
+end
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/RxViewsPanel/unit1.pas b/components/rx/version/v2.2_laz_1.2/Demos/RxViewsPanel/unit1.pas
new file mode 100644
index 000000000..f57dcb691
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/RxViewsPanel/unit1.pas
@@ -0,0 +1,67 @@
+unit Unit1;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
+ Buttons, StdCtrls, Grids, ComCtrls, rxtoolbar, RxViewsPanel, ExtendedNotebook;
+
+type
+
+ { TForm1 }
+
+ TForm1 = class(TForm)
+ ExtendedNotebook1: TExtendedNotebook;
+ ImageList2: TImageList;
+ Memo1: TMemo;
+ Page1: TPage;
+ Page2: TPage;
+ Page3: TPage;
+ Page4: TPage;
+ PaintBox1: TPaintBox;
+ RxViewsPanel1: TRxViewsPanel;
+ Splitter1: TSplitter;
+ Splitter2: TSplitter;
+ StatusBar1: TStatusBar;
+ StringGrid1: TStringGrid;
+ StringGrid2: TStringGrid;
+ StringGrid3: TStringGrid;
+ StringGrid4: TStringGrid;
+ TabSheet1: TTabSheet;
+ TabSheet2: TTabSheet;
+ TabSheet3: TTabSheet;
+ TabSheet4: TTabSheet;
+ ToolPanel1: TToolPanel;
+ procedure FormCreate(Sender: TObject);
+ procedure RxViewsPanel1SelectViewEvent(Sender: TObject; ItemIndex: integer;
+ const Item: TRxViewsPanelItem);
+ private
+ //
+ public
+ { public declarations }
+ end;
+
+var
+ Form1: TForm1;
+
+implementation
+
+{$R *.lfm}
+
+{ TForm1 }
+
+procedure TForm1.FormCreate(Sender: TObject);
+begin
+ RxViewsPanel1.ItemIndex:=1;
+end;
+
+procedure TForm1.RxViewsPanel1SelectViewEvent(Sender: TObject;
+ ItemIndex: integer; const Item: TRxViewsPanelItem);
+begin
+ ExtendedNotebook1.PageIndex:=ItemIndex
+end;
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/TestRXMemDSLoad/rx_ext_test_case_1.pas b/components/rx/version/v2.2_laz_1.2/Demos/TestRXMemDSLoad/rx_ext_test_case_1.pas
new file mode 100644
index 000000000..7e925b083
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/TestRXMemDSLoad/rx_ext_test_case_1.pas
@@ -0,0 +1,182 @@
+unit rx_ext_test_case_1;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, fpcunit, testutils, testregistry, rxmemds, Dialogs;
+
+type
+
+ { TTCRxMemDataLifecycle }
+
+ TTCRxMemDataLifecycle= class(TTestCase)
+ protected
+ procedure SetUp; override;
+ procedure TearDown; override;
+ published
+ procedure TestHookUp;
+ procedure TestSave;
+ end;
+
+implementation
+
+uses
+ db, ex_rx_datapacket;
+
+procedure TTCRxMemDataLifecycle.TestHookUp;
+var
+ ads : TRxMemoryData;
+ aField : TField;
+ i : integer;
+begin
+ ads := TRxMemoryData.Create(nil);
+
+ aField := TIntegerField.Create(nil);
+ aField.FieldName:= 'IntegerField1';
+ aField.Name := 'adsIntegerField1';
+ aField.DataSet := ads;
+
+ aField := TStringField.Create(nil);
+ aField.FieldName:= 'StringField1';
+ aField.Name := 'adsStringField1';
+ aField.Size := 20;
+ aField.DataSet := ads;
+
+ aField := TFloatField.Create(nil);
+ aField.FieldName:= 'FloatField1';
+ aField.Name := 'adsFloatField1';
+ aField.DataSet := ads;
+
+ ads.Open;
+
+ for i := 0 to 500 do
+ begin
+ ads.AppendRecord([i,'Name '+ IntToStr(i), 200 + (i*0.1)]);
+ end;
+
+ ads.First;
+
+ i:= 0;
+ while not ads.EOF do
+ begin
+ AssertTrue('Integer is incorrect ' + IntToStr(i), ads.FieldByName('IntegerField1').AsInteger = i);
+ AssertTrue('Float is incorrect ' + IntToStr(i), ads.FieldByName('FloatField1').AsFloat - (200 + (i*0.1)) < 0.01);
+ AssertTrue('String is incorrect ' + IntToStr(i), ads.FieldByName('StringField1').AsString = 'Name '+ IntToStr(i));
+ inc(i);
+ ads.Next;
+ end;
+
+
+end;
+
+procedure TTCRxMemDataLifecycle.TestSave;
+var
+ ads1,ads2 : TRxMemoryData;
+ aField : TField;
+ i : integer;
+ sMemoTest : String;
+begin
+ ads1 := TRxMemoryData.Create(nil);
+ ads2 := TRxMemoryData.Create(nil);
+
+ aField := TIntegerField.Create(nil);
+ aField.FieldName:= 'IntegerField1';
+ aField.Name := 'adsIntegerField1';
+ aField.DataSet := ads1;
+
+ aField := TStringField.Create(nil);
+ aField.FieldName:= 'StringField1';
+ aField.Name := 'adsStringField1';
+ aField.Size := 20;
+ aField.DataSet := ads1;
+
+ aField := TFloatField.Create(nil);
+ aField.FieldName:= 'FloatField1';
+ aField.Name := 'adsFloatField1';
+ aField.DataSet := ads1;
+
+ // TBooleanField
+
+ aField := TBooleanField.Create(nil);
+ aField.FieldName:= 'BooleanField1';
+ aField.Name := 'adsBooleanField1';
+ aField.DataSet := ads1;
+
+ // TDateTimeField
+
+ aField := TDateTimeField.Create(nil);
+ aField.FieldName:= 'DateTimeField1';
+ aField.Name := 'adsDateTimeField1';
+ aField.DataSet := ads1;
+
+
+ // TMemoField
+
+ aField := TMemoField.Create(nil);
+ aField.FieldName:= 'MemoField1';
+ aField.Name := 'adsMemoField1';
+ aField.Size:= 600;
+ aField.DataSet := ads1;
+
+ // TCurrencyField
+
+ aField := TCurrencyField.Create(nil);
+ aField.FieldName:= 'CurrencyField1';
+ aField.Name := 'adsCurrencyField1';
+ aField.DataSet := ads1;
+
+ ads1.Open;
+ ads2.Open;
+
+ sMemoTest := 'memo1';
+ for i := 0 to 500 do
+ begin
+ ads1.AppendRecord([i,'Name '+ IntToStr(i), 200 + (i*0.1),(i div 2) = 1, EncodeDate(2011,10,03) + i, sMemoTest, 1000 + (i*0.1)]);
+ sMemoTest := sMemoTest + 'a';
+ end;
+
+ ads1.SaveToFile('/tmp/testfile.xml',dfXML);
+ ads2.LoadFromFile('/tmp/testfile.xml',dfXML);
+
+ ads2.First;
+
+ sMemoTest := 'memo1';
+ i:= 0;
+ while not ads2.EOF do
+ begin
+ AssertTrue('Integer is incorrect ' + IntToStr(i), ads2.FieldByName('IntegerField1').AsInteger = i);
+ AssertTrue('Float is incorrect ' + IntToStr(i), ads2.FieldByName('FloatField1').AsFloat - (200 + (i*0.1)) < 0.01);
+ AssertTrue('String is incorrect ' + IntToStr(i), ads2.FieldByName('StringField1').AsString = 'Name '+ IntToStr(i));
+
+ AssertTrue('Currency is incorrect ' + IntToStr(i), ads2.FieldByName('CurrencyField1').AsFloat - (1000 + (i*0.1)) < 0.01);
+ AssertTrue('DateTime is incorrect ' + IntToStr(i), ads2.FieldByName('DateTimeField1').AsDateTime = EncodeDate(2011,10,03) + i);
+ AssertTrue('Memo is incorrect ' + IntToStr(i) + ads2.FieldByName('MemoField1').AsString, StrComp(Pchar(ads2.FieldByName('MemoField1').asString),Pchar(sMemoTest)) = 0);
+
+ sMemoTest := sMemoTest + 'a';
+ inc(i);
+ ads2.Next;
+ end;
+
+ ads1.Free;
+ ads2.Free;
+
+
+end;
+
+procedure TTCRxMemDataLifecycle.SetUp;
+begin
+
+end;
+
+procedure TTCRxMemDataLifecycle.TearDown;
+begin
+
+end;
+
+initialization
+
+ RegisterTest(TTCRxMemDataLifecycle);
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/TestRXMemDSLoad/rx_ext_test_harness.lpi b/components/rx/version/v2.2_laz_1.2/Demos/TestRXMemDSLoad/rx_ext_test_harness.lpi
new file mode 100644
index 000000000..5ef0da83b
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/TestRXMemDSLoad/rx_ext_test_harness.lpi
@@ -0,0 +1,309 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/TestRXMemDSLoad/rx_ext_test_harness.lpr b/components/rx/version/v2.2_laz_1.2/Demos/TestRXMemDSLoad/rx_ext_test_harness.lpr
new file mode 100644
index 000000000..cb6f1ec6f
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/TestRXMemDSLoad/rx_ext_test_harness.lpr
@@ -0,0 +1,15 @@
+program rx_ext_test_harness;
+
+{$mode objfpc}{$H+}
+
+uses
+ Interfaces, Forms, GuiTestRunner, rxnew, rx_ext_test_case_1;
+
+{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.CreateForm(TGuiTestRunner, TestRunner);
+ Application.Run;
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/TestRXMemDSLoad/rx_ext_test_harness.res b/components/rx/version/v2.2_laz_1.2/Demos/TestRXMemDSLoad/rx_ext_test_harness.res
new file mode 100644
index 000000000..e66ecf85f
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/Demos/TestRXMemDSLoad/rx_ext_test_harness.res differ
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/Text90/project1.lpi b/components/rx/version/v2.2_laz_1.2/Demos/Text90/project1.lpi
new file mode 100644
index 000000000..1afc647c0
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/Text90/project1.lpi
@@ -0,0 +1,301 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/Text90/project1.lpr b/components/rx/version/v2.2_laz_1.2/Demos/Text90/project1.lpr
new file mode 100644
index 000000000..adaa17eb3
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/Text90/project1.lpr
@@ -0,0 +1,15 @@
+program project1;
+
+{$mode objfpc}{$H+}
+
+uses
+ Interfaces, // this includes the LCL widgetset
+ Forms
+ { add your units here }, Unit1, rxnew;
+
+begin
+ Application.Initialize;
+ Application.CreateForm(TForm1, Form1);
+ Application.Run;
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/Text90/unit1.lfm b/components/rx/version/v2.2_laz_1.2/Demos/Text90/unit1.lfm
new file mode 100644
index 000000000..e66d39608
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/Text90/unit1.lfm
@@ -0,0 +1,134 @@
+object Form1: TForm1
+ Left = 369
+ Height = 500
+ Top = 228
+ Width = 536
+ ActiveControl = RadioGroup1.RadioButton4
+ Caption = 'Form1'
+ ClientHeight = 500
+ ClientWidth = 536
+ OnCreate = FormCreate
+ SessionProperties = 'Edit1.Text'
+ LCLVersion = '0.9.27'
+ object PaintBox1: TPaintBox
+ Left = 16
+ Height = 129
+ Top = 16
+ Width = 184
+ OnPaint = PaintBox1Paint
+ end
+ object Edit1: TEdit
+ Left = 8
+ Height = 27
+ Top = 152
+ Width = 192
+ AutoSize = True
+ OnChange = Edit1Change
+ TabOrder = 0
+ Text = 'Edit1'
+ end
+ object RadioGroup1: TRadioGroup
+ Left = 208
+ Height = 136
+ Top = 8
+ Width = 79
+ AutoFill = True
+ AutoSize = True
+ Caption = 'Direction'
+ ChildSizing.LeftRightSpacing = 6
+ ChildSizing.TopBottomSpacing = 6
+ ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
+ ChildSizing.EnlargeVertical = crsHomogenousChildResize
+ ChildSizing.ShrinkHorizontal = crsScaleChilds
+ ChildSizing.ShrinkVertical = crsScaleChilds
+ ChildSizing.Layout = cclLeftToRightThenTopToBottom
+ ChildSizing.ControlsPerLine = 1
+ ClientHeight = 117
+ ClientWidth = 75
+ ItemIndex = 4
+ Items.Strings = (
+ '0 %'
+ '90 %'
+ '180 %'
+ '270 %'
+ '360 %'
+ )
+ OnClick = CheckBox1Change
+ TabOrder = 1
+ end
+ object RxDBGrid1: TRxDBGrid
+ Left = 0
+ Height = 308
+ Top = 192
+ Width = 536
+ TitleButtons = False
+ AutoSort = False
+ Columns = <
+ item
+ Title.Alignment = taCenter
+ Title.Orientation = toHorizontal
+ FieldName = 'DEMO_1'
+ Filter.DropDownRows = 0
+ Filter.ItemIndex = -1
+ end>
+ OptionsRx = []
+ Align = alBottom
+ Anchors = [akTop, akLeft, akRight, akBottom]
+ FocusColor = clRed
+ SelectedColor = clHighlight
+ GridLineStyle = psSolid
+ DataSource = Datasource1
+ ParentColor = False
+ TabOrder = 2
+ TitleStyle = tsNative
+ end
+ object RxMemoryData1: TRxMemoryData
+ AutoCalcFields = False
+ FieldDefs = <
+ item
+ Name = 'DEMO_1'
+ DataType = ftInteger
+ Precision = -1
+ Size = 0
+ end
+ item
+ Name = 'Demo2'
+ DataType = ftString
+ Precision = -1
+ Size = 40
+ end>
+ left = 312
+ top = 64
+ object RxMemoryData1DEMO_11: TLongintField
+ DisplayWidth = 10
+ FieldKind = fkData
+ FieldName = 'DEMO_1'
+ Index = 0
+ LookupCache = False
+ ProviderFlags = [pfInUpdate, pfInWhere]
+ ReadOnly = False
+ Required = False
+ end
+ object RxMemoryData1Demo21: TStringField
+ DisplayWidth = 40
+ FieldKind = fkData
+ FieldName = 'Demo2'
+ Index = 1
+ LookupCache = False
+ ProviderFlags = [pfInUpdate, pfInWhere]
+ ReadOnly = False
+ Required = False
+ Size = 40
+ end
+ end
+ object Datasource1: TDatasource
+ DataSet = RxMemoryData1
+ left = 312
+ top = 32
+ end
+ object IniPropStorage1: TIniPropStorage
+ StoredValues = <>
+ left = 447
+ top = 19
+ end
+end
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/Text90/unit1.lrs b/components/rx/version/v2.2_laz_1.2/Demos/Text90/unit1.lrs
new file mode 100644
index 000000000..e74450711
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/Text90/unit1.lrs
@@ -0,0 +1,42 @@
+{ - , lazarus }
+
+LazarusResources.Add('TForm1','FORMDATA',[
+ 'TPF0'#6'TForm1'#5'Form1'#4'Left'#3'q'#1#6'Height'#3#244#1#3'Top'#3#228#0#5'W'
+ +'idth'#3#24#2#13'ActiveControl'#7#24'RadioGroup1.RadioButton4'#7'Caption'#6#5
+ +'Form1'#12'ClientHeight'#3#244#1#11'ClientWidth'#3#24#2#8'OnCreate'#7#10'For'
+ +'mCreate'#17'SessionProperties'#6#10'Edit1.Text'#10'LCLVersion'#6#6'0.9.27'#0
+ +#9'TPaintBox'#9'PaintBox1'#4'Left'#2#16#6'Height'#3#129#0#3'Top'#2#16#5'Widt'
+ +'h'#3#184#0#7'OnPaint'#7#14'PaintBox1Paint'#0#0#5'TEdit'#5'Edit1'#4'Left'#2#8
+ +#6'Height'#2#27#3'Top'#3#152#0#5'Width'#3#192#0#8'AutoSize'#9#8'OnChange'#7
+ +#11'Edit1Change'#8'TabOrder'#2#0#4'Text'#6#5'Edit1'#0#0#11'TRadioGroup'#11'R'
+ +'adioGroup1'#4'Left'#3#208#0#6'Height'#3#136#0#3'Top'#2#8#5'Width'#2'O'#8'Au'
+ +'toFill'#9#8'AutoSize'#9#7'Caption'#6#9'Direction'#28'ChildSizing.LeftRightS'
+ +'pacing'#2#6#28'ChildSizing.TopBottomSpacing'#2#6#29'ChildSizing.EnlargeHori'
+ +'zontal'#7#24'crsHomogenousChildResize'#27'ChildSizing.EnlargeVertical'#7#24
+ +'crsHomogenousChildResize'#28'ChildSizing.ShrinkHorizontal'#7#14'crsScaleChi'
+ +'lds'#26'ChildSizing.ShrinkVertical'#7#14'crsScaleChilds'#18'ChildSizing.Lay'
+ +'out'#7#29'cclLeftToRightThenTopToBottom'#27'ChildSizing.ControlsPerLine'#2#1
+ +#12'ClientHeight'#2'u'#11'ClientWidth'#2'K'#9'ItemIndex'#2#4#13'Items.String'
+ +'s'#1#6#3'0 %'#6#4'90 %'#6#5'180 %'#6#5'270 %'#6#5'360 %'#0#7'OnClick'#7#15
+ +'CheckBox1Change'#8'TabOrder'#2#1#0#0#9'TRxDBGrid'#9'RxDBGrid1'#4'Left'#2#0#6
+ +'Height'#3'4'#1#3'Top'#3#192#0#5'Width'#3#24#2#12'TitleButtons'#8#8'AutoSort'
+ +#8#7'Columns'#14#1#15'Title.Alignment'#7#8'taCenter'#17'Title.Orientation'#7
+ +#12'toHorizontal'#9'FieldName'#6#6'DEMO_1'#19'Filter.DropDownRows'#2#0#16'Fi'
+ +'lter.ItemIndex'#2#255#0#0#9'OptionsRx'#11#0#5'Align'#7#8'alBottom'#7'Anchor'
+ +'s'#11#5'akTop'#6'akLeft'#7'akRight'#8'akBottom'#0#10'FocusColor'#7#5'clRed'
+ +#13'SelectedColor'#7#11'clHighlight'#13'GridLineStyle'#7#7'psSolid'#10'DataS'
+ +'ource'#7#11'Datasource1'#11'ParentColor'#8#8'TabOrder'#2#2#10'TitleStyle'#7
+ +#8'tsNative'#0#0#13'TRxMemoryData'#13'RxMemoryData1'#14'AutoCalcFields'#8#9
+ +'FieldDefs'#14#1#4'Name'#6#6'DEMO_1'#8'DataType'#7#9'ftInteger'#9'Precision'
+ +#2#255#4'Size'#2#0#0#1#4'Name'#6#5'Demo2'#8'DataType'#7#8'ftString'#9'Precis'
+ +'ion'#2#255#4'Size'#2'('#0#0#4'left'#3'8'#1#3'top'#2'@'#0#13'TLongintField'
+ +#20'RxMemoryData1DEMO_11'#12'DisplayWidth'#2#10#9'FieldKind'#7#6'fkData'#9'F'
+ +'ieldName'#6#6'DEMO_1'#5'Index'#2#0#11'LookupCache'#8#13'ProviderFlags'#11#10
+ +'pfInUpdate'#9'pfInWhere'#0#8'ReadOnly'#8#8'Required'#8#0#0#12'TStringField'
+ +#19'RxMemoryData1Demo21'#12'DisplayWidth'#2'('#9'FieldKind'#7#6'fkData'#9'Fi'
+ +'eldName'#6#5'Demo2'#5'Index'#2#1#11'LookupCache'#8#13'ProviderFlags'#11#10
+ +'pfInUpdate'#9'pfInWhere'#0#8'ReadOnly'#8#8'Required'#8#4'Size'#2'('#0#0#0#11
+ +'TDatasource'#11'Datasource1'#7'DataSet'#7#13'RxMemoryData1'#4'left'#3'8'#1#3
+ +'top'#2' '#0#0#15'TIniPropStorage'#15'IniPropStorage1'#12'StoredValues'#14#0
+ +#4'left'#3#191#1#3'top'#2#19#0#0#0
+]);
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/Text90/unit1.pas b/components/rx/version/v2.2_laz_1.2/Demos/Text90/unit1.pas
new file mode 100644
index 000000000..60e2e66c9
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/Text90/unit1.pas
@@ -0,0 +1,89 @@
+unit Unit1;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
+ Buttons, StdCtrls, rxdbgrid, vclutils, rxmemds, db, IniPropStorage;
+
+type
+
+ { TForm1 }
+
+ TForm1 = class(TForm)
+ Datasource1: TDatasource;
+ Edit1: TEdit;
+ IniPropStorage1: TIniPropStorage;
+ PaintBox1: TPaintBox;
+ RadioGroup1: TRadioGroup;
+ RxDBGrid1: TRxDBGrid;
+ RxMemoryData1: TRxMemoryData;
+ RxMemoryData1Demo21: TStringField;
+ RxMemoryData1DEMO_11: TLongintField;
+ procedure CheckBox1Change(Sender: TObject);
+ procedure Edit1Change(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ procedure PaintBox1Paint(Sender: TObject);
+ private
+ { private declarations }
+ public
+ { public declarations }
+ end;
+
+var
+ Form1: TForm1;
+
+implementation
+
+{ TForm1 }
+
+procedure TForm1.PaintBox1Paint(Sender: TObject);
+var
+ FOri:TTextOrientation;
+begin
+
+ PaintBox1.Canvas.TextOut(1,1, 'Text for test');
+ case RadioGroup1.ItemIndex of
+ 0:FOri:=toHorizontal;
+ 1:FOri:=toVertical90;
+ 2:FOri:=toHorizontal180;
+ 3:FOri:=toVertical270;
+ 4:FOri:=toHorizontal360;
+ end;
+
+ OutTextXY90(PaintBox1.Canvas, 1, 20, Edit1.Text, FOri);
+end;
+
+procedure TForm1.CheckBox1Change(Sender: TObject);
+var
+ FOri:TTextOrientation;
+begin
+ PaintBox1.Invalidate;
+ case RadioGroup1.ItemIndex of
+ 0:FOri:=toHorizontal;
+ 1:FOri:=toVertical90;
+ 2:FOri:=toHorizontal180;
+ 3:FOri:=toVertical270;
+ 4:FOri:=toHorizontal360;
+ end;
+ (RxDBGrid1.Columns[0].Title as TRxColumnTitle).Orientation:=FOri;
+end;
+
+procedure TForm1.Edit1Change(Sender: TObject);
+begin
+ PaintBox1.Invalidate;
+ (RxDBGrid1.Columns[0].Title as TRxColumnTitle).Caption:=Edit1.Text;
+end;
+
+procedure TForm1.FormCreate(Sender: TObject);
+begin
+ RxMemoryData1.Open;
+end;
+
+initialization
+ {$I unit1.lrs}
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/aboutunit.lfm b/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/aboutunit.lfm
new file mode 100644
index 000000000..6455955f7
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/aboutunit.lfm
@@ -0,0 +1,25 @@
+object AboutForm: TAboutForm
+ Left = 441
+ Height = 300
+ Top = 321
+ Width = 400
+ ActiveControl = BitBtn1
+ Caption = 'About...'
+ ClientHeight = 300
+ ClientWidth = 400
+ LCLVersion = '1.3'
+ object BitBtn1: TBitBtn
+ Left = 181
+ Height = 37
+ Top = 257
+ Width = 36
+ Anchors = [akBottom]
+ AutoSize = True
+ BorderSpacing.InnerBorder = 2
+ Caption = '&'
+ Default = True
+ Kind = bkOK
+ ModalResult = 1
+ TabOrder = 0
+ end
+end
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/aboutunit.pas b/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/aboutunit.pas
new file mode 100644
index 000000000..202bf1993
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/aboutunit.pas
@@ -0,0 +1,30 @@
+unit AboutUnit;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Buttons;
+
+type
+
+ { TAboutForm }
+
+ TAboutForm = class(TForm)
+ BitBtn1: TBitBtn;
+ private
+ { private declarations }
+ public
+ { public declarations }
+ end;
+
+var
+ AboutForm: TAboutForm;
+
+implementation
+
+{$R *.lfm}
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/ico/main.ICO b/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/ico/main.ICO
new file mode 100644
index 000000000..8969d0f11
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/ico/main.ICO differ
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/project1.ico b/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/project1.ico
new file mode 100644
index 000000000..703e3aed1
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/project1.ico differ
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/project1.lpi b/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/project1.lpi
new file mode 100644
index 000000000..e3e84caef
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/project1.lpi
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/project1.lpr b/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/project1.lpr
new file mode 100644
index 000000000..e7811ec3d
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/project1.lpr
@@ -0,0 +1,19 @@
+program project1;
+
+{$mode objfpc}{$H+}
+
+uses
+ Interfaces, // this includes the LCL widgetset
+ Forms,
+ Unit1,
+ AboutUnit;
+
+{$R *.res}
+
+begin
+ Application.Title:='Rx Toolbar test';
+ Application.Initialize;
+ Application.CreateForm(TMainForm, MainForm);
+ Application.Run;
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/toolbardemo.cfg b/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/toolbardemo.cfg
new file mode 100644
index 000000000..ea321fb0e
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/toolbardemo.cfg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/unit1.lfm b/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/unit1.lfm
new file mode 100644
index 000000000..46fa8cb8d
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/unit1.lfm
@@ -0,0 +1,765 @@
+object MainForm: TMainForm
+ Left = 565
+ Height = 289
+ Top = 247
+ Width = 650
+ ActiveControl = ToolPanel1
+ Caption = 'ToolPanel demo'
+ ClientHeight = 289
+ ClientWidth = 650
+ Position = poDesktopCenter
+ SessionProperties = 'Width;Height;Left;Top'
+ ShowHint = True
+ LCLVersion = '1.3'
+ object ToolPanel1: TToolPanel
+ Left = 0
+ Height = 32
+ Top = 0
+ Width = 650
+ Items = <
+ item
+ Action = actNew
+ Visible = True
+ Left = 5
+ Height = 22
+ Top = 5
+ Width = 59
+ DropDownMenu = PopupMenu1
+ ShowCaption = True
+ ButtonStyle = tbrDropDown
+ end
+ item
+ Action = actCustom
+ Visible = True
+ Left = 142
+ Height = 22
+ Top = 5
+ Width = 79
+ ShowCaption = True
+ end
+ item
+ Action = actNext
+ Visible = True
+ Left = 279
+ Height = 22
+ Top = 5
+ Width = 39
+ DropDownMenu = PopupMenu2
+ ShowCaption = False
+ ButtonStyle = tbrDropDownExtra
+ end
+ item
+ Action = actPrior
+ Visible = True
+ Left = 221
+ Height = 22
+ Top = 5
+ Width = 58
+ DropDownMenu = PopupMenu2
+ ShowCaption = True
+ end
+ item
+ Action = actExit
+ Visible = True
+ Left = 318
+ Height = 22
+ Top = 5
+ Width = 53
+ ShowCaption = True
+ end
+ item
+ Action = actSysMenu
+ Visible = True
+ Left = 64
+ Height = 22
+ Top = 5
+ Width = 78
+ DropDownMenu = PopupMenu1
+ ShowCaption = True
+ ButtonStyle = tbrDropDown
+ end
+ item
+ Action = sysAbout
+ Visible = True
+ Left = 371
+ Height = 22
+ Top = 5
+ Width = 67
+ ShowCaption = True
+ end>
+ ImageList = ImageList1
+ PropertyStorage = XMLPropStorage1
+ BtnWidth = 23
+ BtnHeight = 32
+ ToolBarStyle = tbsWindowsXP
+ Options = [tpFlatBtns, tpCustomizable, tpGlyphPopup, tpCaptionPopup]
+ Version = 4
+ Align = alTop
+ BorderWidth = 4
+ ClientHeight = 32
+ ClientWidth = 650
+ FullRepaint = False
+ TabOrder = 0
+ end
+ object SpeedButton1: TSpeedButton
+ Left = 440
+ Height = 22
+ Top = 88
+ Width = 22
+ AutoSize = True
+ Caption = 'Test'
+ Glyph.Data = {
+ 46050000424D4605000000000000360000002800000012000000120000000100
+ 2000000000001005000064000000640000000000000000000000FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F8F8
+ F8FFE8E8E8FFE7E7E7FFF6F6F6FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00F8F8F8FFC3ACACFFAF7F7AFFB19594FFDDDDDDFFF6F6F6FFFFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00F8F8F8FFC2AAAAFFC9A298FFFEF1E3FFD6B3A5FFAF9292FFDDDD
+ DDFFF6F6F6FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00F8F8F8FFC2A9A9FFCAA49BFFFEF2E6FFFFEBD5FFFFF5
+ EAFFD6B5A8FFAF9292FFDDDDDDFFF5F5F5FFFFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00F8F8F8FFC4ADABFFCDA99FFFFEF4E8FFFFEC
+ D7FFFFEBD7FFFFEBD7FFFFF5ECFFD8B8ABFFB19391FFDBDADAFFF5F5F5FFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F8F8F8FFC7AFACFFD1ADA2FFFEF5
+ EBFFFFEEDCFFFFEEDCFFFFEEDCFFFFEEDCFFFFEEDCFFFFF7EEFFDBBCAFFFB393
+ 8FFFDBDADAFFF5F5F5FFFFFFFF00FFFFFF00FFFFFF00F8F8F8FFCAB2ADFFD4B2
+ A6FFFEF6EEFFFFF0E1FFFFF0E1FFFFEDD7FFFFBC58FFFFE4C2FFFFF0E0FFFFF0
+ E0FFFFF8F0FFDEC0B4FFB79691FFDCDBDBFFF6F6F6FFFFFFFF00FFFFFF00D1B9
+ B3FFD6B5A8FFFEF8F0FFFFF3E6FFFFF3E6FFFFF0DFFFFFC77AFFFFD298FFFFF2
+ E5FFFFF2E5FFFFF2E5FFFFF2E5FFFFF9F3FFE0C4B8FFBCA09AFFE5E5E5FFFFFF
+ FF00FFFFFF00C09282FFFAEDE2FFFFF5EAFFFFF5EAFFFFF3E5FFFFD39EFFFFDC
+ B4FFFFF5EAFFFFF2E1FFFFBE5BFFFFE9CAFFFFF5EAFFFFF4E9FFFFF9F4FFD0AA
+ 9CFFD8D3D2FFFFFFFF00FFFFFF00E4D1CAFFCFA697FFFCF2EBFFFFF7EFFFFFE0
+ BFFFFFE1C1FFFFF7EFFFFFF4E8FFFFC87CFFFFD59CFFFFF7EFFFFFF7EFFFFFF7
+ EEFFFFF7EEFFDAB9ABFFD7CFCDFFFFFFFF00FFFFFF00FFFFFF00E6D4CCFFD7B4
+ A3FFFCF6F1FFFFF9F1FFFFFAF4FFFFF8EFFFFFD4A1FFFFDEB8FFFFF9F3FFFFF9
+ F3FFFFF9F3FFFFF9F3FFFFF9F3FFD6B3A2FFDAD6D4FFFFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00E9D6CDFFDEBEAEFFFDF8F5FFFFFCF9FFFFE2C3FFFFE3C5FFFFFC
+ F8FFFFFCF8FFFFFCF8FFFAF5F1FFC9ADB1FFE3D3D3FFD8B1A0FFDBD7D5FFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EBD9CFFFE3C5B4FFFDFBF9FFFFFD
+ FAFFFFFEFDFFFFFEFDFFFFFEFDFFFAF7F5FFEFE7E5FFECE0DEFFA892B1FFDAB3
+ 9CFFDFDEDEFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EDDB
+ D1FFE6C8B5FFFDFCFAFFFFFFFFFFFFFFFFFFFFFFFFFFE7D0C5FFF3E8E2FFEFE6
+ E1FFE9E7EDFFDDB59CFFE2E2E2FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00F0DED2FFE9C8B1FFFDF9F8FFFFFFFFFFFFFFFFFFFAEF
+ E7FFCDCABAFFEEF2EEFFFBF6F2FFDDB79FFFEEEEEEFFFFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F3E5D9FFE8C3A8FFEAC7
+ AEFFE8C2A7FFE6C2A7FFE5C2A6FFE4BEA3FFE4C5ADFFEDE1D9FFFBFBFBFFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00
+ }
+ Margin = 3
+ end
+ object BitBtn1: TBitBtn
+ Left = 449
+ Height = 33
+ Top = 134
+ Width = 84
+ AutoSize = True
+ Caption = 'BitBtn1'
+ Glyph.Data = {
+ 46050000424D4605000000000000360000002800000012000000120000000100
+ 2000000000001005000064000000640000000000000000000000FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F8F8
+ F8FFE8E8E8FFE7E7E7FFF6F6F6FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00F8F8F8FFC3ACACFFAF7F7AFFB19594FFDDDDDDFFF6F6F6FFFFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00F8F8F8FFC2AAAAFFC9A298FFFEF1E3FFD6B3A5FFAF9292FFDDDD
+ DDFFF6F6F6FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00F8F8F8FFC2A9A9FFCAA49BFFFEF2E6FFFFEBD5FFFFF5
+ EAFFD6B5A8FFAF9292FFDDDDDDFFF5F5F5FFFFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00F8F8F8FFC4ADABFFCDA99FFFFEF4E8FFFFEC
+ D7FFFFEBD7FFFFEBD7FFFFF5ECFFD8B8ABFFB19391FFDBDADAFFF5F5F5FFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F8F8F8FFC7AFACFFD1ADA2FFFEF5
+ EBFFFFEEDCFFFFEEDCFFFFEEDCFFFFEEDCFFFFEEDCFFFFF7EEFFDBBCAFFFB393
+ 8FFFDBDADAFFF5F5F5FFFFFFFF00FFFFFF00FFFFFF00F8F8F8FFCAB2ADFFD4B2
+ A6FFFEF6EEFFFFF0E1FFFFF0E1FFFFEDD7FFFFBC58FFFFE4C2FFFFF0E0FFFFF0
+ E0FFFFF8F0FFDEC0B4FFB79691FFDCDBDBFFF6F6F6FFFFFFFF00FFFFFF00D1B9
+ B3FFD6B5A8FFFEF8F0FFFFF3E6FFFFF3E6FFFFF0DFFFFFC77AFFFFD298FFFFF2
+ E5FFFFF2E5FFFFF2E5FFFFF2E5FFFFF9F3FFE0C4B8FFBCA09AFFE5E5E5FFFFFF
+ FF00FFFFFF00C09282FFFAEDE2FFFFF5EAFFFFF5EAFFFFF3E5FFFFD39EFFFFDC
+ B4FFFFF5EAFFFFF2E1FFFFBE5BFFFFE9CAFFFFF5EAFFFFF4E9FFFFF9F4FFD0AA
+ 9CFFD8D3D2FFFFFFFF00FFFFFF00E4D1CAFFCFA697FFFCF2EBFFFFF7EFFFFFE0
+ BFFFFFE1C1FFFFF7EFFFFFF4E8FFFFC87CFFFFD59CFFFFF7EFFFFFF7EFFFFFF7
+ EEFFFFF7EEFFDAB9ABFFD7CFCDFFFFFFFF00FFFFFF00FFFFFF00E6D4CCFFD7B4
+ A3FFFCF6F1FFFFF9F1FFFFFAF4FFFFF8EFFFFFD4A1FFFFDEB8FFFFF9F3FFFFF9
+ F3FFFFF9F3FFFFF9F3FFFFF9F3FFD6B3A2FFDAD6D4FFFFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00E9D6CDFFDEBEAEFFFDF8F5FFFFFCF9FFFFE2C3FFFFE3C5FFFFFC
+ F8FFFFFCF8FFFFFCF8FFFAF5F1FFC9ADB1FFE3D3D3FFD8B1A0FFDBD7D5FFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EBD9CFFFE3C5B4FFFDFBF9FFFFFD
+ FAFFFFFEFDFFFFFEFDFFFFFEFDFFFAF7F5FFEFE7E5FFECE0DEFFA892B1FFDAB3
+ 9CFFDFDEDEFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00EDDB
+ D1FFE6C8B5FFFDFCFAFFFFFFFFFFFFFFFFFFFFFFFFFFE7D0C5FFF3E8E2FFEFE6
+ E1FFE9E7EDFFDDB59CFFE2E2E2FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00F0DED2FFE9C8B1FFFDF9F8FFFFFFFFFFFFFFFFFFFAEF
+ E7FFCDCABAFFEEF2EEFFFBF6F2FFDDB79FFFEEEEEEFFFFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00F3E5D9FFE8C3A8FFEAC7
+ AEFFE8C2A7FFE6C2A7FFE5C2A6FFE4BEA3FFE4C5ADFFEDE1D9FFFBFBFBFFFFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00
+ }
+ TabOrder = 1
+ end
+ object ImageList1: TImageList
+ left = 168
+ top = 88
+ Bitmap = {
+ 4C69070000001000000010000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000FF000000FF000000FF000000FF0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000FF000000FF008080FF008080FF000000FF0000
+ 00FF000000FF0000000000000000000000000000000000000000000000FF0000
+ 00FF000000FF000000000000000000000000000000FF000000FF008080FF0080
+ 80FF008080FF000000FF00000000000000000000000000000000000000000000
+ 00FF000000FF00000000000000000000000000000000000000FF008080FF0080
+ 80FF008080FF000000FF0000000000000000000000FF00000000000000000000
+ 00FF000000FF00000000000000000000000000000000000000FF000000FF0080
+ 80FF008080FF000000FF000000FF00000000000000FF000000FF000000FF0000
+ 00FF000000FF000000000000000000000000000000FF000080FF000000FF0000
+ 00FF000000FF008080FF008080FF00000000000000FF000000FF000000FF0000
+ 00FFC0C0C0FF000000FF00000000000000FF000080FF000000FF000000000000
+ 0000000000FF008080FF000000FF000000000000000000000000000000000000
+ 0000000000FFC0C0C0FF000000FF000080FF000000FF00000000000000000000
+ 000000000000000000FF00000000000000000000000000000000000000000000
+ 000000000000000000FFC0C0C0FF000000FF0000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000FF000080FF000000FFC0C0C0FF000000FF00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00FF000080FF000000FF00000000000000FFC0C0C0FF000000FF000000000000
+ 0000000000000000000000000000000000000000000000000000000000FF0000
+ 80FF000000FF000000000000000000000000000000FFC0C0C0FF000000FF0000
+ 00000000000000000000000000000000000000000000000000FF000080FF0000
+ 00FF0000000000000000000000000000000000000000000000FFC0C0C0FF0000
+ 00FF0000000000000000000000000000000000000000000000FF000000FF0000
+ 0000000000000000000000000000000000000000000000000000000000FF0000
+ 00FF000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000FF00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000FF000000FF00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00FFFFFFFFFF000000FF00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000FFFFFF
+ FFFFFFFFFFFF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000FF00000000000000000000000000000000000000FFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFF000000FF00000000000000000000000000000000000000FFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFF000000FF0000000000000000000000000000000000000000000000FFFFFF
+ FFFFFFFFFFFF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000FF0000000000000000000000000000000000000000000000000000
+ 00FFFFFFFFFF000000FF00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000FF000000FF00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000FF00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000FF00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000FF000000FF000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000FFFFFFFFFF000000FF0000
+ 00000000000000000000000000000000000000000000000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000FF000000FFFFFFFFFFFFFFFFFF0000
+ 00FF0000000000000000000000000000000000000000000000FFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFF000000FF00000000000000000000000000000000000000FFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFF000000FF00000000000000000000000000000000000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000FF000000FFFFFFFFFFFFFFFFFF0000
+ 00FF000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000FFFFFFFFFF000000FF0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000FF000000FF000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000FF00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000FF0000
+ 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000000000
+ 0000000000000000000000000000000000000000000000000000000000FFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF000000FF0000
+ 0000000000000000000000000000000000000000000000000000000000FFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFF0000
+ 00FF000000000000000000000000000000000000000000000000000000FFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF000000FF0000
+ 00FF000000FF0000000000000000000000000000000000000000000000FFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFF000000FF0000000000000000000000000000000000000000000000FFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFF000000FF0000000000000000000000000000000000000000000000FFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFF000000FF0000000000000000000000000000000000000000000000FFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFF000000FF0000000000000000000000000000000000000000000000FFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFF000000FF0000000000000000000000000000000000000000000000FFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFF000000FF0000000000000000000000000000000000000000000000FFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFF000000FF0000000000000000000000000000000000000000000000FFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFF000000FF0000000000000000000000000000000000000000000000FF0000
+ 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000FF0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000FF000000FF000000FF000000FF0000
+ 00FF000000FF00000000800000FF000000000000000000000000000000000000
+ 00000000000000000000000000FFC0C0C0FFC0C0C0FFC0C0C0FFC0C0C0FFC0C0
+ C0FFC0C0C0FF000000FF800000FF000000000000000000000000000000000000
+ 000000000000000000FFC0C0C0FF000000FFC0C0C0FFC0C0C0FFC0C0C0FFC0C0
+ C0FFC0C0C0FFC0C0C0FF800000FF00000000000000FF000000FF000000FF0000
+ 00FF000000FFC0C0C0FF000000FFC0C0C0FF000000FFC0C0C0FFC0C0C0FFC0C0
+ C0FFC0C0C0FFC0C0C0FF800000FF00000000000000FFFFFFFFFFFFFFFFFF0000
+ 00FFC0C0C0FF000000FFC0C0C0FF000000FFC0C0C0FF000000FFC0C0C0FFC0C0
+ C0FFC0C0C0FF000000FF800000FF00000000000000FFFFFFFFFF000000FFC0C0
+ C0FF000000FFFFFFFFFF000000FFC0C0C0FF000000FFC0C0C0FF000000FF0000
+ 00FF000000FF00000000800000FF00000000000000FFFFFFFFFF000000FF0000
+ 00FFFFFFFFFFFFFFFFFFFFFFFFFF000000FFC0C0C0FF000000FFFFFFFFFF0000
+ 00FF00000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF0000
+ 00FF00000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000
+ 00FF00000000000000000000000000000000000000FFFFFFFFFF800000FF8000
+ 00FFFFFFFFFF800000FF800000FF800000FF800000FF800000FFFFFFFFFF0000
+ 00FF00000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000
+ 00FF00000000000000000000000000000000000000FFFFFFFFFF800000FF8000
+ 00FFFFFFFFFF800000FF800000FF800000FF800000FF800000FFFFFFFFFF0000
+ 00FF00000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000
+ 00FF00000000000000000000000000000000000000FF000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000FF000000FF000000FF000000FF000000FF000000FF000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000FF008000FF008000FF008000FF008000FF000000FF000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000FF000000FF000000FF000000FF000000FF000000FF000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000800000FF8000
+ 00FF800000FF800000FF800000FF800000FF800000FF800000FF800000FF8000
+ 00FF000000000000000000000000000000000000000000000000800000FFFF00
+ 00FF800000FFFF0000FF000000FFFFFF00FFFFFFFFFFFFFF00FFFFFFFFFF8000
+ 00FF000000000000000000000000000000000000000000000000800000FF8000
+ 00FFFF0000FF800000FF000000FFFFFFFFFFFFFF00FFFFFFFFFFFFFF00FF8000
+ 00FF000000000000000000000000000000000000000000000000800000FFFF00
+ 00FF800000FFFF0000FF000000FFFFFF00FFFFFFFFFFFFFF00FFFFFFFFFF8000
+ 00FF000000000000000000000000000000000000000000000000800000FF8000
+ 00FFFF0000FF800000FF000000FFFFFFFFFFFFFF00FFFFFFFFFFFFFF00FF8000
+ 00FF000000000000000000000000000000000000000000000000800000FFFF00
+ 00FF800000FFFF0000FF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000
+ 00FF000000000000000000000000000000000000000000000000800000FF8000
+ 00FFFF0000FF800000FF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000
+ 00FF000000000000000000000000000000000000000000000000800000FFFF00
+ 00FF800000FF000000FF000000FF808080FFFFFFFFFFFFFFFFFFFFFFFFFF8000
+ 00FF000000000000000000000000800000FF800000FF800000FF800000FF0000
+ 00FF000000FF808080FF808080FF808080FFFFFFFFFFFFFFFFFFFFFFFFFF8000
+ 00FF800000FF800000FF800000FF808080FF808080FF808080FF808080FF8080
+ 80FF808080FF808080FF808080FF808080FF808080FF808080FFFFFFFFFF8080
+ 80FFFFFFFFFF808080FF808080FF808000FF808080FF808080FF808080FF8080
+ 80FF808080FF808080FF808080FF808080FF808080FFFFFFFFFFC0C0C0FF8080
+ 80FFC0C0C0FFFFFFFFFF808080FF000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000FF000000FF000000FF000000FF000000FF0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000FF000000FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000
+ 00FF000000FF0000000000000000000000000000000000000000000000000000
+ 00FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF
+ FFFF00FFFFFF000000FF00000000000000000000000000000000000000FF00FF
+ FFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF
+ FFFF00FFFFFF00FFFFFF000000FF000000000000000000000000000000FF00FF
+ FFFF00FFFFFF000000FF000000FF00FFFFFF00FFFFFF00FFFFFF000000FF0000
+ 00FF00FFFFFF00FFFFFF000000FF0000000000000000000000FF00FFFFFF00FF
+ FFFF00FFFFFF000000FF000000FF00FFFFFF00FFFFFF00FFFFFF000000FF0000
+ 00FF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000FF00FFFFFF00FF
+ FFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF
+ FFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000FF00FFFFFF00FF
+ FFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF
+ FFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000FF00FFFFFF00FF
+ FFFF000000FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF
+ FFFF000000FF00FFFFFF00FFFFFF0000000000000000000000FF00FFFFFF00FF
+ FFFF00FFFFFF000000FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000
+ 00FF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000FF00FF
+ FFFF00FFFFFF00FFFFFF000000FF000000FF000000FF000000FF000000FF00FF
+ FFFF00FFFFFF00FFFFFF000000FF000000000000000000000000000000FF00FF
+ FFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF
+ FFFF00FFFFFF00FFFFFF000000FF000000000000000000000000000000000000
+ 00FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF
+ FFFF00FFFFFF000000FF00000000000000000000000000000000000000000000
+ 0000000000FF000000FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000
+ 00FF000000FF0000000000000000
+ }
+ end
+ object ActionList1: TActionList
+ Images = ImageList1
+ left = 216
+ top = 40
+ object actNew: TAction
+ Caption = 'New'
+ Hint = 'Action N 1'
+ ImageIndex = 3
+ end
+ object actNext: TAction
+ Caption = 'Next'
+ Hint = 'Action N 2'
+ ImageIndex = 2
+ OnExecute = Action1Execute
+ end
+ object actPrior: TAction
+ Caption = 'Prior'
+ Hint = 'Prior action'
+ ImageIndex = 1
+ OnExecute = Action1Execute
+ end
+ object actCustom: TAction
+ Caption = 'Custom'
+ Hint = 'Customize toolbar'
+ ImageIndex = 0
+ OnExecute = actCustomExecute
+ end
+ object actExit: TAction
+ Caption = 'Exit'
+ Hint = 'exit from demo application'
+ ImageIndex = 5
+ OnExecute = actExitExecute
+ ShortCut = 32856
+ end
+ object actSysMenu: TAction
+ Tag = 4
+ Caption = 'System'
+ ImageIndex = 4
+ end
+ object sysAbout: TAction
+ Category = 'System'
+ Caption = 'About'
+ ImageIndex = 6
+ OnExecute = sysAboutExecute
+ end
+ end
+ object XMLPropStorage1: TXMLPropStorage
+ StoredValues = <>
+ FileName = 'toolbardemo.cfg'
+ left = 216
+ top = 88
+ end
+ object PopupMenu1: TPopupMenu
+ Images = ImageList1
+ left = 16
+ top = 40
+ object MenuItem1: TMenuItem
+ Action = actNew
+ Bitmap.Data = {
+ 36040000424D3604000000000000360000002800000010000000100000000100
+ 2000000000000004000064000000640000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
+ 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF0000000000000000000000000000
+ 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF0000000000000000000000000000
+ 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF0000000000000000000000000000
+ 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF0000000000000000000000000000
+ 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF0000000000000000000000000000
+ 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF0000000000000000000000000000
+ 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF0000000000000000000000000000
+ 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF0000000000000000000000000000
+ 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFF000000FF000000FF000000FF000000FF0000000000000000000000000000
+ 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFF000000FFFFFFFFFF000000FF000000000000000000000000000000000000
+ 000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFF000000FF000000FF00000000000000000000000000000000000000000000
+ 000000000000000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FF000000FF0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000
+ }
+ end
+ object MenuItem2: TMenuItem
+ Caption = '-'
+ end
+ object MenuItem4: TMenuItem
+ Action = actNext
+ Bitmap.Data = {
+ 36040000424D3604000000000000360000002800000010000000100000000100
+ 2000000000000004000064000000640000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00FF000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00FF000000FF0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00FFFFFFFFFF000000FF00000000000000000000000000000000000000000000
+ 0000000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FFFFFFFFFFFFFFFFFF000000FF000000000000000000000000000000000000
+ 0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF0000000000000000000000000000
+ 0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF0000000000000000000000000000
+ 0000000000FF000000FF000000FF000000FF000000FF000000FF000000FF0000
+ 00FFFFFFFFFFFFFFFFFF000000FF000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00FFFFFFFFFF000000FF00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00FF000000FF0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00FF000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000
+ }
+ OnClick = Action1Execute
+ end
+ object MenuItem3: TMenuItem
+ Action = actPrior
+ Bitmap.Data = {
+ 36040000424D3604000000000000360000002800000010000000100000000100
+ 2000000000000004000064000000640000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000FF00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000FF000000FF00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000FFFFFFFFFF000000FF00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000FFFFFFFFFFFFFFFFFF000000FF000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
+ 0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF0000000000000000000000000000
+ 0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF0000000000000000000000000000
+ 000000000000000000FFFFFFFFFFFFFFFFFF000000FF000000FF000000FF0000
+ 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
+ 00000000000000000000000000FFFFFFFFFF000000FF00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000FF000000FF00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000FF00000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000
+ }
+ OnClick = Action1Execute
+ end
+ object MenuItem8: TMenuItem
+ Caption = '-'
+ end
+ object MenuItem9: TMenuItem
+ Action = actCustom
+ Bitmap.Data = {
+ 36040000424D3604000000000000360000002800000010000000100000000100
+ 2000000000000004000064000000640000000000000000000000000000000000
+ 0000000000FF000000FF00000000000000000000000000000000000000000000
+ 000000000000000000FF000000FF000000000000000000000000000000000000
+ 0000000000FF000080FF000000FF000000000000000000000000000000000000
+ 0000000000FFC0C0C0FF000000FF000000000000000000000000000000000000
+ 000000000000000000FF000080FF000000FF0000000000000000000000000000
+ 00FFC0C0C0FF000000FF00000000000000000000000000000000000000000000
+ 00000000000000000000000000FF000080FF000000FF00000000000000FFC0C0
+ C0FF000000FF0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000FF000080FF000000FFC0C0C0FF0000
+ 00FF000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000FFC0C0C0FF000000FF0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000FFC0C0C0FF000000FF000080FF0000
+ 00FF00000000000000000000000000000000000000FF00000000000000000000
+ 00FF000000FF000000FF000000FFC0C0C0FF000000FF00000000000000FF0000
+ 80FF000000FF0000000000000000000000FF008080FF000000FF000000000000
+ 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
+ 00FF000080FF000000FF000000FF000000FF008080FF008080FF000000000000
+ 00FF0000000000000000000000FF000000FF0000000000000000000000000000
+ 0000000000FF000000FF008080FF008080FF000000FF000000FF000000000000
+ 00000000000000000000000000FF000000FF0000000000000000000000000000
+ 0000000000FF008080FF008080FF008080FF000000FF00000000000000000000
+ 000000000000000000FF000000FF000000FF0000000000000000000000000000
+ 00FF000000FF008080FF008080FF008080FF000000FF00000000000000000000
+ 00000000000000000000000000000000000000000000000000FF000000FF0080
+ 80FF008080FF000000FF000000FF000000FF0000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000FF0000
+ 00FF000000FF000000FF00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000
+ }
+ OnClick = actCustomExecute
+ end
+ object MenuItem7: TMenuItem
+ Action = sysAbout
+ Bitmap.Data = {
+ 36040000424D3604000000000000360000002800000010000000100000000100
+ 2000000000000004000064000000640000000000000000000000000000000000
+ 0000000000000000000000000000000000FF000000FF00FFFFFF00FFFFFF00FF
+ FFFF00FFFFFF00FFFFFF000000FF000000FF0000000000000000000000000000
+ 00000000000000000000000000FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF
+ FFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF00000000000000000000
+ 000000000000000000FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF
+ FFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF000000000000
+ 000000000000000000FF00FFFFFF00FFFFFF00FFFFFF000000FF000000FF0000
+ 00FF000000FF000000FF00FFFFFF00FFFFFF00FFFFFF000000FF000000000000
+ 0000000000FF00FFFFFF00FFFFFF00FFFFFF000000FF00FFFFFF00FFFFFF00FF
+ FFFF00FFFFFF00FFFFFF000000FF00FFFFFF00FFFFFF00FFFFFF000000000000
+ 0000000000FF00FFFFFF00FFFFFF000000FF00FFFFFF00FFFFFF00FFFFFF00FF
+ FFFF00FFFFFF00FFFFFF00FFFFFF000000FF00FFFFFF00FFFFFF000000000000
+ 0000000000FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF
+ FFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000
+ 0000000000FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF
+ FFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000000000
+ 0000000000FF00FFFFFF00FFFFFF00FFFFFF000000FF000000FF00FFFFFF00FF
+ FFFF00FFFFFF000000FF000000FF00FFFFFF00FFFFFF00FFFFFF000000000000
+ 000000000000000000FF00FFFFFF00FFFFFF000000FF000000FF00FFFFFF00FF
+ FFFF00FFFFFF000000FF000000FF00FFFFFF00FFFFFF000000FF000000000000
+ 000000000000000000FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF
+ FFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF000000000000
+ 00000000000000000000000000FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FF
+ FFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000FF00000000000000000000
+ 0000000000000000000000000000000000FF000000FF00FFFFFF00FFFFFF00FF
+ FFFF00FFFFFF00FFFFFF000000FF000000FF0000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000FF000000FF0000
+ 00FF000000FF000000FF00000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000
+ }
+ OnClick = sysAboutExecute
+ end
+ object MenuItem6: TMenuItem
+ Caption = '-'
+ end
+ object MenuItem5: TMenuItem
+ Action = actExit
+ Bitmap.Data = {
+ 36040000424D3604000000000000360000002800000010000000100000000100
+ 2000000000000004000064000000640000000000000000000000808000FF8080
+ 80FF808080FF808080FF808080FF808080FF808080FF808080FF808080FF8080
+ 80FFFFFFFFFFC0C0C0FF808080FFC0C0C0FFFFFFFFFF808080FF808080FF8080
+ 80FF808080FF808080FF808080FF808080FF808080FF808080FF808080FF8080
+ 80FF808080FFFFFFFFFF808080FFFFFFFFFF808080FF808080FF800000FF8000
+ 00FF800000FF800000FF000000FF000000FF808080FF808080FF808080FFFFFF
+ FFFFFFFFFFFFFFFFFFFF800000FF800000FF800000FF800000FF000000000000
+ 000000000000800000FFFF0000FF800000FF000000FF000000FF808080FFFFFF
+ FFFFFFFFFFFFFFFFFFFF800000FF000000000000000000000000000000000000
+ 000000000000800000FF800000FFFF0000FF800000FF000000FFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFF800000FF000000000000000000000000000000000000
+ 000000000000800000FFFF0000FF800000FFFF0000FF000000FFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFF800000FF000000000000000000000000000000000000
+ 000000000000800000FF800000FFFF0000FF800000FF000000FFFFFFFFFFFFFF
+ 00FFFFFFFFFFFFFF00FF800000FF000000000000000000000000000000000000
+ 000000000000800000FFFF0000FF800000FFFF0000FF000000FFFFFF00FFFFFF
+ FFFFFFFF00FFFFFFFFFF800000FF000000000000000000000000000000000000
+ 000000000000800000FF800000FFFF0000FF800000FF000000FFFFFFFFFFFFFF
+ 00FFFFFFFFFFFFFF00FF800000FF000000000000000000000000000000000000
+ 000000000000800000FFFF0000FF800000FFFF0000FF000000FFFFFF00FFFFFF
+ FFFFFFFF00FFFFFFFFFF800000FF000000000000000000000000000000000000
+ 000000000000800000FF800000FF800000FF800000FF800000FF800000FF8000
+ 00FF800000FF800000FF800000FF000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000FF000000FF000000FF000000FF0000
+ 00FF000000FF0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000FF008000FF008000FF008000FF0080
+ 00FF000000FF0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000FF000000FF000000FF000000FF0000
+ 00FF000000FF0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000
+ }
+ OnClick = actExitExecute
+ end
+ end
+ object PopupMenu2: TPopupMenu
+ Images = ImageList1
+ left = 168
+ top = 40
+ object MenuItem10: TMenuItem
+ Caption = 'Item 1'
+ end
+ object MenuItem11: TMenuItem
+ Caption = 'Item 2'
+ end
+ object MenuItem12: TMenuItem
+ Caption = 'Item 3'
+ end
+ object MenuItem13: TMenuItem
+ Caption = 'Item 4'
+ end
+ end
+end
diff --git a/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/unit1.pas b/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/unit1.pas
new file mode 100644
index 000000000..a0049595d
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/Demos/ToolPanel/unit1.pas
@@ -0,0 +1,89 @@
+unit Unit1;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
+ Buttons, StdCtrls, rxtoolbar, ActnList, XMLPropStorage, Menus;
+
+
+type
+ { TMainForm }
+
+ TMainForm = class(TForm)
+ actExit: TAction;
+ actSysMenu: TAction;
+ BitBtn1: TBitBtn;
+ MenuItem10: TMenuItem;
+ MenuItem11: TMenuItem;
+ MenuItem12: TMenuItem;
+ MenuItem13: TMenuItem;
+ MenuItem6: TMenuItem;
+ MenuItem7: TMenuItem;
+ PopupMenu2: TPopupMenu;
+ SpeedButton1: TSpeedButton;
+ sysAbout: TAction;
+ actNew: TAction;
+ actNext: TAction;
+ actPrior: TAction;
+ actCustom: TAction;
+ ActionList1: TActionList;
+ ImageList1: TImageList;
+ MenuItem1: TMenuItem;
+ MenuItem2: TMenuItem;
+ MenuItem3: TMenuItem;
+ MenuItem4: TMenuItem;
+ MenuItem5: TMenuItem;
+ MenuItem8: TMenuItem;
+ MenuItem9: TMenuItem;
+ PopupMenu1: TPopupMenu;
+ ToolPanel1: TToolPanel;
+ XMLPropStorage1: TXMLPropStorage;
+ procedure Action1Execute(Sender: TObject);
+ procedure actCustomExecute(Sender: TObject);
+ procedure actExitExecute(Sender: TObject);
+ procedure sysAboutExecute(Sender: TObject);
+ private
+ //
+ public
+ { public declarations }
+ end;
+
+var
+ MainForm: TMainForm;
+
+
+implementation
+uses AboutUnit;
+
+{$R *.lfm}
+
+{ TMainForm }
+
+procedure TMainForm.Action1Execute(Sender: TObject);
+begin
+ ShowMessage('Hi');
+end;
+
+procedure TMainForm.actCustomExecute(Sender: TObject);
+begin
+ ToolPanel1.Customize(0);
+end;
+
+
+procedure TMainForm.actExitExecute(Sender: TObject);
+begin
+ Close;
+end;
+
+procedure TMainForm.sysAboutExecute(Sender: TObject);
+begin
+ AboutForm:=TAboutForm.Create(Application);
+ AboutForm.ShowModal;
+ AboutForm.Free;
+end;
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/RxMDICloseIcon.lrs b/components/rx/version/v2.2_laz_1.2/RxMDICloseIcon.lrs
new file mode 100644
index 000000000..2370b4d98
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/RxMDICloseIcon.lrs
@@ -0,0 +1,7 @@
+LazarusResources.Add('RxMDICloseIcon','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#11#0#0#0#11#1#3#0#0#0#147'b'#229'e'
+ +#0#0#0#3'sBIT'#8#8#8#219#225'O'#224#0#0#0#6'PLTE'#0#0#0#0#0#0#165'g'#185#207
+ +#0#0#0#1'tRNS'#0'@'#230#216'f'#0#0#0#9'pHYs'#0#0#14#196#0#0#14#196#1#149'+'
+ +#14#27#0#0#0' IDAT'#8#153'c`'#16'g'#0#2#131#3#12#146#13#12#252'l'#12'l'#12#12
+ +#252#12' 6P'#4#12#0'7r'#3'T'#179'3'#141'G'#0#0#0#0'IEND'#174'B`'#130
+]);
diff --git a/components/rx/version/v2.2_laz_1.2/WinXP.manifest b/components/rx/version/v2.2_laz_1.2/WinXP.manifest
new file mode 100644
index 000000000..11b1be573
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/WinXP.manifest
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/components/rx/version/v2.2_laz_1.2/WindowsXP.RES b/components/rx/version/v2.2_laz_1.2/WindowsXP.RES
new file mode 100644
index 000000000..909fc7de1
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/WindowsXP.RES differ
diff --git a/components/rx/version/v2.2_laz_1.2/WindowsXP.rc b/components/rx/version/v2.2_laz_1.2/WindowsXP.rc
new file mode 100644
index 000000000..c3847ff82
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/WindowsXP.rc
@@ -0,0 +1 @@
+1 24 "WinXP.manifest"
diff --git a/components/rx/version/v2.2_laz_1.2/autopanel.pas b/components/rx/version/v2.2_laz_1.2/autopanel.pas
new file mode 100644
index 000000000..73319dac9
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/autopanel.pas
@@ -0,0 +1,216 @@
+{ AutoPanel unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit AutoPanel;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ SysUtils, Classes, LCLType, ExtCtrls;
+type
+
+ TPlacement = packed record
+ Left, Top, Width, Height: Integer;
+ end;
+
+ PIntArray = ^TRectArray;
+ TRectArray = array[0..4096] of TPlacement;
+
+ TAutoPanel = class(TPanel)
+ private
+ { Private declarations }
+ protected
+ { Protected declarations }
+ pWidth :Integer;
+ pHeight:Integer;
+ FAutoChildPosLeft : Boolean;
+ FAutoChildPosTop : Boolean;
+ FAutoChildWidth : Boolean;
+ FAutoChildHeight : Boolean;
+ PCtrlsCoordArr:PIntArray;
+ public
+ { Public declarations }
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure Loaded; override;
+ procedure Resize; override;
+ published
+ { Published declarations }
+ property AutoChildPosLeft : Boolean read FAutoChildPosLeft write FAutoChildPosLeft default False;
+ property AutoChildPosTop : Boolean read FAutoChildPosTop write FAutoChildPosTop default False;
+ property AutoChildWidth : Boolean read FAutoChildWidth write FAutoChildWidth default False;
+ property AutoChildHeight : Boolean read FAutoChildHeight write FAutoChildHeight default False;
+
+ property Align;
+ property Alignment;
+ property BevelInner;
+ property BevelOuter;
+ property BevelWidth;
+ property BorderWidth;
+ property BorderStyle;
+ property DragCursor;
+ property DragMode;
+ property Enabled;
+ property Caption;
+ property Color;
+ property Font;
+ //property Locked;
+ property ParentColor;
+ property ParentFont;
+ property ParentShowHint;
+ property PopupMenu;
+ property ShowHint;
+ property TabOrder;
+ property TabStop;
+ property Visible;
+
+ property OnClick;
+ property OnDblClick;
+ property OnDragDrop;
+ property OnDragOver;
+ property OnEndDrag;
+ property OnEnter;
+ property OnExit;
+ property OnMouseDown;
+ property OnMouseMove;
+ property OnMouseUp;
+ property OnMouseWheel;
+ property OnMouseWheelDown;
+ property OnMouseWheelUp;
+ property OnResize;
+ property OnStartDrag;
+
+ property Anchors;
+ property AutoSize;
+ //property BiDiMode;
+ property Constraints;
+ property UseDockManager default True;
+ property DockSite;
+ property DragKind;
+ property FullRepaint;
+ //property ParentBiDiMode;
+
+ //property OnCanResize;
+ property OnConstrainedResize;
+ property OnDockDrop;
+ property OnDockOver;
+ property OnEndDock;
+ property OnGetSiteInfo;
+ property OnStartDock;
+ property OnUnDock;
+ end;
+
+//procedure Register;
+
+implementation
+
+//--------------------------------------
+constructor TAutoPanel.Create(AOwner: TComponent);
+begin
+ inherited;
+ FAutoChildPosLeft := False;
+ FAutoChildPosTop := False;
+ FAutoChildWidth := False;
+ FAutoChildHeight := False;
+ pWidth := -1;
+ pHeight := -1;
+ PCtrlsCoordArr := nil;
+end;
+
+
+destructor TAutoPanel.Destroy;
+begin
+ inherited;
+ FreeMem(PCtrlsCoordArr);
+end;
+
+procedure TAutoPanel.Loaded;
+var i:Integer;
+begin
+ inherited Loaded;
+ if (csDesigning in ComponentState) then Exit;
+
+ if (pWidth = -1) and (pHeight = -1) then begin
+ GetMem(PCtrlsCoordArr, ControlCount * sizeof(TRect));
+ for i := 0 to ControlCount - 1 do begin
+ PCtrlsCoordArr^[i].Left := Controls[i].Left;
+ PCtrlsCoordArr^[i].Top := Controls[i].Top;
+ PCtrlsCoordArr^[i].Width := Controls[i].Width;
+ PCtrlsCoordArr^[i].Height := Controls[i].Height;
+ end;
+ pWidth := Width;
+ pHeight := Height;
+ end;
+end;
+
+procedure TAutoPanel.Resize;
+var I:Integer;
+begin
+ inherited;
+ if (csDesigning in ComponentState) then Exit;
+ if not (AutoChildPosLeft or AutoChildWidth or AutoChildPosTop or AutoChildHeight) then Exit;
+ try
+ for i := 0 to ControlCount - 1 do
+ begin
+ if(AutoChildPosLeft = true) then
+ if (AutoChildWidth = true) then
+ begin
+ Controls[i].Left := MulDiv (PCtrlsCoordArr^[i].Left,Width,pWidth);
+ Controls[i].Width := MulDiv (PCtrlsCoordArr^[i].Width,Width,pWidth);
+ end
+ else
+ Controls[i].Left := Round(
+ PCtrlsCoordArr^[i].Left * Width / pWidth +
+ ((PCtrlsCoordArr^[i].Width) * Width / pWidth -
+ (PCtrlsCoordArr^[i].Width))/2
+ );
+
+ if(AutoChildPosTop = true) then
+ if (AutoChildHeight = true) then
+ begin
+ Controls[i].Top := MulDiv (PCtrlsCoordArr^[i].Top,Height,pHeight);
+ Controls[i].Height := MulDiv (PCtrlsCoordArr^[i].Height,Height,pHeight);
+ end
+ else
+ Controls[i].Top := Round(
+ PCtrlsCoordArr^[i].Top * Height / pHeight +
+ ((PCtrlsCoordArr^[i].Height) * Height / pHeight -
+ (PCtrlsCoordArr^[i].Height))/2
+ );
+ end;
+ finally
+ end;
+end;
+//--------------------------------------
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/boxprocs.pas b/components/rx/version/v2.2_laz_1.2/boxprocs.pas
new file mode 100644
index 000000000..9dfe466cc
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/boxprocs.pas
@@ -0,0 +1,326 @@
+{ boxprocs unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit boxprocs;
+
+{$I rx.inc}
+
+interface
+
+uses Classes, Controls, StdCtrls;
+const
+ LB_ERR = -1;
+
+procedure BoxMoveSelectedItems(SrcList, DstList: TWinControl);
+procedure BoxMoveAllItems(SrcList, DstList: TWinControl);
+procedure BoxDragOver(List: TWinControl; Source: TObject;
+ X, Y: Integer; State: TDragState; var Accept: Boolean; Sorted: Boolean);
+procedure BoxMoveFocusedItem(List: TWinControl; DstIndex: Integer);
+
+procedure BoxMoveSelected(List: TWinControl; Items: TStrings);
+procedure BoxSetItem(List: TWinControl; Index: Integer);
+function BoxGetFirstSelection(List: TWinControl): Integer;
+function BoxCanDropItem(List: TWinControl; X, Y: Integer;
+ var DragIndex: Integer): Boolean;
+
+implementation
+
+uses LCLIntf, Graphics;
+
+function BoxItems(List: TWinControl): TStrings;
+begin
+ if List is TCustomListBox then
+ Result := TCustomListBox(List).Items
+{ else if List is TRxCustomListBox then
+ Result := TRxCustomListBox(List).Items}
+ else Result := nil;
+end;
+
+function BoxGetSelected(List: TWinControl; Index: Integer): Boolean;
+begin
+ if List is TCustomListBox then
+ begin
+ if TCustomListBox(List).MultiSelect then
+ Result := TCustomListBox(List).Selected[Index]
+ else
+ Result := TCustomListBox(List).ItemIndex = Index
+ end
+{ else if List is TRxCustomListBox then
+ Result := TRxCustomListBox(List).Selected[Index]}
+ else Result := False;
+end;
+
+procedure BoxSetSelected(List: TWinControl; Index: Integer; Value: Boolean);
+begin
+ if List is TCustomListBox then
+ TCustomListBox(List).Selected[Index] := Value
+{ else if List is TRxCustomListBox then
+ TRxCustomListBox(List).Selected[Index] := Value;}
+end;
+
+function BoxGetItemIndex(List: TWinControl): Integer;
+begin
+ if List is TCustomListBox then
+ Result := TCustomListBox(List).ItemIndex
+{ else if List is TRxCustomListBox then
+ Result := TRxCustomListBox(List).ItemIndex}
+ else Result := -1;
+end;
+
+{$IFNDEF WIN32}
+{function BoxGetCanvas(List: TWinControl): TCanvas;
+begin
+ if List is TCustomListBox then
+ Result := TCustomListBox(List).Canvas
+ else if List is TRxCustomListBox then
+ Result := TRxCustomListBox(List).Canvas
+ else Result := nil;
+end;
+}
+{$ENDIF}
+
+procedure BoxSetItemIndex(List: TWinControl; Index: Integer);
+begin
+ if List is TCustomListBox then
+ TCustomListBox(List).ItemIndex := Index
+{ else if List is TRxCustomListBox then
+ TRxCustomListBox(List).ItemIndex := Index;}
+end;
+
+function BoxMultiSelect(List: TWinControl): Boolean;
+begin
+ if List is TCustomListBox then
+ Result := TListBox(List).MultiSelect
+{ else if List is TRxCustomListBox then
+ Result := TRxCheckListBox(List).MultiSelect}
+ else Result := False;
+end;
+
+function BoxSelCount(List: TWinControl): Integer;
+begin
+ if List is TCustomListBox then
+ Result := TCustomListBox(List).SelCount
+{ else if List is TRxCustomListBox then
+ Result := TRxCustomListBox(List).SelCount}
+ else Result := 0;
+end;
+
+function BoxItemAtPos(List: TWinControl; Pos: TPoint;
+ Existing: Boolean): Integer;
+begin
+ if List is TCustomListBox then
+ Result := TCustomListBox(List).ItemAtPos(Pos, Existing)
+{ else if List is TRxCustomListBox then
+ Result := TRxCustomListBox(List).ItemAtPos(Pos, Existing)}
+ else Result := LB_ERR;
+end;
+
+function BoxItemRect(List: TWinControl; Index: Integer): TRect;
+begin
+ if List is TCustomListBox then
+ Result := TCustomListBox(List).ItemRect(Index)
+{ else if List is TRxCustomListBox then
+ Result := TRxCustomListBox(List).ItemRect(Index)}
+ else FillChar(Result, SizeOf(Result), 0);
+end;
+
+procedure BoxMoveSelected(List: TWinControl; Items: TStrings);
+var
+ I: Integer;
+begin
+ if BoxItems(List) = nil then Exit;
+ I := 0;
+ while I < BoxItems(List).Count do begin
+ if BoxGetSelected(List, I) then begin
+ Items.AddObject(BoxItems(List).Strings[I], BoxItems(List).Objects[I]);
+ BoxItems(List).Delete(I);
+ end
+ else Inc(I);
+ end;
+end;
+
+function BoxGetFirstSelection(List: TWinControl): Integer;
+var
+ I: Integer;
+begin
+ Result := LB_ERR;
+ if BoxItems(List) = nil then Exit;
+ for I := 0 to BoxItems(List).Count - 1 do begin
+ if BoxGetSelected(List, I) then begin
+ Result := I;
+ Exit;
+ end;
+ end;
+ Result := LB_ERR;
+end;
+
+procedure BoxSetItem(List: TWinControl; Index: Integer);
+var
+ MaxIndex: Integer;
+begin
+ if BoxItems(List) = nil then Exit;
+ with List do begin
+ if CanFocus then SetFocus;
+ MaxIndex := BoxItems(List).Count - 1;
+ if Index = LB_ERR then Index := 0
+ else if Index > MaxIndex then Index := MaxIndex;
+ if Index >= 0 then begin
+ if BoxMultiSelect(List) then BoxSetSelected(List, Index, True)
+ else BoxSetItemIndex(List, Index);
+ end;
+ end;
+end;
+
+procedure BoxMoveSelectedItems(SrcList, DstList: TWinControl);
+var
+ Index, I, NewIndex: Integer;
+begin
+ Index := BoxGetFirstSelection(SrcList);
+ if Index <> LB_ERR then
+ begin
+ BoxItems(SrcList).BeginUpdate;
+ BoxItems(DstList).BeginUpdate;
+ try
+ I := 0;
+ while I < BoxItems(SrcList).Count do
+ begin
+ if BoxGetSelected(SrcList, I) then
+ begin
+ NewIndex := BoxItems(DstList).AddObject(BoxItems(SrcList).Strings[I],
+ BoxItems(SrcList).Objects[I]);
+{ if (SrcList is TRxCheckListBox) and (DstList is TRxCheckListBox) then
+ begin
+ TRxCheckListBox(DstList).State[NewIndex] :=
+ TRxCheckListBox(SrcList).State[I];
+ end;}
+ BoxItems(SrcList).Delete(I);
+ end
+ else Inc(I);
+ end;
+ BoxSetItem(SrcList, Index);
+ finally
+ BoxItems(SrcList).EndUpdate;
+ BoxItems(DstList).EndUpdate;
+ end;
+ end;
+end;
+
+procedure BoxMoveAllItems(SrcList, DstList: TWinControl);
+var
+ I, NewIndex: Integer;
+begin
+ for I := 0 to BoxItems(SrcList).Count - 1 do begin
+ NewIndex := BoxItems(DstList).AddObject(BoxItems(SrcList)[I],
+ BoxItems(SrcList).Objects[I]);
+{ if (SrcList is TRxCheckListBox) and (DstList is TRxCheckListBox) then
+ begin
+ TRxCheckListBox(DstList).State[NewIndex] :=
+ TRxCheckListBox(SrcList).State[I];
+ end;}
+ end;
+ BoxItems(SrcList).Clear;
+ BoxSetItem(SrcList, 0);
+end;
+
+function BoxCanDropItem(List: TWinControl; X, Y: Integer;
+ var DragIndex: Integer): Boolean;
+var
+ Focused: Integer;
+begin
+ Result := False;
+{ if (BoxSelCount(List) = 1) or (not BoxMultiSelect(List)) then begin
+ Focused := BoxGetItemIndex(List);
+ if Focused <> LB_ERR then begin
+ DragIndex := BoxItemAtPos(List, Point(X, Y), True);
+ if (DragIndex >= 0) and (DragIndex <> Focused) then begin
+ Result := True;
+ end;
+ end;
+ end;}
+end;
+
+procedure BoxDragOver(List: TWinControl; Source: TObject;
+ X, Y: Integer; State: TDragState; var Accept: Boolean; Sorted: Boolean);
+var
+ DragIndex: Integer;
+ R: TRect;
+(*
+ procedure DrawItemFocusRect(Idx: Integer);
+{$IFDEF WIN32}
+ var
+ P: TPoint;
+ DC: HDC;
+{$ENDIF}
+ begin
+ R := BoxItemRect(List, Idx);
+{$IFDEF WIN32}
+ P := List.ClientToScreen(R.TopLeft);
+ R := Bounds(P.X, P.Y, R.Right - R.Left, R.Bottom - R.Top);
+ DC := GetDC(0);
+ DrawFocusRect(DC, R);
+ ReleaseDC(0, DC);
+{$ELSE}
+ BoxGetCanvas(List).DrawFocusRect(R);
+{$ENDIF}
+ end;
+*)
+begin
+{ if Source <> List then
+ Accept := (Source is TWinControl) or (Source is TRxCustomListBox)
+ else begin
+ if Sorted then Accept := False
+ else begin
+ Accept := BoxCanDropItem(List, X, Y, DragIndex);
+ if ((List.Tag - 1) = DragIndex) and (DragIndex >= 0) then begin
+ if State = dsDragLeave then begin
+ DrawItemFocusRect(List.Tag - 1);
+ List.Tag := 0;
+ end;
+ end
+ else begin
+ if List.Tag > 0 then DrawItemFocusRect(List.Tag - 1);
+ if DragIndex >= 0 then DrawItemFocusRect(DragIndex);
+ List.Tag := DragIndex + 1;
+ end;
+ end;
+ end;}
+end;
+
+procedure BoxMoveFocusedItem(List: TWinControl; DstIndex: Integer);
+begin
+ if (DstIndex >= 0) and (DstIndex < BoxItems(List).Count) then
+ if (DstIndex <> BoxGetItemIndex(List)) then begin
+ BoxItems(List).Move(BoxGetItemIndex(List), DstIndex);
+ BoxSetItem(List, DstIndex);
+ end;
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/curredit.pas b/components/rx/version/v2.2_laz_1.2/curredit.pas
new file mode 100644
index 000000000..ecd483632
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/curredit.pas
@@ -0,0 +1,679 @@
+{ curredit unit
+
+ Copyright (C) 2005-2014 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit curredit;
+
+{$I rx.inc}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, LMessages,
+ MaskEdit;
+
+type
+
+ { TCustomNumEdit }
+
+ TCustomNumEdit = class(TCustomMaskEdit)
+ private
+ FFocusedDisplay: boolean;
+ FBeepOnError: Boolean;
+ FCheckOnExit: Boolean;
+ FDecimalPlaces: Cardinal;
+ FDisplayFormat: string;
+// FFormatOnEditing: Boolean;
+ FFormatting: Boolean;
+ FMaxValue: Extended;
+ FMinValue: Extended;
+ FValue: Extended;
+ FFocused: Boolean;
+ FZeroEmpty: Boolean;
+ function GetAsInteger: Longint;
+ function GetIsNull: boolean;
+ function GetText: string;
+ function GetValue: Extended;
+ procedure SetAsInteger(const AValue: Longint);
+ procedure SetBeepOnError(const AValue: Boolean);
+ procedure SetDecimalPlaces(const AValue: Cardinal);
+ procedure SetDisplayFormat(const AValue: string);
+// procedure SetFormatOnEditing(const AValue: Boolean);
+ procedure SetMaxValue(const AValue: Extended);
+ procedure SetMinValue(const AValue: Extended);
+ procedure SetText(const AValue: string);
+ procedure SetValue(const AValue: Extended);
+ procedure SetZeroEmpty(const AValue: Boolean);
+ function TextToValText(const AValue: string): string;
+ function CheckValue(NewValue: Extended; RaiseOnError: Boolean): Extended;
+// procedure SetFocused(Value: Boolean);
+ protected
+ //messages
+{ procedure CMEnabledChanged(var Message: TLMessage); message CM_ENABLEDCHANGED;
+ procedure CMEnter(var Message: TLMEnter); message LM_ENTER;
+ procedure WMExit(var Message: TLMExit); message LM_EXIT; }
+
+ procedure WMSetFocus(var Message: TLMSetFocus); message LM_SETFOCUS;
+ procedure WMKillFocus(var Message: TLMKillFocus); message LM_KILLFOCUS;
+
+// procedure CMFontChanged(var Message: TLMessage); message CM_FONTCHANGED;
+// procedure WMPaint(var Message: TLMPaint); message LM_PAINT;
+ procedure WMPaste(var Message: TLMessage); message LM_PASTE;
+// procedure GetSel(var ASelStart: Integer; var SelStop: Integer);
+{ procedure DoEnter; override;
+ procedure DoExit; override;}
+// procedure AcceptValue(const Value: Variant); override;
+
+// procedure Change; override;
+// procedure ReformatEditText; dynamic;
+ procedure DataChanged; virtual;
+ procedure KeyPress(var Key: Char); override;
+ function IsValidChar(Key: Char): Boolean; virtual;
+ function FormatDisplayText(Value: Extended): string;
+ function GetDisplayText: string; virtual;
+ procedure Reset; override;
+ procedure CheckRange;
+ procedure UpdateData;
+ property Formatting: Boolean read FFormatting;
+ property BeepOnError: Boolean read FBeepOnError write SetBeepOnError
+ default True;
+ property CheckOnExit: Boolean read FCheckOnExit write FCheckOnExit default False;
+ property DecimalPlaces: Cardinal read FDecimalPlaces write SetDecimalPlaces
+ default 2;
+ property DisplayFormat: string read FDisplayFormat write SetDisplayFormat;
+ property MaxValue: Extended read FMaxValue write SetMaxValue;
+ property MinValue: Extended read FMinValue write SetMinValue;
+// property FormatOnEditing: Boolean read FFormatOnEditing write SetFormatOnEditing default False;
+ property Text: string read GetText write SetText stored False;
+ property MaxLength default 0;
+ property ZeroEmpty: Boolean read FZeroEmpty write SetZeroEmpty default True;
+ public
+ constructor Create(AOwner: TComponent); override;
+ procedure Clear;
+ property AsInteger: Longint read GetAsInteger write SetAsInteger;
+ property DisplayText: string read GetDisplayText;
+ property Value: Extended read GetValue write SetValue;
+ property IsNull:boolean read GetIsNull;
+ published
+ { Published declarations }
+ end;
+
+ { TCurrencyEdit }
+
+ TCurrencyEdit = class(TCustomNumEdit)
+ protected
+ public
+ published
+ property Alignment;
+ property AutoSelect;
+ property AutoSize;
+ property BeepOnError;
+ property BorderStyle;
+ property BorderSpacing;
+ property CheckOnExit;
+ property Color;
+ property DecimalPlaces;
+ property DisplayFormat;
+ property DragCursor;
+ property DragMode;
+ property Enabled;
+ property Font;
+// property FormatOnEditing;
+ property HideSelection;
+ property Anchors;
+ property BiDiMode;
+ property Constraints;
+ property DragKind;
+ property ParentBiDiMode;
+{$IFDEF WIN32}
+ {$IFNDEF VER90}
+// property ImeMode;
+// property ImeName;
+ {$ENDIF}
+{$ENDIF}
+ property MaxLength;
+ property MaxValue;
+ property MinValue;
+ property ParentColor;
+ property ParentFont;
+ property ParentShowHint;
+ property PopupMenu;
+ property ReadOnly;
+ property ShowHint;
+ property TabOrder;
+ property TabStop;
+ property Text;
+ property Value;
+ property Visible;
+ property ZeroEmpty;
+ property OnChange;
+ property OnClick;
+ property OnDblClick;
+ property OnDragDrop;
+ property OnDragOver;
+ property OnEndDrag;
+ property OnEnter;
+ property OnExit;
+ property OnKeyDown;
+ property OnKeyPress;
+ property OnKeyUp;
+ property OnMouseDown;
+ property OnMouseMove;
+ property OnMouseUp;
+ property OnMouseWheel;
+ property OnMouseWheelDown;
+ property OnMouseWheelUp;
+
+ property OnContextPopup;
+ property OnStartDrag;
+ property OnEndDock;
+ property OnStartDock;
+ end;
+
+implementation
+uses strutils, Math, tooledit, rxconst;
+
+function IsValidFloat(const Value: string; var RetValue: Extended): Boolean;
+var
+ I: Integer;
+ Buffer: array[0..63] of Char;
+begin
+ Result := False;
+ for I := 1 to Length(Value) do
+ if not (Value[I] in [DefaultFormatSettings.DecimalSeparator, '-', '+', '0'..'9', 'e', 'E']) then
+ Exit;
+ Result := TextToFloat(StrPLCopy(Buffer, Value,
+ SizeOf(Buffer) - 1), RetValue, fvExtended);
+end;
+
+function FormatFloatStr(const S: string; Thousands: Boolean): string;
+var
+ I, MaxSym, MinSym, Group: Integer;
+ IsSign: Boolean;
+begin
+ Result := '';
+ MaxSym := Length(S);
+ IsSign := (MaxSym > 0) and (S[1] in ['-', '+']);
+ if IsSign then MinSym := 2
+ else MinSym := 1;
+ I := Pos(DefaultFormatSettings.DecimalSeparator, S);
+ if I > 0 then MaxSym := I - 1;
+ I := Pos('E', AnsiUpperCase(S));
+ if I > 0 then MaxSym := Min(I - 1, MaxSym);
+ Result := Copy(S, MaxSym + 1, MaxInt);
+ Group := 0;
+ for I := MaxSym downto MinSym do begin
+ Result := S[I] + Result;
+ Inc(Group);
+ if (Group = 3) and Thousands and (I > MinSym) then begin
+ Group := 0;
+ Result := DefaultFormatSettings.ThousandSeparator + Result;
+ end;
+ end;
+ if IsSign then Result := S[1] + Result;
+end;
+
+{ TCustomNumEdit }
+
+function TCustomNumEdit.GetAsInteger: Longint;
+begin
+ Result := Trunc(Value);
+end;
+
+function TCustomNumEdit.GetIsNull: boolean;
+begin
+ Result:=false;
+end;
+
+function TCustomNumEdit.GetDisplayText: string;
+begin
+ Result := FormatDisplayText(Value);
+end;
+
+procedure TCustomNumEdit.Reset;
+begin
+ DataChanged;
+ SelectAll;
+end;
+
+procedure TCustomNumEdit.CheckRange;
+begin
+ if not (csDesigning in ComponentState) and CheckOnExit then
+ CheckValue(StrToFloat(TextToValText(EditText)), True);
+end;
+
+procedure TCustomNumEdit.UpdateData;
+begin
+ ValidateEdit;
+ FValue := CheckValue(StrToFloat(TextToValText(EditText)), False);
+end;
+
+constructor TCustomNumEdit.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ ControlStyle := ControlStyle - [csSetCaption];
+ MaxLength := 0;
+ FBeepOnError := True;
+ FDecimalPlaces := 2;
+ FZeroEmpty := True;
+ inherited Text := '';
+ Alignment := taRightJustify;
+ DataChanged;
+ ControlState := ControlState + [csCreating];
+end;
+
+function TCustomNumEdit.GetText: string;
+begin
+ if (FValue = 0) and FZeroEmpty then
+ Result:=''
+ else
+ Result := FloatToStr(FValue);
+end;
+
+function TCustomNumEdit.GetValue: Extended;
+begin
+ if (not (csDesigning in ComponentState)) and FFocusedDisplay then
+ begin
+ try
+ UpdateData;
+ except
+ FValue := FMinValue;
+ end;
+ end;
+ Result := FValue;
+end;
+
+procedure TCustomNumEdit.SetAsInteger(const AValue: Longint);
+begin
+ SetValue(AValue);
+end;
+
+procedure TCustomNumEdit.SetBeepOnError(const AValue: Boolean);
+begin
+ if FBeepOnError=AValue then exit;
+ FBeepOnError:=AValue;
+end;
+
+procedure TCustomNumEdit.SetDecimalPlaces(const AValue: Cardinal);
+begin
+ if FDecimalPlaces=AValue then exit;
+ FDecimalPlaces:=AValue;
+ DataChanged;
+ Invalidate;
+end;
+
+procedure TCustomNumEdit.SetDisplayFormat(const AValue: string);
+begin
+ if FDisplayFormat=AValue then exit;
+ FDisplayFormat:=AValue;
+ DataChanged;
+end;
+
+{
+procedure TCustomNumEdit.SetFormatOnEditing(const AValue: Boolean);
+begin
+ if FFormatOnEditing=AValue then exit;
+ FFormatOnEditing:=AValue;
+ if FFormatOnEditing and FFocused then
+ ReformatEditText
+ else
+ if FFocused then
+ begin
+ UpdateData;
+ DataChanged;
+ end;
+end;
+}
+procedure TCustomNumEdit.SetMaxValue(const AValue: Extended);
+begin
+ if FMaxValue=AValue then exit;
+ FMaxValue:=AValue;
+ if Value > AValue then
+ Value:=AValue;
+end;
+
+procedure TCustomNumEdit.SetMinValue(const AValue: Extended);
+begin
+ if FMinValue=AValue then exit;
+ FMinValue:=AValue;
+ if Value < AValue then
+ Value:=AValue;
+end;
+
+procedure TCustomNumEdit.SetText(const AValue: string);
+begin
+ if not (csReading in ComponentState) then
+ begin
+ FValue := CheckValue(StrToFloat(TextToValText(AValue)), False);
+ DataChanged;
+ Invalidate;
+ end;
+end;
+
+procedure TCustomNumEdit.SetValue(const AValue: Extended);
+begin
+ FValue := CheckValue(AValue, False);
+ DataChanged;
+ Invalidate;
+end;
+
+procedure TCustomNumEdit.SetZeroEmpty(const AValue: Boolean);
+begin
+ if FZeroEmpty=AValue then exit;
+ FZeroEmpty:=AValue;
+ DataChanged;
+end;
+
+function TCustomNumEdit.TextToValText(const AValue: string): string;
+begin
+ Result := Trim(AValue);
+ if DefaultFormatSettings.DecimalSeparator <> DefaultFormatSettings.ThousandSeparator then begin
+ Result := DelChars(Result, ThousandSeparator);
+ end;
+ if (DefaultFormatSettings.DecimalSeparator <> '.') and (DefaultFormatSettings.ThousandSeparator <> '.') then
+ Result := StringReplace(Result, '.', DefaultFormatSettings.DecimalSeparator, [rfReplaceAll]);
+ if (DefaultFormatSettings.DecimalSeparator <> ',') and (DefaultFormatSettings.ThousandSeparator <> ',') then
+ Result := StringReplace(Result, ',', DefaultFormatSettings.DecimalSeparator, [rfReplaceAll]);
+ if Result = '' then Result := '0'
+ else if Result = '-' then Result := '-0';
+end;
+
+function TCustomNumEdit.CheckValue(NewValue: Extended; RaiseOnError: Boolean
+ ): Extended;
+begin
+ Result := NewValue;
+ if (FMaxValue <> FMinValue) then begin
+ if (FMaxValue > FMinValue) then begin
+ if NewValue < FMinValue then Result := FMinValue
+ else if NewValue > FMaxValue then Result := FMaxValue;
+ end
+ else begin
+ if FMaxValue = 0 then begin
+ if NewValue < FMinValue then Result := FMinValue;
+ end
+ else if FMinValue = 0 then begin
+ if NewValue > FMaxValue then Result := FMaxValue;
+ end;
+ end;
+ if RaiseOnError and (Result <> NewValue) then
+ raise ERangeError.CreateFmt(StringReplace(SOutOfRange, '%d', '%.*f', [rfReplaceAll]),
+ [DecimalPlaces, FMinValue, DecimalPlaces, FMaxValue]);
+ end;
+end;
+{
+procedure TCustomNumEdit.SetFocused(Value: Boolean);
+begin
+ if FFocused <> Value then
+ begin
+ FFocused := Value;
+ Invalidate;
+ FFormatting := True;
+ try
+ DataChanged;
+ finally
+ FFormatting := False;
+ end;
+ end;
+end;
+}
+procedure TCustomNumEdit.WMSetFocus(var Message: TLMSetFocus);
+begin
+ inherited WMSetFocus(Message);
+ // some widgetsets do not notify clipboard actions properly. Put at edit state at entry
+ if FFocusedDisplay then
+ exit;
+ FFocusedDisplay := true;
+ Reset;
+end;
+
+procedure TCustomNumEdit.WMKillFocus(var Message: TLMKillFocus);
+begin
+ inherited WMKillFocus(Message);
+ FFocusedDisplay := False;
+ UpdateData;
+ if not Focused then
+ DisableMask(GetDisplayText);
+end;
+
+{
+procedure TCustomNumEdit.CMEnabledChanged(var Message: TLMessage);
+begin
+ inherited;
+ if NewStyleControls and not FFocused then Invalidate;
+end;
+
+procedure TCustomNumEdit.CMEnter(var Message: TLMEnter);
+begin
+ SetFocused(True);
+ if FFormatOnEditing then ReformatEditText;
+ inherited;
+end;
+
+procedure TCustomNumEdit.WMExit(var Message: TLMExit);
+begin
+ inherited;
+ try
+ CheckRange;
+ UpdateData;
+ except
+ SelectAll;
+ if CanFocus then SetFocus;
+ raise;
+ end;
+ SetFocused(False);
+ Cursor:=0;
+ DoExit;
+end;
+
+procedure TCustomNumEdit.CMFontChanged(var Message: TLMessage);
+begin
+ inherited;
+ Invalidate;
+end;
+
+procedure TCustomNumEdit.WMPaint(var Message: TLMPaint);
+var
+ S: string;
+begin
+ S := GetDisplayText;
+// if not FFocused then
+// else
+// if not PaintComboEdit(Self, S, FAlignment, FFocused {and not PopupVisible}, FCanvas, Message) then
+ inherited WMPaint(Message);
+end;
+}
+procedure TCustomNumEdit.WMPaste(var Message: TLMessage);
+var
+ S: string;
+begin
+ S := EditText;
+ try
+ inherited;
+ UpdateData;
+ except
+ EditText := S;
+ SelectAll;
+ if CanFocus then SetFocus;
+// if BeepOnError then MessageBeep(0);
+ end;
+end;
+{
+procedure TCustomNumEdit.GetSel(var ASelStart: Integer; var SelStop: Integer);
+begin
+ ASelStart:=SelStart;
+ SelStop:=SelStart + SelLength;
+end;
+
+
+procedure TCustomNumEdit.DoEnter;
+begin
+ SetFocused(True);
+ if FFormatOnEditing then ReformatEditText;
+ inherited DoEnter;
+end;
+
+procedure TCustomNumEdit.DoExit;
+begin
+ try
+ CheckRange;
+ UpdateData;
+ except
+ SelectAll;
+ if CanFocus then SetFocus;
+ raise;
+ end;
+ SetFocused(False);
+ Cursor:=0;
+
+ inherited DoExit;
+ Invalidate;
+end;
+
+procedure TCustomNumEdit.AcceptValue(const Value: Variant);
+begin
+ inherited AcceptValue(Value);
+end;
+
+procedure TCustomNumEdit.Change;
+begin
+ if not FFormatting then
+ begin
+ if FFormatOnEditing and FFocused then ReformatEditText;
+ inherited Change;
+ end;
+end;
+
+procedure TCustomNumEdit.ReformatEditText;
+var
+ S: string;
+ IsEmpty: Boolean;
+ OldLen, ASelStart, SelStop: Integer;
+begin
+ FFormatting := True;
+ try
+ S := inherited Text;
+ OldLen := Length(S);
+ IsEmpty := (OldLen = 0) or (S = '-');
+ if HandleAllocated then GetSel(ASelStart, SelStop);
+ if not IsEmpty then S := TextToValText(S);
+ S := FormatFloatStr(S, Pos(',', DisplayFormat) > 0);
+ inherited Text := S;
+{ if HandleAllocated and (GetFocus = Handle) and not
+ (csDesigning in ComponentState) then
+ begin
+ Inc(ASelStart, Length(S) - OldLen);
+ SetCursor(ASelStart);
+ end;}
+ finally
+ FFormatting := False;
+ end;
+end;
+}
+procedure TCustomNumEdit.DataChanged;
+begin
+ if FFocusedDisplay then
+ RestoreMask(GetText)
+ else
+ DisableMask(GetDisplayText)
+end;
+
+procedure TCustomNumEdit.KeyPress(var Key: Char);
+begin
+ if Key in ['.', ','] - [DefaultFormatSettings.ThousandSeparator] then
+ Key := DefaultFormatSettings.DecimalSeparator;
+ inherited KeyPress(Key);
+ if (Key in [#32..#255]) and not IsValidChar(Key) then
+ begin
+// if BeepOnError then MessageBeep(0);
+ Key := #0;
+ end
+ else
+ if Key = #27 then
+ begin
+ Reset;
+ Key := #0;
+ end;
+end;
+
+function TCustomNumEdit.IsValidChar(Key: Char): Boolean;
+var
+ S: string;
+ ASelStart, SelStop, DecPos: Integer;
+ RetValue: Extended;
+begin
+ Result := False;
+ S := EditText;
+ GetSel(ASelStart, SelStop);
+ System.Delete(S, ASelStart + 1, SelStop - ASelStart);
+ System.Insert(Key, S, ASelStart + 1);
+ S := TextToValText(S);
+ DecPos := Pos(DefaultFormatSettings.DecimalSeparator, S);
+ if (DecPos > 0) then
+ begin
+ ASelStart := Pos('E', UpperCase(S));
+ if (ASelStart > DecPos) then
+ DecPos := ASelStart - DecPos
+ else
+ DecPos := Length(S) - DecPos;
+ if DecPos > Integer(FDecimalPlaces) then
+ Exit;
+
+ if S[1] = DefaultFormatSettings.DecimalSeparator then
+ s := '0' + s;
+ end;
+ Result := IsValidFloat(S, RetValue);
+ if Result and (FMinValue >= 0) and (FMaxValue > 0) and (RetValue < 0) then
+ Result := False;
+end;
+
+function TCustomNumEdit.FormatDisplayText(Value: Extended): string;
+var
+ Digits : integer;
+begin
+ if FZeroEmpty and (Value = 0) then
+ Result:=''
+ else
+ if DisplayFormat <> '' then
+ Result:=FormatFloat(DisplayFormat, Value)
+ else
+ begin
+ Digits := DefaultFormatSettings.CurrencyDecimals;
+ Result:=FloatToStrF(Value, ffCurrency, DecimalPlaces, Digits);
+ end;
+end;
+
+procedure TCustomNumEdit.Clear;
+begin
+
+end;
+
+initialization
+ RegisterPropertyToSkip( TCustomNumEdit, 'FormatOnEditing', 'This property depricated', '');
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/dateutil.pas b/components/rx/version/v2.2_laz_1.2/dateutil.pas
new file mode 100644
index 000000000..0b658802c
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/dateutil.pas
@@ -0,0 +1,649 @@
+{ DateUtil unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit dateutil;
+
+{$I rx.inc}
+
+interface
+
+function CurrentYear: Word;
+function IsLeapYear(AYear: Integer): Boolean;
+function DaysPerMonth(AYear, AMonth: Integer): Integer;
+function FirstDayOfPrevMonth: TDateTime;
+function LastDayOfPrevMonth: TDateTime;
+function FirstDayOfNextMonth: TDateTime;
+function ExtractDay(ADate: TDateTime): Word;
+function ExtractMonth(ADate: TDateTime): Word;
+function ExtractYear(ADate: TDateTime): Word;
+function IncDate(ADate: TDateTime; Days, Months, Years: Integer): TDateTime;
+function IncDay(ADate: TDateTime; Delta: Integer): TDateTime;
+function IncMonth(ADate: TDateTime; Delta: Integer): TDateTime;
+function IncYear(ADate: TDateTime; Delta: Integer): TDateTime;
+function ValidDate(ADate: TDateTime): Boolean;
+procedure DateDiff(Date1, Date2: TDateTime; var Days, Months, Years: Word);
+function MonthsBetween(Date1, Date2: TDateTime): Double;
+function DaysInPeriod(Date1, Date2: TDateTime): Longint;
+ { Count days between Date1 and Date2 + 1, so if Date1 = Date2 result = 1 }
+function DaysBetween(Date1, Date2: TDateTime): Longint;
+ { The same as previous but if Date2 < Date1 result = 0 }
+
+function IncTime(ATime: TDateTime; Hours, Minutes, Seconds, MSecs: Integer): TDateTime;
+function IncHour(ATime: TDateTime; Delta: Integer): TDateTime;
+function IncMinute(ATime: TDateTime; Delta: Integer): TDateTime;
+function IncSecond(ATime: TDateTime; Delta: Integer): TDateTime;
+function IncMSec(ATime: TDateTime; Delta: Integer): TDateTime;
+function CutTime(ADate: TDateTime): TDateTime; { Set time to 00:00:00:00 }
+
+type
+ TDateOrder = (doMDY, doDMY, doYMD);
+ TDayOfWeekName = (Sun, Mon, Tue, Wed, Thu, Fri, Sat);
+ TDaysOfWeek = set of TDayOfWeekName;
+
+{ String to date conversions }
+function GetDateOrder(const DateFormat: string): TDateOrder;
+function MonthFromName(const S: string; MaxLen: Byte): Byte;
+function StrToDateDef(const S: string; Default: TDateTime): TDateTime;
+function StrToDateFmt(const DateFormat, S: string): TDateTime;
+function StrToDateFmtDef(const DateFormat, S: string; Default: TDateTime): TDateTime;
+function DefDateFormat(FourDigitYear: Boolean): string;
+function DefDateMask(BlanksChar: Char; FourDigitYear: Boolean): string;
+function NvlDate(DateValue, DefaultValue: TDateTime): TDateTime;
+
+{$IFDEF WIN32}
+function FormatLongDate(Value: TDateTime): string;
+function FormatLongDateTime(Value: TDateTime): string;
+{$ENDIF}
+
+const
+ DefaultDateOrder = doDMY;
+
+{$IFDEF USE_FOUR_DIGIT_YEAR}
+var
+ FourDigitYear: Boolean;
+{$ELSE}
+function FourDigitYear: Boolean;
+{$ENDIF USE_FOUR_DIGIT_YEAR}
+
+const
+ CenturyOffset: Byte = 60;
+ NullDate: TDateTime = 0;
+
+implementation
+
+uses SysUtils, RXStrUtils, rxdconst{, DBConsts }{$IFDEF WIN32}, Windows{$ENDIF};
+
+
+function NvlDate(DateValue, DefaultValue: TDateTime): TDateTime;
+begin
+ if DateValue = NullDate then Result := DefaultValue
+ else Result := DateValue;
+end;
+
+function IsLeapYear(AYear: Integer): Boolean;
+begin
+ Result := (AYear mod 4 = 0) and ((AYear mod 100 <> 0) or (AYear mod 400 = 0));
+end;
+
+function DaysPerMonth(AYear, AMonth: Integer): Integer;
+const
+ DaysInMonth: array[1..12] of Integer =
+ (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
+begin
+ Result := DaysInMonth[AMonth];
+ if (AMonth = 2) and IsLeapYear(AYear) then Inc(Result); { leap-year Feb is special }
+end;
+
+function FirstDayOfNextMonth: TDateTime;
+var
+ Year, Month, Day: Word;
+begin
+ DecodeDate(Date, Year, Month, Day);
+ Day := 1;
+ if Month < 12 then Inc(Month)
+ else begin
+ Inc(Year);
+ Month := 1;
+ end;
+ Result := EncodeDate(Year, Month, Day);
+end;
+
+function FirstDayOfPrevMonth: TDateTime;
+var
+ Year, Month, Day: Word;
+begin
+ DecodeDate(Date, Year, Month, Day);
+ Day := 1;
+ if Month > 1 then Dec(Month)
+ else begin
+ Dec(Year);
+ Month := 12;
+ end;
+ Result := EncodeDate(Year, Month, Day);
+end;
+
+function LastDayOfPrevMonth: TDateTime;
+var
+ D: TDateTime;
+ Year, Month, Day: Word;
+begin
+ D := FirstDayOfPrevMonth;
+ DecodeDate(D, Year, Month, Day);
+ Day := DaysPerMonth(Year, Month);
+ Result := EncodeDate(Year, Month, Day);
+end;
+
+function ExtractDay(ADate: TDateTime): Word;
+var
+ M, Y: Word;
+begin
+ DecodeDate(ADate, Y, M, Result);
+end;
+
+function ExtractMonth(ADate: TDateTime): Word;
+var
+ D, Y: Word;
+begin
+ DecodeDate(ADate, Y, Result, D);
+end;
+
+function ExtractYear(ADate: TDateTime): Word;
+var
+ D, M: Word;
+begin
+ DecodeDate(ADate, Result, M, D);
+end;
+
+function IncDate(ADate: TDateTime; Days, Months, Years: Integer): TDateTime;
+var
+ D, M, Y: Word;
+ Day, Month, Year: Longint;
+begin
+ DecodeDate(ADate, Y, M, D);
+ Year := Y; Month := M; Day := D;
+ Inc(Year, Years);
+ Inc(Year, Months div 12);
+ Inc(Month, Months mod 12);
+ if Month < 1 then begin
+ Inc(Month, 12);
+ Dec(Year);
+ end
+ else if Month > 12 then begin
+ Dec(Month, 12);
+ Inc(Year);
+ end;
+ if Day > DaysPerMonth(Year, Month) then Day := DaysPerMonth(Year, Month);
+ Result := EncodeDate(Year, Month, Day) + Days + Frac(ADate);
+end;
+
+procedure DateDiff(Date1, Date2: TDateTime; var Days, Months, Years: Word);
+{ Corrected by Anatoly A. Sanko (2:450/73) }
+var
+ DtSwap: TDateTime;
+ Day1, Day2, Month1, Month2, Year1, Year2: Word;
+begin
+ if Date1 > Date2 then begin
+ DtSwap := Date1;
+ Date1 := Date2;
+ Date2 := DtSwap;
+ end;
+ DecodeDate(Date1, Year1, Month1, Day1);
+ DecodeDate(Date2, Year2, Month2, Day2);
+ Years := Year2 - Year1;
+ Months := 0;
+ Days := 0;
+ if Month2 < Month1 then begin
+ Inc(Months, 12);
+ Dec(Years);
+ end;
+ Inc(Months, Month2 - Month1);
+ if Day2 < Day1 then begin
+ Inc(Days, DaysPerMonth(Year1, Month1));
+ if Months = 0 then begin
+ Dec(Years);
+ Months := 11;
+ end
+ else Dec(Months);
+ end;
+ Inc(Days, Day2 - Day1);
+end;
+
+function IncDay(ADate: TDateTime; Delta: Integer): TDateTime;
+begin
+ Result := ADate + Delta;
+end;
+
+function IncMonth(ADate: TDateTime; Delta: Integer): TDateTime;
+begin
+ Result := IncDate(ADate, 0, Delta, 0);
+end;
+
+function IncYear(ADate: TDateTime; Delta: Integer): TDateTime;
+begin
+ Result := IncDate(ADate, 0, 0, Delta);
+end;
+
+function MonthsBetween(Date1, Date2: TDateTime): Double;
+var
+ D, M, Y: Word;
+begin
+ DateDiff(Date1, Date2, D, M, Y);
+ Result := 12 * Y + M;
+ if (D > 1) and (D < 7) then Result := Result + 0.25
+ else if (D >= 7) and (D < 15) then Result := Result + 0.5
+ else if (D >= 15) and (D < 21) then Result := Result + 0.75
+ else if (D >= 21) then Result := Result + 1;
+end;
+
+function IsValidDate(Y, M, D: Word): Boolean;
+begin
+ Result := (Y >= 1) and (Y <= 9999) and (M >= 1) and (M <= 12) and
+ (D >= 1) and (D <= DaysPerMonth(Y, M));
+end;
+
+function ValidDate(ADate: TDateTime): Boolean;
+var
+ Year, Month, Day: Word;
+begin
+ try
+ DecodeDate(ADate, Year, Month, Day);
+ Result := IsValidDate(Year, Month, Day);
+ except
+ Result := False;
+ end;
+end;
+
+function DaysInPeriod(Date1, Date2: TDateTime): Longint;
+begin
+ if ValidDate(Date1) and ValidDate(Date2) then
+ Result := Abs(Trunc(Date2) - Trunc(Date1)) + 1
+ else Result := 0;
+end;
+
+function DaysBetween(Date1, Date2: TDateTime): Longint;
+begin
+ Result := Trunc(Date2) - Trunc(Date1) + 1;
+ if Result < 0 then Result := 0;
+end;
+
+function IncTime(ATime: TDateTime; Hours, Minutes, Seconds,
+ MSecs: Integer): TDateTime;
+begin
+ Result := ATime + (Hours div 24) + (((Hours mod 24) * 3600000 +
+ Minutes * 60000 + Seconds * 1000 + MSecs) / MSecsPerDay);
+ if Result < 0 then Result := Result + 1;
+end;
+
+function IncHour(ATime: TDateTime; Delta: Integer): TDateTime;
+begin
+ Result := IncTime(ATime, Delta, 0, 0, 0);
+end;
+
+function IncMinute(ATime: TDateTime; Delta: Integer): TDateTime;
+begin
+ Result := IncTime(ATime, 0, Delta, 0, 0);
+end;
+
+function IncSecond(ATime: TDateTime; Delta: Integer): TDateTime;
+begin
+ Result := IncTime(ATime, 0, 0, Delta, 0);
+end;
+
+function IncMSec(ATime: TDateTime; Delta: Integer): TDateTime;
+begin
+ Result := IncTime(ATime, 0, 0, 0, Delta);
+end;
+
+function CutTime(ADate: TDateTime): TDateTime;
+begin
+ Result := Trunc(ADate);
+end;
+
+function CurrentYear: Word;
+var
+ SystemTime: TSystemTime;
+begin
+ GetLocalTime(SystemTime);
+ Result := SystemTime.Year;
+end;
+
+{ String to date conversions. Copied from SYSUTILS.PAS unit. }
+
+procedure ScanBlanks(const S: string; var Pos: Integer);
+var
+ I: Integer;
+begin
+ I := Pos;
+ while (I <= Length(S)) and (S[I] = ' ') do Inc(I);
+ Pos := I;
+end;
+
+function ScanNumber(const S: string; MaxLength: Integer; var Pos: Integer;
+ var Number: Longint): Boolean;
+var
+ I: Integer;
+ N: Word;
+begin
+ Result := False;
+ ScanBlanks(S, Pos);
+ I := Pos;
+ N := 0;
+ while (I <= Length(S)) and (Longint(I - Pos) < MaxLength) and
+ (S[I] in ['0'..'9']) and (N < 1000) do
+ begin
+ N := N * 10 + (Ord(S[I]) - Ord('0'));
+ Inc(I);
+ end;
+ if I > Pos then begin
+ Pos := I;
+ Number := N;
+ Result := True;
+ end;
+end;
+
+function ScanChar(const S: string; var Pos: Integer; Ch: Char): Boolean;
+begin
+ Result := False;
+ ScanBlanks(S, Pos);
+ if (Pos <= Length(S)) and (S[Pos] = Ch) then begin
+ Inc(Pos);
+ Result := True;
+ end;
+end;
+
+{$IFDEF RX_D3}
+procedure ScanToNumber(const S: string; var Pos: Integer);
+begin
+ while (Pos <= Length(S)) and not (S[Pos] in ['0'..'9']) do begin
+ if S[Pos] in LeadBytes then Inc(Pos);
+ Inc(Pos);
+ end;
+end;
+{$ENDIF}
+
+function GetDateOrder(const DateFormat: string): TDateOrder;
+var
+ I: Integer;
+begin
+ Result := DefaultDateOrder;
+ I := 1;
+ while I <= Length(DateFormat) do begin
+ case Chr(Ord(DateFormat[I]) and $DF) of
+{$IFDEF RX_D3}
+ 'E': Result := doYMD;
+{$ENDIF}
+ 'Y': Result := doYMD;
+ 'M': Result := doMDY;
+ 'D': Result := doDMY;
+ else
+ Inc(I);
+ Continue;
+ end;
+ Exit;
+ end;
+ Result := DefaultDateOrder; { default }
+end;
+
+function ExpandYear(Year: Integer): Integer;
+var
+ N: Longint;
+begin
+ Result := Year;
+ if Result < 100 then begin
+ N := CurrentYear - CenturyOffset;
+ Inc(Result, N div 100 * 100);
+ if (CenturyOffset > 0) and (Result < N) then
+ Inc(Result, 100);
+ end;
+end;
+
+function ScanDate(const S, DateFormat: string; var Pos: Integer;
+ var Y, M, D: Integer): Boolean;
+var
+ DateOrder: TDateOrder;
+ N1, N2, N3: Longint;
+begin
+ Result := False;
+ Y := 0; M := 0; D := 0;
+ DateOrder := GetDateOrder(DateFormat);
+ if DefaultFormatSettings.ShortDateFormat[1] = 'g' then { skip over prefix text }
+ ScanToNumber(S, Pos);
+ if not (ScanNumber(S, MaxInt, Pos, N1) and ScanChar(S, Pos, DateSeparator) and
+ ScanNumber(S, MaxInt, Pos, N2)) then Exit;
+ if ScanChar(S, Pos, DateSeparator) then begin
+ if not ScanNumber(S, MaxInt, Pos, N3) then Exit;
+ case DateOrder of
+ doMDY: begin Y := N3; M := N1; D := N2; end;
+ doDMY: begin Y := N3; M := N2; D := N1; end;
+ doYMD: begin Y := N1; M := N2; D := N3; end;
+ end;
+ Y := ExpandYear(Y);
+ end
+ else begin
+ Y := CurrentYear;
+ if DateOrder = doDMY then begin
+ D := N1; M := N2;
+ end
+ else begin
+ M := N1; D := N2;
+ end;
+ end;
+ ScanChar(S, Pos, DefaultFormatSettings.DateSeparator);
+ ScanBlanks(S, Pos);
+(*
+{$IFDEF RX_D3}
+ if SysLocale.FarEast and (System.Pos('ddd', ShortDateFormat) <> 0) then
+ begin { ignore trailing text }
+ if ShortTimeFormat[1] in ['0'..'9'] then { stop at time digit }
+ ScanToNumber(S, Pos)
+ else { stop at time prefix }
+ repeat
+ while (Pos <= Length(S)) and (S[Pos] <> ' ') do Inc(Pos);
+ ScanBlanks(S, Pos);
+ until (Pos > Length(S)) or
+ (AnsiCompareText(TimeAMString, Copy(S, Pos, Length(TimeAMString))) = 0) or
+ (AnsiCompareText(TimePMString, Copy(S, Pos, Length(TimePMString))) = 0);
+ end;
+{$ENDIF RX_D3}
+*)
+ Result := IsValidDate(Y, M, D) and (Pos > Length(S));
+end;
+
+function MonthFromName(const S: string; MaxLen: Byte): Byte;
+begin
+ if Length(S) > 0 then
+ for Result := 1 to 12 do begin
+ if (Length(DefaultFormatSettings.LongMonthNames[Result]) > 0) and
+ (AnsiCompareText(Copy(S, 1, MaxLen),
+ Copy(DefaultFormatSettings.LongMonthNames[Result], 1, MaxLen)) = 0) then Exit;
+ end;
+ Result := 0;
+end;
+
+procedure ExtractMask(const Format, S: string; Ch: Char; Cnt: Integer;
+ var I: Integer; Blank, Default: Integer);
+var
+ Tmp: string[20];
+ J, L: Integer;
+begin
+ I := Default;
+ Ch := UpCase(Ch);
+ L := Length(Format);
+ if Length(S) < L then L := Length(S)
+ else if Length(S) > L then Exit;
+ J := Pos(MakeStr(Ch, Cnt), AnsiUpperCase(Format));
+ if J <= 0 then Exit;
+ Tmp := '';
+ while (UpCase(Format[J]) = Ch) and (J <= L) do begin
+ if S[J] <> ' ' then Tmp := Tmp + S[J];
+ Inc(J);
+ end;
+ if Tmp = '' then I := Blank
+ else if Cnt > 1 then begin
+ I := MonthFromName(Tmp, Length(Tmp));
+ if I = 0 then I := -1;
+ end
+ else I := StrToIntDef(Tmp, -1);
+end;
+
+function ScanDateStr(const Format, S: string; var D, M, Y: Integer): Boolean;
+var
+ Pos: Integer;
+begin
+ ExtractMask(Format, S, 'm', 3, M, -1, 0); { short month name? }
+ if M = 0 then ExtractMask(Format, S, 'm', 1, M, -1, 0);
+ ExtractMask(Format, S, 'd', 1, D, -1, 1);
+ ExtractMask(Format, S, 'y', 1, Y, -1, CurrentYear);
+ Y := ExpandYear(Y);
+ Result := IsValidDate(Y, M, D);
+ if not Result then begin
+ Pos := 1;
+ Result := ScanDate(S, Format, Pos, Y, M, D);
+ end;
+end;
+
+function InternalStrToDate(const DateFormat, S: string;
+ var Date: TDateTime): Boolean;
+var
+ D, M, Y: Integer;
+begin
+ if S = '' then begin
+ Date := NullDate;
+ Result := True;
+ end
+ else begin
+ Result := ScanDateStr(DateFormat, S, D, M, Y);
+ if Result then
+ try
+ Date := EncodeDate(Y, M, D);
+ except
+ Result := False;
+ end;
+ end;
+end;
+
+function StrToDateFmt(const DateFormat, S: string): TDateTime;
+begin
+ if not InternalStrToDate(DateFormat, S, Result) then
+ raise EConvertError.CreateFmt({$IFDEF RX_D3} SInvalidDate {$ELSE}
+ LoadStr(SInvalidDate) {$ENDIF}, [S]);
+end;
+
+function StrToDateDef(const S: string; Default: TDateTime): TDateTime;
+begin
+ if not InternalStrToDate(DefaultFormatSettings.ShortDateFormat, S, Result) then
+ Result := Trunc(Default);
+end;
+
+function StrToDateFmtDef(const DateFormat, S: string; Default: TDateTime): TDateTime;
+begin
+ if not InternalStrToDate(DateFormat, S, Result) then
+ Result := Trunc(Default);
+end;
+
+function DefDateFormat(FourDigitYear: Boolean): string;
+begin
+ if FourDigitYear then begin
+ case GetDateOrder(DefaultFormatSettings.ShortDateFormat) of
+ doMDY: Result := 'MM/DD/YYYY';
+ doDMY: Result := 'DD/MM/YYYY';
+ doYMD: Result := 'YYYY/MM/DD';
+ end;
+ end
+ else begin
+ case GetDateOrder(DefaultFormatSettings.ShortDateFormat) of
+ doMDY: Result := 'MM/DD/YY';
+ doDMY: Result := 'DD/MM/YY';
+ doYMD: Result := 'YY/MM/DD';
+ end;
+ end;
+end;
+
+function DefDateMask(BlanksChar: Char; FourDigitYear: Boolean): string;
+begin
+ if FourDigitYear then begin
+ case GetDateOrder(DefaultFormatSettings.ShortDateFormat) of
+ doMDY, doDMY: Result := '!99/99/9999;1;';
+ doYMD: Result := '!9999/99/99;1;';
+ end;
+ end
+ else begin
+ case GetDateOrder(DefaultFormatSettings.ShortDateFormat) of
+ doMDY, doDMY: Result := '!99/99/99;1;';
+ doYMD: Result := '!99/99/99;1;';
+ end;
+ end;
+ if Result <> '' then Result := Result + BlanksChar;
+end;
+
+
+{$IFDEF WIN32}
+
+function FormatLongDate(Value: TDateTime): string;
+var
+ Buffer: array[0..1023] of Char;
+ SystemTime: TSystemTime;
+begin
+{$IFDEF RX_D3}
+ DateTimeToSystemTime(Value, SystemTime);
+{$ELSE}
+ with SystemTime do
+ begin
+ DecodeDate(Value, wYear, wMonth, wDay);
+ DecodeTime(Value, wHour, wMinute, wSecond, wMilliseconds);
+ end;
+{$ENDIF}
+ SetString(Result, Buffer, GetDateFormat(GetThreadLocale, DATE_LONGDATE,
+ @SystemTime, nil, Buffer, SizeOf(Buffer) - 1));
+ Result := TrimRight(Result);
+end;
+
+function FormatLongDateTime(Value: TDateTime): string;
+begin
+ if Value <> NullDate then
+ Result := FormatLongDate(Value) + FormatDateTime(' tt', Value)
+ else Result := '';
+end;
+
+{$ENDIF WIN32}
+
+{$IFNDEF USE_FOUR_DIGIT_YEAR}
+function FourDigitYear: Boolean;
+begin
+ Result := Pos('YYYY', AnsiUpperCase(DefaultFormatSettings.ShortDateFormat)) > 0;
+end;
+{$ENDIF}
+
+{$IFDEF USE_FOUR_DIGIT_YEAR}
+initialization
+ FourDigitYear := Pos('YYYY', AnsiUpperCase(ShortDateFormat)) > 0;
+{$ENDIF}
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/dbcurredit.pas b/components/rx/version/v2.2_laz_1.2/dbcurredit.pas
new file mode 100644
index 000000000..f06c3038b
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/dbcurredit.pas
@@ -0,0 +1,250 @@
+{ dbcurredit unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ First version By Daniel Simões de Almeida
+}
+
+unit dbcurredit ;
+
+{$I rx.inc}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, LMessages, LCLType, Controls, Graphics,
+ DB, DbCtrls, curredit ;
+
+type
+
+ { TRxDBCurrEdit }
+
+ TRxDBCurrEdit = class(TCurrencyEdit)
+ private
+ FDataLink: TFieldDataLink;
+ procedure DoCheckEnable;
+ function GetDataField: string;
+ function GetDataSource: TDataSource;
+ function GetReadOnly: Boolean;
+ procedure SetDataField(const AValue: string);
+ procedure SetDataSource(const AValue: TDataSource);
+ procedure SetReadOnly(const AValue: Boolean);
+ protected
+ procedure ActiveChange(Sender:TObject);
+ procedure DataChange(Sender:TObject);
+ procedure EditingChange(Sender: TObject);
+ procedure UpdateData(Sender:TObject);
+ procedure CMExit(var Message:TLMessage); message CM_EXIT;
+ procedure LMCut(var Message: TLMessage); message LM_CUT;
+ procedure LMPaste(var Message: TLMessage); message LM_PASTE;
+ procedure KeyDown(var Key: Word; Shift: TShiftState); override;
+ procedure Change; override;
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ procedure EditingDone; override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ published
+ property DataField: string read GetDataField write SetDataField;
+ property DataSource: TDataSource read GetDataSource write SetDataSource;
+ property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
+ end;
+
+implementation
+
+Uses math ;
+
+{ TRxDBCurrEdit }
+
+procedure TRxDBCurrEdit.DoCheckEnable;
+begin
+ Enabled:=FDataLink.Active and (FDataLink.Field<>nil) and (not FDataLink.Field.ReadOnly);
+end;
+
+function TRxDBCurrEdit.GetDataField: string;
+begin
+ Result:=FDataLink.FieldName;
+end;
+
+function TRxDBCurrEdit.GetDataSource: TDataSource;
+begin
+ Result:=FDataLink.DataSource;
+end;
+
+function TRxDBCurrEdit.GetReadOnly: Boolean;
+begin
+ Result:=FDataLink.ReadOnly;
+end;
+
+procedure TRxDBCurrEdit.SetDataField(const AValue: string);
+begin
+ try
+ FDataLink.FieldName:=AValue;
+ finally
+ DoCheckEnable;
+ end;
+end;
+
+procedure TRxDBCurrEdit.SetDataSource(const AValue: TDataSource);
+begin
+ FDataLink.DataSource:=AValue;
+ DoCheckEnable;
+end;
+
+procedure TRxDBCurrEdit.SetReadOnly(const AValue: Boolean);
+begin
+ FDataLink.ReadOnly:=AValue;
+end;
+
+procedure TRxDBCurrEdit.ActiveChange(Sender: TObject);
+begin
+ DoCheckEnable;
+end;
+
+procedure TRxDBCurrEdit.DataChange(Sender: TObject);
+begin
+ if Assigned(FDataLink.Field) and
+ (FDataLink.Field is TNumericField) then
+ begin
+ if FDataLink.Field.IsNull then
+ Text:=''
+ else
+ Self.Value := SimpleRoundTo( FDataLink.Field.AsFloat, -DecimalPlaces) ;
+ end
+ else Text:='';
+end;
+
+procedure TRxDBCurrEdit.EditingChange(Sender: TObject);
+begin
+ inherited ReadOnly := not FDataLink.Editing;
+{ if FDataLink.Editing and DefaultToday and (FDataLink.Field <> nil) and
+ (FDataLink.Field.AsDateTime = NullDate) then
+ FDataLink.Field.AsDateTime := SysUtils.Now;}
+end;
+
+procedure TRxDBCurrEdit.UpdateData(Sender: TObject);
+begin
+ if Assigned(FDataLink.Field) then
+ begin
+ if Self.Text<>'' then
+ FDataLink.Field.AsFloat := SimpleRoundTo( Self.Value, -Self.DecimalPlaces)
+ else
+ FDataLink.Field.Clear;
+ end;
+end;
+
+procedure TRxDBCurrEdit.CMExit(var Message: TLMessage);
+begin
+ try
+ FDataLink.UpdateRecord;
+ except
+ SetFocus;
+ SelectAll;
+ raise;
+ end;
+ inherited;
+end;
+
+procedure TRxDBCurrEdit.LMCut(var Message: TLMessage);
+begin
+ FDataLink.Edit;
+ inherited;
+end;
+
+procedure TRxDBCurrEdit.LMPaste(var Message: TLMessage);
+begin
+ FDataLink.Edit;
+ inherited;
+end;
+
+procedure TRxDBCurrEdit.KeyDown(var Key: Word; Shift: TShiftState);
+begin
+ inherited KeyDown(Key, Shift);
+ if Key=VK_ESCAPE then
+ begin
+ //cancel out of editing by reset on esc
+ FDataLink.Reset;
+ SelectAll;
+ Key := VK_UNKNOWN;
+ end
+ else
+ if (Key<>VK_UNKNOWN) then
+ begin
+ //make sure we call edit to ensure the datset is in edit,
+ //this is for where the datasource is in autoedit, so we aren't
+ //read only even though the dataset isn't realy in edit
+ FDataLink.Edit;
+ end;
+end;
+
+procedure TRxDBCurrEdit.Change;
+begin
+ FDataLink.Modified;
+ inherited Change;
+end;
+
+procedure TRxDBCurrEdit.Notification(AComponent: TComponent;
+ Operation: TOperation);
+begin
+ inherited Notification(AComponent, Operation);
+ // if the datasource is being removed then we need to make sure
+ // we are updated or we can get AV/Seg's *cough* as I foolishly
+ // discovered firsthand....
+ if (Operation=opRemove) then
+ begin
+ if (FDataLink<>nil) and (AComponent=DataSource) then
+ DataSource:=nil;
+ end;
+end;
+
+procedure TRxDBCurrEdit.EditingDone;
+begin
+ inherited EditingDone;
+ if FDataLink.CanModify then
+ FDataLink.UpdateRecord;
+end;
+
+constructor TRxDBCurrEdit.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FDataLink:=TFieldDataLink.Create;
+ FDataLink.Control:=Self;
+ FDataLink.OnActiveChange:=@ActiveChange;
+ FDataLink.OnDataChange:=@DataChange;
+ FDataLink.OnUpdateData:=@UpdateData;
+end;
+
+destructor TRxDBCurrEdit.Destroy;
+begin
+ FreeAndNil(FDataLink);
+ inherited Destroy;
+end;
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/dbdateedit.pas b/components/rx/version/v2.2_laz_1.2/dbdateedit.pas
new file mode 100644
index 000000000..f1dda6ef1
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/dbdateedit.pas
@@ -0,0 +1,515 @@
+{ dbdateedit unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit dbdateedit;
+
+{$I rx.inc}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, LMessages, LCLType, Controls, Graphics,
+ DB, DbCtrls, EditBtn, tooledit;
+
+type
+
+ { TDBDateEdit }
+{$IFDEF DBDateEdit_OLD}
+ TDBDateEdit = class(TDateEdit)
+{$ELSE}
+ TDBDateEdit = class(TRxDateEdit)
+{$ENDIF}
+ private
+ FDataLink:TFieldDataLink;
+ FDefaultToday: Boolean;
+ procedure DoCheckEnable;
+ function GetDataField: string;
+ function GetDataSource: TDataSource;
+ function GetReadOnly: Boolean;
+ procedure SetDataField(const AValue: string);
+ procedure SetDataSource(const AValue: TDataSource);
+ procedure SetReadOnly(const AValue: Boolean);
+ protected
+ procedure ActiveChange(Sender:TObject);
+ procedure DataChange(Sender:TObject);
+ procedure EditingChange(Sender: TObject);
+ procedure UpdateData(Sender:TObject);
+ procedure CMExit(var Message:TLMessage); message CM_EXIT;
+ procedure LMCut(var Message: TLMessage); message LM_CUT;
+ procedure LMPaste(var Message: TLMessage); message LM_PASTE;
+ procedure KeyDown(var Key: Word; Shift: TShiftState); override;
+{$IFDEF OLD_EDITBUTTON}
+ procedure Change; override;
+ procedure DoButtonClick (Sender: TObject); override;
+{$ELSE}
+ procedure ButtonClick; override;
+ procedure EditChange; override;
+{$ENDIF}
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ procedure EditingDone; override;
+ Procedure RunDialog; virtual;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ published
+ property DataField: string read GetDataField write SetDataField;
+ property DataSource: TDataSource read GetDataSource write SetDataSource;
+ property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
+ property DefaultToday: Boolean read FDefaultToday write FDefaultToday
+ default False;
+ end;
+
+
+ { TRxDBCalcEdit }
+
+ TRxDBCalcEdit = class(TCalcEdit)
+ private
+ FDataLink: TFieldDataLink;
+ procedure DoCheckEnable;
+ function GetDataField: string;
+ function GetDataSource: TDataSource;
+ function GetReadOnly: Boolean;
+ procedure SetDataField(const AValue: string);
+ procedure SetDataSource(const AValue: TDataSource);
+ procedure SetReadOnly(const AValue: Boolean);
+ protected
+ procedure ActiveChange(Sender:TObject);
+ procedure DataChange(Sender:TObject);
+ procedure EditingChange(Sender: TObject);
+ procedure UpdateData(Sender:TObject);
+ procedure CMExit(var Message:TLMessage); message CM_EXIT;
+ procedure LMCut(var Message: TLMessage); message LM_CUT;
+ procedure LMPaste(var Message: TLMessage); message LM_PASTE;
+ procedure KeyDown(var Key: Word; Shift: TShiftState); override;
+{$IFDEF OLD_EDITBUTTON}
+ procedure Change; override;
+{$ELSE}
+ procedure EditChange; override;
+{$ENDIF}
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ procedure EditingDone; override;
+ Procedure RunDialog; override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ published
+ property DataField: string read GetDataField write SetDataField;
+ property DataSource: TDataSource read GetDataSource write SetDataSource;
+ property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
+ end;
+
+implementation
+uses DateUtil;
+
+{ TDBDateEdit }
+
+procedure TDBDateEdit.DoCheckEnable;
+begin
+ Enabled:=FDataLink.Active and (FDataLink.Field<>nil) and (not FDataLink.Field.ReadOnly);
+end;
+
+function TDBDateEdit.GetDataField: string;
+begin
+ Result:=FDataLink.FieldName;
+end;
+
+function TDBDateEdit.GetDataSource: TDataSource;
+begin
+ Result:=FDataLink.DataSource;
+end;
+
+function TDBDateEdit.GetReadOnly: Boolean;
+begin
+ Result:=FDataLink.ReadOnly;
+end;
+
+procedure TDBDateEdit.SetDataField(const AValue: string);
+begin
+ try
+ FDataLink.FieldName:=AValue;
+ finally
+ DoCheckEnable;
+ end;
+end;
+
+procedure TDBDateEdit.SetDataSource(const AValue: TDataSource);
+begin
+ FDataLink.DataSource:=AValue;
+ DoCheckEnable;
+end;
+
+procedure TDBDateEdit.SetReadOnly(const AValue: Boolean);
+begin
+ inherited ReadOnly:=AValue;
+ FDataLink.ReadOnly:=AValue;
+end;
+
+procedure TDBDateEdit.CMExit(var Message: TLMessage);
+begin
+ try
+ FDataLink.UpdateRecord;
+ except
+ SetFocus;
+ SelectAll;
+ raise;
+ end;
+ inherited;
+end;
+
+procedure TDBDateEdit.LMCut(var Message: TLMessage);
+begin
+ FDataLink.Edit;
+ inherited;
+end;
+
+procedure TDBDateEdit.LMPaste(var Message: TLMessage);
+begin
+ FDataLink.Edit;
+ inherited;
+end;
+
+procedure TDBDateEdit.KeyDown(var Key: Word; Shift: TShiftState);
+begin
+ inherited KeyDown(Key, Shift);
+ if Key=VK_ESCAPE then
+ begin
+ //cancel out of editing by reset on esc
+ FDataLink.Reset;
+ SelectAll;
+ Key := VK_UNKNOWN;
+ end
+ else
+ if (Key<>VK_UNKNOWN) then
+ begin
+ //make sure we call edit to ensure the datset is in edit,
+ //this is for where the datasource is in autoedit, so we aren't
+ //read only even though the dataset isn't realy in edit
+ FDataLink.Edit;
+ end;
+end;
+
+{$IFDEF OLD_EDITBUTTON}
+procedure TDBDateEdit.Change;
+{$ELSE}
+procedure TDBDateEdit.EditChange;
+{$ENDIF}
+begin
+ if Assigned(FDataLink) then
+ FDataLink.Modified;
+{$IFDEF OLD_EDITBUTTON}
+ inherited Change;
+{$ELSE}
+ inherited EditChange;
+{$ENDIF}
+end;
+
+procedure TDBDateEdit.Notification(AComponent: TComponent; Operation: TOperation
+ );
+begin
+ inherited Notification(AComponent, Operation);
+ // if the datasource is being removed then we need to make sure
+ // we are updated or we can get AV/Seg's *cough* as I foolishly
+ // discovered firsthand....
+ if (Operation=opRemove) then
+ begin
+ if (FDataLink<>nil) and (AComponent=DataSource) then
+ DataSource:=nil;
+ end;
+end;
+
+procedure TDBDateEdit.EditingDone;
+begin
+ inherited EditingDone;
+ if FDataLink.CanModify then
+ FDataLink.UpdateRecord;
+end;
+
+procedure TDBDateEdit.RunDialog;
+begin
+ if FDataLink.CanModify then
+ FDataLink.UpdateRecord;
+end;
+
+{$IFDEF OLD_EDITBUTTON}
+procedure TDBDateEdit.DoButtonClick(Sender: TObject);
+{$ELSE}
+procedure TDBDateEdit.ButtonClick;
+{$ENDIF}
+begin
+ {$IFDEF OLD_EDITBUTTON}
+ inherited DoButtonClick(Sender);
+ {$ELSE}
+ inherited ButtonClick;
+ {$ENDIF}
+ RunDialog;
+end;
+
+procedure TDBDateEdit.ActiveChange(Sender: TObject);
+begin
+ DoCheckEnable;
+end;
+
+procedure TDBDateEdit.DataChange(Sender: TObject);
+begin
+ if Assigned(FDataLink.Field) and
+ (FDataLink.Field is TDateTimeField) then
+ begin
+ if FDataLink.Field.IsNull then
+ Text:=''
+ else
+ Date:=FDataLink.Field.AsDateTime
+ end
+ else Text:='';
+end;
+
+procedure TDBDateEdit.EditingChange(Sender: TObject);
+begin
+ inherited ReadOnly := not FDataLink.Editing;
+ if FDataLink.Editing and DefaultToday and (FDataLink.Field <> nil) and
+ (FDataLink.Field.AsDateTime = NullDate) then
+ FDataLink.Field.AsDateTime := SysUtils.Now;
+end;
+
+procedure TDBDateEdit.UpdateData(Sender: TObject);
+var
+ D: TDateTime;
+begin
+ if Assigned(FDataLink.Field) then
+ begin
+ D := Self.Date;
+ if (D <> NullDate) then
+ FDataLink.Field.AsDateTime := D + Frac(FDataLink.Field.AsDateTime)
+ else
+ FDataLink.Field.Clear;
+ end;
+end;
+
+constructor TDBDateEdit.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FDataLink:=TFieldDataLink.Create;
+ FDataLink.Control:=Self;
+ FDataLink.OnActiveChange:=@ActiveChange;
+ FDataLink.OnDataChange:=@DataChange;
+ FDataLink.OnUpdateData:=@UpdateData;
+ Text:='';
+ //UpdateMask;
+end;
+
+destructor TDBDateEdit.Destroy;
+begin
+ FreeAndNil(FDataLink);
+ inherited Destroy;
+end;
+
+
+{ TRxDBCalcEdit }
+
+procedure TRxDBCalcEdit.DoCheckEnable;
+begin
+ Enabled:=FDataLink.Active and (FDataLink.Field<>nil) and (not FDataLink.Field.ReadOnly);
+end;
+
+function TRxDBCalcEdit.GetDataField: string;
+begin
+ Result:=FDataLink.FieldName;
+end;
+
+function TRxDBCalcEdit.GetDataSource: TDataSource;
+begin
+ Result:=FDataLink.DataSource;
+end;
+
+function TRxDBCalcEdit.GetReadOnly: Boolean;
+begin
+ Result:=FDataLink.ReadOnly;
+end;
+
+procedure TRxDBCalcEdit.SetDataField(const AValue: string);
+begin
+ try
+ FDataLink.FieldName:=AValue;
+ finally
+ DoCheckEnable;
+ end;
+end;
+
+procedure TRxDBCalcEdit.SetDataSource(const AValue: TDataSource);
+begin
+ FDataLink.DataSource:=AValue;
+ DoCheckEnable;
+end;
+
+procedure TRxDBCalcEdit.SetReadOnly(const AValue: Boolean);
+begin
+ FDataLink.ReadOnly:=AValue;
+end;
+
+procedure TRxDBCalcEdit.ActiveChange(Sender: TObject);
+begin
+ DoCheckEnable;
+end;
+
+procedure TRxDBCalcEdit.DataChange(Sender: TObject);
+begin
+ if Assigned(FDataLink.Field) and
+ (FDataLink.Field is TNumericField) then
+ begin
+ if FDataLink.Field.IsNull then
+ Text:=''
+ else
+ Self.AsFloat:=FDataLink.Field.AsFloat;
+ end
+ else Text:='';
+end;
+
+procedure TRxDBCalcEdit.EditingChange(Sender: TObject);
+begin
+ inherited ReadOnly := not FDataLink.Editing;
+{ if FDataLink.Editing and DefaultToday and (FDataLink.Field <> nil) and
+ (FDataLink.Field.AsDateTime = NullDate) then
+ FDataLink.Field.AsDateTime := SysUtils.Now;}
+end;
+
+procedure TRxDBCalcEdit.UpdateData(Sender: TObject);
+begin
+ if Assigned(FDataLink.Field) then
+ begin
+ if Self.Text<>'' then
+ FDataLink.Field.AsFloat := Self.AsFloat
+ else
+ FDataLink.Field.Clear;
+ end;
+end;
+
+procedure TRxDBCalcEdit.CMExit(var Message: TLMessage);
+begin
+ try
+ FDataLink.UpdateRecord;
+ except
+ SetFocus;
+ SelectAll;
+ raise;
+ end;
+ inherited;
+end;
+
+procedure TRxDBCalcEdit.LMCut(var Message: TLMessage);
+begin
+ FDataLink.Edit;
+ inherited;
+end;
+
+procedure TRxDBCalcEdit.LMPaste(var Message: TLMessage);
+begin
+ FDataLink.Edit;
+ inherited;
+end;
+
+procedure TRxDBCalcEdit.KeyDown(var Key: Word; Shift: TShiftState);
+begin
+ inherited KeyDown(Key, Shift);
+ if Key=VK_ESCAPE then
+ begin
+ //cancel out of editing by reset on esc
+ FDataLink.Reset;
+ SelectAll;
+ Key := VK_UNKNOWN;
+ end
+ else
+ if (Key<>VK_UNKNOWN) then
+ begin
+ //make sure we call edit to ensure the datset is in edit,
+ //this is for where the datasource is in autoedit, so we aren't
+ //read only even though the dataset isn't realy in edit
+ FDataLink.Edit;
+ end;
+end;
+
+{$IFDEF OLD_EDITBUTTON}
+procedure TRxDBCalcEdit.Change;
+{$ELSE}
+procedure TRxDBCalcEdit.EditChange;
+{$ENDIF}
+begin
+ FDataLink.Modified;
+ {$IFDEF OLD_EDITBUTTON}
+ inherited Change;
+ {$ELSE}
+ inherited EditChange;
+ {$ENDIF}
+end;
+
+procedure TRxDBCalcEdit.Notification(AComponent: TComponent;
+ Operation: TOperation);
+begin
+ inherited Notification(AComponent, Operation);
+ // if the datasource is being removed then we need to make sure
+ // we are updated or we can get AV/Seg's *cough* as I foolishly
+ // discovered firsthand....
+ if (Operation=opRemove) then
+ begin
+ if (FDataLink<>nil) and (AComponent=DataSource) then
+ DataSource:=nil;
+ end;
+end;
+
+procedure TRxDBCalcEdit.EditingDone;
+begin
+ inherited EditingDone;
+ if FDataLink.CanModify then
+ FDataLink.UpdateRecord;
+end;
+
+procedure TRxDBCalcEdit.RunDialog;
+begin
+ inherited RunDialog;
+ if FDataLink.CanModify then
+ FDataLink.UpdateRecord;
+end;
+
+constructor TRxDBCalcEdit.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FDataLink:=TFieldDataLink.Create;
+ FDataLink.Control:=Self;
+ FDataLink.OnActiveChange:=@ActiveChange;
+ FDataLink.OnDataChange:=@DataChange;
+ FDataLink.OnUpdateData:=@UpdateData;
+end;
+
+destructor TRxDBCalcEdit.Destroy;
+begin
+ FreeAndNil(FDataLink);
+ inherited Destroy;
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/dbutils.pas b/components/rx/version/v2.2_laz_1.2/dbutils.pas
new file mode 100644
index 000000000..64bbc4456
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/dbutils.pas
@@ -0,0 +1,1041 @@
+{ dbutils unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit dbutils;
+
+{$I rx.inc}
+
+interface
+
+uses
+ LCLType, LCLProc, LCLIntf, Registry, Classes, SysUtils, DB, IniFiles;
+
+const
+ IntegerDataTypes = [ftSmallint, ftInteger, ftWord, ftLargeint];
+
+ NumericDataTypes = IntegerDataTypes + [ftFloat, ftCurrency, ftBCD];
+
+ DataTimeTypes = [ftTime, ftDateTime, ftTimeStamp];
+
+ StringTypes = [ftString, {ftMemo,} ftFixedChar, ftWideString, ftFixedWideChar, ftWideMemo];
+
+
+type
+ TRxSearchDirection = (rsdAll, rsdForward, rsdBackward);
+
+type
+
+{ TLocateObject }
+
+ TLocateObject = class(TObject)
+ private
+ FDataSet: TDataSet;
+ FLookupField: TField;
+ FLookupValue: string;
+ FLookupExact, FCaseSensitive: Boolean;
+ FBookmark: TBookmark;
+ FIndexSwitch: Boolean;
+ procedure SetDataSet(Value: TDataSet);
+ protected
+ function MatchesLookup(Field: TField): Boolean;
+ procedure CheckFieldType(Field: TField); virtual;
+ procedure ActiveChanged; virtual;
+ function LocateFilter: Boolean; virtual;
+ function LocateKey: Boolean; virtual;
+ function LocateFull: Boolean; virtual;
+ function UseKey: Boolean; virtual;
+ function FilterApplicable: Boolean; virtual;
+ property LookupField: TField read FLookupField;
+ property LookupValue: string read FLookupValue;
+ property LookupExact: Boolean read FLookupExact;
+ property CaseSensitive: Boolean read FCaseSensitive;
+ property Bookmark: TBookmark read FBookmark write FBookmark;
+ public
+ function Locate(const KeyField, KeyValue: string; Exact,
+ ACaseSensitive: Boolean): Boolean;
+ property DataSet: TDataSet read FDataSet write SetDataSet;
+ property IndexSwitch: Boolean read FIndexSwitch write FIndexSwitch;
+ end;
+
+type
+ TCreateLocateObject = function: TLocateObject;
+const
+ CreateLocateObject: TCreateLocateObject = nil;
+function CreateLocate(DataSet: TDataSet): TLocateObject;
+
+{ Utility routines }
+
+function IsDataSetEmpty(DataSet: TDataSet): Boolean;
+procedure RefreshQuery(Query: TDataSet);
+function DataSetSortedSearch(DataSet: TDataSet; const Value,
+ FieldName: string; CaseInsensitive: Boolean): Boolean;
+function DataSetSectionName(DataSet: TDataSet): string;
+
+procedure InternalSaveFields(DataSet: TDataSet; IniFile: TObject;
+ const Section: string);
+procedure InternalRestoreFields(DataSet: TDataSet; IniFile: TObject;
+ const Section: string; RestoreVisible: Boolean);
+
+{procedure InternalSaveFields(DataSet: TDataSet; IniFile: TIniFile;
+ const Section: string);
+procedure InternalRestoreFields(DataSet: TDataSet; IniFile: TObject;
+ const Section: string; RestoreVisible: Boolean);}
+
+function DataSetLocateThrough(DataSet: TDataSet; const KeyFields: string;
+ const KeyValues: Variant; Options: TLocateOptions; SearchOrigin:TRxSearchDirection = rsdAll): Boolean;
+
+procedure SaveFieldsReg(DataSet: TDataSet; IniFile: TRegIniFile);
+procedure RestoreFieldsReg(DataSet: TDataSet; IniFile: TRegIniFile;
+ RestoreVisible: Boolean);
+procedure SaveFields(DataSet: TDataSet; IniFile: TIniFile);
+procedure RestoreFields(DataSet: TDataSet; IniFile: TIniFile;
+ RestoreVisible: Boolean);
+procedure AssignRecord(Source, Dest: TDataSet; ByName: Boolean);
+function ConfirmDelete: Boolean;
+procedure ConfirmDataSetCancel(DataSet: TDataSet);
+procedure CheckRequiredField(Field: TField);
+procedure CheckRequiredFields(const Fields: array of TField);
+function ExtractFieldName(const Fields: string; var Pos: Integer): string;
+procedure FillValueForField(const Field: TField; Value:Variant);
+procedure CloneRecord(DataSet: TDataSet; IgnoreFields: array of const);
+
+{ SQL expressions }
+
+function DateToSQL(Value: TDateTime): string;
+function FormatSQLDateRange(Date1, Date2: TDateTime;
+ const FieldName: string): string;
+function FormatSQLDateRangeEx(Date1, Date2: TDateTime;
+ const FieldName: string): string;
+function FormatSQLNumericRange(const FieldName: string;
+ LowValue, HighValue, LowEmpty, HighEmpty: Double; Inclusive: Boolean): string;
+function StrMaskSQL(const Value: string): string;
+function FormatSQLCondition(const FieldName, AOperator, Value: string;
+ FieldType: TFieldType; Exact: Boolean): string;
+function FormatAnsiSQLCondition(const FieldName, AOperator, Value: string;
+ FieldType: TFieldType; Exact: Boolean): string;
+
+const
+ TrueExpr = '0=0';
+
+const
+ { Server Date formats}
+ sdfStandard16 = '''"''mm''/''dd''/''yyyy''"'''; {"mm/dd/yyyy"}
+ sdfStandard32 = '''''''dd/mm/yyyy'''''''; {'dd/mm/yyyy'}
+ sdfOracle = '"TO_DATE(''"dd/mm/yyyy"'', ''DD/MM/YYYY'')"';
+ sdfInterbase = '"CAST(''"mm"/"dd"/"yyyy"'' AS DATE)"';
+ sdfMSSQL = '"CONVERT(datetime, ''"mm"/"dd"/"yyyy"'', 103)"';
+
+const
+ ServerDateFmt: string[50] = sdfStandard16;
+
+{const
+ ftBlobTypes = [Low(TBlobType)..High(TBlobType)];}
+
+procedure _DBError(const Msg: string);
+
+implementation
+
+uses Forms, Controls, Dialogs, RXDConst, VCLUtils, FileUtil,
+ AppUtils, RxAppUtils, RxStrUtils, Math, DateUtil;
+
+{ Utility routines }
+
+procedure _DBError(const Msg: string);
+begin
+ DatabaseError(Msg);
+end;
+
+function ConfirmDelete: Boolean;
+begin
+ Screen.Cursor := crDefault;
+ Result := MessageDlg(SDeleteRecordQuestion, mtConfirmation,
+ [mbYes, mbNo], 0) = mrYes;
+end;
+
+procedure ConfirmDataSetCancel(DataSet: TDataSet);
+begin
+ if DataSet.State in [dsEdit, dsInsert] then begin
+ DataSet.UpdateRecord;
+ if DataSet.Modified then begin
+ case MessageDlg(SConfirmSave, mtConfirmation, mbYesNoCancel, 0) of
+ mrYes: DataSet.Post;
+ mrNo: DataSet.Cancel;
+ else SysUtils.Abort;
+ end;
+ end
+ else DataSet.Cancel;
+ end;
+end;
+
+function SetToBookmark(ADataSet: TDataSet; ABookmark: TBookmark): Boolean;
+begin
+ Result := False;
+ with ADataSet do
+ if Active and (ABookmark <> nil) and not (Bof and Eof) and
+ BookmarkValid(ABookmark) then
+ try
+ ADataSet.GotoBookmark(ABookmark);
+ Result := True;
+ except
+ end;
+end;
+
+{ Refresh Query procedure }
+
+procedure RefreshQuery(Query: TDataSet);
+var
+ BookMk: TBookmark;
+begin
+ with Query do
+ begin
+ DisableControls;
+ try
+ if Active then
+ BookMk := GetBookmark
+ else
+ BookMk := nil;
+ try
+ Close;
+ Open;
+ SetToBookmark(Query, BookMk);
+ finally
+ if BookMk <> nil then
+ FreeBookmark(BookMk);
+ end;
+ finally
+ EnableControls;
+ end;
+ end;
+end;
+
+{ TLocateObject }
+
+procedure TLocateObject.SetDataSet(Value: TDataSet);
+begin
+ ActiveChanged;
+ FDataSet := Value;
+end;
+
+function TLocateObject.LocateFull: Boolean;
+begin
+ Result := False;
+ with DataSet do
+ begin
+ First;
+ while not EOF do
+ begin
+ if MatchesLookup(FLookupField) then
+ begin
+ Result := True;
+ Break;
+ end;
+ Next;
+ end;
+ end;
+end;
+
+function TLocateObject.LocateKey: Boolean;
+begin
+ Result := False;
+end;
+
+function TLocateObject.FilterApplicable: Boolean;
+begin
+ Result := FLookupField.FieldKind in [fkData, fkInternalCalc];
+end;
+
+function TLocateObject.LocateFilter: Boolean;
+var
+ SaveCursor: TCursor;
+ Options: TLocateOptions;
+ Value: Variant;
+begin
+
+// SaveCursor := Screen.Cursor;
+// Screen.Cursor := crHourGlass;
+ try
+ Options := [];
+ if not FCaseSensitive then Include(Options, loCaseInsensitive);
+ if not FLookupExact then Include(Options, loPartialKey);
+ if (FLookupValue = '') then
+ Value:=null //VarClear(Value)
+ else
+ Value := FLookupValue;
+ Result := DataSet.Locate(FLookupField.FieldName, Value, Options);
+ finally
+// Screen.Cursor := SaveCursor;
+ end;
+end;
+
+procedure TLocateObject.CheckFieldType(Field: TField);
+begin
+end;
+
+function TLocateObject.Locate(const KeyField, KeyValue: string;
+ Exact, ACaseSensitive: Boolean): Boolean;
+var
+ LookupKey: TField;
+begin
+ if DataSet = nil then
+ begin
+ Result := False;
+ Exit;
+ end;
+ DataSet.CheckBrowseMode;
+ LookupKey := DataSet.FieldByName(KeyField);
+ DataSet.CursorPosChanged;
+ FLookupField := LookupKey;
+ FLookupValue := KeyValue;
+ FLookupExact := Exact;
+ FCaseSensitive := ACaseSensitive;
+ if FLookupField.DataType <> ftString then
+ begin
+ FCaseSensitive := True;
+ try
+ CheckFieldType(FLookupField);
+ except
+ Result := False;
+ Exit;
+ end;
+ end;
+ FBookmark := DataSet.GetBookmark;
+ try
+ DataSet.DisableControls;
+ try
+ Result := MatchesLookup(FLookupField);
+ if not Result then
+ begin
+ if UseKey then
+ Result := LocateKey
+ else
+ begin
+{ if FilterApplicable then Result := LocateFilter
+ else} Result := LocateFull;
+ end;
+ if not Result then SetToBookmark(DataSet, FBookmark);
+ end;
+ finally
+ DataSet.EnableControls;
+ end;
+ finally
+ FLookupValue := EmptyStr;
+ FLookupField := nil;
+ DataSet.FreeBookmark(FBookmark);
+ FBookmark := nil;
+ end;
+end;
+
+function TLocateObject.UseKey: Boolean;
+begin
+ Result := False;
+end;
+
+procedure TLocateObject.ActiveChanged;
+begin
+end;
+
+function TLocateObject.MatchesLookup(Field: TField): Boolean;
+var
+ Temp: string;
+begin
+ Temp := Field.AsString;
+ if not FLookupExact then
+ SetLength(Temp, Min(Length(FLookupValue), Length(Temp)));
+ if FCaseSensitive then Result := AnsiCompareStr(Temp, FLookupValue) = 0
+ else Result := AnsiCompareText(Temp, FLookupValue) = 0;
+end;
+
+function CreateLocate(DataSet: TDataSet): TLocateObject;
+begin
+ if Assigned(CreateLocateObject) then Result := CreateLocateObject()
+ else Result := TLocateObject.Create;
+ if (Result <> nil) and (DataSet <> nil) then
+ Result.DataSet := DataSet;
+end;
+
+{ DataSet locate routines }
+function DataSetLocateThrough(DataSet: TDataSet; const KeyFields: string;
+ const KeyValues: Variant; Options: TLocateOptions; SearchOrigin:TRxSearchDirection = rsdAll): Boolean;
+var
+ FieldCount: Integer;
+ Fields: TList;
+
+ function CompareField(Field: TField; Value: Variant): Boolean;
+ var
+ S,S1: string;
+
+ begin
+ if Field.DataType = ftString then
+ begin
+ if loCaseInsensitive in Options then
+ begin
+ S := UTF8UpperCase(Field.AsString);
+ S1:=UTF8UpperCase(Value);
+ end
+ else
+ begin
+ S := Field.AsString;
+ S1:=Value;
+ end;
+{ if (loPartialKey in Options) then
+ Delete(S, Length(S1) + 1, MaxInt);
+
+ if (loCaseInsensitive in Options) then
+ Result := UTF8CompareText(S, S1) = 0
+ else
+ Result := UTF8CompareStr(S, S1) = 0;}
+
+ if (loPartialKey in Options) then
+ Result := UTF8Pos(S1, S) > 0
+ else
+ begin
+ Result := UTF8CompareStr(S, S1) = 0;
+ end;
+ end
+// else Result := false //(Field.Value = Value);
+ else Result := (Field.Value = Value);
+ end;
+
+ function CompareRecord: Boolean;
+ var
+ I: Integer;
+ begin
+ if FieldCount = 1 then
+ Result := CompareField(TField(Fields.First), KeyValues)
+ else begin
+ Result := True;
+ for I := 0 to FieldCount - 1 do
+ Result := Result and CompareField(TField(Fields[I]), KeyValues[I]);
+ end;
+ end;
+
+var
+ Bookmark: TBookmark;
+begin
+ Result := False;
+ with DataSet do begin
+ CheckBrowseMode;
+ if BOF and EOF then Exit;
+ end;
+ Fields := TList.Create;
+ try
+ DataSet.GetFieldList(Fields, KeyFields);
+ FieldCount := Fields.Count;
+
+ if SearchOrigin = rsdAll then
+ begin
+ Result := CompareRecord;
+ if Result then Exit;
+ end;
+
+ DataSet.DisableControls;
+ try
+ Bookmark := DataSet.GetBookmark;
+ try
+ if SearchOrigin in [rsdAll, rsdForward] then
+ begin
+ if SearchOrigin = rsdAll then
+ DataSet.First;
+ while not DataSet.EOF do
+ begin
+ Result := CompareRecord;
+ if Result then Break;
+ DataSet.Next;
+ end;
+ end
+ else
+ if SearchOrigin = rsdBackward then
+ begin
+ //DataSet.Last;
+ while not DataSet.BOF do
+ begin
+ Result := CompareRecord;
+ if Result then Break;
+ DataSet.Prior;
+ end;
+ end;
+
+ finally
+{$IFDEF NoAutomatedBookmark}
+ if not Result and DataSet.BookmarkValid(PChar(Bookmark)) then
+{$ELSE}
+ if not Result and DataSet.BookmarkValid(Bookmark) then
+{$ENDIF}
+ DataSet.GotoBookmark(Bookmark);
+ end;
+ finally
+ DataSet.FreeBookmark(Bookmark);
+ DataSet.EnableControls;
+ end;
+ finally
+ Fields.Free;
+ end;
+end;
+
+procedure SaveFields(DataSet: TDataSet; IniFile: TIniFile);
+begin
+ InternalSaveFields(DataSet, IniFile, DataSetSectionName(DataSet));
+end;
+
+procedure RestoreFields(DataSet: TDataSet; IniFile: TIniFile;
+ RestoreVisible: Boolean);
+begin
+ InternalRestoreFields(DataSet, IniFile, DataSetSectionName(DataSet),
+ RestoreVisible);
+end;
+
+procedure SaveFieldsReg(DataSet: TDataSet; IniFile: TRegIniFile);
+begin
+ InternalSaveFields(DataSet, IniFile, DataSetSectionName(DataSet));
+end;
+
+procedure RestoreFieldsReg(DataSet: TDataSet; IniFile: TRegIniFile;
+ RestoreVisible: Boolean);
+begin
+ InternalRestoreFields(DataSet, IniFile, DataSetSectionName(DataSet),
+ RestoreVisible);
+end;
+
+{ DataSetSortedSearch. Navigate on sorted DataSet routine. }
+
+function DataSetSortedSearch(DataSet: TDataSet; const Value,
+ FieldName: string; CaseInsensitive: Boolean): Boolean;
+var
+ L, H, I: Longint;
+ CurrentPos: Longint;
+ CurrentValue: string;
+ BookMk: TBookmark;
+ Field: TField;
+
+ function UpStr(const Value: string): string;
+ begin
+ if CaseInsensitive then Result := AnsiUpperCase(Value)
+ else Result := Value;
+ end;
+
+ function GetCurrentStr: string;
+ begin
+ Result := Field.AsString;
+ if Length(Result) > Length(Value) then
+ SetLength(Result, Length(Value));
+ Result := UpStr(Result);
+ end;
+
+begin
+ Result := False;
+ if DataSet = nil then Exit;
+ Field := DataSet.FindField(FieldName);
+ if Field = nil then Exit;
+ if Field.DataType = ftString then begin
+ DataSet.DisableControls;
+ BookMk := DataSet.GetBookmark;
+ try
+ L := 0;
+ DataSet.First;
+ CurrentPos := 0;
+ H := DataSet.RecordCount - 1;
+ if Value <> '' then begin
+ while L <= H do begin
+ I := (L + H) shr 1;
+ if I <> CurrentPos then DataSet.MoveBy(I - CurrentPos);
+ CurrentPos := I;
+ CurrentValue := GetCurrentStr;
+ if (UpStr(Value) > CurrentValue) then
+ L := I + 1
+ else begin
+ H := I - 1;
+ if (UpStr(Value) = CurrentValue) then Result := True;
+ end;
+ end; { while }
+ if Result then begin
+ if (L <> CurrentPos) then DataSet.MoveBy(L - CurrentPos);
+ while (L < DataSet.RecordCount) and
+ (UpStr(Value) <> GetCurrentStr) do
+ begin
+ Inc(L);
+ DataSet.MoveBy(1);
+ end;
+ end;
+ end
+ else Result := True;
+ if not Result then SetToBookmark(DataSet, BookMk);
+ finally
+ DataSet.FreeBookmark(BookMk);
+ DataSet.EnableControls;
+ end;
+ end
+ else
+ DatabaseErrorFmt(SFieldTypeMismatch, [Field.DisplayName]);
+end;
+
+{ Save and restore DataSet Fields layout }
+
+function DataSetSectionName(DataSet: TDataSet): string;
+begin
+ with DataSet do
+ if (Owner <> nil) and (Owner is TCustomForm) then
+ Result := GetDefaultSection(Owner as TCustomForm)
+ else Result := Name;
+end;
+
+function CheckSection(DataSet: TDataSet; const Section: string): string;
+begin
+ Result := Section;
+ if Result = '' then Result := DataSetSectionName(DataSet);
+end;
+
+procedure InternalSaveFields(DataSet: TDataSet; IniFile: TObject;
+ const Section: string);
+var
+ I: Integer;
+begin
+ with DataSet do begin
+ for I := 0 to FieldCount - 1 do begin
+ IniWriteString(IniFile, CheckSection(DataSet, Section),
+ Name + Fields[I].FieldName,
+ Format('%d,%d,%d', [Fields[I].Index, Fields[I].DisplayWidth,
+ Integer(Fields[I].Visible)]));
+ end;
+ end;
+end;
+
+procedure InternalRestoreFields(DataSet: TDataSet; IniFile: TObject;
+ const Section: string; RestoreVisible: Boolean);
+type
+ TFieldInfo = packed record
+ Field: TField;
+ EndIndex: Integer;
+ end;
+ PFieldArray = ^TFieldArray;
+ TFieldArray = array[0..(65528 div SizeOf(TFieldInfo)) - 1] of TFieldInfo;
+const
+ Delims = [' ',','];
+var
+ I, J: Integer;
+ S: string;
+ FieldArray: PFieldArray;
+begin
+{ with DataSet do begin
+ FieldArray := AllocMem(FieldCount * SizeOf(TFieldInfo));
+ try
+ for I := 0 to FieldCount - 1 do begin
+ S := IniReadString(IniFile, CheckSection(DataSet, Section),
+ Name + Fields[I].FieldName, '');
+ FieldArray^[I].Field := Fields[I];
+ FieldArray^[I].EndIndex := Fields[I].Index;
+ if S <> '' then begin
+ FieldArray^[I].EndIndex := StrToIntDef(ExtractWord(1, S, Delims),
+ FieldArray^[I].EndIndex);
+ Fields[I].DisplayWidth := StrToIntDef(ExtractWord(2, S, Delims),
+ Fields[I].DisplayWidth);
+ if RestoreVisible then
+ Fields[I].Visible := Boolean(StrToIntDef(ExtractWord(3, S, Delims),
+ Integer(Fields[I].Visible)));
+ end;
+ end;
+ for I := 0 to FieldCount - 1 do begin
+ for J := 0 to FieldCount - 1 do begin
+ if FieldArray^[J].EndIndex = I then begin
+ FieldArray^[J].Field.Index := FieldArray^[J].EndIndex;
+ Break;
+ end;
+ end;
+ end;
+ finally
+ FreeMemo(Pointer(FieldArray));
+ end;
+ end;}
+end;
+
+(*
+procedure InternalSaveFields(DataSet: TDataSet; IniFile: TIniFile;
+ const Section: string);
+var
+ I: Integer;
+begin
+ with DataSet do
+ begin
+ for I := 0 to FieldCount - 1 do
+ begin
+ IniWriteString(IniFile, CheckSection(DataSet, Section),
+ Name + Fields[I].FieldName,
+ Format('%d,%d,%d', [Fields[I].Index, Fields[I].DisplayWidth,
+ Integer(Fields[I].Visible)]));
+ end;
+ end;
+end;
+
+procedure InternalRestoreFields(DataSet: TDataSet; IniFile: TObject;
+ const Section: string; RestoreVisible: Boolean);
+type
+ TFieldInfo = packed record
+ Field: TField;
+ EndIndex: Integer;
+ end;
+ PFieldArray = ^TFieldArray;
+ TFieldArray = array[0..(65528 div SizeOf(TFieldInfo)) - 1] of TFieldInfo;
+const
+ Delims = [' ',','];
+var
+ I, J: Integer;
+ S: string;
+ FieldArray: PFieldArray;
+begin
+{ with DataSet do
+ begin
+ FieldArray := AllocMemo(FieldCount * SizeOf(TFieldInfo));
+ try
+ for I := 0 to FieldCount - 1 do begin
+ S := IniReadString(IniFile, CheckSection(DataSet, Section),
+ Name + Fields[I].FieldName, '');
+ FieldArray^[I].Field := Fields[I];
+ FieldArray^[I].EndIndex := Fields[I].Index;
+ if S <> '' then begin
+ FieldArray^[I].EndIndex := StrToIntDef(ExtractWord(1, S, Delims),
+ FieldArray^[I].EndIndex);
+ Fields[I].DisplayWidth := StrToIntDef(ExtractWord(2, S, Delims),
+ Fields[I].DisplayWidth);
+ if RestoreVisible then
+ Fields[I].Visible := Boolean(StrToIntDef(ExtractWord(3, S, Delims),
+ Integer(Fields[I].Visible)));
+ end;
+ end;
+ for I := 0 to FieldCount - 1 do begin
+ for J := 0 to FieldCount - 1 do begin
+ if FieldArray^[J].EndIndex = I then begin
+ FieldArray^[J].Field.Index := FieldArray^[J].EndIndex;
+ Break;
+ end;
+ end;
+ end;
+ finally
+ FreeMemo(Pointer(FieldArray));
+ end;
+ end;
+}
+end;
+*)
+
+{
+procedure SaveFields(DataSet: TDataSet; IniFile: TIniFile);
+begin
+ InternalSaveFields(DataSet, IniFile, DataSetSectionName(DataSet));
+end;
+
+procedure RestoreFields(DataSet: TDataSet; IniFile: TIniFile;
+ RestoreVisible: Boolean);
+begin
+ InternalRestoreFields(DataSet, IniFile, DataSetSectionName(DataSet),
+ RestoreVisible);
+end;
+}
+function IsDataSetEmpty(DataSet: TDataSet): Boolean;
+begin
+ with DataSet do Result := (not Active) or (Eof and Bof);
+end;
+
+{ SQL expressions }
+
+function DateToSQL(Value: TDateTime): string;
+begin
+ Result := IntToStr(Trunc(Value));
+end;
+
+function FormatSQLDateRange(Date1, Date2: TDateTime;
+ const FieldName: string): string;
+begin
+ Result := TrueExpr;
+ if (Date1 = Date2) and (Date1 <> NullDate) then
+ begin
+ Result := Format('%s = %s', [FieldName, FormatDateTime(ServerDateFmt,
+ Date1)]);
+ end
+ else
+ if (Date1 <> NullDate) or (Date2 <> NullDate) then
+ begin
+ if Date1 = NullDate then
+ Result := Format('%s < %s', [FieldName,
+ FormatDateTime(ServerDateFmt, IncDay(Date2, 1))])
+ else if Date2 = NullDate then
+ Result := Format('%s > %s', [FieldName,
+ FormatDateTime(ServerDateFmt, IncDay(Date1, -1))])
+ else
+ Result := Format('(%s < %s) AND (%s > %s)',
+ [FieldName, FormatDateTime(ServerDateFmt, IncDay(Date2, 1)),
+ FieldName, FormatDateTime(ServerDateFmt, IncDay(Date1, -1))]);
+ end;
+end;
+
+function FormatSQLDateRangeEx(Date1, Date2: TDateTime;
+ const FieldName: string): string;
+begin
+ Result := TrueExpr;
+ if (Date1 <> NullDate) or (Date2 <> NullDate) then begin
+ if Date1 = NullDate then
+ Result := Format('%s < %s', [FieldName,
+ FormatDateTime(ServerDateFmt, IncDay(Date2, 1))])
+ else if Date2 = NullDate then
+ Result := Format('%s >= %s', [FieldName,
+ FormatDateTime(ServerDateFmt, Date1)])
+ else
+ Result := Format('(%s < %s) AND (%s >= %s)',
+ [FieldName, FormatDateTime(ServerDateFmt, IncDay(Date2, 1)),
+ FieldName, FormatDateTime(ServerDateFmt, Date1)]);
+ end;
+end;
+
+function FormatSQLNumericRange(const FieldName: string;
+ LowValue, HighValue, LowEmpty, HighEmpty: Double; Inclusive: Boolean): string;
+const
+ Operators: array[Boolean, 1..2] of string[2] = (('>', '<'), ('>=', '<='));
+begin
+ Result := TrueExpr;
+ if (LowValue = HighValue) and (LowValue <> LowEmpty) then begin
+ Result := Format('%s = %g', [FieldName, LowValue]);
+ end
+ else if (LowValue <> LowEmpty) or (HighValue <> HighEmpty) then begin
+ if LowValue = LowEmpty then
+ Result := Format('%s %s %g', [FieldName, Operators[Inclusive, 2], HighValue])
+ else if HighValue = HighEmpty then
+ Result := Format('%s %s %g', [FieldName, Operators[Inclusive, 1], LowValue])
+ else begin
+ Result := Format('(%s %s %g) AND (%s %s %g)',
+ [FieldName, Operators[Inclusive, 2], HighValue,
+ FieldName, Operators[Inclusive, 1], LowValue]);
+ end;
+ end;
+end;
+
+function StrMaskSQL(const Value: string): string;
+begin
+ if (Pos('*', Value) = 0) and (Pos('?', Value) = 0) and (Value <> '') then
+ Result := '*' + Value + '*'
+ else Result := Value;
+end;
+
+function FormatSQLCondition(const FieldName, AOperator, Value: string;
+ FieldType: TFieldType; Exact: Boolean): string;
+var
+ EmptyValue: Boolean;
+ FieldValue: string;
+ DateValue: TDateTime;
+ LogicOperator: string;
+begin
+ FieldValue := '';
+ DateValue := NullDate;
+ Exact := Exact or not (FieldType in
+ [ftString, ftDate, ftTime, ftDateTime]);
+ if FieldType in [ftDate, ftTime, ftDateTime] then
+ begin
+ DateValue := StrToDateDef(Value, NullDate);
+ EmptyValue := (DateValue = NullDate);
+ FieldValue := FormatDateTime(ServerDateFmt, DateValue);
+ end
+ else begin
+ FieldValue := Value;
+ EmptyValue := FieldValue = '';
+ if not (Exact or EmptyValue) then
+ FieldValue := ReplaceStr(ReplaceStr(StrMaskSQL(FieldValue),
+ '*', '%'), '?', '_');
+ if FieldType = ftString then FieldValue := '''' + FieldValue + '''';
+ end;
+ LogicOperator := AOperator;
+ if LogicOperator = '' then begin
+ if Exact then LogicOperator := '='
+ else begin
+ if FieldType = ftString then LogicOperator := 'LIKE'
+ else LogicOperator := '>=';
+ end;
+ end;
+ if EmptyValue then Result := TrueExpr
+ else if (FieldType = ftDateTime) and Exact then begin
+ DateValue := IncDay(DateValue, 1);
+ Result := Format('(%s >= %s) and (%s < %s)', [FieldName, FieldValue,
+ FieldName, FormatDateTime(ServerDateFmt, DateValue)]);
+ end
+ else Result := Format('%s %s %s', [FieldName, LogicOperator, FieldValue]);
+end;
+
+function FormatAnsiSQLCondition(const FieldName, AOperator, Value: string;
+ FieldType: TFieldType; Exact: Boolean): string;
+var
+ S, Esc: string;
+begin
+ Esc := '';
+ if not Exact and (FieldType = ftString) then begin
+ S := ReplaceStr(ReplaceStr(ReplaceStr(Value, '/', '//'),
+ '_', '/_'), '%', '/%');
+ if S <> Value then Esc := ' ESCAPE''/''';
+ end
+ else S := Value;
+ Result := FormatSQLCondition(FieldName, AOperator, S, FieldType, Exact) + Esc;
+end;
+
+procedure CheckRequiredField(Field: TField);
+begin
+ with Field do
+ if not ReadOnly and not Calculated and IsNull then
+ begin
+ FocusControl;
+ DatabaseErrorFmt(SFieldRequired, [DisplayName]);
+ end;
+end;
+
+procedure CheckRequiredFields(const Fields: array of TField);
+var
+ I: Integer;
+begin
+ for I := Low(Fields) to High(Fields) do
+ CheckRequiredField(Fields[I]);
+end;
+
+procedure AssignRecord(Source, Dest: TDataSet; ByName: Boolean);
+var
+ I: Integer;
+ F, FSrc: TField;
+begin
+ if not (Dest.State in dsEditModes) then _DBError(SNotEditing);
+ if ByName then begin
+ for I := 0 to Source.FieldCount - 1 do begin
+ F := Dest.FindField(Source.Fields[I].FieldName);
+ if F <> nil then begin
+ if (F.DataType = Source.Fields[I].DataType) and
+ (F.DataSize = Source.Fields[I].DataSize) then
+ F.Assign(Source.Fields[I])
+ else F.AsString := Source.Fields[I].AsString;
+ end;
+ end;
+ end
+ else begin
+ for I := 0 to Min(Source.FieldDefs.Count - 1, Dest.FieldDefs.Count - 1) do
+ begin
+ F := Dest.FindField(Dest.FieldDefs[I].Name);
+ FSrc := Source.FindField(Source.FieldDefs[I].Name);
+ if (F <> nil) and (FSrc <> nil) then begin
+ if F.DataType = FSrc.DataType then F.Assign(FSrc)
+ else F.AsString := FSrc.AsString;
+ end;
+ end;
+ end;
+end;
+
+function ExtractFieldName(const Fields: string; var Pos: Integer): string;
+var
+ I: Integer;
+begin
+ I := Pos;
+ while (I <= Length(Fields)) and (Fields[I] <> ';') do Inc(I);
+ Result := Trim(Copy(Fields, Pos, I - Pos));
+ if (I <= Length(Fields)) and (Fields[I] = ';') then Inc(I);
+ Pos := I;
+end;
+
+procedure FillValueForField(const Field: TField; Value: Variant);
+var
+ DS:TDataSet;
+ P:TBookmark;
+begin
+ DS:=Field.DataSet;
+ DS.DisableControls;
+ P:=DS.GetBookmark;
+ try
+ DS.First;
+ while not DS.EOF do
+ begin
+ DS.Edit;
+ Field.Value:=Value;
+ DS.Post;
+ DS.Next;
+ end;
+ finally
+ DS.GotoBookmark(P);
+ DS.FreeBookmark(P);
+ DS.EnableControls;
+ end;
+end;
+
+function FieldInArray(Field: TField; Arr: array of const): boolean;
+var
+ i: integer;
+ CI: boolean;
+begin
+ Result := False;
+ for i := Low(Arr) to High(Arr) do
+ begin
+ with Arr[i] do
+ begin
+ case VType of
+ vtInteger: Result := Field.Index = VInteger;
+ vtPChar:
+ Result :=
+ AnsiUpperCase(Field.FieldName) = AnsiUpperCase(vPChar);
+ vtString,
+ vtAnsiString:
+ Result :=UpperCase(Field.FieldName) = UpperCase(string(VAnsiString));
+ end
+ end;
+ if Result then
+ exit;
+ end;
+end;
+
+procedure CloneRecord(DataSet: TDataSet; IgnoreFields: array of const);
+var
+ Rec:Array of variant;
+ i:integer;
+begin
+ if not DataSet.Active then exit;
+ i:=DataSet.FieldCount;
+ SetLength(Rec, DataSet.FieldCount);
+
+ for i:=0 to DataSet.FieldCount-1 do
+ begin
+ if (DataSet.Fields[i].FieldKind in [fkData]) and (not DataSet.Fields[i].IsBlob)
+ and (not FieldInArray(DataSet.Fields[i], IgnoreFields)) then
+ begin
+ Rec[i] := DataSet.Fields[i].Value;
+ end;
+ end;
+
+ DataSet.Append;
+
+ for i:=0 to DataSet.FieldCount-1 do
+ begin
+ if (DataSet.Fields[i].FieldKind in [fkData]) and (not DataSet.Fields[i].IsBlob) and (not DataSet.Fields[i].ReadOnly)
+ and (not FieldInArray(DataSet.Fields[i], IgnoreFields)) then
+ begin
+ DataSet.Fields[i].Value:=Rec[i];
+ Rec[i]:=Null;
+ end;
+ end;
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/dcl_rx_ctrl.lpk b/components/rx/version/v2.2_laz_1.2/dcl_rx_ctrl.lpk
new file mode 100644
index 000000000..30301a956
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/dcl_rx_ctrl.lpk
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/rx/version/v2.2_laz_1.2/dcl_rx_ctrl.pas b/components/rx/version/v2.2_laz_1.2/dcl_rx_ctrl.pas
new file mode 100644
index 000000000..0341ae663
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/dcl_rx_ctrl.pas
@@ -0,0 +1,21 @@
+{ This file was automatically created by Lazarus. Do not edit!
+ This source is only used to compile and install the package.
+ }
+
+unit dcl_rx_ctrl;
+
+interface
+
+uses
+ register_rxctrl, rxceEditLookupFields, LazarusPackageIntf;
+
+implementation
+
+procedure Register;
+begin
+ RegisterUnit('register_rxctrl', @register_rxctrl.Register);
+end;
+
+initialization
+ RegisterPackage('dcl_rx_ctrl', @Register);
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/docs/WhatsNew.eng.txt b/components/rx/version/v2.2_laz_1.2/docs/WhatsNew.eng.txt
new file mode 100644
index 000000000..c2934ebcd
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/docs/WhatsNew.eng.txt
@@ -0,0 +1,88 @@
+ + Keys PgUp/PgDn correctly go through previous/next month in TRxCalendarGrid and TRxDateEdit
+ + if try edit closed TRxMemoryData in error message display TRxMemoryData.Name
+ + fix create resource from XPM image
+ + draw shadow on button image in TToolPanel
+ - Fix error in TDBComboBox.EditingDone if DataSet = nil
+ - new code for align button on TToolPanel
+ + property OnUTF8KeyPress now published
+ + New value for ToolPanel.ToolBarStyle - tbsNative - for draw buttons used standart theme from OS
+ + fix options dialog for TToolPanel
+ + In TRxDateEdit add new property - ValidDate. Check valid input.
+ + add 2 component from original RX: TRxSpinButton TRxSpinEdit (Edward Ivanov)
+ - fix images for TRxClock, TRxDateEdit, TAutoPanel (Edward Ivanov)
+ - fix error in TRxDatePicker (Edward Ivanov)
+ + Add new components: TRxDBSpinEdit, TRxTimeEdit, TRxDBTimeEdit
+ + TRxLoginDialo now work.
+ + Rewrite code for draw vertical text in titles RXDBGrid. Code from TAChart
+ + published BorderSpacing in TRxLabel
+ + add demo application for AutoSort in RxDBGrid
+ - fix sort order in TRxMemDataSet
+ - fix draw buttons in ToolPanel with use system themes
+ - fix error in TRxDBComboBox
+ + New mode - Quick search data in grid (code from Aleksey Kozlov with minor fix)
+ - fix error in sort data for Postgres (grigoreo)
+
+22.05.2008 - version 2.0.0.136 (svn revision 100)
+ + In TRxCustomDBLookupCombo add check for CircularDataLink
+ + in TRxCustomDBLookupCombo accelerated drawing data
+ - In TRxCustomDBLookupCombo fix select first record if DataField is emty
+ + In RxDBGrid are published missing events from DBGrid
+ + New component TRxCalendarGrid - simple calendar without heading.
+ - fix error compile module rxappicon.pas in Windows for GTK2 (thx ViruZ)
+ + add new module rxiconv.pas (original module iconv.pas from A.Voito)
+ + minor fix in drawing button caption in setup form TToolbar
+ + fix draw disables state for TRxCustomDBLookupCombo
+ - fix compile rxctrls in fpc 2.2
+ + TPopUpColumnTitle used define NEW_STYLE_TITLE_ALIGNMENT_RXDBGRID
+ + in RxDBGrid images of markers moved to rxdbgrids.lrs (Petr Smolik)
+ + add module for autosort in RxDBGrid exsortzeos.pas for ZeosDB (Petr Smolik)
+ - In TCurrencyEdit property BorderSpacing now published
+ + New procedure StrToStrings in module rxstrutils - fill List:TStrings
+ procedure StrToStrings(const S:string; const List:TStrings; const Delims:Char);
+ + New editor for TField object with Lookup source in TRxDBGrid - base on class TRxDBLookupCombo
+ + In TRxDBLookupCombo work property AutoSize
+ + After change property Font in TRxDBLookupCombo dropdown list used this font
+ + In RxDBGrid create lookup editor for TField
+ - Fix error in TRxLookupEdit
+ + In RxDBGrid published new property from DBGrid
+ + Cosmetic fix in paint TRxCustomDBLookupCombo
+ + Dropdown list in TRxCustomDBLookupCombo show after clikc on component
+ + minor fix in RxDBGrid paint sort marker and column title
+ + New component - TRxDateEdit
+ + In RxDBGrid create editor for field with type ftDate, ftDateTime - based on TRxDateEdit
+ (see Demos/RxDBGrid)
+ - minor fix in filter combobox in RxDBGrid for GTK and GTK2
+ + TRxSpeedButton and TRxClock
+ + new procedure in module dbutils - FillValueForField
+ + editor for property TRxColumnFooter.FieldName
+ + TDBDateEdit inherited from TRxDateEdit, for old style use DBDateEdit_OLD compiller directive
+ (see rx.inc).
+ + In RxDBGrid property FixedHotColor now published
+ - fix error with empty sring in TRxDateEdit.
+ + In property TRxDBLookupCombo.PopUpFormOptions add field AutoFillColumns. Used in dropdown list.
+ - Cleanup code in TRxDBLookupCombo.Paint
+ + In TRxDBLookupCombo property DropDownCount now work
+ - fix error in TRxDBLookupCombo after set value for DataField and LookupSourse.Active=false
+ + In PopUpFormOptions add editor for property Collumns[x].FieldName
+29.08.2007 - version 1.1.5.98 (svn revision 39)
+ + In RxDBgrid - after close dataset list of SelectedRows is cleared
+ + fix resaizing find form for RxDbGrd
+ + compile in latest Lazarus
+ + in TToolbarButton stile tbrSeparator and tbrDivider as Delphi
+ tbrSeparator - separator with line
+ tbrDivider - empty separator
+ + in TToolbarButton new style tbrDropDownExtra - button with dropdown menu.
+12.08.2007 - version 1.1.4.93
+ + in TRxDBComboBox publishe any property
+ + in TRxDBLookupCombo add event OnGetGridCellProps
+ + in rx.inc new define
+ RXDBGRID_OPTIONS_WO_CANCEL_ON_EXIT
+ - in RxDBGrid fix error lose focuse after close filte list
+ + in demo for RxDBGrid add demos for visual filtring data
+ + add new component - TAutoPanel ( Dmitry V. Bolshakov) -
+ doc ifn folder auto_panel_doc
+ + in property OptionsRX add new flag - rdgMrOkOnDblClik
+
+
+ Lagunov Aleksey (alexs)
+ ALEXS75-at-YANDEX-dot-RU
diff --git a/components/rx/version/v2.2_laz_1.2/docs/WhatsNew.rus.txt b/components/rx/version/v2.2_laz_1.2/docs/WhatsNew.rus.txt
new file mode 100644
index 000000000..4fcacaf7a
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/docs/WhatsNew.rus.txt
@@ -0,0 +1,446 @@
+ + Клавиши PgUp/PgDn корректно пролистывают предыдущий/следующий месяц в TRxCalendarGrid и TRxDateEdit
+ + При попытке редактирования закрытого набора данных TRxMemoryData в сообщении об ошибке выдаётся наименование набора данных
+ + Исправлено создание ресурсов из XPM файлов
+ + Доработана отрисовка тени у кнопки на TToolPanel
+ - Исправлена ошибка в TDBComboBox.EditingDone; если не присвоен DataSet
+ - Переработан код выравнивания кнопок на TToolPanel
+ + Опубликовано свойство OnUTF8KeyPress;
+ + Свойство ToolPanel.ToolBarStyle теперь может принимать значение tbsNative - для отрисовки кнопок используется
+ текущая тема
+ + Доработано окно настройки панели инструментов
+ + У компоненты TRxDateEdit добавлено свойствой - ValidDate. Определяет коректность введённой даты.
+ + Добавлена два исходных компонента: TRxSpinButton и TRxSpinEdit (автор порта - Edward Ivanov)
+ - исправлены глифы у TRxClock, TRxDateEdit, TAutoPanel (Edward Ivanov)
+ - Исправления в TRxDatePicker (Edward Ivanov)
+ + Добавлены компоненты TRxDBSpinEdit, TRxTimeEdit, TRxDBTimeEdit
+ + TRxLoginDialo теперь работает. По сравнению с оригинальным функционал сильно расширен.
+ Изменён дизайн формы
+ + Улучшена отрисовка вертикальных заголовков в гриде. Код из TAChart
+ + Опубликова BorderSpacing в TRxLabel
+ + Добавлен пример для использования автоматической сортировки в RxDBGrid
+ - Исправлена сортировка при использовании TRxMemDataSet
+ - Исправлена отрисова кнопки в ToolPanel при отрисовке с использованием текущей темы
+ + Реализована возможность объединения ячеек в заголовке таблицы
+ (смотрите в демке на RxDBGrid)
+ - Исправлена ошибка установки значения для TRxDBComboBox
+ + Реализовн режим быстрого поиска (код от Алексея Козлова с небольшими доработками) - подробнее смотри пункт 6 в
+ файле readmy.txt
+ - Исправлена ошибка при работе сортировки с рускими полями под Postgres (grigoreo)
+ + В опциях FBDataSet добавлен флаг poNotSetDefaultParams - не устанавливать форматы полей при открытии БД
+ - Исправлена ошибка переключения стиля RxDateEdit с диалога на popup
+ + Улучшена отрисовка текста кнопки в ToolBar
+ + Свойство TCustomRxDateEdit.YearDigits теперь работает
+ + Большой патч от Rene Herranz Daniel (rhdaniel74.(at).gmail.com) - доработки по сортировке данных,
+ меню правого верхнего угла, фильтрация данных
+ + Начато написание документации в формета LazDoc
+ - Исправлено изменение цвета конца недели в RxDateEdit
+ + Добавлена демка для RxDBLookup
+ + У объекта TRxDBLookupCombo опубликовано свойство Text - установка значения для него вызывает поиск по лукап-листу
+ + Локальная фильтрация в RxDBGrid-е использует значения Field.DisplayText, а не Field.AsString
+ + В форме настроек колонок RxDBGrid работает перемещение столбцов
+ + При сохранении состояния RxDBGrid сохраняется также положение столбцов
+ - Исправлена ошибка в RxDBGrid при сохранении состояния Visible колонок
+ + В RxDBGrid в функции поиска колонки по её наименованию TRxDBGrid.ColumnByCaption
+ не учитывается регистр символов
+ + В RxDBGrid сохраняется между сеансами порядок сортировки
+ + В RxDBGrid при автоматическом подборе ширины колонки учитывается ширина заголовка
+ + модуль
+ + В объекте TRxMemoryData переключил фильтрацию на стандартный механизм из модуля DB - раньше был код
+ для обхода ошибок. В дальнейшем событие OnFilterRecordEx будет полностью исключено из компонента
+ + Новый модуль rxFileUtils - набор дополнительных функций для работы с файлами:
+ GetFileOwnerUser - возвращает имя пользователя-владельца файла (пока только windows)
+ GetFileOwnerData - возвращает информацию о владельце файла (пока только windows)
+ NormalizeDirectoryName - приводит все разделитили каталогов в имени файла к тому виду, как принятов данной ОС.
+ + У TRxColumnFooter доступно свойство NumericValue - содержит числовое представление значения
+ итогов по столбцу. Имеет смысл только для ValueType = fvtSum, fvtAvg, fvtMax, fvtMin
+ + Новая компонента TRxVersionInfo - обёртка над вызовами функция чтения ресурсов файла
+ - Исправлено рисование изображение в колонках RxDBGrid-а если выключен индикатор или заголовок
+ - Исправлено рисование колонок с объединёнными заголовками
+ - Введдена обработка ситуации востановления состояния RxDBGrid-а, если количество колонок во время востановления меньше,
+ чем было в момент сохранения
+ + Новая компонента TRxAboutDialog - окно для отображения информации о программе (пример смотреть в демке по RxDBGrid-у)
+ + Добавлена поддержка компиляции под WinCE
+ - Исправлена ошибка автоподбора ширины колонки при двойном щелчке по заголвку колонки
+ + При подсчёте итоговой строки не вызываются лишние просчёты по данным (если нет агрегатных функций)
+ + Для RXDbGrid-а реализована система назначения функциональных клавиш на вызов функций (сортировка, фильтрация и т.д.)
+ добавлено новое свойство KeyStrokes
+ + Добавлен новый компонент RxCurredit
+ + Добавлен новый компонент- TRxViewsPanel
+ + у компоненты TRxMemoryData убрана зависимость от модуля Forms
+ + Улучшено отображение редактора полей типа TDateTime/TDate в RxDBGrid
+ + У TRxCollumn компоненты TRxDBGrid для стиля cbsPickList добавлено свойство DirectInput.
+ Если оно установлено в false - значения поля можно выбрать только из выпадающего списка
+ + Добавлены 2 комопненты - TRxRadioGroup и TRxDBRadioGroup. В отличии от стнадартных позволяют выборочно запрещать некоторые RadioButton-ы на
+ компоненте через свойство ItemEnabled.
+
+ + Новая компонента - TRxCloseFormValidator. Предназначена для размещения на диалоговых модальных окнах, при закрытии такого окна
+ проверяет на обязательную заполненность списка полей ввода, перечисленных в свойстве Items.
+ + В модуле rxStrUtils большая часть функция помечена как устаревшая - они дублируют функционал из модуля StrUtils. В дальнешем они
+ будут удалены в целях уменьшения кол-ва кода.
+ + У RxDBGrid-а при вводе даты подставляется маска ввода
+22.05.2008 - версия 2.0.0.136 (svn revision 100)
+ + У объекта TRxCustomDBLookupCombo введён контроль на CircularDataLink
+ + У объекта TRxCustomDBLookupCombo ускорена отрисовка данных
+ - У объекта TRxCustomDBLookupCombo исправлен выбор первой записи из справочника при
+ пустом значени в DataField
+ + В RxDBGrid опубликованы недостающие обработчики из DBGrid
+ + Реализован новый компонент TRxCalendarGrid - простой календарь без заголовка.
+ - Исправлена ошибка компиляции модуля rxappicon.pas под Windows при использовании
+ интерфейса GTK2 (спасибо ViruZ - Вадим Витомский)
+ + Добавлен модуль rxiconv.pas (оригинальный модуль iconv.pas от A.Voito)
+ + Небольшое улучшение отрисовки заголовка кнопки в форме настройки TToolbar
+ + Исправлена отрисовка запрещённого состояния у TRxCustomDBLookupCombo
+ - Исправлена компиляция модуля rxctrls в fpc 2.2
+ + В TPopUpColumnTitle введена поддержка дерективы
+ NEW_STYLE_TITLE_ALIGNMENT_RXDBGRID
+ + В RxDBGrid изображения маркеров вынесены в ресурсы (Petr Smolik)
+ + Добавлен модуль автоматической сортировки в RxDBGrid exsortzeos.pas для ZeosDB (Petr Smolik)
+ - В TCurrencyEdit опубликовано свойство BorderSpacing
+ + В модуль rxstrutils добавлена процедура StrToStrings - заполняет класс TStrings строками
+ содержащимися в строке S и разделёнными симовлом Delims
+ + Реализован редактор свойств для полей LookupField и LookupDisplay у компонент
+ TRxLookupEdit и TRxDBLookupCombo
+ + TRxDBLookupCombo реализована поддержка свойства AutoSize
+ + При установке свойства Font у TRxDBLookupCombo выпадающий список использует этот же шрифт
+ + Если у объекта TField установленый лукапные источники то при редактировании в RxDBGrid
+ такого поля вызывается редактор на основе TRxDBLookupCombo
+ - Исправлена ошибка в компоненте TRxLookupEdit - не правильно закрывался выпадающий список
+ + В RxDBGrid опубликованны недостающие поля
+ + Косметические изменения отрисовки TRxCustomDBLookupCombo
+ + Выпадающий список в TRxCustomDBLookupCombo отображатеся просто по клику на компоненте
+ + В RxDBGrid доработана отрисовка маркера сортировки и заголовка колонки
+ + Перенесён и дописан компонент TRxDateEdit
+ + В RxDBGrid реализован редактор для полей типа ftDate, ftDateTime на основае TRxDateEdit
+ (см. Demos/RxDBGrid)
+ + Доработки фильтрации в RxDBGrid для GTK и GTK2
+ + Перенесены компоненты TRxSpeedButton и TRxClock
+ + новая функция в модуле dbutils - FillValueForField
+ + Реализован редактор для RxColumnFooter.FieldName
+ + TDBDateEdit теперь наследуется от TRxDateEdit, чтобы оставить как было необходимо
+ включить директиву DBDateEdit_OLD. Для работоспособности программ необходимо переоткрыть все формы
+ в дизайнере.
+ + В RxDBGrid опубликованы недостающие поля
+ - Исправлена ошибка в обработке пустой даты в редакторе дат.
+ + В свойстве PopUpFormOptions компоненты TRxDBLookupCombo добавлено поле AutoFillColumns - аналог одноимённого поля
+ из TDBGrid - используется в выпадающем списке
+ - Улучшен код в отрисовке компоненты TRxDBLookupCombo
+ + В TRxDBLookupCombo работает свойство DropDownCount
+ - Исправлена ошибка TRxDBLookupCombo при LookupSourse.Active=false и установке значения для поля DataField
+ + В свойстве PopUpFormOptions компоненты TRxDBLookupCombo для элемента из списка Collumns добавлен редктор на FieldName
+
+29.08.2007 - версия 1.1.5.98 (svn revision 39)
+ + В RxDBGrid После закрытия набора данных список помеченных строк (SelectedRows)
+ очищается
+ + Улучшено масштабирование формы поиска по RxDbGrd
+ + Компиляция в последнем Lazarus
+ + TToolbarButton различает теперь стили tbrSeparator и tbrDivider
+ tbrSeparator - разделитьль с чертой
+ tbrDivider - пустой разделитель
+ + TToolbarButton новый стиль tbrDropDownExtra - кнопка с выпадающим меню.
+ В отличии от tbrDropDown это работает как кнопка + если нажата крайня правая область - то
+ тогда появляется меню. (интерфейс ещё коряв - надо будет доработать в дальнейшем)
+12.08.2007 - версия 1.1.4.93
+ + В TRxDBComboBox опубликованы недостающие поля
+ + В TRxDBLookupCombo добавлено обработчик OnGetGridCellProps
+ - позволяет задавать при отрисовке фон в выпадающем списке
+ + В rx.inc ввёл новую дерективу компиляции
+ RXDBGRID_OPTIONS_WO_CANCEL_ON_EXIT
+ если она определени - то в свойстве TRxDbGrid.Options выключается флаг
+ dgCancelOnExit (см. пункт 5 из readmy.txt)
+ - В RxDBGrid исправлена ошибка потери фокуса после закрытия списка фильтра
+ + В примере на RxDBGrid добавлен промер на визуальную фильтрацию данных
+ + Добавлен компонент TAutoPanel (автор Dmitry V. Bolshakov) -
+ документация в папке auto_panel_doc
+ + В свойстве OptionsRX добавлен новый флаг - rdgMrOkOnDblClik
+ при его установке при двойном нажатии на RxDbGrid форме, которой принадлежит
+ RxDbGrid присиваивается ModalResult:=mrOk;
+25.06.2007 - версия 1.1.3.86
+ - Исправлена ошибка в методе TRxMemoryData.SortOnFields
+ + Добавлена поддержка сортировок из RxDBGrid на TRxMemoryData
+ - достаточно просто подключить в проект модуль rxsortmemds
+ + В RxDBGrid добавлен метод UpdateTitleHight - принудительный пересчёт высоты заголовок колонок
+ - В RxDBGrid испралено определение нажатия на последнйи столбец
+ + В RxDBGrid в заголовке введена специальная обработка символа | - это
+ считается безусловный разделитель строк
+ + В RxDBGrid.OptionsRx добавлен флаг rdgMultiTitleLines -
+ при наличии в заголовке символа | между строками рисуется разделительная
+ линия
+ + В rx.inc ввёл новую дерективу компиляции
+ NEW_STYLE_TITLE_ALIGNMENT_RXDBGRID
+ если она определна, то при создании новых колонок в RxDBGrid заголовок центрируется,
+ если эта деректива не определена - то поведение заголовка стандартное - выравнивается
+ по левому краю
+ + В TRxDBLookupCombo если в свойстве PopUpFormOptions заданы колонки то при отрисовке данных
+ в строке используется ширина, указанная в колонках
+ + В TRxDBLookupCombo после закрытия списка запоминается ширина колонок, установленная
+ оператором
+31.05.2007 - версия 1.1.2.77
+ - Исправлена компиляция модуля rxtoolbar.pas с последними версиями LCL
+ (после введения тем) - сам TToolPanel ещё не работает с темами
+ - Исправил компиляцию модуля rxlogin.pas - была ошибка на SetCursor
+15.05.2007 - версия 1.1.1.75
+ + В RxDBGrid добавлен метод OptimizeColumnsWidth(AColList:String) - подбирает
+ ширину колонки (колонок - перечисление через ";") по содержимому
+ + В RxDBGrid добавлен метод OptimizeColumnsWidthAll - соотвественно производит автободбор
+ ширины для всех колонок
+ + TRxColumn добавлен метод OptimizeWidth - подбор ширины указанной колонки
+ Для всех методов подбора ширины производится также выфетчивание всех записей
+ + Опция rdgDblClickOptimizeColWidth в свойстве RxDBGrid.OptionsRx работает
+ - исправлен глюк расчёта высоты заголовка колонки для многострочного заголовка
+ - Исправлен глюк отерытия примера на RxDBGrid
+ + В примере на RxDBGrid добавлен примера на оптимизацию ширины
+28.03.2007 - версия 1.1.0.68
+ - В RxDBGrid исправлена отрисовка итоговой строки при изменении размера колонок
+ + В RxDBGrid в свойстве OptionsRx добавлено состояние rdgXORColSizing
+ - при включённом прорисовка масштабирования колонки происходит линией
+ (контуром), окончательная прорисовка колонки происходит после окончания изменения
+ размера столбца - стандартное поведение в Delphi
+ - Изменён метод отрисовки итоговой строки (код от Yogrik)
+ + Небольшие доработки с позиционированием кнопок в ToolBar-е
+ + В TRxDBLookupCombo улучшена отрисовка выпадающего списка
+ + В TRxColumnTitle добавлены свойства Hint и ShowHint - подсказка, всплывающая при
+ наведении курсора на заголовок колонки в TRxDBGrid
+ + Реализована поддержка фильтрации днных в TRxDBGrid (код от Yogrik)
+01.11.2006 - версия 1.0.19.61
+ + В выпадающем списке компонента TRxDBLookupCombo реализован быстрый поиск
+ по столбцу, заданному свойством LookupDisplayIndex.
+ Из-за ограничений LCL поиск осуществляется пока только по вводу чисел
+ + В RxDBGrid добавлено отображение строки итогов (Footer row), соответсвенно введены
+ необходимые свойства в колонках.
+ Внимание: из-за ошибок в TDataSet не работает коректно пока агрегатные функции
+ (SUM, MAX, MIN, AVG)
+ + В TRxMemoryData реализовал свойство AppendRecord - пока не будет написано аналогичное
+ в TDataSet
+ + Новый Демо - RxDBGrid - демонстрация возможностей RxDBGrid
+ - В RxDBGrid исправлен вызов OnDrawColumnCell
+08.09.2006 - версия 1.0.18.56
+ + У объекта TToolPanel ввёл параметр ButtonAllign = (tbaNone, tbaLeft, tbaRignt)
+ выравнивание по умолчанию кнопок, tbaNone - это старое поведение
+ + У объекта TToolbarItem (кнопка панели инструментов) введена поддержка типа
+ tbrSeparator - разделитель между кнопками
+ + При закрытии списка у TRxDBLookupCombo происходит перерисовка
+ владельца (parent) компонента - обхожу глюк LCL в Win32
+19.08.2006 - версия 1.0.17.53
+ + изменил по умолчанию рамку popup окна у TRxDBLookupCombo на стиль bsNone
+ (так привычнее)
+ + Одиночный клик мышки в списке popup окна у TRxDBLookupCombo также закрывает
+ его
+ - исправлена поведении в обработке клавиши ESC у компоненты TRxDBLookupCombo -
+ если поле набора данных не пустое - то происходит установка поля в null и обнуление
+ сканкода клавишы, при пустом поле (повторное нажатие) - клавиша не брабатывается
+ + У RxDBLookupCombo не срабатывало событие OnChange
+15.05.2006 - версия 1.0.16.49
+ + Полностью переписан выпадающий список для объекта TRxDBLookupCombo
+ + У объекта TRxDBLookupCombo введено новое свойство PopUpFormOptions - в нём
+ собраны все параметры выпадающего списка
+ если заполнен список PopUpFormOptions.Columns то список отоборажаемых
+ полей в гриде берётся из этого свойства, иначе возьмётся строка
+ LookupDisplay - здесь перечисляется список полей через точку с запятой (";")
+
+11.05.2006 - версия 1.0.15.47
+ + В RxDBGrid добавлено свойство с дополнительными параметрами, работают пока два
+ отображение окна поиска в списке и окна выбора колонок к отображению
+ + при включённой опции в свойстве OptionsRx нажатие сочетания клавш Ctrl+F
+ отображает окно поиска по списку
+ + при включённой опции в свойстве OptionsRx нажатие сочетания клавш Ctrl+W
+ отображает окно выбора колонок
+ + изменён случай вызлва для события TRxDbGrid.OnGetCellProps - для ячеки, которая
+ в данный момент сфокусирована - событие не вызвается
+ + В TRxDBGrid добавлено свойство:
+ function TRxDBGrid.ColumnByFieldName(AFieldName: string): TRxColumn
+ возвращает указатель на требуемый столбец по имени поля набора данных
+ в случае отсутсвия данного столбца - вернёт nil
+11.04.2006 - версия 1.0.14.41
+ - небольшое исправление в отображение CurrencyEdit
+14.02.2006 - версия 1.0.13.40
+ - исправлена отрисовка RxDbGrid с не подключённым набором данных
+ - исправлена в RxDbGrid отрисовка заголовка колонки с набором полей по умолчанию
+ + В TToolPanel добавлена поддержка выделенного списка изображений (Selected image list)
+ (при наличии в нём изображений кнопки рисуются из него при наведённых на него курсоре)
+ - исправлена ошибка сжатия колонки в RxDbGrid (деление на 0)
+ - Исправлена кустомизация TToolPanel во время выполнения еслине у всех Items
+ установлено свойство Action
+12.01.2006 - версия 1.0.12.38
+ + в RxDbGrid в заголовке колонки добавлено свойство Orientation - отвечает за
+ направление отрисовки текста в заголовке столбца
+ + добавлена демка для демонстрацииотрисовки текста вертикально (под углом 90
+ градусов)
+21.12.2005
+ + в RxDbGrid добавлено свойство AllowedOperation - для запрета выплнения некоторых
+ операций
+ + в RxDbGrid доработан обработчик события OnGetCellProps
+ + в TRxMemoryData введено свойство OnFilterRecordEx - временно, пока в TDataSet
+ не реализуют работу свойства OnFilterRecord
+16.12.2005 - версия 1.0.11.35
+ + доработано поведение TToolbarButton для коректной работы
+ в последних сборках Lazarus
+ + исправлен регистр в названиях некоторых модулей
+ + пробная сборка под Linux
+27.11.2005 - версия 1.0.11.34
+ - TToolPanel - исправлена ошибка сохранения свойств панели при
+ редактировании её в runtime
+22.10.2005 - версия 1.0.10.33
+ + TRxLabel - перенесён компонент
+ + TSecretPanel - перенесён компонент
+ - TRxMemoryData - внесён код, обходящий ошибку востановления свойства FieldDefs
+ в модуле DB - работает вроде теперь всё правильно
+ + TRxLoginDialog - начат перенесён
+ - TRxDBComboBox - небольшой багфикс
+15.10.2005 - версия 1.0.9.30
+ + TRxCustomDBLookupCombo - Улучшена отрисовка
+ (старый стиль отрисовки будет при включённом Flat)
+ + TRxCustomDBLookupCombo - При нажатии клавишы ESC поле очищается (метод DataField.Clear)
+ - TRxCustomDBLookupCombo - Исправлена ошибка отрисовки пустого значения DataField в режиме
+ DisplayAllFields - отображается значение свойства EmptyValue
+ - TRxCustomDBLookupCombo - Исправлена ошибка открытия списка допустимых значений при
+ пустом DataField (список стоял на последней записи)
+ - TRxCustomDBLookupCombo - исправлен расчёт высоты выпадающего списка в зависимости
+ от значения свойства DropDownCount
+ - TRxCustomDBLookupCombo - исправлен выбор значения в выпадающем спсике нажатием
+ клавишы Enter
+ + TRxMemoryData - Введён код для обхода глюка Lazarus с не корректным созданием полей
+ по данным FieldDefs, которые были созданы в Design-time
+ + TRxMemoryData - реализован редактор компоненты - копия струтктуры из другого
+ DataSet-а
+ + TRxDBGrid - подключен редактор свойства FieldName у колонки
+ + TRxDBGrid - реализована возможность подстановки значений для отображения
+ через свойства KeyList и PickList (аналогично TRxDBComboBox)
+10.10.2005
+ - Исправлена ошибка при рисовании изображения в RxDbGrid из ImageList,
+ также операция немного ускорена
+ - исправлена ошибка при изменении ширины колонки (деление на 0)
+ + начата работа над сохранением состояния колонок RxDbGrid через FormStorage
+ - Небольшой багофикс при работе с изображениями в TToolPanel
+ + Добавил компонент TPageManager
+ + Написал новый компонент TRxAppIcon - это для тех кто не хочет возиться с
+ ресурсами - в момент запуска приложению будет сопоставлена указанная иконка.
+ т.к. она хранится не в стандартном виндовом ресурсе - поэтому проводник
+ будет показывать на приложении обычную иконку - но в момент запуска
+ появится указанная. Работает только под Windows - если кто знает как это
+ делается в других системах - допишите.
+ Когда в лазаре доделают нормальную работу с иконками - компоненту надо
+ переписать - а может лазарь научится создавать стандартный ресурс виндовый
+ для программы - тогда в этой компоненте надобность вобще отпадёт
+
+08.10.2005
+ + Окно настройки теперь вегда сверху
+ + Для более тонкой настройки отображения кнопок добави в опциях тулбара
+ два дополнительных флага - tpGlyphPopup, tpCaptionPopup
+ - небольшие багофиксы
+ + реализована работа с изображениями в RxDbGrid через ImageList (см. readmy.txt)
+ + Добавлен компонент TRXXPManifest - работает только под Windows -
+ поддержка XP манифеста
+05.10.2005
+ + убрал свойстов Flat, TransparentBtn
+ + Добавил свойство Options, включающее tpFlatBtns, tpTransparentBtns
+ + Добавил включение окна настройки подвойному клику на панели
+ правой кнопкой мышки с зажатым Ctrl
+ - исправл баг множественного открытия окна настройки панели
+ + у TToolbarItem добавил свойство Tag
+
+04.10.2005
+ + в TToolPanel пофиксил баг не верного начального размера кнопки
+ + Добавлена возможность прорисовки кнопок в стиле WindowsXP
+ + При в стиле Flat и WindowsXP при наведении курсора на кнопку
+ она приподнимается для лучшего визуализации
+ - т.к. TImageList.Draw не умеет рисовать запроещённое состояние
+ изоражения при задисабливании Action не дисаблится картинка
+ также из-за этого нет возможности сделать изображение с тенью
+ - вылазиет баг в лазаре если в дизайнере удалить напрямую с панели
+ кнопку (не через Items) - ещё не знаю как в лазаре в дизайнере
+ для некоторых элементов запретить удаление
+ + Добавил демку для TToolPanel
+
+03.10.2005
+ + перевёл все имена файлов к нижнему регистру
+ + в TToolPanel пофиксил некторые баги
+ + работает окно настройки панели
+ + Поддерживается DropDownMenu в стиле полного нажатия кнопки
+ + скрытие не нужных кнопок (настройка в run-time)
+
+
+02.10.2005 (beta)
+ + Начата реализация (полностью своя) TToolPanel - аналог RxToolbar
+ по функциональности похоже на стандартный ToolBar - точно
+ также работает через Actions (для добавления кнопок использовать метод Items)
+ полностью моя перерисовка кнопок - нормальный внешний вид.
+ работает:
+ + кустомизация расположения кнопок и внешнего вида в run-time
+ + сохранение во внешний конфигурационный файл через propstorage
+ будут реализованы:
+ - DropDownMenu - в зависимости от стиля кнопки либо выпадает
+ при нажатии на кнопку, либо будет отдельнная облясть кнопки (суб.кнопка) для
+ вызова меню
+ - скрытие ненужных кнопок (настройка в run-time)
+ - стили отображения (сейчас стандарт Win9x, Flat) - добавляю как в WinXP
+ - мастер создания панели в DesignTime в лазаре
+ змеченые глюки
+ - не всегда коректно востанавливается при ширина кнопок
+
+ принимаю заявки на функциональность и ошибки
+
+30.10.2005
+ + перенёс
+ + перенёс RxDice, RxSwith, TRxDBComboBox
+ + Разбил на 2 закладки - RX и RX DBAware
+ - исправил баг с начальным размером у TRxDBLookupCombo
+
+
+28.10.2005
+ + практически работает Currency edit (не проверил под линухом)
+ - из-за ошибки в функиции FormatFloat из FCL нельзя использовать в строке
+ форматирования одинарные или двойные кавычки - повесится
+19.10.2005
+ + TRxMemoryData - работает почти полностью - нет поддержки blob - надо разбирать
+ + начал перенос Currency edit
+ + правил ошибки
+ - ещё не всё проверил в линуксе - теоретически должно собраться и работать
+05.10.2005
+ + Добавлен TRxDBGrid - написан по "мотивам оригинального, ещё есть что переносить
+ самое главное, почему его начал переносить - захотелось сделать сортировку
+ наборов данных как в DBGridEh из EhLib. Я вышел с предложением на
+ Jesus Reyes (автор DBGrid-а о добавлении функциональности) - он сказал, что нефиг
+ превращать стандартный компонент в новогоднюю ёлку. Поэтому стал сам доделывать
+ наследника.
+ Сейчас работает многострочные заголовки, подерживается нажатие на заголовок
+ как на кнопку с опциональным отображением символа сортировки (соответсвующее событие)
+
+ также добавил механизм автосортировки см. файл exSortFB.pas - тут наиболее лаконично
+ всё. Кратко - для необходимых типов источноков данных
+ пишется обёртка (наследник от TExDBGridSortEngine) который умеет в этом
+ источнике данных переупорядочивать записи. Мой TFBDataSet (работаю с FireBird)
+ умеет сам в локальном кэше сортировать запис - поэтому там всё просто.
+ exsortmds.pas - этот модуль для сортировки данных в стандартном MemDS
+ немного кривовато написано - практически нет механизмов добраться до внутреннего
+ буфера данных (кстати в MemDS есть баг позиционирования курсора на 1-ю запись)
+
+ - TRxMemoryData - вроде всё скомпилировалось практически без правки - но чтото при
+ добавлении записи - ошибка (подозреваю не совместимость DataSet-а из дельфей и Лазаря)
+ надо разобраться. Стандартный MemDS ограничен - нет блоб и прочего.
+31.09.2005
+ + Add component TFolderLister - это моя разработка - на основе неё добавлю
+ ещё компонент для построения меню, содержащее отчёты для LazReport-a
+ (аналог у меня в дельфях моей также разработки)
+07.01.2005
+ i'm port next RX components:
+ TDBDateEdit - не даёт вводить значения руками - наследство от оригинального
+ TDateEdit
+ TRxDBCalcEdit
+ TRXLookupEdit,
+ TRxDBLookupCombo - тут баг - при кидании на форму не коректно устанавливаются
+ размеры, приходится руками ресайзить - когда нить доделаю - или кто сможет -
+ помогайте.
+
+
+ and next modules:
+ DateUtil.pas
+ DbUtils.pas
+ rxdconst.pas
+ RXStrutils.pas
+ VCLUtils.pas
+
+жду замечаний и предложений
+ Лагунов Алексей (alexs)
+
+ ALEXS75-на-YANDEX-точка-RU
+
diff --git a/components/rx/version/v2.2_laz_1.2/docs/auto_panel_doc/autopnl.txt b/components/rx/version/v2.2_laz_1.2/docs/auto_panel_doc/autopnl.txt
new file mode 100644
index 000000000..6ee921320
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/docs/auto_panel_doc/autopnl.txt
@@ -0,0 +1,36 @@
+TAutoPanel 1.0. TPanel with some extension.
+
+Tested under Delphi 3,4.
+
+Allow to change size and position of child components when changing a size
+of AutoPanel
+
+
+Programmer: Dmitry V. Bolshakov
+(4232)41-19-82 (voice in Russia)
+Home page: tax25.marine.su/dmitryb
+E-mail: dmitryb@tax25.marine.su
+FidoNet 2:5045/41.63
+QCI # 10785451
+
+
+
+Added 4 property
+
+property AutoChildPosLeft : Boolean;
+// Indicates whether the left position of child components will be
+// changed when changing a size of panel
+property AutoChildPosTop : Boolean;
+// Indicates whether the top position of child components will be
+// changed when changing a size of panel
+property AutoChildWidth : Boolean; // Indicates whether the width of
+// child components will be changed when changing a size of panel
+property AutoChildHeight : Boolean; // Indicates whether the height of
+// child components will be changed when changing a size of panel
+
+Warning: Don't insert the child component in AutoPanel at RunTime.
+
+INSTALLATION
+Open menu "Component\Install Component...". In "Unit file name" browse
+AutoPanel.pas. In "Package file name" browse LIB\dclusr30.dpk (dclusr40.dpk
+in Delphi 4) . Click Ok.
\ No newline at end of file
diff --git a/components/rx/version/v2.2_laz_1.2/docs/error.txt b/components/rx/version/v2.2_laz_1.2/docs/error.txt
new file mode 100644
index 000000000..5fa8b1273
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/docs/error.txt
@@ -0,0 +1,2 @@
+Замеченные проблемы:
+
diff --git a/components/rx/version/v2.2_laz_1.2/docs/faq.txt b/components/rx/version/v2.2_laz_1.2/docs/faq.txt
new file mode 100644
index 000000000..e48d22046
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/docs/faq.txt
@@ -0,0 +1,10 @@
+1.
+ Q. Почему в выподающем списке TRxCustomDBLookupCombo клавишы
+ HOME и END не позиционируют в начало/конец списка
+ A. Для отображения списка используется объект TRxDBGrid
+ (прямой наследник TDBGrid) - в нём для позиционирования в
+ начало/конец списка клавиши Ctrl+Home/Ctrl+End
+
+2. В RxDBGrid режим быстрого поиска работает при RxDBGrid.ReadOnly = true
+ подробнее смотри пункт 6 в файле readmy.txt
+
diff --git a/components/rx/version/v2.2_laz_1.2/docs/makehtml.sh b/components/rx/version/v2.2_laz_1.2/docs/makehtml.sh
new file mode 100755
index 000000000..6c1cb11b5
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/docs/makehtml.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+#надо скопировать rx.inc в текущий каталог, иначе не соберём (глюк fpdoc)
+cp ../rx.inc rx.inc
+fpdoc --package=rxfpc --format=html --index-colcount=4 --hide-protected \
+ --input=../curredit.pas --descr=rxfpc.xml \
+ --input=../dbdateedit.pas --descr=rxfpc.xml \
+ --input=../duallist.pas --descr=rxfpc.xml \
+ --input=../folderlister.pas --descr=rxfpc.xml \
+ --input=../rxctrls.pas --descr=rxfpc.xml \
+ --input=../rxdice.pas --descr=rxfpc.xml \
+ --input=../rxlookup.pas --descr=rxfpc.xml \
+ --input=../rxlogin.pas --descr=rxfpc.xml \
+ --input=../rxtoolbar.pas --descr=rxfpc.xml \
+ --input=../rxspin.pas --descr=rxfpc.xml \
+ --input=../rxclock.pas --descr=rxfpc.xml \
+ --input=../rxmemds.pas --descr=rxfpc.xml \
+ --input=../rxswitch.pas --descr=rxfpc.xml \
+ --input=../tooledit.pas --descr=rxfpc.xml \
+ --input=../pickdate.pas --descr=rxfpc.xml \
+ --input=../rxversinfo.pas --descr=rxfpc.xml \
+ --input=../rxtimeedit.pas --descr=rxfpc.xml \
+ --input=../rxdbcomb.pas --descr=rxfpc.xml \
+ --input=../rxdbtimeedit.pas --descr=rxfpc.xml \
+ --input=../rxdbgrid.pas --descr=rxfpc.xml \
+ --input=../rxdbgrid_columsunit.pas --descr=rxfpc.xml \
+ --input=../rxdbgrid_findunit.pas --descr=rxfpc.xml \
+ --input=../rxdbctrls.pas --descr=rxfpc.xml \
+ --input=../rxdbspinedit.pas --descr=rxfpc.xml \
+ --input=../rxaboutformunit.pas --descr=rxfpc.xml \
+ --input=../rxaboutdialog.pas --descr=rxfpc.xml \
+ --input=../dateutil.pas --descr=rxfpc.xml \
+ --input=../rxfileutils.pas --descr=rxfpc.xml \
+ --input=../rxdbgridexportspreadsheet_paramsunit.pas --descr=rxfpc.xml \
+ --input=../rxdbgridexportspreadsheet.pas --descr=rxfpc.xml
diff --git a/components/rx/version/v2.2_laz_1.2/docs/readmy.txt b/components/rx/version/v2.2_laz_1.2/docs/readmy.txt
new file mode 100644
index 000000000..fc96e4f7f
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/docs/readmy.txt
@@ -0,0 +1,66 @@
+1. Для использовании в RxDbGrid списка изображений ImageList
+ необходимо указать в свойстве KeyList правило выбора изображения
+ в формате "Значение поля"="Код изображения"
+ т.е. если поле принимает значения 1,2,3 а для этих значений необходимы
+ рисунки с номерами 2,5,1 то список необходимо заполнить следующим
+ образом:
+ 1=2
+ 2=5
+ 3=1
+
+2. TPageManager предназначен для построения мастеров
+ умеет отображать в заголовке формы (если установлена соответсвующая опция)
+ текст, который сформатирует из строк информациия (пропускается через функцию Format)
+ строка информации может содержать в себе два целочисленных параметра (%d)
+ первый - текущий шаг
+ второй - всего шагов
+ пример:
+ 'Мастер приёма. Шаг %d из %d.'
+
+ StatusControl - если установлен то в заголовке также отображается эта же
+ информация.
+
+ событие OnCheckPageEnabled служит для указания, что конкретная страница
+ запрещена при нажатии на кнопки Next и Prior эта страница пропускается
+
+3. RxAppIcon - для выбора иконки приложения в режиме разработки нажмите
+ правой кнопкой мышки по компоненте и выберите "Load Icon"
+
+ В ран-тайме тот-же эффект достигается кодом:
+
+ RxAppIcon1.LoadFromFile('full-2.ico');
+ RxAppIcon1.ApplyIcon;
+ ^^^^^^^^^^^ - путь к иконке
+
+4. Для нормальной работы используйте последнюю версию Lazarus
+ сборкой не ниже 0.9.19 (10151) - появилась в SVN 01.11.2006
+
+5. Замечание о RXDBGRID_OPTIONS_WO_CANCEL_ON_EXIT и флаге dgCancelOnExit в
+ TRxDbGrid.Options
+ в случае использования следующей схемы под линуксом:
+ В форму ложим список TRxDbGrid с открытым набором данных и отдельную кнопку (TSpeedButton) на
+ добавление новой записи в набор данных с вызовом другой модальной формы для редактирования
+ добовляемых значение
+ при открытии формы редактирования набор данных, связанный с TRxDbGrid переходит в состояние
+ редактирования
+ это поведени наблюдается только по Linux
+
+ объяснение заключается в том что при потере фокуса TDbGrid и его наследниеи вызывают
+ метод Cancel
+
+6.
+Новшество: Добавлен в RxDBGrid UTF8-быстрый поиск.
+Включается опцией rdgAllowQuickUTF8Search (добавил её в rxoptions, это нормально? или было
+лучше включить в состав других опций?)
+Управляется свойством QuickUTF8Search
+Не реагирует на список "управляющих" клавиш однобайтовых: CBadQuickUTF8SearchSymbols
+По управляющим однобайтовым клавишам сбрасывает подстроку поиска: CCancelQuickUTF8SearchKeys
+Для обработки событий поиска добавлен тип TRxQuickUTF8SearchNotifyEvent
+Перед началом попытки поиска вызывает событие BeforeQuickUTF8Search, в качестве AValue
+передаётся подстрока-кандидат на поиск, если её сбросить в текущее значение QuickUTF8Search
+поиск производится не будет
+После успешного завершения поиска вызывается событие AfterQuickUTF8Search, куда передаётся в
+качестве AValue предыдущая подстрока поиска. Последнее событие удобно использовать для
+отображения где ни будь на общей форме текущий подстроки поиска.
+
+7. Вопросы задавать мылом или на форуме FreePascal.ru (предпочтительней)
diff --git a/components/rx/version/v2.2_laz_1.2/docs/rxfpc.xml b/components/rx/version/v2.2_laz_1.2/docs/rxfpc.xml
new file mode 100644
index 000000000..c11bd9ae0
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/docs/rxfpc.xml
@@ -0,0 +1,2963 @@
+
+
+
+ Пакет времени разработки
+
+
Данный пакет содержит в себе вспомогательные классы и утилиты, которые необходимы во время разработки программы.
+
Все эти данные не используются во время работы готовой программы, поэтому этот код не включается в финальные версии программ.
+
+
+
+
+
+ Абстрактный класс сортировки данных
+ Абстрактный класс сортировки данных в RXDBGrid.
+От этого класса необходимо создавать наследников, которые будут предоставлять функционал по сортировке данных в наборе данных, который подключен к RXDBGrid.
+
+
+ Абстрактный метод сортировки по столбцу
+ Этот метод необходимо перекрывать в наследнике для обеспечения функции сортировки данных при щелчке по столбцу в RxDBGrid-е
+
+
+ Абстрактный метод сортировки по нескольким столбцам
+ В RXDBGrid-е есть возможность сортировки по нескольким столбцам одновременно.
+Если набор данных имеет такую возможность, то данный метод необходимо переопределить и вписать в нём вызов сортировки по нескольким столбцам.
+
+
+ Этот класс представляет собой заголовок столбца в RXDbGrid
+
+ TRxColumnTitle = class(TColumnTitle)
+Этот класс наследует все основные свойства заголовка из DBGrid и добавялет инструменты по отображению многострочных заголовков
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Текст, выводимый в последней строке списка
+ При установленном занчении свойства
+ValueType равным fvtStaticText, в последней строки списка оторажается введённое здесь значение
+
+
+ Определяем тип занчения, автоматически расчитываемого в итоговой строке
+
+ Определяем тип занчения, автоматически расчитываемого в итоговой строке
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Наследник от стандартного TDBGrid с дополнительными возможностями
+
+
Компонента TRxDBGrid предназначена, как и стандартная компонента TDBGrid, для отображения данных таблиц БД или результатов запросов в табличной форме. Являясь наследником TDBGrid, компонента TRxDBGrid имеет все те же свойства и методы, и, кроме того, некоторые свойства, находящиеся у TDBGrid в секции protected, вынесены в секцию public. Это такие свойства, как Col, Row, LeftCol, Canvas.
+
Другие отличия от TDBGrid:
+
- BLOB-поля базы данных, такие как графические изображения, текстовые мемо-поля, другие BLOB'ы могут отображаться в таблице в виде пиктограмм при установленном в True значении свойства ShowGlyphs;
+
- вы можете изменить цвет шрифта и фона любой ячейки таблицы (либо любой ее строки или столбца) в зависимости от значения поля или имени поля набора данных, определив обработчик события OnGetCellParams;
+
- имеются методы SaveLayout и RestoreLayout для сохранения и восстановления порядка и ширин столбцов компоненты TRxDBGrid в INI или XML-файле. Вы можете также автоматически сохранять и восстанавливать эти параметры, присвоив значение свойству IniStorage.
+
- заголовки колонок Grid-а могут быть с помощью свойства TitleButtons использованы как кнопки, например, для изменения порядка сортировки отображаемых данных.
+
- вы можете зафиксировать несколько первых колонок в Grid-е с помощью свойства FixedCols.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Событие, возникающее до выполнения операции быстрого поиска данных в спике
+ Событие, возникающее до выполнения операции быстрого поиска данных в спике
+
+
+
+
+
+ Событие, возникающее после выполнения операции быстрого поиска данных в спике
+ Событие, возникающее после выполнения операции быстрого поиска данных в спике
+
+
+
+
+
+ Данный тип описывает событие при отображении в списке заголовка колонки
+ Данный тип описывает событие при отображении в списке заголовка колонки
+
+
+ property TitleButtons: Boolean;
+ Свойство определяет, могут ли заголовки колонок в Grid-е быть использованы как кнопки. По умолчанию - False.
+При установке свойства в значение True Вы можете обработать события OnTitleBtnClick для обработки нажатия на такую кнопку и OnCheckButton, OnGetBtnParams для установки свойств кнопок в заголовке.
+
+
+
+ Событие получения параметров ячейки в RxDBGrid-е
+
+
Свойство позволяет автоматически сохранять специфические установки компоненты в INI-файле или (для 32-разрядной версии) в системном регистре при помощи компонент TFormPlacement или TFormStorage.
+
При задании значения свойству IniStorage (и непустом имени компоненты), некоторые ее настройки, которые не являются published-свойствами и не могут быть заданы для TFormStorage напрямую, будут сохраняться и восстанавливаться одновременни с другими значениями, заданными для соответствующей компоненты TFormPlacement (TFormStorage).
+
Для TSpeedbar - это расположение кнопок на панели и положение самой панели, для TMRUManager - список строк, для TRxDBGrid - ширины и положение полей в таблице и т.д. Все компоненты, имеющие свойство IniStorage, имеют также методы для сохранения и восстановления их настроек вручную, такие как Save/RestoreLayout и т.д.
+
+
+
+
+ Набор флагов, определяющие поведение при редактировании/добавлении или удалении данных в RxDBGrid
+ Набор флаговфлагов, определяющие поведение при редактировании/добавлении или удалении данных в RxDBGrid
+
+
+ Набор флагов, управляющих поведением RxDBGrid
+
+
Разрешает вызов формы управления отображением и порядком расположения колонок в RxDBGrid-е
+
+
+
rdgAllowDialogFind
+
Разрешает вызов формы поиска данных в RxDBGrid-е
+
+
+
rdgHighlightFocusCol
+
Подсвечивать текущую колонку
+
+
+
rdgHighlightFocusRow
+
Подсвечивать текущую строку
+
+
+
rdgDblClickOptimizeColWidth
+
При двойном щелчке по разделителю между колонками в RxDBGrid-е автоматически подбирать размер колонки по ширине отображаемых данных
+
+
+
rdgFooterRows
+
Отображать итоговую строку (подвал) спика
+
+
+
rdgXORColSizing
+
При изменении размера колонки отображать только будущую границу колонки, саму колонку при этом не менять. В противном случае при изменении размера ширина колонки меняется сразу. Параметр полезен для медленных компьютеров или терминального режима
+
+
+
rdgFilter
+
Разрешить локальную фильтрацию данных
+
+
+
rdgMultiTitleLines
+
Разрешить объединение заголовков колонок
+
+
+
rdgMrOkOnDblClik
+
При двойном щелчке мышки генерировать для формы-владельца грида событие mrOk - полезно при создании формы выбора из списка
+
+
+
rdgAllowQuickSearch
+
Разрешить быстрыый поиск в гриде - в этом режиме нажатие клавиш включет механизм встроенного поиска по текущей колонке, прямое редактирование в списке будет запрещено.
+
+
+
rdgAllowQuickFilter
+
Разрешить быструю фильтрацию в колонках - в заголовке списка будет доступна по нажатию клавиши Ctrl+E дополнительная строка, содержащая ComboBox-ы со значениями колонок. Аналогично сортировки в электронных таблицах.
+
+
+
rdgAllowFilterForm
+
Разрешает к использованию форму фильтрации в RxDBGrid-е
+
+
+
rdgAllowSortForm
+
Разрешает к использованию формы сортировки данных в RxDBGrid-е
+
+
+
rdgAllowToolMenu
+
Включает отображение меню инструментов в RxDBGrid-е. При активации данного параметра в верхнем левом углу грида отрисовывается специальный значок и при его нажатии мышкой выдаётся меню иснтрументов
+
+
+
rdgCaseInsensitiveSort
+
Параметр включает режим сортировки без учёта регистра символов в столбце RxDBGrid-а
+
+
+
+
+
+
+
+ Парамерты сортировки
+ Парамерты сортировки, набор флагов.
+
+
+
+
+
+ Мета-класс сортировщика данных
+ Мета-класс сортировщика данных, используется непосредственно при регистрации экземпляра класса (наследника от TRxDBGridSortEngine) сортировщика данных.
+
+
+
+
+
+
+ Элемент многострочного заголовка
+ Элемент многострочного заголовка
+
+
+
+
+
+
+
+
+
+ Регистрируем класс сортировщика в наборе данных
+
+
RxDBGridSortEngineClass:TRxDBGridSortEngineClass - класс сортировщика
+
DataSetClass:TDataSetClass -
+
+
+
+ Тип описывает событие, возникающее в момент полчения данных в лукпный редактор значения ячейки
+ Тип описывает событие, возникающее в момент полчения данных в лукпный редактор значения ячейки
+
+
+ Тип описывает событие, возникающее в момент показа выпадающего списка лукапного редактора значения ячейки
+ Тип описывает событие, возникающее в момент показа выпадающего списка лукапного редактора значения ячейки
+
+
+ Определяет сочетания для вызова фукнций RxDBGrid
+ Определяет сочетания для вызова фукнций RxDBGrid
+
+
+ Список назначенных клавиш на команды в TRxDBGrid
+
+
+
+
+
+
+
+
+ Список назначенных команд на сочетания клавишь
+
+
+
+ Определяем команду
+
+
+ Определят сочетание клавишь
+
+
+ Признак запрета данного сочетания клавишь
+
+
+
+
+
+
Компонента TRxLabel аналогична стандартной компоненте VCL TLabel, однако дополнительно позволяет придать тексту статического элемента управления (Label) 3-мерный вид, либо отобразить "тень" текста.
+
С помощью свойст ShadowPos, ShadowColor и ShadowSize вы можете задать расположение, цвет и толщину "тени" букв текста. Значения, заданные для этих свойств по умолчанию, создают "трехмерный" эффект изображения текста.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Свойство задает цвет "тени" букв текста статического элемента управления TRxLabel.
+
+
+ Свойство задает толщину "тени" букв текста статического элемента управления TrxLabel.
+
+
+ Свойство задает расположение "тени" букв текста статического элемента управления TrxLabel.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Событие происходит, когда пользователь перемещает курсор мыши в область, находящуюся над элементом управления.
+
+
+ Событие происходит, когда пользователь уводит курсор мыши из области, находящейся над элементом управления.
+
+
+
+
+
+
+ Компонента TSecretPanel предназначена, как и компонента TPanel, для помещения в форму "панелей", на которых могут быть размещены другие элементы управления.
+
+
Компонента TSecretPanel предназначена, как и компонента TPanel, для помещения в форму "панелей", на которых могут быть размещены другие элементы управления.
+
В дополнение к свойствам и методам компоненты TPanel, TSecretPanel имеет возможность размещения "скрытого" текста и изображения, доступных для отображения при установленном в True значении свойства Active. Свойство LinesLines задает список строк текста, который будет "прокручиваться" в направлении снизу вверх или справа налево (в зависимости от значения свойства ScrollDirection) в клиентской области компоненты TSecretPanel при установке Active = True. Если свойство Glyph ассоциировано с графическим изображением, то одновременно это изображение будет показано в области TSecretPanel, заданной свойством GlyphLayout. По окончании прокрутки текста, если свойство Cycled = False, свойство Active автоматически установится в значение False, если же Cycled = True, прокрутка текста возобновится сначала. Вы можете также прервать прокрутку, вручную установив свойство Active в значение False.
+
Событие OnPaintClient позволяет вам достигать всевозможных эффектов при отрисовке клиентской области панели как в активном состоянии (при прокрутке текста), так и в неактивном.
+
+
+
+
+
+
+
+
+
+
Свойство определяет, как будет осуществляться перерисовка компоненты при "прокрутке" текста, т.е. когда свойство Active = True.
+
Если AsyncDrawing = False, то перерисовка синхронизируется с основным потоком приложения. Если AsyncDrawing = True (по умолчанию), то прокрутка текста и перерисовка осуществляется асинхронно, в отдельном потоке.
+
+
+
+
+
Свойство определяет состояние компоненты TSecretPanel. При установке значения этого свойства в True, все компоненты, размещенные на TSecretPanel (у которых свойство Parent указывает на этот объект), скрываются, отображается изображение, заданное свойством Glyph, и начинается автоматическая прокрутка текста, определенного свойством Lines.
+
+
Если свойство Cycled = False, то при прокрутке всего текста свойство Active автоматически устанавливается в значение False. Вы можете также прервать прокрутку ранее, присвоив свойству Active значение False.
+
+
+
+
+
+
Свойство Cycled определяет поведение компоненты после прокрутки всего текста, заданного свойством Lines. Если Cycled = True, то прокрутка текста будет продолжена с начала, если же Cycled = False (по умолчанию), то после прокрутки всего текста свойство Active будет установлено в значение False.
+
+
+
+
+
+ Свойство определяет временной интервал (в милисекундах), с которым происходит смена изображений в компоненте.
+Для TSecretPanel свойство определяет скорость "прокрутки" текста при значении свойства Active = True.
+
+
+ Свойство задает набор текстовых строк, которые не отображаются компонентой TSecretPanel в нормальном ее состоянии, но могут быть "прокручены" (одновременно с отображением битового изображения, заданного свойством Glyph) при установке в True значения свойства Active.
+
+
+ Свойство определяет направление прокрутки срок текста при значении Active=True.
+Возможные значения свойства ScrollDirection:
+• sdVertical - текст прокручивается снизу вверх.
+• sdHorizontal - прокрутка текста осуществляется в направлении справа налево.
+
+
+ Свойство задает стиль отображения текста при его прокрутке в компоненте TSecretPanel. При значении этого свойства, отличном от bvNone, текст выглядит либо "продавленным" (bvLowered), либо "выпуклым" (bvRaised).
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Событие возникает при перерисовке панели как в активном состоянии (Active=True) при прокрутке текста, так и в неактивном.
+Вы можете использовать это событие для создания всевозможных эффектов при отрисовке панели.
+ Имейте в виду, что при наличии обработчика события OnPaintClient компонента TSecretPanel не отрисовывает область, заданную параметром Rect, следовательно, при написании обработчика этого события вы должны как минимум заполнить указанную область, например вызовом метода FillRect.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Компонента аналогична стандартной компоненте TSpeedButton, но имеет некоторые дополнительные возможности.
+Она может быть прозрачной (свойство Transparent) и "всплывающей" (свойство Flat), что позволяет создавать кнопки, аналогичные используемым в панели инструментов Microsoft Internet Explorer 3.x. При установленном значении свойств GrayedInactive и Flat битовое изображение "неактивной" кнопки будет изменяться по сравнению с обычным вариантом.
+
+При установке свойства AllowTimer в значение True, кнопка будет генерировать повторяющиеся события OnClick при нажатии на кнопку до тех пор, пока кнопка находится в нажатом состоянии. Вы можете регулировать интервал между событиями OnClick с помощью свойств InitPause и RepeatInterval.
+Кроме того, Вы можете задать выпадающее меню (с помощью свойства DropDownMenu), которое будет появляться при нажатии на кнопку.
+
+Остальные свойства и методы компоненты TRxSpeedButton те же, что и у TSpeedButton.
+
+
+
+
+ Когда свойство AllowTimer установлено в значение True, кнопка будет генерировать повторяющиеся события OnClick при нажатии на кнопку до тех пор, пока кнопка находится в нажатом состоянии. Вы можете регулировать интервал между событиями OnClick с помощью свойств InitRepeatPause и RepeatPause.
+
+
+ Свойство позволяет задать интервал (в миллисекундах) перед первым событием OnClick, вызывающемся при нажатии кнопки, если свойство AllowTimer установлено в значение True.
+
+
+ Свойство позволяет задать интервал (в миллисекундах) между повторяющимися вызовами события OnClick, если кнопка нажата и свойство AllowTimer = True.
+
+
+ Тип определяет возможные значения свойства ScrollDirection компоненты TSecretPanel
+
+
+
+ Тип определяет метод - обработчик события OnPaintClient компоненты TSecretPanel.
+
+
+ Тип TGlyphLayout задает возможные значения свойства GlyphLayout компоненты TSecretPanel.
+
+
+ Тип TShadowPosition задает возможные допустимые значения для свойства ShadowPos компоненты TRxLabel, задающего положение "тени" статического элемента управления.
+
+
+
+
+ TCurrencyEdit Component
+
+
Компонента служит для ввода и редактирования чисел и денежных сумм. TCurrencyEdit имеет те же свойства, что и ее предок TEdit, но позволяет дополнительно указать формат отображения числа и символы для обозначения вида валюты с помощью свойства DisplayFormat, а также максимальное число символов после десятичной точки (при вводе данных) с помощью свойства DecimalPlaces. Свойство Value позволяет получить или установить численную величину отображаемого в компоненте значения.
+
Если свойство BeepOnError установлено в True, то при вводе в строку недопустимых символов раздается звуковой сигнал.
+
+
+
+
+
+
+
+
Свойство позволяет обратиться к значению Value, сохраненному в компоненте - редакторе для ввода чисел, как к целому числу.
+
+
+
+ Свойство служит для доступа на чтение к форматированному в соответствии со значением DisplayFormat представлению значения ValueValue (совпадает с отображаемой строкой в компоненте, когда элемент редактирования не имеет фокуса ввода). В отличие от этого свойства, свойство Text всегда возвращает неформатированную строку.
+
+
+ Свойство позволяет установить (или получить) численную величину значения, отображаемого в строке ввода. В случае пустой строки возвращается значение 0.
+
+
+
+ Определяет факт автоматического выделения всего текста при попадании фокуса клавиатурного ввода в компонент
+
+
+ Свойство определяет, будет ли размер автоматически изменяться размер шрифта
+
+
+ Если значение этого свойства установлено в True (по умолчанию False), то при ошибках ввода с клавиатуры (недопустимых символов и т.д.) раздается звуковой сигнал.
+
+
+
+
+
+
Свойство определяет, будет ли проверяться допустимый диапазон числа в компонентах TCurrencyEdit при потере фокуса строкой редактирования.
+
Если CheckOnExit = True, то в случае ввода недопустимого значения происходит исключение (exception).
+
+
+
+
+ Свойство определяет максимально допустимое число десятичных знаков при вводе и изменении данных в строке редактирования компоненты TCurrencyEdit. Используется, когда строка имеет фокус ввода. При отображении значения в несфокусированной строке редактирования свойство не используется - применяется маска, заданная свойством DisplayFormat.
+
+
+
+ Свойство задает формат отображения данных в компоненте TCurrencyEdit. При получении компонентой фокуса ввода форматирование данных отменяется и ввод происходит как в обычную строку ввода TEdit. При потере фокуса ввода данные форматируются согласно заданному формату.
+
+
+
+
+
+
+ Свойство определяет, будет ли автоматически форматироваться значение в строке редактора непосредственно при редактировании.
+Формат ввода определяется переменными DecimalSeparator и ThousandSeparator из модуля SysUtils.pas и свойством DecimalPlaces
+
+
+
+
+
+
+
+
+
+ Максимально допустимое значение свойства Value. Значение MaxValue ограничивает максимальную величину числа, которое можно ввести в строку ввода.
+
+
+ Минимально допустимое значение свойства Value. Значение MinValue ограничивает минимальную величину числа, которое можно ввести в строку ввода.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Если значение этого свойства равно True, то когда редактор имеет фокус ввода и значение ValueValue = 0, в нем с качестве текста отображается пустая строка. Если ZeroEmpty = False, то в этом случае текст '0'.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CurrEdit Unit
+
+
The CurrEdit unit contains the declarations for the certain components on the RX Controls page of the Component palette and their associated objects, types, and constants.
+When you add a component declared in this unit to a form, the unit is automatically added to the uses clause of that form's unit.
+
The following items are declared in the CurrEdit unit:
+
+ Components and objects
+
+
+ TCurrencyEdit
+
+
To see a listing of items declared in this unit including their declarations, use the ObjectBrower.
+
+
+
+
+ TRxLookupEdit Component
+
+
Компонента TRxLookupEdit представляет собой редактор с возможностью как прямого ввода текста пользователем в строке редактирования, так и выбора текста из выпадающего списка, заполняемого значениями из базы данных. При открытом списке набор пользователем символов с клавиатуры приводит к позиционированию списка на ближайшую запись, совпадающую с введенным текстом.
+
Для заполнения выпадающего списка используются свойства LookupSource, LookupField, LookupDisplay и LookupDisplayIndex, аналогично списку компоненты TRxDBLookupCombo.
+
Введенное пользователем или выбранное из списка значение доступно через свойство Text.
+Свойство LookupValue (read-only) позволяет получить значение ключевого поля из lookup-набора данных (заданного свойством LookupField), если пользвателем был сделан выбор из списка.
+
+
+
+
+
+
+
+
+ В случае, если свойство LookupDisplay задает более одного поля для отображения в списке, значение свойства LookupDisplayIndex определяет номер поля, значение которого возвращается свойством DisplayValue.
+
+
+
+
+
+ TRxDBLookupCombo Component
+ Unit
+RxLookup
+Description
+Компонента TRxDBLookupCombo почти полностью аналогична стандартной компоненте из VCL TDBLookupCombo и имеет те же самые свойства, методы и события. Однако по сравнению с TDBLookupCombo у этой компоненты есть некоторые дополнительные возможности и свойства.
+TRxDBLookupCombo позволяет использовать в качестве LookupSource любой источник данных - как TTable, так и TQuery, при этом свойство LookupField не обязательно должно быть индексированным полем.
+Компонента TRxDBLookupCombo также позволяет производить поиск нужного термина при наборе первых букв этого термина.
+Например, у вас имеется таблица или результат запроса, седержащий поля CustNo и CustName. Тогда вы можете указать поле CustName как значение свойства LookupDisplay. Если пользователь вашего приложения наберет первые буквы нужной ему фамилии (находящейся в поле CustName), то если компонента TRxDBLookupCombo имеет фокус ввода, автоматически выпадет список доступных значений и выделенный элемент в списке установится в значение, первые буквы которого совпадают с введенными пользователем.
+Если свойство IgnoreCase установлено в True, то при наборе пользователем первых букв термина регистр символов не учитывается. Надо иметь в виду, что при работе с русскоязычными значениями в полях БД не все драйвера поддерживают преобразование регистра символов.
+Свойство IndexSwitch определяет, будет ли при необходимости производиться переключение индексов таблицы (если источником данных служит таблица, а не результат запроса). В случае использования больших SQL-таблиц переключение индексов может занять длительное время, поэтому в таких случаях свойство желательно устанавливать в значение False.
+Свойтсво DisplayEmpty позволяет задать текстовую строку для отображения в строке TRxDBLookupCombo, когда не сделано никакого выбора. Вызов метода ResetField приводит к очистке содержимого компоненты, устоновке значения Value в пустую строку, и отображению значения DisplayEmpty.
+В дополнение к событию OnDropDown, имеющемуся у TDBLookupCombo, компонента имеет событие OnCloseUp, вызываемое при закрытии выпадающего списка. Метод IsDropDown позволяет определить текущее состояние выпадающего списка выбора. Событие OnChange происходит при смене значения cвойства Value.
+Компонента также позволяет задать изображения для рисования в левой части каждой строки списка, в зависимости от содержимого полей БД, с помощью события OnGetImage.
+В остальном компонента TRxDBLookupCombo полностью аналогична компоненте TDBLookupCombo.
+
+ВНИМАНИЕ
+При присвоении значений свойству Value или DisplayValue компонент TRxDBLookupCombo или TRxDBLookupList безошибочное позиционирование на соответствующую запись в списке произойдет только в том случае, если соответствующее поле в подмножестве записей, заданном источником данных DataSource, имеет только уникальные неповторяющиеся значения. В противном случае Вы получите несколько "выбранных" элементов в списке (причем реально будет выбран только один самый первый), значения полей в которых равны заданному. Избегайте таких ситуаций!
+
+При работе с некоторыми SQL-серверами БД установка свойств IndexSwitch или IgnoreCase в значение True может приводить к неожиданному поведению компоненты. В этом случае постарайтесь добиться "правильного" поведения за счет комбинирования разных значений свойств IgnoreCase и IndexSwitch.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ property EmptyValue: string;
+ Свойство задает значение, присвоение которого свойству Value будет восприниматься как присвоение "пустого" значения и приведет к очистке DataField. По умолчанию значение свойства есть пустая строка.
+
+
+ property EmptyItemColor: TColor;
+ Свойство задает значение цвета, которым будет рисоваться дополнительный нескролируемый элемент списка для "пустого" значения (т.е. которое совпадает с DisplayEmpty).
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
The RxLookup unit contains the declarations for the certain components on the RX DBAware page of the Component palette and their associated objects, types, and constants.
+When you add a component declared in this unit to a form, the unit is automatically added to the uses clause of that form's unit.
+
+
+ Событие возникает при закрытии PopUp окна выбора данных.
+
+
+ Событие возникает при закрытии PopUp окна выбора данных.
+
+
+
+
+ Компонента TDBDateEdit - ориентированная на работу с базами данных компонента для редактирования даты. Установленное значение свойства Date становится новым значением поля в БД, если значение свойства ReadOnly компоненты TDBDateEdit - False.
+TDBDateEdit является наследником TDateEdit и имеет все те же свойства и методы, и дополнительно имеет свойства, необходимые для работы с полями базы данных.
+
+Компонента TDBDateEdit может быть применена к тем полям наборов данных, которые позволяют чтение и присвоение значений через свойство AsDateTime.
+
+
+
+
+
+
+
+ Свойство DialogTitle задает заголовок диалогового окна, появляющегося при нажатии на кнопку компоненты TFilenameEdit (TOpenDialog) или TDateEdit, TDBDateEdit (диалог выбора даты).
+
+
+ Компонента TRxDBCalcEdit - ориентированная на работу с базами данных компонента для редактирования чисел с возможностью импользования выпадающего калькулятора. Установленное значение свойства Value становится новым значением поля в БД, если значение свойства ReadOnly - False.
+TRxDBCalcEdit является наследником TDBCalcEdit и имеет все те же свойства и методы, и дополнительно имеет свойства, необходимые для работы с полями базы данных.
+Компонента TRxDBCalcEdit может быть применена к тем полям данных, которые позволяют чтение и присвоение значений через свойства AsFloat, AsInteger.
+
+
+
+
+
+
+
+
+
+ Класс по управлению списком файлов
+ Даный класс предназначен для чтения списка файлов из указанного каталога и формирования по этому списку меню.
+Папка, для сканирования определяется свойством FileFolder
+Пункт меню, куда в качестве подменю будут добавлен список файлов - MenuItem
+
+
+ Метод запускает процесс сканирования папки с файлами
+
+
+
+
+ Свойство содержит в себе имена всех фалов, которые были обнаружены в указанной папке
+
+
Свойство - массив, содержит в себе список всех файлов и каталогов, которые были обнаружены в указанной папке.
Свойство FileFolder определяет каталог с файлами, который будет сканироваться при вызове метода Execute и по содержимому которого будет произведено заполнение массива Files
Данное свойство определяет место в меню, где будет добавлено в виде подменю содержимое каталога FileFolder
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TDualListDialog Component
+ Unit
+DualList
+Description
+Компонента делает доступным вашему приложению диалог с двумя списками, где элементы можно перемещать из одного списка в другой, а также менять порядок следования элементов внутри списка.
+По сравнению с одноименной формой из Delphi Gallery, кроме оформления в виде компоненты, добавлены возможность Drag Drop, задания порядка внутри списка, интерфейсные улучшения.
+Задайте исходное состояние списков в свойствах List1 и List2, вызовите диалог функцией Execute и считайте новый состав списков.
+
+
+
+
+ function Execute: Boolean;
+ Вызов диалога с двумя списками, где можно поменять элементы местами внутри списка или перенести элементы из одного списка в другой.
+
+
+
+
+
+
+
+
+
+
+
+ property List1: TStrings;
+ Список слева.
+
+
+ property List2: TStrings;
+ Список справа.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Компонента позволяющая вам использовать в формах изображения игральных костей в различных положениях.
+
+
Компонента из числа "безделушек", позволяющая вам использовать в формах изображения игральных костей в различных положениях.
+
Текущее состояние компоненты (положение игральной кости) задается свойством Value, которое может изменяться от 1 до 6. Вы можете установить свойство Value в случайное значение, вызвав метод RandomValue. Если вы установите свойство Rotate в значение True, изображение игральной кости начнет случайным образом "вращаться", изменяя значение Value, с частотой, задаваемой свойством Interval. Остановить вращение можно, присвоив значение False свойству . Если свойство AutoStopInterval отлично от 0, то по прошествии этого времени вращение будет остановлено автоматически.
+
При изменении значения Value происходит событие OnChange.
+
+
+
+
+
+ procedure RandomValue;
+ Вызов метода RandomValue позволяет установить значение свойства Value компоненты TrxDice случайным образом (в диапазоне целых чисел от 1 до 6).
+
+
+
+
+ Свойство задает интервал (в мсек), по прошествии которого после установки свойства Rotate в значение True вращение игральной кости будет остановлено
+
+
Свойство задает интервал (в мсек), по прошествии которого после установки свойства Rotate в значение True вращение игральной кости будет остановлено.
+
Если значение AutoStopInterval = 0, то вращение автоматически не останавливается и может быть прекращено присваиванием Rotate = False.
+
+
+
+
+
+
+
+
+ Свойство определяет временной интервал (в милисекундах), с которым происходит смена изображений в компоненте.
+
+
Свойство определяет временной интервал (в милисекундах), с которым происходит смена изображений в компоненте.
+
при Rotate = True это частота смены битовых изображений.
Свойство позволяет автоматически сохранять специфические установки компоненты в INI-файле или (для 32-разрядной версии) в системном регистре при помощи компонент TFormPlacement или TFormStorage.
+
При задании значения свойству IniStorage (и непустом имени компоненты), некоторые ее настройки, которые не являются published-свойствами и не могут быть заданы для TFormStorage напрямую, будут сохраняться и восстанавливаться одновременни с другими значениями, заданными для соответствующей компоненты TFormPlacement (TFormStorage).
+
Для TSpeedbar - это расположение кнопок на панели и положение самой панели, для TMRUManager - список строк, для TRxDBGrid - ширины и положение полей в таблице и т.д. Все компоненты, имеющие свойство IniStorage, имеют также методы для сохранения и восстановления их настроек вручную, такие как Save/RestoreLayout и т.д.
+
+
+
+
+
+
+ Свойство определяет поведение панели инструментов согласно типа
+TToolPanelOption.
+
+
+
+ Выравнивание кнопок на панели инструментов
+ Определяет выравнивание кнопок на панели инструментов
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Стиль поведения кнопки на панели инструментов
+ Стиль поведения кнопки на панели инструментов
+
+
+
Стиль
+
Описание
+
+
+
tbrButton
+
Кнопка
+
+
+
tbrCheck
+
Чек-бокс
+
+
+
tbrDropDown
+
Выпадающее меню
+
+
+
tbrSeparator
+
Разделитель
+
+
+
tbrDivider
+
Разделитель с линией
+
+
+
tbrDropDownExtra
+
Кнопка с выпадающим меню
+
+
+
+
+
+ Стиль отображения на панели инструментов
+
+
Стиль отображения на панели инструментов
+
+
+
Сталь
+
Описание
+
+
+
tbsStandart
+
Отображение кнопок обёмными и квадратными (как было в Windows 95-2000)
+
+
+
tbsWindowsXP
+
Отображение "плоских" голубых кнопок (как в Windows XP)
+
+
+
tbsNative
+
При отображении кнопок используется внешний вид согласно текущей системной темы отрисовки элементов интерфейса
Функция GetUserName возвращает имя оператора, залогиненго в системе
+
+
+
+
+
+ Класс TRxVersionInfo предоставляет доступ к информации о версии программы
+
+
Класс TRxVersionInfo предоставляет доступ к информации о версии программы.
+
После создания объекта этого класса вы можете получить доступ к информации из ресурса VERSIONINFO через свойства (только-для-чтения) объекта, если чтение ресурса из специфицированного файла окончилось успешно. Вы можете проверить результат чтения информации из файла по значению свойства Valid - значение True соответствует успешному чтению данных. При изменении свойства, задающего имя исполняемого файла с ресурсом VERSIONINFO, происходит обновление данных объекта. Успешность обновления можно также проверить по значению свойства Valid.
+
+
Данный класс предоставляет информацию о наиболее часто используемых свойствах скомпилируемого исполняемого модуля. Фактически является надстройкой над пакетом fpc fcl-res
+
+
+
+ Модуль RxVersInfo содержит инструменты доступа к информации о версии программы
+ Модуль RxVersInfo содержит инструменты доступа к информации о версии программы
+
+ procedure LoadFromFile(const AFileName:string);
+ Процедура загружает данные о версии указанного исполняемого модуля
+
+
+ property FileName: string
+ Свойство указываеет
+
+
+ Создаёт объект и загружает данные о версии программы вызовом метода LoadFromFile
+
+
+
+
+
+ property Valid: Boolean;
+ Свойство Valid (только-для-чтения) позволяет вам определить результат чтения данных с информацией о версии из специфицированного исполняемого файла. Значение True говорит о том, что чтение данных прошло успешно, в противном случае Valid = False.
+
+
+ Свойство задает имя исполняемого файла (EXE или DLL), из которого считывается информация о версии. При изменении значения свойства FileName происходит чтение ресурса VERSIONINFO из указанного файла. Если чтение данных окончилось успешно, свойство Valid (только чтение) устанавливается в значение True, иначе - в False.
+
+
+
+ Значение свойства представляет собой указатель на массив идентификаторов языка (language) и набора символов (character-set), используемых при чтении данных из ресурса с информацией о версии.
+
+
+ Идентификатор языка (language), используемого при чтении информации из ресурса.
+
+
+ Идентификатор набора символов (character-set), используемого при чтении информации из ресурса
+
+
+ Свойство определяет номер версии файла как длинное целое.
+
+
+ Свойство позволяет получить строку из информации о версии, обозначенную как комментарий.
+
+
+ Свойство для доступа к строке из иформации о версии, специфицирующей имя компании-производителя.
+
+
+ Свойство для доступа к описанию исполнимого файла из информации о версии.
+
+
+ Свойство для доступа к строке, содержащей номер версии файла, полученной из ресурса типа VERSIONINFO.
+
+
+ Свойство для доступа к строке, содержашей "внутреннее" имя файла, если оно присутствует в информации о версии. Это, например, может быть имя модуля, если файл является динамически загружаемой библиотекой (DLL).
+
+
+ Свойство для доступа к строке из иформации о версии, специфицирующей авторские права.
+
+
+ Свойство для доступа к строке из иформации о версии, специфицирующей товарные знаки и зарегистрированные товарные знаки, применимые к файлу.
+
+
+ Свойство для доступа к строке из иформации о версии, специфицирующей оригинальное (первоначальное) имя файла (не включая путь). Эта информация может понадобиться, если файл переименован пользователем.
+
+
+ Свойство для доступа к строке, содержащей номер версии продукта, полученной из ресурса типа VERSIONINFO, например "3.10" или "5.00.RC2".
+
+
+ Свойство для доступа к имени продукта из информации о версии. Распространение продукта обычно производится с этим именем.
+
+
+ Свойство для доступа к строке из иформации о версии, содержащей частную (конфиденциальную) информацию о предварительной версии продукта. Как правило, в окончательных версиях исполняемых файлов такая информация отсутствует.
+
+
+ Свойство для доступа к строке из иформации о версии, содержащей частную (конфиденциальную) информацию о предварительной версии продукта. Как правило, в окончательных версиях исполняемых файлов такая информация отсутствует.
+
+
+ Values Property
+ Свойство предоставляет доступ к любой текстовой информации из ресурса VERSIONINFO. Считываемая строка задается параметром Name.
+
+
+
+
+
+ Параметры отображени окна информации о программе
+
+
Параметры отображени окна информации о программе
+
+
+
Значение
+
Описание
+
+
+
radHelpButton
+
Отображать кнопку "Помощь"
+
+
+
radLicenseTab
+
Отображать закладку лицензии
+
+
+
radShowImageLogo
+
Отображать логотип на первой закладке
+
+
+
+
+
+ Параметры окна "О программе"
+
+
Набор флагов, определяющий
+параметры отображения окна информации о программе
+
+
+
+
+
+
+
+ Компонента TRXAboutDialog предназначена для отображения информации о программе.
+
+
+ Конструктор создаёт экземпляр класса
+ Конструктор создаёт экземпляр класса
+
+
+ Уничтожает экземпляр класса
+ Уничтожает экземпляр класса
+
+
+ Метод отображет окно "О программе"
+ Метод отображет окно "О программе"
+
+
+ Параметры окна "О программе"
+
+
Набор флагов, определяющий
+параметры отображения окна информации о программе
+
+
+
+
+
+
+ Заголовок программы
+ Заголовок программы, выводимый на первой странице она
+
+
+ Файл лицензии
+
+
+ Заголовок окна
+ Заголовок окна
+
+
+ Логотип, отображаемый в окне "О программе"
+ Изображение логотипа
+
+
+
+
+ Класс представляет собой форму "О программе"
+ Класс представляет собой форму "О программе"
+
+
+ Загружает на страницу "Лицензия" формы "О программе" файл лицензионного соглашения
+
+
+
+
+
+
+
+ Коллекция TRxViewsPanelItems содержит в себе элементы "Кнопки" для переключателя представлений
+
+
+
+
+
+
+
+
+
+ Коллекция TRxViewsPanelItems содержит в себе элементы "Кнопки" для переключателя представлений
+ Коллекция TRxViewsPanelItems содержит в себе элементы "Кнопки" для переключателя представлений
+
+
+
+
+
+ Класс TRxViewsPanel представляет собой визуальный компонент в стиле переключателя представления из MS Project или Gnome Planer.
+ Класс TRxViewsPanel представляет собой визуальный компонент в стиле переключателя представления из MS Project или Gnome Planer.
+
+ Модуль RxViewsPanel содержит визуальный компонент для переключения представлений
+ Модуль RxViewsPanel содержит визуальный компонент для переключения представлений
+
+ Создаёт экземпляр
+
+
+
+ Свойство определяет высоту кнопки в панели
+ Свойство определяет высоту кнопки в панели
+
+
+ Цвет фона панели
+ Цвет фона панели
+
+
+
+ Указатель на изображения для кнопок
+ Указатель на изображения для кнопок на панели.
+
+
+
+
+ Событие возникает при нажатии на кнопку переключения вида
+
+
Событие возникает при нажатии на кнопку переключения вида.
+
+
+
+
ItemIndex
+
Порядковый номер кнопку
+
+
+
Item
+
указатель на кнопку
+
+
+
+
+
+
+
+
+
+
+
+
+ Компонента получает состояние служб на указанном компьютере
+
+
+
+
+ Массив содержит список служб, работающих в системе
+
+
+ Количество эелементов в массиве Items
+
+
+ Имя компьютера, на котором опрашиваются службы
+
+
+ Фильтр отбора служб по типу (служба/драйвер)
+
+
+ Фильтр отбора служб по статусу работает/остановлена
+
+ Модуль содержит компоненту TRxSystemServices
+ Модуль RxSystemServices предназначен для получения информации о состоянии работающих в системе служб (windows) / демонов (unix-like)
+Cодержит компоненту TRxSystemServices.
+
+
+
+
+
+
+ Параметры экспорта в электрунную таблицу
+
+
+ Параметры экспорта в электрунную таблицу
+
+
+
+
+
+
+ Модуль rxdbgridexportspreadsheet содержит класс для экспорта данных из TRxDBGrid в электронную таблицу
+ Модуль rxdbgridexportspreadsheet содержит класс для экспорта данных из TRxDBGrid в электронную таблицу
+
+ Параметры экспорта в электрунную таблицу
+
+
+
+
+
+
+
+
+ Модуль rxdbgridexportspreadsheet_paramsunit содержит окно формы параметров экспорта данных из TRxDBGrid в электронную таблицу
+ Модуль rxdbgridexportspreadsheet_paramsunit содержит окно формы параметров экспорта данных из TRxDBGrid в электронную таблицу
+
+
+
diff --git a/components/rx/version/v2.2_laz_1.2/docs/todo.txt b/components/rx/version/v2.2_laz_1.2/docs/todo.txt
new file mode 100644
index 000000000..cf1592b1e
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/docs/todo.txt
@@ -0,0 +1,3 @@
+1. Необходимо реализовать массив месяцев/дней недель для отвязки от ресурсов FPC
+
+
diff --git a/components/rx/version/v2.2_laz_1.2/duallist.pas b/components/rx/version/v2.2_laz_1.2/duallist.pas
new file mode 100644
index 000000000..271de37c9
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/duallist.pas
@@ -0,0 +1,188 @@
+{ duallist unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit duallist;
+
+interface
+
+{$I rx.inc}
+
+uses Classes, Controls;
+
+type
+
+{ TDualListDialog }
+
+ TDualListDialog = class(TComponent)
+ private
+ FCtl3D: Boolean;
+ FSorted: Boolean;
+ FTitle:string;
+ FLabel1Caption: TCaption;
+ FLabel2Caption: TCaption;
+ FOkBtnCaption: TCaption;
+ FCancelBtnCaption: TCaption;
+ FHelpBtnCaption: TCaption;
+ FHelpContext: THelpContext;
+ FList1: TStrings;
+ FList2: TStrings;
+ FShowHelp: Boolean;
+ procedure SetList1(Value: TStrings);
+ procedure SetList2(Value: TStrings);
+ function IsLabel1Custom: Boolean;
+ function IsLabel2Custom: Boolean;
+ function IsOkBtnCustom: Boolean;
+ function IsCancelBtnCustom: Boolean;
+ function IsHelpBtnCustom: Boolean;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ function Execute: Boolean;
+ published
+ property Ctl3D: Boolean read FCtl3D write FCtl3D default True;
+ property Sorted: Boolean read FSorted write FSorted;
+ property Title: string read FTitle write FTitle;
+ property Label1Caption: TCaption read FLabel1Caption write FLabel1Caption
+ stored IsLabel1Custom;
+ property Label2Caption: TCaption read FLabel2Caption write FLabel2Caption
+ stored IsLabel2Custom;
+ property OkBtnCaption: TCaption read FOkBtnCaption write FOkBtnCaption
+ stored IsOkBtnCustom;
+ property CancelBtnCaption: TCaption read FCancelBtnCaption write FCancelBtnCaption
+ stored IsCancelBtnCustom;
+ property HelpBtnCaption: TCaption read FHelpBtnCaption write FHelpBtnCaption
+ stored IsHelpBtnCustom;
+ property HelpContext: THelpContext read FHelpContext write FHelpContext;
+ property List1: TStrings read FList1 write SetList1;
+ property List2: TStrings read FList2 write SetList2;
+ property ShowHelp: Boolean read FShowHelp write FShowHelp default True;
+ end;
+
+implementation
+
+uses SysUtils, Forms, FDualLst, VCLUtils, LCLStrConsts, rxconst;
+
+{ TDualListDialog }
+
+constructor TDualListDialog.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FCtl3D := True;
+ FShowHelp := True;
+ FList1 := TStringList.Create;
+ FList2 := TStringList.Create;
+ FLabel1Caption := SDualListSrcCaption;
+ FLabel2Caption := SDualListDestCaption;
+ OkBtnCaption := rsmbOK;
+ CancelBtnCaption := rsmbCancel;
+ HelpBtnCaption := rsmbHelp;
+ Title:=SDualListCaption;
+end;
+
+destructor TDualListDialog.Destroy;
+begin
+ List1.Free;
+ List2.Free;
+ inherited Destroy;
+end;
+
+procedure TDualListDialog.SetList1(Value: TStrings);
+begin
+ FList1.Assign(Value);
+end;
+
+procedure TDualListDialog.SetList2(Value: TStrings);
+begin
+ FList2.Assign(Value);
+end;
+
+function TDualListDialog.IsLabel1Custom: Boolean;
+begin
+ Result := CompareStr(Label1Caption, SDualListSrcCaption) <> 0;
+end;
+
+function TDualListDialog.IsLabel2Custom: Boolean;
+begin
+ Result := CompareStr(Label2Caption, SDualListDestCaption) <> 0;
+end;
+
+function TDualListDialog.IsOkBtnCustom: Boolean;
+begin
+ Result := CompareStr(OkBtnCaption, rsmbOK) <> 0;
+end;
+
+function TDualListDialog.IsCancelBtnCustom: Boolean;
+begin
+ Result := CompareStr(CancelBtnCaption, rsmbCancel) <> 0;
+end;
+
+function TDualListDialog.IsHelpBtnCustom: Boolean;
+begin
+ Result := CompareStr(HelpBtnCaption, rsmbHelp) <> 0;
+end;
+
+function TDualListDialog.Execute: Boolean;
+var
+ Form: TDualListForm;
+begin
+ Form := TDualListForm.Create(Application);
+ try
+ with Form do
+ begin
+ Ctl3D := Self.Ctl3D;
+ if NewStyleControls then Font.Style := [];
+ ShowHelp := Self.ShowHelp;
+ SrcList.Sorted := Sorted;
+ DstList.Sorted := Sorted;
+ SrcList.Items := List1;
+ DstList.Items := List2;
+ if Self.Title <> '' then Form.Caption := Self.Title;
+ if Label1Caption <> '' then SrcLabel.Caption := Label1Caption;
+ if Label2Caption <> '' then DstLabel.Caption := Label2Caption;
+ ButtonPanel1.OKButton.Caption := OkBtnCaption;
+ ButtonPanel1.CancelButton.Caption := CancelBtnCaption;
+ ButtonPanel1.HelpButton.Caption := HelpBtnCaption;
+
+ HelpContext := Self.HelpContext;
+ ButtonPanel1.HelpButton.HelpContext := HelpContext;
+ end;
+ Result := (Form.ShowModal = mrOk);
+ if Result then
+ begin
+ List1 := Form.SrcList.Items;
+ List2 := Form.DstList.Items;
+ end;
+ finally
+ Form.Free;
+ end;
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/ex_rx_bin_datapacket.pas b/components/rx/version/v2.2_laz_1.2/ex_rx_bin_datapacket.pas
new file mode 100644
index 000000000..e70917208
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/ex_rx_bin_datapacket.pas
@@ -0,0 +1,172 @@
+{
+ TBinaryRxDatapacketReader implementation
+
+ See the file COPYING.FPC, included in this distribution,
+ for details about the copyright.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+
+unit ex_rx_bin_datapacket;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, dom, db, ex_rx_datapacket;
+
+type
+ TChangeLogEntry = record
+ UpdateKind : TUpdateKind;
+ OrigEntry : integer;
+ NewEntry : integer;
+ end;
+ TChangeLogEntryArr = array of TChangeLogEntry;
+
+type
+ { TBinaryRxDatapacketReader }
+
+ TBinaryRxDatapacketReader = class(TRxDataPacketReader)
+ public
+ procedure LoadFieldDefs(AFieldDefs : TFieldDefs); override;
+ procedure StoreFieldDefs(AFieldDefs : TFieldDefs); override;
+ function GetRecordRowState(out AUpdOrder : Integer) : TRowState; override;
+ procedure FinalizeStoreRecords; override;
+ function GetCurrentRecord : boolean; override;
+ procedure GotoNextRecord; override;
+ procedure InitLoadRecords; override;
+ procedure RestoreRecord(ADataset : TDataset); override;
+ procedure StoreRecord(ADataset : TDataset; ARowState : TRowState; AUpdOrder : integer = 0); override;
+ class function RecognizeStream(AStream : TStream) : boolean; override;
+ end;
+
+implementation
+
+uses
+ dbconst;
+
+{ TBinaryRxDatapacketReader }
+
+const
+ RxBinaryIdent = 'BinRxDataset';
+
+procedure TBinaryRxDatapacketReader.LoadFieldDefs(AFieldDefs: TFieldDefs);
+var
+ FldCount : word;
+ i : integer;
+begin
+
+ if not RecognizeStream(Stream) then
+ DatabaseError(SStreamNotRecognised);
+
+ FldCount:=Stream.ReadWord;
+ AFieldDefs.Clear;
+ for i := 0 to FldCount -1 do with TFieldDef.create(AFieldDefs) do
+ begin
+ Name := Stream.ReadAnsiString;
+ Displayname := Stream.ReadAnsiString;
+ Size := Stream.ReadWord;
+ DataType := TFieldType(Stream.ReadWord);
+
+ if Stream.ReadByte = 1 then
+ Attributes := Attributes + [faReadonly];
+ end;
+
+end;
+
+procedure TBinaryRxDatapacketReader.StoreFieldDefs(AFieldDefs: TFieldDefs);
+var i : integer;
+begin
+ Stream.Write(RxBinaryIdent[1],length(RxBinaryIdent));
+
+ Stream.WriteWord(AFieldDefs.Count);
+ for i := 0 to AFieldDefs.Count -1 do with AFieldDefs[i] do
+ begin
+ Stream.WriteAnsiString(Name);
+ Stream.WriteAnsiString(DisplayName);
+ Stream.WriteWord(size);
+ Stream.WriteWord(ord(DataType));
+
+ if faReadonly in Attributes then
+ Stream.WriteByte(1)
+ else
+ Stream.WriteByte(0);
+ end;
+
+end;
+
+function TBinaryRxDatapacketReader.GetRecordRowState(out AUpdOrder: Integer
+ ): TRowState;
+var Buf : byte;
+begin
+ Buf := 0;
+ AUpdOrder := 0;
+
+ Stream.Read(Buf,1);
+ Result := ByteToRowState(Buf);
+ if Result<>[] then
+ Stream.ReadBuffer(AUpdOrder,sizeof(integer));
+
+end;
+
+procedure TBinaryRxDatapacketReader.FinalizeStoreRecords;
+begin
+// Do nothing
+end;
+
+function TBinaryRxDatapacketReader.GetCurrentRecord: boolean;
+var
+ Buf : byte;
+begin
+ Buf := 0;
+ Result := (Stream.Read(Buf,1)=1) and (Buf=$fe);
+end;
+
+procedure TBinaryRxDatapacketReader.GotoNextRecord;
+begin
+// Do Nothing
+end;
+
+procedure TBinaryRxDatapacketReader.InitLoadRecords;
+begin
+// Do Nothing
+end;
+
+procedure TBinaryRxDatapacketReader.RestoreRecord(ADataset: TDataset);
+begin
+ Stream.ReadBuffer(ADataset.ActiveBuffer^,ADataset.RecordSize);
+end;
+
+procedure TBinaryRxDatapacketReader.StoreRecord(ADataset: TDataset;
+ ARowState: TRowState; AUpdOrder: integer);
+begin
+ Stream.WriteByte($fe);
+ Stream.WriteByte(RowStateToByte(ARowState));
+ if ARowState<>[] then
+ Stream.WriteBuffer(AUpdOrder,sizeof(integer));
+ Stream.WriteBuffer(ADataset.ActiveBuffer^,ADataset.RecordSize);
+end;
+
+class function TBinaryRxDatapacketReader.RecognizeStream(AStream: TStream
+ ): boolean;
+var s : string;
+ len : integer;
+begin
+ Len := length(RxBinaryIdent);
+ setlength(s,len);
+ if (AStream.Read (s[1],len) = len)
+ and (s=RxBinaryIdent) then
+ Result := True
+ else
+ Result := False;
+
+end;
+
+initialization
+ RegisterDatapacketReader(TBinaryRxDatapacketReader,dfBinary);
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/ex_rx_datapacket.pas b/components/rx/version/v2.2_laz_1.2/ex_rx_datapacket.pas
new file mode 100644
index 000000000..65ad4be1c
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/ex_rx_datapacket.pas
@@ -0,0 +1,139 @@
+unit ex_rx_datapacket;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils,db;
+
+type
+ TRowStateValue = (rsvOriginal, rsvDeleted, rsvInserted, rsvUpdated, rsvDetailUpdates);
+ TRowState = set of TRowStateValue;
+
+type
+ TRxDataPacketFormat = (dfBinary,dfXML,dfXMLUTF8,dfAny);
+
+type
+
+ { TRxDatapacketReader }
+
+ TRxDatapacketReaderClass = class of TRxDatapacketReader;
+ TRxDatapacketReader = class(TObject)
+ FStream : TStream;
+ protected
+ class function RowStateToByte(const ARowState : TRowState) : byte;
+ class function ByteToRowState(const AByte : Byte) : TRowState;
+ public
+ constructor create(AStream : TStream); virtual;
+ // Load a dataset from stream:
+ // Load the field-definitions from a stream.
+ procedure LoadFieldDefs(AFieldDefs : TFieldDefs); virtual; abstract;
+ // Is called before the records are loaded
+ procedure InitLoadRecords; virtual; abstract;
+ // Return the RowState of the current record, and the order of the update
+ function GetRecordRowState(out AUpdOrder : Integer) : TRowState; virtual; abstract;
+ // Returns if there is at least one more record available in the stream
+ function GetCurrentRecord : boolean; virtual; abstract;
+ // Store a record from stream in the current record-buffer
+ procedure RestoreRecord(ADataset : TDataset); virtual; abstract;
+ // Move the stream to the next record
+ procedure GotoNextRecord; virtual; abstract;
+
+ // Store a dataset to stream:
+ // Save the field-definitions to a stream.
+ procedure StoreFieldDefs(AFieldDefs : TFieldDefs); virtual; abstract;
+ // Save a record from the current record-buffer to the stream
+ procedure StoreRecord(ADataset : TDataset; ARowState : TRowState; AUpdOrder : integer = 0); virtual; abstract;
+ // Is called after all records are stored
+ procedure FinalizeStoreRecords; virtual; abstract;
+ // Checks if the provided stream is of the right format for this class
+ class function RecognizeStream(AStream : TStream) : boolean; virtual; abstract;
+ property Stream: TStream read FStream;
+ end;
+
+type
+ TRxDatapacketReaderRegistration = record
+ ReaderClass : TRxDatapacketReaderClass;
+ Format : TRxDatapacketFormat;
+ end;
+
+function GetRegisterDatapacketReader(AStream : TStream; AFormat : TRxDatapacketFormat; var ADataReaderClass : TRxDatapacketReaderRegistration) : boolean;
+procedure RegisterDatapacketReader(ADatapacketReaderClass : TRxDatapacketReaderClass; AFormat : TRxDatapacketFormat);
+
+implementation
+
+var
+ RxRegisteredDatapacketReaders : Array of TRxDatapacketReaderRegistration;
+
+
+function GetRegisterDatapacketReader(AStream: TStream;
+ AFormat: TRxDatapacketFormat;
+ var ADataReaderClass: TRxDatapacketReaderRegistration): boolean;
+var i : integer;
+begin
+ Result := False;
+ for i := 0 to length(RxRegisteredDatapacketReaders)-1 do if ((AFormat=dfAny) or (AFormat=RxRegisteredDatapacketReaders[i].Format)) then
+ begin
+
+ if (AStream <> nil) then
+ AStream.Seek(0,soFromBeginning); // ensure at start of stream to check value
+
+ if (AStream=nil) or (RxRegisteredDatapacketReaders[i].ReaderClass.RecognizeStream(AStream)) then
+ begin
+ ADataReaderClass := RxRegisteredDatapacketReaders[i];
+ Result := True;
+ if (AStream <> nil) then
+ AStream.Seek(0,soFromBeginning);
+ break;
+ end;
+ end;
+end;
+
+procedure RegisterDatapacketReader(
+ ADatapacketReaderClass: TRxDatapacketReaderClass; AFormat: TRxDatapacketFormat
+ );
+begin
+ setlength(RxRegisteredDatapacketReaders,length(RxRegisteredDatapacketReaders)+1);
+ with RxRegisteredDatapacketReaders[length(RxRegisteredDatapacketReaders)-1] do
+ begin
+ Readerclass := ADatapacketReaderClass;
+ Format := AFormat;
+ end;
+end;
+
+{ TRxDatapacketReader }
+
+class function TRxDatapacketReader.RowStateToByte(const ARowState: TRowState
+ ): byte;
+var RowStateInt : Byte;
+begin
+ RowStateInt:=0;
+ if rsvOriginal in ARowState then RowStateInt := RowStateInt+1;
+ if rsvDeleted in ARowState then RowStateInt := RowStateInt+2;
+ if rsvInserted in ARowState then RowStateInt := RowStateInt+4;
+ if rsvUpdated in ARowState then RowStateInt := RowStateInt+8;
+ Result := RowStateInt;
+end;
+
+class function TRxDatapacketReader.ByteToRowState(const AByte: Byte
+ ): TRowState;
+begin
+ result := [];
+ if (AByte and 1)=1 then Result := Result+[rsvOriginal];
+ if (AByte and 2)=2 then Result := Result+[rsvDeleted];
+ if (AByte and 4)=4 then Result := Result+[rsvInserted];
+ if (AByte and 8)=8 then Result := Result+[rsvUpdated];
+end;
+
+constructor TRxDatapacketReader.create(AStream: TStream);
+begin
+ FStream := AStream;
+end;
+
+initialization
+ setlength(RxRegisteredDatapacketReaders,0);
+finalization
+ setlength(RxRegisteredDatapacketReaders,0);
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/ex_rx_xml_datapacket.pas b/components/rx/version/v2.2_laz_1.2/ex_rx_xml_datapacket.pas
new file mode 100644
index 000000000..f07150ea6
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/ex_rx_xml_datapacket.pas
@@ -0,0 +1,405 @@
+{
+ TXMLRxDatapacketReader implementation
+
+ See the file COPYING.FPC, included in this distribution,
+ for details about the copyright.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+
+unit ex_rx_xml_datapacket;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, dom, db, ex_rx_datapacket;
+
+type
+ TChangeLogEntry = record
+ UpdateKind : TUpdateKind;
+ OrigEntry : integer;
+ NewEntry : integer;
+ end;
+ TChangeLogEntryArr = array of TChangeLogEntry;
+
+type
+ { TXMLRxDatapacketReader }
+
+ TXMLRxDatapacketReader = class(TRxDataPacketReader)
+ XMLDocument : TXMLDocument;
+ DataPacketNode : TDOMElement;
+ MetaDataNode : TDOMNode;
+ FieldsNode : TDOMNode;
+ FChangeLogNode,
+ FParamsNode,
+ FRowDataNode,
+ FRecordNode : TDOMNode;
+ FChangeLog : TChangeLogEntryArr;
+ FEntryNr : integer;
+ FLastChange : integer;
+ public
+ destructor destroy; override;
+ procedure StoreFieldDefs(AFieldDefs : TFieldDefs); override;
+ procedure StoreRecord(ADataset : TDataset; ARowState : TRowState; AUpdOrder : integer = 0); override;
+ procedure FinalizeStoreRecords; override;
+ procedure LoadFieldDefs(AFieldDefs : TFieldDefs); override;
+ procedure InitLoadRecords; override;
+ function GetCurrentRecord : boolean; override;
+ function GetRecordRowState(out AUpdOrder : Integer) : TRowState; override;
+ procedure RestoreRecord(ADataset : TDataset); override;
+ procedure GotoNextRecord; override;
+ class function RecognizeStream(AStream : TStream) : boolean; override;
+ end;
+
+implementation
+
+uses xmlwrite, xmlread, rxdconst;
+
+const
+ XMLFieldtypenames : Array [TFieldType] of String[15] =
+ (
+ 'Unknown',
+ 'string',
+ 'i2',
+ 'i4',
+ 'i4',
+ 'boolean',
+ 'r8',
+ 'r8',
+ 'fixed',
+ 'date',
+ 'time',
+ 'datetime',
+ 'bin.hex',
+ 'bin.hex',
+ 'i4',
+ 'bin.hex',
+ 'bin.hex',
+ 'bin.hex',
+ 'bin.hex',
+ 'bin.hex',
+ 'bin.hex',
+ 'bin.hex',
+ '',
+ 'string',
+ 'string',
+ 'i8',
+ '',
+ '',
+ '',
+ '',
+ '',
+ '',
+ '',
+ '',
+ '',
+ '',
+ '',
+ '',
+ '',
+ ''
+ );
+
+
+{ TXMLRxDatapacketReader }
+
+destructor TXMLRxDatapacketReader.destroy;
+begin
+ FieldsNode.Free;
+ MetaDataNode.Free;
+ DataPacketNode.Free;
+ XMLDocument.Free;
+ inherited destroy;
+end;
+
+// Actually does a lot more than just loading the field defs...
+procedure TXMLRxDatapacketReader.LoadFieldDefs(AFieldDefs : TFieldDefs);
+
+ function GetNodeAttribute(const aNode : TDOMNode; AttName : String) : string;
+ var AnAttr : TDomNode;
+ begin
+ AnAttr := ANode.Attributes.GetNamedItem(AttName);
+ if assigned(AnAttr) then result := AnAttr.NodeValue
+ else result := '';
+ end;
+
+var i : integer;
+ AFieldDef : TFieldDef;
+ iFieldType : TFieldType;
+ FTString : string;
+ AFieldNode : TDOMNode;
+ bLoadFieldDefs : Boolean;
+
+begin
+
+ // if we already have field defs then don't reload from the file
+ bLoadFieldDefs := (AFieldDefs.Count = 0);
+
+
+ ReadXMLFile(XMLDocument,Stream);
+ DataPacketNode := XMLDocument.FindNode('DATAPACKET') as TDOMElement;
+ if not assigned(DataPacketNode) then DatabaseError(sUnknownXMLDatasetFormat);
+
+ MetaDataNode := DataPacketNode.FindNode('METADATA');
+ if not assigned(MetaDataNode) then DatabaseError(sUnknownXMLDatasetFormat);
+
+ FieldsNode := MetaDataNode.FindNode('FIELDS');
+ if not assigned(FieldsNode) then DatabaseError(sUnknownXMLDatasetFormat);
+
+ if bLoadFieldDefs then
+ begin
+ with FieldsNode.ChildNodes do for i := 0 to Count - 1 do
+ begin
+ AFieldNode := item[i];
+ if AFieldNode.CompareName('FIELD')=0 then
+ begin
+ AFieldDef := TFieldDef.create(AFieldDefs);
+ AFieldDef.DisplayName:=GetNodeAttribute(AFieldNode,'fieldname');
+ AFieldDef.Name:=GetNodeAttribute(AFieldNode,'attrname');
+ AFieldDef.Size:=StrToIntDef(GetNodeAttribute(AFieldNode,'width'),0);
+ FTString:=GetNodeAttribute(AFieldNode,'fieldtype');
+
+ AFieldDef.DataType:=ftUnknown;
+ for iFieldType:=low(TFieldType) to high(TFieldType) do
+ if SameText(XMLFieldtypenames[iFieldType],FTString) then
+ begin
+ AFieldDef.DataType:=iFieldType;
+ break;
+ end;
+ end;
+ end;
+ end;
+
+ FChangeLogNode := MetaDataNode.FindNode('PARAMS');
+ if assigned(FChangeLogNode) then
+ FChangeLogNode := FChangeLogNode.Attributes.GetNamedItem('CHANGE_LOG');
+
+ FRowDataNode := DataPacketNode.FindNode('ROWDATA');
+ FRecordNode := nil;
+end;
+
+procedure TXMLRxDatapacketReader.StoreFieldDefs(AFieldDefs: TFieldDefs);
+
+var i : integer;
+ AFieldNode : TDOMElement;
+
+begin
+ XMLDocument := TXMLDocument.Create;
+ DataPacketNode := XMLDocument.CreateElement('DATAPACKET');
+ DataPacketNode.SetAttribute('Version','2.0');
+
+ MetaDataNode := XMLDocument.CreateElement('METADATA');
+ FieldsNode := XMLDocument.CreateElement('FIELDS');
+
+ for i := 0 to AFieldDefs.Count -1 do with AFieldDefs[i] do
+ begin
+ AFieldNode := XMLDocument.CreateElement('FIELD');
+ if Name <> '' then AFieldNode.SetAttribute('fieldname',Name);
+ AFieldNode.SetAttribute('attrname',DisplayName);
+ if size <> 0 then AFieldNode.SetAttribute('width',IntToStr(Size));
+ AFieldNode.SetAttribute('fieldtype',XMLFieldtypenames[DataType]);
+ case DataType of
+ ftAutoInc : begin
+ AFieldNode.SetAttribute('readonly','true');
+ AFieldNode.SetAttribute('subtype','Autoinc');
+ end;
+ ftCurrency: AFieldNode.SetAttribute('subtype','Money');
+ ftVarBytes,
+ ftBlob : AFieldNode.SetAttribute('subtype','Binary');
+ ftMemo : AFieldNode.SetAttribute('subtype','Text');
+ ftTypedBinary,
+ ftGraphic: AFieldNode.SetAttribute('subtype','Graphics');
+ ftFmtMemo : AFieldNode.SetAttribute('subtype','Formatted');
+ ftParadoxOle,
+ ftDBaseOle : AFieldNode.SetAttribute('subtype','Ole');
+ end; {case}
+ if faReadonly in Attributes then AFieldNode.SetAttribute('readonly','true');
+
+ FieldsNode.AppendChild(AFieldNode);
+ end;
+
+ MetaDataNode.AppendChild(FieldsNode);
+ FParamsNode := XMLDocument.CreateElement('PARAMS');
+ MetaDataNode.AppendChild(FParamsNode);
+ DataPacketNode.AppendChild(MetaDataNode);
+ FRowDataNode := XMLDocument.CreateElement('ROWDATA');
+ setlength(FChangeLog,0);
+ FEntryNr:=0;
+ FLastChange:=-1;
+end;
+
+procedure TXMLRxDatapacketReader.FinalizeStoreRecords;
+var ChangeLogStr : String;
+ i : integer;
+begin
+ ChangeLogStr:='';
+ for i := 0 to length(FChangeLog)-1 do with FChangeLog[i] do
+ begin
+ ChangeLogStr:=ChangeLogStr+' '+inttostr(NewEntry)+' '+inttostr(OrigEntry)+' ';
+ if UpdateKind=ukModify then ChangeLogStr := ChangeLogStr+'8';
+ if UpdateKind=ukInsert then ChangeLogStr := ChangeLogStr+'4';
+ if UpdateKind=ukDelete then ChangeLogStr := ChangeLogStr+'2';
+ end;
+ setlength(FChangeLog,0);
+
+ if ChangeLogStr<>'' then
+ (FParamsNode as TDomElement).SetAttribute('CHANGE_LOG',Trim(ChangeLogStr));
+
+ DataPacketNode.AppendChild(FRowDataNode);
+ XMLDocument.AppendChild(DataPacketNode);
+
+ WriteXML(XMLDocument,Stream);
+end;
+
+function TXMLRxDatapacketReader.GetCurrentRecord: boolean;
+begin
+ Result := assigned(FRecordNode);
+end;
+
+function TXMLRxDatapacketReader.GetRecordRowState(out AUpdOrder: Integer
+ ): TRowState;
+var ARowStateNode : TDOmNode;
+ ARowState : integer;
+ i : integer;
+begin
+ ARowStateNode := FRecordNode.Attributes.GetNamedItem('RowState');
+ if ARowStateNode = nil then // This item is not edited
+ Result := []
+ else
+ begin
+ Result := ByteToRowState(StrToIntDef(ARowStateNode.NodeValue,0));
+ if Result = [rsvOriginal] then
+ begin
+ for i := 0 to length(FChangeLog)-1 do
+ if FChangeLog[i].NewEntry=FEntryNr then break;
+ assert(FChangeLog[i].NewEntry=FEntryNr);
+ end
+ else
+ begin
+ for i := 0 to length(FChangeLog)-1 do
+ if FChangeLog[i].OrigEntry=FEntryNr then break;
+ assert(FChangeLog[i].OrigEntry=FEntryNr);
+ end;
+ AUpdOrder:=i;
+ end;
+end;
+
+procedure TXMLRxDatapacketReader.InitLoadRecords;
+
+var ChangeLogStr : String;
+ i,cp : integer;
+ ps : string;
+
+begin
+ FRecordNode := FRowDataNode.FirstChild;
+ FEntryNr := 1;
+ setlength(FChangeLog,0);
+ if assigned(FChangeLogNode) then
+ ChangeLogStr:=FChangeLogNode.NodeValue
+ else
+ ChangeLogStr:='';
+ ps := '';
+ cp := 0;
+ if ChangeLogStr<>'' then for i := 1 to length(ChangeLogStr)+1 do
+ begin
+ if not (ChangeLogStr[i] in [' ',#0]) then
+ ps := ps + ChangeLogStr[i]
+ else
+ begin
+ case (cp mod 3) of
+ 0 : begin
+ SetLength(FChangeLog,length(FChangeLog)+1);
+ FChangeLog[cp div 3].OrigEntry:=StrToIntDef(ps,0);
+ end;
+ 1 : FChangeLog[cp div 3].NewEntry:=StrToIntDef(ps,0);
+ 2 : begin
+ if ps = '2' then
+ FChangeLog[cp div 3].UpdateKind:=ukDelete
+ else if ps = '4' then
+ FChangeLog[cp div 3].UpdateKind:=ukInsert
+ else if ps = '8' then
+ FChangeLog[cp div 3].UpdateKind:=ukModify;
+ end;
+ end; {case}
+ ps := '';
+ inc(cp);
+ end;
+ end;
+end;
+
+procedure TXMLRxDatapacketReader.RestoreRecord(ADataset : TDataset);
+var FieldNr : integer;
+ AFieldNode : TDomNode;
+begin
+ with ADataset do for FieldNr:=0 to FieldCount-1 do
+ begin
+ AFieldNode := FRecordNode.Attributes.GetNamedItem(Fields[FieldNr].FieldName);
+ if assigned(AFieldNode) then
+ begin
+ Fields[FieldNr].AsString := AFieldNode.NodeValue; // set it to the filterbuffer
+ end
+ end;
+end;
+
+procedure TXMLRxDatapacketReader.StoreRecord(ADataset : TDataset; ARowState : TRowState; AUpdOrder : integer = 0);
+var FieldNr : Integer;
+ ARecordNode : TDOMElement;
+begin
+ inc(FEntryNr);
+ ARecordNode := XMLDocument.CreateElement('ROW');
+ for FieldNr := 0 to ADataset.Fields.Count-1 do
+ begin
+ ARecordNode.SetAttribute(ADataset.fields[FieldNr].FieldName,ADataset.fields[FieldNr].AsString);
+ end;
+ if ARowState<>[] then
+ begin
+ ARecordNode.SetAttribute('RowState',inttostr(RowStateToByte(ARowState)));
+ if AUpdOrder>=length(FChangeLog) then
+ setlength(FChangeLog,AUpdOrder+1);
+ if (rsvOriginal in ARowState) or (rsvDeleted in ARowState) then
+ FChangeLog[AUpdOrder].OrigEntry:=FEntryNr;
+ if (rsvDeleted in ARowState) or (rsvUpdated in ARowState) or (rsvInserted in ARowState) then
+ FChangeLog[AUpdOrder].NewEntry:=FEntryNr;
+ if ARowState=[rsvUpdated] then
+ FChangeLog[AUpdOrder].UpdateKind := ukModify;
+ if ARowState=[rsvInserted] then
+ FChangeLog[AUpdOrder].UpdateKind := ukInsert;
+ if ARowState=[rsvDeleted] then
+ FChangeLog[AUpdOrder].UpdateKind := ukDelete;
+ end;
+ FRowDataNode.AppendChild(ARecordNode);
+end;
+
+class function TXMLRxDatapacketReader.RecognizeStream(AStream: TStream): boolean;
+const XmlStart = '0) do
+ FRecordNode := FRecordNode.NextSibling;
+end;
+
+initialization
+ RegisterDatapacketReader(TXMLRxDatapacketReader,dfXML);
+end.
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/exsortfb.pas b/components/rx/version/v2.2_laz_1.2/exsortfb.pas
new file mode 100644
index 000000000..3803a3011
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/exsortfb.pas
@@ -0,0 +1,107 @@
+{ RxDBGrid sort engine module for FBDataSet
+
+ Copyright (C) 2009 Lagunov Aleksey alexs75@hotbox.ru
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit exsortfb;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, DB,
+ {$IFDEF FPC}
+ RxDBGrid
+ {$ELSE}
+ exDBGrid
+ {$ENDIF}
+ ;
+
+type
+
+ { TFBDataSetSortEngine }
+
+ TFBDataSetSortEngine = class(TRxDBGridSortEngine)
+ protected
+ procedure UpdateFooterRows(ADataSet:TDataSet; AGrid:TRxDBGrid);override;
+ function EnabledFooterRowsCalc:boolean;override;
+ public
+ procedure Sort(FieldName: string; ADataSet:TDataSet; Asc:boolean; SortOptions:TRxSortEngineOptions);override;
+ procedure SortList(ListField:string; ADataSet:TDataSet; Asc: array of boolean; SortOptions: TRxSortEngineOptions);override;
+ end;
+
+implementation
+uses FBCustomDataSet;
+
+type
+ THackFBDataSet = class(TFBDataSet);
+ THackRxColumnFooter = class(TRxColumnFooter);
+
+procedure TFBDataSetSortEngine.UpdateFooterRows(ADataSet: TDataSet;
+ AGrid: TRxDBGrid);
+var
+ i,j:integer;
+ Col:TRxColumn;
+begin
+ if not Assigned(ADataSet) then exit;
+
+ for i:=0 to ADataSet.RecordCount-1 do
+ begin
+ for j:=0 to AGrid.Columns.Count-1 do
+ begin
+ Col:=TRxColumn(AGrid.Columns[j]);
+ if THackRxColumnFooter(Col.Footer).ValueType in [fvtSum, fvtAvg, fvtMax, fvtMin] then
+ THackRxColumnFooter(Col.Footer).UpdateTestValueFromVar( THackFBDataSet(ADataSet).GetAnyRecField(i, ADataSet.FieldByName(Col.Footer.FieldName)));
+ end;
+ end;
+end;
+
+function TFBDataSetSortEngine.EnabledFooterRowsCalc: boolean;
+begin
+ Result:=true;
+end;
+
+procedure TFBDataSetSortEngine.Sort(FieldName: string; ADataSet: TDataSet;
+ Asc: boolean; SortOptions: TRxSortEngineOptions);
+begin
+ if Assigned(ADataSet) then
+ (ADataSet as TFBDataSet).SortOnField(FieldName, Asc);
+end;
+
+procedure TFBDataSetSortEngine.SortList(ListField: string; ADataSet: TDataSet;
+ Asc: array of boolean; SortOptions: TRxSortEngineOptions);
+begin
+ if Assigned(ADataSet) then
+ (ADataSet as TFBDataSet).SortOnFields(ListField, Asc);
+end;
+
+initialization
+ RegisterRxDBGridSortEngine(TFBDataSetSortEngine, 'TFBDataSet');
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/exsortmds.pas b/components/rx/version/v2.2_laz_1.2/exsortmds.pas
new file mode 100644
index 000000000..20196ccf0
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/exsortmds.pas
@@ -0,0 +1,186 @@
+unit exsortmds;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, DB, RxDBGrid;
+
+type
+ TMemDataSetSortEngine = class(TExDBGridSortEngine)
+ public
+ procedure Sort(Field:TField; ADataSet:TDataSet; Asc:boolean);override;
+ end;
+
+implementation
+uses memds;
+
+type
+ THackMDS = class(TMemDataSet)
+ end;
+
+procedure TMemDataSetSortEngine.Sort(Field:TField; ADataSet:TDataSet; Asc:boolean);
+var
+ MS:TMemoryStream;
+ V, FRecSize, FRecCount, I, J:integer;
+ BufOrign, BufTest:PChar;
+ PI, PJ:PInteger;
+ S1:string;
+ R1:Double;
+ I1:integer;
+ B1:boolean;
+ D1:TDateTime;
+
+
+function DoExch:boolean;
+begin
+ Result:=false;
+ ADataSet.RecNo:=J+1;
+ if Asc then
+ begin
+ case Field.DataType of
+ ftFixedChar,
+ ftWideString,
+ ftString:Result:=S1 > Field.AsString;
+
+ ftBoolean:Result:=B1 > Field.AsBoolean;
+
+ ftInteger,
+ ftWord,
+ ftSmallint,
+ ftAutoInc,
+ ftLargeint:
+ begin
+ Result:=I1 > Field.AsInteger;
+// writeln('I1=', I1, ' I2=',Field.AsInteger,' Result=', Result, ' i=',i, ' j=',j);
+ end;
+
+ ftFloat,
+ ftCurrency,
+ ftBCD:Result:=R1 > Field.AsFloat;
+
+ ftDate,
+ ftTime,
+ ftDateTime,
+ ftTimeStamp:Result:=D1 > Field.AsFloat;
+ else
+ exit;
+ end;
+ end
+ else
+ begin
+ case Field.DataType of
+ ftFixedChar,
+ ftWideString,
+ ftString:Result:=S1 < Field.AsString;
+
+ ftBoolean:Result:=B1 < Field.AsBoolean;
+
+ ftInteger,
+ ftWord,
+ ftSmallint,
+ ftAutoInc,
+ ftLargeint:Result:=I1 < Field.AsInteger;
+
+ ftFloat,
+ ftCurrency,
+ ftBCD:Result:=R1 < Field.AsFloat;
+
+ ftDate,
+ ftTime,
+ ftDateTime,
+ ftTimeStamp:Result:=D1 < Field.AsFloat;
+ else
+ exit;
+ end;
+ end;
+{ if not Asc then
+ Result:=not Result;
+ Result:=true;}
+end;
+
+begin
+ if Assigned(ADataSet) then
+ begin
+ ADataSet.DisableControls;
+ MS:=TMemoryStream.Create;
+ BufOrign:=THackMDS(ADataSet).AllocRecordBuffer;
+ BufTest:=THackMDS(ADataSet).AllocRecordBuffer;
+ PI:=@I;
+ PJ:=@J;
+ try
+ THackMDS(ADataSet).SaveDataToStream(MS, true);
+ MS.Seek(0, soFromBeginning);
+ MS.Read(V, SizeOf(V)); // Marker
+ MS.Read(V, SizeOf(V)); // Size
+ FRecSize:=THackMDS(ADataSet).GetRecordSize;
+ FRecCount:=V div FRecSize;
+ for i:=0 to FRecCount-2 do
+ begin
+ MS.Seek(FRecSize*I + SizeOf(V)*2, soFromBeginning);
+ MS.Read(BufOrign^, FRecSize);
+ if i=0 then //fix error
+ ADataSet.First
+ else
+ ADataSet.RecNo:=I+1;
+
+ case Field.DataType of
+ ftFixedChar,
+ ftWideString,
+ ftString:S1:=Field.AsString;
+
+ ftBoolean:B1:=Field.AsBoolean;
+
+ ftInteger,
+ ftWord,
+ ftSmallint,
+ ftAutoInc,
+ ftLargeint:I1:=Field.AsInteger;
+
+ ftFloat,
+ ftCurrency,
+ ftBCD:R1:=Field.AsFloat;
+
+ ftDate,
+ ftTime,
+ ftDateTime,
+ ftTimeStamp:D1:=Field.AsFloat;
+{ else
+ exit;}
+ end;
+
+ for j:=i+1 to FRecCount-1 do
+ begin
+ MS.Seek(FRecSize*j + SizeOf(V)*2, soFromBeginning);
+ MS.Read(BufTest^, FRecSize);
+ if DoExch then
+ begin
+ MS.Seek(FRecSize*j + SizeOf(V)*2, soFromBeginning);
+ MS.Write(BufOrign^, FRecSize);
+ Move(BufTest^, BufOrign^, FRecSize);
+ end;
+ end;
+ THackMDS(ADataSet).SetBookmarkData(BufOrign, @PI);
+ MS.Seek(FRecSize*I + SizeOf(V)*2, soFromBeginning);
+ MS.Write(BufOrign^, FRecSize);
+ MS.Seek(0, soFromBeginning);
+ THackMDS(ADataSet).LoadDataFromStream(MS);
+ end;
+// (ADataSet as TFBDataSet).SortOnField(Field.FieldName, Asc);}
+ MS.Seek(0, soFromBeginning);
+ THackMDS(ADataSet).LoadDataFromStream(MS);
+ finally
+ THackMDS(ADataSet).FreeRecordBuffer(BufOrign);
+ THackMDS(ADataSet).FreeRecordBuffer(BufTest);
+ MS.Free;
+ ADataSet.EnableControls;
+ end;
+ THackMDS(ADataSet).First;
+ end;
+end;
+
+initialization
+ RegisterExDBGridSortEngine(TMemDataSetSortEngine, TMemDataset);
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/exsortsql.pas b/components/rx/version/v2.2_laz_1.2/exsortsql.pas
new file mode 100644
index 000000000..1d1e2f11f
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/exsortsql.pas
@@ -0,0 +1,134 @@
+{ RxDBGrid sort engine module for FBDataSet
+
+ Copyright (C) 2011 BugMaker from freepascal.ru
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit exsortsql;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, DB, RxDBGrid;
+
+type
+
+ { TSQLQuerySortEngine }
+
+ TSQLQuerySortEngine = class(TRxDBGridSortEngine)
+ public
+ procedure Sort(FieldName: string; ADataSet:TDataSet; Asc:boolean; SortOptions:TRxSortEngineOptions);override;
+ procedure SortList(ListField: string; ADataSet: TDataSet; Asc: array of boolean; SortOptions: TRxSortEngineOptions); override;
+ end;
+
+implementation
+uses SQLDB, synRegExpr, strUtils;
+
+
+procedure TSQLQuerySortEngine.Sort(FieldName: string; ADataSet: TDataSet;
+ Asc: boolean; SortOptions: TRxSortEngineOptions);
+begin
+ SortList(FieldName,ADataSet,Asc,SortOptions);
+end;
+
+procedure TSQLQuerySortEngine.SortList(ListField: string; ADataSet: TDataSet;
+ Asc: array of boolean; SortOptions: TRxSortEngineOptions);
+var
+ S:string;
+ i, C:integer;
+ cmd:string;
+ strLen:Integer;
+ RegExpr: TRegExpr;
+ Mask:String;
+ OldParams:TParams;
+begin
+ if not (Assigned(ADataSet) and ADataset.Active) then exit;
+
+ S:='';
+ C:=Pos(';', ListField);
+ i:=0;
+ while C>0 do
+ begin
+ if S<>'' then S:=S+',';
+ S:=S + Copy(ListField, 1, C-1);
+ Delete(ListField, 1, C);
+
+ if (i<=High(Asc)) and (not Asc[i]) then
+ S:=S + ' DESC';
+ C:=Pos(';', ListField);
+ inc(i);
+ end;
+
+ if ListField<>'' then
+ begin
+ if S<>'' then S:=S+',';
+ S:=S + ListField;
+ if (i<=High(Asc)) and (not Asc[i]) then
+ S:=S + ' DESC';
+ end;
+
+ OldParams:=TParams.Create;
+ OldParams.Assign((ADataSet as TSQLQuery).Params);
+ cmd:=(ADataSet as TSQLQuery).SQL.Text;
+ strlen:=length(cmd);
+ //Регулярное выражение позволяет найти уже имеющуюся конструкцию ORDER BY,
+ //если она написана одной строкой, и между словами не понапихали комментариев :)
+ //Работоспособные примеры:
+ //ORDER BY FIELD1, FIELD2 DESC, FIELD100500
+ //oRdeR bY fielD1 , FiElD2,FieLD100500 DESC
+ //Неработоспособный:
+ //ORDER BY FIELD1,
+ //FIELD2,
+ //FIELD100500
+ mask:='(?i)(^|\s)\s*order\s+by\s+\S+\.?\S*(\s+desc)?\s*(,\s*\S+\.?\S*(\s+desc)?(^|s*))*';
+ with TRegExpr.Create do begin
+
+ Expression := mask;
+ if Exec(cmd) then begin
+ s:=LeftStr(cmd,MatchPos[0]-1)
+ +slinebreak+'order by '
+ +s+slineBreak
+ +RightStr(cmd, strlen-MatchPos[0]-MatchLen[0]+1);
+ end
+ else
+ s:=cmd+slinebreak+'order by '+s+slineBreak;
+
+ ADataSet.Active:=False;
+ (ADataSet as TSQLQuery).SQL.Text:=s;
+ (ADataSet as TSQLQuery).Params.Assign(OldParams);
+ OldParams.Free;
+ ADataSet.Active:=True;
+ Free;
+ end;
+
+end;
+
+initialization
+ RegisterRxDBGridSortEngine(TSQLQuerySortEngine, 'TSQLQuery');
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/exsortzeos.pas b/components/rx/version/v2.2_laz_1.2/exsortzeos.pas
new file mode 100644
index 000000000..9ba9a27be
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/exsortzeos.pas
@@ -0,0 +1,175 @@
+unit exsortzeos;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, DB, RxDBGrid, ZConnection, ZDataset, ZAbstractDataset, ZAbstractRODataset;
+
+type
+
+ { TZeosDataSetSortEngine }
+
+ TZeosDataSetSortEngine = class(TRxDBGridSortEngine)
+ protected
+ procedure UpdateFooterRows(ADataSet:TDataSet; AGrid:TRxDBGrid);override;
+ function EnabledFooterRowsCalc:boolean;override;
+ public
+ procedure Sort(FieldName: string; ADataSet:TDataSet; Asc:boolean; SortOptions:TRxSortEngineOptions);override;
+ procedure SortList(ListField: string; ADataSet: TDataSet; Asc: array of boolean; SortOptions: TRxSortEngineOptions); override;
+ end;
+
+implementation
+uses ZDbcIntfs, ZVariant;
+
+type
+ THackZeosDS = class(TZAbstractRODataset);
+ THackRxColumnFooter = class(TRxColumnFooter);
+
+ THackDataLink = class(TDataLink);
+ THackDataSet = class(TDataSet);
+ THackRxDBGrid = class(TRxDBGrid);
+
+procedure TZeosDataSetSortEngine.UpdateFooterRows(ADataSet: TDataSet;
+ AGrid: TRxDBGrid);
+var
+ RS:IZResultSet;
+ CurRow, i:integer;
+ Col:TRxColumn;
+
+ DHL:THackDataLink;
+ DHS:THackDataSet;
+ SaveState:TDataSetState;
+ SavePos:integer;
+ SaveActiveRecord:integer;
+
+ SaveAfterScroll:TDataSetNotifyEvent;
+ SaveBeforeScroll:TDataSetNotifyEvent;
+begin
+ if not Assigned(ADataSet) then exit;
+ if not Assigned(AGrid) then
+ begin
+ SavePos:=SavePos;
+ exit;
+ end;
+ DHL:=THackDataLink(THackRxDBGrid(AGrid).Datalink);
+ DHS:=THackDataSet(ADataSet);
+ SaveState:=DHS.SetTempState(dsBrowse);
+
+ SaveAfterScroll:=ADataSet.AfterScroll;
+ SaveBeforeScroll:=ADataSet.BeforeScroll;
+ ADataSet.AfterScroll:=nil;
+ ADataSet.BeforeScroll:=nil;
+
+ SaveActiveRecord:=DHL.ActiveRecord;
+ DHL.ActiveRecord:=0;
+ SavePos:=ADataSet.RecNo;
+
+
+ ADataSet.First;
+ while not ADataSet.EOF do
+ begin
+
+ for i:=0 to AGrid.Columns.Count-1 do
+ begin
+ Col:=TRxColumn(AGrid.Columns[i]);
+ if THackRxColumnFooter(Col.Footer).ValueType in [fvtSum, fvtAvg, fvtMax, fvtMin] then
+// THackRxColumnFooter(Col.Footer).UpdateTestValueFromVar( ADataSet.FieldByName(Col.Footer.FieldName).Value);
+ end;
+
+ ADataSet.Next;
+ end;
+
+ DHS.RecNo := DHL.RecordCount + SavePos + 1;
+
+ while not ADataSet.BOF do
+ begin
+ if SavePos = ADataSet.RecNo then
+ break;
+ ADataSet.Prior;
+ end;
+
+ DHL.ActiveRecord:=SaveActiveRecord;
+ DHS.RestoreState(SaveState);
+
+ ADataSet.AfterScroll := SaveAfterScroll;
+ ADataSet.BeforeScroll := SaveBeforeScroll;
+{ RS:=THackZeosDS(ADataSet).ResultSet;
+ CurRow:=RS.GetRow;
+ RS.First;
+// while not RS.IsLast do
+ while not RS.IsAfterLast do
+ begin
+ for i:=0 to AGrid.Columns.Count-1 do
+ begin
+ Col:=TRxColumn(AGrid.Columns[i]);
+ if THackRxColumnFooter(Col.Footer).ValueType in [fvtSum, fvtAvg, fvtMax, fvtMin] then
+ THackRxColumnFooter(Col.Footer).UpdateTestValueFromVar(EncodeVariant(RS.GetValueByName(Col.FieldName)));
+ end;
+ RS.Next;
+ end;
+ RS.MoveAbsolute(CurRow);}
+end;
+
+function TZeosDataSetSortEngine.EnabledFooterRowsCalc: boolean;
+begin
+ Result:=true;
+end;
+
+procedure TZeosDataSetSortEngine.Sort(FieldName: string; ADataSet: TDataSet;
+ Asc: boolean; SortOptions: TRxSortEngineOptions);
+begin
+ if not Assigned(ADataSet) then exit;
+ if ADataSet is TZAbstractRODataset then
+ begin
+ TZAbstractRODataset(ADataSet).SortedFields:=FieldName;
+ if Asc then
+ TZAbstractRODataset(ADataSet).SortType:=stAscending
+ else
+ TZAbstractRODataset(ADataSet).SortType:=stDescending;
+ end;
+end;
+
+procedure TZeosDataSetSortEngine.SortList(ListField: string;
+ ADataSet: TDataSet; Asc: array of boolean; SortOptions: TRxSortEngineOptions);
+var
+ S:string;
+ i, C:integer;
+begin
+ if not Assigned(ADataSet) then exit;
+
+ S:='';
+ C:=Pos(';', ListField);
+ i:=0;
+ while C>0 do
+ begin
+ if S<>'' then S:=S+';';
+ S:=S + Copy(ListField, 1, C-1);
+ Delete(ListField, 1, C);
+
+ if (i<=High(Asc)) and (not Asc[i]) then
+ S:=S + ' DESC';
+ C:=Pos(';', ListField);
+ inc(i);
+ end;
+
+ if ListField<>'' then
+ begin
+ if S<>'' then S:=S+';';
+ S:=S + ListField;
+ if (i<=High(Asc)) and (not Asc[i]) then
+ S:=S + ' DESC';
+ end;
+
+ (ADataSet as TZAbstractRODataset).SortedFields:=S;
+end;
+
+
+initialization
+ RegisterRxDBGridSortEngine(TZeosDataSetSortEngine, 'TZReadOnlyQuery');
+ RegisterRxDBGridSortEngine(TZeosDataSetSortEngine, 'TZQuery');
+ RegisterRxDBGridSortEngine(TZeosDataSetSortEngine, 'TZTable');
+ RegisterRxDBGridSortEngine(TZeosDataSetSortEngine, 'TZMacroQuery');
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/fduallst.lfm b/components/rx/version/v2.2_laz_1.2/fduallst.lfm
new file mode 100644
index 000000000..78c98f6e2
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/fduallst.lfm
@@ -0,0 +1,191 @@
+object DualListForm: TDualListForm
+ Left = 916
+ Height = 344
+ Top = 266
+ Width = 552
+ ActiveControl = IncBtn
+ BorderIcons = []
+ Caption = 'DualListForm'
+ ClientHeight = 344
+ ClientWidth = 552
+ OnActivate = ListClick
+ OnShow = ListClick
+ Position = poScreenCenter
+ LCLVersion = '1.3'
+ object SrcLabel: TLabel
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = Owner
+ Left = 6
+ Height = 21
+ Top = 6
+ Width = 45
+ BorderSpacing.Left = 6
+ BorderSpacing.Top = 6
+ Caption = 'Source'
+ ParentColor = False
+ end
+ object DstLabel: TLabel
+ AnchorSideLeft.Control = DstList
+ AnchorSideTop.Control = Owner
+ Left = 299
+ Height = 21
+ Top = 6
+ Width = 31
+ BorderSpacing.Top = 6
+ Caption = 'Dest'
+ ParentColor = False
+ end
+ object SrcList: TListBox
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = SrcLabel
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = IncAllBtn
+ AnchorSideBottom.Control = ButtonPanel1
+ Left = 6
+ Height = 258
+ Top = 33
+ Width = 247
+ Anchors = [akTop, akLeft, akRight, akBottom]
+ BorderSpacing.Around = 6
+ DragMode = dmAutomatic
+ ItemHeight = 0
+ MultiSelect = True
+ OnClick = ListClick
+ OnDblClick = IncBtnClick
+ OnDragDrop = SrcListDragDrop
+ OnDragOver = SrcListDragOver
+ OnKeyDown = SrcListKeyDown
+ ParentShowHint = False
+ ScrollWidth = 245
+ ShowHint = True
+ Sorted = True
+ TabOrder = 0
+ TopIndex = -1
+ end
+ object DstList: TListBox
+ AnchorSideLeft.Control = IncAllBtn
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = DstLabel
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ AnchorSideBottom.Control = ButtonPanel1
+ Left = 299
+ Height = 258
+ Top = 33
+ Width = 247
+ Anchors = [akTop, akLeft, akRight, akBottom]
+ BorderSpacing.Around = 6
+ DragMode = dmAutomatic
+ ItemHeight = 0
+ MultiSelect = True
+ OnClick = ListClick
+ OnDblClick = ExclBtnClick
+ OnDragDrop = DstListDragDrop
+ OnDragOver = DstListDragOver
+ OnKeyDown = DstListKeyDown
+ ParentShowHint = False
+ ScrollWidth = 245
+ ShowHint = True
+ Sorted = True
+ TabOrder = 5
+ TopIndex = -1
+ end
+ object IncBtn: TButton
+ AnchorSideLeft.Control = IncAllBtn
+ AnchorSideTop.Control = SrcList
+ AnchorSideRight.Control = IncAllBtn
+ AnchorSideRight.Side = asrBottom
+ Left = 259
+ Height = 41
+ Top = 39
+ Width = 34
+ Anchors = [akTop, akLeft, akRight]
+ AutoSize = True
+ BorderSpacing.Top = 6
+ BorderSpacing.InnerBorder = 4
+ Caption = '>'
+ Font.Color = clBlack
+ Font.Style = [fsBold]
+ OnClick = IncBtnClick
+ ParentFont = False
+ TabOrder = 1
+ end
+ object IncAllBtn: TButton
+ AnchorSideLeft.Control = Owner
+ AnchorSideLeft.Side = asrCenter
+ AnchorSideTop.Control = IncBtn
+ AnchorSideTop.Side = asrBottom
+ Left = 259
+ Height = 41
+ Top = 86
+ Width = 34
+ AutoSize = True
+ BorderSpacing.Top = 6
+ BorderSpacing.InnerBorder = 4
+ Caption = '>>'
+ Font.Color = clBlack
+ Font.Style = [fsBold]
+ OnClick = IncAllBtnClick
+ ParentFont = False
+ TabOrder = 2
+ end
+ object ExclBtn: TButton
+ AnchorSideLeft.Control = IncAllBtn
+ AnchorSideTop.Control = IncAllBtn
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = IncAllBtn
+ AnchorSideRight.Side = asrBottom
+ Left = 259
+ Height = 41
+ Top = 133
+ Width = 34
+ Anchors = [akTop, akLeft, akRight]
+ AutoSize = True
+ BorderSpacing.Top = 6
+ BorderSpacing.InnerBorder = 4
+ Caption = '<'
+ Font.Color = clBlack
+ Font.Style = [fsBold]
+ OnClick = ExclBtnClick
+ ParentFont = False
+ TabOrder = 3
+ end
+ object ExclAllBtn: TButton
+ AnchorSideLeft.Control = IncAllBtn
+ AnchorSideTop.Control = ExclBtn
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = IncAllBtn
+ AnchorSideRight.Side = asrBottom
+ Left = 259
+ Height = 41
+ Top = 180
+ Width = 34
+ Anchors = [akTop, akLeft, akRight]
+ AutoSize = True
+ BorderSpacing.Top = 6
+ BorderSpacing.InnerBorder = 4
+ Caption = '<<'
+ Font.Color = clBlack
+ Font.Style = [fsBold]
+ OnClick = ExclAllBtnClick
+ ParentFont = False
+ TabOrder = 4
+ end
+ object ButtonPanel1: TButtonPanel
+ Left = 6
+ Height = 41
+ Top = 297
+ Width = 540
+ OKButton.Name = 'OKButton'
+ OKButton.DefaultCaption = True
+ HelpButton.Name = 'HelpButton'
+ HelpButton.DefaultCaption = True
+ CloseButton.Name = 'CloseButton'
+ CloseButton.DefaultCaption = True
+ CancelButton.Name = 'CancelButton'
+ CancelButton.DefaultCaption = True
+ TabOrder = 6
+ ShowButtons = [pbOK, pbCancel, pbHelp]
+ end
+end
diff --git a/components/rx/version/v2.2_laz_1.2/fduallst.lrs b/components/rx/version/v2.2_laz_1.2/fduallst.lrs
new file mode 100644
index 000000000..4ff4b6b3d
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/fduallst.lrs
@@ -0,0 +1,68 @@
+{ This is an automatically generated lazarus resource file }
+
+LazarusResources.Add('TDualListForm','FORMDATA',[
+ 'TPF0'#13'TDualListForm'#12'DualListForm'#4'Left'#3#148#3#6'Height'#3'X'#1#3
+ +'Top'#3#10#1#5'Width'#3'('#2#13'ActiveControl'#7#6'IncBtn'#11'BorderIcons'#11
+ +#0#7'Caption'#6#12'DualListForm'#12'ClientHeight'#3'X'#1#11'ClientWidth'#3'('
+ +#2#10'OnActivate'#7#9'ListClick'#6'OnShow'#7#9'ListClick'#8'Position'#7#14'p'
+ +'oScreenCenter'#10'LCLVersion'#6#3'1.3'#0#6'TLabel'#8'SrcLabel'#22'AnchorSid'
+ +'eLeft.Control'#7#5'Owner'#21'AnchorSideTop.Control'#7#5'Owner'#4'Left'#2#6#6
+ +'Height'#2#21#3'Top'#2#6#5'Width'#2'-'#18'BorderSpacing.Left'#2#6#17'BorderS'
+ +'pacing.Top'#2#6#7'Caption'#6#6'Source'#11'ParentColor'#8#0#0#6'TLabel'#8'Ds'
+ +'tLabel'#22'AnchorSideLeft.Control'#7#7'DstList'#21'AnchorSideTop.Control'#7
+ +#5'Owner'#4'Left'#3'+'#1#6'Height'#2#21#3'Top'#2#6#5'Width'#2#31#17'BorderSp'
+ +'acing.Top'#2#6#7'Caption'#6#4'Dest'#11'ParentColor'#8#0#0#8'TListBox'#7'Src'
+ +'List'#22'AnchorSideLeft.Control'#7#5'Owner'#21'AnchorSideTop.Control'#7#8'S'
+ +'rcLabel'#18'AnchorSideTop.Side'#7#9'asrBottom'#23'AnchorSideRight.Control'#7
+ +#9'IncAllBtn'#24'AnchorSideBottom.Control'#7#12'ButtonPanel1'#4'Left'#2#6#6
+ +'Height'#3#2#1#3'Top'#2'!'#5'Width'#3#247#0#7'Anchors'#11#5'akTop'#6'akLeft'
+ +#7'akRight'#8'akBottom'#0#20'BorderSpacing.Around'#2#6#8'DragMode'#7#11'dmAu'
+ +'tomatic'#10'ItemHeight'#2#0#11'MultiSelect'#9#7'OnClick'#7#9'ListClick'#10
+ +'OnDblClick'#7#11'IncBtnClick'#10'OnDragDrop'#7#15'SrcListDragDrop'#10'OnDra'
+ +'gOver'#7#15'SrcListDragOver'#9'OnKeyDown'#7#14'SrcListKeyDown'#14'ParentSho'
+ +'wHint'#8#11'ScrollWidth'#3#245#0#8'ShowHint'#9#6'Sorted'#9#8'TabOrder'#2#0#8
+ +'TopIndex'#2#255#0#0#8'TListBox'#7'DstList'#22'AnchorSideLeft.Control'#7#9'I'
+ +'ncAllBtn'#19'AnchorSideLeft.Side'#7#9'asrBottom'#21'AnchorSideTop.Control'#7
+ +#8'DstLabel'#18'AnchorSideTop.Side'#7#9'asrBottom'#23'AnchorSideRight.Contro'
+ +'l'#7#5'Owner'#20'AnchorSideRight.Side'#7#9'asrBottom'#24'AnchorSideBottom.C'
+ +'ontrol'#7#12'ButtonPanel1'#4'Left'#3'+'#1#6'Height'#3#2#1#3'Top'#2'!'#5'Wid'
+ +'th'#3#247#0#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#8'akBottom'#0#20'Bo'
+ +'rderSpacing.Around'#2#6#8'DragMode'#7#11'dmAutomatic'#10'ItemHeight'#2#0#11
+ +'MultiSelect'#9#7'OnClick'#7#9'ListClick'#10'OnDblClick'#7#12'ExclBtnClick'
+ +#10'OnDragDrop'#7#15'DstListDragDrop'#10'OnDragOver'#7#15'DstListDragOver'#9
+ +'OnKeyDown'#7#14'DstListKeyDown'#14'ParentShowHint'#8#11'ScrollWidth'#3#245#0
+ +#8'ShowHint'#9#6'Sorted'#9#8'TabOrder'#2#5#8'TopIndex'#2#255#0#0#7'TButton'#6
+ +'IncBtn'#22'AnchorSideLeft.Control'#7#9'IncAllBtn'#21'AnchorSideTop.Control'
+ +#7#7'SrcList'#23'AnchorSideRight.Control'#7#9'IncAllBtn'#20'AnchorSideRight.'
+ +'Side'#7#9'asrBottom'#4'Left'#3#3#1#6'Height'#2')'#3'Top'#2''''#5'Width'#2'"'
+ +#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#8'AutoSize'#9#17'BorderSpacin'
+ +'g.Top'#2#6#25'BorderSpacing.InnerBorder'#2#4#7'Caption'#6#1'>'#10'Font.Colo'
+ +'r'#7#7'clBlack'#10'Font.Style'#11#6'fsBold'#0#7'OnClick'#7#11'IncBtnClick'
+ +#10'ParentFont'#8#8'TabOrder'#2#1#0#0#7'TButton'#9'IncAllBtn'#22'AnchorSideL'
+ +'eft.Control'#7#5'Owner'#19'AnchorSideLeft.Side'#7#9'asrCenter'#21'AnchorSid'
+ +'eTop.Control'#7#6'IncBtn'#18'AnchorSideTop.Side'#7#9'asrBottom'#4'Left'#3#3
+ +#1#6'Height'#2')'#3'Top'#2'V'#5'Width'#2'"'#8'AutoSize'#9#17'BorderSpacing.T'
+ +'op'#2#6#25'BorderSpacing.InnerBorder'#2#4#7'Caption'#6#2'>>'#10'Font.Color'
+ +#7#7'clBlack'#10'Font.Style'#11#6'fsBold'#0#7'OnClick'#7#14'IncAllBtnClick'
+ +#10'ParentFont'#8#8'TabOrder'#2#2#0#0#7'TButton'#7'ExclBtn'#22'AnchorSideLef'
+ +'t.Control'#7#9'IncAllBtn'#21'AnchorSideTop.Control'#7#9'IncAllBtn'#18'Ancho'
+ +'rSideTop.Side'#7#9'asrBottom'#23'AnchorSideRight.Control'#7#9'IncAllBtn'#20
+ +'AnchorSideRight.Side'#7#9'asrBottom'#4'Left'#3#3#1#6'Height'#2')'#3'Top'#3
+ +#133#0#5'Width'#2'"'#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#8'AutoSiz'
+ +'e'#9#17'BorderSpacing.Top'#2#6#25'BorderSpacing.InnerBorder'#2#4#7'Caption'
+ +#6#1'<'#10'Font.Color'#7#7'clBlack'#10'Font.Style'#11#6'fsBold'#0#7'OnClick'
+ +#7#12'ExclBtnClick'#10'ParentFont'#8#8'TabOrder'#2#3#0#0#7'TButton'#10'ExclA'
+ +'llBtn'#22'AnchorSideLeft.Control'#7#9'IncAllBtn'#21'AnchorSideTop.Control'#7
+ +#7'ExclBtn'#18'AnchorSideTop.Side'#7#9'asrBottom'#23'AnchorSideRight.Control'
+ +#7#9'IncAllBtn'#20'AnchorSideRight.Side'#7#9'asrBottom'#4'Left'#3#3#1#6'Heig'
+ +'ht'#2')'#3'Top'#3#180#0#5'Width'#2'"'#7'Anchors'#11#5'akTop'#6'akLeft'#7'ak'
+ +'Right'#0#8'AutoSize'#9#17'BorderSpacing.Top'#2#6#25'BorderSpacing.InnerBord'
+ +'er'#2#4#7'Caption'#6#2'<<'#10'Font.Color'#7#7'clBlack'#10'Font.Style'#11#6
+ +'fsBold'#0#7'OnClick'#7#15'ExclAllBtnClick'#10'ParentFont'#8#8'TabOrder'#2#4
+ +#0#0#12'TButtonPanel'#12'ButtonPanel1'#4'Left'#2#6#6'Height'#2')'#3'Top'#3')'
+ +#1#5'Width'#3#28#2#13'OKButton.Name'#6#8'OKButton'#23'OKButton.DefaultCaptio'
+ +'n'#9#15'HelpButton.Name'#6#10'HelpButton'#25'HelpButton.DefaultCaption'#9#16
+ +'CloseButton.Name'#6#11'CloseButton'#26'CloseButton.DefaultCaption'#9#17'Can'
+ +'celButton.Name'#6#12'CancelButton'#27'CancelButton.DefaultCaption'#9#8'TabO'
+ +'rder'#2#6#11'ShowButtons'#11#4'pbOK'#8'pbCancel'#6'pbHelp'#0#0#0#0
+]);
diff --git a/components/rx/version/v2.2_laz_1.2/fduallst.lrt b/components/rx/version/v2.2_laz_1.2/fduallst.lrt
new file mode 100644
index 000000000..c887c8f9c
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/fduallst.lrt
@@ -0,0 +1,7 @@
+TDUALLISTFORM.CAPTION=DualListForm
+TDUALLISTFORM.SRCLABEL.CAPTION=Source
+TDUALLISTFORM.DSTLABEL.CAPTION=Dest
+TDUALLISTFORM.INCBTN.CAPTION=>
+TDUALLISTFORM.INCALLBTN.CAPTION=>>
+TDUALLISTFORM.EXCLBTN.CAPTION=<
+TDUALLISTFORM.EXCLALLBTN.CAPTION=<<
diff --git a/components/rx/version/v2.2_laz_1.2/fduallst.pas b/components/rx/version/v2.2_laz_1.2/fduallst.pas
new file mode 100644
index 000000000..4c68eec4c
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/fduallst.pas
@@ -0,0 +1,220 @@
+{ fduallst unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit fduallst;
+
+{$I RX.INC}
+{$L-,S-}
+
+interface
+
+uses SysUtils, LCLIntf, Messages, Classes, Graphics, Controls, Forms, Dialogs,
+ StdCtrls, ExtCtrls, Buttons, LResources, LCLType, ButtonPanel;
+
+type
+
+ { TDualListForm }
+
+ TDualListForm = class(TForm)
+ ButtonPanel1: TButtonPanel;
+ SrcList: TListBox;
+ DstList: TListBox;
+ SrcLabel: TLabel;
+ DstLabel: TLabel;
+ IncBtn: TButton;
+ IncAllBtn: TButton;
+ ExclBtn: TButton;
+ ExclAllBtn: TButton;
+ procedure IncBtnClick(Sender: TObject);
+ procedure IncAllBtnClick(Sender: TObject);
+ procedure ExclBtnClick(Sender: TObject);
+ procedure ExclAllBtnClick(Sender: TObject);
+ procedure SrcListDragOver(Sender, Source: TObject; X, Y: Integer;
+ State: TDragState; var Accept: Boolean);
+ procedure DstListDragOver(Sender, Source: TObject; X, Y: Integer;
+ State: TDragState; var Accept: Boolean);
+ procedure SrcListDragDrop(Sender, Source: TObject; X, Y: Integer);
+ procedure DstListDragDrop(Sender, Source: TObject; X, Y: Integer);
+ procedure SrcListKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+ procedure DstListKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+ procedure HelpBtnClick(Sender: TObject);
+ procedure ListClick(Sender: TObject);
+ private
+ { Private declarations }
+ function GetShowHelp: Boolean;
+ procedure SetShowHelp(AValue: Boolean);
+ public
+ { Public declarations }
+ procedure SetButtons;
+ property ShowHelp: Boolean read GetShowHelp write SetShowHelp
+ default True;
+end;
+
+implementation
+
+uses VCLUtils, BOXPROCS;
+
+
+{ TDualListForm }
+
+procedure TDualListForm.SetButtons;
+var
+ SrcEmpty, DstEmpty: Boolean;
+begin
+ SrcEmpty := (SrcList.Items.Count = 0);
+ DstEmpty := (DstList.Items.Count = 0);
+ IncBtn.Enabled := not SrcEmpty and (SrcList.SelCount > 0);
+ IncAllBtn.Enabled := not SrcEmpty;
+ ExclBtn.Enabled := not DstEmpty and (DstList.SelCount > 0);
+ ExclAllBtn.Enabled := not DstEmpty;
+end;
+
+function TDualListForm.GetShowHelp: Boolean;
+begin
+ Result := pbHelp in ButtonPanel1.ShowButtons;
+end;
+
+procedure TDualListForm.SetShowHelp(AValue: Boolean);
+begin
+ if AValue then
+ ButtonPanel1.ShowButtons:=ButtonPanel1.ShowButtons + [pbHelp]
+ else
+ ButtonPanel1.ShowButtons:=ButtonPanel1.ShowButtons - [pbHelp];
+end;
+
+procedure TDualListForm.IncBtnClick(Sender: TObject);
+begin
+ BoxMoveSelectedItems(SrcList, DstList);
+ SetButtons;
+end;
+
+procedure TDualListForm.IncAllBtnClick(Sender: TObject);
+begin
+ BoxMoveAllItems(SrcList, DstList);
+ SetButtons;
+end;
+
+procedure TDualListForm.ExclBtnClick(Sender: TObject);
+begin
+ BoxMoveSelectedItems(DstList, SrcList);
+ SetButtons;
+end;
+
+procedure TDualListForm.ExclAllBtnClick(Sender: TObject);
+begin
+ BoxMoveAllItems(DstList, SrcList);
+ SetButtons;
+end;
+
+procedure TDualListForm.SrcListDragOver(Sender, Source: TObject; X,
+ Y: Integer; State: TDragState; var Accept: Boolean);
+begin
+ BoxDragOver(SrcList, Source, X, Y, State, Accept, SrcList.Sorted);
+ if State = dsDragLeave then
+ (Source as TListBox).DragCursor := crDrag;
+ if (State = dsDragEnter) and ((Source as TListBox).SelCount > 1) then
+ (Source as TListBox).DragCursor := crMultiDrag;
+end;
+
+procedure TDualListForm.DstListDragOver(Sender, Source: TObject; X,
+ Y: Integer; State: TDragState; var Accept: Boolean);
+begin
+ BoxDragOver(DstList, Source, X, Y, State, Accept, DstList.Sorted);
+ if State = dsDragLeave then
+ (Source as TListBox).DragCursor := crDrag;
+ if (State = dsDragEnter) and ((Source as TListBox).SelCount > 1) then
+ (Source as TListBox).DragCursor := crMultiDrag;
+end;
+
+procedure TDualListForm.SrcListDragDrop(Sender, Source: TObject; X,
+ Y: Integer);
+begin
+ if Source = DstList then ExclBtnClick(SrcList)
+ else if Source = SrcList then begin
+ BoxMoveFocusedItem(SrcList, SrcList.ItemAtPos(Point(X, Y), True));
+ end;
+end;
+
+procedure TDualListForm.DstListDragDrop(Sender, Source: TObject; X,
+ Y: Integer);
+begin
+ if Source = SrcList then IncBtnClick(DstList)
+ else if Source = DstList then begin
+ BoxMoveFocusedItem(DstList, DstList.ItemAtPos(Point(X, Y), True));
+ end;
+end;
+
+procedure TDualListForm.SrcListKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+var
+ Incr: Integer;
+begin
+ if not SrcList.Sorted then begin
+ if (ssCtrl in Shift) and ((Key = VK_DOWN) or (Key = VK_UP)) then begin
+ if Key = VK_DOWN then Incr := 1
+ else Incr := -1;
+ BoxMoveFocusedItem(SrcList, SrcList.ItemIndex + Incr);
+ Key := 0;
+ end;
+ end;
+end;
+
+procedure TDualListForm.DstListKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+var
+ Incr: Integer;
+begin
+ if not DstList.Sorted then begin
+ if (ssCtrl in Shift) and ((Key = VK_DOWN) or (Key = VK_UP)) then begin
+ if Key = VK_DOWN then Incr := 1
+ else Incr := -1;
+ BoxMoveFocusedItem(DstList, DstList.ItemIndex + Incr);
+ Key := 0;
+ end;
+ end;
+end;
+
+procedure TDualListForm.HelpBtnClick(Sender: TObject);
+begin
+ Application.HelpContext(HelpContext);
+end;
+
+procedure TDualListForm.ListClick(Sender: TObject);
+begin
+ SetButtons;
+end;
+
+initialization
+ {$i fduallst.lrs}
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/folderlister.pas b/components/rx/version/v2.2_laz_1.2/folderlister.pas
new file mode 100644
index 000000000..7595440fa
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/folderlister.pas
@@ -0,0 +1,225 @@
+{ folderlister unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit folderlister;
+
+{$I rx.inc}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Menus;
+
+
+type
+ { TCustomFolderLister }
+
+ TCustomFolderLister = class(TComponent)
+ private
+ FDefaultExt: string;
+ FMenuItem: TMenuItem;
+ FOnExecuteItem: TNotifyEvent;
+ FFileFolder: string;
+ FFileList:TStringList;
+ procedure DoFind(S:string; MenuItem:TMenuItem);
+ function GetCount: integer;
+ function GetFiles(Item: integer): string;
+ procedure SetMenuItem(const AValue: TMenuItem);
+ procedure SetFileFolder(const AValue: string);
+ protected
+ property FileFolder:string read FFileFolder write SetFileFolder;
+ property OnExecuteItem:TNotifyEvent read FOnExecuteItem write FOnExecuteItem;
+ property MenuItem:TMenuItem read FMenuItem write SetMenuItem;
+ property DefaultExt:string read FDefaultExt write FDefaultExt;
+ procedure InternalExecute(Sender: TObject);virtual;
+ public
+ procedure Execute;
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ property Files[Item:integer]:string read GetFiles;
+ property Count:integer read GetCount;
+ published
+ end;
+
+type
+ TFolderLister = class(TCustomFolderLister)
+ published
+ property DefaultExt;
+ property FileFolder;
+ property OnExecuteItem;
+ property MenuItem;
+ end;
+
+implementation
+uses FileUtil, strutils, RxAppUtils, LazUTF8;
+
+function MenuItemStr(S:string):string;
+var
+ i:integer;
+begin
+ Result:=Copy2Symb(ExtractFileName(S), '.');
+ if Result='' then exit;
+ for i:=1 to Length(Result) do
+ begin
+ if Result[i]='\' then Result[i]:='/' else
+ if Result[i]='_' then Result[i]:='.';
+ end;
+end;
+
+{ TCustomFolderLister }
+procedure TCustomFolderLister.DoFind(S: string; MenuItem: TMenuItem);
+var
+ Rec:TSearchRec;
+ R:integer;
+ AFileList,
+ AFolderList:TStringList;
+
+procedure CreateItems;
+var
+ i:integer;
+ M:TMenuItem;
+begin
+ for I:=0 to AFileList.Count-1 do
+ begin
+ FFileList.Add(AFileList[i]);
+ M:=TMenuItem.Create(Application.MainForm);
+ M.Caption:=MenuItemStr(AFileList[i]);
+ M.Hint:=MenuItemStr(AFileList[i]);
+ MenuItem.Add(M);
+ M.Tag:=FFileList.Count-1;
+ M.OnClick:=@InternalExecute;
+ end;
+end;
+
+procedure CreateSubItems;
+var
+ i:integer;
+ M:TMenuItem;
+ S:string;
+begin
+ for i:=0 to AFolderList.Count-1 do
+ begin
+ M:=TMenuItem.Create(Application.MainForm);
+ S:=AFolderList[i];
+ M.Caption:=MenuItemStr(S);
+ MenuItem.Add(M);
+ DoFind(AFolderList[i]+DirectorySeparator,M);
+ end;
+end;
+
+var
+ SS:string;
+begin
+ AFolderList:=TStringList.Create;
+ AFolderList.Sorted:=true;
+ AFileList:=TStringList.Create;
+ AFolderList.Sorted:=true;
+ try
+ R:=FindFirstUTF8(S+AllMask,faAnyFile, Rec);
+ while R=0 do
+ begin
+ if ((Rec.Attr and faDirectory) <>0) and (Rec.Name<>'.') and (Rec.Name<>'..') then
+ begin
+ SS:=S+Rec.Name;
+ AFolderList.Add(SS)
+ end
+ else
+ begin
+ if UTF8LowerCase(ExtractFileExt(Rec.Name))=UTF8LowerCase(FDefaultExt) then
+ begin
+ SS:=S+Rec.Name;
+ AFileList.Add(SS);
+ end;
+ end;
+ R:=FindNextUTF8(Rec);
+ end;
+ FindCloseUTF8(Rec);
+ CreateSubItems;
+ CreateItems;
+ finally
+ AFolderList.Free;
+ AFileList.Free;
+ end;
+end;
+
+function TCustomFolderLister.GetCount: integer;
+begin
+ Result:=FFileList.Count;
+end;
+
+function TCustomFolderLister.GetFiles(Item: integer): string;
+begin
+ Result:=FFileList[Item];
+end;
+
+procedure TCustomFolderLister.SetMenuItem(const AValue: TMenuItem);
+begin
+ if FMenuItem=AValue then exit;
+ FMenuItem:=AValue;
+end;
+
+procedure TCustomFolderLister.SetFileFolder(const AValue: string);
+begin
+ if FFileFolder=AValue then exit;
+ FFileFolder:=AValue;
+ if FFileFolder<>'' then
+ if FFileFolder[Length(FFileFolder)]<>DirectorySeparator then
+ FFileFolder:=FFileFolder+DirectorySeparator;
+end;
+
+procedure TCustomFolderLister.InternalExecute(Sender: TObject);
+begin
+ if Assigned(FOnExecuteItem) then
+ FOnExecuteItem(Sender)
+end;
+
+procedure TCustomFolderLister.Execute;
+begin
+ if Assigned(FMenuItem) then
+ DoFind(FFileFolder, FMenuItem)
+ else
+ raise Exception.Create(Name+'. Not assigned property MenuItem');
+end;
+
+constructor TCustomFolderLister.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FFileList:=TStringList.Create;
+ FFileList.Sorted:=false;
+end;
+
+destructor TCustomFolderLister.Destroy;
+begin
+ FFileList.Free;
+ inherited Destroy;
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/images/DBCalcEdit.xpm b/components/rx/version/v2.2_laz_1.2/images/DBCalcEdit.xpm
new file mode 100644
index 000000000..8a505f3f5
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/DBCalcEdit.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char *DBCalcEdit[]={
+"24 24 8 1",
+"e c #000000",
+"f c #000080",
+"c c #008080",
+"d c #00ffff",
+". c #808000",
+"# c #808080",
+"a c #c0c0c0",
+"b c #ffffff",
+"........................",
+".###############........",
+".#a#baaaabaaaaa#........",
+".###############........",
+".#a#bbbbabbbbbb#........",
+".#b#baababaaaab#........",
+".#a#bbbbabbbbbb#........",
+".#b#baababaaabb#........",
+".#a#bbbbabbbbbb#........",
+".#b#baababaaaab#........",
+".#a#bbbcccccccccccccc...",
+".#####cbdbdbdbdbdbdbce..",
+"......cdeeeeeeeeccccfe..",
+"......cbebbbbbbaccccfe..",
+"......cdeaaaaaaaccccfe..",
+"......cbccccccccccccfe..",
+"......cdcebebebebebefe..",
+"......cbccccccccccccfe..",
+"......cdcebebebebbaefe..",
+"......cbccccccccccccfe..",
+"......ccfffffffffffffe..",
+".......eeeeeeeeeeeeee...",
+"........................",
+"........................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/DBLookUp.xpm b/components/rx/version/v2.2_laz_1.2/images/DBLookUp.xpm
new file mode 100644
index 000000000..399de56bd
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/DBLookUp.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char *DBLookUp[]={
+"24 24 8 1",
+"# c #000000",
+"c c #000080",
+"e c #800000",
+". c #808000",
+"f c #808080",
+"d c #c0c0c0",
+"b c #ff0000",
+"a c #ffffff",
+"..##....................",
+".#aa#b.........c........",
+"#daaa#b.......cc........",
+"#ddaaa#......cccccccc...",
+".#ddaaa##.....cc.....c..",
+"..#ddaaaa###...c.....c..",
+"...#ddaabbbb#........c..",
+"....#ddebbb#.........c..",
+"..c.#feeeb#d###########.",
+"..c..#eef#daaaaaaa#aad#.",
+"..c..#ef#dccccccca#a#d#.",
+"..c..#e#daaaaaaaaa#ddd#.",
+"..c...#.###############.",
+"..c.....#aaaaaaaaaaaaa#.",
+"..c.....#acccccccccaaa#.",
+"..c.c...#ccccccccccccc#.",
+"..c.cc..#caaaaaaaaaacc#.",
+"...cccc.#ccccccccccccc#.",
+"....cc..#acccccccccaaa#.",
+"....c...#aaaaaaaaaaaaa#.",
+"........#accccccccccaa#.",
+"........#aaaaaaaaaaaaa#.",
+"........###############.",
+"........................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/RXCTLREG.RES b/components/rx/version/v2.2_laz_1.2/images/RXCTLREG.RES
new file mode 100644
index 000000000..f15e29173
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/RXCTLREG.RES differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/RXDBREG.res b/components/rx/version/v2.2_laz_1.2/images/RXDBREG.res
new file mode 100644
index 000000000..a64e8327e
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/RXDBREG.res differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/RXSPINDOWN.png b/components/rx/version/v2.2_laz_1.2/images/RXSPINDOWN.png
new file mode 100644
index 000000000..bab325933
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/RXSPINDOWN.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/RXSPINUP.png b/components/rx/version/v2.2_laz_1.2/images/RXSPINUP.png
new file mode 100644
index 000000000..51f9a4478
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/RXSPINUP.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/RXTOOREG.RES b/components/rx/version/v2.2_laz_1.2/images/RXTOOREG.RES
new file mode 100644
index 000000000..3a1803e13
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/RXTOOREG.RES differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/RxMDICloseIcon.png b/components/rx/version/v2.2_laz_1.2/images/RxMDICloseIcon.png
new file mode 100644
index 000000000..e3df635b6
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/RxMDICloseIcon.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/TCURRENCYEDIT.xpm b/components/rx/version/v2.2_laz_1.2/images/TCURRENCYEDIT.xpm
new file mode 100644
index 000000000..2f867f206
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/TCURRENCYEDIT.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *TCURRENCYEDIT[]={
+"24 24 6 1",
+". c None",
+"a c #000000",
+"d c #0000ff",
+"# c #808080",
+"c c #c0c0c0",
+"b c #ffffff",
+"........................",
+"........................",
+"........................",
+"........................",
+"#######################.",
+"#aaaaaaaaaaaaaaaaaaaaab.",
+"#abbbbbbbbbbbbbbbbbbbcb.",
+"#abbbbbbbbbbbbbaabaabcb.",
+"#abbbbbbbbbbbbbbbabbbcb.",
+"#abbbbdbbbbbdbbbbabbbcb.",
+"#abbbddddbbddbbbbabbbcb.",
+"#abbdbdbbbbbdbbbbabbbcb.",
+"#abbbdddbbbbdbbbbabbbcb.",
+"#abbbbdbdbbbdbbbbabbbcb.",
+"#abbddddbbbbdbbbbabbbcb.",
+"#abbbbdbbbbdddbbbabbbcb.",
+"#abbbbbbbbbbbbbaabaabcb.",
+"#abbbbbbbbbbbbbbbbbbbcb.",
+"#accccccccccccccccccccb.",
+"#bbbbbbbbbbbbbbbbbbbbbb.",
+"........................",
+"........................",
+"........................",
+"........................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/TDBDateEdit.xpm b/components/rx/version/v2.2_laz_1.2/images/TDBDateEdit.xpm
new file mode 100644
index 000000000..d561c3563
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/TDBDateEdit.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *TDBDateEdit[]={
+"18 18 8 1",
+"# c None",
+"e c #000000",
+"c c #000080",
+"d c #0000ff",
+"f c #800000",
+". c #808080",
+"a c #c0c0c0",
+"b c #ffffff",
+"...............###",
+".a.baaaabaaaaa.###",
+"...............###",
+".a.bbbbabbbbbb.###",
+".b.baababaaaab.###",
+".a.bbcccccccccccc#",
+".b.bacdddcdddcddce",
+".a.bbcccccccccccce",
+".b.bacbbbbbbbbbbce",
+".a.bbcbbfbbffffbce",
+".....cbffbbfbbbbce",
+"#####cbbfbbfffabce",
+"#####cbbfbbbbbfbce",
+"#####cbbfbbabafbce",
+"#####cbfffbfffabce",
+"#####cbbbbbbbbbbce",
+"#####cccccccccccce",
+"######eeeeeeeeeeee"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/TDualListDialog.xpm b/components/rx/version/v2.2_laz_1.2/images/TDualListDialog.xpm
new file mode 100644
index 000000000..1b2f4db8d
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/TDualListDialog.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *TDualListDialog[]={
+"24 24 7 1",
+". c None",
+"b c #000000",
+"e c #000080",
+"c c #0000ff",
+"# c #808080",
+"d c #c0c0c0",
+"a c #ffffff",
+"........................",
+"........................",
+".######################.",
+".#abccccccccccccccbabab.",
+".#bbbbbbbbbbbbbbbbbbbbb.",
+".#dadadadadadadadadadab.",
+".#adadadadadadadadadadb.",
+".#dbbbbadad#dadbbbbadab.",
+".#abaabbadab#dabaabbadb.",
+".#dbaabdbadbb#dbaabdbab.",
+".#abaabbbdabbdabaabbbdb.",
+".#dbaaaabadbdadbaaaabab.",
+".#abaeeabdadadabaeeabdb.",
+".#dbaaaabadabadbaaaabab.",
+".#abaeeabdabbdabaeeabdb.",
+".#dbaaaaba#bbadbaaaabab.",
+".#abaaaabda#bdabaaaabdb.",
+".#dbbbbbbada#adbbbbbbab.",
+".#adadadadadadadadadadb.",
+".#dadadadadadadadadadab.",
+".#adadadadadadadadadadb.",
+".#bbbbbbbbbbbbbbbbbbbbb.",
+"........................",
+"........................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/TFolderLister.xpm b/components/rx/version/v2.2_laz_1.2/images/TFolderLister.xpm
new file mode 100644
index 000000000..cc103f575
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/TFolderLister.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char *TFolderLister[]={
+"24 24 8 1",
+". c None",
+"a c #000000",
+"c c #808080",
+"# c #848484",
+"f c #c0c0c0",
+"e c #c6c6c6",
+"b c #ffff00",
+"d c #ffffff",
+"....#a#.................",
+".#a#aba#a#..............",
+".ab#aba#ba...ccc........",
+".##bbbbb##..cdddcc......",
+"#aab#a#baa#cddddddcc....",
+"abbbadabbbaddddddddda...",
+"#aab#a#baa#dddddddda....",
+"a##bbbbb##addddddda.....",
+"eab#aba#baeddddddadcc...",
+".#a#aba#a#dddddddaddda..",
+"....#a#dddddddddaddda...",
+"....cdfbaaddddddadda....",
+"....cdbfbfaadddadda.....",
+"....cdfbfcddaadadda.....",
+"...cccccccccccccdaa.....",
+"...cddddddddddcadaa.....",
+"...cdfbfbfbfbfbacca.....",
+"....cdfbfbfbfbfcaca.....",
+"....cdbfbfbfbfbfaca.....",
+".....cdbfbfbfbfbcaa.....",
+".....ccccccccccccaa.....",
+"......aaaaaaaaaaaaa.....",
+"........................",
+"........................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/TLoginDialog.xpm b/components/rx/version/v2.2_laz_1.2/images/TLoginDialog.xpm
new file mode 100644
index 000000000..2c5d53d10
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/TLoginDialog.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *TLoginDialog[]={
+"24 24 6 1",
+". c None",
+"b c #000000",
+"c c #0000ff",
+"# c #808080",
+"d c #c0c0c0",
+"a c #ffffff",
+"........................",
+"........................",
+".######################.",
+".#abccccccccccccccbabab.",
+".#bbbbbbbbbbbbbbbbbbbbb.",
+".#adadadadadadadadadadb.",
+".#dadadadadadadadadadab.",
+".#adadadadadadadadadadb.",
+".#dadadadadadadadadadab.",
+".#adadadadadadadadadadb.",
+".#dada#bbadadadadadadab.",
+".#ada#b#bbadadadadadadb.",
+".#dadbbdabbbbbbbbbbadab.",
+".#adabbadbbbbbbbbbbdadb.",
+".#dad#b#bbdadbbabbdadab.",
+".#adad#bbdadabbdbbadadb.",
+".#dadadddadadbbabbdadab.",
+".#adadadadadadadadadadb.",
+".#dadadadadadadadadadab.",
+".#adadadadadadadadadadb.",
+".#dadadadadadadadadadab.",
+".#bbbbbbbbbbbbbbbbbbbbb.",
+"........................",
+"........................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/TPAGEMANAGER.xpm b/components/rx/version/v2.2_laz_1.2/images/TPAGEMANAGER.xpm
new file mode 100644
index 000000000..60e5b287b
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/TPAGEMANAGER.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char *TPAGEMANAGER[]={
+"24 24 8 1",
+". c None",
+"b c #000000",
+"c c #000080",
+"f c #00ffff",
+"d c #800000",
+"# c #808080",
+"e c #ffff00",
+"a c #ffffff",
+"........................",
+"........................",
+".........##############.",
+".........#aaaaaaaaaaaab.",
+".......##############ab.",
+".......#aaaaaaaaaaaabab.",
+".....##############abab.",
+".....#aaaaaaaaaaaababab.",
+".....#acccccaddddababab.",
+".....#aaaaaaadaadababab.",
+".....#accccaadaadababab.",
+".....#aaaaaaadaadababab.",
+".....#abbbaaaddddababab.",
+".bbbbbbeaebaaaaaaababbb.",
+".bbbfbeabbbbbbbbaabab...",
+".bbbfbaeaeaeaeaebabbb...",
+".bbbfbeaeabbbbbbaab.....",
+".bbbfbaeaeaeab###bb.....",
+".bbbfbeaeabbb...........",
+".bbbfbbeaeaeb...........",
+".bebbb.bbbbb............",
+".bbb....................",
+"........................",
+"........................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRXAPPICON.xpm b/components/rx/version/v2.2_laz_1.2/images/TRXAPPICON.xpm
new file mode 100644
index 000000000..67c91165f
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/TRXAPPICON.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static char *TRXAPPICON[]={
+"24 24 9 1",
+". c None",
+"a c #000000",
+"f c #800000",
+"c c #808000",
+"e c #808080",
+"g c #c0c0c0",
+"# c #ff0000",
+"d c #ffff00",
+"b c #ffffff",
+"...........###..##...##.",
+"............#..#..#.#..#",
+"........a...#..#....#..#",
+"......aabaa.#..#....#..#",
+"....aabbcdda#..#..#.#..#",
+"..aabbccccc###..##...##.",
+".abbddddddddddda........",
+".aaaaaaaaaaaaaaa..##b...",
+".abddeebddeebdda...##b..",
+"..cceeecceeeccc....###b.",
+"..cbebbcbebbcbc.####d#..",
+"..cdebbcdebbcee##d##d#b.",
+"..cbebbcbebbcebfd#dd#b..",
+"..cdebbcdebbcebbfbb##...",
+".adddaadddaadebgbf###b..",
+".aaaaaaaaaaaebbgegf#....",
+".adbdbdbdbdebebegeea....",
+".aaaaaaaaaebebeeaaaa....",
+".........ebebeea........",
+"........ebgbeea.........",
+"........agbeea..........",
+"........aeeaa...........",
+".........aa.............",
+"........................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRXCLOCK.xpm b/components/rx/version/v2.2_laz_1.2/images/TRXCLOCK.xpm
new file mode 100644
index 000000000..9ccb31f27
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/TRXCLOCK.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *TRXCLOCK[]={
+"24 24 4 1",
+". c None",
+"# c #000000",
+"b c #c0c0c0",
+"a c #ff0000",
+"........................",
+"........................",
+"........................",
+"....##...........##.....",
+"...#aa#..#####..#aa#....",
+"..#aaa###bbbbb###aaa#...",
+"..#aaa#bbbb#bbbb#aaa#...",
+"...###bbbbb#bbbbb###....",
+"....#bbb#bbbbb#bbb#.....",
+"....#bbbbbb#bbbbbb#.....",
+"...#bb#bbbb#bbbb#bb#....",
+"...#bbbbbbb#bbbbbbb#....",
+"...#b##bbbb#bbbb##b#....",
+"...#bbbbbbbb#bbbbbb#....",
+"...#bb#bbbbbb#bb#bb#....",
+"....#bbbbbbbbbbbbb#.....",
+"....#bbb#bbbbb#bbb#.....",
+".....#bbbbb#bbbbb#......",
+"......#bbbb#bbbb#.......",
+".....####bbbbb####......",
+"....###..#####..###.....",
+"....##...........##.....",
+"........................",
+"........................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRXDBCOMBOBOX.xpm b/components/rx/version/v2.2_laz_1.2/images/TRXDBCOMBOBOX.xpm
new file mode 100644
index 000000000..f4ce7dae4
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/TRXDBCOMBOBOX.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *TRXDBCOMBOBOX[]={
+"24 24 6 1",
+". c None",
+"c c #000000",
+"d c #000080",
+"# c #808080",
+"a c #c0c0c0",
+"b c #ffffff",
+"........................",
+".###############........",
+".#a#baaaabaaaaa#........",
+".###############........",
+".#a#bbbbabbbbbb#........",
+".#b#baababaaaab#........",
+".#a#bbbbabbbbbb#........",
+".#b#baababaaabb#........",
+".#a#bbccccccccccccccccc.",
+".#b#bacbbbbbbbbbbbcbbac.",
+".#a#bbcbdddddddddbcbcac.",
+".#####cbbbbbbbbbbbcaaac.",
+"......ccccccccccccccccc.",
+"...d....cbbbbbbbbbbbbbc.",
+"..ddd...cbbddddddddbbbc.",
+".ddddd..cdddddddddddddc.",
+"...d....cddbbbbbbbbbddc.",
+"...d....cdddddddddddddc.",
+"...d....cbbddddddddbbbc.",
+"...d....cbbbbbbbbbbbbbc.",
+"...dddd.cbbdddddddddbbc.",
+"........cbbbbbbbbbbbbbc.",
+"........ccccccccccccccc.",
+"........................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRXDBSpinEdit.png b/components/rx/version/v2.2_laz_1.2/images/TRXDBSpinEdit.png
new file mode 100644
index 000000000..d102b4841
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/TRXDBSpinEdit.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRXDICE.xpm b/components/rx/version/v2.2_laz_1.2/images/TRXDICE.xpm
new file mode 100644
index 000000000..d7227c16e
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/TRXDICE.xpm
@@ -0,0 +1,31 @@
+/* XPM */
+static char *TRXDICE[]={
+"24 24 4 1",
+". c None",
+"# c #000000",
+"b c #c0c0c0",
+"a c #ffffff",
+"........................",
+"........................",
+"........................",
+"...........##...........",
+".........##aa##.........",
+".......##aa##aa##.......",
+".....##aaaa##aaaa##.....",
+"...##aaaaaaaaaaaaaa##...",
+"...#b##aaaa##aaaa##a#...",
+"...#bbb##aa##aa##aaa#...",
+"...#bbbbb##aa##aa##a#...",
+"...#bbbbbbb##aaaa##a#...",
+"...#bbbbbbb#a##aaaaa#...",
+"...#bbb##bb#a##aaaaa#...",
+"...#bbb##bb#aaaaaaaa#...",
+"...#bbbbbbb#aaaaa##a#...",
+"...#bbbbbbb#aaaaa##a#...",
+"...##bbbbbb#a##aaaa##...",
+".....##bbbb#a##aa##.....",
+".......##bb#aaa##.......",
+".........###a##.........",
+"...........##...........",
+"........................",
+"........................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRXLABEL.xpm b/components/rx/version/v2.2_laz_1.2/images/TRXLABEL.xpm
new file mode 100644
index 000000000..6aa7fec0f
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/TRXLABEL.xpm
@@ -0,0 +1,30 @@
+/* XPM */
+static char *TRXLABEL[]={
+"24 24 3 1",
+". c None",
+"# c #000000",
+"a c #ffffff",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................",
+".........####aa.........",
+"..........####aa........",
+".........#####aa........",
+".........##a###aa.......",
+"........##aa.##aa.......",
+"........##aa.###aa......",
+".......##aa...##aa......",
+".......##########aa.....",
+"......##aaaaaaa##aa.....",
+"......##aa.....###aa....",
+".....##aa.......##aa....",
+"....####aa.....####aa...",
+".....aaaaa......aaaaa...",
+"........................",
+"........................",
+"........................",
+"........................",
+"........................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRXLookUpEdit.xpm b/components/rx/version/v2.2_laz_1.2/images/TRXLookUpEdit.xpm
new file mode 100644
index 000000000..d16d096e2
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/TRXLookUpEdit.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char *TRXLookUpEdit[]={
+"24 24 7 1",
+". c None",
+"# c #000000",
+"e c #800000",
+"c c #808080",
+"d c #c0c0c0",
+"b c #ff0000",
+"a c #ffffff",
+"..##....................",
+".#aa#b..ccccccccccccccc.",
+"#daaa#b.cdcaddddadddddc.",
+"#ddaaa#.ccccccccccccccc.",
+".#ddaaa##dcaaaadaaaaaac.",
+"..#ddaaaa###ddadaddddac.",
+"...#ddaabbbb#aadaaaaaac.",
+"....#ddebbb#ddadadddaac.",
+"....#ceeeb#aaaadaaaaaac.",
+".....#eec#caddadaddddac.",
+".....#ec#dcaaaadaaaaaac.",
+".....#e#ccccccccccccccc.",
+"......#.................",
+"..ccccccccccccccccccccc.",
+"..c###################a.",
+"..c#aaaaaaaaaadaaaaaada.",
+"..c#aaaaaaaaaadaddddcda.",
+"..c#aaaaaaaaaadad##dcda.",
+"..c#aaaaaaaaaadaddddcda.",
+"..c#aaaaaaaaaadacccccda.",
+"..c#dddddddddddddddddda.",
+"..caaaaaaaaaaaaaaaaaaaa.",
+"........................",
+"........................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRXSWITCH.xpm b/components/rx/version/v2.2_laz_1.2/images/TRXSWITCH.xpm
new file mode 100644
index 000000000..a06aa968e
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/TRXSWITCH.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char *TRXSWITCH[]={
+"24 24 5 1",
+". c None",
+"# c #000000",
+"b c #808080",
+"c c #ff0000",
+"a c #ffffff",
+"........................",
+"........................",
+".....##############.....",
+".....##############.....",
+".....###aaaaaaa#b##.....",
+".....##aaaaaaa#bb##.....",
+".....#aaaaaaa#bbb##.....",
+".....#########bbb##.....",
+".....#aaaaaaa#bbb##.....",
+".....#aaaaaaaa#bb##.....",
+".....##aaaaaaa#bb##.....",
+".....##aaaaaaaa#b##.....",
+".....###########b##.....",
+".....##aaaaaaaa#b##.....",
+".....##a######a#b##.....",
+".....##a#cccc#a#b##.....",
+".....##a######a#b##.....",
+".....##aaaaaaaa#b##.....",
+".....###########b##.....",
+".....###bbbbbbbb###.....",
+".....##############.....",
+".....##############.....",
+"........................",
+"........................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/TReportManager.xpm b/components/rx/version/v2.2_laz_1.2/images/TReportManager.xpm
new file mode 100644
index 000000000..640e57d6d
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/TReportManager.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static char *TReportManager[]={
+"24 24 9 1",
+". c None",
+"# c #000000",
+"c c #0000ff",
+"g c #808000",
+"f c #808080",
+"b c #c0c0c0",
+"d c #ff00ff",
+"e c #ffff00",
+"a c #ffffff",
+"........................",
+"........................",
+"......#########.........",
+".....#aaaaaaaa#.........",
+".....#a#####a#..........",
+"....#aaaaaaaa#..........",
+"....#a#####a####........",
+"...#aaaaaaaa#b#b#.......",
+"..##########b#b##.......",
+".#bbbbbbbbbb#b#b#.......",
+".#############bb#.......",
+".#bccbbbbbbbb#b#d###....",
+".#beebb###bbb#b##...#.#.",
+".######eae######.....##.",
+"..#bbf#aeaeaeae#....###.",
+"...####eaeaeaeae###.....",
+"......#aeae###########..",
+"......#eae#ggggggggg#...",
+"......#ae#ggggggggg#....",
+"......#e#ggggggggg#.....",
+"......##ggggggggg#......",
+"......###########.......",
+"........................",
+"........................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxAboutDialog.png b/components/rx/version/v2.2_laz_1.2/images/TRxAboutDialog.png
new file mode 100644
index 000000000..71503019e
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/TRxAboutDialog.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxCalendarGrid.xpm b/components/rx/version/v2.2_laz_1.2/images/TRxCalendarGrid.xpm
new file mode 100644
index 000000000..243b8cb69
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/TRxCalendarGrid.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char *TRxCalendarGrid[]={
+"24 24 5 1",
+". c None",
+"# c #000000",
+"a c #00ffff",
+"c c #800000",
+"b c #ffffff",
+"........................",
+"........................",
+"......###.....###.......",
+".....#...#...#...#......",
+"....##############......",
+"....#a#aaaaaaaa#a##.....",
+"....#aaaaaaaaaaaa##.....",
+"....###############.....",
+"....#bbbbbbbbbbbb##.....",
+"....#bbbbbbbbbbbb##.....",
+"....#bbbccbbbcbbb##.....",
+"....#bbcbbcbccbbb##.....",
+"....#bbbbcbbbcbbb##.....",
+"....#bbbcbbbbcbbb##.....",
+"....#bbcbbbbbcbbb##.....",
+"....#bbccccbbcbbb##.....",
+"....#bbbbbbbbbbbb##.....",
+"....#bbbbbbbbbbbb##.....",
+"....#bbbbbbbbbbbb##.....",
+"....###############.....",
+"......#############.....",
+"........................",
+"........................",
+"........................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxClock.png b/components/rx/version/v2.2_laz_1.2/images/TRxClock.png
new file mode 100644
index 000000000..f94fb0801
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/TRxClock.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxCloseFormValidator.png b/components/rx/version/v2.2_laz_1.2/images/TRxCloseFormValidator.png
new file mode 100644
index 000000000..30885956e
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/TRxCloseFormValidator.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxDBCalcEdit.xpm b/components/rx/version/v2.2_laz_1.2/images/TRxDBCalcEdit.xpm
new file mode 100644
index 000000000..4f527e45b
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/TRxDBCalcEdit.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *TRxDBCalcEdit_xpm[]={
+"18 18 8 1",
+"# c None",
+"e c #000000",
+"f c #000080",
+"c c #008080",
+"d c #00ffff",
+". c #808080",
+"a c #c0c0c0",
+"b c #ffffff",
+"...............###",
+".a.baaaabaaaaa.###",
+"...............###",
+".a.bbbbabbbbbb.###",
+".b.baababaaaab.###",
+".a.bbbbabbbbbb.###",
+".bbcccccccccccccc#",
+".acbdbdbdbdbdbdbce",
+".bcdeeeeeeeeccccfe",
+".acbebbbbbbaccccfe",
+"..cdeaaaaaaaccccfe",
+"##cbccccccccccccfe",
+"##cdcebebebebebefe",
+"##cbccccccccccccfe",
+"##cdcebebebebbaefe",
+"##cbccccccccccccfe",
+"##ccfffffffffffffe",
+"###eeeeeeeeeeeeee#"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxDBColorBox.png b/components/rx/version/v2.2_laz_1.2/images/TRxDBColorBox.png
new file mode 100644
index 000000000..3987f0916
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/TRxDBColorBox.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxDBComboEdit.xpm b/components/rx/version/v2.2_laz_1.2/images/TRxDBComboEdit.xpm
new file mode 100644
index 000000000..845470c51
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/TRxDBComboEdit.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static char *TRxDBComboEdit[]={
+"24 24 5 1",
+". c None",
+"c c #000000",
+"# c #808080",
+"a c #c0c0c0",
+"b c #ffffff",
+"........................",
+".###############........",
+".#a#baaaabaaaaa#........",
+".###############........",
+".#a#bbbbabbbbbb#........",
+".#b#baababaaaab#........",
+".#a#bbbbabbbbbb#........",
+".#b#baababaaabb#........",
+".#a#bbbbabbbbbb#........",
+".#b#baababaaaab#........",
+".#a#bbbbabbbbbb#........",
+".######################.",
+"..#cccccccccccccccccccb.",
+"..#cbbbbbbbbbabbbbbbbab.",
+"..#cbbbbbbbbbabaaaaa#ab.",
+"..#cbbbbbbbbbabaaaaa#ab.",
+"..#cbbbbbbbbbabac#ca#ab.",
+"..#cbbbbbbbbbabaaaaa#ab.",
+"..#cbbbbbbbbbabaaaaa#ab.",
+"..#cbbbbbbbbbab######ab.",
+"..#caaaaaaaaaaaaaaaaaab.",
+"..#bbbbbbbbbbbbbbbbbbbb.",
+"........................",
+"........................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxDBCurrEdit.png b/components/rx/version/v2.2_laz_1.2/images/TRxDBCurrEdit.png
new file mode 100644
index 000000000..44066afc9
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/TRxDBCurrEdit.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxDBGrid.xpm b/components/rx/version/v2.2_laz_1.2/images/TRxDBGrid.xpm
new file mode 100644
index 000000000..fa191f0ff
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/TRxDBGrid.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char *TRxDBGrid[]={
+"24 24 10 1",
+". c None",
+"c c #000000",
+"f c #008000",
+"e c #00ffff",
+"g c #800080",
+"# c #808080",
+"a c #c0c0c0",
+"d c #ff0000",
+"h c #ff00ff",
+"b c #ffffff",
+"........................",
+".###############........",
+".#a#baaaabaaaaa#........",
+".###############........",
+".#a#bbbbabbbbbb#........",
+".#b#baababaaaab#........",
+".#a#bbbbabbbbbb#........",
+".#b#baababaaabb#........",
+".#a#bbbbabbbbbb#........",
+".#b#baababaaaab#........",
+".#a#bcccccccccccccccccc.",
+".####cacbaaaaabaaaaaaac.",
+".....cccccccccccccccccc.",
+".....cacbbbbbabbbbbbbbc.",
+".....cbcaaaaaaaaaaaaaac.",
+".....cacbbbbbabbbbbbbbc.",
+".....ccccdddddddddddddc.",
+".....cbebcbbbabbbbbbbbc.",
+".cccccebecddddddddddddc.",
+".cfffcbebccbbabbbbbbbbc.",
+".cfffcccccgcaaaaaaaaaac.",
+".cfffcbcbchgcabbbbbbbbc.",
+".cccccccccghgcccccccccc.",
+".........cccccc........."};
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxDBGridExportSpreadSheet.png b/components/rx/version/v2.2_laz_1.2/images/TRxDBGridExportSpreadSheet.png
new file mode 100644
index 000000000..05abd8a38
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/TRxDBGridExportSpreadSheet.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxDBGridPrint.png b/components/rx/version/v2.2_laz_1.2/images/TRxDBGridPrint.png
new file mode 100644
index 000000000..480ab6d1a
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/TRxDBGridPrint.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxDBLookupCombo.xpm b/components/rx/version/v2.2_laz_1.2/images/TRxDBLookupCombo.xpm
new file mode 100644
index 000000000..3c6245dda
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/TRxDBLookupCombo.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char *TRxDBLookupCombo[]={
+"24 24 8 1",
+". c None",
+"# c #000000",
+"c c #000080",
+"e c #800000",
+"f c #808080",
+"d c #c0c0c0",
+"b c #ff0000",
+"a c #ffffff",
+"..##....................",
+".#aa#b.........c........",
+"#daaa#b.......cc........",
+"#ddaaa#......cccccccc...",
+".#ddaaa##.....cc.....c..",
+"..#ddaaaa###...c.....c..",
+"...#ddaabbbb#........c..",
+"....#ddebbb#.........c..",
+"..c.#feeeb#d###########.",
+"..c..#eef#daaaaaaa#aad#.",
+"..c..#ef#dccccccca#a#d#.",
+"..c..#e#daaaaaaaaa#ddd#.",
+"..c...#.###############.",
+"..c.....#aaaaaaaaaaaaa#.",
+"..c.....#acccccccccaaa#.",
+"..c.c...#ccccccccccccc#.",
+"..c.cc..#caaaaaaaaaacc#.",
+"...cccc.#ccccccccccccc#.",
+"....cc..#acccccccccaaa#.",
+"....c...#aaaaaaaaaaaaa#.",
+"........#accccccccccaa#.",
+"........#aaaaaaaaaaaaa#.",
+"........###############.",
+"........................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxDBProgressBar.png b/components/rx/version/v2.2_laz_1.2/images/TRxDBProgressBar.png
new file mode 100644
index 000000000..de40d879d
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/TRxDBProgressBar.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxDBRadioGroup.png b/components/rx/version/v2.2_laz_1.2/images/TRxDBRadioGroup.png
new file mode 100644
index 000000000..a607c630c
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/TRxDBRadioGroup.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxDBTimeEdit.png b/components/rx/version/v2.2_laz_1.2/images/TRxDBTimeEdit.png
new file mode 100644
index 000000000..7754a99f5
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/TRxDBTimeEdit.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxDBTrackBar.png b/components/rx/version/v2.2_laz_1.2/images/TRxDBTrackBar.png
new file mode 100644
index 000000000..19c09c7d9
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/TRxDBTrackBar.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxDateEdit.png b/components/rx/version/v2.2_laz_1.2/images/TRxDateEdit.png
new file mode 100644
index 000000000..3295641fa
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/TRxDateEdit.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxDbLookupList.xpm b/components/rx/version/v2.2_laz_1.2/images/TRxDbLookupList.xpm
new file mode 100644
index 000000000..6e47893dc
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/TRxDbLookupList.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char *TRxDbLookupList[]={
+"24 24 8 1",
+". c None",
+"# c #000000",
+"c c #000080",
+"e c #800000",
+"f c #808080",
+"d c #c0c0c0",
+"b c #ff0000",
+"a c #ffffff",
+"..##....................",
+".#aa#b.........c........",
+"#daaa#b.......cc........",
+"#ddaaa#......ccccccc....",
+".#ddaaa##.....cc....c...",
+"..#ddaaaa###...c....c...",
+"...#ddaabbbb#.......c...",
+"....#ddebbb#........c...",
+"..c.#feeeb#d###########.",
+"..c..#eef#aaaaaaaa#aad#.",
+"..c..#ef#dcccccaaa#a#d#.",
+"..c..#e#aaaaaaaaaa#ddd#.",
+"..c...#daaccccccaa#####.",
+"..c....#aaaaaaaaaa#ddd#.",
+"..c....#accccccaaa#ddd#.",
+"..c.c..#cccccccccc#ddd#.",
+"..c.cc.#caaaaaaacc#ddd#.",
+"...cccc#cccccccccc#ddd#.",
+"....cc.#accccccaaa#####.",
+"....c..#aaaaaaaaaa#add#.",
+".......#acccccccaa#a#d#.",
+".......#aaaaaaaaaa#ddd#.",
+".......################.",
+"........................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxFolderMonitor.xpm b/components/rx/version/v2.2_laz_1.2/images/TRxFolderMonitor.xpm
new file mode 100644
index 000000000..e01e988a4
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/TRxFolderMonitor.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *TRxFolderMonitor[]={
+"24 24 6 1",
+". c None",
+"b c #000000",
+"# c #808080",
+"c c #c0c0c0",
+"d c #ffff00",
+"a c #ffffff",
+"........................",
+"........................",
+".............###........",
+"............#aaa##......",
+"...........#aaaaaa##....",
+"..........#aaaaaaaaab...",
+"..........#aaaaaaaab....",
+".........#aaaaaaaab.....",
+".........#aaaaaaaba##...",
+"......###aaaaaaaabaaab..",
+".....#aa#aaaaaaabaaab...",
+"....#acdbbaaaaaabaab....",
+"....#adcdcbbaaabaab.....",
+"....#acdc#aabbabaab.....",
+"...#############abb.....",
+"...#aaaaaaaaaa#babb.....",
+"...#acdcdcdcdcdb##b.....",
+"....#acdcdcdcdc#b#b.....",
+"....#adcdcdcdcdcb#b.....",
+".....#adcdcdcdcd#bb.....",
+".....############bb.....",
+"......bbbbbbbbbbbbb.....",
+"........................",
+"........................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxHistoryNavigator.png b/components/rx/version/v2.2_laz_1.2/images/TRxHistoryNavigator.png
new file mode 100644
index 000000000..ceced4ac1
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/TRxHistoryNavigator.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxIniPropStorage.png b/components/rx/version/v2.2_laz_1.2/images/TRxIniPropStorage.png
new file mode 100644
index 000000000..c1766a70d
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/TRxIniPropStorage.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxLoginDialog.png b/components/rx/version/v2.2_laz_1.2/images/TRxLoginDialog.png
new file mode 100644
index 000000000..c4a5f24c7
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/TRxLoginDialog.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxMemoryData.xpm b/components/rx/version/v2.2_laz_1.2/images/TRxMemoryData.xpm
new file mode 100644
index 000000000..0e4e61364
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/TRxMemoryData.xpm
@@ -0,0 +1,33 @@
+/* XPM */
+static char *TRxMemoryData[]={
+"24 24 6 1",
+". c None",
+"# c #000000",
+"c c #000080",
+"d c #808080",
+"a c #c0c0c0",
+"b c #ffffff",
+"........................",
+"####################....",
+"#a#baaaaaabaaaaaaaa#....",
+"####################....",
+"#a#bbbbbbabbbbbbbbb#....",
+"#b#bccccbabcccccccb#....",
+"#a#bbbbbbabbbbbbbbb#....",
+"#b#bccccbabccccccbb#....",
+"#a#bbbbbbabbbbbbbbb#....",
+"#b#bccccbabccccccbb#....",
+"#a#bbbbbbabbbbbbb###....",
+"#b#bccccbabcbbb#daa#....",
+"#a#bbbbbbabbb#daaaaa#...",
+"#b#bccccbab#daaaaaaaa#..",
+"#a#bbbbbb#daaaaaaaaaad#.",
+"#b#bcccbdaaaaaaaaaaddd#.",
+"#a#bbbbdbaaaaaaaaddd#a#.",
+"########abaaaaaddd#ad#..",
+"........#dbaaddd#ad#.#..",
+".........#dbdd#ad#.#....",
+"..........#a#ad#.#......",
+"...........#d#.#........",
+".............#..........",
+"........................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxRadioGroup.png b/components/rx/version/v2.2_laz_1.2/images/TRxRadioGroup.png
new file mode 100644
index 000000000..1d2d30fdf
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/TRxRadioGroup.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxSpeedButton.png b/components/rx/version/v2.2_laz_1.2/images/TRxSpeedButton.png
new file mode 100644
index 000000000..607d4c111
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/TRxSpeedButton.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxSpinButton.png b/components/rx/version/v2.2_laz_1.2/images/TRxSpinButton.png
new file mode 100644
index 000000000..d9a7267d4
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/TRxSpinButton.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxSpinEdit.png b/components/rx/version/v2.2_laz_1.2/images/TRxSpinEdit.png
new file mode 100644
index 000000000..f2b9fcd62
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/TRxSpinEdit.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxTimeEdit.png b/components/rx/version/v2.2_laz_1.2/images/TRxTimeEdit.png
new file mode 100644
index 000000000..ca1f3e54f
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/TRxTimeEdit.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxVersionInfo.png b/components/rx/version/v2.2_laz_1.2/images/TRxVersionInfo.png
new file mode 100644
index 000000000..a88218ba4
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/TRxVersionInfo.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/TRxViewsPanel.png b/components/rx/version/v2.2_laz_1.2/images/TRxViewsPanel.png
new file mode 100644
index 000000000..8054b0856
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/TRxViewsPanel.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/TSECRETPANEL.xpm b/components/rx/version/v2.2_laz_1.2/images/TSECRETPANEL.xpm
new file mode 100644
index 000000000..4607e79b4
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/TSECRETPANEL.xpm
@@ -0,0 +1,38 @@
+/* XPM */
+static char *TSECRETPANEL[]={
+"24 24 11 1",
+". c None",
+"# c #000000",
+"d c #000080",
+"i c #0000ff",
+"e c #008000",
+"g c #800000",
+"a c #808080",
+"b c #c0c0c0",
+"h c #ff0000",
+"f c #ffff00",
+"c c #ffffff",
+"........................",
+"........................",
+".######################.",
+".#aaaaaaaaaaaaaaaaaaab#.",
+".#aaaaaaaaaaaaaaaaaacc#.",
+".#aabbbbbbbbbbbbbbbbcc#.",
+".#aabbbbbd#dbbbbbbbbcc#.",
+".#aabbbbdefedbbbbbbbcc#.",
+".#aabbbb#fff#aabbbbbcc#.",
+".#aabbbbdefedbb##bbbcc#.",
+".#aabbbbbd#dbbbggbbbcc#.",
+".#aabbbbabbbbb#hh#bbcc#.",
+".#aabbbbabbbbb#hh#bbcc#.",
+".#aabb#####bb#hhhh#bcc#.",
+".#aabb#iii#bb######bcc#.",
+".#aabb#iii#aabbbbbbbcc#.",
+".#aabb#iii#bbbbbbbbbcc#.",
+".#aabb#####bbbbbbbbbcc#.",
+".#aabbbbbbbbbbbbbbbbcc#.",
+".#accccccccccccccccccc#.",
+".#bccccccccccccccccccc#.",
+".######################.",
+"........................",
+"........................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/componet_img/DICE1.xpm b/components/rx/version/v2.2_laz_1.2/images/componet_img/DICE1.xpm
new file mode 100644
index 000000000..ec087375f
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/componet_img/DICE1.xpm
@@ -0,0 +1,71 @@
+/* XPM */
+static char *DICE1[]={
+"64 64 4 1",
+". c None",
+"# c #000000",
+"b c #c0c0c0",
+"a c #ffffff",
+"................................................................",
+".............................######.............................",
+"...........................##########...........................",
+".........................####aaaaaa####.........................",
+".......................####aaaaaaaaaa####.......................",
+".....................####aaaaaaaaaaaaaa####.....................",
+"...................####aaaaaaaaaaaaaaaaaa####...................",
+".................####aaaaaaaaaaaaaaaaaaaaaa####.................",
+"...............####aaaaaaaaaaaaaaaaaaaaaaaaaa####...............",
+".............####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.............",
+"...........####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####...........",
+".........####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.........",
+".......####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.......",
+".....####aaaaaaaaaaaaaaaaaaaaa####aaaaaaaaaaaaaaaaaaaaa####.....",
+"...####aaaaaaaaaaaaaaaaaaaaa########aaaaaaaaaaaaaaaaaaaaa####...",
+".####aaaaaaaaaaaaaaaaaaaaaa##########aaaaaaaaaaaaaaaaaaaaaa####.",
+"#####aaaaaaaaaaaaaaaaaaaaaa##########aaaaaaaaaaaaaaaaaaaaaa#####",
+"##b####aaaaaaaaaaaaaaaaaaaaa########aaaaaaaaaaaaaaaaaaaaa####a##",
+"##bbb####aaaaaaaaaaaaaaaaaaaaa####aaaaaaaaaaaaaaaaaaaaa####aaa##",
+"##bbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaa##",
+"##bbbbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaaaa##",
+"##bbbbbbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaaaaaa##",
+"##bbbbbbbbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaa###aaaa##",
+"##bbbbbbbbbbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaa####aaaa######aaa##",
+"##bbbbbbbbbbbbbbb####aaaaaaaaaaaaaaaaaaaaaa####aaaaaa######aaa##",
+"##bbbbbbbbbbbbbbbbb####aaaaaaaaaaaaaaaaaa####aaaaaaa#######aaa##",
+"##bbbbbbbbbbbbbbbbbbb####aaaaaaaaaaaaaa####aaaaaaaaa#######aaa##",
+"##bbbbbbbbbbbbbbbbbbbbb####aaaaaaaaaa####aaaaaaaaaaa#######aaa##",
+"##bbbbbbbbbbbbbbbbbbbbbbb####aaaaaa####aaaaaaaaaaaaa######aaaa##",
+"##bbbbbbbbbbbbbbbbbbbbbbbbb####aa####aaaaaaaaaaaaaaaa####aaaaa##",
+"##bbbbbbbbbbbbbbbbbbbb###bbbb######aaaa###aaaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbbbbbbbbbb######bbbb##aaaa######aaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbbbbbbbbbb######bbbb##aaaa######aaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbbbbbbbbbb#######bbb##aaa#######aaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbbbbbbbbbb#######bbb##aaa#######aaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbbb###bbbb#######bbb##aaa#######aaaa###aaaaaaaaaaaa##",
+"##bbbbbbbbbbb######bbb######bbb##aaa######aaa######aaaaaaaaaaa##",
+"##bbbbbbbbbbb######bbbb####bbbb##aaaa####aaaa######aaaaaaaaaaa##",
+"##bbbbbbbbbbb#######bbbbbbbbbbb##aaaaaaaaaaa#######aaaaaaaaaaa##",
+"##bbbbbbbbbbb#######bbbbbbbbbbb##aaaaaaaaaaa#######aaaaaaaaaaa##",
+"##bbbb###bbbb#######bbbbbbbbbbb##aaaaaaaaaaa#######aaaa###aaaa##",
+"##bbb######bbb######bbbbbbbbbbb##aaaaaaaaaaa######aaa######aaa##",
+"##bbb######bbbb####bbbbbbbbbbbb##aaaaaaaaaaaa####aaaa######aaa##",
+"##bbb#######bbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaa#######aaa##",
+"##bbb#######bbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaa#######aaa##",
+"##bbb#######bbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaa#######aaa##",
+"##bbbb######bbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaa######aaaa##",
+"###bbbb####bbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaa####aaaa###",
+".####bbbbbbbbbbbbbbbbbbbbbbbbbb##aaaaaa###aaaaaaaaaaaaaaaaa####.",
+"...####bbbbbbbbbbbbbbbbbbbbbbbb##aaaa######aaaaaaaaaaaaaa####...",
+".....####bbbbbbbbbbbbbbbbbbbbbb##aaaa######aaaaaaaaaaaa####.....",
+".......####bbbbbbbbbbbbbbbbbbbb##aaa#######aaaaaaaaaa####.......",
+".........####bbbbbbbbbbbbbbbbbb##aaa#######aaaaaaaa####.........",
+"...........####bbbbbbbbbbbbbbbb##aaa#######aaaaaa####...........",
+".............####bbbbbbbbbbbbbb##aaa######aaaaa####.............",
+"...............####bbbbbbbbbbbb##aaaa####aaaa####...............",
+".................####bbbbbbbbbb##aaaaaaaaaa####.................",
+"...................####bbbbbbbb##aaaaaaaa####...................",
+".....................####bbbbbb##aaaaaa####.....................",
+".......................####bbbb##aaaa####.......................",
+".........................####bb##aa####.........................",
+"...........................##########...........................",
+"..............................####..............................",
+"................................................................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/componet_img/DICE2.xpm b/components/rx/version/v2.2_laz_1.2/images/componet_img/DICE2.xpm
new file mode 100644
index 000000000..6586a3c2c
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/componet_img/DICE2.xpm
@@ -0,0 +1,71 @@
+/* XPM */
+static char *DICE2[]={
+"64 64 4 1",
+". c None",
+"# c #000000",
+"b c #c0c0c0",
+"a c #ffffff",
+"................................................................",
+".............................######.............................",
+"...........................##########...........................",
+".........................####aaaaaa####.........................",
+".......................####aaaaaaaaaa####.......................",
+".....................####aaaaa####aaaaa####.....................",
+"...................####aaaaa########aaaaa####...................",
+".................####aaaaaa##########aaaaaa####.................",
+"...............####aaaaaaaa##########aaaaaaaa####...............",
+".............####aaaaaaaaaaa########aaaaaaaaaaa####.............",
+"...........####aaaaaaaaaaaaaaa####aaaaaaaaaaaaaaa####...........",
+".........####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.........",
+".......####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.......",
+".....####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.....",
+"...####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####...",
+".####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.",
+"#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####",
+"##b####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####a##",
+"##bbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaa##",
+"##bbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaa##",
+"##bbbbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaaaa##",
+"##bbbbbbbbb####aaaaaaaaaaaaaaa####aaaaaaaaaaaaaaa####aaaaaaaaa##",
+"##bbbbbbbbbbb####aaaaaaaaaaa########aaaaaaaaaaa####aaaa###aaaa##",
+"##bbbbbbbbbbbbb####aaaaaaaa##########aaaaaaaa####aaaa######aaa##",
+"##bbbbbbbbbbbbbbb####aaaaaa##########aaaaaa####aaaaaa######aaa##",
+"##bbbbbbbbbbbbbbbbb####aaaaa########aaaaa####aaaaaaa#######aaa##",
+"##bbbbbbbbbbbbbbbbbbb####aaaaa####aaaaa####aaaaaaaaa#######aaa##",
+"##bbbbbbbbbbbbbbbbbbbbb####aaaaaaaaaa####aaaaaaaaaaa#######aaa##",
+"##bbbbbbbbbbbbbbbbbbbbbbb####aaaaaa####aaaaaaaaaaaaa######aaaa##",
+"##bbbbbbbbbbbbbbbbbbbbbbbbb####aa####aaaaaaaaaaaaaaaa####aaaaa##",
+"##bbbbbbbbbbbbbbbbbbbbbbbbbbb######aaaa###aaaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaaa######aaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaaa######aaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaa#######aaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaa#######aaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbbb###bbbbbbbbbbbbbb##aaa#######aaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbb######bbbbbbbbbbbb##aaa######aaaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbb######bbbbbbbbbbbb##aaaa####aaaaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbb#######bbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbb#######bbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbb#######bbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaa###aaaa##",
+"##bbbbbbbbbbbb######bbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaa######aaa##",
+"##bbbbbbbbbbbbb####bbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaa######aaa##",
+"##bbbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaa#######aaa##",
+"##bbbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaa#######aaa##",
+"##bbbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaa#######aaa##",
+"##bbbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaa######aaaa##",
+"###bbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaa####aaaa###",
+".####bbbbbbbbbbbbbbbbbbbbbbbbbb##aaaaaa###aaaaaaaaaaaaaaaaa####.",
+"...####bbbbbbbbbbbbbbbbbbbbbbbb##aaaa######aaaaaaaaaaaaaa####...",
+".....####bbbbbbbbbbbbbbbbbbbbbb##aaaa######aaaaaaaaaaaa####.....",
+".......####bbbbbbbbbbbbbbbbbbbb##aaa#######aaaaaaaaaa####.......",
+".........####bbbbbbbbbbbbbbbbbb##aaa#######aaaaaaaa####.........",
+"...........####bbbbbbbbbbbbbbbb##aaa#######aaaaaa####...........",
+".............####bbbbbbbbbbbbbb##aaa######aaaaa####.............",
+"...............####bbbbbbbbbbbb##aaaa####aaaa####...............",
+".................####bbbbbbbbbb##aaaaaaaaaa####.................",
+"...................####bbbbbbbb##aaaaaaaa####...................",
+".....................####bbbbbb##aaaaaa####.....................",
+".......................####bbbb##aaaa####.......................",
+".........................####bb##aa####.........................",
+"...........................##########...........................",
+"..............................####..............................",
+"................................................................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/componet_img/DICE3.xpm b/components/rx/version/v2.2_laz_1.2/images/componet_img/DICE3.xpm
new file mode 100644
index 000000000..acf2a159c
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/componet_img/DICE3.xpm
@@ -0,0 +1,71 @@
+/* XPM */
+static char *DICE3[]={
+"64 64 4 1",
+". c None",
+"# c #000000",
+"b c #c0c0c0",
+"a c #ffffff",
+"................................................................",
+".............................######.............................",
+"...........................##########...........................",
+".........................####aaaaaa####.........................",
+".......................####aaaaaaaaaa####.......................",
+".....................####aaaaa####aaaaa####.....................",
+"...................####aaaaa########aaaaa####...................",
+".................####aaaaaa##########aaaaaa####.................",
+"...............####aaaaaaaa##########aaaaaaaa####...............",
+".............####aaaaaaaaaaa########aaaaaaaaaaa####.............",
+"...........####aaaaaaaaaaaaaaa####aaaaaaaaaaaaaaa####...........",
+".........####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.........",
+".......####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.......",
+".....####aaaaaaaaaaaaaaaaaaaaa####aaaaaaaaaaaaaaaaaaaaa####.....",
+"...####aaaaaaaaaaaaaaaaaaaaa########aaaaaaaaaaaaaaaaaaaaa####...",
+".####aaaaaaaaaaaaaaaaaaaaaa##########aaaaaaaaaaaaaaaaaaaaaa####.",
+"#####aaaaaaaaaaaaaaaaaaaaaa##########aaaaaaaaaaaaaaaaaaaaaa#####",
+"##b####aaaaaaaaaaaaaaaaaaaaa########aaaaaaaaaaaaaaaaaaaaa####a##",
+"##bbb####aaaaaaaaaaaaaaaaaaaaa####aaaaaaaaaaaaaaaaaaaaa####aaa##",
+"##bbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaa##",
+"##bbbbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaaaa##",
+"##bbbbbbbbb####aaaaaaaaaaaaaaa####aaaaaaaaaaaaaaa####aaaaaaaaa##",
+"##bbbbbbbbbbb####aaaaaaaaaaa########aaaaaaaaaaa####aaaa###aaaa##",
+"##bbbbbbbbbbbbb####aaaaaaaa##########aaaaaaaa####aaaa######aaa##",
+"##bbbbbbbbbbbbbbb####aaaaaa##########aaaaaa####aaaaaa######aaa##",
+"##bbbbbbbbbbbbbbbbb####aaaaa########aaaaa####aaaaaaa#######aaa##",
+"##bbbbbbbbbbbbbbbbbbb####aaaaa####aaaaa####aaaaaaaaa#######aaa##",
+"##bbbbbbbbbbbbbbbbbbbbb####aaaaaaaaaa####aaaaaaaaaaa#######aaa##",
+"##bbbbbbbbbbbbbbbbbbbbbbb####aaaaaa####aaaaaaaaaaaaa######aaaa##",
+"##bbbbbbbbbbbbbbbbbbbbbbbbb####aa####aaaaaaaaaaaaaaaa####aaaaa##",
+"##bbbbbbbbbbbbbbbbbbbb###bbbb######aaaa###aaaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbbbbbbbbbb######bbbb##aaaa######aaaaaaaaaaaa###aaaa##",
+"##bbbbbbbbbbbbbbbbbbb######bbbb##aaaa######aaaaaaaaaa######aaa##",
+"##bbbbbbbbbbbbbbbbbbb#######bbb##aaa#######aaaaaaaaaa######aaa##",
+"##bbbbbbbbbbbbbbbbbbb#######bbb##aaa#######aaaaaaaaa#######aaa##",
+"##bbbbbbbbbbbbbbbbbbb#######bbb##aaa#######aaaaaaaaa#######aaa##",
+"##bbbbbbbbbbbbbbbbbbbb######bbb##aaa######aaaaaaaaaa#######aaa##",
+"##bbbbbbbbbbbbbbbbbbbbb####bbbb##aaaa####aaaaaaaaaaa######aaaa##",
+"##bbbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaa####aaaaa##",
+"##bbbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaaaaa###aaaaaaaaaaaaaaaaaaaa##",
+"##bbbb###bbbbbbbbbbbbbbbbbbbbbb##aaaa######aaaaaaaaaaaa###aaaa##",
+"##bbb######bbbbbbbbbbbbbbbbbbbb##aaaa######aaaaaaaaaa######aaa##",
+"##bbb######bbbbbbbbbbbbbbbbbbbb##aaa#######aaaaaaaaaa######aaa##",
+"##bbb#######bbbbbbbbbbbbbbbbbbb##aaa#######aaaaaaaaa#######aaa##",
+"##bbb#######bbbbbbbbbbbbbbbbbbb##aaa#######aaaaaaaaa#######aaa##",
+"##bbb#######bbbbbbbbbbbbbbbbbbb##aaa######aaaaaaaaaa#######aaa##",
+"##bbbb######bbbbbbbbbbbbbbbbbbb##aaaa####aaaaaaaaaaa######aaaa##",
+"###bbbb####bbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaa####aaaa###",
+".####bbbbbbbbbbbbbbbbbbbbbbbbbb##aaaaaa###aaaaaaaaaaaaaaaaa####.",
+"...####bbbbbbbbbbbbbbbbbbbbbbbb##aaaa######aaaaaaaaaaaaaa####...",
+".....####bbbbbbbbbbbbbbbbbbbbbb##aaaa######aaaaaaaaaaaa####.....",
+".......####bbbbbbbbbbbbbbbbbbbb##aaa#######aaaaaaaaaa####.......",
+".........####bbbbbbbbbbbbbbbbbb##aaa#######aaaaaaaa####.........",
+"...........####bbbbbbbbbbbbbbbb##aaa#######aaaaaa####...........",
+".............####bbbbbbbbbbbbbb##aaa######aaaaa####.............",
+"...............####bbbbbbbbbbbb##aaaa####aaaa####...............",
+".................####bbbbbbbbbb##aaaaaaaaaa####.................",
+"...................####bbbbbbbb##aaaaaaaa####...................",
+".....................####bbbbbb##aaaaaa####.....................",
+".......................####bbbb##aaaa####.......................",
+".........................####bb##aa####.........................",
+"...........................##########...........................",
+"..............................####..............................",
+"................................................................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/componet_img/DICE4.xpm b/components/rx/version/v2.2_laz_1.2/images/componet_img/DICE4.xpm
new file mode 100644
index 000000000..4a78ceb82
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/componet_img/DICE4.xpm
@@ -0,0 +1,71 @@
+/* XPM */
+static char *DICE4[]={
+"64 64 4 1",
+". c None",
+"# c #000000",
+"b c #c0c0c0",
+"a c #ffffff",
+"................................................................",
+".............................######.............................",
+"...........................##########...........................",
+".........................####aaaaaa####.........................",
+".......................####aaaaaaaaaa####.......................",
+".....................####aaaaa####aaaaa####.....................",
+"...................####aaaaa########aaaaa####...................",
+".................####aaaaaa##########aaaaaa####.................",
+"...............####aaaaaaaa##########aaaaaaaa####...............",
+".............####aaaaaaaaaaa########aaaaaaaaaaa####.............",
+"...........####aaaaaaaaaaaaaaa####aaaaaaaaaaaaaaa####...........",
+".........####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.........",
+".......####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.......",
+".....####aaaaa####aaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaa####.....",
+"...####aaaaa########aaaaaaaaaaaaaaaaaaaaaaaa########aaaaa####...",
+".####aaaaaa##########aaaaaaaaaaaaaaaaaaaaaa##########aaaaaa####.",
+"#####aaaaaa##########aaaaaaaaaaaaaaaaaaaaaa##########aaaaaa#####",
+"##b####aaaaa########aaaaaaaaaaaaaaaaaaaaaaaa########aaaaa####a##",
+"##bbb####aaaaa####aaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaa####aaa##",
+"##bbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaa##",
+"##bbbbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaaaa##",
+"##bbbbbbbbb####aaaaaaaaaaaaaaa####aaaaaaaaaaaaaaa####aaaaaaaaa##",
+"##bbbb###bbbb####aaaaaaaaaaa########aaaaaaaaaaa####aaaa###aaaa##",
+"##bbb######bbbb####aaaaaaaa##########aaaaaaaa####aaaa######aaa##",
+"##bbb######bbbbbb####aaaaaa##########aaaaaa####aaaaaa######aaa##",
+"##bbb#######bbbbbbb####aaaaa########aaaaa####aaaaaaa#######aaa##",
+"##bbb#######bbbbbbbbb####aaaaa####aaaaa####aaaaaaaaa#######aaa##",
+"##bbb#######bbbbbbbbbbb####aaaaaaaaaa####aaaaaaaaaaa#######aaa##",
+"##bbbb######bbbbbbbbbbbbb####aaaaaa####aaaaaaaaaaaaa######aaaa##",
+"##bbbbb####bbbbbbbbbbbbbbbb####aa####aaaaaaaaaaaaaaaa####aaaaa##",
+"##bbbbbbbbbbbbbbbbbbbb###bbbb######aaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbbb###bbbbbbbbbbbb######bbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbb######bbbbbbbbbb######bbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbb######bbbbbbbbbb#######bbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbb#######bbbbbbbbb#######bbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbb#######bbbbbbbbb#######bbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbb#######bbbbbbbbbb######bbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbbb######bbbbbbbbbbb####bbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbbbb####bbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbbbbbbbbbbb###bbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbbb###bbbbbbbbbbbb######bbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbb######bbbbbbbbbb######bbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbb######bbbbbbbbbb#######bbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbb#######bbbbbbbbb#######bbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbb#######bbbbbbbbb#######bbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbb#######bbbbbbbbbb######bbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbbb######bbbbbbbbbbb####bbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"###bbbb####bbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaa###",
+".####bbbbbbbbbbbbbbbbb###bbbbbb##aaaaaa###aaaaaaaaaaaaaaaaa####.",
+"...####bbbbbbbbbbbbbb######bbbb##aaaa######aaaaaaaaaaaaaa####...",
+".....####bbbbbbbbbbbb######bbbb##aaaa######aaaaaaaaaaaa####.....",
+".......####bbbbbbbbbb#######bbb##aaa#######aaaaaaaaaa####.......",
+".........####bbbbbbbb#######bbb##aaa#######aaaaaaaa####.........",
+"...........####bbbbbb#######bbb##aaa#######aaaaaa####...........",
+".............####bbbbb######bbb##aaa######aaaaa####.............",
+"...............####bbbb####bbbb##aaaa####aaaa####...............",
+".................####bbbbbbbbbb##aaaaaaaaaa####.................",
+"...................####bbbbbbbb##aaaaaaaa####...................",
+".....................####bbbbbb##aaaaaa####.....................",
+".......................####bbbb##aaaa####.......................",
+".........................####bb##aa####.........................",
+"...........................##########...........................",
+"..............................####..............................",
+"................................................................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/componet_img/DICE5.xpm b/components/rx/version/v2.2_laz_1.2/images/componet_img/DICE5.xpm
new file mode 100644
index 000000000..5a7ebd587
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/componet_img/DICE5.xpm
@@ -0,0 +1,71 @@
+/* XPM */
+static char *DICE5[]={
+"64 64 4 1",
+". c None",
+"# c #000000",
+"b c #c0c0c0",
+"a c #ffffff",
+"................................................................",
+".............................######.............................",
+"...........................##########...........................",
+".........................####aaaaaa####.........................",
+".......................####aaaaaaaaaa####.......................",
+".....................####aaaaa####aaaaa####.....................",
+"...................####aaaaa########aaaaa####...................",
+".................####aaaaaa##########aaaaaa####.................",
+"...............####aaaaaaaa##########aaaaaaaa####...............",
+".............####aaaaaaaaaaa########aaaaaaaaaaa####.............",
+"...........####aaaaaaaaaaaaaaa####aaaaaaaaaaaaaaa####...........",
+".........####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.........",
+".......####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.......",
+".....####aaaaa####aaaaaaaaaaaa####aaaaaaaaaaaa####aaaaa####.....",
+"...####aaaaa########aaaaaaaa########aaaaaaaa########aaaaa####...",
+".####aaaaaa##########aaaaaa##########aaaaaa##########aaaaaa####.",
+"#####aaaaaa##########aaaaaa##########aaaaaa##########aaaaaa#####",
+"##b####aaaaa########aaaaaaaa########aaaaaaaa########aaaaa####a##",
+"##bbb####aaaaa####aaaaaaaaaaaa####aaaaaaaaaaaa####aaaaa####aaa##",
+"##bbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaa##",
+"##bbbbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaaaa##",
+"##bbbbbbbbb####aaaaaaaaaaaaaaa####aaaaaaaaaaaaaaa####aaaaaaaaa##",
+"##bbbb###bbbb####aaaaaaaaaaa########aaaaaaaaaaa####aaaaaaaaaaa##",
+"##bbb######bbbb####aaaaaaaa##########aaaaaaaa####aaaaaaaaaaaaa##",
+"##bbb######bbbbbb####aaaaaa##########aaaaaa####aaaaaaaaaaaaaaa##",
+"##bbb#######bbbbbbb####aaaaa########aaaaa####aaaaaaaaaaaaaaaaa##",
+"##bbb#######bbbbbbbbb####aaaaa####aaaaa####aaaaaaaaaaaaaaaaaaa##",
+"##bbb#######bbbbbbbbbbb####aaaaaaaaaa####aaaaaaaaaaaaaaaaaaaaa##",
+"##bbbb######bbbbbbbbbbbbb####aaaaaa####aaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbbbb####bbbbbbbbbbbbbbbb####aa####aaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbbbbbbbbbbb###bbbb######aaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbbbbbbbbbb######bbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbbbbbbbbbb######bbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbbbbbbbbbb#######bbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbbbbbbbbbb#######bbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbbbbbbbbbb#######bbb##aaaaaaaaaaaaaa###aaaaaaaaaaaa##",
+"##bbbbbbbbbbbbbbbbbbbb######bbb##aaaaaaaaaaaa######aaaaaaaaaaa##",
+"##bbbbbbbbbbbbbbbbbbbbb####bbbb##aaaaaaaaaaaa######aaaaaaaaaaa##",
+"##bbbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaa#######aaaaaaaaaaa##",
+"##bbbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaa#######aaaaaaaaaaa##",
+"##bbbb###bbbbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaa#######aaaaaaaaaaa##",
+"##bbb######bbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaa######aaaaaaaaaaaa##",
+"##bbb######bbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaa####aaaaaaaaaaaaa##",
+"##bbb#######bbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbb#######bbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbb#######bbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbbb######bbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"###bbbb####bbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaa###",
+".####bbbbbbbbbbbbbbbbb###bbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaa####.",
+"...####bbbbbbbbbbbbbb######bbbb##aaaaaaaaaaaaaaaaaaaaaaaa####...",
+".....####bbbbbbbbbbbb######bbbb##aaaaaaaaaaaaaaaaaaaaaa####.....",
+".......####bbbbbbbbbb#######bbb##aaaaaaaaaaaaaaaaaaaa####.......",
+".........####bbbbbbbb#######bbb##aaaaaaaaaaaaaaaaaa####.........",
+"...........####bbbbbb#######bbb##aaaaaaaaaaaaaaaa####...........",
+".............####bbbbb######bbb##aaaaaaaaaaaaaa####.............",
+"...............####bbbb####bbbb##aaaaaaaaaaaa####...............",
+".................####bbbbbbbbbb##aaaaaaaaaa####.................",
+"...................####bbbbbbbb##aaaaaaaa####...................",
+".....................####bbbbbb##aaaaaa####.....................",
+".......................####bbbb##aaaa####.......................",
+".........................####bb##aa####.........................",
+"...........................##########...........................",
+"..............................####..............................",
+"................................................................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/componet_img/DICE6.xpm b/components/rx/version/v2.2_laz_1.2/images/componet_img/DICE6.xpm
new file mode 100644
index 000000000..3228e314f
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/componet_img/DICE6.xpm
@@ -0,0 +1,71 @@
+/* XPM */
+static char *DICE6[]={
+"64 64 4 1",
+". c None",
+"# c #000000",
+"b c #c0c0c0",
+"a c #ffffff",
+"................................................................",
+".............................######.............................",
+"...........................##########...........................",
+".........................####aaaaaa####.........................",
+".......................####aaaaaaaaaa####.......................",
+".....................####aaaaa####aaaaa####.....................",
+"...................####aaaaa########aaaaa####...................",
+".................####aaaaaa##########aaaaaa####.................",
+"...............####aaaaaaaa##########aaaaaaaa####...............",
+".............####aaaaaaaaaaa########aa####aaaaa####.............",
+"...........####aaaaaaaaaaaaaaa####aa########aaaaa####...........",
+".........####aaaaaaaaaaaaaaaaaaaaaa##########aaaaaa####.........",
+".......####aaaaaaaaaaaaaaaaaaaaaaaa##########aaaaaaaa####.......",
+".....####aaaaa####aaaaaaaaaaaaaaaaaa########aa####aaaaa####.....",
+"...####aaaaa########aaaaaaaaaaaaaaaaaa####aa########aaaaa####...",
+".####aaaaaa##########aaaaaaaaaaaaaaaaaaaaaa##########aaaaaa####.",
+"#####aaaaaa##########aaaaaaaaaaaaaaaaaaaaaa##########aaaaaa#####",
+"##b####aaaaa########aa####aaaaaaaaaaaaaaaaaa########aaaaa####a##",
+"##bbb####aaaaa####aa########aaaaaaaaaaaaaaaaaa####aaaaa####aaa##",
+"##bbbbb####aaaaaaaa##########aaaaaaaaaaaaaaaaaaaaaaaa####aaaaa##",
+"##bbbbbbb####aaaaaa##########aaaaaaaaaaaaaaaaaaaaaa####aaaaaaa##",
+"##bbbbbbbbb####aaaaa########aa####aaaaaaaaaaaaaaa####aaaaaaaaa##",
+"##bbbb###bbbb####aaaaa####aa########aaaaaaaaaaa####aaaa###aaaa##",
+"##bbb######bbbb####aaaaaaaa##########aaaaaaaa####aaaa######aaa##",
+"##bbb######bbbbbb####aaaaaa##########aaaaaa####aaaaaa######aaa##",
+"##bbb#######bbbbbbb####aaaaa########aaaaa####aaaaaaa#######aaa##",
+"##bbb#######bbbbbbbbb####aaaaa####aaaaa####aaaaaaaaa#######aaa##",
+"##bbb#######bbbbbbbbbbb####aaaaaaaaaa####aaaaaaaaaaa#######aaa##",
+"##bbbb######bbbbbbbbbbbbb####aaaaaa####aaaaaaaaaaaaa######aaaa##",
+"##bbbbb####bbbbbbbbbbbbbbbb####aa####aaaaaaaaaaaaaaaa####aaaaa##",
+"##bbbbbbbbbbbbbbbbbbbb###bbbb######aaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbbbbbbbbbb######bbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbbbbbbbbbb######bbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbbbbbbbbbb#######bbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbbbbbbbbbb#######bbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbbbbbbbbbbb###bbbb#######bbb##aaaaaaaaaaaaaa###aaaaaaaaaaaa##",
+"##bbbbbbbbbbb######bbb######bbb##aaaaaaaaaaaa######aaaaaaaaaaa##",
+"##bbbbbbbbbbb######bbbb####bbbb##aaaaaaaaaaaa######aaaaaaaaaaa##",
+"##bbbbbbbbbbb#######bbbbbbbbbbb##aaaaaaaaaaa#######aaaaaaaaaaa##",
+"##bbbbbbbbbbb#######bbbbbbbbbbb##aaaaaaaaaaa#######aaaaaaaaaaa##",
+"##bbbb###bbbb#######bbbbbbbbbbb##aaaaaaaaaaa#######aaaaaaaaaaa##",
+"##bbb######bbb######bbbbbbbbbbb##aaaaaaaaaaa######aaaaaaaaaaaa##",
+"##bbb######bbbb####bbbbbbbbbbbb##aaaaaaaaaaaa####aaaaaaaaaaaaa##",
+"##bbb#######bbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbb#######bbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbb#######bbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"##bbbb######bbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##",
+"###bbbb####bbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaa###",
+".####bbbbbbbbbbbbbbbbb###bbbbbb##aaaaaa###aaaaaaaaaaaaaaaaa####.",
+"...####bbbbbbbbbbbbbb######bbbb##aaaa######aaaaaaaaaaaaaa####...",
+".....####bbbbbbbbbbbb######bbbb##aaaa######aaaaaaaaaaaa####.....",
+".......####bbbbbbbbbb#######bbb##aaa#######aaaaaaaaaa####.......",
+".........####bbbbbbbb#######bbb##aaa#######aaaaaaaa####.........",
+"...........####bbbbbb#######bbb##aaa#######aaaaaa####...........",
+".............####bbbbb######bbb##aaa######aaaaa####.............",
+"...............####bbbb####bbbb##aaaa####aaaa####...............",
+".................####bbbbbbbbbb##aaaaaaaaaa####.................",
+"...................####bbbbbbbb##aaaaaaaa####...................",
+".....................####bbbbbb##aaaaaa####.....................",
+".......................####bbbb##aaaa####.......................",
+".........................####bb##aa####.........................",
+"...........................##########...........................",
+"..............................####..............................",
+"................................................................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/componet_img/RXSWITCH_OFF.xpm b/components/rx/version/v2.2_laz_1.2/images/componet_img/RXSWITCH_OFF.xpm
new file mode 100644
index 000000000..72d626919
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/componet_img/RXSWITCH_OFF.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *RXSWITCH_OFF[]={
+"32 48 4 1",
+". c None",
+"# c #000000",
+"b c #808080",
+"a c #ffffff",
+"................................",
+"................................",
+"................................",
+"................................",
+"....########################....",
+"....#aaaaaaaaaaaaaaaaaaaaaa#....",
+"....#a####################a#....",
+"....#a####################a#....",
+"....#a##aaaaaaaaaaaaaaa#b#a#....",
+"....#a#################bb#a#....",
+"....#a#aaaaaaaaaaaaaaa#bb#a#....",
+"....#a#aaaaaaaaaaaaaaa#bb#a#....",
+"....#a#aaaaaaaaaaaaaaa#bb#a#....",
+"....#a#aaaaaaaaaaaaaaa#bb#a#....",
+"....#a#aaaaaaaaaaaaaaa#bb#a#....",
+"....#a#aaaaaaaaaaaaaaa#bb#a#....",
+"....#a#aaaaaaaaaaaaaaa#bb#a#....",
+"....#a#aaaaaaaaaaaaaaa#bb#a#....",
+"....#a#aaaaaaaaaaaaaaa#bb#a#....",
+"....#a#aaaaaaaaaaaaaaa#bb#a#....",
+"....#a#aaaaaaaaaaaaaaa#bb#a#....",
+"....#a#aaaaaaaaaaaaaaa#bb#a#....",
+"....#a#################bb#a#....",
+"....#a#aaaaaaaaaaaaaaa#bb#a#....",
+"....#a#aaaaaaaaaaaaaaa#bb#a#....",
+"....##aaa#########aaa#bbb#a#....",
+"....##aa#aaaaaaaa#aaa#bbb#a#....",
+"....#aaa#aaaaaaa#aaa#bbbb#a#....",
+"....#aa#aaaaaaaa#aaa#bbbb#a#....",
+"...#aaa#########aaa#bbbbb#a#....",
+"...#aaaaaaaaaaaaaaa#bbbbb#a#....",
+"..#aaaaaaaaaaaaaaa#bbbbbb#a#....",
+"..#################bbbbbb#a#....",
+"..#aaaaaaaaaaaaaaa#bbbbbb#a#....",
+"...#aaaaaaaaaaaaaaa#bbbbb#a#....",
+"....#aaaaaaaaaaaaaaa#bbbb#a#....",
+"....##aaaaaaaaaaaaaaa#bbb#a#....",
+"....#a#aaaaaaaaaaaaaaa#bb#a#....",
+"....#a##aaaaaaaaaaaaaaa#b#a#....",
+"....#a####################a#....",
+"....#a####################a#....",
+"....#aaaaaaaaaaaaaaaaaaaaaa#....",
+"....########################....",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/componet_img/RXSWITCH_ON.xpm b/components/rx/version/v2.2_laz_1.2/images/componet_img/RXSWITCH_ON.xpm
new file mode 100644
index 000000000..a7c1d1854
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/componet_img/RXSWITCH_ON.xpm
@@ -0,0 +1,56 @@
+/* XPM */
+static char *RXSWITCH_ON[]={
+"32 48 5 1",
+". c None",
+"# c #000000",
+"b c #808080",
+"c c #ff0000",
+"a c #ffffff",
+"................................",
+"................................",
+"................................",
+"................................",
+"....########################....",
+"....#aaaaaaaaaaaaaaaaaaaaaa#....",
+"....#a####################a#....",
+"....#a####################a#....",
+"....#a##aaaaaaaaaaaaaaa#b#a#....",
+"....#a#aaaaaaaaaaaaaaa#bb#a#....",
+"....##aaaaaaaaaaaaaaa#bbb#a#....",
+"....#aaaaaaaaaaaaaaa#bbbb#a#....",
+"...#aaaaaaaaaaaaaaa#bbbbb#a#....",
+"..#aaaaaaaaaaaaaaa#bbbbbb#a#....",
+"..#################bbbbbb#a#....",
+"..#aaaaaaaaaaaaaaa#bbbbbb#a#....",
+"...#aaaaaaaaaaaaaaa#bbbbb#a#....",
+"...#aaaaaaaaaaaaaaa#bbbbb#a#....",
+"....#aaaaaaaaaaaaaaa#bbbb#a#....",
+"....#aaaaaaaaaaaaaaa#bbbb#a#....",
+"....##aaaaaaaaaaaaaaa#bbb#a#....",
+"....##aaaaaaaaaaaaaaa#bbb#a#....",
+"....#a#aaaaaaaaaaaaaaa#bb#a#....",
+"....#a#aaaaaaaaaaaaaaa#bb#a#....",
+"....#a#################bb#a#....",
+"....#a#aaaaaaaaaaaaaaa#bb#a#....",
+"....#a#aaaaaaaaaaaaaaa#bb#a#....",
+"....#a#aaaaaaaaaaaaaaa#bb#a#....",
+"....#a#aaa#########aaa#bb#a#....",
+"....#a#aaa#ccccccc#aaa#bb#a#....",
+"....#a#aaa#ccccccc#aaa#bb#a#....",
+"....#a#aaa#ccccccc#aaa#bb#a#....",
+"....#a#aaa#ccccccc#aaa#bb#a#....",
+"....#a#aaa#########aaa#bb#a#....",
+"....#a#aaaaaaaaaaaaaaa#bb#a#....",
+"....#a#aaaaaaaaaaaaaaa#bb#a#....",
+"....#a#aaaaaaaaaaaaaaa#bb#a#....",
+"....#a#################bb#a#....",
+"....#a#bbbbbbbbbbbbbbbb#b#a#....",
+"....#a##bbbbbbbbbbbbbbbb##a#....",
+"....#a####################a#....",
+"....#aaaaaaaaaaaaaaaaaaaaaa#....",
+"....########################....",
+"................................",
+"................................",
+"................................",
+"................................",
+"................................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/componet_img/all_component_res.bat b/components/rx/version/v2.2_laz_1.2/images/componet_img/all_component_res.bat
new file mode 100644
index 000000000..310bc11c5
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/componet_img/all_component_res.bat
@@ -0,0 +1,8 @@
+del tooledit.lrs
+del rxdbgrid.lrs
+
+..\..\..\..\tools\lazres.exe tooledit.lrs picDateEdit.png
+..\..\..\..\tools\lazres.exe rxdbgrid.lrs rx_markerdown.png rx_markerup.png
+
+..\..\..\..\tools\lazres.exe tooledit.res picDateEdit.png
+..\..\..\..\tools\lazres.exe rxdbgrid.res rx_markerdown.png rx_markerup.png
diff --git a/components/rx/version/v2.2_laz_1.2/images/componet_img/all_component_res.sh b/components/rx/version/v2.2_laz_1.2/images/componet_img/all_component_res.sh
new file mode 100644
index 000000000..51b0f5a3c
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/componet_img/all_component_res.sh
@@ -0,0 +1,10 @@
+rm tooledit.lrs
+rm rxdbgrid.lrs
+rm tooledit.res
+rm rxdbgrid.res
+
+/usr/local/share/lazarus/tools/lazres rxdbgrid.res rx_markerdown.png rx_markerup.png
+/usr/local/share/lazarus/tools/lazres rx_lcl.res picDateEdit.png rxbtn_downarrow.png
+
+#../../../../tools\lazres.exe tooledit.lrs picDateEdit.bmp
+#../../../../tools\lazres.exe rxdbgrid.lrs rx_markerdown.xpm rx_markerup.xpm
diff --git a/components/rx/version/v2.2_laz_1.2/images/componet_img/picDateEdit.png b/components/rx/version/v2.2_laz_1.2/images/componet_img/picDateEdit.png
new file mode 100644
index 000000000..de59f5efa
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/componet_img/picDateEdit.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/componet_img/rx_lcl.res b/components/rx/version/v2.2_laz_1.2/images/componet_img/rx_lcl.res
new file mode 100644
index 000000000..7034a20a6
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/componet_img/rx_lcl.res differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/componet_img/rx_markerdown.png b/components/rx/version/v2.2_laz_1.2/images/componet_img/rx_markerdown.png
new file mode 100644
index 000000000..3e07cf6c3
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/componet_img/rx_markerdown.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/componet_img/rx_markerup.png b/components/rx/version/v2.2_laz_1.2/images/componet_img/rx_markerup.png
new file mode 100644
index 000000000..64f683e3b
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/componet_img/rx_markerup.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/componet_img/rxbtn_downarrow.png b/components/rx/version/v2.2_laz_1.2/images/componet_img/rxbtn_downarrow.png
new file mode 100644
index 000000000..e534f8aed
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/componet_img/rxbtn_downarrow.png differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/mk_res.bat b/components/rx/version/v2.2_laz_1.2/images/mk_res.bat
new file mode 100644
index 000000000..923e0f17c
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/mk_res.bat
@@ -0,0 +1,2 @@
+del rx.lrs
+c:\lazarus\tools\lazres.exe rx.lrs TDBDateEdit.xpm TRXLookUpEdit.xpm TRxDBCalcEdit.xpm TRxDBLookupCombo.xpm TRxDBGrid.xpm TDualListDialog.xpm TFolderLister.xpm TRxMemoryData.xpm TCURRENCYEDIT.xpm TRXSWITCH.xpm TRXDICE.xpm TRXDBCOMBOBOX.xpm ttoolpanel.xpm trxxpmanifest.xpm TPAGEMANAGER.xpm TRXAPPICON.xpm TSECRETPANEL.xpm TRXLABEL.xpm tautopanel.xpm TRxCalendarGrid.xpm TRxDateEdit.png TRxClock.png TRxSpeedButton.png TRxSpinButton.png TRxSpinEdit.png TRXDBSpinEdit.png TRxTimeEdit.png TRxDBTimeEdit.png TRxDBProgressBar.png TRxDBTrackBar.png TRxLoginDialog.png TRxVersionInfo.png TRxAboutDialog.png TRxDBCurrEdit.png TRxViewsPanel.png TRxDBColorBox.png TRxRadioGroup.png TRxDBRadioGroup.png TRxHistoryNavigator.png TRxCloseFormValidator.png
diff --git a/components/rx/version/v2.2_laz_1.2/images/mk_res.sh b/components/rx/version/v2.2_laz_1.2/images/mk_res.sh
new file mode 100755
index 000000000..ee3835e1c
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/mk_res.sh
@@ -0,0 +1,2 @@
+rm rx.lrs
+/usr/local/share/lazarus/tools/lazres rx.lrs TDBDateEdit.xpm TRXLookUpEdit.xpm TRxDBCalcEdit.xpm TRxDBLookupCombo.xpm TRxDBGrid.xpm TDualListDialog.xpm TFolderLister.xpm TRxMemoryData.xpm TCURRENCYEDIT.xpm TRXSWITCH.xpm TRXDICE.xpm TRXDBCOMBOBOX.xpm ttoolpanel.xpm trxxpmanifest.xpm TPAGEMANAGER.xpm TRXAPPICON.xpm TSECRETPANEL.xpm TRXLABEL.xpm tautopanel.xpm TRxCalendarGrid.xpm TRxDateEdit.png TRxClock.png TRxSpeedButton.png TRxSpinButton.png TRxSpinEdit.png TRXDBSpinEdit.png TRxTimeEdit.png TRxDBTimeEdit.png TRxDBProgressBar.png TRxDBTrackBar.png TRxLoginDialog.png TRxVersionInfo.png TRxAboutDialog.png TRxDBCurrEdit.png TRxViewsPanel.png TRxDBColorBox.png TRxRadioGroup.png TRxDBRadioGroup.png TRxHistoryNavigator.png TRxCloseFormValidator.png TRxIniPropStorage.png
\ No newline at end of file
diff --git a/components/rx/version/v2.2_laz_1.2/images/mk_res_exp_spreadsheet.sh b/components/rx/version/v2.2_laz_1.2/images/mk_res_exp_spreadsheet.sh
new file mode 100755
index 000000000..4dbb802f5
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/mk_res_exp_spreadsheet.sh
@@ -0,0 +1,2 @@
+rm rxdbgridexportspreadsheet.res
+/usr/local/share/lazarus/tools/lazres rxdbgridexportspreadsheet.res TRxDBGridExportSpreadSheet.png
diff --git a/components/rx/version/v2.2_laz_1.2/images/mk_res_printrxdbgrid.sh b/components/rx/version/v2.2_laz_1.2/images/mk_res_printrxdbgrid.sh
new file mode 100755
index 000000000..01249eae4
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/mk_res_printrxdbgrid.sh
@@ -0,0 +1,2 @@
+rm ../rxdbgridprintgrid.res
+/usr/local/share/lazarus/tools/lazres ../rxdbgridprintgrid.res TRxDBGridPrint.png
diff --git a/components/rx/version/v2.2_laz_1.2/images/next1.xpm b/components/rx/version/v2.2_laz_1.2/images/next1.xpm
new file mode 100644
index 000000000..22c69dcf9
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/next1.xpm
@@ -0,0 +1,11 @@
+/* XPM */
+static char *next1[]={
+"8 6 2 1",
+". c None",
+"# c #000000",
+"...#....",
+"...##...",
+"...###..",
+"...###..",
+"...##...",
+"...#...."};
diff --git a/components/rx/version/v2.2_laz_1.2/images/next2.xpm b/components/rx/version/v2.2_laz_1.2/images/next2.xpm
new file mode 100644
index 000000000..f0546c314
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/next2.xpm
@@ -0,0 +1,11 @@
+/* XPM */
+static char *next2[]={
+"8 6 2 1",
+". c None",
+"# c #000000",
+".#...#..",
+".##..##.",
+".###.###",
+".###.###",
+".##..##.",
+".#...#.."};
diff --git a/components/rx/version/v2.2_laz_1.2/images/prev1.xpm b/components/rx/version/v2.2_laz_1.2/images/prev1.xpm
new file mode 100644
index 000000000..fd077995b
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/prev1.xpm
@@ -0,0 +1,11 @@
+/* XPM */
+static char *prev1[]={
+"8 6 2 1",
+". c None",
+"# c #000000",
+"....#...",
+"...##...",
+"..###...",
+"..###...",
+"...##...",
+"....#..."};
diff --git a/components/rx/version/v2.2_laz_1.2/images/prev2.xpm b/components/rx/version/v2.2_laz_1.2/images/prev2.xpm
new file mode 100644
index 000000000..d53b7076c
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/prev2.xpm
@@ -0,0 +1,11 @@
+/* XPM */
+static char *prev2[]={
+"8 6 2 1",
+". c None",
+"# c #000000",
+"..#...#.",
+".##..##.",
+"###.###.",
+"###.###.",
+".##..##.",
+"..#...#."};
diff --git a/components/rx/version/v2.2_laz_1.2/images/rx.lrs b/components/rx/version/v2.2_laz_1.2/images/rx.lrs
new file mode 100644
index 000000000..8cca9dd79
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/rx.lrs
@@ -0,0 +1,785 @@
+LazarusResources.Add('TDBDateEdit','XPM',[
+ '/* XPM */'#10'static char *TDBDateEdit[]={'#10'"18 18 8 1",'#10'"# c None",'
+ +#10'"e c #000000",'#10'"c c #000080",'#10'"d c #0000ff",'#10'"f c #800000",'
+ +#10'". c #808080",'#10'"a c #c0c0c0",'#10'"b c #ffffff",'#10'"..............'
+ +'.###",'#10'".a.baaaabaaaaa.###",'#10'"...............###",'#10'".a.bbbbabbb'
+ +'bbb.###",'#10'".b.baababaaaab.###",'#10'".a.bbcccccccccccc#",'#10'".b.bacdd'
+ +'dcdddcddce",'#10'".a.bbcccccccccccce",'#10'".b.bacbbbbbbbbbbce",'#10'".a.bb'
+ +'cbbfbbffffbce",'#10'".....cbffbbfbbbbce",'#10'"#####cbbfbbfffabce",'#10'"##'
+ +'###cbbfbbbbbfbce",'#10'"#####cbbfbbabafbce",'#10'"#####cbfffbfffabce",'#10
+ +'"#####cbbbbbbbbbbce",'#10'"#####cccccccccccce",'#10'"######eeeeeeeeeeee"};'
+ +#10
+]);
+LazarusResources.Add('TRXLookUpEdit','XPM',[
+ '/* XPM */'#10'static char *TRXLookUpEdit[]={'#10'"24 24 7 1",'#10'". c None"'
+ +','#10'"# c #000000",'#10'"e c #800000",'#10'"c c #808080",'#10'"d c #c0c0c0'
+ +'",'#10'"b c #ff0000",'#10'"a c #ffffff",'#10'"..##....................",'#10
+ +'".#aa#b..ccccccccccccccc.",'#10'"#daaa#b.cdcaddddadddddc.",'#10'"#ddaaa#.cc'
+ +'ccccccccccccc.",'#10'".#ddaaa##dcaaaadaaaaaac.",'#10'"..#ddaaaa###ddadadddd'
+ +'ac.",'#10'"...#ddaabbbb#aadaaaaaac.",'#10'"....#ddebbb#ddadadddaac.",'#10'"'
+ +'....#ceeeb#aaaadaaaaaac.",'#10'".....#eec#caddadaddddac.",'#10'".....#ec#dc'
+ +'aaaadaaaaaac.",'#10'".....#e#ccccccccccccccc.",'#10'"......#...............'
+ +'..",'#10'"..ccccccccccccccccccccc.",'#10'"..c###################a.",'#10'".'
+ +'.c#aaaaaaaaaadaaaaaada.",'#10'"..c#aaaaaaaaaadaddddcda.",'#10'"..c#aaaaaaaa'
+ +'aadad##dcda.",'#10'"..c#aaaaaaaaaadaddddcda.",'#10'"..c#aaaaaaaaaadacccccda'
+ +'.",'#10'"..c#dddddddddddddddddda.",'#10'"..caaaaaaaaaaaaaaaaaaaa.",'#10'"..'
+ +'......................",'#10'"........................"};'#10
+]);
+LazarusResources.Add('TRxDBCalcEdit','XPM',[
+ '/* XPM */'#10'static char *TRxDBCalcEdit_xpm[]={'#10'"18 18 8 1",'#10'"# c N'
+ +'one",'#10'"e c #000000",'#10'"f c #000080",'#10'"c c #008080",'#10'"d c #00'
+ +'ffff",'#10'". c #808080",'#10'"a c #c0c0c0",'#10'"b c #ffffff",'#10'"......'
+ +'.........###",'#10'".a.baaaabaaaaa.###",'#10'"...............###",'#10'".a.'
+ +'bbbbabbbbbb.###",'#10'".b.baababaaaab.###",'#10'".a.bbbbabbbbbb.###",'#10'"'
+ +'.bbcccccccccccccc#",'#10'".acbdbdbdbdbdbdbce",'#10'".bcdeeeeeeeeccccfe",'#10
+ +'".acbebbbbbbaccccfe",'#10'"..cdeaaaaaaaccccfe",'#10'"##cbccccccccccccfe",'
+ +#10'"##cdcebebebebebefe",'#10'"##cbccccccccccccfe",'#10'"##cdcebebebebbaefe"'
+ +','#10'"##cbccccccccccccfe",'#10'"##ccfffffffffffffe",'#10'"###eeeeeeeeeeeee'
+ +'e#"};'#10
+]);
+LazarusResources.Add('TRxDBLookupCombo','XPM',[
+ '/* XPM */'#10'static char *TRxDBLookupCombo[]={'#10'"24 24 8 1",'#10'". c No'
+ +'ne",'#10'"# c #000000",'#10'"c c #000080",'#10'"e c #800000",'#10'"f c #808'
+ +'080",'#10'"d c #c0c0c0",'#10'"b c #ff0000",'#10'"a c #ffffff",'#10'"..##...'
+ +'.................",'#10'".#aa#b.........c........",'#10'"#daaa#b.......cc..'
+ +'......",'#10'"#ddaaa#......cccccccc...",'#10'".#ddaaa##.....cc.....c..",'#10
+ +'"..#ddaaaa###...c.....c..",'#10'"...#ddaabbbb#........c..",'#10'"....#ddebb'
+ +'b#.........c..",'#10'"..c.#feeeb#d###########.",'#10'"..c..#eef#daaaaaaa#aa'
+ +'d#.",'#10'"..c..#ef#dccccccca#a#d#.",'#10'"..c..#e#daaaaaaaaa#ddd#.",'#10'"'
+ +'..c...#.###############.",'#10'"..c.....#aaaaaaaaaaaaa#.",'#10'"..c.....#ac'
+ +'ccccccccaaa#.",'#10'"..c.c...#ccccccccccccc#.",'#10'"..c.cc..#caaaaaaaaaacc'
+ +'#.",'#10'"...cccc.#ccccccccccccc#.",'#10'"....cc..#acccccccccaaa#.",'#10'".'
+ +'...c...#aaaaaaaaaaaaa#.",'#10'"........#accccccccccaa#.",'#10'"........#aaa'
+ +'aaaaaaaaaa#.",'#10'"........###############.",'#10'".......................'
+ +'."};'#10
+]);
+LazarusResources.Add('TRxDBGrid','XPM',[
+ '/* XPM */'#10'static char *TRxDBGrid[]={'#10'"24 24 10 1",'#10'". c None",'
+ +#10'"c c #000000",'#10'"f c #008000",'#10'"e c #00ffff",'#10'"g c #800080",'
+ +#10'"# c #808080",'#10'"a c #c0c0c0",'#10'"d c #ff0000",'#10'"h c #ff00ff",'
+ +#10'"b c #ffffff",'#10'"........................",'#10'".###############....'
+ +'....",'#10'".#a#baaaabaaaaa#........",'#10'".###############........",'#10
+ +'".#a#bbbbabbbbbb#........",'#10'".#b#baababaaaab#........",'#10'".#a#bbbbab'
+ +'bbbbb#........",'#10'".#b#baababaaabb#........",'#10'".#a#bbbbabbbbbb#.....'
+ +'...",'#10'".#b#baababaaaab#........",'#10'".#a#bcccccccccccccccccc.",'#10'"'
+ +'.####cacbaaaaabaaaaaaac.",'#10'".....cccccccccccccccccc.",'#10'".....cacbbb'
+ +'bbabbbbbbbbc.",'#10'".....cbcaaaaaaaaaaaaaac.",'#10'".....cacbbbbbabbbbbbbb'
+ +'c.",'#10'".....ccccdddddddddddddc.",'#10'".....cbebcbbbabbbbbbbbc.",'#10'".'
+ +'cccccebecddddddddddddc.",'#10'".cfffcbebccbbabbbbbbbbc.",'#10'".cfffcccccgc'
+ +'aaaaaaaaaac.",'#10'".cfffcbcbchgcabbbbbbbbc.",'#10'".cccccccccghgcccccccccc'
+ +'.",'#10'".........cccccc........."};'#10
+]);
+LazarusResources.Add('TDualListDialog','XPM',[
+ '/* XPM */'#10'static char *TDualListDialog[]={'#10'"24 24 7 1",'#10'". c Non'
+ +'e",'#10'"b c #000000",'#10'"e c #000080",'#10'"c c #0000ff",'#10'"# c #8080'
+ +'80",'#10'"d c #c0c0c0",'#10'"a c #ffffff",'#10'"........................",'
+ +#10'"........................",'#10'".######################.",'#10'".#abccc'
+ +'cccccccccccbabab.",'#10'".#bbbbbbbbbbbbbbbbbbbbb.",'#10'".#dadadadadadadada'
+ +'dadab.",'#10'".#adadadadadadadadadadb.",'#10'".#dbbbbadad#dadbbbbadab.",'#10
+ +'".#abaabbadab#dabaabbadb.",'#10'".#dbaabdbadbb#dbaabdbab.",'#10'".#abaabbbd'
+ +'abbdabaabbbdb.",'#10'".#dbaaaabadbdadbaaaabab.",'#10'".#abaeeabdadadabaeeab'
+ +'db.",'#10'".#dbaaaabadabadbaaaabab.",'#10'".#abaeeabdabbdabaeeabdb.",'#10'"'
+ +'.#dbaaaaba#bbadbaaaabab.",'#10'".#abaaaabda#bdabaaaabdb.",'#10'".#dbbbbbbad'
+ +'a#adbbbbbbab.",'#10'".#adadadadadadadadadadb.",'#10'".#dadadadadadadadadada'
+ +'b.",'#10'".#adadadadadadadadadadb.",'#10'".#bbbbbbbbbbbbbbbbbbbbb.",'#10'".'
+ +'.......................",'#10'"........................"};'#10
+]);
+LazarusResources.Add('TFolderLister','XPM',[
+ '/* XPM */'#10'static char *TFolderLister[]={'#10'"24 24 8 1",'#10'". c None"'
+ +','#10'"a c #000000",'#10'"c c #808080",'#10'"# c #848484",'#10'"f c #c0c0c0'
+ +'",'#10'"e c #c6c6c6",'#10'"b c #ffff00",'#10'"d c #ffffff",'#10'"....#a#...'
+ +'..............",'#10'".#a#aba#a#..............",'#10'".ab#aba#ba...ccc.....'
+ +'...",'#10'".##bbbbb##..cdddcc......",'#10'"#aab#a#baa#cddddddcc....",'#10'"'
+ +'abbbadabbbaddddddddda...",'#10'"#aab#a#baa#dddddddda....",'#10'"a##bbbbb##a'
+ +'ddddddda.....",'#10'"eab#aba#baeddddddadcc...",'#10'".#a#aba#a#dddddddaddda'
+ +'..",'#10'"....#a#dddddddddaddda...",'#10'"....cdfbaaddddddadda....",'#10'".'
+ +'...cdbfbfaadddadda.....",'#10'"....cdfbfcddaadadda.....",'#10'"...ccccccccc'
+ +'ccccdaa.....",'#10'"...cddddddddddcadaa.....",'#10'"...cdfbfbfbfbfbacca....'
+ +'.",'#10'"....cdfbfbfbfbfcaca.....",'#10'"....cdbfbfbfbfbfaca.....",'#10'"..'
+ +'...cdbfbfbfbfbcaa.....",'#10'".....ccccccccccccaa.....",'#10'"......aaaaaaa'
+ +'aaaaaa.....",'#10'"........................",'#10'"........................'
+ +'"};'#10
+]);
+LazarusResources.Add('TRxMemoryData','XPM',[
+ '/* XPM */'#10'static char *TRxMemoryData[]={'#10'"24 24 6 1",'#10'". c None"'
+ +','#10'"# c #000000",'#10'"c c #000080",'#10'"d c #808080",'#10'"a c #c0c0c0'
+ +'",'#10'"b c #ffffff",'#10'"........................",'#10'"################'
+ +'####....",'#10'"#a#baaaaaabaaaaaaaa#....",'#10'"####################....",'
+ +#10'"#a#bbbbbbabbbbbbbbb#....",'#10'"#b#bccccbabcccccccb#....",'#10'"#a#bbbb'
+ +'bbabbbbbbbbb#....",'#10'"#b#bccccbabccccccbb#....",'#10'"#a#bbbbbbabbbbbbbb'
+ +'b#....",'#10'"#b#bccccbabccccccbb#....",'#10'"#a#bbbbbbabbbbbbb###....",'#10
+ +'"#b#bccccbabcbbb#daa#....",'#10'"#a#bbbbbbabbb#daaaaa#...",'#10'"#b#bccccba'
+ +'b#daaaaaaaa#..",'#10'"#a#bbbbbb#daaaaaaaaaad#.",'#10'"#b#bcccbdaaaaaaaaaadd'
+ +'d#.",'#10'"#a#bbbbdbaaaaaaaaddd#a#.",'#10'"########abaaaaaddd#ad#..",'#10'"'
+ +'........#dbaaddd#ad#.#..",'#10'".........#dbdd#ad#.#....",'#10'"..........#'
+ +'a#ad#.#......",'#10'"...........#d#.#........",'#10'".............#........'
+ +'..",'#10'"........................"};'#10
+]);
+LazarusResources.Add('TCURRENCYEDIT','XPM',[
+ '/* XPM */'#10'static char *TCURRENCYEDIT[]={'#10'"24 24 6 1",'#10'". c None"'
+ +','#10'"a c #000000",'#10'"d c #0000ff",'#10'"# c #808080",'#10'"c c #c0c0c0'
+ +'",'#10'"b c #ffffff",'#10'"........................",'#10'"................'
+ +'........",'#10'"........................",'#10'"........................",'
+ +#10'"#######################.",'#10'"#aaaaaaaaaaaaaaaaaaaaab.",'#10'"#abbbbb'
+ +'bbbbbbbbbbbbbbcb.",'#10'"#abbbbbbbbbbbbbaabaabcb.",'#10'"#abbbbbbbbbbbbbbba'
+ +'bbbcb.",'#10'"#abbbbdbbbbbdbbbbabbbcb.",'#10'"#abbbddddbbddbbbbabbbcb.",'#10
+ +'"#abbdbdbbbbbdbbbbabbbcb.",'#10'"#abbbdddbbbbdbbbbabbbcb.",'#10'"#abbbbdbdb'
+ +'bbdbbbbabbbcb.",'#10'"#abbddddbbbbdbbbbabbbcb.",'#10'"#abbbbdbbbbdddbbbabbb'
+ +'cb.",'#10'"#abbbbbbbbbbbbbaabaabcb.",'#10'"#abbbbbbbbbbbbbbbbbbbcb.",'#10'"'
+ +'#accccccccccccccccccccb.",'#10'"#bbbbbbbbbbbbbbbbbbbbbb.",'#10'"...........'
+ +'.............",'#10'"........................",'#10'"......................'
+ +'..",'#10'"........................"};'#10
+]);
+LazarusResources.Add('TRXSWITCH','XPM',[
+ '/* XPM */'#10'static char *TRXSWITCH[]={'#10'"24 24 5 1",'#10'". c None",'#10
+ +'"# c #000000",'#10'"b c #808080",'#10'"c c #ff0000",'#10'"a c #ffffff",'#10
+ +'"........................",'#10'"........................",'#10'".....#####'
+ +'#########.....",'#10'".....##############.....",'#10'".....###aaaaaaa#b##..'
+ +'...",'#10'".....##aaaaaaa#bb##.....",'#10'".....#aaaaaaa#bbb##.....",'#10'"'
+ +'.....#########bbb##.....",'#10'".....#aaaaaaa#bbb##.....",'#10'".....#aaaaa'
+ +'aaa#bb##.....",'#10'".....##aaaaaaa#bb##.....",'#10'".....##aaaaaaaa#b##...'
+ +'..",'#10'".....###########b##.....",'#10'".....##aaaaaaaa#b##.....",'#10'".'
+ +'....##a######a#b##.....",'#10'".....##a#cccc#a#b##.....",'#10'".....##a####'
+ +'##a#b##.....",'#10'".....##aaaaaaaa#b##.....",'#10'".....###########b##....'
+ +'.",'#10'".....###bbbbbbbb###.....",'#10'".....##############.....",'#10'"..'
+ +'...##############.....",'#10'"........................",'#10'".............'
+ +'..........."};'#10
+]);
+LazarusResources.Add('TRXDICE','XPM',[
+ '/* XPM */'#10'static char *TRXDICE[]={'#10'"24 24 4 1",'#10'". c None",'#10
+ +'"# c #000000",'#10'"b c #c0c0c0",'#10'"a c #ffffff",'#10'".................'
+ +'.......",'#10'"........................",'#10'"........................",'
+ +#10'"...........##...........",'#10'".........##aa##.........",'#10'".......'
+ +'##aa##aa##.......",'#10'".....##aaaa##aaaa##.....",'#10'"...##aaaaaaaaaaaaa'
+ +'a##...",'#10'"...#b##aaaa##aaaa##a#...",'#10'"...#bbb##aa##aa##aaa#...",'#10
+ +'"...#bbbbb##aa##aa##a#...",'#10'"...#bbbbbbb##aaaa##a#...",'#10'"...#bbbbbb'
+ +'b#a##aaaaa#...",'#10'"...#bbb##bb#a##aaaaa#...",'#10'"...#bbb##bb#aaaaaaaa#'
+ +'...",'#10'"...#bbbbbbb#aaaaa##a#...",'#10'"...#bbbbbbb#aaaaa##a#...",'#10'"'
+ +'...##bbbbbb#a##aaaa##...",'#10'".....##bbbb#a##aa##.....",'#10'".......##bb'
+ +'#aaa##.......",'#10'".........###a##.........",'#10'"...........##.........'
+ +'..",'#10'"........................",'#10'"........................"};'#10
+]);
+LazarusResources.Add('TRXDBCOMBOBOX','XPM',[
+ '/* XPM */'#10'static char *TRXDBCOMBOBOX[]={'#10'"24 24 6 1",'#10'". c None"'
+ +','#10'"c c #000000",'#10'"d c #000080",'#10'"# c #808080",'#10'"a c #c0c0c0'
+ +'",'#10'"b c #ffffff",'#10'"........................",'#10'".###############'
+ +'........",'#10'".#a#baaaabaaaaa#........",'#10'".###############........",'
+ +#10'".#a#bbbbabbbbbb#........",'#10'".#b#baababaaaab#........",'#10'".#a#bbb'
+ +'babbbbbb#........",'#10'".#b#baababaaabb#........",'#10'".#a#bbcccccccccccc'
+ +'ccccc.",'#10'".#b#bacbbbbbbbbbbbcbbac.",'#10'".#a#bbcbdddddddddbcbcac.",'#10
+ +'".#####cbbbbbbbbbbbcaaac.",'#10'"......ccccccccccccccccc.",'#10'"...d....cb'
+ +'bbbbbbbbbbbbc.",'#10'"..ddd...cbbddddddddbbbc.",'#10'".ddddd..cdddddddddddd'
+ +'dc.",'#10'"...d....cddbbbbbbbbbddc.",'#10'"...d....cdddddddddddddc.",'#10'"'
+ +'...d....cbbddddddddbbbc.",'#10'"...d....cbbbbbbbbbbbbbc.",'#10'"...dddd.cbb'
+ +'dddddddddbbc.",'#10'"........cbbbbbbbbbbbbbc.",'#10'"........cccccccccccccc'
+ +'c.",'#10'"........................"};'#10
+]);
+LazarusResources.Add('ttoolpanel','XPM',[
+ '/* XPM */'#10'static char *TToolPanel[]={'#10'"24 24 10 1",'#10'". c None",'
+ +#10'"# c #000000",'#10'"h c #000080",'#10'"d c #0000ff",'#10'"f c #008000",'
+ +#10'"b c #808080",'#10'"c c #c0c0c0",'#10'"e c #ff0000",'#10'"g c #ff00ff",'
+ +#10'"a c #ffffff",'#10'"........................",'#10'"####################'
+ +'####",'#10'"aaaaab#aaaaab#aaaaab#ccc",'#10'"accccb#accccb#accccb#ccc",'#10
+ +'"adeecb#afffcb#a#eecb#ccc",'#10'"adddcb#afggcb#ahhhcb#ccc",'#10'"accccb#acc'
+ +'ccb#accccb#ccc",'#10'"bbbbbb#bbbbbb#bbbbbb#ccc",'#10'"#####################'
+ +'###",'#10'"....................dd..",'#10'".#################.dddd.",'#10'"'
+ +'.#a#ddddddddd#a#a#dddddd",'#10'".#################..dd..",'#10'".#ccccccccc'
+ +'cccccc#..dd..",'#10'".#c####c#######cc#..dd..",'#10'".#c#aa#c#aaaaa#cc#..dd'
+ +'..",'#10'".#c#aa#c#aaaaa#cc#..dd..",'#10'".#c#aa#c#aaaaa#ddddddd..",'#10'".'
+ +'#c#aa#c#aaaaa#ddddddd..",'#10'".#c#aa#c#aaaaa#cc#......",'#10'".#c####c####'
+ +'###cc#......",'#10'".#ccccccccccccccc#......",'#10'".#################.....'
+ +'.",'#10'"........................"};'#10
+]);
+LazarusResources.Add('trxxpmanifest','XPM',[
+ '/* XPM */'#10'static char *trxxpmanifest[]={'#10'"24 24 9 1",'#10'". c None"'
+ +','#10'"# c #000000",'#10'"c c #000080",'#10'"a c #00ff00",'#10'"e c #9d9da1'
+ +'",'#10'"g c #e0dfe3",'#10'"b c #ff0000",'#10'"d c #ffff00",'#10'"f c #fffff'
+ +'f",'#10'"........................",'#10'"........................",'#10'"..'
+ +'..##...##.####........",'#10'".....##.##..#####.......",'#10'"......###...#'
+ +'#.##.......",'#10'"......###...#####.......",'#10'".....#####..####........'
+ +'",'#10'".....##.##..##..........",'#10'"....##...##.##..........",'#10'"...'
+ +'.....................",'#10'".####################...",'#10'".#aaaaaaaaaaaa'
+ +'#b#c#d#e..",'#10'".####################e..",'#10'".#ffffffffffffffffff#e.."'
+ +','#10'".#ffffffffffffffffff#e..",'#10'".#ffffffffffffffffff#e..",'#10'".#ff'
+ +'ffffffffffffffff#e..",'#10'".#ffffggggggfggggggf#e..",'#10'".#ffffgffff#fgf'
+ +'fff#f#e..",'#10'".#ffffg#####fg#####f#e..",'#10'".#ffffffffffffffffff#e..",'
+ +#10'".####################e..",'#10'"..eeeeeeeeeeeeeeeeeeee..",'#10'".......'
+ +'................."};'#10
+]);
+LazarusResources.Add('TPAGEMANAGER','XPM',[
+ '/* XPM */'#10'static char *TPAGEMANAGER[]={'#10'"24 24 8 1",'#10'". c None",'
+ +#10'"b c #000000",'#10'"c c #000080",'#10'"f c #00ffff",'#10'"d c #800000",'
+ +#10'"# c #808080",'#10'"e c #ffff00",'#10'"a c #ffffff",'#10'"..............'
+ +'..........",'#10'"........................",'#10'".........##############."'
+ +','#10'".........#aaaaaaaaaaaab.",'#10'".......##############ab.",'#10'"....'
+ +'...#aaaaaaaaaaaabab.",'#10'".....##############abab.",'#10'".....#aaaaaaaaa'
+ +'aaababab.",'#10'".....#acccccaddddababab.",'#10'".....#aaaaaaadaadababab.",'
+ +#10'".....#accccaadaadababab.",'#10'".....#aaaaaaadaadababab.",'#10'".....#a'
+ +'bbbaaaddddababab.",'#10'".bbbbbbeaebaaaaaaababbb.",'#10'".bbbfbeabbbbbbbbaa'
+ +'bab...",'#10'".bbbfbaeaeaeaeaebabbb...",'#10'".bbbfbeaeabbbbbbaab.....",'#10
+ +'".bbbfbaeaeaeab###bb.....",'#10'".bbbfbeaeabbb...........",'#10'".bbbfbbeae'
+ +'aeb...........",'#10'".bebbb.bbbbb............",'#10'".bbb.................'
+ +'...",'#10'"........................",'#10'"........................"};'#10
+]);
+LazarusResources.Add('TRXAPPICON','XPM',[
+ '/* XPM */'#10'static char *TRXAPPICON[]={'#10'"24 24 9 1",'#10'". c None",'
+ +#10'"a c #000000",'#10'"f c #800000",'#10'"c c #808000",'#10'"e c #808080",'
+ +#10'"g c #c0c0c0",'#10'"# c #ff0000",'#10'"d c #ffff00",'#10'"b c #ffffff",'
+ +#10'"...........###..##...##.",'#10'"............#..#..#.#..#",'#10'".......'
+ +'.a...#..#....#..#",'#10'"......aabaa.#..#....#..#",'#10'"....aabbcdda#..#..'
+ +'#.#..#",'#10'"..aabbccccc###..##...##.",'#10'".abbddddddddddda........",'#10
+ +'".aaaaaaaaaaaaaaa..##b...",'#10'".abddeebddeebdda...##b..",'#10'"..cceeecce'
+ +'eeccc....###b.",'#10'"..cbebbcbebbcbc.####d#..",'#10'"..cdebbcdebbcee##d##d'
+ +'#b.",'#10'"..cbebbcbebbcebfd#dd#b..",'#10'"..cdebbcdebbcebbfbb##...",'#10'"'
+ +'.adddaadddaadebgbf###b..",'#10'".aaaaaaaaaaaebbgegf#....",'#10'".adbdbdbdbd'
+ +'ebebegeea....",'#10'".aaaaaaaaaebebeeaaaa....",'#10'".........ebebeea......'
+ +'..",'#10'"........ebgbeea.........",'#10'"........agbeea..........",'#10'".'
+ +'.......aeeaa...........",'#10'".........aa.............",'#10'"............'
+ +'............"};'#10
+]);
+LazarusResources.Add('TSECRETPANEL','XPM',[
+ '/* XPM */'#10'static char *TSECRETPANEL[]={'#10'"24 24 11 1",'#10'". c None"'
+ +','#10'"# c #000000",'#10'"d c #000080",'#10'"i c #0000ff",'#10'"e c #008000'
+ +'",'#10'"g c #800000",'#10'"a c #808080",'#10'"b c #c0c0c0",'#10'"h c #ff000'
+ +'0",'#10'"f c #ffff00",'#10'"c c #ffffff",'#10'"........................",'
+ +#10'"........................",'#10'".######################.",'#10'".#aaaaa'
+ +'aaaaaaaaaaaaaab#.",'#10'".#aaaaaaaaaaaaaaaaaacc#.",'#10'".#aabbbbbbbbbbbbbb'
+ +'bbcc#.",'#10'".#aabbbbbd#dbbbbbbbbcc#.",'#10'".#aabbbbdefedbbbbbbbcc#.",'#10
+ +'".#aabbbb#fff#aabbbbbcc#.",'#10'".#aabbbbdefedbb##bbbcc#.",'#10'".#aabbbbbd'
+ +'#dbbbggbbbcc#.",'#10'".#aabbbbabbbbb#hh#bbcc#.",'#10'".#aabbbbabbbbb#hh#bbc'
+ +'c#.",'#10'".#aabb#####bb#hhhh#bcc#.",'#10'".#aabb#iii#bb######bcc#.",'#10'"'
+ +'.#aabb#iii#aabbbbbbbcc#.",'#10'".#aabb#iii#bbbbbbbbbcc#.",'#10'".#aabb#####'
+ +'bbbbbbbbbcc#.",'#10'".#aabbbbbbbbbbbbbbbbcc#.",'#10'".#accccccccccccccccccc'
+ +'#.",'#10'".#bccccccccccccccccccc#.",'#10'".######################.",'#10'".'
+ +'.......................",'#10'"........................"};'#10
+]);
+LazarusResources.Add('TRXLABEL','XPM',[
+ '/* XPM */'#10'static char *TRXLABEL[]={'#10'"24 24 3 1",'#10'". c None",'#10
+ +'"# c #000000",'#10'"a c #ffffff",'#10'"........................",'#10'"....'
+ +'....................",'#10'"........................",'#10'"...............'
+ +'.........",'#10'"........................",'#10'"........................",'
+ +#10'".........####aa.........",'#10'"..........####aa........",'#10'".......'
+ +'..#####aa........",'#10'".........##a###aa.......",'#10'"........##aa.##aa.'
+ +'......",'#10'"........##aa.###aa......",'#10'".......##aa...##aa......",'#10
+ +'".......##########aa.....",'#10'"......##aaaaaaa##aa.....",'#10'"......##aa'
+ +'.....###aa....",'#10'".....##aa.......##aa....",'#10'"....####aa.....####aa'
+ +'...",'#10'".....aaaaa......aaaaa...",'#10'"........................",'#10'"'
+ +'........................",'#10'"........................",'#10'"...........'
+ +'.............",'#10'"........................"};'#10
+]);
+LazarusResources.Add('tautopanel','XPM',[
+ '/* XPM */ '#10'static const unsigned char * tautopanel_xpm[] = {'#10'"24 24 '
+ +'5 1",'#10'" '#9'c None",'#10'"!'#9'c black",'#10'"#'#9'c #808080",'#10'"$'#9
+ +'c white",'#10'"%'#9'c #FF0000",'#10'" ",'#10'" '
+ +' ",'#10'" ################### ",'#10'" #$$$$$$$$$$$$$$'
+ +'$$$ $ ",'#10'" #$ #$ ",'#10'" #$ #$ ",'
+ +#10'" #$ #$ ",'#10'" #$%% #$ ",'#10'" #% %'
+ +' % #$ ",'#10'" #% % % #$ ",'#10'" #% % % % %%% '
+ +' %%$ ",'#10'" #%%%% % % % % #% ",'#10'" #% % % % % % #% ",'#10
+ +'" #% % % % % % #% ",'#10'" #% % % % % % #% ",'#10'" #% % %'
+ +'%% %% %%$ ",'#10'" #$ #$ ",'#10'" #$ #'
+ +'$ ",'#10'" #$ #$ ",'#10'" #$ #$ ",'#10'"'
+ +' # #################$ ",'#10'" $$$$$$$$$$$$$$$$$$$ ",'#10'" '
+ +' ",'#10'" "};'
+]);
+LazarusResources.Add('TRxCalendarGrid','XPM',[
+ '/* XPM */'#10'static char *TRxCalendarGrid[]={'#10'"24 24 5 1",'#10'". c Non'
+ +'e",'#10'"# c #000000",'#10'"a c #00ffff",'#10'"c c #800000",'#10'"b c #ffff'
+ +'ff",'#10'"........................",'#10'"........................",'#10'".'
+ +'.....###.....###.......",'#10'".....#...#...#...#......",'#10'"....########'
+ +'######......",'#10'"....#a#aaaaaaaa#a##.....",'#10'"....#aaaaaaaaaaaa##....'
+ +'.",'#10'"....###############.....",'#10'"....#bbbbbbbbbbbb##.....",'#10'"..'
+ +'..#bbbbbbbbbbbb##.....",'#10'"....#bbbccbbbcbbb##.....",'#10'"....#bbcbbcbc'
+ +'cbbb##.....",'#10'"....#bbbbcbbbcbbb##.....",'#10'"....#bbbcbbbbcbbb##.....'
+ +'",'#10'"....#bbcbbbbbcbbb##.....",'#10'"....#bbccccbbcbbb##.....",'#10'"...'
+ +'.#bbbbbbbbbbbb##.....",'#10'"....#bbbbbbbbbbbb##.....",'#10'"....#bbbbbbbbb'
+ +'bbb##.....",'#10'"....###############.....",'#10'"......#############....."'
+ +','#10'"........................",'#10'"........................",'#10'"....'
+ +'...................."};'#10
+]);
+LazarusResources.Add('TRxDateEdit','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#3#0#0#0#215#169#205
+ +#202#0#0#3#0'PLTE'#1#0#0#0#0#0#128#0#0#128#128#0#0#0#128#128#0#128#0#128#128
+ +#128#128#128#192#192#192#255#0#0#0#255#0#255#255#0#0#0#255#255#0#255#0#255
+ +#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0','#144#198'\'#0#0#0#1'tRNS'#0'@'#230#216'f'#0#0#0#136'IDATx'#218
+ +'u'#145#139#10#128' '#12'E7'#130#22#132#254#255'o'#166#4'M'#8#155'R'#168'k*l'
+ +'x'#207'^*'#194'd!'#144'%s'#1#233#175#251#163#2#223#2#233'u'#127#192'b3Z'#128
+ +#129'z'#16't'#151#252#1#31#246#166#158'>T@e<#c'#19#127#161#186'G~'#5#194'!'
+ +#137'z@'#220#233#3#232'+)'#16#29'D98'#13#162'H'#194#166#25'+Y'#0#170'5'#128
+ +#188'V2z'#128#179'K'#217#227#242'r'#203#134'b'#238#225#230#147#183#210#31#159
+ +'Ud['#15'h'#23'Z'#25#23#189'C'#28#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxClock','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#3#0#0#0#215#169#205
+ +#202#0#0#3#0'PLTE'#1#0#0#0#0#0#0#128#0#128#128#0#0#0#128#128#0#128#0#128#128
+ +#128#128#128#192#192#192#255#0#0#0#255#0#255#255#0#0#0#255#255#0#255#0#255
+ +#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0'IF'#160'|'#0#0#0#1'tRNS'#0'@'#230#216'f'#0#0#0#132'IDATx'#218
+ +#157#146#193#14#128' '#12'C'#187#19#254#255#215#202#169'2'#6#172'j8('#9#4#246
+ +'h'#10#20#195#166#217'?`'#160'V8'#129#29'8'#25'[8'#22#29#180')N'#160'8'#168
+ +#128#175#152#192#203#181#15#9#188#199#246')'#226'2/'#171#234'3B'#193'R'#8'h'
+ +#245#154#30'%'#136#165'`*'#20'T'#164#2#229#165#184#153#168'G'#24#136'GJ'#30
+ +#167#218#223'cH'#6#163#230'ay*jP>'#206#135#130'('#172#7'1'#242#0#196'|'#147
+ +#224#183#207'p'#1#206#241'B'#25'c'#4#211#189#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxSpeedButton','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#3#0#0#0#215#169#205
+ +#202#0#0#3#0'PLTE'#1#0#0#0#0#0#128#0#0#128#128#0#0#0#128#128#0#128#0#128#128
+ +#128#128#128#192#192#192#255#0#0#0#255#0#255#255#0#0#0#255#255#0#255#0#255
+ +#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0','#144#198'\'#0#0#0#1'tRNS'#0'@'#230#216'f'#0#0#0#173'IDATx'#218
+ +'}'#146#209#14#195' '#8'E/mWX'#154#253#255#135#246'E'#172'+'#131#166#217'tu3'
+ +#198#135's@'#8'J'#248#177#8#224#14'V'#23',W'#158#178#133#208#139#176#139' '
+ +#204#218#21#167#169#133'='#253#152#202#13'a*Q'#2'{'#139#24'v'#171'3<~'#196
+ +#224#212'w'#147#225#9#163#172#247'}'#192#222#214'8'#4#214#7'2'#172#233'jJ'
+ +#178#137#242#202#248#234#170'8'#135#26'e'#182'25'#25#155'$Id'#200'Kj'#132#5
+ +#247#2'Q'#170'T'#226#228#139#159#178#209'G'#152#215#13'~'#12#165'T])'#191'y'
+ +#196'Wb'#246#235#185'7v'#253'zF'#251#255'P'#189#175#16#2#212#17#214#165#199
+ +'z'#1'i'#21#144#25#14'l'#154#14#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxSpinButton','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#3#0#0#0#215#169#205
+ +#202#0#0#3#0'PLTE'#1#0#0#0#0#0#0#128#0#128#128#0#0#0#128#128#0#128#0#128#128
+ +#192#192#192#128#128#128#255#0#0#0#255#0#255#255#0#0#0#255#255#0#255#0#255
+ +#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#200'7q|'#0#0#0#1'tRNS'#0'@'#230#216'f'#0#0#0'wIDATx'#218#173#210
+ +#189#14#128' '#12#4#224#178#224#198#251'?'#167#19#215#5'M9'#180#252#24#19#163
+ +#11#201'}'#205#137'H'#144#135'''|'#130#25#11'!u)pC'#246#29'H'#187#7#149#216
+ +'r'#192#129#158'k'#172'y'#14#14#212#166#163#229#226#129'U'#150'/'#160#230'30'
+ +#31#160#246#176#176#3#155'_@'#237#153#129#243#182'i'#15'|'#175#242'c.'#0#247
+ +'3Vm'#24#142#177#129'$'#244#7'_^~'#212'O'#151#225#0'g$X'#25']'#5'r'#173#0#0#0
+ +#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxSpinEdit','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#3#0#0#0#215#169#205
+ +#202#0#0#3#0'PLTE'#1#0#0#0#0#0#0#128#0#128#128#0#0#0#128#128#0#128#0#128#128
+ +#192#192#192#128#128#128#255#0#0#0#255#0#255#255#0#0#0#255#255#0#255#0#255
+ +#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#200'7q|'#0#0#0#1'tRNS'#0'@'#230#216'f'#0#0#0'kIDATx'#218#189#145
+ +'A'#11#192' '#8#133#237#226#6#131#253#255#223'9'#8#182'wij'#130'c'#213#161'K'
+ +#217'A'#222'G'#234#179'D'#131#147#214#128#189'#'#223#6'6'#203#175'S'#130'-'#5
+ +#149#15#16'B'#2#160#23#14#178#234#135#1#16'q'#23'h!y'#19#165#242#0#136#238'='
+ +'T'#15#160'z4'#159#3#168's'#181'>'#192#191#169#220'9'#185#245#10#158'vWe'#213
+ +'GM'#130#23#211'$E'#25#128#18#229'#'#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRXDBSpinEdit','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#9'pHYs'#0#0#14#156#0#0#14#156#1#7#148'S'#221#0#0#1#230'IDATH'#137#205
+ +#148#193'j'#19'Q'#24#133#191#127'2'#142'+)}'#129#190'D'#23#226'"P_A'#220#187
+ +#200'n'#210#216'M'#7#178'(C'#9']T"*'#212'd#]'#248#12'n'#5#145','#220#139'o'
+ +#224#170#22#196#166#134#218'af'#174#139#206#157#220#153';'#153#220#22#4#15#4
+ +#238#127#239#253#207#185'9'#255'a'#224#31'C'#244'"'#12'C'#165#215#211#233'T@'
+ +#169#230#150#178'U'#218#207#13#132'a'#168#148#162#252#153'b'#205'X'''#222'B'
+ +#190'JD)'#147#212']'#192#3#232#247#195#202'f'#189#6#16#145#194'6Mn'#174'm'
+ +#232#7#249#0#147#201#180'BZ'#175'M'#153'*'#233#234'9'#220'<'#168#16#208#164
+ +'n'#208'"nC'#22#237#181')'#160'_'#191#189#253#208'Q'#180#25#189#222'3i'#181
+ +#232#219#215#217#157#201#15#15'cz'#189'5'#22#189'z'#243#206#218'K'#146#132' '
+ +#8#0#200#178#12#127'gh'#221'Q'#179'1'#243'_'#223#129'B'#160#223#15#27'-jB'#16
+ +#4#229#4#252#157'!'#217#231#23#214#29#233'F\|x'#190#20'Xe'#209#163#193#167'J'
+ +#227#151#147#199#0#228#10':'#197#136#207#206#23#0'D'#251#3#198'/O,'#177'V'
+ +#139'4a]'#168#227'-'#215#151#243#5#163#209#176#20#137#227'c['#160#205'"M'#174
+ +#197#234#184#248#249#155#189#221#131'JmB'#160#250#161#211'x'#253'vB '#235#5
+ +#164#27'Y{z'#200#27#155'['#226#129#157'wWr'#23#148'3'#184#127'/a\'#196#178
+ +#227#216','#221#200'-E'#26'JA'#206'2!.8;_'#16#237#15#202#186#158'$'#207',D '
+ +#184#5'9'#220#164'H'''''#142#143#185#156'/*'#231#149#127#224#145#146#233#173
+ +'|'#233'}Z'#156#231')x'#2#190#225#161'N'#205#222#238#129#149' K@'#169#28'H'
+ +#16#229#225'y>Y'#14'H'#138#200#21#29#30#212'nC:'#27#225'wc'#139#244#207#199
+ +'#'#174#175'~'#0'ELOO'#223#171#167'O'#238#158#148'U'#216#216#220#186#165#225
+ +#255'#'#254#2#182'2'#241'd'#141']'#3'd'#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxTimeEdit','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#9'pHYs'#0#0#14#156#0#0#14#156#1#7#148'S'#221#0#0#1'TIDATH'#137#237'TAN'
+ +#195'0'#16#156')'#136'7'#181#183#210#15' '#238'H'#28'zm'#223#144#245#7#16#18
+ +#220'P+'#193'C'#218'T'#28#224#140#248#13#18#195'!'#177#177#235#196'mQ'#17#23
+ +'F'#178'6'#235#216#187#179';'#155#0#255#248'k'#16#0'$i'#185'|'#250#149#4#167
+ +#177#243#254#246'|'#212#224#23#151'Wi'#2#0#184#185'}8Z'#130#205'f'#131'A'#223
+ +#203#209'|'#157#216']'#251#30'$'#19#191'7'#193'Op'#194#179',Ig'#2#146'x'#189
+ +#159'$'#150'd'#198'>'#174#130'$>'#241#145#248#1#146#180'X<'#10#128#26#183'Yf'
+ +'&3'#11#254#247'{i8[i'#23#234#186'V'#16'y:'#189'n'#147#245#183'@'#2#200#134
+ +#221'p'#182#194'h'#190#198#203#221'9'#156's'#157#231#199#227'q3E$C`'#231#12
+ +'Ue'#0#16#172#135's'#6#201#218#22'L'#160#18#155#140#156#242'e='#251#190']'
+ +#251#180'h'#208#6#135'sV'#166#144'U'#146#10#233#7'!^E'#246#187'*'#232#170#2
+ +'H'#7'!'#136#236#217#199'=wL'#173'G'#149'T'#155'V-'#169#213'S'#217#254'Q*'
+ +#232#210#128#177#6#219'SS'#210#160#170#12'$P'#215'u'#241#172'o'#192'!'#19#215
+ +'\dr'#191#23#217#175#162'4M'#135'LZ '#18'='#11'H'#191#228'.'#241#227#201#220
+ +'''A\'#1#183#2#228'l'#14#12'^:'#216#167#200#222#129'='#190#0'q'#209'z'#166'R'
+ +'2h'#222#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxDBTimeEdit','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#9'pHYs'#0#0#14#156#0#0#14#156#1#7#148'S'#221#0#0#1#159'IDATH'#137#181'V'
+ +'1N'#195'0'#20'}?'#148'r'#131'\'#164#3'e3''@'#236#136#165'bq'#138#16'G'#232
+ +#196'X!'#154','#168#11#7')'#223',='#6'Co'#193#242#25#26#187#174'c;'#141#16'O'
+ +#138#226#196#254#239#253#255'l'#199#1#254#25'd'#27'Zk'#177#237#166'i'#8#16
+ +#137#135#184'P'#202#247'{'#208'Z'#139#8#220#229#139#197#209''''#158'!'#207
+ +#139#136't'#175'<'#200#18#213'u'#227'^V'#149#6#0'L&'#151#157#128#217#236#222
+ +#181#215#235#143#222#2'Hk-u'#221'8R+VU'#26#23#231'?'#209#160#229#235';'#158
+ +#159#30'z'#201'on'#239#242#22#253#21#204','#133'oIh'#17#0'\=~'#30#245#217#231
+ +#240#189#179'$X\#'#223#146#208#162#161'8'#163#177#19#145'v'#254'G>i*'#27'Z'
+ +#237#159#167#243'M'#167#138#237#219'u4s"'#2'3'#231'WQY'#150#0#0#165#212#209
+ +']D'#142#200'S0'#198#12#179#136#153#161#148#2#17'a:'#223'8'#145#197'b'#17#21
+ +'PJ'#229'-'#178#25#251#2#204#236#250#228#132#13#157#183#168'i'#160'Z'#194#152
+ +'x'#159#128'1'#6#4'@'#180#238#218#177'\'#213'x)(*`'#173#242'E'#194'I'#182#227
+ +#10#160#251'IX'#174'j'#140'3'#223#202#208':'#0#157'j'#142#150#233'n'#247#141
+ +#178',]'#224#246#203#128#219'6'#7'd'#202#155#135#152#136#191#7#128#253'y '
+ +#169#0'V*9'#7#182#146#220'<'#184'e'#10#28'|'#13#179#141#10'{c'#141'1I'#1#224
+ +'p'#162'%'#171'H'#161#21#232'='#213#138'Xv)'#12'M"'#204'@B'#18#127'SYx'#237
+ +#147#206'd'#191#2#10#201'B'#12'%'#207#13'L-'#141#211#255'$Z'#252#2'}'#212'D'
+ +#152'a'#180#26#28#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxDBProgressBar','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#9'pHYs'#0#0#14#156#0#0#14#156#1#7#148'S'#221#0#0#1'''IDATH'#137'c`'#160
+ +'1`d```'#200#202#202#250#15#19#152'6m'#26'#'#3#195#255#255#184#181#192#181'2'
+ +#18'eCVV'#214#255#255#255#25#224#24#217'2'#220#128#24#7' '#148#254'G'#199#132
+ +'-!'#222#2#166#236#236','#20#1't>'#166#193'0'#195#145#217#184#1#227#255#255
+ +#12#255#145#13#157':u'#26'Cvv'#22'4.pY'#2#215'N0'#30'X`'#134#18#15#24#161#137
+ +#128#184'Hf'#204#202#202#250#143'l'#1#204'7'#188#188#26'$X'#138#9':;'#243#24
+ +#25#24#240#4'Qp`'#16'E'#22#236#218's'#141#161#179'3'#143#17'g'#16#25#153#24
+ +'2x'#214'^'#132#243#183'7'#235'c'#240'q'#129'sg'#206#195#217','#217#217'Y'#12
+ +#216#130#136#129#129#129#161'6'#206#0'I'#219#127#12'>1'#128#5#22'$0'#128#204
+ +'?w'#247#11'\'#220'J'#149#27#131'O'#148#5'0C'#177#129#173'G'#239#192#217'9'
+ +#30#250#24'|b'#0#137#25#141't'#192#130#205#208#254')S'#25#190'}|G'#21#11#24
+ +#231#206']'#248#255#236#217#147'('#134#179'120'#236#219#179#151'"'#131'a'#201
+ +#20#158#27#203#203''''#17'_B'#18#1'`'#25'm'#20#140#130'!'#0#0#6#165#149#157
+ +#16'*hH'#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxDBTrackBar','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#9'pHYs'#0#0#14#156#0#0#14#156#1#7#148'S'#221#0#0#1'SIDATH'#137#237'T'
+ +#177'n'#194'0'#16'}F'#217'*v'#182'D'#130#161#202#152#137'.'#208#181'R'#7'>'#3
+ +']('#234#22'~!S$P,~'#161'_'#208#13#214'N'#29'Y*'#132#170'J'#253#139#234':'#4
+ +#187'Il'#167')*'#27'O'#178'd;'#207#239#249#238'|'#1#206#12#161'&D'#196'j.'
+ +#165#20#0#179#133'.'#204#189#22' "f'#134#30'e'#179#31#216#12#127#135' "'#206
+ +'si|'#136'c:FR6(" '#185'7'#204'$'#245#173#209'yJ'#172'l'#18#199#228#184'y1'
+ +#127#221'm[G'#224#1'@'#158#203#138'hu-*'#245'H'#146#21'z'#189'/L&'#247#154#31
+ +#4#3','#174#150#156#166's#'#10#175','#234#134'2'#17#2'X'#254#169#22'B'#21#212
+ +#150#162'n'#247#218'z'#200#26#193'be'#240#210't.'#26'S4'#157#222#25#135#214
+ +#235'g'#231'm'#203'|'#197'kL'#209#199#251#167'S'#204#6#27#191#241#21#141'n'
+ +#199'F'#209#146#196']'#3#27'_7'#25#17#233#225'n'#182#2#195#217#134#179','#227
+ +#195#225#141#153#153#135#179#141#147#219#242#21'U'#17#133'>'#158'v'#192'c0'
+ +#192#205#195#22'Q'#232#227#197#193#237#0#245#198'2'#215'uH'#234#139'('#244
+ +#181#184#171#139#129#227#207#206#150#142#234'o'#194#14#146'{n'#18#215#6'u'
+ +#147'6'#226''''#195#245'JN'#221#239#252#223#213'.'#184#224'\'#248#6#216#165
+ +#172#203#24'='#180#201#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxLoginDialog','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#9'pHYs'#0#0#14#156#0#0#14#156#1#7#148'S'#221#0#0#1#212'IDATH'#137#213
+ +#149'?hSQ'#20#135#191#27'S'#229#17'hET'#208','#25#218'A%T'#168'"'#220'!'#185
+ +'NJ'#165#155'S'#187#212#209'!'#234#224#164#203'-d'#233#148'5'#16#138#144#205
+ +','#26#23'!'#211'u'#17#137#155#8'>'#130#213#169')Ei'#254',Akr'#29#170#177#205
+ +'K^^'#211#183#248#155#238';'#247#156#243#157#195'}'#156#3#255#187#196#160'A+'
+ +'l'#255'l'#236#224#245'Xi%'#254#196#238#231#142#30#190#182'v'#144'i'#189'5'
+ +#140#148#224'`A'#214#130#16#209#145#222'C'#131#142#174'C'#229'i'#173#143#151
+ +'m@Zko'#7'J'#169'P'#146#27'c'#0#136'L'#18'\.'#151')'#22#139#129'|'#143#12#232
+ +'v'#187#8'!p'#28#135'R'#169#20'.'#192'u]'#242#249'<'#213'j'#149'B'#161#128#16
+ +#130'L&'#19#30' '#153'L'#226#186'.'#217'l'#150'J'#165#130#148#146'h'#212#255
+ +'G'#28#9'x'#244'p'#133#31#173#28'ra'#11'y'#173#133'\p'#233't:'#244'z'#189#190
+ +'O<'#30''''#151#203'M'#6#184'}]0?{'#158'''K+|'#251#186#195#148'3G'#235#251'6'
+ +#141'F'#131'g'#27#247'}'#147#30#212#200#254'"'''#247'85'#245#18#189#241#24
+ +#219'^'#167#241#22'Rg-'#175#239#213'9w'#165'N- '#192#247#13'b'#177#203#196#18
+ +')j;'#155#156'Im'#146'X'#252'B'#236'B'#224#226#253#1#246#215'O'#232#188#1#166
+ +#153#191#4#167#29'x'#250' A'#228'DH'#128'['#203'/'#216'k'#3'8'#0#172'.'#193
+ +#221#197'&'#187#159'C'#2#0#188'o'#27'^'#173#223#160#249#1'n^'#133'O'#239#154
+ +'<'#175'C'#237#162#9#12#24';Mg'#164#225'#0#'#247#191#239#200#192#185#129#9'F'
+ +#133'1'#6#149'V'#168#180#234#15'4c'#12'i'#165'H'#171#127#182#191#26#219#193
+ +'0'#233'5'#237#177#173'i'#175'm"'#192#176'q'#238'7'#226#189';9'#164#165#163
+ +#181#14#190'k'#143#163#223'|G'#141#138'p'#211'x'#28#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxVersionInfo','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#9'pHYs'#0#0#15#18#0#0#15#18#1'!'#155#242'3'#0#0#0#252'IDATH'#137#213#149
+ +#193#17#194' '#16'E_'#28#155#240'H'#27#30#215'2l'#197'v'#210#6'G'#219#224#152
+ +'2'#240#144'0'#129'5'#192'2'#234#193#127'av'#242#243#31#11#132#192#191'k'#234
+ +'[b'#204#236#6#191#25#144#7#191#189'f'#6'U'#140#173#240'1'#200#129#201#18'n'
+ +#135'('#195'Qx'#30#210'{'#254#174'S'#135'?'#181#235#190#26#179'k'#133#217#189
+ +#157#14'>'#215'P'#7#207'Y'#6#14#0'\'#239'~:'#151#129'9$'#198#28#178#204#18#17
+ +#25#201'g'#153#137#231#182#165#132#0#224'}Q'#6#192'5'#192#10#160#187'H'#16
+ +#128#219':'#168'0'#215#158#161#6#212' '#187#130#247#135#161'a'#131#233#142'*'
+ +'KT'#135#212#150#195#169#177#3'H'#16#208#160#162#3#17#194#182'''Nd'#221#159
+ +#180'E'#210#5'h'#208'zDu'#7'E'#237#217#129#8#200#215'?4'#159#168'[-'#150#31
+ +#206#174#214#135#230#0#2#132#176#6';'#7#151#199'c'#248#238'2*'#198#180'w? '
+ +#148#135#226#135#151#221#248#213'nT'#217#193#11#31'-T'#255'GS='#145#0#0#0#0
+ +'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxAboutDialog','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#9'pHYs'#0#0#14#156#0#0#14#156#1#7#148'S'#221#0#0#0#228'IDATH'#137#213
+ +#149#209#13#195' '#12'D'#143'*{q'#155#197#217#204#153#140'~P'#8'%'#16#28#20
+ +'U'#234#251#1','#235#14#3'2'#192#191#227#210'D'#136#144#231#26#218#217#6#132
+ +#238#163#17#181#151#24#14#161#240#138#145'jm'#193#161#220'X'#8#128's'#139'-y'
+ +#30#7#0'"'#242#140'Z'#133#136#28#21#144'l&'#145#254'k'#173#186#155#196'U'#21
+ +'@'#190#131'ka'#9'['#28#221#154#227'V'#163#215'H'#220#178#129'+'#186#21#148
+ +#136'[Mb&'#131'zg'#233'xZF'#164#31#30'U'#243#136'Z'#204'Va6'#152#229#247#6
+ +#214#231'g'#205#237#190#162#242'r'#203#245#221#187'h'#26#168#238#224'@'#200
+ +'Zi'#183#130'$0'#219'*'#134#6#179#130'5'#183'_'#145#170#130#158#160'gnh'#170
+ +#10'O'#194#243#136'%L'#173#162'F69'#197'69'#199#166#12'Zm'#189#215#234#129
+ +#242'O~'#248#211#17#145#251#127#238#12'o'#239#175'R'#255#176#141'Ys'#0#0#0#0
+ +'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxDBCurrEdit','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0'0'#0#0#0'0'#8#6#0#0#0'W'#2#249#135
+ +#0#0#1'HIDATx'#218#237#151'A'#14#131' '#16'E'#165#139#246#6#158#199#243#224
+ +'!JO'#208'Ma'#231#162'7'#209'e'#23#158#137':'#137#180#160'B-'#181#14'$'#243
+ +#19#3#26#193#255#252#163'(+2'#23#195'6@'#0#216#6#8#0#219#0#1'`'#27' '#0'l'#3
+ +#4#128'm'#128#0'b'#7'r'#206#181#233'+'#165#134'y'#180#14#143'`'#127#185'YQ'
+ +#147#130'y)'#213'k'#191#174#249#8#225#19#192'%'#2'05'#31#134'XJe['#144'('#0
+ +'h'#167#9#128#202#178#156#157'/'#196#217#234'_'#130's'#11'!'#190#246#19#157
+ +#128'1m`'#198#4'<'#163#244#154'KE%'#179'i'#9'I)c<'#20']'#215#21'UU'#237#7#0
+ +#237'R'#9'}'#2'`c'#249#235#225#209#176#251#187#3#248'Jhm'#2'`^['#207'7'#10
+ +#192'T'#6#128'-'#172#8#211'c'#232#0#208'.'#149#144'Rn'#2#246#219'?)'#128'P'#9
+ +'e'#145#128#127'!{'''#224#26'N'#12#0'Z'#223'['#200#152#181'M'''#5'`C'#216#186
+ +#222'dq:'#188#247#147'M'#0#212'4w'#221#247#15#199#252#145#249#204#206#161'P'
+ +#1#134#239#21'=l'#142#129#213#23'Ka!'#251#5#192''''#20#128#182'm7'#3#0#237#13
+ +#144#204#175'h2F'#8' W'#17#0#182#8#0'['#4#128'-'#2#192#22#1'`'#139#0#176#149
+ +'='#192#19'C'#237#245'1T'#130#194#231#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxViewsPanel','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#23#8#6#0#0#0#17'!'#143'-'
+ +#0#0#0#9'pHYs'#0#0#14#196#0#0#14#196#1#149'+'#14#27#0#0#0#233'IDATH'#137#205
+ +#149'Q'#14#132' '#12'D'#167#27#239'Eof'#185'Y9Y'#247#3'QD\'#17'4'#217#249'Q'
+ +#155#240'F'#24''''#146#153#25#17'^'#145#25'@'#128#153#13#130#8#128#157'\'#211
+ +#253'k'#154'D'#4'"'#243#226#149#203#160#26#192#204#16#17'0'#243'm'#184#170'b'
+ +#138#183't8("'#2#243'~'#230#156#3#0#132#16'v'#207'I'#229'<3'#0#208#144't'#8#1
+ +#206#185#29'8'#135#214#230#19'n*-l'#157'/'#6#6#170'd'#240#132#178#29'\'#3#187
+ +'3'#144#195#219'GIa'#218#157#129#192#14'&%'#188'\'#216':_'#143#232#12'8'#170
+ +','#131#235#144#7'zP/Zi2'#212#3#242#180#226'~U'#174';'#131'+p'#175#214#162'A'
+ +#254#160'h'#221#6#173'E'#235#209#231#12#244'T/'#226#14#196#3'H?'#158'M'#241
+ +#135's'#31#170#170#155#193'>N('#153#180#23#248']'#131'#'#145'Zs'#240'vy'#153's~'#191
+ +#197'w-'#145#224#217#196#4#23'#'#17#206'vw'#215'?'#7#149']t'#191#175#143#31#7
+ +#7#148#14#15#25#201'f-'#220#247'kk'#156#238#236#228#227#214#22#224#240#171'p'
+ +#170'Als'#147#184'apit'#148#231#211#211#166#255's>'#207#203#249'yF'#178'Y'
+ +#190#20#10#188'[]'#173#190'A!'#191'W3p%'#154'ZZ'#8#206#206'r'#175#167#135#221
+ +'L'#134#243#3#3'<'#141#197#184'29'#201#25#175#151'P2'#201#210#208#144#133'#'
+ +#142#166#170'""2'#211#218'*_'#13'C'#202'x'#157'N'#203#131#254'~y'#181#184'('
+ +#15#3#1#145'R'#201#252#182#30#143#139'e'#243'T.'#138#227'P'#225'D'#131'V'#247
+ +'n'#197'A'#252#159#226'''{'#212#26#152#181#14#208#246#0#0#0#0'IEND'#174'B`'
+ +#130
+]);
+LazarusResources.Add('TRxDBRadioGroup','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#4'sBIT'#8#8#8#8'|'#8'd'#136#0#0#0#9'pHYs'#0#0#14#156#0#0#14#156#1#7#148
+ +'S'#221#0#0#3#20'IDATH'#137#181#148'oHSa'#20#198#127'W6W'#162#169#149#174#132
+ +#18#141#129#144#181'0('#130#178'2"'#168#232'C'#4#150'#n'#136#179#160#192'>E'
+ +#127#160'B'#20#194'/aEbAq'#145'5'#252#16'ad'#31'"E'#199#2#177'0Z'#22#253'C]'
+ +#162#209#148#210#178'?z'#213#211#135#177#185'5'#231'4'#233#129#203#189#231
+ +#188#231'}'#158#251#156#247#240'*'#132#192#233#234#151#155#15#186#152#14#205
+ +#9#143#167#205#199#130#242'7q'#245'q+'#185'+'#19#233#252'8'#130'oh'#20#223
+ +#240#24#190#161'Q'#202':4'#228#194#133'9'#11#24#0'n>'#232'b'#173'e1Y'#230#133
+ +#248#134'F'#233#132'0r'#223#240'XpC'#229#130#5'$fd '#147#147#152#146#146#216
+ +'s'#253':+'#183'l'#225#231#192#0#181'yy'#28'ii!u'#213'*'#0#156#251#246#17#7
+ +#144#189'b'#17#158#247'_hp'#247#133#145#6#222'?~O'#132#253#149#189#189#157
+ +#147'==l,+'#163#161#184#24#128#132#180'4'#10'**'#184'o'#183#131#8#157'N'''
+ +#191#191'~'#245';'#0#216#180'&'#141#244#228'x'#162#157#1#9#145#169#236#29';h'
+ +'>'#191#242#241#211#227#201#174'^H'#146#240#167#200#147
+ +#241#5#0#227#201'e'#222'gc'#128'{'#235#174#21'9'#164'i'#140#226'B&R'#7#203'z'
+ +'oE'#14'i'#2#180#14#4#145#198#214#6#158#151'6'#17#17#173#3'Q'#176#21#25#8#166
+ +#233#164#206#1#223#159#165#133#213':'#144#245'r%'#235#229'J6q,'#155'8'#174'u'
+ +#215#197#200'Qq2'#181#237#210#230'b'#209#254#222#27#5#230'Q'#196#249#217')'#0
+ +#199#163'Qo'#242#138#192#239#4#208'?'#197'^'#18#188#188#190#201#205#245#149
+ +#170#8#20#19#244'q'#158#145'W'#4#138#9#134#194'a'#214#160'V '#154'?'#15'B'
+ +#248#167#128'='#189#5'hL'#224#186'aw'#1'8'#208#26#228#239'u'#151#143','#255
+ +#29'['#224#27#254'('#218'x|2'#20#20#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxCloseFormValidator','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#9'pHYs'#0#0#14#156#0#0#14#156#1#7#148'S'#221#0#0#1#0'IDATH'#137#213'UA'
+ +#22#132' '#8#197'y'#221'+'#142'F7'#195'Es'#169#22#204#194'l'#12#5#179'f3'#127
+ +#149' '#252#175#16#2#252';'#130'6'#16#130#28#223','#218#221#5'a'#216'cS'#238
+ +#233#236#22#209#156'Rk0'#17#160#20'$'#2#16#194'd'#238'n'#6#141#227'$'#143#136
+ +#158'eS '#162#250#4#136#232#6#225#156#252#28#217#221#199#156#252#175#17'E9'
+ +#185'\/KM'#144#147'X'#144#0#16'wu'#183#8','#146'l'#27'I'#222'$'#240#238'v}'
+ +#175#7'Y)B'#11'*'#215'f'#13'Z'#9#182'm'#3#156#17'82p'#228'f'#226#236'w'#9'Z'
+ +#167#232'u'#141#213']'#221'.'#234#21#189''''#224'R'#155#246#212#151#251#180
+ +' '#151#224#170'z/'#206'$'#200#170#181#250#172'R'#23'S'#199'e'#184#195#206
+ +#186#154#22#169'^3$'#219#208#168#184#131'a'#2#230#226#138#246#191#154#153'aF'
+ +#132#25#191#182#140#238'{'#208#2'-T'#217#22#170'm'#183#8'Z'#227#220#27#241
+ +#245#155#252#163'G'#135#136#6#134#250#3'|'#0#10'!sr'#165'GZ'#12#0#0#0#0'IEND'
+ +#174'B`'#130
+]);
+LazarusResources.Add('TRxIniPropStorage','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#4'sBIT'#8#8#8#8'|'#8'd'#136#0#0#0#9'pHYs'#0#0#14#196#0#0#14#196#1#149'+'
+ +#14#27#0#0#1'LIDATH'#137#213#148#193'N'#195'0'#12#134'?''}'#27'$'#144#184#240
+ +#10#28'9'#240'>'#177#243'T'#188#0#210'8 61'#222#166#141#185#172'U'#179#181
+ +#163#29#187#236#147#162#184#177#235'?'#137#221#194#173'#'#0#170#234#215'N'
+ +#156's'#166#148'"M'#191#240#250#242'|U'#1'3'#3#160#25'/'#222'?'#190#225'+'
+ +#206#210'u'#137#166#137#180'mK'#211'4'#195#188#251'|'#31'b*'#1'wV'#9#132#16#0
+ +'?'#204#12#243#152'J'#224#251'k'#237'5'#253#29'_'#9#220'=<'#173#20#152#230'g'
+ +#247'1'#216#167'g'#154#193#204#8'! "C'#1#151#208#204'9b'#140#184';]'#215#145
+ +'s'#198#204'h'#219#22#17'!'#198#8'@J'#169#138#19#145#233'd'#170#234#251#237
+ +#198'{B'#8#14'8'#224'"'#226'"r'#214#238#159'K)'#238#238#190#223'nz'#223#244#9
+ +#142'w'#212#239#216'G-6'#23#179#248#138'D'#4#17'!'#132#128#187#163#170#149
+ +#223#204#136'1RJ'#153#191#154's'#2'9'#231#193'VU,%: '#31#10#156'R'#194#204
+ +#170#184')'#22'wQ'#25'%_'#195#170'6'#189#132'E'#2'S'#201#205#172'*'#250'Y'
+ +#142#219'TU'''#219'p<'#142#215'Uux'#127#220#166#147#2#238#238#165#148'j'#244
+ +#162#128#171#234#137#127#204'"'#129#255'0'#251#161#141#127'R'#215'B'#0'D'#196
+ +#23#23#236#130#252#183#205'/'#245#161'[H'#1#236'`'#148#0#0#0#0'IEND'#174'B`'
+ +#130
+]);
diff --git a/components/rx/version/v2.2_laz_1.2/images/rxdbgridexportspreadsheet.res b/components/rx/version/v2.2_laz_1.2/images/rxdbgridexportspreadsheet.res
new file mode 100644
index 000000000..b62312a42
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/images/rxdbgridexportspreadsheet.res differ
diff --git a/components/rx/version/v2.2_laz_1.2/images/rxspin_res.bat b/components/rx/version/v2.2_laz_1.2/images/rxspin_res.bat
new file mode 100644
index 000000000..ac11ec643
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/rxspin_res.bat
@@ -0,0 +1,2 @@
+del rxspin.lrs
+d:\lazarus\tools\lazres.exe rxspin.lrs rxspindown.png rxspinup.png
diff --git a/components/rx/version/v2.2_laz_1.2/images/tautopanel.xpm b/components/rx/version/v2.2_laz_1.2/images/tautopanel.xpm
new file mode 100644
index 000000000..bb75b3560
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/tautopanel.xpm
@@ -0,0 +1,32 @@
+/* XPM */
+static const unsigned char * tautopanel_xpm[] = {
+"24 24 5 1",
+" c None",
+"! c black",
+"# c #808080",
+"$ c white",
+"% c #FF0000",
+" ",
+" ",
+" ################### ",
+" #$$$$$$$$$$$$$$$$$ $ ",
+" #$ #$ ",
+" #$ #$ ",
+" #$ #$ ",
+" #$%% #$ ",
+" #% % % #$ ",
+" #% % % #$ ",
+" #% % % % %%% %%$ ",
+" #%%%% % % % % #% ",
+" #% % % % % % #% ",
+" #% % % % % % #% ",
+" #% % % % % % #% ",
+" #% % %%% %% %%$ ",
+" #$ #$ ",
+" #$ #$ ",
+" #$ #$ ",
+" #$ #$ ",
+" # #################$ ",
+" $$$$$$$$$$$$$$$$$$$ ",
+" ",
+" "};
\ No newline at end of file
diff --git a/components/rx/version/v2.2_laz_1.2/images/trxxpmanifest.xpm b/components/rx/version/v2.2_laz_1.2/images/trxxpmanifest.xpm
new file mode 100644
index 000000000..1dd31fa9f
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/trxxpmanifest.xpm
@@ -0,0 +1,36 @@
+/* XPM */
+static char *trxxpmanifest[]={
+"24 24 9 1",
+". c None",
+"# c #000000",
+"c c #000080",
+"a c #00ff00",
+"e c #9d9da1",
+"g c #e0dfe3",
+"b c #ff0000",
+"d c #ffff00",
+"f c #ffffff",
+"........................",
+"........................",
+"....##...##.####........",
+".....##.##..#####.......",
+"......###...##.##.......",
+"......###...#####.......",
+".....#####..####........",
+".....##.##..##..........",
+"....##...##.##..........",
+"........................",
+".####################...",
+".#aaaaaaaaaaaa#b#c#d#e..",
+".####################e..",
+".#ffffffffffffffffff#e..",
+".#ffffffffffffffffff#e..",
+".#ffffffffffffffffff#e..",
+".#ffffffffffffffffff#e..",
+".#ffffggggggfggggggf#e..",
+".#ffffgffff#fgffff#f#e..",
+".#ffffg#####fg#####f#e..",
+".#ffffffffffffffffff#e..",
+".####################e..",
+"..eeeeeeeeeeeeeeeeeeee..",
+"........................"};
diff --git a/components/rx/version/v2.2_laz_1.2/images/ttoolpanel.xpm b/components/rx/version/v2.2_laz_1.2/images/ttoolpanel.xpm
new file mode 100644
index 000000000..46c0e08b5
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/images/ttoolpanel.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char *TToolPanel[]={
+"24 24 10 1",
+". c None",
+"# c #000000",
+"h c #000080",
+"d c #0000ff",
+"f c #008000",
+"b c #808080",
+"c c #c0c0c0",
+"e c #ff0000",
+"g c #ff00ff",
+"a c #ffffff",
+"........................",
+"########################",
+"aaaaab#aaaaab#aaaaab#ccc",
+"accccb#accccb#accccb#ccc",
+"adeecb#afffcb#a#eecb#ccc",
+"adddcb#afggcb#ahhhcb#ccc",
+"accccb#accccb#accccb#ccc",
+"bbbbbb#bbbbbb#bbbbbb#ccc",
+"########################",
+"....................dd..",
+".#################.dddd.",
+".#a#ddddddddd#a#a#dddddd",
+".#################..dd..",
+".#ccccccccccccccc#..dd..",
+".#c####c#######cc#..dd..",
+".#c#aa#c#aaaaa#cc#..dd..",
+".#c#aa#c#aaaaa#cc#..dd..",
+".#c#aa#c#aaaaa#ddddddd..",
+".#c#aa#c#aaaaa#ddddddd..",
+".#c#aa#c#aaaaa#cc#......",
+".#c####c#######cc#......",
+".#ccccccccccccccc#......",
+".#################......",
+"........................"};
diff --git a/components/rx/version/v2.2_laz_1.2/languages/register_rxctrl.po b/components/rx/version/v2.2_laz_1.2/languages/register_rxctrl.po
new file mode 100644
index 000000000..1e423145e
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/languages/register_rxctrl.po
@@ -0,0 +1,11 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: register_rxctrl.sloadicon
+msgid "Load icon"
+msgstr ""
+
+#: register_rxctrl.stesttrxlogindialog
+msgid "Test TRxLoginDialog"
+msgstr ""
+
diff --git a/components/rx/version/v2.2_laz_1.2/languages/rxconst.es.po b/components/rx/version/v2.2_laz_1.2/languages/rxconst.es.po
new file mode 100644
index 000000000..8db36907f
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/languages/rxconst.es.po
@@ -0,0 +1,255 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: rxconst.sabout
+msgid "About"
+msgstr ""
+
+#: rxconst.sappversion
+msgid "Version : "
+msgstr ""
+
+#: rxconst.savaliablebuttons
+msgid "Avaliable buttons"
+msgstr "Botones disponibles"
+
+#: rxconst.sbrowse
+msgid "Browse"
+msgstr "Vista"
+
+#: rxconst.sbuilddate
+msgid "Build date : "
+msgstr ""
+
+#: rxconst.sbuttonalign
+msgid "Button align"
+msgstr "Alineaci?n de Botones"
+
+#: rxconst.sbuttonalign1
+msgid "None"
+msgstr "Ninguno"
+
+#: rxconst.sbuttonalign2
+msgid "Left"
+msgstr "Izquierdo"
+
+#: rxconst.sbuttonalign3
+msgid "Rignt"
+msgstr "Derecho"
+
+#: rxconst.scarbonwidgetset
+msgid "Carbon widget set"
+msgstr ""
+
+#: rxconst.scloseallexceptthis
+msgid "Close all except this"
+msgstr ""
+
+#: rxconst.scloseallwindows
+msgid "Close all windows"
+msgstr ""
+
+#: rxconst.sclosevaliderror
+msgid "Error. Expected vailes..."
+msgstr ""
+
+#: rxconst.sclosewindows
+msgid "Close window"
+msgstr ""
+
+#: rxconst.sdatedlgtitle
+msgid "Select a Date"
+msgstr "Seleccionar Fecha"
+
+#: rxconst.sdefaultfilter
+msgid "All files (*.*)|*.*"
+msgstr "Todos los Ficheros (*.*)|*.*"
+
+#: rxconst.sdetails
+msgid "Details"
+msgstr "Detalles"
+
+#: rxconst.sduallistcaption
+msgid "Dual list dialog"
+msgstr "Lista dialogo doble"
+
+#: rxconst.sduallistdestcaption
+msgid "Destination"
+msgstr "Destino"
+
+#: rxconst.sduallistsrccaption
+msgid "Source"
+msgstr "Fuente"
+
+#: rxconst.sexptcontrolnotfound
+msgid "Control not found in validate %s."
+msgstr ""
+
+#: rxconst.sfilenotexec
+msgid "File specified is not an executable file, dynamic-link library, or icon file"
+msgstr "Fichero especificado no es un fichero ejecutable, vinculo dinamico, o fichero de icono"
+
+#: rxconst.sfirsthalfofyear
+msgid "First half of year"
+msgstr ""
+
+#: rxconst.sfirstquarter
+msgid "First quarter"
+msgstr ""
+
+#: rxconst.sflatbuttons
+msgid "Flat buttons"
+msgstr "Botones planos"
+
+#: rxconst.sfourthquarter
+msgid "Fourth quarter"
+msgstr ""
+
+#: rxconst.sfpcversion
+msgid "FPC version : "
+msgstr ""
+
+#: rxconst.sfpguiwidgetset
+msgid "FpGUI widget set"
+msgstr ""
+
+#: rxconst.sgeneral
+msgid "General"
+msgstr ""
+
+#: rxconst.sgtk2widgetset
+msgid "GTK 2 widget set"
+msgstr ""
+
+#: rxconst.sgtkwidgetset
+msgid "GTK widget set"
+msgstr ""
+
+#: rxconst.shistorydesc
+msgid "History - \"%s\""
+msgstr ""
+
+#: rxconst.slclversion
+msgid "LCL Version: "
+msgstr ""
+
+#: rxconst.slicense
+msgid "License"
+msgstr ""
+
+#: rxconst.sloadliberror
+msgid "Could not load '%s' library"
+msgstr "No se puede cargar la libreria '%s'"
+
+#: rxconst.snextmonth
+msgid "Next Month|"
+msgstr "Proximo Mes|"
+
+#: rxconst.snextyear
+msgid "Next Year|"
+msgstr "Proximo A?o|"
+
+#: rxconst.snotimplemented
+msgid "Function not yet implemented"
+msgstr "Funcion no esta aun implementada"
+
+#: rxconst.soptions
+msgid "Options"
+msgstr "Opciones"
+
+#: rxconst.sotherguiwidgetset
+msgid "Other gui"
+msgstr ""
+
+#: rxconst.soutofrange
+msgid "Out of range %d %d %d %d"
+msgstr ""
+
+#: rxconst.sprevmonth
+msgid "Previous Month|"
+msgstr "Anterior Mes|"
+
+#: rxconst.sprevyear
+msgid "Previous Year|"
+msgstr "Anterior A?o|"
+
+#: rxconst.sqtwidgetset
+msgid "QT widget set"
+msgstr ""
+
+#: rxconst.sreqvalue
+msgid "Error. Expected value for filed %s."
+msgstr ""
+
+#: rxconst.ssecondhalfofyear
+msgid "Second half of year"
+msgstr ""
+
+#: rxconst.ssecondquarter
+msgid "Second quarter"
+msgstr ""
+
+#: rxconst.sshowcaption
+msgid "Show caption"
+msgstr "Mostrar titulo"
+
+#: rxconst.sshowhint
+msgid "Show hint"
+msgstr "Mostrar consejo"
+
+#: rxconst.stargetcpu
+msgid "Target CPU : "
+msgstr ""
+
+#: rxconst.stargetos
+msgid "Target OS : "
+msgstr ""
+
+#: rxconst.sthirdquarter
+msgid "Third quarter"
+msgstr ""
+
+#: rxconst.stocurdate
+msgid "Set current date"
+msgstr "Poner fecha actual"
+
+#: rxconst.stoolbarstyle
+msgid "Tool bar style"
+msgstr "Estilo Barra de Tarea"
+
+#: rxconst.stoolbarstyle1
+msgid "Standart"
+msgstr "Estandart"
+
+#: rxconst.stoolbarstyle2
+msgid "Windows XP"
+msgstr "Windows XP"
+
+#: rxconst.stoolbarstyle3
+msgid "Native"
+msgstr "Nativo"
+
+#: rxconst.stoolpanelsetup
+msgid "Tool panel setup"
+msgstr "Menu panel herramienta"
+
+#: rxconst.stransparent
+msgid "Transparent"
+msgstr "Transparente"
+
+#: rxconst.svisiblebuttons
+msgid "Visible buttons"
+msgstr "Botones visibles"
+
+#: rxconst.swin32_64widgetset
+msgid "Win32/Win64 widget set"
+msgstr ""
+
+#: rxconst.swincewidgetset
+msgid "WinCE widget set"
+msgstr ""
+
+#: rxconst.swindowsicofiles
+msgid "Windows Ico files (*.ico)|*.ico|All files (*.*)|*.*"
+msgstr "Windows Iconos Ficheros (*.ico)|*.ico)|Todos los ficheros (*.*)|*.*"
+
diff --git a/components/rx/version/v2.2_laz_1.2/languages/rxconst.po b/components/rx/version/v2.2_laz_1.2/languages/rxconst.po
new file mode 100644
index 000000000..a600210af
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/languages/rxconst.po
@@ -0,0 +1,255 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: rxconst.sabout
+msgid "About"
+msgstr ""
+
+#: rxconst.sappversion
+msgid "Version : "
+msgstr ""
+
+#: rxconst.savaliablebuttons
+msgid "Avaliable buttons"
+msgstr ""
+
+#: rxconst.sbrowse
+msgid "Browse"
+msgstr ""
+
+#: rxconst.sbuilddate
+msgid "Build date : "
+msgstr ""
+
+#: rxconst.sbuttonalign
+msgid "Button align"
+msgstr ""
+
+#: rxconst.sbuttonalign1
+msgid "None"
+msgstr ""
+
+#: rxconst.sbuttonalign2
+msgid "Left"
+msgstr ""
+
+#: rxconst.sbuttonalign3
+msgid "Rignt"
+msgstr ""
+
+#: rxconst.scarbonwidgetset
+msgid "Carbon widget set"
+msgstr ""
+
+#: rxconst.scloseallexceptthis
+msgid "Close all except this"
+msgstr ""
+
+#: rxconst.scloseallwindows
+msgid "Close all windows"
+msgstr ""
+
+#: rxconst.sclosevaliderror
+msgid "Error. Expected vailes..."
+msgstr ""
+
+#: rxconst.sclosewindows
+msgid "Close window"
+msgstr ""
+
+#: rxconst.sdatedlgtitle
+msgid "Select a Date"
+msgstr ""
+
+#: rxconst.sdefaultfilter
+msgid "All files (*.*)|*.*"
+msgstr ""
+
+#: rxconst.sdetails
+msgid "Details"
+msgstr ""
+
+#: rxconst.sduallistcaption
+msgid "Dual list dialog"
+msgstr ""
+
+#: rxconst.sduallistdestcaption
+msgid "Destination"
+msgstr ""
+
+#: rxconst.sduallistsrccaption
+msgid "Source"
+msgstr ""
+
+#: rxconst.sexptcontrolnotfound
+msgid "Control not found in validate %s."
+msgstr ""
+
+#: rxconst.sfilenotexec
+msgid "File specified is not an executable file, dynamic-link library, or icon file"
+msgstr ""
+
+#: rxconst.sfirsthalfofyear
+msgid "First half of year"
+msgstr ""
+
+#: rxconst.sfirstquarter
+msgid "First quarter"
+msgstr ""
+
+#: rxconst.sflatbuttons
+msgid "Flat buttons"
+msgstr ""
+
+#: rxconst.sfourthquarter
+msgid "Fourth quarter"
+msgstr ""
+
+#: rxconst.sfpcversion
+msgid "FPC version : "
+msgstr ""
+
+#: rxconst.sfpguiwidgetset
+msgid "FpGUI widget set"
+msgstr ""
+
+#: rxconst.sgeneral
+msgid "General"
+msgstr ""
+
+#: rxconst.sgtk2widgetset
+msgid "GTK 2 widget set"
+msgstr ""
+
+#: rxconst.sgtkwidgetset
+msgid "GTK widget set"
+msgstr ""
+
+#: rxconst.shistorydesc
+msgid "History - \"%s\""
+msgstr ""
+
+#: rxconst.slclversion
+msgid "LCL Version: "
+msgstr ""
+
+#: rxconst.slicense
+msgid "License"
+msgstr ""
+
+#: rxconst.sloadliberror
+msgid "Could not load '%s' library"
+msgstr ""
+
+#: rxconst.snextmonth
+msgid "Next Month|"
+msgstr ""
+
+#: rxconst.snextyear
+msgid "Next Year|"
+msgstr ""
+
+#: rxconst.snotimplemented
+msgid "Function not yet implemented"
+msgstr ""
+
+#: rxconst.soptions
+msgid "Options"
+msgstr ""
+
+#: rxconst.sotherguiwidgetset
+msgid "Other gui"
+msgstr ""
+
+#: rxconst.soutofrange
+msgid "Out of range %d %d %d %d"
+msgstr ""
+
+#: rxconst.sprevmonth
+msgid "Previous Month|"
+msgstr ""
+
+#: rxconst.sprevyear
+msgid "Previous Year|"
+msgstr ""
+
+#: rxconst.sqtwidgetset
+msgid "QT widget set"
+msgstr ""
+
+#: rxconst.sreqvalue
+msgid "Error. Expected value for filed %s."
+msgstr ""
+
+#: rxconst.ssecondhalfofyear
+msgid "Second half of year"
+msgstr ""
+
+#: rxconst.ssecondquarter
+msgid "Second quarter"
+msgstr ""
+
+#: rxconst.sshowcaption
+msgid "Show caption"
+msgstr ""
+
+#: rxconst.sshowhint
+msgid "Show hint"
+msgstr ""
+
+#: rxconst.stargetcpu
+msgid "Target CPU : "
+msgstr ""
+
+#: rxconst.stargetos
+msgid "Target OS : "
+msgstr ""
+
+#: rxconst.sthirdquarter
+msgid "Third quarter"
+msgstr ""
+
+#: rxconst.stocurdate
+msgid "Set current date"
+msgstr ""
+
+#: rxconst.stoolbarstyle
+msgid "Tool bar style"
+msgstr ""
+
+#: rxconst.stoolbarstyle1
+msgid "Standart"
+msgstr ""
+
+#: rxconst.stoolbarstyle2
+msgid "Windows XP"
+msgstr ""
+
+#: rxconst.stoolbarstyle3
+msgid "Native"
+msgstr ""
+
+#: rxconst.stoolpanelsetup
+msgid "Tool panel setup"
+msgstr ""
+
+#: rxconst.stransparent
+msgid "Transparent"
+msgstr ""
+
+#: rxconst.svisiblebuttons
+msgid "Visible buttons"
+msgstr ""
+
+#: rxconst.swin32_64widgetset
+msgid "Win32/Win64 widget set"
+msgstr ""
+
+#: rxconst.swincewidgetset
+msgid "WinCE widget set"
+msgstr ""
+
+#: rxconst.swindowsicofiles
+msgid "Windows Ico files (*.ico)|*.ico|All files (*.*)|*.*"
+msgstr ""
+
diff --git a/components/rx/version/v2.2_laz_1.2/languages/rxconst.ru.po b/components/rx/version/v2.2_laz_1.2/languages/rxconst.ru.po
new file mode 100644
index 000000000..d1e146d47
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/languages/rxconst.ru.po
@@ -0,0 +1,255 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: rxconst.sabout
+msgid "About"
+msgstr "О системе"
+
+#: rxconst.sappversion
+msgid "Version : "
+msgstr "Версия : "
+
+#: rxconst.savaliablebuttons
+msgid "Avaliable buttons"
+msgstr "Доступные кнопки"
+
+#: rxconst.sbrowse
+msgid "Browse"
+msgstr "Обзор"
+
+#: rxconst.sbuilddate
+msgid "Build date : "
+msgstr "Дата сборки : "
+
+#: rxconst.sbuttonalign
+msgid "Button align"
+msgstr "Выравнивание кнопок"
+
+#: rxconst.sbuttonalign1
+msgid "None"
+msgstr "Нет"
+
+#: rxconst.sbuttonalign2
+msgid "Left"
+msgstr "Влево"
+
+#: rxconst.sbuttonalign3
+msgid "Rignt"
+msgstr "Вправо"
+
+#: rxconst.scarbonwidgetset
+msgid "Carbon widget set"
+msgstr "Графический интерфейс Carbon"
+
+#: rxconst.scloseallexceptthis
+msgid "Close all except this"
+msgstr "Закрыть все окна, за исключением этого"
+
+#: rxconst.scloseallwindows
+msgid "Close all windows"
+msgstr "Закрыть все окна"
+
+#: rxconst.sclosevaliderror
+msgid "Error. Expected vailes..."
+msgstr "Ошибка. Ожидается значение..."
+
+#: rxconst.sclosewindows
+msgid "Close window"
+msgstr "Закрыть окно"
+
+#: rxconst.sdatedlgtitle
+msgid "Select a Date"
+msgstr "Выберите дату"
+
+#: rxconst.sdefaultfilter
+msgid "All files (*.*)|*.*"
+msgstr "Все файлы (*.*)|*.*"
+
+#: rxconst.sdetails
+msgid "Details"
+msgstr "Подробно"
+
+#: rxconst.sduallistcaption
+msgid "Dual list dialog"
+msgstr "Управление списками"
+
+#: rxconst.sduallistdestcaption
+msgid "Destination"
+msgstr "Выбор"
+
+#: rxconst.sduallistsrccaption
+msgid "Source"
+msgstr "Источник"
+
+#: rxconst.sexptcontrolnotfound
+msgid "Control not found in validate %s."
+msgstr "Элемент управления не найден в валидаторе %s"
+
+#: rxconst.sfilenotexec
+msgid "File specified is not an executable file, dynamic-link library, or icon file"
+msgstr "Указанный файл не исполняемый, не библиотека и не иконка"
+
+#: rxconst.sfirsthalfofyear
+msgid "First half of year"
+msgstr ""
+
+#: rxconst.sfirstquarter
+msgid "First quarter"
+msgstr ""
+
+#: rxconst.sflatbuttons
+msgid "Flat buttons"
+msgstr "Плавающие кнопки"
+
+#: rxconst.sfourthquarter
+msgid "Fourth quarter"
+msgstr ""
+
+#: rxconst.sfpcversion
+msgid "FPC version : "
+msgstr "Версия FPC : "
+
+#: rxconst.sfpguiwidgetset
+msgid "FpGUI widget set"
+msgstr "Графический интерфейс FpGUI"
+
+#: rxconst.sgeneral
+msgid "General"
+msgstr "Общее"
+
+#: rxconst.sgtk2widgetset
+msgid "GTK 2 widget set"
+msgstr "Графический интерфейс GTK 2"
+
+#: rxconst.sgtkwidgetset
+msgid "GTK widget set"
+msgstr "Графический интерфейс GTK"
+
+#: rxconst.shistorydesc
+msgid "History - \"%s\""
+msgstr ""
+
+#: rxconst.slclversion
+msgid "LCL Version: "
+msgstr "Версия LCL : "
+
+#: rxconst.slicense
+msgid "License"
+msgstr "Лицензия"
+
+#: rxconst.sloadliberror
+msgid "Could not load '%s' library"
+msgstr "Невозможно загрузить библиотеку '%s'"
+
+#: rxconst.snextmonth
+msgid "Next Month|"
+msgstr "Следующий месяц|"
+
+#: rxconst.snextyear
+msgid "Next Year|"
+msgstr "Следующий год|"
+
+#: rxconst.snotimplemented
+msgid "Function not yet implemented"
+msgstr "Функция не реализована"
+
+#: rxconst.soptions
+msgid "Options"
+msgstr "Параметры"
+
+#: rxconst.sotherguiwidgetset
+msgid "Other gui"
+msgstr "Неизвестный графический интерфейс"
+
+#: rxconst.soutofrange
+msgid "Out of range %d %d %d %d"
+msgstr ""
+
+#: rxconst.sprevmonth
+msgid "Previous Month|"
+msgstr "Превыдущий месяц|"
+
+#: rxconst.sprevyear
+msgid "Previous Year|"
+msgstr "Превыдущий год|"
+
+#: rxconst.sqtwidgetset
+msgid "QT widget set"
+msgstr "Графический интерфейс QT"
+
+#: rxconst.sreqvalue
+msgid "Error. Expected value for filed %s."
+msgstr "Поле %s. Требуется значение"
+
+#: rxconst.ssecondhalfofyear
+msgid "Second half of year"
+msgstr ""
+
+#: rxconst.ssecondquarter
+msgid "Second quarter"
+msgstr ""
+
+#: rxconst.sshowcaption
+msgid "Show caption"
+msgstr "Отображать заголовок"
+
+#: rxconst.sshowhint
+msgid "Show hint"
+msgstr "Отображать подсказки"
+
+#: rxconst.stargetcpu
+msgid "Target CPU : "
+msgstr "Целевой процессор : "
+
+#: rxconst.stargetos
+msgid "Target OS : "
+msgstr "Целевая ОС : "
+
+#: rxconst.sthirdquarter
+msgid "Third quarter"
+msgstr ""
+
+#: rxconst.stocurdate
+msgid "Set current date"
+msgstr "Установть текущую дату"
+
+#: rxconst.stoolbarstyle
+msgid "Tool bar style"
+msgstr "Стиль панели инструментов"
+
+#: rxconst.stoolbarstyle1
+msgid "Standart"
+msgstr "Стандартный"
+
+#: rxconst.stoolbarstyle2
+msgid "Windows XP"
+msgstr "Windows XP"
+
+#: rxconst.stoolbarstyle3
+msgid "Native"
+msgstr "Из текущей темы"
+
+#: rxconst.stoolpanelsetup
+msgid "Tool panel setup"
+msgstr "Настройка панели инструментов"
+
+#: rxconst.stransparent
+msgid "Transparent"
+msgstr "Прозрачно"
+
+#: rxconst.svisiblebuttons
+msgid "Visible buttons"
+msgstr "Отображаемые конпки"
+
+#: rxconst.swin32_64widgetset
+msgid "Win32/Win64 widget set"
+msgstr "Графический интерфейс Win32/Win64"
+
+#: rxconst.swincewidgetset
+msgid "WinCE widget set"
+msgstr "Графический интерфейс WinCE"
+
+#: rxconst.swindowsicofiles
+msgid "Windows Ico files (*.ico)|*.ico|All files (*.*)|*.*"
+msgstr "Файлы иконок Windows (*.ico)|*.ico|Все файлы (*.*)|*.*"
+
diff --git a/components/rx/version/v2.2_laz_1.2/languages/rxconst.uk.po b/components/rx/version/v2.2_laz_1.2/languages/rxconst.uk.po
new file mode 100644
index 000000000..fffd1100e
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/languages/rxconst.uk.po
@@ -0,0 +1,264 @@
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Project-Id-Version: \n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.4\n"
+
+#: rxconst.sabout
+msgid "About"
+msgstr "Про систему"
+
+#: rxconst.sappversion
+msgid "Version : "
+msgstr "Версія : "
+
+#: rxconst.savaliablebuttons
+msgid "Avaliable buttons"
+msgstr "Доступні кнопки"
+
+#: rxconst.sbrowse
+msgid "Browse"
+msgstr "Перегляд"
+
+#: rxconst.sbuilddate
+msgid "Build date : "
+msgstr "Збірка : "
+
+#: rxconst.sbuttonalign
+msgid "Button align"
+msgstr "Вирівнювання кнопок"
+
+#: rxconst.sbuttonalign1
+msgid "None"
+msgstr "Ні"
+
+#: rxconst.sbuttonalign2
+msgid "Left"
+msgstr "Ліворуч"
+
+#: rxconst.sbuttonalign3
+msgid "Rignt"
+msgstr "Праворуч"
+
+#: rxconst.scarbonwidgetset
+msgid "Carbon widget set"
+msgstr "Графічний інтерфейс Carbon"
+
+#: rxconst.scloseallexceptthis
+msgid "Close all except this"
+msgstr "Закрити всі вікна, за виключенням цього"
+
+#: rxconst.scloseallwindows
+msgid "Close all windows"
+msgstr "Закрити всі вікна"
+
+#: rxconst.sclosevaliderror
+msgid "Error. Expected vailes..."
+msgstr "Помилка. Очікується значеня..."
+
+#: rxconst.sclosewindows
+msgid "Close window"
+msgstr "Закрити вікно"
+
+#: rxconst.sdatedlgtitle
+msgid "Select a Date"
+msgstr "Выберіть дату"
+
+#: rxconst.sdefaultfilter
+msgid "All files (*.*)|*.*"
+msgstr "Всі файли (*.*)|*.*"
+
+#: rxconst.sdetails
+msgid "Details"
+msgstr "Детальніше"
+
+#: rxconst.sduallistcaption
+msgid "Dual list dialog"
+msgstr "Діалог з двома списками"
+
+#: rxconst.sduallistdestcaption
+msgid "Destination"
+msgstr "Призначення"
+
+#: rxconst.sduallistsrccaption
+msgid "Source"
+msgstr "Джерело"
+
+#: rxconst.sexptcontrolnotfound
+msgid "Control not found in validate %s."
+msgstr "Елемент управління не знайдений в валідаторі %s"
+
+#: rxconst.sfilenotexec
+msgid "File specified is not an executable file, dynamic-link library, or icon file"
+msgstr "Вказаний файл не виконуваний, не бібліотека і не іконка"
+
+#: rxconst.sfirsthalfofyear
+msgid "First half of year"
+msgstr ""
+
+#: rxconst.sfirstquarter
+msgid "First quarter"
+msgstr ""
+
+#: rxconst.sflatbuttons
+msgid "Flat buttons"
+msgstr "Плаваючі кнопки"
+
+#: rxconst.sfourthquarter
+msgid "Fourth quarter"
+msgstr ""
+
+#: rxconst.sfpcversion
+msgid "FPC version : "
+msgstr "Версія FPC : "
+
+#: rxconst.sfpguiwidgetset
+msgid "FpGUI widget set"
+msgstr "Набір віджетів FpGUI"
+
+#: rxconst.sgeneral
+msgid "General"
+msgstr "Загальне"
+
+#: rxconst.sgtk2widgetset
+msgid "GTK 2 widget set"
+msgstr "Набір віджетів GTK 2"
+
+#: rxconst.sgtkwidgetset
+msgid "GTK widget set"
+msgstr "Набір віджетів GTK"
+
+#: rxconst.shistorydesc
+msgid "History - \"%s\""
+msgstr "Історія - \"%s\""
+
+#: rxconst.slclversion
+msgid "LCL Version: "
+msgstr "Версія LCL : "
+
+#: rxconst.slicense
+msgid "License"
+msgstr "Ліцензія"
+
+#: rxconst.sloadliberror
+msgid "Could not load '%s' library"
+msgstr "Неможливо завантажити бібліотеку '%s'"
+
+#: rxconst.snextmonth
+msgid "Next Month|"
+msgstr "Слідуючий місяць|"
+
+#: rxconst.snextyear
+msgid "Next Year|"
+msgstr "Слідуючий рік|"
+
+#: rxconst.snotimplemented
+msgid "Function not yet implemented"
+msgstr "Функція не реалізована"
+
+#: rxconst.soptions
+msgid "Options"
+msgstr "Параметри"
+
+#: rxconst.sotherguiwidgetset
+msgid "Other gui"
+msgstr "Інші GUI"
+
+#: rxconst.soutofrange
+msgid "Out of range %d %d %d %d"
+msgstr ""
+
+#: rxconst.sprevmonth
+msgid "Previous Month|"
+msgstr "Попередній місяць|"
+
+#: rxconst.sprevyear
+msgid "Previous Year|"
+msgstr "Попередній місяць|"
+
+#: rxconst.sqtwidgetset
+msgid "QT widget set"
+msgstr "Набір віджетів QT"
+
+#: rxconst.sreqvalue
+msgid "Error. Expected value for filed %s."
+msgstr "Поле %s. Вимагається значення"
+
+#: rxconst.ssecondhalfofyear
+msgid "Second half of year"
+msgstr ""
+
+#: rxconst.ssecondquarter
+msgid "Second quarter"
+msgstr ""
+
+#: rxconst.sshowcaption
+msgid "Show caption"
+msgstr "Показати заголовок"
+
+#: rxconst.sshowhint
+msgid "Show hint"
+msgstr "Показувати підказку"
+
+#: rxconst.stargetcpu
+msgid "Target CPU : "
+msgstr "Цільовий CPU : "
+
+#: rxconst.stargetos
+msgid "Target OS : "
+msgstr "Цільова OS : "
+
+#: rxconst.sthirdquarter
+msgid "Third quarter"
+msgstr ""
+
+#: rxconst.stocurdate
+msgid "Set current date"
+msgstr "Встановити поточну дату"
+
+#: rxconst.stoolbarstyle
+msgid "Tool bar style"
+msgstr "Стиль панелі інструментів "
+
+#: rxconst.stoolbarstyle1
+msgid "Standart"
+msgstr "Стандартний"
+
+#: rxconst.stoolbarstyle2
+msgid "Windows XP"
+msgstr "Windows XP"
+
+#: rxconst.stoolbarstyle3
+msgid "Native"
+msgstr "З поточної теми"
+
+#: rxconst.stoolpanelsetup
+msgid "Tool panel setup"
+msgstr "Налаштування панелі інструментів"
+
+#: rxconst.stransparent
+msgid "Transparent"
+msgstr "Прозоро"
+
+#: rxconst.svisiblebuttons
+msgid "Visible buttons"
+msgstr "Видимі кнопки"
+
+#: rxconst.swin32_64widgetset
+msgid "Win32/Win64 widget set"
+msgstr "Набір віджетів Win32/Win64"
+
+#: rxconst.swincewidgetset
+msgid "WinCE widget set"
+msgstr "Набір віджетів WinCE"
+
+#: rxconst.swindowsicofiles
+msgid "Windows Ico files (*.ico)|*.ico|All files (*.*)|*.*"
+msgstr "Файли іконок Windows (*.ico)|*.ico|Всі файли (*.*)|*.*"
+
diff --git a/components/rx/version/v2.2_laz_1.2/languages/rxdconst.es.po b/components/rx/version/v2.2_laz_1.2/languages/rxdconst.es.po
new file mode 100644
index 000000000..d23a44240
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/languages/rxdconst.es.po
@@ -0,0 +1,575 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: rxdconst.sapptitlelabel
+msgid "Application \"%s\""
+msgstr "Aplicación \"%s\""
+
+#: rxdconst.sbottomcaption
+msgid "Bottom"
+msgstr ""
+
+#: rxdconst.sbrowsedata
+msgid "browse"
+msgstr "vista"
+
+#: rxdconst.scalcfieldsdata
+msgid "calc"
+msgstr "calc"
+
+#: rxdconst.scapturefilter
+msgid "Control locked by filter"
+msgstr "Control bloqueado por filtro"
+
+#: rxdconst.schangepassword
+msgid "Change password"
+msgstr "Cambiar clave"
+
+#: rxdconst.scirculardatalink
+msgid "SCircularDataLink"
+msgstr "SCircularEnlaceDato"
+
+#: rxdconst.sconfirmpasswordlabel
+msgid "&Confirm:"
+msgstr "&Confirmar:"
+
+#: rxdconst.sconfirmsave
+msgid "Data changed. Save?"
+msgstr "Dato cambiado. Salvar?"
+
+#: rxdconst.sdatabasename
+msgid "Database loocked: %s"
+msgstr "Base de Dato bloqueada: %s"
+
+#: rxdconst.sdatasourcefixed
+msgid "SDataSourceFixed"
+msgstr "SFuenteDatosFija"
+
+#: rxdconst.sdbcomboboxfieldnotassigned
+msgid "%s:TDBComboBox - DataField not assigned"
+msgstr ""
+
+#: rxdconst.sdbexceptcaption
+msgid "Error in DB engine"
+msgstr "Error in DB Motor"
+
+#: rxdconst.sdeletemultiplerecords
+msgid "Delete all selected records?"
+msgstr "Eliminar todos los registros seleccionados"
+
+#: rxdconst.sdeleterecordquestion
+msgid "Delete record?"
+msgstr "Eliminar registro"
+
+#: rxdconst.seditdata
+msgid "editing"
+msgstr "editando"
+
+#: rxdconst.serrormsglabel
+msgid "Error message"
+msgstr "Mensaje de error"
+
+#: rxdconst.sexportcellcolors
+msgid "Export cell colors"
+msgstr ""
+
+#: rxdconst.sexportcolumnfooter
+msgid "Export column footer"
+msgstr ""
+
+#: rxdconst.sexportcolumnheader
+msgid "Export column header"
+msgstr ""
+
+#: rxdconst.sexportfilename
+msgid "Export file name"
+msgstr ""
+
+#: rxdconst.sexprbadcompare
+msgid "Compare opertion need fielad and const"
+msgstr "Comparación operacion necesita fielad y const"
+
+#: rxdconst.sexprbadfield
+msgid "Field '%s' not used in filter expression"
+msgstr "Campo '%s' no usado en expresión de filtro"
+
+#: rxdconst.sexprbadnulltest
+#, fuzzy
+#| msgid "NULL-values enabled in '=' и '<>'"
+msgid "NULL-values enabled in '=' and '<>'"
+msgstr "Valor nulo habilitado en '=' y '<>'"
+
+#: rxdconst.sexprexpected
+msgid "Error %s"
+msgstr "Error %s"
+
+#: rxdconst.sexprincorrect
+msgid "Error in filter expression"
+msgstr "Error en expresión de filtro"
+
+#: rxdconst.sexprinvalidchar
+msgid "Error symbol in expression: '%s'"
+msgstr "Error simbolo en expresión: '%s'"
+
+#: rxdconst.sexprnameerror
+msgid "Error in filed name"
+msgstr "Error en nombre del fichero"
+
+#: rxdconst.sexprnorparen
+msgid "Error ')', error: %s"
+msgstr "Error ')', error: %s"
+
+#: rxdconst.sexprnotboolean
+msgid "Field '%s' is not boolean"
+msgstr "Campo '%s' no es boolean"
+
+#: rxdconst.sexprstringerror
+msgid "Error in string const"
+msgstr "Error en cadena const"
+
+#: rxdconst.sexprtermination
+msgid "Error in filter end"
+msgstr "Error en terminación del filtro"
+
+#: rxdconst.sfieldreadonly
+msgid "SFieldReadOnly %s"
+msgstr "SCampoSoloLectura %s"
+
+#: rxdconst.sfieldrequired
+msgid "Field '%s' must have a value"
+msgstr "Campo '%s' debe tener un valor"
+
+#: rxdconst.sfieldtypemismatch
+msgid "Type mismatch for field '%s', expecting: %s actual: %s"
+msgstr "Tipo no corresponde para el campo '%s', se esperaba: %s actual: %s"
+
+#: rxdconst.shidezerovalues
+msgid "Hide zero values"
+msgstr ""
+
+#: rxdconst.shintlabel
+msgid "Enter you user name and password"
+msgstr "Entre su nombre de usuario y clave"
+
+#: rxdconst.sinactivedata
+msgid "inactive"
+msgstr "inactivo"
+
+#: rxdconst.sinsertdata
+msgid "append"
+msgstr "adicionar"
+
+#: rxdconst.sinvaliddate
+msgid "Invalid Date"
+msgstr "fecha invalida"
+
+#: rxdconst.sinvalidfields
+msgid "No fields defined"
+msgstr "No hay campos definido"
+
+#: rxdconst.sinvalidusername
+msgid "User name or password not valid"
+msgstr "Nombre de usuario o clave no es valido"
+
+#: rxdconst.slandscape
+msgid "Landscape"
+msgstr ""
+
+#: rxdconst.sleftcaption
+msgid "Left"
+msgstr ""
+
+#: rxdconst.slocaldatabase
+msgid "Unable complete this operation on local dataset"
+msgstr "No se puede completar esta operación en el conjunto de datos local"
+
+#: rxdconst.smemnorecords
+msgid "No data found"
+msgstr "No hay datos"
+
+#: rxdconst.smore1
+msgid "&More >>"
+msgstr "&Mas >>"
+
+#: rxdconst.smore2
+msgid "&Less <<"
+msgstr "&Menos <<"
+
+#: rxdconst.snewpasswordlabel
+msgid "&New password:"
+msgstr "&Nueva clave:"
+
+#: rxdconst.snextbutton
+msgid "&Next"
+msgstr "&Proximo"
+
+#: rxdconst.snotcapturefilter
+msgid "Control need locked by filter"
+msgstr "Control necesita bloquearlo por filtro"
+
+#: rxdconst.snotediting
+msgid "Dataset not in edit or insert mode"
+msgstr "Conjunto de Datos no esta en modo de edición o inserción"
+
+#: rxdconst.soldpasswordlabel
+msgid "&Old password:"
+msgstr "&Anterior clave:"
+
+#: rxdconst.sopenafterexport
+msgid "Open after export"
+msgstr ""
+
+#: rxdconst.sorientation
+msgid "Orientation"
+msgstr ""
+
+#: rxdconst.soverwriteexisting
+msgid "Overwrite existing"
+msgstr ""
+
+#: rxdconst.spagemargins
+msgid "Page margins"
+msgstr ""
+
+#: rxdconst.spagename
+msgid "Page name"
+msgstr ""
+
+#: rxdconst.spasswordchanged
+msgid "Password changed"
+msgstr "Clave cambiada"
+
+#: rxdconst.spasswordlabel
+msgid "&Password:"
+msgstr "&Clave:"
+
+#: rxdconst.spasswordnotchanged
+msgid "Password not changed"
+msgstr "Clave no cambio"
+
+#: rxdconst.spasswordsmismatch
+msgid "New password and confirmation not equal"
+msgstr "Nueva clave y confirmacion no son iguales"
+
+#: rxdconst.sportrait
+msgid "Portrait"
+msgstr ""
+
+#: rxdconst.sprevbutton
+msgid "&Prior"
+msgstr "&Anterior"
+
+#: rxdconst.sprintgrid
+msgid "Print grid"
+msgstr ""
+
+#: rxdconst.sprintoptions
+msgid "Print options"
+msgstr ""
+
+#: rxdconst.spropdefbylookup
+msgid "PropDefByLookup"
+msgstr "PropDefByLookup"
+
+#: rxdconst.sregistration
+msgid "Register"
+msgstr "Registro"
+
+#: rxdconst.sreporttitle
+msgid "Report title"
+msgstr ""
+
+#: rxdconst.sretrylogin
+msgid "Retry to connect with database?"
+msgstr "Reintentar conectar con la base de dato?"
+
+#: rxdconst.srightcaption
+msgid "Right"
+msgstr ""
+
+#: rxdconst.srxallfields
+msgid "All fields"
+msgstr ""
+
+#: rxdconst.srxascendign
+msgid "Ascendign"
+msgstr "Ascendente"
+
+#: rxdconst.srxborrowstructure
+msgid "Borrow structure..."
+msgstr "Tomar estructura..."
+
+#: rxdconst.srxcopyonlymetadata
+msgid "Copy only metadata"
+msgstr "Copiar solo metadata"
+
+#: rxdconst.srxdbgridcopycellvalue
+msgid "Copy cell value"
+msgstr ""
+
+#: rxdconst.srxdbgridemptifilter
+msgid "(Empty)"
+msgstr "(Todos)"
+
+#: rxdconst.srxdbgridfilter
+msgid "Filter data"
+msgstr "Filtrar"
+
+#: rxdconst.srxdbgridfilterclear
+msgctxt "rxdconst.srxdbgridfilterclear"
+msgid "Clear filter"
+msgstr "Quitar Filtro"
+
+#: rxdconst.srxdbgridfiltersimple
+msgid "Filter in table"
+msgstr "Filtrar en Tabla"
+
+#: rxdconst.srxdbgridfind
+msgctxt "rxdconst.srxdbgridfind"
+msgid "Find data"
+msgstr "Buscar"
+
+#: rxdconst.srxdbgridfindcaption
+msgctxt "rxdconst.srxdbgridfindcaption"
+msgid "Find data"
+msgstr "Buscar"
+
+#: rxdconst.srxdbgridfindcasesens
+msgid "Case sensetive"
+msgstr "Caso sensitivo"
+
+#: rxdconst.srxdbgridfinddirecion
+msgid "Direction"
+msgstr "Dirección"
+
+#: rxdconst.srxdbgridfindonfield
+msgid "Find on field"
+msgstr "Buscar en campo"
+
+#: rxdconst.srxdbgridfindpartial
+msgid "Partial key"
+msgstr "Llave Parcial"
+
+#: rxdconst.srxdbgridfindrangeall
+msgid "All"
+msgstr "Todo"
+
+#: rxdconst.srxdbgridfindrangeback
+msgid "Backward"
+msgstr "Hacia Atras"
+
+#: rxdconst.srxdbgridfindrangeforw
+msgid "Forward"
+msgstr "Hacia Delante"
+
+#: rxdconst.srxdbgridfindtext
+msgid "Text to find"
+msgstr "Texto a Buscar"
+
+#: rxdconst.srxdbgridselapplycaption
+#, fuzzy
+msgctxt "rxdconst.srxdbgridselapplycaption"
+msgid "Apply"
+msgstr "Aceptar"
+
+#: rxdconst.srxdbgridselapplyhint
+msgid "Apply current columns setings"
+msgstr ""
+
+#: rxdconst.srxdbgridselcolcaption
+msgid "Grid columns"
+msgstr "Columnas de la Tabla"
+
+#: rxdconst.srxdbgridselcolhint1
+msgid "Move selected column up"
+msgstr "Mover columna seleccionada para arriba"
+
+#: rxdconst.srxdbgridselcolhint2
+msgid "Move selected column down"
+msgstr "Mover columna seleccionada para abajo"
+
+#: rxdconst.srxdbgridselectallrows
+msgid "Select all rows"
+msgstr ""
+
+#: rxdconst.srxdbgridselectcolumns
+msgid "Select visible collumns"
+msgstr "Seleccionar Columnas Visibles"
+
+#: rxdconst.srxdbgridsortbycolumns
+msgid "Sort data for collumns"
+msgstr "Ordenar por Columnas"
+
+#: rxdconst.srxdescending
+msgid "Descending"
+msgstr "Descendente"
+
+#: rxdconst.srxfieldslookupdisplay
+msgid "Fields as LookupDisplay"
+msgstr ""
+
+#: rxdconst.srxfillfieldslookupdisp
+msgid "Fill fields in LookupDisplay property"
+msgstr ""
+
+#: rxdconst.srxfillsortfieldsdisp
+msgid "Fill fields in SortField property"
+msgstr ""
+
+#: rxdconst.srxfilterformapply
+#, fuzzy
+msgctxt "rxdconst.srxfilterformapply"
+msgid "Apply"
+msgstr "Aceptar"
+
+#: rxdconst.srxfilterformcancel
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: rxdconst.srxfilterformcaption
+msgid "Filter conditions"
+msgstr "Condiciones de Filtro"
+
+#: rxdconst.srxfilterformclear
+msgctxt "rxdconst.srxfilterformclear"
+msgid "Clear filter"
+msgstr "Limpiar Todo"
+
+#: rxdconst.srxfilterformcondition
+msgid "Condition :"
+msgstr "Condición:"
+
+#: rxdconst.srxfilterformend
+msgid "end."
+msgstr "FIN."
+
+#: rxdconst.srxfilterformonfield
+msgid "On field :"
+msgstr "Campo :"
+
+#: rxdconst.srxfilterformoperaion
+msgid "Operation :"
+msgstr "Operación :"
+
+#: rxdconst.srxfilterformoperand
+msgid "Operand :"
+msgstr "Operando :"
+
+#: rxdconst.srxfilterformselectexp
+msgid "Enter filter expression for data in table:"
+msgstr "Seleccionar todos los registros que cumplan las siguientes condiciónes :"
+
+#: rxdconst.srxfindmore
+msgid "Find more"
+msgstr ""
+
+#: rxdconst.srxselectdatasetstruct
+msgid "Select dataset to copy to"
+msgstr "Seleccionar conjunto de datos para copiar"
+
+#: rxdconst.srxsortbyformaddfield
+msgid "&Add field"
+msgstr "&Adicionar"
+
+#: rxdconst.srxsortbyformallfields
+msgid "&Fields in dataset:"
+msgstr "&Orden de Ordenamiento :"
+
+#: rxdconst.srxsortbyformcaption
+msgid "Sort on field"
+msgstr "Ordenar por Columnas"
+
+#: rxdconst.srxsortbyformcaseinsens
+msgid "&Case insensitive sort"
+msgstr ""
+
+#: rxdconst.srxsortbyformmovednfield
+msgid "&Down"
+msgstr "A&bajo"
+
+#: rxdconst.srxsortbyformmoveupfield
+msgid "&Up"
+msgstr "A&rriba"
+
+#: rxdconst.srxsortbyformremovefield
+msgid "&Remove"
+msgstr "&Eliminar"
+
+#: rxdconst.srxsortbyformsortfields
+msgid "&Selected fields:"
+msgstr "&Campos Disponibles :"
+
+#: rxdconst.srxsortbyformsortorder
+#, fuzzy
+#| msgid "Select field for sort data:"
+msgid "Select f&ield for sort data:"
+msgstr "Seleccionar Dirección de Ordenamiento :"
+
+#: rxdconst.srxsortfieldsdisplay
+msgid "Fields as SortField"
+msgstr ""
+
+#: rxdconst.srxsoursedataset
+msgid "Sourse dataset"
+msgstr "Fuente del Conjunto de Datos"
+
+#: rxdconst.sservererrorlabel
+msgid "Server error"
+msgstr "Error del Servidor"
+
+#: rxdconst.ssetkeydata
+msgid "find"
+msgstr "buscar"
+
+#: rxdconst.sshowcolumnheaderonallpage
+msgid "Show column header on all page"
+msgstr ""
+
+#: rxdconst.sshowfooter
+msgid "Show footer"
+msgstr ""
+
+#: rxdconst.sshowfootercolor
+msgid "Show footer color"
+msgstr ""
+
+#: rxdconst.sshowgridcolor
+msgid "Show grid color"
+msgstr ""
+
+#: rxdconst.sshowreporttitle
+msgid "Show report title"
+msgstr ""
+
+#: rxdconst.sshowtitle
+msgid "Show column title"
+msgstr ""
+
+#: rxdconst.stoolsexportspeadsheet
+msgid "Export to speadsheet"
+msgstr ""
+
+#: rxdconst.stopcaption
+msgid "Top"
+msgstr ""
+
+#: rxdconst.sunknownfieldtype
+msgid "SUnknownFieldType %s"
+msgstr "STipoCampoDesconocido %s"
+
+#: rxdconst.sunknownxmldatasetformat
+msgid "Unknown XML Dataset format"
+msgstr ""
+
+#: rxdconst.sunlockcaption
+msgid "Unloock"
+msgstr "Desbloquear"
+
+#: rxdconst.sunlockhint
+msgid "Enter you password"
+msgstr "Entre su clave"
+
+#: rxdconst.susernamelabel
+msgid "&User name:"
+msgstr "&Nombre usuario:"
+
diff --git a/components/rx/version/v2.2_laz_1.2/languages/rxdconst.po b/components/rx/version/v2.2_laz_1.2/languages/rxdconst.po
new file mode 100644
index 000000000..6e7c01d91
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/languages/rxdconst.po
@@ -0,0 +1,569 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: rxdconst.sapptitlelabel
+msgid "Application \"%s\""
+msgstr ""
+
+#: rxdconst.sbottomcaption
+msgid "Bottom"
+msgstr ""
+
+#: rxdconst.sbrowsedata
+msgid "browse"
+msgstr ""
+
+#: rxdconst.scalcfieldsdata
+msgid "calc"
+msgstr ""
+
+#: rxdconst.scapturefilter
+msgid "Control locked by filter"
+msgstr ""
+
+#: rxdconst.schangepassword
+msgid "Change password"
+msgstr ""
+
+#: rxdconst.scirculardatalink
+msgid "SCircularDataLink"
+msgstr ""
+
+#: rxdconst.sconfirmpasswordlabel
+msgid "&Confirm:"
+msgstr ""
+
+#: rxdconst.sconfirmsave
+msgid "Data changed. Save?"
+msgstr ""
+
+#: rxdconst.sdatabasename
+msgid "Database loocked: %s"
+msgstr ""
+
+#: rxdconst.sdatasourcefixed
+msgid "SDataSourceFixed"
+msgstr ""
+
+#: rxdconst.sdbcomboboxfieldnotassigned
+msgid "%s:TDBComboBox - DataField not assigned"
+msgstr ""
+
+#: rxdconst.sdbexceptcaption
+msgid "Error in DB engine"
+msgstr ""
+
+#: rxdconst.sdeletemultiplerecords
+msgid "Delete all selected records?"
+msgstr ""
+
+#: rxdconst.sdeleterecordquestion
+msgid "Delete record?"
+msgstr ""
+
+#: rxdconst.seditdata
+msgid "editing"
+msgstr ""
+
+#: rxdconst.serrormsglabel
+msgid "Error message"
+msgstr ""
+
+#: rxdconst.sexportcellcolors
+msgid "Export cell colors"
+msgstr ""
+
+#: rxdconst.sexportcolumnfooter
+msgid "Export column footer"
+msgstr ""
+
+#: rxdconst.sexportcolumnheader
+msgid "Export column header"
+msgstr ""
+
+#: rxdconst.sexportfilename
+msgid "Export file name"
+msgstr ""
+
+#: rxdconst.sexprbadcompare
+msgid "Compare opertion need fielad and const"
+msgstr ""
+
+#: rxdconst.sexprbadfield
+msgid "Field '%s' not used in filter expression"
+msgstr ""
+
+#: rxdconst.sexprbadnulltest
+msgid "NULL-values enabled in '=' and '<>'"
+msgstr ""
+
+#: rxdconst.sexprexpected
+msgid "Error %s"
+msgstr ""
+
+#: rxdconst.sexprincorrect
+msgid "Error in filter expression"
+msgstr ""
+
+#: rxdconst.sexprinvalidchar
+msgid "Error symbol in expression: '%s'"
+msgstr ""
+
+#: rxdconst.sexprnameerror
+msgid "Error in filed name"
+msgstr ""
+
+#: rxdconst.sexprnorparen
+msgid "Error ')', error: %s"
+msgstr ""
+
+#: rxdconst.sexprnotboolean
+msgid "Field '%s' is not boolean"
+msgstr ""
+
+#: rxdconst.sexprstringerror
+msgid "Error in string const"
+msgstr ""
+
+#: rxdconst.sexprtermination
+msgid "Error in filter end"
+msgstr ""
+
+#: rxdconst.sfieldreadonly
+msgid "SFieldReadOnly %s"
+msgstr ""
+
+#: rxdconst.sfieldrequired
+msgid "Field '%s' must have a value"
+msgstr ""
+
+#: rxdconst.sfieldtypemismatch
+msgid "Type mismatch for field '%s', expecting: %s actual: %s"
+msgstr ""
+
+#: rxdconst.shidezerovalues
+msgid "Hide zero values"
+msgstr ""
+
+#: rxdconst.shintlabel
+msgid "Enter you user name and password"
+msgstr ""
+
+#: rxdconst.sinactivedata
+msgid "inactive"
+msgstr ""
+
+#: rxdconst.sinsertdata
+msgid "append"
+msgstr ""
+
+#: rxdconst.sinvaliddate
+msgid "Invalid Date"
+msgstr ""
+
+#: rxdconst.sinvalidfields
+msgid "No fields defined"
+msgstr ""
+
+#: rxdconst.sinvalidusername
+msgid "User name or password not valid"
+msgstr ""
+
+#: rxdconst.slandscape
+msgid "Landscape"
+msgstr ""
+
+#: rxdconst.sleftcaption
+msgid "Left"
+msgstr ""
+
+#: rxdconst.slocaldatabase
+msgid "Unable complete this operation on local dataset"
+msgstr ""
+
+#: rxdconst.smemnorecords
+msgid "No data found"
+msgstr ""
+
+#: rxdconst.smore1
+msgid "&More >>"
+msgstr ""
+
+#: rxdconst.smore2
+msgid "&Less <<"
+msgstr ""
+
+#: rxdconst.snewpasswordlabel
+msgid "&New password:"
+msgstr ""
+
+#: rxdconst.snextbutton
+msgid "&Next"
+msgstr ""
+
+#: rxdconst.snotcapturefilter
+msgid "Control need locked by filter"
+msgstr ""
+
+#: rxdconst.snotediting
+msgid "Dataset not in edit or insert mode"
+msgstr ""
+
+#: rxdconst.soldpasswordlabel
+msgid "&Old password:"
+msgstr ""
+
+#: rxdconst.sopenafterexport
+msgid "Open after export"
+msgstr ""
+
+#: rxdconst.sorientation
+msgid "Orientation"
+msgstr ""
+
+#: rxdconst.soverwriteexisting
+msgid "Overwrite existing"
+msgstr ""
+
+#: rxdconst.spagemargins
+msgid "Page margins"
+msgstr ""
+
+#: rxdconst.spagename
+msgid "Page name"
+msgstr ""
+
+#: rxdconst.spasswordchanged
+msgid "Password changed"
+msgstr ""
+
+#: rxdconst.spasswordlabel
+msgid "&Password:"
+msgstr ""
+
+#: rxdconst.spasswordnotchanged
+msgid "Password not changed"
+msgstr ""
+
+#: rxdconst.spasswordsmismatch
+msgid "New password and confirmation not equal"
+msgstr ""
+
+#: rxdconst.sportrait
+msgid "Portrait"
+msgstr ""
+
+#: rxdconst.sprevbutton
+msgid "&Prior"
+msgstr ""
+
+#: rxdconst.sprintgrid
+msgid "Print grid"
+msgstr ""
+
+#: rxdconst.sprintoptions
+msgid "Print options"
+msgstr ""
+
+#: rxdconst.spropdefbylookup
+msgid "PropDefByLookup"
+msgstr ""
+
+#: rxdconst.sregistration
+msgid "Register"
+msgstr ""
+
+#: rxdconst.sreporttitle
+msgid "Report title"
+msgstr ""
+
+#: rxdconst.sretrylogin
+msgid "Retry to connect with database?"
+msgstr ""
+
+#: rxdconst.srightcaption
+msgid "Right"
+msgstr ""
+
+#: rxdconst.srxallfields
+msgid "All fields"
+msgstr ""
+
+#: rxdconst.srxascendign
+msgid "Ascendign"
+msgstr ""
+
+#: rxdconst.srxborrowstructure
+msgid "Borrow structure..."
+msgstr ""
+
+#: rxdconst.srxcopyonlymetadata
+msgid "Copy only metadata"
+msgstr ""
+
+#: rxdconst.srxdbgridcopycellvalue
+msgid "Copy cell value"
+msgstr ""
+
+#: rxdconst.srxdbgridemptifilter
+msgid "(Empty)"
+msgstr ""
+
+#: rxdconst.srxdbgridfilter
+msgid "Filter data"
+msgstr ""
+
+#: rxdconst.srxdbgridfilterclear
+msgctxt "rxdconst.srxdbgridfilterclear"
+msgid "Clear filter"
+msgstr ""
+
+#: rxdconst.srxdbgridfiltersimple
+msgid "Filter in table"
+msgstr ""
+
+#: rxdconst.srxdbgridfind
+msgctxt "rxdconst.srxdbgridfind"
+msgid "Find data"
+msgstr ""
+
+#: rxdconst.srxdbgridfindcaption
+msgctxt "rxdconst.srxdbgridfindcaption"
+msgid "Find data"
+msgstr ""
+
+#: rxdconst.srxdbgridfindcasesens
+msgid "Case sensetive"
+msgstr ""
+
+#: rxdconst.srxdbgridfinddirecion
+msgid "Direction"
+msgstr ""
+
+#: rxdconst.srxdbgridfindonfield
+msgid "Find on field"
+msgstr ""
+
+#: rxdconst.srxdbgridfindpartial
+msgid "Partial key"
+msgstr ""
+
+#: rxdconst.srxdbgridfindrangeall
+msgid "All"
+msgstr ""
+
+#: rxdconst.srxdbgridfindrangeback
+msgid "Backward"
+msgstr ""
+
+#: rxdconst.srxdbgridfindrangeforw
+msgid "Forward"
+msgstr ""
+
+#: rxdconst.srxdbgridfindtext
+msgid "Text to find"
+msgstr ""
+
+#: rxdconst.srxdbgridselapplycaption
+msgctxt "rxdconst.srxdbgridselapplycaption"
+msgid "Apply"
+msgstr ""
+
+#: rxdconst.srxdbgridselapplyhint
+msgid "Apply current columns setings"
+msgstr ""
+
+#: rxdconst.srxdbgridselcolcaption
+msgid "Grid columns"
+msgstr ""
+
+#: rxdconst.srxdbgridselcolhint1
+msgid "Move selected column up"
+msgstr ""
+
+#: rxdconst.srxdbgridselcolhint2
+msgid "Move selected column down"
+msgstr ""
+
+#: rxdconst.srxdbgridselectallrows
+msgid "Select all rows"
+msgstr ""
+
+#: rxdconst.srxdbgridselectcolumns
+msgid "Select visible collumns"
+msgstr ""
+
+#: rxdconst.srxdbgridsortbycolumns
+msgid "Sort data for collumns"
+msgstr ""
+
+#: rxdconst.srxdescending
+msgid "Descending"
+msgstr ""
+
+#: rxdconst.srxfieldslookupdisplay
+msgid "Fields as LookupDisplay"
+msgstr ""
+
+#: rxdconst.srxfillfieldslookupdisp
+msgid "Fill fields in LookupDisplay property"
+msgstr ""
+
+#: rxdconst.srxfillsortfieldsdisp
+msgid "Fill fields in SortField property"
+msgstr ""
+
+#: rxdconst.srxfilterformapply
+msgctxt "rxdconst.srxfilterformapply"
+msgid "Apply"
+msgstr ""
+
+#: rxdconst.srxfilterformcancel
+msgid "Cancel"
+msgstr ""
+
+#: rxdconst.srxfilterformcaption
+msgid "Filter conditions"
+msgstr ""
+
+#: rxdconst.srxfilterformclear
+msgctxt "rxdconst.srxfilterformclear"
+msgid "Clear filter"
+msgstr ""
+
+#: rxdconst.srxfilterformcondition
+msgid "Condition :"
+msgstr ""
+
+#: rxdconst.srxfilterformend
+msgid "end."
+msgstr ""
+
+#: rxdconst.srxfilterformonfield
+msgid "On field :"
+msgstr ""
+
+#: rxdconst.srxfilterformoperaion
+msgid "Operation :"
+msgstr ""
+
+#: rxdconst.srxfilterformoperand
+msgid "Operand :"
+msgstr ""
+
+#: rxdconst.srxfilterformselectexp
+msgid "Enter filter expression for data in table:"
+msgstr ""
+
+#: rxdconst.srxfindmore
+msgid "Find more"
+msgstr ""
+
+#: rxdconst.srxselectdatasetstruct
+msgid "Select dataset to copy to"
+msgstr ""
+
+#: rxdconst.srxsortbyformaddfield
+msgid "&Add field"
+msgstr ""
+
+#: rxdconst.srxsortbyformallfields
+msgid "&Fields in dataset:"
+msgstr ""
+
+#: rxdconst.srxsortbyformcaption
+msgid "Sort on field"
+msgstr ""
+
+#: rxdconst.srxsortbyformcaseinsens
+msgid "&Case insensitive sort"
+msgstr ""
+
+#: rxdconst.srxsortbyformmovednfield
+msgid "&Down"
+msgstr ""
+
+#: rxdconst.srxsortbyformmoveupfield
+msgid "&Up"
+msgstr ""
+
+#: rxdconst.srxsortbyformremovefield
+msgid "&Remove"
+msgstr ""
+
+#: rxdconst.srxsortbyformsortfields
+msgid "&Selected fields:"
+msgstr ""
+
+#: rxdconst.srxsortbyformsortorder
+msgid "Select f&ield for sort data:"
+msgstr ""
+
+#: rxdconst.srxsortfieldsdisplay
+msgid "Fields as SortField"
+msgstr ""
+
+#: rxdconst.srxsoursedataset
+msgid "Sourse dataset"
+msgstr ""
+
+#: rxdconst.sservererrorlabel
+msgid "Server error"
+msgstr ""
+
+#: rxdconst.ssetkeydata
+msgid "find"
+msgstr ""
+
+#: rxdconst.sshowcolumnheaderonallpage
+msgid "Show column header on all page"
+msgstr ""
+
+#: rxdconst.sshowfooter
+msgid "Show footer"
+msgstr ""
+
+#: rxdconst.sshowfootercolor
+msgid "Show footer color"
+msgstr ""
+
+#: rxdconst.sshowgridcolor
+msgid "Show grid color"
+msgstr ""
+
+#: rxdconst.sshowreporttitle
+msgid "Show report title"
+msgstr ""
+
+#: rxdconst.sshowtitle
+msgid "Show column title"
+msgstr ""
+
+#: rxdconst.stoolsexportspeadsheet
+msgid "Export to speadsheet"
+msgstr ""
+
+#: rxdconst.stopcaption
+msgid "Top"
+msgstr ""
+
+#: rxdconst.sunknownfieldtype
+msgid "SUnknownFieldType %s"
+msgstr ""
+
+#: rxdconst.sunknownxmldatasetformat
+msgid "Unknown XML Dataset format"
+msgstr ""
+
+#: rxdconst.sunlockcaption
+msgid "Unloock"
+msgstr ""
+
+#: rxdconst.sunlockhint
+msgid "Enter you password"
+msgstr ""
+
+#: rxdconst.susernamelabel
+msgid "&User name:"
+msgstr ""
+
diff --git a/components/rx/version/v2.2_laz_1.2/languages/rxdconst.ru.po b/components/rx/version/v2.2_laz_1.2/languages/rxdconst.ru.po
new file mode 100644
index 000000000..d47c3f8a4
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/languages/rxdconst.ru.po
@@ -0,0 +1,573 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: rxdconst.sapptitlelabel
+msgid "Application \"%s\""
+msgstr "Программа \"%s\""
+
+#: rxdconst.sbottomcaption
+msgid "Bottom"
+msgstr ""
+
+#: rxdconst.sbrowsedata
+msgid "browse"
+msgstr "просмотр"
+
+#: rxdconst.scalcfieldsdata
+msgid "calc"
+msgstr "вычисление"
+
+#: rxdconst.scapturefilter
+msgid "Control locked by filter"
+msgstr "Элементы управления захвачены фильтром"
+
+#: rxdconst.schangepassword
+msgid "Change password"
+msgstr "Изменить пароль"
+
+#: rxdconst.scirculardatalink
+msgid "SCircularDataLink"
+msgstr "Перекрёстная ссылка данных"
+
+#: rxdconst.sconfirmpasswordlabel
+msgid "&Confirm:"
+msgstr "&Подтверждение:"
+
+#: rxdconst.sconfirmsave
+msgid "Data changed. Save?"
+msgstr "Данные были изменены. Сохранить?"
+
+#: rxdconst.sdatabasename
+msgid "Database loocked: %s"
+msgstr "База данных блокирована: %s"
+
+#: rxdconst.sdatasourcefixed
+msgid "SDataSourceFixed"
+msgstr ""
+
+#: rxdconst.sdbcomboboxfieldnotassigned
+msgid "%s:TDBComboBox - DataField not assigned"
+msgstr "%s:TDBComboBox - Не присвоено свойство DataField"
+
+#: rxdconst.sdbexceptcaption
+msgid "Error in DB engine"
+msgstr "Ошибка ядры БД"
+
+#: rxdconst.sdeletemultiplerecords
+msgid "Delete all selected records?"
+msgstr "Удалить все выделенные записи"
+
+#: rxdconst.sdeleterecordquestion
+msgid "Delete record?"
+msgstr "Удалить запись"
+
+#: rxdconst.seditdata
+msgid "editing"
+msgstr "редактирование"
+
+#: rxdconst.serrormsglabel
+msgid "Error message"
+msgstr "Сообщение об ошибке"
+
+#: rxdconst.sexportcellcolors
+msgid "Export cell colors"
+msgstr ""
+
+#: rxdconst.sexportcolumnfooter
+msgid "Export column footer"
+msgstr ""
+
+#: rxdconst.sexportcolumnheader
+msgid "Export column header"
+msgstr ""
+
+#: rxdconst.sexportfilename
+msgid "Export file name"
+msgstr ""
+
+#: rxdconst.sexprbadcompare
+msgid "Compare opertion need fielad and const"
+msgstr "Операции сравнения требуют наличия поля и константы"
+
+#: rxdconst.sexprbadfield
+msgid "Field '%s' not used in filter expression"
+msgstr "Поле '%s' не может быть использовано в выражении фильтрации"
+
+#: rxdconst.sexprbadnulltest
+#, fuzzy
+#| msgid "NULL-values enabled in '=' и '<>'"
+msgid "NULL-values enabled in '=' and '<>'"
+msgstr "NULL-значения разрешены только в выражениях '=' и '<>'"
+
+#: rxdconst.sexprexpected
+msgid "Error %s"
+msgstr "Ожидалось выражение, а встречено %s"
+
+#: rxdconst.sexprincorrect
+msgid "Error in filter expression"
+msgstr "Ошибка в выражении фильтра"
+
+#: rxdconst.sexprinvalidchar
+msgid "Error symbol in expression: '%s'"
+msgstr "Ошибочный символ в выражении: '%s'"
+
+#: rxdconst.sexprnameerror
+msgid "Error in filed name"
+msgstr "Ошибка в имени поля"
+
+#: rxdconst.sexprnorparen
+msgid "Error ')', error: %s"
+msgstr "Ожидалось ')', а встречено: %s"
+
+#: rxdconst.sexprnotboolean
+msgid "Field '%s' is not boolean"
+msgstr "Поле '%s' не логического типа"
+
+#: rxdconst.sexprstringerror
+msgid "Error in string const"
+msgstr "Ошибка в строковой константе"
+
+#: rxdconst.sexprtermination
+msgid "Error in filter end"
+msgstr "Ошибка в окончании выражения фильтра"
+
+#: rxdconst.sfieldreadonly
+msgid "SFieldReadOnly %s"
+msgstr "Поле %s только для чтения"
+
+#: rxdconst.sfieldrequired
+msgid "Field '%s' must have a value"
+msgstr "Поле '%s' ожидает значение"
+
+#: rxdconst.sfieldtypemismatch
+msgid "Type mismatch for field '%s', expecting: %s actual: %s"
+msgstr "Несоответсвие типов для поля '%s', необходимо: %s введено: %s"
+
+#: rxdconst.shidezerovalues
+msgid "Hide zero values"
+msgstr ""
+
+#: rxdconst.shintlabel
+msgid "Enter you user name and password"
+msgstr "Введите ваше имя и пароль"
+
+#: rxdconst.sinactivedata
+msgid "inactive"
+msgstr "не активный"
+
+#: rxdconst.sinsertdata
+msgid "append"
+msgstr "вставка"
+
+#: rxdconst.sinvaliddate
+msgid "Invalid Date"
+msgstr "Неверная дата"
+
+#: rxdconst.sinvalidfields
+msgid "No fields defined"
+msgstr "Нет объявления полей"
+
+#: rxdconst.sinvalidusername
+msgid "User name or password not valid"
+msgstr "Ошибка в имени пользователя или пароле"
+
+#: rxdconst.slandscape
+msgid "Landscape"
+msgstr ""
+
+#: rxdconst.sleftcaption
+msgid "Left"
+msgstr ""
+
+#: rxdconst.slocaldatabase
+msgid "Unable complete this operation on local dataset"
+msgstr "Невозможно произвести эту операцию с локальной базой данных"
+
+#: rxdconst.smemnorecords
+msgid "No data found"
+msgstr "Данных не найдено"
+
+#: rxdconst.smore1
+msgid "&More >>"
+msgstr "&Больше >>"
+
+#: rxdconst.smore2
+msgid "&Less <<"
+msgstr "&Меньше <<"
+
+#: rxdconst.snewpasswordlabel
+msgid "&New password:"
+msgstr "&Новый пароль:"
+
+#: rxdconst.snextbutton
+msgid "&Next"
+msgstr "&Дальше"
+
+#: rxdconst.snotcapturefilter
+msgid "Control need locked by filter"
+msgstr "Элементы управления должны быть захвачены фильтром"
+
+#: rxdconst.snotediting
+msgid "Dataset not in edit or insert mode"
+msgstr "Набор данных не в режиме редактирования или вставки"
+
+#: rxdconst.soldpasswordlabel
+msgid "&Old password:"
+msgstr "&Старый пароль"
+
+#: rxdconst.sopenafterexport
+msgid "Open after export"
+msgstr ""
+
+#: rxdconst.sorientation
+msgid "Orientation"
+msgstr ""
+
+#: rxdconst.soverwriteexisting
+msgid "Overwrite existing"
+msgstr ""
+
+#: rxdconst.spagemargins
+msgid "Page margins"
+msgstr ""
+
+#: rxdconst.spagename
+msgid "Page name"
+msgstr ""
+
+#: rxdconst.spasswordchanged
+msgid "Password changed"
+msgstr "Пароль изменён"
+
+#: rxdconst.spasswordlabel
+msgid "&Password:"
+msgstr "&Пароль:"
+
+#: rxdconst.spasswordnotchanged
+msgid "Password not changed"
+msgstr "Пароль не изменён"
+
+#: rxdconst.spasswordsmismatch
+msgid "New password and confirmation not equal"
+msgstr "Новый пароль и подтверждение не совпадают"
+
+#: rxdconst.sportrait
+msgid "Portrait"
+msgstr ""
+
+#: rxdconst.sprevbutton
+msgid "&Prior"
+msgstr "&Превыдущие"
+
+#: rxdconst.sprintgrid
+msgid "Print grid"
+msgstr ""
+
+#: rxdconst.sprintoptions
+msgid "Print options"
+msgstr ""
+
+#: rxdconst.spropdefbylookup
+msgid "PropDefByLookup"
+msgstr ""
+
+#: rxdconst.sregistration
+msgid "Register"
+msgstr "Регистрация"
+
+#: rxdconst.sreporttitle
+msgid "Report title"
+msgstr ""
+
+#: rxdconst.sretrylogin
+msgid "Retry to connect with database?"
+msgstr "Вы хотите повторить попытку соединения с базой данных?"
+
+#: rxdconst.srightcaption
+msgid "Right"
+msgstr ""
+
+#: rxdconst.srxallfields
+msgid "All fields"
+msgstr "Все поля"
+
+#: rxdconst.srxascendign
+msgid "Ascendign"
+msgstr "По возрастанию"
+
+#: rxdconst.srxborrowstructure
+msgid "Borrow structure..."
+msgstr "Обзор структуры..."
+
+#: rxdconst.srxcopyonlymetadata
+msgid "Copy only metadata"
+msgstr "Копировать только метаданные..."
+
+#: rxdconst.srxdbgridcopycellvalue
+msgid "Copy cell value"
+msgstr "Копировать значение ячейки"
+
+#: rxdconst.srxdbgridemptifilter
+msgid "(Empty)"
+msgstr "(Нет)"
+
+#: rxdconst.srxdbgridfilter
+msgid "Filter data"
+msgstr "Фильтр данных"
+
+#: rxdconst.srxdbgridfilterclear
+msgctxt "rxdconst.srxdbgridfilterclear"
+msgid "Clear filter"
+msgstr "Очистить фильтр"
+
+#: rxdconst.srxdbgridfiltersimple
+msgid "Filter in table"
+msgstr "Фильтр в таблице"
+
+#: rxdconst.srxdbgridfind
+msgctxt "rxdconst.srxdbgridfind"
+msgid "Find data"
+msgstr "Поиск данных"
+
+#: rxdconst.srxdbgridfindcaption
+msgctxt "rxdconst.srxdbgridfindcaption"
+msgid "Find data"
+msgstr "Поиск данных"
+
+#: rxdconst.srxdbgridfindcasesens
+msgid "Case sensetive"
+msgstr "Регистро-зависимо"
+
+#: rxdconst.srxdbgridfinddirecion
+msgid "Direction"
+msgstr "Направление"
+
+#: rxdconst.srxdbgridfindonfield
+msgid "Find on field"
+msgstr "Искать по полю"
+
+#: rxdconst.srxdbgridfindpartial
+msgid "Partial key"
+msgstr "Поиск по вхождению"
+
+#: rxdconst.srxdbgridfindrangeall
+msgid "All"
+msgstr "Всё"
+
+#: rxdconst.srxdbgridfindrangeback
+msgid "Backward"
+msgstr "Назад"
+
+#: rxdconst.srxdbgridfindrangeforw
+msgid "Forward"
+msgstr "Вперёд"
+
+#: rxdconst.srxdbgridfindtext
+msgid "Text to find"
+msgstr "Текст для поиска"
+
+#: rxdconst.srxdbgridselapplycaption
+#, fuzzy
+msgctxt "rxdconst.srxdbgridselapplycaption"
+msgid "Apply"
+msgstr "Применить"
+
+#: rxdconst.srxdbgridselapplyhint
+msgid "Apply current columns setings"
+msgstr ""
+
+#: rxdconst.srxdbgridselcolcaption
+msgid "Grid columns"
+msgstr "Поля таблицы"
+
+#: rxdconst.srxdbgridselcolhint1
+msgid "Move selected column up"
+msgstr "Переместить выбранное поле выше"
+
+#: rxdconst.srxdbgridselcolhint2
+msgid "Move selected column down"
+msgstr "Переместить выбранное поле ниже"
+
+#: rxdconst.srxdbgridselectallrows
+msgid "Select all rows"
+msgstr "Выделить все строки"
+
+#: rxdconst.srxdbgridselectcolumns
+msgid "Select visible collumns"
+msgstr "Выбор столбцов для отображения"
+
+#: rxdconst.srxdbgridsortbycolumns
+msgid "Sort data for collumns"
+msgstr "Сортировать данные по колонкам"
+
+#: rxdconst.srxdescending
+msgid "Descending"
+msgstr "По убыванию"
+
+#: rxdconst.srxfieldslookupdisplay
+msgid "Fields as LookupDisplay"
+msgstr "Поля в свойстве LookupDisplay"
+
+#: rxdconst.srxfillfieldslookupdisp
+msgid "Fill fields in LookupDisplay property"
+msgstr "Заполните список для поля LookupDisplay"
+
+#: rxdconst.srxfillsortfieldsdisp
+msgid "Fill fields in SortField property"
+msgstr "Заполните список для поля SortField"
+
+#: rxdconst.srxfilterformapply
+#, fuzzy
+msgctxt "rxdconst.srxfilterformapply"
+msgid "Apply"
+msgstr "Применить"
+
+#: rxdconst.srxfilterformcancel
+msgid "Cancel"
+msgstr "Отмена"
+
+#: rxdconst.srxfilterformcaption
+msgid "Filter conditions"
+msgstr "Выражение фильтра"
+
+#: rxdconst.srxfilterformclear
+msgctxt "rxdconst.srxfilterformclear"
+msgid "Clear filter"
+msgstr "Очистить фильтр"
+
+#: rxdconst.srxfilterformcondition
+msgid "Condition :"
+msgstr "Выражение :"
+
+#: rxdconst.srxfilterformend
+msgid "end."
+msgstr "конец."
+
+#: rxdconst.srxfilterformonfield
+msgid "On field :"
+msgstr "На поле :"
+
+#: rxdconst.srxfilterformoperaion
+msgid "Operation :"
+msgstr "Операция :"
+
+#: rxdconst.srxfilterformoperand
+msgid "Operand :"
+msgstr "Операнд :"
+
+#: rxdconst.srxfilterformselectexp
+msgid "Enter filter expression for data in table:"
+msgstr "Введите выражение фильтрации данных в таблице:"
+
+#: rxdconst.srxfindmore
+msgid "Find more"
+msgstr "Искать далее"
+
+#: rxdconst.srxselectdatasetstruct
+msgid "Select dataset to copy to"
+msgstr "Выберите таблицу для копирования"
+
+#: rxdconst.srxsortbyformaddfield
+msgid "&Add field"
+msgstr "&Добавить поле"
+
+#: rxdconst.srxsortbyformallfields
+msgid "&Fields in dataset:"
+msgstr "&Поля в таблице"
+
+#: rxdconst.srxsortbyformcaption
+msgid "Sort on field"
+msgstr "Сортировать по полям"
+
+#: rxdconst.srxsortbyformcaseinsens
+msgid "&Case insensitive sort"
+msgstr "&Сортировка без учёта регистра"
+
+#: rxdconst.srxsortbyformmovednfield
+msgid "&Down"
+msgstr "&Вниз"
+
+#: rxdconst.srxsortbyformmoveupfield
+msgid "&Up"
+msgstr "&Вверх"
+
+#: rxdconst.srxsortbyformremovefield
+msgid "&Remove"
+msgstr "&Убрать"
+
+#: rxdconst.srxsortbyformsortfields
+msgid "&Selected fields:"
+msgstr "&Выбранные поля"
+
+#: rxdconst.srxsortbyformsortorder
+msgid "Select f&ield for sort data:"
+msgstr "Укажите поля для сортировки данных :"
+
+#: rxdconst.srxsortfieldsdisplay
+msgid "Fields as SortField"
+msgstr ""
+
+#: rxdconst.srxsoursedataset
+msgid "Sourse dataset"
+msgstr "Исходная таблица"
+
+#: rxdconst.sservererrorlabel
+msgid "Server error"
+msgstr "Ошибка сервера"
+
+#: rxdconst.ssetkeydata
+msgid "find"
+msgstr "поиск"
+
+#: rxdconst.sshowcolumnheaderonallpage
+msgid "Show column header on all page"
+msgstr ""
+
+#: rxdconst.sshowfooter
+msgid "Show footer"
+msgstr ""
+
+#: rxdconst.sshowfootercolor
+msgid "Show footer color"
+msgstr ""
+
+#: rxdconst.sshowgridcolor
+msgid "Show grid color"
+msgstr ""
+
+#: rxdconst.sshowreporttitle
+msgid "Show report title"
+msgstr ""
+
+#: rxdconst.sshowtitle
+msgid "Show column title"
+msgstr ""
+
+#: rxdconst.stoolsexportspeadsheet
+msgid "Export to speadsheet"
+msgstr ""
+
+#: rxdconst.stopcaption
+msgid "Top"
+msgstr ""
+
+#: rxdconst.sunknownfieldtype
+msgid "SUnknownFieldType %s"
+msgstr "Не определён тип данных для поля %s"
+
+#: rxdconst.sunknownxmldatasetformat
+msgid "Unknown XML Dataset format"
+msgstr "Не известный формат XML данных"
+
+#: rxdconst.sunlockcaption
+msgid "Unloock"
+msgstr "Разблокировать"
+
+#: rxdconst.sunlockhint
+msgid "Enter you password"
+msgstr "Введите ваш пароль"
+
+#: rxdconst.susernamelabel
+msgid "&User name:"
+msgstr "&Имя пользователя"
+
diff --git a/components/rx/version/v2.2_laz_1.2/languages/rxdconst.uk.po b/components/rx/version/v2.2_laz_1.2/languages/rxdconst.uk.po
new file mode 100644
index 000000000..5ae57f6a5
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/languages/rxdconst.uk.po
@@ -0,0 +1,582 @@
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Project-Id-Version: \n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.4\n"
+
+#: rxdconst.sapptitlelabel
+msgid "Application \"%s\""
+msgstr "Програма \"%s\""
+
+#: rxdconst.sbottomcaption
+msgid "Bottom"
+msgstr ""
+
+#: rxdconst.sbrowsedata
+msgid "browse"
+msgstr "перегляд"
+
+#: rxdconst.scalcfieldsdata
+msgid "calc"
+msgstr "обчислення"
+
+#: rxdconst.scapturefilter
+msgid "Control locked by filter"
+msgstr "Елементи управління захоплені фільтром"
+
+#: rxdconst.schangepassword
+msgid "Change password"
+msgstr "Змінити пароль"
+
+#: rxdconst.scirculardatalink
+msgid "SCircularDataLink"
+msgstr "Перехресне посилання даних"
+
+#: rxdconst.sconfirmpasswordlabel
+msgid "&Confirm:"
+msgstr "&Підтвердження:"
+
+#: rxdconst.sconfirmsave
+msgid "Data changed. Save?"
+msgstr "Дані були змінені. Зберегти?"
+
+#: rxdconst.sdatabasename
+msgid "Database loocked: %s"
+msgstr "База даних блокована: %s"
+
+#: rxdconst.sdatasourcefixed
+msgid "SDataSourceFixed"
+msgstr ""
+
+#: rxdconst.sdbcomboboxfieldnotassigned
+msgid "%s:TDBComboBox - DataField not assigned"
+msgstr "%s:TDBComboBox - Не присвоєно властивість DataField"
+
+#: rxdconst.sdbexceptcaption
+msgid "Error in DB engine"
+msgstr "Помилка ядра БД"
+
+#: rxdconst.sdeletemultiplerecords
+msgid "Delete all selected records?"
+msgstr "Видалити всі виділені записи"
+
+#: rxdconst.sdeleterecordquestion
+msgid "Delete record?"
+msgstr "Видалити запис"
+
+#: rxdconst.seditdata
+msgid "editing"
+msgstr "Редагування"
+
+#: rxdconst.serrormsglabel
+msgid "Error message"
+msgstr "Повідомлення про помилку"
+
+#: rxdconst.sexportcellcolors
+msgid "Export cell colors"
+msgstr ""
+
+#: rxdconst.sexportcolumnfooter
+msgid "Export column footer"
+msgstr ""
+
+#: rxdconst.sexportcolumnheader
+msgid "Export column header"
+msgstr ""
+
+#: rxdconst.sexportfilename
+msgid "Export file name"
+msgstr ""
+
+#: rxdconst.sexprbadcompare
+msgid "Compare opertion need fielad and const"
+msgstr "Операції порівняння вимагають наявності поля і константи"
+
+#: rxdconst.sexprbadfield
+msgid "Field '%s' not used in filter expression"
+msgstr "Поле '%s' не може бути використане в виразі фільтрації"
+
+#: rxdconst.sexprbadnulltest
+#, fuzzy
+#| msgid "NULL-values enabled in '=' и '<>'"
+msgid "NULL-values enabled in '=' and '<>'"
+msgstr "NULL-значення дозволені тільки у виразах '=' і '<>'"
+
+#: rxdconst.sexprexpected
+msgid "Error %s"
+msgstr "Очікували вираз, а зустріли %s"
+
+#: rxdconst.sexprincorrect
+msgid "Error in filter expression"
+msgstr "Помилка у виразі фільтра"
+
+#: rxdconst.sexprinvalidchar
+msgid "Error symbol in expression: '%s'"
+msgstr "Помилковий символ у виразі: '%s'"
+
+#: rxdconst.sexprnameerror
+msgid "Error in filed name"
+msgstr "Помилка в імені поля"
+
+#: rxdconst.sexprnorparen
+msgid "Error ')', error: %s"
+msgstr "Очікували ')', а зустріли: %s"
+
+#: rxdconst.sexprnotboolean
+msgid "Field '%s' is not boolean"
+msgstr "Поле '%s' не логічного типу"
+
+#: rxdconst.sexprstringerror
+msgid "Error in string const"
+msgstr "Помилка в строковій константі"
+
+#: rxdconst.sexprtermination
+msgid "Error in filter end"
+msgstr "Помилка в закінченні виразу фільтра"
+
+#: rxdconst.sfieldreadonly
+msgid "SFieldReadOnly %s"
+msgstr "Поле %s лише для читання"
+
+#: rxdconst.sfieldrequired
+msgid "Field '%s' must have a value"
+msgstr "Поле '%s' очікує значення"
+
+#: rxdconst.sfieldtypemismatch
+msgid "Type mismatch for field '%s', expecting: %s actual: %s"
+msgstr "Несоответсвие типов для поля '%s', необходимо: %s введено: %s"
+
+#: rxdconst.shidezerovalues
+msgid "Hide zero values"
+msgstr ""
+
+#: rxdconst.shintlabel
+msgid "Enter you user name and password"
+msgstr "Введіть ваші ім'я користувача та пароль"
+
+#: rxdconst.sinactivedata
+msgid "inactive"
+msgstr "бездіяльний"
+
+#: rxdconst.sinsertdata
+msgid "append"
+msgstr "вставка"
+
+#: rxdconst.sinvaliddate
+msgid "Invalid Date"
+msgstr "Помилкова дата"
+
+#: rxdconst.sinvalidfields
+msgid "No fields defined"
+msgstr "Немає оголошення полів"
+
+#: rxdconst.sinvalidusername
+msgid "User name or password not valid"
+msgstr "Помилка в імені користувача або паролі"
+
+#: rxdconst.slandscape
+msgid "Landscape"
+msgstr ""
+
+#: rxdconst.sleftcaption
+msgid "Left"
+msgstr ""
+
+#: rxdconst.slocaldatabase
+msgid "Unable complete this operation on local dataset"
+msgstr "Неможливо провести цю операцію з локальною базою даних"
+
+#: rxdconst.smemnorecords
+msgid "No data found"
+msgstr "Даних не знайдено"
+
+#: rxdconst.smore1
+msgid "&More >>"
+msgstr "&Більше >>"
+
+#: rxdconst.smore2
+msgid "&Less <<"
+msgstr "&Менше <<"
+
+#: rxdconst.snewpasswordlabel
+msgid "&New password:"
+msgstr "&Новий пароль:"
+
+#: rxdconst.snextbutton
+msgid "&Next"
+msgstr "&Далі"
+
+#: rxdconst.snotcapturefilter
+msgid "Control need locked by filter"
+msgstr "Елементи управління повинні бути захоплені фільтром"
+
+#: rxdconst.snotediting
+msgid "Dataset not in edit or insert mode"
+msgstr "Набір даних не в режимі редагування або вставки"
+
+#: rxdconst.soldpasswordlabel
+msgid "&Old password:"
+msgstr "&Старий пароль"
+
+#: rxdconst.sopenafterexport
+msgid "Open after export"
+msgstr ""
+
+#: rxdconst.sorientation
+msgid "Orientation"
+msgstr ""
+
+#: rxdconst.soverwriteexisting
+msgid "Overwrite existing"
+msgstr ""
+
+#: rxdconst.spagemargins
+msgid "Page margins"
+msgstr ""
+
+#: rxdconst.spagename
+msgid "Page name"
+msgstr ""
+
+#: rxdconst.spasswordchanged
+msgid "Password changed"
+msgstr "Пароль змінено"
+
+#: rxdconst.spasswordlabel
+msgid "&Password:"
+msgstr "&Пароль:"
+
+#: rxdconst.spasswordnotchanged
+msgid "Password not changed"
+msgstr "Пароль не змінено"
+
+#: rxdconst.spasswordsmismatch
+msgid "New password and confirmation not equal"
+msgstr "Новий пароль і підтвердження не співпадають"
+
+#: rxdconst.sportrait
+msgid "Portrait"
+msgstr ""
+
+#: rxdconst.sprevbutton
+msgid "&Prior"
+msgstr "&Попередній"
+
+#: rxdconst.sprintgrid
+msgid "Print grid"
+msgstr ""
+
+#: rxdconst.sprintoptions
+msgid "Print options"
+msgstr ""
+
+#: rxdconst.spropdefbylookup
+msgid "PropDefByLookup"
+msgstr ""
+
+#: rxdconst.sregistration
+msgid "Register"
+msgstr "Реєстрація"
+
+#: rxdconst.sreporttitle
+msgid "Report title"
+msgstr ""
+
+#: rxdconst.sretrylogin
+msgid "Retry to connect with database?"
+msgstr "Ви хочете повторити спробу з'єднання з базою даних?"
+
+#: rxdconst.srightcaption
+msgid "Right"
+msgstr ""
+
+#: rxdconst.srxallfields
+msgid "All fields"
+msgstr ""
+
+#: rxdconst.srxascendign
+msgid "Ascendign"
+msgstr "По зростанню"
+
+#: rxdconst.srxborrowstructure
+msgid "Borrow structure..."
+msgstr "Огляд структури ..."
+
+#: rxdconst.srxcopyonlymetadata
+msgid "Copy only metadata"
+msgstr "Копіювати тільки метадані ..."
+
+#: rxdconst.srxdbgridcopycellvalue
+msgid "Copy cell value"
+msgstr ""
+
+#: rxdconst.srxdbgridemptifilter
+msgid "(Empty)"
+msgstr "(Немає)"
+
+#: rxdconst.srxdbgridfilter
+msgid "Filter data"
+msgstr "Фільтр даних"
+
+#: rxdconst.srxdbgridfilterclear
+msgctxt "rxdconst.srxdbgridfilterclear"
+msgid "Clear filter"
+msgstr "Очистити фільтр"
+
+#: rxdconst.srxdbgridfiltersimple
+msgid "Filter in table"
+msgstr "Фільтр в таблиці"
+
+#: rxdconst.srxdbgridfind
+msgctxt "rxdconst.srxdbgridfind"
+msgid "Find data"
+msgstr "Пошук даних"
+
+#: rxdconst.srxdbgridfindcaption
+msgctxt "rxdconst.srxdbgridfindcaption"
+msgid "Find data"
+msgstr "Пошук даних"
+
+#: rxdconst.srxdbgridfindcasesens
+msgid "Case sensetive"
+msgstr "Регістрозалежно"
+
+#: rxdconst.srxdbgridfinddirecion
+msgid "Direction"
+msgstr "Напрямок"
+
+#: rxdconst.srxdbgridfindonfield
+msgid "Find on field"
+msgstr "Шукати по полю"
+
+#: rxdconst.srxdbgridfindpartial
+msgid "Partial key"
+msgstr "Пошук по входженню"
+
+#: rxdconst.srxdbgridfindrangeall
+msgid "All"
+msgstr "Всі"
+
+#: rxdconst.srxdbgridfindrangeback
+msgid "Backward"
+msgstr "Назад"
+
+#: rxdconst.srxdbgridfindrangeforw
+msgid "Forward"
+msgstr "Вперед"
+
+#: rxdconst.srxdbgridfindtext
+msgid "Text to find"
+msgstr "Текст для пошуку"
+
+#: rxdconst.srxdbgridselapplycaption
+#, fuzzy
+msgctxt "rxdconst.srxdbgridselapplycaption"
+msgid "Apply"
+msgstr "Застосувати"
+
+#: rxdconst.srxdbgridselapplyhint
+msgid "Apply current columns setings"
+msgstr ""
+
+#: rxdconst.srxdbgridselcolcaption
+msgid "Grid columns"
+msgstr "Поля таблиці"
+
+#: rxdconst.srxdbgridselcolhint1
+msgid "Move selected column up"
+msgstr "Перемістити вибране поле вище"
+
+#: rxdconst.srxdbgridselcolhint2
+msgid "Move selected column down"
+msgstr "Перемістити вибране поле нижче"
+
+#: rxdconst.srxdbgridselectallrows
+msgid "Select all rows"
+msgstr "Виділити всі рядки"
+
+#: rxdconst.srxdbgridselectcolumns
+msgid "Select visible collumns"
+msgstr "Вибір стовпців для відображення"
+
+#: rxdconst.srxdbgridsortbycolumns
+msgid "Sort data for collumns"
+msgstr "Сортувати дані по колонках"
+
+#: rxdconst.srxdescending
+msgid "Descending"
+msgstr "За зменшенням"
+
+#: rxdconst.srxfieldslookupdisplay
+msgid "Fields as LookupDisplay"
+msgstr ""
+
+#: rxdconst.srxfillfieldslookupdisp
+msgid "Fill fields in LookupDisplay property"
+msgstr ""
+
+#: rxdconst.srxfillsortfieldsdisp
+msgid "Fill fields in SortField property"
+msgstr ""
+
+#: rxdconst.srxfilterformapply
+#, fuzzy
+msgctxt "rxdconst.srxfilterformapply"
+msgid "Apply"
+msgstr "Застосувати"
+
+#: rxdconst.srxfilterformcancel
+msgid "Cancel"
+msgstr "Скасувати"
+
+#: rxdconst.srxfilterformcaption
+msgid "Filter conditions"
+msgstr "Вираз фільтра"
+
+#: rxdconst.srxfilterformclear
+msgctxt "rxdconst.srxfilterformclear"
+msgid "Clear filter"
+msgstr "Очистити фільтр"
+
+#: rxdconst.srxfilterformcondition
+msgid "Condition :"
+msgstr "Вираз :"
+
+#: rxdconst.srxfilterformend
+msgid "end."
+msgstr "кінець."
+
+#: rxdconst.srxfilterformonfield
+msgid "On field :"
+msgstr "На поле :"
+
+#: rxdconst.srxfilterformoperaion
+msgid "Operation :"
+msgstr "Операція :"
+
+#: rxdconst.srxfilterformoperand
+msgid "Operand :"
+msgstr "Операнд :"
+
+#: rxdconst.srxfilterformselectexp
+msgid "Enter filter expression for data in table:"
+msgstr "Введіть вираз фільтрації даних в таблиці:"
+
+#: rxdconst.srxfindmore
+msgid "Find more"
+msgstr "Шукати далі"
+
+#: rxdconst.srxselectdatasetstruct
+msgid "Select dataset to copy to"
+msgstr "Виберіть таблицю для копіювання"
+
+#: rxdconst.srxsortbyformaddfield
+msgid "&Add field"
+msgstr "&Додати поле"
+
+#: rxdconst.srxsortbyformallfields
+msgid "&Fields in dataset:"
+msgstr "&Поля в таблиці"
+
+#: rxdconst.srxsortbyformcaption
+msgid "Sort on field"
+msgstr "Сортувати по полях"
+
+#: rxdconst.srxsortbyformcaseinsens
+msgid "&Case insensitive sort"
+msgstr "&Сортування без урахування регістра"
+
+#: rxdconst.srxsortbyformmovednfield
+msgid "&Down"
+msgstr "&Вниз"
+
+#: rxdconst.srxsortbyformmoveupfield
+msgid "&Up"
+msgstr "&Вгору"
+
+#: rxdconst.srxsortbyformremovefield
+msgid "&Remove"
+msgstr "&Видалити"
+
+#: rxdconst.srxsortbyformsortfields
+msgid "&Selected fields:"
+msgstr "&Вибрані поля"
+
+#: rxdconst.srxsortbyformsortorder
+msgid "Select f&ield for sort data:"
+msgstr "Вкажіть поля для сортування даних :"
+
+#: rxdconst.srxsortfieldsdisplay
+msgid "Fields as SortField"
+msgstr ""
+
+#: rxdconst.srxsoursedataset
+msgid "Sourse dataset"
+msgstr "Початкова таблиця"
+
+#: rxdconst.sservererrorlabel
+msgid "Server error"
+msgstr "Помилка сервера"
+
+#: rxdconst.ssetkeydata
+msgid "find"
+msgstr "Пошук"
+
+#: rxdconst.sshowcolumnheaderonallpage
+msgid "Show column header on all page"
+msgstr ""
+
+#: rxdconst.sshowfooter
+msgid "Show footer"
+msgstr ""
+
+#: rxdconst.sshowfootercolor
+msgid "Show footer color"
+msgstr ""
+
+#: rxdconst.sshowgridcolor
+msgid "Show grid color"
+msgstr ""
+
+#: rxdconst.sshowreporttitle
+msgid "Show report title"
+msgstr ""
+
+#: rxdconst.sshowtitle
+msgid "Show column title"
+msgstr ""
+
+#: rxdconst.stoolsexportspeadsheet
+msgid "Export to speadsheet"
+msgstr ""
+
+#: rxdconst.stopcaption
+msgid "Top"
+msgstr ""
+
+#: rxdconst.sunknownfieldtype
+msgid "SUnknownFieldType %s"
+msgstr "Не визначений тип даних для поля %s"
+
+#: rxdconst.sunknownxmldatasetformat
+msgid "Unknown XML Dataset format"
+msgstr "Не відомий формат XML даних"
+
+#: rxdconst.sunlockcaption
+msgid "Unloock"
+msgstr "Розблокувати"
+
+#: rxdconst.sunlockhint
+msgid "Enter you password"
+msgstr "Введіть ваш пароль"
+
+#: rxdconst.susernamelabel
+msgid "&User name:"
+msgstr "&Ім'я користувача"
+
diff --git a/components/rx/version/v2.2_laz_1.2/languages/rxmemds.po b/components/rx/version/v2.2_laz_1.2/languages/rxmemds.po
new file mode 100644
index 000000000..16582d7f9
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/languages/rxmemds.po
@@ -0,0 +1,11 @@
+msgid ""
+msgstr "Content-Type: text/plain; charset=UTF-8"
+
+#: rxmemds.sinvalidfields
+msgid "No fields defined"
+msgstr ""
+
+#: rxmemds.smemnorecords
+msgid "No data found"
+msgstr ""
+
diff --git a/components/rx/version/v2.2_laz_1.2/lib/WindowsXP.or b/components/rx/version/v2.2_laz_1.2/lib/WindowsXP.or
new file mode 100644
index 000000000..76b93ce42
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/lib/WindowsXP.or differ
diff --git a/components/rx/version/v2.2_laz_1.2/lib/readmy.txt b/components/rx/version/v2.2_laz_1.2/lib/readmy.txt
new file mode 100644
index 000000000..e6d2c9271
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/lib/readmy.txt
@@ -0,0 +1 @@
+don't remove file WindowsXP.or
\ No newline at end of file
diff --git a/components/rx/version/v2.2_laz_1.2/pagemngr.pas b/components/rx/version/v2.2_laz_1.2/pagemngr.pas
new file mode 100644
index 000000000..1954f37f2
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/pagemngr.pas
@@ -0,0 +1,350 @@
+{ pagemngr unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit pagemngr;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ComCtrls;
+
+const
+ pageNull = -1;
+ DefStatusMessage = 'Step %d from %d';
+
+type
+ TPageOwner = TPageControl;
+ TCheckPageEnabled = function (APageIndex:integer): Boolean of object;
+ TPageManagerOption = (pmoSetFormCaption, pmoSetInfoControl);
+ TPageManagerOptions = set of TPageManagerOption;
+ { TPageManager }
+
+ TPageManager = class(TComponent)
+ private
+ FNextBtn: TControl;
+ FOnCheckPageEnabled: TCheckPageEnabled;
+ FOnPageChanged: TNotifyEvent;
+ FOptions: TPageManagerOptions;
+ FPageOwner: TPageOwner;
+ FPriorBtn: TControl;
+ FSaveBtnNextClick: TNotifyEvent;
+ FSaveBtnPriorClick: TNotifyEvent;
+ FStatusControl: TControl;
+ FStatusMessage: string;
+ function GetPageCount: Integer;
+ function GetPageIndex: Integer;
+ procedure SetNextBtn(const AValue: TControl);
+ procedure SetOnCheckPageEnabled(const AValue: TCheckPageEnabled);
+ procedure SetOptions(const AValue: TPageManagerOptions);
+ procedure SetPageIndex(const AValue: Integer);
+ procedure SetPageOwner(const AValue: TPageOwner);
+ procedure SetPriorBtn(const AValue: TControl);
+ procedure BtnClickNext(Sender: TObject);
+ procedure BtnClickPrior(Sender: TObject);
+ procedure SetStatusControl(const AValue: TControl);
+ procedure SetStatusMessage(const AValue: string);
+ procedure SyncBtnNextClick(Sync: Boolean);
+ procedure SyncBtnPriorClick(Sync: Boolean);
+ protected
+ function GetPriorPageIndex(Page: Integer): Integer; virtual;
+ function GetNextPageIndex(Page: Integer): Integer; virtual;
+ procedure Loaded; override;
+ procedure Notification(AComponent: TComponent;
+ Operation: TOperation); override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ procedure CheckBtnEnabled;
+ procedure NextPage;
+ procedure PriorPage;
+ procedure PageChanged;virtual;
+ property PageCount: Integer read GetPageCount;
+ property PageIndex: Integer read GetPageIndex write SetPageIndex;
+ published
+ property PageOwner: TPageOwner read FPageOwner write SetPageOwner;
+ property NextBtn: TControl read FNextBtn write SetNextBtn;
+ property PriorBtn: TControl read FPriorBtn write SetPriorBtn;
+ property OnCheckPageEnabled:TCheckPageEnabled read FOnCheckPageEnabled write SetOnCheckPageEnabled;
+ property OnPageChanged: TNotifyEvent read FOnPageChanged write FOnPageChanged;
+ property Options:TPageManagerOptions read FOptions write SetOptions default [];
+ property StatusControl:TControl read FStatusControl write SetStatusControl;
+ property StatusMessage:string read FStatusMessage write SetStatusMessage;
+ end;
+
+implementation
+
+{ TPageManager }
+
+procedure TPageManager.SetNextBtn(const AValue: TControl);
+begin
+ if FNextBtn=AValue then exit;
+ SyncBtnNextClick(false);
+ FNextBtn:=AValue;
+ SyncBtnNextClick(true);
+end;
+
+function TPageManager.GetPageCount: Integer;
+begin
+ if Assigned(FPageOwner) then
+ Result := FPageOwner.PageCount
+ else
+ Result := 0;
+end;
+
+function TPageManager.GetPageIndex: Integer;
+begin
+ if Assigned(PageOwner) then Result := PageOwner.ActivePageIndex
+ else Result := pageNull;
+end;
+
+procedure TPageManager.SetOnCheckPageEnabled(const AValue: TCheckPageEnabled);
+begin
+ if FOnCheckPageEnabled=AValue then exit;
+ FOnCheckPageEnabled:=AValue;
+end;
+
+procedure TPageManager.SetOptions(const AValue: TPageManagerOptions);
+begin
+ if FOptions=AValue then exit;
+ FOptions:=AValue;
+end;
+
+procedure TPageManager.SetPageIndex(const AValue: Integer);
+begin
+ if Assigned(FPageOwner) and (FPageOwner.ActivePageIndex <> AValue) then
+ begin
+ FPageOwner.ActivePageIndex:=AValue;
+ PageChanged;
+ end;
+end;
+
+procedure TPageManager.SetPageOwner(const AValue: TPageOwner);
+begin
+ if FPageOwner=AValue then exit;
+ FPageOwner:=AValue;
+end;
+
+procedure TPageManager.SetPriorBtn(const AValue: TControl);
+begin
+ if FPriorBtn=AValue then exit;
+ SyncBtnPriorClick(false);
+ FPriorBtn:=AValue;
+ SyncBtnPriorClick(true);
+end;
+
+procedure TPageManager.BtnClickNext(Sender: TObject);
+begin
+ if Assigned(FPageOwner) then
+ begin
+ FPageOwner.ActivePageIndex:=GetNextPageIndex(FPageOwner.ActivePageIndex);
+ PageChanged;
+ end;
+end;
+
+procedure TPageManager.BtnClickPrior(Sender: TObject);
+begin
+ if Assigned(FPageOwner) then
+ begin
+ FPageOwner.ActivePageIndex:=GetPriorPageIndex(FPageOwner.ActivePageIndex);
+ PageChanged;
+ end;
+end;
+
+procedure TPageManager.SetStatusControl(const AValue: TControl);
+begin
+ if FStatusControl=AValue then exit;
+ FStatusControl:=AValue;
+end;
+
+procedure TPageManager.SetStatusMessage(const AValue: string);
+begin
+ if FStatusMessage=AValue then exit;
+ FStatusMessage:=AValue;
+end;
+
+procedure TPageManager.SyncBtnNextClick(Sync: Boolean);
+begin
+ if Assigned(FNextBtn) and not (csDesigning in ComponentState) then
+ begin
+ if Sync then
+ begin
+ FSaveBtnNextClick := FNextBtn.OnClick;
+ FNextBtn.OnClick := @BtnClickNext;
+ end
+ else
+ begin
+ FNextBtn.OnClick := FSaveBtnNextClick;
+ FSaveBtnNextClick := nil;
+ end;
+ end;
+end;
+
+procedure TPageManager.SyncBtnPriorClick(Sync: Boolean);
+begin
+ if Assigned(FPriorBtn) and not (csDesigning in ComponentState) then
+ begin
+ if Sync then
+ begin
+ FSaveBtnPriorClick := FPriorBtn.OnClick;
+ FPriorBtn.OnClick := @BtnClickPrior;
+ end
+ else
+ begin
+ FPriorBtn.OnClick := FSaveBtnPriorClick;
+ FSaveBtnPriorClick := nil;
+ end;
+ end;
+end;
+
+function TPageManager.GetPriorPageIndex(Page: Integer): Integer;
+begin
+ Result:=Page;
+ while Page > 0 do
+ begin
+ Dec(Page);
+ if Assigned(FOnCheckPageEnabled) then
+ begin
+ if FOnCheckPageEnabled(Page) then
+ break
+ else
+ if Page = 0 then
+ exit;
+ end
+ else
+ break;
+ end;
+ Result:=Page;
+end;
+
+function TPageManager.GetNextPageIndex(Page: Integer): Integer;
+begin
+ Result:=Page;
+ if not Assigned(FPageOwner) then exit;
+ while Page < FPageOwner.PageCount-1 do
+ begin
+ Inc(Page);
+ if Assigned(FOnCheckPageEnabled) then
+ begin
+ if FOnCheckPageEnabled(Page) then
+ break
+ else
+ if Page = FPageOwner.PageCount then
+ exit;
+ end
+ else
+ break;
+ end;
+ Result:=Page;
+end;
+
+procedure TPageManager.PageChanged;
+var
+ S:string;
+begin
+ if Assigned(OnPageChanged) then
+ OnPageChanged(Self);
+ if FStatusMessage <> '' then
+ begin
+ S:=Format(FStatusMessage, [PageIndex+1, PageCount]);
+ if (pmoSetFormCaption in Options) and Assigned(Owner) and (Owner is TCustomForm) then
+ TCustomForm(Owner).Caption:=S;
+ if (pmoSetInfoControl in Options) and Assigned(FStatusControl) then
+ FStatusControl.Caption:=S;
+ end;
+ CheckBtnEnabled;
+end;
+
+procedure TPageManager.Loaded;
+begin
+ inherited Loaded;
+ if not (csDesigning in ComponentState) then
+ begin
+ SyncBtnNextClick(true);
+ SyncBtnPriorClick(true);
+ PageChanged;
+ end;
+end;
+
+procedure TPageManager.Notification(AComponent: TComponent;
+ Operation: TOperation);
+begin
+ inherited Notification(AComponent, Operation);
+ if Operation = opRemove then
+ begin
+ if AComponent = FNextBtn then
+ begin
+ FNextBtn:=nil;
+ FSaveBtnNextClick:=nil;
+ end
+ else
+ if AComponent = FPriorBtn then
+ begin
+ FPriorBtn:=nil;
+ FSaveBtnPriorClick:=nil;
+ end
+ else
+ if AComponent = FPageOwner then
+ FPageOwner:=nil
+ else
+ if AComponent = FStatusControl then
+ FStatusControl:=nil;
+ end;
+end;
+
+constructor TPageManager.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FStatusMessage:=DefStatusMessage;
+end;
+
+procedure TPageManager.CheckBtnEnabled;
+var
+ P:integer;
+begin
+ P:=PageIndex;
+ if Assigned(FNextBtn) then
+ FNextBtn.Enabled:=GetNextPageIndex(P)>P;
+ if Assigned(FPriorBtn) then
+ FPriorBtn.Enabled:=GetPriorPageIndex(P)
0 then
+ begin
+ if not ((gdSelected in aState) and (gdFocused in aState)) then
+ begin
+ if (FDaysArray[ACol, ARow].DayDate = Date) and (FDaysArray[ACol, ARow].DayColor <> FNotInThisMonthColor) then
+ begin
+ R := ARect;
+ // Variant 1
+ //Dec(R.Bottom, 1);
+ //Dec(R.Right, 1);
+ //Canvas.Frame3d(R, 1, bvLowered);
+
+ // Variant 2
+ RxFrame3D(Canvas, R, clWindowFrame, clBtnHighlight, 1);
+ RxFrame3D(Canvas, R, clBtnShadow, clBtnFace, 1);
+ end;
+ Canvas.Font.Color:=FDaysArray[ACol, ARow].DayColor;
+ end
+ else
+ Canvas.Font.Color := clHighlightText // clWindow
+ ;
+ DrawCellText(ACol, ARow, ARect, AState, IntToStr(FDaysArray[ACol, ARow].DayNum));
+
+ end
+ else
+ begin
+ Canvas.Font.Color:=clWindowText;
+ //DrawCellText(ACol, ARow, ARect, AState, ShortDayNames[(Ord(StartOfWeek) + ACol) mod 7 + 1]);
+ if FShortDaysOfWeek <> nil then begin
+ if ACol <= FShortDaysOfWeek.Count - 1 then
+ DrawCellText(ACol, ARow, ARect, AState, FShortDaysOfWeek.Strings[(Ord(StartOfWeek) + ACol) mod 7]);
+ end;
+ end;
+end;
+
+procedure TCustomRxCalendar.KeyDown(var Key: Word; Shift: TShiftState);
+begin
+ if Shift = [] then
+ case Key of
+ VK_UP:
+ begin
+ DecWeek;
+ Exit;
+ end;
+ VK_DOWN:
+ begin
+ AddWeek;
+ Exit;
+ end;
+ VK_LEFT, VK_SUBTRACT:
+ begin
+ if (Day > 1) then Day := Day - 1
+ else CalendarDate := CalendarDate - 1;
+ Exit;
+ end;
+ VK_RIGHT, VK_ADD:
+ begin
+ if (Day < DaysThisMonth) then Day := Day + 1
+ else CalendarDate := CalendarDate + 1;
+ Exit;
+ end;
+ VK_PRIOR:
+ begin
+ ChangeMonth(-1);
+ Exit;
+ end;
+ VK_NEXT:
+ begin
+ ChangeMonth(+1);
+ Exit;
+ end;
+ end;
+ inherited KeyDown(Key, Shift);
+end;
+
+procedure TCustomRxCalendar.KeyPress(var Key: Char);
+begin
+ if Key in ['T', 't'] then begin
+ CalendarDate := Trunc(Now);
+ Key := #0;
+ end;
+ inherited KeyPress(Key);
+end;
+
+procedure TCustomRxCalendar.LMSize(var Message: TLMSize);
+var
+ GridLinesH, GridLinesW: Integer;
+begin
+ GridLinesH := 6 * GridLineWidth;
+ if (goVertLine in Options) or (goFixedVertLine in Options) then
+ GridLinesW := 6 * GridLineWidth
+ else GridLinesW := 0;
+ DefaultColWidth := (Message.Width - GridLinesW) div 7;
+ DefaultRowHeight := (Message.Height - GridLinesH) div 7;
+end;
+
+procedure TCustomRxCalendar.RxCalendarMouseWheelUp(Sender: TObject;
+ Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
+begin
+ DecWeek;
+ Handled := True;
+end;
+
+procedure TCustomRxCalendar.RxCalendarMouseWheelDown(Sender: TObject;
+ Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
+begin
+ AddWeek;
+ Handled := True;
+end;
+
+procedure TCustomRxCalendar.SetCalendarDate(Value: TDateTime);
+begin
+ if FDate <> Value then
+ begin
+ FDate := Value;
+ UpdateCalendar;
+ Change;
+ end;
+end;
+
+function TCustomRxCalendar.StoreCalendarDate: Boolean;
+begin
+ Result := not FUseCurrentDate;
+end;
+
+procedure TCustomRxCalendar.AddWeek;
+begin
+ if (Day + 7 <= DaysThisMonth) then
+ Day := Day + 7
+ else
+ CalendarDate := CalendarDate + 7;
+end;
+
+procedure TCustomRxCalendar.DecWeek;
+begin
+ if (Day - 7 >= 1) then
+ Day := Day - 7
+ else
+ CalendarDate := CalendarDate - 7;
+end;
+
+function TCustomRxCalendar.GetDateElement(Index: Integer): Integer;
+var
+ AYear, AMonth, ADay: Word;
+begin
+ DecodeDate(FDate, AYear, AMonth, ADay);
+ case Index of
+ 1: Result := AYear;
+ 2: Result := AMonth;
+ 3: Result := ADay;
+ else Result := -1;
+ end;
+end;
+
+procedure TCustomRxCalendar.FillDaysArray;
+var
+ x,y:integer;
+ DayNum: Integer;
+ FirstDate:TDateTime;
+ AYear, AMonth, ADay:Word;
+begin
+ DecodeDate(FDate, AYear, AMonth, ADay);
+ FirstDate := EncodeDate(AYear, AMonth, 1) + FMonthOffset-1;
+ DayNum:=FMonthOffset;
+ for y:=1 to 6 do
+ begin
+ for x:=0 to 6 do
+ begin
+ FDaysArray[x,y].DayDate:=FirstDate;
+ if DayNum < 1 then
+ begin
+ FDaysArray[x,y].DayColor:=FNotInThisMonthColor;
+ DecodeDate(FirstDate, AYear, AMonth, ADay);
+ FDaysArray[x,y].DayNum:=ADay;
+ end
+ else
+ if DayNum > DaysThisMonth then
+ begin
+ FDaysArray[x,y].DayColor:=FNotInThisMonthColor;
+ DecodeDate(FirstDate, AYear, AMonth, ADay);
+ FDaysArray[x,y].DayNum:=ADay;
+ end
+ else
+ begin
+ if IsWeekend(x, y) then
+ FDaysArray[x,y].DayColor:=WeekendColor
+ else
+ FDaysArray[x,y].DayColor:=clWindowText;
+ FDaysArray[x,y].DayNum:=DayNum;
+ end;
+ FirstDate:=FirstDate+1;
+ DayNum:=DayNum+1;
+ end;
+ end;
+end;
+
+procedure TCustomRxCalendar.UpdateShortDaysOfWeek;
+var
+ Ind: Integer;
+ OldNotify: TNotifyEvent;
+begin
+ if (FShortDaysOfWeek <> nil) and (FShortDaysOfWeek.Count = 0) then
+ begin
+ OldNotify := TStringList(FShortDaysOfWeek).OnChange;
+ TStringList(FShortDaysOfWeek).OnChange := nil;
+ for Ind := 1 to 7 do
+ FShortDaysOfWeek.Add(DefaultFormatSettings.ShortDayNames[Ind]);
+ TStringList(FShortDaysOfWeek).OnChange := OldNotify;
+ end;
+end;
+
+function TCustomRxCalendar.GetShortDaysOfWeek: TStrings;
+begin
+ Result := FShortDaysOfWeek;
+end;
+
+procedure TCustomRxCalendar.SetDateElement(Index: Integer; Value: Integer);
+var
+ AYear, AMonth, ADay: Word;
+begin
+ if Value > 0 then begin
+ DecodeDate(FDate, AYear, AMonth, ADay);
+ case Index of
+ 1: if AYear <> Value then AYear := Value else Exit;
+ 2: if (Value <= 12) and (Value <> AMonth) then begin
+ AMonth := Value;
+ if ADay > DaysPerMonth(Year, Value) then
+ ADay := DaysPerMonth(Year, Value);
+ end else Exit;
+ 3: if (Value <= DaysThisMonth) and (Value <> ADay) then
+ ADay := Value
+ else Exit;
+ else Exit;
+ end;
+ FDate := EncodeDate(AYear, AMonth, ADay);
+ FUseCurrentDate := False;
+ CalendarUpdate(Index = 3);
+ Change;
+ end;
+end;
+
+procedure TCustomRxCalendar.SetNotInThisMonthColor(const AValue: TColor);
+begin
+ if AValue <> FNotInThisMonthColor then
+ begin
+ FNotInThisMonthColor:=AValue;
+ FillDaysArray;
+ Invalidate;
+ end;
+end;
+
+procedure TCustomRxCalendar.SetShortDaysOfWeek(const AValue: TStrings);
+begin
+ if AValue.Text <> FShortDaysOfWeek.Text then begin
+ FShortDaysOfWeek.Assign(AValue);
+ Invalidate; //
+ end;
+end;
+
+procedure TCustomRxCalendar.SetWeekendColor(Value: TColor);
+begin
+ if Value <> FWeekendColor then
+ begin
+ FWeekendColor := Value;
+ FillDaysArray;
+ Invalidate;
+ end;
+end;
+
+procedure TCustomRxCalendar.SetWeekends(Value: TDaysOfWeek);
+begin
+ if Value <> FWeekends then
+ begin
+ FWeekends := Value;
+ UpdateCalendar;
+ end;
+end;
+
+function TCustomRxCalendar.IsWeekend(ACol, ARow: Integer): Boolean;
+begin
+ Result := TDayOfWeekName((Integer(StartOfWeek) + ACol) mod 7) in FWeekends;
+end;
+
+procedure TCustomRxCalendar.SetStartOfWeek(Value: TDayOfWeekName);
+begin
+ if Value <> FStartOfWeek then
+ begin
+ FStartOfWeek := Value;
+ UpdateCalendar;
+ end;
+end;
+
+procedure TCustomRxCalendar.SetUseCurrentDate(Value: Boolean);
+begin
+ if Value <> FUseCurrentDate then
+ begin
+ FUseCurrentDate := Value;
+ if Value then
+ begin
+ FDate := Date; { use the current date, then }
+ UpdateCalendar;
+ end;
+ end;
+end;
+
+{ Given a value of 1 or -1, moves to Next or Prev month accordingly }
+procedure TCustomRxCalendar.ChangeMonth(Delta: Integer);
+var
+ AYear, AMonth, ADay: Word;
+ NewDate: TDateTime;
+ CurDay: Integer;
+begin
+ DecodeDate(FDate, AYear, AMonth, ADay);
+ CurDay := ADay;
+ if Delta > 0 then ADay := DaysPerMonth(AYear, AMonth)
+ else ADay := 1;
+ NewDate := EncodeDate(AYear, AMonth, ADay);
+ NewDate := NewDate + Delta;
+ DecodeDate(NewDate, AYear, AMonth, ADay);
+ if DaysPerMonth(AYear, AMonth) > CurDay then
+ ADay := CurDay
+ else
+ ADay := DaysPerMonth(AYear, AMonth);
+ CalendarDate := EncodeDate(AYear, AMonth, ADay);
+end;
+
+procedure TCustomRxCalendar.PrevMonth;
+begin
+ ChangeMonth(-1);
+end;
+
+procedure TCustomRxCalendar.NextMonth;
+begin
+ ChangeMonth(1);
+end;
+
+procedure TCustomRxCalendar.NextYear;
+begin
+ if IsLeapYear(Year) and (Month = 2) and (Day = 29) then Day := 28;
+ Year := Year + 1;
+end;
+
+procedure TCustomRxCalendar.PrevYear;
+begin
+ if IsLeapYear(Year) and (Month = 2) and (Day = 29) then Day := 28;
+ Year := Year - 1;
+end;
+
+procedure TCustomRxCalendar.CalendarUpdate(DayOnly: Boolean);
+var
+ AYear, AMonth, ADay: Word;
+ FirstDate: TDateTime;
+begin
+ FUpdating := True;
+ try
+ DecodeDate(FDate, AYear, AMonth, ADay);
+ FirstDate := EncodeDate(AYear, AMonth, 1);
+ FMonthOffset := 2 - ((DayOfWeek(FirstDate) - Ord(StartOfWeek) + 7) mod 7);
+ { day of week for 1st of month }
+ if FMonthOffset = 2 then FMonthOffset := -5;
+
+ FillDaysArray;
+ MoveExtend(false, (ADay - FMonthOffset) mod 7, (ADay - FMonthOffset) div 7 + 1);
+ TopRow:=1; //Правим ошибку для автоскрола календаря после 15 числа...
+ VisualChange;
+
+ if DayOnly then Update else Invalidate;
+ finally
+ FUpdating := False;
+ end;
+end;
+
+procedure TCustomRxCalendar.UpdateCalendar;
+begin
+ CalendarUpdate(False);
+end;
+
+{ TLocCalendar }
+
+type
+ TLocCalendar = class(TCustomRxCalendar)
+ private
+ procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
+ procedure CMParentColorChanged(var Message: TMessage); message CM_PARENTCOLORCHANGED;
+ protected
+ procedure CreateParams(var Params: TCreateParams); override;
+ procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ procedure MouseToCell(X, Y: Integer; var ACol, ARow: Longint);
+ property GridLineWidth;
+ property DefaultColWidth;
+ property DefaultRowHeight;
+ end;
+
+constructor TLocCalendar.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ ControlStyle := [csCaptureMouse, csClickEvents, csDoubleClicks];
+ ControlStyle := ControlStyle + [csReplicatable];
+// Enabled := False;
+ BorderStyle := bsNone;
+ ParentColor := True;
+ CalendarDate := Trunc(Now);
+ UseCurrentDate := False;
+ FixedColor := Color;
+ Options := [goFixedHorzLine];
+ TabStop := False;
+end;
+
+procedure TLocCalendar.CMParentColorChanged(var Message: TMessage);
+begin
+ inherited;
+ if ParentColor then FixedColor := Self.Color;
+end;
+
+procedure TLocCalendar.CMEnabledChanged(var Message: TMessage);
+begin
+ if HandleAllocated and not (csDesigning in ComponentState) then
+// EnableWindow(Handle, True);
+end;
+
+procedure TLocCalendar.CreateParams(var Params: TCreateParams);
+begin
+ inherited CreateParams(Params);
+ with Params do
+ Style := Style and not (WS_BORDER or WS_TABSTOP or WS_DISABLED);
+end;
+
+procedure TLocCalendar.MouseToCell(X, Y: Integer; var ACol, ARow: Longint);
+var
+ Coord: TGridCoord;
+begin
+ Coord := MouseCoord(X, Y);
+ ACol := Coord.X;
+ ARow := Coord.Y;
+end;
+
+procedure TLocCalendar.DrawCell(ACol, ARow: Longint; ARect: TRect;
+ AState: TGridDrawState);
+var
+ D, M, Y: Word;
+begin
+ inherited DrawCell(ACol, ARow, ARect, AState);
+
+ if FDaysArray[ACol, ARow].DayDate = SysUtils.Date then
+ rxFrame3D(Canvas, ARect, clBtnShadow, clBtnHighlight, 1);
+end;
+
+
+function CreatePopupCalendar(AOwner: TComponent
+ {$IFDEF USED_BiDi}; ABiDiMode: TBiDiMode = bdLeftToRight {$ENDIF}): TPopupCalendar;
+begin
+ Result := TPopupCalendar.Create(AOwner);
+
+ if (AOwner <> nil) and not (csDesigning in AOwner.ComponentState) and
+ (Screen.PixelsPerInch <> 96) then
+ begin { scale to screen res }
+// Result.ScaleBy(Screen.PixelsPerInch, 96);
+ { The ScaleBy method does not scale the font well, so set the
+ font back to the original info. }
+ TPopupCalendar(Result).FCalendar.ParentFont := True;
+ FontSetDefault(TPopupCalendar(Result).Font);
+{$IFDEF USED_BiDi}
+ Result.BiDiMode := ABiDiMode;
+{$ENDIF}
+ end;
+end;
+
+procedure SetupPopupCalendar(PopupCalendar: TWinControl;
+ AStartOfWeek: TDayOfWeekName; AWeekends: TDaysOfWeek;
+ AWeekendColor: TColor; BtnHints: TStrings; FourDigitYear: Boolean);
+var
+ I: Integer;
+begin
+ if (PopupCalendar = nil) or not (PopupCalendar is TPopupCalendar) then
+ Exit;
+ TPopupCalendar(PopupCalendar).FFourDigitYear := FourDigitYear;
+ if TPopupCalendar(PopupCalendar).FCalendar <> nil then
+ begin
+ with TPopupCalendar(PopupCalendar).FCalendar do
+ begin
+ StartOfWeek := AStartOfWeek;
+ WeekendColor := AWeekendColor;
+ Weekends := AWeekends;
+ end;
+ if (BtnHints <> nil) then
+ for I := 0 to Min(BtnHints.Count - 1, 3) do
+ begin
+ if BtnHints[I] <> '' then
+ TPopupCalendar(PopupCalendar).FBtns[I].Hint := BtnHints[I];
+ end;
+ end;
+end;
+
+constructor TPopupCalendar.Create(AOwner: TComponent);
+const
+ BtnSide = 14;
+var
+ BackPanel: TWinControl;
+ MI:TMenuItem;
+ i:integer;
+ TmpBitmap:TBitmap;
+begin
+ inherited CreateNew(AOwner);
+
+ BorderStyle:=bsNone;
+
+ FFourDigitYear := FourDigitYear;
+ Height := Max(PopupCalendarSize.Y, 120);
+ Width := Max(PopupCalendarSize.X, 180);
+ Color := clBtnFace;
+ FontSetDefault(Font);
+ KeyPreview:=true;
+
+ if AOwner is TControl then ShowHint := TControl(AOwner).ShowHint
+ else ShowHint := True;
+
+// if (csDesigning in ComponentState) then Exit;
+
+ FMonthNames := TStringList.Create;
+ if FMonthNames.Count = 0 then
+ begin
+ for i := Low(DefaultFormatSettings.LongMonthNames) to High(DefaultFormatSettings.LongMonthNames) do
+ FMonthNames.Add(DefaultFormatSettings.LongMonthNames[i]);
+ end;
+
+ BackPanel := TPanel.Create(Self);
+ BackPanel.Anchors:=[akLeft, akRight, akTop, akBottom];
+
+ with BackPanel as TPanel do
+ begin
+ Parent := Self;
+// Align := alClient;
+ ParentColor := True;
+ ControlStyle := ControlStyle + [csReplicatable];
+ end;
+
+ FControlPanel := TPanel.Create(Self);
+ with FControlPanel do
+ begin
+ Parent := BackPanel;
+ Align := alTop;
+ Width := Self.Width - 4;
+ Height := 18;
+ BevelOuter := bvNone;
+ ParentColor := True;
+ ControlStyle := ControlStyle + [csReplicatable];
+ Color:=clSkyBlue;
+ end;
+
+ FCalendar := TLocCalendar.Create(Self);
+ with TLocCalendar(FCalendar) do
+ begin
+ Parent := BackPanel;
+ Align := alClient;
+ OnChange := @CalendarChange;
+ OnMouseUp := @CalendarMouseUp;
+ OnDblClick := @CalendarDblClick;
+ end;
+
+ FCloseBtn:=TBitBtn.Create(Self);
+ FCloseBtn.Parent := BackPanel;
+ FCloseBtn.Kind:=bkCancel;
+ FCloseBtn.Align:=alBottom;
+ FCloseBtn.AutoSize:=true;
+
+ BackPanel.Top:=2;
+ BackPanel.Left:=2;
+ BackPanel.Width:=Width - 4;
+
+ BackPanel.Height:=Height - 4;
+
+ FBtns[0] := TRxTimerSpeedButton.Create(Self);
+ with FBtns[0] do
+ begin
+ Parent := FControlPanel;
+ SetBounds(-1, -1, BtnSide, BtnSide);
+ //loaded bitmap should be freed as Glyph just takes a copy of it
+ TmpBitmap:=LoadBitmapFromLazarusResource('prev2');
+ Glyph := TmpBitmap;
+ FreeAndNil(TmpBitmap);
+
+ OnClick := @PrevYearBtnClick;
+ Hint := sPrevYear;
+ Align:=alLeft;
+ end;
+
+ FBtns[1] := TRxTimerSpeedButton.Create(Self);
+ with FBtns[1] do
+ begin
+ Parent := FControlPanel;
+ SetBounds(BtnSide - 2, -1, BtnSide, BtnSide);
+
+ TmpBitmap:=LoadBitmapFromLazarusResource('prev1');
+ Glyph := TmpBitmap;
+ FreeAndNil(TmpBitmap);
+
+ OnClick := @PrevMonthBtnClick;
+ Hint := sPrevMonth;
+ Align:=alLeft;
+ end;
+
+ FBtns[2] := TRxTimerSpeedButton.Create(Self);
+ with FBtns[2] do
+ begin
+ Parent := FControlPanel;
+ SetBounds(FControlPanel.Width - 2 * BtnSide + 2, -1, BtnSide, BtnSide);
+ TmpBitmap:=LoadBitmapFromLazarusResource('next1');
+ Glyph := TmpBitmap;
+ FreeAndNil(TmpBitmap);
+ OnClick := @NextMonthBtnClick;
+ Hint := sNextMonth;
+ Align:=alRight;
+ end;
+
+ FBtns[3] := TRxTimerSpeedButton.Create(Self);
+ with FBtns[3] do
+ begin
+ Parent := FControlPanel;
+ SetBounds(FControlPanel.Width - BtnSide + 1, -1, BtnSide, BtnSide);
+ TmpBitmap:=LoadBitmapFromLazarusResource('next2');
+ Glyph := TmpBitmap;
+ FreeAndNil(TmpBitmap);
+ OnClick := @NextYearBtnClick;
+ Hint := sNextYear;
+ Align:=alRight;
+ end;
+
+ FTitleLabel := TLabel.Create(Self);
+ with FTitleLabel do
+ begin
+ Parent := FControlPanel;
+ AutoSize := False;
+ Alignment := taCenter;
+ SetBounds(BtnSide * 2 + 1, 1, FControlPanel.Width - 4 * BtnSide - 2, 14);
+ Transparent := True;
+ OnDblClick := @TopPanelDblClick;
+ ControlStyle := ControlStyle + [csReplicatable];
+ Align:=alClient;
+ end;
+
+ FMonthMenu:=CreateRxCalendarPopupMenu(Self, @MonthMenuClick);
+
+ FTitleLabel.PopupMenu:=FMonthMenu;
+ ActiveControl:=FCalendar;
+ CalendarChange(nil);
+end;
+
+destructor TPopupCalendar.Destroy;
+begin
+ FMonthNames.Free;
+ inherited Destroy;
+end;
+
+procedure TPopupCalendar.AutoSizeForm;
+begin
+ FControlPanel.Height:=FCalendar.Canvas.TextHeight('Wg')+4;
+ Height:=(FCalendar.Canvas.TextHeight('Wg')+4)*7+FControlPanel.Height + FCloseBtn.Height;
+ Width:=FCalendar.Canvas.TextWidth(' WWW')*7;
+ FCalendar.AutoFillColumns:=true;
+end;
+
+procedure TPopupCalendar.CalendarMouseUp(Sender: TObject; Button: TMouseButton;
+ Shift: TShiftState; X, Y: Integer);
+var
+ Col, Row: Longint;
+begin
+ if (Button = mbLeft) and (Shift = []) then
+ begin
+ TLocCalendar(FCalendar).MouseToCell(X, Y, Col, Row);
+ if (Row > 0) and (FCalendar.FDaysArray[Col, Row].DayColor <> FCalendar.FNotInThisMonthColor) then
+ ModalResult:=mrOk;
+ end;
+end;
+
+function TPopupCalendar.GetDate: TDateTime;
+begin
+ Result:=FCalendar.CalendarDate;
+end;
+
+procedure TPopupCalendar.TopPanelDblClick(Sender: TObject);
+begin
+ FCalendar.CalendarDate := Trunc(Now);
+end;
+
+procedure TPopupCalendar.MonthMenuClick(Sender: TObject);
+var
+ Cmd:integer;
+begin
+ Cmd:=(Sender as TComponent).Tag;
+ if Cmd = -1 then
+ FCalendar.SetCalendarDate(Sysutils.Date)
+ else
+ FCalendar.Month:=Cmd;
+end;
+
+procedure TPopupCalendar.CalendarDblClick(Sender: TObject);
+begin
+ ModalResult:=mrOk;
+end;
+
+procedure TPopupCalendar.KeyDown(var Key: Word; Shift: TShiftState);
+begin
+ if FCalendar <> nil then
+ case Key of
+ VK_NEXT:
+ begin
+ if ssCtrl in Shift then FCalendar.NextYear;
+ end;
+ VK_PRIOR:
+ begin
+ if ssCtrl in Shift then FCalendar.PrevYear;
+ end;
+ VK_ESCAPE:ModalResult:=mrCancel;
+ end;
+ inherited KeyDown(Key, Shift);
+end;
+
+procedure TPopupCalendar.KeyPress(var Key: Char);
+begin
+ inherited KeyPress(Key);
+ if (FCalendar <> nil) and (Key <> #0) then
+ FCalendar.KeyPress(Key);
+end;
+
+procedure TPopupCalendar.Paint;
+var
+ CR:TRect;
+begin
+ inherited Paint;
+
+ CR:=ClientRect;
+ RxFrame3D(Canvas, CR, clBtnHighlight, clWindowFrame, 1);
+ RxFrame3D(Canvas, CR, clBtnFace, clBtnShadow, 1);
+end;
+
+procedure TPopupCalendar.Deactivate;
+begin
+ inherited Deactivate;
+{ if Assigned(FOnPopUpCloseEvent) then
+ FOnPopUpCloseEvent(FFindResult);}
+// Close;
+end;
+
+procedure TPopupCalendar.PrevYearBtnClick(Sender: TObject);
+begin
+ FCalendar.PrevYear;
+ FCalendar.SetFocus;
+end;
+
+procedure TPopupCalendar.NextYearBtnClick(Sender: TObject);
+begin
+ FCalendar.NextYear;
+ FCalendar.SetFocus;
+end;
+
+procedure TPopupCalendar.PrevMonthBtnClick(Sender: TObject);
+begin
+ FCalendar.PrevMonth;
+ FCalendar.SetFocus;
+end;
+
+procedure TPopupCalendar.NextMonthBtnClick(Sender: TObject);
+begin
+ FCalendar.NextMonth;
+ FCalendar.SetFocus;
+end;
+
+procedure TPopupCalendar.CalendarChange(Sender: TObject);
+var
+ AYear, AMonth, ADay: Word;
+begin
+ DecodeDate(FCalendar.CalendarDate, AYear, AMonth, ADay);
+ FTitleLabel.Caption := Format('%s, %d', [DefaultFormatSettings.LongMonthNames[AMonth], AYear]);
+end;
+
+procedure TPopupCalendar.SetDate(const AValue: TDateTime);
+begin
+ FCalendar.CalendarDate:=AValue;
+end;
+
+procedure TPopupCalendar.SetMonthNames(const AValue: TStrings);
+begin
+ if AValue.Text <> FMonthNames.Text then
+ begin
+ FMonthNames.Assign(AValue);
+ CalendarChange(Self);
+ end;
+end;
+
+ { TSelectDateDlg }
+
+constructor TSelectDateDlg.Create(AOwner: TComponent);
+var
+ Control: TWinControl;
+ MI:TMenuItem;
+ i:integer;
+ TmpBitmap:TBitmap;
+begin
+ inherited CreateNew(AOwner, 0);
+ Caption := sDateDlgTitle;
+
+ BorderStyle := bsToolWindow;
+
+ BorderIcons := [biSystemMenu];
+ ClientHeight := 154;
+ ClientWidth := 222;
+ FontSetDefault(Font);
+ Color := clBtnFace;
+ Position := poScreenCenter;
+ ShowHint := True;
+ KeyPreview := True;
+
+ Control := TPanel.Create(Self);
+ with Control as TPanel do
+ begin
+ Parent := Self;
+ SetBounds(0, 0, 222, 22);
+ Align := alTop;
+ BevelInner := bvLowered;
+ ParentColor := True;
+ ParentFont := True;
+ end;
+
+ TitleLabel := TLabel.Create(Self);
+ with TitleLabel do
+ begin
+ Parent := Control;
+ SetBounds(35, 4, 152, 14);
+ Alignment := taCenter;
+ AutoSize := False;
+ Caption := '';
+ ParentFont := True;
+ Font.Color := clBlue;
+ Font.Style := [fsBold];
+ Transparent := True;
+ OnDblClick := @TopPanelDblClick;
+ end;
+
+ FBtns[0] := TRxTimerSpeedButton.Create(Self);
+ with FBtns[0] do
+ begin
+ Parent := Control;
+ SetBounds(3, 3, 16, 16);
+
+ TmpBitmap:=LoadBitmapFromLazarusResource('prev2');
+ Glyph := TmpBitmap;
+ FreeAndNil(TmpBitmap);
+
+ OnClick := @PrevYearBtnClick;
+ Hint := sPrevYear;
+ end;
+
+ FBtns[1] := TRxTimerSpeedButton.Create(Self);
+ with FBtns[1] do begin
+ Parent := Control;
+ SetBounds(18, 3, 16, 16);
+
+ TmpBitmap:=LoadBitmapFromLazarusResource('prev1');
+ Glyph := TmpBitmap;
+ FreeAndNil(TmpBitmap);
+
+ OnClick := @PrevMonthBtnClick;
+ Hint := sPrevMonth;
+ end;
+
+ FBtns[2] := TRxTimerSpeedButton.Create(Self);
+ with FBtns[2] do
+ begin
+ Parent := Control;
+ SetBounds(188, 3, 16, 16);
+
+ TmpBitmap:=LoadBitmapFromLazarusResource('next1');
+ Glyph := TmpBitmap;
+ FreeAndNil(TmpBitmap);
+
+ OnClick := @NextMonthBtnClick;
+ Hint := sNextMonth;
+ end;
+
+ FBtns[3] := TRxTimerSpeedButton.Create(Self);
+ with FBtns[3] do begin
+ Parent := Control;
+ SetBounds(203, 3, 16, 16);
+
+ TmpBitmap:=LoadBitmapFromLazarusResource('next2');
+ Glyph := TmpBitmap;
+ FreeAndNil(TmpBitmap);
+
+ OnClick := @NextYearBtnClick;
+ Hint := sNextYear;
+ end;
+
+ Control := TPanel.Create(Self);
+ with Control as TPanel do
+ begin
+ Parent := Self;
+ SetBounds(0, 133, 222, 21);
+ Align := alBottom;
+ BevelInner := bvNone;
+ BevelOuter := bvNone;
+ ParentFont := True;
+ ParentColor := True;
+ end;
+
+ with TButton.Create(Self) do
+ begin
+ Parent := Control;
+ SetBounds(0, 0, 112, 21);
+ Caption := rsmbOK;
+ ModalResult := mrOk;
+ end;
+
+ with TButton.Create(Self) do
+ begin
+ Parent := Control;
+ SetBounds(111, 0, 111, 21);
+ Caption := rsmbCancel;
+ ModalResult := mrCancel;
+ Cancel := True;
+ end;
+
+ Calendar := TCustomRxCalendar.Create(Self);
+ with Calendar do
+ begin
+ Parent := Self;
+ Align := alClient;
+ ParentFont := True;
+ SetBounds(2, 2, 218, 113);
+ Color := clWhite;
+ TabOrder := 0;
+ UseCurrentDate := False;
+ OnChange := @CalendarChange;
+ OnDblClick := @CalendarDblClick;
+ end;
+
+ OnKeyDown := @FormKeyDown;
+ Calendar.CalendarDate := Trunc(Now);
+ ActiveControl := Calendar;
+
+ FMonthMenu:=CreateRxCalendarPopupMenu(Self, @MonthMenuClick);
+
+ TitleLabel.PopupMenu:=FMonthMenu;
+end;
+
+procedure TSelectDateDlg.SetDate(Date: TDateTime);
+begin
+ if Date = NullDate then Date := SysUtils.Date;
+ try
+ Calendar.CalendarDate := Date;
+ CalendarChange(nil);
+ except
+ Calendar.CalendarDate := SysUtils.Date;
+ end;
+end;
+
+function TSelectDateDlg.GetDate: TDateTime;
+begin
+ Result := Calendar.CalendarDate;
+end;
+
+procedure TSelectDateDlg.TopPanelDblClick(Sender: TObject);
+begin
+ SetDate(Trunc(Now));
+end;
+
+procedure TSelectDateDlg.PrevYearBtnClick(Sender: TObject);
+begin
+ Calendar.PrevYear;
+end;
+
+procedure TSelectDateDlg.NextYearBtnClick(Sender: TObject);
+begin
+ Calendar.NextYear;
+end;
+
+procedure TSelectDateDlg.PrevMonthBtnClick(Sender: TObject);
+begin
+ Calendar.PrevMonth;
+end;
+
+procedure TSelectDateDlg.NextMonthBtnClick(Sender: TObject);
+begin
+ Calendar.NextMonth;
+end;
+
+procedure TSelectDateDlg.CalendarChange(Sender: TObject);
+begin
+ TitleLabel.Caption := FormatDateTime('MMMM, YYYY', Calendar.CalendarDate);
+end;
+
+procedure TSelectDateDlg.CalendarDblClick(Sender: TObject);
+begin
+ ModalResult := mrOK;
+end;
+
+procedure TSelectDateDlg.FormKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+begin
+ case Key of
+ VK_RETURN: ModalResult := mrOK;
+ VK_ESCAPE: ModalResult := mrCancel;
+ VK_NEXT:
+ begin
+ if ssCtrl in Shift then Calendar.NextYear;
+ //else Calendar.NextMonth;
+ TitleLabel.Update;
+ end;
+ VK_PRIOR:
+ begin
+ if ssCtrl in Shift then Calendar.PrevYear;
+ //else Calendar.PrevMonth;
+ TitleLabel.Update;
+ end;
+ VK_TAB:
+ begin
+ if Shift = [ssShift] then Calendar.PrevMonth
+ else Calendar.NextMonth;
+ TitleLabel.Update;
+ end;
+ end; {case}
+end;
+
+procedure TSelectDateDlg.MonthMenuClick(Sender: TObject);
+var
+ Cmd:integer;
+begin
+ Cmd:=(Sender as TComponent).Tag;
+ if Cmd = -1 then
+ Calendar.SetCalendarDate(Sysutils.Date)
+ else
+ Calendar.Month:=Cmd;
+end;
+
+{ SelectDate routines }
+
+function CreateDateDialog(const DlgCaption: TCaption): TSelectDateDlg;
+begin
+ Result := TSelectDateDlg.Create(Application);
+ try
+ if DlgCaption <> '' then Result.Caption := DlgCaption;
+{ if Screen.PixelsPerInch <> 96 then begin { scale to screen res }
+// Result.ScaleBy(Screen.PixelsPerInch, 96);
+ { The ScaleBy method does not scale the font well, so set the
+ font back to the original info. }
+ Result.Calendar.ParentFont := True;
+ FontSetDefault(Result.Font);
+ Result.Left := (Screen.Width div 2) - (Result.Width div 2);
+ Result.Top := (Screen.Height div 2) - (Result.Height div 2);
+ end;}
+ except
+ FreeAndNil(Result);
+ raise;
+ end;
+end;
+
+function PopupDate(var Date: TDateTime; Edit: TWinControl): Boolean;
+var
+ D: TSelectDateDlg;
+ P: TPoint;
+ W, H, X, Y: Integer;
+begin
+ Result := False;
+ D := CreateDateDialog('');
+ try
+ D.BorderIcons := [];
+ D.HandleNeeded;
+ D.Position := poDesigned;
+ W := D.Width;
+ H := D.Height;
+ P := (Edit.ClientOrigin);
+ Y := P.Y + Edit.Height - 1;
+ if (Y + H) > Screen.Height then Y := P.Y - H + 1;
+ if Y < 0 then Y := P.Y + Edit.Height - 1;
+ X := (P.X + Edit.Width) - W;
+ if X < 0 then X := P.X;
+ D.Left := X;
+ D.Top := Y;
+ D.Date := Date;
+
+ if D.ShowModal = mrOk then
+ begin
+ Date := D.Date;
+ Result := True;
+ end;
+ finally
+ D.Free;
+ end;
+end;
+
+function SelectDate(var Date: TDateTime; const DlgCaption: TCaption;
+ AStartOfWeek: TDayOfWeekName; AWeekends: TDaysOfWeek;
+ AWeekendColor: TColor; BtnHints: TStrings): Boolean;
+var
+ D: TSelectDateDlg;
+ I: Integer;
+begin
+ Result := False;
+ D := CreateDateDialog(DlgCaption);
+ try
+ D.Date := Date;
+ with D.Calendar do begin
+ StartOfWeek := AStartOfWeek;
+ Weekends := AWeekends;
+ WeekendColor := AWeekendColor;
+ end;
+ if (BtnHints <> nil) then
+ for I := 0 to Min(BtnHints.Count - 1, 3) do begin
+ if BtnHints[I] <> '' then
+ D.FBtns[I].Hint := BtnHints[I];
+ end;
+ if D.ShowModal = mrOk then begin
+ Date := D.Date;
+ Result := True;
+ end;
+ finally
+ D.Free;
+ end;
+end;
+
+function SelectDateStr(var StrDate: string; const DlgCaption: TCaption;
+ AStartOfWeek: TDayOfWeekName; AWeekends: TDaysOfWeek;
+ AWeekendColor: TColor; BtnHints: TStrings): Boolean;
+var
+ DateValue: TDateTime;
+begin
+ if StrDate <> '' then begin
+ try
+ DateValue := StrToDateFmt(DefaultFormatSettings.ShortDateFormat, StrDate);
+ except
+ DateValue := Date;
+ end;
+ end
+ else DateValue := Date;
+ Result := SelectDate(DateValue, DlgCaption, AStartOfWeek, AWeekends,
+ AWeekendColor, BtnHints);
+ if Result then StrDate := FormatDateTime(DefaultFormatSettings.ShortDateFormat, DateValue);
+end;
+
+{ TRxCalendarGrid }
+
+procedure TRxCalendarGrid.SetBounds(aLeft, aTop, aWidth, aHeight: integer);
+var
+ GridLinesH, GridLinesW: Integer;
+begin
+ inherited SetBounds(aLeft, aTop, aWidth, aHeight);
+
+ GridLinesH := 6 * GridLineWidth;
+ if (goVertLine in Options) or (goFixedVertLine in Options) then
+ GridLinesW := 6 * GridLineWidth
+ else GridLinesW := 0;
+ DefaultColWidth := (aWidth - GridLinesW) div 7;
+ DefaultRowHeight := (aHeight - GridLinesH) div 7;
+end;
+
+initialization
+ {$I pickdate.lrs}
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/register_rxctrl.pas b/components/rx/version/v2.2_laz_1.2/register_rxctrl.pas
new file mode 100644
index 000000000..4ea23335c
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/register_rxctrl.pas
@@ -0,0 +1,338 @@
+unit register_rxctrl;
+
+{$mode objfpc}{$H+}
+
+interface
+uses
+ Classes, SysUtils, LResources, LazarusPackageIntf, DBPropEdits, PropEdits,
+ DB, ComponentEditors;
+
+type
+
+ { TRxCollumsSortFieldsProperty }
+
+ TRxCollumsSortFieldsProperty = class(TDBGridFieldProperty)
+ public
+ function GetAttributes: TPropertyAttributes; override;
+ procedure Edit; override;
+ procedure FillValues(const Values: TStringList); override;
+ end;
+
+ { TPopUpColumnFieldProperty }
+
+ TPopUpColumnFieldProperty = class(TFieldProperty)
+ public
+ procedure FillValues(const Values: TStringList); override;
+ end;
+
+type
+
+ { THistoryButtonProperty }
+
+ THistoryButtonProperty = class(TStringPropertyEditor)
+ public
+ function GetAttributes: TPropertyAttributes; override;
+ procedure GetValues(Proc: TGetStrProc); override;
+ end;
+
+type
+
+ { TRxLoginDialogEditor }
+
+ TRxLoginDialogEditor = class(TComponentEditor)
+ public
+ DefaultEditor: TBaseComponentEditor;
+ constructor Create(AComponent: TComponent; ADesigner: TComponentEditorDesigner); override;
+ destructor Destroy; override;
+ function GetVerbCount:integer;override;
+ function GetVerb(Index:integer):string;override;
+ procedure ExecuteVerb(Index:integer);override;
+ end;
+
+
+ { TRxAppIcon }
+
+ TRxAppIconEditor = class(TComponentEditor)
+ public
+ DefaultEditor: TBaseComponentEditor;
+ constructor Create(AComponent: TComponent; ADesigner: TComponentEditorDesigner); override;
+ destructor Destroy; override;
+ function GetVerbCount:integer;override;
+ function GetVerb(Index:integer):string;override;
+ procedure ExecuteVerb(Index:integer);override;
+ end;
+
+procedure Register;
+implementation
+uses RxLogin, RxAppIcon, Dialogs, rxconst, RxHistoryNavigator, rxpopupunit,
+ rxceEditLookupFields, rxdbgrid, rxdconst, duallist, rxstrutils, Forms;
+
+resourcestring
+ sTestTRxLoginDialog = 'Test TRxLoginDialog';
+ sLoadIcon = 'Load icon';
+
+
+{ TRxLoginDialogEditor }
+
+constructor TRxLoginDialogEditor.Create(AComponent: TComponent;
+ ADesigner: TComponentEditorDesigner);
+var
+ CompClass: TClass;
+begin
+ inherited Create(AComponent, ADesigner);
+ CompClass := PClass(Acomponent)^;
+ try
+ PClass(AComponent)^ := TComponent;
+ DefaultEditor := GetComponentEditor(AComponent, ADesigner);
+ finally
+ PClass(AComponent)^ := CompClass;
+ end;
+end;
+
+destructor TRxLoginDialogEditor.Destroy;
+begin
+ DefaultEditor.Free;
+ inherited Destroy;
+end;
+
+function TRxLoginDialogEditor.GetVerbCount: integer;
+begin
+ Result:=DefaultEditor.GetVerbCount + 1;
+end;
+
+function TRxLoginDialogEditor.GetVerb(Index: integer): string;
+begin
+ if Index < DefaultEditor.GetVerbCount then
+ Result := DefaultEditor.GetVerb(Index)
+ else
+ begin
+ case Index - DefaultEditor.GetVerbCount of
+ 0:Result:=sTestTRxLoginDialog;
+ end;
+ end;
+end;
+
+procedure TRxLoginDialogEditor.ExecuteVerb(Index: integer);
+begin
+ if Index < DefaultEditor.GetVerbCount then
+ DefaultEditor.ExecuteVerb(Index)
+ else
+ begin
+ case Index - DefaultEditor.GetVerbCount of
+ 0:(Component as TRxLoginDialog).Login;
+ end;
+ end;
+end;
+
+{ TRxAppIcon }
+
+type
+ PClass = ^TClass;
+
+constructor TRxAppIconEditor.Create(AComponent: TComponent;
+ ADesigner: TComponentEditorDesigner);
+var
+ CompClass: TClass;
+begin
+ inherited Create(AComponent, ADesigner);
+ CompClass := PClass(Acomponent)^;
+ try
+ PClass(AComponent)^ := TComponent;
+ DefaultEditor := GetComponentEditor(AComponent, ADesigner);
+ finally
+ PClass(AComponent)^ := CompClass;
+ end;
+end;
+
+destructor TRxAppIconEditor.Destroy;
+begin
+ DefaultEditor.Free;
+ inherited Destroy;
+end;
+
+function TRxAppIconEditor.GetVerbCount: integer;
+begin
+ Result:=DefaultEditor.GetVerbCount + 1;
+end;
+
+function TRxAppIconEditor.GetVerb(Index: integer): string;
+begin
+ if Index < DefaultEditor.GetVerbCount then
+ Result := DefaultEditor.GetVerb(Index)
+ else
+ begin
+ case Index - DefaultEditor.GetVerbCount of
+ 0:Result:=sLoadIcon;
+ end;
+ end;
+end;
+
+procedure TRxAppIconEditor.ExecuteVerb(Index: integer);
+var
+ OpenDialog1: TOpenDialog;
+begin
+ if Index < DefaultEditor.GetVerbCount then
+ DefaultEditor.ExecuteVerb(Index)
+ else
+ begin
+ case Index - DefaultEditor.GetVerbCount of
+ 0:begin
+ OpenDialog1:=TOpenDialog.Create(nil);
+ OpenDialog1.Filter:=sWindowsIcoFiles;
+ try
+ if OpenDialog1.Execute then
+ (Component as TRxAppIcon).LoadFromFile(OpenDialog1.FileName);
+ finally
+ OpenDialog1.Free;
+ end;
+ Modified;
+ end;
+ end;
+ end;
+end;
+
+{ THistoryButtonProperty }
+
+function THistoryButtonProperty.GetAttributes: TPropertyAttributes;
+begin
+ Result:= [paValueList, paSortList, paMultiSelect];
+end;
+
+procedure THistoryButtonProperty.GetValues(Proc: TGetStrProc);
+var
+ I: Integer;
+ Navigator:TRxHistoryNavigator;
+begin
+ Navigator:=TRxHistoryNavigator(GetComponent(0));
+ if Assigned(Navigator) then
+ begin
+ if Assigned(Navigator.ToolPanel) then
+ begin
+ for i:=0 to Navigator.ToolPanel.Items.Count - 1 do
+ begin
+ if Assigned(Navigator.ToolPanel.Items[i].Action) then
+ Proc(Navigator.ToolPanel.Items[i].Action.Name);
+ end;
+ end;
+ end;
+end;
+
+{ TPopUpColumnFieldProperty }
+
+procedure TPopUpColumnFieldProperty.FillValues(const Values: TStringList);
+var
+ Column: TPopUpColumn;
+ DataSource: TDataSource;
+begin
+ Column:=TPopUpColumn(GetComponent(0));
+ if not (Column is TPopUpColumn) then exit;
+ DataSource := TPopUpFormColumns(Column.Collection).PopUpFormOptions.DataSource;
+ if Assigned(DataSource) and Assigned(DataSource.DataSet) then
+ DataSource.DataSet.GetFieldNames(Values);
+end;
+
+
+{ TRxCollumsSortFieldsProperty }
+
+function TRxCollumsSortFieldsProperty.GetAttributes: TPropertyAttributes;
+begin
+ Result:= [paValueList, paSortList, paMultiSelect, paDialog];
+end;
+
+procedure TRxCollumsSortFieldsProperty.Edit;
+var
+ DualListDialog1: TDualListDialog;
+ FCol:TRxColumn;
+ /// FGrid:TRxDBGrid;
+
+procedure DoInitFill;
+var
+ i,j:integer;
+ LookupDisplay:string;
+begin
+ LookupDisplay:=FCol.SortFields;
+ if LookupDisplay<>'' then
+ begin
+ StrToStrings(LookupDisplay, DualListDialog1.List2, ';');
+ for i:=DualListDialog1.List1.Count-1 downto 0 do
+ begin
+ j:=DualListDialog1.List2.IndexOf(DualListDialog1.List1[i]);
+ if j>=0 then
+ DualListDialog1.List1.Delete(i);
+ end;
+ end;
+end;
+
+function DoFillDone:string;
+var
+ i:integer;
+begin
+ for i:=0 to DualListDialog1.List2.Count-1 do
+ Result:=Result + DualListDialog1.List2[i]+';';
+ if Result<>'' then
+ Result:=Copy(Result, 1, Length(Result)-1);
+end;
+
+procedure DoSetCaptions;
+begin
+ DualListDialog1.Label1Caption:=sRxAllFields;
+ DualListDialog1.Label2Caption:=sRxSortFieldsDisplay;
+ DualListDialog1.Title:=sRxFillSortFieldsDisp;
+end;
+
+begin
+ FCol:=nil;
+
+ if GetComponent(0) is TRxColumn then
+ FCol:=TRxColumn(GetComponent(0))
+ else
+ exit;
+
+ DualListDialog1:=TDualListDialog.Create(Application);
+ try
+ DoSetCaptions;
+ FillValues(DualListDialog1.List1 as TStringList);
+ DoInitFill;
+ if DualListDialog1.Execute then
+ FCol.SortFields:=DoFillDone;
+ finally
+ FreeAndNil(DualListDialog1);
+ end;
+end;
+
+procedure TRxCollumsSortFieldsProperty.FillValues(const Values: TStringList);
+var
+ Column: TRxColumn;
+ Grid: TRxDBGrid;
+ DataSource: TDataSource;
+begin
+ Column:=TRxColumn(GetComponent(0));
+ if not (Column is TRxColumn) then exit;
+ Grid:=TRxDBGrid(Column.Grid);
+ if not (Grid is TRxDBGrid) then exit;
+// LoadDataSourceFields(Grid.DataSource, Values);
+
+ DataSource := Grid.DataSource;
+ if (DataSource is TDataSource) and Assigned(DataSource.DataSet) then
+ DataSource.DataSet.GetFieldNames(Values);
+
+end;
+
+
+procedure Register;
+begin
+ //
+ RegisterComponentEditor(TRxLoginDialog, TRxLoginDialogEditor);
+ RegisterComponentEditor(TRxAppIcon, TRxAppIconEditor);
+ //
+ RegisterPropertyEditor(TypeInfo(string), TPopUpColumn, 'FieldName', TPopUpColumnFieldProperty);
+ RegisterPropertyEditor(TypeInfo(string), TRxHistoryNavigator, 'BackBtn', THistoryButtonProperty);
+ RegisterPropertyEditor(TypeInfo(string), TRxHistoryNavigator, 'ForwardBtn', THistoryButtonProperty);
+
+ RegisterPropertyEditor(TypeInfo(string), TRxColumn, 'SortFields', TRxCollumsSortFieldsProperty);
+
+ RegisterCEEditLookupFields;
+ //
+end;
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/registerrx.pas b/components/rx/version/v2.2_laz_1.2/registerrx.pas
new file mode 100644
index 000000000..e6c9b5de4
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/registerrx.pas
@@ -0,0 +1,212 @@
+{ registerrx unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit registerrx;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, LazarusPackageIntf;
+
+const
+ RxCtrllPageName = 'RX Controls';
+ RxToolsPageName = 'RX Tools';
+
+procedure Register;
+
+implementation
+uses
+ PropEdits, folderlister, duallist, RxHistoryNavigator,
+ curredit, rxswitch, rxdice, rxtoolbar,
+ {$IFDEF USE_TRXXPManifest}
+ rxxpman,
+ {$ENDIF}
+ PageMngr,
+ {$IFDEF USE_TRxAppIcon}
+ RxAppIcon,
+ {$ENDIF}
+ Dialogs, ComponentEditors, DBPropEdits, rxctrls,
+ RxCustomChartPanel, AutoPanel, pickdate, tooledit, rxclock,
+ rxspin, RxTimeEdit, rxDateRangeEditUnit,
+ RxAboutDialog, RxViewsPanel, RxMDI;
+
+{$IFDEF USE_TRxAppIcon}
+procedure RegisterRxAppIcon;
+begin
+ RegisterComponents(RxCtrllPageName,[TRxAppIcon]);
+end;
+{$ENDIF}
+{$IFDEF USE_TRXXPManifest}
+procedure RegisterRxXPMan;
+begin
+ RegisterComponents(RxCtrllPageName,[TRXXPManifest]);
+end;
+{$ENDIF}
+
+procedure RegisterPageMngr;
+begin
+ RegisterComponents(RxCtrllPageName,[TPageManager]);
+end;
+
+
+procedure RegisterDualList;
+begin
+ RegisterComponents(RxCtrllPageName,[TDualListDialog]);
+end;
+
+procedure RegisterCurrEdit;
+begin
+ RegisterComponents(RxCtrllPageName,[TCurrencyEdit]);
+end;
+
+procedure RegisterRXSwitch;
+begin
+ RegisterComponents(RxCtrllPageName,[TRxSwitch]);
+end;
+
+procedure RegisterRXDice;
+begin
+ RegisterComponents(RxCtrllPageName,[TRxDice]);
+end;
+
+procedure RegisterFolderLister;
+begin
+ RegisterComponents(RxCtrllPageName,[TFolderLister]);
+end;
+
+procedure RegisterRxToolBar;
+begin
+ RegisterComponents(RxCtrllPageName,[TToolPanel]);
+end;
+
+procedure RegisterRxCtrls;
+begin
+ RegisterComponents(RxCtrllPageName,[TRxLabel, TSecretPanel, TRxSpeedButton, TRxRadioGroup]);
+end;
+
+
+procedure RegisterChartPanel;
+begin
+ RegisterComponents(RxCtrllPageName,[TRxChart]);
+end;
+
+procedure RegisterAutoPanel;
+begin
+ RegisterComponents(RxCtrllPageName,[TAutoPanel]);
+end;
+
+procedure RegisterPickDate;
+begin
+ RegisterComponents(RxCtrllPageName,[TRxCalendarGrid]);
+end;
+
+procedure RegisterToolEdit;
+begin
+ RegisterComponents(RxCtrllPageName,[TRxDateEdit]);
+end;
+
+procedure RegisterRxClock;
+begin
+ RegisterComponents(RxCtrllPageName,[TRxClock]);
+end;
+
+procedure RegisterRxSpin;
+begin
+ RegisterComponents(RxCtrllPageName,[TRxSpinButton, TRxSpinEdit]);
+end;
+
+procedure RegisterRxTimeEdit;
+begin
+ RegisterComponents(RxCtrllPageName,[TRxTimeEdit]);
+end;
+
+procedure RegisterRxAboutDialog;
+begin
+ RegisterComponents(RxCtrllPageName,[TRxAboutDialog]);
+end;
+
+procedure RegisterRxViewsPanel;
+begin
+ RegisterComponents(RxCtrllPageName,[TRxViewsPanel]);
+end;
+
+procedure RegisterRxMDI;
+begin
+ RegisterComponents(RxCtrllPageName,[TRxMDICloseButton, TRxMDIPanel, TRxMDITasks]);
+end;
+
+procedure RegisterRxHistoryNavigator;
+begin
+ RegisterComponents(RxToolsPageName,[TRxHistoryNavigator]);
+end;
+
+procedure RegisterrxDateRangeEditUnit;
+begin
+ RegisterComponents(RxCtrllPageName,[TRxDateRangeEdit]);
+end;
+
+procedure Register;
+begin
+ //RX
+ RegisterUnit('folderlister', @RegisterFolderLister);
+ RegisterUnit('duallist', @RegisterDualList);
+ RegisterUnit('curredit', @RegisterCurrEdit);
+ RegisterUnit('rxswitch', @RegisterRXSwitch);
+ RegisterUnit('rxdice', @RegisterRXDice);
+ {$IFDEF USE_TRXXPManifest}
+ RegisterUnit('RxXPMan', @RegisterRxXPMan);
+ {$ENDIF}
+ RegisterUnit('PageMngr', @RegisterPageMngr);
+ RegisterUnit('rxtoolbar', @RegisterRxToolBar);
+ {$IFDEF USE_TRxAppIcon}
+ RegisterUnit('rxappicon', @RegisterRxAppIcon);
+ {$ENDIF}
+ RegisterUnit('rxctrls', @RegisterRxCtrls);
+ RegisterUnit('RxCustomChartPanel', @RegisterChartPanel);
+ RegisterUnit('AutoPanel', @RegisterAutoPanel);
+ RegisterUnit('pickdate', @RegisterPickDate);
+ RegisterUnit('tooledit', @RegisterToolEdit);
+ RegisterUnit('rxclock', @RegisterRxClock);
+ RegisterUnit('rxspin', @RegisterRxSpin);
+ RegisterUnit('RxTimeEdit', @RegisterRxTimeEdit);
+ RegisterUnit('RxAboutDialog', @RegisterRxAboutDialog);
+ RegisterUnit('RxViewsPanel', @RegisterRxViewsPanel);
+ RegisterUnit('RxHistoryNavigator', @RegisterRxHistoryNavigator);
+ RegisterUnit('RxMDI', @RegisterRxMDI);
+ RegisterUnit('rxDateRangeEditUnit', @RegisterrxDateRangeEditUnit);
+
+end;
+
+initialization
+ {$i rx.lrs}
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/registerrxdb.pas b/components/rx/version/v2.2_laz_1.2/registerrxdb.pas
new file mode 100644
index 000000000..9d0ce241a
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/registerrxdb.pas
@@ -0,0 +1,164 @@
+{ RegisterRxDB unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit RegisterRxDB;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, LazarusPackageIntf;
+
+procedure Register;
+implementation
+uses DB, DBPropEdits, rxdbgrid, RxDBSpinEdit, RxDBTimeEdit, RxDBCtrls, rxmemds,
+ ComponentEditors, seldsfrm, PropEdits, RxDBColorBox, dbdateedit, rxdbcomb,
+ rxlookup, dbcurredit;
+
+type
+
+{ TRxDBGridFieldProperty }
+ TRxDBGridFieldProperty = class(TFieldProperty)
+ public
+ procedure FillValues(const Values: TStringList); override;
+ end;
+
+{ TRxDBGridFieldProperty }
+
+procedure TRxDBGridFieldProperty.FillValues(const Values: TStringList);
+var
+ Column: TRxColumn;
+ Grid: TRxDBGrid;
+ DataSource: TDataSource;
+begin
+ Column:=TRxColumn(GetComponent(0));
+ if not (Column is TRxColumn) then exit;
+ Grid:=TRxDBGrid(Column.Grid);
+ if not (Grid is TRxDBGrid) then exit;
+ DataSource := Grid.DataSource;
+ if Assigned(DataSource) and Assigned(DataSource.DataSet) then
+ DataSource.DataSet.GetFieldNames(Values);
+end;
+
+type
+{ TRxDBGridFooterFieldProperty }
+ TRxDBGridFooterFieldProperty = class(TFieldProperty)
+ public
+ procedure FillValues(const Values: TStringList); override;
+ end;
+
+{ TRxDBGridFieldProperty }
+
+procedure TRxDBGridFooterFieldProperty.FillValues(const Values: TStringList);
+var
+ Footer: TRxColumnFooter;
+ Grid: TRxDBGrid;
+ DataSource: TDataSource;
+begin
+ Footer:=TRxColumnFooter(GetComponent(0));
+ Grid:=TRxDBGrid(Footer.Owner.Grid);
+ if not (Grid is TRxDBGrid) then exit;
+ DataSource := Grid.DataSource;
+ if Assigned(DataSource) and Assigned(DataSource.DataSet) then
+ DataSource.DataSet.GetFieldNames(Values);
+end;
+
+
+procedure RegisterRxDBSpinEdit;
+begin
+ RegisterComponents('RX DBAware',[TRxDBSpinEdit]);
+end;
+
+procedure RegisterRxDBTimeEdit;
+begin
+ RegisterComponents('RX DBAware',[TRxDBTimeEdit]);
+end;
+
+procedure RegisterRxDBCtrls;
+begin
+ RegisterComponents('RX DBAware',[TRxDBProgressBar, TRxDBTrackBar, TRxDBRadioGroup]);
+end;
+
+procedure RegisterRxDbGrid;
+begin
+ RegisterComponents('RX DBAware',[TRxDBGrid]);
+end;
+
+procedure RegisterRxMemDS;
+begin
+ RegisterComponents('RX DBAware',[TRxMemoryData]);
+end;
+
+procedure RegisterRxDBColorBox;
+begin
+ RegisterComponents('RX DBAware',[TRxDBColorBox]);
+end;
+
+procedure RegisterUnitDBDateEdit;
+begin
+ RegisterComponents('RX DBAware',[TDBDateEdit, TRxDBCalcEdit, TRxDBCurrEdit]);
+end;
+
+procedure RegisterRXLookup;
+begin
+ RegisterComponents('RX DBAware',[TRXLookupEdit, TRxDBLookupCombo]);
+end;
+
+procedure RegisterRxDBComb;
+begin
+ RegisterComponents('RX DBAware',[TRxDBComboBox]);
+end;
+
+procedure Register;
+begin
+ //RX DBAware
+ RegisterUnit('dbdateedit', @RegisterUnitDBDateEdit);
+ RegisterUnit('rxlookup', @RegisterRXLookup);
+ RegisterUnit('rxdbcomb', @RegisterRxDBComb);
+
+ RegisterUnit('RxDBTimeEdit', @RegisterRxDBTimeEdit);
+ RegisterUnit('RxDBSpinEdit', @RegisterRxDBSpinEdit);
+ RegisterUnit('RxDBCtrls', @RegisterRxDBCtrls);
+ RegisterUnit('rxdbgrid', @RegisterRxDbGrid);
+ RegisterUnit('rxmemds', @RegisterRxMemDS);
+ RegisterUnit('RxDBColorBox', @RegisterRxDBColorBox);
+
+ //Component Editors
+ RegisterComponentEditor(TRxMemoryData, TMemDataSetEditor);
+
+ //
+ RegisterPropertyEditor(TypeInfo(string), TRxColumn, 'FieldName', TRxDBGridFieldProperty);
+ RegisterPropertyEditor(TypeInfo(string), TRxColumnFooter, 'FieldName', TRxDBGridFooterFieldProperty);
+end;
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/registerrxtools.pas b/components/rx/version/v2.2_laz_1.2/registerrxtools.pas
new file mode 100644
index 000000000..6938f1bf9
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/registerrxtools.pas
@@ -0,0 +1,84 @@
+{ RegisterRxTools unit
+
+ Copyright (C) 2005-2013 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit RegisterRxTools;
+
+{$I rx.inc}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, LazarusPackageIntf;
+
+procedure Register;
+
+implementation
+uses RxSystemServices, RxLogin, RxVersInfo, RxCloseFormValidator, RxIniPropStorage;
+
+const
+ sRxToolsPage = 'RX Tools';
+
+procedure RegisterRxSystemServices;
+begin
+ RegisterComponents(sRxToolsPage, [TRxSystemServices]);
+end;
+
+procedure RegisterRxLogin;
+begin
+ RegisterComponents(sRxToolsPage, [TRxLoginDialog]);
+end;
+
+procedure RegisterRxVersInfo;
+begin
+ RegisterComponents(sRxToolsPage, [TRxVersionInfo]);
+end;
+
+procedure RegisterCloseFormValidator;
+begin
+ RegisterComponents(sRxToolsPage,[TRxCloseFormValidator]);
+end;
+
+procedure RegisterRxIniPropStorage;
+begin
+ RegisterComponents(sRxToolsPage,[TRxIniPropStorage]);
+end;
+
+procedure Register;
+begin
+ RegisterUnit('RxLogin', @RegisterRxLogin);
+ RegisterUnit('RxVersInfo', @RegisterRxVersInfo);
+ RegisterUnit('RxSystemServices', @RegisterRxSystemServices);
+ RegisterUnit('RxCloseFormValidator', @RegisterCloseFormValidator);
+ RegisterUnit('RxIniPropStorage', @RegisterRxIniPropStorage);
+end;
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/rx.inc b/components/rx/version/v2.2_laz_1.2/rx.inc
new file mode 100644
index 000000000..888ab414e
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rx.inc
@@ -0,0 +1,72 @@
+{ global include module
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+{$mode objfpc}
+
+{$H+}
+
+{$DEFINE RX_D3}
+{$DEFINE RX_D4}
+{$DEFINE HASVARIANT}
+{.$DEFINE ENABLE_Child_Defs}
+{$DEFINE NEW_STYLE_TITLE_ALIGNMENT_RXDBGRID}
+{.$DEFINE RXDBGRID_OPTIONS_WO_CANCEL_ON_EXIT}
+{.$DEFINE USED_BiDi}
+{$DEFINE DEFAULT_POPUP_CALENDAR}
+{.$DEFINE FIX_TRxMemoryData_Filter}
+{.$DEFINE FIX_BUG_FieldNo}
+
+{.DEFINE USE_TRXXPManifest}
+{.$DEFINE USE_TRxAppIcon}
+
+{.$DEFINE USE_DEPRECATES}
+
+//
+{.$DEFINE DBDateEdit_OLD}
+
+{.$DEFINE OLD_EDITBUTTON}
+
+{$if FPC_FULLVERSION<20701}
+ {$DEFINE NoAutomatedBookmark}
+ {$DEFINE RX_USE_LCL_DEVEL}
+{$endif}
+
+{$IFDEF OLD_EDITBUTTON}
+{$if FPC_FULLVERSION<20701}
+{$DEFINE RX_USE_LAZARUS_RESOURCE}
+{$ENDIF}
+{$ENDIF}
+
+{$IFDEF NoAutomatedBookmark}
+{$ELSE}
+{$ENDIF}
+
+{.$DEFINE RxDBGridDepricatedProps}
diff --git a/components/rx/version/v2.2_laz_1.2/rx.lrs b/components/rx/version/v2.2_laz_1.2/rx.lrs
new file mode 100644
index 000000000..8cca9dd79
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rx.lrs
@@ -0,0 +1,785 @@
+LazarusResources.Add('TDBDateEdit','XPM',[
+ '/* XPM */'#10'static char *TDBDateEdit[]={'#10'"18 18 8 1",'#10'"# c None",'
+ +#10'"e c #000000",'#10'"c c #000080",'#10'"d c #0000ff",'#10'"f c #800000",'
+ +#10'". c #808080",'#10'"a c #c0c0c0",'#10'"b c #ffffff",'#10'"..............'
+ +'.###",'#10'".a.baaaabaaaaa.###",'#10'"...............###",'#10'".a.bbbbabbb'
+ +'bbb.###",'#10'".b.baababaaaab.###",'#10'".a.bbcccccccccccc#",'#10'".b.bacdd'
+ +'dcdddcddce",'#10'".a.bbcccccccccccce",'#10'".b.bacbbbbbbbbbbce",'#10'".a.bb'
+ +'cbbfbbffffbce",'#10'".....cbffbbfbbbbce",'#10'"#####cbbfbbfffabce",'#10'"##'
+ +'###cbbfbbbbbfbce",'#10'"#####cbbfbbabafbce",'#10'"#####cbfffbfffabce",'#10
+ +'"#####cbbbbbbbbbbce",'#10'"#####cccccccccccce",'#10'"######eeeeeeeeeeee"};'
+ +#10
+]);
+LazarusResources.Add('TRXLookUpEdit','XPM',[
+ '/* XPM */'#10'static char *TRXLookUpEdit[]={'#10'"24 24 7 1",'#10'". c None"'
+ +','#10'"# c #000000",'#10'"e c #800000",'#10'"c c #808080",'#10'"d c #c0c0c0'
+ +'",'#10'"b c #ff0000",'#10'"a c #ffffff",'#10'"..##....................",'#10
+ +'".#aa#b..ccccccccccccccc.",'#10'"#daaa#b.cdcaddddadddddc.",'#10'"#ddaaa#.cc'
+ +'ccccccccccccc.",'#10'".#ddaaa##dcaaaadaaaaaac.",'#10'"..#ddaaaa###ddadadddd'
+ +'ac.",'#10'"...#ddaabbbb#aadaaaaaac.",'#10'"....#ddebbb#ddadadddaac.",'#10'"'
+ +'....#ceeeb#aaaadaaaaaac.",'#10'".....#eec#caddadaddddac.",'#10'".....#ec#dc'
+ +'aaaadaaaaaac.",'#10'".....#e#ccccccccccccccc.",'#10'"......#...............'
+ +'..",'#10'"..ccccccccccccccccccccc.",'#10'"..c###################a.",'#10'".'
+ +'.c#aaaaaaaaaadaaaaaada.",'#10'"..c#aaaaaaaaaadaddddcda.",'#10'"..c#aaaaaaaa'
+ +'aadad##dcda.",'#10'"..c#aaaaaaaaaadaddddcda.",'#10'"..c#aaaaaaaaaadacccccda'
+ +'.",'#10'"..c#dddddddddddddddddda.",'#10'"..caaaaaaaaaaaaaaaaaaaa.",'#10'"..'
+ +'......................",'#10'"........................"};'#10
+]);
+LazarusResources.Add('TRxDBCalcEdit','XPM',[
+ '/* XPM */'#10'static char *TRxDBCalcEdit_xpm[]={'#10'"18 18 8 1",'#10'"# c N'
+ +'one",'#10'"e c #000000",'#10'"f c #000080",'#10'"c c #008080",'#10'"d c #00'
+ +'ffff",'#10'". c #808080",'#10'"a c #c0c0c0",'#10'"b c #ffffff",'#10'"......'
+ +'.........###",'#10'".a.baaaabaaaaa.###",'#10'"...............###",'#10'".a.'
+ +'bbbbabbbbbb.###",'#10'".b.baababaaaab.###",'#10'".a.bbbbabbbbbb.###",'#10'"'
+ +'.bbcccccccccccccc#",'#10'".acbdbdbdbdbdbdbce",'#10'".bcdeeeeeeeeccccfe",'#10
+ +'".acbebbbbbbaccccfe",'#10'"..cdeaaaaaaaccccfe",'#10'"##cbccccccccccccfe",'
+ +#10'"##cdcebebebebebefe",'#10'"##cbccccccccccccfe",'#10'"##cdcebebebebbaefe"'
+ +','#10'"##cbccccccccccccfe",'#10'"##ccfffffffffffffe",'#10'"###eeeeeeeeeeeee'
+ +'e#"};'#10
+]);
+LazarusResources.Add('TRxDBLookupCombo','XPM',[
+ '/* XPM */'#10'static char *TRxDBLookupCombo[]={'#10'"24 24 8 1",'#10'". c No'
+ +'ne",'#10'"# c #000000",'#10'"c c #000080",'#10'"e c #800000",'#10'"f c #808'
+ +'080",'#10'"d c #c0c0c0",'#10'"b c #ff0000",'#10'"a c #ffffff",'#10'"..##...'
+ +'.................",'#10'".#aa#b.........c........",'#10'"#daaa#b.......cc..'
+ +'......",'#10'"#ddaaa#......cccccccc...",'#10'".#ddaaa##.....cc.....c..",'#10
+ +'"..#ddaaaa###...c.....c..",'#10'"...#ddaabbbb#........c..",'#10'"....#ddebb'
+ +'b#.........c..",'#10'"..c.#feeeb#d###########.",'#10'"..c..#eef#daaaaaaa#aa'
+ +'d#.",'#10'"..c..#ef#dccccccca#a#d#.",'#10'"..c..#e#daaaaaaaaa#ddd#.",'#10'"'
+ +'..c...#.###############.",'#10'"..c.....#aaaaaaaaaaaaa#.",'#10'"..c.....#ac'
+ +'ccccccccaaa#.",'#10'"..c.c...#ccccccccccccc#.",'#10'"..c.cc..#caaaaaaaaaacc'
+ +'#.",'#10'"...cccc.#ccccccccccccc#.",'#10'"....cc..#acccccccccaaa#.",'#10'".'
+ +'...c...#aaaaaaaaaaaaa#.",'#10'"........#accccccccccaa#.",'#10'"........#aaa'
+ +'aaaaaaaaaa#.",'#10'"........###############.",'#10'".......................'
+ +'."};'#10
+]);
+LazarusResources.Add('TRxDBGrid','XPM',[
+ '/* XPM */'#10'static char *TRxDBGrid[]={'#10'"24 24 10 1",'#10'". c None",'
+ +#10'"c c #000000",'#10'"f c #008000",'#10'"e c #00ffff",'#10'"g c #800080",'
+ +#10'"# c #808080",'#10'"a c #c0c0c0",'#10'"d c #ff0000",'#10'"h c #ff00ff",'
+ +#10'"b c #ffffff",'#10'"........................",'#10'".###############....'
+ +'....",'#10'".#a#baaaabaaaaa#........",'#10'".###############........",'#10
+ +'".#a#bbbbabbbbbb#........",'#10'".#b#baababaaaab#........",'#10'".#a#bbbbab'
+ +'bbbbb#........",'#10'".#b#baababaaabb#........",'#10'".#a#bbbbabbbbbb#.....'
+ +'...",'#10'".#b#baababaaaab#........",'#10'".#a#bcccccccccccccccccc.",'#10'"'
+ +'.####cacbaaaaabaaaaaaac.",'#10'".....cccccccccccccccccc.",'#10'".....cacbbb'
+ +'bbabbbbbbbbc.",'#10'".....cbcaaaaaaaaaaaaaac.",'#10'".....cacbbbbbabbbbbbbb'
+ +'c.",'#10'".....ccccdddddddddddddc.",'#10'".....cbebcbbbabbbbbbbbc.",'#10'".'
+ +'cccccebecddddddddddddc.",'#10'".cfffcbebccbbabbbbbbbbc.",'#10'".cfffcccccgc'
+ +'aaaaaaaaaac.",'#10'".cfffcbcbchgcabbbbbbbbc.",'#10'".cccccccccghgcccccccccc'
+ +'.",'#10'".........cccccc........."};'#10
+]);
+LazarusResources.Add('TDualListDialog','XPM',[
+ '/* XPM */'#10'static char *TDualListDialog[]={'#10'"24 24 7 1",'#10'". c Non'
+ +'e",'#10'"b c #000000",'#10'"e c #000080",'#10'"c c #0000ff",'#10'"# c #8080'
+ +'80",'#10'"d c #c0c0c0",'#10'"a c #ffffff",'#10'"........................",'
+ +#10'"........................",'#10'".######################.",'#10'".#abccc'
+ +'cccccccccccbabab.",'#10'".#bbbbbbbbbbbbbbbbbbbbb.",'#10'".#dadadadadadadada'
+ +'dadab.",'#10'".#adadadadadadadadadadb.",'#10'".#dbbbbadad#dadbbbbadab.",'#10
+ +'".#abaabbadab#dabaabbadb.",'#10'".#dbaabdbadbb#dbaabdbab.",'#10'".#abaabbbd'
+ +'abbdabaabbbdb.",'#10'".#dbaaaabadbdadbaaaabab.",'#10'".#abaeeabdadadabaeeab'
+ +'db.",'#10'".#dbaaaabadabadbaaaabab.",'#10'".#abaeeabdabbdabaeeabdb.",'#10'"'
+ +'.#dbaaaaba#bbadbaaaabab.",'#10'".#abaaaabda#bdabaaaabdb.",'#10'".#dbbbbbbad'
+ +'a#adbbbbbbab.",'#10'".#adadadadadadadadadadb.",'#10'".#dadadadadadadadadada'
+ +'b.",'#10'".#adadadadadadadadadadb.",'#10'".#bbbbbbbbbbbbbbbbbbbbb.",'#10'".'
+ +'.......................",'#10'"........................"};'#10
+]);
+LazarusResources.Add('TFolderLister','XPM',[
+ '/* XPM */'#10'static char *TFolderLister[]={'#10'"24 24 8 1",'#10'". c None"'
+ +','#10'"a c #000000",'#10'"c c #808080",'#10'"# c #848484",'#10'"f c #c0c0c0'
+ +'",'#10'"e c #c6c6c6",'#10'"b c #ffff00",'#10'"d c #ffffff",'#10'"....#a#...'
+ +'..............",'#10'".#a#aba#a#..............",'#10'".ab#aba#ba...ccc.....'
+ +'...",'#10'".##bbbbb##..cdddcc......",'#10'"#aab#a#baa#cddddddcc....",'#10'"'
+ +'abbbadabbbaddddddddda...",'#10'"#aab#a#baa#dddddddda....",'#10'"a##bbbbb##a'
+ +'ddddddda.....",'#10'"eab#aba#baeddddddadcc...",'#10'".#a#aba#a#dddddddaddda'
+ +'..",'#10'"....#a#dddddddddaddda...",'#10'"....cdfbaaddddddadda....",'#10'".'
+ +'...cdbfbfaadddadda.....",'#10'"....cdfbfcddaadadda.....",'#10'"...ccccccccc'
+ +'ccccdaa.....",'#10'"...cddddddddddcadaa.....",'#10'"...cdfbfbfbfbfbacca....'
+ +'.",'#10'"....cdfbfbfbfbfcaca.....",'#10'"....cdbfbfbfbfbfaca.....",'#10'"..'
+ +'...cdbfbfbfbfbcaa.....",'#10'".....ccccccccccccaa.....",'#10'"......aaaaaaa'
+ +'aaaaaa.....",'#10'"........................",'#10'"........................'
+ +'"};'#10
+]);
+LazarusResources.Add('TRxMemoryData','XPM',[
+ '/* XPM */'#10'static char *TRxMemoryData[]={'#10'"24 24 6 1",'#10'". c None"'
+ +','#10'"# c #000000",'#10'"c c #000080",'#10'"d c #808080",'#10'"a c #c0c0c0'
+ +'",'#10'"b c #ffffff",'#10'"........................",'#10'"################'
+ +'####....",'#10'"#a#baaaaaabaaaaaaaa#....",'#10'"####################....",'
+ +#10'"#a#bbbbbbabbbbbbbbb#....",'#10'"#b#bccccbabcccccccb#....",'#10'"#a#bbbb'
+ +'bbabbbbbbbbb#....",'#10'"#b#bccccbabccccccbb#....",'#10'"#a#bbbbbbabbbbbbbb'
+ +'b#....",'#10'"#b#bccccbabccccccbb#....",'#10'"#a#bbbbbbabbbbbbb###....",'#10
+ +'"#b#bccccbabcbbb#daa#....",'#10'"#a#bbbbbbabbb#daaaaa#...",'#10'"#b#bccccba'
+ +'b#daaaaaaaa#..",'#10'"#a#bbbbbb#daaaaaaaaaad#.",'#10'"#b#bcccbdaaaaaaaaaadd'
+ +'d#.",'#10'"#a#bbbbdbaaaaaaaaddd#a#.",'#10'"########abaaaaaddd#ad#..",'#10'"'
+ +'........#dbaaddd#ad#.#..",'#10'".........#dbdd#ad#.#....",'#10'"..........#'
+ +'a#ad#.#......",'#10'"...........#d#.#........",'#10'".............#........'
+ +'..",'#10'"........................"};'#10
+]);
+LazarusResources.Add('TCURRENCYEDIT','XPM',[
+ '/* XPM */'#10'static char *TCURRENCYEDIT[]={'#10'"24 24 6 1",'#10'". c None"'
+ +','#10'"a c #000000",'#10'"d c #0000ff",'#10'"# c #808080",'#10'"c c #c0c0c0'
+ +'",'#10'"b c #ffffff",'#10'"........................",'#10'"................'
+ +'........",'#10'"........................",'#10'"........................",'
+ +#10'"#######################.",'#10'"#aaaaaaaaaaaaaaaaaaaaab.",'#10'"#abbbbb'
+ +'bbbbbbbbbbbbbbcb.",'#10'"#abbbbbbbbbbbbbaabaabcb.",'#10'"#abbbbbbbbbbbbbbba'
+ +'bbbcb.",'#10'"#abbbbdbbbbbdbbbbabbbcb.",'#10'"#abbbddddbbddbbbbabbbcb.",'#10
+ +'"#abbdbdbbbbbdbbbbabbbcb.",'#10'"#abbbdddbbbbdbbbbabbbcb.",'#10'"#abbbbdbdb'
+ +'bbdbbbbabbbcb.",'#10'"#abbddddbbbbdbbbbabbbcb.",'#10'"#abbbbdbbbbdddbbbabbb'
+ +'cb.",'#10'"#abbbbbbbbbbbbbaabaabcb.",'#10'"#abbbbbbbbbbbbbbbbbbbcb.",'#10'"'
+ +'#accccccccccccccccccccb.",'#10'"#bbbbbbbbbbbbbbbbbbbbbb.",'#10'"...........'
+ +'.............",'#10'"........................",'#10'"......................'
+ +'..",'#10'"........................"};'#10
+]);
+LazarusResources.Add('TRXSWITCH','XPM',[
+ '/* XPM */'#10'static char *TRXSWITCH[]={'#10'"24 24 5 1",'#10'". c None",'#10
+ +'"# c #000000",'#10'"b c #808080",'#10'"c c #ff0000",'#10'"a c #ffffff",'#10
+ +'"........................",'#10'"........................",'#10'".....#####'
+ +'#########.....",'#10'".....##############.....",'#10'".....###aaaaaaa#b##..'
+ +'...",'#10'".....##aaaaaaa#bb##.....",'#10'".....#aaaaaaa#bbb##.....",'#10'"'
+ +'.....#########bbb##.....",'#10'".....#aaaaaaa#bbb##.....",'#10'".....#aaaaa'
+ +'aaa#bb##.....",'#10'".....##aaaaaaa#bb##.....",'#10'".....##aaaaaaaa#b##...'
+ +'..",'#10'".....###########b##.....",'#10'".....##aaaaaaaa#b##.....",'#10'".'
+ +'....##a######a#b##.....",'#10'".....##a#cccc#a#b##.....",'#10'".....##a####'
+ +'##a#b##.....",'#10'".....##aaaaaaaa#b##.....",'#10'".....###########b##....'
+ +'.",'#10'".....###bbbbbbbb###.....",'#10'".....##############.....",'#10'"..'
+ +'...##############.....",'#10'"........................",'#10'".............'
+ +'..........."};'#10
+]);
+LazarusResources.Add('TRXDICE','XPM',[
+ '/* XPM */'#10'static char *TRXDICE[]={'#10'"24 24 4 1",'#10'". c None",'#10
+ +'"# c #000000",'#10'"b c #c0c0c0",'#10'"a c #ffffff",'#10'".................'
+ +'.......",'#10'"........................",'#10'"........................",'
+ +#10'"...........##...........",'#10'".........##aa##.........",'#10'".......'
+ +'##aa##aa##.......",'#10'".....##aaaa##aaaa##.....",'#10'"...##aaaaaaaaaaaaa'
+ +'a##...",'#10'"...#b##aaaa##aaaa##a#...",'#10'"...#bbb##aa##aa##aaa#...",'#10
+ +'"...#bbbbb##aa##aa##a#...",'#10'"...#bbbbbbb##aaaa##a#...",'#10'"...#bbbbbb'
+ +'b#a##aaaaa#...",'#10'"...#bbb##bb#a##aaaaa#...",'#10'"...#bbb##bb#aaaaaaaa#'
+ +'...",'#10'"...#bbbbbbb#aaaaa##a#...",'#10'"...#bbbbbbb#aaaaa##a#...",'#10'"'
+ +'...##bbbbbb#a##aaaa##...",'#10'".....##bbbb#a##aa##.....",'#10'".......##bb'
+ +'#aaa##.......",'#10'".........###a##.........",'#10'"...........##.........'
+ +'..",'#10'"........................",'#10'"........................"};'#10
+]);
+LazarusResources.Add('TRXDBCOMBOBOX','XPM',[
+ '/* XPM */'#10'static char *TRXDBCOMBOBOX[]={'#10'"24 24 6 1",'#10'". c None"'
+ +','#10'"c c #000000",'#10'"d c #000080",'#10'"# c #808080",'#10'"a c #c0c0c0'
+ +'",'#10'"b c #ffffff",'#10'"........................",'#10'".###############'
+ +'........",'#10'".#a#baaaabaaaaa#........",'#10'".###############........",'
+ +#10'".#a#bbbbabbbbbb#........",'#10'".#b#baababaaaab#........",'#10'".#a#bbb'
+ +'babbbbbb#........",'#10'".#b#baababaaabb#........",'#10'".#a#bbcccccccccccc'
+ +'ccccc.",'#10'".#b#bacbbbbbbbbbbbcbbac.",'#10'".#a#bbcbdddddddddbcbcac.",'#10
+ +'".#####cbbbbbbbbbbbcaaac.",'#10'"......ccccccccccccccccc.",'#10'"...d....cb'
+ +'bbbbbbbbbbbbc.",'#10'"..ddd...cbbddddddddbbbc.",'#10'".ddddd..cdddddddddddd'
+ +'dc.",'#10'"...d....cddbbbbbbbbbddc.",'#10'"...d....cdddddddddddddc.",'#10'"'
+ +'...d....cbbddddddddbbbc.",'#10'"...d....cbbbbbbbbbbbbbc.",'#10'"...dddd.cbb'
+ +'dddddddddbbc.",'#10'"........cbbbbbbbbbbbbbc.",'#10'"........cccccccccccccc'
+ +'c.",'#10'"........................"};'#10
+]);
+LazarusResources.Add('ttoolpanel','XPM',[
+ '/* XPM */'#10'static char *TToolPanel[]={'#10'"24 24 10 1",'#10'". c None",'
+ +#10'"# c #000000",'#10'"h c #000080",'#10'"d c #0000ff",'#10'"f c #008000",'
+ +#10'"b c #808080",'#10'"c c #c0c0c0",'#10'"e c #ff0000",'#10'"g c #ff00ff",'
+ +#10'"a c #ffffff",'#10'"........................",'#10'"####################'
+ +'####",'#10'"aaaaab#aaaaab#aaaaab#ccc",'#10'"accccb#accccb#accccb#ccc",'#10
+ +'"adeecb#afffcb#a#eecb#ccc",'#10'"adddcb#afggcb#ahhhcb#ccc",'#10'"accccb#acc'
+ +'ccb#accccb#ccc",'#10'"bbbbbb#bbbbbb#bbbbbb#ccc",'#10'"#####################'
+ +'###",'#10'"....................dd..",'#10'".#################.dddd.",'#10'"'
+ +'.#a#ddddddddd#a#a#dddddd",'#10'".#################..dd..",'#10'".#ccccccccc'
+ +'cccccc#..dd..",'#10'".#c####c#######cc#..dd..",'#10'".#c#aa#c#aaaaa#cc#..dd'
+ +'..",'#10'".#c#aa#c#aaaaa#cc#..dd..",'#10'".#c#aa#c#aaaaa#ddddddd..",'#10'".'
+ +'#c#aa#c#aaaaa#ddddddd..",'#10'".#c#aa#c#aaaaa#cc#......",'#10'".#c####c####'
+ +'###cc#......",'#10'".#ccccccccccccccc#......",'#10'".#################.....'
+ +'.",'#10'"........................"};'#10
+]);
+LazarusResources.Add('trxxpmanifest','XPM',[
+ '/* XPM */'#10'static char *trxxpmanifest[]={'#10'"24 24 9 1",'#10'". c None"'
+ +','#10'"# c #000000",'#10'"c c #000080",'#10'"a c #00ff00",'#10'"e c #9d9da1'
+ +'",'#10'"g c #e0dfe3",'#10'"b c #ff0000",'#10'"d c #ffff00",'#10'"f c #fffff'
+ +'f",'#10'"........................",'#10'"........................",'#10'"..'
+ +'..##...##.####........",'#10'".....##.##..#####.......",'#10'"......###...#'
+ +'#.##.......",'#10'"......###...#####.......",'#10'".....#####..####........'
+ +'",'#10'".....##.##..##..........",'#10'"....##...##.##..........",'#10'"...'
+ +'.....................",'#10'".####################...",'#10'".#aaaaaaaaaaaa'
+ +'#b#c#d#e..",'#10'".####################e..",'#10'".#ffffffffffffffffff#e.."'
+ +','#10'".#ffffffffffffffffff#e..",'#10'".#ffffffffffffffffff#e..",'#10'".#ff'
+ +'ffffffffffffffff#e..",'#10'".#ffffggggggfggggggf#e..",'#10'".#ffffgffff#fgf'
+ +'fff#f#e..",'#10'".#ffffg#####fg#####f#e..",'#10'".#ffffffffffffffffff#e..",'
+ +#10'".####################e..",'#10'"..eeeeeeeeeeeeeeeeeeee..",'#10'".......'
+ +'................."};'#10
+]);
+LazarusResources.Add('TPAGEMANAGER','XPM',[
+ '/* XPM */'#10'static char *TPAGEMANAGER[]={'#10'"24 24 8 1",'#10'". c None",'
+ +#10'"b c #000000",'#10'"c c #000080",'#10'"f c #00ffff",'#10'"d c #800000",'
+ +#10'"# c #808080",'#10'"e c #ffff00",'#10'"a c #ffffff",'#10'"..............'
+ +'..........",'#10'"........................",'#10'".........##############."'
+ +','#10'".........#aaaaaaaaaaaab.",'#10'".......##############ab.",'#10'"....'
+ +'...#aaaaaaaaaaaabab.",'#10'".....##############abab.",'#10'".....#aaaaaaaaa'
+ +'aaababab.",'#10'".....#acccccaddddababab.",'#10'".....#aaaaaaadaadababab.",'
+ +#10'".....#accccaadaadababab.",'#10'".....#aaaaaaadaadababab.",'#10'".....#a'
+ +'bbbaaaddddababab.",'#10'".bbbbbbeaebaaaaaaababbb.",'#10'".bbbfbeabbbbbbbbaa'
+ +'bab...",'#10'".bbbfbaeaeaeaeaebabbb...",'#10'".bbbfbeaeabbbbbbaab.....",'#10
+ +'".bbbfbaeaeaeab###bb.....",'#10'".bbbfbeaeabbb...........",'#10'".bbbfbbeae'
+ +'aeb...........",'#10'".bebbb.bbbbb............",'#10'".bbb.................'
+ +'...",'#10'"........................",'#10'"........................"};'#10
+]);
+LazarusResources.Add('TRXAPPICON','XPM',[
+ '/* XPM */'#10'static char *TRXAPPICON[]={'#10'"24 24 9 1",'#10'". c None",'
+ +#10'"a c #000000",'#10'"f c #800000",'#10'"c c #808000",'#10'"e c #808080",'
+ +#10'"g c #c0c0c0",'#10'"# c #ff0000",'#10'"d c #ffff00",'#10'"b c #ffffff",'
+ +#10'"...........###..##...##.",'#10'"............#..#..#.#..#",'#10'".......'
+ +'.a...#..#....#..#",'#10'"......aabaa.#..#....#..#",'#10'"....aabbcdda#..#..'
+ +'#.#..#",'#10'"..aabbccccc###..##...##.",'#10'".abbddddddddddda........",'#10
+ +'".aaaaaaaaaaaaaaa..##b...",'#10'".abddeebddeebdda...##b..",'#10'"..cceeecce'
+ +'eeccc....###b.",'#10'"..cbebbcbebbcbc.####d#..",'#10'"..cdebbcdebbcee##d##d'
+ +'#b.",'#10'"..cbebbcbebbcebfd#dd#b..",'#10'"..cdebbcdebbcebbfbb##...",'#10'"'
+ +'.adddaadddaadebgbf###b..",'#10'".aaaaaaaaaaaebbgegf#....",'#10'".adbdbdbdbd'
+ +'ebebegeea....",'#10'".aaaaaaaaaebebeeaaaa....",'#10'".........ebebeea......'
+ +'..",'#10'"........ebgbeea.........",'#10'"........agbeea..........",'#10'".'
+ +'.......aeeaa...........",'#10'".........aa.............",'#10'"............'
+ +'............"};'#10
+]);
+LazarusResources.Add('TSECRETPANEL','XPM',[
+ '/* XPM */'#10'static char *TSECRETPANEL[]={'#10'"24 24 11 1",'#10'". c None"'
+ +','#10'"# c #000000",'#10'"d c #000080",'#10'"i c #0000ff",'#10'"e c #008000'
+ +'",'#10'"g c #800000",'#10'"a c #808080",'#10'"b c #c0c0c0",'#10'"h c #ff000'
+ +'0",'#10'"f c #ffff00",'#10'"c c #ffffff",'#10'"........................",'
+ +#10'"........................",'#10'".######################.",'#10'".#aaaaa'
+ +'aaaaaaaaaaaaaab#.",'#10'".#aaaaaaaaaaaaaaaaaacc#.",'#10'".#aabbbbbbbbbbbbbb'
+ +'bbcc#.",'#10'".#aabbbbbd#dbbbbbbbbcc#.",'#10'".#aabbbbdefedbbbbbbbcc#.",'#10
+ +'".#aabbbb#fff#aabbbbbcc#.",'#10'".#aabbbbdefedbb##bbbcc#.",'#10'".#aabbbbbd'
+ +'#dbbbggbbbcc#.",'#10'".#aabbbbabbbbb#hh#bbcc#.",'#10'".#aabbbbabbbbb#hh#bbc'
+ +'c#.",'#10'".#aabb#####bb#hhhh#bcc#.",'#10'".#aabb#iii#bb######bcc#.",'#10'"'
+ +'.#aabb#iii#aabbbbbbbcc#.",'#10'".#aabb#iii#bbbbbbbbbcc#.",'#10'".#aabb#####'
+ +'bbbbbbbbbcc#.",'#10'".#aabbbbbbbbbbbbbbbbcc#.",'#10'".#accccccccccccccccccc'
+ +'#.",'#10'".#bccccccccccccccccccc#.",'#10'".######################.",'#10'".'
+ +'.......................",'#10'"........................"};'#10
+]);
+LazarusResources.Add('TRXLABEL','XPM',[
+ '/* XPM */'#10'static char *TRXLABEL[]={'#10'"24 24 3 1",'#10'". c None",'#10
+ +'"# c #000000",'#10'"a c #ffffff",'#10'"........................",'#10'"....'
+ +'....................",'#10'"........................",'#10'"...............'
+ +'.........",'#10'"........................",'#10'"........................",'
+ +#10'".........####aa.........",'#10'"..........####aa........",'#10'".......'
+ +'..#####aa........",'#10'".........##a###aa.......",'#10'"........##aa.##aa.'
+ +'......",'#10'"........##aa.###aa......",'#10'".......##aa...##aa......",'#10
+ +'".......##########aa.....",'#10'"......##aaaaaaa##aa.....",'#10'"......##aa'
+ +'.....###aa....",'#10'".....##aa.......##aa....",'#10'"....####aa.....####aa'
+ +'...",'#10'".....aaaaa......aaaaa...",'#10'"........................",'#10'"'
+ +'........................",'#10'"........................",'#10'"...........'
+ +'.............",'#10'"........................"};'#10
+]);
+LazarusResources.Add('tautopanel','XPM',[
+ '/* XPM */ '#10'static const unsigned char * tautopanel_xpm[] = {'#10'"24 24 '
+ +'5 1",'#10'" '#9'c None",'#10'"!'#9'c black",'#10'"#'#9'c #808080",'#10'"$'#9
+ +'c white",'#10'"%'#9'c #FF0000",'#10'" ",'#10'" '
+ +' ",'#10'" ################### ",'#10'" #$$$$$$$$$$$$$$'
+ +'$$$ $ ",'#10'" #$ #$ ",'#10'" #$ #$ ",'
+ +#10'" #$ #$ ",'#10'" #$%% #$ ",'#10'" #% %'
+ +' % #$ ",'#10'" #% % % #$ ",'#10'" #% % % % %%% '
+ +' %%$ ",'#10'" #%%%% % % % % #% ",'#10'" #% % % % % % #% ",'#10
+ +'" #% % % % % % #% ",'#10'" #% % % % % % #% ",'#10'" #% % %'
+ +'%% %% %%$ ",'#10'" #$ #$ ",'#10'" #$ #'
+ +'$ ",'#10'" #$ #$ ",'#10'" #$ #$ ",'#10'"'
+ +' # #################$ ",'#10'" $$$$$$$$$$$$$$$$$$$ ",'#10'" '
+ +' ",'#10'" "};'
+]);
+LazarusResources.Add('TRxCalendarGrid','XPM',[
+ '/* XPM */'#10'static char *TRxCalendarGrid[]={'#10'"24 24 5 1",'#10'". c Non'
+ +'e",'#10'"# c #000000",'#10'"a c #00ffff",'#10'"c c #800000",'#10'"b c #ffff'
+ +'ff",'#10'"........................",'#10'"........................",'#10'".'
+ +'.....###.....###.......",'#10'".....#...#...#...#......",'#10'"....########'
+ +'######......",'#10'"....#a#aaaaaaaa#a##.....",'#10'"....#aaaaaaaaaaaa##....'
+ +'.",'#10'"....###############.....",'#10'"....#bbbbbbbbbbbb##.....",'#10'"..'
+ +'..#bbbbbbbbbbbb##.....",'#10'"....#bbbccbbbcbbb##.....",'#10'"....#bbcbbcbc'
+ +'cbbb##.....",'#10'"....#bbbbcbbbcbbb##.....",'#10'"....#bbbcbbbbcbbb##.....'
+ +'",'#10'"....#bbcbbbbbcbbb##.....",'#10'"....#bbccccbbcbbb##.....",'#10'"...'
+ +'.#bbbbbbbbbbbb##.....",'#10'"....#bbbbbbbbbbbb##.....",'#10'"....#bbbbbbbbb'
+ +'bbb##.....",'#10'"....###############.....",'#10'"......#############....."'
+ +','#10'"........................",'#10'"........................",'#10'"....'
+ +'...................."};'#10
+]);
+LazarusResources.Add('TRxDateEdit','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#3#0#0#0#215#169#205
+ +#202#0#0#3#0'PLTE'#1#0#0#0#0#0#128#0#0#128#128#0#0#0#128#128#0#128#0#128#128
+ +#128#128#128#192#192#192#255#0#0#0#255#0#255#255#0#0#0#255#255#0#255#0#255
+ +#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0','#144#198'\'#0#0#0#1'tRNS'#0'@'#230#216'f'#0#0#0#136'IDATx'#218
+ +'u'#145#139#10#128' '#12'E7'#130#22#132#254#255'o'#166#4'M'#8#155'R'#168'k*l'
+ +'x'#207'^*'#194'd!'#144'%s'#1#233#175#251#163#2#223#2#233'u'#127#192'b3Z'#128
+ +#129'z'#16't'#151#252#1#31#246#166#158'>T@e<#c'#19#127#161#186'G~'#5#194'!'
+ +#137'z@'#220#233#3#232'+)'#16#29'D98'#13#162'H'#194#166#25'+Y'#0#170'5'#128
+ +#188'V2z'#128#179'K'#217#227#242'r'#203#134'b'#238#225#230#147#183#210#31#159
+ +'Ud['#15'h'#23'Z'#25#23#189'C'#28#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxClock','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#3#0#0#0#215#169#205
+ +#202#0#0#3#0'PLTE'#1#0#0#0#0#0#0#128#0#128#128#0#0#0#128#128#0#128#0#128#128
+ +#128#128#128#192#192#192#255#0#0#0#255#0#255#255#0#0#0#255#255#0#255#0#255
+ +#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0'IF'#160'|'#0#0#0#1'tRNS'#0'@'#230#216'f'#0#0#0#132'IDATx'#218
+ +#157#146#193#14#128' '#12'C'#187#19#254#255#215#202#169'2'#6#172'j8('#9#4#246
+ +'h'#10#20#195#166#217'?`'#160'V8'#129#29'8'#25'[8'#22#29#180')N'#160'8'#168
+ +#128#175#152#192#203#181#15#9#188#199#246')'#226'2/'#171#234'3B'#193'R'#8'h'
+ +#245#154#30'%'#136#165'`*'#20'T'#164#2#229#165#184#153#168'G'#24#136'GJ'#30
+ +#167#218#223'cH'#6#163#230'ay*jP>'#206#135#130'('#172#7'1'#242#0#196'|'#147
+ +#224#183#207'p'#1#206#241'B'#25'c'#4#211#189#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxSpeedButton','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#3#0#0#0#215#169#205
+ +#202#0#0#3#0'PLTE'#1#0#0#0#0#0#128#0#0#128#128#0#0#0#128#128#0#128#0#128#128
+ +#128#128#128#192#192#192#255#0#0#0#255#0#255#255#0#0#0#255#255#0#255#0#255
+ +#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0','#144#198'\'#0#0#0#1'tRNS'#0'@'#230#216'f'#0#0#0#173'IDATx'#218
+ +'}'#146#209#14#195' '#8'E/mWX'#154#253#255#135#246'E'#172'+'#131#166#217'tu3'
+ +#198#135's@'#8'J'#248#177#8#224#14'V'#23',W'#158#178#133#208#139#176#139' '
+ +#204#218#21#167#169#133'='#253#152#202#13'a*Q'#2'{'#139#24'v'#171'3<~'#196
+ +#224#212'w'#147#225#9#163#172#247'}'#192#222#214'8'#4#214#7'2'#172#233'jJ'
+ +#178#137#242#202#248#234#170'8'#135#26'e'#182'25'#25#155'$Id'#200'Kj'#132#5
+ +#247#2'Q'#170'T'#226#228#139#159#178#209'G'#152#215#13'~'#12#165'T])'#191'y'
+ +#196'Wb'#246#235#185'7v'#253'zF'#251#255'P'#189#175#16#2#212#17#214#165#199
+ +'z'#1'i'#21#144#25#14'l'#154#14#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxSpinButton','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#3#0#0#0#215#169#205
+ +#202#0#0#3#0'PLTE'#1#0#0#0#0#0#0#128#0#128#128#0#0#0#128#128#0#128#0#128#128
+ +#192#192#192#128#128#128#255#0#0#0#255#0#255#255#0#0#0#255#255#0#255#0#255
+ +#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#200'7q|'#0#0#0#1'tRNS'#0'@'#230#216'f'#0#0#0'wIDATx'#218#173#210
+ +#189#14#128' '#12#4#224#178#224#198#251'?'#167#19#215#5'M9'#180#252#24#19#163
+ +#11#201'}'#205#137'H'#144#135'''|'#130#25#11'!u)pC'#246#29'H'#187#7#149#216
+ +'r'#192#129#158'k'#172'y'#14#14#212#166#163#229#226#129'U'#150'/'#160#230'30'
+ +#31#160#246#176#176#3#155'_@'#237#153#129#243#182'i'#15'|'#175#242'c.'#0#247
+ +'3Vm'#24#142#177#129'$'#244#7'_^~'#212'O'#151#225#0'g$X'#25']'#5'r'#173#0#0#0
+ +#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxSpinEdit','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#3#0#0#0#215#169#205
+ +#202#0#0#3#0'PLTE'#1#0#0#0#0#0#0#128#0#128#128#0#0#0#128#128#0#128#0#128#128
+ +#192#192#192#128#128#128#255#0#0#0#255#0#255#255#0#0#0#255#255#0#255#0#255
+ +#255#255#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#200'7q|'#0#0#0#1'tRNS'#0'@'#230#216'f'#0#0#0'kIDATx'#218#189#145
+ +'A'#11#192' '#8#133#237#226#6#131#253#255#223'9'#8#182'wij'#130'c'#213#161'K'
+ +#217'A'#222'G'#234#179'D'#131#147#214#128#189'#'#223#6'6'#203#175'S'#130'-'#5
+ +#149#15#16'B'#2#160#23#14#178#234#135#1#16'q'#23'h!y'#19#165#242#0#136#238'='
+ +'T'#15#160'z4'#159#3#168's'#181'>'#192#191#169#220'9'#185#245#10#158'vWe'#213
+ +'GM'#130#23#211'$E'#25#128#18#229'#'#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRXDBSpinEdit','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#9'pHYs'#0#0#14#156#0#0#14#156#1#7#148'S'#221#0#0#1#230'IDATH'#137#205
+ +#148#193'j'#19'Q'#24#133#191#127'2'#142'+)}'#129#190'D'#23#226'"P_A'#220#187
+ +#200'n'#210#216'M'#7#178'(C'#9']T"*'#212'd#]'#248#12'n'#5#145','#220#139'o'
+ +#224#170#22#196#166#134#218'af'#174#139#206#157#220#153';'#153#220#22#4#15#4
+ +#238#127#239#253#207#185'9'#255'a'#224#31'C'#244'"'#12'C'#165#215#211#233'T@'
+ +#169#230#150#178'U'#218#207#13#132'a'#168#148#162#252#153'b'#205'X'''#222'B'
+ +#190'JD)'#147#212']'#192#3#232#247#195#202'f'#189#6#16#145#194'6Mn'#174'm'
+ +#232#7#249#0#147#201#180'BZ'#175'M'#153'*'#233#234'9'#220'<'#168#16#208#164
+ +'n'#208'"nC'#22#237#181')'#160'_'#191#189#253#208'Q'#180#25#189#222'3i'#181
+ +#232#219#215#217#157#201#15#15'cz'#189'5'#22#189'z'#243#206#218'K'#146#132' '
+ +#8#0#200#178#12#127'gh'#221'Q'#179'1'#243'_'#223#129'B'#160#223#15#27'-jB'#16
+ +#4#229#4#252#157'!'#217#231#23#214#29#233'F\|x'#190#20'Xe'#209#163#193#167'J'
+ +#227#151#147#199#0#228#10':'#197#136#207#206#23#0'D'#251#3#198'/O,'#177'V'
+ +#139'4a]'#168#227'-'#215#151#243#5#163#209#176#20#137#227'c['#160#205'"M'#174
+ +#197#234#184#248#249#155#189#221#131'JmB'#160#250#161#211'x'#253'vB '#235#5
+ +#164#27'Y{z'#200#27#155'['#226#129#157'wWr'#23#148'3'#184#127'/a\'#196#178
+ +#227#216','#221#200'-E'#26'JA'#206'2!.8;_'#16#237#15#202#186#158'$'#207',D '
+ +#184#5'9'#220#164'H'''''#142#143#185#156'/*'#231#149#127#224#145#146#233#173
+ +'|'#233'}Z'#156#231')x'#2#190#225#161'N'#205#222#238#129#149' K@'#169#28'H'
+ +#16#229#225'y>Y'#14'H'#138#200#21#29#30#212'nC:'#27#225'wc'#139#244#207#199
+ +'#'#174#175'~'#0'ELOO'#223#171#167'O'#238#158#148'U'#216#216#220#186#165#225
+ +#255'#'#254#2#182'2'#241'd'#141']'#3'd'#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxTimeEdit','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#9'pHYs'#0#0#14#156#0#0#14#156#1#7#148'S'#221#0#0#1'TIDATH'#137#237'TAN'
+ +#195'0'#16#156')'#136'7'#181#183#210#15' '#238'H'#28'zm'#223#144#245#7#16#18
+ +#220'P+'#193'C'#218'T'#28#224#140#248#13#18#195'!'#177#177#235#196'mQ'#17#23
+ +'F'#178'6'#235#216#187#179';'#155#0#255#248'k'#16#0'$i'#185'|'#250#149#4#167
+ +#177#243#254#246'|'#212#224#23#151'Wi'#2#0#184#185'}8Z'#130#205'f'#131'A'#223
+ +#203#209'|'#157#216']'#251#30'$'#19#191'7'#193'Op'#194#179',Ig'#2#146'x'#189
+ +#159'$'#150'd'#198'>'#174#130'$>'#241#145#248#1#146#180'X<'#10#128#26#183'Yf'
+ +'&3'#11#254#247'{i8[i'#23#234#186'V'#16'y:'#189'n'#147#245#183'@'#2#200#134
+ +#221'p'#182#194'h'#190#198#203#221'9'#156's'#157#231#199#227'q3E$C`'#231#12
+ +'Ue'#0#16#172#135's'#6#201#218#22'L'#160#18#155#140#156#242'e='#251#190']'
+ +#251#180'h'#208#6#135'sV'#166#144'U'#146#10#233#7'!^E'#246#187'*'#232#170#2
+ +'H'#7'!'#136#236#217#199'=wL'#173'G'#149'T'#155'V-'#169#213'S'#217#254'Q*'
+ +#232#210#128#177#6#219'SS'#210#160#170#12'$P'#215'u'#241#172'o'#192'!'#19#215
+ +'\dr'#191#23#217#175#162'4M'#135'LZ '#18'='#11'H'#191#228'.'#241#227#201#220
+ +'''A\'#1#183#2#228'l'#14#12'^:'#216#167#200#222#129'='#190#0'q'#209'z'#166'R'
+ +'2h'#222#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxDBTimeEdit','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#9'pHYs'#0#0#14#156#0#0#14#156#1#7#148'S'#221#0#0#1#159'IDATH'#137#181'V'
+ +'1N'#195'0'#20'}?'#148'r'#131'\'#164#3'e3''@'#236#136#165'bq'#138#16'G'#232
+ +#196'X!'#154','#168#11#7')'#223',='#6'Co'#193#242#25#26#187#174'c;'#141#16'O'
+ +#138#226#196#254#239#253#255'l'#199#1#254#25'd'#27'Zk'#177#237#166'i'#8#16
+ +#137#135#184'P'#202#247'{'#208'Z'#139#8#220#229#139#197#209''''#158'!'#207
+ +#139#136't'#175'<'#200#18#213'u'#227'^V'#149#6#0'L&'#151#157#128#217#236#222
+ +#181#215#235#143#222#2'Hk-u'#221'8R+VU'#26#23#231'?'#209#160#229#235';'#158
+ +#159#30'z'#201'on'#239#242#22#253#21#204','#133'oIh'#17#0'\=~'#30#245#217#231
+ +#240#189#179'$X\#'#223#146#208#162#161'8'#163#177#19#145'v'#254'G>i*'#27'Z'
+ +#237#159#167#243'M'#167#138#237#219'u4s"'#2'3'#231'WQY'#150#0#0#165#212#209
+ +']D'#142#200'S0'#198#12#179#136#153#161#148#2#17'a:'#223'8'#145#197'b'#17#21
+ +'PJ'#229'-'#178#25#251#2#204#236#250#228#132#13#157#183#168'i'#160'Z'#194#152
+ +'x'#159#128'1'#6#4'@'#180#238#218#177'\'#213'x)(*`'#173#242'E'#194'I'#182#227
+ +#10#160#251'IX'#174'j'#140'3'#223#202#208':'#0#157'j'#142#150#233'n'#247#141
+ +#178',]'#224#246#203#128#219'6'#7'd'#202#155#135#152#136#191#7#128#253'y '
+ +#169#0'V*9'#7#182#146#220'<'#184'e'#10#28'|'#13#179#141#10'{c'#141'1I'#1#224
+ +'p'#162'%'#171'H'#161#21#232'='#213#138'Xv)'#12'M"'#204'@B'#18#127'SYx'#237
+ +#147#206'd'#191#2#10#201'B'#12'%'#207#13'L-'#141#211#255'$Z'#252#2'}'#212'D'
+ +#152'a'#180#26#28#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxDBProgressBar','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#9'pHYs'#0#0#14#156#0#0#14#156#1#7#148'S'#221#0#0#1'''IDATH'#137'c`'#160
+ +'1`d```'#200#202#202#250#15#19#152'6m'#26'#'#3#195#255#255#184#181#192#181'2'
+ +#18'eCVV'#214#255#255#255#25#224#24#217'2'#220#128#24#7' '#148#254'G'#199#132
+ +'-!'#222#2#166#236#236','#20#1't>'#166#193'0'#195#145#217#184#1#227#255#255
+ +#12#255#145#13#157':u'#26'Cvv'#22'4.pY'#2#215'N0'#30'X`'#134#18#15#24#161#137
+ +#128#184'Hf'#204#202#202#250#143'l'#1#204'7'#188#188#26'$X'#138#9':;'#243#24
+ +#25#24#240#4'Qp`'#16'E'#22#236#218's'#141#161#179'3'#143#17'g'#16#25#153#24
+ +'2x'#214'^'#132#243#183'7'#235'c'#240'q'#129'sg'#206#195#217','#217#217'Y'#12
+ +#216#130#136#129#129#129#161'6'#206#0'I'#219#127#12'>1'#128#5#22'$0'#128#204
+ +'?w'#247#11'\'#220'J'#149#27#131'O'#148#5'0C'#177#129#173'G'#239#192#217'9'
+ +#30#250#24'|b'#0#137#25#141't'#192#130#205#208#254')S'#25#190'}|G'#21#11#24
+ +#231#206']'#248#255#236#217#147'('#134#179'120'#236#219#179#151'"'#131'a'#201
+ +#20#158#27#203#203''''#17'_B'#18#1'`'#25'm'#20#140#130'!'#0#0#6#165#149#157
+ +#16'*hH'#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxDBTrackBar','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#9'pHYs'#0#0#14#156#0#0#14#156#1#7#148'S'#221#0#0#1'SIDATH'#137#237'T'
+ +#177'n'#194'0'#16'}F'#217'*v'#182'D'#130#161#202#152#137'.'#208#181'R'#7'>'#3
+ +']('#234#22'~!S$P,~'#161'_'#208#13#214'N'#29'Y*'#132#170'J'#253#139#234':'#4
+ +#187'Il'#167')*'#27'O'#178'd;'#207#239#249#238'|'#1#206#12#161'&D'#196'j.'
+ +#165#20#0#179#133'.'#204#189#22' "f'#134#30'e'#179#31#216#12#127#135' "'#206
+ +'si|'#136'c:FR6(" '#185'7'#204'$'#245#173#209'yJ'#172'l'#18#199#228#184'y1'
+ +#127#221'm[G'#224#1'@'#158#203#138'hu-*'#245'H'#146#21'z'#189'/L&'#247#154#31
+ +#4#3','#174#150#156#166's#'#10#175','#234#134'2'#17#2'X'#254#169#22'B'#21#212
+ +#150#162'n'#247#218'z'#200#26#193'be'#240#210't.'#26'S4'#157#222#25#135#214
+ +#235'g'#231'm'#203'|'#197'kL'#209#199#251#167'S'#204#6#27#191#241#21#141'n'
+ +#199'F'#209#146#196']'#3#27'_7'#25#17#233#225'n'#182#2#195#217#134#179','#227
+ +#195#225#141#153#153#135#179#141#147#219#242#21'U'#17#133'>'#158'v'#192'c0'
+ +#192#205#195#22'Q'#232#227#197#193#237#0#245#198'2'#215'uH'#234#139'('#244
+ +#181#184#171#139#129#227#207#206#150#142#234'o'#194#14#146'{n'#18#215#6'u'
+ +#147'6'#226''''#195#245'JN'#221#239#252#223#213'.'#184#224'\'#248#6#216#165
+ +#172#203#24'='#180#201#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxLoginDialog','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#9'pHYs'#0#0#14#156#0#0#14#156#1#7#148'S'#221#0#0#1#212'IDATH'#137#213
+ +#149'?hSQ'#20#135#191#27'S'#229#17'hET'#208','#25#218'A%T'#168'"'#220'!'#185
+ +'NJ'#165#155'S'#187#212#209'!'#234#224#164#203'-d'#233#148'5'#16#138#144#205
+ +','#26#23'!'#211'u'#17#137#155#8'>'#130#213#169')Ei'#254',Akr'#29#170#177#205
+ +'K^^'#211#183#248#155#238';'#247#156#243#157#195'}'#156#3#255#187#196#160'A+'
+ +'l'#255'l'#236#224#245'Xi%'#254#196#238#231#142#30#190#182'v'#144'i'#189'5'
+ +#140#148#224'`A'#214#130#16#209#145#222'C'#131#142#174'C'#229'i'#173#143#151
+ +'m@Zko'#7'J'#169'P'#146#27'c'#0#136'L'#18'\.'#151')'#22#139#129'|'#143#12#232
+ +'v'#187#8'!p'#28#135'R'#169#20'.'#192'u]'#242#249'<'#213'j'#149'B'#161#128#16
+ +#130'L&'#19#30' '#153'L'#226#186'.'#217'l'#150'J'#165#130#148#146'h'#212#255
+ +'G'#28#9'x'#244'p'#133#31#173#28'ra'#11'y'#173#133'\p'#233't:'#244'z'#189#190
+ +'O<'#30''''#151#203'M'#6#184'}]0?{'#158'''K+|'#251#186#195#148'3G'#235#251'6'
+ +#141'F'#131'g'#27#247'}'#147#30#212#200#254'"'''#247'85'#245#18#189#241#24
+ +#219'^'#167#241#22'Rg-'#175#239#213'9w'#165'N- '#192#247#13'b'#177#203#196#18
+ +')j;'#155#156'Im'#146'X'#252'B'#236'B'#224#226#253#1#246#215'O'#232#188#1#166
+ +#153#191#4#167#29'x'#250' A'#228'DH'#128'['#203'/'#216'k'#3'8'#0#172'.'#193
+ +#221#197'&'#187#159'C'#2#0#188'o'#27'^'#173#223#160#249#1'n^'#133'O'#239#154
+ +'<'#175'C'#237#162#9#12#24';Mg'#164#225'#0#'#247#191#239#200#192#185#129#9'F'
+ +#133'1'#6#149'V'#168#180#234#15'4c'#12'i'#165'H'#171#127#182#191#26#219#193
+ +'0'#233'5'#237#177#173'i'#175'm"'#192#176'q'#238'7'#226#189';9'#164#165#163
+ +#181#14#190'k'#143#163#223'|G'#141#138'p'#211'x'#28#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxVersionInfo','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#9'pHYs'#0#0#15#18#0#0#15#18#1'!'#155#242'3'#0#0#0#252'IDATH'#137#213#149
+ +#193#17#194' '#16'E_'#28#155#240'H'#27#30#215'2l'#197'v'#210#6'G'#219#224#152
+ +'2'#240#144'0'#129'5'#192'2'#234#193#127'av'#242#243#31#11#132#192#191'k'#234
+ +'[b'#204#236#6#191#25#144#7#191#189'f'#6'U'#140#173#240'1'#200#129#201#18'n'
+ +#135'('#195'Qx'#30#210'{'#254#174'S'#135'?'#181#235#190#26#179'k'#133#217#189
+ +#157#14'>'#215'P'#7#207'Y'#6#14#0'\'#239'~:'#151#129'9$'#198#28#178#204#18#17
+ +#25#201'g'#153#137#231#182#165#132#0#224'}Q'#6#192'5'#192#10#160#187'H'#16
+ +#128#219':'#168'0'#215#158#161#6#212' '#187#130#247#135#161'a'#131#233#142'*'
+ +'KT'#135#212#150#195#169#177#3'H'#16#208#160#162#3#17#194#182'''Nd'#221#159
+ +#180'E'#210#5'h'#208'zDu'#7'E'#237#217#129#8#200#215'?4'#159#168'[-'#150#31
+ +#206#174#214#135#230#0#2#132#176#6';'#7#151#199'c'#248#238'2*'#198#180'w? '
+ +#148#135#226#135#151#221#248#213'nT'#217#193#11#31'-T'#255'GS='#145#0#0#0#0
+ +'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxAboutDialog','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#9'pHYs'#0#0#14#156#0#0#14#156#1#7#148'S'#221#0#0#0#228'IDATH'#137#213
+ +#149#209#13#195' '#12'D'#143'*{q'#155#197#217#204#153#140'~P'#8'%'#16#28#20
+ +'U'#234#251#1','#235#14#3'2'#192#191#227#210'D'#136#144#231#26#218#217#6#132
+ +#238#163#17#181#151#24#14#161#240#138#145'jm'#193#161#220'X'#8#128's'#139'-y'
+ +#30#7#0'"'#242#140'Z'#133#136#28#21#144'l&'#145#254'k'#173#186#155#196'U'#21
+ +'@'#190#131'ka'#9'['#28#221#154#227'V'#163#215'H'#220#178#129'+'#186#21#148
+ +#136'[Mb&'#131'zg'#233'xZF'#164#31#30'U'#243#136'Z'#204'Va6'#152#229#247#6
+ +#214#231'g'#205#237#190#162#242'r'#203#245#221#187'h'#26#168#238#224'@'#200
+ +'Zi'#183#130'$0'#219'*'#134#6#179#130'5'#183'_'#145#170#130#158#160'gnh'#170
+ +#10'O'#194#243#136'%L'#173#162'F69'#197'69'#199#166#12'Zm'#189#215#234#129
+ +#242'O~'#248#211#17#145#251#127#238#12'o'#239#175'R'#255#176#141'Ys'#0#0#0#0
+ +'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxDBCurrEdit','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0'0'#0#0#0'0'#8#6#0#0#0'W'#2#249#135
+ +#0#0#1'HIDATx'#218#237#151'A'#14#131' '#16'E'#165#139#246#6#158#199#243#224
+ +'!JO'#208'Ma'#231#162'7'#209'e'#23#158#137':'#137#180#160'B-'#181#14'$'#243
+ +#19#3#26#193#255#252#163'(+2'#23#195'6@'#0#216#6#8#0#219#0#1'`'#27' '#0'l'#3
+ +#4#128'm'#128#0'b'#7'r'#206#181#233'+'#165#134'y'#180#14#143'`'#127#185'YQ'
+ +#147#130'y)'#213'k'#191#174#249#8#225#19#192'%'#2'05'#31#134'XJe['#144'('#0
+ +'h'#167#9#128#202#178#156#157'/'#196#217#234'_'#130's'#11'!'#190#246#19#157
+ +#128'1m`'#198#4'<'#163#244#154'KE%'#179'i'#9'I)c<'#20']'#215#21'UU'#237#7#0
+ +#237'R'#9'}'#2'`c'#249#235#225#209#176#251#187#3#248'Jhm'#2'`^['#207'7'#10
+ +#192'T'#6#128'-'#172#8#211'c'#232#0#208'.'#149#144'Rn'#2#246#219'?)'#128'P'#9
+ +'e'#145#128#127'!{'''#224#26'N'#12#0'Z'#223'['#200#152#181'M'''#5'`C'#216#186
+ +#222'dq:'#188#247#147'M'#0#212'4w'#221#247#15#199#252#145#249#204#206#161'P'
+ +#1#134#239#21'=l'#142#129#213#23'Ka!'#251#5#192''''#20#128#182'm7'#3#0#237#13
+ +#144#204#175'h2F'#8' W'#17#0#182#8#0'['#4#128'-'#2#192#22#1'`'#139#0#176#149
+ +'='#192#19'C'#237#245'1T'#130#194#231#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxViewsPanel','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#23#8#6#0#0#0#17'!'#143'-'
+ +#0#0#0#9'pHYs'#0#0#14#196#0#0#14#196#1#149'+'#14#27#0#0#0#233'IDATH'#137#205
+ +#149'Q'#14#132' '#12'D'#167#27#239'Eof'#185'Y9Y'#247#3'QD\'#17'4'#217#249'Q'
+ +#155#240'F'#24''''#146#153#25#17'^'#145#25'@'#128#153#13#130#8#128#157'\'#211
+ +#253'k'#154'D'#4'"'#243#226#149#203#160#26#192#204#16#17'0'#243'm'#184#170'b'
+ +#138#183't8("'#2#243'~'#230#156#3#0#132#16'v'#207'I'#229'<3'#0#208#144't'#8#1
+ +#206#185#29'8'#135#214#230#19'n*-l'#157'/'#6#6#170'd'#240#132#178#29'\'#3#187
+ +'3'#144#195#219'GIa'#218#157#129#192#14'&%'#188'\'#216':_'#143#232#12'8'#170
+ +','#131#235#144#7'zP/Zi2'#212#3#242#180#226'~U'#174';'#131'+p'#175#214#162'A'
+ +#254#160'h'#221#6#173'E'#235#209#231#12#244'T/'#226#14#196#3'H?'#158'M'#241
+ +#135's'#31#170#170#155#193'>N('#153#180#23#248']'#131'#'#145'Zs'#240'vy'#153's~'#191
+ +#197'w-'#145#224#217#196#4#23'#'#17#206'vw'#215'?'#7#149']t'#191#175#143#31#7
+ +#7#148#14#15#25#201'f-'#220#247'kk'#156#238#236#228#227#214#22#224#240#171'p'
+ +#170'Als'#147#184'apit'#148#231#211#211#166#255's>'#207#203#249'yF'#178'Y'
+ +#190#20#10#188'[]'#173#190'A!'#191'W3p%'#154'ZZ'#8#206#206'r'#175#167#135#221
+ +'L'#134#243#3#3'<'#141#197#184'29'#201#25#175#151'P2'#201#210#208#144#133'#'
+ +#142#166#170'""2'#211#218'*_'#13'C'#202'x'#157'N'#203#131#254'~y'#181#184'('
+ +#15#3#1#145'R'#201#252#182#30#143#139'e'#243'T.'#138#227'P'#225'D'#131'V'#247
+ +'n'#197'A'#252#159#226'''{'#212#26#152#181#14#208#246#0#0#0#0'IEND'#174'B`'
+ +#130
+]);
+LazarusResources.Add('TRxDBRadioGroup','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#4'sBIT'#8#8#8#8'|'#8'd'#136#0#0#0#9'pHYs'#0#0#14#156#0#0#14#156#1#7#148
+ +'S'#221#0#0#3#20'IDATH'#137#181#148'oHSa'#20#198#127'W6W'#162#169#149#174#132
+ +#18#141#129#144#181'0('#130#178'2"'#168#232'C'#4#150'#n'#136#179#160#192'>E'
+ +#127#160'B'#20#194'/aEbAq'#145'5'#252#16'ad'#31'"E'#199#2#177'0Z'#22#253'C]'
+ +#162#209#148#210#178'?z'#213#211#135#177#185'5'#231'4'#233#129#203#189#231
+ +#188#231'}'#158#251#156#247#240'*'#132#192#233#234#151#155#15#186#152#14#205
+ +#9#143#167#205#199#130#242'7q'#245'q+'#185'+'#19#233#252'8'#130'oh'#20#223
+ +#240#24#190#161'Q'#202':4'#228#194#133'9'#11#24#0'n>'#232'b'#173'e1Y'#230#133
+ +#248#134'F'#233#132'0r'#223#240'XpC'#229#130#5'$fd '#147#147#152#146#146#216
+ +'s'#253':+'#183'l'#225#231#192#0#181'yy'#28'ii!u'#213'*'#0#156#251#246#17#7
+ +#144#189'b'#17#158#247'_hp'#247#133#145#6#222'?~O'#132#253#149#189#189#157
+ +#147'==l,+'#163#161#184#24#128#132#180'4'#10'**'#184'o'#183#131#8#157'N'''
+ +#191#191'~'#245';'#0#216#180'&'#141#244#228'x'#162#157#1#9#145#169#236#29';h'
+ +'>'#191#242#241#211#227#201#174'^H'#146#240#167#200#147
+ +#241#5#0#227#201'e'#222'gc'#128'{'#235#174#21'9'#164'i'#140#226'B&R'#7#203'z'
+ +'oE'#14'i'#2#180#14#4#145#198#214#6#158#151'6'#17#17#173#3'Q'#176#21#25#8#166
+ +#233#164#206#1#223#159#165#133#213':'#144#245'r%'#235#229'J6q,'#155'8'#174'u'
+ +#215#197#200'Qq2'#181#237#210#230'b'#209#254#222#27#5#230'Q'#196#249#217')'#0
+ +#199#163'Qo'#242#138#192#239#4#208'?'#197'^'#18#188#188#190#201#205#245#149
+ +#170#8#20#19#244'q'#158#145'W'#4#138#9#134#194'a'#214#160'V '#154'?'#15'B'
+ +#248#167#128'='#189#5'hL'#224#186'aw'#1'8'#208#26#228#239'u'#151#143','#255
+ +#29'['#224#27#254'('#218'x|2'#20#20#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('TRxCloseFormValidator','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#9'pHYs'#0#0#14#156#0#0#14#156#1#7#148'S'#221#0#0#1#0'IDATH'#137#213'UA'
+ +#22#132' '#8#197'y'#221'+'#142'F7'#195'Es'#169#22#204#194'l'#12#5#179'f3'#127
+ +#149' '#252#175#16#2#252';'#130'6'#16#130#28#223','#218#221#5'a'#216'cS'#238
+ +#233#236#22#209#156'Rk0'#17#160#20'$'#2#16#194'd'#238'n'#6#141#227'$'#143#136
+ +#158'eS '#162#250#4#136#232#6#225#156#252#28#217#221#199#156#252#175#17'E9'
+ +#185'\/KM'#144#147'X'#144#0#16'wu'#183#8','#146'l'#27'I'#222'$'#240#238'v}'
+ +#175#7'Y)B'#11'*'#215'f'#13'Z'#9#182'm'#3#156#17'82p'#228'f'#226#236'w'#9'Z'
+ +#167#232'u'#141#213']'#221'.'#234#21#189''''#224'R'#155#246#212#151#251#180
+ +' '#151#224#170'z/'#206'$'#200#170#181#250#172'R'#23'S'#199'e'#184#195#206
+ +#186#154#22#169'^3$'#219#208#168#184#131'a'#2#230#226#138#246#191#154#153'aF'
+ +#132#25#191#182#140#238'{'#208#2'-T'#217#22#170'm'#183#8'Z'#227#220#27#241
+ +#245#155#252#163'G'#135#136#6#134#250#3'|'#0#10'!sr'#165'GZ'#12#0#0#0#0'IEND'
+ +#174'B`'#130
+]);
+LazarusResources.Add('TRxIniPropStorage','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#6#0#0#0#224'w='#248#0
+ +#0#0#4'sBIT'#8#8#8#8'|'#8'd'#136#0#0#0#9'pHYs'#0#0#14#196#0#0#14#196#1#149'+'
+ +#14#27#0#0#1'LIDATH'#137#213#148#193'N'#195'0'#12#134'?''}'#27'$'#144#184#240
+ +#10#28'9'#240'>'#177#243'T'#188#0#210'8 61'#222#166#141#185#172'U'#179#181
+ +#163#29#187#236#147#162#184#177#235'?'#137#221#194#173'#'#0#170#234#215'N'
+ +#156's'#166#148'"M'#191#240#250#242'|U'#1'3'#3#160#25'/'#222'?'#190#225'+'
+ +#206#210'u'#137#166#137#180'mK'#211'4'#195#188#251'|'#31'b*'#1'wV'#9#132#16#0
+ +'?'#204#12#243#152'J'#224#251'k'#237'5'#253#29'_'#9#220'=<'#173#20#152#230'g'
+ +#247'1'#216#167'g'#154#193#204#8'! "C'#1#151#208#204'9b'#140#184';]'#215#145
+ +'s'#198#204'h'#219#22#17'!'#198#8'@J'#169#138#19#145#233'd'#170#234#251#237
+ +#198'{B'#8#14'8'#224'"'#226'"r'#214#238#159'K)'#238#238#190#223'nz'#223#244#9
+ +#142'w'#212#239#216'G-6'#23#179#248#138'D'#4#17'!'#132#128#187#163#170#149
+ +#223#204#136'1RJ'#153#191#154's'#2'9'#231#193'VU,%: '#31#10#156'R'#194#204
+ +#170#184')'#22'wQ'#25'%_'#195#170'6'#189#132'E'#2'S'#201#205#172'*'#250'Y'
+ +#142#219'TU'''#219'p<'#142#215'Uux'#127#220#166#147#2#238#238#165#148'j'#244
+ +#162#128#171#234#137#127#204'"'#129#255'0'#251#161#141#127'R'#215'B'#0'D'#196
+ +#23#23#236#130#252#183#205'/'#245#161'[H'#1#236'`'#148#0#0#0#0'IEND'#174'B`'
+ +#130
+]);
diff --git a/components/rx/version/v2.2_laz_1.2/rx_lcl.res b/components/rx/version/v2.2_laz_1.2/rx_lcl.res
new file mode 100644
index 000000000..ef157ef48
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/rx_lcl.res differ
diff --git a/components/rx/version/v2.2_laz_1.2/rx_sort_fbdataset.lpk b/components/rx/version/v2.2_laz_1.2/rx_sort_fbdataset.lpk
new file mode 100644
index 000000000..630f4643e
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rx_sort_fbdataset.lpk
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/rx/version/v2.2_laz_1.2/rx_sort_fbdataset.pas b/components/rx/version/v2.2_laz_1.2/rx_sort_fbdataset.pas
new file mode 100644
index 000000000..f4f3b96d2
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rx_sort_fbdataset.pas
@@ -0,0 +1,21 @@
+{ This file was automatically created by Lazarus. Do not edit!
+ This source is only used to compile and install the package.
+ }
+
+unit rx_sort_fbdataset;
+
+interface
+
+uses
+ RxSortFBDataSet, exsortfb, LazarusPackageIntf;
+
+implementation
+
+procedure Register;
+begin
+ RegisterUnit('RxSortFBDataSet', @RxSortFBDataSet.Register);
+end;
+
+initialization
+ RegisterPackage('rx_sort_fbdataset', @Register);
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rx_sort_sqldb.lpk b/components/rx/version/v2.2_laz_1.2/rx_sort_sqldb.lpk
new file mode 100644
index 000000000..8b1650672
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rx_sort_sqldb.lpk
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/rx/version/v2.2_laz_1.2/rx_sort_sqldb.pas b/components/rx/version/v2.2_laz_1.2/rx_sort_sqldb.pas
new file mode 100644
index 000000000..bb6af8f8c
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rx_sort_sqldb.pas
@@ -0,0 +1,21 @@
+{ This file was automatically created by Lazarus. Do not edit!
+ This source is only used to compile and install the package.
+ }
+
+unit rx_sort_sqldb;
+
+interface
+
+uses
+ RxSortSqlDB, LazarusPackageIntf;
+
+implementation
+
+procedure Register;
+begin
+ RegisterUnit('RxSortSqlDB', @RxSortSqlDB.Register);
+end;
+
+initialization
+ RegisterPackage('rx_sort_sqldb', @Register);
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rx_sort_zeos.lpk b/components/rx/version/v2.2_laz_1.2/rx_sort_zeos.lpk
new file mode 100644
index 000000000..6fe9abb36
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rx_sort_zeos.lpk
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/rx/version/v2.2_laz_1.2/rx_sort_zeos.pas b/components/rx/version/v2.2_laz_1.2/rx_sort_zeos.pas
new file mode 100644
index 000000000..c31e1f1ea
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rx_sort_zeos.pas
@@ -0,0 +1,21 @@
+{ This file was automatically created by Lazarus. Do not edit!
+ This source is only used to compile and install the package.
+ }
+
+unit rx_sort_zeos;
+
+interface
+
+uses
+ RxSortZeos, exsortzeos, LazarusPackageIntf;
+
+implementation
+
+procedure Register;
+begin
+ RegisterUnit('RxSortZeos', @RxSortZeos.Register);
+end;
+
+initialization
+ RegisterPackage('rx_sort_zeos', @Register);
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxaboutdialog.pas b/components/rx/version/v2.2_laz_1.2/rxaboutdialog.pas
new file mode 100644
index 000000000..4333cdb68
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxaboutdialog.pas
@@ -0,0 +1,148 @@
+{ RxAboutDialog
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+unit RxAboutDialog;
+
+{$mode objfpc}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs;
+
+type
+
+ TRxAboutDialogOption = (radHelpButton, radLicenseTab, radShowImageLogo);
+ TRxAboutDialogOptions = set of TRxAboutDialogOption;
+ { TRxAboutDialog }
+
+ TRxAboutDialog = class(TComponent)
+ private
+ FAdditionalInfo: TStrings;
+ FApplicationTitle: string;
+ FCaption: string;
+ FLicenseFileName: string;
+ FOptions: TRxAboutDialogOptions;
+ FPicture: TPicture;
+ procedure SetAdditionalInfo(const AValue: TStrings);
+ procedure SetPicture(const AValue: TPicture);
+ procedure SetRxAboutDialogOptions(const AValue: TRxAboutDialogOptions);
+ protected
+ { Protected declarations }
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure Execute;
+ published
+ property Options:TRxAboutDialogOptions read FOptions write SetRxAboutDialogOptions;
+ property ApplicationTitle:string read FApplicationTitle write FApplicationTitle;
+ property LicenseFileName:string read FLicenseFileName write FLicenseFileName;
+ property Caption:string read FCaption write FCaption;
+ property Picture: TPicture read FPicture write SetPicture;
+ property AdditionalInfo:TStrings read FAdditionalInfo write SetAdditionalInfo;
+ end;
+
+
+implementation
+uses rxAboutFormUnit, ButtonPanel, rxconst;
+
+{ TRxAboutDialog }
+
+procedure TRxAboutDialog.SetRxAboutDialogOptions(
+ const AValue: TRxAboutDialogOptions);
+begin
+ if FOptions=AValue then exit;
+ FOptions:=AValue;
+end;
+
+procedure TRxAboutDialog.SetPicture(const AValue: TPicture);
+begin
+ if FPicture=AValue then exit;
+ FPicture.Assign(AValue);
+end;
+
+procedure TRxAboutDialog.SetAdditionalInfo(const AValue: TStrings);
+begin
+ FAdditionalInfo.Assign(AValue);
+end;
+
+constructor TRxAboutDialog.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FPicture := TPicture.Create;
+ FCaption:=sAbout;
+ FAdditionalInfo:= TStringList.Create;
+end;
+
+destructor TRxAboutDialog.Destroy;
+begin
+ FAdditionalInfo.Free;
+ FPicture.Graphic := nil;
+ FPicture.Free;
+ inherited Destroy;
+end;
+
+procedure TRxAboutDialog.Execute;
+var
+ rxAboutFormForm: TrxAboutFormForm;
+begin
+ rxAboutFormForm:=TrxAboutFormForm.Create(Application);
+ rxAboutFormForm.Caption:=FCaption;
+ if radLicenseTab in FOptions then
+ rxAboutFormForm.LoadLicense(FLicenseFileName)
+ else
+ rxAboutFormForm.TabSheet3.TabVisible:=false;
+
+ if radHelpButton in FOptions then
+ rxAboutFormForm.ButtonPanel1.ShowButtons:=rxAboutFormForm.ButtonPanel1.ShowButtons + [pbHelp]
+ else
+ rxAboutFormForm.ButtonPanel1.ShowButtons:=rxAboutFormForm.ButtonPanel1.ShowButtons - [pbHelp];
+
+ if FApplicationTitle <> '' then
+ rxAboutFormForm.lblAppTitle.Caption:=FApplicationTitle;
+
+ if radShowImageLogo in FOptions then
+ begin
+ rxAboutFormForm.Image1.Picture.Assign(Picture);
+ end
+ else
+ begin
+ end;
+
+ rxAboutFormForm.Memo2.Lines.Assign(FAdditionalInfo);
+
+ try
+ rxAboutFormForm.ShowModal;
+ finally
+ rxAboutFormForm.Free;
+ end;
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxaboutformunit.lfm b/components/rx/version/v2.2_laz_1.2/rxaboutformunit.lfm
new file mode 100644
index 000000000..b7f3a42de
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxaboutformunit.lfm
@@ -0,0 +1,217 @@
+object rxAboutFormForm: TrxAboutFormForm
+ Left = 546
+ Height = 386
+ Top = 349
+ Width = 498
+ Caption = 'rxAboutFormForm'
+ ClientHeight = 386
+ ClientWidth = 498
+ OnCreate = FormCreate
+ Position = poScreenCenter
+ LCLVersion = '0.9.29'
+ object PageControl1: TPageControl
+ Left = 0
+ Height = 340
+ Top = 0
+ Width = 498
+ ActivePage = TabSheet1
+ Align = alClient
+ TabIndex = 0
+ TabOrder = 0
+ object TabSheet1: TTabSheet
+ Caption = 'General'
+ ClientHeight = 314
+ ClientWidth = 490
+ object lblAppTitle: TLabel
+ AnchorSideLeft.Control = Image1
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = TabSheet1
+ AnchorSideRight.Control = TabSheet1
+ AnchorSideRight.Side = asrBottom
+ Left = 140
+ Height = 14
+ Top = 6
+ Width = 344
+ Alignment = taCenter
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Around = 6
+ Caption = 'App title'
+ ParentColor = False
+ WordWrap = True
+ end
+ object Image1: TImage
+ AnchorSideLeft.Control = TabSheet1
+ AnchorSideTop.Control = TabSheet1
+ Left = 6
+ Height = 128
+ Top = 6
+ Width = 128
+ AutoSize = True
+ BorderSpacing.Around = 6
+ end
+ object lblVersion: TLabel
+ AnchorSideLeft.Control = lblAppTitle
+ AnchorSideTop.Control = lblAppTitle
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = lblAppTitle
+ AnchorSideRight.Side = asrBottom
+ Left = 140
+ Height = 14
+ Top = 27
+ Width = 344
+ Alignment = taCenter
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Top = 7
+ Caption = 'Version : '
+ ParentColor = False
+ end
+ object Memo2: TMemo
+ AnchorSideLeft.Control = Image1
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = lblVersion
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = TabSheet1
+ AnchorSideRight.Side = asrBottom
+ AnchorSideBottom.Control = TabSheet1
+ AnchorSideBottom.Side = asrBottom
+ Left = 140
+ Height = 273
+ Top = 41
+ Width = 350
+ Anchors = [akTop, akLeft, akRight, akBottom]
+ BorderStyle = bsNone
+ ParentColor = True
+ ReadOnly = True
+ TabOrder = 0
+ WordWrap = False
+ end
+ end
+ object TabSheet2: TTabSheet
+ Caption = 'Detail'
+ ClientHeight = 314
+ ClientWidth = 490
+ object lblBuildDate: TLabel
+ AnchorSideLeft.Control = TabSheet2
+ AnchorSideRight.Control = TabSheet2
+ AnchorSideRight.Side = asrBottom
+ Left = 0
+ Height = 14
+ Top = 6
+ Width = 490
+ Alignment = taCenter
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Top = 6
+ Caption = 'Build date :'
+ ParentColor = False
+ end
+ object lblLCLVersion: TLabel
+ AnchorSideLeft.Control = TabSheet2
+ AnchorSideTop.Control = lblBuildDate
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = TabSheet2
+ AnchorSideRight.Side = asrBottom
+ Left = 0
+ Height = 14
+ Top = 26
+ Width = 490
+ Alignment = taCenter
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Top = 6
+ Caption = 'LCL Version :'
+ ParentColor = False
+ end
+ object lblFPCVersion: TLabel
+ AnchorSideLeft.Control = TabSheet2
+ AnchorSideTop.Control = lblLCLVersion
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = TabSheet2
+ AnchorSideRight.Side = asrBottom
+ Left = 0
+ Height = 14
+ Top = 46
+ Width = 490
+ Alignment = taCenter
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Top = 6
+ Caption = 'FPC Version :'
+ ParentColor = False
+ end
+ object lblTargCPU: TLabel
+ AnchorSideLeft.Control = TabSheet2
+ AnchorSideTop.Control = lblFPCVersion
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = TabSheet2
+ AnchorSideRight.Side = asrBottom
+ Left = 0
+ Height = 14
+ Top = 66
+ Width = 490
+ Alignment = taCenter
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Top = 6
+ Caption = 'Target CPU :'
+ ParentColor = False
+ end
+ object lblTargetOS: TLabel
+ AnchorSideLeft.Control = TabSheet2
+ AnchorSideTop.Control = lblTargCPU
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = TabSheet2
+ AnchorSideRight.Side = asrBottom
+ Left = 0
+ Height = 14
+ Top = 86
+ Width = 490
+ Alignment = taCenter
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Top = 6
+ Caption = 'Target OS :'
+ ParentColor = False
+ end
+ object lblWidgetName: TLabel
+ AnchorSideLeft.Control = TabSheet2
+ AnchorSideTop.Control = lblTargetOS
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = TabSheet2
+ AnchorSideRight.Side = asrBottom
+ Left = 0
+ Height = 14
+ Top = 106
+ Width = 490
+ Alignment = taCenter
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Top = 6
+ Caption = 'Widget Name'
+ ParentColor = False
+ end
+ end
+ object TabSheet3: TTabSheet
+ Caption = 'License'
+ ClientHeight = 301
+ ClientWidth = 494
+ object Memo1: TMemo
+ Left = 0
+ Height = 301
+ Top = 0
+ Width = 494
+ Align = alClient
+ Lines.Strings = (
+ 'Memo1'
+ )
+ TabOrder = 0
+ end
+ end
+ end
+ object ButtonPanel1: TButtonPanel
+ Left = 6
+ Height = 34
+ Top = 346
+ Width = 486
+ TabOrder = 1
+ ShowButtons = [pbClose, pbHelp]
+ end
+ object RxVersionInfo1: TRxVersionInfo
+ left = 432
+ top = 88
+ end
+end
diff --git a/components/rx/version/v2.2_laz_1.2/rxaboutformunit.pas b/components/rx/version/v2.2_laz_1.2/rxaboutformunit.pas
new file mode 100644
index 000000000..b42118f86
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxaboutformunit.pas
@@ -0,0 +1,107 @@
+{ RxAboutForm
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit rxAboutFormUnit;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
+ ComCtrls, StdCtrls, ExtCtrls, ButtonPanel, RxVersInfo;
+
+type
+
+ { TrxAboutFormForm }
+
+ TrxAboutFormForm = class(TForm)
+ ButtonPanel1: TButtonPanel;
+ Image1: TImage;
+ lblAppTitle: TLabel;
+ lblBuildDate: TLabel;
+ lblFPCVersion: TLabel;
+ lblLCLVersion: TLabel;
+ lblTargCPU: TLabel;
+ lblTargetOS: TLabel;
+ lblVersion: TLabel;
+ lblWidgetName: TLabel;
+ Memo1: TMemo;
+ Memo2: TMemo;
+ PageControl1: TPageControl;
+ RxVersionInfo1: TRxVersionInfo;
+ TabSheet1: TTabSheet;
+ TabSheet2: TTabSheet;
+ TabSheet3: TTabSheet;
+ procedure FormCreate(Sender: TObject);
+ private
+ { private declarations }
+ public
+ procedure LoadLicense(AFileName:string);
+ end;
+
+implementation
+uses rxconst;
+
+{$R *.lfm}
+
+{ TrxAboutFormForm }
+
+procedure TrxAboutFormForm.FormCreate(Sender: TObject);
+begin
+ lblAppTitle.Caption:=RxVersionInfo1.ProductName;
+ if lblAppTitle.Caption = '' then
+ lblAppTitle.Caption:=Application.Title;
+
+ PageControl1.ActivePageIndex:=0;
+ Memo1.Text:='';
+ lblWidgetName.Caption:=RxVersionInfo1.WidgetName;
+ lblVersion.Caption:=sAppVersion + RxVersionInfo1.FileLongVersion;
+ lblLCLVersion.Caption:=sLCLVersion + LCLVersion;
+ lblFPCVersion.Caption:=sFpcVersion + {$I %FPCVERSION%};
+ lblTargCPU.Caption:=sTargetCPU + {$I %FPCTARGETCPU%};
+ lblTargetOS.Caption:=sTargetOS + {$I %FPCTARGETOS%};
+ lblBuildDate.Caption:=sBuildDate + {$I %DATE%};
+ TabSheet1.Caption:=sGeneral;
+ TabSheet2.Caption:=sDetails;
+ TabSheet3.Caption:=sLicense;
+ Memo2.Color:=TabSheet1.Color;
+end;
+
+
+procedure TrxAboutFormForm.LoadLicense(AFileName: string);
+begin
+ if FileExistsUTF8(AFileName) then
+ Memo1.Lines.LoadFromFile(UTF8ToSys(AFileName));
+end;
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/rxappicon.pas b/components/rx/version/v2.2_laz_1.2/rxappicon.pas
new file mode 100644
index 000000000..315791087
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxappicon.pas
@@ -0,0 +1,171 @@
+{ rxappicon unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit rxappicon;
+
+{$mode objfpc}{$H+}
+
+{$IFDEF LCLQT}
+ {$DEFINE LCLGtk2}
+{$ENDIF}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs;
+
+type
+
+ { TRxAppIcon }
+
+ TRxAppIcon = class(TComponent)
+ private
+ FIcon:TIcon;
+ FIconStream:TMemoryStream;
+ function GetAppIcon: TIcon;
+ procedure SetAppIcon(const AValue: TIcon);
+ { Private declarations }
+ protected
+ procedure Loaded; override;
+ procedure DefineProperties(Filer: TFiler); override;
+ procedure ReadData(Stream: TStream); virtual;
+ procedure WriteData(Stream: TStream); virtual;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure ApplyIcon;
+ procedure LoadFromFile(AFileName:string);
+ property Icon:TIcon read GetAppIcon write SetAppIcon;
+ published
+ end;
+
+
+implementation
+{$IFDEF WIN32}
+{$IFNDEF LCLGtk2}
+uses Windows, Win32Int, InterfaceBase, vclutils;
+{$ENDIF}
+{$ENDIF}
+
+
+{ TRxAppIcon }
+
+procedure TRxAppIcon.SetAppIcon(const AValue: TIcon);
+begin
+ FIcon.Assign(AValue);
+ Application.Icon:=FIcon;
+end;
+
+procedure TRxAppIcon.Loaded;
+begin
+ inherited Loaded;
+ if not (csDesigning in ComponentState) then
+ ApplyIcon;
+end;
+
+procedure TRxAppIcon.DefineProperties(Filer: TFiler);
+begin
+ inherited DefineProperties(Filer);
+ Filer.DefineBinaryProperty('Data', @ReadData, @WriteData, FIconStream.Size>0);
+end;
+
+procedure TRxAppIcon.ReadData(Stream: TStream);
+begin
+ FIconStream.LoadFromStream(Stream);
+end;
+
+procedure TRxAppIcon.WriteData(Stream: TStream);
+begin
+ FIconStream.SaveToStream(Stream);
+end;
+
+constructor TRxAppIcon.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FIcon:=TIcon.Create;
+ FIconStream:=TMemoryStream.Create;
+end;
+
+destructor TRxAppIcon.Destroy;
+begin
+ FreeAndNil(FIcon);
+ FreeAndNil(FIconStream);
+ inherited Destroy;
+end;
+
+procedure TRxAppIcon.ApplyIcon;
+{$IFDEF WIN32}
+{$IFNDEF LCLGtk2}
+procedure DoApply;
+var
+ H:HICON;
+ CI: TCursorOrIcon;
+ IconSize, RequestedSize: TPoint;
+begin
+ try
+ FIconStream.Position := 0;
+ FIconStream.ReadBuffer(CI, SizeOf(CI));
+ RequestedSize.x:=0;
+ RequestedSize.Y:=0;
+ ReadIcon(FIconStream, H, CI.Count, SizeOf(CI), RequestedSize, IconSize);
+ SendMessage(TWin32WidgetSet(WidgetSet).AppHandle, WM_SETICON, 1, H);
+ SetClassLong(TWin32WidgetSet(WidgetSet).AppHandle, GCL_HICON, H);
+ Application.Icon:=FIcon;
+ Application.Icon.Handle:=H;
+ finally
+ end;
+end;
+{$ENDIF}
+{$ENDIF}
+begin
+ if FIconStream.Size>0 then
+ begin
+ Icon.LoadFromStream(FIconStream);
+ {$IFDEF WIN32}
+{$IFNDEF LCLGtk2}
+ DoApply;
+{$ENDIF}
+ {$ENDIF}
+ end;
+ FIconStream.Position:=0;
+end;
+
+procedure TRxAppIcon.LoadFromFile(AFileName: string);
+begin
+ FIconStream.LoadFromFile(AFileName);
+end;
+
+function TRxAppIcon.GetAppIcon: TIcon;
+begin
+ Result:=FIcon;
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxapputils.pas b/components/rx/version/v2.2_laz_1.2/rxapputils.pas
new file mode 100644
index 000000000..2f84e5b2f
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxapputils.pas
@@ -0,0 +1,220 @@
+{ rxapputils unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit rxapputils;
+
+{$I rx.inc}
+
+interface
+
+uses
+ Classes, SysUtils, Controls, IniFiles;
+
+const
+ {$IFNDEF LINUX}
+ AllMask = '*.*';
+ {$ELSE}
+ AllMask = '*';
+ {$ENDIF}
+
+var
+ DefCompanyName: string = '';
+ RegUseAppTitle: Boolean = False;
+
+
+function GetDefaultSection(Component: TComponent): string;
+procedure GetDefaultIniData(Control: TControl; var IniFileName,
+ Section: string; UseRegistry: Boolean = false);
+function GetDefaultIniName: string;
+
+type
+ TOnGetDefaultIniName = function: string;
+
+const
+ OnGetDefaultIniName: TOnGetDefaultIniName = nil;
+
+//Save to IniFile or TRegIniFile string value
+procedure IniWriteString(IniFile: TObject; const Section, Ident,
+ Value: string);
+function IniReadString(IniFile: TObject; const Section, Ident,
+ Value: string):string;
+
+//Save to IniFile or TRegIniFile integer value
+procedure IniWriteInteger(IniFile: TObject; const Section, Ident:string;
+ const Value: integer);
+function IniReadInteger(IniFile: TObject; const Section, Ident:string;
+ const Value: integer):integer;
+
+function GetDefaultIniRegKey: string;
+implementation
+uses Registry, Forms, FileUtil;
+
+function GetDefaultSection(Component: TComponent): string;
+var
+ F: TCustomForm;
+ Owner: TComponent;
+begin
+ if Component <> nil then begin
+ if Component is TCustomForm then Result := Component.ClassName
+ else begin
+ Result := Component.Name;
+ if Component is TControl then begin
+ F := GetParentForm(TControl(Component));
+ if F <> nil then Result := F.ClassName + Result
+ else begin
+ if TControl(Component).Parent <> nil then
+ Result := TControl(Component).Parent.Name + Result;
+ end;
+ end
+ else begin
+ Owner := Component.Owner;
+ if Owner is TForm then
+ Result := Format('%s.%s', [Owner.ClassName, Result]);
+ end;
+ end;
+ end
+ else Result := '';
+end;
+
+function GetDefaultIniName: string;
+var
+ S:string;
+begin
+ if Assigned(OnGetDefaultIniName) then
+ Result:= OnGetDefaultIniName()
+ else
+ begin
+ Result := ExtractFileName(ChangeFileExt(Application.ExeName, '.ini'));
+ S:=GetAppConfigDir(false);
+ ForceDirectory(S);
+ Result:=S+Result;
+ end;
+end;
+
+procedure GetDefaultIniData(Control: TControl; var IniFileName,
+ Section: string; UseRegistry: Boolean );
+var
+ I: Integer;
+begin
+ IniFileName := EmptyStr;
+{ with Control do
+ if Owner is TCustomForm then
+ for I := 0 to Owner.ComponentCount - 1 do
+ if (Owner.Components[I] is TFormPropertyStorage) then
+ begin
+ IniFileName := TFormPropertyStorage(Owner.Components[I]).IniFileName;
+ Break;
+ end;}
+ Section := GetDefaultSection(Control);
+ if IniFileName = EmptyStr then
+ if UseRegistry then IniFileName := GetDefaultIniRegKey
+ else
+ IniFileName := GetDefaultIniName;
+end;
+
+procedure IniWriteString(IniFile: TObject; const Section, Ident,
+ Value: string);
+var
+ S: string;
+begin
+ if IniFile is TRegIniFile then
+ TRegIniFile(IniFile).WriteString(Section, Ident, Value)
+ else
+ begin
+ S := Value;
+ if S <> '' then
+ begin
+ if ((S[1] = '"') and (S[Length(S)] = '"')) or
+ ((S[1] = '''') and (S[Length(S)] = '''')) then
+ S := '"' + S + '"';
+ end;
+ if IniFile is TIniFile then
+ TIniFile(IniFile).WriteString(Section, Ident, S);
+ end;
+end;
+
+function IniReadString(IniFile: TObject; const Section, Ident, Value: string
+ ): string;
+var
+ S: string;
+begin
+ if IniFile is TRegIniFile then
+ Result:=TRegIniFile(IniFile).ReadString(Section, Ident, Value)
+ else
+ begin
+ S := Value;
+ if S <> '' then begin
+ if ((S[1] = '"') and (S[Length(S)] = '"')) or
+ ((S[1] = '''') and (S[Length(S)] = '''')) then
+ S := '"' + S + '"';
+ end;
+ if IniFile is TIniFile then
+ Result:=TIniFile(IniFile).ReadString(Section, Ident, S);
+ end;
+end;
+
+procedure IniWriteInteger(IniFile: TObject; const Section, Ident: string;
+ const Value: integer);
+begin
+ if IniFile is TRegIniFile then
+ TRegIniFile(IniFile).WriteInteger(Section, Ident, Value)
+ else
+ begin
+ if IniFile is TIniFile then
+ TIniFile(IniFile).WriteInteger(Section, Ident, Value);
+ end;
+end;
+
+function IniReadInteger(IniFile: TObject; const Section, Ident: string;
+ const Value: integer): integer;
+begin
+ if IniFile is TRegIniFile then
+ Result:=TRegIniFile(IniFile).ReadInteger(Section, Ident, Value)
+ else
+ begin
+ if IniFile is TIniFile then
+ Result:=TIniFile(IniFile).ReadInteger(Section, Ident, Value);
+ end;
+end;
+
+function GetDefaultIniRegKey: string;
+begin
+ if RegUseAppTitle and (Application.Title <> '') then
+ Result := Application.Title
+ else Result := ExtractFileName(ChangeFileExt(Application.ExeName, ''));
+ if DefCompanyName <> '' then
+ Result := DefCompanyName + '\' + Result;
+ Result := 'Software\' + Result;
+end;
+
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/rxceeditlookupfields.pas b/components/rx/version/v2.2_laz_1.2/rxceeditlookupfields.pas
new file mode 100644
index 000000000..bc282e9a3
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxceeditlookupfields.pas
@@ -0,0 +1,185 @@
+{ rxceEditLookupFields unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit rxceEditLookupFields;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, PropEdits;
+
+type
+
+ { TLookupFieldProperty }
+
+ TLookupFieldProperty = class(TStringPropertyEditor)
+ public
+ function GetAttributes: TPropertyAttributes; override;
+ procedure GetValues(Proc: TGetStrProc); override;
+ procedure FillValues(const Values: TStrings); virtual;
+ end;
+
+ { TLookupDisplayProperty }
+
+ TLookupDisplayProperty = class(TLookupFieldProperty)
+ public
+ function GetAttributes: TPropertyAttributes; override;
+ procedure Edit; override;
+ end;
+
+procedure RegisterCEEditLookupFields;
+implementation
+uses
+ //
+ db, duallist, Forms, rxstrutils, TypInfo, rxdconst,
+ //unit for edits
+ rxlookup;
+
+procedure RegisterCEEditLookupFields;
+begin
+ RegisterPropertyEditor(TypeInfo(string), TRxDBLookupCombo, 'LookupField', TLookupFieldProperty);
+ RegisterPropertyEditor(TypeInfo(string), TRxDBLookupCombo, 'LookupDisplay', TLookupDisplayProperty);
+ RegisterPropertyEditor(TypeInfo(string), TRxLookupEdit, 'LookupField', TLookupFieldProperty);
+ RegisterPropertyEditor(TypeInfo(string), TRxLookupEdit, 'LookupDisplay', TLookupDisplayProperty);
+end;
+
+{ TLookupFieldProperty }
+
+function TLookupFieldProperty.GetAttributes: TPropertyAttributes;
+begin
+ Result:= [paValueList, paSortList, paMultiSelect];
+end;
+
+procedure TLookupFieldProperty.GetValues(Proc: TGetStrProc);
+var
+ I: Integer;
+ Values: TStringList;
+begin
+ Values := TStringList.Create;
+ try
+ FillValues(Values);
+ for I := 0 to Values.Count - 1 do Proc(Values[I]);
+ finally
+ Values.Free;
+ end;
+end;
+
+procedure TLookupFieldProperty.FillValues(const Values: TStrings);
+var
+ DataSource: TDataSource;
+begin
+ DataSource := GetObjectProp(GetComponent(0), 'LookupSource') as TDataSource;
+// DataSource := TRxDBLookupCombo(GetComponent(0)).LookupSource;
+ if (DataSource is TDataSource) and Assigned(DataSource.DataSet) then
+ DataSource.DataSet.GetFieldNames(Values);
+end;
+
+{ TLookupDisplayProperty }
+
+function TLookupDisplayProperty.GetAttributes: TPropertyAttributes;
+begin
+ Result:=inherited GetAttributes + [paDialog]
+end;
+
+procedure TLookupDisplayProperty.Edit;
+var
+ DualListDialog1: TDualListDialog;
+ Cmp1:TRxDBLookupCombo;
+ Cmp2:TRxLookupEdit;
+
+procedure DoInitFill;
+var
+ i,j:integer;
+ LookupDisplay:string;
+begin
+ if Assigned(Cmp1) then
+ LookupDisplay:=Cmp1.LookupDisplay
+ else
+ LookupDisplay:=Cmp2.LookupDisplay;
+ if LookupDisplay<>'' then
+ begin
+ StrToStrings(LookupDisplay, DualListDialog1.List2, ';');
+ for i:=DualListDialog1.List1.Count-1 downto 0 do
+ begin
+ j:=DualListDialog1.List2.IndexOf(DualListDialog1.List1[i]);
+ if j>=0 then
+ DualListDialog1.List1.Delete(i);
+ end;
+ end;
+end;
+
+function DoFillDone:string;
+var
+ i:integer;
+begin
+ for i:=0 to DualListDialog1.List2.Count-1 do
+ Result:=Result + DualListDialog1.List2[i]+';';
+ if Result<>'' then
+ Result:=Copy(Result, 1, Length(Result)-1);
+end;
+
+procedure DoSetCaptions;
+begin
+ DualListDialog1.Label1Caption:=sRxAllFields;
+ DualListDialog1.Label2Caption:=sRxFieldsLookupDisplay;
+ DualListDialog1.Title:=sRxFillFieldsLookupDisp;
+end;
+
+begin
+ Cmp1:=nil;
+ Cmp2:=nil;
+
+ if GetComponent(0) is TRxDBLookupCombo then
+ Cmp1:=TRxDBLookupCombo(GetComponent(0))
+ else
+ Cmp2:=TRxLookupEdit(GetComponent(0));
+
+ DualListDialog1:=TDualListDialog.Create(Application);
+ try
+ DoSetCaptions;
+ FillValues(DualListDialog1.List1);
+ DoInitFill;
+ if DualListDialog1.Execute then
+ begin
+ if Assigned(Cmp1) then
+ Cmp1.LookupDisplay:=DoFillDone
+ else
+ Cmp2.LookupDisplay:=DoFillDone;
+ end;
+ finally
+ FreeAndNil(DualListDialog1);
+ end;
+end;
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/rxclock.pas b/components/rx/version/v2.2_laz_1.2/rxclock.pas
new file mode 100644
index 000000000..a86582d74
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxclock.pas
@@ -0,0 +1,993 @@
+{ rxclock unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit rxclock;
+
+interface
+
+{$I rx.inc}
+uses LCLType, LMessages, SysUtils, Classes, Graphics, Controls, Forms, {StdCtrls,}
+ ExtCtrls, Menus, messages;
+
+type
+ TShowClock = (scDigital, scAnalog);
+ TPaintMode = (pmPaintAll, pmHandPaint);
+
+ TRxClockTime = packed record
+ Hour, Minute, Second: Word;
+ end;
+
+ TRxGetTimeEvent = procedure (Sender: TObject; var ATime: TDateTime) of object;
+
+{ TRxClock }
+
+ TRxClock = class(TCustomPanel)
+ private
+ { Private declarations }
+ FTimer: TTimer;
+ FAutoSize: Boolean;
+ FShowMode: TShowClock;
+ FTwelveHour: Boolean;
+ FLeadingZero: Boolean;
+ FShowSeconds: Boolean;
+ FAlarm: TDateTime;
+ FAlarmEnabled: Boolean;
+ FHooked: Boolean;
+ FDotsColor: TColor;
+ FAlarmWait: Boolean;
+ FDisplayTime: TRxClockTime;
+ FClockRect: TRect;
+ FClockRadius: Longint;
+ FClockCenter: TPoint;
+ FOnGetTime: TRxGetTimeEvent;
+ FOnAlarm: TNotifyEvent;
+ procedure TimerExpired(Sender: TObject);
+ procedure GetTime(var T: TRxClockTime);
+ function IsAlarmTime(ATime: TDateTime): Boolean;
+ procedure SetShowMode(Value: TShowClock);
+ function GetAlarmElement(Index: Integer): Byte;
+ procedure SetAlarmElement(Index: Integer; Value: Byte);
+ procedure SetDotsColor(Value: TColor);
+ procedure SetTwelveHour(Value: Boolean);
+ procedure SetLeadingZero(Value: Boolean);
+ procedure SetShowSeconds(Value: Boolean);
+ procedure PaintAnalogClock(PaintMode: TPaintMode);
+ procedure Paint3DFrame(var Rect: TRect);
+ procedure DrawAnalogFace;
+ procedure CircleClock(MaxWidth, MaxHeight: Integer);
+ procedure DrawSecondHand(Pos: Integer);
+ procedure DrawFatHand(Pos: Integer; HourHand: Boolean);
+ procedure PaintTimeStr(var Rect: TRect; FullTime: Boolean);
+ procedure ResizeFont(const Rect: TRect);
+ procedure ResetAlarm;
+ procedure CheckAlarm;
+ function FormatSettingsChange(var Message: TLMessage): Boolean;
+// procedure CMCtl3DChanged(var Message: TLMessage); message CM_CTL3DCHANGED;
+ procedure CMTextChanged(var Message: TLMessage); message CM_TEXTCHANGED;
+ procedure CMFontChanged(var Message: TLMessage); message CM_FONTCHANGED;
+ {$IFDEF windows}
+ procedure WMTimeChange(var Message: TLMessage); message WM_TIMECHANGE;
+ {$ENDIF}
+ protected
+ { Protected declarations }
+ procedure SetAutoSize(const Value: Boolean); virtual;
+ procedure Alarm; dynamic;
+ procedure AlignControls(AControl: TControl; var Rect: TRect); override;
+ procedure CreateWnd; override;
+// procedure DestroyWindowHandle; override;
+ procedure Loaded; override;
+ procedure Paint; override;
+ function GetSystemTime: TDateTime; virtual;
+ public
+ { Public declarations }
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure SetAlarmTime(AlarmTime: TDateTime);
+ procedure UpdateClock;
+ published
+ { Published declarations }
+ property AlarmEnabled: Boolean read FAlarmEnabled write FAlarmEnabled default False;
+ property AlarmHour: Byte Index 1 read GetAlarmElement write SetAlarmElement default 0;
+ property AlarmMinute: Byte Index 2 read GetAlarmElement write SetAlarmElement default 0;
+ property AlarmSecond: Byte Index 3 read GetAlarmElement write SetAlarmElement default 0;
+ property AutoSize: Boolean read FAutoSize write SetAutoSize default False;
+ property BevelInner default bvLowered;
+ property BevelOuter default bvRaised;
+ property DotsColor: TColor read FDotsColor write SetDotsColor default clTeal;
+ property ShowMode: TShowClock read FShowMode write SetShowMode default scDigital;
+ property ShowSeconds: Boolean read FShowSeconds write SetShowSeconds default True;
+ property TwelveHour: Boolean read FTwelveHour write SetTwelveHour default False;
+ property LeadingZero: Boolean read FLeadingZero write SetLeadingZero default True;
+ property Align;
+ property BevelWidth;
+ property BorderWidth;
+ property BorderStyle;
+{$IFDEF RX_D4}
+ property Anchors;
+ property Constraints;
+ property UseDockManager default True;
+ property DockSite;
+ property DragKind;
+ property FullRepaint;
+{$ENDIF}
+ property Color;
+ property Cursor;
+ property DragMode;
+ property DragCursor;
+ property Enabled;
+ property Font;
+ property ParentColor;
+ property ParentFont;
+ property ParentShowHint;
+ property PopupMenu;
+ property ShowHint;
+ property Visible;
+ property OnAlarm: TNotifyEvent read FOnAlarm write FOnAlarm;
+ property OnGetTime: TRxGetTimeEvent read FOnGetTime write FOnGetTime;
+ property OnClick;
+ property OnDblClick;
+ property OnMouseMove;
+ property OnMouseDown;
+ property OnMouseUp;
+ property OnMouseWheel;
+ property OnMouseWheelDown;
+ property OnMouseWheelUp;
+ property OnDragOver;
+ property OnDragDrop;
+ property OnEndDrag;
+ property OnResize;
+ property OnContextPopup;
+ property OnStartDrag;
+// property OnCanResize;
+ property OnConstrainedResize;
+ property OnDockDrop;
+ property OnDockOver;
+ property OnEndDock;
+// property OnGetSiteInfo;
+// property OnStartDock;
+// property OnUnDock;
+ end;
+
+implementation
+
+uses VCLUtils, RTLConsts{, LConsts}, LCLIntf;
+
+const
+ Registered: Boolean = False;
+
+type
+ PPointArray = ^TPointArray;
+ TPointArray = array [0..60 * 2 - 1] of TSmallPoint;
+
+const
+ ClockData: array[0..60 * 4 - 1] of Byte = (
+ $00, $00, $C1, $E0, $44, $03, $EC, $E0, $7F, $06, $6F, $E1,
+ $A8, $09, $48, $E2, $B5, $0C, $74, $E3, $9F, $0F, $F0, $E4,
+ $5E, $12, $B8, $E6, $E9, $14, $C7, $E8, $39, $17, $17, $EB,
+ $48, $19, $A2, $ED, $10, $1B, $60, $F0, $8C, $1C, $4B, $F3,
+ $B8, $1D, $58, $F6, $91, $1E, $81, $F9, $14, $1F, $BC, $FC,
+ $40, $1F, $00, $00, $14, $1F, $44, $03, $91, $1E, $7F, $06,
+ $B8, $1D, $A8, $09, $8C, $1C, $B5, $0C, $10, $1B, $A0, $0F,
+ $48, $19, $5E, $12, $39, $17, $E9, $14, $E9, $14, $39, $17,
+ $5E, $12, $48, $19, $9F, $0F, $10, $1B, $B5, $0C, $8C, $1C,
+ $A8, $09, $B8, $1D, $7F, $06, $91, $1E, $44, $03, $14, $1F,
+ $00, $00, $3F, $1F, $BC, $FC, $14, $1F, $81, $F9, $91, $1E,
+ $58, $F6, $B8, $1D, $4B, $F3, $8C, $1C, $60, $F0, $10, $1B,
+ $A2, $ED, $48, $19, $17, $EB, $39, $17, $C7, $E8, $E9, $14,
+ $B8, $E6, $5E, $12, $F0, $E4, $9F, $0F, $74, $E3, $B5, $0C,
+ $48, $E2, $A8, $09, $6F, $E1, $7F, $06, $EC, $E0, $44, $03,
+ $C1, $E0, $00, $00, $EC, $E0, $BC, $FC, $6F, $E1, $81, $F9,
+ $48, $E2, $58, $F6, $74, $E3, $4B, $F3, $F0, $E4, $60, $F0,
+ $B8, $E6, $A2, $ED, $C7, $E8, $17, $EB, $17, $EB, $C7, $E8,
+ $A2, $ED, $B8, $E6, $61, $F0, $F0, $E4, $4B, $F3, $74, $E3,
+ $58, $F6, $48, $E2, $81, $F9, $6F, $E1, $BC, $FC, $EC, $E0);
+
+const
+ AlarmSecDelay = 60; { seconds for try alarm event after alarm time occured }
+ MaxDotWidth = 25; { maximum Hour-marking dot width }
+ MinDotWidth = 2; { minimum Hour-marking dot width }
+ MinDotHeight = 1; { minimum Hour-marking dot height }
+
+ { distance from the center of the clock to... }
+ HourSide = 7; { ...either side of the Hour hand }
+ MinuteSide = 5; { ...either side of the Minute hand }
+ HourTip = 60; { ...the tip of the Hour hand }
+ MinuteTip = 80; { ...the tip of the Minute hand }
+ SecondTip = 80; { ...the tip of the Second hand }
+ HourTail = 15; { ...the tail of the Hour hand }
+ MinuteTail = 20; { ...the tail of the Minute hand }
+
+ { conversion factors }
+ CirTabScale = 8000; { circle table values scale down value }
+ MmPerDm = 100; { millimeters per decimeter }
+
+ { number of hand positions on... }
+ HandPositions = 60; { ...entire clock }
+ SideShift = (HandPositions div 4); { ...90 degrees of clock }
+ TailShift = (HandPositions div 2); { ...180 degrees of clock }
+
+var
+ CircleTab: PPointArray;
+ HRes: Integer; { width of the display (in pixels) }
+ VRes: Integer; { height of the display (in raster lines) }
+ AspectH: Longint; { number of pixels per decimeter on the display }
+ AspectV: Longint; { number of raster lines per decimeter on the display }
+
+{ Exception routine }
+
+procedure InvalidTime(Hour, Min, Sec: Word);
+var
+ sTime: string[50];
+begin
+ sTime := IntToStr(Hour) + DefaultFormatSettings.TimeSeparator + IntToStr(Min) +
+ DefaultFormatSettings.TimeSeparator + IntToStr(Sec);
+ raise EConvertError.CreateFmt(SInvalidTime, [sTime]);
+end;
+
+function VertEquiv(l: Integer): Integer;
+begin
+ VertEquiv := Longint(l) * AspectV div AspectH;
+end;
+
+function HorzEquiv(l: Integer): Integer;
+begin
+ HorzEquiv := Longint(l) * AspectH div AspectV;
+end;
+
+function LightColor(Color: TColor): TColor;
+var
+ L: Longint;
+ C: array[1..3] of Byte;
+ I: Byte;
+begin
+ L := ColorToRGB(Color);
+ C[1] := GetRValue(L);
+ C[2] := GetGValue(L);
+ C[3] := GetBValue(L);
+ for I := 1 to 3 do
+ begin
+ if C[I] = $FF then
+ begin
+ Result := clBtnHighlight;
+ Exit;
+ end;
+ if C[I] <> 0 then
+ if C[I] = $C0 then C[I] := $FF
+ else C[I] := C[I] + $7F;
+ end;
+ Result := TColor(RGB(C[1], C[2], C[3]));
+end;
+
+procedure ClockInit;
+var
+ Pos: Integer; { hand position Index into the circle table }
+ vSize: Integer; { height of the display in millimeters }
+ hSize: Integer; { width of the display in millimeters }
+ DC: HDC;
+begin
+ DC := GetDC(0);
+ try
+ VRes := GetDeviceCaps(DC, VERTRES);
+ HRes := GetDeviceCaps(DC, HORZRES);
+ vSize := GetDeviceCaps(DC, VERTSIZE);
+ hSize := GetDeviceCaps(DC, HORZSIZE);
+ finally
+ ReleaseDC(0, DC);
+ end;
+ AspectV := (Longint(VRes) * MmPerDm) div Longint(vSize);
+ AspectH := (Longint(HRes) * MmPerDm) div Longint(hSize);
+ CircleTab := PPointArray(@ClockData);
+ for Pos := 0 to HandPositions - 1 do
+ CircleTab^[Pos].Y := VertEquiv(CircleTab^[Pos].Y);
+end;
+
+function HourHandPos(T: TRxClockTime): Integer;
+begin
+ Result := (T.Hour * 5) + (T.Minute div 12);
+end;
+
+{ Digital clock font routine }
+
+procedure SetNewFontSize(Canvas: TCanvas; const Text: string;
+ MaxH, MaxW: Integer);
+const
+ fHeight = 1000;
+var
+ Font: TFont;
+ NewH: Integer;
+begin
+ Font := Canvas.Font;
+ { empiric calculate character height by cell height }
+ MaxH := MulDiv(MaxH, 4, 5);
+{ with Font do
+ begin}
+ Font.Height := -fHeight;
+ NewH := MulDiv(fHeight, MaxW, Canvas.TextWidth(Text));
+ if NewH > MaxH then NewH := MaxH;
+ Font.Height := -NewH;
+// end;
+end;
+
+{ TRxClock }
+
+constructor TRxClock.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ if not Registered then begin
+ ClockInit;
+ Registered := True;
+ end;
+ Caption := TimeToStr(Time);
+ ControlStyle := ControlStyle - [csSetCaption] - [csReplicatable];
+ BevelInner := bvLowered;
+ BevelOuter := bvRaised;
+ FTimer := TTimer.Create(Self);
+ FTimer.Interval := 450; { every second }
+ FTimer.OnTimer := @TimerExpired;
+ FDotsColor := clTeal;
+ FShowSeconds := True;
+ FLeadingZero := True;
+ GetTime(FDisplayTime);
+ if FDisplayTime.Hour >= 12 then Dec(FDisplayTime.Hour, 12);
+ FAlarmWait := True;
+ FAlarm := EncodeTime(0, 0, 0, 0);
+end;
+
+destructor TRxClock.Destroy;
+begin
+ if FHooked then
+ begin
+// Application.UnhookMainWindow(FormatSettingsChange);
+ FHooked := False;
+ end;
+ inherited Destroy;
+end;
+
+procedure TRxClock.Loaded;
+begin
+ inherited Loaded;
+ ResetAlarm;
+end;
+
+procedure TRxClock.CreateWnd;
+begin
+ inherited CreateWnd;
+ if not (csDesigning in ComponentState) and not (IsLibrary or FHooked) then
+ begin
+// Application.HookMainWindow(FormatSettingsChange);
+ FHooked := True;
+ end;
+end;
+
+{procedure TRxClock.DestroyWindowHandle;
+begin
+ if FHooked then begin
+ Application.UnhookMainWindow(FormatSettingsChange);
+ FHooked := False;
+ end;
+ inherited DestroyWindowHandle;
+end;
+}
+{
+procedure TRxClock.CMCtl3DChanged(var Message: TMessage);
+begin
+ inherited;
+ if ShowMode = scAnalog then Invalidate;
+end;
+}
+procedure TRxClock.CMTextChanged(var Message: TMessage);
+begin
+ { Skip this message, no repaint }
+end;
+
+procedure TRxClock.CMFontChanged(var Message: TMessage);
+begin
+ inherited;
+ Invalidate;
+ if AutoSize then Realign;
+end;
+
+{$IFDEF windows}
+procedure TRxClock.WMTimeChange(var Message: TMessage);
+begin
+ inherited;
+ Invalidate;
+ CheckAlarm;
+end;
+{$ENDIF}
+
+function TRxClock.FormatSettingsChange(var Message: TMessage): Boolean;
+begin
+{$IFDEF windows}
+ Result := False;
+ case Message.Msg of
+ WM_WININICHANGE:
+ begin
+ Invalidate;
+ if AutoSize then Realign;
+ end;
+ end;
+{$ENDIF}
+end;
+
+function TRxClock.GetSystemTime: TDateTime;
+begin
+ Result := SysUtils.Time;
+ if Assigned(FOnGetTime) then FOnGetTime(Self, Result);
+end;
+
+procedure TRxClock.GetTime(var T: TRxClockTime);
+var
+ MSec: Word;
+begin
+ with T do
+ DecodeTime(GetSystemTime, Hour, Minute, Second, MSec);
+end;
+
+procedure TRxClock.UpdateClock;
+begin
+ Invalidate;
+ if AutoSize then Realign;
+ Update;
+end;
+
+procedure TRxClock.ResetAlarm;
+begin
+ FAlarmWait := (FAlarm > GetSystemTime) or (FAlarm = 0);
+end;
+
+function TRxClock.IsAlarmTime(ATime: TDateTime): Boolean;
+var
+ Hour, Min, Sec, MSec: Word;
+ AHour, AMin, ASec: Word;
+begin
+ DecodeTime(FAlarm, Hour, Min, Sec, MSec);
+ DecodeTime(ATime, AHour, AMin, ASec, MSec);
+ Result := {FAlarmWait and} (Hour = AHour) and (Min = AMin) and
+ (ASec >= Sec) and (ASec <= Sec + AlarmSecDelay);
+end;
+
+procedure TRxClock.ResizeFont(const Rect: TRect);
+var
+ H, W: Integer;
+ DC: HDC;
+ TimeStr: string;
+begin
+ H := Rect.Bottom - Rect.Top - 4;
+ W := (Rect.Right - Rect.Left - 30);
+ if (H <= 0) or (W <= 0) then Exit;
+ DC := GetDC(0);
+ try
+ Canvas.Handle := DC;
+ Canvas.Font := Font;
+ TimeStr := '88888';
+ if FShowSeconds then TimeStr := TimeStr + '888';
+ if FTwelveHour then begin
+ if Canvas.TextWidth(DefaultFormatSettings.TimeAMString) > Canvas.TextWidth(DefaultFormatSettings.TimePMString) then
+ TimeStr := TimeStr + ' ' + DefaultFormatSettings.TimeAMString
+ else TimeStr := TimeStr + ' ' + DefaultFormatSettings.TimePMString;
+ end;
+ SetNewFontSize(Canvas, TimeStr, H, W);
+ Font := Canvas.Font;
+ finally
+ Canvas.Handle := 0;
+ ReleaseDC(0, DC);
+ end;
+end;
+
+procedure TRxClock.AlignControls(AControl: TControl; var Rect: TRect);
+{$IFDEF RX_D4}
+var
+ InflateWidth: Integer;
+{$ENDIF}
+begin
+ inherited AlignControls(AControl, Rect);
+ FClockRect := Rect;
+{$IFDEF RX_D4}
+ InflateWidth := BorderWidth + 1;
+ if BevelOuter <> bvNone then Inc(InflateWidth, BevelWidth);
+ if BevelInner <> bvNone then Inc(InflateWidth, BevelWidth);
+ InflateRect(FClockRect, -InflateWidth, -InflateWidth);
+{$ENDIF}
+ with FClockRect do CircleClock(Right - Left, Bottom - Top);
+ if AutoSize then ResizeFont(Rect);
+end;
+
+procedure TRxClock.Alarm;
+begin
+ if Assigned(FOnAlarm) then FOnAlarm(Self);
+end;
+
+procedure TRxClock.SetAutoSize(const Value: Boolean);
+begin
+ if (Value <> FAutoSize) then
+ begin
+ FAutoSize := Value;
+ if FAutoSize then
+ begin
+ Invalidate;
+ Realign;
+ end;
+ end;
+end;
+
+procedure TRxClock.SetTwelveHour(Value: Boolean);
+begin
+ if FTwelveHour <> Value then begin
+ FTwelveHour := Value;
+ Invalidate;
+ if AutoSize then Realign;
+ end;
+end;
+
+procedure TRxClock.SetLeadingZero(Value: Boolean);
+begin
+ if FLeadingZero <> Value then begin
+ FLeadingZero := Value;
+ Invalidate;
+ end;
+end;
+
+procedure TRxClock.SetShowSeconds(Value: Boolean);
+begin
+ if FShowSeconds <> Value then begin
+ {if FShowSeconds and (ShowMode = scAnalog) then
+ DrawSecondHand(FDisplayTime.Second);}
+ FShowSeconds := Value;
+ Invalidate;
+ if AutoSize then Realign;
+ end;
+end;
+
+procedure TRxClock.SetDotsColor(Value: TColor);
+begin
+ if Value <> FDotsColor then begin
+ FDotsColor := Value;
+ Invalidate;
+ end;
+end;
+
+procedure TRxClock.SetShowMode(Value: TShowClock);
+begin
+ if FShowMode <> Value then begin
+ FShowMode := Value;
+ Invalidate;
+ end;
+end;
+
+function TRxClock.GetAlarmElement(Index: Integer): Byte;
+var
+ Hour, Min, Sec, MSec: Word;
+begin
+ DecodeTime(FAlarm, Hour, Min, Sec, MSec);
+ case Index of
+ 1: Result := Hour;
+ 2: Result := Min;
+ 3: Result := Sec;
+ else Result := 0;
+ end;
+end;
+
+procedure TRxClock.SetAlarmElement(Index: Integer; Value: Byte);
+var
+ Hour, Min, Sec, MSec: Word;
+begin
+ DecodeTime(FAlarm, Hour, Min, Sec, MSec);
+ case Index of
+ 1: Hour := Value;
+ 2: Min := Value;
+ 3: Sec := Value;
+ else Exit;
+ end;
+ if (Hour < 24) and (Min < 60) and (Sec < 60) then begin
+ FAlarm := EncodeTime(Hour, Min, Sec, 0);
+ ResetAlarm;
+ end
+ else InvalidTime(Hour, Min, Sec);
+end;
+
+procedure TRxClock.SetAlarmTime(AlarmTime: TDateTime);
+var
+ Hour, Min, Sec, MSec: Word;
+begin
+ DecodeTime(FAlarm, Hour, Min, Sec, MSec);
+ if (Hour < 24) and (Min < 60) and (Sec < 60) then begin
+ FAlarm := Frac(AlarmTime);
+ ResetAlarm;
+ end
+ else InvalidTime(Hour, Min, Sec);
+end;
+
+procedure TRxClock.TimerExpired(Sender: TObject);
+var
+ DC: HDC;
+ Rect: TRect;
+ InflateWidth: Integer;
+begin
+ DC := GetDC(Handle);
+ try
+ Canvas.Handle := DC;
+ Canvas.Brush.Color := Color;
+ Canvas.Font := Font;
+ Canvas.Pen.Color := Font.Color;
+ if FShowMode = scAnalog then PaintAnalogClock(pmHandPaint)
+ else begin
+ Rect := GetClientRect;
+ InflateWidth := BorderWidth;
+ if BevelOuter <> bvNone then Inc(InflateWidth, BevelWidth);
+ if BevelInner <> bvNone then Inc(InflateWidth, BevelWidth);
+ InflateRect(Rect, -InflateWidth, -InflateWidth);
+ PaintTimeStr(Rect, False);
+ end;
+ finally
+ Canvas.Handle := 0;
+ ReleaseDC(Handle, DC);
+ end;
+ CheckAlarm;
+end;
+
+procedure TRxClock.CheckAlarm;
+begin
+ if FAlarmEnabled and IsAlarmTime(GetSystemTime) then begin
+ if FAlarmWait then begin
+ FAlarmWait := False;
+ Alarm;
+ end;
+ end
+ else ResetAlarm;
+end;
+
+procedure TRxClock.DrawAnalogFace;
+var
+ Pos, DotHeight, DotWidth: Integer;
+ DotCenter: TPoint;
+ R: TRect;
+ SaveBrush, SavePen: TColor;
+ MinDots: Boolean;
+begin
+ DotWidth := (MaxDotWidth * Longint(FClockRect.Right - FClockRect.Left)) div HRes;
+ DotHeight := VertEquiv(DotWidth);
+ if DotHeight < MinDotHeight then DotHeight := MinDotHeight;
+ if DotWidth < MinDotWidth then DotWidth := MinDotWidth;
+ DotCenter.X := DotWidth div 2;
+ DotCenter.Y := DotHeight div 2;
+ InflateRect(FClockRect, -DotCenter.Y, -DotCenter.X);
+ FClockRadius := ((FClockRect.Right - FClockRect.Left) div 2);
+ FClockCenter.X := FClockRect.Left + FClockRadius;
+ FClockCenter.Y := FClockRect.Top + ((FClockRect.Bottom - FClockRect.Top) div 2);
+ InflateRect(FClockRect, DotCenter.Y, DotCenter.X);
+ SaveBrush := Canvas.Brush.Color;
+ SavePen := Canvas.Pen.Color;
+ try
+ Canvas.Brush.Color := Canvas.Pen.Color;
+ MinDots := ((DotWidth > MinDotWidth) and (DotHeight > MinDotHeight));
+ for Pos := 0 to HandPositions - 1 do
+ begin
+ R.Top := (CircleTab^[Pos].Y * FClockRadius) div CirTabScale + FClockCenter.Y;
+ R.Left := (CircleTab^[Pos].X * FClockRadius) div CirTabScale + FClockCenter.X;
+ if (Pos mod 5) <> 0 then
+ begin
+ if MinDots then
+ begin
+// if Ctl3D then
+ begin
+ Canvas.Brush.Color := clBtnShadow;
+ OffsetRect(R, -1, -1);
+ R.Right := R.Left + 2;
+ R.Bottom := R.Top + 2;
+ Canvas.FillRect(R);
+ Canvas.Brush.Color := clBtnHighlight;
+ OffsetRect(R, 1, 1);
+ Canvas.FillRect(R);
+ Canvas.Brush.Color := Self.Color;
+ end;
+ R.Right := R.Left + 1;
+ R.Bottom := R.Top + 1;
+ Canvas.FillRect(R);
+ end;
+ end
+ else begin
+ R.Right := R.Left + DotWidth;
+ R.Bottom := R.Top + DotHeight;
+ OffsetRect(R, -DotCenter.X, -DotCenter.Y);
+ if {Ctl3D and} MinDots then
+ with Canvas do
+ begin
+ Brush.Color := FDotsColor;
+ Brush.Style := bsSolid;
+ FillRect(R);
+ RxFrame3D(Canvas, R, LightColor(FDotsColor), clWindowFrame, 1);
+ end;
+ Canvas.Brush.Color := Canvas.Pen.Color;
+ if not ({Ctl3D and} MinDots) then Canvas.FillRect(R);
+ end;
+ end;
+ finally
+ Canvas.Brush.Color := SaveBrush;
+ Canvas.Pen.Color := SavePen;
+ end;
+end;
+
+procedure TRxClock.CircleClock(MaxWidth, MaxHeight: Integer);
+var
+ ClockHeight: Integer;
+ ClockWidth: Integer;
+begin
+ if MaxWidth > HorzEquiv(MaxHeight) then begin
+ ClockWidth := HorzEquiv(MaxHeight);
+ FClockRect.Left := FClockRect.Left + ((MaxWidth - ClockWidth) div 2);
+ FClockRect.Right := FClockRect.Left + ClockWidth;
+ end
+ else begin
+ ClockHeight := VertEquiv(MaxWidth);
+ FClockRect.Top := FClockRect.Top + ((MaxHeight - ClockHeight) div 2);
+ FClockRect.Bottom := FClockRect.Top + ClockHeight;
+ end;
+end;
+
+procedure TRxClock.DrawSecondHand(Pos: Integer);
+var
+ Radius: Longint;
+ SaveMode: TPenMode;
+begin
+ Radius := (FClockRadius * SecondTip) div 100;
+ SaveMode := Canvas.Pen.Mode;
+ Canvas.Pen.Mode := pmNot;
+ try
+ Canvas.MoveTo(FClockCenter.X, FClockCenter.Y);
+ Canvas.LineTo(FClockCenter.X + ((CircleTab^[Pos].X * Radius) div
+ CirTabScale), FClockCenter.Y + ((CircleTab^[Pos].Y * Radius) div
+ CirTabScale));
+ finally
+ Canvas.Pen.Mode := SaveMode;
+ end;
+end;
+
+procedure TRxClock.DrawFatHand(Pos: Integer; HourHand: Boolean);
+var
+ ptSide, ptTail, ptTip: TPoint;
+ Index, Hand: Integer;
+ Scale: Longint;
+ SaveMode: TPenMode;
+begin
+ if HourHand then Hand := HourSide else Hand := MinuteSide;
+ Scale := (FClockRadius * Hand) div 100;
+ Index := (Pos + SideShift) mod HandPositions;
+ ptSide.Y := (CircleTab^[Index].Y * Scale) div CirTabScale;
+ ptSide.X := (CircleTab^[Index].X * Scale) div CirTabScale;
+ if HourHand then Hand := HourTip else Hand := MinuteTip;
+ Scale := (FClockRadius * Hand) div 100;
+ ptTip.Y := (CircleTab^[Pos].Y * Scale) div CirTabScale;
+ ptTip.X := (CircleTab^[Pos].X * Scale) div CirTabScale;
+ if HourHand then Hand := HourTail else Hand := MinuteTail;
+ Scale := (FClockRadius * Hand) div 100;
+ Index := (Pos + TailShift) mod HandPositions;
+ ptTail.Y := (CircleTab^[Index].Y * Scale) div CirTabScale;
+ ptTail.X := (CircleTab^[Index].X * Scale) div CirTabScale;
+ with Canvas do begin
+ SaveMode := Pen.Mode;
+ Pen.Mode := pmCopy;
+ try
+ MoveTo(FClockCenter.X + ptSide.X, FClockCenter.Y + ptSide.Y);
+ LineTo(FClockCenter.X + ptTip.X, FClockCenter.Y + ptTip.Y);
+ MoveTo(FClockCenter.X - ptSide.X, FClockCenter.Y - ptSide.Y);
+ LineTo(FClockCenter.X + ptTip.X, FClockCenter.Y + ptTip.Y);
+ MoveTo(FClockCenter.X + ptSide.X, FClockCenter.Y + ptSide.Y);
+ LineTo(FClockCenter.X + ptTail.X, FClockCenter.Y + ptTail.Y);
+ MoveTo(FClockCenter.X - ptSide.X, FClockCenter.Y - ptSide.Y);
+ LineTo(FClockCenter.X + ptTail.X, FClockCenter.Y + ptTail.Y);
+ finally
+ Pen.Mode := SaveMode;
+ end;
+ end;
+end;
+
+procedure TRxClock.PaintAnalogClock(PaintMode: TPaintMode);
+var
+ NewTime: TRxClockTime;
+begin
+ Canvas.Pen.Color := Font.Color;
+ Canvas.Brush.Color := Color;
+ SetBkMode(Canvas.Handle, TRANSPARENT);
+ if PaintMode = pmPaintAll then
+ begin
+ with Canvas do
+ begin
+ FillRect(FClockRect);
+ Pen.Color := Self.Font.Color;
+ DrawAnalogFace;
+ DrawFatHand(HourHandPos(FDisplayTime), True);
+ DrawFatHand(FDisplayTime.Minute, False);
+ Pen.Color := Brush.Color;
+ if ShowSeconds then
+ DrawSecondHand(FDisplayTime.Second);
+ end;
+ end
+ else
+ begin
+ with Canvas do
+ begin
+ Pen.Color := Brush.Color;
+ GetTime(NewTime);
+ if NewTime.Hour >= 12 then
+ Dec(NewTime.Hour, 12);
+ if (NewTime.Second <> FDisplayTime.Second) then
+ if ShowSeconds then
+ DrawSecondHand(FDisplayTime.Second);
+ if ((NewTime.Minute <> FDisplayTime.Minute) or
+ (NewTime.Hour <> FDisplayTime.Hour)) then
+ begin
+ DrawFatHand(FDisplayTime.Minute, False);
+ DrawFatHand(HourHandPos(FDisplayTime), True);
+ Pen.Color := Self.Font.Color;
+ DrawFatHand(NewTime.Minute, False);
+ DrawFatHand(HourHandPos(NewTime), True);
+ end;
+ Pen.Color := Brush.Color;
+ if (NewTime.Second <> FDisplayTime.Second) then
+ begin
+ if ShowSeconds then
+ DrawSecondHand(NewTime.Second);
+ FDisplayTime := NewTime;
+ end;
+ end;
+ end;
+end;
+
+procedure TRxClock.PaintTimeStr(var Rect: TRect; FullTime: Boolean);
+var
+ FontHeight, FontWidth, FullWidth, I, L, H: Integer;
+ TimeStr, SAmPm: string;
+ NewTime: TRxClockTime;
+
+ function IsPartSym(Idx, Num: Byte): Boolean;
+ var
+ TwoSymHour: Boolean;
+ begin
+ TwoSymHour := (H >= 10) or FLeadingZero;
+ case Idx of
+ 1: begin {hours}
+ Result := True;
+ end;
+ 2: begin {minutes}
+ if TwoSymHour then Result := (Num in [4, 5])
+ else Result := (Num in [3, 4]);
+ end;
+ 3: begin {seconds}
+ if TwoSymHour then Result := FShowSeconds and (Num in [7, 8])
+ else Result := FShowSeconds and (Num in [6, 7]);
+ end;
+ else Result := False;
+ end;
+ end;
+
+ procedure DrawSym(Sym: Char; Num: Byte);
+ begin
+ if FullTime or
+ ((NewTime.Second <> FDisplayTime.Second) and IsPartSym(3, Num)) or
+ ((NewTime.Minute <> FDisplayTime.Minute) and IsPartSym(2, Num)) or
+ (NewTime.Hour <> FDisplayTime.Hour) then
+ begin
+ Canvas.FillRect(Rect);
+ DrawText(Canvas.Handle, @Sym, 1, Rect, DT_EXPANDTABS or
+ DT_VCENTER or DT_CENTER or DT_NOCLIP or DT_SINGLELINE);
+ end;
+ end;
+
+begin
+ GetTime(NewTime);
+ H := NewTime.Hour;
+ if NewTime.Hour >= 12 then Dec(NewTime.Hour, 12);
+ if FTwelveHour then begin
+ if H > 12 then Dec(H, 12) else if H = 0 then H := 12;
+ end;
+ if (not FullTime) and (NewTime.Hour <> FDisplayTime.Hour) then begin
+ Repaint;
+ Exit;
+ end;
+ if FLeadingZero then TimeStr := 'hh:mm' else TimeStr := 'h:mm';
+ if FShowSeconds then TimeStr := TimeStr + ':ss';
+ if FTwelveHour then TimeStr := TimeStr + ' ampm';
+ with NewTime do
+ TimeStr := FormatDateTime(TimeStr, GetSystemTime);
+ if (H >= 10) or FLeadingZero then L := 5 else L := 4;
+ if FShowSeconds then Inc(L, 3);
+ SAmPm := Copy(TimeStr, L + 1, MaxInt);
+ with Canvas do begin
+ Font := Self.Font;
+ FontHeight := TextHeight('8');
+ FontWidth := TextWidth('8');
+ FullWidth := TextWidth(SAmPm) + (L * FontWidth);
+ with Rect do begin
+ Left := ((Right + Left) - FullWidth) div 2 {shr 1};
+ Right := Left + FullWidth;
+ Top := ((Bottom + Top) - FontHeight) div 2 {shr 1};
+ Bottom := Top + FontHeight;
+ end;
+ Brush.Color := Color;
+ for I := 1 to L do begin
+ Rect.Right := Rect.Left + FontWidth;
+ DrawSym(TimeStr[I], I);
+ Inc(Rect.Left, FontWidth);
+ end;
+ if FullTime or (NewTime.Hour <> FDisplayTime.Hour) then begin
+ Rect.Right := Rect.Left + TextWidth(SAmPm);
+ DrawText(Handle, @SAmPm[1], Length(SAmPm), Rect,
+ DT_EXPANDTABS or DT_VCENTER or DT_NOCLIP or DT_SINGLELINE);
+ end;
+ end;
+ FDisplayTime := NewTime;
+end;
+
+procedure TRxClock.Paint3DFrame(var Rect: TRect);
+var
+ TopColor, BottomColor: TColor;
+
+ procedure AdjustColors(Bevel: TPanelBevel);
+ begin
+ TopColor := clBtnHighlight;
+ if Bevel = bvLowered then TopColor := clBtnShadow;
+ BottomColor := clBtnShadow;
+ if Bevel = bvLowered then BottomColor := clBtnHighlight;
+ end;
+
+begin
+ Rect := GetClientRect;
+ with Canvas do
+ begin
+ Brush.Color := Color;
+ FillRect(Rect);
+ end;
+ if BevelOuter <> bvNone then
+ begin
+ AdjustColors(BevelOuter);
+ RxFrame3D(Canvas, Rect, TopColor, BottomColor, BevelWidth);
+ end;
+ InflateRect(Rect, -BorderWidth, -BorderWidth);
+ if BevelInner <> bvNone then
+ begin
+ AdjustColors(BevelInner);
+ RxFrame3D(Canvas, Rect, TopColor, BottomColor, BevelWidth);
+ end;
+end;
+
+procedure TRxClock.Paint;
+var
+ R: TRect;
+begin
+ Paint3DFrame(R);
+ case FShowMode of
+ scDigital: PaintTimeStr(R, True);
+ scAnalog: PaintAnalogClock(pmPaintAll);
+ end;
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxcloseformvalidator.pas b/components/rx/version/v2.2_laz_1.2/rxcloseformvalidator.pas
new file mode 100644
index 000000000..e031419dc
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxcloseformvalidator.pas
@@ -0,0 +1,411 @@
+{ RxCloseFormValidator unit
+
+ Copyright (C) 2005-2013 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit RxCloseFormValidator;
+
+{$I rx.inc}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, DB;
+
+type
+ TRxCloseFormValidator = class;
+
+ TValidateEvent = procedure(AOwner:TRxCloseFormValidator; AControl:TWinControl; var Validate:boolean) of object;
+
+ { TValidateItem }
+
+ TValidateItem = class(TCollectionItem)
+ private
+ FControl: TWinControl;
+ FEnabled: boolean;
+ FFieldCaption: string;
+ FOnValidate: TValidateEvent;
+ procedure SetControl(AValue: TWinControl);
+ procedure SetEnabled(AValue: boolean);
+ procedure SetFieldCaption(AValue: string);
+ function DBComponentField:TField;
+ protected
+ function GetDisplayName: string; override;
+ public
+ constructor Create(ACollection: TCollection); override;
+ destructor Destroy; override;
+ function CheckClose(AForm:TCustomForm):boolean;
+ function ErrorMessage:string;
+ procedure SetFocus;
+ published
+ property Control:TWinControl read FControl write SetControl;
+ property Enabled:boolean read FEnabled write SetEnabled default true;
+ property FieldCaption:string read FFieldCaption write SetFieldCaption;
+ property OnValidate:TValidateEvent read FOnValidate write FOnValidate;
+ end;
+
+ { TValidateItems }
+
+ TValidateItems = class(TOwnedCollection)
+ private
+ function GetItems(Index: Integer): TValidateItem;
+ procedure SetItems(Index: Integer; AValue: TValidateItem);
+ public
+ property Items[Index: Integer]: TValidateItem read GetItems write SetItems; default;
+ end;
+
+ { TRxCloseFormValidator }
+
+ TRxCloseFormValidator = class(TComponent)
+ private
+ FErrorMsgCaption: string;
+ FOnCloseQuery : TCloseQueryEvent;
+ FItems:TValidateItems;
+ procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
+ function GetItems: TValidateItems;
+ procedure SetCloseQueryHandler;
+ procedure SetItems(AValue: TValidateItems);
+ protected
+ procedure Notification(AComponent: TComponent;
+ Operation: TOperation); override;
+ procedure Loaded; override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ function CheckCloseForm:boolean;
+ function ByControl(AControl: TWinControl):TValidateItem;
+ published
+ property ErrorMsgCaption:string read FErrorMsgCaption write FErrorMsgCaption;
+ property Items:TValidateItems read GetItems write SetItems;
+ end;
+
+implementation
+uses LCLType, StdCtrls, DbCtrls, typinfo, ComCtrls, ExtCtrls, rxconst;
+
+{ TValidateItems }
+
+function TValidateItems.GetItems(Index: Integer): TValidateItem;
+begin
+ result := TValidateItem( inherited Items[Index] );
+end;
+
+procedure TValidateItems.SetItems(Index: Integer; AValue: TValidateItem);
+begin
+ Items[Index].Assign( AValue );
+end;
+
+{constructor TValidateItems.Create;
+begin
+ inherited Create(TValidateItem);
+end;}
+
+{ TValidateItem }
+
+procedure TValidateItem.SetControl(AValue: TWinControl);
+var
+ i:integer;
+ OwnForm, P:TComponent;
+ F:TField;
+begin
+ if FControl=AValue then Exit;
+ FControl:=AValue;
+
+ if Assigned(FControl) and (FFieldCaption = '') then
+ begin
+ //Установим название поля по текст компоненты
+ if FControl is TCustomRadioGroup then
+ FFieldCaption:=TCustomRadioGroup(FControl).Caption
+ else
+ if FControl is TCustomCheckBox then
+ FFieldCaption:=TCustomCheckBox(FControl).Caption
+ else
+ if Assigned(FControl.Owner) then
+ begin
+ OwnForm:=FControl.Owner;
+ //Попробуем найти название поле - по тексту метки, которая связана с данным полем
+ for i:=0 to OwnForm.ComponentCount-1 do
+ begin
+ P:=OwnForm.Components[i];
+ if P is TLabel then
+ if TLabel(P).FocusControl = FControl then
+ begin
+ FFieldCaption:=TLabel(P).Caption;
+ break;
+ end;
+ end;
+ end;
+
+ if FFieldCaption = '' then
+ begin
+ F:=DBComponentField;
+ if Assigned(F) then
+ FFieldCaption:=F.DisplayLabel;
+ end;
+ end
+end;
+
+procedure TValidateItem.SetEnabled(AValue: boolean);
+begin
+ if FEnabled=AValue then Exit;
+ FEnabled:=AValue;
+end;
+
+procedure TValidateItem.SetFieldCaption(AValue: string);
+begin
+ if FFieldCaption=AValue then Exit;
+ FFieldCaption:=AValue;
+end;
+
+function TValidateItem.DBComponentField: TField;
+var
+ P:TObject;
+ PI1, PI2:PPropInfo;
+ FiName:string;
+ DS:TDataSet;
+begin
+ Result:=nil;
+ if not Assigned(FControl) then exit;
+ //Сначала проверим - вдруги это завязки на работу с БД
+ PI1:=GetPropInfo(Control, 'DataSource');
+ PI2:=GetPropInfo(Control, 'DataField');
+ if Assigned(PI1) and Assigned(PI2) then
+ begin
+ //Точно - БД
+ P:=GetObjectProp(Control, 'DataSource');
+ FiName:=GetPropValue(Control, 'DataField');
+ if Assigned(P) and (FiName<>'') then
+ begin
+ DS:=(P as TDataSource).DataSet;
+ if Assigned(DS) then
+ Result:=DS.FieldByName(FiName);
+ end;
+ end
+end;
+
+function TValidateItem.GetDisplayName: string;
+begin
+ if Assigned(FControl) then
+ begin
+ if FEnabled then
+ Result:=FControl.Name + ' - validate'
+ else
+ Result:=FControl.Name + ' - disabled'
+ end
+ else
+ Result:=inherited GetDisplayName;
+end;
+
+constructor TValidateItem.Create(ACollection: TCollection);
+begin
+ inherited Create(ACollection);
+ FEnabled:=true;
+end;
+
+destructor TValidateItem.Destroy;
+begin
+ inherited Destroy;
+end;
+
+function TValidateItem.CheckClose(AForm: TCustomForm): boolean;
+var
+ P:TObject;
+ PI1, PI2:PPropInfo;
+ FiName:string;
+ DS:TDataSet;
+begin
+ Result:=true;
+ if not Assigned(FControl) then exit;
+
+ if Assigned(FOnValidate) then
+ FOnValidate( TRxCloseFormValidator(TValidateItems(Collection).Owner), FControl, Result)
+ else
+ begin
+ if FControl = AForm.ActiveControl then
+ begin
+ AForm.SelectNext(FControl, true, true);
+ end;
+ //Сначала проверим - вдруги это завязки на работу с БД
+ PI1:=GetPropInfo(Control, 'DataSource');
+ PI2:=GetPropInfo(Control, 'DataField');
+ if Assigned(PI1) and Assigned(PI2) then
+ begin
+ //Точно - БД
+ //Проверка выполняется если только указан источник данных и поле в нём
+ P:=GetObjectProp(Control, 'DataSource');
+ FiName:=GetPropValue(Control, 'DataField');
+ if Assigned(P) and (FiName<>'') then
+ begin
+ DS:=(P as TDataSource).DataSet;
+ if Assigned(DS) then
+ Result:=not DS.FieldByName(FiName).IsNull;
+ end;
+ end
+ else
+ if Control is TCustomEdit then
+ Result:=TCustomEdit(Control).Text<>'';
+ end;
+end;
+
+function TValidateItem.ErrorMessage: string;
+begin
+ Result:=Format(sReqValue, [FFieldCaption]);
+end;
+
+procedure TValidateItem.SetFocus;
+var
+ P:TWinControl;
+begin
+
+ if FControl is TWinControl then
+ begin
+ P:=TWinControl(FControl).Parent;
+ //Необходимо обработать случай нахождения компоненты на PageControl-e
+ while Assigned(P) and not (P is TCustomForm) do
+ begin
+ if P is TTabSheet then
+ TTabSheet(P).PageControl.ActivePage:=TTabSheet(P);
+ P:=P.Parent;
+ end;
+ TWinControl(FControl).SetFocus;
+ end;
+end;
+
+{ TRxCloseFormValidator }
+
+procedure TRxCloseFormValidator.FormCloseQuery(Sender: TObject;
+ var CanClose: boolean);
+begin
+ if Sender is TCustomForm then
+ begin
+ if TForm(Sender).ModalResult = mrOk then
+ begin
+ if CanClose and Assigned(FOnCloseQuery) then
+ FOnCloseQuery(Sender, CanClose);
+ if CanClose then
+ CanClose:=CheckCloseForm;
+ end;
+ end;
+end;
+
+function TRxCloseFormValidator.CheckCloseForm: boolean;
+var
+ i:integer;
+ F:TComponent;
+begin
+ F:=Owner;
+ while Assigned(F) and not (F is TCustomForm) do
+ F:=F.Owner;
+
+ Result:=false;
+
+ if not Assigned(F) then exit;
+
+ for i:=0 to FItems.Count-1 do
+ begin
+ if FItems[i].Enabled and (not FItems[i].CheckClose(F as TCustomForm)) then
+ begin
+ FItems[i].SetFocus;
+ Application.MessageBox(PChar(FItems[i].ErrorMessage), PChar(FErrorMsgCaption), MB_OK + MB_ICONERROR);
+ exit;
+ end;
+ end;
+ Result:=true;
+end;
+
+function TRxCloseFormValidator.ByControl(AControl: TWinControl): TValidateItem;
+var
+ i:integer;
+begin
+ Result:=nil;
+ for i:=0 to FItems.Count - 1 do
+ begin
+ if FItems[i].FControl = AControl then
+ begin
+ Result:=FItems[i];
+ exit;
+ end;
+ end;
+ raise Exception.CreateFmt(sExptControlNotFound, [Name]);
+end;
+
+function TRxCloseFormValidator.GetItems: TValidateItems;
+begin
+ Result:=FItems;
+end;
+
+procedure TRxCloseFormValidator.SetCloseQueryHandler;
+begin
+ if (csDesigning in ComponentState) or (not Assigned(Owner)) then exit;
+ if Owner is TCustomForm then
+ begin
+ FOnCloseQuery:=TForm(Owner).OnCloseQuery;
+ TForm(Owner).OnCloseQuery:=@FormCloseQuery;
+ end;
+end;
+
+procedure TRxCloseFormValidator.SetItems(AValue: TValidateItems);
+begin
+ FItems.Assign(AValue);
+end;
+
+procedure TRxCloseFormValidator.Notification(AComponent: TComponent;
+ Operation: TOperation);
+var
+ i:integer;
+begin
+ inherited Notification(AComponent, Operation);
+ if AComponent = Self then exit;
+ if Operation = opRemove then
+ begin
+ for i:=0 to FItems.Count - 1 do
+ if FItems[i].Control = AComponent then
+ FItems[i].Control := nil;
+ end;
+end;
+
+procedure TRxCloseFormValidator.Loaded;
+begin
+ inherited Loaded;
+ SetCloseQueryHandler;
+end;
+
+constructor TRxCloseFormValidator.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FErrorMsgCaption:=sCloseValidError;
+ FItems:=TValidateItems.Create(Self, TValidateItem);
+end;
+
+destructor TRxCloseFormValidator.Destroy;
+begin
+ FreeAndNil(FItems);
+ inherited Destroy;
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxconfigvalues.pas b/components/rx/version/v2.2_laz_1.2/rxconfigvalues.pas
new file mode 100644
index 000000000..68d53abce
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxconfigvalues.pas
@@ -0,0 +1,432 @@
+{ rxConfigValues unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit rxConfigValues;
+
+{$I rx.inc}
+
+interface
+
+uses
+ Classes, SysUtils;
+
+const
+ cvtInteger = 1; // целое
+ cvtString = 2; // строка
+ cvtBoolean = 3; // логическая
+ cvtDateTime = 4; // дата
+ cvtFloat = 5; // вещественное
+
+type
+
+ { TConfigValue }
+
+ TConfigValue = class
+ private
+ FModified:boolean;
+ FName: string;
+ FDataType:byte;
+ FValue:Variant;
+ function GetAsBoolean: boolean;
+ function GetAsDateTime: TDateTime;
+ function GetAsFloat: Double;
+ function GetAsInteger: integer;
+ function GetAsString: string;
+ procedure SetAsBoolean(const AValue: boolean);
+ procedure SetAsDateTime(const AValue: TDateTime);
+ procedure SetAsFloat(const AValue: Double);
+ procedure SetAsInteger(const AValue: integer);
+ procedure SetAsString(const AValue: string);
+ function GetValue: string;
+ public
+ constructor Create;
+ destructor Destroy; override;
+ property Name:string read FName;
+ property AsString:string read GetAsString write SetAsString;
+ property AsInteger:integer read GetAsInteger write SetAsInteger;
+ property AsFloat:Double read GetAsFloat write SetAsFloat;
+ property AsBoolean:boolean read GetAsBoolean write SetAsBoolean;
+ property AsDateTime:TDateTime read GetAsDateTime write SetAsDateTime;
+ property Modified:boolean read FModified write FModified;
+ property DataType:byte read FDataType;
+ property Value:string read GetValue;
+ end;
+
+ { TConfigValues }
+
+ TConfigValues = class
+ private
+ FItems:TList;
+ function CreateValue(AName:string; AType:byte):TConfigValue;
+ function GetCount: integer;
+ function GetItem(Index:Integer): TConfigValue;
+ public
+ constructor Create;
+ destructor Destroy; override;
+ procedure BeginUpdate;
+ procedure EndUpdate;
+ procedure Clear;
+ function ParamByName(AName:string):TConfigValue;
+ function ByNameAsInteger(AName:string; DefValue:integer):integer;
+ function ByNameAsString(AName:string; DefValue:string):string;
+ function ByNameAsFloat(AName:string; DefValue:Double):Double;
+ function ByNameAsBoolean(AName:string; DefValue:Boolean):Boolean;
+ function ByNameAsDateTime(AName:string; DefValue:TDateTime):TDateTime;
+ procedure SetByNameAsInteger(AName:string; AValue:integer);
+ procedure SetByNameAsString(AName:string; AValue:string);
+ procedure SetByNameAsFloat(AName:string; ADefValue:Double);
+ procedure SetByNameAsBoolean(AName:string; ADefValue:Boolean);
+ procedure SetByNameAsDateTime(AName:string; ADefValue:TDateTime);
+ public
+ property Items[Index:Integer]:TConfigValue read GetItem;default;
+ property Count:integer read GetCount;
+ end;
+
+
+implementation
+
+{ TConfigValues }
+
+function TConfigValues.CreateValue(AName: string; AType: byte): TConfigValue;
+begin
+ Result:=TConfigValue.Create;
+ Result.FDataType:=AType;
+ Result.FName:=AName;
+ FItems.Add(Result);
+end;
+
+function TConfigValues.GetCount: integer;
+begin
+ Result:=FItems.Count;
+end;
+
+function TConfigValues.GetItem(Index:Integer): TConfigValue;
+begin
+ Result:=TConfigValue(FItems[Index]);
+end;
+
+constructor TConfigValues.Create;
+begin
+ inherited Create;
+ FItems:=TList.Create;
+end;
+
+destructor TConfigValues.Destroy;
+begin
+ Clear;
+ FreeAndNil(FItems);
+ inherited Destroy;
+end;
+
+procedure TConfigValues.BeginUpdate;
+begin
+
+end;
+
+procedure TConfigValues.EndUpdate;
+var
+ i:integer;
+begin
+ for i:=0 to FItems.Count - 1 do
+ TConfigValue(FItems[i]).FModified:=false;
+end;
+
+procedure TConfigValues.Clear;
+var
+ i:integer;
+begin
+ for i:=0 to FItems.Count - 1 do
+ TConfigValue(FItems[i]).Free;
+ FItems.Clear;
+end;
+
+function TConfigValues.ParamByName(AName: string): TConfigValue;
+var
+ i:integer;
+begin
+ AName:=AnsiUpperCase(AName);
+ Result:=nil;
+ for i:=0 to FItems.Count - 1 do
+ begin
+ if AnsiUpperCase(TConfigValue(FItems[i]).FName) = AName then
+ begin
+ Result:=TConfigValue(FItems[i]);
+ exit;
+ end;
+ end;
+end;
+
+function TConfigValues.ByNameAsInteger(AName: string; DefValue: integer
+ ): integer;
+var
+ P:TConfigValue;
+begin
+ P:=ParamByName(AName);
+ if Assigned(P) then
+ Result:=P.AsInteger
+ else
+ Result:=DefValue;
+end;
+
+function TConfigValues.ByNameAsString(AName: string; DefValue: string): string;
+var
+ P:TConfigValue;
+begin
+ P:=ParamByName(AName);
+ if Assigned(P) then
+ Result:=P.AsString
+ else
+ Result:=DefValue;
+end;
+
+function TConfigValues.ByNameAsFloat(AName: string; DefValue: Double): Double;
+var
+ P:TConfigValue;
+begin
+ P:=ParamByName(AName);
+ if Assigned(P) then
+ Result:=P.AsFloat
+ else
+ Result:=DefValue;
+end;
+
+function TConfigValues.ByNameAsBoolean(AName: string; DefValue: Boolean
+ ): Boolean;
+var
+ P:TConfigValue;
+begin
+ P:=ParamByName(AName);
+ if Assigned(P) then
+ Result:=P.AsBoolean
+ else
+ Result:=DefValue;
+end;
+
+function TConfigValues.ByNameAsDateTime(AName: string; DefValue: TDateTime
+ ): TDateTime;
+var
+ P:TConfigValue;
+begin
+ P:=ParamByName(AName);
+ if Assigned(P) then
+ Result:=P.AsDateTime
+ else
+ Result:=DefValue;
+end;
+
+procedure TConfigValues.SetByNameAsInteger(AName: string; AValue: integer);
+var
+ P:TConfigValue;
+begin
+ P:=ParamByName(AName);
+ if not Assigned(P) then
+ P:=CreateValue(AName, cvtInteger);
+ P.AsInteger:=AValue;
+end;
+
+procedure TConfigValues.SetByNameAsString(AName: string; AValue: string);
+var
+ P:TConfigValue;
+begin
+ P:=ParamByName(AName);
+ if not Assigned(P) then
+ P:=CreateValue(AName, cvtString);
+ P.AsString:=AValue;
+end;
+
+procedure TConfigValues.SetByNameAsFloat(AName: string; ADefValue: Double);
+var
+ P:TConfigValue;
+begin
+ P:=ParamByName(AName);
+ if not Assigned(P) then
+ P:=CreateValue(AName, cvtFloat);
+ P.AsFloat:=ADefValue;
+end;
+
+procedure TConfigValues.SetByNameAsBoolean(AName: string; ADefValue: Boolean);
+var
+ P:TConfigValue;
+begin
+ P:=ParamByName(AName);
+ if not Assigned(P) then
+ P:=CreateValue(AName, cvtBoolean);
+ P.AsBoolean:=ADefValue;
+end;
+
+procedure TConfigValues.SetByNameAsDateTime(AName: string; ADefValue: TDateTime
+ );
+var
+ P:TConfigValue;
+begin
+ P:=ParamByName(AName);
+ if not Assigned(P) then
+ P:=CreateValue(AName, cvtDateTime);
+ P.AsDateTime:=ADefValue;
+end;
+
+{ TConfigValue }
+
+function TConfigValue.GetAsBoolean: boolean;
+begin
+ if FDataType = cvtBoolean then
+ Result:=FValue
+ else
+ raise Exception.CreateFmt('Variable %s is not boolean', [FName]);
+end;
+
+function TConfigValue.GetAsDateTime: TDateTime;
+begin
+ if FDataType = cvtDateTime then
+ Result:=FValue
+ else
+ raise Exception.CreateFmt('Variable %s is not date/time', [FName]);
+end;
+
+function TConfigValue.GetAsFloat: Double;
+begin
+ if FDataType = cvtFloat then
+ Result:=FValue
+ else
+ raise Exception.CreateFmt('Variable %s is not float', [FName]);
+end;
+
+function TConfigValue.GetAsInteger: integer;
+begin
+ if FDataType = cvtInteger then
+ Result:=FValue
+ else
+ raise Exception.CreateFmt('Variable %s is not integer', [FName]);
+end;
+
+function TConfigValue.GetAsString: string;
+begin
+ if FDataType = cvtString then
+ Result:=FValue
+ else
+ raise Exception.CreateFmt('Variable %s is not string', [FName]);
+end;
+
+procedure TConfigValue.SetAsBoolean(const AValue: boolean);
+begin
+ if FDataType = cvtBoolean then
+ begin
+ if FValue<>AValue then
+ begin
+ FValue:=AValue;
+ FModified:=true;
+ end
+ end
+ else
+ raise Exception.CreateFmt('Variable %s is not boolean', [FName]);
+end;
+
+procedure TConfigValue.SetAsDateTime(const AValue: TDateTime);
+begin
+ if FDataType = cvtDateTime then
+ begin
+ if FValue<>AValue then
+ begin
+ FValue:=AValue;
+ FModified:=true;
+ end
+ end
+ else
+ raise Exception.CreateFmt('Variable %s is not date/time', [FName]);
+end;
+
+procedure TConfigValue.SetAsFloat(const AValue: Double);
+begin
+ if FDataType = cvtFloat then
+ begin
+ if FValue<>AValue then
+ begin
+ FValue:=AValue;
+ FModified:=true;
+ end
+ end
+ else
+ raise Exception.CreateFmt('Variable %s is not float', [FName]);
+end;
+
+procedure TConfigValue.SetAsInteger(const AValue: integer);
+begin
+ if FDataType = cvtInteger then
+ begin
+ if (FValue = null) or (FValue<>AValue) then
+ begin
+ FValue:=AValue;
+ FModified:=true;
+ end
+ end
+ else
+ raise Exception.CreateFmt('Variable %s is not integer', [FName]);
+end;
+
+procedure TConfigValue.SetAsString(const AValue: string);
+begin
+ if FDataType = cvtString then
+ begin
+ if FValue<>AValue then
+ begin
+ FValue:=AValue;
+ FModified:=true;
+ end
+ end
+ else
+ raise Exception.CreateFmt('Variable %s is not string', [FName]);
+end;
+
+constructor TConfigValue.Create;
+begin
+ inherited Create;
+ FModified:=false;
+ FValue:=null;
+end;
+
+destructor TConfigValue.Destroy;
+begin
+ inherited Destroy;
+end;
+
+function TConfigValue.GetValue: string;
+begin
+ case FDataType of
+ cvtInteger : Result:=IntToStr(AsInteger);
+ cvtString : Result:=AsString;
+ cvtBoolean : Result:=IntToStr(Ord(AsBoolean));
+ cvtDateTime: Result:=DateTimeToStr(AsDateTime);
+ cvtFloat : Str(AsFloat, Result);
+ end;
+end;
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/rxconst.pas b/components/rx/version/v2.2_laz_1.2/rxconst.pas
new file mode 100644
index 000000000..db5a31746
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxconst.pas
@@ -0,0 +1,141 @@
+{ rxconst unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit rxconst;
+
+interface
+
+{$I RX.INC}
+
+uses LMessages, Controls;
+
+const
+ RX_VERSION = $0002004B; { 2.75 }
+
+const
+{ Command message for Speedbar editor }
+ CM_SPEEDBARCHANGED = CM_BASE + 80;
+{ Command message for TRxSpeedButton }
+ CM_RXBUTTONPRESSED = CM_BASE + 81;
+{ Command messages for TRxWindowHook }
+ CM_RECREATEWINDOW = CM_BASE + 82;
+ CM_DESTROYHOOK = CM_BASE + 83;
+{ Notify message for TRxTrayIcon }
+ CM_TRAYICON = CM_BASE + 84;
+
+const
+ crHand = TCursor(14000);
+ crDragHand = TCursor(14001);
+
+//const
+//{ TBitmap.GetTransparentColor from GRAPHICS.PAS uses this value }
+// PaletteMask = $02000000;
+
+resourcestring
+ sBrowse = 'Browse';
+ sDefaultFilter = 'All files (*.*)|*.*';
+ sDateDlgTitle = 'Select a Date';
+ sNextYear = 'Next Year|';
+ sNextMonth = 'Next Month|';
+ sPrevYear = 'Previous Year|';
+ sPrevMonth = 'Previous Month|';
+ sNotImplemented = 'Function not yet implemented';
+ sFileNotExec = 'File specified is not an executable file, dynamic-link library, or icon file';
+ sLoadLibError = 'Could not load ''%s'' library';
+ sDetails = 'Details';
+ sWindowsIcoFiles = 'Windows Ico files (*.ico)|*.ico|All files (*.*)|*.*';
+ sToCurDate = 'Set current date';
+
+ //TDualListDialog
+ SDualListSrcCaption = 'Source';
+ SDualListDestCaption = 'Destination';
+ SDualListCaption = 'Dual list dialog';
+
+ //TToolPanelSetupForm
+ sToolPanelSetup = 'Tool panel setup';
+ sVisibleButtons = 'Visible buttons';
+ sOptions = 'Options';
+ sAvaliableButtons = 'Avaliable buttons';
+ sShowCaption = 'Show caption';
+ sToolBarStyle = 'Tool bar style';
+ sToolBarStyle1 = 'Standart';
+ sToolBarStyle2 = 'Windows XP';
+ sToolBarStyle3 = 'Native';
+ sFlatButtons = 'Flat buttons';
+ sTransparent = 'Transparent';
+ sShowHint = 'Show hint';
+ sButtonAlign = 'Button align';
+ sButtonAlign1 = 'None';
+ sButtonAlign2 = 'Left';
+ sButtonAlign3 = 'Rignt';
+ sGTKWidgetSet = 'GTK widget set';
+ sGTK2WidgetSet = 'GTK 2 widget set';
+ sWin32_64WidgetSet = 'Win32/Win64 widget set';
+ sWinCEWidgetSet = 'WinCE widget set';
+ sCarbonWidgetSet = 'Carbon widget set';
+ sQTWidgetSet = 'QT widget set';
+ sFpGUIWidgetSet = 'FpGUI widget set';
+ sOtherGUIWidgetSet = 'Other gui';
+ sAppVersion = 'Version : ';
+ sLCLVersion = 'LCL Version: ';
+ sFpcVersion = 'FPC version : ';
+ sTargetCPU = 'Target CPU : ';
+ sTargetOS = 'Target OS : ';
+ sBuildDate = 'Build date : ';
+ sAbout = 'About';
+ sGeneral = 'General';
+ sLicense = 'License';
+ SOutOfRange = 'Out of range %d %d %d %d';
+
+ { TRxHistoryNavigator }
+ sHistoryDesc = 'History - "%s"';
+
+ { RxCloseFormValidator }
+ sCloseValidError = 'Error. Expected vailes...';
+ sReqValue = 'Error. Expected value for filed %s.';
+ sExptControlNotFound = 'Control not found in validate %s.';
+
+ { RxMDI }
+ sCloseWindows = 'Close window';
+ sCloseAllExceptThis = 'Close all except this';
+ sCloseAllWindows = 'Close all windows';
+
+ { TRxDateRangeEdit }
+ sFirstQuarter = 'First quarter';
+ sSecondQuarter = 'Second quarter';
+ sThirdQuarter = 'Third quarter';
+ sFourthQuarter = 'Fourth quarter';
+ sFirstHalfOfYear = 'First half of year';
+ sSecondHalfOfYear = 'Second half of year';
+
+implementation
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxctrls.pas b/components/rx/version/v2.2_laz_1.2/rxctrls.pas
new file mode 100644
index 000000000..4f0353181
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxctrls.pas
@@ -0,0 +1,4465 @@
+{ rxctrls unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit rxctrls;
+
+{$I rx.inc}
+
+interface
+
+uses LResources, LCLType, LCLIntf, LMessages, Classes, Controls, Graphics,
+ StdCtrls, ExtCtrls, Forms, Buttons, Menus, RxConst, IniFiles, GraphType
+ {, Placemnt};
+
+type
+ TPositiveInt = 1..MaxInt;
+
+(*
+{ TTextListBox }
+
+ TTextListBox = class(TCustomListBox)
+ private
+ FMaxWidth: Integer;
+{$IFNDEF WIN32}
+ FTabWidth: Integer;
+ procedure SetTabWidth(Value: Integer);
+{$ENDIF}
+ procedure ResetHorizontalExtent;
+ procedure SetHorizontalExtent;
+ function GetItemWidth(Index: Integer): Integer;
+ protected
+{$IFNDEF WIN32}
+ procedure CreateParams(var Params: TCreateParams); override;
+ procedure CreateWnd; override;
+{$ENDIF}
+ procedure WndProc(var Message: TMessage); override;
+ published
+ property Align;
+ property BorderStyle;
+ property Color;
+ property DragCursor;
+ property DragMode;
+ property Enabled;
+ property ExtendedSelect;
+ property Font;
+ property IntegralHeight;
+{$IFDEF RX_D4}
+ property Anchors;
+ property BiDiMode;
+ property Constraints;
+ property DragKind;
+ property ParentBiDiMode;
+{$ENDIF}
+{$IFDEF WIN32}
+ {$IFNDEF VER90}
+ property ImeMode;
+ property ImeName;
+ {$ENDIF}
+{$ENDIF}
+ property ItemHeight;
+ property Items;
+ property MultiSelect;
+ property ParentColor;
+ property ParentFont;
+ property ParentShowHint;
+ property PopupMenu;
+ property ShowHint;
+ property Sorted;
+ property TabOrder;
+ property TabStop;
+{$IFDEF WIN32}
+ property TabWidth;
+{$ELSE}
+ property TabWidth: Integer read FTabWidth write SetTabWidth default 0;
+{$ENDIF}
+ property Visible;
+ property OnClick;
+ property OnDblClick;
+ property OnDragDrop;
+ property OnDragOver;
+ property OnEndDrag;
+ property OnEnter;
+ property OnExit;
+ property OnKeyDown;
+ property OnKeyPress;
+ property OnKeyUp;
+ property OnMouseDown;
+ property OnMouseMove;
+ property OnMouseUp;
+{$IFDEF WIN32}
+ property OnStartDrag;
+{$ENDIF}
+{$IFDEF RX_D5}
+ property OnContextPopup;
+{$ENDIF}
+{$IFDEF RX_D4}
+ property OnMouseWheelDown;
+ property OnMouseWheelUp;
+ property OnEndDock;
+ property OnStartDock;
+{$ENDIF}
+ end;
+
+{ TRxCustomListBox }
+
+ TGetItemWidthEvent = procedure(Control: TWinControl; Index: Integer;
+ var Width: Integer) of object;
+
+ TRxCustomListBox = class(TWinControl)
+ private
+ FItems: TStrings;
+ FBorderStyle: TBorderStyle;
+ FCanvas: TCanvas;
+ FColumns: Integer;
+ FItemHeight: Integer;
+ FStyle: TListBoxStyle;
+ FIntegralHeight: Boolean;
+ FMultiSelect: Boolean;
+ FSorted: Boolean;
+ FExtendedSelect: Boolean;
+ FTabWidth: Integer;
+ FSaveItems: TStringList;
+ FSaveTopIndex: Integer;
+ FSaveItemIndex: Integer;
+ FAutoScroll: Boolean;
+ FGraySelection: Boolean;
+ FMaxItemWidth: Integer;
+ FOnDrawItem: TDrawItemEvent;
+ FOnMeasureItem: TMeasureItemEvent;
+ FOnGetItemWidth: TGetItemWidthEvent;
+ procedure ResetHorizontalExtent;
+ procedure SetHorizontalExtent;
+ function GetAutoScroll: Boolean;
+ function GetItemHeight: Integer; virtual;
+ function GetItemIndex: Integer;
+ function GetSelCount: Integer;
+ function GetSelected(Index: Integer): Boolean;
+ function GetTopIndex: Integer;
+ procedure SetAutoScroll(Value: Boolean);
+ procedure SetBorderStyle(Value: TBorderStyle);
+ procedure SetColumnWidth;
+ procedure SetColumns(Value: Integer);
+ procedure SetExtendedSelect(Value: Boolean);
+ procedure SetIntegralHeight(Value: Boolean);
+ procedure SetItemHeight(Value: Integer);
+ procedure SetItemIndex(Value: Integer);
+ procedure SetMultiSelect(Value: Boolean);
+ procedure SetSelected(Index: Integer; Value: Boolean);
+ procedure SetSorted(Value: Boolean);
+ procedure SetStyle(Value: TListBoxStyle);
+ procedure SetTabWidth(Value: Integer);
+ procedure SetTopIndex(Value: Integer);
+ procedure SetGraySelection(Value: Boolean);
+ procedure SetOnDrawItem(Value: TDrawItemEvent);
+ procedure SetOnGetItemWidth(Value: TGetItemWidthEvent);
+ procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
+ procedure WMSize(var Message: TWMSize); message WM_SIZE;
+ procedure CNCommand(var Message: TWMCommand); message CN_COMMAND;
+ procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
+ procedure CNMeasureItem(var Message: TWMMeasureItem); message CN_MEASUREITEM;
+ procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
+ procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHITTEST;
+ procedure WMKillFocus(var Msg: TWMKillFocus); message WM_KILLFOCUS;
+ procedure WMSetFocus(var Msg: TWMSetFocus); message WM_SETFOCUS;
+{$IFDEF WIN32}
+// procedure CMCtl3DChanged(var Message: TMessage); message CM_CTL3DCHANGED;
+{$ENDIF}
+ protected
+ procedure CreateParams(var Params: TCreateParams); override;
+ procedure CreateWnd; override;
+ procedure DestroyWnd; override;
+ function CreateItemList: TStrings; virtual;
+ function GetItemWidth(Index: Integer): Integer; virtual;
+ procedure WndProc(var Message: TMessage); override;
+ procedure DragCanceled; override;
+ procedure DrawItem(Index: Integer; Rect: TRect;
+ State: TOwnerDrawState); virtual;
+ procedure MeasureItem(Index: Integer; var Height: Integer); virtual;
+ function GetItemData(Index: Integer): Longint; dynamic;
+ procedure SetItemData(Index: Integer; AData: LongInt); dynamic;
+ procedure SetItems(Value: TStrings); virtual;
+ procedure ResetContent; dynamic;
+ procedure DeleteString(Index: Integer); dynamic;
+ property AutoScroll: Boolean read GetAutoScroll write SetAutoScroll default False;
+ property BorderStyle: TBorderStyle read FBorderStyle write SetBorderStyle default bsSingle;
+ property Columns: Integer read FColumns write SetColumns default 0;
+ property ExtendedSelect: Boolean read FExtendedSelect write SetExtendedSelect default True;
+ property GraySelection: Boolean read FGraySelection write SetGraySelection default False;
+ property IntegralHeight: Boolean read FIntegralHeight write SetIntegralHeight default False;
+ property ItemHeight: Integer read GetItemHeight write SetItemHeight;
+ property MultiSelect: Boolean read FMultiSelect write SetMultiSelect default False;
+ property ParentColor default False;
+ property Sorted: Boolean read FSorted write SetSorted default False;
+ property Style: TListBoxStyle read FStyle write SetStyle default lbStandard;
+ property TabWidth: Integer read FTabWidth write SetTabWidth default 0;
+ property OnDrawItem: TDrawItemEvent read FOnDrawItem write SetOnDrawItem;
+ property OnMeasureItem: TMeasureItemEvent read FOnMeasureItem write FOnMeasureItem;
+ property OnGetItemWidth: TGetItemWidthEvent read FOnGetItemWidth write SetOnGetItemWidth;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure Clear;
+ procedure DefaultDrawText(X, Y: Integer; const S: string);
+ function ItemAtPos(Pos: TPoint; Existing: Boolean): Integer;
+ function ItemRect(Index: Integer): TRect;
+ property Canvas: TCanvas read FCanvas;
+ property Items: TStrings read FItems write SetItems;
+ property ItemIndex: Integer read GetItemIndex write SetItemIndex;
+ property SelCount: Integer read GetSelCount;
+ property Selected[Index: Integer]: Boolean read GetSelected write SetSelected;
+ property TopIndex: Integer read GetTopIndex write SetTopIndex;
+ published
+ property TabStop default True;
+ end;
+
+{ TRxCheckListBox }
+
+ TCheckKind = (ckCheckBoxes, ckRadioButtons, ckCheckMarks);
+ TChangeStateEvent = procedure (Sender: TObject; Index: Integer) of object;
+
+ TRxCheckListBox = class(TRxCustomListBox)
+ private
+ FAllowGrayed: Boolean;
+ FCheckKind: TCheckKind;
+ FSaveStates: TList;
+ FDrawBitmap: TBitmap;
+ FCheckWidth, FCheckHeight: Integer;
+ FReserved: Integer;
+ FInUpdateStates: Boolean;
+ FIniLink: TIniLink;
+ FOnClickCheck: TNotifyEvent;
+ FOnStateChange: TChangeStateEvent;
+ procedure ResetItemHeight;
+ function GetItemHeight: Integer; override;
+ procedure DrawCheck(R: TRect; AState: TCheckBoxState; Enabled: Boolean);
+ procedure SetCheckKind(Value: TCheckKind);
+ procedure SetChecked(Index: Integer; AChecked: Boolean);
+ function GetChecked(Index: Integer): Boolean;
+ procedure SetState(Index: Integer; AState: TCheckBoxState);
+ function GetState(Index: Integer): TCheckBoxState;
+ procedure SetItemEnabled(Index: Integer; Value: Boolean);
+ function GetItemEnabled(Index: Integer): Boolean;
+ function GetAllowGrayed: Boolean;
+ procedure ToggleClickCheck(Index: Integer);
+ procedure InvalidateCheck(Index: Integer);
+ procedure InvalidateItem(Index: Integer);
+ function CreateCheckObject(Index: Integer): TObject;
+ function FindCheckObject(Index: Integer): TObject;
+ function GetCheckObject(Index: Integer): TObject;
+ function IsCheckObject(Index: Integer): Boolean;
+ procedure ReadVersion(Reader: TReader);
+ procedure WriteVersion(Writer: TWriter);
+ procedure ReadCheckData(Reader: TReader);
+ procedure WriteCheckData(Writer: TWriter);
+ procedure InternalSaveStates(IniFile: TObject; const Section: string);
+ procedure InternalRestoreStates(IniFile: TObject; const Section: string);
+ function GetStorage: TFormPlacement;
+ procedure SetStorage(Value: TFormPlacement);
+ procedure IniSave(Sender: TObject);
+ procedure IniLoad(Sender: TObject);
+ procedure UpdateCheckStates;
+ function GetCheckedIndex: Integer;
+ procedure SetCheckedIndex(Value: Integer);
+ procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
+ procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
+ protected
+ function CreateItemList: TStrings; override;
+ procedure DrawItem(Index: Integer; Rect: TRect;
+ State: TOwnerDrawState); override;
+ procedure DefineProperties(Filer: TFiler); override;
+ function GetItemWidth(Index: Integer): Integer; override;
+ function GetItemData(Index: Integer): LongInt; override;
+ procedure SetItemData(Index: Integer; AData: LongInt); override;
+ procedure KeyPress(var Key: Char); override;
+ procedure Loaded; override;
+ procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
+ X, Y: Integer); override;
+ procedure ResetContent; override;
+ procedure DeleteString(Index: Integer); override;
+ procedure ClickCheck; dynamic;
+ procedure ChangeItemState(Index: Integer); dynamic;
+ procedure CreateParams(var Params: TCreateParams); override;
+ procedure CreateWnd; override;
+ procedure DestroyWnd; override;
+ procedure WMDestroy(var Msg: TWMDestroy); message WM_DESTROY;
+ function GetCheckWidth: Integer;
+ procedure SetItems(Value: TStrings); override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+{$IFDEF WIN32}
+ procedure SaveStatesReg(IniFile: TRegIniFile);
+ procedure RestoreStatesReg(IniFile: TRegIniFile);
+{$ENDIF WIN32}
+ procedure SaveStates(IniFile: TIniFile);
+ procedure RestoreStates(IniFile: TIniFile);
+ procedure ApplyState(AState: TCheckBoxState; EnabledOnly: Boolean);
+ property Checked[Index: Integer]: Boolean read GetChecked write SetChecked;
+ property State[Index: Integer]: TCheckBoxState read GetState write SetState;
+ property EnabledItem[Index: Integer]: Boolean read GetItemEnabled write SetItemEnabled;
+ published
+ property AllowGrayed: Boolean read GetAllowGrayed write FAllowGrayed default False;
+ property CheckKind: TCheckKind read FCheckKind write SetCheckKind default ckCheckBoxes;
+ property CheckedIndex: Integer read GetCheckedIndex write SetCheckedIndex default -1;
+ property IniStorage: TFormPlacement read GetStorage write SetStorage;
+ property Align;
+ property AutoScroll default True;
+ property BorderStyle;
+ property Color;
+ property Columns;
+ property DragCursor;
+ property DragMode;
+ property Enabled;
+ property ExtendedSelect;
+ property Font;
+ property GraySelection;
+{$IFDEF RX_D4}
+ property Anchors;
+ property BiDiMode;
+ property Constraints;
+ property DragKind;
+ property ParentBiDiMode;
+{$ENDIF}
+{$IFDEF WIN32}
+ {$IFNDEF VER90}
+ property ImeMode;
+ property ImeName;
+ {$ENDIF}
+{$ENDIF}
+ property IntegralHeight;
+ property ItemHeight;
+ property Items stored False;
+ property MultiSelect;
+ property ParentColor;
+ property ParentFont;
+ property ParentShowHint;
+ property PopupMenu;
+ property ShowHint;
+ property Sorted;
+ property Style;
+ property TabOrder;
+ property TabWidth;
+ property Visible;
+ property OnStateChange: TChangeStateEvent read FOnStateChange write FOnStateChange;
+ property OnClickCheck: TNotifyEvent read FOnClickCheck write FOnClickCheck;
+ property OnClick;
+ property OnDblClick;
+ property OnDragDrop;
+ property OnDragOver;
+ property OnDrawItem;
+ property OnEndDrag;
+ property OnEnter;
+ property OnExit;
+ property OnGetItemWidth;
+ property OnKeyDown;
+ property OnKeyPress;
+ property OnKeyUp;
+ property OnMeasureItem;
+ property OnMouseDown;
+ property OnMouseMove;
+ property OnMouseUp;
+{$IFDEF WIN32}
+ property OnStartDrag;
+{$ENDIF}
+{$IFDEF RX_D5}
+ property OnContextPopup;
+{$ENDIF}
+{$IFDEF RX_D4}
+ property OnMouseWheelDown;
+ property OnMouseWheelUp;
+ property OnEndDock;
+ property OnStartDock;
+{$ENDIF}
+ end;
+*)
+const
+ clbDefaultState = cbUnchecked;
+ clbDefaultEnabled = True;
+
+{ TRxCustomLabel }
+
+type
+ TShadowPosition = (spLeftTop, spLeftBottom, spRightBottom, spRightTop);
+{$IFNDEF RX_D3}
+ TTextLayout = (tlTop, tlCenter, tlBottom);
+{$ENDIF}
+
+ TRxCustomLabel = class(TGraphicControl)
+ private
+ FFocusControl: TWinControl;
+ FAlignment: TAlignment;
+ FAutoSize: Boolean;
+ FLayout: TTextLayout;
+ FShadowColor: TColor;
+ FShadowSize: Byte;
+ FShadowPos: TShadowPosition;
+ FWordWrap: Boolean;
+ FShowAccelChar: Boolean;
+ FShowFocus: Boolean;
+ FFocused: Boolean;
+ FMouseInControl: Boolean;
+ FDragging: Boolean;
+ FLeftMargin: Integer;
+ FRightMargin: Integer;
+ FOnMouseEnter: TNotifyEvent;
+ FOnMouseLeave: TNotifyEvent;
+ procedure DoDrawText(var Rect: TRect; Flags: Word);
+ function GetTransparent: Boolean;
+ procedure UpdateTracking;
+ procedure SetAlignment(Value: TAlignment);
+{$IFNDEF RX_D6}
+ procedure SetAutoSize(Value: Boolean);
+{$ENDIF}
+ procedure SetFocusControl(Value: TWinControl);
+ procedure SetLayout(Value: TTextLayout);
+ procedure SetLeftMargin(Value: Integer);
+ procedure SetRightMargin(Value: Integer);
+ procedure SetShadowColor(Value: TColor);
+ procedure SetShadowSize(Value: Byte);
+ procedure SetShadowPos(Value: TShadowPosition);
+ procedure SetShowAccelChar(Value: Boolean);
+ procedure SetTransparent(Value: Boolean);
+ procedure SetWordWrap(Value: Boolean);
+ procedure SetShowFocus(Value: Boolean);
+ procedure CMTextChanged(var Message: TLMessage); message CM_TEXTCHANGED;
+ procedure CMFocusChanged(var Message: TLMessage); message CM_FOCUSCHANGED;
+ procedure CMFontChanged(var Message: TLMessage); message CM_FONTCHANGED;
+ procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR;
+ procedure CMEnabledChanged(var Message: TLMessage); message CM_ENABLEDCHANGED;
+ procedure CMMouseEnter(var Message: TLMessage); message CM_MOUSEENTER;
+ procedure CMMouseLeave(var Message: TLMessage); message CM_MOUSELEAVE;
+ procedure CMVisibleChanged(var Message: TLMessage); message CM_VISIBLECHANGED;
+(*
+ procedure WMRButtonDown(var Message: TWMRButtonDown); message WM_RBUTTONDOWN;
+ procedure WMRButtonUp(var Message: TWMRButtonUp); message WM_RBUTTONUP;
+*)
+ protected
+ procedure MouseDown(Button: TMouseButton; Shift:TShiftState; X,Y:Integer); override;
+ procedure MouseUp(Button: TMouseButton; Shift:TShiftState; X,Y:Integer); override;
+// procedure SetAutoSize(Value: Boolean); override;
+ procedure AdjustBounds;
+ function GetDefaultFontColor: TColor; virtual;
+ function GetLabelCaption: string; virtual;
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ procedure Paint; override;
+ procedure MouseEnter; dynamic;
+ procedure MouseLeave; dynamic;
+ property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify;
+ property AutoSize: Boolean read FAutoSize write SetAutoSize default True;
+ property FocusControl: TWinControl read FFocusControl write SetFocusControl;
+ property Layout: TTextLayout read FLayout write SetLayout default tlTop;
+ property LeftMargin: Integer read FLeftMargin write SetLeftMargin default 0;
+ property RightMargin: Integer read FRightMargin write SetRightMargin default 0;
+ property ShadowColor: TColor read FShadowColor write SetShadowColor default clBtnHighlight;
+ property ShadowSize: Byte read FShadowSize write SetShadowSize default 1;
+ property ShadowPos: TShadowPosition read FShadowPos write SetShadowPos default spLeftTop;
+ property ShowAccelChar: Boolean read FShowAccelChar write SetShowAccelChar default True;
+ property ShowFocus: Boolean read FShowFocus write SetShowFocus default False;
+ property Transparent: Boolean read GetTransparent write SetTransparent default False;
+ property WordWrap: Boolean read FWordWrap write SetWordWrap default False;
+ property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
+ property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
+ public
+ constructor Create(AOwner: TComponent); override;
+ property Canvas;
+ property MouseInControl: Boolean read FMouseInControl;
+ end;
+
+{ TRxLabel }
+
+ TRxLabel = class(TRxCustomLabel)
+ published
+ property Align;
+ property Alignment;
+ property AutoSize;
+ property Caption;
+ property Color;
+ property DragCursor;
+ property DragMode;
+ property Enabled;
+ property FocusControl;
+ property Font;
+ property Anchors;
+ property Constraints;
+ property DragKind;
+{$IFDEF RX_D4}
+ property BiDiMode;
+ property ParentBiDiMode;
+{$ENDIF}
+ property BorderSpacing;
+ property Layout;
+ property ParentColor;
+ property ParentFont;
+ property ParentShowHint;
+ property PopupMenu;
+ property ShadowColor;
+ property ShadowSize;
+ property ShadowPos;
+ property ShowAccelChar;
+ property ShowFocus;
+ property ShowHint;
+ property Transparent;
+ property Visible;
+ property WordWrap;
+ property OnClick;
+ property OnDblClick;
+ property OnDragDrop;
+ property OnDragOver;
+ property OnEndDrag;
+ property OnMouseDown;
+ property OnMouseMove;
+ property OnMouseUp;
+ property OnMouseEnter;
+ property OnMouseLeave;
+ property OnMouseWheel;
+ property OnMouseWheelDown;
+ property OnMouseWheelUp;
+ property OnStartDrag;
+ property OnContextPopup;
+ property OnEndDock;
+ property OnStartDock;
+ end;
+
+
+{ TSecretPanel }
+
+ TGlyphLayout = (glGlyphLeft, glGlyphRight, glGlyphTop, glGlyphBottom);
+ TScrollDirection = (sdVertical, sdHorizontal);
+ TPanelDrawEvent = procedure(Sender: TObject; Canvas: TCanvas;
+ Rect: TRect) of object;
+
+ TSecretPanel = class(TCustomPanel)
+ private
+ FActive: Boolean;
+ FAlignment: TAlignment;
+ FLines: TStrings;
+ FCycled: Boolean;
+ FScrollCnt: Integer;
+ FMaxScroll: Integer;
+ FTxtDivider: Byte;
+ FFirstLine: Integer;
+ FTimer: TTimer;
+ FTxtRect: TRect;
+ FPaintRect: TRect;
+ FGlyphOrigin: TPoint;
+ FMemoryImage: TBitmap;
+ FGlyph: TBitmap;
+ FHiddenList: TList;
+ FTextStyle: TPanelBevel;
+ FDirection: TScrollDirection;
+ FGlyphLayout: TGlyphLayout;
+ FOnPaintClient: TPanelDrawEvent;
+ FOnStartPlay: TNotifyEvent;
+ FOnStopPlay: TNotifyEvent;
+ FAsyncDrawing: Boolean;
+ procedure SetAsyncDrawing(Value: Boolean);
+ function GetInflateWidth: Integer;
+ function GetInterval: Cardinal;
+ procedure SetInterval(Value: Cardinal);
+ procedure SetGlyph(Value: TBitmap);
+ procedure SetLines(Value: TStrings);
+ procedure SetActive(Value: Boolean);
+ procedure SetAlignment(Value: TAlignment);
+ procedure SetGlyphLayout(Value: TGlyphLayout);
+ procedure SetTextStyle(Value: TPanelBevel);
+ procedure SetDirection(Value: TScrollDirection);
+ procedure RecalcDrawRect;
+ procedure PaintGlyph;
+ procedure PaintText;
+ procedure UpdateMemoryImage;
+ procedure GlyphChanged(Sender: TObject);
+ procedure LinesChanged(Sender: TObject);
+ procedure CMFontChanged(var Message: TLMessage); message CM_FONTCHANGED;
+ procedure CMColorChanged(var Message: TLMessage); message CM_COLORCHANGED;
+// procedure WMSize(var Message: TLMessage); message LM_SIZE;
+ procedure WMSize(var Message: TLMSize); message LM_SIZE;
+ protected
+ procedure AlignControls(AControl: TControl; var Rect: TRect); override;
+ procedure Paint; override;
+ procedure PaintClient(ACanvas: TCanvas; Rect: TRect); virtual;
+ procedure TimerExpired(Sender: TObject); virtual;
+ procedure StartPlay; dynamic;
+ procedure StopPlay; dynamic;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure Play;
+ procedure Stop;
+ property Canvas;
+ published
+ property AsyncDrawing: Boolean read FAsyncDrawing write SetAsyncDrawing default True;
+ property Active: Boolean read FActive write SetActive default False;
+ property Alignment: TAlignment read FAlignment write SetAlignment default taCenter;
+ property Cycled: Boolean read FCycled write FCycled default False;
+ property Glyph: TBitmap read FGlyph write SetGlyph;
+ property GlyphLayout: TGlyphLayout read FGlyphLayout write SetGlyphLayout
+ default glGlyphLeft;
+ property Interval: Cardinal read GetInterval write SetInterval default 30;
+ property Lines: TStrings read FLines write SetLines;
+ property ScrollDirection: TScrollDirection read FDirection write SetDirection
+ default sdVertical;
+ property TextStyle: TPanelBevel read FTextStyle write SetTextStyle default bvNone;
+ property Anchors;
+ property Constraints;
+ property DragKind;
+{$IFDEF RX_D4}
+ property BiDiMode;
+ property ParentBiDiMode;
+{$ENDIF}
+ property Align;
+ property BevelInner;
+ property BevelOuter default bvLowered;
+ property BevelWidth;
+ property BorderWidth;
+ property BorderStyle;
+ property DragCursor;
+ property DragMode;
+ property Color;
+ property Font;
+ property ParentColor;
+ property ParentFont;
+ property ParentShowHint;
+ property PopupMenu;
+ property ShowHint;
+ property TabOrder;
+ property TabStop;
+ property Visible;
+ property OnPaintClient: TPanelDrawEvent read FOnPaintClient write FOnPaintClient;
+ property OnStartPlay: TNotifyEvent read FOnStartPlay write FOnStartPlay;
+ property OnStopPlay: TNotifyEvent read FOnStopPlay write FOnStopPlay;
+ property OnClick;
+ property OnDblClick;
+ property OnDragDrop;
+ property OnDragOver;
+ property OnEndDrag;
+ property OnEnter;
+ property OnExit;
+ property OnMouseDown;
+ property OnMouseMove;
+ property OnMouseUp;
+ property OnMouseWheel;
+ property OnMouseWheelDown;
+ property OnMouseWheelUp;
+ property OnStartDrag;
+ property OnContextPopup;
+ property OnEndDock;
+ property OnStartDock;
+ property OnResize;
+ end;
+
+{ TRxSpeedButton }
+(*
+
+ TRxNumGlyphs = 1..5;
+ TRxDropDownMenuPos = (dmpBottom, dmpRight);
+ TRxButtonState = (rbsUp, rbsDisabled, rbsDown, rbsExclusive, rbsInactive);
+*)
+
+ TRxSpeedButton = class(TSpeedButton)
+ private
+ FAllowTimer: Boolean;
+ FInitRepeatPause: Word;
+ FRepeatPause: Word;
+ FRepeatTimer: TTimer;
+ procedure SetAllowTimer(const AValue: Boolean);
+ procedure TimerExpired(Sender: TObject);
+ protected
+ procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
+ X, Y: Integer); override;
+ procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
+ X, Y: Integer); override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ published
+ property AllowTimer: Boolean read FAllowTimer write SetAllowTimer default False;
+ property InitPause: Word read FInitRepeatPause write FInitRepeatPause default 500;
+ property RepeatInterval: Word read FRepeatPause write FRepeatPause default 100;
+ end;
+
+(*
+{ TButtonImage }
+
+ TButtonImage = class(TObject)
+ private
+ FGlyph: TObject;
+ FButtonSize: TPoint;
+ FCaption: TCaption;
+ function GetNumGlyphs: TRxNumGlyphs;
+ procedure SetNumGlyphs(Value: TRxNumGlyphs);
+ function GetWordWrap: Boolean;
+ procedure SetWordWrap(Value: Boolean);
+ function GetAlignment: TAlignment;
+ procedure SetAlignment(Value: TAlignment);
+ function GetGlyph: TBitmap;
+ procedure SetGlyph(Value: TBitmap);
+ public
+ constructor Create;
+ destructor Destroy; override;
+ procedure Invalidate;
+{$IFDEF WIN32}
+ procedure DrawEx(Canvas: TCanvas; X, Y, Margin, Spacing: Integer;
+ Layout: TButtonLayout; AFont: TFont; Images: TImageList;
+ ImageIndex: Integer; Flags: Word);
+{$ENDIF}
+ procedure Draw(Canvas: TCanvas; X, Y, Margin, Spacing: Integer;
+ Layout: TButtonLayout; AFont: TFont; Flags: Word);
+ property Alignment: TAlignment read GetAlignment write SetAlignment;
+ property Caption: TCaption read FCaption write FCaption;
+ property Glyph: TBitmap read GetGlyph write SetGlyph;
+ property NumGlyphs: TRxNumGlyphs read GetNumGlyphs write SetNumGlyphs;
+ property ButtonSize: TPoint read FButtonSize write FButtonSize;
+ property WordWrap: Boolean read GetWordWrap write SetWordWrap;
+ end;
+
+{ TRxButtonGlyph }
+
+ TRxButtonGlyph = class
+ private
+ FOriginal: TBitmap;
+ FGlyphList: TImageList;
+ FIndexs: array[TRxButtonState] of Integer;
+ FTransparentColor: TColor;
+ FNumGlyphs: TRxNumGlyphs;
+ FWordWrap: Boolean;
+ FAlignment: TAlignment;
+ FOnChange: TNotifyEvent;
+ procedure GlyphChanged(Sender: TObject);
+ procedure SetGlyph(Value: TBitmap);
+ procedure SetNumGlyphs(Value: TRxNumGlyphs);
+ function MapColor(Color: TColor): TColor;
+ protected
+ procedure MinimizeCaption(Canvas: TCanvas; const Caption: string;
+ Buffer: PChar; MaxLen, Width: Integer);
+ function CreateButtonGlyph(State: TRxButtonState): Integer;
+{$IFDEF WIN32}
+ function CreateImageGlyph(State: TRxButtonState; Images: TImageList;
+ Index: Integer): Integer;
+{$ENDIF}
+ procedure CalcButtonLayout(Canvas: TCanvas; const Client: TRect;
+ var Caption: string; Layout: TButtonLayout; Margin, Spacing: Integer;
+ PopupMark: Boolean; var GlyphPos: TPoint; var TextBounds: TRect;
+ Flags: Word {$IFDEF WIN32}; Images: TImageList; ImageIndex: Integer
+ {$ENDIF});
+ public
+ constructor Create;
+ destructor Destroy; override;
+ procedure Invalidate;
+ function DrawButtonGlyph(Canvas: TCanvas; X, Y: Integer;
+ State: TRxButtonState): TPoint;
+{$IFDEF WIN32}
+ function DrawButtonImage(Canvas: TCanvas; X, Y: Integer; Images: TImageList;
+ ImageIndex: Integer; State: TRxButtonState): TPoint;
+ function DrawEx(Canvas: TCanvas; const Client: TRect; const Caption: string;
+ Layout: TButtonLayout; Margin, Spacing: Integer; PopupMark: Boolean;
+ Images: TImageList; ImageIndex: Integer; State: TRxButtonState;
+ Flags: Word): TRect;
+{$ENDIF}
+ procedure DrawButtonText(Canvas: TCanvas; const Caption: string;
+ TextBounds: TRect; State: TRxButtonState; Flags: Word);
+ procedure DrawPopupMark(Canvas: TCanvas; X, Y: Integer;
+ State: TRxButtonState);
+ function Draw(Canvas: TCanvas; const Client: TRect; const Caption: string;
+ Layout: TButtonLayout; Margin, Spacing: Integer; PopupMark: Boolean;
+ State: TRxButtonState; Flags: Word): TRect;
+ property Alignment: TAlignment read FAlignment write FAlignment;
+ property Glyph: TBitmap read FOriginal write SetGlyph;
+ property NumGlyphs: TRxNumGlyphs read FNumGlyphs write SetNumGlyphs;
+ property WordWrap: Boolean read FWordWrap write FWordWrap;
+ property OnChange: TNotifyEvent read FOnChange write FOnChange;
+ end;
+
+function DrawShadowText(DC: HDC; Str: PChar; Count: Integer; var Rect: TRect;
+ Format: Word; ShadowSize: Byte; ShadowColor: TColorRef;
+ ShadowPos: TShadowPosition): Integer;
+
+function CheckBitmap: TBitmap;
+*)
+
+type
+
+ { TRxDBRadioGroup }
+
+ { TRxRadioGroup }
+
+ TRxRadioGroup = class(TRadioGroup)
+ private
+ function GetItemEnabled(Index: integer): boolean;
+ procedure SetItemEnabled(Index: integer; AValue: boolean);
+ public
+ property ItemEnabled[Index: integer]: boolean read GetItemEnabled write SetItemEnabled;
+ end;
+
+implementation
+
+
+uses SysUtils, Dialogs, VCLUtils, Math, RxAppUtils, ImgList,
+ ActnList, InterfaceBase;
+const
+ Alignments: array [TAlignment] of Word = (DT_LEFT, DT_RIGHT, DT_CENTER);
+ WordWraps: array[Boolean] of Word = (0, DT_WORDBREAK);
+(*
+{ TTextListBox }
+
+procedure TTextListBox.SetHorizontalExtent;
+begin
+ SendMessage(Handle, LB_SETHORIZONTALEXTENT, FMaxWidth, 0);
+end;
+
+function TTextListBox.GetItemWidth(Index: Integer): Integer;
+var
+ ATabWidth: Longint;
+ S: string;
+begin
+ S := Items[Index] + 'x';
+ if TabWidth > 0 then begin
+ ATabWidth := Round((TabWidth * Canvas.TextWidth('0')) * 0.25);
+ Result := LoWord(GetTabbedTextExtent(Canvas.Handle, @S[1], Length(S),
+ 1, ATabWidth));
+ end
+ else Result := Canvas.TextWidth(S);
+end;
+
+procedure TTextListBox.ResetHorizontalExtent;
+var
+ I: Integer;
+begin
+ FMaxWidth := 0;
+ for I := 0 to Items.Count - 1 do
+ FMaxWidth := Max(FMaxWidth, GetItemWidth(I));
+ SetHorizontalExtent;
+end;
+
+{$IFNDEF WIN32}
+
+procedure TTextListBox.SetTabWidth(Value: Integer);
+begin
+ if Value < 0 then Value := 0;
+ if FTabWidth <> Value then begin
+ FTabWidth := Value;
+ RecreateWnd;
+ end;
+end;
+
+procedure TTextListBox.CreateParams(var Params: TCreateParams);
+const
+ TabStops: array[Boolean] of Longword = (0, LBS_USETABSTOPS);
+begin
+ inherited CreateParams(Params);
+ Params.Style := Params.Style or TabStops[FTabWidth <> 0];
+end;
+
+procedure TTextListBox.CreateWnd;
+begin
+ inherited CreateWnd;
+ if FTabWidth <> 0 then
+ SendMessage(Handle, LB_SETTABSTOPS, 1, Longint(@FTabWidth));
+end;
+
+{$ENDIF}
+
+procedure TTextListBox.WndProc(var Message: TMessage);
+begin
+ case Message.Msg of
+ LB_ADDSTRING, LB_INSERTSTRING:
+ begin
+ inherited WndProc(Message);
+ FMaxWidth := Max(FMaxWidth, GetItemWidth(Message.Result));
+ SetHorizontalExtent;
+ end;
+ LB_DELETESTRING:
+ begin
+ if GetItemWidth(Message.wParam) >= FMaxWidth then begin
+ Perform(WM_HSCROLL, SB_TOP, 0);
+ inherited WndProc(Message);
+ ResetHorizontalExtent;
+ end
+ else inherited WndProc(Message);
+ end;
+ LB_RESETCONTENT:
+ begin
+ FMaxWidth := 0;
+ SetHorizontalExtent;
+ Perform(WM_HSCROLL, SB_TOP, 0);
+ inherited WndProc(Message);
+ end;
+ WM_SETFONT:
+ begin
+ inherited WndProc(Message);
+ Canvas.Font.Assign(Self.Font);
+ ResetHorizontalExtent;
+ Exit;
+ end;
+ else inherited WndProc(Message);
+ end;
+end;
+
+{ TRxCustomListBox implementation copied from STDCTRLS.PAS and modified }
+
+{ TRxListBoxStrings }
+
+type
+ TRxListBoxStrings = class(TStrings)
+ private
+ ListBox: TRxCustomListBox;
+ protected
+{$IFNDEF RX_D3}
+ procedure Error(Msg: Word; Data: Integer);
+{$ENDIF}
+ function Get(Index: Integer): string; override;
+ function GetCount: Integer; override;
+ function GetObject(Index: Integer): TObject; override;
+ procedure PutObject(Index: Integer; AObject: TObject); override;
+ procedure SetUpdateState(Updating: Boolean); override;
+ public
+ function Add(const S: string): Integer; override;
+ procedure Clear; override;
+ procedure Delete(Index: Integer); override;
+ procedure Insert(Index: Integer; const S: string); override;
+ end;
+
+{$IFNDEF RX_D3}
+procedure TRxListBoxStrings.Error(Msg: Word; Data: Integer);
+
+{$IFDEF WIN32}
+ function ReturnAddr: Pointer;
+ asm
+ MOV EAX,[EBP+4]
+ end;
+{$ELSE}
+ function ReturnAddr: Pointer; assembler;
+ asm
+ MOV AX,[BP].Word[2]
+ MOV DX,[BP].Word[4]
+ end;
+{$ENDIF}
+
+begin
+ raise EStringListError.CreateFmt('%s: %d', [LoadStr(Msg),
+ Data]) at ReturnAddr;
+end;
+{$ENDIF}
+
+function TRxListBoxStrings.GetCount: Integer;
+begin
+ Result := SendMessage(ListBox.Handle, LB_GETCOUNT, 0, 0);
+end;
+
+function TRxListBoxStrings.Get(Index: Integer): string;
+var
+ Len: Integer;
+{$IFDEF WIN32}
+ Text: array[0..4095] of Char;
+{$ENDIF}
+begin
+ Len := SendMessage(ListBox.Handle, LB_GETTEXT, Index,
+ {$IFDEF WIN32} LongInt(@Text) {$ELSE} LongInt(@Result) {$ENDIF});
+ if Len < 0 then Error(SListIndexError, Index);
+{$IFDEF WIN32}
+ SetString(Result, Text, Len);
+{$ELSE}
+ System.Move(Result[0], Result[1], Len);
+ Result[0] := Char(Len);
+{$ENDIF}
+end;
+
+function TRxListBoxStrings.GetObject(Index: Integer): TObject;
+begin
+ Result := TObject(ListBox.GetItemData(Index));
+ if Longint(Result) = LB_ERR then Error(SListIndexError, Index);
+end;
+
+procedure TRxListBoxStrings.PutObject(Index: Integer; AObject: TObject);
+begin
+ ListBox.SetItemData(Index, LongInt(AObject));
+end;
+
+function TRxListBoxStrings.Add(const S: string): Integer;
+{$IFNDEF WIN32}
+var
+ Text: array[0..255] of Char;
+{$ENDIF}
+begin
+{$IFDEF WIN32}
+ Result := SendMessage(ListBox.Handle, LB_ADDSTRING, 0, LongInt(PChar(S)));
+{$ELSE}
+ Result := SendMessage(ListBox.Handle, LB_ADDSTRING, 0, LongInt(StrPCopy(Text, S)));
+{$ENDIF}
+ if Result < 0 then raise EOutOfResources.Create(ResStr(SInsertLineError));
+end;
+
+procedure TRxListBoxStrings.Insert(Index: Integer; const S: string);
+{$IFNDEF WIN32}
+var
+ Text: array[0..255] of Char;
+{$ENDIF}
+begin
+ if SendMessage(ListBox.Handle, LB_INSERTSTRING, Index,
+{$IFDEF WIN32}
+ Longint(PChar(S))) < 0 then
+{$ELSE}
+ Longint(StrPCopy(Text, S))) < 0 then
+{$ENDIF}
+ raise EOutOfResources.Create(ResStr(SInsertLineError));
+end;
+
+procedure TRxListBoxStrings.Delete(Index: Integer);
+begin
+ ListBox.DeleteString(Index);
+end;
+
+procedure TRxListBoxStrings.Clear;
+begin
+ ListBox.ResetContent;
+end;
+
+procedure TRxListBoxStrings.SetUpdateState(Updating: Boolean);
+begin
+ SendMessage(ListBox.Handle, WM_SETREDRAW, Ord(not Updating), 0);
+ if not Updating then ListBox.Refresh;
+end;
+
+{ TRxCustomListBox }
+
+procedure ListIndexError(Index: Integer);
+
+{$IFDEF WIN32}
+ function ReturnAddr: Pointer;
+ asm
+ MOV EAX,[EBP+4]
+ end;
+{$ELSE}
+ function ReturnAddr: Pointer; assembler;
+ asm
+ MOV AX,[BP].Word[2]
+ MOV DX,[BP].Word[4]
+ end;
+{$ENDIF}
+
+begin
+{$IFDEF RX_D3}
+ raise EStringListError.CreateFmt(SListIndexError, [Index]) at ReturnAddr;
+{$ELSE}
+ raise EStringListError.CreateFmt('%s: %d', [LoadStr(SListIndexError),
+ Index]) at ReturnAddr;
+{$ENDIF}
+end;
+
+constructor TRxCustomListBox.Create(AOwner: TComponent);
+const
+ ListBoxStyle = [csSetCaption, csDoubleClicks];
+begin
+ inherited Create(AOwner);
+{$IFDEF WIN32}
+ if NewStyleControls then ControlStyle := ListBoxStyle
+ else ControlStyle := ListBoxStyle + [csFramed];
+{$ELSE}
+ ControlStyle := ListBoxStyle + [csFramed];
+{$ENDIF}
+ Width := 121;
+ Height := 97;
+ TabStop := True;
+ ParentColor := False;
+ FItems := CreateItemList;
+ TRxListBoxStrings(FItems).ListBox := Self;
+ FCanvas := TControlCanvas.Create;
+ TControlCanvas(FCanvas).Control := Self;
+ FItemHeight := 16;
+ FBorderStyle := bsSingle;
+ FExtendedSelect := True;
+end;
+
+destructor TRxCustomListBox.Destroy;
+begin
+ inherited Destroy;
+ FCanvas.Free;
+ FItems.Free;
+ FSaveItems.Free;
+end;
+
+function TRxCustomListBox.CreateItemList: TStrings;
+begin
+ Result := TRxListBoxStrings.Create;
+end;
+
+function TRxCustomListBox.GetItemData(Index: Integer): LongInt;
+begin
+ Result := SendMessage(Handle, LB_GETITEMDATA, Index, 0);
+end;
+
+procedure TRxCustomListBox.SetItemData(Index: Integer; AData: LongInt);
+begin
+ SendMessage(Handle, LB_SETITEMDATA, Index, AData);
+end;
+
+procedure TRxCustomListBox.DeleteString(Index: Integer);
+begin
+ SendMessage(Handle, LB_DELETESTRING, Index, 0);
+end;
+
+procedure TRxCustomListBox.SetHorizontalExtent;
+begin
+ SendMessage(Handle, LB_SETHORIZONTALEXTENT, FMaxItemWidth, 0);
+end;
+
+function TRxCustomListBox.GetItemWidth(Index: Integer): Integer;
+var
+ ATabWidth: Longint;
+ S: string;
+begin
+ if (Style <> lbStandard) and Assigned(FOnGetItemWidth) and
+ Assigned(FOnDrawItem) then
+ begin
+ Result := 0;
+ FOnGetItemWidth(Self, Index, Result);
+ end
+ else begin
+ S := Items[Index] + 'x';
+ if TabWidth > 0 then begin
+ {if (FTabChar > #0) then
+ for I := 1 to Length(S) do
+ if S[I] = FTabChar then S[I] := #9;}
+ ATabWidth := Round((TabWidth * Canvas.TextWidth('0')) * 0.25);
+ Result := LoWord(GetTabbedTextExtent(Canvas.Handle, @S[1], Length(S),
+ 1, ATabWidth));
+ end
+ else Result := Canvas.TextWidth(S);
+ end;
+end;
+
+procedure TRxCustomListBox.ResetHorizontalExtent;
+var
+ I: Integer;
+begin
+ FMaxItemWidth := 0;
+ for I := 0 to Items.Count - 1 do
+ FMaxItemWidth := Max(FMaxItemWidth, GetItemWidth(I));
+ SetHorizontalExtent;
+end;
+
+procedure TRxCustomListBox.ResetContent;
+begin
+ SendMessage(Handle, LB_RESETCONTENT, 0, 0);
+end;
+
+procedure TRxCustomListBox.Clear;
+begin
+ FItems.Clear;
+end;
+
+procedure TRxCustomListBox.SetColumnWidth;
+begin
+ if FColumns > 0 then
+ SendMessage(Handle, LB_SETCOLUMNWIDTH, (Width + FColumns - 3) div
+ FColumns, 0);
+end;
+
+procedure TRxCustomListBox.SetColumns(Value: Integer);
+begin
+ if FColumns <> Value then
+ if (FColumns = 0) or (Value = 0) then begin
+ FColumns := Value;
+ RecreateWnd;
+ end
+ else begin
+ FColumns := Value;
+ if HandleAllocated then SetColumnWidth;
+ end;
+end;
+
+function TRxCustomListBox.GetItemIndex: Integer;
+begin
+ Result := SendMessage(Handle, LB_GETCURSEL, 0, 0);
+end;
+
+function TRxCustomListBox.GetSelCount: Integer;
+begin
+ Result := SendMessage(Handle, LB_GETSELCOUNT, 0, 0);
+end;
+
+procedure TRxCustomListBox.SetItemIndex(Value: Integer);
+begin
+ if GetItemIndex <> Value then
+ SendMessage(Handle, LB_SETCURSEL, Value, 0);
+end;
+
+procedure TRxCustomListBox.SetExtendedSelect(Value: Boolean);
+begin
+ if Value <> FExtendedSelect then begin
+ FExtendedSelect := Value;
+ RecreateWnd;
+ end;
+end;
+
+procedure TRxCustomListBox.SetIntegralHeight(Value: Boolean);
+begin
+ if Value <> FIntegralHeight then begin
+ FIntegralHeight := Value;
+ RecreateWnd;
+ end;
+end;
+
+function TRxCustomListBox.GetAutoScroll: Boolean;
+begin
+ Result := FAutoScroll and (Columns = 0);
+end;
+
+procedure TRxCustomListBox.SetOnDrawItem(Value: TDrawItemEvent);
+begin
+ if Assigned(FOnDrawItem) <> Assigned(Value) then begin
+ FOnDrawItem := Value;
+ Perform(WM_HSCROLL, SB_TOP, 0);
+ if HandleAllocated then
+ if AutoScroll then ResetHorizontalExtent
+ else SendMessage(Handle, LB_SETHORIZONTALEXTENT, 0, 0);
+ end
+ else FOnDrawItem := Value;
+end;
+
+procedure TRxCustomListBox.SetOnGetItemWidth(Value: TGetItemWidthEvent);
+begin
+ if Assigned(FOnGetItemWidth) <> Assigned(Value) then begin
+ FOnGetItemWidth := Value;
+ Perform(WM_HSCROLL, SB_TOP, 0);
+ if HandleAllocated then
+ if AutoScroll then ResetHorizontalExtent
+ else SendMessage(Handle, LB_SETHORIZONTALEXTENT, 0, 0);
+ end
+ else FOnGetItemWidth := Value;
+end;
+
+procedure TRxCustomListBox.SetAutoScroll(Value: Boolean);
+begin
+ if AutoScroll <> Value then begin
+ FAutoScroll := Value;
+ Perform(WM_HSCROLL, SB_TOP, 0);
+ if HandleAllocated then begin
+ if AutoScroll then ResetHorizontalExtent
+ else SendMessage(Handle, LB_SETHORIZONTALEXTENT, 0, 0);
+ end;
+ end;
+end;
+
+function TRxCustomListBox.GetItemHeight: Integer;
+var
+ R: TRect;
+begin
+ Result := FItemHeight;
+ if HandleAllocated and (FStyle = lbStandard) then begin
+ Perform(LB_GETITEMRECT, 0, Longint(@R));
+ Result := R.Bottom - R.Top;
+ end;
+end;
+
+procedure TRxCustomListBox.SetItemHeight(Value: Integer);
+begin
+ if (FItemHeight <> Value) and (Value > 0) then begin
+ FItemHeight := Value;
+ RecreateWnd;
+ end;
+end;
+
+procedure TRxCustomListBox.SetTabWidth(Value: Integer);
+begin
+ if Value < 0 then Value := 0;
+ if FTabWidth <> Value then begin
+ FTabWidth := Value;
+ RecreateWnd;
+ end;
+end;
+
+procedure TRxCustomListBox.SetMultiSelect(Value: Boolean);
+begin
+ if FMultiSelect <> Value then begin
+ FMultiSelect := Value;
+ RecreateWnd;
+ end;
+end;
+
+function TRxCustomListBox.GetSelected(Index: Integer): Boolean;
+var
+ R: Longint;
+begin
+ R := SendMessage(Handle, LB_GETSEL, Index, 0);
+ if R = LB_ERR then ListIndexError(Index);
+ Result := LongBool(R);
+end;
+
+procedure TRxCustomListBox.SetSelected(Index: Integer; Value: Boolean);
+begin
+ if MultiSelect then begin
+ if SendMessage(Handle, LB_SETSEL, Ord(Value), Index) = LB_ERR then
+ ListIndexError(Index);
+ end
+ else begin
+ if Value then SetItemIndex(Index)
+ else if (ItemIndex = Index) then SetItemIndex(-1);
+ end;
+end;
+
+procedure TRxCustomListBox.SetSorted(Value: Boolean);
+begin
+ if FSorted <> Value then begin
+ FSorted := Value;
+ RecreateWnd;
+ end;
+end;
+
+procedure TRxCustomListBox.SetStyle(Value: TListBoxStyle);
+begin
+ if FStyle <> Value then begin
+ FStyle := Value;
+ RecreateWnd;
+ end;
+end;
+
+function TRxCustomListBox.GetTopIndex: Integer;
+begin
+ Result := SendMessage(Handle, LB_GETTOPINDEX, 0, 0);
+end;
+
+procedure TRxCustomListBox.SetBorderStyle(Value: TBorderStyle);
+begin
+ if FBorderStyle <> Value then begin
+ FBorderStyle := Value;
+ RecreateWnd;
+ end;
+end;
+
+procedure TRxCustomListBox.SetTopIndex(Value: Integer);
+begin
+ if GetTopIndex <> Value then SendMessage(Handle, LB_SETTOPINDEX, Value, 0);
+end;
+
+procedure TRxCustomListBox.SetGraySelection(Value: Boolean);
+begin
+ if FGraySelection <> Value then begin
+ FGraySelection := Value;
+ if not Focused then Invalidate;
+ end;
+end;
+
+procedure TRxCustomListBox.SetItems(Value: TStrings);
+begin
+ Items.Assign(Value);
+end;
+
+function TRxCustomListBox.ItemAtPos(Pos: TPoint; Existing: Boolean): Integer;
+var
+ Count: Integer;
+ ItemRect: TRect;
+begin
+ if PtInRect(ClientRect, Pos) then begin
+ Result := TopIndex;
+ Count := Items.Count;
+ while Result < Count do begin
+ Perform(LB_GETITEMRECT, Result, Longint(@ItemRect));
+ if PtInRect(ItemRect, Pos) then Exit;
+ Inc(Result);
+ end;
+ if not Existing then Exit;
+ end;
+ Result := -1;
+end;
+
+function TRxCustomListBox.ItemRect(Index: Integer): TRect;
+var
+ Count: Integer;
+begin
+ Count := Items.Count;
+ if (Index = 0) or (Index < Count) then
+ Perform(LB_GETITEMRECT, Index, Longint(@Result))
+ else if Index = Count then begin
+ Perform(LB_GETITEMRECT, Index - 1, Longint(@Result));
+ OffsetRect(Result, 0, Result.Bottom - Result.Top);
+ end
+ else FillChar(Result, SizeOf(Result), 0);
+end;
+
+procedure TRxCustomListBox.CreateParams(var Params: TCreateParams);
+type
+ PSelects = ^TSelects;
+ TSelects = array[Boolean] of Longword;
+const
+ BorderStyles: array[TBorderStyle] of Longword = (0, WS_BORDER);
+ Styles: array[TListBoxStyle] of Longword =
+ (0, LBS_OWNERDRAWFIXED, LBS_OWNERDRAWVARIABLE
+ {$IFDEF RX_D6}, LBS_OWNERDRAWFIXED, LBS_OWNERDRAWFIXED{$ENDIF});
+ Sorteds: array[Boolean] of Longword = (0, LBS_SORT);
+ MultiSelects: array[Boolean] of Longword = (0, LBS_MULTIPLESEL);
+ ExtendSelects: array[Boolean] of Longword = (0, LBS_EXTENDEDSEL);
+ IntegralHeights: array[Boolean] of Longword = (LBS_NOINTEGRALHEIGHT, 0);
+ MultiColumns: array[Boolean] of Longword = (0, LBS_MULTICOLUMN);
+ TabStops: array[Boolean] of Longword = (0, LBS_USETABSTOPS);
+var
+ Selects: PSelects;
+begin
+ inherited CreateParams(Params);
+ CreateSubClass(Params, 'LISTBOX');
+ with Params do begin
+{$IFNDEF WIN32}
+ Inc(X); Inc(Y);
+ Dec(Width, 2); Dec(Height, 2);
+{$ENDIF}
+ Selects := @MultiSelects;
+ if FExtendedSelect then Selects := @ExtendSelects;
+ Style := Style or (WS_HSCROLL or WS_VSCROLL or LBS_HASSTRINGS or
+ LBS_NOTIFY) or Styles[FStyle] or Sorteds[FSorted] or
+ Selects^[FMultiSelect] or IntegralHeights[FIntegralHeight] or
+ MultiColumns[FColumns <> 0] or BorderStyles[FBorderStyle] or
+ TabStops[FTabWidth <> 0];
+{$IFDEF WIN32}
+ if NewStyleControls and Ctl3D and (FBorderStyle = bsSingle) then begin
+ Style := Style and not WS_BORDER;
+ ExStyle := ExStyle or WS_EX_CLIENTEDGE;
+ end;
+{$ENDIF}
+ WindowClass.Style := WindowClass.Style and not (CS_HREDRAW or CS_VREDRAW);
+ end;
+end;
+
+procedure TRxCustomListBox.CreateWnd;
+var
+ W, H: Integer;
+begin
+ W := Width;
+ H := Height;
+ inherited CreateWnd;
+ SetWindowPos(Handle, 0, Left, Top, W, H, SWP_NOZORDER or SWP_NOACTIVATE);
+ if FTabWidth <> 0 then
+ SendMessage(Handle, LB_SETTABSTOPS, 1, Longint(@FTabWidth));
+ SetColumnWidth;
+ if FSaveItems <> nil then begin
+ FItems.Assign(FSaveItems);
+ SetTopIndex(FSaveTopIndex);
+ SetItemIndex(FSaveItemIndex);
+ FSaveItems.Free;
+ FSaveItems := nil;
+ end;
+end;
+
+procedure TRxCustomListBox.DestroyWnd;
+begin
+ if FItems.Count > 0 then begin
+ FSaveItems := TStringList.Create;
+ FSaveItems.Assign(FItems);
+ FSaveTopIndex := GetTopIndex;
+ FSaveItemIndex := GetItemIndex;
+ end;
+ inherited DestroyWnd;
+end;
+
+procedure TRxCustomListBox.WndProc(var Message: TMessage);
+begin
+ if AutoScroll then begin
+ case Message.Msg of
+ LB_ADDSTRING, LB_INSERTSTRING:
+ begin
+ inherited WndProc(Message);
+ FMaxItemWidth := Max(FMaxItemWidth, GetItemWidth(Message.Result));
+ SetHorizontalExtent;
+ Exit;
+ end;
+ LB_DELETESTRING:
+ begin
+ if GetItemWidth(Message.wParam) >= FMaxItemWidth then begin
+ Perform(WM_HSCROLL, SB_TOP, 0);
+ inherited WndProc(Message);
+ ResetHorizontalExtent;
+ end
+ else inherited WndProc(Message);
+ Exit;
+ end;
+ LB_RESETCONTENT:
+ begin
+ FMaxItemWidth := 0;
+ SetHorizontalExtent;
+ Perform(WM_HSCROLL, SB_TOP, 0);
+ inherited WndProc(Message);
+ Exit;
+ end;
+ WM_SETFONT:
+ begin
+ inherited WndProc(Message);
+ Canvas.Font.Assign(Self.Font);
+ ResetHorizontalExtent;
+ Exit;
+ end;
+ end;
+ end;
+ {for auto drag mode, let listbox handle itself, instead of TControl}
+ if not (csDesigning in ComponentState) and ((Message.Msg = WM_LBUTTONDOWN) or
+ (Message.Msg = WM_LBUTTONDBLCLK)) and not Dragging then
+ begin
+ if DragMode = dmAutomatic then begin
+ if IsControlMouseMsg(TWMMouse(Message)) then Exit;
+ ControlState := ControlState + [csLButtonDown];
+ Dispatch(Message); {overrides TControl's BeginDrag}
+ Exit;
+ end;
+ end;
+ inherited WndProc(Message);
+end;
+
+procedure TRxCustomListBox.WMLButtonDown(var Message: TWMLButtonDown);
+var
+ ItemNo: Integer;
+ ShiftState: TShiftState;
+begin
+ ShiftState := KeysToShiftState(Message.Keys);
+ if (DragMode = dmAutomatic) and FMultiSelect then begin
+ if not (ssShift in ShiftState) or (ssCtrl in ShiftState) then begin
+ ItemNo := ItemAtPos(SmallPointToPoint(Message.Pos), True);
+ if (ItemNo >= 0) and (Selected[ItemNo]) then begin
+ BeginDrag(False);
+ Exit;
+ end;
+ end;
+ end;
+ inherited;
+ if (DragMode = dmAutomatic) and not (FMultiSelect and
+ ((ssCtrl in ShiftState) or (ssShift in ShiftState))) then
+ BeginDrag(False);
+end;
+
+procedure TRxCustomListBox.WMNCHitTest(var Msg: TWMNCHitTest);
+begin
+ if csDesigning in ComponentState then DefaultHandler(Msg)
+ else inherited;
+end;
+
+procedure TRxCustomListBox.CNCommand(var Message: TWMCommand);
+begin
+ case Message.NotifyCode of
+ LBN_SELCHANGE:
+ begin
+{$IFDEF RX_D3}
+ inherited Changed;
+{$ENDIF}
+ Click;
+ end;
+ LBN_DBLCLK: DblClick;
+ end;
+end;
+
+procedure TRxCustomListBox.WMPaint(var Message: TWMPaint);
+
+ procedure PaintListBox;
+ var
+ DrawItemMsg: TWMDrawItem;
+ MeasureItemMsg: TWMMeasureItem;
+ DrawItemStruct: TDrawItemStruct;
+ MeasureItemStruct: TMeasureItemStruct;
+ R: TRect;
+ Y, I, H, W: Integer;
+ begin
+ { Initialize drawing records }
+ DrawItemMsg.Msg := CN_DRAWITEM;
+ DrawItemMsg.DrawItemStruct := @DrawItemStruct;
+ DrawItemMsg.Ctl := Handle;
+ DrawItemStruct.CtlType := ODT_LISTBOX;
+ DrawItemStruct.itemAction := ODA_DRAWENTIRE;
+ DrawItemStruct.itemState := 0;
+ DrawItemStruct.hDC := Message.DC;
+ DrawItemStruct.CtlID := Handle;
+ DrawItemStruct.hwndItem := Handle;
+ { Intialize measure records }
+ MeasureItemMsg.Msg := CN_MEASUREITEM;
+ MeasureItemMsg.IDCtl := Handle;
+ MeasureItemMsg.MeasureItemStruct := @MeasureItemStruct;
+ MeasureItemStruct.CtlType := ODT_LISTBOX;
+ MeasureItemStruct.CtlID := Handle;
+ { Draw the listbox }
+ Y := 0;
+ I := TopIndex;
+ GetClipBox(Message.DC, R);
+ H := Height;
+ W := Width;
+ while Y < H do begin
+ MeasureItemStruct.itemID := I;
+ if I < Items.Count then
+ MeasureItemStruct.itemData := Longint(Pointer(Items.Objects[I]));
+ MeasureItemStruct.itemWidth := W;
+ MeasureItemStruct.itemHeight := FItemHeight;
+ DrawItemStruct.itemData := MeasureItemStruct.itemData;
+ DrawItemStruct.itemID := I;
+ Dispatch(MeasureItemMsg);
+ DrawItemStruct.rcItem := Rect(0, Y, MeasureItemStruct.itemWidth,
+ Y + Integer(MeasureItemStruct.itemHeight));
+ Dispatch(DrawItemMsg);
+ Inc(Y, MeasureItemStruct.itemHeight);
+ Inc(I);
+ if I >= Items.Count then break;
+ end;
+ end;
+
+begin
+ if Message.DC <> 0 then PaintListBox
+ else inherited;
+end;
+
+procedure TRxCustomListBox.WMSize(var Message: TWMSize);
+begin
+ inherited;
+ SetColumnWidth;
+end;
+
+procedure TRxCustomListBox.DragCanceled;
+var
+ M: TWMMouse;
+{$IFDEF WIN32}
+ MousePos: TPoint;
+{$ENDIF}
+begin
+ with M do begin
+ Msg := WM_LBUTTONDOWN;
+{$IFDEF WIN32}
+ GetCursorPos(MousePos);
+ Pos := PointToSmallPoint(ScreenToClient(MousePos));
+{$ELSE}
+ GetCursorPos(Pos);
+ Pos := ScreenToClient(Pos);
+{$ENDIF}
+ Keys := 0;
+ Result := 0;
+ end;
+ DefaultHandler(M);
+ M.Msg := WM_LBUTTONUP;
+ DefaultHandler(M);
+end;
+
+procedure TRxCustomListBox.DefaultDrawText(X, Y: Integer; const S: string);
+var
+ ATabWidth: Longint;
+begin
+{$IFDEF RX_D4}
+ TControlCanvas(FCanvas).UpdateTextFlags;
+{$ENDIF}
+ if FTabWidth = 0 then FCanvas.TextOut(X, Y, S)
+ else begin
+ ATabWidth := Round((TabWidth * Canvas.TextWidth('0')) * 0.25);
+ TabbedTextOut(FCanvas.Handle, X, Y, @S[1], Length(S), 1, ATabWidth, X);
+ end;
+end;
+
+procedure TRxCustomListBox.DrawItem(Index: Integer; Rect: TRect;
+ State: TOwnerDrawState);
+begin
+ if Assigned(FOnDrawItem) then FOnDrawItem(Self, Index, Rect, State)
+ else begin
+ FCanvas.FillRect(Rect);
+ if Index < Items.Count then begin
+{$IFDEF RX_D4}
+ if not UseRightToLeftAlignment then Inc(Rect.Left, 2)
+ else Dec(Rect.Right, 2);
+{$ELSE}
+ Inc(Rect.Left, 2);
+{$ENDIF}
+ DefaultDrawText(Rect.Left, Max(Rect.Top, (Rect.Bottom +
+ Rect.Top - Canvas.TextHeight('Wy')) div 2), Items[Index]);
+ end;
+ end;
+end;
+
+procedure TRxCustomListBox.MeasureItem(Index: Integer; var Height: Integer);
+begin
+ if Assigned(FOnMeasureItem) then FOnMeasureItem(Self, Index, Height)
+end;
+
+procedure TRxCustomListBox.CNDrawItem(var Message: TWMDrawItem);
+var
+ State: TOwnerDrawState;
+begin
+ with Message.DrawItemStruct^ do begin
+{$IFDEF WIN32}
+ {$IFDEF RX_D5}
+ State := TOwnerDrawState(LongRec(itemState).Lo);
+ {$ELSE}
+ State := TOwnerDrawState(WordRec(LongRec(itemState).Lo).Lo);
+ {$ENDIF}
+{$ELSE}
+ State := TOwnerDrawState(WordRec(itemState).Lo);
+{$ENDIF}
+ FCanvas.Handle := hDC;
+ FCanvas.Font := Font;
+ FCanvas.Brush := Brush;
+ if (Integer(itemID) >= 0) and (odSelected in State) then begin
+ with FCanvas do
+ if not (csDesigning in ComponentState) and FGraySelection and
+ not Focused then
+ begin
+ Brush.Color := clBtnFace;
+ if ColorToRGB(Font.Color) = ColorToRGB(clBtnFace) then
+ Font.Color := clBtnText;
+ end
+ else begin
+ Brush.Color := clHighlight;
+ Font.Color := clHighlightText
+ end;
+ end;
+ if Integer(itemID) >= 0 then DrawItem(itemID, rcItem, State)
+ else FCanvas.FillRect(rcItem);
+ if odFocused in State then DrawFocusRect(hDC, rcItem);
+ FCanvas.Handle := 0;
+ end;
+end;
+
+procedure TRxCustomListBox.CNMeasureItem(var Message: TWMMeasureItem);
+begin
+ with Message.MeasureItemStruct^ do begin
+ itemHeight := FItemHeight;
+ if FStyle = lbOwnerDrawVariable then
+ MeasureItem(itemID, Integer(itemHeight));
+ end;
+end;
+
+procedure TRxCustomListBox.WMKillFocus(var Msg: TWMKillFocus);
+begin
+ inherited;
+ if FGraySelection and MultiSelect and (SelCount > 1) then Invalidate;
+end;
+
+procedure TRxCustomListBox.WMSetFocus(var Msg: TWMSetFocus);
+begin
+ inherited;
+ if FGraySelection and MultiSelect and (SelCount > 1) then Invalidate;
+end;
+
+{$IFDEF WIN32}
+procedure TRxCustomListBox.CMCtl3DChanged(var Message: TMessage);
+begin
+ if NewStyleControls and (FBorderStyle = bsSingle) then RecreateWnd;
+ inherited;
+end;
+{$ENDIF}
+
+{ TCheckListBoxItem }
+
+type
+ TCheckListBoxItem = class
+ private
+ FData: LongInt;
+ FState: TCheckBoxState;
+ FEnabled: Boolean;
+ function GetChecked: Boolean;
+ public
+ constructor Create;
+ property Checked: Boolean read GetChecked;
+ property Enabled: Boolean read FEnabled write FEnabled;
+ property State: TCheckBoxState read FState write FState;
+ end;
+
+constructor TCheckListBoxItem.Create;
+begin
+ inherited Create;
+ FState := clbDefaultState;
+ FEnabled := clbDefaultEnabled;
+end;
+
+function TCheckListBoxItem.GetChecked: Boolean;
+begin
+ Result := FState = cbChecked;
+end;
+
+{ TCheckListBoxStrings }
+
+type
+ TCheckListBoxStrings = class(TRxListBoxStrings)
+ public
+ procedure Exchange(Index1, Index2: Integer); override;
+ procedure Move(CurIndex, NewIndex: Integer); override;
+ end;
+
+procedure TCheckListBoxStrings.Exchange(Index1, Index2: Integer);
+var
+ TempEnabled1, TempEnabled2: Boolean;
+ TempState1, TempState2: TCheckBoxState;
+begin
+ with TRxCheckListBox(ListBox) do begin
+ TempState1 := State[Index1];
+ TempEnabled1 := EnabledItem[Index1];
+ TempState2 := State[Index2];
+ TempEnabled2 := EnabledItem[Index2];
+ inherited Exchange(Index1, Index2);
+ State[Index1] := TempState2;
+ EnabledItem[Index1] := TempEnabled2;
+ State[Index2] := TempState1;
+ EnabledItem[Index2] := TempEnabled1;
+ end;
+end;
+
+procedure TCheckListBoxStrings.Move(CurIndex, NewIndex: Integer);
+var
+ TempEnabled: Boolean;
+ TempState: TCheckBoxState;
+begin
+ with TRxCheckListBox(ListBox) do begin
+ TempState := State[CurIndex];
+ TempEnabled := EnabledItem[CurIndex];
+ inherited Move(CurIndex, NewIndex);
+ State[NewIndex] := TempState;
+ EnabledItem[NewIndex] := TempEnabled;
+ end;
+end;
+
+{ TRxCheckListBox }
+
+const
+ FCheckBitmap: TBitmap = nil;
+
+function CheckBitmap: TBitmap;
+begin
+ if FCheckBitmap = nil then begin
+ FCheckBitmap := TBitmap.Create;
+ FCheckBitmap.Handle := LoadBitmap(hInstance, 'CHECK_IMAGES');
+ end;
+ Result := FCheckBitmap;
+end;
+
+procedure DestroyLocals; far;
+begin
+ if FCheckBitmap <> nil then begin
+ FCheckBitmap.Free;
+ FCheckBitmap := nil;
+ end;
+end;
+
+const
+ InternalVersion = 202; { for backward compatibility only }
+
+constructor TRxCheckListBox.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FAutoScroll := True;
+ with CheckBitmap do begin
+ FCheckWidth := Width div 6;
+ FCheckHeight := Height div 3;
+ end;
+ FDrawBitmap := TBitmap.Create;
+ with FDrawBitmap do begin
+ Width := FCheckWidth;
+ Height := FCheckHeight;
+ end;
+ FIniLink := TIniLink.Create;
+ FIniLink.OnSave := IniSave;
+ FIniLink.OnLoad := IniLoad;
+end;
+
+destructor TRxCheckListBox.Destroy;
+begin
+ FSaveStates.Free;
+ FSaveStates := nil;
+ FDrawBitmap.Free;
+ FDrawBitmap := nil;
+ FIniLink.Free;
+ inherited Destroy;
+end;
+
+procedure TRxCheckListBox.Loaded;
+begin
+ inherited Loaded;
+ UpdateCheckStates;
+end;
+
+function TRxCheckListBox.CreateItemList: TStrings;
+begin
+ Result := TCheckListBoxStrings.Create;
+end;
+
+const
+ sCount = 'Count';
+ sItem = 'Item';
+
+procedure TRxCheckListBox.InternalSaveStates(IniFile: TObject;
+ const Section: string);
+var
+ I: Integer;
+begin
+ IniEraseSection(IniFile, Section);
+ IniWriteInteger(IniFile, Section, sCount, Items.Count);
+ for I := 0 to Items.Count - 1 do
+ IniWriteInteger(IniFile, Section, sItem + IntToStr(I), Integer(State[I]));
+end;
+
+procedure TRxCheckListBox.InternalRestoreStates(IniFile: TObject;
+ const Section: string);
+var
+ I: Integer;
+ ACount: Integer;
+begin
+ ACount := Min(IniReadInteger(IniFile, Section, sCount, 0), Items.Count);
+ for I := 0 to ACount - 1 do begin
+ State[I] := TCheckBoxState(IniReadInteger(IniFile, Section,
+ sItem + IntToStr(I), Integer(clbDefaultState)));
+ if (State[I] = cbChecked) and (FCheckKind = ckRadioButtons) then Exit;
+ end;
+end;
+
+{$IFDEF WIN32}
+procedure TRxCheckListBox.SaveStatesReg(IniFile: TRegIniFile);
+begin
+ InternalSaveStates(IniFile, GetDefaultSection(Self));
+end;
+
+procedure TRxCheckListBox.RestoreStatesReg(IniFile: TRegIniFile);
+begin
+ InternalRestoreStates(IniFile, GetDefaultSection(Self));
+end;
+{$ENDIF WIN32}
+
+procedure TRxCheckListBox.SaveStates(IniFile: TIniFile);
+begin
+ InternalSaveStates(IniFile, GetDefaultSection(Self));
+end;
+
+procedure TRxCheckListBox.RestoreStates(IniFile: TIniFile);
+begin
+ InternalRestoreStates(IniFile, GetDefaultSection(Self));
+end;
+
+function TRxCheckListBox.GetStorage: TFormPlacement;
+begin
+ Result := FIniLink.Storage;
+end;
+
+procedure TRxCheckListBox.SetStorage(Value: TFormPlacement);
+begin
+ FIniLink.Storage := Value;
+end;
+
+procedure TRxCheckListBox.IniSave(Sender: TObject);
+begin
+ if (Name <> '') and (FIniLink.IniObject <> nil) then
+ InternalSaveStates(FIniLink.IniObject, FIniLink.RootSection +
+ GetDefaultSection(Self));
+end;
+
+procedure TRxCheckListBox.IniLoad(Sender: TObject);
+begin
+ if (Name <> '') and (FIniLink.IniObject <> nil) then
+ InternalRestoreStates(FIniLink.IniObject, FIniLink.RootSection +
+ GetDefaultSection(Self));
+end;
+
+procedure TRxCheckListBox.ReadCheckData(Reader: TReader);
+var
+ I: Integer;
+begin
+ Items.BeginUpdate;
+ try
+ Reader.ReadListBegin;
+ Clear;
+ while not Reader.EndOfList do begin
+ I := Items.Add(Reader.ReadString);
+ if FReserved >= InternalVersion then begin
+ State[I] := TCheckBoxState(Reader.ReadInteger);
+ EnabledItem[I] := Reader.ReadBoolean;
+ end
+ else begin { for backward compatibility only }
+ Checked[I] := Reader.ReadBoolean;
+ EnabledItem[I] := Reader.ReadBoolean;
+ if FReserved > 0 then
+ State[I] := TCheckBoxState(Reader.ReadInteger);
+ end;
+ end;
+ Reader.ReadListEnd;
+ UpdateCheckStates;
+ finally
+ Items.EndUpdate;
+ end;
+end;
+
+procedure TRxCheckListBox.WriteCheckData(Writer: TWriter);
+var
+ I: Integer;
+begin
+ with Writer do begin
+ WriteListBegin;
+ for I := 0 to Items.Count - 1 do begin
+ WriteString(Items[I]);
+ WriteInteger(Integer(Self.State[I]));
+ WriteBoolean(EnabledItem[I]);
+ end;
+ WriteListEnd;
+ end;
+end;
+
+procedure TRxCheckListBox.ReadVersion(Reader: TReader);
+begin
+ FReserved := Reader.ReadInteger;
+end;
+
+procedure TRxCheckListBox.WriteVersion(Writer: TWriter);
+begin
+ Writer.WriteInteger(InternalVersion);
+end;
+
+procedure TRxCheckListBox.DefineProperties(Filer: TFiler);
+
+{$IFDEF WIN32}
+ function DoWrite: Boolean;
+ var
+ I: Integer;
+ Ancestor: TRxCheckListBox;
+ begin
+ Result := False;
+ Ancestor := TRxCheckListBox(Filer.Ancestor);
+ if (Ancestor <> nil) and (Ancestor.Items.Count = Items.Count) and
+ (Ancestor.Items.Count > 0) then
+ for I := 1 to Items.Count - 1 do begin
+ Result := (CompareText(Items[I], Ancestor.Items[I]) <> 0) or
+ (State[I] <> Ancestor.State[I]) or
+ (EnabledItem[I] <> Ancestor.EnabledItem[I]);
+ if Result then Break;
+ end
+ else Result := Items.Count > 0;
+ end;
+{$ENDIF}
+
+begin
+ inherited DefineProperties(Filer);
+ Filer.DefineProperty('InternalVersion', ReadVersion, WriteVersion,
+ {$IFDEF WIN32} Filer.Ancestor = nil {$ELSE} True {$ENDIF});
+ Filer.DefineProperty('Strings', ReadCheckData, WriteCheckData,
+ {$IFDEF WIN32} DoWrite {$ELSE} Items.Count > 0 {$ENDIF});
+end;
+
+procedure TRxCheckListBox.CreateWnd;
+begin
+ inherited CreateWnd;
+ if FSaveStates <> nil then begin
+ FSaveStates.Free;
+ FSaveStates := nil;
+ end;
+ ResetItemHeight;
+end;
+
+procedure TRxCheckListBox.DestroyWnd;
+begin
+ inherited DestroyWnd;
+end;
+
+procedure TRxCheckListBox.WMDestroy(var Msg: TWMDestroy);
+var
+ I: Integer;
+begin
+ if Items.Count > 0 then begin
+ if FSaveStates <> nil then FSaveStates.Clear
+ else FSaveStates := TList.Create;
+ for I := 0 to Items.Count - 1 do begin
+ FSaveStates.Add(TObject(MakeLong(Ord(EnabledItem[I]), Word(State[I]))));
+ FindCheckObject(I).Free;
+ end;
+ end;
+ inherited;
+end;
+
+procedure TRxCheckListBox.CreateParams(var Params: TCreateParams);
+begin
+ inherited CreateParams(Params);
+ with Params do
+ if Style and (LBS_OWNERDRAWFIXED or LBS_OWNERDRAWVARIABLE) = 0 then
+ Style := Style or LBS_OWNERDRAWFIXED;
+end;
+
+procedure TRxCheckListBox.SetItems(Value: TStrings);
+var
+ I: Integer;
+begin
+ Items.BeginUpdate;
+ try
+ inherited SetItems(Value);
+ if (Value <> nil) and (Value is TRxListBoxStrings) and
+ (TRxListBoxStrings(Value).ListBox <> nil) and
+ (TRxListBoxStrings(Value).ListBox is TRxCheckListBox) then
+ begin
+ for I := 0 to Items.Count - 1 do
+ if I < Value.Count then begin
+ Self.State[I] := TRxCheckListBox(TRxListBoxStrings(Value).ListBox).State[I];
+ EnabledItem[I] := TRxCheckListBox(TRxListBoxStrings(Value).ListBox).EnabledItem[I];
+ end;
+ end;
+ finally
+ Items.EndUpdate;
+ end;
+end;
+
+function TRxCheckListBox.GetItemWidth(Index: Integer): Integer;
+begin
+ Result := inherited GetItemWidth(Index) + GetCheckWidth;
+end;
+
+function TRxCheckListBox.GetCheckWidth: Integer;
+begin
+ Result := FCheckWidth + 2;
+end;
+
+function TRxCheckListBox.GetAllowGrayed: Boolean;
+begin
+ Result := FAllowGrayed and (FCheckKind in [ckCheckBoxes, ckCheckMarks]);
+end;
+
+procedure TRxCheckListBox.CMFontChanged(var Message: TMessage);
+begin
+ inherited;
+ ResetItemHeight;
+end;
+
+function TRxCheckListBox.GetItemHeight: Integer;
+var
+ R: TRect;
+begin
+ Result := FItemHeight;
+ if HandleAllocated and ((FStyle = lbStandard) or
+ ((FStyle = lbOwnerDrawFixed) and not Assigned(FOnDrawItem))) then
+ begin
+ Perform(LB_GETITEMRECT, 0, Longint(@R));
+ Result := R.Bottom - R.Top;
+ end;
+end;
+
+procedure TRxCheckListBox.ResetItemHeight;
+var
+ H: Integer;
+begin
+ if (Style = lbStandard) or ((Style = lbOwnerDrawFixed) and
+ not Assigned(FOnDrawItem)) then
+ begin
+ Canvas.Font := Font;
+ H := Max(Canvas.TextHeight('Wg'), FCheckHeight);
+ if Style = lbOwnerDrawFixed then H := Max(H, FItemHeight);
+ Perform(LB_SETITEMHEIGHT, 0, H);
+ if (H * Items.Count) <= ClientHeight then
+ SetScrollRange(Handle, SB_VERT, 0, 0, True);
+ end;
+end;
+
+procedure TRxCheckListBox.DrawItem(Index: Integer; Rect: TRect;
+ State: TOwnerDrawState);
+var
+ R: TRect;
+ SaveEvent: TDrawItemEvent;
+begin
+ if Index < Items.Count then begin
+ R := Rect;
+{$IFDEF RX_D4}
+ if not UseRightToLeftAlignment then begin
+ R.Right := Rect.Left;
+ R.Left := R.Right - GetCheckWidth;
+ end
+ else
+ begin
+ R.Left := Rect.Right;
+ R.Right := R.Left + GetCheckWidth;
+ end;
+{$ELSE}
+ R.Right := Rect.Left;
+ R.Left := R.Right - GetCheckWidth;
+{$ENDIF}
+ DrawCheck(R, GetState(Index), EnabledItem[Index]);
+ if not EnabledItem[Index] then
+ if odSelected in State then Canvas.Font.Color := clInactiveCaptionText
+ else Canvas.Font.Color := clGrayText;
+ end;
+ if (Style = lbStandard) and Assigned(FOnDrawItem) then begin
+ SaveEvent := OnDrawItem;
+ OnDrawItem := nil;
+ try
+ inherited DrawItem(Index, Rect, State);
+ finally
+ OnDrawItem := SaveEvent;
+ end;
+ end
+ else inherited DrawItem(Index, Rect, State);
+end;
+
+procedure TRxCheckListBox.CNDrawItem(var Message: TWMDrawItem);
+begin
+ with Message.DrawItemStruct^ do
+{$IFDEF RX_D4}
+ if not UseRightToLeftAlignment then
+ rcItem.Left := rcItem.Left + GetCheckWidth
+ else
+ rcItem.Right := rcItem.Right - GetCheckWidth;
+{$ELSE}
+ rcItem.Left := rcItem.Left + GetCheckWidth;
+{$ENDIF}
+ inherited;
+end;
+
+procedure TRxCheckListBox.DrawCheck(R: TRect; AState: TCheckBoxState;
+ Enabled: Boolean);
+const
+ CheckImages: array[TCheckBoxState, TCheckKind, Boolean] of Integer =
+ (((3, 0), (9, 6), (15, 12)), { unchecked }
+ ((4, 1), (10, 7), (16, 13)), { checked }
+ ((5, 2), (11, 8), (17, 14))); { grayed }
+var
+ DrawRect: TRect;
+ SaveColor: TColor;
+begin
+ DrawRect.Left := R.Left + (R.Right - R.Left - FCheckWidth) div 2;
+ DrawRect.Top := R.Top + (R.Bottom - R.Top - FCheckHeight) div 2;
+ DrawRect.Right := DrawRect.Left + FCheckWidth;
+ DrawRect.Bottom := DrawRect.Top + FCheckHeight;
+ SaveColor := Canvas.Brush.Color;
+ AssignBitmapCell(CheckBitmap, FDrawBitmap, 6, 3,
+ CheckImages[AState, FCheckKind, Enabled]);
+ Canvas.Brush.Color := Self.Color;
+ try
+ Canvas.BrushCopy(DrawRect, FDrawBitmap, Bounds(0, 0, FCheckWidth,
+ FCheckHeight), CheckBitmap.TransparentColor and not PaletteMask);
+ finally
+ Canvas.Brush.Color := SaveColor;
+ end;
+end;
+
+procedure TRxCheckListBox.ApplyState(AState: TCheckBoxState;
+ EnabledOnly: Boolean);
+var
+ I: Integer;
+begin
+ if FCheckKind in [ckCheckBoxes, ckCheckMarks] then
+ for I := 0 to Items.Count - 1 do
+ if not EnabledOnly or EnabledItem[I] then begin
+ State[I] := AState;
+ end;
+end;
+
+function TRxCheckListBox.GetCheckedIndex: Integer;
+var
+ I: Integer;
+begin
+ Result := -1;
+ if FCheckKind = ckRadioButtons then
+ for I := 0 to Items.Count - 1 do
+ if State[I] = cbChecked then begin
+ Result := I;
+ Exit;
+ end;
+end;
+
+procedure TRxCheckListBox.SetCheckedIndex(Value: Integer);
+begin
+ if (FCheckKind = ckRadioButtons) and (Items.Count > 0) then
+ SetState(Max(Value, 0), cbChecked);
+end;
+
+procedure TRxCheckListBox.UpdateCheckStates;
+begin
+ if (FCheckKind = ckRadioButtons) and (Items.Count > 0) then begin
+ FInUpdateStates := True;
+ try
+ SetState(Max(GetCheckedIndex, 0), cbChecked);
+ finally
+ FInUpdateStates := False;
+ end;
+ end;
+end;
+
+procedure TRxCheckListBox.SetCheckKind(Value: TCheckKind);
+begin
+ if FCheckKind <> Value then begin
+ FCheckKind := Value;
+ UpdateCheckStates;
+ Invalidate;
+ end;
+end;
+
+procedure TRxCheckListBox.SetChecked(Index: Integer; AChecked: Boolean);
+const
+ CheckStates: array[Boolean] of TCheckBoxState = (cbUnchecked, cbChecked);
+begin
+ SetState(Index, CheckStates[AChecked]);
+end;
+
+procedure TRxCheckListBox.SetState(Index: Integer; AState: TCheckBoxState);
+var
+ I: Integer;
+begin
+ if (AState <> GetState(Index)) or FInUpdateStates then begin
+ if (FCheckKind = ckRadioButtons) and (AState = cbUnchecked) and
+ (GetCheckedIndex = Index) then Exit;
+ TCheckListBoxItem(GetCheckObject(Index)).State := AState;
+ if (FCheckKind = ckRadioButtons) and (AState = cbChecked) then
+ for I := Items.Count - 1 downto 0 do begin
+ if (I <> Index) and (GetState(I) = cbChecked) then begin
+ TCheckListBoxItem(GetCheckObject(I)).State := cbUnchecked;
+ InvalidateCheck(I);
+ end;
+ end;
+ InvalidateCheck(Index);
+ if not (csReading in ComponentState) then ChangeItemState(Index);
+ end;
+end;
+
+procedure TRxCheckListBox.SetItemEnabled(Index: Integer; Value: Boolean);
+begin
+ if Value <> GetItemEnabled(Index) then begin
+ TCheckListBoxItem(GetCheckObject(Index)).Enabled := Value;
+ InvalidateItem(Index);
+ end;
+end;
+
+procedure TRxCheckListBox.InvalidateCheck(Index: Integer);
+var
+ R: TRect;
+begin
+ R := ItemRect(Index);
+{$IFDEF RX_D4}
+ if not UseRightToLeftAlignment then R.Right := R.Left + GetCheckWidth
+ else R.Left := R.Right - GetCheckWidth;
+{$ELSE}
+ R.Right := R.Left + GetCheckWidth;
+{$ENDIF}
+ InvalidateRect(Handle, @R, not (csOpaque in ControlStyle));
+ UpdateWindow(Handle);
+end;
+
+procedure TRxCheckListBox.InvalidateItem(Index: Integer);
+var
+ R: TRect;
+begin
+ R := ItemRect(Index);
+ InvalidateRect(Handle, @R, not (csOpaque in ControlStyle));
+ UpdateWindow(Handle);
+end;
+
+function TRxCheckListBox.GetChecked(Index: Integer): Boolean;
+begin
+ if IsCheckObject(Index) then
+ Result := TCheckListBoxItem(GetCheckObject(Index)).GetChecked
+ else Result := False;
+end;
+
+function TRxCheckListBox.GetState(Index: Integer): TCheckBoxState;
+begin
+ if IsCheckObject(Index) then
+ Result := TCheckListBoxItem(GetCheckObject(Index)).State
+ else Result := clbDefaultState;
+ if (FCheckKind = ckRadioButtons) and (Result <> cbChecked) then
+ Result := cbUnchecked;
+end;
+
+function TRxCheckListBox.GetItemEnabled(Index: Integer): Boolean;
+begin
+ if IsCheckObject(Index) then
+ Result := TCheckListBoxItem(GetCheckObject(Index)).Enabled
+ else Result := clbDefaultEnabled;
+end;
+
+procedure TRxCheckListBox.KeyPress(var Key: Char);
+begin
+ inherited KeyPress(Key);
+ case Key of
+ ' ':
+ begin
+ ToggleClickCheck(ItemIndex);
+ Key := #0;
+ end;
+ '+':
+ begin
+ ApplyState(cbChecked, True);
+ ClickCheck;
+ end;
+ '-':
+ begin
+ ApplyState(cbUnchecked, True);
+ ClickCheck;
+ end;
+ end;
+end;
+
+procedure TRxCheckListBox.MouseDown(Button: TMouseButton; Shift: TShiftState;
+ X, Y: Integer);
+var
+ Index: Integer;
+begin
+ inherited MouseDown(Button, Shift, X, Y);
+ if Button = mbLeft then begin
+ Index := ItemAtPos(Point(X,Y), True);
+ if (Index <> -1) then begin
+{$IFDEF RX_D4}
+ if not UseRightToLeftAlignment then begin
+ if X - ItemRect(Index).Left < GetCheckWidth then
+ ToggleClickCheck(Index);
+ end
+ else begin
+ Dec(X, ItemRect(Index).Right - GetCheckWidth);
+ if (X > 0) and (X < GetCheckWidth) then
+ ToggleClickCheck(Index);
+ end;
+{$ELSE}
+ if X - ItemRect(Index).Left < GetCheckWidth then
+ ToggleClickCheck(Index);
+{$ENDIF}
+ end;
+ end;
+end;
+
+procedure TRxCheckListBox.ToggleClickCheck(Index: Integer);
+var
+ State: TCheckBoxState;
+begin
+ if (Index >= 0) and (Index < Items.Count) and EnabledItem[Index] then begin
+ State := Self.State[Index];
+ case State of
+ cbUnchecked:
+ if AllowGrayed then State := cbGrayed else State := cbChecked;
+ cbChecked: State := cbUnchecked;
+ cbGrayed: State := cbChecked;
+ end;
+ Self.State[Index] := State;
+ ClickCheck;
+ end;
+end;
+
+procedure TRxCheckListBox.ChangeItemState(Index: Integer);
+begin
+ if Assigned(FOnStateChange) then FOnStateChange(Self, Index);
+end;
+
+procedure TRxCheckListBox.ClickCheck;
+begin
+ if Assigned(FOnClickCheck) then FOnClickCheck(Self);
+end;
+
+function TRxCheckListBox.GetItemData(Index: Integer): LongInt;
+var
+ Item: TCheckListBoxItem;
+begin
+ Result := 0;
+ if IsCheckObject(Index) then begin
+ Item := TCheckListBoxItem(GetCheckObject(Index));
+ if Item <> nil then Result := Item.FData;
+ end;
+end;
+
+function TRxCheckListBox.GetCheckObject(Index: Integer): TObject;
+begin
+ Result := FindCheckObject(Index);
+ if Result = nil then Result := CreateCheckObject(Index);
+end;
+
+function TRxCheckListBox.FindCheckObject(Index: Integer): TObject;
+var
+ ItemData: Longint;
+begin
+ Result := nil;
+ ItemData := inherited GetItemData(Index);
+ if ItemData = LB_ERR then ListIndexError(Index)
+ else begin
+ Result := TCheckListBoxItem(ItemData);
+ if not (Result is TCheckListBoxItem) then Result := nil;
+ end;
+end;
+
+function TRxCheckListBox.CreateCheckObject(Index: Integer): TObject;
+begin
+ Result := TCheckListBoxItem.Create;
+ inherited SetItemData(Index, LongInt(Result));
+end;
+
+function TRxCheckListBox.IsCheckObject(Index: Integer): Boolean;
+begin
+ Result := FindCheckObject(Index) <> nil;
+end;
+
+procedure TRxCheckListBox.SetItemData(Index: Integer; AData: LongInt);
+var
+ Item: TCheckListBoxItem;
+ L: Longint;
+begin
+ Item := TCheckListBoxItem(GetCheckObject(Index));
+ Item.FData := AData;
+ if (FSaveStates <> nil) and (FSaveStates.Count > 0) then begin
+ L := Longint(Pointer(FSaveStates[0]));
+ Item.FState := TCheckBoxState(LongRec(L).Hi);
+ Item.FEnabled := LongRec(L).Lo <> 0;
+ FSaveStates.Delete(0);
+ end;
+end;
+
+procedure TRxCheckListBox.ResetContent;
+var
+ I: Integer;
+begin
+ for I := Items.Count - 1 downto 0 do begin
+ if IsCheckObject(I) then GetCheckObject(I).Free;
+ inherited SetItemData(I, 0);
+ end;
+ inherited ResetContent;
+end;
+
+procedure TRxCheckListBox.DeleteString(Index: Integer);
+begin
+ if IsCheckObject(Index) then GetCheckObject(Index).Free;
+ inherited SetItemData(Index, 0);
+ inherited DeleteString(Index);
+end;
+*)
+{ TRxCustomLabel }
+
+function DrawShadowText(DC: HDC; Str: PChar; Count: Integer; var Rect: TRect;
+ Format: Word; ShadowSize: Byte; ShadowColor: TColorRef;
+ ShadowPos: TShadowPosition): Integer;
+var
+ RText, RShadow: TRect;
+ Color: TColorRef;
+begin
+ RText := Rect;
+ RShadow := Rect;
+ Color := SetTextColor(DC, ShadowColor);
+ case ShadowPos of
+ spLeftTop: OffsetRect(RShadow, -ShadowSize, -ShadowSize);
+ spRightBottom: OffsetRect(RShadow, ShadowSize, ShadowSize);
+ spLeftBottom:
+ begin
+ {OffsetRect(RText, ShadowSize, 0);}
+ OffsetRect(RShadow, -ShadowSize, ShadowSize);
+ end;
+ spRightTop:
+ begin
+ {OffsetRect(RText, 0, ShadowSize);}
+ OffsetRect(RShadow, ShadowSize, -ShadowSize);
+ end;
+ end; { case }
+ Result := DrawText(DC, Str, Count, RShadow, Format);
+ if Result > 0 then Inc(Result, ShadowSize);
+ SetTextColor(DC, Color);
+ DrawText(DC, Str, Count, RText, Format);
+ UnionRect(Rect, RText, RShadow);
+end;
+
+{ TRxRadioGroup }
+
+function TRxRadioGroup.GetItemEnabled(Index: integer): boolean;
+var
+ R:TRadioButton;
+begin
+ if (Index < -1) or (Index >= Items.Count) then
+ RaiseIndexOutOfBounds(Self, Items, Index);
+ R:=FindComponent('RadioButton'+IntToStr(Index)) as TRadioButton;
+ if Assigned(R) then
+ Result:=R.Enabled
+ else
+ Result:=False;
+end;
+
+procedure TRxRadioGroup.SetItemEnabled(Index: integer; AValue: boolean);
+var
+ R:TRadioButton;
+begin
+ if (Index < -1) or (Index >= Items.Count) then
+ RaiseIndexOutOfBounds(Self, Items, Index);
+ R:=FindComponent('RadioButton'+IntToStr(Index)) as TRadioButton;
+ if Assigned(R) then
+ R.Enabled:=AValue;
+end;
+
+constructor TRxCustomLabel.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ ControlStyle := ControlStyle + [csOpaque];
+{.$IFDEF WIN32}
+ ControlStyle := ControlStyle + [csReplicatable];
+{.$ENDIF}
+ Width := 65;
+ Height := 17;
+ FAutoSize := True;
+ FShowAccelChar := True;
+ FShadowColor := clBtnHighlight;
+ FShadowSize := 1;
+ FShadowPos := spLeftTop;
+end;
+
+function TRxCustomLabel.GetLabelCaption: string;
+begin
+ Result := Caption;
+end;
+
+function TRxCustomLabel.GetDefaultFontColor: TColor;
+begin
+ Result := Font.Color;
+end;
+
+procedure TRxCustomLabel.DoDrawText(var Rect: TRect; Flags: Word);
+var
+ AText: string;
+ PosShadow: TShadowPosition;
+ SizeShadow: Byte;
+ ColorShadow: TColor;
+begin
+ AText := GetLabelCaption;
+ if (Flags and DT_CALCRECT <> 0) and ((AText = '') or FShowAccelChar and
+ (AText[1] = '&') and (AText[2] = #0)) then AText := AText + ' ';
+ if not FShowAccelChar then Flags := Flags or DT_NOPREFIX;
+{$IFDEF USED_BiDi}
+ Flags := DrawTextBiDiModeFlags(Flags);
+{$ENDIF}
+ Canvas.Font := Font;
+ Canvas.Font.Color := GetDefaultFontColor;
+ PosShadow := FShadowPos;
+ SizeShadow := FShadowSize;
+ ColorShadow := FShadowColor;
+ if not Enabled then begin
+ if (FShadowSize = 0) and NewStyleControls then begin
+ PosShadow := spRightBottom;
+ SizeShadow := 1;
+ end;
+ Canvas.Font.Color := clGrayText;
+ ColorShadow := clBtnHighlight;
+ end;
+ DrawShadowText(Canvas.Handle, PChar(AText), Length(AText), Rect, Flags,
+ SizeShadow, ColorToRGB(ColorShadow), PosShadow);
+end;
+
+procedure TRxCustomLabel.Paint;
+var
+ Rect: TRect;
+ DrawStyle: Integer;
+begin
+ if not Enabled and not (csDesigning in ComponentState) then
+ FDragging := False;
+
+ with Canvas do
+ begin
+ if not Transparent then
+ begin
+ Brush.Color := Self.Color;
+ Brush.Style := bsSolid;
+ FillRect(ClientRect);
+ end;
+ Brush.Style := bsClear;
+ Rect := ClientRect;
+ Inc(Rect.Left, FLeftMargin);
+ Dec(Rect.Right, FRightMargin);
+ InflateRect(Rect, -1, 0);
+ DrawStyle := {DT_EXPANDTABS or }WordWraps[FWordWrap] or Alignments[FAlignment];
+ { Calculate vertical layout }
+ if FLayout <> tlTop then
+ begin
+ DoDrawText(Rect, DrawStyle or DT_CALCRECT);
+ Rect.Left := ClientRect.Left + FLeftMargin;
+ Rect.Right := ClientRect.Right - FRightMargin;
+ if FLayout = tlBottom then OffsetRect(Rect, 0, Height - Rect.Bottom)
+ else OffsetRect(Rect, 0, (Height - Rect.Bottom) div 2);
+ end;
+ DoDrawText(Rect, DrawStyle);
+ if FShowFocus and Assigned(FFocusControl) and FFocused and
+ not (csDesigning in ComponentState) then
+ begin
+ InflateRect(Rect, 1, 0);
+ Brush.Color := Self.Color;
+// DrawFocusRect(Rect);
+ FrameRect(Rect);
+ end;
+ end;
+end;
+
+procedure TRxCustomLabel.AdjustBounds;
+var
+ DC: HDC;
+ X: Integer;
+ Rect: TRect;
+ AAlignment: TAlignment;
+begin
+ if AutoSize then
+ begin
+ Rect := ClientRect;
+ Inc(Rect.Left, FLeftMargin);
+ Dec(Rect.Right, FRightMargin);
+ InflateRect(Rect, -1, 0);
+ DC := GetDC(0);
+ Canvas.Handle := DC;
+ DoDrawText(Rect, {DT_EXPANDTABS or }DT_CALCRECT or WordWraps[FWordWrap]);
+ Dec(Rect.Left, FLeftMargin);
+ Inc(Rect.Right, FRightMargin);
+ Canvas.Handle := 0;
+ ReleaseDC(0, DC);
+ InflateRect(Rect, 1, 0);
+ X := Left;
+ AAlignment := FAlignment;
+{$IFDEF USED_BiDi}
+ if UseRightToLeftAlignment then ChangeBiDiModeAlignment(AAlignment);
+{$ENDIF}
+ if AAlignment = taRightJustify then Inc(X, Width - Rect.Right);
+ SetBounds(X, Top, Rect.Right, Rect.Bottom);
+ end;
+end;
+
+procedure TRxCustomLabel.SetAlignment(Value: TAlignment);
+begin
+ if FAlignment <> Value then begin
+ FAlignment := Value;
+ Invalidate;
+ end;
+end;
+
+procedure TRxCustomLabel.SetAutoSize(Value: Boolean);
+begin
+ if AutoSize <> Value then begin
+ FAutoSize := Value;
+ AdjustBounds;
+ end;
+end;
+
+procedure TRxCustomLabel.SetLayout(Value: TTextLayout);
+begin
+ if FLayout <> Value then begin
+ FLayout := Value;
+ Invalidate;
+ end;
+end;
+
+procedure TRxCustomLabel.SetLeftMargin(Value: Integer);
+begin
+ if FLeftMargin <> Value then
+ begin
+ FLeftMargin := Max(Value, 0);
+ AdjustBounds;
+ Invalidate;
+ end;
+end;
+
+procedure TRxCustomLabel.SetRightMargin(Value: Integer);
+begin
+ if FRightMargin <> Value then begin
+ FRightMargin := Max(Value, 0);
+ AdjustBounds;
+ Invalidate;
+ end;
+end;
+
+procedure TRxCustomLabel.SetShadowColor(Value: TColor);
+begin
+ if Value <> FShadowColor then begin
+ FShadowColor := Value;
+ Invalidate;
+ end;
+end;
+
+procedure TRxCustomLabel.SetShadowSize(Value: Byte);
+begin
+ if Value <> FShadowSize then begin
+ FShadowSize := Value;
+ AdjustBounds;
+ Invalidate;
+ end;
+end;
+
+procedure TRxCustomLabel.SetShadowPos(Value: TShadowPosition);
+begin
+ if Value <> FShadowPos then begin
+ FShadowPos := Value;
+ Invalidate;
+ end;
+end;
+
+function TRxCustomLabel.GetTransparent: Boolean;
+begin
+ Result := not (csOpaque in ControlStyle);
+end;
+
+procedure TRxCustomLabel.SetFocusControl(Value: TWinControl);
+begin
+ FFocusControl := Value;
+{.$IFDEF WIN32}
+ if Value <> nil then Value.FreeNotification(Self);
+{.$ENDIF}
+ if FShowFocus then Invalidate;
+end;
+
+procedure TRxCustomLabel.SetShowAccelChar(Value: Boolean);
+begin
+ if FShowAccelChar <> Value then begin
+ FShowAccelChar := Value;
+ Invalidate;
+ end;
+end;
+
+procedure TRxCustomLabel.SetTransparent(Value: Boolean);
+begin
+ if Transparent <> Value then begin
+ if Value then ControlStyle := ControlStyle - [csOpaque]
+ else ControlStyle := ControlStyle + [csOpaque];
+ Invalidate;
+ end;
+end;
+
+procedure TRxCustomLabel.SetShowFocus(Value: Boolean);
+begin
+ if FShowFocus <> Value then begin
+ FShowFocus := Value;
+ Invalidate;
+ end;
+end;
+
+procedure TRxCustomLabel.SetWordWrap(Value: Boolean);
+begin
+ if FWordWrap <> Value then begin
+ FWordWrap := Value;
+ AdjustBounds;
+ end;
+end;
+
+procedure TRxCustomLabel.Notification(AComponent: TComponent;
+ Operation: TOperation);
+begin
+ inherited Notification(AComponent, Operation);
+ if (Operation = opRemove) and (AComponent = FFocusControl) then
+ FocusControl := nil;
+end;
+
+procedure TRxCustomLabel.MouseEnter;
+begin
+ if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
+end;
+
+procedure TRxCustomLabel.MouseLeave;
+begin
+ if Assigned(FOnMouseLeave) then FOnMouseLeave(Self);
+end;
+
+procedure TRxCustomLabel.UpdateTracking;
+var
+ P: TPoint;
+ OldValue: Boolean;
+begin
+ OldValue := FMouseInControl;
+ GetCursorPos(P);
+ FMouseInControl := Enabled and (FindDragTarget(P, True) = Self) and
+ IsForegroundTask;
+ if (FMouseInControl <> OldValue) then
+ if FMouseInControl then MouseEnter else MouseLeave;
+end;
+
+procedure TRxCustomLabel.CMFocusChanged(var Message: TLMessage);
+var
+ Active: Boolean;
+begin
+ Active := Assigned(FFocusControl) {and (Message.Sender = FFocusControl)};
+ if FFocused <> Active then
+ begin
+ FFocused := Active;
+ if FShowFocus then Invalidate;
+ end;
+ inherited;
+end;
+
+procedure TRxCustomLabel.CMTextChanged(var Message: TLMessage);
+begin
+ Invalidate;
+ AdjustBounds;
+end;
+
+procedure TRxCustomLabel.CMFontChanged(var Message: TLMessage);
+begin
+ inherited;
+ AdjustBounds;
+end;
+
+procedure TRxCustomLabel.CMDialogChar(var Message: TCMDialogChar);
+begin
+ if (FFocusControl <> nil) and Enabled and ShowAccelChar and
+ IsAccel(Message.CharCode, GetLabelCaption) then
+ with FFocusControl do
+ if CanFocus then begin
+ SetFocus;
+ Message.Result := 1;
+ end;
+end;
+
+{procedure TRxCustomLabel.MouseDown(Button: TMouseButton; Shift: TShiftState;
+ X, Y: Integer);
+begin
+ inherited MouseDown(Button, Shift, X, Y);
+ if (Button = mbLeft) and Enabled then
+ begin
+ FDragging := True;
+ end;
+end;
+
+procedure TRxCustomLabel.MouseUp(Button: TMouseButton; Shift: TShiftState;
+ X, Y: Integer);
+begin
+ inherited MouseUp(Button, Shift, X, Y);
+ if FDragging and (Button = mbLeft) then FDragging := False;
+ UpdateTracking;
+end;
+}
+procedure TRxCustomLabel.MouseDown(Button: TMouseButton; Shift:TShiftState; X,Y:Integer);
+begin
+ inherited MouseDown(Button, Shift, X,Y);
+ UpdateTracking;
+end;
+
+procedure TRxCustomLabel.MouseUp(Button: TMouseButton; Shift:TShiftState; X,Y:Integer);
+begin
+ inherited MouseUp(Button, Shift, X,Y);
+ UpdateTracking;
+end;
+(*
+procedure TRxCustomLabel.WMRButtonDown(var Message: TWMRButtonDown);
+begin
+ inherited;
+ UpdateTracking;
+end;
+
+procedure TRxCustomLabel.WMRButtonUp(var Message: TWMRButtonUp);
+begin
+ inherited;
+ UpdateTracking;
+end;
+*)
+procedure TRxCustomLabel.CMEnabledChanged(var Message: TLMessage);
+begin
+ inherited;
+ UpdateTracking;
+end;
+
+procedure TRxCustomLabel.CMVisibleChanged(var Message: TLMessage);
+begin
+ inherited;
+ if Visible then UpdateTracking;
+end;
+
+procedure TRxCustomLabel.CMMouseEnter(var Message: TLMessage);
+begin
+ inherited;
+ if not FMouseInControl and Enabled and IsForegroundTask then begin
+ FMouseInControl := True;
+ MouseEnter;
+ end;
+end;
+
+procedure TRxCustomLabel.CMMouseLeave(var Message: TLMessage);
+begin
+ inherited;
+ if FMouseInControl and Enabled and not FDragging then begin
+ FMouseInControl := False;
+ MouseLeave;
+ end;
+end;
+
+{ TSecretPanel }
+
+constructor TSecretPanel.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FScrollCnt := 0;
+ FAlignment := taCenter;
+ FActive := False;
+ FTxtDivider := 1;
+ FGlyphLayout := glGlyphLeft;
+ ControlStyle := ControlStyle - [csSetCaption];
+ BevelOuter := bvLowered;
+ FTextStyle := bvNone;
+ FLines := TStringList.Create;
+ TStringList(FLines).OnChange := @LinesChanged;
+ FGlyph := TBitmap.Create;
+ FGlyph.OnChange := @GlyphChanged;
+ FHiddenList := TList.Create;
+ FTimer := TTimer.Create(Self);
+ with FTimer do
+ begin
+ Enabled := False;
+ OnTimer := @TimerExpired;
+ Interval := 30;
+{$IFDEF RX_D3}
+// SyncEvent := False;
+ FAsyncDrawing := True;
+{$ENDIF}
+ end;
+end;
+
+destructor TSecretPanel.Destroy;
+begin
+ SetActive(False);
+ FGlyph.OnChange := nil;
+ FGlyph.Free;
+ TStringList(FLines).OnChange := nil;
+ FLines.Free;
+ FHiddenList.Free;
+ inherited Destroy;
+end;
+
+procedure TSecretPanel.GlyphChanged(Sender: TObject);
+begin
+ if Active then begin
+ UpdateMemoryImage;
+ Invalidate;
+ end;
+end;
+
+procedure TSecretPanel.LinesChanged(Sender: TObject);
+begin
+ if Active then begin
+ FScrollCnt := 0;
+ UpdateMemoryImage;
+ Invalidate;
+ end;
+end;
+
+procedure TSecretPanel.CMFontChanged(var Message: TLMessage);
+begin
+ inherited;
+ if Active then UpdateMemoryImage;
+end;
+
+procedure TSecretPanel.CMColorChanged(var Message: TLMessage);
+begin
+ inherited;
+ if Active then UpdateMemoryImage;
+end;
+
+//procedure TSecretPanel.WMSize(var Message: TLMessage);
+procedure TSecretPanel.WMSize(var Message: TLMSize);
+begin
+ inherited;
+ if Active then begin
+ UpdateMemoryImage;
+ Invalidate;
+ end;
+end;
+
+{$IFDEF RX_D3}
+procedure TSecretPanel.SetAsyncDrawing(Value: Boolean);
+begin
+ if FAsyncDrawing <> Value then
+ begin
+// FTimer.SyncEvent := not Value;
+ FAsyncDrawing := Value;
+ end;
+end;
+{$ENDIF RX_D3}
+
+procedure TSecretPanel.AlignControls(AControl: TControl; var Rect: TRect);
+begin
+ inherited AlignControls(AControl, Rect);
+ if (AControl = nil) and Active then UpdateMemoryImage;
+end;
+
+function TSecretPanel.GetInflateWidth: Integer;
+begin
+ Result := BorderWidth;
+ if BevelOuter <> bvNone then Inc(Result, BevelWidth);
+ if BevelInner <> bvNone then Inc(Result, BevelWidth);
+end;
+
+procedure TSecretPanel.RecalcDrawRect;
+const
+ MinOffset = 3;
+var
+ InflateWidth: Integer;
+ LastLine: Integer;
+begin
+ FTxtRect := GetClientRect;
+ FPaintRect := FTxtRect;
+ InflateWidth := GetInflateWidth;
+ InflateRect(FPaintRect, -InflateWidth, -InflateWidth);
+ Inc(InflateWidth, MinOffset);
+ InflateRect(FTxtRect, -InflateWidth, -InflateWidth);
+ with FGlyphOrigin do begin
+ case FGlyphLayout of
+ glGlyphLeft:
+ begin
+ X := FTxtRect.Left;
+ Y := (FTxtRect.Bottom + FTxtRect.Top - Glyph.Height) div 2;
+ if Y < FTxtRect.Top then Y := FTxtRect.Top;
+ if Glyph.Width > 0 then begin
+ Inc(X, MinOffset);
+ FTxtRect.Left := X + Glyph.Width + InflateWidth;
+ end;
+ end;
+ glGlyphRight:
+ begin
+ Y := (FTxtRect.Bottom + FTxtRect.Top - Glyph.Height) div 2;
+ if Y < FTxtRect.Top then Y := FTxtRect.Top;
+ X := FTxtRect.Right - Glyph.Width;
+ if Glyph.Width > 0 then begin
+ Dec(X, MinOffset);
+ if X < FTxtRect.Left then X := FTxtRect.Left;
+ FTxtRect.Right := X - InflateWidth;
+ end;
+ end;
+ glGlyphTop:
+ begin
+ Y := FTxtRect.Top;
+ X := (FTxtRect.Right + FTxtRect.Left - Glyph.Width) div 2;
+ if X < FTxtRect.Left then X := FTxtRect.Left;
+ if Glyph.Height > 0 then begin
+ Inc(Y, MinOffset);
+ FTxtRect.Top := Y + Glyph.Height + (InflateWidth + MinOffset);
+ end;
+ end;
+ glGlyphBottom:
+ begin
+ X := (FTxtRect.Right + FTxtRect.Left - Glyph.Width) div 2;
+ if X < FTxtRect.Left then X := FTxtRect.Left;
+ Y := FTxtRect.Bottom - Glyph.Height;
+ if Glyph.Height > 0 then begin
+ Dec(Y, MinOffset);
+ if Y < FTxtRect.Top then Y := FTxtRect.Top;
+ FTxtRect.Bottom := Y - (InflateWidth + MinOffset);
+ end;
+ end;
+ end;
+ end;
+ if FDirection = sdHorizontal then begin
+ LastLine := FLines.Count - 1;
+ while (LastLine >= 0) and (Trim(FLines[LastLine]) = '') do
+ Dec(LastLine);
+ InflateWidth := HeightOf(FTxtRect) -
+ (LastLine + 1 - FFirstLine) * FTxtDivider;
+ if InflateWidth > 0 then
+ InflateRect(FTxtRect, 0, - InflateWidth div 2);
+ end;
+ with FTxtRect do
+ if (Left >= Right) or (Top >= Bottom) then FTxtRect := Rect(0, 0, 0, 0);
+end;
+
+procedure TSecretPanel.PaintGlyph;
+begin
+ if not FGlyph.Empty then
+ begin
+ RecalcDrawRect;
+//alexs
+{ DrawBitmapTransparent(Canvas, FGlyphOrigin.X, FGlyphOrigin.Y,
+ FGlyph, FGlyph.TransparentColor and not PaletteMask);}
+ end;
+end;
+
+procedure TSecretPanel.PaintText;
+var
+ STmp: array[0..255] of Char;
+ R: TRect;
+ I: Integer;
+ Flags: Longint;
+begin
+ if (FLines.Count = 0) or IsRectEmpty(FTxtRect) or not HandleAllocated then
+ Exit;
+{$IFDEF RX_D3}
+ FMemoryImage.Canvas.Lock;
+ try
+{$ENDIF}
+ with FMemoryImage.Canvas do begin
+ I := SaveDC(Handle);
+ try
+ with FTxtRect do
+ MoveWindowOrg(Handle, -Left, -Top);
+ Brush.Color := Self.Color;
+ PaintClient(FMemoryImage.Canvas, FPaintRect);
+ finally
+ RestoreDC(Handle, I);
+ SetBkMode(Handle, Transparent);
+ end;
+ end;
+ R := Bounds(0, 0, WidthOf(FTxtRect), HeightOf(FTxtRect));
+ if FDirection = sdHorizontal then begin
+{$IFDEF RX_D4}
+ if IsRightToLeft then begin
+ R.Right := R.Left + FScrollCnt;
+ R.Left := R.Right - (FMaxScroll - WidthOf(FTxtRect));
+ end
+ else begin
+ R.Left := R.Right - FScrollCnt;
+ R.Right := R.Left + (FMaxScroll - WidthOf(FTxtRect));
+ end;
+{$ELSE}
+ R.Left := R.Right - FScrollCnt;
+ R.Right := R.Left + (FMaxScroll - WidthOf(FTxtRect));
+{$ENDIF}
+ end
+ else
+ begin { sdVertical }
+ R.Top := R.Bottom - FScrollCnt;
+ end;
+ R.Bottom := R.Top + FTxtDivider;
+ Flags := {DT_EXPANDTABS or }Alignments[FAlignment] or DT_SINGLELINE or
+ DT_NOCLIP or DT_NOPREFIX;
+{$IFDEF USED_BiDi}
+ Flags := DrawTextBiDiModeFlags(Flags);
+{$ENDIF}
+ for I := FFirstLine to FLines.Count do begin
+ if I = FLines.Count then StrCopy(STmp, ' ')
+ else StrPLCopy(STmp, FLines[I], SizeOf(STmp) - 1);
+ if R.Top >= HeightOf(FTxtRect) then Break
+ else if R.Bottom > 0 then begin
+ if FTextStyle <> bvNone then begin
+ FMemoryImage.Canvas.Font.Color := clBtnHighlight;
+ case FTextStyle of
+ bvLowered:
+ begin
+ OffsetRect(R, 1, 1);
+ DrawText(FMemoryImage.Canvas.Handle, STmp, -1, R, Flags);
+ OffsetRect(R, -1, -1);
+ end;
+ bvRaised:
+ begin
+ OffsetRect(R, -1, -1);
+ DrawText(FMemoryImage.Canvas.Handle, STmp, -1, R, Flags);
+ OffsetRect(R, 1, 1);
+ end;
+ end;
+ FMemoryImage.Canvas.Font.Color := Self.Font.Color;
+ SetBkMode(FMemoryImage.Canvas.Handle, Transparent);
+ end;
+ DrawText(FMemoryImage.Canvas.Handle, STmp, -1, R, Flags);
+ end;
+ OffsetRect(R, 0, FTxtDivider);
+ end;
+{$IFDEF RX_D3}
+ Canvas.Lock;
+ try
+{$ENDIF}
+ BitBlt(Canvas.Handle, FTxtRect.Left, FTxtRect.Top, FMemoryImage.Width,
+ FMemoryImage.Height, FMemoryImage.Canvas.Handle, 0, 0, SRCCOPY);
+// ValidateRect(Handle, @FTxtRect);
+{$IFDEF RX_D3}
+ finally
+ Canvas.Unlock;
+ end;
+{$ENDIF}
+{$IFDEF RX_D3}
+ finally
+ FMemoryImage.Canvas.Unlock;
+ end;
+{$ENDIF}
+end;
+
+procedure TSecretPanel.PaintClient(ACanvas: TCanvas; Rect: TRect);
+begin
+ if Assigned(FOnPaintClient) then FOnPaintClient(Self, ACanvas, Rect)
+ else ACanvas.FillRect(Rect);
+end;
+
+procedure TSecretPanel.Paint;
+var
+ Rect: TRect;
+ TopColor, BottomColor: TColor;
+ SaveIndex: Integer;
+
+ procedure AdjustColors(Bevel: TPanelBevel);
+ begin
+ TopColor := clBtnHighlight;
+ if Bevel = bvLowered then TopColor := clBtnShadow;
+ BottomColor := clBtnShadow;
+ if Bevel = bvLowered then BottomColor := clBtnHighlight;
+ end;
+
+begin
+ Rect := GetClientRect;
+ if BevelOuter <> bvNone then
+ begin
+ AdjustColors(BevelOuter);
+// Frame3D(Canvas, Rect, TopColor, BottomColor, BevelWidth);
+ WidgetSet.Frame3d(Canvas.Handle, Rect, BevelWidth, BevelOuter);
+ end;
+// Frame3D(Canvas, Rect, Color, Color, BorderWidth);
+ WidgetSet.Frame3d(Canvas.Handle, Rect, BorderWidth, BevelOuter);
+ if BevelInner <> bvNone then
+ begin
+ AdjustColors(BevelInner);
+// Frame3D(Canvas, Rect, TopColor, BottomColor, BevelWidth);
+ WidgetSet.Frame3d(Canvas.Handle, Rect, BorderWidth, BevelInner);
+ end;
+ SaveIndex := SaveDC(Canvas.Handle);
+ try
+ with Rect do
+ IntersectClipRect(Canvas.Handle, Left, Top, Right, Bottom);
+ Canvas.Brush.Color := Self.Color;
+ PaintClient(Canvas, Rect);
+ finally
+ RestoreDC(Canvas.Handle, SaveIndex);
+ end;
+ if Active then begin
+ PaintGlyph;
+ {PaintText;}
+ end;
+end;
+
+procedure TSecretPanel.StartPlay;
+begin
+ if Assigned(FOnStartPlay) then FOnStartPlay(Self);
+end;
+
+procedure TSecretPanel.StopPlay;
+begin
+ if Assigned(FOnStopPlay) then FOnStopPlay(Self);
+end;
+
+procedure TSecretPanel.TimerExpired(Sender: TObject);
+begin
+ if (FScrollCnt < FMaxScroll) then begin
+ Inc(FScrollCnt);
+ if Assigned(FMemoryImage) then PaintText;
+ end
+ else if Cycled then begin
+ FScrollCnt := 0;
+ if Assigned(FMemoryImage) then PaintText;
+ end
+ else
+ begin
+{.$IFDEF RX_D3}
+// FTimer.Synchronize(Stop);
+{.$ELSE}
+ SetActive(False);
+{.$ENDIF}
+ end;
+end;
+
+procedure TSecretPanel.UpdateMemoryImage;
+var
+ Metrics: TTextMetric;
+ I: Integer;
+begin
+ if FMemoryImage = nil then FMemoryImage := TBitmap.Create;
+{.$IFDEF RX_D3}
+ FMemoryImage.Canvas.Lock;
+ try
+{.$ENDIF}
+ FFirstLine := 0;
+ while (FFirstLine < FLines.Count) and (Trim(FLines[FFirstLine]) = '') do
+ Inc(FFirstLine);
+ Canvas.Font := Self.Font;
+ GetTextMetrics(Canvas.Handle, Metrics);
+ FTxtDivider := Metrics.tmHeight + Metrics.tmExternalLeading;
+ if FTextStyle <> bvNone then Inc(FTxtDivider);
+ RecalcDrawRect;
+ if FDirection = sdHorizontal then begin
+ FMaxScroll := 0;
+ for I := FFirstLine to FLines.Count - 1 do
+ FMaxScroll := Max(FMaxScroll, Canvas.TextWidth(FLines[I]));
+ Inc(FMaxScroll, WidthOf(FTxtRect));
+ end
+ else begin { sdVertical }
+ FMaxScroll := ((FLines.Count - FFirstLine) * FTxtDivider) +
+ HeightOf(FTxtRect);
+ end;
+ FMemoryImage.Width := WidthOf(FTxtRect);
+ FMemoryImage.Height := HeightOf(FTxtRect);
+ with FMemoryImage.Canvas do begin
+ Font := Self.Font;
+ Brush.Color := Self.Color;
+ SetBkMode(Handle, Transparent);
+ end;
+{.$IFDEF RX_D3}
+ finally
+ FMemoryImage.Canvas.UnLock;
+ end;
+{.$ENDIF}
+end;
+
+function TSecretPanel.GetInterval: Cardinal;
+begin
+ Result := FTimer.Interval;
+end;
+
+procedure TSecretPanel.SetInterval(Value: Cardinal);
+begin
+ FTimer.Interval := Value;
+end;
+
+procedure TSecretPanel.Play;
+begin
+ SetActive(True);
+end;
+
+procedure TSecretPanel.Stop;
+begin
+ SetActive(False);
+end;
+
+procedure TSecretPanel.SetActive(Value: Boolean);
+var
+ I: Integer;
+begin
+ if Value <> FActive then
+ begin
+ FActive := Value;
+ if FActive then
+ begin
+ FScrollCnt := 0;
+ UpdateMemoryImage;
+ try
+ FTimer.Enabled := True;
+ StartPlay;
+ except
+ FActive := False;
+ FTimer.Enabled := False;
+ raise;
+ end;
+ end
+ else begin
+{.$IFDEF RX_D3}
+ FMemoryImage.Canvas.Lock;
+ { ensure that canvas is locked before timer is disabled }
+{.$ENDIF}
+ FTimer.Enabled := False;
+ FScrollCnt := 0;
+ FMemoryImage.Free;
+ FMemoryImage := nil;
+ StopPlay;
+ if (csDesigning in ComponentState) and
+ not (csDestroying in ComponentState) then
+ ValidParentForm(Self).Designer.Modified;
+ end;
+ if not (csDestroying in ComponentState) then
+ for I := 0 to Pred(ControlCount) do
+ begin
+ if FActive then
+ begin
+ if Controls[I].Visible then FHiddenList.Add(Controls[I]);
+ if not (csDesigning in ComponentState) then
+ Controls[I].Visible := False
+ end
+ else
+ if FHiddenList.IndexOf(Controls[I]) >= 0 then
+ begin
+ Controls[I].Visible := True;
+ Controls[I].Invalidate;
+ if (csDesigning in ComponentState) then Controls[I].Update;
+ end;
+ end;
+ if not FActive then FHiddenList.Clear;
+ Invalidate;
+ end;
+end;
+
+procedure TSecretPanel.SetAlignment(Value: TAlignment);
+begin
+ if FAlignment <> Value then
+ begin
+ FAlignment := Value;
+ if Active then Invalidate;
+ end;
+end;
+
+procedure TSecretPanel.SetGlyph(Value: TBitmap);
+begin
+ FGlyph.Assign(Value);
+end;
+
+procedure TSecretPanel.SetDirection(Value: TScrollDirection);
+begin
+ if FDirection <> Value then
+ begin
+ FDirection := Value;
+ if FActive then
+ begin
+ FScrollCnt := 0;
+ UpdateMemoryImage;
+ Invalidate;
+ end;
+ end;
+end;
+
+procedure TSecretPanel.SetTextStyle(Value: TPanelBevel);
+begin
+ if FTextStyle <> Value then
+ begin
+ FTextStyle := Value;
+ if FActive then
+ begin
+ UpdateMemoryImage;
+ Invalidate;
+ end;
+ end;
+end;
+
+procedure TSecretPanel.SetGlyphLayout(Value: TGlyphLayout);
+begin
+ if FGlyphLayout <> Value then
+ begin
+ FGlyphLayout := Value;
+ if FActive then
+ begin
+ UpdateMemoryImage;
+ Invalidate;
+ end;
+ end;
+end;
+
+procedure TSecretPanel.SetLines(Value: TStrings);
+begin
+ FLines.Assign(Value);
+end;
+(*
+{ TGlyphList }
+
+type
+ TGlyphList = class(TImageList)
+ private
+ FUsed: TBits;
+ FCount: Integer;
+ function AllocateIndex: Integer;
+ public
+ constructor CreateSize(AWidth, AHeight: Integer);
+ destructor Destroy; override;
+ function Add(Image, Mask: TBitmap): Integer;
+ function AddMasked(Image: TBitmap; MaskColor: TColor): Integer;
+{$IFDEF WIN32}
+{$IFNDEF RX_D3} { Delphi 2.0 bug fix }
+ procedure ReplaceMasked(Index: Integer; NewImage: TBitmap; MaskColor: TColor);
+{$ENDIF}
+{$ENDIF}
+ procedure Delete(Index: Integer);
+ property Count: Integer read FCount;
+ end;
+
+{ TGlyphCache }
+
+ TGlyphCache = class
+ private
+ FGlyphLists: TList;
+ public
+ constructor Create;
+ destructor Destroy; override;
+ function GetList(AWidth, AHeight: Integer): TGlyphList;
+ procedure ReturnList(List: TGlyphList);
+ function Empty: Boolean;
+ end;
+
+{ TGlyphList }
+
+constructor TGlyphList.CreateSize(AWidth, AHeight: Integer);
+begin
+{$IFDEF WIN32}
+ inherited CreateSize(AWidth, AHeight);
+{$ELSE}
+ inherited Create(AWidth, AHeight);
+{$ENDIF}
+ FUsed := TBits.Create;
+end;
+
+destructor TGlyphList.Destroy;
+begin
+ FUsed.Free;
+ inherited Destroy;
+end;
+
+function TGlyphList.AllocateIndex: Integer;
+begin
+ Result := FUsed.OpenBit;
+ if Result >= FUsed.Size then begin
+ Result := inherited Add(nil, nil);
+ FUsed.Size := Result + 1;
+ end;
+ FUsed[Result] := True;
+end;
+
+{$IFDEF WIN32}
+{$IFNDEF RX_D3} { Delphi 2.0 bug fix }
+procedure TGlyphList.ReplaceMasked(Index: Integer; NewImage: TBitmap; MaskColor: TColor);
+var
+ TempIndex: Integer;
+ Image, Mask: TBitmap;
+begin
+ if HandleAllocated then begin
+ TempIndex := inherited AddMasked(NewImage, MaskColor);
+ if TempIndex <> -1 then
+ try
+ Image := TBitmap.Create;
+ Mask := TBitmap.Create;
+ try
+ with Image do begin
+ Height := Self.Height;
+ Width := Self.Width;
+ end;
+ with Mask do begin
+ Monochrome := True; { fix }
+ Height := Self.Height;
+ Width := Self.Width;
+ end;
+ ImageList_Draw(Handle, TempIndex, Image.Canvas.Handle, 0, 0, ILD_NORMAL);
+ ImageList_Draw(Handle, TempIndex, Mask.Canvas.Handle, 0, 0, ILD_MASK);
+ if not ImageList_Replace(Handle, Index, Image.Handle, Mask.Handle) then
+ raise EInvalidOperation.Create(LoadStr(SReplaceImage));
+ finally
+ Image.Free;
+ Mask.Free;
+ end;
+ finally
+ inherited Delete(TempIndex);
+ end
+ else raise EInvalidOperation.Create(LoadStr(SReplaceImage));
+ end;
+ Change;
+end;
+{$ENDIF}
+{$ENDIF}
+
+function TGlyphList.Add(Image, Mask: TBitmap): Integer;
+begin
+ Result := AllocateIndex;
+ Replace(Result, Image, Mask);
+ Inc(FCount);
+end;
+
+function TGlyphList.AddMasked(Image: TBitmap; MaskColor: TColor): Integer;
+begin
+ Result := AllocateIndex;
+ ReplaceMasked(Result, Image, MaskColor);
+ Inc(FCount);
+end;
+
+procedure TGlyphList.Delete(Index: Integer);
+begin
+ if FUsed[Index] then begin
+ Dec(FCount);
+ FUsed[Index] := False;
+ end;
+end;
+
+{ TGlyphCache }
+
+constructor TGlyphCache.Create;
+begin
+ inherited Create;
+ FGlyphLists := TList.Create;
+end;
+
+destructor TGlyphCache.Destroy;
+begin
+ FGlyphLists.Free;
+ inherited Destroy;
+end;
+
+function TGlyphCache.GetList(AWidth, AHeight: Integer): TGlyphList;
+var
+ I: Integer;
+begin
+ for I := FGlyphLists.Count - 1 downto 0 do begin
+ Result := FGlyphLists[I];
+ with Result do
+ if (AWidth = Width) and (AHeight = Height) then Exit;
+ end;
+ Result := TGlyphList.CreateSize(AWidth, AHeight);
+ FGlyphLists.Add(Result);
+end;
+
+procedure TGlyphCache.ReturnList(List: TGlyphList);
+begin
+ if List = nil then Exit;
+ if List.Count = 0 then begin
+ FGlyphLists.Remove(List);
+ List.Free;
+ end;
+end;
+
+function TGlyphCache.Empty: Boolean;
+begin
+ Result := FGlyphLists.Count = 0;
+end;
+
+const
+ GlyphCache: TGlyphCache = nil;
+
+{ TRxButtonGlyph }
+
+constructor TRxButtonGlyph.Create;
+var
+ I: TRxButtonState;
+begin
+ inherited Create;
+ FOriginal := TBitmap.Create;
+ FOriginal.OnChange := GlyphChanged;
+ FTransparentColor := clFuchsia;
+ FAlignment := taCenter;
+ FNumGlyphs := 1;
+ for I := Low(I) to High(I) do FIndexs[I] := -1;
+ if GlyphCache = nil then GlyphCache := TGlyphCache.Create;
+end;
+
+destructor TRxButtonGlyph.Destroy;
+begin
+ FOriginal.Free;
+ Invalidate;
+ if Assigned(GlyphCache) and GlyphCache.Empty then begin
+ GlyphCache.Free;
+ GlyphCache := nil;
+ end;
+ inherited Destroy;
+end;
+
+procedure TRxButtonGlyph.Invalidate;
+var
+ I: TRxButtonState;
+begin
+ for I := Low(I) to High(I) do begin
+ if Assigned(FGlyphList) then
+ if (FIndexs[I] <> -1) then TGlyphList(FGlyphList).Delete(FIndexs[I]);
+ FIndexs[I] := -1;
+ end;
+ GlyphCache.ReturnList(TGlyphList(FGlyphList));
+ FGlyphList := nil;
+end;
+
+procedure TRxButtonGlyph.GlyphChanged(Sender: TObject);
+var
+ Glyphs: Integer;
+begin
+ if Sender = FOriginal then begin
+ Invalidate;
+ if (FOriginal <> nil) and (FOriginal.Height > 0) then begin
+ FTransparentColor := FOriginal.TransparentColor and not PaletteMask;
+ if FOriginal.Width mod FOriginal.Height = 0 then begin
+ Glyphs := FOriginal.Width div FOriginal.Height;
+ if Glyphs > (Ord(High(TRxButtonState)) + 1) then Glyphs := 1;
+ SetNumGlyphs(Glyphs);
+ end;
+ end;
+ if Assigned(FOnChange) then FOnChange(Self);
+ end;
+end;
+
+procedure TRxButtonGlyph.SetGlyph(Value: TBitmap);
+begin
+ Invalidate;
+ FOriginal.Assign(Value);
+end;
+
+procedure TRxButtonGlyph.SetNumGlyphs(Value: TRxNumGlyphs);
+begin
+ if (Value <> FNumGlyphs) and (Value > 0) then begin
+ Invalidate;
+ FNumGlyphs := Value;
+ end;
+end;
+
+function TRxButtonGlyph.MapColor(Color: TColor): TColor;
+var
+ Index: Byte;
+begin
+ if (Color = FTransparentColor) or (ColorToRGB(Color) =
+ ColorToRGB(clBtnFace)) then Result := Color
+ else begin
+ Color := ColorToRGB(Color);
+ Index := Byte(Longint(Word(GetRValue(Color)) * 77 +
+ Word(GetGValue(Color)) * 150 + Word(GetBValue(Color)) * 29) shr 8);
+ Result := RGB(Index, Index, Index);
+ end;
+end;
+
+{$IFDEF WIN32}
+function TRxButtonGlyph.CreateImageGlyph(State: TRxButtonState;
+ Images: TImageList; Index: Integer): Integer;
+var
+ TmpImage, Mask: TBitmap;
+ IWidth, IHeight, X, Y: Integer;
+begin
+ if (State = rbsDown) then State := rbsUp;
+ Result := FIndexs[State];
+ if (Result <> -1) or (Images.Width = 0) or (Images.Height = 0) or
+ (Images.Count = 0) then Exit;
+ IWidth := Images.Width;
+ IHeight := Images.Height;
+ if FGlyphList = nil then begin
+ if GlyphCache = nil then GlyphCache := TGlyphCache.Create;
+ FGlyphList := GlyphCache.GetList(IWidth, IHeight);
+ end;
+ TmpImage := TBitmap.Create;
+ try
+ TmpImage.Width := IWidth;
+ TmpImage.Height := IHeight;
+ case State of
+ rbsUp, rbsDown, rbsExclusive:
+ begin
+ with TmpImage.Canvas do begin
+ FillRect(Rect(0, 0, IWidth, IHeight));
+ ImageList_Draw(Images.Handle, Index, Handle, 0, 0, ILD_NORMAL);
+ end;
+ Mask := TBitmap.Create;
+ try
+ with Mask do begin
+ Monochrome := True;
+ Height := IHeight;
+ Width := IWidth;
+ end;
+ with Mask.Canvas do begin
+ FillRect(Rect(0, 0, IWidth, IHeight));
+ ImageList_Draw(Images.Handle, Index, Handle, 0, 0, ILD_MASK);
+ end;
+ FIndexs[State] := TGlyphList(FGlyphList).Add(TmpImage, Mask);
+ finally
+ Mask.Free;
+ end;
+ end;
+ rbsDisabled:
+ begin
+ TmpImage.Canvas.Brush.Color := clBtnFace;
+ TmpImage.Canvas.FillRect(Rect(0, 0, IWidth, IHeight));
+ ImageListDrawDisabled(Images, TmpImage.Canvas, 0, 0, Index,
+ clBtnHighlight, clBtnShadow, True);
+ FIndexs[State] := TGlyphList(FGlyphList).AddMasked(TmpImage,
+ ColorToRGB(clBtnFace));
+ end;
+ rbsInactive:
+ begin
+ TmpImage.Canvas.Brush.Color := clBtnFace;
+ TmpImage.Canvas.FillRect(Rect(0, 0, IWidth, IHeight));
+ ImageList_Draw(Images.Handle, Index, TmpImage.Canvas.Handle, 0, 0,
+ ILD_NORMAL);
+ with TmpImage do begin
+ for X := 0 to Width - 1 do
+ for Y := 0 to Height - 1 do
+ Canvas.Pixels[X, Y] := MapColor(Canvas.Pixels[X, Y]);
+ end;
+ FIndexs[State] := TGlyphList(FGlyphList).AddMasked(TmpImage,
+ ColorToRGB(clBtnFace));
+ end;
+ end;
+ finally
+ TmpImage.Free;
+ end;
+ Result := FIndexs[State];
+end;
+{$ENDIF}
+
+function TRxButtonGlyph.CreateButtonGlyph(State: TRxButtonState): Integer;
+var
+ TmpImage, MonoBmp: TBitmap;
+ IWidth, IHeight, X, Y: Integer;
+ IRect, ORect: TRect;
+ I: TRxButtonState;
+begin
+ if (State = rbsDown) and (NumGlyphs < 3) then State := rbsUp;
+ Result := FIndexs[State];
+ if (Result <> -1) or (FOriginal.Width = 0) or (FOriginal.Height = 0) or
+ FOriginal.Empty then Exit;
+ IWidth := FOriginal.Width div FNumGlyphs;
+ IHeight := FOriginal.Height;
+ if FGlyphList = nil then begin
+ if GlyphCache = nil then GlyphCache := TGlyphCache.Create;
+ FGlyphList := GlyphCache.GetList(IWidth, IHeight);
+ end;
+ TmpImage := TBitmap.Create;
+ try
+ TmpImage.Width := IWidth;
+ TmpImage.Height := IHeight;
+ IRect := Rect(0, 0, IWidth, IHeight);
+ TmpImage.Canvas.Brush.Color := clBtnFace;
+ I := State;
+ if Ord(I) >= NumGlyphs then I := rbsUp;
+ ORect := Rect(Ord(I) * IWidth, 0, (Ord(I) + 1) * IWidth, IHeight);
+ case State of
+ rbsUp, rbsDown, rbsExclusive:
+ begin
+ TmpImage.Canvas.CopyRect(IRect, FOriginal.Canvas, ORect);
+ FIndexs[State] := TGlyphList(FGlyphList).AddMasked(TmpImage, FTransparentColor);
+ end;
+ rbsDisabled:
+ if NumGlyphs > 1 then begin
+ TmpImage.Canvas.CopyRect(IRect, FOriginal.Canvas, ORect);
+ FIndexs[State] := TGlyphList(FGlyphList).AddMasked(TmpImage, FTransparentColor);
+ end
+ else begin
+ MonoBmp := CreateDisabledBitmap(FOriginal, clBlack);
+ try
+ FIndexs[State] := TGlyphList(FGlyphList).AddMasked(MonoBmp,
+ ColorToRGB(clBtnFace));
+ finally
+ MonoBmp.Free;
+ end;
+ end;
+ rbsInactive:
+ if NumGlyphs > 4 then begin
+ TmpImage.Canvas.CopyRect(IRect, FOriginal.Canvas, ORect);
+ FIndexs[State] := TGlyphList(FGlyphList).AddMasked(TmpImage, FTransparentColor);
+ end
+ else begin
+ with TmpImage do begin
+ for X := 0 to Width - 1 do
+ for Y := 0 to Height - 1 do
+ Canvas.Pixels[X, Y] := MapColor(FOriginal.Canvas.Pixels[X, Y]);
+ end;
+ FIndexs[State] := TGlyphList(FGlyphList).AddMasked(TmpImage, FTransparentColor);
+ end;
+ end;
+ finally
+ TmpImage.Free;
+ end;
+ Result := FIndexs[State];
+ FOriginal.Dormant;
+end;
+
+procedure TRxButtonGlyph.DrawPopupMark(Canvas: TCanvas; X, Y: Integer;
+ State: TRxButtonState);
+var
+ AColor: TColor;
+
+ procedure DrawMark;
+ var
+ I: Integer;
+ begin
+ with Canvas do begin
+ for I := 0 to 6 do begin
+ Pixels[X + I, Y - 1] := AColor;
+ if (I > 0) and (I < 6) then begin
+ Pixels[X + I, Y] := AColor;
+ if (I > 1) and (I < 5) then Pixels[X + I, Y + 1] := AColor;
+ end;
+ end;
+ Pixels[X + 3, Y + 2] := AColor;
+ end;
+ end;
+
+begin
+ if State = rbsDisabled then begin
+ AColor := clBtnHighlight;
+ Inc(X, 1); Inc(Y, 1);
+ DrawMark;
+ Dec(X, 1); Dec(Y, 1);
+ AColor := clBtnShadow;
+ end
+ else AColor := clBtnText;
+ DrawMark;
+end;
+
+function TRxButtonGlyph.DrawButtonGlyph(Canvas: TCanvas; X, Y: Integer;
+ State: TRxButtonState): TPoint;
+var
+ Index: Integer;
+begin
+ Result := Point(0, 0);
+ if (FOriginal = nil) or (FOriginal.Width = 0) or (FOriginal.Height = 0) or
+ FOriginal.Empty then Exit;
+ Index := CreateButtonGlyph(State);
+ if Index >= 0 then begin
+{$IFDEF WIN32}
+ ImageList_Draw(FGlyphList.Handle, Index, Canvas.Handle, X, Y, ILD_NORMAL);
+{$ELSE}
+ FGlyphList.Draw(Canvas, X, Y, Index);
+{$ENDIF}
+ Result := Point(FGlyphList.Width, FGlyphList.Height);
+ end;
+end;
+
+{$IFDEF WIN32}
+function TRxButtonGlyph.DrawButtonImage(Canvas: TCanvas; X, Y: Integer;
+ Images: TImageList; ImageIndex: Integer; State: TRxButtonState): TPoint;
+var
+ Index: Integer;
+begin
+ Result := Point(0, 0);
+ if (Images = nil) or (ImageIndex < 0) or (ImageIndex >= Images.Count) then
+ Exit;
+ if State = rbsDisabled then begin
+ ImageListDrawDisabled(Images, Canvas, X, Y, ImageIndex, clBtnHighlight,
+ clBtnShadow, True);
+ end
+ else if State = rbsInactive then begin
+ Index := CreateImageGlyph(State, Images, ImageIndex);
+ if Index >= 0 then
+ ImageList_Draw(FGlyphList.Handle, Index, Canvas.Handle, X, Y, ILD_NORMAL);
+ end
+ else
+ ImageList_Draw(Images.Handle, ImageIndex, Canvas.Handle, X, Y, ILD_NORMAL);
+ Result := Point(Images.Width, Images.Height);
+end;
+{$ENDIF}
+
+procedure TRxButtonGlyph.MinimizeCaption(Canvas: TCanvas; const Caption: string;
+ Buffer: PChar; MaxLen, Width: Integer);
+var
+ I: Integer;
+{$IFNDEF WIN32}
+ P: PChar;
+{$ENDIF}
+ Lines: TStrings;
+begin
+ StrPLCopy(Buffer, Caption, MaxLen);
+ if FWordWrap then Exit;
+ Lines := TStringList.Create;
+ try
+{$IFDEF WIN32}
+ Lines.Text := Caption;
+ for I := 0 to Lines.Count - 1 do
+ Lines[I] := MinimizeText(Lines[I], Canvas, Width);
+ StrPLCopy(Buffer, TrimRight(Lines.Text), MaxLen);
+{$ELSE}
+ Lines.SetText(Buffer);
+ for I := 0 to Lines.Count - 1 do
+ Lines[I] := MinimizeText(Lines[I], Canvas, Width);
+ P := Lines.GetText;
+ try
+ StrPLCopy(Buffer, TrimRight(StrPas(P)), MaxLen);
+ finally
+ StrDispose(P);
+ end;
+{$ENDIF}
+ finally
+ Lines.Free;
+ end;
+end;
+
+procedure TRxButtonGlyph.DrawButtonText(Canvas: TCanvas; const Caption: string;
+ TextBounds: TRect; State: TRxButtonState; Flags: Word);
+var
+ CString: array[0..255] of Char;
+begin
+ Canvas.Brush.Style := bsClear;
+ StrPLCopy(CString, Caption, SizeOf(CString) - 1);
+ Flags := DT_VCENTER or WordWraps[FWordWrap] or Flags;
+ if State = rbsDisabled then begin
+ with Canvas do begin
+ OffsetRect(TextBounds, 1, 1);
+ Font.Color := clBtnHighlight;
+ DrawText(Handle, CString, Length(Caption), TextBounds, Flags);
+ OffsetRect(TextBounds, -1, -1);
+ Font.Color := clBtnShadow;
+ DrawText(Handle, CString, Length(Caption), TextBounds, Flags);
+ end;
+ end
+ else DrawText(Canvas.Handle, CString, -1, TextBounds, Flags);
+end;
+
+procedure TRxButtonGlyph.CalcButtonLayout(Canvas: TCanvas; const Client: TRect;
+ var Caption: string; Layout: TButtonLayout; Margin, Spacing: Integer;
+ PopupMark: Boolean; var GlyphPos: TPoint; var TextBounds: TRect; Flags: Word
+ {$IFDEF WIN32}; Images: TImageList; ImageIndex: Integer {$ENDIF});
+var
+ TextPos: TPoint;
+ MaxSize, ClientSize, GlyphSize, TextSize: TPoint;
+ TotalSize: TPoint;
+ CString: array[0..255] of Char;
+begin
+ { calculate the item sizes }
+ ClientSize := Point(Client.Right - Client.Left, Client.Bottom - Client.Top);
+{$IFDEF WIN32}
+ if Assigned(Images) and (Images.Width > 0) and (ImageIndex >= 0) and
+ (ImageIndex < Images.Count) then
+ GlyphSize := Point(Images.Width, Images.Height)
+ else
+{$ENDIF}
+ if FOriginal <> nil then
+ GlyphSize := Point(FOriginal.Width div FNumGlyphs, FOriginal.Height)
+ else GlyphSize := Point(0, 0);
+ if Layout in [blGlyphLeft, blGlyphRight] then begin
+ MaxSize.X := ClientSize.X - GlyphSize.X;
+ if Margin <> -1 then Dec(MaxSize.X, Margin);
+ if Spacing <> -1 then Dec(MaxSize.X, Spacing);
+ if PopupMark then Dec(MaxSize.X, 9);
+ MaxSize.Y := ClientSize.Y;
+ end
+ else { blGlyphTop, blGlyphBottom } begin
+ MaxSize.X := ClientSize.X;
+ MaxSize.Y := ClientSize.Y - GlyphSize.Y;
+ if Margin <> -1 then Dec(MaxSize.Y, Margin);
+ if Spacing <> -1 then Dec(MaxSize.Y, Spacing);
+ end;
+ MaxSize.X := Max(0, MaxSize.X);
+ MaxSize.Y := Max(0, MaxSize.Y);
+ MinimizeCaption(Canvas, Caption, CString, SizeOf(CString) - 1, MaxSize.X);
+ Caption := StrPas(CString);
+ if Length(Caption) > 0 then begin
+ TextBounds := Rect(0, 0, MaxSize.X, 0);
+ DrawText(Canvas.Handle, CString, -1, TextBounds, DT_CALCRECT or DT_CENTER
+ or DT_VCENTER or WordWraps[FWordWrap] or Flags);
+ end
+ else TextBounds := Rect(0, 0, 0, 0);
+ TextBounds.Bottom := Max(TextBounds.Top, TextBounds.Top +
+ Min(MaxSize.Y, HeightOf(TextBounds)));
+ TextBounds.Right := Max(TextBounds.Left, TextBounds.Left +
+ Min(MaxSize.X, WidthOf(TextBounds)));
+ TextSize := Point(TextBounds.Right - TextBounds.Left, TextBounds.Bottom -
+ TextBounds.Top);
+ if PopupMark then
+ if ((GlyphSize.X = 0) or (GlyphSize.Y = 0)) or (Layout = blGlyphLeft) then
+ Inc(TextSize.X, 9)
+ else if (GlyphSize.X > 0) then
+ Inc(GlyphSize.X, 6);
+ { If the layout has the glyph on the right or the left, then both the
+ text and the glyph are centered vertically. If the glyph is on the top
+ or the bottom, then both the text and the glyph are centered horizontally.}
+ if Layout in [blGlyphLeft, blGlyphRight] then begin
+ GlyphPos.Y := (ClientSize.Y div 2) - (GlyphSize.Y div 2);
+ TextPos.Y := (ClientSize.Y div 2) - (TextSize.Y div 2);
+ end
+ else begin
+ GlyphPos.X := (ClientSize.X div 2) - (GlyphSize.X div 2);
+ TextPos.X := (ClientSize.X div 2) - (TextSize.X div 2);
+ end;
+ { if there is no text or no bitmap, then Spacing is irrelevant }
+ if (TextSize.X = 0) or (GlyphSize.X = 0) then Spacing := 0;
+ { adjust Margin and Spacing }
+ if Margin = -1 then begin
+ if Spacing = -1 then begin
+ TotalSize := Point(GlyphSize.X + TextSize.X, GlyphSize.Y + TextSize.Y);
+ if Layout in [blGlyphLeft, blGlyphRight] then
+ Margin := (ClientSize.X - TotalSize.X) div 3
+ else Margin := (ClientSize.Y - TotalSize.Y) div 3;
+ Spacing := Margin;
+ end
+ else begin
+ TotalSize := Point(GlyphSize.X + Spacing + TextSize.X, GlyphSize.Y +
+ Spacing + TextSize.Y);
+ if Layout in [blGlyphLeft, blGlyphRight] then
+ Margin := (ClientSize.X div 2) - (TotalSize.X div 2)
+ else Margin := (ClientSize.Y div 2) - (TotalSize.Y div 2);
+ end;
+ end
+ else begin
+ if Spacing = -1 then begin
+ TotalSize := Point(ClientSize.X - (Margin + GlyphSize.X), ClientSize.Y -
+ (Margin + GlyphSize.Y));
+ if Layout in [blGlyphLeft, blGlyphRight] then
+ Spacing := (TotalSize.X div 2) - (TextSize.X div 2)
+ else Spacing := (TotalSize.Y div 2) - (TextSize.Y div 2);
+ end;
+ end;
+ case Layout of
+ blGlyphLeft:
+ begin
+ GlyphPos.X := Margin;
+ TextPos.X := GlyphPos.X + GlyphSize.X + Spacing;
+ end;
+ blGlyphRight:
+ begin
+ GlyphPos.X := ClientSize.X - Margin - GlyphSize.X;
+ TextPos.X := GlyphPos.X - Spacing - TextSize.X;
+ end;
+ blGlyphTop:
+ begin
+ GlyphPos.Y := Margin;
+ TextPos.Y := GlyphPos.Y + GlyphSize.Y + Spacing;
+ end;
+ blGlyphBottom:
+ begin
+ GlyphPos.Y := ClientSize.Y - Margin - GlyphSize.Y;
+ TextPos.Y := GlyphPos.Y - Spacing - TextSize.Y;
+ end;
+ end;
+ { fixup the result variables }
+ Inc(GlyphPos.X, Client.Left);
+ Inc(GlyphPos.Y, Client.Top);
+ OffsetRect(TextBounds, TextPos.X + Client.Left, TextPos.Y + Client.Top);
+end;
+
+{$IFDEF WIN32}
+function TRxButtonGlyph.Draw(Canvas: TCanvas; const Client: TRect;
+ const Caption: string; Layout: TButtonLayout; Margin, Spacing: Integer;
+ PopupMark: Boolean; State: TRxButtonState; Flags: Word): TRect;
+begin
+ Result := DrawEx(Canvas, Client, Caption, Layout, Margin, Spacing,
+ PopupMark, nil, -1, State, Flags);
+end;
+{$ENDIF}
+
+{$IFDEF WIN32}
+function TRxButtonGlyph.DrawEx(Canvas: TCanvas; const Client: TRect;
+ const Caption: string; Layout: TButtonLayout; Margin, Spacing: Integer;
+ PopupMark: Boolean; Images: TImageList; ImageIndex: Integer;
+ State: TRxButtonState; Flags: Word): TRect;
+{$ELSE}
+function TRxButtonGlyph.Draw(Canvas: TCanvas; const Client: TRect;
+ const Caption: string; Layout: TButtonLayout; Margin, Spacing: Integer;
+ PopupMark: Boolean; State: TRxButtonState; Flags: Word): TRect;
+{$ENDIF}
+var
+{$IFDEF WIN32}
+ UseImages: Boolean;
+{$ENDIF}
+ GlyphPos, PopupPos: TPoint;
+ TextBounds: TRect;
+ CaptionText: string;
+begin
+ CaptionText := Caption;
+ CalcButtonLayout(Canvas, Client, CaptionText, Layout, Margin, Spacing,
+ PopupMark, GlyphPos, TextBounds, Flags {$IFDEF WIN32}, Images,
+ ImageIndex {$ENDIF});
+{$IFDEF WIN32}
+ UseImages := False;
+ if Assigned(Images) and (ImageIndex >= 0) and (ImageIndex < Images.Count) and
+ (Images.Width > 0) then
+ begin
+ UseImages := True;
+ PopupPos := DrawButtonImage(Canvas, GlyphPos.X, GlyphPos.Y, Images,
+ ImageIndex, State);
+ end else
+{$ENDIF}
+ PopupPos := DrawButtonGlyph(Canvas, GlyphPos.X, GlyphPos.Y, State);
+ DrawButtonText(Canvas, CaptionText, TextBounds, State, Flags);
+ if PopupMark then
+ if (Layout <> blGlyphLeft) and (((FOriginal <> nil) and
+ (FOriginal.Width > 0)) {$IFDEF WIN32} or UseImages {$ENDIF}) then
+ begin
+ PopupPos.X := GlyphPos.X + PopupPos.X + 1;
+ PopupPos.Y := GlyphPos.Y + PopupPos.Y div 2;
+ DrawPopupMark(Canvas, PopupPos.X, PopupPos.Y, State);
+ end
+ else begin
+ if CaptionText <> '' then
+ PopupPos.X := TextBounds.Right + 3
+ else
+ PopupPos.X := (Client.Left + Client.Right - 7) div 2;
+ PopupPos.Y := TextBounds.Top + HeightOf(TextBounds) div 2;
+ DrawPopupMark(Canvas, PopupPos.X, PopupPos.Y, State);
+ end;
+ Result := TextBounds;
+end;
+
+const
+{$IFNDEF RX_D4}
+ Pattern: TBitmap = nil;
+{$ENDIF}
+ ButtonCount: Integer = 0;
+
+{ DrawButtonFrame - returns the remaining usable area inside the Client rect }
+
+function DrawButtonFrame(Canvas: TCanvas; const Client: TRect;
+ IsDown, IsFlat: Boolean; Style: TButtonStyle): TRect;
+var
+ NewStyle: Boolean;
+begin
+ Result := Client;
+ NewStyle := (Style = bsNew) or (NewStyleControls and (Style = bsAutoDetect));
+ if IsDown then begin
+ if NewStyle then begin
+ Frame3D(Canvas, Result, clWindowFrame, clBtnHighlight, 1);
+ if not IsFlat then
+ Frame3D(Canvas, Result, clBtnShadow, clBtnFace, 1);
+ end
+ else begin
+ if IsFlat then
+ Frame3D(Canvas, Result, clWindowFrame, clBtnHighlight, 1)
+ else begin
+ Frame3D(Canvas, Result, clWindowFrame, clWindowFrame, 1);
+ Canvas.Pen.Color := clBtnShadow;
+ Canvas.PolyLine([Point(Result.Left, Result.Bottom - 1),
+ Point(Result.Left, Result.Top), Point(Result.Right, Result.Top)]);
+ end;
+ end;
+ end
+ else begin
+ if NewStyle then begin
+ if IsFlat then
+ Frame3D(Canvas, Result, clBtnHighlight, clBtnShadow, 1)
+ else begin
+ Frame3D(Canvas, Result, clBtnHighlight, clWindowFrame, 1);
+ Frame3D(Canvas, Result, clBtnFace, clBtnShadow, 1);
+ end;
+ end
+ else begin
+ if IsFlat then
+ Frame3D(Canvas, Result, clBtnHighlight, clWindowFrame, 1)
+ else begin
+ Frame3D(Canvas, Result, clWindowFrame, clWindowFrame, 1);
+ Frame3D(Canvas, Result, clBtnHighlight, clBtnShadow, 1);
+ end;
+ end;
+ end;
+ InflateRect(Result, -1, -1);
+end;
+
+{ TButtonImage }
+
+constructor TButtonImage.Create;
+begin
+ FGlyph := TRxButtonGlyph.Create;
+ NumGlyphs := 1;
+ FButtonSize := Point(24, 23);
+end;
+
+destructor TButtonImage.Destroy;
+begin
+ FGlyph.Free;
+ inherited Destroy;
+end;
+
+procedure TButtonImage.Invalidate;
+begin
+ TRxButtonGlyph(FGlyph).Invalidate;
+end;
+
+function TButtonImage.GetNumGlyphs: TRxNumGlyphs;
+begin
+ Result := TRxButtonGlyph(FGlyph).NumGlyphs;
+end;
+
+procedure TButtonImage.SetNumGlyphs(Value: TRxNumGlyphs);
+begin
+ TRxButtonGlyph(FGlyph).NumGlyphs := Value;
+end;
+
+function TButtonImage.GetWordWrap: Boolean;
+begin
+ Result := TRxButtonGlyph(FGlyph).WordWrap;
+end;
+
+procedure TButtonImage.SetWordWrap(Value: Boolean);
+begin
+ TRxButtonGlyph(FGlyph).WordWrap := Value;
+end;
+
+function TButtonImage.GetGlyph: TBitmap;
+begin
+ Result := TRxButtonGlyph(FGlyph).Glyph;
+end;
+
+procedure TButtonImage.SetGlyph(Value: TBitmap);
+begin
+ TRxButtonGlyph(FGlyph).Glyph := Value;
+end;
+
+function TButtonImage.GetAlignment: TAlignment;
+begin
+ Result := TRxButtonGlyph(FGlyph).Alignment;
+end;
+
+procedure TButtonImage.SetAlignment(Value: TAlignment);
+begin
+ TRxButtonGlyph(FGlyph).Alignment := Value;
+end;
+
+{$IFDEF WIN32}
+procedure TButtonImage.Draw(Canvas: TCanvas; X, Y, Margin, Spacing: Integer;
+ Layout: TButtonLayout; AFont: TFont; Flags: Word);
+begin
+ DrawEx(Canvas, X, Y, Margin, Spacing, Layout, AFont, nil, -1, Flags);
+end;
+{$ENDIF}
+
+{$IFDEF WIN32}
+procedure TButtonImage.DrawEx(Canvas: TCanvas; X, Y, Margin, Spacing: Integer;
+ Layout: TButtonLayout; AFont: TFont; Images: TImageList; ImageIndex: Integer;
+ Flags: Word);
+{$ELSE}
+procedure TButtonImage.Draw(Canvas: TCanvas; X, Y, Margin, Spacing: Integer;
+ Layout: TButtonLayout; AFont: TFont; Flags: Word);
+{$ENDIF}
+var
+ Target: TRect;
+ SaveColor: Integer;
+ SaveFont: TFont;
+begin
+ SaveColor := Canvas.Brush.Color;
+ SaveFont := TFont.Create;
+ SaveFont.Assign(Canvas.Font);
+ try
+ Target := Bounds(X, Y, FButtonSize.X, FButtonSize.Y);
+ Canvas.Brush.Color := clBtnFace;
+ Canvas.FillRect(Target);
+ Frame3D(Canvas, Target, clBtnShadow, clWindowFrame, 1);
+ Frame3D(Canvas, Target, clBtnHighlight, clBtnShadow, 1);
+ if AFont <> nil then Canvas.Font := AFont;
+{$IFDEF WIN32}
+ TRxButtonGlyph(FGlyph).DrawEx(Canvas, Target, Caption, Layout, Margin,
+ Spacing, False, Images, ImageIndex, rbsUp, Flags);
+{$ELSE}
+ TRxButtonGlyph(FGlyph).Draw(Canvas, Target, Caption, Layout, Margin,
+ Spacing, False, rbsUp, Flags);
+{$ENDIF}
+ finally
+ Canvas.Font.Assign(SaveFont);
+ SaveFont.Free;
+ Canvas.Brush.Color := SaveColor;
+ end;
+end;
+
+{$ENDIF RX_D4}
+
+{$IFDEF WIN32}
+initialization
+ FCheckBitmap := nil;
+finalization
+ DestroyLocals;
+{$ELSE}
+initialization
+ FCheckBitmap := nil;
+ AddExitProc(DestroyLocals);
+{$ENDIF}
+*)
+
+{ TRxSpeedButton }
+
+procedure TRxSpeedButton.SetAllowTimer(const AValue: Boolean);
+begin
+ if FAllowTimer=AValue then exit;
+ FAllowTimer:=AValue;
+ if not FAllowTimer and (FRepeatTimer <> nil) then
+ begin
+ FRepeatTimer.Enabled := False;
+ FRepeatTimer.Free;
+ FRepeatTimer := nil;
+ end;
+end;
+
+procedure TRxSpeedButton.TimerExpired(Sender: TObject);
+begin
+ FRepeatTimer.Interval := RepeatInterval;
+ if (FState = bsDown) and MouseCapture then
+ try
+ Click;
+ except
+ FRepeatTimer.Enabled := False;
+ raise;
+ end;
+end;
+
+procedure TRxSpeedButton.MouseDown(Button: TMouseButton; Shift: TShiftState; X,
+ Y: Integer);
+begin
+ inherited MouseDown(Button, Shift, X, Y);
+ if (Button = mbLeft) and Enabled then
+ begin
+ if FAllowTimer then begin
+ if FRepeatTimer = nil then
+ FRepeatTimer := TTimer.Create(nil);
+ FRepeatTimer.Interval := InitPause;
+ FRepeatTimer.OnTimer := @TimerExpired;
+ FRepeatTimer.Enabled := True;
+ end;
+ end;
+end;
+
+procedure TRxSpeedButton.MouseUp(Button: TMouseButton; Shift: TShiftState; X,
+ Y: Integer);
+begin
+ inherited MouseUp(Button, Shift, X, Y);
+ if FRepeatTimer <> nil then FRepeatTimer.Enabled := False;
+end;
+
+constructor TRxSpeedButton.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FInitRepeatPause := 500;
+ FRepeatPause := 100;
+end;
+
+destructor TRxSpeedButton.Destroy;
+begin
+ inherited Destroy;
+ if FRepeatTimer <> nil then FRepeatTimer.Free;
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxcustomchartpanel.pas b/components/rx/version/v2.2_laz_1.2/rxcustomchartpanel.pas
new file mode 100644
index 000000000..035f79132
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxcustomchartpanel.pas
@@ -0,0 +1,318 @@
+{ rxcustomchartpanel unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit rxcustomchartpanel;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls;
+
+type
+ TRxCustomChart = class;
+ TRxChartSeriesItem = class;
+
+ { TRxChartValuesItem }
+
+ TRxChartValuesItem = class(TCollectionItem)
+ private
+ FCaption: string;
+ FColor: TColor;
+ FVisible: boolean;
+ FLabel:double;
+ procedure SetCaption(const AValue: string);
+ procedure SetColor(const AValue: TColor);
+ procedure SetVisible(const AValue: boolean);
+ protected
+ function GetDisplayName: string; override;
+ public
+ constructor Create(ACollection: TCollection); override;
+ destructor Destroy; override;
+ published
+ property Caption:string read FCaption write SetCaption;
+ property Color:TColor read FColor write SetColor;
+ property Visible:boolean read FVisible write SetVisible;
+ property LabelAsFloat:double read FLabel write FLabel;
+ property LabelAsDateTime:TDateTime read FLabel write FLabel;
+ end;
+
+ { TRxChartValues }
+
+ TRxChartValues = class(TCollection)
+ private
+ FRxChartSeriesItem:TRxChartSeriesItem;
+ public
+ constructor Create(ARxChartSeriesItem:TRxChartSeriesItem);
+ end;
+
+ { TRxChartSeriesItem }
+
+ TRxChartSeriesItem = class(TCollectionItem)
+ private
+ FCaption: string;
+ FColor: TColor;
+ FVisible: boolean;
+ FChartValues:TRxChartValues;
+ function GetItems: TRxChartValues;
+ procedure SetCaption(const AValue: string);
+ procedure SetColor(const AValue: TColor);
+ procedure SetItems(const AValue: TRxChartValues);
+ procedure SetVisible(const AValue: boolean);
+ protected
+ function GetDisplayName: string; override;
+ public
+ constructor Create(ACollection: TCollection); override;
+ destructor Destroy; override;
+ published
+ property Values:TRxChartValues read GetItems write SetItems;
+ property Caption:string read FCaption write SetCaption;
+ property Color:TColor read FColor write SetColor;
+ property Visible:boolean read FVisible write SetVisible;
+ end;
+
+ { TRxChartSeries }
+
+ TRxChartSeries = class(TCollection)
+ private
+ FChart:TRxCustomChart;
+ function GetToolbarItem(Index: Integer): TRxChartSeriesItem;
+ procedure SetToolbarItem(Index: Integer; const AValue: TRxChartSeriesItem);
+ public
+ constructor Create(AChart:TRxCustomChart);
+ property Items[Index: Integer]: TRxChartSeriesItem read GetToolbarItem write SetToolbarItem; default;
+ published
+ end;
+
+ { TRxCustomChart }
+
+ TRxCustomChart = class(TCustomPanel)
+ private
+ FChartSeries:TRxChartSeries;
+ function GetItems: TRxChartSeries;
+ procedure SetItems(const AValue: TRxChartSeries);
+ { Private declarations }
+ protected
+ property ChartSeries:TRxChartSeries read GetItems write SetItems;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ published
+ { Published declarations }
+ end;
+
+ TRxChart = class(TRxCustomChart)
+ published
+ property ChartSeries;
+
+ property Align;
+ property Alignment;
+ property Anchors;
+ property AutoSize;
+ property BorderSpacing;
+ property BevelInner;
+ property BevelOuter;
+ property BevelWidth;
+ property BorderWidth;
+ property BorderStyle;
+ property Caption;
+ property Constraints;
+ property DragMode;
+ property Enabled;
+ property Font;
+ property FullRepaint;
+ property ParentColor;
+ property ParentFont;
+ property ParentShowHint;
+ property PopupMenu;
+ property ShowHint;
+ property TabOrder;
+ property TabStop;
+ property Visible;
+ property OnClick;
+ property OnDblClick;
+ property OnDragDrop;
+ property OnDragOver;
+ property OnEndDrag;
+ property OnEnter;
+ property OnExit;
+ property OnMouseDown;
+ property OnMouseMove;
+ property OnMouseUp;
+ property OnResize;
+ property OnStartDrag;
+ end;
+
+implementation
+
+
+
+{ TRxChartSeriesItem }
+
+procedure TRxChartSeriesItem.SetCaption(const AValue: string);
+begin
+ if FCaption=AValue then exit;
+ FCaption:=AValue;
+end;
+
+function TRxChartSeriesItem.GetItems: TRxChartValues;
+begin
+ Result:=FChartValues;
+end;
+
+procedure TRxChartSeriesItem.SetColor(const AValue: TColor);
+begin
+ if FColor=AValue then exit;
+ FColor:=AValue;
+end;
+
+procedure TRxChartSeriesItem.SetItems(const AValue: TRxChartValues);
+begin
+ FChartValues.Assign(AValue);
+end;
+
+procedure TRxChartSeriesItem.SetVisible(const AValue: boolean);
+begin
+ if FVisible=AValue then exit;
+ FVisible:=AValue;
+end;
+
+function TRxChartSeriesItem.GetDisplayName: string;
+begin
+ if FCaption<>'' then
+ Result:=FCaption
+ else
+ Result:=inherited GetDisplayName;
+end;
+
+constructor TRxChartSeriesItem.Create(ACollection: TCollection);
+begin
+ inherited Create(ACollection);
+ FChartValues:=TRxChartValues.Create(Self);
+end;
+
+destructor TRxChartSeriesItem.Destroy;
+begin
+ FreeAndNil(FChartValues);
+ inherited Destroy;
+end;
+
+{ TRxChartSeries }
+
+function TRxChartSeries.GetToolbarItem(Index: Integer): TRxChartSeriesItem;
+begin
+ result := TRxChartSeriesItem( inherited Items[Index] );
+end;
+
+procedure TRxChartSeries.SetToolbarItem(Index: Integer;
+ const AValue: TRxChartSeriesItem);
+begin
+ Items[Index].Assign( AValue );
+end;
+
+constructor TRxChartSeries.Create(AChart: TRxCustomChart);
+begin
+ inherited Create(TRxChartSeriesItem);
+ FChart:=AChart;
+end;
+
+{ TRxCustomChart }
+
+function TRxCustomChart.GetItems: TRxChartSeries;
+begin
+ Result:=FChartSeries;
+end;
+
+procedure TRxCustomChart.SetItems(const AValue: TRxChartSeries);
+begin
+ FChartSeries.Assign(AValue);
+end;
+
+constructor TRxCustomChart.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FChartSeries:=TRxChartSeries.Create(Self);
+end;
+
+destructor TRxCustomChart.Destroy;
+begin
+ FreeAndNil(FChartSeries);
+ inherited Destroy;
+end;
+
+{ TRxChartValues }
+
+constructor TRxChartValues.Create(ARxChartSeriesItem: TRxChartSeriesItem);
+begin
+ inherited Create(TRxChartValuesItem);
+ FRxChartSeriesItem := ARxChartSeriesItem;
+end;
+
+{ TRxChartValuesItem }
+
+procedure TRxChartValuesItem.SetCaption(const AValue: string);
+begin
+ if FCaption=AValue then exit;
+ FCaption:=AValue;
+end;
+
+procedure TRxChartValuesItem.SetColor(const AValue: TColor);
+begin
+ if FColor=AValue then exit;
+ FColor:=AValue;
+end;
+
+procedure TRxChartValuesItem.SetVisible(const AValue: boolean);
+begin
+ if FVisible=AValue then exit;
+ FVisible:=AValue;
+end;
+
+function TRxChartValuesItem.GetDisplayName: string;
+begin
+ if FCaption<>'' then
+ Result:=FCaption
+ else
+ Result:=inherited GetDisplayName;
+end;
+
+constructor TRxChartValuesItem.Create(ACollection: TCollection);
+begin
+ inherited Create(ACollection);
+end;
+
+destructor TRxChartValuesItem.Destroy;
+begin
+ inherited Destroy;
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxdaterangeeditunit.pas b/components/rx/version/v2.2_laz_1.2/rxdaterangeeditunit.pas
new file mode 100644
index 000000000..1d3838592
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxdaterangeeditunit.pas
@@ -0,0 +1,491 @@
+unit rxDateRangeEditUnit;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, types, Controls, Buttons, StdCtrls, Spin;
+
+type
+ TRxDateRangeEditOption = (reoMonth, reoQuarter, reoHalfYear);
+ TRxDateRangeEditOptions = set of TRxDateRangeEditOption;
+
+type
+
+ { TRxCustomDateRangeEdit }
+
+ TRxCustomDateRangeEdit = class(TCustomControl)
+ private
+ FFlat: Boolean;
+ FOnEditChange: TNotifyEvent;
+ FOnEditClick: TNotifyEvent;
+ FOnEditEnter: TNotifyEvent;
+ FOnEditExit: TNotifyEvent;
+ FOptions: TRxDateRangeEditOptions;
+ FsbDecYear: TSpeedButton;
+ FsbDecMonth: TSpeedButton;
+ FsbIncYear: TSpeedButton;
+ FsbIncMonth: TSpeedButton;
+ FEditYear: TSpinEdit;
+ FEditMonth: TComboBox;
+ procedure DoIncMonth(Sender: TObject);
+ procedure DoIncYear(Sender: TObject);
+ procedure DoDecMonth(Sender: TObject);
+ procedure DoDecYear(Sender: TObject);
+ function GetHalfYear: word;
+ function GetMonth: word;
+ function GetPeriod: TDateTime;
+ function GetPeriodEnd: TDateTime;
+ function GetQuarter: word;
+ function GetYear: word;
+ procedure SetFlat(AValue: Boolean);
+ procedure SetHalfYear(AValue: word);
+ procedure SetMonth(AValue: word);
+ procedure SetOptions(AValue: TRxDateRangeEditOptions);
+ procedure SetPeriod(AValue: TDateTime);
+ procedure SetQuarter(AValue: word);
+ procedure SetYear(AValue: word);
+ procedure InternalOnEditChange(Sender: TObject);
+ procedure InternalOnEditClick(Sender: TObject);
+ procedure InternalOnEditEnter(Sender: TObject);
+ procedure InternalOnEditExit(Sender: TObject);
+ protected
+ class function GetControlClassDefaultSize: TSize; override;
+ procedure FillMonthNames;
+ procedure SetAutoSize(AValue: Boolean); override;
+ procedure EditChange; virtual;
+ procedure EditClick; virtual;
+ procedure EditEnter; virtual;
+ procedure EditExit; virtual;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+
+ property Quarter:word read GetQuarter write SetQuarter;
+ property HalfYear:word read GetHalfYear write SetHalfYear;
+ property Flat: Boolean read FFlat write SetFlat default False;
+ property Year:word read GetYear write SetYear;
+ property Month:word read GetMonth write SetMonth;
+ property Period:TDateTime read GetPeriod write SetPeriod;
+ property PeriodEnd:TDateTime read GetPeriodEnd;
+ property Options:TRxDateRangeEditOptions read FOptions write SetOptions default [reoMonth];
+ property OnChange: TNotifyEvent read FOnEditChange write FOnEditChange;
+ property OnClick: TNotifyEvent read FOnEditClick write FOnEditClick;
+ property OnEnter: TNotifyEvent read FOnEditEnter write FOnEditEnter;
+ property OnExit: TNotifyEvent read FOnEditExit write FOnEditExit;
+ end;
+
+type
+ TRxDateRangeEdit = class(TRxCustomDateRangeEdit)
+ published
+ property Align;
+ property Anchors;
+ property Autosize default True;
+ property BiDiMode;
+ property BorderSpacing;
+ property BorderStyle default bsNone;
+ property Color;
+ property Constraints;
+ property Cursor;
+ property Enabled;
+ property Flat;
+ property Hint;
+ property Month;
+ property Options;
+ property ParentBiDiMode;
+ property ParentColor;
+ property ParentFont;
+ property PopupMenu;
+ property ShowHint;
+ property TabOrder;
+ property TabStop;
+ property Visible;
+ property Year;
+
+ property OnChange;
+ property OnClick;
+ property OnEnter;
+ property OnExit;
+ property OnMouseWheel;
+ property OnMouseWheelDown;
+ property OnMouseWheelUp;
+ end;
+
+implementation
+uses dateutil, rxconst;
+
+{ TRxCustomDateRangeEdit }
+
+procedure TRxCustomDateRangeEdit.DoIncMonth(Sender: TObject);
+var
+ i:integer;
+begin
+ if FEditMonth.ItemIndex>=0 then
+ begin
+ i:=PtrInt(FEditMonth.Items.Objects[FEditMonth.ItemIndex]);
+
+ if I in [17, 18] then
+ begin
+ if i = 18 then
+ begin
+ i:=17;
+ Year:=Year + 1;
+ end
+ else
+ i:=18;
+ end
+ else
+ if i in [13..16] then
+ begin
+ inc(i);
+ if i> 16 then
+ begin
+ i:=13;
+ Year:=Year + 1;
+ end;
+ end
+ else
+ begin
+ inc(i);
+ if i > 12 then
+ begin
+ i:=1;
+ Year:=Year + 1;
+ end;
+ end;
+ FEditMonth.ItemIndex := i - 1;
+ end
+ else
+ FEditMonth.ItemIndex := 0;
+end;
+
+procedure TRxCustomDateRangeEdit.DoIncYear(Sender: TObject);
+begin
+ FEditYear.Value:=FEditYear.Value + 1;
+end;
+
+procedure TRxCustomDateRangeEdit.DoDecMonth(Sender: TObject);
+var
+ i:integer;
+begin
+ if FEditMonth.ItemIndex>=0 then
+ begin
+ i:=PtrInt(FEditMonth.Items.Objects[FEditMonth.ItemIndex]);
+
+ if I in [17, 18] then
+ begin
+ if i = 18 then
+ begin
+ i:=17;
+ Year:=Year - 1;
+ end
+ else
+ i:=18;
+ end
+ else
+ if i in [13..16] then
+ begin
+ Dec(i);
+ if i> 13 then
+ begin
+ i:=16;
+ Year:=Year - 1;
+ end;
+ end
+ else
+ begin
+ Dec(i);
+ if i < 1 then
+ begin
+ i:=12;
+ Year:=Year - 1;
+ end;
+ end;
+ FEditMonth.ItemIndex := i - 1;
+ end
+ else
+ FEditMonth.ItemIndex := 0;
+end;
+
+procedure TRxCustomDateRangeEdit.DoDecYear(Sender: TObject);
+begin
+ FEditYear.Value:=FEditYear.Value - 1;
+end;
+
+function TRxCustomDateRangeEdit.GetHalfYear: word;
+var
+ i:integer;
+begin
+ Result:=0;
+ if reoHalfYear in FOptions then
+ begin
+ i:=PtrInt(FEditMonth.Items.Objects[FEditMonth.ItemIndex]);
+ if i in [17..18] then
+ Result:=i - 16;
+ end
+end;
+
+function TRxCustomDateRangeEdit.GetMonth: word;
+var
+ i:integer;
+begin
+ Result:=0;
+ if (reoMonth in FOptions) or (FOptions = []) then
+ begin
+ i:=PtrInt(FEditMonth.Items.Objects[FEditMonth.ItemIndex]);
+ if i in [1..12] then
+ Result:=i;
+ end
+end;
+
+function TRxCustomDateRangeEdit.GetPeriod: TDateTime;
+begin
+ Result:=EncodeDate(Year, Month, 1);
+end;
+
+function TRxCustomDateRangeEdit.GetPeriodEnd: TDateTime;
+begin
+ Result:=EncodeDate(Year, Month, DaysPerMonth(Year, Month));
+end;
+
+function TRxCustomDateRangeEdit.GetQuarter: word;
+var
+ i:integer;
+begin
+ Result:=0;
+ if reoQuarter in FOptions then
+ begin
+ i:=PtrInt(FEditMonth.Items.Objects[FEditMonth.ItemIndex]);
+ if i in [13..16] then
+ Result:=i - 12;
+ end
+end;
+
+function TRxCustomDateRangeEdit.GetYear: word;
+begin
+ Result:=FEditYear.Value;
+end;
+
+procedure TRxCustomDateRangeEdit.SetFlat(AValue: Boolean);
+begin
+ if FFlat=AValue then Exit;
+ FFlat:=AValue;
+ FsbDecMonth.Flat:=FFlat;
+ FsbDecYear.Flat:=FFlat;
+ FsbIncMonth.Flat:=FFlat;
+ FsbIncYear.Flat:=FFlat;
+end;
+
+procedure TRxCustomDateRangeEdit.SetHalfYear(AValue: word);
+begin
+
+end;
+
+procedure TRxCustomDateRangeEdit.SetMonth(AValue: word);
+begin
+ if (AValue>0) and (AValue < 13) then
+ FEditMonth.ItemIndex:=AValue-1;
+end;
+
+procedure TRxCustomDateRangeEdit.SetOptions(AValue: TRxDateRangeEditOptions);
+begin
+ if FOptions=AValue then Exit;
+ FOptions:=AValue;
+ FillMonthNames;
+end;
+
+procedure TRxCustomDateRangeEdit.SetPeriod(AValue: TDateTime);
+var
+ Y, M, D: word;
+begin
+ DecodeDate(AValue, Y, M, D);
+ FEditMonth.ItemIndex:=M-1;
+ FEditYear.Value:=Y;
+end;
+
+procedure TRxCustomDateRangeEdit.SetQuarter(AValue: word);
+begin
+
+end;
+
+procedure TRxCustomDateRangeEdit.SetYear(AValue: word);
+begin
+ FEditYear.Value:=AValue;
+end;
+
+procedure TRxCustomDateRangeEdit.InternalOnEditChange(Sender: TObject);
+begin
+ EditChange;
+end;
+
+procedure TRxCustomDateRangeEdit.InternalOnEditClick(Sender: TObject);
+begin
+ EditClick;
+end;
+
+procedure TRxCustomDateRangeEdit.InternalOnEditEnter(Sender: TObject);
+begin
+ EditEnter;
+end;
+
+procedure TRxCustomDateRangeEdit.InternalOnEditExit(Sender: TObject);
+begin
+ EditExit;
+end;
+
+class function TRxCustomDateRangeEdit.GetControlClassDefaultSize: TSize;
+begin
+ Result.CX := 80 + 70 + 23 * 4;
+ Result.CY := 23;
+end;
+
+procedure TRxCustomDateRangeEdit.FillMonthNames;
+var
+ i, k: Integer;
+begin
+ FEditMonth.Items.BeginUpdate;
+ FEditMonth.Items.Clear;
+ if (reoMonth in FOptions) or (FOptions = []) then
+ begin
+ for i:=1 to 12 do
+ begin
+ k:=FEditMonth.Items.Add(DefaultFormatSettings.LongMonthNames[i]);
+ FEditMonth.Items.Objects[K]:=TObject(Pointer(i));
+ end;
+ end;
+
+ if (reoQuarter in FOptions) or (FOptions = []) then
+ begin
+ k:=FEditMonth.Items.Add(sFirstQuarter);
+ FEditMonth.Items.Objects[K]:=TObject(Pointer(13));
+ k:=FEditMonth.Items.Add(sSecondQuarter);
+ FEditMonth.Items.Objects[K]:=TObject(Pointer(14));
+ k:=FEditMonth.Items.Add(sThirdQuarter);
+ FEditMonth.Items.Objects[K]:=TObject(Pointer(15));
+ k:=FEditMonth.Items.Add(sFourthQuarter);
+ FEditMonth.Items.Objects[K]:=TObject(Pointer(16));
+ end;
+
+ if (reoHalfYear in FOptions) or (FOptions = []) then
+ begin
+ k:=FEditMonth.Items.Add(sFirstHalfOfYear);
+ FEditMonth.Items.Objects[K]:=TObject(Pointer(17));
+ k:=FEditMonth.Items.Add(sSecondHalfOfYear);
+ FEditMonth.Items.Objects[K]:=TObject(Pointer(18));
+ end;
+ FEditMonth.ItemIndex:=0;
+ FEditMonth.Items.EndUpdate;
+end;
+
+procedure TRxCustomDateRangeEdit.SetAutoSize(AValue: Boolean);
+begin
+ if AutoSize = AValue then
+ Exit;
+ inherited SetAutosize(AValue);
+ FEditMonth.AutoSize := AValue;
+ FEditYear.AutoSize := AValue;
+end;
+
+procedure TRxCustomDateRangeEdit.EditChange;
+begin
+ if Assigned(FOnEditChange) then FOnEditChange(Self);
+end;
+
+procedure TRxCustomDateRangeEdit.EditClick;
+begin
+ if Assigned(FOnEditClick) then FOnEditClick(Self);
+end;
+
+procedure TRxCustomDateRangeEdit.EditEnter;
+begin
+ if Assigned(FOnEditEnter) then FOnEditEnter(Self);
+end;
+
+procedure TRxCustomDateRangeEdit.EditExit;
+begin
+ if Assigned(FOnEditExit) then FOnEditExit(Self);
+end;
+
+constructor TRxCustomDateRangeEdit.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FOptions:=[reoMonth];
+
+ FEditYear:=TSpinEdit.Create(Self);
+ FEditMonth:=TComboBox.Create(Self);
+ FEditMonth.Style:=csDropDownList;
+ FEditMonth.DropDownCount:=12;
+ FEditYear.Width:=70;
+ FEditMonth.Width:=100;
+
+ FsbDecYear:=TSpeedButton.Create(Self);
+ FsbDecMonth:=TSpeedButton.Create(Self);
+ FsbIncYear:=TSpeedButton.Create(Self);
+ FsbIncMonth:=TSpeedButton.Create(Self);
+
+ FsbDecYear.OnClick:=@DoDecYear;
+ FsbDecMonth.OnClick:=@DoDecMonth;
+ FsbIncYear.OnClick:=@DoIncYear;
+ FsbIncMonth.OnClick:=@DoIncMonth;
+
+
+ FEditYear.Parent:=Self;
+ FsbDecYear.Parent:=Self;
+ FsbDecMonth.Parent:=Self;
+ FsbIncYear.Parent:=Self;
+ FsbIncMonth.Parent:=Self;
+ FEditMonth.Parent:=Self;
+
+ FsbDecYear.Caption:='<<';
+ FsbDecMonth.Caption:='<';
+ FsbIncYear.Caption:='>>';
+ FsbIncMonth.Caption:='>';
+
+ FsbDecYear.Left:=0;
+ FsbDecMonth.Left:=23;
+ FEditMonth.Left:=46;
+ FEditYear.Left:=126;
+ FsbIncMonth.Left:=206;
+ FsbIncYear.Left:=229;
+
+
+ ControlStyle := ControlStyle + [csNoFocus];
+
+
+ FsbDecYear.Align:=alLeft;
+ FsbDecMonth.Align:=alLeft;
+ FsbIncYear.Align:=alRight;
+ FsbIncMonth.Align:=alRight;
+
+ FEditYear.Align:=alRight;
+ FEditMonth.Align:=alClient;
+
+ FEditYear.MaxValue:=9999;
+ with GetControlClassDefaultSize do
+ SetInitialBounds(0, 0, CX, CY);
+ FillMonthNames;
+
+ SetPeriod(Now);
+ AutoSize := True;
+
+ FEditMonth.OnChange:=@InternalOnEditChange;
+ FEditYear.OnChange:=@InternalOnEditChange;
+
+ FEditMonth.OnClick:=@InternalOnEditClick;
+ FEditYear.OnClick:=@InternalOnEditClick;
+
+ FEditMonth.OnEnter:=@InternalOnEditEnter;
+ FEditYear.OnEnter:=@InternalOnEditEnter;
+
+ FEditMonth.OnExit:=@InternalOnEditExit;
+ FEditYear.OnExit:=@InternalOnEditExit;
+end;
+
+destructor TRxCustomDateRangeEdit.Destroy;
+begin
+ inherited Destroy;
+end;
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/rxdbcolorbox.pas b/components/rx/version/v2.2_laz_1.2/rxdbcolorbox.pas
new file mode 100644
index 000000000..f5b4a8179
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxdbcolorbox.pas
@@ -0,0 +1,363 @@
+{ RxDBColorBox unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit RxDBColorBox;
+
+{$I rx.inc}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ColorBox,
+ DbCtrls, DB, LMessages, LCLType;
+
+type
+
+ { TRxCustomDBColorBox }
+
+ TRxCustomDBColorBox = class(TCustomColorBox)
+ FDataLink: TFieldDataLink;
+
+ procedure DataChange(Sender: TObject);
+ function GetDataField: string;
+ function GetDataSource: TDataSource;
+ function GetField: TField;
+ function GetReadOnly: Boolean;
+ procedure SetDataField(const AValue: string);
+ procedure SetDataSource(const AValue: TDataSource);
+ procedure SetReadOnly(const AValue: Boolean);
+ procedure UpdateData(Sender: TObject);
+ procedure FocusRequest(Sender: TObject);
+ procedure ActiveChange(Sender: TObject);
+ procedure LayoutChange(Sender: TObject);
+ procedure CMGetDataLink(var Message: TLMessage); message CM_GETDATALINK;
+ function IsReadOnly: boolean;
+ protected
+ property DataField: string read GetDataField write SetDataField;
+ property DataSource: TDataSource read GetDataSource write SetDataSource;
+ property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
+
+ procedure KeyDown(var Key: Word; Shift: TShiftState); override;
+ procedure Change; override;
+
+ procedure Loaded; override;
+ procedure Notification(AComponent: TComponent;
+ Operation: TOperation); override;
+ procedure WMSetFocus(var Message: TLMSetFocus); message LM_SETFOCUS;
+ procedure WMKillFocus(var Message: TLMKillFocus); message LM_KILLFOCUS;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ property Field: TField read GetField;
+ published
+ { Published declarations }
+ end;
+
+ TRxDBColorBox = class(TRxCustomDBColorBox)
+ private
+ { Private declarations }
+ protected
+ { Protected declarations }
+ public
+ { Public declarations }
+ published
+ property DataField;
+ property DataSource;
+ property ReadOnly;
+
+ property DefaultColorColor;
+ property NoneColorColor;
+ property Selected;
+ property Style;
+ property OnGetColors;
+
+ property Align;
+ property Anchors;
+ property ArrowKeysTraverseList;
+ property AutoComplete;
+ property AutoCompleteText;
+ property AutoDropDown;
+ property AutoSelect;
+ property AutoSize;
+ property BidiMode;
+ property BorderSpacing;
+ property Color;
+ property Constraints;
+ property DragCursor;
+ property DragMode;
+ property DropDownCount;
+ property Enabled;
+ property Font;
+ property ItemHeight;
+ property ItemWidth;
+ property OnChange;
+ property OnChangeBounds;
+ property OnClick;
+ property OnCloseUp;
+ property OnContextPopup;
+ property OnDblClick;
+ property OnDragDrop;
+ property OnDragOver;
+ property OnEndDrag;
+ property OnDropDown;
+ property OnEditingDone;
+ property OnEnter;
+ property OnExit;
+ property OnKeyDown;
+ property OnKeyPress;
+ property OnKeyUp;
+ property OnMouseDown;
+ property OnMouseEnter;
+ property OnMouseLeave;
+ property OnMouseMove;
+ property OnMouseUp;
+ property OnMouseWheel;
+ property OnMouseWheelDown;
+ property OnMouseWheelUp;
+ property OnStartDrag;
+ property OnSelect;
+ property OnUTF8KeyPress;
+ property ParentBidiMode;
+ property ParentColor;
+ property ParentFont;
+ property ParentShowHint;
+ property PopupMenu;
+ property ShowHint;
+ property TabOrder;
+ property TabStop;
+ property Visible;
+ end;
+
+implementation
+uses
+ LCLVersion;
+
+type
+ TFieldDataLinkHack = class(TFieldDataLink)
+ end;
+
+
+{ TRxCustomDBColorBox }
+
+procedure TRxCustomDBColorBox.DataChange(Sender: TObject);
+begin
+ if Assigned(FDataLink.Field) and (FDataLink.Field.DataType in [ftString, ftInteger, ftLargeint]) then
+ begin
+ if FDatalink.Field.DataType in [ftString] then
+ begin
+ if FDatalink.Field.AsString<>'' then
+ try
+ Selected:=StringToColor(FDatalink.Field.AsString)
+ except
+ Selected:=clNone;
+ end
+ else
+ Selected:=clNone;
+ end
+ else
+ if FDataLink.Field.DataType in [ftInteger, ftLargeint] then
+ begin
+ try
+ Selected:=TColor(FDatalink.Field.AsInteger);
+ except
+ Selected:=clNone;
+ end;
+ end;
+ end
+ else
+ begin
+ Selected := clNone;
+ end;
+end;
+
+function TRxCustomDBColorBox.GetDataField: string;
+begin
+ Result := FDataLink.FieldName;
+end;
+
+function TRxCustomDBColorBox.GetDataSource: TDataSource;
+begin
+ Result := FDataLink.DataSource;
+end;
+
+function TRxCustomDBColorBox.GetField: TField;
+begin
+ Result := FDataLink.Field;
+end;
+
+function TRxCustomDBColorBox.GetReadOnly: Boolean;
+begin
+ Result := FDataLink.ReadOnly;
+end;
+
+procedure TRxCustomDBColorBox.SetDataField(const AValue: string);
+begin
+ FDataLink.FieldName := AValue;
+end;
+
+procedure TRxCustomDBColorBox.SetDataSource(const AValue: TDataSource);
+begin
+ ChangeDataSource(Self,FDataLink,AValue);
+end;
+
+procedure TRxCustomDBColorBox.SetReadOnly(const AValue: Boolean);
+begin
+ inherited;
+ FDataLink.ReadOnly := AValue;
+end;
+
+procedure TRxCustomDBColorBox.UpdateData(Sender: TObject);
+begin
+ if FDataLink.Field.DataType in [ftString] then
+ FDataLink.Field.AsString := ColorToString(Selected)
+ else
+ if FDataLink.Field.DataType in [ftInteger, ftLargeint] then
+ FDataLink.Field.AsInteger := Integer(Selected);
+end;
+
+procedure TRxCustomDBColorBox.FocusRequest(Sender: TObject);
+begin
+ SetFocus;
+end;
+
+procedure TRxCustomDBColorBox.ActiveChange(Sender: TObject);
+begin
+ if FDatalink.Active then
+ DataChange(Sender)
+ else
+ begin
+ Selected := clNone;
+ FDataLink.Reset;
+ end;
+end;
+
+procedure TRxCustomDBColorBox.LayoutChange(Sender: TObject);
+begin
+ DataChange(Sender);
+end;
+
+procedure TRxCustomDBColorBox.CMGetDataLink(var Message: TLMessage);
+begin
+ Message.Result := PtrUInt(FDataLink);
+end;
+
+function TRxCustomDBColorBox.IsReadOnly: boolean;
+begin
+ Result := true;
+ if FDatalink.Active and (not Self.ReadOnly) then
+ Result := (Field = nil) or Field.ReadOnly;
+end;
+
+procedure TRxCustomDBColorBox.KeyDown(var Key: Word; Shift: TShiftState);
+begin
+ inherited KeyDown(Key, Shift);
+ if Key=VK_ESCAPE then
+ begin
+ //cancel out of editing by reset on esc
+ FDataLink.Reset;
+ SelectAll;
+ Key := VK_UNKNOWN;
+ end
+ else
+ if Key=VK_DELETE then
+ begin
+ if not IsReadOnly then
+ FDatalink.Edit;
+ end
+ else
+ if Key=VK_TAB then
+ begin
+ if FDataLink.CanModify and FDatalink.Editing then
+ FDataLink.UpdateRecord;
+ end;
+end;
+
+procedure TRxCustomDBColorBox.Change;
+begin
+ FDatalink.Edit;
+ FDataLink.Modified;
+ inherited Change;
+end;
+
+procedure TRxCustomDBColorBox.Loaded;
+begin
+ inherited Loaded;
+ if (csDesigning in ComponentState) then
+ DataChange(Self);
+end;
+
+procedure TRxCustomDBColorBox.Notification(AComponent: TComponent;
+ Operation: TOperation);
+begin
+ inherited Notification(AComponent, Operation);
+ if (Operation=opRemove) then
+ begin
+ if (FDataLink<>nil) and (AComponent=DataSource) then
+ DataSource:=nil;
+ end;
+end;
+
+procedure TRxCustomDBColorBox.WMSetFocus(var Message: TLMSetFocus);
+begin
+ inherited WMSetFocus(Message);
+ if not FDatalink.Editing then
+ FDatalink.Reset;
+end;
+
+procedure TRxCustomDBColorBox.WMKillFocus(var Message: TLMKillFocus);
+begin
+ inherited WMKillFocus(Message);
+ if not FDatalink.Editing then
+ FDatalink.Reset
+ else
+ TFieldDataLinkHack(FDatalink).UpdateData;
+end;
+
+constructor TRxCustomDBColorBox.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FDataLink := TFieldDataLink.Create;
+ FDataLink.Control := Self;
+ FDataLink.OnDataChange := @DataChange;
+ FDataLink.OnUpdateData := @UpdateData;
+ FDataLink.OnActiveChange := @ActiveChange;
+ {$if (lcl_major = 0) and (lcl_release <= 30)}
+ FDataLink.OnLayoutChange := @LayoutChange;
+ {$endif}
+end;
+
+destructor TRxCustomDBColorBox.Destroy;
+begin
+ FreeAndNil(FDataLink);
+ inherited Destroy;
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxdbcomb.pas b/components/rx/version/v2.2_laz_1.2/rxdbcomb.pas
new file mode 100644
index 000000000..224da1a09
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxdbcomb.pas
@@ -0,0 +1,557 @@
+{ rxdbcomb unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit rxdbcomb;
+
+{$I rx.inc}
+
+interface
+
+uses LCLType, LCLProc, LCLIntf, LMessages, Menus, Graphics, Classes, Controls,
+ sysutils, DB, StdCtrls, DbCtrls;
+
+type
+
+{ TCustomDBComboBox }
+
+ TCustomDBComboBox = class(TCustomComboBox)
+ private
+ FDataLink: TFieldDataLink;
+ procedure DataChange(Sender: TObject);
+ procedure EditingChange(Sender: TObject);
+ function GetDataField: string;
+ function GetDataSource: TDataSource;
+ function GetField: TField;
+ function GetReadOnly: Boolean;
+ procedure SetDataField(const Value: string);
+ procedure SetDataSource(Value: TDataSource);
+ procedure SetEditReadOnly;
+ procedure SetItems(const Value: TStrings);
+ procedure SetReadOnly(Value: Boolean);
+ procedure UpdateData(Sender: TObject);
+ function GetComboText: string; virtual;
+ procedure SetComboText(const Value: string); virtual;
+ protected
+ procedure EditingDone; override;
+ procedure Change; override;
+ procedure Click; override;
+ procedure CreateWnd; override;
+ procedure DropDown; override;
+ function GetPaintText: string; virtual;
+ procedure KeyDown(var Key: Word; Shift: TShiftState); override;
+ procedure KeyPress(var Key: Char); override;
+ procedure Loaded; override;
+ procedure Notification(AComponent: TComponent;
+ Operation: TOperation); override;
+ procedure SetStyle(Value: TComboBoxStyle); override;
+ procedure WndProc(var Message: TLMessage); override;
+ property ComboText: string read GetComboText write SetComboText;
+ property DataField: string read GetDataField write SetDataField;
+ property DataSource: TDataSource read GetDataSource write SetDataSource;
+ property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ function ExecuteAction(AAction: TBasicAction): Boolean; override;
+ function UpdateAction(AAction: TBasicAction): Boolean; override;
+ function UseRightToLeftAlignment: Boolean;
+ property Field: TField read GetField;
+ property Items write SetItems;
+ property Text;
+ end;
+
+{ TRxDBComboBox }
+
+ TRxDBComboBox = class(TCustomDBComboBox)
+ private
+ FValues: TStrings;
+ FEnableValues: Boolean;
+ procedure SetEnableValues(Value: Boolean);
+ procedure SetValues(Value: TStrings);
+ procedure ValuesChanged(Sender: TObject);
+ protected
+ procedure SetStyle(Value: TComboBoxStyle); override;
+ function GetComboText: string; override;
+ function GetPaintText: string; override;
+ procedure SetComboText(const Value: string); override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ published
+ property Anchors;
+ property ArrowKeysTraverseList;
+ property AutoDropDown;
+ property AutoSize;
+ property BorderSpacing;
+ property Style; { must be published before Items }
+ property Color;
+ property DataField;
+ property DataSource;
+ property DragMode;
+ property DragCursor;
+ property DropDownCount;
+ property Enabled;
+ property EnableValues: Boolean read FEnableValues write SetEnableValues;
+ property Font;
+ property Constraints;
+ property DragKind;
+ property ItemHeight;
+ property Items;
+ property ItemWidth;
+ property MaxLength default -1;
+ property ParentColor;
+ property ParentFont;
+ property ParentShowHint;
+ property PopupMenu;
+ property ReadOnly;
+ property ShowHint;
+ property Sorted;
+ property TabOrder;
+ property TabStop;
+ property Values: TStrings read FValues write SetValues;
+ property Visible;
+ property OnChange;
+ property OnChangeBounds;
+ property OnClick;
+ property OnCloseUp;
+ property OnDblClick;
+ property OnDragDrop;
+ property OnDragOver;
+ property OnDrawItem;
+ property OnDropDown;
+ property OnEndDrag;
+ property OnEnter;
+ property OnExit;
+ property OnKeyDown;
+ property OnKeyPress;
+ property OnKeyUp;
+ property OnMeasureItem;
+ property OnMouseDown;
+ property OnMouseMove;
+ property OnMouseUp;
+ property OnMouseWheel;
+ property OnMouseWheelDown;
+ property OnMouseWheelUp;
+ property OnSelect;
+ property OnStartDrag;
+ property OnUTF8KeyPress;
+ property OnContextPopup;
+ property OnEndDock;
+ property OnStartDock;
+ end;
+
+implementation
+
+uses DBUtils, rxdconst;
+
+{ TCustomDBComboBox }
+
+constructor TCustomDBComboBox.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ ControlStyle := ControlStyle + [csReplicatable];
+ FDataLink := TFieldDataLink.Create;
+ FDataLink.Control := Self;
+ FDataLink.OnDataChange := @DataChange;
+ FDataLink.OnUpdateData := @UpdateData;
+ FDataLink.OnEditingChange := @EditingChange;
+end;
+
+destructor TCustomDBComboBox.Destroy;
+begin
+ FDataLink.OnDataChange := nil;
+ FDataLink.OnUpdateData := nil;
+ FDataLink.Free;
+ FDataLink := nil;
+ inherited Destroy;
+end;
+
+procedure TCustomDBComboBox.Loaded;
+begin
+ inherited Loaded;
+ if (csDesigning in ComponentState) then DataChange(Self);
+end;
+
+procedure TCustomDBComboBox.Notification(AComponent: TComponent;
+ Operation: TOperation);
+begin
+ inherited Notification(AComponent, Operation);
+ if (Operation = opRemove) and (FDataLink <> nil) and
+ (AComponent = DataSource) then DataSource := nil;
+end;
+
+procedure TCustomDBComboBox.CreateWnd;
+begin
+ inherited CreateWnd;
+ SetEditReadOnly;
+end;
+
+procedure TCustomDBComboBox.DataChange(Sender: TObject);
+begin
+ if DroppedDown then Exit;
+ if FDataLink.Field <> nil then ComboText := FDataLink.Field.AsString
+ else if csDesigning in ComponentState then ComboText := Name
+ else ComboText := '';
+end;
+
+procedure TCustomDBComboBox.UpdateData(Sender: TObject);
+begin
+ if Assigned(FDataLink.Field) then
+ FDataLink.Field.AsString := ComboText
+ else
+ raise Exception.CreateFmt(SDBComboBoxFieldNotAssigned, [Name]);
+end;
+
+procedure TCustomDBComboBox.SetComboText(const Value: string);
+var
+ I: Integer;
+ Redraw: Boolean;
+begin
+ if Value <> ComboText then
+ begin
+ if Style <> csDropDown then
+ begin
+ Redraw := (Style <> csSimple) and HandleAllocated;
+// if Redraw then SendMessage(Handle, LM_SETREDRAW, 0, 0);
+ try
+ if Value = '' then I := -1 else I := Items.IndexOf(Value);
+ ItemIndex := I;
+ finally
+ if Redraw then
+ begin
+// SendMessage(Handle, WM_SETREDRAW, 1, 0);
+ Invalidate;
+ end;
+ end;
+ if I >= 0 then Exit;
+ end;
+ if Style in [csDropDown, csSimple] then Text := Value;
+ end;
+end;
+
+function TCustomDBComboBox.GetComboText: string;
+var
+ I: Integer;
+begin
+ if Style in [csDropDown, csSimple] then Result := Text
+ else
+ begin
+ I := ItemIndex;
+ if I < 0 then Result := '' else Result := Items[I];
+ end;
+end;
+
+procedure TCustomDBComboBox.Change;
+begin
+ FDataLink.Edit;
+ FDataLink.Modified;
+ FDataLink.UpdateRecord;
+ inherited Change;
+end;
+
+procedure TCustomDBComboBox.Click;
+begin
+ FDataLink.Edit;
+ inherited Click;
+ FDataLink.Modified;
+end;
+
+procedure TCustomDBComboBox.DropDown;
+begin
+ FDataLink.Edit;
+ inherited DropDown;
+end;
+
+function TCustomDBComboBox.GetDataSource: TDataSource;
+begin
+ Result := FDataLink.DataSource;
+end;
+
+procedure TCustomDBComboBox.SetDataSource(Value: TDataSource);
+begin
+ if not (FDataLink.DataSourceFixed and (csLoading in ComponentState)) then
+ FDataLink.DataSource := Value;
+ if Value <> nil then Value.FreeNotification(Self);
+end;
+
+function TCustomDBComboBox.GetDataField: string;
+begin
+ Result := FDataLink.FieldName;
+end;
+
+procedure TCustomDBComboBox.SetDataField(const Value: string);
+begin
+ FDataLink.FieldName := Value;
+end;
+
+function TCustomDBComboBox.GetReadOnly: Boolean;
+begin
+ Result := FDataLink.ReadOnly;
+end;
+
+procedure TCustomDBComboBox.SetReadOnly(Value: Boolean);
+begin
+ FDataLink.ReadOnly := Value;
+end;
+
+function TCustomDBComboBox.GetField: TField;
+begin
+ Result := FDataLink.Field;
+end;
+
+procedure TCustomDBComboBox.KeyDown(var Key: Word; Shift: TShiftState);
+begin
+ inherited KeyDown(Key, Shift);
+ if (Key = VK_BACK) or (Key = VK_DELETE) or (Key = VK_UP) or
+ (Key = VK_DOWN) or (Key in [32..255]) then
+ begin
+ if not FDataLink.Edit and (Key in [VK_UP, VK_DOWN]) then
+ Key := 0;
+ end;
+end;
+
+procedure TCustomDBComboBox.KeyPress(var Key: Char);
+begin
+ inherited KeyPress(Key);
+ if (Key in [#32..#255]) and (FDataLink.Field <> nil) and
+ not FDataLink.Field.IsValidChar(Key) then
+ begin
+// MessageBeep(0);
+ Key := #0;
+ end;
+ case Key of
+ ^H, ^V, ^X, #32..#255:
+ FDataLink.Edit;
+ #27:
+ begin
+ FDataLink.Reset;
+ SelectAll;
+ end;
+ end;
+end;
+
+procedure TCustomDBComboBox.EditingChange(Sender: TObject);
+begin
+ SetEditReadOnly;
+end;
+
+procedure TCustomDBComboBox.SetEditReadOnly;
+begin
+(* if (Style in [csDropDown, csSimple]) and HandleAllocated then
+ SendMessage({$IFDEF WIN32} EditHandle {$ELSE} FEditHandle {$ENDIF},
+ EM_SETREADONLY, Ord(not FDataLink.Editing), 0); *)
+end;
+
+
+procedure TCustomDBComboBox.WndProc(var Message: TLMessage);
+begin
+ if not (csDesigning in ComponentState) then
+ case Message.Msg of
+ LM_COMMAND:
+ if TLMCommand(Message).NotifyCode = CBN_SELCHANGE then
+ if not FDataLink.Edit then begin
+{ if Style <> csSimple then
+ PostMessage(Handle, LB_SHOWDROPDOWN, 0, 0);}
+ Exit;
+ end;
+{ CB_SHOWDROPDOWN:
+ if Message.WParam <> 0 then FDataLink.Edit
+ else if not FDataLink.Editing then DataChange(Self); }{Restore text}
+{$IFDEF WIN32}
+{ LM_CREATE,
+ WM_WINDOWPOSCHANGED,
+ CM_FONTCHANGED:
+ FPaintControl.DestroyHandle;}
+{$ENDIF}
+ end;
+ inherited WndProc(Message);
+end;
+
+procedure TCustomDBComboBox.EditingDone;
+begin
+ if Assigned(FDataLink.DataSet) and (FDataLink.DataSet.State in [dsinsert,dsedit]) then
+ begin
+ try
+ FDataLink.UpdateRecord;
+ except
+ SelectAll;
+ if CanFocus then SetFocus;
+ raise;
+ end;
+ inherited EditingDone;
+ end;
+end;
+
+
+function TCustomDBComboBox.GetPaintText: string;
+begin
+ if FDataLink.Field <> nil then Result := FDataLink.Field.Text
+ else Result := '';
+end;
+
+procedure TCustomDBComboBox.SetItems(const Value: TStrings);
+begin
+ Items.Assign(Value);
+ DataChange(Self);
+end;
+
+procedure TCustomDBComboBox.SetStyle(Value: TComboBoxStyle);
+begin
+ if (Value = csSimple) and Assigned(FDatalink) and FDatalink.DatasourceFixed then
+ _DBError('SNotReplicatable');
+ inherited SetStyle(Value);
+end;
+
+function TCustomDBComboBox.UseRightToLeftAlignment: Boolean;
+begin
+// Result := DBUseRightToLeftAlignment(Self, Field);
+end;
+
+function TCustomDBComboBox.ExecuteAction(AAction: TBasicAction): Boolean;
+begin
+{ Result := inherited ExecuteAction(AAction) or (FDataLink <> nil) and
+ FDataLink.ExecuteAction(AAction);}
+end;
+
+function TCustomDBComboBox.UpdateAction(AAction: TBasicAction): Boolean;
+begin
+{ Result := inherited UpdateAction(AAction) or (FDataLink <> nil) and
+ FDataLink.UpdateAction(AAction);}
+end;
+
+{ TRxDBComboBox }
+
+constructor TRxDBComboBox.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FValues := TStringList.Create;
+ TStringList(FValues).OnChange := @ValuesChanged;
+ EnableValues := False;
+end;
+
+destructor TRxDBComboBox.Destroy;
+begin
+ TStringList(FValues).OnChange := nil;
+ FValues.Free;
+ inherited Destroy;
+end;
+
+procedure TRxDBComboBox.ValuesChanged(Sender: TObject);
+begin
+ if FEnableValues then DataChange(Self);
+end;
+
+function TRxDBComboBox.GetPaintText: string;
+var
+ I: Integer;
+begin
+ Result := '';
+ if FDataLink.Field <> nil then begin
+ if FEnableValues then begin
+ I := Values.IndexOf(FDataLink.Field.Text);
+ if I >= 0 then Result := Items.Strings[I]
+ end
+ else Result := FDataLink.Field.Text;
+ end;
+end;
+
+function TRxDBComboBox.GetComboText: string;
+var
+ I: Integer;
+begin
+ if (Style in [csDropDown, csSimple]) and (not FEnableValues) then
+ Result := Text
+ else begin
+ I := ItemIndex;
+ if (I < 0) or (FEnableValues and (FValues.Count < I + 1)) then
+ Result := ''
+ else
+ if FEnableValues then Result := FValues[I]
+ else Result := Items[I];
+ end;
+end;
+
+procedure TRxDBComboBox.SetComboText(const Value: string);
+var
+ I: Integer;
+ Redraw: Boolean;
+begin
+ if Value <> ComboText then
+ begin
+ if Style <> csDropDown then
+ begin
+ Redraw := (Style <> csSimple) and HandleAllocated;
+// if Redraw then SendMessage(Handle, WM_SETREDRAW, 0, 0);
+ try
+ if Value = '' then I := -1
+ else
+ if FEnableValues then I := Values.IndexOf(Value)
+ else I := Items.IndexOf(Value);
+ if I >= Items.Count then I := -1;
+ ItemIndex := I;
+ finally
+ if Redraw then
+ begin
+// SendMessage(Handle, WM_SETREDRAW, 1, 0);
+// Invalidate;
+ end;
+ end;
+ if I >= 0 then Exit;
+ end;
+ if Style in [csDropDown, csSimple] then Text := Value;
+ Invalidate;
+ end;
+end;
+
+procedure TRxDBComboBox.SetEnableValues(Value: Boolean);
+begin
+ if FEnableValues <> Value then
+ begin
+ if Value and (Style in [csDropDown, csSimple]) then
+ Style := csDropDownList;
+ FEnableValues := Value;
+ DataChange(Self);
+ end;
+end;
+
+procedure TRxDBComboBox.SetValues(Value: TStrings);
+begin
+ FValues.Assign(Value);
+end;
+
+procedure TRxDBComboBox.SetStyle(Value: TComboboxStyle);
+begin
+ if (Value in [csSimple, csDropDown]) and FEnableValues then
+ Value := csDropDownList;
+ inherited SetStyle(Value);
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxdbctrls.pas b/components/rx/version/v2.2_laz_1.2/rxdbctrls.pas
new file mode 100644
index 000000000..80105c591
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxdbctrls.pas
@@ -0,0 +1,472 @@
+{ RxDBCtrls unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit RxDBCtrls;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, ComCtrls, DB, DbCtrls, LMessages, LCLType;
+
+type
+
+ { TCustomRxDBProgressBar }
+
+ TCustomRxDBProgressBar = class(TCustomProgressBar)
+ private
+ FDataLink: TFieldDataLink;
+ function GetDataField: string;
+ function GetDataSource: TDataSource;
+ function GetField: TField;
+ procedure SetDataField(const AValue: string);
+ procedure SetDataSource(const AValue: TDataSource);
+ procedure DataChange(Sender: TObject);
+ procedure ActiveChange(Sender: TObject);
+ procedure LayoutChange(Sender: TObject);
+ procedure CMGetDataLink(var Message: TLMessage); message CM_GETDATALINK;
+ protected
+ property DataField: string read GetDataField write SetDataField;
+ property DataSource: TDataSource read GetDataSource write SetDataSource;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ property Field: TField read GetField;
+ end;
+
+ TRxDBProgressBar = class(TCustomRxDBProgressBar)
+ published
+ property DataField;
+ property DataSource;
+ property Align;
+ property Anchors;
+ property BorderSpacing;
+ property BorderWidth;
+ property Constraints;
+ property DragCursor;
+ property DragKind;
+ property DragMode;
+ property Enabled;
+ property Hint;
+ property Max;
+ property Min;
+ property OnContextPopup;
+ property OnDragDrop;
+ property OnDragOver;
+ property OnEndDrag;
+ property OnEnter;
+ property OnExit;
+ property OnMouseDown;
+ property OnMouseMove;
+ property OnMouseUp;
+ property OnMouseWheel;
+ property OnMouseWheelDown;
+ property OnMouseWheelUp;
+ property OnStartDock;
+ property OnStartDrag;
+ property Orientation;
+ property ParentShowHint;
+ property PopupMenu;
+ property ShowHint;
+ property Smooth;
+ property Step;
+ property TabOrder;
+ property TabStop;
+ property Visible;
+ property BarShowText;
+ end;
+
+type
+
+ { TCustomRxDBTrackBar }
+
+ TCustomRxDBTrackBar = class(TCustomTrackBar)
+ private
+ FDataLink: TFieldDataLink;
+ FInScrollEvent:boolean;
+ function GetDataField: string;
+ function GetDataSource: TDataSource;
+ function GetField: TField;
+ procedure SetDataField(const AValue: string);
+ procedure SetDataSource(const AValue: TDataSource);
+ procedure DataChange(Sender: TObject);
+ procedure ActiveChange(Sender: TObject);
+ procedure LayoutChange(Sender: TObject);
+ procedure CMGetDataLink(var Message: TLMessage); message CM_GETDATALINK;
+ procedure WMSetFocus(var Message: TLMSetFocus); message LM_SETFOCUS;
+ procedure WMKillFocus(var Message: TLMKillFocus); message LM_KILLFOCUS;
+ function GetReadOnly: Boolean;
+ procedure SetReadOnly(const AValue: Boolean);
+ function IsReadOnly: boolean;
+ procedure UpdateData(Sender: TObject);
+ protected
+ property DataField: string read GetDataField write SetDataField;
+ property DataSource: TDataSource read GetDataSource write SetDataSource;
+ property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
+ procedure DoChange(var msg); message LM_CHANGED;
+// procedure Change; override;
+ procedure Loaded; override;
+ procedure Notification(AComponent: TComponent;
+ Operation: TOperation); override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ property Field: TField read GetField;
+ end;
+
+ TRxDBTrackBar = class(TCustomRxDBTrackBar)
+ published
+ property DataField;
+ property DataSource;
+ property ReadOnly;
+
+ property Align;
+ property Anchors;
+ property BorderSpacing;
+ property Constraints;
+ property DragCursor;
+ property DragMode;
+ property Enabled;
+ property Frequency;
+ property Hint;
+ property LineSize;
+ property Max;
+ property Min;
+ property OnChange;
+ property OnChangeBounds;
+ property OnClick;
+ property OnContextPopup;
+ property OnDragDrop;
+ property OnDragOver;
+ property OnEndDrag;
+ property OnEnter;
+ property OnExit;
+ property OnMouseDown;
+ property OnMouseEnter;
+ property OnMouseLeave;
+ property OnMouseMove;
+ property OnMouseUp;
+ property OnMouseWheel;
+ property OnMouseWheelDown;
+ property OnMouseWheelUp;
+ property OnKeyDown;
+ property OnKeyPress;
+ property OnKeyUp;
+ property OnResize;
+ property OnStartDrag;
+ property OnUTF8KeyPress;
+ property Orientation;
+ property PageSize;
+ property ParentShowHint;
+ property PopupMenu;
+ property ScalePos;
+ property ShowHint;
+ property TabOrder;
+ property TabStop;
+ property TickMarks;
+ property TickStyle;
+ property Visible;
+ end;
+
+type
+
+ { TRxDBRadioGroup }
+
+ TRxDBRadioGroup = class(TDBRadioGroup)
+ private
+ function GetItemEnabled(Index: integer): boolean;
+ procedure SetItemEnabled(Index: integer; AValue: boolean);
+ public
+ property ItemEnabled[Index: integer]: boolean read GetItemEnabled write SetItemEnabled;
+ published
+ property AutoSize;
+ end;
+
+implementation
+uses dbutils, LCLVersion, vclutils, StdCtrls;
+
+{ TRxDBRadioGroup }
+
+function TRxDBRadioGroup.GetItemEnabled(Index: integer): boolean;
+var
+ R:TRadioButton;
+begin
+ if (Index < -1) or (Index >= Items.Count) then
+ RaiseIndexOutOfBounds(Self, Items, Index);
+ R:=FindComponent('RadioButton'+IntToStr(Index)) as TRadioButton;
+ if Assigned(R) then
+ Result:=R.Enabled
+ else
+ Result:=False;
+end;
+
+procedure TRxDBRadioGroup.SetItemEnabled(Index: integer; AValue: boolean);
+var
+ R:TRadioButton;
+begin
+ if (Index < -1) or (Index >= Items.Count) then
+ RaiseIndexOutOfBounds(Self, Items, Index);
+ R:=FindComponent('RadioButton'+IntToStr(Index)) as TRadioButton;
+ if Assigned(R) then
+ R.Enabled:=AValue;
+end;
+
+{ TCustomRxDBProgressBar }
+
+function TCustomRxDBProgressBar.GetDataField: string;
+begin
+ Result := FDataLink.FieldName;
+end;
+
+function TCustomRxDBProgressBar.GetDataSource: TDataSource;
+begin
+ Result := FDataLink.DataSource;
+end;
+
+function TCustomRxDBProgressBar.GetField: TField;
+begin
+ Result := FDataLink.Field;
+end;
+
+procedure TCustomRxDBProgressBar.ActiveChange(Sender: TObject);
+begin
+ if FDatalink.Active then
+ DataChange(Sender)
+ else
+ begin
+ Text := '';
+ FDataLink.Reset;
+ end;
+end;
+
+procedure TCustomRxDBProgressBar.LayoutChange(Sender: TObject);
+begin
+ DataChange(Sender);
+end;
+
+procedure TCustomRxDBProgressBar.CMGetDataLink(var Message: TLMessage);
+begin
+ Message.Result := PtrUInt(FDataLink);
+end;
+
+procedure TCustomRxDBProgressBar.SetDataField(const AValue: string);
+begin
+ FDataLink.FieldName := AValue;
+end;
+
+procedure TCustomRxDBProgressBar.SetDataSource(const AValue: TDataSource);
+begin
+ ChangeDataSource(Self,FDataLink,AValue);
+end;
+
+procedure TCustomRxDBProgressBar.DataChange(Sender: TObject);
+begin
+ if Assigned(FDataLink.Field) and (FDataLink.Field.DataType in IntegerDataTypes) then
+ Self.Position:=FDatalink.Field.AsInteger
+ else
+ Position:=Min
+end;
+
+constructor TCustomRxDBProgressBar.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FDataLink := TFieldDataLink.Create;
+ FDataLink.Control := Self;
+ FDataLink.OnDataChange := @DataChange;
+ FDataLink.OnActiveChange := @ActiveChange;
+ {$if (lcl_major = 0) and (lcl_release <= 30)}
+ FDataLink.OnLayoutChange := @LayoutChange;
+ {$endif}
+end;
+
+destructor TCustomRxDBProgressBar.Destroy;
+begin
+ FreeAndNil(FDataLink);
+ inherited Destroy;
+end;
+
+{ TCustomRxDBTrackBar }
+
+function TCustomRxDBTrackBar.GetDataField: string;
+begin
+ Result := FDataLink.FieldName;
+end;
+
+function TCustomRxDBTrackBar.GetDataSource: TDataSource;
+begin
+ Result := FDataLink.DataSource;
+end;
+
+function TCustomRxDBTrackBar.GetField: TField;
+begin
+ Result := FDataLink.Field;
+end;
+
+procedure TCustomRxDBTrackBar.SetDataField(const AValue: string);
+begin
+ FDataLink.FieldName := AValue;
+end;
+
+procedure TCustomRxDBTrackBar.SetDataSource(const AValue: TDataSource);
+begin
+ ChangeDataSource(Self,FDataLink,AValue);
+end;
+
+procedure TCustomRxDBTrackBar.DataChange(Sender: TObject);
+begin
+ FInScrollEvent:=true;
+ if Assigned(FDataLink.Field) and (FDataLink.Field.DataType in IntegerDataTypes) then
+ Self.Position:=FDatalink.Field.AsInteger
+ else
+ Self.Position:=0;
+ FInScrollEvent:=false;
+end;
+
+procedure TCustomRxDBTrackBar.ActiveChange(Sender: TObject);
+begin
+ if FDatalink.Active then
+ DataChange(Sender)
+ else
+ begin
+ Position:=0;
+ FDataLink.Reset;
+ end;
+end;
+
+procedure TCustomRxDBTrackBar.LayoutChange(Sender: TObject);
+begin
+ DataChange(Sender);
+end;
+
+procedure TCustomRxDBTrackBar.CMGetDataLink(var Message: TLMessage);
+begin
+ Message.Result := PtrUInt(FDataLink);
+end;
+
+procedure TCustomRxDBTrackBar.WMSetFocus(var Message: TLMSetFocus);
+begin
+ inherited WMSetFocus(Message);
+ if not FDatalink.Editing then
+ FDatalink.Reset;
+end;
+
+procedure TCustomRxDBTrackBar.WMKillFocus(var Message: TLMKillFocus);
+begin
+ inherited WMKillFocus(Message);
+ if not FDatalink.Editing then
+ FDatalink.Reset
+ else
+ FDatalink.UpdateRecord;
+end;
+
+function TCustomRxDBTrackBar.GetReadOnly: Boolean;
+begin
+ Result := FDataLink.ReadOnly;
+end;
+
+procedure TCustomRxDBTrackBar.SetReadOnly(const AValue: Boolean);
+begin
+ inherited;
+ FDataLink.ReadOnly := AValue;
+end;
+
+function TCustomRxDBTrackBar.IsReadOnly: boolean;
+begin
+ result := true;
+ if FDatalink.Active and not Self.ReadOnly then
+ result := (Field=nil) or Field.ReadOnly;
+end;
+
+procedure TCustomRxDBTrackBar.UpdateData(Sender: TObject);
+begin
+ if Assigned(FDataLink.Field) and (FDataLink.Field.DataType in IntegerDataTypes) then
+ FDataLink.Field.AsInteger := Self.Position;
+end;
+
+procedure TCustomRxDBTrackBar.DoChange(var msg);
+begin
+ inherited DoChange(Msg);
+ if not FInScrollEvent then
+ begin
+ FDatalink.Edit;
+ FDataLink.Modified;
+ end;
+end;
+
+{
+procedure TCustomRxDBTrackBar.Change;
+begin
+ FDatalink.Edit;
+ FDataLink.Modified;
+ inherited Change;
+end;
+}
+procedure TCustomRxDBTrackBar.Loaded;
+begin
+ inherited Loaded;
+ if (csDesigning in ComponentState) then
+ DataChange(Self);
+end;
+
+procedure TCustomRxDBTrackBar.Notification(AComponent: TComponent;
+ Operation: TOperation);
+begin
+ inherited Notification(AComponent, Operation);
+ if (Operation=opRemove) then
+ begin
+ if (FDataLink<>nil) and (AComponent=DataSource) then
+ DataSource:=nil;
+ end;
+end;
+
+constructor TCustomRxDBTrackBar.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FInScrollEvent:=false;
+ FDataLink := TFieldDataLink.Create;
+ FDataLink.Control := Self;
+ FDataLink.OnDataChange := @DataChange;
+ FDataLink.OnUpdateData := @UpdateData;
+ FDataLink.OnActiveChange := @ActiveChange;
+ {$if (lcl_major = 0) and (lcl_release <= 30)}
+ FDataLink.OnLayoutChange := @LayoutChange;
+ {$endif}
+end;
+
+destructor TCustomRxDBTrackBar.Destroy;
+begin
+ FreeAndNil(FDataLink);
+ inherited Destroy;
+end;
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/rxdbgrid.lrs b/components/rx/version/v2.2_laz_1.2/rxdbgrid.lrs
new file mode 100644
index 000000000..bcb0762b4
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxdbgrid.lrs
@@ -0,0 +1,25 @@
+LazarusResources.Add('rx_markerdown','XPM',[
+ '/* XPM */'#10'static char *rx_mark_down[]={'#10'"10 10 3 1",'#10'". c None",'
+ +#10'"# c #808080",'#10'"a c #ffffff",'#10'"..........",'#10'".#######a.",'#10
+ +'".#......a.",'#10'"..#....a..",'#10'"..#....a..",'#10'"...#..a...",'#10'"..'
+ +'.#..a...",'#10'"....#a....",'#10'"..........",'#10'".........."};'#10
+]);
+LazarusResources.Add('rx_markerup','XPM',[
+ '/* XPM */'#10'static char *rx_mark_up[]={'#10'"10 10 4 1",'#10'"b c None",'
+ +#10'". c None",'#10'"# c #808080",'#10'"a c #ffffff",'#10'"..........",'#10
+ +'"....#a....",'#10'"...#..a...",'#10'"...#..a...",'#10'"..#....a..",'#10'"..'
+ +'#....a..",'#10'".#......a.",'#10'".aaaaaaaa.",'#10'".bbbbbbbb.",'#10'".....'
+ +'....."};'#10
+]);
+
+LazarusResources.Add('menu_grid','XPM',[
+ '/* XPM */'#10'static const unsigned char * menu_grid_xpm[] = {'#10'"16 16 4 1",'
+ +#10'" c None",'#10'"! c black",'#10'"# c #800000",'#10'"$ c #FFFF00",'
+ +#10'" ",'#10'" ! ",'#10'" !#! ",'
+ +#10'" !###! ",'#10'" !##$##! ",'#10'" !!!#$#!!! ",'
+ +#10'" !#$#! ",'#10'" !#$#! ",'#10'" !#$#! ",'
+ +#10'" !#$#! ",'#10'" !#$#! ",'#10'" !!!#$#!!! ",'
+ +#10'" !##$##! ",'#10'" !###! ",'#10'" !#! ",'
+ +#10'" ! "};'#10
+]);
+
diff --git a/components/rx/version/v2.2_laz_1.2/rxdbgrid.pas b/components/rx/version/v2.2_laz_1.2/rxdbgrid.pas
new file mode 100644
index 000000000..5d5a1bfec
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxdbgrid.pas
@@ -0,0 +1,6098 @@
+{ rxdbgrid unit
+
+ Copyright (C) 2005-2014 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+{$I rx.inc}
+
+unit rxdbgrid;
+
+interface
+
+uses
+ Classes, SysUtils, LResources, LCLType, LCLIntf, Forms, Controls, Buttons,
+ Graphics, Dialogs, Grids, dbutils, DBGrids, DB, PropertyStorage, vclutils,
+ LMessages, types, StdCtrls, Menus, rxspin;
+
+const
+ CBadQuickSearchSymbols = [VK_UNKNOWN..VK_HELP] + [VK_LWIN..VK_SLEEP] +
+ [VK_NUMLOCK..VK_SCROLL] + [VK_LSHIFT..VK_OEM_102] + [VK_PROCESSKEY] +
+ [VK_ATTN..VK_UNDEFINED];
+ CCancelQuickSearchKeys = [VK_ESCAPE, VK_CANCEL, VK_DELETE, VK_INSERT,
+ VK_DOWN, VK_UP, VK_NEXT, VK_PRIOR, VK_TAB, VK_RETURN, VK_HOME,
+ VK_END, VK_SPACE, VK_MULTIPLY];
+
+type
+ //forward declarations
+ TRxDBGrid = class;
+ TRxColumn = class;
+ TRxDBGridAbstractTools = class;
+
+
+ TRxQuickSearchNotifyEvent = procedure(Sender: TObject; Field: TField;
+ var AValue: string) of object;
+
+ TSortMarker = (smNone, smDown, smUp);
+
+ TGetBtnParamsEvent = procedure(Sender: TObject; Field: TField;
+ AFont: TFont; var Background: TColor; var SortMarker: TSortMarker;
+ IsDown: boolean) of object;
+
+ TGetCellPropsEvent = procedure(Sender: TObject; Field: TField;
+ AFont: TFont; var Background: TColor) of object;
+
+//Freeman35 added
+ TOnRxCalcFooterValues = procedure(Sender: TObject; Column: TRxColumn; var AValue : Variant) of object;
+
+{$IFDEF RxDBGridDepricatedProps}
+ //TRxDBGridAllowedOperation = (aoInsert, aoUpdate, aoDelete, aoAppend);
+ //TRxDBGridAllowedOperations = set of TRxDBGridAllowedOperation;
+{$ENDIF}
+
+ TRxColumnOption = (coCustomizeVisible, coCustomizeWidth, coFixDecimalSeparator);
+ TRxColumnOptions = set of TRxColumnOption;
+
+ TRxColumnEditButtonStyle = (ebsDropDownRx, ebsEllipsisRx, ebsGlyphRx, ebsUpDownRx,
+ ebsPlusRx, ebsMinusRx);
+
+ TFooterValueType = (fvtNon, fvtSum, fvtAvg, fvtCount, fvtFieldValue,
+ fvtStaticText, fvtMax, fvtMin, fvtRecNo);
+
+ TOptionRx = (rdgAllowColumnsForm,
+ rdgAllowDialogFind,
+ rdgHighlightFocusCol, //TODO:
+ rdgHighlightFocusRow, //TODO:
+ rdgDblClickOptimizeColWidth,
+ rdgFooterRows,
+ rdgXORColSizing,
+ rdgFilter,
+ rdgMultiTitleLines,
+ rdgMrOkOnDblClik,
+ rdgAllowQuickSearch,
+ rdgAllowQuickFilter,
+ rdgAllowFilterForm,
+ rdgAllowSortForm,
+ rdgAllowToolMenu,
+ rdgCaseInsensitiveSort,
+ rdgWordWrap
+ );
+
+ TOptionsRx = set of TOptionRx;
+
+ TCreateLookup = TNotifyEvent;
+ TDisplayLookup = TNotifyEvent;
+ // TDataSetClass = class of TDataSet;
+
+ TRxDBGridCommand = (rxgcNone, rxgcShowFindDlg, rxgcShowColumnsDlg,
+ rxgcShowFilterDlg, rxgcShowSortDlg, rxgcShowQuickFilter,
+ rxgcHideQuickFilter, rxgcSelectAll, rxgcDeSelectAll, rxgcInvertSelection,
+ rxgcOptimizeColumnsWidth, rxgcCopyCellValue
+
+ );
+
+ TRxDSState = (rxdsInactive, rxdsActive);
+
+ TRxFilterOpCode = (fopEQ, fopNotEQ, fopStartFrom, fopEndTo, fopLike, fopNotLike);
+ { TRxDBGridKeyStroke }
+
+ TRxDBGridKeyStroke = class(TCollectionItem)
+ private
+ FCommand: TRxDBGridCommand;
+ FEnabled: boolean;
+ FShortCut: TShortCut;
+ FKey: word; // Virtual keycode, i.e. VK_xxx
+ FShift: TShiftState;
+ procedure SetCommand(const AValue: TRxDBGridCommand);
+ procedure SetShortCut(const AValue: TShortCut);
+ protected
+ function GetDisplayName: string; override;
+ public
+ procedure Assign(Source: TPersistent); override;
+ published
+ property Command: TRxDBGridCommand read FCommand write SetCommand;
+ property ShortCut: TShortCut read FShortCut write SetShortCut;
+ property Enabled: boolean read FEnabled write FEnabled;
+ end;
+
+ { TRxDBGridKeyStrokes }
+
+ TRxDBGridKeyStrokes = class(TOwnedCollection)
+ private
+ function GetItem(Index: integer): TRxDBGridKeyStroke;
+ procedure SetItem(Index: integer; const AValue: TRxDBGridKeyStroke);
+ protected
+ procedure Update(Item: TCollectionItem); override;
+ public
+ constructor Create(AOwner: TPersistent);
+ procedure Assign(Source: TPersistent); override;
+ function Add: TRxDBGridKeyStroke;
+ function AddE(ACommand: TRxDBGridCommand; AShortCut: TShortCut): TRxDBGridKeyStroke;
+ procedure ResetDefaults;
+ function FindRxCommand(AKey: word; AShift: TShiftState): TRxDBGridCommand;
+ function FindRxKeyStrokes(ACommand: TRxDBGridCommand): TRxDBGridKeyStroke;
+ public
+ property Items[Index: integer]: TRxDBGridKeyStroke read GetItem write SetItem; default;
+ end;
+
+ { TRxDBGridCollumnConstraint }
+
+ TRxDBGridCollumnConstraints = class(TPersistent)
+ private
+ FMaxWidth: integer;
+ FMinWidth: integer;
+ FOwner: TPersistent;
+ procedure SetMaxWidth(AValue: integer);
+ procedure SetMinWidth(AValue: integer);
+ protected
+ procedure AssignTo(Dest: TPersistent); override;
+ public
+ constructor Create(AOwner: TPersistent);
+ published
+ property MinWidth:integer read FMinWidth write SetMinWidth default 0;
+ property MaxWidth:integer read FMaxWidth write SetMaxWidth default 0;
+ end;
+
+ { TRxDBGridFooterOptions }
+
+ TRxDBGridFooterOptions = class(TPersistent)
+ private
+ FActive: boolean;
+ FColor: TColor;
+ FOwner: TRxDBGrid;
+ FRowCount: integer;
+ FStyle: TTitleStyle;
+ procedure SetActive(AValue: boolean);
+ procedure SetColor(AValue: TColor);
+ procedure SetRowCount(AValue: integer);
+ procedure SetStyle(AValue: TTitleStyle);
+ protected
+ procedure AssignTo(Dest: TPersistent); override;
+ public
+ constructor Create(Owner: TRxDBGrid);
+ destructor Destroy; override;
+ published
+ property Active: boolean read FActive write SetActive default false;
+ property Color: TColor read FColor write SetColor default clWindow;
+ property RowCount: integer read FRowCount write SetRowCount default 0;
+ property Style: TTitleStyle read FStyle write SetStyle default tsLazarus;
+ end;
+
+
+ { TRxDBGridSortEngine }
+ TRxSortEngineOption = (seoCaseInsensitiveSort);
+ TRxSortEngineOptions = set of TRxSortEngineOption;
+
+ TRxDBGridSortEngine = class
+ protected
+ FGrid:TRxDBGrid;
+ procedure UpdateFooterRows(ADataSet:TDataSet; AGrid:TRxDBGrid);virtual; abstract;
+ function EnabledFooterRowsCalc:boolean;virtual;
+ public
+ procedure Sort(FieldName: string; ADataSet: TDataSet; Asc: boolean; SortOptions: TRxSortEngineOptions); virtual; abstract;
+ procedure SortList(ListField: string; ADataSet: TDataSet; Asc: array of boolean; SortOptions: TRxSortEngineOptions); virtual;
+ end;
+
+ TRxDBGridSortEngineClass = class of TRxDBGridSortEngine;
+
+ TMLCaptionItem = class
+ Caption: string;
+ Width: integer;
+ Hegth: integer;
+ Next: TMLCaptionItem;
+ Prior: TMLCaptionItem;
+ FInvalidDraw:integer;
+ Col: TGridColumn;
+ end;
+
+ { TRxColumnTitle }
+ TRxColumnTitle = class(TColumnTitle)
+ private
+ FHint: string;
+ FOrientation: TTextOrientation;
+ FShowHint: boolean;
+ FCaptionLines: TFPList;
+ function GetCaptionLinesCount: integer;
+ procedure SetOrientation(const AValue: TTextOrientation);
+ procedure ClearCaptionML;
+ protected
+ procedure SetCaption(const AValue: TCaption); override;
+ public
+ constructor Create(TheColumn: TGridColumn); override;
+ destructor Destroy; override;
+ property CaptionLinesCount: integer read GetCaptionLinesCount;
+ function CaptionLine(ALine: integer): TMLCaptionItem;
+ published
+ property Orientation: TTextOrientation read FOrientation write SetOrientation;
+ property Hint: string read FHint write FHint;
+ property ShowHint: boolean read FShowHint write FShowHint default False;
+ end;
+
+ { TRxColumnFooter }
+
+ TRxColumnFooter = class(TPersistent)
+ private
+ FIsDefaultFont: boolean;
+ FLayout: TTextLayout;
+ FOwner: TRxColumn;
+ FAlignment: TAlignment;
+ FDisplayFormat: string;
+ FFieldName: string;
+ FField:TField;
+ FFont: TFont;
+ FValue: string;
+ FValueType: TFooterValueType;
+ FTestValue: double;
+ FCountRec:integer;
+ procedure FontChanged(Sender: TObject);
+ function GetFont: TFont;
+ function IsFontStored: Boolean;
+ procedure SetAlignment(const AValue: TAlignment);
+ procedure SetDisplayFormat(const AValue: string);
+ procedure SetFieldName(const AValue: string);
+ procedure SetFont(AValue: TFont);
+ procedure SetLayout(const AValue: TTextLayout);
+ procedure SetValue(const AValue: string);
+ procedure SetValueType(const AValue: TFooterValueType);
+ function GetFieldValue: string;
+ function GetRecordsCount: string;
+ function GetRecNo: string;
+ function GetStatTotal: string;
+ procedure ResetTestValue;
+ procedure UpdateTestValue;
+
+ function DeleteTestValue: boolean;
+ function PostTestValue: boolean;
+ function ErrorTestValue: boolean;
+ protected
+ procedure UpdateTestValueFromVar(AValue:Variant);
+ property IsDefaultFont: boolean read FIsDefaultFont;
+ public
+ constructor Create(Owner: TRxColumn);
+ destructor Destroy; override;
+ property Owner: TRxColumn read FOwner;
+ property NumericValue: double read FTestValue;
+ function DisplayText: string;
+ procedure FillDefaultFont;
+ published
+ property Alignment: TAlignment read FAlignment write SetAlignment default
+ taLeftJustify;
+ property Layout: TTextLayout read FLayout write SetLayout default tlCenter;
+ property DisplayFormat: string read FDisplayFormat write SetDisplayFormat;
+ property FieldName: string read FFieldName write SetFieldName;
+ property Value: string read FValue write SetValue;
+ property ValueType: TFooterValueType read FValueType write SetValueType default fvtNon;
+ property Font: TFont read GetFont write SetFont stored IsFontStored;
+ end;
+
+
+ { TRxFilterItem }
+
+ TRxFilterItem = class
+ FVAlue:string;
+ FCol:TRxColumn;
+ OpCode:TRxFilterOpCode;
+ function TestValue:Boolean;
+ end;
+
+ { TRxFilterItems }
+
+ TRxFilterItems = class(TFPList)
+ function AcceptRecord:boolean;
+ end;
+
+ { TRxColumnFilter }
+
+ TRxColumnFilter = class(TPersistent)
+ private
+ FEnabled: boolean;
+ FOwner: TRxColumn;
+ FValue: string;
+ FValueList: TStringList;
+ FEmptyValue: string;
+ FEmptyFont: TFont;
+ FFont: TFont;
+ FAlignment: TAlignment;
+ FDropDownRows: integer;
+ FColor: TColor;
+ function GetItemIndex: integer;
+ procedure SetColor(const AValue: TColor);
+ procedure SetFont(const AValue: TFont);
+ procedure SetItemIndex(const AValue: integer);
+ public
+ constructor Create(Owner: TRxColumn); virtual;
+ destructor Destroy; override;
+ published
+ property Value: string read FValue write FValue;
+ property Font: TFont read FFont write SetFont;
+ property Alignment: TAlignment read FAlignment write FAlignment default
+ taLeftJustify;
+ property DropDownRows: integer read FDropDownRows write FDropDownRows;
+ property Color: TColor read FColor write SetColor default clWhite;
+ property ValueList: TStringList read FValueList write FValueList;
+ property EmptyValue: string read FEmptyValue write FEmptyValue;
+ property EmptyFont: TFont read FEmptyFont write FEmptyFont;
+ property ItemIndex: integer read GetItemIndex write SetItemIndex;
+ property Enabled:boolean read FEnabled write FEnabled default true;
+ end;
+
+ { TRxColumnEditButton }
+
+ TRxColumnEditButton = class(TCollectionItem)
+ private
+ FShortCut: TShortCut;
+ FStyle: TRxColumnEditButtonStyle;
+ FButton:TSpeedButton;
+ FVisible: Boolean;
+ //
+ FSpinBtn:TRxSpinButton;
+ function GetGlyph: TBitmap;
+ function GetHint: String;
+ function GetNumGlyphs: Integer;
+ function GetOnButtonClick: TNotifyEvent;
+ function GetWidth: Integer;
+ procedure SetGlyph(AValue: TBitmap);
+ procedure SetHint(AValue: String);
+ procedure SetNumGlyphs(AValue: Integer);
+ procedure SetOnButtonClick(AValue: TNotifyEvent);
+ procedure SetStyle(AValue: TRxColumnEditButtonStyle);
+ procedure SetVisible(AValue: Boolean);
+ procedure SetWidth(AValue: Integer);
+
+ procedure DoBottomClick(Sender: TObject);
+ procedure DoTopClick(Sender: TObject);
+ protected
+ function GetDisplayName: string; override;
+ public
+ constructor Create(ACollection: TCollection); override;
+ destructor Destroy; override;
+ published
+ //property DropdownMenu: TPopupMenu read FDropdownMenu write FDropdownMenu; :TODO:
+ property Glyph: TBitmap read GetGlyph write SetGlyph;
+ property Hint: String read GetHint write SetHint;
+ property NumGlyphs: Integer read GetNumGlyphs write SetNumGlyphs default 1;
+ property ShortCut: TShortCut read FShortCut write FShortCut default scNone;
+ property Style: TRxColumnEditButtonStyle read FStyle write SetStyle default ebsDropDownRx;
+ property Visible: Boolean read FVisible write SetVisible default true;
+ property Width: Integer read GetWidth write SetWidth default 15;
+ property OnClick: TNotifyEvent read GetOnButtonClick write SetOnButtonClick;
+ //property OnDown: TNotifyEvent read FOnButtonDown write FOnButtonDown;
+ end;
+
+ TRxColumnEditButtons = class(TCollection)
+ private
+ FOwner: TPersistent;
+ function GetItem(Index: integer): TRxColumnEditButton;
+ procedure SetItem(Index: integer; AValue: TRxColumnEditButton);
+ protected
+ procedure Update(Item: TCollectionItem); override;
+ public
+ constructor Create(AOwner: TPersistent);
+ function Add: TRxColumnEditButton;
+ public
+ property Items[Index: integer]: TRxColumnEditButton read GetItem write SetItem; default;
+ end;
+
+ { TRxColumn }
+
+ TRxColumn = class(TColumn)
+ private
+ FDirectInput: boolean;
+ FEditButtons: TRxColumnEditButtons;
+ FFooter: TRxColumnFooter;
+ FConstraints:TRxDBGridCollumnConstraints;
+ FFilter: TRxColumnFilter;
+ FImageList: TImageList;
+ FKeyList: TStrings;
+ FNotInKeyListIndex: integer;
+ FOnDrawColumnCell: TDrawColumnCellEvent;
+ FOptions: TRxColumnOptions;
+ FSortFields: string;
+ FSortOrder: TSortMarker;
+ FSortPosition: integer;
+ FWordWrap: boolean;
+ function GetConstraints: TRxDBGridCollumnConstraints;
+ function GetFooter: TRxColumnFooter;
+ function GetKeyList: TStrings;
+ function GetSortFields:string;
+ procedure SetConstraints(AValue: TRxDBGridCollumnConstraints);
+ procedure SetEditButtons(AValue: TRxColumnEditButtons);
+ procedure SetFilter(const AValue: TRxColumnFilter);
+ procedure SetFooter(const AValue: TRxColumnFooter);
+ procedure SetImageList(const AValue: TImageList);
+ procedure SetKeyList(const AValue: TStrings);
+ procedure SetNotInKeyListIndex(const AValue: integer);
+ procedure SetWordWrap(AValue: boolean);
+ protected
+ function CreateTitle: TGridColumnTitle; override;
+ procedure ColumnChanged; override;
+ public
+ constructor Create(ACollection: TCollection); override;
+ destructor Destroy; override;
+ procedure OptimizeWidth;
+ property SortOrder: TSortMarker read FSortOrder write FSortOrder;
+ property SortPosition: integer read FSortPosition;
+ published
+ property Constraints:TRxDBGridCollumnConstraints read GetConstraints write SetConstraints;
+ property DirectInput : boolean read FDirectInput write FDirectInput default true;
+ property EditButtons:TRxColumnEditButtons read FEditButtons write SetEditButtons;
+ property Filter: TRxColumnFilter read FFilter write SetFilter;
+ property Footer: TRxColumnFooter read GetFooter write SetFooter;
+ property ImageList: TImageList read FImageList write SetImageList;
+ property KeyList: TStrings read GetKeyList write SetKeyList;
+ property NotInKeyListIndex: integer read FNotInKeyListIndex write SetNotInKeyListIndex default -1;
+ property Options:TRxColumnOptions read FOptions write FOptions default [coCustomizeVisible, coCustomizeWidth];
+ property SortFields: string read FSortFields write FSortFields;
+ property WordWrap:boolean read FWordWrap write SetWordWrap default false;
+ property OnDrawColumnCell: TDrawColumnCellEvent read FOnDrawColumnCell write FOnDrawColumnCell;
+ end;
+
+ { TRxDbGridColumns }
+ TRxDbGridColumns = class(TDbGridColumns)
+ protected
+ procedure Notify(Item: TCollectionItem;Action: TCollectionNotification); override;
+ public
+ function Add: TRxColumn;
+ end;
+
+ { TRxDbGridColumnsSortList }
+
+ TRxDbGridColumnsSortList = class(TFPList)
+ private
+ function GetCollumn(Index: Integer): TRxColumn;
+ public
+ property Collumn[Index: Integer]: TRxColumn read GetCollumn; default;
+ end;
+
+ { TFilterListCellEditor }
+
+ TFilterListCellEditor = class(TComboBox)
+ private
+ FGrid: TCustomGrid;
+ FCol: integer;
+ FMouseFlag: boolean;
+ protected
+ procedure WndProc(var TheMessage: TLMessage); override;
+ procedure KeyDown(var Key: word; Shift: TShiftState); override;
+ public
+ procedure Show(Grid: TCustomGrid; Col: integer);
+ property Grid: TCustomGrid read FGrid;
+ property Col: integer read FCol;
+ property MouseFlag: boolean read FMouseFlag write FMouseFlag;
+ end;
+
+
+
+ { TRxDBGrid }
+ TRxDBGrid = class(TCustomDBGrid)
+ private
+ FrxDSState:TRxDSState;
+ FFooterOptions: TRxDBGridFooterOptions;
+ FSortColumns: TRxDbGridColumnsSortList;
+ FSortingNow:Boolean;
+ FInProcessCalc: integer;
+// FAllowedOperations: TRxDBGridAllowedOperations;
+ //
+ FKeyStrokes: TRxDBGridKeyStrokes;
+ FOnGetCellProps: TGetCellPropsEvent;
+ FOptionsRx: TOptionsRx;
+ // FTitleLines: Integer;
+
+ FOnGetBtnParams: TGetBtnParamsEvent;
+ FOnFiltred: TNotifyEvent;
+ FOnRxCalcFooterValues :TOnRxCalcFooterValues;
+ //auto sort support
+
+ FMarkerUp : TBitmap;
+ FMarkerDown : TBitmap;
+ FAutoSort : boolean;
+ FSortEngine : TRxDBGridSortEngine;
+ FPressedCol : TRxColumn;
+ //
+ FPressed: boolean;
+ FSwapButtons: boolean;
+ FTracking: boolean;
+ FDrawFullLine: boolean;
+
+ F_Clicked: boolean;
+ F_PopupMenu: TPopupMenu;
+ F_MenuBMP: TBitmap;
+
+ F_EventOnFilterRec: TFilterRecordEvent;
+ F_EventOnBeforeDelete: TDataSetNotifyEvent;
+ F_EventOnBeforePost: TDataSetNotifyEvent;
+ F_EventOnDeleteError: TDataSetErrorEvent;
+ F_EventOnPostError: TDataSetErrorEvent;
+ F_LastFilter: TStringList;
+ //F_SortListField: TStringList;
+ F_CreateLookup: TCreateLookup;
+ F_DisplayLookup: TDisplayLookup;
+
+ //storage
+ //Column resize
+ FColumnResizing: boolean;
+
+ FFilterListEditor: TFilterListCellEditor;
+
+ FOldPosition: Integer;
+ FVersion: integer;
+ FPropertyStorageLink: TPropertyStorageLink;
+ FRxDbGridLookupComboEditor: TCustomControl;
+ FRxDbGridDateEditor: TWinControl;
+
+ FAfterQuickSearch: TRxQuickSearchNotifyEvent;
+ FBeforeQuickSearch: TRxQuickSearchNotifyEvent;
+ FQuickUTF8Search: string;
+ FOldDataSetState:TDataSetState;
+
+ FOnSortChanged: TNotifyEvent;
+
+ procedure DoCreateJMenu;
+ //function GetAllowedOperations: TRxDBGridAllowedOperations;
+ function GetColumns: TRxDbGridColumns;
+ function GetFooterColor: TColor;
+ function GetFooterRowCount: integer;
+ function GetMarkerDown: TBitmap;
+ function GetMarkerUp: TBitmap;
+ function GetPropertyStorage: TCustomPropertyStorage;
+ function GetSortField: string;
+ function GetSortOrder: TSortMarker;
+ function GetTitleButtons: boolean;
+ function IsColumnsStored: boolean;
+
+{$IFDEF RxDBGridDepricatedProps}
+ procedure SetAllowedOperations(AValue: TRxDBGridAllowedOperations);
+{$ENDIF}
+ procedure SetAutoSort(const AValue: boolean);
+ procedure SetColumns(const AValue: TRxDbGridColumns);
+ procedure SetFooterColor(const AValue: TColor);
+ procedure SetFooterOptions(AValue: TRxDBGridFooterOptions);
+ procedure SetFooterRowCount(const AValue: integer);
+ procedure SetKeyStrokes(const AValue: TRxDBGridKeyStrokes);
+ procedure SetMarkerDown(AValue: TBitmap);
+ procedure SetMarkerUp(AValue: TBitmap);
+ procedure SetOptionsRx(const AValue: TOptionsRx);
+ procedure SetPropertyStorage(const AValue: TCustomPropertyStorage);
+ procedure SetTitleButtons(const AValue: boolean);
+ procedure TrackButton(X, Y: integer);
+ function GetDrawFullLine: boolean;
+ procedure SetDrawFullLine(Value: boolean);
+ procedure StopTracking;
+ procedure CalcTitle;
+ procedure ClearMLCaptionPointers;
+ function getFilterRect(bRect: TRect): TRect;
+ function getTitleRect(bRect: TRect): TRect;
+ procedure OutCaptionCellText(aCol, aRow: integer; const aRect: TRect;
+ aState: TGridDrawState; const ACaption: string);
+ procedure OutCaptionCellText90(aCol, aRow: integer; const aRect: TRect;
+ aState: TGridDrawState; const ACaption: string;
+ const TextOrient: TTextOrientation);
+ procedure OutCaptionSortMarker(const aRect: TRect; ASortMarker: TSortMarker; ASortPosition:integer);
+ procedure OutCaptionMLCellText(aCol, aRow: integer; aRect: TRect;
+ aState: TGridDrawState; MLI: TMLCaptionItem);
+ procedure UpdateJMenuStates;
+ procedure UpdateJMenuKeys;
+ function SortEngineOptions: TRxSortEngineOptions;
+ procedure WMVScroll(var Message : TLMVScroll); message LM_VScroll;
+ procedure GetScrollbarParams(out aRange, aPage, aPos: Integer);
+ procedure RestoreEditor;
+ //storage
+ procedure OnIniSave(Sender: TObject);
+ procedure OnIniLoad(Sender: TObject);
+
+ procedure CleanDSEvent;
+
+
+ function UpdateRowsHeight:integer;
+ procedure ResetRowHeght;
+
+ procedure DoClearInvalidTitle;
+ procedure DoDrawInvalidTitle;
+ procedure DoSetColEdtBtn;
+ procedure AddTools(ATools:TRxDBGridAbstractTools);
+ procedure RemoveTools(ATools:TRxDBGridAbstractTools);
+ protected
+ //procedure UpdateHorzScrollBar(const aVisible: boolean; const aRange,aPage,aPos: Integer); override;
+ //procedure UpdateVertScrollbar(const aVisible: boolean; const aRange,aPage,aPos: Integer); override;
+
+ procedure CollumnSortListUpdate;
+ procedure CollumnSortListClear;
+ procedure CollumnSortListApply;
+
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+
+ function DatalinkActive: boolean;
+ procedure AdjustEditorBounds(NewCol,NewRow:Integer); override;
+ procedure LinkActive(Value: Boolean); override;
+
+ procedure DefaultDrawCellA(aCol, aRow: integer; aRect: TRect;
+ aState: TGridDrawState);
+ procedure DefaultDrawTitle(aCol, aRow: integer; aRect: TRect;
+ aState: TGridDrawState);
+ procedure DefaultDrawFilter(aCol, aRow: integer; aRect: TRect;
+ aState: TGridDrawState);
+ procedure DefaultDrawCellData(aCol, aRow: integer; aRect: TRect;
+ aState: TGridDrawState);
+ procedure DrawCell(aCol, aRow: integer; aRect: TRect; aState: TGridDrawState);
+ override;
+ procedure SetDBHandlers(Value: boolean);virtual;
+
+ procedure DrawFooterRows; virtual;
+
+ procedure DoTitleClick(ACol: longint; ACollumn: TRxColumn; Shift: TShiftState); virtual;
+ procedure MouseMove(Shift: TShiftState; X, Y: integer); override;
+ procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: integer); override;
+ procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: integer); override;
+ procedure KeyDown(var Key: word; Shift: TShiftState); override;
+ procedure KeyPress(var Key: char); override;
+ procedure UTF8KeyPress(var UTF8Key: TUTF8Char); override;
+ function CreateColumns: TGridColumns; override;
+ procedure DrawCellBitmap(RxColumn: TRxColumn; aRect: TRect;
+ aState: TGridDrawState; AImageIndex: integer); virtual;
+ procedure SetEditText(ACol, ARow: longint; const Value: string); override;
+
+ procedure ColRowMoved(IsColumn: boolean; FromIndex, ToIndex: integer); override;
+ procedure Paint; override;
+ procedure UpdateActive; override;
+ procedure UpdateData; override;
+ procedure MoveSelection; override;
+ function GetBufferCount: integer; override;
+ procedure CMHintShow(var Message: TLMessage); message CM_HINTSHOW;
+ procedure FFilterListEditorOnChange(Sender: TObject);
+ procedure FFilterListEditorOnCloseUp(Sender: TObject);
+ procedure InternalOptimizeColumnsWidth(AColList: TList);
+ function IsDefaultRowHeightStored: boolean;
+ procedure VisualChange; override;
+ procedure EditorWidthChanged(aCol,aWidth: Integer); override;
+
+ procedure SetQuickUTF8Search(AValue: string);
+ procedure BeforeDel(DataSet: TDataSet);
+ procedure BeforePo(DataSet: TDataSet);
+ procedure ErrorDel(DataSet: TDataSet; E: EDatabaseError; var DataAction: TDataAction);
+ procedure ErrorPo(DataSet: TDataSet; E: EDatabaseError; var DataAction: TDataAction);
+ procedure OnFind(Sender: TObject);
+ procedure OnFilterBy(Sender: TObject);
+ procedure OnFilter(Sender: TObject);
+ procedure OnFilterClose(Sender: TObject);
+ procedure OnSortBy(Sender: TObject);
+ procedure OnChooseVisibleFields(Sender: TObject);
+ procedure OnSelectAllRows(Sender: TObject);
+ procedure OnCopyCellValue(Sender: TObject);
+ procedure Loaded; override;
+ procedure UpdateFooterRowOnUpdateActive;
+
+ procedure DoEditorHide; override;
+ procedure DoEditorShow; override;
+
+ procedure EraseBackground(DC: HDC); override;
+ property Editor;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+
+ procedure FilterRec(DataSet: TDataSet; var Accept: boolean);
+ function EditorByStyle(Style: TColumnButtonStyle): TWinControl; override;
+ procedure LayoutChanged; override;
+ procedure SetFocus; override;
+ procedure ShowFindDialog;
+ procedure ShowColumnsDialog;
+ procedure ShowSortDialog;
+ procedure ShowFilterDialog;
+ function ColumnByFieldName(AFieldName: string): TRxColumn;
+ function ColumnByCaption(ACaption: string): TRxColumn;
+ procedure CalcStatTotals;
+ procedure OptimizeColumnsWidth(AColList: string);
+ procedure OptimizeColumnsWidthAll;
+ procedure UpdateTitleHight;
+ procedure GetOnCreateLookup;
+ procedure GetOnDisplayLookup;
+ procedure SelectAllRows;
+ procedure DeSelectAllRows;
+ procedure InvertSelection;
+ procedure CopyCellValue;
+
+ procedure SetSort(AFields: array of String; ASortMarkers: array of TSortMarker; PreformSort: Boolean = False);
+
+ property Canvas;
+ property DefaultTextStyle;
+ property EditorBorderStyle;
+ property EditorMode;
+ property ExtendedColSizing;
+ property FastEditing;
+ property FocusRectVisible;
+ property SelectedRows;
+ property QuickUTF8Search: string read FQuickUTF8Search write SetQuickUTF8Search;
+
+ property SortField:string read GetSortField;
+ property SortOrder:TSortMarker read GetSortOrder;
+
+ property SortColumns:TRxDbGridColumnsSortList read FSortColumns;
+ property MarkerUp : TBitmap read GetMarkerUp write SetMarkerUp;
+ property MarkerDown : TBitmap read GetMarkerDown write SetMarkerDown;
+ published
+ property AfterQuickSearch: TRxQuickSearchNotifyEvent
+ read FAfterQuickSearch write FAfterQuickSearch;
+ property BeforeQuickSearch: TRxQuickSearchNotifyEvent
+ read FBeforeQuickSearch write FBeforeQuickSearch;
+ property OnGetBtnParams: TGetBtnParamsEvent
+ read FOnGetBtnParams write FOnGetBtnParams;
+ property TitleButtons: boolean read GetTitleButtons write SetTitleButtons;
+ property AutoSort: boolean read FAutoSort write SetAutoSort;
+ property OnGetCellProps: TGetCellPropsEvent
+ read FOnGetCellProps write FOnGetCellProps;
+ property Columns: TRxDbGridColumns
+ read GetColumns write SetColumns stored IsColumnsStored;
+ property KeyStrokes: TRxDBGridKeyStrokes read FKeyStrokes write SetKeyStrokes;
+ property FooterOptions:TRxDBGridFooterOptions read FFooterOptions write SetFooterOptions;
+
+ //storage
+ property PropertyStorage: TCustomPropertyStorage
+ read GetPropertyStorage write SetPropertyStorage;
+ property Version: integer read FVersion write FVersion default 0;
+ {$IFDEF RxDBGridDepricatedProps}
+ property AllowedOperations: TRxDBGridAllowedOperations
+ read GetAllowedOperations write SetAllowedOperations default [aoInsert, aoUpdate, aoDelete, aoAppend]; deprecated;
+ {$ENDIF}
+ property OptionsRx: TOptionsRx read FOptionsRx write SetOptionsRx;
+ property FooterColor: TColor read GetFooterColor write SetFooterColor default clWindow; deprecated;
+ property FooterRowCount: integer read GetFooterRowCount write SetFooterRowCount default 0; deprecated;
+
+ property OnFiltred: TNotifyEvent read FOnFiltred write FOnFiltred;
+// property Constraints:TRxDBGridCollumnConstraints read GetConstraints write SetConstraints;
+
+ property OnSortChanged: TNotifyEvent read FOnSortChanged write FOnSortChanged;
+
+ //from DBGrid
+ property Align;
+ property AlternateColor;
+ property Anchors;
+ property AutoAdvance default aaRightDown;
+ property AutoFillColumns;
+ property AutoEdit;
+ property BiDiMode;
+ property BorderSpacing;
+ property BorderStyle;
+ property Color;
+ property BorderColor;
+ property DrawFullLine: boolean read GetDrawFullLine write SetDrawFullLine;
+ property FocusColor;
+ property FixedHotColor;
+
+ property SelectedColor;
+ property GridLineColor;
+ property GridLineStyle;
+
+ property Constraints;
+ property DataSource;
+ property DefaultDrawing;
+ property DefaultRowHeight; // stored IsDefaultRowHeightStored;
+
+ property DefaultColWidth;
+
+ property DragCursor;
+ property DragKind;
+ property DragMode;
+ property Enabled;
+ property FixedColor;
+ property FixedCols;
+ property Flat;
+ property Font;
+ property HeaderHotZones;
+ property HeaderPushZones;
+ //property ImeMode;
+ //property ImeName;
+ property Options;
+ property OptionsExtra;
+ property ParentBiDiMode;
+ property ParentColor;
+ //property ParentCtl3D;
+ property ParentFont;
+ property ParentShowHint;
+ property PopupMenu;
+ property ReadOnly;
+ property Scrollbars default ssBoth;
+ property ShowHint;
+ property TabOrder;
+ property TabStop;
+ property TitleFont;
+ property TitleImageList;
+ property TitleStyle;
+ property UseXORFeatures;
+ property Visible;
+
+ property OnCellClick;
+ property OnColEnter;
+ property OnColExit;
+ property OnColumnMoved;
+ property OnColumnSized;
+ property OnDragDrop;
+ property OnDragOver;
+ property OnDrawColumnCell;
+ property OnDblClick;
+ property OnEditButtonClick;
+ property OnEditingDone;
+ property OnEndDock;
+ property OnEndDrag;
+ property OnEnter;
+ property OnExit;
+ property OnFieldEditMask;
+ property OnKeyDown;
+ property OnKeyPress;
+ property OnKeyUp;
+ property OnMouseDown;
+ property OnMouseMove;
+ property OnMouseUp;
+ property OnMouseWheel;
+ property OnMouseWheelDown;
+ property OnMouseWheelUp;
+ property OnPrepareCanvas;
+ property OnSelectEditor;
+ property OnStartDock;
+ property OnStartDrag;
+ property OnTitleClick;
+ property OnRxCalcFooterValues: TOnRxCalcFooterValues read FOnRxCalcFooterValues write FOnRxCalcFooterValues;
+ property OnUserCheckboxBitmap;
+ property OnUserCheckboxState;
+ property OnUTF8KeyPress;
+
+
+ property OnCreateLookup: TCreateLookup read F_CreateLookup write F_CreateLookup;
+ property OnDisplayLookup: TDisplayLookup read F_DisplayLookup write F_DisplayLookup;
+ end;
+
+ { TRxDBGridAbstractTools }
+
+ TRxDBGridAbstractTools = class(TComponent)
+ private
+ FOnAfterExecute: TNotifyEvent;
+ FOnBeforeExecute: TNotifyEvent;
+ FShowSetupForm: boolean;
+ procedure ExecTools(Sender:TObject);
+ protected
+ FRxDBGrid: TRxDBGrid;
+ FCaption:string;
+ procedure SetRxDBGrid(AValue: TRxDBGrid);
+ function DoExecTools:boolean; virtual;
+ function DoSetupTools:boolean; virtual;
+ public
+ constructor Create(AOwner: TComponent); override;
+ function Execute:boolean;
+ published
+ property RxDBGrid:TRxDBGrid read FRxDBGrid write SetRxDBGrid;
+ property Caption:string read FCaption write FCaption;
+ property ShowSetupForm:boolean read FShowSetupForm write FShowSetupForm default false;
+ property OnBeforeExecute:TNotifyEvent read FOnBeforeExecute write FOnBeforeExecute;
+ property OnAfterExecute:TNotifyEvent read FOnAfterExecute write FOnAfterExecute;
+ end;
+
+procedure RegisterRxDBGridSortEngine(RxDBGridSortEngineClass: TRxDBGridSortEngineClass;
+ DataSetClassName: string);
+
+implementation
+
+uses Math, rxdconst, rxstrutils, strutils, rxdbgrid_findunit, rxdbgrid_columsunit,
+ rxlookup, tooledit, LCLProc, Clipbrd, rxfilterby, rxsortby, variants;
+
+const
+ EditorCommandStrs: array[rxgcNone .. High(TRxDBGridCommand)] of TIdentMapEntry =
+ (
+ (Value: Ord(rxgcNone); Name: 'rxcgNone'),
+ (Value: Ord(rxgcShowFindDlg); Name: 'rxgcShowFindDlg'),
+ (Value: Ord(rxgcShowColumnsDlg); Name: 'rxgcShowColumnsDlg'),
+ (Value: Ord(rxgcShowFilterDlg); Name: 'rxgcShowFilterDlg'),
+ (Value: Ord(rxgcShowSortDlg); Name: 'rxgcShowSortDlg'),
+ (Value: Ord(rxgcShowQuickFilter); Name: 'rxgcShowQuickFilter'),
+ (Value: Ord(rxgcHideQuickFilter); Name: 'rxgcHideQuickFilter'),
+ (Value: Ord(rxgcSelectAll); Name: 'rxgcSelectAll'),
+ (Value: Ord(rxgcDeSelectAll); Name: 'rxgcDeSelectAll'),
+ (Value: Ord(rxgcInvertSelection); Name: 'rxgcInvertSelection'),
+ (Value: Ord(rxgcOptimizeColumnsWidth); Name: 'rxgcOptimizeColumnsWidth'),
+ (Value: Ord(rxgcCopyCellValue); Name: 'rxgcCopyCellValue')
+ );
+
+var
+ RxDBGridSortEngineList: TStringList;
+
+procedure RegisterRxDBGridSortEngine(
+ RxDBGridSortEngineClass: TRxDBGridSortEngineClass; DataSetClassName: string);
+var
+ Pos: integer;
+ RxDBGridSortEngine: TRxDBGridSortEngine;
+begin
+ if not RxDBGridSortEngineList.Find(DataSetClassName, Pos) then
+ begin
+ RxDBGridSortEngine := RxDBGridSortEngineClass.Create;
+ RxDBGridSortEngineList.AddObject(DataSetClassName, RxDBGridSortEngine);
+ end;
+end;
+
+procedure GridInvalidateRow(Grid: TRxDBGrid; Row: longint);
+var
+ I: longint;
+begin
+ for I := 0 to Grid.ColCount - 1 do
+ Grid.InvalidateCell(I, Row);
+end;
+
+type
+ THackDataLink = class(TDataLink);
+ THackDataSet = class(TDataSet);
+
+
+type
+
+ { TRxDBGridLookupComboEditor }
+
+ TRxDBGridLookupComboEditor = class(TRxCustomDBLookupCombo)
+ private
+ FGrid: TRxDBGrid;
+ FCol, FRow: integer;
+ FLDS: TDataSource;
+ protected
+ procedure WndProc(var TheMessage: TLMessage); override;
+ procedure KeyDown(var Key: word; Shift: TShiftState); override;
+ procedure msg_SetGrid(var Msg: TGridMessage); message GM_SETGRID;
+ procedure msg_SetValue(var Msg: TGridMessage); message GM_SETVALUE;
+ procedure msg_GetValue(var Msg: TGridMessage); message GM_GETVALUE;
+ procedure OnInternalClosePopup(AResult:boolean);override;
+ procedure ShowList; override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ end;
+
+ { TRxDBGridDateEditor }
+ TRxDBGridDateEditor = class(TCustomRxDateEdit)
+ private
+ FGrid: TRxDBGrid;
+ FCol, FRow: integer;
+ protected
+{$IFDEF OLD_EDITBUTTON}
+ procedure Change; override;
+{$ELSE}
+ procedure EditChange; override;
+{$ENDIF}
+ procedure KeyDown(var Key: word; Shift: TShiftState); override;
+
+ procedure WndProc(var TheMessage: TLMessage); override;
+ procedure msg_SetGrid(var Msg: TGridMessage); message GM_SETGRID;
+ procedure msg_SetValue(var Msg: TGridMessage); message GM_SETVALUE;
+ procedure msg_GetValue(var Msg: TGridMessage); message GM_GETVALUE;
+ procedure msg_SelectAll(var Msg: TGridMessage); message GM_SELECTALL;
+
+ public
+ constructor Create(Aowner : TComponent); override;
+ //procedure SetBounds(aLeft, aTop, aWidth, aHeight: integer); override;
+ procedure EditingDone; override;
+ end;
+
+{ TRxDBGridAbstractTools }
+
+procedure TRxDBGridAbstractTools.SetRxDBGrid(AValue: TRxDBGrid);
+begin
+ if FRxDBGrid=AValue then Exit;
+ if Assigned(FRxDBGrid) then
+ FRxDBGrid.RemoveTools(Self);
+ FRxDBGrid:=AValue;
+ if Assigned(FRxDBGrid) then
+ FRxDBGrid.AddTools(Self);
+end;
+
+function TRxDBGridAbstractTools.DoExecTools: boolean;
+begin
+ //
+end;
+
+function TRxDBGridAbstractTools.DoSetupTools: boolean;
+begin
+ Result:=true;
+end;
+
+procedure TRxDBGridAbstractTools.ExecTools(Sender: TObject);
+begin
+ Execute;
+end;
+
+constructor TRxDBGridAbstractTools.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FCaption:=Name;
+ FShowSetupForm:=false;
+end;
+
+function TRxDBGridAbstractTools.Execute: boolean;
+begin
+ Result:=true;
+ if Assigned(FOnBeforeExecute) then
+ FOnBeforeExecute(Self);
+
+ if FShowSetupForm then
+ Result:=DoSetupTools;
+
+ if Result then
+ Result:=DoExecTools;
+
+ if Assigned(FOnAfterExecute) then
+ FOnAfterExecute(Self);
+end;
+
+
+{ TRxDBGridCollumnConstraint }
+
+procedure TRxDBGridCollumnConstraints.SetMaxWidth(AValue: integer);
+begin
+ if FMaxWidth=AValue then Exit;
+ if (FMinWidth<>0) and (AValue<>0) and (AValue < FMinWidth) then exit;
+ FMaxWidth:=AValue;
+end;
+
+procedure TRxDBGridCollumnConstraints.SetMinWidth(AValue: integer);
+begin
+ if FMinWidth=AValue then Exit;
+ if (FMaxWidth<>0) and (AValue<>0) and (AValue > FMaxWidth) then exit;
+ FMinWidth:=AValue;
+end;
+
+procedure TRxDBGridCollumnConstraints.AssignTo(Dest: TPersistent);
+begin
+ if Dest is TRxDBGridCollumnConstraints then
+ begin
+ TRxDBGridCollumnConstraints(Dest).FMinWidth:=FMinWidth;
+ TRxDBGridCollumnConstraints(Dest).FMaxWidth:=FMaxWidth;
+ end
+ else
+ inherited AssignTo(Dest);
+end;
+
+constructor TRxDBGridCollumnConstraints.Create(AOwner: TPersistent);
+begin
+ inherited Create;
+ FOwner:=AOwner;
+end;
+
+{ TRxFilterItems }
+
+function TRxFilterItems.AcceptRecord: boolean;
+var
+ i:integer;
+begin
+ Result:=true;
+ for i:=0 to Count-1 do
+ begin
+ if not TRxFilterItem(Items[i]).TestValue then
+ begin
+ Result:=false;
+ exit;
+ end;
+ end;
+end;
+
+{ TRxFilterItem }
+
+function TRxFilterItem.TestValue: Boolean;
+var
+ ATestValue: string;
+begin
+ ATestValue:=FCol.Field.DisplayText;
+ case OpCode of
+ fopEQ:Result:=ATestValue = FVAlue;
+ fopNotEQ:Result:=ATestValue <> FVAlue;
+ fopStartFrom:Result:=UTF8Copy(ATestValue, 1, UTF8Length(FVAlue)) = FVAlue;
+ fopEndTo:Result:=Copy(ATestValue, UTF8Length(ATestValue) - UTF8Length(FVAlue), UTF8Length(FVAlue)) = FVAlue;
+ fopLike:Result:=UTF8Pos(FVAlue, ATestValue) > 0;
+ fopNotLike:Result:=UTF8Pos(FVAlue, ATestValue) = 0;
+ else
+ Result:=false;
+ end;
+end;
+
+{ TRxDbGridColumnsSortList }
+
+function TRxDbGridColumnsSortList.GetCollumn(Index: Integer): TRxColumn;
+begin
+ Result:=TRxColumn(Items[Index]);
+end;
+
+{ TRxColumnEditButton }
+
+function TRxColumnEditButton.GetGlyph: TBitmap;
+begin
+ Result:=FButton.Glyph;
+end;
+
+function TRxColumnEditButton.GetHint: String;
+begin
+ Result:=FButton.Hint;
+end;
+
+function TRxColumnEditButton.GetNumGlyphs: Integer;
+begin
+ Result:=FButton.NumGlyphs;
+end;
+
+function TRxColumnEditButton.GetOnButtonClick: TNotifyEvent;
+begin
+ Result:=FButton.OnClick;
+end;
+
+function TRxColumnEditButton.GetWidth: Integer;
+begin
+ Result:=FButton.Width;
+end;
+
+procedure TRxColumnEditButton.SetGlyph(AValue: TBitmap);
+begin
+ FButton.Glyph.Assign(AValue);
+ if not (csLoading in TRxDBGrid(TRxColumnEditButtons(Collection).Owner).ComponentState) then
+ FStyle:=ebsGlyphRx;
+end;
+
+procedure TRxColumnEditButton.SetHint(AValue: String);
+begin
+ FButton.Hint:=AValue;
+ FSpinBtn.Hint:=AValue;
+end;
+
+procedure TRxColumnEditButton.SetNumGlyphs(AValue: Integer);
+begin
+ FButton.NumGlyphs:=AValue;
+end;
+
+procedure TRxColumnEditButton.SetOnButtonClick(AValue: TNotifyEvent);
+begin
+ FButton.OnClick:=AValue;
+end;
+
+procedure TRxColumnEditButton.SetStyle(AValue: TRxColumnEditButtonStyle);
+begin
+ if FStyle=AValue then Exit;
+ FStyle:=AValue;
+end;
+
+procedure TRxColumnEditButton.SetVisible(AValue: Boolean);
+begin
+// if FVisible=AValue then Exit;
+ FVisible:=AValue;
+
+ if AValue then
+ begin
+ if Style = ebsUpDownRx then
+ begin
+ FSpinBtn.Visible:=AValue;
+ FButton.Visible:=false;
+ end
+ else
+ begin
+ FButton.Visible:=AValue;
+ FSpinBtn.Visible:=false;
+ end;
+ end
+ else
+ begin
+ FButton.Visible:=AValue;
+ FSpinBtn.Visible:=AValue;
+ end;
+end;
+
+procedure TRxColumnEditButton.SetWidth(AValue: Integer);
+begin
+ FButton.Width:=AValue;
+ FSpinBtn.Width:=AValue;
+end;
+
+procedure TRxColumnEditButton.DoBottomClick(Sender: TObject);
+var
+ F:TField;
+ Col:TRxColumn;
+
+ msg: TGridMessage;
+begin
+ Col:=TRxColumnEditButtons(Collection).FOwner as TRxColumn;
+ F:=Col.Field;
+
+ if Assigned(F) and (F.DataType in NumericDataTypes) then
+ begin
+ if not (F.DataSet.State in dsEditModes) then
+ F.DataSet.Edit;
+ F.Value:=F.Value - 1;
+
+ Msg.LclMsg.msg:=GM_SETVALUE;
+ Msg.Grid:=Col.Grid;
+{ Msg.Col:=FCol;
+ Msg.Row:=FRow;}
+ Msg.Value:=F.DisplayText;
+ TRxDBGrid(Col.Grid).Editor.Dispatch(Msg);
+
+ end;
+end;
+
+procedure TRxColumnEditButton.DoTopClick(Sender: TObject);
+var
+ F:TField;
+ Col:TRxColumn;
+
+ msg: TGridMessage;
+begin
+ Col:=TRxColumnEditButtons(Collection).FOwner as TRxColumn;
+ F:=Col.Field;
+
+ if Assigned(F) and (F.DataType in NumericDataTypes) then
+ begin
+ if not (F.DataSet.State in dsEditModes) then
+ F.DataSet.Edit;
+ F.Value:=F.Value + 1;
+
+ Msg.LclMsg.msg:=GM_SETVALUE;
+ Msg.Grid:=Col.Grid;
+{ Msg.Col:=FCol;
+ Msg.Row:=FRow;}
+ Msg.Value:=F.DisplayText;
+ TRxDBGrid(Col.Grid).Editor.Dispatch(Msg);
+
+ end;
+end;
+
+function TRxColumnEditButton.GetDisplayName: string;
+begin
+ if Hint<>'' then
+ Result:=Hint
+ else
+ Result:='TRxColumnEditButton';
+end;
+
+constructor TRxColumnEditButton.Create(ACollection: TCollection);
+begin
+ inherited Create(ACollection);
+ FButton:=TSpeedButton.Create(nil);
+ FButton.Glyph:=LoadLazResBitmapImage('rx_markerdown');
+ FSpinBtn:=TRxSpinButton.Create(nil);
+ FSpinBtn.OnBottomClick:=@DoBottomClick;
+ FSpinBtn.OnTopClick:=@DoTopClick;
+
+ FVisible:=true;
+ Width:=15;
+end;
+
+destructor TRxColumnEditButton.Destroy;
+begin
+ FreeAndNil(FButton);
+ FreeAndNil(FSpinBtn);
+ inherited Destroy;
+end;
+
+{ TRxColumnEditButtons }
+
+function TRxColumnEditButtons.GetItem(Index: integer): TRxColumnEditButton;
+begin
+ Result:= TRxColumnEditButton(inherited Items[Index]);
+end;
+
+procedure TRxColumnEditButtons.SetItem(Index: integer;
+ AValue: TRxColumnEditButton);
+begin
+ inherited SetItem(Index, AValue);
+end;
+
+procedure TRxColumnEditButtons.Update(Item: TCollectionItem);
+begin
+ inherited Update(Item);
+end;
+
+constructor TRxColumnEditButtons.Create(AOwner: TPersistent);
+begin
+ inherited Create(TRxColumnEditButton);
+ FOwner:=AOwner;
+end;
+
+function TRxColumnEditButtons.Add: TRxColumnEditButton;
+begin
+ Result := TRxColumnEditButton(inherited Add);
+end;
+
+{ TRxDBGridFooterOptions }
+
+procedure TRxDBGridFooterOptions.SetActive(AValue: boolean);
+begin
+ if FActive=AValue then Exit;
+ FActive:=AValue;
+
+ { TODO : Устаревший код - в следующей версии необходимо убрать }
+ if FActive then
+ FOwner.FOptionsRx:=FOwner.FOptionsRx + [rdgFooterRows]
+ else
+ FOwner.FOptionsRx:=FOwner.FOptionsRx - [rdgFooterRows];
+
+ FOwner.VisualChange;
+end;
+
+procedure TRxDBGridFooterOptions.SetColor(AValue: TColor);
+begin
+ if FColor=AValue then Exit;
+ FColor:=AValue;
+ FOwner.Invalidate;
+end;
+
+procedure TRxDBGridFooterOptions.SetRowCount(AValue: integer);
+begin
+ if FRowCount=AValue then Exit;
+ FRowCount:=AValue;
+ FOwner.VisualChange;
+end;
+
+procedure TRxDBGridFooterOptions.SetStyle(AValue: TTitleStyle);
+begin
+ if FStyle=AValue then Exit;
+ FStyle:=AValue;
+end;
+
+procedure TRxDBGridFooterOptions.AssignTo(Dest: TPersistent);
+var
+ FO:TRxDBGridFooterOptions absolute Dest;
+begin
+ if Dest is TRxDBGridFooterOptions then
+ begin
+ FO.Active:=Active;
+ FO.Color:=Color;
+ FO.RowCount:=RowCount;
+ FO.Style:=Style;
+ end
+ else
+ inherited AssignTo(Dest);
+end;
+
+constructor TRxDBGridFooterOptions.Create(Owner: TRxDBGrid);
+begin
+ inherited Create;
+ FOwner:=Owner;
+
+ FColor := clWindow;
+ FRowCount := 0;
+ FStyle := tsLazarus;
+end;
+
+destructor TRxDBGridFooterOptions.Destroy;
+begin
+ inherited Destroy;
+end;
+
+
+{ TRxDBGridDateEditor }
+
+{$IFDEF OLD_EDITBUTTON}
+procedure TRxDBGridDateEditor.Change;
+{$ELSE}
+procedure TRxDBGridDateEditor.EditChange;
+{$ENDIF}
+var
+ D:TDateTime;
+begin
+ {$IFDEF OLD_EDITBUTTON}
+ inherited Change;
+ {$ELSE}
+ inherited EditChange;
+ {$ENDIF}
+ if Assigned(FGrid) and FGrid.DatalinkActive and not FGrid.EditorIsReadOnly then
+ begin
+ if not (FGrid.DataSource.DataSet.State in dsEditModes) then
+ FGrid.DataSource.Edit;
+ if Self.Text <> '' then
+ FGrid.SelectedField.AsDateTime := Self.Date
+ else
+ FGrid.SelectedField.Clear;
+
+ if FGrid <> nil then
+ begin
+ if TryStrToDate(Text, D) then
+ FGrid.SetEditText(FCol, FRow, Text)
+ else
+ FGrid.SetEditText(FCol, FRow, '');
+ end;
+ end;
+end;
+
+procedure TRxDBGridDateEditor.KeyDown(var Key: word; Shift: TShiftState);
+
+ function AllSelected: boolean;
+ begin
+ Result := (SelLength > 0) and (SelLength = UTF8Length(Text));
+ end;
+
+ function AtStart: boolean;
+ begin
+ Result := (SelStart = 0);
+ end;
+
+ function AtEnd: boolean;
+ begin
+ Result := ((SelStart + 1) > UTF8Length(Text)) or AllSelected;
+ end;
+
+ procedure doEditorKeyDown;
+ begin
+ if FGrid <> nil then
+ FGrid.EditorkeyDown(Self, key, shift);
+ end;
+
+ procedure doGridKeyDown;
+ begin
+ if FGrid <> nil then
+ FGrid.KeyDown(Key, shift);
+ end;
+
+ function GetFastEntry: boolean;
+ begin
+ if FGrid <> nil then
+ Result := FGrid.FastEditing
+ else
+ Result := False;
+ end;
+
+ procedure CheckEditingKey;
+ begin
+ if (FGrid = nil) or FGrid.EditorIsReadOnly then
+ Key := 0;
+ end;
+
+var
+ IntSel: boolean;
+begin
+ inherited KeyDown(Key, Shift);
+ case Key of
+ VK_F2:
+ if AllSelected then
+ begin
+ SelLength := 0;
+ SelStart := Length(Text);
+ end;
+ VK_DELETE:
+ CheckEditingKey;
+ VK_UP, VK_DOWN:
+ doGridKeyDown;
+ VK_LEFT, VK_RIGHT:
+ if GetFastEntry then
+ begin
+ IntSel :=
+ ((Key = VK_LEFT) and not AtStart) or ((Key = VK_RIGHT) and not AtEnd);
+ if not IntSel then
+ begin
+ doGridKeyDown;
+ end;
+ end;
+ VK_END, VK_HOME:
+ ;
+ else
+ doEditorKeyDown;
+ end;
+end;
+
+procedure TRxDBGridDateEditor.WndProc(var TheMessage: TLMessage);
+begin
+ if FGrid<>nil then
+ case TheMessage.Msg of
+ LM_CLEAR,
+ LM_CUT,
+ LM_PASTE:
+ begin
+ if FGrid.EditorIsReadOnly then
+ exit;
+ end;
+ end;
+
+ if TheMessage.msg = LM_KILLFOCUS then
+ begin
+ if HWND(TheMessage.WParam) = HWND(Handle) then
+ begin
+ // lost the focus but it returns to ourselves
+ // eat the message.
+ TheMessage.Result := 0;
+ exit;
+ end;
+ end;
+ inherited WndProc(TheMessage);
+end;
+
+procedure TRxDBGridDateEditor.msg_SetGrid(var Msg: TGridMessage);
+begin
+ FGrid := Msg.Grid as TRxDBGrid;
+ Msg.Options := EO_AUTOSIZE or EO_SELECTALL
+ {or EO_HOOKEXIT or EO_HOOKKEYPRESS or EO_HOOKKEYUP};
+end;
+
+procedure TRxDBGridDateEditor.msg_SetValue(var Msg: TGridMessage);
+begin
+ Self.Date := FGrid.SelectedField.AsDateTime;
+end;
+
+procedure TRxDBGridDateEditor.msg_GetValue(var Msg: TGridMessage);
+var
+ sText: string;
+begin
+ sText := Text;
+ Msg.Value := sText;
+end;
+
+procedure TRxDBGridDateEditor.msg_SelectAll(var Msg: TGridMessage);
+begin
+ SelectAll;
+end;
+
+constructor TRxDBGridDateEditor.Create(Aowner: TComponent);
+begin
+ inherited Create(Aowner);
+ AutoSize := false;
+ UpdateMask;
+end;
+
+ {
+procedure TRxDBGridDateEditor.SetBounds(aLeft, aTop, aWidth, aHeight: integer);
+begin
+ Dec(aWidth, 25); //ButtonWidth);
+ inherited SetBounds(aLeft, aTop, aWidth, aHeight);
+end; }
+
+
+procedure TRxDBGridDateEditor.EditingDone;
+begin
+ inherited EditingDone;
+ if FGrid <> nil then
+ FGrid.EditingDone;
+end;
+
+
+{ TRxDBGridLookupComboEditor }
+
+procedure TRxDBGridLookupComboEditor.WndProc(var TheMessage: TLMessage);
+begin
+ if TheMessage.msg = LM_KILLFOCUS then
+ begin
+ if HWND(TheMessage.WParam) = HWND(Handle) then
+ begin
+ // lost the focus but it returns to ourselves
+ // eat the message.
+ TheMessage.Result := 0;
+ exit;
+ end;
+ end;
+ inherited WndProc(TheMessage);
+end;
+
+procedure TRxDBGridLookupComboEditor.KeyDown(var Key: word; Shift: TShiftState);
+
+ procedure doGridKeyDown;
+ begin
+ if Assigned(FGrid) then
+// FGrid.EditorkeyDown(Self, key, shift);
+ FGrid.KeyDown(Key, shift);
+ end;
+
+ procedure doEditorKeyDown;
+ begin
+ if FGrid <> nil then
+ FGrid.EditorkeyDown(Self, key, shift);
+ end;
+
+ function GetFastEntry: boolean;
+ begin
+ if FGrid <> nil then
+ Result := FGrid.FastEditing
+ else
+ Result := False;
+ end;
+ procedure CheckEditingKey;
+ begin
+ if (FGrid=nil) or FGrid.EditorIsReadOnly then
+ Key := 0;
+ end;
+
+begin
+ CheckEditingKey;
+ case Key of
+ VK_UP,
+ VK_DOWN:
+ if (not PopupVisible) and (not (ssAlt in Shift)) then
+ begin
+ doGridKeyDown;
+ Key:=0;
+ exit;
+ end;
+ VK_LEFT, VK_RIGHT:
+ if GetFastEntry then
+ begin
+ doGridKeyDown;
+ exit;
+ end;
+ else
+ begin
+ inherited KeyDown(Key, Shift);
+ doEditorKeyDown;
+ exit;
+ end;
+ end;
+ inherited KeyDown(Key, Shift);
+{ if FGrid<>nil then
+ FGrid.EditingDone;}
+end;
+
+procedure TRxDBGridLookupComboEditor.msg_SetGrid(var Msg: TGridMessage);
+begin
+ FGrid := Msg.Grid as TRxDBGrid;
+ Msg.Options := EO_AUTOSIZE;
+end;
+
+procedure TRxDBGridLookupComboEditor.msg_SetValue(var Msg: TGridMessage);
+var
+ F: TField;
+begin
+ FCol := Msg.Col;
+ FRow := Msg.Row;
+ F := FGrid.SelectedField;
+ DataSource := FGrid.DataSource;
+ if Assigned(F) then
+ begin
+ // DataField:=F.FieldName;
+ DataField := F.KeyFields;
+ LookupDisplay := F.LookupResultField;
+ LookupField := F.LookupKeyFields;
+ FLDS.DataSet := F.LookupDataSet;
+ FGrid.GetOnCreateLookup;
+ end;
+end;
+
+procedure TRxDBGridLookupComboEditor.msg_GetValue(var Msg: TGridMessage);
+var
+ sText: string;
+ F:TField;
+begin
+ if Assigned(FGrid.SelectedField) and Assigned(FLDS.DataSet) then
+ begin
+ F:=FLDS.DataSet.FieldByName(LookupDisplay);
+ if Assigned(F) then
+ begin
+ sText := F.DisplayText;
+ Msg.Value := sText;
+ end;
+ end;
+end;
+
+procedure TRxDBGridLookupComboEditor.ShowList;
+begin
+ FGrid.GetOnDisplayLookup;
+ inherited ShowList;
+end;
+
+procedure TRxDBGridLookupComboEditor.OnInternalClosePopup(AResult: boolean);
+ procedure CheckEditingKey;
+ begin
+ if (FGrid=nil) or FGrid.EditorIsReadOnly then
+// Key := 0;
+ end;
+var
+ F:TField;
+begin
+ inherited OnInternalClosePopup(AResult);
+ CheckEditingKey;
+ if (AResult) and Assigned(FGrid.SelectedField) and Assigned(FLDS.DataSet) then
+ begin
+ F:=FLDS.DataSet.FieldByName(LookupDisplay);
+ if Assigned(F) then
+ begin
+ //FGrid.SelectedField.Assign(F);
+ if (FGrid<>nil) and Visible then begin
+ FGrid.SetEditText(FCol, FRow, F.DisplayText);
+ end;
+ end;
+ end;
+end;
+
+constructor TRxDBGridLookupComboEditor.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FLDS := TDataSource.Create(nil);
+ LookupSource := FLDS;
+ AutoSize := false;
+end;
+
+destructor TRxDBGridLookupComboEditor.Destroy;
+begin
+ FreeAndNil(FLDS);
+ inherited Destroy;
+end;
+
+{ TRxDBGrid }
+const
+ ALIGN_FLAGS: array[TAlignment] of integer =
+ (DT_LEFT or DT_SINGLELINE {or DT_EXPANDTABS} or DT_NOPREFIX,
+ DT_RIGHT or DT_SINGLELINE {or DT_EXPANDTABS} or DT_NOPREFIX,
+ DT_CENTER or DT_SINGLELINE {or DT_EXPANDTABS} or DT_NOPREFIX);
+
+const
+ ALIGN_FLAGS_HEADER: array[TAlignment] of integer =
+ (DT_LEFT or {DT_EXPANDTABS or} DT_NOPREFIX,
+ DT_RIGHT or {DT_EXPANDTABS or }DT_NOPREFIX,
+ DT_CENTER or {DT_EXPANDTABS or }DT_NOPREFIX);
+
+{ TITLE_SUBHEADER = 2;
+ TITLE_DEFAULT = 1;
+
+const
+ EdgeFlag: array[Boolean] of UINT = (BDR_RAISEDINNER, BDR_SUNKENINNER);}
+
+procedure WriteTextHeader(ACanvas: TCanvas; ARect: TRect; const Text: string;
+ Alignment: TAlignment);
+var
+ DrawRect: TRect;
+ W, CnvW: integer;
+begin
+ DrawRect := Rect(ARect.Left + 1, ARect.Top + 1, ARect.Right, ARect.Bottom);
+
+ CnvW := Max(DrawRect.Right - DrawRect.Left, 1);
+ W := (ACanvas.TextWidth(Text) div CnvW) + 1;
+
+ DrawRect.Top := ((ARect.Top + ARect.Bottom) div 2) - W * ACanvas.TextHeight('Wg') div 2;
+ if DrawRect.Top < ARect.Top + 1 then
+ DrawRect.Top := ARect.Top + 1;
+
+ SetBkMode(ACanvas.Handle, TRANSPARENT);
+ DrawText(ACanvas.Handle, PChar(Text), Length(Text), DrawRect,
+ // DT_VCENTER or DT_WORDBREAK or DT_CENTER
+ ALIGN_FLAGS_HEADER[Alignment] {or DT_VCENTER or DT_END_ELLIPSIS } or DT_WORDBREAK
+ );
+end;
+
+procedure TRxDBGrid.SetTitleButtons(const AValue: boolean);
+begin
+ if AValue then
+ Options := Options + [dgHeaderPushedLook]
+ else
+ Options := Options - [dgHeaderPushedLook];
+end;
+
+procedure TRxDBGrid.GetScrollbarParams(out aRange, aPage, aPos: Integer);
+begin
+ if (DataSource.DataSet<>nil) and DataSource.DataSet.Active then begin
+ if DataSource.DataSet.IsSequenced then begin
+ aRange := DataSource.DataSet.RecordCount + VisibleRowCount - 1;
+ aPage := VisibleRowCount;
+ if aPage<1 then aPage := 1;
+ if DataSource.DataSet.BOF then aPos := 0 else
+ if DataSource.DataSet.EOF then aPos := aRange
+ else
+ aPos := DataSource.DataSet.RecNo - 1; // RecNo is 1 based
+ if aPos<0 then aPos:=0;
+ end else begin
+ aRange := 6;
+ aPage := 2;
+ if DataSource.DataSet.EOF then aPos := 4 else
+ if DataSource.DataSet.BOF then aPos := 0
+ else aPos := 2;
+ end;
+ end else begin
+ aRange := 0;
+ aPage := 0;
+ aPos := 0;
+ end;
+end;
+
+procedure TRxDBGrid.RestoreEditor;
+begin
+ if EditorMode then
+ begin
+ EditorMode := False;
+ EditorMode := True;
+ end;
+end;
+
+procedure TRxDBGrid.WMVScroll(var Message: TLMVScroll);
+var
+ IsSeq: boolean;
+ aPos, aRange, aPage: Integer;
+ DeltaRec: integer;
+
+ function MaxPos: Integer;
+ begin
+ if IsSeq then
+ result := DataSource.DataSet.RecordCount - 1
+ else
+ result := 4;
+ end;
+
+ procedure DsMoveBy(Delta: Integer);
+ begin
+ DataSource.DataSet.MoveBy(Delta);
+ GetScrollbarParams(aRange, aPage, aPos);
+ end;
+
+ procedure DsGoto(BOF: boolean);
+ begin
+ if BOF then DataSource.DataSet.First
+ else DataSource.DataSet.Last;
+ GetScrollbarParams(aRange, aPage, aPos);
+ end;
+
+begin
+ if not DatalinkActive then exit;
+ IsSeq := DataSource.DataSet.IsSequenced;
+ case Message.ScrollCode of
+ SB_TOP:
+ DsGoto(True);
+ SB_BOTTOM:
+ DsGoto(False);
+ SB_PAGEUP:
+ DsMoveBy(-VisibleRowCount);
+ SB_LINEUP:
+ DsMoveBy(-1);
+ SB_LINEDOWN:
+ DsMoveBy(1);
+ SB_PAGEDOWN:
+ DsMoveBy(VisibleRowCount);
+ SB_THUMBPOSITION:
+ DsMoveBy(Message.Pos - FOldPosition)
+ else
+ Exit;
+ end;
+
+ ScrollBarPosition(SB_VERT, aPos);
+ FOldPosition:=aPos;
+
+ if EditorMode then
+ RestoreEditor;
+ {$ifdef dbgDBGrid}
+ DebugLn('---- Diff=',dbgs(DeltaRec), ' FinalPos=',dbgs(aPos));
+ {$endif}
+end;
+
+procedure TRxDBGrid.SetAutoSort(const AValue: boolean);
+var
+ S: string;
+ Pos: integer;
+begin
+ if FAutoSort = AValue then
+ exit;
+ FAutoSort := AValue;
+ if Assigned(DataSource) and Assigned(DataSource.DataSet) and
+ DataSource.DataSet.Active then
+ begin
+ S := DataSource.DataSet.ClassName;
+ if RxDBGridSortEngineList.Find(S, Pos) then
+ FSortEngine := RxDBGridSortEngineList.Objects[Pos] as TRxDBGridSortEngine
+ else
+ FSortEngine := nil;
+{ FSortField := nil;
+ FSortOrder := smNone;}
+ FSortColumns.Clear;
+ end;
+end;
+
+function TRxDBGrid.GetColumns: TRxDbGridColumns;
+begin
+ Result := TRxDbGridColumns(TCustomDrawGrid(Self).Columns);
+end;
+
+function TRxDBGrid.GetFooterColor: TColor;
+begin
+ Result:=FFooterOptions.FColor;
+end;
+
+function TRxDBGrid.GetFooterRowCount: integer;
+begin
+ Result:=FFooterOptions.RowCount;
+end;
+
+function TRxDBGrid.GetMarkerDown: TBitmap;
+begin
+ Result:=FMarkerDown;
+end;
+
+function TRxDBGrid.GetMarkerUp: TBitmap;
+begin
+ Result:=FMarkerUp;
+end;
+
+function TRxDBGrid.GetDrawFullLine: boolean;
+begin
+ Result := FDrawFullLine;
+end;
+
+procedure TRxDBGrid.SetDrawFullLine(Value: boolean);
+begin
+ FDrawFullLine := Value;
+ VisualChange;
+end;
+
+procedure TRxDBGrid.DoCreateJMenu;
+
+ procedure CreateMenuItem(ShortCut: char; const ACaption: string;
+ MenuAction: TNotifyEvent);
+ var
+ R: TMenuItem;
+ begin
+ R := TMenuItem.Create(F_PopupMenu);
+ F_PopupMenu.Items.Add(R);
+ R.Caption := ACaption;
+ if ShortCut <> #0 then
+ R.ShortCut := KeyToShortCut(Ord(ShortCut), [ssCtrl]);
+ R.OnClick := MenuAction;
+ end;
+
+begin
+ F_PopupMenu := TPopupMenu.Create(Self);
+ F_PopupMenu.Name := 'OptionsMenu';
+ CreateMenuItem('F', sRxDBGridFind, @OnFind);
+ CreateMenuItem('T', sRxDBGridFilter, @OnFilterBy);
+ CreateMenuItem('E', sRxDBGridFilterSimple, @OnFilter);
+ CreateMenuItem('Q', sRxDBGridFilterClear, @OnFilterClose);
+ CreateMenuItem(#0, '-', nil);
+ CreateMenuItem('C', sRxDBGridSortByColumns, @OnSortBy);
+ CreateMenuItem('W', sRxDBGridSelectColumns, @OnChooseVisibleFields);
+ CreateMenuItem('A', sRxDBGridSelectAllRows, @OnSelectAllRows);
+ CreateMenuItem(#0, sRxDBGridCopyCellValue, @OnCopyCellValue);
+end;
+
+{$IFDEF RxDBGridDepricatedProps}
+function TRxDBGrid.GetAllowedOperations: TRxDBGridAllowedOperations;
+begin
+ Result:=[];
+ if dgDisableInsert in Options then
+ Result:=Result - [aoInsert, aoAppend]
+ else
+ Result:=Result + [aoInsert, aoAppend]
+ ;
+
+ if dgDisableDelete in Options then
+ Result:=Result - [aoDelete]
+ else
+ Result:=Result + [aoDelete]
+ ;
+end;
+{$ENDIF}
+
+function TRxDBGrid.GetPropertyStorage: TCustomPropertyStorage;
+begin
+ Result := FPropertyStorageLink.Storage;
+end;
+
+function TRxDBGrid.GetSortField: string;
+begin
+ if FSortColumns.Count > 0 then
+ Result:=FSortColumns[0].GetSortFields
+ else
+ Result:='';
+end;
+
+function TRxDBGrid.GetSortOrder: TSortMarker;
+begin
+ if FSortColumns.Count > 0 then
+ Result:=FSortColumns[0].SortOrder
+ else
+ Result:=smNone;
+end;
+
+function TRxDBGrid.GetTitleButtons: boolean;
+begin
+ Result := dgHeaderPushedLook in Options;
+end;
+
+function TRxDBGrid.IsColumnsStored: boolean;
+begin
+ Result := TRxDbGridColumns(TCustomDrawGrid(Self).Columns).Enabled;
+end;
+
+{$IFDEF RxDBGridDepricatedProps}
+procedure TRxDBGrid.SetAllowedOperations(AValue: TRxDBGridAllowedOperations);
+begin
+// FAllowedOperations:=AValue;
+ if [aoInsert, aoAppend] * AValue <> [aoInsert, aoAppend] then
+ Options:=Options - [dgDisableInsert]
+ else
+ Options:=Options + [dgDisableInsert];
+
+ if aoDelete in AValue then
+ Options:=Options - [dgDisableDelete]
+ else
+ Options:=Options + [dgDisableDelete]
+end;
+{$ENDIF}
+
+procedure TRxDBGrid.SetColumns(const AValue: TRxDbGridColumns);
+begin
+ TRxDbGridColumns(TCustomDrawGrid(Self).Columns).Assign(Avalue);
+end;
+
+procedure TRxDBGrid.SetFooterColor(const AValue: TColor);
+begin
+ FFooterOptions.Color := AValue;
+end;
+
+procedure TRxDBGrid.SetFooterOptions(AValue: TRxDBGridFooterOptions);
+begin
+ FFooterOptions.AssignTo(AValue);
+end;
+
+procedure TRxDBGrid.SetFooterRowCount(const AValue: integer);
+begin
+ FFooterOptions.RowCount:=AValue;
+end;
+
+procedure TRxDBGrid.SetKeyStrokes(const AValue: TRxDBGridKeyStrokes);
+begin
+ if Assigned(AValue) then
+ FKeyStrokes.Assign(AValue)
+ else
+ FKeyStrokes.Clear;
+
+ UpdateJMenuKeys;
+end;
+
+procedure TRxDBGrid.SetMarkerDown(AValue: TBitmap);
+begin
+ FMarkerDown.Assign(AValue);
+end;
+
+procedure TRxDBGrid.SetMarkerUp(AValue: TBitmap);
+begin
+ FMarkerUp.Assign(AValue);
+end;
+
+procedure TRxDBGrid.SetOptionsRx(const AValue: TOptionsRx);
+var
+ OldOpt: TOptionsRx;
+begin
+ if FOptionsRx = AValue then
+ exit;
+ BeginUpdate;
+ OldOpt := FOptionsRx;
+ FOptionsRx := AValue;
+ UseXORFeatures := rdgXORColSizing in AValue;
+ if (rdgFilter in AValue) and not (rdgFilter in OldOpt) then
+ begin
+ LayoutChanged;
+{ BeginUpdate;
+ CalcTitle;
+ EndUpdate;}
+ end
+ else
+ if rdgFilter in OldOpt then
+ begin
+ FFilterListEditor.Hide;
+ LayoutChanged;
+{ BeginUpdate;
+ CalcTitle;
+ EndUpdate;}
+ end;
+
+ FFooterOptions.FActive:=rdgFooterRows in FOptionsRx;
+
+ if (rdgWordWrap in OldOpt) and not (rdgWordWrap in FOptionsRx) then
+ ResetRowHeght;
+
+// VisualChange;
+ EndUpdate;
+end;
+
+procedure TRxDBGrid.SetPropertyStorage(const AValue: TCustomPropertyStorage);
+begin
+ FPropertyStorageLink.Storage := AValue;
+end;
+
+function TRxDBGrid.DatalinkActive: boolean;
+begin
+ Result := Assigned(DataSource) and Assigned(DataSource.DataSet) and
+ DataSource.DataSet.Active;
+end;
+
+procedure TRxDBGrid.AdjustEditorBounds(NewCol, NewRow: Integer);
+begin
+ inherited AdjustEditorBounds(NewCol, NewRow);
+ if EditorMode then
+ begin
+ DoSetColEdtBtn;
+ end;
+end;
+
+procedure TRxDBGrid.TrackButton(X, Y: integer);
+var
+ Cell: TGridCoord;
+ NewPressed: boolean;
+ I, Offset: integer;
+begin
+ Cell := MouseCoord(X, Y);
+ Offset := RowCount;//[0];
+ NewPressed := PtInRect(Rect(0, 0, ClientWidth, ClientHeight), Point(X, Y)) and
+ (FPressedCol = TColumn(ColumnFromGridColumn(Cell.X))) and (Cell.Y < Offset);
+ if FPressed <> NewPressed then
+ begin
+ FPressed := NewPressed;
+ for I := 0 to Offset - 1 do
+ GridInvalidateRow(Self, I);
+ end;
+end;
+
+procedure TRxDBGrid.StopTracking;
+begin
+ if FTracking then
+ begin
+ TrackButton(-1, -1);
+ FTracking := False;
+ MouseCapture := False;
+ end;
+end;
+
+procedure TRxDBGrid.CalcTitle;
+var
+ i, j: integer;
+ H, H1, W, H2, W1: integer;
+ rxCol, rxColNext: TRxColumn;
+ rxTit, rxTitleNext: TRxColumnTitle;
+ MLRec1, P: TMLCaptionItem;
+ MLRec2: TMLCaptionItem;
+ tmpCanvas: TCanvas;
+ S: string;
+begin
+ { TODO -oalexs : need rewrite code - split to 2 step:
+1. make links between column
+2. calc title width for all linked column series }
+ if RowCount = 0 then
+ exit;
+ tmpCanvas := GetWorkingCanvas(Canvas);
+ try
+// H := 1;
+ ClearMLCaptionPointers;
+ for i := 0 to Columns.Count - 1 do
+ begin
+ rxCol := TRxColumn(Columns[i]);
+ if Assigned(rxCol) and rxCol.Visible then
+ begin
+ rxTit := TRxColumnTitle(rxCol.Title);
+ if Assigned(rxTit) then
+ begin
+ if rxTit.Orientation in [toVertical270, toVertical90] then
+// H := Max((tmpCanvas.TextWidth(Columns[i].Title.Caption) + tmpCanvas.TextWidth('W')*2) div DefaultRowHeight, H)
+ else
+ begin
+ rxColNext := nil;
+ rxTitleNext := nil;
+ if i < Columns.Count - 1 then
+ begin
+ rxColNext := TRxColumn(Columns[i + 1]);
+ rxTitleNext := TRxColumnTitle(rxColNext.Title);
+ end;
+
+// W := Max(rxCol.Width - 6, 1);
+ if rxTit.CaptionLinesCount > 0 then
+ begin
+// H2 := 0;
+// H1 := 0;
+ for j := 0 to rxTit.CaptionLinesCount - 1 do
+ begin
+ MLRec1 := rxTit.CaptionLine(j);
+
+ if Assigned(rxTitleNext) and (rxTitleNext.CaptionLinesCount > j) then
+ begin
+ //make links to next column - and in the next column set link to prior-current
+ MLRec2 := rxTitleNext.CaptionLine(j);
+ if MLRec1.Caption = MLRec2.Caption then
+ begin
+ MLRec1.Next := MLRec2;
+ MLRec2.Prior := MLRec1;
+ end
+ else
+ break;
+ end;
+
+ MLRec1.Width := tmpCanvas.TextWidth(MLRec1.Caption) + 2;
+
+{ if W > MLRec1.Width then
+ H2 := 1
+ else
+ H2 := MLRec1.Width div W + 1;
+
+ if H2 > WordCount(MLRec1.Caption, [' ']) then
+ H2 := WordCount(MLRec1.Caption, [' ']);
+
+ H1 := H1 + H2;}
+ end;
+ end
+{ else
+ begin
+ H1 := Max((tmpCanvas.TextWidth(rxTit.Caption) + 2) div W + 1, H);
+ if H1 > WordCount(rxTit.Caption, [' ']) then
+ H1 := WordCount(rxTit.Caption, [' ']);
+ end;
+ H := Max(H1, H); }
+ end;
+
+ for j := 0 to rxTit.CaptionLinesCount - 1 do
+ begin
+ MLRec1 := rxTit.CaptionLine(j);
+ if MLRec1.Width < rxTit.Column.Width then
+ MLRec1.Width := rxTit.Column.Width;
+ end;
+
+ end;
+ end;
+ end;
+
+ //Тут расчёт высоты заголовка каждой колонки - надо обработать слитые заголовки
+
+ H := 1;
+ for i := 0 to Columns.Count - 1 do
+ begin
+ rxCol := TRxColumn(Columns[i]);
+ rxTit := TRxColumnTitle(rxCol.Title);
+ H1 := 0;
+ W := Max(rxCol.Width - 6, 1);
+ //Не забудем про вертикальную ориентацию
+ if Assigned(rxCol) and rxCol.Visible and Assigned(rxTit) then
+ begin
+ if rxTit.Orientation in [toVertical270, toVertical90] then
+ H1 := Max((tmpCanvas.TextWidth(Columns[i].Title.Caption) +
+ tmpCanvas.TextWidth('W')) div DefaultRowHeight, H)
+ else
+ begin
+ if rxTit.CaptionLinesCount = 0 then
+ begin
+ H1 := Max((tmpCanvas.TextWidth(rxTit.Caption) + 2) div W + 1, H);
+ if H1 > WordCount(rxTit.Caption, [' ']) then
+ H1 := WordCount(rxTit.Caption, [' ']);
+ end
+ else
+ begin
+ if rxTit.CaptionLinesCount > H then
+ H := rxTit.CaptionLinesCount;
+ for j := 0 to rxTit.CaptionLinesCount - 1 do
+ begin
+ MLRec1 := rxTit.CaptionLine(j);
+ S := MLRec1.Caption;
+ if not Assigned(MLRec1.Prior) then
+ begin
+ W := rxCol.Width;
+ P := MLRec1.Next;
+ while Assigned(P) do
+ begin
+ Inc(W, P.Col.Width);
+ P := P.Next;
+ end;
+ W1 := tmpCanvas.TextWidth(MLRec1.Caption) + 2;
+ if W1 > W then
+ MLRec1.Hegth := Min(W1 div Max(W, 1) + 1, UTF8Length(MLRec1.Caption))
+ else
+ MLRec1.Hegth := 1;
+
+ P := MLRec1.Next;
+ while Assigned(P) do
+ begin
+ P.Hegth := MLRec1.Hegth;
+ P := P.Next;
+ end;
+ end;
+ H1 := H1 + MLRec1.Hegth;
+ end;
+
+ end;
+ end;
+ end;
+ if H1 > H then
+ H := H1;
+ end;
+
+ RowHeights[0] := DefaultRowHeight * H;
+
+ if rdgFilter in OptionsRx then
+ begin
+ if Assigned(FFilterListEditor) then
+ begin
+ RowHeights[0] := RowHeights[0] + FFilterListEditor.Height
+ end
+ else
+ begin
+ RowHeights[0] := RowHeights[0] + DefaultRowHeight;
+ end;
+ end;
+
+ finally
+ if TmpCanvas <> Canvas then
+ FreeWorkingCanvas(tmpCanvas);
+ end;
+end;
+
+procedure TRxDBGrid.ClearMLCaptionPointers;
+var
+ i, j: integer;
+ rxCol: TRxColumn;
+ rxTit: TRxColumnTitle;
+begin
+ for i := 0 to Columns.Count - 1 do
+ begin
+ rxCol := TRxColumn(Columns[i]);
+ if Assigned(rxCol) then
+ begin
+ rxTit := TRxColumnTitle(rxCol.Title);
+ if Assigned(rxTit) then
+ begin
+ for j := 0 to rxTit.CaptionLinesCount - 1 do
+ begin
+ rxTit.CaptionLine(j).Next := nil;
+ rxTit.CaptionLine(j).Prior := nil;
+ end;
+ end;
+ end;
+ end;
+end;
+
+function TRxDBGrid.getFilterRect(bRect: TRect): TRect;
+begin
+ Result := bRect;
+ if Assigned(FFilterListEditor) then
+ Result.Top := bRect.Bottom - FFilterListEditor.Height
+ else
+ Result.Top := bRect.Bottom - DefaultRowHeight;
+end;
+
+function TRxDBGrid.getTitleRect(bRect: TRect): TRect;
+begin
+ Result := bRect;
+ if Assigned(FFilterListEditor) then
+ Result.Bottom := bRect.Bottom - FFilterListEditor.Height
+ else
+ Result.Bottom := bRect.Bottom - DefaultRowHeight;
+end;
+
+procedure TRxDBGrid.OutCaptionCellText(aCol, aRow: integer; const aRect: TRect;
+ aState: TGridDrawState; const ACaption: string);
+var
+ T1, T2: TTextStyle;
+begin
+ if (TitleStyle = tsNative) then
+ DrawThemedCell(aCol, aRow, aRect, aState)
+ else
+ begin
+ Canvas.FillRect(aRect);
+ DrawCellGrid(aCol, aRow, aRect, aState);
+ end;
+
+ if ACaption <> '' then
+ begin
+{ T1:=Canvas.TextStyle;
+ T2:=T1;
+ T1.Wordbreak:=true;
+ Canvas.TextStyle:=T1;
+ DrawCellText(aCol, aRow, aRect, aState, ACaption);
+ Canvas.TextStyle:=T2; }
+ WriteTextHeader(Canvas, aRect, ACaption, GetColumnAlignment(aCol, True));
+ end;
+end;
+
+procedure TRxDBGrid.OutCaptionCellText90(aCol, aRow: integer;
+ const aRect: TRect; aState: TGridDrawState; const ACaption: string;
+ const TextOrient: TTextOrientation);
+var
+ dW, dY: integer;
+begin
+ if (TitleStyle = tsNative) then
+ DrawThemedCell(aCol, aRow, aRect, aState)
+ else
+ begin
+ Canvas.FillRect(aRect);
+ DrawCellGrid(aCol, aRow, aRect, aState);
+ end;
+
+
+ if TextOrient in [toVertical90, toVertical270] then
+ begin
+ dW := ((aRect.Bottom - aRect.Top) - Canvas.TextWidth(ACaption)) div 2;
+ dY := ((aRect.Right - aRect.Left) - Canvas.TextHeight(ACaption)) div 2;
+ end
+ else
+ begin
+ dW := 0;
+ dY := 0;
+ end;
+ OutTextXY90(Canvas, aRect.Left + dY, aRect.Top + dw, ACaption, TextOrient);
+end;
+
+procedure TRxDBGrid.OutCaptionSortMarker(const aRect: TRect;
+ ASortMarker: TSortMarker; ASortPosition: integer);
+var
+ X, Y, W: integer;
+ S:string;
+ F:TFont;
+begin
+ if (dgHeaderPushedLook in Options) then
+ begin
+ if (ASortMarker <> smNone) and (ASortPosition>0) then
+ begin
+ F:=TFont.Create;
+ F.Assign(Font);
+
+ if Font.Size = 0 then
+ Font.Size:=7
+ else
+ Font.Size:=Font.Size-2;
+ S:='('+IntToStr(ASortPosition)+')';
+ W:=Canvas.TextWidth(S) + 10;
+ end
+ else
+ begin
+ W:=6;
+ F:=nil;
+ end;
+
+ if ASortMarker = smDown then
+ begin
+ X := aRect.Right - FMarkerDown.Width - W;
+ Y := Trunc((aRect.Top + aRect.Bottom - FMarkerDown.Height) / 2);
+ Canvas.Draw(X, Y, FMarkerDown);
+ end
+ else
+ if ASortMarker = smUp then
+ begin
+ X := aRect.Right - FMarkerUp.Width - W;
+ Y := Trunc((aRect.Top + aRect.Bottom - FMarkerUp.Height) / 2);
+ Canvas.Draw(X, Y, FMarkerUp);
+ end;
+
+ if Assigned(F) then
+ begin
+ Canvas.TextOut( X + FMarkerDown.Width, Y, S);
+ Font.Assign(F);
+ FreeAndNil(F);
+ end;
+
+ end;
+end;
+
+procedure TRxDBGrid.OutCaptionMLCellText(aCol, aRow: integer;
+ aRect: TRect; aState: TGridDrawState; MLI: TMLCaptionItem);
+var
+ MLINext: TMLCaptionItem;
+ Rgn: HRGN;
+begin
+ MLINext := MLI.Next;
+ while Assigned(MLINext) do
+ begin
+ aRect.Right := aRect.Right + MLINext.Col.Width;
+ MLINext := MLINext.Next;
+ end;
+
+ // OutCaptionCellText(aCol, aRow, aRect, aState, MLI.Caption);
+ Rgn := CreateRectRgn(aRect.Left, aRect.Top, aRect.Right, aRect.Bottom);
+ SelectClipRgn(Canvas.Handle, Rgn);
+ OutCaptionCellText(aCol, aRow, aRect, aState, MLI.Caption);
+ SelectClipRgn(Canvas.Handle, 0);
+ DeleteObject(Rgn);
+end;
+
+procedure TRxDBGrid.UpdateJMenuStates;
+begin
+ F_PopupMenu.Items[0].Visible := rdgAllowDialogFind in FOptionsRx;
+ F_PopupMenu.Items[1].Visible := rdgAllowFilterForm in FOptionsRx;
+ F_PopupMenu.Items[2].Visible := rdgAllowQuickFilter in FOptionsRx;
+ F_PopupMenu.Items[3].Visible :=
+ (rdgFilter in FOptionsRx) or (rdgAllowFilterForm in FOptionsRx);
+ F_PopupMenu.Items[5].Visible := rdgAllowSortForm in FOptionsRx;
+ F_PopupMenu.Items[6].Visible := rdgAllowColumnsForm in FOptionsRx;
+ F_PopupMenu.Items[7].Visible := dgMultiselect in Options;
+end;
+
+procedure TRxDBGrid.UpdateJMenuKeys;
+
+ function DoShortCut(Cmd: TRxDBGridCommand): TShortCut;
+ var
+ K: TRxDBGridKeyStroke;
+ begin
+ K := FKeyStrokes.FindRxKeyStrokes(Cmd);
+ if Assigned(K) and K.Enabled then
+ Result := K.ShortCut
+ else
+ Result := 0;
+ end;
+
+begin
+ F_PopupMenu.Items[0].ShortCut := DoShortCut(rxgcShowFindDlg);
+ F_PopupMenu.Items[1].ShortCut := DoShortCut(rxgcShowFilterDlg);
+ F_PopupMenu.Items[2].ShortCut := DoShortCut(rxgcShowQuickFilter);
+ F_PopupMenu.Items[3].ShortCut := DoShortCut(rxgcHideQuickFilter);
+ F_PopupMenu.Items[5].ShortCut := DoShortCut(rxgcShowSortDlg);
+ F_PopupMenu.Items[6].ShortCut := DoShortCut(rxgcShowColumnsDlg);
+ F_PopupMenu.Items[7].ShortCut := DoShortCut(rxgcSelectAll);
+end;
+
+function TRxDBGrid.SortEngineOptions: TRxSortEngineOptions;
+begin
+ Result := [];
+ if rdgCaseInsensitiveSort in FOptionsRx then
+ Include(Result, seoCaseInsensitiveSort);
+end;
+
+procedure TRxDBGrid.OnIniSave(Sender: TObject);
+var
+ i: integer;
+ S, S1: string;
+ C: TRxColumn;
+begin
+ S := Owner.Name + '.' + Name;
+ FPropertyStorageLink.Storage.WriteInteger(S + sVersion, FVersion);
+ FPropertyStorageLink.Storage.WriteInteger(S + sCount, Columns.Count);
+ S := S + sItem;
+ for i := 0 to Columns.Count - 1 do
+ begin
+ S1 := S + IntToStr(i);
+ C := TRxColumn(Columns[i]);
+ FPropertyStorageLink.Storage.WriteString(S1 + sCaption,
+ StrToHexText(C.Title.Caption));
+ FPropertyStorageLink.Storage.WriteInteger(S1 + sWidth, C.Width);
+ FPropertyStorageLink.Storage.WriteInteger(S1 + sIndex, C.Index);
+ FPropertyStorageLink.Storage.WriteInteger(S1 + sVisible, Ord(C.Visible));
+ end;
+
+ { TODO : Необходимо подключить сохранение списка колонок сортировки }
+{
+ FSortColumns;
+ if Assigned(FSortField) then
+ begin
+ FPropertyStorageLink.Storage.WriteInteger(S1 + sSortMarker, Ord(FSortOrder));
+ FPropertyStorageLink.Storage.WriteString(S1 + sSortField, FSortField.FieldName);
+ end
+ else
+ FPropertyStorageLink.Storage.WriteInteger(S1 + sSortMarker, Ord(smNone));
+}
+end;
+
+procedure TRxDBGrid.OnIniLoad(Sender: TObject);
+var
+ i, ACount: integer;
+ S, S1, ColumName: string;
+ C: TRxColumn;
+
+begin
+ S := Owner.Name + '.' + Name;
+ ACount := FPropertyStorageLink.Storage.ReadInteger(S + sVersion, FVersion);
+ //Check cfg version
+ if ACount = FVersion then
+ begin
+ ACount := FPropertyStorageLink.Storage.ReadInteger(S + sCount, 0);
+ S := S + sItem;
+ for i := 0 to ACount - 1 do
+ begin
+ S1 := S + IntToStr(i);
+ ColumName := HexTextToStr(FPropertyStorageLink.Storage.ReadString(S1 +
+ sCaption, ''));
+ if ColumName <> '' then
+ begin
+ C := ColumnByCaption(ColumName);
+ if Assigned(C) then
+ begin
+ C.Width := FPropertyStorageLink.Storage.ReadInteger(S1 + sWidth, C.Width);
+ C.Visible := FPropertyStorageLink.Storage.ReadInteger(S1 +
+ sVisible, Ord(C.Visible)) = 1;
+ C.Index := Min(FPropertyStorageLink.Storage.ReadInteger(S1 + sIndex, C.Index),
+ Columns.Count - 1);
+ end;
+ end;
+ end;
+
+ { TODO : Необходимо подключить востановление списка колонок сортировки }
+{ FSortOrder := TSortMarker(FPropertyStorageLink.Storage.ReadInteger(
+ S1 + sSortMarker, Ord(smNone)));
+ if Assigned(FSortEngine) and (FSortOrder <> smNone) and DatalinkActive then
+ begin
+ ColumName := FPropertyStorageLink.Storage.ReadString(S1 + sSortField, '');
+ if ColumName <> '' then
+ begin
+ FSortField := DataSource.DataSet.FindField(ColumName);
+ if Assigned(FSortField) then
+ FSortEngine.Sort(FSortField, DataSource.DataSet, FSortOrder = smUp,
+ SortEngineOptions);
+ end;
+ end;}
+ end;
+end;
+
+procedure TRxDBGrid.CleanDSEvent;
+begin
+ if Assigned(DataSource) and Assigned(DataSource.DataSet) then
+ begin
+ if DataSource.DataSet.OnPostError = @ErrorPo then
+ DataSource.DataSet.OnPostError := F_EventOnPostError;
+
+ if DataSource.DataSet.OnFilterRecord = @FilterRec then
+ DataSource.DataSet.OnFilterRecord := F_EventOnFilterRec;
+
+ if DataSource.DataSet.BeforeDelete = @BeforeDel then
+ DataSource.DataSet.BeforeDelete := F_EventOnBeforeDelete;
+
+ if DataSource.DataSet.BeforePost = @BeforePo then
+ DataSource.DataSet.BeforePost:=F_EventOnBeforePost;
+
+ if DataSource.DataSet.OnDeleteError = @ErrorDel then
+ DataSource.DataSet.OnDeleteError:=F_EventOnDeleteError;
+
+ if DataSource.DataSet.OnPostError = @ErrorPo then
+ DataSource.DataSet.OnPostError:=F_EventOnPostError;
+
+ F_EventOnPostError:=nil;
+ F_EventOnFilterRec:=nil;
+ F_EventOnBeforeDelete:=nil;
+ F_EventOnBeforePost:=nil;
+ F_EventOnDeleteError:=nil;
+ F_EventOnPostError:=nil;
+ end;
+end;
+
+procedure TRxDBGrid.CollumnSortListUpdate;
+var
+ i, J:integer;
+ C:TRxColumn;
+
+begin
+ FSortColumns.Clear;
+ for i:=0 to Columns.Count - 1 do
+ begin
+ C:=TRxColumn(Columns[i]);
+ if C.SortOrder <> smNone then
+ begin
+ if FSortColumns.Count <> 0 then
+ begin
+ for j:=0 to FSortColumns.Count-1 do
+ if FSortColumns[j].FSortPosition > C.FSortPosition then
+ begin
+ FSortColumns.Insert(j, C);
+ C:=nil;
+ Break;
+ end;
+ end;
+ if C<>nil then
+ FSortColumns.Add(C);
+ end;
+ end;
+
+ for i:=0 to FSortColumns.Count - 1 do
+ FSortColumns[i].FSortPosition:=i;
+end;
+
+procedure TRxDBGrid.CollumnSortListClear;
+var
+ i:integer;
+begin
+ FSortColumns.Clear;
+ for i:=0 to Columns.Count - 1 do
+ begin
+ TRxColumn(Columns[i]).FSortOrder:=smNone;
+ TRxColumn(Columns[i]).FSortPosition:=0;
+ end;
+end;
+
+procedure TRxDBGrid.CollumnSortListApply;
+var
+ i:integer;
+ S:string;
+ Asc:array of boolean;
+begin
+ if (FSortColumns.Count = 0) then exit;
+ FSortingNow:=true;
+ if (FSortColumns.Count>1) or (Pos(';', FSortColumns[0].GetSortFields)>0) then
+ begin
+ SetLength(Asc, FSortColumns.Count);
+ for i := 0 to FSortColumns.Count - 1 do
+ begin
+ Asc[i]:=FSortColumns[i].FSortOrder = smUp;
+ if S<>'' then
+ S:=S+';';
+ S:=S + FSortColumns[i].GetSortFields;
+ end;
+ { TODO : Необходимо добавить опцию регистронезависимого поиска }
+ FSortEngine.SortList(S, DataSource.DataSet, Asc, SortEngineOptions);
+ end
+ else
+ FSortEngine.Sort(FSortColumns[0].GetSortFields, DataSource.DataSet, FSortColumns[0].FSortOrder = smUp, SortEngineOptions);
+ FSortingNow:=false;
+end;
+
+procedure TRxDBGrid.Notification(AComponent: TComponent; Operation: TOperation);
+begin
+ inherited Notification(AComponent, Operation);
+ if Assigned(Datalink) and (AComponent = DataSource) and (Operation = opRemove) then
+ begin
+ ShowMessage('i');
+ end
+ else
+ if (Operation = opRemove) and (AComponent is TRxDBGridAbstractTools) then
+ RemoveTools(TRxDBGridAbstractTools(AComponent));
+end;
+
+function TRxDBGrid.UpdateRowsHeight: integer;
+var
+ i, J, H, H1, H2:integer;
+ B:boolean;
+ F:TField;
+ S:string;
+ CurActiveRecord: Integer;
+ R:TRxColumn;
+begin
+ Result:=0;
+ if not (Assigned(DataLink) and DataLink.Active) then
+ exit;
+
+ CurActiveRecord:=DataLink.ActiveRecord;
+ H2:=0;
+ for i:=GCache.VisibleGrid.Top to GCache.VisibleGrid.Bottom do
+ begin
+ DataLink.ActiveRecord:=i - FixedRows;
+ H:=1;
+ for j:=0 to Columns.Count-1 do
+ begin
+ R:=Columns[j] as TRxColumn;;
+ if R.WordWrap then
+ begin
+ F:=R.Field;
+ if Assigned(F) then
+ S:=F.DisplayText
+ else
+ S:='';
+
+ H1 := Max((Canvas.TextWidth(S) + 2) div R.Width + 1, H);
+ if H1 > WordCount(S, [' ']) then
+ H1 := WordCount(S, [' ']);
+ end
+ else
+ H1:=1;
+ H:=Max(H, H1);
+ end;
+
+ if i0 then
+ begin
+ if Editor.Name = 'ButtonEditor' then
+ begin
+ Editor.Left:=Editor.Left - W;
+ W:=Editor.Width + Editor.Left;
+ end
+ else
+ begin
+ Editor.Width:=Editor.Width - W;
+ W:=Editor.Width + Editor.Left;
+ end;
+
+ for i:=0 to R.EditButtons.Count-1 do
+ if R.EditButtons[i].Visible then
+ begin
+ if R.EditButtons[i].Style = ebsUpDownRx then
+ begin
+ SB:=R.EditButtons[i].FSpinBtn;
+ TRxSpinButton(SB).FocusControl:=Editor;
+ end
+ else
+ SB:=R.EditButtons[i].FButton;
+
+ SB.Parent:=Self;
+ SB.Left:=W;
+ SB.Top:=Editor.Top;
+ SB.Height:=Editor.Height;
+ SB.Visible:=true;
+{
+ R.EditButtons[i].FButton.Parent:=Self;
+ R.EditButtons[i].FButton.Left:=W;
+ R.EditButtons[i].FButton.Top:=Editor.Top;
+ R.EditButtons[i].FButton.Height:=Editor.Height;
+ R.EditButtons[i].Visible:=true;
+}
+ W:=W+R.EditButtons[i].Width;
+ end;
+ end;
+ end;
+end;
+
+procedure TRxDBGrid.AddTools(ATools: TRxDBGridAbstractTools);
+var
+ i:integer;
+ R: TMenuItem;
+begin
+ for i:=8 to F_PopupMenu.Items.Count - 1 do
+ if F_PopupMenu.Items[i].Tag = IntPtr(ATools) then
+ exit;
+
+ R := TMenuItem.Create(F_PopupMenu);
+ F_PopupMenu.Items.Add(R);
+ R.Caption := ATools.FCaption;
+ R.OnClick := @(ATools.ExecTools);
+ R.Tag:=IntPtr(ATools);
+end;
+
+procedure TRxDBGrid.RemoveTools(ATools: TRxDBGridAbstractTools);
+var
+ i:integer;
+ R: TMenuItem;
+begin
+ for i:=8 to F_PopupMenu.Items.Count - 1 do
+ if F_PopupMenu.Items[i].Tag = IntPtr(ATools) then
+ begin
+ R:=F_PopupMenu.Items[i];
+ F_PopupMenu.Items.Delete(i);
+ R.Free;
+ exit;
+ end;
+end;
+
+{
+procedure TRxDBGrid.UpdateHorzScrollBar(const aVisible: boolean; const aRange,
+ aPage, aPos: Integer);
+begin
+ inherited UpdateHorzScrollBar(aVisible, aRange, aPage, aPos);
+end;
+
+procedure TRxDBGrid.UpdateVertScrollbar(const aVisible: boolean; const aRange,
+ aPage, aPos: Integer);
+begin
+ inherited UpdateVertScrollbar(aVisible, aRange, aPage, aPos);
+end;
+}
+
+procedure TRxDBGrid.DefaultDrawCellA(aCol, aRow: integer; aRect: TRect;
+ aState: TGridDrawState);
+begin
+ PrepareCanvas(aCol, aRow, aState);
+ if rdgFilter in OptionsRx then
+ begin
+ DefaultDrawFilter(aCol, aRow, getFilterRect(aRect), aState);
+ DefaultDrawTitle(aCol, aRow, getTitleRect(aRect), aState);
+ end
+ else
+ DefaultDrawTitle(aCol, aRow, aRect, aState);
+end;
+
+procedure TRxDBGrid.DefaultDrawTitle(aCol, aRow: integer; aRect: TRect;
+ aState: TGridDrawState);
+
+procedure DoClearMLIInvalid(MLI1: TMLCaptionItem);
+begin
+ while Assigned(MLI1) do
+ begin
+ inc(MLI1.FInvalidDraw);
+ MLI1:=MLI1.Next;
+ end;
+end;
+
+var
+ ASortMarker: TSortMarker;
+ ASortPosition: integer;
+
+ Background: TColor;
+ i: integer;
+ Down: boolean;
+ aRect2: TRect;
+
+ FTitle: TRxColumnTitle;
+ GrdCol: TRxColumn;
+
+ MLI, MLINext, MLI1: TMLCaptionItem;
+
+begin
+ if (dgIndicator in Options) and (aCol = 0) then
+ begin
+ Canvas.FillRect(aRect);
+ if F_Clicked then
+ aState := aState + [gdPushed];
+
+ if (TitleStyle = tsNative) then
+ DrawThemedCell(aCol, aRow, aRect, aState)
+ else
+ DrawCellGrid(aCol, aRow, aRect, aState);
+
+ if DatalinkActive and (rdgAllowToolMenu in FOptionsRx) then
+ Canvas.Draw((ARect.Left + ARect.Right - F_MenuBMP.Width) div 2,
+ (ARect.Top + ARect.Bottom - F_MenuBMP.Height) div 2, F_MenuBMP);
+ exit;
+ end;
+
+ GrdCol := TRxColumn(ColumnFromGridColumn(aCol));
+
+ Down := FPressed and (dgHeaderPushedLook in Options) and
+ (FPressedCol = GrdCol);
+
+ if Assigned(GrdCol) then
+ begin
+ ASortMarker := GrdCol.FSortOrder;
+ if FSortColumns.Count>1 then
+ ASortPosition:=GrdCol.FSortPosition
+ else
+ ASortPosition:=-1;
+ end
+ else
+ ASortMarker := smNone;
+
+ if Assigned(FOnGetBtnParams) and Assigned(GetFieldFromGridColumn(aCol)) then
+ begin
+ Background := Canvas.Brush.Color;
+ FOnGetBtnParams(Self, GetFieldFromGridColumn(aCol), Canvas.Font,
+ Background, ASortMarker, Down);
+ Canvas.Brush.Color := Background;
+ end;
+
+ if (gdFixed in aState) and (aRow = 0) and (ACol >= FixedCols) then
+ begin
+
+ //GrdCol := ColumnFromGridColumn(aCol);
+ if Assigned(GrdCol) then
+ FTitle := TRxColumnTitle(GrdCol.Title)
+ else
+ FTitle := nil;
+
+ if Assigned(FTitle) then
+ begin
+ if FTitle.Orientation <> toHorizontal then
+ begin
+ OutCaptionCellText90(aCol, aRow, aRect, aState, FTitle.Caption,
+ FTitle.Orientation);
+ if Down then
+ aState := aState + [gdPushed];
+ end
+ else
+ if (FTitle.CaptionLinesCount > 0) then
+ begin
+ aRect2.Left := aRect.Left;
+ aRect2.Right := aRect.Right;
+ aRect2.Top := aRect.Top;
+ for i := 0 to FTitle.CaptionLinesCount - 1 do
+ begin
+ MLI := FTitle.CaptionLine(i);
+ aRect2.Right := aRect.Right;
+
+ if i = FTitle.CaptionLinesCount - 1 then
+ begin
+ aRect2.Bottom := aRect.Bottom;
+ aRect.Top := ARect2.Top;
+ if Down then
+ aState := aState + [gdPushed]
+ else
+ aState := aState - [gdPushed]
+ ;
+ end
+ else
+ begin
+ aRect2.Bottom := aRect2.Top + MLI.Hegth * DefaultRowHeight;
+ aState := aState - [gdPushed];
+ end;
+
+
+ if Assigned(MLI.Next) then
+ begin
+ if Assigned(MLI.Prior) then
+ begin
+ if aCol = LeftCol then
+ begin
+ OutCaptionMLCellText(aCol, aRow, aRect2, aState, MLI);
+ DoClearMLIInvalid(MLI);
+ end
+ else
+ Dec(MLI.FInvalidDraw);
+ end
+ else
+ begin
+ OutCaptionMLCellText(aCol, aRow, aRect2, aState, MLI);
+ DoClearMLIInvalid(MLI);
+ end;
+ end
+ else
+ begin
+ if not Assigned(MLI.Prior) then
+ begin
+ OutCaptionCellText(aCol, aRow, aRect2, aState, MLI.Caption);
+ DoClearMLIInvalid(MLI);
+ end
+ else
+ begin
+ if aCol = LeftCol then
+ begin
+ OutCaptionMLCellText(aCol, aRow, aRect2, aState, MLI);
+ DoClearMLIInvalid(MLI);
+ end
+ else
+ Dec(MLI.FInvalidDraw);
+ end;
+ end;
+ aRect2.Top := aRect2.Bottom;
+ end;
+ end
+ else
+ begin
+ if Down then
+ aState := aState + [gdPushed];
+ OutCaptionCellText(aCol, aRow, aRect, aState, FTitle.Caption);
+ end;
+ end
+ else
+ begin
+ OutCaptionCellText(aCol, aRow, aRect, aState, GetDefaultColumnTitle(aCol));
+ end;
+
+ OutCaptionSortMarker(aRect, ASortMarker, ASortPosition+1);
+ end
+ else
+ begin
+ if Down then
+ aState := aState + [gdPushed];
+ OutCaptionCellText(aCol, aRow, aRect, aState, '');
+ end;
+end;
+
+procedure TRxDBGrid.DefaultDrawFilter(aCol, aRow: integer; aRect: TRect;
+ aState: TGridDrawState);
+var
+ bg: TColor;
+ al: TAlignment;
+ ft: TFont;
+ MyCol: integer;
+ TxS: TTextStyle;
+
+begin
+{ if (dgIndicator in Options) and (aCol = 0) then
+ begin
+ Canvas.FillRect(aRect);
+ DrawCellGrid(aCol, aRow, aRect, aState);
+ exit;
+ end;
+
+ DrawCellGrid(aCol, aRow, aRect, aState);}
+ if (dgIndicator in Options) and (aCol = 0) then
+ begin
+ if (TitleStyle = tsNative) then
+ DrawThemedCell(aCol, aRow, aRect, aState)
+ else
+ begin
+ Canvas.FillRect(aRect);
+ DrawCellGrid(aCol, aRow, aRect, aState);
+ end;
+ exit;
+ end;
+
+ if (TitleStyle = tsNative) then
+ DrawThemedCell(aCol, aRow, aRect, aState)
+ else
+ begin
+ Canvas.FillRect(aRect);
+ DrawCellGrid(aCol, aRow, aRect, aState);
+ end;
+
+ Inc(aRect.Left, 1);
+ Dec(aRect.Right, 1);
+ Inc(aRect.Top, 1);
+ Dec(aRect.Bottom, 1);
+
+ if Columns.Count > (aCol - 1) then
+ begin
+ bg := Canvas.Brush.Color;
+ al := Canvas.TextStyle.Alignment;
+// ft := Canvas.Font;
+ ft:=TFont.Create;
+ ft.Assign(Canvas.Font);
+ TxS := Canvas.TextStyle;
+
+ MyCol := Columns.RealIndex(aCol - 1);
+ with TRxColumn(Columns[MyCol]).Filter do
+ begin
+// Canvas.Brush.Color := Color;
+// Canvas.FillRect(aRect);
+ if (TitleStyle <> tsNative) then
+ begin
+ Canvas.Brush.Color := Color;
+ Canvas.FillRect(aRect);
+ end;
+
+ if Value <> '' then
+ begin
+ Canvas.Font := Font;
+ if (aRect.Right - aRect.Left) >= Canvas.TextWidth(Value) then
+ TxS.Alignment := Alignment
+ else
+ TxS.Alignment := taLeftJustify;
+ Canvas.TextStyle := TxS;
+ DrawCellText(aCol, aRow, aRect, aState, Value);
+ end
+ else
+ begin
+ Canvas.Font := TRxColumn(Columns[MyCol]).Filter.EmptyFont;
+ if (aRect.Right - aRect.Left) >= Canvas.TextWidth(Value) then
+ TxS.Alignment := Alignment
+ else
+ TxS.Alignment := taLeftJustify;
+
+ Canvas.TextStyle := TxS;
+ DrawCellText(aCol, aRow, aRect, aState,
+ TRxColumn(Columns[MyCol]).Filter.EmptyValue);
+ end;
+ end;
+
+// Canvas.Font := ft;
+ Canvas.Font.Assign(ft);
+ ft.Free;
+ Canvas.Brush.Color := bg;
+ // Canvas.TextStyle.Alignment := al;
+ TxS.Alignment := al;
+ Canvas.TextStyle := TxS;
+ end
+ else
+ begin
+ bg := Canvas.Brush.Color;
+ Canvas.Brush.Color := Color;
+ Canvas.FillRect(aRect);
+ Canvas.Brush.Color := bg;
+ end;
+end;
+
+procedure TRxDBGrid.DefaultDrawCellData(aCol, aRow: integer; aRect: TRect;
+ aState: TGridDrawState);
+var
+ S: string;
+ F: TField;
+ C: TRxColumn;
+ j: integer;
+begin
+ if Assigned(OnDrawColumnCell) and not (CsDesigning in ComponentState) then
+ OnDrawColumnCell(Self, aRect, aCol, TColumn(ColumnFromGridColumn(aCol)), aState)
+ else
+ begin
+ F := GetFieldFromGridColumn(aCol);
+ C := ColumnFromGridColumn(aCol) as TRxColumn;
+ if Assigned(C) and Assigned(C.FOnDrawColumnCell) then
+ C.OnDrawColumnCell(Self, aRect, aCol, TColumn(ColumnFromGridColumn(aCol)), aState)
+ else
+ begin
+ case ColumnEditorStyle(aCol, F) of
+ cbsCheckBoxColumn: DrawCheckBoxBitmaps(aCol, aRect, F);
+ else
+ if F <> nil then
+ begin
+ if F.dataType <> ftBlob then
+ begin
+ { if Assigned(F.LookupDataSet) and (F.LookupResultField<>'') then
+ S := F.LookupDataSet.FieldByName(F.LookupResultField).DisplayText
+ else}
+ S := F.DisplayText;
+ if Assigned(C) and (C.KeyList.Count > 0) and (C.PickList.Count > 0) then
+ begin
+ J := C.KeyList.IndexOf(S);
+ if (J >= 0) and (J < C.PickList.Count) then
+ S := C.PickList[j];
+ end;
+ end
+ else
+ S := '(blob)';
+ end
+ else
+ S := '';
+ if (rdgWordWrap in FOptionsRx) and Assigned(C) and (C.WordWrap) then
+ WriteTextHeader(Canvas, aRect, S, C.Alignment)
+ else
+ DrawCellText(aCol, aRow, aRect, aState, S);
+ end;
+ end;
+ end;
+end;
+
+procedure TRxDBGrid.DrawCell(aCol, aRow: integer; aRect: TRect; aState: TGridDrawState);
+var
+ RxColumn: TRxColumn;
+ AImageIndex: integer;
+ FBackground: TColor;
+begin
+ if (gdFixed in aState) and (aRow = 0) then
+ begin
+ DefaultDrawCellA(aCol, aRow, aRect, aState);
+ end
+ else
+ if not ((gdFixed in aState) or ((aCol = 0) and (dgIndicator in Options)) or
+ ((aRow = 0) and (dgTitles in Options))) then
+ begin
+
+ PrepareCanvas(aCol, aRow, aState);
+
+ if Assigned(FOnGetCellProps) and not (gdSelected in aState) then
+ begin
+ FBackground := Canvas.Brush.Color;
+ FOnGetCellProps(Self, GetFieldFromGridColumn(aCol), Canvas.Font, FBackground);
+ Canvas.Brush.Color := FBackground;
+ end;
+
+ Canvas.FillRect(aRect);
+ DrawCellGrid(aCol, aRow, aRect, aState);
+
+ RxColumn := TRxColumn(ColumnFromGridColumn(aCol));
+ if Assigned(RxColumn) and Assigned(RxColumn.Field) and
+ Assigned(RxColumn.ImageList) then
+ begin
+ AImageIndex := StrToIntDef(RxColumn.KeyList.Values[RxColumn.Field.AsString],
+ RxColumn.FNotInKeyListIndex);
+ if (AImageIndex > -1) and (AImageIndex < RxColumn.ImageList.Count) then
+ DrawCellBitmap(RxColumn, aRect, aState, AImageIndex);
+ end
+ else
+ DefaultDrawCellData(aCol, aRow, aRect, aState);
+ // inherited DrawCell(aCol, aRow, aRect, aState);
+ end
+ else
+ inherited DrawCell(aCol, aRow, aRect, aState);
+end;
+
+procedure TRxDBGrid.LinkActive(Value: Boolean);
+var
+ S: string;
+ Pos: integer;
+begin
+ if Value then
+ begin
+ S := DataSource.DataSet.ClassName;
+ if RxDBGridSortEngineList.Find(S, Pos) then
+ FSortEngine := RxDBGridSortEngineList.Objects[Pos] as TRxDBGridSortEngine
+ else
+ FSortEngine := nil;
+ end;
+
+ inherited LinkActive(Value);
+ if not Value then
+{ begin
+ S := DataSource.DataSet.ClassName;
+ if RxDBGridSortEngineList.Find(S, Pos) then
+ FSortEngine := RxDBGridSortEngineList.Objects[Pos] as TRxDBGridSortEngine
+ else
+ FSortEngine := nil;
+ end
+ else}
+ begin
+ FSortEngine := nil;
+ if SelectedRows.Count > 0 then
+ SelectedRows.Clear;
+ end;
+
+ if not FSortingNow then
+ CollumnSortListClear;
+{ begin
+ FSortField := nil;
+ FSortOrder := smNone;
+ end;
+
+ F_SortListField.Clear;
+}
+ if {not (csDestroying in ComponentState) and} not (csDesigning in ComponentState) then
+ SetDBHandlers(Value);
+end;
+
+procedure TRxDBGrid.SetDBHandlers(Value: boolean);
+begin
+ if Value then
+ begin
+ if DataSource.DataSet.OnFilterRecord <> @FilterRec then
+ begin
+ F_EventOnFilterRec := DataSource.DataSet.OnFilterRecord;
+ DataSource.DataSet.OnFilterRecord := @FilterRec;
+ end;
+ if DataSource.DataSet.BeforeDelete <> @BeforeDel then
+ begin
+ F_EventOnBeforeDelete := DataSource.DataSet.BeforeDelete;
+ DataSource.DataSet.BeforeDelete := @BeforeDel;
+ end;
+ if DataSource.DataSet.BeforePost <> @BeforePo then
+ begin
+ F_EventOnBeforePost := DataSource.DataSet.BeforePost;
+ DataSource.DataSet.BeforePost := @BeforePo;
+ end;
+ if DataSource.DataSet.OnDeleteError <> @ErrorDel then
+ begin
+ F_EventOnDeleteError := DataSource.DataSet.OnDeleteError;
+ DataSource.DataSet.OnDeleteError := @ErrorDel;
+ end;
+ if DataSource.DataSet.OnPostError <> @ErrorPo then
+ begin
+ F_EventOnPostError := DataSource.DataSet.OnPostError;
+ DataSource.DataSet.OnPostError := @ErrorPo;
+ end;
+ CalcStatTotals;
+ if rdgFilter in OptionsRx then
+ OnFilter(nil);
+ end
+ else
+ begin
+ if Assigned(DataSource) and Assigned(DataSource.DataSet) then
+ begin
+ DataSource.DataSet.OnFilterRecord := F_EventOnFilterRec;
+ F_EventOnFilterRec := nil;
+ DataSource.DataSet.BeforeDelete := F_EventOnBeforeDelete;
+ F_EventOnBeforeDelete := nil;
+ DataSource.DataSet.BeforePost := F_EventOnBeforePost;
+ F_EventOnBeforePost := nil;
+ DataSource.DataSet.OnDeleteError := F_EventOnDeleteError;
+ F_EventOnDeleteError := nil;
+ DataSource.DataSet.OnPostError := F_EventOnPostError;
+ F_EventOnPostError := nil;
+ if rdgFilter in OptionsRx then
+ OnFilter(nil);
+ end;
+ F_LastFilter.Clear;
+ end;
+end;
+
+procedure TRxDBGrid.DrawFooterRows;
+var
+ FooterRect: TRect;
+ R: TRect;
+ TotalYOffs: integer;
+ TotalWidth: integer;
+ i: integer;
+ C: TRxColumn;
+ Background: TColor;
+ ClipArea: Trect;
+ TxS: TTextStyle;
+begin
+// TotalWidth := GetClientRect.Right;
+ TotalWidth := GCache.ClientWidth;
+{
+if ScrollBarIsVisible(SB_HORZ) then
+ TotalYOffs := GCache.ClientHeight - (GetSystemMetrics(SM_CYHSCROLL) + GetSystemMetrics(SM_SWSCROLLBARSPACING))
+ else
+ TotalYOffs := GCache.ClientHeight;
+ }
+ TotalYOffs := GCache.ClientHeight - (DefaultRowHeight * FFooterOptions.RowCount);
+
+ FooterRect := Rect(0, TotalYOffs, TotalWidth, TotalYOffs + DefaultRowHeight * FFooterOptions.RowCount);
+
+ Background := Canvas.Brush.Color;
+ Canvas.Brush.Color := Color;
+ Canvas.FillRect(FooterRect);
+
+// WriteLn(Format('FooterRect.Left=%d, FooterRect.Top=%d, FooterRect.Right=%d, FooterRect.Bottom=%d', [FooterRect.Left, FooterRect.Top, FooterRect.Right, FooterRect.Bottom]));
+
+
+ R.Top := TotalYOffs;
+ R.Bottom := TotalYOffs + DefaultRowHeight * FFooterOptions.RowCount;
+
+ Canvas.Brush.Color := FFooterOptions.FColor;
+ if (Columns.Count > 0) then
+ begin
+ TxS := Canvas.TextStyle;
+
+ if FDrawFullLine then
+ begin
+ ColRowToOffset(True, True, 0, R.Left, R.Right);
+ Canvas.Pen.Color := GridLineColor;
+ Canvas.MoveTo(R.Right - 1, R.Top);
+ Canvas.LineTo(R.Right - 1, RowHeights[0]);
+ end;
+
+ for i := GCache.VisibleGrid.Left to GCache.VisibleGrid.Right do
+ begin
+ ColRowToOffset(True, True, i, R.Left, R.Right);
+ Canvas.FillRect(R);
+ DrawCellGrid(i, 0, R, []);
+
+ if FDrawFullLine then
+ begin
+ Canvas.MoveTo(R.Right - 1, R.Top);
+ Canvas.LineTo(R.Right - 1, RowHeights[0]);
+ end;
+
+ C := ColumnFromGridColumn(i) as TRxColumn;
+ if Assigned(C) then
+ begin
+ TxS.Alignment := C.Footer.Alignment;
+ TxS.Layout := C.Footer.Layout;
+ Canvas.TextStyle := TxS;
+ if not C.Footer.IsDefaultFont then
+ Canvas.Font:=C.Footer.Font
+ else
+ Canvas.Font:=Font;
+ DrawCellText(i, 0, R, [], C.Footer.DisplayText);
+ end;
+ end;
+ if FDrawFullLine then
+ begin
+ Canvas.MoveTo(FooterRect.Left, FooterRect.Top);
+ Canvas.LineTo(R.Right, FooterRect.Top);
+ end;
+
+ ClipArea := Canvas.ClipRect;
+ for i := 0 to FixedCols - 1 do
+ begin
+ ColRowToOffset(True, True, i, R.Left, R.Right);
+ if FFooterOptions.FStyle = tsNative then
+ DrawThemedCell(i, 0, R, [gdFixed])
+ else
+ DrawCellGrid(i, 0, R, [gdFixed]);
+
+ if ((R.Left < ClipArea.Right) and (R.Right > ClipArea.Left)) then
+ DefaultDrawTitle(i, 0, getTitleRect(R), [gdFixed]);
+ end;
+ end;
+ Canvas.Brush.Color := Background;
+
+end;
+
+procedure TRxDBGrid.DoTitleClick(ACol: longint; ACollumn: TRxColumn;
+ Shift: TShiftState);
+begin
+ if FAutoSort {and (FSortEngine <> nil)} and (ACollumn.Field <> nil) then
+ begin
+ if ssCtrl in Shift then
+ begin
+ if ACollumn.FSortOrder <> smNone then
+ begin
+ if ACollumn.FSortOrder = smUp then
+ ACollumn.FSortOrder := smDown
+ else
+ begin
+ ACollumn.FSortOrder := smNone;
+ ACollumn.FSortPosition:=0;
+ end;
+ end
+ else
+ begin
+ ACollumn.FSortOrder := smUp;
+ ACollumn.FSortPosition:=FSortColumns.Count;
+ end;
+ end
+ else
+ begin
+ if (FSortColumns.Count>0) and (FSortColumns[0] = ACollumn) then
+ begin
+ if Assigned(FSortEngine) then
+ begin
+ if FSortColumns[0].FSortOrder = smUp then
+ FSortColumns[0].FSortOrder := smDown
+ else
+ FSortColumns[0].FSortOrder := smUp;
+ end
+ else
+ begin
+ case ACollumn.FSortOrder of
+ smNone: ACollumn.FSortOrder := smUp;
+ smUp: ACollumn.FSortOrder := smDown;
+ smDown: ACollumn.FSortOrder := smNone;
+ end;
+ end;
+ end
+ else
+ begin
+ CollumnSortListClear;
+ ACollumn.FSortOrder := smUp;
+ end;
+ end;
+
+ CollumnSortListUpdate;
+ if Assigned(FSortEngine) then
+ CollumnSortListApply;
+ if Assigned(FOnSortChanged) then
+ begin
+ FSortingNow := True;
+ FOnSortChanged(Self);
+ FSortingNow := False;
+ end;
+ end
+ else
+ HeaderClick(True, ACol);
+end;
+
+procedure TRxDBGrid.MouseMove(Shift: TShiftState; X, Y: integer);
+var
+ Cell: TGridCoord;
+ Rect: TRect;
+begin
+ if FTracking then
+ TrackButton(X, Y);
+ inherited MouseMove(Shift, X, Y);
+
+ if (rdgFilter in OptionsRx) and (dgColumnResize in Options) and
+ (Cursor = crHSplit) then
+ begin
+ Cell := MouseCoord(X, Y);
+ Rect := getFilterRect(CellRect(Cell.x, Cell.y));
+ if (Cell.Y = 0) and (Cell.X >= Ord(dgIndicator in Options)) and (Rect.Top < Y) then
+ begin
+ Cursor := crDefault;
+ end;
+ end;
+
+ if FColumnResizing and (MouseToGridZone(X, Y) = gzFixedCols) then
+ begin
+ CalcTitle;
+ if FFooterOptions.Active and (dgColumnResize in Options) and (FFooterOptions.RowCount > 0) then
+ DrawFooterRows;
+ end;
+end;
+
+procedure TRxDBGrid.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: integer);
+var
+ Cell: TGridCoord;
+ Rect: TRect;
+ C:TRxColumn;
+begin
+ QuickUTF8Search := '';
+
+ Cell := MouseCoord(X, Y);
+ if (DatalinkActive) and (DataSource.DataSet.State = dsBrowse) and
+ (Button = mbLeft) and (Cell.X = 0) and (Cell.Y = 0) and
+ (dgIndicator in Options) and (rdgAllowToolMenu in FOptionsRx) then
+ begin
+ F_Clicked := True;
+ InvalidateCell(0, 0);
+ end
+ else
+ if (Cell.Y = 0) and (Cell.X >= Ord(dgIndicator in Options)) then
+ begin
+ if (rdgFilter in OptionsRx) and DatalinkActive then
+ begin
+ Cell := MouseCoord(X, Y);
+ Rect := getFilterRect(CellRect(Cell.x, Cell.y));
+ if (Cell.Y = 0) and (Cell.X >= Ord(dgIndicator in Options)) and (Rect.Top < Y) then
+ begin
+ C:=TRxColumn (Columns[Columns.RealIndex(Cell.x - 1)]);
+ if (C.Filter.Enabled) and (C.Filter.ValueList.Count > 0) then
+ begin
+ FFilterListEditor.Style := csDropDownList;
+ if C.Filter.DropDownRows>0 then
+ FFilterListEditor.DropDownCount := C.Filter.DropDownRows;
+
+ FFilterListEditor.Parent := Self;
+ FFilterListEditor.Width := Rect.Right - Rect.Left;
+ FFilterListEditor.Height := Rect.Bottom - Rect.Top;
+ FFilterListEditor.BoundsRect := Rect;
+
+ FFilterListEditor.Items.Assign(C.Filter.ValueList);
+
+ FFilterListEditor.Text := C.Filter.Value;
+ FFilterListEditor.Show(Self, Cell.x - 1);
+ end;
+ exit;
+ end;
+ end;
+
+ if dgColumnResize in Options then
+ begin
+ FColumnResizing := True;
+ end;
+
+ if FAutoSort then
+ begin
+ Cell := MouseCoord(X, Y);
+ if (Cell.Y = 0) and (Cell.X >= Ord(dgIndicator in Options)) then
+ begin
+ if (dgColumnResize in Options) and (Button = mbRight) then
+ begin
+// Button := mbLeft;
+// FSwapButtons := True;
+// MouseCapture := True;
+ Shift := Shift + [ssLeft];
+ inherited MouseDown(Button, Shift, X, Y);
+ end
+ else
+ if Button = mbLeft then
+ begin
+ if (MouseToGridZone(X, Y) = gzFixedCols) and
+ (dgColumnResize in Options) and (Cursor = crHSplit) then
+ begin
+ if (ssDouble in Shift) and (rdgDblClickOptimizeColWidth in FOptionsRx) then
+ begin
+ if Assigned(ColumnFromGridColumn(Cell.X)) then
+ TRxColumn(ColumnFromGridColumn(Cell.X)).OptimizeWidth;
+ end
+ else
+ inherited MouseDown(Button, Shift, X, Y);
+ end
+ else
+ begin
+ MouseCapture := True;
+ FTracking := True;
+ FPressedCol := TRxColumn(ColumnFromGridColumn(Cell.X));
+ TrackButton(X, Y);
+ inherited MouseDown(Button, Shift, X, Y);
+ end;
+ end;
+ end
+ else
+ inherited MouseDown(Button, Shift, X, Y);
+ end
+ else
+ inherited MouseDown(Button, Shift, X, Y);
+ end
+ else
+ begin
+ if rdgMrOkOnDblClik in FOptionsRx then
+ begin
+ if (Cell.Y > 0) and (Cell.X >= Ord(dgIndicator in Options)) and
+ (ssDouble in Shift) then
+ begin
+ if Owner is TCustomForm then
+ TCustomForm(Owner).ModalResult := mrOk;
+ end;
+ end;
+ inherited MouseDown(Button, Shift, X, Y);
+ end;
+end;
+
+procedure TRxDBGrid.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: integer);
+var
+ Cell: TGridCoord;
+ ACol: longint;
+ DoClick: boolean;
+
+ ShowMenu: boolean;
+ MPT: TPoint;
+ Rct: TRect;
+begin
+ ShowMenu := False;
+
+ FColumnResizing := False;
+
+ if (dgHeaderPushedLook in Options) and FTracking and (FPressedCol <> nil) then
+ begin
+ Cell := MouseCoord(X, Y);
+ DoClick := PtInRect(Rect(0, 0, ClientWidth, ClientHeight), Point(X, Y)) and
+ (Cell.Y < RowHeights[0]) and (FPressedCol = TRxColumn(ColumnFromGridColumn(Cell.X)));
+ StopTracking;
+ if DoClick then
+ begin
+ ACol := Cell.X;
+ if (dgIndicator in Options) then
+ Dec(ACol);
+ if DataLinkActive and (ACol >= 0) and (ACol < Columns.Count) then
+ begin
+ FPressedCol := TRxColumn(ColumnFromGridColumn(Cell.X));
+ if Assigned(FPressedCol) then
+ DoTitleClick(FPressedCol.Index, FPressedCol, Shift);
+ end;
+ end;
+ end
+ else
+ if FSwapButtons then
+ begin
+ FSwapButtons := False;
+ MouseCapture := False;
+ if Button = mbRight then
+ Button := mbLeft;
+ end;
+
+ if (DatalinkActive) and (DataSource.DataSet.State = dsBrowse) and
+ (rdgAllowToolMenu in FOptionsRx) then
+ begin
+ Cell := MouseCoord(X, Y);
+ if ((Button = mbLeft) and (Cell.X = 0) and (Cell.Y = 0) and
+ (dgIndicator in Options)) or (F_Clicked) then
+ begin
+ F_Clicked := False;
+ InvalidateCell(0, 0);
+ ShowMenu := True;
+ Button := mbRight;
+ end;
+ end;
+
+ inherited MouseUp(Button, Shift, X, Y);
+
+ if (DatalinkActive) and (DataSource.DataSet.State = dsBrowse) and (ShowMenu) then
+ begin
+ Rct := CellRect(0, 0);
+ MPT.X := Rct.Left;
+ if rdgFilter in FOptionsRx then
+ MPT.Y := Rct.Bottom - DefaultRowHeight
+ else
+ MPT.Y := Rct.Bottom;
+ MPT := ClientToScreen(MPT);
+
+ UpdateJMenuStates;
+ F_PopupMenu.Popup(MPT.X, MPT.Y);
+ end;
+end;
+
+procedure TRxDBGrid.SetQuickUTF8Search(AValue: string);
+var
+ ClearSearchValue: boolean;
+ OldSearchString: string;
+begin
+ if (rdgAllowQuickSearch in OptionsRx) then
+ begin
+ OldSearchString := Self.FQuickUTF8Search;
+ if (OldSearchString <> AValue) and Assigned(Self.FBeforeQuickSearch) then
+ Self.FBeforeQuickSearch(Self, SelectedField, AValue);
+ if OldSearchString <> AValue then
+ begin
+ ClearSearchValue := True;
+ if (Length(AValue) > 0) and (Self.DatalinkActive) then
+ begin
+ if (DataSource.DataSet.State = dsBrowse) and
+ (not (DataSource.DataSet.EOF and DataSource.DataSet.BOF)) then
+ begin
+ //1.Вызываем процедурку поиска...
+ if DataSetLocateThrough(Self.DataSource.DataSet,
+ Self.SelectedField.FieldName, AValue, [loPartialKey, loCaseInsensitive]) then
+ Self.FQuickUTF8Search := AValue;
+ ClearSearchValue := False;
+ end;
+ end;
+ if ClearSearchValue then
+ begin
+ Self.FQuickUTF8Search := '';
+ end;
+ if (OldSearchString <> Self.FQuickUTF8Search) and
+ Assigned(Self.FAfterQuickSearch) then
+ Self.FAfterQuickSearch(Self, SelectedField, OldSearchString);
+ end;
+ end;
+ //TODO: сделать отображение ищущейся буквы/строки.
+end;
+
+procedure TRxDBGrid.UTF8KeyPress(var UTF8Key: TUTF8Char);
+var
+ CheckUp: boolean;
+begin
+ inherited UTF8KeyPress(UTF8Key);
+ if ReadOnly then
+ begin
+ //0. Проверяем что это кнопка значащая, увеличиваем "строку поиска"
+ if Length(UTF8Key) = 1 then
+ begin
+ //DebugLn('Ord Of Key:',IntToStr(Ord(UTF8Key[1])));
+ CheckUp := not (Ord(UTF8Key[1]) in CBadQuickSearchSymbols);
+ end
+ else
+ CheckUp := True;
+ // DebugLn('RxDBGrid.UTF8KeyPress check',IfThen(CheckUp,'True','False'),'INIT UTF8Key= ',UTF8Key,' Selected Field: ', Self.SelectedField.FieldName);
+ if CheckUp then
+ QuickUTF8Search := QuickUTF8Search + Trim(UTF8Key);
+ end;
+end;
+
+procedure TRxDBGrid.KeyDown(var Key: word; Shift: TShiftState);
+var
+ FTmpReadOnly: boolean;
+
+ procedure DoShowFindDlg;
+ begin
+ if not (rdgAllowDialogFind in OptionsRx) then
+ exit;
+ if Length(QuickUTF8Search) > 0 then
+ QuickUTF8Search := '';
+ ShowFindDialog;
+ end;
+
+ procedure DoShowColumnsDlg;
+ begin
+ if not (rdgAllowColumnsForm in OptionsRx) then
+ exit;
+ if Length(QuickUTF8Search) > 0 then
+ QuickUTF8Search := '';
+ ShowColumnsDialog;
+ end;
+
+ procedure DoShowQuickFilter;
+ begin
+ if not (rdgAllowQuickFilter in FOptionsRx) then
+ exit;
+ OnFilter(Self);
+ end;
+
+begin
+ //DebugLn('RxDBGrid.KeyDown ',Name,' INIT Key= ',IntToStr(Key));
+ if (Key in CCancelQuickSearchKeys) then
+ if Length(QuickUTF8Search) > 0 then
+ QuickUTF8Search := '';
+(* case Key of
+{ VK_DELETE: if not (aoDelete in FAllowedOperations) then
+ exit;
+ VK_INSERT: if not (aoInsert in FAllowedOperations) then
+ exit;
+ VK_RETURN: if (aoAppend in FAllowedOperations) and (EditorMode) and
+ (Col = ColCount - 1) and (Row = RowCount - 1) then
+ if DataSource.DataSet.State = dsInsert then
+ begin
+ DataSource.DataSet.Post;
+ Col := 0;
+ Key := VK_DOWN;
+ inherited KeyDown(Key, Shift);
+ exit;
+ end
+ else
+ begin
+ Col := 0;
+ Key := VK_DOWN;
+ inherited KeyDown(Key, Shift);
+ exit;
+ end;
+
+ VK_DOWN:
+ if not (aoAppend in FAllowedOperations) then
+ begin
+ FTmpReadOnly := ReadOnly;
+ ReadOnly := True;
+ try
+ inherited KeyDown(Key, Shift);
+ finally
+ ReadOnly := FTmpReadOnly;
+ end;
+ exit;
+ end }
+{ else
+ UpdateRowsHeight;
+ VK_UP:UpdateRowsHeight}
+ end; *)
+ inherited KeyDown(Key, Shift);
+ if Key <> 0 then
+ begin
+ case FKeyStrokes.FindRxCommand(Key, Shift) of
+ rxgcShowFindDlg: DoShowFindDlg;
+ rxgcShowColumnsDlg: DoShowColumnsDlg;
+ rxgcShowFilterDlg: OnFilterBy(Self);
+ rxgcShowQuickFilter: DoShowQuickFilter;
+ rxgcHideQuickFilter: OnFilterClose(Self);
+ rxgcShowSortDlg: OnSortBy(Self);
+ rxgcSelectAll: SelectAllRows;
+ rxgcDeSelectAll: DeSelectAllRows;
+ rxgcInvertSelection:InvertSelection;
+ rxgcOptimizeColumnsWidth:OptimizeColumnsWidthAll;
+ rxgcCopyCellValue:OnCopyCellValue(Self);
+ else
+ exit;
+ end;
+ Key := 0;
+ end;
+end;
+
+procedure TRxDBGrid.KeyPress(var Key: char);
+begin
+ inherited KeyPress(Key);
+ if Assigned(SelectedColumn) and Assigned(SelectedColumn.Field) and (SelectedColumn.Field.DataType in [ftFloat, ftCurrency]) and
+ (coFixDecimalSeparator in TRxColumn(SelectedColumn).Options) then
+ if (Key in [',', '.']) then
+ Key:=DefaultFormatSettings.DecimalSeparator
+end;
+
+function TRxDBGrid.CreateColumns: TGridColumns;
+begin
+ Result := TRxDbGridColumns.Create(Self, TRxColumn);
+end;
+
+procedure TRxDBGrid.DrawCellBitmap(RxColumn: TRxColumn; aRect: TRect;
+ aState: TGridDrawState; AImageIndex: integer);
+var
+ ClientSize: TSize;
+ H, W: integer;
+begin
+ InflateRect(aRect, -1, -1);
+
+ H := RxColumn.ImageList.Height;
+ W := RxColumn.ImageList.Width;
+
+ ClientSize.cx := Min(aRect.Right - aRect.Left, W);
+ ClientSize.cy := Min(aRect.Bottom - aRect.Top, H);
+
+ if ClientSize.cx = W then
+ begin
+ aRect.Left := (aRect.Left + aRect.Right - W) div 2;
+ aRect.Right := aRect.Left + W;
+ end;
+
+ if ClientSize.cy = H then
+ begin
+ aRect.Top := (aRect.Top + aRect.Bottom - H) div 2;
+ aRect.Bottom := aRect.Top + H;
+ end;
+
+ RxColumn.ImageList.StretchDraw(Canvas, AImageIndex, aRect);
+end;
+
+procedure TRxDBGrid.SetEditText(ACol, ARow: longint; const Value: string);
+var
+ C: TRxColumn;
+ j: integer;
+ S: string;
+begin
+ C := ColumnFromGridColumn(aCol) as TRxColumn;
+ S := Value;
+ if Assigned(C) and (C.KeyList.Count > 0) and (C.PickList.Count > 0) then
+ begin
+ J := C.PickList.IndexOf(S);
+ if (J >= 0) and (J < C.KeyList.Count) then
+ S := C.KeyList[j];
+ end;
+ inherited SetEditText(ACol, ARow, S);
+end;
+
+{
+try to fix set scrollbar style
+procedure TRxDBGrid.CheckNewCachedSizes(var AGCache: TGridDataCache);
+begin
+ if FFooterOptions.Active and (FooterOptions.RowCount > 0) then
+ begin
+ Dec(AGCache.ClientHeight, DefaultRowHeight * FooterOptions.RowCount);
+ Dec(AGCache.ScrollHeight, DefaultRowHeight * FooterOptions.RowCount);
+ end;
+end;
+}
+
+procedure TRxDBGrid.ColRowMoved(IsColumn: boolean; FromIndex, ToIndex: integer);
+begin
+ inherited ColRowMoved(IsColumn, FromIndex, ToIndex);
+ if IsColumn then
+ CalcTitle;
+end;
+
+procedure TRxDBGrid.Paint;
+var
+ P:TPoint;
+begin
+ Inc(FInProcessCalc);
+ if rdgWordWrap in FOptionsRx then
+ UpdateRowsHeight;
+
+ if FFooterOptions.Active and (FFooterOptions.RowCount > 0) then
+ begin
+ P:=GCache.MaxClientXY;
+ with GCache do
+ MaxClientXY.Y:=MaxClientXY.Y - (DefaultRowHeight * FFooterOptions.RowCount + 2);
+ end;
+
+ DoClearInvalidTitle;
+
+ inherited Paint;
+
+ DoDrawInvalidTitle;
+
+ if FFooterOptions.Active and (FFooterOptions.RowCount > 0) then
+ begin
+ with GCache do
+ MaxClientXY:=P;
+ DrawFooterRows;
+ end;
+ Dec(FInProcessCalc);
+end;
+
+procedure TRxDBGrid.UpdateActive;
+begin
+{ if FInProcessCalc > 0 then
+ exit;}
+ inherited UpdateActive;
+{ if FInProcessCalc < 0 then
+ begin
+ FInProcessCalc := 0;
+ UpdateFooterRowOnUpdateActive;
+ end
+{ else
+ if FFooterOptions.Active and (FFooterOptions.RowCount > 0) then
+ UpdateFooterRowOnUpdateActive;}
+}
+ // UpdateRowsHeight;
+end;
+
+procedure TRxDBGrid.UpdateData;
+begin
+ inherited UpdateData;
+end;
+
+procedure TRxDBGrid.MoveSelection;
+begin
+ inherited MoveSelection;
+ if Assigned(FFooterOptions) and FFooterOptions.Active and (FFooterOptions.RowCount > 0) then
+ DrawFooterRows;
+// UpdateRowsHeight;
+end;
+
+function TRxDBGrid.GetBufferCount: integer;
+var
+ H:integer;
+begin
+{ Result := ClientHeight div DefaultRowHeight;
+ if rdgWordWrap in FOptionsRx then
+ begin
+ H:=UpdateRowsHeight;
+// if H>0 then
+// Result := H;
+ end;
+ if dgTitles in Options then
+ begin
+ Dec(Result, RowHeights[0] div DefaultRowHeight);
+ end;
+ if FFooterOptions.Active then
+ Dec(Result, FFooterOptions.RowCount);}
+ H:=ClientHeight - GCache.FixedHeight;
+ if FFooterOptions.Active then
+ H:=H - DefaultRowHeight * FFooterOptions.RowCount;
+
+ Result := H div DefaultRowHeight;
+// result := (ClientHeight - GCache.FixedHeight - DefaultRowHeight) div DefaultRowHeight;
+end;
+
+procedure TRxDBGrid.CMHintShow(var Message: TLMessage);
+var
+ Cell: TGridCoord;
+ tCol: TRxColumn;
+begin
+ if Assigned(TCMHintShow(Message).HintInfo) then
+ begin
+ with TCMHintShow(Message).HintInfo^ do
+ begin
+ Cell := MouseCoord(CursorPos.X, CursorPos.Y);
+ if (Cell.Y = 0) and (Cell.X >= Ord(dgIndicator in Options)) then
+ begin
+ tCol := TRxColumn(ColumnFromGridColumn(Cell.X));
+ if Assigned(tCol) and (TRxColumnTitle(tCol.Title).Hint <> '') and
+ (TRxColumnTitle(tCol.Title).FShowHint) then
+ HintStr := TRxColumnTitle(tCol.Title).Hint;
+ end;
+ end;
+ end;
+ inherited CMHintShow(Message);
+end;
+
+procedure TRxDBGrid.FFilterListEditorOnChange(Sender: TObject);
+begin
+ FFilterListEditor.Hide;
+ with TRxColumn(Columns[Columns.RealIndex(FFilterListEditor.Col)]).Filter do
+ begin
+ if FFilterListEditor.Text = EmptyValue then
+ Value := ''
+ else
+ Value := FFilterListEditor.Text;
+ end;
+
+// DataSource.DataSet.Refresh;
+ DataSource.DataSet.DisableControls;
+ DataSource.DataSet.Filtered:=false;
+ DataSource.DataSet.Filtered:=true;
+// DataSource.DataSet.First;
+ CalcStatTotals;
+ DataSource.DataSet.EnableControls;
+
+ if Assigned(FOnFiltred) then
+ FOnFiltred(Self);
+end;
+
+procedure TRxDBGrid.FFilterListEditorOnCloseUp(Sender: TObject);
+begin
+ FFilterListEditor.Hide;
+ FFilterListEditor.Changed;
+ SetFocus;
+end;
+
+procedure TRxDBGrid.InternalOptimizeColumnsWidth(AColList: TList);
+var
+ P: TBookmark;
+ i, W, n: integer;
+ WA: PIntegerArray;
+ S: string;
+begin
+ GetMem(WA, SizeOf(integer) * AColList.Count);
+
+ for I := 0 to AColList.Count - 1 do
+ begin
+ if TRxColumnTitle(TRxColumn(AColList[i]).Title).CaptionLinesCount > 1 then
+ WA^[i] := Max(Canvas.TextWidth(
+ TRxColumnTitle(TRxColumn(AColList[i]).Title).CaptionLine(
+ TRxColumnTitle(TRxColumn(AColList[i]).Title).CaptionLinesCount -
+ 1).Caption) + 8, 20)
+ else
+ WA^[i] := Max(Canvas.TextWidth(TRxColumn(AColList[i]).Title.Caption) + 8, 20);
+ end;
+
+ with DataSource.DataSet do
+ begin
+ DisableControls;
+ P := GetBookmark;
+ First;
+ try
+ while not EOF do
+ begin
+ for I := 0 to AColList.Count - 1 do
+ begin
+ if Assigned(TRxColumn(AColList[i]).Field) then
+ S := TRxColumn(AColList[i]).Field.DisplayText
+ else
+ S:='';
+ with TRxColumn(AColList[i]) do
+ if (KeyList.Count > 0) and (PickList.Count > 0) then
+ begin
+ n := KeyList.IndexOf(S);
+ if (n <> -1) and (n < PickList.Count) then
+ S := PickList.Strings[n];
+ end;
+ W := Canvas.TextWidth(S) + 6;
+ if WA^[i] < W then
+ WA^[i] := W;
+ end;
+ Next;
+ end;
+ finally
+ GotoBookmark(p);
+ FreeBookmark(p);
+ EnableControls;
+ end;
+ end;
+
+ for I := 0 to AColList.Count - 1 do
+ if WA^[i] > 0 then
+ TRxColumn(AColList[i]).Width := WA^[i];
+
+ FreeMem(WA, SizeOf(integer) * AColList.Count);
+end;
+
+function TRxDBGrid.IsDefaultRowHeightStored: boolean;
+begin
+ Result := DefaultRowHeight = Canvas.TextHeight('Wg');
+end;
+
+procedure TRxDBGrid.VisualChange;
+begin
+ CalcTitle;
+ inherited VisualChange;
+end;
+
+procedure TRxDBGrid.EditorWidthChanged(aCol, aWidth: Integer);
+var
+ R:TRect;
+begin
+ inherited EditorWidthChanged(aCol, aWidth);
+ if FFilterListEditor.Visible then
+ begin
+ R:=CellRect(FFilterListEditor.Col+1,0);
+ FFilterListEditor.Width:=Columns[FFilterListEditor.Col].Width;
+ FFilterListEditor.Left:=R.Left;
+ end;
+end;
+
+function TRxDBGrid.EditorByStyle(Style: TColumnButtonStyle): TWinControl;
+var
+ F: TField;
+begin
+ if Style = cbsAuto then
+ begin
+ F := SelectedField;
+ if Assigned(F) then
+ begin
+ if Assigned(F.LookupDataSet) and (F.LookupKeyFields <> '') and
+ (F.LookupResultField <> '') and (F.KeyFields <> '') then
+ begin
+ Result := FRxDbGridLookupComboEditor;
+ exit;
+ end
+ else
+ if F.DataType in [ftDate, ftDateTime] then
+ begin
+ Result := FRxDbGridDateEditor;
+ exit;
+ end;
+ end;
+ end;
+ Result := inherited EditorByStyle(Style);
+
+ if (Style = cbsPickList) and (Result is TCustomComboBox) then
+ begin
+ if TRxColumn(SelectedColumn).DirectInput then
+ TCustomComboBox(Result).Style:=csDropDown
+ else
+ TCustomComboBox(Result).Style:=csDropDownList;
+ end;
+
+end;
+
+procedure TRxDBGrid.CalcStatTotals;
+var
+ {$IFDEF NoAutomatedBookmark}
+ P_26: TBookmark;
+ {$ENDIF}
+ P: TBookmark;
+ i, cnt, K: integer;
+ APresent: boolean;
+ BB:Double;
+
+ DHL:THackDataLink;
+ DHS:THackDataSet;
+
+ SaveState:TDataSetState;
+ SavePos:integer;
+ SaveActiveRecord:integer;
+
+ SaveAfterScroll:TDataSetNotifyEvent;
+ SaveBeforeScroll:TDataSetNotifyEvent;
+ RCol:TRxColumn;
+ AValue:Variant;
+
+ FCList:TFPList;
+begin
+ if (not (FFooterOptions.Active and DatalinkActive)) or (Columns.Count = 0) or (gsAddingAutoColumns in GridStatus) then
+ Exit;
+ //Дополнительно проверим - а стоит ли делать пробег по данным - есть ли агрегатные функции
+ if Assigned(OnRxCalcFooterValues)then
+ begin
+ Inc(FInProcessCalc);
+ for i := 0 to Columns.Count - 1 do
+ begin
+ RCol := TRxColumn(Columns[i]);
+ RCol.Footer.ResetTestValue;
+ AValue:=Null;
+ OnRxCalcFooterValues(Self, RCol, AValue);
+ if AValue<>null then RCol.Footer.FTestValue := AValue;
+ end;
+ Dec(FInProcessCalc);
+ Exit;
+ end;
+
+ APresent := False;
+ for i := 0 to Columns.Count - 1 do
+ begin
+ APresent := TRxColumn(Columns[i]).Footer.FValueType in
+ [fvtSum, fvtAvg, fvtMax, fvtMin, fvtCount];
+ if APresent then
+ break;
+ end;
+
+ if not APresent then
+ exit;
+
+
+ Inc(FInProcessCalc);
+
+ cnt:=0;
+ for i := 0 to Columns.Count - 1 do
+ TRxColumn(Columns[i]).Footer.ResetTestValue;
+
+ if (DataSource.DataSet.RecordCount<=0) then
+ begin
+ Dec(FInProcessCalc);
+ exit;
+ end;
+
+ DHL:=THackDataLink(Datalink);
+ DHS:=THackDataSet(DataSource.DataSet);
+
+ {$IFDEF NoAutomatedBookmark}
+ P:=DataSource.DataSet.GetBookmark;
+ {$ELSE}
+ P := DHS.Bookmark;
+ {$ENDIF}
+
+ SaveState:=DHS.SetTempState(dsBrowse);
+
+ SaveAfterScroll:=DHS.AfterScroll;
+ SaveBeforeScroll:=DHS.BeforeScroll;
+ DHS.AfterScroll:=nil;
+ DHS.BeforeScroll:=nil;
+
+ SaveActiveRecord:=DHL.ActiveRecord;
+ DHL.ActiveRecord:=0;
+ SavePos:=DHS.RecNo;
+
+ FCList:=TFPList.Create;
+ for i:=0 to Columns.Count-1 do
+ begin
+ RCol:=TRxColumn(Columns[i]);
+ if (RCol.Footer.ValueType in [fvtSum, fvtAvg, fvtMax, fvtMin]) and RCol.Visible then
+ begin
+ FCList.Add(RCol);
+ RCol.Footer.FField:=DHS.FieldByName(RCol.Footer.FieldName);
+ end;
+ end;
+
+ DHS.First;
+ while not DHS.EOF do
+ begin
+ for i:=0 to FCList.Count-1 do
+ begin
+ RCol:=TRxColumn(FCList[i]);
+ if RCol.FFooter.FValueType in [fvtSum, fvtAvg, fvtMax, fvtMin] then
+ RCol.FFooter.UpdateTestValueFromVar( RCol.FFooter.FField.AsVariant)
+// BB:=RCol.FFooter.FField.AsFloat;
+// RCol.FFooter.UpdateTestValueFromVar( RCol.FFooter.FField.AsFloat)
+ end;
+ inc(cnt);
+ DHS.Next;
+ end;
+
+ FCList.Free;
+
+ for i:=0 to Columns.Count-1 do
+ begin
+ RCol:=TRxColumn(Columns[i]);
+ if RCol.Footer.ValueType = fvtCount then
+ RCol.FFooter.FCountRec:=Cnt
+ else
+ if RCol.Footer.ValueType = fvtAvg then
+ RCol.FFooter.FTestValue:=RCol.FFooter.FTestValue / Cnt;
+ end;
+
+ DHS.RecNo := Min(DHL.RecordCount + SavePos - 1, DHS.RecNo);
+ K:=DHS.RecNo;
+
+ while not DHS.BOF do
+ begin
+ if SavePos = DHS.RecNo then
+ break;
+ DHS.Prior;
+ end;
+
+ for i:=0 to Columns.Count-1 do
+ TRxColumn(Columns[i]).Footer.FField:=nil;
+
+ DHL.ActiveRecord:=SaveActiveRecord;
+ DHS.RestoreState(SaveState);
+
+ DHS.AfterScroll := SaveAfterScroll;
+ DHS.BeforeScroll := SaveBeforeScroll;
+
+ {$IFDEF NoAutomatedBookmark}
+ P_26:=DHS.GetBookmark;
+ if DHS.CompareBookmarks(P_26, P)<>0 then
+ DHS.GotoBookmark(P); //workaround for fix navigation problem
+ DHS.FreeBookmark(P);
+ DHS.FreeBookmark(P_26);
+ {$ELSE}
+ if DHS.CompareBookmarks(DHS.Bookmark, P)<>0 then
+ DHS.Bookmark:=P; //workaround for fix navigation problem
+ {$ENDIF}
+
+
+ Dec(FInProcessCalc);
+ if FInProcessCalc < 0 then
+ FInProcessCalc := 0;
+end;
+
+procedure TRxDBGrid.OptimizeColumnsWidth(AColList: string);
+var
+ ColList: TList;
+
+ procedure DoFillColList;
+ var
+ L: integer;
+ begin
+ L := Pos(';', AColList);
+ while L > 0 do
+ begin
+ if AColList <> '' then
+ ColList.Add(ColumnByFieldName(Copy(AColList, 1, L - 1)));
+ Delete(AColList, 1, L);
+ L := Pos(';', AColList);
+ end;
+ if AColList <> '' then
+ ColList.Add(ColumnByFieldName(AColList));
+ end;
+
+begin
+ if (not DatalinkActive) or (Columns.Count = 0) then
+ Exit;
+ ColList := TList.Create;
+ DoFillColList;
+ InternalOptimizeColumnsWidth(ColList);
+ ColList.Free;
+
+ if Assigned(OnColumnSized) then
+ OnColumnSized(Self);
+end;
+
+procedure TRxDBGrid.OptimizeColumnsWidthAll;
+var
+ ColList: TList;
+ i: integer;
+begin
+ if (not DatalinkActive) or (Columns.Count = 0) then
+ Exit;
+ ColList := TList.Create;
+ for i := 0 to Columns.Count - 1 do
+ ColList.Add(Columns[i]);
+ InternalOptimizeColumnsWidth(ColList);
+ ColList.Free;
+end;
+
+procedure TRxDBGrid.UpdateTitleHight;
+begin
+ CalcTitle;
+end;
+
+procedure TRxDBGrid.FilterRec(DataSet: TDataSet; var Accept: boolean);
+var
+ i: integer;
+begin
+ Accept := True;
+ for i := 0 to Columns.Count - 1 do
+ begin
+ with TRxColumn(Columns[i]) do
+ begin
+ if (Filter.Value <> '') then
+ begin
+ if (Filter.Value <> Field.DisplayText) then
+ begin
+ Accept := False;
+ break;
+ end;
+ end;
+ end;
+ end;
+ if Assigned(F_EventOnFilterRec) then
+ F_EventOnFilterRec(DataSet, Accept);
+end;
+
+procedure TRxDBGrid.BeforeDel(DataSet: TDataSet);
+var
+ i: integer;
+begin
+ if FFooterOptions.Active and (DatalinkActive) then
+ for i := 0 to Columns.Count - 1 do
+ if not TRxColumn(Columns[i]).Footer.DeleteTestValue then
+ begin
+ FInProcessCalc := -1;
+ Break;
+ end;
+ if Assigned(F_EventOnBeforeDelete) then
+ F_EventOnBeforeDelete(DataSet);
+end;
+
+procedure TRxDBGrid.BeforePo(DataSet: TDataSet);
+var
+ i: integer;
+ C:TRxColumn;
+begin
+ if DatalinkActive then
+ begin
+ if FooterOptions.Active then
+ for i := 0 to Columns.Count - 1 do
+ begin
+ if not TRxColumn(Columns[i]).Footer.PostTestValue then
+ begin
+ FInProcessCalc := -1;
+ Break;
+ end;
+ end;
+
+ if rdgFilter in OptionsRx then
+ for i := 0 to Columns.Count - 1 do
+ begin
+ C:=TRxColumn(Columns[i]);
+ if Assigned(C.Field) and (C.Filter.ValueList.IndexOf(C.Field.DisplayText)< 0) then
+ C.Filter.ValueList.Add(C.Field.DisplayText);
+ end;
+ end;
+
+ if Assigned(F_EventOnBeforePost) then
+ F_EventOnBeforePost(DataSet);
+end;
+
+procedure TRxDBGrid.ErrorDel(DataSet: TDataSet; E: EDatabaseError;
+ var DataAction: TDataAction);
+var
+ i: integer;
+begin
+ if FFooterOptions.Active and (DatalinkActive) then
+ for i := 0 to Columns.Count - 1 do
+ if not TRxColumn(Columns[i]).Footer.ErrorTestValue then
+ begin
+ FInProcessCalc := -1;
+ Break;
+ end;
+ if Assigned(F_EventOnDeleteError) then
+ F_EventOnDeleteError(DataSet, E, DataAction);
+end;
+
+procedure TRxDBGrid.ErrorPo(DataSet: TDataSet; E: EDatabaseError;
+ var DataAction: TDataAction);
+var
+ i: integer;
+begin
+ if FFooterOptions.Active and (DatalinkActive) then
+ for i := 0 to Columns.Count - 1 do
+ if not TRxColumn(Columns[i]).Footer.ErrorTestValue then
+ begin
+ FInProcessCalc := -1;
+ Break;
+ end;
+ if Assigned(F_EventOnPostError) then
+ F_EventOnPostError(DataSet, E, DataAction);
+end;
+
+procedure TRxDBGrid.OnFind(Sender: TObject);
+begin
+ if rdgAllowDialogFind in OptionsRx then
+ ShowFindDialog;
+end;
+
+procedure TRxDBGrid.OnFilterBy(Sender: TObject);
+var
+ NewFilter: string;
+begin
+ if DataLinkActive then
+ begin
+ OptionsRx := OptionsRx - [rdgFilter];
+ rxFilterByForm := TrxFilterByForm.Create(Application);
+ NewFilter := DataSource.DataSet.Filter;
+ if rxFilterByForm.Execute(Self, NewFilter, F_LastFilter) then
+ begin
+ if NewFilter <> '' then
+ begin
+ DataSource.DataSet.Filter := NewFilter;
+ DataSource.DataSet.Filtered := True;
+ end
+ else
+ begin
+ DataSource.DataSet.Filtered := False;
+ end;
+ CalcStatTotals;
+ end;
+ FreeAndNil(rxFilterByForm);
+ end;
+end;
+
+procedure TRxDBGrid.OnFilter(Sender: TObject);
+var
+ C: TRxColumn;
+ i: integer;
+ FBS, FAS:TDataSetNotifyEvent;
+begin
+ BeginUpdate;
+ OptionsRx := OptionsRx + [rdgFilter];
+
+ for i := 0 to Columns.Count - 1 do
+ begin
+ C := TRxColumn(Columns[i]);
+ C.Filter.ValueList.Clear;
+ C.Filter.Value := '';
+ C.Filter.ItemIndex := -1;
+ C.Filter.ValueList.Add(C.Filter.EmptyValue);
+ end;
+
+ if DatalinkActive then
+ begin
+ DataSource.DataSet.DisableControls;
+ DataSource.DataSet.Filtered := True;
+ FBS:=DataSource.DataSet.BeforeScroll;
+ FAS:=DataSource.DataSet.AfterScroll;
+ DataSource.DataSet.BeforeScroll:=nil;
+ DataSource.DataSet.AfterScroll:=nil;
+ DataSource.DataSet.First;
+ while not DataSource.DataSet.EOF do
+ begin
+ for i := 0 to Columns.Count - 1 do
+ begin
+ C := TRxColumn(Columns[i]);
+ if C.Filter.Enabled and (C.Field <> nil) and (C.Filter.ValueList.IndexOf(C.Field.DisplayText) < 0) then
+ C.Filter.ValueList.Add(C.Field.DisplayText);
+ end;
+ DataSource.DataSet.Next;
+ end;
+ DataSource.DataSet.First;
+ DataSource.DataSet.BeforeScroll:=FBS;
+ DataSource.DataSet.AfterScroll:=FAS;
+ DataSource.DataSet.EnableControls;
+ end;
+
+ EndUpdate;
+end;
+
+procedure TRxDBGrid.OnFilterClose(Sender: TObject);
+var
+ C: TRxColumn;
+ i: integer;
+begin
+ OptionsRx := OptionsRx - [rdgFilter];
+ DataSource.DataSet.Filtered := False;
+ CalcStatTotals;
+end;
+
+procedure TRxDBGrid.OnSortBy(Sender: TObject);
+var
+ i: integer;
+ S1: string;
+ FSortListField:TStringList;
+ FColumn:TRxColumn;
+begin
+ if DatalinkActive then
+ begin
+ FSortListField:=TStringList.Create;
+ try
+ rxSortByForm := TrxSortByForm.Create(Application);
+ rxSortByForm.CheckBox1.Checked := rdgCaseInsensitiveSort in FOptionsRx;
+ if rxSortByForm.Execute(Self, FSortListField) then
+ begin
+ for i := 0 to FSortListField.Count - 1 do
+ begin
+ S1:=FSortListField.Strings[i];
+ FColumn:=TRxColumn(ColumnByFieldName(Copy(S1, 2, Length(S1))));
+ if S1[1] = '1' then
+ FColumn.FSortOrder := smUp
+ else
+ FColumn.FSortOrder := smDown;
+
+ FColumn.FSortPosition:=i;
+ end;
+
+ CollumnSortListUpdate;
+
+ if rxSortByForm.CheckBox1.Checked then
+ Include(FOptionsRx, rdgCaseInsensitiveSort)
+ else
+ Exclude(FOptionsRx, rdgCaseInsensitiveSort);
+
+ CollumnSortListApply;
+ if Assigned(FOnSortChanged) then
+ begin
+ FSortingNow := True;
+ FOnSortChanged(Self);
+ FSortingNow := False;
+ end;
+ end;
+
+ finally
+ FreeAndNil(rxSortByForm);
+ FreeAndNil(FSortListField);
+ end;
+ Invalidate;
+ end;
+end;
+
+procedure TRxDBGrid.OnChooseVisibleFields(Sender: TObject);
+begin
+ if rdgAllowColumnsForm in OptionsRx then
+ ShowColumnsDialog;
+end;
+
+procedure TRxDBGrid.OnSelectAllRows(Sender: TObject);
+begin
+ SelectAllRows;
+end;
+
+procedure TRxDBGrid.OnCopyCellValue(Sender: TObject);
+var
+ P:TBookMark;
+ S:string;
+ i, k:integer;
+begin
+ if DatalinkActive then
+ begin
+ if (dgMultiselect in Options) and (SelectedRows.Count>1) then
+ begin
+ S:='';
+ DataSource.DataSet.DisableControls;
+ {$IFDEF NoAutomatedBookmark}
+ P:=DataSource.DataSet.GetBookmark;
+ {$ELSE}
+ P:=DataSource.DataSet.Bookmark;
+ {$ENDIF}
+ try
+ DataSource.DataSet.First;
+ while not DataSource.DataSet.EOF do
+ begin
+ if S<>'' then
+ S:=S+LineEnding;
+ K:=0;
+ for i:=0 to Columns.Count-1 do
+ begin
+ if Assigned(Columns[i].Field) then
+ begin
+ if K<>0 then
+ S:=S+#9;
+ S:=S+Columns[i].Field.DisplayText;
+ inc(K);
+ end;
+ end;
+ DataSource.DataSet.Next;
+ end;
+ finally
+ {$IFDEF NoAutomatedBookmark}
+ DataSource.DataSet.GotoBookmark(P);
+ DataSource.DataSet.FreeBookmark(P);
+ {$ELSE}
+ DataSource.DataSet.Bookmark:=P;
+ {$ENDIF}
+ DataSource.DataSet.EnableControls;
+ end;
+ Invalidate;
+ if S<>'' then
+ begin
+ try
+ Clipboard.Open;
+ Clipboard.AsText:=S;
+ finally
+ Clipboard.Close;
+ end;
+ end;
+ end
+ else
+ if Assigned(SelectedField) then
+ try
+ Clipboard.Open;
+ Clipboard.AsText:=SelectedField.DisplayText;
+ finally
+ Clipboard.Close;
+ end;
+ end;
+end;
+
+procedure TRxDBGrid.Loaded;
+begin
+ inherited Loaded;
+ UpdateJMenuKeys;
+end;
+
+procedure TRxDBGrid.UpdateFooterRowOnUpdateActive;
+begin
+ if Assigned(DataSource) then
+ begin
+ if DataSource.State <> FOldDataSetState then
+ begin
+ if (FOldDataSetState in dsEditModes) and (DataSource.State = dsBrowse) then
+ CalcStatTotals;
+ FOldDataSetState:=DataSource.State;
+ end;
+ end
+ else
+ FOldDataSetState:=dsInactive;
+end;
+
+procedure TRxDBGrid.DoEditorHide;
+var
+ R:TRxColumn;
+ i, w:integer;
+begin
+ inherited DoEditorHide;
+ R:=SelectedColumn as TRxColumn;
+
+ if Assigned(Editor) and Assigned(R) then
+ for i:=0 to R.EditButtons.Count-1 do
+ begin
+// R.EditButtons[i].Visible:=false;
+ if R.EditButtons[i].Style = ebsUpDownRx then
+ R.EditButtons[i].FSpinBtn.Visible:=false
+ else
+ R.EditButtons[i].FButton.Visible:=false;
+ end;
+end;
+
+procedure TRxDBGrid.DoEditorShow;
+begin
+ inherited DoEditorShow;
+ DoSetColEdtBtn;
+end;
+
+procedure TRxDBGrid.GetOnCreateLookup;
+begin
+ if Assigned(F_CreateLookup) then
+ F_CreateLookup(FRxDbGridLookupComboEditor);
+end;
+
+procedure TRxDBGrid.GetOnDisplayLookup;
+begin
+ if Assigned(F_DisplayLookup) then
+ F_DisplayLookup(FRxDbGridLookupComboEditor);
+end;
+
+procedure TRxDBGrid.SelectAllRows;
+var
+ P:TBookMark;
+begin
+ if DatalinkActive then
+ begin
+ DataSource.DataSet.DisableControls;
+{$IFDEF NoAutomatedBookmark}
+ P:=DataSource.DataSet.GetBookmark;
+{$ELSE}
+ P:=DataSource.DataSet.Bookmark;
+{$ENDIF}
+ try
+ DataSource.DataSet.First;
+ while not DataSource.DataSet.EOF do
+ begin
+ SelectedRows.CurrentRowSelected:=true;
+ DataSource.DataSet.Next;
+ end;
+ finally
+{$IFDEF NoAutomatedBookmark}
+ DataSource.DataSet.GotoBookmark(P);
+ DataSource.DataSet.FreeBookmark(P);
+{$ELSE}
+ DataSource.DataSet.Bookmark:=P;
+{$ENDIF}
+ DataSource.DataSet.EnableControls;
+ end;
+ Invalidate;
+ end;
+end;
+
+procedure TRxDBGrid.DeSelectAllRows;
+var
+ P:TBookMark;
+begin
+ if DatalinkActive then
+ begin
+ DataSource.DataSet.DisableControls;
+{$IFDEF NoAutomatedBookmark}
+ P:=DataSource.DataSet.GetBookmark;
+{$ELSE}
+ P:=DataSource.DataSet.Bookmark;
+{$ENDIF}
+ try
+ DataSource.DataSet.First;
+ while not DataSource.DataSet.EOF do
+ begin
+ SelectedRows.CurrentRowSelected:=false;
+ DataSource.DataSet.Next;
+ end;
+ finally
+{$IFDEF NoAutomatedBookmark}
+ DataSource.DataSet.GotoBookmark(P);
+ DataSource.DataSet.FreeBookmark(P);
+{$ELSE}
+ DataSource.DataSet.Bookmark:=P;
+{$ENDIF}
+ DataSource.DataSet.EnableControls;
+ end;
+ Invalidate;
+ end;
+end;
+
+procedure TRxDBGrid.InvertSelection;
+var
+ P:TBookMark;
+begin
+ if DatalinkActive then
+ begin
+ DataSource.DataSet.DisableControls;
+ {$IFDEF NoAutomatedBookmark}
+ P:=DataSource.DataSet.GetBookmark;
+ {$ELSE}
+ P:=DataSource.DataSet.Bookmark;
+ {$ENDIF}
+ try
+ DataSource.DataSet.First;
+ while not DataSource.DataSet.EOF do
+ begin
+ SelectedRows.CurrentRowSelected:=not SelectedRows.CurrentRowSelected;
+ DataSource.DataSet.Next;
+ end;
+ finally
+ {$IFDEF NoAutomatedBookmark}
+ DataSource.DataSet.GotoBookmark(P);
+ DataSource.DataSet.FreeBookmark(P);
+ {$ELSE}
+ DataSource.DataSet.Bookmark:=P;
+ {$ENDIF}
+ DataSource.DataSet.EnableControls;
+ end;
+ Invalidate;
+ end;
+end;
+
+procedure TRxDBGrid.CopyCellValue;
+begin
+ OnCopyCellValue(Self);
+end;
+
+procedure TRxDBGrid.SetSort(AFields: array of String;
+ ASortMarkers: array of TSortMarker; PreformSort: Boolean);
+var
+ I: Integer;
+ C: TRxColumn;
+begin
+ CollumnSortListClear;
+ if (Length(AFields) > 0) and (Length(AFields) = Length(ASortMarkers)) then
+ begin
+ for I := 0 to Length(AFields) - 1 do
+ begin
+ C := ColumnByFieldName(AFields[I]);
+ if C <> nil then
+ begin
+ C.SortOrder := ASortMarkers[I];
+ C.FSortPosition := I;
+ end;
+ end;
+ CollumnSortListUpdate;
+ end;
+ if PreformSort then
+ begin
+ if Assigned(FSortEngine) then
+ CollumnSortListApply;
+ if Assigned(FOnSortChanged) then
+ begin
+ FSortingNow := True;
+ FOnSortChanged(Self);
+ FSortingNow := False;
+ end;
+ end;
+end;
+
+//!!!
+constructor TRxDBGrid.Create(AOwner: TComponent);
+begin
+ FFooterOptions:=TRxDBGridFooterOptions.Create(Self);
+ inherited Create(AOwner);
+{$IFDEF RXDBGRID_OPTIONS_WO_CANCEL_ON_EXIT}
+ Options := Options - [dgCancelOnExit];
+{$ENDIF}
+
+ FSortColumns:=TRxDbGridColumnsSortList.Create;
+
+ FMarkerUp := LoadLazResBitmapImage('rx_markerup');
+ FMarkerDown := LoadLazResBitmapImage('rx_markerdown');
+
+ Options := Options - [dgTabs];
+ OptionsRx := OptionsRx + [rdgAllowColumnsForm, rdgAllowDialogFind,
+ rdgAllowQuickFilter];
+
+ FAutoSort := True;
+ // FTitleButtons:=True;
+
+ F_Clicked := False;
+ F_MenuBMP := LoadLazResBitmapImage('menu_grid');
+
+ DoCreateJMenu;
+
+ FKeyStrokes := TRxDBGridKeyStrokes.Create(Self);
+ FKeyStrokes.ResetDefaults;
+
+ F_LastFilter := TStringList.Create;
+ //F_SortListField := TStringList.Create;
+
+ FPropertyStorageLink := TPropertyStorageLink.Create;
+ FPropertyStorageLink.OnSave := @OnIniSave;
+ FPropertyStorageLink.OnLoad := @OnIniLoad;
+
+// FAllowedOperations := [aoInsert, aoUpdate, aoDelete, aoAppend];
+
+ FFilterListEditor := TFilterListCellEditor.Create(nil);
+ with FFilterListEditor do
+ begin
+ Name := 'FilterListEditor';
+ Visible := False;
+ Items.Append('');
+ ReadOnly := True;
+ AutoComplete := True;
+ OnChange := @FFilterListEditorOnChange;
+ OnCloseUp := @FFilterListEditorOnCloseUp;
+ end;
+ FColumnResizing := False;
+
+ FRxDbGridLookupComboEditor := TRxDBGridLookupComboEditor.Create(nil);
+ FRxDbGridLookupComboEditor.Name := 'RxDBGridLookupComboEditor';
+ FRxDbGridLookupComboEditor.Visible := False;
+
+ FRxDbGridDateEditor := TRxDBGridDateEditor.Create(nil);
+ FRxDbGridDateEditor.Name := 'RxDbGridDateEditor';
+ FRxDbGridDateEditor.Visible := False;
+
+ UpdateJMenuKeys;
+
+end;
+
+destructor TRxDBGrid.Destroy;
+begin
+ CleanDSEvent;
+
+ FreeAndNil(FFooterOptions);
+
+ FreeAndNil(FRxDbGridLookupComboEditor);
+ FreeAndNil(FRxDbGridDateEditor);
+ FreeAndNil(FMarkerDown);
+ FreeAndNil(FMarkerUp);
+ FreeAndNil(FPropertyStorageLink);
+ FreeAndNil(FFilterListEditor);
+
+ FreeAndNil(F_PopupMenu);
+ FreeAndNil(F_MenuBMP);
+ FreeAndNil(F_LastFilter);
+
+ FreeAndNil(FKeyStrokes);
+ inherited Destroy;
+ FreeAndNil(FSortColumns);
+end;
+
+procedure TRxDBGrid.LayoutChanged;
+begin
+ if csDestroying in ComponentState then
+ exit;
+
+ inherited LayoutChanged;
+ if DatalinkActive and (FInProcessCalc = 0) and (Datalink.DataSet.State = dsBrowse) then
+ CalcStatTotals;
+end;
+
+procedure TRxDBGrid.SetFocus;
+begin
+ inherited SetFocus;
+ if FFilterListEditor.Visible then
+ FFilterListEditor.Hide;
+end;
+
+procedure TRxDBGrid.ShowFindDialog;
+begin
+ ShowRxDBGridFindForm(Self);
+end;
+
+procedure TRxDBGrid.ShowColumnsDialog;
+begin
+ ShowRxDBGridColumsForm(Self);
+end;
+
+procedure TRxDBGrid.ShowSortDialog;
+begin
+ OnSortBy(nil);
+end;
+
+procedure TRxDBGrid.ShowFilterDialog;
+begin
+ OnFilterBy(nil);
+end;
+
+function TRxDBGrid.ColumnByFieldName(AFieldName: string): TRxColumn;
+var
+ i: integer;
+begin
+ Result := nil;
+ AFieldName := UpperCase(AFieldName);
+ for i := 0 to Columns.Count - 1 do
+ begin
+ if UpperCase(Columns[i].FieldName) = AFieldName then
+ begin
+ Result := Columns[i] as TRxColumn;
+ exit;
+ end;
+ end;
+end;
+
+function TRxDBGrid.ColumnByCaption(ACaption: string): TRxColumn;
+var
+ i: integer;
+begin
+ Result := nil;
+ ACaption := UpperCase(ACaption);
+ for i := 0 to Columns.Count - 1 do
+ if ACaption = UpperCase(Columns[i].Title.Caption) then
+ begin
+ Result := TRxColumn(Columns[i]);
+ exit;
+ end;
+end;
+
+procedure TRxDBGrid.EraseBackground(DC: HDC);
+begin
+ // The correct implementation is doing nothing
+end;
+
+procedure TRxDbGridColumns.Notify(Item: TCollectionItem;
+ Action: TCollectionNotification);
+begin
+ inherited Notify(Item, Action);
+ TRxDBGrid(Grid).CollumnSortListUpdate;
+end;
+
+{ TRxDbGridColumns }
+function TRxDbGridColumns.Add: TRxColumn;
+begin
+ Result := TRxColumn(inherited Add);
+end;
+
+{ TRxColumn }
+
+function TRxColumn.GetKeyList: TStrings;
+begin
+ if FKeyList = nil then
+ FKeyList := TStringList.Create;
+ Result := FKeyList;
+end;
+
+function TRxColumn.GetSortFields: string;
+begin
+ if FSortFields = '' then
+ Result:=FieldName
+ else
+ Result:=FSortFields;
+end;
+
+procedure TRxColumn.SetConstraints(AValue: TRxDBGridCollumnConstraints);
+begin
+ FConstraints.Assign(AValue);
+end;
+
+procedure TRxColumn.SetEditButtons(AValue: TRxColumnEditButtons);
+begin
+ FEditButtons.Assign(AValue);
+end;
+
+procedure TRxColumn.SetFilter(const AValue: TRxColumnFilter);
+begin
+ FFilter.Assign(AValue);
+end;
+
+function TRxColumn.GetFooter: TRxColumnFooter;
+begin
+ Result := FFooter;
+end;
+
+function TRxColumn.GetConstraints: TRxDBGridCollumnConstraints;
+begin
+ Result:=FConstraints;
+end;
+
+procedure TRxColumn.SetFooter(const AValue: TRxColumnFooter);
+begin
+ FFooter.Assign(AValue);
+end;
+
+procedure TRxColumn.SetImageList(const AValue: TImageList);
+begin
+ if FImageList = AValue then
+ exit;
+ FImageList := AValue;
+ if Grid <> nil then
+ Grid.Invalidate;
+end;
+
+procedure TRxColumn.SetKeyList(const AValue: TStrings);
+begin
+ if AValue = nil then
+ begin
+ if FKeyList <> nil then
+ FKeyList.Clear;
+ end
+ else
+ KeyList.Assign(AValue);
+end;
+
+procedure TRxColumn.SetNotInKeyListIndex(const AValue: integer);
+begin
+ if FNotInKeyListIndex = AValue then
+ exit;
+ FNotInKeyListIndex := AValue;
+ if Grid <> nil then
+ Grid.Invalidate;
+end;
+
+procedure TRxColumn.SetWordWrap(AValue: boolean);
+begin
+ if FWordWrap=AValue then Exit;
+ FWordWrap:=AValue;
+end;
+
+function TRxColumn.CreateTitle: TGridColumnTitle;
+begin
+ Result := TRxColumnTitle.Create(Self);
+end;
+
+procedure TRxColumn.ColumnChanged;
+begin
+ inherited ColumnChanged;
+ if Assigned(FConstraints) and (FConstraints.MinWidth <> 0) and (FConstraints.MinWidth > Width) then
+ Width:=FConstraints.MinWidth;
+
+ if Assigned(FConstraints) and (FConstraints.MaxWidth <> 0) and (FConstraints.MaxWidth < Width) then
+ Width:=FConstraints.MaxWidth;
+end;
+
+constructor TRxColumn.Create(ACollection: TCollection);
+begin
+ inherited Create(ACollection);
+ FNotInKeyListIndex := -1;
+ FConstraints:=TRxDBGridCollumnConstraints.Create(Self);
+ FFooter := TRxColumnFooter.Create(Self);
+ FFilter := TRxColumnFilter.Create(Self);
+ FDirectInput := true;
+ FEditButtons:=TRxColumnEditButtons.Create(Self);
+ FOptions:=[coCustomizeVisible, coCustomizeWidth];
+end;
+
+destructor TRxColumn.Destroy;
+begin
+ FreeAndNil(FEditButtons);
+ if FKeyList <> nil then
+ begin
+ FKeyList.Free;
+ FKeyList := nil;
+ end;
+ FreeAndNil(FFooter);
+ FreeAndNil(FFilter);
+ FreeAndNil(FConstraints);
+ inherited Destroy;
+end;
+
+procedure TRxColumn.OptimizeWidth;
+begin
+ if Grid <> nil then
+ TRxDBGrid(Grid).OptimizeColumnsWidth(FieldName);
+end;
+
+{ TRxColumnTitle }
+procedure TRxColumnTitle.SetOrientation(const AValue: TTextOrientation);
+begin
+ if FOrientation = AValue then
+ exit;
+ FOrientation := AValue;
+ TRxDBGrid(TRxColumn(Column).Grid).CalcTitle;
+ TRxColumn(Column).ColumnChanged;
+end;
+
+function TRxColumnTitle.GetCaptionLinesCount: integer;
+begin
+ if Assigned(FCaptionLines) then
+ Result := FCaptionLines.Count
+ else
+ Result := 0;
+end;
+
+function TRxColumnTitle.CaptionLine(ALine: integer): TMLCaptionItem;
+begin
+ if Assigned(FCaptionLines) and (FCaptionLines.Count > 0) and
+ (ALine >= 0) and (FCaptionLines.Count > ALine) then
+ Result := TMLCaptionItem(FCaptionLines[ALine])
+ else
+ Result := nil;
+end;
+
+procedure TRxColumnTitle.ClearCaptionML;
+var
+ i: integer;
+ R: TMLCaptionItem;
+begin
+ for i := 0 to FCaptionLines.Count - 1 do
+ begin
+ R := TMLCaptionItem(FCaptionLines[i]);
+ R.Free;
+ end;
+ FCaptionLines.Clear;
+end;
+
+procedure TRxColumnTitle.SetCaption(const AValue: TCaption);
+var
+ c: integer;
+ s: string;
+
+ procedure AddMLStr(AStr: string);
+ var
+ R: TMLCaptionItem;
+ begin
+ R := TMLCaptionItem.Create;
+ R.Caption := AStr;
+ R.Col := Column;
+ FCaptionLines.Add(R);
+ end;
+
+begin
+ inherited SetCaption(AValue);
+ ClearCaptionML;
+ c := Pos('|', AValue);
+ if C > 0 then
+ begin
+ S := AValue;
+ while C > 0 do
+ begin
+ AddMLStr(Copy(S, 1, C - 1));
+ System.Delete(S, 1, C);
+ c := Pos('|', S);
+ end;
+ if S <> '' then
+ AddMLStr(S);
+ end;
+ if not (csLoading in Column.Grid.ComponentState) and Column.Grid.HandleAllocated then
+ TRxDBGrid(Column.Grid).CalcTitle;
+end;
+
+constructor TRxColumnTitle.Create(TheColumn: TGridColumn);
+begin
+ inherited Create(TheColumn);
+{$IFDEF NEW_STYLE_TITLE_ALIGNMENT_RXDBGRID}
+ Alignment := taCenter;
+{$ENDIF}
+ FCaptionLines := TFPList.Create;
+end;
+
+destructor TRxColumnTitle.Destroy;
+begin
+ ClearCaptionML;
+ FreeAndNil(FCaptionLines);
+ inherited Destroy;
+end;
+
+{ TRxColumnFooter }
+
+procedure TRxColumnFooter.SetValue(const AValue: string);
+begin
+ if FValue = AValue then
+ exit;
+ FValue := AValue;
+ FOwner.ColumnChanged;
+end;
+
+procedure TRxColumnFooter.SetDisplayFormat(const AValue: string);
+begin
+ if FDisplayFormat = AValue then
+ exit;
+ FDisplayFormat := AValue;
+ FOwner.ColumnChanged;
+end;
+
+procedure TRxColumnFooter.SetAlignment(const AValue: TAlignment);
+begin
+ if FAlignment = AValue then
+ exit;
+ FAlignment := AValue;
+ FOwner.ColumnChanged;
+end;
+
+procedure TRxColumnFooter.FontChanged(Sender: TObject);
+begin
+ FisDefaultFont := False;
+ FOwner.ColumnChanged;
+end;
+
+function TRxColumnFooter.GetFont: TFont;
+begin
+ result := FFont;
+end;
+
+function TRxColumnFooter.IsFontStored: Boolean;
+begin
+ result := not FisDefaultFont;
+end;
+
+procedure TRxColumnFooter.SetFieldName(const AValue: string);
+begin
+ if FFieldName = AValue then
+ exit;
+ FFieldName := AValue;
+ FOwner.ColumnChanged;
+end;
+
+procedure TRxColumnFooter.SetFont(AValue: TFont);
+begin
+ if not FFont.IsEqual(AValue) then
+ FFont.Assign(AValue);
+end;
+
+procedure TRxColumnFooter.SetLayout(const AValue: TTextLayout);
+begin
+ if FLayout = AValue then
+ exit;
+ FLayout := AValue;
+ FOwner.ColumnChanged;
+end;
+
+procedure TRxColumnFooter.SetValueType(const AValue: TFooterValueType);
+begin
+ if FValueType = AValue then
+ exit;
+ FValueType := AValue;
+ if FValueType in [fvtSum, fvtAvg, fvtMax, fvtMin] then
+ TRxDBGrid(FOwner.Grid).CalcStatTotals;
+ FOwner.ColumnChanged;
+end;
+
+function TRxColumnFooter.DisplayText: string;
+begin
+ case FValueType of
+ fvtSum,
+ fvtAvg,
+ fvtMax,
+ fvtMin: Result := GetStatTotal;
+ fvtCount: Result := GetRecordsCount;
+ fvtFieldValue: Result := GetFieldValue;
+ fvtStaticText: Result := FValue;
+ fvtRecNo: Result := GetRecNo;
+ else
+ Result := '';
+ end;
+end;
+
+procedure TRxColumnFooter.FillDefaultFont;
+var
+ AGrid: TCustomGrid;
+begin
+ AGrid := FOwner.Grid;
+ if (AGrid<>nil) then
+ begin
+ FFont.Assign(AGrid.Font);
+ FIsDefaultFont := True;
+ end;
+end;
+
+function TRxColumnFooter.GetFieldValue: string;
+begin
+ if (FFieldName <> '') and TRxDBGrid(FOwner.Grid).DatalinkActive then
+ Result := TRxDBGrid(FOwner.Grid).DataSource.DataSet.FieldByName(FFieldName).AsString
+ else
+ Result := '';
+end;
+
+function TRxColumnFooter.GetRecordsCount: string;
+begin
+ if TRxDBGrid(FOwner.Grid).DatalinkActive then
+ begin
+ if DisplayFormat <> '' then
+ Result := Format(DisplayFormat,
+ [{TRxDBGrid(FOwner.Grid).DataSource.DataSet.RecordCount} FCountRec])
+ else
+ Result := IntToStr(FCountRec); //TRxDBGrid(FOwner.Grid).DataSource.DataSet.RecordCount);
+ end
+ else
+ Result := '';
+end;
+
+function TRxColumnFooter.GetRecNo: string;
+begin
+ if TRxDBGrid(FOwner.Grid).DatalinkActive then
+ begin
+ if DisplayFormat <> '' then
+ Result := Format(DisplayFormat, [TRxDBGrid(FOwner.Grid).DataSource.DataSet.RecNo])
+ else
+ Result := IntToStr(TRxDBGrid(FOwner.Grid).DataSource.DataSet.RecNo);
+ end
+ else
+ Result := '';
+end;
+
+function TRxColumnFooter.GetStatTotal: string;
+var
+ F: TField;
+begin
+ if (FFieldName <> '') and TRxDBGrid(FOwner.Grid).DatalinkActive and
+ (TRxDBGrid(FOwner.Grid).DataSource.DataSet.RecordCount <> 0) then
+ begin
+ F := TRxDBGrid(FOwner.Grid).DataSource.DataSet.FieldByName(FFieldName);
+ if Assigned(F) then
+ begin
+ if F.DataType in [ftSmallint, ftInteger, ftWord, ftFloat, ftCurrency,
+ ftDate, ftTime, ftDateTime, ftTimeStamp, ftLargeint, ftBCD] then
+ begin
+ if F.DataType in [ftDate, ftTime, ftDateTime, ftTimeStamp] then
+ begin
+ if FValueType in [fvtSum, fvtAvg] then
+ Result := ''
+ else
+ if FTestValue = 0 then
+ Result := ''
+ else
+ if FDisplayFormat = '' then
+ Result := DateToStr(FTestValue)
+ else
+ Result := FormatDateTime(FDisplayFormat, FTestValue);
+ end
+ else
+ if F.DataType in [ftSmallint, ftInteger, ftWord, ftLargeint] then
+ begin
+ if FDisplayFormat = '' then
+ Result := IntToStr(Round(FTestValue))
+ else
+ Result := Format(FDisplayFormat, [Round(FTestValue)]);
+ end
+ else
+ begin
+ if FDisplayFormat <> '' then
+ Result := FormatFloat(FDisplayFormat, FTestValue)
+ else
+ if F.DataType = ftCurrency then
+ Result := FloatToStrF(FTestValue, ffCurrency, 12, 2)
+ else
+ Result := FloatToStr(FTestValue);
+ end;
+ end
+ else
+ Result := '';
+ end
+ else
+ Result := '';
+ end
+ else
+ Result := '';
+end;
+
+procedure TRxColumnFooter.ResetTestValue;
+var
+ F: TField;
+begin
+ FTestValue := 0;
+ FCountRec:=0;
+
+ if (ValueType in [fvtMin, fvtMax]) and (TRxDBGrid(
+ FOwner.Grid).DataSource.DataSet.RecordCount <> 0) then
+ begin
+ F := TRxDBGrid(FOwner.Grid).DataSource.DataSet.FieldByName(FFieldName);
+ if (Assigned(F)) and not (F.IsNull) then
+ if F.DataType in [ftDate, ftTime, ftDateTime, ftTimeStamp] then
+ FTestValue := F.AsDateTime
+ else
+ FTestValue := F.AsFloat;
+ end;
+end;
+
+procedure TRxColumnFooter.UpdateTestValue;
+var
+ F: TField;
+begin
+ if ValueType in [fvtSum, fvtAvg, fvtMax, fvtMin] then
+ begin
+ F := TRxDBGrid(FOwner.Grid).DataSource.DataSet.FindField(FFieldName);
+ if Assigned(F) then
+ begin
+ if F.DataType in [ftDate, ftTime, ftDateTime, ftTimeStamp] then
+ begin
+ case FValueType of
+ fvtMax: FTestValue := Max(FTestValue, F.AsDateTime);
+ fvtMin: FTestValue := Min(FTestValue, F.AsDateTime);
+ end;
+ end
+ else
+ begin
+ case FValueType of
+ fvtSum: FTestValue := FTestValue + F.AsFloat;
+ // fvtAvg:
+ fvtMax: FTestValue := Max(FTestValue, F.AsFloat);
+ fvtMin: FTestValue := Min(FTestValue, F.AsFloat);
+ end;
+ end;
+ end;
+ end;
+end;
+
+function TRxColumnFooter.DeleteTestValue: boolean;
+var
+ F: TField;
+begin
+ Result := True;
+ if ValueType in [fvtSum, fvtAvg, fvtMax, fvtMin] then
+ begin
+ F := TRxDBGrid(FOwner.Grid).DataSource.DataSet.FieldByName(FFieldName);
+ if (Assigned(F)) and not (F.IsNull) then
+ if F.DataType in [ftDate, ftTime, ftDateTime, ftTimeStamp] then
+ Result := not ((FValueType in [fvtMax, fvtMin]) and (FTestValue = F.AsDateTime))
+ else
+ if FValueType in [fvtMax, fvtMin] then
+ Result := (FTestValue <> F.AsFloat)
+ else
+ FTestValue := FTestValue - F.AsFloat;
+ end;
+end;
+
+function TRxColumnFooter.PostTestValue: boolean;
+var
+ F: TField;
+begin
+ Result := True;
+ if ValueType in [fvtSum, fvtAvg, fvtMax, fvtMin] then
+ begin
+ F := TRxDBGrid(FOwner.Grid).DataSource.DataSet.FieldByName(FFieldName);
+ if Assigned(F) then
+ if F.DataType in [ftDate, ftTime, ftDateTime, ftTimeStamp] then
+ begin
+ if FValueType in [fvtMax, fvtMin] then
+ if F.DataSet.State = dsinsert then
+ begin
+ if not (F.IsNull) then
+ case FValueType of
+ fvtMax: FTestValue := Max(FTestValue, F.AsDateTime);
+ fvtMin: FTestValue := Min(FTestValue, F.AsDateTime);
+ end;
+ end
+ else
+ if (F.OldValue <> null) and (FTestValue = TDateTime(F.OldValue)) then
+ Result := False
+ else
+ if not F.IsNull then
+ case FValueType of
+ fvtMax: FTestValue := Max(FTestValue, F.AsDateTime);
+ fvtMin: FTestValue := Min(FTestValue, F.AsDateTime);
+ end;
+ end
+ else
+ if F.DataSet.State = dsinsert then
+ begin
+ if not F.IsNull then
+ case FValueType of
+ fvtSum: FTestValue := FTestValue + F.AsFloat;
+ fvtMax: FTestValue := Max(FTestValue, F.AsFloat);
+ fvtMin: FTestValue := Min(FTestValue, F.AsFloat);
+ end;
+ end
+ else
+ if (FValueType in [fvtMax, fvtMin]) and (F.OldValue <> null) and
+ (FTestValue = Float(F.OldValue)) then
+ Result := False
+ else
+ case FValueType of
+ fvtSum:
+ begin
+ if not F.IsNull then
+ begin
+ if F.OldValue <> null then
+ FTestValue := FTestValue - Float(F.OldValue);
+ FTestValue := FTestValue + F.AsFloat;
+ end;
+ end;
+ fvtMax: if not F.IsNull then
+ FTestValue := Max(FTestValue, F.AsFloat);
+ fvtMin: if not F.IsNull then
+ FTestValue := Min(FTestValue, F.AsFloat);
+ end;
+ end;
+end;
+
+function TRxColumnFooter.ErrorTestValue: boolean;
+var
+ F: TField;
+begin
+ Result := True;
+ if ValueType in [fvtSum, fvtAvg, fvtMax, fvtMin] then
+ begin
+ F := TRxDBGrid(FOwner.Grid).DataSource.DataSet.FieldByName(FFieldName);
+ if Assigned(F) then
+ begin
+ if F.DataType in [ftDate, ftTime, ftDateTime, ftTimeStamp] then
+ begin
+ if (FValueType in [fvtMax, fvtMin]) and not (F.IsNull) then
+ begin
+ if not (F.IsNull) and (FTestValue = F.AsDateTime) then
+ Result := False
+ else
+ if (F.DataSet.RecordCount <> 0) and (F.OldValue <> null) then
+ begin
+ case FValueType of
+ fvtMax: FTestValue := Max(FTestValue, TDateTime(F.OldValue));
+ fvtMin: FTestValue := Min(FTestValue, TDateTime(F.OldValue));
+ end;
+ end;
+ end;
+ end
+ else
+ if (FValueType in [fvtMax, fvtMin]) and not (F.IsNull) and (FTestValue = F.AsFloat) then
+ Result := False
+ else
+ begin
+ case FValueType of
+ fvtSum:
+ if F.DataSet.RecordCount = 0 then
+ begin
+{ if not F.IsNull then
+ FTestValue := FTestValue - F.AsFloat;}
+ { TODO -oalexs : need rewrite this code - where difficult! }
+ end
+ else
+ begin
+ if F.OldValue <> null then
+ FTestValue := FTestValue + Float(F.OldValue);
+ if not F.IsNull then
+ FTestValue := FTestValue - F.AsFloat;
+ end;
+ fvtMax:
+ if (F.DataSet.RecordCount <> 0) and (F.OldValue <> null) then
+ FTestValue := Max(FTestValue, Float(F.OldValue));
+ fvtMin:
+ if (F.DataSet.RecordCount <> 0) and (F.OldValue <> null) then
+ FTestValue := Min(FTestValue, Float(F.OldValue));
+ end;
+ end;
+ end;
+ end;
+end;
+
+procedure TRxColumnFooter.UpdateTestValueFromVar(AValue: Variant);
+begin
+ if FValueType in [fvtSum, fvtAvg, fvtMax, fvtMin] then
+ begin
+ if (not VarIsEmpty(AValue)) and (AValue <> null) and Assigned(FField) then
+ begin
+ if FField.DataType in [ftDate, ftTime, ftDateTime, ftTimeStamp] then
+ begin
+ case FValueType of
+ fvtMax: FTestValue := Max(FTestValue, AValue);
+ fvtMin: FTestValue := Min(FTestValue, AValue);
+ end;
+ end
+ else
+ begin
+ case FValueType of
+ fvtSum,
+ fvtAvg: FTestValue := FTestValue + AValue;
+ fvtMax: FTestValue := Max(FTestValue, AValue);
+ fvtMin: FTestValue := Min(FTestValue, AValue);
+ end;
+ end;
+ end;
+ end;
+end;
+
+///!
+constructor TRxColumnFooter.Create(Owner: TRxColumn);
+begin
+ inherited Create;
+ FOwner := Owner;
+ FTestValue := 0;
+ FLayout := tlCenter;
+
+ FFont := TFont.Create;
+ FillDefaultFont;
+ FFont.OnChange := @FontChanged;
+end;
+
+destructor TRxColumnFooter.Destroy;
+begin
+ FreeThenNil(FFont);
+ inherited Destroy;
+end;
+
+{ TFilterListCellEditor }
+
+procedure TFilterListCellEditor.WndProc(var TheMessage: TLMessage);
+begin
+
+ if TheMessage.msg = LM_KILLFOCUS then
+ begin
+ Change;
+ Hide;
+ if HWND(TheMessage.WParam) = HWND(Handle) then
+ begin
+ // lost the focus but it returns to ourselves
+ // eat the message.
+ TheMessage.Result := 0;
+ exit;
+ end;
+ end;
+ inherited WndProc(TheMessage);
+end;
+
+procedure TFilterListCellEditor.KeyDown(var Key: word; Shift: TShiftState);
+begin
+ inherited KeyDown(Key, Shift);
+ case Key of
+ VK_RETURN:
+ begin
+ DroppedDown := False;
+ Change;
+ Hide;
+ end;
+ end;
+end;
+
+procedure TFilterListCellEditor.Show(Grid: TCustomGrid; Col: integer);
+begin
+ FGrid := Grid;
+ FCol := Col;
+ Visible := True;
+ // Text:=TRxColumn(TRxDBGrid(Grid).SelectedColumn).Filter.Value;
+ SetFocus;
+ // DroppedDown := true;
+end;
+
+
+{ TRxColumnFilter }
+
+function TRxColumnFilter.GetItemIndex: integer;
+begin
+ Result := FValueList.IndexOf(FValue);
+end;
+
+procedure TRxColumnFilter.SetColor(const AValue: TColor);
+begin
+ if FColor = AValue then
+ exit;
+ FColor := AValue;
+ FOwner.ColumnChanged;
+end;
+
+procedure TRxColumnFilter.SetFont(const AValue: TFont);
+begin
+ FFont.Assign(AValue);
+ FOwner.ColumnChanged;
+end;
+
+procedure TRxColumnFilter.SetItemIndex(const AValue: integer);
+begin
+ if (AValue >= -1) and (AValue < FValueList.Count) then
+ begin
+ if AValue = -1 then
+ FValue := ''
+ else
+ FValue := FValueList[AValue];
+ FOwner.ColumnChanged;
+ end;
+end;
+
+constructor TRxColumnFilter.Create(Owner: TRxColumn);
+begin
+ inherited Create;
+ FOwner := Owner;
+ FFont := TFont.Create;
+ FEmptyFont := TFont.Create;
+ FValueList := TStringList.Create;
+ FValueList.Sorted := True;
+ FColor := clWhite;
+
+ FEmptyFont.Style := [fsItalic];
+ FEmptyValue := sRxDBGridEmptiFilter;
+ FEnabled:=true;
+end;
+
+destructor TRxColumnFilter.Destroy;
+begin
+ FreeAndNil(FFont);
+ FreeAndNil(FEmptyFont);
+ FreeAndNil(FValueList);
+ inherited Destroy;
+end;
+
+{ TExDBGridSortEngine }
+
+function TRxDBGridSortEngine.EnabledFooterRowsCalc: boolean;
+begin
+ Result:=false;
+end;
+
+procedure TRxDBGridSortEngine.SortList(ListField: string; ADataSet: TDataSet;
+ Asc: array of boolean; SortOptions: TRxSortEngineOptions);
+begin
+
+end;
+
+{ TRxDBGridKeyStroke }
+
+procedure TRxDBGridKeyStroke.SetCommand(const AValue: TRxDBGridCommand);
+begin
+ if FCommand = AValue then
+ exit;
+ FCommand := AValue;
+ Changed(False);
+end;
+
+procedure TRxDBGridKeyStroke.SetShortCut(const AValue: TShortCut);
+begin
+ if FShortCut = AValue then
+ exit;
+ FShortCut := AValue;
+ Menus.ShortCutToKey(FShortCut, FKey, FShift);
+ Changed(False);
+end;
+
+function TRxDBGridKeyStroke.GetDisplayName: string;
+begin
+ IntToIdent(Ord(FCommand), Result, EditorCommandStrs);
+ Result := Result + ' - ' + ShortCutToText(FShortCut);
+end;
+
+procedure TRxDBGridKeyStroke.Assign(Source: TPersistent);
+begin
+ if Source is TRxDBGridKeyStroke then
+ begin
+ Command := TRxDBGridKeyStroke(Source).Command;
+ ShortCut := TRxDBGridKeyStroke(Source).ShortCut;
+ Enabled := TRxDBGridKeyStroke(Source).Enabled;
+ end
+ else
+ inherited Assign(Source);
+end;
+
+{ TRxDBGridKeyStrokes }
+
+function TRxDBGridKeyStrokes.GetItem(Index: integer): TRxDBGridKeyStroke;
+begin
+ Result := TRxDBGridKeyStroke(inherited GetItem(Index));
+end;
+
+procedure TRxDBGridKeyStrokes.SetItem(Index: integer; const AValue: TRxDBGridKeyStroke);
+begin
+ inherited SetItem(Index, AValue);
+end;
+
+procedure TRxDBGridKeyStrokes.Update(Item: TCollectionItem);
+begin
+ inherited Update(Item);
+ if (UpdateCount = 0) and Assigned(Owner) and Assigned(TRxDBGrid(Owner).FKeyStrokes) then
+ TRxDBGrid(Owner).UpdateJMenuKeys;
+end;
+
+
+constructor TRxDBGridKeyStrokes.Create(AOwner: TPersistent);
+begin
+ inherited Create(AOwner, TRxDBGridKeyStroke);
+end;
+
+procedure TRxDBGridKeyStrokes.Assign(Source: TPersistent);
+var
+ i: integer;
+begin
+ if Source is TRxDBGridKeyStrokes then
+ begin
+ Clear;
+ for i := 0 to TRxDBGridKeyStrokes(Source).Count-1 do
+ begin
+ with Add do
+ Assign(TRxDBGridKeyStrokes(Source)[i]);
+ end;
+ end else
+ inherited Assign(Source);
+end;
+
+function TRxDBGridKeyStrokes.Add: TRxDBGridKeyStroke;
+begin
+ Result := TRxDBGridKeyStroke(inherited Add);
+ Result.Enabled := True;
+end;
+
+function TRxDBGridKeyStrokes.AddE(ACommand: TRxDBGridCommand;
+ AShortCut: TShortCut): TRxDBGridKeyStroke;
+begin
+ Result := nil;
+ Result := Add;
+ Result.FShortCut := AShortCut;
+ Result.FCommand := ACommand;
+end;
+
+procedure TRxDBGridKeyStrokes.ResetDefaults;
+begin
+ Clear;
+ AddE(rxgcShowFindDlg, Menus.ShortCut(Ord('F'), [ssCtrl]));
+ AddE(rxgcShowColumnsDlg, Menus.ShortCut(Ord('W'), [ssCtrl]));
+ AddE(rxgcShowFilterDlg, Menus.ShortCut(Ord('T'), [ssCtrl]));
+ AddE(rxgcShowSortDlg, Menus.ShortCut(Ord('S'), [ssCtrl]));
+ AddE(rxgcShowQuickFilter, Menus.ShortCut(Ord('Q'), [ssCtrl]));
+ AddE(rxgcHideQuickFilter, Menus.ShortCut(Ord('H'), [ssCtrl]));
+ AddE(rxgcSelectAll, Menus.ShortCut(Ord('A'), [ssCtrl]));
+ AddE(rxgcDeSelectAll, Menus.ShortCut(Ord('-'), [ssCtrl]));
+ AddE(rxgcInvertSelection, Menus.ShortCut(Ord('*'), [ssCtrl]));
+ AddE(rxgcOptimizeColumnsWidth, Menus.ShortCut(Ord('+'), [ssCtrl]));
+ AddE(rxgcCopyCellValue, Menus.ShortCut(Ord('C'), [ssCtrl]));
+end;
+
+function TRxDBGridKeyStrokes.FindRxCommand(AKey: word;
+ AShift: TShiftState): TRxDBGridCommand;
+var
+ i: integer;
+ K: TRxDBGridKeyStroke;
+begin
+ Result := rxgcNone;
+ for i := 0 to Count - 1 do
+ begin
+ K := Items[i];
+ if (K.FKey = AKey) and (K.FShift = AShift) and (K.FEnabled) then
+ begin
+ Result := K.FCommand;
+ exit;
+ end;
+ end;
+end;
+
+function TRxDBGridKeyStrokes.FindRxKeyStrokes(ACommand: TRxDBGridCommand):
+TRxDBGridKeyStroke;
+var
+ i: integer;
+begin
+ Result := nil;
+ for i := 0 to Count - 1 do
+ begin
+ if (Items[i].Command = ACommand) then
+ begin
+ Result := Items[i];
+ exit;
+ end;
+ end;
+end;
+
+initialization
+ {$IFNDEF RxDBGridDepricatedProps}
+ RegisterPropertyToSkip( TRxDBGrid, 'AllowedOperations', 'This property duplicated standart DBGrid.Options', '');
+ {$ENDIF}
+
+ {$I rxdbgrid.lrs}
+ // {$I rx_markerdown.lrs}
+
+ RxDBGridSortEngineList := TStringList.Create;
+ RxDBGridSortEngineList.Sorted := True;
+
+finalization
+
+ while (RxDBGridSortEngineList.Count > 0) do
+ begin
+ RxDBGridSortEngineList.Objects[0].Free;
+ RxDBGridSortEngineList.Delete(0);
+ end;
+ RxDBGridSortEngineList.Free;
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/rxdbgrid_columsunit.lfm b/components/rx/version/v2.2_laz_1.2/rxdbgrid_columsunit.lfm
new file mode 100644
index 000000000..f6e226ff2
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxdbgrid_columsunit.lfm
@@ -0,0 +1,214 @@
+object rxDBGridColumsForm: TrxDBGridColumsForm
+ Left = 489
+ Height = 505
+ Top = 248
+ Width = 481
+ Caption = 'Grid colums'
+ ClientHeight = 505
+ ClientWidth = 481
+ OnCreate = FormCreate
+ Position = poScreenCenter
+ ShowHint = True
+ LCLVersion = '1.3'
+ object ButtonPanel1: TButtonPanel
+ Left = 6
+ Height = 41
+ Top = 458
+ Width = 469
+ OKButton.Name = 'OKButton'
+ OKButton.DefaultCaption = True
+ HelpButton.Name = 'HelpButton'
+ HelpButton.DefaultCaption = True
+ CloseButton.Name = 'CloseButton'
+ CloseButton.DefaultCaption = True
+ CancelButton.Name = 'CancelButton'
+ CancelButton.DefaultCaption = True
+ TabOrder = 0
+ ShowButtons = [pbOK, pbCancel, pbHelp]
+ object sbDown: TSpeedButton
+ AnchorSideLeft.Control = sbUp
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = sbUp
+ AnchorSideBottom.Control = sbUp
+ AnchorSideBottom.Side = asrBottom
+ Left = 516
+ Height = 33
+ Top = 0
+ Width = 23
+ Anchors = [akTop, akLeft, akBottom]
+ BorderSpacing.Left = 6
+ Glyph.Data = {
+ 36040000424D3604000000000000360000002800000010000000100000000100
+ 2000000000000004000064000000640000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000FF0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000FF808000FF0000
+ 00FF000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000FF808000FF808000FF8080
+ 00FF000000FF0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000FF808000FF808000FF808000FF8080
+ 00FF808000FF000000FF00000000000000000000000000000000000000000000
+ 00000000000000000000000000FF808000FF808000FF808000FF808000FF8080
+ 00FF808000FF808000FF000000FF000000000000000000000000000000000000
+ 000000000000000000FF000000FF000000FF000000FF808000FF808000FF8080
+ 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
+ 000000000000000000000000000000000000000000FF808000FF808000FF8080
+ 00FF000000FF0000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000FF808000FF808000FF8080
+ 00FF000000FF0000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000FF808000FF808000FF8080
+ 00FF000000FF0000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000FF000000FF000000FF0000
+ 00FF000000FF0000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000
+ }
+ OnClick = sbDownClick
+ end
+ object sbUp: TSpeedButton
+ AnchorSideLeft.Control = ButtonPanel1
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = ButtonPanel1
+ AnchorSideBottom.Side = asrBottom
+ Left = 487
+ Height = 33
+ Top = 0
+ Width = 23
+ Anchors = [akTop, akLeft, akBottom]
+ BorderSpacing.Left = 18
+ Glyph.Data = {
+ 36040000424D3604000000000000360000002800000010000000100000000100
+ 2000000000000004000064000000640000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000FF000000FF000000FF0000
+ 00FF000000FF0000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000FF808000FF808000FF8080
+ 00FF000000FF0000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000FF808000FF808000FF8080
+ 00FF000000FF0000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000FF808000FF808000FF8080
+ 00FF000000FF0000000000000000000000000000000000000000000000000000
+ 000000000000000000FF000000FF000000FF000000FF808000FF808000FF8080
+ 00FF000000FF000000FF000000FF000000FF0000000000000000000000000000
+ 00000000000000000000000000FF808000FF808000FF808000FF808000FF8080
+ 00FF808000FF808000FF000000FF000000000000000000000000000000000000
+ 0000000000000000000000000000000000FF808000FF808000FF808000FF8080
+ 00FF808000FF000000FF00000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000FF808000FF808000FF8080
+ 00FF000000FF0000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000FF808000FF0000
+ 00FF000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000FF0000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000
+ }
+ OnClick = sbUpClick
+ end
+ object btnApply: TBitBtn
+ AnchorSideBottom.Side = asrBottom
+ Left = -205
+ Height = 30
+ Top = 0
+ Width = 71
+ Anchors = [akTop, akRight, akBottom]
+ AutoSize = True
+ BorderSpacing.Right = 6
+ Caption = 'btnApply'
+ OnClick = btnApplyClick
+ TabOrder = 4
+ end
+ end
+ object StringGrid1: TStringGrid
+ Left = 6
+ Height = 446
+ Top = 6
+ Width = 469
+ Align = alClient
+ AlternateColor = clCream
+ AutoFillColumns = True
+ BorderSpacing.Around = 6
+ ColCount = 3
+ Columns = <
+ item
+ ButtonStyle = cbsCheckboxColumn
+ SizePriority = 0
+ Title.Alignment = taCenter
+ Title.Caption = '...'
+ Width = 30
+ end
+ item
+ ButtonStyle = cbsNone
+ ReadOnly = True
+ Title.Caption = 'Caption'
+ Width = 377
+ end
+ item
+ Alignment = taRightJustify
+ SizePriority = 0
+ Title.Alignment = taCenter
+ Title.Caption = 'Width'
+ Width = 60
+ end>
+ FixedCols = 0
+ Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goEditing, goRowSelect, goRowHighlight]
+ TabOrder = 1
+ TitleStyle = tsNative
+ OnClick = StringGrid1Click
+ OnValidateEntry = StringGrid1ValidateEntry
+ ColWidths = (
+ 30
+ 377
+ 60
+ )
+ Cells = (
+ 9
+ 0
+ 2
+ '1'
+ 0
+ 4
+ '1'
+ 1
+ 1
+ '1'
+ 1
+ 2
+ '2'
+ 1
+ 3
+ '3'
+ 1
+ 4
+ '4'
+ 2
+ 2
+ '11'
+ 2
+ 3
+ '11'
+ 2
+ 4
+ '11'
+ )
+ end
+end
diff --git a/components/rx/version/v2.2_laz_1.2/rxdbgrid_columsunit.lrt b/components/rx/version/v2.2_laz_1.2/rxdbgrid_columsunit.lrt
new file mode 100644
index 000000000..f8353c65b
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxdbgrid_columsunit.lrt
@@ -0,0 +1 @@
+TRXDBGRIDCOLUMSFORM.CAPTION=Grid colums
diff --git a/components/rx/version/v2.2_laz_1.2/rxdbgrid_columsunit.pas b/components/rx/version/v2.2_laz_1.2/rxdbgrid_columsunit.pas
new file mode 100644
index 000000000..d5f383818
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxdbgrid_columsunit.pas
@@ -0,0 +1,230 @@
+{ rxdbgrid_columsunit unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit rxdbgrid_columsunit;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, CheckLst,
+ StdCtrls, Buttons, ButtonPanel, Grids, rxdbgrid;
+
+type
+
+ { TrxDBGridColumsForm }
+
+ TrxDBGridColumsForm = class(TForm)
+ btnApply: TBitBtn;
+ ButtonPanel1: TButtonPanel;
+ sbUp: TSpeedButton;
+ sbDown: TSpeedButton;
+ StringGrid1: TStringGrid;
+ procedure btnApplyClick(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ procedure sbUpClick(Sender: TObject);
+ procedure sbDownClick(Sender: TObject);
+ procedure StringGrid1Click(Sender: TObject);
+ procedure StringGrid1ValidateEntry(sender: TObject; aCol, aRow: Integer;
+ const OldValue: string; var NewValue: String);
+ private
+ FGrid:TRxDBGrid;
+ procedure SetGrid(AGrid:TRxDBGrid);
+ procedure SetGridColumnsParams;
+ public
+ { public declarations }
+ end;
+
+
+procedure ShowRxDBGridColumsForm(Grid:TRxDBGrid);
+implementation
+uses rxdconst, math;
+
+{$R *.lfm}
+
+procedure ShowRxDBGridColumsForm(Grid: TRxDBGrid);
+var
+ rxDBGridColumsForm: TrxDBGridColumsForm;
+begin
+ rxDBGridColumsForm:=TrxDBGridColumsForm.Create(Application);
+ rxDBGridColumsForm.SetGrid(Grid);
+ if rxDBGridColumsForm.ShowModal = mrOk then
+ begin
+ if Assigned(Grid) then
+ rxDBGridColumsForm.SetGridColumnsParams;
+ end;
+ rxDBGridColumsForm.Free;
+end;
+
+{ TrxDBGridColumsForm }
+
+procedure TrxDBGridColumsForm.FormCreate(Sender: TObject);
+begin
+ sbUp.AnchorSideLeft.Control:=ButtonPanel1.HelpButton;
+ sbUp.AnchorSideTop.Control:=ButtonPanel1.HelpButton;
+ sbUp.AnchorSideBottom.Control:=ButtonPanel1.HelpButton;
+
+ btnApply.AnchorSideTop.Control:=ButtonPanel1.OKButton;
+ btnApply.AnchorSideBottom.Control:=ButtonPanel1.OKButton;
+
+ {$IFDEF UNIX}
+ btnApply.AnchorSideRight.Control:=ButtonPanel1.CancelButton;
+ {$ELSE}
+ btnApply.AnchorSideRight.Control:=ButtonPanel1.OKButton;
+ {$ENDIF}
+
+ Caption:=sRxDbGridSelColCaption;
+ sbUp.Hint:=sRxDbGridSelColHint1;
+ sbDown.Hint:=sRxDbGridSelColHint2;
+
+ btnApply.Caption:=sRxDbGridSelApplyCaption;
+ btnApply.Hint:=sRxDbGridSelApplyHint;
+end;
+
+procedure TrxDBGridColumsForm.btnApplyClick(Sender: TObject);
+begin
+ SetGridColumnsParams;
+end;
+
+procedure TrxDBGridColumsForm.sbUpClick(Sender: TObject);
+var
+ S, W, C:string;
+begin
+ if (StringGrid1.RowCount > 1) and (StringGrid1.Row > 1) then
+ begin
+ C:=StringGrid1.Cells[0, StringGrid1.Row-1];
+ S:=StringGrid1.Cells[1, StringGrid1.Row-1];
+ W:=StringGrid1.Cells[2, StringGrid1.Row-1];
+
+ StringGrid1.Cells[0, StringGrid1.Row-1]:=StringGrid1.Cells[0, StringGrid1.Row];
+ StringGrid1.Cells[1, StringGrid1.Row-1]:=StringGrid1.Cells[1, StringGrid1.Row];
+ StringGrid1.Cells[2, StringGrid1.Row-1]:=StringGrid1.Cells[2, StringGrid1.Row];
+
+ StringGrid1.Cells[0, StringGrid1.Row]:=C;
+ StringGrid1.Cells[1, StringGrid1.Row]:=S;
+ StringGrid1.Cells[2, StringGrid1.Row]:=W;
+
+ StringGrid1.Row:=StringGrid1.Row-1;
+ end;
+end;
+
+procedure TrxDBGridColumsForm.sbDownClick(Sender: TObject);
+var
+ S, W, C:string;
+ i:integer;
+begin
+ if (StringGrid1.RowCount > 1) and (StringGrid1.Row < StringGrid1.RowCount - 1) then
+ begin
+ C:=StringGrid1.Cells[0, StringGrid1.Row+1];
+ S:=StringGrid1.Cells[1, StringGrid1.Row+1];
+ W:=StringGrid1.Cells[2, StringGrid1.Row+1];
+
+ StringGrid1.Cells[0, StringGrid1.Row+1]:=StringGrid1.Cells[0, StringGrid1.Row];
+ StringGrid1.Cells[1, StringGrid1.Row+1]:=StringGrid1.Cells[1, StringGrid1.Row];
+ StringGrid1.Cells[2, StringGrid1.Row+1]:=StringGrid1.Cells[2, StringGrid1.Row];
+
+ StringGrid1.Cells[0, StringGrid1.Row]:=C;
+ StringGrid1.Cells[1, StringGrid1.Row]:=S;
+ StringGrid1.Cells[2, StringGrid1.Row]:=W;
+
+ StringGrid1.Row:=StringGrid1.Row+1;
+ end;
+end;
+
+procedure TrxDBGridColumsForm.StringGrid1Click(Sender: TObject);
+var
+ i:integer;
+ C:TRxColumn;
+begin
+ i:=StringGrid1.Row;
+
+ C:=FGrid.ColumnByCaption(StringGrid1.Cells[1, i]);
+ if coCustomizeVisible in C.Options then
+ StringGrid1.Options:=StringGrid1.Options + [goEditing]
+ else
+ StringGrid1.Options:=StringGrid1.Options - [goEditing]
+ ;
+end;
+
+procedure TrxDBGridColumsForm.StringGrid1ValidateEntry(sender: TObject; aCol,
+ aRow: Integer; const OldValue: string; var NewValue: String);
+begin
+ if aCol = 2 then
+ NewValue:=IntToStr(Max(StrToIntDef(NewValue, StrToIntDef(OldValue, 0)), 0));
+end;
+
+procedure TrxDBGridColumsForm.SetGrid(AGrid: TRxDBGrid);
+var
+ i:integer;
+ C:TRxColumn;
+begin
+ if AGrid=FGrid then exit;
+ FGrid:=AGrid;
+ if Assigned(AGrid) then
+ begin
+ StringGrid1.RowCount:=AGrid.Columns.Count + 1;
+
+ for i:=0 to AGrid.Columns.Count-1 do
+ begin
+ C:=AGrid.Columns[i] as TRxColumn;
+
+ StringGrid1.Cells[0, i + 1]:=BoolToStr(C.Visible, '1', '0');
+ StringGrid1.Cells[1, i + 1]:=C.Title.Caption;
+ if C.Width = 0 then
+ StringGrid1.Cells[2, i + 1]:=IntToStr(AGrid.DefaultColWidth)
+ else
+ StringGrid1.Cells[2, i + 1]:=IntToStr(C.Width);
+ end;
+ end
+ else
+ StringGrid1.RowCount:=1;
+end;
+
+procedure TrxDBGridColumsForm.SetGridColumnsParams;
+var
+ i:integer;
+ Col:TRxColumn;
+begin
+ for i:=1 to StringGrid1.RowCount-1 do
+ begin
+ Col:=FGrid.ColumnByCaption(StringGrid1.Cells[1, i]);
+ if Assigned(Col) then
+ begin
+ Col.Visible:=StringGrid1.Cells[0, i] = '1';
+ Col.Index:=i-1;
+ Col.Width:=StrToIntDef(StringGrid1.Cells[2, i], 65);
+ end
+ end;
+end;
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/rxdbgrid_export_spreadsheet.lpk b/components/rx/version/v2.2_laz_1.2/rxdbgrid_export_spreadsheet.lpk
new file mode 100644
index 000000000..c5faf841d
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxdbgrid_export_spreadsheet.lpk
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/rx/version/v2.2_laz_1.2/rxdbgrid_export_spreadsheet.pas b/components/rx/version/v2.2_laz_1.2/rxdbgrid_export_spreadsheet.pas
new file mode 100644
index 000000000..3186a748b
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxdbgrid_export_spreadsheet.pas
@@ -0,0 +1,23 @@
+{ This file was automatically created by Lazarus. Do not edit!
+ This source is only used to compile and install the package.
+ }
+
+unit rxdbgrid_export_spreadsheet;
+
+interface
+
+uses
+ RxDBGridExportSpreadSheet, RxDBGridExportSpreadSheet_ParamsUnit,
+ LazarusPackageIntf;
+
+implementation
+
+procedure Register;
+begin
+ RegisterUnit('RxDBGridExportSpreadSheet', @RxDBGridExportSpreadSheet.Register
+ );
+end;
+
+initialization
+ RegisterPackage('rxdbgrid_export_spreadsheet', @Register);
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxdbgrid_findunit.lfm b/components/rx/version/v2.2_laz_1.2/rxdbgrid_findunit.lfm
new file mode 100644
index 000000000..7cb26d37b
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxdbgrid_findunit.lfm
@@ -0,0 +1,185 @@
+object rxDBGridFindForm: TrxDBGridFindForm
+ Left = 688
+ Height = 225
+ Top = 327
+ Width = 493
+ ActiveControl = Edit1
+ Caption = 'Find'
+ ClientHeight = 225
+ ClientWidth = 493
+ OnCreate = FormCreate
+ OnShow = FormShow
+ Position = poScreenCenter
+ LCLVersion = '1.3'
+ object Label1: TLabel
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = Owner
+ AnchorSideBottom.Control = Edit1
+ AnchorSideBottom.Side = asrBottom
+ Left = 6
+ Height = 21
+ Top = 6
+ Width = 75
+ BorderSpacing.Around = 6
+ Caption = 'Text to find'
+ FocusControl = Edit1
+ ParentColor = False
+ end
+ object Label2: TLabel
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = Edit1
+ AnchorSideTop.Side = asrBottom
+ AnchorSideBottom.Control = ComboBox1
+ AnchorSideBottom.Side = asrBottom
+ Left = 6
+ Height = 21
+ Top = 70
+ Width = 75
+ BorderSpacing.Around = 6
+ Caption = 'Find at filed'
+ ParentColor = False
+ end
+ object BtnFind: TButton
+ AnchorSideRight.Control = Button2
+ AnchorSideBottom.Control = Owner
+ AnchorSideBottom.Side = asrBottom
+ Left = 340
+ Height = 41
+ Top = 178
+ Width = 84
+ Anchors = [akRight, akBottom]
+ AutoSize = True
+ BorderSpacing.Around = 6
+ BorderSpacing.InnerBorder = 4
+ Caption = 'Find more'
+ Default = True
+ OnClick = BtnFindClick
+ TabOrder = 2
+ end
+ object Button2: TButton
+ AnchorSideTop.Control = BtnFind
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ AnchorSideBottom.Control = Owner
+ AnchorSideBottom.Side = asrBottom
+ Left = 430
+ Height = 41
+ Top = 178
+ Width = 57
+ Anchors = [akRight, akBottom]
+ AutoSize = True
+ BorderSpacing.Top = 8
+ BorderSpacing.Around = 6
+ BorderSpacing.InnerBorder = 4
+ Cancel = True
+ Caption = 'Close'
+ OnClick = Button2Click
+ TabOrder = 3
+ end
+ object Edit1: TEdit
+ AnchorSideLeft.Control = ComboBox1
+ AnchorSideTop.Control = Label1
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ Left = 18
+ Height = 31
+ Top = 33
+ Width = 469
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Around = 6
+ TabOrder = 0
+ end
+ object ComboBox1: TComboBox
+ AnchorSideLeft.Control = Label2
+ AnchorSideTop.Control = Label2
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ Left = 12
+ Height = 33
+ Top = 97
+ Width = 475
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Around = 6
+ ItemHeight = 0
+ Style = csDropDownList
+ TabOrder = 1
+ end
+ object RadioGroup1: TRadioGroup
+ AnchorSideLeft.Control = Panel1
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = ComboBox1
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ AnchorSideBottom.Control = Panel1
+ AnchorSideBottom.Side = asrBottom
+ Left = 147
+ Height = 66
+ Top = 136
+ Width = 340
+ Anchors = [akTop, akLeft, akRight, akBottom]
+ AutoFill = True
+ AutoSize = True
+ BorderSpacing.Left = 6
+ BorderSpacing.Top = 6
+ BorderSpacing.Right = 6
+ Caption = 'Direction'
+ ChildSizing.LeftRightSpacing = 6
+ ChildSizing.TopBottomSpacing = 6
+ ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
+ ChildSizing.EnlargeVertical = crsHomogenousChildResize
+ ChildSizing.ShrinkHorizontal = crsScaleChilds
+ ChildSizing.ShrinkVertical = crsScaleChilds
+ ChildSizing.Layout = cclLeftToRightThenTopToBottom
+ ChildSizing.ControlsPerLine = 3
+ ClientHeight = 43
+ ClientWidth = 336
+ Columns = 3
+ Items.Strings = (
+ 'All'
+ 'Forward'
+ 'Backward'
+ )
+ TabOrder = 4
+ end
+ object Panel1: TPanel
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = ComboBox1
+ AnchorSideTop.Side = asrBottom
+ Left = 6
+ Height = 66
+ Top = 136
+ Width = 135
+ AutoSize = True
+ BorderSpacing.Around = 6
+ ClientHeight = 66
+ ClientWidth = 135
+ TabOrder = 5
+ object CheckBox2: TCheckBox
+ AnchorSideLeft.Control = Panel1
+ AnchorSideTop.Control = CheckBox1
+ AnchorSideTop.Side = asrBottom
+ Left = 7
+ Height = 23
+ Top = 36
+ Width = 91
+ BorderSpacing.Around = 6
+ Caption = 'Partial key'
+ TabOrder = 0
+ end
+ object CheckBox1: TCheckBox
+ AnchorSideLeft.Control = Panel1
+ AnchorSideTop.Control = Panel1
+ Left = 7
+ Height = 23
+ Top = 7
+ Width = 121
+ BorderSpacing.Around = 6
+ Caption = 'Case sensetive'
+ TabOrder = 1
+ end
+ end
+end
diff --git a/components/rx/version/v2.2_laz_1.2/rxdbgrid_findunit.pas b/components/rx/version/v2.2_laz_1.2/rxdbgrid_findunit.pas
new file mode 100644
index 000000000..2f2fc7b90
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxdbgrid_findunit.pas
@@ -0,0 +1,186 @@
+{ rxdbgrid_findunit unit
+
+Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit rxdbgrid_findunit;
+
+{$I rx.inc}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Buttons,
+ StdCtrls, ExtCtrls, rxdbgrid, DB;
+
+type
+
+ { TrxDBGridFindForm }
+
+ TrxDBGridFindForm = class(TForm)
+ BtnFind: TButton;
+ Button2: TButton;
+ CheckBox1: TCheckBox;
+ CheckBox2: TCheckBox;
+ ComboBox1: TComboBox;
+ Edit1: TEdit;
+ Label1: TLabel;
+ Label2: TLabel;
+ Panel1: TPanel;
+ RadioGroup1: TRadioGroup;
+ procedure BtnFindClick(Sender: TObject);
+ procedure Button2Click(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ procedure FormShow(Sender: TObject);
+ private
+ FGrid:TRxDBGrid;
+ FDataSet:TDataSet;
+ procedure SetGrid(AGrid:TRxDBGrid);
+ public
+ { public declarations }
+ end;
+
+procedure ShowRxDBGridFindForm(Grid:TRxDBGrid);
+
+implementation
+uses dbutils, DBGrids, rxdconst, LCLStrConsts;
+
+{$R *.lfm}
+
+procedure ShowRxDBGridFindForm(Grid: TRxDBGrid);
+var
+ rxDBGridFindForm: TrxDBGridFindForm;
+begin
+ rxDBGridFindForm:=TrxDBGridFindForm.Create(Application);
+ rxDBGridFindForm.SetGrid(Grid);
+ rxDBGridFindForm.ShowModal;
+ rxDBGridFindForm.Free;
+end;
+
+{ TrxDBGridFindForm }
+
+procedure TrxDBGridFindForm.Button2Click(Sender: TObject);
+begin
+ Close;
+end;
+
+procedure TrxDBGridFindForm.FormCreate(Sender: TObject);
+begin
+ Caption:=sRxDbGridFindCaption;
+ Label1.Caption:=sRxDbGridFindText;
+ Label2.Caption:=sRxDbGridFindOnField;
+ CheckBox1.Caption:=sRxDbGridFindCaseSens;
+ CheckBox2.Caption:=sRxDbGridFindPartial;
+ RadioGroup1.Caption:=sRxDbGridFindDirecion;
+ RadioGroup1.Items.Clear;
+ RadioGroup1.Items.Add(sRxDbGridFindRangeAll);
+ RadioGroup1.Items.Add(sRxDbGridFindRangeForw);
+ RadioGroup1.Items.Add(sRxDbGridFindRangeBack);
+ BtnFind.Caption:=sRxFindMore;
+ Button2.Caption:=rsMbClose;
+
+ RadioGroup1.ItemIndex:=0;
+end;
+
+procedure TrxDBGridFindForm.FormShow(Sender: TObject);
+begin
+ Edit1.SetFocus;
+end;
+
+procedure TrxDBGridFindForm.BtnFindClick(Sender: TObject);
+var
+ FieldName:string;
+ LOptions: TLocateOptions;
+ SearchOrigin:TRxSearchDirection;
+ P:TBookMark;
+ R:boolean;
+begin
+ { TODO -oalexs : Необходимо переделать поиск по колонке - искать всегда по строковому представлению. Иначе не ищет по дате-времени }
+ if Edit1.Text<>'' then
+ begin
+ try
+ FieldName:=FGrid.Columns[ComboBox1.ItemIndex].FieldName;
+ LOptions:=[];
+ if not CheckBox1.Checked then
+ LOptions:=LOptions+[loCaseInsensitive];
+
+ if CheckBox2.Checked then
+ LOptions:=LOptions+[loPartialKey];
+
+ SearchOrigin:=TRxSearchDirection(RadioGroup1.ItemIndex);
+ {$IFDEF NoAutomatedBookmark}
+ P:=FDataSet.GetBookmark;
+ {$ELSE}
+ P:=FDataSet.Bookmark;
+ {$ENDIF}
+ if SearchOrigin = rsdForward then
+ FDataSet.Next
+ else
+ if SearchOrigin = rsdBackward then
+ FDataSet.Prior;
+ R:=DataSetLocateThrough(FDataSet, FieldName, Edit1.Text, LOptions, SearchOrigin);
+ finally
+ {$IFDEF NoAutomatedBookmark}
+ if not R then
+ FDataSet.GotoBookmark(P);
+ FDataSet.FreeBookmark(P);
+ {$ELSE}
+ if not R then
+ FDataSet.Bookmark:=P;
+ {$ENDIF}
+ end;
+ end;
+end;
+
+type
+ THckGrid = class(TCustomDBGrid)
+ end;
+
+procedure TrxDBGridFindForm.SetGrid(AGrid: TRxDBGrid);
+var
+ i:integer;
+begin
+ if AGrid=FGrid then exit;
+ FGrid:=AGrid;
+ ComboBox1.Items.Clear;
+ if Assigned(AGrid) then
+ begin
+ for i:=0 to AGrid.Columns.Count-1 do
+ ComboBox1.Items.Add(AGrid.Columns[i].Title.Caption);
+ ComboBox1.ItemIndex:=ComboBox1.Items.IndexOf(AGrid.SelectedColumn.Title.Caption);
+ end;
+
+ FDataSet:=nil;
+ if Assigned(FGrid) and Assigned(THckGrid(FGrid).DataSource) then
+ FDataSet:=THckGrid(FGrid).DataSource.DataSet;
+ BtnFind.Enabled:=Assigned(FDataSet) and FDataSet.Active
+end;
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/rxdbgrid_print.lpk b/components/rx/version/v2.2_laz_1.2/rxdbgrid_print.lpk
new file mode 100644
index 000000000..94c8d28c2
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxdbgrid_print.lpk
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/rx/version/v2.2_laz_1.2/rxdbgrid_print.pas b/components/rx/version/v2.2_laz_1.2/rxdbgrid_print.pas
new file mode 100644
index 000000000..63d62d2c9
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxdbgrid_print.pas
@@ -0,0 +1,21 @@
+{ This file was automatically created by Lazarus. Do not edit!
+ This source is only used to compile and install the package.
+ }
+
+unit rxdbgrid_print;
+
+interface
+
+uses
+ RxDBGridPrintGrid, RxDBGridPrintGrid_SetupUnit, LazarusPackageIntf;
+
+implementation
+
+procedure Register;
+begin
+ RegisterUnit('RxDBGridPrintGrid', @RxDBGridPrintGrid.Register);
+end;
+
+initialization
+ RegisterPackage('rxdbgrid_print', @Register);
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxdbgridexportspreadsheet.pas b/components/rx/version/v2.2_laz_1.2/rxdbgridexportspreadsheet.pas
new file mode 100644
index 000000000..e31877ad3
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxdbgridexportspreadsheet.pas
@@ -0,0 +1,418 @@
+{ RxDBGridExportSpreadSheet unit
+
+ Copyright (C) 2005-2013 Lagunov Aleksey alexs@yandex.ru
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit RxDBGridExportSpreadSheet;
+
+{$I rx.inc}
+
+interface
+
+uses
+ Classes, SysUtils, rxdbgrid, DB, fpspreadsheet, Graphics;
+
+type
+ TRxDBGridExportSpreadSheetOption = (ressExportTitle,
+ ressExportColors,
+ ressExportFooter,
+ ressOverwriteExisting
+ );
+
+ TRxDBGridExportSpreadSheetOptions = set of TRxDBGridExportSpreadSheetOption;
+
+type
+
+ { TRxDBGridExportSpreadSheet }
+
+ TRxDBGridExportSpreadSheet = class(TRxDBGridAbstractTools)
+ private
+ FFileName: string;
+ FOpenAfterExport: boolean;
+ FOptions: TRxDBGridExportSpreadSheetOptions;
+ FPageName: string;
+ protected
+ FDataSet:TDataSet;
+ FWorkbook: TsWorkbook;
+ FWorksheet: TsWorksheet;
+ FCurRow : integer;
+ FCurCol : integer;
+ scColorBlack:TsColor;
+
+ procedure DoExportTitle;
+ procedure DoExportBody;
+ procedure DoExportFooter;
+ procedure DoExportColWidth;
+ function DoExecTools:boolean;override;
+ function DoSetupTools:boolean; override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ published
+ property FileName:string read FFileName write FFileName;
+ property PageName:string read FPageName write FPageName;
+ property Options:TRxDBGridExportSpreadSheetOptions read FOptions write FOptions;
+ property OpenAfterExport:boolean read FOpenAfterExport write FOpenAfterExport default false;
+ end;
+
+procedure Register;
+
+implementation
+uses fpsallformats, LCLType, Forms, math, LazUTF8, rxdconst, Controls, LCLIntf,
+ RxDBGridExportSpreadSheet_ParamsUnit;
+
+{$R rxdbgridexportspreadsheet.res}
+
+procedure Register;
+begin
+ RegisterComponents('RX DBAware',[TRxDBGridExportSpreadSheet]);
+end;
+
+const
+ ssAligns : array [TAlignment] of TsHorAlignment = (haLeft, haRight, haCenter);
+
+{ TRxDBGridExportSpeadSheet }
+
+procedure TRxDBGridExportSpreadSheet.DoExportTitle;
+var
+ i, k : Integer;
+ C : TRxColumn;
+ CT : TRxColumnTitle;
+ CC : TColor;
+ scColor : TsColor;
+ CB:TsCellBorders;
+ FMaxTitleHeight : integer;
+ P: TMLCaptionItem;
+begin
+ FCurCol:=0;
+ FMaxTitleHeight:=1;
+ for i:=0 to FRxDBGrid.Columns.Count - 1 do
+ begin
+ C:=FRxDBGrid.Columns[i] as TRxColumn;
+ CT:=C.Title as TRxColumnTitle;
+ FMaxTitleHeight:=Max(FMaxTitleHeight, CT.CaptionLinesCount);
+ if C.Visible then
+ begin
+ if CT.CaptionLinesCount > 0 then
+ begin
+ for k:=0 to CT.CaptionLinesCount - 1 do
+ begin
+ CC:=C.Title.Color;
+ if (CC and SYS_COLOR_BASE) = 0 then
+ begin
+ scColor:=FWorkbook.AddColorToPalette(CC);
+ FWorksheet.WriteBackgroundColor(FCurRow, FCurCol, scColor);
+ end;
+
+ CB:=[cbNorth, cbWest, cbEast, cbSouth];
+
+ FWorksheet.WriteBorderColor(FCurRow + k, FCurCol, cbNorth, scColorBlack);
+
+ if not Assigned(CT.CaptionLine(k).Next) then
+ FWorksheet.WriteBorderColor(FCurRow + k, FCurCol, cbWest, scColorBlack)
+ else
+ CB:=CB - [cbWest];
+
+ if not Assigned(CT.CaptionLine(k).Prior) then
+ FWorksheet.WriteBorderColor(FCurRow + k, FCurCol, cbEast, scColorBlack)
+ else
+ CB:=CB - [cbEast];
+
+
+ FWorksheet.WriteBorderColor(FCurRow + k ,FCurCol, cbSouth, scColorBlack);
+
+ FWorksheet.WriteBorders(FCurRow + k, FCurCol, CB);
+
+ FWorksheet.WriteHorAlignment(FCurRow + k, FCurCol, ssAligns[C.Title.Alignment]);
+
+ FWorksheet.WriteUTF8Text(FCurRow + k, FCurCol, CT.CaptionLine(k).Caption);
+
+ if Assigned(CT.CaptionLine(k).Next) and not Assigned(CT.CaptionLine(k).Prior) then
+ begin
+ //Merge title cell
+ P:=CT.CaptionLine(k);
+ CC:=FCurCol;
+ while Assigned(P.Next) do
+ begin
+ Inc(CC);
+ P:=P.Next;
+ end;
+ if CC<>FCurCol then
+ FWorksheet.MergeCells(FCurRow, FCurCol, FCurRow, CC);
+ end;
+ end;
+ end
+ else
+ begin
+ CC:=C.Title.Color;
+ if (CC and SYS_COLOR_BASE) = 0 then
+ begin
+ scColor:=FWorkbook.AddColorToPalette(CC);
+ FWorksheet.WriteBackgroundColor( FCurRow, FCurCol, scColor);
+ end;
+
+ FWorksheet.WriteBorders(FCurRow,FCurCol, [cbNorth, cbWest, cbEast, cbSouth]);
+ FWorksheet.WriteBorderColor(FCurRow,FCurCol, cbNorth, scColorBlack);
+ FWorksheet.WriteBorderColor(FCurRow,FCurCol, cbWest, scColorBlack);
+ FWorksheet.WriteBorderColor(FCurRow,FCurCol, cbEast, scColorBlack);
+ FWorksheet.WriteBorderColor(FCurRow,FCurCol, cbSouth, scColorBlack);
+
+ FWorksheet.WriteHorAlignment(FCurRow, FCurCol, ssAligns[C.Title.Alignment]);
+
+ FWorksheet.WriteUTF8Text(FCurRow, FCurCol, C.Title.Caption);
+
+ end;
+
+ inc(FCurCol);
+ end;
+ end;
+
+
+ if FMaxTitleHeight > 1 then
+ begin
+ for i:=0 to FRxDBGrid.Columns.Count-1 do
+ begin
+ C:=FRxDBGrid.Columns[i] as TRxColumn;
+ CT:=C.Title as TRxColumnTitle;
+ if CT.CaptionLinesCount < FMaxTitleHeight then
+ begin
+ FWorksheet.MergeCells( FCurRow + CT.CaptionLinesCount, I, FCurRow + FMaxTitleHeight - 1, I);
+ end;
+ end;
+ end;
+
+ inc(FCurRow, FMaxTitleHeight);
+end;
+
+procedure TRxDBGridExportSpreadSheet.DoExportBody;
+var
+ i : Integer;
+ C : TRxColumn;
+ CT : TRxColumnTitle;
+ CC : TColor;
+ scColor : TsColor;
+ F:TFont;
+ S: String;
+ J: Integer;
+begin
+ F:=TFont.Create;
+ FDataSet.First;
+ while not FDataSet.EOF do
+ begin
+ FCurCol:=0;
+ for i:=0 to FRxDBGrid.Columns.Count - 1 do
+ begin
+ C:=FRxDBGrid.Columns[i] as TRxColumn;
+ CT:=C.Title as TRxColumnTitle;
+ if C.Visible then
+ begin
+
+ S:=C.Field.DisplayText;
+ if (C.KeyList.Count > 0) and (C.PickList.Count > 0) then
+ begin
+ J := C.KeyList.IndexOf(S);
+ if (J >= 0) and (J < C.PickList.Count) then
+ S := C.PickList[j];
+ end;
+ FWorksheet.WriteUTF8Text(FCurRow, FCurCol, S);
+
+ if ressExportColors in FOptions then
+ begin
+ CC:=C.Color;
+ if Assigned(RxDBGrid.OnGetCellProps) then
+ RxDBGrid.OnGetCellProps(RxDBGrid, C.Field, F, CC);
+ if (CC and SYS_COLOR_BASE) = 0 then
+ begin
+ scColor:=FWorkbook.AddColorToPalette(CC);
+ FWorksheet.WriteBackgroundColor(FCurRow,FCurCol, scColor);
+ end;
+ end;
+
+ FWorksheet.WriteBorders(FCurRow,FCurCol, [cbNorth, cbWest, cbEast, cbSouth]);
+ FWorksheet.WriteBorderColor(FCurRow,FCurCol, cbNorth, scColorBlack);
+ FWorksheet.WriteBorderColor(FCurRow,FCurCol, cbWest, scColorBlack);
+ FWorksheet.WriteBorderColor(FCurRow,FCurCol, cbEast, scColorBlack);
+ FWorksheet.WriteBorderColor(FCurRow,FCurCol, cbSouth, scColorBlack);
+
+ FWorksheet.WriteHorAlignment(FCurRow, FCurCol, ssAligns[C.Alignment]);
+ inc(FCurCol);
+ end;
+ end;
+ inc(FCurRow);
+ FDataSet.Next;
+ end;
+ F.Free
+end;
+
+procedure TRxDBGridExportSpreadSheet.DoExportFooter;
+var
+ i : Integer;
+ C : TRxColumn;
+ CT : TRxColumnTitle;
+ CC : TColor;
+ scColor : TsColor;
+begin
+ CC:=FRxDBGrid.FooterOptions.Color;
+ FCurCol:=0;
+ for i:=0 to FRxDBGrid.Columns.Count - 1 do
+ begin
+ C:=FRxDBGrid.Columns[i] as TRxColumn;
+ CT:=C.Title as TRxColumnTitle;
+ if C.Visible then
+ begin
+ if (CC and SYS_COLOR_BASE) = 0 then
+ begin
+ scColor:=FWorkbook.AddColorToPalette(CC);
+ FWorksheet.WriteBackgroundColor(FCurRow,FCurCol, scColor);
+ end;
+
+ if (C.Footer.ValueType <> fvtNon) then
+ begin
+ FWorksheet.WriteUTF8Text(FCurRow, FCurCol, C.Footer.DisplayText);
+
+ FWorksheet.WriteBorders(FCurRow,FCurCol, [cbNorth, cbWest, cbEast, cbSouth]);
+ FWorksheet.WriteBorderColor(FCurRow,FCurCol, cbNorth, scColorBlack);
+ FWorksheet.WriteBorderColor(FCurRow,FCurCol, cbWest, scColorBlack);
+ FWorksheet.WriteBorderColor(FCurRow,FCurCol, cbEast, scColorBlack);
+ FWorksheet.WriteBorderColor(FCurRow,FCurCol, cbSouth, scColorBlack);
+
+ FWorksheet.WriteHorAlignment(FCurRow, FCurCol, ssAligns[C.Footer.Alignment]);
+ end;
+ inc(FCurCol);
+ end;
+ end;
+end;
+
+procedure TRxDBGridExportSpreadSheet.DoExportColWidth;
+var
+ FW:integer;
+ C:TRxColumn;
+ i: Integer;
+begin
+ FW:=FRxDBGrid.Canvas.TextWidth('W');
+ FCurCol:=0;
+ for i:=0 to FRxDBGrid.Columns.Count - 1 do
+ begin
+ C:=FRxDBGrid.Columns[i] as TRxColumn;
+ if C.Visible then
+ begin
+ FWorksheet.WriteColWidth(FCurCol, Max(C.Width div FW, 20));
+ inc(FCurCol);
+ end;
+ end;
+end;
+
+
+constructor TRxDBGridExportSpreadSheet.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FCaption:=sToolsExportSpeadSheet;
+ FOpenAfterExport:=false;
+end;
+
+function TRxDBGridExportSpreadSheet.DoExecTools: boolean;
+var
+ P:TBookMark;
+begin
+ Result:=false;
+ if (not Assigned(FRxDBGrid)) or (not Assigned(FRxDBGrid.DataSource)) or (not Assigned(FRxDBGrid.DataSource.DataSet)) then
+ exit;
+ FDataSet:=FRxDBGrid.DataSource.DataSet;
+ FDataSet.DisableControls;
+ {$IFDEF NoAutomatedBookmark}
+ P:=FDataSet.GetBookmark;
+ {$ELSE}
+ P:=FDataSet.Bookmark;
+ {$ENDIF}
+
+ FWorkbook := TsWorkbook.Create;
+ FWorksheet := FWorkbook.AddWorksheet(FPageName);
+ try
+ scColorBlack:=FWorkbook.AddColorToPalette(FRxDBGrid.GridLineColor);
+ FCurRow:=0;
+
+ if ressExportTitle in FOptions then
+ DoExportTitle;
+ DoExportBody;
+
+ if ressExportFooter in FOptions then
+ DoExportFooter;
+
+ DoExportColWidth;
+
+ FWorkbook.WriteToFile(UTF8ToSys(FileName), true);
+ Result:=true;
+ finally
+ FWorkbook.Free;
+ {$IFDEF NoAutomatedBookmark}
+ FDataSet.GotoBookmark(P);
+ FDataSet.FreeBookmark(P);
+ {$ELSE}
+ FDataSet.Bookmark:=P;
+ {$ENDIF}
+ FDataSet.EnableControls;
+ end;
+
+ if Result then
+ OpenDocument(FileName);
+end;
+
+function TRxDBGridExportSpreadSheet.DoSetupTools: boolean;
+var
+ F:TRxDBGridExportSpreadSheet_ParamsForm;
+begin
+ F:=TRxDBGridExportSpreadSheet_ParamsForm.Create(Application);
+ F.FileNameEdit1.FileName:=FFileName;
+ F.cbOpenAfterExport.Checked:=FOpenAfterExport;
+ F.cbExportColumnFooter.Checked:=ressExportFooter in FOptions;
+ F.cbExportColumnHeader.Checked:=ressExportTitle in FOptions;
+ F.cbExportCellColors.Checked:=ressExportColors in FOptions;
+ F.cbOverwriteExisting.Checked:=ressOverwriteExisting in FOptions;
+ F.edtPageName.Text:=FPageName;
+
+ Result:=F.ShowModal = mrOk;
+ if Result then
+ begin
+ FOpenAfterExport:=F.cbOpenAfterExport.Checked;
+ FFileName:=F.FileNameEdit1.FileName;
+ FPageName:=F.edtPageName.Text;
+
+ FOptions:=[];
+ if F.cbExportColumnFooter.Checked then
+ FOptions :=FOptions + [ressExportFooter];
+ if F.cbExportColumnHeader.Checked then
+ FOptions :=FOptions + [ressExportTitle];
+ if F.cbExportCellColors.Checked then
+ FOptions :=FOptions + [ressExportColors];
+ if F.cbOverwriteExisting.Checked then
+ FOptions :=FOptions + [ressOverwriteExisting];
+ end;
+ F.Free;
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxdbgridexportspreadsheet.res b/components/rx/version/v2.2_laz_1.2/rxdbgridexportspreadsheet.res
new file mode 100644
index 000000000..b62312a42
Binary files /dev/null and b/components/rx/version/v2.2_laz_1.2/rxdbgridexportspreadsheet.res differ
diff --git a/components/rx/version/v2.2_laz_1.2/rxdbgridexportspreadsheet_paramsunit.lfm b/components/rx/version/v2.2_laz_1.2/rxdbgridexportspreadsheet_paramsunit.lfm
new file mode 100644
index 000000000..469ff3196
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxdbgridexportspreadsheet_paramsunit.lfm
@@ -0,0 +1,157 @@
+object RxDBGridExportSpreadSheet_ParamsForm: TRxDBGridExportSpreadSheet_ParamsForm
+ Left = 732
+ Height = 236
+ Top = 338
+ Width = 548
+ Caption = 'Export params'
+ ClientHeight = 236
+ ClientWidth = 548
+ OnCreate = FormCreate
+ Position = poScreenCenter
+ LCLVersion = '1.3'
+ object Label1: TLabel
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = Owner
+ Left = 6
+ Height = 21
+ Top = 6
+ Width = 105
+ BorderSpacing.Around = 6
+ Caption = 'Export file name'
+ FocusControl = FileNameEdit1
+ ParentColor = False
+ end
+ object FileNameEdit1: TFileNameEdit
+ AnchorSideLeft.Control = Label1
+ AnchorSideTop.Control = Label1
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ Left = 12
+ Height = 31
+ Top = 33
+ Width = 530
+ Filter = 'All files (*.*)|*.*|LibreOffice/OpenOffice (*.ods)|*.ods|Excell 97-2003|*.xls|Excell 2007-2013|*.xlxs'
+ FilterIndex = 0
+ HideDirectories = False
+ ButtonWidth = 23
+ NumGlyphs = 1
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Around = 6
+ MaxLength = 0
+ TabOrder = 0
+ end
+ object Label3: TLabel
+ AnchorSideLeft.Control = Label4
+ AnchorSideTop.Control = cbOverwriteExisting
+ AnchorSideTop.Side = asrBottom
+ Left = 280
+ Height = 21
+ Top = 99
+ Width = 71
+ BorderSpacing.Around = 6
+ Caption = 'Page name'
+ FocusControl = edtPageName
+ ParentColor = False
+ end
+ object edtPageName: TEdit
+ AnchorSideLeft.Control = Label3
+ AnchorSideTop.Control = Label3
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ Left = 286
+ Height = 31
+ Top = 126
+ Width = 256
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Around = 6
+ TabOrder = 1
+ end
+ object cbExportColumnFooter: TCheckBox
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = cbExportColumnHeader
+ AnchorSideTop.Side = asrBottom
+ Left = 6
+ Height = 23
+ Top = 128
+ Width = 161
+ BorderSpacing.Around = 6
+ Caption = 'Export column footer'
+ TabOrder = 2
+ end
+ object cbOpenAfterExport: TCheckBox
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = FileNameEdit1
+ AnchorSideTop.Side = asrBottom
+ Left = 6
+ Height = 23
+ Top = 70
+ Width = 140
+ BorderSpacing.Around = 6
+ Caption = 'Open after export'
+ TabOrder = 3
+ end
+ object ButtonPanel1: TButtonPanel
+ Left = 6
+ Height = 41
+ Top = 189
+ Width = 536
+ OKButton.Name = 'OKButton'
+ OKButton.DefaultCaption = True
+ HelpButton.Name = 'HelpButton'
+ HelpButton.DefaultCaption = True
+ CloseButton.Name = 'CloseButton'
+ CloseButton.DefaultCaption = True
+ CancelButton.Name = 'CancelButton'
+ CancelButton.DefaultCaption = True
+ TabOrder = 4
+ ShowButtons = [pbOK, pbCancel, pbHelp]
+ end
+ object cbExportColumnHeader: TCheckBox
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = cbOpenAfterExport
+ AnchorSideTop.Side = asrBottom
+ Left = 6
+ Height = 23
+ Top = 99
+ Width = 165
+ BorderSpacing.Around = 6
+ Caption = 'Export column header'
+ TabOrder = 5
+ end
+ object cbExportCellColors: TCheckBox
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = cbExportColumnFooter
+ AnchorSideTop.Side = asrBottom
+ Left = 6
+ Height = 23
+ Top = 157
+ Width = 136
+ BorderSpacing.Around = 6
+ Caption = 'Export cell colors'
+ TabOrder = 6
+ end
+ object Label4: TLabel
+ AnchorSideLeft.Control = Owner
+ AnchorSideLeft.Side = asrCenter
+ AnchorSideTop.Control = Owner
+ Left = 274
+ Height = 1
+ Top = 0
+ Width = 1
+ ParentColor = False
+ end
+ object cbOverwriteExisting: TCheckBox
+ AnchorSideLeft.Control = Label4
+ AnchorSideTop.Control = FileNameEdit1
+ AnchorSideTop.Side = asrBottom
+ Left = 280
+ Height = 23
+ Top = 70
+ Width = 166
+ BorderSpacing.Around = 6
+ Caption = 'Overwrite existing file'
+ TabOrder = 7
+ end
+end
diff --git a/components/rx/version/v2.2_laz_1.2/rxdbgridexportspreadsheet_paramsunit.pas b/components/rx/version/v2.2_laz_1.2/rxdbgridexportspreadsheet_paramsunit.pas
new file mode 100644
index 000000000..ef8af1534
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxdbgridexportspreadsheet_paramsunit.pas
@@ -0,0 +1,84 @@
+{ RxDBGridExportSpreadSheet_ParamsUnit unit
+
+ Copyright (C) 2005-2013 Lagunov Aleksey alexs@yandex.ru
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit RxDBGridExportSpreadSheet_ParamsUnit;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
+ EditBtn, ButtonPanel;
+
+type
+
+ { TRxDBGridExportSpreadSheet_ParamsForm }
+
+ TRxDBGridExportSpreadSheet_ParamsForm = class(TForm)
+ ButtonPanel1: TButtonPanel;
+ cbExportColumnFooter: TCheckBox;
+ cbOpenAfterExport: TCheckBox;
+ cbExportColumnHeader: TCheckBox;
+ cbExportCellColors: TCheckBox;
+ cbOverwriteExisting: TCheckBox;
+ edtPageName: TEdit;
+ FileNameEdit1: TFileNameEdit;
+ Label1: TLabel;
+ Label3: TLabel;
+ Label4: TLabel;
+ procedure FormCreate(Sender: TObject);
+ private
+ { private declarations }
+ public
+ { public declarations }
+ end;
+
+implementation
+uses rxdconst;
+
+{$R *.lfm}
+
+{ TRxDBGridExportSpreadSheet_ParamsForm }
+
+procedure TRxDBGridExportSpreadSheet_ParamsForm.FormCreate(Sender: TObject);
+begin
+ Label1.Caption:=sExportFileName;
+ Label3.Caption:=sPageName;
+ cbOpenAfterExport.Caption:=sOpenAfterExport;
+ cbExportColumnHeader.Caption:=sExportColumnHeader;
+ cbExportColumnFooter.Caption:=sExportColumnFooter;
+ cbExportCellColors.Caption:=sExportCellColors;
+ cbOverwriteExisting.Caption:=sOverwriteExisting;
+end;
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/rxdbgridprintgrid.pas b/components/rx/version/v2.2_laz_1.2/rxdbgridprintgrid.pas
new file mode 100644
index 000000000..1517d4571
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxdbgridprintgrid.pas
@@ -0,0 +1,561 @@
+{ RxDBGridPrintGrid unit
+
+ Copyright (C) 2005-2014 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+unit RxDBGridPrintGrid;
+
+{$I rx.inc}
+
+interface
+
+uses
+ Classes, SysUtils, DB, rxdbgrid, LR_Class, LR_DSet, LR_DBSet, contnrs,
+ Graphics, Printers;
+
+type
+ TRxDBGridPrintOption =
+ (rxpoShowTitle,
+ rxpoShowFooter,
+ rxpoShowGridColor,
+ rxpoShowFooterColor,
+ rxpoShowReportTitle,
+ rxpoHideZeroValues
+ );
+ TRxDBGridPrintOptions = set of TRxDBGridPrintOption;
+
+
+ { TRxColInfo }
+
+ TRxColInfo = class
+ Col:TRxColumn;
+ ColWidth:integer;
+ ColTitles:TStringList;
+ constructor Create;
+ destructor Destroy; override;
+ end;
+
+ { TRxPageMargin }
+
+ TRxPageMargin = class(TPersistent)
+ private
+ FBottom: integer;
+ FLeft: integer;
+ FRight: integer;
+ FTop: integer;
+ protected
+ procedure AssignTo(Dest: TPersistent); override;
+ public
+ constructor Create;
+ published
+ property Left:integer read FLeft write FLeft default 20;
+ property Top:integer read FTop write FTop default 20;
+ property Right:integer read FRight write FRight default 20;
+ property Bottom:integer read FBottom write FBottom default 20;
+ end;
+
+ { TRxDBGridPrint }
+
+ TRxDBGridPrint = class(TRxDBGridAbstractTools)
+ private
+ FOptions: TRxDBGridPrintOptions;
+ FOrientation: TPrinterOrientation;
+ FPageMargin: TRxPageMargin;
+ FReport : TfrReport;
+ FReportDataSet : TfrDBDataSet;
+ FColumnDataSet : TfrUserDataSet;
+ FDataSet : TDataset;
+ FPage : TfrPage;
+ FReportTitle: string;
+ FShowColumnHeaderOnAllPage: boolean;
+
+ FShowProgress : Boolean;
+ FTitleRowCount : integer;
+ FRxColInfoList : TObjectList;
+
+ FYPos: Integer;
+ FXPos: Integer;
+ procedure DoCreateReport;
+
+ procedure DoShowReportTitle;
+ procedure DoSetupColumns;
+ procedure DoShowColumnsTitle;
+ procedure DoShowFooter;
+ procedure OnPrintColumn(ColNo: Integer; var Width: Integer);
+ procedure OnEnterRect(Memo: TStringList; View: TfrView);
+ procedure SetPageMargin(AValue: TRxPageMargin);
+ protected
+ function DoExecTools:boolean;override;
+ function DoSetupTools:boolean; override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure PreviewReport;
+ published
+ property Orientation: TPrinterOrientation read FOrientation write FOrientation default poPortrait;
+ property Options:TRxDBGridPrintOptions read FOptions write FOptions;
+ property ShowProgress : Boolean read FShowProgress write FShowProgress default false;
+ property PageMargin:TRxPageMargin read FPageMargin write SetPageMargin;
+ property ReportTitle:string read FReportTitle write FReportTitle;
+ property ShowColumnHeaderOnAllPage:boolean read FShowColumnHeaderOnAllPage write FShowColumnHeaderOnAllPage default false;
+ end;
+
+procedure Register;
+implementation
+
+uses math, RxDBGridPrintGrid_SetupUnit, Forms, Controls, rxdconst;
+
+{$R rxdbgridprintgrid.res}
+
+procedure Register;
+begin
+ RegisterComponents('RX DBAware',[TRxDBGridPrint]);
+end;
+
+{ TRxPageMargin }
+
+procedure TRxPageMargin.AssignTo(Dest: TPersistent);
+begin
+ if (Dest is TRxPageMargin) then
+ begin
+ TRxPageMargin(Dest).FBottom:=FBottom;
+ TRxPageMargin(Dest).FLeft:=FLeft;
+ TRxPageMargin(Dest).FRight:=FRight;
+ TRxPageMargin(Dest).FTop:=FTop;
+ end
+ else
+ inherited AssignTo(Dest);
+end;
+
+constructor TRxPageMargin.Create;
+begin
+ inherited Create;
+ FBottom:=20;
+ FLeft:=20;
+ FRight:=20;
+ FTop:=20;
+end;
+
+{ TRxColInfo }
+
+constructor TRxColInfo.Create;
+begin
+ inherited Create;
+ ColTitles:=TStringList.Create;
+end;
+
+destructor TRxColInfo.Destroy;
+begin
+ ColTitles.Clear;
+ FreeAndNil(ColTitles);
+ inherited Destroy;
+end;
+
+{ TRxDBGridPrint }
+
+procedure TRxDBGridPrint.DoShowReportTitle;
+var
+ FBand: TfrBandView;
+ FView: TfrMemoView;
+begin
+ FBand := TfrBandView(frCreateObject(gtBand, '', FPage));
+ FBand.SetBounds(10, FYPos, 1000, 25);
+ FBand.BandType := btReportTitle;
+// FPage.Objects.Add(FBand);
+
+ FView := frCreateObject(gtMemo, '', FPage) as TfrMemoView;
+ FView.SetBounds(FXPos, FYPos, FPage.PrnInfo.PgW - 40, 25);
+ FView.Alignment:=taCenter;
+ FView.Font.Size:=12;
+// FView.Font.Assign(FTitleFont);
+ FView.Memo.Add(FReportTitle);
+
+// FPage.Objects.Add(FView);
+
+ Inc(FYPos, 27)
+end;
+
+procedure TRxDBGridPrint.DoCreateReport;
+var
+ FBand: TfrBandView;
+ FView: TfrMemoView;
+begin
+ if FReport.Pages.Count=0 then
+ FReport.Pages.add;
+ FPage := FReport.Pages[FReport.Pages.Count-1];
+ FPage.ChangePaper(FPage.pgSize, FPage.Width, FPage.Height, FOrientation);
+
+ FPage.Margins.Top:=FPageMargin.Top;
+ FPage.Margins.Left:=FPageMargin.Left;
+ FPage.Margins.Bottom:=FPageMargin.Bottom;
+ FPage.Margins.Right:=FPageMargin.Right;
+
+ FYPos:=FPageMargin.Top;
+ FXPos:=FPageMargin.Left;
+
+ if rxpoShowReportTitle in FOptions then
+ DoShowReportTitle;
+
+ if rxpoShowTitle in FOptions then
+ DoShowColumnsTitle;
+
+ FBand := TfrBandView(frCreateObject(gtBand, '', FPage));
+ FBand.BandType := btMasterData;
+ FBand.Dataset := FReportDataSet.Name;
+ FBand.SetBounds(0, FYPos, 1000, 18);
+ FBand.Flags:=FBand.Flags or flStretched;
+// FPage.Objects.Add(FBand);
+
+ FBand := TfrBandView(frCreateObject(gtBand, '', FPage));
+ FBand.BandType := btCrossData;
+ FBand.Dataset := FColumnDataSet.Name;
+ FBand.SetBounds(FXPos, 0, 20, 1000);
+// FPage.Objects.Add(FBand);
+
+ FView := frCreateObject(gtMemo, '', FPage) as TfrMemoView;
+ FView.SetBounds(FXPos, FYPos, 20, 18);
+ FView.Memo.Add('[Cell]');
+ FView.Flags:=FView.Flags or flStretched;
+ FView.Font.Size:=10;
+// FView.Font.Assign(FFont);
+ FView.Frames:=frAllFrames;
+ FView.Layout:=tlTop;
+// FPage.Objects.Add(FView);
+
+ FYPos := FYPos + 22;
+
+ if (RxDBGrid.FooterOptions.Active) and (RxDBGrid.FooterOptions.RowCount>0) then
+ DoShowFooter;
+end;
+
+procedure TRxDBGridPrint.DoSetupColumns;
+var
+ P:TRxColInfo;
+ i: Integer;
+ j: Integer;
+begin
+ FTitleRowCount:=1;
+ FRxColInfoList.Clear;
+ for i:=0 to RxDBGrid.Columns.Count-1 do
+ begin
+ if RxDBGrid.Columns[i].Visible then
+ begin
+ P:=TRxColInfo.Create;
+ FRxColInfoList.Add(P);
+ P.Col:=RxDBGrid.Columns[i] as TRxColumn;
+ P.ColWidth:=RxDBGrid.Columns[i].Width;
+ for j:=0 to TRxColumnTitle(RxDBGrid.Columns[i].Title).CaptionLinesCount-1 do
+ P.ColTitles.Add(TRxColumnTitle(RxDBGrid.Columns[i].Title).CaptionLine(j).Caption);
+ FTitleRowCount:=Max(FTitleRowCount, P.ColTitles.Count)
+ end;
+ end;
+end;
+
+procedure TRxDBGridPrint.DoShowColumnsTitle;
+var
+ FBand: TfrBandView;
+ FView: TfrMemoView;
+ i: Integer;
+begin
+ FBand := TfrBandView(frCreateObject(gtBand, '', FPage));
+ FBand.BandType := btMasterHeader;
+ FBand.SetBounds(0, FYPos, 1000, 20 * FTitleRowCount);
+ FBand.Flags:=FBand.Flags or flStretched;
+// FPage.Objects.Add(FBand);
+ if FShowColumnHeaderOnAllPage then
+ FBand.Flags:=FBand.Flags + flBandRepeatHeader;
+
+ for i:=0 to FTitleRowCount-1 do
+ begin
+ FView := frCreateObject(gtMemo, '', FPage) as TfrMemoView;
+ FView.SetBounds(FXPos, FYPos, 20, 20);
+ FView.Alignment:=taCenter;
+ FView.FillColor := clSilver;
+ // FView.Font.Assign(FTitleFont);
+ FView.Font.Size:=12;
+ FView.Frames:=frAllFrames;
+ FView.Layout:=tlTop;
+ FView.Memo.Add(Format('Header_%d', [i]));
+// FPage.Objects.Add(FView);
+ FYPos:=FYPos + 20
+ end;
+ FYPos := FYPos + 2;
+end;
+
+procedure TRxDBGridPrint.DoShowFooter;
+var
+ FBand: TfrBandView;
+ FView: TfrMemoView;
+ i: Integer;
+begin
+ FBand := TfrBandView(frCreateObject(gtBand, '', FPage));
+ FBand.BandType := btMasterFooter;
+
+ FBand.SetBounds(FXPos, FYPos, 1000, 20);
+ FBand.Flags:=FBand.Flags or flStretched;
+// FPage.Objects.Add(FBand);
+
+ FView := frCreateObject(gtMemo, '', FPage) as TfrMemoView;
+ FView.SetBounds(FXPos, FYPos, 20, 20);
+
+ if rxpoShowFooterColor in FOptions then
+ FView.FillColor := RxDBGrid.FooterOptions.Color;
+
+// FView.Font.Assign(FTitleFont);
+ FView.Font.Size:=12;
+ FView.Frames:=frAllFrames;
+ FView.Layout:=tlTop;
+ FView.Memo.Add(Format('Footer', [i]));
+// FPage.Objects.Add(FView);
+
+ FYPos := FYPos + 22;
+end;
+
+procedure TRxDBGridPrint.OnPrintColumn(ColNo: Integer; var Width: Integer);
+begin
+ if (ColNo > 0) and (ColNo <= FRxColInfoList.Count) then
+ Width := TRxColInfo(FRxColInfoList[ColNo-1]).ColWidth;
+end;
+
+procedure TRxDBGridPrint.OnEnterRect(Memo: TStringList; View: TfrView);
+var
+ i, k: Integer;
+ F:TRxColInfo;
+ S: String;
+ C:TColor;
+ J: Integer;
+begin
+ i := FColumnDataset.RecNo;
+
+ if (i >= 0) and (i < FRxColInfoList.Count) then
+ begin
+ F:=TRxColInfo(FRxColInfoList[i]);
+ View.dx := F.ColWidth;
+
+ if Assigned(F.Col) and (Memo.Count>0) then
+ begin
+ S:=Memo[0];
+ if (S='[Cell]') and Assigned(F.Col.Field) then
+ begin
+ if rxpoShowGridColor in FOptions then
+ begin
+ C:=F.Col.Color;
+ if Assigned(RxDBGrid.OnGetCellProps) then
+ RxDBGrid.OnGetCellProps(RxDBGrid, F.Col.Field, TfrMemoView(View).Font, C);
+ TfrMemoView(View).FillColor:=C;
+ end;
+
+ S:=F.Col.Field.DisplayText;
+ if Assigned(F.Col) and (F.Col.KeyList.Count > 0) and (F.Col.PickList.Count > 0) then
+ begin
+ J := F.Col.KeyList.IndexOf(S);
+ if (J >= 0) and (J < F.Col.PickList.Count) then
+ S := F.Col.PickList[j];
+ end
+ else
+ if (rxpoHideZeroValues in FOptions) and Assigned(F.Col.Field) and (F.Col.Field.DataType in [ftSmallint, ftInteger, ftWord,
+ ftFloat, ftCurrency, ftLargeint]) and (F.Col.Field.AsFloat = 0) then
+ S:='';
+
+ Memo[0] := S;
+ TfrMemoView(View).Alignment:=F.Col.Alignment;
+ end else
+ if Copy(S, 1, 7) = 'Header_' then
+ begin
+ TfrMemoView(View).Alignment:=F.Col.Title.Alignment;
+ K:=StrToIntDef(Copy(S, 8, Length(S)), 0);
+ if TRxColumnTitle(F.Col.Title).CaptionLinesCount = 0 then
+ begin
+ S:=TRxColumnTitle(F.Col.Title).Caption;
+ if K = 0 then
+ Memo[0] := TRxColumnTitle(F.Col.Title).Caption
+ else
+ Memo[0] := '';
+ end
+ else
+ if Knil) and (AComponent=DataSource) then
+ DataSource:=nil;
+ end;
+end;
+
+procedure TCustomRxDBSpinEdit.WMSetFocus(var Message: TLMSetFocus);
+begin
+ inherited WMSetFocus(Message);
+ if not FDatalink.Editing then
+ FDatalink.Reset;
+end;
+
+procedure TCustomRxDBSpinEdit.WMKillFocus(var Message: TLMKillFocus);
+begin
+ inherited WMKillFocus(Message);
+ if not FDatalink.Editing then
+ FDatalink.Reset
+ else
+ TFieldDataLinkHack(FDatalink).UpdateData;
+end;
+
+constructor TCustomRxDBSpinEdit.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FDataLink := TFieldDataLink.Create;
+ FDataLink.Control := Self;
+ FDataLink.OnDataChange := @DataChange;
+ FDataLink.OnUpdateData := @UpdateData;
+ FDataLink.OnActiveChange := @ActiveChange;
+ {$if (lcl_major = 0) and (lcl_release <= 30)}
+ FDataLink.OnLayoutChange := @LayoutChange;
+ {$endif}
+end;
+
+destructor TCustomRxDBSpinEdit.Destroy;
+begin
+ FreeAndNil(FDataLink);
+ inherited Destroy;
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxdbtimeedit.pas b/components/rx/version/v2.2_laz_1.2/rxdbtimeedit.pas
new file mode 100644
index 000000000..71db8ed13
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxdbtimeedit.pas
@@ -0,0 +1,322 @@
+{ RxDBTimeEdit unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit RxDBTimeEdit;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
+ RxTimeEdit, DB, DbCtrls, LMessages, LCLType;
+
+type
+
+ { TCustomRxDBTimeEdit }
+
+ TCustomRxDBTimeEdit = class(TCustomRxTimeEdit)
+ private
+ FDataLink: TFieldDataLink;
+
+ procedure DataChange(Sender: TObject);
+ function GetDataField: string;
+ function GetDataSource: TDataSource;
+ function GetField: TField;
+ procedure SetDataField(const AValue: string);
+ procedure SetDataSource(const AValue: TDataSource);
+
+ procedure UpdateData(Sender: TObject);
+ procedure FocusRequest(Sender: TObject);
+ procedure ActiveChange(Sender: TObject);
+ procedure LayoutChange(Sender: TObject);
+ procedure CMGetDataLink(var Message: TLMessage); message CM_GETDATALINK;
+ function IsReadOnly: boolean;
+ procedure WMSetFocus(var Message: TLMSetFocus); message LM_SETFOCUS;
+ procedure WMKillFocus(var Message: TLMKillFocus); message LM_KILLFOCUS;
+ protected
+ function GetReadOnly: Boolean;override;
+ procedure SetReadOnly(AValue: Boolean);override;
+ property DataField: string read GetDataField write SetDataField;
+ property DataSource: TDataSource read GetDataSource write SetDataSource;
+ //property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
+ procedure KeyDown(var Key: Word; Shift: TShiftState); override;
+ procedure Change; override;
+
+ procedure Loaded; override;
+ procedure Notification(AComponent: TComponent;
+ Operation: TOperation); override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ property Field: TField read GetField;
+ end;
+
+ TRxDBTimeEdit = class(TCustomRxDBTimeEdit)
+ published
+ property DataField;
+ property DataSource;
+ property ReadOnly;
+
+ property AutoSize;
+ property AutoSelect;
+ property Align;
+ property Anchors;
+ property BorderSpacing;
+ property ButtonOnlyWhenFocused;
+ property ButtonHint;
+ property CharCase;
+ property Color;
+// property DirectInput;
+ property DragCursor;
+ property DragMode;
+ property EchoMode;
+ property Enabled;
+// property Flat;
+ property Font;
+// property Glyph;
+ property MaxLength;
+// property NumGlyphs;
+ property OnButtonClick;
+ property OnChange;
+ property OnClick;
+ property OnDblClick;
+ property OnDragDrop;
+ property OnDragOver;
+ property OnEditingDone;
+ property OnEndDrag;
+ property OnEnter;
+ property OnExit;
+ property OnKeyDown;
+ property OnKeyPress;
+ property OnKeyUp;
+ property OnMouseDown;
+ property OnMouseMove;
+ property OnMouseUp;
+ property OnMouseWheel;
+ property OnMouseWheelDown;
+ property OnMouseWheelUp;
+ property OnStartDrag;
+ property OnUTF8KeyPress;
+ property ParentColor;
+ property ParentFont;
+ property ParentShowHint;
+ property PasswordChar;
+ property PopupMenu;
+ property ShowHint;
+ property TabOrder;
+ property TabStop;
+ property Visible;
+ end;
+
+
+implementation
+uses dbutils, LCLVersion;
+
+type
+ TFieldDataLinkHack = class(TFieldDataLink)
+ end;
+
+{ TCustomRxDBTimeEdit }
+
+procedure TCustomRxDBTimeEdit.DataChange(Sender: TObject);
+begin
+ if Assigned(FDataLink.Field) and (FDataLink.Field.DataType in DataTimeTypes) then
+ Self.Time:=FDatalink.Field.AsDateTime
+ else
+ Text := '';
+end;
+
+function TCustomRxDBTimeEdit.GetDataField: string;
+begin
+ Result := FDataLink.FieldName;
+end;
+
+function TCustomRxDBTimeEdit.GetDataSource: TDataSource;
+begin
+ Result := FDataLink.DataSource;
+end;
+
+function TCustomRxDBTimeEdit.GetField: TField;
+begin
+ Result := FDataLink.Field;
+end;
+
+function TCustomRxDBTimeEdit.GetReadOnly: Boolean;
+begin
+ Result := FDataLink.ReadOnly;
+end;
+
+procedure TCustomRxDBTimeEdit.SetDataField(const AValue: string);
+begin
+ FDataLink.FieldName := AValue;
+end;
+
+procedure TCustomRxDBTimeEdit.SetDataSource(const AValue: TDataSource);
+begin
+ ChangeDataSource(Self,FDataLink,AValue);
+end;
+
+procedure TCustomRxDBTimeEdit.SetReadOnly(AValue: Boolean);
+begin
+ inherited SetReadOnly(AValue);
+ FDataLink.ReadOnly := AValue;
+end;
+
+procedure TCustomRxDBTimeEdit.UpdateData(Sender: TObject);
+begin
+ if Assigned(FDataLink.Field) and (FDataLink.Field.DataType in DataTimeTypes) then
+ begin
+ FDataLink.Field.AsDateTime := Self.Time;
+ end;
+end;
+
+procedure TCustomRxDBTimeEdit.FocusRequest(Sender: TObject);
+begin
+ SetFocus;
+end;
+
+procedure TCustomRxDBTimeEdit.ActiveChange(Sender: TObject);
+begin
+ if FDatalink.Active then
+ DataChange(Sender)
+ else
+ begin
+ Text := '';
+ FDataLink.Reset;
+ end;
+end;
+
+procedure TCustomRxDBTimeEdit.LayoutChange(Sender: TObject);
+begin
+ DataChange(Sender);
+end;
+
+procedure TCustomRxDBTimeEdit.CMGetDataLink(var Message: TLMessage);
+begin
+ Message.Result := PtrUInt(FDataLink);
+end;
+
+function TCustomRxDBTimeEdit.IsReadOnly: boolean;
+begin
+ result := true;
+ if FDatalink.Active and not Self.ReadOnly then
+ result := (Field=nil) or Field.ReadOnly;
+end;
+
+procedure TCustomRxDBTimeEdit.WMSetFocus(var Message: TLMSetFocus);
+begin
+ inherited WMSetFocus(Message);
+ if not FDatalink.Editing then
+ FDatalink.Reset;
+end;
+
+procedure TCustomRxDBTimeEdit.WMKillFocus(var Message: TLMKillFocus);
+begin
+ inherited WMKillFocus(Message);
+ if not FDatalink.Editing then
+ FDatalink.Reset
+ else
+ TFieldDataLinkHack(FDatalink).UpdateData;
+end;
+
+procedure TCustomRxDBTimeEdit.KeyDown(var Key: Word; Shift: TShiftState);
+begin
+ inherited KeyDown(Key, Shift);
+ if Key=VK_ESCAPE then
+ begin
+ //cancel out of editing by reset on esc
+ FDataLink.Reset;
+ SelectAll;
+ Key := VK_UNKNOWN;
+ end
+ else
+ if Key=VK_DELETE then
+ begin
+ if not IsReadOnly then
+ FDatalink.Edit;
+ end
+ else
+ if Key=VK_TAB then
+ begin
+ if FDataLink.CanModify and FDatalink.Editing then
+ FDataLink.UpdateRecord;
+ end;
+end;
+
+procedure TCustomRxDBTimeEdit.Change;
+begin
+ if Assigned(FDatalink) then
+ begin
+ FDatalink.Edit;
+ FDataLink.Modified;
+ end;
+ inherited Change;
+end;
+
+procedure TCustomRxDBTimeEdit.Loaded;
+begin
+ inherited Loaded;
+ if (csDesigning in ComponentState) then
+ DataChange(Self);
+end;
+
+procedure TCustomRxDBTimeEdit.Notification(AComponent: TComponent;
+ Operation: TOperation);
+begin
+ inherited Notification(AComponent, Operation);
+ if (Operation=opRemove) then
+ begin
+ if (FDataLink<>nil) and (AComponent=DataSource) then
+ DataSource:=nil;
+ end;
+end;
+
+constructor TCustomRxDBTimeEdit.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FDataLink := TFieldDataLink.Create;
+ FDataLink.Control := Self;
+ FDataLink.OnDataChange := @DataChange;
+ FDataLink.OnUpdateData := @UpdateData;
+ FDataLink.OnActiveChange := @ActiveChange;
+ {$if (lcl_major = 0) and (lcl_release <= 30)}
+ FDataLink.OnLayoutChange := @LayoutChange;
+ {$endif}
+end;
+
+destructor TCustomRxDBTimeEdit.Destroy;
+begin
+ FreeAndNil(FDataLink);
+ inherited Destroy;
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxdconst.pas b/components/rx/version/v2.2_laz_1.2/rxdconst.pas
new file mode 100644
index 000000000..ce7532990
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxdconst.pas
@@ -0,0 +1,230 @@
+{ string const unit fo DB-aware modules
+
+Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit rxdconst;
+
+interface
+
+
+resourcestring
+
+{ RxDBCtrl }
+
+ SLocalDatabase = 'Unable complete this operation on local dataset';
+ SRetryLogin = 'Retry to connect with database?';
+ SExprNotBoolean = 'Field ''%s'' is not boolean';
+ SExprBadNullTest = 'NULL-values enabled in ''='' and ''<>''';
+ SExprBadField = 'Field ''%s'' not used in filter expression';
+ SCaptureFilter = 'Control locked by filter';
+ SNotCaptureFilter = 'Control need locked by filter';
+ SInactiveData = 'inactive';
+ SBrowseData = 'browse';
+ SEditData = 'editing';
+ SInsertData = 'append';
+ SSetKeyData = 'find';
+ SCalcFieldsData = 'calc';
+ SRegistration = 'Register';
+ SAppTitleLabel = 'Application "%s"';
+ SHintLabel = 'Enter you user name and password';
+ SUserNameLabel = '&User name:';
+ SPasswordLabel = '&Password:';
+ SMore1 = '&More >>';
+ SMore2 = '&Less <<';
+ SInvalidUserName = 'User name or password not valid';
+ SChangePassword = 'Change password';
+ SOldPasswordLabel = '&Old password:';
+ SNewPasswordLabel = '&New password:';
+ SConfirmPasswordLabel = '&Confirm:';
+ SPasswordChanged = 'Password changed';
+ SPasswordNotChanged = 'Password not changed';
+ SPasswordsMismatch = 'New password and confirmation not equal';
+ SDBExceptCaption = 'Error in DB engine';
+ SServerErrorLabel = 'Server error';
+ SErrorMsgLabel = 'Error message';
+ SNextButton = '&Next';
+ SPrevButton = '&Prior';
+ SExprIncorrect = 'Error in filter expression';
+ SExprTermination = 'Error in filter end';
+ SExprNameError = 'Error in filed name';
+ SExprStringError = 'Error in string const';
+ SExprInvalidChar = 'Error symbol in expression: ''%s''';
+ SExprNoRParen = 'Error '')'', error: %s';
+ SExprExpected = 'Error %s';
+ SExprBadCompare = 'Compare opertion need fielad and const';
+ SConfirmSave = 'Data changed. Save?';
+ SDatabaseName = 'Database loocked: %s';
+ SUnlockCaption = 'Unloock';
+ SUnlockHint = 'Enter you password';
+ SDeleteMultipleRecords = 'Delete all selected records?';
+
+ SDBComboBoxFieldNotAssigned = '%s:TDBComboBox - DataField not assigned';
+
+ SPropDefByLookup = 'PropDefByLookup';
+ SDataSourceFixed = 'SDataSourceFixed';
+ SCircularDataLink = 'SCircularDataLink';
+ sRxAscendign = 'Ascendign';
+ sRxDescending = 'Descending';
+ sRxAllFields = 'All fields';
+ sRxFieldsLookupDisplay = 'Fields as LookupDisplay';
+ sRxFillFieldsLookupDisp = 'Fill fields in LookupDisplay property';
+ sRxSortFieldsDisplay = 'Fields as SortField';
+ sRxFillSortFieldsDisp = 'Fill fields in SortField property';
+
+
+ SDeleteRecordQuestion = 'Delete record?';
+ SFieldTypeMismatch = 'Type mismatch for field ''%s'', expecting: %s actual: %s';
+ SInvalidDate = 'Invalid Date';
+ SFieldRequired = 'Field ''%s'' must have a value';
+ SNotEditing = 'Dataset not in edit or insert mode';
+ SUnknownFieldType = 'SUnknownFieldType %s';
+ SFieldReadOnly = 'SFieldReadOnly %s';
+
+ //RXDBgrid
+ sRxDBGridFind = 'Find data'; //// 'Buscar Ctrl+F';
+ sRxDBGridFilter = 'Filter data';//'Filtrar Ctrl+T';
+ sRxDBGridFilterSimple = 'Filter in table';// Ctrl+E'; 'Filtrar en Encabezado Ctrl+E';
+ sRxDBGridFilterClear = 'Clear filter';// Ctrl+Q';'Quitar Filtro Ctrl+Q';
+ sRxDBGridSortByColumns = 'Sort data for collumns';// Ctrl+C';'Ordenar por Columnas Ctrl+C';
+ sRxDBGridSelectColumns = 'Select visible collumns';// Ctrl+W';'Seleccionar Columnas Ctrl+W';
+ sRxDBGridEmptiFilter = '(Empty)';
+ sRxDBGridSelectAllRows = 'Select all rows';// Ctrl+W';'Seleccionar Columnas Ctrl+W';
+ sRxDBGridCopyCellValue = 'Copy cell value';// Ctrl+W';'Seleccionar Columnas Ctrl+W';
+
+ //RxDBGrid filter form
+ sRxFilterFormSelectExp = 'Enter filter expression for data in table:';
+ sRxFilterFormOnField = 'On field :';
+ sRxFilterFormOperaion = 'Operation :';
+ sRxFilterFormCondition = 'Condition :';
+ sRxFilterFormOperand = 'Operand :';
+ sRxFilterFormEnd = 'end.';
+ sRxFilterFormClear = 'Clear filter';
+ sRxFilterFormCancel = 'Cancel';
+ sRxFilterFormApply = 'Apply';
+ sRxFilterFormCaption = 'Filter conditions';
+
+ //TrxSortByForm
+ sRxSortByFormCaption = 'Sort on field';
+ sRxSortByFormAllFields = '&Fields in dataset:';
+ sRxSortByFormSortFields = '&Selected fields:';
+ sRxSortByFormSortOrder = 'Select f&ield for sort data:';
+ sRxSortByFormAddField = '&Add field';
+ sRxSortByFormRemoveField = '&Remove';
+ sRxSortByFormMoveUpField = '&Up';
+ sRxSortByFormMoveDnField = '&Down';
+ sRxSortByFormCaseInsens = '&Case insensitive sort';
+
+ //TRxMemoryData
+ SMemNoRecords = 'No data found';
+ SInvalidFields = 'No fields defined';
+
+ //TrxDBGridFindForm
+ sRxDbGridFindCaption = 'Find data';
+ sRxDbGridFindText = 'Text to find';
+ sRxDbGridFindOnField = 'Find on field';
+ sRxDbGridFindCaseSens = 'Case sensetive';
+ sRxDbGridFindPartial = 'Partial key';
+ sRxDbGridFindDirecion = 'Direction';
+ sRxDbGridFindRangeAll = 'All';
+ sRxDbGridFindRangeForw = 'Forward';
+ sRxDbGridFindRangeBack = 'Backward';
+ sRxFindMore = 'Find more';
+
+ //TrxDBGridColumsForm
+ sRxDbGridSelColCaption = 'Grid columns';
+ sRxDbGridSelColHint1 = 'Move selected column up';
+ sRxDbGridSelColHint2 = 'Move selected column down';
+ sRxDbGridSelApplyCaption = 'Apply';
+ sRxDbGridSelApplyHint = 'Apply current columns setings';
+
+ //seldsfrm
+ sRxBorrowStructure = 'Borrow structure...';
+ sRxSelectDatasetStruct = 'Select dataset to copy to';
+ sRxCopyOnlyMetadata = 'Copy only metadata';
+ sRxSourseDataset = 'Sourse dataset';
+
+ sUnknownXMLDatasetFormat = 'Unknown XML Dataset format';
+
+ sToolsExportSpeadSheet = 'Export to speadsheet';
+ sExportFileName = 'Export file name';
+ sOpenAfterExport = 'Open after export';
+ sPageName = 'Page name';
+ sExportColumnHeader = 'Export column header';
+ sExportColumnFooter = 'Export column footer';
+ sExportCellColors = 'Export cell colors';
+ sOverwriteExisting = 'Overwrite existing';
+ sShowColumnHeaderOnAllPage = 'Show column header on all page';
+ sPageMargins = 'Page margins';
+ sLeftCaption = 'Left';
+ sTopCaption = 'Top';
+ sRightCaption = 'Right';
+ sBottomCaption = 'Bottom';
+ sReportTitle = 'Report title';
+ sOrientation = 'Orientation';
+ sPortrait = 'Portrait';
+ sLandscape = 'Landscape';
+ sPrintOptions = 'Print options';
+
+ sShowTitle = 'Show column title';
+ sShowFooter = 'Show footer';
+ sShowFooterColor = 'Show footer color';
+ sShowGridColor = 'Show grid color';
+ sShowReportTitle = 'Show report title';
+ sPrintGrid = 'Print grid';
+ sHideZeroValues = 'Hide zero values';
+
+
+
+
+const
+ { The following strings should not be localized }
+ sAction = '.Action';
+ sCount = '.Count';
+ sVisible = '.Visible';
+ sItem = '.Item';
+ sWidth = '.Width';
+ sTop = '.Top';
+ sVersion = '.Version';
+ sLeft = '.Left';
+ sShowHint = '.ShowHint';
+ sShowCaption = '.ShowCaption';
+ sToolBarStyle = '.ToolBarStyle';
+ sButtonAllign = '.ButtonAllign';
+ sOptions = '.Options';
+ sCaption = '.Caption';
+ sIndex = '.Index';
+ sSortMarker = '.SortMarker';
+ sSortField = '.SortField';
+
+
+implementation
+
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxdice.inc b/components/rx/version/v2.2_laz_1.2/rxdice.inc
new file mode 100644
index 000000000..971c307a5
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxdice.inc
@@ -0,0 +1,431 @@
+type
+ TRxDiceBitmap = array [0..68] of PChar;
+
+const
+ DICE1 : TRxDiceBitmap = (
+'64 64 4 1',
+'. c None',
+'# c #000000',
+'b c #c0c0c0',
+'a c #ffffff',
+'................................................................',
+'.............................######.............................',
+'...........................##########...........................',
+'.........................####aaaaaa####.........................',
+'.......................####aaaaaaaaaa####.......................',
+'.....................####aaaaaaaaaaaaaa####.....................',
+'...................####aaaaaaaaaaaaaaaaaa####...................',
+'.................####aaaaaaaaaaaaaaaaaaaaaa####.................',
+'...............####aaaaaaaaaaaaaaaaaaaaaaaaaa####...............',
+'.............####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.............',
+'...........####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####...........',
+'.........####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.........',
+'.......####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.......',
+'.....####aaaaaaaaaaaaaaaaaaaaa####aaaaaaaaaaaaaaaaaaaaa####.....',
+'...####aaaaaaaaaaaaaaaaaaaaa########aaaaaaaaaaaaaaaaaaaaa####...',
+'.####aaaaaaaaaaaaaaaaaaaaaa##########aaaaaaaaaaaaaaaaaaaaaa####.',
+'#####aaaaaaaaaaaaaaaaaaaaaa##########aaaaaaaaaaaaaaaaaaaaaa#####',
+'##b####aaaaaaaaaaaaaaaaaaaaa########aaaaaaaaaaaaaaaaaaaaa####a##',
+'##bbb####aaaaaaaaaaaaaaaaaaaaa####aaaaaaaaaaaaaaaaaaaaa####aaa##',
+'##bbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaa##',
+'##bbbbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaaaa##',
+'##bbbbbbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaaaaaa##',
+'##bbbbbbbbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaa###aaaa##',
+'##bbbbbbbbbbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaa####aaaa######aaa##',
+'##bbbbbbbbbbbbbbb####aaaaaaaaaaaaaaaaaaaaaa####aaaaaa######aaa##',
+'##bbbbbbbbbbbbbbbbb####aaaaaaaaaaaaaaaaaa####aaaaaaa#######aaa##',
+'##bbbbbbbbbbbbbbbbbbb####aaaaaaaaaaaaaa####aaaaaaaaa#######aaa##',
+'##bbbbbbbbbbbbbbbbbbbbb####aaaaaaaaaa####aaaaaaaaaaa#######aaa##',
+'##bbbbbbbbbbbbbbbbbbbbbbb####aaaaaa####aaaaaaaaaaaaa######aaaa##',
+'##bbbbbbbbbbbbbbbbbbbbbbbbb####aa####aaaaaaaaaaaaaaaa####aaaaa##',
+'##bbbbbbbbbbbbbbbbbbbb###bbbb######aaaa###aaaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbbbbbbbbbb######bbbb##aaaa######aaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbbbbbbbbbb######bbbb##aaaa######aaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbbbbbbbbbb#######bbb##aaa#######aaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbbbbbbbbbb#######bbb##aaa#######aaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbbb###bbbb#######bbb##aaa#######aaaa###aaaaaaaaaaaa##',
+'##bbbbbbbbbbb######bbb######bbb##aaa######aaa######aaaaaaaaaaa##',
+'##bbbbbbbbbbb######bbbb####bbbb##aaaa####aaaa######aaaaaaaaaaa##',
+'##bbbbbbbbbbb#######bbbbbbbbbbb##aaaaaaaaaaa#######aaaaaaaaaaa##',
+'##bbbbbbbbbbb#######bbbbbbbbbbb##aaaaaaaaaaa#######aaaaaaaaaaa##',
+'##bbbb###bbbb#######bbbbbbbbbbb##aaaaaaaaaaa#######aaaa###aaaa##',
+'##bbb######bbb######bbbbbbbbbbb##aaaaaaaaaaa######aaa######aaa##',
+'##bbb######bbbb####bbbbbbbbbbbb##aaaaaaaaaaaa####aaaa######aaa##',
+'##bbb#######bbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaa#######aaa##',
+'##bbb#######bbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaa#######aaa##',
+'##bbb#######bbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaa#######aaa##',
+'##bbbb######bbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaa######aaaa##',
+'###bbbb####bbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaa####aaaa###',
+'.####bbbbbbbbbbbbbbbbbbbbbbbbbb##aaaaaa###aaaaaaaaaaaaaaaaa####.',
+'...####bbbbbbbbbbbbbbbbbbbbbbbb##aaaa######aaaaaaaaaaaaaa####...',
+'.....####bbbbbbbbbbbbbbbbbbbbbb##aaaa######aaaaaaaaaaaa####.....',
+'.......####bbbbbbbbbbbbbbbbbbbb##aaa#######aaaaaaaaaa####.......',
+'.........####bbbbbbbbbbbbbbbbbb##aaa#######aaaaaaaa####.........',
+'...........####bbbbbbbbbbbbbbbb##aaa#######aaaaaa####...........',
+'.............####bbbbbbbbbbbbbb##aaa######aaaaa####.............',
+'...............####bbbbbbbbbbbb##aaaa####aaaa####...............',
+'.................####bbbbbbbbbb##aaaaaaaaaa####.................',
+'...................####bbbbbbbb##aaaaaaaa####...................',
+'.....................####bbbbbb##aaaaaa####.....................',
+'.......................####bbbb##aaaa####.......................',
+'.........................####bb##aa####.........................',
+'...........................##########...........................',
+'..............................####..............................',
+'................................................................');
+
+
+ DICE2 : TRxDiceBitmap = (
+'64 64 4 1',
+'. c None',
+'# c #000000',
+'b c #c0c0c0',
+'a c #ffffff',
+'................................................................',
+'.............................######.............................',
+'...........................##########...........................',
+'.........................####aaaaaa####.........................',
+'.......................####aaaaaaaaaa####.......................',
+'.....................####aaaaa####aaaaa####.....................',
+'...................####aaaaa########aaaaa####...................',
+'.................####aaaaaa##########aaaaaa####.................',
+'...............####aaaaaaaa##########aaaaaaaa####...............',
+'.............####aaaaaaaaaaa########aaaaaaaaaaa####.............',
+'...........####aaaaaaaaaaaaaaa####aaaaaaaaaaaaaaa####...........',
+'.........####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.........',
+'.......####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.......',
+'.....####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.....',
+'...####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####...',
+'.####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.',
+'#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####',
+'##b####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####a##',
+'##bbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaa##',
+'##bbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaa##',
+'##bbbbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaaaa##',
+'##bbbbbbbbb####aaaaaaaaaaaaaaa####aaaaaaaaaaaaaaa####aaaaaaaaa##',
+'##bbbbbbbbbbb####aaaaaaaaaaa########aaaaaaaaaaa####aaaa###aaaa##',
+'##bbbbbbbbbbbbb####aaaaaaaa##########aaaaaaaa####aaaa######aaa##',
+'##bbbbbbbbbbbbbbb####aaaaaa##########aaaaaa####aaaaaa######aaa##',
+'##bbbbbbbbbbbbbbbbb####aaaaa########aaaaa####aaaaaaa#######aaa##',
+'##bbbbbbbbbbbbbbbbbbb####aaaaa####aaaaa####aaaaaaaaa#######aaa##',
+'##bbbbbbbbbbbbbbbbbbbbb####aaaaaaaaaa####aaaaaaaaaaa#######aaa##',
+'##bbbbbbbbbbbbbbbbbbbbbbb####aaaaaa####aaaaaaaaaaaaa######aaaa##',
+'##bbbbbbbbbbbbbbbbbbbbbbbbb####aa####aaaaaaaaaaaaaaaa####aaaaa##',
+'##bbbbbbbbbbbbbbbbbbbbbbbbbbb######aaaa###aaaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaaa######aaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaaa######aaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaa#######aaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaa#######aaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbbb###bbbbbbbbbbbbbb##aaa#######aaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbb######bbbbbbbbbbbb##aaa######aaaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbb######bbbbbbbbbbbb##aaaa####aaaaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbb#######bbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbb#######bbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbb#######bbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaa###aaaa##',
+'##bbbbbbbbbbbb######bbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaa######aaa##',
+'##bbbbbbbbbbbbb####bbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaa######aaa##',
+'##bbbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaa#######aaa##',
+'##bbbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaa#######aaa##',
+'##bbbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaa#######aaa##',
+'##bbbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaa######aaaa##',
+'###bbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaa####aaaa###',
+'.####bbbbbbbbbbbbbbbbbbbbbbbbbb##aaaaaa###aaaaaaaaaaaaaaaaa####.',
+'...####bbbbbbbbbbbbbbbbbbbbbbbb##aaaa######aaaaaaaaaaaaaa####...',
+'.....####bbbbbbbbbbbbbbbbbbbbbb##aaaa######aaaaaaaaaaaa####.....',
+'.......####bbbbbbbbbbbbbbbbbbbb##aaa#######aaaaaaaaaa####.......',
+'.........####bbbbbbbbbbbbbbbbbb##aaa#######aaaaaaaa####.........',
+'...........####bbbbbbbbbbbbbbbb##aaa#######aaaaaa####...........',
+'.............####bbbbbbbbbbbbbb##aaa######aaaaa####.............',
+'...............####bbbbbbbbbbbb##aaaa####aaaa####...............',
+'.................####bbbbbbbbbb##aaaaaaaaaa####.................',
+'...................####bbbbbbbb##aaaaaaaa####...................',
+'.....................####bbbbbb##aaaaaa####.....................',
+'.......................####bbbb##aaaa####.......................',
+'.........................####bb##aa####.........................',
+'...........................##########...........................',
+'..............................####..............................',
+'................................................................');
+
+ DICE3 : TRxDiceBitmap = (
+'64 64 4 1',
+'. c None',
+'# c #000000',
+'b c #c0c0c0',
+'a c #ffffff',
+'................................................................',
+'.............................######.............................',
+'...........................##########...........................',
+'.........................####aaaaaa####.........................',
+'.......................####aaaaaaaaaa####.......................',
+'.....................####aaaaa####aaaaa####.....................',
+'...................####aaaaa########aaaaa####...................',
+'.................####aaaaaa##########aaaaaa####.................',
+'...............####aaaaaaaa##########aaaaaaaa####...............',
+'.............####aaaaaaaaaaa########aaaaaaaaaaa####.............',
+'...........####aaaaaaaaaaaaaaa####aaaaaaaaaaaaaaa####...........',
+'.........####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.........',
+'.......####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.......',
+'.....####aaaaaaaaaaaaaaaaaaaaa####aaaaaaaaaaaaaaaaaaaaa####.....',
+'...####aaaaaaaaaaaaaaaaaaaaa########aaaaaaaaaaaaaaaaaaaaa####...',
+'.####aaaaaaaaaaaaaaaaaaaaaa##########aaaaaaaaaaaaaaaaaaaaaa####.',
+'#####aaaaaaaaaaaaaaaaaaaaaa##########aaaaaaaaaaaaaaaaaaaaaa#####',
+'##b####aaaaaaaaaaaaaaaaaaaaa########aaaaaaaaaaaaaaaaaaaaa####a##',
+'##bbb####aaaaaaaaaaaaaaaaaaaaa####aaaaaaaaaaaaaaaaaaaaa####aaa##',
+'##bbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaa##',
+'##bbbbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaaaa##',
+'##bbbbbbbbb####aaaaaaaaaaaaaaa####aaaaaaaaaaaaaaa####aaaaaaaaa##',
+'##bbbbbbbbbbb####aaaaaaaaaaa########aaaaaaaaaaa####aaaa###aaaa##',
+'##bbbbbbbbbbbbb####aaaaaaaa##########aaaaaaaa####aaaa######aaa##',
+'##bbbbbbbbbbbbbbb####aaaaaa##########aaaaaa####aaaaaa######aaa##',
+'##bbbbbbbbbbbbbbbbb####aaaaa########aaaaa####aaaaaaa#######aaa##',
+'##bbbbbbbbbbbbbbbbbbb####aaaaa####aaaaa####aaaaaaaaa#######aaa##',
+'##bbbbbbbbbbbbbbbbbbbbb####aaaaaaaaaa####aaaaaaaaaaa#######aaa##',
+'##bbbbbbbbbbbbbbbbbbbbbbb####aaaaaa####aaaaaaaaaaaaa######aaaa##',
+'##bbbbbbbbbbbbbbbbbbbbbbbbb####aa####aaaaaaaaaaaaaaaa####aaaaa##',
+'##bbbbbbbbbbbbbbbbbbbb###bbbb######aaaa###aaaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbbbbbbbbbb######bbbb##aaaa######aaaaaaaaaaaa###aaaa##',
+'##bbbbbbbbbbbbbbbbbbb######bbbb##aaaa######aaaaaaaaaa######aaa##',
+'##bbbbbbbbbbbbbbbbbbb#######bbb##aaa#######aaaaaaaaaa######aaa##',
+'##bbbbbbbbbbbbbbbbbbb#######bbb##aaa#######aaaaaaaaa#######aaa##',
+'##bbbbbbbbbbbbbbbbbbb#######bbb##aaa#######aaaaaaaaa#######aaa##',
+'##bbbbbbbbbbbbbbbbbbbb######bbb##aaa######aaaaaaaaaa#######aaa##',
+'##bbbbbbbbbbbbbbbbbbbbb####bbbb##aaaa####aaaaaaaaaaa######aaaa##',
+'##bbbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaa####aaaaa##',
+'##bbbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaaaaa###aaaaaaaaaaaaaaaaaaaa##',
+'##bbbb###bbbbbbbbbbbbbbbbbbbbbb##aaaa######aaaaaaaaaaaa###aaaa##',
+'##bbb######bbbbbbbbbbbbbbbbbbbb##aaaa######aaaaaaaaaa######aaa##',
+'##bbb######bbbbbbbbbbbbbbbbbbbb##aaa#######aaaaaaaaaa######aaa##',
+'##bbb#######bbbbbbbbbbbbbbbbbbb##aaa#######aaaaaaaaa#######aaa##',
+'##bbb#######bbbbbbbbbbbbbbbbbbb##aaa#######aaaaaaaaa#######aaa##',
+'##bbb#######bbbbbbbbbbbbbbbbbbb##aaa######aaaaaaaaaa#######aaa##',
+'##bbbb######bbbbbbbbbbbbbbbbbbb##aaaa####aaaaaaaaaaa######aaaa##',
+'###bbbb####bbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaa####aaaa###',
+'.####bbbbbbbbbbbbbbbbbbbbbbbbbb##aaaaaa###aaaaaaaaaaaaaaaaa####.',
+'...####bbbbbbbbbbbbbbbbbbbbbbbb##aaaa######aaaaaaaaaaaaaa####...',
+'.....####bbbbbbbbbbbbbbbbbbbbbb##aaaa######aaaaaaaaaaaa####.....',
+'.......####bbbbbbbbbbbbbbbbbbbb##aaa#######aaaaaaaaaa####.......',
+'.........####bbbbbbbbbbbbbbbbbb##aaa#######aaaaaaaa####.........',
+'...........####bbbbbbbbbbbbbbbb##aaa#######aaaaaa####...........',
+'.............####bbbbbbbbbbbbbb##aaa######aaaaa####.............',
+'...............####bbbbbbbbbbbb##aaaa####aaaa####...............',
+'.................####bbbbbbbbbb##aaaaaaaaaa####.................',
+'...................####bbbbbbbb##aaaaaaaa####...................',
+'.....................####bbbbbb##aaaaaa####.....................',
+'.......................####bbbb##aaaa####.......................',
+'.........................####bb##aa####.........................',
+'...........................##########...........................',
+'..............................####..............................',
+'................................................................');
+
+
+ DICE4 : TRxDiceBitmap = (
+'64 64 4 1',
+'. c None',
+'# c #000000',
+'b c #c0c0c0',
+'a c #ffffff',
+'................................................................',
+'.............................######.............................',
+'...........................##########...........................',
+'.........................####aaaaaa####.........................',
+'.......................####aaaaaaaaaa####.......................',
+'.....................####aaaaa####aaaaa####.....................',
+'...................####aaaaa########aaaaa####...................',
+'.................####aaaaaa##########aaaaaa####.................',
+'...............####aaaaaaaa##########aaaaaaaa####...............',
+'.............####aaaaaaaaaaa########aaaaaaaaaaa####.............',
+'...........####aaaaaaaaaaaaaaa####aaaaaaaaaaaaaaa####...........',
+'.........####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.........',
+'.......####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.......',
+'.....####aaaaa####aaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaa####.....',
+'...####aaaaa########aaaaaaaaaaaaaaaaaaaaaaaa########aaaaa####...',
+'.####aaaaaa##########aaaaaaaaaaaaaaaaaaaaaa##########aaaaaa####.',
+'#####aaaaaa##########aaaaaaaaaaaaaaaaaaaaaa##########aaaaaa#####',
+'##b####aaaaa########aaaaaaaaaaaaaaaaaaaaaaaa########aaaaa####a##',
+'##bbb####aaaaa####aaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaa####aaa##',
+'##bbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaa##',
+'##bbbbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaaaa##',
+'##bbbbbbbbb####aaaaaaaaaaaaaaa####aaaaaaaaaaaaaaa####aaaaaaaaa##',
+'##bbbb###bbbb####aaaaaaaaaaa########aaaaaaaaaaa####aaaa###aaaa##',
+'##bbb######bbbb####aaaaaaaa##########aaaaaaaa####aaaa######aaa##',
+'##bbb######bbbbbb####aaaaaa##########aaaaaa####aaaaaa######aaa##',
+'##bbb#######bbbbbbb####aaaaa########aaaaa####aaaaaaa#######aaa##',
+'##bbb#######bbbbbbbbb####aaaaa####aaaaa####aaaaaaaaa#######aaa##',
+'##bbb#######bbbbbbbbbbb####aaaaaaaaaa####aaaaaaaaaaa#######aaa##',
+'##bbbb######bbbbbbbbbbbbb####aaaaaa####aaaaaaaaaaaaa######aaaa##',
+'##bbbbb####bbbbbbbbbbbbbbbb####aa####aaaaaaaaaaaaaaaa####aaaaa##',
+'##bbbbbbbbbbbbbbbbbbbb###bbbb######aaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbbb###bbbbbbbbbbbb######bbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbb######bbbbbbbbbb######bbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbb######bbbbbbbbbb#######bbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbb#######bbbbbbbbb#######bbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbb#######bbbbbbbbb#######bbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbb#######bbbbbbbbbb######bbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbbb######bbbbbbbbbbb####bbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbbbb####bbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbbbbbbbbbbb###bbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbbb###bbbbbbbbbbbb######bbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbb######bbbbbbbbbb######bbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbb######bbbbbbbbbb#######bbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbb#######bbbbbbbbb#######bbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbb#######bbbbbbbbb#######bbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbb#######bbbbbbbbbb######bbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbbb######bbbbbbbbbbb####bbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'###bbbb####bbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaa###',
+'.####bbbbbbbbbbbbbbbbb###bbbbbb##aaaaaa###aaaaaaaaaaaaaaaaa####.',
+'...####bbbbbbbbbbbbbb######bbbb##aaaa######aaaaaaaaaaaaaa####...',
+'.....####bbbbbbbbbbbb######bbbb##aaaa######aaaaaaaaaaaa####.....',
+'.......####bbbbbbbbbb#######bbb##aaa#######aaaaaaaaaa####.......',
+'.........####bbbbbbbb#######bbb##aaa#######aaaaaaaa####.........',
+'...........####bbbbbb#######bbb##aaa#######aaaaaa####...........',
+'.............####bbbbb######bbb##aaa######aaaaa####.............',
+'...............####bbbb####bbbb##aaaa####aaaa####...............',
+'.................####bbbbbbbbbb##aaaaaaaaaa####.................',
+'...................####bbbbbbbb##aaaaaaaa####...................',
+'.....................####bbbbbb##aaaaaa####.....................',
+'.......................####bbbb##aaaa####.......................',
+'.........................####bb##aa####.........................',
+'...........................##########...........................',
+'..............................####..............................',
+'................................................................');
+
+ DICE5 : TRxDiceBitmap = (
+'64 64 4 1',
+'. c None',
+'# c #000000',
+'b c #c0c0c0',
+'a c #ffffff',
+'................................................................',
+'.............................######.............................',
+'...........................##########...........................',
+'.........................####aaaaaa####.........................',
+'.......................####aaaaaaaaaa####.......................',
+'.....................####aaaaa####aaaaa####.....................',
+'...................####aaaaa########aaaaa####...................',
+'.................####aaaaaa##########aaaaaa####.................',
+'...............####aaaaaaaa##########aaaaaaaa####...............',
+'.............####aaaaaaaaaaa########aaaaaaaaaaa####.............',
+'...........####aaaaaaaaaaaaaaa####aaaaaaaaaaaaaaa####...........',
+'.........####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.........',
+'.......####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.......',
+'.....####aaaaa####aaaaaaaaaaaa####aaaaaaaaaaaa####aaaaa####.....',
+'...####aaaaa########aaaaaaaa########aaaaaaaa########aaaaa####...',
+'.####aaaaaa##########aaaaaa##########aaaaaa##########aaaaaa####.',
+'#####aaaaaa##########aaaaaa##########aaaaaa##########aaaaaa#####',
+'##b####aaaaa########aaaaaaaa########aaaaaaaa########aaaaa####a##',
+'##bbb####aaaaa####aaaaaaaaaaaa####aaaaaaaaaaaa####aaaaa####aaa##',
+'##bbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaa##',
+'##bbbbbbb####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaaaa##',
+'##bbbbbbbbb####aaaaaaaaaaaaaaa####aaaaaaaaaaaaaaa####aaaaaaaaa##',
+'##bbbb###bbbb####aaaaaaaaaaa########aaaaaaaaaaa####aaaaaaaaaaa##',
+'##bbb######bbbb####aaaaaaaa##########aaaaaaaa####aaaaaaaaaaaaa##',
+'##bbb######bbbbbb####aaaaaa##########aaaaaa####aaaaaaaaaaaaaaa##',
+'##bbb#######bbbbbbb####aaaaa########aaaaa####aaaaaaaaaaaaaaaaa##',
+'##bbb#######bbbbbbbbb####aaaaa####aaaaa####aaaaaaaaaaaaaaaaaaa##',
+'##bbb#######bbbbbbbbbbb####aaaaaaaaaa####aaaaaaaaaaaaaaaaaaaaa##',
+'##bbbb######bbbbbbbbbbbbb####aaaaaa####aaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbbbb####bbbbbbbbbbbbbbbb####aa####aaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbbbbbbbbbbb###bbbb######aaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbbbbbbbbbb######bbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbbbbbbbbbb######bbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbbbbbbbbbb#######bbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbbbbbbbbbb#######bbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbbbbbbbbbb#######bbb##aaaaaaaaaaaaaa###aaaaaaaaaaaa##',
+'##bbbbbbbbbbbbbbbbbbbb######bbb##aaaaaaaaaaaa######aaaaaaaaaaa##',
+'##bbbbbbbbbbbbbbbbbbbbb####bbbb##aaaaaaaaaaaa######aaaaaaaaaaa##',
+'##bbbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaa#######aaaaaaaaaaa##',
+'##bbbbbbbbbbbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaa#######aaaaaaaaaaa##',
+'##bbbb###bbbbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaa#######aaaaaaaaaaa##',
+'##bbb######bbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaa######aaaaaaaaaaaa##',
+'##bbb######bbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaa####aaaaaaaaaaaaa##',
+'##bbb#######bbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbb#######bbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbb#######bbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbbb######bbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'###bbbb####bbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaa###',
+'.####bbbbbbbbbbbbbbbbb###bbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaa####.',
+'...####bbbbbbbbbbbbbb######bbbb##aaaaaaaaaaaaaaaaaaaaaaaa####...',
+'.....####bbbbbbbbbbbb######bbbb##aaaaaaaaaaaaaaaaaaaaaa####.....',
+'.......####bbbbbbbbbb#######bbb##aaaaaaaaaaaaaaaaaaaa####.......',
+'.........####bbbbbbbb#######bbb##aaaaaaaaaaaaaaaaaa####.........',
+'...........####bbbbbb#######bbb##aaaaaaaaaaaaaaaa####...........',
+'.............####bbbbb######bbb##aaaaaaaaaaaaaa####.............',
+'...............####bbbb####bbbb##aaaaaaaaaaaa####...............',
+'.................####bbbbbbbbbb##aaaaaaaaaa####.................',
+'...................####bbbbbbbb##aaaaaaaa####...................',
+'.....................####bbbbbb##aaaaaa####.....................',
+'.......................####bbbb##aaaa####.......................',
+'.........................####bb##aa####.........................',
+'...........................##########...........................',
+'..............................####..............................',
+'................................................................');
+
+ DICE6 : TRxDiceBitmap = (
+'64 64 4 1',
+'. c None',
+'# c #000000',
+'b c #c0c0c0',
+'a c #ffffff',
+'................................................................',
+'.............................######.............................',
+'...........................##########...........................',
+'.........................####aaaaaa####.........................',
+'.......................####aaaaaaaaaa####.......................',
+'.....................####aaaaa####aaaaa####.....................',
+'...................####aaaaa########aaaaa####...................',
+'.................####aaaaaa##########aaaaaa####.................',
+'...............####aaaaaaaa##########aaaaaaaa####...............',
+'.............####aaaaaaaaaaa########aa####aaaaa####.............',
+'...........####aaaaaaaaaaaaaaa####aa########aaaaa####...........',
+'.........####aaaaaaaaaaaaaaaaaaaaaa##########aaaaaa####.........',
+'.......####aaaaaaaaaaaaaaaaaaaaaaaa##########aaaaaaaa####.......',
+'.....####aaaaa####aaaaaaaaaaaaaaaaaa########aa####aaaaa####.....',
+'...####aaaaa########aaaaaaaaaaaaaaaaaa####aa########aaaaa####...',
+'.####aaaaaa##########aaaaaaaaaaaaaaaaaaaaaa##########aaaaaa####.',
+'#####aaaaaa##########aaaaaaaaaaaaaaaaaaaaaa##########aaaaaa#####',
+'##b####aaaaa########aa####aaaaaaaaaaaaaaaaaa########aaaaa####a##',
+'##bbb####aaaaa####aa########aaaaaaaaaaaaaaaaaa####aaaaa####aaa##',
+'##bbbbb####aaaaaaaa##########aaaaaaaaaaaaaaaaaaaaaaaa####aaaaa##',
+'##bbbbbbb####aaaaaa##########aaaaaaaaaaaaaaaaaaaaaa####aaaaaaa##',
+'##bbbbbbbbb####aaaaa########aa####aaaaaaaaaaaaaaa####aaaaaaaaa##',
+'##bbbb###bbbb####aaaaa####aa########aaaaaaaaaaa####aaaa###aaaa##',
+'##bbb######bbbb####aaaaaaaa##########aaaaaaaa####aaaa######aaa##',
+'##bbb######bbbbbb####aaaaaa##########aaaaaa####aaaaaa######aaa##',
+'##bbb#######bbbbbbb####aaaaa########aaaaa####aaaaaaa#######aaa##',
+'##bbb#######bbbbbbbbb####aaaaa####aaaaa####aaaaaaaaa#######aaa##',
+'##bbb#######bbbbbbbbbbb####aaaaaaaaaa####aaaaaaaaaaa#######aaa##',
+'##bbbb######bbbbbbbbbbbbb####aaaaaa####aaaaaaaaaaaaa######aaaa##',
+'##bbbbb####bbbbbbbbbbbbbbbb####aa####aaaaaaaaaaaaaaaa####aaaaa##',
+'##bbbbbbbbbbbbbbbbbbbb###bbbb######aaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbbbbbbbbbb######bbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbbbbbbbbbb######bbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbbbbbbbbbb#######bbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbbbbbbbbbb#######bbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbbbbbbbbbbb###bbbb#######bbb##aaaaaaaaaaaaaa###aaaaaaaaaaaa##',
+'##bbbbbbbbbbb######bbb######bbb##aaaaaaaaaaaa######aaaaaaaaaaa##',
+'##bbbbbbbbbbb######bbbb####bbbb##aaaaaaaaaaaa######aaaaaaaaaaa##',
+'##bbbbbbbbbbb#######bbbbbbbbbbb##aaaaaaaaaaa#######aaaaaaaaaaa##',
+'##bbbbbbbbbbb#######bbbbbbbbbbb##aaaaaaaaaaa#######aaaaaaaaaaa##',
+'##bbbb###bbbb#######bbbbbbbbbbb##aaaaaaaaaaa#######aaaaaaaaaaa##',
+'##bbb######bbb######bbbbbbbbbbb##aaaaaaaaaaa######aaaaaaaaaaaa##',
+'##bbb######bbbb####bbbbbbbbbbbb##aaaaaaaaaaaa####aaaaaaaaaaaaa##',
+'##bbb#######bbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbb#######bbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbb#######bbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'##bbbb######bbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##',
+'###bbbb####bbbbbbbbbbbbbbbbbbbb##aaaaaaaaaaaaaaaaaaaaaaaaaaaa###',
+'.####bbbbbbbbbbbbbbbbb###bbbbbb##aaaaaa###aaaaaaaaaaaaaaaaa####.',
+'...####bbbbbbbbbbbbbb######bbbb##aaaa######aaaaaaaaaaaaaa####...',
+'.....####bbbbbbbbbbbb######bbbb##aaaa######aaaaaaaaaaaa####.....',
+'.......####bbbbbbbbbb#######bbb##aaa#######aaaaaaaaaa####.......',
+'.........####bbbbbbbb#######bbb##aaa#######aaaaaaaa####.........',
+'...........####bbbbbb#######bbb##aaa#######aaaaaa####...........',
+'.............####bbbbb######bbb##aaa######aaaaa####.............',
+'...............####bbbb####bbbb##aaaa####aaaa####...............',
+'.................####bbbbbbbbbb##aaaaaaaaaa####.................',
+'...................####bbbbbbbb##aaaaaaaa####...................',
+'.....................####bbbbbb##aaaaaa####.....................',
+'.......................####bbbb##aaaa####.......................',
+'.........................####bb##aa####.........................',
+'...........................##########...........................',
+'..............................####..............................',
+'................................................................');
diff --git a/components/rx/version/v2.2_laz_1.2/rxdice.pas b/components/rx/version/v2.2_laz_1.2/rxdice.pas
new file mode 100644
index 000000000..b087c93c9
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxdice.pas
@@ -0,0 +1,382 @@
+{ rxdice unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+unit rxdice;
+
+interface
+
+{$I rx.inc}
+
+uses SysUtils, LCLType, LCLProc, LCLIntf, LMessages, Classes, Graphics,
+ Controls, Forms, StdCtrls, ExtCtrls, Menus, VCLUtils;
+
+type
+ TRxDiceValue = 1..6;
+
+{ TRxDice }
+
+ TRxDice = class(TCustomControl)
+ private
+ { Private declarations }
+ FActive: Boolean;
+ FAutoSize: Boolean;
+ FBitmap: TBitmap;
+ FInterval: Cardinal;
+ FAutoStopInterval: Cardinal;
+ FOnChange: TNotifyEvent;
+ FRotate: Boolean;
+ FShowFocus: Boolean;
+ FTimer: TTimer;
+ FTickCount: Longint;
+ FValue: TRxDiceValue;
+ FOnStart: TNotifyEvent;
+ FOnStop: TNotifyEvent;
+ procedure CMFocusChanged(var Message: TLMessage); message CM_FOCUSCHANGED;
+ procedure WMSize(var Message: TLMSize); message LM_SIZE;
+ procedure CreateBitmap;
+ procedure SetAutoSize(Value: Boolean);
+ procedure SetInterval(Value: Cardinal);
+ procedure SetRotate(AValue: Boolean);
+ procedure SetShowFocus(AValue: Boolean);
+ procedure SetValue(Value: TRxDiceValue);
+ procedure TimerExpired(Sender: TObject);
+ protected
+ { Protected declarations }
+ function GetPalette: HPALETTE; override;
+ procedure AdjustSize; override;
+ procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
+ X, Y: Integer); override;
+ procedure Paint; override;
+ procedure Change; dynamic;
+ procedure DoStart; dynamic;
+ procedure DoStop; dynamic;
+ public
+ { Public declarations }
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure RandomValue;
+ published
+ { Published declarations }
+ property Align;
+ property AutoSize: Boolean read FAutoSize write SetAutoSize default True;
+ property AutoStopInterval: Cardinal read FAutoStopInterval write FAutoStopInterval default 0;
+ property Color;
+ property Cursor;
+ property DragMode;
+ property DragCursor;
+ property Enabled;
+ property Interval: Cardinal read FInterval write SetInterval default 60;
+ property ParentColor;
+ property ParentShowHint;
+ property PopupMenu;
+ property Rotate: Boolean read FRotate write SetRotate;
+ property ShowFocus: Boolean read FShowFocus write SetShowFocus;
+ property ShowHint;
+ property Anchors;
+ property Constraints;
+ property DragKind;
+ property TabOrder;
+ property TabStop;
+ property Value: TRxDiceValue read FValue write SetValue default 1;
+ property Visible;
+ property OnClick;
+ property OnDblClick;
+ property OnEnter;
+ property OnExit;
+ property OnMouseMove;
+ property OnMouseDown;
+ property OnMouseUp;
+ property OnMouseWheel;
+ property OnMouseWheelDown;
+ property OnMouseWheelUp;
+ property OnKeyDown;
+ property OnKeyUp;
+ property OnKeyPress;
+ property OnDragOver;
+ property OnDragDrop;
+ property OnEndDrag;
+ property OnStartDrag;
+ property OnContextPopup;
+ property OnChange: TNotifyEvent read FOnChange write FOnChange;
+ property OnStart: TNotifyEvent read FOnStart write FOnStart;
+ property OnStop: TNotifyEvent read FOnStop write FOnStop;
+ property OnEndDock;
+ property OnStartDock;
+ end;
+
+{$I RXDICE.INC}
+
+implementation
+
+{ TRxDice }
+
+constructor TRxDice.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ Randomize;
+ ControlStyle := [csClickEvents, csSetCaption, csCaptureMouse,
+ csOpaque, csDoubleClicks];
+ FValue := 1;
+ FInterval := 60;
+ CreateBitmap;
+ FAutoSize := True;
+ Width := FBitmap.Width + 2;
+ Height := FBitmap.Height + 2;
+end;
+
+destructor TRxDice.Destroy;
+begin
+ FOnChange := nil;
+ if FBitmap <> nil then FBitmap.Free;
+ inherited Destroy;
+end;
+
+function TRxDice.GetPalette: HPALETTE;
+begin
+ if FBitmap <> nil then Result := FBitmap.Palette
+ else Result := 0;
+end;
+
+procedure TRxDice.RandomValue;
+var
+ Val: Byte;
+begin
+ Val := Random(6) + 1;
+ if Val = Byte(FValue) then
+ begin
+ if Val = 1 then Inc(Val)
+ else Dec(Val);
+ end;
+ SetValue(TRxDiceValue(Val));
+end;
+
+procedure TRxDice.DoStart;
+begin
+ if Assigned(FOnStart) then FOnStart(Self);
+end;
+
+procedure TRxDice.DoStop;
+begin
+ if Assigned(FOnStop) then FOnStop(Self);
+end;
+
+procedure TRxDice.CMFocusChanged(var Message: TLMessage);
+var
+ Active: Boolean;
+begin
+{ with Message do Active := (Sender = Self);
+ if Active <> FActive then begin
+ FActive := Active;
+ if FShowFocus then Invalidate;
+ end;}
+ inherited;
+end;
+
+procedure TRxDice.WMSize(var Message: TLMSize);
+begin
+ inherited;
+ AdjustSize;
+end;
+
+procedure TRxDice.CreateBitmap;
+begin
+ if FBitmap = nil then FBitmap := TBitmap.Create;
+ case FValue of
+ 1:FBitmap.Handle := CreatePixmapIndirect(@DICE1[0], GetSysColor(COLOR_BTNFACE));
+ 2:FBitmap.Handle := CreatePixmapIndirect(@DICE2[0], GetSysColor(COLOR_BTNFACE));
+ 3:FBitmap.Handle := CreatePixmapIndirect(@DICE3[0], GetSysColor(COLOR_BTNFACE));
+ 4:FBitmap.Handle := CreatePixmapIndirect(@DICE4[0], GetSysColor(COLOR_BTNFACE));
+ 5:FBitmap.Handle := CreatePixmapIndirect(@DICE5[0], GetSysColor(COLOR_BTNFACE));
+ 6:FBitmap.Handle := CreatePixmapIndirect(@DICE6[0], GetSysColor(COLOR_BTNFACE));
+ end;
+end;
+
+procedure TRxDice.AdjustSize;
+var
+ MinSide: Integer;
+begin
+ if not (csReading in ComponentState) then
+ begin
+ if AutoSize and Assigned(FBitmap) and (FBitmap.Width > 0) and
+ (FBitmap.Height > 0) then
+ SetBounds(Left, Top, FBitmap.Width + 2, FBitmap.Height + 2)
+ else
+ begin
+ { Adjust aspect ratio if control size changed }
+ MinSide := Width;
+ if Height < Width then MinSide := Height;
+ SetBounds(Left, Top, MinSide, MinSide);
+ end;
+ end;
+end;
+
+procedure TRxDice.MouseDown(Button: TMouseButton;
+ Shift: TShiftState; X, Y: Integer);
+begin
+ if (Button = mbLeft) and TabStop and CanFocus then SetFocus;
+ inherited MouseDown(Button, Shift, X, Y);
+end;
+
+procedure TRxDice.Paint;
+var
+ ARect: TRect;
+
+ procedure DrawBitmap;
+ var
+ TmpImage: TBitmap;
+ IWidth, IHeight: Integer;
+ IRect: TRect;
+ begin
+ IWidth := FBitmap.Width;
+ IHeight := FBitmap.Height;
+ IRect := Rect(0, 0, IWidth, IHeight);
+ TmpImage := TBitmap.Create;
+ try
+ TmpImage.Width := IWidth;
+ TmpImage.Height := IHeight;
+ TmpImage.Canvas.Brush.Color := Self.Brush.Color;
+// TmpImage.Canvas.BrushCopy(IRect, FBitmap, IRect, FBitmap.TransparentColor);
+ InflateRect(ARect, -1, -1);
+// Canvas.StretchDraw(ARect, TmpImage);
+ Canvas.StretchDraw(ARect, FBitmap);
+
+ finally
+ TmpImage.Free;
+ end;
+ end;
+
+begin
+ ARect := ClientRect;
+ if FBitmap <> nil then DrawBitmap;
+{ if Focused and FShowFocus and TabStop and not (csDesigning in ComponentState) then
+ begin
+ Canvas.DrawFocusRect(ARect);
+ end;}
+end;
+
+procedure TRxDice.TimerExpired(Sender: TObject);
+var
+ ParentForm: TCustomForm;
+ Now: Longint;
+begin
+ RandomValue;
+ if not FRotate then
+ begin
+ FTimer.Free;
+ FTimer := nil;
+ if (csDesigning in ComponentState) then
+ begin
+ ParentForm := GetParentForm(Self);
+ if ParentForm <> nil then ParentForm.Designer.Modified;
+ end;
+ DoStop;
+ end
+ else
+ if AutoStopInterval > 0 then
+ begin
+ Now := GetTickCount;
+ if (Now - FTickCount >= AutoStopInterval) or (Now < FTickCount) then
+ Rotate := False;
+ end;
+end;
+
+procedure TRxDice.Change;
+begin
+ if Assigned(FOnChange) then FOnChange(Self);
+end;
+
+procedure TRxDice.SetValue(Value: TRxDiceValue);
+begin
+ if FValue <> Value then
+ begin
+ FValue := Value;
+ CreateBitmap;
+ Invalidate;
+ Change;
+ end;
+end;
+
+procedure TRxDice.SetAutoSize(Value: Boolean);
+begin
+ if Value <> FAutoSize then
+ begin
+ FAutoSize := Value;
+ AdjustSize;
+ Invalidate;
+ end;
+end;
+
+procedure TRxDice.SetInterval(Value: Cardinal);
+begin
+ if FInterval <> Value then
+ begin
+ FInterval := Value;
+ if FTimer <> nil then FTimer.Interval := FInterval;
+ end;
+end;
+
+procedure TRxDice.SetRotate(AValue: Boolean);
+begin
+ if FRotate <> AValue then
+ begin
+ if AValue then
+ begin
+ if FTimer = nil then FTimer := TTimer.Create(Self);
+ try
+ with FTimer do
+ begin
+ OnTimer := @TimerExpired;
+ Interval := FInterval;
+ Enabled := True;
+ end;
+ FRotate := AValue;
+ FTickCount := GetTickCount;
+ DoStart;
+ except
+ FTimer.Free;
+ FTimer := nil;
+ raise;
+ end;
+ end
+ else
+ FRotate := AValue;
+ end;
+end;
+
+procedure TRxDice.SetShowFocus(AValue: Boolean);
+begin
+ if FShowFocus <> AValue then
+ begin
+ FShowFocus := AValue;
+ if not (csDesigning in ComponentState) then Invalidate;
+ end;
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxfileutils.pas b/components/rx/version/v2.2_laz_1.2/rxfileutils.pas
new file mode 100644
index 000000000..2cd5e1ff6
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxfileutils.pas
@@ -0,0 +1,197 @@
+{ rxFileUtils is part of RxFPC library
+
+ Copyright (C) 2005-2013 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit rxFileUtils;
+
+{$I rx.inc}
+
+interface
+
+uses
+ SysUtils;
+
+function GetFileOwnerUser(const SearchDomain, FileName:String):String;
+procedure GetFileOwnerData(const SearchDomain, FileName:String;out UserName, DomainName:string);
+function NormalizeDirectoryName(const DirName:string):string;
+function GetUserName:string;
+
+implementation
+uses
+{$IFDEF WINDOWS}
+ Windows,
+{$ELSE}
+{$ENDIF}
+ FileUtil;
+
+{$IF DEFINED(WINDOWS) AND NOT DEFINED(WINCE)}
+function LStrError(const Ernum: Longint; const UseUTF8: Boolean = False): string;
+const
+ MAX_ERROR = 1024;
+var
+ Tmp: string;
+ TmpW: widestring;
+begin
+ Result := ' [' + IntToStr(Ernum) + ']: ';
+ if USEUtf8 then begin
+ SetLength(TmpW, MAX_ERROR);
+ SetLength(TmpW, FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM or
+ FORMAT_MESSAGE_IGNORE_INSERTS or
+ FORMAT_MESSAGE_ARGUMENT_ARRAY,
+ nil, Ernum, 0, @TmpW[1], MAX_ERROR, nil));
+ Tmp := UTF8Encode(TmpW);
+ end else begin
+ SetLength(Tmp, MAX_ERROR);
+ SetLength(Tmp, FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or
+ FORMAT_MESSAGE_IGNORE_INSERTS or
+ FORMAT_MESSAGE_ARGUMENT_ARRAY,
+ nil, Ernum, 0, @Tmp[1], MAX_ERROR, nil));
+ end;
+ if Length(Tmp) > 2 then
+ Delete(Tmp, Length(Tmp)-1, 2);
+ Result := Result + Tmp;
+end;
+
+{ TODO -oalexs : In future need rewrite this code for fix mem leak }
+
+procedure GetFileNameOwner(const SearchDomain, FileName: String; out UserName, DomainName: string);
+var
+ RCode, RC1:WINBOOL;
+ SDSize:DWORD; // Size of security descriptor
+
+ FAccountName:PChar; // Account name
+ lngAccountLen:DWORD; // Length of account name
+ FDomainName:PChar; // Domain name
+ lngDomainLen:DWORD; // Length of domain name
+
+ ptrUse:SID_NAME_USE; // Pointer to SID_NAME_USE
+ ptrOwner:PSID;
+ P:PByteArray;
+begin
+ ptrOwner:=nil;
+ SDSize:=0;
+ P:=nil;
+ UserName:='';
+ DomainName:='';
+
+ RCode := GetFileSecurity(PChar(FileName), OWNER_SECURITY_INFORMATION, nil, 0, @SDSize);
+ GetMem(P, SDSize);
+ FillChar(P^, SDSize, 0);
+ RCode := GetFileSecurity(PChar(FileName), OWNER_SECURITY_INFORMATION, Pointer(P), SDSize, @SDSize);
+ if not RCode then
+ raise Exception.Create(LStrError(GetLastError, true));
+
+ RCode := GetSecurityDescriptorOwner(Pointer(P), ptrOwner, @RC1);
+ if not RCode then
+ raise Exception.Create(LStrError(GetLastError, true));
+
+ lngAccountLen:=0;
+ lngDomainLen:=0;
+ RCode := LookupAccountSid(PChar(SearchDomain), ptrOwner, nil, lngAccountLen, nil, lngDomainLen, ptrUse);
+ //' Configure the strings' buffer sizes
+ GetMem(FAccountName, lngAccountLen);
+ FillChar(FAccountName^, lngAccountLen, 0);
+ GetMem(FDomainName, lngDomainLen);
+ FillChar(FDomainName^, lngDomainLen, 0);
+
+ RCode:=LookupAccountSid(PChar(SearchDomain), ptrOwner, FAccountName, lngAccountLen, FDomainName, lngDomainLen, ptrUse);
+
+ if not RCode then
+ raise Exception.Create(LStrError(GetLastError, true));
+
+ UserName:=FAccountName;
+ DomainName:=FDomainName;
+
+ Freemem(P, SDSize);
+ Freemem(FAccountName, lngAccountLen);
+ Freemem(FDomainName, lngDomainLen);
+end;
+{$ELSE}
+{$ENDIF}
+
+function GetFileOwnerUser(const SearchDomain, FileName: String): String;
+var
+ S:string;
+begin
+ {$IF DEFINED(WINDOWS) AND NOT DEFINED(WINCE)}
+ GetFileNameOwner(UTF8ToSys(SearchDomain), UTF8ToSys(FileName), Result, S);
+ Result:=UTF8Encode(Result);
+ {$ELSE}
+ Result:='';
+ {$ENDIF}
+end;
+
+procedure GetFileOwnerData(const SearchDomain, FileName: String; out UserName,
+ DomainName: string);
+begin
+ {$IF DEFINED(WINDOWS) AND NOT DEFINED(WINCE)}
+ GetFileNameOwner(UTF8ToSys(SearchDomain), UTF8ToSys(FileName), UserName, DomainName);
+ UserName:=UTF8Encode(UserName);
+ DomainName:=UTF8Encode(DomainName);
+ {$ELSE}
+ UserName:='';
+ DomainName:='';
+ {$ENDIF}
+end;
+
+{replase any dir separators '\' or '/' to system directory separator }
+function NormalizeDirectoryName(const DirName: string): string;
+var
+ i:integer;
+begin
+ Result:=DirName;
+ for i:=1 to Length(Result) do
+ if Result[i] in ['/', '\'] then
+ Result[i]:=DirectorySeparator;
+end;
+
+function GetUserName: string;
+{$IF DEFINED(WINDOWS) AND NOT DEFINED(WINCE)}
+var
+ A:array [0..256] of Char;
+ L:DWORD;
+{$ENDIF}
+begin
+ {$IF DEFINED(WINDOWS) AND NOT DEFINED(WINCE)}
+ FillChar(A, SizeOf(A), 0);
+ L:=SizeOf(A)-1;
+ if Windows.GetUserNameA(@A, L) then
+ begin
+ Result:=SysToUTF8(StrPas(@A));
+ end
+ else
+ Result:=GetEnvironmentVariableUTF8('USERNAME');
+ {$ELSE}
+ Result:=GetEnvironmentVariable('USER');
+ {$ENDIF}
+end;
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/rxfilterby.lfm b/components/rx/version/v2.2_laz_1.2/rxfilterby.lfm
new file mode 100644
index 000000000..a9f7ba09c
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxfilterby.lfm
@@ -0,0 +1,775 @@
+object rxFilterByForm: TrxFilterByForm
+ Left = 464
+ Height = 445
+ Top = 115
+ Width = 644
+ ActiveControl = Edit1
+ Caption = 'Filter conditions'
+ ClientHeight = 445
+ ClientWidth = 644
+ OnCreate = FormCreate
+ Position = poScreenCenter
+ LCLVersion = '1.1'
+ object Label1: TLabel
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = Owner
+ Left = 6
+ Height = 15
+ Top = 6
+ Width = 234
+ BorderSpacing.Around = 6
+ Caption = 'Select filter expression for data'
+ Font.Style = [fsBold]
+ ParentColor = False
+ ParentFont = False
+ end
+ object Label2: TLabel
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = Label1
+ AnchorSideTop.Side = asrBottom
+ Left = 6
+ Height = 15
+ Top = 27
+ Width = 62
+ BorderSpacing.Around = 6
+ Caption = 'On field:'
+ Font.Color = clRed
+ Font.Style = [fsBold]
+ ParentColor = False
+ ParentFont = False
+ end
+ object Label3: TLabel
+ AnchorSideTop.Control = Label1
+ AnchorSideTop.Side = asrBottom
+ Left = 168
+ Height = 15
+ Top = 27
+ Width = 83
+ BorderSpacing.Around = 6
+ Caption = 'Operation :'
+ Font.Color = clRed
+ Font.Style = [fsBold]
+ ParentColor = False
+ ParentFont = False
+ end
+ object Label4: TLabel
+ AnchorSideTop.Control = Label1
+ AnchorSideTop.Side = asrBottom
+ Left = 271
+ Height = 15
+ Top = 27
+ Width = 88
+ BorderSpacing.Around = 6
+ Caption = 'Conditions :'
+ Font.Color = clRed
+ Font.Style = [fsBold]
+ ParentColor = False
+ ParentFont = False
+ end
+ object Label5: TLabel
+ AnchorSideLeft.Control = ComboBox3
+ AnchorSideTop.Control = Label1
+ AnchorSideTop.Side = asrBottom
+ Left = 533
+ Height = 15
+ Top = 27
+ Width = 74
+ BorderSpacing.Around = 6
+ Caption = 'Operand :'
+ Font.Color = clRed
+ Font.Style = [fsBold]
+ ParentColor = False
+ ParentFont = False
+ end
+ object Label6: TLabel
+ AnchorSideLeft.Control = ComboBox3
+ AnchorSideTop.Side = asrBottom
+ AnchorSideBottom.Control = ComboBox25
+ AnchorSideBottom.Side = asrBottom
+ Left = 527
+ Height = 15
+ Top = 340
+ Width = 33
+ Anchors = [akLeft, akBottom]
+ Caption = 'End.'
+ Font.Color = clRed
+ Font.Style = [fsBold]
+ ParentColor = False
+ ParentFont = False
+ end
+ object ComboBox1: TComboBox
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = Label2
+ AnchorSideTop.Side = asrBottom
+ Left = 6
+ Height = 27
+ Top = 48
+ Width = 153
+ BorderSpacing.Around = 6
+ ItemHeight = 0
+ Style = csDropDownList
+ TabOrder = 0
+ end
+ object ComboBox2: TComboBox
+ AnchorSideTop.Control = Label2
+ AnchorSideTop.Side = asrBottom
+ Left = 168
+ Height = 27
+ Top = 48
+ Width = 96
+ BorderSpacing.Around = 6
+ DropDownCount = 9
+ ItemHeight = 0
+ OnChange = ComboBoxChange
+ Style = csDropDownList
+ TabOrder = 1
+ end
+ object Edit1: TEdit
+ AnchorSideTop.Control = Label2
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = ComboBox3
+ Left = 271
+ Height = 25
+ Top = 48
+ Width = 250
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Around = 6
+ OnChange = EditChange
+ TabOrder = 2
+ end
+ object ComboBox3: TComboBox
+ AnchorSideTop.Control = Label2
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ Left = 527
+ Height = 27
+ Top = 48
+ Width = 111
+ Anchors = [akTop, akRight]
+ BorderSpacing.Around = 6
+ ItemHeight = 0
+ Items.Strings = (
+ 'And'
+ 'Or'
+ )
+ Style = csDropDownList
+ TabOrder = 3
+ end
+ object ComboBox4: TComboBox
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = ComboBox1
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = ComboBox1
+ AnchorSideRight.Side = asrBottom
+ Left = 8
+ Height = 27
+ Top = 83
+ Width = 149
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Left = 6
+ BorderSpacing.Top = 6
+ BorderSpacing.Around = 2
+ ItemHeight = 0
+ Style = csDropDownList
+ TabOrder = 4
+ end
+ object ComboBox5: TComboBox
+ AnchorSideLeft.Control = ComboBox2
+ AnchorSideTop.Control = ComboBox1
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = ComboBox2
+ AnchorSideRight.Side = asrBottom
+ Left = 168
+ Height = 27
+ Top = 81
+ Width = 96
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Top = 6
+ DropDownCount = 9
+ ItemHeight = 0
+ OnChange = ComboBoxChange
+ Style = csDropDownList
+ TabOrder = 5
+ end
+ object Edit2: TEdit
+ AnchorSideLeft.Control = ComboBox2
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = ComboBox1
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = ComboBox3
+ Left = 270
+ Height = 25
+ Top = 81
+ Width = 251
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Left = 6
+ BorderSpacing.Top = 6
+ OnChange = EditChange
+ TabOrder = 6
+ end
+ object ComboBox6: TComboBox
+ AnchorSideTop.Control = ComboBox1
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ Left = 527
+ Height = 27
+ Top = 81
+ Width = 111
+ Anchors = [akTop, akRight]
+ BorderSpacing.Around = 6
+ ItemHeight = 0
+ Items.Strings = (
+ 'And'
+ 'Or'
+ )
+ Style = csDropDownList
+ TabOrder = 7
+ end
+ object ComboBox7: TComboBox
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = ComboBox4
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = ComboBox1
+ AnchorSideRight.Side = asrBottom
+ Left = 8
+ Height = 27
+ Top = 118
+ Width = 149
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Left = 6
+ BorderSpacing.Top = 6
+ BorderSpacing.Around = 2
+ ItemHeight = 0
+ Style = csDropDownList
+ TabOrder = 8
+ end
+ object ComboBox8: TComboBox
+ AnchorSideLeft.Control = ComboBox2
+ AnchorSideTop.Control = ComboBox4
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = ComboBox2
+ AnchorSideRight.Side = asrBottom
+ Left = 168
+ Height = 27
+ Top = 116
+ Width = 96
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Top = 6
+ DropDownCount = 9
+ ItemHeight = 0
+ OnChange = ComboBoxChange
+ Style = csDropDownList
+ TabOrder = 9
+ end
+ object Edit3: TEdit
+ AnchorSideLeft.Control = ComboBox2
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = ComboBox4
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = ComboBox3
+ Left = 270
+ Height = 25
+ Top = 116
+ Width = 251
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Left = 6
+ BorderSpacing.Top = 6
+ OnChange = EditChange
+ TabOrder = 10
+ end
+ object ComboBox9: TComboBox
+ AnchorSideTop.Control = ComboBox4
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ Left = 527
+ Height = 27
+ Top = 116
+ Width = 111
+ Anchors = [akTop, akRight]
+ BorderSpacing.Around = 6
+ ItemHeight = 0
+ Items.Strings = (
+ 'And'
+ 'Or'
+ )
+ Style = csDropDownList
+ TabOrder = 11
+ end
+ object ComboBox10: TComboBox
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = ComboBox7
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = ComboBox1
+ AnchorSideRight.Side = asrBottom
+ Left = 8
+ Height = 27
+ Top = 153
+ Width = 149
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Left = 6
+ BorderSpacing.Top = 6
+ BorderSpacing.Around = 2
+ ItemHeight = 0
+ Style = csDropDownList
+ TabOrder = 12
+ end
+ object ComboBox11: TComboBox
+ AnchorSideLeft.Control = ComboBox2
+ AnchorSideTop.Control = ComboBox7
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = ComboBox2
+ AnchorSideRight.Side = asrBottom
+ Left = 168
+ Height = 27
+ Top = 151
+ Width = 96
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Top = 6
+ DropDownCount = 9
+ ItemHeight = 0
+ OnChange = ComboBoxChange
+ Style = csDropDownList
+ TabOrder = 13
+ end
+ object Edit4: TEdit
+ AnchorSideLeft.Control = ComboBox2
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = ComboBox7
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = ComboBox3
+ Left = 270
+ Height = 25
+ Top = 151
+ Width = 251
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Left = 6
+ BorderSpacing.Top = 6
+ OnChange = EditChange
+ TabOrder = 14
+ end
+ object ComboBox12: TComboBox
+ AnchorSideTop.Control = ComboBox7
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ Left = 527
+ Height = 27
+ Top = 151
+ Width = 111
+ Anchors = [akTop, akRight]
+ BorderSpacing.Around = 6
+ ItemHeight = 0
+ Items.Strings = (
+ 'And'
+ 'Or'
+ )
+ Style = csDropDownList
+ TabOrder = 15
+ end
+ object ComboBox13: TComboBox
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = ComboBox10
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = ComboBox1
+ AnchorSideRight.Side = asrBottom
+ Left = 8
+ Height = 27
+ Top = 188
+ Width = 149
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Left = 6
+ BorderSpacing.Top = 6
+ BorderSpacing.Around = 2
+ ItemHeight = 0
+ Style = csDropDownList
+ TabOrder = 16
+ end
+ object ComboBox14: TComboBox
+ AnchorSideLeft.Control = ComboBox2
+ AnchorSideTop.Control = ComboBox10
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = ComboBox2
+ AnchorSideRight.Side = asrBottom
+ Left = 168
+ Height = 27
+ Top = 186
+ Width = 96
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Top = 6
+ DropDownCount = 9
+ ItemHeight = 0
+ OnChange = ComboBoxChange
+ Style = csDropDownList
+ TabOrder = 17
+ end
+ object Edit5: TEdit
+ AnchorSideLeft.Control = ComboBox2
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = ComboBox10
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = ComboBox3
+ Left = 270
+ Height = 25
+ Top = 186
+ Width = 251
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Left = 6
+ BorderSpacing.Top = 6
+ OnChange = EditChange
+ TabOrder = 18
+ end
+ object ComboBox15: TComboBox
+ AnchorSideTop.Control = ComboBox10
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ Left = 527
+ Height = 27
+ Top = 186
+ Width = 111
+ Anchors = [akTop, akRight]
+ BorderSpacing.Around = 6
+ ItemHeight = 0
+ Items.Strings = (
+ 'And'
+ 'Or'
+ )
+ Style = csDropDownList
+ TabOrder = 19
+ end
+ object ComboBox16: TComboBox
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = ComboBox13
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = ComboBox1
+ AnchorSideRight.Side = asrBottom
+ Left = 8
+ Height = 27
+ Top = 223
+ Width = 149
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Left = 6
+ BorderSpacing.Top = 6
+ BorderSpacing.Around = 2
+ ItemHeight = 0
+ Style = csDropDownList
+ TabOrder = 20
+ end
+ object ComboBox17: TComboBox
+ AnchorSideLeft.Control = ComboBox2
+ AnchorSideTop.Control = ComboBox13
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = ComboBox2
+ AnchorSideRight.Side = asrBottom
+ Left = 168
+ Height = 27
+ Top = 221
+ Width = 96
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Top = 6
+ DropDownCount = 9
+ ItemHeight = 0
+ OnChange = ComboBoxChange
+ Style = csDropDownList
+ TabOrder = 21
+ end
+ object Edit6: TEdit
+ AnchorSideLeft.Control = ComboBox2
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = ComboBox13
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = ComboBox3
+ Left = 270
+ Height = 25
+ Top = 221
+ Width = 251
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Left = 6
+ BorderSpacing.Top = 6
+ OnChange = EditChange
+ TabOrder = 22
+ end
+ object ComboBox18: TComboBox
+ AnchorSideTop.Control = ComboBox13
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ Left = 527
+ Height = 27
+ Top = 221
+ Width = 111
+ Anchors = [akTop, akRight]
+ BorderSpacing.Around = 6
+ ItemHeight = 0
+ Items.Strings = (
+ 'And'
+ 'Or'
+ )
+ Style = csDropDownList
+ TabOrder = 23
+ end
+ object ComboBox19: TComboBox
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = ComboBox16
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = ComboBox1
+ AnchorSideRight.Side = asrBottom
+ Left = 8
+ Height = 27
+ Top = 258
+ Width = 149
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Left = 6
+ BorderSpacing.Top = 6
+ BorderSpacing.Around = 2
+ ItemHeight = 0
+ Style = csDropDownList
+ TabOrder = 24
+ end
+ object ComboBox20: TComboBox
+ AnchorSideLeft.Control = ComboBox2
+ AnchorSideTop.Control = ComboBox16
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = ComboBox2
+ AnchorSideRight.Side = asrBottom
+ Left = 168
+ Height = 27
+ Top = 256
+ Width = 96
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Top = 6
+ DropDownCount = 9
+ ItemHeight = 0
+ OnChange = ComboBoxChange
+ Style = csDropDownList
+ TabOrder = 25
+ end
+ object Edit7: TEdit
+ AnchorSideLeft.Control = ComboBox2
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = ComboBox16
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = ComboBox3
+ Left = 270
+ Height = 25
+ Top = 256
+ Width = 251
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Left = 6
+ BorderSpacing.Top = 6
+ OnChange = EditChange
+ TabOrder = 26
+ end
+ object ComboBox21: TComboBox
+ AnchorSideTop.Control = ComboBox16
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ Left = 527
+ Height = 27
+ Top = 256
+ Width = 111
+ Anchors = [akTop, akRight]
+ BorderSpacing.Around = 6
+ ItemHeight = 0
+ Items.Strings = (
+ 'And'
+ 'Or'
+ )
+ Style = csDropDownList
+ TabOrder = 27
+ end
+ object ComboBox22: TComboBox
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = ComboBox19
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = ComboBox1
+ AnchorSideRight.Side = asrBottom
+ Left = 8
+ Height = 27
+ Top = 293
+ Width = 149
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Left = 6
+ BorderSpacing.Top = 6
+ BorderSpacing.Around = 2
+ ItemHeight = 0
+ Style = csDropDownList
+ TabOrder = 28
+ end
+ object ComboBox23: TComboBox
+ AnchorSideLeft.Control = ComboBox2
+ AnchorSideTop.Control = ComboBox19
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = ComboBox2
+ AnchorSideRight.Side = asrBottom
+ Left = 168
+ Height = 27
+ Top = 291
+ Width = 96
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Top = 6
+ DropDownCount = 9
+ ItemHeight = 0
+ OnChange = ComboBoxChange
+ Style = csDropDownList
+ TabOrder = 29
+ end
+ object Edit8: TEdit
+ AnchorSideLeft.Control = ComboBox2
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = ComboBox19
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = ComboBox3
+ Left = 270
+ Height = 25
+ Top = 291
+ Width = 251
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Left = 6
+ BorderSpacing.Top = 6
+ OnChange = EditChange
+ TabOrder = 30
+ end
+ object ComboBox24: TComboBox
+ AnchorSideTop.Control = ComboBox19
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ Left = 527
+ Height = 27
+ Top = 291
+ Width = 111
+ Anchors = [akTop, akRight]
+ BorderSpacing.Around = 6
+ ItemHeight = 0
+ Items.Strings = (
+ 'And'
+ 'Or'
+ )
+ Style = csDropDownList
+ TabOrder = 31
+ end
+ object ComboBox25: TComboBox
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = ComboBox22
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = ComboBox1
+ AnchorSideRight.Side = asrBottom
+ Left = 8
+ Height = 27
+ Top = 328
+ Width = 149
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Left = 6
+ BorderSpacing.Top = 6
+ BorderSpacing.Around = 2
+ ItemHeight = 0
+ Style = csDropDownList
+ TabOrder = 32
+ end
+ object ComboBox26: TComboBox
+ AnchorSideLeft.Control = ComboBox2
+ AnchorSideTop.Control = ComboBox22
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = ComboBox2
+ AnchorSideRight.Side = asrBottom
+ Left = 168
+ Height = 27
+ Top = 326
+ Width = 96
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Top = 6
+ DropDownCount = 9
+ ItemHeight = 0
+ OnChange = ComboBoxChange
+ Style = csDropDownList
+ TabOrder = 33
+ end
+ object Edit9: TEdit
+ AnchorSideLeft.Control = ComboBox2
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = ComboBox22
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = ComboBox3
+ Left = 270
+ Height = 25
+ Top = 326
+ Width = 251
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Left = 6
+ BorderSpacing.Top = 6
+ OnChange = EditChange
+ TabOrder = 34
+ end
+ object ComboBox27: TComboBox
+ AnchorSideLeft.Control = Owner
+ AnchorSideBottom.Control = Owner
+ AnchorSideBottom.Side = asrBottom
+ Left = 6
+ Height = 27
+ Top = 412
+ Width = 58
+ Anchors = [akLeft, akBottom]
+ BorderSpacing.Around = 6
+ ItemHeight = 0
+ Items.Strings = (
+ 'And'
+ 'Or'
+ )
+ Style = csDropDownList
+ TabOrder = 35
+ Visible = False
+ end
+ object Button1: TButton
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ AnchorSideBottom.Control = Owner
+ AnchorSideBottom.Side = asrBottom
+ Left = 593
+ Height = 25
+ Top = 414
+ Width = 45
+ Anchors = [akRight, akBottom]
+ AutoSize = True
+ BorderSpacing.Around = 6
+ Caption = 'Apply'
+ Default = True
+ OnClick = Button1Click
+ TabOrder = 36
+ end
+ object Button2: TButton
+ AnchorSideRight.Control = Button1
+ AnchorSideBottom.Control = Owner
+ AnchorSideBottom.Side = asrBottom
+ Left = 534
+ Height = 25
+ Top = 414
+ Width = 53
+ Anchors = [akRight, akBottom]
+ AutoSize = True
+ BorderSpacing.Around = 6
+ Cancel = True
+ Caption = 'Cancel'
+ OnClick = Button2Click
+ TabOrder = 37
+ end
+ object Button3: TButton
+ AnchorSideRight.Control = Button2
+ AnchorSideBottom.Control = Owner
+ AnchorSideBottom.Side = asrBottom
+ Left = 453
+ Height = 25
+ Top = 414
+ Width = 75
+ Anchors = [akRight, akBottom]
+ AutoSize = True
+ BorderSpacing.Around = 6
+ Caption = 'Clear filter'
+ OnClick = Button3Click
+ TabOrder = 38
+ end
+end
diff --git a/components/rx/version/v2.2_laz_1.2/rxfilterby.lrt b/components/rx/version/v2.2_laz_1.2/rxfilterby.lrt
new file mode 100644
index 000000000..237bf239f
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxfilterby.lrt
@@ -0,0 +1,10 @@
+TRXFILTERBYFORM.CAPTION=Filter conditions
+TRXFILTERBYFORM.LABEL1.CAPTION=Select filter expression for data
+TRXFILTERBYFORM.LABEL2.CAPTION=On field:
+TRXFILTERBYFORM.LABEL3.CAPTION=Operation :
+TRXFILTERBYFORM.LABEL4.CAPTION=Conditions :
+TRXFILTERBYFORM.LABEL5.CAPTION=Operand :
+TRXFILTERBYFORM.LABEL6.CAPTION=End.
+TRXFILTERBYFORM.BUTTON1.CAPTION=Apply
+TRXFILTERBYFORM.BUTTON2.CAPTION=Cancel
+TRXFILTERBYFORM.BUTTON3.CAPTION=Clear filter
diff --git a/components/rx/version/v2.2_laz_1.2/rxfilterby.pas b/components/rx/version/v2.2_laz_1.2/rxfilterby.pas
new file mode 100644
index 000000000..907fc70fc
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxfilterby.pas
@@ -0,0 +1,384 @@
+{ rxfilterby unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit rxfilterby;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, FileUtil, rxdbgrid, LResources, Forms, Controls, Graphics,
+ Dialogs, StdCtrls, db;
+
+type
+
+ { TrxFilterByForm }
+
+ TrxFilterByForm = class(TForm)
+ Button1: TButton;
+ Button2: TButton;
+ Button3: TButton;
+ ComboBox1: TComboBox;
+ ComboBox10: TComboBox;
+ ComboBox11: TComboBox;
+ ComboBox12: TComboBox;
+ ComboBox13: TComboBox;
+ ComboBox14: TComboBox;
+ ComboBox15: TComboBox;
+ ComboBox16: TComboBox;
+ ComboBox17: TComboBox;
+ ComboBox18: TComboBox;
+ ComboBox19: TComboBox;
+ ComboBox2: TComboBox;
+ ComboBox20: TComboBox;
+ ComboBox21: TComboBox;
+ ComboBox22: TComboBox;
+ ComboBox23: TComboBox;
+ ComboBox24: TComboBox;
+ ComboBox25: TComboBox;
+ ComboBox26: TComboBox;
+ ComboBox27: TComboBox;
+ ComboBox3: TComboBox;
+ ComboBox4: TComboBox;
+ ComboBox5: TComboBox;
+ ComboBox6: TComboBox;
+ ComboBox7: TComboBox;
+ ComboBox8: TComboBox;
+ ComboBox9: TComboBox;
+ Edit1: TEdit;
+ Edit2: TEdit;
+ Edit3: TEdit;
+ Edit4: TEdit;
+ Edit5: TEdit;
+ Edit6: TEdit;
+ Edit7: TEdit;
+ Edit8: TEdit;
+ Edit9: TEdit;
+ Label1: TLabel;
+ Label2: TLabel;
+ Label3: TLabel;
+ Label4: TLabel;
+ Label5: TLabel;
+ Label6: TLabel;
+ procedure Button1Click(Sender: TObject);
+ procedure Button2Click(Sender: TObject);
+ procedure Button3Click(Sender: TObject);
+ procedure ComboBoxChange(Sender: TObject);
+ procedure EditChange(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ private
+ Combo_1 : Array[1..9] of TComboBox;
+ Combo_2 : Array[1..9] of TComboBox;
+ Edit_1 : Array[1..9] of TEdit;
+ Combo_3 : Array[1..9] of TComboBox;
+
+ FGrid : TRxDBGrid;
+ procedure ClearALL(AGrid : TRxDBGrid);
+ function FindCombo(CB:TComboBox):Integer;
+ function FindEdit(ED:TEdit):Integer;
+ public
+ function Execute(AGrid : TRxDBGrid; var FilterStr : String; var LastFilter : TstringList):Boolean;
+ end;
+
+var
+ rxFilterByForm: TrxFilterByForm;
+
+implementation
+uses rxdconst, rxstrutils, DBGrids;
+
+{$R *.lfm}
+
+{ TrxFilterByForm }
+
+procedure TrxFilterByForm.Button2Click(Sender: TObject);
+begin
+ ModalResult := mrCancel;
+end;
+
+procedure TrxFilterByForm.Button3Click(Sender: TObject);
+begin
+ ClearALL(FGrid);
+end;
+
+procedure TrxFilterByForm.ComboBoxChange(Sender: TObject);
+Var
+ CBN : Integer;
+ CB : TComboBox;
+begin
+ CB := (Sender AS TComboBox);
+ CBN := FindCombo(CB);
+ if CBN=0 Then Exit;
+ if (CB.Text=' IS NULL ') Or (CB.Text=' IS NOT NULL ') Then
+ Begin
+ Edit_1[CBN].Text := '';
+ Edit_1[CBN].Enabled := False;
+ Edit_1[CBN].Color := clInactiveCaption;
+ End
+ Else
+ Begin
+ Edit_1[CBN].Enabled := True;
+ Edit_1[CBN].Color := clWindow;
+ End;
+end;
+
+procedure TrxFilterByForm.EditChange(Sender: TObject);
+Var
+ EDN : Integer;
+ ED : TEdit;
+begin
+ ED := (Sender AS TEdit);
+ EDN := FindEdit(ED);
+ if EDN=0 Then Exit;
+ if ED.Text='' Then Combo_1[EDN].ItemIndex:=-1;
+end;
+
+procedure TrxFilterByForm.FormCreate(Sender: TObject);
+begin
+ Label1.Caption:=sRxFilterFormSelectExp;
+ Label2.Caption:=sRxFilterFormOnField;
+ Label3.Caption:=sRxFilterFormOperaion;
+ Label4.Caption:=sRxFilterFormCondition;
+ Label5.Caption:=sRxFilterFormOperand;
+ Label6.Caption:=sRxFilterFormEnd;
+ Button3.Caption:=sRxFilterFormClear;
+ Button2.Caption:=sRxFilterFormCancel;
+ Button1.Caption:=sRxFilterFormApply;
+end;
+
+procedure TrxFilterByForm.Button1Click(Sender: TObject);
+begin
+ ModalResult := mrOK;
+end;
+
+procedure TrxFilterByForm.ClearALL(AGrid: TRxDBGrid);
+var
+ i : Integer;
+begin
+ //*****************************************************************************
+ Combo_1[1].Items.Clear;
+ Combo_1[1].Items.Add('');
+ for i := 0 To AGrid.Columns.Count-1 do
+ begin
+ if (AGrid.Columns[i].Field.FieldKind=fkData) and (AGrid.Columns[i].Visible) then
+ Combo_1[1].Items.Objects[Combo_1[1].Items.Add(AGrid.Columns[i].Title.Caption)]:=AGrid.Columns[i].Field;
+ end;
+
+ Combo_1[1].ItemIndex := 0;
+ for i := 2 To 9 do
+ Begin
+ Combo_1[i].Items.Assign(Combo_1[1].Items);
+ Combo_1[i].ItemIndex := 0;
+ End;
+
+ Combo_2[1].Items.Clear;
+ Combo_2[1].Items.Add(' = ');
+ Combo_2[1].Items.Add(' > ');
+ Combo_2[1].Items.Add(' < ');
+ Combo_2[1].Items.Add(' >= ');
+ Combo_2[1].Items.Add(' <= ');
+ Combo_2[1].Items.Add(' <> ');
+ Combo_2[1].Items.Add(' LIKE ');
+ Combo_2[1].Items.Add(' IS NULL ');
+ Combo_2[1].Items.Add(' IS NOT NULL ');
+ Combo_2[1].ItemIndex := 0;
+ for i := 2 To 9 do
+ begin
+ Combo_2[i].Items.Assign(Combo_2[1].Items);
+ Combo_2[i].ItemIndex := 0;
+ end;
+ for i := 1 To 9 do
+ begin
+ Combo_3[i].ItemIndex := 0;
+ end;
+ for i := 1 To 9 do Edit_1[i].Text := '';
+ //*****************************************************************************
+end;
+
+function TrxFilterByForm.Execute(AGrid: TRxDBGrid; var FilterStr: String;
+ var LastFilter: TstringList): Boolean;
+Var
+ X : Integer;
+ P : Integer;
+ S, S1 : String;
+ SD : String;
+ C : TColumn;
+Begin
+ Result := False;
+ //*****************************************************************************
+ Combo_1[1]:= ComboBox1;
+ Combo_1[2]:= ComboBox4;
+ Combo_1[3]:= ComboBox7;
+ Combo_1[4]:= ComboBox10;
+ Combo_1[5]:= ComboBox13;
+ Combo_1[6]:= ComboBox16;
+ Combo_1[7]:= ComboBox19;
+ Combo_1[8]:= ComboBox22;
+ Combo_1[9]:= ComboBox25;
+
+ Combo_2[1]:= ComboBox2;
+ Combo_2[2]:= ComboBox5;
+ Combo_2[3]:= ComboBox8;
+ Combo_2[4]:= ComboBox11;
+ Combo_2[5]:= ComboBox14;
+ Combo_2[6]:= ComboBox17;
+ Combo_2[7]:= ComboBox20;
+ Combo_2[8]:= ComboBox23;
+ Combo_2[9]:= ComboBox26;
+
+ Combo_3[1]:= ComboBox3;
+ Combo_3[2]:= ComboBox6;
+ Combo_3[3]:= ComboBox9;
+ Combo_3[4]:= ComboBox12;
+ Combo_3[5]:= ComboBox15;
+ Combo_3[6]:= ComboBox18;
+ Combo_3[7]:= ComboBox21;
+ Combo_3[8]:= ComboBox24;
+ Combo_3[9]:= ComboBox27;
+ Combo_3[9].Visible := False;
+
+ Edit_1[1] := Edit1;
+ Edit_1[2] := Edit2;
+ Edit_1[3] := Edit3;
+ Edit_1[4] := Edit4;
+ Edit_1[5] := Edit5;
+ Edit_1[6] := Edit6;
+ Edit_1[7] := Edit7;
+ Edit_1[8] := Edit8;
+ Edit_1[9] := Edit9;
+
+ //*****************************************************************************
+ FGrid := AGrid;
+ ClearALL(FGrid);
+ if LastFilter.Count > 0 Then
+ begin
+ for X := 0 To LastFilter.Count-1 do
+ begin
+ S := LastFilter.Strings[X];
+ P := Pos('|||',S);
+ if P > 0 Then
+ begin
+ S1:=System.Copy(S,1,P-1);
+ C:=FGrid.ColumnByFieldName(S1);
+ Combo_1[X+1].ItemIndex := Combo_1[X+1].Items.IndexOf(C.Title.Caption);
+ System.Delete(S,1,P+2);
+ end;
+
+ P := Pos('|||',S);
+ if P > 0 Then
+ begin
+ SD:=System.Copy(S,1,P-1);
+ Combo_2[X+1].ItemIndex := Combo_2[X+1].Items.IndexOf(System.Copy(S,1,P-1));
+ System.Delete(S,1,P+2);
+ if (SD=' IS NULL ') or (SD=' IS NOT NULL ') Then
+ Begin
+ Edit_1[X+1].Text:= '';
+ Edit_1[X+1].Enabled := False;
+ Edit_1[X+1].Color := clInactiveCaption;
+ End;
+ end;
+
+ P := Pos('|||',S);
+ if P > 0 then
+ begin
+ Edit_1[X+1].Text := System.Copy(S,1,P-1);
+ System.Delete(S,1,P+2);
+ end;
+ Combo_3[X+1].ItemIndex := Combo_3[X+1].Items.IndexOf(S);
+
+ if Combo_3[X+1].ItemIndex = -1 Then Combo_3[X+1].ItemIndex := 0;
+ end;
+ end;
+
+ if ShowModal = mrOK Then
+ begin
+ Result := True;
+ FilterStr := '';
+ LastFilter.Clear;
+ for X := 1 to 9 Do
+ begin
+ if (Combo_1[X].Text <> '') and (Combo_2[X].Text <> '') then
+ begin
+ if (Edit_1[X].Enabled=False) or (Edit_1[X].Text <> '') Then
+ begin
+ if X>1 Then
+ FilterStr := FilterStr+Combo_3[X-1].Text+' ';
+
+ C:=FGrid.ColumnByCaption(Combo_1[X].Text);
+ case C.Field.DataType of
+ ftDateTime ,
+ ftDate : FilterStr := FilterStr+'('+C.FieldName+Combo_2[X].Text+Char(39)+Copy(Edit_1[X].Text,7,4)+Copy(Edit_1[X].Text,3,4)+Copy(Edit_1[X].Text,1,2)+Copy(Edit_1[X].Text,11,9)+Char(39)+') ';
+ ftUnknown : FilterStr := FilterStr+'('+C.FieldName+Combo_2[X].Text+Edit_1[X].Text+') ';
+ ftTime,
+ ftString,
+ ftMemo : FilterStr := FilterStr+'('+C.FieldName+Combo_2[X].Text+QuotedString(Edit_1[X].Text, '''')+') ';
+ else
+ FilterStr := FilterStr+'('+C.FieldName+Combo_2[X].Text+Edit_1[X].Text+') ';
+ end;
+ LastFilter.Add(C.FieldName+'|||'+Combo_2[X].Text+'|||'+Edit_1[X].Text+'|||'+Combo_3[X].Text);
+ end;
+ end;
+ end;
+ end;
+end;
+
+Function TrxFilterByForm.FindCombo(CB:TComboBox):Integer;
+var
+ X : Integer;
+begin
+ Result :=0;
+ for X := 1 to 9 do
+ begin
+ if Combo_2[X]=CB Then
+ begin
+ Result := X;
+ Exit;
+ end;
+ end;
+end;
+
+function TrxFilterByForm.FindEdit(ED:TEdit):Integer;
+var
+ X : Integer;
+begin
+ Result :=0;
+ for X := 1 to 9 do
+ begin
+ if Edit_1[X]=ED then
+ begin
+ Result := X;
+ Exit;
+ end;
+ end;
+end;
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/rxhistory.pas b/components/rx/version/v2.2_laz_1.2/rxhistory.pas
new file mode 100644
index 000000000..2f92a1f66
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxhistory.pas
@@ -0,0 +1,191 @@
+unit RXHistory;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
+ rxtoolbar;
+
+type
+ TToolbarButtonStyleCntrl = (tbrcNotChange, tbrcDropDown, tbrcDropDownExtra);
+
+ PNavigateRec = ^TNavigateRec;
+ TNavigateRec = packed record
+ Name:string;
+ Cond:string;
+ Next:PNavigateRec;
+ end;
+
+ TOnNavigateEvent = procedure(Sender:TObject; const EventName, EventMacro:string) of object;
+ { TRXHistory }
+
+ TRXHistory = class(TComponent)
+ private
+ FButtonNext: string;
+ FButtonPrior: string;
+ FButtonStyle: TToolbarButtonStyleCntrl;
+ FNextButton: TToolbarItem;
+ FNextButtonName: string;
+ FOnNavigateEvent: TOnNavigateEvent;
+ FPriorButton: TToolbarItem;
+ FPriorButtonName: string;
+ FToolPanel: TToolPanel;
+ function GetNextButtonName: string;
+ function GetPriorButtonName: string;
+ procedure SetButtonStyle(const AValue: TToolbarButtonStyleCntrl);
+ procedure SetNextButtonName(const AValue: string);
+ procedure SetPriorButtonName(const AValue: string);
+ procedure SetToolPanel(const AValue: TToolPanel);
+ function SetBtn(const ABtnName: string;var Button:TToolbarItem):boolean;
+ protected
+ procedure Loaded; override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ property PriorButton:TToolbarItem read FPriorButton;
+ property NextButton:TToolbarItem read FNextButton;
+ published
+ property ToolPanel:TToolPanel read FToolPanel write SetToolPanel;
+ property PriorButtonName:string read GetPriorButtonName write SetPriorButtonName;
+ property NextButtonName:string read GetNextButtonName write SetNextButtonName;
+ property ButtonStyle:TToolbarButtonStyleCntrl read FButtonStyle write SetButtonStyle default tbrcNotChange;
+ property OnNavigateEvent:TOnNavigateEvent read FOnNavigateEvent write FOnNavigateEvent;
+ end;
+
+procedure Register;
+
+implementation
+uses PropEdits, Componenteditors, TypInfo;
+
+type
+
+ { TTRXHistoryBtnNameProperty }
+
+ TTRXHistoryBtnNameProperty = class(TStringPropertyEditor)
+ public
+ function GetAttributes: TPropertyAttributes; override;
+ procedure GetValues(Proc: TGetStrProc); override;
+ end;
+
+{ TTRXHistoryBtnNameProperty }
+
+function TTRXHistoryBtnNameProperty.GetAttributes: TPropertyAttributes;
+begin
+ Result:=inherited GetAttributes;
+ Result:=Result + [paValueList, paSortList, paMultiSelect];
+end;
+
+procedure TTRXHistoryBtnNameProperty.GetValues(Proc: TGetStrProc);
+var
+ ToolPanel:TToolPanel;
+ i:integer;
+begin
+ ToolPanel := GetObjectProp(GetComponent(0), 'ToolPanel') as TToolPanel;
+ if Assigned(ToolPanel) then
+ for I := 0 to ToolPanel.Items.Count - 1 do
+ begin
+ if Assigned(ToolPanel.Items[i].Action) then
+ Proc(ToolPanel.Items[i].Action.Name);
+ end;
+end;
+
+procedure Register;
+begin
+ RegisterComponents('RX',[TRXHistory]);
+
+ RegisterPropertyEditor(TypeInfo(string), TRXHistory, 'PriorButtonName', TTRXHistoryBtnNameProperty);
+ RegisterPropertyEditor(TypeInfo(string), TRXHistory, 'NextButtonName', TTRXHistoryBtnNameProperty);
+end;
+
+{ TRXHistory }
+
+procedure TRXHistory.SetToolPanel(const AValue: TToolPanel);
+begin
+ if FToolPanel=AValue then exit;
+ FToolPanel:=AValue;
+end;
+
+function TRXHistory.SetBtn(const ABtnName: string;var Button:TToolbarItem):boolean;
+var
+ i:integer;
+begin
+ Result:=false;
+ if not Assigned(FToolPanel) then exit;
+ Button:=FToolPanel.Items.ByActionName[ABtnName];
+ Result:=Assigned(Button);
+ if Result then
+ begin
+ case FButtonStyle of
+ tbrcDropDown:Button.ButtonStyle:=tbrDropDown;
+ tbrcDropDownExtra:Button.ButtonStyle:=tbrDropDownExtra;
+ end;
+ end;
+end;
+
+procedure TRXHistory.Loaded;
+begin
+ inherited Loaded;
+ if not SetBtn(FNextButtonName, FNextButton) then
+ FNextButtonName:='';
+ if not SetBtn(FPriorButtonName, FPriorButton) then
+ FPriorButtonName:='';
+end;
+
+constructor TRXHistory.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FButtonStyle:=tbrcNotChange;
+end;
+
+procedure TRXHistory.SetNextButtonName(const AValue: string);
+begin
+ if FNextButtonName=AValue then exit;
+ if csLoading in ComponentState then
+ FNextButtonName:=AValue
+ else
+ begin
+ if SetBtn(AValue, FNextButton) then
+ FNextButtonName:=AValue
+ else
+ FNextButtonName:='';
+ end;
+end;
+
+procedure TRXHistory.SetButtonStyle(const AValue: TToolbarButtonStyleCntrl);
+begin
+ if FButtonStyle=AValue then exit;
+ FButtonStyle:=AValue;
+end;
+
+function TRXHistory.GetNextButtonName: string;
+begin
+ if Assigned(NextButton) and Assigned(NextButton.Action) then
+ Result:=NextButton.Action.Name
+ else
+ Result:='';
+end;
+
+function TRXHistory.GetPriorButtonName: string;
+begin
+ if Assigned(PriorButton) and Assigned(PriorButton.Action) then
+ Result:=PriorButton.Action.Name
+ else
+ Result:='';
+end;
+
+procedure TRXHistory.SetPriorButtonName(const AValue: string);
+begin
+ if FPriorButtonName=AValue then exit;
+ if csLoading in ComponentState then
+ FPriorButtonName:=AValue
+ else
+ begin
+ if SetBtn(AValue, FPriorButton) then
+ FPriorButtonName:=AValue
+ else
+ FPriorButtonName:='';
+ end;
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxhistorynavigator.pas b/components/rx/version/v2.2_laz_1.2/rxhistorynavigator.pas
new file mode 100644
index 000000000..73f7397b3
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxhistorynavigator.pas
@@ -0,0 +1,463 @@
+{ RxHistoryNavigator unit
+
+ Copyright (C) 2005-2011 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit RxHistoryNavigator;
+
+{$I rx.inc}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, rxtoolbar,
+ Menus;
+
+type
+ PNavigateRec = ^TNavigateRec;
+ TNavigateRec = record
+ Name:string;
+ Cond:string;
+ Next:PNavigateRec;
+ end;
+
+type
+ TRxHistoryNavigator = class;
+ THistoryNavigateEvent = procedure(Sender:TRxHistoryNavigator; AInfo:string; AProcessed:boolean) of object;
+
+ { TRxHistoryNavigator }
+
+ TRxHistoryNavigator = class(TComponent)
+ private
+ FForwardBtnItem:TToolbarItem;
+ FForwardBtn: string;
+
+ FBackBtnItem:TToolbarItem;
+ FBackBtn: string;
+ First:PNavigateRec;
+ Curr:PNavigateRec;
+ FMaxPopupItems: integer;
+
+ FOnHistoryNavigate: THistoryNavigateEvent;
+ FToolPanel: TToolPanel;
+ PMBack:TPopupMenu;
+ PMForw:TPopupMenu;
+ function GetBackBtn: string;
+ function GetForwardBtn: string;
+ procedure SetBackBtn(AValue: string);
+ procedure SetForwardBtn(AValue: string);
+ procedure SetToolPanel(AValue: TToolPanel);
+ procedure ClearFromCurrent(var C:PNavigateRec);
+
+ procedure CreateBackMenu;
+ procedure CreateRetrMenu;
+
+ function Last:PNavigateRec;
+ function Prior(R:PNavigateRec):PNavigateRec;
+ procedure CheckTop;
+ procedure CheckBottom;
+ procedure EnableAction(ActName:byte; Enable:boolean);
+ procedure BackProc(Sender: TObject);
+ procedure ForwardProc(Sender: TObject);
+ procedure DoSetItems;
+ protected
+ function Navigate(ToTop:boolean; Count:integer):boolean;
+ procedure Loaded; override;
+ procedure Notification(AComponent: TComponent;
+ Operation: TOperation); override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure ClearHistory;
+ procedure AddToHistory(AHistoryCaption, AInfo:string);
+ published
+ property ToolPanel: TToolPanel read FToolPanel write SetToolPanel;
+ property BackBtn:string read GetBackBtn write SetBackBtn;
+ property ForwardBtn:string read GetForwardBtn write SetForwardBtn;
+ property OnHistoryNavigate:THistoryNavigateEvent read FOnHistoryNavigate write FOnHistoryNavigate;
+ property MaxPopupItems:integer read FMaxPopupItems write FMaxPopupItems default 10;
+ end;
+
+
+implementation
+uses ActnList, rxconst;
+
+ { TRxHistoryNavigator }
+
+procedure TRxHistoryNavigator.SetToolPanel(AValue: TToolPanel);
+begin
+ if FToolPanel=AValue then Exit;
+ FToolPanel:=AValue;
+end;
+
+procedure TRxHistoryNavigator.ClearFromCurrent(var C: PNavigateRec);
+var
+ R:PNavigateRec;
+begin
+ while C<>nil do
+ begin
+ R:=C;
+ C:=C^.Next;
+ Dispose(R);
+ end;
+end;
+
+procedure TRxHistoryNavigator.CreateRetrMenu;
+var i:integer;
+ S:PNavigateRec;
+ Item:TMenuItem;
+begin
+ if Curr=nil then exit;
+ PMForw.Items.Clear;
+ i:=0;
+ S:=Curr^.Next;
+ while (inil) do
+ begin
+ Item := TMenuItem.Create(Self);
+ Item.Caption := S^.Name;
+ Item.OnClick := @ForwardProc;
+ Item.Hint:=Format(sHistoryDesc, [S^.Cond]);
+ Item.Tag:=i;
+ PMForw.Items.Add(Item);
+ inc(i);
+ S:=S^.Next;
+ end;
+end;
+
+function TRxHistoryNavigator.Last: PNavigateRec;
+begin
+ if First=nil then Result:=nil
+ else
+ begin
+ Result:=First;
+ while Result^.Next<>nil do Result:=Result^.Next;
+ end;
+end;
+
+function TRxHistoryNavigator.Prior(R: PNavigateRec): PNavigateRec;
+var
+ L:PNavigateRec;
+begin
+ if First=nil then Result:=nil
+ else
+ begin
+ L:=First;
+ while (L^.Next<>nil) and (L^.Next<>R) do
+ begin
+ L:=L^.Next;
+ end;
+ if L^.Next=nil then Result:=nil else Result:=l;
+ end;
+end;
+
+procedure TRxHistoryNavigator.CheckTop;
+begin
+ EnableAction(0, (Curr<>nil) and (Curr<>First));
+end;
+
+
+procedure TRxHistoryNavigator.CheckBottom;
+begin
+ EnableAction(1, (Curr<>nil) and (Curr^.Next<>nil));
+end;
+
+procedure TRxHistoryNavigator.EnableAction(ActName: byte; Enable: boolean);
+begin
+ if First=nil then Enable:=false;
+ if ActName = 0 then
+ begin
+ if Assigned(FBackBtnItem) then
+ (FBackBtnItem.Action as TAction).Enabled:=Enable
+ end
+ else
+ if Assigned(FForwardBtnItem) then
+ (FForwardBtnItem.Action as TAction).Enabled:=Enable
+end;
+
+procedure TRxHistoryNavigator.BackProc(Sender: TObject);
+begin
+ Navigate(true, (Sender as TComponent).Tag);
+end;
+
+procedure TRxHistoryNavigator.ForwardProc(Sender: TObject);
+begin
+ Navigate(false, (Sender as TComponent).Tag);
+end;
+
+procedure TRxHistoryNavigator.DoSetItems;
+begin
+ if Assigned(FToolPanel) then
+ begin
+ FForwardBtnItem:=FToolPanel.Items.ByActionName[FForwardBtn];
+ if Assigned(FForwardBtnItem) then
+ begin
+ FForwardBtnItem.DropDownMenu:=PMForw;
+ FForwardBtnItem.Action.OnExecute:=@ForwardProc;
+ end;
+
+ FBackBtnItem:=FToolPanel.Items.ByActionName[FBackBtn];
+ if Assigned(FBackBtnItem) then
+ begin
+ FBackBtnItem.DropDownMenu:=PMBack;
+ FBackBtnItem.Action.OnExecute:=@BackProc;
+ end;
+ end;
+end;
+
+function TRxHistoryNavigator.Navigate(ToTop: boolean; Count: integer): boolean;
+var
+ F:boolean;
+ Condit: string;
+begin
+ Result:=false;
+ if First=nil then exit;
+ if ToTop then
+ begin
+ inc(Count);
+ repeat
+ Curr:=Prior(Curr);
+ if Curr=nil then Curr:=First;
+ Dec(Count);
+ until (Count=0) or (Curr=First);
+ Result:=true;
+ Condit:=Curr^.Cond;
+ CreateBackMenu;
+ CreateRetrMenu;
+ end
+ else
+ begin
+ inc(Count);
+ repeat
+ if Curr^.Next<>nil then Curr:=Curr^.Next;
+ Dec(Count);
+ until (Count=0) or (Curr^.Next=nil);
+ Result:=true;
+ Condit:=Curr^.Cond;
+ CreateRetrMenu;
+ CreateBackMenu;
+ end;
+ CheckTop;
+ CheckBottom;
+ F:=true;
+ if Assigned(FOnHistoryNavigate) and Assigned(Curr) then
+ FOnHistoryNavigate(Self, Condit, F);
+end;
+
+procedure TRxHistoryNavigator.Loaded;
+begin
+ inherited Loaded;
+ DoSetItems;
+ CheckTop;
+ CheckBottom;
+end;
+
+procedure TRxHistoryNavigator.Notification(AComponent: TComponent;
+ Operation: TOperation);
+begin
+ inherited Notification(AComponent, Operation);
+ if Operation = opRemove then
+ begin
+ if AComponent = FToolPanel then
+ begin
+ if Assigned(FForwardBtnItem) then
+ begin
+ FForwardBtnItem.Action.OnExecute:=nil;
+ FForwardBtnItem:=nil;
+ end;
+
+ if Assigned(FBackBtnItem) then
+ begin
+ FBackBtnItem.Action.OnExecute:=nil;
+ FBackBtnItem:=nil;
+ end;
+ end
+ else
+ if AComponent = Self then
+ begin
+ if Assigned(FForwardBtnItem) then
+ begin
+ FForwardBtnItem.Action.OnExecute:=nil;
+ FForwardBtnItem.DropDownMenu:=nil;
+ FForwardBtnItem:=nil;
+ end;
+
+ if Assigned(FBackBtnItem) then
+ begin
+ FBackBtnItem.Action.OnExecute:=nil;
+ FBackBtnItem.DropDownMenu:=nil;
+ FBackBtnItem:=nil;
+ end;
+ end;
+ end;
+end;
+
+procedure TRxHistoryNavigator.CreateBackMenu;
+var i:integer;
+ S:PNavigateRec;
+ Item:TMenuItem;
+begin
+ if Curr=nil then exit;
+ PMBack.Items.Clear;
+ i:=0;
+ S:=Curr;
+ while (iFirst) do
+ begin
+ Item := TMenuItem.Create(Self);
+ Item.Caption := S^.Name;
+ Item.OnClick := @BackProc;
+ Item.Hint:=Format(sHistoryDesc, [S^.Cond]);
+ Item.Tag:=i;
+ PMBack.Items.Add(Item);
+ inc(i);
+ S:=Prior(S);
+ end;
+end;
+
+constructor TRxHistoryNavigator.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ PMBack:=TPopupMenu.Create(Self);
+ PMBack.Parent:=Self;
+ PMForw:=TPopupMenu.Create(Self);
+ PMForw.Parent:=Self;
+ FMaxPopupItems:=10;
+end;
+
+destructor TRxHistoryNavigator.Destroy;
+begin
+ Curr:=nil;
+ ClearFromCurrent(First);
+ inherited Destroy;
+end;
+
+procedure TRxHistoryNavigator.ClearHistory;
+begin
+
+end;
+
+procedure TRxHistoryNavigator.AddToHistory(AHistoryCaption, AInfo: string);
+var
+ R, L:PNavigateRec;
+begin
+ New(R);
+ FillChar(R^, SizeOf(TNavigateRec), 0);
+ R^.Name:=AHistoryCaption;
+ R^.Cond:=AInfo;
+ if First<>nil then
+ begin
+ L:=Last;
+ if Curr<>L then ClearFromCurrent(Curr^.Next);
+ Curr^.Next:=R;
+ Curr:=R;
+ end
+ else
+ begin
+ First:=R;
+ Curr:=R;
+ end;
+ CreateBackMenu;
+ CreateRetrMenu;
+ CheckTop;
+ CheckBottom;
+end;
+
+procedure TRxHistoryNavigator.SetBackBtn(AValue: string);
+begin
+ if FBackBtn=AValue then Exit;
+
+ if ForwardBtn = AValue then
+ ForwardBtn:='';
+
+ FBackBtn:=AValue;
+
+ if Assigned(FBackBtnItem) then
+ begin
+ FBackBtnItem.DropDownMenu:=nil;
+ FBackBtnItem.Action.OnExecute:=nil;
+ end;
+
+ if Assigned(FToolPanel) and (FBackBtn<>'') then
+ begin
+ FBackBtnItem:=FToolPanel.Items.ByActionName[FBackBtn];
+ if Assigned(FBackBtnItem) then
+ begin
+ FBackBtnItem.DropDownMenu:=PMBack;
+ FBackBtnItem.Action.OnExecute:=@BackProc;
+ end;
+ end
+ else
+ FBackBtnItem:=nil;
+end;
+
+function TRxHistoryNavigator.GetBackBtn: string;
+begin
+ if Assigned(FBackBtnItem) then
+ Result:=FBackBtnItem.Action.Name
+ else
+ Result:=FBackBtn;
+end;
+
+function TRxHistoryNavigator.GetForwardBtn: string;
+begin
+ if Assigned(FForwardBtnItem) then
+ Result:=FForwardBtnItem.Action.Name
+ else
+ Result:=FForwardBtn;
+end;
+
+procedure TRxHistoryNavigator.SetForwardBtn(AValue: string);
+begin
+ if FForwardBtn=AValue then Exit;
+
+ if BackBtn = AValue then
+ BackBtn:='';
+
+ FForwardBtn:=AValue;
+
+
+ if Assigned(FForwardBtnItem) then
+ begin
+ FForwardBtnItem.DropDownMenu:=nil;
+ FForwardBtnItem.Action.OnExecute:=nil;
+ end;
+
+ if Assigned(FToolPanel) and (AValue <>'') then
+ begin
+ FForwardBtnItem:=FToolPanel.Items.ByActionName[FForwardBtn];
+ if Assigned(FForwardBtnItem) then
+ begin
+ FForwardBtnItem.DropDownMenu:=PMForw;
+ FForwardBtnItem.Action.OnExecute:=@ForwardProc;
+ end;
+ end
+ else
+ FForwardBtnItem:=nil;
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxiconv.pas b/components/rx/version/v2.2_laz_1.2/rxiconv.pas
new file mode 100644
index 000000000..b9619247a
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxiconv.pas
@@ -0,0 +1,439 @@
+(*
+ A.Voitov zprokuror(cyka)narod.ru
+ LAZARUS-FPC-LINUX codeset conversion routines
+
+ The goal is easy-and-on-fly *.lrs conversion from codeset used by developer to
+ user's system codeset without gettext, without separate message files etc.
+
+ Now I only have to set my codeset below (by default it's mine - UTF-8) -
+ DON'T FORGET ABOUT IT -
+ and call LocalizeForm('TFormClassName') right after {$I TFormClassName.lrs} -
+ see example below.
+ This way form resource file will be converted to system codeset when form is
+ creating.
+
+ For gtk/gnome there's only one conversion routine
+ function Localize(source:string):ansistring;
+ For gtk2 resource MUST, I guess, be converted to UTF-8 anyway (if it's not yet),
+ so I set current_codeset to UTF-8 with FORCE_UTF8 definition. Though if
+ developer's codeset is UTF-8 then no form resource conversion needed.
+
+ Localize is published function so it can be used again to convert string constants,
+ resource strings in most cases with no care about user's and developer's codeset.
+ But it's not enough sometime (file names, inifiles etc. can be wrong when gtk2
+ works in koi8-r locale).
+ That's why we've got some stuff th handle it without care.
+ 1. First one is TIconv object (I'm not sure it's best way to do maybe it would class?
+ if so uncomment $DEFINE OBJ_IS_CLASS below)
+ 2. Second are uiconv_xxx functions
+ They can be used to easy implement any valid conversions.
+
+ EXAMPLES:
+ 1. Auto form conversion
+ - set my codeset below: {$DEFINE DC_UTF8}
+ - add LocalizeForm('TFormClassName') after {$I TFormClassName.lrs}
+
+ unit1;
+ [...]
+ initialization
+ {$I unit1.lrs}
+ LocalizeForm('TForm1');
+ end.
+
+ 2. TIconv object example:
+ object is local variable here, but it can be global (create at startup,
+ dead in the end) if it's always in-use.
+
+ function koi8r_to_utf8(S:string):string;
+ var iConverter:pIconv;
+ begin
+ iConverter:=NewIconv('CP1251', 'UTF-8');
+ Result:=iConverter.iconv(S);
+ iConverter.Free;
+ end;
+
+ 3. uiconv_xxx example - obvious.
+
+ APPENDIX
+ i. KNOWN DEVELOPER'S CODESET DEFENITIONS:
+ $DC_KOI8 (obvious)
+ $DC_UTF8 (obvious) - default
+ $DC_WIN (CP1251) - not tested yet
+ ii. GTK2 NOTES
+ As I found there's something wrong with some strings when gtk2 is used under
+ koi8-r locale. OpenDialog.FileName is stored in my inifile as koi8-r string
+ and then can't be loaded in MRU menu.
+ So I've got a couple of functions here for that case: str2gtk and gtk2str.
+ 'str' means current codeset (locale)
+ iii. This unit tested with dc_utf8 and user's locale koi8-r only
+*)
+
+unit rxiconv;
+{* Developer's codeset. Must be set on design-time. Default is UTF8}
+{.$DEFINE DC_KOI8}
+{$DEFINE DC_WIN}
+{.$DEFINE DC_UTF8} //nothing defined so DC_UTF8 will be defined here
+{$IFNDEF DC_UTF8}
+ {$IFNDEF DC_KOI8}
+ {$IFNDEF DC_WIN}
+ {$DEFINE DC_UTF8}
+ {$ENDIF DC_WIN}
+ {$ENDIF DC_KOI8}
+{$ENDIF DC_UTF8}
+
+{* user acces to iconv functions}
+{$DEFINE USER_ICONV}
+{* TIconv object}
+{$DEFINE USE_OBJECT}
+{* Ticonv is class(TObject)}
+{$DEFINE OBJ_IS_CLASS}
+
+{* form-localization needed only with gtk1 or with gtk2 if developer's codeset
+is not utf-8. First turn it of.}
+{$UNDEF USE_LOCALIZE}
+{* if widgetset is GTK2 ($IFDEF LCLGtk2) and developer's codeset is not DC_UTF8
+ then we'd FORCE_UTF8 and turn on USE_LOCALIZE. And if widgetset is GTK1 then
+ we USE_LOCALIZE too.}
+{$IFDEF LCLGtk2}
+ {$IFNDEF DC_UTF8}
+ {$DEFINE USE_LOCALIZE}
+ {$DEFINE FORCE_UTF8}
+ {$ENDIF DC_UTF8}
+{$ELSE LCLGtk2}
+ {$DEFINE USE_LOCALIZE}
+{$ENDIF LCLGtk2}
+
+{$mode objfpc}
+interface
+
+{$IFNDEF WINDOWS}
+uses
+ {$IFDEF USE_LOCALIZE} LResources, Classes,{$ENDIF} initc, SysUtils;
+
+ {* returns current codeset}
+ function GetCodeset():ansistring;
+ {$IFDEF USE_LOCALIZE}
+ {* returns true if current codeset<>developer's codeset}
+ function InvalidCodeset():boolean;
+ {$ENDIF USE_LOCALIZE}
+ {* basic string conversion - enough for localization.
+ conversion from developer's codeset 2 user's codeset}
+ function Localize(source:ansistring):ansistring;
+ {with gtk2 converts utf8 to locale codeset and back}
+ {$IFDEF LCLGtk2}
+ function str2gtk(source:ansistring):ansistring;
+ function gtk2str(source:ansistring):ansistring;
+ {$ENDIF LCLGtk2}
+ {* public access 2 iconv}
+ {$IFDEF USER_ICONV}
+ function uiconv(ic_usr:pointer; source:ansistring):ansistring ;
+ function uiconv_open(ic_from, ic_to:ansistring):pointer ;
+ procedure uiconv_close(ic_usr:pointer) ;
+ {$ENDIF USER_ICONV}
+ {* form conversion}
+ procedure LocalizeForm(form_classname:ansistring);
+ procedure LocalizeAllForm;
+
+{* iconv object/class}
+{$IFDEF USE_OBJECT}
+ type
+ {$IFDEF OBJ_IS_CLASS}
+ Ticonv=class(TObject)
+ {$ELSE OBJ_IS_CLASS}
+ pIconv=^Ticonv;
+ Ticonv=object
+ protected
+ {$ENDIF OBJ_IS_CLASS}
+ hIconv:pointer;
+ public
+ destructor Destroy;{$IFDEF OBJ_IS_CLASS}virtual;{$ENDIF OBJ_IS_CLASS}
+ {$IFNDEF OBJ_IS_CLASS}
+ procedure Free;
+ {$ENDIF OBJ_IS_CLASS}
+ constructor Create{$IFDEF OBJ_IS_CLASS}(cs_from, cs_to:ansistring){$ENDIF OBJ_IS_CLASS};
+ function iconv(source:ansistring):ansistring;
+ end;
+ {$IFNDEF OBJ_IS_CLASS}
+ function NewIconv(cs_from, cs_to:ansistring):TIconv ;
+ {$ENDIF OBJ_IS_CLASS}
+{$ENDIF USE_OBJECT}
+{$ENDIF}
+implementation
+{$IFNDEF WINDOWS}
+uses dialogs;
+{$linklib c}
+
+const
+ libiconvname='c';
+ __LC_CTYPE = 0;
+ _NL_CTYPE_CLASS = (__LC_CTYPE shl 16);
+ _NL_CTYPE_CODESET_NAME = (_NL_CTYPE_CLASS)+14;
+ CODESET = _NL_CTYPE_CODESET_NAME;
+{developer's codeset names}
+{$IFDEF DC_KOI8}
+ DEV_CODESET='KOI8-R';
+ DC_NAME='KOI';
+ DC_NAME_EXT='R';
+{$ENDIF DC_KOI8}
+{$IFDEF DC_UTF8}
+ DEV_CODESET='UTF-8';
+ DC_NAME='UTF';
+ DC_NAME_EXT='8';
+{$ENDIF DC_UTF8}
+{$IFDEF DC_WIN}
+ DEV_CODESET='CP1251';
+ DC_NAME='1251';
+ DC_NAME_EXT='1251';
+{$ENDIF DC_WIN}
+
+type
+ size_t = cardinal;
+ pSize = ^size_t;
+ psize_t = pSize;
+ cInt = longint;
+ piconv_t = ^iconv_t;
+ iconv_t = pointer;
+ nl_item = cint;
+
+var //iconv pointers
+ {$IFDEF LCLGtk2}
+ ic_str2gtk, ic_gtk2str,
+ {$ENDIF LCLGtk2}
+ ic_localize : iconv_t;
+
+function nl_langinfo(__item:nl_item):pchar;cdecl;external libiconvname name 'nl_langinfo';
+function iconv_open(__tocode:pchar; __fromcode:pchar):iconv_t;cdecl;external libiconvname name 'iconv_open';
+function iconv(__cd:iconv_t; __inbuf:ppchar; __inbytesleft:psize_t; __outbuf:ppchar; __outbytesleft:psize_t):size_t;cdecl;external libiconvname name 'iconv';
+function iconv_close(__cd:iconv_t):cint;cdecl;external libiconvname name 'iconv_close';
+
+{* common procedures}
+function GetCodeset():ansistring;
+begin
+Result:= ansistring(nl_langinfo(CODESET));
+end;
+
+function CodesetIs(CSNAME, CSEXT:ansistring):boolean ;
+var CS:ansistring;
+begin
+ CS:=UpperCase(GetCodeSet);
+ if ((pos(CSNAME,CS)<>0) and (pos(CSEXT,CS)<>0)) then Result:=true else Result:=false;
+end;
+
+{* main conversion procedure}
+function _iconv(hiconv:iconv_t; source:ansistring):ansistring;
+ const
+ ESysEILSEQ = 84;
+ ESysE2BIG = 7;
+ var
+ len:SizeInt;
+ outlength,
+ outoffset,
+ outleft : size_t;
+ srcpos,
+ destpos: pchar;
+ mynil : pchar;
+ my0 : size_t;
+begin
+ mynil:=nil;
+ my0:=0;
+ // extra space
+ len:=length(source);
+ outlength:=len*3+1; //setlength(result,outlength);
+ Result:=StringOfChar(#0, outlength);
+ //outlength:=len+1;
+ srcpos:=pChar(source);
+ destpos:=pchar(result);
+ outleft:=outlength*2;
+ while iconv(hiconv,@srcpos,@len,@destpos,@outleft)=size_t(-1) do
+ begin
+ case fpgetCerrno of
+ ESysEILSEQ:
+ begin
+ { skip and set to '?' }
+ inc(srcpos);
+ pwidechar(destpos)^:='?';
+ inc(destpos,2);
+ dec(outleft,2);
+ { reset }
+ iconv(hiconv,@mynil,@my0,@mynil,@my0);
+ end;
+ ESysE2BIG:
+ begin
+ outoffset:=destpos-pchar(result);
+ { extend }
+ setlength(result,outlength+len);
+ inc(outleft,len*2);
+ inc(outlength,len);
+ { string could have been moved }
+ destpos:=pchar(result)+outoffset;
+ end;
+ else
+ raise EConvertError.Create('iconv error '+IntToStr(fpgetCerrno));
+ end;
+ end;
+ //setlength(result,length(result)-outleft div 2); // truncate string
+ Result:=TrimRight(Result);// not shure it always works right
+end;
+
+{$IFDEF USE_OBJECT}
+{* Ticonv *}
+{$IFNDEF OBJ_IS_CLASS}
+function _NewIconv(cs_from, cs_to:ansistring):pIconv ;
+begin
+ New( Result, Create);
+ Result^.hIconv:=Pointer(iconv_open(pChar(cs_to), pChar(cs_from)));
+end;
+
+function NewIconv(cs_from, cs_to:ansistring):TIconv ;
+begin
+ Result:=_NewIconv(cs_from, cs_to)^;
+end;
+
+procedure Ticonv.Free();
+begin
+ if @Self<>nil then Self.Destroy;
+end;
+{$ENDIF OBJ_IS_CLASS}
+
+constructor Ticonv.Create{$IFDEF OBJ_IS_CLASS}(cs_from, cs_to:ansistring){$ENDIF OBJ_IS_CLASS};
+begin {$IFDEF OBJ_IS_CLASS}
+inherited Create;
+hIconv:=Pointer(iconv_open(pChar(cs_to), pChar(cs_from)));
+{$ENDIF OBJ_IS_CLASS}
+end;
+
+destructor Ticonv.Destroy;
+begin
+ iconv_close(hIconv);
+ Inherited;
+end;
+
+function Ticonv.iconv(source:ansistring):ansistring;
+begin
+ Result:=_iconv(hIconv, source);
+end;
+{$ENDIF USE_OBJECT}
+
+{$IFDEF USER_ICONV}
+function uiconv(ic_usr:pointer; source:ansistring):ansistring ;
+begin
+ Result:=_iconv(iconv_t(ic_usr), pchar(source));
+end;
+
+function uiconv_open(ic_from, ic_to:ansistring):pointer ;
+begin
+ Result:= iconv_open(pchar(ic_to), pchar(ic_from));
+end;
+
+procedure uiconv_close(ic_usr:pointer) ;
+begin
+ iconv_close(iconv_t(ic_usr));
+end;
+{$ENDIF USER_ICONV}
+
+function Localize(source:ansistring):ansistring;
+begin
+ Result:=_iconv(ic_localize, source);
+end;
+
+{$IFDEF LCLGtk2}
+function str2gtk(source:ansistring):ansistring;
+begin
+ Result:=_iconv(ic_str2gtk, source);
+end;
+
+function gtk2str(source:ansistring):ansistring;
+begin
+ Result:=_iconv(ic_gtk2str, source);
+end;
+{$ENDIF LCLGtk2}
+
+{* form localization - only if use_localize}
+{$IFDEF USE_LOCALIZE}
+function InvalidCodeset():boolean;
+begin
+Result:=False;
+{$IFNDEF FORCE_UTF8} Result:= not (CodesetIs(DC_NAME, DC_NAME_EXT));{$ENDIF FORCE_UTF8}
+end;
+
+{* converts form resource from developer's codeset to env codeset.
+ it's empty procedure if widgetSet is gtk2 and dev's codeset is utf8.
+ So USE_LOCCALIZE definition used }
+procedure LocalizeForm(form_classname:ansistring);
+ var res : TLResource;
+ S : ansistring;
+ RS, MS : TMemoryStream;
+begin
+ {$IFNDEF FORCE_UTF8} //always convert to utf8
+ if not InvalidCodeset then exit;
+ {$ENDIF FORCE_UTF8}
+ {find resource}
+ res:=LazarusResources.Find(form_classname);
+ RS:=TMemoryStream.create;
+ MS:=TMemoryStream.create;
+ {read form 2 RS}
+ RS.Write(res.Value[1],length(res.Value));
+ RS.Position:=0;
+ {convert 2 text}
+ LRSObjectBinaryToText( RS, MS);
+ MS.Position:=0;
+ {copy 2 string}
+ SetLength(S, MS.Size);
+ MS.Read(S[1], MS.Size);
+ {convert 2 ccs or utf8 - under gtk2}
+ S:=Localize(S);
+ {copy back to ms}
+ S:=Trim(S) + #0#0#0#0; //doesn't work without it...
+ MS.Position:=0;
+ MS.Write(S[1],length(S));
+ MS.Position:=0;
+ RS.SetSize(0);
+ {convert 2 binary RS}
+ LRSObjectTextToBinary(MS, RS);
+ RS.Position:=0;
+ SetLength(S, RS.Size);
+ {write 2 resource}
+ RS.Read(S[1],RS.Size);
+ res.Value:=S;
+ MS.Free; RS.Free;
+end;
+
+procedure LocalizeAllForm;
+var
+ i:integer;
+begin
+ for i:=0 to LazarusResources.Count - 1 do
+ begin
+ if LazarusResources.Items[i].ValueType = 'FORMDATA' then
+ LocalizeForm(LazarusResources.Items[i].Name);
+ end;
+end;
+
+{$ELSE USE_LOCALIZE}
+{* dummy proc for easy testing}
+procedure LocalizeForm(form_classname:ansistring);begin {*} end;
+
+procedure LocalizeAllForm;
+begin
+end;
+
+{$ENDIF USE_LOCALIZE}
+
+initialization
+{$IFNDEF FORCE_UTF8}
+ ic_localize := iconv_open(nl_langinfo(CODESET), DEV_CODESET); //main
+{$ELSE FORCE_UTF8}
+ ic_localize := iconv_open('UTF-8', DEV_CODESET);
+{$ENDIF FORCE_UTF8}
+{$IFDEF LCLGtk2}
+ ic_str2gtk:= iconv_open('UTF-8', nl_langinfo(CODESET));
+ ic_gtk2str:= iconv_open(nl_langinfo(CODESET), 'UTF-8');
+{$ENDIF LCLGtk2}
+finalization
+ iconv_close(ic_localize);
+{$IFDEF LCLGtk2}
+ iconv_close(ic_str2gtk);
+ iconv_close(ic_gtk2str);
+{$ENDIF LCLGtk2}
+{$ENDIF}
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxinipropstorage.pas b/components/rx/version/v2.2_laz_1.2/rxinipropstorage.pas
new file mode 100644
index 000000000..9fe459fee
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxinipropstorage.pas
@@ -0,0 +1,83 @@
+{ RegisterRxTools unit
+
+ Copyright (C) 2005-2013 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit RxIniPropStorage;
+
+{$I rx.inc}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, IniPropStorage;
+
+type
+
+ { TRxIniPropStorage }
+
+ TRxIniPropStorage = class(TIniPropStorage)
+ private
+ FSeparateFiles: boolean;
+ protected
+ function GetIniFileName: string; override;
+ public
+ { Public declarations }
+ published
+ property SeparateFiles:boolean read FSeparateFiles write FSeparateFiles;
+ end;
+
+implementation
+uses rxapputils, LazUTF8, FileUtil;
+
+{ TRxIniPropStorage }
+
+function TRxIniPropStorage.GetIniFileName: string;
+var
+ S:string;
+begin
+ if ExtractFileDir(IniFileName) <> '' then
+ Result:=IniFileName
+ else
+ begin
+ S:=GetDefaultIniName;
+ if IniFileName <> '' then
+ Result:=AppendPathDelim(ExtractFileDir(S)) + IniFileName
+ else
+ begin
+ if FSeparateFiles then
+ Result:=AppendPathDelim(ExtractFileDir(S)) + RootSection + '.cfg'
+ else
+ Result:=S;
+ end;
+ end;
+ Result:=UTF8ToSys(Result);
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxlogin.lfm b/components/rx/version/v2.2_laz_1.2/rxlogin.lfm
new file mode 100644
index 000000000..420c45215
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxlogin.lfm
@@ -0,0 +1,376 @@
+object RxLoginForm: TRxLoginForm
+ Cursor = crArrow
+ Left = 458
+ Height = 203
+ Top = 193
+ Width = 455
+ ActiveControl = UserNameEdit
+ BorderIcons = [biSystemMenu, biHelp]
+ Caption = 'RxLoginForm'
+ ClientHeight = 203
+ ClientWidth = 455
+ FormStyle = fsStayOnTop
+ OnCreate = FormCreate
+ OnShow = FormShow
+ Position = poScreenCenter
+ LCLVersion = '0.9.29'
+ object AppIcon: TImage
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = Owner
+ Left = 6
+ Height = 32
+ Top = 6
+ Width = 32
+ AutoSize = True
+ BorderSpacing.Around = 6
+ end
+ object KeyImage: TImage
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = Owner
+ Left = 6
+ Height = 32
+ Top = 6
+ Width = 32
+ AutoSize = True
+ BorderSpacing.Around = 6
+ Picture.Data = {
+ 055449636F6EBE1000000000010001002020000001002000A810000016000000
+ 2800000020000000400000000100200000000000001000006400000064000000
+ 0000000000000000000000FF000000FF000000FF000000FF000000FF000000FF
+ 000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+ 000000FF000000FF000000FF000000FF000000FF000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF000000FFFFFFFFFF
+ 000000FF000000FFFFFFFFFFFFFFFFFF000000FF000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000808080FFFFFFFFFFFFFFFFFF808080FF000000FF000000FF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF000000FFFFFFFFFF
+ 000000FF000000FFFFFFFFFFFFFFFFFF000000FF000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000808080FFFFFFFFFF808080FF000000FF808080FF000000FF
+ 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF000000FFFFFFFFFF
+ 000000FF000000FFFFFFFFFFFFFFFFFF000000FF000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000808080FFFFFFFFFF000000FF000000FFFFFFFFFFFFFFFFFF
+ 000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+ 000000FF000000FF000000FFFFFFFFFF000000FF000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000808080FFFFFFFFFF000000FF000000FFFFFFFFFFFFFFFFFF
+ 000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF
+ 000000FF000000FF000000FFFFFFFFFF000000FF000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000808080FFFFFFFFFF808080FF000000FF808080FF000000FF
+ 000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000808080FFFFFFFFFFFFFFFFFF808080FF000000FF000000FF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000808080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000808080FF808080FF808080FF808080FF808080FF808080FF
+ 808080FF808080FF808080FF808080FF808080FF808080FF808080FF808080FF
+ 808080FF808080FF808080FF808080FF000000FF000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000
+ }
+ end
+ object HintLabel: TLabel
+ AnchorSideLeft.Control = AppIcon
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = Owner
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ Left = 44
+ Height = 18
+ Top = 6
+ Width = 405
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Around = 6
+ Caption = 'HintLabel'
+ ParentColor = False
+ ShowAccelChar = False
+ end
+ object UserNameLabel: TLabel
+ AnchorSideLeft.Control = Owner
+ AnchorSideBottom.Control = UserNameEdit
+ AnchorSideBottom.Side = asrBottom
+ Left = 6
+ Height = 18
+ Top = 65
+ Width = 73
+ Anchors = [akLeft, akBottom]
+ BorderSpacing.Left = 6
+ Caption = 'UserName'
+ FocusControl = UserNameEdit
+ ParentColor = False
+ end
+ object PasswordLabel: TLabel
+ AnchorSideLeft.Control = Owner
+ AnchorSideBottom.Control = PasswordEdit
+ AnchorSideBottom.Side = asrBottom
+ Left = 6
+ Height = 18
+ Top = 100
+ Width = 67
+ Anchors = [akLeft, akBottom]
+ BorderSpacing.Left = 6
+ Caption = 'Password'
+ FocusControl = PasswordEdit
+ ParentColor = False
+ end
+ object AppTitleLabel: TLabel
+ AnchorSideLeft.Control = AppIcon
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = HintLabel
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ Left = 44
+ Height = 18
+ Top = 30
+ Width = 405
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Around = 6
+ Caption = 'AppTitleLabel'
+ ParentColor = False
+ ShowAccelChar = False
+ end
+ object DataBaseLabel: TLabel
+ AnchorSideLeft.Control = Owner
+ AnchorSideBottom.Control = CustomCombo
+ AnchorSideBottom.Side = asrBottom
+ Left = 6
+ Height = 18
+ Top = 137
+ Width = 67
+ Anchors = [akLeft, akBottom]
+ BorderSpacing.Left = 6
+ Caption = 'Database'
+ FocusControl = CustomCombo
+ ParentColor = False
+ end
+ object UserNameEdit: TEdit
+ AnchorSideLeft.Control = UserNameLabel
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = AppTitleLabel
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ Cursor = crIBeam
+ Left = 97
+ Height = 29
+ Top = 54
+ Width = 352
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Left = 12
+ BorderSpacing.Around = 6
+ TabOrder = 0
+ end
+ object PasswordEdit: TEdit
+ AnchorSideLeft.Control = UserNameEdit
+ AnchorSideTop.Control = UserNameEdit
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = UserNameEdit
+ AnchorSideRight.Side = asrBottom
+ Cursor = crIBeam
+ Left = 97
+ Height = 29
+ Top = 89
+ Width = 352
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Top = 6
+ EchoMode = emPassword
+ PasswordChar = '*'
+ TabOrder = 1
+ end
+ object CustomCombo: TComboBox
+ AnchorSideLeft.Control = UserNameEdit
+ AnchorSideTop.Control = PasswordEdit
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = UserNameEdit
+ AnchorSideRight.Side = asrBottom
+ Left = 97
+ Height = 31
+ Top = 124
+ Width = 352
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Top = 6
+ ItemHeight = 0
+ Style = csDropDownList
+ TabOrder = 2
+ end
+ object btnOK: TBitBtn
+ AnchorSideLeft.Control = PasswordEdit
+ AnchorSideTop.Control = btnCancel
+ AnchorSideRight.Control = btnCancel
+ AnchorSideBottom.Control = Owner
+ AnchorSideBottom.Side = asrBottom
+ Left = 187
+ Height = 36
+ Top = 161
+ Width = 60
+ Anchors = [akTop, akRight, akBottom]
+ AutoSize = True
+ BorderSpacing.Right = 6
+ BorderSpacing.Bottom = 6
+ BorderSpacing.InnerBorder = 2
+ Caption = '&ОК'
+ Default = True
+ Kind = bkOK
+ ModalResult = 1
+ OnClick = btnOKClick
+ TabOrder = 3
+ end
+ object btnCancel: TBitBtn
+ AnchorSideTop.Control = CustomCombo
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = btnHelp
+ AnchorSideBottom.Control = Owner
+ AnchorSideBottom.Side = asrBottom
+ Left = 253
+ Height = 36
+ Top = 161
+ Width = 95
+ Anchors = [akRight, akBottom]
+ AutoSize = True
+ BorderSpacing.Around = 6
+ BorderSpacing.InnerBorder = 2
+ Cancel = True
+ Caption = 'Отмена'
+ Kind = bkCancel
+ ModalResult = 2
+ TabOrder = 4
+ end
+ object btnHelp: TBitBtn
+ AnchorSideTop.Control = btnCancel
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ AnchorSideBottom.Control = Owner
+ AnchorSideBottom.Side = asrBottom
+ Left = 354
+ Height = 36
+ Top = 161
+ Width = 95
+ Anchors = [akTop, akRight, akBottom]
+ AutoSize = True
+ BorderSpacing.Right = 6
+ BorderSpacing.Bottom = 6
+ Caption = '&Справка'
+ Kind = bkHelp
+ TabOrder = 5
+ end
+ object btnMore: TBitBtn
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = btnCancel
+ AnchorSideBottom.Control = Owner
+ AnchorSideBottom.Side = asrBottom
+ Left = 6
+ Height = 36
+ Top = 161
+ Width = 78
+ Anchors = [akTop, akLeft, akBottom]
+ AutoSize = True
+ BorderSpacing.Left = 6
+ BorderSpacing.Bottom = 6
+ Caption = 'More >>'
+ OnClick = btnMoreClick
+ TabOrder = 6
+ end
+end
diff --git a/components/rx/version/v2.2_laz_1.2/rxlogin.lrs b/components/rx/version/v2.2_laz_1.2/rxlogin.lrs
new file mode 100644
index 000000000..70f85c67d
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxlogin.lrs
@@ -0,0 +1,219 @@
+{ This is an automatically generated lazarus resource file }
+
+LazarusResources.Add('TRxLoginForm','FORMDATA',[
+ 'TPF0'#12'TRxLoginForm'#11'RxLoginForm'#6'Cursor'#7#7'crArrow'#4'Left'#3#202#1
+ +#6'Height'#3#203#0#3'Top'#3#193#0#5'Width'#3#199#1#13'ActiveControl'#7#12'Us'
+ +'erNameEdit'#11'BorderIcons'#11#12'biSystemMenu'#6'biHelp'#0#7'Caption'#6#11
+ +'RxLoginForm'#12'ClientHeight'#3#203#0#11'ClientWidth'#3#199#1#9'FormStyle'#7
+ +#11'fsStayOnTop'#8'OnCreate'#7#10'FormCreate'#6'OnShow'#7#8'FormShow'#8'Posi'
+ +'tion'#7#14'poScreenCenter'#10'LCLVersion'#6#6'0.9.29'#0#6'TImage'#7'AppIcon'
+ +#22'AnchorSideLeft.Control'#7#5'Owner'#21'AnchorSideTop.Control'#7#5'Owner'#4
+ +'Left'#2#6#6'Height'#2' '#3'Top'#2#6#5'Width'#2' '#8'AutoSize'#9#20'BorderSp'
+ +'acing.Around'#2#6#0#0#6'TImage'#8'KeyImage'#22'AnchorSideLeft.Control'#7#5
+ +'Owner'#21'AnchorSideTop.Control'#7#5'Owner'#4'Left'#2#6#6'Height'#2' '#3'To'
+ +'p'#2#6#5'Width'#2' '#8'AutoSize'#9#20'BorderSpacing.Around'#2#6#12'Picture.'
+ +'Data'#10#200#16#0#0#5'TIcon'#190#16#0#0#0#0#1#0#1#0' '#0#0#1#0' '#0#168#16
+ +#0#0#22#0#0#0'('#0#0#0' '#0#0#0'@'#0#0#0#1#0' '#0#0#0#0#0#0#16#0#0'd'#0#0#0
+ +'d'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#128#128#128#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#128#128#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#128#128
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#0#0#0#255#0#0#0#255#255#255#255#255#0#0#0#255#0#0#0#255#255#255
+ +#255#255#255#255#255#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#128#128
+ +#255#255#255#255#255#255#255#255#255#128#128#128#255#0#0#0#255#0#0#0#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#0#0#0#255#0#0#0#255#255#255#255#255#0#0#0#255#0#0#0#255#255#255#255#255#255
+ +#255#255#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#128#128#255#255#255
+ +#255#255#128#128#128#255#0#0#0#255#128#128#128#255#0#0#0#255#0#0#0#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#0#0#0#255#0#0#0
+ +#255#255#255#255#255#0#0#0#255#0#0#0#255#255#255#255#255#255#255#255#255#0#0
+ +#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#128#128#255#255#255#255#255#0#0#0#255
+ +#0#0#0#255#255#255#255#255#255#255#255#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0
+ +#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+ +#255#255#255#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#128#128#255#255
+ +#255#255#255#0#0#0#255#0#0#0#255#255#255#255#255#255#255#255#255#0#0#0#255#0
+ +#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+ +#255#0#0#0#255#0#0#0#255#255#255#255#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#128#128#128#255#255#255#255#255#128#128#128#255#0#0#0#255#128#128#128#255
+ +#0#0#0#255#0#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#128#128#128#255#255#255#255#255#255#255#255#255#128#128#128#255#0#0#0
+ +#255#0#0#0#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#0#0#0#255#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#128#128#128#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ ,#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255
+ +#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#128#128#128#255#128#128#128#255
+ +#128#128#128#255#128#128#128#255#128#128#128#255#128#128#128#255#128#128#128
+ +#255#128#128#128#255#128#128#128#255#128#128#128#255#128#128#128#255#128#128
+ +#128#255#128#128#128#255#128#128#128#255#128#128#128#255#128#128#128#255#128
+ +#128#128#255#128#128#128#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#6'TLabel'#9'HintLabel'#22
+ +'AnchorSideLeft.Control'#7#7'AppIcon'#19'AnchorSideLeft.Side'#7#9'asrBottom'
+ +#21'AnchorSideTop.Control'#7#5'Owner'#23'AnchorSideRight.Control'#7#5'Owner'
+ +#20'AnchorSideRight.Side'#7#9'asrBottom'#4'Left'#2','#6'Height'#2#18#3'Top'#2
+ +#6#5'Width'#3#149#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#20'BorderS'
+ +'pacing.Around'#2#6#7'Caption'#6#9'HintLabel'#11'ParentColor'#8#13'ShowAccel'
+ +'Char'#8#0#0#6'TLabel'#13'UserNameLabel'#22'AnchorSideLeft.Control'#7#5'Owne'
+ +'r'#24'AnchorSideBottom.Control'#7#12'UserNameEdit'#21'AnchorSideBottom.Side'
+ +#7#9'asrBottom'#4'Left'#2#6#6'Height'#2#18#3'Top'#2'A'#5'Width'#2'I'#7'Ancho'
+ +'rs'#11#6'akLeft'#8'akBottom'#0#18'BorderSpacing.Left'#2#6#7'Caption'#6#8'Us'
+ +'erName'#12'FocusControl'#7#12'UserNameEdit'#11'ParentColor'#8#0#0#6'TLabel'
+ +#13'PasswordLabel'#22'AnchorSideLeft.Control'#7#5'Owner'#24'AnchorSideBottom'
+ +'.Control'#7#12'PasswordEdit'#21'AnchorSideBottom.Side'#7#9'asrBottom'#4'Lef'
+ +'t'#2#6#6'Height'#2#18#3'Top'#2'd'#5'Width'#2'C'#7'Anchors'#11#6'akLeft'#8'a'
+ +'kBottom'#0#18'BorderSpacing.Left'#2#6#7'Caption'#6#8'Password'#12'FocusCont'
+ +'rol'#7#12'PasswordEdit'#11'ParentColor'#8#0#0#6'TLabel'#13'AppTitleLabel'#22
+ +'AnchorSideLeft.Control'#7#7'AppIcon'#19'AnchorSideLeft.Side'#7#9'asrBottom'
+ +#21'AnchorSideTop.Control'#7#9'HintLabel'#18'AnchorSideTop.Side'#7#9'asrBott'
+ +'om'#23'AnchorSideRight.Control'#7#5'Owner'#20'AnchorSideRight.Side'#7#9'asr'
+ +'Bottom'#4'Left'#2','#6'Height'#2#18#3'Top'#2#30#5'Width'#3#149#1#7'Anchors'
+ +#11#5'akTop'#6'akLeft'#7'akRight'#0#20'BorderSpacing.Around'#2#6#7'Caption'#6
+ +#13'AppTitleLabel'#11'ParentColor'#8#13'ShowAccelChar'#8#0#0#6'TLabel'#13'Da'
+ +'taBaseLabel'#22'AnchorSideLeft.Control'#7#5'Owner'#24'AnchorSideBottom.Cont'
+ +'rol'#7#11'CustomCombo'#21'AnchorSideBottom.Side'#7#9'asrBottom'#4'Left'#2#6
+ +#6'Height'#2#18#3'Top'#3#137#0#5'Width'#2'C'#7'Anchors'#11#6'akLeft'#8'akBot'
+ +'tom'#0#18'BorderSpacing.Left'#2#6#7'Caption'#6#8'Database'#12'FocusControl'
+ +#7#11'CustomCombo'#11'ParentColor'#8#0#0#5'TEdit'#12'UserNameEdit'#22'Anchor'
+ +'SideLeft.Control'#7#13'UserNameLabel'#19'AnchorSideLeft.Side'#7#9'asrBottom'
+ +#21'AnchorSideTop.Control'#7#13'AppTitleLabel'#18'AnchorSideTop.Side'#7#9'as'
+ +'rBottom'#23'AnchorSideRight.Control'#7#5'Owner'#20'AnchorSideRight.Side'#7#9
+ +'asrBottom'#6'Cursor'#7#7'crIBeam'#4'Left'#2'a'#6'Height'#2#29#3'Top'#2'6'#5
+ +'Width'#3'`'#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#18'BorderSpacin'
+ +'g.Left'#2#12#20'BorderSpacing.Around'#2#6#8'TabOrder'#2#0#0#0#5'TEdit'#12'P'
+ +'asswordEdit'#22'AnchorSideLeft.Control'#7#12'UserNameEdit'#21'AnchorSideTop'
+ +'.Control'#7#12'UserNameEdit'#18'AnchorSideTop.Side'#7#9'asrBottom'#23'Ancho'
+ +'rSideRight.Control'#7#12'UserNameEdit'#20'AnchorSideRight.Side'#7#9'asrBott'
+ +'om'#6'Cursor'#7#7'crIBeam'#4'Left'#2'a'#6'Height'#2#29#3'Top'#2'Y'#5'Width'
+ +#3'`'#1#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#17'BorderSpacing.Top'#2
+ +#6#8'EchoMode'#7#10'emPassword'#12'PasswordChar'#6#1'*'#8'TabOrder'#2#1#0#0#9
+ +'TComboBox'#11'CustomCombo'#22'AnchorSideLeft.Control'#7#12'UserNameEdit'#21
+ +'AnchorSideTop.Control'#7#12'PasswordEdit'#18'AnchorSideTop.Side'#7#9'asrBot'
+ +'tom'#23'AnchorSideRight.Control'#7#12'UserNameEdit'#20'AnchorSideRight.Side'
+ +#7#9'asrBottom'#4'Left'#2'a'#6'Height'#2#31#3'Top'#2'|'#5'Width'#3'`'#1#7'An'
+ +'chors'#11#5'akTop'#6'akLeft'#7'akRight'#0#17'BorderSpacing.Top'#2#6#10'Item'
+ +'Height'#2#0#5'Style'#7#14'csDropDownList'#8'TabOrder'#2#2#0#0#7'TBitBtn'#5
+ +'btnOK'#22'AnchorSideLeft.Control'#7#12'PasswordEdit'#21'AnchorSideTop.Contr'
+ +'ol'#7#9'btnCancel'#23'AnchorSideRight.Control'#7#9'btnCancel'#24'AnchorSide'
+ +'Bottom.Control'#7#5'Owner'#21'AnchorSideBottom.Side'#7#9'asrBottom'#4'Left'
+ +#3#187#0#6'Height'#2'$'#3'Top'#3#161#0#5'Width'#2'<'#7'Anchors'#11#5'akTop'#7
+ +'akRight'#8'akBottom'#0#8'AutoSize'#9#19'BorderSpacing.Right'#2#6#20'BorderS'
+ ,'pacing.Bottom'#2#6#25'BorderSpacing.InnerBorder'#2#2#7'Caption'#6#5'&'#208
+ +#158#208#154#7'Default'#9#4'Kind'#7#4'bkOK'#11'ModalResult'#2#1#7'OnClick'#7
+ +#10'btnOKClick'#8'TabOrder'#2#3#0#0#7'TBitBtn'#9'btnCancel'#21'AnchorSideTop'
+ +'.Control'#7#11'CustomCombo'#18'AnchorSideTop.Side'#7#9'asrBottom'#23'Anchor'
+ +'SideRight.Control'#7#7'btnHelp'#24'AnchorSideBottom.Control'#7#5'Owner'#21
+ +'AnchorSideBottom.Side'#7#9'asrBottom'#4'Left'#3#253#0#6'Height'#2'$'#3'Top'
+ +#3#161#0#5'Width'#2'_'#7'Anchors'#11#7'akRight'#8'akBottom'#0#8'AutoSize'#9
+ +#20'BorderSpacing.Around'#2#6#25'BorderSpacing.InnerBorder'#2#2#6'Cancel'#9#7
+ +'Caption'#6#12#208#158#209#130#208#188#208#181#208#189#208#176#4'Kind'#7#8'b'
+ +'kCancel'#11'ModalResult'#2#2#8'TabOrder'#2#4#0#0#7'TBitBtn'#7'btnHelp'#21'A'
+ +'nchorSideTop.Control'#7#9'btnCancel'#23'AnchorSideRight.Control'#7#5'Owner'
+ +#20'AnchorSideRight.Side'#7#9'asrBottom'#24'AnchorSideBottom.Control'#7#5'Ow'
+ +'ner'#21'AnchorSideBottom.Side'#7#9'asrBottom'#4'Left'#3'b'#1#6'Height'#2'$'
+ +#3'Top'#3#161#0#5'Width'#2'_'#7'Anchors'#11#5'akTop'#7'akRight'#8'akBottom'#0
+ +#8'AutoSize'#9#19'BorderSpacing.Right'#2#6#20'BorderSpacing.Bottom'#2#6#7'Ca'
+ +'ption'#6#15'&'#208#161#208#191#209#128#208#176#208#178#208#186#208#176#4'Ki'
+ +'nd'#7#6'bkHelp'#8'TabOrder'#2#5#0#0#7'TBitBtn'#7'btnMore'#22'AnchorSideLeft'
+ +'.Control'#7#5'Owner'#21'AnchorSideTop.Control'#7#9'btnCancel'#24'AnchorSide'
+ +'Bottom.Control'#7#5'Owner'#21'AnchorSideBottom.Side'#7#9'asrBottom'#4'Left'
+ +#2#6#6'Height'#2'$'#3'Top'#3#161#0#5'Width'#2'N'#7'Anchors'#11#5'akTop'#6'ak'
+ +'Left'#8'akBottom'#0#8'AutoSize'#9#18'BorderSpacing.Left'#2#6#20'BorderSpaci'
+ +'ng.Bottom'#2#6#7'Caption'#6#7'More >>'#7'OnClick'#7#12'btnMoreClick'#8'TabO'
+ +'rder'#2#6#0#0#0
+]);
diff --git a/components/rx/version/v2.2_laz_1.2/rxlogin.pas b/components/rx/version/v2.2_laz_1.2/rxlogin.pas
new file mode 100644
index 000000000..ee932ae91
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxlogin.pas
@@ -0,0 +1,770 @@
+{ rxlogin unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit rxlogin;
+
+{$I RX.INC}
+
+interface
+
+uses LResources, LCLType, LCLIntf, SysUtils, LMessages, Classes, Graphics,
+ Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Buttons;
+
+type
+ TUpdateCaption = (ucNoChange, ucAppTitle, ucFormCaption);
+
+ TRxLoginOption = (rloCustomSelect, rloMoreBtn, rloHelpBtn);
+
+ TRxLoginOptions = set of TRxLoginOption;
+
+ TRxLoginStorageParam = (rlsUserName, rlsTop, rlsLeft, rlsDetailStatus,
+ rlsDetailItem);
+ TRxLoginStorageParams = set of TRxLoginStorageParam;
+
+ TRxLoginEvent = procedure(Sender: TObject; const UserName, Password: string;
+ var AllowLogin: Boolean) of object;
+ TCheckUnlockEvent = function(const Password: string): Boolean of object;
+ TUnlockAppEvent = procedure(Sender: TObject; const UserName,
+ Password: string; var AllowUnlock: Boolean) of object;
+
+ TRxLoginForm = class;
+
+{ TRxCustomLogin }
+
+ TRxCustomLogin = class(TComponent)
+ private
+ FActive: Boolean;
+ FAttemptNumber: Integer;
+ FDetailItem: integer;
+ FDetailItems: TStrings;
+ FLoggedUser: string;
+ FMaxPasswordLen: Integer;
+ FAllowEmpty: Boolean;
+ FLoginOptions: TRxLoginOptions;
+ FShowDetails: boolean;
+ FStorageParams: TRxLoginStorageParams;
+ FUpdateCaption: TUpdateCaption;
+ FIniFileName: string;
+ FUseRegistry: Boolean;
+ FLocked: Boolean;
+ FUnlockDlgShowing: Boolean;
+ FSaveOnRestore: TNotifyEvent;
+ FAfterLogin: TNotifyEvent;
+ FBeforeLogin: TNotifyEvent;
+ FOnUnlock: TCheckUnlockEvent;
+ FOnUnlockApp: TUnlockAppEvent;
+ FOnIconDblClick: TNotifyEvent;
+ function GetIniFileName: string;
+ procedure SetDetailItems(const AValue: TStrings);
+ procedure SetLoginOptions(const AValue: TRxLoginOptions);
+ procedure SetShowDetails(const AValue: boolean);
+ function UnlockHook(var Message: TLMessage): Boolean;
+ protected
+ function CheckUnlock(const UserName, Password: string): Boolean; dynamic;
+ function CreateLoginForm(UnlockMode: Boolean): TRxLoginForm; virtual;
+ procedure DoAfterLogin; dynamic;
+ procedure DoBeforeLogin; dynamic;
+ procedure DoIconDblCLick(Sender: TObject); dynamic;
+ function DoLogin(var UserName: string): Boolean; virtual; abstract;
+ function DoUnlockDialog: Boolean; virtual;
+ procedure SetLoggedUser(const Value: string);
+ procedure DoUpdateCaption;
+ procedure UnlockOkClick(Sender: TObject);
+ property Active: Boolean read FActive write FActive default True;
+ property AllowEmptyPassword: Boolean read FAllowEmpty write FAllowEmpty default True;
+ property AttemptNumber: Integer read FAttemptNumber write FAttemptNumber default 3;
+ property IniFileName: string read GetIniFileName write FIniFileName;
+ property MaxPasswordLen: Integer read FMaxPasswordLen write FMaxPasswordLen default 0;
+ property UpdateCaption: TUpdateCaption read FUpdateCaption write FUpdateCaption default ucNoChange;
+ property UseRegistry: Boolean read FUseRegistry write FUseRegistry default False;
+ property ShowDetails: boolean read FShowDetails write SetShowDetails;
+ property StorageParams:TRxLoginStorageParams read FStorageParams write FStorageParams default [rlsUserName];
+ property DetailItems:TStrings read FDetailItems write SetDetailItems;
+ property DetailItem:integer read FDetailItem write FDetailItem;
+ property LoginOptions:TRxLoginOptions read FLoginOptions write SetLoginOptions default [rloCustomSelect, rloMoreBtn, rloHelpBtn];
+
+ property AfterLogin: TNotifyEvent read FAfterLogin write FAfterLogin;
+ property BeforeLogin: TNotifyEvent read FBeforeLogin write FBeforeLogin;
+ property OnUnlock: TCheckUnlockEvent read FOnUnlock write FOnUnlock; { obsolete }
+ property OnUnlockApp: TUnlockAppEvent read FOnUnlockApp write FOnUnlockApp;
+ property OnIconDblClick: TNotifyEvent read FOnIconDblClick write FOnIconDblClick;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ function Login: Boolean; virtual;
+ procedure TerminateApplication;
+ procedure Lock;
+ property LoggedUser: string read FLoggedUser;
+ end;
+
+{ TRxLoginDialog }
+
+ TRxLoginDialog = class(TRxCustomLogin)
+ private
+ FOnCheckUser: TRxLoginEvent;
+ FUserName:string;
+ FFormTop:integer;
+ FFormLeft:integer;
+ procedure OkButtonClick(Sender: TObject);
+ procedure WriteParams;
+ procedure LoadParams;
+ protected
+ function DoCheckUser(const UserName, Password: string): Boolean; dynamic;
+ function DoLogin(var UserName: string): Boolean; override;
+ procedure Loaded; override;
+ published
+ property Active;
+ property AttemptNumber;
+ property IniFileName;
+ property DetailItems;
+ property DetailItem;
+ property MaxPasswordLen;
+ property UpdateCaption;
+ property UseRegistry;
+ property ShowDetails;
+ property LoginOptions;
+ property StorageParams;
+ property OnCheckUser: TRxLoginEvent read FOnCheckUser write FOnCheckUser;
+ property AfterLogin;
+ property BeforeLogin;
+ property OnUnlockApp;
+ property OnIconDblClick;
+ end;
+
+{ TRxLoginForm }
+
+ TRxLoginForm = class(TForm)
+ AppIcon: TImage;
+ btnHelp: TBitBtn;
+ btnMore: TBitBtn;
+ btnCancel: TBitBtn;
+ KeyImage: TImage;
+ HintLabel: TLabel;
+ btnOK: TBitBtn;
+ UserNameLabel: TLabel;
+ PasswordLabel: TLabel;
+ UserNameEdit: TEdit;
+ PasswordEdit: TEdit;
+ AppTitleLabel: TLabel;
+ DataBaseLabel: TLabel;
+ CustomCombo: TComboBox;
+ procedure btnMoreClick(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ procedure btnOKClick(Sender: TObject);
+ procedure FormShow(Sender: TObject);
+ private
+ FSelectDatabase: Boolean;
+ FUnlockMode: Boolean;
+ FAttempt: Integer;
+ FOnFormShow: TNotifyEvent;
+ FOnOkClick: TNotifyEvent;
+ function GetShowDetailParams: boolean;
+ procedure SetLoginOptions(const AValue: TRxLoginOptions);
+ procedure SetShowDetailParams(const AValue: boolean);
+ public
+ { Public declarations }
+ AttemptNumber: Integer;
+ property Attempt: Integer read FAttempt;
+ property SelectDatabase: Boolean read FSelectDatabase write FSelectDatabase;
+ property OnFormShow: TNotifyEvent read FOnFormShow write FOnFormShow;
+ property OnOkClick: TNotifyEvent read FOnOkClick write FOnOkClick;
+ property ShowDetailParams:boolean read GetShowDetailParams write SetShowDetailParams;
+ property LoginOptions:TRxLoginOptions write SetLoginOptions;
+ end;
+
+function CreateLoginDialog(UnlockMode, ASelectDatabase: Boolean;
+ FormShowEvent, OkClickEvent: TNotifyEvent): TRxLoginForm;
+
+implementation
+
+uses
+ Registry, IniFiles, RxAppUtils, RxDConst, VclUtils, RxConst;
+
+const
+ keyLoginSection = 'Login Dialog';
+ keyLastLoginUserName = 'Last Logged User';
+ keyLastLoginFormTop = 'Last Logged Form Top';
+ keyLastLoginFormLeft = 'Last Logged Form Left';
+ keyLastLoginFormDetailStatus = 'Last Logged Detail Status';
+ keyLastLoginFormDetailSelected = 'Last Logged Selected Detail';
+
+
+function CreateLoginDialog(UnlockMode, ASelectDatabase: Boolean;
+ FormShowEvent, OkClickEvent: TNotifyEvent): TRxLoginForm;
+begin
+ Result := TRxLoginForm.Create(Application);
+ with Result do
+ begin
+ FSelectDatabase := ASelectDatabase;
+ FUnlockMode := UnlockMode;
+ if FUnlockMode then
+ begin
+ FormStyle := fsNormal;
+ FSelectDatabase := False;
+ end
+ else
+ begin
+ FormStyle := fsStayOnTop;
+ end;
+ OnFormShow := FormShowEvent;
+ OnOkClick := OkClickEvent;
+ end;
+end;
+
+{ TRxCustomLogin }
+
+constructor TRxCustomLogin.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FDetailItems:=TStringList.Create;
+ FActive := True;
+ FAttemptNumber := 3;
+ FAllowEmpty := True;
+ FUseRegistry := False;
+ FStorageParams:=[rlsUserName];
+ FLoginOptions:=[rloCustomSelect, rloMoreBtn, rloHelpBtn];
+end;
+
+destructor TRxCustomLogin.Destroy;
+begin
+ if FLocked then
+ begin
+// Application.UnhookMainWindow(UnlockHook);
+ FLocked := False;
+ end;
+ FreeAndNil(FDetailItems);
+ inherited Destroy;
+end;
+
+function TRxCustomLogin.GetIniFileName: string;
+begin
+ Result := FIniFileName;
+ if (Result = '') and not (csDesigning in ComponentState) then
+ begin
+ if UseRegistry then
+ Result := GetDefaultIniRegKey
+ else
+ Result := GetDefaultIniName;
+ end;
+end;
+
+procedure TRxCustomLogin.SetDetailItems(const AValue: TStrings);
+begin
+ if Assigned(AValue) then
+ FDetailItems.Assign(AValue);
+end;
+
+procedure TRxCustomLogin.SetLoginOptions(const AValue: TRxLoginOptions);
+begin
+ if FLoginOptions=AValue then exit;
+ FLoginOptions:=AValue;
+end;
+
+procedure TRxCustomLogin.SetShowDetails(const AValue: boolean);
+begin
+ if FShowDetails=AValue then exit;
+ FShowDetails:=AValue;
+end;
+
+procedure TRxCustomLogin.SetLoggedUser(const Value: string);
+begin
+ FLoggedUser := Value;
+end;
+
+procedure TRxCustomLogin.DoAfterLogin;
+begin
+ if Assigned(FAfterLogin) then FAfterLogin(Self);
+end;
+
+procedure TRxCustomLogin.DoBeforeLogin;
+begin
+ if Assigned(FBeforeLogin) then FBeforeLogin(Self);
+end;
+
+procedure TRxCustomLogin.DoIconDblCLick(Sender: TObject);
+begin
+ if Assigned(FOnIconDblClick) then FOnIconDblClick(Self);
+end;
+
+procedure TRxCustomLogin.DoUpdateCaption;
+var
+ F: TForm;
+begin
+ F := Application.MainForm;
+ if (F = nil) and (Owner is TForm) then F := Owner as TForm;
+ if (F <> nil) and (LoggedUser <> '') then
+ case UpdateCaption of
+ ucAppTitle:
+ F.Caption := Format('%s (%s)', [Application.Title, LoggedUser]);
+ ucFormCaption:
+ begin
+ F.Caption := Format('%s (%s)', [F.Caption, LoggedUser]);
+ UpdateCaption := ucNoChange;
+ end;
+ end;
+end;
+
+function TRxCustomLogin.Login: Boolean;
+var
+ LoginName: string;
+begin
+ LoginName := EmptyStr;
+ DoBeforeLogin;
+ Result := DoLogin(LoginName);
+ if Result then
+ begin
+ SetLoggedUser(LoginName);
+ DoUpdateCaption;
+ DoAfterLogin;
+ end;
+end;
+
+procedure TRxCustomLogin.Lock;
+begin
+// FSaveOnRestore := Application.OnRestore;
+ Application.Minimize;
+// Application.HookMainWindow(UnlockHook);
+ FLocked := True;
+end;
+
+procedure TRxCustomLogin.TerminateApplication;
+begin
+ with Application do
+ begin
+ ShowMainForm := False;
+{ if Application.Handle <> 0 then
+ ShowOwnedPopups(Handle, False);}
+ Terminate;
+ end;
+ CallTerminateProcs;
+ Halt(10);
+end;
+
+procedure TRxCustomLogin.UnlockOkClick(Sender: TObject);
+var
+ Ok: Boolean;
+begin
+ with TRxLoginForm(Sender) do begin
+ Ok := False;
+ try
+ Ok := CheckUnlock(UserNameEdit.Text, PasswordEdit.Text);
+ except
+ Application.HandleException(Self);
+ end;
+ if Ok then ModalResult := mrOk
+ else ModalResult := mrCancel;
+ end;
+end;
+
+function TRxCustomLogin.CheckUnlock(const UserName, Password: string): Boolean;
+begin
+ Result := True;
+ if Assigned(FOnUnlockApp) then
+ FOnUnlockApp(Self, UserName, Password, Result)
+ else if Assigned(FOnUnlock) then
+ Result := FOnUnlock(Password);
+end;
+
+function TRxCustomLogin.CreateLoginForm(UnlockMode: Boolean): TRxLoginForm;
+begin
+ Result := TRxLoginForm.Create(Application);
+ with Result do
+ begin
+ FUnlockMode := UnlockMode;
+ if FUnlockMode then
+ begin
+ FormStyle := fsNormal;
+ FSelectDatabase := False;
+ end
+ else
+ FormStyle := fsStayOnTop;
+ if Assigned(Self.FOnIconDblClick) then
+ begin
+ with AppIcon do
+ begin
+ OnDblClick := @DoIconDblClick;
+ Cursor := crHand;
+ end;
+ with KeyImage do
+ begin
+ OnDblClick := @DoIconDblClick;
+ Cursor := crHand;
+ end;
+ end;
+ PasswordEdit.MaxLength := FMaxPasswordLen;
+ AttemptNumber := Self.AttemptNumber;
+ end;
+end;
+
+function TRxCustomLogin.DoUnlockDialog: Boolean;
+begin
+ with CreateLoginForm(True) do
+ try
+ OnFormShow := nil;
+ OnOkClick := @UnlockOkClick;
+ with UserNameEdit do
+ begin
+ Text := LoggedUser;
+ ReadOnly := True;
+ Font.Color := clGrayText;
+ end;
+ Result := ShowModal = mrOk;
+ finally
+ Free;
+ end;
+end;
+
+function TRxCustomLogin.UnlockHook(var Message: TLMessage): Boolean;
+
+ function DoUnlock: Boolean;
+ var
+ Popup: HWnd;
+ begin
+(* with Application do
+ if IsWindowVisible(Application.Handle) and IsWindowEnabled(Handle) then
+{$IFDEF WIN32}
+ SetForegroundWindow(Handle);
+{$ELSE}
+ BringWindowToTop(Handle);
+{$ENDIF}
+ if FUnlockDlgShowing then begin
+ Popup := GetLastActivePopup(Application.Handle);
+ if (Popup <> 0) and IsWindowVisible(Popup) and
+ (WindowClassName(Popup) = TRxLoginForm.ClassName) then
+ begin
+{$IFDEF WIN32}
+ SetForegroundWindow(Popup);
+{$ELSE}
+ BringWindowToTop(Popup);
+{$ENDIF}
+ end; //*)
+ Result := False;
+(* Exit;
+ end;
+ FUnlockDlgShowing := True;
+ try
+ Result := DoUnlockDialog;
+ finally
+ FUnlockDlgShowing := False;
+ end;
+ if Result then begin
+ Application.UnhookMainWindow(UnlockHook);
+ FLocked := False;
+ end;*)
+ end;
+
+begin
+ Result := False;
+ if not FLocked then Exit;
+ with Message do begin
+ case Msg of
+{ LM_QUERYOPEN:
+ begin
+ UnlockHook := not DoUnlock;
+ end;}
+ LM_SHOWWINDOW:
+ if Bool(WParam) then begin
+ UnlockHook := not DoUnlock;
+ end;
+ LM_SYSCOMMAND:
+ if (WParam and $FFF0 = SC_RESTORE)
+{ or (WParam and $FFF0 = SC_ZOOM) }then
+ begin
+ UnlockHook := not DoUnlock;
+ end;
+ end;
+ end;
+end;
+
+{ TRxLoginDialog }
+
+procedure TRxLoginDialog.Loaded;
+var
+ FLoading: Boolean;
+begin
+ FLoading := csLoading in ComponentState;
+ inherited Loaded;
+ if not (csDesigning in ComponentState) and FLoading then
+ begin
+ if Active and not Login then
+ TerminateApplication;
+ end;
+end;
+
+procedure TRxLoginDialog.OkButtonClick(Sender: TObject);
+var
+ SC: Boolean;
+begin
+ with TRxLoginForm(Sender) do
+ begin
+{$IFDEF WIN32}
+ SC := GetCurrentThreadID = MainThreadID;
+{$ELSE}
+ SC := True;
+{$ENDIF}
+ try
+ if SC then
+ Screen.Cursor := crHourGlass;
+ try
+ if DoCheckUser(UserNameEdit.Text, PasswordEdit.Text) then
+ ModalResult := mrOk
+ else
+ ModalResult := mrNone;
+ finally
+ if SC then Screen.Cursor := crDefault;
+ end;
+ except
+ Application.HandleException(Self);
+ end;
+ end;
+end;
+
+function TRxLoginDialog.DoCheckUser(const UserName, Password: string): Boolean;
+begin
+ Result := True;
+ if Assigned(FOnCheckUser) then
+ FOnCheckUser(Self, UserName, Password, Result);
+end;
+
+procedure TRxLoginDialog.WriteParams;
+var
+ Ini: TObject;
+begin
+ try
+ if UseRegistry then Ini := TRegIniFile.Create(IniFileName)
+ else Ini := TIniFile.Create(IniFileName);
+ try
+ if rlsUserName in FStorageParams then
+ IniWriteString(Ini, keyLoginSection, keyLastLoginUserName, FUserName);
+ if rlsTop in FStorageParams then
+ IniWriteInteger(Ini, keyLoginSection, keyLastLoginFormTop, FFormTop);
+ if rlsLeft in FStorageParams then
+ IniWriteInteger(Ini, keyLoginSection, keyLastLoginFormLeft, FFormLeft);
+ if rlsDetailStatus in FStorageParams then
+ IniWriteInteger(Ini, keyLoginSection, keyLastLoginFormDetailStatus, ord(FShowDetails));
+ if rlsDetailItem in FStorageParams then
+ IniWriteInteger(Ini, keyLoginSection, keyLastLoginFormDetailSelected, FDetailItem);
+ finally
+ Ini.Free;
+ end;
+ except
+ end;
+end;
+
+procedure TRxLoginDialog.LoadParams;
+var
+ Ini: TObject;
+begin
+ try
+ if UseRegistry then
+ begin
+ Ini := TRegIniFile.Create(IniFileName);
+ TRegIniFile(Ini).Access := KEY_READ;
+ end
+ else
+ Ini := TIniFile.Create(IniFileName);
+ try
+ if rlsUserName in FStorageParams then
+ FUserName:=IniReadString(Ini, keyLoginSection, keyLastLoginUserName, FUserName);
+ if rlsTop in FStorageParams then
+ FFormTop:=IniReadInteger(Ini, keyLoginSection, keyLastLoginFormTop, FFormTop);
+ if rlsLeft in FStorageParams then
+ FFormLeft:=IniReadInteger(Ini, keyLoginSection, keyLastLoginFormLeft, FFormLeft);
+ if rlsDetailStatus in FStorageParams then
+ FShowDetails:=IniReadInteger(Ini, keyLoginSection, keyLastLoginFormDetailStatus, ord(FShowDetails))=1;
+ if rlsDetailItem in FStorageParams then
+ FDetailItem:=IniReadInteger(Ini, keyLoginSection, keyLastLoginFormDetailSelected, FDetailItem);
+ finally
+ Ini.Free;
+ end;
+ except
+ end;
+end;
+
+function TRxLoginDialog.DoLogin(var UserName: string): Boolean;
+var
+ LoginForm:TRxLoginForm;
+begin
+ try
+ LoginForm:=CreateLoginForm(False);
+ try
+ FUserName:=UserName;
+ LoginForm.OnOkClick := @Self.OkButtonClick;
+ LoadParams;
+ LoginForm.LoginOptions:=FLoginOptions;
+
+ if rlsUserName in StorageParams then
+ LoginForm.UserNameEdit.Text := FUserName;
+ if rlsTop in StorageParams then
+ LoginForm.Top:=FFormTop;
+ if rlsLeft in StorageParams then
+ LoginForm.Left:=FFormLeft;
+
+ if rloCustomSelect in LoginOptions then
+ begin
+ LoginForm.CustomCombo.Items.Assign(DetailItems);
+ if (FDetailItem>=0) and (FDetailItem mrOk) and (FAttempt >= AttemptNumber) then
+ ModalResult := mrCancel;
+end;
+
+procedure TRxLoginForm.FormShow(Sender: TObject);
+var
+ I: Integer;
+ S: string;
+begin
+ if FSelectDatabase then
+ begin
+ ClientHeight := CustomCombo.Top + PasswordEdit.Top - UserNameEdit.Top;
+ S := SDatabaseName;
+ I := Pos(':', S);
+ if I = 0 then I := Length(S);
+ DataBaseLabel.Caption := '&' + Copy(S, 1, I);
+ end
+ else
+ begin
+ DataBaseLabel.Visible := False;
+ CustomCombo.Visible := False;
+ btnMore.Visible := False;
+ end;
+
+ SetShowDetailParams(ShowDetailParams);
+
+ if not FUnlockMode then
+ begin
+ HintLabel.Caption := SHintLabel;
+ Caption := SRegistration;
+ end
+ else
+ begin
+ HintLabel.Caption := SUnlockHint;
+ Caption := SUnlockCaption;
+ end;
+
+ if (UserNameEdit.Text = EmptyStr) and not FUnlockMode then
+ ActiveControl := UserNameEdit
+ else
+ ActiveControl := PasswordEdit;
+ if Assigned(FOnFormShow) then FOnFormShow(Self);
+ FAttempt := 0;
+end;
+
+procedure TRxLoginForm.SetShowDetailParams(const AValue: boolean);
+begin
+ DataBaseLabel.Visible:=AValue;
+ CustomCombo.Visible:=AValue;
+ if AValue then
+ begin
+ btnMore.Caption:=SMore2;
+ btnCancel.AnchorSideTop.Control:=CustomCombo;
+ Height := CustomCombo.Top + CustomCombo.Height + btnCancel.Height + 12;
+ end
+ else
+ begin
+ btnMore.Caption:=SMore1;
+ btnCancel.AnchorSideTop.Control:=PasswordEdit;
+ Height := PasswordEdit.Top + PasswordEdit.Height + btnCancel.Height + 12;
+ end;
+end;
+
+function TRxLoginForm.GetShowDetailParams: boolean;
+begin
+ Result:=CustomCombo.Visible;
+end;
+
+procedure TRxLoginForm.SetLoginOptions(const AValue: TRxLoginOptions);
+begin
+ btnHelp.Visible:=rloHelpBtn in AValue;
+ if not btnHelp.Visible then
+ begin
+ btnCancel.AnchorSideLeft.Side:=asrBottom;
+ btnCancel.AnchorSideLeft.Control:=Self;
+ end;
+
+ btnMore.Visible:=rloMoreBtn in AValue;
+ FSelectDatabase:=rloCustomSelect in AValue;
+end;
+
+initialization
+ {$I rxlogin.lrs}
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxlookup.pas b/components/rx/version/v2.2_laz_1.2/rxlookup.pas
new file mode 100644
index 000000000..df2a4d51b
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxlookup.pas
@@ -0,0 +1,1707 @@
+{ rxlookup unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit rxlookup;
+
+{$I rx.inc}
+
+interface
+
+uses
+ LCLType, LCLProc, LCLIntf, Classes, SysUtils, LResources, Forms, types,
+ Controls, Graphics, Dialogs, DB, EditBtn, DBGrids, Buttons,
+ LMessages, DbCtrls, GraphType, dbutils, RxDbGrid, rxpopupunit, Themes;
+
+const
+ TextMargin = 5;
+
+type
+ TRxCustomDBLookupCombo = class;
+ TRxCustomDBLookupEdit = class;
+
+ TClosePopup = procedure(Sender: TObject; SearchResult:boolean) of object;
+
+ {For deciding, what we need to show in combobox in case we cannot find curvalue in lookup table.}
+ TRxDBValueVariant = (rxufNone, rxufLastSuccessful, rxufOriginal);
+
+ { TLookupSourceLink }
+ TDataSourceLink = class(TDataLink)
+ private
+ FDataControl:TRxCustomDBLookupCombo;
+ protected
+ procedure ActiveChanged; override;
+ procedure LayoutChanged; override;
+ procedure FocusControl(Field: TFieldRef); override;
+ procedure RecordChanged(Field: TField); override;
+ procedure UpdateData; override;
+ end;
+
+ { TLookupSourceLink }
+
+ TLookupSourceLink = class(TDataLink)
+ private
+ FOnActiveChanged:TNotifyEvent;
+ FOnLayoutChanged:TNotifyEvent;
+ FOnDataSetChanged:TNotifyEvent;
+ protected
+ procedure ActiveChanged; override;
+ procedure LayoutChanged; override;
+ procedure DataSetChanged; override;
+ end;
+
+ { TRxCustomDBLookupEdit }
+
+ TRxCustomDBLookupEdit = class(TEditButton)
+ private
+ FLookupDisplayIndex: Integer;
+ FLookupField: string;
+ FLookupDisplay: string;
+ FKeyField:TField;
+ //
+ FLookupDataLink:TLookupSourceLink;
+ FLocateObject:TLocateObject;
+ FOnClosePopup: TClosePopup;
+ //
+ FRxPopUpForm:TPopUpForm;
+
+ FFieldList:TStringList;
+ FPopUpFormOptions:TPopUpFormOptions;
+ function GetDropDownCount: Integer;
+ function GetDropDownWidth: Integer;
+ function GetLookupSource: TDataSource;
+ function GetPopupVisible: boolean;
+ procedure SetDropDownCount(const AValue: Integer);
+ procedure SetDropDownWidth(const AValue: Integer);
+ procedure SetLookupDisplay(const AValue: string);
+ procedure SetLookupDisplayIndex(const AValue: Integer);
+ procedure SetLookupField(const AValue: string);
+ procedure SetLookupSource(AValue: TDataSource);
+ procedure SetPopUpFormOptions(const AValue: TPopUpFormOptions);
+ //
+ procedure ShowList;
+ procedure HideList;
+ procedure ShowPopUp;
+ procedure UpdateKeyValue;
+ protected
+ property PopUpFormOptions:TPopUpFormOptions read FPopUpFormOptions write SetPopUpFormOptions;
+{$IFDEF OLD_EDITBUTTON}
+ procedure DoButtonClick (Sender: TObject); override;
+{$ELSE}
+ procedure ButtonClick; override;
+{$ENDIF}
+ function GetDefaultGlyphName: String; override;
+ procedure KeyDown(var Key: Word; Shift: TShiftState); override;
+ procedure InternalClosePopup(AResult:boolean);virtual;
+ //
+ procedure LookupDataSetChanged(Sender: TObject); virtual;
+ procedure ListLinkActiveChanged(Sender: TObject); virtual;
+ //
+ property OnClosePopup:TClosePopup read FOnClosePopup write FOnClosePopup;
+ property DropDownCount: Integer read GetDropDownCount write SetDropDownCount default 8;
+ property DropDownWidth: Integer read GetDropDownWidth write SetDropDownWidth default 0;
+ property LookupDisplay: string read FLookupDisplay write SetLookupDisplay;
+ property LookupDisplayIndex: Integer read FLookupDisplayIndex write SetLookupDisplayIndex default 0;
+ property LookupField: string read FLookupField write SetLookupField;
+ property LookupSource: TDataSource read GetLookupSource write SetLookupSource;
+ property PopupVisible:boolean read GetPopupVisible;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ end;
+
+ TRxLookupEdit = class(TRxCustomDBLookupEdit)
+ published
+ property DropDownCount;
+ property DropDownWidth;
+ property LookupDisplay;
+ property LookupDisplayIndex;
+ property LookupField;
+ property LookupSource;
+ property PopUpFormOptions;
+ property OnClosePopup;
+ end;
+
+ { TRxCustomDBLookupCombo }
+ TRxCustomDBLookupCombo = class (TCustomControl)
+ private
+ FOnChangeData: TNotifyEvent;
+ //
+ FStopClick:boolean;
+ //FDataLink:TFieldDataLink;
+ FDataLink:TDataSourceLink;
+ FDataFieldName: string;
+ FDataField :TField;
+ //
+ FLookupDataLink:TLookupSourceLink;
+ FLocateObject:TLocateObject;
+ FLookupField: string;
+ FLookupDisplay: string;
+ FDisplayField:TField;
+ FKeyField:TField;
+ FLookupDisplayIndex: Integer;
+ FListActive:boolean;
+ //
+ FEmptyItemColor: TColor;
+ FEmptyValue: string;
+ FOnChange: TNotifyEvent;
+ FOnClosePopup: TClosePopup;
+ FPopUpFormOptions: TPopUpFormOptions;
+ //
+ FRxPopUpForm:TPopUpForm;
+ FFieldList:TStringList;
+ FValuesList:TStringList;
+ FValue:string;
+ //Visual
+ FButton: TSpeedButton;
+ FButtonNeedsFocus: Boolean;
+ FDirectInput : Boolean;
+ FOnButtonClick : TNotifyEvent;
+ FReadOnly: boolean;
+ FDisplayAll: boolean;
+ FUnfindedValue: TRxDBValueVariant;
+ FSuccesfullyFind : boolean;
+
+ FOnSelect : TNotifyEvent;
+ procedure SetValue(const Value: string);
+ function GetKeyValue: Variant;
+ procedure SetKeyValue(const Value: Variant);
+
+ function GetDataSource: TDataSource;
+ function GetDisplayAll: Boolean;
+ function GetDropDownCount: Integer;
+ function GetDropDownWidth: Integer;
+ function GetLookupSource: TDataSource;
+ function GetMinHeight: Integer;
+ function GetBorderSize: Integer;
+ procedure CheckButtonVisible;
+ function GetButtonWidth: Integer;
+ function GetFlat: Boolean;
+ function GetGlyph: TBitmap;
+ function GetNumGlyphs: Integer;
+ function GetOnGetGridCellProps: TGetCellPropsEvent;
+ function GetPopupVisible: boolean;
+ procedure SetButtonNeedsFocus(const AValue: Boolean);
+ procedure SetButtonWidth(const AValue: Integer);
+ procedure SetDataFieldName(const AValue: string);
+ procedure SetDataSource(const AValue: TDataSource);
+ procedure SetDisplayAll(const AValue: Boolean);
+ procedure SetDropDownCount(const AValue: Integer);
+ procedure SetDropDownWidth(const AValue: Integer);
+ procedure SetEmptyItemColor(const AValue: TColor);
+ procedure SetEmptyValue(const AValue: string);
+ procedure SetFlat(const AValue: Boolean);
+ procedure SetGlyph(const AValue: TBitmap);
+ procedure SetLookupDisplay(const AValue: string);
+ procedure SetLookupDisplayIndex(const AValue: Integer);
+ procedure SetLookupField(const AValue: string);
+ procedure SetLookupSource(const AValue: TDataSource);
+ procedure SetNumGlyphs(const AValue: Integer);
+ procedure SetOnGetGridCellProps(const AValue: TGetCellPropsEvent);
+ procedure SetPopUpFormOptions(const AValue: TPopUpFormOptions);
+ procedure SetReadOnly(const AValue: boolean);
+ function StoreEmpty: boolean;
+ procedure WMSetFocus(var Message: TLMSetFocus); message LM_SETFOCUS;
+ procedure WMKillFocus(var Message: TLMKillFocus); message LM_KILLFOCUS;
+ procedure CMExit(var Message:TLMessage); message CM_EXIT;
+ procedure PaintDisplayValues(ACanvas: TCanvas; R: TRect; ALeft: Integer);
+ procedure CheckNotCircular;
+ procedure DisplayValueChanged;
+ procedure DataLinkActiveChanged;
+ procedure DataLinkRecordChanged(Field: TField);
+ procedure UpdateFieldValues;
+ procedure SetValueKey(const Value: string);
+ procedure UpdateKeyValue;
+ procedure KeyValueChanged;
+ procedure UpdateData;
+ procedure NeedUpdateData;
+ protected
+ procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer;
+ WithThemeSpace: Boolean); override;
+ {procedure GetPreferredSize(var PreferredWidth, PreferredHeight: integer;
+ Raw: boolean = false;
+ WithThemeSpace: boolean = true); override;
+ class function GetControlClassDefaultSize: TSize; override;}
+ procedure ShowList; virtual;
+ procedure OnInternalClosePopup(AResult:boolean);virtual;
+ procedure SetEnabled(Value: Boolean); override;
+ procedure KeyDown(var Key: Word; Shift: TShiftState); override;
+ procedure UTF8KeyPress(var UTF8Key: TUTF8Char); override;
+ procedure SetParent(AParent: TWinControl); override;
+ procedure DoSetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
+ procedure DoPositionButton; virtual;
+ procedure DoChange; virtual;
+ procedure DoChangeData; virtual;
+ procedure DoButtonClick(Sender: TObject); virtual;
+ Procedure Loaded; override;
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ procedure CMVisibleChanged(var Msg: TLMessage); message CM_VISIBLECHANGED;
+ procedure CMEnabledChanged(var Msg: TLMessage); message CM_ENABLEDCHANGED;
+ procedure Click; override;
+ function RealGetText: TCaption; override;
+ procedure RealSetText(const Value: TCaption); override;
+
+ procedure Paint; override;
+
+ procedure LookupDataSetChanged(Sender: TObject); virtual;
+ procedure ListLinkActiveChanged(Sender: TObject); virtual;
+
+ //
+ property Button: TSpeedButton read FButton;
+ property ButtonWidth : Integer read GetButtonWidth write SetButtonWidth;
+ property ButtonOnlyWhenFocused : Boolean Read FButtonNeedsFocus Write SetButtonNeedsFocus;
+ property DirectInput : Boolean read FDirectInput write FDirectInput Default True;
+ property DisplayAllFields: Boolean read GetDisplayAll write SetDisplayAll default False;
+ property Flat : Boolean read GetFlat write SetFlat;
+ property Glyph : TBitmap read GetGlyph write SetGlyph;
+ property NumGlyphs : Integer read GetNumGlyphs write SetNumGlyphs;
+ property OnButtonClick : TNotifyEvent read FOnButtonClick write FOnButtonClick;
+ property OnChange : TNotifyEvent read FOnChange write FOnChange;
+ property OnChangeData : TNotifyEvent read FOnChangeData write FOnChangeData;
+ property ReadOnly:boolean read FReadOnly write SetReadOnly;
+ property EmptyValue: string read FEmptyValue write SetEmptyValue stored StoreEmpty;
+ property EmptyItemColor: TColor read FEmptyItemColor write SetEmptyItemColor default clWindow;
+ //data
+ property PopUpFormOptions:TPopUpFormOptions read FPopUpFormOptions write SetPopUpFormOptions;
+ property DataField: string read FDataFieldName write SetDataFieldName;
+ property DataSource: TDataSource read GetDataSource write SetDataSource;
+ property DropDownCount: Integer read GetDropDownCount write SetDropDownCount default 8;
+ property DropDownWidth: Integer read GetDropDownWidth write SetDropDownWidth default 0;
+ property LookupDisplay: string read FLookupDisplay write SetLookupDisplay;
+ property LookupDisplayIndex: Integer read FLookupDisplayIndex write SetLookupDisplayIndex default 0;
+ property LookupField: string read FLookupField write SetLookupField;
+ property LookupSource: TDataSource read GetLookupSource write SetLookupSource;
+ property OnGetGridCellProps: TGetCellPropsEvent read GetOnGetGridCellProps
+ write SetOnGetGridCellProps;
+
+ property Value: string read FValue write SetValue stored False;
+ property KeyValue: Variant read GetKeyValue write SetKeyValue stored False;
+ property OnSelect: TNotifyEvent read FOnSelect write FOnSelect;
+ property OnClosePopup:TClosePopup read FOnClosePopup write FOnClosePopup;
+
+ property UnfindedValue : TRxDBValueVariant read FUnfindedValue write FUnfindedValue default rxufNone;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ property PopupVisible:boolean read GetPopupVisible;
+ end;
+
+ { TRxDBLookupCombo }
+ TRxDBLookupCombo = class(TRxCustomDBLookupCombo)
+ protected
+ procedure OnInternalClosePopup(AResult:boolean);override;
+ public
+ property Value;
+ property KeyValue;
+ property Text;
+ published
+ property AutoSize;
+ property Align;
+ property Anchors;
+ property BorderSpacing;
+ property ButtonOnlyWhenFocused;
+ Property ButtonWidth;
+ property Color;
+ property DataField;
+ property DataSource;
+ Property DirectInput;
+ property DragCursor;
+ property DragMode;
+ property Enabled;
+ property PopUpFormOptions;
+ Property Flat;
+ property Font;
+ property Glyph;
+ property EmptyValue;
+ property EmptyItemColor;
+// property MaxLength;
+ property NumGlyphs;
+ Property OnButtonClick;
+ property OnChange;
+ property OnChangeData;
+ property OnClick;
+ property OnClosePopup;
+ property OnDblClick;
+ property OnDragDrop;
+ property OnDragOver;
+ property OnEndDrag;
+ property OnEnter;
+ property OnExit;
+ property OnKeyDown;
+ property OnKeyPress;
+ property OnKeyUp;
+ property OnMouseDown;
+ property OnMouseMove;
+ property OnMouseUp;
+ property OnMouseWheel;
+ property OnMouseWheelDown;
+ property OnMouseWheelUp;
+ property OnStartDrag;
+ property OnGetGridCellProps;
+ property OnSelect;
+
+ property ParentColor;
+ property ParentFont;
+ property ParentShowHint;
+ property PopupMenu;
+ property ReadOnly;
+ property ShowHint;
+ property TabOrder;
+ property TabStop;
+ property Visible;
+{ property Width default 100;
+ property Height default 23;}
+
+ property DisplayAllFields;
+ property DropDownCount;
+ property DropDownWidth;
+ property LookupDisplay;
+ property LookupDisplayIndex;
+ property LookupField;
+ property LookupSource;
+ property UnfindedValue;
+ end;
+
+implementation
+uses VCLUtils, Math, rxdconst;
+
+type
+ TDbGridAccess = class(TDbGrid)
+ end;
+ TPopUpFormAccess = class(TPopUpForm)
+ end;
+
+
+{ TRxCustomDBLookupEdit }
+
+function TRxCustomDBLookupEdit.GetLookupSource: TDataSource;
+begin
+ Result:=FLookupDataLink.DataSource;
+end;
+
+function TRxCustomDBLookupEdit.GetPopupVisible: boolean;
+begin
+ Result:=Assigned(FRxPopUpForm);
+end;
+
+function TRxCustomDBLookupEdit.GetDropDownCount: Integer;
+begin
+ Result:=FPopUpFormOptions.DropDownCount;
+end;
+
+function TRxCustomDBLookupEdit.GetDropDownWidth: Integer;
+begin
+ Result:=FPopUpFormOptions.DropDownWidth;
+end;
+
+procedure TRxCustomDBLookupEdit.SetDropDownCount(const AValue: Integer);
+begin
+ FPopUpFormOptions.DropDownCount:=AValue;
+end;
+
+procedure TRxCustomDBLookupEdit.SetDropDownWidth(const AValue: Integer);
+begin
+ FPopUpFormOptions.DropDownWidth:=AValue;
+end;
+
+procedure TRxCustomDBLookupEdit.SetLookupDisplay(const AValue: string);
+var
+ S1, S2:string;
+ K:integer;
+begin
+ if FLookupDisplay=AValue then exit;
+ FLookupDisplay:=AValue;
+ FFieldList.Clear;
+ S2:=AValue;
+ while S2<>'' do
+ begin
+ K:=Pos(';', S2);
+ if K>0 then
+ begin
+ S1:=Copy(S2, 1, K-1);
+ Delete(S2, 1, K);
+ end
+ else
+ begin
+ S1:=S2;
+ S2:='';
+ end;
+ FFieldList.Add(S1);
+ end;
+end;
+
+procedure TRxCustomDBLookupEdit.SetLookupDisplayIndex(const AValue: Integer);
+begin
+ if FLookupDisplayIndex=AValue then exit;
+ FLookupDisplayIndex:=AValue;
+end;
+
+procedure TRxCustomDBLookupEdit.SetLookupField(const AValue: string);
+begin
+ if FLookupField = AValue then exit;
+ FLookupField:=AValue;
+end;
+
+procedure TRxCustomDBLookupEdit.SetLookupSource(AValue: TDataSource);
+begin
+ FLookupDataLink.DataSource:=AValue;
+end;
+
+procedure TRxCustomDBLookupEdit.SetPopUpFormOptions(
+ const AValue: TPopUpFormOptions);
+begin
+ FPopUpFormOptions.Assign(AValue);
+end;
+
+procedure TRxCustomDBLookupEdit.ShowList;
+{var
+ i,W:integer;
+ GC:TColumn;}
+begin
+ if FLookupDataLink.Active and not PopupVisible then
+ begin
+ ShowPopUp;
+ end;
+end;
+
+procedure TRxCustomDBLookupEdit.HideList;
+begin
+
+end;
+
+procedure TRxCustomDBLookupEdit.ShowPopUp;
+var
+ R:TPoint;
+ FValue:string;
+ {$IFDEF LINUX}
+ TempF:TPopUpForm;
+ {$ENDIF}
+begin
+
+ if FLookupDataLink.Active then
+ if not PopupVisible then
+ begin
+
+ FValue := Text;
+
+ FLocateObject.Locate(FLookupField, FValue, true, false);
+
+(* FRxPopUpForm:=ShowRxDBPopUpForm(Self, FLookupDataLink.DataSet, @OnClosePopup,
+ FPopUpFormOptions, FLookupDisplay, LookupDisplayIndex, 0 {ButtonWidth}, Font);*)
+
+ FRxPopUpForm:=ShowRxDBPopUpForm(Self, FLookupDataLink.DataSet, @InternalClosePopup,
+ FPopUpFormOptions, FLookupDisplay, LookupDisplayIndex, 0 {ButtonWidth}, Font);
+ {$IFDEF LINUX}
+ TempF:=FRxPopUpForm;
+ if FRxPopUpForm.ShowModal = mrOk then
+ InternalClosePopup(true);
+ TempF.Free;
+ FRxPopUpForm:=nil
+ {$ENDIF}
+
+ end
+end;
+
+
+procedure TRxCustomDBLookupEdit.UpdateKeyValue;
+var
+ S:string;
+begin
+ S:=FFieldList[FLookupDisplayIndex];
+ if FLookupDataLink.Active then
+ Text:=FLookupDataLink.DataSet.FieldByName(S).AsString;
+end;
+
+{$IFDEF OLD_EDITBUTTON}
+procedure TRxCustomDBLookupEdit.DoButtonClick (Sender: TObject);
+{$ELSE}
+procedure TRxCustomDBLookupEdit.ButtonClick;
+{$ENDIF}
+begin
+{$IFDEF OLD_EDITBUTTON}
+ inherited DoButtonClick(Sender);
+{$ELSE}
+ inherited ButtonClick;
+{$ENDIF}
+ if PopupVisible then
+ HideList
+ else
+ ShowList;
+end;
+
+function TRxCustomDBLookupEdit.GetDefaultGlyphName: String;
+begin
+ Result:='rxbtn_downarrow';
+end;
+
+procedure TRxCustomDBLookupEdit.KeyDown(var Key: Word; Shift: TShiftState);
+begin
+ if (Key in [VK_PRIOR, VK_NEXT, VK_UP, VK_DOWN, VK_RETURN]) and PopupVisible then
+ begin
+{ if Key=VK_RETURN then HideList
+ else
+ TDbGridAccess(Flist).KeyDown(Key, Shift);
+ Key := 0;}
+ end
+ else
+ if (Key = VK_DOWN) and ((ssAlt in Shift) or (ssCtrl in Shift)) then
+ begin
+ ShowList;
+ Key := 0;
+ end;
+ inherited KeyDown(Key, Shift);
+{ FIgnoreChange := (SelLength > 0) or (Key = VK_BACK);}
+ if not (PopupVisible or ReadOnly) and (Key in [VK_UP, VK_DOWN]) and (Shift = []) then
+ begin
+ case Key of
+ VK_UP: if not FLookupDataLink.DataSet.BOF then FLookupDataLink.DataSet.Prior;
+ VK_DOWN: if not FLookupDataLink.DataSet.EOF then FLookupDataLink.DataSet.Next;
+ end;
+ Text:=FLookupDataLink.DataSet.FieldByName(FFieldList[FLookupDisplayIndex]).AsString;
+ Key:=0;
+ end;
+end;
+
+procedure TRxCustomDBLookupEdit.InternalClosePopup(AResult: boolean);
+begin
+ if Assigned(FOnClosePopup) then
+ FOnClosePopup(Self, AResult);
+
+{$IFDEF WINDOWS}
+ FRxPopUpForm:=nil;
+{$ENDIF}
+end;
+
+procedure TRxCustomDBLookupEdit.LookupDataSetChanged(Sender: TObject);
+begin
+ UpdateKeyValue;
+ Invalidate;
+end;
+
+procedure TRxCustomDBLookupEdit.ListLinkActiveChanged(Sender: TObject);
+var
+ DataSet: TDataSet;
+begin
+ FKeyField := nil;
+ DataSet:=nil;
+ if FLookupDataLink.Active and (FLookupField <> '') then
+ begin
+ DataSet := FLookupDataLink.DataSet;
+ FKeyField := DataSet.FieldByName(FLookupField);
+ end;
+ FLocateObject.DataSet := DataSet;
+
+ UpdateKeyValue
+end;
+
+constructor TRxCustomDBLookupEdit.Create(AOwner: TComponent);
+var
+ P:TBitmap;
+begin
+ inherited Create(AOwner);
+ FLocateObject:=CreateLocate(nil);
+
+ //Lookup
+ FLookupDataLink:=TLookupSourceLink.Create;
+ FLookupDataLink.FOnActiveChanged:=@ListLinkActiveChanged;
+ FLookupDataLink.FOnLayoutChanged:=@ListLinkActiveChanged;
+ FLookupDataLink.FOnDataSetChanged:=@LookupDataSetChanged;
+
+ FFieldList:=TStringList.Create;
+ ButtonWidth:=15;
+ FPopUpFormOptions:=TPopUpFormOptions.Create(Self);
+end;
+
+destructor TRxCustomDBLookupEdit.Destroy;
+begin
+ FreeAndNil(FLocateObject);
+ FreeAndNil(FPopUpFormOptions);
+ FFieldList.Clear;
+ FreeAndNil(FFieldList);
+ FreeAndNil(FLookupDataLink);
+ inherited Destroy;
+end;
+
+
+{ TRxCustomDBLookupCombo }
+
+function TRxCustomDBLookupCombo.GetMinHeight: Integer;
+begin
+ Result := 15{DefaultTextHeight} + GetBorderSize + 3;
+end;
+
+function TRxCustomDBLookupCombo.GetDisplayAll: Boolean;
+begin
+ Result := FDisplayAll;
+end;
+
+function TRxCustomDBLookupCombo.GetDropDownCount: Integer;
+begin
+ Result:=FPopUpFormOptions.DropDownCount
+end;
+
+function TRxCustomDBLookupCombo.GetDropDownWidth: Integer;
+begin
+ Result:=FPopUpFormOptions.DropDownWidth;
+end;
+
+function TRxCustomDBLookupCombo.GetDataSource: TDataSource;
+begin
+ Result := FDataLink.DataSource;
+end;
+
+function TRxCustomDBLookupCombo.GetLookupSource: TDataSource;
+begin
+ Result:=FLookupDataLink.DataSource;
+end;
+
+function TRxCustomDBLookupCombo.GetBorderSize: Integer;
+{var
+ Params: TCreateParams;
+ R: TRect;}
+begin
+{ CreateParams(Params);
+ SetRect(R, 0, 0, 0, 0);
+ AdjustWindowRectEx(R, Params.Style, False, Params.ExStyle);
+ Result := R.Bottom - R.Top;}
+ Result := 3;
+end;
+
+procedure TRxCustomDBLookupCombo.CheckButtonVisible;
+begin
+ if Assigned(FButton) then
+ FButton.Visible:=(csdesigning in ComponentState) or
+ (Visible and (Focused or not FButtonNeedsFocus));
+end;
+
+function TRxCustomDBLookupCombo.GetButtonWidth: Integer;
+begin
+ if Assigned(FButton) then Result:=FButton.Width
+ else Result:=0;
+end;
+
+function TRxCustomDBLookupCombo.GetFlat: Boolean;
+begin
+ if Assigned(FButton) then Result:=FButton.Flat
+ else Result:=false;
+end;
+
+function TRxCustomDBLookupCombo.GetGlyph: TBitmap;
+begin
+ if Assigned(FButton) then Result:=FButton.Glyph
+ else Result:=nil;
+end;
+
+function TRxCustomDBLookupCombo.GetNumGlyphs: Integer;
+begin
+ if Assigned(FButton) then Result:=FButton.NumGlyphs
+ else Result:=0;
+end;
+
+function TRxCustomDBLookupCombo.GetOnGetGridCellProps: TGetCellPropsEvent;
+begin
+ Result:=FPopUpFormOptions.OnGetCellProps;
+end;
+
+function TRxCustomDBLookupCombo.GetPopupVisible: boolean;
+begin
+ Result:=Assigned(FRxPopUpForm);
+end;
+
+procedure TRxCustomDBLookupCombo.SetButtonNeedsFocus(const AValue: Boolean);
+begin
+ if FButtonNeedsFocus<>AValue then
+ begin
+ FButtonNeedsFocus:=AValue;
+ CheckButtonVisible;
+ end;
+end;
+
+procedure TRxCustomDBLookupCombo.SetButtonWidth(const AValue: Integer);
+begin
+ if Assigned(FButton) then
+ FButton.Width:=AValue;
+end;
+
+procedure TRxCustomDBLookupCombo.SetDataFieldName(const AValue: string);
+begin
+ if FDataFieldName <> AValue then
+ begin
+ FDataFieldName := AValue;
+ DataLinkActiveChanged;
+ end;
+end;
+
+procedure TRxCustomDBLookupCombo.SetDataSource(const AValue: TDataSource);
+begin
+ FDataLink.DataSource := AValue;
+ if AValue <> nil then AValue.FreeNotification(Self);
+end;
+
+procedure TRxCustomDBLookupCombo.SetDisplayAll(const AValue: Boolean);
+begin
+ if FDisplayAll <> AValue then
+ begin
+ FDisplayAll := AValue;
+ Invalidate;
+ end;
+end;
+
+procedure TRxCustomDBLookupCombo.SetDropDownCount(const AValue: Integer);
+begin
+ FPopUpFormOptions.DropDownCount:=AValue;
+end;
+
+procedure TRxCustomDBLookupCombo.SetDropDownWidth(const AValue: Integer);
+begin
+ FPopUpFormOptions.DropDownWidth:=AValue;
+end;
+
+procedure TRxCustomDBLookupCombo.SetEmptyItemColor(const AValue: TColor);
+begin
+ if FEmptyItemColor=AValue then exit;
+ FEmptyItemColor:=AValue;
+ if not (csReading in ComponentState) then
+ Invalidate;
+end;
+
+procedure TRxCustomDBLookupCombo.SetEmptyValue(const AValue: string);
+begin
+ if FEmptyValue=AValue then exit;
+ FEmptyValue:=AValue;
+end;
+
+procedure TRxCustomDBLookupCombo.SetFlat(const AValue: Boolean);
+begin
+ if Assigned(FButton) then
+ FButton.Flat:=AValue;
+ Invalidate;
+end;
+
+procedure TRxCustomDBLookupCombo.SetGlyph(const AValue: TBitmap);
+begin
+ if Assigned(FButton) then
+ FButton.Glyph:=AValue;
+end;
+
+procedure TRxCustomDBLookupCombo.SetLookupDisplay(const AValue: string);
+var
+ S1, S2:string;
+ K:integer;
+begin
+ if FLookupDisplay=AValue then exit;
+ FLookupDisplay:=AValue;
+ FFieldList.Clear;
+ S2:=AValue;
+ while S2<>'' do
+ begin
+ K:=Pos(';', S2);
+ if K>0 then
+ begin
+ S1:=Copy(S2, 1, K-1);
+ Delete(S2, 1, K);
+ end
+ else
+ begin
+ S1:=S2;
+ S2:='';
+ end;
+ FFieldList.Add(S1);
+ end;
+ DisplayValueChanged;
+end;
+
+procedure TRxCustomDBLookupCombo.SetLookupDisplayIndex(const AValue: Integer);
+begin
+ if FLookupDisplayIndex=AValue then exit;
+ FLookupDisplayIndex:=AValue;
+end;
+
+procedure TRxCustomDBLookupCombo.SetLookupField(const AValue: string);
+begin
+ FLookupField:=AValue;
+end;
+
+procedure TRxCustomDBLookupCombo.SetLookupSource(const AValue: TDataSource);
+begin
+ FLookupDataLink.DataSource:=AValue;
+ FLocateObject.DataSet:=FLookupDataLink.DataSet;
+ FPopUpFormOptions.DataSource:=AValue;
+end;
+
+procedure TRxCustomDBLookupCombo.SetNumGlyphs(const AValue: Integer);
+begin
+ if Assigned(FButton) then
+ FButton.NumGlyphs:=AValue;
+end;
+
+procedure TRxCustomDBLookupCombo.SetOnGetGridCellProps(
+ const AValue: TGetCellPropsEvent);
+begin
+ FPopUpFormOptions.OnGetCellProps:=AValue;
+end;
+
+procedure TRxCustomDBLookupCombo.SetPopUpFormOptions(
+ const AValue: TPopUpFormOptions);
+begin
+ FPopUpFormOptions.Assign(AValue);
+end;
+
+procedure TRxCustomDBLookupCombo.SetReadOnly(const AValue: boolean);
+begin
+ if FReadOnly=AValue then exit;
+ FReadOnly:=AValue;
+end;
+
+function TRxCustomDBLookupCombo.StoreEmpty: boolean;
+begin
+ Result:=true;
+end;
+
+procedure TRxCustomDBLookupCombo.WMSetFocus(var Message: TLMSetFocus);
+begin
+ FButton.Visible:=True;
+ inherited WMSetFocus(Message);
+ Invalidate;
+end;
+
+procedure TRxCustomDBLookupCombo.WMKillFocus(var Message: TLMKillFocus);
+begin
+ if FButtonNeedsFocus then
+ FButton.Visible:=false;
+ inherited WMKillFocus(Message);
+ Invalidate;
+end;
+
+procedure TRxCustomDBLookupCombo.CMExit(var Message: TLMessage);
+begin
+ inherited;
+end;
+
+procedure TRxCustomDBLookupCombo.PaintDisplayValues(ACanvas: TCanvas; R: TRect;
+ ALeft: Integer);
+var
+ I, LastIndex, TxtWidth: Integer;
+ X, W, ATop, ARight: Integer;
+ S: string;
+ F:TField;
+begin
+ if (FValuesList.Count=0) or (not LookupSource.DataSet.Active) then exit;
+ if ColorToRGB(Self.Color) <> ColorToRGB(clBtnFace) then
+ ACanvas.Pen.Color := clBtnFace
+ else
+ ACanvas.Pen.Color := clBtnShadow;
+ LastIndex := FValuesList.Count-1;
+ TxtWidth := ACanvas.TextWidth('W');
+ ATop := Max(0, (HeightOf(R) - ACanvas.TextHeight('Xy')) div 2);
+ ARight := R.Right;
+ Inc(R.Left, ALeft);
+ for I := 0 to LastIndex do
+ begin
+ F:=LookupSource.DataSet.FieldByName(FFieldList[i]);
+ S := FValuesList[i];
+
+ if (FPopUpFormOptions.Columns.Count>i) and (I= ARight then
+ Break;
+ end;
+end;
+
+procedure TRxCustomDBLookupCombo.CheckNotCircular;
+begin
+ if FDataLink.Active and ((DataSource = LookupSource) or
+ (FDataLink.DataSet = FLookupDataLink.DataSet)) then
+ _DBError(SCircularDataLink);
+end;
+
+procedure TRxCustomDBLookupCombo.DisplayValueChanged;
+begin
+ FDisplayField:=nil;
+ if FLookupDataLink.Active and (FLookupDisplay <> '') then
+ begin
+ FDisplayField := FLookupDataLink.DataSet.FieldByName(FFieldList[FLookupDisplayIndex]);
+ if PopupVisible then
+ begin
+// UpdateData;
+ UpdateFieldValues;
+ end;
+ end;
+end;
+
+
+procedure TRxCustomDBLookupCombo.DataLinkActiveChanged;
+begin
+ if FDataLink.Active and (FDataFieldName <> '') then
+ begin
+ CheckNotCircular;
+ FDataField := FDataLink.DataSet.FieldByName(FDataFieldName);
+ end
+ else
+ begin
+ FDataField := nil;
+ end;
+ DataLinkRecordChanged(nil);
+end;
+
+procedure TRxCustomDBLookupCombo.DataLinkRecordChanged(Field: TField);
+begin
+ if (Field = nil) or (Field = FDataField) then
+ begin
+ if FDataField <> nil then
+ begin
+ SetValueKey(FDataField.AsString);
+ end
+ else
+ SetValueKey(FEmptyValue);
+ end
+end;
+
+procedure TRxCustomDBLookupCombo.UpdateFieldValues;
+var
+ i, k:integer;
+ F:TField;
+begin
+ FValuesList.Clear;
+ if not Assigned(FDataField) then
+ begin
+ if FLookupDataLink.Active then
+ if (Self.FSuccesfullyFind) or (Self.UnfindedValue = rxufLastSuccessful) then
+ begin
+ for i:=0 to FFieldList.Count-1 do
+ begin
+ F:=FLookupDataLink.DataSet.FieldByName(FFieldList[i]);
+ k:=FValuesList.Add(F.DisplayText);
+ FValuesList.Objects[k]:=TObject(PtrInt(F.DisplayWidth));
+ end;
+ end
+ else
+ case Self.UnfindedValue of
+ rxufNone : {Do nothing};
+ rxufOriginal : FValuesList.Add(FValue);//Show original field value...
+ end;
+ end
+ else
+ if Assigned(FDataField) then
+ begin
+ if FDataField.IsNull then
+ FValuesList.Add(FEmptyValue)
+ else
+ if FLookupDataLink.Active then
+ if (Self.FSuccesfullyFind) or (Self.UnfindedValue = rxufLastSuccessful) then
+ begin
+ for i:=0 to FFieldList.Count-1 do
+ begin
+ F:=FLookupDataLink.DataSet.FieldByName(FFieldList[i]);
+ k:=FValuesList.Add(F.DisplayText);
+ FValuesList.Objects[k]:=TObject(PtrInt(F.DisplayWidth));
+ end;
+ end
+ else
+ case Self.UnfindedValue of
+ rxufNone : {Do nothing};
+ rxufOriginal : FValuesList.Add(FValue);//Show original field value...
+ end;
+ end;
+end;
+
+procedure TRxCustomDBLookupCombo.ShowList;
+{$IFDEF LINUX}
+var
+ TempF:TPopUpForm;
+{$ENDIF}
+begin
+ if Assigned(FLookupDataLink.DataSet) and (FLookupDataLink.DataSet.Active) then
+ if not PopupVisible then
+ begin
+ if FDataField<>nil then
+ if FDataField <> nil then
+ FValue := FDataField.AsString
+ else
+ FValue := FEmptyValue;
+
+ if not Assigned(FDataField) then
+ begin
+ if not FLocateObject.Locate(FLookupField, FValue, true, false) then
+ FLookupDataLink.DataSet.First;
+ end
+ else
+ if Assigned(FDataField) and not FDataField.IsNull then
+ begin
+ if not FLocateObject.Locate(FLookupField, FValue, true, false) then
+ FLookupDataLink.DataSet.First;//In case we cannot find curvalue...
+ end
+ else
+ if FLookupDataLink.Active then
+ FLookupDataLink.DataSet.First;
+
+ FRxPopUpForm:=ShowRxDBPopUpForm(Self, FLookupDataLink.DataSet, @OnInternalClosePopup,
+ FPopUpFormOptions, FLookupDisplay, LookupDisplayIndex, 0 {ButtonWidth}, Font);
+{$IFDEF LINUX}
+ TempF:=FRxPopUpForm;
+ if FRxPopUpForm.ShowModal = mrOk then
+ {OnInternalClosePopup(true)};
+ TempF.Free;
+ FRxPopUpForm:=nil
+{$ENDIF}
+ end
+end;
+
+
+procedure TRxCustomDBLookupCombo.SetValueKey(const Value: string);
+begin
+ if FValue <> Value then
+ begin
+ FValue := Value;
+ if Assigned(FLookupDataLink.DataSet) and (FLookupDataLink.DataSet.Active) then
+ begin
+ FSuccesfullyFind := FLocateObject.Locate(FLookupField, FValue, true, false);
+ KeyValueChanged;
+ end;
+ end;
+end;
+
+procedure TRxCustomDBLookupCombo.UpdateKeyValue;
+begin
+ if Assigned(FDataField) then
+ if FDataField <> nil then
+ FValue := FDataField.AsString
+ else
+ FValue := FEmptyValue;
+
+ if not Assigned(FDataField) then
+ begin
+ if FValue=FEmptyValue then
+ FSuccesfullyFind := false
+ else
+ FSuccesfullyFind := FLocateObject.Locate(FLookupField, FValue, true, false);
+ end
+ else
+ if FDataField.IsNull then
+ FSuccesfullyFind := false
+ else
+ if not FDataField.IsNull then
+ FSuccesfullyFind := FLocateObject.Locate(FLookupField, FValue, true, false);
+ KeyValueChanged;
+end;
+
+procedure TRxCustomDBLookupCombo.KeyValueChanged;
+begin
+ UpdateFieldValues;
+ Invalidate;
+ DoChange;
+end;
+
+procedure TRxCustomDBLookupCombo.UpdateData;
+begin
+ //We have nothing to do here...
+end;
+
+procedure TRxCustomDBLookupCombo.NeedUpdateData;
+begin
+ if FLookupDataLink.Active and Assigned(FDataField) then
+ begin
+ if FKeyField.IsNull then FDataField.Clear
+ else FDataField.AsString:=FKeyField.AsString;
+ DoChangeData;
+ end;
+end;
+
+procedure TRxCustomDBLookupCombo.CalculatePreferredSize(var PreferredWidth,
+ PreferredHeight: integer; WithThemeSpace: Boolean);
+var
+ tmpCanvas: TCanvas;
+begin
+ inherited CalculatePreferredSize(PreferredWidth, PreferredHeight,
+ WithThemeSpace);
+ // ignore width
+ PreferredWidth:=0;
+ tmpCanvas := GetWorkingCanvas(Canvas);
+ try
+ PreferredHeight:=Canvas.TextHeight('Wg')+12;
+ //PreferredWidth:=Canvas.TextWidth('W')*12;
+ finally
+ if TmpCanvas<>Canvas then
+ FreeWorkingCanvas(tmpCanvas);
+ end;
+end;
+
+{procedure TRxCustomDBLookupCombo.GetPreferredSize(var PreferredWidth,
+ PreferredHeight: integer; Raw: boolean; WithThemeSpace: boolean);
+begin
+ inherited GetPreferredSize(PreferredWidth, PreferredHeight, Raw,
+ WithThemeSpace);
+end;
+
+
+class function TRxCustomDBLookupCombo.GetControlClassDefaultSize: TSize;
+begin
+ Result.CX := 170;
+ Result.CY := 50;
+end;
+}
+procedure TRxCustomDBLookupCombo.OnInternalClosePopup(AResult: boolean);
+begin
+ if Assigned(FRxPopUpForm) and AResult and (pfgColumnResize in FPopUpFormOptions.Options) then
+ FillPopupWidth(FPopUpFormOptions, FRxPopUpForm);
+
+ if Assigned(FOnClosePopup) then
+ FOnClosePopup(Self, AResult);
+
+ if FRxPopUpForm=nil then
+ begin
+ SetFocus;
+ Exit;
+ end;
+
+ FRxPopUpForm:=nil;
+ if not AResult then
+ UpdateKeyValue
+ else
+ if AResult and not Assigned(FDataLink.DataSource) and (FLookupDataLink.Active) then
+ begin
+ if FKeyField.IsNull then
+ SetValueKey(FEmptyValue)
+ else
+ SetValueKey(FKeyField.AsString);
+ end
+ else
+
+ if AResult and Assigned(FDataLink.DataSource) then
+ begin
+ FDataLink.Edit;
+ Visible:=true;
+ NeedUpdateData;//We need to update DataField;
+ end;
+
+ SetFocus;
+ if (AResult) and (Assigned(FOnSelect)) then
+ FOnSelect(Self);
+end;
+
+procedure TRxCustomDBLookupCombo.SetEnabled(Value: Boolean);
+begin
+ inherited SetEnabled(Value);
+ Invalidate;
+end;
+
+procedure TRxCustomDBLookupCombo.KeyDown(var Key: Word; Shift: TShiftState);
+begin
+ if (Key in [VK_PRIOR, VK_NEXT, VK_UP, VK_DOWN, VK_RETURN, VK_HOME, VK_END]) and PopupVisible then
+ begin
+ TPopUpFormAccess(FRxPopUpForm).KeyDown(Key, Shift);
+ end
+ else
+ if not PopupVisible then
+ begin
+ if (Key = VK_DOWN) and ((ssAlt in Shift) or (ssCtrl in Shift)) then
+ begin
+ ShowList;
+ Key := 0;
+ end
+ else
+ if (Key = VK_ESCAPE) and not (Assigned(FDataField)) then
+ begin
+ SetValueKey(FEmptyValue);
+ if Assigned(FOnSelect) then
+ FOnSelect(Self);
+ Key:=0;
+ end
+ else
+ if (Key = VK_ESCAPE) and (not FDataField.IsNull) and (FDataLink.Edit) then
+ begin
+ FDataField.Clear;
+ UpdateKeyValue;
+ if Assigned(FOnSelect) then
+ FOnSelect(Self);
+ DoChangeData;
+ Key:=0;
+ end;
+ end;
+ inherited KeyDown(Key, Shift);
+ if FLookupDataLink.Active and FDataLink.Active and not (PopupVisible or ReadOnly) then
+ begin
+ if (Key in [VK_UP, VK_DOWN]) and (Shift = []) then
+ begin
+ FDataLink.Edit;
+ if not FDataField.IsNull then
+ begin
+ //FLocateObject.Locate(FLookupField, FDataField.AsString, true, false);
+ If not FLocateObject.Locate(FLookupField, FDataField.AsString, true, false) then FLookupDataLink.DataSet.First;
+ case Key of
+ VK_UP: if not FLookupDataLink.DataSet.BOF then
+ FLookupDataLink.DataSet.Prior;
+ VK_DOWN: if not FLookupDataLink.DataSet.EOF then
+ FLookupDataLink.DataSet.Next;
+ end;
+ end;
+ //FDataLink.UpdateRecord; -- no need more...
+ Self.NeedUpdateData;
+ if Assigned(FOnSelect) then
+ FOnSelect(Self);
+ KeyValueChanged;
+ Key:=0;
+ end
+ end
+ else
+ if FLookupDataLink.Active and not (PopupVisible or ReadOnly) then
+ begin
+ if (Key in [VK_UP, VK_DOWN]) and (Shift = []) then
+ begin
+ case Key of
+ VK_UP: if not FLookupDataLink.DataSet.BOF then
+ FLookupDataLink.DataSet.Prior;
+ VK_DOWN: if not FLookupDataLink.DataSet.EOF then
+ FLookupDataLink.DataSet.Next;
+ end;
+ SetValueKey(FKeyField.AsString);
+ if Assigned(FOnSelect) then
+ FOnSelect(Self);
+ Key:=0;
+ end
+ end;
+
+end;
+
+procedure TRxCustomDBLookupCombo.UTF8KeyPress(var UTF8Key: TUTF8Char);
+begin
+ if not (PopupVisible) and ((UTF8Key >= #32) or (UTF8Key = #8)) then
+ ShowList;
+ inherited UTF8KeyPress(UTF8Key);
+ if PopupVisible then
+ FRxPopUpForm.UTF8KeyPress(UTF8Key);
+end;
+
+procedure TRxCustomDBLookupCombo.SetParent(AParent: TWinControl);
+begin
+ inherited SetParent(AParent);
+ if FButton <> nil then
+ CheckButtonVisible;
+end;
+
+procedure TRxCustomDBLookupCombo.DoSetBounds(ALeft, ATop, AWidth,
+ AHeight: Integer);
+begin
+ if not (csReading in ComponentState) and (Height < GetMinHeight) then
+ AHeight := GetMinHeight
+ else
+ begin
+ if (csDesigning in ComponentState) then
+ if (Height < GetMinHeight) then
+ AHeight := GetMinHeight;
+ end;
+
+ inherited DoSetBounds(ALeft, ATop, AWidth, AHeight);
+// DoPositionButton;
+end;
+
+procedure TRxCustomDBLookupCombo.DoPositionButton;
+begin
+ if FButton <> nil then
+ FButton.SetBounds(Left+Width, Top, FButton.Width, Height);
+end;
+
+procedure TRxCustomDBLookupCombo.DoChange;
+begin
+ if Assigned(FOnChange) then
+ FOnChange(Self);
+end;
+
+procedure TRxCustomDBLookupCombo.DoChangeData;
+begin
+ if Assigned(FOnChangeData) then
+ FOnChangeData(Self)
+end;
+
+procedure TRxCustomDBLookupCombo.DoButtonClick(Sender: TObject);
+begin
+ if (not FReadOnly) and (not FStopClick) then//We can do something if and only if that's not ReadOnly field...
+ begin
+ if Assigned(FOnButtonClick) then
+ FOnButtonClick(Self);
+ ShowList;
+ end;
+ FStopClick:=false;
+end;
+
+procedure TRxCustomDBLookupCombo.Loaded;
+begin
+ inherited Loaded;
+ CheckButtonVisible;
+end;
+
+procedure TRxCustomDBLookupCombo.Notification(AComponent: TComponent;
+ Operation: TOperation);
+begin
+ inherited Notification(AComponent, Operation);
+ if (AComponent = FButton) and (Operation = opRemove) then
+ FButton := nil;
+end;
+
+procedure TRxCustomDBLookupCombo.CMVisibleChanged(var Msg: TLMessage);
+begin
+ inherited CMVisibleChanged(Msg);
+ CheckButtonVisible;
+end;
+
+procedure TRxCustomDBLookupCombo.CMEnabledChanged(var Msg: TLMessage);
+begin
+ inherited CMEnabledChanged(Msg);
+ if FButton<>nil then
+ FButton.Enabled:=Enabled;
+end;
+
+procedure TRxCustomDBLookupCombo.Click;
+begin
+ inherited Click;
+ If not Self.PopupVisible then
+ DoButtonClick(Self);
+ FStopClick:=false;
+end;
+
+function TRxCustomDBLookupCombo.RealGetText: TCaption;
+begin
+ if PopupVisible then
+ Result:=inherited RealGetText
+ else
+ if (FLookupDisplayIndex>=0) and (FLookupDisplayIndex < FValuesList.Count) then
+ Result:=FValuesList[FLookupDisplayIndex]
+ else
+ Result:='';
+end;
+
+procedure TRxCustomDBLookupCombo.RealSetText(const Value: TCaption);
+var
+ LookFieldName:string;
+begin
+ inherited RealSetText(Value);
+ if not PopupVisible then
+ begin
+ if Assigned(FLookupDataLink.DataSet) and (FLookupDataLink.DataSet.Active) then
+ begin
+ if (FLookupDisplayIndex>=0) and (FLookupDisplayIndex 6 then
+ begin
+ SetRect(R1, 3, 3, ClientWidth - 3, ClientHeight - 3);
+ Canvas.FillRect(R1);
+ R.Right:=R.Right - GetButtonWidth;
+ if PopupVisible and (Caption<>'') then
+ begin
+ AText:=Caption;
+ Canvas.TextRect(R, TextMargin, Max(0, (HeightOf(R) - Canvas.TextHeight('Wg')) div 2), AText);
+ end
+ else
+ if FDisplayAll then
+ PaintDisplayValues(Canvas, R, TextMargin)
+ else
+ begin
+ if Assigned(FDataField) and FDataField.IsNull then
+ begin
+ SetRect(R1, 6, 6, ClientWidth - 6 - GetButtonWidth, ClientHeight - 6);
+ Canvas.Brush.Color:=FEmptyItemColor;
+ Canvas.FillRect(R1);
+ AText:=FEmptyValue
+ end
+ else
+ if FValuesList.Count>0 then
+ AText:=FValuesList[FLookupDisplayIndex]
+ else
+ AText:='';
+ Canvas.TextRect(R, TextMargin, Max(0, (HeightOf(R) - Canvas.TextHeight('Wg')) div 2), AText);
+ end
+ end;
+end;
+
+procedure TRxCustomDBLookupCombo.LookupDataSetChanged(Sender: TObject);
+begin
+ if PopupVisible then
+ begin
+ FSuccesfullyFind := true;
+ UpdateFieldValues;
+ Invalidate;
+ end;
+end;
+
+procedure TRxCustomDBLookupCombo.ListLinkActiveChanged(Sender: TObject);
+var
+ DataSet: TDataSet;
+begin
+ FListActive := False;
+ FKeyField := nil;
+ FDisplayField := nil;
+ DataSet:=nil;
+ if FLookupDataLink.Active and (FLookupField <> '') and (FFieldList.Count>FLookupDisplayIndex) and (FLookupDisplayIndex>=0) then
+ begin
+ CheckNotCircular;
+ DataSet := FLookupDataLink.DataSet;
+ FKeyField := DataSet.FieldByName(FLookupField);
+ FListActive := True;
+ FDisplayField := FLookupDataLink.DataSet.FieldByName(FFieldList[FLookupDisplayIndex]);
+ end;
+ FLocateObject.DataSet := DataSet;
+
+ if not (csDestroying in ComponentState) then
+ begin
+ if FListActive and Assigned(FDataField) then UpdateKeyValue
+// else KeyValueChanged;
+ end;
+end;
+
+procedure TRxCustomDBLookupCombo.SetValue(const Value: string);
+begin
+ if (Value <> FValue) then
+ begin
+ if FListActive and not ReadOnly and (FDataLink.DataSource <> nil) and FDataLink.Edit then
+ begin
+ FDataField.AsString := Value;
+ DoChangeData;
+ end
+ else
+ SetValueKey(Value);
+ if Assigned(FOnSelect) then
+ FOnSelect(Self);
+ end;
+end;
+
+function TRxCustomDBLookupCombo.GetKeyValue: Variant;
+begin
+ if Value = FEmptyValue then
+ Result := null
+ else
+ Result := Value;
+end;
+
+procedure TRxCustomDBLookupCombo.SetKeyValue(const Value: Variant);
+begin
+ Self.Value := Value;
+end;
+
+constructor TRxCustomDBLookupCombo.Create(AOwner: TComponent);
+var
+ ArrowBmp:TBitmap;
+begin
+ inherited Create(AOwner);
+ FStopClick:=false;
+ Width := 100;
+ AutoSize:=true;
+ FUnfindedValue:=rxufNone;
+ FFieldList := TStringList.Create;
+ FValuesList:= TStringList.Create;
+ FLocateObject:=CreateLocate(nil);
+ FPopUpFormOptions:=TPopUpFormOptions.Create(Self);
+ //Lookup
+ FLookupDataLink:=TLookupSourceLink.Create;
+ FLookupDataLink.FOnActiveChanged:=@ListLinkActiveChanged;
+ FLookupDataLink.FOnLayoutChanged:=@ListLinkActiveChanged;
+ FLookupDataLink.FOnDataSetChanged:=@LookupDataSetChanged;
+
+ //Data
+ FDataLink:=TDataSourceLink.Create;
+ FDataLink.FDataControl:=Self;
+
+
+ FButton := TSpeedButton.Create(Self);
+ FButton.Width := Self.Height;
+ FButton.Height := Self.Height;
+ FButton.FreeNotification(Self);
+ FButton.Parent:=Self;
+ CheckButtonVisible;
+ FButton.OnClick := @DoButtonClick;
+ FButton.Cursor := crArrow;
+ FButton.ControlStyle := FButton.ControlStyle + [csNoDesignSelectable];
+ FButton.Align:=alRight;
+ FButton.BorderSpacing.Around:=2;
+
+ ControlStyle := ControlStyle - [csSetCaption];
+ FDirectInput := True;
+ ParentColor:=false;
+ //
+ Color:=clWindow;
+ FEmptyItemColor:=clWindow;
+// Glyph:=CreateArrowBitmap;
+ ArrowBmp:=CreateArrowBitmap;
+ Glyph:=ArrowBmp;
+ FreeAndNil(ArrowBmp); //free bitmap as TSpeedButton setter takes a copy of bitmap
+
+ ButtonWidth:=15;
+ TabStop:=true;
+end;
+
+destructor TRxCustomDBLookupCombo.Destroy;
+begin
+ FreeAndNil(FLocateObject);
+ FreeAndNil(FDataLink);
+ FreeAndNil(FLookupDataLink);
+ FreeAndNil(FButton);
+ FFieldList.Clear;
+ FreeAndNil(FFieldList);
+ FreeAndNil(FValuesList);
+ FreeAndNil(FPopUpFormOptions);
+ inherited Destroy;
+end;
+
+
+{ TDataSourceLink }
+
+procedure TDataSourceLink.ActiveChanged;
+begin
+ if FDataControl <> nil then
+ FDataControl.DataLinkActiveChanged;
+end;
+
+procedure TDataSourceLink.LayoutChanged;
+begin
+ inherited LayoutChanged;
+end;
+
+procedure TDataSourceLink.FocusControl(Field: TFieldRef);
+begin
+ if Assigned(Field) and (FDataControl.FDataField = Field^) then
+ if FDataControl.CanFocus then
+ begin
+ Field^ := nil;
+ FDataControl.SetFocus;
+ end;
+end;
+
+procedure TDataSourceLink.RecordChanged(Field: TField);
+begin
+ if FDataControl <> nil then
+ FDataControl.DataLinkRecordChanged(Field);
+end;
+
+procedure TDataSourceLink.UpdateData;
+begin
+ if FDataControl <> nil then
+ FDataControl.UpdateData;
+end;
+
+{ TLookupSourceLink }
+
+procedure TLookupSourceLink.ActiveChanged;
+begin
+{ if FDataControl <> nil then
+ FDataControl.ListLinkActiveChanged;}
+ if Assigned(FOnActiveChanged) then
+ FOnActiveChanged(DataSet);
+end;
+
+procedure TLookupSourceLink.LayoutChanged;
+begin
+{ if FDataControl <> nil then
+ FDataControl.ListLinkActiveChanged;}
+ if Assigned(FOnLayoutChanged) then
+ FOnLayoutChanged(DataSet);
+end;
+
+procedure TLookupSourceLink.DataSetChanged;
+begin
+{ if FDataControl <> nil then
+ FDataControl.LookupDataSetChanged;}
+ if Assigned(FOnDataSetChanged) then
+ FOnDataSetChanged(DataSet);
+end;
+
+{ TRxDBLookupCombo }
+
+procedure TRxDBLookupCombo.OnInternalClosePopup(AResult: boolean);
+begin
+ inherited OnInternalClosePopup(AResult);
+ if MouseEntered or FButton.MouseEntered then
+ FStopClick:=true;
+end;
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/rxmdi.pas b/components/rx/version/v2.2_laz_1.2/rxmdi.pas
new file mode 100644
index 000000000..a9f861e8e
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxmdi.pas
@@ -0,0 +1,769 @@
+{ Free DB Manager
+
+ Copyright (C) 2005-2012 Lagunov Aleksey alexs75 at hotbox.ru
+
+ This source is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This code is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ details.
+
+ A copy of the GNU General Public License is available on the World Wide Web
+ at . You can also obtain it by writing
+ to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ MA 02111-1307, USA.
+}
+unit RxMDI;
+
+{$I rx.inc}
+
+interface
+
+uses
+ Classes, SysUtils, Forms, Buttons, Menus, ExtCtrls, Graphics, Controls;
+
+type
+ TRxMDIPanel = class;
+ TRxMDITasks = class;
+
+ { TRxMDIButton }
+
+ TRxMDIButton = class(TSpeedButton)
+ private
+ FNavForm: TForm;
+ FActiveControl:TWinControl;
+ FNavPanel:TRxMDITasks;
+ procedure SetRxMDIForm(AValue: TForm);
+ procedure DoCreateMenuItems;
+
+ procedure DoCloseMenu(Sender: TObject);
+ procedure DoCloseAllMenu(Sender: TObject);
+ procedure DoCloseAllExcepThisMenu(Sender: TObject);
+ procedure DoActivateMenu(Sender: TObject);
+ procedure DoCreateButtonImage;
+ private
+ FMenu:TPopupMenu;
+ procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
+ public
+ constructor CreateButton(AOwner:TRxMDITasks; AForm:TForm);
+ procedure Click; override; // make Click public
+ procedure UpdateCaption;
+ property NavForm:TForm read FNavForm write SeTRxMDIForm;
+ end;
+
+ { TRxMDITasks }
+
+ TRxMDITasks = class(TCustomPanel)
+ private
+ FBtnScrollLeft:TSpeedButton;
+ FBtnScrollRigth:TSpeedButton;
+ FMainPanel: TRxMDIPanel;
+ procedure UpdateScrollBtnStatus;
+ procedure ScrollLeftExecute(Sender: TObject);
+ procedure ScrollRigthExecute(Sender: TObject);
+ procedure ShowHiddenBtnOnResize;
+ procedure ChildWindowsShowLast;
+ procedure DoCloseAll(AIgnoreBtn:TRxMDIButton);
+ protected
+ procedure Paint; override;
+ procedure Resize; override;
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ public
+ constructor Create(TheOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure AddButton(Btn:TRxMDIButton);
+ procedure ShowWindow(F:TForm);
+ property MainPanel:TRxMDIPanel read FMainPanel write FMainPanel;
+ published
+ property Align;
+ end;
+
+ { TRxMDICloseButton }
+
+ TRxMDICloseButton = class(TCustomSpeedButton)
+ private
+ FInfoLabel:TBoundLabel;
+ FLabelSpacing:integer;
+ FMDIPanel:TRxMDIPanel;
+ protected
+ procedure SetParent(AParent: TWinControl); override;
+ procedure Loaded; override;
+ procedure DoPositionLabel;
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ procedure CreateInternalLabel;
+ public
+ constructor Create(AOwner: TComponent); override;
+ published
+ property Align;
+ property Anchors;
+ property Glyph;
+ property Flat;
+ end;
+
+ { TRxMDIPanel }
+
+ TRxMDIPanel = class(TCustomPanel)
+ private
+ FCurrentChildWindow: TForm;
+ FCloseButton: TRxMDICloseButton;
+ FTaskPanel: TRxMDITasks;
+ procedure SetCurrentChildWindow(AValue: TForm);
+ procedure navCloseButtonClick(Sender: TObject);
+ procedure SetRxMDICloseButton(AValue: TRxMDICloseButton);
+ procedure SetTaskPanel(AValue: TRxMDITasks);
+ function MDIButtonByForm(AForm:TForm):TRxMDIButton;
+ procedure HideCurrentWindow;
+ protected
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ procedure Loaded; override;
+ public
+ constructor Create(TheOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure ShowWindow(F:TForm);
+
+ procedure ChildWindowsAdd(F:TForm);
+ procedure ChildWindowsCreate(var AForm; FC:TFormClass);
+ procedure ChildWindowsUpdateCaption(F:TForm);
+ procedure CloseAll;
+
+ property CurrentChildWindow:TForm read FCurrentChildWindow write SetCurrentChildWindow;
+ published
+ property CloseButton:TRxMDICloseButton read FCloseButton write SetRxMDICloseButton;
+ property TaskPanel:TRxMDITasks read FTaskPanel write SetTaskPanel;
+
+ property Align;
+ property BevelInner;
+ property BevelOuter;
+ end;
+
+implementation
+uses LResources, vclutils, rxconst;
+// LCLProc;
+
+
+{ TRxMDICloseButton }
+
+procedure TRxMDICloseButton.SetParent(AParent: TWinControl);
+begin
+ inherited SetParent(AParent);
+ DoPositionLabel;
+end;
+
+procedure TRxMDICloseButton.Loaded;
+begin
+ inherited Loaded;
+ DoPositionLabel;
+end;
+
+procedure TRxMDICloseButton.DoPositionLabel;
+begin
+ if FInfoLabel = nil then exit;
+ if Parent<>nil then
+ Parent.DisableAlign;
+ //DebugLn(['TCustomLabeledEdit.DoPositionLabel ']);
+ FInfoLabel.Parent := Parent;
+ FInfoLabel.Visible := Visible;
+{ case FLabelPosition of
+ lpAbove:
+ begin
+ FInfoLabel.AnchorParallel(akLeft,0,Self);
+ FInfoLabel.AnchorToCompanion(akBottom,FLabelSpacing,Self);
+ end;
+ lpBelow:
+ begin
+ FInfoLabel.AnchorParallel(akLeft,0,Self);
+ FInfoLabel.AnchorToCompanion(akTop,FLabelSpacing,Self);
+ end;
+ lpLeft :
+ begin}
+ FInfoLabel.AnchorToCompanion(akRight,FLabelSpacing,Self);
+ FInfoLabel.AnchorVerticalCenterTo(Self);
+{ end;
+ lpRight:
+ begin
+ FInfoLabel.AnchorToCompanion(akLeft,FLabelSpacing,Self);
+ FInfoLabel.AnchorVerticalCenterTo(Self);
+ end;
+ end;}
+ if Parent<>nil then
+ Parent.EnableAlign;
+end;
+
+procedure TRxMDICloseButton.Notification(AComponent: TComponent;
+ Operation: TOperation);
+begin
+ inherited Notification(AComponent, Operation);
+ if (AComponent = FInfoLabel) and (Operation = opRemove) then
+ FInfoLabel := nil
+ else
+ if (AComponent = FMDIPanel) and (Operation = opRemove) then
+ begin
+ FMDIPanel:=nil;
+ OnClick:=nil;
+ end;
+end;
+
+procedure TRxMDICloseButton.CreateInternalLabel;
+begin
+ if FInfoLabel<>nil then exit;
+ FInfoLabel := TBoundLabel.Create(Self);
+ FInfoLabel.ControlStyle := FInfoLabel.ControlStyle + [csNoDesignSelectable];
+end;
+
+constructor TRxMDICloseButton.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+// FLabelPosition := lpAbove;
+ FLabelSpacing := 3;
+ CreateInternalLabel;
+ Glyph:=LoadLazResBitmapImage('RxMDICloseIcon');
+end;
+
+{ TRxMDIPanel }
+
+procedure TRxMDIPanel.SetCurrentChildWindow(AValue: TForm);
+begin
+ FCurrentChildWindow:=AValue;
+ if Assigned(FCloseButton) then
+ begin
+ FCloseButton.Enabled:=Assigned(FCurrentChildWindow);
+ if FCloseButton.Enabled then
+ FCloseButton.FInfoLabel.Caption:=FCurrentChildWindow.Caption
+ else
+ FCloseButton.FInfoLabel.Caption:='';
+ end;
+
+ if Assigned(TaskPanel) then
+ TaskPanel.Visible:=Assigned(FCurrentChildWindow);
+end;
+
+procedure TRxMDIPanel.navCloseButtonClick(Sender: TObject);
+begin
+ if Assigned(FCurrentChildWindow) then
+ begin
+ if not (csDestroying in FCurrentChildWindow.ComponentState) then
+ FCurrentChildWindow.Close
+ end;
+end;
+
+procedure TRxMDIPanel.SetRxMDICloseButton(AValue: TRxMDICloseButton);
+begin
+ if FCloseButton=AValue then Exit;
+ if Assigned(FCloseButton) then
+ begin
+ FCloseButton.OnClick:=nil;
+ FCloseButton.FMDIPanel:=nil;
+ end;
+
+ FCloseButton:=AValue;
+
+ if Assigned(FCloseButton) then
+ begin
+ FCloseButton.OnClick:=@navCloseButtonClick;
+ FCloseButton.FMDIPanel:=Self;
+ end;
+end;
+
+procedure TRxMDIPanel.SetTaskPanel(AValue: TRxMDITasks);
+begin
+ if FTaskPanel=AValue then Exit;
+ FTaskPanel:=AValue;
+ if Assigned(FTaskPanel) then
+ FTaskPanel.FMainPanel:=Self;
+end;
+
+function TRxMDIPanel.MDIButtonByForm(AForm: TForm): TRxMDIButton;
+var
+ i:integer;
+begin
+ Result:=nil;
+ if not Assigned(FTaskPanel) then
+ exit;
+ for i:=0 to FTaskPanel.ComponentCount -1 do
+ begin
+ if (FTaskPanel.Components[i] is TRxMDIButton) and (TRxMDIButton(FTaskPanel.Components[i]).NavForm = AForm) then
+ begin
+ Result:=TRxMDIButton(FTaskPanel.Components[i]);
+ exit;
+ end;
+ end;
+end;
+
+procedure TRxMDIPanel.HideCurrentWindow;
+var
+ MB:TRxMDIButton;
+begin
+ if Assigned(FCurrentChildWindow) and (FCurrentChildWindow.Visible) then
+ begin
+ MB:=MDIButtonByForm(FCurrentChildWindow);
+ if Assigned(MB) then
+ MB.FActiveControl:=Application.MainForm.ActiveControl;
+ FCurrentChildWindow.Hide;
+ end;
+end;
+
+procedure TRxMDIPanel.Notification(AComponent: TComponent; Operation: TOperation
+ );
+begin
+ inherited Notification(AComponent, Operation);
+ if (AComponent = FCloseButton) and (Operation = opRemove) then
+ FCloseButton := nil
+ else
+ if (AComponent = FTaskPanel) and (Operation = opRemove) then
+ FTaskPanel:=nil;
+end;
+
+procedure TRxMDIPanel.Loaded;
+begin
+ inherited Loaded;
+ CurrentChildWindow:=nil;
+end;
+
+constructor TRxMDIPanel.Create(TheOwner: TComponent);
+begin
+ inherited Create(TheOwner);
+ Caption:='';
+ Align:=alClient;
+ BevelOuter:=bvLowered;
+end;
+
+destructor TRxMDIPanel.Destroy;
+begin
+ inherited Destroy;
+end;
+
+procedure TRxMDIPanel.ShowWindow(F: TForm);
+begin
+ TaskPanel.ShowWindow(F);
+end;
+
+procedure TRxMDIPanel.ChildWindowsAdd(F: TForm);
+var
+ B:TRxMDIButton;
+begin
+ Assert(Assigned(TaskPanel), 'Нет связанной панели задач');
+ HideCurrentWindow;
+ F.BorderStyle:=bsNone;
+ F.Align:=alClient;
+ F.Parent:=Self;
+ F.Visible:=true;
+ F.BringToFront;
+ Application.MainForm.ActiveControl:=F;
+
+ B:=TRxMDIButton.CreateButton(TaskPanel, F);
+
+end;
+
+procedure TRxMDIPanel.ChildWindowsCreate(var AForm; FC: TFormClass);
+var
+ FForm:TForm absolute AForm;
+begin
+ if not Assigned(FForm) then
+ begin
+ HideCurrentWindow;
+ FForm:=FC.Create(Self);
+ ChildWindowsAdd(FForm);
+ end
+ else
+ ShowWindow(FForm)
+end;
+
+procedure TRxMDIPanel.ChildWindowsUpdateCaption(F: TForm);
+var
+ i:integer;
+ B:TRxMDIButton;
+begin
+ if (FCurrentChildWindow = F) and Assigned(FCloseButton) and FCloseButton.Enabled then
+ FCloseButton.FInfoLabel.Caption:=F.Caption;
+
+ for i:=0 to TaskPanel.ComponentCount -1 do
+ begin
+ if TRxMDIButton(TaskPanel.Components[i]).NavForm = F then
+ begin
+ TRxMDIButton(TaskPanel.Components[i]).UpdateCaption;
+ exit;
+ end;
+ end;
+end;
+
+procedure TRxMDIPanel.CloseAll;
+begin
+ if Assigned(FTaskPanel) then
+ FTaskPanel.DoCloseAll(nil);
+end;
+
+
+{ TRxMDITasks }
+
+procedure TRxMDITasks.UpdateScrollBtnStatus;
+var
+ i, W:Integer;
+ B:TRxMDIButton;
+begin
+ W:=FBtnScrollLeft.Width + FBtnScrollRigth.Width;
+ FBtnScrollLeft.Enabled:=false;
+ for i:=0 to ComponentCount-1 do
+ begin
+ B:=TRxMDIButton(Components[i]);
+ if not B.Visible then
+ FBtnScrollLeft.Enabled:=true
+ else
+ W:=W+B.Width + 2;
+ end;
+
+ FBtnScrollRigth.Enabled:=W > Width;
+end;
+
+procedure TRxMDITasks.ScrollLeftExecute(Sender: TObject);
+var
+ i:Integer;
+ B:TRxMDIButton;
+begin
+ for i:=0 to ComponentCount-1 do
+ begin
+ if (Components[i] is TRxMDIButton) then
+ begin
+ B:=TRxMDIButton(Components[i]);
+ if not B.Visible then
+ begin
+ B.Visible:=true;
+ B.Left:=FBtnScrollLeft.Width;
+ break;
+ end;
+ end;
+ end;
+
+ UpdateScrollBtnStatus;
+ Invalidate;
+end;
+
+procedure TRxMDITasks.ScrollRigthExecute(Sender: TObject);
+var
+ i:Integer;
+ B:TRxMDIButton;
+begin
+ for i:=0 to ComponentCount - 1 do
+ begin
+ if (Components[i] is TRxMDIButton) then
+ begin
+ B:=TRxMDIButton(Components[i]);
+ if B.Visible then
+ begin
+ B.Visible:=false;
+ break;
+ end;
+ end;
+ end;
+
+ UpdateScrollBtnStatus;
+ Invalidate;
+end;
+
+procedure TRxMDITasks.ShowHiddenBtnOnResize;
+begin
+
+end;
+
+procedure TRxMDITasks.ChildWindowsShowLast;
+var
+ CC:TControl;
+ i:integer;
+begin
+ if (FMainPanel.ControlCount>1) and (not Application.Terminated) then
+ begin
+ CC:=FMainPanel.Controls[FMainPanel.ControlCount-2];
+
+ if Assigned(CC) then
+ ShowWindow(CC as TForm)
+ end
+ else
+ FMainPanel.CurrentChildWindow:=nil;
+// Invalidate;
+end;
+
+procedure TRxMDITasks.DoCloseAll(AIgnoreBtn: TRxMDIButton);
+var
+ i:integer;
+begin
+ for i:=ComponentCount-1 downto 0 do
+ begin
+ if (Components[i] is TRxMDIButton) and (TRxMDIButton(Components[i]) <> AIgnoreBtn) then
+ TRxMDIButton(Components[i]).DoCloseMenu(nil);
+ end;
+ if Assigned(AIgnoreBtn) then
+ FMainPanel.CurrentChildWindow:=AIgnoreBtn.FNavForm;
+end;
+
+procedure TRxMDITasks.Paint;
+var
+ i:integer;
+ H:integer;
+ B:TRxMDIButton;
+begin
+ inherited Paint;
+ Canvas.Pen.Color:=clBlack;
+ H:=Height - 2;
+ for i:=0 to ComponentCount - 1 do
+ begin
+ if (Components[i] is TRxMDIButton) then
+ begin
+ B:=TRxMDIButton(Components[i]);
+ if (B.Visible) and (B.Left > B.Width) then
+ begin
+ Canvas.Pen.Color:=clBtnShadow;
+ Canvas.Line(B.Left - 2, 2, B.Left - 2, H);
+ Canvas.Pen.Color:=clWindow;
+ Canvas.Line(B.Left - 1, 2, B.Left - 1, H);
+ end;
+ end;
+ end;
+end;
+
+procedure TRxMDITasks.Resize;
+begin
+ inherited Resize;
+ if Assigned(FBtnScrollLeft) and Assigned(FBtnScrollRigth) then
+ UpdateScrollBtnStatus;
+end;
+
+procedure TRxMDITasks.Notification(AComponent: TComponent; Operation: TOperation
+ );
+begin
+ inherited Notification(AComponent, Operation);
+ if (AComponent = FMainPanel) and (Operation = opRemove) then
+ FMainPanel := nil
+end;
+
+constructor TRxMDITasks.Create(TheOwner: TComponent);
+begin
+ inherited Create(TheOwner);
+ Caption:='';
+
+ FBtnScrollLeft:=TSpeedButton.Create(Self);
+ FBtnScrollLeft.Parent:=Self;
+ FBtnScrollLeft.Align:=alLeft;
+ FBtnScrollLeft.AnchorSide[akLeft].Control:=Self;
+ FBtnScrollLeft.Anchors:=[akLeft, akTop, akBottom];
+ FBtnScrollLeft.OnClick:=@ScrollLeftExecute;
+ FBtnScrollLeft.Caption:='<';
+ FBtnScrollLeft.ShowCaption:=true;
+ FBtnScrollLeft.AutoSize:=true;
+ FBtnScrollLeft.Flat:=true;
+ FBtnScrollLeft.Transparent:=false;
+
+ FBtnScrollRigth:=TSpeedButton.Create(Self);
+ FBtnScrollRigth.Parent:=Self;
+ FBtnScrollRigth.Align:=alRight;
+ FBtnScrollRigth.Anchors:=[akRight, akTop, akBottom];
+ FBtnScrollRigth.AnchorSide[akRight].Control:=Self;
+ FBtnScrollRigth.OnClick:=@ScrollRigthExecute;
+ FBtnScrollRigth.Caption:='>';
+ FBtnScrollRigth.ShowCaption:=true;
+ FBtnScrollRigth.AutoSize:=true;
+ FBtnScrollRigth.Flat:=true;
+ FBtnScrollRigth.Transparent:=false;
+
+ Align:=alBottom;
+ Height:=25;
+end;
+
+destructor TRxMDITasks.Destroy;
+begin
+ FBtnScrollRigth:=nil;
+ FBtnScrollLeft:=nil;
+ inherited Destroy;
+end;
+
+procedure TRxMDITasks.AddButton(Btn: TRxMDIButton);
+begin
+ Btn.Parent:=Self;
+ Btn.Left:=Width-1;
+ Btn.Down:=true;
+ Btn.BorderSpacing.Left:=3;
+ Btn.BorderSpacing.Right:=3;
+
+ FBtnScrollRigth.BringToFront;
+ FBtnScrollLeft.BringToFront;
+
+ UpdateScrollBtnStatus;
+end;
+
+procedure TRxMDITasks.ShowWindow(F: TForm);
+var
+ i:integer;
+begin
+ for i:=0 to ComponentCount -1 do
+ begin
+ if (Components[i] is TRxMDIButton) and (TRxMDIButton(Components[i]).NavForm = F) then
+ begin
+ TRxMDIButton(Components[i]).Click;
+ TRxMDIButton(Components[i]).Visible:=true;
+ exit;
+ end;
+ end;
+end;
+
+
+{ TRxMDIButton }
+
+procedure TRxMDIButton.SetRxMDIForm(AValue: TForm);
+var
+ FImageIndex:integer;
+ B:TBitmap;
+begin
+ if FNavForm=AValue then Exit;
+ FNavForm:=AValue;
+ if Assigned(FNavForm) then
+ begin
+ FNavForm.AddHandlerClose(@FormClose);
+
+ Caption:=' '+FNavForm.Caption+' ';
+ DoCreateButtonImage;
+
+ if Assigned(FNavPanel) then
+ FNavPanel.FMainPanel.CurrentChildWindow:=NavForm;
+ end;
+end;
+
+procedure TRxMDIButton.DoCreateMenuItems;
+var
+ Item: TMenuItem;
+begin
+ Item:=TMenuItem.Create(Self);
+ Item.Caption:=Caption;
+ Item.OnClick:=@DoActivateMenu;
+ FMenu.Items.Add(Item);
+
+ Item:=TMenuItem.Create(Self);
+ Item.Caption:='-';
+ FMenu.Items.Add(Item);
+
+ Item:=TMenuItem.Create(Self);
+ Item.Caption:=sCloseWindows;
+ Item.OnClick:=@DoCloseMenu;
+ FMenu.Items.Add(Item);
+
+ Item:=TMenuItem.Create(Self);
+ Item.Caption:='-';
+ FMenu.Items.Add(Item);
+
+
+ Item:=TMenuItem.Create(Self);
+ Item.Caption:=sCloseAllExceptThis;
+ Item.OnClick:=@DoCloseAllExcepThisMenu;
+ FMenu.Items.Add(Item);
+
+ Item:=TMenuItem.Create(Self);
+ Item.Caption:=sCloseAllWindows;
+ Item.OnClick:=@DoCloseAllMenu;
+ FMenu.Items.Add(Item);
+end;
+
+procedure TRxMDIButton.DoCloseMenu(Sender: TObject);
+begin
+ if Assigned(FNavForm) then
+ FNavForm.Close;
+// Application.ProcessMessages;
+end;
+
+procedure TRxMDIButton.DoCloseAllMenu(Sender: TObject);
+begin
+ FNavPanel.DoCloseAll(nil);
+end;
+
+procedure TRxMDIButton.DoCloseAllExcepThisMenu(Sender: TObject);
+begin
+ FNavPanel.DoCloseAll(Self);
+end;
+
+procedure TRxMDIButton.DoActivateMenu(Sender: TObject);
+begin
+ Click;
+end;
+
+procedure TRxMDIButton.DoCreateButtonImage;
+var
+ FImageIndex:integer;
+ B:TBitmap;
+begin
+ if Assigned(NavForm.Icon) and (NavForm.Icon.Count>0) then
+ begin
+ B:=TBitmap.Create;
+ try
+ B.Width:=NavForm.Icon.Width;
+ B.Height:=NavForm.Icon.Height;
+
+ B.Canvas.Brush.Color:=Color;
+ B.Canvas.FillRect(0,0, B.Width, B.Height);
+ B.Canvas.Draw(0, 0, NavForm.Icon);
+
+ Glyph.Assign(B);
+ finally
+ B.Free;
+ end;
+ end;
+end;
+
+procedure TRxMDIButton.FormClose(Sender: TObject; var CloseAction: TCloseAction);
+begin
+ if (not Assigned(FNavPanel)) or (not Assigned(FNavPanel.FMainPanel)) then
+ exit;
+
+ if FNavPanel.FMainPanel.FCurrentChildWindow = Sender then
+ FNavPanel.ChildWindowsShowLast;
+ FNavPanel.ShowHiddenBtnOnResize;
+ CloseAction:=caFree;
+ Owner.RemoveComponent(Self);
+ FNavPanel.FMainPanel.RemoveControl(Sender as TCustomForm);
+ Application.ReleaseComponent(Self);
+end;
+
+constructor TRxMDIButton.CreateButton(AOwner: TRxMDITasks; AForm: TForm);
+begin
+ inherited Create(AOwner);
+ FNavPanel:=AOwner;
+ Align:=alLeft;
+ NavForm:=AForm;
+ AutoSize:=true;
+ Flat:=true;
+ GroupIndex:=1;
+
+ FMenu:=TPopupMenu.Create(Self);
+ FMenu.Parent:=Self;
+ PopupMenu:=FMenu;
+ DoCreateMenuItems;
+
+ AOwner.AddButton(Self);
+end;
+
+procedure TRxMDIButton.Click;
+begin
+ inherited Click;
+ if Assigned(FNavForm) then
+ begin
+ FNavPanel.FMainPanel.HideCurrentWindow;
+ FNavForm.Show;
+ FNavPanel.FMainPanel.CurrentChildWindow:=NavForm;
+ if Assigned(FActiveControl) and FActiveControl.HandleObjectShouldBeVisible then
+ FActiveControl.SetFocus;
+ end;
+ Down:=true;
+end;
+
+procedure TRxMDIButton.UpdateCaption;
+begin
+ if Assigned(FNavForm) then
+ Caption:=' '+FNavForm.Caption+' '
+ else
+ Caption:='---';
+ AdjustSize;
+end;
+
+initialization
+ {$I RxMDICloseIcon.lrs}
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/rxmemds.pas b/components/rx/version/v2.2_laz_1.2/rxmemds.pas
new file mode 100644
index 000000000..394f1e1f0
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxmemds.pas
@@ -0,0 +1,2105 @@
+{ rxmemds unit
+
+ Copyright (C) 2005-2014 Lagunov Aleksey alexs@hotbox.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit rxmemds;
+
+
+{$I rx.inc}
+
+interface
+
+
+uses SysUtils, Classes, DB, ex_rx_datapacket;
+
+{ TRxMemoryData }
+
+type
+ TMemBlobData = string;
+ TMemBlobArray = array[0..256] of TMemBlobData;
+ PMemBlobArray = ^TMemBlobArray;
+ TMemoryRecord = class;
+ TLoadMode = (lmCopy, lmAppend);
+ TCompareRecords = function (Item1, Item2: TMemoryRecord): Integer of object;
+
+ TRxMemoryData = class(TDataSet)
+ private
+ {$IFDEF FIX_TRxMemoryData_Filter}
+ FOnFilterRecordEx: TFilterRecordEvent;
+ {$ENDIF}
+ FRecordPos: Integer;
+ FRecordSize: Integer;
+ FBookmarkOfs: Integer;
+ FBlobOfs: Integer;
+ FRecBufSize: Integer;
+ FOffsets: PWordArray;
+ FLastID: Integer;
+ FAutoInc: Longint;
+ FActive: Boolean;
+ FRecords: TList;
+ FIndexList: TList;
+ FCaseInsensitiveSort: Boolean;
+ FDescendingSort: Boolean;
+
+ FFileName: string;
+ FFileStream : TFileStream;
+ FDatasetReader : TRxDataPacketReader;
+ FPacketRecords: Integer;
+ FFilterBuffer : pchar;
+ FNullmaskSize : byte;
+ FBRecordCount : integer;
+ function IntAllocRecordBuffer: PChar;
+ procedure IntLoadFielddefsFromFile;
+ procedure IntLoadRecordsFromFile;
+ procedure SetPacketRecords(const AValue: Integer);
+
+ function AddRecord: TMemoryRecord;
+ procedure CopyRecord(RecordData, Buffer: PChar);
+ function GetOnFilterRecordEx: TFilterRecordEvent;
+ function InsertRecord(Index: Integer): TMemoryRecord;
+ function FindRecordID(ID: Integer): TMemoryRecord;
+ procedure CreateIndexList(const FieldNames: string);
+ procedure FreeIndexList;
+ procedure QuickSort(L, R: Integer; Compare: TCompareRecords);
+ procedure SetOnFilterRecordEx(const AValue: TFilterRecordEvent);
+ procedure Sort;
+ function CalcRecordSize: Integer;
+ function FindFieldData(Buffer: Pointer; Field: TField): Pointer;overload;
+ function FindFieldData(Buffer: Pointer; FieldNo:Integer): Pointer;overload;
+ function GetMemoryRecord(Index: Integer): TMemoryRecord;
+ function GetCapacity: Integer;
+ function RecordFilter: Boolean;
+ procedure SetCapacity(Value: Integer);
+ procedure ClearRecords;
+ procedure InitBufferPointers(GetProps: Boolean);
+ protected
+ procedure AssignMemoryRecord(Rec: TMemoryRecord; Buffer: PChar);
+ function GetActiveRecBuf(var RecBuf: PChar): Boolean; virtual;
+ procedure InitFieldDefsFromFields;
+ procedure RecordToBuffer(Rec: TMemoryRecord; Buffer: PChar);
+ procedure SetMemoryRecordData(Buffer: PChar; Pos: Integer); virtual;
+ procedure SetAutoIncFields(Buffer: PChar); virtual;
+ function CompareRecords(Item1, Item2: TMemoryRecord): Integer; virtual;
+ function GetBlobData(Field: TField; Buffer: PChar): TMemBlobData;
+ procedure SetBlobData(Field: TField; Buffer: PChar; Value: TMemBlobData);
+ function AllocRecordBuffer: PChar; override;
+ procedure FreeRecordBuffer(var Buffer: PChar); override;
+ function BCDToCurr(BCD: Pointer; var Curr: Currency): Boolean;
+ function CurrToBCD(const Curr: Currency; BCD: Pointer;
+ Precision, Decimals: Integer): Boolean;
+ procedure InternalInitRecord(Buffer: PChar); override;
+ procedure ClearCalcFields(Buffer: PChar); override;
+ function GetRecord(Buffer: PChar; GetMode: TGetMode;
+ DoCheck: Boolean): TGetResult; override;
+ function GetRecordSize: Word; override;
+ procedure SetFiltered(Value: Boolean); override;
+ procedure SetOnFilterRecord(const Value: TFilterRecordEvent); override;
+ procedure SetFieldData(Field: TField; Buffer: Pointer); override;
+ procedure CloseBlob(Field: TField); override;
+ procedure GetBookmarkData(Buffer: PChar; Data: Pointer); override;
+ function GetBookmarkFlag(Buffer: PChar): TBookmarkFlag; override;
+ {$IFDEF NoAutomatedBookmark}
+ procedure InternalGotoBookmark(ABookmark: TBookmark); override;
+ {$ELSE}
+ procedure InternalGotoBookmark(ABookmark: Pointer); override;
+ {$ENDIF}
+ procedure InternalSetToRecord(Buffer: PChar); override;
+ procedure SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag); override;
+ procedure SetBookmarkData(Buffer: PChar; Data: Pointer); override;
+ function GetIsIndexField(Field: TField): Boolean; override;
+ procedure InternalFirst; override;
+ procedure InternalLast; override;
+ procedure InitRecord(Buffer: PChar); override;
+ procedure InternalAddRecord(Buffer: Pointer; DoAppend: Boolean); override;
+ procedure InternalDelete; override;
+ procedure InternalPost; override;
+ procedure InternalClose; override;
+ procedure InternalHandleException; override;
+ procedure InternalInitFieldDefs; override;
+ procedure InternalOpen; override;
+ procedure OpenCursor(InfoQuery: Boolean); override;
+ function IsCursorOpen: Boolean; override;
+ function GetRecordCount: Integer; override;
+ function GetRecNo: Integer; override;
+ procedure SetRecNo(Value: Integer); override;
+ property Records[Index: Integer]: TMemoryRecord read GetMemoryRecord;
+ function GetAnyRecField(SrcRecNo:integer; AField:TField):variant;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ function BookmarkValid(ABookmark: TBookmark): Boolean; override;
+ function CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Integer; override;
+ function CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream; override;
+ function GetFieldData(Field: TField; Buffer: Pointer): Boolean; override;
+ function GetCurrentRecord(Buffer: PChar): Boolean; override;
+ function IsSequenced: Boolean; override;
+ function Locate(const KeyFields: string; const KeyValues: Variant;
+ Options: TLocateOptions): Boolean; override;
+ procedure SortOnFields(const FieldNames: string;
+ CaseInsensitive: Boolean = True; Descending: Boolean = False);
+ procedure SortOnFieldsEx(const FieldNames: string;
+ CaseInsensitive: Boolean = True; Asc: array of boolean);
+ procedure EmptyTable;
+ procedure CloseOpen;
+ procedure CopyStructure(Source: TDataSet);
+ function LoadFromDataSet(Source: TDataSet; ARecordCount: Integer;
+ Mode: TLoadMode): Integer;
+ function SaveToDataSet(Dest: TDataSet; ARecordCount: Integer): Integer;
+ procedure AppendRecord(const Values: array of const);
+
+ procedure SetDatasetPacket(AReader : TRxDataPacketReader);
+ procedure GetDatasetPacket(AWriter : TRxDataPacketReader);
+ procedure LoadFromStream(AStream : TStream; Format: TRxDataPacketFormat = dfBinary);
+ procedure SaveToStream(AStream : TStream; Format: TRxDataPacketFormat = dfBinary);
+ procedure LoadFromFile(AFileName: string = ''; Format: TRxDataPacketFormat = dfAny);
+ procedure SaveToFile(AFileName: string = ''; Format: TRxDataPacketFormat = dfAny);
+ published
+ property Capacity: Integer read GetCapacity write SetCapacity default 0;
+ property Active;
+ property AutoCalcFields;
+ property Filtered;
+ property FieldDefs;
+// property ObjectView default False;
+ property BeforeOpen;
+ property AfterOpen;
+ property BeforeClose;
+ property AfterClose;
+ property BeforeInsert;
+ property AfterInsert;
+ property BeforeEdit;
+ property AfterEdit;
+ property BeforePost;
+ property AfterPost;
+ property BeforeCancel;
+ property AfterCancel;
+ property BeforeDelete;
+ property AfterDelete;
+ property BeforeScroll;
+ property AfterScroll;
+ property OnCalcFields;
+ property OnDeleteError;
+ property OnEditError;
+ property OnFilterRecord;
+ property OnFilterRecordEx: TFilterRecordEvent read GetOnFilterRecordEx write SetOnFilterRecordEx;
+ property OnNewRecord;
+ property OnPostError;
+
+ property FileName : string read FFileName write FFileName;
+ property PacketRecords : Integer read FPacketRecords write SetPacketRecords default 10;
+ end;
+
+{ TMemBlobStream }
+
+ TMemBlobStream = class(TStream)
+ private
+ FField: TBlobField;
+ FDataSet: TRxMemoryData;
+ FBuffer: PChar;
+ FMode: TBlobStreamMode;
+ FOpened: Boolean;
+ FModified: Boolean;
+ FPosition: Longint;
+ FCached: Boolean;
+ function GetBlobSize: Longint;
+ function GetBlobFromRecord(Field: TField): TMemBlobData;
+ public
+ constructor Create(Field: TBlobField; Mode: TBlobStreamMode);
+ destructor Destroy; override;
+ function Read(var Buffer; Count: Longint): Longint; override;
+ function Write(const Buffer; Count: Longint): Longint; override;
+ function Seek(Offset: Longint; Origin: Word): Longint; override;
+ procedure Truncate;
+ end;
+
+{ TMemoryRecord }
+
+ TMemoryRecord = class(TPersistent)
+ private
+ FMemoryData: TRxMemoryData;
+ FID: Integer;
+ FData: Pointer;
+ FBlobs: PMemBlobArray;
+ function GetIndex: Integer;
+ procedure SetMemoryData(Value: TRxMemoryData; UpdateParent: Boolean);
+ protected
+ procedure SetIndex(Value: Integer); virtual;
+ public
+ constructor Create(MemoryData: TRxMemoryData); virtual;
+ constructor CreateEx(MemoryData: TRxMemoryData; UpdateParent: Boolean); virtual;
+ destructor Destroy; override;
+ property MemoryData: TRxMemoryData read FMemoryData;
+ property ID: Integer read FID write FID;
+ property Index: Integer read GetIndex write SetIndex;
+ property Data: Pointer read FData;
+ end;
+
+
+implementation
+
+
+uses CustApp, rxdconst, LazUTF8, dbutils, dbconst, Variants, math;
+
+const
+ ftBlobTypes = [ftBlob, ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle,
+ ftDBaseOle, ftTypedBinary, ftOraBlob, ftOraClob];
+
+ ftSupported = [ftString, ftSmallint, ftInteger, ftWord, ftBoolean, ftFloat,
+ ftCurrency, ftDate, ftTime, ftDateTime, ftAutoInc, ftBCD, ftBytes,
+ ftVarBytes, ftADT, ftFixedChar, ftWideString, ftLargeint, ftVariant, ftGuid] +
+ ftBlobTypes;
+
+ fkStoredFields = [fkData];
+
+ GuidSize = 38;
+
+{ Utility routines }
+
+procedure FinalizeBlobFields(BlobArray:PMemBlobArray; BlobFieldCount:integer);
+var
+ i:integer;
+begin
+ for i:=0 to BlobFieldCount-1 do
+ BlobArray^[i]:='';
+end;
+
+function CompareFields(Data1, Data2: Pointer; FieldType: TFieldType;
+ CaseInsensitive: Boolean): Integer;
+begin
+ Result := 0;
+ case FieldType of
+ ftString:
+ if CaseInsensitive then
+ Result := UTF8CompareText(PChar(Data1), PChar(Data2))
+ else
+ Result := UTF8CompareStr(PChar(Data1), PChar(Data2));
+ ftSmallint:
+ if SmallInt(Data1^) > SmallInt(Data2^) then Result := 1
+ else if SmallInt(Data1^) < SmallInt(Data2^) then Result := -1;
+ ftInteger, ftDate, ftTime, ftAutoInc:
+ if Longint(Data1^) > Longint(Data2^) then Result := 1
+ else if Longint(Data1^) < Longint(Data2^) then Result := -1;
+ ftWord:
+ if Word(Data1^) > Word(Data2^) then Result := 1
+ else if Word(Data1^) < Word(Data2^) then Result := -1;
+ ftBoolean:
+ if WordBool(Data1^) and not WordBool(Data2^) then Result := 1
+ else if not WordBool(Data1^) and WordBool(Data2^) then Result := -1;
+ ftFloat, ftCurrency:
+ if Double(Data1^) > Double(Data2^) then Result := 1
+ else if Double(Data1^) < Double(Data2^) then Result := -1;
+ ftDateTime:
+ if TDateTime(Data1^) > TDateTime(Data2^) then Result := 1
+ else if TDateTime(Data1^) < TDateTime(Data2^) then Result := -1;
+ ftFixedChar:
+ if CaseInsensitive then
+ Result := UTF8CompareText(PChar(Data1), PChar(Data2))
+ else
+ Result := UTF8CompareStr(PChar(Data1), PChar(Data2));
+ ftWideString:
+ if CaseInsensitive then
+ Result := UTF8CompareText(WideCharToString(PWideChar(Data1)),
+ WideCharToString(PWideChar(Data2)))
+ else
+ Result := UTF8CompareStr(WideCharToString(PWideChar(Data1)),
+ WideCharToString(PWideChar(Data2)));
+ ftLargeint:
+ if Int64(Data1^) > Int64(Data2^) then Result := 1
+ else if Int64(Data1^) < Int64(Data2^) then Result := -1;
+ ftVariant:
+ Result := 0;
+ ftGuid:
+ Result := UTF8CompareText(PChar(Data1), PChar(Data2));
+ end;
+end;
+
+function CalcFieldLen(FieldType: TFieldType; Size: Word): Word;
+begin
+ if not (FieldType in ftSupported) then
+ Result := 0
+ else
+ if (FieldType in ftBlobTypes) then
+ Result := SizeOf(Longint)
+ else
+ begin
+ Result := Size;
+ case FieldType of
+ ftString: Inc(Result);
+ ftSmallint: Result := SizeOf(SmallInt);
+ ftInteger: Result := SizeOf(Longint);
+ ftWord: Result := SizeOf(Word);
+ ftBoolean: Result := SizeOf(WordBool);
+ ftFloat: Result := SizeOf(Double);
+ ftCurrency: Result := SizeOf(Double);
+ ftBCD: Result := 34;
+ ftDate, ftTime: Result := SizeOf(Longint);
+ ftDateTime: Result := SizeOf(TDateTime);
+ ftBytes: Result := Size;
+ ftVarBytes: Result := Size + 2;
+ ftAutoInc: Result := SizeOf(Longint);
+ ftADT: Result := 0;
+ ftFixedChar: Inc(Result);
+ ftWideString: Result := (Result + 1) * 2;
+ ftLargeint: Result := SizeOf(Int64);
+ ftVariant: Result := SizeOf(Variant);
+ ftGuid: Result := GuidSize + 1;
+ end;
+ end;
+end;
+
+procedure CalcDataSize(FieldDef: TFieldDef; var DataSize: Integer);
+var
+ I: Integer;
+begin
+ with FieldDef do begin
+ if (DataType in ftSupported - ftBlobTypes) then
+ Inc(DataSize, CalcFieldLen(DataType, Size) + 1);
+{$IFDEF ENABLE_Child_Defs}
+ for I := 0 to ChildDefs.Count - 1 do
+ CalcDataSize(ChildDefs[I], DataSize);
+{$ENDIF}
+ end;
+end;
+
+procedure Error(const Msg: string);
+begin
+ DatabaseError(Msg);
+end;
+
+procedure ErrorFmt(const Msg: string; const Args: array of const);
+begin
+ DatabaseErrorFmt(Msg, Args);
+end;
+
+type
+ TBookmarkData = Integer;
+ PMemBookmarkInfo = ^TMemBookmarkInfo;
+ TMemBookmarkInfo = packed record
+ BookmarkData: TBookmarkData;
+ BookmarkFlag: TBookmarkFlag;
+ end;
+
+{ TMemoryRecord }
+
+constructor TMemoryRecord.Create(MemoryData: TRxMemoryData);
+begin
+ CreateEx(MemoryData, True);
+end;
+
+constructor TMemoryRecord.CreateEx(MemoryData: TRxMemoryData;
+ UpdateParent: Boolean);
+begin
+ inherited Create;
+ SetMemoryData(MemoryData, UpdateParent);
+end;
+
+destructor TMemoryRecord.Destroy;
+begin
+ SetMemoryData(nil, True);
+ inherited Destroy;
+end;
+
+function TMemoryRecord.GetIndex: Integer;
+begin
+ if FMemoryData <> nil then Result := FMemoryData.FRecords.IndexOf(Self)
+ else Result := -1;
+end;
+
+procedure TMemoryRecord.SetMemoryData(Value: TRxMemoryData; UpdateParent: Boolean);
+var
+ I: Integer;
+ DataSize: Integer;
+begin
+ if FMemoryData <> Value then
+ begin
+ if FMemoryData <> nil then
+ begin
+ FMemoryData.FRecords.Remove(Self);
+ if FMemoryData.BlobFieldCount > 0 then
+ begin
+ FinalizeBlobFields(FBlobs, FMemoryData.BlobFieldCount);
+ Freemem(FBlobs, FMemoryData.BlobFieldCount * SizeOf(TMemBlobData));
+ end;
+ FBlobs:=nil;
+ ReallocMem(FData, 0);
+ FMemoryData := nil;
+ end;
+ if Value <> nil then
+ begin
+ if UpdateParent then
+ begin
+ Value.FRecords.Add(Self);
+ Inc(Value.FLastID);
+ FID := Value.FLastID;
+ end;
+ FMemoryData := Value;
+ if Value.BlobFieldCount > 0 then
+ begin
+ GetMem(FBlobs, Value.BlobFieldCount * SizeOf(TMemBlobData));
+ FillChar(FBlobs^, Value.BlobFieldCount * SizeOf(Pointer), 0);
+ FinalizeBlobFields(FBlobs, Value.BlobFieldCount);
+// Initialize(PMemBlobArray(FBlobs)^[0]);//, Value.BlobFieldCount);
+ end;
+ DataSize := 0;
+ for I := 0 to Value.FieldDefs.Count - 1 do
+ CalcDataSize(Value.FieldDefs[I], DataSize);
+ ReallocMem(FData, DataSize);
+ FillChar(FData^, DataSize, 0);
+ end;
+ end;
+end;
+
+procedure TMemoryRecord.SetIndex(Value: Integer);
+var
+ CurIndex: Integer;
+begin
+ CurIndex := GetIndex;
+ if (CurIndex >= 0) and (CurIndex <> Value) then
+ FMemoryData.FRecords.Move(CurIndex, Value);
+end;
+
+{ TRxMemoryData }
+
+constructor TRxMemoryData.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FRecordPos := -1;
+ FLastID := Low(Integer);
+ FAutoInc := 1;
+ FRecords := TList.Create;
+end;
+
+destructor TRxMemoryData.Destroy;
+begin
+ inherited Destroy;
+ FreeIndexList;
+ ClearRecords;
+ FRecords.Free;
+ ReallocMem(FOffsets, 0);
+end;
+
+{ Records Management }
+
+function TRxMemoryData.GetCapacity: Integer;
+begin
+ if FRecords <> nil then Result := FRecords.Capacity
+ else Result := 0;
+end;
+
+procedure TRxMemoryData.SetCapacity(Value: Integer);
+begin
+ if FRecords <> nil then FRecords.Capacity := Value;
+end;
+
+function TRxMemoryData.AddRecord: TMemoryRecord;
+begin
+ Result := TMemoryRecord.Create(Self);
+end;
+
+function TRxMemoryData.GetOnFilterRecordEx: TFilterRecordEvent;
+begin
+ {$IFDEF FIX_TRxMemoryData_Filter}
+ Result:=FOnFilterRecordEx;
+ {$ELSE}
+ Result:=OnFilterRecord;
+ {$ENDIF}
+end;
+
+function TRxMemoryData.FindRecordID(ID: Integer): TMemoryRecord;
+var
+ I: Integer;
+begin
+ for I := 0 to FRecords.Count - 1 do begin
+ Result := TMemoryRecord(FRecords[I]);
+ if Result.ID = ID then Exit;
+ end;
+ Result := nil;
+end;
+
+function TRxMemoryData.InsertRecord(Index: Integer): TMemoryRecord;
+begin
+ Result := AddRecord;
+ Result.Index := Index;
+end;
+
+function TRxMemoryData.GetMemoryRecord(Index: Integer): TMemoryRecord;
+begin
+ Result := TMemoryRecord(FRecords[Index]);
+end;
+
+{ Field Management }
+
+function TRxMemoryData.BCDToCurr(BCD: Pointer; var Curr: Currency): Boolean;
+begin
+ Move(BCD^, Curr, SizeOf(Currency));
+ Result := True;
+end;
+
+function TRxMemoryData.CurrToBCD(const Curr: Currency; BCD: Pointer; Precision,
+ Decimals: Integer): Boolean;
+begin
+ Move(Curr, BCD^, SizeOf(Currency));
+ Result := True;
+end;
+
+procedure TRxMemoryData.InitFieldDefsFromFields;
+var
+ I: Integer;
+ Offset: Word;
+ FD:TFieldDef;
+begin
+ if FieldDefs.Count = 0 then
+ begin
+ for I := 0 to FieldCount - 1 do
+ begin
+ with Fields[I] do
+ if (FieldKind in fkStoredFields) and not (DataType in ftSupported) then
+ ErrorFmt(SUnknownFieldType, [DisplayName]);
+ end;
+ FreeIndexList;
+ end;
+ Offset := 0;
+ { Create FieldDefs from persistent fields if needed }
+ if FieldDefs.Count = 0 then
+ for I := 0 to FieldCount - 1 do
+ begin
+ FD:=FieldDefs.AddFieldDef;
+// FD.DisplayName:=Fields[I].DisplayName;
+ FD.Name:=Fields[I].FieldName;
+ FD.Size:=Fields[I].Size;
+ FD.DataType:=Fields[I].DataType;
+ if Fields[I].Required then
+ FD.Attributes:= FD.Attributes + [faRequired];
+ if Fields[I] is TFloatField then
+ FD.Precision:=TFloatField(Fields[I]).Precision;
+ end;
+ { Calculate fields offsets }
+ ReallocMem(FOffsets, FieldDefs.Count * SizeOf(Word));
+ for I := 0 to FieldDefs.Count - 1 do
+ begin
+ FOffsets^[I] := Offset;
+ with FieldDefs[I] do
+ begin
+ if (DataType in ftSupported - ftBlobTypes) then
+ Inc(Offset, CalcFieldLen(DataType, Size) + 1);
+ end;
+ end;
+end;
+
+function TRxMemoryData.FindFieldData(Buffer: Pointer; Field: TField): Pointer;
+var
+ Index: Integer;
+begin
+{.$IFDEF TEST_RXMDS}
+ Index := FieldDefs.IndexOf(Field.FieldName);
+//
+ if Index <> Field.FieldNo - 1 then
+ raise exception.Create('Index <> Field.FieldNo - 1');
+{.$ENDIF}
+// Index := Field.FieldNo - 1;
+//
+ Result:=FindFieldData(Buffer, Index);
+end;
+
+function TRxMemoryData.FindFieldData(Buffer: Pointer; FieldNo: Integer): Pointer;
+begin
+ Result := nil;
+ if (FieldNo >= 0) and (Buffer <> nil) and (FieldDefs[FieldNo].DataType in ftSupported - ftBlobTypes) then
+ Result := Pointer(PtrInt(PChar(Buffer)) + FOffsets^[FieldNo]);
+end;
+
+{ Buffer Manipulation }
+
+function TRxMemoryData.CalcRecordSize: Integer;
+var
+ I: Integer;
+begin
+ Result := 0;
+ for I := 0 to FieldDefs.Count - 1 do
+ CalcDataSize(FieldDefs[I], Result);
+end;
+
+procedure TRxMemoryData.InitBufferPointers(GetProps: Boolean);
+begin
+ if GetProps then FRecordSize := CalcRecordSize;
+ FBookmarkOfs := FRecordSize + CalcFieldsSize;
+ FBlobOfs := FBookmarkOfs + SizeOf(TMemBookmarkInfo);
+ FRecBufSize := FBlobOfs + BlobFieldCount * SizeOf(TMemBlobData);//Pointer);
+end;
+
+procedure TRxMemoryData.ClearRecords;
+begin
+ while FRecords.Count > 0 do TObject(FRecords.Last).Free;
+ FLastID := Low(Integer);
+ FRecordPos := -1;
+end;
+
+function TRxMemoryData.AllocRecordBuffer: PChar;
+begin
+ Result := StrAlloc(FRecBufSize);
+ InternalInitRecord(Result);
+{ FillChar(Result^, FRecBufSize, 0);
+ if BlobFieldCount > 0 then
+ begin
+// Initialize(PMemBlobArray(Result + FBlobOfs)^[0]);//, BlobFieldCount);
+// FillChar(PMemBlobArray(Result + FBlobOfs)^, BlobFieldCount * SizeOf(Pointer),0);//, BlobFieldCount);
+ FinalizeBlobFields(PMemBlobArray(Result + FBlobOfs), BlobFieldCount);
+
+ end;}
+end;
+
+procedure TRxMemoryData.FreeRecordBuffer(var Buffer: PChar);
+var
+ n:integer;
+ FieldPtr:PChar;
+begin
+ //correctly release field memory for complex types
+ for n:=0 to FieldDefs.Count-1 do
+ if FieldDefs.Items[n].DataType = ftVariant then
+ begin
+ FieldPtr:=FindFieldData(Buffer, n);
+ if FieldPtr <> nil then
+ begin
+ PBoolean(FieldPtr)^:=False;
+ Inc(FieldPtr);
+ Finalize( PVariant(FieldPtr)^ );
+ end;
+ end;
+
+ if BlobFieldCount > 0 then
+ FinalizeBlobFields(PMemBlobArray(Buffer + FBlobOfs), BlobFieldCount);
+
+ StrDispose(Buffer);
+ Buffer := nil;
+end;
+
+procedure TRxMemoryData.ClearCalcFields(Buffer: PChar);
+begin
+ FillChar(Buffer[FRecordSize], CalcFieldsSize, 0);
+end;
+
+procedure TRxMemoryData.InternalInitRecord(Buffer: PChar);
+var
+ I: Integer;
+begin
+ FillChar(Buffer^, FBlobOfs, 0);
+ FillChar(PByteArray(Buffer + FBlobOfs)^, BlobFieldCount * SizeOf(Pointer), 0);
+ for I := 0 to BlobFieldCount - 1 do
+ begin
+ PMemBlobArray(Buffer + FBlobOfs)^[I] := '';
+ end;
+end;
+
+procedure TRxMemoryData.InitRecord(Buffer: PChar);
+begin
+ inherited InitRecord(Buffer);
+ with PMemBookmarkInfo(Buffer + FBookmarkOfs)^ do
+ begin
+ BookmarkData := Low(Integer);
+ BookmarkFlag := bfInserted;
+ end;
+end;
+
+procedure TRxMemoryData.CopyRecord(RecordData, Buffer:PChar);
+var
+ n, FieldSize:Integer;
+ FieldPtr, BufPtr:PChar;
+ DataType:TFieldType;
+begin
+ for n:=0 to FieldDefs.Count-1 do
+ begin
+ FieldPtr:=FindFieldData(RecordData, n);
+ BufPtr:=FindFieldData(Buffer, n);
+ if FieldPtr = nil then Continue;
+
+ PBoolean(BufPtr)^:=PBoolean(FieldPtr)^;
+ Inc(FieldPtr);
+ Inc(BufPtr);
+
+ DataType:=FieldDefs.Items[n].DataType;
+ if DataType = ftVariant then
+ begin
+ PVariant(BufPtr)^:=PVariant(FieldPtr)^;
+ end
+ else
+ begin
+ FieldSize:=FieldDefs.Items[n].Size;
+ Move( FieldPtr^, BufPtr^, CalcFieldLen(DataType, FieldSize) );
+ end;
+ end;
+end;
+
+function TRxMemoryData.GetCurrentRecord(Buffer: PChar): Boolean;
+begin
+ Result := False;
+ if not IsEmpty and (GetBookmarkFlag(ActiveBuffer) = bfCurrent) then
+ begin
+ UpdateCursorPos;
+ if (FRecordPos >= 0) and (FRecordPos < RecordCount) then
+ begin
+ //Move(Records[FRecordPos].Data^, Buffer^, FRecordSize);
+ CopyRecord(Records[FRecordPos].Data, Buffer);
+
+ Result := True;
+ end;
+ end;
+end;
+
+procedure TRxMemoryData.RecordToBuffer(Rec: TMemoryRecord; Buffer: PChar);
+var
+ I: Integer;
+begin
+ //Move(Rec.Data^, Buffer^, FRecordSize);
+ CopyRecord(Rec.Data, Buffer);
+ with PMemBookmarkInfo(Buffer + FBookmarkOfs)^ do
+ begin
+ BookmarkData := Rec.ID;
+ BookmarkFlag := bfCurrent;
+ end;
+ for I := 0 to BlobFieldCount - 1 do
+ PMemBlobArray(Buffer + FBlobOfs)^[I] := PMemBlobArray(Rec.FBlobs)^[I];
+ GetCalcFields(Buffer);
+end;
+
+function TRxMemoryData.GetRecord(Buffer: PChar; GetMode: TGetMode;
+ DoCheck: Boolean): TGetResult;
+var
+ Accept: Boolean;
+begin
+ Result := grOk;
+ Accept := True;
+ case GetMode of
+ gmPrior:
+ if FRecordPos <= 0 then begin
+ Result := grBOF;
+ FRecordPos := -1;
+ end
+ else begin
+ repeat
+ Dec(FRecordPos);
+ if Filtered then Accept := RecordFilter;
+ until Accept or (FRecordPos < 0);
+ if not Accept then begin
+ Result := grBOF;
+ FRecordPos := -1;
+ end;
+ end;
+ gmCurrent:
+ if (FRecordPos < 0) or (FRecordPos >= RecordCount) then
+ Result := grError
+ else if Filtered then begin
+ if not RecordFilter then Result := grError;
+ end;
+ gmNext:
+ if FRecordPos >= RecordCount - 1 then Result := grEOF
+ else begin
+ repeat
+ Inc(FRecordPos);
+ if Filtered then Accept := RecordFilter;
+ until Accept or (FRecordPos > RecordCount - 1);
+ if not Accept then begin
+ Result := grEOF;
+ FRecordPos := RecordCount - 1;
+ end;
+ end;
+ end;
+ if Result = grOk then RecordToBuffer(Records[FRecordPos], Buffer)
+ else if (Result = grError) and DoCheck then Error(SMemNoRecords);
+end;
+
+function TRxMemoryData.GetRecordSize: Word;
+begin
+ Result := FRecordSize;
+end;
+
+function TRxMemoryData.GetActiveRecBuf(var RecBuf: PChar): Boolean;
+begin
+ case State of
+ dsBrowse:
+ if IsEmpty then RecBuf := nil
+ else RecBuf := ActiveBuffer;
+ dsEdit, dsInsert: RecBuf := ActiveBuffer;
+ dsCalcFields: RecBuf := CalcBuffer;
+ dsFilter: RecBuf := TempBuffer;
+ else RecBuf := nil;
+ end;
+ Result := RecBuf <> nil;
+end;
+
+{$IFDEF FIX_BUG_FieldNo}
+function GetFieldNo(DS:TDataSet; Field:TField):integer;
+var
+ i:integer;
+begin
+ for i:=0 to DS.FieldDefs.Count-1 do
+ if DS.FieldDefs[i].Name = Field.FieldName then
+ begin
+ Result:=i+1;
+ exit;
+ end;
+ Result:=0;
+end;
+{$ENDIF}
+
+function TRxMemoryData.GetFieldData(Field: TField; Buffer: Pointer): Boolean;
+var
+ RecBuf, Data: PChar;
+ VarData: Variant;
+begin
+ Result := False;
+ if not GetActiveRecBuf(RecBuf) then Exit;
+{$IFDEF FIX_BUG_FieldNo}
+ if GetFieldNo(Self, Field) > 0 then
+{$ELSE}
+ if Field.FieldNo > 0 then
+{$ENDIF}
+ begin
+ Data := FindFieldData(RecBuf, Field);
+ if Data <> nil then begin
+ Result := Boolean(Data[0]);
+ Inc(Data);
+ if Field.DataType in [ftString, ftFixedChar, ftWideString, ftGuid] then
+ Result := Result and (StrLen(Data) > 0);
+ if Result and (Buffer <> nil) then
+ if Field.DataType = ftVariant then
+ begin
+ VarData := PVariant(Data)^;
+ PVariant(Buffer)^ := VarData;
+ end
+ else
+ Move(Data^, Buffer^, CalcFieldLen(Field.DataType, Field.Size));
+ end;
+ end
+ else
+ begin
+ if State in [dsBrowse, dsEdit, dsInsert, dsCalcFields] then
+ begin
+ Inc(RecBuf, FRecordSize + Field.Offset);
+ Result := Boolean(RecBuf[0]);
+ if Result and (Buffer <> nil) then
+ Move(RecBuf[1], Buffer^, Field.DataSize);
+ end;
+ end;
+end;
+
+procedure TRxMemoryData.SetFieldData(Field: TField; Buffer: Pointer);
+var
+ RecBuf, Data: PChar;
+ VarData: Variant;
+ PBl:PBoolean;
+begin
+ if not (State in dsWriteModes) then ErrorFmt(SNotEditing, [Name]);
+ GetActiveRecBuf(RecBuf);
+ with Field do
+ begin
+{$IFDEF FIX_BUG_FieldNo}
+ if GetFieldNo(Self, Field) > 0 then
+{$ELSE}
+ if Field.FieldNo > 0 then
+{$ENDIF}
+ begin
+ if State in [dsCalcFields, dsFilter] then ErrorFmt(SNotEditing, [Name]);
+ if ReadOnly and not (State in [dsSetKey, dsFilter]) then
+ ErrorFmt(SFieldReadOnly, [DisplayName]);
+ Validate(Buffer);
+ if FieldKind <> fkInternalCalc then
+ begin
+ Data := FindFieldData(RecBuf, Field);
+ if Data <> nil then
+ begin
+ if DataType = ftVariant then
+ begin
+ if (Buffer = nil) or VarIsNull(PVariant(Buffer)^) or VarIsEmpty(PVariant(Buffer)^) or
+ VarIsEmptyParam(PVariant(Buffer)^) then
+ FillChar(Data^, CalcFieldLen(DataType, Size), 0)
+ else
+ begin
+ Boolean(Data[0]):=True;
+ Inc(Data);
+ PVariant(Data)^ := PVariant(Buffer)^;
+ end;
+ end
+ else
+ begin
+ PBl:=Pointer(Data);
+// Boolean(Data^{[0]}) := Assigned(Buffer);//LongBool(Buffer);
+// Pbl^:=Assigned(Buffer);
+ PBoolean(Pointer(Data))^:= Assigned(Buffer);
+ Inc(Data);
+ if Assigned(Buffer) then
+ Move(Buffer^, Data^, CalcFieldLen(DataType, Size))
+ else
+ FillChar(Data^, CalcFieldLen(DataType, Size), 0);
+ end;
+ end;
+ end;
+ end else {fkCalculated, fkLookup}
+ begin
+ Inc(RecBuf, FRecordSize + Offset);
+ Boolean(RecBuf[0]) := LongBool(Buffer);
+ if Boolean(RecBuf[0]) then Move(Buffer^, RecBuf[1], DataSize);
+ end;
+ if not (State in [dsCalcFields, dsFilter, dsNewValue]) then
+ DataEvent(deFieldChange, ptrint(Field));
+ end;
+end;
+
+{ Filter }
+
+procedure TRxMemoryData.SetFiltered(Value: Boolean);
+begin
+ if Active then
+ begin
+ CheckBrowseMode;
+ if Filtered <> Value then
+ begin
+ inherited SetFiltered(Value);
+ First;
+ end;
+ end
+ else
+ inherited SetFiltered(Value);
+end;
+
+procedure TRxMemoryData.SetOnFilterRecord(const Value: TFilterRecordEvent);
+begin
+ if Active then
+ begin
+ CheckBrowseMode;
+ inherited SetOnFilterRecord(Value);
+ if Filtered then First;
+ end
+ else
+ inherited SetOnFilterRecord(Value);
+end;
+
+function TRxMemoryData.RecordFilter: Boolean;
+var
+ SaveState: TDataSetState;
+begin
+ Result := True;
+ {$IFDEF FIX_TRxMemoryData_Filter}
+ if Assigned(OnFilterRecordEx) then
+ {$ELSE}
+ if Assigned(OnFilterRecord) then
+ {$ENDIF}
+ begin
+ if (FRecordPos >= 0) and (FRecordPos < RecordCount) then
+ begin
+ SaveState := SetTempState(dsFilter);
+ try
+ RecordToBuffer(Records[FRecordPos], TempBuffer);
+ {$IFDEF FIX_TRxMemoryData_Filter}
+ OnFilterRecordEx(Self, Result);
+ {$ELSE}
+ OnFilterRecord(Self, Result);
+ {$ENDIF}
+ except
+// Application.HandleException(Self);
+ CustomApplication.HandleException(Self);
+ end;
+ RestoreState(SaveState);
+ end
+ else
+ Result := False;
+ end;
+end;
+
+{ Blobs }
+
+function TRxMemoryData.GetBlobData(Field: TField; Buffer: PChar): TMemBlobData;
+begin
+ Result := PMemBlobArray(Buffer + FBlobOfs)^[Field.Offset];
+end;
+
+procedure TRxMemoryData.SetBlobData(Field: TField; Buffer: PChar;
+ Value: TMemBlobData);
+begin
+ if (Buffer = ActiveBuffer) then begin
+ if State = dsFilter then Error(SNotEditing);
+ PMemBlobArray(Buffer + FBlobOfs)^[Field.Offset] := Value;
+ end;
+end;
+
+procedure TRxMemoryData.CloseBlob(Field: TField);
+begin
+ if (FRecordPos >= 0) and (FRecordPos < FRecords.Count) and
+ (State = dsEdit) then
+ PMemBlobArray(ActiveBuffer + FBlobOfs)^[Field.Offset] :=
+ PMemBlobArray(Records[FRecordPos].FBlobs)^[Field.Offset]
+ else PMemBlobArray(ActiveBuffer + FBlobOfs)^[Field.Offset] := '';
+end;
+
+function TRxMemoryData.CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream;
+begin
+ Result := TMemBlobStream.Create(Field as TBlobField, Mode);
+end;
+
+{ Bookmarks }
+
+function TRxMemoryData.BookmarkValid(ABookmark: TBookmark): Boolean;
+begin
+ {$IFDEF NoAutomatedBookmark}
+ Result := FActive and (TBookmarkData(ABookmark^) > Low(Integer)) and
+ (TBookmarkData(ABookmark^) <= FLastID);
+ {$ELSE}
+ Result := FActive and (TBookmarkData(pointer(ABookmark)^) > Low(Integer)) and
+ (TBookmarkData(pointer(ABookmark)^) <= FLastID);
+ {$ENDIF}
+end;
+
+function TRxMemoryData.CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Integer;
+begin
+ if (Bookmark1 = nil) and (Bookmark2 = nil) then Result := 0
+ else
+ if (Bookmark1 <> nil) and (Bookmark2 = nil) then Result := 1
+ else
+ if (Bookmark1 = nil) and (Bookmark2 <> nil) then Result := -1
+ {$IFDEF NoAutomatedBookmark}
+ else
+ if TBookmarkData(Bookmark1^) > TBookmarkData(Bookmark2^) then
+ {$ELSE}
+ else
+ if TBookmarkData(pointer(Bookmark1)^) > TBookmarkData(pointer(Bookmark2)^) then
+ {$ENDIF}
+ Result := 1
+ {$IFDEF NoAutomatedBookmark}
+ else
+ if TBookmarkData(Bookmark1^) < TBookmarkData(Bookmark2^) then
+ {$ELSE}
+ else
+ if TBookmarkData(pointer(Bookmark1)^) < TBookmarkData(pointer(Bookmark2)^) then
+ {$ENDIF}
+ Result := -1
+ else Result := 0;
+end;
+
+procedure TRxMemoryData.GetBookmarkData(Buffer: PChar; Data: Pointer);
+begin
+ Move(PMemBookmarkInfo(Buffer + FBookmarkOfs)^.BookmarkData, Data^,
+ SizeOf(TBookmarkData));
+end;
+
+procedure TRxMemoryData.SetBookmarkData(Buffer: PChar; Data: Pointer);
+begin
+ Move(Data^, PMemBookmarkInfo(Buffer + FBookmarkOfs)^.BookmarkData,
+ SizeOf(TBookmarkData));
+end;
+
+function TRxMemoryData.GetBookmarkFlag(Buffer: PChar): TBookmarkFlag;
+begin
+ Result := PMemBookmarkInfo(Buffer + FBookmarkOfs)^.BookmarkFlag;
+end;
+
+procedure TRxMemoryData.SetBookmarkFlag(Buffer: PChar; Value: TBookmarkFlag);
+begin
+ PMemBookmarkInfo(Buffer + FBookmarkOfs)^.BookmarkFlag := Value;
+end;
+
+{$IFDEF NoAutomatedBookmark}
+procedure TRxMemoryData.InternalGotoBookmark(ABookmark: TBookmark);
+{$ELSE}
+procedure TRxMemoryData.InternalGotoBookmark(ABookmark: Pointer);
+{$ENDIF}
+var
+ Rec: TMemoryRecord;
+ SavePos: Integer;
+ Accept: Boolean;
+begin
+ Rec := FindRecordID(TBookmarkData(ABookmark^));
+ if Rec <> nil then
+ begin
+ Accept := True;
+ SavePos := FRecordPos;
+ try
+ FRecordPos := Rec.Index;
+ if Filtered then Accept := RecordFilter;
+ finally
+ if not Accept then FRecordPos := SavePos;
+ end;
+ end;
+end;
+
+{ Navigation }
+
+procedure TRxMemoryData.InternalSetToRecord(Buffer: PChar);
+begin
+ InternalGotoBookmark(@PMemBookmarkInfo(Buffer + FBookmarkOfs)^.BookmarkData);
+end;
+
+procedure TRxMemoryData.InternalFirst;
+begin
+ FRecordPos := -1;
+end;
+
+procedure TRxMemoryData.InternalLast;
+begin
+ FRecordPos := FRecords.Count;
+end;
+
+{ Data Manipulation }
+
+procedure TRxMemoryData.AssignMemoryRecord(Rec: TMemoryRecord; Buffer: PChar);
+var
+ I: Integer;
+begin
+ //Move(Buffer^, Rec.Data^, FRecordSize);
+ CopyRecord(Buffer, PChar(Rec.Data));
+
+ for I := 0 to BlobFieldCount - 1 do
+ PMemBlobArray(Rec.FBlobs)^[I] := PMemBlobArray(Buffer + FBlobOfs)^[I];
+end;
+
+procedure TRxMemoryData.SetMemoryRecordData(Buffer: PChar; Pos: Integer);
+var
+ Rec: TMemoryRecord;
+begin
+ if State = dsFilter then Error(SNotEditing);
+ Rec := Records[Pos];
+ AssignMemoryRecord(Rec, Buffer);
+end;
+
+procedure TRxMemoryData.SetAutoIncFields(Buffer: PChar);
+var
+ I, Count: Integer;
+ Data: PChar;
+begin
+ Count := 0;
+ for I := 0 to FieldCount - 1 do
+ if (Fields[I].FieldKind in fkStoredFields) and
+ (Fields[I].DataType = ftAutoInc) then
+ begin
+ Data := FindFieldData(Buffer, Fields[I]);
+ if Data <> nil then begin
+ Boolean(Data[0]) := True;
+ Inc(Data);
+ Move(FAutoInc, Data^, SizeOf(Longint));
+ Inc(Count);
+ end;
+ end;
+ if Count > 0 then Inc(FAutoInc);
+end;
+
+procedure TRxMemoryData.InternalAddRecord(Buffer: Pointer; DoAppend: Boolean);
+var
+ RecPos: Integer;
+ Rec: TMemoryRecord;
+begin
+ if DoAppend then
+ begin
+ Rec := AddRecord;
+ FRecordPos := FRecords.Count - 1;
+ end
+ else
+ begin
+ if FRecordPos = -1 then
+ RecPos := 0
+ else
+ RecPos := FRecordPos;
+ Rec := InsertRecord(RecPos);
+ FRecordPos := RecPos;
+ end;
+ SetAutoIncFields(Buffer);
+ SetMemoryRecordData(Buffer, Rec.Index);
+end;
+
+procedure TRxMemoryData.InternalDelete;
+var
+ Accept: Boolean;
+begin
+ Records[FRecordPos].Free;
+ if FRecordPos >= FRecords.Count then Dec(FRecordPos);
+ Accept := True;
+ repeat
+ if Filtered then Accept := RecordFilter;
+ if not Accept then Dec(FRecordPos);
+ until Accept or (FRecordPos < 0);
+ if FRecords.Count = 0 then FLastID := Low(Integer);
+end;
+
+procedure TRxMemoryData.InternalPost;
+var
+ RecPos: Integer;
+begin
+ if State = dsEdit then
+ SetMemoryRecordData(ActiveBuffer, FRecordPos)
+ else begin
+ if State in [dsInsert] then SetAutoIncFields(ActiveBuffer);
+ if FRecordPos >= FRecords.Count then begin
+ SetMemoryRecordData(ActiveBuffer, AddRecord.Index);
+ FRecordPos := FRecords.Count - 1;
+ end
+ else begin
+ if FRecordPos = -1 then RecPos := 0
+ else RecPos := FRecordPos;
+ SetMemoryRecordData(ActiveBuffer, InsertRecord(RecPos).Index);
+ FRecordPos := RecPos;
+ end;
+ end;
+end;
+
+procedure TRxMemoryData.OpenCursor(InfoQuery: Boolean);
+begin
+ if not InfoQuery then begin
+ if FieldCount > 0 then FieldDefs.Clear;
+ InitFieldDefsFromFields;
+ end;
+ FActive := True;
+ inherited OpenCursor(InfoQuery);
+end;
+
+procedure TRxMemoryData.InternalOpen;
+begin
+ BookmarkSize := SizeOf(TBookmarkData);
+ if DefaultFields then CreateFields;
+ BindFields(True);
+ InitBufferPointers(True);
+ InternalFirst;
+end;
+
+procedure TRxMemoryData.InternalClose;
+begin
+ ClearRecords;
+ FAutoInc := 1;
+ BindFields(False);
+ if DefaultFields then DestroyFields;
+ FreeIndexList;
+ FActive := False;
+end;
+
+procedure TRxMemoryData.InternalHandleException;
+begin
+ CustomApplication.HandleException(Self);
+end;
+
+procedure TRxMemoryData.InternalInitFieldDefs;
+begin
+end;
+
+function TRxMemoryData.IsCursorOpen: Boolean;
+begin
+ Result := FActive;
+end;
+
+{ Informational }
+
+function TRxMemoryData.GetRecordCount: Integer;
+begin
+ Result := FRecords.Count;
+end;
+
+function TRxMemoryData.GetRecNo: Integer;
+begin
+ CheckActive;
+ UpdateCursorPos;
+ if (FRecordPos = -1) and (RecordCount > 0) then Result := 1
+ else Result := FRecordPos + 1;
+end;
+
+procedure TRxMemoryData.SetRecNo(Value: Integer);
+begin
+ if (Value > 0) and (Value <= FRecords.Count) then
+ begin
+ FRecordPos := Value - 1;
+ Resync([]);
+ end;
+end;
+
+function TRxMemoryData.GetAnyRecField(SrcRecNo: integer; AField: TField
+ ): variant;
+var
+ Data1: PChar;
+ I: Integer;
+ Item:TMemoryRecord;
+begin
+ Item:=Records[SrcRecNo];
+ Data1 := FindFieldData(Item.Data, AField);
+ Inc(Data1); //Skip null flag
+
+ case AField.DataType of
+ ftString:Result := PChar(Data1);
+ ftSmallint:Result:=SmallInt(Data1^);
+ ftInteger,
+ ftDate,
+ ftTime,
+ ftAutoInc:Result:=Longint(Data1^);
+ ftWord:Result:=Word(Data1^);
+ ftBoolean:Result:=WordBool(Data1^);
+ ftFloat, ftCurrency:Result:=PDouble(Data1)^;
+ ftDateTime:Result:=PDateTime(Data1)^;
+ ftFixedChar:Result:=PChar(Data1);
+ ftWideString:Result:=PWideChar(Data1);
+ ftLargeint:Result:=Int64(Data1^);
+ ftVariant:
+ begin
+ Result := PVariant(Data1)^;
+ end;
+ ftGuid:Result:=PChar(Data1);
+ else
+ Result:=null;
+ end;
+end;
+
+function TRxMemoryData.IsSequenced: Boolean;
+begin
+ Result := not Filtered;
+end;
+
+{ DataSet locate routines }
+function DataSetLocateThrough(DataSet: TDataSet; const KeyFields: string;
+ const KeyValues: Variant; Options: TLocateOptions): Boolean;
+var
+ FieldCount: Integer;
+ Fields: TList;
+
+ function CompareField(Field: TField; Value: Variant): Boolean;
+ var
+ S,S1: string;
+
+ begin
+ if Field.DataType = ftString then
+ begin
+ S := Field.AsString;
+ S1:=Value;
+ if (loPartialKey in Options) then
+ Delete(S, Length(S1) + 1, MaxInt);
+
+ if (loCaseInsensitive in Options) then
+ Result := UTF8CompareText(S, S1) = 0
+ else
+ Result := UTF8CompareStr(S, S1) = 0;
+ end
+ else Result := (Field.Value = Value);
+ end;
+
+ function CompareRecord: Boolean;
+ var
+ I: Integer;
+ begin
+ if FieldCount = 1 then
+ Result := CompareField(TField(Fields.First), KeyValues)
+ else begin
+ Result := True;
+ for I := 0 to FieldCount - 1 do
+ Result := Result and CompareField(TField(Fields[I]), KeyValues[I]);
+ end;
+ end;
+var
+ Bookmark: TBookmark;
+begin
+ Result := False;
+ with DataSet do begin
+ CheckBrowseMode;
+ if BOF and EOF then Exit;
+ end;
+ Fields := TList.Create;
+ try
+ DataSet.GetFieldList(Fields, KeyFields);
+ FieldCount := Fields.Count;
+ Result := CompareRecord;
+ if Result then Exit;
+ DataSet.DisableControls;
+ try
+ Bookmark := DataSet.GetBookmark;
+ try
+ with DataSet do begin
+ First;
+ while not EOF do begin
+ Result := CompareRecord;
+ if Result then Break;
+ Next;
+ end;
+ end;
+ finally
+{$IFDEF NoAutomatedBookmark}
+ if not Result and DataSet.BookmarkValid(PChar(Bookmark)) then
+{$ELSE}
+ if not Result and DataSet.BookmarkValid(Bookmark) then
+{$ENDIF}
+ DataSet.GotoBookmark(Bookmark);
+ end;
+ finally
+ DataSet.FreeBookmark(Bookmark);
+ DataSet.EnableControls;
+ end;
+ finally
+ Fields.Free;
+ end;
+end;
+
+function TRxMemoryData.Locate(const KeyFields: string;
+ const KeyValues: Variant; Options: TLocateOptions): Boolean;
+begin
+ DoBeforeScroll;
+ Result := DataSetLocateThrough(Self, KeyFields, KeyValues, Options);
+ if Result then
+ begin
+ DataEvent(deDataSetChange, 0);
+ DoAfterScroll;
+ end;
+end;
+
+{ Table Manipulation }
+
+procedure TRxMemoryData.EmptyTable;
+begin
+ if Active then
+ begin
+ CheckBrowseMode;
+ ClearRecords;
+ ClearBuffers;
+ DataEvent(deDataSetChange, 0);
+ end;
+end;
+
+procedure TRxMemoryData.CloseOpen;
+begin
+ Close;
+ Open;
+end;
+
+procedure TRxMemoryData.CopyStructure(Source: TDataSet);
+
+ procedure CheckDataTypes(FieldDefs: TFieldDefs);
+ var
+ I: Integer;
+ begin
+ for I := FieldDefs.Count - 1 downto 0 do begin
+ if not (FieldDefs.Items[I].DataType in ftSupported) then
+ FieldDefs.Items[I].Free
+{$IFDEF ENABLE_Child_Defs}
+ else CheckDataTypes(FieldDefs[I].ChildDefs);
+{$ENDIF}
+ end;
+ end;
+
+var
+ I: Integer;
+begin
+ CheckInactive;
+ for I := FieldCount - 1 downto 0 do Fields[I].Free;
+ if (Source = nil) then Exit;
+ Source.FieldDefs.Update;
+// FieldDefs.Assign(Source.FieldDefs);
+// FieldDefs := Source.FieldDefs;
+ FieldDefs.Clear;
+ for i:=0 to Source.FieldDefs.Count-1 do
+ FieldDefs.Add(Source.FieldDefs[i].Name, Source.FieldDefs[i].DataType, Source.FieldDefs[i].Size, Source.FieldDefs[i].Required);
+
+ CheckDataTypes(FieldDefs);
+ CreateFields;
+end;
+(*
+procedure AssignRecord(Source, Dest: TDataSet; ByName: Boolean);
+var
+ I: Integer;
+ F, FSrc: TField;
+begin
+// if not (Dest.State in dsEditModes) then DBError(SNotEditing);
+ if ByName then begin
+ for I := 0 to Source.FieldCount - 1 do begin
+ F := Dest.FindField(Source.Fields[I].FieldName);
+ if F <> nil then begin
+ if (F.DataType = Source.Fields[I].DataType) and
+ (F.DataSize = Source.Fields[I].DataSize) then
+ F.Assign(Source.Fields[I])
+ else F.AsString := Source.Fields[I].AsString;
+ end;
+ end;
+ end
+ else begin
+ for I := 0 to Min(Source.FieldDefs.Count - 1, Dest.FieldDefs.Count - 1) do
+ begin
+ F := Dest.FindField(Dest.FieldDefs[I].Name);
+ FSrc := Source.FindField(Source.FieldDefs[I].Name);
+ if (F <> nil) and (FSrc <> nil) then begin
+ if F.DataType = FSrc.DataType then F.Assign(FSrc)
+ else F.AsString := FSrc.AsString;
+ end;
+ end;
+ end;
+end;
+*)
+function TRxMemoryData.LoadFromDataSet(Source: TDataSet; ARecordCount: Integer;
+ Mode: TLoadMode): Integer;
+var
+ SourceActive: Boolean;
+ MovedCount: Integer;
+begin
+ Result := 0;
+ if Source = Self then Exit;
+ SourceActive := Source.Active;
+ Source.DisableControls;
+ try
+ DisableControls;
+ try
+ Filtered := False;
+ with Source do begin
+ Open;
+ CheckBrowseMode;
+ UpdateCursorPos;
+ end;
+ if Mode = lmCopy then begin
+ Close;
+ CopyStructure(Source);
+ end;
+ FreeIndexList;
+ if not Active then Open;
+ Resync([]);
+ CheckBrowseMode;
+ if ARecordCount > 0 then MovedCount := ARecordCount
+ else begin
+ Source.First;
+ MovedCount := MaxInt;
+ end;
+ try
+ while not Source.EOF do
+ begin
+ Append;
+ AssignRecord(Source, Self, True);
+ Post;
+ Inc(Result);
+ if Result >= MovedCount then Break;
+ Source.Next;
+ end;
+ finally
+ First;
+ end;
+ finally
+ EnableControls;
+ end;
+ finally
+ if not SourceActive then Source.Close;
+ Source.EnableControls;
+ end;
+end;
+
+function TRxMemoryData.SaveToDataSet(Dest: TDataSet; ARecordCount: Integer): Integer;
+var
+ MovedCount: Integer;
+begin
+ Result := 0;
+ if Dest = Self then Exit;
+ CheckBrowseMode;
+ UpdateCursorPos;
+ Dest.DisableControls;
+ try
+ DisableControls;
+ try
+ if not Dest.Active then Dest.Open
+ else Dest.CheckBrowseMode;
+ if ARecordCount > 0 then MovedCount := ARecordCount
+ else
+ begin
+ First;
+ MovedCount := MaxInt;
+ end;
+ try
+ while not EOF do begin
+ Dest.Append;
+ AssignRecord(Self, Dest, True);
+ Dest.Post;
+ Inc(Result);
+ if Result >= MovedCount then Break;
+ Next;
+ end;
+ finally
+ Dest.First;
+ end;
+ finally
+ EnableControls;
+ end;
+ finally
+ Dest.EnableControls;
+ end;
+end;
+
+procedure TRxMemoryData.AppendRecord(const Values: array of const);
+var
+ I: Integer;
+begin
+ if State <> dsInsert then
+ Append;
+ for I := 0 to High(Values) do Fields[I].AssignValue(Values[I]);
+ Post;
+end;
+
+{ Index Related }
+
+procedure TRxMemoryData.SortOnFields(const FieldNames: string;
+ CaseInsensitive: Boolean = True; Descending: Boolean = False);
+begin
+ CreateIndexList(FieldNames);
+ FCaseInsensitiveSort := CaseInsensitive;
+ FDescendingSort := Descending;
+ try
+ Sort;
+ except
+ FreeIndexList;
+ raise;
+ end;
+end;
+
+procedure TRxMemoryData.SortOnFieldsEx(const FieldNames: string;
+ CaseInsensitive: Boolean; Asc: array of boolean);
+begin
+
+end;
+
+procedure TRxMemoryData.Sort;
+var
+ Pos: TBookmark;
+begin
+ if Active and (FRecords <> nil) and (FRecords.Count > 0) then
+ begin
+ Pos := GetBookmark;
+ try
+ QuickSort(0, FRecords.Count - 1, @CompareRecords);
+ SetBufListSize(0);
+ InitBufferPointers(False);
+ try
+ RecalcBufListSize;
+// SetBufListSize(BufferCount + 1);
+ except
+ SetState(dsInactive);
+ CloseCursor;
+ raise;
+ end;
+ finally
+ GotoBookmark(Pos);
+ FreeBookmark(Pos);
+ end;
+ Resync([]);
+ end;
+end;
+
+procedure TRxMemoryData.QuickSort(L, R: Integer; Compare: TCompareRecords);
+var
+ I, J: Integer;
+ P: TMemoryRecord;
+begin
+ repeat
+ I := L;
+ J := R;
+ P := Records[(L + R) shr 1];
+ repeat
+ while Compare(Records[I], P) < 0 do Inc(I);
+ while Compare(Records[J], P) > 0 do Dec(J);
+ if I <= J then begin
+ FRecords.Exchange(I, J);
+ Inc(I);
+ Dec(J);
+ end;
+ until I > J;
+ if L < J then QuickSort(L, J, Compare);
+ L := I;
+ until I >= R;
+end;
+
+procedure TRxMemoryData.SetOnFilterRecordEx(const AValue: TFilterRecordEvent);
+begin
+ {$IFDEF FIX_TRxMemoryData_Filter}
+ CheckBiDirectional;
+ FOnFilterRecordEx:=AValue;
+ {$ELSE}
+ OnFilterRecord:=AValue;
+ {$ENDIF}
+end;
+
+function TRxMemoryData.CompareRecords(Item1, Item2: TMemoryRecord): Integer;
+var
+ Data1, Data2: PChar;
+ F: TField;
+ I: Integer;
+begin
+ Result := 0;
+ if FIndexList <> nil then begin
+ for I := 0 to FIndexList.Count - 1 do begin
+ F := TField(FIndexList[I]);
+ Data1 := FindFieldData(Item1.Data, F);
+ if Data1 <> nil then begin
+ Data2 := FindFieldData(Item2.Data, F);
+ if Data2 <> nil then begin
+ if Boolean(Data1[0]) and Boolean(Data2[0]) then begin
+ Inc(Data1);
+ Inc(Data2);
+ Result := CompareFields(Data1, Data2, F.DataType,
+ FCaseInsensitiveSort);
+ end
+ else if Boolean(Data1[0]) then Result := 1
+ else if Boolean(Data2[0]) then Result := -1;
+ if FDescendingSort then Result := -Result;
+ end;
+ end;
+ if Result <> 0 then Exit;
+ end;
+ end;
+ if (Result = 0) then begin
+ if Item1.ID > Item2.ID then Result := 1
+ else if Item1.ID < Item2.ID then Result := -1;
+ if FDescendingSort then Result := -Result;
+ end;
+end;
+
+function TRxMemoryData.GetIsIndexField(Field: TField): Boolean;
+begin
+ if FIndexList <> nil then
+ Result := FIndexList.IndexOf(Field) >= 0
+ else Result := False;
+end;
+
+procedure TRxMemoryData.CreateIndexList(const FieldNames: string);
+var
+ Pos: Integer;
+ F: TField;
+begin
+ if FIndexList = nil then FIndexList := TList.Create
+ else FIndexList.Clear;
+ Pos := 1;
+ while Pos <= Length(FieldNames) do begin
+ F := FieldByName(ExtractFieldName(FieldNames, Pos));
+ if (F.FieldKind = fkData) and
+ (F.DataType in ftSupported - ftBlobTypes) then
+ FIndexList.Add(F)
+ else ErrorFmt(SFieldTypeMismatch, [F.DisplayName]);
+ end;
+end;
+
+procedure TRxMemoryData.FreeIndexList;
+begin
+ FIndexList.Free;
+ FIndexList := nil;
+end;
+
+function TRxMemoryData.IntAllocRecordBuffer: PChar;
+begin
+ // do nothing
+end;
+
+procedure TRxMemoryData.IntLoadFielddefsFromFile;
+begin
+ FDatasetReader.LoadFielddefs(FieldDefs);
+ if DefaultFields then CreateFields;
+end;
+
+procedure TRxMemoryData.IntLoadRecordsFromFile;
+var StoreState : TDataSetState;
+ AddRecordBuffer : boolean;
+ ARowState : TRowState;
+ AUpdOrder : integer;
+
+begin
+ FDatasetReader.InitLoadRecords;
+ StoreState:=SetTempState(dsFilter);
+
+ while FDatasetReader.GetCurrentRecord do
+ begin
+ ARowState := FDatasetReader.GetRecordRowState(AUpdOrder);
+
+ FDatasetReader.RestoreRecord(self);
+ inc(FBRecordCount);
+
+ FDatasetReader.GotoNextRecord;
+ end;
+
+ RestoreState(StoreState);
+
+ if assigned(FFileStream) then
+ begin
+ FreeAndNil(FFileStream);
+ FreeAndNil(FDatasetReader);
+ end;
+
+end;
+
+procedure TRxMemoryData.SetPacketRecords(const AValue: Integer);
+begin
+ if FPacketRecords=AValue then exit;
+ FPacketRecords:=AValue;
+end;
+
+procedure TRxMemoryData.SetDatasetPacket(AReader: TRxDataPacketReader);
+var
+ StoreDSState : TDataSetState;
+ ARowState : TRowState;
+ AUpdOrder : integer;
+begin
+ FDatasetReader := AReader;
+
+ DisableControls;
+ try
+ Filtered := False;
+
+ Close; // must be inactive to do IntLoadFielddefsFromFile
+ // load fields defs
+ IntLoadFielddefsFromFile;
+
+ FreeIndexList;
+
+ if not Active then Open;
+ Resync([]); // clears buffers if empty dataset
+ CheckBrowseMode;
+
+ FDatasetReader.InitLoadRecords;
+
+ try
+ while FDatasetReader.GetCurrentRecord do
+ begin
+ Append;
+
+ ARowState := FDatasetReader.GetRecordRowState(AUpdOrder); // added for binary export
+
+ FDatasetReader.RestoreRecord(TRxMemoryData(Self));
+
+ Post;
+
+ FDatasetReader.GotoNextRecord;
+ inc(FBRecordCount);
+
+ end;
+ finally
+ First;
+ end;
+
+ finally
+ EnableControls;
+ end;
+
+ if assigned(FFileStream) then
+ begin
+ FreeAndNil(FFileStream);
+ FreeAndNil(FDatasetReader);
+ end;
+
+end;
+
+procedure TRxMemoryData.GetDatasetPacket(AWriter: TRxDataPacketReader);
+var
+ StoreDSState : TDataSetState;
+begin
+
+ CheckBrowseMode;
+ UpdateCursorPos;
+
+ FDatasetReader := AWriter;
+ try
+ DisableControls;
+ try
+
+ FDatasetReader.StoreFieldDefs(FieldDefs);
+
+ First;
+ while not EOF do
+ begin
+ // ** NOTE ** had to cast self to TRxMemoryData just save current values
+ // otherwise the as string value in ex_rx_datapacket would not write.
+ FDatasetReader.StoreRecord(TRxMemoryData(Self),[]);
+ Next;
+ end;
+
+ FDatasetReader.FinalizeStoreRecords;
+ finally
+ EnableControls;
+ end;
+ finally
+ FDatasetReader := nil;
+ end;
+end;
+
+procedure TRxMemoryData.LoadFromStream(AStream: TStream;
+ Format: TRxDataPacketFormat);
+var APacketReaderReg : TRxDatapacketReaderRegistration;
+ APacketReader : TRxDataPacketReader;
+begin
+ if GetRegisterDatapacketReader(AStream,format,APacketReaderReg) then
+ APacketReader := APacketReaderReg.ReaderClass.create(AStream)
+ else
+ DatabaseError(SStreamNotRecognised);
+ try
+ SetDatasetPacket(APacketReader);
+ finally
+ APacketReader.Free;
+ end;
+end;
+
+procedure TRxMemoryData.SaveToStream(AStream: TStream;
+ Format: TRxDataPacketFormat);
+var APacketReaderReg : TRxDatapacketReaderRegistration;
+ APacketWriter : TRxDataPacketReader;
+begin
+ if GetRegisterDatapacketReader(Nil,format,APacketReaderReg) then
+ APacketWriter := APacketReaderReg.ReaderClass.create(AStream)
+ else
+ DatabaseError(SNoReaderClassRegistered);
+ try
+ GetDatasetPacket(APacketWriter);
+ finally
+ APacketWriter.Free;
+ end;
+end;
+
+procedure TRxMemoryData.LoadFromFile(AFileName: string;
+ Format: TRxDataPacketFormat);
+var AFileStream : TFileStream;
+begin
+ if AFileName='' then AFileName := FFileName;
+ AFileStream := TFileStream.Create(AFileName,fmOpenRead);
+ try
+ LoadFromStream(AFileStream, Format);
+ finally
+ AFileStream.Free;
+ end;
+end;
+
+procedure TRxMemoryData.SaveToFile(AFileName: string;
+ Format: TRxDataPacketFormat);
+var AFileStream : TFileStream;
+begin
+ if AFileName='' then AFileName := FFileName;
+ AFileStream := TFileStream.Create(AFileName,fmCreate);
+ try
+ SaveToStream(AFileStream, Format);
+ finally
+ AFileStream.Free;
+ end;
+end;
+
+{ TMemBlobStream }
+
+constructor TMemBlobStream.Create(Field: TBlobField; Mode: TBlobStreamMode);
+begin
+ FMode := Mode;
+ FField := Field;
+ FDataSet := FField.DataSet as TRxMemoryData;
+ if not FDataSet.GetActiveRecBuf(FBuffer) then Exit;
+ if not FField.Modified and (Mode <> bmRead) then begin
+ if FField.ReadOnly then ErrorFmt(SFieldReadOnly, [FField.DisplayName]);
+ if not (FDataSet.State in [dsEdit, dsInsert]) then Error(SNotEditing);
+ FCached := True;
+ end
+ else FCached := (FBuffer = FDataSet.ActiveBuffer);
+ FOpened := True;
+ if Mode = bmWrite then Truncate;
+end;
+
+destructor TMemBlobStream.Destroy;
+begin
+ if FOpened and FModified then FField.Modified := True;
+ if FModified then
+ try
+ FDataSet.DataEvent(deFieldChange, ptrint(FField));
+ except
+ CustomApplication.HandleException(Self);
+// Application.HandleException(Self);
+ end;
+end;
+
+function TMemBlobStream.GetBlobFromRecord(Field: TField): TMemBlobData;
+var
+ Rec: TMemoryRecord;
+ Pos: Integer;
+begin
+ Result := '';
+ Pos := FDataSet.FRecordPos;
+ if (Pos < 0) and (FDataSet.RecordCount > 0) then Pos := 0
+ else if Pos >= FDataSet.RecordCount then Pos := FDataSet.RecordCount - 1;
+ if (Pos >= 0) and (Pos < FDataSet.RecordCount) then begin
+ Rec := FDataSet.Records[Pos];
+ if Rec <> nil then
+ Result := PMemBlobArray(Rec.FBlobs)^[FField.Offset];
+ end;
+end;
+
+function TMemBlobStream.Read(var Buffer; Count: Longint): Longint;
+begin
+ Result := 0;
+ if FOpened then begin
+ if Count > Size - FPosition then Result := Size - FPosition
+ else Result := Count;
+ if Result > 0 then begin
+ if FCached then begin
+ Move(PChar(FDataSet.GetBlobData(FField, FBuffer))[FPosition], Buffer,
+ Result);
+ Inc(FPosition, Result);
+ end
+ else begin
+ Move(PChar(GetBlobFromRecord(FField))[FPosition], Buffer,
+ Result);
+ Inc(FPosition, Result);
+ end;
+ end;
+ end;
+end;
+
+function TMemBlobStream.Write(const Buffer; Count: Longint): Longint;
+var
+ Temp: TMemBlobData;
+begin
+ Result := 0;
+ if FOpened and FCached and (FMode <> bmRead) then begin
+ Temp := FDataSet.GetBlobData(FField, FBuffer);
+ if Length(Temp) < FPosition + Count then
+ SetLength(Temp, FPosition + Count);
+ Move(Buffer, PChar(Temp)[FPosition], Count);
+ FDataSet.SetBlobData(FField, FBuffer, Temp);
+ Inc(FPosition, Count);
+ Result := Count;
+ FModified := True;
+ end;
+end;
+
+function TMemBlobStream.Seek(Offset: Longint; Origin: Word): Longint;
+begin
+ case Origin of
+ 0: FPosition := Offset;
+ 1: Inc(FPosition, Offset);
+ 2: FPosition := GetBlobSize + Offset;
+ end;
+ Result := FPosition;
+end;
+
+procedure TMemBlobStream.Truncate;
+begin
+ if FOpened and FCached and (FMode <> bmRead) then begin
+ FDataSet.SetBlobData(FField, FBuffer, '');
+ FModified := True;
+ end;
+end;
+
+function TMemBlobStream.GetBlobSize: Longint;
+begin
+ Result := 0;
+ if FOpened then
+ if FCached then
+ Result := Length(FDataSet.GetBlobData(FField, FBuffer))
+ else
+ Result := Length(GetBlobFromRecord(FField))
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxnew.lpk b/components/rx/version/v2.2_laz_1.2/rxnew.lpk
new file mode 100644
index 000000000..acf63dc6d
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxnew.lpk
@@ -0,0 +1,337 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/rx/version/v2.2_laz_1.2/rxnew.pas b/components/rx/version/v2.2_laz_1.2/rxnew.pas
new file mode 100644
index 000000000..fcddd2d8b
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxnew.pas
@@ -0,0 +1,34 @@
+{ This file was automatically created by Lazarus. Do not edit!
+ This source is only used to compile and install the package.
+ }
+
+unit rxnew;
+
+interface
+
+uses
+ AutoPanel, boxprocs, curredit, dateutil, dbcurredit, dbdateedit, dbutils,
+ duallist, fduallst, folderlister, pagemngr, pickdate, registerrx,
+ RegisterRxDB, RegisterRxTools, RxAboutDialog, rxAboutFormUnit, rxappicon,
+ rxapputils, rxclock, rxConfigValues, rxconst, rxctrls, rxcustomchartpanel,
+ RxDBColorBox, rxdbcomb, RxDBCtrls, rxdbgrid, rxdbgrid_columsunit,
+ rxdbgrid_findunit, RxDBSpinEdit, RxDBTimeEdit, rxdconst, rxdice,
+ rxFileUtils, rxfilterby, rxiconv, rxlogin, rxlookup, rxmemds, rxpopupunit,
+ rxsortmemds, rxspin, rxstrutils, rxswitch, RxSystemServices, rxtbrsetup,
+ RxTimeEdit, rxtoolbar, RxVersInfo, RxViewsPanel, rxxpman, seldsfrm,
+ tooledit, vclutils, RxCloseFormValidator, RxHistoryNavigator,
+ ex_rx_bin_datapacket, ex_rx_datapacket, ex_rx_xml_datapacket, rxsortby,
+ RxMDI, RxIniPropStorage, rxDateRangeEditUnit, LazarusPackageIntf;
+
+implementation
+
+procedure Register;
+begin
+ RegisterUnit('registerrx', @registerrx.Register);
+ RegisterUnit('RegisterRxDB', @RegisterRxDB.Register);
+ RegisterUnit('RegisterRxTools', @RegisterRxTools.Register);
+end;
+
+initialization
+ RegisterPackage('rxnew', @Register);
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxpopupunit.pas b/components/rx/version/v2.2_laz_1.2/rxpopupunit.pas
new file mode 100644
index 000000000..4dbf3715f
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxpopupunit.pas
@@ -0,0 +1,989 @@
+{ rxpopupunit unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit rxpopupunit;
+
+{$I rx.inc}
+
+interface
+
+uses
+ Classes, SysUtils, DB, Forms, DBGrids, rxdbgrid, LCLType, Controls, ComCtrls,
+ Buttons, Grids, Graphics, vclutils;
+
+type
+ TPopUpCloseEvent = procedure(AResult:boolean) of object;
+ TPopUpFormOptions = class;
+
+ { TPopUpGrid }
+
+ TPopUpGrid = class(TRxDBGrid)
+ private
+ FFindLine:string;
+ FLookupDisplayIndex: integer;
+ FLookupDisplayField:string;
+ procedure ClearFind;
+ procedure FindNextChar(var UTF8Key: TUTF8Char);
+ procedure FindPriorChar;
+ procedure SetLookupDisplayIndex(const AValue: integer);
+ protected
+ procedure SetDBHandlers(Value: boolean);override;
+ procedure UTF8KeyPress(var UTF8Key: TUTF8Char); override;
+ procedure KeyDown(var Key: Word; Shift: TShiftState); override;
+ property LookupDisplayIndex:integer read FLookupDisplayIndex write SetLookupDisplayIndex;
+ end;
+
+ TPopUpGridOption = (pfgIndicator, pfgColLines, pfgRowLines, pfgColumnResize,
+ pfgColumnMove);
+
+ TPopUpGridOptions = set of TPopUpGridOption;
+
+ { TPopUpColumnTitle }
+
+ TPopUpColumnTitle = class(TPersistent)
+ private
+ FAlignment: TAlignment;
+ FCaption: string;
+ FColor: TColor;
+ FLayout: TTextLayout;
+ FOrientation: TTextOrientation;
+ procedure SetAlignment(const AValue: TAlignment);
+ procedure SetCaption(const AValue: string);
+ procedure SetColor(const AValue: TColor);
+ procedure SetLayout(const AValue: TTextLayout);
+ procedure SetOrientation(const AValue: TTextOrientation);
+ public
+ constructor Create;
+ procedure Assign(Source: TPersistent); override;
+ published
+ property Orientation:TTextOrientation read FOrientation write SetOrientation;
+ property Alignment: TAlignment read FAlignment write SetAlignment;
+ property Layout: TTextLayout read FLayout write SetLayout;
+ property Caption: string read FCaption write SetCaption;
+ property Color: TColor read FColor write SetColor;
+ end;
+
+ TPopUpColumn = class(TCollectionItem)
+ private
+ FAlignment: TAlignment;
+ FColor: TColor;
+ FDisplayFormat: string;
+ FFieldName: string;
+ FFont: TFont;
+ FImageList: TImageList;
+ FSizePriority: Integer;
+ FTitle: TPopUpColumnTitle;
+ FValueChecked: string;
+ FValueUnchecked: string;
+ FWidth: Integer;
+ procedure SetAlignment(const AValue: TAlignment);
+ procedure SetColor(const AValue: TColor);
+ procedure SetDisplayFormat(const AValue: string);
+ procedure SetFieldName(const AValue: string);
+ procedure SetFont(const AValue: TFont);
+ procedure SetImageList(const AValue: TImageList);
+ procedure SetSizePriority(AValue: Integer);
+ procedure SetTitle(const AValue: TPopUpColumnTitle);
+ procedure SetValueChecked(const AValue: string);
+ procedure SetValueUnchecked(const AValue: string);
+ procedure SetWidth(const AValue: Integer);
+ protected
+ function GetDisplayName: string; override;
+ public
+ constructor Create(ACollection: TCollection); override;
+ destructor Destroy; override;
+ published
+ property Alignment: TAlignment read FAlignment write SetAlignment;
+ property Color: TColor read FColor write SetColor;
+ property DisplayFormat: string read FDisplayFormat write SetDisplayFormat;
+ property Font: TFont read FFont write SetFont;
+ property FieldName:string read FFieldName write SetFieldName;
+ property ImageList:TImageList read FImageList write SetImageList;
+ property ValueChecked: string read FValueChecked write SetValueChecked;
+ property ValueUnchecked: string read FValueUnchecked write SetValueUnchecked;
+ property SizePriority: Integer read FSizePriority write SetSizePriority default 1;
+ property Title:TPopUpColumnTitle read FTitle write SetTitle;
+ property Width: Integer read FWidth write SetWidth;
+ end;
+
+ { TPopUpFormColumns }
+
+ TPopUpFormColumns = class(TOwnedCollection)
+ private
+ FPopUpFormOptions: TPopUpFormOptions;
+ function GetPopUpColumn(Index: Integer): TPopUpColumn;
+ procedure SetPopUpColumn(Index: Integer; const AValue: TPopUpColumn);
+ public
+ Constructor Create(AOwner: TPersistent);
+ procedure Assign(Source: TPersistent); override;
+ property PopUpFormOptions:TPopUpFormOptions read FPopUpFormOptions write FPopUpFormOptions;
+ property Items[Index: Integer]: TPopUpColumn read GetPopUpColumn write SetPopUpColumn; default;
+ end;
+
+ { TPopUpFormOptions }
+
+ TPopUpFormOptions = class(TPersistent)
+ private
+ FAlternateColor: TColor;
+ FAutoFillColumns: boolean;
+ FAutoSort: boolean;
+ FBorderStyle: TBorderStyle;
+ FColor: TColor;
+ FColumns: TPopUpFormColumns;
+ FDataSource: TDataSource;
+ FDropDownCount: integer;
+ FDropDownWidth: integer;
+ FOnGetCellProps: TGetCellPropsEvent;
+ FOptions: TPopUpGridOptions;
+ FShowTitles: boolean;
+ FTitleButtons: boolean;
+ FTitleStyle: TTitleStyle;
+ FOwner:TPersistent;
+ function GetColumns: TPopUpFormColumns;
+ function IsAltColorStored: Boolean;
+ procedure SetAutoFillColumns(const AValue: boolean);
+ procedure SetAutoSort(const AValue: boolean);
+ procedure SetColumns(const AValue: TPopUpFormColumns);
+ procedure SetDropDownCount(const AValue: integer);
+ procedure SetDropDownWidth(const AValue: integer);
+ procedure SetOptions(const AValue: TPopUpGridOptions);
+ procedure SetShowTitles(const AValue: boolean);
+ procedure SetTitleButtons(const AValue: boolean);
+ procedure SetTitleStyle(const AValue: TTitleStyle);
+ protected
+ function GetOwner: TPersistent; dynamic;
+ public
+ constructor Create(AOwner:TPersistent);
+ destructor Destroy; override;
+ procedure Assign(Source: TPersistent); override;
+ property DataSource:TDataSource read FDataSource write FDataSource;
+ published
+ property AlternateColor: TColor read FAlternateColor write FAlternateColor stored IsAltColorStored;
+ property Color: TColor read FColor write FColor default {$ifdef UseCLDefault}clDefault{$else}clWindow{$endif};
+
+ property AutoFillColumns:boolean read FAutoFillColumns write SetAutoFillColumns default false;
+ property AutoSort:boolean read FAutoSort write SetAutoSort default false;
+ property BorderStyle: TBorderStyle read FBorderStyle write FBorderStyle default bsNone;
+ property Columns:TPopUpFormColumns read GetColumns write SetColumns;
+ property DropDownCount:integer read FDropDownCount write SetDropDownCount default 8;
+ property DropDownWidth:integer read FDropDownWidth write SetDropDownWidth default 0;
+ property Options:TPopUpGridOptions read FOptions write SetOptions default [pfgColLines, pfgRowLines];
+ property ShowTitles:boolean read FShowTitles write SetShowTitles default false;
+ property TitleButtons:boolean read FTitleButtons write SetTitleButtons default false;
+ property TitleStyle:TTitleStyle read FTitleStyle write SetTitleStyle default tsLazarus;
+ property OnGetCellProps: TGetCellPropsEvent read FOnGetCellProps
+ write FOnGetCellProps;
+ end;
+
+ { TPopUpForm }
+ TPopUpForm = class(TForm)
+ private
+ CloseBtn: TBitBtn;
+ FFindResult:boolean;
+ FGrid:TPopUpGrid;
+ FDataSource:TDataSource;
+ FOnPopUpCloseEvent:TPopUpCloseEvent;
+ FPopUpFormOptions:TPopUpFormOptions;
+ FRowCount:word;
+ WControl:TWinControl;
+ function GetDataSet: TDataSet;
+ function GetLookupDisplayIndex: integer;
+ procedure SetDataSet(const AValue: TDataSet);
+ procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
+ procedure SetLookupDisplayIndex(const AValue: integer);
+ protected
+ FFieldList:string;
+ procedure Deactivate; override;
+ procedure KeyDown(var Key: Word; Shift: TShiftState); override;
+ procedure GridDblClick(Sender: TObject);
+ procedure GridClickEvent(Column: TColumn);
+ procedure CloseOk;
+ procedure Paint;override;
+ procedure CreateWnd;override;
+ //
+ procedure DoSetFieldsFromString(FL:string);
+ procedure DoSetFieldsFromColList;
+ public
+ procedure UTF8KeyPress(var UTF8Key: TUTF8Char); override;
+ constructor CreatePopUp(AOwner: TComponent;
+ APopUpFormOptions:TPopUpFormOptions; AFieldList:string; BtnWidtn:integer);
+ destructor Destroy; override;
+ property DataSet:TDataSet read GetDataSet write SetDataSet;
+ property LookupDisplayIndex:integer read GetLookupDisplayIndex write SetLookupDisplayIndex;
+ end;
+
+function ShowRxDBPopUpForm(AControl:TWinControl; ADataSet:TDataSet;
+ AOnPopUpCloseEvent:TPopUpCloseEvent; APopUpFormOptions:TPopUpFormOptions;
+ AFieldList:string; ALookupDisplayIndex, BtnWidtn: integer; const Font:TFont):TPopUpForm;
+
+procedure FillPopupWidth(APopUpFormOptions:TPopUpFormOptions; ARxPopUpForm:TPopUpForm);
+
+implementation
+uses dbutils, math, LCLProc;
+
+function ShowRxDBPopUpForm(AControl:TWinControl; ADataSet:TDataSet;
+ AOnPopUpCloseEvent:TPopUpCloseEvent; APopUpFormOptions:TPopUpFormOptions;
+ AFieldList:string; ALookupDisplayIndex, BtnWidtn: integer; const Font:TFont):TPopUpForm;
+begin
+ Result:=TPopUpForm.CreatePopUp(AControl, APopUpFormOptions, AFieldList, BtnWidtn);
+ Result.FOnPopUpCloseEvent:=AOnPopUpCloseEvent;
+ Result.DataSet:=ADataSet;
+ Result.LookupDisplayIndex:=ALookupDisplayIndex;
+
+ Result.WControl:=AControl;
+
+ if Assigned(Font) then
+ begin
+ Result.FGrid.Font.Assign(Font);
+ end;
+
+{$IFDEF LINUX}
+{ if Result.ShowModal = mrOk then
+ if Assigned(AOnPopUpCloseEvent) then
+ AOnPopUpCloseEvent(true);
+ Result.Free;
+ Result:=nil;}
+{$ELSE LINUX}
+ Result.Show;
+ Result.FGrid.UpdateActive;
+{$ENDIF LINUX}
+end;
+
+procedure FillPopupWidth(APopUpFormOptions: TPopUpFormOptions;
+ ARxPopUpForm: TPopUpForm);
+var
+ i, w:integer;
+begin
+ w:=Min(APopUpFormOptions.Columns.Count, ARxPopUpForm.FGrid.Columns.Count);
+ for i:=0 to w-1 do
+ begin
+ APopUpFormOptions.Columns[i].Width:=ARxPopUpForm.FGrid.Columns[i].Width;
+ end;
+end;
+
+{ TPopUpForm }
+procedure TPopUpForm.SetDataSet(const AValue: TDataSet);
+begin
+ if FDataSource.DataSet=AValue then exit;
+ FDataSource.DataSet:=AValue;
+ if FPopUpFormOptions.Columns.Count>0 then
+ DoSetFieldsFromColList
+ else
+ DoSetFieldsFromString(FFieldList);
+end;
+
+procedure TPopUpForm.FormClose(Sender: TObject; var CloseAction: TCloseAction);
+begin
+ CloseAction:=caFree;
+ if (ModalResult <> mrOk) and Assigned(FOnPopUpCloseEvent) then
+ FOnPopUpCloseEvent(FFindResult);
+end;
+
+procedure TPopUpForm.SetLookupDisplayIndex(const AValue: integer);
+begin
+ FGrid.LookupDisplayIndex:=AValue;
+end;
+
+function TPopUpForm.GetDataSet: TDataSet;
+begin
+ Result:=FDataSource.DataSet;
+end;
+
+function TPopUpForm.GetLookupDisplayIndex: integer;
+begin
+ Result:=FGrid.FLookupDisplayIndex;
+end;
+
+procedure TPopUpForm.Deactivate;
+begin
+ inherited Deactivate;
+ if (ModalResult = mrOk) and Assigned(FOnPopUpCloseEvent) then
+ FOnPopUpCloseEvent(FFindResult);
+ Close;
+end;
+
+procedure TPopUpForm.KeyDown(var Key: Word; Shift: TShiftState);
+begin
+ case Key of
+ VK_ESCAPE:Deactivate;
+ VK_RETURN:begin
+ Key:=0;
+ Shift:=[];
+ CloseOk;
+ exit;{In that case we need to exit away.}
+ end;
+ else
+ inherited KeyDown(Key, Shift);
+ end;
+ FGrid.KeyDown(Key, Shift);
+// Key:=0;
+ Invalidate;
+end;
+
+procedure TPopUpForm.UTF8KeyPress(var UTF8Key: TUTF8Char);
+begin
+ inherited UTF8KeyPress(UTF8Key);
+ FGrid.UTF8KeyPress(UTF8Key);
+end;
+
+procedure TPopUpForm.GridDblClick(Sender: TObject);
+begin
+ CloseOk;
+end;
+
+procedure TPopUpForm.GridClickEvent(Column: TColumn);
+begin
+ CloseOk;
+end;
+
+procedure TPopUpForm.CloseOk;
+begin
+ FFindResult:=true;
+{$IFDEF LINUX}
+ ModalResult:=mrOk;
+{$ELSE LINUX}
+ Deactivate;
+{$ENDIF LINUX}
+end;
+
+procedure TPopUpForm.Paint;
+var
+ CR:TRect;
+begin
+ inherited Paint;
+ if FPopUpFormOptions.BorderStyle<>bsNone then
+ begin
+ CR:=ClientRect;
+ RxFrame3D(Canvas, CR, clBtnHighlight, clWindowFrame, 1);
+ RxFrame3D(Canvas, CR, clBtnFace, clBtnShadow, 1);
+ end
+ else
+ begin
+ Canvas.Pen.Color:=clWindowText;
+ Canvas.Pen.Style := psSolid;
+ Canvas.Rectangle(0, 0, Width-1, Height-1)
+ end;
+end;
+
+procedure TPopUpForm.CreateWnd;
+begin
+ inherited CreateWnd;
+ Height:=FGrid.DefaultRowHeight * FRowCount;
+end;
+
+procedure TPopUpForm.DoSetFieldsFromString(FL: string);
+var
+ FieldName:string;
+ GK:TRxColumn;
+ K:integer;
+begin
+ while (FL<>'') do
+ begin
+ K:=Pos(';', FL);
+ if K<>0 then
+ begin
+ FieldName:=Copy(FL, 1, K-1);
+ Delete(FL, 1, K);
+ end
+ else
+ begin
+ FieldName:=FL;
+ FL:='';
+ end;
+ GK:=FGrid.Columns.Add as TRxColumn;
+ GK.Field:=FGrid.DataSource.DataSet.FieldByName(FieldName);
+ end;
+end;
+
+procedure TPopUpForm.DoSetFieldsFromColList;
+var
+ GK:TRxColumn;
+ i:integer;
+ Column:TPopUpColumn;
+begin
+ FGrid.BeginUpdate;
+ for i:=0 to FPopUpFormOptions.Columns.Count - 1 do
+ begin
+ GK:=FGrid.Columns.Add as TRxColumn;
+ Column:=FPopUpFormOptions.Columns[i];
+ GK.Field:=FGrid.DataSource.DataSet.FieldByName(Column.FieldName);
+ GK.Alignment:=Column.Alignment;
+ GK.Color:=Column.Color;
+ GK.DisplayFormat:=Column.DisplayFormat;
+// GK.Font:=Column.Font;
+ GK.ImageList:=Column.ImageList;
+ GK.SizePriority:=Column.SizePriority;
+ GK.ValueChecked:=Column.ValueChecked;
+ GK.ValueUnchecked:=Column.ValueUnchecked;
+
+ if Column.Width<>0 then
+ GK.Width:=Column.Width;
+
+ GK.Title.Color:=Column.Title.Color;
+ (GK.Title as TRxColumnTitle).Orientation:=Column.Title.Orientation;
+ GK.Title.Alignment:=Column.Title.Alignment;
+ GK.Title.Layout:=Column.Title.Layout;
+ GK.Title.Caption:=Column.Title.Caption;
+ end;
+ FGrid.EndUpdate;
+end;
+
+constructor TPopUpForm.CreatePopUp(AOwner: TComponent;
+ APopUpFormOptions:TPopUpFormOptions; AFieldList:string; BtnWidtn:integer);
+var
+ PopupOrigin:TPoint;
+begin
+ inherited CreateNew(nil);
+// inherited Create(AOwner);
+ BorderStyle := bsNone;
+ Caption:='RxPopUp';
+ KeyPreview:=true;
+ Visible := false;
+ FDataSource:=TDataSource.Create(Self);
+ FPopUpFormOptions:=APopUpFormOptions;
+ FFieldList:=AFieldList;
+ OnClose := @FormClose;
+
+{$IFDEF LINUX}
+ PopupOrigin:=TCustomControl(AOwner).Parent.ControlToScreen(Point(TCustomControl(AOwner).Left, TCustomControl(AOwner).Height + TCustomControl(AOwner).Top));
+{$ELSE}
+ PopupOrigin:=TCustomControl(AOwner).ControlToScreen(Point(0, TCustomControl(AOwner).Height));
+{$ENDIF}
+ Top:=PopupOrigin.y;
+ Left:=PopupOrigin.x;
+
+ if FPopUpFormOptions.DropDownWidth = 0 then
+ Width:=TCustomControl(AOwner).Width + BtnWidtn
+ else
+ Width:=FPopUpFormOptions.DropDownWidth;
+
+{$IFDEF LINUX}
+ CloseBtn:=TBitBtn.Create(Self);
+ CloseBtn.Parent:=Self;
+ CloseBtn.Align:=alBottom;
+ CloseBtn.Kind:=bkCancel;
+{$ENDIF}
+ FGrid:=TPopUpGrid.Create(Self);
+ FGrid.Parent:=Self;
+ FGrid.ReadOnly:=true;
+ FGrid.Options:=FGrid.Options - [dgEditing];
+ FGrid.DataSource:=FDataSource;
+ FGrid.OnDblClick:=@GridDblClick;
+ FGrid.OnCellClick:=@GridClickEvent;
+ if FPopUpFormOptions.BorderStyle = bsSingle then
+ begin
+ FGrid.Top:=2;
+ FGrid.Left:=2;
+ FGrid.Width:=Width - 4;
+{$IFDEF LINUX}
+ FGrid.Height:=Height - CloseBtn.Height - 2;
+{$ELSE}
+ FGrid.Height:=Height - 4;
+{$ENDIF}
+ FGrid.Anchors:=[akLeft, akRight, akTop, akBottom];
+ end
+ else
+ begin
+ FGrid.Top:=1;
+ FGrid.Left:=1;
+ FGrid.Width:=Width - 3;
+{$IFDEF LINUX}
+ FGrid.Height:=Height - CloseBtn.Height - 2;
+{$ELSE}
+ FGrid.Height:=Height - 3;
+{$ENDIF}
+ FGrid.Anchors:=[akLeft, akRight, akTop, akBottom];
+ end;
+ //Set options
+ if not (pfgIndicator in FPopUpFormOptions.FOptions) then
+ begin
+ FGrid.Options:=FGrid.Options - [dgIndicator];
+ FGrid.FixedCols:=0;
+ end;
+
+ if not (pfgColLines in FPopUpFormOptions.FOptions) then
+ FGrid.Options:=FGrid.Options - [dgColLines];
+
+ if not (pfgRowLines in FPopUpFormOptions.FOptions) then
+ FGrid.Options:=FGrid.Options - [dgRowLines];
+
+ if not (pfgColumnResize in FPopUpFormOptions.FOptions) then
+ FGrid.Options:=FGrid.Options - [dgColumnResize];
+
+ if not (pfgColumnMove in FPopUpFormOptions.FOptions) then
+ FGrid.Options:=FGrid.Options - [dgColumnMove];
+
+ if FPopUpFormOptions.ShowTitles then
+ FGrid.Options:=FGrid.Options + [dgTitles]
+ else
+ FGrid.Options:=FGrid.Options - [dgTitles];
+
+ FGrid.AutoSort:=FPopUpFormOptions.AutoSort;
+ FGrid.TitleButtons:=FPopUpFormOptions.TitleButtons;
+ FGrid.TitleStyle:=FPopUpFormOptions.TitleStyle;
+ FGrid.BorderStyle:=FPopUpFormOptions.BorderStyle;
+ FGrid.OnGetCellProps:=FPopUpFormOptions.OnGetCellProps;
+ FGrid.AutoFillColumns:=FPopUpFormOptions.AutoFillColumns;
+ if FPopUpFormOptions.DropDownCount < 1 then
+ FRowCount:=10 + ord(dgTitles in FGrid.Options)
+ else
+ FRowCount:=FPopUpFormOptions.DropDownCount + 2 + ord(dgTitles in FGrid.Options);
+
+ FGrid.Color:=FPopUpFormOptions.Color;
+ FGrid.AlternateColor:=FPopUpFormOptions.AlternateColor;
+end;
+
+destructor TPopUpForm.Destroy;
+begin
+ FGrid.DataSource:=nil;
+ inherited Destroy;
+end;
+
+{ TPopUpFormOptions }
+
+procedure TPopUpFormOptions.SetAutoSort(const AValue: boolean);
+begin
+ if FAutoSort=AValue then exit;
+ FAutoSort:=AValue;
+end;
+
+function TPopUpFormOptions.GetColumns: TPopUpFormColumns;
+begin
+ Result:=FColumns;
+end;
+
+function TPopUpFormOptions.IsAltColorStored: Boolean;
+begin
+ Result := FAlternateColor <> FColor;
+end;
+
+procedure TPopUpFormOptions.SetAutoFillColumns(const AValue: boolean);
+begin
+ if FAutoFillColumns=AValue then exit;
+ FAutoFillColumns:=AValue;
+end;
+
+procedure TPopUpFormOptions.SetColumns(const AValue: TPopUpFormColumns);
+begin
+ FColumns.Assign(AValue);
+end;
+
+procedure TPopUpFormOptions.SetDropDownCount(const AValue: integer);
+begin
+ if FDropDownCount=AValue then exit;
+ FDropDownCount:=AValue;
+end;
+
+procedure TPopUpFormOptions.SetDropDownWidth(const AValue: integer);
+begin
+ if FDropDownWidth=AValue then exit;
+ FDropDownWidth:=AValue;
+end;
+
+procedure TPopUpFormOptions.SetOptions(const AValue: TPopUpGridOptions);
+begin
+ if FOptions=AValue then exit;
+ FOptions:=AValue;
+end;
+
+procedure TPopUpFormOptions.SetShowTitles(const AValue: boolean);
+begin
+ if FShowTitles=AValue then exit;
+ FShowTitles:=AValue;
+end;
+
+procedure TPopUpFormOptions.SetTitleButtons(const AValue: boolean);
+begin
+ if FTitleButtons=AValue then exit;
+ FTitleButtons:=AValue;
+end;
+
+procedure TPopUpFormOptions.SetTitleStyle(const AValue: TTitleStyle);
+begin
+ if FTitleStyle=AValue then exit;
+ FTitleStyle:=AValue;
+end;
+
+function TPopUpFormOptions.GetOwner: TPersistent;
+begin
+ Result:=FOwner;
+end;
+
+constructor TPopUpFormOptions.Create(AOwner: TPersistent);
+begin
+ FOwner:=AOwner;
+ inherited Create;
+ FAutoSort:=false;
+ FDropDownCount:=8;
+ FDropDownWidth:=0;
+ FOptions:=[pfgColLines, pfgRowLines];
+ FShowTitles:=false;
+ FTitleButtons:=false;
+ FTitleStyle:=tsLazarus;
+ FBorderStyle:=bsNone;
+ FColumns:=TPopUpFormColumns.Create(AOwner);
+ FColumns.FPopUpFormOptions:=Self;
+ FColor:={$ifdef UseCLDefault}clDefault{$else}clWindow{$endif};
+ FAlternateColor:=FColor;
+end;
+
+destructor TPopUpFormOptions.Destroy;
+begin
+ FreeAndNil(FColumns);
+ inherited Destroy;
+end;
+
+procedure TPopUpFormOptions.Assign(Source: TPersistent);
+begin
+ if Source is TPopUpFormOptions then
+ begin
+ FAutoSort:=TPopUpFormOptions(Source).FAutoSort;
+ FDropDownCount:=TPopUpFormOptions(Source).FDropDownCount;
+ FDropDownWidth:=TPopUpFormOptions(Source).FDropDownWidth;
+ FOptions:=TPopUpFormOptions(Source).FOptions;
+ FShowTitles:=TPopUpFormOptions(Source).FShowTitles;
+ FTitleButtons:=TPopUpFormOptions(Source).FTitleButtons;
+ FTitleStyle:=TPopUpFormOptions(Source).FTitleStyle;
+ FBorderStyle:=TPopUpFormOptions(Source).FBorderStyle;
+ FColor:=TPopUpFormOptions(Source).FColor;
+ FAlternateColor:=TPopUpFormOptions(Source).FAlternateColor;
+ end
+ else
+ inherited Assign(Source);
+end;
+
+{ TPopUpColumnTitle }
+
+
+procedure TPopUpColumnTitle.SetAlignment(const AValue: TAlignment);
+begin
+ FAlignment:=AValue;
+end;
+
+procedure TPopUpColumnTitle.SetCaption(const AValue: string);
+begin
+ FCaption:=AValue;
+end;
+
+procedure TPopUpColumnTitle.SetColor(const AValue: TColor);
+begin
+ FColor:=AValue;
+end;
+
+procedure TPopUpColumnTitle.SetLayout(const AValue: TTextLayout);
+begin
+ FLayout:=AValue;
+end;
+
+procedure TPopUpColumnTitle.SetOrientation(const AValue: TTextOrientation);
+begin
+ if FOrientation=AValue then exit;
+ FOrientation:=AValue;
+end;
+
+constructor TPopUpColumnTitle.Create;
+begin
+ inherited Create;
+ FColor:=clBtnFace;
+{$IFDEF NEW_STYLE_TITLE_ALIGNMENT_RXDBGRID}
+ Alignment:=taCenter;
+{$ENDIF}
+end;
+
+procedure TPopUpColumnTitle.Assign(Source: TPersistent);
+begin
+ if Source is TPopUpColumnTitle then
+ begin
+ FAlignment:=TPopUpColumnTitle(Source).FAlignment;
+ FCaption:=TPopUpColumnTitle(Source).FCaption;
+ FColor:=TPopUpColumnTitle(Source).FColor;
+ FLayout:=TPopUpColumnTitle(Source).FLayout;
+ FOrientation:=TPopUpColumnTitle(Source).FOrientation;
+ end
+ else
+ inherited Assign(Source);
+end;
+
+{ TPopUpColumn }
+
+procedure TPopUpColumn.SetAlignment(const AValue: TAlignment);
+begin
+ if FAlignment=AValue then exit;
+ FAlignment:=AValue;
+end;
+
+procedure TPopUpColumn.SetColor(const AValue: TColor);
+begin
+ if FColor=AValue then exit;
+ FColor:=AValue;
+end;
+
+procedure TPopUpColumn.SetDisplayFormat(const AValue: string);
+begin
+ if FDisplayFormat=AValue then exit;
+ FDisplayFormat:=AValue;
+end;
+
+procedure TPopUpColumn.SetFieldName(const AValue: string);
+begin
+ if FFieldName=AValue then exit;
+ if (FTitle.Caption = '') or (FTitle.Caption = FFieldName) then
+ FTitle.Caption:=AValue;
+ FFieldName:=AValue;
+end;
+
+procedure TPopUpColumn.SetFont(const AValue: TFont);
+begin
+ if FFont=AValue then exit;
+ FFont:=AValue;
+end;
+
+procedure TPopUpColumn.SetImageList(const AValue: TImageList);
+begin
+ if FImageList=AValue then exit;
+ FImageList:=AValue;
+end;
+
+procedure TPopUpColumn.SetSizePriority(AValue: Integer);
+begin
+ if FSizePriority=AValue then Exit;
+ FSizePriority:=AValue;
+end;
+
+procedure TPopUpColumn.SetTitle(const AValue: TPopUpColumnTitle);
+begin
+ FTitle.Assign(AValue);
+end;
+
+procedure TPopUpColumn.SetValueChecked(const AValue: string);
+begin
+ if FValueChecked=AValue then exit;
+ FValueChecked:=AValue;
+end;
+
+procedure TPopUpColumn.SetValueUnchecked(const AValue: string);
+begin
+ if FValueUnchecked=AValue then exit;
+ FValueUnchecked:=AValue;
+end;
+
+procedure TPopUpColumn.SetWidth(const AValue: Integer);
+begin
+ if FWidth=AValue then exit;
+ FWidth:=AValue;
+end;
+
+function TPopUpColumn.GetDisplayName: string;
+begin
+ if FFieldName<>'' then
+ begin
+ Result:=FFieldName;
+ if FTitle.Caption<>'' then
+ Result:=FTitle.Caption+' -> '+FFieldName;
+ end
+ else
+ Result:=inherited GetDisplayName;
+end;
+
+constructor TPopUpColumn.Create(ACollection: TCollection);
+begin
+ inherited Create(ACollection);
+ FTitle:=TPopUpColumnTitle.Create;
+ FColor:=clWindow;
+ FWidth:=65;
+ FSizePriority:=1;
+end;
+
+destructor TPopUpColumn.Destroy;
+begin
+ FreeAndNil(FTitle);
+ inherited Destroy;
+end;
+
+{ TPopUpFormColumns }
+
+function TPopUpFormColumns.GetPopUpColumn(Index: Integer): TPopUpColumn;
+begin
+ Result := TPopUpColumn( inherited Items[Index] );
+end;
+
+procedure TPopUpFormColumns.SetPopUpColumn(Index: Integer;
+ const AValue: TPopUpColumn);
+begin
+ Items[Index].Assign( AValue );
+end;
+
+constructor TPopUpFormColumns.Create(AOwner: TPersistent);
+begin
+ inherited Create(AOwner, TPopUpColumn);
+end;
+
+procedure TPopUpFormColumns.Assign(Source: TPersistent);
+var
+ i: integer;
+begin
+ if Source is TPopUpFormColumns then
+ begin
+ Clear;
+ for i := 0 to TPopUpFormColumns(Source).Count-1 do
+ begin
+ with Add do
+ Assign(TPopUpFormColumns(Source)[i]);
+ end;
+ end else
+ inherited Assign(Source);
+end;
+
+{ TPopUpGrid }
+
+procedure TPopUpGrid.ClearFind;
+begin
+ TPopUpForm(Owner).WControl.Caption:=' ';
+ TPopUpForm(Owner).WControl.Repaint;
+ FFindLine:='';
+ if DatalinkActive then
+ DataSource.DataSet.First;
+end;
+
+procedure TPopUpGrid.FindNextChar(var UTF8Key: TUTF8Char);
+var
+ F:TField;
+ V:boolean;
+begin
+ if DatalinkActive then
+ begin
+ F:=Columns[FLookupDisplayIndex].Field;
+ if F.DataType in StringTypes then
+ V:=true
+ else
+ begin
+ if Length(UTF8Key) = 1 then
+ V:=F.IsValidChar(UTF8Key[1])
+ else
+ V:=false;
+ end;
+ if V then
+ begin
+ if DataSetLocateThrough(DataSource.DataSet, FLookupDisplayField, FFindLine + UTF8Key, [loCaseInsensitive, loPartialKey]) then
+ begin
+// TPopUpForm(Owner).WControl.Caption:=FFindLine;
+// TPopUpForm(Owner).WControl.Repaint;
+ end;
+
+ FFindLine:=FFindLine + UTF8Key;
+ TPopUpForm(Owner).WControl.Caption:=FFindLine;
+ TPopUpForm(Owner).WControl.Repaint;
+ end;
+ UTF8Key:='';
+ end;
+end;
+
+procedure TPopUpGrid.FindPriorChar;
+var
+ F:string;
+begin
+ if (FFindLine = '') or (not DatalinkActive) then exit;
+ F:=FFindLine;
+ UTF8Delete(FFindLine, UTF8Length(FFindLine), 1);
+ if (FFindLine<>'') then
+ begin
+ if DataSetLocateThrough(DataSource.DataSet, FLookupDisplayField, FFindLine, [loCaseInsensitive, loPartialKey]) then
+ begin
+// TPopUpForm(Owner).WControl.Caption:=FFindLine;
+// TPopUpForm(Owner).WControl.Repaint;
+ end;
+// else
+// FFindLine:=F;
+
+ //FFindLine:=FFindLine + UTF8Key;
+ TPopUpForm(Owner).WControl.Caption:=FFindLine;
+ TPopUpForm(Owner).WControl.Repaint;
+
+ end
+ else
+ begin
+ TPopUpForm(Owner).WControl.Caption:=' ';
+ TPopUpForm(Owner).WControl.Repaint;
+ DataSource.DataSet.First;
+ end;
+end;
+
+procedure TPopUpGrid.SetLookupDisplayIndex(const AValue: integer);
+begin
+ FLookupDisplayIndex:=AValue;
+ FLookupDisplayField:=Columns[FLookupDisplayIndex].FieldName;
+end;
+
+procedure TPopUpGrid.SetDBHandlers(Value: boolean);
+begin
+ //
+end;
+
+procedure TPopUpGrid.UTF8KeyPress(var UTF8Key: TUTF8Char);
+begin
+ inherited UTF8KeyPress(UTF8Key);
+ if UTF8Key>=#32 then
+ FindNextChar(UTF8Key)
+ else
+ if UTF8Key = #8 then
+ ClearFind
+ else
+ exit;
+ UTF8Key:='';
+end;
+
+procedure TPopUpGrid.KeyDown(var Key: Word; Shift: TShiftState);
+begin
+ if Key = VK_DELETE then
+ begin
+ ClearFind;
+ Key:=0;
+ end
+ else
+ if Key = VK_BACK then
+ begin
+ FindPriorChar;
+ Key:=0;
+ end
+ else
+ begin
+ if Key in [VK_UP,VK_DOWN,VK_PRIOR,VK_NEXT] then
+ begin
+ FFindLine:='';
+ TPopUpForm(Owner).WControl.Caption:='';
+ TPopUpForm(Owner).WControl.Repaint;
+ end;
+ inherited KeyDown(Key, Shift);
+ end;
+end;
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/rxsortby.lfm b/components/rx/version/v2.2_laz_1.2/rxsortby.lfm
new file mode 100644
index 000000000..b670be3b7
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxsortby.lfm
@@ -0,0 +1,233 @@
+object rxSortByForm: TrxSortByForm
+ Left = 450
+ Height = 398
+ Top = 243
+ Width = 684
+ ActiveControl = AddBtn
+ Caption = 'Sort by fields'
+ ClientHeight = 398
+ ClientWidth = 684
+ OnCreate = FormCreate
+ Position = poScreenCenter
+ LCLVersion = '1.1'
+ object Label1: TLabel
+ AnchorSideLeft.Control = AddBtn
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = Owner
+ Left = 417
+ Height = 15
+ Top = 6
+ Width = 105
+ BorderSpacing.Around = 6
+ Caption = '&Fields for sorting:'
+ FocusControl = ListBox1
+ ParentColor = False
+ end
+ object Label2: TLabel
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = Owner
+ Left = 6
+ Height = 15
+ Top = 6
+ Width = 55
+ BorderSpacing.Around = 6
+ Caption = '&All fields:'
+ FocusControl = ListBox2
+ ParentColor = False
+ end
+ object ListBox2: TListBox
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = Label2
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = AddBtn
+ AnchorSideBottom.Control = CheckBox1
+ Left = 6
+ Height = 289
+ Top = 27
+ Width = 262
+ Anchors = [akTop, akLeft, akRight, akBottom]
+ BorderSpacing.Around = 6
+ ItemHeight = 0
+ OnDblClick = ListBox2DblClick
+ ScrollWidth = 260
+ TabOrder = 0
+ TopIndex = -1
+ end
+ object RemoveBtn: TBitBtn
+ AnchorSideLeft.Control = AddBtn
+ AnchorSideTop.Control = AddBtn
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = AddBtn
+ AnchorSideRight.Side = asrBottom
+ Left = 274
+ Height = 35
+ Top = 68
+ Width = 137
+ Anchors = [akTop, akLeft, akRight]
+ AutoSize = True
+ BorderSpacing.Top = 6
+ Caption = '&Remove'
+ Glyph.Data = {
+ 8A010000424D8A01000000000000760000002800000018000000170000000100
+ 0400000000001401000000000000000000001000000010000000000000000000
+ 80000080000000808000800000008000800080800000C0C0C000808080000000
+ C80000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00777777777777
+ 7777777777777777777777777877777777777777777777770077777777777777
+ 7777777090777777777777777777770990777777777777777777709990777777
+ 7777777777770999907777777777777777709999900000008777777777099999
+ 999999990777777770999999999999990777777709999999999999990777777F
+ 999999999999999907777777F999999999999999077777777F99999999999999
+ 0777777777F999999999999907777777777F999998FFFFFF877777777777F999
+ 987777777777777777777F999877777777777777777777F99877777777777777
+ 7777777F987777777777777777777777F877777777777777777777777F777777
+ 7777777777777777777777777777
+ }
+ OnClick = RemoveBtnClick
+ TabOrder = 2
+ end
+ object UpBtn: TBitBtn
+ AnchorSideLeft.Control = AddBtn
+ AnchorSideTop.Control = RemoveBtn
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = AddBtn
+ AnchorSideRight.Side = asrBottom
+ Left = 274
+ Height = 36
+ Top = 109
+ Width = 137
+ Anchors = [akTop, akLeft, akRight]
+ AutoSize = True
+ BorderSpacing.Top = 6
+ Caption = 'M&ove up'
+ Glyph.Data = {
+ 96010000424D9601000000000000760000002800000017000000180000000100
+ 0400000000002001000000000000000000001000000010000000000000000000
+ 80000080000000808000800000008000800080800000C0C0C000808080000000
+ C80000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00777777777777
+ 7777777777707777777777777777777777707777777777777777777777707777
+ 77780000000877777770777777709999999F77777770777777709999999F7777
+ 7770777777709999999F77777770777777709999999F77777770777777709999
+ 999F77777770777777709999999F77777770780000009999999888888F707709
+ 9999999999999999F7707770999999999999999F7770777709999999999999F7
+ 777077777099999999999F7777707777770999999999F7777770777777709999
+ 999F7777777077777777099999F7777777707777777770999F77777777707777
+ 77777709F7777777777077777777777F77777777777077777777777777777777
+ 7770777777777777777777777770777777777777777777777770
+ }
+ OnClick = UpBtnClick
+ TabOrder = 3
+ end
+ object DownBtn: TBitBtn
+ AnchorSideLeft.Control = AddBtn
+ AnchorSideTop.Control = UpBtn
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = AddBtn
+ AnchorSideRight.Side = asrBottom
+ Left = 274
+ Height = 36
+ Top = 151
+ Width = 137
+ Anchors = [akTop, akLeft, akRight]
+ AutoSize = True
+ BorderSpacing.Top = 6
+ Caption = '&Move down'
+ Glyph.Data = {
+ 96010000424D9601000000000000760000002800000017000000180000000100
+ 0400000000002001000000000000000000001000000010000000000000000000
+ 80000080000000808000800000008000800080800000C0C0C000808080000000
+ C80000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00777777777777
+ 7777777777707777777777777777777777707777777777777777777777707777
+ 7777777F777777777770777777777709F777777777707777777770999F777777
+ 777077777777099999F777777770777777709999999F77777770777777099999
+ 9999F777777077777099999999999F777770777709999999999999F777707770
+ 999999999999999F777077099999999999999999F77078000000999999988888
+ 8F70777777709999999F77777770777777709999999F77777770777777709999
+ 999F77777770777777709999999F77777770777777709999999F777777707777
+ 77709999999F7777777077777778000000087777777077777777777777777777
+ 7770777777777777777777777770777777777777777777777770
+ }
+ OnClick = DownBtnClick
+ TabOrder = 4
+ end
+ object ListBox1: TListBox
+ AnchorSideLeft.Control = AddBtn
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = Label1
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ AnchorSideBottom.Control = CheckBox1
+ Left = 417
+ Height = 289
+ Top = 27
+ Width = 261
+ Anchors = [akTop, akLeft, akRight, akBottom]
+ BorderSpacing.Around = 6
+ ItemHeight = 0
+ OnDblClick = SpeedButton1Click
+ OnDrawItem = ListBox1DrawItem
+ ScrollWidth = 259
+ Style = lbOwnerDrawFixed
+ TabOrder = 5
+ TopIndex = -1
+ end
+ object AddBtn: TBitBtn
+ AnchorSideLeft.Control = Owner
+ AnchorSideLeft.Side = asrCenter
+ AnchorSideTop.Control = ListBox1
+ Left = 274
+ Height = 35
+ Top = 27
+ Width = 137
+ AutoSize = True
+ Caption = '&Add field to sort'
+ Glyph.Data = {
+ 8A010000424D8A01000000000000760000002800000018000000170000000100
+ 0400000000001401000000000000000000001000000010000000000000000000
+ 80000080000000808000800000008000800080800000C0C0C000808080000000
+ C80000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00777777777777
+ 7777777777777777777777877777777777777777777777007777777777777777
+ 7777770907777777777777777777770990777777777777777777770999077777
+ 7777777777777709999077777777777800000009999907777777777099999999
+ 9999907777777770999999999999990777777770999999999999999077777770
+ 9999999999999999F7777770999999999999999F7777777099999999999999F7
+ 777777709999999999999F7777777778FFFFFF899999F7777777777777777789
+ 999F7777777777777777778999F7777777777777777777899F77777777777777
+ 77777789F7777777777777777777778F7777777777777777777777F777777777
+ 7777777777777777777777777777
+ }
+ Layout = blGlyphRight
+ OnClick = AddBtnClick
+ TabOrder = 1
+ end
+ object ButtonPanel1: TButtonPanel
+ Left = 6
+ Height = 42
+ Top = 350
+ Width = 672
+ OKButton.Name = 'OKButton'
+ OKButton.DefaultCaption = True
+ HelpButton.Name = 'HelpButton'
+ HelpButton.DefaultCaption = True
+ CloseButton.Name = 'CloseButton'
+ CloseButton.DefaultCaption = True
+ CancelButton.Name = 'CancelButton'
+ CancelButton.DefaultCaption = True
+ TabOrder = 6
+ ShowButtons = [pbOK, pbCancel, pbHelp]
+ end
+ object CheckBox1: TCheckBox
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Side = asrBottom
+ AnchorSideBottom.Control = ButtonPanel1
+ Left = 6
+ Height = 22
+ Top = 322
+ Width = 151
+ Anchors = [akLeft, akBottom]
+ BorderSpacing.Around = 6
+ Caption = 'Case insensitive sort'
+ Enabled = False
+ TabOrder = 7
+ end
+end
diff --git a/components/rx/version/v2.2_laz_1.2/rxsortby.lrt b/components/rx/version/v2.2_laz_1.2/rxsortby.lrt
new file mode 100644
index 000000000..2f77b671d
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxsortby.lrt
@@ -0,0 +1,10 @@
+TRXSORTBYFORM.CAPTION=rxSortByForm
+TRXSORTBYFORM.LABEL1.CAPTION=&Orden de Ordenamiento :
+TRXSORTBYFORM.LABEL2.CAPTION=&Campos Disponibles :
+TRXSORTBYFORM.LABEL4.CAPTION=Seleccionar Dirección de Ordenamiento :
+TRXSORTBYFORM.REMOVEBTN.CAPTION=&Eliminar
+TRXSORTBYFORM.UPBTN.CAPTION=A&rriba
+TRXSORTBYFORM.DOWNBTN.CAPTION=A&bajo
+TRXSORTBYFORM.OKBUTTON.CAPTION=Aceptar
+TRXSORTBYFORM.CANCELBUTTON.CAPTION=Cancelar
+TRXSORTBYFORM.ADDBTN.CAPTION=&Adicionar
diff --git a/components/rx/version/v2.2_laz_1.2/rxsortby.pas b/components/rx/version/v2.2_laz_1.2/rxsortby.pas
new file mode 100644
index 000000000..46f3846c2
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxsortby.pas
@@ -0,0 +1,272 @@
+{ RXDBGrid unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit rxsortby;
+
+{$I rx.inc}
+
+interface
+
+uses
+ Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
+ StdCtrls, Buttons, ButtonPanel, rxdbgrid, db, types;
+
+type
+
+ { TrxSortByForm }
+
+ TrxSortByForm = class(TForm)
+ AddBtn: TBitBtn;
+ ButtonPanel1: TButtonPanel;
+ CheckBox1: TCheckBox;
+ DownBtn: TBitBtn;
+ Label1: TLabel;
+ Label2: TLabel;
+ ListBox1: TListBox;
+ ListBox2: TListBox;
+ RemoveBtn: TBitBtn;
+ UpBtn: TBitBtn;
+ procedure AddBtnClick(Sender: TObject);
+ procedure DownBtnClick(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ procedure ListBox1DblClick(Sender: TObject);
+ procedure ListBox1DrawItem(Control: TWinControl; Index: Integer;
+ ARect: TRect; State: TOwnerDrawState);
+ procedure ListBox2DblClick(Sender: TObject);
+ procedure RemoveBtnClick(Sender: TObject);
+ procedure SpeedButton1Click(Sender: TObject);
+ procedure UpBtnClick(Sender: TObject);
+ private
+ FDBGrid:TRxDBGrid;
+ public
+ { public declarations }
+ function Execute(ADBGrid:TRxDBGrid; SortNames:TStringList):Boolean;
+ end;
+
+var
+ rxSortByForm: TrxSortByForm;
+
+implementation
+uses rxdconst, DBGrids;
+
+{$R *.lfm}
+
+{ TrxSortByForm }
+
+procedure TrxSortByForm.DownBtnClick(Sender: TObject);
+var
+ TmpField:String;
+ C1:TObject;
+ Poz: Integer;
+begin
+ if ListBox1.ItemIndex < ListBox1.Items.Count-1 Then
+ begin
+ Poz:=ListBox1.ItemIndex;
+
+ TmpField:=ListBox1.Items[Poz+1];
+ C1:=ListBox1.Items.Objects[Poz+1];
+
+ ListBox1.Items[Poz+1]:=ListBox1.Items[Poz];
+ ListBox1.Items.Objects[Poz+1]:=ListBox1.Items.Objects[Poz];
+
+ ListBox1.Items[Poz]:=TmpField;
+ ListBox1.Items.Objects[Poz]:=C1;
+ ListBox1.ItemIndex:=Poz+1;
+ end;
+end;
+
+procedure TrxSortByForm.FormCreate(Sender: TObject);
+begin
+{ ComboBox1.Clear;
+ ComboBox1.Items.Add(sRxAscendign);
+ ComboBox1.Items.Add(sRxDescending);}
+ Caption:=sRxSortByFormCaption;
+ Label2.Caption:=sRxSortByFormAllFields;
+ Label1.Caption:=sRxSortByFormSortFields;
+// Label4.Caption:=sRxSortByFormSortOrder;
+ AddBtn.Caption:=sRxSortByFormAddField;
+ RemoveBtn.Caption:=sRxSortByFormRemoveField;
+ UpBtn.Caption:=sRxSortByFormMoveUpField;
+ DownBtn.Caption:=sRxSortByFormMoveDnField;
+ CheckBox1.Caption:=sRxSortByFormCaseInsens;
+end;
+
+procedure TrxSortByForm.ListBox1DblClick(Sender: TObject);
+begin
+ RemoveBtn.Click;
+end;
+
+procedure TrxSortByForm.ListBox1DrawItem(Control: TWinControl; Index: Integer;
+ ARect: TRect; State: TOwnerDrawState);
+var
+ X, Y:integer;
+ P:TRxColumn;
+ S1, S2:string;
+ Cnv:TCanvas;
+begin
+ Cnv:=ListBox1.Canvas;
+ Cnv.FillRect(ARect); { clear the rectangle }
+ P:=TRxColumn(ListBox1.Items.Objects[Index]);
+ S1:=ListBox1.Items[Index];
+ S2:=Copy(S1, 1, 1);
+ Delete(S1, 1, 1);
+
+ X := aRect.Left + 2;
+ Y := Trunc((aRect.Top + aRect.Bottom - UpBtn.Glyph.Height) / 2);
+
+ if S2 = '1' then
+ Cnv.Draw(X, Y, UpBtn.Glyph)
+ else
+ Cnv.Draw(X, Y, DownBtn.Glyph);
+
+ Cnv.TextOut(ARect.Left + UpBtn.Glyph.Width + 6, (ARect.Top + ARect.Bottom - Cnv.TextHeight('Wg')) div 2, S1);
+end;
+
+procedure TrxSortByForm.ListBox2DblClick(Sender: TObject);
+begin
+ AddBtn.Click;
+end;
+
+
+procedure TrxSortByForm.AddBtnClick(Sender: TObject);
+var
+ S:string;
+begin
+ if ListBox2.ItemIndex <> -1 Then
+ begin
+ S:='1'+ListBox2.Items[ListBox2.ItemIndex];
+ ListBox1.Items.Objects[ListBox1.Items.Add(S)]:=ListBox2.Items.Objects[ListBox2.ItemIndex];
+ ListBox2.Items.Delete(ListBox2.ItemIndex);
+ ListBox1.ItemIndex:=ListBox1.Items.Count-1;
+ end;
+end;
+
+procedure TrxSortByForm.RemoveBtnClick(Sender: TObject);
+var
+ S:string;
+begin
+ if ListBox1.ItemIndex <> -1 Then
+ begin
+ S:=TRxColumn(ListBox1.Items.Objects[ListBox1.ItemIndex]).Title.Caption;
+ ListBox2.Items.Objects[ListBox2.Items.Add(S)]:=ListBox1.Items.Objects[ListBox1.ItemIndex];
+ ListBox1.Items.Delete(ListBox1.ItemIndex);
+ end;
+end;
+
+procedure TrxSortByForm.SpeedButton1Click(Sender: TObject);
+var
+ S:string;
+begin
+ if (ListBox1.ItemIndex <> -1) then
+ begin
+ S:=ListBox1.Items[ListBox1.ItemIndex];
+ if S[1] = '1' then
+ S[1] := '0'
+ else
+ S[1] := '1';
+ ListBox1.Items[ListBox1.ItemIndex]:=S;
+ end;
+end;
+
+procedure TrxSortByForm.UpBtnClick(Sender: TObject);
+var
+ TmpField:String;
+ Poz : Integer;
+ C1:TObject;
+begin
+ if ListBox1.ItemIndex > 0 Then
+ begin
+ Poz:=ListBox1.ItemIndex;
+ TmpField:=ListBox1.Items[Poz-1];
+ C1:=ListBox1.Items.Objects[Poz-1];
+
+ ListBox1.Items[Poz-1]:=ListBox1.Items[Poz];
+ ListBox1.Items.Objects[Poz-1]:=ListBox1.Items.Objects[Poz];
+
+ ListBox1.Items[Poz]:=TmpField;
+ ListBox1.Items.Objects[Poz]:=C1;
+
+ ListBox1.ItemIndex:=Poz-1;
+ end;
+end;
+
+
+function TrxSortByForm.Execute(ADBGrid: TRxDBGrid; SortNames: TStringList
+ ): Boolean;
+var
+ i, j : Integer;
+ S : String;
+ C:TRxColumn;
+begin
+ Result:=False;
+ if not (Assigned(ADBGrid.DataSource) and Assigned(ADBGrid.DataSource.DataSet) and ADBGrid.DataSource.DataSet.Active) then exit;
+
+ FDBGrid:=ADBGrid;
+
+ ListBox1.Clear;
+ ListBox2.Clear;
+
+
+ for i:=0 to ADBGrid.Columns.Count-1 do
+ begin
+ C:=TRxColumn(ADBGrid.Columns[i]);
+ if C.SortOrder = smNone then
+ ListBox2.Items.Objects[ListBox2.Items.Add(C.Title.Caption)]:=C;
+ end;
+
+ for i:=0 to ADBGrid.SortColumns.Count-1 do
+ begin
+ C:=ADBGrid.SortColumns[i];
+
+ if C.SortOrder = smUp then
+ S:='1'+C.Title.Caption
+ else
+ S:='0'+C.Title.Caption;
+
+ ListBox1.Items.Objects[ListBox1.Items.Add(S)]:=C
+ end;
+
+ if ShowModal = mrOK Then
+ begin
+ SortNames.Clear;
+ for i:=0 to ListBox1.Items.Count-1 do
+ begin
+ C:=ListBox1.Items.Objects[i] as TRxColumn;
+ SortNames.Add(Copy(ListBox1.Items[i], 1, 1) + C.FieldName);
+ end;
+
+ Result:=True;
+ end;
+end;
+
+end.
+
+
diff --git a/components/rx/version/v2.2_laz_1.2/rxsortfbdataset.pas b/components/rx/version/v2.2_laz_1.2/rxsortfbdataset.pas
new file mode 100644
index 000000000..24f73c65f
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxsortfbdataset.pas
@@ -0,0 +1,32 @@
+unit RxSortFBDataSet;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils;
+
+type
+ TRxSortFBDataSet = class(TComponent)
+ private
+ { Private declarations }
+ protected
+ { Protected declarations }
+ public
+ { Public declarations }
+ published
+ { Published declarations }
+ end;
+
+procedure Register;
+
+implementation
+uses exsortfb;
+
+procedure Register;
+begin
+ RegisterComponents('RX DBAware',[TRxSortFBDataSet]);
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxsortmemds.pas b/components/rx/version/v2.2_laz_1.2/rxsortmemds.pas
new file mode 100644
index 000000000..82210b284
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxsortmemds.pas
@@ -0,0 +1,137 @@
+{ This module from FPC port of RX components library
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit rxsortmemds;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, DB, RxDBGrid;
+
+type
+
+ { TRxMemoryDataSortEngine }
+
+ TRxMemoryDataSortEngine = class(TRxDBGridSortEngine)
+ protected
+ procedure UpdateFooterRows(ADataSet:TDataSet; AGrid:TRxDBGrid);override;
+ function EnabledFooterRowsCalc:boolean;override;
+ public
+ procedure Sort(FieldName: string; ADataSet:TDataSet; Asc:boolean; SortOptions:TRxSortEngineOptions);override;
+ procedure SortList(ListField:string; ADataSet:TDataSet; Asc: array of boolean; SortOptions: TRxSortEngineOptions);override;
+ end;
+
+implementation
+uses rxmemds;
+
+type
+ THackRxMemoryData = class(TRxMemoryData);
+ THackRxColumnFooter = class(TRxColumnFooter);
+ THackDataLink = class(TDataLink);
+ THackDataSet = class(TDataSet);
+ THackRxDBGrid = class(TRxDBGrid);
+
+procedure TRxMemoryDataSortEngine.UpdateFooterRows(ADataSet: TDataSet;
+ AGrid: TRxDBGrid);
+var
+ i:integer;
+ Col:TRxColumn;
+
+ DHL:THackDataLink;
+ DHS:THackDataSet;
+ SaveState:TDataSetState;
+ SavePos:integer;
+ SaveActiveRecord:integer;
+begin
+ if not Assigned(ADataSet) then exit;
+
+ DHL:=THackDataLink(THackRxDBGrid(AGrid).Datalink);
+ DHS:=THackDataSet(ADataSet);
+ SaveState:=DHS.SetTempState(dsBrowse);
+
+ SaveActiveRecord:=DHL.ActiveRecord;
+ DHL.ActiveRecord:=0;
+ SavePos:=ADataSet.RecNo;
+
+
+ ADataSet.First;
+ while not ADataSet.EOF do
+ begin
+
+ for i:=0 to AGrid.Columns.Count-1 do
+ begin
+ Col:=TRxColumn(AGrid.Columns[i]);
+ if THackRxColumnFooter(Col.Footer).ValueType in [fvtSum, fvtAvg, fvtMax, fvtMin] then
+// THackRxColumnFooter(Col.Footer).UpdateTestValueFromVar( ADataSet.FieldByName(Col.Footer.FieldName).Value);
+ end;
+
+ ADataSet.Next;
+ end;
+
+ DHS.RecNo := DHL.RecordCount + SavePos + 1;
+
+ while not ADataSet.BOF do
+ begin
+ if SavePos = ADataSet.RecNo then
+ break;
+ ADataSet.Prior;
+ end;
+
+ DHL.ActiveRecord:=SaveActiveRecord;
+ DHS.RestoreState(SaveState);
+end;
+
+function TRxMemoryDataSortEngine.EnabledFooterRowsCalc: boolean;
+begin
+ Result:=true;
+end;
+
+procedure TRxMemoryDataSortEngine.Sort(FieldName: string; ADataSet: TDataSet;
+ Asc: boolean; SortOptions: TRxSortEngineOptions);
+begin
+ if Assigned(ADataSet) then
+ (ADataSet as TRxMemoryData).SortOnFields(FieldName, seoCaseInsensitiveSort in SortOptions, not Asc);
+end;
+
+procedure TRxMemoryDataSortEngine.SortList(ListField: string;
+ ADataSet: TDataSet; Asc: array of boolean; SortOptions: TRxSortEngineOptions);
+begin
+ if Assigned(ADataSet) then
+// (ADataSet as TRxMemoryData).SortOnFieldsEx(ListField, seoCaseInsensitiveSort in SortOptions, Asc);
+ (ADataSet as TRxMemoryData).SortOnFields(ListField, seoCaseInsensitiveSort in SortOptions, Asc[0]);
+end;
+
+initialization
+ RegisterRxDBGridSortEngine(TRxMemoryDataSortEngine, 'TRxMemoryData');
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/rxsortsqldb.pas b/components/rx/version/v2.2_laz_1.2/rxsortsqldb.pas
new file mode 100644
index 000000000..bee0b6b17
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxsortsqldb.pas
@@ -0,0 +1,32 @@
+unit RxSortSqlDB;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs;
+
+type
+ TRxSortSqlDB = class(TComponent)
+ private
+ { Private declarations }
+ protected
+ { Protected declarations }
+ public
+ { Public declarations }
+ published
+ { Published declarations }
+ end;
+
+procedure Register;
+
+implementation
+uses exsortsql;
+
+procedure Register;
+begin
+ RegisterComponents('RX DBAware',[TRxSortSqlDB]);
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxsortzeos.pas b/components/rx/version/v2.2_laz_1.2/rxsortzeos.pas
new file mode 100644
index 000000000..f34038ee9
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxsortzeos.pas
@@ -0,0 +1,32 @@
+unit RxSortZeos;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils;
+
+type
+ TRxSortZeos = class(TComponent)
+ private
+ { Private declarations }
+ protected
+ { Protected declarations }
+ public
+ { Public declarations }
+ published
+ { Published declarations }
+ end;
+
+procedure Register;
+
+implementation
+uses exsortzeos;
+
+procedure Register;
+begin
+ RegisterComponents('RX DBAware',[TRxSortZeos]);
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxspin.lrs b/components/rx/version/v2.2_laz_1.2/rxspin.lrs
new file mode 100644
index 000000000..16b19f766
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxspin.lrs
@@ -0,0 +1,10 @@
+LazarusResources.Add('rxspindown','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#6#0#0#0#6#8#6#0#0#0#224#204#239'H'
+ +#0#0#0#30'IDATx'#218'cd@'#128#255'P'#154#17'N'#144','#241#159#1#11'`DS'#13#23
+ +#199'i'#20#0#211';'#6#6#176#30'g'#27#0#0#0#0'IEND'#174'B`'#130
+]);
+LazarusResources.Add('rxspinup','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#6#0#0#0#6#8#6#0#0#0#224#204#239'H'
+ +#0#0#0' IDATx'#218'cd@'#128#255'P'#154#17'N '#9#194#0'##'#22'A'#6'd'#29'8'
+ +#141'"^'#2#0#211'"'#6#6'Q'#1#226#220#0#0#0#0'IEND'#174'B`'#130
+]);
diff --git a/components/rx/version/v2.2_laz_1.2/rxspin.pas b/components/rx/version/v2.2_laz_1.2/rxspin.pas
new file mode 100644
index 000000000..6974a48f6
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxspin.pas
@@ -0,0 +1,978 @@
+{ rxspin unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit rxspin;
+
+interface
+
+{$I rx.inc}
+
+uses ComCtrls, LCLIntf, LCLType, Controls, ExtCtrls, Classes,
+ Graphics, LMessages, Forms, StdCtrls, Menus, SysUtils, Messages;
+
+type
+
+{ TRxSpinButton }
+
+ TSpinButtonState = (sbNotDown, sbTopDown, sbBottomDown);
+
+ TRxSpinButton = class(TGraphicControl)
+ private
+ FDown: TSpinButtonState;
+ FUpBitmap: TBitmap;
+ FDownBitmap: TBitmap;
+ FDragging: Boolean;
+ FInvalidate: Boolean;
+ FTopDownBtn: TBitmap;
+ FBottomDownBtn: TBitmap;
+ FRepeatTimer: TTimer;
+ FNotDownBtn: TBitmap;
+ FLastDown: TSpinButtonState;
+ FFocusControl: TWinControl;
+ FOnTopClick: TNotifyEvent;
+ FOnBottomClick: TNotifyEvent;
+ procedure TopClick;
+ procedure BottomClick;
+ procedure GlyphChanged(Sender: TObject);
+ function GetUpGlyph: TBitmap;
+ function GetDownGlyph: TBitmap;
+ procedure SetUpGlyph(Value: TBitmap);
+ procedure SetDownGlyph(Value: TBitmap);
+ procedure SetDown(Value: TSpinButtonState);
+ procedure SetFocusControl(Value: TWinControl);
+ procedure DrawAllBitmap;
+ procedure DrawBitmap(ABitmap: TBitmap; ADownState: TSpinButtonState);
+ procedure TimerExpired(Sender: TObject);
+ procedure CMEnabledChanged(var Message: TLMessage); message CM_ENABLEDCHANGED;
+ protected
+ procedure Paint; override;
+ procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
+ X, Y: Integer); override;
+ procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
+ procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
+ X, Y: Integer); override;
+ procedure Notification(AComponent: TComponent;
+ Operation: TOperation); override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ property Down: TSpinButtonState read FDown write SetDown default sbNotDown;
+ published
+ property DragCursor;
+ property DragMode;
+ property Enabled;
+ property Visible;
+ property DownGlyph: TBitmap read GetDownGlyph write SetDownGlyph;
+ property UpGlyph: TBitmap read GetUpGlyph write SetUpGlyph;
+ property FocusControl: TWinControl read FFocusControl write SetFocusControl;
+ property ShowHint;
+ property ParentShowHint;
+{$IFDEF RX_D4}
+ property Anchors;
+ property Constraints;
+ property DragKind;
+{$ENDIF}
+ property OnBottomClick: TNotifyEvent read FOnBottomClick write FOnBottomClick;
+ property OnTopClick: TNotifyEvent read FOnTopClick write FOnTopClick;
+ property OnDragDrop;
+ property OnDragOver;
+ property OnEndDrag;
+{$IFDEF RX_D4}
+ property OnEndDock;
+ property OnStartDock;
+{$ENDIF}
+ end;
+
+{ TRxSpinEdit }
+
+ TValueType = (vtInteger, vtFloat, vtHex);
+
+ TRxSpinEdit = class(TCustomEdit)
+ private
+ FAlignment: TAlignment;
+ FMinValue: Extended;
+ FMaxValue: Extended;
+ FIncrement: Extended;
+ FDecimal: Byte;
+ FChanging: Boolean;
+ FEditorEnabled: Boolean;
+ FValueType: TValueType;
+ FButton: TRxSpinButton;
+ FBtnWindow: TWinControl;
+ FArrowKeys: Boolean;
+ FOnTopClick: TNotifyEvent;
+ FOnBottomClick: TNotifyEvent;
+ function GetMinHeight: Integer;
+ procedure GetTextHeight(var SysHeight, aHeight: Integer);
+ function GetValue: Extended;
+ function CheckValue(NewValue: Extended): Extended;
+ function GetAsInteger: Longint;
+ function IsIncrementStored: Boolean;
+ function IsMaxStored: Boolean;
+ function IsMinStored: Boolean;
+ function IsValueStored: Boolean;
+ procedure SetArrowKeys(Value: Boolean);
+ procedure SetAsInteger(NewValue: Longint);
+ procedure SetValue(NewValue: Extended);
+ procedure SetValueType(NewType: TValueType);
+ procedure SetDecimal(NewValue: Byte);
+ function GetButtonWidth: Integer;
+ procedure RecreateButton;
+ procedure ResizeButton;
+ procedure SetAlignment(Value: TAlignment);
+ procedure LMSize(var Message: TLMSize); message LM_SIZE;
+ procedure CMEnter(var Message: TLMessage); message CM_ENTER;
+ procedure CMExit(var Message: TLMExit); message CM_EXIT;
+ procedure WMPaste(var Message: TLMessage); message LM_PASTE;
+ procedure WMCut(var Message: TLMessage); message LM_CUT;
+// procedure CMCtl3DChanged(var Message: TLMessage); message CM_CTL3DCHANGED;
+ procedure CMEnabledChanged(var Message: TLMessage); message CM_ENABLEDCHANGED;
+ procedure CMFontChanged(var Message: TLMessage); message CM_FONTCHANGED;
+ procedure CheckButtonVisible;
+ procedure WMSetFocus(var Message: TLMSetFocus); message LM_SETFOCUS;
+ protected
+ procedure Change; override;
+ function IsValidChar(Key: Char): Boolean; virtual;
+ procedure UpClick(Sender: TObject); virtual;
+ procedure DownClick(Sender: TObject); virtual;
+ procedure KeyDown(var Key: Word; Shift: TShiftState); override;
+ procedure KeyPress(var Key: Char); override;
+ procedure CreateParams(var Params: TCreateParams); override;
+ procedure CreateWnd; override;
+ // Added from TEditButton
+ procedure SetParent(AParent: TWinControl); override;
+ procedure Notification(AComponent: TComponent; Operation: TOperation); override;
+ procedure Loaded; override;
+ procedure CMVisibleChanged(var Msg: TLMessage); message CM_VISIBLECHANGED;
+ //
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ property AsInteger: Longint read GetAsInteger write SetAsInteger default 0;
+ property Text;
+ published
+ property Alignment: TAlignment read FAlignment write SetAlignment
+ default taLeftJustify;
+ property ArrowKeys: Boolean read FArrowKeys write SetArrowKeys default True;
+ property Decimal: Byte read FDecimal write SetDecimal default 2;
+ property EditorEnabled: Boolean read FEditorEnabled write FEditorEnabled default True;
+ property Increment: Extended read FIncrement write FIncrement stored IsIncrementStored;
+ property MaxValue: Extended read FMaxValue write FMaxValue stored IsMaxStored;
+ property MinValue: Extended read FMinValue write FMinValue stored IsMinStored;
+ property ValueType: TValueType read FValueType write SetValueType default vtInteger;
+ property Value: Extended read GetValue write SetValue stored IsValueStored;
+ property AutoSelect;
+ property AutoSize;
+ property BorderStyle;
+ property Color;
+// property Ctl3D;
+ property DragCursor;
+ property DragMode;
+ property Enabled;
+ property Font;
+ property Anchors;
+ property BiDiMode;
+ property Constraints;
+ property DragKind;
+ property ParentBiDiMode;
+ property MaxLength;
+ property ParentColor;
+// property ParentCtl3D;
+ property ParentFont;
+ property ParentShowHint;
+ property PopupMenu;
+ property ReadOnly;
+ property ShowHint;
+ property TabOrder;
+ property TabStop;
+ property Visible;
+ property OnBottomClick: TNotifyEvent read FOnBottomClick write FOnBottomClick;
+ property OnTopClick: TNotifyEvent read FOnTopClick write FOnTopClick;
+ property OnChange;
+ property OnClick;
+ property OnDblClick;
+ property OnDragDrop;
+ property OnDragOver;
+ property OnEndDrag;
+ property OnEnter;
+ property OnExit;
+ property OnKeyDown;
+ property OnKeyPress;
+ property OnKeyUp;
+ property OnMouseDown;
+ property OnMouseMove;
+ property OnMouseUp;
+ property OnMouseWheel;
+ property OnMouseWheelDown;
+ property OnMouseWheelUp;
+ property OnContextPopup;
+ property OnEndDock;
+ property OnStartDock;
+//{$ENDIF}
+ end;
+
+implementation
+
+uses
+ VCLUtils, LResources;
+
+const
+ sSpinUpBtn = 'RXSPINUP';
+ sSpinDownBtn = 'RXSPINDOWN';
+
+const
+ InitRepeatPause = 400; { pause before repeat timer (ms) }
+ RepeatPause = 100;
+
+{ TRxSpinButton }
+
+constructor TRxSpinButton.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+{ FUpBitmap := TBitmap.Create;
+ FDownBitmap := TBitmap.Create;}
+ FUpBitmap := LoadBitmapFromLazarusResource(sSpinUpBtn);
+ FDownBitmap := LoadBitmapFromLazarusResource(sSpinDownBtn);
+ FUpBitmap.OnChange := @GlyphChanged;
+ FDownBitmap.OnChange := @GlyphChanged;
+ Height := 20;
+ Width := 20;
+ FTopDownBtn := TBitmap.Create;
+ FBottomDownBtn := TBitmap.Create;
+ FNotDownBtn := TBitmap.Create;
+ DrawAllBitmap;
+ FLastDown := sbNotDown;
+end;
+
+destructor TRxSpinButton.Destroy;
+begin
+ FTopDownBtn.Free;
+ FBottomDownBtn.Free;
+ FNotDownBtn.Free;
+ FUpBitmap.Free;
+ FDownBitmap.Free;
+ FRepeatTimer.Free;
+ inherited Destroy;
+end;
+
+procedure TRxSpinButton.GlyphChanged(Sender: TObject);
+begin
+ FInvalidate := True;
+ Invalidate;
+end;
+
+function TRxSpinButton.GetUpGlyph: TBitmap;
+begin
+ Result := FUpBitmap;
+end;
+
+procedure TRxSpinButton.SetUpGlyph(Value: TBitmap);
+begin
+ if Value <> nil then FUpBitmap.Assign(Value)
+ else
+ FUpBitmap := LoadBitmapFromLazarusResource(sSpinUpBtn);
+end;
+
+function TRxSpinButton.GetDownGlyph: TBitmap;
+begin
+ Result := FDownBitmap;
+end;
+
+procedure TRxSpinButton.SetDownGlyph(Value: TBitmap);
+begin
+ if Value <> nil then FDownBitmap.Assign(Value)
+ else
+ FDownBitmap := LoadBitmapFromLazarusResource(sSpinDownBtn);
+end;
+
+procedure TRxSpinButton.SetDown(Value: TSpinButtonState);
+var
+ OldState: TSpinButtonState;
+begin
+ OldState := FDown;
+ FDown := Value;
+ if OldState <> FDown then Repaint;
+end;
+
+procedure TRxSpinButton.SetFocusControl(Value: TWinControl);
+begin
+ FFocusControl := Value;
+ if Value <> nil then
+ Value.FreeNotification(Self);
+end;
+
+procedure TRxSpinButton.Notification(AComponent: TComponent;
+ Operation: TOperation);
+begin
+ inherited Notification(AComponent, Operation);
+ if (Operation = opRemove) and (AComponent = FFocusControl) then
+ FFocusControl := nil;
+end;
+
+procedure TRxSpinButton.Paint;
+begin
+ if not Enabled and not (csDesigning in ComponentState) then
+ FDragging := False;
+ if (FNotDownBtn.Height <> Height) or (FNotDownBtn.Width <> Width) or
+ FInvalidate then DrawAllBitmap;
+ FInvalidate := False;
+ with Canvas do
+ case FDown of
+ sbNotDown: Draw(0, 0, FNotDownBtn);
+ sbTopDown: Draw(0, 0, FTopDownBtn);
+ sbBottomDown: Draw(0, 0, FBottomDownBtn);
+ end;
+end;
+
+procedure TRxSpinButton.DrawAllBitmap;
+begin
+ DrawBitmap(FTopDownBtn, sbTopDown);
+ DrawBitmap(FBottomDownBtn, sbBottomDown);
+ DrawBitmap(FNotDownBtn, sbNotDown);
+end;
+
+procedure TRxSpinButton.DrawBitmap(ABitmap: TBitmap; ADownState: TSpinButtonState);
+var
+ R, RSrc: TRect;
+ dRect: Integer;
+ {Temp: TBitmap;}
+begin
+ ABitmap.Height := Height;
+ ABitmap.Width := Width;
+ with ABitmap.Canvas do begin
+ R := Bounds(0, 0, Width, Height);
+ Pen.Width := 1;
+ Brush.Color := clBtnFace;
+ Brush.Style := bsSolid;
+ FillRect(R);
+ { buttons frame }
+ Pen.Color := clWindowFrame;
+ Rectangle(0, 0, Width, Height);
+ MoveTo(-1, Height);
+ LineTo(Width, -1);
+ { top button }
+ if ADownState = sbTopDown then Pen.Color := clBtnShadow
+ else Pen.Color := clBtnHighlight;
+ MoveTo(1, Height - 4);
+ LineTo(1, 1);
+ LineTo(Width - 3, 1);
+ if ADownState = sbTopDown then Pen.Color := clBtnHighlight
+ else Pen.Color := clBtnShadow;
+ if ADownState <> sbTopDown then begin
+ MoveTo(1, Height - 3);
+ LineTo(Width - 2, 0);
+ end;
+ { bottom button }
+ if ADownState = sbBottomDown then Pen.Color := clBtnHighlight
+ else Pen.Color := clBtnShadow;
+ MoveTo(2, Height - 2);
+ LineTo(Width - 2, Height - 2);
+ LineTo(Width - 2, 1);
+ if ADownState = sbBottomDown then Pen.Color := clBtnShadow
+ else Pen.Color := clBtnHighlight;
+ MoveTo(2, Height - 2);
+ LineTo(Width - 1, 1);
+ { top glyph }
+ dRect := 1;
+ if ADownState = sbTopDown then Inc(dRect);
+ R := Bounds(Round((Width / 4) - (FUpBitmap.Width / 2)) + dRect,
+ Round((Height / 4) - (FUpBitmap.Height / 2)) + dRect, FUpBitmap.Width,
+ FUpBitmap.Height);
+ RSrc := Bounds(0, 0, FUpBitmap.Width, FUpBitmap.Height);
+ {
+ if Self.Enabled or (csDesigning in ComponentState) then
+ BrushCopy(R, FUpBitmap, RSrc, FUpBitmap.TransparentColor)
+ else begin
+ Temp := CreateDisabledBitmap(FUpBitmap, clBlack);
+ try
+ BrushCopy(R, Temp, RSrc, Temp.TransparentColor);
+ finally
+ Temp.Free;
+ end;
+ end;
+ }
+ //BrushCopy(R, FUpBitmap, RSrc, FUpBitmap.TransparentColor);
+ StretchDraw(R, FUpBitmap);
+ { bottom glyph }
+ R := Bounds(Round((3 * Width / 4) - (FDownBitmap.Width / 2)) - 1,
+ Round((3 * Height / 4) - (FDownBitmap.Height / 2)) - 1,
+ FDownBitmap.Width, FDownBitmap.Height);
+ RSrc := Bounds(0, 0, FDownBitmap.Width, FDownBitmap.Height);
+ {
+ if Self.Enabled or (csDesigning in ComponentState) then
+ BrushCopy(R, FDownBitmap, RSrc, FDownBitmap.TransparentColor)
+ else begin
+ Temp := CreateDisabledBitmap(FDownBitmap, clBlack);
+ try
+ BrushCopy(R, Temp, RSrc, Temp.TransparentColor);
+ finally
+ Temp.Free;
+ end;
+ end;
+ }
+ //BrushCopy(R, FDownBitmap, RSrc, FDownBitmap.TransparentColor);
+ StretchDraw(R, FDownBitmap);
+ if ADownState = sbBottomDown then begin
+ Pen.Color := clBtnShadow;
+ MoveTo(3, Height - 2);
+ LineTo(Width - 1, 2);
+ end;
+ end;
+end;
+
+procedure TRxSpinButton.CMEnabledChanged(var Message: TMessage);
+begin
+ inherited;
+ FInvalidate := True;
+ Invalidate;
+end;
+
+procedure TRxSpinButton.TopClick;
+begin
+ if Assigned(FOnTopClick) then begin
+ FOnTopClick(Self);
+ if not (csLButtonDown in ControlState) then FDown := sbNotDown;
+ end;
+end;
+
+procedure TRxSpinButton.BottomClick;
+begin
+ if Assigned(FOnBottomClick) then begin
+ FOnBottomClick(Self);
+ if not (csLButtonDown in ControlState) then FDown := sbNotDown;
+ end;
+end;
+
+procedure TRxSpinButton.MouseDown(Button: TMouseButton; Shift: TShiftState;
+ X, Y: Integer);
+begin
+ inherited MouseDown(Button, Shift, X, Y);
+ if (Button = mbLeft) and Enabled then begin
+ if (FFocusControl <> nil) and FFocusControl.TabStop and
+ FFocusControl.CanFocus and (GetFocus <> FFocusControl.Handle) then
+ FFocusControl.SetFocus;
+ if FDown = sbNotDown then begin
+ FLastDown := FDown;
+ if Y > (-(Height/Width) * X + Height) then begin
+ FDown := sbBottomDown;
+ BottomClick;
+ end
+ else begin
+ FDown := sbTopDown;
+ TopClick;
+ end;
+ if FLastDown <> FDown then begin
+ FLastDown := FDown;
+ Repaint;
+ end;
+ if FRepeatTimer = nil then FRepeatTimer := TTimer.Create(Self);
+ FRepeatTimer.OnTimer := @TimerExpired;
+ FRepeatTimer.Interval := InitRepeatPause;
+ FRepeatTimer.Enabled := True;
+ end;
+ FDragging := True;
+ end;
+end;
+
+procedure TRxSpinButton.MouseMove(Shift: TShiftState; X, Y: Integer);
+var
+ NewState: TSpinButtonState;
+begin
+ inherited MouseMove(Shift, X, Y);
+ if FDragging then begin
+ if (X >= 0) and (X <= Width) and (Y >= 0) and (Y <= Height) then begin
+ NewState := FDown;
+ if Y > (-(Width / Height) * X + Height) then begin
+ if (FDown <> sbBottomDown) then begin
+ if FLastDown = sbBottomDown then FDown := sbBottomDown
+ else FDown := sbNotDown;
+ if NewState <> FDown then Repaint;
+ end;
+ end
+ else begin
+ if (FDown <> sbTopDown) then begin
+ if (FLastDown = sbTopDown) then FDown := sbTopDown
+ else FDown := sbNotDown;
+ if NewState <> FDown then Repaint;
+ end;
+ end;
+ end else
+ if FDown <> sbNotDown then begin
+ FDown := sbNotDown;
+ Repaint;
+ end;
+ end;
+end;
+
+procedure TRxSpinButton.MouseUp(Button: TMouseButton; Shift: TShiftState;
+ X, Y: Integer);
+begin
+ inherited MouseUp(Button, Shift, X, Y);
+ if FDragging then begin
+ FDragging := False;
+ if (X >= 0) and (X <= Width) and (Y >= 0) and (Y <= Height) then begin
+ FDown := sbNotDown;
+ FLastDown := sbNotDown;
+ Repaint;
+ end;
+ end;
+end;
+
+procedure TRxSpinButton.TimerExpired(Sender: TObject);
+begin
+ FRepeatTimer.Interval := RepeatPause;
+ if (FDown <> sbNotDown) and MouseCapture then begin
+ try
+ if FDown = sbBottomDown then BottomClick else TopClick;
+ except
+ FRepeatTimer.Enabled := False;
+ raise;
+ end;
+ end;
+end;
+
+function DefBtnWidth: Integer;
+begin
+ Result := GetSystemMetrics(SM_CXVSCROLL);
+ if Result > 15 then Result := 15;
+end;
+
+{ TRxSpinEdit }
+
+constructor TRxSpinEdit.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ Text := '0';
+ ControlStyle := ControlStyle - [csSetCaption];
+ FIncrement := 1.0;
+ FDecimal := 2;
+ FEditorEnabled := True;
+ FArrowKeys := True;
+ RecreateButton;
+ CheckButtonVisible
+end;
+
+destructor TRxSpinEdit.Destroy;
+begin
+ Destroying;
+ FChanging := True;
+ if FButton <> nil then
+ FreeAndNil(FButton);
+ if FBtnWindow <> nil then
+ FreeAndNil(FBtnWindow);
+ inherited Destroy;
+end;
+
+procedure TRxSpinEdit.RecreateButton;
+begin
+ if (csDestroying in ComponentState) then
+ Exit;
+ if FButton <> nil then
+ FreeAndNil(FButton);
+
+ if FBtnWindow <> nil then
+ FreeAndNil(FBtnWindow);
+
+ FBtnWindow := TWinControl.Create(Self);
+// FBtnWindow.ComponentStyle:=FBtnWindow.ComponentStyle + csSubComponent;
+ with FBtnWindow do
+ begin
+ FreeNotification(Self);
+ Height := Self.Height;
+ Width := Self.Height;
+ ControlStyle := ControlStyle + [csNoDesignSelectable];
+ end;
+
+ if FBtnWindow <> nil then
+ begin
+ FButton := TRxSpinButton.Create(Self);
+ with FButton do
+ begin
+ FocusControl := Self;
+ OnTopClick := @UpClick;
+ OnBottomClick := @DownClick;
+ Width := FBtnWindow.Height;
+ Height := FBtnWindow.Height;
+ FreeNotification(FBtnWindow);
+ end;
+ end;
+ CheckButtonVisible;
+end;
+
+procedure TRxSpinEdit.SetArrowKeys(Value: Boolean);
+begin
+ FArrowKeys := Value;
+ ResizeButton;
+end;
+
+function TRxSpinEdit.GetButtonWidth: Integer;
+begin
+ if FBtnWindow <> nil then
+ Result := FBtnWindow.Width
+ else
+ Result := DefBtnWidth;
+end;
+
+procedure TRxSpinEdit.ResizeButton;
+begin
+ if FBtnWindow <> nil then begin
+ FBtnWindow.Parent := Parent;
+ FBtnWindow.SetBounds(Width, Top, Height, Height);
+ if FButton <> nil then
+ FButton.SetBounds(0, 0, FBtnWindow.Width, FBtnWindow.Height);
+ end;
+end;
+
+procedure TRxSpinEdit.KeyDown(var Key: Word; Shift: TShiftState);
+begin
+ inherited KeyDown(Key, Shift);
+ if ArrowKeys and (Key in [VK_UP, VK_DOWN]) then begin
+ if Key = VK_UP then UpClick(Self)
+ else if Key = VK_DOWN then DownClick(Self);
+ Key := 0;
+ end;
+end;
+
+procedure TRxSpinEdit.Change;
+begin
+ if not FChanging then inherited Change;
+end;
+
+procedure TRxSpinEdit.KeyPress(var Key: Char);
+begin
+ if not IsValidChar(Key) then begin
+ Key := #0;
+ Beep;
+ end;
+ if Key <> #0 then begin
+ inherited KeyPress(Key);
+ if (Key = Char(VK_RETURN)) or (Key = Char(VK_ESCAPE)) then begin
+ { must catch and remove this, since is actually multi-line }
+ GetParentForm(Self).Perform(CM_DIALOGKEY, Byte(Key), 0);
+ if Key = Char(VK_RETURN) then Key := #0;
+ end;
+ end;
+end;
+
+function TRxSpinEdit.IsValidChar(Key: Char): Boolean;
+var
+ ValidChars: set of Char;
+begin
+ ValidChars := ['+', '-', '0'..'9'];
+ if ValueType = vtFloat then begin
+ if Pos(DefaultFormatSettings.DecimalSeparator, Text) = 0 then
+ ValidChars := ValidChars + [DefaultFormatSettings.DecimalSeparator];
+ if Pos('E', AnsiUpperCase(Text)) = 0 then
+ ValidChars := ValidChars + ['e', 'E'];
+ end
+ else if ValueType = vtHex then begin
+ ValidChars := ValidChars + ['A'..'F', 'a'..'f'];
+ end;
+ Result := (Key in ValidChars) or (Key < #32);
+ if not FEditorEnabled and Result and ((Key >= #32) or
+ (Key = Char(VK_BACK)) or (Key = Char(VK_DELETE))) then Result := False;
+end;
+
+procedure TRxSpinEdit.CreateParams(var Params: TCreateParams);
+begin
+ inherited CreateParams(Params);
+end;
+
+procedure TRxSpinEdit.SetParent(AParent: TWinControl);
+begin
+ inherited SetParent(AParent);
+ if FBtnWindow <> nil then begin
+ FBtnWindow.Parent := AParent;
+ FBtnWindow.AnchorToCompanion(akLeft, 0, Self);
+ FBtnWindow.Visible := True;
+ if FButton <> nil then begin
+ FButton.Parent := FBtnWindow;
+ FButton.Visible:= True;
+ end;
+ end;
+end;
+
+procedure TRxSpinEdit.Notification(AComponent: TComponent; Operation: TOperation
+ );
+begin
+ inherited Notification(AComponent, Operation);
+ if (AComponent = FBtnWindow) and (Operation = opRemove) then begin
+ if FButton <> nil then
+ FreeAndNil(FButton);
+ FreeAndNil(FBtnWindow);
+ end;
+end;
+
+procedure TRxSpinEdit.Loaded;
+begin
+ inherited Loaded;
+ CheckButtonVisible;
+ ResizeButton;
+end;
+
+procedure TRxSpinEdit.CMVisibleChanged(var Msg: TLMessage);
+begin
+ inherited CMVisibleChanged(Msg);
+ CheckButtonVisible;
+end;
+
+procedure TRxSpinEdit.CreateWnd;
+begin
+ inherited CreateWnd;
+end;
+
+procedure TRxSpinEdit.SetAlignment(Value: TAlignment);
+begin
+ if FAlignment <> Value then begin
+ FAlignment := Value;
+ RecreateWnd(Self);
+ end;
+end;
+
+procedure TRxSpinEdit.LMSize(var Message: TLMSize);
+var
+ MinHeight: Integer;
+begin
+ inherited;
+ ResizeButton;
+end;
+
+procedure TRxSpinEdit.GetTextHeight(var SysHeight, aHeight: Integer);
+var
+ DC: HDC;
+ SaveFont: HFont;
+ SysMetrics, Metrics: TTextMetric;
+begin
+ DC := GetDC(0);
+ GetTextMetrics(DC, SysMetrics);
+ SaveFont := SelectObject(DC, Font.Handle);
+ GetTextMetrics(DC, Metrics);
+ SelectObject(DC, SaveFont);
+ ReleaseDC(0, DC);
+ SysHeight := SysMetrics.tmHeight;
+ Height := Metrics.tmHeight;
+end;
+
+function TRxSpinEdit.GetMinHeight: Integer;
+var
+ I, H: Integer;
+begin
+ GetTextHeight(I, H);
+ if I > H then I := H;
+ Result := H + (GetSystemMetrics(SM_CYBORDER) * 4) + 1;
+end;
+
+procedure TRxSpinEdit.UpClick(Sender: TObject);
+var
+ OldText: string;
+begin
+ if ReadOnly then Beep
+ else begin
+ FChanging := True;
+ try
+ OldText := inherited Text;
+ Value := Value + FIncrement;
+ finally
+ FChanging := False;
+ end;
+ if CompareText(inherited Text, OldText) <> 0 then begin
+ Modified := True;
+ Change;
+ end;
+ if Assigned(FOnTopClick) then FOnTopClick(Self);
+ end;
+end;
+
+procedure TRxSpinEdit.DownClick(Sender: TObject);
+var
+ OldText: string;
+begin
+ if ReadOnly then Beep
+ else begin
+ FChanging := True;
+ try
+ OldText := inherited Text;
+ Value := Value - FIncrement;
+ finally
+ FChanging := False;
+ end;
+ if CompareText(inherited Text, OldText) <> 0 then begin
+ Modified := True;
+ Change;
+ end;
+ if Assigned(FOnBottomClick) then FOnBottomClick(Self);
+ end;
+end;
+
+procedure TRxSpinEdit.CMFontChanged(var Message: TLMessage);
+begin
+ inherited;
+ ResizeButton;
+end;
+
+procedure TRxSpinEdit.CheckButtonVisible;
+begin
+ if FBtnWindow <> nil then begin
+ FBtnWindow.Visible := (csDesigning in ComponentState) or Visible;
+ if FButton <> nil then
+ FButton.Visible := FBtnWindow.Visible;
+ end;
+end;
+
+procedure TRxSpinEdit.WMSetFocus(var Message: TLMSetFocus);
+begin
+ inherited;
+end;
+
+{procedure TRxSpinEdit.CMCtl3DChanged(var Message: TLMessage);
+begin
+ inherited;
+ ResizeButton;
+end;}
+
+procedure TRxSpinEdit.CMEnabledChanged(var Message: TLMessage);
+begin
+ inherited;
+ if FBtnWindow <> nil then
+ FBtnWindow.Enabled := Enabled;
+end;
+
+procedure TRxSpinEdit.WMPaste(var Message: TLMessage);
+begin
+ if not FEditorEnabled or ReadOnly then Exit;
+ inherited;
+end;
+
+procedure TRxSpinEdit.WMCut(var Message: TLMessage);
+begin
+ if not FEditorEnabled or ReadOnly then Exit;
+ inherited;
+end;
+
+procedure TRxSpinEdit.CMExit(var Message: TLMExit);
+begin
+ inherited;
+ if CheckValue(Value) <> Value then SetValue(Value);
+end;
+
+procedure TRxSpinEdit.CMEnter(var Message: TLMessage);
+begin
+ if AutoSelect and not (csLButtonDown in ControlState) then SelectAll;
+ inherited;
+end;
+
+function TRxSpinEdit.GetValue: Extended;
+begin
+ try
+ if ValueType = vtFloat then Result := StrToFloat(Text)
+ else if ValueType = vtHex then Result := StrToInt('$' + Text)
+ else Result := StrToInt(Text);
+ except
+ if ValueType = vtFloat then Result := FMinValue
+ else Result := Trunc(FMinValue);
+ end;
+end;
+
+procedure TRxSpinEdit.SetValue(NewValue: Extended);
+begin
+ if ValueType = vtFloat then
+ Text := FloatToStrF(CheckValue(NewValue), ffFixed, 15, FDecimal)
+ else if ValueType = vtHex then
+ Text := IntToHex(Round(CheckValue(NewValue)), 1)
+ else
+ Text := IntToStr(Round(CheckValue(NewValue)));
+end;
+
+function TRxSpinEdit.GetAsInteger: Longint;
+begin
+ Result := Trunc(GetValue);
+end;
+
+procedure TRxSpinEdit.SetAsInteger(NewValue: Longint);
+begin
+ SetValue(NewValue);
+end;
+
+procedure TRxSpinEdit.SetValueType(NewType: TValueType);
+begin
+ if FValueType <> NewType then begin
+ FValueType := NewType;
+ Value := GetValue;
+ if FValueType in [vtInteger, vtHex] then
+ begin
+ FIncrement := Round(FIncrement);
+ if FIncrement = 0 then FIncrement := 1;
+ end;
+ end;
+end;
+
+function TRxSpinEdit.IsIncrementStored: Boolean;
+begin
+ Result := FIncrement <> 1.0;
+end;
+
+function TRxSpinEdit.IsMaxStored: Boolean;
+begin
+ Result := (MaxValue <> 0.0);
+end;
+
+function TRxSpinEdit.IsMinStored: Boolean;
+begin
+ Result := (MinValue <> 0.0);
+end;
+
+function TRxSpinEdit.IsValueStored: Boolean;
+begin
+ Result := (GetValue <> 0.0);
+end;
+
+procedure TRxSpinEdit.SetDecimal(NewValue: Byte);
+begin
+ if FDecimal <> NewValue then begin
+ FDecimal := NewValue;
+ Value := GetValue;
+ end;
+end;
+
+function TRxSpinEdit.CheckValue(NewValue: Extended): Extended;
+begin
+ Result := NewValue;
+ if (FMaxValue <> FMinValue) then begin
+ if NewValue < FMinValue then
+ Result := FMinValue
+ else if NewValue > FMaxValue then
+ Result := FMaxValue;
+ end;
+end;
+
+initialization
+ {$I rxspin.lrs}
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxstrutils.pas b/components/rx/version/v2.2_laz_1.2/rxstrutils.pas
new file mode 100644
index 000000000..b990af010
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxstrutils.pas
@@ -0,0 +1,1132 @@
+{ RxStrUtils unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+{*******************************************************}
+{ This unit based on AlexGraf String Library }
+{ by Alexei Lukin (c) 1992 }
+{ }
+{*******************************************************}
+
+unit rxstrutils;
+
+{$I rx.inc}
+
+interface
+
+uses SysUtils, Classes;
+
+type
+ TCharSet = TSysCharSet;
+
+{ ** Common string handling routines ** }
+
+function StrToOem(const AnsiStr: string): string;
+{ StrToOem translates a string from the Windows character set into the
+ OEM character set. }
+
+function OemToAnsiStr(const OemStr: string): string;
+{ OemToAnsiStr translates a string from the OEM character set into the
+ Windows character set. }
+
+function IsEmptyStr(const S: string; const EmptyChars: TCharSet): Boolean; deprecated; //use this function from fcl strutils
+{ EmptyStr returns true if the given string contains only character
+ from the EmptyChars. }
+
+function ReplaceStr(const S, Srch, Replace: string): string;
+{ Returns string with every occurrence of Srch string replaced with
+ Replace string. }
+
+function DelSpace(const S: string): string; deprecated; //use this function from fcl strutils
+{ DelSpace return a string with all white spaces removed. }
+
+function DelChars(const S: string; Chr: Char): string; deprecated; //use this function from fcl strutils
+{ DelChars return a string with all Chr characters removed. }
+
+function DelBSpace(const S: string): string;
+{ DelBSpace trims leading spaces from the given string. }
+
+function DelESpace(const S: string): string;
+{ DelESpace trims trailing spaces from the given string. }
+
+function DelRSpace(const S: string): string;
+{ DelRSpace trims leading and trailing spaces from the given string. }
+
+function DelSpace1(const S: string): string; deprecated; //use this function from fcl strutils
+{ DelSpace1 return a string with all non-single white spaces removed. }
+
+function Tab2Space(const S: string; Numb: Byte): string; deprecated; //use this function from fcl strutils
+{ Tab2Space converts any tabulation character in the given string to the
+ Numb spaces characters. }
+
+function NPos(const C: string; S: string; N: Integer): Integer; deprecated; //use this function from fcl strutils
+{ NPos searches for a N-th position of substring C in a given string. }
+
+function MakeStr(C: Char; N: Integer): string;
+function MS(C: Char; N: Integer): string;
+{ MakeStr return a string of length N filled with character C. }
+
+function AddChar(C: Char; const S: string; N: Integer): string; deprecated; //use this function from fcl strutils
+{ AddChar return a string left-padded to length N with characters C. }
+
+function AddCharR(C: Char; const S: string; N: Integer): string; deprecated; //use this function from fcl strutils
+{ AddCharR return a string right-padded to length N with characters C. }
+
+function LeftStr(const S: string; N: Integer): string;
+{ LeftStr return a string right-padded to length N with blanks. }
+
+function RightStr(const S: string; N: Integer): string;
+{ RightStr return a string left-padded to length N with blanks. }
+
+function CenterStr(const S: string; Len: Integer): string;
+{ CenterStr centers the characters in the string based upon the
+ Len specified. }
+
+function CompStr(const S1, S2: string): Integer;
+{ CompStr compares S1 to S2, with case-sensitivity. The return value is
+ -1 if S1 < S2, 0 if S1 = S2, or 1 if S1 > S2. }
+
+function CompText(const S1, S2: string): Integer;
+{ CompText compares S1 to S2, without case-sensitivity. The return value
+ is the same as for CompStr. }
+
+{$IFDEF USE_DEPRECATES}
+function Copy2Symb(const S: string; Symb: Char): string; deprecated; //use this function from fcl strutils
+{ Copy2Symb returns a substring of a string S from begining to first
+ character Symb. }
+
+function Copy2SymbDel(var S: string; Symb: Char): string; deprecated; //use this function from fcl strutils
+{ Copy2SymbDel returns a substring of a string S from begining to first
+ character Symb and removes this substring from S. }
+
+function Copy2Space(const S: string): string; deprecated; //use this function from fcl strutils
+{ Copy2Symb returns a substring of a string S from begining to first
+ white space. }
+
+function Copy2SpaceDel(var S: string): string; deprecated; //use this function from fcl strutils
+{ Copy2SpaceDel returns a substring of a string S from begining to first
+ white space and removes this substring from S. }
+{$ENDIF}
+function AnsiProperCase(const S: string; const WordDelims: TCharSet): string; deprecated; //use this function from fcl strutils
+{ Returns string, with the first letter of each word in uppercase,
+ all other letters in lowercase. Words are delimited by WordDelims. }
+
+function WordCount(const S: string; const WordDelims: TCharSet): Integer; deprecated; //use this function from fcl strutils
+{ WordCount given a set of word delimiters, returns number of words in S. }
+
+function WordPosition(const N: Integer; const S: string;
+ const WordDelims: TCharSet): Integer; deprecated; //use this function from fcl strutils
+{ Given a set of word delimiters, returns start position of N'th word in S. }
+
+function ExtractWord(N: Integer; const S: string;
+ const WordDelims: TCharSet): string; deprecated; //use this function from fcl strutils
+function ExtractWordPos(N: Integer; const S: string;
+ const WordDelims: TCharSet; var Pos: Integer): string; deprecated; //use this function from fcl strutils
+function ExtractDelimited(N: Integer; const S: string;
+ const Delims: TCharSet): string; deprecated; //use this function from fcl strutils
+{ ExtractWord, ExtractWordPos and ExtractDelimited given a set of word
+ delimiters, return the N'th word in S. }
+
+function ExtractSubstr(const S: string; var Pos: Integer;
+ const Delims: TCharSet): string; deprecated; //use this function from fcl strutils
+{ ExtractSubstr given a set of word delimiters, returns the substring from S,
+ that started from position Pos. }
+
+function IsWordPresent(const W, S: string; const WordDelims: TCharSet): Boolean; deprecated; //use this function from fcl strutils
+{ IsWordPresent given a set of word delimiters, returns True if word W is
+ present in string S. }
+
+function QuotedString(const S: string; Quote: Char): string;
+{ QuotedString returns the given string as a quoted string, using the
+ provided Quote character. }
+
+function ExtractQuotedString(const S: string; Quote: Char): string;
+{ ExtractQuotedString removes the Quote characters from the beginning and
+ end of a quoted string, and reduces pairs of Quote characters within
+ the quoted string to a single character. }
+
+function FindPart(const HelpWilds, InputStr: string): Integer; deprecated; //use this function from fcl strutils
+{ FindPart compares a string with '?' and another, returns the position of
+ HelpWilds in InputStr. }
+
+function IsWild(InputStr, Wilds: string; IgnoreCase: Boolean): Boolean; deprecated; //use this function from fcl strutils
+{ IsWild compares InputString with WildCard string and returns True
+ if corresponds. }
+
+function XorString(const Key, Src: ShortString): ShortString; deprecated; //use this function from fcl strutils
+function XorEncode(const Key, Source: string): string; deprecated; //use this function from fcl strutils
+function XorDecode(const Key, Source: string): string; deprecated; //use this function from fcl strutils
+
+//by alexs
+function StrToHexText(S:string):string;
+function HexTextToStr(S:string):string;
+
+{ ** Command line routines ** }
+
+{$IFNDEF RX_D4}
+function FindCmdLineSwitch(const Switch: string; SwitchChars: TCharSet;
+ IgnoreCase: Boolean): Boolean;
+{$ENDIF}
+function GetCmdLineArg(const Switch: string; SwitchChars: TCharSet): string; deprecated; //use this function from fcl strutils
+
+{ ** Numeric string handling routines ** }
+
+function Numb2USA(const S: string): string; deprecated; //use this function from fcl strutils
+{ Numb2USA converts numeric string S to USA-format. }
+
+function Dec2Hex(N: Longint; A: Byte): string; deprecated; //use this function from fcl strutils
+function D2H(N: Longint; A: Byte): string; deprecated; //use this function from fcl strutils
+{ Dec2Hex converts the given value to a hexadecimal string representation
+ with the minimum number of digits (A) specified. }
+
+function Hex2Dec(const S: string): Longint; deprecated; //use this function from fcl strutils
+function H2D(const S: string): Longint; deprecated; //use this function from fcl strutils
+{ Hex2Dec converts the given hexadecimal string to the corresponding integer
+ value. }
+
+function Dec2Numb(N: Longint; A, B: Byte): string; deprecated; //use this function from fcl strutils
+{ Dec2Numb converts the given value to a string representation with the
+ base equal to B and with the minimum number of digits (A) specified. }
+
+function Numb2Dec(S: string; B: Byte): Longint; deprecated; //use this function from fcl strutils
+{ Numb2Dec converts the given B-based numeric string to the corresponding
+ integer value. }
+
+function IntToBin(Value: Longint; Digits, Spaces: Integer): string; deprecated; //use this function from fcl strutils
+{ IntToBin converts the given value to a binary string representation
+ with the minimum number of digits specified. }
+
+function IntToRoman(Value: Longint): string; deprecated; //use this function from fcl strutils
+{ IntToRoman converts the given value to a roman numeric string
+ representation. }
+
+function RomanToInt(const S: string): Longint; deprecated; //use this function from fcl strutils
+{ RomanToInt converts the given string to an integer value. If the string
+ doesn't contain a valid roman numeric value, the 0 value is returned. }
+
+procedure StrToStrings(const S:string; const List:TStrings; const Delims:Char);
+
+const
+ DigitChars = ['0'..'9'];
+ Brackets = ['(',')','[',']','{','}'];
+ StdWordDelims = [#0..' ',',','.',';','/','\',':','''','"','`'] + Brackets;
+
+implementation
+
+{$IFDEF WINDOWS}
+uses Windows;
+{$ENDIF}
+
+function StrToOem(const AnsiStr: string): string;
+begin
+{$IFDEF WINDOWS}
+ SetLength(Result, Length(AnsiStr));
+ if Length(Result) > 0 then
+ CharToOemBuff(PChar(AnsiStr), PChar(Result), Length(Result));
+{$ELSE}
+ Result:=AnsiStr;
+{$ENDIF}
+end;
+
+function OemToAnsiStr(const OemStr: string): string;
+begin
+{$IFDEF WINDOWS}
+ SetLength(Result, Length(OemStr));
+ if Length(Result) > 0 then
+ OemToCharBuff(PChar(OemStr), PChar(Result), Length(Result));
+{$ELSE}
+ Result:=OemStr;
+{$ENDIF}
+end;
+
+function IsEmptyStr(const S: string; const EmptyChars: TCharSet): Boolean;
+var
+ I, SLen: Integer;
+begin
+ SLen := Length(S);
+ I := 1;
+ while I <= SLen do begin
+ if not (S[I] in EmptyChars) then begin
+ Result := False;
+ Exit;
+ end
+ else Inc(I);
+ end;
+ Result := True;
+end;
+
+function ReplaceStr(const S, Srch, Replace: string): string;
+var
+ I: Integer;
+ Source: string;
+begin
+ Source := S;
+ Result := '';
+ repeat
+ I := Pos(Srch, Source);
+ if I > 0 then begin
+ Result := Result + Copy(Source, 1, I - 1) + Replace;
+ Source := Copy(Source, I + Length(Srch), MaxInt);
+ end
+ else Result := Result + Source;
+ until I <= 0;
+end;
+
+function DelSpace(const S: String): string;
+begin
+ Result := DelChars(S, ' ');
+end;
+
+function DelChars(const S: string; Chr: Char): string;
+var
+ I: Integer;
+begin
+ Result := S;
+ for I := Length(Result) downto 1 do begin
+ if Result[I] = Chr then Delete(Result, I, 1);
+ end;
+end;
+
+function DelBSpace(const S: string): string;
+var
+ I, L: Integer;
+begin
+ L := Length(S);
+ I := 1;
+ while (I <= L) and (S[I] = ' ') do Inc(I);
+ Result := Copy(S, I, MaxInt);
+end;
+
+function DelESpace(const S: string): string;
+var
+ I: Integer;
+begin
+ I := Length(S);
+ while (I > 0) and (S[I] = ' ') do Dec(I);
+ Result := Copy(S, 1, I);
+end;
+
+function DelRSpace(const S: string): string;
+begin
+ Result := DelBSpace(DelESpace(S));
+end;
+
+function DelSpace1(const S: string): string;
+var
+ I: Integer;
+begin
+ Result := S;
+ for I := Length(Result) downto 2 do begin
+ if (Result[I] = ' ') and (Result[I - 1] = ' ') then
+ Delete(Result, I, 1);
+ end;
+end;
+
+function Tab2Space(const S: string; Numb: Byte): string;
+var
+ I: Integer;
+begin
+ I := 1;
+ Result := S;
+ while I <= Length(Result) do begin
+ if Result[I] = Chr(9) then begin
+ Delete(Result, I, 1);
+ Insert(MakeStr(' ', Numb), Result, I);
+ Inc(I, Numb);
+ end
+ else Inc(I);
+ end;
+end;
+
+function MakeStr(C: Char; N: Integer): string;
+begin
+ if N < 1 then Result := ''
+ else
+ begin
+ SetLength(Result, N);
+ FillChar(Result[1], Length(Result), C);
+ end;
+end;
+
+function MS(C: Char; N: Integer): string;
+begin
+ Result := MakeStr(C, N);
+end;
+
+function NPos(const C: string; S: string; N: Integer): Integer;
+var
+ I, P, K: Integer;
+begin
+ Result := 0;
+ K := 0;
+ for I := 1 to N do begin
+ P := Pos(C, S);
+ Inc(K, P);
+ if (I = N) and (P > 0) then begin
+ Result := K;
+ Exit;
+ end;
+ if P > 0 then Delete(S, 1, P)
+ else Exit;
+ end;
+end;
+
+function AddChar(C: Char; const S: string; N: Integer): string;
+begin
+ if Length(S) < N then
+ Result := MakeStr(C, N - Length(S)) + S
+ else Result := S;
+end;
+
+function AddCharR(C: Char; const S: string; N: Integer): string;
+begin
+ if Length(S) < N then
+ Result := S + MakeStr(C, N - Length(S))
+ else Result := S;
+end;
+
+function LeftStr(const S: string; N: Integer): string;
+begin
+ Result := AddCharR(' ', S, N);
+end;
+
+function RightStr(const S: string; N: Integer): string;
+begin
+ Result := AddChar(' ', S, N);
+end;
+
+function CompStr(const S1, S2: string): Integer;
+begin
+{$IFDEF WIN32}
+ Result := CompareString(GetThreadLocale, SORT_STRINGSORT, PChar(S1),
+ Length(S1), PChar(S2), Length(S2)) - 2;
+{$ELSE}
+ Result := CompareStr(S1, S2);
+{$ENDIF}
+end;
+
+function CompText(const S1, S2: string): Integer;
+begin
+{$IFDEF WIN32}
+ Result := CompareString(GetThreadLocale, SORT_STRINGSORT or NORM_IGNORECASE,
+ PChar(S1), Length(S1), PChar(S2), Length(S2)) - 2;
+{$ELSE}
+ Result := CompareText(S1, S2);
+{$ENDIF}
+end;
+
+{$IFDEF USE_DEPRECATES}
+function Copy2Symb(const S: string; Symb: Char): string;
+var
+ P: Integer;
+begin
+ P := Pos(Symb, S);
+ if P = 0 then P := Length(S) + 1;
+ Result := Copy(S, 1, P - 1);
+end;
+
+function Copy2SymbDel(var S: string; Symb: Char): string;
+begin
+ Result := Copy2Symb(S, Symb);
+ S := DelBSpace(Copy(S, Length(Result) + 1, Length(S)));
+end;
+
+function Copy2Space(const S: string): string;
+begin
+ Result := Copy2Symb(S, ' ');
+end;
+
+function Copy2SpaceDel(var S: string): string;
+begin
+ Result := Copy2SymbDel(S, ' ');
+end;
+{$ENDIF}
+
+function AnsiProperCase(const S: string; const WordDelims: TCharSet): string;
+var
+ SLen, I: Cardinal;
+begin
+ Result := AnsiLowerCase(S);
+ I := 1;
+ SLen := Length(Result);
+ while I <= SLen do begin
+ while (I <= SLen) and (Result[I] in WordDelims) do Inc(I);
+ if I <= SLen then Result[I] := AnsiUpperCase(Result[I])[1];
+ while (I <= SLen) and not (Result[I] in WordDelims) do Inc(I);
+ end;
+end;
+
+function WordCount(const S: string; const WordDelims: TCharSet): Integer;
+var
+ SLen, I: Cardinal;
+begin
+ Result := 0;
+ I := 1;
+ SLen := Length(S);
+ while I <= SLen do begin
+ while (I <= SLen) and (S[I] in WordDelims) do Inc(I);
+ if I <= SLen then Inc(Result);
+ while (I <= SLen) and not(S[I] in WordDelims) do Inc(I);
+ end;
+end;
+
+function WordPosition(const N: Integer; const S: string;
+ const WordDelims: TCharSet): Integer;
+var
+ Count, I: Integer;
+begin
+ Count := 0;
+ I := 1;
+ Result := 0;
+ while (I <= Length(S)) and (Count <> N) do begin
+ { skip over delimiters }
+ while (I <= Length(S)) and (S[I] in WordDelims) do Inc(I);
+ { if we're not beyond end of S, we're at the start of a word }
+ if I <= Length(S) then Inc(Count);
+ { if not finished, find the end of the current word }
+ if Count <> N then
+ while (I <= Length(S)) and not (S[I] in WordDelims) do Inc(I)
+ else Result := I;
+ end;
+end;
+
+function ExtractWord(N: Integer; const S: string;
+ const WordDelims: TCharSet): string;
+var
+ I: Integer;
+ Len: Integer;
+begin
+ Len := 0;
+ I := WordPosition(N, S, WordDelims);
+ if I <> 0 then
+ { find the end of the current word }
+ while (I <= Length(S)) and not(S[I] in WordDelims) do begin
+ { add the I'th character to result }
+ Inc(Len);
+ SetLength(Result, Len);
+ Result[Len] := S[I];
+ Inc(I);
+ end;
+ SetLength(Result, Len);
+end;
+
+function ExtractWordPos(N: Integer; const S: string;
+ const WordDelims: TCharSet; var Pos: Integer): string;
+var
+ I, Len: Integer;
+begin
+ Len := 0;
+ I := WordPosition(N, S, WordDelims);
+ Pos := I;
+ if I <> 0 then
+ { find the end of the current word }
+ while (I <= Length(S)) and not(S[I] in WordDelims) do begin
+ { add the I'th character to result }
+ Inc(Len);
+ SetLength(Result, Len);
+ Result[Len] := S[I];
+ Inc(I);
+ end;
+ SetLength(Result, Len);
+end;
+
+function ExtractDelimited(N: Integer; const S: string;
+ const Delims: TCharSet): string;
+var
+ CurWord: Integer;
+ I, Len, SLen: Integer;
+begin
+ CurWord := 0;
+ I := 1;
+ Len := 0;
+ SLen := Length(S);
+ SetLength(Result, 0);
+ while (I <= SLen) and (CurWord <> N) do begin
+ if S[I] in Delims then Inc(CurWord)
+ else begin
+ if CurWord = N - 1 then begin
+ Inc(Len);
+ SetLength(Result, Len);
+ Result[Len] := S[I];
+ end;
+ end;
+ Inc(I);
+ end;
+end;
+
+function ExtractSubstr(const S: string; var Pos: Integer;
+ const Delims: TCharSet): string;
+var
+ I: Integer;
+begin
+ I := Pos;
+ while (I <= Length(S)) and not (S[I] in Delims) do Inc(I);
+ Result := Copy(S, Pos, I - Pos);
+ if (I <= Length(S)) and (S[I] in Delims) then Inc(I);
+ Pos := I;
+end;
+
+function IsWordPresent(const W, S: string; const WordDelims: TCharSet): Boolean;
+var
+ Count, I: Integer;
+begin
+ Result := False;
+ Count := WordCount(S, WordDelims);
+ for I := 1 to Count do
+ if ExtractWord(I, S, WordDelims) = W then begin
+ Result := True;
+ Exit;
+ end;
+end;
+
+{$IFDEF WIN32}
+ {$IFNDEF VER90}
+ { C++Builder or Delphi 3.0 }
+ {$DEFINE MBCS}
+ {$ENDIF}
+{$ENDIF}
+
+function QuotedString(const S: string; Quote: Char): string;
+{$IFDEF MBCS}
+begin
+ Result := AnsiQuotedStr(S, Quote);
+{$ELSE}
+var
+ I: Integer;
+begin
+ Result := S;
+ for I := Length(Result) downto 1 do
+ if Result[I] = Quote then Insert(Quote, Result, I);
+ Result := Quote + Result + Quote;
+{$ENDIF MBCS}
+end;
+
+function ExtractQuotedString(const S: string; Quote: Char): string;
+var
+{$IFDEF MBCS}
+ P: PChar;
+begin
+ P := PChar(S);
+ if P^ = Quote then Result := AnsiExtractQuotedStr(P, Quote)
+ else Result := S;
+{$ELSE}
+ I: Integer;
+begin
+ Result := S;
+ I := Length(Result);
+ if (I > 0) and (Result[1] = Quote) and
+ (Result[I] = Quote) then
+ begin
+ Delete(Result, I, 1);
+ Delete(Result, 1, 1);
+ for I := Length(Result) downto 2 do begin
+ if (Result[I] = Quote) and (Result[I - 1] = Quote) then
+ Delete(Result, I, 1);
+ end;
+ end;
+{$ENDIF MBCS}
+end;
+
+function Numb2USA(const S: string): string;
+var
+ I, NA: Integer;
+begin
+ I := Length(S);
+ Result := S;
+ NA := 0;
+ while (I > 0) do begin
+ if ((Length(Result) - I + 1 - NA) mod 3 = 0) and (I <> 1) then
+ begin
+ Insert(',', Result, I);
+ Inc(NA);
+ end;
+ Dec(I);
+ end;
+end;
+
+function CenterStr(const S: string; Len: Integer): string;
+begin
+ if Length(S) < Len then begin
+ Result := MakeStr(' ', (Len div 2) - (Length(S) div 2)) + S;
+ Result := Result + MakeStr(' ', Len - Length(Result));
+ end
+ else Result := S;
+end;
+
+function Dec2Hex(N: LongInt; A: Byte): string;
+begin
+ Result := IntToHex(N, A);
+end;
+
+function D2H(N: LongInt; A: Byte): string;
+begin
+ Result := IntToHex(N, A);
+end;
+
+function Hex2Dec(const S: string): Longint;
+var
+ HexStr: string;
+begin
+ if Pos('$', S) = 0 then HexStr := '$' + S
+ else HexStr := S;
+ Result := StrToIntDef(HexStr, 0);
+end;
+
+function H2D(const S: string): Longint;
+begin
+ Result := Hex2Dec(S);
+end;
+
+function Dec2Numb(N: Longint; A, B: Byte): string;
+var
+ C: Integer;
+{$IFDEF RX_D4}
+ Number: Cardinal;
+{$ELSE}
+ Number: Longint;
+{$ENDIF}
+begin
+ if N = 0 then Result := '0'
+ else begin
+{$IFDEF RX_D4}
+ Number := Cardinal(N);
+{$ELSE}
+ Number := N;
+{$ENDIF}
+ Result := '';
+ while Number > 0 do begin
+ C := Number mod B;
+ if C > 9 then C := C + 55
+ else C := C + 48;
+ Result := Chr(C) + Result;
+ Number := Number div B;
+ end;
+ end;
+ if Result <> '' then Result := AddChar('0', Result, A);
+end;
+
+function Numb2Dec(S: string; B: Byte): Longint;
+var
+ I, P: Longint;
+begin
+ I := Length(S);
+ Result := 0;
+ S := UpperCase(S);
+ P := 1;
+ while (I >= 1) do begin
+ if S[I] > '@' then Result := Result + (Ord(S[I]) - 55) * P
+ else Result := Result + (Ord(S[I]) - 48) * P;
+ Dec(I);
+ P := P * B;
+ end;
+end;
+
+function RomanToInt(const S: string): Longint;
+const
+ RomanChars = ['C','D','I','L','M','V','X'];
+ RomanValues: array['C'..'X'] of Word =
+ (100,500,0,0,0,0,1,0,0,50,1000,0,0,0,0,0,0,0,0,5,0,10);
+var
+ Index, Next: Char;
+ I: Integer;
+ Negative: Boolean;
+begin
+ Result := 0;
+ I := 0;
+ Negative := (Length(S) > 0) and (S[1] = '-');
+ if Negative then Inc(I);
+ while (I < Length(S)) do begin
+ Inc(I);
+ Index := UpCase(S[I]);
+ if Index in RomanChars then begin
+ if Succ(I) <= Length(S) then Next := UpCase(S[I + 1])
+ else Next := #0;
+ if (Next in RomanChars) and (RomanValues[Index] < RomanValues[Next]) then
+ begin
+ Inc(Result, RomanValues[Next]);
+ Dec(Result, RomanValues[Index]);
+ Inc(I);
+ end
+ else Inc(Result, RomanValues[Index]);
+ end
+ else begin
+ Result := 0;
+ Exit;
+ end;
+ end;
+ if Negative then Result := -Result;
+end;
+
+function IntToRoman(Value: Longint): string;
+Label
+ A500, A400, A100, A90, A50, A40, A10, A9, A5, A4, A1;
+begin
+ Result := '';
+ while Value >= 1000 do begin
+ Dec(Value, 1000); Result := Result + 'M';
+ end;
+ if Value < 900 then goto A500
+ else begin
+ Dec(Value, 900); Result := Result + 'CM';
+ end;
+ goto A90;
+A400:
+ if Value < 400 then goto A100
+ else begin
+ Dec(Value, 400); Result := Result + 'CD';
+ end;
+ goto A90;
+A500:
+ if Value < 500 then goto A400
+ else begin
+ Dec(Value, 500); Result := Result + 'D';
+ end;
+A100:
+ while Value >= 100 do begin
+ Dec(Value, 100); Result := Result + 'C';
+ end;
+A90:
+ if Value < 90 then goto A50
+ else begin
+ Dec(Value, 90); Result := Result + 'XC';
+ end;
+ goto A9;
+A40:
+ if Value < 40 then goto A10
+ else begin
+ Dec(Value, 40); Result := Result + 'XL';
+ end;
+ goto A9;
+A50:
+ if Value < 50 then goto A40
+ else begin
+ Dec(Value, 50); Result := Result + 'L';
+ end;
+A10:
+ while Value >= 10 do begin
+ Dec(Value, 10); Result := Result + 'X';
+ end;
+A9:
+ if Value < 9 then goto A5
+ else begin
+ Result := Result + 'IX';
+ end;
+ Exit;
+A4:
+ if Value < 4 then goto A1
+ else begin
+ Result := Result + 'IV';
+ end;
+ Exit;
+A5:
+ if Value < 5 then goto A4
+ else begin
+ Dec(Value, 5); Result := Result + 'V';
+ end;
+ goto A1;
+A1:
+ while Value >= 1 do begin
+ Dec(Value); Result := Result + 'I';
+ end;
+end;
+
+function IntToBin(Value: Longint; Digits, Spaces: Integer): string;
+begin
+ Result := '';
+ if Digits > 32 then Digits := 32;
+ while Digits > 0 do begin
+ if (Digits mod Spaces) = 0 then Result := Result + ' ';
+ Dec(Digits);
+ Result := Result + IntToStr((Value shr Digits) and 1);
+ end;
+end;
+
+function FindPart(const HelpWilds, InputStr: string): Integer;
+var
+ I, J: Integer;
+ Diff: Integer;
+begin
+ I := Pos('?', HelpWilds);
+ if I = 0 then begin
+ { if no '?' in HelpWilds }
+ Result := Pos(HelpWilds, InputStr);
+ Exit;
+ end;
+ { '?' in HelpWilds }
+ Diff := Length(InputStr) - Length(HelpWilds);
+ if Diff < 0 then begin
+ Result := 0;
+ Exit;
+ end;
+ { now move HelpWilds over InputStr }
+ for I := 0 to Diff do begin
+ for J := 1 to Length(HelpWilds) do begin
+ if (InputStr[I + J] = HelpWilds[J]) or
+ (HelpWilds[J] = '?') then
+ begin
+ if J = Length(HelpWilds) then begin
+ Result := I + 1;
+ Exit;
+ end;
+ end
+ else Break;
+ end;
+ end;
+ Result := 0;
+end;
+
+function IsWild(InputStr, Wilds: string; IgnoreCase: Boolean): Boolean;
+
+ function SearchNext(var Wilds: string): Integer;
+ { looking for next *, returns position and string until position }
+ begin
+ Result := Pos('*', Wilds);
+ if Result > 0 then Wilds := Copy(Wilds, 1, Result - 1);
+ end;
+
+var
+ CWild, CInputWord: Integer; { counter for positions }
+ I, LenHelpWilds: Integer;
+ MaxInputWord, MaxWilds: Integer; { Length of InputStr and Wilds }
+ HelpWilds: string;
+begin
+ if Wilds = InputStr then begin
+ Result := True;
+ Exit;
+ end;
+ repeat { delete '**', because '**' = '*' }
+ I := Pos('**', Wilds);
+ if I > 0 then
+ Wilds := Copy(Wilds, 1, I - 1) + '*' + Copy(Wilds, I + 2, MaxInt);
+ until I = 0;
+ if Wilds = '*' then begin { for fast end, if Wilds only '*' }
+ Result := True;
+ Exit;
+ end;
+ MaxInputWord := Length(InputStr);
+ MaxWilds := Length(Wilds);
+ if IgnoreCase then begin { upcase all letters }
+ InputStr := AnsiUpperCase(InputStr);
+ Wilds := AnsiUpperCase(Wilds);
+ end;
+ if (MaxWilds = 0) or (MaxInputWord = 0) then begin
+ Result := False;
+ Exit;
+ end;
+ CInputWord := 1;
+ CWild := 1;
+ Result := True;
+ repeat
+ if InputStr[CInputWord] = Wilds[CWild] then begin { equal letters }
+ { goto next letter }
+ Inc(CWild);
+ Inc(CInputWord);
+ Continue;
+ end;
+ if Wilds[CWild] = '?' then begin { equal to '?' }
+ { goto next letter }
+ Inc(CWild);
+ Inc(CInputWord);
+ Continue;
+ end;
+ if Wilds[CWild] = '*' then begin { handling of '*' }
+ HelpWilds := Copy(Wilds, CWild + 1, MaxWilds);
+ I := SearchNext(HelpWilds);
+ LenHelpWilds := Length(HelpWilds);
+ if I = 0 then begin
+ { no '*' in the rest, compare the ends }
+ if HelpWilds = '' then Exit; { '*' is the last letter }
+ { check the rest for equal Length and no '?' }
+ for I := 0 to LenHelpWilds - 1 do begin
+ if (HelpWilds[LenHelpWilds - I] <> InputStr[MaxInputWord - I]) and
+ (HelpWilds[LenHelpWilds - I]<> '?') then
+ begin
+ Result := False;
+ Exit;
+ end;
+ end;
+ Exit;
+ end;
+ { handle all to the next '*' }
+ Inc(CWild, 1 + LenHelpWilds);
+ I := FindPart(HelpWilds, Copy(InputStr, CInputWord, MaxInt));
+ if I= 0 then begin
+ Result := False;
+ Exit;
+ end;
+ CInputWord := I + LenHelpWilds;
+ Continue;
+ end;
+ Result := False;
+ Exit;
+ until (CInputWord > MaxInputWord) or (CWild > MaxWilds);
+ { no completed evaluation }
+ if CInputWord <= MaxInputWord then Result := False;
+ if (CWild <= MaxWilds) and (Wilds[MaxWilds] <> '*') then Result := False;
+end;
+
+function XorString(const Key, Src: ShortString): ShortString;
+var
+ I: Integer;
+begin
+ Result := Src;
+ if Length(Key) > 0 then
+ for I := 1 to Length(Src) do
+ Result[I] := Chr(Byte(Key[1 + ((I - 1) mod Length(Key))]) xor Ord(Src[I]));
+end;
+
+function XorEncode(const Key, Source: string): string;
+var
+ I: Integer;
+ C: Byte;
+begin
+ Result := '';
+ for I := 1 to Length(Source) do begin
+ if Length(Key) > 0 then
+ C := Byte(Key[1 + ((I - 1) mod Length(Key))]) xor Byte(Source[I])
+ else
+ C := Byte(Source[I]);
+ Result := Result + AnsiLowerCase(IntToHex(C, 2));
+ end;
+end;
+
+function XorDecode(const Key, Source: string): string;
+var
+ I: Integer;
+ C: Char;
+begin
+ Result := '';
+ for I := 0 to Length(Source) div 2 - 1 do begin
+ C := Chr(StrToIntDef('$' + Copy(Source, (I * 2) + 1, 2), Ord(' ')));
+ if Length(Key) > 0 then
+ C := Chr(Byte(Key[1 + (I mod Length(Key))]) xor Byte(C));
+ Result := Result + C;
+ end;
+end;
+
+{$IFNDEF RX_D4}
+function FindCmdLineSwitch(const Switch: string; SwitchChars: TCharSet;
+ IgnoreCase: Boolean): Boolean;
+var
+ I: Integer;
+ S: string;
+begin
+ for I := 1 to ParamCount do begin
+ S := ParamStr(I);
+ if (SwitchChars = []) or ((S[1] in SwitchChars) and (Length(S) > 1)) then
+ begin
+ S := Copy(S, 2, MaxInt);
+ if IgnoreCase then begin
+ if (AnsiCompareText(S, Switch) = 0) then begin
+ Result := True;
+ Exit;
+ end;
+ end
+ else begin
+ if (AnsiCompareStr(S, Switch) = 0) then begin
+ Result := True;
+ Exit;
+ end;
+ end;
+ end;
+ end;
+ Result := False;
+end;
+{$ENDIF RX_D4}
+
+function GetCmdLineArg(const Switch: string; SwitchChars: TCharSet): string;
+var
+ I: Integer;
+ S: string;
+begin
+ I := 1;
+ while I <= ParamCount do begin
+ S := ParamStr(I);
+ if (SwitchChars = []) or ((S[1] in SwitchChars) and (Length(S) > 1)) then
+ begin
+ if (AnsiCompareText(Copy(S, 2, MaxInt), Switch) = 0) then begin
+ Inc(I);
+ if I <= ParamCount then begin
+ Result := ParamStr(I);
+ Exit;
+ end;
+ end;
+ end;
+ Inc(I);
+ end;
+ Result := '';
+end;
+
+function StrToHexText(S:string):string;
+var
+ i:integer;
+begin
+ Result:='';
+ for i:=1 to Length(S) do
+ Result:=Result+IntToHex(Byte(S[i]), 2);
+end;
+
+function HexTextToStr(S:string):string;
+var
+ i:integer;
+ b:byte;
+begin
+ Result:='';
+ for i:=1 to (Length(S) div 2) do
+ begin
+ B:=StrToInt('$'+S[i*2-1]+S[i*2]);
+ Result:=Result+Char(B);
+ end;
+end;
+
+procedure StrToStrings(const S:string; const List:TStrings; const Delims:Char);
+var
+ i,j:integer;
+begin
+ if S<>'' then
+ begin
+ j:=1;
+ for i:=1 to Length(S) do
+ begin
+ if S[i] = Delims then
+ begin
+ if i>j+1 then
+ begin
+ List.Add(Copy(S, j, i-j));
+ end;
+ j:=i+1;
+ end;
+ end;
+ if j TRxSwitch(Filer.Ancestor).FUserBitmaps
+ else Result := FUserBitmaps <> [];
+ end;
+
+begin
+ inherited DefineProperties(Filer);
+ Filer.DefineBinaryProperty('Data', @ReadBinaryData, @WriteBinaryData,
+ DoWrite);
+end;
+
+function TRxSwitch.GetPalette: HPALETTE;
+begin
+ if Enabled then Result := FBitmaps[FStateOn].Palette else Result := 0;
+end;
+
+procedure TRxSwitch.ReadBinaryData(Stream: TStream);
+begin
+ Stream.ReadBuffer(FUserBitmaps, SizeOf(FUserBitmaps));
+end;
+
+function TRxSwitch.StoreBitmapOff: boolean;
+begin
+ Result:=StoreBitmap(sw_off);
+end;
+
+function TRxSwitch.StoreBitmapOn: boolean;
+begin
+ Result:=StoreBitmap(sw_on);
+end;
+
+procedure TRxSwitch.WriteBinaryData(Stream: TStream);
+begin
+ Stream.WriteBuffer(FUserBitmaps, SizeOf(FUserBitmaps));
+end;
+
+function TRxSwitch.StoreBitmap(Index: TSwithState): Boolean;
+begin
+ Result := Index in FUserBitmaps;
+end;
+
+function TRxSwitch.GetSwitchGlyph(Index: TSwithState): TBitmap;
+begin
+ if csLoading in ComponentState then Include(FUserBitmaps, Index);
+ Result := FBitmaps[Index]
+end;
+
+procedure TRxSwitch.CreateDisabled(Index: TSwithState);
+begin
+ if FDisableBitmaps[Index] <> nil then
+ FDisableBitmaps[Index].Free;
+ try
+ FDisableBitmaps[Index] :=nil;
+// CreateDisabledBitmap(FBitmaps[Index], clBlack);
+ except
+ FDisableBitmaps[Index] := nil;
+ raise;
+ end;
+end;
+
+procedure TRxSwitch.GlyphChanged(Sender: TObject);
+var
+ I: TSwithState;
+begin
+ for I := sw_off to sw_on do
+ if Sender = FBitmaps[I] then
+ begin
+ CreateDisabled(I);
+ end;
+ Invalidate;
+end;
+
+function TRxSwitch.GetSwitchGlyphOff: TBitmap;
+begin
+ Result:=GetSwitchGlyph(sw_off);
+end;
+
+function TRxSwitch.GetSwitchGlyphOn: TBitmap;
+begin
+ Result:=GetSwitchGlyph(sw_on);
+end;
+
+procedure TRxSwitch.SetSwitchGlyph(Index: TSwithState; Value: TBitmap);
+begin
+ if Value <> nil then
+ begin
+ FBitmaps[Index].Assign(Value);
+ Include(FUserBitmaps, Index);
+ end
+ else
+ begin
+ case Index of
+ sw_off: FBitmaps[Index].Handle:=CreatePixmapIndirect(@RXSWITCH_OFF[0],
+ GetSysColor(COLOR_BTNFACE));
+ sw_on: FBitmaps[Index].Handle:=CreatePixmapIndirect(@RXSWITCH_ON[0],
+ GetSysColor(COLOR_BTNFACE));
+ end;
+ Exclude(FUserBitmaps, Index);
+ end;
+end;
+
+procedure TRxSwitch.CMFocusChanged(var Message: TLMessage);
+var
+ Active: Boolean;
+begin
+{ with Message do Active := (Sender = Self);
+ if Active <> FActive then
+ begin
+ FActive := Active;
+ if FShowFocus then Invalidate;
+ end;}
+ inherited;
+end;
+
+procedure TRxSwitch.CMEnabledChanged(var Message: TLMessage);
+begin
+ inherited;
+ Invalidate;
+end;
+
+procedure TRxSwitch.CMTextChanged(var Message: TLMessage);
+begin
+ inherited;
+ Invalidate;
+end;
+
+procedure TRxSwitch.CMDialogChar(var Message: TCMDialogChar);
+begin
+ if IsAccel(Message.CharCode, Caption) and CanFocus then begin
+ SetFocus;
+ Message.Result := 1;
+ end;
+end;
+
+procedure TRxSwitch.MouseDown(Button: TMouseButton;
+ Shift: TShiftState; X, Y: Integer);
+begin
+ if Button = mbLeft then
+ begin
+ if TabStop and CanFocus then SetFocus;
+ ToggleSwitch;
+ end;
+ inherited MouseDown(Button, Shift, X, Y);
+end;
+
+procedure TRxSwitch.KeyDown(var Key: Word; Shift: TShiftState);
+begin
+ inherited KeyDown(Key, Shift);
+ if FToggleKey = ShortCut(Key, Shift) then begin
+ ToggleSwitch;
+ Key := 0;
+ end;
+end;
+
+procedure TRxSwitch.Paint;
+var
+ ARect: TRect;
+ Text1: array[0..255] of Char;
+ FontHeight: Integer;
+
+ procedure DrawBitmap(Bmp: TBitmap);
+ var
+ TmpImage: TBitmap;
+ IWidth, IHeight, X, Y: Integer;
+ IRect: TRect;
+ begin
+ IWidth := Bmp.Width;
+ IHeight := Bmp.Height;
+ IRect := Rect(0, 0, IWidth, IHeight);
+ TmpImage := TBitmap.Create;
+ try
+ TmpImage.Width := IWidth;
+ TmpImage.Height := IHeight;
+ TmpImage.Canvas.Brush.Color := Self.Brush.Color;
+// TmpImage.Canvas.BrushCopy(IRect, Bmp, IRect, Bmp.TransparentColor);
+ X := 0; Y := 0;
+ case FTextPosition of
+ tpNone:
+ begin
+ X := ((Width - IWidth) div 2);
+ Y := ((Height - IHeight) div 2);
+ end;
+ tpLeft:
+ begin
+ X := Width - IWidth;
+ Y := ((Height - IHeight) div 2);
+ Dec(ARect.Right, IWidth);
+ end;
+ tpRight:
+ begin
+ X := 0;
+ Y := ((Height - IHeight) div 2);
+ Inc(ARect.Left, IWidth);
+ end;
+ tpAbove:
+ begin
+ X := ((Width - IWidth) div 2);
+ Y := Height - IHeight;
+ Dec(ARect.Bottom, IHeight);
+ end;
+ tpBelow:
+ begin
+ X := ((Width - IWidth) div 2);
+ Y := 0;
+ Inc(ARect.Top, IHeight);
+ end;
+ end;
+// Canvas.Draw(X, Y, TmpImage);
+ Canvas.Draw(X, Y, Bmp);
+// if Focused and FShowFocus and TabStop and not (csDesigning in ComponentState) then
+// Canvas.DrawFocusRect(Rect(X, Y, X + IWidth, Y + IHeight));
+// Canvas.FrameRect(Rect(X, Y, X + IWidth, Y + IHeight));
+ finally
+ TmpImage.Free;
+ end;
+ end;
+
+begin
+ ARect := GetClientRect;
+ with Canvas do
+ begin
+ Font := Self.Font;
+ Brush.Color := Self.Color;
+ FillRect(ARect);
+ if not Enabled and (FDisableBitmaps[FStateOn] <> nil) then
+ DrawBitmap(FDisableBitmaps[FStateOn])
+ else
+ DrawBitmap(FBitmaps[FStateOn]);
+ if FTextPosition <> tpNone then
+ begin
+ FontHeight := TextHeight('W');
+ with ARect do
+ begin
+ Top := ((Bottom + Top) - FontHeight) shr 1;
+ Bottom := Top + FontHeight;
+ end;
+ StrPCopy(Text1, Caption);
+ DrawText(Handle, Text1, StrLen(Text1), ARect, {DT_EXPANDTABS or }DT_VCENTER or DT_CENTER);
+ end;
+ end;
+end;
+
+procedure TRxSwitch.DoOn;
+begin
+ if Assigned(FOnOn) then FOnOn(Self);
+end;
+
+procedure TRxSwitch.DoOff;
+begin
+ if Assigned(FOnOff) then FOnOff(Self);
+end;
+
+procedure TRxSwitch.ToggleSwitch;
+begin
+ StateOn := TSwithState(not boolean(StateOn));
+end;
+
+procedure TRxSwitch.SetBorderStyle(Value: TBorderStyle);
+begin
+ if FBorderStyle <> Value then
+ begin
+ FBorderStyle := Value;
+ RecreateWnd(Self);
+ end;
+end;
+
+procedure TRxSwitch.SetStateOn(Value: TSwithState);
+begin
+ if FStateOn <> Value then
+ begin
+ FStateOn := Value;
+ Invalidate;
+ if Value = sw_on then
+ DoOn
+ else
+ DoOff;
+ end;
+end;
+
+procedure TRxSwitch.SetSwitchGlyphOff(const AValue: TBitmap);
+begin
+ SetSwitchGlyph(sw_off, AValue);
+end;
+
+procedure TRxSwitch.SetSwitchGlyphOn(const AValue: TBitmap);
+begin
+ SetSwitchGlyph(sw_on, AValue);
+end;
+
+procedure TRxSwitch.SetTextPosition(Value: TTextPos);
+begin
+ if FTextPosition <> Value then
+ begin
+ FTextPosition := Value;
+ Invalidate;
+ end;
+end;
+
+procedure TRxSwitch.SetShowFocus(Value: Boolean);
+begin
+ if FShowFocus <> Value then
+ begin
+ FShowFocus := Value;
+ if not (csDesigning in ComponentState) then Invalidate;
+ end;
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxsystemservices.pas b/components/rx/version/v2.2_laz_1.2/rxsystemservices.pas
new file mode 100644
index 000000000..0d35f3532
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxsystemservices.pas
@@ -0,0 +1,112 @@
+unit RxSystemServices;
+
+{$mode objfpc}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs;
+
+type
+ TRxServiceType = (sstAll, sstService, sstDrivers);
+ TRxServiceStatus = (sssAll, sssActive, sssInactive);
+ TRxServiceState = (srsStoped, //SERVICE_STOPPED : S := 'Сервис не запущен'
+ srsStartPending, //SERVICE_START_PENDING : S := 'Сервис в процессе запуска';
+ srsStopPending, //SERVICE_STOP_PENDING : S := 'Сервис в процессе завершения';
+ srsRunning, //SERVICE_RUNNING : S := 'Сервис запущен';
+ srsContinuePending, //SERVICE_CONTINUE_PENDING : S := 'Сервис в процессе запуска после временной оснановки';
+ srsPausePending, //SERVICE_PAUSE_PENDING : S := 'Сервис в процессе временной оснановки';
+ srsPaused //SERVICE_PAUSED : S := 'Сервис временно оснановлен';
+ );
+
+ TRxServiceItem = record
+ Name:string;
+ Description:string;
+ Status:TRxServiceState;
+ end;
+
+type
+
+ { TRxSystemServices }
+
+ TRxSystemServices = class(TComponent)
+ private
+ FItemCount: integer;
+ FServerName: string;
+ FServiceStatus: TRxServiceStatus;
+ FServiceType: TRxServiceType;
+ function GetItems(Index: integer): TRxServiceItem;
+ procedure SetItemCount(const AValue: integer);
+ procedure SetItems(Index: integer; const AValue: TRxServiceItem);
+ procedure SetServerName(const AValue: string);
+ procedure SetServiceStatus(const AValue: TRxServiceStatus);
+ procedure SetServiceType(const AValue: TRxServiceType);
+ protected
+ procedure ClearItems;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ property Items[Index:integer]:TRxServiceItem read GetItems write SetItems;
+ property ItemCount:integer read FItemCount write SetItemCount;
+ published
+ property ServerName:string read FServerName write SetServerName;
+ property ServiceType:TRxServiceType read FServiceType write SetServiceType; //(sstAll, sstService, sstDrivers);
+ property ServiceStatus:TRxServiceStatus read FServiceStatus write SetServiceStatus; //(sssAll, sssActive, sssInactive);
+ end;
+
+implementation
+
+{ TRxSystemServices }
+
+procedure TRxSystemServices.SetServerName(const AValue: string);
+begin
+ if FServerName=AValue then exit;
+ FServerName:=AValue;
+end;
+
+function TRxSystemServices.GetItems(Index: integer): TRxServiceItem;
+begin
+
+end;
+
+procedure TRxSystemServices.SetItemCount(const AValue: integer);
+begin
+ if FItemCount=AValue then exit;
+ FItemCount:=AValue;
+end;
+
+procedure TRxSystemServices.SetItems(Index: integer;
+ const AValue: TRxServiceItem);
+begin
+
+end;
+
+procedure TRxSystemServices.SetServiceStatus(const AValue: TRxServiceStatus);
+begin
+ if FServiceStatus=AValue then exit;
+ FServiceStatus:=AValue;
+end;
+
+procedure TRxSystemServices.SetServiceType(const AValue: TRxServiceType);
+begin
+ if FServiceType=AValue then exit;
+ FServiceType:=AValue;
+end;
+
+procedure TRxSystemServices.ClearItems;
+begin
+ FItemCount:=0;
+end;
+
+constructor TRxSystemServices.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+end;
+
+destructor TRxSystemServices.Destroy;
+begin
+ ClearItems;
+ inherited Destroy;
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxtbrsetup.lfm b/components/rx/version/v2.2_laz_1.2/rxtbrsetup.lfm
new file mode 100644
index 000000000..12b57c242
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxtbrsetup.lfm
@@ -0,0 +1,332 @@
+object ToolPanelSetupForm: TToolPanelSetupForm
+ Left = 383
+ Height = 487
+ Top = 176
+ Width = 657
+ ActiveControl = PageControl1
+ Caption = 'Tool panel setup'
+ ClientHeight = 487
+ ClientWidth = 657
+ FormStyle = fsStayOnTop
+ OnClose = FormClose
+ OnDestroy = FormDestroy
+ OnResize = FormResize
+ Position = poScreenCenter
+ LCLVersion = '1.1'
+ object PageControl1: TPageControl
+ Left = 0
+ Height = 433
+ Top = 0
+ Width = 657
+ ActivePage = TabSheet1
+ Align = alClient
+ TabIndex = 0
+ TabOrder = 0
+ object TabSheet1: TTabSheet
+ Caption = 'Visible buttons'
+ ClientHeight = 400
+ ClientWidth = 651
+ object Label1: TLabel
+ AnchorSideLeft.Control = BitBtn3
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = TabSheet1
+ Left = 349
+ Height = 15
+ Top = 6
+ Width = 102
+ BorderSpacing.Around = 6
+ Caption = 'Avaliable buttons'
+ FocusControl = ListBtnAvaliable
+ ParentColor = False
+ end
+ object Label2: TLabel
+ AnchorSideTop.Control = TabSheet1
+ Left = 8
+ Height = 15
+ Top = 6
+ Width = 89
+ BorderSpacing.Around = 6
+ Caption = 'Visible buttons'
+ FocusControl = ListBtnVisible
+ ParentColor = False
+ end
+ object BitBtn3: TBitBtn
+ AnchorSideLeft.Control = BitBtn6
+ AnchorSideTop.Control = BitBtn4
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = BitBtn6
+ AnchorSideRight.Side = asrBottom
+ Left = 307
+ Height = 30
+ Top = 145
+ Width = 36
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Top = 6
+ BorderSpacing.InnerBorder = 2
+ Caption = '<<'
+ OnClick = BitBtn3Click
+ TabOrder = 0
+ end
+ object BitBtn4: TBitBtn
+ AnchorSideLeft.Control = BitBtn6
+ AnchorSideTop.Control = BitBtn5
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = BitBtn6
+ AnchorSideRight.Side = asrBottom
+ Left = 307
+ Height = 31
+ Top = 108
+ Width = 36
+ Anchors = [akTop, akLeft, akRight]
+ AutoSize = True
+ BorderSpacing.Top = 6
+ BorderSpacing.InnerBorder = 2
+ Caption = '<'
+ OnClick = BitBtn4Click
+ TabOrder = 1
+ end
+ object BitBtn5: TBitBtn
+ AnchorSideLeft.Control = BitBtn6
+ AnchorSideTop.Control = BitBtn6
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = BitBtn6
+ AnchorSideRight.Side = asrBottom
+ Left = 307
+ Height = 38
+ Top = 64
+ Width = 36
+ Anchors = [akTop, akLeft, akRight]
+ BorderSpacing.Top = 6
+ BorderSpacing.InnerBorder = 2
+ Caption = '>'
+ OnClick = BitBtn5Click
+ TabOrder = 2
+ end
+ object BitBtn6: TBitBtn
+ AnchorSideLeft.Control = TabSheet1
+ AnchorSideLeft.Side = asrCenter
+ AnchorSideTop.Control = ListBtnAvaliable
+ Left = 307
+ Height = 31
+ Top = 27
+ Width = 36
+ AutoSize = True
+ BorderSpacing.InnerBorder = 2
+ Caption = '>>'
+ OnClick = BitBtn6Click
+ TabOrder = 3
+ end
+ object ListBtnAvaliable: TListBox
+ AnchorSideLeft.Control = BitBtn3
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = Label1
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = TabSheet1
+ AnchorSideRight.Side = asrBottom
+ AnchorSideBottom.Control = cbShowCaption
+ Left = 349
+ Height = 271
+ Top = 27
+ Width = 296
+ Anchors = [akTop, akLeft, akRight, akBottom]
+ BorderSpacing.Around = 6
+ IntegralHeight = True
+ Items.Strings = (
+ '111'
+ '222'
+ '333'
+ '44'
+ '555'
+ '666'
+ '777'
+ )
+ ItemHeight = 0
+ OnClick = ListBtnAvaliableClick
+ OnDrawItem = ListBox1DrawItem
+ ScrollWidth = 294
+ Style = lbOwnerDrawFixed
+ TabOrder = 4
+ end
+ object ListBtnVisible: TListBox
+ AnchorSideLeft.Control = Label2
+ AnchorSideTop.Control = Label2
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = BitBtn6
+ AnchorSideBottom.Control = cbShowCaption
+ Left = 14
+ Height = 271
+ Top = 27
+ Width = 287
+ Anchors = [akTop, akLeft, akRight, akBottom]
+ BorderSpacing.Around = 6
+ ItemHeight = 0
+ OnClick = ListBtnAvaliableClick
+ OnDrawItem = ListBox1DrawItem
+ ScrollWidth = 285
+ Style = lbOwnerDrawFixed
+ TabOrder = 5
+ TopIndex = -1
+ end
+ object Panel1: TPanel
+ AnchorSideBottom.Control = TabSheet1
+ AnchorSideBottom.Side = asrBottom
+ Left = 3
+ Height = 62
+ Top = 332
+ Width = 639
+ Alignment = taLeftJustify
+ Anchors = [akLeft, akRight, akBottom]
+ BorderSpacing.Around = 6
+ BevelOuter = bvLowered
+ FullRepaint = False
+ TabOrder = 6
+ end
+ object cbShowCaption: TCheckBox
+ AnchorSideLeft.Control = TabSheet1
+ AnchorSideBottom.Control = Panel1
+ Left = 6
+ Height = 22
+ Top = 304
+ Width = 105
+ Anchors = [akLeft, akBottom]
+ BorderSpacing.Around = 6
+ Caption = 'Show caption'
+ OnChange = cbShowCaptionChange
+ TabOrder = 7
+ end
+ end
+ object TabSheet2: TTabSheet
+ Caption = 'Options'
+ ClientHeight = 400
+ ClientWidth = 651
+ object cbShowHint: TCheckBox
+ AnchorSideLeft.Control = TabSheet2
+ AnchorSideTop.Control = cbTransp
+ AnchorSideTop.Side = asrBottom
+ Left = 6
+ Height = 22
+ Top = 163
+ Width = 82
+ BorderSpacing.Around = 6
+ Caption = 'Show hint'
+ TabOrder = 0
+ end
+ object cbTransp: TCheckBox
+ AnchorSideLeft.Control = TabSheet2
+ AnchorSideTop.Control = cbFlatBtn
+ AnchorSideTop.Side = asrBottom
+ Left = 6
+ Height = 22
+ Top = 135
+ Width = 94
+ BorderSpacing.Around = 6
+ Caption = 'Transparent'
+ TabOrder = 1
+ end
+ object cbFlatBtn: TCheckBox
+ AnchorSideLeft.Control = TabSheet2
+ AnchorSideTop.Control = RadioGroup1
+ AnchorSideTop.Side = asrBottom
+ Left = 6
+ Height = 22
+ Top = 107
+ Width = 93
+ BorderSpacing.Around = 6
+ Caption = 'Flat buttons'
+ TabOrder = 2
+ end
+ object RadioGroup1: TRadioGroup
+ AnchorSideLeft.Control = Panel2
+ AnchorSideLeft.Side = asrBottom
+ AnchorSideTop.Control = TabSheet2
+ AnchorSideRight.Control = TabSheet2
+ AnchorSideRight.Side = asrBottom
+ Left = 333
+ Height = 95
+ Top = 6
+ Width = 312
+ Anchors = [akTop, akLeft, akRight]
+ AutoFill = False
+ AutoSize = True
+ BorderSpacing.Around = 6
+ Caption = 'Button align'
+ ChildSizing.LeftRightSpacing = 6
+ ChildSizing.TopBottomSpacing = 6
+ ChildSizing.ShrinkHorizontal = crsScaleChilds
+ ChildSizing.ShrinkVertical = crsScaleChilds
+ ChildSizing.Layout = cclLeftToRightThenTopToBottom
+ ChildSizing.ControlsPerLine = 1
+ ClientHeight = 78
+ ClientWidth = 308
+ Items.Strings = (
+ 'None'
+ 'Left'
+ 'Rignt'
+ )
+ TabOrder = 3
+ TabStop = True
+ end
+ object RadioGroup2: TRadioGroup
+ AnchorSideLeft.Control = TabSheet2
+ AnchorSideTop.Control = TabSheet2
+ AnchorSideRight.Control = Panel2
+ Left = 6
+ Height = 95
+ Top = 6
+ Width = 312
+ Anchors = [akTop, akLeft, akRight]
+ AutoFill = True
+ AutoSize = True
+ BorderSpacing.Around = 6
+ Caption = 'Tool bar style'
+ ChildSizing.LeftRightSpacing = 6
+ ChildSizing.TopBottomSpacing = 6
+ ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
+ ChildSizing.EnlargeVertical = crsHomogenousChildResize
+ ChildSizing.ShrinkHorizontal = crsScaleChilds
+ ChildSizing.ShrinkVertical = crsScaleChilds
+ ChildSizing.Layout = cclLeftToRightThenTopToBottom
+ ChildSizing.ControlsPerLine = 1
+ ClientHeight = 78
+ ClientWidth = 308
+ Items.Strings = (
+ 'Standart'
+ 'Windows XP'
+ 'Native'
+ )
+ TabOrder = 4
+ TabStop = True
+ end
+ object Panel2: TPanel
+ AnchorSideLeft.Control = TabSheet2
+ AnchorSideLeft.Side = asrCenter
+ AnchorSideTop.Control = TabSheet2
+ AnchorSideBottom.Control = TabSheet2
+ AnchorSideBottom.Side = asrBottom
+ Left = 324
+ Height = 388
+ Top = 6
+ Width = 3
+ Anchors = [akTop, akLeft, akBottom]
+ BorderSpacing.Around = 6
+ TabOrder = 5
+ end
+ end
+ end
+ object ButtonPanel1: TButtonPanel
+ Left = 6
+ Height = 42
+ Top = 439
+ Width = 645
+ OKButton.Name = 'OKButton'
+ OKButton.DefaultCaption = True
+ HelpButton.Name = 'HelpButton'
+ HelpButton.DefaultCaption = True
+ CloseButton.Name = 'CloseButton'
+ CloseButton.DefaultCaption = True
+ CancelButton.Name = 'CancelButton'
+ CancelButton.DefaultCaption = True
+ TabOrder = 1
+ ShowButtons = [pbClose, pbHelp]
+ end
+end
diff --git a/components/rx/version/v2.2_laz_1.2/rxtbrsetup.lrt b/components/rx/version/v2.2_laz_1.2/rxtbrsetup.lrt
new file mode 100644
index 000000000..9025b32b3
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxtbrsetup.lrt
@@ -0,0 +1,15 @@
+TTOOLPANELSETUPFORM.CAPTION=Tool panel setup
+TTOOLPANELSETUPFORM.TABSHEET1.CAPTION=Visible buttons
+TTOOLPANELSETUPFORM.LABEL1.CAPTION=Avaliable buttons
+TTOOLPANELSETUPFORM.LABEL2.CAPTION=Visible buttons
+TTOOLPANELSETUPFORM.BITBTN3.CAPTION=<<
+TTOOLPANELSETUPFORM.BITBTN4.CAPTION=<
+TTOOLPANELSETUPFORM.BITBTN5.CAPTION=>
+TTOOLPANELSETUPFORM.BITBTN6.CAPTION=>>
+TTOOLPANELSETUPFORM.CBSHOWCAPTION.CAPTION=Show caption
+TTOOLPANELSETUPFORM.TABSHEET2.CAPTION=Options
+TTOOLPANELSETUPFORM.CBSHOWHINT.CAPTION=Show hint
+TTOOLPANELSETUPFORM.CBTRANSP.CAPTION=Transparent
+TTOOLPANELSETUPFORM.CBFLATBTN.CAPTION=Flat buttons
+TTOOLPANELSETUPFORM.RADIOGROUP1.CAPTION=Button align
+TTOOLPANELSETUPFORM.RADIOGROUP2.CAPTION=Tool bar style
diff --git a/components/rx/version/v2.2_laz_1.2/rxtbrsetup.pas b/components/rx/version/v2.2_laz_1.2/rxtbrsetup.pas
new file mode 100644
index 000000000..29ec32073
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxtbrsetup.pas
@@ -0,0 +1,319 @@
+{ rxtbrsetup unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit rxtbrsetup;
+
+{$I rx.inc}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, Buttons,
+ rxtoolbar, StdCtrls, ComCtrls, ExtCtrls, ButtonPanel;
+
+type
+
+ { TToolPanelSetupForm }
+
+ TToolPanelSetupForm = class(TForm)
+ BitBtn3: TBitBtn;
+ BitBtn4: TBitBtn;
+ BitBtn5: TBitBtn;
+ BitBtn6: TBitBtn;
+ ButtonPanel1: TButtonPanel;
+ cbShowHint: TCheckBox;
+ cbTransp: TCheckBox;
+ cbFlatBtn: TCheckBox;
+ cbShowCaption: TCheckBox;
+ Label1: TLabel;
+ Label2: TLabel;
+ ListBtnAvaliable: TListBox;
+ ListBtnVisible: TListBox;
+ PageControl1: TPageControl;
+ Panel1: TPanel;
+ Panel2: TPanel;
+ RadioGroup1: TRadioGroup;
+ RadioGroup2: TRadioGroup;
+ TabSheet1: TTabSheet;
+ TabSheet2: TTabSheet;
+ procedure BitBtn3Click(Sender: TObject);
+ procedure BitBtn4Click(Sender: TObject);
+ procedure BitBtn5Click(Sender: TObject);
+ procedure BitBtn6Click(Sender: TObject);
+ procedure CheckBox1Change(Sender: TObject);
+ procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
+ procedure FormDestroy(Sender: TObject);
+ procedure FormResize(Sender: TObject);
+ procedure ListBox1DrawItem(Control: TWinControl; Index: Integer;
+ ARect: TRect; State: TOwnerDrawState);
+ procedure ListBtnAvaliableClick(Sender: TObject);
+ procedure cbShowCaptionChange(Sender: TObject);
+ private
+ procedure FillItems(List:TStrings; AVisible:boolean);
+ procedure UpdateStates;
+ procedure Localize;
+ public
+ FToolPanel:TToolPanel;
+ constructor CreateSetupForm(AToolPanel:TToolPanel);
+ end;
+
+var
+ ToolPanelSetupForm: TToolPanelSetupForm;
+
+implementation
+uses vclutils, ActnList, boxprocs, rxconst;
+
+{$R *.lfm}
+
+type
+ THackToolPanel = class(TToolPanel);
+{ TToolPanelSetupForm }
+
+procedure TToolPanelSetupForm.FormDestroy(Sender: TObject);
+begin
+ if Assigned(FToolPanel) then
+ begin
+ THackToolPanel(FToolPanel).SetCustomizing(false);
+ THackToolPanel(FToolPanel).FCustomizer:=nil;
+ end;
+end;
+
+procedure TToolPanelSetupForm.FormResize(Sender: TObject);
+begin
+ ListBtnVisible.Width:=BitBtn6.Left - 4 - ListBtnVisible.Left;
+ ListBtnAvaliable.Left:=BitBtn6.Left + BitBtn6.Width + 4;
+ ListBtnAvaliable.Width:=Width - ListBtnAvaliable.Left - 4;
+ Label1.Left:=ListBtnAvaliable.Left;
+end;
+
+procedure TToolPanelSetupForm.ListBox1DrawItem(Control: TWinControl;
+ Index: Integer; ARect: TRect; State: TOwnerDrawState);
+var
+ Offset:integer;
+ P:TToolbarItem;
+ BtnRect:TRect;
+ Cnv:TCanvas;
+begin
+ Cnv:=(Control as TListBox).Canvas;
+ Cnv.FillRect(ARect); { clear the rectangle }
+ P:=TToolbarItem((Control as TListBox).Items.Objects[Index]);
+ if Assigned(P) then
+ begin
+ if Assigned(FToolPanel.ImageList) and Assigned(P.Action) then
+ begin
+ if (P.Action is TCustomAction) and
+ (TCustomAction(P.Action).ImageIndex>-1) and
+ (TCustomAction(P.Action).ImageIndex < FToolPanel.ImageList.Count) then
+ begin
+ Offset := 2;
+ BtnRect.Top:=ARect.Top + 2;
+ BtnRect.Left:=ARect.Left + Offset;
+ BtnRect.Right:=BtnRect.Left + FToolPanel.BtnWidth;
+ BtnRect.Bottom:=BtnRect.Top + FToolPanel.BtnHeight;
+ Cnv.Brush.Color := clBtnFace;
+ Cnv.FillRect(BtnRect);
+ DrawButtonFrame(Cnv, BtnRect, false, false);
+ FToolPanel.ImageList.Draw(Cnv, BtnRect.Left + (FToolPanel.BtnWidth - FToolPanel.ImageList.Width) div 2,
+ BtnRect.Top + (FToolPanel.BtnHeight - FToolPanel.ImageList.Height) div 2,
+ TCustomAction(P.Action).ImageIndex, True);
+ Offset:=BtnRect.Right;
+ end;
+ Offset := Offset + 6;
+ Cnv.TextOut(ARect.Left + Offset, (ARect.Top + ARect.Bottom - Cnv.TextHeight('W')) div 2, TCustomAction(P.Action).Caption); { display the text }
+ end;
+ end;
+end;
+
+procedure TToolPanelSetupForm.ListBtnAvaliableClick(Sender: TObject);
+begin
+ with (Sender as TListBox) do
+ begin
+ if (ItemIndex>-1) and (ItemIndex-1) and (ListBtnVisible.ItemIndex0;
+ BitBtn5.Enabled:=ListBtnVisible.Items.Count>0;
+ cbShowCaption.Enabled:=ListBtnVisible.Items.Count>0;
+
+ BitBtn4.Enabled:=ListBtnAvaliable.Items.Count>0;
+ BitBtn3.Enabled:=ListBtnAvaliable.Items.Count>0;
+ cbFlatBtn.Checked:=tpTransparentBtns in FToolPanel.Options;
+end;
+
+procedure TToolPanelSetupForm.Localize;
+begin
+ Caption:=sToolPanelSetup;
+ TabSheet1.Caption:=sVisibleButtons;
+ TabSheet2.Caption:=sOptions;
+ Label2.Caption:=sVisibleButtons;
+ Label2.Caption:=sVisibleButtons;
+ Label1.Caption:=sAvaliableButtons;
+ cbShowCaption.Caption:=sShowCaption;
+ RadioGroup2.Caption:=sToolBarStyle;
+ RadioGroup2.Items.Clear;
+ RadioGroup2.Items.Add(sToolBarStyle1);
+ RadioGroup2.Items.Add(sToolBarStyle2);
+ RadioGroup2.Items.Add(sToolBarStyle3);
+ cbFlatBtn.Caption:=sFlatButtons;
+ cbTransp.Caption:=sTransparent;
+ cbShowHint.Caption:=sShowHint;
+ RadioGroup1.Caption:=sButtonAlign;
+ RadioGroup1.Items.Clear;
+ RadioGroup1.Items.Add(sButtonAlign1);
+ RadioGroup1.Items.Add(sButtonAlign2);
+ RadioGroup1.Items.Add(sButtonAlign3);
+end;
+
+procedure TToolPanelSetupForm.FormClose(Sender: TObject;
+ var CloseAction: TCloseAction);
+begin
+ CloseAction:=caFree;
+end;
+
+procedure TToolPanelSetupForm.CheckBox1Change(Sender: TObject);
+var
+ tpo:TToolPanelOptions;
+begin
+ tpo:=FToolPanel.Options;
+ if cbTransp.Checked then
+ tpo:=tpo + [tpTransparentBtns]
+ else
+ tpo:=tpo - [tpTransparentBtns];
+
+ FToolPanel.ToolBarStyle:=TToolBarStyle(RadioGroup2.ItemIndex);
+
+ if cbFlatBtn.Checked then
+ tpo:=tpo + [tpFlatBtns]
+ else
+ tpo:=tpo - [tpFlatBtns];
+
+ FToolPanel.ShowHint:=cbShowHint.Checked;
+ FToolPanel.Options:=tpo;
+
+ FToolPanel.ButtonAllign:=TToolButtonAllign(RadioGroup1.ItemIndex);
+ cbFlatBtn.Checked:=tpFlatBtns in FToolPanel.Options;
+end;
+
+procedure TToolPanelSetupForm.BitBtn4Click(Sender: TObject);
+begin
+ BoxMoveSelectedItems(ListBtnAvaliable, ListBtnVisible);
+ UpdateStates;
+end;
+
+procedure TToolPanelSetupForm.BitBtn3Click(Sender: TObject);
+begin
+ BoxMoveAllItems(ListBtnAvaliable, ListBtnVisible);
+ UpdateStates;
+end;
+
+procedure TToolPanelSetupForm.BitBtn5Click(Sender: TObject);
+begin
+ BoxMoveSelectedItems(ListBtnVisible, ListBtnAvaliable);
+ UpdateStates;
+end;
+
+procedure TToolPanelSetupForm.BitBtn6Click(Sender: TObject);
+begin
+ BoxMoveAllItems(ListBtnVisible, ListBtnAvaliable);
+ UpdateStates;
+end;
+
+constructor TToolPanelSetupForm.CreateSetupForm(AToolPanel: TToolPanel);
+begin
+ inherited Create(AToolPanel);
+ Localize;
+ PageControl1.ActivePageIndex:=0;
+ FormResize(nil);
+ FToolPanel:=AToolPanel;
+
+
+ cbFlatBtn.Checked:=tpFlatBtns in FToolPanel.Options;
+ cbTransp.Checked:=tpTransparentBtns in FToolPanel.Options;
+ cbShowHint.Checked:=FToolPanel.ShowHint;
+
+ ListBtnAvaliable.ItemHeight:=FToolPanel.BtnHeight + 4;
+ ListBtnVisible.ItemHeight:=FToolPanel.BtnHeight + 4;
+
+ FillItems(ListBtnVisible.Items, true);
+ FillItems(ListBtnAvaliable.Items, false);
+
+ RadioGroup1.ItemIndex:=Ord(FToolPanel.ButtonAllign);
+ RadioGroup2.ItemIndex:=Ord(FToolPanel.ToolBarStyle);
+
+ UpdateStates;
+
+ cbFlatBtn.OnChange:=@CheckBox1Change;
+ cbTransp.OnChange:=@CheckBox1Change;
+ cbShowHint.OnChange:=@CheckBox1Change;
+ RadioGroup1.OnClick:=@CheckBox1Change;
+ RadioGroup2.OnClick:=@CheckBox1Change;
+
+end;
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/rxtimeedit.pas b/components/rx/version/v2.2_laz_1.2/rxtimeedit.pas
new file mode 100644
index 000000000..6cfbbb8c9
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxtimeedit.pas
@@ -0,0 +1,309 @@
+{ RxTimeEdit unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit RxTimeEdit;
+
+{$I rx.inc}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, rxspin,
+ MaskEdit, LMessages, LCLType;
+
+type
+
+ { TCustomRxTimeEdit }
+
+ TCustomRxTimeEdit = class(TCustomMaskEdit)
+ private
+ FButton: TRxSpinButton;
+ FButtonNeedsFocus: Boolean;
+ FOnButtonClick : TNotifyEvent;
+ procedure CheckButtonVisible;
+ function GetButtonHint: TTranslateString;
+ function GetTime: TTime;
+ procedure SetButtonHint(const AValue: TTranslateString);
+ procedure SetButtonNeedsFocus(const AValue: Boolean);
+ procedure SetTime(const AValue: TTime);
+ procedure DoChangeValue(AValue:integer);
+ procedure WMSetFocus(var Message: TLMSetFocus); message LM_SETFOCUS;
+ procedure WMKillFocus(var Message: TLMKillFocus); message LM_KILLFOCUS;
+ protected
+ procedure SetParent(AParent: TWinControl); override;
+ procedure DoPositionButton; virtual;
+ procedure UpClick(Sender: TObject); virtual;
+ procedure DownClick(Sender: TObject); virtual;
+ property ButtonOnlyWhenFocused: Boolean read FButtonNeedsFocus write SetButtonNeedsFocus default False;
+ property OnButtonClick : TNotifyEvent read FOnButtonClick write FOnButtonClick;
+ property ButtonHint: TTranslateString read GetButtonHint write SetButtonHint;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ property Time:TTime read GetTime write SetTime;
+ end;
+
+type
+ TRxTimeEdit = class(TCustomRxTimeEdit)
+ published
+ property AutoSize;
+ property AutoSelect;
+ property Align;
+ property Anchors;
+ property BorderSpacing;
+ property ButtonOnlyWhenFocused;
+ property ButtonHint;
+ property CharCase;
+ property Color;
+// property DirectInput;
+ property DragCursor;
+ property DragMode;
+ property EchoMode;
+ property Enabled;
+// property Flat;
+ property Font;
+// property Glyph;
+ property MaxLength;
+// property NumGlyphs;
+ property OnButtonClick;
+ property OnChange;
+ property OnClick;
+ property OnDblClick;
+ property OnDragDrop;
+ property OnDragOver;
+ property OnEditingDone;
+ property OnEndDrag;
+ property OnEnter;
+ property OnExit;
+ property OnKeyDown;
+ property OnKeyPress;
+ property OnKeyUp;
+ property OnMouseDown;
+ property OnMouseMove;
+ property OnMouseUp;
+ property OnMouseWheel;
+ property OnMouseWheelDown;
+ property OnMouseWheelUp;
+ property OnStartDrag;
+ property OnUTF8KeyPress;
+ property ParentColor;
+ property ParentFont;
+ property ParentShowHint;
+ property PasswordChar;
+ property PopupMenu;
+ property ReadOnly;
+ property ShowHint;
+ property TabOrder;
+ property TabStop;
+ property Text;
+ property Visible;
+ end;
+
+implementation
+
+
+{ TCustomRxTimeEdit }
+
+procedure TCustomRxTimeEdit.CheckButtonVisible;
+begin
+ If Assigned(FButton) then
+ FButton.Visible:=(csdesigning in ComponentState) or
+ (Visible and (Focused or not FButtonNeedsFocus));
+end;
+
+function TCustomRxTimeEdit.GetButtonHint: TTranslateString;
+begin
+ Result:=FButton.Hint;
+end;
+
+function TCustomRxTimeEdit.GetTime: TTime;
+begin
+ Result:=StrToTimeDef(Text, 0);
+end;
+
+procedure TCustomRxTimeEdit.SetButtonHint(const AValue: TTranslateString);
+begin
+ if AValue = '' then
+ FButton.Hint:=Hint
+ else
+ FButton.Hint:=AValue;
+end;
+
+procedure TCustomRxTimeEdit.SetButtonNeedsFocus(const AValue: Boolean);
+begin
+ if FButtonNeedsFocus<>AValue then
+ begin
+ FButtonNeedsFocus:=AValue;
+ CheckButtonVisible;
+ end;
+end;
+
+procedure TCustomRxTimeEdit.SetTime(const AValue: TTime);
+begin
+ Text:=TimeToStr(AValue);
+end;
+
+procedure TCustomRxTimeEdit.DoChangeValue(AValue: integer);
+var
+ S:ShortString;
+ H1, M2, S3:Integer;
+ i,p:integer;
+
+procedure IncHour;
+begin
+ H1:=H1+AValue;
+ if H1>23 then
+ H1:=0
+ else
+ if H1<0 then
+ H1:=23;
+end;
+
+procedure IncMin;
+begin
+ M2:=M2+AValue;
+ if M2>59 then
+ M2:=0
+ else
+ if M2<0 then
+ M2:=59
+ else
+ exit;
+ IncHour;
+end;
+
+procedure IncSec;
+begin
+ S3:=S3+AValue;
+ if S3>59 then
+ S3:=0
+ else
+ if S3<0 then
+ S3:=59
+ else
+ exit;
+ IncMin;
+end;
+
+begin
+ S:=Text;
+ for i:=1 to Length(S) do
+ if S[i]=' ' then
+ S[i]:='0';
+
+ H1:=StrToInt(S[1]+S[2]);
+ M2:=StrToInt(S[4]+S[5]);
+ S3:=StrToInt(S[7]+S[8]);
+ P:=GetSelStart;
+ if P < 3 then IncHour
+ else
+ if P < 6 then IncMin
+ else IncSec;
+ Text:=Format('%2.2d'+ DefaultFormatSettings.TimeSeparator +'%2.2d'+ DefaultFormatSettings.TimeSeparator +'%2.2d', [H1, M2, S3]);
+ SetSelStart(P);
+end;
+
+procedure TCustomRxTimeEdit.WMSetFocus(var Message: TLMSetFocus);
+begin
+ FButton.Visible:=True;
+ inherited;
+end;
+
+procedure TCustomRxTimeEdit.WMKillFocus(var Message: TLMKillFocus);
+begin
+ if FButtonNeedsFocus then
+ FButton.Visible:=False;
+ inherited;
+end;
+
+procedure TCustomRxTimeEdit.SetParent(AParent: TWinControl);
+begin
+ inherited SetParent(AParent);
+ if FButton <> nil then
+ begin
+ DoPositionButton;
+ CheckButtonVisible;
+ end;
+end;
+
+procedure TCustomRxTimeEdit.DoPositionButton;
+begin
+ if FButton = nil then exit;
+ FButton.Parent := Parent;
+ FButton.Visible := Visible;
+ FButton.AnchorToCompanion(akLeft,0,Self);
+// if FButton.Width = 0 then
+ FButton.Width:=26;//Height;
+end;
+
+procedure TCustomRxTimeEdit.UpClick(Sender: TObject);
+begin
+ if not ReadOnly then
+ begin
+ DoChangeValue(1);
+ if Assigned(FOnButtonClick) then
+ FOnButtonClick(Self);
+ end;
+end;
+
+procedure TCustomRxTimeEdit.DownClick(Sender: TObject);
+begin
+ if not ReadOnly then
+ begin
+ DoChangeValue(-1);
+ if Assigned(FOnButtonClick) then
+ FOnButtonClick(Self);
+ end;
+end;
+
+constructor TCustomRxTimeEdit.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FButton := TRxSpinButton.Create(Self);
+ FButton.FocusControl := Self;
+ FButton.Width := Self.Height;
+ FButton.Height := Self.Height;
+ FButton.FreeNotification(Self);
+ FButton.ControlStyle := FButton.ControlStyle + [csNoDesignSelectable];
+ FButton.OnTopClick := @UpClick;
+ FButton.OnBottomClick := @DownClick;
+
+ EditMask:='!#0'+DefaultFormatSettings.TimeSeparator + '00'+DefaultFormatSettings.TimeSeparator + '00;1;_';
+end;
+
+destructor TCustomRxTimeEdit.Destroy;
+begin
+ if FButton <> nil then
+ FreeAndNil(FButton);
+ inherited Destroy;
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxtoolbar.pas b/components/rx/version/v2.2_laz_1.2/rxtoolbar.pas
new file mode 100644
index 000000000..9310af5c6
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxtoolbar.pas
@@ -0,0 +1,1467 @@
+{ rxtoolbar unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit rxtoolbar;
+
+{$I rx.inc}
+
+interface
+
+uses
+ Classes, SysUtils, LCLType, LCLIntf, Buttons, Controls, ExtCtrls, ActnList,
+ PropertyStorage, Menus, Forms, types, Graphics;
+
+const
+ DefButtonWidth = 24;
+ DefButtonHeight = 23;
+const
+ DropDownExtraBtnWidth = 15;
+
+type
+ TToolPanel = class;
+ TToolbarItem = class;
+ TToolbarButtonStyle = (tbrButton, tbrCheck, tbrDropDown, tbrSeparator,
+ tbrDivider, tbrDropDownExtra);
+ TToolBarStyle = (tbsStandart, tbsWindowsXP, tbsNative);
+ TToolButtonAllign = (tbaNone, tbaLeft, tbaRignt);
+
+ TToolPanelOption = (tpFlatBtns, tpTransparentBtns, tpStretchBitmap,
+ tpCustomizable, tpGlyphPopup, tpCaptionPopup);
+ TToolPanelOptions = set of TToolPanelOption;
+
+ { TToolbarButtonActionLink }
+
+ TToolbarButtonActionLink = class(TSpeedButtonActionLink)
+ protected
+ procedure SetImageIndex(Value: Integer); override;
+ function IsImageIndexLinked: Boolean; override;
+ procedure SetEnabled(Value: Boolean); override;
+ procedure SetCaption(const Value: string); override;
+ end;
+
+ TToolbarButtonActionLinkClass = class of TToolbarButtonActionLink;
+
+ { TToolbarButton }
+ TToolbarButton = class(TCustomSpeedButton)
+ private
+ FDesign:boolean;
+ FDesignX,
+ FDesignY:integer;
+ FDrag:boolean;
+ FImageList:TImageList;
+ FImageListSelected:TImageList;
+ FDropDownMenu:TPopupMenu;
+// FShowCaption:boolean;
+ FToolbarButtonStyle:TToolbarButtonStyle;
+ FLastDrawFlagsA:integer;
+ //FAutoSize:boolean;
+ FOwnerItem:TToolbarItem;
+ FFullPush:boolean;
+ function IsDesignMode:boolean;
+ procedure PaintSeparator;
+ protected
+ procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
+ X, Y: Integer); override;
+ procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
+ procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
+ X, Y: Integer); override;
+ procedure MouseLeave; override;
+ procedure Paint; override;
+ procedure Click; override;
+ procedure UpdateState(InvalidateOnChange: boolean); override;
+ procedure SetDesign(AValue:boolean; AToolbarItem:TToolbarItem);
+ //procedure SetAutoSize(AValue:boolean);
+ procedure UpdateSize;
+ procedure SetEnabled(NewEnabled: boolean); override;
+ function GetActionLinkClass: TControlActionLinkClass; override;
+ function GetDrawFlagsA: integer;
+ public
+ procedure SetBounds(aLeft, aTop, aWidth, aHeight: integer); override;
+ destructor Destroy; override;
+ end;
+
+ { TToolbarItem }
+
+ TToolbarItem = class(TCollectionItem)
+ private
+ FButton: TToolbarButton;
+ FSaveLeft:integer;
+// FActionLink:TActionLink;
+ function GetAction: TBasicAction;
+ //function GetAutoSize: boolean;
+ function GetButtonStyle: TToolbarButtonStyle;
+ function GetDropDownMenu: TPopupMenu;
+ function GetGroupIndex: Integer;
+ function GetHeight: Integer;
+ function GetLayout: TButtonLayout;
+ function GetLeft: Integer;
+ function GetShowCaption: boolean;
+ function GetTag: Longint;
+ function GetTop: Integer;
+ function GetVisible: boolean;
+ function GetWidth: Integer;
+// procedure OnActionChanges(Sender: TObject);
+ procedure SetAction(const AValue: TBasicAction);
+ //procedure SetAutoSize(const AValue: boolean);
+ procedure SetButtonStyle(const AValue: TToolbarButtonStyle);
+ procedure SetDropDownMenu(const AValue: TPopupMenu);
+ procedure SetGroupIndex(const AValue: Integer);
+ procedure SetHeight(const AValue: Integer);
+ procedure SetLayout(const AValue: TButtonLayout);
+ procedure SetLeft(const AValue: Integer);
+ procedure SetShowCaption(const AValue: boolean);
+ procedure SetTag(const AValue: Longint);
+ procedure SetTop(const AValue: Integer);
+ procedure SetVisible(const AValue: boolean);
+ procedure SetWidth(const AValue: Integer);
+
+ procedure UpdateLeftAfterLoad;
+ protected
+ function GetDisplayName: string; override;
+ public
+ constructor Create(ACollection: TCollection); override;
+ destructor Destroy; override;
+ published
+ property Action:TBasicAction read GetAction write SetAction;
+ //property AutoSize:boolean read GetAutoSize write SetAutoSize default true;
+ property Visible:boolean read GetVisible write SetVisible;
+ property Left: Integer read GetLeft write SetLeft;
+ property Height: Integer read GetHeight write SetHeight;
+ property Top: Integer read GetTop write SetTop;
+ property Width: Integer read GetWidth write SetWidth;
+ property DropDownMenu: TPopupMenu read GetDropDownMenu write SetDropDownMenu;
+ property ShowCaption:boolean read GetShowCaption write SetShowCaption;
+ property GroupIndex: Integer read GetGroupIndex write SetGroupIndex default 0;
+ property Layout: TButtonLayout read GetLayout write SetLayout default blGlyphLeft;
+ property ButtonStyle:TToolbarButtonStyle read GetButtonStyle write SetButtonStyle default tbrButton;
+ property Tag: Longint read GetTag write SetTag default 0;
+ end;
+
+ { TToolbarItems }
+
+ TToolbarItems = class(TOwnedCollection)
+ private
+ FToolPanel:TToolPanel;
+ function GetByActionName(ActionName: string): TToolbarItem;
+ function GetToolbarItem(Index: Integer): TToolbarItem;
+ procedure SetToolbarItem(Index: Integer; const AValue: TToolbarItem);
+ public
+ constructor Create(ToolPanel: TToolPanel);
+ property Items[Index: Integer]: TToolbarItem read GetToolbarItem write SetToolbarItem; default;
+ property ByActionName[ActionName:string]:TToolbarItem read GetByActionName;
+ end;
+
+ { TToolPanel }
+
+ TToolPanel = class(TCustomPanel)
+ private
+ FButtonAllign: TToolButtonAllign;
+ FImageList: TImageList;
+ FImageListSelected: TImageList;
+ FOptions: TToolPanelOptions;
+ FPropertyStorageLink:TPropertyStorageLink;
+ FToolbarItems:TToolbarItems;
+ FDefButtonWidth:integer;
+ FDefButtonHeight:integer;
+ FToolBarStyle: TToolBarStyle;
+ FVersion: Integer;
+ FArrowBmp:TBitmap;
+ function GetBtnHeight: Integer;
+ function GetBtnWidth: Integer;
+ function GetItems: TToolbarItems;
+ function GetPropertyStorage: TCustomPropertyStorage;
+ procedure SetBtnHeight(const AValue: Integer);
+ procedure SetBtnWidth(const AValue: Integer);
+ procedure SetButtonAllign(const AValue: TToolButtonAllign);
+ procedure SetImageList(const AValue: TImageList);
+ procedure SetImageListSelected(const AValue: TImageList);
+ procedure SetItems(const AValue: TToolbarItems);
+ procedure SetOptions(const AValue: TToolPanelOptions);
+ procedure SetPropertyStorage(const AValue: TCustomPropertyStorage);
+ procedure OnIniSave(Sender: TObject);
+ procedure OnIniLoad(Sender: TObject);
+ procedure SetToolBarStyle(const AValue: TToolBarStyle);
+ procedure ReAlignToolBtn;
+ protected
+ FCustomizer:TForm;
+ procedure Notification(AComponent: TComponent;
+ Operation: TOperation); override;
+ procedure SetCustomizing(AValue:boolean);
+ procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
+ X, Y: Integer); override;
+ procedure RequestAlign; override;
+ procedure Loaded; override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure Customize(HelpCtx: Longint);
+ procedure SetBounds(aLeft, aTop, aWidth, aHeight: integer); override;
+ published
+ property Items:TToolbarItems read GetItems write SetItems;
+ property ImageList:TImageList read FImageList write SetImageList;
+ property ImageListSelected:TImageList read FImageListSelected write SetImageListSelected;
+ property PropertyStorage:TCustomPropertyStorage read GetPropertyStorage write SetPropertyStorage;
+ property BtnWidth: Integer read GetBtnWidth write SetBtnWidth default DefButtonWidth;
+ property BtnHeight: Integer read GetBtnHeight write SetBtnHeight default DefButtonHeight;
+ property ToolBarStyle:TToolBarStyle read FToolBarStyle write SetToolBarStyle default tbsStandart;
+ property Options:TToolPanelOptions read FOptions write SetOptions;
+ property Version: Integer read FVersion write FVersion default 0;
+ property ButtonAllign:TToolButtonAllign read FButtonAllign write SetButtonAllign default tbaLeft;
+
+ property Align;
+ property Alignment;
+ property Anchors;
+ //property AutoSize;
+ property BorderSpacing;
+ property BevelInner;
+ property BevelOuter;
+ property BevelWidth;
+ property BorderWidth;
+ property BorderStyle;
+ property ChildSizing;
+ property ClientHeight;
+ property ClientWidth;
+ property Color;
+ property Constraints;
+ property DragMode;
+ property Enabled;
+ property Font;
+ property FullRepaint;
+ property ParentColor;
+ property ParentFont;
+ property ParentShowHint;
+ property PopupMenu;
+ property ShowHint;
+ property TabOrder;
+ property TabStop;
+ property Visible;
+ property OnClick;
+ property OnDblClick;
+ property OnDragDrop;
+ property OnDragOver;
+ property OnEndDrag;
+ property OnEnter;
+ property OnExit;
+ property OnMouseDown;
+ property OnMouseMove;
+ property OnMouseUp;
+ property OnMouseWheel;
+ property OnMouseWheelDown;
+ property OnMouseWheelUp;
+ property OnResize;
+ property OnStartDrag;
+ end;
+
+implementation
+uses Math, RxTBRSetup, LCLProc, vclutils, Dialogs, typinfo, rxdconst, GraphType,
+ LResources;
+
+const
+ BtnAl2Align:array [TToolButtonAllign] of TAlign = (alNone, alLeft, alRight);
+
+{ TToolbarButton }
+
+function TToolbarButton.IsDesignMode: boolean;
+begin
+ Result:=(Assigned(Parent) and (csDesigning in Parent.ComponentState)) or (FDesign);
+end;
+
+procedure TToolbarButton.PaintSeparator;
+var
+ PaintRect: TRect;
+ X, H:integer;
+begin
+ PaintRect:=ClientRect;
+ Canvas.Brush.Color := Color;
+ Canvas.FillRect(PaintRect);
+ if FToolbarButtonStyle = tbrSeparator then
+ begin
+ X:=Width div 2 - 1;
+ H:=TToolPanel(Parent).Height;
+ if X>0 then
+ begin
+ Canvas.Pen.Color:=clBtnShadow;
+ Canvas.Line(X, 1, X, H);
+ Canvas.Pen.Color:=clWindow;
+ Canvas.Line(X+1, 1, X+1, H);
+ end;
+ end;
+end;
+
+procedure TToolbarButton.MouseDown(Button: TMouseButton; Shift: TShiftState; X,
+ Y: Integer);
+begin
+ if IsDesignMode then
+ begin
+ FDrag:=true;
+ FDesignX:=Max(X-1, 1);
+ FDesignY:=Max(Y-1, 1);
+ end
+ else
+ begin
+ FFullPush:=X < (Width - DropDownExtraBtnWidth - 5);
+ inherited MouseDown(Button, Shift, X, Y);
+ end;
+end;
+
+procedure TToolbarButton.MouseMove(Shift: TShiftState; X, Y: Integer);
+begin
+ if IsDesignMode and FDrag then
+ begin
+ Top:=Max(0, Min(Y+Top-FDesignY, Parent.Height - Height));
+ Left:=Max(0, Min(X+Left-FDesignX, Parent.Width - Width));
+ end
+ else
+ begin
+// FFullPuch:=(X-Left) < (Width - DropDownExtraBtnWidth);
+ inherited MouseMove(Shift, X, Y);
+ end
+end;
+
+procedure TToolbarButton.MouseUp(Button: TMouseButton; Shift: TShiftState; X,
+ Y: Integer);
+begin
+ if IsDesignMode then
+ begin
+ FDrag:=false;
+ Top:=4;
+ end
+ else
+ inherited MouseUp(Button, Shift, X, Y);
+end;
+
+procedure TToolbarButton.MouseLeave;
+begin
+ inherited MouseLeave;
+ FFullPush:=true;
+end;
+
+procedure TToolbarButton.Paint;
+var
+ PaintRect, PaintRect1: TRect;
+ GlyphWidth, GlyphHeight: Integer;
+ Offset, OffsetCap: TPoint;
+ ClientSize, TotalSize, TextSize: TSize;
+ //BrushStyle : TBrushStyle;
+ M, S : integer;
+ TXTStyle : TTextStyle;
+ SIndex : Longint;
+ TMP : String;
+begin
+ if FToolbarButtonStyle in [tbrSeparator, tbrDivider] then
+ begin
+ PaintSeparator;
+ exit;
+ end;
+ inherited Paint;
+
+ UpdateState(false);
+ if (not Assigned(Action)) or (TToolbarItems(FOwnerItem.Collection).FToolPanel.FToolBarStyle = tbsNative) then
+ exit;
+
+ PaintRect:=ClientRect;
+ if (Action is TCustomAction) and Assigned(FImageList) and
+ (TCustomAction(Action).ImageIndex>-1) and
+ (TCustomAction(Action).ImageIndex < FImageList.Count) then
+ begin
+
+ FLastDrawFlagsA:=GetDrawFlagsA;
+// FLastDrawFlagsA:=GetDrawDetails;
+
+ if not Transparent then
+ begin
+ Canvas.Brush.Color := Color;
+ Canvas.FillRect(PaintRect);
+ end;
+
+ if FLastDrawFlagsA <> 0 then
+ begin
+ if TToolbarItems(FOwnerItem.Collection).FToolPanel.FToolBarStyle = tbsWindowsXP then
+ begin
+
+ if FToolbarButtonStyle = tbrDropDownExtra then
+ begin
+ PaintRect1:=PaintRect;
+ Dec(PaintRect1.Right, DropDownExtraBtnWidth);
+ if FFullPush then
+ begin
+ DrawButtonFrameXP(Canvas, PaintRect1, (FLastDrawFlagsA and DFCS_PUSHED) <> 0,
+ (FLastDrawFlagsA and DFCS_FLAT) <> 0);
+ end
+ else
+ DrawButtonFrameXP(Canvas, PaintRect1, false,
+ (FLastDrawFlagsA and DFCS_FLAT) <> 0);
+ ;
+
+ PaintRect1:=PaintRect;
+ PaintRect1.Left:=PaintRect1.Right - DropDownExtraBtnWidth;
+ DrawButtonFrameXP(Canvas, PaintRect1, (FLastDrawFlagsA and DFCS_PUSHED) <> 0,
+ (FLastDrawFlagsA and DFCS_FLAT) <> 0);
+ end
+ else
+ DrawButtonFrameXP(Canvas, PaintRect, (FLastDrawFlagsA and DFCS_PUSHED) <> 0,
+ (FLastDrawFlagsA and DFCS_FLAT) <> 0)
+ end
+ else
+ begin
+ if FToolbarButtonStyle = tbrDropDownExtra then
+ begin
+ PaintRect1:=PaintRect;
+ Dec(PaintRect1.Right, DropDownExtraBtnWidth);
+
+ if FFullPush then
+ begin
+ DrawButtonFrame(Canvas, PaintRect1, (FLastDrawFlagsA and DFCS_PUSHED) <> 0,
+ (FLastDrawFlagsA and DFCS_FLAT) <> 0);
+ end
+ else
+ begin
+ DrawButtonFrame(Canvas, PaintRect1, false,
+ (FLastDrawFlagsA and DFCS_FLAT) <> 0);
+ end;
+
+ PaintRect1:=PaintRect;
+ PaintRect1.Left:=PaintRect1.Right - DropDownExtraBtnWidth;
+ DrawButtonFrame(Canvas, PaintRect1, (FLastDrawFlagsA and DFCS_PUSHED) <> 0,
+ (FLastDrawFlagsA and DFCS_FLAT) <> 0);
+ end
+ else
+ DrawButtonFrame(Canvas, PaintRect, (FLastDrawFlagsA and DFCS_PUSHED) <> 0,
+ (FLastDrawFlagsA and DFCS_FLAT) <> 0);
+ end;
+ end;
+
+ if FToolbarButtonStyle = tbrDropDownExtra then
+ begin
+ Canvas.Draw(PaintRect.Right - 10, Height div 2, TToolbarItems(FOwnerItem.Collection).FToolPanel.FArrowBmp);
+ Dec(PaintRect.Right, DropDownExtraBtnWidth);
+ end;
+
+ GlyphWidth:= FImageList.Width;
+ GlyphHeight:=FImageList.Height;
+
+ ClientSize.cx:= PaintRect.Right - PaintRect.Left;
+ ClientSize.cy:= PaintRect.Bottom - PaintRect.Top;
+
+ if (Caption <> '') and ShowCaption then
+ begin
+ TMP := Caption;
+ SIndex := DeleteAmpersands(TMP);
+ TextSize:= Canvas.TextExtent(TMP);
+(* If SIndex > 0 then
+ If SIndex <= Length(TMP) then
+ begin
+ FShortcut := Ord(TMP[SIndex]);
+ end;*)
+ end
+ else
+ begin
+ TextSize.cx:= 0;
+ TextSize.cy:= 0;
+ end;
+
+ if (GlyphWidth = 0) or (GlyphHeight = 0) or (TextSize.cx = 0) or (TextSize.cy = 0) then
+ S:= 0
+ else
+ S:= Spacing;
+
+ // Calculate caption and glyph layout
+
+ if Margin = -1 then
+ begin
+ if S = -1 then
+ begin
+ TotalSize.cx:= TextSize.cx + GlyphWidth;
+ TotalSize.cy:= TextSize.cy + GlyphHeight;
+ if Layout in [blGlyphLeft, blGlyphRight] then
+ M:= (ClientSize.cx - TotalSize.cx) div 3
+ else
+ M:= (ClientSize.cy - TotalSize.cy) div 3;
+ S:= M;
+ end
+ else
+ begin
+ TotalSize.cx:= GlyphWidth + S + TextSize.cx;
+ TotalSize.cy:= GlyphHeight + S + TextSize.cy;
+ if Layout in [blGlyphLeft, blGlyphRight] then
+ M:= (ClientSize.cx - TotalSize.cx + 1) div 2
+ else
+ M:= (ClientSize.cy - TotalSize.cy + 1) div 2
+ end;
+ end
+ else
+ begin
+ if S = -1 then
+ begin
+ TotalSize.cx:= ClientSize.cx - (Margin + GlyphWidth);
+ TotalSize.cy:= ClientSize.cy - (Margin + GlyphHeight);
+ if Layout in [blGlyphLeft, blGlyphRight] then
+ S:= (TotalSize.cx - TextSize.cx) div 2
+ else
+ S:= (TotalSize.cy - TextSize.cy) div 2;
+ end;
+ M:= Margin
+ end;
+
+ case Layout of
+ blGlyphLeft :
+ begin
+ Offset.X:= M;
+ Offset.Y:= (ClientSize.cy - GlyphHeight + 1) div 2;
+ OffsetCap.X:= Offset.X + GlyphWidth + S;
+ OffsetCap.Y:= (ClientSize.cy - TextSize.cy) div 2;
+ end;
+ blGlyphRight : begin
+ Offset.X:= ClientSize.cx - M - GlyphWidth;
+ Offset.Y:= (ClientSize.cy - GlyphHeight + 1) div 2;
+ OffsetCap.X:= Offset.X - S - TextSize.cx;
+ OffsetCap.Y:= (ClientSize.cy - TextSize.cy) div 2;
+ end;
+ blGlyphTop : begin
+ Offset.X:= (ClientSize.cx - GlyphWidth + 1) div 2;
+ Offset.Y:= M;
+ OffsetCap.X:= (ClientSize.cx - TextSize.cx + 1) div 2;
+ OffsetCap.Y:= Offset.Y + GlyphHeight + S;
+ end;
+ blGlyphBottom : begin
+ Offset.X:= (ClientSize.cx - GlyphWidth + 1) div 2;
+ Offset.Y:= ClientSize.cy - M - GlyphHeight;
+ OffsetCap.X:= (ClientSize.cx - TextSize.cx + 1) div 2;
+ OffsetCap.Y:= Offset.Y - S - TextSize.cy;
+ end;
+ end;
+
+ if ((FLastDrawFlagsA and DFCS_FLAT) <> 0) and ((FLastDrawFlagsA and DFCS_PUSHED) = 0)
+ and (tpGlyphPopup in TToolbarItems(FOwnerItem.Collection).FToolPanel.Options) and FFullPush then
+ begin
+// FImageList.Draw(Canvas, Offset.X, Offset.Y, TCustomAction(Action).ImageIndex, false);
+ FImageList.Draw(Canvas, Offset.X, Offset.Y, TCustomAction(Action).ImageIndex, gdeShadowed);
+ Dec(Offset.X, 2);
+ Dec(Offset.Y, 2);
+ end;
+
+ if Assigned(FImageListSelected) and (FImageListSelected.Count>TCustomAction(Action).ImageIndex) and
+ ((FLastDrawFlagsA and DFCS_FLAT) <> 0) and ((FLastDrawFlagsA and DFCS_PUSHED) = 0) then
+ FImageListSelected.Draw(Canvas, Offset.X, Offset.Y, TCustomAction(Action).ImageIndex, TCustomAction(Action).Enabled)
+ else
+ FImageList.Draw(Canvas, Offset.X, Offset.Y, TCustomAction(Action).ImageIndex, TCustomAction(Action).Enabled);
+ end;
+ if (Caption <> '') and ShowCaption then
+ begin
+ TXTStyle := Canvas.TextStyle;
+ TXTStyle.Opaque := False;
+ TXTStyle.Clipping := True;
+ TXTStyle.ShowPrefix := True;
+ TXTStyle.Alignment := taLeftJustify;
+ TXTStyle.Layout := tlTop;
+ TXTStyle.SystemFont := Canvas.Font.IsDefault;//Match System Default Style
+ With PaintRect, OffsetCap do
+ begin
+ Left := Left + X;
+ Top := Top + Y;
+ end;
+ If not Enabled then
+ begin
+ Canvas.Font.Color := clBtnHighlight;
+ OffsetRect(PaintRect, 1, 1);
+ Canvas.TextRect(PaintRect, PaintRect.Left, PaintRect.Top, Caption, TXTStyle);
+ Canvas.Font.Color := clBtnShadow;
+ OffsetRect(PaintRect, -1, -1);
+ end
+ else
+ begin
+ Canvas.Font.Color := clWindowText;
+ if ((FLastDrawFlagsA and DFCS_FLAT) <> 0) and ((FLastDrawFlagsA and DFCS_PUSHED) = 0) and (TToolPanel(Parent).FToolBarStyle <> tbsWindowsXP)
+ and (tpCaptionPopup in TToolbarItems(FOwnerItem.Collection).FToolPanel.Options) then
+ OffsetRect(PaintRect, -2, -2);
+ end;
+ Canvas.TextRect(PaintRect, PaintRect.Left, PaintRect.Top, Caption, TXTStyle);
+
+ end;
+end;
+
+procedure TToolbarButton.Click;
+var
+ P:TPoint;
+begin
+ if (csDesigning in ComponentState) or FDesign then exit;
+ if FToolbarButtonStyle = tbrDropDown then
+ begin
+ if Assigned(FDropDownMenu) then
+ begin
+ P.X:=0;
+ P.Y:=Height;
+ P:=ClientToScreen(P);
+ FDropDownMenu.PopUp(P.X, P.Y);
+ end;
+ end
+ else
+ if (FToolbarButtonStyle = tbrDropDownExtra) and (not FFullPush) then
+ begin
+ if Assigned(FDropDownMenu) then
+ begin
+ P.X:=Width - DropDownExtraBtnWidth;
+ P.Y:=Height;
+ P:=ClientToScreen(P);
+ FDropDownMenu.PopUp(P.X, P.Y);
+ end;
+ end
+ else
+ inherited Click;
+end;
+
+procedure TToolbarButton.UpdateState(InvalidateOnChange: boolean);
+var
+ OldState: TButtonState;
+begin
+ OldState:=FState;
+ inherited UpdateState(InvalidateOnChange);
+ if InvalidateOnChange and ((FState<>OldState) or (FLastDrawFlagsA<>GetDrawFlagsA)) then
+ Invalidate;
+end;
+
+procedure TToolbarButton.SetDesign(AValue:boolean; AToolbarItem:TToolbarItem);
+begin
+ FDesign:=AValue;
+ if FDesign then
+ begin
+ Enabled:=true;
+ Flat:=false;
+ end
+ else
+ begin
+ Flat:=tpFlatBtns in TToolbarItems(AToolbarItem.Collection).FToolPanel.Options;
+ ActionChange(Action, true);
+ end;
+end;
+
+{
+procedure TToolbarButton.SetAutoSize(AValue: boolean);
+begin
+ FAutoSize:=AValue;
+ if csLoading in ComponentState then exit;
+ UpdateSize;
+ //Invalidate;
+end;
+}
+procedure TToolbarButton.UpdateSize;
+var
+ AWidth:integer;
+begin
+{ if csLoading in TToolbarItems(FOwnerItem.Collection).FToolPanel.ComponentState then exit;
+
+ if Assigned(TToolbarItems(FOwnerItem.Collection).FToolPanel.FImageList) then
+ begin
+ AWidth:=TToolbarItems(FOwnerItem.Collection).FToolPanel.FImageList.Width + 8;
+ if ShowCaption then
+ AWidth:= AWidth + Canvas.TextWidth(Caption) + Spacing;
+ end
+ else
+ AWidth:=Canvas.TextWidth(Caption);}
+
+ SetBounds(Left, Top, Width, Height);
+ Invalidate;
+end;
+
+procedure TToolbarButton.SetEnabled(NewEnabled: boolean);
+begin
+ if FToolbarButtonStyle = tbrDropDown then
+ NewEnabled :=true;
+ if (not NewEnabled) and Enabled then
+ begin
+ FState := bsDisabled;
+ MouseLeave;
+// Flat:=false;
+ end;
+ inherited SetEnabled(NewEnabled);
+end;
+
+function TToolbarButton.GetActionLinkClass: TControlActionLinkClass;
+begin
+ Result:=TToolbarButtonActionLink;
+end;
+
+function TToolbarButton.GetDrawFlagsA: integer;
+begin
+ // if flat and not mouse in control and not down, don't draw anything
+ if (Flat and not MouseInControl and not (FState in [bsDown, bsExclusive])) or (not Enabled) then
+ begin
+ Result := 0;
+ end
+ else
+ begin
+ Result:=DFCS_BUTTONPUSH;
+ if FState in [bsDown, bsExclusive] then
+ inc(Result,DFCS_PUSHED);
+ if not Enabled then
+ inc(Result,DFCS_INACTIVE);
+ if Flat then
+ inc(Result,DFCS_FLAT);
+ end;
+end;
+
+
+procedure TToolbarButton.SetBounds(aLeft, aTop, aWidth, aHeight: integer);
+var
+ TextSize:TSize;
+ ImgH, ImgW:integer;
+ tmpCanvas: TCanvas;
+begin
+ if Assigned(Parent) and not (csLoading in TToolPanel(Parent).ComponentState) then
+ begin
+ if FToolbarButtonStyle in [tbrSeparator, tbrDivider] then
+ begin
+ aWidth:=7;
+ if Assigned(FImageList) then
+ aHeight:=FImageList.Height+8
+ else
+ aHeight:=TToolPanel(Parent).BtnHeight;
+ end
+ else
+ //if FAutoSize and Assigned(Canvas) then
+ begin
+ if Assigned(FImageList) then
+ begin
+ ImgW:=FImageList.Width+8;
+ ImgH:=FImageList.Height+8;
+ end
+ else
+ begin
+ ImgH:=TToolPanel(Parent).BtnHeight;
+ ImgW:=TToolPanel(Parent).BtnWidth;
+ end;
+
+ if FToolbarButtonStyle = tbrDropDownExtra then
+ begin
+ ImgW:=ImgW + DropDownExtraBtnWidth;
+ end;
+
+ if aLeft < TToolPanel(Parent).BorderWidth then
+ aLeft:=TToolPanel(Parent).BorderWidth;
+
+ if ShowCaption then
+ begin
+ tmpCanvas := GetWorkingCanvas(Canvas);
+
+ try
+ TextSize:=tmpCanvas.TextExtent(Caption);
+ if (Layout in [blGlyphLeft, blGlyphRight]) and Assigned(FImageList) then
+ begin
+ aWidth:=ImgW + 4 + TextSize.cx;
+ aHeight:=Max(TextSize.cy + 8, ImgH);
+ end
+ else
+ begin
+ aWidth:=Max(8 + TextSize.cx, ImgW);
+ aHeight:=ImgH + TextSize.cy + 4;
+ end;
+ if aHeight < TToolPanel(Parent).BtnHeight then
+ aHeight:=TToolPanel(Parent).BtnHeight;
+ finally
+ if TmpCanvas<>Canvas then
+ FreeWorkingCanvas(tmpCanvas);
+ end;
+ end
+ else
+ begin
+ aWidth:=Max(ImgW, TToolPanel(Parent).BtnWidth);
+ aHeight:=Max(ImgH, TToolPanel(Parent).BtnHeight);;
+ end;
+ end;
+ // if IsDesignMode then
+ aTop:=TToolPanel(Parent).BorderWidth;
+
+ end;
+ inherited SetBounds(aLeft, aTop, aWidth, aHeight);
+end;
+
+destructor TToolbarButton.Destroy;
+begin
+ if Assigned(FOwnerItem) then
+ begin
+ FOwnerItem.FButton:=nil;
+ FOwnerItem.Free;
+ end;
+ inherited Destroy;
+end;
+
+
+{ TToolbarItems }
+
+function TToolbarItems.GetToolbarItem(Index: Integer): TToolbarItem;
+begin
+ result := TToolbarItem( inherited Items[Index] );
+end;
+
+function TToolbarItems.GetByActionName(ActionName: string): TToolbarItem;
+var
+ i:integer;
+begin
+ Result:=nil;
+ for i:=0 to Count-1 do
+ if Assigned(Items[i].Action) and (Items[i].Action.Name = ActionName) then
+ begin
+ Result:=Items[i];
+ end;
+end;
+
+procedure TToolbarItems.SetToolbarItem(Index: Integer;
+ const AValue: TToolbarItem);
+begin
+ Items[Index].Assign( AValue );
+end;
+
+constructor TToolbarItems.Create(ToolPanel: TToolPanel);
+begin
+ inherited Create(ToolPanel, TToolbarItem);
+ FToolPanel:=ToolPanel;
+end;
+
+{ TToolPanel }
+
+function TToolPanel.GetItems: TToolbarItems;
+begin
+ Result:=FToolbarItems;
+end;
+
+function TToolPanel.GetBtnHeight: Integer;
+begin
+ Result:=FDefButtonHeight;
+end;
+
+function TToolPanel.GetBtnWidth: Integer;
+begin
+ Result:=FDefButtonWidth;
+end;
+
+function TToolPanel.GetPropertyStorage: TCustomPropertyStorage;
+begin
+ Result:=FPropertyStorageLink.Storage;
+end;
+
+procedure TToolPanel.SetBtnHeight(const AValue: Integer);
+var
+ i:integer;
+begin
+ if FDefButtonHeight<>AValue then
+ begin
+ FDefButtonHeight:=AValue;
+ if csLoading in ComponentState then exit;
+
+ for i:=0 to FToolbarItems.Count - 1 do
+ FToolbarItems[i].FButton.UpdateSize;
+ end;
+end;
+
+procedure TToolPanel.SetBtnWidth(const AValue: Integer);
+var
+ i:integer;
+begin
+ if FDefButtonWidth<>AValue then
+ begin
+ FDefButtonWidth:=AValue;
+ if csLoading in ComponentState then exit;
+
+ for i:=0 to FToolbarItems.Count - 1 do
+ FToolbarItems[i].FButton.UpdateSize;
+ end;
+end;
+
+procedure TToolPanel.SetButtonAllign(const AValue: TToolButtonAllign);
+var
+ i:integer;
+begin
+ if FButtonAllign=AValue then exit;
+ FButtonAllign:=AValue;
+
+ if not (csLoading in ComponentState) then
+ for i:=0 to FToolbarItems.Count - 1 do
+ begin
+// if Assigned(FToolbarItems[i]) then
+// if Assigned(FToolbarItems[i].FButton) then
+ FToolbarItems[i].FButton.Align:=BtnAl2Align[AValue];
+ end;
+end;
+
+procedure TToolPanel.SetImageList(const AValue: TImageList);
+var
+ i:integer;
+begin
+ if FImageList=AValue then exit;
+ FImageList:=AValue;
+ for i:=0 to FToolbarItems.Count - 1 do
+ FToolbarItems[i].FButton.FImageList:=AValue;
+
+ ReAlignToolBtn;
+end;
+
+procedure TToolPanel.SetImageListSelected(const AValue: TImageList);
+var
+ i:integer;
+begin
+ if FImageListSelected=AValue then exit;
+ FImageListSelected:=AValue;
+ for i:=0 to FToolbarItems.Count - 1 do
+ FToolbarItems[i].FButton.FImageListSelected:=AValue;
+end;
+
+procedure TToolPanel.SetItems(const AValue: TToolbarItems);
+begin
+ FToolbarItems.Assign(AValue);
+end;
+
+procedure TToolPanel.SetOptions(const AValue: TToolPanelOptions);
+var
+ i:integer;
+begin
+ if FOptions=AValue then exit;
+ FOptions:=AValue;
+
+ for i:=0 to FToolbarItems.Count - 1 do
+ begin
+ FToolbarItems[i].FButton.Transparent:=tpTransparentBtns in FOptions;
+ FToolbarItems[i].FButton.Flat:=tpFlatBtns in FOptions;
+ end;
+
+ Invalidate;
+end;
+
+procedure TToolPanel.SetPropertyStorage(const AValue: TCustomPropertyStorage);
+begin
+ FPropertyStorageLink.Storage:=AValue;
+end;
+
+
+procedure TToolPanel.OnIniSave(Sender: TObject);
+var
+ i:integer;
+ S, S1:string;
+ tpo:TToolPanelOptions;
+ tpo1:integer absolute tpo;
+begin
+ S:=Owner.Name+'.'+Name;
+ FPropertyStorageLink.Storage.WriteInteger(S+sVersion, FVersion);
+ FPropertyStorageLink.Storage.WriteInteger(S+sShowHint, ord(ShowHint));
+ tpo:=FOptions;
+ FPropertyStorageLink.Storage.WriteString(S+sOptions, SetToString(GetPropInfo(Self, 'Options'), tpo1));
+ FPropertyStorageLink.Storage.WriteString(S+sToolBarStyle, GetEnumProp(Self, 'ToolBarStyle'));
+ FPropertyStorageLink.Storage.WriteString(S+sButtonAllign, GetEnumProp(Self, 'ButtonAllign'));
+ FPropertyStorageLink.Storage.WriteInteger(S+sCount, FToolbarItems.Count);
+ S:=S+sItem;
+ for i:=0 to FToolbarItems.Count-1 do
+ begin
+ S1:=S+IntToStr(i);
+ if Assigned(FToolbarItems[i].Action) then
+ begin
+ FPropertyStorageLink.Storage.WriteString(S1+sAction, FToolbarItems[i].Action.Name);
+ FPropertyStorageLink.Storage.WriteInteger(S1+sVisible, ord(FToolbarItems[i].Visible));
+ FPropertyStorageLink.Storage.WriteInteger(S1+sShowCaption, ord(FToolbarItems[i].ShowCaption));
+ FPropertyStorageLink.Storage.WriteInteger(S1+sTop, FToolbarItems[i].Top);
+ FPropertyStorageLink.Storage.WriteInteger(S1+sLeft, FToolbarItems[i].Left);
+ FPropertyStorageLink.Storage.WriteInteger(S1+sWidth, FToolbarItems[i].Width);
+ end;
+ end;
+end;
+
+procedure TToolPanel.OnIniLoad(Sender: TObject);
+var
+ i, ACount:integer;
+ S, S1, AActionName, S2:string;
+ AItem:TToolbarItem;
+ tpo:TToolPanelOptions;
+ tpo1:integer absolute tpo;
+begin
+ S:=Owner.Name+'.'+Name;
+ ACount:=FPropertyStorageLink.Storage.ReadInteger(S+sVersion, FVersion); //Check cfg version
+ if ACount = FVersion then
+ begin
+ ShowHint:=FPropertyStorageLink.Storage.ReadInteger(S+sShowHint, ord(ShowHint))<>0;
+
+ tpo:=FOptions;
+ tpo1:=StringToSet(GetPropInfo(Self, 'Options'), FPropertyStorageLink.Storage.ReadString(S+sOptions, SetToString(GetPropInfo(Self, 'Options'), tpo1)));
+ SetOptions(tpo);
+
+ SetEnumProp(Self, 'ToolBarStyle', FPropertyStorageLink.Storage.ReadString(S+sToolBarStyle, GetEnumProp(Self, 'ToolBarStyle')));
+ SetEnumProp(Self, 'ButtonAllign', FPropertyStorageLink.Storage.ReadString(S+sButtonAllign, GetEnumProp(Self, 'ButtonAllign')));
+
+ ACount:=FPropertyStorageLink.Storage.ReadInteger(S+sCount, 0);
+ S:=S+sItem;
+ for i:=0 to ACount-1 do
+ begin
+ S1:=S+IntToStr(i);
+ AActionName:=FPropertyStorageLink.Storage.ReadString(S1+sAction, '');
+ AItem:=FToolbarItems.ByActionName[AActionName];
+ if Assigned(AItem) then
+ begin
+ AItem.Top:=FPropertyStorageLink.Storage.ReadInteger(S1+sTop, AItem.Top);
+ AItem.Left:=FPropertyStorageLink.Storage.ReadInteger(S1+sLeft, AItem.Left);
+ AItem.Width:=FPropertyStorageLink.Storage.ReadInteger(S1+sWidth, AItem.Width);
+ AItem.Visible:=FPropertyStorageLink.Storage.ReadInteger(S1+sVisible, ord(AItem.Visible)) <> 0;
+ AItem.ShowCaption:=FPropertyStorageLink.Storage.ReadInteger(S1+sShowCaption, ord(AItem.ShowCaption)) <> 0;
+ end;
+ end;
+ end;
+ Invalidate;
+end;
+
+procedure TToolPanel.SetToolBarStyle(const AValue: TToolBarStyle);
+begin
+ if FToolBarStyle=AValue then exit;
+ FToolBarStyle:=AValue;
+{
+ if FToolBarStyle = tbsNative then
+ BorderWidth:=1
+ else
+ BorderWidth:=4;
+}
+ if FToolBarStyle = tbsWindowsXP then
+ begin
+ BorderWidth:=4;
+ SetOptions(FOptions + [tpFlatBtns]);
+ end
+ else
+ begin
+ BorderWidth:=1
+ end;
+ Invalidate;
+end;
+
+procedure TToolPanel.ReAlignToolBtn;
+var
+ i, L:integer;
+begin
+ L:=BorderWidth;
+ for i:=0 to FToolbarItems.Count - 1 do
+ begin
+ FToolbarItems[i].FButton.Left:=L;
+ FToolbarItems[i].FButton.UpdateSize;
+ L:=L + FToolbarItems[i].FButton.Width;
+ end;
+end;
+
+procedure TToolPanel.Notification(AComponent: TComponent; Operation: TOperation);
+var
+ i:integer;
+begin
+ inherited Notification(AComponent, Operation);
+ if Operation = opRemove then
+ begin
+ if AComponent = FImageList then
+ SetImageList(nil)
+ else
+ if AComponent is TPopupMenu then
+ begin
+ for i:=0 to FToolbarItems.Count - 1 do
+ if FToolbarItems[i].DropDownMenu = AComponent then
+ FToolbarItems[i].DropDownMenu:=nil;
+ end
+ else
+ if AComponent is TBasicAction then
+ begin
+ for i:=0 to FToolbarItems.Count - 1 do
+ if FToolbarItems[i].Action = AComponent then
+ FToolbarItems[i].Action:=nil;
+ end;
+ end;
+end;
+
+procedure TToolPanel.SetCustomizing(AValue: boolean);
+var
+ i:integer;
+begin
+ for i:=0 to FToolbarItems.Count - 1 do
+ FToolbarItems[i].FButton.SetDesign(AValue, FToolbarItems[i]);
+end;
+
+procedure TToolPanel.MouseUp(Button: TMouseButton; Shift: TShiftState; X,
+ Y: Integer);
+begin
+ inherited MouseUp(Button, Shift, X, Y);
+ if (Button = mbRight) and (ssCtrl in Shift) and (tpCustomizable in FOptions) then
+ Customize(HelpContext);
+end;
+
+procedure TToolPanel.RequestAlign;
+{var
+ i, L:integer;}
+begin
+ inherited RequestAlign;
+ if (Parent = nil) or (csDestroying in ComponentState) or (csLoading in ComponentState) {or (not Parent.HandleAllocated) }then
+ exit;
+// if not Parent.HandleAllocated then exit;
+// ReAlignToolBtn;}
+end;
+
+procedure TToolPanel.Loaded;
+var
+ i, L:integer;
+ B:TToolbarItem;
+begin
+{ if csDesigning in ComponentState then
+ begin
+ for i:=0 to FToolbarItems.Count - 1 do
+ FToolbarItems[i].UpdateLeftAfterLoad;
+ end; }
+ inherited Loaded;
+ for i:=0 to FToolbarItems.Count - 1 do
+ begin
+ B:=FToolbarItems[i];
+ B.UpdateLeftAfterLoad;
+ B.FButton.Align:=BtnAl2Align[FButtonAllign];
+ end;
+ SetCustomizing(false);
+ //ReAlignToolBtn;
+end;
+
+constructor TToolPanel.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FArrowBmp:=CreateArrowBitmap;
+ AutoSize:=false;
+ FButtonAllign:=tbaLeft;
+ FToolbarItems:=TToolbarItems.Create(Self);
+ if Assigned(AOwner) and not (csLoading in AOwner.ComponentState) then
+ Align:=alTop;
+ Height:=DefButtonHeight;
+ FPropertyStorageLink:=TPropertyStorageLink.Create;
+ FPropertyStorageLink.OnSave:=@OnIniSave;
+ FPropertyStorageLink.OnLoad:=@OnIniLoad;
+ FDefButtonWidth:=DefButtonWidth;
+ FDefButtonHeight:=DefButtonHeight;
+ FToolBarStyle:=tbsStandart;
+ BorderWidth:=4;
+ ControlStyle:=ControlStyle - [csSetCaption] + [csAcceptsControls];
+ Caption:='';
+end;
+
+destructor TToolPanel.Destroy;
+begin
+ if Assigned(FCustomizer) then
+ begin
+ TToolPanelSetupForm(FCustomizer).FToolPanel:=nil;
+ FreeAndNil(FCustomizer);
+ end;
+ FreeAndNil(FToolbarItems);
+ FreeAndNil(FPropertyStorageLink);
+ FreeAndNil(FArrowBmp);
+ inherited Destroy;
+end;
+
+procedure TToolPanel.Customize(HelpCtx: Longint);
+begin
+ if not Assigned(FCustomizer) then
+ FCustomizer:=TToolPanelSetupForm.CreateSetupForm(Self);
+ FCustomizer.HelpContext:=HelpCtx;
+ FCustomizer.Show;
+ SetCustomizing(true);
+end;
+
+procedure TToolPanel.SetBounds(aLeft, aTop, aWidth, aHeight: integer);
+begin
+ if not (csLoading in ComponentState) then
+ begin
+ if Assigned(FImageList) then
+ aHeight:=FImageList.Height+8 + Max(BorderWidth, 4) * 2
+ else
+ aHeight:=FDefButtonHeight + BorderWidth * 2;
+ end;
+ inherited SetBounds(aLeft, aTop, aWidth, aHeight);
+end;
+
+{ TToolbarItem }
+
+procedure TToolbarItem.SetAction(const AValue: TBasicAction);
+begin
+ if FButton.Action<>AValue then
+ begin
+{ if Assigned(FButton.Action) then
+ FButton.Action.UnRegisterChanges(FActionLink);}
+ FButton.Action:=AValue;
+ if csLoading in TToolbarItems(Collection).FToolPanel.ComponentState then exit;
+ FButton.UpdateSize;
+{ if Assigned(AValue) then
+ AValue.RegisterChanges(FActionLink);}
+ end;
+end;
+
+{procedure TToolbarItem.SetAutoSize(const AValue: boolean);
+begin
+ if FButton.FAutoSize<>AValue then
+ FButton.SetAutoSize(AValue);
+end;
+}
+procedure TToolbarItem.SetButtonStyle(const AValue: TToolbarButtonStyle);
+begin
+ if FButton.FToolbarButtonStyle<>AValue then
+ begin
+ FButton.FToolbarButtonStyle:=AValue;
+{ if AValue = tbrDropDown then
+ FButton.Enabled :=true;}
+ FButton.UpdateSize;
+ FButton.Invalidate;
+ end;
+end;
+
+procedure TToolbarItem.SetDropDownMenu(const AValue: TPopupMenu);
+begin
+ if FButton.FDropDownMenu<>AValue then
+ begin
+ FButton.FDropDownMenu:=AValue;
+ FButton.Invalidate;
+ end;
+end;
+
+procedure TToolbarItem.SetGroupIndex(const AValue: Integer);
+begin
+ FButton.GroupIndex:=AValue;
+end;
+
+procedure TToolbarItem.SetHeight(const AValue: Integer);
+begin
+ FButton.Height:=AValue;
+end;
+
+procedure TToolbarItem.SetLayout(const AValue: TButtonLayout);
+begin
+ FButton.Layout:=AValue;
+ FButton.UpdateSize;
+end;
+
+procedure TToolbarItem.SetLeft(const AValue: Integer);
+begin
+ if csLoading in TToolbarItems(Collection).FToolPanel.ComponentState then
+ FSaveLeft:=AValue
+ else
+ FButton.Left:=AValue;
+end;
+
+procedure TToolbarItem.SetShowCaption(const AValue: boolean);
+begin
+ if FButton.ShowCaption<>AValue then
+ begin
+ FButton.ShowCaption:=AValue;
+ if not (csLoading in TToolbarItems(Collection).FToolPanel.ComponentState) then
+ FButton.UpdateSize;
+// FButton.Invalidate;
+ end;
+end;
+
+procedure TToolbarItem.SetTag(const AValue: Longint);
+begin
+ FButton.Tag:=AValue;
+end;
+
+procedure TToolbarItem.SetTop(const AValue: Integer);
+begin
+ FButton.Top:=AValue;
+end;
+
+function TToolbarItem.GetAction: TBasicAction;
+begin
+ Result:=FButton.Action;
+end;
+
+{
+function TToolbarItem.GetAutoSize: boolean;
+begin
+ Result:=FButton.FAutoSize;
+end;
+}
+function TToolbarItem.GetButtonStyle: TToolbarButtonStyle;
+begin
+ Result:=FButton.FToolbarButtonStyle;
+end;
+
+function TToolbarItem.GetDropDownMenu: TPopupMenu;
+begin
+ Result:=FButton.FDropDownMenu;
+end;
+
+function TToolbarItem.GetGroupIndex: Integer;
+begin
+ Result:=FButton.GroupIndex;
+end;
+
+function TToolbarItem.GetHeight: Integer;
+begin
+ Result:=FButton.Height;
+end;
+
+function TToolbarItem.GetLayout: TButtonLayout;
+begin
+ Result:=FButton.Layout;
+end;
+
+function TToolbarItem.GetLeft: Integer;
+begin
+ Result:=FButton.Left;
+end;
+
+function TToolbarItem.GetShowCaption: boolean;
+begin
+ Result:=FButton.ShowCaption;
+end;
+
+function TToolbarItem.GetTag: Longint;
+begin
+ Result:=FButton.Tag;
+end;
+
+function TToolbarItem.GetTop: Integer;
+begin
+ Result:=FButton.Top;
+end;
+
+function TToolbarItem.GetVisible: boolean;
+begin
+ Result:=FButton.Visible;
+end;
+
+function TToolbarItem.GetWidth: Integer;
+begin
+ Result:=FButton.Width;
+end;
+
+procedure TToolbarItem.SetVisible(const AValue: boolean);
+begin
+ if FButton.Visible<>AValue then
+ begin
+ FButton.Visible:=AValue;
+ FButton.Invalidate;
+ end;
+end;
+
+procedure TToolbarItem.SetWidth(const AValue: Integer);
+begin
+ FButton.Width:=AValue;
+end;
+
+procedure TToolbarItem.UpdateLeftAfterLoad;
+begin
+ FButton.Left:=FSaveLeft;
+end;
+
+function TToolbarItem.GetDisplayName: string;
+begin
+ if ButtonStyle in [tbrSeparator, tbrDivider] then
+ begin
+ Result:='Separator'
+ end
+ else
+ if Assigned(Action) then
+ begin
+ if (Action is TCustomAction) then
+ Result:=TCustomAction(Action).Name + ' - ' +TCustomAction(Action).Caption
+ else
+ Result:=TCustomAction(Action).Name;
+ end
+ else
+ Result:=inherited GetDisplayName;
+end;
+
+constructor TToolbarItem.Create(ACollection: TCollection);
+var
+ i, W:integer;
+ TB:TToolPanel;
+begin
+ inherited Create(ACollection);
+ TB:=TToolbarItems(ACollection).FToolPanel;
+
+ FButton:=TToolbarButton.Create(TToolbarItems(ACollection).FToolPanel);
+
+ FButton.Align:=BtnAl2Align[TToolbarItems(ACollection).FToolPanel.ButtonAllign];
+
+ FButton.Parent:=TToolbarItems(ACollection).FToolPanel;
+ FButton.FImageList:=TToolbarItems(ACollection).FToolPanel.ImageList;
+ FButton.Flat:=tpFlatBtns in TToolbarItems(ACollection).FToolPanel.Options;
+ FButton.Transparent:=tpTransparentBtns in TToolbarItems(ACollection).FToolPanel.Options;
+ FButton.ShowCaption:=false;
+ FButton.AutoSize:=false;
+ FButton.FOwnerItem:=Self;
+ FButton.FFullPush:=true;
+ FButton.ParentColor:=true;
+// if not (csLoading in TToolbarItems(ACollection).FToolPanel.ComponentState) then
+// FButton.Align:=BtnAl2Align[TToolbarItems(ACollection).FToolPanel.ButtonAllign];
+
+ if (not (csLoading in TB.ComponentState)) and (csDesigning in TB.ComponentState) then
+ begin
+ if TToolbarItems(ACollection).FToolPanel.ButtonAllign = tbaLeft then
+ begin
+ W:=0;
+ for i:=0 to ACollection.Count - 1 do
+ begin
+ W:=Max(W, TToolbarItems(ACollection).Items[I].Width + TToolbarItems(ACollection).Items[I].Left);
+ end;
+ Left:=W+1;
+ end;
+ end;
+end;
+
+destructor TToolbarItem.Destroy;
+begin
+ FButton.FOwnerItem:=nil;
+ FreeAndNil(FButton);
+ inherited Destroy;
+end;
+
+{ TToolbarButtonActionLink }
+
+procedure TToolbarButtonActionLink.SetImageIndex(Value: Integer);
+begin
+ FClient.Invalidate;
+end;
+
+function TToolbarButtonActionLink.IsImageIndexLinked: Boolean;
+begin
+ Result:=true;
+end;
+
+procedure TToolbarButtonActionLink.SetEnabled(Value: Boolean);
+begin
+ if (FClient as TToolbarButton).FToolbarButtonStyle = tbrDropDown then
+ FClient.Enabled:=true
+ else
+ inherited SetEnabled(Value);
+end;
+
+procedure TToolbarButtonActionLink.SetCaption(const Value: string);
+begin
+ inherited SetCaption(Value);
+ (FClient as TToolbarButton).UpdateSize;
+end;
+
+initialization
+ //DebugLn('controls.pp - initialization');
+ RegisterPropertyToSkip(TToolbarButton, 'AutoSize', 'Old stile AutoSize in button', '');
+ RegisterPropertyToSkip(TToolbarItem, 'AutoSize', 'Old stile AutoSize in button', '');
+ RegisterPropertyToSkip(TToolPanel, 'AutoSize', 'Old stile AutoSize in button', '');
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/rxversinfo.pas b/components/rx/version/v2.2_laz_1.2/rxversinfo.pas
new file mode 100644
index 000000000..95eaa9e42
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxversinfo.pas
@@ -0,0 +1,316 @@
+{ RxVersInfo is part of RxFPC library
+
+ Copyright (C) 2010 Lagunov A.A. alexs75@hotbox.ru
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit RxVersInfo;
+
+{$mode objfpc}
+
+interface
+
+uses
+ Classes, SysUtils, versionresource;
+
+type
+ TLongVersion = string;
+ TVersionCharSet = string;
+ TVersionLanguage = string;
+
+ { TRxVersionInfo }
+
+ TRxVersionInfo = class(TComponent)
+ private
+ FValid: Boolean;
+ FValues:TStringList;
+ function GetComments: string;
+ function GetCompanyName: string;
+ function GetFileDescription: string;
+ function GetFileLongVersion: TLongVersion;
+ function GetFileName: string;
+ function GetFileVersion: string;
+ //function GetFixedFileInfo: PVSFixedFileInfo;
+ function GetInternalName: string;
+ function GetLegalCopyright: string;
+ function GetLegalTrademarks: string;
+ function GetOriginalFilename: string;
+ function GetPrivateBuild: string;
+ function GetProductLongVersion: TLongVersion;
+ function GetProductName: string;
+ function GetProductVersion: string;
+ function GetSpecialBuild: string;
+ function GetTranslation: Pointer;
+ function GetVerFileDate: TDateTime;
+ function GetVersionCharSet: TVersionCharSet;
+ function GetVersionLanguage: TVersionLanguage;
+ function GetVersionNum: Longint;
+ function GetVerValue(const VerName: string): string;
+ function GetWidgetName: string;
+ procedure SetFileName(const AValue: string);
+ procedure DoVersionInfo(V:TVersionResource);
+ protected
+ { Protected declarations }
+ public
+ constructor Create(AOwner: TComponent);override;
+ destructor Destroy; override;
+ procedure LoadFromFile(const AFileName:string);
+
+ property FileName: string read GetFileName write SetFileName;
+ property Valid: Boolean read FValid;
+ //property FixedFileInfo: PVSFixedFileInfo read GetFixedFileInfo;
+ property FileLongVersion: TLongVersion read GetFileLongVersion;
+ property ProductLongVersion: TLongVersion read GetProductLongVersion;
+ property Translation: Pointer read GetTranslation;
+ property VersionLanguage: TVersionLanguage read GetVersionLanguage;
+ property VersionCharSet: TVersionCharSet read GetVersionCharSet;
+ property VersionNum: Longint read GetVersionNum;
+ property Comments: string read GetComments;
+ property CompanyName: string read GetCompanyName;
+ property FileDescription: string read GetFileDescription;
+ property FileVersion: string read GetFileVersion;
+ property InternalName: string read GetInternalName;
+ property LegalCopyright: string read GetLegalCopyright;
+ property LegalTrademarks: string read GetLegalTrademarks;
+ property OriginalFilename: string read GetOriginalFilename;
+ property ProductVersion: string read GetProductVersion;
+ property ProductName: string read GetProductName;
+ property SpecialBuild: string read GetSpecialBuild;
+ property PrivateBuild: string read GetPrivateBuild;
+ property Values[const VerName: string]: string read GetVerValue;
+ property VerFileDate: TDateTime read GetVerFileDate;
+ published
+ property WidgetName:string read GetWidgetName;
+ end;
+
+
+implementation
+uses FileUtil, resource, resreader, InterfaceBase, rxconst
+{$IFDEF WINDOWS}
+ , winpeimagereader
+{$ENDIF}
+{$IFDEF LINUX}
+ , elfreader
+{$ENDIF}
+
+ ;
+
+{ TRxVersionInfo }
+
+function TRxVersionInfo.GetComments: string;
+begin
+ Result:=FValues.Values['Comments'];
+end;
+
+function TRxVersionInfo.GetCompanyName: string;
+begin
+ Result:=FValues.Values['CompanyName'];
+end;
+
+function TRxVersionInfo.GetFileDescription: string;
+begin
+ Result:=FValues.Values['FileDescription'];
+end;
+
+function TRxVersionInfo.GetFileLongVersion: TLongVersion;
+begin
+ Result:=FValues.Values['FileVersion'];
+end;
+
+function TRxVersionInfo.GetFileName: string;
+begin
+ Result:=FValues.Values['OriginalFilename'];
+end;
+
+function TRxVersionInfo.GetFileVersion: string;
+begin
+ Result:=FValues.Values['FileVersion'];
+end;
+
+{function TRxVersionInfo.GetFixedFileInfo: PVSFixedFileInfo;
+begin
+ Result:='';
+end;}
+
+function TRxVersionInfo.GetInternalName: string;
+begin
+ Result:=FValues.Values['InternalName'];
+end;
+
+function TRxVersionInfo.GetLegalCopyright: string;
+begin
+ Result:=FValues.Values['LegalCopyright'];
+end;
+
+function TRxVersionInfo.GetLegalTrademarks: string;
+begin
+ Result:=FValues.Values['LegalTrademarks'];
+end;
+
+function TRxVersionInfo.GetOriginalFilename: string;
+begin
+ Result:=FValues.Values['LegalTrademarks'];
+end;
+
+function TRxVersionInfo.GetPrivateBuild: string;
+begin
+ Result:='';
+end;
+
+function TRxVersionInfo.GetProductLongVersion: TLongVersion;
+begin
+ Result:='';
+end;
+
+function TRxVersionInfo.GetProductName: string;
+begin
+ Result:=FValues.Values['ProductName'];
+end;
+
+function TRxVersionInfo.GetProductVersion: string;
+begin
+ Result:=FValues.Values['ProductVersion'];
+end;
+
+function TRxVersionInfo.GetSpecialBuild: string;
+begin
+ Result:='';
+end;
+
+function TRxVersionInfo.GetTranslation: Pointer;
+begin
+ Result:=nil;
+end;
+
+function TRxVersionInfo.GetVerFileDate: TDateTime;
+begin
+ Result:=0;
+end;
+
+function TRxVersionInfo.GetVersionCharSet: TVersionCharSet;
+begin
+ Result:='';
+end;
+
+function TRxVersionInfo.GetVersionLanguage: TVersionLanguage;
+begin
+ Result:='';
+end;
+
+function TRxVersionInfo.GetVersionNum: Longint;
+begin
+ Result:=0;
+end;
+
+procedure TRxVersionInfo.SetFileName(const AValue: string);
+begin
+
+end;
+
+procedure TRxVersionInfo.DoVersionInfo(V: TVersionResource);
+var
+ i,j:integer;
+begin
+ for i:=0 to V.StringFileInfo.Count-1 do
+ begin
+ for j:=0 to V.StringFileInfo[i].Count-1 do
+ FValues.Values[V.StringFileInfo[i].Keys[j]]:=SysToUTF8(V.StringFileInfo[i].ValuesByIndex[j]);
+ end;
+end;
+
+constructor TRxVersionInfo.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FValues:=TStringList.Create;
+ LoadFromFile(ParamStr(0));
+end;
+
+destructor TRxVersionInfo.Destroy;
+begin
+ FreeAndNil(FValues);
+ inherited Destroy;
+end;
+
+procedure TRxVersionInfo.LoadFromFile(const AFileName: string);
+var
+ Res:TResources;
+ i:integer;
+ Reader:TAbstractResourceReader;
+ V:TVersionResource;
+begin
+ FValues.Clear;
+ FValid:=false;
+ Reader:=nil;
+ {$IFDEF WINDOWS}
+ Reader:=TWinPEImageResourceReader.Create;
+ {$ENDIF}
+ {$IFDEF LINUX}
+ Reader:=TElfResourceReader.Create;
+ {$ENDIF}
+
+ if Reader = nil then
+ exit;
+
+ Res:=TResources.Create;
+ V:=nil;
+ try
+ Res.LoadFromFile(ParamStr(0), Reader);
+ for i:=0 to Res.Count-1 do
+ begin
+ if Res[i] is TVersionResource then
+ V:=Res[i] as TVersionResource;
+ end;
+ FValid:=Assigned(V);
+ if FValid then
+ DoVersionInfo(V);
+ finally
+ Res.Free;
+ Reader.Free;
+ end;
+end;
+
+function TRxVersionInfo.GetVerValue(const VerName: string): string;
+begin
+ Result:=FValues.Values[VerName];
+end;
+
+function TRxVersionInfo.GetWidgetName: string;
+begin
+ case WidgetSet.LCLPlatform of
+ lpGtk:Result:=sGTKWidgetSet;
+ lpGtk2:Result:=sGTK2WidgetSet;
+ lpWin32:Result:=sWin32_64WidgetSet;
+ lpWinCE:Result:=sWinCEWidgetSet;
+ lpCarbon:Result:=sCarbonWidgetSet;
+ lpQT:Result:=sQTWidgetSet;
+ lpfpGUI:Result:=sFpGUIWidgetSet;
+ else
+ Result:=sOtherGUIWidgetSet;
+ end;
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxviewspanel.pas b/components/rx/version/v2.2_laz_1.2/rxviewspanel.pas
new file mode 100644
index 000000000..a297b8c18
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxviewspanel.pas
@@ -0,0 +1,512 @@
+{ RxViewsPanel unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+
+unit RxViewsPanel;
+
+{$I rx.inc}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
+ Buttons, StdCtrls, LCLType;
+
+type
+ TRxViewsPanel = class;
+ TRxViewsPanelItem = class;
+
+ TSelectViewEvent = procedure (Sender: TObject; ItemIndex:integer; const Item:TRxViewsPanelItem) of object;
+ { TRxViewsPanelItem }
+
+ TRxViewsPanelItem = class(TCollectionItem)
+ private
+ FButton: TSpeedButton;
+ FImageIndex: integer;
+ FLabel:TLabel;
+ function GetAction: TBasicAction;
+ function GetCaption: string;
+ function GetEnabled: Boolean;
+ function GetHint: TTranslateString;
+ function GetImageIndex: integer;
+ function GetTag: Longint;
+ function GetVisible: boolean;
+ procedure SetAction(const AValue: TBasicAction);
+ procedure SetCaption(const AValue: string);
+ procedure SetEnabled(const AValue: Boolean);
+ procedure SetHint(const AValue: TTranslateString);
+ procedure SetImageIndex(const AValue: integer);
+ procedure SetTag(const AValue: Longint);
+ procedure SetVisible(const AValue: boolean);
+ procedure UpdatePosition;
+ procedure UpdateImage;
+ procedure DoViewButtonClick(Sender:TObject);
+ protected
+ function GetDisplayName: string; override;
+ public
+ constructor Create(ACollection: TCollection); override;
+ destructor Destroy; override;
+ published
+ property Action:TBasicAction read GetAction write SetAction;
+ property Visible:boolean read GetVisible write SetVisible;
+ property Caption:string read GetCaption Write SetCaption;
+ property Tag: Longint read GetTag write SetTag default 0;
+ property ImageIndex:integer read GetImageIndex write SetImageIndex;
+ property Hint:TTranslateString read GetHint write SetHint;
+ property Enabled: Boolean read GetEnabled write SetEnabled default True;
+ end;
+
+
+ { TRxViewsPanelItems }
+
+ TRxViewsPanelItems = class(TCollection)
+ private
+ FRxViewsPanel:TRxViewsPanel;
+ function GetPanelItem(Index: Integer): TRxViewsPanelItem;
+ procedure SetPanelItem(Index: Integer; const AValue: TRxViewsPanelItem);
+ protected
+ procedure Update(Item: TCollectionItem);override;
+ public
+ constructor Create(ARxViewsPanel: TRxViewsPanel);
+ property Items[Index: Integer]: TRxViewsPanelItem read GetPanelItem write SetPanelItem; default;
+ procedure UpdateImages;
+ end;
+
+ { TRxViewsPanel }
+
+ TRxViewsPanel = class(TCustomPanel)
+ private
+ FButtonHeght: integer;
+ FImageList: TImageList;
+ FItemIndex: integer;
+ FItems:TRxViewsPanelItems;
+ FOnSelectViewEvent: TSelectViewEvent;
+ function GetItems: TRxViewsPanelItems;
+ procedure SetButtonHeght(const AValue: integer);
+ procedure SetImageList(const AValue: TImageList);
+ procedure SetItemIndex(const AValue: integer);
+ procedure SetItems(const AValue: TRxViewsPanelItems);
+ procedure InternalSelectView(Item:TRxViewsPanelItem);
+ protected
+ procedure Loaded; override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ published
+ property Align;
+ property Anchors;
+ property ButtonHeght:integer read FButtonHeght write SetButtonHeght;
+ property Color default clGrayText;
+ property Items:TRxViewsPanelItems read GetItems write SetItems;
+ property ImageList:TImageList read FImageList write SetImageList;
+ property OnSelectViewEvent:TSelectViewEvent read FOnSelectViewEvent write FOnSelectViewEvent;
+ property ItemIndex:integer read FItemIndex write SetItemIndex;
+
+ property Alignment;
+ property AutoSize;
+ property BorderSpacing;
+ property BevelInner;
+ property BevelOuter;
+ property BevelWidth;
+ property BidiMode;
+ property BorderWidth;
+ property BorderStyle;
+ property Caption;
+ property ChildSizing;
+ property ClientHeight;
+ property ClientWidth;
+ property Constraints;
+ property DockSite;
+ property DragCursor;
+ property DragKind;
+ property DragMode;
+ property Enabled;
+ property Font;
+ property FullRepaint;
+ property ParentBidiMode;
+ property ParentColor;
+ property ParentFont;
+ property ParentShowHint;
+ property PopupMenu;
+ property ShowHint;
+ property TabOrder;
+ property TabStop;
+ property UseDockManager default True;
+ property Visible;
+ property OnClick;
+ property OnContextPopup;
+ property OnDockDrop;
+ property OnDockOver;
+ property OnDblClick;
+ property OnDragDrop;
+ property OnDragOver;
+ property OnEndDock;
+ property OnEndDrag;
+ property OnEnter;
+ property OnExit;
+ property OnGetSiteInfo;
+ property OnGetDockCaption;
+ property OnMouseDown;
+ property OnMouseEnter;
+ property OnMouseLeave;
+ property OnMouseMove;
+ property OnMouseUp;
+ property OnMouseWheel;
+ property OnMouseWheelDown;
+ property OnMouseWheelUp;
+ property OnResize;
+ property OnStartDock;
+ property OnStartDrag;
+ property OnUnDock;
+
+ end;
+
+
+implementation
+
+
+{ TRxViewsPanel }
+
+function TRxViewsPanel.GetItems: TRxViewsPanelItems;
+begin
+ Result:=FItems;
+end;
+
+procedure TRxViewsPanel.SetButtonHeght(const AValue: integer);
+var
+ I:integer;
+begin
+ if FButtonHeght=AValue then exit;
+ FButtonHeght:=AValue;
+ for i:=0 to FItems.Count - 1 do
+ Items[i].FButton.Height:=AValue;
+end;
+
+procedure TRxViewsPanel.SetImageList(const AValue: TImageList);
+begin
+ if FImageList=AValue then exit;
+ FImageList:=AValue;
+ FItems.UpdateImages;
+end;
+
+procedure TRxViewsPanel.SetItemIndex(const AValue: integer);
+begin
+ if FItemIndex=AValue then exit;
+ if (AValue < 0) or (AValue > FItems.Count - 1) then exit;
+ FItemIndex:=AValue;
+ Items[AValue].FButton.Click;
+ Items[AValue].FButton.Down:=true;
+end;
+
+procedure TRxViewsPanel.SetItems(const AValue: TRxViewsPanelItems);
+begin
+ FItems.Assign(AValue);
+end;
+
+procedure TRxViewsPanel.InternalSelectView(Item: TRxViewsPanelItem);
+begin
+ FItemIndex:=Item.Index;
+ if Assigned(FOnSelectViewEvent) then
+ FOnSelectViewEvent(Self, Item.Index, Item);
+end;
+
+procedure TRxViewsPanel.Loaded;
+begin
+ inherited Loaded;
+ FItems.Update(nil);
+ FItems.UpdateImages;
+ if (FItems.Count>0) and (FItemIndex>-1) and (FItemIndex < FItems.Count) then
+ FItems[FItemIndex].FButton.Down:=true;
+end;
+
+constructor TRxViewsPanel.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ BevelOuter:=bvLowered;
+ Caption:='';
+ if Assigned(AOwner) then
+ Align:=alLeft;
+ Color:=clGrayText;
+ FItems:=TRxViewsPanelItems.Create(Self);
+
+ ControlStyle:=ControlStyle - [csSetCaption, csAcceptsControls];
+ FButtonHeght:=50;
+end;
+
+destructor TRxViewsPanel.Destroy;
+begin
+ FreeAndNil(FItems);
+ inherited Destroy;
+end;
+
+{ TRxViewsPanelItem }
+
+function TRxViewsPanelItem.GetAction: TBasicAction;
+begin
+ Result:=FButton.Action;
+end;
+
+function TRxViewsPanelItem.GetCaption: string;
+begin
+ Result:=FLabel.Caption;
+end;
+
+function TRxViewsPanelItem.GetEnabled: Boolean;
+begin
+ Result:=FButton.Enabled;
+end;
+
+function TRxViewsPanelItem.GetHint: TTranslateString;
+begin
+ Result:=FButton.Hint;
+end;
+
+function TRxViewsPanelItem.GetImageIndex: integer;
+begin
+{ if Assigned(FButton.Action) then
+ Result:=FButton.Action.;}
+ Result:=FImageIndex;
+// FButton.Glyph.;
+end;
+
+function TRxViewsPanelItem.GetTag: Longint;
+begin
+ Result:=FButton.Tag;
+end;
+
+function TRxViewsPanelItem.GetVisible: boolean;
+begin
+ Result:=FButton.Visible;
+end;
+
+procedure TRxViewsPanelItem.SetAction(const AValue: TBasicAction);
+begin
+ FButton.Action:=AValue;
+end;
+
+procedure TRxViewsPanelItem.SetCaption(const AValue: string);
+begin
+ FLabel.Caption:=AValue;
+end;
+
+procedure TRxViewsPanelItem.SetEnabled(const AValue: Boolean);
+begin
+ FButton.Enabled:=AValue;
+ FLabel.Enabled:=AValue;
+end;
+
+procedure TRxViewsPanelItem.SetHint(const AValue: TTranslateString);
+begin
+ FButton.Hint:=AValue;
+end;
+
+procedure TRxViewsPanelItem.SetImageIndex(const AValue: integer);
+begin
+ if FImageIndex=AValue then exit;
+ FImageIndex:=AValue;
+ UpdateImage;
+end;
+
+procedure TRxViewsPanelItem.SetTag(const AValue: Longint);
+begin
+ FButton.Tag:=AValue;
+end;
+
+procedure TRxViewsPanelItem.SetVisible(const AValue: boolean);
+begin
+ FButton.Visible:=AValue;
+ FLabel.Visible:=AValue;
+end;
+
+procedure TRxViewsPanelItem.UpdatePosition;
+var
+ PP:TRxViewsPanelItem;
+begin
+ if Index <> 0 then
+ begin
+ PP:=TRxViewsPanelItems(Collection).GetPanelItem(Index - 1);
+ if Assigned(PP.FLabel) then
+ begin
+ FButton.Top:=PP.FLabel.Top + PP.FLabel.Height;
+ end;
+ end;
+ FLabel.Top:=FButton.Top + FButton.Height;
+end;
+
+procedure TRxViewsPanelItem.UpdateImage;
+var
+ VP:TRxViewsPanel;
+begin
+ VP:=TRxViewsPanelItems(Collection).FRxViewsPanel;
+ if Assigned(VP.FImageList) then
+ VP.FImageList.GetBitmap(FImageIndex, FButton.Glyph);
+end;
+
+procedure TRxViewsPanelItem.DoViewButtonClick(Sender: TObject);
+begin
+ TRxViewsPanelItems(Collection).FRxViewsPanel.InternalSelectView(Self);
+end;
+
+function TRxViewsPanelItem.GetDisplayName: string;
+begin
+ if FLabel.Caption<> '' then
+ Result:=FLabel.Caption
+ else
+ Result:=inherited GetDisplayName;
+end;
+
+constructor TRxViewsPanelItem.Create(ACollection: TCollection);
+var
+ VP:TRxViewsPanel;
+begin
+ inherited Create(ACollection);
+ VP:=TRxViewsPanelItems(ACollection).FRxViewsPanel;
+ FImageIndex:=-1;
+
+ FButton:=TSpeedButton.Create(VP);
+// FButton.Align:=alTop;
+ FButton.ShowCaption:=false;
+ FButton.Transparent:=true;
+ FButton.GroupIndex:=1;
+ FButton.Height:=VP.FButtonHeght;
+ FButton.Parent:=VP;
+
+
+ FLabel:=TLabel.Create(VP);
+// FLabel.Align:=alTop;
+ FLabel.WordWrap:=true;
+ FLabel.Alignment:=taCenter;
+ FLabel.AutoSize:=true;
+ FLabel.Parent:=VP;
+
+ FButton.BorderSpacing.Around:=6;
+ FLabel.BorderSpacing.Around:=6;
+
+ FButton.AnchorSide[akLeft].Control:=VP;
+ FButton.AnchorSide[akRight].Control:=VP;
+ FButton.AnchorSide[akRight].Side:=asrBottom;
+ FButton.Anchors:=[akTop, akLeft, akRight];
+ FButton.OnClick:=@DoViewButtonClick;
+
+ FLabel.AnchorSide[akTop].Control:=FButton;
+ FLabel.AnchorSide[akLeft].Control:=VP;
+ FLabel.AnchorSide[akRight].Control:=VP;
+ FLabel.AnchorSide[akRight].Side:=asrBottom;
+ FLabel.Anchors:=[akTop, akLeft, akRight];
+ FLabel.Top:=FButton.Top + FButton.Height;
+
+ UpdatePosition;
+end;
+
+destructor TRxViewsPanelItem.Destroy;
+begin
+ FreeAndNil(FButton);
+ FreeAndNil(FLabel);
+ inherited Destroy;
+end;
+
+{ TRxViewsPanelItems }
+
+function TRxViewsPanelItems.GetPanelItem(Index: Integer): TRxViewsPanelItem;
+begin
+ result := TRxViewsPanelItem( inherited Items[Index] );
+
+end;
+
+procedure TRxViewsPanelItems.SetPanelItem(Index: Integer;
+ const AValue: TRxViewsPanelItem);
+begin
+ Items[Index].Assign( AValue );
+end;
+
+procedure TRxViewsPanelItems.Update(Item: TCollectionItem);
+var
+ i:integer;
+ P, P1:TRxViewsPanelItem;
+begin
+ inherited Update(Item);
+ if not Assigned(Item) then
+ begin
+ for i:=0 to Count - 1 do
+ begin
+ P:=GetPanelItem(I);
+ if Assigned(P.FButton) and Assigned(P.FLabel) then
+ begin
+ if i=0 then
+ begin
+ P.FButton.AnchorSide[akTop].Control:=FRxViewsPanel;
+ P.FButton.AnchorSide[akTop].Side:=asrTop;
+
+ P.FLabel.AnchorSide[akTop].Control:=P.FButton;
+ P.FLabel.AnchorSide[akTop].Side:=asrBottom;
+
+
+ end
+ else
+ begin
+ P1:=GetPanelItem(I-1);
+ if Assigned(P1.FButton) and Assigned(P1.FLabel) then
+ begin
+ P.FButton.AnchorSide[akTop].Control:=P1.FLabel;
+ P.FButton.AnchorSide[akTop].Side:=asrBottom;
+
+ P.FLabel.AnchorSide[akTop].Control:=P.FButton;
+ P.FLabel.AnchorSide[akTop].Side:=asrBottom;
+ end;
+ end;
+ P.FButton.AnchorSide[akLeft].Control:=FRxViewsPanel;
+ P.FButton.AnchorSide[akRight].Control:=FRxViewsPanel;
+ P.FButton.AnchorSide[akRight].Side:=asrBottom;
+
+ P.FLabel.AnchorSide[akTop].Control:=P.FButton;
+ P.FLabel.AnchorSide[akLeft].Control:=FRxViewsPanel;
+ P.FLabel.AnchorSide[akRight].Control:=FRxViewsPanel;
+ P.FLabel.AnchorSide[akRight].Side:=asrBottom;
+ end;
+ end;
+ end;
+end;
+
+constructor TRxViewsPanelItems.Create(ARxViewsPanel: TRxViewsPanel);
+begin
+ inherited Create(TRxViewsPanelItem);
+ FRxViewsPanel:=ARxViewsPanel;
+end;
+
+procedure TRxViewsPanelItems.UpdateImages;
+var
+ i:integer;
+begin
+ for I:=0 to Count - 1 do
+ Items[i].UpdateImage;
+end;
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/rxxpman.pas b/components/rx/version/v2.2_laz_1.2/rxxpman.pas
new file mode 100644
index 000000000..45dd9e9f8
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/rxxpman.pas
@@ -0,0 +1,59 @@
+{ rxxpman unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit rxxpman;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs;
+
+type
+ TRXXPManifest = class(TComponent)
+ private
+ { Private declarations }
+ protected
+ { Protected declarations }
+ public
+ { Public declarations }
+ published
+ { Published declarations }
+ end;
+
+implementation
+
+{$IFDEF WIN32}
+{.$R WindowsXP.RES}
+{$ENDIF}
+
+end.
diff --git a/components/rx/version/v2.2_laz_1.2/seldsfrm.lfm b/components/rx/version/v2.2_laz_1.2/seldsfrm.lfm
new file mode 100644
index 000000000..ab29b1d9d
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/seldsfrm.lfm
@@ -0,0 +1,74 @@
+object SelectDataSetForm: TSelectDataSetForm
+ Left = 445
+ Height = 315
+ Top = 197
+ Width = 400
+ ActiveControl = CheckBox1
+ Caption = 'Select dataset to copy to'
+ ClientHeight = 315
+ ClientWidth = 400
+ OnCreate = FormCreate
+ Position = poScreenCenter
+ LCLVersion = '1.3'
+ object Label1: TLabel
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = CheckBox1
+ AnchorSideTop.Side = asrBottom
+ Left = 6
+ Height = 21
+ Top = 35
+ Width = 98
+ BorderSpacing.Around = 6
+ Caption = 'Sourse dataset'
+ FocusControl = DataSetList
+ ParentColor = False
+ end
+ object CheckBox1: TCheckBox
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = Owner
+ Left = 6
+ Height = 23
+ Top = 6
+ Width = 154
+ BorderSpacing.Around = 6
+ Caption = 'Copy only metadata'
+ OnChange = CheckBox1Change
+ TabOrder = 0
+ end
+ object DataSetList: TListBox
+ AnchorSideLeft.Control = Owner
+ AnchorSideTop.Control = Label1
+ AnchorSideTop.Side = asrBottom
+ AnchorSideRight.Control = Owner
+ AnchorSideRight.Side = asrBottom
+ AnchorSideBottom.Control = ButtonPanel1
+ Left = 6
+ Height = 200
+ Top = 62
+ Width = 388
+ Anchors = [akTop, akLeft, akRight, akBottom]
+ BorderSpacing.Around = 6
+ ItemHeight = 0
+ OnDblClick = ListBox1DblClick
+ OnKeyPress = ListBox1KeyPress
+ ScrollWidth = 386
+ TabOrder = 1
+ TopIndex = -1
+ end
+ object ButtonPanel1: TButtonPanel
+ Left = 6
+ Height = 41
+ Top = 268
+ Width = 388
+ OKButton.Name = 'OKButton'
+ OKButton.DefaultCaption = True
+ HelpButton.Name = 'HelpButton'
+ HelpButton.DefaultCaption = True
+ CloseButton.Name = 'CloseButton'
+ CloseButton.DefaultCaption = True
+ CancelButton.Name = 'CancelButton'
+ CancelButton.DefaultCaption = True
+ TabOrder = 2
+ ShowButtons = [pbOK, pbCancel, pbHelp]
+ end
+end
diff --git a/components/rx/version/v2.2_laz_1.2/seldsfrm.lrt b/components/rx/version/v2.2_laz_1.2/seldsfrm.lrt
new file mode 100644
index 000000000..0fbff53db
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/seldsfrm.lrt
@@ -0,0 +1,3 @@
+TSELECTDATASETFORM.CAPTION=Select dataset to copy to
+TSELECTDATASETFORM.LABEL1.CAPTION=Sourse dataset
+TSELECTDATASETFORM.CHECKBOX1.CAPTION=Copy only metadata
diff --git a/components/rx/version/v2.2_laz_1.2/seldsfrm.pas b/components/rx/version/v2.2_laz_1.2/seldsfrm.pas
new file mode 100644
index 000000000..999aa5461
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/seldsfrm.pas
@@ -0,0 +1,292 @@
+{ seldsfrm unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru and Lazarus team
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit seldsfrm;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,
+ Buttons, ComponentEditors, DB, ButtonPanel;
+
+type
+
+ { TSelectDataSetForm }
+
+ TSelectDataSetForm = class(TForm)
+ ButtonPanel1: TButtonPanel;
+ CheckBox1: TCheckBox;
+ Label1: TLabel;
+ DataSetList: TListBox;
+ procedure CheckBox1Change(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ procedure ListBox1DblClick(Sender: TObject);
+ procedure ListBox1KeyPress(Sender: TObject; var Key: char);
+ private
+ FDesigner: TComponentEditorDesigner;
+ FExclude: string;
+ procedure FillDataSetList(ExcludeDataSet: TDataSet);
+ procedure AddDataSet(const S: string);
+ public
+ { public declarations }
+ end;
+
+ { TMemDataSetEditor }
+
+ TMemDataSetEditor = class(TComponentEditor)
+ private
+ DefaultEditor: TBaseComponentEditor;
+ function UniqueName(Field: TField): string;
+ procedure BorrowStructure;
+ protected
+ function CopyStructure(Source, Dest: TDataSet): Boolean; virtual;
+ public
+ constructor Create(AComponent: TComponent; ADesigner: TComponentEditorDesigner); override;
+ destructor Destroy; override;
+ procedure ExecuteVerb(Index: Integer); override;
+ function GetVerb(Index: Integer): string; override;
+ function GetVerbCount: Integer; override;
+ end;
+
+function SelectDataSet(ADesigner: TComponentEditorDesigner; const ACaption: string;
+ ExcludeDataSet: TDataSet): TDataSet;
+
+var
+ SelectDataSetForm: TSelectDataSetForm;
+
+implementation
+uses rxmemds, rxdconst;
+
+{$R *.lfm}
+
+function SelectDataSet(ADesigner: TComponentEditorDesigner; const ACaption: string;
+ ExcludeDataSet: TDataSet): TDataSet;
+begin
+ Result := nil;
+ with TSelectDataSetForm.Create(Application) do
+ try
+ if ACaption <> '' then Caption := ACaption;
+ FDesigner := ADesigner;
+ FillDataSetList(ExcludeDataSet);
+ if ShowModal = mrOk then
+ if DataSetList.ItemIndex >= 0 then
+ begin
+ with DataSetList do
+ Result := FDesigner.Form.FindComponent(Items[ItemIndex]) as TDataSet;
+ end;
+ finally
+ Free;
+ end;
+end;
+
+{ TSelectDataSetForm }
+
+procedure TSelectDataSetForm.CheckBox1Change(Sender: TObject);
+begin
+ Label1.Enabled:=not CheckBox1.Checked;
+ DataSetList.Enabled:=not CheckBox1.Checked;
+end;
+
+procedure TSelectDataSetForm.FormCreate(Sender: TObject);
+begin
+ Caption:=sRxSelectDatasetStruct;
+ CheckBox1.Caption:=sRxCopyOnlyMetadata;
+ Label1.Caption:=sRxSourseDataset;
+end;
+
+procedure TSelectDataSetForm.ListBox1DblClick(Sender: TObject);
+begin
+ if DataSetList.ItemIndex >= 0 then ModalResult := mrOk;
+end;
+
+procedure TSelectDataSetForm.ListBox1KeyPress(Sender: TObject; var Key: char);
+begin
+ if (Key = #13) and (DataSetList.ItemIndex >= 0) then
+ ModalResult := mrOk;
+end;
+
+procedure TSelectDataSetForm.FillDataSetList(ExcludeDataSet: TDataSet);
+var
+ I: Integer;
+ Component: TComponent;
+begin
+ DataSetList.Items.BeginUpdate;
+ try
+ DataSetList.Clear;
+ FExclude := '';
+ if ExcludeDataSet <> nil then FExclude := ExcludeDataSet.Name;
+ for I := 0 to FDesigner.Form.ComponentCount - 1 do
+ begin
+ Component := FDesigner.Form.Components[I];
+ if (Component is TDataSet) and (Component <> ExcludeDataSet) then
+ AddDataSet(Component.Name);
+ end;
+ with DataSetList do
+ begin
+ if Items.Count > 0 then ItemIndex := 0;
+ Enabled := Items.Count > 0;
+ ButtonPanel1.OKButton.Enabled:= (ItemIndex >= 0);
+ end;
+ finally
+ DataSetList.Items.EndUpdate;
+ end;
+end;
+
+procedure TSelectDataSetForm.AddDataSet(const S: string);
+begin
+ if (S <> '') and (S <> FExclude) then DataSetList.Items.Add(S);
+end;
+
+{ TMemDataSetEditor }
+
+function TMemDataSetEditor.UniqueName(Field: TField): string;
+const
+ AlphaNumeric = ['A'..'Z', 'a'..'z', '_'] + ['0'..'9'];
+var
+ Temp: string;
+ Comp: TComponent;
+ I: Integer;
+begin
+ Result := '';
+ if (Field <> nil) then begin
+ Temp := Field.FieldName;
+ for I := Length(Temp) downto 1 do
+ if not (Temp[I] in AlphaNumeric) then System.Delete(Temp, I, 1);
+ if (Temp = '') or not IsValidIdent(Temp) then begin
+ Temp := Field.ClassName;
+ if (UpCase(Temp[1]) = 'T') and (Length(Temp) > 1) then
+ System.Delete(Temp, 1, 1);
+ end;
+ end
+ else Exit;
+ Temp := Component.Name + Temp;
+ I := 0;
+ repeat
+ Result := Temp;
+ if I > 0 then Result := Result + IntToStr(I);
+ Comp := Designer.Form.FindComponent(Result);
+ Inc(I);
+ until (Comp = nil) or (Comp = Field);
+end;
+
+procedure TMemDataSetEditor.BorrowStructure;
+var
+ DataSet: TDataSet;
+ I: Integer;
+ Caption: string;
+begin
+ Caption := Component.Name;
+ if (Component.Owner <> nil) and (Component.Owner.Name <> '') then
+ Caption := Format('%s.%s', [Component.Owner.Name, Caption]);
+ DataSet := SelectDataSet(Designer, Caption, TDataSet(Component));
+ if DataSet <> nil then
+ begin
+// StartWait;
+ try
+ if not CopyStructure(DataSet, Component as TDataSet) then Exit;
+ with TDataSet(Component) do
+ begin
+ for I := 0 to FieldCount - 1 do
+ if Fields[I].Name = '' then
+ Fields[I].Name := UniqueName(Fields[I]);
+ end;
+ Modified;
+ finally
+// StopWait;
+ end;
+ Designer.Modified;
+ end;
+end;
+
+function TMemDataSetEditor.CopyStructure(Source, Dest: TDataSet): Boolean;
+begin
+ Result := Dest is TRxMemoryData;
+ if Result then
+ TRxMemoryData(Dest).CopyStructure(Source);
+end;
+
+type
+ PClass = ^TClass;
+
+constructor TMemDataSetEditor.Create(AComponent: TComponent;
+ ADesigner: TComponentEditorDesigner);
+var
+ CompClass: TClass;
+begin
+ inherited Create(AComponent, ADesigner);
+ CompClass := PClass(Acomponent)^;
+ try
+ PClass(AComponent)^ := TDataSet;
+ DefaultEditor := GetComponentEditor(AComponent, ADesigner);
+ finally
+ PClass(AComponent)^ := CompClass;
+ end;
+end;
+
+destructor TMemDataSetEditor.Destroy;
+begin
+ DefaultEditor.Free;
+ inherited Destroy;
+end;
+
+procedure TMemDataSetEditor.ExecuteVerb(Index: Integer);
+begin
+ if Index < DefaultEditor.GetVerbCount then
+ DefaultEditor.ExecuteVerb(Index)
+ else
+ begin
+ case Index - DefaultEditor.GetVerbCount of
+ 0:BorrowStructure;
+ end;
+ end;
+end;
+
+function TMemDataSetEditor.GetVerb(Index: Integer): string;
+begin
+ if Index < DefaultEditor.GetVerbCount then
+ Result := DefaultEditor.GetVerb(Index)
+ else
+ begin
+ case Index - DefaultEditor.GetVerbCount of
+ 0:Result:=sRxBorrowStructure;
+ end;
+ end;
+end;
+
+function TMemDataSetEditor.GetVerbCount: Integer;
+begin
+ Result:=DefaultEditor.GetVerbCount + 1;
+end;
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/tooledit.lrs b/components/rx/version/v2.2_laz_1.2/tooledit.lrs
new file mode 100644
index 000000000..66820c0dd
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/tooledit.lrs
@@ -0,0 +1,12 @@
+LazarusResources.Add('picDateEdit','PNG',[
+ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#28#0#0#0#12#4#3#0#0#0#131#245#192
+ +'<'#0#0#0#18'PLTE'#255#0#255#0#0#0#136#136#136#255#255#255#204#204#204#0#0
+ +#136'J'#24#179#193#0#0#0#1'bKGD'#3#17#12'L'#242#0#0#0'jIDAT'#8#215'M'#142#193
+ +#13#192' '#8'E'#127#232#4#196#244'n`'#1'-nP'#23#168'I'#247'_'#165' '#151'~'
+ +#15#242#194'#'#0'p'#4'$'#145#10#140'9'#231#189#200'"'#10#236#127'Q'#131''''
+ +#176't.'#142#149#164':'#246#210#163'{)'#165#236']'#159'mJ'#146#178'Y'#200#10
+ +#171#27#199'H'#132#198',o'#249#18#146#227#183#200#252'9'#242#243#158#188#242
+ +'*'#199',R'#178#15#182#29#22'z'#250#223#190#142#0#0#0'%tEXtdate:create'#0'20'
+ +'13-09-28T19:59:53+04:00['#223#143'b'#0#0#0'%tEXtdate:modify'#0'2013-06-14T2'
+ +'2:45:38+04:00'#25#215#209#23#0#0#0#0'IEND'#174'B`'#130
+]);
diff --git a/components/rx/version/v2.2_laz_1.2/tooledit.pas b/components/rx/version/v2.2_laz_1.2/tooledit.pas
new file mode 100644
index 000000000..26f6f56bc
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/tooledit.pas
@@ -0,0 +1,997 @@
+{ tooledit unit
+
+ Copyright (C) 2005-2010 Lagunov Aleksey alexs@yandex.ru
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit tooledit;
+
+{$I rx.inc}
+
+interface
+
+uses
+ Classes, SysUtils, LCLType, LMessages, Graphics, MaskEdit, Controls, EditBtn,
+ pickdate, dateutil;
+
+type
+ { TCustomDateEdit }
+
+ TYearDigits = (dyDefault, dyFour, dyTwo);
+ TPopupAlign = (epaRight, epaLeft);
+ TCalendarStyle = (csPopup, csDialog);
+
+const
+{$IFDEF DEFAULT_POPUP_CALENDAR}
+ dcsDefault = csPopup;
+{$ELSE}
+ dcsDefault = csDialog;
+{$ENDIF DEFAULT_POPUP_CALENDAR}
+
+type
+
+ { TCustomRxDateEdit }
+
+ TCustomRxDateEdit = class(TCustomEditButton)
+ private
+ FCalendarHints: TStrings;
+ FBlanksChar: Char;
+ FCancelCaption: TCaption;
+ FDefaultToday: Boolean;
+ FDialogTitle: TCaption;
+ FPopupColor: TColor;
+ FNotInThisMonthColor:TColor;
+ FOKCaption: TCaption;
+ FOnAcceptDAte: TAcceptDateEvent;
+ FStartOfWeek: TDayOfWeekName;
+ FWeekendColor: TColor;
+ FWeekends: TDaysOfWeek;
+ FYearDigits: TYearDigits;
+ FDateFormat: string[10];
+ FFormatting: Boolean;
+ FPopupVisible: Boolean;
+ FPopupAlign: TPopupAlign;
+ FCalendarStyle: TCalendarStyle;
+ //function GetCalendarStyle: TCalendarStyle;
+ function GetDate: TDateTime;
+ function GetPopupColor: TColor;
+ function GetPopupVisible: Boolean;
+ function GetValidDate: boolean;
+ function IsStoreTitle: boolean;
+ procedure SetBlanksChar(const AValue: Char);
+ procedure SetCalendarStyle(const AValue: TCalendarStyle);
+ procedure SetDate(const AValue: TDateTime);
+ procedure SetPopupColor(const AValue: TColor);
+ procedure SetStartOfWeek(const AValue: TDayOfWeekName);
+ procedure SetWeekendColor(const AValue: TColor);
+ procedure SetWeekends(const AValue: TDaysOfWeek);
+ procedure SetYearDigits(const AValue: TYearDigits);
+ procedure CalendarHintsChanged(Sender: TObject);
+
+ function AcceptPopup(var Value: TDateTime): Boolean;
+ procedure AcceptValue(const AValue: TDateTime);
+// procedure SetPopupValue(const Value: Variant);
+ protected
+ FPopup: TPopupCalendar;
+ procedure UpdateFormat;
+ procedure UpdatePopup;
+ function TextStored: Boolean;
+ procedure PopupDropDown(DisableEdit: Boolean); virtual;
+ procedure PopupCloseUp(Sender: TObject; Accept: Boolean);
+ procedure HidePopup; virtual;
+ procedure ShowPopup(AOrigin: TPoint); virtual;
+ procedure ApplyDate(Value: TDateTime); virtual;
+{$IFDEF OLD_EDITBUTTON}
+ procedure Change; override;
+{$ELSE}
+ procedure EditChange; override;
+{$ENDIF}
+ procedure KeyDown(var Key: Word; Shift: TShiftState); override;
+ procedure KeyPress(var Key: Char); override;
+
+{$IFDEF OLD_EDITBUTTON}
+ procedure DoButtonClick (Sender: TObject); override;
+{$ELSE}
+ procedure ButtonClick; override;
+ procedure EditKeyDown(var Key: word; Shift: TShiftState); override;
+ procedure EditKeyPress( var Key: char); override;
+{$ENDIF}
+
+ function GetDefaultGlyphName: String; override;
+ function CreatePopupForm:TPopupCalendar;
+
+ property BlanksChar: Char read FBlanksChar write SetBlanksChar default ' ';
+ property DialogTitle:TCaption Read FDialogTitle Write FDialogTitle Stored IsStoreTitle;
+ Property OnAcceptDate : TAcceptDateEvent Read FOnAcceptDAte Write FOnAcceptDate;
+ property OKCaption:TCaption Read FOKCaption Write FOKCaption;
+ property CancelCaption:TCaption Read FCancelCaption Write FCancelCaption;
+ property DefaultToday: Boolean read FDefaultToday write FDefaultToday
+ default False;
+ property StartOfWeek: TDayOfWeekName read FStartOfWeek write SetStartOfWeek default Mon;
+ property Weekends: TDaysOfWeek read FWeekends write SetWeekends default [Sun];
+ property WeekendColor: TColor read FWeekendColor write SetWeekendColor default clRed;
+ property YearDigits: TYearDigits read FYearDigits write SetYearDigits default dyDefault;
+ property PopupColor: TColor read GetPopupColor write SetPopupColor
+ default clBtnFace;
+ property CalendarStyle: TCalendarStyle read FCalendarStyle//GetCalendarStyle
+ write SetCalendarStyle default dcsDefault;
+ property PopupVisible: Boolean read GetPopupVisible;
+ property PopupAlign: TPopupAlign read FPopupAlign write FPopupAlign default epaLeft;
+ property NotInThisMonthColor:TColor read FNotInThisMonthColor write FNotInThisMonthColor default clSilver;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ procedure CheckValidDate;
+ function GetDateMask: string;
+ procedure UpdateMask; virtual;
+ property Date: TDateTime read GetDate write SetDate;
+ property Formatting: Boolean read FFormatting;
+ property ValidDate:boolean read GetValidDate;
+ end;
+
+type
+
+ { TRxDateEdit }
+
+ TRxDateEdit = class(TCustomRxDateEdit)
+ public
+ constructor Create(AOwner: TComponent); override;
+ property PopupVisible;
+ published
+ property Action;
+ property Align;
+ property Anchors;
+ property AutoSelect;
+ property AutoSize;
+ property BlanksChar;
+ property BorderSpacing;
+ property ButtonOnlyWhenFocused;
+ property ButtonWidth;
+ property CalendarStyle;
+ property CancelCaption;
+ property CharCase;
+ property Color;
+ property Constraints;
+ property DefaultToday;
+ property DialogTitle;
+ property DirectInput;
+ property DragMode;
+ property EchoMode;
+ property Enabled;
+ property Font;
+ property Glyph;
+ property MaxLength;
+ property NotInThisMonthColor;
+ property NumGlyphs;
+ property OKCaption;
+ property ParentFont;
+ property ParentShowHint;
+ property PasswordChar;
+ property PopupAlign;
+ property PopupColor;
+ property PopupMenu;
+ property ReadOnly;
+ property ShowHint;
+ property StartOfWeek;
+ property TabOrder;
+ property TabStop;
+ property Text;
+ property Visible;
+ property WeekendColor;
+ property Weekends;
+ property YearDigits;
+
+ property OnAcceptDate;
+ property OnChange;
+ property OnChangeBounds;
+ property OnClick;
+ property OnEditingDone;
+ property OnEnter;
+ property OnExit;
+ Property OnKeyDown;
+ property OnKeyPress;
+ Property OnKeyUp;
+ Property OnMouseDown;
+ Property OnMouseMove;
+ property OnMouseUp;
+ property OnMouseWheel;
+ property OnMouseWheelDown;
+ property OnMouseWheelUp;
+ property OnResize;
+ end;
+
+
+function PaintComboEdit(Editor: TCustomMaskEdit; const AText: string;
+ AAlignment: TAlignment; StandardPaint: Boolean;
+ var ACanvas: TControlCanvas; var Message: TLMPaint): Boolean;
+function EditorTextMargins(Editor: TCustomMaskEdit): TPoint;
+
+implementation
+uses lclintf, LCLStrConsts, rxconst, rxstrutils, LResources,
+ Forms, LCLProc,
+ variants;
+
+{.$IFNDEF RX_USE_LAZARUS_RESOURCE}
+{.$R tooledit.res}
+{.$ENDIF}
+
+type
+ TPopupCalendarAccess = class(TPopupCalendar)
+ end;
+
+function EditorTextMargins(Editor: TCustomMaskEdit): TPoint;
+var
+ DC: HDC;
+ SaveFont: HFont;
+ I: Integer;
+ SysMetrics, Metrics: TTextMetric;
+begin
+ with Editor do
+ begin
+(* if NewStyleControls then
+ begin
+ if BorderStyle = bsNone then
+ I := 0
+ else
+{ if Ctl3D then
+ I := 1
+ else}
+ I := 2;
+ Result.X := {SendMessage(Handle, LM_GETMARGINS, 0, 0) and $0000FFFF} + I;
+ Result.Y := I;
+ end
+ else *)
+ begin
+ if BorderStyle = bsNone then
+ I := 0
+ else
+ begin
+ DC := GetDC(0);
+ GetTextMetrics(DC, SysMetrics);
+ SaveFont := SelectObject(DC, Font.Handle);
+ GetTextMetrics(DC, Metrics);
+ SelectObject(DC, SaveFont);
+ ReleaseDC(0, DC);
+ I := SysMetrics.tmHeight;
+ if I > Metrics.tmHeight then
+ I := Metrics.tmHeight;
+ I := I div 4;
+ end;
+ Result.X := I;
+ Result.Y := I div 4;
+ end;
+ end;
+end;
+
+function PaintComboEdit(Editor: TCustomMaskEdit; const AText: string;
+ AAlignment: TAlignment; StandardPaint: Boolean;
+ var ACanvas: TControlCanvas; var Message: TLMPaint): Boolean;
+var
+ AWidth, ALeft: Integer;
+ Margins: TPoint;
+ R: TRect;
+ DC: HDC;
+ PS: TPaintStruct;
+ S: string;
+{$IFDEF USED_BiDi}
+ ExStyle: DWORD;
+const
+ AlignStyle: array[Boolean, TAlignment] of DWORD =
+ ((WS_EX_LEFT, WS_EX_RIGHT, WS_EX_LEFT),
+ (WS_EX_RIGHT, WS_EX_LEFT, WS_EX_LEFT));
+{$ENDIF}
+begin
+ Result := True;
+ with Editor do
+ begin
+{$IFDEF USED_BiDi}
+ if UseRightToLeftAlignment then ChangeBiDiModeAlignment(AAlignment);
+{$ENDIF}
+ if StandardPaint and not(csPaintCopy in ControlState) then
+ begin
+{$IFDEF USED_BiDi}
+ if SysLocale.MiddleEast and HandleAllocated and (IsRightToLeft) then
+ begin { This keeps the right aligned text, right aligned }
+ ExStyle := DWORD(GetWindowLong(Handle, GWL_EXSTYLE)) and (not WS_EX_RIGHT) and
+ (not WS_EX_RTLREADING) and (not WS_EX_LEFTSCROLLBAR);
+ if UseRightToLeftReading then
+ ExStyle := ExStyle or WS_EX_RTLREADING;
+ if UseRightToLeftScrollbar then
+ ExStyle := ExStyle or WS_EX_LEFTSCROLLBAR;
+ ExStyle := ExStyle or
+ AlignStyle[UseRightToLeftAlignment, AAlignment];
+ if DWORD(GetWindowLong(Handle, GWL_EXSTYLE)) <> ExStyle then
+ SetWindowLong(Handle, GWL_EXSTYLE, ExStyle);
+ end;
+{$ENDIF USED_BiDi}
+ Result := False;
+ { return false if we need to use standard paint handler }
+ Exit;
+ end;
+ { Since edit controls do not handle justification unless multi-line (and
+ then only poorly) we will draw right and center justify manually unless
+ the edit has the focus. }
+ if ACanvas = nil then
+ begin
+ ACanvas := TControlCanvas.Create;
+ ACanvas.Control := Editor;
+ end;
+
+ DC := Message.DC;
+ if DC = 0 then DC := BeginPaint(Handle, PS);
+ ACanvas.Handle := DC;
+
+ try
+ ACanvas.Font := Font;
+ if not Enabled and NewStyleControls and not
+ (csDesigning in ComponentState) and
+ (ColorToRGB(Color) <> ColorToRGB(clGrayText)) then
+ ACanvas.Font.Color := clGrayText;
+ with ACanvas do
+ begin
+ R := ClientRect;
+ Brush.Color := Color;
+ S := AText;
+ AWidth := TextWidth(S);
+ Margins := EditorTextMargins(Editor);
+ case AAlignment of
+ taLeftJustify: ALeft := Margins.X;
+ taRightJustify: ALeft := ClientWidth - AWidth - Margins.X - 2;
+ else
+ ALeft := (ClientWidth - AWidth) div 2;
+ end;
+{$IFDEF USED_BiDi}
+ if SysLocale.MiddleEast then UpdateTextFlags;
+{$ENDIF}
+ Brush.Style := bsClear;
+ TextRect(R, ALeft, Margins.Y, S);
+ end;
+ finally
+ ACanvas.Handle := 0;
+ if Message.DC = 0 then EndPaint(Handle, PS);
+ end;
+ end;
+end;
+
+{ TRxDateEdit }
+
+constructor TRxDateEdit.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ UpdateMask;
+end;
+
+{ TCustomRxDateEdit }
+
+function TCustomRxDateEdit.IsStoreTitle: boolean;
+begin
+ Result:=DialogTitle<>rsPickDate;
+end;
+
+procedure TCustomRxDateEdit.SetBlanksChar(const AValue: Char);
+begin
+ if FBlanksChar=AValue then exit;
+ if (AValue < ' ') then
+ FBlanksChar:=' '
+ else
+ FBlanksChar:=AValue;
+ UpdateMask;
+end;
+
+{
+function TCustomRxDateEdit.GetCalendarStyle: TCalendarStyle;
+begin
+ if FPopup <> nil then
+ Result := csPopup
+ else
+ Result := csDialog;
+end;
+}
+function TCustomRxDateEdit.GetDate: TDateTime;
+begin
+ if DefaultToday then Result := SysUtils.Date
+ else Result := NullDate;
+ if Text<>'' then
+ Result := StrToDateFmtDef(FDateFormat, Text, Result);
+end;
+
+function TCustomRxDateEdit.GetPopupColor: TColor;
+begin
+ if FPopup <> nil then Result := TPopupCalendar(FPopup).Color
+ else Result := FPopupColor;
+end;
+
+function TCustomRxDateEdit.GetPopupVisible: Boolean;
+begin
+ Result := (FPopup <> nil) and FPopupVisible;
+end;
+
+function TCustomRxDateEdit.GetValidDate: boolean;
+begin
+ try
+ StrToDateFmt(FDateFormat, Text);
+ Result:=true;
+ except
+ Result:=false;
+ end;
+end;
+
+procedure TCustomRxDateEdit.SetCalendarStyle(const AValue: TCalendarStyle);
+begin
+ if AValue <> FCalendarStyle then
+ begin
+ FCalendarStyle:=AValue;
+(* case AValue of
+ csPopup:
+ begin
+ if FPopup = nil then
+ begin
+ FPopup := CreatePopupCalendar(Self{$IFDEF USED_BiDi}, BiDiMode {$ENDIF});
+ end;
+ FPopup.OnCloseUp := @PopupCloseUp;
+ FPopup.Color := FPopupColor;
+ TRxCalendarGrid(FPopup.Calendar).NotInThisMonthColor:=FNotInThisMonthColor;
+ end;
+ csDialog:
+ begin
+ FPopup.Free;
+ FPopup := nil;
+ end;
+ end;*)
+ end;
+end;
+
+procedure TCustomRxDateEdit.SetDate(const AValue: TDateTime);
+var
+ D: TDateTime;
+begin
+ D := Date;
+ if AValue = NullDate then
+ Text := ''
+ else
+ Text := FormatDateTime(FDateFormat, AValue);
+ Modified := D <> Date;
+end;
+
+procedure TCustomRxDateEdit.SetPopupColor(const AValue: TColor);
+begin
+ if AValue <> FPopupColor then
+ begin
+ if FPopup <> nil then FPopup.Color := AValue;
+ FPopupColor := AValue;
+ UpdatePopup;
+ end;
+end;
+
+procedure TCustomRxDateEdit.SetStartOfWeek(const AValue: TDayOfWeekName);
+begin
+ if FStartOfWeek=AValue then exit;
+ FStartOfWeek:=AValue;
+ UpdatePopup;
+ UpdateMask;
+end;
+
+procedure TCustomRxDateEdit.SetWeekendColor(const AValue: TColor);
+begin
+ if FWeekendColor=AValue then exit;
+ FWeekendColor:=AValue;
+ UpdatePopup;
+end;
+
+procedure TCustomRxDateEdit.SetWeekends(const AValue: TDaysOfWeek);
+begin
+ if FWeekends=AValue then exit;
+ FWeekends:=AValue;
+ UpdatePopup;
+end;
+
+procedure TCustomRxDateEdit.SetYearDigits(const AValue: TYearDigits);
+begin
+ if FYearDigits=AValue then exit;
+ FYearDigits:=AValue;
+// UpdateFormat;
+ UpdateMask;
+end;
+
+procedure TCustomRxDateEdit.CalendarHintsChanged(Sender: TObject);
+begin
+ TStringList(FCalendarHints).OnChange := nil;
+ try
+ while (FCalendarHints.Count > 4) do
+ FCalendarHints.Delete(FCalendarHints.Count - 1);
+ finally
+ TStringList(FCalendarHints).OnChange := @CalendarHintsChanged;
+ end;
+ if not (csDesigning in ComponentState) then UpdatePopup;
+end;
+
+function TCustomRxDateEdit.AcceptPopup(var Value: TDateTime): Boolean;
+var
+ D: TDateTime;
+begin
+ Result := True;
+ if Assigned(FOnAcceptDate) then
+ begin
+ D :=Value;
+ FOnAcceptDate(Self, D, Result);
+ if Result then
+ Value := D;
+ end;
+end;
+
+procedure TCustomRxDateEdit.AcceptValue(const AValue: TDateTime);
+begin
+ SetDate(AValue);
+ if Modified then
+{$IFDEF OLD_EDITBUTTON}
+ inherited Change;
+{$ELSE}
+ inherited EditChange;
+{$ENDIF}
+end;
+
+procedure TCustomRxDateEdit.UpdateFormat;
+begin
+ case YearDigits of
+ dyDefault:FDateFormat :=DefDateFormat(FourDigitYear);
+ dyFour:FDateFormat := DefDateFormat(true);
+ dyTwo:FDateFormat := DefDateFormat(false);//DefDateMask(FBlanksChar, false);
+ end;
+end;
+
+procedure TCustomRxDateEdit.UpdatePopup;
+begin
+ if FPopup <> nil then SetupPopupCalendar(FPopup, FStartOfWeek,
+ FWeekends, FWeekendColor, FCalendarHints, FourDigitYear);
+end;
+
+function TCustomRxDateEdit.TextStored: Boolean;
+begin
+ Result := not IsEmptyStr(Text, [#0, ' ', DateSeparator, FBlanksChar]);
+end;
+
+procedure TCustomRxDateEdit.PopupDropDown(DisableEdit: Boolean);
+var
+ P: TPoint;
+ ABounds:TRect;
+ Y: Integer;
+
+procedure DoTrySetDate;
+var
+ D:TDateTime;
+begin
+ if Text<>'' then
+ begin
+ try
+ D:=StrToDate(Text);
+ FPopup.Date:=D;
+ except
+ if FDefaultToday then
+ FPopup.Date:=sysutils.Date;
+ end;
+ end
+ else
+ if FDefaultToday then
+ FPopup.Date:=sysutils.Date;
+end;
+
+begin
+ if not Assigned(FPopup) then
+ FPopup:=CreatePopupForm;
+
+ UpdatePopup;
+
+ if (FPopup <> nil) and not (ReadOnly {or FPopupVisible}) then
+ begin
+
+ P := Parent.ClientToScreen(Point(Left, Top));
+
+ ABounds := Screen.MonitorFromPoint(P).BoundsRect;
+
+ Y := P.Y + Height;
+ if Y + FPopup.Height > ABounds.Bottom then
+ Y := P.Y - FPopup.Height;
+ case FPopupAlign of
+ epaRight:
+ begin
+ Dec(P.X, FPopup.Width - Width);
+ if P.X < 0 then Inc(P.X, FPopup.Width - Width);
+ end;
+ epaLeft:
+ begin
+ if P.X + FPopup.Width > ABounds.Right then
+ Dec(P.X, FPopup.Width - Width);
+ end;
+ end;
+ if P.X < 0 then P.X := 0
+ else if P.X + FPopup.Width > ABounds.Right then
+ P.X := ABounds.Right - FPopup.Width;
+
+ DoTrySetDate;
+
+ ShowPopup(Point(P.X, Y));
+// FPopupVisible := True;
+{ if DisableEdit then
+ begin
+ inherited ReadOnly := True;
+ HideCaret(Handle);
+ end;}
+ end;
+end;
+
+procedure TCustomRxDateEdit.PopupCloseUp(Sender: TObject; Accept: Boolean);
+var
+ AValue: Variant;
+begin
+(*
+ if (FPopup <> nil) and FPopupVisible then
+ begin
+{ if GetCapture <> 0 then
+ SendMessage(GetCapture, WM_CANCELMODE, 0, 0);}
+// AValue := GetPopupValue;
+ HidePopup;
+ try
+ try
+ if CanFocus then
+ begin
+ SetFocus;
+// if GetFocus = Handle then SetShowCaret;
+ end;
+ except
+ { ignore exceptions }
+ end;
+// DirectInput:=DirectInput;
+ Invalidate;
+{ if Accept and AcceptPopup(AValue) and EditCanModify then
+ begin
+ AcceptValue(AValue);
+ if FFocused then inherited SelectAll;
+ end;}
+ finally
+ FPopupVisible := False;
+ end;
+ end;
+*)
+end;
+
+procedure TCustomRxDateEdit.HidePopup;
+begin
+ FPopup.Hide;
+end;
+
+procedure TCustomRxDateEdit.ShowPopup(AOrigin: TPoint);
+var
+ FAccept:boolean;
+ D:TDateTime;
+begin
+ if not Assigned(FPopup) then
+ FPopup:=CreatePopupForm;
+ FPopup.Left:=AOrigin.X;
+ FPopup.Top:=AOrigin.Y;
+ FPopup.AutoSizeForm;
+ TRxCalendarGrid(FPopup.Calendar).NotInThisMonthColor := FNotInThisMonthColor;
+ FAccept:=FPopup.ShowModal = mrOk;
+ if CanFocus then SetFocus;
+
+ if FAccept {and EditCanModify} then
+ begin
+ D:=FPopup.Date;
+ if AcceptPopup(D) then
+ begin
+ FPopup.Date:=D;
+ AcceptValue(D);
+ if Focused then inherited SelectAll;
+ end;
+ end;
+
+{ FPopup.Show(AOrigin);
+ SetWindowPos(Handle, HWND_TOP, Origin.X, Origin.Y, 0, 0,
+ SWP_NOACTIVATE or SWP_SHOWWINDOW or SWP_NOSIZE);
+ Visible := True;}
+end;
+
+procedure TCustomRxDateEdit.ApplyDate(Value: TDateTime);
+begin
+ SetDate(Value);
+ SelectAll;
+end;
+
+{$IFDEF OLD_EDITBUTTON}
+procedure TCustomRxDateEdit.Change;
+{$ELSE}
+procedure TCustomRxDateEdit.EditChange;
+{$ENDIF}
+begin
+ if not FFormatting then
+ {$IFDEF OLD_EDITBUTTON}
+ inherited Change;
+ {$ELSE}
+ inherited EditChange;
+ {$ENDIF}
+end;
+
+procedure TCustomRxDateEdit.KeyDown(var Key: Word; Shift: TShiftState);
+begin
+ if (Key in [VK_PRIOR, VK_NEXT, VK_LEFT, VK_UP, VK_RIGHT, VK_DOWN,
+ VK_ADD, VK_SUBTRACT]) and
+ PopupVisible then
+ begin
+ TPopupCalendarAccess(FPopup).KeyDown(Key, Shift);
+ Key := 0;
+ end
+ else
+ if (Shift = []) and DirectInput then
+ begin
+ case Key of
+ VK_ADD:
+ begin
+ ApplyDate(NvlDate(Date, Now) + 1);
+ Key := 0;
+ end;
+ VK_SUBTRACT:
+ begin
+ ApplyDate(NvlDate(Date, Now) - 1);
+ Key := 0;
+ end;
+ end;
+ end;
+ inherited KeyDown(Key, Shift);
+end;
+
+procedure TCustomRxDateEdit.KeyPress(var Key: Char);
+begin
+ if (Key in ['T', 't', '+', '-']) and PopupVisible then
+ begin
+// FPopup.KeyPress(Key);
+ Key := #0;
+ end
+ else
+ if DirectInput then
+ begin
+ case Key of
+ 'T', 't':
+ begin
+ ApplyDate(Trunc(Now));
+ Key := #0;
+ end;
+ '+', '-':
+ begin
+ Key := #0;
+ end;
+ end;
+ end;
+ inherited KeyPress(Key);
+end;
+
+{$IFNDEF OLD_EDITBUTTON}
+procedure TCustomRxDateEdit.EditKeyDown(var Key: word; Shift: TShiftState);
+begin
+ if (Key in [VK_PRIOR, VK_NEXT, VK_LEFT, VK_UP, VK_RIGHT, VK_DOWN,
+ VK_ADD, VK_SUBTRACT]) and
+ PopupVisible then
+ begin
+ TPopupCalendarAccess(FPopup).KeyDown(Key, Shift);
+ Key := 0;
+ end
+ else
+ if (Shift = []) and DirectInput then
+ begin
+ case Key of
+ VK_ADD:
+ begin
+ ApplyDate(NvlDate(Date, Now) + 1);
+ Key := 0;
+ end;
+ VK_SUBTRACT:
+ begin
+ ApplyDate(NvlDate(Date, Now) - 1);
+ Key := 0;
+ end;
+ end;
+ end;
+ inherited EditKeyDown(Key, Shift);
+end;
+
+procedure TCustomRxDateEdit.EditKeyPress(var Key: char);
+begin
+ if (Key in ['T', 't', '+', '-']) and PopupVisible then
+ begin
+ Key := #0;
+ end
+ else
+ if DirectInput then
+ begin
+ case Key of
+ 'T', 't':
+ begin
+ ApplyDate(Trunc(Now));
+ Key := #0;
+ end;
+ '+', '-':
+ begin
+ Key := #0;
+ end;
+ end;
+ end;
+ inherited EditKeyPress(Key);
+end;
+{$ENDIF}
+
+{$IFDEF OLD_EDITBUTTON}
+procedure TCustomRxDateEdit.DoButtonClick(Sender: TObject);
+{$ELSE}
+procedure TCustomRxDateEdit.ButtonClick;
+{$ENDIF}
+var
+ D: TDateTime;
+ A: Boolean;
+begin
+ {$IFDEF OLD_EDITBUTTON}
+ inherited DoButtonClick(Sender);
+ {$ELSE}
+ inherited ButtonClick;
+ {$ENDIF}
+ if CalendarStyle <> csDialog then
+ PopupDropDown(True)
+ else
+ if CalendarStyle = csDialog then
+ begin
+ D := Self.Date;
+ A := SelectDate(D, DialogTitle, FStartOfWeek, FWeekends, FWeekendColor, FCalendarHints);
+ if CanFocus then SetFocus;
+ if A then
+ begin
+ if Assigned(FOnAcceptDate) then FOnAcceptDate(Self, D, A);
+ if A then
+ begin
+ Self.Date := D;
+ inherited SelectAll;
+ end;
+ end;
+ end;
+end;
+
+function TCustomRxDateEdit.GetDefaultGlyphName: String;
+begin
+ {$IFDEF LINUX}
+ Result:='picDateEdit';
+ {$ELSE}
+ {$IFDEF WINDOWS}
+ Result:='picDateEdit';
+ {$ELSE}
+ Result:='';
+ {$ENDIF}
+ {$ENDIF}
+end;
+
+function TCustomRxDateEdit.CreatePopupForm: TPopupCalendar;
+begin
+ Result := CreatePopupCalendar(Self {$IFDEF USED_BiDi}, BiDiMode {$ENDIF});
+ Result.OnCloseUp := @PopupCloseUp;
+ Result.Color := FPopupColor;
+ TRxCalendarGrid(Result.Calendar).NotInThisMonthColor:=FNotInThisMonthColor;
+end;
+
+constructor TCustomRxDateEdit.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FBlanksChar := ' ';
+ FDialogTitle := sDateDlgTitle;
+ FPopupColor := clWindow;
+ FNotInThisMonthColor := clSilver;
+ FPopupAlign := epaLeft;
+ FStartOfWeek := Mon;
+ FWeekends := [Sun];
+ FWeekendColor := clRed;
+ FYearDigits := dyDefault;
+ FCalendarHints := TStringList.Create;
+ TStringList(FCalendarHints).OnChange := @CalendarHintsChanged;
+ ControlState := ControlState + [csCreating];
+ try
+ UpdateFormat;
+(*
+{$IFDEF DEFAULT_POPUP_CALENDAR}
+ FPopup := CreatePopupCalendar(Self {$IFDEF USED_BiDi}, BiDiMode {$ENDIF});
+ FPopup.OnCloseUp := @PopupCloseUp;
+ FPopup.Color := FPopupColor;
+ FPopup.Visible:=false;
+{$ELSE}
+ FPopup:=nil;
+{$ENDIF DEFAULT_POPUP_CALENDAR}
+*)
+ FPopup:=nil;
+// GlyphKind := gkDefault; { force update }
+ finally
+ ControlState := ControlState - [csCreating];
+ end;
+// Glyph:=LoadBitmapFromLazarusResource('picDateEdit');
+ NumGlyphs := 2;
+end;
+
+destructor TCustomRxDateEdit.Destroy;
+begin
+ if Assigned(FPopup) then
+ begin
+ FPopup.OnCloseUp := nil;
+ FreeAndNil(FPopup);
+ end;
+ TStringList(FCalendarHints).OnChange := nil;
+ FreeAndNil(FCalendarHints);
+ inherited Destroy;
+end;
+
+procedure TCustomRxDateEdit.CheckValidDate;
+begin
+ if TextStored then
+ try
+ FFormatting := True;
+ try
+ SetDate(StrToDateFmt(FDateFormat, Text));
+ finally
+ FFormatting := False;
+ end;
+ except
+ if CanFocus then SetFocus;
+ raise;
+ end;
+end;
+
+function TCustomRxDateEdit.GetDateMask: string;
+begin
+ case YearDigits of
+ dyDefault:Result :=DefDateMask(FBlanksChar, FourDigitYear);
+ dyFour:Result := DefDateMask(FBlanksChar, true);
+ dyTwo:Result := DefDateMask(FBlanksChar, false);
+ end;
+end;
+
+procedure TCustomRxDateEdit.UpdateMask;
+var
+ DateValue: TDateTime;
+ OldFormat: string[10];
+begin
+ DateValue := GetDate;
+ OldFormat := FDateFormat;
+ UpdateFormat;
+ if (GetDateMask <> EditMask) or (OldFormat <> FDateFormat) then
+ begin
+ { force update }
+ EditMask := '';
+ EditMask := GetDateMask;
+ end;
+ UpdatePopup;
+ SetDate(DateValue);
+end;
+
+{$IFDEF RX_USE_LAZARUS_RESOURCE}
+initialization
+ {$I tooledit.lrs}
+{$ENDIF}
+
+end.
+
diff --git a/components/rx/version/v2.2_laz_1.2/vclutils.pas b/components/rx/version/v2.2_laz_1.2/vclutils.pas
new file mode 100644
index 000000000..c1cc48cb8
--- /dev/null
+++ b/components/rx/version/v2.2_laz_1.2/vclutils.pas
@@ -0,0 +1,682 @@
+{ vclutils unit
+
+ Copyright (C) 2005-2013 Lagunov Aleksey alexs@yandex.ru
+ original conception from rx library for Delphi (c)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Library General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version with the following modification:
+
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent modules,and
+ to copy and distribute the resulting executable under terms of your choice,
+ provided that you also meet, for each linked independent module, the terms
+ and conditions of the license of that module. An independent module is a
+ module which is not derived from or based on this library. If you modify
+ this library, you may extend this exception to your version of the library,
+ but you are not obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
+
+ This program is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+}
+
+unit vclutils;
+
+{$I rx.inc}
+
+interface
+
+uses
+{$IFDEF WIN32}
+ windows,
+{$ENDIF}
+ Classes, SysUtils, Graphics, Controls, Forms, LResources
+ ;
+
+type
+ TTextOrientation = (toHorizontal, toVertical90, toHorizontal180, toVertical270, toHorizontal360);
+
+function WidthOf(R: TRect): Integer; inline;
+function HeightOf(R: TRect): Integer; inline;
+
+procedure RxFrame3D(Canvas: TCanvas; var Rect: TRect; TopColor, BottomColor: TColor;
+ Width: Integer);
+function DrawButtonFrame(Canvas: TCanvas; const Client: TRect;
+ IsDown, IsFlat: Boolean): TRect;
+function DrawButtonFrameXP(Canvas: TCanvas; const Client: TRect;
+ IsDown, IsFlat: Boolean): TRect;
+
+//Code from TAChartUtils
+procedure RotateLabel(Canvas: TCanvas; x, y: Integer; const St: String; RotDegree: Integer);
+procedure OutTextXY90(Canvas:TCanvas; X,Y:integer; Text:string; Orientation:TTextOrientation);
+
+function IsForegroundTask: Boolean;
+function ValidParentForm(Control: TControl): TCustomForm;
+function CreateArrowBitmap:TBitmap;
+function LoadLazResBitmapImage(const ResName: string): TBitmap;
+
+{functions from DBGrid}
+function GetWorkingCanvas(const Canvas: TCanvas): TCanvas;
+procedure FreeWorkingCanvas(canvas: TCanvas);
+
+{
+function AllocMemo(Size: Longint): Pointer;
+function ReallocMemo(fpBlock: Pointer; Size: Longint): Pointer;
+procedure FreeMemo(var fpBlock: Pointer);
+}
+
+procedure RaiseIndexOutOfBounds(Control: TControl; Items:TStrings; Index: integer);
+
+{$IFDEF WIN32}
+type
+ PCursorOrIcon = ^TCursorOrIcon;
+ TCursorOrIcon = packed record
+ Reserved: Word;
+ wType: Word;
+ Count: Word;
+ end;
+
+ PIconRec = ^TIconRec;
+ TIconRec = packed record
+ Width: Byte;
+ Height: Byte;
+ Colors: Word;
+ Reserved1: Word;
+ Reserved2: Word;
+ DIBSize: Longint;
+ DIBOffset: Longint;
+ end;
+
+procedure ReadIcon(Stream: TStream; var Icon: HICON; ImageCount: Integer;
+ StartOffset: Integer; const RequestedSize: TPoint; var IconSize: TPoint);
+procedure OutOfResources;
+{$ENDIF}
+
+implementation
+uses LCLProc, LCLIntf, LCLType, LCLStrConsts;
+
+{$IFNDEF RX_USE_LAZARUS_RESOURCE}
+{$R rx_lcl.res}
+{$ENDIF}
+
+function WidthOf(R: TRect): Integer;
+begin
+ Result := R.Right - R.Left;
+end;
+
+function HeightOf(R: TRect): Integer;
+begin
+ Result := R.Bottom - R.Top;
+end;
+
+procedure RxFrame3D(Canvas: TCanvas; var Rect: TRect; TopColor, BottomColor: TColor;
+ Width: Integer);
+
+procedure DoRect;
+var
+ TopRight, BottomLeft: TPoint;
+begin
+ TopRight.X := Rect.Right;
+ TopRight.Y := Rect.Top;
+ BottomLeft.X := Rect.Left;
+ BottomLeft.Y := Rect.Bottom;
+ Canvas.Pen.Color := TopColor;
+ Canvas.PolyLine([BottomLeft, Rect.TopLeft, TopRight]);
+ Canvas.Pen.Color := BottomColor;
+ Dec(BottomLeft.X);
+ Canvas.PolyLine([TopRight, Rect.BottomRight, BottomLeft]);
+end;
+
+begin
+ Canvas.Pen.Width := 1;
+ Dec(Rect.Bottom); Dec(Rect.Right);
+ while Width > 0 do
+ begin
+ Dec(Width);
+ DoRect;
+ InflateRect(Rect, -1, -1);
+ end;
+ Inc(Rect.Bottom); Inc(Rect.Right);
+end;
+
+function DrawButtonFrame(Canvas: TCanvas; const Client: TRect;
+ IsDown, IsFlat: Boolean): TRect;
+begin
+ Result := Client;
+ if IsDown then
+ begin
+ RxFrame3D(Canvas, Result, clWindowFrame, clBtnHighlight, 1);
+ if not IsFlat then
+ RxFrame3D(Canvas, Result, clBtnShadow, clBtnFace, 1);
+ end
+ else
+ begin
+ if IsFlat then
+ RxFrame3D(Canvas, Result, clBtnHighlight, clBtnShadow, 1)
+ else
+ begin
+ RxFrame3D(Canvas, Result, clBtnHighlight, clWindowFrame, 1);
+ RxFrame3D(Canvas, Result, clBtnFace, clBtnShadow, 1);
+ end;
+ end;
+ InflateRect(Result, -1, -1);
+end;
+
+function DrawButtonFrameXP(Canvas: TCanvas; const Client: TRect; IsDown,
+ IsFlat: Boolean): TRect;
+begin
+ Result := Client;
+ Canvas.Brush.Color := $00EFD3C6;
+ Canvas.FillRect(Client);
+ RxFrame3D(Canvas, Result, $00C66931, $00C66931, 1);
+end;
+
+{$IFDEF WIN32}
+type
+ PCheckTaskInfo = ^TCheckTaskInfo;
+ TCheckTaskInfo = packed record
+ FocusWnd: HWnd;
+ Found: Boolean;
+ end;
+//function CheckTaskWindow(Window: HWnd; Data: Longint): WordBool; stdcall;
+function CheckTaskWindow(Window:HWND; Data:LPARAM):WINBOOL;stdcall;
+begin
+ Result := True;
+ if PCheckTaskInfo(Data)^.FocusWnd = Window then begin
+ Result := False;
+ PCheckTaskInfo(Data)^.Found := True;
+ end;
+end;
+{$ENDIF}
+
+function IsForegroundTask: Boolean;
+{$IFDEF WIN32}
+var
+ Info: TCheckTaskInfo;
+{$ENDIF}
+begin
+{$IFDEF WIN32}
+ Info.FocusWnd := GetActiveWindow;
+ Info.Found := False;
+ EnumThreadWindows(GetCurrentThreadID, @CheckTaskWindow, Longint(@Info));
+ Result := Info.Found;
+{$ELSE}
+ Result:=true;
+{$ENDIF}
+end;
+
+function ValidParentForm(Control: TControl): TCustomForm;
+begin
+ Result := GetParentForm(Control);
+ if Result = nil then
+ raise EInvalidOperation.CreateFmt('ParentRequired %s', [Control.Name]);
+end;
+
+procedure RotateLabel(Canvas: TCanvas; x, y: Integer; const St: String; RotDegree: Integer);
+var
+ L:integer;
+begin
+ L:=Canvas.Font.Orientation;
+
+ SetBkMode(Canvas.Handle, TRANSPARENT);
+
+ Canvas.Font.Orientation:=RotDegree * 10;
+ Canvas.TextOut(X, Y, St);
+
+{ DrawText(ACanvas.Handle, PChar(Text), Length(Text), DrawRect,
+ ALIGN_FLAGS_HEADER[Alignment] or DT_WORDBREAK
+ );}
+
+ Canvas.Font.Orientation:=L;
+end;
+
+
+procedure OutTextXY90(Canvas:TCanvas; X,Y:integer; Text:string; Orientation:TTextOrientation);
+{$IFDEF OLD_STYLE_TEXT_ROTATE}
+var
+ W,H, i,j:integer;
+ Bmp:TBitmap;
+begin
+ if Orientation = toHorizontal then
+ Canvas.TextOut(X, Y, Text)
+ else
+ begin
+ W:=Canvas.TextWidth(Text);
+ H:=Canvas.TextHeight(Text);
+ Bmp:=TBitMap.Create;
+ try
+ Bmp.Width:=W;
+ Bmp.Height:=H;
+ Bmp.Canvas.Brush.Style:=bsSolid;
+ Bmp.Canvas.Brush.Color:=clWhite;
+ Bmp.Canvas.FillRect(Rect(0,0,W,H));
+ Bmp.Canvas.Font:=Canvas.Font;
+ Bmp.Canvas.TextOut(0, 0, Text);
+ Canvas.Lock;
+ if Orientation = toVertical90 then
+ begin
+ for i:=0 to W-1 do
+ for j:=0 to H-1 do
+ if Bmp.Canvas.Pixels[i,j]<>clWhite then
+ Canvas.Pixels[(H-j)+X,i+Y]:=Bmp.Canvas.Pixels[i,j];
+ end
+ else
+ if Orientation = toVertical270 then
+ begin
+ for i:=0 to W-1 do
+ for j:=0 to H-1 do
+ if Bmp.Canvas.Pixels[i,j]<>clWhite then
+ Canvas.Pixels[j+X,(W-i)+Y]:=Bmp.Canvas.Pixels[i,j];
+ end
+ else
+ if Orientation = toHorizontal180 then
+ begin
+ for i:=0 to W-1 do
+ for j:=0 to H-1 do
+ if Bmp.Canvas.Pixels[i,j]<>clWhite then
+ Canvas.Pixels[i+X,(H-j)+Y]:=Bmp.Canvas.Pixels[i,j];
+ end
+ else
+ if Orientation = toHorizontal360 then
+ begin
+ for i:=0 to W-1 do
+ for j:=0 to H-1 do
+ if Bmp.Canvas.Pixels[i,j]<>clWhite then
+ Canvas.Pixels[(W-i)+X,j+Y]:=Bmp.Canvas.Pixels[i,j];
+ end;
+ Canvas.Unlock;
+ finally
+ Bmp.Free;
+ end;
+ end;
+end;
+{$ELSE}
+const
+ TextAngle: array [TTextOrientation] of integer =
+ (0 {toHorizontal}, 90 {toVertical90},
+ 180 {toHorizontal180}, 270 {toVertical270}, 0 {toHorizontal360});
+var
+ W, H:integer;
+begin
+ W:=0;
+ H:=0;
+ case Orientation of
+ toVertical90:
+ begin
+ H:=Canvas.TextWidth(Text);
+ end;
+ toVertical270:
+ begin
+ W:=Canvas.TextHeight(Text);
+ end;
+ toHorizontal180:
+ begin
+ H:=Canvas.TextHeight(Text);
+ W:=Canvas.TextWidth(Text);
+ end;
+ end;
+ RotateLabel(Canvas, X+W, Y+H, Text, TextAngle[Orientation]);
+end;
+{$ENDIF}
+
+{
+function AllocMemo(Size: Longint): Pointer;
+begin
+ if Size > 0 then
+ Result := GlobalAllocPtr(HeapAllocFlags or GMEM_ZEROINIT, Size)
+ else Result := nil;
+end;
+
+function ReallocMemo(fpBlock: Pointer; Size: Longint): Pointer;
+begin
+ Result := GlobalReallocPtr(fpBlock, Size,
+ HeapAllocFlags or GMEM_ZEROINIT);
+end;
+
+procedure FreeMemo(var fpBlock: Pointer);
+begin
+ if fpBlock <> nil then begin
+ GlobalFreePtr(fpBlock);
+ fpBlock := nil;
+ end;
+end;
+}
+{$IFDEF WIN32}
+function CreateIcon(hInstance: HINST; nWidth, nHeight: Integer;
+ cPlanes, cBitsPixel: Byte; lpbANDbits, lpbXORbits: Pointer): HICON; stdcall; external user32 name 'CreateIcon';
+
+procedure GDIError;
+var
+ ErrorCode: Integer;
+ Buf: array [Byte] of Char;
+begin
+ ErrorCode := GetLastError;
+ if (ErrorCode <> 0) and (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil,
+ ErrorCode, LOCALE_USER_DEFAULT, Buf, sizeof(Buf), nil) <> 0) then
+ raise EOutOfResources.Create(Buf)
+ else
+ OutOfResources;
+end;
+
+function DupBits(Src: HBITMAP; Size: TPoint; Mono: Boolean): HBITMAP;
+var
+ DC, Mem1, Mem2: HDC;
+ Old1, Old2: HBITMAP;
+ Bitmap: Windows.TBitmap;
+begin
+ Mem1 := CreateCompatibleDC(0);
+ Mem2 := CreateCompatibleDC(0);
+
+ try
+ GetObject(Src, SizeOf(Bitmap), @Bitmap);
+ if Mono then
+ Result := CreateBitmap(Size.X, Size.Y, 1, 1, nil)
+ else
+ begin
+ DC := GetDC(0);
+ if DC = 0 then GDIError;
+ try
+ Result := CreateCompatibleBitmap(DC, Size.X, Size.Y);
+ if Result = 0 then GDIError;
+ finally
+ ReleaseDC(0, DC);
+ end;
+ end;
+
+ if Result <> 0 then
+ begin
+ Old1 := SelectObject(Mem1, Src);
+ Old2 := SelectObject(Mem2, Result);
+
+ StretchBlt(Mem2, 0, 0, Size.X, Size.Y, Mem1, 0, 0, Bitmap.bmWidth,
+ Bitmap.bmHeight, SrcCopy);
+ if Old1 <> 0 then SelectObject(Mem1, Old1);
+ if Old2 <> 0 then SelectObject(Mem2, Old2);
+ end;
+ finally
+ DeleteDC(Mem1);
+ DeleteDC(Mem2);
+ end;
+end;
+
+function GDICheck(Value: Integer): Integer;
+begin
+ if Value = 0 then GDIError;
+ Result := Value;
+end;
+
+function GetDInColors(BitCount: Word): Integer;
+begin
+ case BitCount of
+ 1, 4, 8: Result := 1 shl BitCount;
+ else
+ Result := 0;
+ end;
+end;
+
+function BytesPerScanline(PixelsPerScanline, BitsPerPixel, Alignment: Longint): Longint;
+begin
+ Dec(Alignment);
+ Result := ((PixelsPerScanline * BitsPerPixel) + Alignment) and not Alignment;
+ Result := Result div 8;
+end;
+
+procedure TwoBitsFromDIB(var BI: TBitmapInfoHeader; var XorBits, AndBits: HBITMAP;
+ const IconSize: TPoint);
+type
+ PLongArray = ^TLongArray;
+ TLongArray = array[0..1] of Longint;
+var
+ Temp: HBITMAP;
+ NumColors: Integer;
+ DC: HDC;
+ Bits: Pointer;
+ Colors: PLongArray;
+begin
+ with BI do
+ begin
+ biHeight := biHeight shr 1; { Size in record is doubled }
+ biSizeImage := BytesPerScanline(biWidth, biBitCount, 32) * biHeight;
+ NumColors := GetDInColors(biBitCount);
+ end;
+ DC := GetDC(0);
+ if DC = 0 then OutOfResources;
+ try
+ Bits := Pointer(Longint(@BI) + SizeOf(BI) + NumColors * SizeOf(TRGBQuad));
+ Temp := GDICheck(CreateDIBitmap(DC, BI, CBM_INIT, Bits, PBitmapInfo(@BI)^, DIB_RGB_COLORS));
+ try
+ XorBits := DupBits(Temp, IconSize, False);
+ finally
+ DeleteObject(Temp);
+ end;
+ with BI do
+ begin
+ Inc(Longint(Bits), biSizeImage);
+ biBitCount := 1;
+ biSizeImage := BytesPerScanline(biWidth, biBitCount, 32) * biHeight;
+ biClrUsed := 2;
+ biClrImportant := 2;
+ end;
+ Colors := Pointer(Longint(@BI) + SizeOf(BI));
+ Colors^[0] := 0;
+ Colors^[1] := $FFFFFF;
+ Temp := GDICheck(CreateDIBitmap(DC, BI, CBM_INIT, Bits, PBitmapInfo(@BI)^, DIB_RGB_COLORS));
+ try
+ AndBits := DupBits(Temp, IconSize, True);
+ finally
+ DeleteObject(Temp);
+ end;
+ finally
+ ReleaseDC(0, DC);
+ end;
+end;
+
+procedure ReadIcon(Stream: TStream; var Icon: HICON; ImageCount: Integer;
+ StartOffset: Integer; const RequestedSize: TPoint; var IconSize: TPoint);
+type
+ PIconRecArray = ^TIconRecArray;
+ TIconRecArray = array[0..300] of TIconRec;
+var
+ List: PIconRecArray;
+ HeaderLen, Length: Integer;
+ BitsPerPixel: Word;
+ Colors, BestColor, C1, N, Index: Integer;
+ DC: HDC;
+ BI: PBitmapInfoHeader;
+ ResData: Pointer;
+ XorBits, AndBits: HBITMAP;
+ XorInfo, AndInfo: Windows.TBitmap;
+ XorMem, AndMem: Pointer;
+ XorLen, AndLen: Integer;
+
+ function AdjustColor(I: Integer): Integer;
+ begin
+ if I = 0 then
+ Result := MaxInt
+ else
+ Result := I;
+ end;
+
+ function BetterSize(const Old, New: TIconRec): Boolean;
+ var
+ NewX, NewY, OldX, OldY: Integer;
+ begin
+ NewX := New.Width - IconSize.X;
+ NewY := New.Height - IconSize.Y;
+ OldX := Old.Width - IconSize.X;
+ OldY := Old.Height - IconSize.Y;
+ Result := (Abs(NewX) <= Abs(OldX)) and ((NewX <= 0) or (NewX <= OldX)) and
+ (Abs(NewY) <= Abs(OldY)) and ((NewY <= 0) or (NewY <= OldY));
+ end;
+
+begin
+ HeaderLen := SizeOf(TIconRec) * ImageCount;
+ List := AllocMem(HeaderLen);
+ try
+ Stream.Read(List^, HeaderLen);
+ if (RequestedSize.X or RequestedSize.Y) = 0 then
+ begin
+ IconSize.X := GetSystemMetrics(SM_CXICON);
+ IconSize.Y := GetSystemMetrics(SM_CYICON);
+ end
+ else
+ IconSize := RequestedSize;
+ DC := GetDC(0);
+ if DC = 0 then OutOfResources;
+ try
+ BitsPerPixel := GetDeviceCaps(DC, PLANES) * GetDeviceCaps(DC, BITSPIXEL);
+ if BitsPerPixel > 8 then
+ Colors := MaxInt
+ else
+ Colors := 1 shl BitsPerPixel;
+ finally
+ ReleaseDC(0, DC);
+ end;
+
+ { Find the image that most closely matches (<=) the current screen color
+ depth and the requested image size. }
+ Index := 0;
+ BestColor := AdjustColor(List^[0].Colors);
+ for N := 1 to ImageCount-1 do
+ begin
+ C1 := AdjustColor(List^[N].Colors);
+ if (C1 <= Colors) and (C1 >= BestColor) and
+ BetterSize(List^[Index], List^[N]) then
+ begin
+ Index := N;
+ BestColor := C1;
+ end;
+ end;
+
+ with List^[Index] do
+ begin
+ IconSize.X := Width;
+ IconSize.Y := Height;
+ BI := AllocMem(DIBSize);
+ try
+ Stream.Seek(DIBOffset - (HeaderLen + StartOffset), 1);
+ Stream.Read(BI^, DIBSize);
+ TwoBitsFromDIB(BI^, XorBits, AndBits, IconSize);
+ GetObject(AndBits, SizeOf(Windows.TBitmap), @AndInfo);
+ GetObject(XorBits, SizeOf(Windows.TBitmap), @XorInfo);
+ with AndInfo do
+ AndLen := bmWidthBytes * bmHeight * bmPlanes;
+ with XorInfo do
+ XorLen := bmWidthBytes * bmHeight * bmPlanes;
+ Length := AndLen + XorLen;
+ ResData := AllocMem(Length);
+ try
+ AndMem := ResData;
+ with AndInfo do
+ XorMem := Pointer(Longint(ResData) + AndLen);
+ GetBitmapBits(AndBits, AndLen, AndMem);
+ GetBitmapBits(XorBits, XorLen, XorMem);
+ DeleteObject(XorBits);
+ DeleteObject(AndBits);
+ Icon := CreateIcon(HInstance, IconSize.X, IconSize.Y,
+ XorInfo.bmPlanes, XorInfo.bmBitsPixel, AndMem, XorMem);
+ if Icon = 0 then GDIError;
+ finally
+ FreeMem(ResData, Length);
+ end;
+ finally
+ FreeMem(BI, DIBSize);
+ end;
+ end;
+ finally
+ FreeMem(List, HeaderLen);
+ end;
+end;
+
+procedure OutOfResources;
+begin
+ raise Exception.Create('SOutOfResources');
+end;
+{$ENDIF}
+
+function CreateArrowBitmap:TBitmap;
+var
+ C : TCustomBitmap;
+begin
+ {$IFNDEF RX_USE_LAZARUS_RESOURCE}
+ Result := TBitmap.Create;
+ try
+ try
+ C := TPortableNetworkGraphic.Create;
+ C.LoadFromResourceName(hInstance, 'rxbtn_downarrow');
+ Result.Assign(C);
+ finally
+ C.Free;
+ end;
+ except
+ Result.Free;
+ raise;
+ end;
+ {$ELSE}
+ Result:=LoadLazResBitmapImage('rxbtn_downarrow')
+ {$ENDIF}
+end;
+
+//Code from DBGrid
+function LoadLazResBitmapImage(const ResName: string): TBitmap;
+var
+ C: TCustomBitmap;
+begin
+ C := CreateBitmapFromLazarusResource(ResName);
+ if C<>nil then
+ begin
+ Result := TBitmap.Create;
+ Result.Assign(C);
+ C.Free;
+ end
+ else
+ Result:=nil;
+end;
+
+function GetWorkingCanvas(const Canvas: TCanvas): TCanvas;
+var
+ DC: HDC;
+begin
+ if (Canvas=nil) or (not Canvas.HandleAllocated) then
+ begin
+ DC := GetDC(0);
+ Result := TCanvas.Create;
+ Result.Handle := DC;
+ end
+ else
+ Result := Canvas;
+end;
+
+
+procedure FreeWorkingCanvas(canvas: TCanvas);
+begin
+ ReleaseDC(0, Canvas.Handle);
+ Canvas.Free;
+end;
+
+procedure RaiseIndexOutOfBounds(Control: TControl; Items:TStrings; Index: integer);
+begin
+ raise Exception.CreateFmt(rsIndexOutOfBounds,
+ [Control.Name, Index, Items.Count - 1]);
+end;
+
+initialization
+{$IFDEF RX_USE_LAZARUS_RESOURCE}
+ LazarusResources.Add('rxbtn_downarrow','XPM',[
+ '/* XPM */'#13#10'static char * btn_downarrow_xpm[] = {'#13#10'"5 3 2 1",'#13
+ +#10'" '#9'c None",'#13#10'".'#9'c #000000",'#13#10'".....",'#13#10'" ... ",'
+ +#13#10'" . "};'#13#10]);
+{$ENDIF}
+
+end.
+
+