Subversion Repositories Scribus

Rev

Rev 18122 | Rev 19267 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4430 cbradney 1
/*
2
For general Scribus (>=1.3.2) copyright and licensing information please refer
3
to the COPYING file provided with the program. Following this notice may exist
4
a copyright and/or license notice that predates the release of Scribus 1.3.2
5
for which a new license (GPL+exception) is in place.
6
*/
564 cbradney 7
/***************************************************************************
8
*   Copyright (C) 2004 by Craig Bradney                                   *
9
*   cbradney@zip.com.au                                                   *
2052 subik 10
*   Copyright (C) 2005 by Petr Vanek                                      *
11
*   petr@yarpen.cz                                                        *
564 cbradney 12
*                                                                         *
13
*   This program is free software; you can redistribute it and/or modify  *
14
*   it under the terms of the GNU General Public License as published by  *
15
*   the Free Software Foundation; either version 2 of the License, or     *
16
*   (at your option) any later version.                                   *
17
*                                                                         *
18
*   This program is distributed in the hope that it will be useful,       *
19
*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
20
*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
21
*   GNU General Public License for more details.                          *
22
*                                                                         *
23
*   You should have received a copy of the GNU General Public License     *
24
*   along with this program; if not, write to the                         *
25
*   Free Software Foundation, Inc.,                                       *
18122 mrdocs 26
*   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.             *
564 cbradney 27
***************************************************************************/
560 cbradney 28
 
3 paul 29
#include "helpbrowser.h"
13530 pierre 30
#include "ui/helpnavigation.h"
560 cbradney 31
 
10108 cbradney 32
#include <QAction>
11645 fschmid 33
// #include <QDebug>
10108 cbradney 34
#include <QDir>
13530 pierre 35
#include <QDockWidget>
10108 cbradney 36
#include <QDomDocument>
10859 cbradney 37
#include <QEvent>
10006 cbradney 38
#include <QFileDialog>
10108 cbradney 39
#include <QFileInfo>
40
#include <QHeaderView>
41
#include <QInputDialog>
42
#include <QItemSelectionModel>
43
#include <QList>
44
#include <QMessageBox>
45
#include <QModelIndex>
46
#include <QModelIndexList>
47
#include <QPainter>
48
#include <QPrinter>
10511 fschmid 49
#include <QPrintDialog>
10006 cbradney 50
#include <QProcess>
10108 cbradney 51
#include <QPushButton>
52
#include <QString>
53
#include <QStandardItem>
54
#include <QTextEdit>
55
#include <QTreeView>
56
#include <QXmlDefaultHandler>
57
 
58
#include "prefsmanager.h"
10369 cbradney 59
#include "scribuscore.h"
10200 cbradney 60
#include "util_icon.h"
128 Franz 61
 
10108 cbradney 62
/*! \brief XML parsef for documantation history.
2048 subik 63
This is small helper class which reads saved bookmarks configuration
10108 cbradney 64
from ~/.scribus/doc/history.xml file.
65
The reference to historyBrowser is a reference to the dialog.
2048 subik 66
\author Petr Vanek <petr@yarpen.cz>
67
*/
10108 cbradney 68
class HistoryParser2 : public QXmlDefaultHandler
2048 subik 69
{
70
        public:
10108 cbradney 71
                HelpBrowser *helpBrowser;
2048 subik 72
 
73
                bool startDocument()
74
                {
75
                        return true;
76
                }
77
 
78
                bool startElement(const QString&, const QString&, const QString& qName, const QXmlAttributes& attrs)
79
                {
80
                        if (qName == "item")
81
                        {
10108 cbradney 82
                                struct histd2 his;
83
                                his.title = attrs.value(0);
84
                                his.url = attrs.value(1);
85
                                helpBrowser->mHistory[helpBrowser->histMenu->addAction(his.title)] = his;
2048 subik 86
                        }
87
                        return true;
88
                }
89
 
90
                bool endElement(const QString&, const QString&, const QString&)
91
                {
92
                        return true;
93
                }
94
};
95
 
