~ubuntu-branches/ubuntu/precise/kbibtex/precise

« back to all changes in this revision

Viewing changes to src/settings.cpp

  • Committer: Package Import Robot
  • Author(s): Michael Hanke
  • Date: 2011-07-18 09:29:48 UTC
  • mfrom: (1.1.6) (2.1.5 sid)
  • Revision ID: package-import@ubuntu.com-20110718092948-ksxjmg7kdfamolmg
Tags: 0.3-1
* First upstream release for KDE4 (Closes: #634255). A number of search
  engines are still missing, in comparison to the 0.2 series.
* Bumped Standards-Version to 3.9.2, no changes necessary.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/***************************************************************************
2
 
*   Copyright (C) 2004-2009 by Thomas Fischer                             *
3
 
*   fischer@unix-ag.uni-kl.de                                             *
4
 
*                                                                         *
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.                                   *
9
 
*                                                                         *
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.                          *
14
 
*                                                                         *
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
 
***************************************************************************/
20
 
#include <qstring.h>
21
 
#include <qprocess.h>
22
 
#include <qstringlist.h>
23
 
#include <qfont.h>
24
 
#include <qregexp.h>
25
 
#include <qwaitcondition.h>
26
 
#include <qprocess.h>
27
 
#include <qapplication.h>
28
 
 
29
 
#include <kconfig.h>
30
 
#include <kstandarddirs.h>
31
 
#include <kmessagebox.h>
32
 
#include <klocale.h>
33
 
#include <kbibtex_part.h>
34
 
#include <kdebug.h>
35
 
#include <kio/netaccess.h>
36
 
 
37
 
#include <entryfield.h>
38
 
#include <element.h>
39
 
#include <entry.h>
40
 
#include <macro.h>
41
 
#include "settings.h"
42
 
 
43
 
namespace KBibTeX
44
 
{
45
 
    Settings* Settings::staticSettings = new Settings();
46
 
    QStringList Settings::m_lyxRcFileNames = QStringList::split( '|', QDir::home().canonicalPath() + "/.lyx/lyxrc" + '|' + QDir::home().canonicalPath() + "/.lyx/preferences" );
47
 
 
48
 
    const QRegExp Settings::noIdChars( "[^-.:/+_a-zA-Z0-9]" );
49
 
 
50
 
    Settings::Settings()
51
 
    {
52
 
        checkExternalToolsAvailable();
53
 
 
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" ) );
58
 
 
59
 
        int numCompletions = BibTeX::EntryField::ftYear - BibTeX::EntryField::ftAbstract + 4;
60
 
        m_completion = new KCompletion * [ numCompletions ];
61
 
        for ( int i = 0; i < numCompletions; ++i )
62
 
        {
63
 
            m_completion[ i ] = new KCompletion();
64
 
            m_completion[ i ] ->setIgnoreCase( TRUE );
65
 
        }
66
 
        completionMacro = new KCompletion();
67
 
        completionMacro->setIgnoreCase( FALSE );
68
 
 
69
 
        currentBibTeXFile = NULL;
70
 
    }
71
 
 
72
 
    Settings::~Settings()
73
 
    {
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;
79
 
 
80
 
        for ( QValueList<SearchURL*>::ConstIterator it = searchURLs.begin(); it != searchURLs.end(); ++it )
81
 
            delete *it;
82
 
    }
83
 
 
84
 
    Settings* Settings::self( BibTeX::File *bibtexFile )
85
 
    {
86
 
        if ( bibtexFile != NULL )
87
 
            staticSettings->currentBibTeXFile = bibtexFile;
88
 
        return staticSettings;
89
 
    }
90
 
 
91
 
    void Settings::load( KConfig * config )
92
 
    {
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 );
107
 
 
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 );
127
 
 
128
 
        if ( editing_MainListColumnsWidth.isEmpty() || editing_MainListColumnsIndex.isEmpty() )
129
 
        {
130
 
            editing_MainListColumnsWidth.clear();
131
 
            editing_MainListColumnsIndex.clear();
132
 
 
133
 
            int column = 0;
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++ );
139
 
 
140
 
            for ( int i = 0; i <= ( int ) BibTeX::EntryField::ftYear - ( int ) BibTeX::EntryField::ftAbstract; i++ )
141
 
            {
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 );
145
 
                else
146
 
                    editing_MainListColumnsWidth.append( 0 );
147
 
                editing_MainListColumnsIndex.append( column++ );
148
 
            }
