spSkinShellCtrls.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:105k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************************}
  2. {                                                                   }
  3. {       Almediadev Visual Component Library                         }
  4. {       DynamicSkinForm                                             }
  5. {       Version 5.60                                                }
  6. {                                                                   }
  7. {       Copyright (c) 2000-2003 Almediadev                          }
  8. {       ALL RIGHTS RESERVED                                         }
  9. {                                                                   }
  10. {       Home:  http://www.almdev.com                                }
  11. {       Support: support@almdev.com                                 }
  12. {                                                                   }
  13. {*******************************************************************}
  14. unit spSkinShellCtrls;
  15. {$WARNINGS OFF}
  16. {$HINTS OFF}                                                   
  17. interface
  18. uses
  19.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  20.   Dialogs, StdCtrls, ExtCtrls, ComCtrls, CommCtrl, ShellAPI, ShlObj, ActiveX,
  21.   Menus, ImgList, SkinCtrls, DynamicSkinForm, SkinData, SkinBoxCtrls,
  22.   spFileCtrl, spMessages;
  23. type
  24.   TDiskSign = String[2];
  25.   TMediaType = (dtUnknown, dtNotExists, dtRemovable, dtFixed, dtRemote, dtCDROM, dtRAMDisk);
  26.   TFileFlag = (fsCaseIsPreserved, fsCaseSensitive, fsUnicodeStoredOnDisk,
  27.                fsPersistentAcls, fsFileCompression, fsVolumeIsCompressed,
  28.                fsLongFileNames,
  29.                fsEncryptedFileSystemSupport, fsObjectIDsSupport, fsReparsePointsSupport,
  30.                fsSparseFilesSupport, fsDiskQuotasSupport);
  31.   TFileFlags = set of TFileFlag;
  32.   TDiskInfo = record
  33.     Sign: TDiskSign;
  34.     MediaType: TMediaType;
  35.     FileFlags: TFileFlags;
  36.     SectorsPerCluster,
  37.     BytesPerSector,
  38.     FreeClusters,
  39.     TotalClusters,
  40.     Serial: DWORD;
  41.     Capacity,
  42.     FreeSpace: Int64;
  43.     VolumeLabel,
  44.     SerialNumber,
  45.     FileSystem: String;
  46.   end;
  47.   TObjectType = (otFile, otDirectory, otDisk);
  48.   TObjectTypes = set of TObjectType;
  49.   TFileAttr = (ftReadOnly, ftHidden, ftSystem, ftArchive, ftNormal);
  50.   TFileType = Set of TFileAttr;
  51.   TspSkinFileListView = class(TspSkinListView)
  52.   private
  53.     FSkinMessage: TspSkinMessage;
  54.     FDirectory: String;
  55.     FDirectorySize: integer;
  56.     FFileName: String;
  57.     FFileType: TFileType;
  58.     FMask: String;
  59.     FContextMenu: Boolean;
  60.     FSortColumn: integer;
  61.     FSortForward: boolean;
  62.     LImageList, SImageList: TImageList;
  63.     FContextAction: Boolean;
  64.     FSelectedFiles :tStringlist;
  65.     function GetSelectedNum: Integer;
  66.     function GetSelectedSize: Integer;
  67.     procedure Createimages;
  68.     procedure CompareFiles(Sender: TObject; Item1,Item2: TListItem; Data: Integer; var Compare: Integer);
  69.     procedure ColumnClick(Sender: TObject; Column: TListColumn);
  70.     procedure WMRButtonDown(var Message: TWMRButtonDown); message WM_RBUTTONDOWN;
  71.     procedure DoMouseDown(var Message: TWMMouse; Button: TMouseButton;
  72.       Shift: TShiftState);
  73.     function GetSelectedFilenames: String;
  74.     function GetObjectTypes: TObjectTypes;
  75.     function GetDiskCap: Int64;
  76.     function GetDiskFree: Int64;
  77.     function GetFiles: TStringList;
  78.   protected
  79.     function AddFile(FileMask: String; Attr: DWORD): Boolean;
  80.     function GetFileName: String;
  81.     function GetDirectory: String;
  82.     procedure AddDrives;
  83.     procedure Click; override;
  84.     procedure DblClick; override;
  85.     procedure Keydown(var Key: Word; Shift: TShiftState); override;
  86.     procedure SetFileName(NewFile: String);
  87.     procedure SetDirectory(NewDir: String);
  88.     procedure SetFileType(NewFileType: TFileType);
  89.     procedure SetMask(const NewMasks: String);
  90.     function GetDiskInfo(Value: TDiskSign): TDiskInfo;
  91.     procedure Notification(AComponent: TComponent;  Operation: TOperation); override;
  92.   public
  93.     constructor Create(AOwner: TComponent); override;
  94.     destructor Destroy; override;
  95.     procedure CreateWnd; override;
  96.     procedure OneLevelUp;
  97.     procedure UpdateFileList;
  98.     property FileName: String read GetFileName write SetFileName;
  99.     property DiskCapacity: Int64 read GetDiskCap;
  100.     property DiskFree: Int64 read GetDiskFree;
  101.     function GetMediaTypeStr(MT: TMediaType): String;
  102.     function IsFile(Item: TListItem): Boolean;
  103.     property Files: TStringList read GetFiles;
  104.   published
  105.     property SkinMessage: TspSkinMessage
  106.      read FSkinMessage write FSkinMessage; 
  107.     property HScrollBar;
  108.     property VScrollBar;
  109.     property SkinData;
  110.     property SkinDataName;
  111.     property Directory: String read GetDirectory write SetDirectory;
  112.     property FileType: TFileType read FFileType write SetFileType;
  113.     property Mask: String read FMask write SetMask;
  114.     property ContextMenu: Boolean read FContextMenu write FContextMenu;
  115.     property ContextAction: Boolean read FContextAction write FContextAction;
  116.     property SelectedCount: Integer read GetSelectedNum;
  117.     property SelectedSize: Integer read GetSelectedSize;
  118.     property SelectedFilenames :String read GetSelectedFilenames;
  119.     property SelectedTypes :TObjectTypes read GetObjectTypes;
  120.     property Align;
  121.     property BorderStyle;
  122.     property Color;
  123.     property DragCursor;
  124.     property Font;
  125.     property HideSelection;
  126.     property IconOptions;
  127.     property MultiSelect;
  128.     property ParentShowHint;
  129.     property ReadOnly;
  130.     property RowSelect;
  131.     property ShowColumnHeaders;
  132.     property ShowHint;
  133.     property TabOrder;
  134.     property TabStop;
  135.     property ViewStyle;
  136.     property Visible;
  137.     property OnChange;
  138.     property OnChanging;
  139.     property OnClick;
  140.     property OnColumnClick;
  141.     property OnCompare;
  142.     property OnDblClick;
  143.     property OnDeletion;
  144.     property OnDragDrop;
  145.     property OnDragOver;
  146.     property OnEdited;
  147.     property OnEditing;
  148.     property OnEndDrag;
  149.     property OnEnter;
  150.     property OnExit;
  151.     property OnInsert;
  152.     property OnKeyDown;
  153.     property OnKeyPress;
  154.     property OnKeyUp;
  155.     property OnMouseDown;
  156.     property OnMouseMove;
  157.     property OnMouseUp;
  158.     property OnStartDrag;
  159.   end;
  160.   TDirChangeEvent = procedure(Sender: TObject; SelectedPath: string) of object;
  161.   TspSkinDirTreeView = class(TspSkinCustomTreeView)
  162.   private
  163.     FSkinMessage: TspSkinMessage;
  164.     FPreviousPath: string;
  165.     FSelectedPath: string;
  166.     TreeViewPath: string;
  167.     OldTreeViewPath: string;
  168.     FIsNewFolder: Boolean;
  169.     FInitialDir: String;
  170.     FisCutCopy: Boolean;
  171.     FOpMode: integer;
  172.     FSrcPath: string;
  173.     FDestPath: String;
  174.   protected
  175.     function GetDirectory: String;
  176.     procedure SetDirectory(Value: String);
  177.     procedure CreateWnd; override;
  178.     procedure Expanding(Sender: TObject; Node: TTreeNode;
  179.       var AllowExpansion: Boolean);
  180.     procedure LoadRoot;
  181.     procedure LoadDrives;
  182.     procedure Loaded; override;
  183.     procedure AddSubs(Path: string; Node: TTreeNode);
  184.     procedure MakePath(Node: TTreeNode);
  185.     procedure MouseDown(Button: TMouseButton;
  186.       Shift: TShiftState; X, Y: Integer); override;
  187.     procedure KeyUp(var Key: Word; Shift: TShiftState); override;
  188.     procedure SetInitialDir(Value: string);
  189.     procedure SetSelectedPath(Value: string);
  190.     function CanEdit(Node: TTreeNode): Boolean; override;
  191.     procedure Edit(const Item: TTVItem); override;
  192.     function GetPathFromNode(Node: TTreeNode): string;
  193.     procedure Notification(AComponent: TComponent;  Operation: TOperation); override;
  194.   public
  195.     constructor create(AOwner: TComponent); override;
  196.     destructor destroy; override;
  197.     procedure ChangeSkinData; override;
  198.     property InitialDir: string read FInitialDir Write SetInitialDir;
  199.     procedure ReLoad;
  200.     procedure OpenPath(dPath: string);
  201.     property Images;
  202.     property Items;
  203.     property Directory: String read GetDirectory write SetDirectory;
  204.   published
  205.     property SkinMessage: TspSkinMessage
  206.      read FSkinMessage write FSkinMessage; 
  207.     property HScrollBar;
  208.     property VScrollBar;
  209.     property SkinData;
  210.     property SkinDataName;
  211.     property Align;
  212.     property BorderStyle;
  213.     property Color;
  214.     property DragCursor;
  215.     property Enabled;
  216.     property Font;
  217.     property Height;
  218.     property HelpContext;
  219.     property HideSelection;
  220.     property Hint;
  221.     property Indent;
  222.     property Left;
  223.     property Name;
  224.     property ParentColor;
  225.     property ParentFont;
  226.     property ParentShowHint;
  227.     property PopupMenu;
  228.     property ReadOnly;
  229.     property ShowButtons;
  230.     property ShowHint;
  231.     property ShowLines;
  232.     property ShowRoot;
  233.     property SortType;
  234.     property TabOrder;
  235.     property TabStop;
  236.     property Tag;
  237.     property Top;
  238.     property Visible;
  239.     property Width;
  240.     property OnClick;
  241.     property OnChange;
  242.     property OnCollapsed;
  243.     property OnCollapsing;
  244.     property OnDblClick;
  245.     property OnDeletion;
  246.     property OnDragDrop;
  247.     property OnDragOver;
  248.     property OnEdited;
  249.     property OnEditing;
  250.     property OnEndDrag;
  251.     property OnEnter;
  252.     property OnExit;
  253.     property OnExpanded;
  254.     property OnExpanding;
  255.     property OnKeyDown;
  256.     property OnKeyPress;
  257.     property OnKeyUp;
  258.     property OnMouseDown;
  259.     property OnMouseMove;
  260.     property OnMouseUp;
  261.     property OnStartDrag;
  262.     property Anchors;
  263.     property BiDiMode;
  264.     property Constraints;
  265.   end;
  266.   TspSkinShellDriveComboBox = class(TspSkinComboBox)
  267.   private
  268.     Drives: TStrings;
  269.     DriveItemIndex: Integer;
  270.     Images: TImagelist;
  271.     FDrive: Char;
  272.     FOnChange: TNotifyEvent;
  273.   protected
  274.     procedure CreateWnd; override;
  275.     procedure DrawItem(Cnvs: TCanvas; Index: Integer;
  276.       ItemWidth, ItemHeight: Integer; TextRect: TRect; State: TOwnerDrawState);
  277.     procedure BuildList; virtual;
  278.     procedure SetDrive(Value: Char);
  279.   public
  280.     constructor Create(AOwner: TComponent); override;
  281.     destructor Destroy; override;
  282.     procedure UpdateDrives;
  283.     procedure Change; override;
  284.   published
  285.     property Drive: Char read FDrive write SetDrive;
  286.     property OnChange: TNotifyEvent read FOnChange write FOnChange;
  287.   end;
  288.   { Dialogs }
  289.   TspSelDirDlgForm = class(TForm)
  290.   public
  291.     DSF: TspDynamicSkinForm;
  292.     DirTreeViewPanel, BottomPanel: TspSkinPanel;
  293.     DirTreeView: TspSkinDirTreeView;
  294.     VScrollBar, HScrollBar: TspSkinScrollBar;
  295.     OkButton, CancelButton: TspSkinButton;
  296.     constructor Create(AOwner: TComponent); override;
  297.   end;
  298.   TspSkinSelectDirectoryDialog = class(TComponent)
  299.   private
  300.     FSkinMessage: TspSkinMessage;
  301.     FSD: TspSkinData;
  302.     FCtrlFSD: TspSkinData;
  303.     FDefaultFont: TFont;
  304.     FTitle: String;
  305.     FDlgFrm: TspSelDirDlgForm;
  306.     FOnChange: TNotifyEvent;
  307.     FDirectory: String;
  308.     FAlphaBlend: Boolean;
  309.     FAlphaBlendValue: Byte;
  310.     FAlphaBlendAnimation: Boolean;
  311.     function GetTitle: string;
  312.     procedure SetTitle(const Value: string);
  313.     procedure SetDefaultFont(Value: TFont);
  314.   protected
  315.     procedure Notification(AComponent: TComponent;  Operation: TOperation); override;
  316.     procedure Change;
  317.   public
  318.     DialogWidth, DialogHeight: Integer;
  319.     constructor Create(AOwner: TComponent); override;
  320.     destructor Destroy; override;
  321.     function Execute: Boolean;
  322.   published
  323.     property SkinMessage: TspSkinMessage
  324.        read FSkinMessage write FSkinMessage;
  325.     property AlphaBlend: Boolean read FAlphaBlend write FAlphaBlend;
  326.     property AlphaBlendValue: Byte read FAlphaBlendValue write FAlphaBlendValue;
  327.     property AlphaBlendAnimation: Boolean
  328.       read FAlphaBlendAnimation write FAlphaBlendAnimation;
  329.     property SkinData: TspSkinData read FSD write FSD;
  330.     property CtrlSkinData: TspSkinData read FCtrlFSD write FCtrlFSD;
  331.     property DefaultFont: TFont read FDefaultFont write SetDefaultFont;
  332.     property Title: string read GetTitle write SetTitle;
  333.     property Directory: String read FDirectory write FDirectory;
  334.   end;
  335.   TspOpenDlgForm = class(TForm)
  336.   private
  337.     FromFLV: Boolean;
  338.     FromFTV: Boolean;
  339.     FromDCB: Boolean;
  340.     SaveMode: Boolean;
  341.   public
  342.     FileName: String;
  343.     DSF: TspDynamicSkinForm;
  344.     DirTreeViewPanel: TspSkinExPanel;
  345.     FileListViewPanel,
  346.     BottomPanel: TspSkinPanel;
  347.     Splitter: TspSkinSplitter;
  348.     DTVHScrollBar, DTVVScrollBar,
  349.     FLVHScrollBar, FLVVScrollBar: TspSkinScrollBar;
  350.     DirTreeView: TspSkinDirTreeView;
  351.     FileListView: TspSkinFileListView;
  352.     FileNameEdit: TspSkinEdit;
  353.     FilterComboBox: TspSkinFilterComboBox;
  354.     OpenButton, CancelButton: TspSkinButton;
  355.     OpenFileLabel, FileTypeLabel: TspSkinStdLabel;
  356.     ToolPanel: TspSkinPanel;
  357.     ListToolButton, ReportToolButton,
  358.     IconToolButton, SmallIconToolButton, BackToolButton: TspSkinSpeedButton;
  359.     Bevel1, Bevel2, Bevel3: TspSkinBevel;
  360.     DriveBox: TspSkinShellDriveComboBox;
  361.     MyDocToolButton: TspSkinSpeedButton;
  362.     constructor CreateEx(AOwner: TComponent; ASaveMode: Boolean);
  363.     procedure FLVChange(Sender: TObject; Item: TListItem; Change: TItemChange);
  364.     procedure DTVChange(Sender: TObject; Node: TTreeNode);
  365.     procedure FCBChange(Sender: TObject);
  366.     procedure DCBChange(Sender: TObject);
  367.     procedure OpenButtonClick(Sender: TObject);
  368.     procedure FLVDBLClick(Sender: TObject);
  369.     procedure EditKeyPress(Sender: TObject; var Key: Char);
  370.     procedure ReportToolButtonClick(Sender: TObject);
  371.     procedure ListToolButtonClick(Sender: TObject);
  372.     procedure SmallIconToolButtonClick(Sender: TObject);
  373.     procedure IconToolButtonClick(Sender: TObject);
  374.     procedure BackToolButtonClick(Sender: TObject);
  375.     procedure MyDocToolButtonClick(Sender: TObject);
  376.   end;
  377.   TspSkinOpenDialog = class(TComponent)
  378.   private
  379.     FFiles: TStringList;
  380.     FMultiSelection: Boolean;
  381.     FSkinMessage: TspSkinMessage;
  382.     FSD: TspSkinData;
  383.     FCtrlFSD: TspSkinData;
  384.     FLVHeaderSkinDataName: String;
  385.     FDefaultFont: TFont;
  386.     FTitle: String;
  387.     FDlgFrm: TspOpenDlgForm;
  388.     FOnChange: TNotifyEvent;
  389.     FInitialDir: String;
  390.     FFilter: String;
  391.     FFileName: String;
  392.     FFilterIndex: Integer;
  393.     FAlphaBlend: Boolean;
  394.     FAlphaBlendValue: Byte;
  395.     FAlphaBlendAnimation: Boolean;
  396.     function GetTitle: string;
  397.     procedure SetTitle(const Value: string);
  398.     procedure SetDefaultFont(Value: TFont);
  399.   protected
  400.     FSaveMode: Boolean;
  401.     procedure Notification(AComponent: TComponent;  Operation: TOperation); override;
  402.     procedure Change;
  403.   public
  404.     TreePanelWidth: Integer;
  405.     TreePanelRollState: Boolean;
  406.     ListViewStyle: TViewStyle;
  407.     DialogWidth, DialogHeight: Integer;
  408.     property Files: TStringList read FFiles;
  409.     constructor Create(AOwner: TComponent); override;
  410.     destructor Destroy; override;
  411.     function Execute: Boolean;
  412.   published
  413.     property MultiSelection: Boolean read FMultiSelection write FMultiSelection;
  414.     property SkinMessage: TspSkinMessage
  415.        read FSkinMessage write FSkinMessage;
  416.     property AlphaBlend: Boolean read FAlphaBlend write FAlphaBlend;
  417.     property AlphaBlendValue: Byte read FAlphaBlendValue write FAlphaBlendValue;
  418.     property AlphaBlendAnimation: Boolean
  419.       read FAlphaBlendAnimation write FAlphaBlendAnimation;
  420.     property LVHeaderSkinDataName: String
  421.      read FLVHeaderSkinDataName write FLVHeaderSkinDataName;
  422.     property SkinData: TspSkinData read FSD write FSD;
  423.     property CtrlSkinData: TspSkinData read FCtrlFSD write FCtrlFSD;
  424.     property DefaultFont: TFont read FDefaultFont write SetDefaultFont;
  425.     property Title: string read GetTitle write SetTitle;
  426.     property InitialDir: String read FInitialDir write FInitialDir;
  427.     property Filter: String read FFilter write FFilter;
  428.     property FilterIndex: Integer read FFilterIndex write FFilterIndex;
  429.     property FileName: String read FFileName write FFileName;
  430.   end;
  431.   TspSkinSaveDialog = class(TspSkinOpenDialog)
  432.   public
  433.     constructor Create(AOwner: TComponent); override;
  434.   end;
  435.   TspSkinDirectoryEdit = class(TspSkinEdit)
  436.   protected
  437.     FDlgSkinData: TspSkinData;
  438.     FDlgCtrlSkinData: TspSkinData;
  439.     SD: TspSkinSelectDirectoryDialog;
  440.     procedure Notification(AComponent: TComponent;  Operation: TOperation); override;
  441.   public
  442.     constructor Create(AOwner: TComponent); override;
  443.     destructor Destroy; override;
  444.     procedure ButtonClick(Sender: TObject);
  445.   published
  446.     property DlgSkinData: TspSkinData read FDlgSkinData write FDlgSkinData;
  447.     property DlgCtrlSkinData: TspSkinData read FDlgCtrlSkinData write FDlgCtrlSkinData;
  448.   end;
  449.   TspSkinFileEdit = class(TspSkinEdit)
  450.   protected
  451.     FDlgSkinData: TspSkinData;
  452.     FDlgCtrlSkinData: TspSkinData;
  453.     OD: TspSkinOpenDialog;
  454.     FLVHeaderSkinDataName: String;
  455.     function GetFilter: String;
  456.     procedure SetFilter(Value: String);
  457.     procedure Notification(AComponent: TComponent;  Operation: TOperation); override;
  458.   public
  459.     constructor Create(AOwner: TComponent); override;
  460.     destructor Destroy; override;
  461.     procedure ButtonClick(Sender: TObject);
  462.   published
  463.     property Filter: String read GetFilter write SetFilter;
  464.     property DlgSkinData: TspSkinData read FDlgSkinData write FDlgSkinData;
  465.     property DlgCtrlSkinData: TspSkinData read FDlgCtrlSkinData write FDlgCtrlSkinData;
  466.     property LVHeaderSkinDataName: String
  467.       read FLVHeaderSkinDataName write FLVHeaderSkinDataName;
  468.   end;
  469.   TspSkinSaveFileEdit = class(TspSkinEdit)
  470.   protected
  471.     FDlgSkinData: TspSkinData;
  472.     FDlgCtrlSkinData: TspSkinData;
  473.     OD: TspSkinSaveDialog;
  474.     FLVHeaderSkinDataName: String;
  475.     function GetFilter: String;
  476.     procedure SetFilter(Value: String);
  477.     procedure Notification(AComponent: TComponent;  Operation: TOperation); override;
  478.   public
  479.     constructor Create(AOwner: TComponent); override;
  480.     destructor Destroy; override;
  481.     procedure ButtonClick(Sender: TObject);
  482.   published
  483.     property Filter: String read GetFilter write SetFilter;
  484.     property DlgSkinData: TspSkinData read FDlgSkinData write FDlgSkinData;
  485.     property DlgCtrlSkinData: TspSkinData read FDlgCtrlSkinData write FDlgCtrlSkinData;
  486.     property LVHeaderSkinDataName: String
  487.       read FLVHeaderSkinDataName write FLVHeaderSkinDataName;
  488.   end;
  489.   TspOpenPictureDlgForm = class(TForm)
  490.   private
  491.     FromFLV: Boolean;
  492.     FromFTV: Boolean;
  493.     FromDCB: Boolean;
  494.     SaveMode: Boolean;
  495.   public
  496.     FileName: String;
  497.     DSF: TspDynamicSkinForm;
  498.     DirTreeViewPanel: TspSkinExPanel;
  499.     FileListViewPanel,
  500.     BottomPanel: TspSkinPanel;
  501.     Splitter, Splitter2: TspSkinSplitter;
  502.     DTVHScrollBar, DTVVScrollBar,
  503.     FLVHScrollBar, FLVVScrollBar: TspSkinScrollBar;
  504.     DirTreeView: TspSkinDirTreeView;
  505.     FileListView: TspSkinFileListView;
  506.     FileNameEdit: TspSkinEdit;
  507.     FilterComboBox: TspSkinFilterComboBox;
  508.     OpenButton, CancelButton: TspSkinButton;
  509.     OpenFileLabel, FileTypeLabel: TspSkinStdLabel;
  510.     ToolPanel: TspSkinPanel;
  511.     ListToolButton, ReportToolButton,
  512.     IconToolButton, SmallIconToolButton, BackToolButton: TspSkinSpeedButton;
  513.     Bevel1, Bevel2, Bevel3: TspSkinBevel;
  514.     DriveBox: TspSkinShellDriveComboBox;
  515.     MyDocToolButton: TspSkinSpeedButton;
  516.     //
  517.     ImagePanel: TspSkinPanel;
  518.     Image: TImage;
  519.     ScrollBox: TspSkinScrollBox;
  520.     SBVScrollBar, SBHScrollBar: TspSkinScrollBar;
  521.     Bevel4: TspSkinBevel;
  522.     StretchButton: TspSkinSpeedButton;
  523.     constructor CreateEx(AOwner: TComponent; ASaveMode: Boolean);
  524.     procedure DCBChange(Sender: TObject);
  525.     procedure FLVChange(Sender: TObject; Item: TListItem; Change: TItemChange);
  526.     procedure DTVChange(Sender: TObject; Node: TTreeNode);
  527.     procedure FCBChange(Sender: TObject);
  528.     procedure OpenButtonClick(Sender: TObject);
  529.     procedure FLVDBLClick(Sender: TObject);
  530.     procedure EditKeyPress(Sender: TObject; var Key: Char);
  531.     procedure StretchButtonClick(Sender: TObject);
  532.     procedure ReportToolButtonClick(Sender: TObject);
  533.     procedure ListToolButtonClick(Sender: TObject);
  534.     procedure SmallIconToolButtonClick(Sender: TObject);
  535.     procedure IconToolButtonClick(Sender: TObject);
  536.     procedure BackToolButtonClick(Sender: TObject);
  537.     procedure MyDocToolButtonClick(Sender: TObject);
  538.   end;
  539.   TspSkinOpenPictureDialog = class(TComponent)
  540.   private
  541.     FFiles: TStringList;
  542.     FMultiSelection: Boolean;
  543.     FSkinMessage: TspSkinMessage;
  544.     FLVHeaderSkinDataName: String;
  545.     FAlphaBlend: Boolean;
  546.     FAlphaBlendValue: Byte;
  547.     FAlphaBlendAnimation: Boolean;
  548.     FSD: TspSkinData;
  549.     FCtrlFSD: TspSkinData;
  550.     FDefaultFont: TFont;
  551.     FTitle: String;
  552.     FDlgFrm: TspOpenPictureDlgForm;
  553.     FOnChange: TNotifyEvent;
  554.     FInitialDir: String;
  555.     FFilter: String;
  556.     FFileName: String;
  557.     FFilterIndex: Integer;
  558.     function GetTitle: string;
  559.     procedure SetTitle(const Value: string);
  560.     procedure SetDefaultFont(Value: TFont);
  561.   protected
  562.     FSaveMode: Boolean;
  563.     procedure Notification(AComponent: TComponent;  Operation: TOperation); override;
  564.     procedure Change;
  565.   public
  566.     ImagePanelWidth, TreePanelWidth: Integer;
  567.     TreePanelRollState: Boolean;
  568.     ListViewStyle: TViewStyle;
  569.     DialogWidth, DialogHeight: Integer;
  570.     DialogStretch: Boolean;
  571.     property Files: TStringList read FFiles;
  572.     constructor Create(AOwner: TComponent); override;
  573.     destructor Destroy; override;
  574.     function Execute: Boolean;
  575.   published
  576.     property MultiSelection: Boolean read FMultiSelection write FMultiSelection;
  577.     property SkinMessage: TspSkinMessage
  578.        read FSkinMessage write FSkinMessage;
  579.     property LVHeaderSkinDataName: String
  580.      read FLVHeaderSkinDataName write FLVHeaderSkinDataName;
  581.     property AlphaBlend: Boolean read FAlphaBlend write FAlphaBlend;
  582.     property AlphaBlendValue: Byte read FAlphaBlendValue write FAlphaBlendValue;
  583.     property AlphaBlendAnimation: Boolean
  584.       read FAlphaBlendAnimation write FAlphaBlendAnimation;
  585.     property SkinData: TspSkinData read FSD write FSD;
  586.     property CtrlSkinData: TspSkinData read FCtrlFSD write FCtrlFSD;
  587.     property DefaultFont: TFont read FDefaultFont write SetDefaultFont;
  588.     property Title: string read GetTitle write SetTitle;
  589.     property InitialDir: String read FInitialDir write FInitialDir;
  590.     property Filter: String read FFilter write FFilter;
  591.     property FilterIndex: Integer read FFilterIndex write FFilterIndex;
  592.     property FileName: String read FFileName write FFileName;
  593.   end;
  594.   TspSkinSavePictureDialog = class(TspSkinOpenPictureDialog)
  595.   public
  596.     constructor Create(AOwner: TComponent); override;
  597.   end;
  598.   function GetPersonalRoot(H: THandle): String;
  599. implementation
  600.   Uses spConst;
  601. {$R spSkinShellCtrls}
  602. const
  603.   DefaultMask = '*.*';
  604.   FILE_SUPPORTS_ENCRYPTION = 32;
  605.   FILE_SUPPORTS_OBJECT_IDS = 64;
  606.   FILE_SUPPORTS_REPARSE_POINTS = 128;
  607.   FILE_SUPPORTS_SPARSE_FILES = 256;
  608.   FILE_VOLUME_QUOTAS = 512;
  609.   SHGFI = SHGFI_SYSICONINDEX or SHGFI_SMALLICON;
  610. var
  611.   drives: set of 0..25;
  612.   CurPath: String;
  613. function GetPersonalRoot(H: THandle): String;
  614. const
  615.   CSIDL_PERSONAL = $0005;
  616. var
  617.   Root: PItemIDList;
  618.   Path: LPSTR;
  619. begin
  620.   Path := StrAlloc(MAX_PATH);
  621.   SHGetSpecialFolderLocation(H, CSIDL_PERSONAL, Root);
  622.   if SHGetPathFromIDList(Root, Path)
  623.   then
  624.     Result := Path
  625.   else
  626.     Result := '';
  627.   StrDispose(Path);
  628. end;
  629. function GetMediaPresent(Value: TDiskSign) :Boolean;
  630. var
  631.   ErrorMode: Word;
  632.   bufRoot :pchar;
  633.   a,b,c,d :dword;
  634. begin
  635.   if (Value = 'A:') or (Value = 'B:')
  636.   then
  637.     begin
  638.       Result := False;
  639.       Exit;
  640.     end;
  641.   bufRoot:=stralloc(255);
  642.   strpcopy(bufRoot,Value+'');
  643.   ErrorMode:=SetErrorMode(SEM_FailCriticalErrors);
  644.   try
  645.     try
  646.       result:=GetDiskFreeSpace(bufRoot,a,b,c,d);
  647.     except
  648.       result:=False;
  649.     end;
  650.   finally
  651.     strdispose(bufroot);
  652.     SetErrorMode(ErrorMode);
  653.   end;
  654. end;
  655. constructor TspSkinFileListView.Create(AOwner: TComponent);
  656. begin
  657.  inherited Create(AOwner);
  658.  ReadOnly := True;
  659.  fselectedfiles := TStringlist.create;
  660.  Createimages;
  661.  FMask := DefaultMask;
  662.  FSortForward := True;
  663.  FSortColumn := 0;
  664.  OnCompare:=CompareFiles;
  665.  OnColumnClick:=ColumnClick;
  666.  if csDesigning in ComponentState then fdirectory := 'c:';
  667.  FSkinMessage := nil;
  668. end;
  669. procedure TspSkinFileListView.Notification;
  670. begin
  671.   inherited Notification(AComponent, Operation);
  672.   if (Operation = opRemove) and (AComponent = FSkinMessage)
  673.   then
  674.     FSkinMessage := nil;
  675. end;
  676. destructor TspSkinFileListView.Destroy;
  677. begin
  678.  LImageList.Free;
  679.  SImageList.Free;
  680.  fSelectedFiles.Free;
  681.  inherited Destroy;
  682. end;
  683. function TspSkinFileListView.IsFile;
  684. begin
  685.   Result := Item.SubItems[5]='file';
  686. end;
  687. function TspSkinFileListView.GetSelectedNum: Integer;
  688. begin
  689.   Result:=SelCount;
  690.   if Result=0 then
  691.     Result:=Items.Count;
  692. end;
  693. function TspSkinFileListView.GetSelectedSize: Integer;
  694. var
  695.   i, FSize: UInt;
  696.   FName: String;
  697.   FInfo: TWin32FindData;
  698.   hFindFile: THandle;
  699. begin
  700.   Result:=0;
  701.   FSize:=0;
  702.   hFindFile:=0;
  703.   if SelCount=0 then
  704.     exit;
  705.   for i:=0 to Items.Count-1 do begin
  706.     if Items[i].selected then begin
  707.       FName:=ExtractFileName(Items[i].SubItems[4]+#0);
  708.       hFindFile:=FindFirstFile(pChar(FName),FInfo);
  709.       if hFindFile<>INVALID_HANDLE_VALUE then
  710.         FSize:=FSize+((FInfo.nFileSizeHigh*MAXDWORD)+FInfo.nFileSizeLow);
  711.     end;
  712.   end;
  713.   Windows.FindClose(hFindFile);
  714.   Result:=FSize;
  715. end;
  716. function TspSkinFileListView.GetDirectory: String;
  717. begin
  718.   Result:=FDirectory;
  719. end;
  720. procedure TspSkinFileListView.SetDirectory(NewDir: String);
  721. function IsDrive(S: String): Boolean;
  722. var
  723.   D: Char;
  724.   ErrorMode: Word;
  725. begin
  726.   if (Length(S) = 3) and (Pos(':', S) <> 0)
  727.   then
  728.     begin
  729.       D := S[1];
  730.       if D in ['a'..'z'] then Dec(D, $20);
  731.       ErrorMode := SetErrorMode(SEM_FailCriticalErrors);
  732.       try
  733.         if DiskSize(Ord(D) - $40) = -1
  734.         then
  735.           begin
  736.             MessageBeep(MB_IconHand);
  737.             if FSkinMessage = nil
  738.             then
  739.                MessageDlg(SP_NODISKINDRIVE, mtWarning, [mbOK], 0)
  740.             else
  741.               SkinMessage.MessageDlg(SP_NODISKINDRIVE,
  742.                 mtWarning, [mbOK], 0);
  743.             Result := False
  744.           end
  745.         else
  746.           Result := True;
  747.       finally
  748.         SetErrorMode(ErrorMode);
  749.       end;
  750.     end
  751.   else
  752.     Result := True;
  753. end;
  754. begin
  755.   if AnsiCompareText(NewDir,FDirectory) = 0 then Exit;
  756.   if (UpperCase(NewDir)='DRIVES')
  757.   then
  758.     begin
  759.       FDirectory:=NewDir;
  760.       UpdateFileList;
  761.     end
  762.   else
  763.    begin
  764.      if not IsDrive(NewDir) then Exit;
  765.      if not DirectoryExists(NewDir) then Exit;
  766.      NewDir := IncludeTrailingBackslash(NewDir);
  767.      SetCurrentDir(NewDir);
  768.      FDirectory:=NewDir;
  769.      UpdateFileList;
  770.    end;
  771. end;
  772. procedure TspSkinFileListView.SetMask(const NewMasks: String);
  773. begin
  774.   if FMask<>NewMasks then begin
  775.     FMask:=NewMasks;
  776.     UpdateFileList;
  777.   end;
  778. end;
  779. function TspSkinFileListView.GetFileName: String;
  780. begin
  781.   Result:=FFileName;
  782. end;
  783. procedure TspSkinFileListView.SetFileName(NewFile: String);
  784. begin
  785.   if FFileName <> NewFile then FFileName:=NewFile;
  786. end;
  787. procedure TspSkinFileListView.SetFileType(NewFileType: TFileType);
  788. begin
  789.   if NewFileType<>FFileType then begin
  790.     FFileType:=NewFileType;
  791.     UpdateFileList;
  792.   end;
  793. end;
  794. procedure TspSkinFileListView.Createimages;
  795. var
  796.   SysImageList: uint;
  797.   SFI: TSHFileInfo;
  798. begin
  799.   Largeimages:=TImageList.Create(self);
  800.   SysImageList:=SHGetFileInfo('',0,SFI,SizeOf(TSHFileInfo),SHGFI_SYSICONINDEX or SHGFI_LARGEICON);
  801.   if SysImageList<>0 then begin
  802.     Largeimages.Handle:=SysImageList;
  803.     Largeimages.ShareImages:=TRUE;
  804.   end;
  805.   Smallimages:=TImageList.Create(Self);
  806.   SysImageList:=SHGetFileInfo('',0,SFI,SizeOf(TSHFileInfo),SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
  807.   if SysImageList<>0 then begin
  808.     Smallimages.Handle:=SysImageList;
  809.     Smallimages.ShareImages:=TRUE;
  810.   end;
  811. end;
  812. procedure TspSkinFileListView.CreateWnd;
  813. begin
  814.   inherited;
  815.   if Columns.Count=0 then begin
  816.     with Columns.Add do begin
  817.       Caption := SP_FLV_NAME;
  818.       Width := 200;
  819.     end;
  820.     with Columns.Add do begin
  821.       Caption := SP_FLV_SIZE;
  822.       Width := 70;
  823.       Alignment := taRightJustify;
  824.     end;
  825.     with Columns.Add do begin
  826.       Caption := SP_FLV_TYPE;
  827.       Width := 90;
  828.     end;
  829.     with Columns.Add do begin
  830.       Caption := SP_FLV_MODIFIED;
  831.       Width := 100;
  832.     end;
  833.     with Columns.Add do begin
  834.       Caption := SP_FLV_ATTRIBUTES;
  835.       width := 60;
  836.     end;
  837.     UpdateFileList;
  838.   end;
  839.   
  840. end;
  841. procedure TspSkinFileListView.ColumnClick(Sender: TObject;
  842.   Column: TListColumn);
  843. var
  844.   required_column: integer;
  845. begin
  846.   required_column:=Column.Index;
  847.   if required_column=FSortColumn then
  848.     FSortForward:=not FSortForward
  849.   else begin
  850.     FSortColumn:=required_column;
  851.     FSortForward:=True;
  852.   end;
  853.   SortType:=stData;
  854.   SortType:=stNone;
  855. end;
  856. procedure TspSkinFileListView.CompareFiles(Sender: TObject; Item1,
  857. Item2: TListItem; Data: Integer; var Compare: Integer);
  858. var
  859.   s1,s2,Caption1, Caption2: String;
  860.   size1, size2: Double;
  861.   result: integer;
  862. begin
  863.   Result := 0;
  864.   if (UpperCase(FDirectory) = 'DRIVES') then Exit;
  865.   if (Item1.SubItems[0] = ' ') and (Item2.SubItems[0] <> ' ')
  866.   then
  867.     Result := -1
  868.   else
  869.   if (Item1.SubItems[0] <> ' ') and (Item2.SubItems[0] = ' ')
  870.   then
  871.     Result := 1
  872.   else
  873.   case FSortColumn of
  874.     0:
  875.       begin
  876.         Caption1 := AnsiUpperCase(Item1.Caption);
  877.         Caption2 := AnsiUpperCase(Item2.Caption);
  878.         if Caption1 > Caption2
  879.         then
  880.           Result := 1
  881.         else
  882.         if Caption1 < Caption2
  883.         then
  884.           Result := -1
  885.       end;
  886.     1:
  887.       begin
  888.         s1 := Item1.SubItems[0];
  889.         s2 := Item2.SubItems[0];
  890.         if (s1 = '') or (s1 = ' ') then s1 := '0';
  891.         if (s2 = '') or (s2 = ' ') then s2 := '0';
  892.         size1 := StrToFloat(s1);
  893.         size2 := StrToFloat(s2);
  894.         if size1 > size2
  895.         then Result := 1
  896.         else Result := -1;
  897.       end;
  898.     3:
  899.       begin
  900.         s1 := Item1.SubItems[2];
  901.         s2 := Item2.SubItems[2];
  902.         size1 := StrToDateTime(s1);
  903.         size2 := StrToDateTime(s2);
  904.         if size1 > size2
  905.         then Result := 1
  906.         else Result := -1;
  907.       end;
  908.   end;
  909.   if FSortForward then
  910.     Compare:= - result
  911.   else
  912.     Compare := result;
  913. end;
  914. procedure TspSkinFileListView.Keydown(var Key: Word; Shift: TShiftState);
  915. begin
  916.  if ((Shift=[ssCtrl]) and (key=vk_up)) or (key=vk_back) then
  917.    OneLevelUp
  918.  else
  919.    if (key=vk_return) and assigned(selected) then
  920.      DblClick;
  921.  inherited;
  922. end;
  923. procedure TspSkinFileListView.UpdateFileList;
  924. var
  925.   oldCur: TCursor;
  926.   MaskPtr: PChar;
  927.   AttrIndex: TFileAttr;
  928.   Ptr: PChar;
  929.   DirAttr, FileAttr: DWORD;
  930.   FName: String;
  931. const
  932.   dwFileAttr: array[TFileAttr] of DWord = (FILE_ATTRIBUTE_READONLY,
  933. FILE_ATTRIBUTE_HIDDEN, FILE_ATTRIBUTE_SYSTEM,
  934. FILE_ATTRIBUTE_ARCHIVE, FILE_ATTRIBUTE_NORMAL);
  935. begin
  936.   Items.beginUpdate;
  937.   Items.Clear;
  938.   OldCur:=Screen.Cursor;
  939.   Screen.Cursor:=crHourGlass;
  940.   FDirectorySize:=0;
  941.   try
  942.     if UpperCase(FDirectory)='DRIVES' then begin
  943.       Column[1].Caption:=SP_FLV_TYPE;
  944.       Column[1].Width:=100;
  945.       Column[1].Alignment:=taLeftJustify;
  946.       Column[2].Caption:=SP_FLV_DISKSIZE;
  947.       Column[2].Width:=100;
  948.       Column[2].Alignment:=taRightJustify;
  949.       Column[3].Caption:=SP_FLV_FREESPACE;
  950.       Column[3].Width:=100;
  951.       Column[3].Alignment:=taRightJustify;
  952.       AddDrives;
  953.     end else begin
  954.       Column[1].Caption:=SP_FLV_SIZE;
  955.       Column[1].Width:=70;
  956.       Column[1].Alignment:=taRightJustify;
  957.       Column[2].Caption:=SP_FLV_TYPE;
  958.       Column[2].Width:=150;
  959.       Column[2].Alignment:=taLeftJustify;
  960.       Column[3].Caption:=SP_FLV_ATTRIBUTES;
  961.       Column[3].Width:=110;
  962.       Column[3].Alignment:=taLeftJustify;
  963.       FileAttr:=0;
  964.       for AttrIndex:=ftReadOnly to ftNormal do
  965.      if AttrIndex in FileType then
  966.   FileAttr:=FileAttr or dwFileAttr[AttrIndex];
  967.       DirAttr := FileAttr or FILE_ATTRIBUTE_DIRECTORY;
  968.       CurPath := IncludeTrailingBackslash(FDirectory);
  969.       FName:=CurPath+ '*.*';
  970.       AddFile(FName, DirAttr);
  971.       MaskPtr:=PChar(FMask);
  972.       while MaskPtr<>nil do begin
  973.      Ptr:=StrScan(MaskPtr,';');
  974. if Ptr<>nil then
  975.   Ptr^:=#0;
  976.   AddFile((CurPath+StrPas(MaskPtr)),FileAttr);
  977.   if Ptr<>nil then begin
  978.          Ptr^:=';';
  979.     inc(Ptr);
  980.   end;
  981.   MaskPtr:=Ptr;
  982.        end;
  983.      end;
  984.   finally
  985.     FSortForward:=True;
  986.     if not (UpperCase(FDirectory)='DRIVES') then 
  987.       ColumnClick(Self,Columns[0]);
  988.   end;
  989.   Items.EndUpdate;
  990.   Screen.Cursor:=oldCur;
  991.   Application.ProcessMessages;
  992. end;
  993. procedure TspSkinFileListView.AddDrives;
  994. var
  995.   shInfo: TSHFileInfo;
  996.   NewItem: TListItem;
  997.   i: Integer;
  998.   Drv: String;
  999.   DI: TDiskInfo;
  1000. begin
  1001.   Integer(Drives):=GetLogicalDrives;
  1002.   for i:=0 to 25 do
  1003.     if (i in Drives) then begin
  1004.       Drv:=Char(i+Ord('A'))+':';
  1005.       NewItem:=Items.Add;
  1006.       try
  1007.         SHGetFileInfo(PChar(Drv+''),0,shInfo,SizeOf(shInfo),SHGFI_SYSICONINDEX or SHGFI_DISPLAYNAME or SHGFI_TYPENAME);
  1008.      if SmallImages<>nil then
  1009.         NewItem.ImageIndex:=shInfo.Iicon;
  1010.         NewItem.Caption:=StrPas(shInfo.szDisplayName);
  1011.         DI:=GetDiskInfo(TDiskSign(Drv));
  1012.         NewItem.SubItems.Add(GetMediaTypeStr(DI.MediaType));
  1013.         if (Drv <> 'A:') and (Drv <> 'B:')
  1014.         then
  1015.           begin
  1016.             NewItem.SubItems.Add(FormatFloat('###,###,##0', DI.Capacity));
  1017.             NewItem.SubItems.Add(FormatFloat('###,###,##0', DI.FreeSpace));
  1018.           end
  1019.         else
  1020.           begin
  1021.             NewItem.SubItems.Add('');
  1022.             NewItem.SubItems.Add('');
  1023.           end;  
  1024.         NewItem.SubItems.Add('');
  1025.         NewItem.SubItems.Add(Drv+'');
  1026.         NewItem.SubItems.Add('drv');
  1027.       except
  1028.         Items.Delete(NewItem.Index);
  1029.       end;
  1030.    end;
  1031. end;
  1032. function TspSkinFileListView.AddFile(FileMask: String; Attr: DWord): Boolean;
  1033. var
  1034.   ShInfo: TSHFileInfo;
  1035.   S, attributes: String;
  1036.   FDate, FName, FileName: String;
  1037.   FSize: Integer;
  1038.   FI: TSearchRec;
  1039.   function AttrStr(Attr: integer): String;
  1040.   begin
  1041.     Result:='';
  1042.     if (FILE_ATTRIBUTE_DIRECTORY and Attr)>0 then
  1043.       Result:=Result+'';
  1044.     if (FILE_ATTRIBUTE_ARCHIVE and Attr)>0 then
  1045.       Result:=Result+'A';
  1046.     if (FILE_ATTRIBUTE_READONLY and Attr)>0 then
  1047.       Result:=Result+'R';
  1048.     if (FILE_ATTRIBUTE_HIDDEN and Attr)>0 then
  1049.       Result:=Result+'H';
  1050.     if (FILE_ATTRIBUTE_SYSTEM and Attr)>0 then
  1051.       Result:=Result+'S';
  1052.   end;
  1053. begin
  1054.   Result := False;
  1055.   if not SetCurrentDir(FDirectory) then
  1056.     exit;
  1057.   if FindFirst(FileMask,faAnyFile,FI)=0 then
  1058.     try
  1059.       repeat
  1060.           if ((Attr and FILE_ATTRIBUTE_DIRECTORY)=(FI.Attr and FILE_ATTRIBUTE_DIRECTORY))then begin
  1061.             CurPath:=IncludeTrailingBackslash(FDirectory);
  1062.     FName:=FI.Name;
  1063.             S := ExtractFileExt(FileMask);
  1064.             if (Pos ('*', S) = 0) and (Pos ('?', S) = 0) and
  1065.                not ((FI.Attr and FILE_ATTRIBUTE_DIRECTORY)=FILE_ATTRIBUTE_DIRECTORY) and
  1066.                (UpperCase(ExtractFileExt(FI.Name)) <> UpperCase(ExtractFileExt(FileMask)))
  1067.             then
  1068.               Continue;
  1069.     FileName:=IncludeTrailingBackslash(FDirectory)+FName;
  1070.     if (FName='.') or (FName='..') then
  1071.               continue;
  1072.             SHGetFileInfo(PChar(FileName),0,ShInfo,SizeOf(ShInfo),SHGFI_TYPENAME or SHGFI_SYSICONINDEX or SHGFI_DISPLAYNAME);
  1073.             FSize:=FI.Size;
  1074.             FDate:=DateTimeToStr(FileDateToDateTime(FI.Time));
  1075.     Attributes:=AttrStr(FI.Attr);
  1076.     with Items.Add do begin
  1077.               Caption:=FName;
  1078.       if SmallImages<>nil then
  1079. ImageIndex:=ShInfo.iIcon;
  1080.               if (FI.Attr and FILE_ATTRIBUTE_DIRECTORY)=FILE_ATTRIBUTE_DIRECTORY then
  1081.          SubItems.Add(' ')
  1082.               else
  1083.                 SubItems.Add(Trim(IntToStr(FSize)));
  1084.               SubItems.Add((ShInfo.szTypeName));
  1085.       SubItems.Add(FDate);
  1086.       SubItems.Add(attributes);
  1087.       SubItems.Add(FileName);
  1088.       if (FI.Attr and FILE_ATTRIBUTE_DIRECTORY)=FILE_ATTRIBUTE_DIRECTORY then
  1089.                 SubItems.Add('dir')
  1090.       else
  1091.                 SubItems.Add('file');
  1092.     end;
  1093.             FDirectorySize:=FDirectorySize+FSize;
  1094.             Result:=True;
  1095.           end;
  1096.      until FindNext(FI)<>0;
  1097.   finally
  1098.     FindClose(FI);
  1099.   end;
  1100. end;
  1101. procedure TspSkinFileListView.OneLevelUp;
  1102. var
  1103.   NewDir: String;
  1104. begin
  1105.   if UpperCase(Directory)='DRIVES' then
  1106.     exit;
  1107.   FDirectory:=IncludeTrailingBackslash(FDirectory);
  1108.   if (FDirectory[Length(FDirectory)-1]=':') then
  1109.     SetDirectory('Drives')
  1110.   else begin
  1111.     FDirectory:=Copy(FDirectory,1,Length(FDirectory)-1);
  1112.     NewDir:=ExtractFilePath(FDirectory);
  1113.     SetDirectory(NewDir);
  1114.   end;
  1115. end;
  1116. procedure TspSkinFileListView.Click;
  1117. begin
  1118.   if (Selected <> nil) and (Selected.SubItems[5] = 'file')
  1119.   then
  1120.     SetFileName(Selected.SubItems[4])
  1121.   else
  1122.     SetFileName('');
  1123.   inherited;
  1124. end;
  1125. procedure TspSkinFileListView.DblClick;
  1126. var
  1127.   sDir: String;
  1128. begin
  1129.   inherited;
  1130.   if Selected=nil then
  1131.     exit;
  1132.   if (Selected.SubItems[5]='dir') or (Selected.SubItems[5]='drv') then begin
  1133.     sDir:=Selected.SubItems[4];
  1134.     sDir:=IncludeTrailingBackslash(sDir);
  1135.     SetDirectory(sDir);
  1136.   end;{ else
  1137.     if Selected.SubItems[5]='file' then
  1138.       if fcontextaction then
  1139.         PerformDefaultAction(filename, handle);}
  1140. end;
  1141. procedure TspSkinFileListView.WMRButtonDown(var Message: TWMRButtonDown);
  1142. begin
  1143.   DoMouseDown(Message, mbRight, []);
  1144. end;
  1145. procedure TspSkinFileListView.DoMouseDown(var Message: TWMMouse;
  1146.   Button: TMouseButton; Shift: TShiftState);
  1147. begin
  1148.   if not (csNoStdEvents in ControlStyle) then
  1149.     with Message do
  1150.       MouseDown(Button, KeysToShiftState(Keys) + Shift, XPos, YPos);
  1151. end;
  1152. function TspSkinFileListView.GetFiles: TStringList;
  1153. begin
  1154.   GetSelectedFilenames;
  1155.   Result := FSelectedFiles;
  1156. end;
  1157. function TspSkinFileListView.GetSelectedFilenames: String;
  1158. var
  1159.  i: integer;
  1160. begin
  1161.   Result := '';
  1162.   Fselectedfiles.clear;
  1163.   if SelCount=0 then
  1164.     exit;
  1165.   for i:=0 to Items.Count-1 do
  1166.     if Items[i].selected then begin
  1167.       fselectedfiles.add(Items[i].SubItems[4]);
  1168.       result:=result+Items[i].SubItems[4]+';';
  1169.     end;
  1170.   Result:=copy(result,1,length(result)-1);
  1171. end;
  1172. function TspSkinFileListView.GetObjectTypes: TObjectTypes;
  1173. var
  1174.  i: integer;
  1175. begin
  1176.   Result:=[];
  1177.   fselectedfiles.clear;
  1178.   if SelCount=0 then
  1179.     exit;
  1180.   for i:=0 to Items.Count-1 do
  1181.     if Items[i].selected then begin
  1182.       if Items[i].SubItems[5]='file' then
  1183.         result:=result+[otfile]
  1184.       else
  1185.         if Items[i].SubItems[5]='dir' then
  1186.           result:=result+[otdirectory]
  1187.         else
  1188.           if Items[i].SubItems[5]='drv' then
  1189.             result:=result+[otdisk];
  1190.     end;
  1191. end;
  1192. function TspSkinFileListView.GetDiskCap: Int64;
  1193. begin
  1194.   Result:=GetDiskInfo(Copy(FDirectory,1,1)+':').Capacity;
  1195. end;
  1196. function TspSkinFileListView.GetDiskFree: Int64;
  1197. begin
  1198.   Result:=GetDiskInfo(Copy(FDirectory,1,1)+':').FreeSpace;
  1199. end;
  1200. function TspSkinFileListView.GetDiskInfo(Value: TDiskSign): TDiskInfo;
  1201. var
  1202.   BPS,TC,FC,SPC :integer;
  1203.   T,F :TLargeInteger;
  1204.   TF :PLargeInteger;
  1205.   bufRoot, bufVolumeLabel, bufFileSystem :pchar;
  1206.   MCL,Size,Flags :DWORD;
  1207.   s :String;
  1208. begin
  1209.   with Result do begin
  1210.     Sign:=Value;
  1211.     Size:=255;
  1212.     bufRoot:=AllocMem(Size);
  1213.     strpcopy(bufRoot,Value+'');
  1214.     case GetDriveType(bufRoot) of
  1215.       DRIVE_UNKNOWN     :MediaType:=dtUnknown;
  1216.       DRIVE_NO_ROOT_DIR :MediaType:=dtNotExists;
  1217.       DRIVE_REMOVABLE   :MediaType:=dtRemovable;
  1218.       DRIVE_FIXED       :MediaType:=dtFixed;
  1219.       DRIVE_REMOTE      :MediaType:=dtRemote;
  1220.       DRIVE_CDROM       :MediaType:=dtCDROM;
  1221.       DRIVE_RAMDISK     :MediaType:=dtRAMDisk;
  1222.     end;
  1223.     FileFlags:=[];
  1224.     if GetMediaPresent(Value) then begin
  1225.       GetDiskFreeSpace(bufRoot,SectorsPerCluster,BytesPerSector,FreeClusters,TotalClusters);
  1226.       try
  1227.         new(TF);
  1228.         SysUtils.GetDiskFreeSpaceEx(bufRoot,F,T,TF);
  1229.         Capacity:=T;
  1230.         FreeSpace:=F;
  1231.         dispose(TF);
  1232.       except
  1233.         BPS:=BytesPerSector;
  1234.         TC:=TotalClusters;
  1235.         FC:=FreeClusters;
  1236.         SPC:=SectorsPerCluster;
  1237.         Capacity:=TC*SPC*BPS;
  1238.         FreeSpace:=FC*SPC*BPS;
  1239.       end;
  1240.       bufVolumeLabel:=AllocMem(Size);
  1241.       bufFileSystem:=AllocMem(Size);
  1242.       if GetVolumeInformation(bufRoot,bufVolumeLabel,Size,@Serial,MCL,Flags,bufFileSystem,Size) then begin;
  1243.         VolumeLabel:=bufVolumeLabel;
  1244.         FileSystem:=bufFileSystem;
  1245.         s:=IntToHex(Serial,8);
  1246.         SerialNumber:=copy(s,1,4)+'-'+copy(s,5,4);
  1247.         FreeMem(bufVolumeLabel);
  1248.         FreeMem(bufFileSystem);
  1249.         FreeMem(bufRoot);
  1250.         if Flags and FS_CASE_SENSITIVE=FS_CASE_SENSITIVE then
  1251.           FileFlags:=FileFlags+[fsCaseSensitive];
  1252.         if Flags and FS_CASE_IS_PRESERVED=FS_CASE_IS_PRESERVED then
  1253.           FileFlags:=FileFlags+[fsCaseIsPreserved];
  1254.         if Flags and FS_UNICODE_STORED_ON_DISK=FS_UNICODE_STORED_ON_DISK then
  1255.           FileFlags:=FileFlags+[fsUnicodeStoredOnDisk];
  1256.         if Flags and FS_PERSISTENT_ACLS=FS_PERSISTENT_ACLS then
  1257.           FileFlags:=FileFlags+[fsPersistentAcls];
  1258.         if Flags and FS_VOL_IS_COMPRESSED=FS_VOL_IS_COMPRESSED then
  1259.           FileFlags:=FileFlags+[fsVolumeIsCompressed];
  1260.         if Flags and FS_FILE_COMPRESSION=FS_FILE_COMPRESSION then
  1261.           FileFlags:=FileFlags+[fsFileCompression];
  1262.         if MCL=255 then
  1263.           FileFlags:=FileFlags+[fsLongFileNames];
  1264.         if Flags and FILE_SUPPORTS_ENCRYPTION=FILE_SUPPORTS_ENCRYPTION then
  1265.           FileFlags:=FileFlags+[fsEncryptedFileSystemSupport];
  1266.         if Flags and FILE_SUPPORTS_OBJECT_IDS=FILE_SUPPORTS_OBJECT_IDS then
  1267.           FileFlags:=FileFlags+[fsObjectIDsSupport];
  1268.         if Flags and FILE_SUPPORTS_REPARSE_POINTS=FILE_SUPPORTS_REPARSE_POINTS then
  1269.           FileFlags:=FileFlags+[fsReparsePointsSupport];
  1270.         if Flags and FILE_SUPPORTS_SPARSE_FILES=FILE_SUPPORTS_SPARSE_FILES then
  1271.           FileFlags:=FileFlags+[fsSparseFilesSupport];
  1272.         if Flags and FILE_VOLUME_QUOTAS=FILE_VOLUME_QUOTAS then
  1273.           FileFlags:=FileFlags+[fsDiskQuotasSupport];
  1274.       end;
  1275.     end else begin
  1276.       SectorsPerCluster:=0;
  1277.       BytesPerSector:=0;
  1278.       FreeClusters:=0;
  1279.       TotalClusters:=0;
  1280.       Capacity:=0;
  1281.       FreeSpace:=0;
  1282.       VolumeLabel:='';
  1283.       SerialNumber:='';
  1284.       FileSystem:='';
  1285.       Serial:=0;
  1286.     end;
  1287.   end;
  1288. end;
  1289. function TspSkinFileListView.GetMediaTypeStr(MT: TMediaType): String;
  1290. begin
  1291.   case MT of
  1292.     dtUnknown: Result:='<unknown>';
  1293.     dtNotExists: Result:='<not exists>';
  1294.     dtRemovable: Result:='Removable';
  1295.     dtFixed: Result:='Fixed';
  1296.     dtRemote: Result:='Remote';
  1297.     dtCDROM: Result:='CDROM';
  1298.     dtRAMDisk: Result:='RAM';
  1299.   end;
  1300. end;
  1301. { ================================TspSkinDirTreeView ==============================}
  1302. const
  1303.   InvalidDOSChars = '*?/="<>|:,;+^';
  1304.   
  1305. function GetNormalIcon(Path: string): integer;
  1306. var
  1307.   sfi: TShFileInfo;
  1308. begin
  1309.   SHGetFileInfo(Pchar(Path), 0, sfi, SizeOf(TSHFileInfo),
  1310.     SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
  1311.   Result := sfi.iIcon;
  1312. end;
  1313. function GetSelectedIcon(Path: string): Integer;
  1314. var
  1315.   sfi: TShFileInfo;
  1316. begin
  1317.   SHGetFileInfo(Pchar(Path), 0, sfi, sizeOf(TSHFileInfo),
  1318.     SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_OPENICON);
  1319.   Result := sfi.iIcon;
  1320. end;
  1321. function DelSlash(Path: string): string;
  1322. begin
  1323.   Result := Path;
  1324.   if Path <> '' then
  1325.     if Path[Length(Path)] = '' then
  1326.       Delete(Result, Length(Path), 1);
  1327. end;
  1328. function AddSlash(Path: string): string;
  1329. begin
  1330.   if Path = '' then exit;
  1331.   if Path[Length(Path)] <> '' then
  1332.     Result := Path + ''
  1333.   else
  1334.     Result := Path;
  1335. end;
  1336. function DiskinDrive(Drive: Char; ShowMsg: word; SM: TspSkinMessage): Boolean;
  1337. var
  1338.   ErrorMode: word;
  1339. begin
  1340.   if Drive in ['a'..'z'] then
  1341.     Dec(Drive, $20);
  1342.   if not (Drive in ['A'..'Z']) then
  1343.   if SM = nil
  1344.   then
  1345.     MessageDlg(SP_NOVALIDDRIVEID, mtError, [mbOK], 0)
  1346.   else
  1347.     SM.MessageDlg(SP_NOVALIDDRIVEID, mtError, [mbOK], 0);
  1348.   ErrorMode := SetErrorMode(SEM_FailCriticalErrors);
  1349.   try
  1350.     if DiskSize(Ord(Drive) - $40) = -1 then
  1351.     begin
  1352.       if ShowMsg > 0 then
  1353.       begin
  1354.         MessageBeep(MB_IconHand);
  1355.         if SM = nil
  1356.         then
  1357.           MessageDlg(SP_NODISKINDRIVE, mtWarning, [mbOK], 0)
  1358.         else
  1359.           SM.MessageDlg(SP_NODISKINDRIVE,
  1360.             mtWarning, [mbOK], 0);
  1361.       end;
  1362.       Result := False
  1363.     end
  1364.     else
  1365.       Result := True;
  1366.   finally
  1367.     SetErrorMode(ErrorMode);
  1368.   end;
  1369. end;
  1370. function AddNullToStr(Path: string): string;
  1371. begin
  1372.   if Path = '' then exit;
  1373.   if Path[Length(Path)] <> #0 then
  1374.     Result := Path + #0
  1375.   else
  1376.     Result := Path;
  1377. end;
  1378. function StrContains(Str1, Str2: string): Boolean;
  1379. var
  1380.   i: Integer;
  1381. begin
  1382.   for i := 1 to Length(Str1) do
  1383.     if Pos(Str1[i], Str2) <> 0 then
  1384.     begin
  1385.       Result := True;
  1386.       Exit;
  1387.     end;
  1388.   Result := False;
  1389. end; 
  1390. function DoSHFileOp(Handle: THandle; OpMode: UInt; Src: string;
  1391.   Dest: string; var Aborted: Boolean): Boolean;
  1392. var
  1393.   ipFileOp: TSHFileOpStruct;
  1394. begin
  1395.   Src := AddNullToStr(Src);
  1396.   Dest := AddNullToStr(Dest);
  1397.   FillChar(ipFileOp, SizeOf(ipFileOp), 0);
  1398.   with ipFileOp do
  1399.   begin
  1400.     wnd := GetActiveWindow;  
  1401.     wFunc := OpMode;
  1402.     pFrom := pChar(Src);
  1403.     pTo := pChar(Dest);
  1404.     fFlags := FOF_ALLOWUNDO;
  1405.     fAnyOperationsAborted := Aborted;
  1406.     hNameMappings := nil;
  1407.     lpszProgressTitle := '';
  1408.   end;
  1409.   Result := SHFileOperation(ipFileOp) = 0;
  1410.   if ipFileOp.fAnyOperationsAborted = True then
  1411.     Result := False;
  1412. end;
  1413. procedure TspSkinDirTreeView.CreateWnd;
  1414. begin
  1415.   inherited CreateWnd;
  1416.   if not (csLoading in ComponentState)
  1417.   then
  1418.     begin
  1419.       ReLoad;
  1420.       if Items.GetFirstNode <> nil then
  1421.       Items.GetFirstNode.Expand(False);
  1422.     end;  
  1423. end;
  1424. constructor TspSkinDirTreeView.Create;
  1425. var
  1426.   sfi: TShFileInfo;
  1427.   hImgLst: Uint;
  1428. begin
  1429.   inherited Create(AOwner);
  1430.   OldTreeViewPath := '';
  1431.   ReadOnly := True;
  1432.   Width := 180;
  1433.   Height := 120;
  1434.   Images := TImageList.Create(Self);
  1435.   hImgLst := SHGetFileInfo('', 0,
  1436.     sfi, SizeOf(sfi),
  1437.     SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
  1438.   if hImgLst <> 0 then
  1439.   begin
  1440.     Images.Handle := hImgLst;
  1441.     Images.ShareImages := True;
  1442.   end;
  1443.   OnExpanding := Expanding;
  1444.   SortType := stNone;
  1445.   HideSelection := False;
  1446.   FIsNewFolder := False;
  1447.   FisCutCopy := False;
  1448.   FSkinMessage := nil;
  1449. end;
  1450. destructor TspSkinDirTreeView.Destroy;
  1451. var
  1452.   i: integer;
  1453. begin
  1454.   for i := Items.Count - 1 downto 0 do
  1455.     Items[i].Free;
  1456.   Images.Free;
  1457.   inherited Destroy;
  1458. end;
  1459. procedure TspSkinDirTreeView.ChangeSkinData;
  1460. begin
  1461.   inherited;
  1462.   IMages.BkColor := Self.Color;
  1463. end;
  1464. procedure TspSkinDirTreeView.Notification;
  1465. begin
  1466.   inherited Notification(AComponent, Operation);
  1467.   if (Operation = opRemove) and (AComponent = FSkinMessage)
  1468.   then
  1469.     FSkinMessage := nil;
  1470. end;
  1471. function TspSkinDirTreeView.GetDirectory: String;
  1472. begin
  1473.   Result := GetPathFromNode(Self.Selected);
  1474. end;
  1475. procedure TspSkinDirTreeView.SetDirectory(Value: String);
  1476. begin
  1477.   OpenPath(Value);
  1478. end;
  1479. procedure TspSkinDirTreeView.LoadRoot;
  1480. var
  1481.   Sfi: TSHFileInfo;
  1482.   Root: TTreenode;
  1483.   idRoot: PItemIDList;
  1484. begin
  1485.   Items.BeginUpdate;
  1486.   Items.Clear;
  1487.   if SHGetSpecialFolderLocation(Handle, CSIDL_DRIVES, idRoot) = NOERROR then
  1488.     if SHGetFileInfo(PChar(idRoot), 0, Sfi, SizeOf(TSHFileInfo), SHGFI_PIDL
  1489.       or
  1490.       SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_DISPLAYNAME) <> 0 then
  1491.     begin
  1492.       Root := items.AddFirst(nil, Sfi.szDisplayName);
  1493.       Root.ImageIndex := Sfi.iIcon;
  1494.       Root.SelectedIndex := Sfi.iIcon;
  1495.     end;
  1496.   Items.EndUpdate;
  1497. end; 
  1498. procedure TspSkinDirTreeView.LoadDrives;
  1499. var
  1500.   ADrive: integer;
  1501.   DriveLetter: char;
  1502.   DriveString: string;
  1503.   DrvName: string;
  1504.   Sfi: TSHFileInfo;
  1505. begin
  1506.   Items.BeginUpdate;
  1507.   Integer(Drives) := GetLogicalDrives;
  1508.   for ADrive := 0 to 25 do
  1509.   begin
  1510.     if ADrive in Drives then
  1511.     begin
  1512.       DriveLetter := Chr(ADrive + ord('A'));
  1513.       DriveString := DriveLetter + ':';
  1514.       SHGetFileInfo(PChar(DriveString), 0, Sfi, SizeOf(Sfi),
  1515.         SHGFI_DISPLAYNAME);
  1516.       DrvName := Copy(Sfi.szDisplayName, 1, (Pos('(', Sfi.szDisplayName) - 1));
  1517.       with Items do
  1518.       begin
  1519.         AddChild(Items[0], ' (' + DriveLetter + ':)  ' + DrvName);
  1520.         ShowButtons := True;
  1521.         Items[Count - 1].HasChildren := True;
  1522.         Items[Count - 1].ImageIndex := GetNormalIcon(DriveString);
  1523.         Items[Count - 1].SelectedIndex := GetSelectedIcon(DriveString);
  1524.       end;
  1525.     end;
  1526.   end;
  1527.   Items.EndUpdate;
  1528. end; 
  1529. procedure TspSkinDirTreeView.MakePath(Node: TTreeNode);
  1530.   procedure MakeSubPath;
  1531.   begin
  1532.     if Node.Level = 1 then
  1533.       TreeViewPath := Copy(Node.Text, 3, 2) + '' + TreeViewPath
  1534.     else if Node.Level > 1 then
  1535.       if TreeViewPath = '' then
  1536.         TreeViewPath := Node.Text
  1537.       else
  1538.         TreeViewPath := Node.Text + '' + TreeViewPath;
  1539.   end;
  1540. begin
  1541.   TreeViewPath := '';
  1542.   MakeSubPath;
  1543.   while Node.Parent <> nil do
  1544.   begin
  1545.     Node := Node.Parent;
  1546.     MakeSubPath;
  1547.   end;
  1548. end;
  1549. procedure TspSkinDirTreeView.AddSubs(Path: string; Node: TTreeNode);
  1550. var
  1551.   ANode: TTreeNode;
  1552.   APath: string;
  1553.   hFindFile: THandle;
  1554.   Win32FD: TWin32FindData;
  1555.   function IsDirectory(dWin32FD: TWin32FindData): Boolean;
  1556.   var
  1557.     FName: string;
  1558.   begin
  1559.     FName := StrPas(dWin32FD.cFileName);
  1560.     with dWin32FD do
  1561.       Result := (dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY =
  1562.         FILE_ATTRIBUTE_DIRECTORY) and (FName <> '.') and (FName <> '..');
  1563.   end; 
  1564.   function HasSubs(sPath: string): Boolean;
  1565.   var
  1566.     sAPath: string;
  1567.     shFindFile: THandle;
  1568.     sWin32FD: TWin32FindData;
  1569.   begin
  1570.     Result := False;
  1571.     sAPath := sPath;
  1572.     sAPath := AddSlash(sAPath);
  1573.     shFindFile := FindFirstFile(PChar(sAPath + '*.*'), sWin32FD);
  1574.     if shFindFile <> INVALID_HANDLE_VALUE then
  1575.     try
  1576.       repeat
  1577.         if IsDirectory(sWin32FD) then
  1578.         begin
  1579.           Result := True;
  1580.           Break;
  1581.         end;
  1582.       until not FindNextFile(shFindFile, sWin32FD);
  1583.     finally
  1584.       Windows.FindClose(shFindFile);
  1585.     end;
  1586.   end; 
  1587. begin
  1588.   if (Length(Path) = 3) and (Pos(':', Path) <> 0)
  1589.   then
  1590.     begin
  1591.       if not DiskInDrive(Path[1], 1, FSkinMessage)
  1592.       then
  1593.         Exit;
  1594.     end;
  1595.   APath := Path;
  1596.   APath := AddSlash(APath);
  1597.   hFindFile := FindFirstFile(PChar(APath + '*.*'), Win32FD);
  1598.   if hFindFile <> INVALID_HANDLE_VALUE then
  1599.   try
  1600.     repeat
  1601.       if IsDirectory(Win32FD) then
  1602.       begin
  1603.         ANode := Items.AddChild(Node, Win32FD.cFileName);
  1604.         ANode.HasChildren := HasSubs(APath + Win32FD.cFileName);
  1605.         ANode.ImageIndex := GetNormalIcon(APath + Win32FD.cFileName);
  1606.         ANode.SelectedIndex := GetSelectedIcon(APath + Win32FD.cFileName);
  1607.       end;
  1608.     until not FindNextFile(hFindFile, Win32FD);
  1609.   finally
  1610.     Windows.FindClose(hFindFile);
  1611.   end;
  1612. end; 
  1613. procedure TspSkinDirTreeView.ReLoad;
  1614. begin
  1615.   Items.BeginUpdate;
  1616.   Items.Clear;
  1617.   LoadRoot;
  1618.   LoadDrives;
  1619.   Items.EndUpdate;
  1620. end; 
  1621. procedure TspSkinDirTreeView.Loaded;
  1622. begin
  1623.   inherited Loaded;
  1624.   Reload;
  1625.   if Items.GetFirstNode <> nil then
  1626.     Items.GetFirstNode.Expand(False);
  1627. end; 
  1628. procedure TspSkinDirTreeView.Expanding(Sender: TObject; Node: TTreeNode;
  1629.   var AllowExpansion: Boolean);
  1630. var
  1631.   OldCursor: TCursor;
  1632. begin
  1633.   if Node.GetFirstChild = nil then
  1634.   begin
  1635.     OldCursor := Screen.Cursor;
  1636.     Screen.Cursor := crHourGlass;
  1637.     try
  1638.       MakePath(Node);
  1639.       Node.HasChildren := false;
  1640.       AddSubs(TreeViewPath, Node);
  1641.       Node.AlphaSort;
  1642.     finally
  1643.       Screen.Cursor := OldCursor;
  1644.     end;
  1645.   end;
  1646. end;
  1647. procedure TspSkinDirTreeView.MouseDown(Button: TMouseButton;
  1648.   Shift: TShiftState; X, Y: Integer);
  1649. var
  1650.   vHitTest: THitTests;
  1651.   DrvChar: Char;
  1652. begin
  1653.   inherited MouseDown(button, shift, x, y);
  1654.   TreeViewPath := '';
  1655.   FPreviousPath := FSelectedPath;
  1656.   vHitTest := GetHitTestInfoAt(X, Y);
  1657.   if (htOnItem in vHitTest) or (htOnIcon in vHitTest) or
  1658.      (htOnButton in vHitTest) then
  1659.   begin
  1660.     Selected := GetNodeAt(X, Y);
  1661.     if (Selected.Level = 0) and (Items[0].getFirstChild = nil) then
  1662.       LoadDrives
  1663.     else
  1664.       MakePath(Selected);
  1665.     if Selected = Items[0] then
  1666.       FSelectedPath := 'Drives'
  1667.     else
  1668.       FSelectedPath := TreeViewPath;
  1669.     if Selected.Level = 1 then
  1670.       if GetDriveType(PChar(FSelectedPath)) in
  1671.            [DRIVE_REMOVABLE, DRIVE_CDROM] then
  1672.       begin
  1673.         DrvChar := FSelectedPath[1];
  1674.         if not DiskInDrive(DrvChar, 1, FSkinMessage) then
  1675.         begin
  1676.           OpenPath(FPreviousPath);
  1677.           exit;
  1678.         end;
  1679.       end;
  1680.     FPreviousPath := FSelectedPath;
  1681.   end;
  1682. end;
  1683. procedure TspSkinDirTreeView.SetSelectedPath(Value: string);
  1684. begin
  1685.   if AnsiCompareText(Value, FSelectedPath) = 0 then
  1686.     exit;
  1687.   FSelectedPath := Value;
  1688. end;
  1689. procedure TspSkinDirTreeView.SetInitialDir(Value: string);
  1690. begin
  1691.   if (Value = '') or (AnsiCompareText(Value, FInitialDir) = 0)  then
  1692.     exit;
  1693.   Value := AddSlash(Value);
  1694.   if (not DirectoryExists(Value)) then
  1695.     exit
  1696.   else begin
  1697.     FInitialDir := Value;
  1698.     OpenPath(FInitialDir);
  1699.   end;
  1700. end;
  1701. procedure TspSkinDirTreeView.OpenPath(dPath: string);
  1702. var
  1703.   CurNode: TTreeNode;
  1704.   count: Integer;
  1705.   TempPath: string;
  1706.   CurPath: string;
  1707.   FullPath: string;
  1708. begin
  1709.   if (dPath = '') or (Length(dPath) = 1) then Exit;
  1710.   if (Length(dPath) = 3) and (Pos(':', dPath) <> 0) and
  1711.       not DiskInDrive(dPath[1], 1, SkinMessage)
  1712.   then
  1713.      Exit;
  1714.   if not DirectoryExists(dPath) then exit;
  1715.   dPath := AddSlash(dPath);
  1716.   FullPath := dPath;
  1717.   Items.BeginUpdate;
  1718.   CurNode := Items.GetFirstNode;  
  1719.   if CurNode.getFirstChild = nil then
  1720.     LoadDrives;
  1721.   CurNode := Items.GetFirstNode;
  1722.   while Pos('', dPath) > 0 do
  1723.   begin
  1724.     count := Pos('', dPath);
  1725.     tempPath := Copy(dPath, 1, count);
  1726.     dPath := Copy(dPath, count + 1, Length(dPath));
  1727.     CurNode := CurNode.getFirstChild;
  1728.     while CurNode <> nil do
  1729.     begin
  1730.       if CurNode.Level = 1 then
  1731.         CurPath := Copy(CurNode.Text, 3, 2) + ''
  1732.       else if CurNode.Level > 1 then
  1733.         CurPath := CurNode.Text + '';
  1734.       if AnsiCompareText(CurPath, tempPath) = 0 then
  1735.       begin
  1736.         CurNode.Selected := True;
  1737.         CurNode.Expand(False);
  1738.         Break;
  1739.       end;
  1740.       CurNode := CurNode.GetNext;
  1741.       if CurNode = nil then exit;
  1742.     end;
  1743.   end;
  1744.   Items.EndUpdate;
  1745.   if AnsiCompareText(FSelectedPath, FullPath) <> 0 then
  1746.   begin
  1747.     FullPath := AddSlash(FullPath);
  1748.     FSelectedPath := FullPath;
  1749.   end;
  1750. end;
  1751. procedure TspSkinDirTreeView.KeyUp(var Key: Word; Shift: TShiftState);
  1752. var
  1753.   DrvChar: Char;
  1754. begin
  1755.   if (Key = VK_UP) or (Key = VK_DOWN) or (Key = VK_LEFT) or (Key = VK_RIGHT) then
  1756.   begin
  1757.     inherited KeyUp(Key, Shift);
  1758.     if selected = nil then exit;
  1759.     if (Selected.Level = 0) and (Items[0].getFirstChild = nil) then
  1760.       LoadDrives
  1761.     else
  1762.       MakePath(Selected);
  1763.     if (Selected.Level = 0) then
  1764.       FSelectedPath := 'Drives'
  1765.     else
  1766.       FSelectedPath := TreeViewPath;
  1767.     if Selected.Level = 1 then
  1768.       if GetDriveType(PChar(FSelectedPath)) in
  1769.         [DRIVE_REMOVABLE, DRIVE_CDROM] then
  1770.       begin
  1771.         DrvChar := FSelectedPath[1];
  1772.         if not DiskInDrive(DrvChar, 1, FSkinMessage) then
  1773.           exit;
  1774.       end;
  1775.   end;
  1776.   if Key=VK_F5 then
  1777.   begin
  1778.     Reload;
  1779.     OpenPath(FSelectedPath);
  1780.   end;
  1781. end;
  1782. function TspSkinDirTreeView.GetPathFromNode(Node: TTreeNode): string;
  1783. begin
  1784.   Result := '';
  1785.   if Node = nil then exit;
  1786.   if Assigned(Node) then
  1787.   begin
  1788.     MakePath(Node);
  1789.     Result := TreeViewPath;
  1790.   end;
  1791. end;
  1792. function TspSkinDirTreeView.CanEdit(Node: TTreeNode): Boolean;
  1793. begin
  1794.   Result := False;
  1795.   if (Assigned(Node.Parent)) and (Node.Level > 1) and
  1796.     (not ReadOnly) then
  1797.     Result := inherited CanEdit(Node);
  1798. end;
  1799. procedure TspSkinDirTreeView.Edit(const Item: TTVItem);
  1800. var
  1801.   OldDirName: string;
  1802.   NewDirName: string;
  1803.   Aborted: Boolean;
  1804.   OldCur: TCursor;
  1805.   Rslt: Boolean;
  1806.   SelNode: TTreeNode;
  1807.   PrevNode: TTreeNode;
  1808.   function GetNodeFromItem(Item: TTVItem): TTreeNode;
  1809.   begin
  1810.     with Item do
  1811.       if (State and TVIF_PARAM) <> 0 then
  1812.         Result := Pointer(lParam)
  1813.       else
  1814.         Result := Items.GetNode(hItem);
  1815.   end;
  1816. begin
  1817.   SelNode := GetNodeFromItem(Item);
  1818.   PrevNode := SelNode.Parent;
  1819.   if not Assigned(SelNode) then exit;
  1820.   if (SelNode = Items[0]) or (SelNode.Level = 1) then
  1821.     exit;
  1822.   if (Length(Item.pszText) = 0)
  1823.     or (StrContains(InvalidDosChars, Item.pszText)) then
  1824.   begin
  1825.     MessageBeep(MB_ICONHAND);
  1826.     if (Length(Item.pszText) > 0) then Exit;
  1827.   end;
  1828.   if SelNode <> nil then
  1829.     OldDirName := GetPathFromNode(SelNode);
  1830.   if OldDirName = '' then exit;
  1831.   OldCur := Screen.Cursor;
  1832.   Screen.Cursor := crHourGlass;
  1833.   try
  1834.     Aborted := False;
  1835.     OldDirName := DelSlash(OldDirName);
  1836.     NewDirName := ExtractFilePath(OldDirName) + Item.pszText;
  1837.     if (OldDirName <> NewDirName) and (Item.pszText <> nil)
  1838.     then
  1839.       Rslt := DoSHFileOp(Parent.Handle, FO_RENAME, OldDirName,
  1840.       NewDirName, Aborted);
  1841.     if Rslt then
  1842.     begin
  1843.       inherited Edit(Item);
  1844.       Selected := PrevNode;
  1845.     end;
  1846.   finally
  1847.     Screen.Cursor := OldCur;
  1848.     FIsNewFolder := False;
  1849.   end;
  1850. end;
  1851. constructor TspSkinShellDriveComboBox.Create(AOwner: TComponent);
  1852. begin
  1853.   inherited Create(AOwner);
  1854.   Style := spcbFixedStyle;
  1855.   OnListBoxDrawItem := DrawItem;
  1856.   OnComboBoxDrawItem := DrawItem;
  1857.   Drives := TStringList.Create;
  1858.   Images := TImagelist.CreateSize(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON));
  1859.   with Images do
  1860.   begin
  1861.     DrawingStyle := dsTransparent;
  1862.     ShareImages := True;
  1863.   end;
  1864. end;
  1865. destructor TspSkinShellDriveComboBox.Destroy;
  1866. begin
  1867.   Drives.Free;
  1868.   Images.Free;
  1869.   inherited Destroy;
  1870. end;
  1871. procedure TspSkinShellDriveComboBox.BuildList;
  1872. var
  1873.   Info      : TSHFileInfo;
  1874.   DriveChar : Char;
  1875.   CurrDrive : string;
  1876.   DriveType:Integer;
  1877. begin
  1878.   if Items.Count > 0
  1879.   then
  1880.     begin
  1881.       if ItemIndex > -1 then DriveItemIndex := ItemIndex;
  1882.       Items.Clear;
  1883.     end;
  1884.   Images.Handle := SHGetFileInfo('', 0, Info, SizeOf(TShFileInfo), SHGFI);
  1885.   for DriveChar:='A' to 'Z' do
  1886.   begin
  1887.     CurrDrive := DriveChar + ':';
  1888.     DriveType := GetDriveType(PChar(CurrDrive));
  1889.     if DriveType in [0,1] then Continue;
  1890.     SHGetFileInfo(PChar(CurrDrive), 0, Info, SizeOf(TShFileInfo), SHGFI_DISPLAYNAME or SHGFI);
  1891.     Items.AddObject(Info.szDisplayName, TObject(Info.iIcon));
  1892.     Drives.Add(DriveChar);
  1893.   end;
  1894.   SetDrive(Drives[DriveItemIndex][1]);
  1895.   Update;
  1896. end;
  1897. procedure TspSkinShellDriveComboBox.CreateWnd;
  1898. begin
  1899.   inherited CreateWnd;
  1900.   BuildList;
  1901. end;
  1902. procedure TspSkinShellDriveComboBox.DrawItem;
  1903. var
  1904.   ImageTop: Integer;
  1905. begin
  1906.   if Images.Count > 0
  1907.   then
  1908.     begin
  1909.       ImageTop := TextRect.Top + ((TextRect.Bottom - TextRect.Top - Images.Height) div 2);
  1910.       Images.Draw(Cnvs, TextRect.Left, ImageTop, Integer(Items.Objects[Index]));
  1911.       TextRect.Left := TextRect.Left + Images.Width + 4;
  1912.     end;
  1913.   Cnvs.TextOut(TextRect.Left,
  1914.   TextRect.Top + (TextRect.Bottom - TextRect.Top) div 2 - Cnvs.TextHeight('Wg') div 2,
  1915.   Items[Index]);
  1916. end;
  1917. procedure TspSkinShellDriveComboBox.SetDrive(Value: Char);
  1918. var
  1919.   i: Integer;
  1920.   j: Integer;
  1921. begin
  1922.   j := 0;
  1923.   if DriveItemIndex <> -1 then j := DriveItemIndex;
  1924.   Value := UpCase(Value);
  1925.   if FDrive <> Value
  1926.   then
  1927.     begin
  1928.       for i := 0 to Items.Count - 1 do
  1929.          if Drives[i][1] = Value
  1930.          then
  1931.            begin
  1932.              FDrive := Value;
  1933.              DriveItemIndex := i;
  1934.              ItemIndex := i;
  1935.              Exit;
  1936.            end;
  1937.     end
  1938.   else
  1939.     if ItemIndex <> j then ItemIndex := j;
  1940. end;
  1941. procedure TspSkinShellDriveComboBox.Change;
  1942. begin
  1943.   if ItemIndex <> -1 then DriveItemIndex := ItemIndex;
  1944.   SetDrive(Drives[DriveItemIndex][1]);
  1945.   if Assigned(FOnChange) then FOnChange(Self);
  1946. end;
  1947. procedure TspSkinShellDriveComboBox.UpdateDrives;
  1948. var
  1949.   Info : TSHFileInfo;
  1950. begin
  1951.   if Assigned(Images) then Images.Free;
  1952.   Images := TImagelist.CreateSize(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON));
  1953.   with Images do
  1954.   begin
  1955.     DrawingStyle := dsTransparent;
  1956.     ShareImages := True;
  1957.   end;
  1958.   Images.Handle := SHGetFileInfo('', 0, Info, SizeOf(TShFileInfo), SHGFI);
  1959.   BuildList;
  1960. end;
  1961. {Dialogs}
  1962. constructor TspSelDirDlgForm.Create(AOwner: TComponent);
  1963. begin
  1964.   inherited CreateNew(AOwner);
  1965.   KeyPreview := True;
  1966.   Position := poScreenCenter;
  1967.   DSF := TspDynamicSkinForm.Create(Self);
  1968.   DirTreeViewPanel := TspSkinPanel.Create(Self);
  1969.   with DirTreeViewPanel do
  1970.   begin
  1971.     Parent := Self;
  1972.     Align := alClient;
  1973.     BorderStyle := bvFrame;
  1974.     Height := 200;
  1975.   end;
  1976.   VScrollBar := TspSkinScrollBar.Create(Self);
  1977.   with VScrollBar do
  1978.   begin
  1979.     Kind := sbVertical;
  1980.     Parent := DirTreeViewPanel;
  1981.     Align := alRight;
  1982.     DefaultWidth := 19;
  1983.     Enabled := False;
  1984.     SkinDataName := 'vscrollbar';
  1985.   end;
  1986.   HScrollBar := TspSkinScrollBar.Create(Self);
  1987.   with HScrollBar do
  1988.   begin
  1989.     Parent := DirTreeViewPanel;
  1990.     Align := alBottom;
  1991.     DefaultHeight := 19;
  1992.     Enabled := False;
  1993.     BothMarkerWidth := 19;
  1994.     SkinDataName := 'hscrollbar';
  1995.   end;
  1996.   DirTreeView := TspSkinDirTreeView.Create(Self);
  1997.   with DirTreeView do
  1998.   begin
  1999.     Parent := DirTreeViewPanel;
  2000.     Align := alClient;
  2001.     HScrollBar := Self.HScrollBar;
  2002.     VScrollBar := Self.VScrollBar;
  2003.     HideSelection := False;
  2004.   end;
  2005.   BottomPanel := TspSkinPanel.Create(Self);
  2006.   with BottomPanel do
  2007.   begin
  2008.     Parent := Self;
  2009.     Align := alBottom;
  2010.     BorderStyle := bvNone;
  2011.     Height := 50;
  2012.   end;
  2013.   OkButton := TspSkinButton.Create(Self);
  2014.   with OkButton do
  2015.   begin
  2016.     Default := True;
  2017.     Caption := SP_MSG_BTN_OK;
  2018.     CanFocused := True;
  2019.     Left := 20;
  2020.     Top := 15;
  2021.     Width := 70;
  2022.     DefaultHeight := 25;
  2023.     Parent := BottomPanel;
  2024.     ModalResult := mrOk;
  2025.   end;
  2026.   CancelButton := TspSkinButton.Create(Self);
  2027.   with CancelButton do
  2028.   begin
  2029.     Caption := SP_MSG_BTN_CANCEL;
  2030.     CanFocused := True;
  2031.     Left := 100;
  2032.     Top := 15;
  2033.     Width := 70;
  2034.     DefaultHeight := 25;
  2035.     Parent := BottomPanel;
  2036.     ModalResult := mrCancel;
  2037.     Cancel := True;
  2038.   end;
  2039. end;
  2040. constructor TspSkinSelectDirectoryDialog.Create(AOwner: TComponent);
  2041. begin
  2042.   inherited Create(AOwner);
  2043.   FSkinMessage := nil;
  2044.   DialogWidth := 0;
  2045.   DialogHeight := 0;
  2046.   FAlphaBlend := False;
  2047.   FAlphaBlendAnimation := False;
  2048.   FAlphaBlendValue := 200;
  2049.   FTitle := 'Select folder';
  2050.   FDefaultFont := TFont.Create;
  2051.   with FDefaultFont do
  2052.   begin
  2053.     Name := 'Arial';
  2054.     Style := [];
  2055.     Height := 14;
  2056.   end;
  2057.   FDirectory := ''; 
  2058. end;
  2059. destructor TspSkinSelectDirectoryDialog.Destroy;
  2060. begin
  2061.   FDefaultFont.Free;
  2062.   inherited Destroy;
  2063. end;
  2064. procedure TspSkinSelectDirectoryDialog.SetDefaultFont;
  2065. begin
  2066.   FDefaultFont.Assign(Value);
  2067. end;
  2068. procedure TspSkinSelectDirectoryDialog.Notification;
  2069. begin
  2070.   inherited Notification(AComponent, Operation);
  2071.   if (Operation = opRemove) and (AComponent = FSD) then FSD := nil;
  2072.   if (Operation = opRemove) and (AComponent = FCtrlFSD) then FCtrlFSD := nil;
  2073.   if (Operation = opRemove) and (AComponent = FSkinMessage)
  2074.   then
  2075.     FSkinMessage := nil;
  2076. end;
  2077. function TspSkinSelectDirectoryDialog.GetTitle: string;
  2078. begin
  2079.   Result := FTitle;
  2080. end;
  2081. procedure TspSkinSelectDirectoryDialog.SetTitle(const Value: string);
  2082. begin
  2083.   FTitle := Value;
  2084. end;
  2085. procedure TspSkinSelectDirectoryDialog.Change;
  2086. begin
  2087.   if Assigned(FOnChange) then FOnChange(Self);
  2088. end;
  2089. function TspSkinSelectDirectoryDialog.Execute: Boolean;
  2090. var
  2091.   FW, FH: Integer;
  2092. begin
  2093.   FDlgFrm := TspSelDirDlgForm.Create(Application);
  2094.   with FDlgFrm do
  2095.   try
  2096.     Caption := Self.Title;
  2097.     DSF.BorderIcons := [];
  2098.     DSF.SkinData := FSD;
  2099.     DSF.MenusSkinData := CtrlSkinData;
  2100.     DSF.AlphaBlend := AlphaBlend;
  2101.     DSF.AlphaBlendAnimation := AlphaBlendAnimation;
  2102.     DSF.AlphaBlendValue := AlphaBlendValue;
  2103.     //
  2104.     DirTreeViewPanel.SkinData := FCtrlFSD;
  2105.     DirTreeView.DefaultFont := DefaultFont;
  2106.     DirTreeView.SkinData := FCtrlFSD;
  2107.     DirTreeView.SkinMessage := FSkinMessage;
  2108.     if FDirectory <> '' then DirTreeView.OpenPath(FDirectory);
  2109.     //
  2110.     HScrollBar.SkinData := FCtrlFSD;
  2111.     VScrollBar.SkinData := FCtrlFSD;
  2112.     OkButton.SkinData := FCtrlFSD;
  2113.     CancelButton.SkinData := FCtrlFSD;
  2114.     BottomPanel.SkinData := FCtrlFSD;
  2115.     OkButton.DefaultFont := DefaultFont;
  2116.     CancelButton.DefaultFont := DefaultFont;
  2117.     if (DialogWidth <> 0)
  2118.     then
  2119.       begin
  2120.         FW := DialogWidth;
  2121.         FH := DialogHeight;
  2122.       end
  2123.     else
  2124.       begin
  2125.         FW := 250;
  2126.         FH := 250;
  2127.       end;
  2128.     if (SkinData <> nil) and not SkinData.Empty
  2129.     then
  2130.       begin
  2131.         if FW < DSF.GetMinWidth then FW := DSF.GetMinWidth;
  2132.         if FH < DSF.GetMinHeight then FH := DSF.GetMinHeight;
  2133.       end;
  2134.     ClientWidth := FW;
  2135.     ClientHeight := FH;
  2136.     Result := (ShowModal = mrOk);
  2137.     DialogWidth := ClientWidth;
  2138.     DialogHeight := ClientHeight;
  2139.     if Result
  2140.     then
  2141.       begin
  2142.         FDirectory := FDlgFrm.DirTreeView.Directory;
  2143.         Change;
  2144.       end;
  2145.   finally
  2146.     Free;
  2147.     FDlgFrm := nil;
  2148.   end;
  2149. end;
  2150. constructor TspOpenDlgForm.CreateEx(AOwner: TComponent; ASaveMode: Boolean);
  2151. begin
  2152.   inherited CreateNew(AOwner);
  2153.   SaveMode := ASaveMode;
  2154.   KeyPreview := True;
  2155.   Position := poScreenCenter;
  2156.   DSF := TspDynamicSkinForm.Create(Self);
  2157.   FromFLV := False;
  2158.   FromFTV := False;
  2159.   ToolPanel := TspSkinPanel.Create(Self);
  2160.   with ToolPanel do
  2161.   begin
  2162.     BorderStyle := bvNone;
  2163.     Parent := Self;
  2164.     Align := alTop;
  2165.     DefaultHeight := 25;
  2166.     SkinDataName := 'toolpanel';
  2167.   end;
  2168.   BackToolButton := TspSkinSpeedButton.Create(Self);
  2169.   with BackToolButton do
  2170.   begin
  2171.     Parent := ToolPanel;
  2172.     DefaultHeight := 25;
  2173.     DefaultWidth := 70;
  2174.     SkinDataName := 'toolbutton';
  2175.     Align := alLeft;
  2176.     OnClick := BackToolButtonClick;
  2177.     NumGlyphs := 1;
  2178.     Glyph.LoadFromResourceName(HInstance, 'SP_UP');
  2179.   end;
  2180.   MyDocToolButton := TspSkinSpeedButton.Create(Self);
  2181.   with MyDocToolButton do
  2182.   begin
  2183.     Parent := ToolPanel;
  2184.     DefaultWidth := 27;
  2185.     SkinDataName := 'toolbutton';
  2186.     Align := alRight;
  2187.     OnClick := MyDocToolButtonClick;
  2188.     NumGlyphs := 1;
  2189.     Glyph.LoadFromResourceName(HInstance, 'SP_MYDOC');
  2190.   end;
  2191.   //
  2192.   Bevel1 := TspSkinBevel.Create(Self);
  2193.   with Bevel1 do
  2194.   begin
  2195.     Parent := ToolPanel;
  2196.     Width := 27;
  2197.     Align := alRight;
  2198.     DividerMode := True;
  2199.   end;
  2200.   //
  2201.   ListToolButton := TspSkinSpeedButton.Create(Self);
  2202.   with ListToolButton do
  2203.   begin
  2204.     Parent := ToolPanel;
  2205.     DefaultWidth := 27;
  2206.     SkinDataName := 'toolbutton';
  2207.     Align := alRight;
  2208.     GroupIndex := 1;
  2209.     Down := True;
  2210.     OnClick := ListToolButtonClick;
  2211.     NumGlyphs := 1;
  2212.     Glyph.LoadFromResourceName(HInstance, 'SP_LISTSTYLE');
  2213.   end;
  2214.   SmallIconToolButton := TspSkinSpeedButton.Create(Self);
  2215.   with SmallIconToolButton do
  2216.   begin
  2217.     Parent := ToolPanel;
  2218.     DefaultWidth := 27;
  2219.     SkinDataName := 'toolbutton';
  2220.     Align := alRight;
  2221.     GroupIndex := 1;
  2222.     OnClick := SmallIconToolButtonClick;
  2223.     NumGlyphs := 1;
  2224.     Glyph.LoadFromResourceName(HInstance, 'SP_SMALLICONSTYLE');
  2225.   end;
  2226.   IconToolButton := TspSkinSpeedButton.Create(Self);
  2227.   with IconToolButton do
  2228.   begin
  2229.     Parent := ToolPanel;
  2230.     DefaultWidth := 27;
  2231.     SkinDataName := 'toolbutton';
  2232.     Align := alRight;
  2233.     GroupIndex := 1;
  2234.     OnClick := IconToolButtonClick;
  2235.     NumGlyphs := 1;
  2236.     Glyph.LoadFromResourceName(HInstance, 'SP_ICONSTYLE');
  2237.   end;
  2238.   ReportToolButton := TspSkinSpeedButton.Create(Self);
  2239.   with ReportToolButton do
  2240.   begin
  2241.     Parent := ToolPanel;
  2242.     DefaultWidth := 27;
  2243.     SkinDataName := 'toolbutton';
  2244.     Align := alRight;
  2245.     GroupIndex := 1;
  2246.     OnClick := ReportToolButtonClick;
  2247.     NumGlyphs := 1;
  2248.     Glyph.LoadFromResourceName(HInstance, 'SP_REPORTSTYLE');
  2249.   end;
  2250.   Bevel2 := TspSkinBevel.Create(Self);
  2251.   with Bevel2 do
  2252.   begin
  2253.     Parent := ToolPanel;
  2254.     Width := 26;
  2255.     Align := alRight;
  2256.     DividerMode := True;
  2257.   end;
  2258.   Bevel3 := TspSkinBevel.Create(Self);
  2259.   with Bevel3 do
  2260.   begin
  2261.     Parent := ToolPanel;
  2262.     Width := 26;
  2263.     Align := alLeft;
  2264.     DividerMode := True;
  2265.   end;
  2266.   DriveBox := TspSkinShellDriveComboBox.Create(Self);
  2267.   with DriveBox do
  2268.   begin
  2269.     Parent := ToolPanel;
  2270.     OnChange := DCBChange;
  2271.     Align := alClient;
  2272.   end;
  2273.   BottomPanel := TspSkinPanel.Create(Self);
  2274.   with BottomPanel do
  2275.   begin
  2276.     Parent := Self;
  2277.     Align := alBottom;
  2278.     BorderStyle := bvNone;
  2279.     Height := 80;
  2280.   end;
  2281.   Splitter := TspSkinSplitter.Create(Self);
  2282.   with Splitter do
  2283.   begin
  2284.     Parent := Self;
  2285.     Align := alLeft;
  2286.     Width := 10;
  2287.     DefaultSize := 10;
  2288.     Beveled := False;
  2289.   end;
  2290.   DirTreeViewPanel := TspSkinExPanel.Create(Self);
  2291.   with DirTreeViewPanel do
  2292.   begin
  2293.     Parent := Self;
  2294.     Align := alLeft;
  2295.     RollKind := rkRollHorizontal;
  2296.     ShowCloseButton := False;
  2297.     Width := 200;
  2298.   end;
  2299.   FileListViewPanel := TspSkinPanel.Create(Self);
  2300.   with FileListViewPanel do
  2301.   begin
  2302.     Parent := Self;
  2303.     Align := alClient;
  2304.     BorderStyle := bvFrame;
  2305.   end;
  2306.   DTVVScrollBar := TspSkinScrollBar.Create(Self);
  2307.   with DTVVScrollBar do
  2308.   begin
  2309.     Kind := sbVertical;
  2310.     Parent := DirTreeViewPanel;
  2311.     Align := alRight;
  2312.     DefaultWidth := 19;
  2313.     Enabled := False;
  2314.     SkinDataName := 'vscrollbar';
  2315.   end;
  2316.   DTVHScrollBar := TspSkinScrollBar.Create(Self);
  2317.   with DTVHScrollBar do
  2318.   begin
  2319.     Parent := DirTreeViewPanel;
  2320.     Align := alBottom;
  2321.     DefaultHeight := 19;
  2322.     Enabled := False;
  2323.     BothMarkerWidth := 19;
  2324.     SkinDataName := 'hscrollbar';
  2325.   end;
  2326.   DirTreeView := TspSkinDirTreeView.Create(Self);
  2327.   with DirTreeView do
  2328.   begin
  2329.     Parent := DirTreeViewPanel;
  2330.     Align := alClient;
  2331.     HScrollBar := Self.DTVHScrollBar;
  2332.     VScrollBar := Self.DTVVScrollBar;
  2333.     OnChange := DTVChange;
  2334.     HideSelection := False;
  2335.   end;
  2336.   FLVHScrollBar := TspSkinScrollBar.Create(Self);
  2337.   with FLVHScrollBar do
  2338.   begin
  2339.     BothMarkerWidth := 19;
  2340.     Parent := FileListViewPanel;
  2341.     Align := alBottom;
  2342.     DefaultHeight := 19;
  2343.     Enabled := False;
  2344.     SkinDataName := 'hscrollbar';
  2345.   end;
  2346.   FLVVScrollBar := TspSkinScrollBar.Create(Self);
  2347.   with FLVVScrollBar do
  2348.   begin
  2349.     Kind := sbVertical;
  2350.     Parent := FileListViewPanel;
  2351.     Align := alRight;
  2352.     DefaultWidth := 19;
  2353.     Enabled := False;
  2354.     SkinDataName := 'vscrollbar';
  2355.   end;
  2356.   FileListView := TspSkinFileListView.Create(Self);
  2357.   with FileListView do
  2358.   begin
  2359.     Parent := FileListViewPanel;
  2360.     ViewStyle := vsList;
  2361.     ShowColumnHeaders := True;
  2362.     IconOptions.AutoArrange := True;
  2363.     GridLines := True;
  2364.     Align := alClient;
  2365.     HScrollBar := FLVHScrollBar;
  2366.     VScrollBar := FLVVScrollBar;
  2367.     OnChange := FLVChange;
  2368.     OnDblClick := FLVDBLClick;
  2369.     HideSelection := False;
  2370.   end;
  2371.   FileNameEdit := TspSkinEdit.Create(Self);
  2372.   with FileNameEdit do
  2373.   begin
  2374.     Parent := BottomPanel;
  2375.     Top := 10;
  2376.     Left := 70;
  2377.     Width := 300;
  2378.     DefaultHeight := 21;
  2379.     OnKeyPress := EditKeyPress;
  2380.   end;
  2381.   FilterComboBox := TspSkinFilterComboBox.Create(Self);
  2382.   with FilterComboBox  do
  2383.   begin
  2384.     Parent := BottomPanel;
  2385.     Top := 45;
  2386.     Left := 70;
  2387.     Width := 300;
  2388.     DefaultHeight := 21;
  2389.     OnChange := FCBChange;
  2390.   end;
  2391.   OpenButton := TspSkinButton.Create(Self);
  2392.   with OpenButton do
  2393.   begin
  2394.     if SaveMode
  2395.     then
  2396.       Caption := SP_MSG_BTN_SAVE
  2397.     else
  2398.       Caption := SP_MSG_BTN_OPEN;
  2399.     CanFocused := True;
  2400.     Left := 390;
  2401.     Top := 10;
  2402.     Width := 70;
  2403.     DefaultHeight := 25;
  2404.     Parent := BottomPanel;
  2405.     OnClick := OpenButtonClick;
  2406.   end;
  2407.   CancelButton := TspSkinButton.Create(Self);
  2408.   with CancelButton do
  2409.   begin
  2410.     Caption := SP_MSG_BTN_CANCEL;
  2411.     CanFocused := True;
  2412.     Left := 390;
  2413.     Top := 45;
  2414.     Width := 70;
  2415.     DefaultHeight := 25;
  2416.     Parent := BottomPanel;
  2417.     ModalResult := mrCancel;
  2418.     Cancel := True;
  2419.   end;
  2420.   OpenFileLabel := TspSkinStdLabel.Create(Self);
  2421.   with OpenFileLabel do
  2422.   begin
  2423.     Caption := SP_MSG_FILENAME;
  2424.     Left := 10;
  2425.     Top := 10;
  2426.     AutoSize := True;
  2427.     Parent := BottomPanel;
  2428.   end;
  2429.   FileTypeLabel := TspSkinStdLabel.Create(Self);
  2430.   with FileTypeLabel do
  2431.   begin
  2432.     Caption := SP_MSG_FILETYPE;
  2433.     Left := 10;
  2434.     Top := 45;
  2435.     AutoSize := True;
  2436.     Parent := BottomPanel;
  2437.   end;
  2438.   ActiveControl := FileNameEdit;
  2439. end;
  2440. procedure TspOpenDlgForm.MyDocToolButtonClick(Sender: TObject);
  2441. begin
  2442.   FileListView.Directory := GetPersonalRoot(Handle);
  2443. end;
  2444. procedure TspOpenDlgForm.ReportToolButtonClick(Sender: TObject);
  2445. begin
  2446.   FileListView.ViewStyle := vsReport;
  2447.   FileListView.UpdateScrollBars;
  2448. end;
  2449. procedure TspOpenDlgForm.BackToolButtonClick(Sender: TObject);
  2450. begin
  2451.   FileListView.OneLevelUp;
  2452.   FileListView.UpdateScrollBars;
  2453. end;
  2454. procedure TspOpenDlgForm.ListToolButtonClick(Sender: TObject);
  2455. begin
  2456.   FileListView.ViewStyle := vsList;
  2457.   FileListView.UpdateScrollBars;
  2458. end;
  2459. procedure TspOpenDlgForm.SmallIconToolButtonClick(Sender: TObject);
  2460. begin
  2461.   FileListView.ViewStyle := vsSmallIcon;
  2462.   FileListView.UpdateScrollBars;
  2463. end;
  2464. procedure TspOpenDlgForm.IconToolButtonClick(Sender: TObject);
  2465. begin
  2466.   FileListView.ViewStyle := vsIcon;
  2467. end;
  2468. procedure TspOpenDlgForm.EditKeyPress;
  2469. var
  2470.   FileName: String;
  2471. begin
  2472.   inherited;
  2473.     if Key = #27
  2474.   then
  2475.     begin
  2476.       Close;
  2477.     end
  2478.   else
  2479.   if Key = #13
  2480.   then
  2481.     begin
  2482.       if Pos('*', FileNameEdit.Text) <> 0
  2483.       then
  2484.         FileListView.Mask := FileNameEdit.Text
  2485.       else
  2486.         begin
  2487.           FileName := Self.FileListView.Directory + FileNameEdit.Text;
  2488.           if FileExists(FileName)
  2489.           then
  2490.             OpenButtonClick(Sender)
  2491.           else
  2492.           if DirectoryExists(FileNameEdit.Text)
  2493.           then
  2494.             FileListView.Directory := FileNameEdit.Text;
  2495.         end;
  2496.     end;
  2497. end;
  2498. procedure TspOpenDlgForm.OpenButtonClick;
  2499. var
  2500.   S: String;
  2501. begin
  2502.   if FileNameEdit.Text = '' then Exit;
  2503.   if SaveMode
  2504.   then
  2505.     begin
  2506.       S := Self.FileListView.Directory + FileNameEdit.Text;
  2507.       if (Pos('*', S) = 0)
  2508.       then
  2509.         begin
  2510.           FileName := Self.FileListView.Directory + FileNameEdit.Text;
  2511.           ModalResult := mrOk;
  2512.         end;
  2513.     end
  2514.   else
  2515.     begin
  2516.       FileName := Self.FileListView.Directory + FileNameEdit.Text;
  2517.       if FileExists(FileName) then ModalResult := mrOk else FileName := '';
  2518.     end;
  2519. end;
  2520. procedure TspOpenDlgForm.DCBChange(Sender: TObject);
  2521. begin
  2522.   FromDCB := True;
  2523.   if not FromFLV and not FromFTV and (DirTreeView <> nil)
  2524.   then DirTreeView.Directory := DriveBox.Drive + ':';
  2525.   FromDCB := False;
  2526. end;
  2527. procedure TspOpenDlgForm.FLVChange;
  2528. var
  2529.   OldPosition: Integer;
  2530.   C: TCanvas;
  2531. begin
  2532.   FromFLV := True;
  2533.   if (not FromFTV) and (DirTreeView.FSelectedPath <> FileListView.Directory)
  2534.   then
  2535.     begin
  2536.       DirTreeView.Directory := FileListView.Directory;
  2537.       DirTreeViewPanel.Caption := DirTreeView.Selected.Text;
  2538.     end;
  2539.   if FileListView.Selected <> nil
  2540.   then
  2541.   if FileListView.IsFile(FileListView.Selected)
  2542.   then
  2543.     FileNameEdit.Text := FileListView.Selected.Caption
  2544.   else
  2545.     FileNameEdit.Text := '';
  2546.   FromFLV := False;
  2547. end;
  2548. procedure TspOpenDlgForm.FLVDBLClick(Sender: TObject);
  2549. begin
  2550.   if (FileListView.Selected <> nil) and
  2551.      (FileListView.Selected.SubItems[5] = 'file')
  2552.   then
  2553.     begin
  2554.       FileNameEdit.Text := FileListView.Selected.Caption;
  2555.       FileName := Self.FileListView.Directory + FileNameEdit.Text;
  2556.       ModalResult := mrOk;
  2557.     end;
  2558. end;
  2559. procedure TspOpenDlgForm.DTVChange;
  2560. begin
  2561.   FromFTV := True;
  2562.   if not FromFLV
  2563.   then
  2564.     begin
  2565.       FileListView.Directory := DirTreeView.GetPathFromNode(Node);
  2566.       DirTreeViewPanel.Caption := DirTreeView.Selected.Text;
  2567.     end;
  2568.   if not FromDCB and (DriveBox <> nil) and (DriveBox.Drives.Count > 0)
  2569.      and (DirTreeView.Directory <> '')
  2570.   then
  2571.     DriveBox.Drive := DirTreeView.Directory[1];
  2572.   FromFTV := False;
  2573. end;
  2574. procedure TspOpenDlgForm.FCBChange(Sender: TObject);
  2575. begin
  2576.   FileListView.Mask := FilterComboBox.Mask;
  2577. end;
  2578. constructor TspSkinOpenDialog.Create(AOwner: TComponent);
  2579. begin
  2580.   inherited Create(AOwner);
  2581.   FFiles := TStringList.Create;
  2582.   FMultiSelection := False;
  2583.   FSkinMessage := nil;
  2584.   DialogWidth := 0;
  2585.   DialogHeight := 0;
  2586.   FLVHeaderSkinDataName := 'resizebutton';
  2587.   FAlphaBlend := False;
  2588.   FAlphaBlendAnimation := False;
  2589.   FAlphaBlendValue := 200;
  2590.   FSaveMode := False;
  2591.   FTitle := 'Open file';
  2592.   FDefaultFont := TFont.Create;
  2593.   with FDefaultFont do
  2594.   begin
  2595.     Name := 'Arial';
  2596.     Style := [];
  2597.     Height := 14;
  2598.   end;
  2599.   FInitialDir := '';
  2600.   FFilter := 'All files|*.*';
  2601.   FFilterIndex := 1;
  2602.   FFileName := '';
  2603.   TreePanelWidth := 200;
  2604.   ListViewStyle := vsList;
  2605. end;
  2606. destructor TspSkinOpenDialog.Destroy;
  2607. begin
  2608.   FFiles.Free;
  2609.   FDefaultFont.Free;
  2610.   inherited Destroy;
  2611. end;
  2612. procedure TspSkinOpenDialog.SetDefaultFont;
  2613. begin
  2614.   FDefaultFont.Assign(Value);
  2615. end;
  2616. procedure TspSkinOpenDialog.Notification;
  2617. begin
  2618.   inherited Notification(AComponent, Operation);
  2619.   if (Operation = opRemove) and (AComponent = FSD) then FSD := nil;
  2620.   if (Operation = opRemove) and (AComponent = FCtrlFSD) then FCtrlFSD := nil;
  2621.   if (Operation = opRemove) and (AComponent = FSkinMessage)
  2622.   then
  2623.     FSkinMessage := nil;
  2624. end;
  2625. function TspSkinOpenDialog.GetTitle: string;
  2626. begin
  2627.   Result := FTitle;
  2628. end;
  2629. procedure TspSkinOpenDialog.SetTitle(const Value: string);
  2630. begin
  2631.   FTitle := Value;
  2632. end;
  2633. procedure TspSkinOpenDialog.Change;
  2634. begin
  2635.   if Assigned(FOnChange) then FOnChange(Self);
  2636. end;
  2637. function TspSkinOpenDialog.Execute: Boolean;
  2638. var
  2639.   CIndex, FW, FH: Integer;
  2640.   Path: String;
  2641. begin
  2642.   FDlgFrm := TspOpenDlgForm.CreateEx(Application, FSaveMode);
  2643.   with FDlgFrm do
  2644.   try
  2645.     Caption := Self.Title;
  2646.     DSF.BorderIcons := [];
  2647.     DSF.SkinData := FSD;
  2648.     DSF.MenusSkinData := CtrlSkinData;
  2649.     DSF.AlphaBlend := AlphaBlend;
  2650.     DSF.AlphaBlendAnimation := AlphaBlendAnimation;
  2651.     DSF.AlphaBlendValue := AlphaBlendValue;
  2652.     DirTreeView.SkinData := FCtrlFSD;
  2653.     DirTreeView.SkinMessage := FSkinMessage;
  2654.     DirTreeViewPanel.Width := TreePanelWidth;
  2655.     DirTreeViewPanel.RollState := TreePanelRollState;
  2656.     case ListViewStyle of
  2657.       vsList: ListToolButton.Down := True;
  2658.       vsReport: ReportToolButton.Down := True;
  2659.       vsIcon: IconToolButton.Down := True;
  2660.       vsSmallIcon: SmallIconToolButton.Down := True;
  2661.     end;
  2662.     FileListView.ViewStyle := ListViewStyle;
  2663.     if (FFileName <> '') and (ExtractFilePath(FFileName) <> '')
  2664.     then
  2665.       begin
  2666.         Path := ExtractFilePath(FFileName);
  2667.         FileListView.Directory := Path;
  2668.         FileNameEdit.Text := ExtractFileName(FFileName);
  2669.       end
  2670.     else
  2671.       begin
  2672.         if FInitialDir = ''
  2673.         then
  2674.           FileListView.Directory := ExtractFilePath(Application.ExeName)
  2675.         else
  2676.           FileListView.Directory := FInitialDir;
  2677.         FileNameEdit.Text := FFileName;
  2678.       end;
  2679.     FromFLV := True;
  2680.     if FileListView.Directory <> ''
  2681.     then
  2682.       DriveBox.Drive := FileListView.Directory[1]
  2683.     else
  2684.       DriveBox.Drive := 'C';
  2685.     FromFLV := False;
  2686.     FileListView.Mask := FilterComboBox.Text;
  2687.     FileListView.MultiSelect := MultiSelection;
  2688.     FileListView.HeaderSkinDataName := FLVHeaderSkinDataName;
  2689.     FileListView.SkinData := FCtrlFSD;
  2690.     FileListView.SkinMessage := FSkinMessage;
  2691.     FilterComboBox.Filter := Self.Filter;
  2692.     FilterComboBox.ItemIndex := FFilterIndex - 1;
  2693.     //
  2694.     DirTreeViewPanel.SkinData := FCtrlFSD;
  2695.     FileListViewPanel.SkinData := FCtrlFSD;
  2696.     BottomPanel.SkinData := FCtrlFSD;
  2697.     ToolPanel.SkinData := FCtrlFSD;
  2698.     Bevel1.SkinData := FCtrlFSD;
  2699.     Bevel2.SkinData := FCtrlFSD;
  2700.     Bevel3.SkinData := FCtrlFSD;
  2701.     //
  2702.     DriveBox.SkinData := FCtrlFSD;
  2703.     if FCtrlFSD <> nil
  2704.     then
  2705.       CIndex := FCtrlFSD.GetControlIndex('toolcombobox')
  2706.     else
  2707.       CIndex := -1;
  2708.     if CIndex <> -1
  2709.     then
  2710.       DriveBox.SkinDataName := 'toolcombobox'
  2711.     else
  2712.       DriveBox.SkinDataName := 'combobox';
  2713.     //
  2714.     BackToolButton.SkinData := FCtrlFSD;
  2715.     ListToolButton.SkinData := FCtrlFSD;
  2716.     ReportToolButton.SkinData := FCtrlFSD;
  2717.     IconToolButton.SkinData := FCtrlFSD;
  2718.     SmallIconToolButton.SkinData := FCtrlFSD;
  2719.     MyDocToolButton.SkinData := FCtrlFSD;
  2720.     //
  2721.     Splitter.SkinData := FCtrlFSD;
  2722.     DTVHScrollBar.SkinData := FCtrlFSD;
  2723.     DTVVScrollBar.SkinData := FCtrlFSD;
  2724.     FLVHScrollBar.SkinData := FCtrlFSD;
  2725.     FLVVScrollBar.SkinData := FCtrlFSD;
  2726.     FileNameEdit.SkinData := FCtrlFSD;
  2727.     FilterComboBox.SkinData := FCtrlFSD;
  2728.     OpenButton.SkinData := FCtrlFSD;
  2729.     CancelButton.SkinData := FCtrlFSD;
  2730.     OpenFileLabel.SkinData := FCtrlFSD;
  2731.     FileTypeLabel.SkinData := FCtrlFSD;
  2732.     //
  2733.     if (DialogWidth <> 0)
  2734.     then
  2735.       begin
  2736.         FW := DialogWidth;
  2737.         FH := DialogHeight;
  2738.       end
  2739.     else
  2740.       begin
  2741.         FW := 500;
  2742.         FH := 300;
  2743.       end;
  2744.     if (SkinData <> nil) and not SkinData.Empty
  2745.     then
  2746.       begin
  2747.         if FW < DSF.GetMinWidth then FW := DSF.GetMinWidth;
  2748.         if FH < DSF.GetMinHeight then FH := DSF.GetMinHeight;
  2749.       end;
  2750.     ClientWidth := FW;
  2751.     ClientHeight := FH;
  2752.     Result := (ShowModal = mrOk);
  2753.     FFilterIndex := FilterComboBox.ItemIndex + 1;
  2754.     if DirTreeViewPanel.RollState
  2755.     then
  2756.       TreePanelWidth := DirTreeViewPanel.RealWidth
  2757.     else
  2758.       TreePanelWidth := DirTreeViewPanel.Width;
  2759.     DialogWidth := ClientWidth;
  2760.     DialogHeight := ClientHeight;
  2761.     TreePanelRollState := DirTreeViewPanel.RollState;
  2762.     ListViewStyle := FileListView.ViewStyle;
  2763.     if Result
  2764.     then
  2765.       begin
  2766.         Self.FFileName := FDlgFrm.FileName;
  2767.         Self.Files.Assign(FileListView.Files);
  2768.         Change;
  2769.       end;
  2770.   finally
  2771.     Free;
  2772.     FDlgFrm := nil;
  2773.   end;
  2774. end;
  2775. constructor TspSkinSaveDialog.Create(AOwner: TComponent);
  2776. begin
  2777.   inherited;
  2778.   FTitle := 'Save file';
  2779.   FSaveMode := True;
  2780. end;
  2781. constructor TspSkinDirectoryEdit.Create(AOwner: TComponent);
  2782. begin
  2783.   inherited;
  2784.   ControlStyle := ControlStyle - [csSetCaption];
  2785.   ButtonMode := True;
  2786.   OnButtonClick := ButtonClick;
  2787.   FSkinDataName := 'buttonedit';
  2788.   SD := TspSkinSelectDirectoryDialog.Create(Self);
  2789. end;
  2790. destructor TspSkinDirectoryEdit.Destroy;
  2791. begin
  2792.   SD.Free;
  2793.   inherited;
  2794. end;
  2795. procedure TspSkinDirectoryEdit.ButtonClick;
  2796. begin
  2797.   SD.Directory := Text;
  2798.   SD.SkinData := FDlgSkinData;
  2799.   SD.CtrlSkinData := FDlgCtrlSkinData;
  2800.   if SD.Execute then Text := SD.Directory;
  2801. end;
  2802. procedure TspSkinDirectoryEdit.Notification;
  2803. begin
  2804.   inherited Notification(AComponent, Operation);
  2805.   if (Operation = opRemove) and (AComponent = FDlgSkinData) then FDlgSkinData := nil;
  2806.   if (Operation = opRemove) and (AComponent = FDlgCtrlSkinData) then FDlgCtrlSkinData := nil;
  2807. end;
  2808. constructor TspSkinFileEdit.Create(AOwner: TComponent);
  2809. begin
  2810.   inherited;
  2811.   ControlStyle := ControlStyle - [csSetCaption];
  2812.   ButtonMode := True;
  2813.   OnButtonClick := ButtonClick;
  2814.   FSkinDataName := 'buttonedit';
  2815.   FLVHeaderSkinDataName := 'resizebutton';
  2816.   OD := TspSkinOpenDialog.Create(Self);
  2817. end;
  2818. destructor TspSkinFileEdit.Destroy;
  2819. begin
  2820.   OD.Free;
  2821.   inherited;
  2822. end;
  2823. function TspSkinFileEdit.GetFilter;
  2824. begin
  2825.   Result := OD.Filter;
  2826. end;
  2827. procedure TspSkinFileEdit.SetFilter;
  2828. begin
  2829.   OD.Filter := Value;
  2830. end;
  2831. procedure TspSkinFileEdit.ButtonClick;
  2832. begin
  2833.   OD.FileName := Text;
  2834.   OD.SkinData := FDlgSkinData;
  2835.   OD.CtrlSkinData := FDlgCtrlSkinData;
  2836.   OD.LVHeaderSkinDataName := FLVHeaderSkinDataName;
  2837.   if OD.Execute then Text := OD.FileName;
  2838. end;
  2839. procedure TspSkinFileEdit.Notification;
  2840. begin
  2841.   inherited Notification(AComponent, Operation);
  2842.   if (Operation = opRemove) and (AComponent = FDlgSkinData) then FDlgSkinData := nil;
  2843.   if (Operation = opRemove) and (AComponent = FDlgCtrlSkinData) then FDlgCtrlSkinData := nil;
  2844. end;
  2845. constructor TspSkinSaveFileEdit.Create(AOwner: TComponent);
  2846. begin
  2847.   inherited;
  2848.   ControlStyle := ControlStyle - [csSetCaption];
  2849.   FLVHeaderSkinDataName := 'resizebutton';
  2850.   ButtonMode := True;
  2851.   OnButtonClick := ButtonClick;
  2852.   FSkinDataName := 'buttonedit';
  2853.   OD := TspSkinSaveDialog.Create(Self);
  2854. end;
  2855. destructor TspSkinSaveFileEdit.Destroy;
  2856. begin
  2857.   OD.Free;
  2858.   inherited;
  2859. end;
  2860. function TspSkinSaveFileEdit.GetFilter;
  2861. begin
  2862.   Result := OD.Filter;
  2863. end;
  2864. procedure TspSkinSaveFileEdit.SetFilter;
  2865. begin
  2866.   OD.Filter := Value;
  2867. end;
  2868. procedure TspSkinSaveFileEdit.ButtonClick;
  2869. begin
  2870.   OD.FileName := Text;
  2871.   OD.SkinData := FDlgSkinData;
  2872.   OD.CtrlSkinData := FDlgCtrlSkinData;
  2873.   OD.LVHeaderSkinDataName := FLVHeaderSkinDataName;
  2874.   if OD.Execute then Text := OD.FileName;
  2875. end;
  2876. procedure TspSkinSaveFileEdit.Notification;
  2877. begin
  2878.   inherited Notification(AComponent, Operation);
  2879.   if (Operation = opRemove) and (AComponent = FDlgSkinData) then FDlgSkinData := nil;
  2880.   if (Operation = opRemove) and (AComponent = FDlgCtrlSkinData) then FDlgCtrlSkinData := nil;
  2881. end;
  2882. // ======= TspSkinOpenPictureDialog ====== //
  2883. constructor TspOpenPictureDlgForm.CreateEx;
  2884. begin
  2885.   inherited CreateNew(AOwner);
  2886.   SaveMode := ASaveMode;
  2887.   KeyPreview := True;
  2888. //  BorderStyle := bsDialog;
  2889.   Position := poScreenCenter;
  2890.   DSF := TspDynamicSkinForm.Create(Self);
  2891.   FromFLV := False;
  2892.   FromFTV := False;
  2893.   ImagePanel := TspSkinPanel.Create(Self);
  2894.   with ImagePanel do
  2895.   begin
  2896.     BorderStyle := bvFrame;
  2897.     Parent := Self;
  2898.     Align := alRight;
  2899.     Width := 200;
  2900.   end;
  2901.   Splitter2 := TspSkinSplitter.Create(Self);
  2902.   with Splitter2 do
  2903.   begin
  2904.     Parent := Self;
  2905.     Align := alRight;
  2906.     Width := 10;
  2907.     DefaultSize := 10;
  2908.     Beveled := False;
  2909.   end;
  2910.   SBVScrollBar := TspSkinScrollBar.Create(Self);
  2911.   with SBVScrollBar do
  2912.   begin
  2913.     Kind := sbVertical;
  2914.     Parent := ImagePanel;
  2915.     Align := alRight;
  2916.     DefaultWidth := 19;
  2917.     Enabled := False;
  2918.     SkinDataName := 'vscrollbar';
  2919.   end;
  2920.   SBHScrollBar := TspSkinScrollBar.Create(Self);
  2921.   with SBHScrollBar do
  2922.   begin
  2923.     Parent := ImagePanel;
  2924.     Align := alBottom;
  2925.     DefaultHeight := 19;
  2926.     Enabled := False;
  2927.     BothMarkerWidth := 19;
  2928.     SkinDataName := 'hscrollbar';
  2929.   end;
  2930.   ScrollBox := TspSkinScrollBox.Create(Self);
  2931.   with ScrollBox do
  2932.   begin
  2933.     Align := alClient;
  2934.     BorderStyle := bvNone;
  2935.     Parent := ImagePanel;
  2936.     HScrollBar := SBHScrollBar;
  2937.     VScrollBar := SBVScrollBar;
  2938.   end;
  2939.   Image := TImage.Create(Self);
  2940.   with Image do
  2941.   begin
  2942.     Parent := ScrollBox;
  2943.     Left := 0;
  2944.     Top := 0;
  2945.   end;
  2946.   ToolPanel := TspSkinPanel.Create(Self);
  2947.   with ToolPanel do
  2948.   begin
  2949.     BorderStyle := bvNone;
  2950.     Parent := Self;
  2951.     Align := alTop;
  2952.     DefaultHeight := 25;
  2953.     SkinDataName := 'toolpanel';
  2954.   end;
  2955.   BackToolButton := TspSkinSpeedButton.Create(Self);
  2956.   with BackToolButton do
  2957.   begin
  2958.     Parent := ToolPanel;
  2959.     DefaultHeight := 25;
  2960.     DefaultWidth := 75;
  2961.     SkinDataName := 'toolbutton';
  2962.     Align := alLeft;
  2963.     OnClick := BackToolButtonClick;
  2964.     NumGlyphs := 1;
  2965.     Glyph.LoadFromResourceName(HInstance, 'SP_UP');
  2966.   end;
  2967.   MyDocToolButton := TspSkinSpeedButton.Create(Self);
  2968.   with MyDocToolButton do
  2969.   begin
  2970.     Parent := ToolPanel;
  2971.     DefaultWidth := 27;
  2972.     SkinDataName := 'toolbutton';
  2973.     Align := alRight;
  2974.     OnClick := MyDocToolButtonClick;
  2975.     NumGlyphs := 1;
  2976.     Glyph.LoadFromResourceName(HInstance, 'SP_MYDOC');
  2977.   end;
  2978.  //
  2979.   Bevel1 := TspSkinBevel.Create(Self);
  2980.   with Bevel1 do
  2981.   begin
  2982.     Parent := ToolPanel;
  2983.     Width := 27;
  2984.     Align := alRight;
  2985.     DividerMode := True;
  2986.   end;
  2987.   //
  2988.   ListToolButton := TspSkinSpeedButton.Create(Self);
  2989.   with ListToolButton do
  2990.   begin
  2991.     Parent := ToolPanel;
  2992.     DefaultWidth := 27;
  2993.     SkinDataName := 'toolbutton';
  2994.     Align := alRight;
  2995.     GroupIndex := 1;
  2996.     Down := True;
  2997.     OnClick := ListToolButtonClick;
  2998.     NumGlyphs := 1;
  2999.     Glyph.LoadFromResourceName(HInstance, 'SP_LISTSTYLE');
  3000.   end;
  3001.   SmallIconToolButton := TspSkinSpeedButton.Create(Self);
  3002.   with SmallIconToolButton do
  3003.   begin
  3004.     Parent := ToolPanel;
  3005.     DefaultWidth := 27;
  3006.     SkinDataName := 'toolbutton';
  3007.     Align := alRight;
  3008.     GroupIndex := 1;
  3009.     OnClick := SmallIconToolButtonClick;
  3010.     NumGlyphs := 1;
  3011.     Glyph.LoadFromResourceName(HInstance, 'SP_SMALLICONSTYLE');
  3012.   end;
  3013.   IconToolButton := TspSkinSpeedButton.Create(Self);
  3014.   with IconToolButton do
  3015.   begin
  3016.     Parent := ToolPanel;
  3017.     DefaultWidth := 27;
  3018.     SkinDataName := 'toolbutton';
  3019.     Align := alRight;
  3020.     GroupIndex := 1;
  3021.     OnClick := IconToolButtonClick;
  3022.     NumGlyphs := 1;
  3023.     Glyph.LoadFromResourceName(HInstance, 'SP_ICONSTYLE');
  3024.   end;
  3025.   ReportToolButton := TspSkinSpeedButton.Create(Self);
  3026.   with ReportToolButton do
  3027.   begin
  3028.     Parent := ToolPanel;
  3029.     DefaultWidth := 27;
  3030.     SkinDataName := 'toolbutton';
  3031.     Align := alRight;
  3032.     GroupIndex := 1;
  3033.     OnClick := ReportToolButtonClick;
  3034.     NumGlyphs := 1;
  3035.     Glyph.LoadFromResourceName(HInstance, 'SP_REPORTSTYLE');
  3036.   end;
  3037.   Bevel4 := TspSkinBevel.Create(Self);
  3038.   with Bevel4 do
  3039.   begin
  3040.     Parent := ToolPanel;
  3041.     Width := 27;
  3042.     Align := alRight;
  3043.     DividerMode := True;
  3044.   end;
  3045.   StretchButton := TspSkinSpeedButton.Create(Self);
  3046.   with StretchButton do
  3047.   begin
  3048.     Parent := ToolPanel;
  3049.     GroupIndex := 2;
  3050.     AllowAllUp := True;
  3051.     DefaultHeight := 27;
  3052.     DefaultWidth := 27;
  3053.     SkinDataName := 'toolbutton';
  3054.     Align := alRight;
  3055.     OnClick := StretchButtonClick;
  3056.     NumGlyphs := 1;
  3057.     Glyph.LoadFromResourceName(HInstance, 'SP_STRETCH');
  3058.   end;
  3059.   Bevel2 := TspSkinBevel.Create(Self);
  3060.   with Bevel2 do
  3061.   begin
  3062.     Parent := ToolPanel;
  3063.     Width := 26;
  3064.     Align := alRight;
  3065.     DividerMode := True;
  3066.   end;
  3067.   Bevel3 := TspSkinBevel.Create(Self);
  3068.   with Bevel3 do
  3069.   begin
  3070.     Parent := ToolPanel;
  3071.     Width := 26;
  3072.     Align := alLeft;
  3073.     DividerMode := True;
  3074.   end;
  3075.   DriveBox := TspSkinShellDriveComboBox.Create(Self);
  3076.   with DriveBox do
  3077.   begin
  3078.     Parent := ToolPanel;
  3079.     OnChange := DCBChange;
  3080.     Align := alClient;
  3081.   end;
  3082.   BottomPanel := TspSkinPanel.Create(Self);
  3083.   with BottomPanel do
  3084.   begin
  3085.     Parent := Self;
  3086.     Align := alBottom;
  3087.     BorderStyle := bvNone;
  3088.     Height := 80;
  3089.   end;
  3090.   Splitter := TspSkinSplitter.Create(Self);
  3091.   with Splitter do
  3092.   begin
  3093.     Parent := Self;
  3094.     Align := alLeft;
  3095.     Width := 10;
  3096.     DefaultSize := 10;
  3097.     Beveled := False;
  3098.   end;
  3099.   DirTreeViewPanel := TspSkinExPanel.Create(Self);
  3100.   with DirTreeViewPanel do
  3101.   begin
  3102.     Parent := Self;
  3103.     Align := alLeft;
  3104.     RollKind := rkRollHorizontal;
  3105.     ShowCloseButton := False;
  3106.     Width := 150;
  3107.   end;
  3108.   FileListViewPanel := TspSkinPanel.Create(Self);
  3109.   with FileListViewPanel do
  3110.   begin
  3111.     Parent := Self;
  3112.     Align := alClient;
  3113.     BorderStyle := bvFrame;
  3114.   end;
  3115.   DTVVScrollBar := TspSkinScrollBar.Create(Self);
  3116.   with DTVVScrollBar do
  3117.   begin
  3118.     Kind := sbVertical;
  3119.     Parent := DirTreeViewPanel;
  3120.     Align := alRight;
  3121.     DefaultWidth := 19;
  3122.     Enabled := False;
  3123.     SkinDataName := 'vscrollbar';
  3124.   end;
  3125.   DTVHScrollBar := TspSkinScrollBar.Create(Self);
  3126.   with DTVHScrollBar do
  3127.   begin
  3128.     Parent := DirTreeViewPanel;
  3129.     Align := alBottom;
  3130.     DefaultHeight := 19;
  3131.     Enabled := False;
  3132.     BothMarkerWidth := 19;
  3133.     SkinDataName := 'hscrollbar';
  3134.   end;
  3135.   DirTreeView := TspSkinDirTreeView.Create(Self);
  3136.   with DirTreeView do
  3137.   begin
  3138.     Parent := DirTreeViewPanel;
  3139.     Align := alClient;
  3140.     HScrollBar := Self.DTVHScrollBar;
  3141.     VScrollBar := Self.DTVVScrollBar;
  3142.     OnChange := DTVChange;
  3143.     HideSelection := False;
  3144.   end;
  3145.   FLVHScrollBar := TspSkinScrollBar.Create(Self);
  3146.   with FLVHScrollBar do
  3147.   begin
  3148.     BothMarkerWidth := 19;
  3149.     Parent := FileListViewPanel;
  3150.     Align := alBottom;
  3151.     DefaultHeight := 19;
  3152.     Enabled := False;
  3153.     SkinDataName := 'hscrollbar';
  3154.   end;
  3155.   FLVVScrollBar := TspSkinScrollBar.Create(Self);
  3156.   with FLVVScrollBar do
  3157.   begin
  3158.     Kind := sbVertical;
  3159.     Parent := FileListViewPanel;
  3160.     Align := alRight;
  3161.     DefaultWidth := 19;
  3162.     Enabled := False;
  3163.     SkinDataName := 'vscrollbar';
  3164.   end;
  3165.   FileListView := TspSkinFileListView.Create(Self);
  3166.   with FileListView do
  3167.   begin
  3168.     Parent := FileListViewPanel;
  3169.     ViewStyle := vsList;
  3170.     ShowColumnHeaders := True;
  3171.     IconOptions.AutoArrange := True;
  3172.     GridLines := True;
  3173.     Align := alClient;
  3174.     HScrollBar := FLVHScrollBar;
  3175.     VScrollBar := FLVVScrollBar;
  3176.     OnChange := FLVChange;
  3177.     OnDblClick := FLVDBLClick;
  3178.     HideSelection := False;
  3179.   end;
  3180.   FileNameEdit := TspSkinEdit.Create(Self);
  3181.   with FileNameEdit do
  3182.   begin
  3183.     Parent := BottomPanel;
  3184.     Top := 10;
  3185.     Left := 70;
  3186.     Width := 300;
  3187.     DefaultHeight := 21;
  3188.     OnKeyPress := EditKeyPress;
  3189.   end;
  3190.   FilterComboBox := TspSkinFilterComboBox.Create(Self);
  3191.   with FilterComboBox  do
  3192.   begin
  3193.     Parent := BottomPanel;
  3194.     Top := 45;
  3195.     Left := 70;
  3196.     Width := 300;
  3197.     DefaultHeight := 21;
  3198.     OnChange := FCBChange;
  3199.   end;
  3200.   OpenButton := TspSkinButton.Create(Self);
  3201.   with OpenButton do
  3202.   begin
  3203.     if SaveMode
  3204.     then
  3205.       Caption := SP_MSG_BTN_SAVE
  3206.     else
  3207.       Caption := SP_MSG_BTN_OPEN;
  3208.     CanFocused := True;
  3209.     Left := 390;
  3210.     Top := 10;
  3211.     Width := 70;
  3212.     DefaultHeight := 25;
  3213.     Parent := BottomPanel;
  3214.     OnClick := OpenButtonClick;
  3215.   end;
  3216.   CancelButton := TspSkinButton.Create(Self);
  3217.   with CancelButton do
  3218.   begin
  3219.     Caption := SP_MSG_BTN_CANCEL;
  3220.     CanFocused := True;
  3221.     Left := 390;
  3222.     Top := 45;
  3223.     Width := 70;
  3224.     DefaultHeight := 25;
  3225.     Parent := BottomPanel;
  3226.     ModalResult := mrCancel;
  3227.     Cancel := True;
  3228.   end;
  3229.   OpenFileLabel := TspSkinStdLabel.Create(Self);
  3230.   with OpenFileLabel do
  3231.   begin
  3232.     Caption := SP_MSG_FILENAME;
  3233.     Left := 10;
  3234.     Top := 10;
  3235.     AutoSize := True;
  3236.     Parent := BottomPanel;
  3237.   end;
  3238.   FileTypeLabel := TspSkinStdLabel.Create(Self);
  3239.   with FileTypeLabel do
  3240.   begin
  3241.     Caption := SP_MSG_FILETYPE;
  3242.     Left := 10;
  3243.     Top := 45;
  3244.     AutoSize := True;
  3245.     Parent := BottomPanel;
  3246.   end;
  3247.   ActiveControl := FileNameEdit;
  3248. end;
  3249. procedure TspOpenPictureDlgForm.MyDocToolButtonClick(Sender: TObject);
  3250. begin
  3251.   FileListView.Directory := GetPersonalRoot(Handle);
  3252. end;
  3253. procedure TspOpenPictureDlgForm.ReportToolButtonClick(Sender: TObject);
  3254. begin
  3255.   FileListView.ViewStyle := vsReport;
  3256.   FileListView.UpdateScrollBars;
  3257. end;
  3258. procedure TspOpenPictureDlgForm.BackToolButtonClick(Sender: TObject);
  3259. begin
  3260.   FileListView.OneLevelUp;
  3261.   FileListView.UpdateScrollBars;
  3262. end;
  3263. procedure TspOpenPictureDlgForm.StretchButtonClick(Sender: TObject);
  3264. begin
  3265.   if StretchButton.Down
  3266.   then
  3267.     begin
  3268.       Image.Visible := False;
  3269.       Image.Stretch := True;
  3270.       Image.Align := alClient;
  3271.       Image.Visible := True;
  3272.     end
  3273.   else
  3274.     begin
  3275.       Image.Visible := False;
  3276.       Image.Align := alNone;
  3277.       Image.Width := Image.Picture.Width;
  3278.       Image.Height := Image.Picture.Height;
  3279.       Image.Stretch := False;
  3280.       Image.Visible := True;
  3281.     end;
  3282. end;
  3283. procedure TspOpenPictureDlgForm.ListToolButtonClick(Sender: TObject);
  3284. begin
  3285.   FileListView.ViewStyle := vsList;
  3286.   FileListView.UpdateScrollBars;
  3287. end;
  3288. procedure TspOpenPictureDlgForm.SmallIconToolButtonClick(Sender: TObject);
  3289. begin
  3290.   FileListView.ViewStyle := vsSmallIcon;
  3291.   FileListView.UpdateScrollBars;
  3292. end;
  3293. procedure TspOpenPictureDlgForm.IconToolButtonClick(Sender: TObject);
  3294. begin
  3295.   FileListView.ViewStyle := vsIcon;
  3296. end;
  3297. procedure TspOpenPictureDlgForm.EditKeyPress;
  3298. var
  3299.   FileName: String;
  3300. begin
  3301.   inherited;
  3302.   if Key = #27
  3303.   then
  3304.     begin
  3305.       Close;
  3306.     end
  3307.   else
  3308.   if Key = #13
  3309.   then
  3310.     begin
  3311.       if Pos('*', FileNameEdit.Text) <> 0
  3312.       then
  3313.         FileListView.Mask := FileNameEdit.Text
  3314.       else
  3315.         begin
  3316.           FileName := Self.FileListView.Directory + FileNameEdit.Text;
  3317.           if FileExists(FileName)
  3318.           then
  3319.             OpenButtonClick(Sender)
  3320.           else
  3321.           if DirectoryExists(FileNameEdit.Text)
  3322.           then
  3323.             FileListView.Directory := FileNameEdit.Text;
  3324.         end;
  3325.     end;
  3326. end;
  3327. procedure TspOpenPictureDlgForm.OpenButtonClick;
  3328. var
  3329.   S: String;
  3330. begin
  3331.   if FileNameEdit.Text = '' then Exit;
  3332.   if SaveMode
  3333.   then
  3334.     begin
  3335.       if FileNameEdit.Text = '' then Exit;
  3336.       S := Self.FileListView.Directory + FileNameEdit.Text;
  3337.       if (Pos('*', S) = 0)
  3338.       then
  3339.         begin
  3340.           FileName := Self.FileListView.Directory + FileNameEdit.Text;
  3341.           ModalResult := mrOk;
  3342.         end;
  3343.     end
  3344.   else
  3345.     begin
  3346.       FileName := Self.FileListView.Directory + FileNameEdit.Text;
  3347.       if FileExists(FileName) then ModalResult := mrOk else FileName := '';
  3348.     end;
  3349. end;
  3350. procedure TspOpenPictureDlgForm.DCBChange(Sender: TObject);
  3351. begin
  3352.   FromDCB := True;
  3353.   if not FromFLV and not FromFTV and (DirTreeView <> nil)
  3354.   then DirTreeView.Directory := DriveBox.Drive + ':';
  3355.   FromDCB := False;
  3356. end;
  3357. procedure TspOpenPictureDlgForm.FLVChange;
  3358. var
  3359.   OldPosition: Integer;
  3360. begin
  3361.   FromFLV := True;
  3362.   if (not FromFTV) and (DirTreeView.FSelectedPath <> FileListView.Directory)
  3363.   then
  3364.     begin
  3365.       DirTreeView.Directory := FileListView.Directory;
  3366.       DirTreeViewPanel.Caption := DirTreeView.Selected.Text;
  3367.     end;
  3368.   if FileListView.Selected <> nil
  3369.   then
  3370.   if FileListView.IsFile(FileListView.Selected)
  3371.   then
  3372.     begin
  3373.       FileNameEdit.Text := FileListView.Selected.Caption;
  3374.       try
  3375.         Image.Picture.LoadFromFile(Self.FileListView.Directory +  FileNameEdit.Text);
  3376.       finally
  3377.         if not Image.Stretch
  3378.         then
  3379.           begin
  3380.             Image.Width := Image.Picture.Width;
  3381.             Image.Height := Image.Picture.Height;
  3382.           end;
  3383.       end;
  3384.     end
  3385.   else
  3386.     FileNameEdit.Text := '';
  3387.   FromFLV := False;
  3388. end;
  3389. procedure TspOpenPictureDlgForm.FLVDBLClick(Sender: TObject);
  3390. begin
  3391.   if (FileListView.Selected <> nil) and
  3392.      (FileListView.Selected.SubItems[5] = 'file')
  3393.   then
  3394.     begin
  3395.       FileNameEdit.Text := FileListView.Selected.Caption;
  3396.       FileName := Self.FileListView.Directory + FileNameEdit.Text;
  3397.       ModalResult := mrOk;
  3398.     end;
  3399. end;
  3400. procedure TspOpenPictureDlgForm.DTVChange;
  3401. begin
  3402.   FromFTV := True;
  3403.   if not FromFLV
  3404.   then
  3405.     begin
  3406.       FileListView.Directory := DirTreeView.GetPathFromNode(Node);
  3407.       DirTreeViewPanel.Caption := DirTreeView.Selected.Text;
  3408.     end;
  3409.   if not FromDCB and (DriveBox <> nil) and (DriveBox.Drives.Count > 0)
  3410.      and (DirTreeView.Directory <> '')
  3411.   then
  3412.     DriveBox.Drive := DirTreeView.Directory[1];
  3413.   FromFTV := False;
  3414. end;
  3415. procedure TspOpenPictureDlgForm.FCBChange(Sender: TObject);
  3416. begin
  3417.   FileListView.Mask := FilterComboBox.Mask;
  3418. end;
  3419. constructor TspSkinOpenPictureDialog.Create(AOwner: TComponent);
  3420. begin
  3421.   inherited Create(AOwner);
  3422.   FFiles := TStringList.Create;
  3423.   FMultiSelection := False;
  3424.   FSkinMessage := nil;
  3425.   DialogWidth := 0;
  3426.   DialogHeight := 0;
  3427.   DialogStretch := False;
  3428.   FLVHeaderSkinDataName := 'resizebutton';
  3429.   FAlphaBlend := False;
  3430.   FAlphaBlendAnimation := False;
  3431.   FAlphaBlendValue := 200;
  3432.   FSaveMode := False;
  3433.   FTitle := 'Open picture';
  3434.   FDefaultFont := TFont.Create;
  3435.   with FDefaultFont do
  3436.   begin
  3437.     Name := 'Arial';
  3438.     Style := [];
  3439.     Height := 14;
  3440.   end;
  3441.   FInitialDir := '';
  3442.   FFilter := 'All (*.bmp;*.ico;*.emf;*.wmf)|*.bmp;*.ico;*.emf;*.wmf|Bitmaps (*.bmp)|*.bmp|Icons (*.ico)|*.ico|Enhanced Metafiles (*.emf)|*.emf|Metafiles (*.wmf)|*.wmf';
  3443.   FFilterIndex := 1;
  3444.   FFileName := '';
  3445.   TreePanelWidth := 150;
  3446.   ImagePanelWidth := 200;
  3447.   ListViewStyle := vsList;
  3448. end;
  3449. destructor TspSkinOpenPictureDialog.Destroy;
  3450. begin
  3451.   FFiles.Free;
  3452.   FDefaultFont.Free;
  3453.   inherited Destroy;
  3454. end;
  3455. procedure TspSkinOpenPictureDialog.SetDefaultFont;
  3456. begin
  3457.   FDefaultFont.Assign(Value);
  3458. end;
  3459. procedure TspSkinOpenPictureDialog.Notification;
  3460. begin
  3461.   inherited Notification(AComponent, Operation);
  3462.   if (Operation = opRemove) and (AComponent = FSD) then FSD := nil;
  3463.   if (Operation = opRemove) and (AComponent = FCtrlFSD) then FCtrlFSD := nil;
  3464.   if (Operation = opRemove) and (AComponent = FSkinMessage)
  3465.   then
  3466.     FSkinMessage := nil;
  3467. end;
  3468. function TspSkinOpenPictureDialog.GetTitle: string;
  3469. begin
  3470.   Result := FTitle;
  3471. end;
  3472. procedure TspSkinOpenPictureDialog.SetTitle(const Value: string);
  3473. begin
  3474.   FTitle := Value;
  3475. end;
  3476. procedure TspSkinOpenPictureDialog.Change;
  3477. begin
  3478.   if Assigned(FOnChange) then FOnChange(Self);
  3479. end;
  3480. function TspSkinOpenPictureDialog.Execute: Boolean;
  3481. var
  3482.   CIndex, i, FW, FH: Integer;
  3483.   Path: String;
  3484. begin
  3485.   FDlgFrm := TspOpenPictureDlgForm.CreateEx(Application, FSaveMode);
  3486.   with FDlgFrm do
  3487.   try
  3488.     Caption := Self.Title;
  3489.     DSF.BorderIcons := [];
  3490.     DSF.SkinData := FSD;
  3491.     DSF.MenusSkinData := CtrlSkinData;
  3492.     DSF.AlphaBlend := AlphaBlend;
  3493.     DSF.AlphaBlendAnimation := AlphaBlendAnimation;
  3494.     DSF.AlphaBlendValue := AlphaBlendValue;
  3495.     DirTreeView.SkinData := FCtrlFSD;
  3496.     DirTreeView.SkinMessage := FSkinMessage;
  3497.     DirTreeViewPanel.Width := TreePanelWidth;
  3498.     ImagePanel.Width := ImagePanelWidth;
  3499.     DirTreeViewPanel.RollState := TreePanelRollState;
  3500.     case ListViewStyle of
  3501.       vsList: ListToolButton.Down := True;
  3502.       vsReport: ReportToolButton.Down := True;
  3503.       vsIcon: IconToolButton.Down := True;
  3504.       vsSmallIcon: SmallIconToolButton.Down := True;
  3505.     end;
  3506.     FileListView.ViewStyle := ListViewStyle;
  3507.     if (FFileName <> '') and (ExtractFilePath(FFileName) <> '')
  3508.     then
  3509.       begin
  3510.         Path := ExtractFilePath(FFileName);
  3511.         FileListView.Directory := Path;
  3512.         FileNameEdit.Text := ExtractFileName(FFileName);
  3513.         for i := 0 to FileListView.Items.Count - 1 do
  3514.           if FileListView.Items[i].Caption = FileNameEdit.Text
  3515.           then
  3516.             begin
  3517.               FileListView.Selected := FileListView.Items[i];
  3518.               Break;
  3519.             end;
  3520.       end
  3521.     else
  3522.       begin
  3523.         if FInitialDir = ''
  3524.         then
  3525.           FileListView.Directory := ExtractFilePath(Application.ExeName)
  3526.         else
  3527.           FileListView.Directory := FInitialDir;
  3528.         FileNameEdit.Text := FFileName;
  3529.       end;
  3530.     FromFLV := True;
  3531.     DriveBox.Drive := FileListView.Directory[1];
  3532.     FromFLV := False;
  3533.     FileListView.MultiSelect := MultiSelection;
  3534.     FileListView.Mask := FilterComboBox.Text;
  3535.     FileListView.HeaderSkinDataName := FLVHeaderSkinDataName;
  3536.     FileListView.SkinData := FCtrlFSD;
  3537.     FileListView.SkinMessage := FSkinMessage;
  3538.     FilterComboBox.Filter := Self.Filter;
  3539.     FilterComboBox.ItemIndex := FFilterIndex - 1;
  3540.     //
  3541.     ImagePanel.SkinData := FCtrlFSD;
  3542.     ScrollBox.SkinData := FCtrlFSD;
  3543.     SBHScrollBar.SkinData := FCtrlFSD;
  3544.     SBVScrollBar.SkinData := FCtrlFSD;
  3545.     StretchButton.SkinData := FCtrlFSD;
  3546.     //
  3547.     DirTreeViewPanel.SkinData := FCtrlFSD;
  3548.     FileListViewPanel.SkinData := FCtrlFSD;
  3549.     BottomPanel.SkinData := FCtrlFSD;
  3550.     ToolPanel.SkinData := FCtrlFSD;
  3551.     Bevel1.SkinData := FCtrlFSD;
  3552.     Bevel2.SkinData := FCtrlFSD;
  3553.     Bevel3.SkinData := FCtrlFSD;
  3554.     //
  3555.     DriveBox.SkinData := FCtrlFSD;
  3556.     if FCtrlFSD <> nil
  3557.     then
  3558.       CIndex := FCtrlFSD.GetControlIndex('toolcombobox')
  3559.     else
  3560.       CIndex := -1;
  3561.     if CIndex <> -1
  3562.     then
  3563.       DriveBox.SkinDataName := 'toolcombobox'
  3564.     else
  3565.       DriveBox.SkinDataName := 'combobox';
  3566.     //
  3567.     Bevel4.SkinData := FCtrlFSD;
  3568.     BackToolButton.SkinData := FCtrlFSD;
  3569.     ListToolButton.SkinData := FCtrlFSD;
  3570.     ReportToolButton.SkinData := FCtrlFSD;
  3571.     IconToolButton.SkinData := FCtrlFSD;
  3572.     SmallIconToolButton.SkinData := FCtrlFSD;
  3573.     MyDocToolButton.SkinData := FCtrlFSD;
  3574.     //
  3575.     Splitter.SkinData := FCtrlFSD;
  3576.     Splitter2.SkinData := FCtrlFSD;
  3577.     DTVHScrollBar.SkinData := FCtrlFSD;
  3578.     DTVVScrollBar.SkinData := FCtrlFSD;
  3579.     FLVHScrollBar.SkinData := FCtrlFSD;
  3580.     FLVVScrollBar.SkinData := FCtrlFSD;
  3581.     FileNameEdit.SkinData := FCtrlFSD;
  3582.     FilterComboBox.SkinData := FCtrlFSD;
  3583.     OpenButton.SkinData := FCtrlFSD;
  3584.     CancelButton.SkinData := FCtrlFSD;
  3585.     OpenFileLabel.SkinData := FCtrlFSD;
  3586.     FileTypeLabel.SkinData := FCtrlFSD;
  3587.     //
  3588.     if (DialogWidth <> 0)
  3589.     then
  3590.       begin
  3591.         FW := DialogWidth;
  3592.         FH := DialogHeight;
  3593.       end
  3594.     else
  3595.       begin
  3596.         FW := 600;
  3597.         FH := 300;
  3598.       end;
  3599.     if (SkinData <> nil) and not SkinData.Empty
  3600.     then
  3601.       begin
  3602.         if FW < DSF.GetMinWidth then FW := DSF.GetMinWidth;
  3603.         if FH < DSF.GetMinHeight then FH := DSF.GetMinHeight;
  3604.       end;
  3605.     ClientWidth := FW;
  3606.     ClientHeight := FH;
  3607.     StretchButton.Down := DialogStretch;
  3608.     if StretchButton.Down
  3609.     then
  3610.       begin
  3611.         Image.Visible := False;
  3612.         ScrollBox.UpDateScrollRange;
  3613.         Image.Stretch := True;
  3614.         Image.Align := alClient;
  3615.         Image.Visible := True;
  3616.       end;
  3617.     Result := (ShowModal = mrOk);
  3618.     FFilterIndex := FilterComboBox.ItemIndex + 1;
  3619.     DialogStretch := StretchButton.Down;
  3620.     ImagePanelWidth := ImagePanel.Width;
  3621.     
  3622.     if DirTreeViewPanel.RollState
  3623.     then
  3624.       TreePanelWidth := DirTreeViewPanel.RealWidth
  3625.     else
  3626.       TreePanelWidth := DirTreeViewPanel.Width;
  3627.     TreePanelRollState := DirTreeViewPanel.RollState;
  3628.     ListViewStyle := FileListView.ViewStyle;
  3629.     DialogWidth := ClientWidth;
  3630.     DialogHeight := ClientHeight;
  3631.     if Result
  3632.     then
  3633.       begin
  3634.         Self.FFileName := FDlgFrm.FileName;
  3635.         Self.Files.Assign(FileListView.Files);
  3636.         Change;
  3637.       end;
  3638.   finally
  3639.     Free;
  3640.     FDlgFrm := nil;
  3641.   end;
  3642. end;
  3643. constructor TspSkinSavePictureDialog.Create(AOwner: TComponent);
  3644. begin
  3645.   inherited;
  3646.   FTitle := 'Save picture';
  3647.   FSaveMode := True;
  3648. end;
  3649. end.