10108 cbradney 96
/*! \brief XML parsef for documantation bookmarks.
2052 subik 97
This is small helper class which reads saved bookmarks configuration
10108 cbradney 98
from ~/.scribus/doc/bookmarks.xml file.
99
The reference to QListView *view is a reference to the list view with bookmarks
2052 subik 100
\author Petr Vanek <petr@yarpen.cz>
101
*/
10108 cbradney 102
class BookmarkParser2 : public QXmlDefaultHandler
2052 subik 103
{
104
        public:
10108 cbradney 105
                QTreeWidget* view;
106
                QMap<QString, QString>* quickHelpIndex;
107
                QMap<QString, QPair<QString, QString> >* bookmarkIndex;
2048 subik 108
 
2052 subik 109
                bool startDocument()
110
                {
111
                        return true;
112
                }
113
 
114
                bool startElement(const QString&, const QString&, const QString& qName, const QXmlAttributes& attrs)
115
                {
116
                        if (qName == "item")
117
                        {
10676 cbradney 118
                                //TODO : This will dump items if bookmarks get loaded into a different GUI language
10108 cbradney 119
                                if (quickHelpIndex->contains(attrs.value(1)))
120
                                {
121
                                        bookmarkIndex->insert(attrs.value(0), qMakePair(attrs.value(1), attrs.value(2)));
122
                                        view->addTopLevelItem(new QTreeWidgetItem(view, QStringList() << attrs.value(0)));
123
                                }
2052 subik 124
                        }
125
                        return true;
126
                }
127
 
128
                bool endElement(const QString&, const QString&, const QString&)
129
                {
130
                        return true;
131
                }
132
};
133
 
10887 cbradney 134
bool HelpBrowser::firstRun=true;
135
 
10108 cbradney 136
HelpBrowser::HelpBrowser(QWidget* parent)
137
        : QMainWindow( parent )
4519 subik 138
{
10108 cbradney 139
        setupUi(this);
140
}
141
 
142
HelpBrowser::HelpBrowser( QWidget* parent, const QString& /*caption*/, const QString& guiLanguage, const QString& jumpToSection, const QString& jumpToFile)
143
        : QMainWindow( parent )
144
{
10887 cbradney 145
        firstRun=true;
10108 cbradney 146
        setupUi(this);
13530 pierre 147
        helpNav = new HelpNavigation(this);
18204 fschmid 148
#if defined(Q_OS_MAC) && defined(HELP_NAV_AS_DRAWER)
13530 pierre 149
        // TODO
150
#else
151
        QDockWidget * dckw = new QDockWidget(tr("Navigation"),this);
152
        dckw->setWidget(helpNav);
153
        addDockWidget(Qt::LeftDockWidgetArea, dckw);
154
#endif
155
        progressBar = new QProgressBar(this);
156
        progressBar->setRange(0,100);
157
        statusBar()->addPermanentWidget(progressBar);
158
 
10108 cbradney 159
        setupLocalUI();
160
        language = guiLanguage.isEmpty() ? QString("en") : guiLanguage.left(2);
10676 cbradney 161
        finalBaseDir = ScPaths::instance().docDir() + "en/"; //Sane default for help location
10108 cbradney 162
        menuModel=NULL;
163
        loadMenu();
10676 cbradney 164
        if (menuModel!=NULL)
165
        {
166
                readBookmarks();
167
                readHistory();
168
                jumpToHelpSection(jumpToSection, jumpToFile );
169
                languageChange();
170
        }
171
        else
172
        {
173
                displayNoHelp();
174
        }
10108 cbradney 175
}
176
 
177
HelpBrowser::~HelpBrowser()
178
{
10887 cbradney 179
        firstRun=true;
10108 cbradney 180
}
181
 
182
void HelpBrowser::closeEvent(QCloseEvent * event)
183
{
184
        delete menuModel;
185
 
186
        // no need to delete child widgets, Qt does it all for us
187
        // bookmarks
188
        QFile bookFile(bookmarkFile());
189
        if (bookFile.open(QIODevice::WriteOnly))
4519 subik 190
        {
10108 cbradney 191
                QTextStream stream(&bookFile);
192
                stream.setCodec("UTF-8");
193
                stream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
194
                stream << "<bookmarks>\n";
13530 pierre 195
                QTreeWidgetItemIterator it(helpNav->bookmarksView);
10108 cbradney 196
                while (*it)
197
                {
198
                        if (bookmarkIndex.contains((*it)->text(0)))
199
                        {
200
                                QString pagetitle(bookmarkIndex.value((*it)->text(0)).first);
201
                                QString filename(bookmarkIndex.value((*it)->text(0)).second);
202
                                stream << "\t<item title=\"" << (*it)->text(0) << "\" pagetitle=\"" << pagetitle << "\" url=\"" << filename << "\" />\n";
203
                        }
204
                        ++it;
205
                }
206
                stream << "</bookmarks>\n";
207
                bookFile.close();
4519 subik 208
        }
10108 cbradney 209
        // history
210
        QFile histFile(historyFile());
211
        if (histFile.open(QIODevice::WriteOnly))
212
        {
213
                QTextStream stream(&histFile);
214
                stream.setCodec("UTF-8");
215
                stream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
216
                stream << "<history>\n";
217
                for (QMap<QAction*,histd2>::Iterator it = mHistory.begin() ; it != mHistory.end(); ++it)
10427 cbradney 218
                        stream << "\t<item title=\"" << it.value().title << "\" url=\"" << it.value().url << "\" />\n";
10108 cbradney 219
                stream << "</history>\n";
220
                histFile.close();
221
        }
222
        // size
223
        prefs->set("xsize", width());
224
        prefs->set("ysize", height());
225
 
226
        emit closed();
4519 subik 227
}
2052 subik 228
 
