Subversion Repositories Scribus

Rev

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

Rev Author Line No. Line
563 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
***************************************************************************/
558 cbradney 20
 
3 paul 21
#include "helpbrowser.h"
22
#include "helpbrowser.moc"
558 cbradney 23
 
3 paul 24
#include <qvariant.h>
558 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>
558 cbradney 33
#include <qtoolbutton.h>
34
#include <qwhatsthis.h>
3 paul 35
#include <qimage.h>
36
#include <qpixmap.h>
558 cbradney 37
#include <qpopupmenu.h>
38
#include <qfileinfo.h>
3 paul 39
#include <qtextcodec.h>
558 cbradney 40
#include <qdom.h>
1032 cbradney 41
#include <qdir.h>
785 cbradney 42
#include <qsplitter.h>
128 Franz 43
 
612 cbradney 44
#ifdef _MSC_VER
1032 cbradney 45
#if (_MSC_VER >= 1200)
46
#include "win-config.h"
47
#endif
128 Franz 48
#else
1032 cbradney 49
#include "config.h"
128 Franz 50
#endif
51
 
3 paul 52
extern QPixmap loadIcon(QString nam);
53
 
558 cbradney 54
 
563 cbradney 55
HelpBrowser::HelpBrowser( QWidget* parent, QString caption, QString guiLanguage, QString jumpToSection, QString jumpToFile)
56
        : QWidget( parent, "Help", WType_TopLevel | WDestructiveClose )
3 paul 57
{
558 cbradney 58
        QString fileName;
563 cbradney 59
        mHistory.clear();
60
        struct histd his;
1091 cbradney 61
        language = guiLanguage=="" ? "en" : guiLanguage.left(2);
563 cbradney 62
        helpBrowsermainLayout = new QVBoxLayout( this);
63
        buttonLayout = new QHBoxLayout;
64
        buttonLayout->setSpacing( 6 );
65
        buttonLayout->setMargin( 2 );
3 paul 66
 
563 cbradney 67
        homeButton = new QToolButton( this, "homeButton" );
68
        homeButton->setText( "" );
69
        homeButton->setPixmap(loadIcon("gohome.png"));
785 cbradney 70
        homeButton->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed, homeButton->sizePolicy().hasHeightForWidth() ) );
563 cbradney 71
        buttonLayout->addWidget( homeButton );
3 paul 72
 
563 cbradney 73
        histMenu = new QPopupMenu( this );
74
        backButton = new QToolButton( this, "backButton" );
75
        backButton->setPixmap(loadIcon("back.png"));
785 cbradney 76
        backButton->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed, backButton->sizePolicy().hasHeightForWidth() ) );
563 cbradney 77
        backButton->setPopup(histMenu);
78
        backButton->setPopupDelay(0);
79
        buttonLayout->addWidget( backButton );
3 paul 80
 
563 cbradney 81
        forwButton = new QToolButton( this, "forwButton" );
82
        forwButton->setPixmap(loadIcon("forward.png"));
785 cbradney 83
        forwButton->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed, forwButton->sizePolicy().hasHeightForWidth() ) );
563 cbradney 84
        buttonLayout->addWidget( forwButton );
85
        QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
86
        buttonLayout->addItem( spacer );
558 cbradney 87
        helpBrowsermainLayout->addLayout( buttonLayout );
88
 
563 cbradney 89
        helpBrowserLayout = new QHBoxLayout;
785 cbradney 90
        splitter = new QSplitter(this, "splitter");
91
        splitter->setChildrenCollapsible( false );
92
        helpBrowserLayout->addWidget( splitter );
558 cbradney 93
 
785 cbradney 94
        tabWidget = new QTabWidget( splitter, "tabWidget" );
95
        //tabWidget = new QTabWidget( this, "tabWidget" );
96
        splitter->setResizeMode(tabWidget, QSplitter::Stretch );
