okular/kdvi.cpp
David Faure eb5e7e3c5a Fixed coredump. kdvi actually shows up now !
But why do all Qt 2.0 apps look like Mac ?

svn path=/trunk/kdegraphics/kdvi/; revision=17655
1999-03-06 00:52:28 +00:00

1083 lines
28 KiB
C++

//
// Application: kdvi
//
// Previewer for TeX DVI files.
//
#include <qlayout.h>
#include <qdir.h>
#include <qfiledialog.h>
#include <qpixmap.h>
#include <qpushbutton.h>
#include <qtooltip.h>
#include <qapplication.h>
#include <kmenubar.h>
#include <qmessagebox.h>
#include <qgroupbox.h>
#include <qfileinfo.h>
#include <qkeycode.h>
#include <qlineedit.h>
#include <qframe.h>
#include <kapp.h>
#include <kpanner.h>
#include <klocale.h>
#include <kiconloader.h>
#include <kdebug.h>
#include <kprocess.h>
#include <kfiledialog.h>
#include "kdvi.h"
#include "scrbox.h"
#include "print.h"
#include "pushbutton.h"
#include "prefs.h"
#include "version.h"
#include <unistd.h>
#include <signal.h>
enum {ID_STAT_SHRINK, ID_STAT_PAGE, ID_STAT_MSG, ID_STAT_XY};
enum {ID_OPT_PK = 3, ID_OPT_PS, ID_OPT_MB, ID_OPT_BB, ID_OPT_TB, ID_OPT_SB, ID_OPT_SC };
kdvi::kdvi( char *fname, QWidget *, const char *name )
: KTopLevelWidget( name )
{
msg = NULL;
ssmenu = NULL;
hbl = NULL;
prefs = NULL;
keys = new KAccel(this);
readConfig();
setMinimumSize( 400, 60 );
setCaption( kapp->getCaption() );
tipgroup = new QToolTipGroup( this, "TipGroup" );
connect( tipgroup, SIGNAL(showTip(const QString &)), SLOT(showTip(const QString &)) );
connect( tipgroup, SIGNAL(removeTip()), SLOT(removeTip()) );
// Create KPanner for toolBar2 and dviwindow
kpan = new KPanner( this, "panner",
KPanner::O_VERTICAL|KPanner::U_ABSOLUTE, 100);
setView( kpan, TRUE );
setFrameBorderWidth( 4 );
kpan->setAbsSeparator( pannerValue );
connect( kpan, SIGNAL(positionChanged()), SLOT(pannerChanged()) );
// Create a dvi window
dviwin = new dviWindow( basedpi, mfmode, paper, makepk,
kpan->child1(), "dviWindow" );
connect( dviwin, SIGNAL(currentPage(int)), SLOT(setPage(int)) );
connect( dviwin, SIGNAL(shrinkChanged(int)), SLOT(shrinkChanged(int)) );
connect( dviwin, SIGNAL(fileChanged()), SLOT(fileChanged()) );
connect( dviwin, SIGNAL(statusChange(const QString &)),
SLOT(showTip(const QString &)) );
connect( dviwin, SIGNAL(setPoint(QPoint)), SLOT(showPoint(QPoint)) );
// Create a menubar
menuBar = NULL;
makeMenuBar();
// Create toolbars
toolBar = NULL;
makeButtons();
makeToolBar2( kpan->child0() );
// Create a statusbar
statusBar = NULL;
makeStatusBar( i18n("No document") );
// Lay out widgets
QBoxLayout *l;
l = new QBoxLayout( kpan->child0(), QBoxLayout::LeftToRight );
l->addWidget( toolBar2 );
l->activate();
l = new QBoxLayout( kpan->child1(), QBoxLayout::LeftToRight );
l->addWidget( dviwin );
l->activate();
// Create RMB menu
rmbmenu = new QPopupMenu;
rmbmenu->setMouseTracking( TRUE );
rmbmenu->connectItem( rmbmenu->insertItem(i18n("Toggle Menubar")),
this, SLOT(toggleShowMenubar()) );
rmbmenu->connectItem( rmbmenu->insertItem(i18n("Mark page")),
marklist, SLOT(markSelected()) );
rmbmenu->connectItem( rmbmenu->insertItem(i18n("Redraw")),
dviwin, SLOT(drawPage()) );
rmbmenu->connectItem( rmbmenu->insertItem(i18n("Preferences ...")),
this, SLOT(optionsPreferences()) );
// Bind keys
bindKeys();
updateMenuAccel();
// Drag and drop
KDNDDropZone * dropZone = new KDNDDropZone( this , DndURL);
connect( dropZone, SIGNAL( dropAction( KDNDDropZone *) ),
SLOT( dropEvent( KDNDDropZone *) ) );
// Read config options
applyPreferences();
selectSmall();
dviwin->installEventFilter( this );
message( "" );
openFile(QString(fname));
}
kdvi::~kdvi()
{
if ( toolBar ) delete toolBar;
if ( statusBar ) delete statusBar;
if ( menuBar ) delete menuBar;
}
// This avoids seg fault at destructor:
void kdvi::closeEvent( QCloseEvent *e )
{
if ( toolBar ) delete toolBar;
toolBar = NULL;
if ( statusBar ) delete statusBar;
statusBar = NULL;
if ( menuBar ) delete menuBar;
menuBar = NULL;
e->accept();
}
static QPopupMenu *m_f, *m_v, *m_p, *m_o, *m_h;
static int m_fn, m_fo, m_fr, m_fp, m_fx, m_vi, m_vo, m_vf, m_vw, m_vr, m_pp, m_pn, m_pf, m_pl, m_pg,
m_op, m_ok, m_of, m_o0, m_om, m_ob, m_ot, m_os, m_ol, m_hc; // , m_ha, m_hq;
void kdvi::makeMenuBar()
{
if (menuBar) delete menuBar;
menuBar = new KMenuBar( this );
CHECK_PTR( menuBar );
QPopupMenu *p = new QPopupMenu;
CHECK_PTR( p );
m_fn = p->insertItem( i18n("&New"), this, SLOT(fileNew()) );
m_fo = p->insertItem( i18n("&Open ..."), this, SLOT(fileOpen()) );
recentmenu = new QPopupMenu;
CHECK_PTR( recentmenu );
connect( recentmenu, SIGNAL(activated(int)), SLOT(openRecent(int)) );
m_fr = p->insertItem( i18n("Open &recent"), recentmenu );
m_fp = p->insertItem( i18n("&Print ..."), this, SLOT(filePrint()));
m_fx = p->insertItem( i18n("E&xit"), this, SLOT(fileExit()));
m_f = p;
menuBar->insertItem( i18n("&File"), p, -2 );
p = new QPopupMenu;
CHECK_PTR( p );
m_vi = p->insertItem( i18n("Zoom &in"), dviwin, SLOT(prevShrink()) );
m_vo = p->insertItem( i18n("Zoom &out"), dviwin, SLOT(nextShrink()) );
m_vf = p->insertItem( i18n("&Fit to page"), this, SLOT(viewFitPage()) );
m_vw = p->insertItem( i18n("Fit to page &width"), this, SLOT(viewFitPageWidth()));
p->insertSeparator();
m_vr = p->insertItem( i18n("&Redraw page"), dviwin, SLOT(drawPage()) );
m_v = p;
menuBar->insertItem( i18n("&View"), p, -2 );
p = new QPopupMenu;
CHECK_PTR( p );
m_pp = p->insertItem( i18n("&Previous"), dviwin, SLOT(prevPage()) );
m_pn = p->insertItem( i18n("&Next"), dviwin, SLOT(nextPage()) );
m_pf = p->insertItem( i18n("&First"), dviwin, SLOT(firstPage()) );
m_pl = p->insertItem( i18n("&Last"), dviwin, SLOT(lastPage()) );
m_pg = p->insertItem( i18n("&Go to ..."), this, SLOT(pageGoto()) );
m_p = p;
menuBar->insertItem( i18n("&Page"), p, -2 );
p = new QPopupMenu;
CHECK_PTR( p );
p->setCheckable( TRUE );
m_op = p->insertItem( i18n("&Preferences ..."), this, SLOT(optionsPreferences()));
m_ok = p->insertItem( i18n("&Keys ..."), this, SLOT(configKeys()));
p->insertSeparator();
m_of = p->insertItem( i18n("Make PK-&fonts"), this, SLOT(toggleMakePK()) );
p->setItemChecked( m_of, makepk );
m_o0 = p->insertItem( i18n("Show PS"), this, SLOT(toggleShowPS()));
p->setItemChecked( m_o0, showPS );
m_om = p->insertItem( i18n("Show &Menubar"), this, SLOT(toggleShowMenubar()) );
p->setItemChecked( m_om, !hideMenubar );
m_ob = p->insertItem( i18n("Show &Buttons"), this, SLOT(toggleShowButtons()) );
p->setItemChecked( m_ob, !hideButtons );
m_ot = p->insertItem( i18n("Show Page Lis&t"), this, SLOT(toggleVertToolbar()) );
p->setItemChecked( m_ol, vertToolbar );
m_os = p->insertItem( i18n("Show &Statusbar"), this, SLOT(toggleShowStatusbar()) );
p->setItemChecked( m_os, !hideStatusbar );
m_ol = p->insertItem( i18n("Show Scro&llbars"), this, SLOT(toggleShowScrollbars()) );
p->setItemChecked( m_ol, !hideScrollbars );
m_o = p;
menuBar->insertItem( i18n("&Options"), p, -2 );
optionsmenu = p;
menuBar->insertSeparator();
QPopupMenu *help = kapp->getHelpMenu(true, QString(i18n("DVI Viewer"))
+ " " + KDVI_VERSION
+ i18n("\n\nby Markku Hihnala")
+ " (mah@ee.oulu.fi)");
m_h = help;
m_hc = help->idAt(0);
menuBar->insertItem( i18n("&Help"), help );
if ( hideMenubar ) menuBar->hide();
setMenu( menuBar );
}
void kdvi::makeButtons()
{
QPixmap pm;
if ( toolBar ) delete toolBar;
toolBar = new KToolBar( this );
#define I(f,o,s,h) toolBar->insertButton( kapp->getIconLoader()->loadIcon(f),\
0, SIGNAL(clicked()), o, SLOT(s()), TRUE, h);
I( "fileopen.xpm", this, fileOpen, i18n("Open document ...") )
I( "reload.xpm", dviwin, drawPage, i18n("Reload document") )
I( "fileprint.xpm", this, filePrint, i18n("Print ...") )
toolBar->insertSeparator();
I( "start.xpm", dviwin, firstPage, i18n("Go to first page") )
I( "back.xpm", dviwin, prevPage, i18n("Go to previous page") )
I( "forwpage.xpm", dviwin, goForward, i18n("Go down then top of next page") )
I( "forward.xpm", dviwin, nextPage, i18n("Go to next page") )
I( "finish.xpm", dviwin, lastPage, i18n("Go to last page") )
toolBar->insertSeparator();
I( "viewmag-.xpm", dviwin, nextShrink, i18n("Decrease magnification") )
I( "smalltext.xpm", this, selectSmall, i18n("Small text") )
I( "largetext.xpm", this, selectLarge, i18n("Large text") )
I( "viewmag+.xpm", dviwin, prevShrink, i18n("Increase magnification") )
#undef I
addToolBar( toolBar );
}
void kdvi::makeToolBar2(QWidget *parent)
{
QPixmap pm;
toolBar2 = new QFrame( parent );
QBoxLayout * gl = new QBoxLayout( toolBar2, QBoxLayout::Down );
sbox = new ScrollBox( toolBar2 );
connect( sbox, SIGNAL(valueChanged(QPoint)),
dviwin, SLOT(scroll(QPoint)) );
connect( sbox, SIGNAL(button3Pressed()), dviwin, SLOT(nextPage()) );
connect( sbox, SIGNAL(button2Pressed()), dviwin, SLOT(prevPage()) );
connect( dviwin, SIGNAL(pageSizeChanged( QSize )),
sbox, SLOT(setPageSize( QSize )) );
connect( dviwin, SIGNAL(viewSizeChanged( QSize )),
sbox, SLOT(setViewSize( QSize )) );
connect( dviwin, SIGNAL(currentPosChanged( QPoint )),
sbox, SLOT(setViewPos( QPoint )) );
QToolTip::add( sbox, "", tipgroup, i18n("Scroll window and switch the page") );
sbox->setFixedSize(70,80);
gl->addWidget( sbox );
// Create a MarkList
marklist = new MarkList( toolBar2 );
connect( marklist, SIGNAL(selected(const QString &)),
SLOT(pageActivated(const QString &)) );
QToolTip::add( marklist, "", tipgroup, i18n("Select page and mark pages for printing") );
gl->addWidget( marklist );
gl->activate();
sbox->setPageSize( dviwin->pageSize() );
}
void kdvi::makeStatusBar( QString )
{
QPixmap pm;
if ( statusBar ) delete statusBar;
statusBar = new KStatusBar( this );
statusBar->setInsertOrder( KStatusBar::RightToLeft );
statusBar->insertItem(i18n("X:0000, Y:0000 "), ID_STAT_XY);
statusBar->changeItem("", ID_STAT_XY);
statusBar->insertItem(i18n("Shrink: xx"), ID_STAT_SHRINK);
statusBar->changeItem("", ID_STAT_SHRINK);
statusBar->insertItem(i18n("Page: xxxx / xxxx"), ID_STAT_PAGE);
statusBar->changeItem("", ID_STAT_PAGE);
statusBar->insertItem("", ID_STAT_MSG);
setStatusBar( statusBar );
}
void kdvi::bindKeys()
{
//kKeys->registerWidget("kdvi", this);
#define AKCF(f,k,o,s) keys->insertItem(f, f, k);\
keys->connectItem( f, o, SLOT(s()));
AKCF(i18n("New window"), "CTRL+N", this, fileNew )
AKCF(i18n("Open file"), "CTRL+O", this, fileOpen )
AKCF(i18n("Print dialog"), "CTRL+P", this, filePrint )
AKCF(i18n("Quit"), "CTRL+Q", qApp, quit )
AKCF(i18n("Zoom in"), "Plus", dviwin, prevShrink )
AKCF(i18n("Zoom out"), "Minus", dviwin, nextShrink )
AKCF(i18n("Fit window"), "Asterisk", this, viewFitPage )
AKCF(i18n("Fit width"), "Slash", this, viewFitPageWidth)
AKCF(i18n("Redraw page"), "CTRL+R", dviwin, drawPage )
AKCF(i18n("Next page"), "Next", dviwin, nextPage )
AKCF(i18n("Previous page"),"Prior", dviwin, prevPage )
AKCF(i18n("Last page"), "CTRL+Next", dviwin, lastPage )
AKCF(i18n("First page"), "CTRL+Prior", dviwin, firstPage )
AKCF(i18n("Goto page"), "CTRL+G", this, pageGoto )
AKCF(i18n("Configure keys"),"CTRL+K", this, configKeys )
AKCF(i18n("Toggle show PS"),"CTRL+V", this, toggleShowPS )
AKCF(i18n("Toggle menu bar"),"CTRL+M", this, toggleShowMenubar)
AKCF(i18n("Toggle button bar"),"CTRL+B", this, toggleShowButtons)
AKCF(i18n("Toggle page list"),"CTRL+T", this, toggleVertToolbar)
AKCF(i18n("Toggle status bar"),"CTRL+S", this, toggleShowStatusbar)
AKCF(i18n("Toggle scroll bars"),"CTRL+L", this, toggleShowScrollbars)
AKCF(i18n("Help"), "F1", this, helpContents )
#undef AKCF
config->setGroup( "kdvi" );
}
/*
static void changeMenuAccel ( QPopupMenu *menu, int id,
const char *functionName )
{
QString s = menu->text( id );
if ( !s ) return;
int i = s.find('\t');
QString k = keyToString( kKeys->readCurrentKey( functionName ) );
if( !k ) return;
if ( i >= 0 )
s.replace( i+1, s.length()-i, k );
else {
s += '\t';
s += k;
}
menu->changeItem( s, id );
}
*/
void kdvi::updateMenuAccel()
{
keys->changeMenuAccel( m_f, m_fn, i18n("New window") );
keys->changeMenuAccel( m_f, m_fo, i18n("Open file") );
keys->changeMenuAccel( m_f, m_fp, i18n("Print dialog") );
keys->changeMenuAccel( m_f, m_fx, i18n("Quit") );
keys->changeMenuAccel( m_v, m_vi, i18n("Zoom in") );
keys->changeMenuAccel( m_v, m_vo, i18n("Zoom out") );
keys->changeMenuAccel( m_v, m_vf, i18n("Fit window") );
keys->changeMenuAccel( m_v, m_vw, i18n("Fit width") );
keys->changeMenuAccel( m_v, m_vr, i18n("Redraw page") );
keys->changeMenuAccel( m_p, m_pp, i18n("Previous page") );
keys->changeMenuAccel( m_p, m_pn, i18n("Next page") );
keys->changeMenuAccel( m_p, m_pf, i18n("First page") );
keys->changeMenuAccel( m_p, m_pl, i18n("Last page") );
keys->changeMenuAccel( m_p, m_pg, i18n("Goto page") );
keys->changeMenuAccel( m_o, m_o0, i18n("Toggle show PS") );
keys->changeMenuAccel( m_o, m_om, i18n("Toggle menu bar") );
keys->changeMenuAccel( m_o, m_ob, i18n("Toggle button bar") );
keys->changeMenuAccel( m_o, m_ot, i18n("Toggle page list") );
keys->changeMenuAccel( m_o, m_os, i18n("Toggle status bar") );
keys->changeMenuAccel( m_o, m_ol, i18n("Toggle scroll bars") );
keys->changeMenuAccel( m_h, m_hc, i18n("Help") );
}
void kdvi::configKeys()
{
KKeyDialog::configureKeys(keys);
updateMenuAccel();
config->setGroup( "kdvi" );
}
void kdvi::resizeEvent( QResizeEvent* e )
{
KTopLevelWidget::resizeEvent( e );
config->setGroup( "kdvi" );
config->writeEntry( "Width", width() );
config->writeEntry( "Height", height() );
}
bool kdvi::eventFilter( QObject *obj , QEvent *e )
{
if ( obj != dviwin || e->type() != QEvent::MouseButtonPress )
return FALSE;
QMouseEvent *me = (QMouseEvent*)e;
if ( me->button() != RightButton )
return FALSE;
rmbmenu->popup( dviwin->mapToGlobal(me->pos()), 0 );
return TRUE;
}
void kdvi::fileNew( )
{
newWindow();
}
void kdvi::newWindow( const char *name )
{ // Start a new process as the dvi and font routines are not reentrant
// This needs to be changed..
KProcess kp;
kp.setExecutable( "kdvi" );
if ( name )
kp << name;
kp.start( KProcess::DontCare, KProcess::NoCommunication );
}
void kdvi::fileOpen()
{
QString dir;
if ( dviName )
dir = QFileInfo( dviName ).dirPath();
message( i18n("File open dialog is open") );
QString f = KFileDialog::getOpenFileName( dir, "*.dvi");
message( "" );
openFile( f );
}
void kdvi::fileExit()
{
close();
qApp->quit();
}
void kdvi::openRecent(QPoint p)
{
recentmenu->popup( p );
}
void kdvi::openRecent(int id)
{
openFile( recent.at(id) );
}
void kdvi::updateMarklist()
{
QString s;
marklist->setAutoUpdate( FALSE );
marklist->clear();
for (int i = dviwin->totalPages(); i>0; i--)
{
s.sprintf( "%4d", i );
marklist->insertItem( s, 0 );
}
marklist->select(0);
marklist->setAutoUpdate( TRUE );
marklist->update();
}
void kdvi::openFile( QString name)
{
if ( name.isEmpty() )
return;
QString oname( name );
//name.detach();
if ( ! QFileInfo( name ).isReadable() )
name.append( ".dvi" );
if ( ! QFileInfo( name ).isReadable() )
{
QMessageBox::information( this, i18n("Notice"),
QString(i18n("Can't read file:\n")) +
oname, i18n("OK"));
return;
}
QDir::setCurrent( QFileInfo( name ).dirPath() );
dviName = name.copy();
message( i18n("Opening ") + name + " ...");
makeStatusBar( dviName );
applyShowStatusbar();
dviwin->setFile( name );
dviwin->repaint();
setCaption( QString()+kapp->getCaption()+": "+name );
setPage();
shrinkChanged( dviwin->shrink() );
if (-1==recent.find(name))
{
recent.insert(0,name);
if (recent.count()>(unsigned)recentmax)
recent.removeLast();
config->setGroup("RecentFiles");
int i=recent.count();
while ( i-->0 )
config->writeEntry(QString().setNum(i),
recent.at(i));
config->setGroup( "kdvi" );
recentmenu->clear();
for (int n=recent.count(); n-->0;)
recentmenu->insertItem( recent.at(n), n, 0 );
}
updateMarklist();
message( i18n("Opened ") + name );
}
void kdvi::filePrint()
{
if (!dviName)
return;
print * printdlg = new print( this, "printdlg" );
message( i18n("Print dialog is open") );
printdlg->setFile( dviName );
printdlg->setCurrentPage( dviwin->page(), dviwin->totalPages() );
printdlg->setMarkList( marklist->markList() );
printdlg->exec();
message( "" );
delete printdlg;
}
void kdvi::viewFitPage()
{
resize( rect().size() + dviwin->pageSize() - dviwin->viewSize() );
resize( rect().size() + dviwin->pageSize() - dviwin->viewSize() );
resize( rect().size() + dviwin->pageSize() - dviwin->viewSize() );
message( i18n("View size fits page") );
}
void kdvi::viewFitPageWidth()
{
QSize s = rect().size();
resize( s.width() + dviwin->pageSize().width() - dviwin->viewSize().width(),
s.height() );
message( i18n("View width fits page") );
}
void kdvi::optionsPreferences()
{
if ( !prefs )
{ prefs = new kdviprefs;
connect( prefs, SIGNAL(preferencesChanged()),
SLOT(applyPreferences()));
}
prefs->show();
}
void kdvi::applyPreferences()
{
QString s;
config->setGroup( "kdvi" );
s = config->readEntry( "FontPath" );
if ( !s.isEmpty() && s != dviwin->fontPath() )
dviwin->setFontPath( s );
basedpi = config->readNumEntry( "BaseResolution" );
if ( basedpi <= 0 )
config->writeEntry( "BaseResolution", basedpi = 300 );
if ( basedpi != dviwin->resolution() )
dviwin->setResolution( basedpi );
mfmode = config->readEntry( "MetafontMode" );
if ( mfmode.isNull() )
config->writeEntry( "MetafontMode", mfmode = "/" );
if ( mfmode != dviwin->metafontMode() )
dviwin->setMetafontMode( mfmode );
paper = config->readEntry( "Paper" );
if ( paper.isNull() )
config->writeEntry( "Paper", paper = "A4" );
if ( paper != dviwin->paper() )
dviwin->setPaper( paper );
s = config->readEntry( "Gamma" );
if ( !s.isEmpty() && s.toFloat() != dviwin->gamma() )
dviwin->setGamma( s.toFloat() );
makepk = config->readNumEntry( "MakePK" );
applyMakePK();
showPS = config->readNumEntry( "ShowPS" );
applyShowPS();
dviwin->setAntiAlias( config->readNumEntry( "PS Anti Alias", 1 ) );
hideMenubar = config->readNumEntry( "HideMenubar" );
applyShowMenubar();
hideButtons = config->readNumEntry( "HideButtons" );
applyShowButtons();
vertToolbar = config->readNumEntry( "VertToolbar" );
applyVertToolbar();
hideStatusbar = config->readNumEntry( "HideStatusbar" );
applyShowStatusbar();
hideScrollbars = config->readNumEntry( "HideScrollbars" );
applyShowScrollbars();
smallShrink = config->readNumEntry( "SmallShrink" );
if (!smallShrink) smallShrink = 6;
largeShrink = config->readNumEntry( "LargeShrink" );
if (!largeShrink) largeShrink = 2;
config->setGroup( "RecentFiles" );
s = config->readEntry( "MaxCount" );
if ( s.isNull() || (recentmax = s.toInt())<=0 )
config->writeEntry( "MaxCount", recentmax = 10 );
int n = 0;
recent.clear();
while ( n < recentmax )
{
s = config->readEntry(QString().setNum(n++));
if ( !s.isEmpty() )
recent.insert( 0, s );
else break;
}
recentmenu->clear();
for (n=recent.count(); n-->0;)
recentmenu->insertItem( recent.at(n), n, 0 );
config->setGroup( "kdvi" );
message(i18n("Preferences applied"));
}
PageDialog::PageDialog() : QDialog( 0, 0, 1 ),
gb(i18n(" Page "),this), ed(&gb), ok(&gb), cancel(&gb)
{
setCaption( i18n("Go to page") );
gb.setFrameStyle( QFrame::Box | QFrame::Sunken );
gb.setLineWidth( 1 );
QBoxLayout l1( this, QBoxLayout::LeftToRight, 15 );
l1.addWidget( &gb );
QBoxLayout l2( &gb, QBoxLayout::Down, 15, 10 );
l2.addSpacing(fontMetrics().height());
l2.addWidget( &ed );
ed.setFocus();
connect( &ed, SIGNAL(returnPressed()), SLOT(go()) );
QBoxLayout l3( QBoxLayout::LeftToRight, 15 );
l2.addLayout( &l3 );
l3.addWidget( &ok );
l3.addWidget( &cancel );
ok.setText( i18n("Go to") );
connect( &ok, SIGNAL(clicked()), SLOT(go()) );
cancel.setText( i18n("Cancel") );
resize( 300, 150 );
l1.activate();
l2.activate();
setFixedSize(size());
connect( &cancel, SIGNAL(clicked()), SLOT(reject()) );
}
void kdvi::pageGoto()
{
PageDialog dlg;
connect( &dlg, SIGNAL(textEntered(const QString &)), SLOT(pageActivated(const QString &)) );
dlg.show();
}
void kdvi::toggleMakePK()
{
makepk = !makepk;
applyMakePK();
message( makepk ? i18n("Missing PK-fonts will be generated"):
i18n("Missing PK-fonts will be logged to 'missfont.log'") );
}
void kdvi::applyMakePK()
{
if ( makepk == dviwin->makePK() )
return;
dviwin->setMakePK( makepk );
optionsmenu->setItemChecked( optionsmenu->idAt(ID_OPT_PK), makepk );
config->writeEntry( "MakePK", makepk );
}
void kdvi::toggleShowPS()
{
showPS = !showPS;
applyShowPS();
message( showPS ? i18n("Postcsript specials are rendered") :
i18n("Postscript specials are not rendered") );
}
void kdvi::applyShowPS()
{
if ( showPS == dviwin->showPS() )
return;
dviwin->setShowPS( showPS );
optionsmenu->setItemChecked( optionsmenu->idAt(ID_OPT_PS), showPS );
config->writeEntry( "ShowPS", showPS );
}
void kdvi::toggleShowMenubar()
{
hideMenubar = !hideMenubar;
applyShowMenubar();
message( hideMenubar ? i18n("No menu bar") : i18n("Menu bar is shown") );
}
void kdvi::applyShowMenubar()
{
if ( hideMenubar ) menuBar->hide();
else menuBar->show();
optionsmenu->setItemChecked( optionsmenu->idAt(ID_OPT_MB), !hideMenubar );
config->writeEntry( "HideMenubar", hideMenubar );
// calling this will update the child geometries
updateRects();
}
void kdvi::toggleShowButtons()
{
hideButtons = !hideButtons;
applyShowButtons();
message( hideButtons ? i18n("No button bar") : i18n("Button bar is shown") );
}
void kdvi::applyShowButtons()
{
enableToolBar( hideButtons ? KToolBar::Hide : KToolBar::Show );
optionsmenu->setItemChecked( optionsmenu->idAt(ID_OPT_BB), !hideButtons );
config->writeEntry( "HideButtons", hideButtons );
}
void kdvi::toggleVertToolbar()
{
vertToolbar = !vertToolbar;
applyVertToolbar();
message( vertToolbar ? i18n("Tool bar is shown") : i18n("No tool bar") );
}
void kdvi::applyVertToolbar()
{
if (vertToolbar)
{
kpan->setLimits(0,0);
kpan->setAbsSeparator(pannerValue);
}
else
{
if (kpan->getAbsSeparator())
kpan->setAbsSeparator(0);
kpan->setLimits(0,1);
}
optionsmenu->setItemChecked( optionsmenu->idAt(ID_OPT_TB), vertToolbar );
config->writeEntry( "VertToolbar", vertToolbar );
}
void kdvi::toggleShowStatusbar()
{
hideStatusbar = !hideStatusbar;
applyShowStatusbar();
message( hideStatusbar ? i18n("No status bar") : i18n("Status bar is shown") );
}
void kdvi::applyShowStatusbar()
{
enableStatusBar( hideStatusbar ? KStatusBar::Hide : KStatusBar::Show );
optionsmenu->setItemChecked( optionsmenu->idAt(ID_OPT_SB), !hideStatusbar );
config->writeEntry( "HideStatusbar", hideStatusbar );
}
void kdvi::toggleShowScrollbars()
{
hideScrollbars = !hideScrollbars;
applyShowScrollbars();
message( !hideScrollbars ? i18n("Scroll bars are shown") : i18n("No scroll bars"));
}
void kdvi::applyShowScrollbars()
{
dviwin->setShowScrollbars( !hideScrollbars );
optionsmenu->setItemChecked( optionsmenu->idAt(ID_OPT_SC), !hideScrollbars );
config->writeEntry( "HideScrollbars", hideScrollbars );
}
void kdvi::helpContents()
{
kapp->invokeHTMLHelp("","");
}
/*
void kdvi::helpAbout()
{
QMessageBox::information( this, i18n("About Kdvi"),
i18n("kdvi - TeX DVI viewer\nVersion ")
+ QString( KDVI_VERSION )
+ i18n("\n\nMarkku Hihnala <mah@ee.oulu.fi>"),
i18n("OK") );
}
void kdvi::helpAboutQt()
{
QMessageBox::aboutQt( this, "About Qt" );
}
*/
void kdvi::pannerChanged()
{
int i = kpan->getAbsSeparator();
if ( i>1 )
config->writeEntry( "Separator", pannerValue = i );
else
{
vertToolbar = 0;
applyVertToolbar();
}
}
void kdvi::pageActivated( const QString & text)
{
int pg = text.toInt();
if (dviwin->page() != pg)
dviwin->gotoPage( pg );
dviwin->setFocus();
}
void kdvi::setPage( int pg )
{
QString str;
if (!pg) pg = dviwin->page();
if (!pg) return;
str.setNum( pg );
str = i18n("Page: ") + str + i18n(" / ") + QString().setNum(dviwin->totalPages());
statusBar->changeItem( str, ID_STAT_PAGE );
if ( marklist )
marklist->select( pg - 1 );
}
void kdvi::selectShrink( QPoint p )
{
sndr = sender()->name();
if (!ssmenu)
{
ssmenu = new QPopupMenu;
ssmenu->setMouseTracking( TRUE );
connect( ssmenu, SIGNAL(activated(int)),
SLOT(selectShrink(int)) );
QString s;
for ( int i=1; i<=basedpi/20; i++ )
ssmenu->insertItem( s.setNum( i ) );
}
ssmenu->popup( p - QPoint( 10, 10 ),
(QString(sndr) == "largeButton" ? largeShrink : smallShrink) - 1 );
}
void kdvi::selectShrink( int id )
{
if ( QString(sndr) == "largeButton" )
{
dviwin->setShrink( id + 1 );
largeShrink = dviwin->shrink();
config->writeEntry( "LargeShrink", largeShrink );
message(i18n("Large text button set to shrink factor ") +
QString().setNum(largeShrink) );
}
else
{
dviwin->setShrink( id + 1 );
smallShrink = dviwin->shrink();
config->writeEntry( "SmallShrink", smallShrink );
message(i18n("Small text button set to shrink factor ") +
QString().setNum(smallShrink) );
}
}
void kdvi::selectLarge()
{
dviwin->setShrink(largeShrink);
}
void kdvi::selectSmall()
{
dviwin->setShrink(smallShrink);
}
void kdvi::shrinkChanged(int s)
{
QString t;
t.sprintf(i18n("Shrink: %d"), s );
statusBar->changeItem( t, ID_STAT_SHRINK);
}
void kdvi::fileChanged()
{
message( i18n("File reloaded.") );
if ( dviwin->totalPages() != marklist->count() )
updateMarklist();
setPage();
}
void kdvi::showTip( const QString & tip)
{
message( tip );
}
void kdvi::removeTip( )
{
message( "" );
}
void kdvi::message( const QString &s )
{
statusBar->changeItem( s, ID_STAT_MSG );
}
void kdvi::showPoint( QPoint p )
{
int x = p.x(), y = p.y();
float f = dviwin->shrink() * 25.40 / dviwin->resolution();
x = int(x * f), y = int(y * f);
QString s;
s.sprintf( "X:%4d, Y:%4d", x, y );
statusBar->changeItem( s, ID_STAT_XY );
}
void kdvi::readConfig()
{
QString s;
config = KApplication::getKApplication()->getConfig();
config->setGroup( "kdvi" );
pannerValue = config->readNumEntry( "Separator" );
if (!pannerValue)
config->writeEntry( "Separator", pannerValue = 80 );
showPS = config->readNumEntry( "ShowPS" );
hideMenubar = config->readNumEntry( "HideMenubar" );
hideButtons = config->readNumEntry( "HideButtons" );
vertToolbar = config->readNumEntry( "VertToolbar" );
hideStatusbar = config->readNumEntry( "HideStatusbar" );
hideScrollbars = config->readNumEntry( "HideScrollbars" );
smallShrink = config->readNumEntry( "SmallShrink" );
if (!smallShrink)
config->writeEntry( "SmallShrink", smallShrink = 7 );
largeShrink = config->readNumEntry( "LargeShrink" );
if (!largeShrink)
config->writeEntry( "LargeShrink", largeShrink = 3 );
int width = config->readNumEntry( "Width" );
if (!width)
width = 500;
int height = config->readNumEntry( "Height" );
if (!height)
height = 450;
resize( width, height );
}
void kdvi::dropEvent( KDNDDropZone * dropZone )
{
QStrList & list = dropZone->getURLList();
char *s;
for ( s = list.first(); s != 0L; s = list.next() )
{
// Load the first file in this window
if ( s == list.getFirst() )
{
QString n = s;
if ( n.left(5) == "file:" )
openFile( n.mid( 5, n.length() ) );
}
else
{
QString n = s;
if ( n.left(5) == "file:" )
newWindow( n.mid( 5, n.length() ) );
}
}
}
void kdvi::saveProperties(KConfig *config )
{
config->writeEntry( "FileName", dviName );
config->writeEntry( "Page", dviwin->page() );
config->writeEntry( "Shrink", dviwin->shrink() );
config->writeEntry( "Pos.x", dviwin->currentPos().x() );
config->writeEntry( "Pos.y", dviwin->currentPos().y() );
}
void kdvi::readProperties(KConfig *config)
{
QString file = config->readEntry("FileName");
if ( file.isNull() )
return;
openFile( file );
int page = config->readNumEntry( "Page", 1 );
dviwin->gotoPage( page );
setPage( page );
dviwin->setShrink( config->readNumEntry( "Shrink" ) );
dviwin->scroll( QPoint( config->readNumEntry( "Pos.x" ),
config->readNumEntry( "Pos.y" ) ) );
}
static void getOptions( int& ac, char** av )
{
if ( ac > 2 && av[1] == QString("-paper") )
av[1] = av[3], ac -= 2;
}
int main( int argc, char **argv )
{
KApplication a( argc, argv, "kdvi" );
kdvi *k;
getOptions( argc, argv );
if ( a.isRestored() && KTopLevelWidget::canBeRestored( 1 ) )
{
k = new kdvi();
k->restore( 1 );
}
else
k = argc==2 ? new kdvi(argv[1]) : new kdvi();
a.setMainWidget( k );
k->show();
kapp->getConfig()->setGroup("kdvi");
return a.exec();
}