10108 cbradney 229
void HelpBrowser::setupLocalUI()
4676 cbradney 230
{
10511 fschmid 231
        setWindowIcon(loadIcon("AppIcon.png"));
10108 cbradney 232
        //Add Menus
10295 cbradney 233
        fileMenu=menuBar()->addMenu("");
234
        editMenu=menuBar()->addMenu("");
235
        bookMenu=menuBar()->addMenu("");
10108 cbradney 236
        histMenu=new QMenu(this);
237
 
238
        //Add Menu items
10295 cbradney 239
        filePrint=fileMenu->addAction(loadIcon("16/document-print.png"), "", this, SLOT(print()), Qt::CTRL+Qt::Key_P);
10511 fschmid 240
        fileMenu->addSeparator();
17627 jghali 241
        fileExit=fileMenu->addAction(loadIcon("exit.png"), "", this, SLOT(close()), Qt::CTRL+Qt::Key_W);
10295 cbradney 242
        editFind=editMenu->addAction(loadIcon("find.png"), "", this, SLOT(find()), Qt::CTRL+Qt::Key_F);
243
        editFindNext=editMenu->addAction( "", this, SLOT(findNext()), Qt::Key_F3);
244
        editFindPrev=editMenu->addAction( "", this, SLOT(findPrevious()), Qt::SHIFT+Qt::Key_F3);
245
        bookAdd=bookMenu->addAction( "", this, SLOT(bookmarkButton_clicked()), Qt::CTRL+Qt::Key_D);
246
        bookDel=bookMenu->addAction( "", this, SLOT(deleteBookmarkButton_clicked()));
247
        bookDelAll=bookMenu->addAction( "", this, SLOT(deleteAllBookmarkButton_clicked()));
10108 cbradney 248
 
249
        //Add Toolbar items
250
        goHome=toolBar->addAction(loadIcon("16/go-home.png"), "", textBrowser, SLOT(home()));
13530 pierre 251
        goBack=toolBar->addAction(loadIcon("16/go-previous.png"), "", textBrowser, SLOT(back()));
10108 cbradney 252
        goFwd=toolBar->addAction(loadIcon("16/go-next.png"), "", textBrowser, SLOT(forward()));
253
        goBack->setMenu(histMenu);
254
 
13530 pierre 255
        helpNav->listView->header()->hide();
256
        helpNav->searchingView->header()->hide();
257
        helpNav->bookmarksView->header()->hide();
10108 cbradney 258
 
13530 pierre 259
//      splitter->setStretchFactor(splitter->indexOf(tabWidget), 0);
260
//      splitter->setStretchFactor(splitter->indexOf(textBrowser), 1);
10108 cbradney 261
        // reset previous size
262
        prefs = PrefsManager::instance()->prefsFile->getPluginContext("helpbrowser");
263
        int xsize = prefs->getUInt("xsize", 640);
264
        int ysize = prefs->getUInt("ysize", 480);
265
        resize(QSize(xsize, ysize).expandedTo(minimumSizeHint()) );
266
 
267
        //basic ui
268
        connect(histMenu, SIGNAL(triggered(QAction*)), this, SLOT(histChosen(QAction*)));
269
        // searching
13530 pierre 270
        connect(helpNav->searchingEdit, SIGNAL(returnPressed()), this, SLOT(searchingButton_clicked()));
271
        connect(helpNav->searchingButton, SIGNAL(clicked()), this, SLOT(searchingButton_clicked()));
272
        connect(helpNav->searchingView, SIGNAL(itemClicked( QTreeWidgetItem *, int)), this, SLOT(itemSearchSelected(QTreeWidgetItem *, int)));
10108 cbradney 273
        // bookmarks
13530 pierre 274
        connect(helpNav->bookmarkButton, SIGNAL(clicked()), this, SLOT(bookmarkButton_clicked()));
275
        connect(helpNav->deleteBookmarkButton, SIGNAL(clicked()), this, SLOT(deleteBookmarkButton_clicked()));
276
        connect(helpNav->deleteAllBookmarkButton, SIGNAL(clicked()), this, SLOT(deleteAllBookmarkButton_clicked()));
277
        connect(helpNav->bookmarksView, SIGNAL(itemClicked( QTreeWidgetItem *, int)), this, SLOT(itemBookmarkSelected(QTreeWidgetItem *, int)));
10120 fschmid 278
        // links hoover
13530 pierre 279
//      connect(textBrowser, SIGNAL(overLink(const QString &)), this, SLOT(showLinkContents(const QString &)));
280
 
281
        // status bar
282
        connect( textBrowser, SIGNAL(statusBarMessage(QString)), this->statusBar(), SLOT(showMessage(QString)));
283
        connect(textBrowser,SIGNAL(loadStarted()), this, SLOT(loadStart()));
284
        connect(textBrowser,SIGNAL(loadProgress(int)), this, SLOT(loadProcess(int)));
285
        connect(textBrowser,SIGNAL(loadFinished(bool)), this, SLOT(loadEnd(bool)));
10295 cbradney 286
 
287
        languageChange();
4676 cbradney 288
}
289
 
