Subversion Repositories Scribus

Rev

Rev 9163 | 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.,                                       *
26
*   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
27
***************************************************************************/
560 cbradney 28
 
3 paul 29
#include "helpbrowser.h"
30
#include "helpbrowser.moc"
560 cbradney 31
 
3 paul 32
#include <qvariant.h>
2052 subik 33
#include <qstring.h>
560 cbradney 34
#include <qpushbutton.h>
35
#include <qtabwidget.h>
36
#include <qwidget.h>
37
#include <qheader.h>
38
#include <qtextbrowser.h>
39
#include <qlayout.h>
3 paul 40
#include <qtooltip.h>
560 cbradney 41
#include <qtoolbutton.h>
42
#include <qwhatsthis.h>
3 paul 43
#include <qimage.h>
560 cbradney 44
#include <qfileinfo.h>
5418 cbradney 45
#include <qfiledialog.h>
3 paul 46
#include <qtextcodec.h>
560 cbradney 47
#include <qdom.h>
1033 cbradney 48
#include <qdir.h>
786 cbradney 49
#include <qsplitter.h>
1144 cbradney 50
#include <qmime.h>
2006 subik 51
#include <qlabel.h>
52
#include <qlineedit.h>
5418 cbradney 53
#include <qmessagebox.h>
2006 subik 54
#include <qaccel.h>
55
#include <qinputdialog.h>
2023 subik 56
#include <qmenubar.h>
5418 cbradney 57
#include <qpixmap.h>
58
#include <qprocess.h>
2023 subik 59
#include <qpopupmenu.h>
60
#include <qprinter.h>
61
#include <qpainter.h>
62
#include <qpaintdevicemetrics.h>
63
#include <qsimplerichtext.h>
2048 subik 64
#include <qxml.h>
6584 fschmid 65
#include <qcursor.h>
128 Franz 66
 
1693 craig 67
#include "scpaths.h"
3240 fschmid 68
#include "util.h"
2688 craig 69
#include "scconfig.h"
5917 jghali 70
#include "scpaths.h"
4519 subik 71
#include "prefsmanager.h"
72
#include "prefsfile.h"
128 Franz 73
 
4676 cbradney 74
#if defined(_WIN32)
75
#include <windows.h>
76
#include <shellapi.h>
77
#endif
78
 
3 paul 79
extern QPixmap loadIcon(QString nam);
80
 
560 cbradney 81
 
2048 subik 82
/*! \brief Returns the name of the cfg file for bookmarks.
2052 subik 83
A helper function.
2048 subik 84
\author Petr Vanek <petr@yarpen.cz>
85
*/
86
QString bookmarkFile()
87
{
5917 jghali 88
        QString appDataDir(ScPaths::getApplicationDataDir());
89
        QString fname(appDataDir + "doc/bookmarks.xml");
90
        if (!QFile::exists(fname))
2048 subik 91
        {
5917 jghali 92
                QDir d(QDir::convertSeparators(appDataDir));
2048 subik 93
                d.mkdir("doc");
94
        }
2052 subik 95
        return fname;
2048 subik 96
}
97
 
98
 
2052 subik 99
/*! \brief Returns the name of the cfg file for persistent history.
100
A helper function.
101
\author Petr Vanek <petr@yarpen.cz>
102
*/
103
QString historyFile()
104
{
5917 jghali 105
        QString appDataDir(ScPaths::getApplicationDataDir());
106
        QString fname(appDataDir + "doc/history.xml");
107
        if (!QFile::exists(fname))
2052 subik 108
        {
5917 jghali 109
                QDir d(QDir::convertSeparators(appDataDir));
2052 subik 110
                d.mkdir("doc");
111
        }
112
        return fname;
113
}
114
 
115
 
2048 subik 116
/*! \brief XML parsef for documantation bookmarks.
117
This is small helper class which reads saved bookmarks configuration
118
from ~/.scribus/doc/bookmarks.xml file.
2052 subik 119
The reference to QListView *view is a reference to the list view with bookmarks
2048 subik 120
\author Petr Vanek <petr@yarpen.cz>
121
*/
122
class BookmarkParser : public QXmlDefaultHandler
123
{
124
        public:
125
                QListView* view;
126
 
127
                bool startDocument()
128
                {
129
                        return true;
130
                }
131
 
132
                bool startElement(const QString&, const QString&, const QString& qName, const QXmlAttributes& attrs)
133
                {
134
                        if (qName == "item")
135
                        {
136
                                QListViewItem *item = new QListViewItem(view, attrs.value(0), attrs.value(1));
137
                                view->insertItem(item);
138
                        }
139
                        return true;
140
                }
141
 
142
                bool endElement(const QString&, const QString&, const QString&)
143
                {
144
                        return true;
145
                }
146
};
147
 
2052 subik 148
/*! \brief XML parsef for documantation history.
149
This is small helper class which reads saved bookmarks configuration
150
from ~/.scribus/doc/history.xml file.
151
The reference to historyBrowser is a reference to the dialog.
152
\author Petr Vanek <petr@yarpen.cz>
153
*/
154
class HistoryParser : public QXmlDefaultHandler
155
{
156
        public:
157
                HelpBrowser *helpBrowser;
2048 subik 158
 
2052 subik 159
                bool startDocument()
160
                {
161
                        return true;
162
                }
163
 
164
                bool startElement(const QString&, const QString&, const QString& qName, const QXmlAttributes& attrs)
165
                {
166
                        if (qName == "item")
167
                        {
168
                                struct histd his;
169
                                his.title = attrs.value(0);
170
                                his.url = attrs.value(1);
171
                                helpBrowser->mHistory[helpBrowser->histMenu->insertItem(his.title)] = his;
172
                        }
173
                        return true;
174
                }
175
 
176
                bool endElement(const QString&, const QString&, const QString&)
177
                {
178
                        return true;
179
                }
180
};
181
 
