# HG changeset patch
# User insilmaril
# Date 1236684437 0
# Node ID 1c550f80c43bb9924884b52f4689026290c72580
# Parent  89dd2219982f19465d2529d4673520ed6f443163
Bugfix: Serious bug related to autosave fixed.

diff -r 89dd2219982f -r 1c550f80c43b demos/lifeforms.vym
Binary file demos/lifeforms.vym has changed
diff -r 89dd2219982f -r 1c550f80c43b mainwindow.cpp
--- a/mainwindow.cpp	Thu Mar 05 09:33:30 2009 +0000
+++ b/mainwindow.cpp	Tue Mar 10 11:27:17 2009 +0000
@@ -1,251 +1,267 @@
 #include "mainwindow.h"
 
-#include <qstatusbar.h>
-#include <qmessagebox.h>
-#include <qmenubar.h>
-#include <qapplication.h>
-#include <qpainter.h>
-#include <qprinter.h>
-#include <qfile.h>
-#include <qfiledialog.h>
-#include <qcolor.h>
-#include <qcolordialog.h>
-#include <qbitmap.h>
-#include <qinputdialog.h>
-
+#include <QtGui>
 
 #include <iostream>
-#include <stdlib.h>
 #include <typeinfo>
 
-#include "version.h"
-
-#include "icons/filenew.xpm"
-#include "icons/fileopen.xpm"
-#include "icons/filesave.xpm"
-#include "icons/fileprint.xpm"
-#include "icons/editundo.xpm"
-//#include "icons/editredo.xpm"	// TODO
-#include "icons/editcopy.xpm"
-#include "icons/editcut.xpm"
-#include "icons/editpaste.xpm"
-#include "icons/editmoveup.xpm"
-#include "icons/editmovedown.xpm"
-#include "icons/formatcoloritem.xpm"
-#include "icons/formatcolorbranch.xpm"
-#include "icons/formatcolorpicker.xpm"
-#include "icons/viewzoomreset.xpm"
-#include "icons/viewzoomin.xpm"
-#include "icons/viewzoomout.xpm"
-#include "icons/vym-48x48.xpm"
-#include "icons/flag-note.xpm"
-#include "icons/flag-url.xpm"
-#include "icons/flag-vymlink.xpm"	
-#include "icons/flag-scrolled-right.xpm"
-
+#include "aboutdialog.h"
+#include "branchpropwindow.h"
+#include "exportoofiledialog.h"
+#include "exports.h"
+#include "file.h"
 #include "flagrowobj.h"
-#include "texteditor.h"
+#include "historywindow.h"
+#include "imports.h"
 #include "mapeditor.h"
-#include "exporthtmldialog.h"
-#include "exportxhtmldialog.h"
-#include "showtextdialog.h"
+#include "misc.h"
+#include "options.h"
 #include "process.h"
 #include "settings.h"
-#include "options.h"
+#include "texteditor.h"
+#include "warningdialog.h"
+
+#if defined(Q_OS_WIN32)
+// Define only this structure as opposed to
+// including full 'windows.h'. FindWindow
+// clashes with the one in Win32 API.
+typedef struct _PROCESS_INFORMATION
+{
+  long hProcess;
+  long hThread;
+  long dwProcessId;
+  long dwThreadId;
+} PROCESS_INFORMATION, *LPPROCESS_INFORMATION;
+#endif
 
 extern TextEditor *textEditor;
 extern Main *mainWindow;
+extern QString tmpVymDir;
+extern QString clipboardDir;
+extern QString clipboardFile;
+extern bool clipboardEmpty;
 extern int statusbarTime;
-extern MapEditor *clipboardME;
 extern FlagRowObj* standardFlagsDefault;
-
-extern QAction* actionFileSave;
-extern QAction* actionFilePrint;
-extern QAction* actionEditUndo;
-extern QAction *actionEditCopy;
-extern QAction *actionEditCut;
-extern QAction *actionEditPaste;
-extern QAction *actionEditMoveUp;
-extern QAction *actionEditMoveDown;
-extern QAction *actionEditToggleScroll;
-extern QAction* actionEditOpenURL;
-extern QAction* actionEditURL;
-extern QAction* actionEditHeading2URL;
-extern QAction* actionEditBugzilla2URL;
-extern QAction *actionEditOpenVymLink;
-extern QAction *actionEditVymLink;
-extern QAction *actionEditDeleteVymLink;
-extern QAction *actionEditMapInfo;
-extern QAction *actionEditHeading;
-extern QAction *actionEditDelete;
-extern QAction *actionEditAddBranch;
-extern QAction *actionEditAddBranchAbove;
-extern QAction *actionEditAddBranchBelow;
-extern QAction *actionEditImportAdd;
-extern QAction *actionEditImportReplace;
-extern QAction *actionEditSaveBranch;
-extern QAction *actionEditSelectFirst;
-extern QAction *actionEditSelectLast;
-extern QAction *actionEditLoadImage;
-extern QAction *actionEditToggleFloatExport;
-
-extern QAction* actionFormatColor;
-extern QAction* actionFormatPickColor;
-extern QAction* actionFormatColorBranch;
-extern QAction* actionFormatColorSubtree;
-extern QAction* actionFormatLinkColorHint;
-extern QAction* actionFormatBackColor;
-extern QAction* actionFormatLinkColor;
-
-extern QActionGroup *actionGroupFormatFrameTypes;
-extern QAction *actionFormatFrameNone;
-extern QAction *actionFormatFrameRectangle;
-
-extern QActionGroup *actionGroupFormatLinkStyles;
-extern QAction *actionFormatLinkStyleLine;
-extern QAction *actionFormatLinkStyleParabel;
-extern QAction *actionFormatLinkStylePolyLine;
-extern QAction *actionFormatLinkStylePolyParabel;
-
-extern QAction *actionViewToggleNoteEditor;
-
-extern QAction* actionSettingsAutoedit;
-extern QAction* actionSettingsAutoselectHeading;
-extern QAction* actionSettingsAutoselectHeading;
-extern QAction* actionSettingsAutoselectText;
-extern QAction* actionSettingsPasteNewHeading;
-extern QAction* actionSettingsUseDelKey;
-
-extern QPopupMenu* branchContextMenu;
-extern QPopupMenu* floatimageContextMenu;
-extern QPopupMenu* saveImageFormatMenu;
-extern QPopupMenu* canvasContextMenu;
-extern QPopupMenu* lastMapsMenu;
-extern QPopupMenu* exportMenu;
-extern QPopupMenu* exportImageFormatMenu;
+extern FlagRowObj* systemFlagsDefault;
+extern QString vymName;
+extern QString vymVersion;
+extern QString vymBuildDate;
+extern bool debug;
+
+QMenu* branchContextMenu;
+QMenu* branchAddContextMenu;
+QMenu* branchRemoveContextMenu;
+QMenu* branchLinksContextMenu;
+QMenu* branchXLinksContextMenuEdit;
+QMenu* branchXLinksContextMenuFollow;
+QMenu* floatimageContextMenu;
+QMenu* canvasContextMenu;
+QMenu* fileLastMapsMenu;
+QMenu* fileImportMenu;
+QMenu* fileExportMenu;
 
 
 extern Settings settings;
 extern Options options;
-
-#if defined(Q_OS_LINUX)
-extern void qt_wait_for_window_manager( QWidget* w );
+extern ImageIO imageIO;
+
+extern QDir vymBaseDir;
+extern QDir lastImageDir;
+extern QDir lastFileDir;
+#if defined(Q_OS_WIN32)
+extern QDir vymInstallDir;
 #endif
-
-Main::Main(QWidget* parent, const char* name, WFlags f) :
+extern QString iconPath;
+extern QString flagsPath;
+
+Main::Main(QWidget* parent, const char* name, Qt::WFlags f) :
     QMainWindow(parent,name,f)
 {
 	mainWindow=this;
 
+	setObjectName ("MainWindow");
+
 	setCaption ("VYM - View Your Mind");
 
 	// Load window settings
-	resize (settings.readNumEntry( "/vym/mainwindow/geometry/width", 800),
-	        settings.readNumEntry( "/vym/mainwindow/geometry/height",600));
-	move   (settings.readNumEntry( "/vym/mainwindow/geometry/posX", 100),
-	        settings.readNumEntry( "/vym/mainwindow/geometry/posY", 100));
-
+#if defined(Q_OS_WIN32)
+    if (settings.value("/mainwindow/geometry/maximized", false).toBool())
+    {
+        setWindowState(Qt::WindowMaximized);
+    }
+    else
+#endif
+    {
+        resize (settings.value("/mainwindow/geometry/size", QSize (800,600)).toSize());
+        move   (settings.value("/mainwindow/geometry/pos",  QPoint(300,100)).toPoint());
+    }
+
+	// Sometimes we may need to remember old selections
+	prevSelection="";
+
+	// Default color
+	currentColor=Qt::black;
+
+	// Create unique temporary directory
+	bool ok;
+	tmpVymDir=makeTmpDir (ok,"vym");
+	if (!ok)
+	{
+		qWarning ("Mainwindow: Could not create temporary directory, failed to start vym");
+		exit (1);
+	}
+	if (debug) qDebug (QString("vym tmpDir=%1").arg(tmpVymDir) );
+
+	// Create direcctory for clipboard
+	clipboardDir=tmpVymDir+"/clipboard";
+	clipboardFile="map.xml";
+	QDir d(clipboardDir);
+	d.mkdir (clipboardDir,true);
+	makeSubDirs (clipboardDir);
+	clipboardEmpty=true;
+
+	procBrowser=NULL;
+
+	// Satellite windows //////////////////////////////////////////
+
+	// history window
+	historyWindow=new HistoryWindow();
+	connect (historyWindow, SIGNAL (windowClosed() ), this, SLOT (updateActions()));
+
+	// properties window
+	branchPropertyWindow = new BranchPropertyWindow();
+	connect (branchPropertyWindow, SIGNAL (windowClosed() ), this, SLOT (updateActions()));
+
+	// Connect TextEditor, so that we can update flags if text changes
+	connect (textEditor, SIGNAL (textHasChanged() ), this, SLOT (updateNoteFlag()));
+	connect (textEditor, SIGNAL (windowClosed() ), this, SLOT (updateActions()));
+
+	// Connect HistoryWindow, so that we can update flags
+	connect (historyWindow, SIGNAL (windowClosed() ), this, SLOT (updateActions()));
+
+
+	// Initialize script editor
+	scriptEditor = new SimpleScriptEditor();
+	scriptEditor->move (50,50);
+
+	connect( scriptEditor, SIGNAL( runScript ( QString ) ), 
+		this, SLOT( runScript( QString ) ) );
+	
+
+	// Initialize Find window
+	findWindow=new FindWindow(NULL);
+	findWindow->move (x(),y()+70);
+	connect (findWindow, SIGNAL( findButton(QString) ), 
+		this, SLOT(editFind(QString) ) );	
+	connect (findWindow, SIGNAL( somethingChanged() ), 
+		this, SLOT(editFindChanged() ) );	
 
 	// Initialize some settings, which are platform dependant
 	QString p,s;
 
 		// application to open URLs
-		p="/vym/mainwindow/readerURL";
+		p="/mainwindow/readerURL";
 		#if defined(Q_OS_LINUX)
-			s=settings.readEntry (p,"konqueror");
+			s=settings.value (p,"xdg-open").toString();
 		#else
 			#if defined(Q_OS_MACX)
-				s=settings.readEntry (p,"/Applications/Safari.app/Contents/MacOS/Safari");
-			#else
-				s=settings.readEntry (p,"mozilla");
+				s=settings.value (p,"/usr/bin/open").toString();
+
+            #else
+                #if defined(Q_OS_WIN32)
+                    // Assume that system has been set up so that
+                    // Explorer automagically opens up the URL
+                    // in the user's preferred browser.
+                    s=settings.value (p,"explorer").toString();
+                #else
+					s=settings.value (p,"mozilla").toString();
+				#endif
 			#endif
 		#endif
-		settings.writeEntry( p,s);
+		settings.setValue( p,s);
 
 		// application to open PDFs
-		p="/vym/mainwindow/readerPDF";
+		p="/mainwindow/readerPDF";
 		#if defined(Q_OS_LINUX)
-			s=settings.readEntry (p,"acroread");
+			s=settings.value (p,"xdg-open").toString();
 		#else
 			#if defined(Q_OS_MACX)
-				s=settings.readEntry (p,"/Applications/Safari.app/Contents/MacOS/Safari");
+				s=settings.value (p,"/usr/bin/open").toString();
+            #elif defined(Q_OS_WIN32)
+                s=settings.value (p,"acrord32").toString();
 			#else
-				s=settings.readEntry (p,"acroread");
+				s=settings.value (p,"acroread").toString();
 			#endif
 		#endif
-		settings.writeEntry( p,s);
-
+		settings.setValue( p,s);
+
+	// width of xLinksMenu
+	xLinkMenuWidth=60;
 	
-	maxLastMaps=9;
-
 	// Create tab widget which holds the maps
 	tabWidget= new QTabWidget (this);
 	connect( tabWidget, SIGNAL( currentChanged( QWidget * ) ), 
 		this, SLOT( editorChanged( QWidget * ) ) );
 
+	lineedit=new QLineEdit (this);
+	lineedit->hide();
+
 	setCentralWidget(tabWidget);	
 
     setupFileActions();
     setupEditActions();
     setupFormatActions();
     setupViewActions();
+    setupModeActions();
 	setupFlagActions();
+    setupNetworkActions();
     setupSettingsActions();
 	setupContextMenus();
-    if (settings.readBoolEntry( "/vym/mainwindow/showTestMenu",false)) setupTestActions();
+	setupMacros();
+    if (settings.value( "/mainwindow/showTestMenu",false).toBool()) setupTestActions();
     setupHelpActions();
     
-	// After menu is created, we can enable some actions
-	actionFilePrint->setEnabled (true);
-
     statusBar();
 
-	// Create the default map into first tab
-//	fileNew();
-//	tabWidget->addTab (new MapEditor(tabWidget,true), "unnamed");
-//	currentMapEditor()->show();
-
-	// Initialize Find window
-	findWindow=new FindWindow(NULL,"findwindow");
-	connect (findWindow, SIGNAL( findButton(QString) ), 
-		this, SLOT(editFind(QString) ) );	
-	connect (findWindow, SIGNAL( somethingChanged() ), 
-		this, SLOT(editFindChanged() ) );	
+	restoreState (settings.value("/mainwindow/state",0).toByteArray());
 
 	updateGeometry();
 }
 
 Main::~Main()
 {
+	//cout << "Destr MainWindow\n";
 	// Save Settings
-	settings.writeEntry( "/vym/mainwindow/geometry/width", width() );
-	settings.writeEntry( "/vym/mainwindow/geometry/height", height() );
-	settings.writeEntry( "/vym/mainwindow/geometry/posX", pos().x() );
-	settings.writeEntry( "/vym/mainwindow/geometry/posY", pos().y() );
-
-	settings.writeEntry( "/vym/version/version", __VYM_VERSION__ );
-	settings.writeEntry( "/vym/version/builddate", __BUILD_DATE__ );
-
-	settings.writeEntry( "/vym/mapeditor/editmode/autoselectheading",actionSettingsAutoselectHeading->isOn() );
-	settings.writeEntry( "/vym/mapeditor/editmode/autoselecttext",actionSettingsAutoselectText->isOn() );
-	settings.writeEntry( "/vym/mapeditor/editmode/pastenewheading",actionSettingsPasteNewHeading->isOn() );
-	settings.writeEntry( "/vym/mapeditor/editmode/autoedit",actionSettingsAutoedit->isOn() );
-	settings.writeEntry( "/vym/mapeditor/editmode/useDelKey",actionSettingsUseDelKey->isOn() );
-
-	QString s;
-	int maps=lastMaps.count();
-	settings.writeEntry( "/vym/lastMaps/number",maps );
-	for (int i=1;i<=maps;i++)
-	{
-		QStringList::Iterator it = lastMaps.at(i-1);
-		s=QString("/vym/lastMaps/map-%1").arg(i);
-		if (!s.isEmpty() && i<=maxLastMaps) 
-			settings.writeEntry (s, *it);
-	}
-
-
-	// To make the texteditor save its settings, call the destructor
-	delete (textEditor);
+#if defined(Q_OS_WIN32)
+    settings.setValue ("/mainwindow/geometry/maximized", isMaximized());
+#endif
+	settings.setValue ("/mainwindow/geometry/size", size());
+	settings.setValue ("/mainwindow/geometry/pos", pos());
+	settings.setValue ("/mainwindow/state",saveState(0));
+
+	settings.setValue ("/mainwindow/view/AntiAlias",actionViewToggleAntiAlias->isOn());
+	settings.setValue ("/mainwindow/view/SmoothPixmapTransform",actionViewToggleSmoothPixmapTransform->isOn());
+	settings.setValue( "/version/version", vymVersion );
+	settings.setValue( "/version/builddate", vymBuildDate );
+
+	settings.setValue( "/mainwindow/autosave/use",actionSettingsAutosaveToggle->isOn() );
+	settings.setValue( "/mapeditor/editmode/autoSelectNewBranch",actionSettingsAutoSelectNewBranch->isOn() );
+	settings.setValue( "/mainwindow/writeBackupFile",actionSettingsWriteBackupFile->isOn() );
+	settings.setValue( "/mapeditor/editmode/autoSelectText",actionSettingsAutoSelectText->isOn() );
+	settings.setValue( "/mapeditor/editmode/autoEditNewBranch",actionSettingsAutoEditNewBranch->isOn() );
+	settings.setValue( "/mapeditor/editmode/useDelKey",actionSettingsUseDelKey->isOn() );
+	settings.setValue( "/mapeditor/editmode/useFlagGroups",actionSettingsUseFlagGroups->isOn() );
+	settings.setValue( "/export/useHideExport",actionSettingsUseHideExport->isOn() );
+
+	//TODO save scriptEditor settings
+
+	// call the destructors
+	delete textEditor;
+	delete historyWindow;
+	delete branchPropertyWindow;
+
+	// Remove temporary directory
+	removeDir (QDir(tmpVymDir));
 }
 
 void Main::loadCmdLine()
@@ -269,7 +285,7 @@
 
 void Main::statusMessage(const QString &s)
 {
-	statusBar()->message (s);
+	statusBar()->message( s);
 }
 
 void Main::closeEvent (QCloseEvent* )
@@ -280,490 +296,1238 @@
 // File Actions
 void Main::setupFileActions()
 {
-    QToolBar *tb = new QToolBar( this );
-    tb->setLabel( "File Actions" );
-    QPopupMenu *menu = new QPopupMenu( this );
-    menuBar()->insertItem( tr( "&File" ), menu );
-
-	// Keycodes:  /usr/lib64/qt3/include/qnamespace.h
+	QMenu *fileMenu = menuBar()->addMenu ( tr ("&Map") );
+    QToolBar *tb = addToolBar( tr ("&Map") );
+	tb->setObjectName ("mapTB");
 
     QAction *a;
-    a = new QAction( tr( "New map" ), QPixmap( filenew_xpm ), tr( "&New..." ), CTRL + Key_N, this, "fileNew" );
-    connect( a, SIGNAL( activated() ), this, SLOT( fileNew() ) );
+    a = new QAction(QPixmap( iconPath+"filenew.png"), tr( "&New map","File menu" ),this);
+	a->setStatusTip ( tr( "New map","Status tip File menu" ) );
+	a->setShortcut ( Qt::CTRL + Qt::Key_N );		//New map
     a->addTo( tb );
-    a->addTo( menu );
+	fileMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( fileNew() ) );
 	
-    a = new QAction( tr( "Open" ), QPixmap( fileopen_xpm), tr( "&Open..." ), CTRL + Key_O, this, "fileOpen" );
-    connect( a, SIGNAL( activated() ), this, SLOT( fileLoad() ) );
+    a = new QAction(QPixmap( iconPath+"filenewcopy.png"), tr( "&Copy to new map","File menu" ),this);
+	a->setStatusTip ( tr( "Copy selection to mapcenter of a new map","Status tip File menu" ) );
+	a->setShortcut ( Qt::CTRL +Qt::SHIFT + Qt::Key_N );		//New map
+	fileMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( fileNewCopy() ) );
+	actionFileNewCopy=a;
+	
+    a = new QAction( QPixmap( iconPath+"fileopen.png"), tr( "&Open..." ,"File menu"),this);
+	a->setStatusTip (tr( "Open","Status tip File menu" ) );
+	a->setShortcut ( Qt::CTRL + Qt::Key_O );		//Open map
     a->addTo( tb );
-    a->addTo( menu );
+	fileMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( fileLoad() ) );
 	
-	lastMapsMenu = new QPopupMenu (this);
-
-    menu->insertItem (tr("Open Recent"),lastMapsMenu );
-    menu->insertSeparator();
+	fileLastMapsMenu = fileMenu->addMenu (tr("Open Recent","File menu"));
+	fileMenu->addSeparator();
 	
-    a = new QAction( tr( "Save" ), QPixmap( filesave_xpm ), tr( "&Save..." ), CTRL + Key_S, this, "fileSave" );
-    connect( a, SIGNAL( activated() ), this, SLOT( fileSave() ) );
+    a = new QAction( QPixmap( iconPath+"filesave.png"), tr( "&Save...","File menu" ), this);
+	a->setStatusTip ( tr( "Save","Status tip file menu" ));
+	a->setShortcut (Qt::CTRL + Qt::Key_S );			//Save map
     a->addTo( tb );
-    a->addTo( menu );
+	fileMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( fileSave() ) );
 	actionFileSave=a;
 	
-    a = new QAction( tr( "Save &As" ), QPixmap(), tr( "Save &As..." ), 0, this, "fileSaveAs" );
-    connect( a, SIGNAL( activated() ), this, SLOT( fileSaveAs() ) );
-    a->addTo( menu );
-
-    menu->insertSeparator();
-
-    a = new QAction( tr( "Import directory structure (experimental)" ), QPixmap(), tr( "Import Dir" ), 0, this, "export" );
-    connect( a, SIGNAL( activated() ), this, SLOT( fileImportDir() ) );
-    a->addTo( menu );
-
-	exportMenu = new QPopupMenu (this);
-    menu->insertItem (tr("Export"),exportMenu );
-
-    menu->insertSeparator();
-
-
-    a = new QAction( tr( "Print" ), QPixmap( fileprint_xpm ), tr( "&Print..." ), CTRL + Key_P, this, "filePrint" );
-    connect( a, SIGNAL( activated() ), this, SLOT( filePrint() ) );
+    a = new QAction( QPixmap(iconPath+"filesaveas.png"), tr( "Save &As...","File menu" ), this);
+	a->setStatusTip (tr( "Save &As","Status tip file menu" ) );
+	fileMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( fileSaveAs() ) );
+
+	fileMenu->addSeparator();
+
+	fileImportMenu = fileMenu->addMenu (tr("Import","File menu"));
+
+	a = new QAction(tr("KDE Bookmarks"), this);
+	a->setStatusTip ( tr( "Import %1","Status tip file menu" ).arg(tr("KDE bookmarks")));
+	a->addTo (fileImportMenu);
+	connect( a, SIGNAL( triggered() ), this, SLOT( fileImportKDEBookmarks() ) );
+
+    if (settings.value( "/mainwindow/showTestMenu",false).toBool()) 
+	{
+		a = new QAction( QPixmap(), tr("Firefox Bookmarks","File menu"),this);
+		a->setStatusTip (tr( "Import %1","Status tip file menu").arg(tr("Firefox Bookmarks" ) ));
+		a->addTo (fileImportMenu);
+		connect( a, SIGNAL( triggered() ), this, SLOT( fileImportFirefoxBookmarks() ) );
+	}	
+
+	a = new QAction("Freemind...",this);
+	a->setStatusTip ( tr( "Import %1","status tip file menu").arg(" Freemind")  );
+	fileImportMenu->addAction (a);
+	connect( a, SIGNAL( triggered() ), this, SLOT( fileImportFreemind() ) );
+
+	a = new QAction("Mind Manager...",this);
+	a->setStatusTip ( tr( "Import %1","status tip file menu").arg(" Mind Manager")  );
+	fileImportMenu->addAction (a);
+	connect( a, SIGNAL( triggered() ), this, SLOT( fileImportMM() ) );
+
+    a = new QAction( tr( "Import Dir%1","File menu").arg("..."), this);
+	a->setStatusTip (tr( "Import directory structure (experimental)","status tip file menu" ) );
+	fileImportMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( fileImportDir() ) );
+
+	fileExportMenu = fileMenu->addMenu (tr("Export","File menu"));
+
+	a = new QAction( tr("Image%1","File export menu").arg("..."), this);
+	a->setStatusTip( tr( "Export map as image","status tip file menu" ));
+	connect( a, SIGNAL( triggered() ), this, SLOT( fileExportImage() ) );
+	fileExportMenu->addAction (a);
+
+	a = new QAction( "Open Office...", this);
+	a->setStatusTip( tr( "Export in Open Document Format used e.g. in Open Office ","status tip file menu" ));
+	connect( a, SIGNAL( triggered() ), this, SLOT( fileExportOOPresentation() ) );
+	fileExportMenu->addAction (a);
+
+	a = new QAction(  "Webpage (XHTML)...",this );
+	a->setShortcut (Qt::ALT + Qt::Key_X);			//Export XHTML
+	a->setStatusTip ( tr( "Export as %1","status tip file menu").arg(tr(" webpage (XHTML)","status tip file menu")));
+    connect( a, SIGNAL( triggered() ), this, SLOT( fileExportXHTML() ) );
+	fileExportMenu->addAction (a);
+
+    a = new QAction( "Text (ASCII)...", this);
+	a->setStatusTip ( tr( "Export as %1").arg("ASCII "+tr("(still experimental)" )));
+    connect( a, SIGNAL( triggered() ), this, SLOT( fileExportASCII() ) );
+	fileExportMenu->addAction (a);
+
+    a = new QAction( "Spreadsheet (CSV)...", this);
+	a->setStatusTip ( tr( "Export as %1").arg("CSV "+tr("(still experimental)" )));
+    connect( a, SIGNAL( triggered() ), this, SLOT( fileExportCSV() ) );
+	fileExportMenu->addAction (a);
+
+	a = new QAction( tr("KDE Bookmarks","File menu"), this);
+	a->setStatusTip( tr( "Export as %1").arg(tr("KDE Bookmarks" )));
+	connect( a, SIGNAL( triggered() ), this, SLOT( fileExportKDEBookmarks() ) );
+	fileExportMenu->addAction (a);
+
+    a = new QAction( "Taskjuggler...", this );
+    a->setStatusTip( tr( "Export as %1").arg("Taskjuggler "+tr("(still experimental)" )));
+    connect( a, SIGNAL( triggered() ), this, SLOT( fileExportTaskjuggler() ) );
+	fileExportMenu->addAction (a);
+
+    a = new QAction( "LaTeX...", this);
+    a->setStatusTip( tr( "Export as %1").arg("LaTeX "+tr("(still experimental)" )));
+    connect( a, SIGNAL( triggered() ), this, SLOT( fileExportLaTeX() ) );
+	fileExportMenu->addAction (a);
+
+	a = new QAction( "XML..." , this );
+	a->setStatusTip (tr( "Export as %1").arg("XML"));
+    connect( a, SIGNAL( triggered() ), this, SLOT( fileExportXML() ) );
+	fileExportMenu->addAction (a);
+
+	fileMenu->addSeparator();
+
+    a = new QAction(QPixmap( iconPath+"fileprint.png"), tr( "&Print")+QString("..."), this);
+	a->setStatusTip ( tr( "Print" ,"File menu") );
+	a->setShortcut (Qt::CTRL + Qt::Key_P );			//Print map
     a->addTo( tb );
