mirror of
https://invent.kde.org/graphics/okular
synced 2024-09-17 23:11:48 +00:00
a002b09e63
svn path=/trunk/kdegraphics/kdvi/; revision=19213
337 lines
7.2 KiB
C++
337 lines
7.2 KiB
C++
/**********************************************************************
|
|
|
|
--- Dlgedit generated file ---
|
|
|
|
File: print.cpp
|
|
Last generated: Wed Oct 1 21:53:48 1997
|
|
|
|
*********************************************************************/
|
|
|
|
#include <stdlib.h>
|
|
#include "print.h"
|
|
#include "printSetup.h"
|
|
|
|
#define Inherited printData
|
|
|
|
#include "marklist.h"
|
|
#include <qmessagebox.h>
|
|
#include <kapp.h>
|
|
#include <kdebug.h>
|
|
#include <klocale.h>
|
|
|
|
class DVIFile
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
DVIFile(){}
|
|
~DVIFile(){};
|
|
void dviCopy(QString ifile, QString ofile, QStrList *pagelist,
|
|
int first = 0, int last = 999999 );
|
|
|
|
};
|
|
|
|
print::print
|
|
(
|
|
QWidget* parent,
|
|
const char* name
|
|
)
|
|
:
|
|
Inherited( parent, name )
|
|
{
|
|
okButton->setDefault( TRUE );
|
|
setCaption( i18n("Print") );
|
|
readConfig();
|
|
printDestinationChanged( 0 );
|
|
printMarked->setEnabled( FALSE );
|
|
fileNameLabel->setBuddy( printFileName );
|
|
marklist = NULL;
|
|
rangeToggled( FALSE );
|
|
nup = 1;
|
|
printdest = 0;
|
|
}
|
|
|
|
|
|
print::~print()
|
|
{
|
|
}
|
|
|
|
void print::setFile( QString _file )
|
|
{
|
|
ifile = ofile = _file.copy();
|
|
setCaption( QString(i18n(i18n("Print "))) + ifile );
|
|
QString of( _file );
|
|
if ( of.right(4) == ".dvi" )
|
|
of = of.left( of.length()-4 );
|
|
of.append( printMethod == "dvilj4" ? ".lj" : ".ps" );
|
|
printFileName->setText(of);
|
|
}
|
|
|
|
void print::setCurrentPage( int _page, int _totalpages )
|
|
{
|
|
curpage = _page;
|
|
totalpages = _totalpages;
|
|
}
|
|
|
|
void print::setMarkList( QStrList *_marklist )
|
|
{
|
|
marklist = _marklist;
|
|
if ( !marklist || marklist->isEmpty() )
|
|
return;
|
|
printMarked->setEnabled( TRUE );
|
|
printMarked->setChecked( TRUE );
|
|
printAll->setChecked( FALSE );
|
|
printRange->setChecked( FALSE );
|
|
printCurrent->setChecked( FALSE );
|
|
}
|
|
|
|
void print::rangeToggled( bool on )
|
|
{
|
|
if ( on )
|
|
{
|
|
rangeFrom->setEnabled( TRUE );
|
|
rangeTo->setEnabled( TRUE );
|
|
rangeFrom->setFocus();
|
|
}
|
|
else
|
|
{
|
|
rangeFrom->setEnabled( FALSE );
|
|
rangeTo->setEnabled( FALSE );
|
|
}
|
|
}
|
|
|
|
#define get2(f) ((f.getch()<<8) + f.getch())
|
|
#define get4(f) ((get2(f)<<16) + get2(f))
|
|
#define put2(f,i) (f.putch(((i)>>8)&0xff), f.putch((i)&0xff))
|
|
#define put4(f,i) (put2(f,i>>16), put2(f,(i)))
|
|
|
|
void DVIFile::dviCopy(QString ifile, QString ofile, QStrList *pagelist,
|
|
int first, int last)
|
|
{
|
|
QFile in(ifile);
|
|
QFile out(ofile);
|
|
char buf[1024];
|
|
/* these would be needed for better handling the used fonts
|
|
int texfont[256], fontdeflen[256], fontseen[256];
|
|
for (int i=0; i<256; i++ )
|
|
texfont[i] = fontdeflen[i] = fontseen[i] = 0;
|
|
*/
|
|
if (!in.open(IO_ReadOnly))
|
|
QMessageBox::message( i18n("Warning"),
|
|
i18n("Cannot open dvi file!"),
|
|
i18n("OK") );
|
|
if (!out.open(IO_WriteOnly))
|
|
QMessageBox::message( i18n("Warning"),
|
|
i18n("Cannot open output dvi file!"),
|
|
i18n("OK") );;
|
|
in.readBlock( buf, 14 );
|
|
out.writeBlock( buf, 14 );
|
|
out.writeBlock( "\013kdvi output", 12 );
|
|
|
|
int c, p = in.size()-3, n, tot, totout = 0, o = -1;
|
|
in.at(p);
|
|
while ( ( c = in.getch() ) == 223 ) // trailer
|
|
in.at( --p );
|
|
if ( c != 2 )
|
|
QMessageBox::message( i18n("Warning"),
|
|
i18n("Cannot handle this dvi version!"),
|
|
i18n("OK") );;
|
|
int post_post = p - 5;
|
|
in.at( post_post + 1 );
|
|
int post = get4( in );
|
|
in.at( post + 27 );
|
|
tot = n = get2( in );
|
|
int fntdefslen = post_post - in.at();
|
|
int *pg = new int[tot + 1];
|
|
pg[ tot ] = post;
|
|
p = post - 40;
|
|
while (n--)
|
|
{
|
|
in.at( p + 41 ),
|
|
pg[n] = p = get4( in );
|
|
}
|
|
/*
|
|
for ( p = post + 29; p < post_post; p++ )
|
|
{
|
|
in.at( p );
|
|
c = in.getch();
|
|
if ( c == 138 ) ) // nop
|
|
continue;
|
|
if ( c == 243 ) // fnt_def1
|
|
{
|
|
texfont[ n = in.getch() ] = p;
|
|
in.at( p + 14 );
|
|
fontdeflen[ n ] = in.getch() + in.getch();
|
|
p += 16 + fontdeflen[ n ];
|
|
}
|
|
else debug("DVI file format error!");
|
|
}
|
|
*/
|
|
|
|
int defsdone = 0;
|
|
for ( n=0; n < tot; n++ ) // copy pages to out
|
|
{
|
|
if ( pagelist &&
|
|
pagelist->find( QString().sprintf( "%4d", n + 1 ) ) < 0 )
|
|
continue;
|
|
if ( n + 1 < first || n + 1 > last )
|
|
continue;
|
|
in.at( pg[n] );
|
|
in.readBlock( buf, 41 );
|
|
out.writeBlock( buf, 41 );
|
|
put4( out, o );
|
|
o = out.at() - 45;
|
|
if ( !defsdone ) // cannot copy fnt defs before page 1 due to bug in dvips
|
|
{
|
|
in.at( post + 29 );
|
|
// copy font defs from postamble (bug: all not needed)
|
|
for ( int i = fntdefslen; i>0; i-- )
|
|
out.putch( in.getch() );
|
|
defsdone = 1;
|
|
}
|
|
in.at( pg[n] + 45 );
|
|
for ( int i = pg[n+1] - pg[n] - 45; i > 0; i-- )
|
|
out.putch( in.getch() );
|
|
totout++;
|
|
}
|
|
out.putch( 248 ); // post
|
|
put4( out, o );
|
|
o = out.at() - 5;
|
|
in.at( post + 5 );
|
|
in.readBlock( buf, 22 );
|
|
out.writeBlock( buf, 22 );
|
|
put2( out, totout );
|
|
in.at( post + 29 );
|
|
for ( int i = post_post - ( post + 29 ); i > 0; i-- )
|
|
out.putch( in.getch() );
|
|
out.putch( 249 ); // post_post
|
|
put4( out, o );
|
|
out.putch( 2 ); // dvi file version id
|
|
put4( out, 0xdfdfdfdf );// trailers
|
|
while ( out.at() & 3 )
|
|
out.putch( 0xdf );
|
|
in.close();
|
|
out.close();
|
|
delete pg;
|
|
}
|
|
|
|
void print::okPressed()
|
|
{
|
|
QString cmd;
|
|
|
|
cmd = printMethod == "dvilj4" ? "dvilj4 -q -e-" : "dvips -q -f";
|
|
|
|
if ( printReverse->isOn() )
|
|
cmd += " -r";
|
|
|
|
if ( ! printAll->isOn() )
|
|
{
|
|
DVIFile dvi;
|
|
ofile = tmpnam(NULL);
|
|
if ( printCurrent->isOn() )
|
|
dvi.dviCopy( ifile, ofile, NULL, curpage, curpage );
|
|
else if ( printMarked->isOn() )
|
|
dvi.dviCopy( ifile, ofile, marklist );
|
|
else if ( printRange->isOn() )
|
|
{
|
|
int f = QString(rangeFrom->text()).toInt(),
|
|
t = QString(rangeTo->text()).toInt();
|
|
if ( f < 1 || f > totalpages || t < f || t > totalpages )
|
|
{
|
|
QMessageBox::message( i18n("Warning"),
|
|
i18n("Invalid page range!"),
|
|
i18n("OK") );
|
|
return;
|
|
}
|
|
dvi.dviCopy( ifile, ofile, NULL, f, t );
|
|
}
|
|
}
|
|
|
|
cmd += " " + ofile;
|
|
|
|
if ( nup != 1 )
|
|
{
|
|
cmd += nupProgram == "mpage" ? " | mpage -" : " | psnup -";
|
|
cmd += QString().setNum(nup);
|
|
if ( colOrder->currentItem() == 1 )
|
|
cmd += nupProgram == "mpage" ? " -a" : " -c";
|
|
|
|
}
|
|
|
|
if ( printdest == 1 )
|
|
cmd += QString(" > ") + printFileName->text();
|
|
else
|
|
{
|
|
cmd += QString(" | ") + spooler;
|
|
if ( printdest > 1 )
|
|
cmd += QString(" -P") +
|
|
printer->text(printer->currentItem());
|
|
}
|
|
|
|
if ( ifile != ofile )
|
|
cmd += " ; rm " + ofile;
|
|
|
|
cmd += " &";
|
|
|
|
kdebug(KDEBUG_INFO, 4300,"About to run: %s", cmd);
|
|
system( cmd );
|
|
accept();
|
|
}
|
|
|
|
void print::nupPressed(int n)
|
|
{
|
|
nup = 1 << n;
|
|
}
|
|
|
|
void print::printDestinationChanged(int i)
|
|
{
|
|
printdest = i;
|
|
if ( printdest == 1 )
|
|
{
|
|
printFileName->setEnabled( TRUE );
|
|
fileNameLabel->setEnabled( TRUE );
|
|
}
|
|
else
|
|
{
|
|
printFileName->setEnabled( FALSE );
|
|
fileNameLabel->setEnabled( FALSE );
|
|
}
|
|
}
|
|
|
|
void print::setupPressed()
|
|
{
|
|
printSetup * ps = new printSetup( this, "ps" );
|
|
ps->exec();
|
|
delete ps;
|
|
readConfig();
|
|
}
|
|
|
|
void print::cancelPressed()
|
|
{
|
|
reject();
|
|
}
|
|
|
|
void print::readConfig()
|
|
{
|
|
KConfig *config = kapp->getConfig();
|
|
|
|
printer->clear();
|
|
printer->insertItem( i18n( "Default Printer" ) );
|
|
printer->insertItem( i18n( "File" ) );
|
|
config->setGroup( "Printing" );
|
|
int n = config->readNumEntry( "PrinterCount" );
|
|
if ( n > 0 )
|
|
for ( int i = 1; i <= n; i++ )
|
|
{
|
|
QString p;
|
|
p = config->readEntry( "Printer"+p.setNum( i ) );
|
|
printer->insertItem( p );
|
|
}
|
|
nupProgram = config->readEntry( "NupProgram", "psnup" );
|
|
printMethod = config->readEntry( "PrintMethod", "dvips" );
|
|
nupCombo->setEnabled( printMethod == "dvips" );
|
|
colOrder->setEnabled( printMethod == "dvips" );
|
|
spooler = config->readEntry( "SpoolerCommand", "lpr" );
|
|
|
|
config->setGroup( "kdvi" );
|
|
}
|