4 #include "attributeitem.h"
6 #include "branchitem.h"
10 #include "xlinkitem.h"
15 extern uint itemLastID;
16 extern FlagRow* standardFlagsMaster;
17 extern FlagRow* systemFlagsMaster;
19 extern QTextStream vout;
23 //qDebug() << "Constr. TI this="<<this;
30 TreeItem::TreeItem(const QList<QVariant> &data, TreeItem *parent)
32 //qDebug() << "Constructor TreeItem this="<<this<<" parent="<<parent;
39 rootItem=parentItem->rootItem;
44 //qDebug()<<"Destr TreeItem this="<<this<<" childcount="<<childItems.count();
46 while (!childItems.isEmpty())
48 ti = childItems.takeFirst();
61 uuid = QUuid::createUuid();
83 backgroundColor = Qt::transparent;
85 standardFlags.setMasterRow (standardFlagsMaster);
86 systemFlags.setMasterRow (systemFlagsMaster);
89 void TreeItem::setModel (VymModel *m)
94 VymModel* TreeItem::getModel ()
99 int TreeItem::getRowNumAppend (TreeItem *item)
103 case Attribute: return attributeOffset + attributeCounter;
104 case XLink: return xlinkOffset + xlinkCounter;
105 case Image: return imageOffset + imageCounter;
106 case MapCenter: return branchOffset + branchCounter;
107 case Branch: return branchOffset + branchCounter;
112 void TreeItem::appendChild(TreeItem *item)
114 item->parentItem=this;
115 item->rootItem=rootItem;
116 item->setModel (model);
118 if (item->type == Attribute)
120 // attribute are on top of list
121 childItems.insert (attributeCounter,item);
128 if (item->type == XLink)
130 childItems.insert (xlinkCounter+xlinkOffset,item);
136 if (item->type == Image)
138 childItems.insert (imageCounter+imageOffset,item);
143 if (item->isBranchLikeType())
145 // branches are on bottom of list
146 childItems.append(item);
151 item->setType(MapCenter);
153 item->setType (Branch);
157 void TreeItem::removeChild(int row)
159 if (row<0 || row > childItems.size()-1)
160 qWarning ("TreeItem::removeChild tried to remove non existing item?!");
163 if (childItems.at(row)->type==Attribute)
170 if (childItems.at(row)->type==XLink)
176 if (childItems.at(row)->type==Image)
181 if (childItems.at(row)->isBranchLikeType())
184 childItems.removeAt (row);
188 TreeItem *TreeItem::child(int row)
190 return childItems.value(row);
193 int TreeItem::childCount() const
195 return childItems.count();
198 int TreeItem::childNumber() const
201 return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));
206 int TreeItem::columnCount() const
211 int TreeItem::branchCount() const
213 return branchCounter;
216 int TreeItem::imageCount() const
221 int TreeItem::xlinkCount() const
226 int TreeItem::attributeCount() const
228 return attributeCounter;
231 int TreeItem::row() const
234 return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));
236 qDebug() << "TI::row() pI=NULL this="<<this<<" ***************";
240 int TreeItem::depth()
254 TreeItem *TreeItem::parent()
256 //qDebug() << "TI::parent of "<<getHeadingStd()<<" is "<<parentItem;
260 bool TreeItem::isChildOf (TreeItem *ti)
262 if (this==rootItem) return false;
263 if (parentItem==ti) return true;
264 if (parentItem==rootItem) return false;
265 return parentItem->isChildOf (ti);
268 int TreeItem::childNum()
270 return parentItem->childItems.indexOf (this);
275 if (!parentItem) return -1;
276 return parentItem->num (this);
279 int TreeItem::num (TreeItem *item)
281 if (!item) return -1;
282 if (!childItems.contains(item)) return -1;
283 switch (item->getType())
285 case MapCenter: return childItems.indexOf (item) - branchOffset;
286 case Branch: return childItems.indexOf (item) - branchOffset;
287 case Image: return childItems.indexOf (item) - imageOffset;
288 case Attribute: return childItems.indexOf (item) - attributeOffset;
289 case XLink: return childItems.indexOf (item) - xlinkOffset;
293 void TreeItem::setType(const Type t)
296 itemData[1]=getTypeName();
299 TreeItem::Type TreeItem::getType()
301 if (type==Branch && depth()==0) return MapCenter; // should not be necesssary
305 bool TreeItem::isBranchLikeType() const
307 if (type==Branch ||type==MapCenter) return true;
311 QString TreeItem::getTypeName()
315 case Undefined: return QString ("Undefined");
316 case MapCenter: return QString ("MapCenter");
317 case Branch: return QString ("Branch");
318 case Image: return QString ("Image");
319 case Attribute: return QString ("Attribute");
320 case XLink: return QString ("XLink");
321 default: return QString ("TreeItem::getTypeName no typename defined?!");
326 QVariant TreeItem::data(int column) const
328 return itemData.value(column);
331 void TreeItem::setHeading (const VymText &vt)
334 itemData[0]= heading.getTextASCII(); // used in TreeEditor
337 void TreeItem::setHeadingPlainText (const QString &s)
343 if (!heading.isRichText() )
344 // Keep current color
345 vt.setColor( heading.getColor() );
349 Heading TreeItem::getHeading() const
354 QString TreeItem::getHeadingText ()
356 return heading.getText();
359 std::string TreeItem::getHeadingStd () const
361 return getHeadingPlain().toStdString();
364 QString TreeItem::getHeadingPlain() const
366 // strip beginning and tailing WS
367 return heading.getTextASCII().trimmed();
370 QString TreeItem::getHeadingPlainWithParents(uint numberOfParents = 0)
372 QString s = getHeadingPlain();
373 if (numberOfParents > 0)
376 int l = numberOfParents;
377 while ( l > 0 && ti->depth() > 0 )
381 s = ti->getHeadingPlain() + " -> " + s;
390 QString TreeItem::getHeadingDepth () // Indent by depth for debugging
393 for (int i=0; i<depth(); i++) ds += " ";
394 return ds + getHeadingPlain();
397 void TreeItem::setHeadingColor (QColor color)
399 heading.setColor(color);
402 QColor TreeItem::getHeadingColor ()
404 return heading.getColor();
407 void TreeItem::setBackgroundColor (QColor color)
409 backgroundColor=color;
412 QColor TreeItem::getBackgroundColor()
414 return backgroundColor;
417 void TreeItem::setURL (const QString &u)
422 if (url.contains ("bugzilla.novell.com"))
424 systemFlags.activate ("system-url-bugzilla-novell");
425 if (systemFlags.isActive ("system-url"))
426 systemFlags.deactivate ("system-url");
429 systemFlags.activate ("system-url");
430 if (systemFlags.isActive ("system-url-bugzilla-novell"))
431 systemFlags.deactivate ("system-url-bugzilla-novell");
436 if (systemFlags.isActive ("system-url"))
437 systemFlags.deactivate ("system-url");
438 if (systemFlags.isActive ("system-url-bugzilla-novell"))
439 systemFlags.deactivate ("system-url-bugzilla-novell");
443 QString TreeItem::getURL ()
448 void TreeItem::setVymLink (const QString &vl)
452 // We need the relative (from loading)
453 // or absolute path (from User event)
454 // and build the absolute path.
461 // If we have relative, use path of
462 // current map to build absolute path
463 // based on path of current map and relative
464 // path to linked map
465 QString p=dirname(model->getDestPath());
466 vymLink = convertToAbs( p, vl);
468 systemFlags.activate("system-vymLink");
473 systemFlags.deactivate("system-vymLink");
477 QString TreeItem::getVymLink ()
482 void TreeItem::toggleTarget ()
484 systemFlags.toggle ("system-target");
485 target= systemFlags.isActive("system-target");
486 model->emitDataChanged(this); // FIXME-4 better call from VM?
489 bool TreeItem::isTarget ()
494 bool TreeItem::isNoteEmpty()
496 return note.isEmpty();
499 void TreeItem::clearNote()
502 systemFlags.deactivate ("system-note");
505 void TreeItem::setNote(const VymText &vt)
508 if (!note.isEmpty() && !systemFlags.isActive ("system-note"))
509 systemFlags.activate ("system-note");
510 if (note.isEmpty() && systemFlags.isActive ("system-note"))
511 systemFlags.deactivate ("system-note");
514 void TreeItem::setNote(const VymNote &vn)
517 if (!note.isEmpty() && !systemFlags.isActive ("system-note"))
518 systemFlags.activate ("system-note");
519 if (note.isEmpty() && systemFlags.isActive ("system-note"))
520 systemFlags.deactivate ("system-note");
523 bool TreeItem::hasEmptyNote()
525 return note.isEmpty();
528 VymNote TreeItem::getNote()
533 QString TreeItem::getNoteASCII(const QString &indent, const int &width)
535 return note.getTextASCII(indent,width);
538 QString TreeItem::getNoteASCII()
540 return note.getTextASCII();
543 void TreeItem::activateStandardFlag (const QString &name)
545 standardFlags.activate (name);
546 model->emitDataChanged(this);
549 void TreeItem::deactivateStandardFlag (const QString &name)
551 standardFlags.deactivate (name);
552 model->emitDataChanged(this);
555 void TreeItem::deactivateAllStandardFlags ()
557 standardFlags.deactivateAll ();
558 model->emitDataChanged(this);
561 void TreeItem::toggleStandardFlag(const QString &name, FlagRow *master)
563 standardFlags.toggle (name,master);
566 void TreeItem::toggleSystemFlag(const QString &name, FlagRow *master)
568 systemFlags.toggle (name,master);
569 model->emitDataChanged(this);
572 bool TreeItem::hasActiveStandardFlag (const QString &name)
574 return standardFlags.isActive (name);
577 bool TreeItem::hasActiveSystemFlag (const QString &name)
579 return systemFlags.isActive (name);
582 QStringList TreeItem::activeStandardFlagNames ()
584 return standardFlags.activeFlagNames();
587 FlagRow* TreeItem::getStandardFlagRow()
589 return &standardFlags;
592 QStringList TreeItem::activeSystemFlagNames ()
594 return systemFlags.activeFlagNames();
597 bool TreeItem::canMoveDown()
601 case Undefined: return false;
604 if (!parentItem) return false;
605 if (parentItem->num (this) < parentItem->branchCount()-1)
610 case Image: return false;
611 default: return false;
615 bool TreeItem::canMoveUp()
621 if (!parentItem) return false;
622 if (parentItem->num (this) > 0)
627 default: return false;
631 uint TreeItem::getID()
636 void TreeItem::setUuid(const QString &id)
641 QUuid TreeItem::getUuid()
646 TreeItem* TreeItem::getChildNum(const int &n)
648 if (n>=0 && n<childItems.count() )
649 return childItems.at(n);
654 BranchItem* TreeItem::getFirstBranch()
657 return getBranchNum (0);
662 BranchItem* TreeItem::getLastBranch()
665 return getBranchNum (branchCounter-1);
670 ImageItem* TreeItem::getFirstImage()
673 return getImageNum (imageCounter-1);
678 ImageItem* TreeItem::getLastImage()
681 return getImageNum (imageCounter-1);
686 BranchItem* TreeItem::getNextBranch(BranchItem *currentBranch)
688 if (!currentBranch) return NULL;
689 int n=num (currentBranch)+1;
691 return getBranchNum (branchOffset + n);
697 BranchItem* TreeItem::getBranchNum(const int &n)
699 if (n>=0 && n<branchCounter)
700 return (BranchItem*)getChildNum (branchOffset + n);
705 BranchObj* TreeItem::getBranchObjNum(const int &n)
707 if (n>=0 && n<branchCounter)
709 BranchItem *bi=getBranchNum(n);
712 BranchObj *bo=(BranchObj*)(bi->getLMO());
716 qDebug()<<"TI::getBONum bo=NULL";
722 ImageItem* TreeItem::getImageNum (const int &n)
724 if (n>=0 && n<imageCounter)
725 return (ImageItem*)getChildNum (imageOffset + n);
730 FloatImageObj* TreeItem::getImageObjNum (const int &n)
733 return (FloatImageObj*)(getImageNum(n)->getLMO());
738 AttributeItem* TreeItem::getAttributeNum (const int &n)
740 if (n>=0 && n<attributeCounter)
741 return (AttributeItem*)getChildNum (attributeOffset + n);
746 XLinkItem* TreeItem::getXLinkItemNum (const int &n)
748 if (n>=0 && n<xlinkCounter )
749 return (XLinkItem*)getChildNum (xlinkOffset +n);
755 XLinkObj* TreeItem::getXLinkObjNum (const int &n)
759 XLinkItem *xli=getXLinkItemNum (n);
762 Link *l=xli->getLink();
763 if (l) return l->getXLinkObj();
770 void TreeItem::setHideTmp (HideTmpMode mode)
772 if (type==Image || type==Branch || type==MapCenter)
773 // ((ImageItem*)this)->updateVisibility();
775 //LinkableMapObj* lmo=((MapItem*)this)->getLMO();
777 if (mode==HideExport && (hideExport || hasHiddenExportParent() ) ) // FIXME-4 try to avoid calling hasScrolledParent repeatedly
779 // Hide stuff according to hideExport flag and parents
782 // Do not hide, but still take care of scrolled status
785 // And take care of my children
786 for (int i=0; i<branchCount(); ++i)
787 getBranchNum(i)->setHideTmp (mode);
791 bool TreeItem::hasHiddenExportParent()
793 // Calls parents recursivly to
794 // find out, if we or parents are temp. hidden
796 if (hidden || hideExport) return true;
799 return parentItem->hasHiddenExportParent();
805 void TreeItem::setHideInExport(bool b)
807 if (type==MapCenter ||type==Branch || type==Image)
811 systemFlags.activate("system-hideInExport");
813 systemFlags.deactivate("system-hideInExport");
817 bool TreeItem::hideInExport()
822 void TreeItem::updateVisibility()
824 // overloaded in derived objects
827 bool TreeItem::isHidden()
832 QString TreeItem::getGeneralAttr()
836 s+=attribut("hideInExport","true");
838 s+=attribut ("url",url);
839 if (!vymLink.isEmpty())
840 s+=attribut ("vymLink",convertToRel (model->getDestPath(),vymLink));
843 s+=attribut ("localTarget","true");