Subversion Repositories Scribus

Rev

Rev 2295 | Rev 2617 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2160 cbradney 1
/***************************************************************************
2
        begin                : May 2005
3
        copyright            : (C) 2005 by Craig Bradney       
4
        email                : cbradney@zip.com.au
5
        copyright            : (C) 2001 by Franz Schmid
6
        email                : Franz.Schmid@altmuehlnet.de
7
***************************************************************************/
8
 
9
/***************************************************************************
10
*                                                                         *
11
*   ScApp program is free software; you can redistribute it and/or modify  *
12
*   it under the terms of the GNU General Public License as published by  *
13
*   the Free Software Foundation; either version 2 of the License, or     *
14
*   (at your option) any later version.                                   *
15
*                                                                         *
16
***************************************************************************/
17
 
2245 cbradney 18
#include <iostream>
19
#include <cstdlib>
20
 
2160 cbradney 21
#include <qfont.h>
22
#include <qstring.h>
23
#include <qtranslator.h>
24
#include <qfileinfo.h>
25
#include <qfile.h>
26
#include <qdir.h>
27
#include <qtextcodec.h>
28
 
29
#include "scribusapp.h"
30
#include "scribus.h"
31
#include "scpaths.h"
32
#include "prefsfile.h"
2245 cbradney 33
#include "langmgr.h"
2160 cbradney 34
 
2245 cbradney 35
#define ARG_VERSION "--version"
36
#define ARG_HELP "--help"
37
#define ARG_LANG "--lang"
38
#define ARG_AVAILLANG "--langs-available"
39
#define ARG_NOSPLASH "--no-splash"
40
#define ARG_NOGUI "--no-gui"
41
#define ARG_DISPLAY "--display"
2295 cbradney 42
#define ARG_FONTINFO "--font-info"
2245 cbradney 43
 
44
#define ARG_VERSION_SHORT "-v"
45
#define ARG_HELP_SHORT "-h"
46
#define ARG_LANG_SHORT "-l"
47
#define ARG_AVAILLANG_SHORT "-la"
48
#define ARG_NOSPLASH_SHORT "-ns"
49
#define ARG_NOGUI_SHORT "-g"
50
#define ARG_DISPLAY_SHORT "-d"
2295 cbradney 51
#define ARG_FONTINFO_SHORT "-fi"
2245 cbradney 52
 
53
// Qt wants -display not --display or -d
54
#define ARG_DISPLAY_QT "-display"
55
 
2536 cbradney 56
extern ScribusApp* ScApp;
57
extern ScribusQApp* ScQApp;
58
 
59
bool ScribusQApp::useGUI=false;
60
 
2160 cbradney 61
ScribusQApp::ScribusQApp ( int & argc, char ** argv ) : QApplication(argc, argv)
62
{
2536 cbradney 63
        ScQApp=this;
64
        ScApp=NULL;
2245 cbradney 65
        lang="";
2160 cbradney 66
}
67
 
2245 cbradney 68
void ScribusQApp::initLang()
2160 cbradney 69
{
70
        QStringList langs = getLang(QString(lang));
71
 
72
        if (!langs.isEmpty())
73
                installTranslators(langs);
2245 cbradney 74
}
2160 cbradney 75
 
2245 cbradney 76
void ScribusQApp::parseCommandLine()
77
{
78
        showSplash=true;
79
        QString arg = "";
80
        bool usage=false;
81
        bool header=false;
82
        bool availlangs=false;
83
        bool version=false;
2295 cbradney 84
        showFontInfo=false;
2245 cbradney 85
 
86
        //Parse for command line information options, and lang
87
        for(int i = 1; i < argc(); i++)
88
        {
89
                arg = argv()[i];
90
 
91
                if ((arg == ARG_LANG || arg == ARG_LANG_SHORT) && (++i < argc())) {
92
                        lang = argv()[i];
93
                }
94
                else if (arg == ARG_VERSION || arg == ARG_VERSION_SHORT) {
95
                        header=true;
96
                        version=true;
97
                } else if (arg == ARG_HELP || arg == ARG_HELP_SHORT) {
98
                        header=true;
99
                        usage=true;
100
                } else if (arg == ARG_AVAILLANG || arg == ARG_AVAILLANG_SHORT) {
101
                        header=true;
102
                        availlangs=true;
103
                }
104
        }
105
        //Init translations
106
        initLang();    
107
        //Show command line help
108
        if (header)
109
                showHeader();
110
        if (version)
111
                showVersion();
112
        if (availlangs)
113
                showAvailLangs();
114
        if (usage)
115
                showUsage();
116
        //Dont run the GUI init process called from main.cpp, and return
2536 cbradney 117
        if (!header)
118
                useGUI=true;
119
        else
2245 cbradney 120
                return;
121
        //We are going to run something other than command line help
122
        for(int i = 1; i < argc(); i++) {
123
                arg = argv()[i];
124
 
125
                if ((arg == ARG_LANG || arg == ARG_LANG_SHORT) && (++i < argc())) {
126
                }
127
                else if (arg == ARG_NOSPLASH || arg == ARG_NOSPLASH_SHORT) {
128
                        showSplash = false;
129
                } else if (arg == ARG_NOGUI || arg == ARG_NOGUI_SHORT) {
130
                        useGUI=false;
2295 cbradney 131
                } else if (arg == ARG_FONTINFO || arg == ARG_FONTINFO_SHORT) {
132
                        showFontInfo=true;
2245 cbradney 133
                } else if ((arg == ARG_DISPLAY || arg==ARG_DISPLAY_SHORT || arg==ARG_DISPLAY_QT) && ++i < argc()) {
134
                        // allow setting of display, QT expect the option -display <display_name> so we discard the
135
                        // last argument. FIXME: Qt only understands -display not --display and -d , we need to work
136
                        // around this.
137
                } else if (strncmp(arg,"-psn_",4) == 0)
138
                {
139
                        // Andreas Vox: Qt/Mac has -psn_blah flags that must be accepted.
140
                } else {
141
                        file = QFile::decodeName(argv()[i]);
142
                        if (!QFileInfo(file).exists()) {
143
                                showHeader();
144
                                if (file.left(1) == "-" || file.left(2) == "--") {
145
                                        std::cout << QObject::tr("Invalid argument: ") << file << std::endl;
146
                                } else {
147
                                        std::cout << QObject::tr("File %1 does not exist, aborting.").arg(file) << std::endl;
148
                                }
149
                                showUsage();
150
                                useGUI=false;
151
                                return;
152
                        }
153
                }
154
        }
155
}
156
 
157
int ScribusQApp::init()
158
{
2160 cbradney 159
        processEvents();
2245 cbradney 160
        if (useGUI)
161
        {
162
                scribus = new ScribusApp();
2536 cbradney 163
                ScApp=scribus;
2245 cbradney 164
                if (!scribus)
165
                        exit(EXIT_FAILURE);
2295 cbradney 166
                int scribusRetVal = scribus->initScribus(showSplash, showFontInfo, lang);
2245 cbradney 167
                if (scribusRetVal == 1)
168
                        return(EXIT_FAILURE);
2536 cbradney 169
 
2245 cbradney 170
                setMainWidget(scribus);
171
                connect(this, SIGNAL(lastWindowClosed()), this, SLOT(quit()));
2160 cbradney 172
 
2245 cbradney 173
                scribus->show();
174
                scribus->ShowSubs();
175
                if (file != "")
176
                        scribus->loadDoc(file);
177
        }
178
        return EXIT_SUCCESS;
2160 cbradney 179
}
180
 
181
/*!
182
\fn void getLang(QString lang)
183
\author Franz Schmid
184
\author Alessandro Rimoldi
185
\date Mon Feb  9 14:07:46 CET 2004
186
\brief If the lang argument is empty, returns the value in the locales
187
 
188
The lang is always a two character code, except for "en_GB" where
189
the whole string is returned. For all the other locales starting
190
with "en", no locale is returned.
191
 
192
(Inspired from Klocale.cpp)
193
 
194
\param lang QString a two letter string describing the lang environement
195
\retval QString A string describing the language environement
196
*/
197
 
