Subversion Repositories Scribus

Rev

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

Rev Author Line No. Line
564 cbradney 1
/***************************************************************************
2
*   Copyright (C) 2004 by Craig Bradney                                   *
3
*   cbradney@zip.com.au                                                   *
4
*                                                                         *
5
*   This program is free software; you can redistribute it and/or modify  *
6
*   it under the terms of the GNU General Public License as published by  *
7
*   the Free Software Foundation; either version 2 of the License, or     *
8
*   (at your option) any later version.                                   *
9
*                                                                         *
10
*   This program is distributed in the hope that it will be useful,       *
11
*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12
*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13
*   GNU General Public License for more details.                          *
14
*                                                                         *
15
*   You should have received a copy of the GNU General Public License     *
16
*   along with this program; if not, write to the                         *
17
*   Free Software Foundation, Inc.,                                       *
18
*   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
19
***************************************************************************/
560 cbradney 20
 
3 paul 21
#include "helpbrowser.h"
22
#include "helpbrowser.moc"
560 cbradney 23
 
3 paul 24
#include <qvariant.h>
560 cbradney 25
#include <qpushbutton.h>
26
#include <qtabwidget.h>
27
#include <qwidget.h>
28
#include <qheader.h>
29
#include <qlistview.h>
30
#include <qtextbrowser.h>
31
#include <qlayout.h>
3 paul 32
#include <qtooltip.h>
560 cbradney 33
#include <qtoolbutton.h>
34
#include <qwhatsthis.h>
3 paul 35
#include <qimage.h>
36
#include <qpixmap.h>
560 cbradney 37
#include <qpopupmenu.h>
38
#include <qfileinfo.h>
3 paul 39
#include <qtextcodec.h>
560 cbradney 40
#include <qdom.h>
1033 cbradney 41
#include <qdir.h>
786 cbradney 42
#include <qsplitter.h>
1144 cbradney 43
#include <qmime.h>
2006 subik 44
#include <qlabel.h>
45
#include <qlineedit.h>
46
#include <qaccel.h>
47
#include <qinputdialog.h>
2023 subik 48
#include <qmenubar.h>
49
#include <qpopupmenu.h>
50
#include <qprinter.h>
51
#include <qpainter.h>
52
#include <qpaintdevicemetrics.h>
53
#include <qsimplerichtext.h>
128 Franz 54
 
1693 craig 55
#include "scpaths.h"
56
 
617 cbradney 57
#ifdef _MSC_VER
1033 cbradney 58
#if (_MSC_VER >= 1200)
59
#include "win-config.h"
60
#endif
128 Franz 61
#else
1033 cbradney 62
#include "config.h"
128 Franz 63
#endif
64
 
3 paul 65
extern QPixmap loadIcon(QString nam);
66
 
560 cbradney 67
 
2006 subik 68
HelpBrowser::HelpBrowser( QWidget* parent, QString /*caption*/, QString guiLanguage, QString jumpToSection, QString jumpToFile)
564 cbradney 69
        : QWidget( parent, "Help", WType_TopLevel | WDestructiveClose )
3 paul 70
{
560 cbradney 71
        QString fileName;
564 cbradney 72
        mHistory.clear();
73
        struct histd his;
1092 cbradney 74
        language = guiLanguage=="" ? "en" : guiLanguage.left(2);
2006 subik 75
        helpBrowsermainLayout = new QVBoxLayout( this);
564 cbradney 76
        buttonLayout = new QHBoxLayout;
77
        buttonLayout->setSpacing( 6 );
78
        buttonLayout->setMargin( 2 );
3 paul 79
 
564 cbradney 80
        homeButton = new QToolButton( this, "homeButton" );
81
        homeButton->setText( "" );
82
        homeButton->setPixmap(loadIcon("gohome.png"));
786 cbradney 83
        homeButton->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed, homeButton->sizePolicy().hasHeightForWidth() ) );
564 cbradney 84
        buttonLayout->addWidget( homeButton );
3 paul 85
 
564 cbradney 86
        histMenu = new QPopupMenu( this );
87
        backButton = new QToolButton( this, "backButton" );
88
        backButton->setPixmap(loadIcon("back.png"));
786 cbradney 89
        backButton->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed, backButton->sizePolicy().hasHeightForWidth() ) );
