/**************************************************************************** ** $Id$ ** ** Copyright (C) 1992-2000 Trolltech AS. All rights reserved. ** ** This file is part of an example program for Qt. This example ** program may be used, distributed and modified without limitation. ** *****************************************************************************/ #include "helpwindow.h" #include "richpage.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include HelpWindow::HelpWindow( const QString& home_, const QString& _path, QWidget* parent, const char *name ) : KMainWindow( parent, name, WDestructiveClose ), pathCombo( 0 ), selectedURL() { readHistory(); readBookmarks(); browser = new QTextBrowser( this ); browser->mimeSourceFactory()->setFilePath( _path ); browser->setFrameStyle( QFrame::Panel | QFrame::Sunken ); connect( browser, SIGNAL( textChanged() ), this, SLOT( textChanged() ) ); setCentralWidget( browser ); if ( !home_.isEmpty() ) browser->setSource( home_ ); connect( browser, SIGNAL( highlighted( const QString&) ), statusBar(), SLOT( message( const QString&)) ); resize( 640,700 ); QPopupMenu* file = new QPopupMenu( this ); file->insertItem( "&New Window", this, SLOT( newWindow() ), ALT | Key_N ); file->insertItem( "&Open File", this, SLOT( openFile() ), ALT | Key_O ); file->insertItem( "&Print", this, SLOT( print() ), ALT | Key_P ); file->insertSeparator(); file->insertItem( "&Close", this, SLOT( close() ), ALT | Key_Q ); file->insertItem( "E&xit", qApp, SLOT( closeAllWindows() ), ALT | Key_X ); // The same three icons are used twice each. QIconSet icon_back( QPixmap("back.xpm") ); QIconSet icon_forward( QPixmap("forward.xpm") ); QIconSet icon_home( QPixmap("home.xpm") ); QPopupMenu* go = new QPopupMenu( this ); backwardId = go->insertItem( icon_back, "&Backward", browser, SLOT( backward() ), ALT | Key_Left ); forwardId = go->insertItem( icon_forward, "&Forward", browser, SLOT( forward() ), ALT | Key_Right ); go->insertItem( icon_home, "&Home", browser, SLOT( home() ) ); QPopupMenu* help = new QPopupMenu( this ); help->insertItem( "&About ...", this, SLOT( about() ) ); help->insertItem( "About &Qt ...", this, SLOT( aboutQt() ) ); hist = new QPopupMenu( this ); QStringList::Iterator it = history.begin(); for ( ; it != history.end(); ++it ) mHistory[ hist->insertItem( *it ) ] = *it; connect( hist, SIGNAL( activated( int ) ), this, SLOT( histChosen( int ) ) ); bookm = new QPopupMenu( this ); bookm->insertItem( tr( "Add Bookmark" ), this, SLOT( addBookmark() ) ); bookm->insertSeparator(); QStringList::Iterator it2 = bookmarks.begin(); for ( ; it2 != bookmarks.end(); ++it2 ) mBookmarks[ bookm->insertItem( *it2 ) ] = *it2; connect( bookm, SIGNAL( activated( int ) ), this, SLOT( bookmChosen( int ) ) ); menuBar()->insertItem( tr("&File"), file ); menuBar()->insertItem( tr("&Go"), go ); menuBar()->insertItem( tr( "History" ), hist ); menuBar()->insertItem( tr( "Bookmarks" ), bookm ); menuBar()->insertSeparator(); menuBar()->insertItem( tr("&Help"), help ); menuBar()->setItemEnabled( forwardId, false); menuBar()->setItemEnabled( backwardId, false); connect( browser, SIGNAL( backwardAvailable( bool ) ), this, SLOT( setBackwardAvailable( bool ) ) ); connect( browser, SIGNAL( forwardAvailable( bool ) ), this, SLOT( setForwardAvailable( bool ) ) ); QToolBar* toolbar = new QToolBar( this ); addToolBar( toolbar, "Toolbar"); QToolButton* button; button = new QToolButton( icon_back, tr("Backward"), "", browser, SLOT(backward()), toolbar ); connect( browser, SIGNAL( backwardAvailable(bool) ), button, SLOT( setEnabled(bool) ) ); button->setEnabled( false ); button = new QToolButton( icon_forward, tr("Forward"), "", browser, SLOT(forward()), toolbar ); connect( browser, SIGNAL( forwardAvailable(bool) ), button, SLOT( setEnabled(bool) ) ); button->setEnabled( false ); button = new QToolButton( icon_home, tr("Home"), "", browser, SLOT(home()), toolbar ); toolbar->addSeparator(); pathCombo = new QComboBox( true, toolbar ); connect( pathCombo, SIGNAL( activated( const QString & ) ), this, SLOT( pathSelected( const QString & ) ) ); toolbar->setStretchableWidget( pathCombo ); setRightJustification( true ); setDockEnabled( DockLeft, false ); setDockEnabled( DockRight, false ); pathCombo->insertItem( home_ ); browser->setFocus(); } void HelpWindow::setBackwardAvailable( bool b) { menuBar()->setItemEnabled( backwardId, b); } void HelpWindow::setForwardAvailable( bool b) { menuBar()->setItemEnabled( forwardId, b); } void HelpWindow::textChanged() { if ( browser->documentTitle().isNull() ) setCaption( browser->context() ); else setCaption( browser->documentTitle() ) ; selectedURL = caption(); if ( !selectedURL.isEmpty() && pathCombo ) { bool exists = false; int i; for ( i = 0; i < pathCombo->count(); ++i ) { if ( pathCombo->text( i ) == selectedURL ) { exists = true; break; } } if ( !exists ) { pathCombo->insertItem( selectedURL, 0 ); pathCombo->setCurrentItem( 0 ); mHistory[ hist->insertItem( selectedURL ) ] = selectedURL; } else pathCombo->setCurrentItem( i ); selectedURL = QString::null; } } HelpWindow::~HelpWindow() { history.clear(); QMap::Iterator it = mHistory.begin(); for ( ; it != mHistory.end(); ++it ) history.append( *it ); QFile f( QDir::currentDirPath() + "/.history" ); f.open( IO_WriteOnly ); QDataStream s( &f ); s << history; f.close(); bookmarks.clear(); QMap::Iterator it2 = mBookmarks.begin(); for ( ; it2 != mBookmarks.end(); ++it2 ) bookmarks.append( *it2 ); QFile f2( QDir::currentDirPath() + "/.bookmarks" ); f2.open( IO_WriteOnly ); QDataStream s2( &f2 ); s2 << bookmarks; f2.close(); } void HelpWindow::about() { QMessageBox::about( this, "HelpViewer Example", "

