1 /*
2     SPDX-FileCopyrightText: 2002 Pablo de Vicente <vicente@oan.es>
3 
4     SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #include "modcalcjd.h"
8 
9 #include "kstarsdatetime.h"
10 #include "ksnotification.h"
11 
12 #include <KLocalizedString>
13 #include <KMessageBox>
14 #include <KLineEdit>
15 
16 #include <QDebug>
17 #include <QLineEdit>
18 #include <QTextStream>
19 
20 #define MJD0 2400000.5
21 
modCalcJD(QWidget * parentSplit)22 modCalcJD::modCalcJD(QWidget *parentSplit) : QFrame(parentSplit)
23 {
24     setupUi(this);
25 
26     // signals and slots connections
27     connect(NowButton, SIGNAL(clicked()), this, SLOT(showCurrentTime()));
28     connect(DateTimeBox, SIGNAL(dateTimeChanged(QDateTime)), this, SLOT(slotUpdateCalendar()));
29     connect(JDBox, SIGNAL(editingFinished()), this, SLOT(slotUpdateJD()));
30     connect(ModJDBox, SIGNAL(editingFinished()), this, SLOT(slotUpdateModJD()));
31     connect(InputFileBatch, SIGNAL(urlSelected(QUrl)), this, SLOT(slotCheckFiles()));
32     connect(OutputFileBatch, SIGNAL(urlSelected(QUrl)), this, SLOT(slotCheckFiles()));
33     connect(RunButtonBatch, SIGNAL(clicked()), this, SLOT(slotRunBatch()));
34     connect(ViewButtonBatch, SIGNAL(clicked()), this, SLOT(slotViewBatch()));
35 
36     RunButtonBatch->setEnabled(false);
37     ViewButtonBatch->setEnabled(false);
38 
39     showCurrentTime();
40     slotUpdateCalendar();
41     show();
42 }
43 
slotUpdateCalendar()44 void modCalcJD::slotUpdateCalendar()
45 {
46     long double julianDay, modjulianDay;
47 
48     julianDay = KStarsDateTime(DateTimeBox->dateTime()).djd();
49     showJd(julianDay);
50 
51     modjulianDay = julianDay - MJD0;
52     showMjd(modjulianDay);
53 }
54 
slotUpdateModJD()55 void modCalcJD::slotUpdateModJD()
56 {
57     long double julianDay, modjulianDay;
58 
59     modjulianDay = ModJDBox->text().toDouble();
60     julianDay    = MJD0 + modjulianDay;
61     showJd(julianDay);
62     DateTimeBox->setDateTime(KStarsDateTime(julianDay));
63 }
64 
slotUpdateJD()65 void modCalcJD::slotUpdateJD()
66 {
67     long double julianDay, modjulianDay;
68     julianDay = JDBox->text().toDouble();
69     KStarsDateTime dt(julianDay);
70 
71     DateTimeBox->setDateTime(dt);
72 
73     modjulianDay = julianDay - MJD0;
74     showMjd(modjulianDay);
75 }
76 
showCurrentTime(void)77 void modCalcJD::showCurrentTime(void)
78 {
79     DateTimeBox->setDateTime(KStarsDateTime::currentDateTime());
80 }
81 
showJd(long double julianDay)82 void modCalcJD::showJd(long double julianDay)
83 {
84     JDBox->setText(QLocale().toString((double)julianDay, 5));
85 }
86 
showMjd(long double modjulianDay)87 void modCalcJD::showMjd(long double modjulianDay)
88 {
89     ModJDBox->setText(QLocale().toString((double)modjulianDay, 5));
90 }
91 
slotCheckFiles()92 void modCalcJD::slotCheckFiles()
93 {
94     if (!InputFileBatch->lineEdit()->text().isEmpty() && !OutputFileBatch->lineEdit()->text().isEmpty())
95     {
96         RunButtonBatch->setEnabled(true);
97     }
98     else
99     {
100         RunButtonBatch->setEnabled(false);
101     }
102 }
103 
slotRunBatch()104 void modCalcJD::slotRunBatch()
105 {
106     QString inputFileName = InputFileBatch->url().toLocalFile();
107 
108     if (QFile::exists(inputFileName))
109     {
110         QFile f(inputFileName);
111         if (!f.open(QIODevice::ReadOnly))
112         {
113             QString message = i18n("Could not open file %1.", f.fileName());
114             KSNotification::sorry(message, i18n("Could Not Open File"));
115             return;
116         }
117 
118         QTextStream istream(&f);
119         processLines(istream, InputComboBatch->currentIndex());
120         ViewButtonBatch->setEnabled(true);
121 
122         f.close();
123     }
124     else
125     {
126         QString message = i18n("Invalid file: %1", inputFileName);
127         KSNotification::sorry(message, i18n("Invalid file"));
128         return;
129     }
130 }
131 
processLines(QTextStream & istream,int inputData)132 void modCalcJD::processLines(QTextStream &istream, int inputData)
133 {
134     QFile fOut(OutputFileBatch->url().toLocalFile());
135     fOut.open(QIODevice::WriteOnly);
136     QTextStream ostream(&fOut);
137 
138     QString line;
139     long double jd(0);
140     double mjd(0);
141     KStarsDateTime dt;
142 
143     while (!istream.atEnd())
144     {
145         line             = istream.readLine();
146         line             = line.trimmed();
147         QStringList data = line.split(' ', QString::SkipEmptyParts);
148 
149         if (inputData == 0) //Parse date & time
150         {
151             //Is the first field parseable as a date or date&time?
152             if (data[0].length() > 10)
153                 dt = KStarsDateTime::fromString(data[0]);
154             else
155                 dt = KStarsDateTime(QDate::fromString(data[0]), QTime(0, 0, 0));
156 
157             //DEBUG
158             qDebug() << data[0];
159             if (dt.isValid())
160                 qDebug() << dt.toString();
161 
162             if (dt.isValid())
163             {
164                 //Try to parse the second field as a time
165                 if (data.size() > 1)
166                 {
167                     QString s = data[1];
168                     if (s.length() == 4)
169                         s = '0' + s;
170                     QTime t = QTime::fromString(s);
171                     if (t.isValid())
172                         dt.setTime(t);
173                 }
174             }
175             else //Did not parse the first field as a date; try it as a time
176             {
177                 QTime t = QTime::fromString(data[0]);
178                 if (t.isValid())
179                 {
180                     dt.setTime(t);
181                     //Now try the second field as a date
182                     if (data.size() > 1)
183                     {
184                         QDate d = QDate::fromString(data[1]);
185                         if (d.isValid())
186                             dt.setDate(d);
187                         else
188                             dt.setDate(QDate::currentDate());
189                     }
190                 }
191             }
192 
193             if (dt.isValid())
194             {
195                 //Compute JD and MJD
196                 jd  = dt.djd();
197                 mjd = jd - MJD0;
198             }
199         }
200         else if (inputData == 1) //Parse Julian day
201         {
202             bool ok(false);
203             jd = data[0].toDouble(&ok);
204             if (ok)
205             {
206                 dt.setDJD(jd);
207                 mjd = jd - MJD0;
208             }
209         }
210         else if (inputData == 2) //Parse Modified Julian day
211         {
212             bool ok(false);
213             mjd = data[0].toDouble(&ok);
214             if (ok)
215             {
216                 jd = mjd + MJD0;
217                 dt.setDJD(jd);
218             }
219         }
220 
221         //Write to output file
222         ostream << QLocale().toString(dt, QLocale::LongFormat) << "  " << QString::number(jd, 'f', 2) << "  "
223                 << QString::number(mjd, 'f', 2) << '\n';
224     }
225 
226     fOut.close();
227 }
228 
slotViewBatch()229 void modCalcJD::slotViewBatch()
230 {
231     QFile fOut(OutputFileBatch->url().toLocalFile());
232     fOut.open(QIODevice::ReadOnly);
233     QTextStream istream(&fOut);
234     QStringList text;
235 
236     while (!istream.atEnd())
237         text.append(istream.readLine());
238 
239     fOut.close();
240 
241     KMessageBox::informationList(nullptr, i18n("Results of Julian day calculation"), text,
242                                  OutputFileBatch->url().toLocalFile());
243 }
244