diff --git a/lazproj/coedit.lpi b/lazproj/coedit.lpi
index ee5ed635..13b07423 100644
--- a/lazproj/coedit.lpi
+++ b/lazproj/coedit.lpi
@@ -134,7 +134,7 @@
-
+
@@ -244,6 +244,14 @@
+
+
+
+
+
+
+
+
diff --git a/lazproj/coedit.lpr b/lazproj/coedit.lpr
index f56281e4..3ed573ef 100644
--- a/lazproj/coedit.lpr
+++ b/lazproj/coedit.lpr
@@ -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}
diff --git a/src/ce_common.pas b/src/ce_common.pas
index 6a492744..49d28b15 100644
--- a/src/ce_common.pas
+++ b/src/ce_common.pas
@@ -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.
diff --git a/src/ce_editor.pas b/src/ce_editor.pas
index 305e7a0f..7bc7150c 100644
--- a/src/ce_editor.pas
+++ b/src/ce_editor.pas
@@ -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
diff --git a/src/ce_main.pas b/src/ce_main.pas
index 84554dd4..95b13ea9 100644
--- a/src/ce_main.pas
+++ b/src/ce_main.pas
@@ -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}
diff --git a/src/ce_miniexplorer.lfm b/src/ce_miniexplorer.lfm
new file mode 100644
index 00000000..b64da99f
--- /dev/null
+++ b/src/ce_miniexplorer.lfm
@@ -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
diff --git a/src/ce_miniexplorer.pas b/src/ce_miniexplorer.pas
new file mode 100644
index 00000000..19de668c
--- /dev/null
+++ b/src/ce_miniexplorer.pas
@@ -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.
+
diff --git a/src/ce_projinspect.pas b/src/ce_projinspect.pas
index e2a52f28..19a42269 100644
--- a/src/ce_projinspect.pas
+++ b/src/ce_projinspect.pas
@@ -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;
diff --git a/src/ce_synmemo.pas b/src/ce_synmemo.pas
index e1eb0ca1..f5d5049f 100644
--- a/src/ce_synmemo.pas
+++ b/src/ce_synmemo.pas
@@ -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);