97
        tabWidget->setSizePolicy( QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Expanding, false) );
563 cbradney 98
        tabContents = new QWidget( tabWidget, "tabContents" );
99
        tabLayout = new QHBoxLayout( tabContents, 11, 6, "tabLayout");
558 cbradney 100
 
563 cbradney 101
        listView = new QListView( tabContents, "listView" );
102
        listView->addColumn( tr( "Contents" ) );
1096 cbradney 103
        listView->addColumn( tr( "Link" ) , 0 );
104
//      listView->addColumn( tr( "Link" ) );
105
        listView->setColumnWidthMode( 0, QListView::Maximum );
106
        listView->setColumnWidthMode( 1, QListView::Manual );
558 cbradney 107
        listView->setSorting(-1,-1);
108
        listView->setRootIsDecorated( true );
109
        listView->setSelectionMode(QListView::Single);
110
        listView->setDefaultRenameAction(QListView::Reject);
111
        listView->clear();
563 cbradney 112
        tabLayout->addWidget( listView );
113
 
114
        tabWidget->insertTab( tabContents, QString("Contents") );
785 cbradney 115
        //helpBrowserLayout->addWidget( tabWidget );
558 cbradney 116
 
785 cbradney 117
        textBrowser = new QTextBrowser( splitter, "textBrowser" );
118
        splitter->setResizeMode(textBrowser, QSplitter::Stretch);
119
        //textBrowser = new QTextBrowser( this, "textBrowser" );
120
        textBrowser->setSizePolicy( QSizePolicy( QSizePolicy::Ignored, QSizePolicy::Expanding, false ) );
563 cbradney 121
        textBrowser->setFrameShape( QTextBrowser::StyledPanel );
785 cbradney 122
        //helpBrowserLayout->addWidget( textBrowser );
563 cbradney 123
        helpBrowsermainLayout->addLayout( helpBrowserLayout );
558 cbradney 124
 
563 cbradney 125
        languageChange();
126
        resize( QSize(602, 491).expandedTo(minimumSizeHint()) );
127
        clearWState( WState_Polished );
1091 cbradney 128
        loadMenu();
558 cbradney 129
        listView->header()->hide();
1091 cbradney 130
        jumpToHelpSection(jumpToSection, jumpToFile );
558 cbradney 131
 
132
        connect( homeButton, SIGNAL( clicked() ), textBrowser, SLOT( home() ) );
133
        connect( forwButton, SIGNAL( clicked() ), textBrowser, SLOT( forward() ) );
134
        connect( backButton, SIGNAL( clicked() ), textBrowser, SLOT( backward() ) );
563 cbradney 135
        connect( histMenu, SIGNAL(activated(int)), this, SLOT(histChosen(int)));
136
        connect( listView, SIGNAL(clicked( QListViewItem *)), this, SLOT(itemSelected( QListViewItem *)));
558 cbradney 137
}
138
 
139
HelpBrowser::~HelpBrowser()
140
{
563 cbradney 141
        // no need to delete child widgets, Qt does it all for us
558 cbradney 142
}
143
 
144
void HelpBrowser::languageChange()
145
{
563 cbradney 146
        setCaption( tr( "Scribus Online Help" ) );
147
        listView->header()->setLabel( 0, tr( "Contents" ) );
148
        listView->clear();
558 cbradney 149
 
563 cbradney 150
        tabWidget->changeTab( tabContents, tr( "Contents" ) );
558 cbradney 151
}
152
 
153
 
