diff options
Diffstat (limited to 'tools/assistant/helpwindow.cpp')
-rw-r--r-- | tools/assistant/helpwindow.cpp | 282 |
1 files changed, 282 insertions, 0 deletions
diff --git a/tools/assistant/helpwindow.cpp b/tools/assistant/helpwindow.cpp new file mode 100644 index 000000000..9b4516fec --- /dev/null +++ b/tools/assistant/helpwindow.cpp @@ -0,0 +1,282 @@ +/********************************************************************** +** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved. +** +** This file is part of the TQt Assistant. +** +** This file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free +** Software Foundation and appearing in the files LICENSE.GPL2 +** and LICENSE.GPL3 included in the packaging of this file. +** Alternatively you may (at your option) use any later version +** of the GNU General Public License if such license has been +** publicly approved by Trolltech ASA (or its successors, if any) +** and the KDE Free TQt Foundation. +** +** Please review the following information to ensure GNU General +** Public Licensing retquirements will be met: +** http://trolltech.com/products/qt/licenses/licensing/opensource/. +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://trolltech.com/products/qt/licenses/licensing/licensingoverview +** or contact the sales department at sales@trolltech.com. +** +** Licensees holding valid TQt Commercial licenses may use this file in +** accordance with the TQt Commercial License Agreement provided with +** the Software. +** +** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, +** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted +** herein. +** +**********************************************************************/ + +#include "helpwindow.h" +#include "mainwindow.h" +#include "tabbedbrowser.h" +#include "helpdialogimpl.h" +#include "config.h" + +#include <qapplication.h> +#include <qclipboard.h> +#include <qurl.h> +#include <qmessagebox.h> +#include <qdir.h> +#include <qfile.h> +#include <qprocess.h> +#include <qpopupmenu.h> +#include <qaction.h> +#include <qfileinfo.h> +#include <qevent.h> +#include <qtextstream.h> +#include <qtextcodec.h> + +#if defined(Q_OS_WIN32) +#include <windows.h> +#endif + +HelpWindow::HelpWindow( MainWindow *w, TQWidget *parent, const char *name ) + : TQTextBrowser( parent, name ), mw( w ), blockScroll( FALSE ), + shiftPressed( FALSE ), newWindow( FALSE ) +{ + connect(this, SIGNAL(forwardAvailable(bool)), this, SLOT(updateForward(bool))); + connect(this, SIGNAL(backwardAvailable(bool)), this, SLOT(updateBackward(bool))); +} + +void HelpWindow::setSource( const TQString &name ) +{ + if ( name.isEmpty() ) + return; + + if (newWindow || shiftPressed) { + removeSelection(); + mw->saveSettings(); + mw->saveToolbarSettings(); + MainWindow *nmw = new MainWindow; + + TQFileInfo currentInfo( source() ); + TQFileInfo linkInfo( name ); + TQString target = name; + if( linkInfo.isRelative() ) + target = currentInfo.dirPath( TRUE ) + "/" + name; + + nmw->setup(); + nmw->move( mw->geometry().topLeft() ); + if ( mw->isMaximized() ) + nmw->showMaximized(); + else + nmw->show(); + nmw->showLink( target ); + return; + } + + if ( name.left( 7 ) == "http://" || name.left( 6 ) == "ftp://" ) { + TQString webbrowser = Config::configuration()->webBrowser(); + if ( webbrowser.isEmpty() ) { +#if defined(Q_OS_WIN32) + QT_WA( { + ShellExecute( winId(), 0, (TCHAR*)name.ucs2(), 0, 0, SW_SHOWNORMAL ); + } , { + ShellExecuteA( winId(), 0, name.local8Bit(), 0, 0, SW_SHOWNORMAL ); + } ); +#elif defined(Q_OS_MACX) + webbrowser = "/usr/bin/open"; +#else + int result = TQMessageBox::information( mw, tr( "Help" ), + tr( "Currently no Web browser is selected.\nPlease use the settings dialog to specify one!\n" ), + "Open", "Cancel" ); + if ( result == 0 ) { + emit chooseWebBrowser(); + webbrowser = Config::configuration()->webBrowser(); + } +#endif + if ( webbrowser.isEmpty() ) + return; + } + TQProcess *proc = new TQProcess(this); + + proc->addArgument( webbrowser ); + TQObject::connect(proc, SIGNAL(processExited()), proc, SLOT(deleteLater())); + proc->addArgument( name ); + proc->start(); + return; + } + + if ( name.right( 3 ) == "pdf" ) { + TQString pdfbrowser = Config::configuration()->pdfReader(); + if ( pdfbrowser.isEmpty() ) { +#if defined(Q_OS_MACX) + pdfbrowser = "/usr/bin/open"; +#else + TQMessageBox::information( mw, + tr( "Help" ), + tr( "No PDF Viewer has been specified\n" + "Please use the settings dialog to specify one!\n" ) ); + return; +#endif + } + TQFileInfo info( pdfbrowser ); + if( !info.exists() ) { + TQMessageBox::information( mw, + tr( "Help" ), + tr( "TQt Assistant is unable to start the PDF Viewer\n\n" + "%1\n\n" + "Please make sure that the executable exists and is located at\n" + "the specified location." ).arg( pdfbrowser ) ); + return; + } + TQProcess *proc = new TQProcess(this); + TQObject::connect(proc, SIGNAL(processExited()), proc, SLOT(deleteLater())); + proc->addArgument( pdfbrowser ); + proc->addArgument( name ); + proc->start(); + + return; + } + + TQUrl u( context(), name ); + if ( !u.isLocalFile() ) { + TQMessageBox::information( mw, tr( "Help" ), tr( "Can't load and display non-local file\n" + "%1" ).arg( name ) ); + return; + } + + setText("<body bgcolor=\"" + paletteBackgroundColor().name() + "\">"); + TQTextBrowser::setSource( name ); +} + + +void HelpWindow::openLinkInNewWindow() +{ + if ( lastAnchor.isEmpty() ) + return; + newWindow = TRUE; + setSource(lastAnchor); + newWindow = FALSE; +} + +void HelpWindow::openLinkInNewWindow( const TQString &link ) +{ + lastAnchor = link; + openLinkInNewWindow(); +} + +void HelpWindow::openLinkInNewPage() +{ + if( lastAnchor.isEmpty() ) + return; + mw->browsers()->newTab( lastAnchor ); + lastAnchor = TQString::null; +} + +void HelpWindow::openLinkInNewPage( const TQString &link ) +{ + lastAnchor = link; + openLinkInNewPage(); +} + +TQPopupMenu *HelpWindow::createPopupMenu( const TQPoint& pos ) +{ + TQPopupMenu *m = new TQPopupMenu(0); + lastAnchor = anchorAt( pos ); + if ( !lastAnchor.isEmpty() ) { + if ( lastAnchor.at( 0 ) == '#' ) { + TQString src = source(); + int hsh = src.find( '#' ); + lastAnchor = ( hsh>=0 ? src.left( hsh ) : src ) + lastAnchor; + } + m->insertItem( tr("Open Link in New Window\tShift+LMB"), + this, SLOT( openLinkInNewWindow() ) ); + m->insertItem( tr("Open Link in New Tab"), + this, SLOT( openLinkInNewPage() ) ); + } + mw->actionNewWindow->addTo( m ); + mw->actionOpenPage->addTo( m ); + mw->actionClosePage->addTo( m ); + m->insertSeparator(); + mw->actionGoPrevious->addTo( m ); + mw->actionGoNext->addTo( m ); + mw->actionGoHome->addTo( m ); + m->insertSeparator(); + mw->actionZoomIn->addTo( m ); + mw->actionZoomOut->addTo( m ); + m->insertSeparator(); + mw->actionEditCopy->addTo( m ); + mw->actionEditFind->addTo( m ); + return m; +} + +void HelpWindow::blockScrolling( bool b ) +{ + blockScroll = b; +} + +void HelpWindow::ensureCursorVisible() +{ + if ( !blockScroll ) + TQTextBrowser::ensureCursorVisible(); +} + +void HelpWindow::contentsMousePressEvent(TQMouseEvent *e) +{ + shiftPressed = ( e->state() & ShiftButton ); + TQTextBrowser::contentsMousePressEvent(e); +} + +void HelpWindow::keyPressEvent(TQKeyEvent *e) +{ + shiftPressed = ( e->state() & ShiftButton ); + TQTextBrowser::keyPressEvent(e); +} + +void HelpWindow::copy() +{ + if (textFormat() == PlainText) { + TQTextEdit::copy(); + } else { + TextFormat oldTf = textFormat(); + setTextFormat(PlainText); + TQString selectText = selectedText(); + selectText.replace("<br>", "\n"); + selectText.replace("\xa0", " "); + selectText.replace(">", ">"); + selectText.replace("<", "<"); + selectText.replace("&", "&"); + + TQClipboard *cb = TQApplication::clipboard(); + if (cb->supportsSelection()) + cb->setText(selectText, TQClipboard::Selection); + cb->setText(selectText, TQClipboard::Clipboard); + setTextFormat(oldTf); + } +} + +void HelpWindow::updateForward(bool fwd) +{ + fwdAvail = fwd; +} + +void HelpWindow::updateBackward(bool back) +{ + backAvail = back; +} |