home *** CD-ROM | disk | FTP | other *** search
/ Freelog 11 / Freelog011.iso / BestOf / PhoenixMail / Source / phoenix / Main.pas < prev    next >
Pascal/Delphi Source File  |  1998-12-04  |  112KB  |  3,296 lines

  1. {*****************************************************************************
  2.  *
  3.  *  Main.pas - Phoenix Main Form  (19-July-1998)
  4.  *
  5.  *  Copyright (c) 1998-99 Michael Haller
  6.  *
  7.  *  Author:     Michael Haller
  8.  *  E-mail:     michael@discountdrive.com
  9.  *  Homepage:   http://www.discountdrive.com/sunrise/
  10.  *
  11.  *  This program is free software; you can redistribute it and/or
  12.  *  modify it under the terms of the GNU General Public License
  13.  *  as published by the Free Software Foundation;
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
  23.  *
  24.  *----------------------------------------------------------------------------
  25.  *
  26.  *  Revision history:
  27.  *
  28.  *     DATE     REV                 DESCRIPTION
  29.  *  ----------- --- ----------------------------------------------------------
  30.  *
  31.  *****************************************************************************}
  32.  
  33. unit Main;
  34.  
  35. interface
  36.  
  37. uses
  38.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  39.   StdCtrls, ToolWin, Menus, Buttons, MailParser, FMInfo, FMTips, FMEnviro,
  40.   FMMailOptions, FMAccount, PXStuff, INIFiles, FMFolder, Registry, FileCtrl,
  41.   FMOnline, ShellAPI, ClipBrd, ParserSup, ExtCtrls, ComCtrls, FMSelectMail,
  42.   FMAddress, XPrinter, TreeViewEx, FMDirectory, FMSignature, ImgList,
  43.   EnhListView, ExtListView, FMSearch, LangSup, FMEditAdr, DialUp, StatusBarEx,
  44.   FMSelBook, FMStdMail, FMSpellCheck, TDOnline, PanelEx;
  45.  
  46. type
  47.   TMainForm = class(TForm)
  48.     MainMenu1: TMainMenu;
  49.     Help1: TMenuItem;
  50.     AboutPhoenix1: TMenuItem;
  51.     Splitter1: TSplitter;
  52.     Panel1: TPanel;
  53.     RichEdit1: TRichEdit;
  54.     Splitter2: TSplitter;
  55.     TreeView1: TTreeViewEx;
  56.     ImageList1: TImageList;
  57.     ImageList2: TImageList;
  58.     Account1: TMenuItem;
  59.     New1: TMenuItem;
  60.     Properties1: TMenuItem;
  61.     Folder1: TMenuItem;
  62.     New2: TMenuItem;
  63.     Delete1: TMenuItem;
  64.     N1: TMenuItem;
  65.     Properties2: TMenuItem;
  66.     Delete2: TMenuItem;
  67.     N2: TMenuItem;
  68.     N3: TMenuItem;
  69.     FetchMails1: TMenuItem;
  70.     Enhanced1: TMenuItem;
  71.     EmptyTrashBin1: TMenuItem;
  72.     PopupMenu1: TPopupMenu;
  73.     NewFolder1: TMenuItem;
  74.     DeleteFolder1: TMenuItem;
  75.     N4: TMenuItem;
  76.     NewAccount1: TMenuItem;
  77.     DeleteAccount1: TMenuItem;
  78.     N5: TMenuItem;
  79.     EmptyTrashBin2: TMenuItem;
  80.     N6: TMenuItem;
  81.     Properties3: TMenuItem;
  82.     Exit1: TMenuItem;
  83.     Splitter3: TSplitter;
  84.     PopupMenu2: TPopupMenu;
  85.     Open1: TMenuItem;
  86.     N7: TMenuItem;
  87.     Saveas1: TMenuItem;
  88.     Delete3: TMenuItem;
  89.     Add1: TMenuItem;
  90.     OpenDialog1: TOpenDialog;
  91.     Message1: TMenuItem;
  92.     Properties4: TMenuItem;
  93.     New3: TMenuItem;
  94.     Delete4: TMenuItem;
  95.     N8: TMenuItem;
  96.     ToggleUnreadFlag1: TMenuItem;
  97.     Replay1: TMenuItem;
  98.     ReplayQuoted1: TMenuItem;
  99.     N10: TMenuItem;
  100.     Attachment1: TMenuItem;
  101.     Open2: TMenuItem;
  102.     Save1: TMenuItem;
  103.     N9: TMenuItem;
  104.     AddFile1: TMenuItem;
  105.     DeleteFile1: TMenuItem;
  106.     PopupMenu3: TPopupMenu;
  107.     NewMessage1: TMenuItem;
  108.     DeleteMessage1: TMenuItem;
  109.     N11: TMenuItem;
  110.     Replay2: TMenuItem;
  111.     ReplayQuoted2: TMenuItem;
  112.     N12: TMenuItem;
  113.     ToggleReadUnreadFlag1: TMenuItem;
  114.     Properties5: TMenuItem;
  115.     PopupMenu4: TPopupMenu;
  116.     Cut1: TMenuItem;
  117.     Copy1: TMenuItem;
  118.     Paste1: TMenuItem;
  119.     Delete5: TMenuItem;
  120.     N13: TMenuItem;
  121.     SelectAll1: TMenuItem;
  122.     Edit1: TMenuItem;
  123.     Cut2: TMenuItem;
  124.     Copy2: TMenuItem;
  125.     Paste2: TMenuItem;
  126.     Delete6: TMenuItem;
  127.     SelectAll2: TMenuItem;
  128.     File1: TMenuItem;
  129.     SendMail1: TMenuItem;
  130.     N16: TMenuItem;
  131.     GoOnline1: TMenuItem;
  132.     N18: TMenuItem;
  133.     FetchMail1: TMenuItem;
  134.     SendMail2: TMenuItem;
  135.     EnvironmentOptions1: TMenuItem;
  136.     N19: TMenuItem;
  137.     TipoftheDay1: TMenuItem;
  138.     Panel2: TPanelEx;
  139.     Bevel1: TBevel;
  140.     Panel3: TPanel;
  141.     SpeedButton2: TSpeedButtonEx;
  142.     SpeedButton3: TSpeedButtonEx;
  143.     SpeedButton4: TSpeedButtonEx;
  144.     SpeedButton5: TSpeedButtonEx;
  145.     SpeedButton6: TSpeedButtonEx;
  146.     PopupMenu5: TPopupMenu;
  147.     Reply1: TMenuItem;
  148.     ReplyQuoted1: TMenuItem;
  149.     N21: TMenuItem;
  150.     AddressBook1: TMenuItem;
  151.     SpeedButton9: TSpeedButtonEx;
  152.     N22: TMenuItem;
  153.     Print1: TMenuItem;
  154.     PrinterSetupDialog1: TPrinterSetupDialog;
  155.     PrinterSetup1: TMenuItem;
  156.     PrintDialog1: TPrintDialog;
  157.     XPrint1: TXPrint;
  158.     Contents1: TMenuItem;
  159.     PhoenixMailHomePage1: TMenuItem;
  160.     N23: TMenuItem;
  161.     Signature1: TMenuItem;
  162.     Forward1: TMenuItem;
  163.     Redirect1: TMenuItem;
  164.     Forward2: TMenuItem;
  165.     Redirect2: TMenuItem;
  166.     ListView1: TExtListView;
  167.     Timer1: TTimer;
  168.     Panel4: TPanel;
  169.     Image2: TImage;
  170.     CheckBox1: TCheckBox;
  171.     PopupMenu6: TPopupMenu;
  172.     ShowPhoenixMail1: TMenuItem;
  173.     Modal1: TMenuItem;
  174.     MenuItem2: TMenuItem;
  175.     MenuItem3: TMenuItem;
  176.     Image3: TImage;
  177.     N24: TMenuItem;
  178.     FetchSendMails1: TMenuItem;
  179.     N25: TMenuItem;
  180.     NewMessage2: TMenuItem;
  181.     AddressBook2: TMenuItem;
  182.     SearchMessage1: TMenuItem;
  183.     N26: TMenuItem;
  184.     SaveAs2: TMenuItem;
  185.     SaveAs3: TMenuItem;
  186.     SaveDialog1: TSaveDialog;
  187.     SelectAllMessages1: TMenuItem;
  188.     SelectAllMessages2: TMenuItem;
  189.     N28: TMenuItem;
  190.     N29: TMenuItem;
  191.     Label1: TLabel;
  192.     ListBox1: TListBox;
  193.     Image5: TImage;
  194.     N15: TMenuItem;
  195.     N17: TMenuItem;
  196.     AddtoAdressbook1: TMenuItem;
  197.     AddtoAdressbook2: TMenuItem;
  198.     Timer2: TTimer;
  199.     Label2: TLabel;
  200.     SpeedButton10: TSpeedButtonEx;
  201.     SpellCheck1: TMenuItem;
  202.     QuickView1: TMenuItem;
  203.     QuickView2: TMenuItem;
  204.     Image6: TImage;
  205.     Image7: TImage;
  206.     ImageList3: TImageList;
  207.     Panel7: TPanel;
  208.     Bevel2: TBevel;
  209.     DialUp1: TDialUp;
  210.     Memo1: TMemo;
  211.     Image10: TImage;
  212.     EmptyRepository1: TMenuItem;
  213.     EmptyRepository2: TMenuItem;
  214.     CheckBox2: TCheckBox;
  215.     Panel6: TPanel;
  216.     Label3: TLabel;
  217.     Panel9: TPanel;
  218.     ListView2: TListView;
  219.     Panel11: TPanel;
  220.     ASpeedButton1: TSpeedButton;
  221.     StatusBar1: TStatusBarEx;
  222.     Image9: TImage;
  223.     Label4: TLabel;
  224.     PaintBox1: TPaintBox;
  225.     SpeedButton8: TSpeedButtonEx;
  226.     SpeedButton1: TSpeedButtonEx;
  227.     SpeedButton7: TSpeedButtonEx;
  228.     SpeedButton13: TSpeedButtonEx;
  229.     SpeedButton14: TSpeedButtonEx;
  230.     SpeedButton15: TSpeedButtonEx;
  231.     SpeedButton16: TSpeedButtonEx;
  232.     SpeedButton17: TSpeedButtonEx;
  233.     SpeedButton12: TSpeedButtonEx;
  234.     SpeedButton11: TSpeedButtonEx;
  235.     CancelOnlineOperation1: TMenuItem;
  236.     Image4: TImage;
  237.     Label5: TLabel;
  238.     N14: TMenuItem;
  239.     Bugs1: TMenuItem;
  240.     Suggestins1: TMenuItem;
  241.     PopupMenu7: TPopupMenu;
  242.     FlatButtons1: TMenuItem;
  243.     SmallButtons1: TMenuItem;
  244.     N20: TMenuItem;
  245.     Configure1: TMenuItem;
  246.     procedure FormCreate(Sender: TObject);
  247.     procedure New1Click(Sender: TObject);
  248.     procedure TreeView1Deletion(Sender: TObject; Node: TTreeNode);
  249.     procedure Properties1Click(Sender: TObject);
  250.     procedure Properties2Click(Sender: TObject);
  251.     procedure New2Click(Sender: TObject);
  252.     procedure TreeView1Edited(Sender: TObject; Node: TTreeNode; var S: String);
  253.     procedure Delete1Click(Sender: TObject);
  254.     procedure Delete2Click(Sender: TObject);
  255.     procedure Enhanced1Click(Sender: TObject);
  256.     procedure EmptyTrashBin1Click(Sender: TObject);
  257.     procedure Folder1Click(Sender: TObject);
  258.     procedure Account1Click(Sender: TObject);
  259.     procedure TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
  260.       State: TDragState; var Accept: Boolean);
  261.     procedure TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
  262.     procedure Properties3Click(Sender: TObject);
  263.     procedure PopupMenu1Popup(Sender: TObject);
  264.     procedure Exit1Click(Sender: TObject);
  265.     procedure FetchMails1Click(Sender: TObject);
  266.     procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
  267.     procedure Open1Click(Sender: TObject);
  268.     procedure Saveas1Click(Sender: TObject);
  269.     procedure Add1Click(Sender: TObject);
  270.     procedure Delete3Click(Sender: TObject);
  271.     procedure ToggleUnreadFlag1Click(Sender: TObject);
  272.     procedure Properties4Click(Sender: TObject);
  273.     procedure RichEdit1Change(Sender: TObject);
  274.     procedure TreeView1KeyDown(Sender: TObject; var Key: Word;
  275.       Shift: TShiftState);
  276.     procedure Delete4Click(Sender: TObject);
  277.     procedure New3Click(Sender: TObject);
  278.     procedure Replay1Click(Sender: TObject);
  279.     procedure ReplayQuoted1Click(Sender: TObject);
  280.     procedure PopupMenu4Popup(Sender: TObject);
  281.     procedure Delete5Click(Sender: TObject);
  282.     procedure Copy1Click(Sender: TObject);
  283.     procedure Paste1Click(Sender: TObject);
  284.     procedure Cut1Click(Sender: TObject);
  285.     procedure SelectAll1Click(Sender: TObject);
  286.     procedure FormDestroy(Sender: TObject);
  287.     procedure SendMails1Click(Sender: TObject);
  288.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  289.     procedure ListView2KeyDown(Sender: TObject; var Key: Word;
  290.       Shift: TShiftState);
  291.     procedure GoOnline1Click(Sender: TObject);
  292.     procedure EnvironmentOptions1Click(Sender: TObject);
  293.     procedure AboutPhoenix1Click(Sender: TObject);
  294.     procedure TipoftheDay1Click(Sender: TObject);
  295.     procedure ListView1Change(Sender: TObject; Item: TListItem;
  296.       Change: TItemChange);
  297.     procedure SpeedButton2Click(Sender: TObject);
  298.     procedure SpeedButton7Click(Sender: TObject);
  299.     procedure Print1Click(Sender: TObject);
  300.     procedure PrinterSetup1Click(Sender: TObject);
  301.     procedure Image1Click(Sender: TObject);
  302.     procedure Signature1Click(Sender: TObject);
  303.     procedure Forward1Click(Sender: TObject);
  304.     procedure Redirect1Click(Sender: TObject);
  305.     procedure ListView1MouseUp(Sender: TObject; Button: TMouseButton;
  306.       Shift: TShiftState; X, Y: Integer);
  307.     procedure PopupMenu2Popup(Sender: TObject);
  308.     procedure ListView1KeyUp(Sender: TObject; var Key: Word;
  309.       Shift: TShiftState);
  310.     procedure Timer1Timer(Sender: TObject);
  311.     procedure ListView1DrawHeader(Control: TWinControl;
  312.       var ACanvas: TCanvas; Index: Integer; var ARect: TRect;
  313.       Selected: Boolean; var DefaultDrawing: Boolean);
  314.     procedure MenuItem3DrawIteehm(Sender: TObject; ACanvas: TCanvas;
  315.       ARect: TRect; Selected: Boolean);
  316.     procedure MenuItem3MeasureItem(Sender: TObject; ACanvas: TCanvas;
  317.       var Width, Height: Integer);
  318.     procedure ShowPhoenixMail1Click(Sender: TObject);
  319.     procedure Modal1Click(Sender: TObject);
  320.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  321.     procedure SearchMessage1Click(Sender: TObject);
  322.     procedure SaveAs3Click(Sender: TObject);
  323.     procedure Message1Click(Sender: TObject);
  324.     procedure SelectAllMessages1Click(Sender: TObject);
  325.     procedure TreeView1Compare(Sender: TObject; Node1, Node2: TTreeNode;
  326.       Data: Integer; var Compare: Integer);
  327.     procedure AddtoAdressbook1Click(Sender: TObject);
  328.     procedure Timer2Timer(Sender: TObject);
  329.     procedure SpellCheck1Click(Sender: TObject);
  330.     procedure QuickView1Click(Sender: TObject);
  331.     procedure StatusBar1DrawPanel(StatusBar: TStatusBar;
  332.       Panel: TStatusPanel; const Rect: TRect);
  333.     procedure Contents1Click(Sender: TObject);
  334.     procedure DialUp1StatusEvent(Sender: TObject; MessageText: String;
  335.       Error: Boolean);
  336.     procedure EmptyRepository1Click(Sender: TObject);
  337.     procedure ASpeedButton1Click(Sender: TObject);
  338.     procedure SpeedButton11Click(Sender: TObject);
  339.     procedure CancelOnlineOperation1Click(Sender: TObject);
  340.     procedure Panel2Paint(Sender: TObject);
  341.     procedure Configure1Click(Sender: TObject);
  342.     procedure FlatButtons1Click(Sender: TObject);
  343.     procedure SmallButtons1Click(Sender: TObject);
  344.     procedure PopupMenu7Popup(Sender: TObject);
  345.     procedure TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
  346.       Shift: TShiftState; X, Y: Integer);
  347.   private
  348.     { Private declarations }
  349.     MinutesSinceStart, AnimationPosition: Integer;
  350.     AreWeOnline, AnimationToLeft, bCurSmlTlbButtons: Boolean;
  351.     BKAttachments1, BKAttachments2: TStringList;
  352.     NotifyIconData : TNotifyIconData;
  353.     TrayIcon: HIcon;
  354.     DragDropDefWndProc, DragDropWndProcInstance: Pointer;
  355.     ReadCounter, DefaultTlbButtonHeight, DefaultTlbButtonWidth: Integer;
  356.     procedure DragDropWndProc(var Message: TMessage);
  357.     procedure DragDropFiles(hDropHandle: HDrop);
  358.     procedure WMTaskIcon(var Message: TMessage); message WM_TASKICON;
  359.     procedure WMSysCommand(var Message: TMessage); message WM_SYSCOMMAND;
  360.     procedure WndProc(var Message: TMessage); override;
  361.     //procedure WMDrawItem(var Msg: TWMDrawItem); message WM_DRAWITEM;
  362.     //procedure WMMeasureItem(var Msg: TWMMeasureItem); message WM_MEASUREITEM;
  363.     //procedure DrawPopUpMenuItem(Item: TMenuItem; DC: HDC; ARect: TRect; Selected: Boolean);
  364.     procedure ScanForAccounts(TreeView: TTreeView);
  365.     procedure SaveAccountDataToFile(Data: PAccountData);
  366.     procedure SaveFolderDataToFile(Data: PFolderData);
  367.     procedure ActualizeTrash;
  368.     procedure UpdateListView;
  369.     procedure SetAccountMenusEnabled(OnlyFalse: Boolean);
  370.     procedure SetMessageMenusEnabled;
  371.     procedure ActualizeStatusBar;
  372.     procedure BackupAttachments;
  373.     procedure RestoreAttachments;
  374.     procedure OnlineSession(OnlineTyp: Byte);
  375.     procedure AddAttachment(Filename: String);
  376.     procedure CreateGradientBitmap(StartPos: Integer; var GBitmap: TBitmap);
  377.   public
  378.     { Public declarations }
  379.     ToolbarSeperators: TList;
  380.     ActualMailFile: String;
  381.     DefaultFont: TFont;
  382.     AccountsNode, TrashNode, RepositoryNode: TTreeNode;
  383.     Terminating, OnlineThreadTerminated, ReadyToClose: Boolean;
  384.     OnlineThreadCounter: Integer;
  385.     GradientBmp, AniBmp1, AniBmp2: TBitmap;
  386.     function NewMessage(ShowDlg, Signat: Boolean; ASubject, ATo, AFrom: String; NewText: TStringList): Boolean;
  387.     procedure AppMinimize(Sender: TObject);
  388.     function GetActualAccount: TTreeNode;
  389.     procedure DoSaveMessage;
  390.     function GetUniqueAccountFolder(Name: String): String;
  391.     function GetToolbarButttonByIndex(Index: Integer; var ImageIndex: Integer): TSpeedButtonEx;
  392.     procedure SetToolbarButtonOrder;
  393.   end;
  394.  
  395. const
  396.   iToolbarButtonCount = 17;
  397.  
  398. var
  399.   MainForm: TMainForm;
  400.  
  401. implementation
  402.  
  403. {$R *.DFM}
  404.  
  405. var
  406.   TextFile: Text;
  407.  
  408. procedure TMainForm.FormCreate(Sender: TObject);
  409. var
  410.   SHFileInfo: TSHFileInfo;
  411.   I, E: Integer;
  412.   Bitmap: TBitmap;
  413.   IniFile: TIniFile;
  414.   C: TColor;
  415.  
  416.   procedure SetBitmapToButton(var S: TSpeedButtonEx; I: Integer);
  417.   begin
  418.     Bitmap := TBitmap.Create;
  419.     ImageList3.GetBitmap(I, Bitmap);
  420.     S.Glyph.Assign(Bitmap);
  421.     Bitmap.Free;
  422.   end;
  423.  
  424. begin
  425.   AttachLanguageToForm(Self);
  426.   Caption := Application.Title;
  427.   Icon := Application.Icon;
  428.   MinutesSinceStart := 0;
  429.   AreWeOnline := False;
  430.   Terminating := False;
  431.   bCurSmlTlbButtons := False;
  432.   //from InitializePX
  433.   IniFile := TIniFile.Create(sSettingsFile);
  434.   sAccountsCaption := IniFile.ReadString('Captions', 'Accounts', MainForm.ListBox1.Items[0]);
  435.   sTrashBagCaption := IniFile.ReadString('Captions', 'TrashBag', MainForm.ListBox1.Items[1]);
  436.   sRepositoryCaption := IniFile.ReadString('Captions', 'Repository', MainForm.ListBox1.Items[2]);
  437.   //Get accounts
  438.   ScanForAccounts(TreeView1);
  439.   ActualizeTrash;
  440.   TreeView1.FullExpand;
  441.   TreeView1.AlphaSort;
  442.   ImageList2.Handle := SHGetFileInfo('', 0, SHFileInfo, SizeOf(SHFileInfo), SHGFI_SYSICONINDEX or SHGFI_LARGEICON);
  443.   ActualMailFile := '';
  444.   SetMessageMenusEnabled;
  445.   Image10.Cursor := crHandCursor;
  446.   BKAttachments1 := TStringList.Create;
  447.   BKAttachments2 := TStringList.Create;
  448.   // Environment Options
  449.   DefaultFont := TFont.Create;
  450.   DefaultFont.Name := sMessageFont;
  451.   DefaultFont.Size := iFontSize;
  452.   DefaultFont.Color := iFontColor;
  453.   DefaultFont.CharSet := iFontCharSet;
  454.   // Form Position
  455.   case IniFile.ReadInteger('Position', 'MainState', 1) of
  456.     0, 1: begin
  457.       WindowState := wsNormal;
  458.       Width := IniFile.ReadInteger('Position', 'MainWidth', Width);
  459.       Height := IniFile.ReadInteger('Position', 'MainHeight', Height);
  460.       Top := IniFile.ReadInteger('Position', 'MainTop', Top);
  461.       Left := IniFile.ReadInteger('Position', 'MainLeft', Left);
  462.     end;
  463.     2: WindowState := wsMaximized;
  464.   end;
  465.   // Splitter Position
  466.   TreeView1.Width := IniFile.ReadInteger('Splitter', 'FolderView', TreeView1.Width);
  467.   ListView1.Height := IniFile.ReadInteger('Splitter', 'MessageList', ListView1.Height);
  468.   Panel9.Height := IniFile.ReadInteger('Splitter', 'MessageEdit', Panel9.Height);
  469.   // ListView Order/Position
  470.   if CheckBox1.Checked then begin
  471.     ListView1.AutoSortStyle := assSmart;
  472.   end;
  473.   ListView1.ReadSettingsFromIniFile('MessageList', IniFile);
  474.   // Printer
  475.   if XPrint1.PrinterAvailable = False then begin
  476.     Print1.Enabled := False;
  477.     SpeedButton17.Enabled := False;
  478.     PrinterSetup1.Enabled := False;
  479.   end;
  480.   // Resources
  481.   ImageList1.ResourceLoad(rtBitmap, 'PX500', clFuchsia);
  482.   ImageList3.ResourceLoad(rtBitmap, 'PX505', clNone);
  483.   //Control positions
  484.   Label4.Caption := '';
  485.   Label4.Left := StatusBar1.Panels[0].Width+StatusBar1.Panels[1].Width+6;
  486.   Label5.Caption := '';
  487.   Label5.Left := StatusBar1.Panels[0].Width+StatusBar1.Panels[1].Width+StatusBar1.Panels[2].Width+22;
  488.   PaintBox1.Left := Label4.Left-2;
  489.   PaintBox1.Width := StatusBar1.Panels[2].Width-7;
  490.   //Look and Feel
  491.   ToolbarSeperators := TList.Create;
  492.   if bOfficeFonts then Font.Name := sOfficeFontName;
  493.   for I := 1 to iToolBarButtonCount do TSpeedButtonEx(FindComponent('SpeedButton'+IntToStr(I))).Comment := TSpeedButtonEx(FindComponent('SpeedButton'+IntToStr(I))).Caption;
  494.   DefaultTlbButtonHeight := SpeedButton1.Height;
  495.   DefaultTlbButtonWidth := SpeedButton1.Width;
  496.   SetToolbarButtonOrder;
  497.   bDrawBK := False;
  498.   if FileExists(sToolbarBKBitmap) and bFlatButtons and (iColorDepth > 8) then begin
  499.     Image4.Picture.LoadFromFile(sToolbarBKBitmap);
  500.     bDrawBK := True;
  501.   end;
  502.   // Button Glyphs
  503.   if ColorScheme or LowColor then begin
  504.     SetBitmapToButton(SpeedButton4, 0);   SetBitmapToButton(SpeedButton5, 1);
  505.     SetBitmapToButton(SpeedButton6, 2);   SetBitmapToButton(SpeedButton3, 3);
  506.     SetBitmapToButton(SpeedButton2, 4);   SetBitmapToButton(SpeedButton9, 5);
  507.     SetBitmapToButton(SpeedButton10, 6);  SetBitmapToButton(SpeedButton8, 7);
  508.     SetBitmapToButton(SpeedButton7, 8);   SetBitmapToButton(SpeedButton1, 9);
  509.     SetBitmapToButton(SpeedButton13, 14); SetBitmapToButton(SpeedButton14, 15);
  510.     SetBitmapToButton(SpeedButton12, 16); SetBitmapToButton(SpeedButton17, 17);
  511.     SetBitmapToButton(SpeedButton16, 18); SetBitmapToButton(SpeedButton15, 19);
  512.     SetBitmapToButton(SpeedButton11, 20);
  513.   end;
  514.   GradientBmp := TBitmap.Create; GradientBmp.Width := Image5.Width; GradientBmp.Height := Image5.Height;
  515.   CreateGradientBitmap(60, GradientBmp);
  516.   Image5.Picture.Bitmap.Assign(GradientBmp);
  517.   GradientBmp.Free;
  518.   Bitmap := TBitmap.Create; Bitmap.Width := 48; Bitmap.Height := PaintBox1.Height;
  519.   CreateGradientBitmap(0, Bitmap);
  520.   AniBmp1 := TBitmap.Create; AniBmp1.Width := Bitmap.Width+6; AniBmp1.Height := Bitmap.Height;
  521.   AniBmp2 := TBitmap.Create; AniBmp2.Width := Bitmap.Width+6; AniBmp2.Height := Bitmap.Height;
  522.   AniBmp1.Canvas.Brush.Color := clBtnFace;
  523.   AniBmp1.Canvas.FillRect(Rect(0, 0, AniBmp1.Width, AniBmp1.Height));
  524.   AniBmp1.Canvas.CopyRect(Rect(3, 0, Bitmap.Width, Bitmap.Height), Bitmap.Canvas, Rect(0, 0, Bitmap.Width, Bitmap.Height));
  525.   Bitmap.Free;
  526.   E := 0;
  527.   for I := AniBmp1.Width-1 downto 0 do begin
  528.     C := AniBmp1.Canvas.Pixels[I, 0];
  529.     AniBmp2.Canvas.Pen.Color := C;
  530.     AniBmp2.Canvas.MoveTo(E, 0);
  531.     AniBmp2.Canvas.LineTo(E, AniBmp1.Height);
  532.     Inc(E);
  533.   end;
  534.   Image10.Hint := sHomepage;
  535.   // Last folder
  536.   for I := 0 to TreeView1.Items.Count-1 do
  537.     if TreeView1.Items[I].StateIndex in [1,2] then
  538.       if PFolderData(TreeView1.Items[I].Data)^.Path = sLastFolder then begin
  539.         TreeView1.Items[I].Selected := True;
  540.         TreeView1.Items[I].Focused := True;
  541.       end;
  542.   // Tray icon
  543.   SHGetFileInfo(PChar(Application.Exename), 0, SHFileInfo, SizeOf(SHFileInfo), SHGFI_ICON or SHGFI_SMALLICON);
  544.   TrayIcon := SHFileInfo.hIcon;;
  545.   with NotifyIconData do begin
  546.     cbSize := SizeOf(TNotifyIconData);
  547.     Wnd := Handle;
  548.     uID := 0;
  549.     uFlags := NIF_MESSAGE+NIF_ICON+NIF_TIP;
  550.     hIcon := TrayIcon;
  551.     StrPCopy(szTip, 'Phoenix Mail');
  552.     uCallbackMessage := WM_TASKICON;
  553.   end;
  554.   Shell_NotifyIcon(NIM_ADD, @NotifyIconData);
  555.   // Explorer Drag Drop
  556.   DragDropWndProcInstance := MakeObjectInstance(DragDropWndProc);
  557.   DragDropDefWndProc := Pointer(GetWindowLong(ListView2.Handle,GWL_WNDPROC));
  558.   SetWindowLong(ListView2.Handle, GWL_WNDPROC, LongInt(DragDropWndProcInstance));
  559.   DragAcceptFiles(ListView2.Handle, True);
  560.   //Menu
  561.   //for I := 1 to 9 do
  562.   //  ModifyMenu(PopupMenu6.Handle, I, MF_OWNERDRAW, 0, nil);
  563.   //Strings
  564.   DialUp1.LangStrList.Clear;
  565.   DialUp1.LangStrList.Add(ListBox1.Items[64]);
  566.   DialUp1.LangStrList.Add(ListBox1.Items[65]);
  567.   DialUp1.LangStrList.Add(ListBox1.Items[87]);
  568.   //Version
  569.   sXMailer := 'Phoenix Mail ' + sMailerVer1;  //Standard Edition
  570.   if MainForm.CheckBox2.Checked then
  571.     sXMailer := 'Phoenix Mail ' + sMailerVer2;   //Developer Edition
  572.   //Stuff
  573.   IniFile.Free;
  574.   Application.OnMinimize := AppMinimize;
  575.   //Enabled
  576.   CancelOnlineOperation1.Enabled := False;
  577.   SpeedButton12.Enabled := False;
  578.   //Timer
  579.   OnlineThreadTerminated := False;
  580.   OnlineThreadCounter := 0;
  581.   Timer1.Enabled := True;
  582.   Timer2.Enabled := True;
  583. end;
  584.  
  585. procedure TMainForm.FormDestroy(Sender: TObject);
  586. var
  587.   IniFile: TIniFile;
  588.   I: Integer;
  589. begin
  590.   try
  591.     BKAttachments1.Free;
  592.     BKAttachments2.Free;
  593.     DefaultFont.Free;
  594.   except end;
  595.   // Tray icon
  596.   Shell_NotifyIcon(NIM_DELETE, @NotifyIconData);
  597.   DestroyIcon(TrayIcon);
  598.   // Explorer Drag drop
  599.   DragAcceptFiles(ListView2.Handle, False);
  600.   SetWindowLong(ListView2.Handle, GWL_WNDPROC, LongInt(DragDropDefWndProc));
  601.   FreeObjectInstance(DragDropWndProcInstance);
  602.   // ListView
  603.   IniFile := TIniFile.Create(sSettingsFile);
  604.   ListView1.WriteSettingsToIniFile('MessageList', IniFile);
  605.   // Form Position
  606.   if WindowState = wsNormal then begin
  607.     IniFile.WriteInteger('Position', 'MainState', 1);
  608.     IniFile.WriteInteger('Position', 'MainWidth', Width);
  609.     IniFile.WriteInteger('Position', 'MainHeight', Height);
  610.     IniFile.WriteInteger('Position', 'MainTop', Top);
  611.     IniFile.WriteInteger('Position', 'MainLeft', Left);
  612.   end;
  613.   if WindowState = wsMaximized then IniFile.WriteInteger('Position', 'MainState', 2);
  614.   // Splitter Position
  615.   IniFile.WriteInteger('Splitter', 'FolderView', TreeView1.Width);
  616.   IniFile.WriteInteger('Splitter', 'MessageList', ListView1.Height);
  617.   IniFile.WriteInteger('Splitter', 'MessageEdit', Panel9.Height);
  618.   IniFile.Free;
  619.   //Bevels
  620.   try
  621.     for I := 0 to ToolbarSeperators.Count-1 do TBevel(ToolbarSeperators.Items[I]).Free;
  622.     ToolbarSeperators.Free;
  623.   except end;
  624.   AniBmp1.Free;
  625.   AniBmp2.Free;
  626. end;
  627.  
  628. procedure TMainForm.DoSaveMessage;
  629. begin
  630.   if SaveMessage = False then Exit;
  631.   if FileExists(ActualMailFile) = False then Exit;
  632.   RichEdit1.Lines.SaveToFile(sTempMessageFile);
  633.   CurrentEMail.CompileMsgFileOnDisk(ActualMailFile);
  634.   SaveMessage := False;
  635. end;
  636.  
  637. procedure TMainForm.ScanForAccounts(TreeView: TTreeView);
  638. var
  639.   SearchRec: TSearchRec;
  640.   Found, Level: Integer;
  641.   Node: TTreeNode;
  642.   F: TINIFile;
  643.   AccountData: PAccountData;
  644.   I: Integer;
  645.   FolderData: PFolderData;
  646.  
  647.   procedure RecurseDirs(Dir: String);
  648.   var
  649.     SearchRec: TSearchRec;
  650.     Found: Integer;
  651.   begin
  652.      Found := FindFirst(Dir+'*.*', $37, SearchRec);
  653.      while Found = 0 do begin
  654.        if (SearchRec.Attr and $10 = $10) and (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then begin
  655.          if FileExists(Dir+SearchRec.Name+'\Folder.ini') then begin
  656.            F := TINIFile.Create(Dir+SearchRec.Name+'\Folder.ini');
  657.            New(FolderData);
  658.            FolderData^.Path := Dir+SearchRec.Name+'\';
  659.            FolderData^.Name := SearchRec.Name;
  660.            FolderData^.Outbox := F.ReadBool('Folder', 'Outbox', False);
  661.            FolderData^.Inbox := F.ReadBool('Folder', 'Inbox', False);
  662.            FolderData^.Filter := F.ReadString('Filter', 'TakeIn', '');
  663.            F.Free;
  664.            while Node.Level <> (Level) do Node := Node.Parent;
  665.            Node := TreeView.Items.AddChild(Node, FolderData^.Name);
  666.            Node.Data := FolderData;
  667.            if FolderData^.OutBox then begin
  668.              Node.ImageIndex := 3;
  669.              Node.SelectedIndex := 4;
  670.            end else
  671.              if FolderData^.InBox then begin
  672.                Node.ImageIndex := 15;
  673.                Node.SelectedIndex := 16;
  674.              end else begin
  675.                Node.ImageIndex := 1;
  676.                Node.SelectedIndex := 2;
  677.              end;
  678.            Node.StateIndex := 2;
  679.            Inc(Level);
  680.            RecurseDirs(Dir+SearchRec.Name+'\');
  681.          end;
  682.        end;
  683.        Found := FindNext(SearchRec);
  684.      end;
  685.      FindClose(SearchRec);
  686.      Dec(Level);
  687.   end;
  688.  
  689. begin
  690.   TreeView.Items.Clear;
  691.   //Accounts
  692.   Node := TreeView1.Items.Add(TreeView1.TopItem, sAccountsCaption);
  693.   Node.ImageIndex := 7;
  694.   Node.SelectedIndex := 7;
  695.   Node.StateIndex := 4;
  696.   AccountsNode := Node;
  697.   Found := FindFirst(sAccountRootFolder+'*.*', $37, SearchRec);
  698.   while Found = 0 do begin
  699.     if (SearchRec.Attr and $10 = $10) and (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then begin
  700.       if FileExists(sAccountRootFolder+SearchRec.Name+'\Account.ini') then begin
  701.         F := TIniFile.Create(sAccountRootFolder+SearchRec.Name+'\Account.ini');
  702.         New(AccountData);
  703.         AccountData^.Path := sAccountRootFolder+SearchRec.Name+'\';
  704.         AccountData^.Name := F.ReadString('Account', 'Name', 'Account Name');
  705.         AccountData^.FromMail := F.ReadString('From', 'EMail', '');
  706.         AccountData^.FromDesc := F.ReadString('From', 'Name', '');
  707.         AccountData^.ReplyMail := F.ReadString('ReplyTo', 'EMail', '');
  708.         AccountData^.ReplyDesc := F.ReadString('ReplyTo', 'Name', '');
  709.         AccountData^.POPServer := F.ReadString('POP3', 'Server', '');
  710.         AccountData^.POPPort := F.ReadString('POP3', 'Port', '110');
  711.         AccountData^.POPUser := F.ReadString('POP3', 'User', '');
  712.         AccountData^.POPPass := MHDecrypt(F.ReadString('POP3', 'Password', ''));
  713.         AccountData^.SMTPServer := F.ReadString('SMTP', 'Server', '');
  714.         AccountData^.SMTPPort := F.ReadString('SMTP', 'Port', '25');
  715.         AccountData^.Organization := F.ReadString('From', 'Organization', '');
  716.         AccountData^.PromptPassword := F.ReadInteger('POP3', 'PromptPassword', 0);
  717.         AccountData^.DoSMTP := F.ReadInteger('SMTP', 'DoSMTP', 1);
  718.         AccountData^.DoPOP := F.ReadInteger('POP3', 'DoPOP', 1);
  719.         AccountData^.StandardDownload := F.ReadInteger('POP3', 'StandardDownload', 0);
  720.         AccountData^.KeepFilter := F.ReadString('Filter', 'Keep', '');
  721.         AccountData^.DeleteFilter := F.ReadString('Filter', 'Delete', '');
  722.         F.Free;
  723.         Node := TreeView.Items.AddChild(AccountsNode, AccountData^.Name);
  724.         Node.Data := AccountData;
  725.         Node.ImageIndex := 0;
  726.         Node.SelectedIndex := 0;
  727.         Node.StateIndex := 1;
  728.         Level := 1;
  729.         RecurseDirs(sAccountRootFolder+SearchRec.Name+'\');
  730.       end;
  731.     end;
  732.     Found := FindNext(SearchRec);
  733.   end;
  734.   FindClose(SearchRec);
  735.   //Repository
  736.   Node := TreeView1.Items.Add(TreeView1.TopItem, sRepositoryCaption);
  737.   Node.StateIndex := 5;
  738.   Node.ImageIndex := 8;
  739.   Node.SelectedIndex := 8;
  740.   RepositoryNode := Node;
  741.   //Trash bag
  742.   Node := TreeView1.Items.Add(TreeView1.TopItem, sTrashBagCaption);
  743.   Node.StateIndex := 3;
  744.   TrashNode := Node;
  745.   for I := 0 to TreeView1.Items.Count-1 do
  746.     SetPXTreeNodeName(TreeView1.Items[I]);
  747. end;
  748.  
  749. function TMainForm.GetActualAccount: TTreeNode;
  750. var
  751.   Node: TTreeNode;
  752. begin
  753.   Result := AccountsNode.GetFirstChild;
  754.   if Assigned(TreeView1.Selected) then begin
  755.     Node := TreeView1.Selected;
  756.     if Node.Level < 1 then Exit;
  757.     while Node.Level <> 1 do Node := Node.Parent;
  758.     if Node.StateIndex = 1 then Result := Node;
  759.   end;
  760. end;
  761.  
  762. procedure TMainForm.SaveAccountDataToFile(Data: PAccountData);
  763. var
  764.   F: TINIFile;
  765. begin
  766.   F := TINIFile.Create(Data^.Path+'Account.ini');
  767.   F.WriteString('Account', 'Name', Data^.Name);
  768.   F.WriteString('From', 'EMail', Data^.FromMail);
  769.   F.WriteString('From', 'Name', Data^.FromDesc);
  770.   F.WriteString('ReplyTo', 'EMail', Data^.ReplyMail);
  771.   F.WriteString('ReplyTo', 'Name', Data^.ReplyDesc);
  772.   F.WriteString('POP3', 'Server', Data^.POPServer);
  773.   F.WriteString('POP3', 'Port', Data^.POPPort);
  774.   F.WriteString('POP3', 'User', Data^.POPUser);
  775.   F.WriteString('POP3', 'Password', MHEncrypt(Data^.POPPass));
  776.   F.WriteString('SMTP', 'Server', Data^.SMTPServer);
  777.   F.WriteString('SMTP', 'Port', Data^.SMTPPort);
  778.   F.WriteString('From', 'Organization', Data^.Organization);
  779.   F.WriteInteger('POP3', 'PromptPassword', Data^.PromptPassword);
  780.   F.WriteInteger('SMTP', 'DoSMTP', Data^.DoSMTP);
  781.   F.WriteInteger('POP3', 'DoPOP', Data^.DoPOP);
  782.   F.WriteInteger('POP3', 'StandardDownload', Data^.StandardDownload);
  783.   F.WriteString('Filter', 'Keep', Data^.KeepFilter);
  784.   F.WriteString('Filter', 'Delete', Data^.DeleteFilter);
  785.   F.Free;
  786. end;
  787.  
  788. procedure TMainForm.SaveFolderDataToFile(Data: PFolderData);
  789. var
  790.   F: TINIFile;
  791. begin
  792.   CreateFolder(Data^.Path);
  793.   F := TINIFile.Create(Data^.Path+'Folder.ini');
  794.   F.WriteBool('Folder', 'Outbox', Data^.Outbox);
  795.   F.WriteBool('Folder', 'Inbox', Data^.Inbox);
  796.   F.WriteString('Filter', 'TakeIn', Data^.Filter);
  797.   F.Free;
  798. end;
  799.  
  800. procedure TMainForm.ActualizeTrash;
  801. var
  802.   SearchRec: TSearchRec;
  803.   Found, E: Integer;
  804. begin
  805.   E := 0;;
  806.   Found := FindFirst(sTrashFolder+'*.*', faAnyFile, SearchRec);
  807.   while Found = 0 do begin
  808.     if UpperCase(ExtractFileExt(SearchRec.Name)) = '.MSG' then Inc(E);
  809.     Found := FindNext(SearchRec);
  810.   end;
  811.   FindClose(SearchRec);
  812.   if E > 0 then begin
  813.     TrashNode.ImageIndex := 6;
  814.     TrashNode.SelectedIndex := 6;
  815.   end else begin
  816.     TrashNode.ImageIndex := 5;
  817.     TrashNode.SelectedIndex := 5;
  818.   end;
  819.   E := 0;;
  820.   Found := FindFirst(sRepositoryFolder+'*.*', faAnyFile, SearchRec);
  821.   while Found = 0 do begin
  822.     if UpperCase(ExtractFileExt(SearchRec.Name)) = '.MSG' then Inc(E);
  823.     Found := FindNext(SearchRec);
  824.   end;
  825.   FindClose(SearchRec);
  826.   if E > 0 then begin
  827.     RepositoryNode.ImageIndex := 8;
  828.     RepositoryNode.SelectedIndex := 8;
  829.   end else begin
  830.     RepositoryNode.ImageIndex := 14;
  831.     RepositoryNode.SelectedIndex := 14;
  832.   end;
  833.   TreeView1.Repaint;
  834. end;
  835.  
  836. function TMainForm.GetUniqueAccountFolder(Name: String): String;
  837. var
  838.   S, T, K: String;
  839.   I: integer;
  840. begin
  841.   T := 'a'+Copy(Name, 1, 5);
  842.   for I := 1 to Length(T) do
  843.     if not (T[I] in [' ','\','/','<','>',':','?','*','"','|',#19]) then
  844.       K := K + T[I];
  845.   T := K;
  846.   repeat
  847.     S := T;
  848.     for I := 0 to 1 do
  849.       S := S + Chr(Random(10)+48);
  850.   until DirectoryExists(S) = False;
  851.   Result := S;
  852. end;
  853.  
  854. procedure TMainForm.New1Click(Sender: TObject);
  855. var
  856.   Node, FNode: TTreeNode;
  857.   Data: PAccountData;
  858.   Folder: PFolderData;
  859.   StdIni: TIniFile;
  860. begin
  861.   AccountForm := TAccountForm.Create(Self);
  862.   New(Data);
  863.   Data^.Name := ListBox1.Items[3];
  864.   Data^.POPPort := '110';
  865.   Data^.SMTPPort := '25';
  866.   Data^.DoSMTP := 1;
  867.   Data^.DoPOP := 1;
  868.   Data^.StandardDownload := 0;
  869.   Data^.PromptPassword := 0;
  870.   if (GetActualAccount = nil) and FileExists(sStandardAccountDataFile) then begin
  871.     StdIni := TIniFile.Create(sStandardAccountDataFile);
  872.     Data^.Name := StdIni.ReadString('Account', 'Name', ListBox1.Items[3]);
  873.     Data^.FromMail := StdIni.ReadString('From', 'EMail', '');
  874.     Data^.FromDesc := StdIni.ReadString('From', 'Name', '');
  875.     Data^.ReplyMail := StdIni.ReadString('ReplyTo', 'EMail', '');
  876.     Data^.ReplyDesc := StdIni.ReadString('ReplyTo', 'Name', '');
  877.     Data^.POPServer := StdIni.ReadString('POP3', 'Server', '');
  878.     Data^.POPPort := StdIni.ReadString('POP3', 'Port', '110');
  879.     Data^.POPUser := StdIni.ReadString('POP3', 'User', '');
  880.     Data^.POPPass := MHDecrypt(StdIni.ReadString('POP3', 'Password', ''));
  881.     Data^.SMTPServer := StdIni.ReadString('SMTP', 'Server', '');
  882.     Data^.SMTPPort := StdIni.ReadString('SMTP', 'Port', '25');
  883.     Data^.Organization := StdIni.ReadString('From', 'Organization', '');
  884.     Data^.PromptPassword := StdIni.ReadInteger('POP3', 'PromptPassword', 0);
  885.     Data^.DoSMTP := StdIni.ReadInteger('SMTP', 'DoSMTP', 1);
  886.     Data^.DoPOP := StdIni.ReadInteger('POP3', 'DoPOP', 1);
  887.     Data^.StandardDownload := StdIni.ReadInteger('POP3', 'StandardDownload', 0);
  888.     Data^.KeepFilter := StdIni.ReadString('Filter', 'Keep', '');
  889.     Data^.DeleteFilter := StdIni.ReadString('Filter', 'Delete', '');
  890.     StdIni.Free;
  891.   end;
  892.   AccountForm.CreateNewAccount := True;
  893.   AccountForm.LoadAccountData(Data);
  894.   if AccountForm.ShowModal = mrOK then begin
  895.     AccountForm.SaveAccountData(Data);
  896.     SaveAccountDataToFile(Data);
  897.     Node := TreeView1.Items.AddChild(AccountsNode, Data^.Name);
  898.     Node.Data := Data;
  899.     Node.StateIndex := 1;
  900.     Node.ImageIndex := 0;
  901.     Node.SelectedIndex := 0;
  902.     // Child folders
  903.     New(Folder); Folder^.Name := ListBox1.Items[4]; Folder^.Outbox := True; Folder^.Inbox := False;
  904.     Folder^.Path := Data^.Path+'\'+Folder.Name+'\'; CreateFolder(Folder^.Path); SaveFolderDataToFile(Folder);
  905.     FNode := TreeView1.Items.AddChild(Node, Folder^.Name);
  906.     FNode.Data := Folder; FNode.StateIndex := 2; FNode.ImageIndex := 3; FNode.SelectedIndex := 4;
  907.  
  908.     New(Folder); Folder^.Name := ListBox1.Items[5]; Folder^.Outbox := False; Folder^.Inbox := True;
  909.     Folder^.Path := Data^.Path+'\'+Folder.Name+'\'; CreateFolder(Folder^.Path); SaveFolderDataToFile(Folder);
  910.     FNode := TreeView1.Items.AddChild(Node, Folder^.Name);
  911.     FNode.Data := Folder; FNode.StateIndex := 2; FNode.ImageIndex := 1; FNode.SelectedIndex := 2;
  912.  
  913.     New(Folder); Folder^.Name := ListBox1.Items[6]; Folder^.Outbox := False; Folder^.Inbox := False;
  914.     Folder^.Path := Data^.Path+'\'+Folder.Name+'\'; CreateFolder(Folder^.Path); SaveFolderDataToFile(Folder);
  915.     FNode := TreeView1.Items.AddChild(Node, Folder^.Name);
  916.     FNode.Data := Folder; FNode.StateIndex := 2; FNode.ImageIndex := 1; FNode.SelectedIndex := 2;
  917.  
  918.     Node.Expanded := True;
  919.     TreeView1.SetFocus;
  920.     Node.Selected := True;
  921.     TreeView1.Selected := Node;
  922.     TreeView1.AlphaSort;
  923.   end else
  924.     Dispose(Data);
  925.   AccountForm.Free;
  926.   SetAccountMenusEnabled(False);
  927.   SetMessageMenusEnabled;
  928.   ActualizeStatusBar;
  929. end;
  930.  
  931. procedure TMainForm.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
  932. var
  933.   AccountData: PAccountData;
  934.   FolderData: PFolderData;
  935. begin
  936.   if Assigned(Node.Data) then begin
  937.     if Node.StateIndex = 1 then begin
  938.       AccountData := Node.Data;
  939.       Dispose(AccountData);
  940.     end;
  941.     if Node.StateIndex = 2 then begin
  942.       FolderData := Node.Data;
  943.       Dispose(FolderData);
  944.     end;
  945.   end;
  946. end;
  947.  
  948. procedure TMainForm.Properties1Click(Sender: TObject);
  949. var
  950.   Node: TTreeNode;
  951.   Data: PAccountData;
  952. begin
  953.   Node := GetActualAccount;
  954.   if Assigned(Node) then
  955.     if Assigned(Node.Data) then begin
  956.       AccountForm := TAccountForm.Create(Self);
  957.       Data := Node.Data;
  958.       AccountForm.CreateNewAccount := False;
  959.       AccountForm.LoadAccountData(Data);
  960.       if AccountForm.ShowModal = mrOK then begin
  961.         AccountForm.SaveAccountData(Data);
  962.         SaveAccountDataToFile(Data);
  963.         SetPXTreeNodeName(Node);
  964.         TreeView1.AlphaSort;
  965.       end;
  966.       AccountForm.Free;
  967.     end;
  968. end;
  969.  
  970. procedure TMainForm.Properties2Click(Sender: TObject);
  971. var
  972.   Node: TTreeNode;
  973.   Data: PFolderData;
  974.   S: String;
  975. begin
  976.   Node := TreeView1.Selected;
  977.   if Assigned(Node) then
  978.     if Node.StateIndex = 2 then
  979.       if Assigned(Node.Data) then begin
  980.         FolderForm := TFolderForm.Create(Self);
  981.         Data := Node.Data;
  982.         S := Data^.Path;
  983.         FolderForm.LoadFolderData(Data);
  984.         if FolderForm.ShowModal = mrOK then begin
  985.           FolderForm.SaveFolderData(Data);
  986.           MoveFolder(S, Data^.Path);
  987.           SaveFolderDataToFile(Data);
  988.            if Data^.OutBox then begin
  989.              Node.ImageIndex := 3;
  990.              Node.SelectedIndex := 4;
  991.            end else
  992.              if Data^.InBox then begin
  993.                Node.ImageIndex := 15;
  994.                Node.SelectedIndex := 16;
  995.              end else begin
  996.                Node.ImageIndex := 1;
  997.                Node.SelectedIndex := 2;
  998.              end;
  999.            SetPXTreeNodeName(Node);
  1000.            TreeView1.AlphaSort;
  1001.         end;
  1002.         FolderForm.Free;
  1003.         Node := TreeView1.Selected;
  1004.         TreeView1.Selected := nil;
  1005.         TreeView1.Selected := Node
  1006.       end;
  1007. end;
  1008.  
  1009. procedure TMainForm.New2Click(Sender: TObject);
  1010. var
  1011.   Node: TTreeNode;
  1012.   Data: PFolderData;
  1013. begin
  1014.   if Assigned(TreeView1.Selected) then Node := TreeView1.Selected else Node := TreeView1.TopItem;
  1015.   if Assigned(Node) then
  1016.     if Node.StateIndex in [1, 2] then
  1017.       if Assigned(Node.Data) then begin
  1018.         FolderForm := TFolderForm.Create(Self);
  1019.         New(Data);
  1020.         Data^.Name := ListBox1.Items[7];
  1021.         Data^.Outbox := False;
  1022.         Data^.Inbox := False;
  1023.         Data^.Filter := '';
  1024.         if Node.StateIndex = 2 then
  1025.           Data^.Path := PFolderData(Node.Data)^.Path+'##@@  @@##\'
  1026.         else
  1027.           Data^.Path := PAccountData(Node.Data)^.Path+Data^.Name+'##@@  @@##\';
  1028.         FolderForm.LoadFolderData(Data);
  1029.         if FolderForm.ShowModal = mrOK then begin
  1030.           FolderForm.SaveFolderData(Data);
  1031.           CreateFolder(Data^.Path);
  1032.           SaveFolderDataToFile(Data);
  1033.           Node := TreeView1.Items.AddChild(Node, Data^.Name);
  1034.           Node.Data := Data;
  1035.           Node.StateIndex := 2;
  1036.           if Data^.OutBox then begin
  1037.              Node.ImageIndex := 3;
  1038.              Node.SelectedIndex := 4;
  1039.            end else begin
  1040.              Node.ImageIndex := 1;
  1041.              Node.SelectedIndex := 2;
  1042.            end;
  1043.            Node.Parent.Expanded := True;
  1044.            TreeView1.SetFocus;
  1045.            Node.Selected := True;
  1046.            TreeView1.Selected := node;
  1047.         end else
  1048.           Dispose(Data);
  1049.         FolderForm.Free;
  1050.         TreeView1.AlphaSort;
  1051.       end;
  1052. end;
  1053.  
  1054. procedure TMainForm.TreeView1Edited(Sender: TObject; Node: TTreeNode; var S: String);
  1055. var
  1056.   AccountData: PAccountData;
  1057.   FolderData: PFolderData;
  1058.   OldDir: String;
  1059.   I: Integer;
  1060.   IniFile: TIniFile;
  1061. begin
  1062.   Exit;
  1063.   //not editable anymore...
  1064.   for I := 1 to Length(S) do
  1065.     if S[I] in ['\','/','<','>',':','?','*','"','|',#19] then begin
  1066.       MessageDlg(MainForm.ListBox1.Items[44], mtWarning, [mbOK], 0);
  1067.       S := GetPXTreeNodeName(Node);
  1068.       Exit;
  1069.     end;
  1070.   if Node.StateIndex = 1 then begin
  1071.     AccountData := Node.Data;
  1072.     AccountData^.Name := S;
  1073.     SaveAccountDataToFile(AccountData);
  1074.   end;
  1075.   if Node.StateIndex = 2 then begin
  1076.     FolderData := Node.Data;
  1077.     OldDir := FolderData^.Path;
  1078.     FolderData^.Name := S;
  1079.     FolderData^.Path := GetParentFolder(FolderData.Path)+FolderData^.Name+'\';
  1080.     MoveFolder(OldDir, FolderData^.Path);
  1081.     SaveFolderDataToFile(FolderData);
  1082.   end;
  1083.   IniFile := TIniFile.Create(sSettingsFile);
  1084.   if Node.StateIndex = 3 then begin
  1085.     IniFile.WriteString('Trash', 'Name', S);
  1086.   end;
  1087.   if Node.StateIndex = 4 then begin
  1088.     IniFile.WriteString('Accounts', 'Name', S);
  1089.   end;
  1090.   if Node.StateIndex = 5 then begin
  1091.     IniFile.WriteString('Repository', 'Name', S);
  1092.   end;
  1093.   IniFile.Free;
  1094.   SetPXTreeNodeName(Node);
  1095.   TreeView1.AlphaSort;
  1096. end;
  1097.  
  1098. procedure TMainForm.Delete1Click(Sender: TObject);
  1099. var
  1100.   Node: TTreeNode;
  1101.   Data: PFolderData;
  1102.   S: String;
  1103. begin
  1104.   Node := TreeView1.Selected;
  1105.   if Assigned(Node) then
  1106.     if Node.StateIndex = 2 then
  1107.       if Assigned(Node.Data) then begin
  1108.         S := Format(ListBox1.Items[8], [GetPXTreeNodeName(Node)]);
  1109.         if MessageDlg(S, mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin
  1110.           Data := Node.Data;
  1111.           DeleteFolder(Data^.Path, sTrashFolder);
  1112.           Node.Delete;
  1113.           ActualizeTrash;
  1114.           TreeView1.AlphaSort;
  1115.         end;
  1116.       end;
  1117. end;
  1118.  
  1119. procedure TMainForm.Delete2Click(Sender: TObject);
  1120. var
  1121.   Node: TTreeNode;
  1122.   Data: PAccountData;
  1123. begin
  1124.   Node := GetActualAccount;
  1125.   if Assigned(Node) then
  1126.     if Assigned(Node.Data) then begin
  1127.       if MessageDlg(Format(ListBox1.Items[9], [GetPXTreeNodeName(Node)]), mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin
  1128.         Data := Node.Data;
  1129.         DeleteFolder(Data^.Path, sTrashFolder);
  1130.         Node.Delete;
  1131.         ActualizeTrash;
  1132.         TreeView1.AlphaSort;
  1133.         SetAccountMenusEnabled(False);
  1134.         SetMessageMenusEnabled;
  1135.         ActualizeStatusBar;
  1136.       end;
  1137.     end;
  1138. end;
  1139.  
  1140. procedure TMainForm.Enhanced1Click(Sender: TObject);
  1141. begin
  1142.   EmptyTrashBin1.Enabled := False;
  1143.   EmptyTrashBin1.Caption := Format(ListBox1.Items[84], [GetPXTreeNodeName(TrashNode)]);
  1144.   EmptyTrashBin2.Caption := Format(ListBox1.Items[84], [GetPXTreeNodeName(TrashNode)]);
  1145.   EmptyRepository1.Enabled := False;
  1146.   EmptyRepository1.Caption := Format(ListBox1.Items[85], [GetPXTreeNodeName(RepositoryNode)]);
  1147.   EmptyRepository2.Caption := Format(ListBox1.Items[85], [GetPXTreeNodeName(RepositoryNode)]);
  1148.   if TrashNode.ImageIndex = 6 then begin
  1149.     EmptyTrashBin1.Enabled := True;
  1150.     EmptyTrashBin2.Enabled := True;
  1151.   end;
  1152.   if RepositoryNode.ImageIndex = 8 then begin
  1153.     EmptyRepository1.Enabled := True;
  1154.     EmptyRepository2.Enabled := True;
  1155.   end;
  1156. end;
  1157.  
  1158. procedure TMainForm.EmptyTrashBin1Click(Sender: TObject);
  1159. var
  1160.   SearchRec: TSearchRec;
  1161.   Found: Integer;
  1162. begin
  1163.   Screen.Cursor := crHourGlass;
  1164.   Application.ProcessMessages;
  1165.   Found := FindFirst(sTrashFolder+'*.*', faAnyFile, SearchRec);
  1166.   while Found = 0 do begin
  1167.     SetFileAttr(sTrashFolder+SearchRec.Name, False, True, False, False);
  1168.     DeleteFile(sTrashFolder+SearchRec.Name);
  1169.     Found := FindNext(SearchRec);
  1170.   end;
  1171.   FindClose(SearchRec);
  1172.   TreeView1Change(Self, TreeView1.Selected);
  1173.   ActualizeTrash;
  1174.   TreeView1.Invalidate;
  1175. end;
  1176.  
  1177. procedure TMainForm.Folder1Click(Sender: TObject);
  1178. var
  1179.   Node: TTreeNode;
  1180. begin
  1181.   New2.Enabled := False;
  1182.   Delete1.Enabled := False;
  1183.   Properties2.Enabled := False;
  1184.   Node := TreeView1.Selected;
  1185.   if Assigned(Node) then
  1186.     if Assigned(Node.Data) then begin
  1187.       if Node.StateIndex = 2 then begin
  1188.         New2.Enabled := True;
  1189.         Delete1.Enabled := True;
  1190.         Properties2.Enabled := True;
  1191.       end;
  1192.       if Node.StateIndex = 1 then begin
  1193.         New2.Enabled := True;
  1194.       end;
  1195.     end;
  1196. end;
  1197.  
  1198. procedure TMainForm.Account1Click(Sender: TObject);
  1199. var
  1200.   Node: TTreeNode;
  1201. begin
  1202.   FetchMails1.Enabled := False;
  1203.   SendMail1.Enabled := False;
  1204.   Delete2.Enabled := False;
  1205.   Properties1.Enabled := False;
  1206.   Node := GetActualAccount;
  1207.   if Assigned(Node) then
  1208.     if Assigned(Node.Data) then begin
  1209.       if AreWeOnline = False then begin
  1210.         FetchMails1.Enabled := True;
  1211.         SendMail1.Enabled := True;
  1212.       end;
  1213.       Delete2.Enabled := True;
  1214.       Properties1.Enabled := True;
  1215.     end;
  1216. end;
  1217.  
  1218. procedure TMainForm.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
  1219. begin
  1220.   Accept := False;
  1221.   if Source = TreeView1 then
  1222.     if TreeView1.Selected.StateIndex = 2 then Accept := True;
  1223.   if Source = ListView1 then Accept := True;
  1224. end;
  1225.  
  1226. procedure TMainForm.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
  1227. var
  1228.   Node: TTreeNode;
  1229.   Data: PFolderData;
  1230.   Item: TListItem;
  1231.   S: String;
  1232.   I, E: Integer;
  1233.  
  1234.   procedure SetSubNotesPath(Node: TTreeNode);
  1235.   var
  1236.     I: Integer;
  1237.   begin
  1238.     for I := 0 to Node.Count-1 do begin
  1239.       PFolderData(Node.Item[I].Data)^.Path := PFolderData(Node.Item[I].Parent.Data)^.Path+GetPXTreeNodeName(Node.Item[I])+'\';
  1240.       if Node.Count > 0 then SetSubNotesPath(Node.Item[I]);
  1241.     end;
  1242.   end;
  1243.  
  1244. begin
  1245.   ListView1.Invalidate;
  1246.   TreeView1.Invalidate;
  1247.   Splitter1.Invalidate;
  1248.   Node := TreeView1.GetNodeAt(X, Y);
  1249.   if Node = nil then Exit;
  1250.   if Node = TreeView1.Selected then Exit;
  1251.   if SaveMessage then DoSaveMessage;
  1252.   if Node.StateIndex = 1 then
  1253.     S := PAccountData(Node.Data)^.Path;
  1254.   if Node.StateIndex = 2 then
  1255.     S := PFolderData(Node.Data)^.Path;
  1256.   if Node.StateIndex = 3 then
  1257.     S := sTrashFolder;
  1258.   if Node.StateIndex = 5 then
  1259.     S := sRepositoryFolder;
  1260.   // Drag Folder
  1261.   if Source = TreeView1 then begin
  1262.     if TreeView1.Selected = nil then Exit;
  1263.     if TreeView1.Selected.StateIndex <> 2 then Exit;
  1264.     if Node.StateIndex in [4, 5] then Exit;
  1265.     Data := TreeView1.Selected.Data;
  1266.     if Node.StateIndex = 3 then begin
  1267.       if MessageDlg(Format(ListBox1.Items[8], [GetPXTreeNodeName(TreeView1.Selected)]), mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin
  1268.         DeleteFolder(PFolderData(TreeView1.Selected.Data)^.Path, sTrashFolder);
  1269.         TreeView1.Selected.Delete;
  1270.         ActualizeTrash;
  1271.         TreeView1.AlphaSort;
  1272.       end;
  1273.       Exit;
  1274.     end;
  1275.     S := S + Data^.Name+ '\';
  1276.     if Data^.Path = S then Exit;
  1277.     if DirectoryExists(S) then begin
  1278.       MessageDlg(Format(ListBox1.Items[10], [Data^.Name]), mtWarning, [mbOK], 0);
  1279.       Exit;
  1280.     end;
  1281.     MoveFolder(Data^.Path, S);
  1282.     Data^.Path := S;
  1283.     Screen.Cursor := crHourGlass;
  1284.     MoveTreeViewNode(TreeView1, TreeView1.Selected, Node);
  1285.     Screen.Cursor := crDefault;
  1286.     //TreeView1.Selected.MoveTo(Node, naAddChildFirst);
  1287.     //SetSubNotesPath(TreeView1.Selected);
  1288.     //TreeView1.AlphaSort;
  1289.   end;
  1290.   // Drag Message
  1291.   if Source = ListView1 then begin
  1292.     if Node.StateIndex = 4 then Exit;
  1293.     I := 0; E := ListView1.Items.Count-1;
  1294.     while I <= E do begin
  1295.       if ListView1.Items[I].Selected then begin
  1296.         Item := ListView1.Items[I];
  1297.         //SetFileAttr(Item.SubItems[4], False, True, False, False);
  1298.         //CopyFile(PChar(Item.SubItems[4]), PChar(S+ExtractFileName(Item.SubItems[4])), False);
  1299.         FileCopy(nil, Item.SubItems[4], S+ExtractFileName(Item.SubItems[4]));
  1300.         SetFileAttr(Item.SubItems[4], False, True, False, False);
  1301.  
  1302.         DeleteFile(Item.SubItems[4]);
  1303.         Item.Delete;
  1304.         Dec(I); Dec(E);
  1305.       end;
  1306.       Inc(I);
  1307.     end;
  1308.     ListView1MouseUp(Self, mbLeft, [ssLeft], 0, 0);
  1309.     Application.ProcessMessages;
  1310.     SetPXTreeNodeName(Node);
  1311.     SetPXTreeNodeName(TreeView1.Selected);
  1312.     ActualizeStatusBar;
  1313.     ActualizeTrash;
  1314.   end;
  1315. end;
  1316.  
  1317. procedure TMainForm.Properties3Click(Sender: TObject);
  1318. begin
  1319.   if TreeView1.Selected = nil then Exit;
  1320.   if TreeView1.Selected.StateIndex = 1 then
  1321.     Properties1.OnClick(Self);
  1322.   if TreeView1.Selected.StateIndex = 2 then
  1323.     Properties2.OnClick(Self);
  1324. end;
  1325.  
  1326. procedure TMainForm.PopupMenu1Popup(Sender: TObject);
  1327. var
  1328.   Node: TTreeNode;
  1329. begin
  1330.   NewFolder1.Enabled := False;
  1331.   DeleteFolder1.Enabled := False;
  1332.   EmptyTrashBin2.Enabled := False;
  1333.   EmptyRepository2.Enabled := False;
  1334.   Properties3.Enabled := False;
  1335.   Enhanced1.OnClick(Self);
  1336.   if TreeView1.Selected = nil then Exit;
  1337.   Node := TreeView1.Selected;
  1338.   if Node.StateIndex = 1 then begin
  1339.     NewFolder1.Enabled := True;
  1340.     Properties3.Enabled := True;
  1341.   end;
  1342.   if Node.StateIndex = 2 then begin
  1343.     NewFolder1.Enabled := True;
  1344.     DeleteFolder1.Enabled := True;
  1345.     Properties3.Enabled := True;
  1346.   end;
  1347.   TreeView1.Selected := Node;
  1348. end;
  1349.  
  1350. procedure TMainForm.Exit1Click(Sender: TObject);
  1351. begin
  1352.   Close;
  1353. end;
  1354.  
  1355. procedure TMainForm.FetchMails1Click(Sender: TObject);
  1356. begin
  1357.   OnlineSession(1);
  1358. end;
  1359.  
  1360. procedure TMainForm.TreeView1Change(Sender: TObject; Node: TTreeNode);
  1361. var
  1362.   Dir: String;
  1363.   SearchRec: TSearchRec;
  1364.   Item: TListItem;
  1365.   Found: Integer;
  1366.   Outbox: Boolean;
  1367. begin
  1368.   if csDestroying in ComponentState then Exit;
  1369.   Screen.Cursor := crHourGlass;
  1370.   sLastFolder := '';
  1371.   if SaveMessage then DoSaveMessage;
  1372.   Panel6.Visible := False;
  1373.   ActualMailFile := '';
  1374.   ListView1.BeginUpdate;
  1375.   ListView1.Items.Clear;
  1376.   ListView2.Items.Clear;
  1377.   RichEdit1.Lines.Clear;
  1378.   RichEdit1.Enabled := False;
  1379.   ListView2.Enabled := False;
  1380.   Dir := '';
  1381.   if (Node = nil) or (Node.StateIndex = 4) then begin
  1382.     ListView1.EndUpdate;
  1383.     ActualizeStatusBar;
  1384.     Screen.Cursor := crDefault;
  1385.     Exit;
  1386.   end;
  1387.   OutBox := False;
  1388.   if Node.StateIndex = 1 then
  1389.     Dir := PAccountData(Node.Data)^.Path;
  1390.   if Node.StateIndex = 2 then begin
  1391.     Dir := PFolderData(Node.Data)^.Path;
  1392.     OutBox := PFolderData(Node.Data)^.Outbox;
  1393.   end;
  1394.   if Node.StateIndex = 3 then
  1395.     Dir := sTrashFolder;
  1396.   if Node.StateIndex = 5 then begin
  1397.     OutBox := True;
  1398.     Dir := sRepositoryFolder;
  1399.   end;
  1400.   if OutBox then
  1401.     Listview1.Columns.Items[2].Caption := ListBox1.Items[11]
  1402.   else
  1403.     Listview1.Columns.Items[2].Caption := ListBox1.Items[12];
  1404.   sLastFolder := Dir;
  1405.   Found := FindFirst(Dir+'*.*', faAnyFile, SearchRec);
  1406.   while Found = 0 do begin
  1407.     if UpperCase(ExtractFileExt(SearchRec.Name)) = '.MSG' then begin
  1408.       Item := ListView1.Items.Add;
  1409.       CurrentEMail.ParseMail(Dir+SearchRec.Name, True);
  1410.       Item.ImageIndex := -1;
  1411.       if FileGetAttr(Dir+SearchRec.Name) and faArchive = 0 then begin
  1412.         if (LowerCase(CurrentEMail.Priority) = 'low') then Item.ImageIndex := 9;
  1413.         if (LowerCase(CurrentEMail.Priority) = 'normal') then Item.ImageIndex := 10;
  1414.         if (LowerCase(CurrentEMail.Priority) = 'high') then Item.ImageIndex := 11;
  1415.       end;
  1416.       Item.SubItems.Add(CurrentEMail.Subject);
  1417.       if OutBox then begin
  1418.         Item.SubItems.Add(GetCommataStringReceiver);
  1419.       end else
  1420.         Item.SubItems.Add(CurrentEMail.From);
  1421.       Item.SubItems.Add(DateToStr(CurrentEMail.ADate));
  1422.       Item.SubItems.Add(TimeToStr(CurrentEMail.ATime));
  1423.       Item.SubItems.Add(Dir+SearchRec.Name);  // invisible
  1424.     end;
  1425.     Found := FindNext(SearchRec);
  1426.   end;
  1427.   FindClose(SearchRec);
  1428.   ListView1.EndUpdate;
  1429.   ActualizeStatusBar;
  1430.   ActualMailFile := '';
  1431.   ListView1.Resort;
  1432.   SetMessageMenusEnabled;
  1433.   SaveMessage := False;
  1434.   Screen.Cursor := crDefault;
  1435. end;
  1436.  
  1437. procedure TMainForm.Open1Click(Sender: TObject);
  1438. var
  1439.   I: Integer;
  1440.   A: array[0..MAX_PATH] of Char;
  1441.   S: String;
  1442. begin
  1443.   if ListView2.SelCount = 0 then Exit;
  1444.   for I := 0 to ListView2.Items.Count-1 do
  1445.     if ListView2.Items[I].Selected then
  1446.       if ShellExecute(Handle, 'open', PChar(sTemporaryFolder+ListView2.Items[I].Caption), '', PChar(sTemporaryFolder), SW_SHOWNORMAL) <= 32 then begin
  1447.         GetSystemDirectory(A, MAX_PATH);
  1448.         S := A;
  1449.         S := MakeValidDirName(S)+'Viewers\Quikview.exe';
  1450.         ShellExecute(Handle, 'open', PChar(S), PChar(sTemporaryFolder+ListView2.Items[I].Caption), PChar(sTemporaryFolder), SW_SHOWNORMAL);
  1451.       end;
  1452. end;
  1453.  
  1454. procedure TMainForm.Saveas1Click(Sender: TObject);
  1455. var
  1456.   I: Integer;
  1457.   D: String;
  1458. begin
  1459.   if ListView2.SelCount = 0 then Exit;
  1460.   DirectoryForm := TDirectoryForm.Create(Self);
  1461.   if DirectoryExists(sLastAttSaveDir) then
  1462.     DirectoryForm.RzDirectoryListBox1.Directory := sLastAttSaveDir
  1463.   else
  1464.     DirectoryForm.RzDirectoryListBox1.Directory := ExtractFileDir(Application.Exename);
  1465.   if DirectoryForm.ShowModal = mrOK then begin
  1466.     D := MakeValidDirname(DirectoryForm.RzDirectoryListBox1.Directory);
  1467.     sLastAttSaveDir := D;
  1468.     for I := 0 to ListView2.Items.Count-1 do
  1469.       if ListView2.Items[I].Selected then begin
  1470.         SetFileAttr(sTemporaryFolder+ListView2.Items[I].Caption, False, True, False, False);
  1471.         if FileExists(D+ListView2.Items[I].Caption) then begin
  1472.           case MessageDlg(Format(ListBox1.Items[13], [ListView2.Items[I].Caption]), mtWarning, [mbYes, mbNo, mbCancel], 0) of
  1473.             mrYes: CopyFile(PChar(sTemporaryFolder+ListView2.Items[I].Caption), PChar(D+ListView2.Items[I].Caption), False);
  1474.             mrNo: ;//nothing
  1475.             mrCancel: Exit;
  1476.           end;
  1477.         end else
  1478.           CopyFile(PChar(sTemporaryFolder+ListView2.Items[I].Caption), PChar(D+ListView2.Items[I].Caption), False);
  1479.       end;
  1480.   end;
  1481.   DirectoryForm.Free;
  1482. end;
  1483.  
  1484. procedure TMainForm.AddAttachment(Filename: String);
  1485. var
  1486.   Item: TListItem;
  1487.   SHFileInfo: TSHFileInfo;
  1488. begin
  1489.   Item := ListView2.Items.Add;
  1490.   Item.Caption := ExtractFileName(Filename);
  1491.   SHGetFileInfo(PChar(Filename), 0, SHFileInfo, SizeOf(SHFileInfo), SHGFI_SYSICONINDEX or SHGFI_LARGEICON);
  1492.   Item.ImageIndex := SHFileInfo.iIcon;
  1493.   CopyFile(PChar(Filename), PChar(sTemporaryFolder+Item.Caption), False);
  1494.   SaveMessage := True;
  1495.   ActualizeStatusBar;
  1496. end;
  1497.  
  1498. procedure TMainForm.Add1Click(Sender: TObject);
  1499. var
  1500.   I: Integer;
  1501. begin
  1502.   if (ListView1.SelCount <> 1) or (ListView1.Selected = nil) then Exit;
  1503.   if DirectoryExists(sLastAttOpenDir) then
  1504.     OpenDialog1.InitialDir := sLastAttOpenDir
  1505.   else
  1506.     OpenDialog1.InitialDir := ExtractFileDir(Application.Exename);
  1507.   if OpenDialog1.Execute then begin
  1508.     sLastAttOpenDir := ExtractFileDir(OpenDialog1.Filename);
  1509.     for I := 0 to OpenDialog1.Files.Count-1 do begin
  1510.       AddAttachment(OpenDialog1.Files[I]);
  1511.     end;
  1512.   end;
  1513. end;
  1514.  
  1515. procedure TMainForm.Delete3Click(Sender: TObject);
  1516. var
  1517.   I: Integer;
  1518. label J;
  1519. begin
  1520.   if ListView2.SelCount = 0 then Exit;
  1521.   J:
  1522.   for I := 0 to ListView2.Items.Count-1 do
  1523.     if ListView2.Items[I].Selected then begin
  1524.       case MessageDlg(Format(ListBox1.Items[14], [ListView2.Items[I].Caption]), mtWarning, [mbYes, mbNo, mbCancel], 0) of
  1525.         mrYes: begin
  1526.           DeleteFile(PChar(sTemporaryFolder+ListView2.Items[I].Caption));
  1527.           ListView2.Items[I].Delete;
  1528.           SaveMessage := True;
  1529.           GoTo J;
  1530.         end;
  1531.         mrNo: ;//nothing
  1532.         mrCancel: Exit;
  1533.       end;
  1534.     end;
  1535.   ActualizeStatusBar
  1536. end;
  1537.  
  1538. procedure TMainForm.ToggleUnreadFlag1Click(Sender: TObject);
  1539. var
  1540.   Item: TListItem;
  1541.   I: Integer;
  1542. begin
  1543.   ReadCounter := 0;
  1544.   for I := 0 to ListView1.Items.Count-1 do
  1545.     if ListView1.Items[I].Selected then begin
  1546.       Item := ListView1.Items[I];
  1547.       if Item.ImageIndex = -1 then begin
  1548.         FileSetAttr(Item.SubItems[4], 0);
  1549.         if (LowerCase(CurrentEMail.Priority) = 'low') then Item.ImageIndex := 9;
  1550.         if (LowerCase(CurrentEMail.Priority) = 'normal') then Item.ImageIndex := 10;
  1551.         if (LowerCase(CurrentEMail.Priority) = 'high') then Item.ImageIndex := 11;
  1552.       end else begin
  1553.         Item.ImageIndex := -1;
  1554.         FileSetAttr(Item.SubItems[4], faArchive);
  1555.       end;
  1556.     end;
  1557.   SetPXTreeNodeName(TreeView1.Selected);
  1558.   ActualizeStatusBar;
  1559. end;
  1560.  
  1561. procedure TMainForm.Properties4Click(Sender: TObject);
  1562. var
  1563.   Item: TListItem;
  1564.   Node: TTreeNode;
  1565.   Outbox: Boolean;
  1566.   S: String;
  1567. begin
  1568.   if (ListView1.SelCount <> 1) or (ListView1.Selected = nil) then Exit;
  1569.   Item := ListView1.Selected;
  1570.   Node := TreeView1.Selected;
  1571.   if Node = nil then Exit;
  1572.   if Item = nil then Exit;
  1573.   Outbox := False;
  1574.   if Node.StateIndex = 2 then begin
  1575.     if PFolderData(Node.Data)^.OutBox then begin
  1576.       Outbox := True;
  1577.       MailOptionsForm.SetFields(0)
  1578.     end else
  1579.       MailOptionsForm.SetFields(1);
  1580.     Node := GetActualAccount;
  1581.   end else begin
  1582.     MailOptionsForm.SetFields(1);
  1583.   end;
  1584.   if Node = nil then Exit;
  1585.   S := GetPXTreeNodeName(Node);
  1586.   //MailOptionsForm.Label12.Caption := S;
  1587.   if MailOptionsForm.ShowModal = mrOK then begin
  1588.     Item.SubItems[0] := CurrentEMail.Subject;
  1589.     if OutBox then begin
  1590.       Item.SubItems[1] := GetCommataStringReceiver;
  1591.     end else
  1592.       Item.SubItems[1] := CurrentEMail.From;
  1593.     Item.SubItems[2] := DateToStr(CurrentEMail.ADate);
  1594.     Item.SubItems[3] := TimeToStr(CurrentEMail.ATime);
  1595.   end;
  1596. end;
  1597.  
  1598. procedure TMainForm.RichEdit1Change(Sender: TObject);
  1599. begin
  1600.   SaveMessage := True;
  1601. end;
  1602.  
  1603. procedure TMainForm.TreeView1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  1604. begin
  1605.   if Ord(Key) = 46 then Delete1Click(Self);
  1606. end;
  1607.  
  1608. procedure TMainForm.Delete4Click(Sender: TObject);
  1609. var
  1610.   Item: TListItem;
  1611.   S: String;
  1612.   I, E: Integer;
  1613. begin
  1614.   if ListView1.Selected = nil then Exit;
  1615.   I := 0; E := ListView1.Items.Count-1;
  1616.   while I <= E do begin
  1617.     if ListView1.Items[I].Selected then begin
  1618.       Item := ListView1.Items[I];
  1619.        S := Item.SubItems[4];
  1620.        SetFileAttr(S, False, True, False, False);
  1621.        if not (MakeValidDirName(ExtractFileDir(S)) = sTrashFolder) then
  1622.          CopyFile(PChar(S), PChar(sTrashFolder+ExtractFileName(S)), False);
  1623.       DeleteFile(S);
  1624.       Item.Delete;
  1625.       Dec(I); Dec(E);
  1626.     end;
  1627.     Inc(I);
  1628.   end;
  1629.   ListView1MouseUp(Self, mbLeft, [ssLeft], 0, 0);
  1630.   SetPXTreeNodeName(TreeView1.Selected);
  1631.   ActualizeStatusBar;
  1632.   ActualizeTrash;
  1633. end;
  1634.  
  1635. procedure TMainForm.UpdateListView;
  1636. var
  1637.   SearchRec: TSearchRec;
  1638.   Found: Integer;
  1639.   SHFileInfo: TSHFileInfo;
  1640.   Item: TListItem;
  1641.   ScanForVirus: Boolean;
  1642.   S: String;
  1643.   I: Integer;
  1644. begin
  1645.   Panel6.Visible := False;
  1646.   ReadCounter := 0;
  1647.   if SaveMessage then DoSaveMessage;
  1648.   RichEdit1.Lines.BeginUpdate;
  1649.   ListView2.Items.Clear;
  1650.   RichEdit1.Lines.Clear;
  1651.   ActualMailFile := '';
  1652.   ClearFolder(sTemporaryFolder);
  1653.   Item := ListView1.Selected;
  1654.   if (ListView1.SelCount > 1) or (Item = nil) or (csDestroying in ComponentState) then begin
  1655.     RichEdit1.Lines.EndUpdate;
  1656.     RichEdit1.Enabled := False;
  1657.     ListView2.Enabled := False;
  1658.     Exit;
  1659.   end;
  1660.   Screen.Cursor := crHourGlass;
  1661.   Application.ProcessMessages;
  1662.   RichEdit1.DefAttributes.Assign(DefaultFont);
  1663.   RichEdit1.SelAttributes.Assign(DefaultFont);
  1664.   CurrentEMail.ParseMail(Item.SubItems[4], False);
  1665.   ActualMailFile := Item.SubItems[4];
  1666.   ScanForVirus := False;
  1667.   if (FileGetAttr(Item.SubItems[4]) and faArchive) = 0 then
  1668.     ScanForVirus := True;
  1669.   //Text
  1670.   if FileExists(sTempMessageFile) then begin
  1671.     if CurrentEMail.MsgType = mtText then RichEdit1.Lines.LoadFromFile(sTempMessageFile) else
  1672.     if CurrentEMail.MsgType = mtHtml then RichEdit1.Lines.LoadFromFile(sTempMessageFile) else
  1673.     if CurrentEMail.MsgType = mtRich then RichEdit1.Lines.LoadFromFile(sTempMessageFile);
  1674.   end;
  1675.   //Attachments
  1676.   Found := FindFirst(sTemporaryFolder+'*.*', faReadOnly+faHidden+faArchive+faSysFile, SearchRec);
  1677.   while Found = 0 do begin
  1678.     if sTemporaryFolder+SearchRec.Name <> sTempMessageFile then begin
  1679.       Item := ListView2.Items.Add;
  1680.       Item.Caption := SearchRec.Name;
  1681.       SHGetFileInfo(PChar(sTemporaryFolder+SearchRec.Name), 0, SHFileInfo, SizeOf(SHFileInfo), SHGFI_SYSICONINDEX or SHGFI_LARGEICON);
  1682.       Item.ImageIndex := SHFileInfo.iIcon;
  1683.     end;
  1684.     Found := FindNext(SearchRec);
  1685.   end;
  1686.   FindClose(SearchRec);
  1687.   // Virus Scan
  1688.   if (ListView2.Items.Count > 0) and (sVirusProg <>'') and (ScanForVirus = True) then begin
  1689.     if bVirusMin then
  1690.       ShellExecute(Handle, 'open', PChar(sVirusProg), PChar(sTemporaryFolder+' '+sVirusParams), PChar(sTemporaryFolder), SW_MINIMIZE)
  1691.     else
  1692.       ShellExecute(Handle, 'open', PChar(sVirusProg), PChar(sTemporaryFolder+' '+sVirusParams), PChar(sTemporaryFolder), SW_SHOWNORMAL);
  1693.   end;
  1694.   //X-Mailer
  1695.   S := 'Unknown Mail Client';
  1696.   for I := 0 to CurrentEMail.Fields.Count-1 do
  1697.     if LowerCase(CurrentEMail.Fields[I]) = 'x-mailer' then
  1698.       S := CurrentEMail.FieldValues[I];
  1699.   Label3.Caption := S;
  1700.   Panel6.Width := Label3.Width+8;
  1701.   Panel6.Left := RichEdit1.Width-20-Panel6.Width;
  1702.   Panel6.Top := RichEdit1.Top+4;
  1703.   if CheckBox2.Checked then Panel6.Visible := True;
  1704.   //End
  1705.   RichEdit1.Lines.EndUpdate;
  1706.   RichEdit1.Enabled := True;
  1707.   ListView2.Enabled := True;
  1708.   SaveMessage := False;
  1709.   Screen.Cursor := crDefault;
  1710. end;
  1711.  
  1712. function TMainForm.NewMessage(ShowDlg, Signat: Boolean; ASubject, ATo, AFrom: String; NewText: TStringList): Boolean;
  1713. var
  1714.   Item: TListItem;
  1715.   Node, FNode: TTreeNode;
  1716.   S: String;
  1717.   Outbox: Boolean;
  1718.   I, E, Y: Integer;
  1719.   SL, NL: TStringList;
  1720.   P: TPoint;
  1721.  
  1722.   procedure GetSubNotes(Node: TTreeNode);
  1723.   var
  1724.     I: Integer;
  1725.   begin
  1726.     for I := 0 to Node.Count-1 do begin
  1727.       if PFolderData(Node.Item[I].Data)^.Outbox then
  1728.         FNode := Node.Item[I];
  1729.       if Node.Count > 0 then GetSubNotes(Node.Item[I]);
  1730.     end;
  1731.   end;
  1732.  
  1733. begin
  1734.   Result := False;
  1735.   // get outbox folder
  1736.   Node := GetActualAccount;
  1737.   if Node = nil then Exit;
  1738.   FNode := nil;
  1739.   GetSubNotes(Node);
  1740.   // clear up
  1741.   if SaveMessage then DoSaveMessage;
  1742.   ClearFolder(sTemporaryFolder);
  1743.   with CurrentEMail do begin
  1744.     ToReceiver.Clear;
  1745.     if ATo <> '' then CommataStringToStringList(ATo, ToReceiver);
  1746.     CC.Clear;
  1747.     BCC.Clear;
  1748.     Fields.Clear;
  1749.     FieldValues.Clear;
  1750.     if AFrom = '' then
  1751.       From := PAccountData(Node.Data)^.FromDesc+' <'+PAccountData(Node.Data)^.FromMail+'>'
  1752.     else
  1753.       From := AFrom;
  1754.     Priority := 'Normal';
  1755.     Subject := ASubject;
  1756.     Keywords := '';
  1757.     ADate := Date;
  1758.     ATime := Time;
  1759.     if PAccountData(Node.Data)^.Organization <> '' then begin
  1760.       Fields.Add('Organization');
  1761.       FieldValues.Add(PAccountData(Node.Data)^.Organization);
  1762.     end;
  1763.     if AFrom = '' then
  1764.       if PAccountData(Node.Data)^.ReplyMail <> '' then begin
  1765.         Fields.Add('Reply-to');
  1766.         FieldValues.Add(PAccountData(Node.Data)^.ReplyDesc+' <'+PAccountData(Node.Data)^.ReplyMail+'>');
  1767.       end;
  1768.     Fields.Add('X-mailer');
  1769.     FieldValues.Add(sXMailer);
  1770.   end;
  1771.   // get outbox path
  1772.   Outbox := False;
  1773.   if FNode = nil then
  1774.     S := PAccountData(Node.Data)^.Path
  1775.   else begin
  1776.     S := PFolderData(FNode.Data)^.Path;
  1777.     Outbox := PFolderData(FNode.Data)^.Outbox;
  1778.   end;
  1779.   S := S + GetUniqueMailName + '.msg';
  1780.   // prepare dialog
  1781.   MailOptionsForm.SetFields(0);
  1782.   MailOptionsForm.LoadMailHeader;
  1783.   //show dialog?
  1784.   if ShowDlg then begin
  1785.     if MailOptionsForm.ShowModal <> mrOK then begin
  1786.       SaveMessage := False;
  1787.       UpdateListView;
  1788.       SaveMessage := False;
  1789.       Screen.Cursor := crDefault;
  1790.       Exit;
  1791.     end;
  1792.   end;
  1793.   Screen.Cursor := crHourGlass;
  1794.   // switch to outbox folder
  1795.   SaveMessage := False;
  1796.   for I := 0 to ListView1.Items.Count-1 do
  1797.     ListView1.Items[I].Selected := False;
  1798.   SaveMessage := False;
  1799.   TreeView1.Selected := FNode;
  1800.   // get mailheader again
  1801.   MailOptionsForm.SaveMailHeader;
  1802.   // add listview item
  1803.   Item := ListView1.Items.Add;
  1804.   Item.ImageIndex := -1;
  1805.   Item.SubItems.Add(CurrentEMail.Subject);
  1806.   if OutBox then begin
  1807.     Item.SubItems.Add(GetCommataStringReceiver);
  1808.   end else
  1809.     Item.SubItems.Add(CurrentEMail.From);
  1810.   Item.SubItems.Add(DateToStr(CurrentEMail.ADate));
  1811.   Item.SubItems.Add(TimeToStr(CurrentEMail.ATime));
  1812.   Item.SubItems.Add(S);  // invisible
  1813.   // clear message display
  1814.   ListView2.Items.Clear;
  1815.   RichEdit1.Lines.Clear;
  1816.   //New text
  1817.   SL := TStringList.Create;
  1818.   NL := TStringList.Create;
  1819.   if NewText <> nil then SL.Assign(NewText);
  1820.   E := 0;
  1821.   //Signature
  1822.   if Signat then begin
  1823.     if FileExists(PAccountData(Node.Data)^.Path+'signat.txt') then begin
  1824.       NL.LoadFromFile(PAccountData(Node.Data)^.Path+'signat.txt');
  1825.       for I := 0 to SL.Count-1 do
  1826.         E := E + Length(SL.Strings[I]) + 2;
  1827.       SL.Add('');
  1828.       SL.Add('');
  1829.       for I := 0 to NL.Count-1 do
  1830.         SL.Add(NL.Strings[I]);
  1831.     end;
  1832.   end;
  1833.   SL.SaveToFile(sTempMessageFile);
  1834.   SL.Free;
  1835.   NL.Free;
  1836.   // create message file
  1837.   ActualMailFile := S;
  1838.   CurrentEMail.CompileMsgFileOnDisk(ActualMailFile);
  1839.   SaveMessage := False;
  1840.   // set actual item
  1841.   ListView1.Selected := Item;
  1842.   Item := ListView1.GetItemAt(2, 20);
  1843.   // Logo
  1844.   if Assigned(Item) then begin
  1845.     P := ListView1.Selected.GetPosition;
  1846.     Y := P.Y;
  1847.     P := Item.GetPosition;
  1848.     ListView1.Scroll(0, -(P.Y - Y));
  1849.   end;
  1850.   // Logo
  1851.   SaveMessage := False;
  1852.   UpdateListView;
  1853.   SaveMessage := False;
  1854.   RichEdit1.SetFocus;
  1855.   RichEdit1.SelStart := E;
  1856.   Screen.Cursor := crDefault;
  1857.   Result := True;
  1858. end;
  1859.  
  1860. procedure TMainForm.New3Click(Sender: TObject);
  1861. begin
  1862.   NewMessage2.Enabled := False;
  1863.   if MailOptionsForm.Visible = False then
  1864.     NewMessage(True, True, '', '', '', nil);
  1865.   NewMessage2.Enabled := True;
  1866. end;
  1867.  
  1868. procedure TMainForm.Replay1Click(Sender: TObject);
  1869. var
  1870.   S, T: String;
  1871.   K: Integer;
  1872. begin
  1873.   if (ListView1.SelCount <> 1) or (ListView1.Selected = nil) then Exit;
  1874.   S := '';
  1875.   for K := 0 to CurrentEMail.Fields.Count-1 do
  1876.     if LowerCase(CurrentEMail.Fields.Strings[K]) = 'reply-to' then begin
  1877.       S := CurrentEMail.FieldValues.Strings[K];
  1878.       Break;
  1879.     end;
  1880.   if ExtractEMailAddress(S) = '' then S := CurrentEMail.From;
  1881.   if Pos(UpperCase(ListBox1.Items[15]), UpperCase(CurrentEMail.Subject)) <> 1 then
  1882.     T := ListBox1.Items[15]+' '+CurrentEMail.Subject else T := CurrentEMail.Subject;
  1883.   NewMessage(False, True, T, S, '', nil);
  1884. end;
  1885.  
  1886. procedure TMainForm.ReplayQuoted1Click(Sender: TObject);
  1887. var
  1888.   S, T, U: String;
  1889.   SL: TStringList;
  1890.   I, K: Integer;
  1891. begin
  1892.   if (ListView1.SelCount <> 1) or (ListView1.Selected = nil) then Exit;
  1893.   SL := TStringList.Create;
  1894.   for I := 0 to RichEdit1.Lines.Count-1 do
  1895.     SL.Add(SoftLineBreak(RichEdit1.Lines[I], True));
  1896.   S := '';
  1897.   for K := 0 to CurrentEMail.Fields.Count-1 do
  1898.     if LowerCase(CurrentEMail.Fields.Strings[K]) = 'reply-to' then begin
  1899.       S := CurrentEMail.FieldValues.Strings[K];
  1900.       Break;
  1901.     end;
  1902.   if ExtractEMailAddress(S) = '' then S := CurrentEMail.From;
  1903.   SL.Insert(0, '');
  1904.   U := DateToStr(CurrentEMail.ADate)+' '+TimeToStr(CurrentEMail.ATime);
  1905.   if SkipSpacesAtEnd(ExtractEMailName(CurrentEMail.From)) = '' then
  1906.     T := Format(ListBox1.Items[16], [U])
  1907.   else
  1908.     T := Format(ListBox1.Items[17], [SkipSpacesAtEnd(ExtractEMailName(CurrentEMail.From)), U]);
  1909.   SL.Insert(0, T);
  1910.   SL.Add('');
  1911.   if Pos(UpperCase(ListBox1.Items[15]), UpperCase(CurrentEMail.Subject)) <> 1 then
  1912.     T := ListBox1.Items[15]+' '+CurrentEMail.Subject else T := CurrentEMail.Subject;
  1913.   NewMessage(False, True, T, S, '', SL);
  1914.   SL.Free;
  1915. end;
  1916.  
  1917. procedure TMainForm.PopupMenu4Popup(Sender: TObject);
  1918. begin
  1919.   if RichEdit1.Enabled = False then begin
  1920.     Cut1.Enabled := False;
  1921.     Copy1.Enabled := False;
  1922.     Delete5.Enabled := False;
  1923.     Cut2.Enabled := False;
  1924.     Copy2.Enabled := False;
  1925.     Delete6.Enabled := False;
  1926.     SelectAll1.Enabled := False;
  1927.     SelectAll2.Enabled := False;
  1928.     Paste1.Enabled := False;
  1929.     Paste2.Enabled := False;
  1930.     Exit;
  1931.   end;
  1932.   if RichEdit1.SelLength > 0 then begin
  1933.     Cut1.Enabled := True;
  1934.     Copy1.Enabled := True;
  1935.     Delete5.Enabled := True;
  1936.     Cut2.Enabled := True;
  1937.     Copy2.Enabled := True;
  1938.     Delete6.Enabled := True;
  1939.   end else begin
  1940.     Cut1.Enabled := False;
  1941.     Copy1.Enabled := False;
  1942.     Delete5.Enabled := False;
  1943.     Cut2.Enabled := False;
  1944.     Copy2.Enabled := False;
  1945.     Delete6.Enabled := False;
  1946.   end;
  1947.   if (RichEdit1.Lines.Count = 1) and (Length(RichEdit1.Lines[0]) > 0) then begin
  1948.     SelectAll1.Enabled := True;
  1949.     SelectAll2.Enabled := True;
  1950.   end else begin
  1951.     SelectAll1.Enabled := False;
  1952.     SelectAll2.Enabled := False;
  1953.   end;
  1954.   if RichEdit1.Lines.Count > 1 then begin
  1955.     SelectAll1.Enabled := True;
  1956.     SelectAll2.Enabled := True;
  1957.   end;
  1958.   Paste1.Enabled := False;
  1959.   Paste2.Enabled := False;
  1960.   if ClipBoard.HasFormat(CF_TEXT) then
  1961.     if ClipBoard.AsText <> '' then begin
  1962.       Paste1.Enabled := True;
  1963.       Paste2.Enabled := True;
  1964.     end;
  1965. end;
  1966.  
  1967. procedure TMainForm.Delete5Click(Sender: TObject);
  1968. begin
  1969.   RichEdit1.ClearSelection;
  1970. end;
  1971.  
  1972. procedure TMainForm.Copy1Click(Sender: TObject);
  1973. begin
  1974.   RichEdit1.CopyToClipboard;
  1975. end;
  1976.  
  1977. procedure TMainForm.Paste1Click(Sender: TObject);
  1978. begin
  1979.   RichEdit1.PasteFromClipboard;
  1980. end;
  1981.  
  1982. procedure TMainForm.Cut1Click(Sender: TObject);
  1983. begin
  1984.   RichEdit1.CutToClipboard;
  1985. end;
  1986.  
  1987. procedure TMainForm.SelectAll1Click(Sender: TObject);
  1988. begin
  1989.   RichEdit1.SelectAll;
  1990. end;
  1991.  
  1992. procedure TMainForm.SendMails1Click(Sender: TObject);
  1993. begin
  1994.   OnlineSession(2);
  1995. end;
  1996.  
  1997. procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
  1998. begin
  1999.   if SaveMessage then DoSaveMessage;
  2000. end;
  2001.  
  2002. procedure TMainForm.ListView2KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  2003. begin
  2004.   if Ord(Key) = 46 then Delete3Click(Self);
  2005. end;
  2006.  
  2007. procedure TMainForm.GoOnline1Click(Sender: TObject);
  2008. begin
  2009.   OnlineSession(3);
  2010. end;
  2011.  
  2012. procedure TMainForm.EnvironmentOptions1Click(Sender: TObject);
  2013. begin
  2014.   Modal1.Enabled := False;
  2015.   EnviroForm := TEnviroForm.Create(Self);
  2016.   EnviroForm.ShowModal;
  2017.   EnviroForm.Free;
  2018.   Modal1.Enabled := True;
  2019. end;
  2020.  
  2021. procedure TMainForm.AboutPhoenix1Click(Sender: TObject);
  2022. begin
  2023.   InfoForm := TInfoForm.Create(Self);
  2024.   InfoForm.ShowModal;
  2025.   Infoform.Free;
  2026. end;
  2027.  
  2028. procedure TMainForm.TipoftheDay1Click(Sender: TObject);
  2029. begin
  2030.   TipsForm := TTipsForm.Create(Self);
  2031.   TipsForm.ShowModal;
  2032.   TipsForm.Free;
  2033. end;
  2034.  
  2035. procedure TMainForm.SetAccountMenusEnabled(OnlyFalse: Boolean);
  2036. begin
  2037.   ActualizeStatusBar;
  2038.   if (GetActualAccount = nil) or (AreWeOnline) then begin
  2039.     FetchSendMails1.Enabled := False;
  2040.     GoOnline1.Enabled := False;
  2041.     SendMail1.Enabled := False;
  2042.     FetchMails1.Enabled := False;
  2043.     SpeedButton4.Enabled := False;
  2044.     SpeedButton5.Enabled := False;
  2045.     SpeedButton6.Enabled := False;
  2046.     FetchMail1.Enabled := False;
  2047.     SendMail2.Enabled := False;
  2048.   end;
  2049.   if GetActualAccount = nil then begin
  2050.     Edit1.Enabled := False;
  2051.     Folder1.Enabled := False;
  2052.     DeleteAccount1.Enabled := False;
  2053.     Delete2.Enabled := False;
  2054.     New3.Enabled := False;
  2055.     NewMessage1.Enabled := False;
  2056.     SpeedButton3.Enabled := False;
  2057.   end else begin
  2058.     if OnlyFalse then Exit;
  2059.     Delete2.Enabled := True;
  2060.     Edit1.Enabled := True;
  2061.     Folder1.Enabled := True;
  2062.     DeleteAccount1.Enabled := True;
  2063.     SpeedButton3.Enabled := True;
  2064.     if AreWeOnline = False then begin
  2065.       SpeedButton4.Enabled := True;
  2066.       SpeedButton5.Enabled := True;
  2067.       SpeedButton6.Enabled := True;
  2068.       GoOnline1.Enabled := True;
  2069.       FetchMail1.Enabled := True;
  2070.       SendMail2.Enabled := True;
  2071.       SendMail1.Enabled := True;
  2072.       FetchMails1.Enabled := True;
  2073.       FetchSendMails1.Enabled := True;
  2074.     end;
  2075.     New3.Enabled := True;
  2076.     NewMessage1.Enabled := True;
  2077.   end;
  2078. end;
  2079.  
  2080. procedure TMainForm.SetMessageMenusEnabled;
  2081. begin
  2082.   if ListView1.Selected = nil then begin
  2083.     SpeedButton9.Enabled := False;
  2084.     Delete4.Enabled := False;
  2085.     ToggleUnreadFlag1.Enabled := False;
  2086.     DeleteMessage1.Enabled := False;
  2087.     ToggleReadUnreadFlag1.Enabled := False;
  2088.     AddtoAdressbook1.Enabled := False;
  2089.     AddtoAdressbook2.Enabled := False;
  2090.     SpeedButton13.Enabled := False;
  2091.   end else begin
  2092.     SpeedButton9.Enabled := True;
  2093.     Delete4.Enabled := True;
  2094.     ToggleUnreadFlag1.Enabled := True;
  2095.     DeleteMessage1.Enabled := True;
  2096.     ToggleReadUnreadFlag1.Enabled := True;
  2097.     AddtoAdressbook1.Enabled := True;
  2098.     AddtoAdressbook2.Enabled := True;
  2099.     SpeedButton13.Enabled := True;
  2100.   end;
  2101.   if ListView1.Items.Count > 0 then begin
  2102.     SelectAllMessages1.Enabled := True;
  2103.     SelectAllMessages2.Enabled := True;
  2104.     SearchMessage1.Enabled := True;
  2105.     SpeedButton15.Enabled := True;
  2106.   end else begin
  2107.     SelectAllMessages1.Enabled := False;
  2108.     SelectAllMessages2.Enabled := False;
  2109.     SearchMessage1.Enabled := False;
  2110.     SpeedButton15.Enabled := False;
  2111.   end;
  2112.   if (ListView1.SelCount = 1) and (ListView1.Selected <> nil) then begin
  2113.     if GetActualAccount <> nil then begin
  2114.       SpeedButton2.Enabled := True;
  2115.       Replay1.Enabled := True;
  2116.       ReplayQuoted1.Enabled := True;
  2117.       Replay2.Enabled := True;
  2118.       ReplayQuoted2.Enabled := True;
  2119.       SpellCheck1.Enabled := True;
  2120.       SpeedButton10.Enabled := True;
  2121.       Forward1.Enabled := True;
  2122.       SpeedButton14.Enabled := True;
  2123.       Redirect1.Enabled := True;
  2124.       SpeedButton16.Enabled := True;
  2125.       Forward2.Enabled := True;
  2126.       Redirect2.Enabled := True;
  2127.       ASpeedButton1.Enabled := True;
  2128.       SpeedButton11.Enabled := True;
  2129.     end;
  2130.     if XPrint1.PrinterAvailable then begin
  2131.       Print1.Enabled := True;
  2132.       SpeedButton17.Enabled := True;
  2133.     end;
  2134.     Properties4.Enabled := True;
  2135.     Properties5.Enabled := True;
  2136.     AddFile1.Enabled := True;
  2137.     Add1.Enabled := True;
  2138.   end else begin
  2139.     SpeedButton2.Enabled := False;
  2140.     Properties4.Enabled := False;
  2141.     Replay1.Enabled := False;
  2142.     ReplayQuoted1.Enabled := False;
  2143.     Forward1.Enabled := False;
  2144.     SpeedButton14.Enabled := False;
  2145.     Redirect1.Enabled := False;
  2146.     SpeedButton16.Enabled := False;
  2147.     SpellCheck1.Enabled := False;
  2148.     Forward2.Enabled := False;
  2149.     Redirect2.Enabled := False;
  2150.     SpeedButton10.Enabled := False;
  2151.     Properties5.Enabled := False;
  2152.     Replay2.Enabled := False;
  2153.     ReplayQuoted2.Enabled := False;
  2154.     Print1.Enabled := False;
  2155.     SpeedButton17.Enabled := False;
  2156.     AddFile1.Enabled := False;
  2157.     Add1.Enabled := False;
  2158.     ASpeedButton1.Enabled := False;
  2159.     SpeedButton11.Enabled := False;
  2160.   end;
  2161.   if (ListView1.SelCount = 1) and (ListView1.Selected <> nil) and (ListView2.SelCount = 1) then begin
  2162.     SaveAs2.Enabled := True;
  2163.     SaveAs3.Enabled := True;
  2164.   end else begin
  2165.     SaveAs2.Enabled := False;
  2166.     SaveAs3.Enabled := False;
  2167.   end;
  2168.   if (ListView1.SelCount = 1) and (ListView1.Selected <> nil) and (ListView2.SelCount > 0) then begin
  2169.     Open2.Enabled := True;
  2170.     Save1.Enabled := True;
  2171.     DeleteFile1.Enabled := True;
  2172.     Open1.Enabled := True;
  2173.     QuickView1.Enabled := True;
  2174.     QuickView2.Enabled := True;
  2175.     Saveas1.Enabled := True;
  2176.     Delete3.Enabled := True;
  2177.   end else begin
  2178.     Open2.Enabled := False;
  2179.     Save1.Enabled := False;
  2180.     DeleteFile1.Enabled := False;
  2181.     Open1.Enabled := False;
  2182.     QuickView1.Enabled := False;
  2183.     QuickView2.Enabled := False;
  2184.     Saveas1.Enabled := False;
  2185.     Delete3.Enabled := False;
  2186.   end;
  2187.   if AreWeOnline then begin
  2188.     CancelOnlineOperation1.Enabled := True;
  2189.     SpeedButton12.Enabled := True;
  2190.   end else begin
  2191.     CancelOnlineOperation1.Enabled := False;
  2192.     SpeedButton12.Enabled := False;
  2193.   end;
  2194.   SetAccountMenusEnabled(True);
  2195. end;
  2196.  
  2197. procedure TMainForm.ListView1Change(Sender: TObject; Item: TListItem; Change: TItemChange);
  2198. begin
  2199.   if csDestroying in ComponentState then Exit;
  2200.   SetMessageMenusEnabled;
  2201. end;
  2202.  
  2203. procedure TMainForm.SpeedButton2Click(Sender: TObject);
  2204. var
  2205.   P: TPoint;
  2206. begin
  2207.   P := SpeedButton2.ClientToScreen(Point(0, SpeedButton2.Height));
  2208.   if SpeedButton2.Enabled then PopUpMenu5.Popup(P.X, P.Y);
  2209. end;
  2210.  
  2211. procedure TMainForm.SpeedButton7Click(Sender: TObject);
  2212. begin
  2213.   ShowPhoenixMail1Click(Self);
  2214.   AddressBook2.Enabled := False;
  2215.   if AddressForm.ShowModal = mrOK then begin
  2216.     NewMessage(True, True, '', AddressForm.GetSelAddresses, '', nil);
  2217.   end;
  2218.   AddressBook2.Enabled := True;
  2219. end;
  2220.  
  2221. procedure TMainForm.Print1Click(Sender: TObject);
  2222. var
  2223.   I, E, CurPixel: Integer;
  2224.   R: TRect;
  2225.   D, T: TDateTime;
  2226. begin
  2227.   if ListView1.Selected = nil then Exit;
  2228.   if XPrint1.PrinterAvailable = False then begin
  2229.     MessageDlg(ListBox1.Items[18], mtError, [mbOk], 0);
  2230.     Exit;
  2231.   end;
  2232.   if XPrint1.Printing then begin
  2233.     MessageDlg(ListBox1.Items[19], mtError, [mbOk], 0);
  2234.     Exit;
  2235.   end;
  2236.   if PrintDialog1.Execute = False then begin
  2237.     Exit;
  2238.   end;
  2239.   XPrint1.BeginDoc;
  2240.   with XPrint1.Canvas do begin
  2241.     // Header bold font
  2242.     Font.Name := 'Arial';
  2243.     Font.Pitch := fpDefault;
  2244.     Font.Style := [fsBold];
  2245.     XPrint1.SetFontSize(10);
  2246.     I := TextHeight('Test gYpQMHJ') div 2; // Linespace
  2247.     E := TextWidth('Subject:Mh');           // Longest Width
  2248.     TextOut(200, I*3, ListBox1.Items[20]);
  2249.     TextOut(200, I*5, ListBox1.Items[21]);
  2250.     TextOut(200, I*7, ListBox1.Items[22]);
  2251.     TextOut(200, I*9, ListBox1.Items[23]);
  2252.     // Header fields normal font
  2253.     Font.Name := 'Arial';
  2254.     Font.Pitch := fpDefault;
  2255.     Font.Style := [];
  2256.     D := Date;
  2257.     T := Time;
  2258.     TextOut(200, 0, 'Phoenix Mail  '+DateToStr(D)+'  '+TimeToStr(T));
  2259.     R := Bounds(0, 0, XPrint1.PrintWidth, XPrint1.PrintHeight);
  2260.     DrawText(Handle, PChar(ListBox1.Items[24]+' '+IntToStr(XPrint1.PageNumber)+' '), -1, R, DT_RIGHT);
  2261.     TextOut(E, I*3, CurrentEMail.Subject);
  2262.     TextOut(E, I*5, CurrentEMail.From);
  2263.     TextOut(E, I*7, StringListToCommataString(CurrentEMail.ToReceiver, False));
  2264.     TextOut(E, I*9, DateToStr(CurrentEMail.ADate)+'  '+TimeToStr(CurrentEMail.ATime));
  2265.     // Border
  2266.     MoveTo(0, I*2);
  2267.     LineTo(XPrint1.PrintWidth, I*2);
  2268.     MoveTo(0, 0);
  2269.     LineTo(XPrint1.PrintWidth, 0);
  2270.     LineTo(XPrint1.PrintWidth, I*12);
  2271.     LineTo(0, I*12);
  2272.     LineTo(0,0);
  2273.     CurPixel := I*15;
  2274.     // RichEditText
  2275.     for E := 0 to RichEdit1.Lines.Count-1 do begin
  2276.       R := Bounds(0, CurPixel, XPrint1.PrintWidth, XPrint1.PrintHeight);
  2277.       CurPixel := CurPixel+DrawText(Handle, PChar(RichEdit1.Lines[E]), -1, R, DT_CALCRECT or DT_LEFT or DT_WORDBREAK);
  2278.       if RichEdit1.Lines[E] = '' then CurPixel := Curpixel+I*2; // Empty line?
  2279.       if CurPixel >= XPrint1.PrintHeight then begin
  2280.         // New Page
  2281.         XPrint1.NewPage;
  2282.         TextOut(200, 0, 'Phoenix Mail  '+DateToStr(Date)+'  '+TimeToStr(Time));
  2283.         R := Bounds(0, 0, XPrint1.PrintWidth, XPrint1.PrintHeight);
  2284.         DrawText(Handle, PChar(ListBox1.Items[24]+' '+IntToStr(XPrint1.PageNumber)+' '), -1, R, DT_RIGHT);
  2285.         MoveTo(0, 0);
  2286.         LineTo(XPrint1.PrintWidth, 0);
  2287.         LineTo(XPrint1.PrintWidth, I*2);
  2288.         LineTo(0, I*2);
  2289.         LineTo(0,0);
  2290.         CurPixel := I*5;
  2291.         R := Bounds(0, CurPixel, XPrint1.PrintWidth, XPrint1.PrintHeight);
  2292.       end;
  2293.       DrawText(Handle, PChar(RichEdit1.Lines[E]), -1, R, DT_LEFT or DT_WORDBREAK);
  2294.     end;
  2295.     // Have a nice day
  2296.     if bFriendlyPrinter then begin
  2297.       MoveTo(0, CurPixel+I*3);
  2298.       LineTo(XPrint1.PrintWidth, CurPixel+I*3);
  2299.       TextOut(0, CurPixel+I*4, ListBox1.Items[25]);
  2300.     end;
  2301.   end;
  2302.   XPrint1.EndDoc;
  2303. end;
  2304.  
  2305. procedure TMainForm.PrinterSetup1Click(Sender: TObject);
  2306. begin
  2307.   if XPrint1.PrinterAvailable = False then begin
  2308.     MessageDlg(ListBox1.Items[18], mtError, [mbOk], 0);
  2309.     Exit;
  2310.   end;
  2311.   PrinterSetupDialog1.Execute;
  2312. end;
  2313.  
  2314. procedure TMainForm.ActualizeStatusBar;
  2315. var
  2316.   Node: TTreeNode;
  2317.   I, E: Integer;
  2318. begin
  2319.   Node := GetActualAccount;
  2320.   if Node = nil then
  2321.     StatusBar1.Panels[0].Text := ListBox1.Items[26]
  2322.   else
  2323.     StatusBar1.Panels[0].Text := GetPXTreeNodeName(Node);//Format(ListBox1.Items[27], [Node.Text]);
  2324.   E := 0;
  2325.   for I := 0 to ListView1.Items.Count-1 do
  2326.     if ListView1.Items[I].ImageIndex <> -1 then Inc(E);
  2327.   StatusBar1.Panels[1].Text := Format(ListBox1.Items[28], [IntToStr(E), IntToStr(ListView1.Items.Count)]);
  2328.   //StatusBar1.Panels[2].Text := Format(ListBox1.Items[29], [IntToStr(ListView2.Items.Count)]);
  2329. end;
  2330.  
  2331. procedure TMainForm.Image1Click(Sender: TObject);
  2332. begin
  2333.   ShellExecute(Handle, 'open', PChar(sHomepage), '', '', SW_SHOWNORMAL);
  2334. end;
  2335.  
  2336. procedure TMainForm.Signature1Click(Sender: TObject);
  2337. var
  2338.   G: Integer;
  2339. begin
  2340.   SignatureForm := TSignatureForm.Create(Self);
  2341.   if (ListView1.SelCount = 1) and (ListView1.Selected <> nil) then begin
  2342.     SignatureForm.CanAttach := True;
  2343.   end else begin
  2344.     SignatureForm.Button4.Visible := False;
  2345.     SignatureForm.Button3.Default := True;
  2346.     SignatureForm.CanAttach := False;
  2347.   end;
  2348.   if SignatureForm.ShowModal = mrOK then begin
  2349.     for G := 0 to SignatureForm.Memo1.Lines.Count-1 do
  2350.       RichEdit1.Lines.Add(SignatureForm.Memo1.Lines[G]);
  2351.   end;
  2352.   SignatureForm.Free;
  2353. end;
  2354.  
  2355. procedure TMainForm.Forward1Click(Sender: TObject);
  2356. var
  2357.   SL: TStringList;
  2358.   T: String;
  2359. begin
  2360.   if (ListView1.SelCount <> 1) or (ListView1.Selected = nil) then Exit;
  2361.   SL := TStringList.Create;
  2362.   SL.Assign(RichEdit1.Lines);
  2363.   SL.Insert(0, '>'+ListBox1.Items[30]);
  2364.   SL.Insert(1, '>');
  2365.   SL.Insert(2, '>'+ListBox1.Items[21]+' '+CurrentEMail.From);
  2366.   SL.Insert(3, '>'+ListBox1.Items[22]+' '+StringListToCommataString(CurrentEMail.ToReceiver, False));
  2367.   SL.Insert(4, '>'+ListBox1.Items[23]+' '+DateToStr(CurrentEMail.ADate)+'  '+TimeToStr(CurrentEMail.ATime));
  2368.   SL.Insert(5, '>'+ListBox1.Items[20]+' '+CurrentEMail.Subject);
  2369.   SL.Insert(6, '');
  2370.   BackupAttachments;
  2371.   if Pos(UpperCase(ListBox1.Items[31]), UpperCase(CurrentEMail.Subject)) <> 1 then
  2372.     T := ListBox1.Items[31]+' '+CurrentEMail.Subject else T := CurrentEMail.Subject;
  2373.   if NewMessage(True, False, T, '', CurrentEMail.From, SL) then begin
  2374.     RestoreAttachments;
  2375.   end;
  2376.   SL.Free;
  2377. end;
  2378.  
  2379. procedure TMainForm.Redirect1Click(Sender: TObject);
  2380. var
  2381.   SL: TStringList;
  2382.   T: String;
  2383. begin
  2384.   if (ListView1.SelCount <> 1) or (ListView1.Selected = nil) then Exit;
  2385.   SL := TStringList.Create;
  2386.   SL.Assign(RichEdit1.Lines);
  2387.   SL.Insert(0, '>'+ListBox1.Items[32]);
  2388.   SL.Insert(1, '>');
  2389.   SL.Insert(2, '>'+ListBox1.Items[21]+' '+CurrentEMail.From);
  2390.   SL.Insert(3, '>'+ListBox1.Items[22]+' '+StringListToCommataString(CurrentEMail.ToReceiver, False));
  2391.   SL.Insert(4, '>'+ListBox1.Items[23]+' '+DateToStr(CurrentEMail.ADate)+'  '+TimeToStr(CurrentEMail.ATime));
  2392.   SL.Insert(5, '>'+ListBox1.Items[20]+' '+CurrentEMail.Subject);
  2393.   SL.Insert(6, '');
  2394.   BackupAttachments;
  2395.   if Pos(UpperCase(ListBox1.Items[33]), UpperCase(CurrentEMail.Subject)) <> 1 then
  2396.     T := ListBox1.Items[33]+' '+CurrentEMail.Subject else T := CurrentEMail.Subject;
  2397.   if NewMessage(False, False, T, CurrentEMail.From, '', SL) then begin
  2398.     RestoreAttachments;
  2399.   end;
  2400.   SL.Free;
  2401. end;
  2402.  
  2403. procedure TMainForm.ListView1MouseUp(Sender: TObject; Button: TMouseButton;
  2404.   Shift: TShiftState; X, Y: Integer);
  2405. begin
  2406.   if csDestroying in ComponentState then Exit;
  2407.   if ListView1.SelCount = 1 then
  2408.     if ListView1.Selected <> nil then
  2409.       if ListView1.Selected.SubItems[4] = ActualMailFile then
  2410.         Exit;
  2411.   UpdateListView;
  2412.   ActualizeStatusBar;
  2413. end;
  2414.  
  2415. procedure TMainForm.BackupAttachments;
  2416. var
  2417.   I: Integer;
  2418.   A, B: array[0..MAX_PATH-1] of Char;
  2419.   S: String;
  2420. begin
  2421.   BKAttachments1.Clear;
  2422.   BKAttachments2.Clear;
  2423.   for I := 0 to ListView2.Items.Count-1 do begin
  2424.     BKAttachments1.Add(sTemporaryFolder+ListView2.Items[I].Caption);
  2425.     GetTempPath(MAX_PATH, @A);
  2426.     GetTempFileName(@A, 'PXA', 0, @B);
  2427.     S := B;
  2428.     BKAttachments2.Add(S);
  2429.     SetFileAttr(BKAttachments1.Strings[I], False, True, False, False);
  2430.     CopyFile(PChar(BKAttachments1.Strings[I]), PChar(BKAttachments2.Strings[I]), False);
  2431.   end;
  2432. end;
  2433.  
  2434. procedure TMainForm.RestoreAttachments;
  2435. var
  2436.   I: Integer;
  2437.   Item: TListItem;
  2438.   SHFileInfo: TSHFileInfo;
  2439. begin
  2440.    for I := 0 to BKAttachments1.Count-1 do begin
  2441.     CopyFile(PChar(BKAttachments2.Strings[I]), PChar(BKAttachments1.Strings[I]), False);
  2442.     DeleteFile(PChar(BKAttachments2.Strings[I]));
  2443.     Item := ListView2.Items.Add;
  2444.     Item.Caption := ExtractFileName(BKAttachments1.Strings[I]);
  2445.     SHGetFileInfo(PChar(BKAttachments1.Strings[I]), 0, SHFileInfo, SizeOf(SHFileInfo), SHGFI_SYSICONINDEX or SHGFI_LARGEICON);
  2446.     Item.ImageIndex := SHFileInfo.iIcon;
  2447.   end;
  2448.   BKAttachments1.Clear;
  2449.   BKAttachments2.Clear;
  2450. end;
  2451.  
  2452. procedure TMainForm.PopupMenu2Popup(Sender: TObject);
  2453. begin
  2454.   SetMessageMenusEnabled;
  2455. end;
  2456.  
  2457. procedure TMainForm.ListView1KeyUp(Sender: TObject; var Key: Word;
  2458.   Shift: TShiftState);
  2459. begin
  2460.   if Ord(Key) = 46 then Delete4Click(Self);
  2461.   if Ord(Key) in [40,38] then ListView1MouseUp(Self, mbLeft, [ssLeft], 0, 0);
  2462. end;
  2463.  
  2464. procedure TMainForm.Timer1Timer(Sender: TObject);
  2465. begin
  2466.   if csDestroying in ComponentState then Exit;
  2467.   if csLoading in ComponentState then Exit;
  2468.   //OnlineThread
  2469.   Inc(OnlineThreadCounter, Timer1.Interval);
  2470.   if OnlineThreadCounter > 1000 then OnlineThreadCounter := 0; //make sure...
  2471.   if OnlineThreadTerminated then begin
  2472.     if (OnlineThreadCounter > 400) then begin
  2473.       Timer1.Enabled := False;
  2474.       OnlineThreadTerminated := False;
  2475.       OnlineThreadCounter := 0;
  2476.       Screen.Cursor := crHourGlass;
  2477.       try
  2478.         if OnlineForm <> nil then OnlineForm.Free;
  2479.         if OnlineThread <> nil then OnlineThread.Free;
  2480.         OnlineForm := nil;
  2481.         OnlineThread := nil;
  2482.         SelectMailForm.Free;
  2483.         StrPCopy(NotifyIconData.szTip, 'Phoenix Mail');
  2484.         Shell_NotifyIcon(NIM_MODIFY, @NotifyIconData);
  2485.         PaintBox1.Visible := False;
  2486.         AreWeOnline := False;
  2487.         SetAccountMenusEnabled(False);
  2488.         SetMessageMenusEnabled;
  2489.         Label4.Caption := '';
  2490.         Label5.Caption := '';
  2491.         StatusBar1.Panels[2].Text := '';
  2492.         StatusBar1.Panels[3].Text := '';
  2493.       finally
  2494.         if bDUNNormalQuit then DialUp1.GoOffline;
  2495.         Screen.Cursor := crDefault;
  2496.         ReadyToClose := True;
  2497.         Timer1.Enabled := True;
  2498.       end;
  2499.     end;
  2500.   end;
  2501.   // Read/Unread Flag
  2502.   if (ListView1.SelCount = 1) and (ListView1.Selected <> nil) and (ListView1.Selected.ImageIndex <> -1) then begin
  2503.     Inc(ReadCounter, Timer1.Interval);
  2504.     if ReadCounter > (iMarkAsReadSec*1000) then begin
  2505.       ReadCounter := 0;
  2506.       if ListView1.Selected.ImageIndex <> -1 then ToggleUnreadFlag1Click(Self);
  2507.     end;
  2508.   end;
  2509.   //Animation
  2510.   if AreWeOnline then begin
  2511.     if Label4.Caption <> '' then begin
  2512.       PaintBox1.Visible := False;
  2513.       Exit;
  2514.     end;
  2515.     if not bHideAnimations then begin
  2516.       PaintBox1.Visible := True;
  2517.       if (AnimationPosition > (PaintBox1.Width-AniBmp1.Width-3)) and (AnimationToLeft = True) then begin
  2518.         AnimationPosition := PaintBox1.Width-3;
  2519.         AnimationToLeft := False;
  2520.         PaintBox1.Canvas.Brush.Color := clBtnFace;
  2521.         PaintBox1.Canvas.FillRect(Rect(0, 0, PaintBox1.Width, PaintBox1.Height));
  2522.       end;
  2523.       if (AnimationPosition < 0) and (AnimationToLeft = False)  then begin
  2524.         AnimationPosition := -AniBmp1.Width+3;
  2525.         AnimationToLeft := True;
  2526.         PaintBox1.Canvas.Brush.Color := clBtnFace;
  2527.         PaintBox1.Canvas.FillRect(Rect(0, 0, PaintBox1.Width, PaintBox1.Height));
  2528.       end;
  2529.       if AnimationToLeft then begin
  2530.         Inc(AnimationPosition, 3);
  2531.         PaintBox1.Canvas.Draw(AnimationPosition, 0, AniBmp2);
  2532.       end else begin
  2533.         Dec(AnimationPosition, 3);
  2534.         PaintBox1.Canvas.Draw(AnimationPosition, 0, AniBmp1);
  2535.       end;
  2536.     end;
  2537.   end;
  2538.   // Active connection
  2539.   //S := GetActiveConnection;
  2540.   //if S = '' then S := ListBox1.Items[34] else S := Format(ListBox1.Items[35], [S]);
  2541.   //if Statusbar1.Panels[3].Text <> S then Statusbar1.Panels[3].Text := S;
  2542. end;
  2543.  
  2544. procedure TMainForm.ListView1DrawHeader(Control: TWinControl; var ACanvas: TCanvas; Index: Integer; var ARect: TRect; Selected: Boolean; var DefaultDrawing: Boolean);
  2545. begin
  2546.   if Index = 0 then begin
  2547.     DefaultDrawing := False;
  2548.     ACanvas.BrushCopy(Rect(ARect.Left+2, ARect.Top, ARect.Left+18, ARect.Top+16), Image2.Picture.Bitmap, Rect(0, 0, 16, 16), clFuchsia);
  2549.   end else
  2550.     DefaultDrawing := True;
  2551. end;
  2552.  
  2553. {procedure TMainForm.WMDrawItem(var Msg: TWMDrawItem);
  2554. var
  2555.   MenuItem: TMenuItem;
  2556.   ACanvas: TCanvas;
  2557.   ARect: TRect;
  2558.   Selected: Boolean;
  2559. begin
  2560.   with Msg.DrawItemStruct^ do begin
  2561.     if ctlType = ODT_MENU then begin
  2562.       MenuItem := PopupMenu6.FindItem(ItemID, fkCommand);
  2563.       if MenuItem <> nil then
  2564.         DrawPopUpMenuItem(MenuItem, hDC, rcItem, (ItemState = ODS_SELECTED));
  2565.     end;
  2566.   end;
  2567. end;
  2568.  
  2569. procedure TMainForm.WMMeasureItem(var Msg: TWMMeasureItem);
  2570. begin
  2571.  
  2572. end;
  2573.  
  2574. procedure TMainForm.DrawPopUpMenuItem(Item: TMenuItem; DC: HDC; ARect: TRect; Selected: Boolean);
  2575. begin
  2576.  
  2577. end;}
  2578.  
  2579. procedure TMainForm.MenuItem3DrawIteehm(Sender: TObject; ACanvas: TCanvas;
  2580.   ARect: TRect; Selected: Boolean);
  2581. var
  2582.   S: String;
  2583.   Y: Integer;
  2584.   R: TRect;
  2585. begin
  2586.   ARect.Left := ARect.Left+27;
  2587.   ACanvas.Font.Name := 'MS Sans Serif';
  2588.   ACanvas.Font.Size := 8;
  2589.   ACanvas.Font.Style := [];
  2590.   S := TMenuItem(Sender).Caption;
  2591.   if TMenuItem(Sender).Default then ACanvas.Font.Style := [fsBold];
  2592.   if S = '-' then S := '';
  2593.  
  2594.   if Length(S) > 0 then begin
  2595.     ACanvas.TextRect(ARect, ARect.Left+16, ARect.Top+1, S);
  2596.     Y := ARect.Top + 13;
  2597.     ACAnvas.Pen.Color := ACanvas.Font.Color;
  2598.     ACanvas.MoveTo(ARect.Left + 16, Y);
  2599.     ACanvas.LineTo(ARect.Left + 16 + ACanvas.TextWidth(S[1]), Y);
  2600.   end else begin
  2601.     ACAnvas.Pen.Color := clBtnShadow;
  2602.     ACanvas.MoveTo(ARect.Left, ARect.Top+4);
  2603.     ACanvas.LineTo(ARect.Right, ARect.Top+4);
  2604.     ACAnvas.Pen.Color := clBtnHighLight;
  2605.     ACanvas.MoveTo(ARect.Left, ARect.Top+5);
  2606.     ACanvas.LineTo(ARect.Right, ARect.Top+5);
  2607.   end;
  2608.   ACAnvas.Pen.Color := clBtnShadow;
  2609.   ACanvas.MoveTo(ARect.Left-3, ARect.Top);
  2610.   ACanvas.LineTo(ARect.Left-3, ARect.Bottom);
  2611.   ACAnvas.Pen.Color := clBtnHighLight;
  2612.   ACanvas.MoveTo(ARect.Left-2, ARect.Top);
  2613.   ACanvas.LineTo(ARect.Left-2, ARect.Bottom);
  2614.   Y := ARect.Top;
  2615.   R := Rect(0, Y, 22, Y+ARect.Bottom-ARect.Top);
  2616.   ACanvas.CopyRect(Rect(0, ARect.Top, 22, ARect.Bottom), Image3.Canvas, R);
  2617. end;
  2618.  
  2619. procedure TMainForm.MenuItem3MeasureItem(Sender: TObject; ACanvas: TCanvas; var Width, Height: Integer);
  2620. begin
  2621.   Height := 17;
  2622.   Width := ACanvas.TextWidth(TMenuItem(Sender).Caption)+44;
  2623.   if TMenuItem(Sender).Caption = '-' then Height := 10;
  2624. end;
  2625.  
  2626. procedure TMainForm.AppMinimize(Sender: TObject);
  2627. begin
  2628.   ShowWindow(Application.Handle, SW_HIDE);
  2629.   Visible := False;
  2630. end;
  2631.  
  2632. procedure TMainForm.WMTaskIcon(var Message: TMessage);
  2633. var
  2634.   P: TPoint;
  2635. begin
  2636.   case Message.lParam of
  2637.     WM_LBUTTONDBLCLK: begin
  2638.     end;
  2639.     WM_LBUTTONUP: begin
  2640.       ShowPhoenixMail1Click(Self);
  2641.     end;
  2642.     WM_RBUTTONUP: begin
  2643.       GetCursorPos(P);
  2644.       PopUpMenu6.PopUp(P.X, P.Y);
  2645.     end;
  2646.   end;
  2647. end;
  2648.  
  2649. procedure TMainForm.WMSysCommand(var Message: TMessage);
  2650. begin
  2651.   if (Message.WParam = SC_MINIMIZE) then begin
  2652.     ShowWindow(Application.Handle, SW_HIDE);
  2653.     Visible := False;
  2654.   end else inherited;
  2655. end;
  2656.  
  2657. procedure TMainForm.ShowPhoenixMail1Click(Sender: TObject);
  2658. begin
  2659.   Visible := True;
  2660.   ShowWindow(Application.Handle, SW_RESTORE);
  2661.   SetForegroundWindow(Application.Handle);
  2662.   SetForegroundWindow(Handle);
  2663.   if OnlineForm <> nil then try SetForegroundWindow(OnlineForm.Handle); except end;
  2664. end;
  2665.  
  2666. procedure TMainForm.Modal1Click(Sender: TObject);
  2667. begin
  2668.   ShowPhoenixMail1Click(Self);
  2669.   Modal1.Enabled := False;
  2670.   EnviroForm := TEnviroForm.Create(Self);
  2671.   EnviroForm.PageControl1.ActivePage := EnviroForm.TabSheet4;
  2672.   EnviroForm.ShowModal;
  2673.   EnviroForm.Free;
  2674.   Modal1.Enabled := True;
  2675. end;
  2676.  
  2677. procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  2678. begin
  2679.   if AreWeOnline then begin
  2680.     if SpeedButton12.Enabled = False then Exit;
  2681.     if MessageDlg(ListBox1.Items[90], mtWarning, [mbYes, mbNo], 0) = mrYes then begin
  2682.       Terminating := True;
  2683.       OnlineThread.ShowError(MainForm.ListBox1.Items[82]);
  2684.       repeat Application.HandleMessage; until ReadyToClose;
  2685.       CanClose := True;
  2686.     end else
  2687.       CanClose := False;
  2688.   end else begin
  2689.     Terminating := True;
  2690.     CanClose := True;
  2691.   end;
  2692. end;
  2693.  
  2694. procedure TMainForm.OnlineSession(OnlineTyp: Byte);
  2695. var
  2696.   Node: TTreeNode;
  2697.   I, ToSendCount: Integer;
  2698.  
  2699.   function GetSubNotes(Node: TTreeNode; var SL: TStringList): Integer;
  2700.   var
  2701.     SearchRec: TSearchRec;
  2702.     I, Found: Integer;
  2703.   begin
  2704.     Result := 0;
  2705.     for I := 0 to Node.Count-1 do begin
  2706.       if PFolderData(Node.Item[I].Data)^.OutBox then begin
  2707.         Found := FindFirst(PFolderData(Node.Item[I].Data)^.Path+'*.msg', faAnyFile, SearchRec);
  2708.         while Found = 0 do begin
  2709.           SL.Add(PFolderData(Node.Item[I].Data)^.Path+SearchRec.Name);
  2710.           Inc(Result);
  2711.           Found := FindNext(SearchRec);
  2712.         end;
  2713.         FindClose(SearchRec);
  2714.       end;
  2715.       if Node.Count > 0 then GetSubNotes(Node.Item[I], SL);
  2716.     end;
  2717.   end;
  2718.  
  2719.   procedure AddAccountData(Node: TTreeNode);
  2720.   var
  2721.     SL: TStringList;
  2722.     I: Integer;
  2723.   begin
  2724.     if (OnlineTyp in [2, 3]) and (PAccountData(Node.Data)^.DoSMTP = 1) then begin
  2725.       SL := TStringList.Create;
  2726.       GetSubNotes(Node, SL);
  2727.       ToSendCount := SL.Count;
  2728.       if SL.Count > 0 then begin
  2729.         OnlineForm.CommandList.Add('SMTP');
  2730.         OnlineForm.CommandList.Add(PAccountData(Node.Data)^.Name);
  2731.         OnlineForm.CommandList.Add(PAccountData(Node.Data)^.SMTPServer);
  2732.         OnlineForm.CommandList.Add(PAccountData(Node.Data)^.SMTPPort);
  2733.         OnlineForm.CommandList.Add('');
  2734.         OnlineForm.CommandList.Add('');
  2735.         OnlineForm.CommandList.Add('<'+ExtractEMailAddress(PAccountData(Node.Data)^.FromMail)+'>');
  2736.         OnlineForm.CommandList.Add('');
  2737.         OnlineForm.CommandList.Add('');
  2738.         OnlineForm.CommandList.Add('');
  2739.         OnlineForm.CommandList.Add(PAccountData(Node.Data)^.Path);
  2740.         OnlineForm.CommandList.Add(IntToStr(Integer(@Node)));
  2741.         OnlineForm.CommandList.Add(IntToStr(SL.Count));
  2742.         for I := 0 to SL.Count-1 do OnlineForm.CommandList.Add(SL.Strings[I]);
  2743.       end;
  2744.       SL.Free;
  2745.     end;
  2746.     if (OnlineTyp in [1, 3]) and (PAccountData(Node.Data)^.DoPOP = 1) then begin
  2747.       OnlineForm.CommandList.Add('POP3');
  2748.       OnlineForm.CommandList.Add(PAccountData(Node.Data)^.Name);
  2749.       OnlineForm.CommandList.Add(PAccountData(Node.Data)^.POPServer);
  2750.       OnlineForm.CommandList.Add(PAccountData(Node.Data)^.POPPort);
  2751.       OnlineForm.CommandList.Add(PAccountData(Node.Data)^.POPUser);
  2752.       if PAccountData(Node.Data)^.PromptPassword = 1 then OnlineForm.CommandList.Add('')
  2753.         else OnlineForm.CommandList.Add(PAccountData(Node.Data)^.POPPass);
  2754.       OnlineForm.CommandList.Add('');
  2755.       OnlineForm.CommandList.Add(IntToStr(PAccountData(Node.Data)^.StandardDownload));
  2756.       OnlineForm.CommandList.Add(PAccountData(Node.Data)^.DeleteFilter);
  2757.       OnlineForm.CommandList.Add(PAccountData(Node.Data)^.KeepFilter);
  2758.       OnlineForm.CommandList.Add(PAccountData(Node.Data)^.Path);
  2759.       OnlineForm.CommandList.Add(IntToStr(Integer(@Node)));
  2760.     end;
  2761.   end;
  2762.  
  2763. begin
  2764.   if AreWeOnline then Exit;
  2765.   FetchedMailCount := 0;
  2766.   SendMailCount := 0;
  2767.   AvailableMailCount := 0;
  2768.   ToSendCount := 0;
  2769.   Node := GetActualAccount;
  2770.   if Assigned(Node) = False then Exit;
  2771.   if Assigned(Node.Data) = False then Exit;
  2772.   if OnlineTyp <> 4 then begin
  2773.     ListView1.Selected := nil;
  2774.     UpdateListView;
  2775.     ActualizeStatusBar;
  2776.   end;
  2777.   Screen.Cursor := crHourGlass;
  2778.   StrPCopy(NotifyIconData.szTip, 'Phoenix Mail - '+ListBox1.Items[36]);
  2779.   Shell_NotifyIcon(NIM_MODIFY, @NotifyIconData);
  2780.   AreWeOnline := True;
  2781.   ReadyToClose := False;
  2782.   Abort := False;
  2783.   SetMessageMenusEnabled;
  2784.   AnimationToLeft := True;
  2785.   AnimationPosition := -AniBmp1.Width+3;
  2786.   if not bHideAnimations then PaintBox1.Visible := True;
  2787.   OnlineForm := TOnlineForm.Create(Self);
  2788.   OnlineForm.OnlineTyp := OnlineTyp;
  2789.   if OnlineTyp in [1, 2] then AddAccountData(Node);
  2790.   if OnlineTyp in [3, 4] then begin
  2791.     for I := 0 to TreeView1.Items.Count-1 do
  2792.       if TreeView1.Items[I].StateIndex = 1 then AddAccountData(TreeView1.Items[I]);
  2793.   end;
  2794.   SelectMailForm := TSelectMailForm.Create(Self);
  2795.   if (OnlineTyp = 2) and (ToSendCount = 0) then begin
  2796.     try OnlineForm.ShowStatusMessage; except end;
  2797.     Exit;
  2798.   end;
  2799.   OnlineThread := TOnlineThread.Create;
  2800.   OnlineThread.CommandCount := OnlineForm.CommandList.Count;
  2801.   OnlineForm.DialUpNetwork;
  2802.   if Abort then Exit;
  2803.   OnlineThread.Resume;
  2804. end;
  2805.  
  2806. procedure TMainForm.DragDropWndProc(var Message: TMessage);
  2807. begin
  2808.    with Message do begin
  2809.      if Msg = WM_DROPFILES then
  2810.        DragDropFiles(HDrop(wParam))
  2811.      else
  2812.        Result := CallWindowProc(DragDropDefWndProc, ListView2.Handle, Msg, WParam, LParam);
  2813.    end;
  2814. end;
  2815.  
  2816. procedure TMainForm.DragDropFiles(hDropHandle: HDrop);
  2817. var
  2818.   PFilename: PChar;
  2819.   I, Count: Integer;
  2820. begin
  2821.   if (ListView1.SelCount <> 1) or (ListView1.Selected = nil) then Exit;
  2822.   GetMem(PFilename, 256);
  2823.   Count := DragQueryFile(hDropHandle, $FFFFFFFF, nil, 255);
  2824.   for I := 0 to Count-1 do begin
  2825.     DragQueryFile(hDropHandle, I, PFilename, 255);
  2826.     AddAttachment(StrPas(PFilename));
  2827.   end;
  2828.   FreeMem(PFilename, 256);
  2829. end;
  2830.  
  2831. procedure TMainForm.SearchMessage1Click(Sender: TObject);
  2832. begin
  2833.   SearchForm := TSearchForm.Create(Self);
  2834.   SearchForm.Method := 0;
  2835.   SearchForm.ShowModal;
  2836.   SearchForm.Free;
  2837. end;
  2838.  
  2839. procedure TMainForm.WndProc(var Message: TMessage);
  2840. begin
  2841.   if Message.Msg = WM_PREVINSTRUN then begin
  2842.     if Message.WParam = 1 then begin
  2843.       try
  2844.         AssignFile(TextFile, sTempNewMessageFile);
  2845.         Reset(TextFile);
  2846.         ReadLn(TextFile, sWriteNewMessage1);
  2847.         ReadLn(TextFile, sWriteNewMessage2);
  2848.         CloseFile(TextFile);
  2849.         DeleteFile(sTempNewMessageFile);
  2850.       except end;
  2851.     end;
  2852.     ShowPhoenixMail1Click(Self);
  2853.     if (MailOptionsForm.Visible = False) and (sWriteNewMessage1 <> '') then begin
  2854.       NewMessage(True, True, sWriteNewMessage2, sWriteNewMessage1, '', nil);
  2855.       sWriteNewMessage1 := '';
  2856.       sWriteNewMessage2 := '';
  2857.     end;
  2858.   end else
  2859.   if Message.Msg = WM_GETFORMHANDLES then begin
  2860.     // Get LangStrings
  2861.     DeleteFile(sTempLanguageFile);
  2862.     LangSupTagList := TStringList.Create;
  2863.     Memo1.Lines.Add('');
  2864.     SaveMemo(Memo1);  //memos have became obsolete
  2865.     SaveMemo(Memo1);
  2866.     bSmallToolbarButtons := False;     //Make Toolbar butttons...
  2867.     SetToolbarButtonOrder;             //...captions visible
  2868.     SaveFormStrings(MainForm);
  2869.     SaveFormStrings(AddressForm);
  2870.     MailOptionsForm.SpeedButton6.Caption := '';
  2871.     SaveFormStrings(MailOptionsForm);
  2872.     SignatureForm := TSignatureForm.Create(Self);
  2873.     SaveFormStrings(SignatureForm);
  2874.     SignatureForm.Free;
  2875.     AccountForm := TAccountForm.Create(Self);
  2876.     SaveFormStrings(AccountForm);
  2877.     AccountForm.Free;
  2878.     DirectoryForm := TDirectoryForm.Create(Self);
  2879.     SaveFormStrings(DirectoryForm);
  2880.     DirectoryForm.Free;
  2881.     EditAdrForm := TEditAdrForm.Create(Self);
  2882.     SaveFormStrings(EditAdrForm);
  2883.     EditAdrForm.Free;
  2884.     EnviroForm := TEnviroForm.Create(Self);
  2885.     SaveFormStrings(EnviroForm);
  2886.     EnviroForm.Free;
  2887.     FolderForm := TFolderForm.Create(Self);
  2888.     SaveFormStrings(FolderForm);
  2889.     FolderForm.Free;
  2890.     OnlineForm := TOnlineForm.Create(Self);
  2891.     SaveFormStrings(OnlineForm);
  2892.     OnlineForm.Free;
  2893.     SearchForm := TSearchForm.Create(Self);
  2894.     SaveFormStrings(SearchForm);
  2895.     SearchForm.Free;
  2896.     SelBookForm := TSelBookForm.Create(Self);
  2897.     SaveFormStrings(SelBookForm);
  2898.     SelBookForm.Free;
  2899.     SelectMailForm := TSelectMailForm.Create(Self);
  2900.     SaveFormStrings(SelectMailForm);
  2901.     SelectMailForm.Free;
  2902.     TipsForm := TTipsForm.Create(Self);
  2903.     SaveFormStrings(TipsForm);
  2904.     TipsForm.Free;
  2905.     StdMailForm := TStdMailForm.Create(Self);
  2906.     SaveFormStrings(StdMailForm);
  2907.     InfoForm := TInfoForm.Create(Self);
  2908.     SaveFormStrings(InfoForm);
  2909.     InfoForm.Free;
  2910.     StdMailForm.Free;
  2911.     LangSupTagList.Free;
  2912.   end else
  2913.     inherited WndProc(Message);
  2914. end;
  2915.  
  2916. procedure TMainForm.SaveAs3Click(Sender: TObject);
  2917. begin
  2918.   if ListView2.SelCount <> 1 then Exit;
  2919.   if DirectoryExists(sLastAttSaveDir) then
  2920.     SaveDialog1.InitialDir := sLastAttSaveDir
  2921.   else
  2922.     SaveDialog1.InitialDir := ExtractFileDir(Application.Exename);
  2923.   SaveDialog1.Filename := ListView2.Selected.Caption;
  2924.   if SaveDialog1.Execute then begin
  2925.     sLastAttSaveDir := MakeValidDirname(ExtractFilePath(SaveDialog1.Filename));
  2926.     SetFileAttr(sTemporaryFolder+ListView2.Selected.Caption, False, True, False, False);
  2927.     CopyFile(PChar(sTemporaryFolder+ListView2.Selected.Caption), PChar(SaveDialog1.Filename), False);
  2928.   end;
  2929. end;
  2930.  
  2931. procedure TMainForm.Message1Click(Sender: TObject);
  2932. begin
  2933.   SetMessageMenusEnabled;
  2934. end;
  2935.  
  2936. procedure TMainForm.SelectAllMessages1Click(Sender: TObject);
  2937. var
  2938.   I: Integer;
  2939. begin
  2940.   for I := 0 to ListView1.Items.Count-1 do
  2941.     ListView1.Items[I].Selected := True;
  2942.   ListView1MouseUp(Self, mbLeft, [ssLeft], 0, 0);
  2943. end;
  2944.  
  2945. procedure TMainForm.TreeView1Compare(Sender: TObject; Node1, Node2: TTreeNode; Data: Integer; var Compare: Integer);
  2946. begin
  2947.   Compare := AnsiStrIComp(PChar(GetPXTreeNodeName(Node1)), PChar(GetPXTreeNodeName(Node2)));
  2948.   if Node1 = AccountsNode then Compare := 0;
  2949.   if Node1 = TrashNode then Compare := 0;
  2950.   if Node1 = RepositoryNode then Compare := 0;
  2951. end;
  2952.  
  2953. procedure TMainForm.AddtoAdressbook1Click(Sender: TObject);
  2954. var
  2955.   I: Integer;
  2956. begin
  2957.   if ListView1.Selected = nil then Exit;
  2958.   for I := 0 to ListView1.Items.Count-1 do
  2959.     if ListView1.Items[I].Selected then begin
  2960.       if AddressForm.SetAddress(ListView1.Items[I].SubItems[1]) <> False then Exit;
  2961.   end;
  2962. end;
  2963.  
  2964. procedure TMainForm.Timer2Timer(Sender: TObject);
  2965. var
  2966.   B: Boolean;
  2967.   Hour1, Min1, Hour2, Min2, Sec, MSec: Word;
  2968. begin
  2969.   if csDestroying in ComponentState then Exit;
  2970.   if csLoading in ComponentState then Exit;
  2971.   //Auto Quit
  2972.   if (bDUNAutoQuit = True) and (AreWeOnline) then begin
  2973.     Inc(OnlineCounter);
  2974.     if OnlineCounter >= iDUNAutoQuitTime then begin
  2975.       OnlineThread.ShowError(Format(ListBox1.Items[81], [IntToStr(iDUNAutoQuitTime)]));
  2976.       Application.ProcessMessages;
  2977.       DialUp1.GoOffline;
  2978.     end;
  2979.   end;
  2980.   //Schedule
  2981.   Inc(MinutesSinceStart);
  2982.   if MinutesSinceStart > 30001 then MinutesSinceStart := 0;
  2983.   if MinutesSinceStart = sScheduleS1 then begin
  2984.     MinutesSinceStart := 0;
  2985.     B := True;
  2986.   end else
  2987.     B := False;
  2988.   if AreWeOnline then Exit;
  2989.   if bScheduleC5 then
  2990.     if MainForm.DialUp1.CurrentConnection = '' then Exit;
  2991.   if bScheduleC1 then
  2992.     if B then OnlineSession(4);
  2993.   if bScheduleC2 = False then Exit;
  2994.   DecodeTime(Time, Hour1, Min1, Sec, MSec);
  2995.   if bScheduleC3 then begin
  2996.     DecodeTime(StrToTime(sScheduleS2), Hour2, Min2, Sec, MSec);
  2997.     if (Hour1 = Hour2) and (Min1 = Min2) then OnlineSession(4);
  2998.   end;
  2999.   if bScheduleC4 then begin
  3000.     DecodeTime(StrToTime(sScheduleS3), Hour2, Min2, Sec, MSec);
  3001.     if (Hour1 = Hour2) and (Min1 = Min2) then OnlineSession(4);
  3002.   end;
  3003. end;
  3004.  
  3005. procedure TMainForm.SpellCheck1Click(Sender: TObject);
  3006. var
  3007.   P: TPoint;
  3008. begin
  3009.   if FileExists(sSpellCheckerFile) = False then Exit;
  3010.   SpellCheckForm := TSpellCheckForm.Create(Self);
  3011.   P.X := RichEdit1.Left;
  3012.   P.Y := RichEdit1.Top;
  3013.   P := Panel1.ClientToScreen(P);
  3014.   SpellCheckForm.Left := P.X+4;
  3015.   SpellCheckForm.Top := P.Y+4;
  3016.   SpellCheckForm.ShowModal;
  3017.   SpellCheckForm.Free;
  3018. end;
  3019.  
  3020. procedure TMainForm.QuickView1Click(Sender: TObject);
  3021. var
  3022.   I: Integer;
  3023.   A: array[0..MAX_PATH] of Char;
  3024.   S: String;
  3025. begin
  3026.   if ListView2.SelCount = 0 then Exit;
  3027.   for I := 0 to ListView2.Items.Count-1 do
  3028.     if ListView2.Items[I].Selected then begin
  3029.       GetSystemDirectory(A, MAX_PATH);
  3030.       S := A;
  3031.       S := MakeValidDirName(S)+'Viewers\Quikview.exe';
  3032.       ShellExecute(Handle, 'open', PChar(S), PChar(sTemporaryFolder+ListView2.Items[I].Caption), PChar(sTemporaryFolder), SW_SHOWNORMAL);
  3033.     end;
  3034. end;
  3035.  
  3036. procedure TMainForm.StatusBar1DrawPanel(StatusBar: TStatusBar;
  3037.   Panel: TStatusPanel; const Rect: TRect);
  3038. begin
  3039.   if Panel = StatusBar1.Panels[0] then begin
  3040.     StatusBar.Canvas.TextOut(Rect.Left+19, Rect.Top+1, Panel.Text);
  3041.     StatusBar.Canvas.Draw(Rect.Left, Rect.Top, Image6.Picture.Bitmap);
  3042.   end;
  3043.   if Panel = StatusBar1.Panels[1] then begin
  3044.     StatusBar.Canvas.TextOut(Rect.Left+19, Rect.Top+1, Panel.Text);
  3045.     StatusBar.Canvas.Draw(Rect.Left+1, Rect.Top, Image7.Picture.Bitmap);
  3046.   end;
  3047.   if Panel = StatusBar1.Panels[2] then begin
  3048.     StatusBar.Canvas.TextOut(Rect.Left, Rect.Top+1, Panel.Text);
  3049.   end;
  3050.   if Panel = StatusBar1.Panels[3] then begin
  3051.     if Panel.Text <> '' then
  3052.       StatusBar.Canvas.Draw(Rect.Left+1, Rect.Top, Image9.Picture.Bitmap);
  3053.   end;
  3054. end;
  3055.  
  3056. procedure TMainForm.CreateGradientBitmap(StartPos: Integer; var GBitmap: TBitmap);
  3057. var
  3058.   I, Steps: Integer;
  3059.   Bitmap: TBitmap;
  3060.   R, G, B, OldR, OldG, OldB: Real;
  3061.   StartC, EndC, OldC: TColor;
  3062. begin
  3063.   Bitmap := TBitmap.Create;
  3064.   Bitmap.Width := GBitmap.Width;
  3065.   Bitmap.Height := GBitmap.Height;
  3066.   Bitmap.Canvas.Brush.Color := clBtnShadow;
  3067.   Bitmap.Canvas.FillRect(Rect(0, 0, Bitmap.Width, Bitmap.Height));
  3068.   if iColorDepth > 8 then begin
  3069.     Steps := Bitmap.Width - StartPos;
  3070.     StartC := ColorToRGB(clBtnShadow);
  3071.     EndC := ColorToRGB(clBtnFace);
  3072.     R := (GetRValue(EndC) - GetRValue(StartC)) / Steps;
  3073.     G := (GetGValue(EndC) - GetGValue(StartC)) / Steps;
  3074.     B := (GetBValue(EndC) - GetBValue(StartC)) / Steps;
  3075.     OldC := StartC;
  3076.     OldR := GetRValue(StartC);
  3077.     OldG := GetGValue(StartC);
  3078.     OldB := GetBValue(StartC);
  3079.     for I := 0 to Steps-1 do begin
  3080.       Bitmap.Canvas.Pen.Color := OldC;
  3081.       Bitmap.Canvas.Rectangle(I+StartPos, 0, I+StartPos+1, Bitmap.Height);
  3082.       OldR := OldR + R;
  3083.       OldG := OldG + G;
  3084.       OldB := OldB + B;
  3085.       if (OldR < 0) or (OldR > 255) then OldR := GetRValue(EndC);
  3086.       if (OldG < 0) or (OldG > 255) then OldG := GetGValue(EndC);
  3087.       if (OldB < 0) or (OldB > 255) then OldB := GetBValue(EndC);
  3088.       OldC := RGB(Round(OldR), Round(OldG), Round(OldB));
  3089.     end;
  3090.   end;
  3091.   GBitmap.Assign(Bitmap);
  3092.   Bitmap.Free;
  3093. end;
  3094.  
  3095. procedure TMainForm.Contents1Click(Sender: TObject);
  3096. begin
  3097.   Application.HelpContext(34);
  3098. end;
  3099.  
  3100. procedure TMainForm.DialUp1StatusEvent(Sender: TObject; MessageText: String; Error: Boolean);
  3101. begin
  3102.   if (OnlineThread <> nil) and (OnlineForm <> nil) then begin
  3103.     OnlineThread.SetStatusString(-1, MessageText, '');
  3104.     if Error then begin
  3105.       DialUp1.GoOffline;
  3106.       OnlineThread.ShowError(MessageText);
  3107.     end;
  3108.   end;
  3109. end;
  3110.  
  3111. procedure TMainForm.EmptyRepository1Click(Sender: TObject);
  3112. var
  3113.   SearchRec: TSearchRec;
  3114.   Found: Integer;
  3115. begin
  3116.   Screen.Cursor := crHourGlass;
  3117.   Application.ProcessMessages;
  3118.   Found := FindFirst(sRepositoryFolder+'*.*', faAnyFile, SearchRec);
  3119.   while Found = 0 do begin
  3120.     SetFileAttr(sRepositoryFolder+SearchRec.Name, False, True, False, False);
  3121.     DeleteFile(sRepositoryFolder+SearchRec.Name);
  3122.     Found := FindNext(SearchRec);
  3123.   end;
  3124.   FindClose(SearchRec);
  3125.   TreeView1Change(Self, TreeView1.Selected);
  3126.   ActualizeTrash;
  3127.   TreeView1.Invalidate;
  3128. end;
  3129.  
  3130. procedure TMainForm.ASpeedButton1Click(Sender: TObject);
  3131. var
  3132.   P: TPoint;
  3133. begin
  3134.   P := ASpeedButton1.ClientToScreen(Point(ASpeedButton1.Width, 0));
  3135.   if ASpeedButton1.Enabled then PopUpMenu2.Popup(P.X, P.Y);
  3136. end;
  3137.  
  3138. function TMainForm.GetToolbarButttonByIndex(Index: Integer; var ImageIndex: Integer): TSpeedButtonEx;
  3139. begin
  3140.   Result := nil;
  3141.   ImageIndex := 26;
  3142.   case Index of
  3143.     1: begin Result := SpeedButton4; ImageIndex := 0; end;
  3144.     2: begin Result := SpeedButton5; ImageIndex := 2; end;
  3145.     3: begin Result := SpeedButton6; ImageIndex := 4; end;
  3146.     4: begin Result := SpeedButton3; ImageIndex := 6; end;
  3147.     5: begin Result := SpeedButton2; ImageIndex := 8; end;
  3148.     6: begin Result := SpeedButton9; ImageIndex := 10; end;
  3149.     7: begin Result := SpeedButton10; ImageIndex := 12; end;
  3150.     8: begin Result := SpeedButton8; ImageIndex := 14; end;
  3151.     9: begin Result := SpeedButton7; ImageIndex := 16; end;
  3152.     10: begin Result := SpeedButton1; ImageIndex := 18; end;
  3153.     11: begin Result := SpeedButton13; ImageIndex := 28; end;
  3154.     12: begin Result := SpeedButton14; ImageIndex := 30; end;
  3155.     13: begin Result := SpeedButton12; ImageIndex := 32; end;
  3156.     14: begin Result := SpeedButton17; ImageIndex := 34; end;
  3157.     15: begin Result := SpeedButton16; ImageIndex := 36; end;
  3158.     16: begin Result := SpeedButton15; ImageIndex := 38; end;
  3159.     17: begin Result := SpeedButton11; ImageIndex := 40; end;
  3160.   end;
  3161. end;
  3162.  
  3163. procedure TMainForm.SpeedButton11Click(Sender: TObject);
  3164. var
  3165.   P: TPoint;
  3166. begin
  3167.   P := SpeedButton11.ClientToScreen(Point(0, SpeedButton11.Height));
  3168.   if SpeedButton11.Enabled then PopUpMenu2.Popup(P.X, P.Y);
  3169. end;
  3170.  
  3171. procedure TMainForm.CancelOnlineOperation1Click(Sender: TObject);
  3172. begin
  3173.   if not AreWeOnline then Exit;
  3174.   OnlineThread.ShowError(MainForm.ListBox1.Items[82]);
  3175. end;
  3176.  
  3177. procedure TMainForm.Panel2Paint(Sender: TObject);
  3178. var
  3179.   I, E, H, W: Integer;
  3180. begin
  3181.   if bDrawBK then begin
  3182.     H := Image4.Picture.Bitmap.Height;
  3183.     W := Image4.Picture.Bitmap.Width;
  3184.     for I := 0 to (Panel2.Width div W)+1 do
  3185.       for E := 0 to (Panel2.Height div H)+1 do
  3186.         Panel2.Canvas.Draw(I*W, E*H, Image4.Picture.Bitmap);
  3187.   end;
  3188. end;
  3189.  
  3190. procedure TMainForm.SetToolbarButtonOrder;
  3191. var
  3192.   SL: TStringList;
  3193.   I, ImageIndex, Pos, E: Integer;
  3194.   B: TSpeedButtonEx;
  3195.   V: TBevel;
  3196. begin
  3197.   for I := 1 to iToolBarButtonCount do begin
  3198.     B := TSpeedButtonEx(FindComponent('SpeedButton'+IntToStr(I)));
  3199.     if bSmallToolbarButtons then begin
  3200.       B.Caption := '';
  3201.       B.Width := 32;
  3202.       B.Height := 32;
  3203.     end else begin
  3204.       B.Caption := B.Comment;
  3205.       B.Width := DefaultTlbButtonWidth;
  3206.       B.Height := DefaultTlbButtonHeight;
  3207.     end;
  3208.     if bFlatButtons = False then begin
  3209.       B.Width := B.Width+2;
  3210.       B.Height := B.Height+2;
  3211.     end;
  3212.   end;
  3213.   Panel2.Height := SpeedButton1.Height+6;
  3214.   //Position
  3215.   SL := TStringList.Create;
  3216.   CommataStringToStringList(sToolbarButtons, SL);
  3217.   Pos := 1;
  3218.   for I := 1 to iToolbarButtonCount do GetToolbarButttonByIndex(I, ImageIndex).Visible := False;
  3219.   for I := 0 to ToolbarSeperators.Count-1 do TBevel(ToolbarSeperators.Items[I]).Free;
  3220.   ToolbarSeperators.Clear;
  3221.   SpellCheck1.Visible := not (sSpellCheckerFile = '');
  3222.   for I := 0 to SL.Count-1 do begin
  3223.     E := StrToInt(SL.Strings[I]);
  3224.     B := GetToolbarButttonByIndex(E, ImageIndex);
  3225.     if B <> nil then begin
  3226.       if (E = 7) and (sSpellCheckerFile = '') then begin
  3227.         // Spell Checker
  3228.       end else begin
  3229.         B.Left := Pos;
  3230.         Inc(Pos, B.Width-1);
  3231.         B.BringToFront;
  3232.         B.Visible := True;
  3233.       end;
  3234.     end else begin
  3235.       V := TBevel.Create(Self);
  3236.       V.Shape := bsLeftLine;
  3237.       V.Width := 2;
  3238.       V.Height := SpeedButton1.Height;
  3239.       V.Top := SpeedButton1.Top;
  3240.       V.Left := Pos+2;
  3241.       Inc(Pos, 6);
  3242.       ToolbarSeperators.Add(V);
  3243.       V.Parent := Panel2;
  3244.       V.Visible := True;
  3245.       V.BringToFront;
  3246.     end;
  3247.   end;
  3248.   SL.Free;
  3249.   //Flat
  3250.   Set3DButtons(bFlatButtons, Self);
  3251.   for I := 0 to ToolbarSeperators.Count-1 do TBevel(ToolbarSeperators.Items[I]).Visible := bFlatButtons;
  3252.   ASpeedButton1.Flat := False;
  3253.   if bFlatButtons = False then Panel2.Height := SpeedButton1.Height+7;
  3254.   //Background
  3255.   if FileExists(sToolbarBKBitmap) and bFlatButtons and (iColorDepth > 8) then begin
  3256.     MainForm.Image4.Picture.LoadFromFile(sToolbarBKBitmap);
  3257.     bDrawBK := True;
  3258.   end else bDrawBK := False;
  3259.   MainForm.Panel2.Invalidate;
  3260. end;
  3261.  
  3262. procedure TMainForm.Configure1Click(Sender: TObject);
  3263. begin
  3264.   Modal1.Enabled := False;
  3265.   EnviroForm := TEnviroForm.Create(Self);
  3266.   EnviroForm.PageControl1.ActivePage := EnviroForm.TabSheet7;
  3267.   EnviroForm.ShowModal;
  3268.   EnviroForm.Free;
  3269.   Modal1.Enabled := True;
  3270. end;
  3271.  
  3272. procedure TMainForm.FlatButtons1Click(Sender: TObject);
  3273. begin
  3274.   bFlatButtons := not bFlatButtons;
  3275.   SetToolbarButtonOrder;
  3276. end;
  3277.  
  3278. procedure TMainForm.SmallButtons1Click(Sender: TObject);
  3279. begin
  3280.   bSmallToolbarButtons := not bSmallToolbarButtons;
  3281.   SetToolbarButtonOrder;
  3282. end;
  3283.  
  3284. procedure TMainForm.PopupMenu7Popup(Sender: TObject);
  3285. begin
  3286.   FlatButtons1.Checked := bFlatButtons;
  3287.   SmallButtons1.Checked := bSmallToolbarButtons;
  3288. end;
  3289.  
  3290. procedure TMainForm.TreeView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  3291. begin
  3292.   Application.HandleMessage;
  3293. end;
  3294.  
  3295. end.
  3296.