mirror of
https://invent.kde.org/graphics/okular
synced 2024-11-05 18:34:53 +00:00
eb5e7e3c5a
But why do all Qt 2.0 apps look like Mac ? svn path=/trunk/kdegraphics/kdvi/; revision=17655
1083 lines
28 KiB
C++
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();
|
|
}
|