4519 subik 182
int HelpListItem::compare(QListViewItem *i, int col, bool asc) const
183
{
184
        if (col == 1)
185
        {
186
                int d = text(col).toInt() - i->text(col).toInt();
187
                if (d > 0)
188
                        return 1;
189
                return -1;
190
        }
191
        else
192
                return QListViewItem::compare(i, col, asc);
193
}
2052 subik 194
 
4676 cbradney 195
TextBrowser::TextBrowser(QWidget * parent, const char * name) : QTextBrowser(parent, name)
196
{
6584 fschmid 197
        connect(this, SIGNAL(highlighted(const QString &)), this, SLOT(overLink(const QString &)));
4676 cbradney 198
}
199
 
200
void TextBrowser::setSource(const QString &name)
201
{
202
#if defined(_WIN32)
203
        int index = name.find( "http:/" );
204
        if ( index >=0 )
205
        {
206
                QString url = name.right(name.length() - index);
207
                //textBrowser->setSource( textBrowser->source() );
208
                QT_WA( {
209
                ShellExecute( winId(), 0, (TCHAR*)url.ucs2(), 0, 0, SW_SHOWNORMAL );
210
            } , {
211
                ShellExecuteA( winId(), 0, url.local8Bit(), 0, 0, SW_SHOWNORMAL );
212
            } );
213
                return;
214
        }
215
#endif
5418 cbradney 216
#if !defined(QT_MAC) && !defined(_WIN32)
217
        if (name.left(7)=="http://")
218
        {
219
                QString extBrowser=PrefsManager::instance()->extBrowserExecutable();
220
                QFileInfo fi(extBrowser);
221
                if (extBrowser.isEmpty() || !fi.exists())
222
                {
223
                        extBrowser = QFileDialog::getOpenFileName(QString::null, QString::null, this, "changeExtBrowser", tr("Locate your web browser"));
224
                        if (!QFileInfo(extBrowser).exists())
225
                                extBrowser="";
226
                        PrefsManager::instance()->setExtBrowserExecutable(extBrowser);
227
                }              
228
                if (!extBrowser.isEmpty())
229
                {
230
                        QStringList args;
231
                        args.append(extBrowser);
232
                        args.append(name);
233
                        QProcess webProc(args);
234
                        if (!webProc.start())
235
                                QMessageBox::critical(this, tr("External Web Browser Failed to Start"), tr("Scribus was not able to start the external web browser application %1. Please check the setting in Preferences").arg(PrefsManager::instance()->extBrowserExecutable()), QMessageBox::Ok, QMessageBox::NoButton);
236
                }
237
        }
238
        else
239
                QTextBrowser::setSource(name);
240
#else
4676 cbradney 241
        QTextBrowser::setSource(name);
5418 cbradney 242
#endif
4676 cbradney 243
}
244
 
6584 fschmid 245
void TextBrowser::overLink(const QString &link)
246
{
247
        if ((link.isNull()) || (link.isEmpty()))
248
                qApp->setOverrideCursor(QCursor(ArrowCursor), true);
249
        else
250
                qApp->setOverrideCursor(QCursor(PointingHandCursor), true);
251
}
252
 
2006 subik 253
HelpBrowser::HelpBrowser( QWidget* parent, QString /*caption*/, QString guiLanguage, QString jumpToSection, QString jumpToFile)
3804 cbradney 254
        : QWidget( parent, "Help", WType_TopLevel | WDestructiveClose | WGroupLeader )
3 paul 255
{
560 cbradney 256
        QString fileName;
564 cbradney 257
        mHistory.clear();
258
        struct histd his;
2877 cbradney 259
        language = guiLanguage.isEmpty() ? QString("en") : guiLanguage.left(2);
2006 subik 260
        helpBrowsermainLayout = new QVBoxLayout( this);
564 cbradney 261
        buttonLayout = new QHBoxLayout;
262
        buttonLayout->setSpacing( 6 );
263
        buttonLayout->setMargin( 2 );
3 paul 264
 
564 cbradney 265
        homeButton = new QToolButton( this, "homeButton" );
266
        homeButton->setText( "" );
9157 cbradney 267
        homeButton->setPixmap(loadIcon("16/go-home.png"));
786 cbradney 268
        homeButton->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed, homeButton->sizePolicy().hasHeightForWidth() ) );
564 cbradney 269
        buttonLayout->addWidget( homeButton );
3 paul 270
 
564 cbradney 271
        histMenu = new QPopupMenu( this );
272
        backButton = new QToolButton( this, "backButton" );
9170 cbradney 273
        backButton->setPixmap(loadIcon("16/go-previous.png"));
786 cbradney 274
        backButton->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed, backButton->sizePolicy().hasHeightForWidth() ) );
564 cbradney 275
        backButton->setPopup(histMenu);
276
        backButton->setPopupDelay(0);
277
        buttonLayout->addWidget( backButton );
3 paul 278
 
564 cbradney 279
        forwButton = new QToolButton( this, "forwButton" );
9170 cbradney 280
        forwButton->setPixmap(loadIcon("16/go-next.png"));
786 cbradney 281
        forwButton->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed, forwButton->sizePolicy().hasHeightForWidth() ) );
564 cbradney 282
        buttonLayout->addWidget( forwButton );
283
        QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
284
        buttonLayout->addItem( spacer );
560 cbradney 285
        helpBrowsermainLayout->addLayout( buttonLayout );
286
 
2006 subik 287
        helpBrowserLayout = new QHBoxLayout;
786 cbradney 288
        splitter = new QSplitter(this, "splitter");
289
        splitter->setChildrenCollapsible( false );
290
        helpBrowserLayout->addWidget( splitter );
560 cbradney 291
 
786 cbradney 292
        tabWidget = new QTabWidget( splitter, "tabWidget" );
564 cbradney 293
        tabContents = new QWidget( tabWidget, "tabContents" );
