exports.cpp
author insilmaril
Fri Mar 06 15:02:58 2009 +0000 (2009-03-06)
changeset 741 1b4d1ea6ea8c
parent 740 6dc0a20031f7
child 742 54d44ecd6097
permissions -rw-r--r--
Iteration over map works now (again)
     1 #include "exports.h"
     2 #include "file.h"
     3 #include "linkablemapobj.h"
     4 #include "misc.h"
     5 #include "mainwindow.h"
     6 #include "warningdialog.h"
     7 #include "xsltproc.h"
     8 
     9 extern Main *mainWindow;
    10 extern QDir vymBaseDir;
    11 extern QString vymName;
    12 
    13 ExportBase::ExportBase()
    14 {
    15 	indentPerDepth="  ";
    16 	bool ok;
    17     tmpDir.setPath (makeTmpDir(ok,"vym-export"));
    18 	if (!tmpDir.exists() || !ok)
    19 		QMessageBox::critical( 0, QObject::tr( "Error" ),
    20 					   QObject::tr("Couldn't access temporary directory\n"));
    21 	cancelFlag=false;				   
    22 }
    23 
    24 ExportBase::~ExportBase()
    25 {
    26 	// Cleanup tmpdir
    27 	removeDir (tmpDir);
    28 }
    29 
    30 void ExportBase::setDir(const QDir &d)
    31 {
    32 	outDir=d;
    33 }
    34 
    35 void ExportBase::setFile (const QString &p)
    36 {
    37 	outputFile=p;
    38 }
    39 
    40 QString ExportBase::getFile ()
    41 {
    42 	return outputFile;
    43 }
    44 
    45 void ExportBase::setModel(VymModel *m)
    46 {
    47 	model=m;
    48 }
    49 
    50 void ExportBase::setCaption (const QString &s)
    51 {
    52 	caption=s;
    53 }
    54 
    55 void ExportBase::addFilter(const QString &s)
    56 {
    57 	filter=s;
    58 }
    59 
    60 bool ExportBase::execDialog()
    61 {
    62 	{
    63 		QFileDialog *fd=new QFileDialog( 0, caption);
    64 		fd->setFilter (filter);
    65 		fd->setCaption(caption);
    66 		fd->setMode( QFileDialog::AnyFile );
    67 		fd->setDir (outDir);
    68 		fd->show();
    69 
    70 		if ( fd->exec() == QDialog::Accepted )
    71 		{
    72 			if (QFile (fd->selectedFile()).exists() )
    73 			{
    74 				QMessageBox mb( vymName,
    75 					QObject::tr("The file %1 exists already.\nDo you want to overwrite it?").arg(fd->selectedFile()), 
    76 				QMessageBox::Warning,
    77 				QMessageBox::Yes | QMessageBox::Default,
    78 				QMessageBox::Cancel | QMessageBox::Escape,
    79 				Qt::NoButton );
    80 				mb.setButtonText( QMessageBox::Yes, QObject::tr("Overwrite") );
    81 				mb.setButtonText( QMessageBox::No, QObject::tr("Cancel"));
    82 				ExportBase ex;
    83 				switch( mb.exec() ) 
    84 				{
    85 					case QMessageBox::Yes:
    86 						// save 
    87 						break;;
    88 					case QMessageBox::Cancel:
    89 						cancelFlag=true;
    90 						return false;
    91 						break;
    92 				}
    93 			}
    94 			outputFile=fd->selectedFile();
    95 			cancelFlag=false;
    96 			return true;
    97 		}
    98 	}
    99 	return false;
   100 }
   101 
   102 bool ExportBase::canceled()
   103 {
   104 	return cancelFlag;
   105 }
   106 
   107 QString ExportBase::getSectionString(BranchObj *bostart)
   108 {
   109 	// Make prefix like "2.5.3" for "bo:2,bo:5,bo:3"
   110 	QString r;
   111 	BranchObj *bo=bostart;
   112 	int depth=bo->getDepth();
   113 	while (depth>0)
   114 	{
   115 		r=QString("%1").arg(1+bo->getNum(),0,10)+"." + r;
   116 		bo=(BranchObj*)(bo->getParObj());
   117 		depth=bo->getDepth();
   118 	}	
   119 	if (r.isEmpty())
   120 		return r;
   121 	else	
   122 		return r + " ";
   123 }
   124 
   125 ////////////////////////////////////////////////////////////////////////
   126 ExportASCII::ExportASCII()
   127 {
   128 	filter="TXT (*.txt)";
   129 	caption=vymName+ " -" +QObject::tr("Export as ASCII")+" "+QObject::tr("(still experimental)");
   130 }
   131 
   132 void ExportASCII::doExport()
   133 {
   134 	QFile file (outputFile);
   135 	if ( !file.open( QIODevice::WriteOnly ) )
   136 	{
   137 		qWarning ("ExportBase::exportXML  couldn't open "+outputFile);
   138 		return;
   139 	}
   140 	QTextStream ts( &file );	// use LANG decoding here...
   141 
   142 	// Main loop over all branches
   143 	QString s;
   144 	QString curIndent;
   145 	int i;
   146 	TreeItem *cur=NULL;
   147 	TreeItem *prev=NULL;
   148 	int d;
   149 
   150 	BranchObj *bo;
   151 	cur=model->next (cur,prev,d);
   152 	while (cur) 
   153 	{
   154 		if (cur->getType()==TreeItem::Branch || cur->getType()==TreeItem::MapCenter)
   155 		{
   156 			bo=(BranchObj*)(cur->getLMO());
   157 			std::cout << "ExportASCII::  "<<cur->getHeading().toStdString()<<std::endl;
   158 
   159 			// Make indentstring
   160 			curIndent="";
   161 			for (i=0;i<cur->depth()-1;i++) curIndent+= indentPerDepth;
   162 
   163 			if (!bo->hasHiddenExportParent() )
   164 			{
   165 				switch (cur->depth())
   166 				{
   167 					case 0:
   168 						ts << underline (cur->getHeading(),QString("="));
   169 						ts << "\n";
   170 						break;
   171 					case 1:
   172 						ts << "\n";
   173 						ts << (underline (getSectionString(bo) + cur->getHeading(), QString("-") ) );
   174 						ts << "\n";
   175 						break;
   176 					case 2:
   177 						ts << "\n";
   178 						ts << (curIndent + "* " + cur->getHeading());
   179 						ts << "\n";
   180 						break;
   181 					case 3:
   182 						ts << (curIndent + "- " + cur->getHeading());
   183 						ts << "\n";
   184 						break;
   185 					default:
   186 						ts << (curIndent + "- " + cur->getHeading());
   187 						ts << "\n";
   188 						break;
   189 				}
   190 
   191 				// If necessary, write note
   192 				if (!bo->getNote().isEmpty())
   193 				{
   194 					curIndent +="  | ";
   195 					s=bo->getNoteASCII( curIndent, 80);
   196 					ts << s;
   197 				}
   198 			}
   199 		}
   200 		cur=model->next(cur,prev,d);
   201 	}
   202 	file.close();
   203 }
   204 
   205 QString ExportASCII::underline (const QString &text, const QString &line)
   206 {
   207 	QString r=text + "\n";
   208 	for (int j=0;j<text.length();j++) r+=line;
   209 	return r;
   210 }
   211 
   212 
   213 ////////////////////////////////////////////////////////////////////////
   214 void ExportCSV::doExport()
   215 {
   216 	QFile file (outputFile);
   217 	if ( !file.open( QIODevice::WriteOnly ) )
   218 	{
   219 		qWarning ("ExportBase::exportXML  couldn't open "+outputFile);
   220 		return;
   221 	}
   222 	QTextStream ts( &file );	// use LANG decoding here...
   223 
   224 	// Write header
   225 	ts << "\"Note\""  <<endl;
   226 
   227 	// Main loop over all branches
   228 	QString s;
   229 	QString curIndent("");
   230 	int i;
   231 	BranchObj *bo;
   232 	TreeItem *cur=NULL;
   233 	TreeItem *prev=NULL;
   234 	int d;
   235 	cur=model->next (cur,prev,d);
   236 	while (cur) 
   237 	{
   238 		bo=(BranchObj*)(cur->getLMO());
   239 
   240 		if (!bo->hasHiddenExportParent() )
   241 		{
   242 			// If necessary, write note
   243 			if (!bo->getNote().isEmpty())
   244 			{
   245 				s =bo->getNoteASCII();
   246 				s=s.replace ("\n","\n"+curIndent);
   247 				ts << ("\""+s+"\",");
   248 			} else
   249 				ts <<"\"\",";
   250 
   251 			// Make indentstring
   252 			for (i=0;i<cur->depth();i++) curIndent+= "\"\",";
   253 
   254 			// Write heading
   255 			ts << curIndent << "\"" << cur->getHeading()<<"\""<<endl;
   256 		}
   257 		
   258 		cur=model->next(cur,prev,d);
   259 		curIndent="";
   260 	}
   261 	file.close();
   262 }
   263 
   264 ////////////////////////////////////////////////////////////////////////
   265 void ExportKDEBookmarks::doExport() 
   266 {
   267 	WarningDialog dia;
   268 	dia.showCancelButton (true);
   269 	dia.setText(QObject::tr("Exporting the %1 bookmarks will overwrite\nyour existing bookmarks file.").arg("KDE"));
   270 	dia.setCaption(QObject::tr("Warning: Overwriting %1 bookmarks").arg("KDE"));
   271 	dia.setShowAgainName("/exports/KDE/overwriteKDEBookmarks");
   272 	if (dia.exec()==QDialog::Accepted)
   273 	{
   274 		model->exportXML(tmpDir.path(),false);
   275 
   276 		XSLTProc p;
   277 		p.setInputFile (tmpDir.path()+"/"+model->getMapName()+".xml");
   278 		p.setOutputFile (tmpDir.home().path()+"/.kde/share/apps/konqueror/bookmarks.xml");
   279 		p.setXSLFile (vymBaseDir.path()+"/styles/vym2kdebookmarks.xsl");
   280 		p.process();
   281 
   282 		QString ub=vymBaseDir.path()+"/scripts/update-bookmarks";
   283 		QProcess *proc= new QProcess ;
   284 		proc->start( ub);
   285 		if (!proc->waitForStarted())
   286 		{
   287 			QMessageBox::warning(0, 
   288 				QObject::tr("Warning"),
   289 				QObject::tr("Couldn't find script %1\nto notifiy Browsers of changed bookmarks.").arg(ub));
   290 		}	
   291 	}
   292 }
   293 
   294 ////////////////////////////////////////////////////////////////////////
   295 void ExportFirefoxBookmarks::doExport() 
   296 {
   297 	WarningDialog dia;
   298 	dia.showCancelButton (true);
   299 	dia.setText(QObject::tr("Exporting the %1 bookmarks will overwrite\nyour existing bookmarks file.").arg("Firefox"));
   300 	dia.setCaption(QObject::tr("Warning: Overwriting %1 bookmarks").arg("Firefox"));
   301 	dia.setShowAgainName("/vym/warnings/overwriteImportBookmarks");
   302 	if (dia.exec()==QDialog::Accepted)
   303 	{
   304 		model->exportXML(tmpDir.path(),false);
   305 
   306 /*
   307 		XSLTProc p;
   308 		p.setInputFile (tmpDir.path()+"/"+me->getMapName()+".xml");
   309 		p.setOutputFile (tmpDir.home().path()+"/.kde/share/apps/konqueror/bookmarks.xml");
   310 		p.setXSLFile (vymBaseDir.path()+"/styles/vym2kdebookmarks.xsl");
   311 		p.process();
   312 
   313 		QString ub=vymBaseDir.path()+"/scripts/update-bookmarks";
   314 		QProcess *proc = new QProcess( );
   315 		proc->addArgument(ub);
   316 
   317 		if ( !proc->start() ) 
   318 		{
   319 			QMessageBox::warning(0, 
   320 				QObject::tr("Warning"),
   321 				QObject::tr("Couldn't find script %1\nto notifiy Browsers of changed bookmarks.").arg(ub));
   322 		}	
   323 
   324 */
   325 	}
   326 }
   327 
   328 ////////////////////////////////////////////////////////////////////////
   329 void ExportTaskjuggler::doExport() 
   330 {
   331 	model->exportXML(tmpDir.path(),false);
   332 
   333 	XSLTProc p;
   334 	p.setInputFile (tmpDir.path()+"/"+model->getMapName()+".xml");
   335 	p.setOutputFile (outputFile);
   336 	p.setXSLFile (vymBaseDir.path()+"/styles/vym2taskjuggler.xsl");
   337 	p.process();
   338 }
   339 
   340 ////////////////////////////////////////////////////////////////////////
   341 void ExportLaTeX::doExport() 
   342 {
   343 	// Exports a map to a LaTex file.  
   344 	// This file needs to be included 
   345 	// or inported into a LaTex document
   346 	// it will not add a preamble, or anything 
   347 	// that makes a full LaTex document.
   348   QFile file (outputFile);
   349   if ( !file.open( QIODevice::WriteOnly ) ) {
   350 	QMessageBox::critical (0,QObject::tr("Critical Export Error"),QObject::tr("Could not write %1").arg(outputFile));
   351 	mainWindow->statusMessage(QString(QObject::tr("Export failed.")));
   352     return;
   353   }
   354   QTextStream ts( &file );	// use LANG decoding here...
   355   ts.setEncoding (QTextStream::UnicodeUTF8); // Force UTF8
   356   
   357   // Main loop over all branches
   358   QString s;
   359   // QString curIndent("");
   360   // int i;
   361   BranchObj *bo;
   362   TreeItem *cur=NULL;
   363   TreeItem *prev=NULL;
   364   int d;
   365   model->next(cur,prev,d);
   366   while (cur) 
   367   {
   368 	bo=(BranchObj*)(cur->getLMO());
   369 
   370 	if (!bo->hasHiddenExportParent() )
   371 	{
   372 		switch (cur->depth() ) 
   373 		{
   374 			case 0: break;
   375 			case 1: 
   376 			  ts << ("\\chapter{" + bo->getHeading()+ "}\n");
   377 			  break;
   378 			case 2: 
   379 			  ts << ("\\section{" + bo->getHeading()+ "}\n");
   380 			  break;
   381 			case 3: 
   382 			  ts << ("\\subsection{" + bo->getHeading()+ "}\n");
   383 			  break;
   384 			case 4: 
   385 			  ts << ("\\subsubsection{" + bo->getHeading()+ "}\n");
   386 			  break;
   387 			default:
   388 			  ts << ("\\paragraph*{" + bo->getHeading()+ "}\n");
   389 			
   390 		}
   391 		// If necessary, write note
   392 		if (!bo->getNote().isEmpty()) {
   393 		  ts << (bo->getNoteASCII());
   394 		  ts << ("\n");
   395 		}
   396 	}
   397     cur=model->next(cur,prev,d);
   398    }
   399   file.close();
   400 }
   401 
   402 ////////////////////////////////////////////////////////////////////////
   403 ExportOO::ExportOO()
   404 {
   405 	useSections=false;
   406 }
   407 
   408 ExportOO::~ExportOO()
   409 {
   410 }	
   411 
   412 QString ExportOO::buildList (BranchObj *current)
   413 {
   414     QString r;
   415     BranchObj *bo;
   416 
   417     uint i=0;
   418     bo=current->getFirstBranch();
   419     if (bo)
   420     {
   421 		if (!bo->hasHiddenExportParent() )
   422 		{
   423 			// Start list
   424 			r+="<text:list text:style-name=\"vym-list\">\n";
   425 			while (bo)
   426 			{
   427 				r+="<text:list-item><text:p >";
   428 				r+=quotemeta(bo->getHeading());
   429 				// If necessary, write note
   430 				if (!bo->getNote().isEmpty())
   431 					r+=bo->getNoteOpenDoc();
   432 				r+="</text:p>";
   433 				r+=buildList (bo);	// recursivly add deeper branches
   434 				r+="</text:list-item>\n";
   435 				i++;
   436 				bo=current->getBranchNum(i);
   437 			}
   438 			r+="</text:list>\n";
   439 		}
   440     }
   441     return r;
   442 }
   443 
   444 
   445 void ExportOO::exportPresentation()
   446 {
   447 	QString allPages;
   448 
   449 /* FIXME not adapted to multiple mapCenters yet
   450 	// Insert new content
   451 	content.replace ("<!-- INSERT TITLE -->",quotemeta(mapCenter->getHeading()));
   452 	content.replace ("<!-- INSERT AUTHOR -->",quotemeta(mapCenter->getAuthor()));
   453 
   454 	QString	onePage;
   455 	QString list;
   456 	
   457 	BranchObj *sectionBO=mapCenter->getFirstBranch();
   458     int i=0;
   459 	BranchObj *pagesBO;
   460     int j=0;
   461 
   462 	// Walk sections
   463 	while (sectionBO && !sectionBO->hasHiddenExportParent() )
   464 	{
   465 		if (useSections)
   466 		{
   467 			// Add page with section title
   468 			onePage=sectionTemplate;
   469 			onePage.replace ("<!-- INSERT PAGE HEADING -->", quotemeta(sectionBO->getHeading() ) );
   470 			allPages+=onePage;
   471 		} else
   472 		{
   473 			i=-2;	// only use inner loop to 
   474 			        // turn mainbranches into pages
   475 			sectionBO=mapCenter;
   476 		}
   477 
   478 		// Walk mainpages
   479 		pagesBO=sectionBO->getFirstBranch();
   480 		j=0;
   481 		while (pagesBO && !pagesBO->hasHiddenExportParent() )
   482 		{
   483 			// Add page with list of items
   484 			onePage=pageTemplate;
   485 			onePage.replace ("<!-- INSERT PAGE HEADING -->", quotemeta (pagesBO->getHeading() ) );
   486 			list=buildList (pagesBO);
   487 			onePage.replace ("<!-- INSERT LIST -->", list);
   488 			allPages+=onePage;
   489 			j++;
   490 			pagesBO=sectionBO->getBranchNum(j);
   491 		}
   492 		i++;
   493 		sectionBO=mapCenter->getBranchNum(i);
   494 	}
   495 	
   496 	content.replace ("<!-- INSERT PAGES -->",allPages);
   497 
   498 	// Write modified content
   499 	QFile f (contentFile);
   500     if ( !f.open( QIODevice::WriteOnly ) ) 
   501 	{
   502 		QMessageBox::critical (0,QObject::tr("Critical Export Error"),QObject::tr("Could not write %1").arg(contentFile));
   503 		mainWindow->statusMessage(QString(QObject::tr("Export failed.")));
   504 		return;
   505     }
   506 
   507     QTextStream t( &f );
   508     t << content;
   509     f.close();
   510 
   511 	// zip tmpdir to destination
   512 	zipDir (tmpDir,outputFile);	
   513 */
   514 }
   515 
   516 bool ExportOO::setConfigFile (const QString &cf)
   517 {
   518 	configFile=cf;
   519 	int i=cf.findRev ("/");
   520 	if (i>=0) configDir=cf.left(i);
   521 	SimpleSettings set;
   522 	set.readSettings(configFile);
   523 
   524 	// set paths
   525 	templateDir=configDir+"/"+set.readEntry ("Template");
   526 
   527 	QDir d (templateDir);
   528 	if (!d.exists())
   529 	{
   530 		QMessageBox::critical (0,QObject::tr("Critical Export Error"),QObject::tr("Check \"%1\" in\n%2").arg("Template="+set.readEntry ("Template")).arg(configFile));
   531 		return false;
   532 
   533 	}
   534 
   535 	contentTemplateFile=templateDir+"content-template.xml";
   536 	contentFile=tmpDir.path()+"/content.xml";
   537 	pageTemplateFile=templateDir+"page-template.xml";
   538 	sectionTemplateFile=templateDir+"section-template.xml";
   539 
   540 	if (set.readEntry("useSections").contains("yes"))
   541 		useSections=true;
   542 
   543 	// Copy template to tmpdir
   544 	system ("cp -r "+templateDir+"* "+tmpDir.path());
   545 
   546 	// Read content-template
   547 	if (!loadStringFromDisk (contentTemplateFile,content))
   548 	{
   549 		QMessageBox::critical (0,QObject::tr("Critical Export Error"),QObject::tr("Could not read %1").arg(contentTemplateFile));
   550 		return false;
   551 	}
   552 
   553 	// Read page-template
   554 	if (!loadStringFromDisk (pageTemplateFile,pageTemplate))
   555 	{
   556 		QMessageBox::critical (0,QObject::tr("Critical Export Error"),QObject::tr("Could not read %1").arg(pageTemplateFile));
   557 		return false;
   558 	}
   559 	
   560 	// Read section-template
   561 	if (useSections && !loadStringFromDisk (sectionTemplateFile,sectionTemplate))
   562 	{
   563 		QMessageBox::critical (0,QObject::tr("Critical Export Error"),QObject::tr("Could not read %1").arg(sectionTemplateFile));
   564 		return false;
   565 	}
   566 	return true;
   567 }
   568