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

Delphi控件源码

开发平台:

Delphi

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