2006 subik 294
        tabLayout = new QHBoxLayout( tabContents, 11, 6, "tabLayout");
560 cbradney 295
 
564 cbradney 296
        listView = new QListView( tabContents, "listView" );
297
        listView->addColumn( tr( "Contents" ) );
1097 cbradney 298
        listView->addColumn( tr( "Link" ) , 0 );
299
        listView->setColumnWidthMode( 0, QListView::Maximum );
300
        listView->setColumnWidthMode( 1, QListView::Manual );
5753 jghali 301
        listView->setSorting(-1,true);
560 cbradney 302
        listView->setRootIsDecorated( true );
303
        listView->setSelectionMode(QListView::Single);
304
        listView->setDefaultRenameAction(QListView::Reject);
305
        listView->clear();
564 cbradney 306
        tabLayout->addWidget( listView );
2006 subik 307
 
308
        tabWidget->insertTab( tabContents, tr("&Contents") );
560 cbradney 309
 
2006 subik 310
        // searching
311
        tabSearching = new QWidget(tabWidget, "tabSearching");
312
        searchingMainLayout = new QVBoxLayout(tabSearching, 11, 6, "searchingMainLayout");
313
        searchingButtonLayout = new QHBoxLayout;
314
        searchingEdit = new QLineEdit(tabSearching, "searchingEdit");
2397 cbradney 315
        searchingButton = new QPushButton( tr("&Search"), tabSearching, "searchingButton");
2006 subik 316
        searchingButtonLayout->addWidget(searchingEdit);
317
        searchingButtonLayout->addWidget(searchingButton);
318
        searchingMainLayout->addLayout(searchingButtonLayout);
319
        searchingView = new QListView(tabSearching, "searchingView");
6260 fschmid 320
        searchingView->addColumn( tr("Contents"));
321
        searchingView->addColumn( tr("Relevance"));
322
        searchingView->addColumn( tr("Link" ) ,0);
2006 subik 323
        searchingView->setColumnWidthMode( 0, QListView::Maximum );
324
        searchingView->setColumnWidthMode( 1, QListView::Manual );
4519 subik 325
        searchingView->setSorting(1, false);
2006 subik 326
        searchingView->setRootIsDecorated( true );
327
        searchingView->setSelectionMode(QListView::Single);
328
        searchingView->setDefaultRenameAction(QListView::Reject);
4519 subik 329
        searchingView->setAllColumnsShowFocus(true);
2006 subik 330
        searchingView->clear();
331
        searchingMainLayout->addWidget(searchingView);
2062 subik 332
        tabWidget->insertTab(tabSearching, tr("Se&arch"));
2006 subik 333
 
2048 subik 334
        // bookmarks
335
        tabBookmarks = new QWidget(tabWidget, "tabBookmarks");
336
        bookmarksMainLayout = new QVBoxLayout(tabBookmarks, 11, 6, "bookmarksMainLayout");
337
        bookmarksView = new QListView(tabBookmarks, "bookmarksView");
338
        bookmarksView->addColumn( tr( "Contents" ) );
339
        bookmarksView->addColumn( tr( "Link" ) , 0 );
340
        bookmarksView->setColumnWidthMode( 0, QListView::Maximum );
341
        bookmarksView->setColumnWidthMode( 1, QListView::Manual );
5753 jghali 342
        bookmarksView->setSorting(1, true);
2048 subik 343
        bookmarksView->setRootIsDecorated( true );
344
        bookmarksView->setSelectionMode(QListView::Single);
345
        bookmarksView->setDefaultRenameAction(QListView::Reject);
346
        bookmarksView->clear();
347
        bookmarksMainLayout->addWidget(bookmarksView);
348
        bookmarksButtonLayout = new QHBoxLayout;
2397 cbradney 349
        bookmarkButton = new QPushButton( tr("&New"), tabBookmarks, "bookmarkButton");
350
        deleteBookmarkButton = new QPushButton( tr("&Delete"), tabBookmarks, "deleteBookmarkButton");
351
        deleteAllBookmarkButton = new QPushButton( tr("De&lete All"), tabBookmarks, "deleteAllBookmarkButton");
2048 subik 352
        bookmarksButtonLayout->addWidget(bookmarkButton);
353
        bookmarksButtonLayout->addWidget(deleteBookmarkButton);
354
        bookmarksButtonLayout->addWidget(deleteAllBookmarkButton);
355
        bookmarksMainLayout->addLayout(bookmarksButtonLayout);
2062 subik 356
        tabWidget->insertTab(tabBookmarks, tr("Book&marks"));
2048 subik 357
 
4676 cbradney 358
        textBrowser = new TextBrowser( splitter, "textBrowser" );
2238 subik 359
        textBrowser->setSizePolicy( QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Maximum, false ) );
564 cbradney 360
        textBrowser->setFrameShape( QTextBrowser::StyledPanel );
1144 cbradney 361
        QMimeSourceFactory *textBrowserMSF=textBrowser->mimeSourceFactory();
362
        textBrowserMSF->setExtensionType("html", "text/html;charset=UTF-8");
564 cbradney 363
        helpBrowsermainLayout->addLayout( helpBrowserLayout );
560 cbradney 364
 
2023 subik 365
        // menus
366
        menuBar = new QMenuBar(this);
367
        QPopupMenu *fileMenu = new QPopupMenu(this);
9163 cbradney 368
        fileMenu->insertItem(loadIcon("16/document-print.png"), tr("&Print..."), this, SLOT(print()), CTRL+Key_P);
2023 subik 369
        fileMenu->insertSeparator();
370
        fileMenu->insertItem(loadIcon("exit.png"), tr("E&xit"), this, SLOT(close()));
3360 cbradney 371
        menuBar->insertItem( tr("&File"), fileMenu);
2023 subik 372
        QPopupMenu *editMenu = new QPopupMenu(this);