564 cbradney 90
        backButton->setPopup(histMenu);
91
        backButton->setPopupDelay(0);
92
        buttonLayout->addWidget( backButton );
3 paul 93
 
564 cbradney 94
        forwButton = new QToolButton( this, "forwButton" );
95
        forwButton->setPixmap(loadIcon("forward.png"));
786 cbradney 96
        forwButton->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed, forwButton->sizePolicy().hasHeightForWidth() ) );
564 cbradney 97
        buttonLayout->addWidget( forwButton );
98
        QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
99
        buttonLayout->addItem( spacer );
560 cbradney 100
        helpBrowsermainLayout->addLayout( buttonLayout );
101
 
2006 subik 102
        helpBrowserLayout = new QHBoxLayout;
786 cbradney 103
        splitter = new QSplitter(this, "splitter");
104
        splitter->setChildrenCollapsible( false );
105
        helpBrowserLayout->addWidget( splitter );
560 cbradney 106
 
786 cbradney 107
        tabWidget = new QTabWidget( splitter, "tabWidget" );
108
        //tabWidget = new QTabWidget( this, "tabWidget" );
109
        splitter->setResizeMode(tabWidget, QSplitter::Stretch );
110
        tabWidget->setSizePolicy( QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Expanding, false) );
564 cbradney 111
        tabContents = new QWidget( tabWidget, "tabContents" );
2006 subik 112
        tabLayout = new QHBoxLayout( tabContents, 11, 6, "tabLayout");
560 cbradney 113
 
564 cbradney 114
        listView = new QListView( tabContents, "listView" );
115
        listView->addColumn( tr( "Contents" ) );
1097 cbradney 116
        listView->addColumn( tr( "Link" ) , 0 );
117
//      listView->addColumn( tr( "Link" ) );
118
        listView->setColumnWidthMode( 0, QListView::Maximum );
119
        listView->setColumnWidthMode( 1, QListView::Manual );
560 cbradney 120
        listView->setSorting(-1,-1);
121
        listView->setRootIsDecorated( true );
122
        listView->setSelectionMode(QListView::Single);
123
        listView->setDefaultRenameAction(QListView::Reject);
124
        listView->clear();
564 cbradney 125
        tabLayout->addWidget( listView );
2006 subik 126
 
127
        tabWidget->insertTab( tabContents, tr("&Contents") );
786 cbradney 128
        //helpBrowserLayout->addWidget( tabWidget );
560 cbradney 129
 
2006 subik 130
        // searching
131
        tabSearching = new QWidget(tabWidget, "tabSearching");
132
        searchingMainLayout = new QVBoxLayout(tabSearching, 11, 6, "searchingMainLayout");
133
        searchingButtonLayout = new QHBoxLayout;
134
        searchingEdit = new QLineEdit(tabSearching, "searchingEdit");
2008 cbradney 135
        searchingButton = new QPushButton(tr("&Search"), tabSearching, "searchingButton");
2006 subik 136
        searchingButtonLayout->addWidget(searchingEdit);
137
        searchingButtonLayout->addWidget(searchingButton);
138
        searchingMainLayout->addLayout(searchingButtonLayout);
139
        searchingView = new QListView(tabSearching, "searchingView");
140
        searchingView->addColumn( tr( "Contents" ) );
141
        searchingView->addColumn( tr( "Link" ) , 0 );
142
        searchingView->setColumnWidthMode( 0, QListView::Maximum );
143
        searchingView->setColumnWidthMode( 1, QListView::Manual );
144
        searchingView->setSorting(-1,-1);
145
        searchingView->setRootIsDecorated( true );
146
        searchingView->setSelectionMode(QListView::Single);
147
        searchingView->setDefaultRenameAction(QListView::Reject);
148
        searchingView->clear();
149
        searchingMainLayout->addWidget(searchingView);
150
        tabWidget->insertTab(tabSearching, tr("S&earch"));
151
 
786 cbradney 152
        textBrowser = new QTextBrowser( splitter, "textBrowser" );
153
        splitter->setResizeMode(textBrowser, QSplitter::Stretch);
154
        //textBrowser = new QTextBrowser( this, "textBrowser" );
155
        textBrowser->setSizePolicy( QSizePolicy( QSizePolicy::Ignored, QSizePolicy::Expanding, false ) );