-    a->addTo( menu );
+	fileMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( filePrint() ) );
 	actionFilePrint=a;
 
-    a = new QAction( tr( "Close Map" ), QPixmap(), tr( "&Close Map" ), ALT + Key_C, this, "fileCloseMap" );
-    connect( a, SIGNAL( activated() ), this, SLOT( fileCloseMap() ) );
-    a->addTo( menu );
-
-    a = new QAction( tr( "Exit VYM" ), QPixmap(), tr( "E&xit VYM" ), CTRL + Key_Q, this, "fileExitVYM" );
-    connect( a, SIGNAL( activated() ), this, SLOT( fileExitVYM() ) );
-    a->addTo( menu );
+    a = new QAction( QPixmap(iconPath+"fileclose.png"), tr( "&Close Map","File menu" ), this);
+	a->setStatusTip (tr( "Close Map" ) );
+	a->setShortcut (Qt::CTRL + Qt::Key_W );			//Close map
+	fileMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( fileCloseMap() ) );
+
+    a = new QAction(QPixmap(iconPath+"exit.png"), tr( "E&xit","File menu")+" "+vymName, this);
+	a->setStatusTip ( tr( "Exit")+" "+vymName );
+	a->setShortcut (Qt::CTRL + Qt::Key_Q );			//Quit vym
+	fileMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( fileExitVYM() ) );
 }
 
 
 //Edit Actions
 void Main::setupEditActions()
 {
-    QToolBar *tb = new QToolBar( this );
+    QToolBar *tb = addToolBar( tr ("&Actions toolbar","Toolbar name") );
     tb->setLabel( "Edit Actions" );
-    QPopupMenu *menu = new QPopupMenu( this );
-    menuBar()->insertItem( tr( "&Edit" ), menu );
+	tb->setObjectName ("actionsTB");
+    QMenu *editMenu = menuBar()->addMenu( tr("&Edit","Edit menu") );
 
     QAction *a;
-    a = new QAction( tr( "Undo" ), QPixmap( editundo_xpm ), tr( "&Undo" ), CTRL + Key_Z, this, "editUndo" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editUndo() ) );
+	QAction *alt;
+    a = new QAction( QPixmap( iconPath+"undo.png"), tr( "&Undo","Edit menu" ),this);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editUndo() ) );
+	a->setStatusTip (tr( "Undo" ) );
+	a->setShortcut ( Qt::CTRL + Qt::Key_Z );		//Undo last action
 	a->setEnabled (false);
-    a->addTo( tb );
-    a->addTo( menu );
+    tb->addAction (a);
+	editMenu->addAction (a);
 	actionEditUndo=a;
-    /*
-    a = new QAction( tr( "Redo" ), QPixmap( editredo_xpm ), tr( "&Redo" ), CTRL + Key_Y, this, "editRedo" ); 
-    connect( a, SIGNAL( activated() ), this, SLOT( editRedo() ) );
-    a->addTo( tb );
-    a->addTo( menu );
-    */
-    menu->insertSeparator();
-    a = new QAction( tr( "Copy" ), QPixmap( editcopy_xpm ), tr( "&Copy" ), CTRL + Key_C, this, "editCopy" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editCopy() ) );
+    
+	a = new QAction( QPixmap( iconPath+"redo.png"), tr( "&Redo","Edit menu" ), this); 
+	a->setStatusTip (tr( "Redo" ));
+	a->setShortcut (Qt::CTRL + Qt::Key_Y );			//Redo last action
+    tb->addAction (a);
+	editMenu->addAction (a);
+	connect( a, SIGNAL( triggered() ), this, SLOT( editRedo() ) );
+	actionEditRedo=a;
+   
+	editMenu->addSeparator();
+    a = new QAction(QPixmap( iconPath+"editcopy.png"), tr( "&Copy","Edit menu" ), this);
+	a->setStatusTip ( tr( "Copy" ) );
+	a->setShortcut (Qt::CTRL + Qt::Key_C );			//Copy
 	a->setEnabled (false);
-    a->addTo( tb );
-    a->addTo( menu );
+    tb->addAction (a);
+	editMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editCopy() ) );
 	actionEditCopy=a;
-    a = new QAction( tr( "Cut" ), QPixmap( editcut_xpm ), tr( "Cu&t" ), CTRL + Key_X, this, "editCut" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editCut() ) );
+	
+    a = new QAction(QPixmap( iconPath+"editcut.png" ), tr( "Cu&t","Edit menu" ), this);
+	a->setStatusTip ( tr( "Cut" ) );
+	a->setShortcut (Qt::CTRL + Qt::Key_X );			//Cut
 	a->setEnabled (false);
-    a->addTo( tb );
-    a->addTo( menu );
+    tb->addAction (a);
+	editMenu->addAction (a);
 	actionEditCut=a;
-    a = new QAction( tr( "Paste" ), QPixmap( editpaste_xpm ), tr( "&Paste" ), CTRL + Key_V, this, "editPaste" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editPaste() ) );
+    connect( a, SIGNAL( triggered() ), this, SLOT( editCut() ) );
+	
+    a = new QAction(QPixmap( iconPath+"editpaste.png"), tr( "&Paste","Edit menu" ),this);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editPaste() ) );
+	a->setStatusTip ( tr( "Paste" ) );
+	a->setShortcut ( Qt::CTRL + Qt::Key_V );		//Paste
 	a->setEnabled (false);
-    a->addTo( tb );
-    a->addTo( menu );
+    tb->addAction (a);
+	editMenu->addAction (a);
 	actionEditPaste=a;
-    a = new QAction( tr( "Move branch up" ), QPixmap( editmoveup_xpm ), tr( "Move up" ), Key_PageUp, this, "editMoveUp" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editMoveUp() ) );
+
+    // Shortcuts to modify heading:
+    a = new QAction(tr( "Edit heading","Edit menu" ),this);
+	a->setStatusTip ( tr( "edit Heading" ));
+	a->setShortcut ( Qt::Key_Enter);				//Edit heading
+//	a->setShortcutContext (Qt::WindowShortcut);
+	addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editHeading() ) );
+	actionListBranches.append(a);
+    a = new QAction( tr( "Edit heading","Edit menu" ), this);
+	a->setStatusTip (tr( "edit Heading" ));
+	a->setShortcut (Qt::Key_Return );				//Edit heading
+	//a->setShortcutContext (Qt::WindowShortcut);
+	addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editHeading() ) );
+	actionListBranches.append(a);
+	editMenu->addAction (a);
+	actionEditHeading=a;
+    a = new QAction( tr( "Edit heading","Edit menu" ), this);
+	a->setStatusTip (tr( "edit Heading" ));
+	//a->setShortcut ( Qt::Key_F2 );					//Edit heading
+	a->setShortcutContext (Qt::WindowShortcut);
+	addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editHeading() ) );
+	actionListBranches.append(a);
+    
+    // Shortcut to delete selection
+    a = new QAction( tr( "Delete Selection","Edit menu" ),this);
+	a->setStatusTip (tr( "Delete Selection" ));
+	a->setShortcut ( Qt::Key_Delete);				//Delete selection
+	a->setShortcutContext (Qt::WindowShortcut);
+	addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editDeleteSelection() ) );
+	actionEditDelete=a;
+    
+    // Shortcut to add mapcenter
+	a= new QAction(tr( "Add mapcenter","Canvas context menu" ), this);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editAddMapCenter() ) );
+	actionEditAddMapCenter = a;
+
+
+    // Shortcut to add branch
+	alt = new QAction(QPixmap(iconPath+"newbranch.png"), tr( "Add branch as child","Edit menu" ), this);
+	alt->setStatusTip ( tr( "Add a branch as child of selection" ));
+	alt->setShortcut (Qt::Key_A);					//Add branch
+	alt->setShortcutContext (Qt::WindowShortcut);
+	addAction (alt);
+	connect( alt, SIGNAL( triggered() ), this, SLOT( editNewBranch() ) );
+	a = new QAction(QPixmap(iconPath+"newbranch.png"), tr( "Add branch as child","Edit menu" ), this);
+	a->setStatusTip ( tr( "Add a branch as child of selection" ));
+	a->setShortcut (Qt::Key_Insert);				//Add branch
+	connect( a, SIGNAL( triggered() ), this, SLOT( editNewBranch() ) );
+	actionListBranches.append(a);
+	#if defined (Q_OS_MACX)
+		// In OSX show different shortcut in menues, the keys work indepently always			
+		actionEditAddBranch=alt;
+	#else	
+		actionEditAddBranch=a;
+	#endif	
+	editMenu->addAction (actionEditAddBranch);
+	tb->addAction (actionEditAddBranch);
+
+
+    // Add branch by inserting it at selection
+	a = new QAction(tr( "Add branch (insert)","Edit menu" ), this);
+	a->setStatusTip ( tr( "Add a branch by inserting and making selection its child" ));
+	a->setShortcut (Qt::ALT + Qt::Key_Insert );		//Insert branch
+	a->setShortcutContext (Qt::WindowShortcut);
+	addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editNewBranchBefore() ) );
 	a->setEnabled (false);
-    a->addTo( tb );
-    a->addTo( menu );
+	actionListBranches.append(a);
+	actionEditAddBranchBefore=a;
+	a = new QAction(tr( "Add branch (insert)","Edit menu" ),this);
+	a->setStatusTip ( tr( "Add a branch by inserting and making selection its child" ));
+	a->setShortcut ( Qt::ALT + Qt::Key_A );			//Insert branch
+	a->setShortcutContext (Qt::WindowShortcut);
+	addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editNewBranchBefore() ) );
+	actionListBranches.append(a);
+
+	// Add branch above
+    a = new QAction(tr( "Add branch above","Edit menu" ), this);
+	a->setStatusTip ( tr( "Add a branch above selection" ));
+	a->setShortcut (Qt::SHIFT+Qt::Key_Insert );		//Add branch above
+	a->setShortcutContext (Qt::WindowShortcut);
+	addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editNewBranchAbove() ) );
+	a->setEnabled (false);
+	actionListBranches.append(a);
+	actionEditAddBranchAbove=a;
+    a = new QAction(tr( "Add branch above","Edit menu" ), this);
+	a->setStatusTip ( tr( "Add a branch above selection" ));
+	a->setShortcut (Qt::SHIFT+Qt::Key_A );			//Add branch above
+	a->setShortcutContext (Qt::WindowShortcut);
+	addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editNewBranchAbove() ) );
+	actionListBranches.append(a);
+
+	// Add branch below 
+    a = new QAction(tr( "Add branch below","Edit menu" ), this);
+	a->setStatusTip ( tr( "Add a branch below selection" ));
+	a->setShortcut (Qt::CTRL +Qt::Key_Insert );		//Add branch below
+	a->setShortcutContext (Qt::WindowShortcut);
+	addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editNewBranchBelow() ) );
+	a->setEnabled (false);
+	actionListBranches.append(a);
+	actionEditAddBranchBelow=a;
+    a = new QAction(tr( "Add branch below","Edit menu" ), this);
+	a->setStatusTip ( tr( "Add a branch below selection" ));
+	a->setShortcut (Qt::CTRL +Qt::Key_A );			// Add branch below
+	a->setShortcutContext (Qt::WindowShortcut);
+	addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editNewBranchBelow() ) );
+	actionListBranches.append(a);
+
+    a = new QAction(QPixmap(iconPath+"up.png" ), tr( "Move up","Edit menu" ), this);
+	a->setStatusTip ( tr( "Move branch up" ) );
+	a->setShortcut (Qt::Key_PageUp );				// Move branch up
+	a->setEnabled (false);
+    tb->addAction (a);
+	editMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editMoveUp() ) );
 	actionEditMoveUp=a;
-    a = new QAction( tr( "Move branch down" ), QPixmap( editmovedown_xpm ), tr( "Move down" ), Key_PageDown, this, "editMoveDown" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editMoveDown() ) );
+
+    a = new QAction( QPixmap( iconPath+"down.png"), tr( "Move down","Edit menu" ),this);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editMoveDown() ) );
+	a->setStatusTip (tr( "Move branch down" ) );
+	a->setShortcut ( Qt::Key_PageDown );			// Move branch down
 	a->setEnabled (false);
-    a->addTo( tb );
-    a->addTo( menu );
+    tb->addAction (a);
+	editMenu->addAction (a);
 	actionEditMoveDown=a;
-
-    a = new QAction( tr( "Scroll branch" ), QPixmap(flag_scrolled_right_xpm), tr( "Scroll branch" ), Key_ScrollLock, this, "scroll" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editToggleScroll() ) );
-	a->setEnabled (false);
-    a->addTo( tb );
-    a->addTo( menu );
-	actionEditToggleScroll=a;
 	
-    a = new QAction( tr( "Unscroll all" ), QPixmap(), tr( "Unscroll all scrolled branches" ), 0, this, "scroll" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editUnScrollAll() ) );
-    a->addTo( menu );
+	a = new QAction( QPixmap(iconPath+"editsort.png" ), tr( "Sort children","Edit menu" ), this );
+	connect( a, SIGNAL( activated() ), this, SLOT( editSortChildren() ) );
+	a->setEnabled (true);
+	a->addTo( tb );
+	editMenu->addAction (a);
+	actionEditSortChildren=a;
+
+	a = new QAction( QPixmap(flagsPath+"flag-scrolled-right.png"), tr( "Scroll branch","Edit menu" ),this);
+	a->setShortcut ( Qt::Key_ScrollLock );
+	a->setStatusTip (tr( "Scroll branch" ) );
+    connect( a, SIGNAL( triggered() ), this, SLOT( editToggleScroll() ) );
+
+	alt = new QAction( QPixmap(flagsPath+"flag-scrolled-right.png"), tr( "Scroll branch","Edit menu" ), this);
+	alt->setShortcut ( Qt::Key_S );					// Scroll branch
+	alt->setStatusTip (tr( "Scroll branch" )); 
+    connect( alt, SIGNAL( triggered() ), this, SLOT( editToggleScroll() ) );
+	#if defined(Q_OS_MACX)
+		actionEditToggleScroll=alt;
+	#else	
+		actionEditToggleScroll=a;
+	#endif	
+	actionEditToggleScroll->setEnabled (false);
+	actionEditToggleScroll->setToggleAction(true);
+    tb->addAction (actionEditToggleScroll);
+    editMenu->addAction ( actionEditToggleScroll);
+	editMenu->addAction (actionEditToggleScroll);
+	addAction (a);
+	addAction (alt);
+	actionListBranches.append(actionEditToggleScroll);
 	
-    menu->insertSeparator();
-
-	a = new QAction( tr( "Find" ), QPixmap(), tr( "Find" ), CTRL + Key_F, this, "find" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editOpenFindWindow() ) );
-    a->addTo( menu );
+    a = new QAction( tr( "Unscroll childs","Edit menu" ), this);
+	a->setStatusTip (tr( "Unscroll all scrolled branches in selected subtree" ));
+	editMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editUnscrollChilds() ) );
+	
+	editMenu->addSeparator();
+
+	a = new QAction( QPixmap(iconPath+"find.png"), tr( "Find...","Edit menu"), this);
+	a->setStatusTip (tr( "Find" ) );
+	a->setShortcut (Qt::CTRL + Qt::Key_F );				//Find
+	editMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editOpenFindWindow() ) );
     
-	menu->insertSeparator();
-
-	a = new QAction( tr( "Open URL" ), QPixmap(flag_url_xpm), tr( "Open URL" ), CTRL + Key_U, this, "url" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editOpenURL() ) );
-    a->addTo( menu );
-    a->addTo( tb );
-	a->setEnabled (false);
+	editMenu->addSeparator();
+
+	a = new QAction( QPixmap(flagsPath+"flag-url.png"), tr( "Open URL","Edit menu" ), this);
+	a->setShortcut (Qt::CTRL + Qt::Key_U );
+	a->setShortcut (tr( "Open URL" ));
+    tb->addAction (a);
+	addAction(a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editOpenURL() ) );
 	actionEditOpenURL=a;
 
-	a = new QAction( tr( "Edit URL" ), QPixmap(), tr( "Edit URL" ), SHIFT + CTRL + Key_U, this, "url" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editURL() ) );
-    a->addTo( menu );
-	a->setEnabled (false);
+	a = new QAction( tr( "Open URL in new tab","Edit menu" ), this);
+	a->setStatusTip (tr( "Open URL in new tab" ));
+	//a->setShortcut (Qt::CTRL+Qt::Key_U );
+	addAction(a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editOpenURLTab() ) );
+	actionEditOpenURLTab=a;
+
+	a = new QAction( tr( "Open all URLs in subtree","Edit menu" ), this);
+	a->setStatusTip (tr( "Open all URLs in subtree" ));
+	addAction(a);
+	actionListBranches.append(a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editOpenMultipleURLTabs() ) );
+	actionEditOpenMultipleURLTabs=a;
+
+	a = new QAction(QPixmap(), tr( "Edit URL...","Edit menu"), this);
+	a->setStatusTip ( tr( "Edit URL" ) );
+	a->setShortcut ( Qt::Key_U );
+	a->setShortcutContext (Qt::WindowShortcut);
+	actionListBranches.append(a);
+	addAction(a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editURL() ) );
 	actionEditURL=a;
 	
-	a = new QAction( tr( "Use heading of selected branch as URL" ), QPixmap(), tr( "Use heading for URL" ), 0, this, "heading2url" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editHeading2URL() ) );
-    a->addTo( menu );
+	a = new QAction(QPixmap(), tr( "Edit local URL...","Edit menu"), this);
+	a->setStatusTip ( tr( "Edit local URL" ) );
+	a->setShortcut (Qt::SHIFT +  Qt::Key_U );
+	a->setShortcutContext (Qt::WindowShortcut);
+	actionListBranches.append(a);
+	addAction(a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editLocalURL() ) );
+	actionEditLocalURL=a;
+	
+	a = new QAction( tr( "Use heading for URL","Edit menu" ), this);
+	a->setStatusTip ( tr( "Use heading of selected branch as URL" ));
 	a->setEnabled (false);
+	actionListBranches.append(a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editHeading2URL() ) );
 	actionEditHeading2URL=a;
     
-	a = new QAction( tr( "Create URL to Bugzilla" ), QPixmap(), tr( "Create URL to Bugzilla" ), 0, this, "bugzilla2url" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editBugzilla2URL() ) );
+	a = new QAction(tr( "Create URL to Novell Bugzilla","Edit menu" ), this);
+	a->setStatusTip ( tr( "Create URL to Novell Bugzilla" ));
 	a->setEnabled (false);
+	actionListBranches.append(a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editBugzilla2URL() ) );
 	actionEditBugzilla2URL=a;
     
-	menu->insertSeparator();
+	a = new QAction(tr( "Create URL to Novell FATE","Edit menu" ), this);
+	a->setStatusTip ( tr( "Create URL to Novell FATE" ));
+	a->setEnabled (false);
+	actionListBranches.append(a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editFATE2URL() ) );
+	actionEditFATE2URL=a;
 	
-    a = new QAction( tr( "Jump to another vym map, if needed load it first" ), QPixmap(flag_vymlink_xpm), tr( "Jump to map" ), 0, this, "jumpMap" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editOpenVymLink() ) );
-    a->addTo( menu );
-    a->addTo( tb );
+    a = new QAction(QPixmap(flagsPath+"flag-vymlink.png"), tr( "Open linked map","Edit menu" ), this);
+	a->setStatusTip ( tr( "Jump to another vym map, if needed load it first" ));
+    tb->addAction (a);
 	a->setEnabled (false);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editOpenVymLink() ) );
 	actionEditOpenVymLink=a;
 	
-    a = new QAction( tr( "Edit link to another vym map" ), QPixmap(), tr( "Edit vym link" ), 0, this, "editLinkMap" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editVymLink() ) );
-    a->addTo( menu );
+    a = new QAction(QPixmap(), tr( "Open all vym links in subtree","Edit menu" ), this);
+	a->setStatusTip ( tr( "Open all vym links in subtree" ));
 	a->setEnabled (false);
+	actionListBranches.append(a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editOpenMultipleVymLinks() ) );
+	actionEditOpenMultipleVymLinks=a;
+	
+
+    a = new QAction(tr( "Edit vym link...","Edit menu" ), this);
+	a->setEnabled (false);
+	a->setStatusTip ( tr( "Edit link to another vym map" ));
+    connect( a, SIGNAL( triggered() ), this, SLOT( editVymLink() ) );
+	actionListBranches.append(a);
 	actionEditVymLink=a;
 
-    a = new QAction( tr( "Delete link to another vym map" ), QPixmap(), tr( "Delete vym link" ), 0, this, "deleteLinkMap" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editDeleteVymLink() ) );
-    a->addTo( menu );
+    a = new QAction(tr( "Delete vym link","Edit menu" ),this);
+	a->setStatusTip ( tr( "Delete link to another vym map" ));
 	a->setEnabled (false);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editDeleteVymLink() ) );
 	actionEditDeleteVymLink=a;
 
-	menu->insertSeparator();
-
-    a = new QAction( tr( "Edit Map Info" ), QPixmap(), tr( "Edit Map Info" ), 0, this, "editMapInfo" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editMapInfo() ) );
-    a->addTo( menu );
+    a = new QAction(QPixmap(flagsPath+"flag-hideexport.png"), tr( "Hide in exports","Edit menu" ), this);
+	a->setStatusTip ( tr( "Hide object in exports" ) );
+	a->setShortcut (Qt::Key_H );
+	a->setToggleAction(true);
+    tb->addAction (a);
+	a->setEnabled (false);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editToggleHideExport() ) );
+	actionEditToggleHideExport=a;
+
+    a = new QAction(tr( "Edit Map Info...","Edit menu" ),this);
+	a->setStatusTip ( tr( "Edit Map Info" ));
 	a->setEnabled (true);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editMapInfo() ) );
 	actionEditMapInfo=a;
 
-	menu->insertSeparator();
-
-    // Shortcuts to modify heading:
-    a = new QAction( tr( "edit Heading" ),tr( "Edit heading" ), Key_Enter, this, "editHeading" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editHeading() ) );
+	// Import at selection (adding to selection)
+    a = new QAction( tr( "Add map (insert)","Edit menu" ),this);
+	a->setStatusTip (tr( "Add map at selection" ));
+    connect( a, SIGNAL( triggered() ), this, SLOT( editImportAdd() ) );
 	a->setEnabled (false);
