added mini-explorer widget

This commit is contained in:
Basile Burg 2014-07-19 04:55:30 +02:00
parent 0311b67e2c
commit 99325b3db4
9 changed files with 1025 additions and 56 deletions

View File

@ -134,7 +134,7 @@
<PackageName Value="LCL"/>
</Item6>
</RequiredPackages>
<Units Count="17">
<Units Count="18">
<Unit0>
<Filename Value="coedit.lpr"/>
<IsPartOfProject Value="True"/>
@ -244,6 +244,14 @@
<IsPartOfProject Value="True"/>
<UnitName Value="ce_dlangutils"/>
</Unit16>
<Unit17>
<Filename Value="..\src\ce_miniexplorer.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="CEMiniExplorerWidget"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="ce_miniexplorer"/>
</Unit17>
</Units>
</ProjectOptions>
<CompilerOptions>

View File

@ -10,7 +10,7 @@ uses
AnchorDocking, AnchorDockStorage, AnchorDockOptionsDlg,
ce_widget, ce_dmdwrap, ce_common, ce_synmemo, ce_main, ce_messages, ce_editor,
ce_projinspect, ce_projconf, jsonparser, ce_project, ce_widgettypes,
ce_staticexplorer, ce_search, ce_dlang, ce_dlangutils;
ce_staticexplorer, ce_search, ce_dlang, ce_dlangutils, ce_miniexplorer;
{$R *.res}

View File

@ -118,6 +118,31 @@ type
*)
function getDocPath: string;
(**
* Fills aList with the names of the files located in aPath.
*)
procedure listFiles(const aList: TStrings; const aPath: string);
(**
* Fills aList with the names of the folders located in aPath.
*)
procedure listFolders(const aList: TStrings; const aPath: string);
(**
* Checks if aPath contains at least one sub-folder
*)
function hasFolder(const aPath: string): boolean;
(**
* Fills aList with the system drives.
*)
procedure listDrives(const aList: TStrings);
(**
* Lets the shell open a file
*)
function shellOpen(const aFilename: string): boolean;
implementation
procedure TProcessEx.Assign(aValue: TPersistent);
@ -430,4 +455,105 @@ begin
result += directorySeparator + 'Coedit' + directorySeparator;
end;
procedure listFiles(const aList: TStrings; const aPath: string);
var
sr: TSearchrec;
procedure tryAdd;
begin
if sr.Attr and faDirectory <> faDirectory then
aList.Add(aPath + directorySeparator + sr.Name);
end;
begin
if findFirst(aPath + directorySeparator + '*.*', faAnyFile, sr) = 0 then
try
repeat tryAdd;
until findNext(sr) <> 0;
finally
sysutils.FindClose(sr);
end;
end;
function isFolder(sr: TSearchRec): boolean;
begin
result := (sr.Name <> '.') and (sr.Name <> '..' )and (sr.Name <> '' ) and
(sr.Attr and faDirectory = faDirectory);
end;
procedure listFolders(const aList: TStrings; const aPath: string);
var
sr: TSearchrec;
begin
if findFirst(aPath + '*.*', faDirectory, sr) = 0 then
try
repeat if isFolder(sr) then
aList.Add(aPath + sr.Name);
until findNext(sr) <> 0;
finally
sysutils.FindClose(sr);
end;
end;
function hasFolder(const aPath: string): boolean;
var
sr: TSearchrec;
res: boolean;
begin
res := false;
if findFirst(aPath + directorySeparator + '*.*', faDirectory, sr) = 0 then
try
repeat if isFolder(sr) then
begin
res := true;
break;
end;
until findNext(sr) <> 0;
finally
sysutils.FindClose(sr);
end;
result := res;
end;
procedure listDrives(const aList: TStrings);
{$IFDEF WINDOWS}
var
drv: char;
ltr: string;
{$ENDIF}
begin
{$IFDEF WINDOWS}
for drv := 'A' to 'Z' do
begin
ltr := drv + ':\';
case GetDriveType(PChar(ltr)) of
DRIVE_REMOVABLE,
DRIVE_FIXED,
DRIVE_REMOTE: aList.Add(ltr);
end;
end;
{$ENDIF}
{$IFDEF LINUX}
// aList.LoadFromFile('/etc/fstab'); // to be parsed
aList.Add('/home/');
{$ENDIF}
end;
function shellOpen(const aFilename: string): boolean;
begin
{$IFDEF WINDOWS}
result := ShellExecute(0, 'OPEN', PChar(aFilename), nil, nil, SW_SHOW) > 32;
{$ENDIF}
{$IFDEF LINUX}
with TProcess.Create(nil) do
try
Executable := 'xdg-open'
Parameters.Add(aFilename);
Execute;
finally
result := true;
Free;
end;
{$ENDIF}
end;
end.

View File

@ -251,10 +251,13 @@ begin
CEMainForm.MessageWidget.ClearMessages(msEditor);
lex(ed.Lines.Text, tokLst);
checkSyntacticErrors(tokLst, errLst);
for err in errLst do
CEMainForm.MessageWidget.addMessage(format( '%s (@line:%4.d @char:%.4d)',
[err.msg, err.position.y, err.position.x]), msEditor);
if ed.isDSource then
begin
checkSyntacticErrors(tokLst, errLst);
for err in errLst do
CEMainForm.MessageWidget.addMessage(format( '%s (@line:%4.d @char:%.4d)',
[err.msg, err.position.y, err.position.x]), msEditor);
end;
md := '';
if ed.isDSource then

View File