198
QStringList ScribusQApp::getLang(QString lang)
199
{
200
        QStringList langs;
201
 
202
        // read the locales
203
        if (lang != "")
204
                langs.push_back(lang);
205
 
206
        //add in user preferences lang, only overridden by lang command line option
207
        QString Pff = QDir::convertSeparators(QDir::homeDirPath()+"/.scribus");
208
        QFileInfo Pffi = QFileInfo(Pff);
209
        if (Pffi.exists())
210
        {
211
                QString PrefsPfad;
212
                if (Pffi.isDir())
213
                        PrefsPfad = Pff;
214
                else
215
                        PrefsPfad = QDir::homeDirPath();
216
                QString prefsXMLFile=QDir::convertSeparators(PrefsPfad + "/prefs13.xml");
217
                QFileInfo infoPrefsFile(prefsXMLFile);
218
                if (infoPrefsFile.exists())
219
                {
220
                        PrefsFile* prefsFile = new PrefsFile(prefsXMLFile);
221
                        if (prefsFile) {
222
                                PrefsContext* userprefsContext = prefsFile->getContext("user_preferences");
223
                                if (userprefsContext) {
224
                                        QString prefslang = userprefsContext->get("gui_language","");
225
                                        if (prefslang!="")
226
                                                langs.push_back(prefslang);
227
                                }
228
                        }
229
                }
230
        }
231
 
232
        if ((lang = ::getenv("LC_ALL")) != "")
233
                langs.push_back(lang);
234
        if ((lang = ::getenv("LC_MESSAGES")) != "")
235
                langs.push_back(lang);
236
        if ((lang = ::getenv("LANG")) != "")
237
                langs.push_back(lang);
238
 
239
        langs.push_back(QString(QTextCodec::locale()));
240
 
241
        // remove duplicate entries...
242
        for (QStringList::Iterator it = langs.fromLast(); it != langs.begin(); --it)
243
                if (langs.contains(*it) > 1)
244
                        it = langs.remove(it);
245
 
246
        return langs;
247
}
248
 
249
 
250
/*!
251
\fn void installTranslators(QApplication *app, QStringList langs)
252
\author Franz Schmid
253
\author Alessandro Rimoldi
254
\date Mon Feb  9 14:07:46 CET 2004
255
\brief Loads the translations for Scribus and for the Plugins
256
\param app QApplication pointer to the application object
257
\param lang QString a two letter string describing the lang environement
258
\retval void
259
*/
260
void ScribusQApp::installTranslators(QStringList langs)
261
{
262
        QString lang = "";
2161 cbradney 263
        static QTranslator *trans = 0;
264
 
265
        if ( trans )
266
        {
267
                removeTranslator( trans );
268
                delete trans;
269
        }
270
        trans = new QTranslator(0);
2160 cbradney 271
        QString path = ScPaths::instance().libDir();
272
        path += "scribus";
273
 
274
        bool loaded = false;
275
        for (QStringList::Iterator it = langs.begin(); it != langs.end() && !loaded; ++it) {
276
                lang=(*it).left(5);
277
                if (lang == "en")
278
                        break;
279
                else if (loaded = trans->load(QString(path + '.' + lang), "."))
280
                        loaded = true;
281
        }
282
 
283
        if (loaded)
284
                installTranslator(trans);
2161 cbradney 285
        /* CB TODO, currently disabled, because its broken broken broken
2160 cbradney 286
        path = ScPaths::instance().pluginDir();
287
        QDir dir(path , "*.*", QDir::Name, QDir::Files | QDir::NoSymLinks);
288
        if (dir.exists() && (dir.count() != 0)) {
289
                for (uint i = 0; i < dir.count(); ++i) {
290
                        QFileInfo file(path + dir[i]);
291
                        if ((file.extension(false).lower() == "qm")
292
                        && (file.extension(true).lower().left(5) == lang)) {
293
                                trans = new QTranslator(0);
294
                                trans->load(QString(path + dir[i]), ".");
295
                                installTranslator(trans);
296
                        }
297
                }
2161 cbradney 298
        }*/
2160 cbradney 299
}
300
 
