TalkMainView.pas 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. unit TalkMainView;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs, ExtCtrls, OleCtrls, SHDocVw, StdCtrls, RxRichEd, RealICQRichEdit,
  6. Buttons, RealICQButton, RealICQSpeedButton, UITalkFormBase, cefvcl, ceflib;
  7. type
  8. TTalkMainViewForm = class(TForm)
  9. pnlTalkingArea: TPanel;
  10. Splitter1: TSplitter;
  11. pnlInputer: TPanel;
  12. pnlInputeBack: TPanel;
  13. pnlBar: TPanel;
  14. pnlDisplayer: TPanel;
  15. pnlForWebBrowser: TPanel;
  16. WebBrowser: TChromium;
  17. spbFont: TRealICQSpeedButton;
  18. spbSelUIColor: TRealICQSpeedButton;
  19. spbBackground: TRealICQSpeedButton;
  20. spbFace: TRealICQSpeedButton;
  21. spbSendImage: TRealICQSpeedButton;
  22. spbShakeWindow: TRealICQSpeedButton;
  23. spbCopyScreen: TRealICQSpeedButton;
  24. ImgInputerTopMiddle: TImage;
  25. spbNormalMsg: TRealICQSpeedButton;
  26. spbHistroyMessage: TRealICQSpeedButton;
  27. Panel1: TPanel;
  28. Panel2: TPanel;
  29. RichEdInputer: TRealICQRichEdit;
  30. lblState: TLabel;
  31. btDownArrow: TRealICQButton;
  32. btSend: TRealICQButton;
  33. btCloseTalk: TRealICQButton;
  34. procedure btSendClick(Sender: TObject);
  35. procedure WebBrowserProcessMessageReceived(Sender: TObject;
  36. const browser: ICefBrowser; sourceProcess: TCefProcessId;
  37. const message: ICefProcessMessage; out Result: Boolean);
  38. procedure WebBrowserKeyEvent(Sender: TObject; const browser: ICefBrowser;
  39. const event: PCefKeyEvent; osEvent: PMsg; out Result: Boolean);
  40. private
  41. FLastSendMsgTicket: Cardinal;
  42. FUITalkFormBase: TUITalkFormBase;
  43. FContextGUID: string;
  44. function GetInputerLength: Integer;
  45. procedure RichEdInputerChange(Sender: TObject);
  46. public
  47. property TalkFormBase : TUITalkFormBase read FUITalkFormBase write FUITalkFormBase;
  48. end;
  49. implementation
  50. uses
  51. RealICQModel, HtmlService, FaceService, LimitCondition, xFonts, LoggerImport,
  52. InterfaceLogger, DevToolChromeFrm;
  53. const
  54. TalkingTextColor :String = '#585858'; {对话窗口中系统信息字体颜色}
  55. MaxMessageLength :Integer = 3500; {消息的最大字符数}
  56. {$R *.dfm}
  57. function TTalkMainViewForm.GetInputerLength: Integer;
  58. var
  59. AFace: TFace;
  60. iLoop,
  61. InputerLength: Integer;
  62. FaceInRichEdit: TFaceInRichEdit;
  63. FaceIndexes: TIndexes;
  64. AFaceService: TFaceService;
  65. begin
  66. InputerLength := Length(Trim(RichEdInputer.Text));
  67. FaceIndexes := RichEdInputer.GetFaceIndexes;
  68. AFaceService := TFaceService.GetService;
  69. for iLoop := 0 to Length(FaceIndexes) - 1 do
  70. begin
  71. FaceInRichEdit := FaceIndexes[iLoop];
  72. AFace := AFaceService.GetFace(FaceInRichEdit.FaceIndex);
  73. if AFaceService.IsSystemFace(FaceInRichEdit.FaceIndex) then
  74. Inc(InputerLength, Length(AFace.ShortCut))
  75. else
  76. Inc(InputerLength, 38);
  77. end;
  78. Result := InputerLength;
  79. end;
  80. procedure TTalkMainViewForm.btSendClick(Sender: TObject);
  81. var
  82. AFace: TFace;
  83. FaceMD5String,
  84. MessageStr: String;
  85. BaseSelStart,
  86. iCount,
  87. iLoop: Integer;
  88. FaceInRichEdit: TFaceInRichEdit;
  89. FaceIndexes: TIndexes;
  90. FRealICQUser: TRealICQUser;
  91. saystr,
  92. AError: String;
  93. AFaces: TStringList;
  94. AFaceService: TFaceService;
  95. msg: ICefProcessMessage;
  96. ACefObject,ACefFunction: ICefv8Value;
  97. Argm: TCefv8ValueArray;
  98. begin
  99. msg := TCefProcessMessageRef.New('RecvMessage');
  100. msg.ArgumentList.SetString(0, FContextGUID);
  101. WebBrowser.Browser.SendProcessMessage(PID_RENDERER, msg);
  102. // WebBrowser.Browser.MainFrame.ExecuteJavaScript('lxtalkClient.OnRecvMessage()', WebBrowser.Browser.MainFrame.GetURL, 0);
  103. // ACefObject := WebBrowser.Browser.MainFrame.GetV8Context.Global.GetValueByKey('lxtalkClient');
  104. // ACefFunction := ACefObject.GetValueByKey('OnRecvMessage');
  105. // if (ACefObject <> nil) and (ACefObject.IsFunction) then
  106. // ACefObject.ExecuteFunction(ACefFunction, Argm);
  107. // if (GetTickCount - FLastSendMsgTicket) < 200 then
  108. // begin
  109. // THtmlService.GetService.ShowSendMessageTooQuickly(WebBrowser);
  110. // Exit;
  111. // end;
  112. //
  113. // if GetInputerLength > MaxMessageLength + 64 then
  114. // begin
  115. // MessageBox(Handle, '对不起,您输入消息太长', '提示', MB_ICONINFORMATION);
  116. // RichEdInputer.SetFocus;
  117. // Exit;
  118. // end;
  119. //
  120. // MessageStr := '';
  121. // AFaces:= TStringList.Create;
  122. //
  123. // FaceIndexes := RichEdInputer.GetFaceIndexes;
  124. // BaseSelStart := 0;
  125. // RichEdInputer.OnChange := nil;
  126. // RichEdInputer.Visible := False;
  127. // AFaceService := TFaceService.GetService;
  128. // try
  129. // iCount := 0;
  130. // for iLoop := 0 to Length(FaceIndexes) - 1 do
  131. // begin
  132. // FaceInRichEdit := FaceIndexes[iLoop];
  133. // AFace := AFaceService.GetFace(FaceInRichEdit.FaceIndex);
  134. // if TLimitCondition.GreaterThanFaceMaxSize(AFace.FileName, AError) then
  135. // begin
  136. // MessageBox(Handle, PChar(AError), '提示', MB_ICONINFORMATION);
  137. // Error(AError, 'TLimitCondition.GreaterThanFaceMaxSize');
  138. // RichEdInputer.SetFocus;
  139. // Exit;
  140. // end;
  141. // end;
  142. //
  143. // for iLoop := 0 to Length(FaceIndexes) - 1 do
  144. // begin
  145. // FaceInRichEdit := FaceIndexes[iLoop];
  146. // AFace := AFaceService.GetFace(FaceInRichEdit.FaceIndex);
  147. //
  148. // if AFaceService.IsSystemFace(FaceInRichEdit.FaceIndex) then
  149. // FaceMD5String := AFace.ShortCut
  150. // else
  151. // begin
  152. // FaceMD5String := '[IMG:' + AFace.MD5Code + ']';
  153. // Inc(iCount);
  154. // AFaces.addObject(AFace.FileName, AFace);
  155. // end;
  156. //
  157. // RichEdInputer.SelStart := BaseSelStart + FaceInRichEdit.FacePosition;
  158. // RichEdInputer.SelLength := 1;
  159. // RichEdInputer.SelText := FaceMD5String;
  160. // Inc(BaseSelStart, Length(FaceMD5String) - 1);
  161. // end;
  162. //
  163. // MessageStr := Trim(RichEdInputer.Text);
  164. // if Length(MessageStr) = 0 then
  165. // begin
  166. // MessageBox(Handle, '对不起,不能发送空消息', '提示', MB_ICONINFORMATION);
  167. // Exit;
  168. // end;
  169. //
  170. // if GetInputerLength > 4096 then
  171. // begin
  172. // MessageBox(Handle, '对不起,您输入消息太长', '提示', MB_ICONINFORMATION);
  173. // RichEdInputer.SetFocus;
  174. // Exit;
  175. // end;
  176. // finally
  177. // RichEdInputer.Visible := True;
  178. // RichEdInputer.SetFocus;
  179. // end;
  180. //
  181. // RichEdInputer.MaxLength := MaxMessageLength;
  182. // RichEdInputer.Lines.Clear;
  183. // RichEdInputer.Clear;
  184. // RichEdInputer.OnChange := RichEdInputerChange;
  185. // RichEdInputer.Visible := True;
  186. // RichEdInputer.SetFocus;
  187. // FUITalkFormBase.ClearImages;
  188. //
  189. // FUITalkFormBase.SendMessage(MessageStr, FontToString(RichEdInputer.Font), AFaces);
  190. // FLastSendMsgTicket := GetTickCount;
  191. end;
  192. procedure TTalkMainViewForm.RichEdInputerChange(Sender: TObject);
  193. var
  194. iLoop,
  195. iLength,
  196. InputerLength,
  197. iStart:Integer;
  198. AFace: TFace;
  199. AFaces: TStringList;
  200. begin
  201. iLength := Length(RichEdInputer.Text);
  202. FUITalkFormBase.SendInputing;
  203. if iLength = 0 then Exit;
  204. RichEdInputer.OnChange := nil;
  205. AFaces := TFaceService.GetService.Faces;
  206. try
  207. for iLoop := 0 to AFaces.Count - 1 do
  208. begin
  209. AFace := AFaces.Objects[iLoop] as TFace;
  210. if AFace.ShortCut = '' then continue;
  211. iStart := TRxRichEdit(Sender).FindText(AFace.ShortCut, 0, iLength, []);
  212. while iStart >= 0 do
  213. begin
  214. RichEdInputer.SelStart := iStart;
  215. RichEdInputer.SelLength := Length(AFace.ShortCut);
  216. RichEdInputer.InsertImage(AFace.FileName, iLoop);
  217. RichEdInputer.SelStart := TRxRichEdit(Sender).SelStart;
  218. RichEdInputer.SelLength := 0;
  219. iStart := RichEdInputer.FindText(AFace.ShortCut, RichEdInputer.SelStart, iLength, []);
  220. end;
  221. end;
  222. finally
  223. RichEdInputer.OnChange := RichEdInputerChange;
  224. end;
  225. RichEdInputer.MaxLength := Length(Trim(RichEdInputer.Text));
  226. InputerLength := GetInputerLength;
  227. if MaxMessageLength - InputerLength > 0 then
  228. RichEdInputer.MaxLength := RichEdInputer.MaxLength + (MaxMessageLength - InputerLength);
  229. RichEdInputer.Invalidate;
  230. end;
  231. procedure TTalkMainViewForm.WebBrowserKeyEvent(Sender: TObject;
  232. const browser: ICefBrowser; const event: PCefKeyEvent; osEvent: PMsg;
  233. out Result: Boolean);
  234. begin
  235. if (event^.windows_key_code = VK_F12) then
  236. ShowDevTool(Self, WebBrowser);
  237. end;
  238. procedure TTalkMainViewForm.WebBrowserProcessMessageReceived(Sender: TObject;
  239. const browser: ICefBrowser; sourceProcess: TCefProcessId;
  240. const message: ICefProcessMessage; out Result: Boolean);
  241. begin
  242. Result := True;
  243. if (message.ArgumentList.GetSize = 0) and (message.ArgumentList.GetType(0) <> VTYPE_STRING) then
  244. Exit;
  245. if message.ArgumentList.GetString(0) = 'register' then
  246. begin
  247. FContextGUID := message.ArgumentList.GetString(2);
  248. ShowMessage(FContextGUID);
  249. end;
  250. end;
  251. end.