@ -9,7 +9,7 @@ uses
AnchorDocking, AnchorDockStorage, AnchorDockOptionsDlg, Controls, Graphics,
Dialogs, Menus, ActnList, ExtCtrls, process, XMLPropStorage, ComCtrls,
ce_common, ce_dmdwrap, ce_project, ce_synmemo, ce_widget, ce_messages,
ce_editor, ce_projinspect, ce_projconf, ce_staticexplorer, ce_search;
ce_editor, ce_projinspect, ce_projconf, ce_staticexplorer, ce_search, ce_miniexplorer;
type
@ -204,6 +204,7 @@ type
fPrjCfWidg: TCEProjectConfigurationWidget;
fStExpWidg: TCEStaticExplorerWidget;
fFindWidg: TCESearchWidget;
fExplWidg: TCEMiniExplorerWidget;
fProjMru: TMruFileList;
fFileMru: TMruFileList;
@ -302,12 +303,13 @@ var
itm: TMenuItem;
begin
fWidgList := TCEWidgetList.Create;
fMesgWidg := TCEMessagesWidget.create(nil);
fEditWidg := TCEEditorWidget.create(nil);
fProjWidg := TCEProjectInspectWidget.create(nil);
fPrjCfWidg:= TCEProjectConfigurationWidget.create(nil);
fStExpWidg:= TCEStaticExplorerWidget.create(nil);
fFindWidg := TCESearchWidget.create(nil);
fMesgWidg := TCEMessagesWidget.create(self);
fEditWidg := TCEEditorWidget.create(self);
fProjWidg := TCEProjectInspectWidget.create(self);
fPrjCfWidg:= TCEProjectConfigurationWidget.create(self);
fStExpWidg:= TCEStaticExplorerWidget.create(self);
fFindWidg := TCESearchWidget.create(self);
fExplWidg := TCEMiniExplorerWidget.create(self);
fWidgList.addWidget(@fMesgWidg);
fWidgList.addWidget(@fEditWidg);
@ -315,6 +317,7 @@ begin
fWidgList.addWidget(@fPrjCfWidg);
fWidgList.addWidget(@fStExpWidg);
fWidgList.addWidget(@fFindWidg);
fWidgList.addWidget(@fExplWidg);
for widg in fWidgList do
begin
@ -353,16 +356,18 @@ begin
DockMaster.GetAnchorSite(fWidgList.widget[i]).Header.HeaderPosition := adlhpTop;
end;
DockMaster.ManualDock(DockMaster.GetAnchorSite(fEditWidg), DockMaster.GetSite(Self), alBottom);
DockMaster.ManualDock(DockMaster.GetAnchorSite(fMesgWidg), DockMaster.GetSite(Self), alBottom);
DockMaster.ManualDock(DockMaster.GetAnchorSite(fStExpWidg), DockMaster.GetSite(Self), alLeft);
DockMaster.ManualDock(DockMaster.GetAnchorSite(fEditWidg), Self, alBottom);
DockMaster.ManualDock(DockMaster.GetAnchorSite(fMesgWidg), Self, alBottom);
DockMaster.ManualDock(DockMaster.GetAnchorSite(fStExpWidg), Self, alLeft);
DockMaster.ManualDock(DockMaster.GetAnchorSite(fFindWidg),
DockMaster.GetAnchorSite(fStExpWidg), alBottom, fStExpWidg);
width := width - fProjWidg.Width;
DockMaster.ManualDock(DockMaster.GetAnchorSite(fProjWidg), DockMaster.GetSite(Self), alRight);
DockMaster.ManualDock(DockMaster.GetAnchorSite(fProjWidg), Self, alRight);
DockMaster.ManualDock(DockMaster.GetAnchorSite(fPrjCfWidg),
DockMaster.GetAnchorSite(fProjWidg), alBottom, fProjWidg);
DockMaster.GetAnchorSite(fEditWidg).Header.HeaderPosition := adlhpTop;
//DockMaster.GetAnchorSite(fExplWidg).Close;
end;
procedure TCEMainForm.InitSettings;
@ -424,12 +429,6 @@ begin
SaveDocking;
//
fWidgList.Free;
fMesgWidg.Free;
fEditWidg.Free;
fProjWidg.Free;
fPrjCfWidg.Free;
fStExpWidg.Free;
fFindWidg.Free;
fProjMru.Free;
fFileMru.Free;
fProject.Free;
@ -1490,18 +1489,18 @@ begin
end;
procedure TCEOptions.defineProperties(Filer: TFiler);
var
widg: TCEWidget;
begin
inherited;
// Filer is either a TReader or a TWriter
CEMainForm.fEditWidg.declareProperties(Filer);
CEMainForm.fFindWidg.declareProperties(Filer);
CEMainForm.fMesgWidg.declareProperties(Filer);
CEMainForm.fPrjCfWidg.declareProperties(Filer);
CEMainForm.fProjWidg.declareProperties(Filer);
CEMainForm.fStExpWidg.declareProperties(Filer);
for widg in CEMainForm.WidgetList do
widg.declareProperties(Filer);
end;
procedure TCEOptions.beforeSave;
var
widg: TCEWidget;
begin
fLeft := CEMainForm.Left;
fTop := CEMainForm.Top;
@ -1511,12 +1510,8 @@ begin
fFileMru.Assign(CEMainForm.fFileMru);
fProjMru.Assign(CEMainForm.fProjMru);
//
CEMainForm.fEditWidg.beforeSave(nil);
CEMainForm.fFindWidg.beforeSave(nil);
CEMainForm.fMesgWidg.beforeSave(nil);
CEMainForm.fPrjCfWidg.beforeSave(nil);
CEMainForm.fProjWidg.beforeSave(nil);
CEMainForm.fStExpWidg.beforeSave(nil);
for widg in CEMainForm.WidgetList do
widg.beforeSave(nil);
end;
procedure TCEOptions.saveToFile(const aFilename: string);
@ -1534,6 +1529,8 @@ begin
end;
procedure TCEOptions.afterLoad;
var
widg: TCEWidget;
begin
CEMainForm.Left := fLeft;
CEMainForm.Top := fTop;
@ -1543,12 +1540,8 @@ begin
CEMainForm.fFileMru.Assign(fFileMru);
CEMainForm.fProjMru.Assign(fProjMru);
//
CEMainForm.fEditWidg.afterLoad(nil);
CEMainForm.fFindWidg.afterLoad(nil);
CEMainForm.fMesgWidg.afterLoad(nil);
CEMainForm.fPrjCfWidg.afterLoad(nil);
CEMainForm.fProjWidg.afterLoad(nil);
CEMainForm.fStExpWidg.afterLoad(nil);
for widg in CEMainForm.WidgetList do
widg.afterLoad(nil);
end;
{$ENDREGION}

469
src/ce_miniexplorer.lfm Normal file
View File

