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

Delphi控件源码

开发平台:

Delphi

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