-    a->addTo ( menu );
-	actionEditHeading=a;
-    a = new QAction( tr( "edit Heading" ),tr( "Edit heading" ), Key_Return, this, "editHeading" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editHeading() ) );
-    //a->addTo ( menu );
-    
-    // Shortcut to delete selection
-    a = new QAction( tr( "Delete Selection" ),tr( "Delete Selection" ), Key_Delete, this, "deleteBranch" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editDeleteSelection() ) );
+	actionListBranches.append(a);
+	actionEditImportAdd=a;
+
+	// Import at selection (replacing selection)
+    a = new QAction( tr( "Add map (replace)","Edit menu" ), this);
+	a->setStatusTip (tr( "Replace selection with map" ));
+    connect( a, SIGNAL( triggered() ), this, SLOT( editImportReplace() ) );
 	a->setEnabled (false);
-    a->addTo ( menu );
-	actionEditDelete=a;
-    
-    // Shortcut to add branch
-	#if defined (Q_OS_MACX)
-		a = new QAction( tr( "Add a branch as child of selection" ),tr( "Add branch as child" ), CTRL + Key_I, this, "newBranch" );
-	#else
-		a = new QAction( tr( "Add a branch as child of selection" ),tr( "Add branch as child" ), Key_Insert, this, "newBranch" );
-	#endif
-    connect( a, SIGNAL( activated() ), this, SLOT( editNewBranch() ) );
+	actionListBranches.append(a);
+	actionEditImportReplace=a;
+
+	// Save selection 
+    a = new QAction( tr( "Save selection","Edit menu" ), this);
+	a->setStatusTip (tr( "Save selection" ));
+    connect( a, SIGNAL( triggered() ), this, SLOT( editSaveBranch() ) );
 	a->setEnabled (false);
-    a->addTo ( menu );
-	actionEditAddBranch=a;
-
-	// Add branch above
-    a = new QAction( tr( "Add a branch above selection" ),tr( "Add branch above" ), SHIFT+Key_Insert, this, "newBranch" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editNewBranchAbove() ) );
+	actionListBranches.append(a);
+	actionEditSaveBranch=a;
+
+	// Only remove branch, not its childs
+    a = new QAction(tr( "Remove only branch ","Edit menu" ), this);
+	a->setStatusTip ( tr( "Remove only branch and keep its childs" ));
+	a->setShortcut (Qt::ALT + Qt::Key_Delete );
+    connect( a, SIGNAL( triggered() ), this, SLOT( editDeleteKeepChilds() ) );
 	a->setEnabled (false);
-    a->addTo ( menu );
-	actionEditAddBranchAbove=a;
-
-	// Add branch below 
-    a = new QAction( tr( "Add a branch below selection" ),tr( "Add branch below" ), CTRL +Key_Insert, this, "newBranch" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editNewBranchBelow() ) );
+	addAction (a);
+	actionListBranches.append(a);
+	actionEditDeleteKeepChilds=a;
+
+	// Only remove childs of a branch
+    a = new QAction( tr( "Remove childs","Edit menu" ), this);
+	a->setStatusTip (tr( "Remove childs of branch" ));
+	a->setShortcut (Qt::SHIFT + Qt::Key_Delete );
+    connect( a, SIGNAL( triggered() ), this, SLOT( editDeleteChilds() ) );
 	a->setEnabled (false);
-    a->addTo ( menu );
-	actionEditAddBranchBelow=a;
-
-	// Import at selection (adding to selection)
-    a = new QAction( tr( "Add map at selection" ),tr( "Import (add)" ), 0, this, "importAdd" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editImportAdd() ) );
+	actionListBranches.append(a);
+	actionEditDeleteChilds=a;
+
+    // Shortcuts for navigating with cursor:
+    a = new QAction(tr( "Select upper branch","Edit menu" ), this);
+	a->setStatusTip ( tr( "Select upper branch" ));
+	a->setShortcut (Qt::Key_Up );
+	a->setShortcutContext (Qt::WindowShortcut);
+	addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editUpperBranch() ) );
+    a = new QAction( tr( "Select lower branch","Edit menu" ),this);
+	a->setStatusTip (tr( "Select lower branch" ));
+	a->setShortcut ( Qt::Key_Down );
+	a->setShortcutContext (Qt::WindowShortcut);
+	addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editLowerBranch() ) );
+    a = new QAction(tr( "Select left branch","Edit menu" ), this);
+	a->setStatusTip ( tr( "Select left branch" ));
+	a->setShortcut (Qt::Key_Left );
+	a->setShortcutContext (Qt::WindowShortcut);
+	addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editLeftBranch() ) );
+    a = new QAction( tr( "Select child branch","Edit menu" ), this);
+	a->setStatusTip (tr( "Select right branch" ));
+	a->setShortcut (Qt::Key_Right);
+	a->setShortcutContext (Qt::WindowShortcut);
+	addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editRightBranch() ) );
+    a = new QAction( tr( "Select first branch","Edit menu" ), this);
+	a->setStatusTip (tr( "Select first branch" ));
+	a->setShortcut (Qt::Key_Home );
+	a->setShortcutContext (Qt::WindowShortcut);
+	addAction (a);
 	a->setEnabled (false);
-    a->addTo ( menu );
-	actionEditImportAdd=a;
-
-	// Import at selection (replacing selection)
-    a = new QAction( tr( "Replace selection with map" ),tr( "Import (replace)" ), 0, this, "importReplace" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editImportReplace() ) );
+	editMenu->addAction (a);
+	actionListBranches.append(a);
+	actionEditSelectFirst=a;
+    connect( a, SIGNAL( triggered() ), this, SLOT( editFirstBranch() ) );
+    a = new QAction( tr( "Select last branch","Edit menu" ),this);
+	a->setStatusTip (tr( "Select last branch" ));
+	a->setShortcut ( Qt::Key_End );
+	a->setShortcutContext (Qt::WindowShortcut);
+	addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( editLastBranch() ) );
 	a->setEnabled (false);
-    a->addTo ( menu );
-	actionEditImportReplace=a;
-
-	// Save selection 
-    a = new QAction( tr( "Save selction" ),tr( "Save selection" ), 0, this, "saveSelection" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editSaveBranch() ) );
-	a->setEnabled (false);
-    a->addTo ( menu );
-	actionEditSaveBranch=a;
-
-    // Shortcuts for navigating with cursor:
-    a = new QAction( tr( "Select upper branch" ),tr( "Select upper branch" ), Key_Up, this, "upperBranch" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editUpperBranch() ) );
-    a = new QAction( tr( "Select lower branch" ),tr( "Select lower branch" ), Key_Down, this, "lowerBranch" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editLowerBranch() ) );
-    a = new QAction( tr( "Select left branch" ),tr( "Select left branch" ), Key_Left, this, "upperBranch" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editLeftBranch() ) );
-    a = new QAction( tr( "Select right branch" ),tr( "Select child branch" ), Key_Right, this, "rightBranch" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editRightBranch() ) );
-    a = new QAction( tr( "Select first branch" ),tr( "Select first branch" ), Key_Home, this, "firstBranch" );
-	a->setEnabled (false);
-    a->addTo ( menu );
-	actionEditSelectFirst=a;
-    connect( a, SIGNAL( activated() ), this, SLOT( editFirstBranch() ) );
-    a = new QAction( tr( "Select last branch" ),tr( "Select last branch" ), Key_End, this, "lastBranch" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editLastBranch() ) );
-	a->setEnabled (false);
-    a->addTo ( menu );
+	editMenu->addAction (a);
+	actionListBranches.append(a);
 	actionEditSelectLast=a;
 
-    a = new QAction( tr( "Add Image" ),tr( "Add Image" ), 0, this, "loadImage" );
-    connect( a, SIGNAL( activated() ), this, SLOT( editLoadImage() ) );
+    a = new QAction( tr( "Add Image...","Edit menu" ), this);
+	a->setStatusTip (tr( "Add Image" ));
+    connect( a, SIGNAL( triggered() ), this, SLOT( editLoadImage() ) );
 	actionEditLoadImage=a;
+
+    a = new QAction( tr( "Property window","Dialog to edit properties of selection" )+QString ("..."), this);
+	a->setStatusTip (tr( "Set properties for selection" ));
+	a->setShortcut ( Qt::CTRL + Qt::Key_I );		//Property window
+	a->setShortcutContext (Qt::WindowShortcut);
+	a->setToggleAction (true);
+	addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( windowToggleProperty() ) );
+	actionViewTogglePropertyWindow=a;
 }
 
 // Format Actions
 void Main::setupFormatActions()
 {
-    QPopupMenu *menu = new QPopupMenu( this );
-    menuBar()->insertItem( tr( "&Format" ), menu );
-
-    QToolBar *tb = new QToolBar( this );
+    QMenu *formatMenu = menuBar()->addMenu (tr ("F&ormat","Format menu"));
+
+    QToolBar *tb = addToolBar( tr("Format Actions","Format Toolbar name"));
+	tb->setObjectName ("formatTB");
     QAction *a;
     QPixmap pix( 16,16);
-    pix.fill (black);
-    actionFormatColor= new QAction( tr( "Set Color" ), pix, tr( "Set &Color" ), 0, this, "formatColor" );
-    connect( actionFormatColor, SIGNAL( activated() ), this, SLOT( formatSelectColor() ) );
-    actionFormatColor->addTo( tb );
-    actionFormatColor->addTo( menu );
-    a= new QAction( tr( "Pick color\nHint: You can pick a color from another branch and color using CTRL+Left Button" ), QPixmap(formatcolorpicker_xpm), tr( "Pic&k color" ), CTRL + Key_K, this, "pickColor" );
-    connect( a, SIGNAL( activated() ), this, SLOT( formatPickColor() ) );
+    pix.fill (Qt::black);
+    a= new QAction(pix, tr( "Set &Color" )+QString("..."), this);
+	a->setStatusTip ( tr( "Set Color" ));
+    connect( a, SIGNAL( triggered() ), this, SLOT( formatSelectColor() ) );
+    a->addTo( tb );
+	formatMenu->addAction (a);
+	actionFormatColor=a;
+    a= new QAction( QPixmap(iconPath+"formatcolorpicker.png"), tr( "Pic&k color","Edit menu" ), this);
+	a->setStatusTip (tr( "Pick color\nHint: You can pick a color from another branch and color using CTRL+Left Button" ) );
+	a->setShortcut (Qt::CTRL + Qt::Key_K );
+    connect( a, SIGNAL( triggered() ), this, SLOT( formatPickColor() ) );
 	a->setEnabled (false);
     a->addTo( tb );
-    a->addTo( menu );
+	formatMenu->addAction (a);
+	actionListBranches.append(a);
 	actionFormatPickColor=a;
-    a= new QAction( tr( "Color branch" ), QPixmap(formatcoloritem_xpm), tr( "Color &branch" ), CTRL + Key_I, this, "colorItem" );
-    connect( a, SIGNAL( activated() ), this, SLOT( formatColorItem() ) );
+
+    a= new QAction(QPixmap(iconPath+"formatcolorbranch.png"), tr( "Color &branch","Edit menu" ), this);
+	a->setStatusTip ( tr( "Color branch" ) );
+	a->setShortcut (Qt::CTRL + Qt::Key_B);
+    connect( a, SIGNAL( triggered() ), this, SLOT( formatColorBranch() ) );
 	a->setEnabled (false);
     a->addTo( tb );
-    a->addTo( menu );
-	actionFormatColorBranch=a;
-    a= new QAction( tr( "Color Subtree" ), QPixmap(formatcolorbranch_xpm), tr( "Color sub&tree" ), CTRL + Key_T, this, "colorBranch" );
-    connect( a, SIGNAL( activated() ), this, SLOT( formatColorBranch() ) );
+	formatMenu->addAction (a);
+	actionListBranches.append(a);
+	actionFormatColorSubtree=a;
+
+    a= new QAction(QPixmap(iconPath+"formatcolorsubtree.png"), tr( "Color sub&tree","Edit menu" ), this);
+	a->setStatusTip ( tr( "Color Subtree" ));
+	a->setShortcut (Qt::CTRL + Qt::Key_T);
+    connect( a, SIGNAL( triggered() ), this, SLOT( formatColorSubtree() ) );
 	a->setEnabled (false);
-    a->addTo( menu );
+	formatMenu->addAction (a);
     a->addTo( tb );
+	actionListBranches.append(a);
 	actionFormatColorSubtree=a;
 
-    menu->insertSeparator();
-	actionGroupFormatLinkStyles=new QActionGroup ( this, "formatLinkStyles");
+	formatMenu->addSeparator();
+	actionGroupFormatLinkStyles=new QActionGroup ( this);
 	actionGroupFormatLinkStyles->setExclusive (true);
-    a= new QAction( tr( "Line" ), QPixmap(), tr( "Linkstyle Line" ), 0, actionGroupFormatLinkStyles, "formatLinkStyleLine" );
+    a= new QAction( tr( "Linkstyle Line" ), actionGroupFormatLinkStyles);
+	a->setStatusTip (tr( "Line" ));
 	a->setToggleAction(true);
-    connect( a, SIGNAL( activated() ), this, SLOT( formatLinkStyleLine() ) );
+    connect( a, SIGNAL( triggered() ), this, SLOT( formatLinkStyleLine() ) );
+	formatMenu->addAction (a);
 	actionFormatLinkStyleLine=a;
-    a= new QAction( tr( "Line" ), QPixmap(), tr( "Linkstyle Parabel" ), 0, actionGroupFormatLinkStyles, "formatLinkStyleLine" );
+    a= new QAction( tr( "Linkstyle Curve" ), actionGroupFormatLinkStyles);
+	a->setStatusTip (tr( "Line" ));
 	a->setToggleAction(true);
-    connect( a, SIGNAL( activated() ), this, SLOT( formatLinkStyleParabel() ) );
+    connect( a, SIGNAL( triggered() ), this, SLOT( formatLinkStyleParabel() ) );
+	formatMenu->addAction (a);
 	actionFormatLinkStyleParabel=a;
-    a= new QAction( tr( "PolyLine" ), QPixmap(), tr( "Linkstyle Thick Line" ), 0, actionGroupFormatLinkStyles, "formatLinkStyleLine" );
+    a= new QAction( tr( "Linkstyle Thick Line" ), actionGroupFormatLinkStyles );
+	a->setStatusTip (tr( "PolyLine" ));
 	a->setToggleAction(true);
-    connect( a, SIGNAL( activated() ), this, SLOT( formatLinkStylePolyLine() ) );
+    connect( a, SIGNAL( triggered() ), this, SLOT( formatLinkStylePolyLine() ) );
+	formatMenu->addAction (a);
 	actionFormatLinkStylePolyLine=a;
-    a= new QAction( tr( "PolyParabel" ), QPixmap(), tr( "Linkstyle Thick Parabel" ), 0, actionGroupFormatLinkStyles, "formatLinkStylePolyParabel" );
+    a= new QAction( tr( "Linkstyle Thick Curve" ), actionGroupFormatLinkStyles);
+	a->setStatusTip (tr( "PolyParabel" ) );
 	a->setToggleAction(true);
-    connect( a, SIGNAL( activated() ), this, SLOT( formatLinkStylePolyParabel() ) );
+	a->setChecked (true);
+    connect( a, SIGNAL( triggered() ), this, SLOT( formatLinkStylePolyParabel() ) );
+	formatMenu->addAction (a);
 	actionFormatLinkStylePolyParabel=a;
-	actionGroupFormatLinkStyles->addTo (menu);
 	
-	actionGroupFormatFrameTypes=new QActionGroup ( this, "formatFrameTypes");
-	actionGroupFormatFrameTypes->setExclusive (true);
-    a = new QAction( tr( "No Frame" ),tr( "No Frame" ), 0, actionGroupFormatFrameTypes, "frameNone" );
+    a = new QAction( tr( "Hide link if object is not selected","Branch attribute" ), this);
+	a->setStatusTip (tr( "Hide link" ));
 	a->setToggleAction(true);
-    connect( a, SIGNAL( activated() ), this, SLOT( formatFrameNone() ) );
-	actionFormatFrameNone=a;
-    a = new QAction( tr( "Rectangle" ),tr( "Rectangle" ), 0, actionGroupFormatFrameTypes, "frameRectangle" );
+    connect( a, SIGNAL( triggered() ), this, SLOT( formatHideLinkUnselected() ) );
+	actionFormatHideLinkUnselected=a;
+
+	formatMenu->addSeparator();
+    a= new QAction( tr( "&Use color of heading for link","Branch attribute" ),  this);
+	a->setStatusTip (tr( "Use same color for links and headings" ));
 	a->setToggleAction(true);
-    connect( a, SIGNAL( activated() ), this, SLOT( formatFrameRectangle() ) );
-	actionFormatFrameRectangle=a;
-
-    menu->insertSeparator();
-    a= new QAction( tr( "Use same color for links and headings" ), QPixmap(), tr( "&Use color of heading for link" ), 0, this, "formatLinkColorHint" );
-	a->setToggleAction(true);
-    connect( a, SIGNAL( activated() ), this, SLOT( formatToggleLinkColorHint() ) );
-	a->addTo( menu );
+    connect( a, SIGNAL( triggered() ), this, SLOT( formatToggleLinkColorHint() ) );
+	formatMenu->addAction (a);
 	actionFormatLinkColorHint=a;
-    pix.fill (white);
-    actionFormatLinkColor= new QAction( tr( "Set Link Color" ), pix, tr( "Set &Link Color" ), 0, this, "formatLinkColor" );
-    connect( actionFormatLinkColor, SIGNAL( activated() ), this, SLOT( formatSelectLinkColor() ) );
-    actionFormatLinkColor->addTo( menu );
-    actionFormatBackColor= new QAction( tr( "Set Background Color" ), pix, tr( "Set &Background Color" ), 0, this, "formatBackColor" );
-    connect( actionFormatBackColor, SIGNAL( activated() ), this, SLOT( formatSelectBackColor() ) );
-    actionFormatBackColor->addTo( menu );
+
+    pix.fill (Qt::white);
+    a= new QAction( pix, tr( "Set &Link Color"+QString("...") ), this  );
+	a->setStatusTip (tr( "Set Link Color" ));
+	formatMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( formatSelectLinkColor() ) );
+    actionFormatLinkColor=a;
+
+    a= new QAction( pix, tr( "Set &Selection Color"+QString("...") ), this  );
+	a->setStatusTip (tr( "Set Selection Color" ));
+	formatMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( formatSelectSelectionColor() ) );
+    actionFormatSelectionColor=a;
+
+    a= new QAction( pix, tr( "Set &Background Color" )+QString("..."), this );
+	a->setStatusTip (tr( "Set Background Color" ));
+	formatMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( formatSelectBackColor() ) );
+    actionFormatBackColor=a;
+
+    a= new QAction( pix, tr( "Set &Background image" )+QString("..."), this );
+	a->setStatusTip (tr( "Set Background image" ));
+	formatMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( formatSelectBackImage() ) );
+    actionFormatBackImage=a;
 }
 
 // View Actions
 void Main::setupViewActions()
 {
-    QToolBar *tb = new QToolBar( this );
+    QToolBar *tb = addToolBar( tr("View Actions","View Toolbar name") );
     tb->setLabel( "View Actions" );
-    QPopupMenu *menu = new QPopupMenu( this );
-    menuBar()->insertItem( tr( "&View" ), menu );
+	tb->setObjectName ("viewTB");
+    QMenu *viewMenu = menuBar()->addMenu ( tr( "&View" ));
 
     QAction *a;
-    a = new QAction( tr( "Zoom reset" ), QPixmap(viewzoomreset_xpm), tr( "reset Zoom" ), 0, this, "zoomReset" );
-    connect( a, SIGNAL( activated() ), this, SLOT(viewZoomReset() ) );
+    a = new QAction(QPixmap(iconPath+"viewmag-reset.png"), tr( "reset Zoom","View action" ), this);
+	a->setStatusTip ( tr( "Zoom reset" ) );
+	a->setShortcut (Qt::CTRL + Qt::Key_0 );
     a->addTo( tb );
-    a->addTo( menu );
-    a = new QAction( tr( "Zoom in" ), QPixmap(viewzoomin_xpm), tr( "Zoom in" ), CTRL + Key_Plus, this, "zoomIn" );
-    connect( a, SIGNAL( activated() ), this, SLOT(viewZoomIn() ) );
+	viewMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT(viewZoomReset() ) );
+	
+    a = new QAction( QPixmap(iconPath+"viewmag+.png"), tr( "Zoom in","View action" ), this);
+	a->setStatusTip (tr( "Zoom in" ));
+	a->setShortcut (Qt::CTRL + Qt::Key_Plus);
     a->addTo( tb );
-    a->addTo( menu );
-    a = new QAction( tr( "Zoom out" ), QPixmap(viewzoomout_xpm), tr( "Zoom out" ), CTRL + Key_Minus, this, "zoomOut" );
-    connect( a, SIGNAL( activated() ), this, SLOT( viewZoomOut() ) );
+	viewMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT(viewZoomIn() ) );
+	
+    a = new QAction( QPixmap(iconPath+"viewmag-.png"), tr( "Zoom out","View action" ), this);
+	a->setStatusTip (tr( "Zoom out" ));
+	a->setShortcut (Qt::CTRL + Qt::Key_Minus );
     a->addTo( tb );
-    a->addTo( menu );
-    a = new QAction( tr( "Toggle Note Editor" ), QPixmap(flag_note_xpm), tr( "Toggle Note Editor" ), CTRL + Key_E , this, "noteEditor" );
-    connect( a, SIGNAL( activated() ), this, SLOT(windowToggleNoteEditor() ) );
+	viewMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( viewZoomOut() ) );
+
+    a = new QAction( QPixmap(iconPath+"viewshowsel.png"), tr( "Show selection","View action" ), this);
+	a->setStatusTip (tr( "Show selection" ));
+	a->setShortcut (Qt::Key_Period);
+    a->addTo( tb );
+	viewMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( viewCenter() ) );
+
+	viewMenu->addSeparator();	
+
+    a = new QAction(QPixmap(flagsPath+"flag-note.png"), tr( "Show Note Editor","View action" ),this);
+	a->setStatusTip ( tr( "Show Note Editor" ));
+	a->setShortcut ( Qt::CTRL + Qt::Key_E );
 	a->setToggleAction(true);
-	if (textEditor->showWithMain())
-		a->setOn(true);
-	else	
-		a->setOn(false);
     a->addTo( tb );
-    a->addTo( menu );
+	viewMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT(windowToggleNoteEditor() ) );
 	actionViewToggleNoteEditor=a;