149
 
        }
150
 
        editing_findDuplicatesSensitivity = config->readNumEntry( "FindDuplicatesSensitivity", 12 );
151
 
 
152
 
        config->setGroup( "SearchURLs" );
153
 
        searchURLs.clear();
154
 
        for ( int i = 1; i < 1024; i++ )
155
 
        {
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 )
160
 
            {
161
 
                SearchURL * searchURL = new SearchURL;
162
 
                searchURL->description = descr;
163
 
                searchURL->url = url;
164
 
                searchURL->includeAuthor = includeAuthor;
165
 
                searchURLs.append( searchURL );
166
 
            }
167
 
            else
168
 
                break;
169
 
        }
170
 
 
171
 
        if ( searchURLs.count() == 0 )
172
 
            restoreDefaultSearchURLs();
173
 
 
174
 
        config->setGroup( "Keyword" );
175
 
        keyword_GlobalList = config->readListEntry( "GlobalList" );
176
 
        keyword_GlobalList.sort();
177
 
 
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 );
183
 
 
184
 
        config->setGroup( "IdSuggestions" );
185
 
        idSuggestions_formatStrList = config->readListEntry( "FormatStrList" );
186
 
        if ( idSuggestions_formatStrList.count() == 0 )
187
 
        {
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;
191
 
        }
192
 
        else
193
 
        {
194
 
            idSuggestions_default = config->readNumEntry( "Default", -1 );
195
 
            idSuggestions_forceDefault = config->readBoolEntry( "ForceDefault", FALSE );
196
 
        }
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();
201
 
 
202
 
        config->setGroup( "UserDefinedInputFields" );
203
 
        QStringList names = config->readListEntry( "Names" );
204
 
        QStringList labels = config->readListEntry( "Labels" );
205
 
        QStringList inputtypes = config->readListEntry( "InputTypes" );
206
 
 
207
 
        userDefinedInputFields.clear();
208
 
        for ( unsigned int i = 0; i < names.size();++i )
209
 
        {
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;
215
 
        }
216
 
 
217
 
        // web query history/default values
218
 
        m_webQueryDefaults = config->entryMap( "WebQuery" );
219
 
 
220
 
#ifdef HAVE_YAZ
221
 
        z3950clearAll();
222
 
        z3950loadUser( config );
223
 
        z3950loadDefault();
224
 
#endif // HAVE_YAZ
225
 
    }
226
 
 
227
 
    void Settings::save( KConfig * config )
228
 
    {
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 );
242
 
 
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 );
262
 
 
263
 
        config->setGroup( "SearchURLs" );
264
 
        int i = 1;
265
 
        for ( QValueList<SearchURL*>::ConstIterator it = searchURLs.begin(); it != searchURLs.end(); ++it, ++i )
266
 
        {
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 );
270
 
        }
271
 
 
272
 
        config->setGroup( "Keyword" );
273
 
        config->writeEntry( "GlobalList", keyword_GlobalList );
274
 
 
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 );
280
 
 
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 );
286
 
 
287
 
        config->setGroup( "UserDefinedInputFields" );
288
 
        QStringList names, labels, inputtype;
289
 
        for ( QValueList<UserDefinedInputFields*>::iterator it = userDefinedInputFields.begin(); it != userDefinedInputFields.end();++it )
290
 
        {
291
 
            names << ( *it )->name;
292
 
            labels << ( *it )->label;
293
 
            inputtype << (( *it )->inputType == FieldLineEdit::itMultiLine ? "multi" : "single" );
294
 
        }
295
 
        config->writeEntry( "Names", names );
296
 
        config->writeEntry( "Labels", labels );
297
 
        config->writeEntry( "InputTypes", inputtype );
298
 
 
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() );
302
 
 
303
 
#ifdef HAVE_YAZ
304
 
        z3950saveUser( config );
305
 
#endif // HAVE_YAZ
306
 
    }
307
 
 
308
 
    void Settings::checkExternalToolsAvailable()
309
 
    {
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" );
317
 
    }
318
 
 
319
 
    bool Settings::updateBib2Db5ClassPath( const QString& newBasePath, bool testOnly )
