main.cpp
author insilmaril
Mon, 14 Jun 2010 13:59:17 +0000
changeset 848 e265f07f2173
parent 847 43268373032d
permissions -rw-r--r--
Fixed tmp relink, colored headings in TreeView
insilmaril@366
     1
#include <QApplication>
insilmaril@781
     2
#include <QtDBus/QDBusConnection>
insilmaril@0
     3
insilmaril@721
     4
#include <iostream>
insilmaril@721
     5
using namespace std;
insilmaril@721
     6
insilmaril@829
     7
#include "findwidget.h"
insilmaril@829
     8
#include "findresultwidget.h"
insilmaril@767
     9
#include "flagrow.h"
insilmaril@404
    10
#include "flagrowobj.h"
insilmaril@404
    11
#include "mainwindow.h"
insilmaril@404
    12
#include "options.h"
insilmaril@0
    13
#include "settings.h"
insilmaril@404
    14
#include "version.h"
insilmaril@0
    15
insilmaril@625
    16
#if defined(Q_OS_WIN32)
insilmaril@625
    17
#define WIN32_LEAN_AND_MEAN
insilmaril@625
    18
#include <windows.h>
insilmaril@625
    19
#endif
insilmaril@625
    20
insilmaril@804
    21
#include <sys/types.h>			// To retrieve PID for use in DBUS
insilmaril@804
    22
#include <unistd.h>
insilmaril@804
    23
insilmaril@0
    24
// Global variables
insilmaril@0
    25
TextEditor *textEditor;			// used in Constr. of LinkableMapObj
insilmaril@0
    26
								// initialized in mainwindow
insilmaril@406
    27
QString vymName;
insilmaril@406
    28
QString vymVersion;
insilmaril@406
    29
QString vymBuildDate;
insilmaril@473
    30
QString vymCodeName;
insilmaril@806
    31
QString vymInstanceName;
insilmaril@0
    32
insilmaril@0
    33
Main *mainWindow;				// used in BranchObj::select()								
insilmaril@829
    34
FindWidget *findWidget;
insilmaril@829
    35
FindResultWidget *findResultWidget;
insilmaril@804
    36
insilmaril@781
    37
QDBusConnection dbusConnection= QDBusConnection::sessionBus();
insilmaril@781
    38
insilmaril@164
    39
QString tmpVymDir;				// All temp files go there, created in mainwindow
insilmaril@166
    40
QString clipboardDir;			// Clipboard used in all mapEditors
insilmaril@491
    41
QString clipboardFile;			// Clipboard used in all mapEditors
insilmaril@215
    42
QDir vymBaseDir;				// Containing all styles, scripts, images, ...
insilmaril@366
    43
QDir lastImageDir;
insilmaril@366
    44
QDir lastFileDir;
insilmaril@625
    45
#if defined(Q_OS_WIN32)
insilmaril@625
    46
QDir vymInstallDir;
insilmaril@625
    47
#endif
insilmaril@269
    48
QString iconPath;				// Pointing to icons used for toolbars
insilmaril@269
    49
QString flagsPath;				// Pointing to flags
insilmaril@166
    50
bool clipboardEmpty;			
insilmaril@473
    51
bool debug;						// global debugging flag
insilmaril@767
    52
FlagRow *systemFlagsMaster;	
insilmaril@767
    53
FlagRow *standardFlagsMaster;	
insilmaril@366
    54
insilmaril@366
    55
Settings settings ("InSilmaril","vym"); // Organization, Application name
insilmaril@366
    56
insilmaril@0
    57
Options options;
insilmaril@366
    58
ImageIO imageIO;
insilmaril@0
    59
insilmaril@0
    60
int statusbarTime=3500;
insilmaril@0
    61
insilmaril@394
    62