-    a = new QAction( tr( "&Next Window" ), QPixmap(), tr( "Next Window" ), ALT + Key_N , this, "nextWindow" );
-    connect( a, SIGNAL( activated() ), this, SLOT(windowNextEditor() ) );
-    a->addTo( menu );
-    a = new QAction( tr( "&Previous Window" ), QPixmap(), tr( "Previous Window" ), ALT + Key_P , this, "previousWindow" );
-    connect( a, SIGNAL( activated() ), this, SLOT(windowPreviousEditor() ) );
-    a->addTo( menu );
+
+    a = new QAction(QPixmap(iconPath+"history.png"),  tr( "History Window","View action" ),this );
+	a->setStatusTip ( tr( "Show History Window" ));
+	a->setShortcut ( Qt::CTRL + Qt::Key_H  );
+	a->setToggleAction(true);
+    a->addTo( tb );
+	viewMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT(windowToggleHistory() ) );
+	actionViewToggleHistoryWindow=a;
+
+	viewMenu->addAction (actionViewTogglePropertyWindow);
+
+	viewMenu->addSeparator();	
+
+    a = new QAction(tr( "Antialiasing","View action" ),this );
+	a->setStatusTip ( tr( "Antialiasing" ));
+	a->setToggleAction(true);
+	a->setOn (settings.value("/mainwindow/view/AntiAlias",true).toBool());
+	viewMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT(windowToggleAntiAlias() ) );
+	actionViewToggleAntiAlias=a;
+
+    a = new QAction(tr( "Smooth pixmap transformations","View action" ),this );
+	a->setStatusTip (a->text());
+	a->setToggleAction(true);
+	a->setOn (settings.value("/mainwindow/view/SmoothPixmapTransformation",true).toBool());
+	viewMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT(windowToggleSmoothPixmap() ) );
+	actionViewToggleSmoothPixmapTransform=a;
+
+    a = new QAction(tr( "Next Map","View action" ), this);
+	a->setStatusTip (a->text());
+	a->setShortcut (Qt::ALT + Qt::Key_N );
+	viewMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT(windowNextEditor() ) );
+
+    a = new QAction (tr( "Previous Map","View action" ), this );
+	a->setStatusTip (a->text());
+	a->setShortcut (Qt::ALT + Qt::Key_P );
+	viewMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT(windowPreviousEditor() ) );
+}
+
+// Mode Actions
+void Main::setupModeActions()
+{
+    //QPopupMenu *menu = new QPopupMenu( this );
+    //menuBar()->insertItem( tr( "&Mode (using modifiers)" ), menu );
+
+    QToolBar *tb = addToolBar( tr ("Modes when using modifiers","Modifier Toolbar name") );
+	tb->setObjectName ("modesTB");
+    QAction *a;
+	actionGroupModModes=new QActionGroup ( this);
+	actionGroupModModes->setExclusive (true);
+    a= new QAction( QPixmap(iconPath+"modecolor.png"), tr( "Use modifier to color branches","Mode modifier" ), actionGroupModModes);
+	a->setShortcut (Qt::Key_J);
+    a->setStatusTip ( tr( "Use modifier to color branches" ));
+	a->setToggleAction(true);
+	a->addTo (tb);
+	a->setOn(true);
+	actionModModeColor=a;
+	
+    a= new QAction( QPixmap(iconPath+"modecopy.png"), tr( "Use modifier to copy","Mode modifier" ), actionGroupModModes );
+	a->setShortcut( Qt::Key_K); 
+    a->setStatusTip( tr( "Use modifier to copy" ));
+	a->setToggleAction(true);
+	a->addTo (tb);
+	actionModModeCopy=a;
+
+    a= new QAction(QPixmap(iconPath+"modelink.png"), tr( "Use modifier to draw xLinks","Mode modifier" ), actionGroupModModes );
+	a->setShortcut (Qt::Key_L);
+    a->setStatusTip( tr( "Use modifier to draw xLinks" ));
+	a->setToggleAction(true);
+	a->addTo (tb);
+	actionModModeXLink=a;
 }
 
 // Flag Actions
 void Main::setupFlagActions()
 {
-	standardFlagsDefault->makeToolbar(this, "Standard Flags");
+	// Create System Flags
+	QToolBar *tb=NULL;
+	bool avis=true;
+
+	systemFlagsDefault = new FlagRowObj ();
+	systemFlagsDefault->setVisibility (false);
+	systemFlagsDefault->setName ("systemFlagsDef");
+
+	FlagObj *fo = new FlagObj ();
+	fo->load(QPixmap(flagsPath+"flag-note.png"));
+	setupFlag (fo,tb,avis,"note",tr("Note","SystemFlag"));
+
+	fo->load(QPixmap(flagsPath+"flag-url.png"));
+	setupFlag (fo,tb,avis,"url",tr("URL to Document ","SystemFlag"));
+	
+	fo->load(QPixmap(flagsPath+"flag-vymlink.png"));
+	setupFlag (fo,tb,avis,"vymLink",tr("Link to another vym map","SystemFlag"));
+
+	fo->load(QPixmap(flagsPath+"flag-scrolled-right.png"));
+	setupFlag (fo,tb,avis,"scrolledright",tr("subtree is scrolled","SystemFlag"));
+	
+	fo->load(QPixmap(flagsPath+"flag-tmpUnscrolled-right.png"));
+	setupFlag (fo,tb,avis,"tmpUnscrolledright",tr("subtree is temporary scrolled","SystemFlag"));
+
+	fo->load(QPixmap(flagsPath+"flag-hideexport.png"));
+	setupFlag (fo,tb,avis,"hideInExport",tr("Hide object in exported maps","SystemFlag"));
+
+	// Create Standard Flags
+	tb=addToolBar (tr ("Standard Flags","Standard Flag Toolbar"));
+	tb->setObjectName ("standardFlagTB");
+
+	standardFlagsDefault = new FlagRowObj ();
+	standardFlagsDefault->setVisibility (false);
+	standardFlagsDefault->setName ("standardFlagsDef");
+	standardFlagsDefault->setToolBar (tb);
+
+	fo->load(flagsPath+"flag-exclamationmark.png");
+	fo->setGroup("standard-mark");
+	setupFlag (fo,tb,avis,"exclamationmark",tr("Take care!","Standardflag"));
+	
+	fo->load(flagsPath+"flag-questionmark.png");
+	fo->setGroup("standard-mark");
+	setupFlag (fo,tb,avis,"questionmark",tr("Really?","Standardflag"));
+
+	fo->load(flagsPath+"flag-hook-green.png");
+	fo->setGroup("standard-hook");
+	setupFlag (fo,tb,avis,"hook-green",tr("ok!","Standardflag"));
+
+	fo->load(flagsPath+"flag-cross-red.png");
+	fo->setGroup("standard-hook");
+	setupFlag (fo,tb,avis,"cross-red",tr("Not ok!","Standardflag"));
+	fo->unsetGroup();
+
+	fo->load(flagsPath+"flag-stopsign.png");
+	setupFlag (fo,tb,avis,"stopsign",tr("This won't work!","Standardflag"));
+
+	fo->load(flagsPath+"flag-smiley-good.png");
+	fo->setGroup("standard-smiley");
+	setupFlag (fo,tb,avis,"smiley-good",tr("Good","Standardflag"));
+
+	fo->load(flagsPath+"flag-smiley-sad.png");
+	fo->setGroup("standard-smiley");
+	setupFlag (fo,tb,avis,"smiley-sad",tr("Bad","Standardflag"));
+
+	fo->load(flagsPath+"flag-smiley-omg.png");
+	fo->setGroup("standard-smiley");
+	setupFlag (fo,tb,avis,"smiley-omb",tr("Oh no!","Standardflag"));
+	// Original omg.png (in KDE emoticons)
+	fo->unsetGroup();
+
+	fo->load(flagsPath+"flag-kalarm.png");
+	setupFlag (fo,tb,avis,"clock",tr("Time critical","Standardflag"));
+
+	fo->load(flagsPath+"flag-phone.png");
+	setupFlag (fo,tb,avis,"phone",tr("Call...","Standardflag"));
+
+	fo->load(flagsPath+"flag-lamp.png");
+	setupFlag (fo,tb,avis,"lamp",tr("Idea!","Standardflag"));
+
+	fo->load(flagsPath+"flag-arrow-up.png");
+	fo->setGroup("standard-arrow");
+	setupFlag (fo,tb,avis,"arrow-up",tr("Important","Standardflag"));
+
+	fo->load(flagsPath+"flag-arrow-down.png");
+	fo->setGroup("standard-arrow");
+	setupFlag (fo,tb,avis,"arrow-down",tr("Unimportant","Standardflag"));
+
+	fo->load(flagsPath+"flag-arrow-2up.png");
+	fo->setGroup("standard-arrow");
+	setupFlag (fo,tb,avis,"2arrow-up",tr("Very important!","Standardflag"));
+
+	fo->load(flagsPath+"flag-arrow-2down.png");
+	fo->setGroup("standard-arrow");
+	setupFlag (fo,tb,avis,"2arrow-down",tr("Very unimportant!","Standardflag"));
+	fo->unsetGroup();
+
+	fo->load(flagsPath+"flag-thumb-up.png");
+	fo->setGroup("standard-thumb");
+	setupFlag (fo,tb,avis,"thumb-up",tr("I like this","Standardflag"));
+
+	fo->load(flagsPath+"flag-thumb-down.png");
+	fo->setGroup("standard-thumb");
+	setupFlag (fo,tb,avis,"thumb-down",tr("I do not like this","Standardflag"));
+	fo->unsetGroup();
+	
+	fo->load(flagsPath+"flag-rose.png");
+	setupFlag (fo,tb,avis,"rose",tr("Rose","Standardflag"));
+
+	fo->load(flagsPath+"flag-heart.png");
+	setupFlag (fo,tb,avis,"heart",tr("I just love...","Standardflag"));
+
+	fo->load(flagsPath+"flag-present.png");
+	setupFlag (fo,tb,avis,"present",tr("Surprise!","Standardflag"));
+
+	fo->load(flagsPath+"flag-flash.png");
+	setupFlag (fo,tb,avis,"flash",tr("Dangerous","Standardflag"));
+	
+	// Original: xsldbg_output.png
+	fo->load(flagsPath+"flag-info.png");
+	setupFlag (fo,tb,avis,"info",tr("Info","Standardflag"));
+
+	// Original khelpcenter.png
+	fo->load(flagsPath+"flag-lifebelt.png");
+	setupFlag (fo,tb,avis,"lifebelt",tr("This will help","Standardflag"));
+
+	// Freemind flags
+
+	avis=false;
+
+	fo->load(flagsPath+"freemind/warning.png");
+	setupFlag (fo,tb, avis, "freemind-warning",tr("Important","Freemind-Flag"));
+
+	for (int i=1; i<8; i++)
+	{
+		fo->load(flagsPath+QString("freemind/priority-%1.png").arg(i));
+		setupFlag (fo,tb, avis,QString("freemind-priority-%1").arg(i),tr("Priority","Freemind-Flag"));
+	}
+
+	fo->load(flagsPath+"freemind/back.png");
+	setupFlag (fo,tb,avis,"freemind-back",tr("Back","Freemind-Flag"));
+
+	fo->load(flagsPath+"freemind/forward.png");
+	setupFlag (fo,tb,avis,"freemind-forward",tr("Forward","Freemind-Flag"));
+
+	fo->load(flagsPath+"freemind/attach.png");
+	setupFlag (fo,tb,avis,"freemind-attach",tr("Look here","Freemind-Flag"));
+
+	fo->load(flagsPath+"freemind/clanbomber.png");
+	setupFlag (fo,tb,avis,"freemind-clanbomber",tr("Dangerous","Freemind-Flag"));
+
+	fo->load(flagsPath+"freemind/desktopnew.png");
+	setupFlag (fo,tb,avis,"freemind-desktopnew",tr("Don't forget","Freemind-Flag"));
+
+	fo->load(flagsPath+"freemind/flag.png");
+	setupFlag (fo,tb,avis,"freemind-flag",tr("Flag","Freemind-Flag"));
+
+
+	fo->load(flagsPath+"freemind/gohome.png");
+	setupFlag (fo,tb,avis,"freemind-gohome",tr("Home","Freemind-Flag"));
+
+
+	fo->load(flagsPath+"freemind/kaddressbook.png");
+	setupFlag (fo,tb,avis,"freemind-kaddressbook",tr("Telephone","Freemind-Flag"));
+
+	fo->load(flagsPath+"freemind/knotify.png");
+	setupFlag (fo,tb,avis,"freemind-knotify",tr("Music","Freemind-Flag"));
+
+	fo->load(flagsPath+"freemind/korn.png");
+	setupFlag (fo,tb,avis,"freemind-korn",tr("Mailbox","Freemind-Flag"));
+
+	fo->load(flagsPath+"freemind/mail.png");
+	setupFlag (fo,tb,avis,"freemind-mail",tr("Maix","Freemind-Flag"));
+
+	fo->load(flagsPath+"freemind/password.png");
+	setupFlag (fo,tb,avis,"freemind-password",tr("Password","Freemind-Flag"));
+
+	fo->load(flagsPath+"freemind/pencil.png");
+	setupFlag (fo,tb,avis,"freemind-pencil",tr("To be improved","Freemind-Flag"));
+
+	fo->load(flagsPath+"freemind/stop.png");
+	setupFlag (fo,tb,avis,"freemind-stop",tr("Stop","Freemind-Flag"));
+
+	fo->load(flagsPath+"freemind/wizard.png");
+	setupFlag (fo,tb,avis,"freemind-wizard",tr("Magic","Freemind-Flag"));
+
+	fo->load(flagsPath+"freemind/xmag.png");
+	setupFlag (fo,tb,avis,"freemind-xmag",tr("To be discussed","Freemind-Flag"));
+
+	fo->load(flagsPath+"freemind/bell.png");
+	setupFlag (fo,tb,avis,"freemind-bell",tr("Reminder","Freemind-Flag"));
+
+	fo->load(flagsPath+"freemind/bookmark.png");
+	setupFlag (fo,tb,avis,"freemind-bookmark",tr("Excellent","Freemind-Flag"));
+
+	fo->load(flagsPath+"freemind/penguin.png");
+	setupFlag (fo,tb,avis,"freemind-penguin",tr("Linux","Freemind-Flag"));
+
+	fo->load(flagsPath+"freemind/licq.png");
+	setupFlag (fo,tb,avis,"freemind-licq",tr("Sweet","Freemind-Flag"));
+
+	delete (fo);
 }
 
+void Main::setupFlag (FlagObj *fo, QToolBar *tb, bool aw, const QString &name, const QString &tooltip)
+{
+	fo->setName(name);
+	fo->setToolTip (tooltip);
+	QAction *a=new QAction (fo->getPixmap(),fo->getName(),this);
+	if (tb)
+	{
+		// StandardFlag
+		tb->addAction (a);
+		fo->setAction (a);
+		fo->setAlwaysVisible(aw);
+		a->setCheckable(true);
+		a->setObjectName(fo->getName());
+		a->setToolTip(tooltip);
+		connect (a, SIGNAL( triggered() ), this, SLOT( standardFlagChanged() ) );
+		standardFlagsDefault->addFlag (fo);	
+	} else
+	{
+		// SystemFlag
+		systemFlagsDefault->addFlag (fo);	
+	}
+}
+// Network Actions
+void Main::setupNetworkActions()
+{
+	if (!settings.value( "/mainwindow/showTestMenu",false).toBool() ) 
+		return;
+    QMenu *netMenu = menuBar()->addMenu(  "Network" );
+
+	QAction *a;
+
+    a = new QAction(  "Start TCPserver for MapEditor",this);
+    //a->setStatusTip ( "Set application to open pdf files"));
+	a->setShortcut ( Qt::Key_T );		//New TCP server
+    connect( a, SIGNAL( triggered() ), this, SLOT( networkStartServer() ) );
+	netMenu->addAction (a);
+
+    a = new QAction(  "Connect MapEditor to server",this);
+    //a->setStatusTip ( "Set application to open pdf files"));
+	a->setShortcut ( Qt::Key_C );		// Connect to server
+    connect( a, SIGNAL( triggered() ), this, SLOT( networkConnect() ) );
+	netMenu->addAction (a);
+}
+	
 // Settings Actions
 void Main::setupSettingsActions()
 {
-    QPopupMenu *menu = new QPopupMenu( this );
-    menuBar()->insertItem( tr( "&Settings" ), menu );
+    QMenu *settingsMenu = menuBar()->addMenu( tr( "&Settings" ));
 
 	QAction *a;
 
-
-    a = new QAction( tr( "Set application to open pdf files" ), QPixmap(), tr( "Set application to open pdf files" ), 0, this, "setPDF" );
-    connect( a, SIGNAL( activated() ), this, SLOT( settingsPDF() ) );
-    a->addTo( menu );
-
-    a = new QAction( tr( "Set application to open an URL" ), QPixmap(), tr( "Set application to open an URL" ), 0, this, "setURL" );
-    connect( a, SIGNAL( activated() ), this, SLOT( settingsURL() ) );
-    a->addTo( menu );
-
-    menu->insertSeparator();
-    a = new QAction( tr( "Edit branch after adding it" ), QPixmap(), tr( "Edit branch after adding it" ), 0, this, "autoedit" );
+    a = new QAction( tr( "Set application to open pdf files","Settings action"), this);
+    a->setStatusTip ( tr( "Set application to open pdf files"));
+    connect( a, SIGNAL( triggered() ), this, SLOT( settingsPDF() ) );
+	settingsMenu->addAction (a);
+
+    a = new QAction( tr( "Set application to open external links","Settings action"), this);
+    a->setStatusTip( tr( "Set application to open external links"));
+    connect( a, SIGNAL( triggered() ), this, SLOT( settingsURL() ) );
+	settingsMenu->addAction (a);
+
+    a = new QAction( tr( "Set path for macros","Settings action")+"...", this);
+    a->setStatusTip( tr( "Set path for macros"));
+    connect( a, SIGNAL( triggered() ), this, SLOT( settingsMacroDir() ) );
+	settingsMenu->addAction (a);
+
+    a = new QAction( tr( "Set number of undo levels","Settings action")+"...", this);
+    a->setStatusTip( tr( "Set number of undo levels"));
+    connect( a, SIGNAL( triggered() ), this, SLOT( settingsUndoLevels() ) );
+	settingsMenu->addAction (a);
+
+	settingsMenu->addSeparator();
+
+    a = new QAction( tr( "Autosave","Settings action"), this);
+    a->setStatusTip( tr( "Autosave"));
 	a->setToggleAction(true);
-	a->setOn ( settings.readBoolEntry ("/vym/mapeditor/editmode/autoedit",true) );
-    a->addTo( menu );
-	actionSettingsAutoedit=a;
-
-    a= new QAction( tr( "Select branch after adding it" ), QPixmap(), tr( "Select branch after adding it" ), 0, this, "autoselectheading" );
+	a->setOn ( settings.value ("/mainwindow/autosave/use",false).toBool());
+    connect( a, SIGNAL( triggered() ), this, SLOT( settingsAutosaveToggle() ) );
+	settingsMenu->addAction (a);
+	actionSettingsAutosaveToggle=a;
+
+    a = new QAction( tr( "Autosave time","Settings action")+"...", this);
+    a->setStatusTip( tr( "Autosave time"));
+    connect( a, SIGNAL( triggered() ), this, SLOT( settingsAutosaveTime() ) );
+	settingsMenu->addAction (a);
+	actionSettingsAutosaveTime=a;
+
+    a = new QAction( tr( "Write backup file on save","Settings action"), this);
+    a->setStatusTip( tr( "Write backup file on save"));
 	a->setToggleAction(true);
-	a->setOn ( settings.readBoolEntry ("/vym/mapeditor/editmode/autoselect",false) );
-    a->addTo( menu );
-	actionSettingsAutoselectHeading=a;
+	a->setOn ( settings.value ("/mainwindow/writeBackupFile",false).toBool());
+    connect( a, SIGNAL( triggered() ), this, SLOT( settingsWriteBackupFileToggle() ) );
+	settingsMenu->addAction (a);
+	actionSettingsWriteBackupFile=a;
+
+	settingsMenu->addSeparator();
+
+    a = new QAction( tr( "Edit branch after adding it","Settings action" ), this );
+    a->setStatusTip( tr( "Edit branch after adding it" ));
+	a->setToggleAction(true);
+	a->setOn ( settings.value ("/mapeditor/editmode/autoEditNewBranch",true).toBool());
+	settingsMenu->addAction (a);
+	actionSettingsAutoEditNewBranch=a;
+
+    a= new QAction( tr( "Select branch after adding it","Settings action" ), this );
+    a->setStatusTip( tr( "Select branch after adding it" ));
+	a->setToggleAction(true);
+	a->setOn ( settings.value ("/mapeditor/editmode/autoSelectNewBranch",false).toBool() );
+	settingsMenu->addAction (a);
+	actionSettingsAutoSelectNewBranch=a;
 	
-    a= new QAction( tr( "Select heading before editing" ), QPixmap(), tr( "Select existing heading" ), 0, this, "autoselectexistingtext" );
+    a= new QAction(tr( "Select existing heading","Settings action" ), this);
+    a->setStatusTip( tr( "Select heading before editing" ));
 	a->setToggleAction(true);
-	a->setOn ( settings.readBoolEntry ("/vym/mapeditor/editmode/autoselectexistingtext",true) );
-    a->addTo( menu );
-	actionSettingsAutoselectText=a;
+	a->setOn ( settings.value ("/mapeditor/editmode/autoSelectText",true).toBool() );
+	settingsMenu->addAction (a);
+	actionSettingsAutoSelectText=a;
 	
-    a= new QAction( tr( "Enable pasting into new branch" ), QPixmap(), tr( "Enable pasting into new branch" ), 0, this, "pastenewheading" );
+    a= new QAction( tr( "Delete key","Settings action" ), this);
+    a->setStatusTip( tr( "Delete key for deleting branches" ));
 	a->setToggleAction(true);
-	a->setOn ( settings.readBoolEntry ("/vym/mapeditor/editmode/newheadingisempty",true) );
-    a->addTo( menu );
-	actionSettingsPasteNewHeading=a;
+	a->setOn ( settings.value ("/mapeditor/editmode/useDelKey",true).toBool() );
+	settingsMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( settingsToggleDelKey() ) );
+	actionSettingsUseDelKey=a;
+
+    a= new QAction( tr( "Exclusive flags","Settings action" ), this);
+    a->setStatusTip( tr( "Use exclusive flags in flag toolbars" ));
+	a->setToggleAction(true);
+	a->setOn ( settings.value ("/mapeditor/editmode/useFlagGroups",true).toBool() );
+	settingsMenu->addAction (a);
+	actionSettingsUseFlagGroups=a;
 	
-    a= new QAction( tr( "Enable Delete key for deleting branches" ), QPixmap(), tr( "Enable Delete key" ), 0, this, "delkey" );
+    a= new QAction( tr( "Use hide flags","Settings action" ), this);
+    a->setStatusTip( tr( "Use hide flag during exports " ));
 	a->setToggleAction(true);
-	a->setOn ( settings.readBoolEntry ("/vym/mapeditor/editmode/useDelKey",false) );
-    a->addTo( menu );
-	actionSettingsUseDelKey=a;
+	a->setOn ( settings.value ("/export/useHideExport",true).toBool() );
+	settingsMenu->addAction (a);
+	actionSettingsUseHideExport=a;
+
+    a = new QAction( tr( "Animation","Settings action"), this);
+    a->setStatusTip( tr( "Animation"));
+	a->setToggleAction(true);
+	a->setOn (settings.value("/animation/use",false).toBool() );
+    connect( a, SIGNAL( triggered() ), this, SLOT( settingsToggleAnimation() ) );
+	if (settings.value( "/mainwindow/showTestMenu",false).toBool() )
+	{
+		settingsMenu->addAction (a);
+	}	
+	actionSettingsUseAnimation=a;
 }
 
 // Test Actions
 void Main::setupTestActions()
 {
-    QPopupMenu *menu = new QPopupMenu( this );
-    menuBar()->insertItem( tr( "&Test" ), menu );
+    QMenu *testMenu = menuBar()->addMenu( tr( "&Test" ));
 
     QAction *a;
-    a = new QAction( tr( "Test Flag" ), QPixmap(), tr( "test flag" ), 0, this, "flag" );
-    connect( a, SIGNAL( activated() ), this, SLOT( testFunction() ) );
-    a->addTo( menu );
-
-	a = new QAction( tr( "Show Clipboard" ), QPixmap(), tr( "Show clipboard" ), 0, this, "clipboard" );
-    connect( a, SIGNAL( activated() ), this, SLOT( testShowClipboard() ) );
-    a->addTo( menu );
+    a = new QAction( "Test function 1" , this);
+    a->setStatusTip( "Call test function 1" );
+	testMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( testFunction1() ) );
+
+    a = new QAction( "Test function 2" , this);
+    a->setStatusTip( "Call test function 2" );
+	testMenu->addAction (a);
+    connect( a, SIGNAL( triggered() ), this, SLOT( testFunction2() ) );
+
+    a = new QAction( "Command" , this);
+    a->setStatusTip( "Enter command to call in editor" );
+    connect( a, SIGNAL( triggered() ), this, SLOT( testCommand() ) );
+	testMenu->addAction (a);
 }
 
 // Help Actions
 void Main::setupHelpActions()
 {
-    QPopupMenu *menu = new QPopupMenu( this );
-    menuBar()->insertItem( tr( "&Help" ), menu );
+    QMenu *helpMenu = menuBar()->addMenu ( tr( "&Help","Help menubar entry" ));
 
     QAction *a;
-    a = new QAction( tr( "Open VYM Documentation (pdf)" ), QPixmap(), tr( "Open VYM Documentation (pdf) " ), 0, this, "about" );
-    connect( a, SIGNAL( activated() ), this, SLOT( helpDoc() ) );
-    a->addTo( menu );
-
-    a = new QAction( tr( "Information about VYM" ), QPixmap(), tr( "About VYM" ), 0, this, "about" );
-    connect( a, SIGNAL( activated() ), this, SLOT( helpAbout() ) );
-    a->addTo( menu );
-
-    a = new QAction( tr( "Information about QT toolkit" ), QPixmap(), tr( "About QT" ), 0, this, "about" );
-    connect( a, SIGNAL( activated() ), this, SLOT( helpAboutQT() ) );
-    a->addTo( menu );
+    a = new QAction(  tr( "Open VYM Documentation (pdf) ","Help action" ), this );
+    a->setStatusTip( tr( "Open VYM Documentation (pdf)" ));
+    connect( a, SIGNAL( triggered() ), this, SLOT( helpDoc() ) );
+	helpMenu->addAction (a);
+
+    a = new QAction(  tr( "Open VYM example maps ","Help action" ), this );
+    a->setStatusTip( tr( "Open VYM example maps " ));
+    connect( a, SIGNAL( triggered() ), this, SLOT( helpDemo() ) );
+	helpMenu->addAction (a);
+
+    a = new QAction( tr( "About VYM","Help action" ), this);
+    a->setStatusTip( tr( "About VYM")+vymName);
+    connect( a, SIGNAL( triggered() ), this, SLOT( helpAbout() ) );
+	helpMenu->addAction (a);
+
+    a = new QAction( tr( "About QT","Help action" ), this);
+    a->setStatusTip( tr( "Information about QT toolkit" ));
+    connect( a, SIGNAL( triggered() ), this, SLOT( helpAboutQT() ) );
+	helpMenu->addAction (a);
 }
 
 // Context Menus
@@ -772,135 +1536,146 @@
 	QAction*a;
 
 	// Context Menu for branch or mapcenter
-	branchContextMenu =new QPopupMenu (this);
-	actionEditAddBranch->addTo ( branchContextMenu );
-	actionEditAddBranchAbove->addTo ( branchContextMenu );
-	actionEditAddBranchBelow->addTo ( branchContextMenu );
+	branchContextMenu =new QMenu (this);
+	branchContextMenu->addAction (actionViewTogglePropertyWindow);
+	branchContextMenu->addSeparator();	
+
+		// Submenu "Add"
+		branchAddContextMenu =branchContextMenu->addMenu (tr("Add"));
+		branchAddContextMenu->addAction (actionEditPaste );
+		branchAddContextMenu->addAction ( actionEditAddBranch );
+		branchAddContextMenu->addAction ( actionEditAddBranchBefore );
+		branchAddContextMenu->addAction ( actionEditAddBranchAbove);
+		branchAddContextMenu->addAction ( actionEditAddBranchBelow );
+		branchAddContextMenu->addSeparator();	
+		branchAddContextMenu->addAction ( actionEditImportAdd );
+		branchAddContextMenu->addAction ( actionEditImportReplace );
+
+		// Submenu "Remove"
+		branchRemoveContextMenu =branchContextMenu->addMenu (tr ("Remove","Context menu name"));
+		branchRemoveContextMenu->addAction (actionEditCut);
+		branchRemoveContextMenu->addAction ( actionEditDelete );
+		branchRemoveContextMenu->addAction ( actionEditDeleteKeepChilds );
+		branchRemoveContextMenu->addAction ( actionEditDeleteChilds );
+		
+
 	actionEditSaveBranch->addTo( branchContextMenu );
-	branchContextMenu->insertSeparator();	
-	actionEditImportAdd->addTo ( branchContextMenu );
-	actionEditImportReplace->addTo ( branchContextMenu );
-	branchContextMenu->insertSeparator();	
-	actionEditOpenURL->addTo ( branchContextMenu );
-	actionEditURL->addTo ( branchContextMenu );
-	actionEditHeading2URL->addTo ( branchContextMenu );
-    if (settings.readBoolEntry( "/vym/mainwindow/showTestMenu",false)) 
-		actionEditBugzilla2URL->addTo( branchContextMenu );
-	branchContextMenu->insertSeparator();	
-	actionEditOpenVymLink->addTo ( branchContextMenu );
-	actionEditVymLink->addTo ( branchContextMenu );
-	actionEditDeleteVymLink->addTo ( branchContextMenu );
-	branchContextMenu->insertSeparator();	
-	actionEditLoadImage->addTo( branchContextMenu );
-	branchContextMenu->insertSeparator();	
-	actionEditCopy->addTo( branchContextMenu );
-	actionEditCut->addTo( branchContextMenu );
-	actionEditPaste->addTo( branchContextMenu );
-	branchContextMenu->insertSeparator();	
-	actionGroupFormatFrameTypes->addTo( branchContextMenu );
-
+	actionFileNewCopy->addTo (branchContextMenu );
+
+	branchContextMenu->addSeparator();	
+	branchContextMenu->addAction ( actionEditLoadImage);
+
+	// Submenu for Links (URLs, vymLinks)
+	branchLinksContextMenu =new QMenu (this);
+
+		branchContextMenu->addSeparator();	
+		branchLinksContextMenu=branchContextMenu->addMenu(tr("References (URLs, vymLinks, ...)","Context menu name"));	
+		branchLinksContextMenu->addAction ( actionEditOpenURL );
+		branchLinksContextMenu->addAction ( actionEditOpenURLTab );
+		branchLinksContextMenu->addAction ( actionEditOpenMultipleURLTabs );
+		branchLinksContextMenu->addAction ( actionEditURL );
+		branchLinksContextMenu->addAction ( actionEditLocalURL );
+		branchLinksContextMenu->addAction ( actionEditHeading2URL );
+		branchLinksContextMenu->addAction ( actionEditBugzilla2URL );
+		if (settings.value( "/mainwindow/showTestMenu",false).toBool() )
+		{
+			branchLinksContextMenu->addAction ( actionEditFATE2URL );
+		}	
+		branchLinksContextMenu->addSeparator();	
+		branchLinksContextMenu->addAction ( actionEditOpenVymLink );
+		branchLinksContextMenu->addAction ( actionEditOpenMultipleVymLinks );
+		branchLinksContextMenu->addAction ( actionEditVymLink );
+		branchLinksContextMenu->addAction ( actionEditDeleteVymLink );
+		
+
+	// Context Menu for XLinks in a branch menu
+	// This will be populated "on demand" in MapEditor::updateActions
+	branchContextMenu->addSeparator();	
+	branchXLinksContextMenuEdit =branchContextMenu->addMenu (tr ("Edit XLink","Context menu name"));
+	branchXLinksContextMenuFollow =branchContextMenu->addMenu (tr ("Follow XLink","Context menu name"));
+	connect( branchXLinksContextMenuFollow, SIGNAL( triggered(QAction *) ), this, SLOT( editFollowXLink(QAction * ) ) );
+	connect( branchXLinksContextMenuEdit, SIGNAL( triggered(QAction *) ), this, SLOT( editEditXLink(QAction * ) ) );
+ 	
+	
 	// Context menu for floatimage
-	floatimageContextMenu =new QPopupMenu (this);
-	saveImageFormatMenu=new QPopupMenu (this);
-	exportImageFormatMenu=new QPopupMenu (this);
-
-	QStrList fmt = QImage::outputFormats();
-	for (const char* f = fmt.first(); f; f = fmt.next()) 
-	{
-		saveImageFormatMenu->insertItem( f );
-		exportImageFormatMenu->insertItem( f );
-	}	
-	connect( saveImageFormatMenu, SIGNAL( activated(int) ), this, SLOT( editSaveImage(int ) ) );
-	connect( exportImageFormatMenu, SIGNAL( activated(int) ), this, SLOT( fileExportImage(int ) ) );
-	floatimageContextMenu->insertItem( tr("Save image"),saveImageFormatMenu );
-	
-	floatimageContextMenu->insertSeparator();	
+	floatimageContextMenu =new QMenu (this);
+	a= new QAction (tr ("Save image","Context action"),this);
+	connect (a, SIGNAL (triggered()), this, SLOT (editSaveImage()));
+	floatimageContextMenu->addAction (a);
+
+	floatimageContextMenu->addSeparator();	
 	actionEditCopy->addTo( floatimageContextMenu );
 	actionEditCut->addTo( floatimageContextMenu );
 
-	floatimageContextMenu->insertSeparator();	
-    a = new QAction( tr( "Use for Export" ), QPixmap(), tr( "Use for Export"), 0, this, "useForExport" );
-	a->setToggleAction(true);
-    connect( a, SIGNAL( activated() ), this, SLOT( editToggleFloatExport() ) );
-    a->addTo( floatimageContextMenu);
-	actionEditToggleFloatExport=a;
-
-
-
-	// Context menu for exports
-	exportMenu->insertItem ( tr("Export map as image"),exportImageFormatMenu);
-
-    a = new QAction( tr( "Export as ASCII (still experimental)" ), QPixmap(), tr( "Export (ASCII)" ), 0, this, "exportASCII" );
-    connect( a, SIGNAL( activated() ), this, SLOT( fileExportASCII() ) );
-    a->addTo( exportMenu );
-
-	a = new QAction( tr( "Export XML" ), QPixmap(), tr( "Export XML" ),  0, this, "exportXML" );
-    connect( a, SIGNAL( activated() ), this, SLOT( fileExportXML() ) );
-    a->addTo( exportMenu );
-	
-    if (settings.readBoolEntry( "/vym/mainwindow/showTestMenu",false)) 
-	{
-		a = new QAction( tr( "Export HTML" ), QPixmap(), tr( "Export HTML" ), 0, this, "exportHTML" );
-		connect( a, SIGNAL( activated() ), this, SLOT( fileExportHTML() ) );
-		a->addTo( exportMenu );
-	}
-
-	a = new QAction( tr( "Export XHTML" ), QPixmap(), tr( "Export XHTML" ), ALT + Key_X, this, "exportXHTML" );
-    connect( a, SIGNAL( activated() ), this, SLOT( fileExportXHTML() ) );
-    a->addTo( exportMenu );
+	floatimageContextMenu->addSeparator();	
+	floatimageContextMenu->addAction ( actionFormatHideLinkUnselected );
 
 	
 	// Context menu for canvas
-	canvasContextMenu =new QPopupMenu (this);
+	canvasContextMenu =new QMenu (this);
 	actionEditMapInfo->addTo( canvasContextMenu );
+	if (settings.value( "/mainwindow/showTestMenu",false).toBool() ) 
+		actionEditAddMapCenter->addTo( canvasContextMenu );
 	canvasContextMenu->insertSeparator();	
 	actionGroupFormatLinkStyles->addTo( canvasContextMenu );
 	canvasContextMenu->insertSeparator();	
 	actionFormatLinkColorHint->addTo( canvasContextMenu );
 	actionFormatLinkColor->addTo( canvasContextMenu );
+	actionFormatSelectionColor->addTo( canvasContextMenu );
 	actionFormatBackColor->addTo( canvasContextMenu );
+	// actionFormatBackImage->addTo( canvasContextMenu );  //FIXME makes vym too slow: postponed for later version 
 
 	// Menu for last opened files
-	// Read settings initially
-	QString s;
-	int j=settings.readNumEntry( "/vym/lastMaps/number",0);
-	for (int i=1;i<=j;i++)
+	// Create actions
+	for (int i = 0; i < MaxRecentFiles; ++i) 
 	{
-		s=settings.readEntry(QString("/vym/lastMaps/map-%1").arg(i),"");
-		if (!s.isEmpty() && j<=maxLastMaps) 
-			lastMaps.append(s);
-	}
-	setupLastMapsMenu();
-	connect( lastMapsMenu, SIGNAL( activated(int) ), this, SLOT( fileLoadLast(int ) ) );
+        recentFileActions[i] = new QAction(this);
+        recentFileActions[i]->setVisible(false);
+        fileLastMapsMenu->addAction(recentFileActions[i]);
+        connect(recentFileActions[i], SIGNAL(triggered()),
+                this, SLOT(fileLoadRecent()));
+    }
+	setupRecentMapsMenu();
 }
 
-void Main::setupLastMapsMenu()
+void Main::setupRecentMapsMenu()
 {
-	// Remove double entries
-	QStringList::Iterator it=lastMaps.begin();
-	QStringList::Iterator jt;
-	while (it!=lastMaps.end() )
+    QStringList files = settings.value("/mainwindow/recentFileList").toStringList();
+
+    int numRecentFiles = qMin(files.size(), (int)MaxRecentFiles);
+
+    for (int i = 0; i < numRecentFiles; ++i) {
+        QString text = tr("&%1 %2").arg(i + 1).arg(files[i]);
+        recentFileActions[i]->setText(text);
+        recentFileActions[i]->setData(files[i]);
+        recentFileActions[i]->setVisible(true);
+    }
+    for (int j = numRecentFiles; j < MaxRecentFiles; ++j)
+        recentFileActions[j]->setVisible(false);
+}
+
+void Main::setupMacros()
+{
+    for (int i = 0; i <= 11; i++) 
 	{
-		jt=it;
-		++jt;
-		while (jt!=lastMaps.end() )
-		{
-			if (*it == *jt)		
-				jt=lastMaps.remove(jt);
-			else	
-				jt++;
-		}
-		it++;
-	}	
-
-	// Limit length of list to maxLastMaps
-	while ((int)(lastMaps.count()) > maxLastMaps) lastMaps.pop_back();
-	
-	// build Menu from lastMaps string list
-	lastMapsMenu->clear();
-	for (it = lastMaps.begin(); it != lastMaps.end(); ++it ) 
-		lastMapsMenu->insertItem (*it );
-		
+        macroActions[i] = new QAction(this);
+        macroActions[i]->setData(i);
+        addAction (macroActions[i]);
+        connect(macroActions[i], SIGNAL(triggered()),
+                this, SLOT(callMacro()));
+	}			
+	macroActions[0]->setShortcut ( Qt::Key_F1 );
+	macroActions[1]->setShortcut ( Qt::Key_F2 );
+	macroActions[2]->setShortcut ( Qt::Key_F3 );
+	macroActions[3]->setShortcut ( Qt::Key_F4 );
+	macroActions[4]->setShortcut ( Qt::Key_F5 );
+	macroActions[5]->setShortcut ( Qt::Key_F6 );
+	macroActions[6]->setShortcut ( Qt::Key_F7 );
+	macroActions[7]->setShortcut ( Qt::Key_F8 );
+	macroActions[8]->setShortcut ( Qt::Key_F9 );
+	macroActions[9]->setShortcut ( Qt::Key_F10 );
+	macroActions[10]->setShortcut ( Qt::Key_F11 );
+	macroActions[11]->setShortcut ( Qt::Key_F12 );
 }
 
 void Main::hideEvent (QHideEvent * )
@@ -910,51 +1685,9 @@
 
 void Main::showEvent (QShowEvent * )
 {
-	if (textEditor->showWithMain()) textEditor->show();
+	if (actionViewToggleNoteEditor->isOn()) textEditor->showNormal();
 }
 
-bool Main::reallyWriteDirectory(const QString &dir)
-{
-	QStringList eList = QDir(dir).entryList();
-	if (eList.first() ==".")  eList.pop_front();	// remove "."
-	if (eList.first() =="..") eList.pop_front();	// remove "."
-	if (!eList.isEmpty())
-	{
-		QMessageBox mb( "VYM",
-			tr("The directory ") + dir + 
-			tr(" is not empty. Do you risk to overwrite its contents?"),
-		QMessageBox::Warning,
-		QMessageBox::Yes ,
-		QMessageBox::Cancel | QMessageBox::Default,
-		QMessageBox::QMessageBox::NoButton );
-
-		mb.setButtonText( QMessageBox::Yes, tr("Overwrite") );
-		mb.setButtonText( QMessageBox::No, tr("Cancel"));
-		switch( mb.exec() ) 
-		{
-			case QMessageBox::Yes:
-				// save 
-				return true;
-			case QMessageBox::Cancel:
-				// do nothing
-				return false;
-		}
-	}
-	return true;
-}
-
-QString Main::browseDirectory (const QString &caption)
-{
-	QFileDialog fd(this,caption);
-	fd.setMode (QFileDialog::DirectoryOnly);
-	fd.setCaption("VYM - "+caption);
-	fd.show();
-	
-	if ( fd.exec() == QDialog::Accepted )
-		return fd.selectedFile();
-	else
-		return "";
-}
 
 MapEditor* Main::currentMapEditor() const
 {
@@ -964,49 +1697,64 @@
     return NULL;	
 }
 
-//TODO not used now, maybe use this for overview window later
-void Main::newView() 
-{
-    // Open a new view... have it delete when closed.
-    Main *m = new Main(0, 0, WDestructiveClose);
-    qApp->setMainWidget(m);
-    m->show();
-    qApp->setMainWidget(0);
-}
 
 void Main::editorChanged(QWidget *)
 {
 	// Unselect all possibly selected objects
 	// (Important to update note editor)
-	int i;
 	MapEditor *me;
-	for (i=0;i<=tabWidget->count() -1;i++)
+	for (int i=0;i<=tabWidget->count() -1;i++)
 	{
-		
 		me=(MapEditor*)tabWidget->page(i);
 		me->unselect();
 	}	
-	currentMapEditor()->reselect();
+	me=currentMapEditor();
+	if (me) me->reselect();
 
 	// Update actions to in menus and toolbars according to editor
-	currentMapEditor()->updateActions();
+	updateActions();
 }
 
 void Main::fileNew()
 {
 	QString fn="unnamed";
-	MapEditor* medit = new MapEditor (tabWidget, true);
-	tabWidget->addTab (medit,fn);
-	tabWidget->showPage(medit);
-	medit->viewport()->setFocus();
-	medit->select("mc:");
+	MapEditor* me = new MapEditor ( NULL);
+	tabWidget->addTab (me,fn);
+	tabWidget->showPage(me);
+	me->viewport()->setFocus();
+	me->setAntiAlias (actionViewToggleAntiAlias->isOn());
+	me->setSmoothPixmap(actionViewToggleSmoothPixmapTransform->isOn());
+	
+	// For the very first map we do not have flagrows yet...
+	me->select("mc:");
 }
 
-void Main::fileLoad(QString fn, const LoadMode &lmode)
+void Main::fileNewCopy()
 {
-	// Error codes
-	enum errorCode {success,aborted};
-	errorCode err=success;
+	QString fn="unnamed";
+	MapEditor* oldME =currentMapEditor();
+	if (oldME)
+	{
+		oldME->copy();
+		MapEditor* newME = new MapEditor ( NULL);
+		if (newME)
+		{
+			tabWidget->addTab (newME,fn);
+			tabWidget->showPage(newME);
+			newME->viewport()->setFocus();
+			newME->setAntiAlias (actionViewToggleAntiAlias->isOn());
+			newME->setSmoothPixmap(actionViewToggleSmoothPixmapTransform->isOn());
+			// For the very first map we do not have flagrows yet...
+			newME->select("mc:");
+			newME->load (clipboardDir+"/"+clipboardFile,ImportReplace, VymMap);
+		}
+
+	}
+}
+
+ErrorCode Main::fileLoad(QString fn, const LoadMode &lmode, const FileType &ftype)
+{
+	ErrorCode err=success;
 	
 	// fn is usually the archive, mapfile the file after uncompressing
 	QString mapfile;
@@ -1026,15 +1774,15 @@
 			if (me->getFilePath() == fn)
 			{
 				// Already there, ask for confirmation
-				QMessageBox mb( "VYM",
-					tr("The map ") + fn + tr ("\n is already opened."
+				QMessageBox mb( vymName,
+					tr("The map %1\nis already opened."
 					"Opening the same map in multiple editors may lead \n"
 					"to confusion when finishing working with vym."
-					"Do you want to"),
+					"Do you want to").arg(fn),
 					QMessageBox::Warning,
 					QMessageBox::Yes | QMessageBox::Default,
 					QMessageBox::Cancel | QMessageBox::Escape,
-					QMessageBox::QMessageBox::NoButton);
+					QMessageBox::NoButton);
 				mb.setButtonText( QMessageBox::Yes, tr("Open anyway") );
 				mb.setButtonText( QMessageBox::Cancel, tr("Cancel"));
 				switch( mb.exec() ) 
@@ -1045,7 +1793,7 @@
 						break;
 					case QMessageBox::Cancel:
 						// do nothing
-						return;
+						return aborted;
 						break;
 				}
 			}
@@ -1064,23 +1812,26 @@
 		// create a new mapeditor in a new tab
 		if ( lmode==NewMap && (!me || !me->isDefault() ) )
 		{
-			me = new MapEditor (tabWidget,true);
+			me= new MapEditor ( NULL);
 			tabWidget->addTab (me,fn);
 			tabIndex=tabWidget->indexOf (me);
 			tabWidget->setCurrentPage (tabIndex);
+			me->setAntiAlias (actionViewToggleAntiAlias->isOn());
+			me->setSmoothPixmap(actionViewToggleSmoothPixmapTransform->isOn());
 		}
 		
 		// Check, if file exists (important for creating new files
 		// from command line
+		/*
+		*/
 		if (!QFile(fn).exists() )
 		{
-			QMessageBox mb( "VYM",
-				tr("The map") + fn + 
-				tr(" does not exist.\n Do you want to create a new one?"),
+			QMessageBox mb( vymName,
+				tr("This map does not exist:\n  %1\nDo you want to create a new one?").arg(fn),
 				QMessageBox::Question,
 				QMessageBox::Yes ,
 				QMessageBox::Cancel | QMessageBox::Default,
-				QMessageBox::QMessageBox::NoButton );
+				QMessageBox::NoButton );
 
 			mb.setButtonText( QMessageBox::Yes, tr("Create"));
 			mb.setButtonText( QMessageBox::No, tr("Cancel"));
@@ -1092,162 +1843,78 @@
 					tabWidget->setTabLabel (currentMapEditor(),
 						currentMapEditor()->getFileName() );
 					statusBar()->message( "Created " + fn , statusbarTime );
-					return;
+					return success;
 						
 				case QMessageBox::Cancel:
 					// don't create new map
 					statusBar()->message( "Loading " + fn + " failed!", statusbarTime );
 					fileCloseMap();
-					return;
+					return aborted;
 			}
 		}	
 
-
 		//tabWidget->currentPage() won't be NULL here, because of above...
 		tabWidget->showPage(me);
 		me->viewport()->setFocus();
 
-		// Create temporary directory for packing
-		char tmpdir1[]="/tmp/vym-XXXXXX";	
-		QString tmpMapDir=mkdtemp(tmpdir1);
-
-		// Try to unzip file
-		Process *zipProc=new Process ();
-		zipProc->clearArguments();
-		zipProc->setWorkingDirectory (QDir(tmpMapDir));
-		zipProc->addArgument ("unzip");
-		zipProc->addArgument (fn );
-		zipProc->addArgument ("-d");
-		zipProc->addArgument (tmpMapDir);
-
-		if (!zipProc->start() )
+		if (err!=aborted)
 		{
-			QMessageBox::critical( 0, tr( "Critical Load Error" ),
-						   tr("Couldn't start unzip to decompress data."));
-			err=aborted;
-			
-		} else
+			// Save existing filename in case  we import
+			QString fn_org=me->getFilePath();
+
+			// Finally load map into mapEditor
+			me->setFilePath (fn);
+			err=me->load(fn,lmode,ftype);
+
+			// Restore old (maybe empty) filepath, if this is an import
+			if (lmode!=NewMap)
+				me->setFilePath (fn_org);
+		}	
+
+		// Finally check for errors and go home
+		if (err==aborted) 
 		{
-			zipProc->waitFinished();
-			if (!zipProc->normalExit() )
-			{
-				QMessageBox::critical( 0, tr( "Critical Load Error" ),
-							   tr("unzip didn't exit normally") +
-							   zipProc->getErrout() );
-				err=aborted;
-			} else
-			{
-				if (zipProc->exitStatus()>0)
-				{
-					if (zipProc->exitStatus()==9)
-					{
-						// no zipped file, but maybe .xml or old version? Try again.
-						mapfile=fn;
-						me->setZipped(false);
-					}	
-					else	
-					{
-						QMessageBox::critical( 0, tr( "Critical Load Error" ),
-									   QString("unzip exit code:  %1").arg(zipProc->exitStatus() ) +
-									   zipProc->getErrout() );
-						err=aborted;
-					}
-				} else
-				{	// Uncompressing was successfull,
-					// load from uncompressed temporary directory
-
-					me->setZipped(true);
-
-					
-					// Look for mapname.xml
-					mapfile= fn.left(fn.findRev(".",-1,true));
-					mapfile=mapfile.section( '/', -1 );
-					QFile file( tmpMapDir + "/" + mapfile + ".xml");
-					if (!file.exists() )
-					{
-						// mapname.xml does not exist, well, 
-						// maybe some renamed the mapname.vym file...
-						// Try to find any .xml in the toplevel 
-						// directory of the .vym file
-						QStringList flist=QDir (tmpMapDir).entryList("*.xml");
-						if (flist.count()==1) 
-						{
-							// Only one entry, take this one
-							mapfile=tmpMapDir + "/"+flist.first();
-						} else
-						{
-							for ( QStringList::Iterator it = flist.begin(); it != flist.end(); ++it ) 
-								*it=tmpMapDir + "/" + *it;
-							// FIXME	
-							// Multiple entries, load all (but only the first one into this ME)
-							//mainWindow->fileLoadFromTmp (flist);
-							//returnCode=1;	// Silently forget this attempt to load
-							qWarning ("MainWindow::load (fn)  multimap found...");
-						}	
-							
-						if (flist.isEmpty() )
-						{
-							QMessageBox::critical( 0, tr( "Critical Load Error" ),
-									   tr("Couldn't find a map (*.xml) in .vym archive.\n"));
-							err=aborted;				   
-						}	
-					} //file doesn't exist	
-					else
-						mapfile=file.name();
-				} // Uncompressing successfull
-			}
-		}
-
-		// Finally load map into mapEditor
-		me->setFilePath (mapfile,fn);
-		if (me->load(mapfile,lmode))
-			err=aborted;
-
-		// Delete tmpDir
-		system ( "rm -rf "+tmpMapDir);
-
-		// Check for errors
-		if (err==success) 
+			if (lmode==NewMap) fileCloseMap();
+			statusBar()->message( "Could not load " + fn, statusbarTime );
+		} else 
 		{
 			if (lmode==NewMap)
 			{
 				me->setFilePath (fn);
 				tabWidget->changeTab(tabWidget->page(tabIndex), me->getFileName());
-				lastMaps.prepend(me->getFilePath() );
-				setupLastMapsMenu();
+				if (!isInTmpDir (fn))
+				{
+					// Only append to lastMaps if not loaded from a tmpDir
+					// e.g. imported bookmarks are in a tmpDir
+					addRecentMap(me->getFilePath() );
+				}
 				actionFilePrint->setEnabled (true);
 			}	
 			statusBar()->message( "Loaded " + fn, statusbarTime );
-			return;
-		} else 
-		{
-			if (lmode==NewMap)
-				fileCloseMap();
 		}	
