Subversion Repositories Scribus

Rev

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