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