-
-
 	}
-	statusBar()->message( "Could not load " + fn, statusbarTime );
+	return err;
 }
 
 
 void Main::fileLoad(const LoadMode &lmode)
 {
+	QStringList filters;
+	filters <<"VYM map (*.vym *.vyp)"<<"XML (*.xml)";
 	QFileDialog *fd=new QFileDialog( this);
-	if (!lastFileDir.isEmpty()) 
-		fd->setDir (lastFileDir);
-	fd->addFilter ("XML (*.xml)");
-	fd->addFilter ("VYM map (*.vym *.vyp)");
+	fd->setDir (lastFileDir);
+	fd->setFileMode (QFileDialog::ExistingFiles);
+	fd->setFilters (filters);
 	switch (lmode)
 	{
 		case NewMap:
-			fd->setCaption(tr("Load vym map"));
+			fd->setCaption(vymName+ " - " +tr("Load vym map"));
 			break;
 		case ImportAdd:
-			fd->setCaption(tr("Import: Add vym map to selection"));
+			fd->setCaption(vymName+ " - " +tr("Import: Add vym map to selection"));
 			break;
 		case ImportReplace:
-			fd->setCaption(tr("Import: Replace selection with vym map"));
+			fd->setCaption(vymName+ " - " +tr("Import: Replace selection with vym map"));
 			break;
 	}
 	fd->show();
@@ -1255,10 +1922,17 @@
 	QString fn;
 	if ( fd->exec() == QDialog::Accepted )
 	{
-		lastFileDir=fd->dirPath();
-        fn = fd->selectedFile();
-		fileLoad(fn, lmode);				   
+		lastFileDir=fd->directory().path();
+	    QStringList flist = fd->selectedFiles();
+		QStringList::Iterator it = flist.begin();
+		while( it != flist.end() ) 
+		{
+			fn = *it;
+			fileLoad(*it, lmode);				   
+			++it;
+		}
 	}
+	delete (fd);
 }
 
 void Main::fileLoad()
@@ -1266,182 +1940,84 @@
 	fileLoad (NewMap);
 }
 
-void Main::fileLoadLast(int i)
+void Main::fileLoadRecent()
 {
-	fileLoad(*lastMaps.at(lastMapsMenu->indexOf (i) ),NewMap);			   
+    QAction *action = qobject_cast<QAction *>(sender());
+    if (action)
+        fileLoad (action->data().toString(), NewMap);
 }
 
-void Main::fileSave(const SaveMode &savemode)
+void Main::addRecentMap (const QString &fileName)
 {
-	// tmp dir for zipping 
-	QString tmpMapDir;
-	
-	// Error codes
-	enum errorCode {success,aborted};
-	errorCode err=success;
-	
-	QString safeFilePath;
-
-	bool saveZipped=currentMapEditor()->saveZipped();
-
-	if (currentMapEditor())
+
+    QStringList files = settings.value("/mainwindow/recentFileList").toStringList();
+    files.removeAll(fileName);
+    files.prepend(fileName);
+    while (files.size() > MaxRecentFiles)
+        files.removeLast();
+
+    settings.setValue("/mainwindow/recentFileList", files);
+
+	setupRecentMapsMenu();
+}
+
+void Main::fileSave(MapEditor *me, const SaveMode &savemode)
+{
+	if (!me) return;
+
+	if ( me->getFilePath().isEmpty() ) 
 	{
-		QString fn=currentMapEditor()->getFilePath();
-		// filename=unnamed, filepath="" in constructor...
-		if ( !fn.isEmpty() ) 
-		{	
-			// We have a filepath, go on saving			
-			// First remove existing file, we 
-			// don't want to add to old zip archives
-			QFile f(fn);
-			if (f.exists() ) 
-				if (!f.remove())
-					QMessageBox::warning( 0, tr( "Save Error" ),
-						fn+   tr("\ncould not be removed before saving"));
-
-			// Look, if we should zip the data:
-			if (!saveZipped)
-			{
-				QMessageBox mb( "VYM",
-					tr("The map ") + fn + 
-					tr ("\ndid not use the compressed "
-					"vym file format.\nWriting it uncompressed will also write images \n"
-					"and flags and thus may overwrite files in the "
-					"given directory\n\nDo you want to write the map"),
-					QMessageBox::Warning,
-					QMessageBox::Yes | QMessageBox::Default,
-					QMessageBox::No ,
-					QMessageBox::Cancel | QMessageBox::Escape);
-				mb.setButtonText( QMessageBox::Yes, tr("compressed (vym default)") );
-				mb.setButtonText( QMessageBox::No, tr("uncompressed") );
-				mb.setButtonText( QMessageBox::Cancel, tr("Cancel"));
-				switch( mb.exec() ) 
-				{
-					case QMessageBox::Yes:
-						// save compressed (default file format)
-						saveZipped=true;
-						break;
-					case QMessageBox::No:
-						// save uncompressed
-						saveZipped=false;
-						break;
-					case QMessageBox::Cancel:
-						// do nothing
-						return;
-						break;
-				}
-			}
-
-			if (saveZipped)
-			{
-				char tmpdir1[]="/tmp/vym-XXXXXX";	
-				tmpMapDir=mkdtemp(tmpdir1);
-			
-				safeFilePath=currentMapEditor()->getFilePath();
-				currentMapEditor()->setFilePath (tmpMapDir+"/"+
-					currentMapEditor()->getMapName()+ ".xml",
-					safeFilePath);
-				currentMapEditor()->save (savemode);
-				currentMapEditor()->setFilePath (safeFilePath);
-				
-				// zip the temporary directory
-				Process *zipProc=new Process ();
-				zipProc->clearArguments();
-				zipProc->setWorkingDirectory (QDir(tmpMapDir));
-				zipProc->addArgument ("zip");
-				zipProc->addArgument ("-r");
-				zipProc->addArgument (fn);
-				zipProc->addArgument (".");
-
-				if (!zipProc->start() )
-				{	
-					// zip could not be started
-					QMessageBox::critical( 0, tr( "Critical Save Error" ),
-								   tr("Couldn't start zip to compress data."));
-					err=aborted;
-				} else
-				{
-					// zip could be started
-					zipProc->waitFinished();
-					if (!zipProc->normalExit() )
-					{
-						QMessageBox::critical( 0, tr( "Critical Save Error" ),
-									   tr("zip didn't exit normally")+
-									   "\n" + zipProc->getErrout());
-						err=aborted;
-					} else
-					{
-						if (zipProc->exitStatus()>0)
-						{
-							QMessageBox::critical( 0, tr( "Critical Save Error" ),
-									   QString("zip exit code:  %1").arg(zipProc->exitStatus() )+
-									   "\n" + zipProc->getErrout() );
-							err=aborted;
-						}
-					}
-				}	// zip could be started
-			} // save zipped
-			else
-			{
-				// Save unzipped. 
-				safeFilePath=currentMapEditor()->getFilePath();
-				currentMapEditor()->setFilePath (fn, safeFilePath);
-				currentMapEditor()->save (savemode);
-				currentMapEditor()->setFilePath (safeFilePath);
-			} // save zipped 	
-		} // filepath available
-		else
-		{
-			// We have  no filepath yet,
-			// call fileSaveAs() now, this will call fileSave() 
-			// again.
-			fileSaveAs(savemode);
-		}
-    }
-
-	if (currentMapEditor()->saveZipped())
+		// We have  no filepath yet,
+		// call fileSaveAs() now, this will call fileSave() 
+		// again.
+		// First switch to editor
+		tabWidget->setCurrentWidget (me);
+		fileSaveAs(savemode);
+	}
+
+	if (me->save (savemode)==success)
 	{
-		// Delete tmpDir
-		system ( "rm -rf "+ tmpMapDir );
-	} 
-
-	if (err==success)
 		statusBar()->message( 
-			tr("Saved")+" " + currentMapEditor()->getFilePath(), 
+			tr("Saved  %1").arg(me->getFilePath()), 
 			statusbarTime );
-	else		
+		addRecentMap (me->getFilePath() );
+	} else		
 		statusBar()->message( 
-			tr("Couldn't save")+" " + currentMapEditor()->getFilePath(), 
+			tr("Couldn't save ").arg(me->getFilePath()), 
 			statusbarTime );
 }
 
 void Main::fileSave()
 {
-	fileSave (CompleteMap);
+	fileSave (currentMapEditor(), CompleteMap);
+}
+
+void Main::fileSave(MapEditor *me)
+{
+	fileSave (me,CompleteMap);
 }
 
 void Main::fileSaveAs(const SaveMode& savemode)
 {
-	QString tmpMapDir;
 	QString fn;
 
 	if (currentMapEditor())
 	{
 		if (savemode==CompleteMap)
-			fn = QFileDialog::getSaveFileName( QString::null, "VYM map (*.vym)", this );
+			fn = Q3FileDialog::getSaveFileName( QString::null, "VYM map (*.vym)", this );
 		else		
-			fn = QFileDialog::getSaveFileName( QString::null, "VYM part of map (*.vyp)", this );
+			fn = Q3FileDialog::getSaveFileName( QString::null, "VYM part of map (*.vyp)", this );
 		if ( !fn.isEmpty() ) 
 		{
 			// Check for existing file
 			if (QFile (fn).exists())
 			{
-				QMessageBox mb( "VYM",
-					tr("The file ") + fn + tr ("\nexists already. Do you want to"),
+				QMessageBox mb( vymName,
+					tr("The file %1\nexists already. Do you want to").arg(fn),
 					QMessageBox::Warning,
 					QMessageBox::Yes | QMessageBox::Default,
 					QMessageBox::Cancel | QMessageBox::Escape,
-					QMessageBox::QMessageBox::NoButton);
+					QMessageBox::NoButton);
 				mb.setButtonText( QMessageBox::Yes, tr("Overwrite") );
 				mb.setButtonText( QMessageBox::Cancel, tr("Cancel"));
 				switch( mb.exec() ) 
@@ -1474,11 +2050,12 @@
 
 			// Save now
 			currentMapEditor()->setFilePath(fn);
-			fileSave(savemode);
+			fileSave(currentMapEditor(), savemode);
 
 			// Set name of tab
-			tabWidget->setTabLabel (currentMapEditor(),
-				currentMapEditor()->getFileName() );
+			if (savemode==CompleteMap)
+				tabWidget->setTabLabel (currentMapEditor(),
+					currentMapEditor()->getFileName() );
 			return;
 		} 
 	}
@@ -1489,102 +2066,243 @@
 	fileSaveAs (CompleteMap);
 }
 
+void Main::fileImportKDEBookmarks()
+{
+	ImportKDEBookmarks im;
+	im.transform();
+	if (success==fileLoad (im.getTransformedFile(),NewMap) && currentMapEditor() )
+		currentMapEditor()->setFilePath ("");
+}
+
+void Main::fileImportFirefoxBookmarks()
+{
+	Q3FileDialog *fd=new Q3FileDialog( this);
+	fd->setDir (vymBaseDir.homeDirPath()+"/.mozilla/firefox");
+	fd->setMode (Q3FileDialog::ExistingFiles);
+	fd->addFilter ("Firefox "+tr("Bookmarks")+" (*.html)");
+	fd->setCaption(tr("Import")+" "+"Firefox "+tr("Bookmarks"));
+	fd->show();
+
+	if ( fd->exec() == QDialog::Accepted )
+	{
+		ImportFirefoxBookmarks im;
+	    QStringList flist = fd->selectedFiles();
+		QStringList::Iterator it = flist.begin();
+		while( it != flist.end() ) 
+		{
+			im.setFile (*it);
+			if (im.transform() && 
+				success==fileLoad (im.getTransformedFile(),NewMap,FreemindMap) && 
+				currentMapEditor() )
+				currentMapEditor()->setFilePath ("");
+			++it;
+		}
+	}
+	delete (fd);
+}
+
+void Main::fileImportFreemind()
+{
+	QStringList filters;
+	filters <<"Freemind map (*.mm)"<<"All files (*)";
+	QFileDialog *fd=new QFileDialog( this);
+	fd->setDir (lastFileDir);
+	fd->setFileMode (QFileDialog::ExistingFiles);
+	fd->setFilters (filters);
+	fd->setCaption(vymName+ " - " +tr("Load Freemind map"));
+	fd->show();
+
+	QString fn;
+	if ( fd->exec() == QDialog::Accepted )
+	{
+		lastFileDir=fd->directory().path();
+	    QStringList flist = fd->selectedFiles();
+		QStringList::Iterator it = flist.begin();
+		while( it != flist.end() ) 
+		{
+			fn = *it;
+			if ( fileLoad (fn,NewMap, FreemindMap)  )
+			{	
+				currentMapEditor()->setFilePath ("");
+			}	
+			++it;
+		}
+	}
+	delete (fd);
+}
+
+
+void Main::fileImportMM()
+{
+	ImportMM im;
+
+	Q3FileDialog *fd=new Q3FileDialog( this);
+	fd->setDir (lastFileDir);
+	fd->setMode (Q3FileDialog::ExistingFiles);
+	fd->addFilter ("Mind Manager (*.mmap)");
+	fd->setCaption(tr("Import")+" "+"Mind Manager");
+	fd->show();
+
+	if ( fd->exec() == QDialog::Accepted )
+	{
+		lastFileDir=fd->dirPath();
+	    QStringList flist = fd->selectedFiles();
+		QStringList::Iterator it = flist.begin();
+		while( it != flist.end() ) 
+		{
+			im.setFile (*it);
+			if (im.transform() && 
+				success==fileLoad (im.getTransformedFile(),NewMap) && 
+				currentMapEditor() )
+				currentMapEditor()->setFilePath ("");
+
+			++it;
+		}
+	}
+	delete (fd);
+
+}
+
 void Main::fileImportDir()
 {
 	if (currentMapEditor())
 		currentMapEditor()->importDir();	
 }
 
-void Main::fileExportXML()
+void Main::fileExportXML()	
 {
-	if (currentMapEditor())
+	MapEditor *me=currentMapEditor();
+	if (me) me->exportXML();
+}
+
+
+void Main::fileExportXHTML()	
+{
+	MapEditor *me=currentMapEditor();
+	if (me) me->exportXHTML();
+}
+
+void Main::fileExportImage()	
+{
+	MapEditor *me=currentMapEditor();
+	if (me) me->exportImage();
+}
+
+void Main::fileExportASCII()
+{
+	MapEditor *me=currentMapEditor();
+	if (me) me->exportASCII();
+}
+
+void Main::fileExportCSV()	//FIXME not scriptable yet
+{
+	MapEditor *me=currentMapEditor();
+	if (me)
 	{
-		QString dir=browseDirectory(tr("Export XML to directory"));
-		if (dir !="" && reallyWriteDirectory(dir) )
-			currentMapEditor()->exportXML(dir);
+		ExportCSV ex;
+		ex.setModel (me->getModel());
+		ex.addFilter ("CSV (*.csv)");
+		ex.setDir(lastImageDir);
+		ex.setCaption(vymName+ " -" +tr("Export as CSV")+" "+tr("(still experimental)"));
+		if (ex.execDialog() ) 
+		{
+			me->setExportMode(true);
+			ex.doExport();
+			me->setExportMode(false);
+		}
+	}
+}
+
+void Main::fileExportLaTeX()	//FIXME not scriptable yet
+{
+	MapEditor *me=currentMapEditor();
+	if (me)
+	{
+		ExportLaTeX ex;
+		ex.setModel (me->getModel());
+		ex.addFilter ("Tex (*.tex)");
+		ex.setDir(lastImageDir);
+		ex.setCaption(vymName+ " -" +tr("Export as LaTeX")+" "+tr("(still experimental)"));
+		if (ex.execDialog() ) 
+		{
+			me->setExportMode(true);
+			ex.doExport();
+			me->setExportMode(false);
+		}
+	}
+}
+
+void Main::fileExportKDEBookmarks()	//FIXME not scriptable yet
+{
+	ExportKDEBookmarks ex;
+	MapEditor *me=currentMapEditor();
+	if (me)
+	{
+		ex.setModel (me->getModel());
+		ex.doExport();
 	}	
 }
 
-void Main::fileExportHTML()
+void Main::fileExportTaskjuggler()	//FIXME not scriptable yet
 {
-	if (currentMapEditor())
+	ExportTaskjuggler ex;
+	MapEditor *me=currentMapEditor();
+	if (me)
 	{
-		ExportHTMLDialog dia(this);
-		
-		if (dia.exec()==QDialog::Accepted)
+		ex.setModel (me->getModel());
+		ex.setCaption ( vymName+" - "+tr("Export to")+" Taskjuggler"+tr("(still experimental)"));
+		ex.setDir(lastImageDir);
+		ex.addFilter ("Taskjuggler (*.tjp)");
+		if (ex.execDialog() ) 
 		{
-			QString dir=dia.getDir();
-			if (reallyWriteDirectory(dir) )
-			{
-				currentMapEditor()->exportXML (dia.getDir() );
-				dia.doExport(currentMapEditor()->getMapName() );
-			}	
+			me->setExportMode(true);
+			ex.doExport();
+			me->setExportMode(false);
 		}
 	}	
 }
 
-void Main::fileExportXHTML()
+void Main::fileExportOOPresentation()	//FIXME not scriptable yet
 {
-	QString dir;
-	if (currentMapEditor())
+	ExportOOFileDialog *fd=new ExportOOFileDialog( this,vymName+" - "+tr("Export to")+" Open Office");
+	// TODO add preview in dialog
+	//ImagePreview *p =new ImagePreview (fd);
+	//fd->setContentsPreviewEnabled( TRUE );
+	//fd->setContentsPreview( p, p );
+	//fd->setPreviewMode( QFileDialog::Contents );
+	fd->setCaption(vymName+" - " +tr("Export to")+" Open Office");
+	fd->setDir (QDir().current());
+	if (fd->foundConfig())
 	{
-		ExportXHTMLDialog dia(this);
-		dia.setFilePath (currentMapEditor()->getFilePath() );
-		dia.setMapName (currentMapEditor()->getMapName() );
-		dia.readSettings();
-		
-		if (dia.exec()==QDialog::Accepted)
+		fd->show();
+
+		if ( fd->exec() == QDialog::Accepted )
 		{
-			QString dir=dia.getDir();
-			// Check, if warnings should be used before overwriting
-			// the output directory
-			bool ok;
-			if (dia.warnings()) 
-				ok=reallyWriteDirectory(dir);
-			else
-				ok=true;
-
-			if (ok)
-			{
-				currentMapEditor()->exportXML (dia.getDir() );
-				dia.doExport(currentMapEditor()->getMapName() );
-				if (dia.hasChanged())
-					currentMapEditor()->setChanged();
-			}	
+			QString fn=fd->selectedFile();
+			if (!fn.contains (".odp"))
+				fn +=".odp";
+
+			//lastImageDir=fn.left(fn.findRev ("/"));
+			if (currentMapEditor())
+				currentMapEditor()->exportOOPresentation(fn,fd->selectedConfig());	
 		}
-	}	
-}
-
-void Main::fileExportImage(int item)
-{
-	if (currentMapEditor())
+	} else
 	{
-		QString fn = QFileDialog::getSaveFileName( QString::null, "Image  (*.bmp *.jpg *.pbm *.pgm *.png *.ppm *xbm *.xpm)",
-							   this );
-		if ( !fn.isEmpty() ) 
-		{
-			currentMapEditor()->exportImage(fn,item);
-		} else {
-			statusBar()->message( tr("Couldn't save") + fn, statusbarTime );
-		}
+		QMessageBox::warning(0, 
+		tr("Warning"),
+		tr("Couldn't find configuration for export to Open Office\n"));
 	}
 }
 
-void Main::fileExportASCII()
-{
-	if (currentMapEditor())
-		currentMapEditor()->exportASCII();	
-}
-
 void Main::fileCloseMap()
 {
-	if (currentMapEditor())
+	MapEditor *me = currentMapEditor();
+	if (me)
 	{
-		if (currentMapEditor()->hasChanged())
+		if (me->hasChanged())
 		{
-			QMessageBox mb( "VYM",
-				tr("The map ") + currentMapEditor()->getFileName() +
-				tr(" has been modified but not saved yet. Do you want to"),
+			QMessageBox mb( vymName,
+				tr("The map %1 has been modified but not saved yet. Do you want to").arg(me->getFileName()),
 				QMessageBox::Warning,
 				QMessageBox::Yes | QMessageBox::Default,
 				QMessageBox::No,
@@ -1595,7 +2313,7 @@
 			{
 				case QMessageBox::Yes:
 					// save and close
-					fileSave(CompleteMap);
+					fileSave(me, CompleteMap);
 					break;
 				case QMessageBox::No:
 				// close  without saving
@@ -1605,11 +2323,17 @@
 				return;
 			}
 		} 
-		currentMapEditor()->closeMap();
-		tabWidget->removePage(currentMapEditor());
+		//me->closeMap(); 
+		tabWidget->removePage(me);
 		if (tabWidget->count()==0)
 			actionFilePrint->setEnabled (false);
-	}	
+
+        //Remove mapEditor;
+		// Better would be delete (me), but then we have a Qt error:
+		// "QObject: Do not delete object, 'MapEditor', during its event handler!"
+		// So we only remove data now and call deconstructor when vym closes later
+		me->clear();
+	}
 }
 
 void Main::filePrint()
@@ -1629,10 +2353,10 @@
 		me=(MapEditor*)tabWidget->page(i);
 
 		// If something changed, ask what to do
-		if (me->isUnsaved())
+		if (me->hasChanged())
 		{
 			tabWidget->setCurrentPage(i);
-			QMessageBox mb( "VYM",
+			QMessageBox mb( vymName,
 				tr("This map is not saved yet. Do you want to"),
 				QMessageBox::Warning,
 				QMessageBox::Yes | QMessageBox::Default,
@@ -1640,18 +2364,13 @@
 				QMessageBox::Cancel | QMessageBox::Escape );
 			mb.setButtonText( QMessageBox::Yes, tr("Save map") );
 			mb.setButtonText( QMessageBox::No, tr("Discard changes") );
+			mb.setModal (true);
 			mb.show();
-			// Call undocumented function: setActiveWindow is only
-			// possible, if widget is visible. This depends on
-			// windowmanager...
-#if defined(Q_OS_LINUX)
-			qt_wait_for_window_manager( this);
-#endif			
 			mb.setActiveWindow();
 			switch( mb.exec() ) {
 				case QMessageBox::Yes:
 					// save (the changed editors) and exit
-					fileSave(CompleteMap);
+					fileSave(currentMapEditor(), CompleteMap);
 					break;
 				case QMessageBox::No:
 					// exit without saving
@@ -1661,6 +2380,7 @@
 				return;
 			}
 		}
+		me->clear();	// remove and unselect now, before mainWindow has gone...
 	} // loop over all MEs	
     qApp->quit();
 }
@@ -1671,8 +2391,16 @@
 		currentMapEditor()->undo();
 }
 
-void Main::editRedo()	    // TODO
+void Main::editRedo()	   
 {
+	if (currentMapEditor())
+		currentMapEditor()->redo();
+}
+
+void Main::gotoHistoryStep (int i)	   
+{
+	if (currentMapEditor())
+		currentMapEditor()->gotoHistoryStep (i);
 }
 
 void Main::editCopy()
@@ -1697,13 +2425,6 @@
 {
 	findWindow->popup();
 	findWindow->raise();
-
-	// Call undocumented function: setActiveWindow is only
-	// possible, if widget is visible. This depends on
-	// windowmanager...
-#if defined(Q_OS_LINUX)
-	qt_wait_for_window_manager( this);
-#endif	
 	findWindow->setActiveWindow();
 }
 
@@ -1717,8 +2438,7 @@
 	} else
 	{
 		QMessageBox::information( findWindow, tr( "VYM -Information:" ),
-							   tr("No matches found for ")+
-							   "'<b>"+s+"</b>'");
+							   tr("No matches found for \"%1\"").arg(s));
 	}	
 }
 
@@ -1727,11 +2447,130 @@
 	currentMapEditor()->findReset();
 }
 
+void Main::openTabs(QStringList urls)
+{
+	if (!urls.isEmpty())
+	{	
+		bool success=true;
+		QStringList args;
+		QString browser=settings.value("/mainwindow/readerURL" ).toString();
+		QProcess *p;
+		if (!procBrowser ||  procBrowser->state()!=QProcess::Running)
+		{
+			QString u=urls.takeFirst();
+			procBrowser = new QProcess( this );
+			args<<u;
+			procBrowser->start(browser,args);
+			if ( !procBrowser->waitForStarted())
+			{
+				// try to set path to browser
+				QMessageBox::warning(0, 
+					tr("Warning"),
+					tr("Couldn't find a viewer to open %1.\n").arg(u)+
+					tr("Please use Settings->")+tr("Set application to open an URL"));
+				return;
+			}
+#if defined(Q_OS_WIN32)
+            // There's no sleep in VCEE, replace it with Qt's QThread::wait().
+            this->thread()->wait(3000);
+#else
+			sleep (3);
+#endif
+		}
+		if (browser.contains("konqueror"))
+		{
+			for (int i=0; i<urls.size(); i++)
+			{
+				// Open new browser
+				// Try to open new tab in existing konqueror started previously by vym
+				p=new QProcess (this);
+				args.clear();
+#if defined(Q_OS_WIN32)
+                // In Win32, pid is not a longlong, but a pointer to a _PROCESS_INFORMATION structure.
+                // Redundant change in Win32, as there's no konqueror, but I wanted to follow the original logic.
+				args<< QString("konqueror-%1").arg(procBrowser->pid()->dwProcessId)<<
+					"konqueror-mainwindow#1"<<
+					"newTab" <<
+					urls.at(i);
+#else
+				args<< QString("konqueror-%1").arg(procBrowser->pid())<<
+					"konqueror-mainwindow#1"<<
+					"newTab" <<
+					urls.at(i);
+#endif
+				p->start ("dcop",args);
+				//cout << qPrintable (args.join(" "))<<endl;
+				if ( !p->waitForStarted() ) success=false;
+			}
+			if (!success)
+				QMessageBox::warning(0, 
+					tr("Warning"),
+					tr("Couldn't start %1 to open a new tab in %2.").arg("dcop").arg("konqueror"));
+			return;		
+		} else if (browser.contains ("firefox") || browser.contains ("mozilla") )
+		{
+			for (int i=0; i<urls.size(); i++)
+			{
+				// Try to open new tab in firefox
+				p=new QProcess (this);
+				args<< "-remote"<< QString("openurl(%1,new-tab)").arg(urls.at(i));
+				p->start (browser,args);
+				if ( !p->waitForStarted() ) success=false;
+			}			
+			if (!success)
+				QMessageBox::warning(0, 
+					tr("Warning"),
+					tr("Couldn't start %1 to open a new tab").arg(browser));
+			return;		
+		}			
+		QMessageBox::warning(0, 
+			tr("Warning"),
+			tr("Sorry, currently only Konqueror and Mozilla support tabbed browsing."));
+	}	
+}
+
 void Main::editOpenURL()
 {
+	// Open new browser
 	if (currentMapEditor())
-	    currentMapEditor()->openURL();
+	{	
+	    QString url=currentMapEditor()->getURL();
+		QStringList args;
+		if (url=="") return;
+		QString browser=settings.value("/mainwindow/readerURL" ).toString();
+		procBrowser = new QProcess( this );
+		args<<url;
+		procBrowser->start(browser,args);
+		if ( !procBrowser->waitForStarted())
+		{
+			// try to set path to browser
+			QMessageBox::warning(0, 
+				tr("Warning"),
+				tr("Couldn't find a viewer to open %1.\n").arg(url)+
+				tr("Please use Settings->")+tr("Set application to open an URL"));
+			settingsURL() ; 
+		}	
+	}	
 }
+void Main::editOpenURLTab()
+{
+	if (currentMapEditor())
+	{	
+	    QStringList urls;
+		urls.append(currentMapEditor()->getURL());
+		openTabs (urls);
+	}	
+}
+void Main::editOpenMultipleURLTabs()
+{
+	if (currentMapEditor())
+	{	
+	    QStringList urls;
+		urls=currentMapEditor()->getURLs();
+		openTabs (urls);
+	}	
+}
+
 
 void Main::editURL()
 {
@@ -1739,6 +2578,12 @@
 	    currentMapEditor()->editURL();
 }
 
+void Main::editLocalURL()
+{
+	if (currentMapEditor())
+	    currentMapEditor()->editLocalURL();
+}
+
 void Main::editHeading2URL()
 {
 	if (currentMapEditor())
@@ -1751,13 +2596,190 @@
 	    currentMapEditor()->editBugzilla2URL();
 }
 
-void Main::editOpenVymLink()
+void Main::editFATE2URL()
 {
-	// Get current path to map
-	QString currentVymLink;
+	if (currentMapEditor())
+	    currentMapEditor()->editFATE2URL();
+}
+
+void Main::editHeadingFinished()
+{
+	// only called from editHeading(), so there is a currentME
+	MapEditor *me=currentMapEditor();
+	if (me)
+	{
+		me->setStateEditHeading (false);
+		QPoint p;	//Not used here, only to find out pos of branch
+		bool ok;
+		QString s=me->getHeading(ok,p);
+
+#if defined(Q_OS_MACX) || defined(Q_OS_WIN32)
+#else
+		if (ok && s!=lineedit->text())
+			me->setHeading(lineedit->text());
+			
+		lineedit->releaseKeyboard();
+		lineedit->hide();
+		setFocus();
+#endif	
+		if (!actionSettingsAutoSelectNewBranch->isOn() && 
+			!prevSelection.isEmpty()) 
+			me->select(prevSelection);
+		prevSelection="";
+	}
+}
+
+void Main::editHeading()
+{
 	if (currentMapEditor())
 	{
-		currentVymLink=currentMapEditor()->getVymLink();	
+		MapEditor *me=currentMapEditor();
+		QString oldSel=me->getSelectString();
+
+		if (lineedit->isVisible())
+			editHeadingFinished();
+		else
+		{
+			bool ok;
+			QPoint p;
+			QString s=me->getHeading(ok,p);
+
+			if (ok)
+			{
+				me->setStateEditHeading (true);
+#if defined(Q_OS_MACX) || defined(Q_OS_WIN32)
+				p=me->mapToGlobal (p);
+				QDialog *d =new QDialog(NULL);
+				QLineEdit *le=new QLineEdit (d);
+				d->setWindowFlags (Qt::FramelessWindowHint);
+				d->setGeometry(p.x(),p.y(),230,25);
+				le->resize (d->width()-10,d->height());
+				le->setText (s);
+				le->selectAll();
+				connect (le, SIGNAL (returnPressed()), d, SLOT (accept()));
+				d->activateWindow();
+				d->exec();
+				me->setHeading (le->text());
+				delete (le);
+				delete (d);
+				editHeadingFinished();
+#else
+				p=me->mapTo (this,p);
+				lineedit->setGeometry(p.x(),p.y(),230,25);
+				lineedit->setText(s);
+				lineedit->setCursorPosition(1);
+				lineedit->selectAll();
+				lineedit->show();
+				lineedit->grabKeyboard();
+				lineedit->setFocus();
+#endif
+			}
+		}
+	} // currentMapEditor()	
+}
+
+void Main::editAttributeFinished()
+{
+	// only called from editHeading(), so there is a currentME
+
+	/*
+	MapEditor *me=currentMapEditor();
+	if (me)
+	{
+		me->setStateEditHeading (false);
+		QPoint p;	//Not used here, only to find out pos of branch
+		bool ok;
+		QString s=me->getHeading(ok,p);
+
+#if defined(Q_OS_MACX)
+#else
+		if (ok && s!=lineedit->text())
+			me->setHeading(lineedit->text());
+			
+		lineedit->releaseKeyboard();
+		lineedit->hide();
+		setFocus();
+#endif	
+		if (!actionSettingsAutoSelectNewBranch->isOn() && 
+			!prevSelection.isEmpty()) 
+			me->select(prevSelection);
+		prevSelection="";
+	}
+	*/
+}
+
+#include "attribute.h"
+#include "attributedialog.h"
+void Main::editAttribute()
+{
+	MapEditor *me=currentMapEditor();
+	if (me)
+	{
+		BranchObj *bo=me->getSelectedBranch();
+		if (bo)
+		{
+			AttributeDialog dia(this);
+			dia.setTable (me->attributeTable() );
+			dia.setBranch (bo);
+			dia.setMode (Definition);
+			dia.updateTable();
+			dia.exec();
+		}
+	}	
+	/*
+	if (currentMapEditor())
+	{
+		MapEditor *me=currentMapEditor();
+		QString oldSel=me->getSelectString();
+
+		if (lineedit->isVisible())
+			editAttributeFinished();
+		else
+		{
+			bool ok;
+			QPoint p;
+			QString s=me->getHeading(ok,p);
+
+			if (ok)
+			{
+				me->setStateEditHeading (true);
+#if defined(Q_OS_MACX)
+				p=me->mapToGlobal (p);
+				QDialog *d =new QDialog(NULL);
+				QLineEdit *le=new QLineEdit (d);
+				d->setWindowFlags (Qt::FramelessWindowHint);
+				d->setGeometry(p.x(),p.y(),230,25);
+				le->resize (d->width()-10,d->height());
+				le->setText (s);
+				le->selectAll();
+				connect (le, SIGNAL (returnPressed()), d, SLOT (accept()));
+				d->activateWindow();
+				d->exec();
+				me->setHeading (le->text());
+				delete (le);
+				delete (d);
+				editHeadingFinished();
+#else
+				p=me->mapTo (this,p);
+				lineedit->setGeometry(p.x(),p.y(),230,25);
+				lineedit->setText(s);
+				lineedit->setCursorPosition(1);
+				lineedit->selectAll();
+				lineedit->show();
+				lineedit->grabKeyboard();
+				lineedit->setFocus();
+#endif
+			}
+		} 
+	} // currentMapEditor()	
+
+	*/
+}
+
+void Main::openVymLinks(const QStringList &vl)
+{
+	for (int j=0; j<vl.size(); j++)
+	{
 		// compare path with already loaded maps
 		int index=-1;
 		int i;
@@ -1765,7 +2787,7 @@
 		for (i=0;i<=tabWidget->count() -1;i++)
 		{
 			me=(MapEditor*)tabWidget->page(i);
-			if (currentVymLink==me->getFilePath() )
+			if (vl.at(j)==me->getFilePath() )
 			{
 				index=i;
 				break;
@@ -1774,12 +2796,12 @@
 		if (index<0)
 		// Load map
 		{
-			if (!QFile(currentVymLink).exists() )
+			if (!QFile(vl.at(j)).exists() )
 				QMessageBox::critical( 0, tr( "Critical Error" ),
-				   tr("Couldn't open map " +currentVymLink)+".");
+				   tr("Couldn't open map %1").arg(vl.at(j)));
 			else
 			{
-				fileLoad (currentVymLink, NewMap);
+				fileLoad (vl.at(j), NewMap);
 				tabWidget->setCurrentPage (tabWidget->count()-1);	
 			}
 		} else
@@ -1788,6 +2810,26 @@
 	}
 }
 
+void Main::editOpenVymLink()
+{
+	if (currentMapEditor())
+	{
+		QStringList vl;
+		vl.append(currentMapEditor()->getVymLink());	
+		openVymLinks (vl);
+	}
+}
+
+void Main::editOpenMultipleVymLinks()
+{
+	QString currentVymLink;
+	if (currentMapEditor())
+	{
+		QStringList vl=currentMapEditor()->getVymLinks();
+		openVymLinks (vl);
+	}
+}
+
 void Main::editVymLink()
 {
 	if (currentMapEditor())
@@ -1800,6 +2842,12 @@
 		currentMapEditor()->deleteVymLink();	
 }
 
+void Main::editToggleHideExport()
+{
+	if (currentMapEditor())
+		currentMapEditor()->toggleHideExport();	
+}
+
 void Main::editMapInfo()
 {
 	if (currentMapEditor())
@@ -1818,6 +2866,12 @@
 		currentMapEditor()->moveBranchDown();
 }
 
+void Main::editSortChildren()
+{
+	if (currentMapEditor())
+		currentMapEditor()->sortChildren();
+}
+
 void Main::editToggleScroll()
 {
 	if (currentMapEditor())
@@ -1826,36 +2880,113 @@
 	}	
 }
 
-void Main::editUnScrollAll()
+void Main::editUnscrollChilds()
 {
 	if (currentMapEditor())
+		currentMapEditor()->unscrollChilds();	
+}
+
+void Main::editAddMapCenter()
+{
+	MapEditor *me=currentMapEditor();
+	if (!lineedit->isVisible() && me)
 	{
-		currentMapEditor()->unScrollAll();	
+		me->addMapCenter ();
 	}	
 }
 
-void Main::editHeading()
-{
-	if (currentMapEditor())
-		currentMapEditor()->editHeading();
-}
-
 void Main::editNewBranch()
 {
-	if (currentMapEditor())
-		currentMapEditor()->addNewBranch(0);
+	MapEditor *me=currentMapEditor();
+	if (!lineedit->isVisible() && me)
+	{
+		BranchObj *bo=(BranchObj*)me->getSelection();
+		BranchObj *newbo=me->addNewBranch(0);
+
+		prevSelection=me->getModel()->getSelectString(bo);
+		if (newbo) 
+			me->select (newbo);
+		else
+			return;
+
+		if (actionSettingsAutoEditNewBranch->isOn())
+		{
+			editHeading();
+			return;
+		}	
+		if (!prevSelection.isEmpty()) 
+		{
+			me->select(prevSelection);
+			prevSelection="";
+		}
+
+	}	
+}
+
+void Main::editNewBranchBefore()
+{
+	MapEditor *me=currentMapEditor();
+	if (!lineedit->isVisible() && me)
+	{
+		BranchObj *bo=(BranchObj*)me->getSelection();
+		BranchObj *newbo=me->addNewBranchBefore();
+
+		if (newbo) 
+			me->select (newbo);
+		else
+			return;
+
+		if (actionSettingsAutoEditNewBranch->isOn())
+		{
+			if (!actionSettingsAutoSelectNewBranch->isOn())
+				prevSelection=me->getModel()->getSelectString(bo); //TODO access directly
+			editHeading();
+		}
+	}	
 }
 
 void Main::editNewBranchAbove()
 {
-	if (currentMapEditor())
-		currentMapEditor()->addNewBranch(-1);
+	MapEditor *me=currentMapEditor();
+	if (!lineedit->isVisible() && me)
+	{
+		BranchObj *bo=(BranchObj*)me->getSelection();
+		BranchObj *newbo=me->addNewBranch (-1);
+
+		if (newbo) 
+			me->select (newbo);
+		else
+			return;
+
+		if (actionSettingsAutoEditNewBranch->isOn())
+		{
+			if (!actionSettingsAutoSelectNewBranch->isOn())
+				prevSelection=me->getModel()->getSelectString (bo);	// TODO access directly
+			editHeading();
+		}
+	}	
 }
 
 void Main::editNewBranchBelow()
 {
-	if (currentMapEditor())
-		currentMapEditor()->addNewBranch(1);
+	MapEditor *me=currentMapEditor();
+	if (!lineedit->isVisible() && me)
+	{
+		BranchObj *bo=(BranchObj*)me->getSelection();
+		BranchObj *newbo=me->addNewBranch (1);
+
+		if (newbo) 
+			me->select (newbo);
+		else
+			return;
+
+		if (actionSettingsAutoEditNewBranch->isOn())
+		{
+			if (!actionSettingsAutoSelectNewBranch->isOn())
+				prevSelection=me->getModel()->getSelectString(bo);	//TODO access directly
+			editHeading();
+		}
+	}	
 }
 
 void Main::editImportAdd()
@@ -1873,9 +3004,21 @@
 	fileSaveAs (PartOfMap);
 }
 
+void Main::editDeleteKeepChilds()
+{
+	if (currentMapEditor())
+		currentMapEditor()->deleteKeepChilds();
+}
+
+void Main::editDeleteChilds()
+{
+	if (currentMapEditor())
+		currentMapEditor()->deleteChilds();
+}
+
 void Main::editDeleteSelection()
 {
-	if (currentMapEditor())
+	if (currentMapEditor() && actionSettingsUseDelKey->isOn())
 		currentMapEditor()->deleteSelection();
 }
 
@@ -1921,25 +3064,31 @@
 		currentMapEditor()->loadFloatImage();
 }
 
-void Main::editSaveImage(int item)
+void Main::editSaveImage()
 {
 	if (currentMapEditor())
-		currentMapEditor()->saveFloatImage(item);
+		currentMapEditor()->saveFloatImage();
 }
 
-void Main::editToggleFloatExport()
+void Main::editFollowXLink(QAction *a)
+{
+
+	if (currentMapEditor())
+		currentMapEditor()->followXLink(branchXLinksContextMenuFollow->actions().indexOf(a));
+}
+
+void Main::editEditXLink(QAction *a)
 {
 	if (currentMapEditor())
-		currentMapEditor()->toggleFloatExport();
+		currentMapEditor()->editXLink(branchXLinksContextMenuEdit->actions().indexOf(a));
 }
 
 void Main::formatSelectColor()
 {
 	if (currentMapEditor())
 	{
-		QColor col = QColorDialog::getColor( currentMapEditor()->color(), this );
+		QColor col = QColorDialog::getColor((currentColor ), this );
 		if ( !col.isValid() ) return;
-		currentMapEditor()->setColor( col );
 		colorChanged( col );
 	}	
 }
@@ -1947,7 +3096,7 @@
 void Main::formatPickColor()
 {
 	if (currentMapEditor())
-		colorChanged( currentMapEditor()->pickColor() );
+		colorChanged( currentMapEditor()->getCurrentHeadingColor() );
 }
 
 void Main::colorChanged(QColor c)
@@ -1955,82 +3104,100 @@
     QPixmap pix( 16, 16 );
     pix.fill( c );
     actionFormatColor->setIconSet( pix );
-}
-
-void Main::formatColorItem()
-{
-	if (currentMapEditor())
-		currentMapEditor()->colorItem();
+	currentColor=c;
 }
 
 void Main::formatColorBranch()
 {
 	if (currentMapEditor())
-		currentMapEditor()->colorBranch();
+		currentMapEditor()->colorBranch(currentColor);
+}
+
+void Main::formatColorSubtree()
+{
+	if (currentMapEditor())
+		currentMapEditor()->colorSubtree (currentColor);
 }
 
 void Main::formatLinkStyleLine()
 {
 	if (currentMapEditor())
-		currentMapEditor()->setLinkStyle(StyleLine);
+    {
+		currentMapEditor()->setMapLinkStyle("StyleLine");
+        actionFormatLinkStyleLine->setOn(true);
+    }
 }
 
 void Main::formatLinkStyleParabel()
 {
 	if (currentMapEditor())
-		currentMapEditor()->setLinkStyle(StyleParabel);
+    {
+		currentMapEditor()->setMapLinkStyle("StyleParabel");
+        actionFormatLinkStyleParabel->setOn(true);
+    }
 }
 
 void Main::formatLinkStylePolyLine()
 {
 	if (currentMapEditor())
-		currentMapEditor()->setLinkStyle(StylePolyLine);
+    {
+		currentMapEditor()->setMapLinkStyle("StylePolyLine");
+        actionFormatLinkStylePolyLine->setOn(true);
+    }
 }
 
 void Main::formatLinkStylePolyParabel()
 {
 	if (currentMapEditor())
-		currentMapEditor()->setLinkStyle(StylePolyParabel);
+    {
+		currentMapEditor()->setMapLinkStyle("StylePolyParabel");
+        actionFormatLinkStylePolyParabel->setOn(true);
+    }
 }
 
 void Main::formatSelectBackColor()
 {
 	if (currentMapEditor())
-		currentMapEditor()->selectBackgroundColor();
+		currentMapEditor()->selectMapBackgroundColor();
+}
+
+void Main::formatSelectBackImage()
+{
+	if (currentMapEditor())
+		currentMapEditor()->selectMapBackgroundImage();
 }
 
 void Main::formatSelectLinkColor()
 {
 	if (currentMapEditor())
-		currentMapEditor()->selectLinkColor();
+		currentMapEditor()->selectMapLinkColor();
+}
+
+void Main::formatSelectSelectionColor()
+{
+	if (currentMapEditor())
+		currentMapEditor()->selectMapSelectionColor();
 }
 
 void Main::formatToggleLinkColorHint()
 {
-	currentMapEditor()->toggleLinkColorHint();
+	currentMapEditor()->toggleMapLinkColorHint();
 }
 
-void Main::formatFrameNone()
+
+void Main::formatHideLinkUnselected()	//FIXME get rid of this with imagepropertydialog
 {
 	if (currentMapEditor())
-		currentMapEditor()->setFrame(NoFrame);
-}
-
-void Main::formatFrameRectangle()
-{
-	if (currentMapEditor())
-		currentMapEditor()->setFrame(Rectangle);
+		currentMapEditor()->setHideLinkUnselected(actionFormatHideLinkUnselected->isOn());
 }
 
 void Main::viewZoomReset()
 {
 	if (currentMapEditor())
 	{
-		QWMatrix m;
+		QMatrix m;
 		m.reset();
-		currentMapEditor()->setWorldMatrix( m );
-		currentMapEditor()->setViewCenter();
-		currentMapEditor()->adjustCanvasSize();
+		currentMapEditor()->setMatrix( m );
 	}	
 }
 
@@ -2038,11 +3205,9 @@
 {
 	if (currentMapEditor())
 	{
-		QWMatrix m = currentMapEditor()->worldMatrix();
+		QMatrix m = currentMapEditor()->matrix();
 		m.scale( 1.25, 1.25 );
-		currentMapEditor()->setWorldMatrix( m );
-		currentMapEditor()->setViewCenter();
-		currentMapEditor()->adjustCanvasSize();
+		currentMapEditor()->setMatrix( m );
 	}	
 }
 
@@ -2050,22 +3215,42 @@
 {
 	if (currentMapEditor())
 	{
-		QWMatrix m = currentMapEditor()->worldMatrix();
+		QMatrix m = currentMapEditor()->matrix();
 		m.scale( 0.8, 0.8 );
-		currentMapEditor()->setWorldMatrix( m );
-		currentMapEditor()->setViewCenter();
-		currentMapEditor()->adjustCanvasSize();
+		currentMapEditor()->setMatrix( m );
 	}	
 }
+
+void Main::viewCenter()
+{
+	MapEditor *me=currentMapEditor();
+	if (me)
+	{
+		me->ensureSelectionVisible();
+	}	
+}
+
+void Main::networkStartServer()
+{
+	MapEditor *me=currentMapEditor();
+	if (me) me->newServer();
+}
+
+void Main::networkConnect()
+{
+	MapEditor *me=currentMapEditor();
+	if (me) me->connectToServer();
+}
+
 bool Main::settingsPDF()
 {
 	// Default browser is set in constructor
 	bool ok;
 	QString text = QInputDialog::getText(
-		"VYM", tr("Enter path for pdf reader:"), QLineEdit::Normal,
-		settings.readEntry("/vym/mainwindow/readerPDF"), &ok, this );
+		"VYM", tr("Set application to open PDF files")+":", QLineEdit::Normal,
+		settings.value("/mainwindow/readerPDF").toString(), &ok, this );
 	if (ok)
-		settings.writeEntry ("/vym/mainwindow/readerPDF",text);
+		settings.setValue ("/mainwindow/readerPDF",text);
 	return ok;
 }
 
@@ -2075,20 +3260,364 @@
 	// Default browser is set in constructor
 	bool ok;
 	QString text = QInputDialog::getText(
-		"VYM", tr("Enter path for application to open an URL:"), QLineEdit::Normal,
-		settings.readEntry("/vym/mainwindow/readerURL")
+		"VYM", tr("Set application to open an URL")+":", QLineEdit::Normal,
+		settings.value("/mainwindow/readerURL").toString()
 		, &ok, this );
 	if (ok)
-		settings.writeEntry ("/vym/mainwindow/readerURL",text);
+		settings.setValue ("/mainwindow/readerURL",text);
 	return ok;
 }
 