@ -0,0 +1,469 @@
inherited CEMiniExplorerWidget: TCEMiniExplorerWidget
Left = 1539
Height = 651
Top = 6
Caption = 'Mini explorer'
ClientHeight = 651
inherited Back: TPanel
Height = 651
ClientHeight = 651
inherited Content: TPanel
Height = 651
ClientHeight = 651
object lstFiles: TListView[0]
Left = 4
Height = 275
Top = 372
Width = 324
Align = alClient
AutoWidthLastColumn = True
BorderSpacing.Left = 4
BorderSpacing.Right = 4
BorderSpacing.Bottom = 4
Columns = <
item
Width = 320
end>
ReadOnly = True
ShowColumnHeaders = False
SmallImages = imgList
TabOrder = 0
ViewStyle = vsReport
OnDblClick = lstFilesDblClick
end
object Tree: TTreeView[1]
Left = 4
Height = 195
Top = 171
Width = 324
Align = alTop
BorderSpacing.Left = 4
BorderSpacing.Top = 4
BorderSpacing.Right = 4
DefaultItemHeight = 18
Images = imgList
ReadOnly = True
ScrollBars = ssAutoBoth
TabOrder = 1
Options = [tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips, tvoThemedDraw]
end
object lstFav: TListView[2]
Left = 4
Height = 131
Top = 4
Width = 324
Align = alTop
AutoWidthLastColumn = True
BorderSpacing.Left = 4
BorderSpacing.Top = 4
BorderSpacing.Right = 4
Columns = <
item
Width = 320
end>
ReadOnly = True
ShowColumnHeaders = False
SmallImages = imgList
TabOrder = 2
ViewStyle = vsReport
end
object Panel1: TPanel[3]
Left = 4
Height = 26
Top = 141
Width = 324
Align = alTop
BorderSpacing.Left = 4
BorderSpacing.Right = 4
BevelOuter = bvNone
ClientHeight = 26
ClientWidth = 324
TabOrder = 3
object btnAddFav: TBitBtn
Left = 0
Height = 26
Hint = 'add selected folder to favorites'
Top = 0
Width = 32
Align = alLeft
Glyph.Data = {
36040000424D3604000000000000360000002800000010000000100000000100
2000000000000004000064000000640000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000001E0000003300000033000000330000001E00000000469AD300469A
D300469AD300469AD300469AD300469AD300469AD300479AD5004D99DF000000
001E008C53AC009E5EFF009D5DFF009E5EFF008C55AC0000001E469AD3000000
000B0000000A0000000A0000000A0000000A0000000A0000000A00000008008D
4BAA00A668FF00BA86FF77DFC4FF00BA86FF00A66AFF008C55AC0000002F2959
7A5F2655755C2655745C2655745C2655745C2655745C2653745A24486851009E
52FF00C08AFF00BB82FFFFFFFFFF00BB82FF00C08CFF009E5EFF4598D0F14398
D2FF4094D0FF3E92CFFF3E92CEFF3F92CEFF3F92CEFF4092D1FF4792DAFF009B
4EFF75E5CAFFFFFFFFFFFFFFFFFFFFFFFFFF77E5CCFF009C5CFF4499D2FF3F94
D0FFABFBFFFF9BF3FFFF92F1FFFF93F1FFFF93F1FFFF95F1FFFF9EF4FFFF0096
4AFF00CA93FF00C78EFFFFFFFFFF00C88FFF00CC97FF009D5CFF4397D1FF56AC
DDFF8EDAF5FFA2EDFFFF82E5FEFF84E5FEFF84E5FEFF86E6FFFF8DE9FFFF35BA
9EFF00A965FF00D299FF74ECD1FF00D29AFF00AE6CFF009F56924296D1FF71C4
EAFF6CBCE6FFBBF2FFFF75DEFDFF77DEFCFF78DEFCFF7CDFFDFF80E1FFFF89E4
FFFF32B89EFF009549FF00954AFF00974BFF1F9E91FF000000124095D0FF90DD
F8FF44A0D8FFDDFCFFFFDAFAFFFFDBF9FFFFDEFAFFFF74DCFCFF76DBFBFF78DB
FEFF7CDDFFFF7FDFFFFF7FDFFFFFADECFFFF82C1EEFF3575A7703E93CFFFB2F6
FFFF51ACDEFF358ACAFF358ACAFF358ACAFF368ACAFF5BBDE9FF6ED9FBFF6AD6
FAFF69D5FBFF69D5FBFF68D5FCFF84DEFEFFABE1F8FF3A8AC1C83D92CFFFB8F3
FFFF77DFFEFF7BE0FEFF7CE1FEFF7CE1FFFF7DE2FFFF52ABDDFF56B9E8FFDAF8
FFFFD6F6FFFFD6F6FFFFD5F6FFFFD5F7FFFFDBFCFFFF3E94D0FF3C92CFFFC0F3
FFFF70D9FBFF73DAFBFF74DAFBFF74DAFBFF74DBFBFF76DEFDFF4FA9DCFF368B
CAFF358BCBFF338BCBFF338CCCFF3790CEFF3D94D0FF4398D2AE3B92CFFFCAF6
FFFF69D5F9FF6CD5F9FF6AD4F9FF69D4F9FF69D5F9FF6AD6FAFF6BD8FBFF6BD9
FCFF6BDAFDFF69DAFDFFDAFDFFFF3C93D0FF367BAA2F469AD3003B92CFFFD5F7
FFFF60D1F9FF61D0F8FFB4EBFDFFD9F6FFFFDAF8FFFFDAF8FFFFDAF9FFFFDBF9
FFFFDAF9FFFFDAFAFFFFDFFEFFFF3D94D0FF4599D335469AD3003D94D0FFDCFC
FFFFD8F7FFFFD8F7FFFFDBFAFFFF358ECDFF3991CEFF3A92CFFF3A92CFFF3A92
CFFF3A92CFFF3A92CFFF3D94D0FF4298D2EA469AD300469AD3004398D2EF3D94
D0FF3A92CFFF3A92CFFF3D94D0FF4197D1E44398D22B4498D2324498D2334498
D2334498D2334499D2334499D337459AD300469AD300469AD300
}
OnClick = btnAddFavClick
TabOrder = 0
end
object btnEdit: TBitBtn
Left = 292
Height = 26
Hint = 'open selected file in a Coedit-or'
Top = 0
Width = 32
Align = alRight
Glyph.Data = {
36040000424D3604000000000000360000002800000010000000100000000100
2000000000000004000064000000640000000000000000000000FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001340
58FF15425EFF25699CFF2C76B4FF3B8BBAADFFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001242
59FF5D9CD4FFA6CFF5FFA9CFECFF488BC1FF2C76B4FFFFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001E6D
93FFCBE3F9FF61AAECFF4098E8FF1567C2FF1660AAFF2C76B4FFFFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF001E6D
93FFC8E1F2FFD1E7FAFF347DB5FF3199C3FF6DC4DCFF4A9CCFFF3483C7FFFFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002063
98202689B9FFB0CBE1FF67A9C8FF60DCF5FF44D6F4FF8EEEFAFF5DB4E6FF3B8F
D9FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF002689B9FFBEE6F2FFB3F4FCFF60DCF5FF44D6F4FF8EEEFAFF5DB4
E6FF3B8FD9FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF002790BFFFC3EDF8FFB3F4FCFF60DCF5FF44D6F4FF8EEE
FAFF5DB4E6FF3B8FD9FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF002FBAE4FFC3EDF8FFB3F4FCFF60DCF5FF44D6
F4FF8EEEFAFF5DB4E6FF3B8FD9FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002FBAE4FFC3EDF8FFB3F4FCFF60DC
F5FF44D6F4FF8EEEFAFF5DB4E6FF3B8FD9FFFFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002FBAE4FFC3EDF8FFB3F4
FCFF68D9F5FF6FCFF3FF599DD0FF73ABDDFF4F91C9FFFFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002FBAE4FFC3ED
F8FFA8E2F8FF6CAEDDFFA5CFF4FFA5CFF4FFBDDBF7FF5393CBF7FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF002FBA
E4FFA7D4F4FFC5E1F8FFCCE3F9FFCCE3F9FFBDDBF7FF4F90C9FDFFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF0050A8D9FF6AA5D8FFC9E1F7FFCBE3F8FF4295CAFF3182C2AEFFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF002FBAE4094FAADBEA5093CAFD4E90C8FF2F9DD2DF35A4DE19FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
}
OnClick = btnEditClick
TabOrder = 1
end
object btnShellOpen: TBitBtn
Left = 260
Height = 26
Hint = 'open the selected file with the shell'
Top = 0
Width = 32
Align = alRight
Glyph.Data = {
36040000424D3604000000000000360000002800000010000000100000000100
2000000000000004000064000000640000000000000000000000FFFFFF00FFFF
FF00FFFFFF0027A8DC37FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF0029ACDED527A9DCE925A6DB0CFFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF002BAFDF0C2DAEDFFF2BABDEFF25A6DB8AFFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF002BAFDFCF4FBCE7FF4CBAE6FF26A7DCED24A4DB17FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF002BAFDFFF84D3F2FF55BDE7FF2EAADEFF24A4
DB90FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF002DB2E0C070CCEEFF83D2F2FF7ECEF1FF4AB6
E4FF24A5DBF122A2DA17FFFFFF00FFFFFF00FFFFFF00FFFFFF0038C2E7F036C0
E6F835BDE5F833BBE4F831B8E3F82FB6E2F886D7F3FF2FB6EBFF4ABCECFF80CE
F1FF51B9E6FF2CA8DDFF23A2DA9DFFFFFF00FFFFFF00FFFFFF003AC4E8E975DA
F2FF93E6F8FF91E3F7FF8DE0F6FF8ADCF5FF8ADBF5FF88D7F4FF84D3F2FF7FCF
F1FF7CCCF0FF7AC9EFFF48B4E3FF23A3DAF5209ED823FFFFFF003BC7E9374FCD
ECFF98E9F9FF4AD5F3FF45CFF1FF40CAF0FF38C2EEFF89D9F4FF2EB4E1FE2CB1
E0F82BAEDFF829ACDEF827A9DCF825A6DBF823A3DAE9FFFFFF00FFFFFF003BC7
E9F480E1F5FF8EE6F8FF43D2F3FF3FCDF1FF39C7EFFF8CDCF5FF58C6EAFF2EB4
E174FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003DC9
EA545BD4EFFF99EAF9FF47D6F4FF42D0F2FF3DCBF0FF6ED5F3FF7FD7F3FF4AC0
E7FF2FB4E14AFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF003DCAEAF993E9F9FF72E1F7FF45D4F3FF41CEF2FF3CC9F0FF8ADCF5FF70D0
EFFF3DBBE4FF2FB5E123FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF003FCCEB8364D9F1FF9AEBFAFF48D8F4FF44D3F3FF3FCEF1FF3AC8F0FF8CDC
F5FF62CBEDFF31B8E3FCFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF003FCCEBFD9AEDFAFF99EBF9FF97E8F9FF94E5F8FF91E2F7FF8EDF
F6FF8BDBF5FF56C7EBFF31B8E3F3FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF0040CEECA23FCCEBFF3ECBEAFF3CC9E9FF3BC7E9FF3AC4E8FF38C2
E7FF36C0E6FF35BDE5FF33BBE4FF31B8E3E1FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00
}
OnClick = btnShellOpenClick
TabOrder = 2
end
object btnRemFav: TBitBtn
Left = 32
Height = 26
Hint = 'remove selected folder from the favorites'
Top = 0
Width = 32
Align = alLeft
Glyph.Data = {
36040000424D3604000000000000360000002800000010000000100000000100
2000000000000004000064000000640000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000001E0000003300000033000000330000001E00000000469AD300469A
D300469AD300469AD300469AD300469AD300469AD300469BD30048A2D3000000
001E3044B4AC384DCCFF384DCBFF384DCCFF3145B4AC0000001E469AD3000000
000B0000000A0000000A0000000A0000000A0000000A0000000A000000082F3D
B4AA3851D7FF385DF9FF375DFAFF385DF9FF3852D7FF3044B4AC0000002F2959
7A5F2655755C2655745C2655745C2655745C2655745C2654725A214B63513342
CBFF4164FBFF3C60FAFF3A5DF8FF3C60FAFF4165FBFF344BCCFF4598D0F14398
D2FF4094D0FF3E92CFFF3E92CEFF3F92CEFF3F92CEFF4094CFFF419BCFFF2E3E
C9FFA9B8FFFFFFFFFFFFFFFFFFFFFFFFFFFFA9BAFFFF3148CAFF4499D2FF3F94
D0FFABFBFFFF9BF3FFFF92F1FFFF93F1FFFF93F1FFFF94F3FFFF98FCFFFF2A38
C6FF5B75FDFF5775FEFF5473FDFF5775FEFF5D79FFFF3349CBFF4397D1FF56AC
DDFF8EDAF5FFA2EDFFFF82E5FEFF84E5FEFF84E5FEFF86E7FEFF89EEFFFF5589
E0FF4052D9FF6E85FFFF7289FFFF6E86FFFF4559DCFF3446CC924296D1FF71C4
EAFF6CBCE6FFBBF2FFFF75DEFDFF77DEFCFF78DEFCFF7BDFFCFF7FE3FDFF83EC
FFFF5186DEFF2B38C6FF2B3AC6FF2B3AC7FF3E6FCFFF000000124095D0FF90DD
F8FF44A0D8FFDDFCFFFFDAFAFFFFDBF9FFFFDEFAFFFF74DCFCFF76DCFBFF77DD
FBFF79E2FCFF7AE6FDFF79E7FEFFA7F4FFFF7FC6E7FF3377A4703E93CFFFB2F6
FFFF51ACDEFF358ACAFF358ACAFF358ACAFF368ACAFF5BBDE9FF6ED9FBFF6AD6
FAFF69D6FAFF68D6FAFF67D6FAFF83DFFCFFAAE1F6FF3A8AC1C83D92CFFFB8F3
FFFF77DFFEFF7BE0FEFF7CE1FEFF7CE1FFFF7DE2FFFF52ABDDFF56B9E8FFDAF8
FFFFD6F6FFFFD6F6FFFFD5F6FFFFD5F7FFFFDBFCFFFF3E94D0FF3C92CFFFC0F3
FFFF70D9FBFF73DAFBFF74DAFBFF74DAFBFF74DBFBFF76DEFDFF4FA9DCFF368B
CAFF358BCBFF338BCBFF338CCCFF3790CEFF3D94D0FF4398D2AE3B92CFFFCAF6
FFFF69D5F9FF6CD5F9FF6AD4F9FF69D4F9FF69D5F9FF6AD6FAFF6BD8FBFF6BD9
FCFF6BDAFDFF69DAFDFFDAFDFFFF3C93D0FF367BAA2F469AD3003B92CFFFD5F7
FFFF60D1F9FF61D0F8FFB4EBFDFFD9F6FFFFDAF8FFFFDAF8FFFFDAF9FFFFDBF9
FFFFDAF9FFFFDAFAFFFFDFFEFFFF3D94D0FF4599D335469AD3003D94D0FFDCFC
FFFFD8F7FFFFD8F7FFFFDBFAFFFF358ECDFF3991CEFF3A92CFFF3A92CFFF3A92
CFFF3A92CFFF3A92CFFF3D94D0FF4298D2EA469AD300469AD3004398D2EF3D94
D0FF3A92CFFF3A92CFFF3D94D0FF4197D1E44398D22B4498D2324498D2334498
D2334498D2334499D2334499D337459AD300469AD300469AD300
}
OnClick = btnRemFavClick
TabOrder = 3
end
object Bevel1: TBevel
Left = 196
Height = 26
Top = 0
Width = 64
Align = alRight
Shape = bsTopLine
end
object Bevel2: TBevel
Left = 64
Height = 26
Top = 0
Width = 72
Align = alLeft
Shape = bsBottomLine
end
end
object Splitter1: TSplitter[4]
Cursor = crVSplit
Left = 0
Height = 6
Top = 135
Width = 332
Align = alTop
ResizeAnchor = akTop
end
object Splitter2: TSplitter[5]
Cursor = crVSplit
Left = 0
Height = 6
Top = 366
Width = 332
Align = alTop
ResizeAnchor = akTop
end
end
end
object imgList: TImageList[2]
left = 32
Bitmap = {
4C69050000001000000010000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00B2B2B2B0AFAFAFFFADADADFFADADADFFADADADFFAEAE
AEFFAEAEAEFFB0B0B0AC00000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00AEAEAEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0E0
E0FFFFFFFFFFEBEBEBFFB0B0B0ACFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00ADADADFFFFFFFFFFE0E0E0FFE0E0E0FFFFFFFFFFA5A5
A5FFF3F3F3FFFFFFFFFFAEAEAEFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00ADADADFFFFFFFFFFE5E5E5FFE5E5E5FFFFFFFFFFBCBC
BCFFA5A5A5FFE0E0E0FFAEAEAEFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00ACACACFFFFFFFFFFEBEBEBFFEAEAEAFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFADADADFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00ACACACFFFFFFFFFFEFEFEFFFEFEFEFFFEEEEEEFFEEEE
EEFFEFEFEFFFFFFFFFFFACACACFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00ACACACFFFFFFFFFFF5F5F5FFF5F5F5FFF5F5F5FFF5F5
F5FFF5F5F5FFFFFFFFFFACACACFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00ADADADFFFFFFFFFFFBFBFBFFFAFAFAFFFAFAFAFFFAFA
FAFFFBFBFBFFFFFFFFFFADADADFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00AFAFAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFAFAFAFFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00B0B0B0F2AEAEAEFFADADADFFACACACFFACACACFFACAC
ACFFADADADFFAEAEAEFFA3A3A3C0FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF0000000030000000330000003300000033000000330000
0033000000330000003300000023FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF004398D2B03D94D0FF3A92CFFF3A92CFFF3D94
D0FF4197D1D24398D2004498D2004498D2004498D2004498D2004499D2004499
D300459AD300469AD300469AD3003D94D0FFDCFCFFFFD8F7FFFFD8F7FFFFDBFA
FFFF358ECDFF3991CEFF3A92CFFF3A92CFFF3A92CFFF3A92CFFF3B92CFFF3D94
D0FF4398D2D7469AD300469AD3003B92CFFFD5F7FFFF60D1F9FF61D0F8FFB4EB
FDFFD9F6FFFFDAF8FFFFDAF8FFFFDBF9FFFFDCFAFFFFDCFAFFFFDCFBFFFFE0FF
FFFF3E95D0FF4599D333469AD3003B92CFFFCAF6FFFF69D5F9FF6CD5F9FF6BD5
F9FF69D5F9FF69D5FAFF6AD7FBFF68D4FAFF5EC7F1FF5EC7F2FF5DC8F2FFB4E3
F8FF3D94D0FF3F8FC669469AD3003C92CFFFC0F3FFFF71DAFBFF74DBFBFF75DB
FCFF75DBFCFF76DCFCFF73DAFAFF449CD4FF378CCBFF368CCBFF358CCCFF348D
CCFF3890CEFF3D94D0FF4398D2EB3D92CFFFB9F4FFFF73DBFBFF6BCCF2FF6CCD
F3FF6CCEF3FF6DCEF3FF479CD4FF56BAE9FFDAF8FFFFD7F6FFFFD6F6FFFFD5F6
FFFFD5F7FFFFDBFCFFFF3E94D0FF3E94D0FFABF0FFFF449DD6FF368CCBFF368C
CBFF368CCBFF378BCBFF5CBEEAFF6FD9FBFF6AD6FAFF68D5F9FF67D4F9FF66D4
F9FF82DEFCFFAAE0F6FF3885BCB94095D0FF8AD7F5FF44A1D8FFDDFDFFFFDAFA
FFFFDBFAFFFFDEFAFFFF74DCFCFF76DBFAFF75DAFAFF74DAFAFF74DAFAFF72D9
FAFFA1E8FFFF7CBFE6FF306F9C5E4296D1FF6BBEE8FF6DBDE6FFBBF2FFFF75DE
FDFF77DEFCFF78DEFCFF7BDFFCFF7DDFFCFF7DDFFCFF7DDFFCFF7CDFFCFF80E0
FDFFADF0FFFF4D9DD3FF0000000E4398D2FF4FA6D9FF8EDAF5FFA2EEFFFF82E5
FEFF84E5FEFF84E5FEFF85E6FEFF85E6FEFF85E6FEFF85E6FEFF84E6FEFF96EB
FFFF8CD8F5FF3985BCB84499D2004499D2FF3F94D0FFABFBFFFF9BF3FFFF92F1
FFFF93F1FFFF93F1FFFF93F1FFFF93F1FFFF93F1FFFF93F1FFFF93F1FFFFA6F8
FFFF65B8E3FF31709D5F469AD3004598D1F24398D2FF4094D0FF3E92CFFF3E92
CEFF3F92CEFF3F92CEFF3F92CEFF3F92CEFF3F92CEFF3F92CEFF3F92CEFF3F93
CFFF4194CEF00000000E469AD300000000300000003300000033000000330000
0033000000330000003300000033000000330000003300000033000000330000
00330000002F0000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000FB4DA2126B9DEFF0B97CC1CFFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000EB0D9EB7CD0EAFF0A94CAF0FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF000EB8DC110EB5DC7267C8E6FFBBECFAFF50B7DFFF0A98
CE740BA9D711FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF000FB3DAFB0EB5DBFE1EB8DCFF6FCCE8FFACE4F5FF9BE3F8FF9DDDF3FF5ABE
E2FF17A9D7FF0AA0D4FD0889C9FCFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF000B96C87548B0D5FF93D6ECFFBDEDFBFF9CE4F8FF5FD1F3FF8ADCF6FFA4E4
F8FF75C6E5FF369AC9FF0679B67934B4D9D05EC2E1FA60C3E2FA60C3E2FA60C3
E2FA5FC3E2FA29A8D4E846AFD8FFB7EBF9FF6FD6F4FF55CDF2FF50CCF2FF9DDF
F4FF369BCBFF0679B659FFFFFF0036B3DAF8FDFEFEFFFEFFFFFFFEFEFFFFFDFE
FFFFFEFFFFFFEAF7FBFF28A4D4FD7ECDEBFF8DDEF6FF99E1F7FF75D6F4FF70C5
E6FF0C82BED1FFFFFF00FFFFFF0035AFDAF0F7FCFEFF8EE4F8FF91DEF5FF9FE0
F5FFACE1F6FFEFFBFEFF48B7DEFF8BD2EDFFA3E1F2FF5FBBE1FF98DDF4FF77CB
ECFF0F83C2F6FFFFFF00FFFFFF0036AADAF2F1FAFDFF94DEF5FF93DCF4FF81D5
F2FF60C0E9FF4FAEE1FF3594DAFF3594DAFF3594DAFF3594DAFF3594DAFF3594
DAFF3594DAFFFFFFFF00FFFFFF0035ABDAFAE8F6FBFF7EC5EAFF5BAEE3FF51A8
E1FF60AFE4FFE8F9FDFF92CCE7FFB5DBEDFFE5F6FCFFE4F5FCFFE4F5FCFFCFE4
F1FF3594DAFFFFFFFF00FFFFFF0037A6DAFAFEFFFFFFF8FDFFFFF6FDFFFFF5FC
FFFFE8FAFEFFACEBF9FF84DCF4FF87E3F8FF7DE0F7FF72DDF6FF68DBF5FFE9F9
FDFF3594DAFF0166B705FFFFFF0036A1DAF9F6FCFEFFC8F2FCFFB9EFFBFFACEC
FAFF8CE4F8FF8AE3F8FF82E1F7FF79DFF7FF6DDDF6FF61DAF5FF57D7F4FFE7F8
FDFF3594DAFFFFFFFF00FFFFFF00369ADAF8F2FAFDFFB3EDFAFFA4E9F9FF95E6
F8FF85E2F7FF81E1F7FF7AE0F7FF6FDDF6FF62DAF5FF54D6F3FF47D3F2FFE8F9
FDFF3594DAFFFFFFFF00FFFFFF003594DAF7EFFAFEFFA1E9F9FF91E5F8FF81E1
F7FF72DEF6FF63DAF5FF54D7F4FF47D3F3FF39D0F2FF2ECDF1FF26CBF0FFCAF2
FBFF3594DAF7FFFFFF00FFFFFF00338ED9E6DCF0FAF0A7DDF4FD9EDBF4FF96DA
F3FF8ED8F3FF86D7F3FF7FD4F2FF79D3F2FF72D2F1FF6CD0F1FF69CFF1FFC2EA
F8FE338ED9F0FFFFFF00FFFFFF002C86D8002D88D8A62D87D8EA2D88D8F72D88
D8F72D88D8F72D88D8F72D88D8F72D88D8F72D88D8F72D88D8F72D87D8F72D88
D8F12C86D893FFFFFF00FFFFFF004398D2EF3D94D0FF3A92CFFF3A92CFFF3D94
D0FF4197D1E44398D22B4498D2324498D2334498D2334498D2334499D2334499
D337459AD300469AD300469AD3003D94D0FFDCFCFFFFD8F7FFFFD8F7FFFFDBFA
FFFF358ECDFF3991CEFF3A92CFFF3A92CFFF3A92CFFF3A92CFFF3A92CFFF3D94
D0FF4298D2EA469AD300469AD3003B92CFFFD5F7FFFF60D1F9FF61D0F8FFB4EB
FDFFD9F6FFFFDAF8FFFFDAF8FFFFDAF9FFFFDBF9FFFFDAF9FFFFDAFAFFFFDFFE
FFFF3D94D0FF4599D335469AD3003B92CFFFCAF6FFFF69D5F9FF6CD5F9FF6AD4
F9FF69D4F9FF69D5F9FF6AD6FAFF6BD8FBFF6BD9FCFF6BDAFDFF69DAFDFFDAFD
FFFF3C93D0FF367BAA2F469AD3003C92CFFFC0F3FFFF70D9FBFF73DAFBFF74DA
FBFF74DAFBFF74DBFBFF76DEFDFF4FA9DCFF368BCAFF358BCBFF338BCBFF338C
CCFF3790CEFF3D94D0FF4398D2AE3D92CFFFB8F3FFFF77DFFEFF7BE0FEFF7CE1
FEFF7CE1FFFF7DE2FFFF52ABDDFF56B9E8FFDAF8FFFFD6F6FFFFD6F6FFFFD5F6
FFFFD5F7FFFFDBFCFFFF3E94D0FF3E93CFFFB2F6FFFF51ACDEFF358ACAFF358A
CAFF358ACAFF368ACAFF5BBDE9FF6ED9FBFF6AD6FAFF69D6FAFF68D6FAFF67D6
FAFF83DFFCFFAAE1F6FF3A8AC1C84095D0FF90DDF8FF44A0D8FFDDFCFFFFDAFA
FFFFDBF9FFFFDEFAFFFF74DCFCFF76DCFBFF77DDFBFF79E2FCFF7AE6FDFF79E7
FEFFA7F4FFFF7FC6E7FF3377A4704296D1FF71C4EAFF6CBCE6FFBBF2FFFF75DE
FDFF77DEFCFF78DEFCFF7BDFFCFF7FE3FDFF83ECFFFF5186DEFF2B38C6FF2B3A
C6FF2B3AC7FF3E6FCFFF000000124397D1FF56ACDDFF8EDAF5FFA2EDFFFF82E5
FEFF84E5FEFF84E5FEFF86E7FEFF89EEFFFF5589E0FF4052D9FF6E85FFFF7289
FFFF6E86FFFF4559DCFF3446CC924499D2FF3F94D0FFABFBFFFF9BF3FFFF92F1
FFFF93F1FFFF93F1FFFF94F3FFFF98FCFFFF2A38C6FF5B75FDFF5775FEFF5473
FDFF5775FEFF5D79FFFF3349CBFF4598D0F14398D2FF4094D0FF3E92CFFF3E92
CEFF3F92CEFF3F92CEFF4094CFFF419BCFFF2E3EC9FFA9B8FFFFFFFFFFFFFFFF
FFFFFFFFFFFFA9BAFFFF3148CAFF0000002F29597A5F2655755C2655745C2655
745C2655745C2655745C2654725A214B63513342CBFF4164FBFF3C60FAFF3A5D
F8FF3C60FAFF4165FBFF344BCCFF469AD3000000000B0000000A0000000A0000
000A0000000A0000000A0000000A000000082F3DB4AA3851D7FF385DF9FF375D
FAFF385DF9FF3852D7FF3044B4AC469AD300469AD300469AD300469AD300469A
D300469AD300469AD300469BD30048A2D3000000001E3044B4AC384DCCFF384D
CBFF384DCCFF3145B4AC0000001E000000000000000000000000000000000000
000000000000000000000000000000000000000000000000001E000000330000
0033000000330000001E000000004398D2EF3D94D0FF3A92CFFF3A92CFFF3D94
D0FF4197D1E44398D22B4498D2324498D2334498D2334498D2334499D2334499
D337459AD300469AD300469AD3003D94D0FFDCFCFFFFD8F7FFFFD8F7FFFFDBFA
FFFF358ECDFF3991CEFF3A92CFFF3A92CFFF3A92CFFF3A92CFFF3A92CFFF3D94
D0FF4298D2EA469AD300469AD3003B92CFFFD5F7FFFF60D1F9FF61D0F8FFB4EB
FDFFD9F6FFFFDAF8FFFFDAF8FFFFDAF9FFFFDBF9FFFFDAF9FFFFDAFAFFFFDFFE
FFFF3D94D0FF4599D335469AD3003B92CFFFCAF6FFFF69D5F9FF6CD5F9FF6AD4
F9FF69D4F9FF69D5F9FF6AD6FAFF6BD8FBFF6BD9FCFF6BDAFDFF69DAFDFFDAFD
FFFF3C93D0FF367BAA2F469AD3003C92CFFFC0F3FFFF70D9FBFF73DAFBFF74DA
FBFF74DAFBFF74DBFBFF76DEFDFF4FA9DCFF368BCAFF358BCBFF338BCBFF338C
CCFF3790CEFF3D94D0FF4398D2AE3D92CFFFB8F3FFFF77DFFEFF7BE0FEFF7CE1
FEFF7CE1FFFF7DE2FFFF52ABDDFF56B9E8FFDAF8FFFFD6F6FFFFD6F6FFFFD5F6
FFFFD5F7FFFFDBFCFFFF3E94D0FF3E93CFFFB2F6FFFF51ACDEFF358ACAFF358A
CAFF358ACAFF368ACAFF5BBDE9FF6ED9FBFF6AD6FAFF69D5FBFF69D5FBFF68D5
FCFF84DEFEFFABE1F8FF3A8AC1C84095D0FF90DDF8FF44A0D8FFDDFCFFFFDAFA
FFFFDBF9FFFFDEFAFFFF74DCFCFF76DBFBFF78DBFEFF7CDDFFFF7FDFFFFF7FDF
FFFFADECFFFF82C1EEFF3575A7704296D1FF71C4EAFF6CBCE6FFBBF2FFFF75DE
FDFF77DEFCFF78DEFCFF7CDFFDFF80E1FFFF89E4FFFF32B89EFF009549FF0095
4AFF00974BFF1F9E91FF000000124397D1FF56ACDDFF8EDAF5FFA2EDFFFF82E5
FEFF84E5FEFF84E5FEFF86E6FFFF8DE9FFFF35BA9EFF00A965FF00D299FF74EC
D1FF00D29AFF00AE6CFF009F56924499D2FF3F94D0FFABFBFFFF9BF3FFFF92F1
FFFF93F1FFFF93F1FFFF95F1FFFF9EF4FFFF00964AFF00CA93FF00C78EFFFFFF
FFFF00C88FFF00CC97FF009D5CFF4598D0F14398D2FF4094D0FF3E92CFFF3E92
CEFF3F92CEFF3F92CEFF4092D1FF4792DAFF009B4EFF75E5CAFFFFFFFFFFFFFF
FFFFFFFFFFFF77E5CCFF009C5CFF0000002F29597A5F2655755C2655745C2655
745C2655745C2655745C2653745A24486851009E52FF00C08AFF00BB82FFFFFF
FFFF00BB82FF00C08CFF009E5EFF469AD3000000000B0000000A0000000A0000
000A0000000A0000000A0000000A00000008008D4BAA00A668FF00BA86FF77DF
C4FF00BA86FF00A66AFF008C55AC469AD300469AD300469AD300469AD300469A
D300469AD300469AD300479AD5004D99DF000000001E008C53AC009E5EFF009D
5DFF009E5EFF008C55AC0000001E000000000000000000000000000000000000
000000000000000000000000000000000000000000000000001E000000330000
0033000000330000001E00000000
}
end
end