3360 cbradney 373
        editMenu->insertItem(loadIcon("find.png"), tr("&Find..."), this, SLOT(find()), CTRL+Key_F);
374
        editMenu->insertItem( tr("Find &Next"), this, SLOT(findNext()), Key_F3);
375
        editMenu->insertItem( tr("Find &Previous"), this, SLOT(findPrevious()), SHIFT+Key_F3);
376
        menuBar->insertItem( tr("&Edit"), editMenu);
2048 subik 377
        QPopupMenu *bookmarkMenu = new QPopupMenu(this);
3360 cbradney 378
        bookmarkMenu->insertItem( tr("&Add Bookmark"), this, SLOT(bookmarkButton_clicked()), CTRL+Key_D);
379
        bookmarkMenu->insertItem( tr("&Delete"), this, SLOT(deleteBookmarkButton_clicked()));
380
        bookmarkMenu->insertItem( tr("D&elete All"), this, SLOT(deleteAllBookmarkButton_clicked()));
2023 subik 381
        helpBrowsermainLayout->setMenuBar(menuBar);
3360 cbradney 382
        menuBar->insertItem( tr("&Bookmarks"), bookmarkMenu);
564 cbradney 383
        languageChange();
1092 cbradney 384
        loadMenu();
560 cbradney 385
        listView->header()->hide();
2006 subik 386
        searchingView->header()->hide();
2048 subik 387
        bookmarksView->header()->hide();
1092 cbradney 388
        jumpToHelpSection(jumpToSection, jumpToFile );
2048 subik 389
        readBookmarks();
2052 subik 390
        readHistory();
3472 fschmid 391
        splitter->setResizeMode( tabWidget, QSplitter::KeepSize );
392
        splitter->setResizeMode( textBrowser, QSplitter::Stretch );
4519 subik 393
        // reset previous size
394
        prefs = PrefsManager::instance()->prefsFile->getPluginContext("helpbrowser");
395
        int xsize = prefs->getUInt("xsize", 640);
396
        int ysize = prefs->getUInt("ysize", 480);
397
        resize(QSize(xsize, ysize).expandedTo(minimumSizeHint()) );
3472 fschmid 398
        clearWState( WState_Polished );
560 cbradney 399
 
400
        connect( homeButton, SIGNAL( clicked() ), textBrowser, SLOT( home() ) );
401
        connect( forwButton, SIGNAL( clicked() ), textBrowser, SLOT( forward() ) );
402
        connect( backButton, SIGNAL( clicked() ), textBrowser, SLOT( backward() ) );
564 cbradney 403
        connect( histMenu, SIGNAL(activated(int)), this, SLOT(histChosen(int)));
404
        connect( listView, SIGNAL(clicked( QListViewItem *)), this, SLOT(itemSelected( QListViewItem *)));
2006 subik 405
        // searching
2048 subik 406
        connect(searchingEdit, SIGNAL(returnPressed()), this, SLOT(searchingButton_clicked()));
407
        connect(searchingView, SIGNAL(clicked( QListViewItem *)), this, SLOT(itemSearchSelected(QListViewItem *)));
408
        connect(searchingButton, SIGNAL(clicked()), this, SLOT(searchingButton_clicked()));
409
        // bookmarks
410
        connect(bookmarkButton, SIGNAL(clicked()), this, SLOT(bookmarkButton_clicked()));
411
        connect(deleteBookmarkButton, SIGNAL(clicked()), this, SLOT(deleteBookmarkButton_clicked()));
412
        connect(deleteAllBookmarkButton, SIGNAL(clicked()), this, SLOT(deleteAllBookmarkButton_clicked()));
4905 subik 413
        connect(bookmarksView, SIGNAL(clicked(QListViewItem *)), this, SLOT(itemBookmarkSelected(QListViewItem *)));
560 cbradney 414
}
415
 
416
HelpBrowser::~HelpBrowser()
417
{
564 cbradney 418
        // no need to delete child widgets, Qt does it all for us
2048 subik 419
        // bookmarks
420
        QFile bookFile(bookmarkFile());
421
        if (bookFile.open(IO_WriteOnly))
422
        {
423
                QTextStream stream(&bookFile);
424
                stream.setEncoding(QTextStream::UnicodeUTF8);
425
                stream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
426
                stream << "<bookmarks>\n";
427
                QListViewItemIterator it(bookmarksView);
428
                for ( ; it.current(); ++it)
429
                        stream << "\t<item title=\"" << it.current()->text(0) << "\" url=\"" << it.current()->text(1) << "\" />\n";
430
                stream << "</bookmarks>\n";
431
                bookFile.close();
432
        }
2052 subik 433
        // history
434
        QFile histFile(historyFile());
435
        if (histFile.open(IO_WriteOnly))
436
        {
437
                QTextStream stream(&histFile);
438
                stream.setEncoding(QTextStream::UnicodeUTF8);
439
                stream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
440
                stream << "<history>\n";
441
                for (QMap<int,histd>::Iterator it = mHistory.begin() ; it != mHistory.end(); ++it)
442
                        stream << "\t<item title=\"" << it.data().title << "\" url=\"" << it.data().url << "\" />\n";
443
                stream << "</history>\n";
444
                histFile.close();
445
        }
4519 subik 446
        // size
447
        prefs->set("xsize", width());
448
        prefs->set("ysize", height());
560 cbradney 449
}
450
 
451
void HelpBrowser::languageChange()
452
{
564 cbradney 453
        setCaption( tr( "Scribus Online Help" ) );
454
        listView->header()->setLabel( 0, tr( "Contents" ) );
455
        listView->clear();
560 cbradney 456
 
2006 subik 457
        tabWidget->changeTab( tabContents, tr( "&Contents" ) );
2052 subik 458
        QToolTip::add(searchingEdit, tr("Searching is case unsensitive"));
560 cbradney 459
}
460
 
