unit cde_SettingsForm; {$mode delphi} {$codepage UTF8} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ComCtrls, StdCtrls, ExtCtrls, Buttons, EditBtn, Spin, cde_dir, cde_lang, VersionControl, cde_types, LazFileUtils, cde_kernel, ANBFormatString, windows, SimplyJSON, LazUTF8, DividerBevel, GraphicsEx, ANBInputBox; type { Tcde_Settings } Tcde_Settings = class(TForm) Add2WhiteListBtn: TBitBtn; Add2BlackListBtn: TBitBtn; Add2DWDriveListBtn: TBitBtn; Delete4WhiteListBtn: TBitBtn; BrowseProgramEdt: TFileNameEdit; BrowseParamHlp: TSpeedButton; ColorDlg: TColorDialog; Delete4BlackListBtn: TBitBtn; Delete4DWDriveListBtn: TBitBtn; DFC_B: TSpinEdit; DFC_BLbl: TLabel; DFC_G: TSpinEdit; DFC_GLbl: TLabel; DBC_R: TSpinEdit; DBC_G: TSpinEdit; DBC_B: TSpinEdit; DFC_R: TSpinEdit; DBC_RLbl: TLabel; DBC_GLbl: TLabel; DBC_BLbl: TLabel; DFC_RLbl: TLabel; DBC_SelectBtn: TBitBtn; DFC_SelectBtn: TBitBtn; DiscPercentColorsBusyLbl: TLabel; DiscPercentColorsFreeLbl: TLabel; DiscPercentColorsSep: TDividerBevel; dwIntervalEdt: TFloatSpinEdit; dwIntervalLbl: TLabel; FilterTypeBox: TComboBox; DWTypeBox: TComboBox; FlagsList: TImageList; BrowseProgramLbl: TLabel; BrowseParamEdt: TLabeledEdit; LanguageBox: TListView; OkBtn: TBitBtn; CancelBtn: TBitBtn; ButtonsSep: TBevel; ButtonsPanel: TPanel; SettingsPages: TPageControl; LanguageSht: TTabSheet; BrowseSht: TTabSheet; BrowseProgramHlp: TSpeedButton; InterfaceSht: TTabSheet; ShowDiscM: TCheckBox; FilterSht: TTabSheet; DriveWatcherSht: TTabSheet; TabsImages: TImageList; SettingsTree: TTreeView; WhitelistBox: TListBox; BlacklistBox: TListBox; DWDriveListBox: TListBox; WhiteListSep: TDividerBevel; BlackListSep: TDividerBevel; DWDriveListSep: TDividerBevel; procedure Add2BlackListBtnClick (Sender: TObject ); procedure Add2DWDriveListBtnClick (Sender: TObject ); procedure Add2WhiteListBtnClick (Sender: TObject ); procedure BrowseParamHlpClick(Sender: TObject); procedure BrowseProgramHlpClick(Sender: TObject); procedure Delete4BlackListBtnClick (Sender: TObject ); procedure Delete4DWDriveListBtnClick (Sender: TObject ); procedure Delete4WhiteListBtnClick (Sender: TObject ); procedure DFC_SelectBtnClick (Sender: TObject ); procedure DBC_SelectBtnClick (Sender: TObject ); procedure FormCreate(Sender: TObject); procedure OkBtnClick(Sender: TObject); procedure SettingsTreeChange(Sender: TObject; Node: TTreeNode); private procedure FillLanguageList; procedure LoadSettings; procedure SaveSettings; procedure LocalizeIt; public end; var cde_Settings: Tcde_Settings; implementation uses cde_MainForm; {$R *.lfm} { Tcde_Settings } procedure Tcde_Settings.FillLanguageList; var SR: TSearchRec; LI: TListItem; Indx: Integer; FLanguage: String; LangInfo: TCDELanguageInfo; Image: TIcon; begin Indx:= -1; LanguageBox.Items.Clear; FlagsList.Clear; if FindFirstUTF8(IncludeTrailingBackslash(GetCDEPath) + 'languages\*.json', faAnyFile, SR) = 0 then repeat if (not ((SR.Name = '.') or (SR.Name = '..'))) and FileExistsUTF8(IncludeTrailingBackslash(GetCDEPath) + 'languages\' + SR.Name) then begin LI:= LanguageBox.Items.Add; FLanguage:= ExtractFileNameWithoutExt(SR.Name); LangInfo:= GetLanguageInfo(FLanguage); LI.Caption:= LangInfo.liName; LI.SubItems.Add(FLanguage); Li.SubItems.Add(LangInfo.liAuthor); LI.SubItems.Add(VersionInfoToStr(LangInfo.liVersion)); LI.SubItems.Add(VersionInfoToStr(LangInfo.liCDEVersion)); if (UTF8CompareStr(UTF8LowerCase(FLanguage), UTF8LowerCase(GetLanguage)) = 0) then Indx:= LI.Index; Image:= TIcon.Create; Image.LoadFromFile(IncludeTrailingBackslash(GetCDEPath) + 'languages\flags\' + FLanguage + '.ico'); LI.ImageIndex:= FlagsList.AddIcon(Image); Image.Free; end; until FindNextUTF8(SR) <> 0; FindCloseUTF8(SR); LanguageBox.Items.Item[Indx].Selected:= True; end; procedure Tcde_Settings.LoadSettings; var ConfigFile: String; RGBColor: TRGBColor; begin ConfigFile:= GetCDEPath + 'configs\configs.json'; FillLanguageList; //Load interface ShowDiscM.Checked:= JSReadBoolean('/interface/discmshow', True, ConfigFile); //- Load busy color with RGBColor do begin R:= 0; G:= 120; B:= 215; end; RGBColor:= JSReadRGBColor('/interface/ds_busycolor', RGBColor, ConfigFile); with RGBColor do begin DBC_R.Value:= R; DBC_G.Value:= G; DBC_B.Value:= B; end; //- Load Free color with RGBColor do begin R:= 240; G:= 240; B:= 240; end; RGBColor:= JSReadRGBColor('/interface/ds_freecolor', RGBColor, ConfigFile); with RGBColor do begin DFC_R.Value:= R; DFC_G.Value:= G; DFC_B.Value:= B; end; //Load filtration FilterTypeBox.ItemIndex:= JSReadInteger('/filter/type', 0, ConfigFile); WhitelistBox.Items.Delimiter:= ';'; WhitelistBox.Items.DelimitedText:= JSReadString('/filter/whitelist', '', ConfigFile); BlacklistBox.Items.Delimiter:= ';'; BlacklistBox.Items.DelimitedText:= JSReadString('/filter/blacklist', '', ConfigFile); //Load browse BrowseProgramEdt.Text:= JSReadString('/browse/program', '$windir$explorer.exe', ConfigFile); BrowseParamEdt.Text:= JSReadString('/browse/param', '$letter$:\', ConfigFile); //Load Drive Watcher DWTypeBox.ItemIndex:= JSReadInteger('/drivewatcher/type', 1, ConfigFile); dwIntervalEdt.Value:= JSReadInteger('/drivewatcher/interval', 2000, ConfigFile) / 1000; DWDriveListBox.Items.Delimiter:= ';'; DWDriveListBox.Items.DelimitedText:= JSReadString('/drivewatcher/driveslist', '', ConfigFile); end; procedure Tcde_Settings.SaveSettings; var ConfigFile: String; RGBColor: TRGBColor; begin ConfigFile:= GetCDEPath + 'configs\configs.json'; //Save language JSWriteString('/interface/language', LanguageBox.Selected.SubItems[0], ConfigFile); //Save interface JSWriteBoolean('/interface/discmshow', ShowDiscM.Checked, ConfigFile); //- save busy color with RGBColor do begin R:= DBC_R.Value; G:= DBC_G.Value; B:= DBC_B.Value; end; JSWriteRGBColor('/interface/ds_busycolor', RGBColor, ConfigFile); //- save free color with RGBColor do begin R:= DFC_R.Value; G:= DFC_G.Value; B:= DFC_B.Value; end; JSWriteRGBColor('/interface/ds_freecolor', RGBColor, ConfigFile); //Save filtration JSWriteInteger('/filter/type', FilterTypeBox.ItemIndex, ConfigFile); WhitelistBox.Items.Delimiter:= ';'; JSWriteString('/filter/whitelist', WhitelistBox.Items.DelimitedText, ConfigFile); BlacklistBox.Items.Delimiter:= ';'; JSWriteString('/filter/blacklist', BlacklistBox.Items.DelimitedText, ConfigFile); //Save browse JSWriteString('/browse/program', BrowseProgramEdt.Text, ConfigFile); JSWriteString('/browse/param', BrowseParamEdt.Text, ConfigFile); //Save Drive Watcher JSWriteInteger('/drivewatcher/type', DWTypeBox.ItemIndex, ConfigFile); JSWriteInteger('/drivewatcher/interval', round(dwIntervalEdt.Value * 1000), ConfigFile); JSWriteString('/drivewatcher/driveslist', DWDriveListBox.Items.DelimitedText, ConfigFile); end; procedure Tcde_Settings.LocalizeIt; begin Caption:= GetLocalizedString(cdeg_settings_caption); with SettingsTree do begin Items.Item[0].Text:= GetLocalizedString(cdeg_settings_tabs_language); Items.Item[1].Text:= GetLocalizedString(cdeg_settings_tabs_interface); Items.Item[2].Text:= GetLocalizedString(cdeg_settings_tabs_filtration); Items.Item[3].Text:= GetLocalizedString(cdeg_settings_tabs_browse); Items.Item[4].Text:= GetLocalizedString(cdeg_settings_tabs_drivewatcher); end; with LanguageBox do begin Column[0].Caption:= GetLocalizedString(cdeg_settings_languageboxcolumns_name); Column[2].Caption:= GetLocalizedString(cdeg_settings_languageboxcolumns_author); Column[3].Caption:= GetLocalizedString(cdeg_settings_languageboxcolumns_version); Column[4].Caption:= GetLocalizedString(cdeg_settings_languageboxcolumns_cdeversion); end; ShowDiscM.Caption:= GetLocalizedString(cdeg_settings_showdiscm); DiscPercentColorsSep.Caption:= GetLocalizedString(cdeg_settings_discpercentcolor); DiscPercentColorsBusyLbl.Caption:= GetLocalizedString(cdeg_settings_discbusycolor); DiscPercentColorsFreeLbl.Caption:= GetLocalizedString(cdeg_settings_discfreecolor); DBC_SelectBtn.Caption:= GetLocalizedString(cdeg_settings_buttons_select); DFC_SelectBtn.Caption:= GetLocalizedString(cdeg_settings_buttons_select); with FilterTypeBox.Items do begin Strings[0]:= GetLocalizedString(cdeg_settings_filtertypes_disable); Strings[1]:= GetLocalizedString(cdeg_settings_filtertypes_onlywhitelist); Strings[2]:= GetLocalizedString(cdeg_settings_filtertypes_exceptblacklist); end; WhiteListSep.Caption:= GetLocalizedString(cdeg_settings_whitelist); Add2WhiteListBtn.Caption:= GetLocalizedString(cdeg_settings_buttons_add); Delete4WhiteListBtn.Caption:= GetLocalizedString(cdeg_settings_buttons_remove); BlackListSep.Caption:= GetLocalizedString(cdeg_settings_blacklist); Add2BlackListBtn.Caption:= GetLocalizedString(cdeg_settings_buttons_add); Delete4BlackListBtn.Caption:= GetLocalizedString(cdeg_settings_buttons_remove); BrowseProgramLbl.Caption:= GetLocalizedString(cdeg_settings_browseprogram); BrowseProgramEdt.Filter:= GetLocalizedString(cdeg_settings_browseprogramfilter) + ' (*.exe)|*.exe'; BrowseParamEdt.EditLabel.Caption:= GetLocalizedString(cdeg_settings_browseparam); with DWTypeBox.Items do begin Strings[0]:= GetLocalizedString(cdeg_settings_dwtypes_disable); Strings[1]:= GetLocalizedString(cdeg_settings_dwtypes_watchall); Strings[2]:= GetLocalizedString(cdeg_settings_dwtypes_watchonlyinlist); Strings[3]:= GetLocalizedString(cdeg_settings_dwtypes_watchexceptlist); end; DWDriveListSep.Caption:= GetLocalizedString(cdeg_settings_dwdrivelist); Add2DWDriveListBtn.Caption:= GetLocalizedString(cdeg_settings_buttons_add); Delete4DWDriveListBtn.Caption:= GetLocalizedString(cdeg_settings_buttons_remove); dwIntervalLbl.Caption:= GetLocalizedString(cdeg_settings_dwinterval); OkBtn.Caption:= GetLocalizedString(cdeg_settings_buttons_apply); CancelBtn.Caption:= GetLocalizedString(cdeg_settings_buttons_cancel); end; procedure Tcde_Settings.SettingsTreeChange(Sender: TObject; Node: TTreeNode); begin SettingsPages.ActivePageIndex:= Node.StateIndex; end; procedure Tcde_Settings.FormCreate(Sender: TObject); begin LocalizeIt; LoadSettings; end; procedure Tcde_Settings.OkBtnClick(Sender: TObject); var NeedRestartMSG: String; begin NeedRestartMSG:= GetLocalizedString(cdeg_messages_needrestart); SaveSettings; ShowMessageBox(NeedRestartMSG, MB_ICONWARNING); ModalResult:= mrOK; end; procedure Tcde_Settings.BrowseProgramHlpClick(Sender: TObject); var HlpText: String; begin HlpText:= FormatStr(GetLocalizedString(cdeg_messages_settingsbrowseprogramhelp), ['$newline$'], [#13#10]); ShowMessageBox(HlpText, MB_ICONASTERISK); end; procedure Tcde_Settings.Delete4BlackListBtnClick (Sender: TObject ); begin if BlacklistBox.ItemIndex > - 1 then BlacklistBox.Items.Delete(BlacklistBox.ItemIndex); end; procedure Tcde_Settings.Delete4DWDriveListBtnClick (Sender: TObject ); begin if DWDriveListBox.ItemIndex > - 1 then DWDriveListBox.Items.Delete(DWDriveListBox.ItemIndex); end; procedure Tcde_Settings.Delete4WhiteListBtnClick (Sender: TObject ); begin if WhitelistBox.ItemIndex > - 1 then WhitelistBox.Items.Delete(WhitelistBox.ItemIndex); end; procedure Tcde_Settings.DFC_SelectBtnClick (Sender: TObject ); var RGBColor: TRGBColor; begin with RGBColor do begin R:= DFC_R.Value; G:= DFC_G.Value; B:= DFC_B.Value; end; with ColorDlg do begin Color:= RGB2Color(RGBColor); Execute; RGBColor:= Color2RGB(Color); end; with RGBColor do begin DFC_R.Value:= R; DFC_G.Value:= G; DFC_B.Value:= B; end; end; procedure Tcde_Settings.DBC_SelectBtnClick (Sender: TObject ); var RGBColor: TRGBColor; begin with RGBColor do begin R:= DBC_R.Value; G:= DBC_G.Value; B:= DBC_B.Value; end; with ColorDlg do begin Color:= RGB2Color(RGBColor); Execute; RGBColor:= Color2RGB(Color); end; with RGBColor do begin DBC_R.Value:= R; DBC_G.Value:= G; DBC_B.Value:= B; end; end; procedure Tcde_Settings.BrowseParamHlpClick(Sender: TObject); var HlpText: String; begin HlpText:= FormatStr(GetLocalizedString(cdeg_messages_settingsbrowseparamhelp), ['$newline$'], [#13#10]); ShowMessageBox(HlpText, MB_ICONASTERISK); end; procedure Tcde_Settings.Add2WhiteListBtnClick (Sender: TObject); var isAccept: Boolean; DriveName: String; begin DriveName:= ''; isAccept:= False; DriveName:= ShowInputBox(GetLocalizedString(cdeg_whitelistadd_caption), GetLocalizedString(cdeg_whitelistadd_prompt), 'a', [GetLocalizedString(cdeg_whitelistadd_okbtn), GetLocalizedString(cdeg_whitelistadd_cancelbtn)], isAccept); if isAccept then if (WhitelistBox.Items.IndexOf((Trim(DriveName))[1]) = -1) then WhitelistBox.Items.Add((Trim(DriveName))[1]); end; procedure Tcde_Settings.Add2BlackListBtnClick (Sender: TObject ); var isAccept: Boolean; DriveName: String; begin DriveName:= ''; isAccept:= False; DriveName:= ShowInputBox(GetLocalizedString(cdeg_blacklistadd_caption), GetLocalizedString(cdeg_blacklistadd_prompt), 'a', [GetLocalizedString(cdeg_blacklistadd_okbtn), GetLocalizedString(cdeg_blacklistadd_cancelbtn)], isAccept); if isAccept then if (BlacklistBox.Items.IndexOf((Trim(DriveName))[1]) = -1) then BlacklistBox.Items.Add((Trim(DriveName))[1]); end; procedure Tcde_Settings.Add2DWDriveListBtnClick (Sender: TObject ); var isAccept: Boolean; DriveName: String; begin DriveName:= ''; isAccept:= False; DriveName:= ShowInputBox(GetLocalizedString(cdeg_dwlistadd_caption), GetLocalizedString(cdeg_dwlistadd_prompt), 'a', [GetLocalizedString(cdeg_dwlistadd_okbtn), GetLocalizedString(cdeg_blacklistadd_cancelbtn)], isAccept); if isAccept then if (DWDriveListBox.Items.IndexOf((Trim(DriveName))[1]) = -1) then DWDriveListBox.Items.Add((Trim(DriveName))[1]); end; end.