CnLangEditors.pas 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. {******************************************************************************}
  2. { CnPack For Delphi/C++Builder }
  3. { 中国人自己的开放源码第三方开发包 }
  4. { (C)Copyright 2001-2016 CnPack 开发组 }
  5. { ------------------------------------ }
  6. { }
  7. { 本开发包是开源的自由软件,您可以遵照 CnPack 的发布协议来修 }
  8. { 改和重新发布这一程序。 }
  9. { }
  10. { 发布这一开发包的目的是希望它有用,但没有任何担保。甚至没有 }
  11. { 适合特定目的而隐含的担保。更详细的情况请参阅 CnPack 发布协议。 }
  12. { }
  13. { 您应该已经和开发包一起收到一份 CnPack 发布协议的副本。如果 }
  14. { 还没有,可访问我们的网站: }
  15. { }
  16. { 网站地址:http://www.cnpack.org }
  17. { 电子邮件:master@cnpack.org }
  18. { }
  19. {******************************************************************************}
  20. unit CnLangEditors;
  21. {* |<PRE>
  22. ================================================================================
  23. * 软件名称:CnPack 多语包
  24. * 单元名称:多语包部分属性编辑器单元
  25. * 单元作者:CnPack开发组 刘啸 (liuxiao@cnpack.org)
  26. * 备 注:该单元实现了多语包的部分属性编辑器
  27. * 开发平台:PWin2000 + Delphi 5.0
  28. * 兼容测试:PWin9X/2000/XP + Delphi 5/6/7
  29. * 本 地 化:该单元中的字符串均符合本地化处理方式
  30. * 单元标识:$Id$
  31. * 修改记录:2003.08.20 V1.0
  32. * 创建单元,实现功能
  33. ================================================================================
  34. |</PRE>}
  35. interface
  36. {$I CnPack.inc}
  37. uses
  38. {$IFDEF COMPILER6_UP}
  39. DesignIntf, DesignEditors, DesignMenus,
  40. {$ELSE}
  41. Dsgnintf,
  42. {$ENDIF}
  43. SysUtils, Classes, FileCtrl;
  44. type
  45. TCnLanguageItemProperty = class(TPropertyEditor)
  46. {* 针对 TCnLanguageItem 的 LanugageID 的属性编辑器}
  47. function GetAttributes: TPropertyAttributes; override;
  48. function GetValue: string; override;
  49. procedure GetValues(Proc: TGetStrProc); override;
  50. procedure SetValue(const Value: string); override;
  51. end;
  52. TCnLangManagerProperty = class(TPropertyEditor)
  53. {* 针对 TCnLanguageManager 的 CurrentLanugageIndex 的属性编辑器}
  54. function GetAttributes: TPropertyAttributes; override;
  55. function GetValue: string; override;
  56. procedure GetValues(Proc: TGetStrProc); override;
  57. procedure SetValue(const Value: string); override;
  58. end;
  59. TCnLanguagePathProperty = class(TStringProperty)
  60. {* 针对 TCnLangFileStorage 的 LanugagePath 的属性编辑器}
  61. procedure Edit; override;
  62. function GetAttributes: TPropertyAttributes; override;
  63. end;
  64. {$IFDEF DELPHI}
  65. TCnStorageEditor = class(TComponentEditor)
  66. {* 针对多语存储组件双击的编辑语言条目的组件编辑器}
  67. public
  68. procedure Edit; override;
  69. {* 双击的过程 }
  70. procedure ExecuteVerb(Index: Integer); override;
  71. {* 执行右键菜单的过程 }
  72. function GetVerb(Index: Integer): string; override;
  73. {* 返回右键菜单条目 }
  74. function GetVerbCount: Integer; override;
  75. {* 返回右键菜单条目数 }
  76. end;
  77. {$ENDIF}
  78. {$IFDEF COMPILER6_UP}
  79. TCnLangDesignerEditor = class(TBaseSelectionEditor, ISelectionEditor)
  80. public
  81. procedure ExecuteVerb(Index: Integer; const List: IDesignerSelections);
  82. function GetVerb(Index: Integer): string;
  83. function GetVerbCount: Integer;
  84. procedure PrepareItem(Index: Integer; const AItem: IMenuItem);
  85. procedure RequiresUnits(Proc: TGetStrProc);
  86. end;
  87. {$ENDIF}
  88. implementation
  89. uses
  90. Forms, Windows, Clipbrd, CnLangMgr, CnLangStorage, CnLangUtils, CnLangConsts
  91. {$IFDEF DELPHI}, ColnEdit{$ENDIF};
  92. { TCnLanguageItemProperty }
  93. function TCnLanguageItemProperty.GetAttributes: TPropertyAttributes;
  94. begin
  95. Result := [paMultiSelect, paValueList, paSortList, paRevertable];
  96. end;
  97. function TCnLanguageItemProperty.GetValue: string;
  98. begin
  99. Result := InttoStr(GetOrdValue);
  100. end;
  101. procedure TCnLanguageItemProperty.GetValues(Proc: TGetStrProc);
  102. var
  103. i: Integer;
  104. begin
  105. for i := 0 to CnLanguages.Count - 1 do
  106. Proc(CnLanguages.ID[i] + ' ' + CnLanguages.Name[i]);
  107. end;
  108. procedure TCnLanguageItemProperty.SetValue(const Value: string);
  109. begin
  110. if Pos(' ', Value) > 0 then
  111. SetOrdValue(StrToInt(Copy(Value, 1, Pos(' ', Value) - 1)))
  112. else
  113. SetOrdValue(StrToInt(Value));
  114. end;
  115. { TCnLangManagerProperty }
  116. function TCnLangManagerProperty.GetAttributes: TPropertyAttributes;
  117. begin
  118. Result := [paMultiSelect, paValueList, paSortList, paRevertable];
  119. end;
  120. function TCnLangManagerProperty.GetValue: string;
  121. begin
  122. Result := InttoStr(GetOrdValue);
  123. end;
  124. procedure TCnLangManagerProperty.GetValues(Proc: TGetStrProc);
  125. var
  126. i: Integer;
  127. Storage: TCnCustomLangStorage;
  128. begin
  129. if (GetComponent(0) <> nil) and
  130. ((GetComponent(0) as TCnCustomLangManager).LanguageStorage <> nil) then
  131. begin
  132. Storage := (GetComponent(0) as TCnCustomLangManager).LanguageStorage;
  133. for i := 0 to Storage.Languages.Count - 1 do
  134. Proc(InttoStr(i) + ' - ' + InttoStr(Storage.Languages.Items[i].LanguageID)
  135. + ' - ' + Storage.Languages.Items[i].LanguageName);
  136. end;
  137. end;
  138. procedure TCnLangManagerProperty.SetValue(const Value: string);
  139. begin
  140. if Pos(' ', Value) > 0 then
  141. SetOrdValue(StrToInt(Copy(Value, 1, Pos(' ', Value) - 1)))
  142. else
  143. SetOrdValue(StrToInt(Value));
  144. end;
  145. { TCnLangguagePathProperty }
  146. procedure TCnLanguagePathProperty.Edit;
  147. var
  148. S: String;
  149. begin
  150. if SelectDirectory(SCnLanguagePath, '', S) then
  151. SetStrValue(S);
  152. end;
  153. function TCnLanguagePathProperty.GetAttributes: TPropertyAttributes;
  154. begin
  155. Result := [paMultiSelect, paDialog, paRevertable];
  156. end;
  157. {$IFDEF DELPHI}
  158. { TCnStorageEditor }
  159. procedure TCnStorageEditor.Edit;
  160. begin
  161. if Component is TCnCustomLangStorage then
  162. ShowCollectionEditor(Designer, Component,
  163. TCnCustomLangStorage(Component).Languages, 'Languages');
  164. end;
  165. procedure TCnStorageEditor.ExecuteVerb(Index: Integer);
  166. begin
  167. // Do Nothing.
  168. end;
  169. function TCnStorageEditor.GetVerb(Index: Integer): string;
  170. begin
  171. Result := '';
  172. end;
  173. function TCnStorageEditor.GetVerbCount: Integer;
  174. begin
  175. Result := 0;
  176. end;
  177. {$ENDIF}
  178. {$IFDEF COMPILER6_UP}
  179. { TCnLangDesignerEditor }
  180. procedure TCnLangDesignerEditor.ExecuteVerb(Index: Integer;
  181. const List: IDesignerSelections);
  182. var
  183. i: Integer;
  184. Extractor: TCnLangStringExtractor;
  185. Lines: TStringList;
  186. Mgr: TCnLangManager;
  187. begin
  188. if Index = 0 then
  189. begin
  190. if List.Count > 0 then
  191. begin
  192. Extractor := nil;
  193. Lines := nil;
  194. Mgr := nil;
  195. try
  196. if CnLanguageManager = nil then
  197. Mgr := TCnLangManager.Create(nil);
  198. Extractor := TCnLangStringExtractor.Create;
  199. Lines := TStringList.Create;
  200. if List[0] is TCustomForm then
  201. Extractor.GetFormStrings(TComponent(List[0]), Lines, True)
  202. else
  203. begin
  204. for i := 0 to List.Count - 1 do
  205. begin
  206. if List[i] is TComponent then
  207. begin
  208. if TComponent(List[i]).Owner is TCustomForm then
  209. Extractor.GetComponentStrings(TComponent(List[i]), Lines,
  210. TComponent(List[i]).Owner.ClassName, True)
  211. else
  212. Extractor.GetComponentStrings(TComponent(List[i]), Lines, '', True);
  213. end;
  214. end;
  215. end;
  216. Lines.Sorted := True;
  217. Clipboard.AsText := Lines.Text;
  218. finally
  219. Extractor.Free;
  220. Lines.Free;
  221. if Mgr <> nil then
  222. Mgr.Free;
  223. end;
  224. end;
  225. end;
  226. end;
  227. function TCnLangDesignerEditor.GetVerb(Index: Integer): string;
  228. begin
  229. if Index = 0 then
  230. Result := SCnLangExtractStrings;
  231. end;
  232. function TCnLangDesignerEditor.GetVerbCount: Integer;
  233. begin
  234. Result := 1;
  235. end;
  236. procedure TCnLangDesignerEditor.PrepareItem(Index: Integer;
  237. const AItem: IMenuItem);
  238. begin
  239. // if Index = 0 then
  240. // AItem.Visible := CnLanguageManager <> nil;
  241. end;
  242. procedure TCnLangDesignerEditor.RequiresUnits(Proc: TGetStrProc);
  243. begin
  244. end;
  245. {$ENDIF}
  246. end.