1 /***************************************************************************
2 kverbosdoc.cpp - description
4 begin : Fre Dez 14 19:28:09 CET 2001
5 copyright : (C) 2001 by Arnold Kraschinski
6 email : arnold.k67@gmx.de
7 ***************************************************************************/
9 /***************************************************************************
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
16 ***************************************************************************/
18 // include eines Standardheaders
23 // include files for Qt
24 #include <qmessagebox.h>
26 // include files for KDE
28 #include <kmessagebox.h>
29 #include <kio/netaccess.h>
31 // application specific includes
32 #include "verbspanish.h"
33 #include "kverbosdoc.h"
34 #include "kverbosview.h"
35 #include "kverbosuser.h"
40 QPtrList
<KVerbosView
> *KVerbosDoc::pViewList
= 0L;
42 KVerbosDoc::KVerbosDoc(QWidget
*parent
, const char *name
) : QObject(parent
, name
)
46 pViewList
= new QPtrList
<KVerbosView
>();
48 pViewList
->setAutoDelete(true);
49 // Zufallsgenerator mit einem seed-Wert versorgen
50 srand((unsigned int)time((time_t *)NULL
));
51 // Den Zeiger auf einen Benutzer initialisieren
52 benutzer
= new KVerbosUser(getList(), DEFAULTUSER
);
55 KVerbosDoc::~KVerbosDoc()
60 pViewList
->first()->userChanged(result
, number
);
61 benutzer
->saveUser(result
, number
);
68 void KVerbosDoc::addView(KVerbosView
*view
)
70 pViewList
->append(view
);
71 connect(this, SIGNAL(changeView()), view
, SLOT(zeigeVerb()));
74 void KVerbosDoc::removeView(KVerbosView
*view
)
76 pViewList
->remove(view
);
79 void KVerbosDoc::setURL(const KURL
&url
)
84 const KURL
& KVerbosDoc::URL() const
89 void KVerbosDoc::slotUpdateAllViews(KVerbosView
*sender
)
93 for(w
=pViewList
->first(); w
!=0; w
=pViewList
->next())
98 bool KVerbosDoc::saveModified()
104 KVerbosApp
*win
=(KVerbosApp
*) parent();
105 int want_save
= KMessageBox::warningYesNoCancel(win
,
106 i18n("The current file has been modified.\nDo you want to save it?"),
110 // ich habe die Nummern gegenüber den originalen Nummern in der case-Anweisung
111 // vertauscht, weil die originalen Nummern verkehrt zugeordnet sind!.
112 // In der Dokumentation zu KMessageBox kann man die richtige Zuordnung der Buttons finden.
117 if (doc_url
.fileName() == i18n("Untitled"))
119 win
->slotFileSaveAs();
134 default: // Verhalten wie CANCEL
143 void KVerbosDoc::closeDocument()
148 bool KVerbosDoc::newDocument()
150 // Die Verbenlist wird gelöscht, damit sie sicher leer ist.
154 doc_url
.setFileName(i18n("Untitled"));
155 emit
anzahlVerbenGeaendert(getAnzahl());
159 bool KVerbosDoc::openDocument(const KURL
& url
, const char *format
/*=0*/)
163 KIO::NetAccess::download( url
, tmpfile
);
165 QFile
file(url
.path());
166 if ( file
.open(IO_ReadOnly
) ) { // file opened successfully
168 if ((url
.fileName().right(4) == "html")||(url
.fileName().right(3) == "htm"))
170 // qWarning("öffnen eines HTML-files");
171 b
= openDocHTML(file
);
175 // qWarning("öffnen eines .verbos-files");
176 b
= openDocVERBOS(file
);
179 // Liste der Verben sortieren
181 spanishVerbList::Iterator it1
= verbList2
.begin();
182 spanishVerbList::Iterator it2
;
183 while (it1
!= verbList2
.end())
186 bool inserted
= false;
187 while (it2
!= vl
.end())
191 vl
.insert(it2
, *it1
);
199 vl
.insert(it2
, *it1
);
204 benutzer
->fillList(getList());
208 KIO::NetAccess::removeTempFile( tmpfile
);
211 emit
anzahlVerbenGeaendert(getAnzahl());
215 // Liesteine Datei als HTML-Dokument ein
216 bool KVerbosDoc::openDocHTML(QFile
&f
)
219 QTextStream
t( &f
); // use a text stream
229 // drei einlesen, das sind der Infinitiv, die deutsche Bedeutung, und der Typ
230 while ((count1
<3) && (!f
.atEnd()))
233 if (s
.left(9) == "<td width")
235 int a
= s
.find('>', 22, true);
237 int e
= s
.find('<', a
, true);
238 v
[count1
] = s
.mid(a
, e
-a
);
241 }; // while ((count1<3) && (!f.atEnd()))
244 NewVerb
.setSpanish(v
[0]);
245 NewVerb
.setForeign(v
[1]);
246 if (v
[2] != "unregelmäßig")
248 // read a regular or a group verb
250 if (v
[2] == "regelmäßig")
252 else if (v
[2] == "<e > ie>")
254 else if (v
[2] == "<o > ue>")
256 else if (v
[2] == "<u > ue>")
258 else if (v
[2] == "<e > i>")
260 else if (v
[2] == "<c > qu>")
262 else if (v
[2] == "<g > gu>")
264 else if (v
[2] == "<z > c>")
266 else if (v
[2] == "<gu > gü>")
268 else if (v
[2] == "<c > z>")
270 else if (v
[2] == "<g > j>")
272 else if (v
[2] == "<gu > g>")
274 else if (v
[2] == "<qu > c>")
276 else if (v
[2] == "<accent like 'enviar'>")
278 else if (v
[2] == "<accent like 'continuar>")
280 else if (v
[2] == "<missing i>")
288 // ein unregelmäßiges Verb
289 NewVerb
.setGroup(IRREGULAR
);
290 // weitere 60 Zeilen einlesen, das sind die ganzen Formen
292 while ((count2
<60) && (!f
.atEnd()))
295 if ((s
.left(4) == "<td>") && (s
!= "<td></td><td></td><td></td><td></td><td></td></tr><tr>"))
297 int a
= s
.find('>', 2, true);
299 int e
= s
.find('<', a
, true);
300 forms
[count2
] = s
.mid(a
, e
-a
);
304 forms
[count2
] = "participio";
308 }; // while ((count2<60) && (!f.atEnd()))
310 // den ersten Tabellenteil übertragen
311 for (i
=0; (i
<30) && (i
<count2
); i
++)
315 // In der fünften ( a == 4 ) Spalte stehen die Gerundform und das Partizip
319 NewVerb
.setGerund(forms
[i
]);
321 NewVerb
.setPartizip(forms
[i
]);
325 // kommt ein Leerzeichen vor, muss man die Form aufteilen: In das
326 // Reflexivpronomen und das eigentliche Verb
327 if (forms
[i
].find(' ') >= 0)
329 NewVerb
.setForm(a
, b
, forms
[i
].right(forms
[i
].length()-forms
[i
].find(' ')-1));
333 NewVerb
.setForm(a
, b
, forms
[i
]);
337 // den zweiten Tabellenteil übertragen
338 for (i
=0; (i
<30) && (i
+30<count2
); i
++)
342 // In der Spalte 3 der zweiten Tabellenhälfte steht der subjuntivo futuro,
343 // den ich vergessen habe und der deshalb zur Zeit ausgelassen wird.
345 // kommt ein Leerzeichen vor, muss man die Form aufteilen: In das
346 // Reflexivpronomen und das eigentliche Verb
347 if (forms
[i
+offs
].find(' ') >= 0)
349 NewVerb
.setForm(a
, b
, forms
[i
+offs
].right(forms
[i
+offs
].length()-forms
[i
+offs
].find(' ')-1));
353 NewVerb
.setForm(a
, b
, forms
[i
+offs
]);
356 }; // if (v[2] == "unregelmäßig")
357 appendVerb(NewVerb
, false); // an die Liste anhängen
359 }; // while (!f.atEnd())
360 emit
anzahlVerbenGeaendert(getAnzahl());
364 bool KVerbosDoc::openDocVERBOS(QFile
&f
)
366 QTextStream
t( &f
); // use a text stream
372 // drei einlesen, das sind der Infinitiv, die deutsche Bedeutung, und der Typ
373 while ((count
<3) && (!f
.atEnd()))
375 v
[count
] = t
.readLine();
377 }; // while ((count<3) && (!f.atEnd()))
381 NewVerb
.setSpanish(v
[0]);
382 NewVerb
.setForeign(v
[1]);
383 int g
= v
[2].toInt();
386 // ein regelmäßiges Verb
391 // ein unregelmäßiges Verb
392 NewVerb
.setGroup(IRREGULAR
);
393 // erst den Gerund und das Partizip einlesen und dann die restlichen Formen.
394 NewVerb
.setGerund(t
.readLine());
395 NewVerb
.setPartizip(t
.readLine());
397 for (int i
= presente
; i
<= imperativo
; i
++)
398 for (int j
= yo
; j
<= ellos
; j
++)
401 NewVerb
.setForm(i
, j
, t
.readLine());
406 QMessageBox
mb("kverbos warning", "An uncomplete verb has been found in the file",
407 QMessageBox::Warning
, 1, 0, 0, 0);
409 //qWarning("Ein unvollständiges Verb kam vor!");
412 appendVerb(NewVerb
, false); // an die Liste anhängen
414 }; // while (!f.atEnd())
415 emit
anzahlVerbenGeaendert(getAnzahl());
419 // sichert die Datei. Die Verben werden in einer Datei im HTML Format gespeichert.
420 bool KVerbosDoc::saveDocument(const KURL
& url
, const char *format
/*=0*/)
423 QFile
file(url
.path());
424 if ( file
.open(IO_WriteOnly
) )
425 { // file opened successfully
426 if ((url
.fileName().right(4) == "html")||(url
.fileName().right(3) == "htm"))
428 // qWarning("als HTML speichern");
429 b
= saveDocHTML(file
);
433 // qWarning("als .verbos speichern");
434 b
= saveDocVERBOS(file
);
442 // Die Verben als HTML-Datei abspeichern
443 bool KVerbosDoc::saveDocHTML(QFile
&f
)
446 QTextStream
t( &f
); // use a text stream
447 // Den Anfang der HTML Datei schreiben
448 t
<< "<html>" << endl
;
449 t
<< "<head>" << endl
;
450 t
<< "<title>verbos españoles</title>" << endl
;
451 t
<< "<style type=\"text/css\">" << endl
;
453 t
<< "h1 { font-size:48pt; color:#FF0000; font-family:Arial; text-align:center; }" << endl
;
454 t
<< ".n { font-size:12pt; color:#000000; font-family:Arial; margin:0pt; }" << endl
;
455 t
<< ".v { font-size:16pt; color:#0000ff; font-family:Arial; }" << endl
;
456 t
<< ".r { font-size:16pt; color:#b0b0ff; font-family:Arial; }" << endl
;
457 t
<< ".t { background-color:#f0f0f0; padding:4pt; font-size:12pt; color:#000000; font-family:Arial; margin:0pt; }" << endl
;
458 t
<< "td { background-color:#ffffff; padding:4pt; font-size:12pt; color:#000000; font-family:Arial; margin:0pt; }" << endl
;
459 t
<< "//-->" << endl
;
460 t
<< "</style>" << endl
;
461 t
<< "</head>" << endl
;
462 t
<< "<body>" << endl
;
463 t
<< "<h1>verbos españoles</h1>" << endl
;
464 t
<< "<p class=\"n\">";
465 t
<< "Als regelmäßig gelten in diesem Programm alle Verben, die sich " << endl
;
466 t
<< "ohne geringste Abweichung an das Konjugationsschema für die Verben mit den " << endl
;
467 t
<< "Endungen -ar, -er und -ir halten. Die Gruppenverben, die auch eine gewisse " << endl
;
468 t
<< "Regelmäßkeit für eine Gruppe von Verben erkennen lassen, " << endl
;
469 t
<< "müssen als unregelmäßige eingegeben werden. </p>" << endl
;
470 t
<< "<p class=\"n\">";
471 t
<< "Die Formen des 'subjuntivo futuro' werden einstweilen nicht mit in das " << endl
;
472 t
<< "Programm aufgenommen. </p>" << endl
;
473 t
<< "<p class=\"n\">";
474 t
<< "Diese Datei wurde automatisch durch das Programm KVerbos erstellt. Die " << endl
;
475 t
<< "Verben wurden dabei in einem Format ausgegeben, die das Programm auch " << endl
;
476 t
<< "wieder einlesen kann. Deshalb sollten an der Datei keine Änderungen " << endl
;
477 t
<< "vorgenommen werden. Durch Änderungen kann die Datei für das Programm " << endl
;
478 t
<< "unlesbar werden. <br></p>" << endl
;
479 // Die Verbenliste in die Datei schreiben.
480 if (verbList2
.isEmpty())
482 t
<< "<p class=\"n\">Es wurden keine Verben eingegeben.</p>" << endl
;
486 spanishVerbList::Iterator it
;
487 for (it
= verbList2
.begin(); it
!= verbList2
.end(); ++it
)
489 // erst die spanische und die deutsche Bedeutung abspeichern und den Typ
490 t
<< "<hr color=#000000 size=3 noshade>" << endl
;
491 t
<< "<table width=100% border=\"0\"><tr>" << endl
;
492 t
<< "<td width=37% class=\"v\">" << (*it
).getSpanish() << "</td>" << endl
;
493 t
<< "<td width=37% class=\"v\">" << (*it
).getForeign() << "</td>" << endl
;
494 if ((*it
).isGroupVerb())
496 t
<< "<td width=26% class=\"r\">";
497 switch ((*it
).getGroup())
500 t
<< "regelmäßig</td>" << endl
; break;
502 t
<< "<e > ie></td>" << endl
; break;
504 t
<< "<o > ue></td>" << endl
; break;
506 t
<< "<u > ue></td>" << endl
; break;
508 t
<< "<e > i></td>" << endl
; break;
510 t
<< "<c > qu></td>" << endl
; break;
512 t
<< "<g > gu></td>" << endl
; break;
514 t
<< "<z > c></td>" << endl
; break;
516 t
<< "<gu > gü></td>" << endl
; break;
518 t
<< "<c > z></td>" << endl
; break;
520 t
<< "<g > j></td>" << endl
; break;
522 t
<< "<gu > g></td>" << endl
; break;
524 t
<< "<qu > c></td>" << endl
; break;
526 t
<< "<accent like 'enviar'></td>" << endl
; break;
528 t
<< "<accent like 'continuar></td>" << endl
; break;
530 t
<< "<missing i></td>" << endl
; break;
533 //qWarning("Error! Wrong group!!");
538 t
<< "<td width=26% class=\"r\">unregelmäßig</td>" << endl
;
540 t
<< "</tr></table>" << endl
;
541 // Im Falle eines unregelmäßigen Verbes, die Formen sichern
542 if ((*it
).isGroupVerb() == false)
544 t
<< "<table width=100% border=\"0\">" << endl
;
545 t
<< "<colgroup><col width=20%><col width=20%><col width=20%><col width=20%><col width=20%></colgroup>" << endl
;
546 // erster Teil der Tabelle
548 t
<< "<td class=\"t\">presente</td>" << endl
;
549 t
<< "<td class=\"t\">imperfecto</td>" << endl
;
550 t
<< "<td class=\"t\">indefinido</td>" << endl
;
551 t
<< "<td class=\"t\">futuro</td>" << endl
;
552 t
<< "<td class=\"t\">gerundio</td>" << endl
;
553 t
<< "</tr>" << endl
;
555 for (i
= yo
; i
<= ellos
; i
++)
558 for (int j
= presente
; j
<= futuro
; j
++)
560 // Formen presente, imperfecto, indefinido, futuro
562 if ((*it
).isReflexiv())
563 t
<< (*it
).getRefPron(i
) << ' ';
564 t
<< (*it
).getForm(j
, i
) << "</td>" << endl
;
566 // Sonderformen gerundio und participo
570 t
<< "<td>" << (*it
).getGerund() << "</td>" << endl
;
573 t
<< "<td class=\"t\">" << "participo</td>" << endl
;
576 t
<< "<td>" << (*it
).getPartizip() << "</td>" << endl
;
579 t
<< "<td></td>" << endl
;
581 t
<< "</tr>" << endl
;
584 t
<< "<td></td><td></td><td></td><td></td><td></td>";
586 // zweiter Teil der Tabelle
588 t
<< "<td class=\"t\">condicional</td>" << endl
;
589 t
<< "<td class=\"t\">subjuntivo presente</td>" << endl
;
590 t
<< "<td class=\"t\">subjuntivo imperfecto</td>" << endl
;
591 t
<< "<td class=\"t\">subjuntivo futuro</td>" << endl
;
592 t
<< "<td class=\"t\">imperativo</td>" << endl
;
593 t
<< "</tr>" << endl
;
594 for (i
= yo
; i
<= ellos
; i
++)
597 for (int j
= condicional
; j
<= imperativo
; j
++)
599 // Formen condicional, subjuntivo presente, subjuntivo imperfecto
600 // subjuntivo futuro, imperativo
602 if ((*it
).isReflexiv())
603 t
<< (*it
).getRefPron(i
) << ' ';
604 t
<< (*it
).getForm(j
, i
) << "</td>" << endl
;
606 t
<< "</tr>" << endl
;
608 t
<< "</table>" << endl
;
610 t
<< "<p></p>" << endl
;
613 // Das Ende der HTML Datei anfügen.
614 t
<< "</body>" << endl
;
615 t
<< "</html>" << endl
;
619 bool KVerbosDoc::saveDocVERBOS(QFile
&f
)
621 QTextStream
t( &f
); // use a text stream
622 // Die Verbenliste in die Datei schreiben.
623 if (verbList2
.isEmpty())
625 t
<< "Es wurden keine Verben eingegeben." << endl
;
629 spanishVerbList::Iterator it
;
630 for (it
= verbList2
.begin(); it
!=verbList2
.end(); ++it
)
632 // erst die spanische und die deutsche Bedeutung abspeichern und den Typ
633 t
<< (*it
).getSpanish() << endl
;
634 t
<< (*it
).getForeign() << endl
;
635 t
<< (*it
).getGroup() << endl
;
636 // Im Falle eines unregelmäßigen Verbes, die Formen sichern
637 if ((*it
).isGroupVerb() == false)
639 t
<< (*it
).getGerund() << endl
;
640 t
<< (*it
).getPartizip() << endl
;
641 for (int j
= presente
; j
<= imperativo
; j
++)
643 for (int i
= yo
; i
<= ellos
; i
++)
645 t
<< (*it
).getForm(j
, i
) << endl
;
654 void KVerbosDoc::deleteContents()
657 emit
anzahlVerbenGeaendert(getAnzahl());
660 // Ein Verb wird der Liste hinzugefügt.
661 void KVerbosDoc::appendVerb(const verbSpanish v
, bool emitStatus
/*= true*/)
665 emit
anzahlVerbenGeaendert(getAnzahl());
668 // es wird geprüft, ob die Liste leer ist.
669 bool KVerbosDoc::isEmpty() const
671 return verbList2
.isEmpty();
674 // Gibt die Liste des Dokumentes zurück.
675 spanishVerbList
* KVerbosDoc::getList()
680 // Diese Funktion ist auch die einzige über die diese Abfrage läuft, deshalb erhält sie auch
681 // die Aufgabe eine Auswahl anzuregen.
682 // Reihenfolge in dem Stringfeld: yo, tu, el, nosotros, vosotros, ellos, aleman, espanol
683 // Wird "- - - - - -" zurückgegeben, dann gibt es kein Verb in der Liste. Normalerweise
684 // wird die spanische Verbform zurückgegeben.
685 QString
KVerbosDoc::getAuswahl(QString s
[][3], int &t
)
688 // feststellen, wie viele aktivierte Zeiten in den Optionen vorhanden sind
689 int ti
[MAX_TIEMPOS
*MAX_SUBTYPES
], ty
[MAX_TIEMPOS
*MAX_SUBTYPES
];
690 bool op
[MAX_TIEMPOS
][MAX_SUBTYPES
];
692 KVerbosApp
*app
= dynamic_cast<KVerbosApp
*>(parent());
694 app
->getTimeOptions(op
);
696 for (int i
=0; i
<MAX_TIEMPOS
; i
++)
697 for (int j
=0; j
<MAX_SUBTYPES
; j
++)
704 if ((0 == verbList2
.count()) || (0 == zeitenZahl
))
706 // Die Liste ist leer oder keine Zeit ist ausgewählt.
707 for (int i
=0; i
<PERSONEN
+1; i
++)
709 s
[i
][0] = "- - - - - -";
710 s
[i
][1] = "- - - - - -";
711 s
[i
][2] = "- - - - - -";
717 spanishVerbList::Iterator it
= findVerb(benutzer
->suggestVerb());
718 if (it
== verbList2
.end())
720 it
= verbList2
.at(rand() % verbList2
.count());
722 zeitenZahl
= rand() % zeitenZahl
;
723 // die deutsche und die spanische Form übernehmen
724 s
[6][0] = (*it
).getSpanish();
725 s
[6][1] = (*it
).getForeign();
726 // die einzelnen Formen zusammenstellen
727 for (int i
=0; i
<PERSONEN
; i
++)
729 verbOK
= verbOK
&& (*it
).getForm(ti
[zeitenZahl
], i
, ty
[zeitenZahl
], s
[i
]);
731 t
= ti
[zeitenZahl
] + ty
[zeitenZahl
]*MAX_TIEMPOS
;
735 QMessageBox
mb("kverbos warning", "There is a problem with the verb " + s
[6][0] +
736 ".\nPlease check the verb in the edit dialog.", QMessageBox::Warning
, 1, 0, 0, 0);
738 for (int i
=0; i
<PERSONEN
+1; i
++)
740 s
[i
][0] = "- - - - - -";
741 s
[i
][1] = "- - - - - -";
742 s
[i
][2] = "- - - - - -";
749 spanishVerbList::Iterator
KVerbosDoc::findVerb(const QString
& s
)
751 spanishVerbList::Iterator it
= verbList2
.begin();
752 while ((it
!= verbList2
.end()) && (!((*it
) == s
)))
757 void KVerbosDoc::solved(const bool b
)
766 // sets a new user name, and deletes the old one. If the old one is differet from
767 // the default name'-------' then some information is stored about the user. The
768 // Program look if some information about the user is stored.
769 void KVerbosDoc::setNewUser(const QString n
)
774 pViewList
->first()->userChanged(result
, number
);
775 benutzer
->saveUser(result
, number
);
778 // prüfen ob über den Nutzer schon was gespeichert ist.
779 benutzer
= new KVerbosUser(getList(), n
);
782 #include "kverbosdoc.moc"