⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 umsgview.pas

📁 FMA is a free1 powerful phone editing tool allowing users to easily manage all of the personal data
💻 PAS
📖 第 1 页 / 共 5 页
字号:
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 + -