1 
2 /****************************************************************************
3 **
4 ** Copyright (C) 2011 Christian B. Huebschle & George M. Sheldrick
5 ** All rights reserved.
6 ** Contact: chuebsch@moliso.de
7 **
8 ** This file is part of the ShelXle
9 **
10 ** This file may be used under the terms of the GNU Lesser
11 ** General Public License version 2.1 as published by the Free Software
12 ** Foundation and appearing in the file COPYING included in the
13 ** packaging of this file.  Please review the following information to
14 ** ensure the GNU Lesser General Public License version 2.1 requirements
15 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
16 **
17 **
18 ****************************************************************************/
19 #include "historywidget.h"
20 #include <QtGui>
21 #include "deprecation.h"
22 //#define PROGRAM_NAME "shelXle"
HistoryWidget(QWidget * parent)23 HistoryWidget::HistoryWidget(QWidget *parent) :
24     QWidget(parent){
25     setMinimumSize(100,100);
26     setMouseTracking(true);
27 }
28 
mouseMoveEvent(QMouseEvent * event)29 void HistoryWidget::mouseMoveEvent(QMouseEvent *event){
30     if (event->pos().y()<(fh+3)) {
31         emit message("The Savehistory has an entry every time the file was saved by or before the refinement");
32         return;
33     }
34     if  (RWerte.isEmpty()) return;
35     int w = width() / RWerte.size();
36     int index = qMin(event->pos().x() / w, saveFilesList.size()-1);
37     if ((index>-1)&&(index<saveFilesList.size()))
38     emit message(QString("%1 (R1=%2)").arg(saveFilesList.at(index)).arg(RWerte.at(index)));
39 }
40 
preview()41 void HistoryWidget::preview(){
42     QAction *action = qobject_cast<QAction *>(sender());
43     QString fileName = "";
44     if (action)
45       fileName = action->data().toString();
46     else return;
47     if (fileName.isEmpty()) return;
48     QFile f(fileName);
49     f.open(QIODevice::ReadOnly);
50     QString all = f.readAll();
51     all = all.section('\n',0,30);
52     //all = all.replace("\n","<br>\n");
53     f.close();
54     //QWhatsThis *wtf = new QWhatsThis();
55     QWhatsThis::showText(QPoint(75,0),//<style type=\"text/css\">{ font-size:0.7em; white-space:pre; }</style>
56                          QString("<h2>%2</h2><font color=red>--click here to close--</font><font size=-1><pre><code>%1</code></pre></font><center></center>")
57                          .arg(all)
58                          .arg(fileName));
59     all.clear();
60     return;
61 
62 }
63 
preview2()64 void HistoryWidget::preview2(){
65     QAction *action = qobject_cast<QAction *>(sender());
66     QString fileName = "";
67     if (action)
68       fileName = action->data().toString();
69     else return;
70     if (fileName.isEmpty()) return;
71     QFile f(fileName);
72     f.open(QIODevice::ReadOnly);
73     QString all = f.readAll();
74     all = all.section('\n',30);
75     //all = all.replace("\n","<br>\n");
76     f.close();
77     //QWhatsThis *wtf = new QWhatsThis();
78     QWhatsThis::showText(QPoint(75,0),//<style type=\"text/css\">{ font-size:0.7em; white-space:pre; }</style>
79                          QString("<h2>%2</h2><font color=red>--click here to close--</font><font size=-1><pre><code>...\n%1</code></pre></font><center></center>")
80                          .arg(all)
81                          .arg(fileName)
82 			 );
83     all.clear();
84     return;
85 
86 }
87 
prune()88 void HistoryWidget::prune(){
89   QString fcfname;
90   for (int i=0; (i+10)<saveFilesList.size(); i++){
91     QFile::remove(saveFilesList.at(i));
92     fcfname=saveFilesList.at(i);
93     fcfname.replace(fcfname.size()-3,3,"fcf");
94     QFile::remove(fcfname);
95   }
96   setPath(dirname,maxwid);
97 }
98 
deleteOne()99 void HistoryWidget::deleteOne(){
100     QAction *action = qobject_cast<QAction *>(sender());
101     QString fileName = "";
102     if (action)
103       fileName = action->data().toString();
104     else return;
105     if (fileName.isEmpty()) return;
106     QString fcfname=fileName;
107     fcfname.replace(fcfname.size()-3,3,"fcf");
108     if (QMessageBox::Yes==QMessageBox::question ( this, "Delete history entry",
109 			    QString("Do you really whant to delete history files '<b>%1</b>' and '<b>%2</b>'?").
110 			    arg(fileName).
111 			    arg(fcfname),
112 			    QMessageBox::Yes|QMessageBox::No, QMessageBox::NoButton )){
113     QFile::remove(fileName);
114     QFile::remove(fcfname);
115     }
116     setPath(dirname,maxwid);
117 }
118 
119 
mousePressEvent(QMouseEvent * event)120 void HistoryWidget::mousePressEvent ( QMouseEvent * event ){
121   if  (RWerte.isEmpty()) return;
122   int w = width() / RWerte.size();
123   int index = qMin(event->pos().x() / w, saveFilesList.size()-1);//event->pos().x() / w;
124   //copy ins to last programnameSaves
125   //copy res to ins
126   //copy savefilelist.at(index) to res and open this res file
127   QString dn=dirname.section('/',0,-2),
128 	  argument=dirname.section('/',-1);
129   argument.remove(QRegExp(".res$|.ins$",Qt::CaseInsensitive));
130   if (event->buttons() & Qt::RightButton){
131       QMenu *menu = new QMenu("");
132       QString shortname=saveFilesList.at(index).section('/',-1);
133       QAction *a=menu->addAction(QString("Preview %1 (first 30 lines)").arg(shortname),this,SLOT(preview()));
134       a->setData(saveFilesList.at(index));
135       a=menu->addAction(QString("Preview %1 (next 30 lines)").arg(shortname),this,SLOT(preview2()));
136       a->setData(saveFilesList.at(index));
137       a=menu->addAction(QString("Purge history. Keep newest ten entries."),this,SLOT(prune()));
138       a=menu->addAction(QString("Delete %1 !").arg(shortname),this,SLOT(deleteOne()));
139       a->setData(saveFilesList.at(index));
140       menu->exec(event->globalPos());
141       delete menu;
142   }
143   if (event->buttons() & Qt::LeftButton){
144     if (event->pos().y()<(fh+3)) {emit saveHist(); return;}
145     if (dirname.contains(QRegExp(".res$",Qt::CaseInsensitive))){
146       QString insname =dirname;
147       insname.replace(QRegExp(".res$",Qt::CaseInsensitive),".ins");
148       QString fcfname = dirname;
149       fcfname.replace(QRegExp(".res$",Qt::CaseInsensitive),".fcf");
150       QString fcfname2 = dirname;
151       fcfname2.replace(QRegExp(".res$",Qt::CaseInsensitive),".2fcf");
152       QDir work=QDir(QString("%1/%2saves/").arg(dn).arg(PROGRAM_NAME));
153       QStringList filter;
154       filter << QString("%1_*_.ins").arg(argument);
155       QStringList resfs;
156       resfs=work.entryList(filter,QDir::Files,QDir::Time|QDir::Reversed);
157       int vers=0;
158       if (resfs.isEmpty()) vers=1;
159       else {
160 	bool ok=true;
161 	for (int i = 0; i < resfs.size(); i++)
162 	  vers = qMax(resfs.at(i).section("_",-2,-2).toInt(&ok,36),vers);
163 	vers++;
164       }
165       if (!work.exists ( QString("%1/%2saves/").arg(dn).arg(PROGRAM_NAME))) work.mkdir (QString("%1/%2saves/").arg(dn).arg(PROGRAM_NAME));
166       if (saveFilesList.at(index)==insname){
167 	QFile::copy(dirname,QString("%1/%4saves/%2_%3_.ins").arg(dn).arg(argument).arg(vers,2,36,QLatin1Char('0')).arg(PROGRAM_NAME));
168 	QFile::remove(dirname);
169 	QFile::copy(saveFilesList.at(index),dirname);
170 //	QFile::remove(saveFilesList.at(index));
171 
172         QFile::copy(fcfname,QString("%1/%4saves/%2_%3_.fcf").arg(dn).arg(argument).arg(vers,2,36,QLatin1Char('0')).arg(PROGRAM_NAME));
173         QFile::remove(fcfname);
174         QFile::copy(fcfname2,fcfname);
175         //printf("copy %s to %s\n",fcfname.toStdString().c_str()
176         //		,QString("%1/%4saves/%2_%3_.fcf").arg(dn).arg(argument).arg(vers,2,36,QLatin1Char('0')).arg(PROGRAM_NAME).toStdString().c_str());
177         //printf("copy %s to %s\n",fcfname2.toStdString().c_str(), fcfname.toStdString().c_str());
178 
179       }else{
180 	QFile::copy(insname,QString("%1/%4saves/%2_%3_.ins").arg(dn).arg(argument).arg(vers,2,36,QLatin1Char('0')).arg(PROGRAM_NAME));
181 	QFile::remove(insname);
182 	QFile::copy(dirname,insname);
183 	if (saveFilesList.at(index) != dirname) {
184 	  QFile::remove(dirname);
185 	}
186         QFile::copy(fcfname2,QString("%1/%4saves/%2_%3_.fcf").arg(dn).arg(argument).arg(vers,2,36,QLatin1Char('0')).arg(PROGRAM_NAME));
187         QFile::remove(fcfname2);
188         QFile::copy(fcfname,fcfname2);
189         QFile::remove(fcfname);
190         QString sfcf=saveFilesList.at(index);
191         sfcf = sfcf.replace(sfcf.size()-3,3,"fcf");
192         QFile::copy(sfcf,fcfname);
193 
194 	QFile::copy(saveFilesList.at(index),dirname);
195 	//QFile::remove(saveFilesList.at(index));
196         //printf("copy %s to %s\n",fcfname.toStdString().c_str()
197         //		,fcfname2.toStdString().c_str());
198         //printf("copy %s to %s\n",fcfname2.toStdString().c_str()
199         //		,QString("%1/%4saves/%2_%3_.fcf").arg(dn).arg(argument).arg(vers,2,36,QLatin1Char('0')).arg(PROGRAM_NAME).toStdString().c_str());
200         //printf("copy %s to %s\n",sfcf.toStdString().c_str(), fcfname.toStdString().c_str());
201       }
202       //QTest::qWait(550);
203 /*		 .arg(insname)
204 		 .arg(QString("%1/%4saves/%2_%3_.ins").arg(dn).arg(argument).arg(vers,2,36,QLatin1Char('0')).arg(PROGRAM_NAME))
205 		 .arg(dirname)
206 		 .arg(saveFilesList.at(index));*/
207     }else{
208       QDir work=QDir(QString("%1/%2saves/").arg(dn).arg(PROGRAM_NAME));
209       QStringList filter;
210       filter << QString("%1_*_.ins").arg(argument);
211       QStringList resfs;
212       resfs=work.entryList(filter,QDir::Files,QDir::Time|QDir::Reversed);
213       int vers=0;
214       if (resfs.isEmpty()) vers=1;
215       else {
216 	bool ok=true;
217 	for (int i = 0; i < resfs.size(); i++)
218 	  vers = qMax(resfs.at(i).section("_",-2,-2).toInt(&ok,36),vers);
219 
220 	vers++;
221       }
222       if (!work.exists ( QString("%1/%2saves/").arg(dn).arg(PROGRAM_NAME))) work.mkdir (QString("%1/%2saves/").arg(dn).arg(PROGRAM_NAME));
223       QFile::copy(dirname,QString("%1/%4saves/%2_%3_.ins").arg(dn).arg(argument).arg(vers,2,36,QLatin1Char('0')).arg(PROGRAM_NAME));
224       dirname.chop(3);
225       dirname.append("res");
226       QFile::copy(saveFilesList.at(index),dirname);
227     }
228     emit lofi(dirname);
229   }
230   update();
231 }
232 
setPath(QString dirName,int wid)233 void HistoryWidget::setPath(QString dirName,int wid){
234   maxwid = wid-5;
235   dirname=dirName;
236   QString dn = dirName.section('/',0,-2),
237 	  argument=dirName.section('/',-1);
238   argument.remove(QRegExp(".res$|.ins$",Qt::CaseInsensitive));
239   QString insname =dirName;
240   insname.replace(QRegExp(".res$",Qt::CaseInsensitive),".ins");
241 
242   QDir work=QDir(QString("%1/%2saves/").arg(dn).arg(PROGRAM_NAME));
243   QStringList filter;
244   filter << QString("%1_*_.ins").arg(argument);
245   QStringList resfs;
246   resfs=work.entryList(filter,QDir::Files,QDir::Time|QDir::Reversed);
247   filter.clear();
248   filter << QString("%1_*_.*").arg(argument);
249   QFileInfoList resfil = work.entryInfoList(filter,QDir::Files,QDir::Time|QDir::Reversed);
250   gesamtGr=0;
251   for (int k=0; k< resfil.size(); k++){
252       gesamtGr += resfil.at(k).size();
253   }
254   resfil.clear();
255   int vers=0;
256   if (resfs.isEmpty()) vers=0;
257   else {
258     bool ok=true;
259     for (int i = 0; i < resfs.size(); i++)
260       vers = qMax(resfs.at(i).section("_",-2,-2).toInt(&ok,36),vers);
261 
262     // vers++;
263   }
264   FreeWerte.clear();
265   RWerte.clear();
266   RallWerte.clear();
267   gooddata.clear();
268   alldata.clear();
269   parameters.clear();
270   saveFilesList.clear();
271   dateTimesList.clear();
272   for (int i=0; i<resfs.size();i++){
273     QFile alt(QString("%1/%2").arg(work.absolutePath()).arg(resfs.at(i)));
274     alt.open(QIODevice::ReadOnly|QIODevice::Text);
275     QString inhalt=alt.readAll();
276     alt.close();
277     inhalt = inhalt.section("\nHKLF ",1);
278 
279 
280     //REM R1 =  0.0150 for   6927 Fo > 4sig(Fo)  and  0.0160 for all   7220 data
281     QStringList sl = inhalt.section("REM R1 =",1).section("\n",0,0).trimmed().split(" ",skipEmptyParts);
282     if (sl.size()<11) continue;
283     RWerte.append(sl.at(0).toDouble()*100.0);
284     gooddata.append(sl.at(2).toInt());
285     RallWerte.append(sl.at(7).toDouble()*100.0);
286     alldata.append(sl.at(10).toInt());
287     //R1(Free) =
288     QStringList slfree = inhalt.section("REM R1(Free) =",1).section("\n",0,0).trimmed().split(" ",skipEmptyParts);
289     if (slfree.size()>1){
290         FreeWerte[RWerte.size()-1]=slfree.at(0).toDouble()*100;
291     }
292     sl = inhalt.section("REM R1 =",1).section("\n",1,1).trimmed().split(" ",skipEmptyParts);
293     if (sl.size()<2) continue;
294     parameters.append(sl.at(1).toInt());
295     saveFilesList.append(alt.fileName());
296     dateTimesList.append(QFileInfo(alt.fileName()).lastModified());
297 
298   }
299 
300   {
301     QFile alt(insname);
302     if (alt.open(QIODevice::ReadOnly)){
303       QString inhalt=alt.readAll();
304 
305       alt.close();
306 
307       inhalt = inhalt.section("\nHKLF ",1);
308       //REM R1 =  0.0150 for   6927 Fo > 4sig(Fo)  and  0.0160 for all   7220 data
309       QStringList sl = inhalt.section("REM R1 =",1).section("\n",0,0).trimmed().split(" ",skipEmptyParts);
310       if (sl.size()<11) return;
311       RWerte.append(sl.at(0).toDouble()*100.0);
312       gooddata.append(sl.at(2).toInt());
313       RallWerte.append(sl.at(7).toDouble()*100.0);
314       alldata.append(sl.at(10).toInt());
315       //R1(Free) =
316       QStringList slfree = inhalt.section("REM R1(Free) =",1).section("\n",0,0).trimmed().split(" ",skipEmptyParts);
317       if (slfree.size()>1){
318       FreeWerte[RWerte.size()-1]=slfree.at(0).toDouble()*100;
319       }
320 
321 
322       sl = inhalt.section("REM R1 =",1).section("\n",1,1).trimmed().split(" ",skipEmptyParts);
323       if (sl.size()<2) return;
324       parameters.append(sl.at(1).toInt());
325       saveFilesList.append(alt.fileName());
326       dateTimesList.append(QFileInfo(alt.fileName()).lastModified());
327     }}
328     {
329       QFile alt(dirName);
330       if (alt.open(QIODevice::ReadOnly)){
331 	QString inhalt=alt.readAll();
332 	alt.close();
333 
334         inhalt = inhalt.section("\nHKLF ",1);
335 	//REM R1 =  0.0150 for   6927 Fo > 4sig(Fo)  and  0.0160 for all   7220 data
336 
337     QStringList sl = inhalt.section("REM R1 =",1).section("\n",0,0).trimmed().split(" ",skipEmptyParts);
338 	if (sl.size()<11) return;
339 	RWerte.append(sl.at(0).toDouble()*100.0);
340 	gooddata.append(sl.at(2).toInt());
341 	RallWerte.append(sl.at(7).toDouble()*100.0);
342         alldata.append(sl.at(10).toInt());
343         //R1(Free) =
344         QStringList slfree = inhalt.section("REM R1(Free) =",1).section("\n",0,0).trimmed().split(" ",skipEmptyParts);
345         if (slfree.size()>1){
346         FreeWerte[RWerte.size()-1]=slfree.at(0).toDouble()*100;
347         }
348 
349         sl = inhalt.section("REM R1 =",1).section("\n",1,1).trimmed().split(" ",skipEmptyParts);
350 	if (sl.size()<2) return;
351 	parameters.append(sl.at(1).toInt());
352 	saveFilesList.append(alt.fileName());
353 	dateTimesList.append(QFileInfo(alt.fileName()).lastModified());
354       }}
355 
356 
357       update();
358 }
359 
rwert_farbverlauf(double wrt)360 QColor HistoryWidget::rwert_farbverlauf(double wrt){
361   int rot,gruen,blau,alpha;
362   int lauf=0;
363   const float farbe[6][4]={
364     {0.0f,0.6f,0.0f,1.0f},
365     {0.0f,0.6f,1.0f,1.0f},
366     {0.0f,0.0f,1.0f,1.0f},
367     {0.7f,0.6f,0.0f,1.0f},
368     {0.7f,0.0f,1.0f,1.0f},
369     {0.7f,0.0f,0.0f,1.0f}};
370   double nwrt=(wrt)/(100);
371   nwrt=(nwrt>=1.0)?0.99999:nwrt;
372   nwrt=(nwrt<=0.0)?0.00001:nwrt;
373   lauf=(int (nwrt/0.2));
374   nwrt-=(0.2*lauf);
375   nwrt/=(0.2);
376 
377   rot=(int)(255*((1.0-nwrt)*farbe[lauf][0]+farbe[lauf+1][0]*nwrt));
378   gruen=(int)(255*((1.0-nwrt)*farbe[lauf][1]+farbe[lauf+1][1]*nwrt));
379   blau=(int)(255*((1.0-nwrt)*farbe[lauf][2]+farbe[lauf+1][2]*nwrt));
380   alpha=255;
381   return QColor(rot,gruen,blau,alpha);
382 }
383 
paintEvent(QPaintEvent * event)384 void HistoryWidget::paintEvent(QPaintEvent *event){
385   double x =0;
386   for (int i=0; i<RWerte.size(); i++){
387     x = qMax(RWerte.at(i),x);
388     if (FreeWerte.contains(i))
389       x = qMax(FreeWerte.value(i),x);
390   }
391   QPainter p(this);
392   setMinimumWidth(qMax(p.fontMetrics().width(QString("%1").arg(x,4,'f',3))*RWerte.size(),maxwid));
393   setMaximumWidth(qMax(p.fontMetrics().width(QString("%1").arg(x,4,'f',3))*RWerte.size(),maxwid));
394   p.fillRect(0,0,width(),height(),QPalette().window());// );QColor("#eeeecc")
395   p.setPen(Qt::black);
396 
397   if  (RWerte.isEmpty()) return;
398   int h = height(), w = width() / RWerte.size();
399   fh=p.fontMetrics().height();
400   //save History
401   p.setBrush(QBrush(QColor("#eeeecc")));
402   p.drawRect(0,0,width(),fh);
403   p.drawText(0,0,width(),fh,Qt::AlignLeft,QString("Alternatively open the SaveHistory! (click here)"));//
404   //
405   p.drawText(0,fh,width(),fh,Qt::AlignLeft,QString("Total size of history on disk: %1%2")
406       .arg((gesamtGr/(1024*1024))?(double)gesamtGr/(1024*1024):(double)gesamtGr/1024,7,'f',1)
407       .arg((gesamtGr/(1024*1024))?"MB":"kB"));
408   double hupro=0;
409   for (int i = 0; i < RWerte.size(); i++){
410       hupro=qMax(hupro,RWerte.at(i));
411   }
412   hupro=(2*hupro);
413   for (int i = 0; i < RWerte.size(); i++){
414     if (FreeWerte.contains(i)){
415       p.setBrush(QBrush(rwert_farbverlauf(FreeWerte.value(i)*3)));
416       p.drawRect(i*w+5,qMax((int)(h-(FreeWerte.value(i)/hupro*h))-1,0),w*0.95-5,qMin((int)(FreeWerte.value(i)/hupro*h),h-2));
417     }
418     p.setBrush(QBrush(rwert_farbverlauf(RWerte.at(i)*3)));
419     p.drawRect(i*w,qMax((int)(h-(RWerte.at(i)/hupro*h))-1,0),w*0.9,qMin((int)(RWerte.at(i)/hupro*h),h-2));
420     if (FreeWerte.contains(i)){
421       p.drawText(i*w, qMax((int)(h-(FreeWerte.value(i)/hupro*h)),fh+5)-fh-2, w,fh,Qt::AlignLeft, QString("%1")
422           .arg(RWerte.at(i),4,'f',2));
423 
424       p.drawText(i*w, qMax((int)(h-((FreeWerte.value(i))/hupro*h))-fh,fh+5)-fh-2, w,fh,Qt::AlignLeft, QString("%1")
425           .arg(FreeWerte.value(i),4,'f',2));
426     }else
427       p.drawText(i*w, qMax((int)(h-(RWerte.at(i)/hupro*h)),fh+5)-fh-2, w,fh,Qt::AlignLeft, QString("%1")
428           .arg(RWerte.at(i),4,'f',2));
429   }
430   event->accept();
431   //p.drawText(0,0,p.fontMetrics().width("1234567890"),p.fontMetrics().height(),Qt::AlignLeft,QString("%1 %2").arg(h).arg(w));
432 }
433 
event(QEvent * event)434 bool HistoryWidget::event(QEvent *event){
435   if (!isVisible()) {event->ignore(); return false;}
436   if (event->type() == QEvent::ToolTip) {
437     QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event);
438     QPoint da = helpEvent->pos();
439     if (da.y()<(fh+3))return true;
440     if  (RWerte.isEmpty()) return true;
441     int w = width() / RWerte.size();
442     int index = da.x() / w;
443     QString fcfname;
444     if ((index<0)||(index>=saveFilesList.size())) return true;
445     else fcfname=saveFilesList.at(index);
446     fcfname.replace(fcfname.size()-3,3,"fcf");
447     bool fcfda=QFile::exists(fcfname);
448     if (FreeWerte.contains(index)){
449       QToolTip::showText(helpEvent->globalPos(),
450           QString("<b>%4:</b><br> R1(Free) = <b>%9</b><br>R1 = <b>%1</b><br>R1all = <b>%2</b><br>Reflection/Parameter = <b>%3</b><br>Reflection = <b>%6</b><br>Parameter = <b>%7</b><br>FCF-File present: <b>%8</b><br>Last modified: <b>%5</b>")
451           .arg(RWerte.at(index))
452           .arg(RallWerte.at(index))
453           .arg(((index<gooddata.size())&&(index<parameters.size()))  ?(double) gooddata.at(index) / parameters.at(index):0)
454           .arg((index<saveFilesList.size())?saveFilesList.at(index):0)
455           .arg((index<dateTimesList.size())?dateTimesList.at(index).toString("d MMM yyyy - hh:mm:ss"):"??")
456           .arg((index<gooddata.size())?gooddata.at(index):0)
457           .arg((index<parameters.size())?parameters.at(index):0)
458           .arg((fcfda)?"Yes":"No")
459           .arg(FreeWerte.value(index)));
460 
461     }else
462       QToolTip::showText(helpEvent->globalPos(),
463           QString("<b>%4:</b><br>R1 = <b>%1</b><br>R1all = <b>%2</b><br>Reflection/Parameter = <b>%3</b><br>Reflection = <b>%6</b><br>Parameter = <b>%7</b><br>FCF-File present: <b>%8</b><br>Last modified: <b>%5</b>")
464           .arg(RWerte.at(index))
465           .arg(RallWerte.at(index))
466           .arg(((index<gooddata.size())&&(index<parameters.size()))  ?(double) gooddata.at(index) / parameters.at(index):0)
467           .arg((index<saveFilesList.size())?saveFilesList.at(index):0)
468           .arg((index<dateTimesList.size())?dateTimesList.at(index).toString("d MMM yyyy - hh:mm:ss"):"??")
469           .arg((index<gooddata.size())?gooddata.at(index):0)
470           .arg((index<parameters.size())?parameters.at(index):0)
471           .arg((fcfda)?"Yes":"No")
472 
473           );
474     return true;
475   }
476   return QWidget::event(event);
477 }
478