369
src/ce_miniexplorer.pas Normal file
View File

@ -0,0 +1,369 @@
unit ce_miniexplorer;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
Menus, StdCtrls, ComCtrls, Buttons, ce_widget, lcltype;
type
{ TCEMiniExplorerWidget }
TCEMiniExplorerWidget = class(TCEWidget)
Bevel1: TBevel;
Bevel2: TBevel;
btnAddFav: TBitBtn;
btnEdit: TBitBtn;
btnShellOpen: TBitBtn;
btnRemFav: TBitBtn;
imgList: TImageList;
lstFiles: TListView;
lstFav: TListView;
Panel1: TPanel;
Splitter1: TSplitter;
Splitter2: TSplitter;
Tree: TTreeView;
procedure btnEditClick(Sender: TObject);
procedure btnShellOpenClick(Sender: TObject);
procedure btnAddFavClick(Sender: TObject);
procedure btnRemFavClick(Sender: TObject);
procedure lstFilesDblClick(Sender: TObject);
private
fFavorites: TStringList;
fLastFold: string;
procedure optset_LastFold(aReader: TReader);
procedure optget_LastFold(aWriter: TWriter);
procedure optset_Favs(aReader: TReader);
procedure optget_Favs(aWriter: TWriter);
procedure updateFavorites;
procedure treeSetRoots;
procedure lstFilesFromTree;
procedure treeScanSubFolders(aRoot: TTreeNode);
procedure treeClick(sender: TObject);
procedure treeChanged(Sender: TObject; Node: TTreeNode);
procedure treeCollapsed(Sender: TObject; Node: TTreeNode);
procedure treeExpanded(Sender: TObject; Node: TTreeNode);
procedure treeCollapsing(Sender: TObject; Node: TTreeNode; var allow: boolean);
procedure treeExpanding(Sender: TObject; Node: TTreeNode; var allow: boolean);
procedure treeDeletion(Sender: TObject; Item: TTreeNode);
procedure treeSelectionChanged(sender: TObject);
procedure favStringsChange(sender: TObject);
procedure fillLstFiles(const aList: TStrings);
procedure lstDeletion(Sender: TObject; Item: TListItem);
procedure lstFavSelect(Sender: TObject; Item: TListItem; Selected: Boolean);
procedure shellOpenSelected;
public
constructor create(aIwner: TComponent); override;
destructor destroy; override;
//
procedure declareProperties(aFiler: TFiler); override;
end;
implementation
{$R *.lfm}
uses
ce_main, ce_common;
//TODO-cbugfix: click on the expander glyph, sometime the subdirs are not scanned but the
//fake sub still displayed
{$REGION Standard Comp/Obj------------------------------------------------------}
constructor TCEMiniExplorerWidget.create(aIwner: TComponent);
begin
inherited;
fFavorites := TStringList.Create;
fFavorites.onChange := @favStringsChange;
lstFiles.OnDeletion := @lstDeletion;
lstFav.OnDeletion := @lstDeletion;
lstFav.OnSelectItem := @lstFavSelect;
Tree.OnClick := @treeClick;
Tree.OnChange := @treeChanged;
Tree.OnDeletion := @treeDeletion;
Tree.OnSelectionChanged := @treeSelectionChanged;
Tree.OnExpanded := @treeExpanded;
Tree.OnCollapsed := @treeCollapsed;
Tree.OnCollapsing := @treeCollapsing;
Tree.OnExpanding := @treeExpanding;
//
treeSetRoots;
end;
destructor TCEMiniExplorerWidget.destroy;
begin
fFavorites.Free;
inherited;
end;
procedure TCEMiniExplorerWidget.lstDeletion(Sender: TObject; Item: TListItem);
begin
if Item.Data <> nil then
DisposeStr(PString(Item.Data));
end;
{$ENDREGION}
{$REGION ICEWidgetPersist ------------------------------------------------------}
procedure TCEMiniExplorerWidget.declareProperties(aFiler: TFiler);
begin
inherited;
aFiler.DefineProperty(Name + '_LastFolder', @optset_LastFold, @optget_LastFold, true);
aFiler.DefineProperty(Name + '_FavoritesFolders', @optset_Favs, @optget_Favs, true);
end;
procedure TCEMiniExplorerWidget.optset_LastFold(aReader: TReader);
var
lst: TstringList;
begin
fLastFold := aReader.ReadString;
if not directoryExists(fLastFold) then exit;
//
lst := TStringList.Create;
try
listFiles(lst, fLastFold);
fillLstFiles(lst);
finally
lst.Free;
end;
end;
procedure TCEMiniExplorerWidget.optget_LastFold(aWriter: TWriter);
begin
aWriter.WriteString(fLastFold);
end;
procedure TCEMiniExplorerWidget.optset_Favs(aReader: TReader);
begin
fFavorites.DelimitedText := aReader.ReadString;
if fLastFold <> '' then
if fFavorites.IndexOf(fLastFold) = -1 then
fFavorites.Add(fLastFold);
updateFavorites;
end;
procedure TCEMiniExplorerWidget.optget_Favs(aWriter: TWriter);
begin
aWriter.WriteString(fFavorites.DelimitedText);
end;
{$ENDREGION}
{$REGION Favorites -------------------------------------------------------------}
procedure TCEMiniExplorerWidget.favStringsChange(sender: TObject);
begin
updateFavorites;
end;
procedure TCEMiniExplorerWidget.updateFavorites;
var
itm: TListItem;
fold: string;
dat: PString;
begin
lstFav.Clear;
for fold in fFavorites do
begin
itm := lstFav.Items.Add;
itm.Caption := shortenPath(fold);
dat := NewStr(fold);
itm.Data := dat;
itm.ImageIndex := 2;
end;
end;
procedure TCEMiniExplorerWidget.lstFavSelect(Sender: TObject; Item: TListItem; Selected: Boolean);
var
lst: TStringList;
begin
if not Selected then exit;
//
fLastFold := PString(Item.Data)^;
lstFiles.Clear;
lst := TStringList.Create;
try
listFiles(lst, fLastFold);
fillLstFiles(lst);
finally
end;
end;
procedure TCEMiniExplorerWidget.btnRemFavClick(Sender: TObject);
var
i: Integer;
begin
if lstFav.Selected = nil then exit;
i := fFavorites.IndexOf(PString(lstFav.Selected.Data)^);
if i <> -1 then fFavorites.Delete(i);
lstFiles.Clear;
end;
procedure TCEMiniExplorerWidget.lstFilesDblClick(Sender: TObject);
begin
shellOpenSelected;
end;
procedure TCEMiniExplorerWidget.btnAddFavClick(Sender: TObject);
begin
if Tree.Selected = nil then exit;
fFavorites.Add(PString(Tree.Selected.Data)^);
end;
{$ENDREGION}
{$REGION Files -----------------------------------------------------------------}
procedure TCEMiniExplorerWidget.fillLstFiles(const aList: TStrings);
var
itm: TListItem;
fname: string;
dat: PString;
begin
lstFiles.Clear;
for fname in aList do
begin
itm := lstFiles.Items.Add;
itm.Caption := extractFileName(fname);
dat := NewStr(fname);
itm.Data := dat;
itm.ImageIndex := 0;
end;
end;
procedure TCEMiniExplorerWidget.btnShellOpenClick(Sender: TObject);
begin
shellOpenSelected;
end;
procedure TCEMiniExplorerWidget.btnEditClick(Sender: TObject);
var
fname: string;
begin
if lstFiles.Selected = nil then exit;
if lstFiles.Selected.Data = nil then exit;
fname := PString(lstFiles.Selected.Data)^;
if not fileExists(fname) then exit;
CEMainForm.openFile(fname);
end;
procedure TCEMiniExplorerWidget.shellOpenSelected;
var
fname: string;
begin
if lstFiles.Selected = nil then exit;
if lstFiles.Selected.Data = nil then exit;
fname := PString(lstFiles.Selected.Data)^;
if not fileExists(fname) then exit;
if not shellOpen(fname) then CEMainForm.MessageWidget.addCeErr
(format('the shell failed to open "%s"',[shortenPath(fname,25)]));
end;
{$ENDREGION}
{$REGION Tree ------------------------------------------------------------------}
procedure TCEMiniExplorerWidget.treeDeletion(Sender: TObject; Item: TTreeNode);
begin
if Item.Data <> nil then
DisposeStr(PString(Item.Data));
end;
procedure TCEMiniExplorerWidget.treeSetRoots;
var
drv: string;
itm: TTreeNode;
lst: TStringList;
begin
Tree.Items.Clear;
lst := TStringList.Create;
try
listDrives(lst);
for drv in lst do
begin
itm := Tree.Items.Add(nil, drv);
itm.Data := NewStr(drv[1..length(drv)-1]);
treeScanSubFolders(itm);
end;
finally
lst.Free;
end;
end;
procedure TCEMiniExplorerWidget.lstFilesFromTree;
var
lst: TStringList;
pth: string;
begin
if Tree.Selected = nil then exit;
//
lst := TStringList.Create;
try
pth := PString(Tree.Selected.Data)^;
listFiles(lst, pth);
fillLstFiles(lst);
finally
lst.Free;
end;
end;
procedure TCEMiniExplorerWidget.treeScanSubFolders(aRoot: TTreeNode);
var
lst: TStringList;
fold: string;
itm: TTreeNode;
begin
aRoot.DeleteChildren; // delete the fake item...
lst := TStringList.Create;
try
listFolders(lst, PString(aRoot.Data)^ + directorySeparator);
for fold in lst do
begin
itm := Tree.Items.AddChild(aRoot, extractFileName(fold));
itm.Data := NewStr(fold);
itm.ImageIndex := 1;
itm.SelectedIndex := 1;
//
if hasFolder(fold) then
Tree.Items.AddChild(itm,''); //...created here to show the expander glyph
end;
finally
lst.Free;
end;
end;
procedure TCEMiniExplorerWidget.treeCollapsing(Sender: TObject; Node: TTreeNode; var allow: boolean);
begin
end;
procedure TCEMiniExplorerWidget.treeExpanding(Sender: TObject; Node: TTreeNode; var allow: boolean);
begin
end;
procedure TCEMiniExplorerWidget.treeCollapsed(Sender: TObject; Node: TTreeNode);
begin
end;
procedure TCEMiniExplorerWidget.treeExpanded(Sender: TObject; Node: TTreeNode);
begin
end;
procedure TCEMiniExplorerWidget.treeChanged(Sender: TObject; Node: TTreeNode);
begin
if Node = nil then exit;
Node.DeleteChildren;
treeScanSubFolders(Node);
lstFilesFromTree;
end;
procedure TCEMiniExplorerWidget.treeSelectionChanged(sender: TObject);
begin
lstFilesFromTree;
end;
procedure TCEMiniExplorerWidget.treeClick(sender: TObject);
begin
if Tree.Selected = nil then exit;
if Tree.Selected.Expanded then exit;
treeScanSubFolders(Tree.Selected);
end;
{$ENDREGION}
end.