13530 pierre 290
//void HelpBrowser::showLinkContents(const QString &link)
291
//{
292
//      statusBar()->showMessage(link);
293
//}
294
 
295
void HelpBrowser::loadStart()
10120 fschmid 296
{
13530 pierre 297
        progressBar->setValue(0);
298
        progressBar->setVisible(true);
10120 fschmid 299
}
300
 
13530 pierre 301
void HelpBrowser::loadProcess(int p)
302
{
303
        progressBar->setValue(p);
304
}
305
 
306
void HelpBrowser::loadEnd(bool e)
307
{
308
        progressBar->setVisible(false);
309
        if(e)
310
                statusBar()->showMessage( textBrowser->title() );
311
        else
312
                statusBar()->showMessage( tr("Loading Failed") );
313
}
314
 
10859 cbradney 315
void HelpBrowser::changeEvent(QEvent *e)
316
{
317
        if (e->type() == QEvent::LanguageChange)
318
        {
319
                languageChange();
320
        }
10903 cbradney 321
        else
322
                QWidget::changeEvent(e);
10859 cbradney 323
}
324
 
10108 cbradney 325
void HelpBrowser::languageChange()
4676 cbradney 326
{
10495 cbradney 327
        setWindowTitle( tr( "Scribus Online Help" ) );
10295 cbradney 328
 
329
        fileMenu->setTitle(tr("&File"));
330
        editMenu->setTitle(tr("&Edit"));
331
        bookMenu->setTitle(tr("&Bookmarks"));
332
 
333
        filePrint->setText(tr("&Print..."));
334
        fileExit->setText(tr("&Quit"));
335
        editFind->setText(tr("&Find..."));
336
        editFindNext->setText(tr("Find &Next"));
337
        editFindPrev->setText(tr("Find &Previous"));
338
        bookAdd->setText(tr("&Add Bookmark"));
339
        bookDel->setText(tr("&Delete"));
340
        bookDelAll->setText(tr("D&elete All"));
341
        Ui::HelpBrowser::retranslateUi(this);
10887 cbradney 342
        if (!firstRun)
10301 cbradney 343
        {
13530 pierre 344
                QString fname(QDir::cleanPath(textBrowser->url().toLocalFile()));
10301 cbradney 345
                QFileInfo fi(fname);
346
                QString filename(fi.fileName());
10369 cbradney 347
                if (ScCore->getGuiLanguage().isEmpty())
10301 cbradney 348
                        language="en";
349
                else
10369 cbradney 350
                        language=ScCore->getGuiLanguage();
10301 cbradney 351
                loadMenu();
10676 cbradney 352
                if (menuModel!=NULL)
353
                        loadHelp(finalBaseDir + "/" + filename);
10301 cbradney 354
        }
355
        else
10887 cbradney 356
                firstRun=false;
10108 cbradney 357
}
358
 
359
void HelpBrowser::print()
6584 fschmid 360
{
10108 cbradney 361
        QPrinter printer;
362
        printer.setFullPage(true);
10511 fschmid 363
        QPrintDialog dialog(&printer, this);
364
        if (dialog.exec())
365
                textBrowser->print(&printer);
6584 fschmid 366
}
367
 
10108 cbradney 368
void HelpBrowser::searchingButton_clicked()
3 paul 369
{
10108 cbradney 370
        // root files
14682 fschmid 371
        helpNav->searchingView->clear();
12658 fschmid 372
        QApplication::changeOverrideCursor(QCursor(Qt::WaitCursor));
10676 cbradney 373
        searchingInDirectory(finalBaseDir);
12658 fschmid 374
        QApplication::changeOverrideCursor(Qt::ArrowCursor);
10108 cbradney 375
}
3 paul 376
 