461
void HelpBrowser::histChosen(int i)
462
{
564 cbradney 463
        if (mHistory.contains(i))
2052 subik 464
                textBrowser->setSource(mHistory[i].url);
560 cbradney 465
}
466
 
1092 cbradney 467
void HelpBrowser::jumpToHelpSection(QString jumpToSection, QString jumpToFile)
560 cbradney 468
{
469
        QString toLoad;
1141 cbradney 470
        bool noDocs=false;
560 cbradney 471
 
2877 cbradney 472
        if (jumpToFile.isEmpty())
564 cbradney 473
        {
2008 cbradney 474
                toLoad = ScPaths::instance().docDir() + language + "/"; //clean this later to handle 5 char locales
2877 cbradney 475
                if (jumpToSection.isEmpty())
564 cbradney 476
                {
1141 cbradney 477
                        if (listView->firstChild())
478
                        {
479
                                toLoad+=listView->firstChild()->text(1);
480
                                listView->setSelected( listView->firstChild(), true );
481
                        }
482
                        else
483
                                noDocs=true;
205 Franz 484
                }
2006 subik 485
                else if (jumpToSection=="scripter")
564 cbradney 486
                {
560 cbradney 487
                        toLoad+="scripter1.html";
488
                        QListViewItemIterator it(listView);
2006 subik 489
                        while (it.current())
564 cbradney 490
                        {
560 cbradney 491
                                if (it.current()->text(1)=="scripter1.html")
492
                                        listView->setSelected( it.current(), true );
493
                                if (it.current()->text(1)=="developers.html")
494
                                        it.current()->setOpen( true );
495
                                ++it;
496
                        }
497
                }
205 Franz 498
        }
560 cbradney 499
        else
564 cbradney 500
                toLoad=jumpToFile;
3 paul 501
 
1141 cbradney 502
        if (!noDocs)
503
                loadHelp(toLoad);
504
        else
505
                textBrowser->setText("<h2>"+ tr("Sorry, no manual available! Please see: http://docs.scribus.net for updated docs\nand www.scribus.net for downloads.")+"</h2>");
3 paul 506
}
507
 
560 cbradney 508
void HelpBrowser::loadHelp(QString filename)
68 Franz 509
{
75 Franz 510
        struct histd his;
564 cbradney 511
        bool Avail = true;
560 cbradney 512
        QString toLoad;
564 cbradney 513
        QFileInfo fi;
514
        fi = QFileInfo(filename);
1100 cbradney 515
        if (fi.fileName().length()>0)
564 cbradney 516
        {
1100 cbradney 517
                if (fi.exists())
518
                        toLoad=filename;
2006 subik 519
                else
564 cbradney 520
                {
2008 cbradney 521
                        toLoad = QDir::convertSeparators(ScPaths::instance().docDir() + "en/index.html");
1100 cbradney 522
                        language="en";
523
                        fi = QFileInfo(toLoad);
524
                        if (!fi.exists())
525
                        {
526
                                textBrowser->setText("<h2>"+ tr("Sorry, no manual available! Please see: http://docs.scribus.net for updated docs\nand www.scribus.net for downloads.")+"</h2>");
527
                                Avail = false;
528
                        }
564 cbradney 529
                }
530
        }
2006 subik 531
        else
1100 cbradney 532
                Avail=false;
2006 subik 533
        if (Avail)
564 cbradney 534
        {
535
                textBrowser->setSource(toLoad);
2052 subik 536
                his.title = textBrowser->documentTitle();
2877 cbradney 537
                if (his.title.isEmpty())
2052 subik 538
                        his.title = toLoad;
539
                his.url = toLoad;
540
                mHistory[histMenu->insertItem(his.title)] = his;
564 cbradney 541
        }
2052 subik 542
        if (mHistory.count() > 15)
543
        {
544
                int itk = histMenu->idAt(0);
545
                mHistory.remove(itk);
546
                histMenu->removeItem(itk);
547
        }
560 cbradney 548
}
549
 