View File

@ -176,17 +176,9 @@ end;
procedure TCEProjectInspectWidget.btnAddFoldClick(Sender: TObject);
var
dir, fname: string;
sr: TSearchRec;
dir, fname, ext: string;
lst: TStringList;
procedure doFindFile;
var
ext: string;
begin
ext := ExtractFileExt(sr.Name);
if (ext = '.d') or (ext = '.di') then
lst.Add(dir + DirectorySeparator + sr.Name);
end;
i: NativeInt;
begin
if fProject = nil then exit;
//
@ -195,12 +187,16 @@ begin
else dir := '';
if selectDirectory('sources', dir, dir, true, 0) then
begin
if FindFirst(dir + DirectorySeparator + '*.*', faAnyFile, sr ) = 0 then
lst := TStringList.Create;
try
lst := TStringList.Create;
doFindFile;
while FindNext(sr) = 0 do doFindFile;
for fname in lst do fProject.addSource(fname);
listFiles(lst, dir);
for i := 0 to lst.Count-1 do
begin
fname := lst.Strings[i];
ext := extractFileExt(fname);
if (ext = '.d') or (ext = '.di') then
fProject.addSource(fname);
end;
finally
lst.Free;
end;

View File

@ -115,7 +115,12 @@ begin
end;
procedure TCESynMemo.loadFromFile(const aFilename: string);
var
ext: string;
begin
ext := extractFileExt(aFilename);
if (ext <> '.d') and (ext <> '.di') then
Highlighter := nil;
Lines.LoadFromFile(aFilename);
fFilename := aFilename;
FileAge(fFilename, fFileDate);