You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kmymoney/kmymoney2/main.cpp

316 lines
11 KiB

/***************************************************************************
main.cpp
-------------------
copyright : (C) 2001 by Michael Edwardes
email : mte@users.sourceforge.net
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <stdio.h>
// ----------------------------------------------------------------------------
// QT Includes
#include <tqwidgetlist.h>
#include <tqdatetime.h>
#include <tqstringlist.h>
#include <tqeventloop.h>
// ----------------------------------------------------------------------------
// KDE Includes
#include <kcmdlineargs.h>
#include <kaboutdata.h>
#include <klocale.h>
#include <ktip.h>
#include <dcopclient.h>
#include <kmessagebox.h>
// ----------------------------------------------------------------------------
// Project Includes
#include "mymoney/mymoneyfile.h"
#include "kmymoney2.h"
#include "kstartuplogo.h"
#include "kmymoneyutils.h"
#include "kmymoneyglobalsettings.h"
static const char *description =
I18N_NOOP("\nKMyMoney, the Personal Finance Manager for KDE.\n\nPlease consider contributing to this project with code and/or suggestions.");
static KCmdLineOptions options[] =
{
{ "lang <lang-code>", I18N_NOOP("language to be used"), 0 },
{ "n", I18N_NOOP("don't open last used file"), 0},
{ "timers", I18N_NOOP("enable performance timers"), 0},
#if KMM_DEBUG
// The following options are only available when compiled in debug mode
{ "trace", I18N_NOOP("turn on program traces"), 0},
{ "dump-actions", I18N_NOOP("dump the names of all defined KAction objects to stdout and quit"), 0},
#endif
// INSERT YOUR COMMANDLINE OPTIONS HERE
{ "+[File]", I18N_NOOP("file to open"), 0 },
KCmdLineLastOption
};
TQTime timer;
bool timersOn = false;
KMyMoney2App* kmymoney2;
static KCmdLineArgs* args = 0;
static void _cleanup(void)
{
#ifdef _CHECK_MEMORY
chkmem.CheckMemoryLeak( false );
_CheckMemory_End();
#endif
}
int main(int argc, char *argv[])
{
timer.start();
TQString feature;
#ifdef _CHECK_MEMORY
feature += "\t- " I18N_NOOP("Memory leakage detection") "\n";
#endif
if(!feature.isEmpty())
feature = I18N_NOOP("Compiled with the following settings:\n") + feature;
KAboutData aboutData( "kmymoney2", I18N_NOOP("KMyMoney"),
VERSION, description, KAboutData::License_GPL,
"(c) 2000-2009 The KMyMoney development team", feature,
"http://kmymoney2.sourceforge.net/",
"kmymoney2-developer@lists.sourceforge.net");
aboutData.addAuthor("Michael Edwardes.", I18N_NOOP("Initial idea, much initial source code, Project admin"), "mte@users.sourceforge.net");
aboutData.addAuthor("Thomas Baumgart", I18N_NOOP("Core engine, Release Manager, Project admin"), "ipwizard@users.sourceforge.net");
aboutData.addAuthor("Ace Jones", I18N_NOOP("Reporting logic, OFX Import"), "acejones@users.sourceforge.net");
aboutData.addAuthor("Tony Bloomfield", I18N_NOOP("Database backend, maintainer stable branch"), "tonybloom@users.sourceforge.net");
aboutData.addAuthor("Alvaro Soliverez", I18N_NOOP("Forecast, Reports"), "asoliverez@gmail.com");
aboutData.addAuthor("Felix Rodriguez", I18N_NOOP("Project Admin"), "frodriguez@users.sourceforge.net");
aboutData.addAuthor("John C", I18N_NOOP("Developer"), "tacoturtle@users.sourceforge.net");
aboutData.addAuthor("Fernando Vilas", I18N_NOOP("Database backend"), "fvilas@iname.com");
aboutData.addCredit("Kevin Tambascio", I18N_NOOP("Initial investment support"), "ktambascio@users.sourceforge.net");
aboutData.addCredit("Javier Campos Morales", I18N_NOOP("Developer & Artist"), "javi_c@users.sourceforge.net");
aboutData.addCredit("Robert Wadley", I18N_NOOP("Icons & splash screen"), "rob@robntina.fastmail.us");
aboutData.addCredit("Laurent Montel", I18N_NOOP("Patches"), "montel@kde.org");
aboutData.addCredit("Wolfgang Rohdewald", I18N_NOOP("Patches"), "woro@users.sourceforge.net");
KCmdLineArgs::init( argc, argv, &aboutData );
KCmdLineArgs::addCmdLineOptions( options ); // Add our own options.
// create the singletons before we start memory checking
// to avoid false error reports
MyMoneyFile::instance();
#ifdef _CHECK_MEMORY
_CheckMemory_Init(0);
#endif
atexit(_cleanup);
KMyMoneyUtils::checkConstants();
KApplication* a = new KApplication();
if(KGlobal::locale()->monetaryDecimalSymbol().isEmpty()) {
KMessageBox::error(0, i18n("The monetary decimal symbol is not correctly set in the KDE Control Center's Country/Region & Language settings. Please set it to a reasonable value and start KMyMoney again."), i18n("Invalid settings"));
delete a;
exit(1);
}
// show startup logo
KStartupLogo* splash = new KStartupLogo();
a->processEvents();
args = KCmdLineArgs::parsedArgs();
// setup the MyMoneyMoney locale settings according to the KDE settings
MyMoneyMoney::setThousandSeparator(*(KGlobal::locale()->monetaryThousandsSeparator().latin1()));
MyMoneyMoney::setDecimalSeparator(*(KGlobal::locale()->monetaryDecimalSymbol().latin1()));
MyMoneyMoney::setNegativeMonetarySignPosition(static_cast<MyMoneyMoney::signPosition>(KGlobal::locale()->negativeMonetarySignPosition()));
MyMoneyMoney::setPositiveMonetarySignPosition(static_cast<MyMoneyMoney::signPosition>(KGlobal::locale()->positiveMonetarySignPosition()));
MyMoneyMoney::setNegativePrefixCurrencySymbol(KGlobal::locale()->negativePrefixCurrencySymbol());
MyMoneyMoney::setPositivePrefixCurrencySymbol(KGlobal::locale()->positivePrefixCurrencySymbol());
TQCString language = args->getOption("lang");
if(!language.isEmpty()) {
if(!KGlobal::locale()->setLanguage(language)) {
qWarning("Unable to select language '%s'. This has one of two reasons:\n\ta) the standard KDE message catalogue is not installed\n\tb) the KMyMoney message catalogue is not installed", language.data());
}
}
#if KMM_DEBUG
if(args->isSet("trace"))
MyMoneyTracer::on();
timersOn = args->isSet("timers");
#endif
kmymoney2 = 0;
kmymoney2 = new KMyMoney2App();
a->setMainWidget( kmymoney2 );
#if KMM_DEBUG
if(args->isSet("dump-actions")) {
kmymoney2->dumpActions();
// Before we delete the application, we make sure that we destroy all
// widgets by running the event loop for some time to catch all those
// widgets that are requested to be destroyed using the deleteLater() method.
TQApplication::eventLoop()->processEvents(TQEventLoop::ExcludeUserInput, 10);
delete kmymoney2;
delete splash;
delete a;
exit(0);
}
#endif
int rc = 0;
try {
do {
// connect to DCOP server
DCOPClient* client = a->dcopClient();
if(client->registerAs("kmymoney", true) != false) {
const QCStringList instances = kmymoney2->instanceList();
if(instances.count() > 0) {
// If the user launches a second copy of the app and includes a file to
// open, they are probably attempting a "WebConnect" session. In this case,
// we'll check to make sure it's an importable file that's passed in, and if so, we'll
// notify the primary instance of the file and kill ourselves.
if(args->count() > 0) {
KURL url = args->url(0);
if ( kmymoney2->isImportableFile( url.path() ) )
{
// if there are multiple instances, we'll send this to the first one
TQCString primary = instances[0];
// send a message to the primary client to import this file
TQByteArray data;
TQDataStream arg(data, IO_WriteOnly);
arg << url.path();
arg << kapp->startupId();
if (!client->send(primary, "kmymoney2app", "webConnect(TQString,TQCString)",data))
qDebug("Unable to launch WebConnect via DCOP.");
// Before we delete the application, we make sure that we destroy all
// widgets by running the event loop for some time to catch all those
// widgets that are requested to be destroyed using the deleteLater() method.
TQApplication::eventLoop()->processEvents(TQEventLoop::ExcludeUserInput, 10);
delete kmymoney2;
delete splash;
break;
}
}
if(KMessageBox::questionYesNo(0, i18n("Another instance of KMyMoney is already running. Do you want to quit?")) == KMessageBox::Yes) {
rc = 1;
delete kmymoney2;
delete splash;
break;
}
}
} else {
qDebug("DCOP registration failed. Some functions are not available.");
}
kmymoney2->show();
kmymoney2->setEnabled(false);
delete splash;
// force complete paint of widgets
tqApp->processEvents();
TQString importfile;
KURL url;
// make sure, we take the file provided on the command
// line before we go and open the last one used
if(args->count() > 0) {
url = args->url(0);
// Check to see if this is an importable file, as opposed to a loadable
// file. If it is importable, what we really want to do is load the
// last used file anyway and then immediately import this file. This
// implements a "web connect" session where there is not already an
// instance of the program running.
if ( kmymoney2->isImportableFile( url.path() ) )
{
importfile = url.path();
url = kmymoney2->readLastUsedFile();
}
} else {
url = kmymoney2->readLastUsedFile();
}
KTipDialog::showTip(kmymoney2, "", false);
if(url.isValid() && !args->isSet("n")) {
kmymoney2->slotFileOpenRecent(url);
} else if(KMyMoneyGlobalSettings::firstTimeRun()) {
kmymoney2->slotFileNew();
}
KMyMoneyGlobalSettings::setFirstTimeRun(false);
if ( ! importfile.isEmpty() )
kmymoney2->webConnect( importfile, kapp->startupId() );
if(kmymoney2 != 0) {
kmymoney2->updateCaption();
args->clear();
kmymoney2->setEnabled(true);
rc = a->exec();
}
} while(0);
} catch(MyMoneyException *e) {
KMessageBox::detailedError(0, i18n("Uncaught error. Please report the details to the developers"),
TQString("%1 in file %2 line %3").arg(e->what()).arg(e->file()).arg(e->line()));
throw e;
}
delete a;
return rc;
}
void timestamp(char *txt)
{
if(timersOn)
{
qDebug("Time(%s): %d", txt, timer.elapsed());
}
}
void timetrace(const char *txt)
{
if(timersOn)
{
qDebug("Timer(%s): %d elapsed", txt, timer.elapsed());
timer.restart();
}
}
// vim:cin:si:ai:et:ts=2:sw=2: