/*************************************************************************** date : Feb 15 2007 version : 0.34 copyright : (C) 2005-2007 by Holger Danielsson email : holger.danielsson@versanet.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #include "quickpreview.h" #include "kiletool_enums.h" #include "kiledocmanager.h" #include "kilelogwidget.h" #include #include #include #include #include #include #include "kiledebug.h" #include #include #include #include #include namespace KileTool { QuickPreview::QuickPreview(KileInfo *ki) : m_ki(ki), m_tempfile(TQString()), m_running(0) { m_taskList << i18n("LaTeX ---> DVI") << i18n("LaTeX ---> DVI (KDVI)") << i18n("LaTeX ---> PS") << i18n("LaTeX ---> PS (KGhostView)") << i18n("PDFLaTeX ---> PDF") << i18n("PDFLaTeX ---> PDF (KGhostView)") << i18n("PDFLaTeX ---> PDF (KPDF)") ; } QuickPreview::~QuickPreview() { removeTempFiles(true); } //////////////////// quick preview //////////////////// // compile and view current selection (singlemode and mastermode) void QuickPreview::previewSelection(Kate::Document *doc, bool previewInWidgetConfig) { if ( doc->hasSelection() ) { if ( previewInWidgetConfig && KileConfig::selPreviewInWidget() ) { m_ki->previewWidget()->showActivePreview( doc->selection(),m_ki->getName(doc),doc->selStartLine(),KileTool::qpSelection ); } else { run( doc->selection(),m_ki->getName(doc),doc->selStartLine() ); doc->clearSelection(); } } else { showError( i18n("There is no selection to compile.") ); } } // compile and view current environment (singlemode and mastermode) void QuickPreview::previewEnvironment(Kate::Document *doc) { uint row,col; TQString envname; TQString text = m_ki->editorExtension()->getEnvironmentText(row,col,envname); if ( text != TQString() ) { if ( m_ki->latexCommands()->isMathModeEnv(envname) ) text = '$' + text + '$'; else if ( m_ki->latexCommands()->isDisplaymathModeEnv(envname) ) text = "\\[" + text + "\\]"; if ( KileConfig::envPreviewInWidget() ) m_ki->previewWidget()->showActivePreview( text,m_ki->getName(doc),row,KileTool::qpEnvironment ); else run( text,m_ki->getName(doc),row ); } else { showError( i18n("There is no surrounding environment.") ); } } // compile and view current subdocument (only mastermode) void QuickPreview::previewSubdocument(Kate::Document *doc) { // this mode is only useful with a master document if ( !m_ki->docManager()->activeProject() && m_ki->getSinglemode() ) { showError( i18n("This job is only useful with a master document.") ); return; } // the current document should not be the master document TQString filename = doc->url().path(); if ( filename == m_ki->getCompileName() ) { showError( i18n("This is not a subdocument, but the master document.") ); return; } run( doc->text(),m_ki->getName(doc),0 ); } // compile and view current mathgroup (singlemode and mastermode) void QuickPreview::previewMathgroup(Kate::Document *doc) { uint row,col; TQString text = m_ki->editorExtension()->getMathgroupText(row,col); if ( text != TQString() ) { if ( KileConfig::mathgroupPreviewInWidget() ) m_ki->previewWidget()->showActivePreview( text,m_ki->getName(doc),row,KileTool::qpMathgroup ); else run( text,m_ki->getName(doc),row ); } else { showError( i18n("There is no surrounding mathgroup.") ); } } //////////////////// run quick preview //////////////////// void QuickPreview::getTaskList(TQStringList &tasklist) { tasklist.clear(); tasklist << "Tool/ViewDVI/Embedded Viewer=" + m_taskList[0] << "Tool/ViewDVI/KDVI Unique=" + m_taskList[1] << "Tool/ViewPS/Embedded Viewer=" + m_taskList[2] << "Tool/ViewPS/KGhostView=" + m_taskList[3] << "Tool/ViewPDF/Embedded Viewer=" + m_taskList[4] << "Tool/ViewPDF/KGhostView=" + m_taskList[5] << "Tool/ViewPDF/KPDF=" + m_taskList[6] ; } bool QuickPreview::isRunning() { return ( m_running > 0 ); } bool QuickPreview::run(const TQString &text,const TQString &textfilename,int startrow) { // define possible tools TQMap map; map[m_taskList[0]] = "PreviewLaTeX,,,ViewDVI,Embedded Viewer,dvi"; map[m_taskList[1]] = "PreviewLaTeX,,,ViewDVI,KDVI Unique,dvi"; map[m_taskList[2]] = "PreviewLaTeX,DVItoPS,Default,ViewPS,Embedded Viewer,ps"; map[m_taskList[3]] = "PreviewLaTeX,DVItoPS,Default,ViewPS,KGhostView,ps"; map[m_taskList[4]] = "PreviewPDFLaTeX,,,ViewPDF,KPDF (embedded),pdf"; map[m_taskList[5]] = "PreviewPDFLaTeX,,,ViewPDF,KGhostView,pdf"; map[m_taskList[6]] = "PreviewPDFLaTeX,,,ViewPDF,KPDF,pdf"; TQString previewtask = KileConfig::previewTask(); if ( ! map.contains(previewtask) ) { showError(TQString(i18n("Could not run QuickPreview:\nunknown task '%1'").arg(previewtask))); return false; } return run (text, textfilename, startrow, map[previewtask]); } bool QuickPreview::run(const TQString &text,const TQString &textfilename,int startrow,const TQString &spreviewlist) { KILE_DEBUG() << "==QuickPreview::run()==========================" << endl; m_ki->logWidget()->clear(); if ( m_running > 0 ) { showError( i18n("There is already a preview running, which you have to finish to run this one.") ); return false; } // check if there is something to compile if ( text.isEmpty() ) { showError(i18n("There is nothing to compile and preview.")); return false; } // create the name of a temporary file or delete already existing temporary files if ( m_tempfile.isEmpty() ) { m_tempfile = KTempDir(TQString()).name() + "preview.tex"; KILE_DEBUG() << "\tdefine tempfile: " << m_tempfile << endl; } else { removeTempFiles(); } // create the temporary file with preamble and text int preamblelines = createTempfile(text); if ( preamblelines == 0 ) return false; TQStringList previewlist = TQStringList::split(",",spreviewlist,true); // create preview tools KILE_DEBUG() << "\tcreate latex tool for QuickPreview: " << previewlist[pvLatex] << endl; KileTool::PreviewLaTeX *latex = (KileTool::PreviewLaTeX *)m_ki->toolFactory()->create(previewlist[pvLatex],false); if ( !latex ) { showError(TQString(i18n("Could not run '%1' for QuickPreview.").arg("LaTeX"))); return false; } KileTool::Base *dvips = 0L; if ( ! previewlist[1].isEmpty() ) { TQString dvipstool = previewlist[pvDvips] + " (" + previewlist[pvDvipsCfg] + ')'; KILE_DEBUG() << "\tcreate dvips tool for QuickPreview: " << previewlist[pvDvips] << endl; dvips = m_ki->toolFactory()->create(previewlist[pvDvips]); if ( !dvips ) { showError(TQString(i18n("Could not run '%1' for QuickPreview.").arg(dvipstool))); return false; } } KileTool::Base *viewer = 0L; if ( !previewlist[pvViewer].isEmpty() ) { TQString viewertool = previewlist[pvViewer] + " (" + previewlist[pvViewerCfg] + ')'; KILE_DEBUG() << "\tcreate viewer for QuickPreview: " << viewertool << endl; viewer = m_ki->toolFactory()->create(previewlist[pvViewer],false); if ( !viewer ) { showError(TQString(i18n("Could not run '%1' for QuickPreview.").arg(viewertool))); return false; } } // set value of texinput path (only for QuickPreview tools) TQString texinputpath = KileConfig::teXPaths(); TQString inputdir = TQFileInfo(m_ki->getCompileName()).dirPath(true); if ( ! texinputpath.isEmpty() ) inputdir += ':' + texinputpath; KileConfig::setPreviewTeXPaths(inputdir); KILE_DEBUG() << "\tQuickPreview: inputdir is '" << inputdir << "'" << endl; // prepare tools: previewlatex TQString filepath = m_tempfile.left( m_tempfile.length()-3 ); latex->setPreviewInfo(textfilename,startrow,preamblelines+1); latex->setSource(m_tempfile); latex->prepareToRun(); latex->setQuickie(); if ( m_ki->toolManager()->run(latex) != KileTool::Running ) return false; connect(latex, TQ_SIGNAL(destroyed()), this, TQ_SLOT(toolDestroyed())); m_running++; // dvips if ( dvips ) { dvips->setSource( filepath + "dvi" ); dvips->setQuickie(); if ( m_ki->toolManager()->run(dvips,previewlist[pvDvipsCfg]) != KileTool::Running ) return false; connect(dvips, TQ_SIGNAL(destroyed()), this, TQ_SLOT(toolDestroyed())); m_running++; } // viewer if ( viewer ) { connect(viewer, TQ_SIGNAL(destroyed()), this, TQ_SLOT(toolDestroyed())); viewer->setSource( filepath + previewlist[pvExtension] ); viewer->setQuickie(); if ( m_ki->toolManager()->run(viewer,previewlist[pvViewerCfg]) != KileTool::Running ) return false; } return true; } void QuickPreview::toolDestroyed() { KILE_DEBUG() << "\tQuickPreview: tool destroyed" << endl; if ( m_running > 0 ) m_running--; } TQString QuickPreview::getPreviewFile(const TQString &extension) { if (m_tempfile.length () < 3) return TQString(); TQString filepath = m_tempfile.left(m_tempfile.length () - 3); return filepath + extension; } //////////////////// tempfile //////////////////// int QuickPreview::createTempfile(const TQString &text) { // determine main document to read the preamble TQString filename = m_ki->getCompileName(); if ( filename.isEmpty() ) { showError(i18n("Could not determine the main document.")); return 0; } // open to read TQFile fin( filename ); if ( !fin.exists() || !fin.open(IO_ReadOnly) ) { showError(i18n("Could not read the preamble.")); return 0; } KILE_DEBUG() << "\tcreate a temporary file: " << m_tempfile << endl; // use a textstream TQTextStream preamble(&fin); // create the temporary file TQFile tempfile(m_tempfile); if ( ! tempfile.open( IO_WriteOnly ) ) { showError(i18n("Could not create a temporary file.")); return 0; } TQTextStream stream( &tempfile ); // set the encoding according to the original file (tbraun) if(m_ki->activeTextDocument()) { TQTextCodec *codec = TQTextCodec::codecForName(m_ki->activeTextDocument()->encoding().ascii()); if ( codec ) stream.setCodec(codec); } // write the whole preamble into this temporary file TQString textline; int preamblelines = 0; bool begindocumentFound = false; while ( ! preamble.eof() ) { textline = preamble.readLine(); if ( textline.find("\\begin{document}") >= 0 ) { begindocumentFound = true; break; } stream << textline << "\n"; preamblelines++; } // look if we found '\begin{document}' to finish the preamble if ( ! begindocumentFound ) { tempfile.close(); showError(i18n("Could not find a '\\begin{document}' command.")); return 0; } // add the text to compile stream << "\\pagestyle{empty}\n"; stream << "\\begin{document}\n"; stream << text; stream << "\n\\end{document}\n"; tempfile.close(); return preamblelines; } void QuickPreview::removeTempFiles(bool rmdir) { if ( m_tempfile.isEmpty() ) return; TQFileInfo fi(m_tempfile); TQString tempdir = fi.dirPath(true) + '/'; TQDir dir = fi.dir(true); if ( dir.exists() ) { TQStringList list = dir.entryList(fi.baseName()+".*"); for ( TQStringList::Iterator it=list.begin(); it!=list.end(); ++it ) { TQFile::remove( tempdir + (*it) ); // KILE_DEBUG() << "\tremove temporary file: " << tempdir + (*it) << endl; } if ( rmdir ) dir.rmdir(tempdir); } } //////////////////// error messages //////////////////// void QuickPreview::showError(const TQString &text) { m_ki->logWidget()->printMsg( KileTool::Error, text, i18n("QuickPreview") ); } } #include "quickpreview.moc"