summaryrefslogtreecommitdiffstats
path: root/kviewshell/plugins/djvu/djvumultipage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kviewshell/plugins/djvu/djvumultipage.cpp')
-rw-r--r--kviewshell/plugins/djvu/djvumultipage.cpp357
1 files changed, 357 insertions, 0 deletions
diff --git a/kviewshell/plugins/djvu/djvumultipage.cpp b/kviewshell/plugins/djvu/djvumultipage.cpp
new file mode 100644
index 00000000..2599cc29
--- /dev/null
+++ b/kviewshell/plugins/djvu/djvumultipage.cpp
@@ -0,0 +1,357 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Stefan Kebekus *
+ * *
+ * Copyright (C) 2005 by Wilfried Huss *
+ * *
+ * 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 <kaction.h>
+#include <kdialogbase.h>
+#include <kfiledialog.h>
+#include <kparts/genericfactory.h>
+#include <kprinter.h>
+#include <ktempfile.h>
+#include "kvsprefs.h"
+#include <qapplication.h>
+#include <qpaintdevicemetrics.h>
+#include <qprinter.h>
+#include <qtooltip.h>
+
+#include "ByteStream.h"
+#include "DjVuToPS.h"
+#include "kprintDialogPage_DJVUpageoptions.h"
+#include "kprintDialogPage_DJVUconversionoptions.h"
+#include "djvumultipage.h"
+#include "pageRangeWidget.h"
+#include "prefs.h"
+
+#include "kmessagebox.h"
+
+typedef KParts::GenericFactory<DjVuMultiPage> DjVuMultiPageFactory;
+K_EXPORT_COMPONENT_FACTORY(djvuviewpart, DjVuMultiPageFactory)
+
+
+DjVuMultiPage::DjVuMultiPage(QWidget *parentWidget, const char *widgetName, QObject *parent,
+ const char *name, const QStringList&)
+ : KMultiPage(parentWidget, widgetName, parent, name), djvuRenderer(parentWidget)
+{
+ /* This is kparts wizardry that cannot be understood by man. Simply
+ change the names to match your implementation. */
+ setInstance(DjVuMultiPageFactory::instance());
+ djvuRenderer.setName("DjVu renderer");
+
+ // Render modes
+ QStringList renderModes;
+ renderModes.append(i18n("Color"));
+ renderModes.append(i18n("Black and White"));
+ renderModes.append(i18n("Show foreground only"));
+ renderModes.append(i18n("Show background only"));
+ renderModeAction = new KSelectAction (i18n("Render Mode"), 0, 0, 0, actionCollection(), "render_mode");
+ renderModeAction->setItems(renderModes);
+
+ renderModeAction->setCurrentItem(Prefs::renderMode());
+
+ deletePagesAction = new KAction(i18n("Delete Pages..."), 0, this, SLOT(slotDeletePages()), actionCollection(), "delete_pages");
+
+ // change the rendermode
+ connect(renderModeAction, SIGNAL(activated(int)), this, SLOT(setRenderMode(int)));
+
+ /* It is very important that this method is called in the
+ constructor. Otherwise kmultipage does not know how to render
+ files, and crashes may result. */
+ setRenderer(&djvuRenderer);
+
+ setXMLFile("djvumultipage.rc");
+
+ enableActions(false);
+}
+
+
+DjVuMultiPage::~DjVuMultiPage()
+{
+ ;
+}
+
+
+KAboutData* DjVuMultiPage::createAboutData()
+{
+ /* You obviously want to change this to match your setup */
+ KAboutData* about = new KAboutData("djvumultipage", I18N_NOOP("KDjView"), "0.1",
+ I18N_NOOP("KViewshell DjVu Plugin."),
+ KAboutData::License_GPL,
+ "Wilfried Huss",
+ I18N_NOOP("This program displays DjVu files."));
+
+ about->addAuthor ("Stefan Kebekus",
+ I18N_NOOP("KViewShell plugin"),
+ "http://www.mi.uni-koeln.de/~kebekus");
+
+ about->addAuthor ("Wilfried Huss",
+ I18N_NOOP("DjVu file loading"),
+
+ return about;
+}
+
+void DjVuMultiPage::enableActions(bool b)
+{
+ KMultiPage::enableActions(b);
+
+ deletePagesAction->setEnabled(b);
+}
+
+void DjVuMultiPage::setFile(bool r)
+{
+ enableActions(r);
+}
+
+QStringList DjVuMultiPage::fileFormats() const
+{
+ /* This list is used in the file selection dialog when the file is
+ saved */
+ QStringList r;
+ r << i18n("*.djvu|DjVu file (*.djvu)");
+ return r;
+}
+
+
+void DjVuMultiPage::setRenderMode(int mode)
+{
+ // Save renderMode for future uses
+ switch (mode)
+ {
+ case Prefs::EnumRenderMode::BlackAndWhite:
+ Prefs::setRenderMode(Prefs::EnumRenderMode::BlackAndWhite);
+
+ break;
+ case Prefs::EnumRenderMode::Foreground:
+ Prefs::setRenderMode(Prefs::EnumRenderMode::Foreground);
+
+ break;
+ case Prefs::EnumRenderMode::Background:
+ Prefs::setRenderMode(Prefs::EnumRenderMode::Background);
+
+ break;
+ default: //Prefs::EnumRenderMode::Color
+ Prefs::setRenderMode(Prefs::EnumRenderMode::Color);
+ }
+ Prefs::writeConfig();
+ renderModeChanged();
+}
+
+
+void DjVuMultiPage::slotDeletePages()
+{
+ if (numberOfPages() == 0)
+ return;
+
+ KDialogBase dialog( parentWdg, "urldialog", true, i18n("Delete Pages"), KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Ok, true );
+ PageRangeWidget range( 1, numberOfPages(), currentPageNumber(), &dialog, "range widget" );
+ QToolTip::add( &range, i18n( "Select the pages you wish to delete." ) );
+ dialog.setButtonOK(i18n("Delete Pages"));
+ dialog.setMainWidget(&range);
+ if (dialog.exec() != QDialog::Accepted)
+ return;
+
+ djvuRenderer.deletePages(range.getFrom(), range.getTo());
+
+
+ // =========
+ pageCache->deselectText();
+ document_history.clear();
+ pageCache->clear();
+
+ generateDocumentWidgets();
+
+ // Set number of widgets in the thumbnail sidebar
+ markList()->clear();
+ markList()->setNumberOfPages(numberOfPages(), KVSPrefs::showThumbnails());
+
+ // Set Table of Contents
+ //@@@@@@@@@@ tableOfContents->setContents(renderer->getBookmarks());
+
+ // Clear Statusbar
+ emit setStatusBarText(QString::null);
+}
+
+
+void DjVuMultiPage::print()
+{
+ // Paranoid safety checks
+ if (djvuRenderer.isEmpty())
+ return;
+
+ // Allocate the printer structure
+ KPrinter *printer = getPrinter(false);
+ if (printer == 0)
+ return;
+
+ KPrintDialogPage_DJVUPageOptions *pageOptions = new KPrintDialogPage_DJVUPageOptions();
+ if (pageOptions == 0) {
+ kdError(1223) << "DjVuMultiPage::print(): Cannot allocate new KPrintDialogPage_PageOptions structure" << endl;
+ delete printer;
+ return;
+ }
+ printer->addDialogPage( pageOptions );
+
+ KPrintDialogPage_DJVUConversionOptions *conversionOptions = new KPrintDialogPage_DJVUConversionOptions();
+ if (pageOptions == 0) {
+ kdError(1223) << "DjVuMultiPage::print(): Cannot allocate new KPrintDialogPage_ConversionOptions structure" << endl;
+ delete printer;
+ return;
+ }
+ printer->addDialogPage( conversionOptions );
+
+ // initialize the printer using the print dialog
+ if ( printer->setup(parentWdg, i18n("Print %1").arg(m_file.section('/', -1))) ) {
+ // Now do the printing.
+ QValueList<int> pageList = printer->pageList();
+ if (pageList.isEmpty())
+ printer->abort();
+ else {
+ // Printing usually takes a while. This is to keep the GUI
+ // updated.
+ qApp->processEvents();
+
+ // Printing...
+ DjVuToPS converter;
+ DjVuToPS::Options &options = converter.options;
+
+ // Set PostScript Language Level, taking 3 as the default
+ options.set_format(DjVuToPS::Options::PS);
+ QString op = printer->option( "kde-kdjvu-pslevel" );
+ if (op == "1")
+ options.set_level(1);
+ else
+ if (op == "3")
+ options.set_level(3);
+ else
+ options.set_level(2);
+
+ // Set page size orientation
+ if (printer->option( "kde-kviewshell-rotatepage" ) == "true")
+ options.set_orientation (DjVuToPS::Options::AUTO);
+ else
+ if ( printer->orientation() == KPrinter::Landscape )
+ options.set_orientation (DjVuToPS::Options::LANDSCAPE);
+ else
+ options.set_orientation (DjVuToPS::Options::PORTRAIT);
+
+ // Set render mode, taking "color" as default
+ op = printer->option("kde-kdjvu-rendermode");
+ if (op == "black-and-white")
+ options.set_mode(DjVuToPS::Options::BW);
+ else
+ if (op == "foreground")
+ options.set_mode(DjVuToPS::Options::FORE);
+ else
+ if (op == "background")
+ options.set_mode(DjVuToPS::Options::BACK);
+ else
+ options.set_mode(DjVuToPS::Options::COLOR);
+
+ // Set Color or Grayscale mode
+ if (printer->colorMode() == KPrinter::Color)
+ options.set_color(true);
+ else
+ options.set_color(false);
+
+ // Set Zoom
+ if (printer->option( "kde-kdjvu-fitpage" ) == "true")
+ options.set_zoom(0);
+ else
+ options.set_zoom(100);
+
+ KTempFile tmpPSFile(QString::null, "ps");
+ tmpPSFile.close();
+ tmpPSFile.setAutoDelete(true);
+
+ if (djvuRenderer.convertToPSFile(converter, tmpPSFile.name(), pageList ) == true)
+ printer->printFiles( QStringList(tmpPSFile.name()), true );
+ else
+ printer->abort();
+ }
+ delete printer;
+ }
+}
+
+
+bool DjVuMultiPage::isReadWrite() const
+{
+ return true;
+}
+
+
+bool DjVuMultiPage::isModified() const
+{
+ return djvuRenderer.isModified();
+}
+
+
+void DjVuMultiPage::slotSave()
+{
+ // Paranoid safety checks
+ if (djvuRenderer.isEmpty())
+ return;
+
+ // Try to guess the proper ending...
+ QString formats;
+ QString ending;
+ int rindex = m_file.findRev(".");
+ if (rindex == -1) {
+ ending = QString::null;
+ formats = QString::null;
+ } else {
+ ending = m_file.mid(rindex); // e.g. ".dvi"
+ formats = fileFormats().grep(ending).join("\n");
+ }
+
+ QString fileName = KFileDialog::getSaveFileName(QString::null, formats, 0, i18n("Save File As"));
+
+ if (fileName.isEmpty())
+ return;
+
+ // Add the ending to the filename. I hope the user likes it that
+ // way.
+ if (!ending.isEmpty() && fileName.find(ending) == -1)
+ fileName = fileName+ending;
+
+ if (QFile(fileName).exists()) {
+ int r = KMessageBox::warningContinueCancel(parentWdg, i18n("The file %1\nalready exists. Do you want to overwrite it?").arg(fileName),
+ i18n("Overwrite File"), i18n("Overwrite"));
+ if (r == KMessageBox::Cancel)
+ return;
+ }
+
+ djvuRenderer.save(fileName);
+
+ /*
+ if (!djvuRenderer.save(fileName) == false)
+ KMessageBox::error( parentWdg,
+ i18n("<qt><strong>File error.</strong> Unable to write to the specified file '%1'. The document is <strong>not</strong> saved.</qt>").arg(fileName),
+ i18n("File Error"));
+ */
+
+ return;
+}
+
+
+
+#include "djvumultipage.moc"