int main(int argc, char* argv[])
insilmaril@0
    63
{
insilmaril@394
    64
	//Q_INIT_RESOURCE (application);
insilmaril@366
    65
insilmaril@0
    66
    QApplication app(argc,argv);
insilmaril@0
    67
insilmaril@406
    68
	vymName=__VYM_NAME;
insilmaril@406
    69
	vymVersion=__VYM_VERSION;
insilmaril@406
    70
	vymBuildDate=__VYM_BUILD_DATE;
insilmaril@473
    71
	vymCodeName=__VYM_CODENAME;
insilmaril@406
    72
insilmaril@0
    73
	// Reading and initializing options commandline options
insilmaril@473
    74
	options.add ("debug", Option::Switch, "d", "debug");
insilmaril@842
    75
	options.add ("help", Option::Switch, "h", "help");
insilmaril@473
    76
	options.add ("local", Option::Switch, "l", "local");
insilmaril@807
    77
	options.add ("name", Option::String, "n", "name");
insilmaril@473
    78
	options.add ("quit", Option::Switch, "q", "quit");
insilmaril@473
    79
	options.add ("run", Option::String, "r", "run");
insilmaril@842
    80
	options.add ("shortcuts", Option::Switch, "s", "shortcuts");
insilmaril@842
    81
	options.add ("shortcutsLaTeX", Option::Switch, "sl", "shortcutsLaTeX");
insilmaril@842
    82
	options.add ("version", Option::Switch, "v","version");
insilmaril@0
    83
	options.setHelpText (
insilmaril@0
    84
		"VYM - View Your Mind\n"
insilmaril@0
    85
		"--------------------\n\n"
insilmaril@0
    86
		"Information about vym can be found in vym.pdf,\n"
insilmaril@0
    87
		"which should be part of the vym package.\n"
insilmaril@0
    88
		"It is also available at the project homepage:\n\n"
insilmaril@847
    89
		"http://www.InSilmaril.de/vym\n\n"
insilmaril@847
    90
		"Usage: vym [OPTION]... [FILE]... \n"
insilmaril@847
    91
		"Open FILEs with vym\n\n"
insilmaril@847
    92
		"-d           debug       Show debugging output\n"
insilmaril@847
    93
		"-h           help        Show this help text\n"
insilmaril@847
    94
		"-l           local       Run with ressources in current directory\n"
insilmaril@847
    95
		"-n  STRING   name        Set name of instance for DBus access\n"
insilmaril@847
    96
		"-q           quit        Quit immediatly after start for benchmarking\n"
insilmaril@847
    97
		"-r  FILE     run         Run script\n"
insilmaril@847
    98
		"-s           shortcuts   Show Keyboard shortcuts on start\n"
insilmaril@847
    99
		"-sl          LaTeX       Show Keyboard shortcuts in LaTeX format on start\n"
insilmaril@847
   100
		"-v           version     Show vym version\n"
insilmaril@847
   101
	);
insilmaril@0
   102
	if (options.parse())
insilmaril@0
   103
	{
insilmaril@657
   104
		cout << endl << qPrintable( options.getHelpText())<<endl;
insilmaril@0
   105
		return 1;
insilmaril@0
   106
	}
insilmaril@0
   107
insilmaril@473
   108
	debug=options.isOn ("debug");
insilmaril@473
   109
insilmaril@0
   110
	if (options.isOn ("version"))
insilmaril@0
   111
	{
insilmaril@847
   112
		cout << "VYM - View Your Mind (c) 2004-2010 Uwe Drechsel "  << endl
insilmaril@550
   113
			<<"   Version: "<<__VYM_VERSION <<endl
insilmaril@550
   114
			<<"Build date: "<<__VYM_BUILD_DATE << endl
insilmaril@473
   115
			<<"  "<<__VYM_CODENAME<<endl;
insilmaril@0
   116
			
insilmaril@0
   117
		return 0;	
insilmaril@0
   118
	}		
insilmaril@0
   119
	
insilmaril@804
   120
	// Register for DBUS
insilmaril@804
   121
	if (debug) cout << "PID="<<getpid()<<endl;
insilmaril@806
   122
	QString pidString=QString ("%1").arg(getpid());
insilmaril@807
   123
	if (!dbusConnection.registerService ("org.insilmaril.vym-"+pidString))
insilmaril@807
   124
	{
insilmaril@807
   125
	   fprintf(stderr, "%s\n",
insilmaril@807
   126
			qPrintable(QDBusConnection::sessionBus().lastError().message()));        
insilmaril@807
   127
        exit(1);
insilmaril@807
   128
	}	
insilmaril@807
   129
insilmaril@806
   130
	if (options.isOn ("name"))
insilmaril@806
   131
		vymInstanceName=options.getArg ("name");
insilmaril@806
   132
	else
insilmaril@806
   133
		vymInstanceName=pidString;
insilmaril@806
   134
	
insilmaril@804
   135
insilmaril@243
   136
	// Use /usr/share/vym or /usr/local/share/vym or . ?
insilmaril@269
   137
	// First try options
insilmaril@243
   138
	if (options.isOn ("local"))
insilmaril@243
   139
	{
insilmaril@243
   140
		vymBaseDir.setPath (vymBaseDir.currentDirPath());
insilmaril@269
   141
	} else
insilmaril@269
   142
	// then look for environment variable
insilmaril@269
   143
	if (getenv("VYMHOME")!=0)
insilmaril@269
   144
	{
insilmaril@269
   145
		vymBaseDir.setPath (getenv("VYMHOME"));
insilmaril@269
   146
	} else
insilmaril@269
   147
	// ok, let's find my way on my own
insilmaril@243
   148
	{
insilmaril@390
   149
		#if defined (Q_OS_MACX)
insilmaril@394
   150
			vymBaseDir.setPath(vymBaseDir.currentDirPath() +"/vym.app/Contents/Resources");
insilmaril@390
   151
insilmaril@625
   152
        #elif defined (Q_OS_WIN32)
insilmaril@625
   153
            QString basePath;
insilmaril@625
   154
insilmaril@625
   155
            wchar_t wbuf[512];
insilmaril@625
   156
            if (GetModuleFileName(NULL, wbuf, 512))
insilmaril@625
   157
            {
insilmaril@625
   158
                QString mfn(QString::fromWCharArray(wbuf));
insilmaril@625
   159
                mfn.replace('\\', '/');
insilmaril@625
   160
                if (mfn.endsWith("/bin/vym.exe", Qt::CaseInsensitive))
insilmaril@625
   161
                {
insilmaril@625
   162
                    mfn.chop(12);
insilmaril@625
   163
                    basePath = mfn;
insilmaril@625
   164
                }
insilmaril@625
   165
            }
insilmaril@625
   166
insilmaril@625
   167
            if (basePath.isEmpty())
insilmaril@625
   168
                basePath = vymBaseDir.currentDirPath();
insilmaril@625
   169
insilmaril@625
   170
            vymInstallDir.setPath(basePath);
insilmaril@625
   171
            vymBaseDir.setPath(basePath + "/share/vym");
insilmaril@625
   172
insilmaril@390
   173
		#else
insilmaril@390
   174
			vymBaseDir.setPath ("/usr/share/vym");
insilmaril@308
   175
			if (!vymBaseDir.exists())
insilmaril@390
   176
			{
insilmaril@390
   177
				vymBaseDir.setPath ("/usr/local/share/vym");
insilmaril@390
   178
				if (!vymBaseDir.exists())
insilmaril@390
   179
					vymBaseDir.setPath(vymBaseDir.currentDirPath() );
insilmaril@390
   180
			}		
insilmaril@390
   181
		#endif
insilmaril@243
   182
	}
insilmaril@243
   183
insilmaril@269
   184
	iconPath=vymBaseDir.path()+"/icons/";
insilmaril@269
   185
	flagsPath=vymBaseDir.path()+"/flags/";
insilmaril@269
   186
insilmaril@366
   187
	// Some directories
insilmaril@366
   188
	lastImageDir=QDir().current();
insilmaril@366
   189
	lastFileDir=QDir().current();
insilmaril@366
   190
insilmaril@0
   191
	if (options.isOn ("help"))
insilmaril@0
   192
	{
insilmaril@657
   193
		cout << qPrintable (options.getHelpText())<<endl;
insilmaril@0
   194
		return 0;	
insilmaril@0
   195
	}	
insilmaril@0
   196
insilmaril@243
   197
	// Initialize translations
insilmaril@243
   198
	QTranslator translator (0);
insilmaril@243
   199
	translator.load( QString("vym_")+QTextCodec::locale(), vymBaseDir.path() + "/lang");
insilmaril@243
   200
    app.installTranslator( &translator );
insilmaril@243
   201
insilmaril@767
   202
	// Initializing the master rows of flags
insilmaril@767
   203
	systemFlagsMaster=new FlagRow;
insilmaril@767
   204
	systemFlagsMaster->setName ("systemFlagsMaster");
insilmaril@767
   205
	standardFlagsMaster=new FlagRow;
insilmaril@767
   206
	standardFlagsMaster->setName ("standardFlagsMaster");
insilmaril@767
   207
insilmaril@243
   208
insilmaril@0
   209
	// Initialize window of TextEditor
insilmaril@0
   210
	textEditor = new TextEditor();
insilmaril@269
   211
	textEditor->setIcon (QPixmap (iconPath+"vym-editor.png"));
insilmaril@0
   212
insilmaril@166
   213
	// Initialize mainwindow 
insilmaril@625
   214
#if defined(Q_OS_WIN32)
insilmaril@625
   215
    Main m(0, 0, (Qt::Window | Qt::MSWindowsOwnDC));
insilmaril@625
   216
#else
insilmaril@0
   217
    Main m;
insilmaril@625
   218
#endif
insilmaril@625
   219
insilmaril@0
   220
	//m.resize(m.sizeHint());
insilmaril@824
   221
	m.setIcon (QPixmap (iconPath+"vym.png"));
insilmaril@0
   222
	m.show();
insilmaril@0
   223
	m.fileNew();
insilmaril@742
   224
	// Paint Mainwindow first time
insilmaril@742
   225
	qApp->processEvents();
insilmaril@742
   226
insilmaril@0
   227
	m.loadCmdLine();
insilmaril@0
   228
insilmaril@434
   229
	// Run script
insilmaril@434
   230
	if (options.isOn ("run"))
insilmaril@434
   231
	{
insilmaril@434
   232
		QString script;
insilmaril@434
   233
		QString fn=options.getArg ("run");
insilmaril@434
   234
		if ( !fn.isEmpty() )
insilmaril@434
   235
		{
insilmaril@434
   236
			QFile f( fn );
insilmaril@434
   237
			if ( !f.open( QIODevice::ReadOnly ) )
insilmaril@434
   238
			{
insilmaril@434
   239
				QMessageBox::warning(0, 
insilmaril@434
   240
					QObject::tr("Error"),
insilmaril@434
   241
					QObject::tr("Couldn't open %1.\n").arg(fn));
insilmaril@434
   242
				return 0;
insilmaril@434
   243
			}	
insilmaril@434
   244
insilmaril@434
   245
			QTextStream ts( &f );
insilmaril@434
   246
			script= ts.read();
insilmaril@434
   247
			f.close();
insilmaril@434
   248
			m.setScript (script);
insilmaril@514
   249
			m.runScriptEverywhere (script);
insilmaril@434
   250
		}
insilmaril@434
   251
	}		
insilmaril@434
   252
	
insilmaril@434
   253
	// For benchmarking we may want to quit instead of entering event loop
insilmaril@0
   254
	if (options.isOn ("quit"))
insilmaril@0
   255
	{
insilmaril@0
   256
		return 0;
insilmaril@0
   257
	}	
insilmaril@0
   258
insilmaril@785
   259
	// Enable some last minute cleanup
insilmaril@0
   260
    QObject::connect( &app, SIGNAL(lastWindowClosed()), &app, SLOT(quit()) );
insilmaril@0
   261
insilmaril@0
   262
    return app.exec();
insilmaril@0
   263
}