Subversion Repositories Scribus

Rev

Rev 2536 | Rev 2833 | 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()));
2617 craig 172
 
2245 cbradney 173
                scribus->show();
174
                scribus->ShowSubs();
2617 craig 175
 
2245 cbradney 176
                if (file != "")
177
                        scribus->loadDoc(file);
2617 craig 178
 
179
                // A hook for plug-ins and scripts to trigger on. Some plugins and scripts
180
                // require the app to be fully set up (in particular, the main window to be
181
                // built and shown) before running their setup.
182
                emit appStarted();
2245 cbradney 183
        }
184
        return EXIT_SUCCESS;
2160 cbradney 185
}
186
 
187
/*!
188
\fn void getLang(QString lang)
189
\author Franz Schmid
190
\author Alessandro Rimoldi
191
\date Mon Feb  9 14:07:46 CET 2004
192
\brief If the lang argument is empty, returns the value in the locales
193
 
194
The lang is always a two character code, except for "en_GB" where
195
the whole string is returned. For all the other locales starting
196
with "en", no locale is returned.
197
 
198
(Inspired from Klocale.cpp)
199
 
200
\param lang QString a two letter string describing the lang environement
201
\retval QString A string describing the language environement
202
*/
203
 
204
QStringList ScribusQApp::getLang(QString lang)
205
{
206
        QStringList langs;
207
 
208
        // read the locales
209
        if (lang != "")
210
                langs.push_back(lang);
211
 
212
        //add in user preferences lang, only overridden by lang command line option
213
        QString Pff = QDir::convertSeparators(QDir::homeDirPath()+"/.scribus");
214
        QFileInfo Pffi = QFileInfo(Pff);
215
        if (Pffi.exists())
216
        {
217
                QString PrefsPfad;
218
                if (Pffi.isDir())
219
                        PrefsPfad = Pff;
220
                else
221
                        PrefsPfad = QDir::homeDirPath();
222
                QString prefsXMLFile=QDir::convertSeparators(PrefsPfad + "/prefs13.xml");
223
                QFileInfo infoPrefsFile(prefsXMLFile);
224
                if (infoPrefsFile.exists())
225
                {
226
                        PrefsFile* prefsFile = new PrefsFile(prefsXMLFile);
227
                        if (prefsFile) {
228
                                PrefsContext* userprefsContext = prefsFile->getContext("user_preferences");
229
                                if (userprefsContext) {
230
                                        QString prefslang = userprefsContext->get("gui_language","");
231
                                        if (prefslang!="")
232
                                                langs.push_back(prefslang);
233
                                }
234
                        }
235
                }
236
        }
237
 
238
        if ((lang = ::getenv("LC_ALL")) != "")
239
                langs.push_back(lang);
240
        if ((lang = ::getenv("LC_MESSAGES")) != "")
241
                langs.push_back(lang);
242
        if ((lang = ::getenv("LANG")) != "")
243
                langs.push_back(lang);
244
 
245
        langs.push_back(QString(QTextCodec::locale()));
246
 
247
        // remove duplicate entries...
248
        for (QStringList::Iterator it = langs.fromLast(); it != langs.begin(); --it)
249
                if (langs.contains(*it) > 1)
250
                        it = langs.remove(it);
251
 
252
        return langs;
253
}
254
 
255
 
256
/*!
257
\fn void installTranslators(QApplication *app, QStringList langs)
258
\author Franz Schmid
259
\author Alessandro Rimoldi
260
\date Mon Feb  9 14:07:46 CET 2004
261
\brief Loads the translations for Scribus and for the Plugins
262
\param app QApplication pointer to the application object
263
\param lang QString a two letter string describing the lang environement
264
\retval void
265
*/
266
void ScribusQApp::installTranslators(QStringList langs)
267
{
268
        QString lang = "";
2161 cbradney 269
        static QTranslator *trans = 0;
270
 
271
        if ( trans )
272
        {
273
                removeTranslator( trans );
274
                delete trans;
275
        }
276
        trans = new QTranslator(0);
2160 cbradney 277
        QString path = ScPaths::instance().libDir();
278
        path += "scribus";
279
 
280
        bool loaded = false;
281
        for (QStringList::Iterator it = langs.begin(); it != langs.end() && !loaded; ++it) {
282
                lang=(*it).left(5);
283
                if (lang == "en")
284
                        break;
285
                else if (loaded = trans->load(QString(path + '.' + lang), "."))
286
                        loaded = true;
287
        }
288
 
289
        if (loaded)
290
                installTranslator(trans);
2161 cbradney 291
        /* CB TODO, currently disabled, because its broken broken broken
2160 cbradney 292
        path = ScPaths::instance().pluginDir();
293
        QDir dir(path , "*.*", QDir::Name, QDir::Files | QDir::NoSymLinks);
294
        if (dir.exists() && (dir.count() != 0)) {
295
                for (uint i = 0; i < dir.count(); ++i) {
296
                        QFileInfo file(path + dir[i]);
297
                        if ((file.extension(false).lower() == "qm")
298
                        && (file.extension(true).lower().left(5) == lang)) {
299
                                trans = new QTranslator(0);
300
                                trans->load(QString(path + dir[i]), ".");
301
                                installTranslator(trans);
302
                        }
303
                }
2161 cbradney 304
        }*/
2160 cbradney 305
}
306
 