564 cbradney 156
        textBrowser->setFrameShape( QTextBrowser::StyledPanel );
1144 cbradney 157
        QMimeSourceFactory *textBrowserMSF=textBrowser->mimeSourceFactory();
158
        textBrowserMSF->setExtensionType("html", "text/html;charset=UTF-8");
786 cbradney 159
        //helpBrowserLayout->addWidget( textBrowser );
564 cbradney 160
        helpBrowsermainLayout->addLayout( helpBrowserLayout );
560 cbradney 161
 
2023 subik 162
        // menus
163
        menuBar = new QMenuBar(this);
164
        QPopupMenu *fileMenu = new QPopupMenu(this);
165
        fileMenu->insertItem(loadIcon("DateiPrint.xpm"), tr("&Print..."), this, SLOT(print()), CTRL+Key_P);
166
        fileMenu->insertSeparator();
167
        fileMenu->insertItem(loadIcon("exit.png"), tr("E&xit"), this, SLOT(close()));
168
        menuBar->insertItem("&File", fileMenu);
169
        QPopupMenu *editMenu = new QPopupMenu(this);
170
        editMenu->insertItem(loadIcon("find.png"), "&Find...", this, SLOT(find()), CTRL+Key_F);
171
        editMenu->insertItem("Find &next", this, SLOT(findNext()), Key_F3);
172
        editMenu->insertItem("Find &previous", this, SLOT(findPrevious()), SHIFT+Key_F3);
173
        menuBar->insertItem("&Edit", editMenu);
174
        helpBrowsermainLayout->setMenuBar(menuBar);
175
/*
176
        QAccel *a = new QAccel( this, "a");
177
        a->connectItem(a->insertItem(QAccel::stringToKey(tr("Ctrl+F"))), this, SLOT(find()));
178
        a->connectItem(a->insertItem(QAccel::stringToKey(tr("F3"))), this, SLOT(findNext(true)));
179
        a->connectItem(a->insertItem(QAccel::stringToKey(tr("Shift+F3"))), this, SLOT(findNext(false)));
180
        a->connectItem(a->insertItem(QAccel::stringToKey(tr("Ctrl+P"))), this, SLOT(print()));*/
181
 
564 cbradney 182
        languageChange();
183
        resize( QSize(602, 491).expandedTo(minimumSizeHint()) );
184
        clearWState( WState_Polished );
1092 cbradney 185
        loadMenu();
560 cbradney 186
        listView->header()->hide();
2006 subik 187
        searchingView->header()->hide();
1092 cbradney 188
        jumpToHelpSection(jumpToSection, jumpToFile );
560 cbradney 189
 
190
        connect( homeButton, SIGNAL( clicked() ), textBrowser, SLOT( home() ) );
191
        connect( forwButton, SIGNAL( clicked() ), textBrowser, SLOT( forward() ) );
192
        connect( backButton, SIGNAL( clicked() ), textBrowser, SLOT( backward() ) );
564 cbradney 193
        connect( histMenu, SIGNAL(activated(int)), this, SLOT(histChosen(int)));
194
        connect( listView, SIGNAL(clicked( QListViewItem *)), this, SLOT(itemSelected( QListViewItem *)));
2006 subik 195
        // searching
2008 cbradney 196
        connect( searchingEdit, SIGNAL(returnPressed()), this, SLOT(searchingButton_clicked()));
197
        connect( searchingView, SIGNAL(clicked( QListViewItem *)), this, SLOT(itemSearchSelected(QListViewItem *)));
198
        connect( searchingButton, SIGNAL(clicked()), this, SLOT(searchingButton_clicked()));
560 cbradney 199
}
200
 
201
HelpBrowser::~HelpBrowser()
202
{
564 cbradney 203
        // no need to delete child widgets, Qt does it all for us
560 cbradney 204
}
205
 
206
void HelpBrowser::languageChange()
207
{
564 cbradney 208
        setCaption( tr( "Scribus Online Help" ) );
209
        listView->header()->setLabel( 0, tr( "Contents" ) );
210
        listView->clear();
560 cbradney 211
 
2006 subik 212
        tabWidget->changeTab( tabContents, tr( "&Contents" ) );
560 cbradney 213
}
214
 
215
 
