unit MainFormFooter; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, InterfaceAppCentre, cefvcl, AppsLayout, AppBtn, pngimage, jpeg; type TMainFrmFooter = class(TForm, IHotAppView) pnlFooter: TPanel; chrm1: TChromium; imgAppCentre: TImage; procedure FormCreate(Sender: TObject); procedure imgAppCentreClick(Sender: TObject); procedure pnlFooterResize(Sender: TObject); procedure imgAppCentreMouseEnter(Sender: TObject); procedure imgAppCentreMouseLeave(Sender: TObject); private FAppsLayout: TAppsLayout; FDotPic: TGraphic; function CreateAppBtn(AHotApp: IHotApp): TAppBtn; procedure SSO(Sender: TObject); public destructor Destroy; override; function AddHotApp(AHotApp: IHotApp): Boolean; stdcall; function RemoveHotApp(AHotApp: IHotApp): Boolean; stdcall; procedure OnASyncAppIconDownloaded(AAppKey: AnsiString; const ABuffer; const ACount: Integer); stdcall; procedure InitHotApps; procedure DestroyHotApps; end; var MainFrmFooter: TMainFrmFooter; {$I LXTalk.inc} implementation uses AppCentreImport, MainFormContrller, DataProviderImport, InterfaceDataProvider, LoggerImport, MainFrm; const DOT_PNG: string = '\Images\Dot.png'; DEFAULT_PNG: string = '\Images\DefaultApp.png'; APPCENTRE_PNG: string = '\Images\appCentre.png'; {$R *.dfm} function TMainFrmFooter.AddHotApp(AHotApp: IHotApp): Boolean; var AAppBtn: TAppBtn; begin AAppBtn := CreateAppBtn(AHotApp); FAppsLayout.AddAppBtn(AAppBtn); FAppsLayout.Layout; end; function TMainFrmFooter.CreateAppBtn(AHotApp: IHotApp): TAppBtn; var AStream: TMemoryStream; pngObj: TPNGObject; ABuffer: TBytes; img: TImage; begin Result := TAppBtn.Create(pnlFooter); with Result do begin Parent := pnlFooter; BtnStyle := absSmall; AppModel := AHotApp; DotPicture.Assign(FDotPic); Caption := (AHotApp.GetUserApp.GetTitle); ShowHint := True; end; Result.OnClick := SSO; DataProviderImport.GetAppIconProvider.FindIcon(AHotApp.GetUserApp.GetAppKey, ABuffer); if Length(ABuffer) = 0 then Result.AppIcon.LoadFromFile(ExtractFilePath(ParamStr(0)) + DEFAULT_PNG) else begin Debug('获取到ICON'+AHotApp.GetUserApp.GetAppKey, 'TMainFrmFooter.CreateAppBtn'); try AStream := TMemoryStream.Create; AStream.Write(ABuffer[0], Length(ABuffer)); img := TImage.Create(nil); pngObj := TPNGObject.Create; AStream.Position := 0; pngObj.LoadFromStream(AStream); Result.AppIcon.Assign(pngObj); except on E: Exception do begin Error(AHotApp.GetUserApp.GetTitle + '的图标不是有效的png图片', 'TMainFrmFooter.CreateAppBtn'); Result.AppIcon.LoadFromFile(ExtractFilePath(ParamStr(0)) + DEFAULT_PNG); FreeAndNil(pngObj); FreeAndNil(AStream); end; end; FreeAndNil(pngObj); FreeAndNil(AStream); end; end; destructor TMainFrmFooter.Destroy; var AAppBtn: TAppBtn; begin while FAppsLayout.Apps.Count > 0 do begin AAppBtn := FAppsLayout.Apps.Objects[0] as TAppBtn; FAppsLayout.Apps.Delete(0); FreeAndNil(AAppBtn); end; FreeAndNil(FAppsLayout); FreeAndNil(FDotPic); inherited; end; procedure TMainFrmFooter.FormCreate(Sender: TObject); begin FAppsLayout := TAppsLayout.Create; FAppsLayout.Col := 7; FAppsLayout.Row := 1; FAppsLayout.ClientRect := Rect(57, 0, 245, 30); FDotPic := TPNGObject.Create; FDotPic.LoadFromFile(ExtractFilePath(ParamStr(0)) + DOT_PNG); imgAppCentre.Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + APPCENTRE_PNG); {$IFDEF NXQST} imgAppCentre.Hint := '纳税之家'; {$ENDIF} end; procedure TMainFrmFooter.imgAppCentreClick(Sender: TObject); var AURL: string; begin if GetAppCentreConfig.GetShowType = stOnMainform then begin if not Mainform.pnlMiddleRight.Visible then begin if Mainform.RealICQClient.Logined and Mainform.RealICQClient.Connected then begin Mainform.ShowOrHideMuiltiWeb; AURL := string(GetAppCentre.GetAppCentreURL); MainForm.chrmAppCentre.Load(AURL); end; end else Mainform.ShowOrHideMuiltiWeb; end else begin GetAppCentre.OpenAppCentreFrom; // GetAppCentre.OpenWebDebuggerTool; end; end; procedure TMainFrmFooter.imgAppCentreMouseEnter(Sender: TObject); begin imgAppCentre.ShowHint := True; end; procedure TMainFrmFooter.imgAppCentreMouseLeave(Sender: TObject); begin imgAppCentre.ShowHint := False; end; procedure TMainFrmFooter.InitHotApps; var AAppBtn: TAppBtn; AList: IInterfaceList; iLoop: Integer; tmp: Integer; begin AList := GetAppCentre.GetHotApps; if AList = nil then Exit; for iLoop := 0 to AList.Count - 1 do begin AAppBtn := CreateAppBtn((AList[iLoop] as IHotApp)); FAppsLayout.AddAppBtn(AAppBtn); end; FAppsLayout.Layout; // tmp := (pnlFooter.Height - imgAppCentre.Height) div 2; // imgAppCentre.Top := tmp; // imgAppCentre.Left := pnlFooter.Width - imgAppCentre.Width - tmp; end; procedure TMainFrmFooter.DestroyHotApps; var AAppBtn: TAppBtn; AList: TStringList; iLoop: Integer; begin AList := FAppsLayout.Apps; if AList = nil then Exit; while AList.Count > 0 do begin AAppBtn := AList.Objects[0] as TAppBtn; AList.Delete(0); FreeAndNil(AAppBtn); end; FAppsLayout.Layout; end; procedure TMainFrmFooter.OnASyncAppIconDownloaded(AAppKey: AnsiString; const ABuffer; const ACount: Integer); var iLoop: Integer; AAppBtn: TAppBtn; AHotApp: IHotApp; pngObj: TPNGObject; AStream: TStream; begin for iLoop := 0 to FAppsLayout.Apps.Count - 1 do begin AAppBtn := FAppsLayout.Apps.Objects[iLoop] as TAppBtn; AHotApp := AAppBtn.AppModel as IHotApp; if SameText(AHotApp.GetUserApp.GetAppKey, AAppKey) then begin AStream := TMemoryStream.Create; try pngObj := TPNGObject.Create; AStream.Position := 0; AStream.Write(TBytes(ABuffer)[0], ACount); AStream.Position := 0; pngObj.LoadFromStream(AStream); AAppBtn.AppIcon.Assign(pngObj); AAppBtn.Invalidate; FreeAndNil(pngObj); finally AStream.Free; end; Exit; end; end; end; procedure TMainFrmFooter.pnlFooterResize(Sender: TObject); var tmp: Integer; begin tmp := ((Sender as TControl).Height - imgAppCentre.Height) div 2; imgAppCentre.Top := tmp; imgAppCentre.Left := (Sender as TControl).Width - imgAppCentre.Width - tmp; end; function TMainFrmFooter.RemoveHotApp(AHotApp: IHotApp): Boolean; var iLoop: Integer; AAppBtn: TAppBtn; AOldHotApp: IHotApp; begin for iLoop := 0 to FAppsLayout.Apps.Count - 1 do begin AAppBtn := FAppsLayout.Apps.Objects[iLoop] as TAppBtn; AOldHotApp := AAppBtn.AppModel as IHotApp; if SameText(AOldHotApp.GetUserApp.GetAppKey, AHotApp.GetUserApp.GetAppKey) then begin FAppsLayout.RemoveAppBtn(AAppBtn); FreeAndNil(AAppBtn); Exit; end; end; end; procedure TMainFrmFooter.SSO(Sender: TObject); var AHotApp: IHotApp; begin if (Sender = nil) or not (Sender is TAppBtn) then Exit; AHotApp := (Sender as TAppBtn).AppModel as IHotApp; GetAppCentre.SSO(AHotApp.GetUserApp.GetAppKey); end; initialization finalization if MainFrmFooter <> nil then FreeAndNil(MainFrmFooter); end.