1092 cbradney 550
void HelpBrowser::loadMenu()
560 cbradney 551
{
1693 craig 552
        QString pfad = ScPaths::instance().docDir();
786 cbradney 553
        QString toLoad;
2008 cbradney 554
        QString pfad2 = QDir::convertSeparators(pfad + language + "/menu.xml");
564 cbradney 555
        QFileInfo fi = QFileInfo(pfad2);
786 cbradney 556
 
793 cbradney 557
        if (fi.exists())
558
                toLoad=pfad2;
559
        else
560
        {
2008 cbradney 561
                toLoad = QDir::convertSeparators(pfad + "en/menu.xml");
1092 cbradney 562
                language="en";
786 cbradney 563
                fi = QFileInfo(toLoad);
3240 fschmid 564
                sDebug("Scribus help in your selected language does not exist, trying English. Otherwise, please visit http://docs.scribus.net.");
786 cbradney 565
        }
566
 
560 cbradney 567
        if (fi.exists())
564 cbradney 568
        {
560 cbradney 569
                QDomDocument doc( "menuentries" );
786 cbradney 570
                QFile file( toLoad );
560 cbradney 571
                if ( !file.open( IO_ReadOnly ) )
572
                        return;
2006 subik 573
                if ( !doc.setContent( &file ) )
564 cbradney 574
                {
560 cbradney 575
                        file.close();
576
                        return;
577
                }
578
                file.close();
579
 
580
                QDomElement docElem = doc.documentElement();
581
                QDomNode n = docElem.firstChild();
582
                QListViewItem *qlvi=NULL, *qlvi2=NULL, *qlvi3=NULL, *qlvi4=NULL, *qlvi5=NULL, *qlvi6=NULL;
7978 fschmid 583
                QListViewItem *tutorialsMenuItem=NULL;
1033 cbradney 584
                bool haveTutorials=false;
560 cbradney 585
 
2006 subik 586
                while( !n.isNull() )
564 cbradney 587
                {
560 cbradney 588
                        QDomElement e = n.toElement(); // try to convert the node to an element.
2006 subik 589
                        if( !e.isNull() )
564 cbradney 590
                        {
2006 subik 591
                                if (e.hasAttribute( "text" ) && e.hasAttribute( "file" ))
564 cbradney 592
                                {
560 cbradney 593
                                        QDomAttr textAttr = e.attributeNode( "text" );
594
                                        QDomAttr fileAttr = e.attributeNode( "file" );
595
                                        if (qlvi2==NULL)
596
                                                qlvi=new QListViewItem(listView, textAttr.value(), fileAttr.value());
2006 subik 597
                                        else
1033 cbradney 598
                                                qlvi=new QListViewItem(listView, qlvi2, textAttr.value(), fileAttr.value());
1103 cbradney 599
                                        if (qlvi!=NULL && e.hasAttribute( "section" ))
564 cbradney 600
                                        {
1103 cbradney 601
                                                QDomAttr sectionAttr = e.attributeNode( "section" );
2006 subik 602
                                                if (sectionAttr.value()=="tutorials" && !haveTutorials)
1103 cbradney 603
                                                {
604
                                                        haveTutorials=true;
605
                                                        tutorialsMenuItem=qlvi;
606
                                                }
560 cbradney 607
                                        }
1033 cbradney 608
 
560 cbradney 609
                                        if (qlvi!=NULL)
610
                                                qlvi2=qlvi;
611
                                }
612
 
613
                                QDomNodeList nl=n.childNodes();
2006 subik 614
                                for(uint i=0 ; i<= nl.count() ; i++)
564 cbradney 615
                                {
560 cbradney 616
                                        QDomNode child=nl.item(i);
2006 subik 617
                                        if (child.isElement())
564 cbradney 618
                                        {
2006 subik 619
                                                QDomElement ec = child.toElement();
620
                                                if (!ec.isNull())
564 cbradney 621
                                                {
2006 subik 622
                                                        if (ec.hasAttribute( "text" ) && ec.hasAttribute( "file" ))
564 cbradney 623
                                                        {
560 cbradney 624
                                                                QDomAttr textAttr = ec.attributeNode( "text" );
625
                                                                QDomAttr fileAttr = ec.attributeNode( "file" );
626
                                                                if (qlvi4==NULL)
627
                                                                        qlvi3=new QListViewItem(qlvi, textAttr.value(), fileAttr.value());
2006 subik 628
                                                                else
1033 cbradney 629
                                                                        qlvi3=new QListViewItem(qlvi, qlvi4, textAttr.value(), fileAttr.value());
1103 cbradney 630
                                                                if (qlvi3!=NULL && ec.hasAttribute( "section" ))
564 cbradney 631
                                                                {
1103 cbradney 632
                                                                        QDomAttr sectionAttr = e.attributeNode( "section" );
1105 cbradney 633
                                                                        if (sectionAttr.value()=="tutorials" && !haveTutorials)
1103 cbradney 634
                                                                        {
635
                                                                                haveTutorials=true;
636
                                                                                tutorialsMenuItem=qlvi3;
637
                                                                        }
560 cbradney 638
                                                                }
639
                                                                if (qlvi3!=NULL)
640
                                                                        qlvi4=qlvi3;
641
                                                        }
642
                                                        //3rd level
643
                                                        QDomNodeList nl2=child.childNodes();
2006 subik 644
                                                        for(uint i=0 ; i<= nl2.count() ; i++)
564 cbradney 645
                                                        {
560 cbradney 646
                                                                QDomNode childchild=nl2.item(i);
2006 subik 647
                                                                if (childchild.isElement())
564 cbradney 648
                                                                {
2006 subik 649
                                                                        QDomElement ecc = childchild.toElement();
650
                                                                        if (!ecc.isNull())
564 cbradney 651
                                                                        {
2006 subik 652
                                                                                if (ecc.hasAttribute( "text" ) && ecc.hasAttribute( "file" ))
564 cbradney 653
                                                                                {
560 cbradney 654
                                                                                        QDomAttr textAttr = ecc.attributeNode( "text" );
655
                                                                                        QDomAttr fileAttr = ecc.attributeNode( "file" );
656
                                                                                        if (qlvi6==NULL)
657
                                                                                                qlvi5=new QListViewItem(qlvi3, textAttr.value(), fileAttr.value());
2006 subik 658
                                                                                        else
1033 cbradney 659
                                                                                                qlvi5=new QListViewItem(qlvi3, qlvi6, textAttr.value(), fileAttr.value());
1103 cbradney 660
                                                                                        if (qlvi5!=NULL && ecc.hasAttribute( "section" ))
564 cbradney 661
                                                                                        {
1103 cbradney 662
                                                                                                QDomAttr sectionAttr = e.attributeNode( "section" );
1105 cbradney 663
                                                                                                if (sectionAttr.value()=="tutorials" && !haveTutorials)
1103 cbradney 664
                                                                                                {
665
                                                                                                        haveTutorials=true;
666
                                                                                                        tutorialsMenuItem=qlvi5;
667
                                                                                                }
560 cbradney 668
                                                                                        }
669
                                                                                }
670
                                                                                if (qlvi5!=NULL)
671
                                                                                        qlvi6=qlvi5;
672
                                                                        }
673
                                                                }
674
                                                        }
675
                                                }
676
                                        }
677
                                }
678
                        }
679
                        n = n.nextSibling();
680
                }
1033 cbradney 681
                //scan for installed tutorials
2006 subik 682
                if (haveTutorials)
1033 cbradney 683
                {
1693 craig 684
                        QString path = ScPaths::instance().docDir();
1092 cbradney 685
                        path += language + "/tutorials/";
1033 cbradney 686
                        QDir dir(path, "*", QDir::Name, QDir::Dirs | QDir::NoSymLinks);
687
 
2006 subik 688
                        if (dir.exists() && (dir.count() != 0))
1033 cbradney 689
                        {
2006 subik 690
                                for (uint i = 0; i < dir.count(); ++i)
1033 cbradney 691
                                {
692
                                        if (dir[i]!="." && dir[i]!="..")
693
                                        {
2008 cbradney 694
                                                QString tutorialdir = QDir::convertSeparators("tutorials/" + dir[i] + "/");
695
                                                QFileInfo file(QDir::convertSeparators(path + dir[i] + "/menu.xml"));
1033 cbradney 696
                                                if (file.exists())  // menu.xml exists for tutorial
697
                                                {
698
                                                        QDomDocument docTutorial( "tutorialmenuentries" );
699
                                                        QFile fileTutorialMenu( file.filePath() );
700
                                                        if ( !fileTutorialMenu.open( IO_ReadOnly ) )
701
                                                                break;
2006 subik 702
                                                        if ( !docTutorial.setContent( &fileTutorialMenu ) )
1033 cbradney 703
                                                        {
704
                                                                fileTutorialMenu.close();
705
                                                                break;
706
                                                        }
707
                                                        fileTutorialMenu.close();
708
 
709
                                                        QDomElement docElemTutorial = docTutorial.documentElement();
710
                                                        QDomNode nTutorial = docElemTutorial.firstChild();
711
                                                        QListViewItem *tutorialQLVI=NULL;
712
 
2006 subik 713
                                                        while( !nTutorial.isNull() )
1033 cbradney 714
                                                        {
715
                                                                QDomElement eTutorial = nTutorial.toElement(); // try to convert the node to an element.
2006 subik 716
                                                                if( !eTutorial.isNull() )
1033 cbradney 717
                                                                {
2006 subik 718
                                                                        if (tutorialsMenuItem!=NULL && eTutorial.hasAttribute( "text" ) && eTutorial.hasAttribute( "file" ))
1033 cbradney 719
                                                                        {
720
                                                                                QDomAttr textAttr = eTutorial.attributeNode( "text" );
721
                                                                                QDomAttr fileAttr = eTutorial.attributeNode( "file" );
1092 cbradney 722
                                                                                tutorialQLVI=new QListViewItem(tutorialsMenuItem, textAttr.value(), tutorialdir + fileAttr.value());
1033 cbradney 723
                                                                        }
724
                                                                        QDomNodeList nl=nTutorial.childNodes();
725
                                                                        QListViewItem *tutorialSubMenuItem, *tutorialSubMenuItemLast=NULL;
1092 cbradney 726
                                                                        for(uint j=0 ; j<= nl.count() ; j++)
1033 cbradney 727
                                                                        {
1092 cbradney 728
                                                                                QDomNode child=nl.item(j);
1033 cbradney 729
                                                                                if (child.isElement())
730
                                                                                {
731
                                                                                        QDomElement ec = child.toElement();
732
                                                                                        if (!ec.isNull())
733
                                                                                        {
734
                                                                                                if (ec.hasAttribute( "text" ) && ec.hasAttribute( "file" ))
735
                                                                                                {
736
                                                                                                        QDomAttr textAttr = ec.attributeNode( "text" );
737
                                                                                                        QDomAttr fileAttr = ec.attributeNode( "file" );
738
                                                                                                        if (tutorialSubMenuItemLast==NULL)
1092 cbradney 739
                                                                                                                tutorialSubMenuItem=new QListViewItem(tutorialQLVI, textAttr.value(), tutorialdir + fileAttr.value());
2006 subik 740
                                                                                                        else
1092 cbradney 741
                                                                                                                tutorialSubMenuItem=new QListViewItem(tutorialQLVI, tutorialSubMenuItemLast, textAttr.value(), tutorialdir + fileAttr.value());
1033 cbradney 742
                                                                                                        if (tutorialSubMenuItem!=NULL)
743
                                                                                                                tutorialSubMenuItemLast=tutorialSubMenuItem;
744
                                                                                                }
745
                                                                                        }
746
                                                                                }
747
                                                                        }
748
                                                                }
749
                                                                nTutorial = nTutorial.nextSibling();
750
                                                        }
751
                                                }
752
                                        }
753
                                }
754
                        }
755
 
756
                }
205 Franz 757
        }
68 Franz 758
}
759
 