10108 cbradney 377
void HelpBrowser::searchingInDirectory(const QString& aDir)
378
{
16577 craig 379
        QDir dir(QDir::toNativeSeparators(aDir + "/"));
10511 fschmid 380
        QStringList in;
381
        in.append("*.html");
382
        QStringList lst = dir.entryList(in);
10108 cbradney 383
        for (QStringList::Iterator it = lst.begin(); it != lst.end(); ++it)
384
        {
10676 cbradney 385
                QString fname(aDir + "/" + (*it));
10108 cbradney 386
                QFile f(fname);
387
                if (f.open(QIODevice::ReadOnly))
388
                {
389
                        QTextStream stream(&f);
390
                        QString str = stream.readAll();
13530 pierre 391
                        int cnt = str.count(helpNav->searchingEdit->text(), Qt::CaseInsensitive);
10108 cbradney 392
                        if (cnt > 0)
393
                        {
394
                                QString fullname = fname;
10676 cbradney 395
                                QString toFind(fname.remove(finalBaseDir + "/"));
10108 cbradney 396
                                QMapIterator<QString, QString> i(quickHelpIndex);
10676 cbradney 397
                                while (i.hasNext())
10108 cbradney 398
                                {
399
                                        i.next();
400
                                        if (i.value()==toFind)
13530 pierre 401
                                                helpNav->searchingView->addTopLevelItem(new QTreeWidgetItem(helpNav->searchingView, QStringList() << i.key()));
10108 cbradney 402
                                }
403
                        }
404
                        f.close();
405
                }
406
        }
407
        // get dirs - ugly recursion
10511 fschmid 408
        in.clear();
409
        in.append("*");
410
        QStringList dst = dir.entryList(in, QDir::Dirs);
10108 cbradney 411
        for (QStringList::Iterator it = dst.begin(); it != dst.end(); ++it)
412
                if ((*it)!="." && (*it)!="..")
16577 craig 413
                        searchingInDirectory(QDir::toNativeSeparators(aDir + QString((*it)) + "/"));
10108 cbradney 414
}
3 paul 415
 
10108 cbradney 416
void HelpBrowser::find()
417
{
10511 fschmid 418
        findText = QInputDialog::getText( this, tr("Find"), tr("Search Term:"), QLineEdit::Normal, findText, 0);
10108 cbradney 419
        if (findText.isNull())
420
                return;
421
        findNext();
422
}
3 paul 423
 
10108 cbradney 424
void HelpBrowser::findNext()
425
{
426
        if (findText.isNull())
427
        {
428
                find();
429
                return;
430
        }
431
        // find it. finally
432
        textBrowser->find(findText, 0);
560 cbradney 433
}
434
 
10108 cbradney 435
void HelpBrowser::findPrevious()
560 cbradney 436
{
10108 cbradney 437
        if (findText.isNull())
2048 subik 438
        {
10108 cbradney 439
                find();
440
                return;
2048 subik 441
        }
10108 cbradney 442
        // find it. finally
443
        textBrowser->find(findText);
444
}
445
 
446
void HelpBrowser::bookmarkButton_clicked()
447
{
13530 pierre 448
        QString title = textBrowser->title();
449
        QString fname(QDir::cleanPath(textBrowser->url().toLocalFile()));
10511 fschmid 450
        title = QInputDialog::getText(this, tr("New Bookmark"), tr("New Bookmark's Title:"), QLineEdit::Normal, title, 0);
10108 cbradney 451
        // user cancel
452
        if (title.isNull())
453
                return;
10676 cbradney 454
        //TODO: start storing full paths
16577 craig 455
        QString toFind(fname.remove(QDir::toNativeSeparators(finalBaseDir)));
10676 cbradney 456
        toFind=toFind.mid(1, toFind.length()-1);
10108 cbradney 457
        QMapIterator<QString, QString> i(quickHelpIndex);
10301 cbradney 458
        while (i.hasNext())
2052 subik 459
        {
10108 cbradney 460
                i.next();
461
                if (i.value()==toFind)
462
                {
463
                        bookmarkIndex.insert(title, qMakePair(i.key(), i.value()));
13530 pierre 464
                        helpNav->bookmarksView->addTopLevelItem(new QTreeWidgetItem(helpNav->bookmarksView, QStringList() << title));
10108 cbradney 465
                }
2052 subik 466
        }
560 cbradney 467
}
468
 
10108 cbradney 469
void HelpBrowser::deleteBookmarkButton_clicked()
560 cbradney 470
{
13530 pierre 471
        QTreeWidgetItem *twi=helpNav->bookmarksView->currentItem();
10676 cbradney 472
        if (twi!=NULL)
473
        {
474
                if (bookmarkIndex.contains(twi->text(0)))
475
                        bookmarkIndex.remove(twi->text(0));
476
                delete twi;
477
        }
10108 cbradney 478
}
560 cbradney 479
 
10108 cbradney 480
void HelpBrowser::deleteAllBookmarkButton_clicked()
481
{
482
        bookmarkIndex.clear();
13530 pierre 483
        helpNav->bookmarksView->clear();
560 cbradney 484
}
485
 
10108 cbradney 486
void HelpBrowser::histChosen(QAction* i)
560 cbradney 487
{
564 cbradney 488
        if (mHistory.contains(i))
13530 pierre 489
                textBrowser->setUrl( QUrl::fromLocalFile(mHistory[i].url) );
560 cbradney 490
}
491
 
16180 craig 492
void HelpBrowser::jumpToHelpSection(const QString& jumpToSection, const QString& jumpToFile, bool dontChangeIfAlreadyLoaded)
560 cbradney 493
{
494
        QString toLoad;
1141 cbradney 495
        bool noDocs=false;
2877 cbradney 496
        if (jumpToFile.isEmpty())
564 cbradney 497
        {
10676 cbradney 498
                toLoad = finalBaseDir + "/"; //clean this later to handle 5 char locales
2877 cbradney 499
                if (jumpToSection.isEmpty())
564 cbradney 500
                {
10135 cbradney 501
                        QModelIndex index=menuModel->index(0,1);
10108 cbradney 502
                        if (index.isValid())
1141 cbradney 503
                        {
13530 pierre 504
                                helpNav->listView->selectionModel()->select(index, QItemSelectionModel::ClearAndSelect);
10135 cbradney 505
                                toLoad += menuModel->data(index, Qt::DisplayRole).toString();
1141 cbradney 506
                        }
507
                        else
508
                                noDocs=true;
205 Franz 509
                }
2006 subik 510
                else if (jumpToSection=="scripter")
564 cbradney 511
                {
10165 cbradney 512
                        toLoad+="scripter1.html";
560 cbradney 513
                }
205 Franz 514
        }
560 cbradney 515
        else
16180 craig 516
        {
517
                toLoad=ScPaths::instance().docDir() + language + "/" + jumpToFile;
518
        }
1141 cbradney 519
        if (!noDocs)
520
                loadHelp(toLoad);
521
        else
16180 craig 522
                if (!dontChangeIfAlreadyLoaded)
523
                        displayNoHelp();
3 paul 524
}
10676 cbradney 525
 
10108 cbradney 526
void HelpBrowser::loadHelp(const QString& filename)
68 Franz 527
{
10108 cbradney 528
        struct histd2 his;
564 cbradney 529
        bool Avail = true;
560 cbradney 530
        QString toLoad;
564 cbradney 531
        QFileInfo fi;
532
        fi = QFileInfo(filename);
1100 cbradney 533
        if (fi.fileName().length()>0)
564 cbradney 534
        {
1100 cbradney 535
                if (fi.exists())
536
                        toLoad=filename;
2006 subik 537
                else
564 cbradney 538
                {
16577 craig 539
                        toLoad = QDir::toNativeSeparators(ScPaths::instance().docDir() + "en/index.html");
11811 cbradney 540
//                      language="en";
1100 cbradney 541
                        fi = QFileInfo(toLoad);
542
                        if (!fi.exists())
543
                        {
10676 cbradney 544
                                displayNoHelp();
1100 cbradney 545
                                Avail = false;
546
                        }
564 cbradney 547
                }
548
        }
2006 subik 549
        else
1100 cbradney 550
                Avail=false;
2006 subik 551
        if (Avail)
564 cbradney 552
        {
13530 pierre 553
                textBrowser->setUrl( QUrl::fromLocalFile(toLoad) );
10660 cbradney 554
 
13530 pierre 555
                his.title = textBrowser->title();
2877 cbradney 556
                if (his.title.isEmpty())
2052 subik 557
                        his.title = toLoad;
558
                his.url = toLoad;
10108 cbradney 559
                mHistory[histMenu->addAction(his.title)] = his;
564 cbradney 560
        }
2052 subik 561
        if (mHistory.count() > 15)
562
        {
10108 cbradney 563
                QAction* first=histMenu->actions().first();
564
                mHistory.remove(first);
565
                histMenu->removeAction(first);
2052 subik 566
        }
560 cbradney 567
}
568
 
