4 #include "attributeitem.h"
6 #include "branchitem.h"
14 extern FlagRow* standardFlagsMaster;
16 uint TreeItem::idLast=0; // Create instance
20 //cout << "Constr. TI this="<<this<<endl;
27 TreeItem::TreeItem(const QList<QVariant> &data, TreeItem *parent)
29 //cout << "Constructor TreeItem this="<<this<<" parent="<<parent<<endl;
36 rootItem=parentItem->rootItem;
41 //qDebug()<<"Destr TreeItem this="<<this<<" childcount="<<childItems.count();
43 qDeleteAll(childItems); // Call delete //FIXME-3 use this instead of below
45 childItems.clear(); // and clear list
52 qDebug()<<" I'm rootItem, aborting";
56 //qDebug()<<" ="<<getHeading();
58 while (!childItems.isEmpty())
60 //qDebug()<<" ="<<ti->getHeading();
61 ti=childItems.takeFirst();
62 //qDebug()<<" ti="<<ti;
89 // note.setFontHint (textEditor->getFontHintDefault() ); //FIXME-3
90 // isNoteInEditor=false;
95 standardFlags.setMasterRow (standardFlagsMaster);
99 void TreeItem::setModel (VymModel *m)
104 VymModel* TreeItem::getModel ()
109 int TreeItem::getRowNumAppend (TreeItem *item)
113 case Attribute: return attributeOffset + attributeCounter;
114 case XLink: return xlinkOffset + xlinkCounter;
115 case Image: return imageOffset + imageCounter;
116 case MapCenter: return branchOffset + branchCounter;
117 case Branch: return branchOffset + branchCounter;
122 void TreeItem::appendChild(TreeItem *item)
124 item->parentItem=this;
125 item->rootItem=rootItem;
126 item->setModel (model);
128 if (item->type == Attribute)
130 // attribute are on top of list
131 childItems.insert (attributeCounter,item);
138 if (item->type == XLink)
140 childItems.insert (xlinkCounter+xlinkOffset,item);
146 if (item->type == Image)
148 childItems.insert (imageCounter+imageOffset,item);
153 if (item->isBranchLikeType())
155 // branches are on bottom of list
156 childItems.append(item);
159 // Set correct type //FIXME-3 DUP in constr branchitem
161 item->setType(MapCenter);
163 item->setType (Branch);
167 void TreeItem::removeChild(int row)
169 if (row<0 || row > childItems.size()-1)
170 qWarning ("TreeItem::removeChild tried to remove non existing item?!\n");
173 if (childItems.at(row)->type==Attribute)
180 if (childItems.at(row)->type==XLink)
186 if (childItems.at(row)->type==Image)
191 if (childItems.at(row)->isBranchLikeType())
194 childItems.removeAt (row);
198 TreeItem *TreeItem::child(int row)
200 return childItems.value(row);
203 int TreeItem::childCount() const
205 return childItems.count();
208 int TreeItem::childNumber() const
211 return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));
216 int TreeItem::columnCount() const
221 int TreeItem::branchCount() const
223 return branchCounter;
226 int TreeItem::imageCount() const
231 int TreeItem::xlinkCount() const
236 int TreeItem::attributeCount() const
238 return attributeCounter;
241 int TreeItem::row() const
244 return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));
246 cout << "TI::row() pI=NULL this="<<this<<" ***************\n";
250 int TreeItem::depth()
264 TreeItem *TreeItem::parent()
266 //cout << "TI::parent of "<<getHeadingStd()<<" is "<<parentItem<<endl;
270 int TreeItem::childNum()
272 return parentItem->childItems.indexOf (this);
277 if (!parentItem) return -1;
278 return parentItem->num (this);
281 int TreeItem::num (TreeItem *item)
283 if (!item) return -1;
284 if (!childItems.contains(item)) return -1;
285 switch (item->getType())
287 case MapCenter: return childItems.indexOf (item) - branchOffset;
288 case Branch: return childItems.indexOf (item) - branchOffset;
289 case Image: return childItems.indexOf (item) - imageOffset;
290 case Attribute: return childItems.indexOf (item) - attributeOffset;
291 case XLink: return childItems.indexOf (item) - xlinkOffset;
295 void TreeItem::setType(const Type t)
298 itemData[1]=getTypeName();
301 TreeItem::Type TreeItem::getType()
303 if (type==Branch && depth()==0) return MapCenter; //FIXME-3 should not be necesssary
307 bool TreeItem::isBranchLikeType() const
309 if (type==Branch ||type==MapCenter) return true;
313 QString TreeItem::getTypeName()
317 case Undefined: return QString ("Undefined");
318 case MapCenter: return QString ("MapCenter");
319 case Branch: return QString ("Branch");
320 case Image: return QString ("Image");
321 case Attribute: return QString ("Attribute");
322 case XLink: return QString ("XLink");
323 default: return QString ("TreeItem::getTypeName no typename defined?!");
328 QVariant TreeItem::data(int column) const
330 return itemData.value(column);
333 void TreeItem::setHeading (const QString s)
336 //qDebug()<<"TI::setHeading this="<<this<<" "<<s;
339 QString TreeItem::getHeading () const
341 return itemData[0].toString();
344 std::string TreeItem::getHeadingStd () const
346 return itemData[0].toString().toStdString();
349 void TreeItem::setHeadingColor (QColor color)
354 QColor TreeItem::getHeadingColor ()
359 void TreeItem::setURL (const QString &u)
364 if (url.contains ("bugzilla.novell.com"))
366 systemFlags.activate ("system-url-bugzilla-novell");
367 if (systemFlags.isActive ("system-url"))
368 systemFlags.deactivate ("system-url");
371 systemFlags.activate ("system-url");
372 if (systemFlags.isActive ("system-url-bugzilla-novell"))
373 systemFlags.deactivate ("system-url-bugzilla-novell");
378 if (systemFlags.isActive ("system-url"))
379 systemFlags.deactivate ("system-url");
380 if (systemFlags.isActive ("system-url-bugzilla-novell"))
381 systemFlags.deactivate ("system-url-bugzilla-novell");
385 QString TreeItem::getURL ()
390 void TreeItem::setVymLink (const QString &vl)
394 // We need the relative (from loading)
395 // or absolute path (from User event)
396 // and build the absolute path.
397 // Note: If we have relative, use path of
398 // current map to build absolute path
400 if (!d.path().startsWith ("/"))
402 QString p=model->getDestPath();
403 int i=p.findRev("/",-1);
404 d.setPath(p.left(i)+"/"+vl);
408 systemFlags.activate("system-vymLink");
412 systemFlags.deactivate("system-vymLink");
417 QString TreeItem::getVymLink ()
422 void TreeItem::setNote(const QString &s)
429 void TreeItem::clearNote()
432 systemFlags.deactivate ("system-note");
435 void TreeItem::setNoteObj(const NoteObj &n){
437 if (!note.isEmpty() && !systemFlags.isActive ("system-note"))
438 systemFlags.activate ("system-note");
439 if (note.isEmpty() && systemFlags.isActive ("system-note"))
440 systemFlags.deactivate ("system-note");
443 QString TreeItem::getNote()
445 return note.getNote();
448 bool TreeItem::hasEmptyNote()
450 return note.isEmpty();
453 NoteObj TreeItem::getNoteObj()
458 QString TreeItem::getNoteASCII(const QString &indent, const int &width)
460 return note.getNoteASCII(indent,width);
463 QString TreeItem::getNoteASCII()
465 return note.getNoteASCII();
468 QString TreeItem::getNoteOpenDoc()
470 return note.getNoteOpenDoc();
473 void TreeItem::activateStandardFlag (const QString &name)
475 standardFlags.activate (name);
476 model->emitDataHasChanged(this);
479 void TreeItem::deactivateStandardFlag (const QString &name)
481 standardFlags.deactivate (name);
482 model->emitDataHasChanged(this);
485 void TreeItem::deactivateAllStandardFlags ()
487 standardFlags.deactivateAll ();
488 model->emitDataHasChanged(this);
491 void TreeItem::toggleStandardFlag(const QString &name, FlagRow *master)
493 standardFlags.toggle (name,master);
494 model->emitDataHasChanged(this);
497 bool TreeItem::isActiveStandardFlag (const QString &name)
499 return standardFlags.isActive (name);
502 QStringList TreeItem::activeStandardFlagNames ()
504 return standardFlags.activeFlagNames();
507 FlagRow* TreeItem::getStandardFlagRow()
509 return &standardFlags;
512 QStringList TreeItem::activeSystemFlagNames ()
514 return systemFlags.activeFlagNames();
517 bool TreeItem::canMoveDown()
521 case Undefined: return false;
524 if (!parentItem) return false;
525 if (parentItem->num (this) < parentItem->branchCount()-1)
530 case Image: return false;
531 default: return false;
535 bool TreeItem::canMoveUp()
541 if (!parentItem) return false;
542 if (parentItem->num (this) > 0)
547 default: return false;
551 uint TreeItem::getID()
556 TreeItem* TreeItem::findID (const uint &n)
558 for (int i=0;i<childItems.count(); i++)
559 if (n==childItems.at(i)->id)
560 return childItems.at(n);
565 TreeItem* TreeItem::getChildNum(const int &n)
567 if (n>=0 && n<childItems.count() )
568 return childItems.at(n);
573 BranchItem* TreeItem::getFirstBranch()
576 return getBranchNum (0);
581 BranchItem* TreeItem::getLastBranch()
584 return getBranchNum (branchCounter-1);
589 BranchItem* TreeItem::getNextBranch(BranchItem *currentBranch)
591 if (!currentBranch) return NULL;
592 int n=num (currentBranch)+1;
594 return getBranchNum (branchOffset + n);
600 BranchItem* TreeItem::getBranchNum(const int &n)
602 if (n>=0 && n<branchCounter)
603 return (BranchItem*)getChildNum (branchOffset + n);
608 BranchObj* TreeItem::getBranchObjNum(const int &n)
610 if (n>=0 && n<branchCounter)
612 BranchItem *bi=getBranchNum(n);
615 BranchObj *bo=(BranchObj*)(bi->getLMO());
619 qDebug()<<"TI::getBONum bo=NULL";
625 ImageItem* TreeItem::getImageNum (const int &n)
627 if (n>=0 && n<imageCounter)
628 return (ImageItem*)getChildNum (imageOffset + n);
633 FloatImageObj* TreeItem::getImageObjNum (const int &n) // FIXME-5 what about SVGs later?
636 return (FloatImageObj*)(getImageNum(n)->getLMO());
641 AttributeItem* TreeItem::getAttributeNum (const int &n)
643 if (n>=0 && n<attributeCounter)
644 return (AttributeItem*)getChildNum (attributeOffset + n);
649 XLinkItem* TreeItem::getXLinkNum (const int &n)
651 if (n>=0 && n<xlinkCounter )
652 return (XLinkItem*)getChildNum (xlinkOffset +n);
658 XLinkObj* TreeItem::getXLinkObjNum (const int &n)
662 XLinkItem *xli=getXLinkNum (n);
665 Link *l=xli->getLink();
666 if (l) return l->getXLinkObj();
673 void TreeItem::setHideTmp (HideTmpMode mode) //FIXME-3 update visibility in derived objects
675 if (type==Image || type==Branch || type==MapCenter)
676 // ((ImageItem*)this)->updateVisibility();
678 //LinkableMapObj* lmo=((MapItem*)this)->getLMO();
680 if (mode==HideExport && (hideExport || hasHiddenExportParent() ) ) // FIXME-3 try to avoid calling hasScrolledParent repeatedly
683 // Hide stuff according to hideExport flag and parents
685 //if (lmo) lmo->setVisibility (false);
686 updateVisibility(); // FIXME-3 missing for images
689 // Do not hide, but still take care of scrolled status
693 // And take care of my children
694 for (int i=0; i<branchCount(); ++i)
695 getBranchNum(i)->setHideTmp (mode);
699 bool TreeItem::hasHiddenExportParent()
701 // Calls parents recursivly to
702 // find out, if we or parents are temp. hidden
704 if (hidden || hideExport) return true;
707 return parentItem->hasHiddenExportParent();
713 void TreeItem::setHideInExport(bool b)
715 if (type==MapCenter ||type==Branch || type==Image)
719 systemFlags.activate("system-hideInExport");
721 systemFlags.deactivate("system-hideInExport");
725 bool TreeItem::hideInExport()
730 void TreeItem::updateVisibility()
732 // overloaded in derived objects
735 bool TreeItem::isHidden()
740 QString TreeItem::getGeneralAttr()
744 s+=attribut("hideInExport","true");
746 s+=attribut ("url",url);
747 if (!vymLink.isEmpty())
748 s+=attribut ("vymLink",convertToRel (model->getDestPath(),vymLink));