216
void HelpBrowser::sourceChanged(const QString& url)
217
{
564 cbradney 218
        bool inList = false;
219
        struct histd his;
220
        QString title = "";
221
        title = textBrowser->documentTitle();
222
        if (title == "")
223
                title = url;
786 cbradney 224
        for (QMap<int, histd>::Iterator it = mHistory.begin(); it != mHistory.end(); ++it)
564 cbradney 225
        {
226
                if (it.data().Title == title)
227
                        inList = true;
228
        }
229
        if (!inList)
230
        {
231
                his.Title = title;
232
                his.Url = url;
233
                mHistory[histMenu->insertItem(title)] = his;
234
        }
235
        if (mHistory.count() > 15)
236
        {
237
                int itk = histMenu->idAt(0);
238
                mHistory.remove(itk);
239
                histMenu->removeItem(itk);
240
        }
560 cbradney 241
}
242
 
243
void HelpBrowser::histChosen(int i)
244
{
564 cbradney 245
        if (mHistory.contains(i))
246
                textBrowser->setSource(mHistory[i].Url);
560 cbradney 247
}
248
 
1092 cbradney 249
void HelpBrowser::jumpToHelpSection(QString jumpToSection, QString jumpToFile)
560 cbradney 250
{
251
        QString toLoad;
1141 cbradney 252
        bool noDocs=false;
560 cbradney 253
 
2006 subik 254
        if (jumpToFile=="")
564 cbradney 255
        {
2008 cbradney 256
                toLoad = ScPaths::instance().docDir() + language + "/"; //clean this later to handle 5 char locales
2006 subik 257
                if (jumpToSection=="")
564 cbradney 258
                {
1141 cbradney 259
                        if (listView->firstChild())
260
                        {
261
                                toLoad+=listView->firstChild()->text(1);
262
                                listView->setSelected( listView->firstChild(), true );
263
                        }
264
                        else
265
                                noDocs=true;
205 Franz 266
                }
2006 subik 267
                else if (jumpToSection=="scripter")
564 cbradney 268
                {
560 cbradney 269
                        toLoad+="scripter1.html";
270
                        QListViewItemIterator it(listView);
2006 subik 271
                        while (it.current())
564 cbradney 272
                        {
560 cbradney 273
                                if (it.current()->text(1)=="scripter1.html")
274
                                        listView->setSelected( it.current(), true );
275
                                if (it.current()->text(1)=="developers.html")
276
                                        it.current()->setOpen( true );
277
                                ++it;
278
                        }
279
                }
205 Franz 280
        }
560 cbradney 281
        else
564 cbradney 282
                toLoad=jumpToFile;
3 paul 283
 
1141 cbradney 284
        if (!noDocs)
285
                loadHelp(toLoad);
286
        else
287
                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 288
}
289
 
560 cbradney 290
void HelpBrowser::loadHelp(QString filename)
68 Franz 291
{
75 Franz 292
        struct histd his;
564 cbradney 293
        bool Avail = true;
560 cbradney 294
        QString toLoad;
564 cbradney 295
        QFileInfo fi;
296
        fi = QFileInfo(filename);
1100 cbradney 297
        if (fi.fileName().length()>0)
564 cbradney 298
        {
1100 cbradney 299
                if (fi.exists())
300
                        toLoad=filename;
2006 subik 301
                else
564 cbradney 302
                {
2008 cbradney 303
                        toLoad = QDir::convertSeparators(ScPaths::instance().docDir() + "en/index.html");
1100 cbradney 304
                        language="en";
305
                        fi = QFileInfo(toLoad);
306
                        if (!fi.exists())
307
                        {
308
                                textBrowser->setText("<h2>"+ tr("Sorry, no manual available! Please see: http://docs.scribus.net for updated docs\nand www.scribus.net for downloads.")+"</h2>");
309
                                Avail = false;
310
                        }
564 cbradney 311
                }
312
        }
2006 subik 313
        else
1100 cbradney 314
                Avail=false;
2006 subik 315
        if (Avail)
564 cbradney 316
        {
317
                textBrowser->setSource(toLoad);
318
                his.Title = textBrowser->documentTitle();
319
                if (his.Title == "")
320
                        his.Title = toLoad;
321
                his.Url = toLoad;
322
                mHistory[histMenu->insertItem(his.Title)] = his;
323
        }
560 cbradney 324
}
325
 