This example implements a simple HTML help viewer " "using Qt's rich text capabilities

" "

It's just about 100 lines of C++ code, so don't expect too much :-)

" ); } void HelpWindow::aboutQt() { QMessageBox::aboutQt( this, "QBrowser" ); } void HelpWindow::openFile() { #ifndef QT_NO_FILEDIALOG QString fn = QFileDialog::getOpenFileName( QString::null, QString::null, this ); if ( !fn.isEmpty() ) browser->setSource( fn ); #endif } void HelpWindow::newWindow() { ( new HelpWindow(browser->source(), "qbrowser") )->show(); } #define KDE_PRINT void HelpWindow::print() { #ifdef KDE_PRINT KPrinter printer; #else QPrinter printer; #endif printer.setFullPage(true); printer.setDocName("Help Viewer"); printer.setDocFileName("my_document"); #ifdef KDE_PRINT printer.addDialogPage(new RichPage()); printer.addStandardPage(KPrinter::FilesPage); #endif if ( printer.setup(this) ) { QPainter p( &printer ); QPaintDeviceMetrics metrics(p.device()); int dpix = metrics.logicalDpiX(); int dpiy = metrics.logicalDpiY(); #ifdef KDE_PRINT const int margin = printer.option("app-rich-margin").toInt(); // pt #else const int margin = 72; // pt #endif QRect body(margin*dpix/72, margin*dpiy/72, metrics.width()-margin*dpix/72*2, metrics.height()-margin*dpiy/72*2 ); #ifdef KDE_PRINT QFont font(printer.option("app-rich-fontname"), printer.option("app-rich-fontsize").toInt()); #else QFont font("times",10); #endif QSimpleRichText richText( browser->text(), font, browser->context(), browser->styleSheet(), browser->mimeSourceFactory(), body.height() ); richText.setWidth( &p, body.width() ); QRect view( body ); int page = 1; do { richText.draw( &p, body.left(), body.top(), view, colorGroup() ); view.moveBy( 0, body.height() ); p.translate( 0 , -body.height() ); p.setFont( font ); p.drawText( view.right() - p.fontMetrics().width( QString::number(page) ), view.bottom() + p.fontMetrics().ascent() + 5, QString::number(page) ); if ( view.top() >= richText.height() ) break; printer.newPage(); page++; } while (true); } } void HelpWindow::pathSelected( const QString &_path ) { browser->setSource( _path ); QMap::Iterator it = mHistory.begin(); bool exists = false; for ( ; it != mHistory.end(); ++it ) { if ( *it == _path ) { exists = true; break; } } if ( !exists ) mHistory[ hist->insertItem( _path ) ] = _path; } void HelpWindow::readHistory() { if ( QFile::exists( QDir::currentDirPath() + "/.history" ) ) { QFile f( QDir::currentDirPath() + "/.history" ); f.open( IO_ReadOnly ); QDataStream s( &f ); s >> history; f.close(); while ( history.count() > 20 ) history.remove( history.begin() ); } } void HelpWindow::readBookmarks() { if ( QFile::exists( QDir::currentDirPath() + "/.bookmarks" ) ) { QFile f( QDir::currentDirPath() + "/.bookmarks" ); f.open( IO_ReadOnly ); QDataStream s( &f ); s >> bookmarks; f.close(); } } void HelpWindow::histChosen( int i ) { if ( mHistory.contains( i ) ) browser->setSource( mHistory[ i ] ); } void HelpWindow::bookmChosen( int i ) { if ( mBookmarks.contains( i ) ) browser->setSource( mBookmarks[ i ] ); } void HelpWindow::addBookmark() { mBookmarks[ bookm->insertItem( caption() ) ] = caption(); } #include "helpwindow.moc"