MainFormFooter.pas 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. unit MainFormFooter;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs, ExtCtrls, StdCtrls, InterfaceAppCentre, cefvcl, AppsLayout, AppBtn,
  6. pngimage, jpeg;
  7. type
  8. TMainFrmFooter = class(TForm, IHotAppView)
  9. pnlFooter: TPanel;
  10. chrm1: TChromium;
  11. imgAppCentre: TImage;
  12. procedure FormCreate(Sender: TObject);
  13. procedure imgAppCentreClick(Sender: TObject);
  14. procedure pnlFooterResize(Sender: TObject);
  15. procedure imgAppCentreMouseEnter(Sender: TObject);
  16. procedure imgAppCentreMouseLeave(Sender: TObject);
  17. private
  18. FAppsLayout: TAppsLayout;
  19. FDotPic: TGraphic;
  20. function CreateAppBtn(AHotApp: IHotApp): TAppBtn;
  21. procedure SSO(Sender: TObject);
  22. public
  23. destructor Destroy; override;
  24. function AddHotApp(AHotApp: IHotApp): Boolean; stdcall;
  25. function RemoveHotApp(AHotApp: IHotApp): Boolean; stdcall;
  26. procedure OnASyncAppIconDownloaded(AAppKey: AnsiString; const ABuffer; const ACount: Integer); stdcall;
  27. procedure InitHotApps;
  28. procedure DestroyHotApps;
  29. end;
  30. var
  31. MainFrmFooter: TMainFrmFooter;
  32. {$I LXTalk.inc}
  33. implementation
  34. uses
  35. AppCentreImport, MainFormContrller, DataProviderImport, InterfaceDataProvider,
  36. LoggerImport, MainFrm;
  37. const
  38. DOT_PNG: string = '\Images\Dot.png';
  39. DEFAULT_PNG: string = '\Images\DefaultApp.png';
  40. APPCENTRE_PNG: string = '\Images\appCentre.png';
  41. {$R *.dfm}
  42. function TMainFrmFooter.AddHotApp(AHotApp: IHotApp): Boolean;
  43. var
  44. AAppBtn: TAppBtn;
  45. begin
  46. AAppBtn := CreateAppBtn(AHotApp);
  47. FAppsLayout.AddAppBtn(AAppBtn);
  48. FAppsLayout.Layout;
  49. end;
  50. function TMainFrmFooter.CreateAppBtn(AHotApp: IHotApp): TAppBtn;
  51. var
  52. AStream: TMemoryStream;
  53. pngObj: TPNGObject;
  54. ABuffer: TBytes;
  55. img: TImage;
  56. begin
  57. Result := TAppBtn.Create(pnlFooter);
  58. with Result do
  59. begin
  60. Parent := pnlFooter;
  61. BtnStyle := absSmall;
  62. AppModel := AHotApp;
  63. DotPicture.Assign(FDotPic);
  64. Caption := (AHotApp.GetUserApp.GetTitle);
  65. ShowHint := True;
  66. end;
  67. Result.OnClick := SSO;
  68. DataProviderImport.GetAppIconProvider.FindIcon(AHotApp.GetUserApp.GetAppKey, ABuffer);
  69. if Length(ABuffer) = 0 then
  70. Result.AppIcon.LoadFromFile(ExtractFilePath(ParamStr(0)) + DEFAULT_PNG)
  71. else
  72. begin
  73. Debug('获取到ICON'+AHotApp.GetUserApp.GetAppKey, 'TMainFrmFooter.CreateAppBtn');
  74. try
  75. AStream := TMemoryStream.Create;
  76. AStream.Write(ABuffer[0], Length(ABuffer));
  77. img := TImage.Create(nil);
  78. pngObj := TPNGObject.Create;
  79. AStream.Position := 0;
  80. pngObj.LoadFromStream(AStream);
  81. Result.AppIcon.Assign(pngObj);
  82. except
  83. on E: Exception do
  84. begin
  85. Error(AHotApp.GetUserApp.GetTitle + '的图标不是有效的png图片', 'TMainFrmFooter.CreateAppBtn');
  86. Result.AppIcon.LoadFromFile(ExtractFilePath(ParamStr(0)) + DEFAULT_PNG);
  87. FreeAndNil(pngObj);
  88. FreeAndNil(AStream);
  89. end;
  90. end;
  91. FreeAndNil(pngObj);
  92. FreeAndNil(AStream);
  93. end;
  94. end;
  95. destructor TMainFrmFooter.Destroy;
  96. var
  97. AAppBtn: TAppBtn;
  98. begin
  99. while FAppsLayout.Apps.Count > 0 do
  100. begin
  101. AAppBtn := FAppsLayout.Apps.Objects[0] as TAppBtn;
  102. FAppsLayout.Apps.Delete(0);
  103. FreeAndNil(AAppBtn);
  104. end;
  105. FreeAndNil(FAppsLayout);
  106. FreeAndNil(FDotPic);
  107. inherited;
  108. end;
  109. procedure TMainFrmFooter.FormCreate(Sender: TObject);
  110. begin
  111. FAppsLayout := TAppsLayout.Create;
  112. FAppsLayout.Col := 7;
  113. FAppsLayout.Row := 1;
  114. FAppsLayout.ClientRect := Rect(57, 0, 245, 30);
  115. FDotPic := TPNGObject.Create;
  116. FDotPic.LoadFromFile(ExtractFilePath(ParamStr(0)) + DOT_PNG);
  117. imgAppCentre.Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + APPCENTRE_PNG);
  118. {$IFDEF NXQST}
  119. imgAppCentre.Hint := '纳税之家';
  120. {$ENDIF}
  121. end;
  122. procedure TMainFrmFooter.imgAppCentreClick(Sender: TObject);
  123. var
  124. AURL: string;
  125. begin
  126. if GetAppCentreConfig.GetShowType = stOnMainform then
  127. begin
  128. if not Mainform.pnlMiddleRight.Visible then
  129. begin
  130. if Mainform.RealICQClient.Logined
  131. and Mainform.RealICQClient.Connected then
  132. begin
  133. Mainform.ShowOrHideMuiltiWeb;
  134. AURL := string(GetAppCentre.GetAppCentreURL);
  135. MainForm.chrmAppCentre.Load(AURL);
  136. end;
  137. end
  138. else
  139. Mainform.ShowOrHideMuiltiWeb;
  140. end
  141. else
  142. begin
  143. GetAppCentre.OpenAppCentreFrom;
  144. // GetAppCentre.OpenWebDebuggerTool;
  145. end;
  146. end;
  147. procedure TMainFrmFooter.imgAppCentreMouseEnter(Sender: TObject);
  148. begin
  149. imgAppCentre.ShowHint := True;
  150. end;
  151. procedure TMainFrmFooter.imgAppCentreMouseLeave(Sender: TObject);
  152. begin
  153. imgAppCentre.ShowHint := False;
  154. end;
  155. procedure TMainFrmFooter.InitHotApps;
  156. var
  157. AAppBtn: TAppBtn;
  158. AList: IInterfaceList;
  159. iLoop: Integer;
  160. tmp: Integer;
  161. begin
  162. AList := GetAppCentre.GetHotApps;
  163. if AList = nil then
  164. Exit;
  165. for iLoop := 0 to AList.Count - 1 do
  166. begin
  167. AAppBtn := CreateAppBtn((AList[iLoop] as IHotApp));
  168. FAppsLayout.AddAppBtn(AAppBtn);
  169. end;
  170. FAppsLayout.Layout;
  171. // tmp := (pnlFooter.Height - imgAppCentre.Height) div 2;
  172. // imgAppCentre.Top := tmp;
  173. // imgAppCentre.Left := pnlFooter.Width - imgAppCentre.Width - tmp;
  174. end;
  175. procedure TMainFrmFooter.DestroyHotApps;
  176. var
  177. AAppBtn: TAppBtn;
  178. AList: TStringList;
  179. iLoop: Integer;
  180. begin
  181. AList := FAppsLayout.Apps;
  182. if AList = nil then
  183. Exit;
  184. while AList.Count > 0 do
  185. begin
  186. AAppBtn := AList.Objects[0] as TAppBtn;
  187. AList.Delete(0);
  188. FreeAndNil(AAppBtn);
  189. end;
  190. FAppsLayout.Layout;
  191. end;
  192. procedure TMainFrmFooter.OnASyncAppIconDownloaded(AAppKey: AnsiString;
  193. const ABuffer; const ACount: Integer);
  194. var
  195. iLoop: Integer;
  196. AAppBtn: TAppBtn;
  197. AHotApp: IHotApp;
  198. pngObj: TPNGObject;
  199. AStream: TStream;
  200. begin
  201. for iLoop := 0 to FAppsLayout.Apps.Count - 1 do
  202. begin
  203. AAppBtn := FAppsLayout.Apps.Objects[iLoop] as TAppBtn;
  204. AHotApp := AAppBtn.AppModel as IHotApp;
  205. if SameText(AHotApp.GetUserApp.GetAppKey, AAppKey) then
  206. begin
  207. AStream := TMemoryStream.Create;
  208. try
  209. pngObj := TPNGObject.Create;
  210. AStream.Position := 0;
  211. AStream.Write(TBytes(ABuffer)[0], ACount);
  212. AStream.Position := 0;
  213. pngObj.LoadFromStream(AStream);
  214. AAppBtn.AppIcon.Assign(pngObj);
  215. AAppBtn.Invalidate;
  216. FreeAndNil(pngObj);
  217. finally
  218. AStream.Free;
  219. end;
  220. Exit;
  221. end;
  222. end;
  223. end;
  224. procedure TMainFrmFooter.pnlFooterResize(Sender: TObject);
  225. var
  226. tmp: Integer;
  227. begin
  228. tmp := ((Sender as TControl).Height - imgAppCentre.Height) div 2;
  229. imgAppCentre.Top := tmp;
  230. imgAppCentre.Left := (Sender as TControl).Width - imgAppCentre.Width - tmp;
  231. end;
  232. function TMainFrmFooter.RemoveHotApp(AHotApp: IHotApp): Boolean;
  233. var
  234. iLoop: Integer;
  235. AAppBtn: TAppBtn;
  236. AOldHotApp: IHotApp;
  237. begin
  238. for iLoop := 0 to FAppsLayout.Apps.Count - 1 do
  239. begin
  240. AAppBtn := FAppsLayout.Apps.Objects[iLoop] as TAppBtn;
  241. AOldHotApp := AAppBtn.AppModel as IHotApp;
  242. if SameText(AOldHotApp.GetUserApp.GetAppKey, AHotApp.GetUserApp.GetAppKey) then
  243. begin
  244. FAppsLayout.RemoveAppBtn(AAppBtn);
  245. FreeAndNil(AAppBtn);
  246. Exit;
  247. end;
  248. end;
  249. end;
  250. procedure TMainFrmFooter.SSO(Sender: TObject);
  251. var
  252. AHotApp: IHotApp;
  253. begin
  254. if (Sender = nil) or not (Sender is TAppBtn) then
  255. Exit;
  256. AHotApp := (Sender as TAppBtn).AppModel as IHotApp;
  257. GetAppCentre.SSO(AHotApp.GetUserApp.GetAppKey);
  258. end;
  259. initialization
  260. finalization
  261. if MainFrmFooter <> nil then
  262. FreeAndNil(MainFrmFooter);
  263. end.