1092 cbradney 326
void HelpBrowser::loadMenu()
560 cbradney 327
{
1693 craig 328
        QString pfad = ScPaths::instance().docDir();
786 cbradney 329
        QString toLoad;
2008 cbradney 330
        QString pfad2 = QDir::convertSeparators(pfad + language + "/menu.xml");
564 cbradney 331
        QFileInfo fi = QFileInfo(pfad2);
786 cbradney 332
 
793 cbradney 333
        if (fi.exists())
334
                toLoad=pfad2;
335
        else
336
        {
2008 cbradney 337
                toLoad = QDir::convertSeparators(pfad + "en/menu.xml");
1092 cbradney 338
                language="en";
786 cbradney 339
                fi = QFileInfo(toLoad);
340
                qDebug("Scribus help in your selected language does not exist, trying English. Otherwise, please visit http://docs.scribus.net.");
341
        }
342
 
560 cbradney 343
        if (fi.exists())
564 cbradney 344
        {
560 cbradney 345
                QDomDocument doc( "menuentries" );
786 cbradney 346
                QFile file( toLoad );
560 cbradney 347
                if ( !file.open( IO_ReadOnly ) )
348
                        return;
2006 subik 349
                if ( !doc.setContent( &file ) )
564 cbradney 350
                {
560 cbradney 351
                        file.close();
352
                        return;
353
                }
354
                file.close();
355
 
356
                QDomElement docElem = doc.documentElement();
357
                QDomNode n = docElem.firstChild();
358
                QListViewItem *qlvi=NULL, *qlvi2=NULL, *qlvi3=NULL, *qlvi4=NULL, *qlvi5=NULL, *qlvi6=NULL;
1033 cbradney 359
                QListViewItem *tutorialsMenuItem;
360
                bool haveTutorials=false;
560 cbradney 361
 
2006 subik 362
                while( !n.isNull() )
564 cbradney 363
                {
560 cbradney 364
                        QDomElement e = n.toElement(); // try to convert the node to an element.
2006 subik 365
                        if( !e.isNull() )
564 cbradney 366
                        {
2006 subik 367
                                if (e.hasAttribute( "text" ) && e.hasAttribute( "file" ))
564 cbradney 368
                                {
560 cbradney 369
                                        QDomAttr textAttr = e.attributeNode( "text" );
370
                                        QDomAttr fileAttr = e.attributeNode( "file" );
371
                                        if (qlvi2==NULL)
372
                                                qlvi=new QListViewItem(listView, textAttr.value(), fileAttr.value());
2006 subik 373
                                        else
1033 cbradney 374
                                                qlvi=new QListViewItem(listView, qlvi2, textAttr.value(), fileAttr.value());
1103 cbradney 375
                                        if (qlvi!=NULL && e.hasAttribute( "section" ))
564 cbradney 376
                                        {
1103 cbradney 377
                                                QDomAttr sectionAttr = e.attributeNode( "section" );
2006 subik 378
                                                if (sectionAttr.value()=="tutorials" && !haveTutorials)
1103 cbradney 379
                                                {
380
                                                        haveTutorials=true;
381
                                                        tutorialsMenuItem=qlvi;
382
                                                }
560 cbradney 383
                                        }
1033 cbradney 384
 
560 cbradney 385
                                        if (qlvi!=NULL)
386
                                                qlvi2=qlvi;
387
                                }
388
 
389
                                QDomNodeList nl=n.childNodes();
2006 subik 390
                                for(uint i=0 ; i<= nl.count() ; i++)
564 cbradney 391
                                {
560 cbradney 392
                                        QDomNode child=nl.item(i);
2006 subik 393
                                        if (child.isElement())
564 cbradney 394
                                        {
2006 subik 395
                                                QDomElement ec = child.toElement();
396
                                                if (!ec.isNull())
564 cbradney 397
                                                {
2006 subik 398
                                                        if (ec.hasAttribute( "text" ) && ec.hasAttribute( "file" ))
564 cbradney 399
                                                        {
560 cbradney 400
                                                                QDomAttr textAttr = ec.attributeNode( "text" );
401
                                                                QDomAttr fileAttr = ec.attributeNode( "file" );
402
                                                                if (qlvi4==NULL)
403
                                                                        qlvi3=new QListViewItem(qlvi, textAttr.value(), fileAttr.value());
2006 subik 404
                                                                else
1033 cbradney 405
                                                                        qlvi3=new QListViewItem(qlvi, qlvi4, textAttr.value(), fileAttr.value());
1103 cbradney 406
                                                                if (qlvi3!=NULL && ec.hasAttribute( "section" ))
564 cbradney 407
                                                                {
1103 cbradney 408
                                                                        QDomAttr sectionAttr = e.attributeNode( "section" );
1105 cbradney 409
                                                                        if (sectionAttr.value()=="tutorials" && !haveTutorials)
1103 cbradney 410
                                                                        {
411
                                                                                haveTutorials=true;
412
                                                                                tutorialsMenuItem=qlvi3;
413
                                                                        }
560 cbradney 414
                                                                }
415
                                                                if (qlvi3!=NULL)
416
                                                                        qlvi4=qlvi3;
417
                                                        }
418
                                                        //3rd level
419
                                                        QDomNodeList nl2=child.childNodes();
2006 subik 420
                                                        for(uint i=0 ; i<= nl2.count() ; i++)
564 cbradney 421
                                                        {
560 cbradney 422
                                                                QDomNode childchild=nl2.item(i);
2006 subik 423
                                                                if (childchild.isElement())
564 cbradney 424
                                                                {
2006 subik 425
                                                                        QDomElement ecc = childchild.toElement();
426
                                                                        if (!ecc.isNull())
564 cbradney 427
                                                                        {
2006 subik 428
                                                                                if (ecc.hasAttribute( "text" ) && ecc.hasAttribute( "file" ))
564 cbradney 429
                                                                                {
560 cbradney 430
                                                                                        QDomAttr textAttr = ecc.attributeNode( "text" );
431
                                                                                        QDomAttr fileAttr = ecc.attributeNode( "file" );
432
                                                                                        if (qlvi6==NULL)
433
                                                                                                qlvi5=new QListViewItem(qlvi3, textAttr.value(), fileAttr.value());
2006 subik 434
                                                                                        else
1033 cbradney 435
                                                                                                qlvi5=new QListViewItem(qlvi3, qlvi6, textAttr.value(), fileAttr.value());
1103 cbradney 436
                                                                                        if (qlvi5!=NULL && ecc.hasAttribute( "section" ))
564 cbradney 437
                                                                                        {
1103 cbradney 438
                                                                                                QDomAttr sectionAttr = e.attributeNode( "section" );
1105 cbradney 439
                                                                                                if (sectionAttr.value()=="tutorials" && !haveTutorials)
1103 cbradney 440
                                                                                                {
441
                                                                                                        haveTutorials=true;
442
                                                                                                        tutorialsMenuItem=qlvi5;
443
                                                                                                }
560 cbradney 444
                                                                                        }
445
                                                                                }
446
                                                                                if (qlvi5!=NULL)
447
                                                                                        qlvi6=qlvi5;
448
                                                                        }
449
                                                                }
450
                                                        }
451
                                                }
452
                                        }
453
                                }
454
                        }
455
                        n = n.nextSibling();
456
                }
1033 cbradney 457
                //scan for installed tutorials
2006 subik 458
                if (haveTutorials)
1033 cbradney 459
                {
1693 craig 460
                        QString path = ScPaths::instance().docDir();
1092 cbradney 461
                        path += language + "/tutorials/";
1033 cbradney 462
                        QDir dir(path, "*", QDir::Name, QDir::Dirs | QDir::NoSymLinks);
463
 
2006 subik 464
                        if (dir.exists() && (dir.count() != 0))
1033 cbradney 465
                        {
2006 subik 466
                                for (uint i = 0; i < dir.count(); ++i)
1033 cbradney 467
                                {
468
                                        if (dir[i]!="." && dir[i]!="..")
469
                                        {
2008 cbradney 470
                                                QString tutorialdir = QDir::convertSeparators("tutorials/" + dir[i] + "/");
471
                                                QFileInfo file(QDir::convertSeparators(path + dir[i] + "/menu.xml"));
1033 cbradney 472
                                                if (file.exists())  // menu.xml exists for tutorial
473
                                                {
474
                                                        QDomDocument docTutorial( "tutorialmenuentries" );
475
                                                        QFile fileTutorialMenu( file.filePath() );
476
                                                        if ( !fileTutorialMenu.open( IO_ReadOnly ) )
477
                                                                break;
2006 subik 478
                                                        if ( !docTutorial.setContent( &fileTutorialMenu ) )
1033 cbradney 479
                                                        {
480
                                                                fileTutorialMenu.close();
481
                                                                break;
482
                                                        }
483
                                                        fileTutorialMenu.close();
484
 
485
                                                        QDomElement docElemTutorial = docTutorial.documentElement();
486
                                                        QDomNode nTutorial = docElemTutorial.firstChild();
487
                                                        QListViewItem *tutorialQLVI=NULL;
488
 
2006 subik 489
                                                        while( !nTutorial.isNull() )
1033 cbradney 490
                                                        {
491
                                                                QDomElement eTutorial = nTutorial.toElement(); // try to convert the node to an element.
2006 subik 492
                                                                if( !eTutorial.isNull() )
1033 cbradney 493
                                                                {
2006 subik 494
                                                                        if (tutorialsMenuItem!=NULL && eTutorial.hasAttribute( "text" ) && eTutorial.hasAttribute( "file" ))
1033 cbradney 495
                                                                        {
496
                                                                                QDomAttr textAttr = eTutorial.attributeNode( "text" );
497
                                                                                QDomAttr fileAttr = eTutorial.attributeNode( "file" );
1092 cbradney 498
                                                                                tutorialQLVI=new QListViewItem(tutorialsMenuItem, textAttr.value(), tutorialdir + fileAttr.value());
1033 cbradney 499
                                                                        }
500
                                                                        QDomNodeList nl=nTutorial.childNodes();
501
                                                                        QListViewItem *tutorialSubMenuItem, *tutorialSubMenuItemLast=NULL;
1092 cbradney 502
                                                                        for(uint j=0 ; j<= nl.count() ; j++)
1033 cbradney 503
                                                                        {
1092 cbradney 504
                                                                                QDomNode child=nl.item(j);
1033 cbradney 505
                                                                                if (child.isElement())
506
                                                                                {
507
                                                                                        QDomElement ec = child.toElement();
508
                                                                                        if (!ec.isNull())
509
                                                                                        {
510
                                                                                                if (ec.hasAttribute( "text" ) && ec.hasAttribute( "file" ))
511
                                                                                                {
512
                                                                                                        QDomAttr textAttr = ec.attributeNode( "text" );
513
                                                                                                        QDomAttr fileAttr = ec.attributeNode( "file" );
514
                                                                                                        if (tutorialSubMenuItemLast==NULL)
1092 cbradney 515
                                                                                                                tutorialSubMenuItem=new QListViewItem(tutorialQLVI, textAttr.value(), tutorialdir + fileAttr.value());
2006 subik 516
                                                                                                        else
1092 cbradney 517
                                                                                                                tutorialSubMenuItem=new QListViewItem(tutorialQLVI, tutorialSubMenuItemLast, textAttr.value(), tutorialdir + fileAttr.value());
1033 cbradney 518
                                                                                                        if (tutorialSubMenuItem!=NULL)
519
                                                                                                                tutorialSubMenuItemLast=tutorialSubMenuItem;
520
                                                                                                }
521
                                                                                        }
522
                                                                                }
523
                                                                        }
524
                                                                }
525
                                                                nTutorial = nTutorial.nextSibling();
526
                                                        }
527
                                                }
528
                                        }
529
                                }
530
                        }
531
 
532
                }
205 Franz 533
        }
68 Franz 534
}
535
 
560 cbradney 536
void HelpBrowser::itemSelected(QListViewItem *item)
68 Franz 537
{
560 cbradney 538
        if ( !item )
539
                return;
1033 cbradney 540
        if (item->text(1)!=QString::null)
541
        {
1693 craig 542
                QString pfad = ScPaths::instance().docDir();
2008 cbradney 543
                loadHelp(QDir::convertSeparators(pfad + language + "/" + item->text(1)));
1033 cbradney 544
        }
68 Franz 545
}
2006 subik 546
 
547
void HelpBrowser::itemSearchSelected(QListViewItem *item)
548
{
549
        if (item && item->text(1) != QString::null)
550
        {
551
                loadHelp(item->text(1));
552
                findText = searchingEdit->text();
553
                findNext();
554
        }
555
}
556
 
557
void HelpBrowser::searchingInDirectory(QString aDir)
558
{
559
        QDir dir(aDir + "/");
560
        QStringList lst = dir.entryList("*.html");
561
        for (QStringList::Iterator it = lst.begin(); it != lst.end(); ++it)
562
        {
563
                QString fname(aDir + (*it));
564
                QFile f(fname);
565
                if (f.open(IO_ReadOnly))
566
                {
567
                        QTextStream stream(&f);
568
                        QString str = stream.read().lower();
569
                        int cnt = str.contains(searchingEdit->text().lower());
570
                        if (cnt > 0)
571
                        {
572
                                // the remove() hack is here for itemSelected() handling
573
                                QString fullname = fname;
574
                                QString title;
2008 cbradney 575
                                QListViewItem *refItem = listView->findItem(fname.remove(QDir::convertSeparators(ScPaths::instance().docDir()+language + "/")), 1);
2006 subik 576
                                refItem ? title = refItem->text(0) : title = tr("unknown");
577
                                QListViewItem *item = new QListViewItem(searchingView, QString("%1x %2").arg(cnt).arg(title), fullname);
578
                                searchingView->insertItem(item);
579
                        }
580
                        f.close();
581
                }
582
        }
583
        // get dirs - ugly recursion
584
        QStringList dst = dir.entryList("*", QDir::Dirs);
585
        for (QStringList::Iterator it = dst.begin(); it != dst.end(); ++it)
586
                if ((*it)!="." && (*it)!="..")
2008 cbradney 587
                        searchingInDirectory(QDir::convertSeparators(aDir + QString((*it)) + "/"));
2006 subik 588
}
589
 
