acceleratorsresource.pp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2008 by Giulio Bernardi
  4. Accelerator table resource type
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. unit acceleratorsresource;
  12. {$MODE OBJFPC}
  13. interface
  14. uses
  15. Classes, SysUtils, resource;
  16. const
  17. FVirtKey = 1;
  18. FNoInvert = 2;
  19. FShift = 4;
  20. FControl = 8;
  21. FAlt = 16;
  22. type
  23. TAccelerator = packed record
  24. Flags : word;
  25. Ansi : word;
  26. Id : word;
  27. padding : word;
  28. end;
  29. PAccelerator = ^TAccelerator;
  30. type
  31. { TAcceleratorsResource }
  32. TAcceleratorsResource = class(TAbstractResource)
  33. private
  34. fType : TResourceDesc;
  35. fName : TResourceDesc;
  36. fList : TFPList;
  37. procedure CheckDataLoaded;
  38. function GetCount : integer;
  39. function GetItem(index : integer) : TAccelerator;
  40. procedure SetItem(index : integer; aAccelerator : TAccelerator);
  41. protected
  42. function GetType : TResourceDesc; override;
  43. function GetName : TResourceDesc; override;
  44. function ChangeDescTypeAllowed(aDesc : TResourceDesc) : boolean; override;
  45. function ChangeDescValueAllowed(aDesc : TResourceDesc) : boolean; override;
  46. procedure NotifyResourcesLoaded; override;
  47. public
  48. constructor Create; override;
  49. constructor Create(aType,aName : TResourceDesc); override;
  50. destructor Destroy; override;
  51. procedure UpdateRawData; override;
  52. procedure Add(aItem : TAccelerator);
  53. procedure Clear;
  54. procedure Delete(aIndex : integer);
  55. property Count : integer read GetCount;
  56. property Items[index : integer] : TAccelerator read GetItem write SetItem; default;
  57. end;
  58. implementation
  59. uses
  60. resfactory;
  61. { TAcceleratorsResource }
  62. procedure TAcceleratorsResource.CheckDataLoaded;
  63. var acc : TAccelerator;
  64. tot, i : integer;
  65. p : PAccelerator;
  66. begin
  67. if fList<>nil then exit;
  68. fList:=TFPList.Create;
  69. if RawData.Size=0 then exit;
  70. RawData.Position:=0;
  71. tot:=RawData.Size div 8;
  72. for i:=1 to tot do
  73. begin
  74. RawData.ReadBuffer(acc,sizeof(acc));
  75. {$IFDEF ENDIAN_BIG}
  76. acc.Flags:=SwapEndian(acc.Flags);
  77. acc.Ansi:=SwapEndian(acc.Ansi);
  78. acc.Id:=SwapEndian(acc.Id);
  79. acc.padding:=SwapEndian(acc.padding);
  80. {$ENDIF}
  81. GetMem(p,sizeof(TAccelerator));
  82. p^:=acc;
  83. fList.Add(p);
  84. end;
  85. end;
  86. function TAcceleratorsResource.GetCount: integer;
  87. begin
  88. CheckDataLoaded;
  89. Result:=fList.Count;
  90. end;
  91. function TAcceleratorsResource.GetItem(index: integer): TAccelerator;
  92. begin
  93. CheckDataLoaded;
  94. Result:=PAccelerator(fList[index])^;
  95. end;
  96. procedure TAcceleratorsResource.SetItem(index: integer;
  97. aAccelerator: TAccelerator);
  98. begin
  99. CheckDataLoaded;
  100. PAccelerator(fList[index])^:=aAccelerator;
  101. end;
  102. function TAcceleratorsResource.GetType: TResourceDesc;
  103. begin
  104. Result:=fType;
  105. end;
  106. function TAcceleratorsResource.GetName: TResourceDesc;
  107. begin
  108. Result:=fName;
  109. end;
  110. function TAcceleratorsResource.ChangeDescTypeAllowed(aDesc: TResourceDesc
  111. ): boolean;
  112. begin
  113. Result:=aDesc=fName;
  114. end;
  115. function TAcceleratorsResource.ChangeDescValueAllowed(aDesc: TResourceDesc
  116. ): boolean;
  117. begin
  118. Result:=aDesc=fName;
  119. end;
  120. procedure TAcceleratorsResource.NotifyResourcesLoaded;
  121. begin
  122. end;
  123. constructor TAcceleratorsResource.Create;
  124. begin
  125. inherited Create;
  126. fList:=nil;
  127. fType:=TResourceDesc.Create(RT_ACCELERATOR);
  128. fName:=TResourceDesc.Create(1);
  129. SetDescOwner(fType);
  130. SetDescOwner(fName);
  131. end;
  132. constructor TAcceleratorsResource.Create(aType, aName: TResourceDesc);
  133. begin
  134. Create;
  135. fName.Assign(aName);
  136. end;
  137. destructor TAcceleratorsResource.Destroy;
  138. begin
  139. fType.Free;
  140. fName.Free;
  141. if fList<>nil then
  142. begin
  143. Clear;
  144. fList.Free;
  145. end;
  146. inherited Destroy;
  147. end;
  148. procedure TAcceleratorsResource.UpdateRawData;
  149. var acc : TAccelerator;
  150. i : integer;
  151. begin
  152. if fList=nil then exit;
  153. RawData.Size:=0;
  154. RawData.Position:=0;
  155. if fList.Count>0 then
  156. for i:=0 to fList.Count-1 do
  157. begin
  158. acc:=PAccelerator(fList[i])^;
  159. // $80 means 'this is the last entry', so be sure only the last one has this bit set.
  160. if i=Count-1 then acc.Flags:=acc.Flags or $80
  161. else acc.Flags:=acc.Flags and $7F;
  162. {$IFDEF ENDIAN_BIG}
  163. acc.Flags:=SwapEndian(acc.Flags);
  164. acc.Ansi:=SwapEndian(acc.Ansi);
  165. acc.Id:=SwapEndian(acc.Id);
  166. acc.padding:=SwapEndian(acc.padding);
  167. {$ENDIF}
  168. RawData.WriteBuffer(acc,sizeof(acc));
  169. end;
  170. Clear;
  171. FreeAndNil(fList);
  172. end;
  173. procedure TAcceleratorsResource.Add(aItem: TAccelerator);
  174. var p : PAccelerator;
  175. begin
  176. CheckDataLoaded;
  177. GetMem(p,sizeof(TAccelerator));
  178. p^:=aItem;
  179. fList.Add(p);
  180. end;
  181. procedure TAcceleratorsResource.Clear;
  182. var p : PAccelerator;
  183. i : integer;
  184. begin
  185. CheckDataLoaded;
  186. for i:=0 to fList.Count-1 do
  187. begin
  188. p:=PAccelerator(fList[i]);
  189. FreeMem(p);
  190. end;
  191. fList.Clear;
  192. end;
  193. procedure TAcceleratorsResource.Delete(aIndex: integer);
  194. var p : PAccelerator;
  195. begin
  196. CheckDataLoaded;
  197. p:=PAccelerator(fList[aIndex]);
  198. FreeMem(p);
  199. fList.Delete(aIndex);
  200. end;
  201. initialization
  202. TResourceFactory.RegisterResourceClass(RT_ACCELERATOR,TAcceleratorsResource);
  203. end.