• Skip to content
  • Skip to link menu
KDE 3.5 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

kviewshell

kviewshell.cpp

Go to the documentation of this file.
00001 /*
00002  * Parts of this file are
00003  * Copyright 2003 Waldo Bastian <bastian@kde.org>
00004  *
00005  * These parts are free software; you can redistribute and/or modify
00006  * them under the terms of the GNU General Public License as published by
00007  * the Free Software Foundation; version 2.
00008  */
00009 
00010 
00011 #include <qfileinfo.h>
00012 #include <qtimer.h>
00013 #include <qregexp.h>
00014 
00015 #include <kiconloader.h>
00016 #include <kstandarddirs.h>
00017 #include <kapplication.h>
00018 #include <kaction.h>
00019 #include <kconfig.h>
00020 #include <kdebug.h>
00021 #include <klocale.h>
00022 #include <kmessagebox.h>
00023 #include <kmenubar.h>
00024 #include <klibloader.h>
00025 #include <kstdaction.h>
00026 #include <kedittoolbar.h>
00027 #include <kurldrag.h>
00028 #include <kparts/partmanager.h>
00029 #include <kmimetype.h>
00030 
00031 #include <kprogress.h>
00032 #include <qlabel.h>
00033 
00034 #include <stdlib.h>
00035 #include <unistd.h>
00036 
00037 #include "kviewpart_iface.h"
00038 #include <kstatusbar.h>
00039 #include <kkeydialog.h>
00040 #include "kviewshell.moc"
00041 
00042 
00043 #define StatusBar_ID_PageNr 1
00044 #define StatusBar_ID_PageSize 2
00045 #define StatusBar_ID_Zoom 3
00046 
00047 
00048 KViewShell::KViewShell(const QString& defaultMimeType)
00049   : KParts::MainWindow()
00050 {
00051   // create the viewer part
00052 
00053   // Try to load
00054   KLibFactory *factory = KLibLoader::self()->factory("kviewerpart");
00055   if (factory) {
00056     if (defaultMimeType == QString::null)
00057     {
00058       view = (KViewPart_Iface*) factory->create(this, "kviewerpart", "KViewPart");
00059     }
00060     else
00061     {
00062       QStringList args;
00063       args << defaultMimeType;
00064       view = (KViewPart_Iface*) factory->create(this, "kviewerpart", "KViewPart", args);
00065     }
00066     if (!view)
00067       ::exit(-1);
00068   } else {
00069     KMessageBox::error(this, i18n("No viewing component found"));
00070     ::exit(-1);
00071   }
00072 
00073   setCentralWidget(view->widget());
00074 
00075   // file menu
00076   KStdAction::open(view, SLOT(slotFileOpen()), actionCollection());
00077   recent = KStdAction::openRecent (this, SLOT(openURL(const KURL &)), actionCollection());
00078   reloadAction = new KAction(i18n("Reload"), "reload", CTRL + Key_R, view, SLOT(reload()), actionCollection(), "reload");
00079   closeAction = KStdAction::close(this, SLOT(slotFileClose()), actionCollection());
00080   KStdAction::quit (this, SLOT(slotQuit()), actionCollection());
00081 
00082   connect(view, SIGNAL(fileOpened()), this, SLOT(addRecentFile()));
00083 
00084   // view menu
00085   fullScreenAction = KStdAction::fullScreen(this, SLOT(slotFullScreen()), actionCollection(), this, "fullscreen" );
00086 
00087   // settings menu
00088   createStandardStatusBarAction();
00089 
00090   setStandardToolBarMenuEnabled(true);
00091 
00092   KStdAction::keyBindings(this, SLOT(slotConfigureKeys()), actionCollection());
00093   KStdAction::configureToolbars(this, SLOT(slotEditToolbar()), actionCollection());
00094 
00095   // statusbar connects
00096   connect( view, SIGNAL( zoomChanged(const QString &) ), this,SLOT( slotChangeZoomText(const QString &) ) );
00097   connect( view, SIGNAL( pageChanged(const QString &) ), this,SLOT( slotChangePageText(const QString &) ) );
00098   connect( view, SIGNAL( sizeChanged(const QString &) ), this,SLOT( slotChangeSizeText(const QString &) ) );
00099 
00100   // Setup session management
00101   connect( this, SIGNAL( restoreDocument(const KURL &, int) ), view, SLOT( restoreDocument(const KURL &, int)));
00102   connect( this, SIGNAL( saveDocumentRestoreInfo(KConfig*) ), view, SLOT( saveDocumentRestoreInfo(KConfig*)));
00103 
00104   setXMLFile( "kviewshell.rc" );
00105   createGUI(view);
00106   readSettings();
00107   checkActions();
00108   setAcceptDrops(true);
00109 
00110   // If kviewshell is started when another instance of kviewshell runs
00111   // in fullscreen mode, the menubar is switched off by default, which
00112   // is a nasty surprise for the user: there is no way to access the
00113   // menus. To avoid such complications, we switch the menubar on
00114   // explicitly.
00115   menuBar()->show();
00116 
00117   // Add statusbar-widgets for zoom, pagenr and format
00118   statusBar()->insertItem("", StatusBar_ID_PageNr, 0, true);
00119   statusBar()->insertFixedItem("XXXX%", StatusBar_ID_Zoom, true);
00120   statusBar()->changeItem("", StatusBar_ID_Zoom);
00121   statusBar()->insertItem(view->pageSizeDescription(), StatusBar_ID_PageSize, 0, true);
00122 
00123   connect( view, SIGNAL(pluginChanged(KParts::Part*)), this, SLOT(createGUI(KParts::Part*)));
00124 }
00125 
00126 
00127 void KViewShell::checkActions()
00128 {
00129   bool doc = !view->url().isEmpty();
00130 
00131   closeAction->setEnabled(doc);
00132   reloadAction->setEnabled(doc);
00133   fullScreenAction->setEnabled(doc);
00134 }
00135 
00136 
00137 KViewShell::~KViewShell()
00138 {
00139   writeSettings();
00140   delete view;
00141 }
00142 
00143 
00144 void KViewShell::slotQuit()
00145 {
00146   // If we are to quit the application while we operate in fullscreen
00147   // mode, we need to restore the visibility properties of the
00148   // statusbar, toolbar and the menus because these properties are
00149   // saved automatically ... and we don't want to start next time
00150   // without having menus.
00151   if (fullScreenAction->isChecked()) {
00152     kdDebug() << "Switching off fullscreen mode before quitting the application" << endl;
00153     showNormal();
00154     if (isStatusBarShownInNormalMode)
00155       statusBar()->show();
00156     if (isToolBarShownInNormalMode)
00157       toolBar()->show();
00158     menuBar()->show();
00159     view->slotSetFullPage(false); 
00160   }
00161   kapp->closeAllWindows();
00162   kapp->quit();
00163 }
00164 
00165 
00166 void KViewShell::readSettings()
00167 {
00168   resize(600, 300); // default size if the config file specifies no size
00169   setAutoSaveSettings( "General" ); // apply mainwindow settings (size, toolbars, etc.)
00170 
00171   KConfig *config = kapp->config();
00172   config->setGroup("General");
00173 
00174   recent->loadEntries(config, "Recent Files");
00175 
00176   // Constant source of annoyance in KDVI < 1.0: the 'recent-files'
00177   // menu contains lots of files which don't exist (any longer). Thus,
00178   // we'll sort out the non-existent files here.
00179   QStringList items = recent->items();
00180   for ( QStringList::Iterator it = items.begin(); it != items.end(); ++it ) {
00181     KURL url(*it);
00182     if (url.isLocalFile()) {
00183       QFileInfo info(url.path());
00184       if (!info.exists())
00185         recent->removeURL(url);
00186     }
00187   }
00188 
00189 }
00190 
00191 
00192 void KViewShell::writeSettings()
00193 {
00194   KConfig *config = kapp->config();
00195   config->setGroup( "General" );
00196   recent->saveEntries(config, "Recent Files");
00197 
00198   config->sync();
00199 }
00200 
00201 
00202 void KViewShell::saveProperties(KConfig* config)
00203 {
00204   // the 'config' object points to the session managed
00205   // config file.  anything you write here will be available
00206   // later when this app is restored
00207   emit saveDocumentRestoreInfo(config);
00208 }
00209 
00210 
00211 void KViewShell::readProperties(KConfig* config)
00212 {
00213   // the 'config' object points to the session managed
00214   // config file.  this function is automatically called whenever
00215   // the app is being restored.  read in here whatever you wrote
00216   // in 'saveProperties'
00217   if (view)
00218   {
00219     KURL url (config->readPathEntry("URL"));
00220     if (url.isValid())
00221       emit restoreDocument(url, config->readNumEntry("Page", 1));
00222   }
00223 }
00224 
00225 
00226 void KViewShell::addRecentFile()
00227 {
00228   // Get the URL of the opened file from the kviewpart.
00229   KURL actualURL = view->url();
00230   // To store the URL in the list of recent files, we remove the
00231   // reference part.
00232   actualURL.setRef(QString::null);
00233   recent->addURL(actualURL);
00234   checkActions();
00235 }
00236 
00237 void KViewShell::openURL(const KURL& url)
00238 {
00239   view->openURL(url);
00240 }
00241 
00242 void KViewShell::slotFullScreen()
00243 {
00244   if (fullScreenAction->isChecked()) {
00245     // In fullscreen mode, menu- tool- and statusbar are hidden. Save
00246     // the visibility flags of these objects here, so that they can
00247     // later be properly restored when we switch back to normal mode,
00248     // or before we leave the application in slotQuit()
00249     isStatusBarShownInNormalMode = statusBar()->isShown();
00250     statusBar()->hide();
00251     isToolBarShownInNormalMode = toolBar()->isShown();
00252     toolBar()->hide();
00253     menuBar()->hide();
00254     view->slotSetFullPage(true); 
00255 
00256     // Go to fullscreen mode
00257     showFullScreen();
00258 
00259     KMessageBox::information(this, i18n("Use the Escape key to leave the fullscreen mode."), i18n("Entering Fullscreen Mode"), "leavingFullScreen");
00260   } else {
00261     showNormal();
00262     if (isStatusBarShownInNormalMode)
00263       statusBar()->show();
00264     if (isToolBarShownInNormalMode)
00265       toolBar()->show();
00266     menuBar()->show();
00267     view->slotSetFullPage(false); 
00268   }
00269 }
00270 
00271 
00272 void KViewShell::slotFileClose()
00273 {
00274   view->closeURL_ask();
00275 
00276   checkActions();
00277 }
00278 
00279 void KViewShell::slotConfigureKeys()
00280 {
00281   KKeyDialog dlg( true, this );
00282 
00283   dlg.insert( actionCollection() );
00284   dlg.insert( view->actionCollection() );
00285 
00286   dlg.configure();
00287 }
00288 
00289 void KViewShell::slotEditToolbar()
00290 {
00291   saveMainWindowSettings( KGlobal::config(), autoSaveGroup() );
00292   KEditToolbar dlg(factory());
00293   connect( &dlg, SIGNAL( newToolbarConfig() ), SLOT( slotNewToolbarConfig() ) );
00294   dlg.exec();
00295 }
00296 
00297 
00298 void KViewShell::slotNewToolbarConfig()
00299 {
00300   applyMainWindowSettings( KGlobal::config(), autoSaveGroup() );
00301 }
00302 
00303 void KViewShell::dragEnterEvent(QDragEnterEvent *event)
00304 {
00305   if (KURLDrag::canDecode(event))
00306   {
00307     KURL::List urls;
00308     KURLDrag::decode(event, urls);
00309     if (!urls.isEmpty())
00310     {
00311       KURL url = urls.first();
00312 
00313       // Always try to open remote files
00314       if (!url.isLocalFile())
00315       {
00316         event->accept();
00317         return;
00318       }
00319 
00320       // For local files we only accept a drop, if we have a plugin for its
00321       // particular mimetype
00322       KMimeType::Ptr mimetype = KMimeType::findByURL(url);
00323       kdDebug() << "[dragEnterEvent] Dragged URL is of type " << mimetype->comment() << endl;
00324 
00325       // Safety check
00326       if (view)
00327       {
00328         QStringList mimetypeList = view->supportedMimeTypes();
00329         kdDebug() << "[dragEnterEvent] Supported mime types: " << mimetypeList << endl;
00330 
00331         for (QStringList::Iterator it = mimetypeList.begin(); it != mimetypeList.end(); ++it)
00332         {
00333           if (mimetype->is(*it))
00334           {
00335             kdDebug() << "[dragEnterEvent] Found matching mimetype: " << *it << endl;
00336             event->accept();
00337             return;
00338           }
00339         }
00340         kdDebug() << "[dragEnterEvent] no matching mimetype found" << endl;
00341       }
00342     }
00343     event->ignore();
00344   }
00345 }
00346 
00347 
00348 void KViewShell::dropEvent(QDropEvent *event)
00349 {
00350   KURL::List urls;
00351   if (KURLDrag::decode(event, urls) && !urls.isEmpty())
00352     view->openURL(urls.first());
00353 }
00354 
00355 
00356 void KViewShell::keyPressEvent(QKeyEvent *event)
00357 {
00358   // The Escape Key is used to return to normal mode from fullscreen
00359   // mode
00360   if ((event->key() == Qt::Key_Escape) && (fullScreenAction->isChecked())) {
00361     showNormal();
00362     return;
00363   }
00364   // If we can't use the key event, pass it on
00365   event->ignore();
00366 }
00367 
00368 
00369 void KViewShell::slotChangePageText(const QString &message)
00370 {
00371   statusBar()->changeItem(" "+message+" ",StatusBar_ID_PageNr);
00372 }
00373 
00374 
00375 void KViewShell::slotChangeSizeText(const QString &message)
00376 {
00377   statusBar()->changeItem(" "+message+" ",StatusBar_ID_PageSize);
00378 }
00379 
00380 
00381 void KViewShell::slotChangeZoomText(const QString &message)
00382 {
00383   statusBar()->changeItem(" "+message+" ",StatusBar_ID_Zoom);
00384 }

kviewshell

Skip menu "kviewshell"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members

API Reference

Skip menu "API Reference"
  • kviewshell
Generated for API Reference by doxygen 1.5.9
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal