Subversion Repositories Scribus

Rev

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