320
 
    {
321
 
        QString bib2db5ClassPath = QString::null;
322
 
        QDir bib2db5BaseDir( newBasePath );
323
 
        QStringList list = bib2db5BaseDir.entryList( "antlr-runtime*.jar" );
324
 
        if ( !list.isEmpty() )
325
 
        {
326
 
            bib2db5ClassPath = bib2db5BaseDir.absPath() + "/" + list[0];
327
 
            list = bib2db5BaseDir.entryList( "bib2db5*.jar" );
328
 
            if ( !list.isEmpty() )
329
 
                bib2db5ClassPath += ":" + bib2db5BaseDir.absPath() + "/" + list[0];
330
 
            else
331
 
                bib2db5ClassPath = QString::null;
332
 
        }
333
 
        else
334
 
            bib2db5ClassPath = QString::null;
335
 
        if ( bib2db5ClassPath == QString::null )
336
 
            kdDebug() << "Base path for bib2db5 is invalid (\"" << newBasePath << "\")" << endl;
337
 
 
338
 
        if ( !testOnly )
339
 
        {
340
 
            fileIO_bib2db5BasePath = newBasePath;
341
 
            fileIO_bib2db5ClassPath = bib2db5ClassPath;
342
 
        }
343
 
 
344
 
        return bib2db5ClassPath != QString::null;
345
 
    }
346
 
 
347
 
    bool Settings::checkExternalToolAvailable( const QString &binary )
348
 
    {
349
 
        QProcess *process = new QProcess( binary );
350
 
        bool ok = process->start();
351
 
        ok &= process->normalExit();
352
 
        if ( process->isRunning() )
353
 
        {
354
 
            process->kill();
355
 
            ok = true;
356
 
        }
357
 
        delete process;
358
 
        return ok;
359
 
    }
360
 
 
361
 
    QString Settings::detectLyXInPipe()
362
 
    {
363
 
        QString result = QString::null;
364
 
        for ( QStringList::Iterator it = m_lyxRcFileNames.begin(); result.isNull() && it != m_lyxRcFileNames.end(); ++it )
365
 
        {
366
 
            QString lyxRcFileName = *it;
367
 
            QFile lyxRcFile( lyxRcFileName );
368
 
 
369
 
            kdDebug() << "detectLyXInPipe:  looking for " << lyxRcFileName << endl;
370
 
            if ( lyxRcFile.exists() && lyxRcFile.open( IO_ReadOnly ) )
371
 
            {
372
 
                QTextStream input( &lyxRcFile );
373
 
                while ( result.isNull() && !input.atEnd() )
374
 
                {
375
 
                    QString line = input.readLine();
376
 
                    if ( line.startsWith( "\\serverpipe ", FALSE ) )
377
 
                    {
378
 
                        QStringList cols = QStringList::split( QRegExp( "\\s+\"|\"" ), line );
379
 
                        if ( cols.size() >= 2 )
380
 
                        {
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;
385
 
                        }
386
 
                    }
387
 
                }
388
 
                lyxRcFile.close();
389
 
            }
390
 
        }
391
 
 
392
 
        if ( result.isNull() )
393
 
        {
394
 
            result = QDir::home().canonicalPath() + "/.lyx/lyxpipe.in";
395
 
            kdDebug() << "detectLyXInPipe:  testing " << result << endl;
396
 
            if ( !QFile::exists( result ) )
397
 
                result = QString::null;
398
 
        }
399
 
 
400
 
        if ( result.isNull() )
401
 
        {
402
 
            result = QDir::home().canonicalPath() + "/.lyx/.lyxpipe.in";
403
 
            kdDebug() << "detectLyXInPipe:  testing " << result << endl;
404
 
            if ( !QFile::exists( result ) )
405
 
                result = QString::null;
406
 
        }
407
 
 
408
 
        if ( result.isNull() )
409
 
        {
410
 
            result = QDir::home().canonicalPath() + "/.lyxpipe.in";
411
 
            kdDebug() << "detectLyXInPipe:  testing " << result << endl;
412
 
            if ( !QFile::exists( result ) )
413
 
                result = QString::null;
414
 
        }
415
 
 
416
 
        kdDebug() << "detectLyXInPipe:  using " << ( result.isNull() ? "<INVALID>" : result ) << endl;
417
 
        return result;
418
 
    }
419
 
 
420
 
    QString Settings::getWebQueryDefault( const QString &key )
