1
/***************************************************************************
2
* Copyright (C) 2004-2009 by Thomas Fischer *
3
* fischer@unix-ag.uni-kl.de *
5
* This program is free software; you can redistribute it and/or modify *
6
* it under the terms of the GNU General Public License as published by *
7
* the Free Software Foundation; either version 2 of the License, or *
8
* (at your option) any later version. *
10
* This program is distributed in the hope that it will be useful, *
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13
* GNU General Public License for more details. *
15
* You should have received a copy of the GNU General Public License *
16
* along with this program; if not, write to the *
17
* Free Software Foundation, Inc., *
18
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19
***************************************************************************/
22
#include <qstringlist.h>
25
#include <qwaitcondition.h>
27
#include <qapplication.h>
30
#include <kstandarddirs.h>
31
#include <kmessagebox.h>
33
#include <kbibtex_part.h>
35
#include <kio/netaccess.h>
37
#include <entryfield.h>
45
Settings* Settings::staticSettings = new Settings();
46
QStringList Settings::m_lyxRcFileNames = QStringList::split( '|', QDir::home().canonicalPath() + "/.lyx/lyxrc" + '|' + QDir::home().canonicalPath() + "/.lyx/preferences" );
48
const QRegExp Settings::noIdChars( "[^-.:/+_a-zA-Z0-9]" );
52
checkExternalToolsAvailable();
54
KStandardDirs * kstd = KGlobal::dirs();
55
external_XSLTStylesheetHTML = kstd->findResource( "data", "kbibtexpart/xslt/html.xsl" );
56
if ( external_XSLTStylesheetHTML == NULL )
57
KMessageBox::error( NULL, i18n( "Could not determine filename for XSLT file" ), i18n( "Initialization failed" ) );
59
int numCompletions = BibTeX::EntryField::ftYear - BibTeX::EntryField::ftAbstract + 4;
60
m_completion = new KCompletion * [ numCompletions ];
61
for ( int i = 0; i < numCompletions; ++i )
63
m_completion[ i ] = new KCompletion();
64
m_completion[ i ] ->setIgnoreCase( TRUE );
66
completionMacro = new KCompletion();
67
completionMacro->setIgnoreCase( FALSE );
69
currentBibTeXFile = NULL;
74
int numCompletions = BibTeX::EntryField::ftYear - BibTeX::EntryField::ftAbstract + 4;
75
for ( int i = 0; i < numCompletions; ++i )
76
delete m_completion[ i ];
77
delete[] m_completion;
78
delete completionMacro;
80
for ( QValueList<SearchURL*>::ConstIterator it = searchURLs.begin(); it != searchURLs.end(); ++it )
84
Settings* Settings::self( BibTeX::File *bibtexFile )
86
if ( bibtexFile != NULL )
87
staticSettings->currentBibTeXFile = bibtexFile;
88
return staticSettings;
91
void Settings::load( KConfig * config )
93
config->setGroup( "FileIO" );
94
fileIO_Encoding = config->readEntry( "Encoding", "latex" );
95
if ( fileIO_Encoding.length() == 1 ) fileIO_Encoding = "latex"; // due to old scheme where digits were used
96
fileIO_ExportLanguage = config->readEntry( "ExportLanguage", "english" );
97
fileIO_ExportBibliographyStyle = config->readEntry( "ExportBibliographyStyle", "plain" );
98
fileIO_ExporterHTML = ( BibTeX::FileExporterExternal::Exporter ) config->readNumEntry( "ExporterHTML", ( int ) BibTeX::FileExporterExternal::exporterNone );
99
fileIO_BibtexStringOpenDelimiter = config->readEntry( "BibtexStringOpenDelimiter", "\"" ).at( 0 );
100
fileIO_BibtexStringCloseDelimiter = config->readEntry( "BibtexStringCloseDelimiter", "\"" ).at( 0 );
101
fileIO_KeywordCasing = ( BibTeX::FileExporterBibTeX::KeywordCasing ) config->readNumEntry( "KeywordCasing", ( int ) BibTeX::FileExporterBibTeX::kcCamelCase );
102
fileIO_EmbedFiles = config->readBoolEntry( "EmbedFiles", FALSE );
103
fileIO_EnclosingCurlyBrackets = config->readBoolEntry( "EnclosingCurlyBrackets", FALSE );
104
fileIO_useBibUtils = config->readBoolEntry( "UseBibUtils", TRUE );
105
updateBib2Db5ClassPath( config->readEntry( "Bib2Db5BasePath", QString::null ) );
106
fileIO_NumberOfBackups = config->readNumEntry( "NumberOfBackups", 0 );
108
config->setGroup( "Editing" );
109
editing_SearchBarClearField = config->readBoolEntry( "SearchBarClearField", false );
110
editing_EnableAllFields = config->readBoolEntry( "EnableAllFields", false );
111
editing_MainListDoubleClickAction = config->readNumEntry( "MainListDoubleClickAction", 0 );
112
editing_MainListSortingColumn = config->readNumEntry( "MainListSortingColumn", 1 );
113
editing_MainListSortingOrder = config->readNumEntry( "MainListSortingOrder", 1 );
114
editing_MainListColumnsWidth = config->readIntListEntry( "MainListColumnsWidth" );
115
editing_MainListColumnsIndex = config->readIntListEntry( "MainListColumnsIndex" );
116
editing_FilterHistory = config->readListEntry( "FilterHistory" );
117
editing_ShowComments = config->readBoolEntry( "ShowComments", TRUE );
118
editing_ShowMacros = config->readBoolEntry( "ShowMacros", TRUE );
119
editing_HorSplitterSizes = config->readIntListEntry( "HorizontalSplitterSizes" );
120
editing_VertSplitterSizes = config->readIntListEntry( "VerticalSplitterSizes" );
121
QFont defaultFont = KGlobalSettings::generalFont();
122
editing_SpecialFont = config->readFontEntry( "SpecialFont", &defaultFont );
123
editing_UseSpecialFont = config->readBoolEntry( "UseSpecialFont", FALSE );
124
editing_FirstNameFirst = config->readBoolEntry( "FirstNameFirst", FALSE );
125
editing_DocumentSearchPaths = config->readListEntry( "DocumentSearchPath" );
126
editing_DragAction = ( DragAction ) config->readNumEntry( "DragAction", ( int ) COPYREFERENCE );
128
if ( editing_MainListColumnsWidth.isEmpty() || editing_MainListColumnsIndex.isEmpty() )
130
editing_MainListColumnsWidth.clear();
131
editing_MainListColumnsIndex.clear();
134
// for type and id column
135
editing_MainListColumnsWidth.append( 0xffff );
136
editing_MainListColumnsWidth.append( 0xffff );
137
editing_MainListColumnsIndex.append( column++ );
138
editing_MainListColumnsIndex.append( column++ );
140
for ( int i = 0; i <= ( int ) BibTeX::EntryField::ftYear - ( int ) BibTeX::EntryField::ftAbstract; i++ )
142
BibTeX::EntryField::FieldType fieldType = ( BibTeX::EntryField::FieldType )( i + ( int ) BibTeX::EntryField::ftAbstract );
143
if ( fieldType == BibTeX::EntryField::ftAuthor || fieldType == BibTeX::EntryField::ftTitle )
144
editing_MainListColumnsWidth.append( 0xffff );
146
editing_MainListColumnsWidth.append( 0 );
147
editing_MainListColumnsIndex.append( column++ );
150
editing_findDuplicatesSensitivity = config->readNumEntry( "FindDuplicatesSensitivity", 12 );
152
config->setGroup( "SearchURLs" );
154
for ( int i = 1; i < 1024; i++ )
156
QString descr = config->readEntry( QString( "SearchURLDescription%1" ).arg( i ), QString::null );
157
QString url = config->readEntry( QString( "SearchURL%1" ).arg( i ), QString::null );
158
bool includeAuthor = config->readBoolEntry( QString( "IncludeAuthor%1" ).arg( i ), FALSE );
159
if ( descr != QString::null && url != QString::null )
161
SearchURL * searchURL = new SearchURL;
162
searchURL->description = descr;
163
searchURL->url = url;
164
searchURL->includeAuthor = includeAuthor;
165
searchURLs.append( searchURL );
171
if ( searchURLs.count() == 0 )
172
restoreDefaultSearchURLs();
174
config->setGroup( "Keyword" );
175
keyword_GlobalList = config->readListEntry( "GlobalList" );
176
keyword_GlobalList.sort();
178
config->setGroup( "OnlineSearchDatabase" );
179
webQuery_LastEngine = config->readNumEntry( "LastEngine", 0 );
180
webQuery_LastSearchTerm = config->readEntry( "LastSearchTerm", "" );
181
webQuery_LastNumberOfResults = config->readNumEntry( "LastNumberOfResults", 10 );
182
webQuery_ImportAll = config->readBoolEntry( "ImportAll", FALSE );
184
config->setGroup( "IdSuggestions" );
185
idSuggestions_formatStrList = config->readListEntry( "FormatStrList" );
186
if ( idSuggestions_formatStrList.count() == 0 )
188
idSuggestions_formatStrList = QStringList::split( ',', "A,A2|y,A3|y,A4|y|\":|T5,al|\":|T,al|y,al|Y,Al\"-|\"-|y,Al\"+|Y,al|y|T,al|Y|T3,al|Y|T3l,a|\":|Y|\":|T1,a|y,A|\":|Y" );
189
idSuggestions_default = -1;
190
idSuggestions_forceDefault = FALSE;
194
idSuggestions_default = config->readNumEntry( "Default", -1 );
195
idSuggestions_forceDefault = config->readBoolEntry( "ForceDefault", FALSE );
197
idSuggestions_smallWords = config->readListEntry( "SmallWords" );
198
if ( idSuggestions_smallWords.count() == 0 )
199
idSuggestions_smallWords = QStringList::split( '|', "and|on|in|the|of|at|a|an|with|for|from" );
200
idSuggestions_smallWords.sort();
202
config->setGroup( "UserDefinedInputFields" );
203
QStringList names = config->readListEntry( "Names" );
204
QStringList labels = config->readListEntry( "Labels" );
205
QStringList inputtypes = config->readListEntry( "InputTypes" );
207
userDefinedInputFields.clear();
208
for ( unsigned int i = 0; i < names.size();++i )
210
UserDefinedInputFields *udif = new UserDefinedInputFields();
211
udif->name = names[i];
212
udif->label = labels[i];
213
udif->inputType = ( inputtypes[i] == "single" ? FieldLineEdit::itSingleLine : FieldLineEdit::itMultiLine );
214
userDefinedInputFields << udif;
217
// web query history/default values
218
m_webQueryDefaults = config->entryMap( "WebQuery" );
222
z3950loadUser( config );
227
void Settings::save( KConfig * config )
229
config->setGroup( "FileIO" );
230
config->writeEntry( "Encoding", fileIO_Encoding );
231
config->writeEntry( "ExportLanguage", fileIO_ExportLanguage );
232
config->writeEntry( "ExportBibliographyStyle", fileIO_ExportBibliographyStyle );
233
config->writeEntry( "ExporterHTML", ( int ) fileIO_ExporterHTML );
234
config->writeEntry( "BibtexStringOpenDelimiter", QString( fileIO_BibtexStringOpenDelimiter ) );
235
config->writeEntry( "BibtexStringCloseDelimiter", QString( fileIO_BibtexStringCloseDelimiter ) );
236
config->writeEntry( "KeywordCasing", ( int ) fileIO_KeywordCasing );
237
config->writeEntry( "EmbedFiles", fileIO_EmbedFiles );
238
config->writeEntry( "EnclosingCurlyBrackets", fileIO_EnclosingCurlyBrackets );
239
config->writeEntry( "UseBibUtils", fileIO_useBibUtils );
240
config->writeEntry( "Bib2Db5BasePath", fileIO_bib2db5BasePath );
241
config->writeEntry( "NumberOfBackups", fileIO_NumberOfBackups );
243
config->setGroup( "Editing" );
244
config->writeEntry( "SearchBarClearField", editing_SearchBarClearField );
245
config->writeEntry( "EnableAllFields", editing_EnableAllFields );
246
config->writeEntry( "MainListDoubleClickAction", editing_MainListDoubleClickAction );
247
config->writeEntry( "MainListSortingColumn", editing_MainListSortingColumn );
248
config->writeEntry( "MainListSortingOrder", editing_MainListSortingOrder );
249
config->writeEntry( "MainListColumnsWidth", editing_MainListColumnsWidth );
250
config->writeEntry( "MainListColumnsIndex", editing_MainListColumnsIndex );
251
config->writeEntry( "FilterHistory", editing_FilterHistory );
252
config->writeEntry( "ShowComments", editing_ShowComments );
253
config->writeEntry( "ShowMacros", editing_ShowMacros );
254
config->writeEntry( "HorizontalSplitterSizes", editing_HorSplitterSizes );
255
config->writeEntry( "VerticalSplitterSizes", editing_VertSplitterSizes );
256
config->writeEntry( "SpecialFont", editing_SpecialFont );
257
config->writeEntry( "UseSpecialFont", editing_UseSpecialFont );
258
config->writeEntry( "FirstNameFirst", editing_FirstNameFirst );
259
config->writeEntry( "DocumentSearchPath", editing_DocumentSearchPaths );
260
config->writeEntry( "DragAction", editing_DragAction );
261
config->writeEntry( "FindDuplicatesSensitivity", editing_findDuplicatesSensitivity );
263
config->setGroup( "SearchURLs" );
265
for ( QValueList<SearchURL*>::ConstIterator it = searchURLs.begin(); it != searchURLs.end(); ++it, ++i )
267
config->writeEntry( QString( "SearchURLDescription%1" ).arg( i ), ( *it ) ->description );
268
config->writeEntry( QString( "SearchURL%1" ).arg( i ), ( *it ) ->url );
269
config->writeEntry( QString( "IncludeAuthor%1" ).arg( i ), ( *it ) ->includeAuthor );
272
config->setGroup( "Keyword" );
273
config->writeEntry( "GlobalList", keyword_GlobalList );
275
config->setGroup( "OnlineSearchDatabase" );
276
config->writeEntry( "LastEngine", webQuery_LastEngine );
277
config->writeEntry( "LastSearchTerm", webQuery_LastSearchTerm );
278
config->writeEntry( "LastNumberOfResults", webQuery_LastNumberOfResults );
279
config->writeEntry( "ImportAll", webQuery_ImportAll );
281
config->setGroup( "IdSuggestions" );
282
config->writeEntry( "FormatStrList", idSuggestions_formatStrList );
283
config->writeEntry( "Default", idSuggestions_default );
284
config->writeEntry( "ForceDefault", idSuggestions_forceDefault );
285
config->writeEntry( "SmallWords", idSuggestions_smallWords );
287
config->setGroup( "UserDefinedInputFields" );
288
QStringList names, labels, inputtype;
289
for ( QValueList<UserDefinedInputFields*>::iterator it = userDefinedInputFields.begin(); it != userDefinedInputFields.end();++it )
291
names << ( *it )->name;
292
labels << ( *it )->label;
293
inputtype << (( *it )->inputType == FieldLineEdit::itMultiLine ? "multi" : "single" );
295
config->writeEntry( "Names", names );
296
config->writeEntry( "Labels", labels );
297
config->writeEntry( "InputTypes", inputtype );
299
config->setGroup( "WebQuery" );
300
for ( QMap<QString, QString>::Iterator it = m_webQueryDefaults.begin(); it != m_webQueryDefaults.end(); ++it )
301
config->writeEntry( it.key(), it.data() );
304
z3950saveUser( config );
308
void Settings::checkExternalToolsAvailable()
310
external_bibconvAvailable = checkExternalToolAvailable( "bibconv" );
311
external_bibtex2htmlAvailable = checkExternalToolAvailable( "bibtex2html" );
312
external_bib2xhtmlAvailable = checkExternalToolAvailable( "bib2xhtml" );
313
external_latex2rtfAvailable = checkExternalToolAvailable( "latex2rtf" );
314
external_xml2bibAvailable = checkExternalToolAvailable( "xml2bib" );
315
external_end2xmlAvailable = checkExternalToolAvailable( "end2xml" );
316
external_ris2xmlAvailable = checkExternalToolAvailable( "ris2xml" );
319
bool Settings::updateBib2Db5ClassPath( const QString& newBasePath, bool testOnly )
321
QString bib2db5ClassPath = QString::null;
322
QDir bib2db5BaseDir( newBasePath );
323
QStringList list = bib2db5BaseDir.entryList( "antlr-runtime*.jar" );
324
if ( !list.isEmpty() )
326
bib2db5ClassPath = bib2db5BaseDir.absPath() + "/" + list[0];
327
list = bib2db5BaseDir.entryList( "bib2db5*.jar" );
328
if ( !list.isEmpty() )
329
bib2db5ClassPath += ":" + bib2db5BaseDir.absPath() + "/" + list[0];
331
bib2db5ClassPath = QString::null;
334
bib2db5ClassPath = QString::null;
335
if ( bib2db5ClassPath == QString::null )
336
kdDebug() << "Base path for bib2db5 is invalid (\"" << newBasePath << "\")" << endl;
340
fileIO_bib2db5BasePath = newBasePath;
341
fileIO_bib2db5ClassPath = bib2db5ClassPath;
344
return bib2db5ClassPath != QString::null;
347
bool Settings::checkExternalToolAvailable( const QString &binary )
349
QProcess *process = new QProcess( binary );
350
bool ok = process->start();
351
ok &= process->normalExit();
352
if ( process->isRunning() )
361
QString Settings::detectLyXInPipe()
363
QString result = QString::null;
364
for ( QStringList::Iterator it = m_lyxRcFileNames.begin(); result.isNull() && it != m_lyxRcFileNames.end(); ++it )
366
QString lyxRcFileName = *it;
367
QFile lyxRcFile( lyxRcFileName );
369
kdDebug() << "detectLyXInPipe: looking for " << lyxRcFileName << endl;
370
if ( lyxRcFile.exists() && lyxRcFile.open( IO_ReadOnly ) )
372
QTextStream input( &lyxRcFile );
373
while ( result.isNull() && !input.atEnd() )
375
QString line = input.readLine();
376
if ( line.startsWith( "\\serverpipe ", FALSE ) )
378
QStringList cols = QStringList::split( QRegExp( "\\s+\"|\"" ), line );
379
if ( cols.size() >= 2 )
381
result = cols[ 1 ] + ".in";
382
kdDebug() << "detectLyXInPipe: testing " << result << " from config file" << endl;
383
if ( !QFile::exists( result ) )
384
kdDebug() << "LyX in pipe '" << result << "' from " << lyxRcFileName << " does not exist" << endl;
392
if ( result.isNull() )
394
result = QDir::home().canonicalPath() + "/.lyx/lyxpipe.in";
395
kdDebug() << "detectLyXInPipe: testing " << result << endl;
396
if ( !QFile::exists( result ) )
397
result = QString::null;
400
if ( result.isNull() )
402
result = QDir::home().canonicalPath() + "/.lyx/.lyxpipe.in";
403
kdDebug() << "detectLyXInPipe: testing " << result << endl;
404
if ( !QFile::exists( result ) )
405
result = QString::null;
408
if ( result.isNull() )
410
result = QDir::home().canonicalPath() + "/.lyxpipe.in";
411
kdDebug() << "detectLyXInPipe: testing " << result << endl;
412
if ( !QFile::exists( result ) )
413
result = QString::null;
416
kdDebug() << "detectLyXInPipe: using " << ( result.isNull() ? "<INVALID>" : result ) << endl;
420
QString Settings::getWebQueryDefault( const QString &key )
422
return m_webQueryDefaults[key];
425
void Settings::setWebQueryDefault( const QString &key, const QString& value )
427
m_webQueryDefaults[key] = value;
430
void Settings::addToCompletion( BibTeX::File *file )
432
for ( BibTeX::File::ElementList::iterator it = file->begin(); it != file->end(); it++ )
433
addToCompletion( *it );
436
void Settings::addToCompletion( BibTeX::Element *element )
438
BibTeX::Entry * entry = dynamic_cast<BibTeX::Entry*>( element );
439
BibTeX::Macro * macro = dynamic_cast<BibTeX::Macro*>( element );
442
for ( BibTeX::Entry::EntryFields::ConstIterator ite = entry->begin(); ite != entry->end(); ite++ )
444
BibTeX::EntryField::FieldType fieldType = ( *ite ) ->fieldType();
445
BibTeX::Value *value = ( *ite ) ->value();
446
addToCompletion( value, fieldType );
449
else if ( macro != NULL )
450
completionMacro->addItem( macro->key() );
453
void Settings::addToCompletion( BibTeX::Value *value, BibTeX::EntryField::FieldType fieldType )
455
int index = completionFieldTypeToIndex( fieldType );
457
for ( QValueList<BibTeX::ValueItem*>::ConstIterator itv = value->items.begin(); itv != value->items.end(); itv++ )
459
BibTeX::PlainText *plainText = dynamic_cast<BibTeX::PlainText*>( *itv );
460
if ( plainText != NULL )
461
m_completion[ index ] ->addItem( plainText->text() );
464
BibTeX::PersonContainer *personContainer = dynamic_cast<BibTeX::PersonContainer*>( *itv );
465
if ( personContainer != NULL )
466
for ( QValueList<BibTeX::Person*>::Iterator itp = personContainer->persons.begin();itp != personContainer->persons.end(); ++itp )
468
m_completion[ index ] ->addItem(( *itp )->text( TRUE ) );
469
m_completion[ index ] ->addItem(( *itp )->text( FALSE ) );
473
BibTeX::KeywordContainer *keywordContainer = dynamic_cast<BibTeX::KeywordContainer*>( *itv );
474
if ( keywordContainer != NULL )
475
for ( QValueList<BibTeX::Keyword*>::Iterator itk = keywordContainer->keywords.begin();itk != keywordContainer->keywords.end(); ++itk )
476
m_completion[ index ] ->addItem(( *itk )->text() );
482
KCompletion *Settings::completion( BibTeX::EntryField::FieldType fieldType )
484
return m_completion[ completionFieldTypeToIndex( fieldType )];
487
int Settings::completionFieldTypeToIndex( BibTeX::EntryField::FieldType fieldType )
490
if ( fieldType == BibTeX::EntryField::ftEditor )
491
fieldType = BibTeX::EntryField::ftAuthor;
492
if ( fieldType != BibTeX::EntryField::ftUnknown )
493
index = ( int )( fieldType - BibTeX::EntryField::ftAbstract ) + 1;
497
void Settings::restoreDefaultSearchURLs()
499
QStringList defaultDescriptions;
500
defaultDescriptions.append( "Google Scholar" );
501
defaultDescriptions.append( "Google .bib Search" );
502
defaultDescriptions.append( "Google Document Search" );
503
defaultDescriptions.append( "Google" );
504
defaultDescriptions.append( "CiteSeer" );
505
defaultDescriptions.append( "PubMed" );
506
defaultDescriptions.append( "PubMed Central" );
507
defaultDescriptions.append( "DBLP (Computer Science)" );
508
defaultDescriptions.append( "citebase" );
509
defaultDescriptions.append( "BASE" );
510
defaultDescriptions.append( "Forschungsportal.Net" );
511
defaultDescriptions.append( "scirus" );
512
defaultDescriptions.append( "ScientificCommons" );
513
defaultDescriptions.append( "Amatex (US)" );
514
defaultDescriptions.append( "SpringerLink" );
516
QValueList<SearchURL*> toDelete;
517
for ( QValueList<SearchURL*>::ConstIterator it = searchURLs.begin(); it != searchURLs.end(); ++it )
519
if ( defaultDescriptions.contains(( *it ) ->description ) )
521
toDelete.append( *it );
525
for ( QValueList<SearchURL*>::ConstIterator it = toDelete.begin(); it != toDelete.end(); ++it )
528
searchURLs.remove( *it );
531
SearchURL *searchURL = new SearchURL;
532
searchURL->description = "Google";
533
searchURL->url = "http://www.google.com/search?q=%1&ie=UTF-8&oe=UTF-8";
534
searchURL->includeAuthor = TRUE;
535
searchURLs.append( searchURL );
537
searchURL = new SearchURL;
538
searchURL->description = "Google Scholar";
539
searchURL->url = "http://scholar.google.com/scholar?q=%1&ie=UTF-8&oe=UTF-8";
540
searchURL->includeAuthor = TRUE;
541
searchURLs.append( searchURL );
543
searchURL = new SearchURL;
544
searchURL->description = "Google .bib Search";
545
searchURL->url = "http://www.google.com/search?q=%1%20filetype%3Abib&ie=UTF-8&oe=UTF-8";
546
searchURL->includeAuthor = TRUE;
547
searchURLs.append( searchURL );
549
searchURL = new SearchURL;
550
searchURL->description = "Google Document Search";
551
searchURL->url = "http://www.google.com/search?q=%1%20filetype%3Apdf%20OR%20filetype%3Aps&ie=UTF-8&oe=UTF-8";
552
searchURL->includeAuthor = TRUE;
553
searchURLs.append( searchURL );
555
searchURL = new SearchURL;
556
searchURL->description = "PubMed";
557
searchURL->url = "http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=pubmed&cmd=search&pmfilter_Fulltext=on&pmfilter_Relevance=on&term=%1&search=Find+Articles";
558
searchURL->includeAuthor = FALSE;
559
searchURLs.append( searchURL );
561
searchURL = new SearchURL;
562
searchURL->description = "PubMed Central";
563
searchURL->url = "http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=pubmed&cmd=search&term=%1";
564
searchURL->includeAuthor = FALSE;
565
searchURLs.append( searchURL );
567
searchURL = new SearchURL;
568
searchURL->description = "Amatex (US)";
569
searchURL->url = "http://www.2ndminute.org:8080/amatex/search.do?querry=%1&suchart=kwd&lang=DE";
570
searchURL->includeAuthor = FALSE;
571
searchURLs.append( searchURL );
573
searchURL = new SearchURL;
574
searchURL->description = "DBLP (Computer Science)";
575
searchURL->url = "http://www.informatik.uni-trier.de/ley/dbbin/dblpquery.cgi?title=%1";
576
searchURL->includeAuthor = FALSE;
577
searchURLs.append( searchURL );
579
searchURL = new SearchURL;
580
searchURL->description = "CiteSeer";
581
searchURL->url = "http://citeseer.ist.psu.edu/cis?q=%1&submit=Search+Documents";
582
searchURL->includeAuthor = FALSE;
583
searchURLs.append( searchURL );
585
searchURL = new SearchURL;
586
searchURL->description = "citebase";
587
searchURL->url = "http://www.citebase.org/search?type=metadata&author=&title=%1&publication=&yearfrom=&yearuntil=&order=DESC&rank=paperimpact&submitted=Search";
588
searchURL->includeAuthor = FALSE;
589
searchURLs.append( searchURL );
591
searchURL = new SearchURL;
592
searchURL->description = "BASE";
593
searchURL->url = "http://digital.ub.uni-bielefeld.de/index.php?q=%1&s=free";
594
searchURL->includeAuthor = FALSE;
595
searchURLs.append( searchURL );
597
searchURL = new SearchURL;
598
searchURL->description = "Forschungsportal.Net";
599
searchURL->url = "http://www.forschungsportal.net/fpj/q/?q=%1&pp=5&art=dok&html=1&pdf=1&ps=1&dvi=1";
600
searchURL->includeAuthor = FALSE;
601
searchURLs.append( searchURL );
603
searchURL = new SearchURL;
604
searchURL->description = "scirus";
605
searchURL->url = "http://www.scirus.com/srsapp/search?q=%1&ds=jnl&ds=nom&ds=web&g=s&t=all";
606
searchURL->includeAuthor = FALSE;
607
searchURLs.append( searchURL );
609
searchURL = new SearchURL;
610
searchURL->description = "ScientificCommons";
611
searchURL->url = "http://en.scientificcommons.org/#search_string=%1";
612
searchURL->includeAuthor = FALSE;
613
searchURLs.append( searchURL );
615
searchURL = new SearchURL;
616
searchURL->description = "SpringerLink";
617
searchURL->url = "http://www.springerlink.com/content/?k=%1";
618
searchURL->includeAuthor = FALSE;
619
searchURLs.append( searchURL );
622
QString Settings::fieldTypeToI18NString( const BibTeX::EntryField::FieldType fieldType )
626
case BibTeX::EntryField::ftAbstract:
627
return QString( i18n( "Abstract" ) );
628
case BibTeX::EntryField::ftAddress:
629
return QString( i18n( "Address" ) );
630
case BibTeX::EntryField::ftAnnote:
631
return QString( i18n( "Annote" ) );
632
case BibTeX::EntryField::ftAuthor:
633
return QString( i18n( "Author" ) );
634
case BibTeX::EntryField::ftBookTitle:
635
return QString( i18n( "Book Title" ) );
636
case BibTeX::EntryField::ftChapter:
637
return QString( i18n( "Chapter" ) );
638
case BibTeX::EntryField::ftCrossRef:
639
return QString( i18n( "Crossref" ) );
640
case BibTeX::EntryField::ftDoi:
641
return QString( i18n( "DOI" ) );
642
case BibTeX::EntryField::ftEdition:
643
return QString( i18n( "Edition" ) );
644
case BibTeX::EntryField::ftEditor:
645
return QString( i18n( "Editor" ) );
646
case BibTeX::EntryField::ftHowPublished:
647
return QString( i18n( "How Published" ) );
648
case BibTeX::EntryField::ftInstitution:
649
return QString( i18n( "Institution" ) );
650
case BibTeX::EntryField::ftISBN:
651
return QString( i18n( "ISBN" ) );
652
case BibTeX::EntryField::ftISSN:
653
return QString( i18n( "ISSN" ) );
654
case BibTeX::EntryField::ftJournal:
655
return QString( i18n( "Journal" ) );
656
case BibTeX::EntryField::ftKey:
657
return QString( i18n( "Key" ) );
658
case BibTeX::EntryField::ftKeywords:
659
return QString( i18n( "Keywords" ) );
660
case BibTeX::EntryField::ftLocalFile:
661
return QString( i18n( "Local File" ) );
662
case BibTeX::EntryField::ftLocation:
663
return QString( i18n( "Location" ) );
664
case BibTeX::EntryField::ftMonth:
665
return QString( i18n( "Month" ) );
666
case BibTeX::EntryField::ftNote:
667
return QString( i18n( "Note" ) );
668
case BibTeX::EntryField::ftNumber:
669
return QString( i18n( "Number" ) );
670
case BibTeX::EntryField::ftOrganization:
671
return QString( i18n( "Organization" ) );
672
case BibTeX::EntryField::ftPages:
673
return QString( i18n( "Pages" ) );
674
case BibTeX::EntryField::ftPublisher:
675
return QString( i18n( "Publisher" ) );
676
case BibTeX::EntryField::ftSeries:
677
return QString( i18n( "Series" ) );
678
case BibTeX::EntryField::ftSchool:
679
return QString( i18n( "School" ) );
680
case BibTeX::EntryField::ftTitle:
681
return QString( i18n( "Title" ) );
682
case BibTeX::EntryField::ftType:
683
return QString( i18n( "Type" ) );
684
case BibTeX::EntryField::ftURL:
685
return QString( i18n( "URL" ) );
686
case BibTeX::EntryField::ftVolume:
687
return QString( i18n( "Volume" ) );
688
case BibTeX::EntryField::ftYear:
689
return QString( i18n( "Year" ) );
691
return QString( i18n( "Unknown" ) );
695
QString Settings::entryTypeToI18NString( const BibTeX::Entry::EntryType entryType )
699
case BibTeX::Entry::etArticle:
700
return QString( i18n( "Article" ) );
701
case BibTeX::Entry::etBook:
702
return QString( i18n( "Book" ) );
703
case BibTeX::Entry::etBooklet:
704
return QString( i18n( "Booklet" ) );
705
case BibTeX::Entry::etCollection:
706
return QString( i18n( "Collection" ) );
707
case BibTeX::Entry::etElectronic:
708
return QString( i18n( "Electronic" ) );
709
case BibTeX::Entry::etInBook:
710
return QString( i18n( "InBook" ) );
711
case BibTeX::Entry::etInCollection:
712
return QString( i18n( "InCollection" ) );
713
case BibTeX::Entry::etInProceedings:
714
return QString( i18n( "InProceedings" ) );
715
case BibTeX::Entry::etManual:
716
return QString( i18n( "Manual" ) );
717
case BibTeX::Entry::etMastersThesis:
718
return QString( i18n( "MastersThesis" ) );
719
case BibTeX::Entry::etMisc:
720
return QString( i18n( "Misc" ) );
721
case BibTeX::Entry::etPhDThesis:
722
return QString( i18n( "PhDThesis" ) );
723
case BibTeX::Entry::etProceedings:
724
return QString( i18n( "Proceedings" ) );
725
case BibTeX::Entry::etTechReport:
726
return QString( i18n( "TechReport" ) );
727
case BibTeX::Entry::etUnpublished:
728
return QString( i18n( "Unpublished" ) );
730
return QString( i18n( "Unknown" ) );
734
KURL Settings::doiURL( const QString& doiText )
736
KURL result( doiText );
737
if ( result.isValid() )
740
result = KURL( QString( "http://dx.doi.org/%1" ).arg( doiText ) );
741
if ( result.isValid() )
747
bool Settings::kpsewhich( const QString& filename )
752
QWaitCondition waitCond;
754
kpsewhich.addArgument( "kpsewhich" );
755
kpsewhich.addArgument( filename );
756
if ( kpsewhich.start() )
758
qApp->processEvents();
759
while ( kpsewhich.isRunning() )
761
waitCond.wait( 250 );
762
qApp->processEvents();
766
kpsewhich.tryTerminate();
769
result = kpsewhich.exitStatus() == 0 && counter < 50;
775
KURL Settings::locateFile( const QString& filename, const QString& bibTeXFileName, QWidget *window )
777
QString _filename = filename;
778
QString userHome = QString( getenv( "HOME" ) );
779
if ( _filename.contains( "~/" ) && !userHome.isEmpty() ) _filename = _filename.replace( "~/", userHome.append( "/" ) );
781
KURL url( _filename );
782
if ( url.isValid() && ( !url.isLocalFile() || KIO::NetAccess::exists( url, TRUE, window ) ) )
785
if ( bibTeXFileName != QString::null )
787
QString path = KURL( bibTeXFileName ).directory( FALSE, FALSE );
788
url = KURL( path + "/" + _filename );
789
if ( url.isValid() && KIO::NetAccess::exists( url, TRUE, window ) )
793
Settings* settings = self( NULL );
794
for ( QStringList::Iterator it = settings->editing_DocumentSearchPaths.begin(); it != settings->editing_DocumentSearchPaths.end(); ++it )
796
url = KURL( *it + "/" + _filename );
797
if ( url.isValid() && KIO::NetAccess::exists( url, TRUE, window ) )
804
KURL Settings::locateFile( const QString& filename, QWidget *window )
806
return locateFile( filename, currentBibTeXFile == NULL ? QString::null : currentBibTeXFile->fileName, window );
809
QString Settings::resolveLink( const QString& originalFilename, const QString& linkFilename )
811
if ( linkFilename[0] == '/' )
813
QFileInfo fiO( originalFilename );
814
QFileInfo fiL( fiO.dirPath( TRUE ) + "/" + linkFilename );
815
return fiL.absFilePath();
818
bool Settings::openUrl( const KURL& url, QWidget *parent )
821
args << "xdg-open" << url.prettyURL();
822
QProcess proc( args, parent, "Settings::openUrl" );
828
void Settings::z3950clearAll()
830
z3950_ServerList.clear();
833
void Settings::z3950loadDefault()
835
QString z3950serverConfigFile = locate( "appdata", "z3950-servers.cfg" );
836
if ( !z3950serverConfigFile.isEmpty() )
838
KConfig z3950serverConfig( z3950serverConfigFile, true, false );
839
QStringList serverList = z3950serverConfig.groupList();
840
for ( QStringList::ConstIterator it = serverList.begin(); it != serverList.end(); ++it )
841
if ( !z3950_ServerList.contains( *it ) )
843
z3950serverConfig.setGroup( *it );
846
server.name = z3950serverConfig.readEntry( "Name" );
847
server.host = z3950serverConfig.readEntry( "Host" );
848
server.port = z3950serverConfig.readNumEntry( "Port", 2100 );
849
server.database = z3950serverConfig.readEntry( "Database" );
850
server.charset = z3950serverConfig.readEntry( "Charset" );
851
server.syntax = z3950serverConfig.readEntry( "Syntax" );
852
server.user = z3950serverConfig.readEntry( "User" );
853
server.password = z3950serverConfig.readEntry( "Password" );
854
server.locale = z3950serverConfig.readEntry( "Locale" );
856
z3950_ServerList[*it] = server;
861
void Settings::z3950loadUser( KConfig * config )
863
config->setGroup( "Z3950Server" );
865
QString key = config->readEntry( QString( "Key%1" ).arg( i ) );
866
while ( key != QString::null )
869
server.name = config->readEntry( QString( "Name%1" ).arg( i ) );
870
server.host = config->readEntry( QString( "Host%1" ).arg( i ) );
871
server.port = config->readNumEntry( QString( "Port%1" ).arg( i ), 2100 );
872
server.database = config->readEntry( QString( "Database%1" ).arg( i ) );
873
server.charset = config->readEntry( QString( "Charset%1" ).arg( i ) );
874
server.syntax = config->readEntry( QString( "Syntax%1" ).arg( i ) );
875
server.user = config->readEntry( QString( "User%1" ).arg( i ) );
876
server.password = config->readEntry( QString( "Password%1" ).arg( i ) );
877
server.locale = config->readEntry( QString( "Locale%1" ).arg( i ) );
878
z3950_ServerList[key] = server;
881
key = config->readEntry( QString( "Key%1" ).arg( i ) );
885
void Settings::z3950saveUser( KConfig *config )
887
config->deleteGroup( "Z3950Server" );
888
config->setGroup( "Z3950Server" );
891
QString z3950serverConfigFile = locate( "appdata", "z3950-servers.cfg" );
892
if ( !z3950serverConfigFile.isEmpty() )
894
KConfig z3950serverConfig( z3950serverConfigFile, true, false );
895
for ( QMap<QString, Z3950Server>::Iterator it = z3950_ServerList.begin(); it != z3950_ServerList.end(); ++it )
897
bool notInDefault = !z3950serverConfig.hasGroup( it.key() );
900
z3950serverConfig.setGroup( it.key() );
901
notInDefault = z3950serverConfig.readEntry( "Name", it.data().name ) != it.data().name || z3950serverConfig.readEntry( "Host", it.data().host ) != it.data().host || z3950serverConfig.readNumEntry( "Port", it.data().port ) != it.data().port || z3950serverConfig.readEntry( "Database", it.data().database ) != it.data().database || z3950serverConfig.readEntry( "Charset", it.data().charset ) != it.data().charset || z3950serverConfig.readEntry( "Syntax", it.data().syntax ) != it.data().syntax || z3950serverConfig.readEntry( "User", it.data().user ) != it.data().user || z3950serverConfig.readEntry( "Password", it.data().password ) != it.data().password || z3950serverConfig.readEntry( "Locale", it.data().locale ) != it.data().locale || z3950serverConfig.readEntry( "User", it.data().user ) != it.data().user;
906
config->writeEntry( QString( "Key%1" ).arg( i ), it.key() );
907
config->writeEntry( QString( "Name%1" ).arg( i ), it.data().name );
908
config->writeEntry( QString( "Host%1" ).arg( i ), it.data().host );
909
config->writeEntry( QString( "Port%1" ).arg( i ), it.data().port );
910
config->writeEntry( QString( "Database%1" ).arg( i ), it.data().database );
911
config->writeEntry( QString( "Charset%1" ).arg( i ), it.data().charset );
912
config->writeEntry( QString( "Syntax%1" ).arg( i ), it.data().syntax );
913
config->writeEntry( QString( "User%1" ).arg( i ), it.data().user );
914
config->writeEntry( QString( "Password%1" ).arg( i ), it.data().password );
915
config->writeEntry( QString( "Locale%1" ).arg( i ), it.data().locale );
924
/** Create backup of file as specified in fileIO_NumberOfBackups */
925
bool Settings::createBackup( const KURL &url, QWidget *window )
927
QString basename = url.prettyURL();
929
qDebug( "Making %i backups of URL %s", fileIO_NumberOfBackups, basename.latin1() );
931
for ( int i = fileIO_NumberOfBackups; i > 2; --i )
933
KURL backupN( basename + "~" + QString::number( i ) );
934
KURL backupNmm( basename + "~" + QString::number( i - 1 ) );
935
if ( KIO::NetAccess::exists( backupNmm, true, window ) )
937
if ( !KIO::NetAccess::file_copy( backupNmm, backupN, -1, true, false, false ) )
942
if ( fileIO_NumberOfBackups >= 2 )
944
KURL backupN( basename + "~2" );
945
KURL backupNmm( basename + "~" );
946
if ( KIO::NetAccess::exists( backupNmm, true, window ) )
948
if ( !KIO::NetAccess::file_copy( backupNmm, backupN, -1, true, false, false ) )
952
if ( fileIO_NumberOfBackups >= 1 )
954
KURL backupN( basename + "~" );
955
KURL backupNmm( basename );
956
if ( KIO::NetAccess::exists( backupNmm, true, window ) )
958
if ( !KIO::NetAccess::file_copy( backupNmm, backupN, -1, true, false, false ) )