+void Main::settingsMacroDir()
+{
+	QDir defdir(vymBaseDir.path() + "/macros");
+	if (!defdir.exists())
+		defdir=vymBaseDir;
+	QDir dir=QFileDialog::getExistingDirectory (
+		this,
+		tr ("Directory with vym macros:"), 
+		settings.value ("/macros/macroDir",defdir.path()).toString()
+	);
+	if (dir.exists())
+		settings.setValue ("/macros/macroDir",dir.absolutePath());
+}
+
+void Main::settingsUndoLevels()
+{
+	bool ok;
+	int i = QInputDialog::getInteger(
+		this, 
+		tr("QInputDialog::getInteger()"),
+	    tr("Number of undo/redo levels:"), settings.value("/mapeditor/stepsTotal").toInt(), 0, 1000, 1, &ok);
+	if (ok)
+	{
+		settings.setValue ("/mapeditor/stepsTotal",i);
+		QMessageBox::information( this, tr( "VYM -Information:" ),
+		   tr("Settings have been changed. The next map opened will have \"%1\" undo/redo levels").arg(i)); 
+   }	
+}
+
+void Main::settingsAutosaveToggle()
+{
+	settings.setValue ("/mainwindow/autosave/use",actionSettingsAutosaveToggle->isOn() );
+}
+
+void Main::settingsAutosaveTime()
+{
+	bool ok;
+	int i = QInputDialog::getInteger(
+		this, 
+		tr("QInputDialog::getInteger()"),
+	    tr("Number of seconds before autosave:"), settings.value("/mainwindow/autosave/ms").toInt() / 1000, 10, 10000, 1, &ok);
+	if (ok)
+		settings.setValue ("/mainwindow/autosave/ms",i * 1000);
+}
+
+void Main::settingsWriteBackupFileToggle()
+{
+	settings.setValue ("/mainwindow/writeBackupFile",actionSettingsWriteBackupFile->isOn() );
+}
+
+void Main::settingsToggleAnimation()
+{
+	settings.setValue ("/animation/use",actionSettingsUseAnimation->isOn() );
+}
+
+void Main::settingsToggleDelKey()
+{
+	if (actionSettingsUseDelKey->isOn())
+	{
+		actionEditDelete->setAccel (QKeySequence (Qt::Key_Delete));
+	} else
+	{
+		actionEditDelete->setAccel (QKeySequence (""));
+	}
+}
+
 void Main::windowToggleNoteEditor()
 {
-	if (textEditor->showWithMain() )
+	if (textEditor->isVisible() )
 		windowHideNoteEditor();
+	else
+		windowShowNoteEditor();
+}
+
+void Main::windowToggleHistory()
+{
+	if (historyWindow->isVisible())
+		historyWindow->hide();
 	else	
-		windowShowNoteEditor();
+		historyWindow->show();
+
+}
+
+void Main::windowToggleProperty()
+{
+	if (branchPropertyWindow->isVisible())
+		branchPropertyWindow->hide();
+	else	
+		branchPropertyWindow->show();
+
+	if(currentMapEditor())
+	{
+		BranchObj *bo=currentMapEditor()->getSelectedBranch();
+		if (bo) 
+		{
+			branchPropertyWindow->setMapEditor(currentMapEditor());
+			branchPropertyWindow->setBranch(bo);
+			return;
+		}
+		
+	}	
+	branchPropertyWindow->setBranch(NULL);
+}
+
+void Main::windowToggleAntiAlias()
+{
+	bool b=actionViewToggleAntiAlias->isOn();
+	MapEditor *me;
+	for (int i=0;i<tabWidget->count();i++)
+	{
+		
+		me=(MapEditor*)tabWidget->page(i);
+		me->setAntiAlias(b);
+	}	
+
+}
+
+void Main::windowToggleSmoothPixmap()
+{
+	bool b=actionViewToggleSmoothPixmapTransform->isOn();
+	MapEditor *me;
+	for (int i=0;i<tabWidget->count();i++)
+	{
+		
+		me=(MapEditor*)tabWidget->page(i);
+		me->setSmoothPixmap(b);
+	}	
+}
+
+void Main::updateHistory(SimpleSettings &undoSet)
+{
+	historyWindow->update (undoSet);
+}
+
+void Main::updateNoteFlag()
+{
+	if (currentMapEditor())
+		currentMapEditor()->updateNoteFlag();
+}
+
+void Main::updateSatellites(MapEditor *me)
+{
+	branchPropertyWindow->setMapEditor (me);
+}
+
+void Main::updateActions()
+{
+	MapEditor *me=currentMapEditor();
+	if (!me) return;
+
+	historyWindow->setCaption (vymName + " - " +tr("History for %1","Window Caption").arg(currentMapEditor()->getFileName()));
+
+	// updateActions is also called when NoteEditor is closed
+	actionViewToggleNoteEditor->setOn (textEditor->isVisible());
+	actionViewToggleHistoryWindow->setOn (historyWindow->isVisible());
+	actionViewTogglePropertyWindow->setOn (branchPropertyWindow->isVisible());
+
+	if (me->getMapLinkColorHint()==LinkableMapObj::HeadingColor) 
+		actionFormatLinkColorHint->setOn(true);
+	else	
+		actionFormatLinkColorHint->setOn(false);
+
+	switch (me->getMapLinkStyle())
+	{
+		case LinkableMapObj::Line: 
+			actionFormatLinkStyleLine->setOn(true);
+			break;
+		case LinkableMapObj::Parabel:
+			actionFormatLinkStyleParabel->setOn(true);
+			break;
+		case LinkableMapObj::PolyLine:	
+			actionFormatLinkStylePolyLine->setOn(true);
+			break;
+		case LinkableMapObj::PolyParabel:	
+			actionFormatLinkStylePolyParabel->setOn(true);
+			break;
+		default:
+			break;
+	}	
+
+	// Update colors
+	QPixmap pix( 16, 16 );
+    pix.fill( me->getMapBackgroundColor() );
+    actionFormatBackColor->setIconSet( pix );
+    pix.fill( me->getSelectionColor() );
+    actionFormatSelectionColor->setIconSet( pix );
+    pix.fill( me->getMapDefLinkColor() );
+    actionFormatLinkColor->setIconSet( pix );
+
+
+	actionFileSave->setEnabled( me->hasChanged() );
+	if (me->isUndoAvailable())
+		actionEditUndo->setEnabled( true);
+	else	
+		actionEditUndo->setEnabled( false);
+
+	if (me->isRedoAvailable())
+		actionEditRedo->setEnabled( true);
+	else	
+		actionEditRedo->setEnabled( false);
+
+	LinkableMapObj *selection=me->getSelection();
+	if (selection)
+	{
+		if ( (typeid(*selection) == typeid(BranchObj)) || 
+			(typeid(*selection) == typeid(MapCenterObj))  )
+		{
+			BranchObj *bo=(BranchObj*)selection;
+			// Take care of links
+			if (bo->countXLinks()==0)
+			{
+				branchXLinksContextMenuEdit->clear();
+				branchXLinksContextMenuFollow->clear();
+			} else
+			{
+				BranchObj *bot;
+				QString s;
+				branchXLinksContextMenuEdit->clear();
+				branchXLinksContextMenuFollow->clear();
+				for (int i=0; i<=bo->countXLinks();i++)
+				{
+					bot=bo->XLinkTargetAt(i);
+					if (bot)
+					{
+						s=bot->getHeading();
+						if (s.length()>xLinkMenuWidth)
+							s=s.left(xLinkMenuWidth)+"...";
+						branchXLinksContextMenuFollow->addAction (s);
+						branchXLinksContextMenuEdit->addAction (s);
+					}	
+				}
+			}
+
+			standardFlagsDefault->setEnabled (true);
+
+			actionEditToggleScroll->setEnabled (true);
+			if ( bo->isScrolled() )
+				actionEditToggleScroll->setOn(true);
+			else	
+				actionEditToggleScroll->setOn(false);
+
+			if ( bo->getURL().isEmpty() )
+			{
+				actionEditOpenURL->setEnabled (false);
+				actionEditOpenURLTab->setEnabled (false);
+			}	
+			else	
+			{
+				actionEditOpenURL->setEnabled (true);
+				actionEditOpenURLTab->setEnabled (true);
+			}
+			if ( bo->getVymLink().isEmpty() )
+			{
+				actionEditOpenVymLink->setEnabled (false);
+				actionEditDeleteVymLink->setEnabled (false);
+			} else	
+			{
+				actionEditOpenVymLink->setEnabled (true);
+				actionEditDeleteVymLink->setEnabled (true);
+			}	
+
+			if (bo->canMoveBranchUp()) 
+				actionEditMoveUp->setEnabled (true);
+			else	
+				actionEditMoveUp->setEnabled (false);
+			if (bo->canMoveBranchDown()) 
+				actionEditMoveDown->setEnabled (true);
+			else	
+				actionEditMoveDown->setEnabled (false);
+
+
+			actionEditToggleHideExport->setEnabled (true);	
+			actionEditToggleHideExport->setOn (bo->hideInExport() );	
+
+			actionEditCopy->setEnabled (true);	
+			actionEditCut->setEnabled (true);	
+			if (!clipboardEmpty)
+				actionEditPaste->setEnabled (true);	
+			else	
+				actionEditPaste->setEnabled (false);	
+			for (int i=0; i<actionListBranches.size(); ++i)	
+				actionListBranches.at(i)->setEnabled(true);
+			actionEditDelete->setEnabled (true);
+			actionFormatHideLinkUnselected->setOn
+				(selection->getHideLinkUnselected());
+		}
+		if ( (typeid(*selection) == typeid(FloatImageObj)) )
+		{
+			FloatObj *fo=(FloatImageObj*)selection;
+
+			actionEditOpenURL->setEnabled (false);
+			actionEditOpenVymLink->setEnabled (false);
+			actionEditDeleteVymLink->setEnabled (false);	
+			actionEditToggleHideExport->setEnabled (true);	
+			actionEditToggleHideExport->setOn (fo->hideInExport() );	
+
+
+			actionEditCopy->setEnabled (true);
+			actionEditCut->setEnabled (true);	
+			actionEditPaste->setEnabled (false);
+			for (int i=0; i<actionListBranches.size(); ++i)	
+				actionListBranches.at(i)->setEnabled(false);
+			actionEditDelete->setEnabled (true);
+			actionFormatHideLinkUnselected->setOn
+				( selection->getHideLinkUnselected());
+			actionEditMoveUp->setEnabled (false);
+			actionEditMoveDown->setEnabled (false);
+		}
+
+	} else
+	{
+		actionEditCopy->setEnabled (false);	
+		actionEditCut->setEnabled (false);	
+		actionEditPaste->setEnabled (false);	
+		for (int i=0; i<actionListBranches.size(); ++i)	
+			actionListBranches.at(i)->setEnabled(false);
+
+		actionEditToggleScroll->setEnabled (false);
+		actionEditOpenURL->setEnabled (false);
+		actionEditOpenVymLink->setEnabled (false);
+		actionEditDeleteVymLink->setEnabled (false);	
+		actionEditHeading2URL->setEnabled (false);	
+		actionEditDelete->setEnabled (false);
+		actionEditMoveUp->setEnabled (false);
+		actionEditMoveDown->setEnabled (false);
+		actionEditToggleHideExport->setEnabled (false);	
+	}	
+}
+
+Main::ModMode Main::getModMode()
+{
+	if (actionModModeColor->isOn()) return ModModeColor;
+	if (actionModModeCopy->isOn()) return ModModeCopy;
+	if (actionModModeXLink->isOn()) return ModModeXLink;
+	return ModModeNone;
+}
+
+bool Main::autoEditNewBranch()
+{
+	return actionSettingsAutoEditNewBranch->isOn();
+}
+
+bool Main::autoSelectNewBranch()
+{
+	return actionSettingsAutoSelectNewBranch->isOn();
+}
+
+bool Main::useFlagGroups()
+{
+	return actionSettingsUseFlagGroups->isOn();
 }
 
 void Main::windowShowNoteEditor()
@@ -2105,6 +3634,27 @@
 	actionViewToggleNoteEditor->setOn (false);
 }
 
+void Main::setScript (const QString &script)
+{
+	scriptEditor->setScript (script);
+}
+
+void Main::runScript (const QString &script)
+{
+	if (currentMapEditor())
+		currentMapEditor()->runScript (script);
+}
+
+void Main::runScriptEverywhere (const QString &script)
+{
+	MapEditor *me;
+	for (int i=0;i<=tabWidget->count() -1;i++)
+	{
+		me=(MapEditor*)tabWidget->page(i);
+		if (me) me->runScript (script);
+	}	
+}
+
 void Main::windowNextEditor()
 {
 	if (tabWidget->currentPageIndex() < tabWidget->count())
@@ -2119,91 +3669,142 @@
 
 void Main::standardFlagChanged()
 {
-	currentMapEditor()->toggleStandardFlag(sender()->name());
+	if (currentMapEditor())
+		currentMapEditor()->toggleStandardFlag(sender()->name());
 }
 
-void Main::testFunction()
+void Main::testFunction1()
 {
-	//textEditor->stackUnder(this);
-	currentMapEditor()->testFunction();
+	if (!currentMapEditor()) return;
+	currentMapEditor()->testFunction1();
+	//editAttribute();
 }
 
-void Main::testShowClipboard()
+void Main::testFunction2()
 {
-	clipboardME->show();
+	if (!currentMapEditor()) return;
+	currentMapEditor()->testFunction2();
+}
+
+void Main::testCommand()
+{
+	if (!currentMapEditor()) return;
+	scriptEditor->show();
+	/*
+	bool ok;
+	QString com = QInputDialog::getText(
+			vymName, "Enter Command:", QLineEdit::Normal,"command", &ok, this );
+	if (ok) currentMapEditor()->parseAtom(com);
+	*/
 }
 
 void Main::helpDoc()
 {
-	QString docpath;
-	// default path in SUSE LINUX
-	docpath="/usr/share/doc/packages/vym/doc/vym.pdf";
-
-	if (!QFile (docpath).exists() )
+	QString locale = QLocale::system().name();
+	QString docname;
+	if (locale.left(2)=="es")
+		docname="vym_es.pdf";
+	else	
+		docname="vym.pdf";
+
+	QStringList searchList;
+	QDir docdir;
+	#if defined(Q_OS_MACX)
+		searchList << "./vym.app/Contents/Resources/doc";
+    #elif defined(Q_OS_WIN32)
+        searchList << vymInstallDir.path() + "/share/doc/packages/vym";
+	#else
+		#if defined(VYM_DOCDIR)
+			searchList << VYM_DOCDIR;
+		#endif
+		// default path in SUSE LINUX
+		searchList << "/usr/share/doc/packages/vym";
+	#endif
+
+	searchList << "doc";	// relative path for easy testing in tarball
+	searchList << "doc/tex";	// Easy testing working on vym.tex
+	searchList << "/usr/share/doc/vym";	// Debian
+	searchList << "/usr/share/doc/packages";// Knoppix
+
+	bool found=false;
+	QFile docfile;
+	for (int i=0; i<searchList.count(); ++i)
 	{
-		// relative path for easy testing in tarball
-		docpath="doc/vym.pdf";
-		if (!QFile (docpath).exists() )
+		docfile.setFileName(searchList.at(i)+"/"+docname);
+		if (docfile.exists())
 		{
-			// relative path for testing while still writing vym.tex
-			docpath="doc/tex/vym.pdf";
-			if (!QFile (docpath).exists() )
-			{
-				QMessageBox::critical(0, 
-				tr("Critcal error"),
-				tr("Couldn't find the documentation\n"
-				"vym.pdf in various places."));
-				return;
-			}	
-		}
+			found=true;
+			break;
+		}	
 	}
-	
+
+	if (!found)
+	{
+		QMessageBox::critical(0, 
+			tr("Critcal error"),
+			tr("Couldn't find the documentation %1 in:\n%2").arg(searchList.join("\n")));
+		return;
+	}	
+
+	QStringList args;
 	Process *pdfProc = new Process();
-	pdfProc->clearArguments();
-	pdfProc->addArgument( settings.readEntry("/vym/mainwindow/readerPDF"));
-	pdfProc->addArgument( docpath);
-
-	if ( !pdfProc->start() ) 
+    args << QDir::toNativeSeparators(docfile.fileName());
+
+	pdfProc->start( settings.value("/mainwindow/readerPDF").toString(),args);
+	if ( !pdfProc->waitForStarted() ) 
 	{
 		// error handling
-		QMessageBox::critical(0, 
-		tr("Critcal error"),
-		tr("Couldn't find a viewer to read vym.pdf.\n"
-		"Please use Settings->")+tr("Set application to open pdf files"));
+		QMessageBox::warning(0, 
+			tr("Warning"),
+			tr("Couldn't find a viewer to open %1.\n").arg(docfile.fileName())+
+			tr("Please use Settings->")+tr("Set application to open PDF files"));
+		settingsPDF();	
 		return;
 	}
 }
 
 
+void Main::helpDemo()
+{
+	QStringList filters;
+	filters <<"VYM example map (*.vym)";
+	QFileDialog *fd=new QFileDialog( this);
+	#if defined(Q_OS_MACX)
+		fd->setDir (QDir("./vym.app/Contents/Resources/demos"));
+	#else
+		// default path in SUSE LINUX
+		fd->setDir (QDir(vymBaseDir.path()+"/demos"));
+	#endif
+
+	fd->setFileMode (QFileDialog::ExistingFiles);
+	fd->setFilters (filters);
+	fd->setCaption(vymName+ " - " +tr("Load vym example map"));
+	fd->show();
+
+	QString fn;
+	if ( fd->exec() == QDialog::Accepted )
+	{
+		lastFileDir=fd->directory().path();
+	    QStringList flist = fd->selectedFiles();
+		QStringList::Iterator it = flist.begin();
+		while( it != flist.end() ) 
+		{
+			fn = *it;
+			fileLoad(*it, NewMap);				   
+			++it;
+		}
+	}
+	delete (fd);
+}
+
+
 void Main::helpAbout()
 {
-    static QMessageBox* about = new QMessageBox( "VYM",
-			"<h3>VYM - View Your Mind </h3>"
-			"<p> A tool to put the things you have got in your mind into a map.</p>"
-			"<ul>"
-				"<li> (c) by Uwe Drechsel (vym@InSilmaril.de)</li>"
-				"<li> vym is released under the GPL (Gnu General Public License)"
-				", with one exception (see the file \"LICENSE\"which "
-				"comes with vym). This exception is needed to build vym with QT libraries for proprietary operating systems.</li>"
-				"<li> Project homepage <a href=\"http:/www.InSilmaril.de/vym\">"
-    					"http:/www.InSilmaril.de/vym</a></li>"
-			"<li> Credits " 
-				"<ul>"
-					"<li>Thomas Schraitle for the stylesheet  used for XHTML-export </li>"
-					"<li>Clemens Kraus for stylesheets and script used for HTML-export "
-					"<a href=\"http://www.clemens-kraus.de\">(www.clemens-kraus.de)</a></li>"
-					"<li>Alexander Johannesen for providing stylesheets from his xsiteable project " 
-					"<a href=\"http://www.shelter.nu/xsiteable/xsiteable.html\">(www.shelter.nu/xsiteable/xsiteable.html)</a>. </li>"
-					"<li>Ken Wimer and Olaf Hering for Mac support</li>"
-				"</ul>"
-			"</li>"
-			"<li> Version "  __VYM_VERSION__  "</li>"
-				"<li> Build date "  __BUILD_DATE__"</li>"
-			"</ul>", QMessageBox::Information, 1, 0, 0, this, 0, FALSE );
-    about->setButtonText( 1, "Dismiss" );
-    about->setMinimumSize(QSize(300,300));
-	about->setIconPixmap (QPixmap(vym_logo_xpm));
-    about->show();
+	AboutDialog ad;
+	ad.setName ("aboutwindow");
+	ad.setMinimumSize(500,500);
+	ad.resize (QSize (500,500));
+	ad.exec();
 }
 
 void Main::helpAboutQT()
@@ -2211,3 +3812,62 @@
 	QMessageBox::aboutQt( this, "Qt Application Example" );
 }
 
+void Main::callMacro ()
+{
+    QAction *action = qobject_cast<QAction *>(sender());
+	int i=-1;
+    if (action)
+	{
+        i=action->data().toInt();
+		QString mDir (settings.value ("macros/macroDir").toString() );
+
+		QString fn=mDir + QString("/macro-%1.vys").arg(i+1);
+		QFile f (fn);
+		if ( !f.open( QIODevice::ReadOnly ) )
+		{
+			QMessageBox::warning(0, 
+				tr("Warning"),
+				tr("Couldn't find a macro at  %1.\n").arg(fn)+
+				tr("Please use Settings->")+tr("Set directory for vym macros"));
+			return;
+		}	
+
+		QTextStream ts( &f );
+		QString m= ts.read();
+
+		if (! m.isEmpty())
+		{
+			//cout <<"Main::callMacro  m="<<qPrintable (m)<<endl;
+			currentMapEditor()->runScript (m);
+		}	
+	}	
+}
+
+
+
+//////////////////////////////////
+/*
+@@ -2544,18 +2576,27 @@
+ 				// Try to open new tab in existing konqueror started previously by vym
+ 				p=new QProcess (this);
+ 				args.clear();
+-				args<< QString("konqueror-%1").arg(procBrowser->pid())<< 
+-					"konqueror-mainwindow#1"<< 
+-					"newTab" << 
++#if defined(Q_OS_WIN32)
++                // In Win32, pid is not a longlong, but a pointer to a _PROCESS_INFORMATION structure.
++                // Redundant change in Win32, as there's no konqueror, but I wanted to follow the original logic.
++				args<< QString("konqueror-%1").arg(procBrowser->pid()->dwProcessId)<<
++					"konqueror-mainwindow#1"<<
++					"newTab" <<
+ 					urls.at(i);
++#else
++				args<< QString("konqueror-%1").arg(procBrowser->pid())<<
++					"konqueror-mainwindow#1"<<
++					"newTab" <<
++					urls.at(i);
++#endif
+ 				p->start ("dcop",args);
+ 				if ( !p->waitForStarted() ) success=false;
+ 			}
+*/			
diff -r 89dd2219982f -r 1c550f80c43b mapeditor.cpp
--- a/mapeditor.cpp	Thu Mar 05 09:33:30 2009 +0000
+++ b/mapeditor.cpp	Tue Mar 10 11:27:17 2009 +0000
@@ -185,9 +185,9 @@
 
 MapEditor::~MapEditor()
 {
-	//cout <<"Destructor MapEditor\n";
-	autosaveTimer->stop();
+	//cout <<"Destructor MapEditor "<<mapName.toStdString()<<endl;
 	fileChangedTimer->stop();
+	clear();
 
 	// tmpMapDir is in tmpVymDir, so it gets removed automagically when vym closes
 	
@@ -1847,7 +1847,7 @@
 
 	// FIXME trying to debug save problem
 	if (saveFile.length()<1000)
-		QMessageBox::critical (0,"Critical error in MapEditor::save",QString("saveFile is too small:\n%1").arg(saveFile));
+		QMessageBox::critical (0,"Critical error in MapEditor::save",QString("saveFile is too small, try make a backup NOW\nof your original file\nbefore vym writes to\"%1\":\n%2").arg(mapName).arg(saveFile));
 	if (!saveStringToDisk(fileDir+mapFileName,saveFile))
 	{
 		err=aborted;
@@ -2169,7 +2169,9 @@
 
 void MapEditor::clear()
 {
-	xelection.unselect();
+	//cout << "ME::clear() "<<mapName.toStdString()<<endl;
+	xelection.clear();
+	autosaveTimer->stop();
 	model->clear();
 }
 
diff -r 89dd2219982f -r 1c550f80c43b tex/vym.changelog
--- a/tex/vym.changelog	Thu Mar 05 09:33:30 2009 +0000
+++ b/tex/vym.changelog	Tue Mar 10 11:27:17 2009 +0000
@@ -1,3 +1,10 @@
+-------------------------------------------------------------------
+Tue Mar 10 12:23:21 CET 2009 - uwedr@suse.de
+
+- Bugfix: Closing a modified map without saving and with autosave
+		   enabled made autosave writing an empty map and thus
+		   destroying the original file 
+
 -------------------------------------------------------------------
 Wed Feb 25 13:43:28 CET 2009 - uwedr@suse.de
 
diff -r 89dd2219982f -r 1c550f80c43b version.h
--- a/version.h	Thu Mar 05 09:33:30 2009 +0000
+++ b/version.h	Tue Mar 10 11:27:17 2009 +0000
@@ -4,10 +4,10 @@
 #include <QString>
 
 #define __VYM_NAME "VYM"
-#define __VYM_VERSION "1.12.2d"
-//#define __VYM_CODENAME "Maintenance Update "
-#define __VYM_CODENAME "Codename: development version"
-#define __VYM_BUILD_DATE "2009-03-04"
+#define __VYM_VERSION "1.12.2e"
+#define __VYM_CODENAME "Maintenance Update "
+//#define __VYM_CODENAME "Codename: development version"
+#define __VYM_BUILD_DATE "2009-03-10"
 
 
 bool checkVersion(const QString &);
diff -r 89dd2219982f -r 1c550f80c43b vymmodel.cpp
--- a/vymmodel.cpp	Thu Mar 05 09:33:30 2009 +0000
+++ b/vymmodel.cpp	Tue Mar 10 11:27:17 2009 +0000
@@ -15,7 +15,8 @@
 
 VymModel::~VymModel() 
 {
-//    cout << "Destr VymModel\n";
+    //cout << "Destr VymModel\n";
+	clear();
 }	
 
 void VymModel::clear()