insilmaril@95: #include "xlinkobj.h" insilmaril@95: #include "branchobj.h" insilmaril@97: #include "mapeditor.h" insilmaril@95: insilmaril@95: insilmaril@95: ///////////////////////////////////////////////////////////////// insilmaril@95: // XLinkObj insilmaril@95: ///////////////////////////////////////////////////////////////// insilmaril@95: insilmaril@95: int XLinkObj::arrowSize=10; // make instances insilmaril@95: insilmaril@95: XLinkObj::XLinkObj ():MapObj() insilmaril@95: { insilmaril@95: // cout << "Const XLinkObj ()\n"; insilmaril@95: init(); insilmaril@95: } insilmaril@95: insilmaril@95: XLinkObj::XLinkObj (QCanvas* c):MapObj(c) insilmaril@95: { insilmaril@95: // cout << "Const XLinkObj (c) called from MapCenterObj (c)\n"; insilmaril@95: init(); insilmaril@95: } insilmaril@95: insilmaril@95: insilmaril@95: XLinkObj::~XLinkObj () insilmaril@95: { insilmaril@95: // cout << "Destr XLinkObj\n"; insilmaril@95: if (xLinkState!=undefinedXLink) insilmaril@95: deactivate(); insilmaril@95: delete (line); insilmaril@95: delete (poly); insilmaril@95: } insilmaril@95: insilmaril@95: void XLinkObj::init () insilmaril@95: { insilmaril@95: beginBranch=NULL; insilmaril@95: endBranch=NULL; insilmaril@95: visBranch=NULL; insilmaril@95: xLinkState=undefinedXLink; insilmaril@95: insilmaril@97: color=QColor (180,180,180); insilmaril@95: line=new QCanvasLine (canvas); insilmaril@102: width=1; insilmaril@102: line->setPen (QPen(color, width)); insilmaril@97: line->setZ (Z_XLINK); insilmaril@95: insilmaril@95: poly=new QCanvasPolygon (canvas); insilmaril@97: poly->setBrush( color ); insilmaril@97: poly->setZ (Z_XLINK); insilmaril@95: insilmaril@95: setVisibility (false); insilmaril@95: } insilmaril@95: insilmaril@95: void XLinkObj::copy (XLinkObj* other) insilmaril@95: { insilmaril@106: // TODO copy not used yet insilmaril@95: MapObj::copy (other); insilmaril@95: setVisibility (other->visible); insilmaril@95: beginBranch=other->beginBranch; insilmaril@95: endBranch=other->endBranch; insilmaril@95: } insilmaril@95: insilmaril@95: void XLinkObj::setBegin (BranchObj *bo) insilmaril@95: { insilmaril@95: if (bo) insilmaril@95: { insilmaril@95: xLinkState=initXLink; insilmaril@95: beginBranch=bo; insilmaril@95: beginPos=beginBranch->getChildPos(); insilmaril@95: } insilmaril@95: } insilmaril@95: insilmaril@298: BranchObj* XLinkObj::getBegin () insilmaril@298: { insilmaril@298: return beginBranch; insilmaril@298: } insilmaril@298: insilmaril@95: void XLinkObj::setEnd (BranchObj *bo) insilmaril@95: { insilmaril@95: if (bo) insilmaril@95: { insilmaril@95: xLinkState=initXLink; insilmaril@95: endBranch=bo; insilmaril@95: endPos=endBranch->getChildPos(); insilmaril@95: } insilmaril@95: } insilmaril@95: insilmaril@298: BranchObj* XLinkObj::getEnd() insilmaril@298: { insilmaril@298: return endBranch; insilmaril@298: } insilmaril@298: insilmaril@97: void XLinkObj::setWidth (int w) insilmaril@97: { insilmaril@97: width=w; insilmaril@97: setColor (color); insilmaril@97: } insilmaril@97: insilmaril@97: int XLinkObj::getWidth() insilmaril@97: { insilmaril@97: return width; insilmaril@97: } insilmaril@97: insilmaril@95: void XLinkObj::setColor(QColor c) insilmaril@95: { insilmaril@97: color=c; insilmaril@97: line->setPen (QPen(color, width)); insilmaril@97: poly->setBrush( color ); insilmaril@97: } insilmaril@97: insilmaril@97: QColor XLinkObj::getColor() insilmaril@97: { insilmaril@97: return color; insilmaril@95: } insilmaril@95: insilmaril@95: void XLinkObj::setEnd (QPoint p) insilmaril@95: { insilmaril@95: endPos=p; insilmaril@95: } insilmaril@95: insilmaril@95: bool XLinkObj::activate () insilmaril@95: { insilmaril@95: if (beginBranch && endBranch) insilmaril@95: { insilmaril@104: if (beginBranch==endBranch) return false; insilmaril@95: xLinkState=activeXLink; insilmaril@95: beginBranch->addXLink (this); insilmaril@95: endBranch->addXLink (this); insilmaril@103: setVisibility (); insilmaril@95: return true; insilmaril@95: } else insilmaril@95: return false; insilmaril@95: } insilmaril@95: insilmaril@95: void XLinkObj::deactivate () insilmaril@95: { insilmaril@95: if (beginBranch) insilmaril@95: beginBranch->removeXLinkRef (this); insilmaril@95: beginBranch=NULL; insilmaril@95: if (endBranch) insilmaril@95: endBranch->removeXLinkRef (this); insilmaril@95: endBranch=NULL; insilmaril@95: visBranch=NULL; insilmaril@95: xLinkState=undefinedXLink; insilmaril@95: insilmaril@95: line->hide(); insilmaril@95: } insilmaril@95: insilmaril@95: bool XLinkObj::isUsed() insilmaril@95: { insilmaril@95: if (beginBranch || endBranch || xLinkState!=undefinedXLink) insilmaril@95: return true; insilmaril@95: else insilmaril@95: return false; insilmaril@95: } insilmaril@95: insilmaril@95: void XLinkObj::updateXLink() insilmaril@95: { insilmaril@95: QPoint a,b; insilmaril@95: QPointArray pa (3); insilmaril@95: if (visBranch) insilmaril@95: { insilmaril@95: // Only one of the linked branches is visible insilmaril@95: a=b=visBranch->getChildPos(); insilmaril@95: if (visBranch->getOrientation()==OrientRightOfCenter) insilmaril@95: { insilmaril@95: b.setX (b.x()+25); insilmaril@95: pa.putPoints (0,3, insilmaril@95: b.x(),b.y(), insilmaril@95: b.x()-arrowSize,b.y()-arrowSize, insilmaril@95: b.x()-arrowSize,b.y()+arrowSize insilmaril@95: ); insilmaril@95: poly->setPoints (pa); insilmaril@95: } else insilmaril@95: { insilmaril@95: b.setX (b.x()-25); insilmaril@95: pa.putPoints (0,3, insilmaril@95: b.x(),b.y(), insilmaril@95: b.x()+arrowSize,b.y()-arrowSize, insilmaril@95: b.x()+arrowSize,b.y()+arrowSize); insilmaril@95: poly->setPoints (pa); insilmaril@95: } insilmaril@95: } else insilmaril@95: { insilmaril@95: // Both linked branches are visible insilmaril@95: if (beginBranch) insilmaril@95: // If a link is just drawn in the editor, insilmaril@95: // we have already a beginBranch insilmaril@95: a=beginBranch->getChildPos(); insilmaril@95: else insilmaril@95: // This shouldn't be reached normally... insilmaril@95: a=beginPos; insilmaril@95: if (xLinkState==activeXLink && endBranch) insilmaril@95: b=endBranch->getChildPos(); insilmaril@95: else insilmaril@95: b=endPos; insilmaril@95: } insilmaril@95: insilmaril@95: insilmaril@95: if (line->startPoint()==a && line->endPoint()==b && !visBranch) insilmaril@95: { insilmaril@95: // update is called from both branches, so only insilmaril@95: // update if something has changed insilmaril@95: return; insilmaril@95: } insilmaril@95: else insilmaril@95: { insilmaril@95: beginPos=a; insilmaril@95: endPos=b; insilmaril@102: line->setPen (QPen(color, width)); insilmaril@95: line->setPoints (a.x(), a.y(), b.x(), b.y()); insilmaril@95: } insilmaril@95: } insilmaril@95: insilmaril@95: BranchObj* XLinkObj::otherBranch(BranchObj* thisBranch) insilmaril@95: { insilmaril@95: if (!beginBranch && !endBranch) insilmaril@95: return NULL; insilmaril@95: if (thisBranch==beginBranch) insilmaril@95: return endBranch; insilmaril@95: else insilmaril@95: return beginBranch; insilmaril@95: } insilmaril@95: insilmaril@95: void XLinkObj::positionBBox() insilmaril@95: { insilmaril@95: } insilmaril@95: insilmaril@95: void XLinkObj::calcBBoxSize() insilmaril@95: { insilmaril@95: } insilmaril@95: insilmaril@95: void XLinkObj::setVisibility (bool b) insilmaril@95: { insilmaril@95: MapObj::setVisibility (b); insilmaril@95: if (b) insilmaril@95: { insilmaril@95: line->show(); insilmaril@95: if (visBranch) insilmaril@95: poly->show(); insilmaril@95: else insilmaril@95: poly->hide(); insilmaril@95: } insilmaril@95: else insilmaril@95: { insilmaril@95: line->hide(); insilmaril@95: poly->hide(); insilmaril@95: } insilmaril@95: } insilmaril@95: insilmaril@95: void XLinkObj::setVisibility () insilmaril@95: { insilmaril@95: if (beginBranch && endBranch) insilmaril@95: { insilmaril@95: if(beginBranch->isVisibleObj() && endBranch->isVisibleObj()) insilmaril@95: { // Both ends are visible insilmaril@95: visBranch=NULL; insilmaril@95: setVisibility (true); insilmaril@95: } else insilmaril@95: { insilmaril@95: if(!beginBranch->isVisibleObj() && !endBranch->isVisibleObj()) insilmaril@95: { //None of the ends is visible insilmaril@95: visBranch=NULL; insilmaril@95: setVisibility (false); insilmaril@95: } else insilmaril@95: { // Just one end is visible, draw a symbol that shows insilmaril@95: // that there is a link to a scrolled branch insilmaril@95: if (beginBranch->isVisibleObj()) insilmaril@95: visBranch=beginBranch; insilmaril@95: else insilmaril@95: visBranch=endBranch; insilmaril@95: setVisibility (true); insilmaril@95: } insilmaril@95: } insilmaril@95: } insilmaril@95: } insilmaril@95: insilmaril@95: QString XLinkObj::saveToDir () insilmaril@95: { insilmaril@103: QString s=""; insilmaril@103: if (beginBranch && endBranch &&xLinkState==activeXLink) insilmaril@95: { insilmaril@103: if (beginBranch==endBranch && xLinkState) insilmaril@103: s=""; insilmaril@106: else insilmaril@103: { insilmaril@103: QString colAttr=attribut ("color",color.name()); insilmaril@103: QString widAttr=attribut ("width",QString().setNum(width,10)); insilmaril@103: QString begSelAttr=attribut ("beginBranch",beginBranch->getSelectString()); insilmaril@103: QString endSelAttr=attribut ("endBranch", endBranch->getSelectString()); insilmaril@103: s=beginElement ("xlink", colAttr +widAttr +begSelAttr +endSelAttr); insilmaril@95: insilmaril@103: s+=endElement ("xlink"); insilmaril@103: } insilmaril@95: } insilmaril@95: return s; insilmaril@95: } insilmaril@95: