Subversion Repositories Scribus

Rev

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