branchobj.cpp
author insilmaril
Thu, 14 Sep 2006 11:38:17 +0000
changeset 387 a40af6315ac6
parent 382 8b0ab4c0f767
child 390 0e1aeb21cb78
permissions -rw-r--r--
1.8.57 - more changes in history window, Note Editor is QT4 now
     1 #include "branchobj.h"
     2 #include "texteditor.h"
     3 #include "mapeditor.h"
     4 #include "mainwindow.h"
     5 
     6 extern TextEditor *textEditor;
     7 extern Main *mainWindow;
     8 extern FlagRowObj *standardFlagsDefault;
     9 extern QAction *actionEditOpenURL;
    10 
    11 
    12 /////////////////////////////////////////////////////////////////
    13 // BranchObj
    14 /////////////////////////////////////////////////////////////////
    15 
    16 BranchObj* BranchObj::itLast=NULL;
    17 BranchObj* BranchObj::itFirst=NULL;
    18 
    19 
    20 BranchObj::BranchObj () :OrnamentedObj()
    21 {
    22 //    cout << "Const BranchObj ()\n";
    23     setParObj (this);	
    24     init();
    25     depth=-1;
    26 }
    27 
    28 BranchObj::BranchObj (Q3Canvas* c):OrnamentedObj (c)
    29 {
    30 //    cout << "Const BranchObj (c)  called from MapCenterObj (c)\n";
    31 	parObj=NULL;
    32     canvas=c;
    33 }
    34 
    35 BranchObj::BranchObj (Q3Canvas* c, LinkableMapObj* p):OrnamentedObj (c)
    36 {
    37 //    cout << "Const BranchObj (c,p)\n";
    38     canvas=c;
    39     setParObj (p);	
    40     depth=p->getDepth()+1;
    41 	if (depth==1)
    42 		// Calc angle to mapCenter if I am a mainbranch
    43 		// needed for reordering the mainbranches clockwise 
    44 		// around mapcenter 
    45 		angle=getAngle (QPoint ((int)(x() - parObj->getChildPos().x() ), 
    46 								(int)(y() - parObj->getChildPos().y() ) ) );
    47     init();
    48 }
    49 
    50 BranchObj::~BranchObj ()
    51 {
    52 //	cout << "Destr BranchObj of "<<this<<endl;
    53 	// Check, if this branch was the last child to be deleted
    54 	// If so, unset the scrolled flags
    55 
    56 	BranchObj *po=(BranchObj*)(parObj);
    57 	BranchObj *bo;
    58 	if (po)
    59 	{
    60 		bo=((BranchObj*)(parObj))->getLastBranch();
    61 		if (!bo) po->unScroll();
    62 	}
    63 	clear();
    64 }
    65 
    66 bool BranchObj::operator< ( const BranchObj & other )
    67 {
    68     return  angle < other.angle;
    69 }
    70 
    71 bool BranchObj::operator== ( const BranchObj & other )
    72 {
    73     return angle == other.angle;
    74 }
    75 
    76 int BranchObjPtrList::compareItems ( Q3PtrCollection::Item i, Q3PtrCollection::Item j)
    77 {
    78 	// Make sure PtrList::find works
    79 	if (i==j) return 0;
    80 
    81 	if ( ((BranchObj*)(i))->angle > ((BranchObj*)(j))->angle )
    82 		return 1;
    83 	else
    84 		return -1;
    85 }
    86 
    87 void BranchObj::init () 
    88 {
    89     branch.setAutoDelete (false);
    90     floatimage.setAutoDelete (true);
    91     xlink.setAutoDelete (false);
    92 
    93 	if (parObj)
    94 	{
    95 		absPos=getRandPos();
    96 		absPos+=parObj->getChildPos();
    97 	}
    98 
    99     lastSelectedBranch=-1;
   100 
   101     setChildObj(this);
   102 
   103 	scrolled=false;
   104 	tmpUnscrolled=false;
   105 
   106 	includeImagesVer=false;
   107 	includeImagesHor=false;
   108 }
   109 
   110 void BranchObj::copy (BranchObj* other)
   111 {
   112     OrnamentedObj::copy(other);
   113 
   114 	branch.clear();
   115     BranchObj* b;
   116     for (b=other->branch.first(); b;b=other->branch.next() ) 
   117 		// Make deep copy of b
   118 		// Because addBranch again calls copy for the childs,
   119 		// Those will get a deep copy, too
   120 		addBranch(b);	
   121 
   122 	FloatImageObj *fi;
   123 	for (fi=other->floatimage.first(); fi;fi=other->floatimage.next() )
   124 		addFloatImage (fi);
   125 
   126 	scrolled=other->scrolled;
   127 	tmpUnscrolled=other->tmpUnscrolled;
   128 	setVisibility (other->visible);
   129 
   130 	angle=other->angle;
   131 
   132     positionBBox();
   133 }
   134 
   135 void BranchObj::clear() 
   136 {
   137 	floatimage.clear();
   138 	while (!xlink.isEmpty())
   139 		deleteXLink (xlink.first() );
   140 
   141 	BranchObj *bo;
   142 	while (!branch.isEmpty())
   143 	{
   144 		bo=branch.first();
   145 		branch.removeFirst();
   146 		delete (bo);
   147 	}
   148 }
   149 
   150 int BranchObj::getNum()
   151 {
   152 	if (parObj)
   153 		return ((BranchObj*)parObj)->getNum (this);
   154 	else
   155 		return 0;
   156 }
   157 
   158 int BranchObj::getNum(BranchObj *bo)
   159 {
   160 	// keep current pointer in branch, 
   161 	// otherwise saveToDir will fail
   162 	int cur=branch.at();
   163 	int ind=branch.findRef (bo);
   164 	branch.at(cur);
   165 	return ind;
   166 }
   167 
   168 int BranchObj::getFloatImageNum(FloatImageObj *fio)
   169 {
   170 	return floatimage.findRef (fio);
   171 }
   172 
   173 int BranchObj::countBranches()
   174 {
   175 	return branch.count();
   176 }
   177 
   178 int BranchObj::countFloatImages()
   179 {
   180 	return floatimage.count();
   181 }
   182 
   183 int BranchObj::countXLinks()
   184 {
   185 	return xlink.count();
   186 }
   187 
   188 void BranchObj::setParObjTmp(LinkableMapObj* lmo, QPoint m, int off)
   189 {
   190 	// Temporary link to lmo
   191 	// m is position of mouse pointer 
   192 	// offset 0: default 1: below lmo   -1 above lmo  (if possible)
   193 
   194 
   195 	BranchObj* o=(BranchObj*)(lmo);
   196 	if (!parObjTmpBuf) 
   197 		parObjTmpBuf=parObj;
   198 
   199 	// ignore mapcenter and mainbranch
   200 	if (lmo->getDepth()<2) off=0;
   201 	if (off==0)
   202 		link2ParPos=false;
   203 	else
   204 		link2ParPos=true;
   205 	parObj=o;
   206 
   207 	depth=parObj->getDepth()+1;
   208 
   209 	// setLinkStyle calls updateLink, only set it once
   210 	if (style!=getDefLinkStyle() ) setLinkStyle (getDefLinkStyle());
   211 
   212 	// Move temporary to new position at destination
   213 	// Usually the positioning would be done by reposition(),
   214 	// but then also the destination branch would "Jump" around...
   215 	// Better just do it approximately
   216 	if (depth==1)
   217 	{	// new parent is the mapcenter itself
   218 
   219 		QPoint p= normalise ( QPoint (m.x() - o->getChildPos().x(),
   220 									  m.y() - o->getChildPos().y() ));
   221 		if (p.x()<0) p.setX( p.x()-bbox.width() );
   222 		move2RelPos (p);
   223 	} else
   224 	{	
   225 		int y;
   226 		if (off==0)
   227 		{
   228 			// new parent is just a branch, link to it
   229 			QRect t=o->getBBoxSizeWithChilds();
   230 			if (o->getLastBranch())
   231 				y=t.y() + t.height() ;
   232 			else
   233 				y=t.y();
   234 
   235 		} else
   236 		{
   237 			if (off<0)
   238 				// we want to link above lmo
   239 				y=o->y() - height() + 5;
   240 			else	
   241 				// we want to link below lmo
   242 				// Bottom of sel should be 5 pixels above
   243 				// the bottom of the branch _below_ the target:
   244 				// Don't try to find that branch, guess 12 pixels
   245 				y=o->getChildPos().y()  -height() + 12; 
   246 		}	
   247 		if (o->getOrientation()==OrientLeftOfCenter)
   248 			move ( o->getChildPos().x() - linkwidth, y );
   249 		else	
   250 			move (o->getChildPos().x() + linkwidth, y );
   251 	}	
   252 
   253 	// updateLink is called implicitly in move
   254 	reposition();	// FIXME shouldn't be this a request?
   255 }
   256 
   257 void BranchObj::unsetParObjTmp()
   258 {
   259 	if (parObjTmpBuf) 
   260 	{
   261 		link2ParPos=false;
   262 		parObj=parObjTmpBuf;
   263 		parObjTmpBuf=NULL;
   264 		depth=parObj->getDepth()+1;
   265 		setLinkStyle (getDefLinkStyle() );
   266 		updateLink();
   267 	}		
   268 }
   269 
   270 void BranchObj::unScroll()
   271 {
   272 	if (tmpUnscrolled) resetTmpUnscroll();
   273 	if (scrolled) toggleScroll();
   274 }
   275 
   276 void BranchObj::toggleScroll()
   277 {
   278 	BranchObj *bo;
   279 	if (scrolled)
   280 	{
   281 		scrolled=false;
   282 		systemFlags->deactivate("scrolledright");
   283 		for (bo=branch.first(); bo; bo=branch.next() )
   284 		{
   285 			bo->setVisibility(true);
   286 		}
   287 	} else
   288 	{
   289 		scrolled=true;
   290 		systemFlags->activate("scrolledright");
   291 		for (bo=branch.first(); bo; bo=branch.next() )
   292 		{
   293 			bo->setVisibility(false);
   294 		}
   295 	}
   296 	calcBBoxSize();
   297 	positionBBox();	
   298 	move (absPos.x(), absPos.y() );
   299 	forceReposition();
   300 }
   301 
   302 bool BranchObj::isScrolled()
   303 {
   304 	return scrolled;
   305 }
   306 
   307 bool BranchObj::hasScrolledParent(BranchObj *start)
   308 {
   309 	// Calls parents recursivly to
   310 	// find out, if we are scrolled at all.
   311 	// But ignore myself, just look at parents.
   312 
   313 	if (this !=start && scrolled) return true;
   314 
   315 	BranchObj* bo=(BranchObj*)(parObj);
   316 	if (bo) 
   317 		return bo->hasScrolledParent(start);
   318 	else
   319 		return false;
   320 }
   321 
   322 void BranchObj::tmpUnscroll()
   323 {
   324 	// Unscroll parent (recursivly)
   325 	BranchObj* bo=(BranchObj*)(parObj);
   326 	if (bo) bo->tmpUnscroll();
   327 		
   328 	// Unscroll myself
   329 	if (scrolled)
   330 	{
   331 		tmpUnscrolled=true;
   332 		systemFlags->activate("tmpUnscrolledright");
   333 		toggleScroll();
   334 	}	
   335 }
   336 
   337 void BranchObj::resetTmpUnscroll()
   338 {
   339 	// Unscroll parent (recursivly)
   340 	BranchObj* bo=(BranchObj*)(parObj);
   341 	if (bo)
   342 		bo->resetTmpUnscroll();
   343 		
   344 	// Unscroll myself
   345 	if (tmpUnscrolled)
   346 	{
   347 		tmpUnscrolled=false;
   348 		systemFlags->deactivate("tmpUnscrolledright");
   349 		toggleScroll();
   350 	}	
   351 }
   352 
   353 void BranchObj::setVisibility(bool v, int toDepth)
   354 {
   355     if (depth <= toDepth)
   356     {
   357 		frame->setVisibility(v);
   358 		heading->setVisibility(v);
   359 		systemFlags->setVisibility(v);
   360 		standardFlags->setVisibility(v);
   361 		LinkableMapObj::setVisibility (v);
   362 		
   363 		// Only change childs, if I am not scrolled
   364 		if (!scrolled && (depth < toDepth))
   365 		{
   366 			// Now go recursivly through all childs
   367 			BranchObj* b;
   368 			for (b=branch.first(); b;b=branch.next() ) 
   369 				b->setVisibility (v,toDepth);	
   370 			FloatImageObj *fio;
   371 			for (fio=floatimage.first(); fio; fio=floatimage.next())
   372 				fio->setVisibility (v);
   373 			XLinkObj* xlo;
   374 			for (xlo=xlink.first(); xlo;xlo=xlink.next() ) 
   375 				xlo->setVisibility ();	
   376 		}
   377     } // depth <= toDepth	
   378 	requestReposition();
   379 }	
   380 
   381 void BranchObj::setVisibility(bool v)
   382 {
   383     setVisibility (v,MAX_DEPTH);
   384 }
   385 
   386 
   387 void BranchObj::setLinkColor ()
   388 {
   389 	// Overloaded from LinkableMapObj
   390 	// BranchObj can use color of heading
   391 
   392 	if (mapEditor)
   393 		if (mapEditor->getLinkColorHint()==HeadingColor)
   394 			LinkableMapObj::setLinkColor (heading->getColor() );
   395 		else	
   396 			LinkableMapObj::setLinkColor ();
   397 }
   398 
   399 void BranchObj::setColorChilds (QColor col)
   400 {
   401 	OrnamentedObj::setColor (col);
   402 	BranchObj *bo;
   403 	for (bo=branch.first(); bo; bo=branch.next() )
   404 		bo->setColorChilds(col);
   405 }
   406 
   407 BranchObj* BranchObj::first()
   408 {
   409 	itLast=NULL;	
   410 	itFirst=this;
   411 	return this; 
   412 }
   413 	
   414 BranchObj* BranchObj::next()
   415 {
   416 	BranchObj *lmo;
   417 	BranchObj *bo=branch.first();
   418 	BranchObj *po=(BranchObj*)(parObj);
   419 
   420 	if (!itLast)
   421 	{
   422 		if (bo) 
   423 		{	// We are just beginning, 
   424 			// return first child  
   425 			itLast=this;
   426 			return bo;
   427 		}	
   428 		else
   429 		{
   430 			// No childs
   431 			itLast=this;
   432 			return NULL;
   433 		}	
   434 	}
   435 
   436 	if (itLast==parObj)
   437 	{	// We come from above
   438 		if (bo)
   439 		{
   440 			// there are childs, go there
   441 			itLast=this;
   442 			return bo;
   443 		}	
   444 		else
   445 		{	// no childs, try to go up again
   446 			if (po)
   447 			{
   448 				// go up
   449 				itLast=this;
   450 				lmo=po->next();
   451 				itLast=this;
   452 				return lmo;
   453 
   454 			}	
   455 			else
   456 			{
   457 				// can't go up, I am mapCenter
   458 				itLast=NULL;
   459 				return NULL;
   460 			}	
   461 		}
   462 	}
   463 
   464 	// Try to find last child, where we came from, in my own childs
   465 	bool searching=true;
   466 	while (bo && searching)
   467 	{
   468 		if (itLast==bo) searching=false;
   469 		bo=branch.next();
   470 	}
   471 	if (!searching)
   472 	{	// found lastLMO in my childs
   473 		if (bo)
   474 		{
   475 			// found a brother of lastLMO 
   476 			itLast=this;
   477 			return bo;
   478 		}	
   479 		else
   480 		{
   481 			if (po)
   482 			{
   483 				if (this==itFirst) return NULL;	// Stop at starting point
   484 				// go up
   485 				itLast=this;
   486 				lmo=po->next();
   487 				itLast=this;
   488 				return lmo;
   489 			}
   490 			else
   491 			{
   492 				// can't go up, I am mapCenter
   493 				itLast=NULL;
   494 				return NULL;
   495 			}	
   496 		}
   497 	}
   498 
   499 	// couldn't find last child, it must be a nephew of mine
   500 	bo=branch.first();
   501 	if (bo)
   502 	{
   503 		// proceed with my first child
   504 		itLast=this;	
   505 		return bo;
   506 	}	
   507 	else
   508 	{
   509 		// or go back to my parents
   510 		if (po)
   511 		{
   512 			// go up
   513 			itLast=this;
   514 			lmo=po->next();
   515 			itLast=this;
   516 			return lmo;
   517 		}	
   518 		else
   519 		{
   520 			// can't go up, I am mapCenter
   521 			itLast=NULL;
   522 			return NULL;
   523 		}	
   524 	}	
   525 }
   526 
   527 BranchObj* BranchObj::getLastIterator()
   528 {
   529 	return itLast;
   530 }
   531 
   532 void BranchObj::setLastIterator(BranchObj* it)
   533 {
   534 	itLast=it;
   535 }
   536 
   537 void BranchObj::positionContents()
   538 {
   539 	FloatImageObj *fio;
   540     for (fio=floatimage.first(); fio; fio=floatimage.next() )
   541 		fio->reposition();
   542 	OrnamentedObj::positionContents();
   543 }
   544 
   545 void BranchObj::move (double x, double y)
   546 {
   547 	OrnamentedObj::move (x,y);
   548 	FloatImageObj *fio;
   549     for (fio=floatimage.first(); fio; fio=floatimage.next() )
   550 		fio->reposition();
   551     positionBBox();
   552 }
   553 
   554 void BranchObj::move (QPoint p)
   555 {
   556 	move (p.x(), p.y());
   557 }
   558 
   559 void BranchObj::moveBy (double x, double y)
   560 {
   561 	OrnamentedObj::moveBy (x,y);
   562     BranchObj* b;
   563     for (b=branch.first(); b;b=branch.next() ) 
   564 		b->moveBy (x,y);
   565     positionBBox();
   566 }
   567 	
   568 void BranchObj::moveBy (QPoint p)
   569 {
   570 	moveBy (p.x(), p.y());
   571 }
   572 
   573 
   574 void BranchObj::positionBBox()
   575 {
   576 	QPoint ap=getAbsPos();
   577 	bbox.moveTopLeft (ap);
   578 	positionContents();
   579 	setSelBox();
   580 
   581 	// set the frame
   582 	frame->setRect(QRect(bbox.x(),bbox.y(),bbox.width(),bbox.height() ) );
   583 
   584 	// Update links to other branches
   585 	XLinkObj *xlo;
   586     for (xlo=xlink.first(); xlo; xlo=xlink.next() )
   587 		xlo->updateXLink();
   588 }
   589 
   590 void BranchObj::calcBBoxSize()
   591 {
   592     QSize heading_r=heading->getSize();
   593     int heading_w=(int) heading_r.width() ;
   594     int heading_h=(int) heading_r.height() ;
   595     QSize sysflags_r=systemFlags->getSize();
   596 	int sysflags_h=sysflags_r.height();
   597 	int sysflags_w=sysflags_r.width();
   598     QSize stanflags_r=standardFlags->getSize();
   599 	int stanflags_h=stanflags_r.height();
   600 	int stanflags_w=stanflags_r.width();
   601     int w;
   602     int h;
   603 
   604 	// set width to sum of all widths
   605 	w=heading_w + sysflags_w + stanflags_w;
   606 	// set height to maximum needed height
   607 	h=max (sysflags_h,stanflags_h);
   608 	h=max (h,heading_h);
   609 
   610 	// Save the dimension of flags and heading
   611 	ornamentsBBox.setSize ( QSize(w,h));
   612 
   613 	// clickBox includes Flags and Heading
   614     clickBox.setSize (ornamentsBBox.size() );
   615 
   616 	// Floatimages 
   617 	QPoint rp;
   618 	FloatImageObj *foi;
   619 
   620 	topPad=botPad=leftPad=rightPad=0;
   621 	if (includeImagesVer || includeImagesHor)
   622 	{
   623 		if (countFloatImages()>0)
   624 		{
   625 			for (foi=floatimage.first(); foi; foi=floatimage.next() )
   626 			{
   627 				rp=foi->getRelPos();
   628 				if (includeImagesVer)
   629 				{
   630 					if (rp.y() < 0) 
   631 						topPad=max (topPad,-rp.y()-h);
   632 					if (rp.y()+foi->height() > 0)
   633 						botPad=max (botPad,rp.y()+foi->height());
   634 				}		
   635 				if (includeImagesHor)
   636 				{
   637 					if (orientation==OrientRightOfCenter)
   638 					{
   639 						if (-rp.x()-w > 0) 
   640 							leftPad=max (leftPad,-rp.x()-w);
   641 						if (rp.x()+foi->width() > 0)
   642 							rightPad=max (rightPad,rp.x()+foi->width());
   643 					} else
   644 					{
   645 						if (rp.x()< 0) 
   646 							leftPad=max (leftPad,-rp.x());
   647 						if (rp.x()+foi->width() > w)
   648 							rightPad=max (rightPad,rp.x()+foi->width()-w);
   649 					}
   650 				}		
   651 			}	
   652 		}	
   653 		h+=topPad+botPad;
   654 		w+=leftPad+rightPad;
   655 	}
   656 
   657 	// Frame thickness
   658     w+=frame->getBorder();
   659     h+=frame->getBorder();
   660 	
   661 	// Finally set size
   662     bbox.setSize (QSize (w,h));
   663 }
   664 
   665 void BranchObj::setDockPos()
   666 {
   667 	// Sets childpos and parpos depending on orientation
   668 	if (getOrientation()==OrientLeftOfCenter )
   669     {
   670 		childPos=QPoint (ornamentsBBox.bottomLeft().x(), ornamentsBBox.bottomLeft().y() );
   671 		parPos=QPoint (ornamentsBBox.bottomRight().x(),ornamentsBBox.bottomRight().y() );
   672     } else
   673     {
   674 		childPos=QPoint (ornamentsBBox.bottomRight().x(), ornamentsBBox.bottomRight().y() );
   675 		parPos=QPoint (ornamentsBBox.bottomLeft().x(),ornamentsBBox.bottomLeft().y() );
   676     }
   677 }
   678 
   679 LinkableMapObj* BranchObj::findMapObj(QPoint p, LinkableMapObj* excludeLMO)
   680 {
   681 	// Search branches
   682     BranchObj *b;
   683     LinkableMapObj *lmo;
   684     for (b=branch.first(); b; b=branch.next() )
   685     {	
   686 		lmo=b->findMapObj(p, excludeLMO);
   687 		if (lmo != NULL) return lmo;
   688     }
   689 	
   690 	// Search myself
   691     if (inBox (p) && (this != excludeLMO) && isVisibleObj() ) 
   692 		return this;
   693 
   694 	// Search float images
   695 	FloatImageObj *foi;
   696     for (foi=floatimage.first(); foi; foi=floatimage.next() )
   697 		if (foi->inBox(p) && 
   698 			(foi != excludeLMO) && 
   699 			foi->getParObj()!= excludeLMO &&
   700 			foi->isVisibleObj() 
   701 		) return foi;
   702 
   703     return NULL;
   704 }
   705 
   706 void BranchObj::setHeading(QString s)
   707 {
   708     heading->setText(s);	// set new heading
   709 	calcBBoxSize();			// recalculate bbox
   710     positionBBox();			// rearrange contents
   711 	requestReposition();
   712 }
   713 
   714 void BranchObj::setHideTmp (HideTmpMode mode)
   715 {
   716 	if (mode==HideExport && hasHiddenExportParent(this))
   717 	{
   718 		setVisibility (false);
   719 		hidden=true;
   720 	}else
   721 	{
   722 		if (hasScrolledParent(this))
   723 			setVisibility (false);
   724 		else
   725 			setVisibility (true);
   726 		hidden=false;
   727 	}	
   728 
   729     BranchObj *bo;
   730     for (bo=branch.first(); bo; bo=branch.next() )
   731 		bo->setHideTmp (mode);
   732 }
   733 
   734 bool BranchObj::hasHiddenExportParent(BranchObj *start)
   735 {
   736 	// Calls parents recursivly to
   737 	// find out, if we are temp. hidden
   738 
   739 	if (hideExport) return true;
   740 
   741 	BranchObj* bo=(BranchObj*)(parObj);
   742 	if (bo) 
   743 		return bo->hasHiddenExportParent(start);
   744 	else
   745 		return false;
   746 }
   747 
   748 QString BranchObj::saveToDir (const QString &tmpdir,const QString &prefix, const QPoint& offset)
   749 {
   750 	if (hidden) return "";
   751 
   752     QString s,a;
   753 	QString scrolledAttr;
   754 	if (scrolled) 
   755 		scrolledAttr=attribut ("scrolled","yes");
   756 	else
   757 		scrolledAttr="";
   758 
   759 	QString frameAttr;
   760 	if (frame->getFrameType()!=NoFrame)
   761 		frameAttr=attribut ("frameType",frame->getFrameTypeName());
   762 	else
   763 		frameAttr="";
   764 
   765 	// save area, if not scrolled
   766 	QString areaAttr;
   767 	if (!((BranchObj*)(parObj))->isScrolled() )
   768 	{
   769 		areaAttr=
   770 			attribut("x1",QString().setNum(absPos.x()-offset.x(),10)) +
   771 			attribut("y1",QString().setNum(absPos.y()-offset.y(),10)) +
   772 			attribut("x2",QString().setNum(absPos.x()+width()-offset.x(),10)) +
   773 			attribut("y2",QString().setNum(absPos.y()+height()-offset.y(),10));
   774 
   775 	} else
   776 		areaAttr="";
   777 	
   778 	// Providing an ID for a branch makes export to XHTML easier
   779 	QString idAttr;
   780 	if (countXLinks()>0)
   781 		idAttr=attribut ("id",getSelectString());
   782 	else
   783 		idAttr="";
   784 
   785     s=beginElement ("branch" 
   786 		+getOrnAttr() 
   787 		+scrolledAttr 
   788 		+frameAttr 
   789 		+areaAttr 
   790 		+idAttr 
   791 		+getIncludeImageAttr() );
   792     incIndent();
   793 
   794 	/* Testing
   795 	for (int i=1; i<depth;i++) cout << "  ";
   796 	cout <<getHeading().ascii()<<endl;
   797 	*/
   798 
   799 	// save heading
   800     s+=valueElement("heading", getHeading(),
   801 		attribut ("textColor",QColor(heading->getColor()).name()));
   802 
   803 	// save names of flags set
   804 	s+=standardFlags->saveToDir(tmpdir,prefix,0);
   805 	
   806 	// Save FloatImages
   807 	FloatImageObj *fio;
   808 	for (fio=floatimage.first(); fio; fio=floatimage.next() )
   809 		s+=fio->saveToDir (tmpdir,prefix);
   810 
   811 	// save note
   812 	if (!note.isEmpty() )
   813 		s+=note.saveToDir();
   814 	
   815 	// Save branches
   816     BranchObj *bo;
   817     for (bo=branch.first(); bo; bo=branch.next() )
   818 		s+=bo->saveToDir(tmpdir,prefix,offset);
   819 
   820 	// Save XLinks
   821 	XLinkObj *xlo;
   822 	QString ol;	// old link
   823 	QString cl;	// current link
   824     for (xlo=xlink.first(); xlo; xlo=xlink.next() )
   825 	{
   826 		cl=xlo->saveToDir();
   827 		if (cl!=ol)
   828 		{
   829 			s+=cl;
   830 			ol=cl;
   831 		} else
   832 		{
   833 			qWarning (QString("Ignoring of duplicate xLink in %1").arg(getHeading()));
   834 		}
   835 	}	
   836 
   837     decIndent();
   838     s+=endElement   ("branch");
   839     return s;
   840 }
   841 
   842 void BranchObj::addXLink (XLinkObj *xlo)
   843 {
   844 	xlink.append (xlo);
   845 	
   846 }
   847 
   848 void BranchObj::removeXLinkRef (XLinkObj *xlo)
   849 {
   850 	xlink.remove (xlo);
   851 }
   852 
   853 void BranchObj::deleteXLink(XLinkObj *xlo)
   854 {
   855 	xlo->deactivate();
   856 	if (!xlo->isUsed()) delete (xlo);
   857 }
   858 
   859 void BranchObj::deleteXLinkAt (int i)
   860 {
   861 	XLinkObj *xlo=xlink.at(i);
   862 	xlo->deactivate();
   863 	if (!xlo->isUsed()) delete(xlo);
   864 }
   865 
   866 XLinkObj* BranchObj::XLinkAt (int i)
   867 {
   868 	return xlink.at(i);
   869 }
   870 
   871 int BranchObj::countXLink()
   872 {
   873 	return xlink.count();
   874 }
   875 
   876 
   877 BranchObj* BranchObj::XLinkTargetAt (int i)
   878 {
   879 	if (xlink.at(i))
   880 		return xlink.at(i)->otherBranch (this);
   881 	else
   882 		return NULL;
   883 }
   884 
   885 void BranchObj::setIncludeImagesVer(bool b)
   886 {
   887 	includeImagesVer=b;
   888 	calcBBoxSize();
   889 	positionBBox();
   890 	requestReposition();
   891 }
   892 
   893 bool BranchObj::getIncludeImagesVer()
   894 {
   895 	return includeImagesVer;
   896 }
   897 
   898 void BranchObj::setIncludeImagesHor(bool b)
   899 {
   900 	includeImagesHor=b;
   901 	calcBBoxSize();
   902 	positionBBox();
   903 	requestReposition();
   904 }
   905 
   906 bool BranchObj::getIncludeImagesHor()
   907 {
   908 	return includeImagesHor;
   909 }
   910 
   911 QString BranchObj::getIncludeImageAttr()
   912 {
   913 	QString a;
   914 	if (includeImagesVer)
   915 		a=attribut ("incImgV","true");
   916 	else
   917 		a=attribut ("incImgV","false");
   918 	if (includeImagesHor)
   919 		a+=attribut ("incImgH","true");
   920 	else
   921 		a+=attribut ("incImgH","false");
   922 	return a;	
   923 }
   924 
   925 LinkableMapObj* BranchObj::addFloatImage ()
   926 {
   927 	FloatImageObj *newfi=new FloatImageObj (canvas,this);
   928 	floatimage.append (newfi);
   929 	if (hasScrolledParent(this) )
   930 		newfi->setVisibility (false);
   931 	else	
   932 		newfi->setVisibility(visible);
   933 	calcBBoxSize();
   934 	positionBBox();
   935 	requestReposition();
   936 	return newfi;
   937 }
   938 
   939 LinkableMapObj* BranchObj::addFloatImage (FloatImageObj *fio)
   940 {
   941 	FloatImageObj *newfi=new FloatImageObj (canvas,this);
   942 	floatimage.append (newfi);
   943 	newfi->copy (fio);
   944 	if (hasScrolledParent(this) )
   945 		newfi->setVisibility (false);
   946 	else	
   947 		newfi->setVisibility(visible);
   948 	calcBBoxSize();
   949 	positionBBox();
   950 	requestReposition();
   951 	return newfi;
   952 }
   953 
   954 FloatImageObj* BranchObj::getFirstFloatImage ()
   955 {
   956     return floatimage.first();
   957 }
   958 
   959 FloatImageObj* BranchObj::getLastFloatImage ()
   960 {
   961     return floatimage.last();
   962 }
   963 
   964 FloatImageObj* BranchObj::getFloatImageNum (const uint &i)
   965 {
   966     return floatimage.at(i);
   967 }
   968 
   969 void BranchObj::removeFloatImage (FloatImageObj *fio)
   970 {
   971 	floatimage.remove (fio);
   972 	calcBBoxSize();
   973 	positionBBox();
   974 	requestReposition();
   975 	// FIMXE undo needed
   976 }
   977 
   978 void BranchObj::savePosInAngle ()
   979 {
   980 	// Save position in angle
   981     BranchObj *b;
   982 	int i=0;
   983     for (b=branch.first(); b; b=branch.next() )
   984 	{
   985 		b->angle=i;
   986 		i++;
   987 	}
   988 }
   989 
   990 void BranchObj::setDefAttr (BranchModification mod)
   991 {
   992 	int fontsize;
   993 	switch (depth)
   994 	{
   995 		case 0: fontsize=16; break;
   996 		case 1: fontsize=12; break;
   997 		default: fontsize=10; break;
   998 	}	
   999 
  1000 	setLinkColor ();
  1001 	setLinkStyle(getDefLinkStyle());
  1002 	QFont font("Sans Serif,8,-1,5,50,0,0,0,0,0");
  1003 	font.setPointSize(fontsize);
  1004 	heading->setFont(font );
  1005 
  1006 	if (mod==NewBranch)
  1007 		setColor (((BranchObj*)(parObj))->getColor());
  1008 	
  1009 	calcBBoxSize();
  1010 }
  1011 
  1012 BranchObj* BranchObj::addBranch()
  1013 {
  1014     BranchObj* newbo=new BranchObj(canvas,this);
  1015     branch.append (newbo);
  1016     newbo->setParObj(this);
  1017 	newbo->setDefAttr(NewBranch);
  1018     newbo->setHeading ("new");
  1019 	if (scrolled)
  1020 		newbo->setVisibility (false);
  1021 	else	
  1022 		newbo->setVisibility(visible);
  1023 	newbo->updateLink();	
  1024 	requestReposition();
  1025 	return newbo;
  1026 }
  1027 
  1028 BranchObj* BranchObj::addBranch(BranchObj* bo)
  1029 {
  1030     BranchObj* newbo=new BranchObj(canvas,this);
  1031     branch.append (newbo);
  1032     newbo->copy(bo);
  1033     newbo->setParObj(this);
  1034 	newbo->setDefAttr(MovedBranch);
  1035 	if (scrolled)
  1036 		newbo->setVisibility (false);
  1037 	else	
  1038 		newbo->setVisibility(bo->visible);
  1039 	newbo->updateLink();	
  1040 	requestReposition();
  1041 	return newbo;
  1042 }
  1043 
  1044 BranchObj* BranchObj::addBranchPtr(BranchObj* bo)
  1045 {
  1046 	branch.append (bo);
  1047 	bo->setParObj (this);
  1048 	bo->depth=depth+1;
  1049 	bo->setDefAttr(MovedBranch);
  1050 	if (scrolled) tmpUnscroll();
  1051 	setLastSelectedBranch (bo);
  1052 	return bo;
  1053 }
  1054 
  1055 BranchObj* BranchObj::insertBranch(int pos)
  1056 {
  1057 	savePosInAngle();
  1058 	// Add new bo and resort branches
  1059 	BranchObj *newbo=addBranch ();
  1060 	newbo->angle=pos-0.5;
  1061 	branch.sort();
  1062 	return newbo;
  1063 }
  1064 
  1065 BranchObj* BranchObj::insertBranch(BranchObj* bo, int pos)
  1066 {
  1067 	savePosInAngle();
  1068 	// Add new bo and resort branches
  1069 	bo->angle=pos-0.5;
  1070 	BranchObj *newbo=addBranch (bo);
  1071 	branch.sort();
  1072 	return newbo;
  1073 }
  1074 
  1075 BranchObj* BranchObj::insertBranchPtr (BranchObj* bo, int pos)
  1076 {
  1077 	savePosInAngle();
  1078 	// Add new bo and resort branches
  1079 	bo->angle=pos-0.5;
  1080 	branch.append (bo);
  1081 	bo->setParObj (this);
  1082 	bo->depth=depth+1;
  1083 	bo->setDefAttr (MovedBranch);
  1084 	if (scrolled) tmpUnscroll();
  1085 	setLastSelectedBranch (bo);
  1086 	branch.sort();
  1087 	return bo;
  1088 }
  1089 
  1090 void BranchObj::removeBranchHere(BranchObj* borem)
  1091 {
  1092 	// This removes the branch bo from list, but 
  1093 	// inserts its childs at the place of bo
  1094 	BranchObj *bo;
  1095 	bo=borem->getLastBranch();
  1096 	int pos=borem->getNum();
  1097 	while (bo)
  1098 	{
  1099 		bo->moveBranchTo (this,pos+1);
  1100 		bo=borem->getLastBranch();
  1101 	}	
  1102 	removeBranch (borem);
  1103 }
  1104 
  1105 void BranchObj::removeChilds()
  1106 {
  1107 	clear();
  1108 }
  1109 
  1110 void BranchObj::removeBranch(BranchObj* bo)
  1111 {
  1112     // if bo is not in branch remove returns false, we
  1113     // don't care...
  1114 	
  1115     if (branch.remove (bo))
  1116 		delete (bo);
  1117 	else
  1118 		qWarning ("BranchObj::removeBranch tried to remove non existing branch?!\n");
  1119 	requestReposition();
  1120 }
  1121 
  1122 void BranchObj::removeBranchPtr(BranchObj* bo)
  1123 {
  1124 	branch.remove (bo);
  1125 	requestReposition();
  1126 }
  1127 
  1128 void BranchObj::setLastSelectedBranch (BranchObj* bo)
  1129 {
  1130     lastSelectedBranch=branch.find(bo);
  1131 }
  1132 
  1133 BranchObj* BranchObj::getLastSelectedBranch ()
  1134 {
  1135     if (lastSelectedBranch>=0) 
  1136 	{
  1137 		BranchObj* bo=branch.at(lastSelectedBranch);
  1138 		if (bo) return bo;
  1139     }	
  1140     return branch.first();
  1141 }
  1142 
  1143 BranchObj* BranchObj::getFirstBranch ()
  1144 {
  1145     return branch.first();
  1146 }
  1147 
  1148 BranchObj* BranchObj::getLastBranch ()
  1149 {
  1150     return branch.last();
  1151 }
  1152 
  1153 BranchObj* BranchObj::getBranchNum (const uint &i)
  1154 {
  1155     return branch.at(i);
  1156 }
  1157 
  1158 bool BranchObj::canMoveBranchUp() 
  1159 {
  1160 	if (!parObj || depth==1) return false;
  1161 	BranchObj* par=(BranchObj*)parObj;
  1162 	if (this==par->getFirstBranch())
  1163 		return false;
  1164 	else
  1165 		return true;
  1166 }
  1167 
  1168 BranchObj* BranchObj::moveBranchUp(BranchObj* bo1) // modify my childlist
  1169 {
  1170 	savePosInAngle();
  1171     int i=branch.find(bo1);
  1172 	cout << "BO: i="<<i<<endl;
  1173     if (i>0) 
  1174 	{	// -1 if bo1 not found 
  1175 		branch.at(i)->angle--;
  1176 		branch.at(i-1)->angle++;
  1177 		branch.sort();
  1178 		return branch.at(i);
  1179 	} else
  1180 		return NULL;
  1181 }
  1182 
  1183 bool BranchObj::canMoveBranchDown() 
  1184 {
  1185 	if (!parObj|| depth==1) return false;
  1186 	BranchObj* par=(BranchObj*)parObj;
  1187 	if (this==par->getLastBranch())
  1188 		return false;
  1189 	else
  1190 		return true;
  1191 }
  1192 
  1193 BranchObj* BranchObj::moveBranchDown(BranchObj* bo1)// modify my childlist
  1194 {
  1195 	savePosInAngle();
  1196     int i=branch.find(bo1);
  1197 	int j;
  1198 	if (branch.next())
  1199 	{
  1200 		j = branch.at();
  1201 		branch.at(i)->angle++;
  1202 		branch.at(j)->angle--;
  1203 		branch.sort();
  1204 		return branch.at(i);
  1205 	} else
  1206 		return NULL;
  1207 }
  1208 
  1209 BranchObj* BranchObj::moveBranchTo (BranchObj* dst, int pos)
  1210 {
  1211 	// Find current parent and 
  1212 	// remove pointer to myself there
  1213 	if (!dst) return NULL;
  1214 	BranchObj *par=(BranchObj*)parObj;
  1215 	if (par)
  1216 		par->removeBranchPtr (this);
  1217 	else
  1218 		return NULL;
  1219 
  1220 	// Create new pointer to myself at dst
  1221 	if (pos<0||dst->getDepth()==0)
  1222 	{	
  1223 		// links myself as last branch at dst
  1224 		dst->addBranchPtr (this);
  1225 		updateLink();
  1226 		return this;
  1227 	} else
  1228 	{
  1229 		// inserts me at pos in parent of dst
  1230 		if (par)
  1231 		{
  1232 			BranchObj *bo=dst->insertBranchPtr (this,pos);
  1233 			bo->setDefAttr(MovedBranch);
  1234 			updateLink();
  1235 			return bo;
  1236 
  1237 		} else
  1238 			return NULL;
  1239 	}	
  1240 }
  1241 
  1242 void BranchObj::alignRelativeTo (QPoint ref)
  1243 {
  1244 	int th = bboxTotal.height();	
  1245 // TODO testing
  1246 /*
  1247 	cout << "BO::alignRelTo "<<getHeading().ascii()<<endl;
  1248 	cout << "  d="<<depth<<
  1249 		"  ref="<<ref<<
  1250 //		"  bbox.topLeft="<<bboxTotal.topLeft()<<
  1251 		"  absPos="<<absPos<<
  1252 		"  relPos="<<relPos<<
  1253 		"  orient="<<orientation<<
  1254 //		"  pad="<<topPad<<","<<botPad<<","<<leftPad<<","<<rightPad<<
  1255 //		"  hidden="<<hidden<<
  1256 //		"  th="<<th<<
  1257 		endl;
  1258 */
  1259 
  1260 	setOrientation();
  1261 	//updateLink();
  1262 
  1263 	if (depth<2)
  1264 	{
  1265 		if (depth==1)
  1266 		{
  1267 			// Position relatively, if needed
  1268 			//if (useRelPos) move2RelPos (relPos.x(), relPos.y());
  1269 
  1270 			// Calc angle to mapCenter if I am a mainbranch
  1271 			// needed for reordering the mainbranches clockwise 
  1272 			// around mapcenter 
  1273 			angle=getAngle (QPoint ((int)(x() - parObj->getChildPos().x() ), 
  1274 									(int)(y() - parObj->getChildPos().y() ) ) );
  1275 		}							
  1276 	} 
  1277 	else
  1278     {
  1279 		// Align myself depending on orientation and parent, but
  1280 		// only if I am not a mainbranch or mapcenter itself
  1281 		LinkOrient o;
  1282 		o=parObj->getOrientation();
  1283 		switch (orientation) 
  1284 		{
  1285 			case OrientLeftOfCenter:
  1286 				move (ref.x() - bbox.width(), ref.y() + (th-bbox.height())/2 );
  1287 			break;
  1288 			case OrientRightOfCenter:	
  1289 				move (ref.x() , ref.y() + (th-bbox.height())/2  );
  1290 			break;
  1291 			default:
  1292 				qWarning ("LMO::alignRelativeTo: oops, no orientation given...");
  1293 			break;
  1294 		}		
  1295     }		
  1296 
  1297 	if (scrolled) return;
  1298 
  1299     // Set reference point for alignment of childs
  1300     QPoint ref2;
  1301     if (orientation==OrientLeftOfCenter)
  1302 		ref2.setX(bbox.topLeft().x() - linkwidth);
  1303     else	
  1304 		ref2.setX(bbox.topRight().x() + linkwidth);
  1305 
  1306 	if (depth==1)
  1307 		ref2.setY(absPos.y()-(bboxTotal.height()-bbox.height())/2);
  1308 	else	
  1309 		ref2.setY(ref.y() );	
  1310 
  1311     // Align the childs depending on reference point 
  1312     BranchObj *b;
  1313     for (b=branch.first(); b; b=branch.next() )
  1314     {	
  1315 		if (!b->isHidden())
  1316 		{
  1317 			b->alignRelativeTo (ref2);
  1318 			ref2.setY(ref2.y() + b->getBBoxSizeWithChilds().height() );
  1319 		}
  1320     }
  1321 }
  1322 
  1323 
  1324 void BranchObj::reposition()
  1325 {	
  1326 /* TODO testing only
  1327 	if (!getHeading().isEmpty())
  1328 		cout << "BO::reposition  "<<getHeading().ascii()<<endl;
  1329 	else	
  1330 		cout << "BO::reposition  ???"<<endl;
  1331 
  1332 	cout << "  orient="<<orientation<<endl;
  1333 */		
  1334 
  1335 	if (depth==0)
  1336 	{
  1337 		// only calculate the sizes once. If the deepest LMO 
  1338 		// changes its height,
  1339 		// all upper LMOs have to change, too.
  1340 		calcBBoxSizeWithChilds();
  1341 		updateLink();	// This update is needed if the canvas is resized 
  1342 						// due to excessive moving of a FIO
  1343 						// FIXME really needed? reposition is also called from updateLink...
  1344 
  1345 	    alignRelativeTo ( QPoint (absPos.x(),
  1346 			absPos.y()-(bboxTotal.height()-bbox.height())/2) );
  1347 		branch.sort();	
  1348 		positionBBox();	// Reposition bbox and contents
  1349 	} else
  1350 	{
  1351 		// This is only important for moving branches:
  1352 		// For editing a branch it isn't called...
  1353 	    alignRelativeTo ( QPoint (absPos.x(),
  1354 							absPos.y()-(bboxTotal.height()-bbox.height())/2) );
  1355 	}
  1356 }
  1357 
  1358 void BranchObj::unsetAllRepositionRequests()
  1359 {
  1360 	repositionRequest=false;
  1361 	BranchObj *b;
  1362 	for (b=branch.first(); b; b=branch.next() ) 
  1363 	{
  1364 		b->unsetAllRepositionRequests();
  1365 	}	
  1366 }
  1367 
  1368 
  1369 QRect BranchObj::getTotalBBox()
  1370 {
  1371 	QRect r=bbox;
  1372 
  1373 	if (scrolled) return r;
  1374 
  1375 	BranchObj* b;
  1376 	for (b=branch.first();b ;b=branch.next() )
  1377 		if (!b->isHidden())
  1378 			r=addBBox(b->getTotalBBox(),r);
  1379 
  1380 	FloatImageObj* fio;
  1381 	for (fio=floatimage.first();fio ;fio=floatimage.next() )
  1382 		if (!fio->isHidden())
  1383 			r=addBBox(fio->getTotalBBox(),r);
  1384 		
  1385 	return r;
  1386 }
  1387 
  1388 QRect BranchObj::getBBoxSizeWithChilds()
  1389 {
  1390 	return bboxTotal;
  1391 }
  1392 
  1393 void BranchObj::calcBBoxSizeWithChilds()
  1394 {	
  1395 	// This is initially called only from reposition and
  1396 	// and only for mapcenter. So it won't be
  1397 	// called more than once for a single user 
  1398 	// action
  1399 	
  1400 
  1401 	// Calculate size of LMO including all childs (to align them later)
  1402 	bboxTotal.setX(bbox.x() );
  1403 	bboxTotal.setY(bbox.y() );
  1404 
  1405 	// if branch is scrolled, ignore childs, but still consider floatimages
  1406 	if (scrolled)
  1407 	{
  1408 		bboxTotal.setWidth (bbox.width());
  1409 		bboxTotal.setHeight(bbox.height());
  1410 		return;
  1411 	}
  1412 	
  1413 	if (hidden)
  1414 	{
  1415 		bboxTotal.setWidth (0);
  1416 		bboxTotal.setHeight(0);
  1417 		if (parObj)
  1418 		{
  1419 			bboxTotal.setX (parObj->x());
  1420 			bboxTotal.setY (parObj->y());
  1421 		} else
  1422 		{
  1423 			bboxTotal.setX (bbox.x());
  1424 			bboxTotal.setY (bbox.y());
  1425 		}
  1426 		return;
  1427 	}
  1428 	
  1429 	QRect r(0,0,0,0);
  1430 	QRect br;
  1431 	// Now calculate recursivly
  1432 	// sum of heights 
  1433 	// maximum of widths 
  1434 	// minimum of y
  1435 	BranchObj* b;
  1436 	for (b=branch.first();b ;b=branch.next() )
  1437 	{
  1438 		if (!b->isHidden())
  1439 		{
  1440 			b->calcBBoxSizeWithChilds();
  1441 			br=b->getBBoxSizeWithChilds();
  1442 			r.setWidth( max (br.width(), r.width() ));
  1443 			r.setHeight(br.height() + r.height() );
  1444 			if (br.y()<bboxTotal.y()) bboxTotal.setY(br.y());
  1445 		}
  1446 	}
  1447 	// Add myself and also
  1448 	// add width of link to sum if necessary
  1449 	if (branch.isEmpty())
  1450 		bboxTotal.setWidth (bbox.width() + r.width() );
  1451 	else	
  1452 		bboxTotal.setWidth (bbox.width() + r.width() + linkwidth);
  1453 	
  1454 	bboxTotal.setHeight(max (r.height(),  bbox.height()));
  1455 }
  1456 
  1457 void BranchObj::select()
  1458 {
  1459 	// set Text in Editor	
  1460 	textEditor->setText(note.getNote() );
  1461 	QString fnh=note.getFilenameHint();
  1462 	if (fnh!="")
  1463 		textEditor->setFilenameHint(note.getFilenameHint() );
  1464 	else	
  1465 		textEditor->setFilenameHint(getHeading() );
  1466 	textEditor->setFontHint (note.getFontHint() );
  1467 
  1468     LinkableMapObj::select();
  1469 	// Tell parent that I am selected now:
  1470 	BranchObj* po=(BranchObj*)(parObj);
  1471     if (po)	// TODO	    Try to get rid of this cast...
  1472         po->setLastSelectedBranch(this);
  1473 		
  1474 	// temporary unscroll, if we have scrolled parents somewhere
  1475 	if (parObj) ((BranchObj*)(parObj))->tmpUnscroll();
  1476 
  1477 	// Show URL and link in statusbar
  1478 	QString status;
  1479 	if (!url.isEmpty()) status+="URL: "+url+"  ";
  1480 	if (!vymLink.isEmpty()) status+="Link: "+vymLink;
  1481 	if (!status.isEmpty()) mainWindow->statusMessage (status);
  1482 
  1483 	// Update Toolbar
  1484 	updateFlagsToolbar();
  1485 
  1486 	// Update actions in mapeditor
  1487 	mapEditor->updateActions();
  1488 }
  1489 
  1490 void BranchObj::unselect()
  1491 {
  1492 	LinkableMapObj::unselect();
  1493 	// Delete any messages like vymLink in StatusBar
  1494 	mainWindow->statusMessage ("");
  1495 
  1496 	// save note from editor and set flag
  1497 	// text is done by updateNoteFlag(), just save
  1498 	// filename here
  1499 	note.setFilenameHint (textEditor->getFilename());
  1500 
  1501 	// reset temporary unscroll, if we have scrolled parents somewhere
  1502 	if (parObj) ((BranchObj*)(parObj))->resetTmpUnscroll();
  1503 
  1504 	// Erase content of editor 
  1505 	textEditor->setInactive();
  1506 
  1507 	// unselect all buttons in toolbar
  1508 	standardFlagsDefault->updateToolbar();
  1509 }
  1510 
  1511 QString BranchObj::getSelectString()
  1512 {
  1513 	QString s;
  1514 	if (parObj)
  1515 	{
  1516 		if (depth==1)
  1517 			s= "bo:" + QString("%1").arg(getNum());
  1518 		else	
  1519 			s= ((BranchObj*)(parObj))->getSelectString() + ",bo:" + QString("%1").arg(getNum());
  1520 	} else
  1521 		s="mc:";
  1522 	return s;
  1523 }
  1524