590
void HelpBrowser::searchingButton_clicked()
591
{
592
        searchingView->clear();
593
        // root files
594
        QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
2008 cbradney 595
        searchingInDirectory(ScPaths::instance().docDir() + language + "/");
2006 subik 596
        QApplication::restoreOverrideCursor();
597
}
598
 
599
void HelpBrowser::find()
600
{
601
        findText = QInputDialog::getText(tr("Find"), tr("Search Term:"), QLineEdit::Normal, findText, 0, this);
602
        if (findText == QString::null)
603
                return;
604
        findNext();
605
}
606
 
607
void HelpBrowser::findNext()
608
{
609
        if (findText == QString::null)
610
        {
611
                find();
612
                return;
613
        }
614
        // find it. finally
615
        textBrowser->find(findText, false, false, true, 0, 0);
616
}
2023 subik 617
 
618
void HelpBrowser::findPrevious()
619
{
620
        if (findText == QString::null)
621
        {
622
                find();
623
                return;
624
        }
625
        // find it. finally
626
        textBrowser->find(findText, false, false, false, 0, 0);
627
}
628
 
629
void HelpBrowser::print()
630
{
631
        QPrinter printer;
632
        printer.setFullPage(true);
633
        if (!printer.setup(this))
634
                return;
635
 
636
        QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
637
        QPainter p(&printer);
638
        QPaintDeviceMetrics metrics(p.device());
639
        int dpix = metrics.logicalDpiX();
640
        int dpiy = metrics.logicalDpiY();
641
        const int margin = 72; // pt
642
        QRect body(margin*dpix/72, margin*dpiy/72, metrics.width()-margin*dpix/72*2, metrics.height()-margin*dpiy/72*2);
643
        QFont font("Helvetica");
644
        QSimpleRichText richText( textBrowser->text(), font, textBrowser->context(), textBrowser->styleSheet(), textBrowser->mimeSourceFactory(), body.height());
645
        richText.setWidth( &p, body.width());
646
        QRect view(body);
647
        int page = 1;
648
        do {
649
                richText.draw(&p, body.left(), body.top(), view, colorGroup());
650
                view.moveBy(0, body.height());
651
                p.translate(0 , -body.height());
652
                p.setFont(font);
653
                p.drawText(view.right() - p.fontMetrics().width(QString::number(page)), view.bottom() + p.fontMetrics().ascent() + 5, QString::number(page));
654
                if (view.top()  >= body.top() + richText.height())
655
                        break;
656
                printer.newPage();
657
                page++;
658
        } while (true);
659
        QApplication::restoreOverrideCursor();
660
}
661