You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdegraphics/kviewshell/plugins/djvu/djvumultipage.cpp

358 lines
11 KiB

/***************************************************************************
* Copyright (C) 2005 by Stefan Kebekus *
* kebekus@kde.org *
* *
* Copyright (C) 2005 by Wilfried Huss *
* Wilfried.Huss@gmx.at *
* *
* 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 <tqapplication.h>
#include <tqpaintdevicemetrics.h>
#include <tqprinter.h>
#include <tqtooltip.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(TQWidget *parentWidget, const char *widgetName, TQObject *parent,
const char *name, const TQStringList&)
: 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
TQStringList 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, TQT_SLOT(slotDeletePages()), actionCollection(), "delete_pages");
// change the rendermode
connect(renderModeAction, TQT_SIGNAL(activated(int)), this, TQT_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"),
"kebekus@kde.org",
"http://www.mi.uni-koeln.de/~kebekus");
about->addAuthor ("Wilfried Huss",
I18N_NOOP("DjVu file loading"),
"Wilfried.Huss@gmx.at");
return about;
}
void DjVuMultiPage::enableActions(bool b)
{
KMultiPage::enableActions(b);
deletePagesAction->setEnabled(b);
}
void DjVuMultiPage::setFile(bool r)
{
enableActions(r);
}
TQStringList DjVuMultiPage::fileFormats() const
{
/* This list is used in the file selection dialog when the file is
saved */
TQStringList 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" );
TQToolTip::add( &range, i18n( "Select the pages you wish to delete." ) );
dialog.setButtonOK(i18n("Delete Pages"));
dialog.setMainWidget(&range);
if (dialog.exec() != TQDialog::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(TQString::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.
TQValueList<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);
TQString 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(TQString::null, "ps");
tmpPSFile.close();
tmpPSFile.setAutoDelete(true);
if (djvuRenderer.convertToPSFile(converter, tmpPSFile.name(), pageList ) == true)
printer->printFiles( TQStringList(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...
TQString formats;
TQString ending;
int rindex = m_file.findRev(".");
if (rindex == -1) {
ending = TQString::null;
formats = TQString::null;
} else {
ending = m_file.mid(rindex); // e.g. ".dvi"
formats = fileFormats().grep(ending).join("\n");
}
TQString fileName = KFileDialog::getSaveFileName(TQString::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 (TQFile(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"