summaryrefslogtreecommitdiffstats
path: root/khelpcenter/mainwindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'khelpcenter/mainwindow.cpp')
-rw-r--r--khelpcenter/mainwindow.cpp477
1 files changed, 477 insertions, 0 deletions
diff --git a/khelpcenter/mainwindow.cpp b/khelpcenter/mainwindow.cpp
new file mode 100644
index 000000000..d99dfcb2b
--- /dev/null
+++ b/khelpcenter/mainwindow.cpp
@@ -0,0 +1,477 @@
+ /*
+ * This file is part of the Trinity Help Center
+ *
+ * Copyright (C) 1999 Matthias Elter ([email protected])
+ * 2001 Stephan Kulow ([email protected])
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "mainwindow.h"
+
+#include "history.h"
+#include "view.h"
+#include "searchengine.h"
+#include "fontdialog.h"
+#include "prefs.h"
+
+#include <tdeapplication.h>
+#include <tdeconfig.h>
+#include <dcopclient.h>
+#include <kiconloader.h>
+#include <kmimemagic.h>
+#include <krun.h>
+#include <tdeaboutdata.h>
+#include <kdebug.h>
+#include <tdehtmlview.h>
+#include <tdehtml_settings.h>
+#include <tdeaction.h>
+#include <kstatusbar.h>
+#include <tdestdaccel.h>
+#include <kdialogbase.h>
+
+#include <tqsplitter.h>
+#include <tqtextedit.h>
+#include <tqlayout.h>
+
+#include <stdlib.h>
+#include <assert.h>
+
+using namespace KHC;
+
+class LogDialog : public KDialogBase
+{
+ public:
+ LogDialog( TQWidget *parent = 0 )
+ : KDialogBase( Plain, i18n("Search Error Log"), Ok, Ok, parent, 0,
+ false )
+ {
+ TQFrame *topFrame = plainPage();
+
+ TQBoxLayout *topLayout = new TQVBoxLayout( topFrame );
+
+ mTextView = new TQTextEdit( topFrame );
+ mTextView->setTextFormat( LogText );
+ topLayout->addWidget( mTextView );
+
+ resize( configDialogSize( "logdialog" ) );
+ }
+
+ ~LogDialog()
+ {
+ saveDialogSize( "logdialog" );
+ }
+
+ void setLog( const TQString &log )
+ {
+ mTextView->setText( log );
+ }
+
+ private:
+ TQTextEdit *mTextView;
+};
+
+
+MainWindow::MainWindow()
+ : TDEMainWindow(0, "MainWindow"), DCOPObject( "KHelpCenterIface" ),
+ mLogDialog( 0 )
+{
+ mSplitter = new TQSplitter( this );
+
+ mDoc = new View( mSplitter, 0, TQT_TQOBJECT(this), 0, TDEHTMLPart::DefaultGUI, actionCollection() );
+ connect( mDoc, TQT_SIGNAL( setWindowCaption( const TQString & ) ),
+ TQT_SLOT( setCaption( const TQString & ) ) );
+ connect( mDoc, TQT_SIGNAL( setStatusBarText( const TQString & ) ),
+ TQT_SLOT( statusBarMessage( const TQString & ) ) );
+ connect( mDoc, TQT_SIGNAL( onURL( const TQString & ) ),
+ TQT_SLOT( statusBarMessage( const TQString & ) ) );
+ connect( mDoc, TQT_SIGNAL( started( TDEIO::Job * ) ),
+ TQT_SLOT( slotStarted( TDEIO::Job * ) ) );
+ connect( mDoc, TQT_SIGNAL( completed() ),
+ TQT_SLOT( documentCompleted() ) );
+ connect( mDoc, TQT_SIGNAL( searchResultCacheAvailable() ),
+ TQT_SLOT( enableLastSearchAction() ) );
+
+ connect( mDoc, TQT_SIGNAL( selectionChanged() ),
+ TQT_SLOT( enableCopyTextAction() ) );
+
+ statusBar()->insertItem(i18n("Preparing Index"), 0, 1);
+ statusBar()->setItemAlignment(0, AlignLeft | AlignVCenter);
+
+ connect( mDoc->browserExtension(),
+ TQT_SIGNAL( openURLRequest( const KURL &,
+ const KParts::URLArgs & ) ),
+ TQT_SLOT( slotOpenURLRequest( const KURL &,
+ const KParts::URLArgs & ) ) );
+
+ mNavigator = new Navigator( mDoc, mSplitter, "nav" );
+ connect( mNavigator, TQT_SIGNAL( itemSelected( const TQString & ) ),
+ TQT_SLOT( viewUrl( const TQString & ) ) );
+ connect( mNavigator, TQT_SIGNAL( glossSelected( const GlossaryEntry & ) ),
+ TQT_SLOT( slotGlossSelected( const GlossaryEntry & ) ) );
+
+ mSplitter->moveToFirst(mNavigator);
+ mSplitter->setResizeMode(mNavigator, TQSplitter::KeepSize);
+ setCentralWidget( mSplitter );
+ TQValueList<int> sizes;
+ sizes << 220 << 580;
+ mSplitter->setSizes(sizes);
+ setGeometry(366, 0, 800, 600);
+
+ TDEConfig *cfg = kapp->config();
+ {
+ TDEConfigGroupSaver groupSaver( cfg, "General" );
+ if ( cfg->readBoolEntry( "UseKonqSettings", true ) ) {
+ TDEConfig konqCfg( "konquerorrc" );
+ const_cast<TDEHTMLSettings *>( mDoc->settings() )->init( &konqCfg );
+ }
+ const int zoomFactor = cfg->readNumEntry( "Font zoom factor", 100 );
+ mDoc->setZoomFactor( zoomFactor );
+ }
+
+ setupActions();
+
+ actionCollection()->addDocCollection( mDoc->actionCollection() );
+
+ setupGUI(ToolBar | Keys | StatusBar | Create);
+ setAutoSaveSettings();
+
+ History::self().installMenuBarHook( this );
+
+ connect( &History::self(), TQT_SIGNAL( goInternalUrl( const KURL & ) ),
+ mNavigator, TQT_SLOT( openInternalUrl( const KURL & ) ) );
+ connect( &History::self(), TQT_SIGNAL( goUrl( const KURL & ) ),
+ mNavigator, TQT_SLOT( selectItem( const KURL & ) ) );
+
+ statusBarMessage(i18n("Ready"));
+ enableCopyTextAction();
+
+ readConfig();
+}
+
+MainWindow::~MainWindow()
+{
+ writeConfig();
+}
+
+void MainWindow::enableCopyTextAction()
+{
+ mCopyText->setEnabled( mDoc->hasSelection() );
+}
+
+void MainWindow::saveProperties( TDEConfig *config )
+{
+ kdDebug()<<"void MainWindow::saveProperties( TDEConfig *config )" << endl;
+ config->writePathEntry( "URL" , mDoc->baseURL().url() );
+}
+
+void MainWindow::readProperties( TDEConfig *config )
+{
+ kdDebug()<<"void MainWindow::readProperties( TDEConfig *config )" << endl;
+ mDoc->slotReload( KURL( config->readPathEntry( "URL" ) ) );
+}
+
+void MainWindow::readConfig()
+{
+ TDEConfig *config = TDEGlobal::config();
+ config->setGroup( "MainWindowState" );
+ TQValueList<int> sizes = config->readIntListEntry( "Splitter" );
+ if ( sizes.count() == 2 ) {
+ mSplitter->setSizes( sizes );
+ }
+
+ mNavigator->readConfig();
+}
+
+void MainWindow::writeConfig()
+{
+ TDEConfig *config = TDEGlobal::config();
+ config->setGroup( "MainWindowState" );
+ config->writeEntry( "Splitter", mSplitter->sizes() );
+
+ mNavigator->writeConfig();
+
+ Prefs::writeConfig();
+}
+
+void MainWindow::setupActions()
+{
+ KStdAction::quit( TQT_TQOBJECT(this), TQT_SLOT( close() ), actionCollection() );
+ KStdAction::print( TQT_TQOBJECT(this), TQT_SLOT( print() ), actionCollection(),
+ "printFrame" );
+
+ TDEAction *prevPage = new TDEAction( i18n( "Previous Page" ), CTRL+Key_PageUp, mDoc, TQT_SLOT( prevPage() ),
+ actionCollection(), "prevPage" );
+ prevPage->setWhatsThis( i18n( "Moves to the previous page of the document" ) );
+
+ TDEAction *nextPage = new TDEAction( i18n( "Next Page" ), CTRL + Key_PageDown, mDoc, TQT_SLOT( nextPage() ),
+ actionCollection(), "nextPage" );
+ nextPage->setWhatsThis( i18n( "Moves to the next page of the document" ) );
+
+ TDEAction *home = KStdAction::home( TQT_TQOBJECT(this), TQT_SLOT( slotShowHome() ), actionCollection() );
+ home->setText(i18n("Table of &Contents"));
+ home->setToolTip(i18n("Table of contents"));
+ home->setWhatsThis(i18n("Go back to the table of contents"));
+
+ mCopyText = KStdAction::copy( TQT_TQOBJECT(this), TQT_SLOT(slotCopySelectedText()), actionCollection(), "copy_text");
+
+ mLastSearchAction = new TDEAction( i18n("&Last Search Result"), 0, TQT_TQOBJECT(this),
+ TQT_SLOT( slotLastSearch() ),
+ actionCollection(), "lastsearch" );
+ mLastSearchAction->setEnabled( false );
+
+ new TDEAction( i18n("Build Search Index..."), 0, TQT_TQOBJECT(mNavigator),
+ TQT_SLOT( showIndexDialog() ), actionCollection(), "build_index" );
+ KStdAction::keyBindings( guiFactory(), TQT_SLOT( configureShortcuts() ),
+ actionCollection() );
+
+ TDEConfig *cfg = TDEGlobal::config();
+ cfg->setGroup( "Debug" );
+ if ( cfg->readBoolEntry( "SearchErrorLog", false ) ) {
+ new TDEAction( i18n("Show Search Error Log"), 0, TQT_TQOBJECT(this),
+ TQT_SLOT( showSearchStderr() ), actionCollection(),
+ "show_search_stderr" );
+ }
+
+ History::self().setupActions( actionCollection() );
+
+ new TDEAction( i18n( "Configure Fonts..." ), TDEShortcut(), TQT_TQOBJECT(this), TQT_SLOT( slotConfigureFonts() ), actionCollection(), "configure_fonts" );
+ new TDEAction( i18n( "Increase Font Sizes" ), "zoom-in", TDEShortcut(), TQT_TQOBJECT(this), TQT_SLOT( slotIncFontSizes() ), actionCollection(), "incFontSizes" );
+ new TDEAction( i18n( "Decrease Font Sizes" ), "zoom-out", TDEShortcut(), TQT_TQOBJECT(this), TQT_SLOT( slotDecFontSizes() ), actionCollection(), "decFontSizes" );
+}
+
+void MainWindow::slotCopySelectedText()
+{
+ mDoc->copySelectedText();
+}
+
+void MainWindow::print()
+{
+ mDoc->view()->print();
+}
+
+void MainWindow::slotStarted(TDEIO::Job *job)
+{
+ if (job)
+ connect(job, TQT_SIGNAL(infoMessage( TDEIO::Job *, const TQString &)),
+ TQT_SLOT(slotInfoMessage(TDEIO::Job *, const TQString &)));
+
+ History::self().updateActions();
+}
+
+void MainWindow::goInternalUrl( const KURL &url )
+{
+ mDoc->closeURL();
+ slotOpenURLRequest( url, KParts::URLArgs() );
+}
+
+void MainWindow::slotOpenURLRequest( const KURL &url,
+ const KParts::URLArgs &args )
+{
+ kdDebug( 1400 ) << "MainWindow::slotOpenURLRequest(): " << url.url() << endl;
+
+ mNavigator->selectItem( url );
+ viewUrl( url, args );
+}
+
+void MainWindow::viewUrl( const TQString &url )
+{
+ viewUrl( KURL( url ) );
+}
+
+void MainWindow::viewUrl( const KURL &url, const KParts::URLArgs &args )
+{
+ KParts::URLArgs urlArgs = args;
+
+ stop();
+
+ TQString proto = url.protocol().lower();
+
+ if ( proto == "khelpcenter" ) {
+ History::self().createEntry();
+ mNavigator->openInternalUrl( url );
+ return;
+ }
+
+ bool own = false;
+
+ if ( proto == "help" || proto == "glossentry" || proto == "about" ||
+ proto == "man" || proto == "info" || proto == "cgi" ||
+ proto == "ghelp" )
+ own = true;
+ else if ( url.isLocalFile() ) {
+ KMimeMagicResult *res = KMimeMagic::self()->findFileType( url.path() );
+ if ( res->isValid() && res->accuracy() > 40
+ && res->mimeType() == "text/html" )
+ own = true;
+ }
+
+ if ( !own ) {
+ new KRun( url );
+ return;
+ }
+
+ History::self().createEntry();
+
+ if (mDoc->baseURL() != url) {
+ if ( proto == "help" ) {
+ // Ensure that changing the handbook section works by forcing a reload of the page,
+ // thereby allowing the help tdeioslave to re-parse the fragment identifier
+ urlArgs.reload = true;
+ mDoc->gotoAnchor("");
+ }
+ }
+ mDoc->browserExtension()->setURLArgs( urlArgs );
+
+ if ( proto == TQString::fromLatin1("glossentry") ) {
+ TQString decodedEntryId = KURL::decode_string( url.encodedPathAndQuery() );
+ slotGlossSelected( mNavigator->glossEntry( decodedEntryId ) );
+ mNavigator->slotSelectGlossEntry( decodedEntryId );
+ } else {
+ mDoc->openURL( url );
+ }
+}
+
+void MainWindow::documentCompleted()
+{
+ kdDebug() << "MainWindow::documentCompleted" << endl;
+
+ History::self().updateCurrentEntry( mDoc );
+ History::self().updateActions();
+}
+
+void MainWindow::slotInfoMessage(TDEIO::Job *, const TQString &m)
+{
+ statusBarMessage(m);
+}
+
+void MainWindow::statusBarMessage(const TQString &m)
+{
+ statusBar()->changeItem(m, 0);
+}
+
+void MainWindow::openUrl( const TQString &url )
+{
+ openUrl( KURL( url ) );
+}
+
+void MainWindow::openUrl( const TQString &url, const TQCString& startup_id )
+{
+ TDEStartupInfo::setNewStartupId( this, startup_id );
+ openUrl( KURL( url ) );
+}
+
+void MainWindow::openUrl( const KURL &url )
+{
+ if ( url.isEmpty() ) slotShowHome();
+ else {
+ mNavigator->selectItem( url );
+ viewUrl( url );
+ }
+}
+
+void MainWindow::slotGlossSelected(const GlossaryEntry &entry)
+{
+ kdDebug() << "MainWindow::slotGlossSelected()" << endl;
+
+ stop();
+ History::self().createEntry();
+ mDoc->begin( KURL( "help:/khelpcenter/glossary" ) );
+ mDoc->write( Glossary::entryToHtml( entry ) );
+ mDoc->end();
+}
+
+void MainWindow::stop()
+{
+ kdDebug() << "MainWindow::stop()" << endl;
+
+ mDoc->closeURL();
+ History::self().updateCurrentEntry( mDoc );
+}
+
+void MainWindow::showHome()
+{
+ slotShowHome();
+}
+
+void MainWindow::slotShowHome()
+{
+ viewUrl( mNavigator->homeURL() );
+ mNavigator->clearSelection();
+}
+
+void MainWindow::lastSearch()
+{
+ slotLastSearch();
+}
+
+void MainWindow::slotLastSearch()
+{
+ mDoc->lastSearch();
+}
+
+void MainWindow::enableLastSearchAction()
+{
+ mLastSearchAction->setEnabled( true );
+}
+
+void MainWindow::showSearchStderr()
+{
+ TQString log = mNavigator->searchEngine()->errorLog();
+
+ if ( !mLogDialog ) {
+ mLogDialog = new LogDialog( this );
+ }
+
+ mLogDialog->setLog( log );
+ mLogDialog->show();
+ mLogDialog->raise();
+}
+
+void MainWindow::slotIncFontSizes()
+{
+ mDoc->slotIncFontSizes();
+ updateZoomActions();
+}
+
+void MainWindow::slotDecFontSizes()
+{
+ mDoc->slotDecFontSizes();
+ updateZoomActions();
+}
+
+void MainWindow::updateZoomActions()
+{
+ actionCollection()->action( "incFontSizes" )->setEnabled( mDoc->zoomFactor() + mDoc->zoomStepping() <= 300 );
+ actionCollection()->action( "decFontSizes" )->setEnabled( mDoc->zoomFactor() - mDoc->zoomStepping() >= 20 );
+
+ TDEConfig *cfg = kapp->config();
+ {
+ TDEConfigGroupSaver groupSaver( cfg, "General" );
+ cfg->writeEntry( "Font zoom factor", mDoc->zoomFactor() );
+ cfg->sync();
+ }
+}
+
+void MainWindow::slotConfigureFonts()
+{
+ FontDialog dlg( this );
+ if ( dlg.exec() == TQDialog::Accepted )
+ mDoc->slotReload();
+}
+
+#include "mainwindow.moc"
+
+// vim:ts=2:sw=2:et