📄 umsgview.pas
字号:
unit uMsgView;
{
*******************************************************************************
* Descriptions: Implementation for SMS Listing
* $Source: /cvsroot/fma/fma/uMsgView.pas,v $
* $Locker: $
*
* Todo:
*
* Change Log:
* $Log: uMsgView.pas,v $
*
*******************************************************************************
}
interface
uses
Windows, TntWindows, Messages, SysUtils, TntSysUtils, Classes, TntClasses, Graphics, TntGraphics, Controls, TntControls,
Forms, TntForms, Dialogs, TntDialogs, Menus, TntMenus, ImgList, VirtualTrees, ExtCtrls, TntExtCtrls, StdCtrls, TntStdCtrls,
ComCtrls, TntComCtrls, UniTntCtrls, DateUtils, GR32_Image, Buttons, TntButtons, Placemnt, LMDControl, LMDBaseControl,
LMDBaseGraphicControl, LMDGraphicControl, LMDFill, ToolWin, uMessageData;
type
TListData = Record
imageindex: Integer;
stateindex: Integer;
from,sender: WideString; // from is 'sender [number]', and sender is just the name
smsData: TFmaMessageData;
end;
PListData = ^TListData;
TSearchMode = (smSender,smFrom,smAll,smText,smDate);
TfrmMsgView = class(TTntFrame)
Splitter2: TTntSplitter;
ImageList: TImageList;
PreviewPanel: TTntPanel;
MemoMsgBody: TTntRichEdit;
ImagePanel: TTntPanel;
Panel2: TTntPanel;
SelImage: TImage32;
DetailsPanel: TTntPanel;
SpeedButton1: TTntSpeedButton;
Bevel1: TTntBevel;
Timer1: TTimer;
FormStorage1: TFormStorage;
OpenDialog1: TTntOpenDialog;
Label1: TTntLabel;
tbCommands: TToolBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton5: TToolButton;
ToolButton7: TToolButton;
ToolButton4: TToolButton;
sbClearSearch: TTntSpeedButton;
SearchPanel: TTntPanel;
Timer2: TTimer;
ListPanel: TTntPanel;
NoItemsPanel: TTntPanel;
ListMsg: TVirtualStringTree;
Animate1: TAnimate;
pmListMsg: TTntPopupMenu;
Newmessage1: TTntMenuItem;
SendMessage1: TTntMenuItem;
SendfromPhone1: TTntMenuItem;
N5: TTntMenuItem;
Reply1: TTntMenuItem;
Forward1: TTntMenuItem;
contactcall1: TTntMenuItem;
ChatContact1: TTntMenuItem;
N6: TTntMenuItem;
Advanced1: TTntMenuItem;
Search1: TTntMenuItem;
N10: TTntMenuItem;
addcontact1: TTntMenuItem;
AddNewFolder1: TTntMenuItem;
DeleteFolder1: TTntMenuItem;
DeliveryRules1: TTntMenuItem;
N11: TTntMenuItem;
FixSMSDatabase1: TTntMenuItem;
MarkAs1: TTntMenuItem;
MarkasRead1: TTntMenuItem;
MarkasUnread1: TTntMenuItem;
N9: TTntMenuItem;
MarkAllRead1: TTntMenuItem;
FileAs1: TTntMenuItem;
MoveToFolder1: TTntMenuItem;
N3: TTntMenuItem;
Archive1: TTntMenuItem;
MovetoArchive1: TTntMenuItem;
SendTO: TTntMenuItem;
SendToPhone1: TTntMenuItem;
SendToSIM1: TTntMenuItem;
N7: TTntMenuItem;
DownloadSMS1: TTntMenuItem;
N15: TTntMenuItem;
Delete1: TTntMenuItem;
N1: TTntMenuItem;
ImportTextMessages1: TTntMenuItem;
ExportselectedSMS1: TTntMenuItem;
N2: TTntMenuItem;
Properties1: TTntMenuItem;
pmRich: TTntPopupMenu;
MovetoFolder2: TTntMenuItem;
N8: TTntMenuItem;
Copy1: TTntMenuItem;
N4: TTntMenuItem;
Picture1: TTntMenuItem;
Commands1: TTntMenuItem;
LookupPanel: TTntPanel;
LookupWhitePanel: TTntPanel;
Image1: TImage;
Image2: TImage;
edSearchFor: TTntEdit;
pmSearch: TTntPopupMenu;
sfSenderNumber: TTntMenuItem;
sfEntireMessage: TTntMenuItem;
N12: TTntMenuItem;
SaveSearch1: TTntMenuItem;
sfDate: TTntMenuItem;
sfSender: TTntMenuItem;
sfText: TTntMenuItem;
SaveSearch2: TTntMenuItem;
TogglePreviewPane1: TTntMenuItem;
N13: TTntMenuItem;
TntLabel1: TTntLabel;
TntLabel2: TTntLabel;
lblFiltered: TTntLabel;
procedure ListMsgBeforeCellPaint(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
CellRect: TRect);
procedure ListMsgCompareNodes(Sender: TBaseVirtualTree; Node1,
Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
procedure ListMsgGetImageIndex(Sender: TBaseVirtualTree;
Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
var Ghosted: Boolean; var ImageIndex: Integer);
procedure ListMsgGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType;
var CellText: WideString);
procedure ListMsgHeaderClick(Sender: TVTHeader; Column: TColumnIndex;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure Properties1Click(Sender: TObject);
procedure Copy1Click(Sender: TObject);
procedure pmListMsgPopup(Sender: TObject);
procedure sbCloseSearchClick(Sender: TObject);
procedure ListMsgKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Splitter2Moved(Sender: TObject);
procedure ListMsgChange(Sender: TBaseVirtualTree; Node: PVirtualNode);
procedure Timer1Timer(Sender: TObject);
procedure MarkasReadUnreadClick(Sender: TObject);
procedure ListMsgDblClick(Sender: TObject);
procedure SendMessage1Click(Sender: TObject);
procedure ImportTextMessages1Click(Sender: TObject);
procedure FormStorage1SavePlacement(Sender: TObject);
procedure FormStorage1RestorePlacement(Sender: TObject);
procedure ListMsgHeaderMouseUp(Sender: TVTHeader; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure SendToPhone1Click(Sender: TObject);
procedure SendToSIM1Click(Sender: TObject);
procedure DownloadSMS1Click(Sender: TObject);
procedure ListMsgIncrementalSearch(Sender: TBaseVirtualTree;
Node: PVirtualNode; const SearchText: WideString;
var Result: Integer);
procedure Commands1Click(Sender: TObject);
procedure Picture1Click(Sender: TObject);
procedure MarkAllRead1Click(Sender: TObject);
procedure ListMsgClick(Sender: TObject);
procedure ListMsgPaintText(Sender: TBaseVirtualTree;
const TargetCanvas: TCanvas; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType);
procedure edSearchForKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure edSearchForKeyPress(Sender: TObject; var Key: Char);
procedure edSearchForChange(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure Search1Click(Sender: TObject);
procedure SendfromPhone1Click(Sender: TObject);
procedure ListMsgFocusChanged(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex);
procedure ListMsgKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FixSMSDatabase1Click(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure Image2Click(Sender: TObject);
procedure Image1Click(Sender: TObject);
procedure edSearchForEnter(Sender: TObject);
procedure edSearchForExit(Sender: TObject);
procedure OnSearchTypeChange(Sender: TObject);
procedure pmSearchPopup(Sender: TObject);
procedure SaveSearch1Click(Sender: TObject);
procedure TogglePreviewPane1Click(Sender: TObject);
private
FCustomImage,FIsRendered: Boolean;
FRendered: TStringList;
FRenderCanceled: boolean;
FSearchName: WideString;
FSearchMode: TSearchMode;
function CanModifyReadStatus: boolean;
function FlattenText(str: WideString; link: WideString = #32): WideString;
procedure WriteSMS(Mem: String; StoreAs: Integer = -1);
procedure Set_CustomImage(const Value: Boolean);
procedure ResetAutoMarkAsReadTimer;
procedure UpdatePropertiesStatus;
procedure DeselectAll;
procedure DoMarkMessages(AsRead: boolean; SelectedOnly: Boolean = True);
procedure DoShowDetails(Node: PVirtualNode);
procedure DoCloseDetails;
procedure DoShowPreview(Node: PVirtualNode);
procedure DoFindDeliveryReport(var sd: TFmaMessageData);
procedure UpdatePreview;
procedure SetSearchMode(const Value: TSearchMode);
procedure SetSearchWhat(const Value: WideString);
procedure SetSearchName(const Value: WideString);
public
constructor Create(AOwner: TComponent); override;
procedure ClearView;
procedure RenderListView(sl: TStringList);
procedure RefreshAllSenders;
procedure RefreshAllDeliveries;
procedure ExportList(FileType:Integer; Filename: WideString);
procedure DeleteSelected(Ask: boolean = True);
procedure CleanupDatabase(Ask: boolean = True; removeDuplicates: boolean = True);
procedure GetLongMsgData(Node: PVirtualNode; var ARef, ATot, An: Integer);
function IsRenderingComplete: boolean;
function IsRendered(const sl: TStrings): boolean;
function IsLongSMSNode(ANode: PVirtualNode): boolean;
function IsLongSMSFirstNode(ANode: PVirtualNode): boolean;
function GetNodeLongText(ANode: PVirtualNode): WideString;
function GetNodeLongList(ANode: PVirtualNode; var AList: TTntStringList): boolean;
function FindSMS(APDU: string): PVirtualNode;
{ Saved Searches }
procedure SearchForMessages(what: WideString);
//
property SearchName: WideString read FSearchName write SetSearchName;
property SearchMode: TSearchMode read FSearchMode write SetSearchMode;
property SearchWhat: WideString write SetSearchWhat;
property IsCustomImage: Boolean read FCustomImage write Set_CustomImage;
property RenderCanceled: boolean read FRenderCanceled write FRenderCanceled;
end;
implementation
uses
gnugettext, gnugettexthelpers, cUnicodeCodecs,
Unit1, uEditSMS, uLogger, uInputQuery, uThreadSafe, uMissedCalls, uSyncPhonebook, uVcard,
uSMS, uGlobal, uComposeSMS, uConnProgress, WebUtil, uDialogs, uImg32Helper;
{$R *.dfm}
{ TfrmMsgView }
function TfrmMsgView.FlattenText(str: WideString; link: WideString): WideString;
var
wl: TTntStrings;
i: Integer;
begin
Result := '';
wl := TTntStringList.Create;
try
wl.Text := str;
for i := 0 to wl.Count - 1 do begin
Result := Result + link + wl[i];
end;
finally
wl.Free;
end;
Result := WideTrim(Result);
end;
procedure TfrmMsgView.ListMsgBeforeCellPaint(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
CellRect: TRect);
var
item: PListData;
begin
item := Sender.GetNodeData(Node);
if Assigned(item) and Assigned(item.smsData) then
try
if Column = 0 then begin
if item.smsData.IsOutgoing then
TargetCanvas.Brush.Color := $00E0E0FF // from column (out)
else
TargetCanvas.Brush.Color := $00FFE0E0; // from column (in)
TargetCanvas.FillRect(CellRect);
end
else if (item.smsData.IsLong) and (item.smsData.IsLongFirst) then begin
TargetCanvas.Brush.Color := $CAFFFF; // long sms
TargetCanvas.FillRect(CellRect);
end
else if (item.smsData.IsLong) and (not item.smsData.IsLongFirst) then begin
TargetCanvas.Brush.Color := $CCCCCC; // this is obsolete - these nodes are hided
TargetCanvas.FillRect(CellRect);
end;
except
item.smsData := nil;
end;
end;
procedure TfrmMsgView.ListMsgCompareNodes(Sender: TBaseVirtualTree; Node1,
Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
var
item1, item2: PListData;
begin
item1 := Sender.GetNodeData(Node1);
item2 := Sender.GetNodeData(Node2);
if Column = 0 then Result := CompareStr(item1.from, item2.from)
else if Column = 1 then Result := WideCompareStr(item1.smsData.Text, item2.smsData.Text)
else if Column = 4 then Result := CompareDateTime(item1.smsData.TimeStamp, item2.smsData.TimeStamp);
end;
procedure TfrmMsgView.ListMsgGetImageIndex(Sender: TBaseVirtualTree;
Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
var Ghosted: Boolean; var ImageIndex: Integer);
var
item: PListData;
begin
case Column of
0: begin
if (Kind = ikNormal) or (Kind = ikSelected) then begin
item := Sender.GetNodeData(Node);
ImageIndex := item.imageindex;
end
else
ImageIndex := -1;
end;
2: begin
if (Kind = ikNormal) or (Kind = ikSelected) then begin
item := Sender.GetNodeData(Node);
try
if item.smsData.IsNew then
ImageIndex := 21 // unread
else
ImageIndex := 20; // read
except
end;
end
else
ImageIndex := -1;
end;
3: begin
if (Kind = ikNormal) or (Kind = ikSelected) then begin
item := Sender.GetNodeData(Node);
try
if item.smsData.ReportRequested then
ImageIndex := 0 // report sent
else
ImageIndex := -1; // reporting off
if item.smsData.ReportPDU <> '' then
if item.smsData.IsDelivered then
ImageIndex := 25 // delivered
else
ImageIndex := 24; // not delivered (yet)
except
end;
end
else
ImageIndex := -1;
end;
end;
end;
procedure TfrmMsgView.ListMsgGetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: WideString);
var
item: PListData;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -