Subversion Repositories Scribus

Rev

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