Subversion Repositories Scribus

Rev

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