154
void HelpBrowser::sourceChanged(const QString& url)
155
{
563 cbradney 156
        bool inList = false;
157
        struct histd his;
158
        QString title = "";
159
        title = textBrowser->documentTitle();
160
        if (title == "")
161
                title = url;
785 cbradney 162
        for (QMap<int, histd>::Iterator it = mHistory.begin(); it != mHistory.end(); ++it)
563 cbradney 163
        {
164
                if (it.data().Title == title)
165
                        inList = true;
166
        }
167
        if (!inList)
168
        {
169
                his.Title = title;
170
                his.Url = url;
171
                mHistory[histMenu->insertItem(title)] = his;
172
        }
173
        if (mHistory.count() > 15)
174
        {
175
                int itk = histMenu->idAt(0);
176
                mHistory.remove(itk);
177
                histMenu->removeItem(itk);
178
        }
558 cbradney 179
}
180
 
181
void HelpBrowser::histChosen(int i)
182
{
563 cbradney 183
        if (mHistory.contains(i))
184
                textBrowser->setSource(mHistory[i].Url);
558 cbradney 185
}
186
 
1091 cbradney 187
void HelpBrowser::jumpToHelpSection(QString jumpToSection, QString jumpToFile)
558 cbradney 188
{
189
        QString toLoad;
190
 
563 cbradney 191
        if (jumpToFile=="")
192
        {
870 cbradney 193
                QString pfad = DOCDIR;
1091 cbradney 194
                toLoad = pfad + language + "/"; //clean this later to handle 5 char locales
563 cbradney 195
                if (jumpToSection=="")
196
                {
1096 cbradney 197
                        toLoad+=listView->firstChild()->text(1);
558 cbradney 198
                        listView->setSelected( listView->firstChild(), true );
205 Franz 199
                }
563 cbradney 200
                else if (jumpToSection=="scripter")
201
                {
558 cbradney 202
                        toLoad+="scripter1.html";
203
                        QListViewItemIterator it(listView);
563 cbradney 204
                        while (it.current())
205
                        {
558 cbradney 206
                                if (it.current()->text(1)=="scripter1.html")
207
                                        listView->setSelected( it.current(), true );
208
                                if (it.current()->text(1)=="developers.html")
209
                                        it.current()->setOpen( true );
210
                                ++it;
211
                        }
212
                }
205 Franz 213
        }
558 cbradney 214
        else
563 cbradney 215
                toLoad=jumpToFile;
3 paul 216
 
558 cbradney 217
        loadHelp(toLoad);
3 paul 218
}
219
 
558 cbradney 220
void HelpBrowser::loadHelp(QString filename)
68 Franz 221
{
75 Franz 222
        struct histd his;
563 cbradney 223
        bool Avail = true;
558 cbradney 224
        QString toLoad;
563 cbradney 225
        QFileInfo fi;
226
        fi = QFileInfo(filename);
1099 cbradney 227
        if (fi.fileName().length()>0)
563 cbradney 228
        {
1099 cbradney 229
                if (fi.exists())
230
                        toLoad=filename;
231
                else
563 cbradney 232
                {
1099 cbradney 233
                        QString pfad = DOCDIR;
234
                        toLoad = pfad + "en/index.html";
235
                        language="en";
236
                        fi = QFileInfo(toLoad);
237
                        if (!fi.exists())
238
                        {
239
                                textBrowser->setText("<h2>"+ tr("Sorry, no manual available! Please see: http://docs.scribus.net for updated docs\nand www.scribus.net for downloads.")+"</h2>");
240
                                Avail = false;
241
                        }
563 cbradney 242
                }
243
        }
1099 cbradney 244
        else
245
                Avail=false;
563 cbradney 246
        if (Avail)
247
        {
248
                textBrowser->setSource(toLoad);
249
                his.Title = textBrowser->documentTitle();
250
                if (his.Title == "")
251
                        his.Title = toLoad;
252
                his.Url = toLoad;
253
                mHistory[histMenu->insertItem(his.Title)] = his;
254
        }
558 cbradney 255
}
256
 