560 cbradney 760
void HelpBrowser::itemSelected(QListViewItem *item)
68 Franz 761
{
560 cbradney 762
        if ( !item )
763
                return;
2878 cbradney 764
        if (!item->text(1).isNull())
1033 cbradney 765
        {
1693 craig 766
                QString pfad = ScPaths::instance().docDir();
2008 cbradney 767
                loadHelp(QDir::convertSeparators(pfad + language + "/" + item->text(1)));
1033 cbradney 768
        }
68 Franz 769
}
2006 subik 770
 
771
void HelpBrowser::itemSearchSelected(QListViewItem *item)
772
{
4519 subik 773
        if (item && !item->text(2).isNull())
2006 subik 774
        {
4519 subik 775
                loadHelp(item->text(2));
2006 subik 776
                findText = searchingEdit->text();
777
                findNext();
778
        }
779
}
780
 
4905 subik 781
void HelpBrowser::itemBookmarkSelected(QListViewItem *item)
782
{
783
        if (item && !item->text(1).isNull())
784
                loadHelp(item->text(1));
785
}
786
 
787
 
2006 subik 788
void HelpBrowser::searchingInDirectory(QString aDir)
789
{
4519 subik 790
        QDir dir(QDir::convertSeparators(aDir + "/"));
2006 subik 791
        QStringList lst = dir.entryList("*.html");
792
        for (QStringList::Iterator it = lst.begin(); it != lst.end(); ++it)
793
        {
794
                QString fname(aDir + (*it));
795
                QFile f(fname);
796
                if (f.open(IO_ReadOnly))
797
                {
798
                        QTextStream stream(&f);
799
                        QString str = stream.read().lower();
800
                        int cnt = str.contains(searchingEdit->text().lower());
801
                        if (cnt > 0)
802
                        {
803
                                // the remove() hack is here for itemSelected() handling
804
                                QString fullname = fname;
805
                                QString title;
2008 cbradney 806
                                QListViewItem *refItem = listView->findItem(fname.remove(QDir::convertSeparators(ScPaths::instance().docDir()+language + "/")), 1);
4519 subik 807
                                title = refItem ? refItem->text(0) : fname;
808
                                HelpListItem *item = new HelpListItem(searchingView, QString("%2").arg(title), QString("%1").arg(cnt), fullname);
2006 subik 809
                                searchingView->insertItem(item);
810
                        }
811
                        f.close();
812
                }
813
        }
814
        // get dirs - ugly recursion
815
        QStringList dst = dir.entryList("*", QDir::Dirs);
816
        for (QStringList::Iterator it = dst.begin(); it != dst.end(); ++it)
817
                if ((*it)!="." && (*it)!="..")
2008 cbradney 818
                        searchingInDirectory(QDir::convertSeparators(aDir + QString((*it)) + "/"));
2006 subik 819
}
820
 