1092 cbradney 569
void HelpBrowser::loadMenu()
560 cbradney 570
{
10676 cbradney 571
        QString baseHelpDir = ScPaths::instance().docDir();
572
        QString altHelpDir  = ScPaths::instance().getApplicationDataDir();
16577 craig 573
        QString baseHelpMenuFile = QDir::toNativeSeparators(baseHelpDir + language + "/menu.xml");
574
        QString altHelpMenuFile = QDir::toNativeSeparators(altHelpDir + "doc/" + language + "/menu.xml");
10676 cbradney 575
        QFileInfo baseFi = QFileInfo(baseHelpMenuFile);
576
        QFileInfo altFi = QFileInfo(altHelpMenuFile);
577
        QString toLoad = baseHelpMenuFile;
578
        if (!baseFi.exists())
793 cbradney 579
        {
10676 cbradney 580
                if (altFi.exists())
10312 cbradney 581
                {
10676 cbradney 582
                        toLoad=altHelpMenuFile;
583
                        baseFi=altFi;
584
                }
585
                else           
586
                {
587
                        if (!language.isEmpty())
588
                        {
589
                                //Check if we can load, eg "de" when "de_CH" docs dont exist
16577 craig 590
                                QString baseHelpMenuFile3 = QDir::toNativeSeparators(baseHelpDir + language.left(2) + "/menu.xml");
591
                                QString altHelpMenuFile3 = QDir::toNativeSeparators(altHelpDir + "doc/" + language.left(2) + "/menu.xml");
10676 cbradney 592
                                QFileInfo fi3 = QFileInfo(baseHelpMenuFile3);
593
                                QFileInfo altfi3 = QFileInfo(altHelpMenuFile3);
594
                                if (fi3.exists())
595
                                {
596
                                        language=language.left(2);
16577 craig 597
                                        toLoad = QDir::toNativeSeparators(baseHelpMenuFile3);
10676 cbradney 598
                                }
599
                                else
600
                                if (altfi3.exists())
601
                                {
602
                                        language=language.left(2);
16577 craig 603
                                        toLoad = QDir::toNativeSeparators(altHelpMenuFile3);
10676 cbradney 604
                                }
605
                                else
606
                                {
607
                                        //Fall back to English
608
                                        sDebug("Scribus help in your selected language does not exist, trying English. Otherwise, please visit http://docs.scribus.net.");
609
                                        language="en";
16577 craig 610
                                        toLoad = QDir::toNativeSeparators(baseHelpDir + language + "/menu.xml");
10676 cbradney 611
                                }
612
                        }
10312 cbradney 613
                        else
614
                        {
615
                                language="en";
16577 craig 616
                                toLoad = QDir::toNativeSeparators(baseHelpDir + language + "/menu.xml");
10312 cbradney 617
                        }
10676 cbradney 618
                        baseFi = QFileInfo(toLoad);
10312 cbradney 619
                }
786 cbradney 620
        }
10676 cbradney 621
        //Set our final location for loading the help files
622
        finalBaseDir=baseFi.path();
623
        if (baseFi.exists())
564 cbradney 624
        {
10108 cbradney 625
                if (menuModel!=NULL)
626
                        delete menuModel;
627
                menuModel=new ScHelpTreeModel(toLoad, "Topic", "Location", &quickHelpIndex);
10676 cbradney 628
 
13530 pierre 629
                helpNav->listView->setModel(menuModel);
630
                helpNav->listView->setSelectionMode(QAbstractItemView::SingleSelection);
10676 cbradney 631
                QItemSelectionModel *selectionModel = new QItemSelectionModel(menuModel);
13530 pierre 632
                helpNav->listView->setSelectionModel(selectionModel);
633
                connect(helpNav->listView->selectionModel(), SIGNAL(selectionChanged( const QItemSelection &, const QItemSelection &)), this, SLOT(itemSelected( const QItemSelection &, const QItemSelection &)));
10676 cbradney 634
 
13530 pierre 635
                helpNav->listView->setColumnHidden(1,true);
10108 cbradney 636
        }
10676 cbradney 637
        else
638
                menuModel=NULL;
68 Franz 639
}
640
 
10108 cbradney 641
void HelpBrowser::readBookmarks()
68 Franz 642
{
10108 cbradney 643
        BookmarkParser2 handler;
13530 pierre 644
        handler.view = helpNav->bookmarksView;
10108 cbradney 645
        handler.quickHelpIndex=&quickHelpIndex;
646
        handler.bookmarkIndex=&bookmarkIndex;
647
        QFile xmlFile(bookmarkFile());
10511 fschmid 648
        QXmlInputSource source(&xmlFile);
10108 cbradney 649
        QXmlSimpleReader reader;
650
        reader.setContentHandler(&handler);
651
        reader.parse(source);
68 Franz 652
}
2006 subik 653
 
10108 cbradney 654
void HelpBrowser::readHistory()
2006 subik 655
{
10108 cbradney 656
        HistoryParser2 handler;
657
        handler.helpBrowser = this;
658
        QFile xmlFile(historyFile());
10511 fschmid 659
        QXmlInputSource source(&xmlFile);
10108 cbradney 660
        QXmlSimpleReader reader;
661
        reader.setContentHandler(&handler);
662
        reader.parse(source);
2006 subik 663
}
664
 
10108 cbradney 665
void HelpBrowser::setText(const QString& str)
4905 subik 666
{
13530 pierre 667
        textBrowser->setSimpleText(str);
4905 subik 668
}
669
 