1091 cbradney 257
void HelpBrowser::loadMenu()
558 cbradney 258
{
870 cbradney 259
        QString pfad = DOCDIR;
785 cbradney 260
        QString toLoad;
1091 cbradney 261
        QString pfad2 = pfad + language + "/menu.xml";
563 cbradney 262
        QFileInfo fi = QFileInfo(pfad2);
785 cbradney 263
 
794 cbradney 264
        if (fi.exists())
265
                toLoad=pfad2;
266
        else
267
        {
870 cbradney 268
                toLoad = pfad + "en/menu.xml";
1091 cbradney 269
                language="en";
785 cbradney 270
                fi = QFileInfo(toLoad);
271
                qDebug("Scribus help in your selected language does not exist, trying English. Otherwise, please visit http://docs.scribus.net.");
272
        }
273
 
558 cbradney 274
        if (fi.exists())
563 cbradney 275
        {
558 cbradney 276
                QDomDocument doc( "menuentries" );
785 cbradney 277
                QFile file( toLoad );
558 cbradney 278
                if ( !file.open( IO_ReadOnly ) )
279
                        return;
563 cbradney 280
                if ( !doc.setContent( &file ) )
281
                {
558 cbradney 282
                        file.close();
283
                        return;
284
                }
285
                file.close();
286
 
287
                QDomElement docElem = doc.documentElement();
288
                QDomNode n = docElem.firstChild();
289
                QListViewItem *qlvi=NULL, *qlvi2=NULL, *qlvi3=NULL, *qlvi4=NULL, *qlvi5=NULL, *qlvi6=NULL;
1032 cbradney 290
                QListViewItem *tutorialsMenuItem;
291
                bool haveTutorials=false;
558 cbradney 292
 
563 cbradney 293
                while( !n.isNull() )
294
                {
558 cbradney 295
                        QDomElement e = n.toElement(); // try to convert the node to an element.
563 cbradney 296
                        if( !e.isNull() )
297
                        {
298
                                if (e.hasAttribute( "text" ) && e.hasAttribute( "file" ))
299
                                {
558 cbradney 300
                                        QDomAttr textAttr = e.attributeNode( "text" );
301
                                        QDomAttr fileAttr = e.attributeNode( "file" );
302
                                        if (qlvi2==NULL)
303
                                                qlvi=new QListViewItem(listView, textAttr.value(), fileAttr.value());
563 cbradney 304
                                        else
1032 cbradney 305
                                                qlvi=new QListViewItem(listView, qlvi2, textAttr.value(), fileAttr.value());
1104 cbradney 306
                                        if (qlvi!=NULL && e.hasAttribute( "section" ))
563 cbradney 307
                                        {
1104 cbradney 308
                                                QDomAttr sectionAttr = e.attributeNode( "section" );
309
                                                if (sectionAttr.value()=="tutorials" && !haveTutorials)
310
                                                {
311
                                                        haveTutorials=true;
312
                                                        tutorialsMenuItem=qlvi;
313
                                                }
558 cbradney 314
                                        }
1032 cbradney 315
 
558 cbradney 316
                                        if (qlvi!=NULL)
317
                                                qlvi2=qlvi;
318
                                }
319
 
320
                                QDomNodeList nl=n.childNodes();
563 cbradney 321
                                for(uint i=0 ; i<= nl.count() ; i++)
322
                                {
558 cbradney 323
                                        QDomNode child=nl.item(i);
563 cbradney 324
                                        if (child.isElement())
325
                                        {
558 cbradney 326
                                                QDomElement ec = child.toElement();    
563 cbradney 327
                                                if (!ec.isNull())
328
                                                {
329
                                                        if (ec.hasAttribute( "text" ) && ec.hasAttribute( "file" ))
330
                                                        {
558 cbradney 331
                                                                QDomAttr textAttr = ec.attributeNode( "text" );
332
                                                                QDomAttr fileAttr = ec.attributeNode( "file" );
333
                                                                if (qlvi4==NULL)
334
                                                                        qlvi3=new QListViewItem(qlvi, textAttr.value(), fileAttr.value());
563 cbradney 335
                                                                else
1032 cbradney 336
                                                                        qlvi3=new QListViewItem(qlvi, qlvi4, textAttr.value(), fileAttr.value());
1104 cbradney 337
                                                                if (qlvi3!=NULL && ec.hasAttribute( "section" ))
563 cbradney 338
                                                                {
1104 cbradney 339
                                                                        QDomAttr sectionAttr = e.attributeNode( "section" );
340
                                                                        if (sectionAttr.value()=="tutorials" && !haveTutorials)
341
                                                                        {
342
                                                                                haveTutorials=true;
343
                                                                                tutorialsMenuItem=qlvi3;
344
                                                                        }
558 cbradney 345
                                                                }
346
                                                                if (qlvi3!=NULL)
347
                                                                        qlvi4=qlvi3;
348
                                                        }
349
                                                        //3rd level
350
                                                        QDomNodeList nl2=child.childNodes();
563 cbradney 351
                                                        for(uint i=0 ; i<= nl2.count() ; i++)
352
                                                        {
558 cbradney 353
                                                                QDomNode childchild=nl2.item(i);
563 cbradney 354
                                                                if (childchild.isElement())
355
                                                                {
558 cbradney 356
                                                                        QDomElement ecc = childchild.toElement();      
563 cbradney 357
                                                                        if (!ecc.isNull())
358
                                                                        {
359
                                                                                if (ecc.hasAttribute( "text" ) && ecc.hasAttribute( "file" ))
360
                                                                                {
558 cbradney 361
                                                                                        QDomAttr textAttr = ecc.attributeNode( "text" );
362
                                                                                        QDomAttr fileAttr = ecc.attributeNode( "file" );
363
                                                                                        if (qlvi6==NULL)
364
                                                                                                qlvi5=new QListViewItem(qlvi3, textAttr.value(), fileAttr.value());
563 cbradney 365
                                                                                        else
1032 cbradney 366
                                                                                                qlvi5=new QListViewItem(qlvi3, qlvi6, textAttr.value(), fileAttr.value());
1104 cbradney 367
                                                                                        if (qlvi5!=NULL && ecc.hasAttribute( "section" ))
563 cbradney 368
                                                                                        {
1104 cbradney 369
                                                                                                QDomAttr sectionAttr = e.attributeNode( "section" );
370
                                                                                                if (sectionAttr.value()=="tutorials" && !haveTutorials)
371
                                                                                                {
372
                                                                                                        haveTutorials=true;
373
                                                                                                        tutorialsMenuItem=qlvi5;
374
                                                                                                }
558 cbradney 375
                                                                                        }
376
                                                                                }
377
                                                                                if (qlvi5!=NULL)
378
                                                                                        qlvi6=qlvi5;
379
                                                                        }
380
                                                                }
381
                                                        }
382
                                                }
383
                                        }
384
                                }
385
                        }
386
                        n = n.nextSibling();
387
                }
1032 cbradney 388
                //scan for installed tutorials
389
                if (haveTutorials)
390
                {
391
                        QString path = DOCDIR;
1091 cbradney 392
                        path += language + "/tutorials/";
1032 cbradney 393
                        QDir dir(path, "*", QDir::Name, QDir::Dirs | QDir::NoSymLinks);
394
 
395
                        if (dir.exists() && (dir.count() != 0))
396
                        {
397
                                for (uint i = 0; i < dir.count(); ++i)
398
                                {
399
                                        if (dir[i]!="." && dir[i]!="..")
400
                                        {
1091 cbradney 401
                                                QString tutorialdir = "tutorials/" + dir[i] + "/";
1032 cbradney 402
                                                QFileInfo file(path + dir[i] + "/menu.xml");
403
                                                if (file.exists())  // menu.xml exists for tutorial
404
                                                {
405
                                                        QDomDocument docTutorial( "tutorialmenuentries" );
406
                                                        QFile fileTutorialMenu( file.filePath() );
407
                                                        if ( !fileTutorialMenu.open( IO_ReadOnly ) )
408
                                                                break;
409
                                                        if ( !docTutorial.setContent( &fileTutorialMenu ) )
410
                                                        {
411
                                                                fileTutorialMenu.close();
412
                                                                break;
413
                                                        }
414
                                                        fileTutorialMenu.close();
415
 
416
                                                        QDomElement docElemTutorial = docTutorial.documentElement();
417
                                                        QDomNode nTutorial = docElemTutorial.firstChild();
418
                                                        QListViewItem *tutorialQLVI=NULL;
419
 
420
                                                        while( !nTutorial.isNull() )
421
                                                        {
422
                                                                QDomElement eTutorial = nTutorial.toElement(); // try to convert the node to an element.
423
                                                                if( !eTutorial.isNull() )
424
                                                                {
425
                                                                        if (tutorialsMenuItem!=NULL && eTutorial.hasAttribute( "text" ) && eTutorial.hasAttribute( "file" ))
426
                                                                        {
427
                                                                                QDomAttr textAttr = eTutorial.attributeNode( "text" );
428
                                                                                QDomAttr fileAttr = eTutorial.attributeNode( "file" );
1091 cbradney 429
                                                                                tutorialQLVI=new QListViewItem(tutorialsMenuItem, textAttr.value(), tutorialdir + fileAttr.value());
1032 cbradney 430
                                                                        }
431
                                                                        QDomNodeList nl=nTutorial.childNodes();
432
                                                                        QListViewItem *tutorialSubMenuItem, *tutorialSubMenuItemLast=NULL;
1091 cbradney 433
                                                                        for(uint j=0 ; j<= nl.count() ; j++)
1032 cbradney 434
                                                                        {
1091 cbradney 435
                                                                                QDomNode child=nl.item(j);
1032 cbradney 436
                                                                                if (child.isElement())
437
                                                                                {
438
                                                                                        QDomElement ec = child.toElement();
439
                                                                                        if (!ec.isNull())
440
                                                                                        {
441
                                                                                                if (ec.hasAttribute( "text" ) && ec.hasAttribute( "file" ))
442
                                                                                                {
443
                                                                                                        QDomAttr textAttr = ec.attributeNode( "text" );
444
                                                                                                        QDomAttr fileAttr = ec.attributeNode( "file" );
445
                                                                                                        if (tutorialSubMenuItemLast==NULL)
1091 cbradney 446
                                                                                                                tutorialSubMenuItem=new QListViewItem(tutorialQLVI, textAttr.value(), tutorialdir + fileAttr.value());
1032 cbradney 447
                                                                                                        else
1091 cbradney 448
                                                                                                                tutorialSubMenuItem=new QListViewItem(tutorialQLVI, tutorialSubMenuItemLast, textAttr.value(), tutorialdir + fileAttr.value());
1032 cbradney 449
                                                                                                        if (tutorialSubMenuItem!=NULL)
450
                                                                                                                tutorialSubMenuItemLast=tutorialSubMenuItem;
451
                                                                                                }
452
                                                                                        }
453
                                                                                }
454
                                                                        }
455
                                                                }
456
                                                                nTutorial = nTutorial.nextSibling();
457
                                                        }
458
                                                }
459
                                        }
460
                                }
461
                        }
462
 
463
                }
205 Franz 464
        }
68 Franz 465
}
466
 
558 cbradney 467
void HelpBrowser::itemSelected(QListViewItem *item)
68 Franz 468
{
558 cbradney 469
        if ( !item )
470
                return;
1032 cbradney 471
        if (item->text(1)!=QString::null)
870 cbradney 472
        {
473
                QString pfad = DOCDIR;
1091 cbradney 474
                loadHelp(pfad + language + "/" + item->text(1));
870 cbradney 475
        }
68 Franz 476
}