821
void HelpBrowser::searchingButton_clicked()
822
{
823
        searchingView->clear();
824
        // root files
825
        QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
4519 subik 826
        searchingInDirectory(QDir::convertSeparators(ScPaths::instance().docDir() + language + "/"));
2006 subik 827
        QApplication::restoreOverrideCursor();
828
}
829
 
830
void HelpBrowser::find()
831
{
2397 cbradney 832
        findText = QInputDialog::getText( tr("Find"), tr("Search Term:"), QLineEdit::Normal, findText, 0, this);
2878 cbradney 833
        if (findText.isNull())
2006 subik 834
                return;
835
        findNext();
836
}
837
 
838
void HelpBrowser::findNext()
839
{
2878 cbradney 840
        if (findText.isNull())
2006 subik 841
        {
842
                find();
843
                return;
844
        }
845
        // find it. finally
846
        textBrowser->find(findText, false, false, true, 0, 0);
847
}
2023 subik 848
 
849
void HelpBrowser::findPrevious()
850
{
2878 cbradney 851
        if (findText.isNull())
2023 subik 852
        {
853
                find();
854
                return;
855
        }
856
        // find it. finally
857
        textBrowser->find(findText, false, false, false, 0, 0);
858
}
859
 
860
void HelpBrowser::print()
861
{
862
        QPrinter printer;
863
        printer.setFullPage(true);
864
        if (!printer.setup(this))
865
                return;
866
 
867
        QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
868
        QPainter p(&printer);
869
        QPaintDeviceMetrics metrics(p.device());
870
        int dpix = metrics.logicalDpiX();
871
        int dpiy = metrics.logicalDpiY();
872
        const int margin = 72; // pt
873
        QRect body(margin*dpix/72, margin*dpiy/72, metrics.width()-margin*dpix/72*2, metrics.height()-margin*dpiy/72*2);
874
        QFont font("Helvetica");
875
        QSimpleRichText richText( textBrowser->text(), font, textBrowser->context(), textBrowser->styleSheet(), textBrowser->mimeSourceFactory(), body.height());
876
        richText.setWidth( &p, body.width());
877
        QRect view(body);
878
        int page = 1;
879
        do {
880
                richText.draw(&p, body.left(), body.top(), view, colorGroup());
881
                view.moveBy(0, body.height());
882
                p.translate(0 , -body.height());
883
                p.setFont(font);
884
                p.drawText(view.right() - p.fontMetrics().width(QString::number(page)), view.bottom() + p.fontMetrics().ascent() + 5, QString::number(page));
885
                if (view.top()  >= body.top() + richText.height())
886
                        break;
887
                printer.newPage();
888
                page++;
889
        } while (true);
890
        QApplication::restoreOverrideCursor();
891
}
892
 
2048 subik 893
void HelpBrowser::bookmarkButton_clicked()
894
{
2052 subik 895
        QString title = textBrowser->documentTitle();
2048 subik 896
        QString fname(QDir::cleanDirPath(textBrowser->source()));
2397 cbradney 897
        title = QInputDialog::getText( tr("New Bookmark"), tr("New Bookmark's Title:"), QLineEdit::Normal, title, 0, this);
2048 subik 898
        // user cancel
2878 cbradney 899
        if (title.isNull())
2048 subik 900
                return;
2052 subik 901
        QListViewItem *item = new QListViewItem(bookmarksView, title, fname);
2048 subik 902
        bookmarksView->insertItem(item);
903
}
904
 
905
void HelpBrowser::deleteBookmarkButton_clicked()
906
{
907
        delete(bookmarksView->currentItem());
908
}
909
 
910
void HelpBrowser::deleteAllBookmarkButton_clicked()
911
{
912
        bookmarksView->clear();
913
}
914
 
915
void HelpBrowser::readBookmarks()
916
{
917
        BookmarkParser handler;
918
        handler.view = bookmarksView;
919
        QFile xmlFile(bookmarkFile());
920
        QXmlInputSource source(xmlFile);
921
        QXmlSimpleReader reader;
922
        reader.setContentHandler(&handler);
2052 subik 923
        reader.parse(source);
2048 subik 924
}
2052 subik 925
 
926
void HelpBrowser::readHistory()
927
{
928
        HistoryParser handler;
929
        handler.helpBrowser = this;
930
        QFile xmlFile(historyFile());
931
        QXmlInputSource source(xmlFile);
932
        QXmlSimpleReader reader;
933
        reader.setContentHandler(&handler);
934
        reader.parse(source);
935
}
936
 
4458 subik 937
void HelpBrowser::setText(QString str)
938
{
939
        textBrowser->setText(str);
940
}