diff -r 9eb7767c2dfa -r 608f976aa7bb branchobj.cpp --- a/branchobj.cpp Sun Jan 30 12:58:47 2005 +0000 +++ b/branchobj.cpp Tue Jun 06 14:58:11 2006 +0000 @@ -24,13 +24,14 @@ depth=-1; } -BranchObj::BranchObj (QCanvas* c):OrnamentedObj (c) +BranchObj::BranchObj (Q3Canvas* c):OrnamentedObj (c) { // cout << "Const BranchObj (c) called from MapCenterObj (c)\n"; + parObj=NULL; canvas=c; } -BranchObj::BranchObj (QCanvas* c, LinkableMapObj* p):OrnamentedObj (c) +BranchObj::BranchObj (Q3Canvas* c, LinkableMapObj* p):OrnamentedObj (c) { // cout << "Const BranchObj (c,p)\n"; canvas=c; @@ -47,16 +48,18 @@ BranchObj::~BranchObj () { - //cout << "Destr BranchObj\n"; +// cout << "Destr BranchObj of "<getLastBranch(); + bo=((BranchObj*)(parObj))->getLastBranch(); if (!bo) po->unScroll(); } + clear(); } bool BranchObj::operator< ( const BranchObj & other ) @@ -69,7 +72,7 @@ return angle == other.angle; } -int BranchObjPtrList::compareItems ( QPtrCollection::Item i, QPtrCollection::Item j) +int BranchObjPtrList::compareItems ( Q3PtrCollection::Item i, Q3PtrCollection::Item j) { // Make sure PtrList::find works if (i==j) return 0; @@ -82,17 +85,15 @@ void BranchObj::init () { - branch.setAutoDelete (true); + branch.setAutoDelete (false); floatimage.setAutoDelete (true); + xlink.setAutoDelete (false); - absPos=getRandPos(); - absPos+=parObj->getChildPos(); - - // TODO This should be done in TextObj later - QFont font("Sans Serif,8,-1,5,50,0,0,0,0,0"); -// font.setPointSize(12); - heading->setFont(font ); -// heading->setText(QObject::tr("new branch")); + if (parObj) + { + absPos=getRandPos(); + absPos+=parObj->getChildPos(); + } lastSelectedBranch=-1; @@ -101,8 +102,8 @@ scrolled=false; tmpUnscrolled=false; - url=""; - vymLink=""; + includeImagesVer=false; + includeImagesHor=false; } void BranchObj::copy (BranchObj* other) @@ -125,9 +126,6 @@ tmpUnscrolled=other->tmpUnscrolled; setVisibility (other->visible); - url=other->url; - vymLink=other->vymLink; - angle=other->angle; positionBBox(); @@ -135,8 +133,17 @@ void BranchObj::clear() { - branch.clear(); floatimage.clear(); + while (!xlink.isEmpty()) + deleteXLink (xlink.first() ); + + BranchObj *bo; + while (!branch.isEmpty()) + { + bo=branch.first(); + branch.removeFirst(); + delete (bo); + } } int BranchObj::getNum() @@ -149,7 +156,12 @@ int BranchObj::getNum(BranchObj *bo) { - return branch.findRef (bo); + // keep current pointer in branch, + // otherwise save might fail + int cur=branch.at(); + int ind=branch.findRef (bo); + branch.at(cur); + return ind; } int BranchObj::getFloatImageNum(FloatImageObj *fio) @@ -167,6 +179,11 @@ return floatimage.count(); } +int BranchObj::countXLinks() +{ + return xlink.count(); +} + void BranchObj::setParObjTmp(LinkableMapObj* lmo, QPoint m, int off) { // Temporary link to lmo @@ -181,19 +198,10 @@ // ignore mapcenter and mainbranch if (lmo->getDepth()<2) off=0; if (off==0) - { link2ParPos=false; - parObj=o; - } else - { link2ParPos=true; - if (off>0) - parObj=o->getParObj(); - else - parObj=o->getParObj(); - parObj=o; - } + parObj=o; depth=parObj->getDepth()+1; @@ -254,6 +262,7 @@ parObjTmpBuf=NULL; depth=parObj->getDepth()+1; setLinkStyle (getDefLinkStyle() ); + updateLink(); } } @@ -350,6 +359,7 @@ standardFlags->setVisibility(v); LinkableMapObj::setVisibility (v); + // Only change childs, if I am not scrolled if (!scrolled && (depth < toDepth)) { // Now go recursivly through all childs @@ -359,9 +369,11 @@ FloatImageObj *fio; for (fio=floatimage.first(); fio; fio=floatimage.next()) fio->setVisibility (v); + XLinkObj* xlo; + for (xlo=xlink.first(); xlo;xlo=xlink.next() ) + xlo->setVisibility (); } } // depth <= toDepth - move (absPos.x(), absPos.y() ); requestReposition(); } @@ -376,25 +388,21 @@ // Overloaded from LinkableMapObj // BranchObj can use color of heading - if (mapEditor->getLinkColorHint()==HeadingColor) - LinkableMapObj::setLinkColor (heading->getColor() ); - else - LinkableMapObj::setLinkColor (); + if (mapEditor) + if (mapEditor->getLinkColorHint()==HeadingColor) + LinkableMapObj::setLinkColor (heading->getColor() ); + else + LinkableMapObj::setLinkColor (); } -void BranchObj::setColor (QColor col, bool colorChilds) +void BranchObj::setColorChilds (QColor col) { - heading->setColor(col); - setLinkColor(); - if (colorChilds) - { - BranchObj *bo; - for (bo=branch.first(); bo; bo=branch.next() ) - bo->setColor(col,colorChilds); - } + OrnamentedObj::setColor (col); + BranchObj *bo; + for (bo=branch.first(); bo; bo=branch.next() ) + bo->setColorChilds(col); } - BranchObj* BranchObj::first() { itLast=NULL; @@ -521,10 +529,20 @@ itLast=it; } +void BranchObj::positionContents() +{ + FloatImageObj *fio; + for (fio=floatimage.first(); fio; fio=floatimage.next() ) + fio->reposition(); + OrnamentedObj::positionContents(); +} void BranchObj::move (double x, double y) { OrnamentedObj::move (x,y); + FloatImageObj *fio; + for (fio=floatimage.first(); fio; fio=floatimage.next() ) + fio->reposition(); positionBBox(); } @@ -536,12 +554,12 @@ void BranchObj::moveBy (double x, double y) { OrnamentedObj::moveBy (x,y); - positionBBox(); BranchObj* b; for (b=branch.first(); b;b=branch.next() ) b->moveBy (x,y); + positionBBox(); } - + void BranchObj::moveBy (QPoint p) { moveBy (p.x(), p.y()); @@ -550,30 +568,25 @@ void BranchObj::positionBBox() { - - heading->positionBBox(); - systemFlags->positionBBox(); - standardFlags->positionBBox(); - // It seems that setting x,y also affects width,height - int w_old=bbox.width(); - int h_old=bbox.height(); - bbox.setX (absPos.x() ); - bbox.setY (absPos.y() ); - bbox.setWidth(w_old); - bbox.setHeight(h_old); - - + QPoint ap=getAbsPos(); + bbox.moveTopLeft (ap); + positionContents(); setSelBox(); // set the frame frame->setRect(QRect(bbox.x(),bbox.y(),bbox.width(),bbox.height() ) ); + + // Update links to other branches + XLinkObj *xlo; + for (xlo=xlink.first(); xlo; xlo=xlink.next() ) + xlo->updateXLink(); } void BranchObj::calcBBoxSize() { QSize heading_r=heading->getSize(); - int heading_w=static_cast (heading_r.width() ); - int heading_h=static_cast (heading_r.height() ); + int heading_w=(int) heading_r.width() ; + int heading_h=(int) heading_r.height() ; QSize sysflags_r=systemFlags->getSize(); int sysflags_h=sysflags_r.height(); int sysflags_w=sysflags_r.width(); @@ -589,11 +602,73 @@ h=max (sysflags_h,stanflags_h); h=max (h,heading_h); + // Save the dimension of flags and heading + ornamentsBBox.setSize ( QSize(w,h)); + + // clickBox includes Flags and Heading + clickBox.setSize (ornamentsBBox.size() ); + + // Floatimages + QPoint rp; + FloatImageObj *foi; + + topPad=botPad=leftPad=rightPad=0; + if (includeImagesVer || includeImagesHor) + { + if (countFloatImages()>0) + { + for (foi=floatimage.first(); foi; foi=floatimage.next() ) + { + rp=foi->getRelPos(); + if (includeImagesVer) + { + if (rp.y() < 0) + topPad=max (topPad,-rp.y()-h); + if (rp.y()+foi->height() > 0) + botPad=max (botPad,rp.y()+foi->height()); + } + if (includeImagesHor) + { + if (orientation==OrientRightOfCenter) + { + if (-rp.x()-w > 0) + leftPad=max (leftPad,-rp.x()-w); + if (rp.x()+foi->width() > 0) + rightPad=max (rightPad,rp.x()+foi->width()); + } else + { + if (rp.x()< 0) + leftPad=max (leftPad,-rp.x()); + if (rp.x()+foi->width() > w) + rightPad=max (rightPad,rp.x()+foi->width()-w); + } + } + } + } + h+=topPad+botPad; + w+=leftPad+rightPad; + } + + // Frame thickness w+=frame->getBorder(); h+=frame->getBorder(); + + // Finally set size bbox.setSize (QSize (w,h)); } +void BranchObj::setDockPos() +{ + if (getOrientation()==OrientLeftOfCenter ) + { + childPos=QPoint (ornamentsBBox.bottomLeft().x(), ornamentsBBox.bottomLeft().y() ); + parPos=QPoint (ornamentsBBox.bottomRight().x(),ornamentsBBox.bottomRight().y() ); + } else + { + childPos=QPoint (ornamentsBBox.bottomRight().x(), ornamentsBBox.bottomRight().y() ); + parPos=QPoint (ornamentsBBox.bottomLeft().x(),ornamentsBBox.bottomLeft().y() ); + } +} LinkableMapObj* BranchObj::findMapObj(QPoint p, LinkableMapObj* excludeLMO) { // Search branches @@ -606,89 +681,67 @@ } // Search myself - if (inBBox (p) && (this != excludeLMO) && isVisibleObj() ) + if (inBox (p) && (this != excludeLMO) && isVisibleObj() ) return this; // Search float images FloatImageObj *foi; for (foi=floatimage.first(); foi; foi=floatimage.next() ) - if (foi->inBBox(p) && (foi != excludeLMO) && foi->getParObj()!= excludeLMO) return foi; + if (foi->inBox(p) && + (foi != excludeLMO) && + foi->getParObj()!= excludeLMO && + foi->isVisibleObj() + ) return foi; return NULL; } void BranchObj::setHeading(QString s) { - // Adjusting font size - QFont font=heading->getFont(); - if (depth==0) - font.setPointSize(16); - else - if (depth>1) - font.setPointSize(10); - else - font.setPointSize(12); - heading->setFont(font); heading->setText(s); // set new heading calcBBoxSize(); // recalculate bbox positionBBox(); // rearrange contents requestReposition(); } -void BranchObj::setURL(QString s) +void BranchObj::setHideTmp (HideTmpMode mode) { - url=s; - if (!url.isEmpty()) - systemFlags->activate("url"); - else - systemFlags->deactivate("url"); - calcBBoxSize(); // recalculate bbox - positionBBox(); // rearrange contents - forceReposition(); + if (mode==HideExport && hasHiddenExportParent(this)) + { + setVisibility (false); + hidden=true; + }else + { + if (hasScrolledParent(this)) + setVisibility (false); + else + setVisibility (true); + hidden=false; + } + + BranchObj *bo; + for (bo=branch.first(); bo; bo=branch.next() ) + bo->setHideTmp (mode); } -QString BranchObj::getURL() +bool BranchObj::hasHiddenExportParent(BranchObj *start) { - return url; -} + // Calls parents recursivly to + // find out, if we are temp. hidden -void BranchObj::setVymLink(QString s) -{ - if (!s.isEmpty()) - { - // We need the relative (from loading) - // or absolute path (from User event) - // and build the absolute path. - // Note: If we have relative, use path of - // current map to build absolute path - QDir d(s); - if (!d.path().startsWith ("/")) - { - QString p=mapEditor->getDestPath(); - int i=p.findRev("/",-1); - d.setPath(p.left(i)+"/"+s); - d.convertToAbs(); - } - vymLink=d.path(); - systemFlags->activate("vymLink"); - } - else - { - systemFlags->deactivate("vymLink"); - vymLink=""; - } - calcBBoxSize(); // recalculate bbox - positionBBox(); // rearrange contents - forceReposition(); -} + if (hideExport) return true; -QString BranchObj::getVymLink() -{ - return vymLink; + BranchObj* bo=(BranchObj*)(parObj); + if (bo) + return bo->hasHiddenExportParent(start); + else + return false; } QString BranchObj::saveToDir (const QString &tmpdir,const QString &prefix, const QPoint& offset) { + if (hidden) return ""; + QString s,a; QString scrolledAttr; if (scrolled) @@ -696,21 +749,6 @@ else scrolledAttr=""; - QString posAttr; - if (depth<2) posAttr= - attribut("absPosX",QString().setNum(absPos.x(),10)) + - attribut("absPosY",QString().setNum(absPos.y(),10)); - else - posAttr=""; - - QString urlAttr; - if (!url.isEmpty()) - urlAttr=attribut ("url",url); - - QString vymLinkAttr; - if (!vymLink.isEmpty()) - vymLinkAttr=attribut ("vymLink",convertToRel(mapEditor->getDestPath(),vymLink) ); - QString frameAttr; if (frame->getFrameType()!=NoFrame) frameAttr=attribut ("frameType",frame->getFrameTypeName()); @@ -730,11 +768,24 @@ } else areaAttr=""; - s=beginElement ("branch" +scrolledAttr +posAttr +urlAttr +vymLinkAttr +frameAttr +areaAttr); + // Providing an ID for a branch makes export to XHTML easier + QString idAttr; + if (countXLinks()>0) + idAttr=attribut ("id",getSelectString()); + else + idAttr=""; + + s=beginElement ("branch" + +getOrnAttr() + +scrolledAttr + +frameAttr + +areaAttr + +idAttr + +getIncludeImageAttr() ); incIndent(); // save heading - s=s+valueElement("heading", getHeading(), + s+=valueElement("heading", getHeading(), attribut ("textColor",QColor(heading->getColor()).name())); // save names of flags set @@ -748,17 +799,120 @@ BranchObj *bo; for (bo=branch.first(); bo; bo=branch.next() ) s+=bo->saveToDir(tmpdir,prefix,offset); - decIndent(); // Save FloatImages FloatImageObj *fio; for (fio=floatimage.first(); fio; fio=floatimage.next() ) - s+=fio->saveToDir (tmpdir,prefix); + s+=fio->saveToDir (tmpdir,prefix,offset); + // Save XLinks + XLinkObj *xlo; + //FIXME exponential increase in xlinks... + QString ol; // old link + QString cl; // current link + for (xlo=xlink.first(); xlo; xlo=xlink.next() ) + { + cl=xlo->saveToDir(); + if (cl!=ol) + { + s+=cl; + ol=cl; + } else + { + qWarning (QString("Ignoring of duplicate xLink in %1").arg(getHeading())); + } + } + + decIndent(); s+=endElement ("branch"); return s; } +void BranchObj::addXLink (XLinkObj *xlo) +{ + xlink.append (xlo); + +} + +void BranchObj::removeXLinkRef (XLinkObj *xlo) +{ + xlink.remove (xlo); +} + +void BranchObj::deleteXLink(XLinkObj *xlo) +{ + xlo->deactivate(); + if (!xlo->isUsed()) delete (xlo); +} + +void BranchObj::deleteXLinkAt (int i) +{ + XLinkObj *xlo=xlink.at(i); + xlo->deactivate(); + if (!xlo->isUsed()) delete(xlo); +} + +XLinkObj* BranchObj::XLinkAt (int i) +{ + return xlink.at(i); +} + +int BranchObj::countXLink() +{ + return xlink.count(); +} + + +BranchObj* BranchObj::XLinkTargetAt (int i) +{ + if (xlink.at(i)) + return xlink.at(i)->otherBranch (this); + else + return NULL; +} + +void BranchObj::setIncludeImagesVer(bool b) +{ + includeImagesVer=b; + calcBBoxSize(); + positionBBox(); + requestReposition(); + //FIXME undo needed +} + +bool BranchObj::getIncludeImagesVer() +{ + return includeImagesVer; +} + +void BranchObj::setIncludeImagesHor(bool b) +{ + includeImagesHor=b; + calcBBoxSize(); + positionBBox(); + requestReposition(); + //FIXME undo needed +} + +bool BranchObj::getIncludeImagesHor() +{ + return includeImagesHor; +} + +QString BranchObj::getIncludeImageAttr() +{ + QString a; + if (includeImagesVer) + a=attribut ("incImgV","true"); + else + a=attribut ("incImgV","false"); + if (includeImagesHor) + a+=attribut ("incImgH","true"); + else + a+=attribut ("incImgH","false"); + return a; +} + LinkableMapObj* BranchObj::addFloatImage () { FloatImageObj *newfi=new FloatImageObj (canvas,this); @@ -767,8 +921,11 @@ newfi->setVisibility (false); else newfi->setVisibility(visible); + calcBBoxSize(); + positionBBox(); requestReposition(); return newfi; + //FIXME undo needed } LinkableMapObj* BranchObj::addFloatImage (FloatImageObj *fio) @@ -780,8 +937,11 @@ newfi->setVisibility (false); else newfi->setVisibility(visible); + calcBBoxSize(); + positionBBox(); requestReposition(); return newfi; + // FIMXE undo needed } FloatImageObj* BranchObj::getFirstFloatImage () @@ -802,7 +962,10 @@ void BranchObj::removeFloatImage (FloatImageObj *fio) { floatimage.remove (fio); + calcBBoxSize(); + positionBBox(); requestReposition(); + // FIMXE undo needed } void BranchObj::savePosInAngle () @@ -817,19 +980,40 @@ } } +void BranchObj::setDefAttr (BranchModification mod) +{ + int fontsize; + switch (depth) + { + case 0: fontsize=16; break; + case 1: fontsize=12; break; + default: fontsize=10; break; + } + + setLinkColor (); + setLinkStyle(getDefLinkStyle()); + QFont font("Sans Serif,8,-1,5,50,0,0,0,0,0"); + font.setPointSize(fontsize); + heading->setFont(font ); + + if (mod==NewBranch) + setColor (((BranchObj*)(parObj))->getColor()); + + calcBBoxSize(); +} + BranchObj* BranchObj::addBranch() { BranchObj* newbo=new BranchObj(canvas,this); branch.append (newbo); newbo->setParObj(this); - newbo->setColor(getColor(),false); - newbo->setLinkColor(); + newbo->setDefAttr(NewBranch); newbo->setHeading ("new"); - newbo->setLinkStyle (newbo->getDefLinkStyle()); if (scrolled) newbo->setVisibility (false); else newbo->setVisibility(visible); + newbo->updateLink(); requestReposition(); return newbo; } @@ -840,16 +1024,27 @@ branch.append (newbo); newbo->copy(bo); newbo->setParObj(this); - newbo->setHeading (newbo->getHeading()); // adjust fontsize to depth - newbo->setLinkStyle (newbo->getDefLinkStyle()); + newbo->setDefAttr(MovedBranch); if (scrolled) newbo->setVisibility (false); else newbo->setVisibility(bo->visible); + newbo->updateLink(); requestReposition(); return newbo; } +BranchObj* BranchObj::addBranchPtr(BranchObj* bo) +{ + branch.append (bo); + bo->setParObj (this); + bo->depth=depth+1; + bo->setDefAttr(MovedBranch); + if (scrolled) tmpUnscroll(); + setLastSelectedBranch (bo); + return bo; +} + BranchObj* BranchObj::insertBranch(int pos) { savePosInAngle(); @@ -870,11 +1065,56 @@ return newbo; } +BranchObj* BranchObj::insertBranchPtr (BranchObj* bo, int pos) +{ + savePosInAngle(); + // Add new bo and resort branches + bo->angle=pos-0.5; + branch.append (bo); + bo->setParObj (this); + bo->depth=depth+1; + bo->setDefAttr (MovedBranch); + if (scrolled) tmpUnscroll(); + setLastSelectedBranch (bo); + branch.sort(); + return bo; +} + +void BranchObj::removeBranchHere(BranchObj* borem) +{ + // This removes the branch bo from list, but + // inserts its childs at the place of bo + BranchObj *bo; + bo=borem->getLastBranch(); + int pos=borem->getNum(); + while (bo) + { + bo->moveBranchTo (this,pos+1); + bo=borem->getLastBranch(); + } + removeBranch (borem); +} + +void BranchObj::removeChilds() +{ + clear(); +} + void BranchObj::removeBranch(BranchObj* bo) { // if bo is not in branch remove returns false, we // don't care... - branch.remove (bo); + + if (branch.remove (bo)) + delete (bo); + else + qWarning ("BranchObj::removeBranch tried to remove non existing branch?!\n"); + requestReposition(); +} + +void BranchObj::removeBranchPtr(BranchObj* bo) +{ + branch.remove (bo); requestReposition(); } @@ -908,6 +1148,15 @@ return branch.at(i); } +bool BranchObj::canMoveBranchUp() +{ + if (!parObj) return false; + BranchObj* par=(BranchObj*)parObj; + if (this==par->getFirstBranch()) + return false; + else + return true; +} BranchObj* BranchObj::moveBranchUp(BranchObj* bo1) // move a branch up (modify myself) { @@ -923,6 +1172,16 @@ return branch.at(i); } +bool BranchObj::canMoveBranchDown() +{ + if (!parObj) return false; + BranchObj* par=(BranchObj*)parObj; + if (this==par->getLastBranch()) + return false; + else + return true; +} + BranchObj* BranchObj::moveBranchDown(BranchObj* bo1) { savePosInAngle(); @@ -939,29 +1198,63 @@ return branch.at(i); } +BranchObj* BranchObj::moveBranchTo (BranchObj* dst, int pos) +{ + // Find current parent and + // remove pointer to myself there + if (!dst) return NULL; + BranchObj *par=(BranchObj*)(parObj); + if (par) + par->removeBranchPtr (this); + else + return NULL; + + // Create new pointer to myself at dst + if (pos<0||dst->getDepth()==0) + { + // links myself as last branch at dst + dst->addBranchPtr (this); + updateLink(); + return this; + } else + { + // inserts me at pos in parent of dst + if (par) + { + BranchObj *bo=dst->insertBranchPtr (this,pos); + bo->setDefAttr(MovedBranch); + updateLink(); + return bo; + + } else + return NULL; + } +} + void BranchObj::alignRelativeTo (QPoint ref) { -/* FIXME testing - if (!getHeading().isEmpty()) - cout << "BO::alignRelTo "<