unit MessagesManagerFrm;
interface
uses
TransmitDirection,
FileTransmitterObjective, md5, MyInputBoxFrm,
FileTransmitter, DownloadFileFromWeb,ShellAPI,
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, StrUtils, xFonts,
Dialogs, ExtCtrls, ActnCtrls, ActnMan, ActnMenus, ToolWin, ComCtrls, ImgList, MSHTML,
Menus, ActnList, StdStyleActnCtrls, Buttons, StdCtrls, OleCtrls, SHDocVw, RealICQClient,
RealICQUtils, RealICQSkinFrm, ShareUtils, RealICQContacterTreeView, RealICQModel,
RealICQSpeedButton, RealICQButton, FileCtrl;
type
TMessagesManagerForm = class(TRealICQSkinForm)
pnlClient: TPanel;
Splitter1: TSplitter;
CoolBar1: TCoolBar;
Panel2: TPanel;
Label1: TLabel;
Label2: TLabel;
btSearch: TSpeedButton;
btRefresh: TSpeedButton;
btDel: TSpeedButton;
Bevel1: TBevel;
cbSearchRange: TComboBox;
edKeyword: TEdit;
pnlLeft: TPanel;
tvSenders: TTreeView;
pnlRight: TPanel;
Splitter2: TSplitter;
lvContents: TListView;
pnlContent: TPanel;
pnlHeaders: TPanel;
lblDate: TLabel;
lblTime: TLabel;
lblSender: TLabel;
ScrollBox1: TScrollBox;
WebBrowser: TWebBrowser;
pnlPageSet: TPanel;
btNext: TSpeedButton;
btLast: TSpeedButton;
btFirst: TSpeedButton;
btPrev: TSpeedButton;
lblPages: TLabel;
Label3: TLabel;
cbPageSize: TComboBox;
ImgLstNodeImage: TImageList;
ppTreeNode: TPopupMenu;
miDelMessageHistory: TMenuItem;
ppListView: TPopupMenu;
MenuItem1: TMenuItem;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
btSeeInfo: TRealICQButton;
btExportAllMsg: TSpeedButton;
procedure lvContentsColumnClick(Sender: TObject; Column: TListColumn);
procedure lvContentsClick(Sender: TObject);
procedure btSeeInfoClick(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure lvContentsMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure ppListViewPopup(Sender: TObject);
procedure btNextClick(Sender: TObject);
procedure btLastClick(Sender: TObject);
procedure btPrevClick(Sender: TObject);
procedure btFirstClick(Sender: TObject);
procedure btDelClick(Sender: TObject);
procedure btSearchClick(Sender: TObject);
procedure btRefreshClick(Sender: TObject);
procedure lvContentsDblClick(Sender: TObject);
procedure WebBrowserDocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
procedure lvContentsChange(Sender: TObject; Item: TListItem;Change: TItemChange);
procedure tvSendersChange(Sender: TObject; Node: TTreeNode);
procedure lvContentsResize(Sender: TObject);
procedure tvSendersGetSelectedIndex(Sender: TObject; Node: TTreeNode);
procedure tvSendersCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;State: TCustomDrawState; var DefaultDraw: Boolean);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure ppTreeNodePopup(Sender: TObject);
procedure tvSendersMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
procedure miDelMessageHistoryClick(Sender: TObject);
procedure cbPageSizeChange(Sender: TObject);
procedure WebBrowserBeforeNavigate2(ASender: TObject;const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,Headers: OleVariant; var Cancel: WordBool);
procedure btExportAllMsgClick(Sender: TObject);
private
FBaseURL: string;
FRecordCount: Integer;
FPageCount: Integer;
FPageIndex: Integer;
FTeamID: String;
FSender: String;
FReceiver: String;
FFileTransmitter: TFileTransmitter;
FDownFile: TDownFile;
FDBFile: String;
procedure DownFileProgress(ulProgress, ulProgressMax, ulStatusCode: integer; szStatusText: String);
procedure DownFileComplete(Source_file, Dest_file:String; blStatus:boolean; ErrMessage:String);
procedure LoadTreeViewItems;
procedure ClearContents;
procedure SetDOMStyle(Doc:IHTMLDocument2);
procedure ShowMessages(Messages: TList);
procedure LoadMessages;
procedure SetPageSetsState;
procedure ShowSystemMessages(Messages: TList);
procedure LoadSystemMessages;
procedure LoadSMSMessages;
procedure FileTransmitterCalculatedSpeed(Sender: TObject; ATransmittedSize: Int64);
procedure FileTransmitterCompleted(Sender: TObject);
protected
procedure CreateParams(var Params: TCreateParams); override;
public
procedure ChangeUIColor(AColor: TColor); override;
procedure ShowUsersMessages(ALoginName: String);
procedure ShowTeamsMessages(ATeamID: String);
function IsDigit(S: String): Boolean;
end;
var
MessagesManagerForm: TMessagesManagerForm;
implementation
uses
MainFrm, RealICQDBHistory, TalkingFrm, SystemMessageFrm, ProcessingFrm, TeamsAdapter,
UsersService, FriendsService, FileTransmitAdapter;
const
UserStateIndex: Integer = 1;
TeamStateIndex: Integer = 2;
SystemMessageStateIndex: Integer = 3;
SearchResultStateIndex: Integer = 4;
SMSMessageStateIndex: Integer = 5;
{$R *.dfm}
{为消息添加字体信息}
//------------------------------------------------------------------------------
procedure AddFontStyle(var AMessageContent: String; FontStr: String);
var
HexString,
HTML: String;
TextFont: TFont;
begin
HTML := AMessageContent;
TextFont := TFont.Create;
try
StringToFont(FontStr, TextFont);
//设置字体
HexString := IntToHex(TextFont.Color, 6); //获取颜色的16进制格式
HTML := '
' + AMessageContent + '
';
finally
TextFont.Free;
end;
AMessageContent := HTML;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.ChangeUIColor(AColor: TColor);
begin
inherited ChangeUIColor(AColor);
pnlClient.Color := FormColor;
btSeeInfo.ChangeUIColor(AColor);
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.btSearchClick(Sender: TObject);
var
Messages: TList;
MessageSearchResult: TMessageSearchResult;
Node: TTreeNode;
RealICQTeam: TRealICQTeam;
RealICQUser: TRealICQUser;
iLoop: Integer;
AMessageStr,
ReceiverName,
ALoginName: String;
begin if Length(Trim(edKeyword.Text)) = 0 then
begin
MessageBox(Handle, '请输入关键字', '提示', MB_ICONINFORMATION);
Exit;
end;
ClearContents;
Messages := nil;
ProcessingForm := TProcessingForm.Create(Self);
ProcessingForm.Show;
Application.ProcessMessages;
Sleep(400);
try
if cbSearchRange.ItemIndex <= 0 then
begin
Messages := MainForm.DBHistory.SearchMessage('-1', '','', True, Trim(edKeyword.Text));
end
else
begin
Node := tvSenders.Items.GetFirstNode;
while Node <> nil do
begin
if Node.Text = cbSearchRange.Items.Strings[cbSearchRange.ItemIndex] then
begin
if Node.StateIndex = UserStateIndex then
begin
try
RealICQUser := Node.Data;
if Assigned(RealICQUser) then
begin
Messages := MainForm.DBHistory.SearchMessage('-1', RealICQUser.LoginName,
MainForm.RealICQClient.LoginName, False, Trim(edKeyword.Text));
Break;
end;
except
end;
end;
if Node.StateIndex = TeamStateIndex then
begin
try
RealICQTeam := Node.Data;
if Assigned(RealICQTeam) then
begin
Messages := MainForm.DBHistory.SearchMessage(RealICQTeam.TeamID, '', '', False, Trim(edKeyword.Text));
Break;
end;
except
end;
end;
end;
Node := Node.GetNext;
end; //while
end;
if Messages = nil then Exit;
tvSenders.Items.Item[tvSenders.Items.Count - 1].Selected := True;
lvContents.Items.BeginUpdate;
try
for iLoop := 0 to Messages.Count - 1 do
begin
MessageSearchResult := Messages[iLoop];
with lvContents.Items.Add do
begin
try
if StrToInt(MessageSearchResult.TeamID) <= 0 then
StateIndex := UserStateIndex
else
StateIndex := TeamStateIndex;
except
StateIndex := TeamStateIndex;
end;
if StateIndex = UserStateIndex then
begin
if (MessageSearchResult.TeamID <= '-2') and (MessageSearchResult.TeamID <> '-5') then
ImageIndex := 8
else
begin
ImageIndex := 1;
end;
end
else
ImageIndex := 5;
RealICQUser:= TUsersService.GetUsersService.GetOrRequestUser(MessageSearchResult.Sender);
ALoginName := RealICQUser.LoginName;
if Pos('-', ALoginName) > 0 then
ALoginName := Copy(ALoginName, Pos('-', ALoginName) + 1, Length(ALoginName));
if (Length(RealICQUser.DisplayName) = 0) then
Caption := ALoginName
else
Caption := RealICQUser.DisplayName + '<' + ALoginName + '>';
if MessageSearchResult.TeamID <= '-2' then
begin
RealICQUser:= TUsersService.GetUsersService.GetOrRequestUser(MessageSearchResult.Receiver);
ALoginName := RealICQUser.LoginName;
if Pos('-', ALoginName) > 0 then ALoginName := Copy(ALoginName, Pos('-', ALoginName) + 1, Length(ALoginName));
if (Length(RealICQUser.DisplayName) = 0) then
ReceiverName := ALoginName
else
ReceiverName := RealICQUser.DisplayName + '<' + ALoginName + '>';
Caption := Caption + ' -> ' + ReceiverName;
end;
SubItems.Add(DateToStr(MessageSearchResult.SendDateTime));
SubItems.Add(TimeToStr(MessageSearchResult.SendDateTime));
AMessageStr := MessageSearchResult.MessageStr;
GetFaces2(AMessageStr, False);
SubItems.Add(AMessageStr);
Data := MessageSearchResult;
end;
end;
finally
lvContents.Items.EndUpdate;
Messages.Free;
end;
finally
pnlPageSet.Visible := False;
ProcessingForm.Free;
end;
end;
//------------------------------------------------------------------------------
//变量S为要判断的字符串,返回true则正确
function TMessagesManagerForm.IsDigit(S:String):Boolean;
var
i,j:integer;
begin
Result:=True;
j :=0 ;
for i :=1 to length(s) do
begin
if not (s[i] in ['0'..'9','.'])then //判断字符串每个字符即s[i],是否为"0"到'9"数字及".'
Result:=False;
if s[i]='.' Then //统计字符串中"."的个数
j:=j+1;
end;
if j > 1 then //字符串中"."的个数大于1
Result:=False;
if (s[1]='.') or (s[length(s)]='.') then //字符串中"."的在最前面和最后面
Result:=False;
//增加, 字符串中"."的位置之前有两个"0"判断
s:=copy(s,1, pos('.', S)-1); //取字符串中"."的位置之前字符
j:=0;
for i:=1 to length(s) do
begin
if s[i]='0' then
j:=j+1;
end;
if j > 1 then //字符串中"."的位置之前有两个"0"
Result:=False;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.btExportAllMsgClick(Sender: TObject);
var
iLoop, jLoop: Integer;
RootPath, FileName, StrLogin,StrSender, StrReceiver, StrTmp: string;
GroupList, UserList, TmpList: TStringList;
MessageSearchResult: TMessageSearchResult;
Messages: TList;
RealICQUser: TRealICQUser;
RealICQTeam: TRealICQTeam;
begin
RootPath := '';
if SelectDirectory('请设置历史聊天记录文件的导出路径', '', RootPath) then
begin
if RootPath = '' then Exit;
RootPath := RootPath + '\历史记录\';
if not DirectoryExists(RootPath) then CreateDir(RootPath);
ProcessingForm := TProcessingForm.Create(Self);
ProcessingForm.Show;
Application.ProcessMessages;
Sleep(500);
Messages := MainForm.DBHistory.SearchMessage('-1', '','', True, '');
if Messages = nil then Exit;
TmpList := TStringList.Create;
//群组消息
GroupList := TTeamsAdapter.GetTeams();
if GroupList <> nil then
for iLoop := 0 to GroupList.Count - 1 do
begin
RealICQTeam := GroupList.Objects[iLoop] as TRealICQTeam;
if Length(RealICQTeam.TeamCaption) = 0 then
FileName := RootPath + '群组:' + RealICQTeam.TeamID + '.txt'
else
FileName := RootPath + '群组:' + RealICQTeam.TeamCaption + '.txt';
TmpList.Clear;
for jLoop := 0 to Messages.Count - 1 do
begin
MessageSearchResult := Messages[jLoop];
if MessageSearchResult.TeamID = RealICQTeam.TeamID then
begin
RealICQUser := TUsersService.GetUsersService.GetOrRequestUser(MessageSearchResult.Sender);
StrSender := RealICQUser.LoginName;
if Pos('-', StrSender) > 0 then
StrSender := Copy(StrSender, Pos('-', StrSender) + 1, Length(StrSender));
if (Length(RealICQUser.DisplayName) <> 0) then
StrSender := RealICQUser.DisplayName + '(' + StrSender + ')';
StrTmp := DateToStr(MessageSearchResult.SendDateTime) + ' ';
StrTmp := StrTmp + TimeToStr(MessageSearchResult.SendDateTime) + ' ';
StrTmp := StrTmp + StrSender + #13#10;
StrTmp := StrTmp + #13#10 + MessageSearchResult.MessageStr + #13#10;
TmpList.Add(StrTmp);
end;
end;
if TmpList.Count > 0 then TmpList.SaveToFile(FileName);
end;
//手机短信
StrTmp := '';
TmpList.Clear;
FileName := RootPath + '手机短信.txt';
for iLoop := 0 to Messages.Count - 1 do
begin
MessageSearchResult := Messages[iLoop];
if (MessageSearchResult.TeamID = '-2') or (MessageSearchResult.TeamID = '-3') then
begin
if IsDigit(MessageSearchResult.Sender) then
StrSender := MessageSearchResult.Sender
else
begin
RealICQUser := TUsersService.GetUsersService.GetOrRequestUser(MessageSearchResult.Sender);
StrSender := RealICQUser.LoginName;
if Pos('-', StrSender) > 0 then
StrSender := Copy(StrSender, Pos('-', StrSender) + 1, Length(StrSender));
if (Length(RealICQUser.DisplayName) <> 0) then
StrSender := RealICQUser.DisplayName + '(' + StrSender + ')';
end;
if IsDigit(MessageSearchResult.Receiver) then
StrReceiver := MessageSearchResult.Receiver
else
begin
RealICQUser := TUsersService.GetUsersService.GetOrRequestUser(MessageSearchResult.Receiver);
StrReceiver := RealICQUser.LoginName;
if Pos('-', StrReceiver) > 0 then
StrReceiver := Copy(StrReceiver, Pos('-', StrReceiver) + 1, Length(StrReceiver));
if (Length(RealICQUser.DisplayName) <> 0) then
StrReceiver := RealICQUser.DisplayName + '(' + StrReceiver + ')';
end;
StrTmp := StrTmp + DateToStr(MessageSearchResult.SendDateTime) + ' ';
StrTmp := StrTmp + TimeToStr(MessageSearchResult.SendDateTime) + ' ';
StrTmp := StrTmp + StrSender + ' -> ' + StrReceiver + #13#10;
StrTmp := StrTmp + #13#10 + MessageSearchResult.MessageStr + #13#10;
TmpList.Add(StrTmp);
end;
end;
if TmpList.Count > 0 then TmpList.SaveToFile(FileName);
//联系人
UserList := MainForm.DBHistory.GetContactors;
if UserList <> nil then
for iLoop := 0 to UserList.Count - 1 do
begin
StrLogin := UserList[iLoop];
if (AnsiPos('+', StrLogin) <= 0) and (trim(MainForm.RealICQClient.CenterServerID) <> '') then
StrLogin := MainForm.RealICQClient.CenterServerID + '+' + StrLogin;
if AnsiSameText(StrLogin, MainForm.RealICQClient.LoginName) then continue;
RealICQUser:= TUsersService.GetUsersService.GetOrRequestUser(StrLogin);
StrLogin := RealICQUser.LoginName;
if Pos('-', StrLogin) > 0 then
StrLogin := Copy(StrLogin, Pos('-', StrLogin) + 1, Length(StrLogin));
if (Length(RealICQUser.DisplayName) <> 0) then
StrLogin := RealICQUser.DisplayName + '(' + StrLogin + ')';
FileName := RootPath + '联系人:' + StrLogin + '.txt';
TmpList.Clear;
for jLoop := 0 to Messages.Count - 1 do
begin
MessageSearchResult := Messages[jLoop];
if MessageSearchResult.TeamID <> '-1' then continue;
if (MessageSearchResult.Sender = UserList[iLoop]) or (MessageSearchResult.Receiver = UserList[iLoop]) then
begin
if MessageSearchResult.Sender = UserList[iLoop] then
begin
StrSender := StrLogin;
RealICQUser := TUsersService.GetUsersService.GetOrRequestUser(MessageSearchResult.Receiver);
StrReceiver := RealICQUser.LoginName;
if Pos('-', StrReceiver) > 0 then
StrReceiver := Copy(StrReceiver, Pos('-', StrReceiver) + 1, Length(StrReceiver));
if (Length(RealICQUser.DisplayName) <> 0) then
StrReceiver := RealICQUser.DisplayName + '(' + StrReceiver + ')';
end
else
begin
StrReceiver := StrLogin;
RealICQUser := TUsersService.GetUsersService.GetOrRequestUser(MessageSearchResult.Sender);
StrSender := RealICQUser.LoginName;
if Pos('-', StrSender) > 0 then
StrSender := Copy(StrSender, Pos('-', StrSender) + 1, Length(StrSender));
if (Length(RealICQUser.DisplayName) <> 0) then
StrSender := RealICQUser.DisplayName + '(' + StrSender + ')';
end;
StrTmp := DateToStr(MessageSearchResult.SendDateTime) + ' ';
StrTmp := StrTmp + TimeToStr(MessageSearchResult.SendDateTime) + ' ';
StrTmp := StrTmp + StrSender + #13#10;
StrTmp := StrTmp + #13#10 + MessageSearchResult.MessageStr + #13#10;
TmpList.Add(StrTmp);
end;
end;
if TmpList.Count > 0 then TmpList.SaveToFile(FileName);
end;
Messages.Free;
ProcessingForm.Free;
MessageBox(Handle, '所有历史记录导出完成! ', '提示', MB_OK or MB_ICONINFORMATION);
ShellExecute(handle, 'open', PChar('"' + RootPath + '"'), nil, nil, SW_SHOWNORMAL);
end;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.btSeeInfoClick(Sender: TObject);
var LoginName,Url:String;
begin
Url:=btSeeInfo.Hint;
LoginName := MainForm.RealICQClient.LoginName;
if AnsiPos('-',LoginName)>0 then
begin
LoginName:=Copy(LoginName,AnsiPos('-',LoginName)+1,Length(LoginName)-AnsiPos('-',LoginName));
end;
Url := AnsiReplaceText(Url, '[%LoginName%]',LoginName );
Url := AnsiReplaceText(Url, '[%Password%]', MainForm.RealICQClient.Password);
Url := AnsiReplaceText(Url, '[%MD5_LoginName%]', MD5En(LoginName));
Url := AnsiReplaceText(Url, '[%MD5_Password%]', MD5En(MainForm.RealICQClient.Password));
Url := AnsiReplaceText(Url, '[%BranchID%]', MainForm.RealICQClient.Me.BranchID);
if AnsiSameText(Copy(Url, 1, 5), 'http:') or AnsiSameText(Copy(Url, 1, 6), 'https:') then
begin
ShellExecute(handle, 'open',PChar(MainForm.GetDefaultBrowser), PChar('"' + String(Url) + '"'),'', SW_SHOWNORMAL)
end
else
ShellExecute(handle, 'open', PChar(MainForm.GetDefaultBrowser),PChar(Format(MainForm.RealICQClient.WebAppBaseURL + LoginURL, [StrToBase64(MainForm.RealICQClient.LoginName), StrToBase64(MD5En(MainForm.RealICQClient.Password)), StrToBase64(ReadMessageURL +Url)])),'',SW_SHOWDEFAULT);
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.cbPageSizeChange(Sender: TObject);
begin
if tvSenders.Selected.StateIndex = SystemMessageStateIndex then
LoadSystemMessages
else if tvSenders.Selected.StateIndex = SMSMessageStateIndex then
LoadSMSMessages
else
LoadMessages;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.ShowUsersMessages(ALoginName: String);
var
Node,
NodeUser,
NodeGroup: TTreeNode;
RealICQUser: TRealICQUser;
ACaption: String;
begin
Node := tvSenders.Items.GetFirstNode;
while Node <> nil do
begin
if AnsiSameStr(ALoginName, '') then
begin
if Node.StateIndex = SMSMessageStateIndex then
begin
Node.Selected := True;
Exit;
end;
end
else
begin
if Node.StateIndex = UserStateIndex then
begin
try
RealICQUser := Node.Data;
if Assigned(RealICQUser) then
begin
if RealICQUser.LoginName = ALoginName then
begin
Node.Selected := True;
Exit;
end;
end;
except
end;
end;
end;
Node := Node.GetNext;
end;
RealICQUser:= TUsersService.GetUsersService.GetOrRequestUser(ALoginName);
if RealICQUser = nil then Exit;
ALoginName := RealICQUser.LoginName;
if Pos('-', ALoginName) > 0 then ALoginName := Copy(ALoginName, Pos('-', ALoginName) + 1, Length(ALoginName));
if (Length(RealICQUser.DisplayName) = 0) then
ACaption := ALoginName
else
ACaption := RealICQUser.DisplayName + '<' + ALoginName + '>';
NodeGroup := tvSenders.Items.GetFirstNode.getNextSibling.getNextSibling;
//NodeGroup := tvSenders.Items.GetFirstNode;
NodeUser := tvSenders.Items.AddChild(NodeGroup, ACaption);
NodeUser.Data := RealICQUser;
NodeUser.StateIndex := UserStateIndex;
NodeUser.ImageIndex := 1;
NodeUser.Selected := True;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.ShowTeamsMessages(ATeamID: String);
var
Node: TTreeNode;
RealICQTeam: TRealICQTeam;
begin
Node := tvSenders.Items.GetFirstNode;
while Node <> nil do
begin
if Node.StateIndex = TeamStateIndex then
begin
try
RealICQTeam := Node.Data;
if Assigned(RealICQTeam) then
begin
if RealICQTeam.TeamID = ATeamID then
begin
Node.Selected := True;
Exit;
end;
end;
except
end;
end;
Node := Node.GetNext;
end;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.LoadTreeViewItems;
var
iLoop, jLoop, iIndex: Integer;
LoginName, ALoginName, ACaption, GroupName: String;
ATeams, AUsers, GroupMembers, AlreadyAddedUsers, OtherContactors: TStringList;
BranchNodes: TList;
RealICQUser: TRealICQUser;
RealICQTeam: TRealICQTeam;
NodeGroup, NodeUser: TTreeNode;
Branch, TmpBranch: TRealICQBranch;
BranchInfo: TRealICQBranchInfo;
Employee: TRealICQEmployee;
ATreeView: TRealICQContacterTreeView;
procedure AddGroupUsers(AGroupName: String; GroupList: TStringList);
var
kLoop: Integer;
begin
try
NodeGroup := tvSenders.Items.AddChild(nil, AGroupName);
NodeGroup.StateIndex := 0;
NodeGroup.ImageIndex := 4;
if (GroupList = nil) then
Exit;
for kLoop := 0 to GroupList.Count - 1 do
begin
LoginName := GroupList[kLoop];
if AGroupName='其他联系人' then
begin
if (AnsiPos('+',LoginName)<=0) and (trim(MainForm.RealICQClient.CenterServerID)<>'') then
LoginName := MainForm.RealICQClient.CenterServerID + '+' + LoginName;
end;
if AnsiSameText(LoginName, MainForm.RealICQClient.LoginName) then continue;
if AlreadyAddedUsers.IndexOf(LoginName) >= 0 then continue;
//RealICQUser := GroupList.Objects[kLoop] as TRealICQUser;
RealICQUser:= TUsersService.GetUsersService.GetOrRequestUser(LoginName);
ALoginName := RealICQUser.LoginName;
if Pos('-', ALoginName) > 0 then ALoginName := Copy(ALoginName, Pos('-', ALoginName) + 1, Length(ALoginName));
if (Length(RealICQUser.DisplayName) = 0) then
ACaption := ALoginName
else
ACaption := RealICQUser.DisplayName + '<' + ALoginName + '>';
NodeUser := tvSenders.Items.AddChild(NodeGroup, ACaption);
NodeUser.Data := RealICQUser;
NodeUser.StateIndex := UserStateIndex;
NodeUser.ImageIndex := 1;
AlreadyAddedUsers.Add(LoginName);
cbSearchRange.Items.Add(ACaption);
end;
finally
FreeAndNil(GroupList);
end;
end;
begin
AlreadyAddedUsers := TStringList.Create;
tvSenders.Items.Clear;
cbSearchRange.Items.Clear;
cbSearchRange.Items.Add('全部记录');
if MainForm.ShowGroup and (MainForm.RealICQClient.WorkingMode = wmPublic) then
begin
for iLoop := MainForm.Groups.Count - 1 downto 0 do
begin
GroupName := MainForm.Groups[iLoop];
NodeGroup := tvSenders.Items.AddChildFirst(nil, GroupName);
NodeGroup.StateIndex := 0;
NodeGroup.ImageIndex := 4;
GroupMembers := MainForm.Groups.Objects[iLoop] as TStringList;
for jLoop := 0 to GroupMembers.Count - 1 do
begin
LoginName := GroupMembers[jLoop];
RealICQUser:= TUsersService.GetUsersService.GetUser(LoginName);
if RealICQUser <> nil then
begin
ALoginName := RealICQUser.LoginName;
if Pos('-', ALoginName) > 0 then
ALoginName := Copy(ALoginName, Pos('-', ALoginName) + 1, Length(ALoginName));
if (Length(RealICQUser.DisplayName) = 0) then
ACaption := ALoginName
else
ACaption := RealICQUser.DisplayName + '<' + ALoginName + '>';
NodeUser := tvSenders.Items.AddChild(NodeGroup, ACaption);
NodeUser.Data := RealICQUser;
NodeUser.StateIndex := UserStateIndex;
NodeUser.ImageIndex := 1;
AlreadyAddedUsers.Add(LoginName);
cbSearchRange.Items.Add(ACaption);
end;
end;
end;
end;
//if MainForm.RealICQClient.WorkingMode = wmPublic then
//begin
//好友/联系人列表
//GroupName := LVFriends;
//AddGroupUsers(GroupName, MainForm.RealICQClient.Friends);
//NodeGroup.MoveTo(NodeGroup.Parent, naAddChildFirst);
//陌生人列表
//AddGroupUsers(LVStrangers, MainForm.RealICQClient.Strangers);
//黑名单列表
//AddGroupUsers(LVBlacklists, MainForm.RealICQClient.Blacklists);
//end
//else
//begin
try
BranchNodes := TList.Create;
{$region '添加部门'}
for iLoop := 0 to MainForm.RealICQClient.Branchs.Count - 1 do
begin
BranchInfo := MainForm.RealICQClient.Branchs.Objects[iLoop] as TRealICQBranchInfo;
Branch := TRealICQBranch.Create(BranchInfo.BranchName);
Branch.BranchID := BranchInfo.ID;
Branch.ParentID := BranchInfo.ParentID;
Branch.Node := tvSenders.Items.AddChildObject(nil, Branch.BranchName, Branch);
Branch.Node.StateIndex := 0;
Branch.Node.ImageIndex := 4;
for jLoop := 0 to BranchNodes.Count - 1 do
begin
NodeGroup := BranchNodes[jLoop];
TmpBranch := TRealICQBranch(NodeGroup.Data);
if AnsiSameText(Branch.ParentID, TmpBranch.BranchID) then
begin
Branch.Node.MoveTo(TmpBranch.Node, naAddChild);
TmpBranch.Node.Expanded := False;
Break;
end;
end;
BranchNodes.Add(Branch.Node);
end;
for iLoop := 0 to tvSenders.Items.Count - 1 do
begin
Branch := TRealICQBranch(tvSenders.Items.Item[iLoop].Data);
for jLoop := 0 to tvSenders.Items.Count - 1 do {添加至父部门}
begin
if iLoop = jLoop then continue;
TmpBranch := TRealICQBranch(tvSenders.Items.Item[jLoop].Data);
if AnsiSameText(Branch.ParentID, TmpBranch.BranchID) then
begin
if Branch.Node.Parent = TmpBranch.Node then continue;
Branch.Node.MoveTo(TmpBranch.Node, naAddChild);
TmpBranch.Node.Expanded := False;
Break;
end;
end;
end;
{$endregion}
{$region '添加用户'}
AUsers := TUsersService.GetUsersService.GetWorkmatesAndFriends;
for iLoop := AUsers.Count - 1 downto 0 do
begin
RealICQUser := AUsers.Objects[iLoop] as TRealICQUser;
ALoginName := RealICQUser.LoginName;
if Pos('-', ALoginName) > 0 then ALoginName := Copy(ALoginName, Pos('-', ALoginName) + 1, Length(ALoginName));
if (Length(RealICQUser.DisplayName) = 0) then
ACaption := ALoginName
else
ACaption := RealICQUser.DisplayName + '<' + ALoginName + '>';
cbSearchRange.Items.Add(ACaption);
Employee := TRealICQEmployee.Create(RealICQUser.LoginName);
Employee.BranchID := RealICQUser.BranchID;
for jLoop := 0 to BranchNodes.Count - 1 do
begin
NodeGroup := BranchNodes[jLoop];
if NodeGroup.StateIndex <> 0 then continue;
TmpBranch := TRealICQBranch(NodeGroup.Data);
if AnsiSameText(Employee.BranchID, TmpBranch.BranchID) then
begin
Employee.Node := tvSenders.Items.AddChildObjectFirst(TmpBranch.Node, ACaption, Employee);
Employee.Node.StateIndex := UserStateIndex;
Employee.Node.ImageIndex := 1;
Employee.Node.Data:=RealICQUser;
TmpBranch.Node.Expanded := False;
AlreadyAddedUsers.Add(Employee.LoginName);
Break;
end;
end;
end;
{$endregion}
finally
FreeAndNil(BranchNodes);
if AUsers <> nil then
FreeAndNil(AUsers);
end;
//end;
GroupName := LVFriends;
AddGroupUsers(GroupName, TFriendsService.GetService.GetFriends);
NodeGroup.MoveTo(NodeGroup.Parent, naAddChildFirst);
GroupName := '其他联系人';
OtherContactors := MainForm.DBHistory.GetContactors;
AddGroupUsers(GroupName, OtherContactors);
//添加群组列表
NodeGroup := tvSenders.Items.AddChild(nil, LVTeams);
NodeGroup.StateIndex := 0;
NodeGroup.ImageIndex := 4;
ATeams := TTeamsAdapter.GetTeams();
if ATeams <> nil then
for iLoop := 0 to ATeams.Count - 1 do
begin
RealICQTeam := ATeams.Objects[iLoop] as TRealICQTeam;
if Length(RealICQTeam.TeamCaption) = 0 then
ACaption := RealICQTeam.TeamID
else
ACaption := RealICQTeam.TeamCaption + '<群号码:' + RealICQTeam.TeamID + '>';
NodeUser := tvSenders.Items.AddChild(NodeGroup, ACaption);
NodeUser.Data := RealICQTeam;
NodeUser.StateIndex := TeamStateIndex;
NodeUser.ImageIndex := 5;
cbSearchRange.Items.Add(ACaption);
end;
//添加手机短消息结节
NodeGroup := tvSenders.Items.AddChild(nil, '手机短信');
NodeGroup.StateIndex := SMSMessageStateIndex;
NodeGroup.ImageIndex := 8;
//添加系统消息结节
NodeGroup := tvSenders.Items.AddChild(nil, LVSystemMessage);
NodeGroup.StateIndex := SystemMessageStateIndex;
NodeGroup.ImageIndex := 6;
//添加查找结果结节
NodeGroup := tvSenders.Items.AddChild(nil, '查找结果');
NodeGroup.StateIndex := SearchResultStateIndex;
NodeGroup.ImageIndex := 7;
AlreadyAddedUsers.Free;
cbSearchRange.ItemIndex := 0;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.SpeedButton1Click(Sender: TObject);
var
DBFile: String;
begin
if Length(Trim(MainForm.RealICQClient.DBHistoryFileName)) > 0 then
begin
if MessageBox(Handle, PChar(Format('确定要替换服务器上%s的消息记录吗?', [DateTimeToStr(MainForm.RealICQClient.DBHistoryFileUploadDateTime)])), '提示', MB_OKCANCEL or MB_ICONQUESTION) <> ID_OK then Exit;
end;
DBFile := MainForm.DBHistory.DBFileName;
try
try
MainForm.DBHistory.CloseDBConntion;
FFileTransmitter := TFileTransmitter.Create(MainForm.RealICQClient.TCPClient, tdSender, DBFile, 2, MainForm.RealICQClient.LoginName, 0, 0);
FFileTransmitter.OnTransmitting := FileTransmitterCalculatedSpeed;
FFileTransmitter.OnTransmitOK := FileTransmitterCompleted;
FFileTransmitter.SendFileRequest;
SpeedButton1.Enabled := False;
except
On E: Exception do MessageBox(Handle, PChar('备份消息记录时出错:' + E.Message), '提示', MB_OK);
end;
finally
// MainForm.DBHistory.DBFileName := DBFile;
end;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.SpeedButton2Click(Sender: TObject);
begin
if Length(Trim(MainForm.RealICQClient.DBHistoryFileName)) = 0 then
begin
MessageBox(Handle, '没有备份记录!', '提示', MB_OK);
Exit;
end;
if MessageBox(Handle, PChar(Format('确定要将 %s 的消息记录恢复至本地吗?', [DateTimeToStr(MainForm.RealICQClient.DBHistoryFileUploadDateTime)])), '提示', MB_OKCANCEL or MB_ICONQUESTION) <> ID_OK then Exit;
FDownFile := TDownFile.Create;
FDownFile.OnComplete := DownFileComplete;
FDownFile.OnProgress := DownFileProgress;
FDBFile := MainForm.DBHistory.DBFileName + '.TEMP';
FDownFile.ThreadDownFile(MainForm.RealICQClient.DBHistoryFileName, FDBFile);
SpeedButton2.Enabled := False;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.FileTransmitterCalculatedSpeed(Sender: TObject; ATransmittedSize: Int64);
var
Completed: Integer;
begin
Completed := ATransmittedSize*100 div FFileTransmitter.StreamLength;
SpeedButton1.Caption := IntToStr(Completed)+'%';
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.FileTransmitterCompleted(Sender: TObject);
begin
SpeedButton1.Enabled := True;
SpeedButton1.Caption := '备份';
MessageBox(Handle, PChar('消息记录已成功备份至服务器'), '提示', MB_OK or MB_ICONINFORMATION);
MainForm.DBHistory.OpenDBConntion;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.DownFileProgress(ulProgress, ulProgressMax, ulStatusCode: integer; szStatusText: String);
var
Completed: Integer;
begin
if ulProgressMax = 0 then Exit;
Completed := ulProgress*100 div ulProgressMax;
SpeedButton2.Caption := IntToStr(Completed)+'%';
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.DownFileComplete(Source_file, Dest_file:String; blStatus:boolean; ErrMessage:String);
begin
SpeedButton2.Caption := '恢复';
SpeedButton2.Enabled := True;
if blStatus then
begin
try
ProcessingForm := TProcessingForm.Create(Self);
ProcessingForm.pnlClient.Caption := '正在恢复记录,请稍候...';
ProcessingForm.Show;
Application.ProcessMessages;
Sleep(400);
try
MainForm.DBHistory.RestoreMessageHistory(FDBFile);
finally
ProcessingForm.Free;
end;
MessageBox(Handle, '恢复消息记录成功!', '提示', MB_ICONINFORMATION);
except
MessageBox(Handle, PChar('恢复消息记录失败: ' + ErrMessage), '错误', MB_ICONERROR);
end;
end
else
begin
MessageBox(Handle, PChar('恢复消息记录失败: ' + ErrMessage), '错误', MB_ICONERROR);
end;
btRefresh.Click;
//tvSendersChange(tvSenders, tvSenders.Selected);
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.lvContentsResize(Sender: TObject);
begin
lvContents.Columns.Items[3].Width := lvContents.Width - 308;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.miDelMessageHistoryClick(Sender: TObject);
var
Node: TTreeNode;
RealICQUser: TRealICQUser;
RealICQTeam: TRealICQTeam;
begin
Node := tvSenders.Selected;
if Node = nil then Exit;
if MessageBox(Handle, '确定要删除这些消息记录吗?', '确认删除', MB_ICONQUESTION or MB_OKCANCEL) <> ID_OK then
begin
Exit;
end;
if Node.StateIndex = UserStateIndex then
begin
RealICQUser := Node.Data;
MainForm.DBHistory.DelMessageByLoginName(RealICQUser.LoginName);
end
else if Node.StateIndex = TeamStateIndex then
begin
RealICQTeam := Node.Data;
MainForm.DBHistory.DelMessageByTeamID(RealICQTeam.TeamID);
end
else if Node.StateIndex = SystemMessageStateIndex then
begin
MainForm.DBHistory.DelAllSystemMessage;
end;
if Node.Parent = tvSenders.Items.GetFirstNode.getNextSibling.getNextSibling then
begin
FreeAndNil(Node);
end;
tvSendersChange(tvSenders, Node);
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.ppListViewPopup(Sender: TObject);
begin
MenuItem1.Enabled := btDel.Enabled;
end;
procedure TMessagesManagerForm.ppTreeNodePopup(Sender: TObject);
begin
miDelMessageHistory.Visible := tvSenders.Selected <> nil;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.lvContentsChange(Sender: TObject;
Item: TListItem; Change: TItemChange);
var
MessageSearchResult: TMessageSearchResult;
SystemMessageSearchResult: TSystemMessageSearchResult;
AMessageStr,Content: String;
Password,AReceiver:String;
TempMessage:TMessageSearchResult;
hwnd:THandle;
UserName:String;
begin
if lvContents.SelCount > 0 then
begin
if not btDel.Enabled then
begin
btDel.Enabled := True;
end;
end
else
begin
if btDel.Enabled then
begin
btDel.Enabled := False;
end;
end;
if Item = nil then Exit;
AMessageStr := '';
lblDate.Caption := '日期: ' + Item.SubItems[0];
lblTime.Caption := '时间: ' + Item.SubItems[1];
lblSender.Caption := '发信人: ' + Item.Caption;
btSeeInfo.Visible:=False;
ClearHTML(WebBrowser);
if (Item.StateIndex = UserStateIndex) or (Item.StateIndex = TeamStateIndex) or (Item.StateIndex = SMSMessageStateIndex) then
begin
MessageSearchResult := Item.Data;
if MessageSearchResult.IsEncryMessage then
begin
hWnd:=FindWindow(nil,pchar(trim('输入密码')));
if hWnd>0 then Exit;
Password:=(ShowMyInputBox('输入密码','密码','', 50));
if Password<>MainForm.RealICQClient.Password then
begin
if Password<>'' then
Dialogs.ShowMessage('密码错误');
Exit;
end;
TempMessage:=MainForm.DBHistory.GetMessageByMessageID(IntToStr(MessageSearchResult.ID));
if (MainForm.RealICQClient.CenterServerID<>'') and (AnsiPos('+',TempMessage.Sender)<=0) then
AReceiver:=MainForm.RealICQClient.CenterServerID+'+' + TempMessage.Sender;
if (not TempMessage.IsRead) and (MainForm.RealICQClient.LoginName<>AReceiver) then //发送已经查看私密消息确认信息给发送者
begin
UserName:=MainForm.RealICQClient.Me.DisplayName;
if Trim(UserName)='' then UserName:=MainForm.RealICQClient.Me.LoginName;
Content:='LXC01'+#13+#10+'LXUMC'+#13+#10+'0'+ #13+#10+'您于['+DateTimeToStr(TempMessage.SendDateTime)
+']发送给'+UserName+'的签收消息对方已经阅读!';
MainForm.RealICQClient.SendCustomMessage(MainForm.RealICQClient.LoginName,AReceiver,Content);
end;
end;
AMessageStr := FilterHTMLCode(MessageSearchResult.MessageStr, MainForm.AllowURL);
if MessageSearchResult.TeamID <> '-5' then
GetFaces2(AMessageStr, True);
AddFontStyle(AMessageStr, MessageSearchResult.Font);
end;
if (Item.StateIndex = SystemMessageStateIndex) then
begin
SystemMessageSearchResult := Item.Data;
if SystemMessageSearchResult.MessageType = mtBroadcast then
AMessageStr := SystemMessageSearchResult.Content
else
AMessageStr := SystemMessageSearchResult.Title;
if trim(SystemMessageSearchResult.Url)<>'' then
begin
btSeeInfo.Hint:=SystemMessageSearchResult.Url;
btSeeInfo.Visible:=True;
end;
end;
InsertHTML(WebBrowser, AMessageStr);
end;
procedure TMessagesManagerForm.lvContentsClick(Sender: TObject);
begin
if lvContents.Selected<>nil then
self.lvContentsChange(Sender,lvContents.Selected,ctText);
end;
procedure TMessagesManagerForm.lvContentsColumnClick(Sender: TObject;
Column: TListColumn);
begin
//
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.lvContentsDblClick(Sender: TObject);
var
Item: TListItem;
SystemMessageSearchResult: TSystemMessageSearchResult;
begin
Item := lvContents.Selected;
if Item = nil then Exit;
if (Item.StateIndex = SystemMessageStateIndex) then
begin
SystemMessageSearchResult := Item.Data;
OpenSystemMessageForm(IntToStr(SystemMessageSearchResult.MessageID),
SystemMessageSearchResult.MessageType,
SystemMessageSearchResult.PositionType,
SystemMessageSearchResult.Left,
SystemMessageSearchResult.Top,
SystemMessageSearchResult.Width,
SystemMessageSearchResult.Height,
SystemMessageSearchResult.Title,
SystemMessageSearchResult.Content,
SystemMessageSearchResult.URL,
SystemMessageSearchResult.AutoCloseTime);
end;
end;
procedure TMessagesManagerForm.lvContentsMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.btDelClick(Sender: TObject);
var
iLoop: Integer;
ListItem: TListItem;
MessageSearchResult: TMessageSearchResult;
SystemMessageSearchResult: TSystemMessageSearchResult;
begin
{if tvSenders.Focused then
begin
miDelMessageHistory.Click;
Exit;
end;}
if MessageBox(Handle, '确定要删除选中的消息记录吗?', '确认删除', MB_ICONQUESTION or MB_OKCANCEL) <> ID_OK then
begin
Exit;
end;
for iLoop := lvContents.Items.Count - 1 downto 0 do
begin
ListItem := lvContents.Items.Item[iLoop];
if ListItem.Selected then
begin
if ListItem.StateIndex = SystemMessageStateIndex then
begin
SystemMessageSearchResult := ListItem.Data;
MainForm.DBHistory.DelSystemMessage(SystemMessageSearchResult.ID);
FreeAndNil(SystemMessageSearchResult);
end
else
begin
MessageSearchResult := ListItem.Data;
MainForm.DBHistory.DelMessage(MessageSearchResult.ID);
FreeAndNil(MessageSearchResult);
end;
lvContents.Items.Delete(iLoop);
//ClearContents;
end;
end;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.btLastClick(Sender: TObject);
begin
FPageIndex := 1000000;
if tvSenders.Selected.StateIndex = SystemMessageStateIndex then
LoadSystemMessages
else if tvSenders.Selected.StateIndex = SMSMessageStateIndex then
LoadSMSMessages
else
LoadMessages;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.btNextClick(Sender: TObject);
begin
Inc(FPageIndex);
if tvSenders.Selected.StateIndex = SystemMessageStateIndex then
LoadSystemMessages
else if tvSenders.Selected.StateIndex = SMSMessageStateIndex then
LoadSMSMessages
else
LoadMessages;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.btFirstClick(Sender: TObject);
begin
FPageIndex := 1;
if tvSenders.Selected.StateIndex = SystemMessageStateIndex then
LoadSystemMessages
else if tvSenders.Selected.StateIndex = SMSMessageStateIndex then
LoadSMSMessages
else
LoadMessages;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.btPrevClick(Sender: TObject);
begin
Dec(FPageIndex);
if tvSenders.Selected.StateIndex = SystemMessageStateIndex then
LoadSystemMessages
else if tvSenders.Selected.StateIndex = SMSMessageStateIndex then
LoadSMSMessages
else
LoadMessages;
end;
procedure TMessagesManagerForm.btRefreshClick(Sender: TObject);
begin
Self.ClearContents;
ClearHTML(WebBrowser);
LoadTreeViewItems;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.ClearContents;
var
iLoop: Integer;
DataObj: TObject;
begin
for iLoop := 0 to lvContents.Items.Count - 1 do
begin
DataObj := lvContents.Items.Item[iLoop].Data;
FreeAndNil(DataObj);
end;
lvContents.Items.Clear;
lblDate.Caption := '日期:';
lblTime.Caption := '时间:';
lblSender.Caption := '发信人:';
ClearHTML(WebBrowser);
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.ShowSystemMessages(Messages: TList);
var
iLoop: Integer;
SystemMessageSearchResult: TSystemMessageSearchResult;
AMessageStr: String;
begin
SetPageSetsState;
lvContents.Items.BeginUpdate;
try
ClearContents;
for iLoop := 0 to Messages.Count - 1 do
begin
SystemMessageSearchResult := Messages[iLoop];
with lvContents.Items.Add do
begin
StateIndex := tvSenders.Selected.StateIndex;
ImageIndex := 6;
Caption := '系统管理员';
SubItems.Add(DateToStr(SystemMessageSearchResult.SendDateTime));
SubItems.Add(TimeToStr(SystemMessageSearchResult.SendDateTime));
if SystemMessageSearchResult.MessageType = mtBroadcast then
AMessageStr := '系统广播:'
else
AMessageStr := '系统广告:';
AMessageStr := AMessageStr + SystemMessageSearchResult.Title;
SubItems.Add(AMessageStr);
Data := SystemMessageSearchResult;
end;
end;
finally
lvContents.Items.EndUpdate;
SendMessage(lvContents.Handle, WM_VSCROLL, SB_BOTTOM, 0); //发送到底消息
Messages.Free;
end;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.SetPageSetsState;
begin
lblPages.Caption := Format('%d 条记录,第 %d 页、共 %d 页', [FRecordCount, FPageIndex, FPageCount]);
if FPageIndex < FPageCount then
btNext.Enabled := True
else
btNext.Enabled := False;
if FPageIndex > 1 then
btPrev.Enabled := True
else
btPrev.Enabled := False;
btFirst.Enabled := btPrev.Enabled;
btLast.Enabled := btNext.Enabled;
pnlPageSet.Visible := True;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.ShowMessages(Messages: TList);
var
iLoop: Integer;
RealICQUser: TRealICQUser;
MessageSearchResult: TMessageSearchResult;
AMessageStr,
ReceiverName: String;
ALoginName: String;
begin
SetPageSetsState;
lvContents.OnChange := nil;
lvContents.Items.BeginUpdate;
try
ClearContents;
for iLoop := 0 to Messages.Count - 1 do
begin
MessageSearchResult := Messages[iLoop];
with lvContents.Items.Add do
begin
StateIndex := tvSenders.Selected.StateIndex;
if (StateIndex = UserStateIndex) or (StateIndex = SMSMessageStateIndex) then
begin
//Dialogs.ShowMessage(MessageSearchResult.TeamID);
if ((MessageSearchResult.TeamID = '-2') or (MessageSearchResult.TeamID = '-3')) then
begin
ImageIndex := 8;
end
else
begin
ImageIndex := 1;
end;
end
else
ImageIndex := 5;
RealICQUser:= TUsersService.GetUsersService.GetOrRequestUser(MessageSearchResult.Sender);
ALoginName := RealICQUser.LoginName;
if Pos('-', ALoginName) > 0 then ALoginName := Copy(ALoginName, Pos('-', ALoginName) + 1, Length(ALoginName));
if (Length(RealICQUser.DisplayName) = 0) then
Caption := ALoginName
else
Caption := RealICQUser.DisplayName + '<' + ALoginName + '>';
if MessageSearchResult.TeamID <= '-2' then
begin
RealICQUser:= TUsersService.GetUsersService.GetOrRequestUser(MessageSearchResult.Receiver);
ALoginName := RealICQUser.LoginName;
if Pos('-', ALoginName) > 0 then
ALoginName := Copy(ALoginName, Pos('-', ALoginName) + 1, Length(ALoginName));
if (Length(RealICQUser.DisplayName) = 0) then
ReceiverName := RealICQUser.LoginName
else
ReceiverName := RealICQUser.DisplayName + '<' + RealICQUser.LoginName + '>';
Caption := Caption + ' -> ' + ReceiverName;
end;
SubItems.Add(DateToStr(MessageSearchResult.SendDateTime));
SubItems.Add(TimeToStr(MessageSearchResult.SendDateTime));
AMessageStr := MessageSearchResult.MessageStr;
if MessageSearchResult.IsEncryMessage then
begin
if MessageSearchResult.Sender=MainForm.RealICQClient.LoginName then
AMessageStr:='您发送了一条签收消息'
else
AMessageStr:='您收到了一条签收消息';
end
else
AMessageStr := MessageSearchResult.MessageStr;
GetFaces2(AMessageStr, False);
SubItems.Add(AMessageStr);
Data := MessageSearchResult;
end;
end;
finally
lvContents.Items.EndUpdate;
// lvContents.OnChange := lvContentsChange;
SendMessage(lvContents.Handle, WM_VSCROLL, SB_BOTTOM, 0); //发送到底消息
Messages.Free;
end;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.LoadMessages;
var
DBHistorySearchResult: TDBHistorySearchResult;
begin
try
DBHistorySearchResult := MainForm.DBHistory.GetMessage(FTeamID, FSender,
FReceiver, StrToDate('1900-01-01'), 0, FPageIndex, StrToInt(cbPageSize.Text));
except
DBHistorySearchResult := MainForm.DBHistory.GetMessage(FTeamID, FSender,
FReceiver, StrToDate('1900/01/01'), 0, FPageIndex, StrToInt(cbPageSize.Text));
end;
try
FRecordCount := DBHistorySearchResult.RecordCount;
FPageCount := DBHistorySearchResult.PageCount;
FPageIndex := DBHistorySearchResult.PageIndex;
ShowMessages(DBHistorySearchResult.Messages);
finally
DBHistorySearchResult.Free;
end;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.LoadSystemMessages;
var
DBHistorySearchResult: TDBHistorySearchResult;
begin
try
DBHistorySearchResult := MainForm.DBHistory.GetSystemMessage(StrToDate('1900-01-01'), FPageIndex, StrToInt(cbPageSize.Text));
except
DBHistorySearchResult := MainForm.DBHistory.GetSystemMessage(StrToDate('1900/01/01'), FPageIndex, StrToInt(cbPageSize.Text));
end;
try
FRecordCount := DBHistorySearchResult.RecordCount;
FPageCount := DBHistorySearchResult.PageCount;
FPageIndex := DBHistorySearchResult.PageIndex;
ShowSystemMessages(DBHistorySearchResult.Messages);
finally
DBHistorySearchResult.Free;
end;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.LoadSMSMessages;
var
DBHistorySearchResult: TDBHistorySearchResult;
begin
try
DBHistorySearchResult := MainForm.DBHistory.GetMessage('-3', '',
'', StrToDate('1900-01-01'), 0, FPageIndex, StrToInt(cbPageSize.Text));
except
DBHistorySearchResult := MainForm.DBHistory.GetMessage('-3', '',
'', StrToDate('1900/01/01'), 0, FPageIndex, StrToInt(cbPageSize.Text));
end;
try
FRecordCount := DBHistorySearchResult.RecordCount;
FPageCount := DBHistorySearchResult.PageCount;
FPageIndex := DBHistorySearchResult.PageIndex;
ShowMessages(DBHistorySearchResult.Messages);
finally
DBHistorySearchResult.Free;
end;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.tvSendersChange(Sender: TObject; Node: TTreeNode);
var
RealICQUser: TRealICQUser;
RealICQTeam: TRealICQTeam;
begin
btSeeInfo.Visible:=False;
lvContents.Items.BeginUpdate;
try
ClearContents;
if Node = nil then Exit;
if Node.StateIndex = UserStateIndex then
begin
{$region '选择了某个用户'}
RealICQUser := Node.Data;
FTeamID := '-2';
FSender := RealICQUser.LoginName;
FReceiver := MainForm.RealICQClient.LoginName;
FPageCount := 0;
FPageIndex := 1000000;
LoadMessages;
{$endregion}
cbSearchRange.ItemIndex := cbSearchRange.Items.IndexOf(Node.Text);
Exit;
end;
if Node.StateIndex = TeamStateIndex then
begin
{$region '选择了某个群组'}
RealICQTeam := Node.Data;
FTeamID := RealICQTeam.TeamID;
FSender := '';
FReceiver := '';
FPageCount := 0;
FPageIndex := 1000000;
LoadMessages;
{$endregion}
cbSearchRange.ItemIndex := cbSearchRange.Items.IndexOf(Node.Text);
Exit;
end;
if Node.StateIndex = SystemMessageStateIndex then
begin
{$region '选择了系统消息节点'}
FPageCount := 0;
FPageIndex := 1000000;
LoadSystemMessages;
Exit;
{$endregion}
end;
if Node.StateIndex = SMSMessageStateIndex then
begin
{$region '选择了手机短消息节点'}
FPageCount := 0;
FPageIndex := 1000000;
LoadSMSMessages;
Exit;
{$endregion}
end;
cbSearchRange.ItemIndex := 0;
pnlPageSet.Visible := False;
finally
lvContents.Items.EndUpdate;
end;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.tvSendersCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
DefaultDraw := True;
if Node.StateIndex = 0 then
begin
if Node.Expanded then
Node.ImageIndex := 3
else
Node.ImageIndex := 4;
end;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.tvSendersGetSelectedIndex(Sender: TObject; Node: TTreeNode);
begin
Node.SelectedIndex := Node.ImageIndex;
end;
procedure TMessagesManagerForm.tvSendersMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
Node: TTreeNode;
P: TPoint;
begin
Node := tvSenders.GetNodeAt(X, Y);
if Node = nil then Exit;
Node.Selected := True;
if Button <> mbRight then Exit;
if (Node.StateIndex = UserStateIndex) or
(Node.StateIndex = TeamStateIndex) or
(Node.StateIndex = SystemMessageStateIndex) then
begin
P.X := X;
P.Y := Y;
P := tvSenders.ClientToScreen(P);
ppTreeNode.Popup(P.X, P.Y);
end;
end;
{设置WebBrowser的样式}
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.SetDOMStyle(Doc:IHTMLDocument2);
begin
Doc.body.style.cssText := 'word-break: break-all;';
Doc.body.style.border := '0px solid';
Doc.body.style.fontFamily := '宋体';
Doc.body.style.fontSize := '9pt';
Doc.body.style.margin := '2pt';
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.WebBrowserBeforeNavigate2(ASender: TObject;
const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
Headers: OleVariant; var Cancel: WordBool);
const
BaseURL = 'about:blank';
BaseURL1 = 'about:';
var
NewUrl, BaseID: string;
function GetBaseIDFromUrl(SrcUrl:String):String;
begin
result := Copy(SrcUrl, AnsiPos('_',SrcUrl) + 1, Length(SrcUrl));
end;
begin
if (Pos(FBaseURL, String(URL)) < 1) and (Pos('about:blank', String(URL)) < 1) then
Exit;
URL := Trim(AnsiReplaceText(String(URL), FBaseURL, ''));
if TFileTransmitAdapter.HandleMessage(Self, URL, Cancel) then
Exit;
NewUrl := Trim(AnsiReplaceText(String(URL), BaseURL, ''));
NewUrl := Trim(AnsiReplaceText(String(NewUrl), BaseURL1, ''));
{$region '打开文件'}
if AnsiSameText(Copy(NewUrl, 1, 7) , 'File://') then
begin
Cancel := True;
BaseID := AnsiReplaceStr(GetBaseIDFromUrl(NewUrl),'%20',' ');
if AnsiSameText(ExtractFileExt(BaseID), '.EXE') or
AnsiSameText(ExtractFileExt(BaseID), '.COM') then
begin
if MessageBox(Handle,
'直接打开可执行文件可能会有感染病毒的风险,确实要打开此文件吗?',
'警告',
MB_ICONWARNING or MB_OKCANCEL) <> ID_OK then Exit;
end;
if FileExists(BaseID) then
ShellExecute(handle, 'open', PChar('"' + BaseID + '"'), nil, nil, SW_SHOWNORMAL)
else
Dialogs.ShowMessage('本地电脑已经不存在此文件。');
Exit;
end;
{$endregion}
{$region '打开所在文件夹'}
if AnsiSameText(Copy(NewUrl, 1, 7) , 'Path://') then
begin
Cancel := True;
BaseID := AnsiReplaceStr(GetBaseIDFromUrl(NewUrl),'%20',' ');
WinExec(PChar('explorer /select,"' + BaseID + '"'), SW_SHOWNORMAL);
Exit;
end;
{$endregion}
end;
procedure TMessagesManagerForm.WebBrowserDocumentComplete(ASender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
begin
try
SetDomStyle(WebBrowser.Document as IHtmlDocument2);
except
end;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
lvContents.OnChange := nil;
CanClose := True;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.FormCreate(Sender: TObject);
begin
SkinName := AnsiReplaceText(MainForm.SkinName, 'MainForm', '');
ChangeUIColor(MainForm.UIMainColor);
FFileTransmitter := nil;
lvContents.DoubleBuffered := True;
WebBrowser.Navigate(ExtractFilePath(paramstr(0)) + 'html\chat.html');
FBaseURL := ExtractFilePath(paramstr(0)) + 'html\';
AddUserStatePictureToImageList(ImgLstNodeImage);
LoadTreeViewItems;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.FormDestroy(Sender: TObject);
begin
MessagesManagerForm := nil;
end;
//------------------------------------------------------------------------------
procedure TMessagesManagerForm.CreateParams(var Params: TCreateParams);
begin
inherited;
with Params do
begin
Params.WndParent := 0;
end;
end;
end.