mapeditor.cpp
changeset 720 192e1392ba6a
parent 714 3368b54c7946
child 723 11f9124c1cca
     1.1 --- a/mapeditor.cpp	Mon Jul 14 11:25:09 2008 +0000
     1.2 +++ b/mapeditor.cpp	Wed Jul 16 10:44:44 2008 +0000
     1.3 @@ -1,27 +1,16 @@
     1.4  #include "mapeditor.h"
     1.5  
     1.6 -#include <q3filedialog.h>
     1.7 -
     1.8  #include <iostream>
     1.9  #include <cstdlib>
    1.10  #include <typeinfo>
    1.11  
    1.12 -#include "parser.h"
    1.13 -#include "editxlinkdialog.h"
    1.14 -#include "exports.h"
    1.15 -#include "exportxhtmldialog.h"
    1.16 -#include "extrainfodialog.h"
    1.17 -#include "file.h"
    1.18 -#include "linkablemapobj.h"
    1.19 +#include <QObject>
    1.20 +
    1.21  #include "mainwindow.h"
    1.22  #include "misc.h"
    1.23 -#include "texteditor.h"
    1.24  #include "warningdialog.h"
    1.25 -#include "xml-freemind.h"
    1.26 -#include "xml-vym.h"
    1.27  
    1.28  
    1.29 -extern TextEditor *textEditor;
    1.30  extern int statusbarTime;
    1.31  extern Main *mainWindow;
    1.32  extern QString tmpVymDir;
    1.33 @@ -40,48 +29,28 @@
    1.34  extern QMenu* floatimageContextMenu;
    1.35  extern QMenu* canvasContextMenu;
    1.36  
    1.37 -
    1.38  extern Settings settings;
    1.39 -extern ImageIO imageIO;
    1.40 -
    1.41 -extern QString vymName;
    1.42 -extern QString vymVersion;
    1.43 -
    1.44  extern QString iconPath;
    1.45 -extern QDir vymBaseDir;
    1.46 -extern QDir lastImageDir;
    1.47 -extern QDir lastFileDir;
    1.48 -
    1.49 -int MapEditor::mapNum=0;	// make instance
    1.50  
    1.51  ///////////////////////////////////////////////////////////////////////
    1.52  ///////////////////////////////////////////////////////////////////////
    1.53 -MapEditor::MapEditor( QWidget* parent) :
    1.54 -  QGraphicsView(parent)  
    1.55 +MapEditor::MapEditor( VymModel *vm) 
    1.56  {
    1.57 -	setObjectName ("MapEditor");
    1.58 -
    1.59  	//cout << "Constructor ME "<<this<<endl;
    1.60 -	mapNum++;
    1.61 -
    1.62 -
    1.63 -	mapScene= new QGraphicsScene(parent);
    1.64 -	//mapScene= new QGraphicsScene(QRectF(0,0,width(),height()), parent);
    1.65 +	mapScene= new QGraphicsScene(NULL);
    1.66  	mapScene->setBackgroundBrush (QBrush(Qt::white, Qt::SolidPattern));
    1.67  
    1.68 -	model=new VymModel();
    1.69 +	model=vm;
    1.70  	model->setScene (mapScene);
    1.71  	model->setMapEditor (this);
    1.72 +	model->registerEditor(this);
    1.73 +	model->addMapCenter();	//  FIXME create this in MapEditor until BO and MCO are independent of scene
    1.74 +	model->makeDefault();
    1.75  
    1.76      setScene (mapScene);
    1.77  
    1.78      printer=NULL;
    1.79  
    1.80 -	defLinkColor=QColor (0,0,255);
    1.81 -	defXLinkColor=QColor (180,180,180);
    1.82 -	linkcolorhint=LinkableMapObj::DefaultColor;
    1.83 -	linkstyle=LinkableMapObj::PolyParabel;
    1.84 -
    1.85  	// Create bitmap cursors, platform dependant
    1.86  	HandOpenCursor=QCursor (QPixmap(iconPath+"cursorhandopen.png"),1,1);		
    1.87  	PickColorCursor=QCursor ( QPixmap(iconPath+"cursorcolorpicker.png"), 5,27 ); 
    1.88 @@ -97,58 +66,31 @@
    1.89      editingBO=NULL;
    1.90      movingObj=NULL;
    1.91  
    1.92 -	xelection.setModel (model);
    1.93 -	xelection.unselect();
    1.94 -
    1.95 -	defXLinkWidth=1;
    1.96 -	defXLinkColor=QColor (230,230,230);
    1.97 -
    1.98 -    mapChanged=false;
    1.99 -	mapDefault=true;
   1.100 -	mapUnsaved=false;
   1.101 -	
   1.102 -	zipped=true;
   1.103 -	filePath="";
   1.104 -	fileName=tr("unnamed");
   1.105 -	mapName="";
   1.106 -
   1.107 -	stepsTotal=settings.readNumEntry("/mapeditor/stepsTotal",100);
   1.108 -	undoSet.setEntry ("/history/stepsTotal",QString::number(stepsTotal));
   1.109 -	mainWindow->updateHistory (undoSet);
   1.110 -	
   1.111 -	// Initialize find routine
   1.112 -	itFind=NULL;				
   1.113 -	EOFind=false;
   1.114 -
   1.115  	printFrame=true;
   1.116  	printFooter=true;
   1.117  
   1.118 -	blockReposition=false;
   1.119 -	blockSaveState=false;
   1.120 -
   1.121 -	hidemode=HideNone;
   1.122 -
   1.123 -	// Create temporary files
   1.124 -	makeTmpDirs();
   1.125 -
   1.126 -	curStep=0;
   1.127 -	redosAvail=0;
   1.128 -	undosAvail=0;
   1.129 -
   1.130  	setAcceptDrops (true);	
   1.131  
   1.132 -	model->reposition();
   1.133 +	model->reposition();	//FIXME really still needed?
   1.134  
   1.135 -	// autosave
   1.136 -	autosaveTimer=new QTimer (this);
   1.137 -	connect(autosaveTimer, SIGNAL(timeout()), this, SLOT(autosave()));
   1.138  
   1.139 -	fileChangedTimer=new QTimer (this);
   1.140 -	fileChangedTimer->start(3000);
   1.141 -	connect(fileChangedTimer, SIGNAL(timeout()), this, SLOT(fileChanged()));
   1.142 +	// Action to embed LineEdit for heading in Scene
   1.143 +	editingHeading=false;
   1.144 +	lineEdit=new QLineEdit;
   1.145 +	lineEdit->hide();
   1.146 +	QGraphicsProxyWidget *pw=scene()->addWidget (lineEdit);
   1.147 +	pw->setZValue (100);
   1.148  
   1.149 -	// Network
   1.150 -	netstate=Offline;
   1.151 +	QAction *a = new QAction( tr( "Edit heading","MapEditor" ), this);
   1.152 +	a->setShortcut ( Qt::Key_Return );					//Edit heading
   1.153 +	//a->setShortcutContext (Qt::WindowShortcut);
   1.154 +	addAction (a);
   1.155 +    connect( a, SIGNAL( triggered() ), this, SLOT( editHeading() ) );
   1.156 +	a = new QAction( tr( "Edit heading","MapEditor" ), this);
   1.157 +	a->setShortcut ( Qt::Key_Enter);					//Edit heading
   1.158 +	//a->setShortcutContext (Qt::WindowShortcut);
   1.159 +	addAction (a);
   1.160 +    connect( a, SIGNAL( triggered() ), this, SLOT( editHeading() ) );
   1.161  
   1.162  	// Attributes	//FIXME testing only...
   1.163  	QString k;
   1.164 @@ -186,13 +128,10 @@
   1.165  MapEditor::~MapEditor()
   1.166  {
   1.167  	//cout <<"Destructor MapEditor\n";
   1.168 -	autosaveTimer->stop();
   1.169 -	fileChangedTimer->stop();
   1.170 -
   1.171  	// tmpMapDir is in tmpVymDir, so it gets removed automagically when vym closes
   1.172  	
   1.173 -	//removeDir(QDir(tmpMapDir));
   1.174 -	delete (model);
   1.175 +	//removeDir(QDir(tmpMapDir));	// FIXME check?!?
   1.176 +	model->unregisterEditor(this);
   1.177  }
   1.178  
   1.179  VymModel* MapEditor::getModel()
   1.180 @@ -205,1650 +144,6 @@
   1.181      return mapScene;
   1.182  }
   1.183  
   1.184 -MapEditor::State MapEditor::getState()
   1.185 -{
   1.186 -    return state;
   1.187 -}
   1.188 -
   1.189 -void MapEditor::setStateEditHeading(bool s)
   1.190 -{
   1.191 -	if (s)
   1.192 -	{
   1.193 -		if (state==Idle) state=EditHeading;
   1.194 -	}
   1.195 -	else	
   1.196 -		state=Idle;
   1.197 -}
   1.198 -
   1.199 -bool MapEditor::isRepositionBlocked()
   1.200 -{
   1.201 -	return blockReposition;
   1.202 -}
   1.203 -
   1.204 -void MapEditor::setSaveStateBlocked(bool b)
   1.205 -{
   1.206 -	blockSaveState=b;
   1.207 -}
   1.208 -
   1.209 -bool MapEditor::isSelectBlocked()
   1.210 -{
   1.211 -	if (state==EditHeading)
   1.212 -		return true;
   1.213 -	else
   1.214 -		return false; 
   1.215 -}
   1.216 -
   1.217 -QString MapEditor::getName (const LinkableMapObj *lmo)
   1.218 -{
   1.219 -	QString s;
   1.220 -	if (!lmo) return QString("Error: NULL has no name!");
   1.221 -
   1.222 -	if ((typeid(*lmo) == typeid(BranchObj) ||
   1.223 -				      typeid(*lmo) == typeid(MapCenterObj))) 
   1.224 -	{
   1.225 -		
   1.226 -		s=(((BranchObj*)lmo)->getHeading());
   1.227 -		if (s=="") s="unnamed";
   1.228 -		return QString("branch (%1)").arg(s);
   1.229 -	}	
   1.230 -	if ((typeid(*lmo) == typeid(FloatImageObj) ))
   1.231 -		return QString ("floatimage [%1]").arg(((FloatImageObj*)lmo)->getOriginalFilename());
   1.232 -	return QString("Unknown type has no name!");
   1.233 -}
   1.234 -
   1.235 -void MapEditor::makeTmpDirs()
   1.236 -{
   1.237 -	// Create unique temporary directories
   1.238 -	tmpMapDir = tmpVymDir+QString("/mapeditor-%1").arg(mapNum);
   1.239 -	histPath = tmpMapDir+"/history";
   1.240 -	QDir d;
   1.241 -	d.mkdir (tmpMapDir);
   1.242 -}
   1.243 -
   1.244 -QString MapEditor::saveToDir(const QString &tmpdir, const QString &prefix, bool writeflags, const QPointF &offset, LinkableMapObj *saveSel)
   1.245 -{
   1.246 -	// tmpdir		temporary directory to which data will be written
   1.247 -	// prefix		mapname, which will be appended to images etc.
   1.248 -	// writeflags	Only write flags for "real" save of map, not undo
   1.249 -	// offset		offset of bbox of whole map in scene. 
   1.250 -	//				Needed for XML export
   1.251 -	
   1.252 -	// Save Header
   1.253 -	QString ls;
   1.254 -	switch (linkstyle)
   1.255 -	{
   1.256 -		case LinkableMapObj::Line: 
   1.257 -			ls="StyleLine";
   1.258 -			break;
   1.259 -		case LinkableMapObj::Parabel:
   1.260 -			ls="StyleParabel";
   1.261 -			break;
   1.262 -		case LinkableMapObj::PolyLine:	
   1.263 -			ls="StylePolyLine";
   1.264 -			break;
   1.265 -		default:
   1.266 -			ls="StylePolyParabel";
   1.267 -			break;
   1.268 -	}	
   1.269 -
   1.270 -	QString s="<?xml version=\"1.0\" encoding=\"utf-8\"?><!DOCTYPE vymmap>\n";
   1.271 -	QString colhint="";
   1.272 -	if (linkcolorhint==LinkableMapObj::HeadingColor) 
   1.273 -		colhint=attribut("linkColorHint","HeadingColor");
   1.274 -
   1.275 -	QString mapAttr=attribut("version",vymVersion);
   1.276 -	if (!saveSel)
   1.277 -		mapAttr+= attribut("author",model->getAuthor()) +
   1.278 -				  attribut("comment",model->getComment()) +
   1.279 -			      attribut("date",model->getDate()) +
   1.280 -		          attribut("backgroundColor", mapScene->backgroundBrush().color().name() ) +
   1.281 -		          attribut("selectionColor", xelection.getColor().name() ) +
   1.282 -		          attribut("linkStyle", ls ) +
   1.283 -		          attribut("linkColor", defLinkColor.name() ) +
   1.284 -		          attribut("defXLinkColor", defXLinkColor.name() ) +
   1.285 -		          attribut("defXLinkWidth", QString().setNum(defXLinkWidth,10) ) +
   1.286 -		          colhint; 
   1.287 -	s+=beginElement("vymmap",mapAttr);
   1.288 -	incIndent();
   1.289 -
   1.290 -	// Find the used flags while traversing the tree
   1.291 -	standardFlagsDefault->resetUsedCounter();
   1.292 -	
   1.293 -	// Reset the counters before saving
   1.294 -	// TODO constr. of FIO creates lots of objects, better do this in some other way...
   1.295 -	FloatImageObj (mapScene).resetSaveCounter();
   1.296 -
   1.297 -	// Build xml recursivly
   1.298 -	if (!saveSel || typeid (*saveSel) == typeid (MapCenterObj))
   1.299 -		// Save complete map, if saveSel not set
   1.300 -		s+=model->saveToDir(tmpdir,prefix,writeflags,offset);
   1.301 -	else
   1.302 -	{
   1.303 -		if ( typeid(*saveSel) == typeid(BranchObj) )
   1.304 -			// Save Subtree
   1.305 -			s+=((BranchObj*)(saveSel))->saveToDir(tmpdir,prefix,offset);
   1.306 -		else if ( typeid(*saveSel) == typeid(FloatImageObj) )
   1.307 -			// Save image
   1.308 -			s+=((FloatImageObj*)(saveSel))->saveToDir(tmpdir,prefix);
   1.309 -	}
   1.310 -
   1.311 -	// Save local settings
   1.312 -	s+=settings.getDataXML (destPath);
   1.313 -
   1.314 -	// Save selection
   1.315 -	if (!xelection.isEmpty() && !saveSel ) 
   1.316 -		s+=valueElement("select",xelection.getSelectString());
   1.317 -
   1.318 -	decIndent();
   1.319 -	s+=endElement("vymmap");
   1.320 -
   1.321 -	if (writeflags)
   1.322 -		standardFlagsDefault->saveToDir (tmpdir+"/flags/","",writeflags);
   1.323 -	return s;
   1.324 -}
   1.325 -
   1.326 -QString MapEditor::getHistoryDir()
   1.327 -{
   1.328 -	QString histName(QString("history-%1").arg(curStep));
   1.329 -	return (tmpMapDir+"/"+histName);
   1.330 -}
   1.331 -
   1.332 -void MapEditor::saveState(const SaveMode &savemode, const QString &undoSelection, const QString &undoCom, const QString &redoSelection, const QString &redoCom, const QString &comment, LinkableMapObj *saveSel)
   1.333 -{
   1.334 -	sendData(redoCom);	//FIXME testing
   1.335 -
   1.336 -	// Main saveState
   1.337 -
   1.338 -
   1.339 -	if (blockSaveState) return;
   1.340 -
   1.341 -	if (debug) cout << "ME::saveState() for  "<<qPrintable (mapName)<<endl;
   1.342 -	
   1.343 -	// Find out current undo directory
   1.344 -	if (undosAvail<stepsTotal) undosAvail++;
   1.345 -	curStep++;
   1.346 -	if (curStep>stepsTotal) curStep=1;
   1.347 -	
   1.348 -	QString backupXML="";
   1.349 -	QString histDir=getHistoryDir();
   1.350 -	QString bakMapPath=histDir+"/map.xml";
   1.351 -
   1.352 -	// Create histDir if not available
   1.353 -	QDir d(histDir);
   1.354 -	if (!d.exists()) 
   1.355 -		makeSubDirs (histDir);
   1.356 -
   1.357 -	// Save depending on how much needs to be saved	
   1.358 -	if (saveSel)
   1.359 -		backupXML=saveToDir (histDir,mapName+"-",false, QPointF (),saveSel);
   1.360 -		
   1.361 -	QString undoCommand="";
   1.362 -	if (savemode==UndoCommand)
   1.363 -	{
   1.364 -		undoCommand=undoCom;
   1.365 -	}	
   1.366 -	else if (savemode==PartOfMap )
   1.367 -	{
   1.368 -		undoCommand=undoCom;
   1.369 -		undoCommand.replace ("PATH",bakMapPath);
   1.370 -	}
   1.371 -
   1.372 -	if (!backupXML.isEmpty())
   1.373 -		// Write XML Data to disk
   1.374 -		saveStringToDisk (bakMapPath,backupXML);
   1.375 -
   1.376 -	// We would have to save all actions in a tree, to keep track of 
   1.377 -	// possible redos after a action. Possible, but we are too lazy: forget about redos.
   1.378 -	redosAvail=0;
   1.379 -
   1.380 -	// Write the current state to disk
   1.381 -	undoSet.setEntry ("/history/undosAvail",QString::number(undosAvail));
   1.382 -	undoSet.setEntry ("/history/redosAvail",QString::number(redosAvail));
   1.383 -	undoSet.setEntry ("/history/curStep",QString::number(curStep));
   1.384 -	undoSet.setEntry (QString("/history/step-%1/undoCommand").arg(curStep),undoCommand);
   1.385 -	undoSet.setEntry (QString("/history/step-%1/undoSelection").arg(curStep),undoSelection);
   1.386 -	undoSet.setEntry (QString("/history/step-%1/redoCommand").arg(curStep),redoCom);
   1.387 -	undoSet.setEntry (QString("/history/step-%1/redoSelection").arg(curStep),redoSelection);
   1.388 -	undoSet.setEntry (QString("/history/step-%1/comment").arg(curStep),comment);
   1.389 -	undoSet.setEntry (QString("/history/version"),vymVersion);
   1.390 -	undoSet.writeSettings(histPath);
   1.391 -
   1.392 -	if (debug)
   1.393 -	{
   1.394 -		// TODO remove after testing
   1.395 -		//cout << "          into="<< histPath.toStdString()<<endl;
   1.396 -		cout << "    stepsTotal="<<stepsTotal<<
   1.397 -		", undosAvail="<<undosAvail<<
   1.398 -		", redosAvail="<<redosAvail<<
   1.399 -		", curStep="<<curStep<<endl;
   1.400 -		cout << "    ---------------------------"<<endl;
   1.401 -		cout << "    comment="<<comment.toStdString()<<endl;
   1.402 -		cout << "    undoCom="<<undoCommand.toStdString()<<endl;
   1.403 -		cout << "    undoSel="<<undoSelection.toStdString()<<endl;
   1.404 -		cout << "    redoCom="<<redoCom.toStdString()<<endl;
   1.405 -		cout << "    redoSel="<<redoSelection.toStdString()<<endl;
   1.406 -		if (saveSel) cout << "    saveSel="<<qPrintable (model->getSelectString(saveSel))<<endl;
   1.407 -		cout << "    ---------------------------"<<endl;
   1.408 -	}
   1.409 -
   1.410 -	mainWindow->updateHistory (undoSet);
   1.411 -	setChanged();
   1.412 -	updateActions();
   1.413 -}
   1.414 -
   1.415 -
   1.416 -void MapEditor::saveStateChangingPart(LinkableMapObj *undoSel, LinkableMapObj* redoSel, const QString &rc, const QString &comment)
   1.417 -{
   1.418 -	// save the selected part of the map, Undo will replace part of map 
   1.419 -	QString undoSelection="";
   1.420 -	if (undoSel)
   1.421 -		undoSelection=model->getSelectString(undoSel);
   1.422 -	else
   1.423 -		qWarning ("MapEditor::saveStateChangingPart  no undoSel given!");
   1.424 -	QString redoSelection="";
   1.425 -	if (redoSel)
   1.426 -		redoSelection=model->getSelectString(undoSel);
   1.427 -	else
   1.428 -		qWarning ("MapEditor::saveStateChangingPart  no redoSel given!");
   1.429 -		
   1.430 -
   1.431 -	saveState (PartOfMap,
   1.432 -		undoSelection, "addMapReplace (\"PATH\")",
   1.433 -		redoSelection, rc, 
   1.434 -		comment, 
   1.435 -		undoSel);
   1.436 -}
   1.437 -
   1.438 -void MapEditor::saveStateRemovingPart(LinkableMapObj *redoSel, const QString &comment)
   1.439 -{
   1.440 -	if (!redoSel)
   1.441 -	{
   1.442 -		qWarning ("MapEditor::saveStateRemovingPart  no redoSel given!");
   1.443 -		return;
   1.444 -	}
   1.445 -	QString undoSelection=model->getSelectString (redoSel->getParObj());
   1.446 -	QString redoSelection=model->getSelectString(redoSel);
   1.447 -	if (typeid(*redoSel) == typeid(BranchObj)  ) 
   1.448 -	{
   1.449 -		// save the selected branch of the map, Undo will insert part of map 
   1.450 -		saveState (PartOfMap,
   1.451 -			undoSelection, QString("addMapInsert (\"PATH\",%1)").arg(((BranchObj*)redoSel)->getNum()),
   1.452 -			redoSelection, "delete ()", 
   1.453 -			comment, 
   1.454 -			redoSel);
   1.455 -	}
   1.456 -}
   1.457 -
   1.458 -
   1.459 -void MapEditor::saveState(LinkableMapObj *undoSel, const QString &uc, LinkableMapObj *redoSel, const QString &rc, const QString &comment) 
   1.460 -{
   1.461 -	// "Normal" savestate: save commands, selections and comment
   1.462 -	// so just save commands for undo and redo
   1.463 -	// and use current selection
   1.464 -
   1.465 -	QString redoSelection="";
   1.466 -	if (redoSel) redoSelection=model->getSelectString(redoSel);
   1.467 -	QString undoSelection="";
   1.468 -	if (undoSel) undoSelection=model->getSelectString(undoSel);
   1.469 -
   1.470 -	saveState (UndoCommand,
   1.471 -		undoSelection, uc,
   1.472 -		redoSelection, rc, 
   1.473 -		comment, 
   1.474 -		NULL);
   1.475 -}
   1.476 -
   1.477 -void MapEditor::saveState(const QString &undoSel, const QString &uc, const QString &redoSel, const QString &rc, const QString &comment) 
   1.478 -{
   1.479 -	// "Normal" savestate: save commands, selections and comment
   1.480 -	// so just save commands for undo and redo
   1.481 -	// and use current selection
   1.482 -	saveState (UndoCommand,
   1.483 -		undoSel, uc,
   1.484 -		redoSel, rc, 
   1.485 -		comment, 
   1.486 -		NULL);
   1.487 -}
   1.488 -
   1.489 -void MapEditor::saveState(const QString &uc, const QString &rc, const QString &comment) 
   1.490 -{
   1.491 -	// "Normal" savestate applied to model (no selection needed): 
   1.492 -	// save commands  and comment
   1.493 -	saveState (UndoCommand,
   1.494 -		NULL, uc,
   1.495 -		NULL, rc, 
   1.496 -		comment, 
   1.497 -		NULL);
   1.498 -}
   1.499 -
   1.500 -		
   1.501 -void MapEditor::parseAtom(const QString &atom)
   1.502 -{
   1.503 -	BranchObj *selb=xelection.getBranch();
   1.504 -	QString s,t;
   1.505 -	double x,y;
   1.506 -	int n;
   1.507 -	bool b,ok;
   1.508 -
   1.509 -	// Split string s into command and parameters
   1.510 -	parser.parseAtom (atom);
   1.511 -	QString com=parser.getCommand();
   1.512 -	
   1.513 -	// External commands
   1.514 -	/////////////////////////////////////////////////////////////////////
   1.515 -	if (com=="addBranch")
   1.516 -	{
   1.517 -		if (xelection.isEmpty())
   1.518 -		{
   1.519 -			parser.setError (Aborted,"Nothing selected");
   1.520 -		} else if (! selb )
   1.521 -		{				  
   1.522 -			parser.setError (Aborted,"Type of selection is not a branch");
   1.523 -		} else 
   1.524 -		{	
   1.525 -			QList <int> pl;
   1.526 -			pl << 0 <<1;
   1.527 -			if (parser.checkParCount(pl))
   1.528 -			{
   1.529 -				if (parser.parCount()==0)
   1.530 -					addNewBranch (0);
   1.531 -				else
   1.532 -				{
   1.533 -					n=parser.parInt (ok,0);
   1.534 -					if (ok ) addNewBranch (n);
   1.535 -				}
   1.536 -			}
   1.537 -		}
   1.538 -	/////////////////////////////////////////////////////////////////////
   1.539 -	} else if (com=="addBranchBefore")
   1.540 -	{
   1.541 -		if (xelection.isEmpty())
   1.542 -		{
   1.543 -			parser.setError (Aborted,"Nothing selected");
   1.544 -		} else if (! selb )
   1.545 -		{				  
   1.546 -			parser.setError (Aborted,"Type of selection is not a branch");
   1.547 -		} else 
   1.548 -		{	
   1.549 -			if (parser.parCount()==0)
   1.550 -			{
   1.551 -				addNewBranchBefore ();
   1.552 -			}	
   1.553 -		}
   1.554 -	/////////////////////////////////////////////////////////////////////
   1.555 -	} else if (com==QString("addMapCenter"))
   1.556 -	{
   1.557 -		if (parser.checkParCount(2))
   1.558 -		{
   1.559 -			x=parser.parDouble (ok,0);
   1.560 -			if (ok)
   1.561 -			{
   1.562 -				y=parser.parDouble (ok,1);
   1.563 -				if (ok) model->addMapCenter (QPointF(x,y));
   1.564 -			}
   1.565 -		}	
   1.566 -	/////////////////////////////////////////////////////////////////////
   1.567 -	} else if (com==QString("addMapReplace"))
   1.568 -	{
   1.569 -		if (xelection.isEmpty())
   1.570 -		{
   1.571 -			parser.setError (Aborted,"Nothing selected");
   1.572 -		} else if (! selb )
   1.573 -		{				  
   1.574 -			parser.setError (Aborted,"Type of selection is not a branch");
   1.575 -		} else if (parser.checkParCount(1))
   1.576 -		{
   1.577 -			//s=parser.parString (ok,0);	// selection
   1.578 -			t=parser.parString (ok,0);	// path to map
   1.579 -			if (QDir::isRelativePath(t)) t=(tmpMapDir + "/"+t);
   1.580 -			addMapReplaceInt(model->getSelectString(selb),t);	
   1.581 -		}
   1.582 -	/////////////////////////////////////////////////////////////////////
   1.583 -	} else if (com==QString("addMapInsert"))
   1.584 -	{
   1.585 -		if (xelection.isEmpty())
   1.586 -		{
   1.587 -			parser.setError (Aborted,"Nothing selected");
   1.588 -		} else if (! selb )
   1.589 -		{				  
   1.590 -			parser.setError (Aborted,"Type of selection is not a branch");
   1.591 -		} else 
   1.592 -		{	
   1.593 -			if (parser.checkParCount(2))
   1.594 -			{
   1.595 -				t=parser.parString (ok,0);	// path to map
   1.596 -				n=parser.parInt(ok,1);		// position
   1.597 -				if (QDir::isRelativePath(t)) t=(tmpMapDir + "/"+t);
   1.598 -				addMapInsertInt(t,n);	
   1.599 -			}
   1.600 -		}
   1.601 -	/////////////////////////////////////////////////////////////////////
   1.602 -	} else if (com=="clearFlags")
   1.603 -	{
   1.604 -		if (xelection.isEmpty() )
   1.605 -		{
   1.606 -			parser.setError (Aborted,"Nothing selected");
   1.607 -		} else if (! selb )
   1.608 -		{				  
   1.609 -			parser.setError (Aborted,"Type of selection is not a branch");
   1.610 -		} else if (parser.checkParCount(0))
   1.611 -		{
   1.612 -			selb->clearStandardFlags();	
   1.613 -			selb->updateFlagsToolbar();
   1.614 -		}
   1.615 -	/////////////////////////////////////////////////////////////////////
   1.616 -	} else if (com=="colorBranch")
   1.617 -	{
   1.618 -		if (xelection.isEmpty())
   1.619 -		{
   1.620 -			parser.setError (Aborted,"Nothing selected");
   1.621 -		} else if (! selb )
   1.622 -		{				  
   1.623 -			parser.setError (Aborted,"Type of selection is not a branch");
   1.624 -		} else if (parser.checkParCount(1))
   1.625 -		{	
   1.626 -			QColor c=parser.parColor (ok,0);
   1.627 -			if (ok) colorBranch (c);
   1.628 -		}	
   1.629 -	/////////////////////////////////////////////////////////////////////
   1.630 -	} else if (com=="colorSubtree")
   1.631 -	{
   1.632 -		if (xelection.isEmpty())
   1.633 -		{
   1.634 -			parser.setError (Aborted,"Nothing selected");
   1.635 -		} else if (! selb )
   1.636 -		{				  
   1.637 -			parser.setError (Aborted,"Type of selection is not a branch");
   1.638 -		} else if (parser.checkParCount(1))
   1.639 -		{	
   1.640 -			QColor c=parser.parColor (ok,0);
   1.641 -			if (ok) colorSubtree (c);
   1.642 -		}	
   1.643 -	/////////////////////////////////////////////////////////////////////
   1.644 -	} else if (com=="copy")
   1.645 -	{
   1.646 -		if (xelection.isEmpty())
   1.647 -		{
   1.648 -			parser.setError (Aborted,"Nothing selected");
   1.649 -		} else if (! selb )
   1.650 -		{				  
   1.651 -			parser.setError (Aborted,"Type of selection is not a branch");
   1.652 -		} else if (parser.checkParCount(0))
   1.653 -		{	
   1.654 -			//FIXME missing action for copy
   1.655 -		}	
   1.656 -	/////////////////////////////////////////////////////////////////////
   1.657 -	} else if (com=="cut")
   1.658 -	{
   1.659 -		if (xelection.isEmpty())
   1.660 -		{
   1.661 -			parser.setError (Aborted,"Nothing selected");
   1.662 -		} else if ( xelection.type()!=Selection::Branch  && 
   1.663 -					xelection.type()!=Selection::MapCenter  &&
   1.664 -					xelection.type()!=Selection::FloatImage )
   1.665 -		{				  
   1.666 -			parser.setError (Aborted,"Type of selection is not a branch or floatimage");
   1.667 -		} else if (parser.checkParCount(0))
   1.668 -		{	
   1.669 -			cut();
   1.670 -		}	
   1.671 -	/////////////////////////////////////////////////////////////////////
   1.672 -	} else if (com=="delete")
   1.673 -	{
   1.674 -		if (xelection.isEmpty())
   1.675 -		{
   1.676 -			parser.setError (Aborted,"Nothing selected");
   1.677 -		} 
   1.678 -		/*else if (xelection.type() != Selection::Branch && xelection.type() != Selection::FloatImage )
   1.679 -		{
   1.680 -			parser.setError (Aborted,"Type of selection is wrong.");
   1.681 -		} 
   1.682 -		*/
   1.683 -		else if (parser.checkParCount(0))
   1.684 -		{	
   1.685 -			deleteSelection();
   1.686 -		}	
   1.687 -	/////////////////////////////////////////////////////////////////////
   1.688 -	} else if (com=="deleteKeepChilds")
   1.689 -	{
   1.690 -		if (xelection.isEmpty())
   1.691 -		{
   1.692 -			parser.setError (Aborted,"Nothing selected");
   1.693 -		} else if (! selb )
   1.694 -		{
   1.695 -			parser.setError (Aborted,"Type of selection is not a branch");
   1.696 -		} else if (parser.checkParCount(0))
   1.697 -		{	
   1.698 -			deleteKeepChilds();
   1.699 -		}	
   1.700 -	/////////////////////////////////////////////////////////////////////
   1.701 -	} else if (com=="deleteChilds")
   1.702 -	{
   1.703 -		if (xelection.isEmpty())
   1.704 -		{
   1.705 -			parser.setError (Aborted,"Nothing selected");
   1.706 -		} else if (! selb)
   1.707 -		{
   1.708 -			parser.setError (Aborted,"Type of selection is not a branch");
   1.709 -		} else if (parser.checkParCount(0))
   1.710 -		{	
   1.711 -			deleteChilds();
   1.712 -		}	
   1.713 -	/////////////////////////////////////////////////////////////////////
   1.714 -	} else if (com=="exportASCII")
   1.715 -	{
   1.716 -		QString fname="";
   1.717 -		ok=true;
   1.718 -		if (parser.parCount()>=1)
   1.719 -			// Hey, we even have a filename
   1.720 -			fname=parser.parString(ok,0); 
   1.721 -		if (!ok)
   1.722 -		{
   1.723 -			parser.setError (Aborted,"Could not read filename");
   1.724 -		} else
   1.725 -		{
   1.726 -				exportASCII (fname,false);
   1.727 -		}
   1.728 -	/////////////////////////////////////////////////////////////////////
   1.729 -	} else if (com=="exportImage")
   1.730 -	{
   1.731 -		QString fname="";
   1.732 -		ok=true;
   1.733 -		if (parser.parCount()>=2)
   1.734 -			// Hey, we even have a filename
   1.735 -			fname=parser.parString(ok,0); 
   1.736 -		if (!ok)
   1.737 -		{
   1.738 -			parser.setError (Aborted,"Could not read filename");
   1.739 -		} else
   1.740 -		{
   1.741 -			QString format="PNG";
   1.742 -			if (parser.parCount()>=2)
   1.743 -			{
   1.744 -				format=parser.parString(ok,1);
   1.745 -			}
   1.746 -			exportImage (fname,false,format);
   1.747 -		}
   1.748 -	/////////////////////////////////////////////////////////////////////
   1.749 -	} else if (com=="exportXHTML")
   1.750 -	{
   1.751 -		QString fname="";
   1.752 -		ok=true;
   1.753 -		if (parser.parCount()>=2)
   1.754 -			// Hey, we even have a filename
   1.755 -			fname=parser.parString(ok,1); 
   1.756 -		if (!ok)
   1.757 -		{
   1.758 -			parser.setError (Aborted,"Could not read filename");
   1.759 -		} else
   1.760 -		{
   1.761 -			exportXHTML (fname,false);
   1.762 -		}
   1.763 -	/////////////////////////////////////////////////////////////////////
   1.764 -	} else if (com=="exportXML")
   1.765 -	{
   1.766 -		QString fname="";
   1.767 -		ok=true;
   1.768 -		if (parser.parCount()>=2)
   1.769 -			// Hey, we even have a filename
   1.770 -			fname=parser.parString(ok,1); 
   1.771 -		if (!ok)
   1.772 -		{
   1.773 -			parser.setError (Aborted,"Could not read filename");
   1.774 -		} else
   1.775 -		{
   1.776 -			exportXML (fname,false);
   1.777 -		}
   1.778 -	/////////////////////////////////////////////////////////////////////
   1.779 -	} else if (com=="importDir")
   1.780 -	{
   1.781 -		if (xelection.isEmpty())
   1.782 -		{
   1.783 -			parser.setError (Aborted,"Nothing selected");
   1.784 -		} else if (! selb )
   1.785 -		{				  
   1.786 -			parser.setError (Aborted,"Type of selection is not a branch");
   1.787 -		} else if (parser.checkParCount(1))
   1.788 -		{
   1.789 -			s=parser.parString(ok,0);
   1.790 -			if (ok) importDirInt(s);
   1.791 -		}	
   1.792 -	/////////////////////////////////////////////////////////////////////
   1.793 -	} else if (com=="linkTo")
   1.794 -	{
   1.795 -		if (xelection.isEmpty())
   1.796 -		{
   1.797 -			parser.setError (Aborted,"Nothing selected");
   1.798 -		} else if ( selb)
   1.799 -		{
   1.800 -			if (parser.checkParCount(4))
   1.801 -			{
   1.802 -				// 0	selectstring of parent
   1.803 -				// 1	num in parent (for branches)
   1.804 -				// 2,3	x,y of mainbranch or mapcenter
   1.805 -				s=parser.parString(ok,0);
   1.806 -				LinkableMapObj *dst=model->findObjBySelect (s);
   1.807 -				if (dst)
   1.808 -				{	
   1.809 -					if (typeid(*dst) == typeid(BranchObj) ) 
   1.810 -					{
   1.811 -						// Get number in parent
   1.812 -						n=parser.parInt (ok,1);
   1.813 -						if (ok)
   1.814 -						{
   1.815 -							selb->linkTo ((BranchObj*)(dst),n);
   1.816 -							xelection.update();
   1.817 -						}	
   1.818 -					} else if (typeid(*dst) == typeid(MapCenterObj) ) 
   1.819 -					{
   1.820 -						selb->linkTo ((BranchObj*)(dst),-1);
   1.821 -						// Get coordinates of mainbranch
   1.822 -						x=parser.parDouble(ok,2);
   1.823 -						if (ok)
   1.824 -						{
   1.825 -							y=parser.parDouble(ok,3);
   1.826 -							if (ok) 
   1.827 -							{
   1.828 -								selb->move (x,y);
   1.829 -								xelection.update();
   1.830 -							}
   1.831 -						}
   1.832 -					}	
   1.833 -				}	
   1.834 -			}	
   1.835 -		} else if ( xelection.type() == Selection::FloatImage) 
   1.836 -		{
   1.837 -			if (parser.checkParCount(1))
   1.838 -			{
   1.839 -				// 0	selectstring of parent
   1.840 -				s=parser.parString(ok,0);
   1.841 -				LinkableMapObj *dst=model->findObjBySelect (s);
   1.842 -				if (dst)
   1.843 -				{	
   1.844 -					if (typeid(*dst) == typeid(BranchObj) ||
   1.845 -						typeid(*dst) == typeid(MapCenterObj)) 
   1.846 -						linkTo (model->getSelectString(dst));
   1.847 -				} else	
   1.848 -					parser.setError (Aborted,"Destination is not a branch");
   1.849 -			}		
   1.850 -		} else
   1.851 -			parser.setError (Aborted,"Type of selection is not a floatimage or branch");
   1.852 -	/////////////////////////////////////////////////////////////////////
   1.853 -	} else if (com=="loadImage")
   1.854 -	{
   1.855 -		if (xelection.isEmpty())
   1.856 -		{
   1.857 -			parser.setError (Aborted,"Nothing selected");
   1.858 -		} else if (! selb )
   1.859 -		{				  
   1.860 -			parser.setError (Aborted,"Type of selection is not a branch");
   1.861 -		} else if (parser.checkParCount(1))
   1.862 -		{
   1.863 -			s=parser.parString(ok,0);
   1.864 -			if (ok) loadFloatImageInt (s);
   1.865 -		}	
   1.866 -	/////////////////////////////////////////////////////////////////////
   1.867 -	} else if (com=="moveBranchUp")
   1.868 -	{
   1.869 -		if (xelection.isEmpty() )
   1.870 -		{
   1.871 -			parser.setError (Aborted,"Nothing selected");
   1.872 -		} else if (! selb )
   1.873 -		{				  
   1.874 -			parser.setError (Aborted,"Type of selection is not a branch");
   1.875 -		} else if (parser.checkParCount(0))
   1.876 -		{
   1.877 -			moveBranchUp();
   1.878 -		}	
   1.879 -	/////////////////////////////////////////////////////////////////////
   1.880 -	} else if (com=="moveBranchDown")
   1.881 -	{
   1.882 -		if (xelection.isEmpty() )
   1.883 -		{
   1.884 -			parser.setError (Aborted,"Nothing selected");
   1.885 -		} else if (! selb )
   1.886 -		{				  
   1.887 -			parser.setError (Aborted,"Type of selection is not a branch");
   1.888 -		} else if (parser.checkParCount(0))
   1.889 -		{
   1.890 -			moveBranchDown();
   1.891 -		}	
   1.892 -	/////////////////////////////////////////////////////////////////////
   1.893 -	} else if (com=="move")
   1.894 -	{
   1.895 -		if (xelection.isEmpty() )
   1.896 -		{
   1.897 -			parser.setError (Aborted,"Nothing selected");
   1.898 -		} else if ( xelection.type()!=Selection::Branch  && 
   1.899 -					xelection.type()!=Selection::MapCenter  &&
   1.900 -					xelection.type()!=Selection::FloatImage )
   1.901 -		{				  
   1.902 -			parser.setError (Aborted,"Type of selection is not a branch or floatimage");
   1.903 -		} else if (parser.checkParCount(2))
   1.904 -		{	
   1.905 -			x=parser.parDouble (ok,0);
   1.906 -			if (ok)
   1.907 -			{
   1.908 -				y=parser.parDouble (ok,1);
   1.909 -				if (ok) move (x,y);
   1.910 -			}
   1.911 -		}	
   1.912 -	/////////////////////////////////////////////////////////////////////
   1.913 -	} else if (com=="moveRel")
   1.914 -	{
   1.915 -		if (xelection.isEmpty() )
   1.916 -		{
   1.917 -			parser.setError (Aborted,"Nothing selected");
   1.918 -		} else if ( xelection.type()!=Selection::Branch  && 
   1.919 -					xelection.type()!=Selection::MapCenter  &&
   1.920 -					xelection.type()!=Selection::FloatImage )
   1.921 -		{				  
   1.922 -			parser.setError (Aborted,"Type of selection is not a branch or floatimage");
   1.923 -		} else if (parser.checkParCount(2))
   1.924 -		{	
   1.925 -			x=parser.parDouble (ok,0);
   1.926 -			if (ok)
   1.927 -			{
   1.928 -				y=parser.parDouble (ok,1);
   1.929 -				if (ok) moveRel (x,y);
   1.930 -			}
   1.931 -		}	
   1.932 -	/////////////////////////////////////////////////////////////////////
   1.933 -	} else if (com=="nop")
   1.934 -	{
   1.935 -	/////////////////////////////////////////////////////////////////////
   1.936 -	} else if (com=="paste")
   1.937 -	{
   1.938 -		if (xelection.isEmpty() )
   1.939 -		{
   1.940 -			parser.setError (Aborted,"Nothing selected");
   1.941 -		} else if (! selb )
   1.942 -		{				  
   1.943 -			parser.setError (Aborted,"Type of selection is not a branch");
   1.944 -		} else if (parser.checkParCount(1))
   1.945 -		{	
   1.946 -			n=parser.parInt (ok,0);
   1.947 -			if (ok) pasteNoSave(n);
   1.948 -		}	
   1.949 -	/////////////////////////////////////////////////////////////////////
   1.950 -	} else if (com=="qa")
   1.951 -	{
   1.952 -		if (xelection.isEmpty() )
   1.953 -		{
   1.954 -			parser.setError (Aborted,"Nothing selected");
   1.955 -		} else if (! selb )
   1.956 -		{				  
   1.957 -			parser.setError (Aborted,"Type of selection is not a branch");
   1.958 -		} else if (parser.checkParCount(4))
   1.959 -		{	
   1.960 -			QString c,u;
   1.961 -			c=parser.parString (ok,0);
   1.962 -			if (!ok)
   1.963 -			{
   1.964 -				parser.setError (Aborted,"No comment given");
   1.965 -			} else
   1.966 -			{
   1.967 -				s=parser.parString (ok,1);
   1.968 -				if (!ok)
   1.969 -				{
   1.970 -					parser.setError (Aborted,"First parameter is not a string");
   1.971 -				} else
   1.972 -				{
   1.973 -					t=parser.parString (ok,2);
   1.974 -					if (!ok)
   1.975 -					{
   1.976 -						parser.setError (Aborted,"Condition is not a string");
   1.977 -					} else
   1.978 -					{
   1.979 -						u=parser.parString (ok,3);
   1.980 -						if (!ok)
   1.981 -						{
   1.982 -							parser.setError (Aborted,"Third parameter is not a string");
   1.983 -						} else
   1.984 -						{
   1.985 -							if (s!="heading")
   1.986 -							{
   1.987 -								parser.setError (Aborted,"Unknown type: "+s);
   1.988 -							} else
   1.989 -							{
   1.990 -								if (! (t=="eq") ) 
   1.991 -								{
   1.992 -									parser.setError (Aborted,"Unknown operator: "+t);
   1.993 -								} else
   1.994 -								{
   1.995 -									if (! selb    )
   1.996 -									{
   1.997 -										parser.setError (Aborted,"Type of selection is not a branch");
   1.998 -									} else
   1.999 -									{
  1.1000 -										if (selb->getHeading() == u)
  1.1001 -										{
  1.1002 -											cout << "PASSED: " << qPrintable (c)  << endl;
  1.1003 -										} else
  1.1004 -										{
  1.1005 -											cout << "FAILED: " << qPrintable (c)  << endl;
  1.1006 -										}
  1.1007 -									}
  1.1008 -								}
  1.1009 -							}
  1.1010 -						} 
  1.1011 -					} 
  1.1012 -				} 
  1.1013 -			}
  1.1014 -		}	
  1.1015 -	/////////////////////////////////////////////////////////////////////
  1.1016 -	} else if (com=="saveImage")
  1.1017 -	{
  1.1018 -		FloatImageObj *fio=xelection.getFloatImage();
  1.1019 -		if (!fio)
  1.1020 -		{
  1.1021 -			parser.setError (Aborted,"Type of selection is not an image");
  1.1022 -		} else if (parser.checkParCount(2))
  1.1023 -		{
  1.1024 -			s=parser.parString(ok,0);
  1.1025 -			if (ok)
  1.1026 -			{
  1.1027 -				t=parser.parString(ok,1);
  1.1028 -				if (ok) saveFloatImageInt (fio,t,s);
  1.1029 -			}
  1.1030 -		}	
  1.1031 -	/////////////////////////////////////////////////////////////////////
  1.1032 -	} else if (com=="scroll")
  1.1033 -	{
  1.1034 -		if (xelection.isEmpty() )
  1.1035 -		{
  1.1036 -			parser.setError (Aborted,"Nothing selected");
  1.1037 -		} else if (! selb )
  1.1038 -		{				  
  1.1039 -			parser.setError (Aborted,"Type of selection is not a branch");
  1.1040 -		} else if (parser.checkParCount(0))
  1.1041 -		{	
  1.1042 -			if (!scrollBranch (selb))	
  1.1043 -				parser.setError (Aborted,"Could not scroll branch");
  1.1044 -		}	
  1.1045 -	/////////////////////////////////////////////////////////////////////
  1.1046 -	} else if (com=="select")
  1.1047 -	{
  1.1048 -		if (parser.checkParCount(1))
  1.1049 -		{
  1.1050 -			s=parser.parString(ok,0);
  1.1051 -			if (ok) select (s);
  1.1052 -		}	
  1.1053 -	/////////////////////////////////////////////////////////////////////
  1.1054 -	} else if (com=="selectLastBranch")
  1.1055 -	{
  1.1056 -		if (xelection.isEmpty() )
  1.1057 -		{
  1.1058 -			parser.setError (Aborted,"Nothing selected");
  1.1059 -		} else if (! selb )
  1.1060 -		{				  
  1.1061 -			parser.setError (Aborted,"Type of selection is not a branch");
  1.1062 -		} else if (parser.checkParCount(0))
  1.1063 -		{	
  1.1064 -			BranchObj *bo=selb->getLastBranch();
  1.1065 -			if (!bo)
  1.1066 -				parser.setError (Aborted,"Could not select last branch");
  1.1067 -			selectInt (bo);	
  1.1068 -				
  1.1069 -		}	
  1.1070 -	/////////////////////////////////////////////////////////////////////
  1.1071 -	} else if (com=="selectLastImage")
  1.1072 -	{
  1.1073 -		if (xelection.isEmpty() )
  1.1074 -		{
  1.1075 -			parser.setError (Aborted,"Nothing selected");
  1.1076 -		} else if (! selb )
  1.1077 -		{				  
  1.1078 -			parser.setError (Aborted,"Type of selection is not a branch");
  1.1079 -		} else if (parser.checkParCount(0))
  1.1080 -		{	
  1.1081 -			FloatImageObj *fio=selb->getLastFloatImage();
  1.1082 -			if (!fio)
  1.1083 -				parser.setError (Aborted,"Could not select last image");
  1.1084 -			selectInt (fio);	
  1.1085 -				
  1.1086 -		}	
  1.1087 -	/////////////////////////////////////////////////////////////////////
  1.1088 -	} else if (com=="selectLatestAdded")
  1.1089 -	{
  1.1090 -		if (latestSelection.isEmpty() )
  1.1091 -		{
  1.1092 -			parser.setError (Aborted,"No latest added object");
  1.1093 -		} else
  1.1094 -		{	
  1.1095 -			if (!select (latestSelection))
  1.1096 -				parser.setError (Aborted,"Could not select latest added object "+latestSelection);
  1.1097 -		}	
  1.1098 -	/////////////////////////////////////////////////////////////////////
  1.1099 -	} else if (com=="setFrameType")
  1.1100 -	{
  1.1101 -		if ( xelection.type()!=Selection::Branch && xelection.type()!= Selection::MapCenter && xelection.type()!=Selection::FloatImage)
  1.1102 -		{
  1.1103 -			parser.setError (Aborted,"Type of selection does not allow setting frame type");
  1.1104 -		}
  1.1105 -		else if (parser.checkParCount(1))
  1.1106 -		{
  1.1107 -			s=parser.parString(ok,0);
  1.1108 -			if (ok) setFrameType (s);
  1.1109 -		}	
  1.1110 -	/////////////////////////////////////////////////////////////////////
  1.1111 -	} else if (com=="setFramePenColor")
  1.1112 -	{
  1.1113 -		if ( xelection.type()!=Selection::Branch && xelection.type()!= Selection::MapCenter && xelection.type()!=Selection::FloatImage)
  1.1114 -		{
  1.1115 -			parser.setError (Aborted,"Type of selection does not allow setting of pen color");
  1.1116 -		}
  1.1117 -		else if (parser.checkParCount(1))
  1.1118 -		{
  1.1119 -			QColor c=parser.parColor(ok,0);
  1.1120 -			if (ok) setFramePenColor (c);
  1.1121 -		}	
  1.1122 -	/////////////////////////////////////////////////////////////////////
  1.1123 -	} else if (com=="setFrameBrushColor")
  1.1124 -	{
  1.1125 -		if ( xelection.type()!=Selection::Branch && xelection.type()!= Selection::MapCenter && xelection.type()!=Selection::FloatImage)
  1.1126 -		{
  1.1127 -			parser.setError (Aborted,"Type of selection does not allow setting brush color");
  1.1128 -		}
  1.1129 -		else if (parser.checkParCount(1))
  1.1130 -		{
  1.1131 -			QColor c=parser.parColor(ok,0);
  1.1132 -			if (ok) setFrameBrushColor (c);
  1.1133 -		}	
  1.1134 -	/////////////////////////////////////////////////////////////////////
  1.1135 -	} else if (com=="setFramePadding")
  1.1136 -	{
  1.1137 -		if ( xelection.type()!=Selection::Branch && xelection.type()!= Selection::MapCenter && xelection.type()!=Selection::FloatImage)
  1.1138 -		{
  1.1139 -			parser.setError (Aborted,"Type of selection does not allow setting frame padding");
  1.1140 -		}
  1.1141 -		else if (parser.checkParCount(1))
  1.1142 -		{
  1.1143 -			n=parser.parInt(ok,0);
  1.1144 -			if (ok) setFramePadding(n);
  1.1145 -		}	
  1.1146 -	/////////////////////////////////////////////////////////////////////
  1.1147 -	} else if (com=="setFrameBorderWidth")
  1.1148 -	{
  1.1149 -		if ( xelection.type()!=Selection::Branch && xelection.type()!= Selection::MapCenter && xelection.type()!=Selection::FloatImage)
  1.1150 -		{
  1.1151 -			parser.setError (Aborted,"Type of selection does not allow setting frame border width");
  1.1152 -		}
  1.1153 -		else if (parser.checkParCount(1))
  1.1154 -		{
  1.1155 -			n=parser.parInt(ok,0);
  1.1156 -			if (ok) setFrameBorderWidth (n);
  1.1157 -		}	
  1.1158 -	/////////////////////////////////////////////////////////////////////
  1.1159 -	} else if (com=="setMapAuthor")
  1.1160 -	{
  1.1161 -		if (parser.checkParCount(1))
  1.1162 -		{
  1.1163 -			s=parser.parString(ok,0);
  1.1164 -			if (ok) setMapAuthor (s);
  1.1165 -		}	
  1.1166 -	/////////////////////////////////////////////////////////////////////
  1.1167 -	} else if (com=="setMapComment")
  1.1168 -	{
  1.1169 -		if (parser.checkParCount(1))
  1.1170 -		{
  1.1171 -			s=parser.parString(ok,0);
  1.1172 -			if (ok) setMapComment(s);
  1.1173 -		}	
  1.1174 -	/////////////////////////////////////////////////////////////////////
  1.1175 -	} else if (com=="setMapBackgroundColor")
  1.1176 -	{
  1.1177 -		if (xelection.isEmpty() )
  1.1178 -		{
  1.1179 -			parser.setError (Aborted,"Nothing selected");
  1.1180 -		} else if (! xelection.getBranch() )
  1.1181 -		{				  
  1.1182 -			parser.setError (Aborted,"Type of selection is not a branch");
  1.1183 -		} else if (parser.checkParCount(1))
  1.1184 -		{
  1.1185 -			QColor c=parser.parColor (ok,0);
  1.1186 -			if (ok) setMapBackgroundColor (c);
  1.1187 -		}	
  1.1188 -	/////////////////////////////////////////////////////////////////////
  1.1189 -	} else if (com=="setMapDefLinkColor")
  1.1190 -	{
  1.1191 -		if (xelection.isEmpty() )
  1.1192 -		{
  1.1193 -			parser.setError (Aborted,"Nothing selected");
  1.1194 -		} else if (! selb )
  1.1195 -		{				  
  1.1196 -			parser.setError (Aborted,"Type of selection is not a branch");
  1.1197 -		} else if (parser.checkParCount(1))
  1.1198 -		{
  1.1199 -			QColor c=parser.parColor (ok,0);
  1.1200 -			if (ok) setMapDefLinkColor (c);
  1.1201 -		}	
  1.1202 -	/////////////////////////////////////////////////////////////////////
  1.1203 -	} else if (com=="setMapLinkStyle")
  1.1204 -	{
  1.1205 -		if (parser.checkParCount(1))
  1.1206 -		{
  1.1207 -			s=parser.parString (ok,0);
  1.1208 -			if (ok) setMapLinkStyle(s);
  1.1209 -		}	
  1.1210 -	/////////////////////////////////////////////////////////////////////
  1.1211 -	} else if (com=="setHeading")
  1.1212 -	{
  1.1213 -		if (xelection.isEmpty() )
  1.1214 -		{
  1.1215 -			parser.setError (Aborted,"Nothing selected");
  1.1216 -		} else if (! selb )
  1.1217 -		{				  
  1.1218 -			parser.setError (Aborted,"Type of selection is not a branch");
  1.1219 -		} else if (parser.checkParCount(1))
  1.1220 -		{
  1.1221 -			s=parser.parString (ok,0);
  1.1222 -			if (ok) 
  1.1223 -				setHeading (s);
  1.1224 -		}	
  1.1225 -	/////////////////////////////////////////////////////////////////////
  1.1226 -	} else if (com=="setHideExport")
  1.1227 -	{
  1.1228 -		if (xelection.isEmpty() )
  1.1229 -		{
  1.1230 -			parser.setError (Aborted,"Nothing selected");
  1.1231 -		} else if (xelection.type()!=Selection::Branch && xelection.type() != Selection::MapCenter &&xelection.type()!=Selection::FloatImage)
  1.1232 -		{				  
  1.1233 -			parser.setError (Aborted,"Type of selection is not a branch or floatimage");
  1.1234 -		} else if (parser.checkParCount(1))
  1.1235 -		{
  1.1236 -			b=parser.parBool(ok,0);
  1.1237 -			if (ok) setHideExport (b);
  1.1238 -		}
  1.1239 -	/////////////////////////////////////////////////////////////////////
  1.1240 -	} else if (com=="setIncludeImagesHorizontally")
  1.1241 -	{ 
  1.1242 -		if (xelection.isEmpty() )
  1.1243 -		{
  1.1244 -			parser.setError (Aborted,"Nothing selected");
  1.1245 -		} else if (! selb)
  1.1246 -		{				  
  1.1247 -			parser.setError (Aborted,"Type of selection is not a branch");
  1.1248 -		} else if (parser.checkParCount(1))
  1.1249 -		{
  1.1250 -			b=parser.parBool(ok,0);
  1.1251 -			if (ok) setIncludeImagesHor(b);
  1.1252 -		}
  1.1253 -	/////////////////////////////////////////////////////////////////////
  1.1254 -	} else if (com=="setIncludeImagesVertically")
  1.1255 -	{
  1.1256 -		if (xelection.isEmpty() )
  1.1257 -		{
  1.1258 -			parser.setError (Aborted,"Nothing selected");
  1.1259 -		} else if (! selb)
  1.1260 -		{				  
  1.1261 -			parser.setError (Aborted,"Type of selection is not a branch");
  1.1262 -		} else if (parser.checkParCount(1))
  1.1263 -		{
  1.1264 -			b=parser.parBool(ok,0);
  1.1265 -			if (ok) setIncludeImagesVer(b);
  1.1266 -		}
  1.1267 -	/////////////////////////////////////////////////////////////////////
  1.1268 -	} else if (com=="setHideLinkUnselected")
  1.1269 -	{
  1.1270 -		if (xelection.isEmpty() )
  1.1271 -		{
  1.1272 -			parser.setError (Aborted,"Nothing selected");
  1.1273 -		} else if ( xelection.type()!=Selection::Branch && xelection.type()!= Selection::MapCenter && xelection.type()!=Selection::FloatImage)
  1.1274 -		{				  
  1.1275 -			parser.setError (Aborted,"Type of selection does not allow hiding the link");
  1.1276 -		} else if (parser.checkParCount(1))
  1.1277 -		{
  1.1278 -			b=parser.parBool(ok,0);
  1.1279 -			if (ok) setHideLinkUnselected(b);
  1.1280 -		}
  1.1281 -	/////////////////////////////////////////////////////////////////////
  1.1282 -	} else if (com=="setSelectionColor")
  1.1283 -	{
  1.1284 -		if (parser.checkParCount(1))
  1.1285 -		{
  1.1286 -			QColor c=parser.parColor (ok,0);
  1.1287 -			if (ok) setSelectionColorInt (c);
  1.1288 -		}	
  1.1289 -	/////////////////////////////////////////////////////////////////////
  1.1290 -	} else if (com=="setURL")
  1.1291 -	{
  1.1292 -		if (xelection.isEmpty() )
  1.1293 -		{
  1.1294 -			parser.setError (Aborted,"Nothing selected");
  1.1295 -		} else if (! selb )
  1.1296 -		{				  
  1.1297 -			parser.setError (Aborted,"Type of selection is not a branch");
  1.1298 -		} else if (parser.checkParCount(1))
  1.1299 -		{
  1.1300 -			s=parser.parString (ok,0);
  1.1301 -			if (ok) setURL(s);
  1.1302 -		}	
  1.1303 -	/////////////////////////////////////////////////////////////////////
  1.1304 -	} else if (com=="setVymLink")
  1.1305 -	{
  1.1306 -		if (xelection.isEmpty() )
  1.1307 -		{
  1.1308 -			parser.setError (Aborted,"Nothing selected");
  1.1309 -		} else if (! selb )
  1.1310 -		{				  
  1.1311 -			parser.setError (Aborted,"Type of selection is not a branch");
  1.1312 -		} else if (parser.checkParCount(1))
  1.1313 -		{
  1.1314 -			s=parser.parString (ok,0);
  1.1315 -			if (ok) setVymLinkInt(s);
  1.1316 -		}	
  1.1317 -	}
  1.1318 -	/////////////////////////////////////////////////////////////////////
  1.1319 -	else if (com=="setFlag")
  1.1320 -	{
  1.1321 -		if (xelection.isEmpty() )
  1.1322 -		{
  1.1323 -			parser.setError (Aborted,"Nothing selected");
  1.1324 -		} else if (! selb )
  1.1325 -		{				  
  1.1326 -			parser.setError (Aborted,"Type of selection is not a branch");
  1.1327 -		} else if (parser.checkParCount(1))
  1.1328 -		{
  1.1329 -			s=parser.parString(ok,0);
  1.1330 -			if (ok) 
  1.1331 -			{
  1.1332 -				selb->activateStandardFlag(s);
  1.1333 -				selb->updateFlagsToolbar();
  1.1334 -			}	
  1.1335 -		}
  1.1336 -	/////////////////////////////////////////////////////////////////////
  1.1337 -	} else if (com=="setFrameType")
  1.1338 -	{
  1.1339 -		if (xelection.isEmpty() )
  1.1340 -		{
  1.1341 -			parser.setError (Aborted,"Nothing selected");
  1.1342 -		} else if (! selb )
  1.1343 -		{				  
  1.1344 -			parser.setError (Aborted,"Type of selection is not a branch");
  1.1345 -		} else if (parser.checkParCount(1))
  1.1346 -		{
  1.1347 -			s=parser.parString(ok,0);
  1.1348 -			if (ok) 
  1.1349 -				setFrameType (s);
  1.1350 -		}
  1.1351 -	/////////////////////////////////////////////////////////////////////
  1.1352 -	} else if (com=="sortChildren")
  1.1353 -	{
  1.1354 -		if (xelection.isEmpty() )
  1.1355 -		{
  1.1356 -			parser.setError (Aborted,"Nothing selected");
  1.1357 -		} else if (! selb )
  1.1358 -		{				  
  1.1359 -			parser.setError (Aborted,"Type of selection is not a branch");
  1.1360 -		} else if (parser.checkParCount(0))
  1.1361 -		{
  1.1362 -			sortChildren();
  1.1363 -		}
  1.1364 -	/////////////////////////////////////////////////////////////////////
  1.1365 -	} else if (com=="toggleFlag")
  1.1366 -	{
  1.1367 -		if (xelection.isEmpty() )
  1.1368 -		{
  1.1369 -			parser.setError (Aborted,"Nothing selected");
  1.1370 -		} else if (! selb )
  1.1371 -		{				  
  1.1372 -			parser.setError (Aborted,"Type of selection is not a branch");
  1.1373 -		} else if (parser.checkParCount(1))
  1.1374 -		{
  1.1375 -			s=parser.parString(ok,0);
  1.1376 -			if (ok) 
  1.1377 -			{
  1.1378 -				selb->toggleStandardFlag(s);	
  1.1379 -				selb->updateFlagsToolbar();
  1.1380 -			}	
  1.1381 -		}
  1.1382 -	/////////////////////////////////////////////////////////////////////
  1.1383 -	} else if (com=="unscroll")
  1.1384 -	{
  1.1385 -		if (xelection.isEmpty() )
  1.1386 -		{
  1.1387 -			parser.setError (Aborted,"Nothing selected");
  1.1388 -		} else if (! selb )
  1.1389 -		{				  
  1.1390 -			parser.setError (Aborted,"Type of selection is not a branch");
  1.1391 -		} else if (parser.checkParCount(0))
  1.1392 -		{	
  1.1393 -			if (!unscrollBranch (selb))	
  1.1394 -				parser.setError (Aborted,"Could not unscroll branch");
  1.1395 -		}	
  1.1396 -	/////////////////////////////////////////////////////////////////////
  1.1397 -	} else if (com=="unscrollChilds")
  1.1398 -	{
  1.1399 -		if (xelection.isEmpty() )
  1.1400 -		{
  1.1401 -			parser.setError (Aborted,"Nothing selected");
  1.1402 -		} else if (! selb )
  1.1403 -		{				  
  1.1404 -			parser.setError (Aborted,"Type of selection is not a branch");
  1.1405 -		} else if (parser.checkParCount(0))
  1.1406 -		{	
  1.1407 -			unscrollChilds ();
  1.1408 -		}	
  1.1409 -	/////////////////////////////////////////////////////////////////////
  1.1410 -	} else if (com=="unsetFlag")
  1.1411 -	{
  1.1412 -		if (xelection.isEmpty() )
  1.1413 -		{
  1.1414 -			parser.setError (Aborted,"Nothing selected");
  1.1415 -		} else if (! selb )
  1.1416 -		{				  
  1.1417 -			parser.setError (Aborted,"Type of selection is not a branch");
  1.1418 -		} else if (parser.checkParCount(1))
  1.1419 -		{
  1.1420 -			s=parser.parString(ok,0);
  1.1421 -			if (ok) 
  1.1422 -			{
  1.1423 -				selb->deactivateStandardFlag(s);
  1.1424 -				selb->updateFlagsToolbar();
  1.1425 -			}	
  1.1426 -		}
  1.1427 -	} else
  1.1428 -		parser.setError (Aborted,"Unknown command");
  1.1429 -
  1.1430 -	// Any errors?
  1.1431 -	if (parser.errorLevel()==NoError)
  1.1432 -	{
  1.1433 -		// setChanged();  FIXME should not be called e.g. for export?!
  1.1434 -		model->reposition();
  1.1435 -	}	
  1.1436 -	else	
  1.1437 -	{
  1.1438 -		// TODO Error handling
  1.1439 -		qWarning("MapEditor::parseAtom: Error!");
  1.1440 -		qWarning(parser.errorMessage());
  1.1441 -	} 
  1.1442 -}
  1.1443 -
  1.1444 -void MapEditor::runScript (QString script)
  1.1445 -{
  1.1446 -	parser.setScript (script);
  1.1447 -	parser.runScript();
  1.1448 -	while (parser.next() ) 
  1.1449 -		parseAtom(parser.getAtom());
  1.1450 -}
  1.1451 -
  1.1452 -bool MapEditor::isDefault()
  1.1453 -{
  1.1454 -    return mapDefault;
  1.1455 -}
  1.1456 -
  1.1457 -bool MapEditor::hasChanged()
  1.1458 -{
  1.1459 -    return mapChanged;
  1.1460 -}
  1.1461 -
  1.1462 -void MapEditor::setChanged()
  1.1463 -{
  1.1464 -	if (!mapChanged)
  1.1465 -		autosaveTimer->start(settings.value("/mapeditor/autosave/ms/",300000).toInt());
  1.1466 -	mapChanged=true;
  1.1467 -	mapDefault=false;
  1.1468 -	mapUnsaved=true;
  1.1469 -	findReset();
  1.1470 -
  1.1471 -}
  1.1472 -
  1.1473 -void MapEditor::closeMap()
  1.1474 -{
  1.1475 -	// Unselect before disabling the toolbar actions
  1.1476 -	if (!xelection.isEmpty() ) xelection.unselect();
  1.1477 -	xelection.clear();
  1.1478 -	updateActions();
  1.1479 -
  1.1480 -    clear();
  1.1481 -	// close();  FIXME needed?
  1.1482 -}
  1.1483 -
  1.1484 -void MapEditor::setFilePath(QString fpath, QString destname)
  1.1485 -{
  1.1486 -	if (fpath.isEmpty() || fpath=="")
  1.1487 -	{
  1.1488 -		filePath="";
  1.1489 -		fileName="";
  1.1490 -		destPath="";
  1.1491 -	} else
  1.1492 -	{
  1.1493 -		filePath=fpath;		// becomes absolute path
  1.1494 -		fileName=fpath;		// gets stripped of path
  1.1495 -		destPath=destname;	// needed for vymlinks and during load to reset fileChangedTime
  1.1496 -
  1.1497 -		// If fpath is not an absolute path, complete it
  1.1498 -		filePath=QDir(fpath).absPath();
  1.1499 -		fileDir=filePath.left (1+filePath.findRev ("/"));
  1.1500 -
  1.1501 -		// Set short name, too. Search from behind:
  1.1502 -		int i=fileName.findRev("/");
  1.1503 -		if (i>=0) fileName=fileName.remove (0,i+1);
  1.1504 -
  1.1505 -		// Forget the .vym (or .xml) for name of map
  1.1506 -		mapName=fileName.left(fileName.findRev(".",-1,true) );
  1.1507 -	}
  1.1508 -}
  1.1509 -
  1.1510 -void MapEditor::setFilePath(QString fpath)
  1.1511 -{
  1.1512 -	setFilePath (fpath,fpath);
  1.1513 -}
  1.1514 -
  1.1515 -QString MapEditor::getFilePath()
  1.1516 -{
  1.1517 -	return filePath;
  1.1518 -}
  1.1519 -
  1.1520 -QString MapEditor::getFileName()
  1.1521 -{
  1.1522 -	return fileName;
  1.1523 -}
  1.1524 -
  1.1525 -QString MapEditor::getMapName()
  1.1526 -{
  1.1527 -	return mapName;
  1.1528 -}
  1.1529 -
  1.1530 -QString MapEditor::getDestPath()
  1.1531 -{
  1.1532 -	return destPath;
  1.1533 -}
  1.1534 -
  1.1535 -ErrorCode MapEditor::load (QString fname, const LoadMode &lmode, const FileType &ftype)
  1.1536 -{
  1.1537 -	ErrorCode err=success;
  1.1538 -
  1.1539 -	parseBaseHandler *handler;
  1.1540 -	fileType=ftype;
  1.1541 -	switch (fileType)
  1.1542 -	{
  1.1543 -		case VymMap: handler=new parseVYMHandler; break;
  1.1544 -		case FreemindMap : handler=new parseFreemindHandler; break;
  1.1545 -		default: 
  1.1546 -			QMessageBox::critical( 0, tr( "Critical Parse Error" ),
  1.1547 -				   "Unknown FileType in MapEditor::load()");
  1.1548 -		return aborted;	
  1.1549 -	}
  1.1550 -	if (lmode==NewMap)
  1.1551 -	{
  1.1552 -		xelection.clear();
  1.1553 -		model->setMapEditor(this);
  1.1554 -		// (map state is set later at end of load...)
  1.1555 -	} else
  1.1556 -	{
  1.1557 -		BranchObj *bo=xelection.getBranch();
  1.1558 -		if (!bo) return aborted;
  1.1559 -		if (lmode==ImportAdd)
  1.1560 -			saveStateChangingPart(
  1.1561 -				bo,
  1.1562 -				bo,
  1.1563 -				QString("addMapInsert (%1)").arg(fname),
  1.1564 -				QString("Add map %1 to %2").arg(fname).arg(getName(bo)));
  1.1565 -		else	
  1.1566 -			saveStateChangingPart(
  1.1567 -				bo,
  1.1568 -				bo,
  1.1569 -				QString("addMapReplace(%1)").arg(fname),
  1.1570 -				QString("Add map %1 to %2").arg(fname).arg(getName(bo)));
  1.1571 -	}	
  1.1572 -    
  1.1573 -
  1.1574 -	// Create temporary directory for packing
  1.1575 -	bool ok;
  1.1576 -	QString tmpZipDir=makeTmpDir (ok,"vym-pack");
  1.1577 -	if (!ok)
  1.1578 -	{
  1.1579 -		QMessageBox::critical( 0, tr( "Critical Load Error" ),
  1.1580 -		   tr("Couldn't create temporary directory before load\n"));
  1.1581 -		return aborted; 
  1.1582 -	}
  1.1583 -
  1.1584 -	// Try to unzip file
  1.1585 -	err=unzipDir (tmpZipDir,fname);
  1.1586 -	QString xmlfile;
  1.1587 -	if (err==nozip)
  1.1588 -	{
  1.1589 -		xmlfile=fname;
  1.1590 -		zipped=false;
  1.1591 -	} else
  1.1592 -	{
  1.1593 -		zipped=true;
  1.1594 -		
  1.1595 -		// Look for mapname.xml
  1.1596 -		xmlfile= fname.left(fname.findRev(".",-1,true));
  1.1597 -		xmlfile=xmlfile.section( '/', -1 );
  1.1598 -		QFile mfile( tmpZipDir + "/" + xmlfile + ".xml");
  1.1599 -		if (!mfile.exists() )
  1.1600 -		{
  1.1601 -			// mapname.xml does not exist, well, 
  1.1602 -			// maybe someone renamed the mapname.vym file...
  1.1603 -			// Try to find any .xml in the toplevel 
  1.1604 -			// directory of the .vym file
  1.1605 -			QStringList flist=QDir (tmpZipDir).entryList("*.xml");
  1.1606 -			if (flist.count()==1) 
  1.1607 -			{
  1.1608 -				// Only one entry, take this one
  1.1609 -				xmlfile=tmpZipDir + "/"+flist.first();
  1.1610 -			} else
  1.1611 -			{
  1.1612 -				for ( QStringList::Iterator it = flist.begin(); it != flist.end(); ++it ) 
  1.1613 -					*it=tmpZipDir + "/" + *it;
  1.1614 -				// TODO Multiple entries, load all (but only the first one into this ME)
  1.1615 -				//mainWindow->fileLoadFromTmp (flist);
  1.1616 -				//returnCode=1;	// Silently forget this attempt to load
  1.1617 -				qWarning ("MainWindow::load (fn)  multimap found...");
  1.1618 -			}	
  1.1619 -				
  1.1620 -			if (flist.isEmpty() )
  1.1621 -			{
  1.1622 -				QMessageBox::critical( 0, tr( "Critical Load Error" ),
  1.1623 -						   tr("Couldn't find a map (*.xml) in .vym archive.\n"));
  1.1624 -				err=aborted;				   
  1.1625 -			}	
  1.1626 -		} //file doesn't exist	
  1.1627 -		else
  1.1628 -			xmlfile=mfile.name();
  1.1629 -	}
  1.1630 -
  1.1631 -	QFile file( xmlfile);
  1.1632 -
  1.1633 -	// I am paranoid: file should exist anyway
  1.1634 -	// according to check in mainwindow.
  1.1635 -	if (!file.exists() )
  1.1636 -	{
  1.1637 -		QMessageBox::critical( 0, tr( "Critical Parse Error" ),
  1.1638 -				   tr(QString("Couldn't open map %1").arg(file.name())));
  1.1639 -		err=aborted;	
  1.1640 -	} else
  1.1641 -	{
  1.1642 -		bool blockSaveStateOrg=blockSaveState;
  1.1643 -		blockReposition=true;
  1.1644 -		blockSaveState=true;
  1.1645 -		QXmlInputSource source( file);
  1.1646 -		QXmlSimpleReader reader;
  1.1647 -		reader.setContentHandler( handler );
  1.1648 -		reader.setErrorHandler( handler );
  1.1649 -		handler->setModel ( model);
  1.1650 -
  1.1651 -
  1.1652 -		// We need to set the tmpDir in order  to load files with rel. path
  1.1653 -		QString tmpdir;
  1.1654 -		if (zipped)
  1.1655 -			tmpdir=tmpZipDir;
  1.1656 -		else
  1.1657 -			tmpdir=fname.left(fname.findRev("/",-1));	
  1.1658 -		handler->setTmpDir (tmpdir);
  1.1659 -		handler->setInputFile (file.name());
  1.1660 -		handler->setLoadMode (lmode);
  1.1661 -		bool ok = reader.parse( source );
  1.1662 -		blockReposition=false;
  1.1663 -		blockSaveState=blockSaveStateOrg;
  1.1664 -		file.close();
  1.1665 -		if ( ok ) 
  1.1666 -		{
  1.1667 -			model->reposition();	// FIXME reposition the view instead...
  1.1668 -			xelection.update();
  1.1669 -			if (lmode==NewMap)
  1.1670 -			{
  1.1671 -				mapDefault=false;
  1.1672 -				mapChanged=false;
  1.1673 -				mapUnsaved=false;
  1.1674 -				autosaveTimer->stop();
  1.1675 -			}
  1.1676 -
  1.1677 -			// Reset timestamp to check for later updates of file
  1.1678 -			fileChangedTime=QFileInfo (destPath).lastModified();
  1.1679 -		} else 
  1.1680 -		{
  1.1681 -			QMessageBox::critical( 0, tr( "Critical Parse Error" ),
  1.1682 -					   tr( handler->errorProtocol() ) );
  1.1683 -			// returnCode=1;	
  1.1684 -			// Still return "success": the map maybe at least
  1.1685 -			// partially read by the parser
  1.1686 -		}	
  1.1687 -	}	
  1.1688 -
  1.1689 -	// Delete tmpZipDir
  1.1690 -	removeDir (QDir(tmpZipDir));
  1.1691 -
  1.1692 -	updateActions();
  1.1693 -
  1.1694 -	return err;
  1.1695 -}
  1.1696 -
  1.1697 -ErrorCode MapEditor::save (const SaveMode &savemode)
  1.1698 -{
  1.1699 -	QString tmpZipDir;
  1.1700 -	QString mapFileName;
  1.1701 -	QString safeFilePath;
  1.1702 -
  1.1703 -	ErrorCode err=success;
  1.1704 -
  1.1705 -	if (zipped)
  1.1706 -		// save as .xml
  1.1707 -		mapFileName=mapName+".xml";
  1.1708 -	else
  1.1709 -		// use name given by user, even if he chooses .doc
  1.1710 -		mapFileName=fileName;
  1.1711 -
  1.1712 -	// Look, if we should zip the data:
  1.1713 -	if (!zipped)
  1.1714 -	{
  1.1715 -		QMessageBox mb( vymName,
  1.1716 -			tr("The map %1\ndid not use the compressed "
  1.1717 -			"vym file format.\nWriting it uncompressed will also write images \n"
  1.1718 -			"and flags and thus may overwrite files in the "
  1.1719 -			"given directory\n\nDo you want to write the map").arg(filePath),
  1.1720 -			QMessageBox::Warning,
  1.1721 -			QMessageBox::Yes | QMessageBox::Default,
  1.1722 -			QMessageBox::No ,
  1.1723 -			QMessageBox::Cancel | QMessageBox::Escape);
  1.1724 -		mb.setButtonText( QMessageBox::Yes, tr("compressed (vym default)") );
  1.1725 -		mb.setButtonText( QMessageBox::No, tr("uncompressed") );
  1.1726 -		mb.setButtonText( QMessageBox::Cancel, tr("Cancel"));
  1.1727 -		switch( mb.exec() ) 
  1.1728 -		{
  1.1729 -			case QMessageBox::Yes:
  1.1730 -				// save compressed (default file format)
  1.1731 -				zipped=true;
  1.1732 -				break;
  1.1733 -			case QMessageBox::No:
  1.1734 -				// save uncompressed
  1.1735 -				zipped=false;
  1.1736 -				break;
  1.1737 -			case QMessageBox::Cancel:
  1.1738 -				// do nothing
  1.1739 -				return aborted;
  1.1740 -				break;
  1.1741 -		}
  1.1742 -	}
  1.1743 -
  1.1744 -	// First backup existing file, we 
  1.1745 -	// don't want to add to old zip archives
  1.1746 -	QFile f(destPath);
  1.1747 -	if (f.exists())
  1.1748 -	{
  1.1749 -		if ( settings.value ("/mapeditor/writeBackupFile").toBool())
  1.1750 -		{
  1.1751 -			QString backupFileName(destPath + "~");
  1.1752 -			QFile backupFile(backupFileName);
  1.1753 -			if (backupFile.exists() && !backupFile.remove())
  1.1754 -			{
  1.1755 -				QMessageBox::warning(0, tr("Save Error"),
  1.1756 -									 tr("%1\ncould not be removed before saving").arg(backupFileName));
  1.1757 -			}
  1.1758 -			else if (!f.rename(backupFileName))
  1.1759 -			{
  1.1760 -				QMessageBox::warning(0, tr("Save Error"),
  1.1761 -									 tr("%1\ncould not be renamed before saving").arg(destPath));
  1.1762 -			}
  1.1763 -		}
  1.1764 -	}
  1.1765 -
  1.1766 -	if (zipped)
  1.1767 -	{
  1.1768 -		// Create temporary directory for packing
  1.1769 -		bool ok;
  1.1770 -		tmpZipDir=makeTmpDir (ok,"vym-zip");
  1.1771 -		if (!ok)
  1.1772 -		{
  1.1773 -			QMessageBox::critical( 0, tr( "Critical Load Error" ),
  1.1774 -			   tr("Couldn't create temporary directory before save\n"));
  1.1775 -			return aborted; 
  1.1776 -		}
  1.1777 -
  1.1778 -		safeFilePath=filePath;
  1.1779 -		setFilePath (tmpZipDir+"/"+ mapName+ ".xml", safeFilePath);
  1.1780 -	} // zipped
  1.1781 -
  1.1782 -	// Create mapName and fileDir
  1.1783 -	makeSubDirs (fileDir);
  1.1784 -
  1.1785 -	QString saveFile;
  1.1786 -	if (savemode==CompleteMap || xelection.isEmpty())
  1.1787 -	{
  1.1788 -		// Save complete map
  1.1789 -		saveFile=saveToDir (fileDir,mapName+"-",true,QPointF(),NULL);
  1.1790 -		mapChanged=false;
  1.1791 -		mapUnsaved=false;
  1.1792 -		autosaveTimer->stop();
  1.1793 -	}
  1.1794 -	else	
  1.1795 -	{
  1.1796 -		// Save part of map
  1.1797 -		if (xelection.type()==Selection::FloatImage)
  1.1798 -			saveFloatImage();
  1.1799 -		else	
  1.1800 -			saveFile=saveToDir (fileDir,mapName+"-",true,QPointF(),xelection.getBranch());	
  1.1801 -		// TODO take care of multiselections
  1.1802 -	}	
  1.1803 -
  1.1804 -	if (!saveStringToDisk(fileDir+mapFileName,saveFile))
  1.1805 -	{
  1.1806 -		err=aborted;
  1.1807 -		qWarning ("ME::saveStringToDisk failed!");
  1.1808 -	}
  1.1809 -
  1.1810 -	if (zipped)
  1.1811 -	{
  1.1812 -		// zip
  1.1813 -		if (err==success) err=zipDir (tmpZipDir,destPath);
  1.1814 -
  1.1815 -		// Delete tmpDir
  1.1816 -		removeDir (QDir(tmpZipDir));
  1.1817 -
  1.1818 -		// Restore original filepath outside of tmp zip dir
  1.1819 -		setFilePath (safeFilePath);
  1.1820 -	}
  1.1821 -
  1.1822 -	updateActions();
  1.1823 -	fileChangedTime=QFileInfo (destPath).lastModified();
  1.1824 -	return err;
  1.1825 -}
  1.1826 -
  1.1827 -
  1.1828  void MapEditor::print()
  1.1829  {
  1.1830  	if ( !printer ) 
  1.1831 @@ -1882,7 +177,7 @@
  1.1832  		pp.setRenderHint(QPainter::Antialiasing,true);
  1.1833  
  1.1834  		// Don't print the visualisation of selection
  1.1835 -		xelection.unselect();
  1.1836 +		model->unselect();
  1.1837  
  1.1838  		QRectF mapRect=totalBBox;
  1.1839  		QGraphicsRectItem *frame=NULL;
  1.1840 @@ -1920,7 +215,7 @@
  1.1841  			font.setPointSize(10);
  1.1842  			pp.setFont (font);
  1.1843  			QRectF footerBox(0,viewBottom,printer->width(),15);
  1.1844 -			pp.drawText ( footerBox,Qt::AlignLeft,"VYM - " +fileName);
  1.1845 +			// FIXME fileName not any longer available here: pp.drawText ( footerBox,Qt::AlignLeft,"VYM - " +fileName);
  1.1846  			pp.drawText ( footerBox, Qt::AlignRight, QDate::currentDate().toString(Qt::TextDate));
  1.1847  		}
  1.1848  		mapScene->render (
  1.1849 @@ -1933,7 +228,7 @@
  1.1850  		if (frame)  delete (frame);
  1.1851  
  1.1852  		// Restore selection
  1.1853 -		xelection.reselect();
  1.1854 +		model->reselect();
  1.1855  
  1.1856  		// Save settings in vymrc
  1.1857  		settings.writeEntry("/mainwindow/printerName",printer->printerName());
  1.1858 @@ -1952,1418 +247,9 @@
  1.1859  	setRenderHint(QPainter::SmoothPixmapTransform,b);
  1.1860  }
  1.1861  
  1.1862 -QPixmap MapEditor::getPixmap()
  1.1863 -{
  1.1864 -	QRectF mapRect=model->getTotalBBox();
  1.1865 -	QPixmap pix((int)mapRect.width()+2,(int)mapRect.height()+1);
  1.1866 -	QPainter pp (&pix);
  1.1867 -	
  1.1868 -	pp.setRenderHints(renderHints());
  1.1869 -
  1.1870 -	// Don't print the visualisation of selection
  1.1871 -	xelection.unselect();
  1.1872 -
  1.1873 -	mapScene->render (	&pp, 
  1.1874 -		QRectF(0,0,mapRect.width()+2,mapRect.height()+2),
  1.1875 -		QRectF(mapRect.x(),mapRect.y(),mapRect.width(),mapRect.height() ));
  1.1876 -
  1.1877 -	// Restore selection
  1.1878 -	xelection.reselect();
  1.1879 -	
  1.1880 -	return pix;
  1.1881 -}
  1.1882 -
  1.1883 -void MapEditor::setHideTmpMode (HideTmpMode mode)
  1.1884 -{
  1.1885 -	hidemode=mode;
  1.1886 -	model->setHideTmp (hidemode);
  1.1887 -	model->reposition();
  1.1888 -	scene()->update();
  1.1889 -}
  1.1890 -
  1.1891 -HideTmpMode MapEditor::getHideTmpMode()
  1.1892 -{
  1.1893 -	return hidemode;
  1.1894 -}
  1.1895 -
  1.1896 -void MapEditor::setExportMode (bool b)
  1.1897 -{
  1.1898 -	// should be called before and after exports
  1.1899 -	// depending on the settings
  1.1900 -	if (b && settings.value("/export/useHideExport","true")=="true")
  1.1901 -		setHideTmpMode (HideExport);
  1.1902 -	else	
  1.1903 -		setHideTmpMode (HideNone);
  1.1904 -}
  1.1905 -
  1.1906 -void MapEditor::exportASCII(QString fname,bool askName)
  1.1907 -{
  1.1908 -	ExportASCII ex;
  1.1909 -	ex.setModel (model);
  1.1910 -	if (fname=="") 
  1.1911 -		ex.setFile (mapName+".txt");	
  1.1912 -	else
  1.1913 -		ex.setFile (fname);
  1.1914 -
  1.1915 -	if (askName)
  1.1916 -	{
  1.1917 -		//ex.addFilter ("TXT (*.txt)");
  1.1918 -		ex.setDir(lastImageDir);
  1.1919 -		//ex.setCaption(vymName+ " -" +tr("Export as ASCII")+" "+tr("(still experimental)"));
  1.1920 -		ex.execDialog() ; 
  1.1921 -	} 
  1.1922 -	if (!ex.canceled())
  1.1923 -	{
  1.1924 -		setExportMode(true);
  1.1925 -		ex.doExport();
  1.1926 -		setExportMode(false);
  1.1927 -	}
  1.1928 -}
  1.1929 -
  1.1930 -void MapEditor::exportImage(QString fname, bool askName, QString format)
  1.1931 -{
  1.1932 -	if (fname=="")
  1.1933 -	{
  1.1934 -		fname=mapName+".png";
  1.1935 -		format="PNG";
  1.1936 -	} 	
  1.1937 -
  1.1938 -	if (askName)
  1.1939 -	{
  1.1940 -		QStringList fl;
  1.1941 -		QFileDialog *fd=new QFileDialog (this);
  1.1942 -		fd->setCaption (tr("Export map as image"));
  1.1943 -		fd->setDirectory (lastImageDir);
  1.1944 -		fd->setFileMode(QFileDialog::AnyFile);
  1.1945 -		fd->setFilters  (imageIO.getFilters() );
  1.1946 -		if (fd->exec())
  1.1947 -		{
  1.1948 -			fl=fd->selectedFiles();
  1.1949 -			fname=fl.first();
  1.1950 -			format=imageIO.getType(fd->selectedFilter());
  1.1951 -		} 
  1.1952 -	}
  1.1953 -
  1.1954 -	setExportMode (true);
  1.1955 -	QPixmap pix (getPixmap());
  1.1956 -	pix.save(fname, format);
  1.1957 -	setExportMode (false);
  1.1958 -}
  1.1959 -
  1.1960 -void MapEditor::exportOOPresentation(const QString &fn, const QString &cf)
  1.1961 -{
  1.1962 -	ExportOO ex;
  1.1963 -	ex.setFile (fn);
  1.1964 -	ex.setModel (model);
  1.1965 -	if (ex.setConfigFile(cf)) 
  1.1966 -	{
  1.1967 -		setExportMode (true);
  1.1968 -		ex.exportPresentation();
  1.1969 -		setExportMode (false);
  1.1970 -	}
  1.1971 -}
  1.1972 -
  1.1973 -void MapEditor::exportXHTML (const QString &dir, bool askForName)
  1.1974 -{
  1.1975 -			ExportXHTMLDialog dia(this);
  1.1976 -			dia.setFilePath (filePath );
  1.1977 -			dia.setMapName (mapName );
  1.1978 -			dia.readSettings();
  1.1979 -			if (dir!="") dia.setDir (dir);
  1.1980 -
  1.1981 -			bool ok=true;
  1.1982 -			
  1.1983 -			if (askForName)
  1.1984 -			{
  1.1985 -				if (dia.exec()!=QDialog::Accepted) 
  1.1986 -					ok=false;
  1.1987 -				else	
  1.1988 -				{
  1.1989 -					QDir d (dia.getDir());
  1.1990 -					// Check, if warnings should be used before overwriting
  1.1991 -					// the output directory
  1.1992 -					if (d.exists() && d.count()>0)
  1.1993 -					{
  1.1994 -						WarningDialog warn;
  1.1995 -						warn.showCancelButton (true);
  1.1996 -						warn.setText(QString(
  1.1997 -							"The directory %1 is not empty.\n"
  1.1998 -							"Do you risk to overwrite some of its contents?").arg(d.path() ));
  1.1999 -						warn.setCaption("Warning: Directory not empty");
  1.2000 -						warn.setShowAgainName("mainwindow/overwrite-dir-xhtml");
  1.2001 -
  1.2002 -						if (warn.exec()!=QDialog::Accepted) ok=false;
  1.2003 -					}
  1.2004 -				}	
  1.2005 -			}
  1.2006 -
  1.2007 -			if (ok)
  1.2008 -			{
  1.2009 -				exportXML (dia.getDir(),false );
  1.2010 -				dia.doExport(mapName );
  1.2011 -				//if (dia.hasChanged()) setChanged();
  1.2012 -			}
  1.2013 -}
  1.2014 -
  1.2015 -void MapEditor::exportXML(QString dir, bool askForName)
  1.2016 -{
  1.2017 -	if (askForName)
  1.2018 -	{
  1.2019 -		dir=browseDirectory(this,tr("Export XML to directory"));
  1.2020 -		if (dir =="" && !reallyWriteDirectory(dir) )
  1.2021 -		return;
  1.2022 -	}
  1.2023 -
  1.2024 -	// Hide stuff during export, if settings want this
  1.2025 -	setExportMode (true);
  1.2026 -
  1.2027 -	// Create subdirectories
  1.2028 -	makeSubDirs (dir);
  1.2029 -
  1.2030 -	// write to directory
  1.2031 -	QString saveFile=saveToDir (dir,mapName+"-",true,model->getTotalBBox().topLeft() ,NULL);
  1.2032 -	QFile file;
  1.2033 -
  1.2034 -	file.setName ( dir + "/"+mapName+".xml");
  1.2035 -	if ( !file.open( QIODevice::WriteOnly ) )
  1.2036 -	{
  1.2037 -		// This should neverever happen
  1.2038 -		QMessageBox::critical (0,tr("Critical Export Error"),tr("MapEditor::exportXML couldn't open %1").arg(file.name()));
  1.2039 -		return;
  1.2040 -	}	
  1.2041 -
  1.2042 -	// Write it finally, and write in UTF8, no matter what 
  1.2043 -	QTextStream ts( &file );
  1.2044 -	ts.setEncoding (QTextStream::UnicodeUTF8);
  1.2045 -	ts << saveFile;
  1.2046 -	file.close();
  1.2047 -
  1.2048 -	// Now write image, too
  1.2049 -	exportImage (dir+"/images/"+mapName+".png",false,"PNG");
  1.2050 -
  1.2051 -	setExportMode (false);
  1.2052 -}
  1.2053 -
  1.2054 -void MapEditor::clear()
  1.2055 -{
  1.2056 -	xelection.unselect();
  1.2057 -	model->clear();
  1.2058 -}
  1.2059 -
  1.2060 -void MapEditor::copy()
  1.2061 -{
  1.2062 -	LinkableMapObj *sel=xelection.single();
  1.2063 -	if (sel)
  1.2064 -	{
  1.2065 -		if (redosAvail == 0)
  1.2066 -		{
  1.2067 -			// Copy to history
  1.2068 -			QString s=model->getSelectString(sel);
  1.2069 -			saveState (PartOfMap, s, "nop ()", s, "copy ()","Copy selection to clipboard",sel  );
  1.2070 -			curClipboard=curStep;
  1.2071 -		}
  1.2072 -
  1.2073 -		// Copy also to global clipboard, because we are at last step in history
  1.2074 -		QString bakMapName(QString("history-%1").arg(curStep));
  1.2075 -		QString bakMapDir(tmpMapDir +"/"+bakMapName);
  1.2076 -		copyDir (bakMapDir,clipboardDir );
  1.2077 -
  1.2078 -		clipboardEmpty=false;
  1.2079 -		updateActions();
  1.2080 -	}	    
  1.2081 -}
  1.2082 -
  1.2083 -void MapEditor::redo()
  1.2084 -{
  1.2085 -	// Can we undo at all?
  1.2086 -	if (redosAvail<1) return;
  1.2087 -
  1.2088 -	bool blockSaveStateOrg=blockSaveState;
  1.2089 -	blockSaveState=true;
  1.2090 -	
  1.2091 -	redosAvail--;
  1.2092 -
  1.2093 -	if (undosAvail<stepsTotal) undosAvail++;
  1.2094 -	curStep++;
  1.2095 -	if (curStep>stepsTotal) curStep=1;
  1.2096 -	QString undoCommand=  undoSet.readEntry (QString("/history/step-%1/undoCommand").arg(curStep));
  1.2097 -	QString undoSelection=undoSet.readEntry (QString("/history/step-%1/undoSelection").arg(curStep));
  1.2098 -	QString redoCommand=  undoSet.readEntry (QString("/history/step-%1/redoCommand").arg(curStep));
  1.2099 -	QString redoSelection=undoSet.readEntry (QString("/history/step-%1/redoSelection").arg(curStep));
  1.2100 -	QString comment=undoSet.readEntry (QString("/history/step-%1/comment").arg(curStep));
  1.2101 -	QString version=undoSet.readEntry ("/history/version");
  1.2102 -
  1.2103 -	/* TODO Maybe check for version, if we save the history
  1.2104 -	if (!checkVersion(version))
  1.2105 -		QMessageBox::warning(0,tr("Warning"),
  1.2106 -			tr("Version %1 of saved undo/redo data\ndoes not match current vym version %2.").arg(version).arg(vymVersion));
  1.2107 -	*/ 
  1.2108 -
  1.2109 -	// Find out current undo directory
  1.2110 -	QString bakMapDir(QString(tmpMapDir+"/undo-%1").arg(curStep));
  1.2111 -
  1.2112 -	if (debug)
  1.2113 -	{
  1.2114 -		cout << "ME::redo() begin\n";
  1.2115 -		cout << "    undosAvail="<<undosAvail<<endl;
  1.2116 -		cout << "    redosAvail="<<redosAvail<<endl;
  1.2117 -		cout << "       curStep="<<curStep<<endl;
  1.2118 -		cout << "    ---------------------------"<<endl;
  1.2119 -		cout << "    comment="<<comment.toStdString()<<endl;
  1.2120 -		cout << "    undoCom="<<undoCommand.toStdString()<<endl;
  1.2121 -		cout << "    undoSel="<<undoSelection.toStdString()<<endl;
  1.2122 -		cout << "    redoCom="<<redoCommand.toStdString()<<endl;
  1.2123 -		cout << "    redoSel="<<redoSelection.toStdString()<<endl;
  1.2124 -		cout << "    ---------------------------"<<endl<<endl;
  1.2125 -	}
  1.2126 -
  1.2127 -	// select  object before redo
  1.2128 -	if (!redoSelection.isEmpty())
  1.2129 -		select (redoSelection);
  1.2130 -
  1.2131 -
  1.2132 -	parseAtom (redoCommand);
  1.2133 -	model->reposition();
  1.2134 -
  1.2135 -	blockSaveState=blockSaveStateOrg;
  1.2136 -
  1.2137 -	undoSet.setEntry ("/history/undosAvail",QString::number(undosAvail));
  1.2138 -	undoSet.setEntry ("/history/redosAvail",QString::number(redosAvail));
  1.2139 -	undoSet.setEntry ("/history/curStep",QString::number(curStep));
  1.2140 -	undoSet.writeSettings(histPath);
  1.2141 -
  1.2142 -	mainWindow->updateHistory (undoSet);
  1.2143 -	updateActions();
  1.2144 -
  1.2145 -	/* TODO remove testing
  1.2146 -	cout << "ME::redo() end\n";
  1.2147 -	cout << "    undosAvail="<<undosAvail<<endl;
  1.2148 -	cout << "    redosAvail="<<redosAvail<<endl;
  1.2149 -	cout << "       curStep="<<curStep<<endl;
  1.2150 -	cout << "    ---------------------------"<<endl<<endl;
  1.2151 -	*/
  1.2152 -
  1.2153 -
  1.2154 -}
  1.2155 -
  1.2156 -bool MapEditor::isRedoAvailable()
  1.2157 -{
  1.2158 -	if (undoSet.readNumEntry("/history/redosAvail",0)>0)
  1.2159 -		return true;
  1.2160 -	else	
  1.2161 -		return false;
  1.2162 -}
  1.2163 -
  1.2164 -void MapEditor::undo()
  1.2165 -{
  1.2166 -	// Can we undo at all?
  1.2167 -	if (undosAvail<1) return;
  1.2168 -
  1.2169 -	mainWindow->statusMessage (tr("Autosave disabled during undo."));
  1.2170 -
  1.2171 -	bool blockSaveStateOrg=blockSaveState;
  1.2172 -	blockSaveState=true;
  1.2173 -	
  1.2174 -	QString undoCommand=  undoSet.readEntry (QString("/history/step-%1/undoCommand").arg(curStep));
  1.2175 -	QString undoSelection=undoSet.readEntry (QString("/history/step-%1/undoSelection").arg(curStep));
  1.2176 -	QString redoCommand=  undoSet.readEntry (QString("/history/step-%1/redoCommand").arg(curStep));
  1.2177 -	QString redoSelection=undoSet.readEntry (QString("/history/step-%1/redoSelection").arg(curStep));
  1.2178 -	QString comment=undoSet.readEntry (QString("/history/step-%1/comment").arg(curStep));
  1.2179 -	QString version=undoSet.readEntry ("/history/version");
  1.2180 -
  1.2181 -	/* TODO Maybe check for version, if we save the history
  1.2182 -	if (!checkVersion(version))
  1.2183 -		QMessageBox::warning(0,tr("Warning"),
  1.2184 -			tr("Version %1 of saved undo/redo data\ndoes not match current vym version %2.").arg(version).arg(vymVersion));
  1.2185 -	*/
  1.2186 -
  1.2187 -	// Find out current undo directory
  1.2188 -	QString bakMapDir(QString(tmpMapDir+"/undo-%1").arg(curStep));
  1.2189 -
  1.2190 -	// select  object before undo
  1.2191 -	if (!undoSelection.isEmpty())
  1.2192 -		select (undoSelection);
  1.2193 -
  1.2194 -	if (debug)
  1.2195 -	{
  1.2196 -		cout << "ME::undo() begin\n";
  1.2197 -		cout << "    undosAvail="<<undosAvail<<endl;
  1.2198 -		cout << "    redosAvail="<<redosAvail<<endl;
  1.2199 -		cout << "       curStep="<<curStep<<endl;
  1.2200 -		cout << "    ---------------------------"<<endl;
  1.2201 -		cout << "    comment="<<comment.toStdString()<<endl;
  1.2202 -		cout << "    undoCom="<<undoCommand.toStdString()<<endl;
  1.2203 -		cout << "    undoSel="<<undoSelection.toStdString()<<endl;
  1.2204 -		cout << "    redoCom="<<redoCommand.toStdString()<<endl;
  1.2205 -		cout << "    redoSel="<<redoSelection.toStdString()<<endl;
  1.2206 -		cout << "    ---------------------------"<<endl<<endl;
  1.2207 -	}	
  1.2208 -	parseAtom (undoCommand);
  1.2209 -	model->reposition();
  1.2210 -
  1.2211 -	undosAvail--;
  1.2212 -	curStep--; 
  1.2213 -	if (curStep<1) curStep=stepsTotal;
  1.2214 -
  1.2215 -	redosAvail++;
  1.2216 -
  1.2217 -	blockSaveState=blockSaveStateOrg;
  1.2218 -/* TODO remove testing
  1.2219 -	cout << "ME::undo() end\n";
  1.2220 -	cout << "    undosAvail="<<undosAvail<<endl;
  1.2221 -	cout << "    redosAvail="<<redosAvail<<endl;
  1.2222 -	cout << "       curStep="<<curStep<<endl;
  1.2223 -	cout << "    ---------------------------"<<endl<<endl;
  1.2224 -*/
  1.2225 -
  1.2226 -	undoSet.setEntry ("/history/undosAvail",QString::number(undosAvail));
  1.2227 -	undoSet.setEntry ("/history/redosAvail",QString::number(redosAvail));
  1.2228 -	undoSet.setEntry ("/history/curStep",QString::number(curStep));
  1.2229 -	undoSet.writeSettings(histPath);
  1.2230 -
  1.2231 -	mainWindow->updateHistory (undoSet);
  1.2232 -	updateActions();
  1.2233 -	xelection.update();
  1.2234 -	ensureSelectionVisible();
  1.2235 -}
  1.2236 -
  1.2237 -bool MapEditor::isUndoAvailable()
  1.2238 -{
  1.2239 -	if (undoSet.readNumEntry("/history/undosAvail",0)>0)
  1.2240 -		return true;
  1.2241 -	else	
  1.2242 -		return false;
  1.2243 -}
  1.2244 -
  1.2245 -void MapEditor::gotoHistoryStep (int i)
  1.2246 -{
  1.2247 -	// Restore variables
  1.2248 -	int undosAvail=undoSet.readNumEntry (QString("/history/undosAvail"));
  1.2249 -	int redosAvail=undoSet.readNumEntry (QString("/history/redosAvail"));
  1.2250 -
  1.2251 -	if (i<0) i=undosAvail+redosAvail;
  1.2252 -
  1.2253 -	// Clicking above current step makes us undo things
  1.2254 -	if (i<undosAvail) 
  1.2255 -	{	
  1.2256 -		for (int j=0; j<undosAvail-i; j++) undo();
  1.2257 -		return;
  1.2258 -	}	
  1.2259 -	// Clicking below current step makes us redo things
  1.2260 -	if (i>undosAvail) 
  1.2261 -		for (int j=undosAvail; j<i; j++) 
  1.2262 -		{
  1.2263 -			if (debug) cout << "ME::gotoHistoryStep redo "<<j<<"/"<<undosAvail<<" i="<<i<<endl;
  1.2264 -			redo();
  1.2265 -		}
  1.2266 -
  1.2267 -	// And ignore clicking the current row ;-)	
  1.2268 -}
  1.2269 -
  1.2270 -void MapEditor::addMapReplaceInt(const QString &undoSel, const QString &path)
  1.2271 -{
  1.2272 -	QString pathDir=path.left(path.findRev("/"));
  1.2273 -	QDir d(pathDir);
  1.2274 -	QFile file (path);
  1.2275 -
  1.2276 -	if (d.exists() )
  1.2277 -	{
  1.2278 -		// We need to parse saved XML data
  1.2279 -		parseVYMHandler handler;
  1.2280 -		QXmlInputSource source( file);
  1.2281 -		QXmlSimpleReader reader;
  1.2282 -		reader.setContentHandler( &handler );
  1.2283 -		reader.setErrorHandler( &handler );
  1.2284 -		handler.setModel ( model);
  1.2285 -		handler.setTmpDir ( pathDir );	// needed to load files with rel. path
  1.2286 -		if (undoSel.isEmpty())
  1.2287 -		{
  1.2288 -			unselect();
  1.2289 -			model->clear();
  1.2290 -			handler.setLoadMode (NewMap);
  1.2291 -		} else	
  1.2292 -		{
  1.2293 -			select (undoSel);
  1.2294 -			handler.setLoadMode (ImportReplace);
  1.2295 -		}	
  1.2296 -		blockReposition=true;
  1.2297 -		bool ok = reader.parse( source );
  1.2298 -		blockReposition=false;
  1.2299 -		if (! ok ) 
  1.2300 -		{	
  1.2301 -			// This should never ever happen
  1.2302 -			QMessageBox::critical( 0, tr( "Critical Parse Error while reading %1").arg(path),
  1.2303 -								    handler.errorProtocol());
  1.2304 -		}
  1.2305 -	} else	
  1.2306 -		QMessageBox::critical( 0, tr( "Critical Error" ), tr("Could not read %1").arg(path));
  1.2307 -}
  1.2308 -
  1.2309 -void MapEditor::addMapInsertInt (const QString &path, int pos)
  1.2310 -{
  1.2311 -	BranchObj *sel=xelection.getBranch();
  1.2312 -	if (sel)
  1.2313 -	{
  1.2314 -		QString pathDir=path.left(path.findRev("/"));
  1.2315 -		QDir d(pathDir);
  1.2316 -		QFile file (path);
  1.2317 -
  1.2318 -		if (d.exists() )
  1.2319 -		{
  1.2320 -			// We need to parse saved XML data
  1.2321 -			parseVYMHandler handler;
  1.2322 -			QXmlInputSource source( file);
  1.2323 -			QXmlSimpleReader reader;
  1.2324 -			reader.setContentHandler( &handler );
  1.2325 -			reader.setErrorHandler( &handler );
  1.2326 -			handler.setModel (model);
  1.2327 -			handler.setTmpDir ( pathDir );	// needed to load files with rel. path
  1.2328 -			handler.setLoadMode (ImportAdd);
  1.2329 -			blockReposition=true;
  1.2330 -			bool ok = reader.parse( source );
  1.2331 -			blockReposition=false;
  1.2332 -			if (! ok ) 
  1.2333 -			{	
  1.2334 -				// This should never ever happen
  1.2335 -				QMessageBox::critical( 0, tr( "Critical Parse Error while reading %1").arg(path),
  1.2336 -										handler.errorProtocol());
  1.2337 -			}
  1.2338 -			if (sel->getDepth()>0)
  1.2339 -				sel->getLastBranch()->linkTo (sel,pos);
  1.2340 -		} else	
  1.2341 -			QMessageBox::critical( 0, tr( "Critical Error" ), tr("Could not read %1").arg(path));
  1.2342 -	}		
  1.2343 -}
  1.2344 -
  1.2345 -void MapEditor::pasteNoSave(const int &n)
  1.2346 -{
  1.2347 -	bool old=blockSaveState;
  1.2348 -	blockSaveState=true;
  1.2349 -	bool zippedOrg=zipped;
  1.2350 -	if (redosAvail > 0 || n!=0)
  1.2351 -	{
  1.2352 -		// Use the "historical" buffer
  1.2353 -		QString bakMapName(QString("history-%1").arg(n));
  1.2354 -		QString bakMapDir(tmpMapDir +"/"+bakMapName);
  1.2355 -		load (bakMapDir+"/"+clipboardFile,ImportAdd, VymMap);
  1.2356 -	} else
  1.2357 -		// Use the global buffer
  1.2358 -		load (clipboardDir+"/"+clipboardFile,ImportAdd, VymMap);
  1.2359 -	zipped=zippedOrg;
  1.2360 -	blockSaveState=old;
  1.2361 -}
  1.2362 -
  1.2363 -void MapEditor::paste()		
  1.2364 -{   
  1.2365 -	BranchObj *sel=xelection.getBranch();
  1.2366 -	if (sel)
  1.2367 -	{
  1.2368 -		saveStateChangingPart(
  1.2369 -			sel,
  1.2370 -			sel,
  1.2371 -			QString ("paste (%1)").arg(curClipboard),
  1.2372 -			QString("Paste to %1").arg( getName(sel))
  1.2373 -		);
  1.2374 -		pasteNoSave(0);
  1.2375 -		model->reposition();
  1.2376 -	}
  1.2377 -}
  1.2378 -
  1.2379 -void MapEditor::cut()
  1.2380 -{
  1.2381 -	LinkableMapObj *sel=xelection.single();
  1.2382 -	if ( sel && (xelection.type() == Selection::Branch ||
  1.2383 -		xelection.type()==Selection::MapCenter ||
  1.2384 -		xelection.type()==Selection::FloatImage))
  1.2385 -	{
  1.2386 -	/* No savestate! savestate is called in cutNoSave
  1.2387 -		saveStateChangingPart(
  1.2388 -			sel->getParObj(),
  1.2389 -			sel,
  1.2390 -			"cut ()",
  1.2391 -			QString("Cut %1").arg(getName(sel ))
  1.2392 -		);
  1.2393 -	*/	
  1.2394 -		copy();
  1.2395 -		deleteSelection();
  1.2396 -		model->reposition();
  1.2397 -	}
  1.2398 -}
  1.2399 -
  1.2400 -void MapEditor::move(const double &x, const double &y)
  1.2401 -{
  1.2402 -	LinkableMapObj *sel=xelection.single();
  1.2403 -	if (sel)
  1.2404 -	{
  1.2405 -        QPointF ap(sel->getAbsPos());
  1.2406 -        QPointF to(x, y);
  1.2407 -        if (ap != to)
  1.2408 -        {
  1.2409 -            QString ps=qpointfToString(ap);
  1.2410 -            QString s=xelection.getSelectString();
  1.2411 -            saveState(
  1.2412 -                s, "move "+ps, 
  1.2413 -                s, "move "+qpointfToString(to), 
  1.2414 -                QString("Move %1 to %2").arg(getName(sel)).arg(ps));
  1.2415 -            sel->move(x,y);
  1.2416 -            model->reposition();
  1.2417 -            xelection.update();
  1.2418 -        }
  1.2419 -	}
  1.2420 -}
  1.2421 -
  1.2422 -void MapEditor::moveRel (const double &x, const double &y)
  1.2423 -{
  1.2424 -	LinkableMapObj *sel=xelection.single();
  1.2425 -	if (sel)
  1.2426 -	{
  1.2427 -        QPointF rp(sel->getRelPos());
  1.2428 -        QPointF to(x, y);
  1.2429 -        if (rp != to)
  1.2430 -        {
  1.2431 -            QString ps=qpointfToString (sel->getRelPos());
  1.2432 -            QString s=model->getSelectString(sel);
  1.2433 -            saveState(
  1.2434 -                s, "moveRel "+ps, 
  1.2435 -                s, "moveRel "+qpointfToString(to), 
  1.2436 -                QString("Move %1 to relative position %2").arg(getName(sel)).arg(ps));
  1.2437 -            ((OrnamentedObj*)sel)->move2RelPos (x,y);
  1.2438 -            model->reposition();
  1.2439 -            sel->updateLink();
  1.2440 -            xelection.update();
  1.2441 -        }
  1.2442 -	}
  1.2443 -}
  1.2444 -
  1.2445 -void MapEditor::moveBranchUp()
  1.2446 -{
  1.2447 -	BranchObj* bo=xelection.getBranch();
  1.2448 -	BranchObj* par;
  1.2449 -	if (bo)
  1.2450 -	{
  1.2451 -		if (!bo->canMoveBranchUp()) return;
  1.2452 -		par=(BranchObj*)(bo->getParObj());
  1.2453 -		BranchObj *obo=par->moveBranchUp (bo);	// bo will be the one below selection
  1.2454 -		saveState (model->getSelectString(bo),"moveBranchDown ()",model->getSelectString(obo),"moveBranchUp ()",QString("Move up %1").arg(getName(bo)));
  1.2455 -		model->reposition();
  1.2456 -		scene()->update();
  1.2457 -		xelection.update();
  1.2458 -		ensureSelectionVisible();
  1.2459 -	}
  1.2460 -}
  1.2461 -
  1.2462 -void MapEditor::moveBranchDown()
  1.2463 -{
  1.2464 -	BranchObj* bo=xelection.getBranch();
  1.2465 -	BranchObj* par;
  1.2466 -	if (bo)
  1.2467 -	{
  1.2468 -		if (!bo->canMoveBranchDown()) return;
  1.2469 -		par=(BranchObj*)(bo->getParObj());
  1.2470 -		BranchObj *obo=par->moveBranchDown(bo);	// bo will be the one above selection
  1.2471 -		saveState(model->getSelectString(bo),"moveBranchUp ()",model->getSelectString(obo),"moveBranchDown ()",QString("Move down %1").arg(getName(bo)));
  1.2472 -		model->reposition();
  1.2473 -		scene()->update();
  1.2474 -		xelection.update();
  1.2475 -		ensureSelectionVisible();
  1.2476 -	}	
  1.2477 -}
  1.2478 -
  1.2479 -void MapEditor::sortChildren()
  1.2480 -{
  1.2481 -	BranchObj* bo=xelection.getBranch();
  1.2482 -	if (bo)
  1.2483 -	{
  1.2484 -		if(bo->countBranches()>1)
  1.2485 -		{
  1.2486 -			saveStateChangingPart(bo,bo, "sortChildren ()",QString("Sort children of %1").arg(getName(bo)));
  1.2487 -			bo->sortChildren();
  1.2488 -			model->reposition();
  1.2489 -			ensureSelectionVisible();
  1.2490 -		}
  1.2491 -	}
  1.2492 -}
  1.2493 -
  1.2494 -void MapEditor::linkTo(const QString &dstString)	
  1.2495 -{
  1.2496 -	FloatImageObj *fio=xelection.getFloatImage();
  1.2497 -	if (fio)
  1.2498 -	{
  1.2499 -		BranchObj *dst=(BranchObj*)(model->findObjBySelect(dstString));
  1.2500 -		if (dst && (typeid(*dst)==typeid (BranchObj) || 
  1.2501 -					typeid(*dst)==typeid (MapCenterObj)))
  1.2502 -		{			
  1.2503 -			LinkableMapObj *dstPar=dst->getParObj();
  1.2504 -			QString parString=model->getSelectString(dstPar);
  1.2505 -			QString fioPreSelectString=model->getSelectString(fio);
  1.2506 -			QString fioPreParentSelectString=model->getSelectString (fio->getParObj());
  1.2507 -			((BranchObj*)(dst))->addFloatImage (fio);
  1.2508 -			xelection.unselect();
  1.2509 -			((BranchObj*)(fio->getParObj()))->removeFloatImage (fio);
  1.2510 -			fio=((BranchObj*)(dst))->getLastFloatImage();
  1.2511 -			fio->setRelPos();
  1.2512 -			fio->reposition();
  1.2513 -			xelection.select(fio);
  1.2514 -			saveState(
  1.2515 -				model->getSelectString(fio),
  1.2516 -				QString("linkTo (\"%1\")").arg(fioPreParentSelectString), 
  1.2517 -				fioPreSelectString, 
  1.2518 -				QString ("linkTo (\"%1\")").arg(dstString),
  1.2519 -				QString ("Link floatimage to %1").arg(getName(dst)));
  1.2520 -		}
  1.2521 -	}
  1.2522 -}
  1.2523 -
  1.2524 -QString MapEditor::getHeading(bool &ok, QPoint &p)
  1.2525 -{
  1.2526 -	BranchObj *bo=xelection.getBranch();
  1.2527 -	if (bo)
  1.2528 -	{
  1.2529 -		ok=true;
  1.2530 -		p=mapFromScene(bo->getAbsPos());
  1.2531 -		return bo->getHeading();
  1.2532 -	}
  1.2533 -	ok=false;
  1.2534 -	return QString();
  1.2535 -}
  1.2536 -
  1.2537 -void MapEditor::setHeading(const QString &s)
  1.2538 -{
  1.2539 -	BranchObj *sel=xelection.getBranch();
  1.2540 -	if (sel)
  1.2541 -	{
  1.2542 -		saveState(
  1.2543 -			sel,
  1.2544 -			"setHeading (\""+sel->getHeading()+"\")", 
  1.2545 -			sel,
  1.2546 -			"setHeading (\""+s+"\")", 
  1.2547 -			QString("Set heading of %1 to \"%2\"").arg(getName(sel)).arg(s) );
  1.2548 -		sel->setHeading(s );
  1.2549 -		model->reposition();
  1.2550 -		xelection.update();
  1.2551 -		ensureSelectionVisible();
  1.2552 -	}
  1.2553 -}
  1.2554 -
  1.2555 -void MapEditor::setHeadingInt(const QString &s)
  1.2556 -{
  1.2557 -	BranchObj *bo=xelection.getBranch();
  1.2558 -	if (bo)
  1.2559 -	{
  1.2560 -		bo->setHeading(s);
  1.2561 -		model->reposition();
  1.2562 -		xelection.update();
  1.2563 -		ensureSelectionVisible();
  1.2564 -	}
  1.2565 -}
  1.2566 -
  1.2567 -void MapEditor::setVymLinkInt (const QString &s)
  1.2568 -{
  1.2569 -	// Internal function, no saveState needed
  1.2570 -	BranchObj *bo=xelection.getBranch();
  1.2571 -	if (bo)
  1.2572 -	{
  1.2573 -		bo->setVymLink(s);
  1.2574 -		model->reposition();
  1.2575 -		updateActions();
  1.2576 -		xelection.update();
  1.2577 -		ensureSelectionVisible();
  1.2578 -	}
  1.2579 -}
  1.2580 -
  1.2581 -BranchObj* MapEditor::addMapCenter ()
  1.2582 -{
  1.2583 -	MapCenterObj *mco= model->addMapCenter(contextMenuPos);
  1.2584 -	xelection.select (mco);
  1.2585 -	updateActions();
  1.2586 -	ensureSelectionVisible();
  1.2587 -	saveState (
  1.2588 -		mco,
  1.2589 -		"delete()",
  1.2590 -		NULL,
  1.2591 -		QString ("addMapCenter (%1,%2)").arg (contextMenuPos.x()).arg(contextMenuPos.y()),
  1.2592 -		QString ("Adding MapCenter to (%1,%2").arg (contextMenuPos.x()).arg(contextMenuPos.y())
  1.2593 -	);	
  1.2594 -	return mco;	
  1.2595 -}
  1.2596 -
  1.2597 -BranchObj* MapEditor::addNewBranchInt(int num)
  1.2598 -{
  1.2599 -	// Depending on pos:
  1.2600 -	// -3		insert in childs of parent  above selection 
  1.2601 -	// -2		add branch to selection 
  1.2602 -	// -1		insert in childs of parent below selection 
  1.2603 -	// 0..n		insert in childs of parent at pos
  1.2604 -	BranchObj *newbo=NULL;
  1.2605 -	BranchObj *bo=xelection.getBranch();
  1.2606 -	if (bo)
  1.2607 -	{
  1.2608 -		if (num==-2)
  1.2609 -		{
  1.2610 -			// save scroll state. If scrolled, automatically select
  1.2611 -			// new branch in order to tmp unscroll parent...
  1.2612 -			newbo=bo->addBranch();
  1.2613 -			
  1.2614 -		}else if (num==-1)
  1.2615 -		{
  1.2616 -			num=bo->getNum()+1;
  1.2617 -			bo=(BranchObj*)bo->getParObj();
  1.2618 -			if (bo) newbo=bo->insertBranch(num);
  1.2619 -		}else if (num==-3)
  1.2620 -		{
  1.2621 -			num=bo->getNum();
  1.2622 -			bo=(BranchObj*)bo->getParObj();
  1.2623 -			if (bo) newbo=bo->insertBranch(num);
  1.2624 -		}
  1.2625 -		if (!newbo) return NULL;
  1.2626 -	}	
  1.2627 -	return newbo;
  1.2628 -}	
  1.2629 -
  1.2630 -BranchObj* MapEditor::addNewBranch(int pos)
  1.2631 -{
  1.2632 -	// Different meaning than num in addNewBranchInt!
  1.2633 -	// -1	add above
  1.2634 -	//  0	add as child
  1.2635 -	// +1	add below
  1.2636 -	BranchObj *bo = xelection.getBranch();
  1.2637 -	BranchObj *newbo=NULL;
  1.2638 -
  1.2639 -	if (bo)
  1.2640 -	{
  1.2641 -		setCursor (Qt::ArrowCursor);
  1.2642 -
  1.2643 -		newbo=addNewBranchInt (pos-2);
  1.2644 -
  1.2645 -		if (newbo)
  1.2646 -		{
  1.2647 -			saveState(
  1.2648 -				newbo,		
  1.2649 -				"delete ()",
  1.2650 -				bo,
  1.2651 -				QString ("addBranch (%1)").arg(pos),
  1.2652 -				QString ("Add new branch to %1").arg(getName(bo)));	
  1.2653 -
  1.2654 -			model->reposition();
  1.2655 -			xelection.update();
  1.2656 -			latestSelection=model->getSelectString(newbo);
  1.2657 -			// In Network mode, the client needs to know where the new branch is,
  1.2658 -			// so we have to pass on this information via saveState.
  1.2659 -			// TODO: Get rid of this positioning workaround
  1.2660 -			QString ps=qpointfToString (newbo->getAbsPos());
  1.2661 -			sendData ("selectLatestAdded ()");
  1.2662 -			sendData (QString("move %1").arg(ps));
  1.2663 -			sendSelection();
  1.2664 -		}
  1.2665 -	}	
  1.2666 -	return newbo;
  1.2667 -}
  1.2668 -
  1.2669 -
  1.2670 -BranchObj* MapEditor::addNewBranchBefore()
  1.2671 -{
  1.2672 -	BranchObj *newbo=NULL;
  1.2673 -	BranchObj *bo = xelection.getBranch();
  1.2674 -	if (bo && xelection.type()==Selection::Branch)
  1.2675 -		 // We accept no MapCenterObj here, so we _have_ a parent
  1.2676 -	{
  1.2677 -		QPointF p=bo->getRelPos();
  1.2678 -
  1.2679 -
  1.2680 -		BranchObj *parbo=(BranchObj*)(bo->getParObj());
  1.2681 -
  1.2682 -		// add below selection
  1.2683 -		newbo=parbo->insertBranch(bo->getNum()+1);
  1.2684 -		if (newbo)
  1.2685 -		{
  1.2686 -			newbo->move2RelPos (p);
  1.2687 -
  1.2688 -			// Move selection to new branch
  1.2689 -			bo->linkTo (newbo,-1);
  1.2690 -
  1.2691 -			saveState (newbo, "deleteKeepChilds ()", newbo, "addBranchBefore ()", 
  1.2692 -				QString ("Add branch before %1").arg(getName(bo)));
  1.2693 -
  1.2694 -			model->reposition();
  1.2695 -			xelection.update();
  1.2696 -		}
  1.2697 -	}	
  1.2698 -	latestSelection=xelection.getSelectString();
  1.2699 -	return newbo;
  1.2700 -}
  1.2701 -
  1.2702 -void MapEditor::deleteSelection()
  1.2703 -{
  1.2704 -	BranchObj *bo = xelection.getBranch();
  1.2705 -	if (bo && xelection.type()==Selection::MapCenter)
  1.2706 -	{
  1.2707 -	//	BranchObj* par=(BranchObj*)(bo->getParObj());
  1.2708 -		xelection.unselect();
  1.2709 -	/* FIXME Note:  does saveStateRemovingPart work for MCO? (No parent!)
  1.2710 -		saveStateRemovingPart (bo, QString ("Delete %1").arg(getName(bo)));
  1.2711 -		*/
  1.2712 -		bo=model->removeMapCenter ((MapCenterObj*)bo);
  1.2713 -		if (bo) 
  1.2714 -		{
  1.2715 -			xelection.select (bo);
  1.2716 -			ensureSelectionVisible();
  1.2717 -			xelection.update();
  1.2718 -		}	
  1.2719 -		model->reposition();
  1.2720 -		return;
  1.2721 -	}
  1.2722 -	if (bo && xelection.type()==Selection::Branch)
  1.2723 -	{
  1.2724 -		BranchObj* par=(BranchObj*)bo->getParObj();
  1.2725 -		xelection.unselect();
  1.2726 -		saveStateRemovingPart (bo, QString ("Delete %1").arg(getName(bo)));
  1.2727 -		par->removeBranch(bo);
  1.2728 -		xelection.select (par);
  1.2729 -		ensureSelectionVisible();
  1.2730 -		model->reposition();
  1.2731 -//		xelection.update();
  1.2732 -		xelection.update();
  1.2733 -		return;
  1.2734 -	}
  1.2735 -	FloatImageObj *fio=xelection.getFloatImage();
  1.2736 -	if (fio)
  1.2737 -	{
  1.2738 -		BranchObj* par=(BranchObj*)fio->getParObj();
  1.2739 -		saveStateChangingPart(
  1.2740 -			par, 
  1.2741 -			fio,
  1.2742 -			"delete ()",
  1.2743 -			QString("Delete %1").arg(getName(fio))
  1.2744 -		);
  1.2745 -		xelection.unselect();
  1.2746 -		par->removeFloatImage(fio);
  1.2747 -		xelection.select (par);
  1.2748 -		model->reposition();
  1.2749 -		xelection.update();
  1.2750 -		ensureSelectionVisible();
  1.2751 -		return;
  1.2752 -	}
  1.2753 -}
  1.2754 -
  1.2755 -LinkableMapObj* MapEditor::getSelection()
  1.2756 -{
  1.2757 -	return xelection.single();
  1.2758 -}
  1.2759 -
  1.2760 -BranchObj* MapEditor::getSelectedBranch()
  1.2761 -{
  1.2762 -	return xelection.getBranch();
  1.2763 -}
  1.2764 -
  1.2765 -FloatImageObj* MapEditor::getSelectedFloatImage()
  1.2766 -{
  1.2767 -	return xelection.getFloatImage();
  1.2768 -}
  1.2769 -
  1.2770 -void MapEditor::unselect()
  1.2771 -{
  1.2772 -	xelection.unselect();
  1.2773 -}	
  1.2774 -
  1.2775 -void MapEditor::reselect()
  1.2776 -{
  1.2777 -	xelection.reselect();
  1.2778 -}	
  1.2779 -
  1.2780 -bool MapEditor::select (const QString &s)
  1.2781 -{
  1.2782 -	if (xelection.select(s))
  1.2783 -	{
  1.2784 -		xelection.update();
  1.2785 -		ensureSelectionVisible();
  1.2786 -		sendSelection ();
  1.2787 -		return true;
  1.2788 -	}
  1.2789 -	return false;
  1.2790 -}
  1.2791 -
  1.2792 -bool MapEditor::select (LinkableMapObj *lmo)
  1.2793 -{
  1.2794 -	if (xelection.select(lmo))
  1.2795 -	{
  1.2796 -		xelection.update();
  1.2797 -		ensureSelectionVisible();
  1.2798 -		sendSelection ();
  1.2799 -		return true;
  1.2800 -	}
  1.2801 -	return false;
  1.2802 -}
  1.2803 -
  1.2804 -QString MapEditor::getSelectString()
  1.2805 -{
  1.2806 -	return xelection.getSelectString();
  1.2807 -}
  1.2808 -
  1.2809 -void MapEditor::selectInt (LinkableMapObj *lmo)
  1.2810 -{
  1.2811 -	if (lmo && xelection.single()!= lmo && isSelectBlocked()==false )
  1.2812 -	{
  1.2813 -		xelection.select(lmo);
  1.2814 -		xelection.update();
  1.2815 -		sendSelection ();
  1.2816 -	}	
  1.2817 -}
  1.2818 -
  1.2819 -void MapEditor::selectNextBranchInt()
  1.2820 -{
  1.2821 -	// Increase number of branch
  1.2822 -	LinkableMapObj *sel=xelection.single();
  1.2823 -	if (sel)
  1.2824 -	{
  1.2825 -		QString s=xelection.getSelectString();
  1.2826 -		QString part;
  1.2827 -		QString typ;
  1.2828 -		QString num;
  1.2829 -
  1.2830 -		// Where am I? 
  1.2831 -		part=s.section(",",-1);
  1.2832 -		typ=part.left (3);
  1.2833 -		num=part.right(part.length() - 3);
  1.2834 -
  1.2835 -		s=s.left (s.length() -num.length());
  1.2836 -
  1.2837 -		// Go to next lmo
  1.2838 -		num=QString ("%1").arg(num.toUInt()+1);
  1.2839 -
  1.2840 -		s=s+num;
  1.2841 -		
  1.2842 -		// Try to select this one
  1.2843 -		if (select (s)) return;
  1.2844 -
  1.2845 -		// We have no direct successor, 
  1.2846 -		// try to increase the parental number in order to
  1.2847 -		// find a successor with same depth
  1.2848 -
  1.2849 -		int d=xelection.single()->getDepth();
  1.2850 -		int oldDepth=d;
  1.2851 -		int i;
  1.2852 -		bool found=false;
  1.2853 -		bool b;
  1.2854 -		while (!found && d>0)
  1.2855 -		{
  1.2856 -			s=s.section (",",0,d-1);
  1.2857 -			// replace substring of current depth in s with "1"
  1.2858 -			part=s.section(",",-1);
  1.2859 -			typ=part.left (3);
  1.2860 -			num=part.right(part.length() - 3);
  1.2861 -
  1.2862 -			if (d>1)
  1.2863 -			{	
  1.2864 -				// increase number of parent
  1.2865 -				num=QString ("%1").arg(num.toUInt()+1);
  1.2866 -				s=s.section (",",0,d-2) + ","+ typ+num;
  1.2867 -			} else
  1.2868 -			{
  1.2869 -				// Special case, look at orientation
  1.2870 -				if (xelection.single()->getOrientation()==LinkableMapObj::RightOfCenter)
  1.2871 -					num=QString ("%1").arg(num.toUInt()+1);
  1.2872 -				else	
  1.2873 -					num=QString ("%1").arg(num.toUInt()-1);
  1.2874 -				s=typ+num;
  1.2875 -			}	
  1.2876 -
  1.2877 -			if (select (s))
  1.2878 -				// pad to oldDepth, select the first branch for each depth
  1.2879 -				for (i=d;i<oldDepth;i++)
  1.2880 -				{
  1.2881 -					b=select (s);
  1.2882 -					if (b)
  1.2883 -					{	
  1.2884 -						if ( xelection.getBranch()->countBranches()>0)
  1.2885 -							s+=",bo:0";
  1.2886 -						else	
  1.2887 -							break;
  1.2888 -					} else
  1.2889 -						break;
  1.2890 -				}	
  1.2891 -
  1.2892 -			// try to select the freshly built string
  1.2893 -			found=select(s);
  1.2894 -			d--;
  1.2895 -		}
  1.2896 -		return;
  1.2897 -	}	
  1.2898 -}
  1.2899 -
  1.2900 -void MapEditor::selectPrevBranchInt()
  1.2901 -{
  1.2902 -	// Decrease number of branch
  1.2903 -	BranchObj *bo=xelection.getBranch();
  1.2904 -	if (bo)
  1.2905 -	{
  1.2906 -		QString s=xelection.getSelectString();
  1.2907 -		QString part;
  1.2908 -		QString typ;
  1.2909 -		QString num;
  1.2910 -
  1.2911 -		// Where am I? 
  1.2912 -		part=s.section(",",-1);
  1.2913 -		typ=part.left (3);
  1.2914 -		num=part.right(part.length() - 3);
  1.2915 -
  1.2916 -		s=s.left (s.length() -num.length());
  1.2917 -
  1.2918 -		int n=num.toInt()-1;
  1.2919 -		
  1.2920 -		// Go to next lmo
  1.2921 -		num=QString ("%1").arg(n);
  1.2922 -		s=s+num;
  1.2923 -		
  1.2924 -		// Try to select this one
  1.2925 -		if (n>=0 && select (s)) return;
  1.2926 -
  1.2927 -		// We have no direct precessor, 
  1.2928 -		// try to decrease the parental number in order to
  1.2929 -		// find a precessor with same depth
  1.2930 -
  1.2931 -		int d=xelection.single()->getDepth();
  1.2932 -		int oldDepth=d;
  1.2933 -		int i;
  1.2934 -		bool found=false;
  1.2935 -		bool b;
  1.2936 -		while (!found && d>0)
  1.2937 -		{
  1.2938 -			s=s.section (",",0,d-1);
  1.2939 -			// replace substring of current depth in s with "1"
  1.2940 -			part=s.section(",",-1);
  1.2941 -			typ=part.left (3);
  1.2942 -			num=part.right(part.length() - 3);
  1.2943 -
  1.2944 -			if (d>1)
  1.2945 -			{
  1.2946 -				// decrease number of parent
  1.2947 -				num=QString ("%1").arg(num.toInt()-1);
  1.2948 -				s=s.section (",",0,d-2) + ","+ typ+num;
  1.2949 -			} else
  1.2950 -			{
  1.2951 -				// Special case, look at orientation
  1.2952 -				if (xelection.single()->getOrientation()==LinkableMapObj::RightOfCenter)
  1.2953 -					num=QString ("%1").arg(num.toInt()-1);
  1.2954 -				else	
  1.2955 -					num=QString ("%1").arg(num.toInt()+1);
  1.2956 -				s=typ+num;
  1.2957 -			}	
  1.2958 -
  1.2959 -			if (select(s))
  1.2960 -				// pad to oldDepth, select the last branch for each depth
  1.2961 -				for (i=d;i<oldDepth;i++)
  1.2962 -				{
  1.2963 -					b=select (s);
  1.2964 -					if (b)
  1.2965 -						if ( xelection.getBranch()->countBranches()>0)
  1.2966 -							s+=",bo:"+ QString ("%1").arg( xelection.getBranch()->countBranches()-1 );
  1.2967 -						else	
  1.2968 -							break;
  1.2969 -					else
  1.2970 -						break;
  1.2971 -				}	
  1.2972 -			
  1.2973 -			// try to select the freshly built string
  1.2974 -			found=select(s);
  1.2975 -			d--;
  1.2976 -		}
  1.2977 -		return;
  1.2978 -	}	
  1.2979 -}
  1.2980 -
  1.2981 -void MapEditor::selectUpperBranch()
  1.2982 -{
  1.2983 -	if (isSelectBlocked() ) return;
  1.2984 -
  1.2985 -	BranchObj *bo=xelection.getBranch();
  1.2986 -	if (bo && xelection.type()==Selection::Branch)
  1.2987 -	{
  1.2988 -		if (bo->getOrientation()==LinkableMapObj::RightOfCenter)
  1.2989 -			selectPrevBranchInt();
  1.2990 -		else
  1.2991 -			if (bo->getDepth()==1)
  1.2992 -				selectNextBranchInt();
  1.2993 -			else
  1.2994 -				selectPrevBranchInt();
  1.2995 -	}
  1.2996 -}
  1.2997 -
  1.2998 -void MapEditor::selectLowerBranch()
  1.2999 -{
  1.3000 -	if (isSelectBlocked() ) return;
  1.3001 -
  1.3002 -	BranchObj *bo=xelection.getBranch();
  1.3003 -	if (bo && xelection.type()==Selection::Branch)
  1.3004 -	{
  1.3005 -		if (bo->getOrientation()==LinkableMapObj::RightOfCenter)
  1.3006 -			selectNextBranchInt();
  1.3007 -		else
  1.3008 -			if (bo->getDepth()==1)
  1.3009 -				selectPrevBranchInt();
  1.3010 -			else
  1.3011 -				selectNextBranchInt();
  1.3012 -	}			
  1.3013 -}
  1.3014 -
  1.3015 -
  1.3016 -void MapEditor::selectLeftBranch()
  1.3017 -{
  1.3018 -	if (isSelectBlocked() ) return;
  1.3019 -
  1.3020 -	BranchObj* bo;
  1.3021 -	BranchObj* par;
  1.3022 -	LinkableMapObj *sel=xelection.single();
  1.3023 -	if (sel)
  1.3024 -	{
  1.3025 -		if (xelection.type()== Selection::MapCenter)
  1.3026 -		{
  1.3027 -			par=xelection.getBranch();
  1.3028 -			bo=par->getLastSelectedBranch();
  1.3029 -			if (bo)
  1.3030 -			{
  1.3031 -				// Workaround for reselecting on left and right side
  1.3032 -				if (bo->getOrientation()==LinkableMapObj::RightOfCenter)
  1.3033 -					bo=par->getLastBranch();
  1.3034 -				if (bo)
  1.3035 -				{
  1.3036 -					bo=par->getLastBranch();
  1.3037 -					xelection.select(bo);
  1.3038 -					xelection.update();
  1.3039 -					ensureSelectionVisible();
  1.3040 -					sendSelection();
  1.3041 -				}
  1.3042 -			}	
  1.3043 -		} else
  1.3044 -		{
  1.3045 -			par=(BranchObj*)(sel->getParObj());
  1.3046 -			if (sel->getOrientation()==LinkableMapObj::RightOfCenter)
  1.3047 -			{
  1.3048 -				if (xelection.type() == Selection::Branch ||
  1.3049 -					xelection.type() == Selection::FloatImage)
  1.3050 -				{
  1.3051 -					xelection.select(par);
  1.3052 -					xelection.update();
  1.3053 -					ensureSelectionVisible();
  1.3054 -					sendSelection();
  1.3055 -				}
  1.3056 -			} else
  1.3057 -			{
  1.3058 -				if (xelection.type() == Selection::Branch )
  1.3059 -				{
  1.3060 -					bo=xelection.getBranch()->getLastSelectedBranch();
  1.3061 -					if (bo) 
  1.3062 -					{
  1.3063 -						xelection.select(bo);
  1.3064 -						xelection.update();
  1.3065 -						ensureSelectionVisible();
  1.3066 -					sendSelection();
  1.3067 -					}
  1.3068 -				}
  1.3069 -			}
  1.3070 -		}	
  1.3071 -	}
  1.3072 -}
  1.3073 -
  1.3074 -void MapEditor::selectRightBranch()
  1.3075 -{
  1.3076 -	if (isSelectBlocked() ) return;
  1.3077 -
  1.3078 -	BranchObj* bo;
  1.3079 -	BranchObj* par;
  1.3080 -	LinkableMapObj *sel=xelection.single();
  1.3081 -	if (sel)
  1.3082 -	{
  1.3083 -		if (xelection.type()==Selection::MapCenter) 
  1.3084 -		{
  1.3085 -			par=xelection.getBranch();
  1.3086 -			bo=par->getLastSelectedBranch();
  1.3087 -			if (bo)
  1.3088 -			{
  1.3089 -				// Workaround for reselecting on left and right side
  1.3090 -				if (bo->getOrientation()==LinkableMapObj::LeftOfCenter)
  1.3091 -					bo=par->getFirstBranch();
  1.3092 -				if (bo)
  1.3093 -				{
  1.3094 -					xelection.select(bo);
  1.3095 -					xelection.update();
  1.3096 -					ensureSelectionVisible();
  1.3097 -					sendSelection();
  1.3098 -				}
  1.3099 -			}
  1.3100 -		} else
  1.3101 -		{
  1.3102 -			par=(BranchObj*)(xelection.single()->getParObj());
  1.3103 -			if (xelection.single()->getOrientation()==LinkableMapObj::LeftOfCenter)
  1.3104 -			{
  1.3105 -				if (xelection.type() == Selection::Branch ||
  1.3106 -					xelection.type() == Selection::FloatImage)
  1.3107 -				{
  1.3108 -					xelection.select(par);
  1.3109 -					xelection.update();
  1.3110 -					ensureSelectionVisible();
  1.3111 -					sendSelection();
  1.3112 -				}
  1.3113 -			} else
  1.3114 -			{
  1.3115 -				if (xelection.type()  == Selection::Branch) 
  1.3116 -				{
  1.3117 -					bo=xelection.getBranch()->getLastSelectedBranch();
  1.3118 -					if (bo) 
  1.3119 -					{
  1.3120 -						xelection.select(bo);
  1.3121 -						xelection.update();
  1.3122 -						ensureSelectionVisible();
  1.3123 -					sendSelection();
  1.3124 -					}
  1.3125 -				}
  1.3126 -			}
  1.3127 -		}
  1.3128 -	}
  1.3129 -}
  1.3130 -
  1.3131 -void MapEditor::selectFirstBranch()
  1.3132 -{
  1.3133 -	BranchObj *bo1=xelection.getBranch();
  1.3134 -	BranchObj *bo2;
  1.3135 -	BranchObj* par;
  1.3136 -	if (bo1)
  1.3137 -	{
  1.3138 -		par=(BranchObj*)(bo1->getParObj());
  1.3139 -		if (!par) return;
  1.3140 -		bo2=par->getFirstBranch();
  1.3141 -		if (bo2) {
  1.3142 -			xelection.select(bo2);
  1.3143 -			xelection.update();
  1.3144 -			ensureSelectionVisible();
  1.3145 -			sendSelection();
  1.3146 -		}
  1.3147 -	}		
  1.3148 -}
  1.3149 -
  1.3150 -void MapEditor::selectLastBranch()
  1.3151 -{
  1.3152 -	BranchObj *bo1=xelection.getBranch();
  1.3153 -	BranchObj *bo2;
  1.3154 -	BranchObj* par;
  1.3155 -	if (bo1)
  1.3156 -	{
  1.3157 -		par=(BranchObj*)(bo1->getParObj());
  1.3158 -		if (!par) return;
  1.3159 -		bo2=par->getLastBranch();
  1.3160 -		if (bo2) 
  1.3161 -		{
  1.3162 -			xelection.select(bo2);
  1.3163 -			xelection.update();
  1.3164 -			ensureSelectionVisible();
  1.3165 -			sendSelection();
  1.3166 -		}
  1.3167 -	}		
  1.3168 -}
  1.3169 -
  1.3170 -void MapEditor::selectMapBackgroundImage ()
  1.3171 -{
  1.3172 -	Q3FileDialog *fd=new Q3FileDialog( this);
  1.3173 -	fd->setMode (Q3FileDialog::ExistingFile);
  1.3174 -	fd->addFilter (QString (tr("Images") + " (*.png *.bmp *.xbm *.jpg *.png *.xpm *.gif *.pnm)"));
  1.3175 -	ImagePreview *p =new ImagePreview (fd);
  1.3176 -	fd->setContentsPreviewEnabled( TRUE );
  1.3177 -	fd->setContentsPreview( p, p );
  1.3178 -	fd->setPreviewMode( Q3FileDialog::Contents );
  1.3179 -	fd->setCaption(vymName+" - " +tr("Load background image"));
  1.3180 -	fd->setDir (lastImageDir);
  1.3181 -	fd->show();
  1.3182 -
  1.3183 -	if ( fd->exec() == QDialog::Accepted )
  1.3184 -	{
  1.3185 -		// TODO selectMapBackgroundImg in QT4 use:	lastImageDir=fd->directory();
  1.3186 -		lastImageDir=QDir (fd->dirPath());
  1.3187 -		setMapBackgroundImage (fd->selectedFile());
  1.3188 -	}
  1.3189 -}	
  1.3190 -
  1.3191 -void MapEditor::setMapBackgroundImage (const QString &fn)	//FIXME missing savestate
  1.3192 -{
  1.3193 -	QColor oldcol=mapScene->backgroundBrush().color();
  1.3194 -	/*
  1.3195 -	saveState(
  1.3196 -		selection,
  1.3197 -		QString ("setMapBackgroundImage (%1)").arg(oldcol.name()),
  1.3198 -		selection,
  1.3199 -		QString ("setMapBackgroundImage (%1)").arg(col.name()),
  1.3200 -		QString("Set background color of map to %1").arg(col.name()));
  1.3201 -	*/	
  1.3202 -	QBrush brush;
  1.3203 -	brush.setTextureImage (QPixmap (fn));
  1.3204 -	mapScene->setBackgroundBrush(brush);
  1.3205 -}
  1.3206 -
  1.3207 -void MapEditor::selectMapBackgroundColor()
  1.3208 -{
  1.3209 -	QColor col = QColorDialog::getColor( mapScene->backgroundBrush().color(), this );
  1.3210 -	if ( !col.isValid() ) return;
  1.3211 -	setMapBackgroundColor( col );
  1.3212 -}
  1.3213 -
  1.3214 -
  1.3215 -void MapEditor::setMapBackgroundColor(QColor col)
  1.3216 -{
  1.3217 -	QColor oldcol=mapScene->backgroundBrush().color();
  1.3218 -	saveState(
  1.3219 -		QString ("setMapBackgroundColor (\"%1\")").arg(oldcol.name()),
  1.3220 -		QString ("setMapBackgroundColor (\"%1\")").arg(col.name()),
  1.3221 -		QString("Set background color of map to %1").arg(col.name()));
  1.3222 -	mapScene->setBackgroundBrush(col);
  1.3223 -}
  1.3224 -
  1.3225 -QColor MapEditor::getMapBackgroundColor()
  1.3226 -{
  1.3227 -    return mapScene->backgroundBrush().color();
  1.3228 -}
  1.3229 -
  1.3230 -QColor MapEditor::getCurrentHeadingColor()
  1.3231 -{
  1.3232 -	BranchObj *bo=xelection.getBranch();
  1.3233 -	if (bo) return bo->getColor(); 
  1.3234 -	
  1.3235 -	QMessageBox::warning(0,tr("Warning"),tr("Can't get color of heading,\nthere's no branch selected"));
  1.3236 -	return Qt::black;
  1.3237 -}
  1.3238 -
  1.3239 -void MapEditor::colorBranch (QColor c)
  1.3240 -{
  1.3241 -	BranchObj *bo=xelection.getBranch();
  1.3242 -	if (bo)
  1.3243 -	{
  1.3244 -		saveState(
  1.3245 -			bo, 
  1.3246 -			QString ("colorBranch (\"%1\")").arg(bo->getColor().name()),
  1.3247 -			bo,
  1.3248 -			QString ("colorBranch (\"%1\")").arg(c.name()),
  1.3249 -			QString("Set color of %1 to %2").arg(getName(bo)).arg(c.name())
  1.3250 -		);	
  1.3251 -		bo->setColor(c); // color branch
  1.3252 -	}
  1.3253 -}
  1.3254 -
  1.3255 -void MapEditor::colorSubtree (QColor c)
  1.3256 -{
  1.3257 -	BranchObj *bo=xelection.getBranch();
  1.3258 -	if (bo) 
  1.3259 -	{
  1.3260 -		saveStateChangingPart(
  1.3261 -			bo, 
  1.3262 -			bo,
  1.3263 -			QString ("colorSubtree (\"%1\")").arg(c.name()),
  1.3264 -			QString ("Set color of %1 and childs to %2").arg(getName(bo)).arg(c.name())
  1.3265 -		);	
  1.3266 -		bo->setColorSubtree (c); // color links, color childs
  1.3267 -	}
  1.3268 -}
  1.3269 -
  1.3270 -
  1.3271  void MapEditor::toggleStandardFlag(QString f)
  1.3272  {
  1.3273 -	BranchObj *bo=xelection.getBranch();
  1.3274 +	BranchObj *bo=model->getSelectedBranch();
  1.3275  	if (bo) 
  1.3276  	{
  1.3277  		QString u,r;
  1.3278 @@ -3377,1042 +263,21 @@
  1.3279  			u="unsetFlag";
  1.3280  			r="setFlag";
  1.3281  		}	
  1.3282 -		saveState(
  1.3283 +		model->saveState(
  1.3284  			bo,
  1.3285  			QString("%1 (\"%2\")").arg(u).arg(f), 
  1.3286  			bo,
  1.3287  			QString("%1 (\"%2\")").arg(r).arg(f),
  1.3288  			QString("Toggling standard flag \"%1\" of %2").arg(f).arg(getName(bo)));
  1.3289  		bo->toggleStandardFlag (f,mainWindow->useFlagGroups());
  1.3290 -		xelection.update();
  1.3291 +		model->updateSelection();
  1.3292  	}
  1.3293  }
  1.3294  
  1.3295 -
  1.3296 -BranchObj* MapEditor::findText (QString s, bool cs)
  1.3297 -{
  1.3298 -	QTextDocument::FindFlags flags=0;
  1.3299 -	if (cs) flags=QTextDocument::FindCaseSensitively;
  1.3300 -
  1.3301 -	if (!itFind) 
  1.3302 -	{	// Nothing found or new find process
  1.3303 -		if (EOFind)
  1.3304 -			// nothing found, start again
  1.3305 -			EOFind=false;
  1.3306 -		itFind=model->first();
  1.3307 -	}	
  1.3308 -	bool searching=true;
  1.3309 -	bool foundNote=false;
  1.3310 -	while (searching && !EOFind)
  1.3311 -	{
  1.3312 -		if (itFind)
  1.3313 -		{
  1.3314 -			// Searching in Note
  1.3315 -			if (itFind->getNote().contains(s,cs))
  1.3316 -			{
  1.3317 -				if (xelection.single()!=itFind) 
  1.3318 -				{
  1.3319 -					xelection.select(itFind);
  1.3320 -					ensureSelectionVisible();
  1.3321 -				}
  1.3322 -				if (textEditor->findText(s,flags)) 
  1.3323 -				{
  1.3324 -					searching=false;
  1.3325 -					foundNote=true;
  1.3326 -				}	
  1.3327 -			}
  1.3328 -			// Searching in Heading
  1.3329 -			if (searching && itFind->getHeading().contains (s,cs) ) 
  1.3330 -			{
  1.3331 -				xelection.select(itFind);
  1.3332 -				ensureSelectionVisible();
  1.3333 -				searching=false;
  1.3334 -			}
  1.3335 -		}	
  1.3336 -		if (!foundNote)
  1.3337 -		{
  1.3338 -			itFind=model->next(itFind);
  1.3339 -			if (!itFind) EOFind=true;
  1.3340 -		}
  1.3341 -	//cout <<"still searching...  "<<qPrintable( itFind->getHeading())<<endl;
  1.3342 -	}	
  1.3343 -	if (!searching)
  1.3344 -		return xelection.getBranch();
  1.3345 -	else
  1.3346 -		return NULL;
  1.3347 -}
  1.3348 -
  1.3349 -void MapEditor::findReset()
  1.3350 -{	// Necessary if text to find changes during a find process
  1.3351 -	itFind=NULL;
  1.3352 -	EOFind=false;
  1.3353 -}
  1.3354 -void MapEditor::setURL(const QString &url)
  1.3355 -{
  1.3356 -	BranchObj *bo=xelection.getBranch();
  1.3357 -	if (bo)
  1.3358 -	{
  1.3359 -		QString oldurl=bo->getURL();
  1.3360 -		bo->setURL (url);
  1.3361 -		saveState (
  1.3362 -			bo,
  1.3363 -			QString ("setURL (\"%1\")").arg(oldurl),
  1.3364 -			bo,
  1.3365 -			QString ("setURL (\"%1\")").arg(url),
  1.3366 -			QString ("set URL of %1 to %2").arg(getName(bo)).arg(url)
  1.3367 -		);
  1.3368 -		updateActions();
  1.3369 -		model->reposition();
  1.3370 -		xelection.update();
  1.3371 -		ensureSelectionVisible();
  1.3372 -	}
  1.3373 -}	
  1.3374 -
  1.3375 -void MapEditor::editURL()
  1.3376 -{
  1.3377 -	BranchObj *bo=xelection.getBranch();
  1.3378 -	if (bo)
  1.3379 -	{		
  1.3380 -		bool ok;
  1.3381 -		QString text = QInputDialog::getText(
  1.3382 -				"VYM", tr("Enter URL:"), QLineEdit::Normal,
  1.3383 -				bo->getURL(), &ok, this );
  1.3384 -		if ( ok) 
  1.3385 -			// user entered something and pressed OK
  1.3386 -			setURL (text);
  1.3387 -	}
  1.3388 -}
  1.3389 -
  1.3390 -void MapEditor::editLocalURL()
  1.3391 -{
  1.3392 -	BranchObj *bo=xelection.getBranch();
  1.3393 -	if (bo)
  1.3394 -	{		
  1.3395 -		QStringList filters;
  1.3396 -		filters <<"All files (*)";
  1.3397 -		filters << tr("Text","Filedialog") + " (*.txt)";
  1.3398 -		filters << tr("Spreadsheet","Filedialog") + " (*.odp,*.sxc)";
  1.3399 -		filters << tr("Textdocument","Filedialog") +" (*.odw,*.sxw)";
  1.3400 -		filters << tr("Images","Filedialog") + " (*.png *.bmp *.xbm *.jpg *.png *.xpm *.gif *.pnm)";
  1.3401 -		QFileDialog *fd=new QFileDialog( this,vymName+" - " +tr("Set URL to a local file"));
  1.3402 -		fd->setFilters (filters);
  1.3403 -		fd->setCaption(vymName+" - " +tr("Set URL to a local file"));
  1.3404 -		fd->setDirectory (lastFileDir);
  1.3405 -		if (! bo->getVymLink().isEmpty() )
  1.3406 -			fd->selectFile( bo->getURL() );
  1.3407 -		fd->show();
  1.3408 -
  1.3409 -		if ( fd->exec() == QDialog::Accepted )
  1.3410 -		{
  1.3411 -			lastFileDir=QDir (fd->directory().path());
  1.3412 -			setURL (fd->selectedFile() );
  1.3413 -		}
  1.3414 -	}
  1.3415 -}
  1.3416 -
  1.3417 -QString MapEditor::getURL()
  1.3418 -{
  1.3419 -	BranchObj *bo=xelection.getBranch();
  1.3420 -	if (bo)
  1.3421 -		return bo->getURL();
  1.3422 -	else
  1.3423 -		return "";
  1.3424 -}
  1.3425 -
  1.3426 -QStringList MapEditor::getURLs()
  1.3427 -{
  1.3428 -	QStringList urls;
  1.3429 -	BranchObj *bo=xelection.getBranch();
  1.3430 -	if (bo)
  1.3431 -	{		
  1.3432 -		bo=bo->first();	
  1.3433 -		while (bo) 
  1.3434 -		{
  1.3435 -			if (!bo->getURL().isEmpty()) urls.append( bo->getURL());
  1.3436 -			bo=bo->next();
  1.3437 -		}	
  1.3438 -	}	
  1.3439 -	return urls;
  1.3440 -}
  1.3441 -
  1.3442 -
  1.3443 -void MapEditor::editHeading2URL()
  1.3444 -{
  1.3445 -	BranchObj *bo=xelection.getBranch();
  1.3446 -	if (bo)
  1.3447 -		setURL (bo->getHeading());
  1.3448 -}	
  1.3449 -
  1.3450 -void MapEditor::editBugzilla2URL()
  1.3451 -{
  1.3452 -	BranchObj *bo=xelection.getBranch();
  1.3453 -	if (bo)
  1.3454 -	{		
  1.3455 -		QString url= "https://bugzilla.novell.com/show_bug.cgi?id="+bo->getHeading();
  1.3456 -		setURL (url);
  1.3457 -	}
  1.3458 -}	
  1.3459 -
  1.3460 -void MapEditor::editFATE2URL()
  1.3461 -{
  1.3462 -	BranchObj *bo=xelection.getBranch();
  1.3463 -	if (bo)
  1.3464 -	{		
  1.3465 -		QString url= "http://keeper.suse.de:8080/webfate/match/id?value=ID"+bo->getHeading();
  1.3466 -		saveState(
  1.3467 -			bo,
  1.3468 -			"setURL (\""+bo->getURL()+"\")",
  1.3469 -			bo,
  1.3470 -			"setURL (\""+url+"\")",
  1.3471 -			QString("Use heading of %1 as link to FATE").arg(getName(bo))
  1.3472 -		);	
  1.3473 -		bo->setURL (url);
  1.3474 -		updateActions();
  1.3475 -	}
  1.3476 -}	
  1.3477 -
  1.3478 -void MapEditor::editVymLink()
  1.3479 -{
  1.3480 -	BranchObj *bo=xelection.getBranch();
  1.3481 -	if (bo)
  1.3482 -	{		
  1.3483 -		QStringList filters;
  1.3484 -		filters <<"VYM map (*.vym)";
  1.3485 -		QFileDialog *fd=new QFileDialog( this,vymName+" - " +tr("Link to another map"));
  1.3486 -		fd->setFilters (filters);
  1.3487 -		fd->setCaption(vymName+" - " +tr("Link to another map"));
  1.3488 -		fd->setDirectory (lastFileDir);
  1.3489 -		if (! bo->getVymLink().isEmpty() )
  1.3490 -			fd->selectFile( bo->getVymLink() );
  1.3491 -		fd->show();
  1.3492 -
  1.3493 -		QString fn;
  1.3494 -		if ( fd->exec() == QDialog::Accepted )
  1.3495 -		{
  1.3496 -			lastFileDir=QDir (fd->directory().path());
  1.3497 -			saveState(
  1.3498 -				bo,
  1.3499 -				"setVymLink (\""+bo->getVymLink()+"\")",
  1.3500 -				bo,
  1.3501 -				"setVymLink (\""+fd->selectedFile()+"\")",
  1.3502 -				QString("Set vymlink of %1 to %2").arg(getName(bo)).arg(fd->selectedFile())
  1.3503 -			);	
  1.3504 -			setVymLinkInt (fd->selectedFile() );
  1.3505 -		}
  1.3506 -	}
  1.3507 -}
  1.3508 -
  1.3509 -void MapEditor::deleteVymLink()
  1.3510 -{
  1.3511 -	BranchObj *bo=xelection.getBranch();
  1.3512 -	if (bo)
  1.3513 -	{		
  1.3514 -		saveState(
  1.3515 -			bo,
  1.3516 -			"setVymLink (\""+bo->getVymLink()+"\")",
  1.3517 -			bo,
  1.3518 -			"setVymLink (\"\")",
  1.3519 -			QString("Unset vymlink of %1").arg(getName(bo))
  1.3520 -		);	
  1.3521 -		bo->setVymLink ("" );
  1.3522 -		updateActions();
  1.3523 -		model->reposition();
  1.3524 -		scene()->update();
  1.3525 -	}
  1.3526 -}
  1.3527 -
  1.3528 -void MapEditor::setHideExport(bool b)
  1.3529 -{
  1.3530 -	BranchObj *bo=xelection.getBranch();
  1.3531 -	if (bo)
  1.3532 -	{
  1.3533 -		bo->setHideInExport (b);
  1.3534 -		QString u= b ? "false" : "true";
  1.3535 -		QString r=!b ? "false" : "true";
  1.3536 -		
  1.3537 -		saveState(
  1.3538 -			bo,
  1.3539 -			QString ("setHideExport (%1)").arg(u),
  1.3540 -			bo,
  1.3541 -			QString ("setHideExport (%1)").arg(r),
  1.3542 -			QString ("Set HideExport flag of %1 to %2").arg(getName(bo)).arg (r)
  1.3543 -		);	
  1.3544 -		updateActions();
  1.3545 -		model->reposition();
  1.3546 -		xelection.update();
  1.3547 -		scene()->update();
  1.3548 -	}
  1.3549 -}
  1.3550 -
  1.3551 -void MapEditor::toggleHideExport()
  1.3552 -{
  1.3553 -	BranchObj *bo=xelection.getBranch();
  1.3554 -	if (bo)
  1.3555 -		setHideExport ( !bo->hideInExport() );
  1.3556 -}
  1.3557 -
  1.3558 -QString MapEditor::getVymLink()
  1.3559 -{
  1.3560 -	BranchObj *bo=xelection.getBranch();
  1.3561 -	if (bo)
  1.3562 -		return bo->getVymLink();
  1.3563 -	else	
  1.3564 -		return "";
  1.3565 -	
  1.3566 -}
  1.3567 -
  1.3568 -QStringList MapEditor::getVymLinks()
  1.3569 -{
  1.3570 -	QStringList links;
  1.3571 -	BranchObj *bo=xelection.getBranch();
  1.3572 -	if (bo)
  1.3573 -	{		
  1.3574 -		bo=bo->first();	
  1.3575 -		while (bo) 
  1.3576 -		{
  1.3577 -			if (!bo->getVymLink().isEmpty()) links.append( bo->getVymLink());
  1.3578 -			bo=bo->next();
  1.3579 -		}	
  1.3580 -	}	
  1.3581 -	return links;
  1.3582 -}
  1.3583 -
  1.3584 -
  1.3585 -void MapEditor::deleteKeepChilds()
  1.3586 -{
  1.3587 -	BranchObj *bo=xelection.getBranch();
  1.3588 -	BranchObj *par;
  1.3589 -	if (bo)
  1.3590 -	{
  1.3591 -		par=(BranchObj*)(bo->getParObj());
  1.3592 -		QPointF p=bo->getRelPos();
  1.3593 -		saveStateChangingPart(
  1.3594 -			bo->getParObj(),
  1.3595 -			bo,
  1.3596 -			"deleteKeepChilds ()",
  1.3597 -			QString("Remove %1 and keep its childs").arg(getName(bo))
  1.3598 -		);
  1.3599 -
  1.3600 -		QString sel=model->getSelectString(bo);
  1.3601 -		unselect();
  1.3602 -		par->removeBranchHere(bo);
  1.3603 -		model->reposition();
  1.3604 -		select (sel);
  1.3605 -		xelection.getBranch()->move2RelPos (p);
  1.3606 -		model->reposition();
  1.3607 -	}	
  1.3608 -}
  1.3609 -
  1.3610 -void MapEditor::deleteChilds()
  1.3611 -{
  1.3612 -	BranchObj *bo=xelection.getBranch();
  1.3613 -	if (bo)
  1.3614 -	{		
  1.3615 -		saveStateChangingPart(
  1.3616 -			bo, 
  1.3617 -			bo,
  1.3618 -			"deleteChilds ()",
  1.3619 -			QString( "Remove childs of branch %1").arg(getName(bo))
  1.3620 -		);
  1.3621 -		bo->removeChilds();
  1.3622 -		model->reposition();
  1.3623 -	}	
  1.3624 -}
  1.3625 -
  1.3626 -void MapEditor::editMapInfo()
  1.3627 -{
  1.3628 -	ExtraInfoDialog dia;
  1.3629 -	dia.setMapName (getFileName() );
  1.3630 -	dia.setAuthor (model->getAuthor() );
  1.3631 -	dia.setComment(model->getComment() );
  1.3632 -
  1.3633 -	// Calc some stats
  1.3634 -	QString stats;
  1.3635 -    stats+=tr("%1 items on map\n","Info about map").arg (mapScene->items().size(),6);
  1.3636 -
  1.3637 -	uint b=0;
  1.3638 -	uint f=0;
  1.3639 -	uint n=0;
  1.3640 -	uint xl=0;
  1.3641 -	BranchObj *bo;
  1.3642 -	bo=model->first();
  1.3643 -	while (bo) 
  1.3644 -	{
  1.3645 -		if (!bo->getNote().isEmpty() ) n++;
  1.3646 -		f+= bo->countFloatImages();
  1.3647 -		b++;
  1.3648 -		xl+=bo->countXLinks();
  1.3649 -		bo=model->next(bo);
  1.3650 -	}
  1.3651 -    stats+=QString ("%1 branches\n").arg (b-1,6);
  1.3652 -    stats+=QString ("%1 xLinks \n").arg (xl,6);
  1.3653 -    stats+=QString ("%1 notes\n").arg (n,6);
  1.3654 -    stats+=QString ("%1 images\n").arg (f,6);
  1.3655 -	dia.setStats (stats);
  1.3656 -
  1.3657 -	// Finally show dialog
  1.3658 -	if (dia.exec() == QDialog::Accepted)
  1.3659 -	{
  1.3660 -		setMapAuthor (dia.getAuthor() );
  1.3661 -		setMapComment (dia.getComment() );
  1.3662 -	}
  1.3663 -}
  1.3664 -
  1.3665 -void MapEditor::ensureSelectionVisible()
  1.3666 -{
  1.3667 -	LinkableMapObj *lmo=xelection.single();
  1.3668 -	if (lmo) ensureVisible (lmo->getBBox() );
  1.3669 -	
  1.3670 -}
  1.3671 -
  1.3672  void MapEditor::updateSelection()
  1.3673  {
  1.3674  	// Tell selection to update geometries
  1.3675 -	xelection.update();
  1.3676 -}
  1.3677 -
  1.3678 -void MapEditor::updateActions()
  1.3679 -{
  1.3680 -	// Tell mainwindow to update states of actions
  1.3681 -	mainWindow->updateActions();
  1.3682 -	// TODO maybe don't update if blockReposition is set
  1.3683 -}
  1.3684 -
  1.3685 -void MapEditor::updateNoteFlag()
  1.3686 -{
  1.3687 -	setChanged();
  1.3688 -	BranchObj *bo=xelection.getBranch();
  1.3689 -	if (bo) 
  1.3690 -	{
  1.3691 -		bo->updateNoteFlag();
  1.3692 -		mainWindow->updateActions();
  1.3693 -	}	
  1.3694 -}
  1.3695 -
  1.3696 -void MapEditor::setMapAuthor (const QString &s)
  1.3697 -{
  1.3698 -	saveState (
  1.3699 -		QString ("setMapAuthor (\"%1\")").arg(model->getAuthor()),
  1.3700 -		QString ("setMapAuthor (\"%1\")").arg(s),
  1.3701 -		QString ("Set author of map to \"%1\"").arg(s)
  1.3702 -	);
  1.3703 -	model->setAuthor (s);
  1.3704 -}
  1.3705 -
  1.3706 -void MapEditor::setMapComment (const QString &s)
  1.3707 -{
  1.3708 -	saveState (
  1.3709 -		QString ("setMapComment (\"%1\")").arg(model->getComment()),
  1.3710 -		QString ("setMapComment (\"%1\")").arg(s),
  1.3711 -		QString ("Set comment of map")
  1.3712 -	);
  1.3713 -	model->setComment (s);
  1.3714 -}
  1.3715 -
  1.3716 -void MapEditor::setMapLinkStyle (const QString & s)
  1.3717 -{
  1.3718 -	QString snow;
  1.3719 -	if (linkstyle==LinkableMapObj::Line)
  1.3720 -		snow="StyleLine";
  1.3721 -	else if (linkstyle==LinkableMapObj::Parabel)
  1.3722 -		snow="StyleParabel";
  1.3723 -	else if (linkstyle==LinkableMapObj::PolyLine)
  1.3724 -		snow="StylePolyLine";
  1.3725 -	else if (linkstyle==LinkableMapObj::PolyParabel)
  1.3726 -		snow="StyleParabel";
  1.3727 -
  1.3728 -	saveState (
  1.3729 -		QString("setMapLinkStyle (\"%1\")").arg(s),
  1.3730 -		QString("setMapLinkStyle (\"%1\")").arg(snow),
  1.3731 -		QString("Set map link style (\"%1\")").arg(s)
  1.3732 -	);	
  1.3733 -
  1.3734 -	if (s=="StyleLine")
  1.3735 -		linkstyle=LinkableMapObj::Line;
  1.3736 -	else if (s=="StyleParabel")
  1.3737 -		linkstyle=LinkableMapObj::Parabel;
  1.3738 -	else if (s=="StylePolyLine")
  1.3739 -		linkstyle=LinkableMapObj::PolyLine;
  1.3740 -	else	
  1.3741 -		linkstyle=LinkableMapObj::PolyParabel;
  1.3742 -
  1.3743 -	BranchObj *bo;
  1.3744 -	bo=model->first();
  1.3745 -	bo=model->next(bo);
  1.3746 -	while (bo) 
  1.3747 -	{
  1.3748 -		bo->setLinkStyle(bo->getDefLinkStyle());
  1.3749 -		bo=model->next(bo);
  1.3750 -	}
  1.3751 -	model->reposition();
  1.3752 -}
  1.3753 -
  1.3754 -LinkableMapObj::Style MapEditor::getMapLinkStyle ()
  1.3755 -{
  1.3756 -	return linkstyle;
  1.3757 -}	
  1.3758 -
  1.3759 -void MapEditor::setMapDefLinkColor(QColor c)
  1.3760 -{
  1.3761 -	defLinkColor=c;
  1.3762 -	BranchObj *bo;
  1.3763 -	bo=model->first();
  1.3764 -	while (bo) 
  1.3765 -	{
  1.3766 -		bo->setLinkColor();
  1.3767 -		bo=model->next(bo);
  1.3768 -	}
  1.3769 -	updateActions();
  1.3770 -}
  1.3771 -
  1.3772 -void MapEditor::setMapLinkColorHintInt()
  1.3773 -{
  1.3774 -	// called from setMapLinkColorHint(lch) or at end of parse
  1.3775 -	BranchObj *bo;
  1.3776 -	bo=model->first();
  1.3777 -	while (bo) 
  1.3778 -	{
  1.3779 -		bo->setLinkColor();
  1.3780 -		bo=model->next(bo);
  1.3781 -	}
  1.3782 -}
  1.3783 -
  1.3784 -void MapEditor::setMapLinkColorHint(LinkableMapObj::ColorHint lch)
  1.3785 -{
  1.3786 -	linkcolorhint=lch;
  1.3787 -	setMapLinkColorHintInt();
  1.3788 -}
  1.3789 -
  1.3790 -void MapEditor::toggleMapLinkColorHint()
  1.3791 -{
  1.3792 -	if (linkcolorhint==LinkableMapObj::HeadingColor)
  1.3793 -		linkcolorhint=LinkableMapObj::DefaultColor;
  1.3794 -	else	
  1.3795 -		linkcolorhint=LinkableMapObj::HeadingColor;
  1.3796 -	BranchObj *bo;
  1.3797 -	bo=model->first();
  1.3798 -	while (bo) 
  1.3799 -	{
  1.3800 -		bo->setLinkColor();
  1.3801 -		bo=model->next(bo);
  1.3802 -	}
  1.3803 -}
  1.3804 -
  1.3805 -LinkableMapObj::ColorHint MapEditor::getMapLinkColorHint()
  1.3806 -{
  1.3807 -	return linkcolorhint;
  1.3808 -}
  1.3809 -
  1.3810 -QColor MapEditor::getMapDefLinkColor()
  1.3811 -{
  1.3812 -	return defLinkColor;
  1.3813 -}
  1.3814 -
  1.3815 -void MapEditor::setMapDefXLinkColor(QColor col)
  1.3816 -{
  1.3817 -	defXLinkColor=col;
  1.3818 -}
  1.3819 -
  1.3820 -QColor MapEditor::getMapDefXLinkColor()
  1.3821 -{
  1.3822 -	return defXLinkColor;
  1.3823 -}
  1.3824 -
  1.3825 -void MapEditor::setMapDefXLinkWidth (int w)
  1.3826 -{
  1.3827 -	defXLinkWidth=w;
  1.3828 -}
  1.3829 -
  1.3830 -int MapEditor::getMapDefXLinkWidth()
  1.3831 -{
  1.3832 -	return defXLinkWidth;
  1.3833 -}
  1.3834 -
  1.3835 -void MapEditor::selectMapLinkColor()
  1.3836 -{
  1.3837 -	QColor col = QColorDialog::getColor( defLinkColor, this );
  1.3838 -	if ( !col.isValid() ) return;
  1.3839 -	saveState (
  1.3840 -		QString("setMapDefLinkColor (\"%1\")").arg(getMapDefLinkColor().name()),
  1.3841 -		QString("setMapDefLinkColor (\"%1\")").arg(col.name()),
  1.3842 -		QString("Set map link color to %1").arg(col.name())
  1.3843 -	);
  1.3844 -	setMapDefLinkColor( col );
  1.3845 -}
  1.3846 -
  1.3847 -void MapEditor::selectMapSelectionColor()
  1.3848 -{
  1.3849 -	QColor col = QColorDialog::getColor( defLinkColor, this );
  1.3850 -	setSelectionColor (col);
  1.3851 -}
  1.3852 -
  1.3853 -void MapEditor::setSelectionColorInt (QColor col)
  1.3854 -{
  1.3855 -	if ( !col.isValid() ) return;
  1.3856 -	xelection.setColor (col);
  1.3857 -}
  1.3858 -
  1.3859 -void MapEditor::setSelectionColor(QColor col)
  1.3860 -{
  1.3861 -	if ( !col.isValid() ) return;
  1.3862 -	saveState (
  1.3863 -		QString("setSelectionColor (%1)").arg(xelection.getColor().name()),
  1.3864 -		QString("setSelectionColor (%1)").arg(col.name()),
  1.3865 -		QString("Set color of selection box to %1").arg(col.name())
  1.3866 -	);
  1.3867 -	setSelectionColorInt (col);
  1.3868 -}
  1.3869 -
  1.3870 -QColor MapEditor::getSelectionColor()
  1.3871 -{
  1.3872 -	return xelection.getColor();
  1.3873 -}
  1.3874 -
  1.3875 -bool MapEditor::scrollBranch(BranchObj *bo)
  1.3876 -{
  1.3877 -	if (bo)
  1.3878 -	{
  1.3879 -		if (bo->isScrolled()) return false;
  1.3880 -		if (bo->countBranches()==0) return false;
  1.3881 -		if (bo->getDepth()==0) return false;
  1.3882 -		QString u,r;
  1.3883 -		r="scroll";
  1.3884 -		u="unscroll";
  1.3885 -		saveState(
  1.3886 -			bo,
  1.3887 -			QString ("%1 ()").arg(u),
  1.3888 -			bo,
  1.3889 -			QString ("%1 ()").arg(r),
  1.3890 -			QString ("%1 %2").arg(r).arg(getName(bo))
  1.3891 -		);
  1.3892 -		bo->toggleScroll();
  1.3893 -		xelection.update();
  1.3894 -		scene()->update();
  1.3895 -		return true;
  1.3896 -	}	
  1.3897 -	return false;
  1.3898 -}
  1.3899 -
  1.3900 -bool MapEditor::unscrollBranch(BranchObj *bo)
  1.3901 -{
  1.3902 -	if (bo)
  1.3903 -	{
  1.3904 -		if (!bo->isScrolled()) return false;
  1.3905 -		if (bo->countBranches()==0) return false;
  1.3906 -		if (bo->getDepth()==0) return false;
  1.3907 -		QString u,r;
  1.3908 -		u="scroll";
  1.3909 -		r="unscroll";
  1.3910 -		saveState(
  1.3911 -			bo,
  1.3912 -			QString ("%1 ()").arg(u),
  1.3913 -			bo,
  1.3914 -			QString ("%1 ()").arg(r),
  1.3915 -			QString ("%1 %2").arg(r).arg(getName(bo))
  1.3916 -		);
  1.3917 -		bo->toggleScroll();
  1.3918 -		xelection.update();
  1.3919 -		scene()->update();
  1.3920 -		return true;
  1.3921 -	}	
  1.3922 -	return false;
  1.3923 -}
  1.3924 -
  1.3925 -void MapEditor::toggleScroll()
  1.3926 -{
  1.3927 -	BranchObj *bo=xelection.getBranch();
  1.3928 -	if (xelection.type()==Selection::Branch )
  1.3929 -	{
  1.3930 -		if (bo->isScrolled())
  1.3931 -			unscrollBranch (bo);
  1.3932 -		else
  1.3933 -			scrollBranch (bo);
  1.3934 -	}
  1.3935 -}
  1.3936 -
  1.3937 -void MapEditor::unscrollChilds() 
  1.3938 -{
  1.3939 -	BranchObj *bo=xelection.getBranch();
  1.3940 -	if (bo)
  1.3941 -	{
  1.3942 -		bo->first();
  1.3943 -		while (bo) 
  1.3944 -		{
  1.3945 -			if (bo->isScrolled()) unscrollBranch (bo);
  1.3946 -			bo=bo->next();
  1.3947 -		}
  1.3948 -	}	
  1.3949 -}
  1.3950 -
  1.3951 -FloatImageObj* MapEditor::loadFloatImageInt (QString fn)
  1.3952 -{
  1.3953 -	BranchObj *bo=xelection.getBranch();
  1.3954 -	if (bo)
  1.3955 -	{
  1.3956 -		FloatImageObj *fio;
  1.3957 -		bo->addFloatImage();
  1.3958 -		fio=bo->getLastFloatImage();
  1.3959 -		fio->load(fn);
  1.3960 -		model->reposition();
  1.3961 -		scene()->update();
  1.3962 -		return fio;
  1.3963 -	}
  1.3964 -	return NULL;
  1.3965 -}	
  1.3966 -
  1.3967 -void MapEditor::loadFloatImage ()
  1.3968 -{
  1.3969 -	BranchObj *bo=xelection.getBranch();
  1.3970 -	if (bo)
  1.3971 -	{
  1.3972 -
  1.3973 -		Q3FileDialog *fd=new Q3FileDialog( this);
  1.3974 -		fd->setMode (Q3FileDialog::ExistingFiles);
  1.3975 -		fd->addFilter (QString (tr("Images") + " (*.png *.bmp *.xbm *.jpg *.png *.xpm *.gif *.pnm)"));
  1.3976 -		ImagePreview *p =new ImagePreview (fd);
  1.3977 -		fd->setContentsPreviewEnabled( TRUE );
  1.3978 -		fd->setContentsPreview( p, p );
  1.3979 -		fd->setPreviewMode( Q3FileDialog::Contents );
  1.3980 -		fd->setCaption(vymName+" - " +tr("Load image"));
  1.3981 -		fd->setDir (lastImageDir);
  1.3982 -		fd->show();
  1.3983 -
  1.3984 -		if ( fd->exec() == QDialog::Accepted )
  1.3985 -		{
  1.3986 -			// TODO loadFIO in QT4 use:	lastImageDir=fd->directory();
  1.3987 -			lastImageDir=QDir (fd->dirPath());
  1.3988 -			QString s;
  1.3989 -			FloatImageObj *fio;
  1.3990 -			for (int j=0; j<fd->selectedFiles().count(); j++)
  1.3991 -			{
  1.3992 -				s=fd->selectedFiles().at(j);
  1.3993 -				fio=loadFloatImageInt (s);
  1.3994 -				if (fio)
  1.3995 -					saveState(
  1.3996 -						(LinkableMapObj*)fio,
  1.3997 -						"delete ()",
  1.3998 -						bo, 
  1.3999 -						QString ("loadImage (%1)").arg(s ),
  1.4000 -						QString("Add image %1 to %2").arg(s).arg(getName(bo))
  1.4001 -					);
  1.4002 -				else
  1.4003 -					// TODO loadFIO error handling
  1.4004 -					qWarning ("Failed to load "+s);
  1.4005 -			}
  1.4006 -		}
  1.4007 -		delete (p);
  1.4008 -		delete (fd);
  1.4009 -	}
  1.4010 -}
  1.4011 -
  1.4012 -void MapEditor::saveFloatImageInt  (FloatImageObj *fio, const QString &type, const QString &fn)
  1.4013 -{
  1.4014 -	fio->save (fn,type);
  1.4015 -}
  1.4016 -
  1.4017 -void MapEditor::saveFloatImage ()
  1.4018 -{
  1.4019 -	FloatImageObj *fio=xelection.getFloatImage();
  1.4020 -	if (fio)
  1.4021 -	{
  1.4022 -		QFileDialog *fd=new QFileDialog( this);
  1.4023 -		fd->setFilters (imageIO.getFilters());
  1.4024 -		fd->setCaption(vymName+" - " +tr("Save image"));
  1.4025 -		fd->setFileMode( QFileDialog::AnyFile );
  1.4026 -		fd->setDirectory (lastImageDir);
  1.4027 -//		fd->setSelection (fio->getOriginalFilename());
  1.4028 -		fd->show();
  1.4029 -
  1.4030 -		QString fn;
  1.4031 -		if ( fd->exec() == QDialog::Accepted && fd->selectedFiles().count()==1)
  1.4032 -		{
  1.4033 -			fn=fd->selectedFiles().at(0);
  1.4034 -			if (QFile (fn).exists() )
  1.4035 -			{
  1.4036 -				QMessageBox mb( vymName,
  1.4037 -					tr("The file %1 exists already.\n"
  1.4038 -					"Do you want to overwrite it?").arg(fn),
  1.4039 -				QMessageBox::Warning,
  1.4040 -				QMessageBox::Yes | QMessageBox::Default,
  1.4041 -				QMessageBox::Cancel | QMessageBox::Escape,
  1.4042 -				QMessageBox::NoButton );
  1.4043 -
  1.4044 -				mb.setButtonText( QMessageBox::Yes, tr("Overwrite") );
  1.4045 -				mb.setButtonText( QMessageBox::No, tr("Cancel"));
  1.4046 -				switch( mb.exec() ) 
  1.4047 -				{
  1.4048 -					case QMessageBox::Yes:
  1.4049 -						// save 
  1.4050 -						break;
  1.4051 -					case QMessageBox::Cancel:
  1.4052 -						// do nothing
  1.4053 -						delete (fd);
  1.4054 -						return;
  1.4055 -						break;
  1.4056 -				}
  1.4057 -			}
  1.4058 -			saveFloatImageInt (fio,fd->selectedFilter(),fn );
  1.4059 -		}
  1.4060 -		delete (fd);
  1.4061 -	}
  1.4062 -}
  1.4063 -
  1.4064 -void MapEditor::setFrameType(const FrameObj::FrameType &t)
  1.4065 -{
  1.4066 -	BranchObj *bo=xelection.getBranch();
  1.4067 -	if (bo)
  1.4068 -	{
  1.4069 -		QString s=bo->getFrameTypeName();
  1.4070 -		bo->setFrameType (t);
  1.4071 -		saveState (bo, QString("setFrameType (\"%1\")").arg(s),
  1.4072 -			bo, QString ("setFrameType (\"%1\")").arg(bo->getFrameTypeName()),QString ("set type of frame to %1").arg(s));
  1.4073 -		model->reposition();
  1.4074 -		bo->updateLink();
  1.4075 -	}
  1.4076 -}
  1.4077 -
  1.4078 -void MapEditor::setFrameType(const QString &s)	
  1.4079 -{
  1.4080 -	BranchObj *bo=xelection.getBranch();
  1.4081 -	if (bo)
  1.4082 -	{
  1.4083 -		saveState (bo, QString("setFrameType (\"%1\")").arg(bo->getFrameTypeName()),
  1.4084 -			bo, QString ("setFrameType (\"%1\")").arg(s),QString ("set type of frame to %1").arg(s));
  1.4085 -		bo->setFrameType (s);
  1.4086 -		model->reposition();
  1.4087 -		bo->updateLink();
  1.4088 -	}
  1.4089 -}
  1.4090 -
  1.4091 -void MapEditor::setFramePenColor(const QColor &c)	
  1.4092 -{
  1.4093 -	BranchObj *bo=xelection.getBranch();
  1.4094 -	if (bo)
  1.4095 -	{
  1.4096 -		saveState (bo, QString("setFramePenColor (\"%1\")").arg(bo->getFramePenColor().name() ),
  1.4097 -			bo, QString ("setFramePenColor (\"%1\")").arg(c.name() ),QString ("set pen color of frame to %1").arg(c.name() ));
  1.4098 -		bo->setFramePenColor (c);
  1.4099 -	}	
  1.4100 -}
  1.4101 -
  1.4102 -void MapEditor::setFrameBrushColor(const QColor &c)	
  1.4103 -{
  1.4104 -	BranchObj *bo=xelection.getBranch();
  1.4105 -	if (bo)
  1.4106 -	{
  1.4107 -		saveState (bo, QString("setFrameBrushColor (\"%1\")").arg(bo->getFrameBrushColor().name() ),
  1.4108 -			bo, QString ("setFrameBrushColor (\"%1\")").arg(c.name() ),QString ("set brush color of frame to %1").arg(c.name() ));
  1.4109 -		bo->setFrameBrushColor (c);
  1.4110 -	}	
  1.4111 -}
  1.4112 -
  1.4113 -void MapEditor::setFramePadding (const int &i)
  1.4114 -{
  1.4115 -	BranchObj *bo=xelection.getBranch();
  1.4116 -	if (bo)
  1.4117 -	{
  1.4118 -		saveState (bo, QString("setFramePadding (\"%1\")").arg(bo->getFramePadding() ),
  1.4119 -			bo, QString ("setFramePadding (\"%1\")").arg(i),QString ("set brush color of frame to %1").arg(i));
  1.4120 -		bo->setFramePadding (i);
  1.4121 -		model->reposition();
  1.4122 -		bo->updateLink();
  1.4123 -	}	
  1.4124 -}
  1.4125 -
  1.4126 -void MapEditor::setFrameBorderWidth(const int &i)
  1.4127 -{
  1.4128 -	BranchObj *bo=xelection.getBranch();
  1.4129 -	if (bo)
  1.4130 -	{
  1.4131 -		saveState (bo, QString("setFrameBorderWidth (\"%1\")").arg(bo->getFrameBorderWidth() ),
  1.4132 -			bo, QString ("setFrameBorderWidth (\"%1\")").arg(i),QString ("set border width of frame to %1").arg(i));
  1.4133 -		bo->setFrameBorderWidth (i);
  1.4134 -		model->reposition();
  1.4135 -		bo->updateLink();
  1.4136 -	}	
  1.4137 -}
  1.4138 -
  1.4139 -void MapEditor::setIncludeImagesVer(bool b)	
  1.4140 -{
  1.4141 -	BranchObj *bo=xelection.getBranch();
  1.4142 -	if (bo)
  1.4143 -	{
  1.4144 -		QString u= b ? "false" : "true";
  1.4145 -		QString r=!b ? "false" : "true";
  1.4146 -		
  1.4147 -		saveState(
  1.4148 -			bo,
  1.4149 -			QString("setIncludeImagesVertically (%1)").arg(u),
  1.4150 -			bo, 
  1.4151 -			QString("setIncludeImagesVertically (%1)").arg(r),
  1.4152 -			QString("Include images vertically in %1").arg(getName(bo))
  1.4153 -		);	
  1.4154 -		bo->setIncludeImagesVer(b);
  1.4155 -		model->reposition();
  1.4156 -	}	
  1.4157 -}
  1.4158 -
  1.4159 -void MapEditor::setIncludeImagesHor(bool b)	
  1.4160 -{
  1.4161 -	BranchObj *bo=xelection.getBranch();
  1.4162 -	if (bo)
  1.4163 -	{
  1.4164 -		QString u= b ? "false" : "true";
  1.4165 -		QString r=!b ? "false" : "true";
  1.4166 -		
  1.4167 -		saveState(
  1.4168 -			bo,
  1.4169 -			QString("setIncludeImagesHorizontally (%1)").arg(u),
  1.4170 -			bo, 
  1.4171 -			QString("setIncludeImagesHorizontally (%1)").arg(r),
  1.4172 -			QString("Include images horizontally in %1").arg(getName(bo))
  1.4173 -		);	
  1.4174 -		bo->setIncludeImagesHor(b);
  1.4175 -		model->reposition();
  1.4176 -	}	
  1.4177 -}
  1.4178 -
  1.4179 -void MapEditor::setHideLinkUnselected (bool b)
  1.4180 -{
  1.4181 -	LinkableMapObj *sel=xelection.single();
  1.4182 -	if (sel &&
  1.4183 -		(xelection.type() == Selection::Branch || 
  1.4184 -		xelection.type() == Selection::MapCenter  ||
  1.4185 -		xelection.type() == Selection::FloatImage ))
  1.4186 -	{
  1.4187 -		QString u= b ? "false" : "true";
  1.4188 -		QString r=!b ? "false" : "true";
  1.4189 -		
  1.4190 -		saveState(
  1.4191 -			sel,
  1.4192 -			QString("setHideLinkUnselected (%1)").arg(u),
  1.4193 -			sel, 
  1.4194 -			QString("setHideLinkUnselected (%1)").arg(r),
  1.4195 -			QString("Hide link of %1 if unselected").arg(getName(sel))
  1.4196 -		);	
  1.4197 -		sel->setHideLinkUnselected(b);
  1.4198 -	}
  1.4199 -}
  1.4200 -
  1.4201 -void MapEditor::importDirInt(BranchObj *dst, QDir d)
  1.4202 -{
  1.4203 -	BranchObj *bo=xelection.getBranch();
  1.4204 -	if (bo)
  1.4205 -	{
  1.4206 -		// Traverse directories
  1.4207 -		d.setFilter( QDir::Dirs| QDir::Hidden | QDir::NoSymLinks );
  1.4208 -		QFileInfoList list = d.entryInfoList();
  1.4209 -		QFileInfo fi;
  1.4210 -
  1.4211 -		for (int i = 0; i < list.size(); ++i) 
  1.4212 -		{
  1.4213 -			fi=list.at(i);
  1.4214 -			if (fi.fileName() != "." && fi.fileName() != ".." )
  1.4215 -			{
  1.4216 -				dst->addBranch();
  1.4217 -				bo=dst->getLastBranch();
  1.4218 -				bo->setHeading (fi.fileName() );
  1.4219 -				bo->setColor (QColor("blue"));
  1.4220 -				bo->toggleScroll();
  1.4221 -				if ( !d.cd(fi.fileName()) ) 
  1.4222 -					QMessageBox::critical (0,tr("Critical Import Error"),tr("Cannot find the directory %1").arg(fi.fileName()));
  1.4223 -				else 
  1.4224 -				{
  1.4225 -					// Recursively add subdirs
  1.4226 -					importDirInt (bo,d);
  1.4227 -					d.cdUp();
  1.4228 -				}
  1.4229 -			}	
  1.4230 -		}		
  1.4231 -		// Traverse files
  1.4232 -		d.setFilter( QDir::Files| QDir::Hidden | QDir::NoSymLinks );
  1.4233 -		list = d.entryInfoList();
  1.4234 -
  1.4235 -		for (int i = 0; i < list.size(); ++i) 
  1.4236 -		{
  1.4237 -			fi=list.at(i);
  1.4238 -			dst->addBranch();
  1.4239 -			bo=dst->getLastBranch();
  1.4240 -			bo->setHeading (fi.fileName() );
  1.4241 -			bo->setColor (QColor("black"));
  1.4242 -			if (fi.fileName().right(4) == ".vym" )
  1.4243 -				bo->setVymLink (fi.filePath());
  1.4244 -		}	
  1.4245 -	}		
  1.4246 -}
  1.4247 -
  1.4248 -void MapEditor::importDirInt (const QString &s)
  1.4249 -{
  1.4250 -	BranchObj *bo=xelection.getBranch();
  1.4251 -	if (bo)
  1.4252 -	{
  1.4253 -		saveStateChangingPart (bo,bo,QString ("importDir (\"%1\")").arg(s),QString("Import directory structure from %1").arg(s));
  1.4254 -
  1.4255 -		QDir d(s);
  1.4256 -		importDirInt (bo,d);
  1.4257 -	}
  1.4258 -}	
  1.4259 -
  1.4260 -void MapEditor::importDir()
  1.4261 -{
  1.4262 -	BranchObj *bo=xelection.getBranch();
  1.4263 -	if (bo)
  1.4264 -	{
  1.4265 -		QStringList filters;
  1.4266 -		filters <<"VYM map (*.vym)";
  1.4267 -		QFileDialog *fd=new QFileDialog( this,vymName+ " - " +tr("Choose directory structure to import"));
  1.4268 -		fd->setMode (QFileDialog::DirectoryOnly);
  1.4269 -		fd->setFilters (filters);
  1.4270 -		fd->setCaption(vymName+" - " +tr("Choose directory structure to import"));
  1.4271 -		fd->show();
  1.4272 -
  1.4273 -		QString fn;
  1.4274 -		if ( fd->exec() == QDialog::Accepted )
  1.4275 -		{
  1.4276 -			importDirInt (fd->selectedFile() );
  1.4277 -			model->reposition();
  1.4278 -			scene()->update();
  1.4279 -		}
  1.4280 -	}	
  1.4281 -}
  1.4282 -
  1.4283 -void MapEditor::followXLink(int i)
  1.4284 -{
  1.4285 -	BranchObj *bo=xelection.getBranch();
  1.4286 -	if (bo)
  1.4287 -	{
  1.4288 -		bo=bo->XLinkTargetAt(i);
  1.4289 -		if (bo) 
  1.4290 -		{
  1.4291 -			xelection.select(bo);
  1.4292 -			ensureSelectionVisible();
  1.4293 -		}
  1.4294 -	}
  1.4295 -}
  1.4296 -
  1.4297 -void MapEditor::editXLink(int i)	// FIXME missing saveState
  1.4298 -{
  1.4299 -	BranchObj *bo=xelection.getBranch();
  1.4300 -	if (bo)
  1.4301 -	{
  1.4302 -		XLinkObj *xlo=bo->XLinkAt(i);
  1.4303 -		if (xlo) 
  1.4304 -		{
  1.4305 -			EditXLinkDialog dia;
  1.4306 -			dia.setXLink (xlo);
  1.4307 -			dia.setSelection(bo);
  1.4308 -			if (dia.exec() == QDialog::Accepted)
  1.4309 -			{
  1.4310 -				if (dia.useSettingsGlobal() )
  1.4311 -				{
  1.4312 -					setMapDefXLinkColor (xlo->getColor() );
  1.4313 -					setMapDefXLinkWidth (xlo->getWidth() );
  1.4314 -				}
  1.4315 -				if (dia.deleteXLink())
  1.4316 -					bo->deleteXLinkAt(i);
  1.4317 -			}
  1.4318 -		}	
  1.4319 -	}
  1.4320 +	model->updateSelection();
  1.4321  }
  1.4322  
  1.4323  AttributeTable* MapEditor::attributeTable()
  1.4324 @@ -4422,8 +287,9 @@
  1.4325  
  1.4326  void MapEditor::testFunction1()
  1.4327  {
  1.4328 -	BranchObj *bo=xelection.getBranch();
  1.4329 -	if (bo) model->moveAway (bo);
  1.4330 +	BranchObj *bo=model->getSelectedBranch();
  1.4331 +	//if (bo) model->moveAway (bo);
  1.4332 +	if (bo) bo->setLinkStyle (LinkableMapObj::Line);
  1.4333  	
  1.4334  /* TODO Hide hidden stuff temporary, maybe add this as regular function somewhere
  1.4335  	if (hidemode==HideNone)
  1.4336 @@ -4464,6 +330,42 @@
  1.4337  */		
  1.4338  }
  1.4339  
  1.4340 +void MapEditor::editHeading()
  1.4341 +{
  1.4342 +	if (editingHeading)
  1.4343 +	{
  1.4344 +		editHeadingFinished();
  1.4345 +		return;
  1.4346 +	}
  1.4347 +	BranchObj *bo=model->getSelectedBranch();
  1.4348 +	if (bo)
  1.4349 +	{
  1.4350 +		model->setSelectionBlocked(true);
  1.4351 +
  1.4352 +		lineEdit->setText (bo->getHeading());
  1.4353 +		QPoint p = mapTo (this,bo->getAbsPos().toPoint() );
  1.4354 +		lineEdit->setGeometry(p.x(),p.y(),230,25);
  1.4355 +		lineEdit->selectAll();
  1.4356 +		lineEdit->show();
  1.4357 +		lineEdit->setFocus();
  1.4358 +		lineEdit->grabKeyboard();
  1.4359 +		editingHeading=true;
  1.4360 +	}
  1.4361 +
  1.4362 +}
  1.4363 +void MapEditor::editHeadingFinished()
  1.4364 +{
  1.4365 +	editingHeading=false;
  1.4366 +	lineEdit->releaseKeyboard();
  1.4367 +	model->setHeading (lineEdit->text() );
  1.4368 +	model->setSelectionBlocked(false);
  1.4369 +	lineEdit->hide();
  1.4370 +
  1.4371 +	// Maybe reselect previous branch 
  1.4372 +	mainWindow->editHeadingFinished (model);
  1.4373 +}
  1.4374 +
  1.4375 +
  1.4376  void MapEditor::contextMenuEvent ( QContextMenuEvent * e )
  1.4377  {
  1.4378  	// Lineedits are already closed by preceding
  1.4379 @@ -4474,30 +376,30 @@
  1.4380  	
  1.4381      if (lmo) 
  1.4382  	{	// MapObj was found
  1.4383 -		if (xelection.single() != lmo)
  1.4384 +		if (model->getSelection() != lmo)
  1.4385  		{
  1.4386  			// select the MapObj
  1.4387 -			xelection.select(lmo);
  1.4388 +			model->select(lmo);
  1.4389  		}
  1.4390  		// Context Menu 
  1.4391 -		if (xelection.getBranch() ) 
  1.4392 +		if (model->getSelectedBranch() ) 
  1.4393  		{
  1.4394  			// Context Menu on branch or mapcenter
  1.4395 -			updateActions();
  1.4396 +			model->updateActions();
  1.4397  			branchContextMenu->popup(e->globalPos() );
  1.4398  		} else
  1.4399  		{
  1.4400 -			if (xelection.getFloatImage() )
  1.4401 +			if (model->getSelectedFloatImage() )
  1.4402  			{
  1.4403  				// Context Menu on floatimage
  1.4404 -				updateActions();
  1.4405 +				model->updateActions();
  1.4406  				floatimageContextMenu->popup(e->globalPos() );
  1.4407  			}	
  1.4408  		}	
  1.4409  	} else 
  1.4410  	{ // No MapObj found, we are on the Canvas itself
  1.4411  		// Context Menu on scene
  1.4412 -		updateActions();
  1.4413 +		model->updateActions();
  1.4414  		contextMenuPos=p;
  1.4415  		canvasContextMenu->popup(e->globalPos() );
  1.4416      } 
  1.4417 @@ -4542,7 +444,7 @@
  1.4418  	}
  1.4419  
  1.4420  	//Ignore clicks while editing heading
  1.4421 -	if (isSelectBlocked() ) 
  1.4422 +	if (model->isSelectionBlocked() ) 
  1.4423  	{
  1.4424  		e->ignore();
  1.4425  		return;
  1.4426 @@ -4562,7 +464,7 @@
  1.4427  		if (!foname.isEmpty())
  1.4428  		{
  1.4429  			// systemFlag clicked
  1.4430 -			selectInt (lmo);
  1.4431 +			model->selectInt (lmo);
  1.4432  			if (foname=="url") 
  1.4433  			{
  1.4434  				if (e->state() & Qt::ControlModifier)
  1.4435 @@ -4578,12 +480,11 @@
  1.4436  			} else if (foname=="note")
  1.4437  				mainWindow->windowToggleNoteEditor();
  1.4438  			else if (foname=="hideInExport")		
  1.4439 -				toggleHideExport();
  1.4440 -			xelection.update();	
  1.4441 +				model->toggleHideExport();
  1.4442 +			// FIXME needed? xelection.update();	
  1.4443  			return;	
  1.4444  		} 
  1.4445 -	} 
  1.4446 -
  1.4447 +	}	
  1.4448  	// No system flag clicked, take care of modmodes (CTRL-Click)
  1.4449  	if (e->state() & Qt::ControlModifier)
  1.4450  	{
  1.4451 @@ -4599,8 +500,7 @@
  1.4452  			if (lmo)
  1.4453  				bo_begin=(BranchObj*)(lmo);
  1.4454  			else	
  1.4455 -				if (xelection.getBranch() ) 
  1.4456 -					bo_begin=xelection.getBranch();
  1.4457 +				bo_begin=model->getSelectedBranch();
  1.4458  			if (bo_begin)	
  1.4459  			{
  1.4460  				drawingLink=true;
  1.4461 @@ -4608,8 +508,8 @@
  1.4462  				tmpXLink=new XLinkObj (mapScene);
  1.4463  				tmpXLink->setBegin (bo_begin);
  1.4464  				tmpXLink->setEnd   (p);
  1.4465 -				tmpXLink->setColor(defXLinkColor);
  1.4466 -				tmpXLink->setWidth(defXLinkWidth);
  1.4467 +				tmpXLink->setColor(model->getMapDefXLinkColor());
  1.4468 +				tmpXLink->setWidth(model->getMapDefXLinkWidth());
  1.4469  				tmpXLink->updateXLink();
  1.4470  				tmpXLink->setVisibility (true);
  1.4471  				return;
  1.4472 @@ -4620,7 +520,7 @@
  1.4473      if (lmo) 
  1.4474  	{	
  1.4475  		// Select the clicked object
  1.4476 -		selectInt (lmo);
  1.4477 +		model->selectInt (lmo);
  1.4478  
  1.4479  		// Left Button	    Move Branches
  1.4480  		if (e->button() == Qt::LeftButton )
  1.4481 @@ -4631,6 +531,7 @@
  1.4482  			movingObj_start.setY( p.y() - lmo->y() );	
  1.4483  			movingObj_orgPos.setX (lmo->x() );
  1.4484  			movingObj_orgPos.setY (lmo->y() );
  1.4485 +			lmo->setRelPos();
  1.4486  			movingObj_orgRelPos=lmo->getRelPos();
  1.4487  
  1.4488  			// If modMode==copy, then we want to "move" the _new_ object around
  1.4489 @@ -4638,26 +539,26 @@
  1.4490  			if (mainWindow->getModMode()==Main::ModModeCopy &&
  1.4491  				e->state() & Qt::ControlModifier)
  1.4492  			{
  1.4493 -				BranchObj *bo=xelection.getBranch();
  1.4494 +				BranchObj *bo=model->getSelectedBranch();
  1.4495  				if (bo)
  1.4496  				{
  1.4497  					copyingObj=true;
  1.4498 -					bo->addBranch ((BranchObj*)xelection.single());
  1.4499 -					unselect();
  1.4500 -					xelection.select(bo->getLastBranch());
  1.4501 +					bo->addBranch ((BranchObj*)model->getSelection());
  1.4502 +					model->unselect();
  1.4503 +					model->select(bo->getLastBranch());
  1.4504  					model->reposition();
  1.4505  				}
  1.4506  			} 
  1.4507  
  1.4508 -			movingObj=xelection.single();	
  1.4509 +			movingObj=model->getSelection();	
  1.4510  		} else
  1.4511  			// Middle Button    Toggle Scroll
  1.4512  			// (On Mac OS X this won't work, but we still have 
  1.4513  			// a button in the toolbar)
  1.4514  			if (e->button() == Qt::MidButton )
  1.4515 -				toggleScroll();
  1.4516 -		updateActions();
  1.4517 -		xelection.update();
  1.4518 +				model->toggleScroll();
  1.4519 +		model->updateActions();
  1.4520 +		// FIXME needed? xelection.update();
  1.4521  	} else 
  1.4522  	{ // No MapObj found, we are on the scene itself
  1.4523  		// Left Button	    move Pos of sceneView
  1.4524 @@ -4677,7 +578,7 @@
  1.4525  void MapEditor::mouseMoveEvent(QMouseEvent* e)
  1.4526  {
  1.4527      QPointF p = mapToScene(e->pos());
  1.4528 -	LinkableMapObj *lmosel=xelection.single();
  1.4529 +	LinkableMapObj *lmosel=model->getSelection();
  1.4530  
  1.4531      // Move the selected MapObj
  1.4532      if ( lmosel && movingObj) 
  1.4533 @@ -4689,7 +590,7 @@
  1.4534  		// To avoid jumping of the sceneView, only 
  1.4535  		// ensureSelectionVisible, if not tmp linked
  1.4536  		if (!lmosel->hasParObjTmp())
  1.4537 -			ensureSelectionVisible ();
  1.4538 +			model->ensureSelectionVisible ();
  1.4539  		
  1.4540  		// Now move the selection, but add relative position 
  1.4541  		// (movingObj_start) where selection was chosen with 
  1.4542 @@ -4700,13 +601,13 @@
  1.4543  		LinkableMapObj* lmo=model->findMapObj(p, lmosel);
  1.4544  		
  1.4545  
  1.4546 -		FloatObj *fio=xelection.getFloatImage();
  1.4547 +		FloatObj *fio=model->getSelectedFloatImage();
  1.4548  		if (fio)
  1.4549  		{
  1.4550  			fio->move   (p.x() -movingObj_start.x(), p.y()-movingObj_start.y() );		
  1.4551  			fio->setRelPos();
  1.4552  			fio->updateLink(); //no need for reposition, if we update link here
  1.4553 -			xelection.update();
  1.4554 +			model->updateSelection();
  1.4555  
  1.4556  			// Relink float to new mapcenter or branch, if shift is pressed	
  1.4557  			// Only relink, if selection really has a new parent
  1.4558 @@ -4724,7 +625,7 @@
  1.4559  					// Also save the move which was done so far
  1.4560  					QString pold=qpointfToString(movingObj_orgRelPos);
  1.4561  					QString pnow=qpointfToString(fio->getRelPos());
  1.4562 -					saveState(
  1.4563 +					model->saveState(
  1.4564  						fio,
  1.4565  						"moveRel "+pold,
  1.4566  						fio,
  1.4567 @@ -4733,7 +634,7 @@
  1.4568  					fio->getParObj()->requestReposition();
  1.4569  					model->reposition();
  1.4570  
  1.4571 -					linkTo (model->getSelectString(lmo));
  1.4572 +					model->linkFloatImageTo (model->getSelectString(lmo));
  1.4573  					//movingObj=lmosel;
  1.4574  					//movingObj_orgRelPos=lmosel->getRelPos();	
  1.4575  
  1.4576 @@ -4762,14 +663,15 @@
  1.4577  					// Move ordinary branch
  1.4578  					if (lmosel->getOrientation() == LinkableMapObj::LeftOfCenter)
  1.4579  						// Add width of bbox here, otherwise alignRelTo will cause jumping around
  1.4580 -						lmosel->move(p.x() -movingObj_start.x()+lmosel->getBBox().width(), 
  1.4581 +						lmosel->move(p.x() -movingObj_start.x() , //lmosel->getBBox().width(), 
  1.4582  							p.y()-movingObj_start.y() +lmosel->getTopPad() );		
  1.4583  					else	
  1.4584  						lmosel->move(p.x() -movingObj_start.x(), p.y()-movingObj_start.y() -lmosel->getTopPad());
  1.4585 +					lmosel->setRelPos();	
  1.4586  				} 
  1.4587  
  1.4588  				// Maybe we can relink temporary?
  1.4589 -				if (lmo && (lmo!=lmosel) && xelection.getBranch() && 
  1.4590 +				if (lmo && (lmo!=lmosel) && model->getSelectedBranch() && 
  1.4591  					 (typeid(*lmo)==typeid(BranchObj) ||
  1.4592  					  typeid(*lmo)==typeid(MapCenterObj)) ) 
  1.4593  
  1.4594 @@ -4791,7 +693,7 @@
  1.4595  				lmosel->reposition();	
  1.4596  			} // depth>0
  1.4597  
  1.4598 -			xelection.update();
  1.4599 +			model->updateSelection();// FIXME needed? 
  1.4600  		} // no FloatImageObj
  1.4601  
  1.4602  		scene()->update();
  1.4603 @@ -4821,7 +723,7 @@
  1.4604  {
  1.4605      QPointF p = mapToScene(e->pos());
  1.4606  	LinkableMapObj *dst;
  1.4607 -	LinkableMapObj *lmosel=xelection.single();
  1.4608 +	LinkableMapObj *lmosel=model->getSelection();
  1.4609  	// Have we been picking color?
  1.4610  	if (pickingColor)
  1.4611  	{
  1.4612 @@ -4832,9 +734,9 @@
  1.4613  		if (dst && lmosel) 
  1.4614  		{	
  1.4615  			if (e->state() & Qt::ShiftModifier)
  1.4616 -				colorBranch (((BranchObj*)dst)->getColor());
  1.4617 +				model->colorBranch (((BranchObj*)dst)->getColor());
  1.4618  			else	
  1.4619 -				colorSubtree (((BranchObj*)dst)->getColor());
  1.4620 +				model->colorSubtree (((BranchObj*)dst)->getColor());
  1.4621  		} 
  1.4622  		return;
  1.4623  	}
  1.4624 @@ -4850,7 +752,7 @@
  1.4625  			tmpXLink->setEnd ( ((BranchObj*)(dst)) );
  1.4626  			tmpXLink->updateXLink();
  1.4627  			tmpXLink->activate(); //FIXME savestate missing
  1.4628 -			//saveStateComplete(QString("Activate xLink from %1 to %2").arg(getName(tmpXLink->getBegin())).arg(getName(tmpXLink->getEnd())) );	
  1.4629 +			//model->saveStateComplete(QString("Activate xLink from %1 to %2").arg(getName(tmpXLink->getBegin())).arg(getName(tmpXLink->getEnd())) );	
  1.4630  		} else
  1.4631  		{
  1.4632  			delete(tmpXLink);
  1.4633 @@ -4862,13 +764,13 @@
  1.4634      // Have we been moving something?
  1.4635      if ( lmosel && movingObj ) 
  1.4636      {	
  1.4637 -		FloatImageObj *fo=xelection.getFloatImage();
  1.4638 +		FloatImageObj *fo=model->getSelectedFloatImage();
  1.4639  		if(fo)
  1.4640  		{
  1.4641  			// Moved FloatObj. Maybe we need to reposition
  1.4642  		    QString pold=qpointfToString(movingObj_orgRelPos);
  1.4643  		    QString pnow=qpointfToString(fo->getRelPos());
  1.4644 -			saveState(
  1.4645 +			model->saveState(
  1.4646  				fo,
  1.4647  				"moveRel "+pold,
  1.4648  				fo,
  1.4649 @@ -4886,14 +788,14 @@
  1.4650  		if (dst && (typeid(*dst)!=typeid(BranchObj) && typeid(*dst)!=typeid(MapCenterObj))) 
  1.4651  			dst=NULL;
  1.4652  		
  1.4653 -		BranchObj *bo=xelection.getBranch();
  1.4654 +		BranchObj *bo=model->getSelectedBranch();
  1.4655  		if (bo && bo->getDepth()==0)
  1.4656  		{	
  1.4657              if (movingObj_orgPos != bo->getAbsPos())
  1.4658              {
  1.4659                  QString pold=qpointfToString(movingObj_orgPos);
  1.4660                  QString pnow=qpointfToString(bo->getAbsPos());
  1.4661 -                saveState(
  1.4662 +                model->saveState(
  1.4663                      fo,
  1.4664                      "move "+pold,
  1.4665                      fo,
  1.4666 @@ -4902,7 +804,7 @@
  1.4667              }
  1.4668  		}
  1.4669  	
  1.4670 -		if (xelection.type() == Selection::Branch )
  1.4671 +		if (model->selectionType() == Selection::Branch )
  1.4672  		{	// A branch was moved
  1.4673  			
  1.4674  			// save the position in case we link to mapcenter
  1.4675 @@ -4919,7 +821,7 @@
  1.4676  			{
  1.4677  				// We have a destination, relink to that
  1.4678  
  1.4679 -				BranchObj* bsel=xelection.getBranch();
  1.4680 +				BranchObj* bsel=model->getSelectedBranch();
  1.4681  				BranchObj* bdst=(BranchObj*)dst;
  1.4682  
  1.4683  				QString preParStr=model->getSelectString (bsel->getParObj());
  1.4684 @@ -4953,7 +855,7 @@
  1.4685  					preDstParStr + "\"," + postNum + "," +
  1.4686  					QString ("%1,%2").arg(savePos.x()).arg(savePos.y())+ ")";
  1.4687  
  1.4688 -				saveState (
  1.4689 +				model->saveState (
  1.4690  					postSelStr,undoCom,
  1.4691  					preSelStr, redoCom,
  1.4692  					QString("Relink %1 to %2").arg(getName(bsel)).arg(getName(dst)) );
  1.4693 @@ -4973,7 +875,7 @@
  1.4694                      if (rp != movingObj_orgRelPos)
  1.4695                      {
  1.4696                          QString ps=qpointfToString(rp);
  1.4697 -                        saveState(
  1.4698 +                        model->saveState(
  1.4699                              model->getSelectString(lmosel), "moveRel "+qpointfToString(movingObj_orgRelPos), 
  1.4700                              preSelStr, "moveRel "+ps, 
  1.4701                              QString("Move %1 to relative position %2").arg(getName(lmosel)).arg(ps));
  1.4702 @@ -4983,23 +885,26 @@
  1.4703  				// Draw the original link, before selection was moved around
  1.4704  				if (settings.value("/animation/use",false).toBool() && lmosel->getDepth()>1) 
  1.4705  				{
  1.4706 -					QPointF p=bo->getParObj()->getChildPos();
  1.4707 -					lmosel->setRelPos();	// calc relPos first
  1.4708 +					lmosel->setRelPos();	// calc relPos first for starting point
  1.4709 +					QPointF dst=bo->getParObj()->getChildPos();
  1.4710 +			//		if (lmosel->getOrientation()==LinkableMapObj::LeftOfCenter) dst.setX (dst.x()+lmosel->width() );
  1.4711 +					
  1.4712  					model->startAnimation(
  1.4713  						lmosel->getRelPos(),
  1.4714 -						QPointF (movingObj_orgPos.x() - p.x(), movingObj_orgPos.y() - p.y() )
  1.4715 +						movingObj_orgRelPos
  1.4716 +//						QPointF (movingObj_orgPos.x() - dst.x(), movingObj_orgPos.y() - dst.y() )
  1.4717  					);	
  1.4718  				} else	
  1.4719  					model->reposition();
  1.4720  			}
  1.4721  		}
  1.4722 -		 xelection.update();
  1.4723 +		 model->updateSelection();
  1.4724  		// Finally resize scene, if needed
  1.4725  		scene()->update();
  1.4726  		movingObj=NULL;		
  1.4727  
  1.4728  		// Just make sure, that actions are still ok,e.g. the move branch up/down buttons...
  1.4729 -		updateActions();
  1.4730 +		model->updateActions();
  1.4731  	} else 
  1.4732  		// maybe we moved View: set old cursor
  1.4733  		setCursor (Qt::ArrowCursor);
  1.4734 @@ -5008,7 +913,7 @@
  1.4735  
  1.4736  void MapEditor::mouseDoubleClickEvent(QMouseEvent* e)
  1.4737  {
  1.4738 -	if (isSelectBlocked() ) 
  1.4739 +	if (model->isSelectionBlocked() ) 
  1.4740  	{
  1.4741  		e->ignore();
  1.4742  		return;
  1.4743 @@ -5020,8 +925,8 @@
  1.4744  		LinkableMapObj *lmo=model->findMapObj(p, NULL);
  1.4745  		if (lmo) {	// MapObj was found
  1.4746  			// First select the MapObj than edit heading
  1.4747 -			xelection.select(lmo);
  1.4748 -			mainWindow->editHeading();
  1.4749 +			model->select (lmo);
  1.4750 +			editHeading();
  1.4751  		}
  1.4752  	}
  1.4753  }
  1.4754 @@ -5054,7 +959,7 @@
  1.4755  
  1.4756  void MapEditor::dropEvent(QDropEvent *event)
  1.4757  {
  1.4758 -	BranchObj *sel=xelection.getBranch();
  1.4759 +	BranchObj *sel=model->getSelectedBranch();
  1.4760  	if (sel)
  1.4761  	{
  1.4762  		if (debug)
  1.4763 @@ -5066,7 +971,7 @@
  1.4764  		if (event->mimeData()->hasImage()) 
  1.4765  		{
  1.4766  			 QVariant imageData = event->mimeData()->imageData();
  1.4767 -			 addFloatImageInt (qvariant_cast<QPixmap>(imageData));
  1.4768 +			 model->addFloatImage (qvariant_cast<QPixmap>(imageData));
  1.4769  		} else
  1.4770  		if (event->mimeData()->hasUrls())
  1.4771  			uris=event->mimeData()->urls();
  1.4772 @@ -5114,258 +1019,6 @@
  1.4773  }
  1.4774  
  1.4775  
  1.4776 -void MapEditor::sendSelection()
  1.4777 -{
  1.4778 -	if (netstate!=Server) return;
  1.4779 -	sendData (QString("select (\"%1\")").arg(xelection.getSelectString()) );
  1.4780 -}
  1.4781 -
  1.4782 -void MapEditor::newServer()
  1.4783 -{
  1.4784 -	port=54321;
  1.4785 -	sendCounter=0;
  1.4786 -    tcpServer = new QTcpServer(this);
  1.4787 -    if (!tcpServer->listen(QHostAddress::Any,port)) {
  1.4788 -        QMessageBox::critical(this, "vym server",
  1.4789 -                              QString("Unable to start the server: %1.").arg(tcpServer->errorString()));
  1.4790 -        close();
  1.4791 -        return;
  1.4792 -    }
  1.4793 -	connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newClient()));
  1.4794 -	netstate=Server;
  1.4795 -	cout<<"Server is running on port "<<tcpServer->serverPort()<<endl;
  1.4796 -}
  1.4797 -
  1.4798 -void MapEditor::connectToServer()
  1.4799 -{
  1.4800 -	port=54321;
  1.4801 -	server="salam.suse.de";
  1.4802 -	server="localhost";
  1.4803 -	clientSocket = new QTcpSocket (this);
  1.4804 -	clientSocket->abort();
  1.4805 -    clientSocket->connectToHost(server ,port);
  1.4806 -	connect(clientSocket, SIGNAL(readyRead()), this, SLOT(readData()));
  1.4807 -    connect(clientSocket, SIGNAL(error(QAbstractSocket::SocketError)),
  1.4808 -            this, SLOT(displayNetworkError(QAbstractSocket::SocketError)));
  1.4809 -	netstate=Client;		
  1.4810 -	cout<<"connected to "<<qPrintable (server)<<" port "<<port<<endl;
  1.4811 -
  1.4812 -	
  1.4813 -}
  1.4814 -
  1.4815 -void MapEditor::newClient()
  1.4816 -{
  1.4817 -    QTcpSocket *newClient = tcpServer->nextPendingConnection();
  1.4818 -    connect(newClient, SIGNAL(disconnected()),
  1.4819 -            newClient, SLOT(deleteLater()));
  1.4820 -
  1.4821 -	cout <<"ME::newClient  at "<<qPrintable( newClient->peerAddress().toString() )<<endl;
  1.4822 -
  1.4823 -	clientList.append (newClient);
  1.4824 -}
  1.4825 -
  1.4826 -
  1.4827 -void MapEditor::sendData(const QString &s)
  1.4828 -{
  1.4829 -	if (clientList.size()==0) return;
  1.4830 -
  1.4831 -	// Create bytearray to send
  1.4832 -	QByteArray block;
  1.4833 -    QDataStream out(&block, QIODevice::WriteOnly);
  1.4834 -    out.setVersion(QDataStream::Qt_4_0);
  1.4835 -
  1.4836 -	// Reserve some space for blocksize
  1.4837 -    out << (quint16)0;
  1.4838 -
  1.4839 -	// Write sendCounter
  1.4840 -    out << sendCounter++;
  1.4841 -
  1.4842 -	// Write data
  1.4843 -    out << s;
  1.4844 -
  1.4845 -	// Go back and write blocksize so far
  1.4846 -    out.device()->seek(0);
  1.4847 -    quint16 bs=(quint16)(block.size() - 2*sizeof(quint16));
  1.4848 -	out << bs;
  1.4849 -
  1.4850 -	if (debug)
  1.4851 -		cout << "ME::sendData  bs="<<bs<<"  counter="<<sendCounter<<"  s="<<qPrintable(s)<<endl;
  1.4852 -
  1.4853 -	for (int i=0; i<clientList.size(); ++i)
  1.4854 -	{
  1.4855 -		//cout << "Sending \""<<qPrintable (s)<<"\" to "<<qPrintable (clientList.at(i)->peerAddress().toString())<<endl;
  1.4856 -		clientList.at(i)->write (block);
  1.4857 -	}
  1.4858 -}
  1.4859 -
  1.4860 -void MapEditor::readData ()
  1.4861 -{
  1.4862 -	while (clientSocket->bytesAvailable() >=(int)sizeof(quint16) )
  1.4863 -	{
  1.4864 -		if (debug)
  1.4865 -			cout <<"readData  bytesAvail="<<clientSocket->bytesAvailable();
  1.4866 -		quint16 recCounter;
  1.4867 -		quint16 blockSize;
  1.4868 -
  1.4869 -		QDataStream in(clientSocket);
  1.4870 -		in.setVersion(QDataStream::Qt_4_0);
  1.4871 -
  1.4872 -		in >> blockSize;
  1.4873 -		in >> recCounter;
  1.4874 -		
  1.4875 -		QString t;
  1.4876 -		in >>t;
  1.4877 -		if (debug)
  1.4878 -			cout << "  t="<<qPrintable (t)<<endl;
  1.4879 -		parseAtom (t);
  1.4880 -	}
  1.4881 -	return;
  1.4882 -}
  1.4883 -
  1.4884 -void MapEditor::displayNetworkError(QAbstractSocket::SocketError socketError)
  1.4885 -{
  1.4886 -    switch (socketError) {
  1.4887 -    case QAbstractSocket::RemoteHostClosedError:
  1.4888 -        break;
  1.4889 -    case QAbstractSocket::HostNotFoundError:
  1.4890 -        QMessageBox::information(this, vymName +" Network client",
  1.4891 -                                 "The host was not found. Please check the "
  1.4892 -                                    "host name and port settings.");
  1.4893 -        break;
  1.4894 -    case QAbstractSocket::ConnectionRefusedError:
  1.4895 -        QMessageBox::information(this, vymName + " Network client",
  1.4896 -                                 "The connection was refused by the peer. "
  1.4897 -                                    "Make sure the fortune server is running, "
  1.4898 -                                    "and check that the host name and port "
  1.4899 -                                    "settings are correct.");
  1.4900 -        break;
  1.4901 -    default:
  1.4902 -        QMessageBox::information(this, vymName + " Network client",
  1.4903 -                                 QString("The following error occurred: %1.")
  1.4904 -                                 .arg(clientSocket->errorString()));
  1.4905 -    }
  1.4906 -}
  1.4907 -
  1.4908 -void MapEditor::autosave()
  1.4909 -{
  1.4910 -	QDateTime now=QDateTime().currentDateTime();
  1.4911 -	/* FIXME debug
  1.4912 -	cout << "ME::autosave checking "<<qPrintable(filePath)<<"...\n"; 
  1.4913 -	cout << "fsaved: "<<qPrintable (fileChangedTime.toString())<<endl;
  1.4914 -	cout << "  fnow: "<<qPrintable (QFileInfo(filePath).lastModified().toString())<<endl;
  1.4915 -	cout << "  time: "<<qPrintable (now.toString())<<endl;
  1.4916 -	cout << " zipped="<<zipped<<endl;
  1.4917 -	*/
  1.4918 -	// Disable autosave, while we have gone back in history
  1.4919 -	int redosAvail=undoSet.readNumEntry (QString("/history/redosAvail"));
  1.4920 -	if (redosAvail>0) return;
  1.4921 -
  1.4922 -	// Also disable autosave for new map without filename
  1.4923 -	if (filePath.isEmpty()) return;
  1.4924 -
  1.4925 -
  1.4926 -	if (mapUnsaved &&mapChanged && settings.value ("/mapeditor/autosave/use",true).toBool() )
  1.4927 -	{
  1.4928 -		if (QFileInfo(filePath).lastModified()<=fileChangedTime) 
  1.4929 -			mainWindow->fileSave (this);
  1.4930 -		else
  1.4931 -			if (debug)
  1.4932 -				cout <<"  ME::autosave  rejected, file on disk is newer than last save.\n"; 
  1.4933 -
  1.4934 -	}	
  1.4935 -}
  1.4936 -
  1.4937 -void MapEditor::fileChanged()
  1.4938 -{
  1.4939 -	// Check if file on disk has changed meanwhile
  1.4940 -	if (!filePath.isEmpty())
  1.4941 -	{
  1.4942 -		QDateTime tmod=QFileInfo (filePath).lastModified();
  1.4943 -		if (tmod>fileChangedTime)
  1.4944 -		{
  1.4945 -			
  1.4946 -			/* FIXME debug message, sometimes there's a glitch in the metrics...
  1.4947 -			cout << "ME::fileChanged()\n" 
  1.4948 -			     << "  last saved:     "<<qPrintable (fileChangedTime.toString())<<endl
  1.4949 -				 << "  last modififed: "<<qPrintable (tmod.toString())<<endl;
  1.4950 -			*/	 
  1.4951 -			// FIXME switch to current mapeditor and finish lineedits...
  1.4952 -			QMessageBox mb( vymName,
  1.4953 -				tr("The file of the map  on disk has changed:\n\n"  
  1.4954 -				   "   %1\n\nDo you want to reload that map with the new file?").arg(filePath),
  1.4955 -				QMessageBox::Question,
  1.4956 -				QMessageBox::Yes ,
  1.4957 -				QMessageBox::Cancel | QMessageBox::Default,
  1.4958 -				QMessageBox::NoButton );
  1.4959 -
  1.4960 -			mb.setButtonText( QMessageBox::Yes, tr("Reload"));
  1.4961 -			mb.setButtonText( QMessageBox::No, tr("Ignore"));
  1.4962 -			switch( mb.exec() ) 
  1.4963 -			{
  1.4964 -				case QMessageBox::Yes:
  1.4965 -					// Reload map
  1.4966 -					load (filePath,NewMap,fileType);
  1.4967 -		        case QMessageBox::Cancel:
  1.4968 -					fileChangedTime=tmod; // allow autosave to overwrite newer file!
  1.4969 -			}
  1.4970 -		}
  1.4971 -	}	
  1.4972 -
  1.4973 -}
  1.4974 -
  1.4975 -
  1.4976 -/*TODO not needed? void MapEditor::contentsDropEvent(QDropEvent *event) 
  1.4977 -{
  1.4978 -
  1.4979 -		} else if (event->provides("application/x-moz-file-promise-url") && 
  1.4980 -			 event->provides("application/x-moz-nativeimage")) 
  1.4981 -		{
  1.4982 -			// Contains url to the img src in unicode16
  1.4983 -			QByteArray d = event->encodedData("application/x-moz-file-promise-url");
  1.4984 -			QString url = QString((const QChar*)d.data(),d.size()/2);
  1.4985 -			fetchImage(url);
  1.4986 -			event->accept();
  1.4987 -			update=true;
  1.4988 -		} else if (event->provides ("text/uri-list"))
  1.4989 -		{	// Uris provided e.g. by konqueror
  1.4990 -			Q3UriDrag::decode (event,uris);
  1.4991 -		} else if (event->provides ("_NETSCAPE_URL"))
  1.4992 -		{	// Uris provided by Mozilla
  1.4993 -		  QStringList l = QStringList::split("\n", event->encodedData("_NETSCAPE_URL"));
  1.4994 -		  uris.append(l[0]);
  1.4995 -		  heading = l[1];
  1.4996 -		} else if (event->provides("text/html")) {
  1.4997 -
  1.4998 -		  // Handels text mime types
  1.4999 -		  // Look like firefox allways handle text as unicode16 (2 bytes per char.)
  1.5000 -		  QByteArray d = event->encodedData("text/html");
  1.5001 -		  QString text;
  1.5002 -		  if (isUnicode16(d)) 
  1.5003 -		    text = QString((const QChar*)d.data(),d.size()/2);
  1.5004 -		  else 
  1.5005 -		    text = QString(d);
  1.5006 -
  1.5007 -		  textEditor->setText(text);
  1.5008 -
  1.5009 -		  event->accept();
  1.5010 -		  update=true;
  1.5011 -		} else if (event->provides("text/plain")) {
  1.5012 -		  QByteArray d = event->encodedData("text/plain");
  1.5013 -		  QString text;
  1.5014 -		  if (isUnicode16(d))
  1.5015 -		    text = QString((const QChar*)d.data(),d.size()/2);
  1.5016 -		  else 
  1.5017 -		    text = QString(d);
  1.5018 -
  1.5019 -		  textEditor->setText(text);
  1.5020 -		  
  1.5021 -		  event->accept();
  1.5022 -		  update= true;
  1.5023 -		}
  1.5024 -
  1.5025 -		*/
  1.5026 -
  1.5027 -
  1.5028  
  1.5029  bool isUnicode16(const QByteArray &d) 
  1.5030  {
  1.5031 @@ -5377,66 +1030,7 @@
  1.5032    return false;
  1.5033  }
  1.5034        
  1.5035 -void MapEditor::addFloatImageInt (const QPixmap &img) 
  1.5036 -{
  1.5037 -	BranchObj *bo=xelection.getBranch();
  1.5038 -	if (bo)
  1.5039 -  {
  1.5040 -	FloatImageObj *fio=bo->addFloatImage();
  1.5041 -    fio->load(img);
  1.5042 -    fio->setOriginalFilename("No original filename (image added by dropevent)");	
  1.5043 -	QString s=model->getSelectString(bo);
  1.5044 -	saveState (PartOfMap, s, "nop ()", s, "copy ()","Copy dropped image to clipboard",fio  );
  1.5045 -	saveState (fio,"delete ()", bo,QString("paste(%1)").arg(curStep),"Pasting dropped image");
  1.5046 -    model->reposition();
  1.5047 -    scene()->update();
  1.5048 -  }
  1.5049 -}
  1.5050  
  1.5051 -/*
  1.5052 +// FIXME the following are not needed...
  1.5053 +QString MapEditor::getName(const LinkableMapObj*) {return QString();}
  1.5054  
  1.5055 -void MapEditor::imageDataFetched(const QByteArray &a, Q3NetworkOperation * / *nop* /) 
  1.5056 -{
  1.5057 -  if (!imageBuffer) imageBuffer = new QBuffer();
  1.5058 -  if (!imageBuffer->isOpen()) {
  1.5059 -    imageBuffer->open(QIODevice::WriteOnly | QIODevice::Append);
  1.5060 -  }
  1.5061 -  imageBuffer->at(imageBuffer->at()+imageBuffer->writeBlock(a));
  1.5062 -}
  1.5063 -
  1.5064 -
  1.5065 -void MapEditor::imageDataFinished(Q3NetworkOperation *nop) 
  1.5066 -{
  1.5067 -	if (nop->state()==Q3NetworkProtocol::StDone) {
  1.5068 -		QPixmap img(imageBuffer->buffer());
  1.5069 -		addFloatImageInt (img);
  1.5070 -	}
  1.5071 -
  1.5072 -	if (imageBuffer) {
  1.5073 -		imageBuffer->close();
  1.5074 -		if (imageBuffer) {
  1.5075 -			imageBuffer->close();
  1.5076 -			delete imageBuffer;
  1.5077 -			imageBuffer = 0;
  1.5078 -		}
  1.5079 -	}
  1.5080 -}
  1.5081 -
  1.5082 -void MapEditor::fetchImage(const QString &url) 
  1.5083 -{
  1.5084 -  if (urlOperator) {
  1.5085 -    urlOperator->stop();
  1.5086 -    disconnect(urlOperator);
  1.5087 -    delete urlOperator;
  1.5088 -  }
  1.5089 -  
  1.5090 -  urlOperator = new Q3UrlOperator(url);
  1.5091 -  connect(urlOperator, SIGNAL(finished(Q3NetworkOperation *)), 
  1.5092 -	  this, SLOT(imageDataFinished(Q3NetworkOperation*)));
  1.5093 -
  1.5094 -  connect(urlOperator, SIGNAL(data(const QByteArray &, Q3NetworkOperation *)),
  1.5095 -	  this, SLOT(imageDataFetched(const QByteArray &, Q3NetworkOperation *)));
  1.5096 -  urlOperator->get();
  1.5097 -}
  1.5098 -*/
  1.5099 -