CnQQPanel.pas 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874
  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 CnQQPanel;
  21. {* |<PRE>
  22. ================================================================================
  23. * 软件名称:界面组件包
  24. * 单元名称:QQ面板显示界面的实现单元
  25. * 单元作者:rarnu(rarnu@cnpack.org)
  26. * 备 注:
  27. * 开发平台:Windows2003 Server + Delphi2007 up2
  28. * 兼容测试:Windows2000/XP/2003/Vista + Delphi 7/2006/2007/2009
  29. * 本 地 化:该单元中的字符串均符合本地化处理方式
  30. * 单元标识:$Id$
  31. * 修改记录:2009.06.22 V1.0
  32. * 创建单元
  33. ================================================================================
  34. |</PRE>}
  35. interface
  36. {$I CnPack.inc}
  37. uses
  38. Windows, Classes, SysUtils, StdCtrls, Graphics, ExtCtrls, Controls, Forms,
  39. Messages;
  40. type
  41. TCnMemberNotifyEvent = procedure(Sender: TObject; AData: Pointer) of object;
  42. TCnIconNotifyEvent = procedure(Sender: TObject; AData: Pointer) of object;
  43. TCnQQIconData = class
  44. private
  45. FIconDesc: string;
  46. FIconName: string;
  47. FIconID: string;
  48. public
  49. property IconID: string read FIconID write FIconID;
  50. property IconName: string read FIconName write FIconName;
  51. property IconDesc: string read FIconDesc write FIconDesc;
  52. end;
  53. TCnQQIcon = class(TPanel)
  54. private
  55. FImage: TImage;
  56. FData: Pointer;
  57. FOnIconClick: TCnIconNotifyEvent;
  58. FOnIconDoubleClick: TCnIconNotifyEvent;
  59. FNormalIcon: string;
  60. FHotIcon: string;
  61. procedure SetNormalIcon(const Value: string);
  62. procedure SetData(const Value: Pointer);
  63. protected
  64. procedure OnImgClick(Sender: TObject);
  65. procedure OnImgDblClick(Sender: TObject);
  66. public
  67. constructor Create(AOwner: TComponent); override;
  68. public
  69. property Data: Pointer read FData write SetData;
  70. property Image: TImage read FImage write FImage;
  71. property NormalIcon: string read FNormalIcon write SetNormalIcon;
  72. property HotIcon: string read FHotIcon write FHotIcon;
  73. property OnIconClick: TCnIconNotifyEvent read FOnIconClick write FOnIconClick;
  74. property OnIconDoubleClick: TCnIconNotifyEvent read FOnIconDoubleClick write FOnIconDoubleClick;
  75. end;
  76. TCnQQIconArray = array of TCnQQIcon;
  77. TCnQQPerson = class
  78. private
  79. FUserID: string;
  80. FUserDesc: string;
  81. FUserName: string;
  82. FUserIcons: TCnQQIconArray;
  83. FUserHead: string;
  84. FNameColor: TColor;
  85. public
  86. procedure AddIcon(Ico: TCnQQIcon);
  87. procedure RemoveIcon(Index: Integer);
  88. constructor Create;
  89. public
  90. property UserID: string read FUserID write FUserID;
  91. property UserName: string read FUserName write FUserName;
  92. property UserDesc: string read FUserDesc write FUserDesc;
  93. property UserIcons: TCnQQIconArray read FUserIcons write FUserIcons;
  94. property UserHead: string read FUserHead write FUserHead;
  95. property NameColor: TColor read FNameColor write FNameColor default clBlack;
  96. end;
  97. TCnQQMember = class(TPanel)
  98. private
  99. FHeadImage: TImage;
  100. FPnlCont: TPanel;
  101. FPNickName: TPanel;
  102. FPDesc: TPanel;
  103. FPExtension: TPanel;
  104. { FGlass: TRaNGlassPanel; }
  105. FNickName: TLabel;
  106. FDesc: TLabel;
  107. FExtension: TLabel;
  108. FData: Pointer;
  109. FQQIcons: TCnQQIconArray;
  110. FUserID: string;
  111. {$IFNDEF BDS2006_UP}
  112. FOnMouseEnter: TNotifyEvent;
  113. FOnMouseLeave: TNotifyEvent;
  114. {$ENDIF}
  115. protected
  116. {$IFNDEF BDS2006_UP}
  117. procedure DoMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
  118. procedure DoMouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
  119. {$ENDIF}
  120. procedure OnGlassMouseEnter(Sender: TObject);
  121. procedure OnGlassMouseLeave(Sender: TObject);
  122. procedure OnGlassClick(Sender: TObject);
  123. procedure OnGlassDoubleClick(Sender: TObject);
  124. procedure OnImageMouseEnter(Sender: TObject);
  125. procedure OnImageMouseLeave(Sender: TObject);
  126. public
  127. constructor Create(AOwner: TComponent); override;
  128. destructor Destroy; override;
  129. procedure AddIcon(Ico: TCnQQIcon);
  130. procedure RemoveIcon(Index: Integer);
  131. public
  132. property Data: Pointer read FData write FData;
  133. property QQIcons: TCnQQIconArray read FQQIcons write FQQIcons;
  134. published
  135. property UserID: string read FUserID write FUserID;
  136. property HeadImage: TImage read FHeadImage write FHeadImage;
  137. property NickName: TLabel read FNickName write FNickName;
  138. property Desc: TLabel read FDesc write FDesc;
  139. property Extension: TLabel read FExtension write FExtension;
  140. {$IFNDEF BDS2006_UP}
  141. property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
  142. property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
  143. {$ENDIF}
  144. end;
  145. TCnQQMemberArray = array of TCnQQMember;
  146. TCnQQGroup = class(TPanel)
  147. private
  148. FMembers: TCnQQMemberArray;
  149. function GetMemberCount: Integer;
  150. procedure SetMemberCount(const Value: Integer);
  151. public
  152. constructor Create(AOwner: TComponent); override;
  153. function AddMember(person: TCnQQPerson): Boolean;
  154. procedure RemoveMember(Index: Integer);
  155. public
  156. property Members: TCnQQMemberArray read FMembers write FMembers;
  157. published
  158. property MemberCount: Integer read GetMemberCount write SetMemberCount;
  159. end;
  160. TCnQQGroupWTitle = class(TPanel)
  161. private
  162. FTitle: TPanel;
  163. FGroup: TCnQQGroup;
  164. FTitleImage: TImage;
  165. FTitleName: TLabel;
  166. protected
  167. procedure OnTitleClick(Sender: TObject);
  168. procedure OnTitleMouseEnter(Sender: TObject);
  169. procedure OnTitleMouseLeave(Sender: TObject);
  170. public
  171. constructor Create(AOwner: TComponent); override;
  172. procedure Expand;
  173. procedure Packup;
  174. published
  175. property Title: TPanel read FTitle write FTitle;
  176. property TitleImage: TImage read FTitleImage write FTitleImage;
  177. property TitleName: TLabel read FTitleName write FTitleName;
  178. property QQGroup: TCnQQGroup read FGroup write FGroup;
  179. end;
  180. TCnQQGroupWTitleArray = array of TCnQQGroupWTitle;
  181. TCnQQPanel = class(TScrollBox)
  182. private
  183. FGroups: TCnQQGroupWTitleArray;
  184. FOnMemberClick: TCnMemberNotifyEvent;
  185. FOnMemberDblClick: TCnMemberNotifyEvent;
  186. function GetGroupCount: Integer;
  187. procedure SetGroupCount(const Value: Integer);
  188. protected
  189. procedure SetPanelHeight;
  190. public
  191. constructor Create(AOwner: TComponent); override;
  192. function AddGroup(AName: string): Boolean;
  193. procedure RemoveGroup(Index: Integer);
  194. procedure ExpandAll;
  195. procedure PackupAll;
  196. public
  197. property Groups: TCnQQGroupWTitleArray read FGroups write FGroups;
  198. published
  199. property GroupCount: Integer read GetGroupCount write SetGroupCount;
  200. property OnMemberClick: TCnMemberNotifyEvent read FOnMemberClick write FOnMemberClick;
  201. property OnMemberDblClick: TCnMemberNotifyEvent read FOnMemberDblClick write FOnMemberDblClick;
  202. end;
  203. implementation
  204. {$R CnQQPanel.res}
  205. { TCnQQMember }
  206. procedure TCnQQMember.AddIcon(Ico: TCnQQIcon);
  207. var
  208. len: Integer;
  209. begin
  210. len := Length(FQQIcons);
  211. {$IFDEF BDS2006_UP}
  212. ico.Image.OnMouseEnter := OnImageMouseEnter;
  213. ico.Image.OnMouseLeave := OnImageMouseLeave;
  214. {$ENDIF}
  215. SetLength(FQQIcons, len + 1);
  216. FQQIcons[len] := ico;
  217. FQQIcons[len].Parent := FPExtension;
  218. FQQIcons[len].Align := alLeft;
  219. end;
  220. constructor TCnQQMember.Create(AOwner: TComponent);
  221. begin
  222. inherited Create(AOwner);
  223. BevelOuter := bvNone;
  224. Height := 54;
  225. Color := clWindow;
  226. OnMouseEnter := OnGlassMouseEnter;
  227. OnMouseLeave := OnGlassMouseLeave;
  228. OnClick := OnGlassClick;
  229. OnDblClick := OnGlassDoubleClick;
  230. FHeadImage := TImage.Create(self);
  231. FHeadImage.Parent := self;
  232. {$IFDEF BDS2006_UP}
  233. FHeadImage.Margins.Top := 7;
  234. FHeadImage.Margins.Bottom := 7;
  235. FHeadImage.Margins.Right := 15;
  236. FHeadImage.AlignWithMargins := True;
  237. {$ENDIF}
  238. FHeadImage.Align := alLeft;
  239. FHeadImage.Height := 40;
  240. FHeadImage.Width := 40;
  241. FHeadImage.Transparent := True;
  242. FPnlCont := TPanel.Create(self);
  243. FPnlCont.Parent := self;
  244. FPnlCont.BevelOuter := bvNone;
  245. FPnlCont.Caption := EmptyStr;
  246. FPnlCont.Align := alClient;
  247. FPnlCont.Color := clWindow;
  248. {$IFDEF BDS2006_UP}
  249. FPnlCont.OnMouseEnter := OnGlassMouseEnter;
  250. FPnlCont.OnMouseLeave := OnGlassMouseLeave;
  251. {$ENDIF}
  252. FPnlCont.OnClick := OnGlassClick;
  253. FPnlCont.OnDblClick := OnGlassDoubleClick;
  254. FPNickName:= TPanel.Create(Self);
  255. FPNickName.Parent := FPnlCont;
  256. FPNickName.BevelOuter := bvNone;
  257. FPNickName.Caption := EmptyStr;
  258. FPNickName.Height := 16;
  259. FPNickName.Align := alTop;
  260. FPNickName.Color := clWindow;
  261. FPDesc:= TPanel.Create(Self);
  262. FPDesc.Parent := FPnlCont;
  263. FPDesc.BevelOuter := bvNone;
  264. FPDesc.Caption := EmptyStr;
  265. FPDesc.Height := 16;
  266. FPDesc.Align := alTop;
  267. FPDesc.Color := clWindow;
  268. FPDesc.Font.Color := clGray;
  269. FPExtension:= TPanel.Create(Self);
  270. FPExtension.Parent := FPnlCont;
  271. FPExtension.BevelOuter := bvNone;
  272. FPExtension.Caption := EmptyStr;
  273. FPExtension.Height := 18;
  274. FPExtension.Align := alClient;
  275. FPExtension.Color := clWindow;
  276. {$IFDEF BDS2006_UP}
  277. FHeadImage.OnMouseEnter := OnGlassMouseEnter;
  278. FHeadImage.OnMouseLeave := OnGlassMouseLeave;
  279. {$ENDIF}
  280. FHeadImage.OnClick := OnGlassClick;
  281. FHeadImage.OnDblClick := OnGlassDoubleClick;
  282. FNickName := TLabel.Create(self);
  283. FNickName.Parent := FPNickName;
  284. FNickName.Color := clWindow;
  285. FNickName.Align := alClient;
  286. FNickName.Layout := tlCenter;
  287. FDesc := TLabel.Create(self);
  288. FDesc.Parent := FPDesc;
  289. FDesc.Color := clWindow;
  290. FDesc.Align := alClient;
  291. FDesc.Layout := tlCenter;
  292. FExtension := TLabel.Create(self);
  293. FExtension.Parent := FPExtension;
  294. FExtension.Color := clWindow;
  295. FExtension.Align := alClient;
  296. FExtension.Layout := tlCenter;
  297. {$IFDEF BDS2006_UP}
  298. FNickName.OnMouseEnter := OnGlassMouseEnter;
  299. FNickName.OnMouseLeave := OnGlassMouseLeave;
  300. {$ENDIF}
  301. FNickName.OnClick := OnGlassClick;
  302. FNickName.OnDblClick := OnGlassDoubleClick;
  303. {$IFDEF BDS2006_UP}
  304. FDesc.OnMouseEnter := OnGlassMouseEnter;
  305. FDesc.OnMouseLeave := OnGlassMouseLeave;
  306. {$ENDIF}
  307. FDesc.OnClick := OnGlassClick;
  308. FDesc.OnDblClick := OnGlassDoubleClick;
  309. {$IFDEF BDS2006_UP}
  310. FExtension.OnMouseEnter := OnGlassMouseEnter;
  311. FExtension.OnMouseLeave := OnGlassMouseLeave;
  312. {$ENDIF}
  313. FExtension.OnClick := OnGlassClick;
  314. FExtension.OnDblClick := OnGlassDoubleClick;
  315. end;
  316. destructor TCnQQMember.Destroy;
  317. begin
  318. inherited;
  319. end;
  320. procedure TCnQQMember.OnGlassClick(Sender: TObject);
  321. begin
  322. if Parent.Parent <> nil then
  323. begin
  324. if Parent.Parent.Parent <> nil then
  325. begin
  326. if Parent.Parent.Parent.ClassName = 'TCnQQPanel' then
  327. begin
  328. if Assigned(TCnQQPanel(Parent.Parent.Parent).OnMemberClick) then
  329. TCnQQPanel(Parent.Parent.Parent).OnMemberClick(self, Data);
  330. end;
  331. end;
  332. end;
  333. end;
  334. procedure TCnQQMember.OnGlassDoubleClick(Sender: TObject);
  335. begin
  336. if Parent.Parent <> nil then
  337. begin
  338. if Parent.Parent.Parent <> nil then
  339. begin
  340. if Parent.Parent.Parent.ClassName = 'TCnQQPanel' then
  341. begin
  342. if Assigned(TCnQQPanel(Parent.Parent.Parent).OnMemberDblClick) then
  343. TCnQQPanel(Parent.Parent.Parent).OnMemberDblClick(self, Data);
  344. end;
  345. end;
  346. end;
  347. end;
  348. {$IFNDEF BDS2006_UP}
  349. procedure TCnQQMember.DoMouseEnter(var Msg: TMessage);
  350. begin
  351. if Assigned(FOnMouseEnter) then
  352. FOnMouseEnter(Self);
  353. end;
  354. procedure TCnQQMember.DoMouseLeave(var Msg: TMessage);
  355. begin
  356. if Assigned(FOnMouseLeave) then
  357. FOnMouseLeave(Self);
  358. end;
  359. {$ENDIF}
  360. procedure TCnQQMember.OnGlassMouseEnter(Sender: TObject);
  361. begin
  362. Color := $00E9E0DA;
  363. FPnlCont.Color := $00E9E0DA;
  364. FPNickName.Color := $00E9E0DA;
  365. FPDesc.Color := $00E9E0DA;
  366. FPExtension.Color := $00E9E0DA;
  367. end;
  368. procedure TCnQQMember.OnGlassMouseLeave(Sender: TObject);
  369. begin
  370. Color := clWindow;
  371. FPnlCont.Color := clWindow;
  372. FPNickName.Color := clWindow;
  373. FPDesc.Color := clWindow;
  374. FPExtension.Color := clWindow;
  375. end;
  376. procedure TCnQQMember.OnImageMouseEnter(Sender: TObject);
  377. begin
  378. OnGlassMouseEnter(Self);
  379. if FileExists(TCnQQIcon(TImage(Sender).Parent).HotIcon) then
  380. TImage(Sender).Picture.Bitmap.LoadFromFile(
  381. TCnQQIcon(TImage(Sender).Parent).HotIcon);
  382. end;
  383. procedure TCnQQMember.OnImageMouseLeave(Sender: TObject);
  384. begin
  385. OnGlassMouseLeave(Self);
  386. TImage(Sender).Picture.Bitmap.LoadFromFile(
  387. TCnQQIcon(TImage(Sender).Parent).NormalIcon);
  388. end;
  389. procedure TCnQQMember.RemoveIcon(Index: Integer);
  390. var
  391. len: Integer;
  392. i: Integer;
  393. begin
  394. len := Length(FQQIcons);
  395. FQQIcons[Index].Free;
  396. for i := Index to len - 2 do
  397. begin
  398. FQQIcons[i] := FQQIcons[i+1];
  399. end;
  400. SetLength(FQQIcons, len - 1);
  401. end;
  402. { TCnQQGroup }
  403. function TCnQQGroup.AddMember(person: TCnQQPerson): Boolean;
  404. var
  405. i: Integer;
  406. userAdded: Boolean;
  407. len: Integer;
  408. j: Integer;
  409. begin
  410. userAdded := False;
  411. for i := 0 to Length(FMembers) - 1 do
  412. begin
  413. if FMembers[i].UserID = person.UserID then
  414. begin
  415. userAdded := True;
  416. Break;
  417. end;
  418. end;
  419. if userAdded then
  420. begin
  421. Result := False;
  422. Exit;
  423. end;
  424. len := Length(FMembers);
  425. SetLength(FMembers, len + 1);
  426. FMembers[len] := TCnQQMember.Create(self);
  427. FMembers[len].Parent := self;
  428. FMembers[len].Caption := EmptyStr;
  429. FMembers[len].Align := alTop;
  430. if len = 0 then
  431. FMembers[len].Top := 0
  432. else
  433. FMembers[len].Top := FMembers[len-1].Top + FMembers[len-1].Height + 1;
  434. FMembers[len].NickName.Caption := person.UserName;
  435. FMembers[len].NickName.Font.Color := person.NameColor;
  436. FMembers[len].Desc.Caption := person.UserDesc;
  437. FMembers[len].UserID := person.UserID;
  438. if FileExists(person.UserHead) then
  439. FMembers[len].HeadImage.Picture.LoadFromFile(person.UserHead);
  440. for j := 0 to Length(person.FUserIcons) - 1 do
  441. FMembers[len].AddIcon(person.FUserIcons[j]);
  442. FMembers[len].Data := person;
  443. Height := 54 * (len + 1);
  444. if Owner.ClassName = 'TCnQQGroupWTitle' then
  445. TCnQQGroupWTitle(Owner).Height := 22 + Height;
  446. Result := True;
  447. end;
  448. constructor TCnQQGroup.Create(AOwner: TComponent);
  449. begin
  450. inherited Create(AOwner);
  451. BevelOuter := bvNone;
  452. Color := clWindow;
  453. SetMemberCount(0);
  454. end;
  455. function TCnQQGroup.GetMemberCount: Integer;
  456. begin
  457. Result := Length(FMembers);
  458. end;
  459. procedure TCnQQGroup.RemoveMember(Index: Integer);
  460. var
  461. i: Integer;
  462. len: Integer;
  463. begin
  464. FMembers[Index].Free;
  465. for i := Index to Length(FMembers) - 2 do
  466. begin
  467. FMembers[i] := FMembers[i+1];
  468. end;
  469. len := Length(FMembers);
  470. SetLength(FMembers, len - 1);
  471. Height := 54 * (len - 1);
  472. if Owner.ClassName = 'TCnQQGroupWTitle' then
  473. TCnQQGroupWTitle(Owner).Height := 22 + Height;
  474. end;
  475. procedure TCnQQGroup.SetMemberCount(const Value: Integer);
  476. var
  477. i: Integer;
  478. begin
  479. for i := Length(FMembers) - 1 downto 0 do
  480. FMembers[i].Free;
  481. SetLength(FMembers, Value);
  482. for i := 0 to Length(FMembers) - 1 do
  483. begin
  484. FMembers[i] := TCnQQMember.Create(self);
  485. FMembers[i].Parent := self;
  486. FMembers[i].Caption := EmptyStr;
  487. FMembers[i].Align := alTop;
  488. if i = 0 then
  489. FMembers[i].Top := 0
  490. else
  491. FMembers[i].Top := FMembers[i-1].Top + FMembers[i-1].Height + 1;
  492. end;
  493. Height := 54 * Value;
  494. if Owner.ClassName = 'TCnQQGroupWTitle' then
  495. TCnQQGroupWTitle(Owner).Height := 22 + Height;
  496. end;
  497. { TCnQQGroupWTitle }
  498. constructor TCnQQGroupWTitle.Create(AOwner: TComponent);
  499. begin
  500. inherited Create(AOwner);
  501. BevelOuter := bvNone;
  502. Color := clWindow;
  503. FTitle := TPanel.Create(self);
  504. FTitle.Parent := self;
  505. FTitle.BevelOuter := bvNone;
  506. FTitle.Height := 22;
  507. FTitle.Align := alTop;
  508. FTitle.Caption := EmptyStr;
  509. FTitle.OnClick := OnTitleClick;
  510. FTitle.Color := clWindow;
  511. {$IFDEF BDS2006_UP}
  512. FTitle.OnMouseEnter := OnTitleMouseEnter;
  513. FTitle.OnMouseLeave := OnTitleMouseLeave;
  514. {$ENDIF}
  515. FTitleImage:= TImage.Create(Self);
  516. FTitleImage.Parent := FTitle;
  517. {$IFDEF BDS2006_UP}
  518. FTitleImage.AlignWithMargins := True;
  519. {$ENDIF}
  520. FTitleImage.Align := alLeft;
  521. FTitleImage.Height := 16;
  522. FTitleImage.Width := 16;
  523. FTitleImage.OnClick := OnTitleClick;
  524. FTitleImage.Transparent := True;
  525. {$IFDEF BDS2006_UP}
  526. FTitleImage.OnMouseEnter := OnTitleMouseEnter;
  527. FTitleImage.OnMouseLeave := OnTitleMouseLeave;
  528. {$ENDIF}
  529. FTitleImage.Picture.Bitmap.LoadFromResourceName(HInstance,'ARROW');
  530. FTitleName := TLabel.Create(self);
  531. FTitleName.Parent := FTitle;
  532. {$IFDEF BDS2006_UP}
  533. FTitleName.AlignWithMargins := True;
  534. {$ENDIF}
  535. FTitleName.Align := alClient;
  536. FTitleName.Caption := EmptyStr;
  537. FTitleName.Layout := tlCenter;
  538. FTitleName.OnClick := OnTitleClick;
  539. FTitleName.Color := clWindow;
  540. {$IFDEF BDS2006_UP}
  541. FTitleName.OnMouseEnter := OnTitleMouseEnter;
  542. FTitleName.OnMouseLeave := OnTitleMouseLeave;
  543. {$ENDIF}
  544. FGroup:= TCnQQGroup.Create(Self);
  545. FGroup.Parent := self;
  546. FGroup.Caption := EmptyStr;
  547. FGroup.Top := 23;
  548. FGroup.Align := alTop;
  549. FGroup.Color := clWindow;
  550. end;
  551. procedure TCnQQGroupWTitle.Expand;
  552. begin
  553. if not FGroup.Visible then
  554. begin
  555. FGroup.Show;
  556. FGroup.Top := 23;
  557. FTitleImage.Picture.Bitmap.LoadFromResourceName(HInstance,'ARROWDOWN');
  558. Height := 22 + FGroup.Height;
  559. // notify
  560. if Owner.ClassName = 'TCnQQPanel' then
  561. TCnQQPanel(Owner).SetPanelHeight;
  562. end;
  563. end;
  564. procedure TCnQQGroupWTitle.OnTitleClick(SendeR: TObject);
  565. begin
  566. if FGroup.Visible then
  567. begin
  568. FGroup.Hide;
  569. FTitleImage.Picture.Bitmap.LoadFromResourceName(HInstance,'ARROW');
  570. Height := 22;
  571. // notify
  572. if Owner.ClassName = 'TCnQQPanel' then
  573. TCnQQPanel(Owner).SetPanelHeight;
  574. end
  575. else
  576. begin
  577. FGroup.Top := 23;
  578. FGroup.Show;
  579. FTitleImage.Picture.Bitmap.LoadFromResourceName(HInstance,'ARROWDOWN');
  580. Height := 22 + FGroup.Height;
  581. // notify
  582. if Owner.ClassName = 'TCnQQPanel' then
  583. TCnQQPanel(Owner).SetPanelHeight;
  584. end;
  585. end;
  586. procedure TCnQQGroupWTitle.OnTitleMouseEnter(Sender: TObject);
  587. begin
  588. FTitle.Color := $00F8ECE4;
  589. end;
  590. procedure TCnQQGroupWTitle.OnTitleMouseLeave(Sender: TObject);
  591. begin
  592. FTitle.Color := clWindow;
  593. end;
  594. procedure TCnQQGroupWTitle.Packup;
  595. begin
  596. if FGroup.Visible then
  597. begin
  598. FGroup.Hide;
  599. FTitleImage.Picture.Bitmap.LoadFromResourceName(HInstance,'ARROW');
  600. Height := 22;
  601. // notify
  602. if Owner.ClassName = 'TCnQQPanel' then
  603. TCnQQPanel(Owner).SetPanelHeight;
  604. end;
  605. end;
  606. { TCnQQPanel }
  607. function TCnQQPanel.AddGroup(AName: string): Boolean;
  608. var
  609. len: Integer;
  610. i: Integer;
  611. hasGroup: Boolean;
  612. begin
  613. hasGroup := False;
  614. len := length(FGroups);
  615. for i := 0 to len - 1 do
  616. begin
  617. if FGroups[i].FTitleName.Caption = AName then
  618. begin
  619. hasGroup := True;
  620. Break;
  621. end;
  622. end;
  623. if hasGroup then
  624. begin
  625. Result := False;
  626. Exit;
  627. end;
  628. SetLength(FGroups, len + 1);
  629. FGroups[len] := TCnQQGroupWTitle.Create(self);
  630. FGroups[len].Parent := self;
  631. FGroups[len].Caption := EmptyStr;
  632. FGroups[len].Align := alTop;
  633. FGroups[len].FTitleName.Caption := AName;
  634. if len = 0 then
  635. FGroups[len].Top := 0
  636. else
  637. FGroups[len].Top := FGroups[len-1].Top + FGroups[len-1].Height + 1;
  638. SetPanelHeight;
  639. Result := True;
  640. end;
  641. constructor TCnQQPanel.Create(AOwner: TComponent);
  642. begin
  643. inherited Create(AOwner);
  644. BevelOuter := bvNone;
  645. Color := clWindow;
  646. end;
  647. procedure TCnQQPanel.ExpandAll;
  648. var
  649. i: Integer;
  650. begin
  651. for i := 0 to length(FGroups) - 1 do
  652. FGroups[i].Expand;
  653. end;
  654. function TCnQQPanel.GetGroupCount: Integer;
  655. begin
  656. Result := Length(FGroups);
  657. end;
  658. procedure TCnQQPanel.PackupAll;
  659. var
  660. i: Integer;
  661. begin
  662. for i := 0 to length(FGroups) - 1 do
  663. FGroups[i].Packup;
  664. end;
  665. procedure TCnQQPanel.RemoveGroup(Index: Integer);
  666. var
  667. len: Integer;
  668. i: Integer;
  669. begin
  670. len := length(FGroups);
  671. FGroups[Index].Free;
  672. for i := Index to len - 2 do
  673. FGroups[i] := FGroups[i+1];
  674. SetLength(FGroups, len - 1 );
  675. SetPanelHeight;
  676. end;
  677. procedure TCnQQPanel.SetGroupCount(const Value: Integer);
  678. var
  679. i: Integer;
  680. begin
  681. SetLength(FGroups, Value);
  682. for i := 0 to Length(FGroups) - 1 do
  683. begin
  684. if not Assigned(FGroups[i]) then
  685. begin
  686. FGroups[i] := TCnQQGroupWTitle.Create(self);
  687. FGroups[i].Parent := self;
  688. FGroups[i].Caption := EmptyStr;
  689. FGroups[i].Align := alTop;
  690. if i = 0 then
  691. FGroups[i].Top := 0
  692. else
  693. FGroups[i].Top := FGroups[i-1].Top + FGroups[i-1].Height + 1;
  694. end;
  695. end;
  696. SetPanelHeight;
  697. end;
  698. procedure TCnQQPanel.SetPanelHeight;
  699. var
  700. i: Integer;
  701. h: Integer;
  702. begin
  703. h := 0;
  704. for i := 0 to Length(FGroups) - 1 do
  705. h := h + FGroups[i].Height;
  706. Height := h;
  707. end;
  708. { TCnQQIcon }
  709. constructor TCnQQIcon.Create(AOwner: TComponent);
  710. begin
  711. inherited;
  712. BevelOuter := bvNone;
  713. ParentColor := True;
  714. {$IFDEF BDS2006_UP}
  715. AlignWithMargins := True;
  716. Margins.Right :=3;
  717. Margins.Top := 2;
  718. Margins.Bottom := 2;
  719. Margins.Left := 2;
  720. {$ENDIF}
  721. Height := 18;
  722. Width := 18;
  723. FImage := TImage.Create(self);
  724. FImage.Parent := self;
  725. FImage.Stretch := True;
  726. FImage.Align := alClient;
  727. FImage.Transparent := True;
  728. FImage.OnClick := OnImgClick;
  729. FImage.OnDblClick := OnImgDblClick;
  730. end;
  731. procedure TCnQQIcon.OnImgClick(Sender: TObject);
  732. begin
  733. if Assigned(OnIconClick) then
  734. OnIconClick(Self, Data);
  735. end;
  736. procedure TCnQQIcon.OnImgDblClick(Sender: TObject);
  737. begin
  738. if Assigned(OnIconDoubleClick) then
  739. OnIconDoubleClick(Self, Data);
  740. end;
  741. procedure TCnQQIcon.SetData(const Value: Pointer);
  742. begin
  743. FData := Value;
  744. FImage.ShowHint := FData <> nil;
  745. if FData <> nil then
  746. begin
  747. FImage.Hint := TCnQQIconData(Value).IconDesc;
  748. end;
  749. end;
  750. procedure TCnQQIcon.SetNormalIcon(const Value: string);
  751. begin
  752. FNormalIcon := Value;
  753. FImage.Picture.Bitmap.LoadFromFile(Value);
  754. end;
  755. { TCnQQPerson }
  756. procedure TCnQQPerson.AddIcon(Ico: TCnQQIcon);
  757. var
  758. len: Integer;
  759. begin
  760. len:=length(FUserIcons);
  761. SetLength(FUserIcons, len + 1);
  762. FUserIcons[len] := ico;
  763. end;
  764. constructor TCnQQPerson.Create;
  765. begin
  766. FNameColor := clBlack;
  767. end;
  768. procedure TCnQQPerson.RemoveIcon(Index: Integer);
  769. var
  770. i: Integer;
  771. len: Integer;
  772. begin
  773. len := length(FUserIcons);
  774. FUserIcons[Index].Free;
  775. for i := index to len - 2 do
  776. FUserIcons[i] := FUserIcons[i+1];
  777. Setlength(FUserIcons, len -1);
  778. end;
  779. end.