307
void ScribusQApp::changeGUILanguage(QString newGUILang)
308
{
309
        QStringList newLangs;
310
        if (newGUILang=="")
311
                newLangs.append("en");
312
        else
313
                newLangs.append(newGUILang);
314
        installTranslators(newLangs);
315
}
2245 cbradney 316
 
317
 
318
/*!
319
\fn void showUsage()
320
\author Franz Schmid
321
\author Alessandro Rimoldi
322
\date Mon Feb  9 14:07:46 CET 2004
323
\brief If no argument specified the lang, returns the one in the locales
324
\param lang QString a two letter string describing the lang environement
325
\retval QString A string describing the language environement
326
*/
327
 
328
void ScribusQApp::showUsage()
329
{
330
        std::cout << QObject::tr("Usage: scribus [option ... ] [file]") << std::endl;
331
        std::cout << QObject::tr("Options:") << std::endl;
332
        std::cout << "  " << ARG_HELP_SHORT      << ",  " << ARG_HELP      << "             " << QObject::tr("Print help (this message) and exit")     << std::endl;
333
        std::cout << "  " << ARG_LANG_SHORT      << ",  " << ARG_LANG      << "             " << QObject::tr("Uses xx as shortcut for a language")     << std::endl;
2295 cbradney 334
        std::cout << "  " << ARG_AVAILLANG_SHORT << ", "  << ARG_AVAILLANG << "  "            << QObject::tr("List the currently installed interface languages") << std::endl;
335
        std::cout << "  " << ARG_FONTINFO_SHORT  << ", "  << ARG_FONTINFO  << "        "      << QObject::tr("Show information on the console when fonts are being loaded") << std::endl;
2245 cbradney 336
        std::cout << "  " << ARG_NOSPLASH_SHORT  << ", "  << ARG_NOSPLASH  << "        "      << QObject::tr("Do not show the splashscreen on startup")     << std::endl;
337
        std::cout << "  " << ARG_VERSION_SHORT   << ",  " << ARG_VERSION   << "          "    << QObject::tr("Output version information and exit")       << std::endl;
338
/*
339
        std::cout << "-file|-- name Open file 'name'" << std::endl;
340
        std::cout << "name          Open file 'name', the file name must not begin with '-'" << std::endl;
341
        std::cout << "QT specific options as -display ..." << std::endl;
342
*/
343
        std::cout << std::endl;
344
}
345
 
346
/*!
347
\fn void showAvailLangs()
348
\author Craig Bradney
349
\date Wed Nov 18 2004
350
\brief Instantiates the Language Manager and prints installed languages with brief instructions around
351
\param None
352
\retval None
353
*/
354
 
355
void ScribusQApp::showAvailLangs()
356
{
357
        std::cout << QObject::tr("Installed interface languages for Scribus are as follows:") << std::endl;
358
        std::cout << std::endl;
359
 
360
        LanguageManager langMgr;
361
        langMgr.init();
362
        langMgr.printInstalledList();
363
 
364
        std::cout << std::endl;
365
        std::cout << QObject::tr("To override the default language choice:") << std::endl;
366
        std::cout << QObject::tr("scribus -l xx or scribus --lang xx, where xx is the language of choice.") << std::endl;
367
}
368
 
369
void ScribusQApp::showVersion()
370
{
371
        std::cout << QObject::tr("Scribus Version ") << VERSION << std::endl;
372
}
373
 
374
void ScribusQApp::showHeader()
375
{
376
        std::cout << std::endl;
377
        std::cout << QObject::tr("Scribus, Open Source Desktop Publishing") << std::endl;
378
        std::cout << QObject::tr("---------------------------------------") << std::endl;
379
        std::cout << QObject::tr("Homepage:       http://www.scribus.net ") << std::endl;
380
        std::cout << QObject::tr("Documentation:  http://docs.scribus.net") << std::endl;
381
        std::cout << QObject::tr("Issues:         http://bugs.scribus.net") << std::endl;
382
        std::cout << std::endl;
383
}
384
 
385
const bool ScribusQApp::usingGUI()
386
{
387
        return useGUI;
388
}
2536 cbradney 389