branchobj.cpp
author insilmaril
Fri, 08 Sep 2006 12:30:09 +0000
changeset 381 c79df732d095
parent 377 5391ab620c95
child 382 8b0ab4c0f767
permissions -rw-r--r--
rows in history window can be selected to undo/redo actions
     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 	if (getOrientation()==OrientLeftOfCenter )
   668     {
   669 		childPos=QPoint (ornamentsBBox.bottomLeft().x(), ornamentsBBox.bottomLeft().y() );
   670 		parPos=QPoint (ornamentsBBox.bottomRight().x(),ornamentsBBox.bottomRight().y() );
   671     } else
   672     {
   673 		childPos=QPoint (ornamentsBBox.bottomRight().x(), ornamentsBBox.bottomRight().y() );
   674 		parPos=QPoint (ornamentsBBox.bottomLeft().x(),ornamentsBBox.bottomLeft().y() );
   675     }
   676 }
   677 LinkableMapObj* BranchObj::findMapObj(QPoint p, LinkableMapObj* excludeLMO)
   678 {
   679 	// Search branches
   680     BranchObj *b;
   681     LinkableMapObj *lmo;
   682     for (b=branch.first(); b; b=branch.next() )
   683     {	
   684 		lmo=b->findMapObj(p, excludeLMO);
   685 		if (lmo != NULL) return lmo;
   686     }
   687 	
   688 	// Search myself
   689     if (inBox (p) && (this != excludeLMO) && isVisibleObj() ) 
   690 		return this;
   691 
   692 	// Search float images
   693 	FloatImageObj *foi;
   694     for (foi=floatimage.first(); foi; foi=floatimage.next() )
   695 		if (foi->inBox(p) && 
   696 			(foi != excludeLMO) && 
   697 			foi->getParObj()!= excludeLMO &&
   698 			foi->isVisibleObj() 
   699 		) return foi;
   700 
   701     return NULL;
   702 }
   703 
   704 void BranchObj::setHeading(QString s)
   705 {
   706     heading->setText(s);	// set new heading
   707 	calcBBoxSize();			// recalculate bbox
   708     positionBBox();			// rearrange contents
   709 	requestReposition();
   710 }
   711 
   712 void BranchObj::setHideTmp (HideTmpMode mode)
   713 {
   714 	if (mode==HideExport && hasHiddenExportParent(this))
   715 	{
   716 		setVisibility (false);
   717 		hidden=true;
   718 	}else
   719 	{
   720 		if (hasScrolledParent(this))
   721 			setVisibility (false);
   722 		else
   723 			setVisibility (true);
   724 		hidden=false;
   725 	}	
   726 
   727     BranchObj *bo;
   728     for (bo=branch.first(); bo; bo=branch.next() )
   729 		bo->setHideTmp (mode);
   730 }
   731 
   732 bool BranchObj::hasHiddenExportParent(BranchObj *start)
   733 {
   734 	// Calls parents recursivly to
   735 	// find out, if we are temp. hidden
   736 
   737 	if (hideExport) return true;
   738 
   739 	BranchObj* bo=(BranchObj*)(parObj);
   740 	if (bo) 
   741 		return bo->hasHiddenExportParent(start);
   742 	else
   743 		return false;
   744 }
   745 
   746 QString BranchObj::saveToDir (const QString &tmpdir,const QString &prefix, const QPoint& offset)
   747 {
   748 	if (hidden) return "";
   749 
   750     QString s,a;
   751 	QString scrolledAttr;
   752 	if (scrolled) 
   753 		scrolledAttr=attribut ("scrolled","yes");
   754 	else
   755 		scrolledAttr="";
   756 
   757 	QString frameAttr;
   758 	if (frame->getFrameType()!=NoFrame)
   759 		frameAttr=attribut ("frameType",frame->getFrameTypeName());
   760 	else
   761 		frameAttr="";
   762 
   763 	// save area, if not scrolled
   764 	QString areaAttr;
   765 	if (!((BranchObj*)(parObj))->isScrolled() )
   766 	{
   767 		areaAttr=
   768 			attribut("x1",QString().setNum(absPos.x()-offset.x(),10)) +
   769 			attribut("y1",QString().setNum(absPos.y()-offset.y(),10)) +
   770 			attribut("x2",QString().setNum(absPos.x()+width()-offset.x(),10)) +
   771 			attribut("y2",QString().setNum(absPos.y()+height()-offset.y(),10));
   772 
   773 	} else
   774 		areaAttr="";
   775 	
   776 	// Providing an ID for a branch makes export to XHTML easier
   777 	QString idAttr;
   778 	if (countXLinks()>0)
   779 		idAttr=attribut ("id",getSelectString());
   780 	else
   781 		idAttr="";
   782 
   783     s=beginElement ("branch" 
   784 		+getOrnAttr() 
   785 		+scrolledAttr 
   786 		+frameAttr 
   787 		+areaAttr 
   788 		+idAttr 
   789 		+getIncludeImageAttr() );
   790     incIndent();
   791 
   792 	/* Testing
   793 	for (int i=1; i<depth;i++) cout << "  ";
   794 	cout <<getHeading().ascii()<<endl;
   795 	*/
   796 
   797 	// save heading
   798     s+=valueElement("heading", getHeading(),
   799 		attribut ("textColor",QColor(heading->getColor()).name()));
   800 
   801 	// save names of flags set
   802 	s+=standardFlags->saveToDir(tmpdir,prefix,0);
   803 	
   804 	// Save FloatImages
   805 	FloatImageObj *fio;
   806 	for (fio=floatimage.first(); fio; fio=floatimage.next() )
   807 		s+=fio->saveToDir (tmpdir,prefix);
   808 
   809 	// save note
   810 	if (!note.isEmpty() )
   811 		s+=note.saveToDir();
   812 	
   813 	// Save branches
   814     BranchObj *bo;
   815     for (bo=branch.first(); bo; bo=branch.next() )
   816 		s+=bo->saveToDir(tmpdir,prefix,offset);
   817 
   818 	// Save XLinks
   819 	XLinkObj *xlo;
   820 	QString ol;	// old link
   821 	QString cl;	// current link
   822     for (xlo=xlink.first(); xlo; xlo=xlink.next() )
   823 	{
   824 		cl=xlo->saveToDir();
   825 		if (cl!=ol)
   826 		{
   827 			s+=cl;
   828 			ol=cl;
   829 		} else
   830 		{
   831 			qWarning (QString("Ignoring of duplicate xLink in %1").arg(getHeading()));
   832 		}
   833 	}	
   834 
   835     decIndent();
   836     s+=endElement   ("branch");
   837     return s;
   838 }
   839 
   840 void BranchObj::addXLink (XLinkObj *xlo)
   841 {
   842 	xlink.append (xlo);
   843 	
   844 }
   845 
   846 void BranchObj::removeXLinkRef (XLinkObj *xlo)
   847 {
   848 	xlink.remove (xlo);
   849 }
   850 
   851 void BranchObj::deleteXLink(XLinkObj *xlo)
   852 {
   853 	xlo->deactivate();
   854 	if (!xlo->isUsed()) delete (xlo);
   855 }
   856 
   857 void BranchObj::deleteXLinkAt (int i)
   858 {
   859 	XLinkObj *xlo=xlink.at(i);
   860 	xlo->deactivate();
   861 	if (!xlo->isUsed()) delete(xlo);
   862 }
   863 
   864 XLinkObj* BranchObj::XLinkAt (int i)
   865 {
   866 	return xlink.at(i);
   867 }
   868 
   869 int BranchObj::countXLink()
   870 {
   871 	return xlink.count();
   872 }
   873 
   874 
   875 BranchObj* BranchObj::XLinkTargetAt (int i)
   876 {
   877 	if (xlink.at(i))
   878 		return xlink.at(i)->otherBranch (this);
   879 	else
   880 		return NULL;
   881 }
   882 
   883 void BranchObj::setIncludeImagesVer(bool b)
   884 {
   885 	includeImagesVer=b;
   886 	calcBBoxSize();
   887 	positionBBox();
   888 	requestReposition();
   889 }
   890 
   891 bool BranchObj::getIncludeImagesVer()
   892 {
   893 	return includeImagesVer;
   894 }
   895 
   896 void BranchObj::setIncludeImagesHor(bool b)
   897 {
   898 	includeImagesHor=b;
   899 	calcBBoxSize();
   900 	positionBBox();
   901 	requestReposition();
   902 }
   903 
   904 bool BranchObj::getIncludeImagesHor()
   905 {
   906 	return includeImagesHor;
   907 }
   908 
   909 QString BranchObj::getIncludeImageAttr()
   910 {
   911 	QString a;
   912 	if (includeImagesVer)
   913 		a=attribut ("incImgV","true");
   914 	else
   915 		a=attribut ("incImgV","false");
   916 	if (includeImagesHor)
   917 		a+=attribut ("incImgH","true");
   918 	else
   919 		a+=attribut ("incImgH","false");
   920 	return a;	
   921 }
   922 
   923 LinkableMapObj* BranchObj::addFloatImage ()
   924 {
   925 	FloatImageObj *newfi=new FloatImageObj (canvas,this);
   926 	floatimage.append (newfi);
   927 	if (hasScrolledParent(this) )
   928 		newfi->setVisibility (false);
   929 	else	
   930 		newfi->setVisibility(visible);
   931 	calcBBoxSize();
   932 	positionBBox();
   933 	requestReposition();
   934 	return newfi;
   935 }
   936 
   937 LinkableMapObj* BranchObj::addFloatImage (FloatImageObj *fio)
   938 {
   939 	FloatImageObj *newfi=new FloatImageObj (canvas,this);
   940 	floatimage.append (newfi);
   941 	newfi->copy (fio);
   942 	if (hasScrolledParent(this) )
   943 		newfi->setVisibility (false);
   944 	else	
   945 		newfi->setVisibility(visible);
   946 	calcBBoxSize();
   947 	positionBBox();
   948 	requestReposition();
   949 	return newfi;
   950 }
   951 
   952 FloatImageObj* BranchObj::getFirstFloatImage ()
   953 {
   954     return floatimage.first();
   955 }
   956 
   957 FloatImageObj* BranchObj::getLastFloatImage ()
   958 {
   959     return floatimage.last();
   960 }
   961 
   962 FloatImageObj* BranchObj::getFloatImageNum (const uint &i)
   963 {
   964     return floatimage.at(i);
   965 }
   966 
   967 void BranchObj::removeFloatImage (FloatImageObj *fio)
   968 {
   969 	floatimage.remove (fio);
   970 	calcBBoxSize();
   971 	positionBBox();
   972 	requestReposition();
   973 	// FIMXE undo needed
   974 }
   975 
   976 void BranchObj::savePosInAngle ()
   977 {
   978 	// Save position in angle
   979     BranchObj *b;
   980 	int i=0;
   981     for (b=branch.first(); b; b=branch.next() )
   982 	{
   983 		b->angle=i;
   984 		i++;
   985 	}
   986 }
   987 
   988 void BranchObj::setDefAttr (BranchModification mod)
   989 {
   990 	int fontsize;
   991 	switch (depth)
   992 	{
   993 		case 0: fontsize=16; break;
   994 		case 1: fontsize=12; break;
   995 		default: fontsize=10; break;
   996 	}	
   997 
   998 	setLinkColor ();
   999 	setLinkStyle(getDefLinkStyle());
  1000 	QFont font("Sans Serif,8,-1,5,50,0,0,0,0,0");
  1001 	font.setPointSize(fontsize);
  1002 	heading->setFont(font );
  1003 
  1004 	if (mod==NewBranch)
  1005 		setColor (((BranchObj*)(parObj))->getColor());
  1006 	
  1007 	calcBBoxSize();
  1008 }
  1009 
  1010 BranchObj* BranchObj::addBranch()
  1011 {
  1012     BranchObj* newbo=new BranchObj(canvas,this);
  1013     branch.append (newbo);
  1014     newbo->setParObj(this);
  1015 	newbo->setDefAttr(NewBranch);
  1016     newbo->setHeading ("new");
  1017 	if (scrolled)
  1018 		newbo->setVisibility (false);
  1019 	else	
  1020 		newbo->setVisibility(visible);
  1021 	newbo->updateLink();	
  1022 	requestReposition();
  1023 	return newbo;
  1024 }
  1025 
  1026 BranchObj* BranchObj::addBranch(BranchObj* bo)
  1027 {
  1028     BranchObj* newbo=new BranchObj(canvas,this);
  1029     branch.append (newbo);
  1030     newbo->copy(bo);
  1031     newbo->setParObj(this);
  1032 	newbo->setDefAttr(MovedBranch);
  1033 	if (scrolled)
  1034 		newbo->setVisibility (false);
  1035 	else	
  1036 		newbo->setVisibility(bo->visible);
  1037 	newbo->updateLink();	
  1038 	requestReposition();
  1039 	return newbo;
  1040 }
  1041 
  1042 BranchObj* BranchObj::addBranchPtr(BranchObj* bo)
  1043 {
  1044 	branch.append (bo);
  1045 	bo->setParObj (this);
  1046 	bo->depth=depth+1;
  1047 	bo->setDefAttr(MovedBranch);
  1048 	if (scrolled) tmpUnscroll();
  1049 	setLastSelectedBranch (bo);
  1050 	return bo;
  1051 }
  1052 
  1053 BranchObj* BranchObj::insertBranch(int pos)
  1054 {
  1055 	savePosInAngle();
  1056 	// Add new bo and resort branches
  1057 	BranchObj *newbo=addBranch ();
  1058 	newbo->angle=pos-0.5;
  1059 	branch.sort();
  1060 	return newbo;
  1061 }
  1062 
  1063 BranchObj* BranchObj::insertBranch(BranchObj* bo, int pos)
  1064 {
  1065 	savePosInAngle();
  1066 	// Add new bo and resort branches
  1067 	bo->angle=pos-0.5;
  1068 	BranchObj *newbo=addBranch (bo);
  1069 	branch.sort();
  1070 	return newbo;
  1071 }
  1072 
  1073 BranchObj* BranchObj::insertBranchPtr (BranchObj* bo, int pos)
  1074 {
  1075 	savePosInAngle();
  1076 	// Add new bo and resort branches
  1077 	bo->angle=pos-0.5;
  1078 	branch.append (bo);
  1079 	bo->setParObj (this);
  1080 	bo->depth=depth+1;
  1081 	bo->setDefAttr (MovedBranch);
  1082 	if (scrolled) tmpUnscroll();
  1083 	setLastSelectedBranch (bo);
  1084 	branch.sort();
  1085 	return bo;
  1086 }
  1087 
  1088 void BranchObj::removeBranchHere(BranchObj* borem)
  1089 {
  1090 	// This removes the branch bo from list, but 
  1091 	// inserts its childs at the place of bo
  1092 	BranchObj *bo;
  1093 	bo=borem->getLastBranch();
  1094 	int pos=borem->getNum();
  1095 	while (bo)
  1096 	{
  1097 		bo->moveBranchTo (this,pos+1);
  1098 		bo=borem->getLastBranch();
  1099 	}	
  1100 	removeBranch (borem);
  1101 }
  1102 
  1103 void BranchObj::removeChilds()
  1104 {
  1105 	clear();
  1106 }
  1107 
  1108 void BranchObj::removeBranch(BranchObj* bo)
  1109 {
  1110     // if bo is not in branch remove returns false, we
  1111     // don't care...
  1112 	
  1113     if (branch.remove (bo))
  1114 		delete (bo);
  1115 	else
  1116 		qWarning ("BranchObj::removeBranch tried to remove non existing branch?!\n");
  1117 	requestReposition();
  1118 }
  1119 
  1120 void BranchObj::removeBranchPtr(BranchObj* bo)
  1121 {
  1122 	branch.remove (bo);
  1123 	requestReposition();
  1124 }
  1125 
  1126 void BranchObj::setLastSelectedBranch (BranchObj* bo)
  1127 {
  1128     lastSelectedBranch=branch.find(bo);
  1129 }
  1130 
  1131 BranchObj* BranchObj::getLastSelectedBranch ()
  1132 {
  1133     if (lastSelectedBranch>=0) 
  1134 	{
  1135 		BranchObj* bo=branch.at(lastSelectedBranch);
  1136 		if (bo) return bo;
  1137     }	
  1138     return branch.first();
  1139 }
  1140 
  1141 BranchObj* BranchObj::getFirstBranch ()
  1142 {
  1143     return branch.first();
  1144 }
  1145 
  1146 BranchObj* BranchObj::getLastBranch ()
  1147 {
  1148     return branch.last();
  1149 }
  1150 
  1151 BranchObj* BranchObj::getBranchNum (const uint &i)
  1152 {
  1153     return branch.at(i);
  1154 }
  1155 
  1156 bool BranchObj::canMoveBranchUp() 
  1157 {
  1158 	if (!parObj || depth==1) return false;
  1159 	BranchObj* par=(BranchObj*)parObj;
  1160 	if (this==par->getFirstBranch())
  1161 		return false;
  1162 	else
  1163 		return true;
  1164 }
  1165 
  1166 BranchObj* BranchObj::moveBranchUp(BranchObj* bo1) // modify my childlist
  1167 {
  1168 	savePosInAngle();
  1169     int i=branch.find(bo1);
  1170 	cout << "BO: i="<<i<<endl;
  1171     if (i>0) 
  1172 	{	// -1 if bo1 not found 
  1173 		branch.at(i)->angle--;
  1174 		branch.at(i-1)->angle++;
  1175 		branch.sort();
  1176 		return branch.at(i);
  1177 	} else
  1178 		return NULL;
  1179 }
  1180 
  1181 bool BranchObj::canMoveBranchDown() 
  1182 {
  1183 	if (!parObj|| depth==1) return false;
  1184 	BranchObj* par=(BranchObj*)parObj;
  1185 	if (this==par->getLastBranch())
  1186 		return false;
  1187 	else
  1188 		return true;
  1189 }
  1190 
  1191 BranchObj* BranchObj::moveBranchDown(BranchObj* bo1)// modify my childlist
  1192 {
  1193 	savePosInAngle();
  1194     int i=branch.find(bo1);
  1195 	int j;
  1196 	if (branch.next())
  1197 	{
  1198 		j = branch.at();
  1199 		branch.at(i)->angle++;
  1200 		branch.at(j)->angle--;
  1201 		branch.sort();
  1202 		return branch.at(i);
  1203 	} else
  1204 		return NULL;
  1205 }
  1206 
  1207 BranchObj* BranchObj::moveBranchTo (BranchObj* dst, int pos)
  1208 {
  1209 	// Find current parent and 
  1210 	// remove pointer to myself there
  1211 	if (!dst) return NULL;
  1212 	BranchObj *par=(BranchObj*)parObj;
  1213 	if (par)
  1214 		par->removeBranchPtr (this);
  1215 	else
  1216 		return NULL;
  1217 
  1218 	// Create new pointer to myself at dst
  1219 	if (pos<0||dst->getDepth()==0)
  1220 	{	
  1221 		// links myself as last branch at dst
  1222 		dst->addBranchPtr (this);
  1223 		updateLink();
  1224 		return this;
  1225 	} else
  1226 	{
  1227 		// inserts me at pos in parent of dst
  1228 		if (par)
  1229 		{
  1230 			BranchObj *bo=dst->insertBranchPtr (this,pos);
  1231 			bo->setDefAttr(MovedBranch);
  1232 			updateLink();
  1233 			return bo;
  1234 
  1235 		} else
  1236 			return NULL;
  1237 	}	
  1238 }
  1239 
  1240 void BranchObj::alignRelativeTo (QPoint ref)
  1241 {
  1242 	int th = bboxTotal.height();	
  1243 // TODO testing
  1244 /*
  1245 	cout << "BO::alignRelTo "<<getHeading()<<endl;
  1246 	cout << "  d="<<depth<<
  1247 		"  ref="<<ref<<
  1248 //		"  bbox.topLeft="<<bboxTotal.topLeft()<<
  1249 		"  absPos="<<absPos<<
  1250 //		"  pad="<<topPad<<","<<botPad<<","<<leftPad<<","<<rightPad<<
  1251 		"  hidden="<<hidden<<
  1252 		"  th="<<th<<endl;
  1253 */
  1254 
  1255 	// If I am the mapcenter or a mainbranch, reposition heading
  1256 	if (depth<2)
  1257 	{
  1258 		if (depth==1)
  1259 			// Calc angle to mapCenter if I am a mainbranch
  1260 			// needed for reordering the mainbranches clockwise 
  1261 			// around mapcenter 
  1262 			angle=getAngle (QPoint ((int)(x() - parObj->getChildPos().x() ), 
  1263 									(int)(y() - parObj->getChildPos().y() ) ) );
  1264 	} 
  1265 	else
  1266     {
  1267 		// Align myself depending on orientation and parent, but
  1268 		// only if I am not the mainbranch or mapcenter itself
  1269 		switch (orientation) 
  1270 		{
  1271 			case OrientLeftOfCenter:
  1272 				move (ref.x() - bbox.width(), ref.y() + (th-bbox.height())/2 );
  1273 			break;
  1274 			case OrientRightOfCenter:	
  1275 				move (ref.x() , ref.y() + (th-bbox.height())/2  );
  1276 			break;
  1277 			default:
  1278 				qWarning ("LMO::alignRelativeTo: oops, no orientation given...");
  1279 			break;
  1280 		}		
  1281     }		
  1282 
  1283 	if (scrolled) return;
  1284 
  1285     // Set reference point for alignment of childs
  1286     QPoint ref2;
  1287     if (orientation==OrientLeftOfCenter)
  1288 		ref2.setX(bbox.topLeft().x() - linkwidth);
  1289     else	
  1290 		ref2.setX(bbox.topRight().x() + linkwidth);
  1291 
  1292 	if (depth==1)
  1293 		ref2.setY(absPos.y()-(bboxTotal.height()-bbox.height())/2);
  1294 	else	
  1295 		ref2.setY(ref.y() );	
  1296 
  1297     // Align the childs depending on reference point 
  1298     BranchObj *b;
  1299     for (b=branch.first(); b; b=branch.next() )
  1300     {	
  1301 		if (!b->isHidden())
  1302 		{
  1303 			b->alignRelativeTo (ref2);
  1304 			ref2.setY(ref2.y() + b->getBBoxSizeWithChilds().height() );
  1305 		}
  1306     }
  1307 }
  1308 
  1309 
  1310 void BranchObj::reposition()
  1311 {	
  1312 /* TODO testing only
  1313 	if (!getHeading().isEmpty())
  1314 		cout << "BO::reposition  "<<getHeading()<<endl;
  1315 	else	
  1316 		cout << "BO::reposition  ???"<<endl;
  1317 */		
  1318 	if (depth==0)
  1319 	{
  1320 		// only calculate the sizes once. If the deepest LMO 
  1321 		// changes its height,
  1322 		// all upper LMOs have to change, too.
  1323 		calcBBoxSizeWithChilds();
  1324 		updateLink();	// This update is needed if the canvas is resized 
  1325 						// due to excessive moving of a FIO
  1326 
  1327 	    alignRelativeTo ( QPoint (absPos.x(),
  1328 			absPos.y()-(bboxTotal.height()-bbox.height())/2) );
  1329 		branch.sort();	
  1330 		positionBBox();	// Reposition bbox and contents
  1331 	} else
  1332 	{
  1333 		// This is only important for moving branches:
  1334 		// For editing a branch it isn't called...
  1335 	    alignRelativeTo ( QPoint (absPos.x(),
  1336 							absPos.y()-(bboxTotal.height()-bbox.height())/2) );
  1337 	}
  1338 }
  1339 
  1340 
  1341 QRect BranchObj::getTotalBBox()
  1342 {
  1343 	QRect r=bbox;
  1344 
  1345 	if (scrolled) return r;
  1346 
  1347 	BranchObj* b;
  1348 	for (b=branch.first();b ;b=branch.next() )
  1349 		if (!b->isHidden())
  1350 			r=addBBox(b->getTotalBBox(),r);
  1351 
  1352 	FloatImageObj* fio;
  1353 	for (fio=floatimage.first();fio ;fio=floatimage.next() )
  1354 		if (!fio->isHidden())
  1355 			r=addBBox(fio->getTotalBBox(),r);
  1356 		
  1357 	return r;
  1358 }
  1359 
  1360 QRect BranchObj::getBBoxSizeWithChilds()
  1361 {
  1362 	return bboxTotal;
  1363 }
  1364 
  1365 void BranchObj::calcBBoxSizeWithChilds()
  1366 {	
  1367 	// This is initially called only from reposition and
  1368 	// and only for mapcenter. So it won't be
  1369 	// called more than once for a single user 
  1370 	// action
  1371 	
  1372 
  1373 	// Calculate size of LMO including all childs (to align them later)
  1374 	bboxTotal.setX(bbox.x() );
  1375 	bboxTotal.setY(bbox.y() );
  1376 
  1377 	// if branch is scrolled, ignore childs, but still consider floatimages
  1378 	if (scrolled)
  1379 	{
  1380 		bboxTotal.setWidth (bbox.width());
  1381 		bboxTotal.setHeight(bbox.height());
  1382 		return;
  1383 	}
  1384 	
  1385 	if (hidden)
  1386 	{
  1387 		bboxTotal.setWidth (0);
  1388 		bboxTotal.setHeight(0);
  1389 		if (parObj)
  1390 		{
  1391 			bboxTotal.setX (parObj->x());
  1392 			bboxTotal.setY (parObj->y());
  1393 		} else
  1394 		{
  1395 			bboxTotal.setX (bbox.x());
  1396 			bboxTotal.setY (bbox.y());
  1397 		}
  1398 		return;
  1399 	}
  1400 	
  1401 	QRect r(0,0,0,0);
  1402 	QRect br;
  1403 	// Now calculate recursivly
  1404 	// sum of heights 
  1405 	// maximum of widths 
  1406 	// minimum of y
  1407 	BranchObj* b;
  1408 	for (b=branch.first();b ;b=branch.next() )
  1409 	{
  1410 		if (!b->isHidden())
  1411 		{
  1412 			b->calcBBoxSizeWithChilds();
  1413 			br=b->getBBoxSizeWithChilds();
  1414 			r.setWidth( max (br.width(), r.width() ));
  1415 			r.setHeight(br.height() + r.height() );
  1416 			if (br.y()<bboxTotal.y()) bboxTotal.setY(br.y());
  1417 		}
  1418 	}
  1419 	// Add myself and also
  1420 	// add width of link to sum if necessary
  1421 	if (branch.isEmpty())
  1422 		bboxTotal.setWidth (bbox.width() + r.width() );
  1423 	else	
  1424 		bboxTotal.setWidth (bbox.width() + r.width() + linkwidth);
  1425 	
  1426 	bboxTotal.setHeight(max (r.height(),  bbox.height()));
  1427 }
  1428 
  1429 void BranchObj::select()
  1430 {
  1431 	// set Text in Editor	
  1432 	textEditor->setText(note.getNote() );
  1433 	QString fnh=note.getFilenameHint();
  1434 	if (fnh!="")
  1435 		textEditor->setFilenameHint(note.getFilenameHint() );
  1436 	else	
  1437 		textEditor->setFilenameHint(getHeading() );
  1438 	textEditor->setFontHint (note.getFontHint() );
  1439 
  1440     LinkableMapObj::select();
  1441 	// Tell parent that I am selected now:
  1442 	BranchObj* po=(BranchObj*)(parObj);
  1443     if (po)	// TODO	    Try to get rid of this cast...
  1444         po->setLastSelectedBranch(this);
  1445 		
  1446 	// temporary unscroll, if we have scrolled parents somewhere
  1447 	if (parObj) ((BranchObj*)(parObj))->tmpUnscroll();
  1448 
  1449 	// Show URL and link in statusbar
  1450 	QString status;
  1451 	if (!url.isEmpty()) status+="URL: "+url+"  ";
  1452 	if (!vymLink.isEmpty()) status+="Link: "+vymLink;
  1453 	if (!status.isEmpty()) mainWindow->statusMessage (status);
  1454 
  1455 	// Update Toolbar
  1456 	updateFlagsToolbar();
  1457 
  1458 	// Update actions in mapeditor
  1459 	mapEditor->updateActions();
  1460 }
  1461 
  1462 void BranchObj::unselect()
  1463 {
  1464 	LinkableMapObj::unselect();
  1465 	// Delete any messages like vymLink in StatusBar
  1466 	mainWindow->statusMessage ("");
  1467 
  1468 	// save note from editor and set flag
  1469 	// text is done by updateNoteFlag(), just save
  1470 	// filename here
  1471 	note.setFilenameHint (textEditor->getFilename());
  1472 
  1473 	// reset temporary unscroll, if we have scrolled parents somewhere
  1474 	if (parObj) ((BranchObj*)(parObj))->resetTmpUnscroll();
  1475 
  1476 	// Erase content of editor 
  1477 	textEditor->setInactive();
  1478 
  1479 	// unselect all buttons in toolbar
  1480 	standardFlagsDefault->updateToolbar();
  1481 }
  1482 
  1483 QString BranchObj::getSelectString()
  1484 {
  1485 	QString s;
  1486 	if (parObj)
  1487 	{
  1488 		if (depth==1)
  1489 			s= "bo:" + QString("%1").arg(getNum());
  1490 		else	
  1491 			s= ((BranchObj*)(parObj))->getSelectString() + ",bo:" + QString("%1").arg(getNum());
  1492 	} else
  1493 		s="mc:";
  1494 	return s;
  1495 }
  1496