421
 
    {
422
 
        return m_webQueryDefaults[key];
423
 
    }
424
 
 
425
 
    void Settings::setWebQueryDefault( const QString &key, const QString& value )
426
 
    {
427
 
        m_webQueryDefaults[key] = value;
428
 
    }
429
 
 
430
 
    void Settings::addToCompletion( BibTeX::File *file )
431
 
    {
432
 
        for ( BibTeX::File::ElementList::iterator it = file->begin(); it != file->end(); it++ )
433
 
            addToCompletion( *it );
434
 
    }
435
 
 
436
 
    void Settings::addToCompletion( BibTeX::Element *element )
437
 
    {
438
 
        BibTeX::Entry * entry = dynamic_cast<BibTeX::Entry*>( element );
439
 
        BibTeX::Macro * macro = dynamic_cast<BibTeX::Macro*>( element );
440
 
        if ( entry != NULL )
441
 
        {
442
 
            for ( BibTeX::Entry::EntryFields::ConstIterator ite = entry->begin(); ite != entry->end(); ite++ )
443
 
            {
444
 
                BibTeX::EntryField::FieldType fieldType = ( *ite ) ->fieldType();
445
 
                BibTeX::Value *value = ( *ite ) ->value();
446
 
                addToCompletion( value, fieldType );
447
 
            }
448
 
        }
449
 
        else if ( macro != NULL )
450
 
            completionMacro->addItem( macro->key() );
451
 
    }
452
 
 
453
 
    void Settings::addToCompletion( BibTeX::Value *value, BibTeX::EntryField::FieldType fieldType )
454
 
    {
455
 
        int index = completionFieldTypeToIndex( fieldType );
456
 
 
457
 
        for ( QValueList<BibTeX::ValueItem*>::ConstIterator itv = value->items.begin(); itv != value->items.end(); itv++ )
458
 
        {
459
 
            BibTeX::PlainText *plainText = dynamic_cast<BibTeX::PlainText*>( *itv );
460
 
            if ( plainText != NULL )
461
 
                m_completion[ index ] ->addItem( plainText->text() );
462
 
            else
463
 
            {
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 )
467
 
                    {
468
 
                        m_completion[ index ] ->addItem(( *itp )->text( TRUE ) );
469
 
                        m_completion[ index ] ->addItem(( *itp )->text( FALSE ) );
470
 
                    }
471
 
                else
472
 
                {
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() );
477
 
                }
478
 
            }
479
 
        }
480
 
    }
481
 
 
482
 
    KCompletion *Settings::completion( BibTeX::EntryField::FieldType fieldType )
483
 
    {
484
 
        return m_completion[ completionFieldTypeToIndex( fieldType )];
485
 
    }
486
 
 
487
 
    int Settings::completionFieldTypeToIndex( BibTeX::EntryField::FieldType fieldType )
488
 
    {
489
 
        int index = 0;
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;
494
 
        return index;
495
 
    }
496
 
 
497
 
    void Settings::restoreDefaultSearchURLs()
498
 
    {
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" );
515
 
 
516
 
        QValueList<SearchURL*> toDelete;
517
 
        for ( QValueList<SearchURL*>::ConstIterator it = searchURLs.begin(); it != searchURLs.end(); ++it )
518
 
        {
519
 
            if ( defaultDescriptions.contains(( *it ) ->description ) )
520
 
            {
521
 
                toDelete.append( *it );
522
 
            }
523
 
        }
524
 
 
525
 
        for ( QValueList<SearchURL*>::ConstIterator it = toDelete.begin(); it != toDelete.end(); ++it )
526
 
        {
527
 
            delete *it;
528
 
            searchURLs.remove( *it );
529
 
        }
530
 
 
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 );
536
 
 
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 );
542
 
 
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 );
548
 
 
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 );
554
 
 
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 );
560
 
 
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 );
566
 
 
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 );
572
 
 
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 );
578
 
 
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 );
584
 
 
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 );
590
 
 
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 );
596
 
 
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 );
602
 
 
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 );
608
 
 
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 );
614
 
 
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 );
620
 
    }
621
 
 
622
 
    QString Settings::fieldTypeToI18NString( const BibTeX::EntryField::FieldType fieldType )
623
 
    {
624
 
        switch ( fieldType )
625
 
        {
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" ) );
690
 
        default:
691
 
            return QString( i18n( "Unknown" ) );
692
 
        }
693
 
    }
694
 
 
695
 
    QString Settings::entryTypeToI18NString( const BibTeX::Entry::EntryType entryType )
696
 
    {
697
 
        switch ( entryType )
698
 
        {
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" ) );
729
 
        default:
730
 
            return QString( i18n( "Unknown" ) );
731
 
        }
732
 
    }
733
 
 
734
 
    KURL Settings::doiURL( const QString& doiText )
735
 
    {
736
 
        KURL result( doiText );
737
 
        if ( result.isValid() )
738
 
            return result;
739
 
 
740
 
        result = KURL( QString( "http://dx.doi.org/%1" ).arg( doiText ) );
741
 
        if ( result.isValid() )
742
 
            return result;
743
 
 
744
 
        return KURL();
745
 
    }
746
 
 
747
 
    bool Settings::kpsewhich( const QString& filename )
748
 
    {
749
 
        bool result = FALSE;
750
 
        int counter = 0;
751
 
 
752
 
        QWaitCondition waitCond;
753
 
        QProcess kpsewhich;
754
 
        kpsewhich.addArgument( "kpsewhich" );
755
 
        kpsewhich.addArgument( filename );
756
 
        if ( kpsewhich.start() )
757
 
        {
758
 
            qApp->processEvents();
759
 
            while ( kpsewhich.isRunning() )
760
 
            {
761
 
                waitCond.wait( 250 );
762
 
                qApp->processEvents();
763
 
 
764
 
                counter++;
765
 
                if ( counter > 50 )
766
 
                    kpsewhich.tryTerminate();
767
 
            }
768
 
 
769
 
            result = kpsewhich.exitStatus() == 0 && counter < 50;
770
 
        }
771
 
 
772
 
        return result;
773
 
    }
774
 
 
775
 
    KURL Settings::locateFile( const QString& filename, const QString& bibTeXFileName, QWidget *window )
776
 
    {
777
 
        QString _filename = filename;
778
 
        QString userHome = QString( getenv( "HOME" ) );
779
 
        if ( _filename.contains( "~/" ) && !userHome.isEmpty() ) _filename = _filename.replace( "~/", userHome.append( "/" ) );
780
 
 
781
 
        KURL url( _filename );
782
 
        if ( url.isValid() && ( !url.isLocalFile() || KIO::NetAccess::exists( url, TRUE, window ) ) )
783
 
            return url;
784
 
 
785
 
        if ( bibTeXFileName != QString::null )
786
 
        {
787
 
            QString path = KURL( bibTeXFileName ).directory( FALSE, FALSE );
788
 
            url = KURL( path + "/" + _filename );
789
 
            if ( url.isValid() && KIO::NetAccess::exists( url, TRUE, window ) )
790
 
                return url;
791
 
        }
792
 
 
793
 
        Settings* settings = self( NULL );
794
 
        for ( QStringList::Iterator it = settings->editing_DocumentSearchPaths.begin(); it != settings->editing_DocumentSearchPaths.end(); ++it )
795
 
        {
796
 
            url = KURL( *it + "/" + _filename );
797
 
            if ( url.isValid() && KIO::NetAccess::exists( url, TRUE, window ) )
798
 
                return url;
799
 
        }
800
 
 
801
 
        return KURL();
802
 
    }
803
 
 
804
 
    KURL Settings::locateFile( const QString& filename, QWidget *window )
805
 
    {
806
 
        return locateFile( filename, currentBibTeXFile == NULL ? QString::null : currentBibTeXFile->fileName, window );
807
 
    }
808
 
 
809
 
    QString Settings::resolveLink( const QString& originalFilename, const QString& linkFilename )
810
 
    {
811
 
        if ( linkFilename[0] == '/' )
812
 
            return linkFilename;
813
 
        QFileInfo fiO( originalFilename );
814
 
        QFileInfo fiL( fiO.dirPath( TRUE ) + "/" + linkFilename );
815
 
        return fiL.absFilePath();
816
 
    }
817
 
 
818
 
    bool Settings::openUrl( const KURL& url, QWidget *parent )
819
 
    {
820
 
        QStringList args;
821
 
        args << "xdg-open" << url.prettyURL();
822
 
        QProcess proc( args, parent, "Settings::openUrl" );
823
 
        return proc.start();
824
 
    }
825
 
 
826
 
 
827
 
