summaryrefslogtreecommitdiffstats
path: root/kghostview/kgvshell.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kghostview/kgvshell.cpp')
-rw-r--r--kghostview/kgvshell.cpp370
1 files changed, 370 insertions, 0 deletions
diff --git a/kghostview/kgvshell.cpp b/kghostview/kgvshell.cpp
new file mode 100644
index 00000000..1dc546d5
--- /dev/null
+++ b/kghostview/kgvshell.cpp
@@ -0,0 +1,370 @@
+/**
+ * Copyright (C) 2000-2002 the KGhostView authors. See file AUTHORS.
+ *
+ * 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 <assert.h>
+#include <stdlib.h>
+
+#include <kaction.h>
+#include <kapplication.h>
+#include <kfiledialog.h>
+#include <kiconloader.h>
+#include <klibloader.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kstandarddirs.h>
+#include <kstatusbar.h>
+#include <kstdaction.h>
+#include <kstdaccel.h>
+#include <ktempfile.h>
+#include <kmenubar.h>
+#include <kedittoolbar.h>
+#include <kdebug.h>
+
+#include <kicontheme.h>
+#include <kglobal.h>
+#include <kpopupmenu.h>
+#include <kparts/componentfactory.h>
+
+#include <kwin.h>
+
+#include <qcursor.h>
+
+#include "kgv_miniwidget.h"
+#include "kgv_view.h"
+#include "kgvpageview.h"
+#include "displayoptions.h"
+#include "fullscreenfilter.h"
+
+#undef Always // avoid X11/Qt namespace clash
+#include "kgvshell.moc"
+
+//TODO -- disable GUI when no file
+//TODO -- don't stay open when no file, go directly to KFileDialog
+
+KGVShell::KGVShell() :
+ _tmpFile( 0 )
+{
+ m_gvpart = KParts::ComponentFactory::createPartInstanceFromLibrary< KGVPart >( "libkghostviewpart", this, "kgvpart",
+ this, "kgvpart" );
+
+ /*---- File -----------------------------------------------------------*/
+ openact =
+ KStdAction::open( this, SLOT( slotFileOpen() ),
+ actionCollection() );
+ recent =
+ KStdAction::openRecent( this, SLOT( openURL( const KURL& ) ),
+ actionCollection() );
+ KStdAction::print( m_gvpart->document(), SLOT( print() ),
+ actionCollection() );
+ (void)
+ KStdAction::quit( this, SLOT( slotQuit() ), actionCollection() );
+
+ /*---- View -----------------------------------------------------------*/
+ new KAction( i18n( "&Reload" ), "reload",
+ KStdAccel::shortcut( KStdAccel::Reload ),
+ m_gvpart, SLOT( reloadFile() ),
+ actionCollection(), "reload" );
+ new KAction( i18n( "&Maximize" ), Key_M, this,
+ SLOT( slotMaximize() ), actionCollection(),
+ "maximize");
+ _showMenuBarAction = KStdAction::showMenubar( this, SLOT( slotShowMenubar() ), actionCollection() );
+
+ /*---- Settings -------------------------------------------------------*/
+#if KDE_VERSION >= KDE_MAKE_VERSION(3,1,90)
+ createStandardStatusBarAction();
+#endif
+ setAutoSaveSettings();
+ setStandardToolBarMenuEnabled(true);
+#if KDE_VERSION >= KDE_MAKE_VERSION(3,1,90)
+ m_fullScreenAction = KStdAction::fullScreen( this, SLOT( slotUpdateFullScreen() ), actionCollection(), this );
+#else
+ m_fullScreenAction = new KToggleAction( this, SLOT( slotUpdateFullScreen() ) );
+#endif
+ KStdAction::configureToolbars( this, SLOT( slotConfigureToolbars() ), actionCollection() );
+ KStdAction::keyBindings(guiFactory(), SLOT(configureShortcuts()),
+actionCollection());
+
+ //_popup = new KPopupMenu( i18n( "Full Screen Options" ), this, "rmb popup" );
+ _popup = new KPopupMenu( this, "rmb popup" );
+ _popup->insertTitle( i18n( "Full Screen Options" ) );
+ m_fullScreenAction->plug( _popup );
+ _showMenuBarAction->plug( _popup );
+
+ m_fsFilter = new FullScreenFilter( *this );
+
+ // Just save them automatically is destructor. (TODO: of kgv_view!)
+ //KStdAction::saveOptions ( this, SLOT (slotWriteSettings()), actionCollection());
+
+ setXMLFile( "kghostviewui.rc" );
+
+ // We could, at the user's option, make this connection and kghostview
+ // will always resize to fit the width of the page. But, for now,
+ // let's not.
+ // connect ( m_gvpart->widget(), SIGNAL (sizeHintChanged()), this, SLOT (slotResize ()) );
+
+ setCentralWidget( m_gvpart->widget() );
+ createGUI( m_gvpart );
+
+ connect( m_gvpart->pageView(), SIGNAL( rightClick() ),SLOT( slotRMBClick() ) );
+ connect( m_gvpart, SIGNAL( canceled(const QString&) ),SLOT( slotReset() ) );
+ connect( m_gvpart, SIGNAL( completed() ), SLOT( slotDocumentState() ) );
+
+ if (!initialGeometrySet())
+ resize(640,400);
+
+ readSettings();
+ stateChanged( "initState" );
+
+ // Make sure the view has the keyboard focus.
+ m_gvpart->widget()->setFocus();
+}
+
+KGVShell::~KGVShell()
+{
+ writeSettings();
+
+ if( _tmpFile )
+ {
+ _tmpFile->setAutoDelete( true );
+ delete _tmpFile;
+ _tmpFile = 0;
+ }
+
+ // delete m_gvpart;
+}
+
+void
+KGVShell::slotQuit()
+{
+ kapp->closeAllWindows();
+}
+
+void KGVShell::slotShowMenubar()
+{
+ if ( _showMenuBarAction->isChecked() ) menuBar()->show();
+ else menuBar()->hide();
+}
+
+void
+KGVShell::setDisplayOptions( const DisplayOptions& options )
+{
+ m_gvpart->setDisplayOptions( options );
+}
+
+void KGVShell::slotReset()
+{
+ kdDebug( 4500 ) << "KGVShell::slotReset()" << endl;
+ stateChanged( "initState" );
+}
+
+void
+KGVShell::readProperties( KConfig *config )
+{
+ KURL url = KURL::fromPathOrURL( config->readPathEntry( "URL" ) );
+ if ( url.isValid() ) {
+ openURL( url );
+ DisplayOptions options;
+ if ( DisplayOptions::fromString( options, config->readEntry( "Display Options" ) ) ) m_gvpart->setDisplayOptions( options );
+ }
+}
+
+void
+KGVShell::saveProperties( KConfig* config )
+{
+ config->writePathEntry( "URL", m_gvpart->url().prettyURL() );
+ config->writeEntry( "Display Options", DisplayOptions::toString( m_gvpart->miniWidget()->displayOptions() ) );
+}
+
+void
+KGVShell::readSettings()
+{
+ recent->loadEntries( KGlobal::config() );
+ QStringList items = recent->items();
+
+// Code copied from kviewshell.cpp:
+// Constant source of annoyance in KDVI < 1.0: the 'recent-files'
+// menu contains lots of files which don't exist (any longer). Thus,
+// we'll sort out the non-existent files here.
+
+ for ( QStringList::Iterator it = items.begin(); it != items.end(); ++it ) {
+ KURL url(*it);
+ if (url.isLocalFile()) {
+ QFileInfo info(url.path());
+ if (!info.exists())
+ recent->removeURL(url);
+ }
+ }
+
+ applyMainWindowSettings(KGlobal::config(), "MainWindow");
+
+ KGlobal::config()->setDesktopGroup();
+ bool fullScreen = KGlobal::config()->readBoolEntry( "FullScreen", false );
+ setFullScreen( fullScreen );
+ _showMenuBarAction->setChecked( menuBar()->isVisible() );
+}
+
+void
+KGVShell::writeSettings()
+{
+ saveMainWindowSettings(KGlobal::config(), "MainWindow");
+
+ recent->saveEntries( KGlobal::config() );
+
+ KGlobal::config()->setDesktopGroup();
+ KGlobal::config()->writeEntry( "FullScreen", m_fullScreenAction->isChecked());
+
+ KGlobal::config()->sync();
+}
+
+void
+KGVShell::openURL( const KURL & url )
+{
+ if( m_gvpart->openURL( url ) ) recent->addURL (url);
+}
+
+void
+KGVShell::openStdin()
+{
+ if( _tmpFile )
+ {
+ _tmpFile->setAutoDelete( true );
+ delete _tmpFile;
+ }
+
+ _tmpFile = new KTempFile;
+ _tmpFile->setAutoDelete( true );
+
+ if( _tmpFile->status() != 0 ) {
+ KMessageBox::error( this,
+ i18n( "Could not create temporary file: %1" )
+ .arg( strerror( _tmpFile->status() ) ) );
+ return;
+ }
+
+ QByteArray buf( BUFSIZ );
+ int read = 0, wrtn = 0;
+ while( ( read = fread( buf.data(), sizeof(char), buf.size(), stdin ) )
+ > 0 ) {
+ wrtn = _tmpFile->file()->writeBlock( buf.data(), read );
+ if( read != wrtn )
+ break;
+ kapp->processEvents();
+ }
+
+ if( read != 0 ) {
+ KMessageBox::error( this,
+ i18n( "Could not open standard input stream: %1" )
+ .arg( strerror( errno ) ) );
+ return;
+ }
+
+ _tmpFile->close();
+
+ if( m_gvpart->openURL( KURL::fromPathOrURL( _tmpFile->name() ) ) ) setCaption( "stdin" );
+}
+
+void KGVShell::slotFileOpen()
+{
+ KURL url = KFileDialog::getOpenURL( cwd, i18n(
+ "*.ps *.ps.bz2 *.ps.gz *.eps *.eps.gz *.pdf|All Document Files\n"
+ "*.ps *.ps.bz2 *.ps.gz|PostScript Files\n"
+ "*.pdf *.pdf.gz *.pdf.bz2|Portable Document Format (PDF) Files\n"
+ "*.eps *.eps.gz *.eps.bz2|Encapsulated PostScript Files\n"
+ "*|All Files" ) );
+
+ if( !url.isEmpty() ) {
+ openURL( url );
+ }
+}
+
+void KGVShell::slotDocumentState()
+{
+ stateChanged( "documentState" );
+}
+
+
+void KGVShell::slotMaximize()
+{
+ kdDebug(4500) << "KGVShell::slotMaximize()" << endl;
+ KWin::setState( winId(), NET::MaxHoriz | NET::MaxVert );
+ // If we do it now, it comes to nothing since it would work
+ // on the current (non-maximized) size
+ QTimer::singleShot( 800, m_gvpart, SLOT( slotFitToPage() ) );
+}
+
+void KGVShell::slotResize()
+{
+ resize( m_gvpart->pageView()->sizeHint().width(), height() );
+}
+
+void KGVShell::setFullScreen( bool useFullScreen )
+{
+ if( useFullScreen )
+ showFullScreen();
+ else if( isFullScreen())
+ showNormal();
+}
+
+void KGVShell::slotUpdateFullScreen()
+{
+ if( m_fullScreenAction->isChecked())
+ {
+ menuBar()->hide();
+ statusBar()->hide();
+ toolBar()->hide();
+ m_gvpart->updateFullScreen( true );
+ showFullScreen();
+ kapp->installEventFilter( m_fsFilter );
+ if ( m_gvpart->document()->isOpen() )
+ m_gvpart->slotFitToPage();
+ }
+ else
+ {
+ kapp->removeEventFilter( m_fsFilter );
+ m_gvpart->updateFullScreen( false );
+ menuBar()->show();
+#if KDE_VERSION >= KDE_MAKE_VERSION(3,1,90)
+ KToggleAction *statusbarAction = dynamic_cast<KToggleAction *>(actionCollection()->action(KStdAction::name(KStdAction::ShowStatusbar)));
+ assert( statusbarAction );
+ if (statusbarAction->isChecked()) statusBar()->show();
+#endif
+ toolBar()->show();
+ showNormal();
+ }
+}
+
+void KGVShell::slotConfigureToolbars()
+{
+ saveMainWindowSettings( KGlobal::config(), "MainWindow" );
+ KEditToolbar dlg( factory() );
+ connect(&dlg,SIGNAL(newToolbarConfig()),this,SLOT(slotNewToolbarConfig()));
+ dlg.exec();
+}
+
+void KGVShell::slotNewToolbarConfig()
+{
+ applyMainWindowSettings( KGlobal::config(), "MainWindow" );
+}
+
+void KGVShell::slotRMBClick()
+{
+ _popup->exec( QCursor::pos() );
+}
+
+
+// vim:sw=4:sts=4:ts=8:noet