301
void ScribusQApp::changeGUILanguage(QString newGUILang)
302
{
303
        QStringList newLangs;
304
        if (newGUILang=="")
305
                newLangs.append("en");
306
        else
307
                newLangs.append(newGUILang);
308
        installTranslators(newLangs);
309
}
2245 cbradney 310
 
311
 
312
/*!
313
\fn void showUsage()
314
\author Franz Schmid
315
\author Alessandro Rimoldi
316
\date Mon Feb  9 14:07:46 CET 2004
317
\brief If no argument specified the lang, returns the one in the locales
318
\param lang QString a two letter string describing the lang environement
319
\retval QString A string describing the language environement
320
*/
321
 
322
void ScribusQApp::showUsage()
323
{
324
        std::cout << QObject::tr("Usage: scribus [option ... ] [file]") << std::endl;
325
        std::cout << QObject::tr("Options:") << std::endl;
326
        std::cout << "  " << ARG_HELP_SHORT      << ",  " << ARG_HELP      << "             " << QObject::tr("Print help (this message) and exit")     << std::endl;
327
        std::cout << "  " << ARG_LANG_SHORT      << ",  " << ARG_LANG      << "             " << QObject::tr("Uses xx as shortcut for a language")     << std::endl;
2295 cbradney 328
        std::cout << "  " << ARG_AVAILLANG_SHORT << ", "  << ARG_AVAILLANG << "  "            << QObject::tr("List the currently installed interface languages") << std::endl;
329
        std::cout << "  " << ARG_FONTINFO_SHORT  << ", "  << ARG_FONTINFO  << "        "      << QObject::tr("Show information on the console when fonts are being loaded") << std::endl;
2245 cbradney 330
        std::cout << "  " << ARG_NOSPLASH_SHORT  << ", "  << ARG_NOSPLASH  << "        "      << QObject::tr("Do not show the splashscreen on startup")     << std::endl;
331
        std::cout << "  " << ARG_VERSION_SHORT   << ",  " << ARG_VERSION   << "          "    << QObject::tr("Output version information and exit")       << std::endl;
332
/*
333
        std::cout << "-file|-- name Open file 'name'" << std::endl;
334
        std::cout << "name          Open file 'name', the file name must not begin with '-'" << std::endl;
335
        std::cout << "QT specific options as -display ..." << std::endl;
336
*/
337
        std::cout << std::endl;
338
}
339
 
340
/*!
341
\fn void showAvailLangs()
342
\author Craig Bradney
343
\date Wed Nov 18 2004
344
\brief Instantiates the Language Manager and prints installed languages with brief instructions around
345
\param None
346
\retval None
347
*/
348
 
349
void ScribusQApp::showAvailLangs()
350
{
351
        std::cout << QObject::tr("Installed interface languages for Scribus are as follows:") << std::endl;
352
        std::cout << std::endl;
353
 
354
        LanguageManager langMgr;
355
        langMgr.init();
356
        langMgr.printInstalledList();
357
 
358
        std::cout << std::endl;
359
        std::cout << QObject::tr("To override the default language choice:") << std::endl;
360
        std::cout << QObject::tr("scribus -l xx or scribus --lang xx, where xx is the language of choice.") << std::endl;
361
}
362
 
363
void ScribusQApp::showVersion()
364
{
365
        std::cout << QObject::tr("Scribus Version ") << VERSION << std::endl;
366
}
367
 
368
void ScribusQApp::showHeader()
369
{
370
        std::cout << std::endl;
371
        std::cout << QObject::tr("Scribus, Open Source Desktop Publishing") << std::endl;
372
        std::cout << QObject::tr("---------------------------------------") << std::endl;
373
        std::cout << QObject::tr("Homepage:       http://www.scribus.net ") << std::endl;
374
        std::cout << QObject::tr("Documentation:  http://docs.scribus.net") << std::endl;
375
        std::cout << QObject::tr("Issues:         http://bugs.scribus.net") << std::endl;
376
        std::cout << std::endl;
377
}
378
 
379
const bool ScribusQApp::usingGUI()
380
{
381
        return useGUI;
382
}
2536 cbradney 383