From 99325b3db4b476bd274b5eb8e51aa10ddeec9e6e Mon Sep 17 00:00:00 2001 From: Basile Burg Date: Sat, 19 Jul 2014 04:55:30 +0200 Subject: [PATCH] added mini-explorer widget --- lazproj/coedit.lpi | 10 +- lazproj/coedit.lpr | 2 +- src/ce_common.pas | 126 +++++++++++ src/ce_editor.pas | 11 +- src/ce_main.pas | 63 +++--- src/ce_miniexplorer.lfm | 469 ++++++++++++++++++++++++++++++++++++++++ src/ce_miniexplorer.pas | 369 +++++++++++++++++++++++++++++++ src/ce_projinspect.pas | 26 +-- src/ce_synmemo.pas | 5 + 9 files changed, 1025 insertions(+), 56 deletions(-) create mode 100644 src/ce_miniexplorer.lfm create mode 100644 src/ce_miniexplorer.pas 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);