18 #include "../config-parley.h"
28 #include <keduvoclesson.h>
29 #include <keduvocleitnerbox.h>
30 #include <keduvocexpression.h>
31 #include <keduvocwordtype.h>
33 #include <KFileDialog>
34 #include <KRecentFilesAction>
35 #include <KStandardDirs>
36 #include <knewstuff3/downloaddialog.h>
37 #include <knewstuff3/uploaddialog.h>
38 #include <KEMailSettings>
39 #include <KMessageBox>
44 #include <QtGui/QPrinter>
45 #include <QtGui/QPrintDialog>
49 #include <libxml/parser.h>
50 #include <libxml/tree.h>
51 #include <libxslt/xslt.h>
52 #include <libxslt/xsltInternals.h>
53 #include <libxslt/transform.h>
54 #include <libxslt/xsltutils.h>
60 namespace DocumentHelper {
63 QString locale = doc->identifier(languageIndex).locale();
65 KUrl location(QString(
"http://edu.kde.org/parley/locale/") + locale + QString(
".kvtml"));
67 KEduVocDocument grammarDoc;
68 if (grammarDoc.open(location) == KEduVocDocument::NoError) {
69 doc->identifier(languageIndex).setArticle(grammarDoc.identifier(0).article());
70 doc->identifier(languageIndex).setPersonalPronouns(grammarDoc.identifier(0).personalPronouns());
72 doc->identifier(languageIndex).setTenseList(grammarDoc.identifier(0).tenseList());
74 kDebug() <<
"Download of " << location.url() <<
" failed.";
81 , m_parleyApp(parleyMainWindow)
82 , m_doc(new KEduVocDocument(this))
100 m_doc->setTitle(title);
102 m_doc->setModified(
true);
114 KEduVocDocument *newDoc =
new KEduVocDocument();
116 initializeDefaultGrammar(newDoc);
117 setDefaultDocumentProperties(newDoc);
118 bool showGrammarDialog =
false;
119 bool fetchGrammarOnline =
false;
123 titleAuthorDialog =
new KDialog(m_parleyApp);
124 titleAuthorDialog->setMainWidget( titleAuthorWidget );
125 titleAuthorDialog->setCaption(i18nc(
"@title:window document properties",
"Properties for %1", newDoc->url().url()));
126 connect(titleAuthorDialog, SIGNAL(accepted()), titleAuthorWidget, SLOT(accept()));
127 if(titleAuthorDialog->exec()) {
128 showGrammarDialog = titleAuthorWidget->grammarCheckBox->isChecked();
129 fetchGrammarOnline = titleAuthorWidget->downloadGrammarCheckBox->isChecked();
130 delete titleAuthorDialog;
132 delete titleAuthorDialog;
145 if(fetchGrammarOnline) {
149 if(showGrammarDialog) {
159 QCheckBox *practiceCheckBox =
new QCheckBox(i18n(
"Open in practice &mode"));
161 KFileDialog dialog(QString(), KEduVocDocument::pattern(KEduVocDocument::Reading), m_parleyApp, practiceCheckBox);
162 dialog.setCaption(i18n(
"Open Vocabulary Collection"));
163 if(dialog.exec() && !dialog.selectedUrl().isEmpty()) {
164 open(dialog.selectedUrl());
165 if(practiceCheckBox->isChecked()) {
184 if (url.path().isEmpty()) {
189 m_doc =
new KEduVocDocument(
this);
191 int ret = m_doc->open(url);
192 if (ret != KEduVocDocument::NoError) {
194 m_parleyApp, i18n(
"Could not read collection from \"%1\"", url.url()), i18nc(
"@title:window",
"Open Collection"));
211 kDebug() <<
"Close Document";
223 QString downloadDir = KStandardDirs::locateLocal(
"data",
"kvtml/");
224 KUrl url = KFileDialog::getOpenUrl(
226 KEduVocDocument::pattern(KEduVocDocument::Reading),
228 i18n(
"Open Downloaded Vocabulary Collection"));
237 if (m_doc->url().fileName() == i18n(
"Untitled")) {
243 QFile::remove(m_doc->url().toLocalFile()+
'~');
244 ::rename(QFile::encodeName(m_doc->url().toLocalFile()), QFile::encodeName(m_doc->url().toLocalFile()+
'~'));
250 int result = m_doc->saveAs(m_doc->url(), KEduVocDocument::Automatic, QString::fromLatin1(
"Parley ") +
PARLEY_VERSION_STRING);
252 KMessageBox::error(m_parleyApp,
253 i18n(
"Writing file \"%1\" resulted in an error: %2", m_doc->url().url(),
254 m_doc->errorDescription(result)), i18nc(
"@title:window",
"Save File"));
269 url = KFileDialog::getSaveUrl(QString(),
270 KEduVocDocument::pattern(KEduVocDocument::Writing),
271 m_parleyApp->parentWidget(),
272 i18n(
"Save Vocabulary As"));
278 QFileInfo fileinfo(url.toLocalFile());
279 if (fileinfo.exists()) {
280 if(KMessageBox::warningContinueCancel(0,
281 i18n(
"<qt>The file<p><b>%1</b></p>already exists. Do you want to overwrite it?</qt>",
282 url.toLocalFile()),QString(),KStandardGuiItem::overwrite()) == KMessageBox::Cancel) {
287 QString msg = i18nc(
"@info:status saving a file",
"Saving %1", url.toLocalFile());
289 QFile::remove(url.toLocalFile()+
'~');
290 QFile::rename(QFile::encodeName(url.toLocalFile()), QFile::encodeName(QString(url.toLocalFile()+
'~')));
294 if ( !url.fileName().contains(
'.') ) {
295 url.setFileName(url.fileName() + QString::fromLatin1(
".kvtml"));
298 int result = m_doc->saveAs(url, KEduVocDocument::Automatic,
"Parley");
303 KMessageBox::error(m_parleyApp, i18n(
"Writing file \"%1\" resulted in an error: %2",
304 m_doc->url().url(), m_doc->errorDescription(result)), i18nc(
"@title:window",
"Save File"));
308 void ParleyDocument::initializeDefaultGrammar(KEduVocDocument *doc)
310 KEduVocWordType *root = doc->wordTypeContainer();
311 KEduVocWordType *noun =
new KEduVocWordType(i18n(
"Noun"), root);
312 noun->setWordType(KEduVocWordFlag::Noun);
313 root->appendChildContainer(noun);
315 KEduVocWordType *nounChild =
new KEduVocWordType(i18n(
"Masculine"), noun);
316 nounChild->setWordType(KEduVocWordFlag::Noun | KEduVocWordFlag::Masculine);
317 noun->appendChildContainer(nounChild);
318 nounChild =
new KEduVocWordType(i18n(
"Feminine"), noun);
319 nounChild->setWordType(KEduVocWordFlag::Noun | KEduVocWordFlag::Feminine);
320 noun->appendChildContainer(nounChild);
321 nounChild =
new KEduVocWordType(i18n(
"Neuter"), noun);
322 nounChild->setWordType(KEduVocWordFlag::Noun | KEduVocWordFlag::Neuter);
323 noun->appendChildContainer(nounChild);
325 KEduVocWordType *verb =
new KEduVocWordType(i18n(
"Verb"), root);
326 verb->setWordType(KEduVocWordFlag::Verb);
327 root->appendChildContainer(verb);
329 KEduVocWordType *adjective =
new KEduVocWordType(i18n(
"Adjective"), root);
330 adjective->setWordType(KEduVocWordFlag::Adjective);
331 root->appendChildContainer(adjective);
333 KEduVocWordType *adverb =
new KEduVocWordType(i18n(
"Adverb"), root);
334 adverb->setWordType(KEduVocWordFlag::Adverb);
335 root->appendChildContainer(adverb);
337 KEduVocWordType *conjunction =
new KEduVocWordType(i18n(
"Conjunction"), root);
338 conjunction->setWordType(KEduVocWordFlag::Conjunction);
339 root->appendChildContainer(conjunction);
343 void ParleyDocument::setDefaultDocumentProperties(KEduVocDocument *doc)
345 KEMailSettings emailSettings;
346 emailSettings.setProfile(emailSettings.defaultProfileName());
347 doc->setAuthor(emailSettings.getSetting(KEMailSettings::RealName));
348 doc->setAuthorContact(emailSettings.getSetting(KEMailSettings::EmailAddress));
350 doc->setLicense( i18n(
"Public Domain") );
351 doc->setCategory( i18n(
"Languages") );
353 QString locale = KGlobal::locale()->language();
355 doc->appendIdentifier();
356 doc->appendIdentifier();
357 doc->identifier(0).setName( KGlobal::locale()->languageCodeToName( locale) );
358 doc->identifier(0).setLocale( locale );
359 doc->identifier(1).setName( i18n(
"A Second Language") );
360 doc->identifier(1).setLocale( locale );
362 KEduVocLesson* lesson =
new KEduVocLesson(i18n(
"Lesson 1"), doc->lesson());
363 doc->lesson()->appendChildContainer(lesson);
366 for (
int i = 0; i < 15 ; i++ ) {
367 lesson->appendEntry(
new KEduVocExpression());
370 doc->setModified(
false);
377 newStuffDialog.exec();
378 KNS3::Entry::List entries = newStuffDialog.installedEntries();
379 int numberInstalled = entries.size();
380 foreach(
const KNS3::Entry& entry, entries) {
382 foreach(
const QString &file, entry.installedFiles()) {
383 KMimeType::Ptr mimeType = KMimeType::findByPath(file);
384 kDebug() <<
"KNS2 file of mime type:" << KMimeType::findByPath(file)->name();
385 if (mimeType->is(
"application/x-kvtml")) {
395 if (numberInstalled > 1) {
397 }
else if (numberInstalled == 1) {
398 if (
open(KUrl(fileName)))
401 KMessageBox::error(m_parleyApp, i18n(
"Could not open vocabulary collection \"%1\"", entries.first().name()));
409 titleAuthorDialog =
new KDialog(m_parleyApp);
410 titleAuthorDialog->setMainWidget( titleAuthorWidget );
413 titleAuthorWidget->languageGroupBox->setVisible(
false);
414 titleAuthorDialog->setCaption(i18nc(
"@title:window document properties",
"Properties for %1", m_doc->url().url()));
415 connect(titleAuthorDialog, SIGNAL(accepted()), titleAuthorWidget, SLOT(accept()));
416 titleAuthorDialog->exec();
417 delete titleAuthorDialog;
423 if ( properties.exec() == KDialog::Accepted ) {
432 KUrl url(dir.name() + m_doc->url().fileName());
433 kDebug() <<
"save in " << url.url();
434 m_doc->saveAs(url, KEduVocDocument::Automatic,
"Parley");
436 KEduVocDocument tempDoc(
this);
439 tempDoc.lesson()->resetGrades(-1, KEduVocContainer::Recursive);
440 tempDoc.saveAs(url, KEduVocDocument::Automatic,
"Parley");
444 dialog.setUploadFile(url);
485 if ( m_backupTimer ) {
486 m_backupTimer->stop();
489 if ( !m_backupTimer ) {
490 m_backupTimer =
new QTimer(
this);
491 connect(m_backupTimer, SIGNAL(timeout()),
this, SLOT(
save()));
497 #include "parleydocument.moc"
ParleyDocument(ParleyMainWindow *parleyMainWindow)
Component currentComponent()
void documentChanged(KEduVocDocument *newDocument)
#define PARLEY_VERSION_STRING
void languageProperties()
void setTitle(const QString &title)
void documentProperties()
General doc properties like title, author etc.
void slotFileMerge()
merge a document
void fetchGrammar(KEduVocDocument *doc, int languageIndex)
void slotFileOpenRecent(const KUrl &url)
opens a file from the recent files menu
KEduVocDocument * document()
void slotFileOpen()
open a document
void save()
save a document
void newDocument(bool wizard)
static ParleyMainWindow * instance()
bool queryExit()
overloaded for Message box on last window exit
void showPracticeConfiguration()
void enableAutoBackup(bool enable)
void openGHNS()
open a downloaded (knewstuff/get hot new stuff) document
void uploadFile()
upload the current file
static int backupTime()
Get Time interval between two automatic backups.
void slotGHNS()
download new vocabularies
void updateRecentFilesModel()
update the list of recent files in the welcome screen
static bool autoBackup()
Get If true, a backup is saved every BackupTime minutes.
void addRecentFile(const KUrl &url, const QString &name)
add a new entry to the list of recent files
bool open(const KUrl &)
Opens the given url, displays an error message and returns false on failure.
void saveAs(KUrl file=KUrl())
void slotFileNew()
open a new application window
void slotUpdateWindowCaption()
Update the title bar of the main window with the current document.
static QString separator()
Get This sets the separator used when copying/pasting text, default is Tab.