Subversion Repositories Scribus

Rev

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