unit Options; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls, IdZLibCompressorBase, IdCompressorZLibEx, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, xmldom, XMLIntf, msxmldom, XMLDoc, oxmldom, Buttons, CheckLst, ASGSQLite3, DB, XPMan, HijriLib, TeCanvas; type ToptionsFrm = class(TForm) okBtn: TButton; cancelBtn: TButton; OpenMp3: TOpenDialog; PageControl1: TPageControl; TabSheet1: TTabSheet; TabSheet2: TTabSheet; Label3: TLabel; lngEdt: TEdit; Label2: TLabel; Label1: TLabel; latEdt: TEdit; tzEdt: TEdit; prNotifyMaghrib: TCheckBox; prNotifyIsha: TCheckBox; prNotifyDhohr: TCheckBox; prNotifySobh: TCheckBox; prNotifyAsr: TCheckBox; Label4: TLabel; notificationMsgEdt: TEdit; TabSheet3: TTabSheet; AzanSound: TEdit; Button3: TButton; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; plAzanSobh: TCheckBox; plAzanDhohr: TCheckBox; plAzanAsr: TCheckBox; plAzanMaghrib: TCheckBox; plAzanIsha: TCheckBox; Label10: TLabel; Label5: TLabel; Label11: TLabel; Label12: TLabel; TabSheet4: TTabSheet; Label13: TLabel; tryDispJ: TRadioButton; tryDispH: TRadioButton; tryDispG: TRadioButton; Label15: TLabel; praytimeMtd: TComboBox; GroupBox1: TGroupBox; Label19: TLabel; asrMtdShafeie: TRadioButton; asrMtdHanafi: TRadioButton; mtdParamPnl: TPanel; Label16: TLabel; Label17: TLabel; Label18: TLabel; sobhAngle: TEdit; maghribAngle: TEdit; ishaAngle: TEdit; autoStartUp: TCheckBox; BitBtn1: TBitBtn; TabSheet5: TTabSheet; Label14: TLabel; activeEvents: TCheckListBox; eventDBDetails: TButton; LiteDB: TASQLite3DB; LiteQuery: TASQLite3Query; Label20: TLabel; HijriOffsetEdt: TEdit; UpDown1: TUpDown; XPManifest1: TXPManifest; Image1: TImage; Image2: TImage; Image5: TImage; Image6: TImage; Image3: TImage; Image4: TImage; Image8: TImage; Image7: TImage; Label21: TLabel; SpeedButton1: TSpeedButton; dayLightSaving: TCheckBox; TabSheet6: TTabSheet; DoPaintOnDesktop: TCheckBox; DesktopFontSize: TEdit; UpDown2: TUpDown; Label22: TLabel; Label23: TLabel; Label24: TLabel; DesktopHorLineSpace: TEdit; UpDown3: TUpDown; Label25: TLabel; DesktopVerLineSpace: TEdit; UpDown4: TUpDown; Label26: TLabel; DesktopMargin: TEdit; UpDown5: TUpDown; Button1: TButton; BCmonthNameBkColor: TButtonColor; BCdayNamesColor: TButtonColor; BCdaysColor: TButtonColor; Label27: TLabel; Label28: TLabel; Label29: TLabel; Panel1: TPanel; BCmonthNameColor: TButtonColor; Label30: TLabel; procedure Button3Click(Sender: TObject); procedure FormShow(Sender: TObject); procedure okBtnClick(Sender: TObject); procedure praytimeMtdChange(Sender: TObject); procedure BitBtn1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure activeEventsClick(Sender: TObject); procedure eventDBDetailsClick(Sender: TObject); procedure SpeedButton1Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public detectedDBs : TStringList; { Public declarations } procedure loadSettings(); procedure loadEventDBNames(); procedure putInStartup(); procedure removeFromStartup(); function isInStartup() : Boolean; end; var optionsFrm: ToptionsFrm; implementation {$R *.dfm} uses IniFiles, main, PrayTimeLib, internetSearch, eventsDB, Registry; var ex : Boolean = true; procedure ToptionsFrm.okBtnClick(Sender: TObject); var cfgFile : TIniFile; i : Word; tmpStr : string; begin cfgFile := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini')); try cfgFile.WriteFloat('LOCATION', 'latitude', StrToFloat(latEdt.Text)); cfgFile.WriteFloat('LOCATION', 'longitude', StrToFloat(lngEdt.Text)); cfgFile.WriteFloat('LOCATION', 'time zone', StrToFloat(tzEdt.Text)); cfgFile.WriteInteger('CALC', 'method', praytimeMtd.ItemIndex); if asrMtdShafeie.Checked then cfgFile.WriteInteger('CALC', 'asr method', 0) else cfgFile.WriteInteger('CALC', 'asr method', 1); if praytimeMtd.ItemIndex = 6 then begin cfgFile.WriteFloat('CALC', 'sobh angle', StrToFloat(sobhAngle.Text)); cfgFile.WriteFloat('CALC', 'maghrib angle', StrToFloat(maghribAngle.Text)); cfgFile.WriteFloat('CALC', 'isha angle', StrToFloat(ishaAngle.Text)); end; cfgFile.WriteInteger('CALC', 'hijri offset', StrToInt(HijriOffsetEdt.Text)); cfgFile.WriteBool('PLAY AZAN', 'sobh', plAzanSobh.Checked); cfgFile.WriteBool('PLAY AZAN', 'dhohr', plAzanDhohr.Checked); cfgFile.WriteBool('PLAY AZAN', 'asr', plAzanAsr.Checked); cfgFile.WriteBool('PLAY AZAN', 'maghrib', plAzanMaghrib.Checked); cfgFile.WriteBool('PLAY AZAN', 'isha', plAzanIsha.Checked); cfgFile.WriteString('PLAY AZAN', 'file', AzanSound.Text); cfgFile.WriteBool('PRAYER NOTIFICATION', 'sobh', prNotifySobh.Checked); cfgFile.WriteBool('PRAYER NOTIFICATION', 'dhohr', prNotifyDhohr.Checked); cfgFile.WriteBool('PRAYER NOTIFICATION', 'asr', prNotifyAsr.Checked); cfgFile.WriteBool('PRAYER NOTIFICATION', 'maghrib', prNotifyMaghrib.Checked); cfgFile.WriteBool('PRAYER NOTIFICATION', 'isha', prNotifyIsha.Checked); cfgFile.WriteString('PRAYER NOTIFICATION', 'msg', notificationMsgEdt.Text); if tryDispJ.Checked then mainFrm.tryIconDisp := 'J' else if tryDispH.Checked then mainFrm.tryIconDisp := 'H' else if tryDispG.Checked then mainFrm.tryIconDisp := 'G'; cfgFile.WriteString('PROGRAM', 'try display', mainFrm.tryIconDisp); cfgFile.WriteBool('PROGRAM', 'day light saving change', dayLightSaving.Checked); cfgFile.WriteBool('DESKTOP', 'paint on desktop', DoPaintOnDesktop.Checked); cfgFile.WriteInteger('DESKTOP', 'font size', StrToInt(DesktopFontSize.Text)); cfgFile.WriteInteger('DESKTOP', 'horizontal space', StrToInt(DesktopHorLineSpace.Text)); cfgFile.WriteInteger('DESKTOP', 'vertical space', StrToInt(DesktopVerLineSpace.Text)); cfgFile.WriteInteger('DESKTOP', 'margin', StrToInt(DesktopMargin.Text)); cfgFile.WriteInteger('DESKTOP', 'month name back color', BCmonthNameBkColor.SymbolColor); cfgFile.WriteInteger('DESKTOP', 'month name color', BCmonthNameColor.SymbolColor); cfgFile.WriteInteger('DESKTOP', 'day names color', BCdayNamesColor.SymbolColor); cfgFile.WriteInteger('DESKTOP', 'days color', BCdaysColor.SymbolColor); tmpStr := ''; if activeEvents.Items.Count > 0 then for i := 0 to activeEvents.Items.Count - 1 do begin if activeEvents.Checked[i] then tmpStr := tmpStr + detectedDBs[i]+ '|'; end; cfgFile.WriteString('EVENTS', 'active events', tmpStr); finally cfgFile.Free; end; if autoStartUp.Checked then putInStartup else removeFromStartup; loadSettings; if ex then ModalResult := mrOk; end; procedure ToptionsFrm.praytimeMtdChange(Sender: TObject); begin if praytimeMtd.ItemIndex < 6 then mtdParamPnl.Visible := False else begin mtdParamPnl.Visible := True; sobhAngle.Text := FloatToStr(mainFrm.sobhAngl); maghribAngle.Text := FloatToStr(mainFrm.maghribAngl); ishaAngle.Text := FloatToStr(mainFrm.ishaAngl); end; end; procedure ToptionsFrm.putInStartup; var mReg : TRegistry; begin mReg := TRegistry.Create; try mReg.RootKey := HKEY_CURRENT_USER; if mReg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True) then mReg.WriteString('PMCalendar', Application.ExeName); mReg.CloseKey; finally mReg.Free; end; end; procedure ToptionsFrm.removeFromStartup; var mReg : TRegistry; begin mReg := TRegistry.Create; try mReg.RootKey := HKEY_CURRENT_USER; if mReg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', False) and mReg.ValueExists('PMCalendar') then mReg.DeleteValue('PMCalendar'); mReg.CloseKey; finally mReg.Free; end; end; procedure ToptionsFrm.SpeedButton1Click(Sender: TObject); begin ModalResult := mrCancel; end; procedure ToptionsFrm.eventDBDetailsClick(Sender: TObject); var i: Word; tmpStr : string; begin LiteDB.Database := ExtractFileDir(Application.ExeName) + '\DB\events\' + detectedDBs[activeEvents.ItemIndex]; LiteQuery.SQL.Text := 'SELECT * FROM db_definition'; LiteQuery.Open; if not LiteQuery.IsEmpty then with TeventsDBFrm.Create(nil) do try LiteQuery.First; for i := 0 to LiteQuery.RecordCount - 1 do begin tmpStr := LiteQuery.FieldByName('name').AsString; if tmpStr = 'AUTHOR' then authorLbl.Caption := LiteQuery.FieldByName('value').AsString else if tmpStr = 'DB_NAME' then dbNameLbl.Caption := LiteQuery.FieldByName('value').AsString else if tmpStr = 'LAST_UPDATE' then lastChangeLbl.Caption := LiteQuery.FieldByName('value').AsString else if tmpStr = 'PROVIDER' then providerLbl.Caption := LiteQuery.FieldByName('value').AsString else if tmpStr = 'CALENDAR' then if LowerCase(LiteQuery.FieldByName('value').AsString) = 'hij' then calTypeLbl.Caption := 'هجری قمری' else if LowerCase(LiteQuery.FieldByName('value').AsString) = 'gre' then calTypeLbl.Caption := 'میلادی (گرگورین)' else if LowerCase(LiteQuery.FieldByName('value').AsString) = 'jal' then calTypeLbl.Caption := 'جلالی (هجری شمسی)'; LiteQuery.Next; end; LiteQuery.SQL.Text := 'SELECT COUNT(`id`) FROM events'; LiteQuery.Open; if not LiteQuery.IsEmpty then recordCountLbl.Caption := LiteQuery.FieldByName('COUNT(`id`)').AsString; LiteDB.Close; ShowModal; finally Free; end; end; procedure ToptionsFrm.activeEventsClick(Sender: TObject); begin if activeEvents.ItemIndex > -1 then eventDBDetails.Enabled := True else eventDBDetails.Enabled := False; end; procedure ToptionsFrm.BitBtn1Click(Sender: TObject); begin with TinternetSearchFrm.Create(Self) do try ShowModal; finally Free; end; end; procedure ToptionsFrm.Button1Click(Sender: TObject); begin ex := False; okBtn.Click; mainFrm.PaintOnDesktop; ex := true; end; procedure ToptionsFrm.Button3Click(Sender: TObject); begin if OpenMp3.Execute then AzanSound.Text := OpenMp3.FileName; end; procedure ToptionsFrm.FormCreate(Sender: TObject); begin detectedDBs := TStringList.Create; detectedDBs.Clear; end; procedure ToptionsFrm.FormShow(Sender: TObject); begin latEdt.Text := FloatToStr(mainFrm.lat); lngEdt.Text := FloatToStr(mainFrm.lng); tzEdt.Text := FloatToStr(mainFrm.tZone); praytimeMtd.ItemIndex := mainFrm.calcMtd; if mainFrm.asrMtd = 0 then asrMtdShafeie.Checked := True else asrMtdHanafi.Checked := True; if praytimeMtd.ItemIndex < 6 then mtdParamPnl.Visible := False else begin mtdParamPnl.Visible := True; sobhAngle.Text := FloatToStr(mainFrm.sobhAngl); maghribAngle.Text := FloatToStr(mainFrm.maghribAngl); ishaAngle.Text := FloatToStr(mainFrm.ishaAngl); end; plAzanSobh.Checked := mainFrm.playAzan[0]; plAzanDhohr.Checked := mainFrm.playAzan[1]; plAzanAsr.Checked := mainFrm.playAzan[2]; plAzanMaghrib.Checked := mainFrm.playAzan[3]; plAzanIsha.Checked := mainFrm.playAzan[4]; AzanSound.Text := mainFrm.MediaPlayer1.FileName; prNotifySobh.Checked := mainFrm.prayerNotify[0]; prNotifyDhohr.Checked := mainFrm.prayerNotify[1]; prNotifyAsr.Checked := mainFrm.prayerNotify[2]; prNotifyMaghrib.Checked := mainFrm.prayerNotify[3]; prNotifyIsha.Checked := mainFrm.prayerNotify[4]; notificationMsgEdt.Text := mainFrm.notificationMsg; HijriOffsetEdt.Text := IntToStr(getHijriOffset); if mainFrm.tryIconDisp = 'J' then tryDispJ.Checked := True else if mainFrm.tryIconDisp = 'H' then tryDispH.Checked := True else if mainFrm.tryIconDisp = 'G' then tryDispG.Checked := True; dayLightSaving.Checked := getDayLightSaving; DoPaintOnDesktop.Checked := mainFrm.DoPaintOnDesktop; DesktopFontSize.Text := IntToStr(mainFrm.DskFontSize); DesktopHorLineSpace.Text := IntToStr(mainFrm.DskHorzLineSpace); DesktopVerLineSpace.Text := IntToStr(mainFrm.DskVertLineSpace); DesktopMargin.Text := IntToStr(mainFrm.DskMargin); BCmonthNameBkColor.SymbolColor := mainFrm.monthNameBkColor; BCmonthNameColor.SymbolColor := mainFrm.monthNameColor; BCdayNamesColor.SymbolColor := mainFrm.dayNamesColor; BCdaysColor.SymbolColor := mainFrm.daysColor; autoStartUp.Checked := isInStartup; loadEventDBNames; end; function ToptionsFrm.isInStartup: Boolean; var mReg : TRegistry; begin mReg := TRegistry.Create; Result := False; try mReg.RootKey := HKEY_CURRENT_USER; if mReg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', False) and mReg.ValueExists('PMCalendar') then Result := True; mReg.CloseKey; finally mReg.Free; end; end; procedure ToptionsFrm.loadEventDBNames; var FindResult: integer; SearchRec : TSearchRec; Path : string; begin Path := ExtractFileDir(Application.ExeName) + '\DB\events\'; detectedDBs.Clear; activeEvents.Items.Clear; FindResult := FindFirst(Path + '*.s3db', faAnyFile - faDirectory, SearchRec); while FindResult = 0 do begin LiteDB.Database := Path + SearchRec.Name; try LiteDB.Open; LiteQuery.SQL.Text := 'SELECT `value` FROM db_definition WHERE `name`="DB_NAME"'; LiteQuery.Open; if LiteQuery.RecordCount > 0 then begin detectedDBs.Add(SearchRec.Name); activeEvents.Items.Add(LiteQuery.FieldByName('value').AsString); if pos(SearchRec.Name, mainFrm.activeEventDBs) > 0 then activeEvents.Checked[activeEvents.Items.Count - 1] := True; end; LiteQuery.Close; finally LiteDB.Close; end; FindResult := FindNext(SearchRec); end; FindClose(SearchRec); end; procedure ToptionsFrm.loadSettings; var cfgFile : TIniFile; begin cfgFile := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini')); try mainFrm.lat := cfgFile.ReadFloat('LOCATION', 'latitude', 35.7); mainFrm.lng := cfgFile.ReadFloat('LOCATION', 'longitude', 51.4); mainFrm.tZone := cfgFile.ReadFloat('LOCATION', 'time zone', 0); mainFrm.calcMtd := cfgFile.ReadInteger('CALC', 'method', 0); setCalcMethod(mainFrm.calcMtd); mainFrm.asrMtd := cfgFile.ReadInteger('CALC', 'asr method', 0); setAsrMethod(mainFrm.asrMtd); mainFrm.sobhAngl := cfgFile.ReadFloat('CALC', 'sobh angle', 18); setFajrAngle(mainFrm.sobhAngl); mainFrm.maghribAngl := cfgFile.ReadFloat('CALC', 'maghrib angle', 0); setMaghribAngle(mainFrm.maghribAngl); mainFrm.ishaAngl := cfgFile.ReadFloat('CALC', 'isha angle', 17); setIshaAngle(mainFrm.ishaAngl); setHijriOffset(cfgFile.ReadInteger('CALC', 'hijri offset', 0)); mainFrm.playAzan[0] := cfgFile.ReadBool('PLAY AZAN', 'sobh', True); mainFrm.playAzan[1] := cfgFile.ReadBool('PLAY AZAN', 'dhohr', True); mainFrm.playAzan[2] := cfgFile.ReadBool('PLAY AZAN', 'asr', True); mainFrm.playAzan[3] := cfgFile.ReadBool('PLAY AZAN', 'maghrib', True); mainFrm.playAzan[4] := cfgFile.ReadBool('PLAY AZAN', 'isha', True); mainFrm.MediaPlayer1.FileName := cfgFile.ReadString('PLAY AZAN', 'file', ExtractFileDir(ParamStr(0))+'\Sound\azan.mp3'); mainFrm.prayerNotify[0] := cfgFile.ReadBool('PRAYER NOTIFICATION', 'sobh', False); mainFrm.prayerNotify[1] := cfgFile.ReadBool('PRAYER NOTIFICATION', 'dhohr', False); mainFrm.prayerNotify[2] := cfgFile.ReadBool('PRAYER NOTIFICATION', 'asr', False); mainFrm.prayerNotify[3] := cfgFile.ReadBool('PRAYER NOTIFICATION', 'maghrib', False); mainFrm.prayerNotify[4] := cfgFile.ReadBool('PRAYER NOTIFICATION', 'isha', False); mainFrm.notificationMsg := cfgFile.ReadString('PRAYER NOTIFICATION', 'msg', 'وقت