2 #include "texteditor.h"
4 #include "mainwindow.h"
6 extern TextEditor *textEditor;
7 extern Main *mainWindow;
8 extern FlagRowObj *standardFlagsDefault;
9 extern QAction *actionEditOpenURL;
12 /////////////////////////////////////////////////////////////////
14 /////////////////////////////////////////////////////////////////
16 BranchObj* BranchObj::itLast=NULL;
17 BranchObj* BranchObj::itFirst=NULL;
20 BranchObj::BranchObj () :OrnamentedObj()
22 // cout << "Const BranchObj ()\n";
28 BranchObj::BranchObj (Q3Canvas* c):OrnamentedObj (c)
30 // cout << "Const BranchObj (c) called from MapCenterObj (c)\n";
35 BranchObj::BranchObj (Q3Canvas* c, LinkableMapObj* p):OrnamentedObj (c)
37 // cout << "Const BranchObj (c,p)\n";
40 depth=p->getDepth()+1;
42 // Calc angle to mapCenter if I am a mainbranch
43 // needed for reordering the mainbranches clockwise
45 angle=getAngle (QPoint ((int)(x() - parObj->getChildPos().x() ),
46 (int)(y() - parObj->getChildPos().y() ) ) );
50 BranchObj::~BranchObj ()
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
56 BranchObj *po=(BranchObj*)(parObj);
60 bo=((BranchObj*)(parObj))->getLastBranch();
61 if (!bo) po->unScroll();
66 bool BranchObj::operator< ( const BranchObj & other )
68 return angle < other.angle;
71 bool BranchObj::operator== ( const BranchObj & other )
73 return angle == other.angle;
76 int BranchObjPtrList::compareItems ( Q3PtrCollection::Item i, Q3PtrCollection::Item j)
78 // Make sure PtrList::find works
81 if ( ((BranchObj*)(i))->angle > ((BranchObj*)(j))->angle )
87 void BranchObj::init ()
89 branch.setAutoDelete (false);
90 floatimage.setAutoDelete (true);
91 xlink.setAutoDelete (false);
96 absPos+=parObj->getChildPos();
99 lastSelectedBranch=-1;
106 includeImagesVer=false;
107 includeImagesHor=false;
110 void BranchObj::copy (BranchObj* other)
112 OrnamentedObj::copy(other);
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
123 for (fi=other->floatimage.first(); fi;fi=other->floatimage.next() )
126 scrolled=other->scrolled;
127 tmpUnscrolled=other->tmpUnscrolled;
128 setVisibility (other->visible);
135 void BranchObj::clear()
138 while (!xlink.isEmpty())
139 deleteXLink (xlink.first() );
142 while (!branch.isEmpty())
145 branch.removeFirst();
150 int BranchObj::getNum()
153 return ((BranchObj*)parObj)->getNum (this);
158 int BranchObj::getNum(BranchObj *bo)
160 // keep current pointer in branch,
161 // otherwise saveToDir will fail
163 int ind=branch.findRef (bo);
168 int BranchObj::getFloatImageNum(FloatImageObj *fio)
170 return floatimage.findRef (fio);
173 int BranchObj::countBranches()
175 return branch.count();
178 int BranchObj::countFloatImages()
180 return floatimage.count();
183 int BranchObj::countXLinks()
185 return xlink.count();
188 void BranchObj::setParObjTmp(LinkableMapObj* lmo, QPoint m, int off)
190 // Temporary link to lmo
191 // m is position of mouse pointer
192 // offset 0: default 1: below lmo -1 above lmo (if possible)
195 BranchObj* o=(BranchObj*)(lmo);
199 // ignore mapcenter and mainbranch
200 if (lmo->getDepth()<2) off=0;
207 depth=parObj->getDepth()+1;
209 // setLinkStyle calls updateLink, only set it once
210 if (style!=getDefLinkStyle() ) setLinkStyle (getDefLinkStyle());
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
217 { // new parent is the mapcenter itself
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() );
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() ;
238 // we want to link above lmo
239 y=o->y() - height() + 5;
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;
247 if (o->getOrientation()==OrientLeftOfCenter)
248 move ( o->getChildPos().x() - linkwidth, y );
250 move (o->getChildPos().x() + linkwidth, y );
253 // updateLink is called implicitly in move
254 reposition(); // FIXME shouldn't be this a request?
257 void BranchObj::unsetParObjTmp()
264 depth=parObj->getDepth()+1;
265 setLinkStyle (getDefLinkStyle() );
270 void BranchObj::unScroll()
272 if (tmpUnscrolled) resetTmpUnscroll();
273 if (scrolled) toggleScroll();
276 void BranchObj::toggleScroll()
282 systemFlags->deactivate("scrolledright");
283 for (bo=branch.first(); bo; bo=branch.next() )
285 bo->setVisibility(true);
290 systemFlags->activate("scrolledright");
291 for (bo=branch.first(); bo; bo=branch.next() )
293 bo->setVisibility(false);
298 move (absPos.x(), absPos.y() );
302 bool BranchObj::isScrolled()
307 bool BranchObj::hasScrolledParent(BranchObj *start)
309 // Calls parents recursivly to
310 // find out, if we are scrolled at all.
311 // But ignore myself, just look at parents.
313 if (this !=start && scrolled) return true;
315 BranchObj* bo=(BranchObj*)(parObj);
317 return bo->hasScrolledParent(start);
322 void BranchObj::tmpUnscroll()
324 // Unscroll parent (recursivly)
325 BranchObj* bo=(BranchObj*)(parObj);
326 if (bo) bo->tmpUnscroll();
332 systemFlags->activate("tmpUnscrolledright");
337 void BranchObj::resetTmpUnscroll()
339 // Unscroll parent (recursivly)
340 BranchObj* bo=(BranchObj*)(parObj);
342 bo->resetTmpUnscroll();
348 systemFlags->deactivate("tmpUnscrolledright");
353 void BranchObj::setVisibility(bool v, int toDepth)
355 if (depth <= toDepth)
357 frame->setVisibility(v);
358 heading->setVisibility(v);
359 systemFlags->setVisibility(v);
360 standardFlags->setVisibility(v);
361 LinkableMapObj::setVisibility (v);
363 // Only change childs, if I am not scrolled
364 if (!scrolled && (depth < toDepth))
366 // Now go recursivly through all childs
368 for (b=branch.first(); b;b=branch.next() )
369 b->setVisibility (v,toDepth);
371 for (fio=floatimage.first(); fio; fio=floatimage.next())
372 fio->setVisibility (v);
374 for (xlo=xlink.first(); xlo;xlo=xlink.next() )
375 xlo->setVisibility ();
377 } // depth <= toDepth
381 void BranchObj::setVisibility(bool v)
383 setVisibility (v,MAX_DEPTH);
387 void BranchObj::setLinkColor ()
389 // Overloaded from LinkableMapObj
390 // BranchObj can use color of heading
393 if (mapEditor->getLinkColorHint()==HeadingColor)
394 LinkableMapObj::setLinkColor (heading->getColor() );
396 LinkableMapObj::setLinkColor ();
399 void BranchObj::setColorChilds (QColor col)
401 OrnamentedObj::setColor (col);
403 for (bo=branch.first(); bo; bo=branch.next() )
404 bo->setColorChilds(col);
407 BranchObj* BranchObj::first()
414 BranchObj* BranchObj::next()
417 BranchObj *bo=branch.first();
418 BranchObj *po=(BranchObj*)(parObj);
423 { // We are just beginning,
424 // return first child
437 { // We come from above
440 // there are childs, go there
445 { // no childs, try to go up again
457 // can't go up, I am mapCenter
464 // Try to find last child, where we came from, in my own childs
466 while (bo && searching)
468 if (itLast==bo) searching=false;
472 { // found lastLMO in my childs
475 // found a brother of lastLMO
483 if (this==itFirst) return NULL; // Stop at starting point
492 // can't go up, I am mapCenter
499 // couldn't find last child, it must be a nephew of mine
503 // proceed with my first child
509 // or go back to my parents
520 // can't go up, I am mapCenter
527 BranchObj* BranchObj::getLastIterator()
532 void BranchObj::setLastIterator(BranchObj* it)
537 void BranchObj::positionContents()
540 for (fio=floatimage.first(); fio; fio=floatimage.next() )
542 OrnamentedObj::positionContents();
545 void BranchObj::move (double x, double y)
547 OrnamentedObj::move (x,y);
549 for (fio=floatimage.first(); fio; fio=floatimage.next() )
554 void BranchObj::move (QPoint p)
559 void BranchObj::moveBy (double x, double y)
561 OrnamentedObj::moveBy (x,y);
563 for (b=branch.first(); b;b=branch.next() )
568 void BranchObj::moveBy (QPoint p)
570 moveBy (p.x(), p.y());
574 void BranchObj::positionBBox()
576 QPoint ap=getAbsPos();
577 bbox.moveTopLeft (ap);
582 frame->setRect(QRect(bbox.x(),bbox.y(),bbox.width(),bbox.height() ) );
584 // Update links to other branches
586 for (xlo=xlink.first(); xlo; xlo=xlink.next() )
590 void BranchObj::calcBBoxSize()
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();
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);
610 // Save the dimension of flags and heading
611 ornamentsBBox.setSize ( QSize(w,h));
613 // clickBox includes Flags and Heading
614 clickBox.setSize (ornamentsBBox.size() );
620 topPad=botPad=leftPad=rightPad=0;
621 if (includeImagesVer || includeImagesHor)
623 if (countFloatImages()>0)
625 for (foi=floatimage.first(); foi; foi=floatimage.next() )
628 if (includeImagesVer)
631 topPad=max (topPad,-rp.y()-h);
632 if (rp.y()+foi->height() > 0)
633 botPad=max (botPad,rp.y()+foi->height());
635 if (includeImagesHor)
637 if (orientation==OrientRightOfCenter)
640 leftPad=max (leftPad,-rp.x()-w);
641 if (rp.x()+foi->width() > 0)
642 rightPad=max (rightPad,rp.x()+foi->width());
646 leftPad=max (leftPad,-rp.x());
647 if (rp.x()+foi->width() > w)
648 rightPad=max (rightPad,rp.x()+foi->width()-w);
658 w+=frame->getBorder();
659 h+=frame->getBorder();
662 bbox.setSize (QSize (w,h));
665 void BranchObj::setDockPos()
667 // Sets childpos and parpos depending on orientation
668 if (getOrientation()==OrientLeftOfCenter )
670 childPos=QPoint (ornamentsBBox.bottomLeft().x(), ornamentsBBox.bottomLeft().y() );
671 parPos=QPoint (ornamentsBBox.bottomRight().x(),ornamentsBBox.bottomRight().y() );
674 childPos=QPoint (ornamentsBBox.bottomRight().x(), ornamentsBBox.bottomRight().y() );
675 parPos=QPoint (ornamentsBBox.bottomLeft().x(),ornamentsBBox.bottomLeft().y() );
679 LinkableMapObj* BranchObj::findMapObj(QPoint p, LinkableMapObj* excludeLMO)
684 for (b=branch.first(); b; b=branch.next() )
686 lmo=b->findMapObj(p, excludeLMO);
687 if (lmo != NULL) return lmo;
691 if (inBox (p) && (this != excludeLMO) && isVisibleObj() )
694 // Search float images
696 for (foi=floatimage.first(); foi; foi=floatimage.next() )
698 (foi != excludeLMO) &&
699 foi->getParObj()!= excludeLMO &&
706 void BranchObj::setHeading(QString s)
708 heading->setText(s); // set new heading
709 calcBBoxSize(); // recalculate bbox
710 positionBBox(); // rearrange contents
714 void BranchObj::setHideTmp (HideTmpMode mode)
716 if (mode==HideExport && hasHiddenExportParent(this))
718 setVisibility (false);
722 if (hasScrolledParent(this))
723 setVisibility (false);
725 setVisibility (true);
730 for (bo=branch.first(); bo; bo=branch.next() )
731 bo->setHideTmp (mode);
734 bool BranchObj::hasHiddenExportParent(BranchObj *start)
736 // Calls parents recursivly to
737 // find out, if we are temp. hidden
739 if (hideExport) return true;
741 BranchObj* bo=(BranchObj*)(parObj);
743 return bo->hasHiddenExportParent(start);
748 QString BranchObj::saveToDir (const QString &tmpdir,const QString &prefix, const QPoint& offset)
750 if (hidden) return "";
753 QString scrolledAttr;
755 scrolledAttr=attribut ("scrolled","yes");
760 if (frame->getFrameType()!=NoFrame)
761 frameAttr=attribut ("frameType",frame->getFrameTypeName());
765 // save area, if not scrolled
767 if (!((BranchObj*)(parObj))->isScrolled() )
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));
778 // Providing an ID for a branch makes export to XHTML easier
781 idAttr=attribut ("id",getSelectString());
785 s=beginElement ("branch"
791 +getIncludeImageAttr() );
795 for (int i=1; i<depth;i++) cout << " ";
796 cout <<getHeading().ascii()<<endl;
800 s+=valueElement("heading", getHeading(),
801 attribut ("textColor",QColor(heading->getColor()).name()));
803 // save names of flags set
804 s+=standardFlags->saveToDir(tmpdir,prefix,0);
808 for (fio=floatimage.first(); fio; fio=floatimage.next() )
809 s+=fio->saveToDir (tmpdir,prefix);
812 if (!note.isEmpty() )
817 for (bo=branch.first(); bo; bo=branch.next() )
818 s+=bo->saveToDir(tmpdir,prefix,offset);
822 QString ol; // old link
823 QString cl; // current link
824 for (xlo=xlink.first(); xlo; xlo=xlink.next() )
833 qWarning (QString("Ignoring of duplicate xLink in %1").arg(getHeading()));
838 s+=endElement ("branch");
842 void BranchObj::addXLink (XLinkObj *xlo)
848 void BranchObj::removeXLinkRef (XLinkObj *xlo)
853 void BranchObj::deleteXLink(XLinkObj *xlo)
856 if (!xlo->isUsed()) delete (xlo);
859 void BranchObj::deleteXLinkAt (int i)
861 XLinkObj *xlo=xlink.at(i);
863 if (!xlo->isUsed()) delete(xlo);
866 XLinkObj* BranchObj::XLinkAt (int i)
871 int BranchObj::countXLink()
873 return xlink.count();
877 BranchObj* BranchObj::XLinkTargetAt (int i)
880 return xlink.at(i)->otherBranch (this);
885 void BranchObj::setIncludeImagesVer(bool b)
893 bool BranchObj::getIncludeImagesVer()
895 return includeImagesVer;
898 void BranchObj::setIncludeImagesHor(bool b)
906 bool BranchObj::getIncludeImagesHor()
908 return includeImagesHor;
911 QString BranchObj::getIncludeImageAttr()
914 if (includeImagesVer)
915 a=attribut ("incImgV","true");
917 a=attribut ("incImgV","false");
918 if (includeImagesHor)
919 a+=attribut ("incImgH","true");
921 a+=attribut ("incImgH","false");
925 LinkableMapObj* BranchObj::addFloatImage ()
927 FloatImageObj *newfi=new FloatImageObj (canvas,this);
928 floatimage.append (newfi);
929 if (hasScrolledParent(this) )
930 newfi->setVisibility (false);
932 newfi->setVisibility(visible);
939 LinkableMapObj* BranchObj::addFloatImage (FloatImageObj *fio)
941 FloatImageObj *newfi=new FloatImageObj (canvas,this);
942 floatimage.append (newfi);
944 if (hasScrolledParent(this) )
945 newfi->setVisibility (false);
947 newfi->setVisibility(visible);
954 FloatImageObj* BranchObj::getFirstFloatImage ()
956 return floatimage.first();
959 FloatImageObj* BranchObj::getLastFloatImage ()
961 return floatimage.last();
964 FloatImageObj* BranchObj::getFloatImageNum (const uint &i)
966 return floatimage.at(i);
969 void BranchObj::removeFloatImage (FloatImageObj *fio)
971 floatimage.remove (fio);
978 void BranchObj::savePosInAngle ()
980 // Save position in angle
983 for (b=branch.first(); b; b=branch.next() )
990 void BranchObj::setDefAttr (BranchModification mod)
995 case 0: fontsize=16; break;
996 case 1: fontsize=12; break;
997 default: fontsize=10; break;
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 );
1007 setColor (((BranchObj*)(parObj))->getColor());
1012 BranchObj* BranchObj::addBranch()
1014 BranchObj* newbo=new BranchObj(canvas,this);
1015 branch.append (newbo);
1016 newbo->setParObj(this);
1017 newbo->setDefAttr(NewBranch);
1018 newbo->setHeading ("new");
1020 newbo->setVisibility (false);
1022 newbo->setVisibility(visible);
1023 newbo->updateLink();
1024 requestReposition();
1028 BranchObj* BranchObj::addBranch(BranchObj* bo)
1030 BranchObj* newbo=new BranchObj(canvas,this);
1031 branch.append (newbo);
1033 newbo->setParObj(this);
1034 newbo->setDefAttr(MovedBranch);
1036 newbo->setVisibility (false);
1038 newbo->setVisibility(bo->visible);
1039 newbo->updateLink();
1040 requestReposition();
1044 BranchObj* BranchObj::addBranchPtr(BranchObj* bo)
1047 bo->setParObj (this);
1049 bo->setDefAttr(MovedBranch);
1050 if (scrolled) tmpUnscroll();
1051 setLastSelectedBranch (bo);
1055 BranchObj* BranchObj::insertBranch(int pos)
1058 // Add new bo and resort branches
1059 BranchObj *newbo=addBranch ();
1060 newbo->angle=pos-0.5;
1065 BranchObj* BranchObj::insertBranch(BranchObj* bo, int pos)
1068 // Add new bo and resort branches
1070 BranchObj *newbo=addBranch (bo);
1075 BranchObj* BranchObj::insertBranchPtr (BranchObj* bo, int pos)
1078 // Add new bo and resort branches
1081 bo->setParObj (this);
1083 bo->setDefAttr (MovedBranch);
1084 if (scrolled) tmpUnscroll();
1085 setLastSelectedBranch (bo);
1090 void BranchObj::removeBranchHere(BranchObj* borem)
1092 // This removes the branch bo from list, but
1093 // inserts its childs at the place of bo
1095 bo=borem->getLastBranch();
1096 int pos=borem->getNum();
1099 bo->moveBranchTo (this,pos+1);
1100 bo=borem->getLastBranch();
1102 removeBranch (borem);
1105 void BranchObj::removeChilds()
1110 void BranchObj::removeBranch(BranchObj* bo)
1112 // if bo is not in branch remove returns false, we
1115 if (branch.remove (bo))
1118 qWarning ("BranchObj::removeBranch tried to remove non existing branch?!\n");
1119 requestReposition();
1122 void BranchObj::removeBranchPtr(BranchObj* bo)
1125 requestReposition();
1128 void BranchObj::setLastSelectedBranch (BranchObj* bo)
1130 lastSelectedBranch=branch.find(bo);
1133 BranchObj* BranchObj::getLastSelectedBranch ()
1135 if (lastSelectedBranch>=0)
1137 BranchObj* bo=branch.at(lastSelectedBranch);
1140 return branch.first();
1143 BranchObj* BranchObj::getFirstBranch ()
1145 return branch.first();
1148 BranchObj* BranchObj::getLastBranch ()
1150 return branch.last();
1153 BranchObj* BranchObj::getBranchNum (const uint &i)
1155 return branch.at(i);
1158 bool BranchObj::canMoveBranchUp()
1160 if (!parObj || depth==1) return false;
1161 BranchObj* par=(BranchObj*)parObj;
1162 if (this==par->getFirstBranch())
1168 BranchObj* BranchObj::moveBranchUp(BranchObj* bo1) // modify my childlist
1171 int i=branch.find(bo1);
1172 cout << "BO: i="<<i<<endl;
1174 { // -1 if bo1 not found
1175 branch.at(i)->angle--;
1176 branch.at(i-1)->angle++;
1178 return branch.at(i);
1183 bool BranchObj::canMoveBranchDown()
1185 if (!parObj|| depth==1) return false;
1186 BranchObj* par=(BranchObj*)parObj;
1187 if (this==par->getLastBranch())
1193 BranchObj* BranchObj::moveBranchDown(BranchObj* bo1)// modify my childlist
1196 int i=branch.find(bo1);
1201 branch.at(i)->angle++;
1202 branch.at(j)->angle--;
1204 return branch.at(i);
1209 BranchObj* BranchObj::moveBranchTo (BranchObj* dst, int pos)
1211 // Find current parent and
1212 // remove pointer to myself there
1213 if (!dst) return NULL;
1214 BranchObj *par=(BranchObj*)parObj;
1216 par->removeBranchPtr (this);
1220 // Create new pointer to myself at dst
1221 if (pos<0||dst->getDepth()==0)
1223 // links myself as last branch at dst
1224 dst->addBranchPtr (this);
1229 // inserts me at pos in parent of dst
1232 BranchObj *bo=dst->insertBranchPtr (this,pos);
1233 bo->setDefAttr(MovedBranch);
1242 void BranchObj::alignRelativeTo (QPoint ref)
1244 int th = bboxTotal.height();
1247 cout << "BO::alignRelTo "<<getHeading().ascii()<<endl;
1248 cout << " d="<<depth<<
1250 // " bbox.topLeft="<<bboxTotal.topLeft()<<
1251 " absPos="<<absPos<<
1252 " relPos="<<relPos<<
1253 " orient="<<orientation<<
1254 // " pad="<<topPad<<","<<botPad<<","<<leftPad<<","<<rightPad<<
1255 // " hidden="<<hidden<<
1267 // Position relatively, if needed
1268 //if (useRelPos) move2RelPos (relPos.x(), relPos.y());
1270 // Calc angle to mapCenter if I am a mainbranch
1271 // needed for reordering the mainbranches clockwise
1273 angle=getAngle (QPoint ((int)(x() - parObj->getChildPos().x() ),
1274 (int)(y() - parObj->getChildPos().y() ) ) );
1279 // Align myself depending on orientation and parent, but
1280 // only if I am not a mainbranch or mapcenter itself
1282 o=parObj->getOrientation();
1283 switch (orientation)
1285 case OrientLeftOfCenter:
1286 move (ref.x() - bbox.width(), ref.y() + (th-bbox.height())/2 );
1288 case OrientRightOfCenter:
1289 move (ref.x() , ref.y() + (th-bbox.height())/2 );
1292 qWarning ("LMO::alignRelativeTo: oops, no orientation given...");
1297 if (scrolled) return;
1299 // Set reference point for alignment of childs
1301 if (orientation==OrientLeftOfCenter)
1302 ref2.setX(bbox.topLeft().x() - linkwidth);
1304 ref2.setX(bbox.topRight().x() + linkwidth);
1307 ref2.setY(absPos.y()-(bboxTotal.height()-bbox.height())/2);
1309 ref2.setY(ref.y() );
1311 // Align the childs depending on reference point
1313 for (b=branch.first(); b; b=branch.next() )
1317 b->alignRelativeTo (ref2);
1318 ref2.setY(ref2.y() + b->getBBoxSizeWithChilds().height() );
1324 void BranchObj::reposition()
1326 /* TODO testing only
1327 if (!getHeading().isEmpty())
1328 cout << "BO::reposition "<<getHeading().ascii()<<endl;
1330 cout << "BO::reposition ???"<<endl;
1332 cout << " orient="<<orientation<<endl;
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...
1345 alignRelativeTo ( QPoint (absPos.x(),
1346 absPos.y()-(bboxTotal.height()-bbox.height())/2) );
1348 positionBBox(); // Reposition bbox and contents
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) );
1358 void BranchObj::unsetAllRepositionRequests()
1360 repositionRequest=false;
1362 for (b=branch.first(); b; b=branch.next() )
1364 b->unsetAllRepositionRequests();
1369 QRect BranchObj::getTotalBBox()
1373 if (scrolled) return r;
1376 for (b=branch.first();b ;b=branch.next() )
1378 r=addBBox(b->getTotalBBox(),r);
1381 for (fio=floatimage.first();fio ;fio=floatimage.next() )
1382 if (!fio->isHidden())
1383 r=addBBox(fio->getTotalBBox(),r);
1388 QRect BranchObj::getBBoxSizeWithChilds()
1393 void BranchObj::calcBBoxSizeWithChilds()
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
1401 // Calculate size of LMO including all childs (to align them later)
1402 bboxTotal.setX(bbox.x() );
1403 bboxTotal.setY(bbox.y() );
1405 // if branch is scrolled, ignore childs, but still consider floatimages
1408 bboxTotal.setWidth (bbox.width());
1409 bboxTotal.setHeight(bbox.height());
1415 bboxTotal.setWidth (0);
1416 bboxTotal.setHeight(0);
1419 bboxTotal.setX (parObj->x());
1420 bboxTotal.setY (parObj->y());
1423 bboxTotal.setX (bbox.x());
1424 bboxTotal.setY (bbox.y());
1431 // Now calculate recursivly
1433 // maximum of widths
1436 for (b=branch.first();b ;b=branch.next() )
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());
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() );
1452 bboxTotal.setWidth (bbox.width() + r.width() + linkwidth);
1454 bboxTotal.setHeight(max (r.height(), bbox.height()));
1457 void BranchObj::select()
1459 // set Text in Editor
1460 textEditor->setText(note.getNote() );
1461 QString fnh=note.getFilenameHint();
1463 textEditor->setFilenameHint(note.getFilenameHint() );
1465 textEditor->setFilenameHint(getHeading() );
1466 textEditor->setFontHint (note.getFontHint() );
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);
1474 // temporary unscroll, if we have scrolled parents somewhere
1475 if (parObj) ((BranchObj*)(parObj))->tmpUnscroll();
1477 // Show URL and link in statusbar
1479 if (!url.isEmpty()) status+="URL: "+url+" ";
1480 if (!vymLink.isEmpty()) status+="Link: "+vymLink;
1481 if (!status.isEmpty()) mainWindow->statusMessage (status);
1484 updateFlagsToolbar();
1486 // Update actions in mapeditor
1487 mapEditor->updateActions();
1490 void BranchObj::unselect()
1492 LinkableMapObj::unselect();
1493 // Delete any messages like vymLink in StatusBar
1494 mainWindow->statusMessage ("");
1496 // save note from editor and set flag
1497 // text is done by updateNoteFlag(), just save
1499 note.setFilenameHint (textEditor->getFilename());
1501 // reset temporary unscroll, if we have scrolled parents somewhere
1502 if (parObj) ((BranchObj*)(parObj))->resetTmpUnscroll();
1504 // Erase content of editor
1505 textEditor->setInactive();
1507 // unselect all buttons in toolbar
1508 standardFlagsDefault->updateToolbar();
1511 QString BranchObj::getSelectString()
1517 s= "bo:" + QString("%1").arg(getNum());
1519 s= ((BranchObj*)(parObj))->getSelectString() + ",bo:" + QString("%1").arg(getNum());