10108 cbradney 670
void HelpBrowser::itemSelected(const QItemSelection & selected, const QItemSelection & deselected)
671
{
672
        Q_UNUSED(deselected);
4905 subik 673
 
10108 cbradney 674
        QModelIndex index;
675
        QModelIndexList items = selected.indexes();
676
        int i=0;
677
        foreach (index, items)
2006 subik 678
        {
10108 cbradney 679
                if (i==1) // skip 0, as this is always the rootitem, even if we are selecting the rootitem. hmm
2006 subik 680
                {
10108 cbradney 681
                        QString filename(menuModel->data(index, Qt::DisplayRole).toString());
682
                        if (!filename.isEmpty())
2006 subik 683
                        {
10676 cbradney 684
                                loadHelp(finalBaseDir + "/" + filename);
2006 subik 685
                        }
686
                }
10108 cbradney 687
                ++i;
2006 subik 688
        }
689
}
690
 
10108 cbradney 691
void HelpBrowser::itemSearchSelected(QTreeWidgetItem *twi, int i)
2006 subik 692
{
10108 cbradney 693
        Q_UNUSED(i);
694
        if (!twi)
695
                return;
696
        if (quickHelpIndex.contains(twi->text(0)))
697
        {
698
                QString filename(quickHelpIndex.value(twi->text(0)));
699
                if (!filename.isEmpty())
700
                {
10676 cbradney 701
                        loadHelp(finalBaseDir + "/" + filename);
13530 pierre 702
                        findText = helpNav->searchingEdit->text();
10108 cbradney 703
                        findNext();
704
                }
705
        }
2006 subik 706
}
707
 
10108 cbradney 708
void HelpBrowser::itemBookmarkSelected(QTreeWidgetItem *twi, int i)
2006 subik 709
{
10108 cbradney 710
        Q_UNUSED(i);
711
        if (!twi)
2006 subik 712
                return;
10108 cbradney 713
        if (bookmarkIndex.contains(twi->text(0)))
2006 subik 714
        {
10108 cbradney 715
                QString filename(bookmarkIndex.value(twi->text(0)).second);
716
                if (!filename.isEmpty())
10676 cbradney 717
                        loadHelp(finalBaseDir + "/" + filename);
2006 subik 718
        }
719
}
2023 subik 720
 
10108 cbradney 721
/*! \brief Returns the name of the cfg file for bookmarks.
722
A helper function.
723
\author Petr Vanek <petr@yarpen.cz>
724
*/
725
QString HelpBrowser::bookmarkFile()
2023 subik 726
{
10108 cbradney 727
        QString appDataDir(ScPaths::getApplicationDataDir());
728
        QString fname(appDataDir + "doc/bookmarks.xml");
729
        if (!QFile::exists(fname))
2023 subik 730
        {
16577 craig 731
                QDir d(QDir::toNativeSeparators(appDataDir));
10108 cbradney 732
                d.mkdir("doc");
2023 subik 733
        }
10108 cbradney 734
        return fname;
2023 subik 735
}
736
 
737
 
10108 cbradney 738
/*! \brief Returns the name of the cfg file for persistent history.
739
A helper function.
740
\author Petr Vanek <petr@yarpen.cz>
741
*/
742
QString HelpBrowser::historyFile()
2048 subik 743
{
10108 cbradney 744
        QString appDataDir(ScPaths::getApplicationDataDir());
745
        QString fname(appDataDir + "doc/history.xml");
746
        if (!QFile::exists(fname))
747
        {
16577 craig 748
                QDir d(QDir::toNativeSeparators(appDataDir));
10108 cbradney 749
                d.mkdir("doc");
750
        }
751
        return fname;
2048 subik 752
}
10676 cbradney 753
 
754
void HelpBrowser::displayNoHelp()
755
{
756
        QString noHelpMsg=tr("<h2><p>Sorry, no manual is installed!</p><p>Please see:</p><ul><li>http://docs.scribus.net for updated documentation</li><li>http://www.scribus.net for downloads</li></ul></h2>",
757
                                                 "HTML message for no documentation available to show");
758
 
13530 pierre 759
        textBrowser->setSimpleText(noHelpMsg);
10676 cbradney 760
 
761
        filePrint->setEnabled(false);
762
        editFind->setEnabled(false);
763
        editFindNext->setEnabled(false);
764
        editFindPrev->setEnabled(false);
765
        bookAdd->setEnabled(false);
766
        bookDel->setEnabled(false);
767
        bookDelAll->setEnabled(false);
768
        goHome->setEnabled(false);
769
        goBack->setEnabled(false);
770
        goFwd->setEnabled(false);
771
 
772
        histMenu->disconnect();
13530 pierre 773
        helpNav->searchingEdit->disconnect();
774
        helpNav->searchingButton->disconnect();
775
        helpNav->searchingView->disconnect();
776
        helpNav->bookmarkButton->disconnect();
777
        helpNav->deleteBookmarkButton->disconnect();
778
        helpNav->deleteAllBookmarkButton->disconnect();
779
        helpNav->bookmarksView->disconnect();
10676 cbradney 780
        textBrowser->disconnect();
781
}