#ifdef HAVE_YAZ
828
 
    void Settings::z3950clearAll()
829
 
    {
830
 
        z3950_ServerList.clear();
831
 
    }
832
 
 
833
 
    void Settings::z3950loadDefault()
834
 
    {
835
 
        QString z3950serverConfigFile = locate( "appdata", "z3950-servers.cfg" );
836
 
        if ( !z3950serverConfigFile.isEmpty() )
837
 
        {
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 ) )
842
 
                {
843
 
                    z3950serverConfig.setGroup( *it );
844
 
 
845
 
                    Z3950Server server;
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" );
855
 
 
856
 
                    z3950_ServerList[*it] = server;
857
 
                }
858
 
        }
859
 
    }
860
 
 
861
 
    void Settings::z3950loadUser( KConfig * config )
862
 
    {
863
 
        config->setGroup( "Z3950Server" );
864
 
        int i = 0;
865
 
        QString key = config->readEntry( QString( "Key%1" ).arg( i ) );
866
 
        while ( key != QString::null )
867
 
        {
868
 
            Z3950Server server;
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;
879
 
 
880
 
            ++i;
881
 
            key = config->readEntry( QString( "Key%1" ).arg( i ) );
882
 
        }
883
 
    }
884
 
 
885
 
    void Settings::z3950saveUser( KConfig *config )
886
 
    {
887
 
        config->deleteGroup( "Z3950Server" );
888
 
        config->setGroup( "Z3950Server" );
889
 
        int i = 0;
890
 
 
891
 
        QString z3950serverConfigFile = locate( "appdata", "z3950-servers.cfg" );
892
 
        if ( !z3950serverConfigFile.isEmpty() )
893
 
        {
894
 
            KConfig z3950serverConfig( z3950serverConfigFile, true, false );
895
 
            for ( QMap<QString, Z3950Server>::Iterator it = z3950_ServerList.begin(); it != z3950_ServerList.end(); ++it )
896
 
            {
897
 
                bool notInDefault = !z3950serverConfig.hasGroup( it.key() );
898
 
                if ( !notInDefault )
899
 
                {
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;
902
 
                }
903
 
 
904
 
                if ( notInDefault )
905
 
                {
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 );
916
 
                    ++i;
917
 
                }
918
 
            }
919
 
        }
920
 
    }
921
 
 
922
 
#endif // HAVE_YAZ
923
 
 
924
 
    /** Create backup of file as specified in fileIO_NumberOfBackups */
925
 
    bool Settings::createBackup( const KURL &url, QWidget *window )
926
 
    {
927
 
        QString basename = url.prettyURL();
928
 
 
929
 
        qDebug( "Making %i backups of URL %s", fileIO_NumberOfBackups, basename.latin1() );
930
 
 
931
 
        for ( int i = fileIO_NumberOfBackups; i > 2; --i )
932
 
        {
933
 
            KURL backupN( basename + "~" + QString::number( i ) );
934
 
            KURL backupNmm( basename + "~" + QString::number( i - 1 ) );
935
 
            if ( KIO::NetAccess::exists( backupNmm, true, window ) )
936
 
            {
937
 
                if ( !KIO::NetAccess::file_copy( backupNmm, backupN, -1, true, false, false ) )
938
 
                    return false;
939
 
            }
940
 
        }
941
 
 
942
 
        if ( fileIO_NumberOfBackups >= 2 )
943
 
        {
944
 
            KURL backupN( basename + "~2" );
945
 
            KURL backupNmm( basename + "~" );
946
 
            if ( KIO::NetAccess::exists( backupNmm, true, window ) )
947
 
            {
948
 
                if ( !KIO::NetAccess::file_copy( backupNmm, backupN, -1, true, false, false ) )
949
 
                    return false;
950
 
            }
951
 
        }
952
 
        if ( fileIO_NumberOfBackups >= 1 )
953
 
        {
954
 
            KURL backupN( basename + "~" );
955
 
            KURL backupNmm( basename );
956
 
            if ( KIO::NetAccess::exists( backupNmm, true, window ) )
957
 
            {
958
 
                if ( !KIO::NetAccess::file_copy( backupNmm, backupN, -1, true, false, false ) )
959
 
                    return false;
960
 
            }
961
 
        }
962
 
        return true;
963
 
    }
964
 
 
965
 
 
966
 
}