insilmaril@746: #include insilmaril@725: #include insilmaril@725: insilmaril@790: #include "attributeitem.h" insilmaril@741: #include "branchobj.h" insilmaril@750: #include "branchitem.h" insilmaril@790: #include "treeitem.h" insilmaril@746: #include "vymmodel.h" insilmaril@790: #include "xlinkitem.h" insilmaril@790: #include "xlinkobj.h" insilmaril@725: insilmaril@758: using namespace std; insilmaril@758: insilmaril@772: extern FlagRow* standardFlagsMaster; insilmaril@758: insilmaril@822: uint TreeItem::idLast=0; // Create instance insilmaril@822: insilmaril@776: TreeItem::TreeItem() insilmaril@776: { insilmaril@791: cout << "Constr. TI this="< &data, TreeItem *parent) insilmaril@725: { insilmaril@773: //cout << "Constructor TreeItem this="<getFontHintDefault() ); //FIXME-3 insilmaril@746: // isNoteInEditor=false; insilmaril@753: insilmaril@753: hidden=false; insilmaril@776: hideExport=false; insilmaril@754: insilmaril@772: standardFlags.setMasterRow (standardFlagsMaster); insilmaril@725: } insilmaril@725: insilmaril@746: insilmaril@746: void TreeItem::setModel (VymModel *m) insilmaril@746: { insilmaril@746: model=m; insilmaril@746: } insilmaril@746: insilmaril@746: VymModel* TreeItem::getModel () insilmaril@746: { insilmaril@746: return model; insilmaril@746: } insilmaril@741: insilmaril@776: int TreeItem::getRowNumAppend (TreeItem *item) insilmaril@776: { insilmaril@776: switch (item->type) insilmaril@776: { insilmaril@786: case Attribute: return attributeOffset + attributeCounter; insilmaril@790: case XLink: return xlinkOffset + xlinkCounter; insilmaril@786: case Image: return imageOffset + imageCounter; insilmaril@776: case MapCenter: return branchOffset + branchCounter; insilmaril@776: case Branch: return branchOffset + branchCounter; insilmaril@776: default: return -1; insilmaril@776: } insilmaril@776: } insilmaril@776: insilmaril@725: void TreeItem::appendChild(TreeItem *item) insilmaril@725: { insilmaril@756: item->parentItem=this; insilmaril@773: item->rootItem=rootItem; insilmaril@746: item->setModel (model); insilmaril@741: insilmaril@786: if (item->type == Attribute) insilmaril@786: { insilmaril@786: // attribute are on top of list insilmaril@786: childItems.insert (attributeCounter,item); insilmaril@786: attributeCounter++; insilmaril@790: xlinkOffset++; insilmaril@790: imageOffset++; insilmaril@790: branchOffset++; insilmaril@790: } insilmaril@790: insilmaril@790: if (item->type == XLink) insilmaril@790: { insilmaril@790: childItems.insert (xlinkCounter+xlinkOffset,item); insilmaril@790: xlinkCounter++; insilmaril@786: imageOffset++; insilmaril@786: branchOffset++; insilmaril@786: } insilmaril@786: insilmaril@776: if (item->type == Image) insilmaril@738: { insilmaril@786: childItems.insert (imageCounter+imageOffset,item); insilmaril@776: imageCounter++; insilmaril@776: branchOffset++; insilmaril@776: } insilmaril@776: insilmaril@776: if (item->isBranchLikeType()) insilmaril@776: { insilmaril@776: // branches are on bottom of list insilmaril@776: childItems.append(item); insilmaril@741: branchCounter++; insilmaril@788: insilmaril@788: // Set correct type //FIXME-3 DUP in constr branchitem insilmaril@788: if (this==rootItem) insilmaril@788: item->setType(MapCenter); insilmaril@788: else insilmaril@788: item->setType (Branch); insilmaril@738: } insilmaril@725: } insilmaril@725: insilmaril@727: void TreeItem::removeChild(int row) insilmaril@727: { insilmaril@745: if (row<0 || row > childItems.size()-1) insilmaril@745: qWarning ("TreeItem::removeChild tried to remove non existing item?!\n"); insilmaril@745: else insilmaril@727: { insilmaril@786: if (childItems.at(row)->type==Attribute) insilmaril@786: { insilmaril@786: attributeCounter--; insilmaril@790: xlinkOffset--; insilmaril@790: imageOffset--; insilmaril@790: branchOffset--; insilmaril@790: } insilmaril@790: if (childItems.at(row)->type==XLink) insilmaril@790: { insilmaril@790: xlinkCounter--; insilmaril@786: imageOffset--; insilmaril@786: branchOffset--; insilmaril@786: } insilmaril@776: if (childItems.at(row)->type==Image) insilmaril@776: { insilmaril@776: imageCounter--; insilmaril@786: branchOffset--; insilmaril@776: } insilmaril@786: if (childItems.at(row)->isBranchLikeType()) insilmaril@786: branchCounter--; insilmaril@786: insilmaril@755: childItems.removeAt (row); insilmaril@745: } insilmaril@727: } insilmaril@727: insilmaril@725: TreeItem *TreeItem::child(int row) insilmaril@725: { insilmaril@725: return childItems.value(row); insilmaril@725: } insilmaril@725: insilmaril@725: int TreeItem::childCount() const insilmaril@725: { insilmaril@725: return childItems.count(); insilmaril@725: } insilmaril@725: insilmaril@745: int TreeItem::childNumber() const insilmaril@745: { insilmaril@745: if (parentItem) insilmaril@745: return parentItem->childItems.indexOf(const_cast(this)); insilmaril@745: insilmaril@745: return 0; insilmaril@745: } insilmaril@745: insilmaril@725: int TreeItem::columnCount() const insilmaril@725: { insilmaril@791: return 1; insilmaril@725: } insilmaril@741: insilmaril@741: int TreeItem::branchCount() const insilmaril@741: { insilmaril@741: return branchCounter; insilmaril@741: } insilmaril@749: insilmaril@749: int TreeItem::imageCount() const insilmaril@749: { insilmaril@776: return imageCounter; insilmaril@749: } insilmaril@749: insilmaril@790: int TreeItem::xlinkCount() const insilmaril@749: { insilmaril@790: return xlinkCounter; insilmaril@749: } insilmaril@749: insilmaril@786: int TreeItem::attributeCount() const insilmaril@786: { insilmaril@786: return attributeCounter; insilmaril@786: } insilmaril@786: insilmaril@727: int TreeItem::row() const insilmaril@727: { insilmaril@727: if (parentItem) insilmaril@727: return parentItem->childItems.indexOf(const_cast(this)); insilmaril@727: insilmaril@788: cout << "TI::row() pI=NULL this="<parent(); insilmaril@740: d++; insilmaril@740: } insilmaril@740: return d; insilmaril@740: } insilmaril@740: insilmaril@727: TreeItem *TreeItem::parent() insilmaril@727: { insilmaril@791: //cout << "TI::parent of "<childItems.indexOf (this); insilmaril@755: } insilmaril@755: insilmaril@741: int TreeItem::num() insilmaril@741: { insilmaril@791: if (!parentItem) return -1; insilmaril@791: return parentItem->num (this); insilmaril@749: } insilmaril@749: insilmaril@749: int TreeItem::num (TreeItem *item) insilmaril@749: { insilmaril@749: if (!item) return -1; insilmaril@776: if (!childItems.contains(item)) return -1; insilmaril@749: switch (item->getType()) insilmaril@749: { insilmaril@763: case MapCenter: return childItems.indexOf (item) - branchOffset; insilmaril@763: case Branch: return childItems.indexOf (item) - branchOffset; insilmaril@794: case Image: return childItems.indexOf (item) - imageOffset; insilmaril@794: case Attribute: return childItems.indexOf (item) - attributeOffset; insilmaril@794: case XLink: return childItems.indexOf (item) - xlinkOffset; insilmaril@749: default: return -1; insilmaril@749: } insilmaril@741: } insilmaril@766: void TreeItem::setType(const Type t) insilmaril@766: { insilmaril@766: type=t; insilmaril@766: itemData[1]=getTypeName(); insilmaril@766: } insilmaril@766: insilmaril@766: TreeItem::Type TreeItem::getType() insilmaril@766: { insilmaril@791: if (type==Branch && depth()==0) return MapCenter; //FIXME-3 should not be necesssary insilmaril@766: return type; insilmaril@766: } insilmaril@766: insilmaril@766: bool TreeItem::isBranchLikeType() const insilmaril@766: { insilmaril@766: if (type==Branch ||type==MapCenter) return true; insilmaril@766: return false; insilmaril@766: } insilmaril@766: insilmaril@766: QString TreeItem::getTypeName() insilmaril@766: { insilmaril@766: switch (type) insilmaril@766: { insilmaril@766: case Undefined: return QString ("Undefined"); insilmaril@766: case MapCenter: return QString ("MapCenter"); insilmaril@766: case Branch: return QString ("Branch"); insilmaril@766: case Image: return QString ("Image"); insilmaril@788: case Attribute: return QString ("Attribute"); insilmaril@790: case XLink: return QString ("XLink"); insilmaril@766: default: return QString ("TreeItem::getTypeName no typename defined?!"); insilmaril@766: } insilmaril@766: } insilmaril@766: insilmaril@725: insilmaril@725: QVariant TreeItem::data(int column) const insilmaril@725: { insilmaril@725: return itemData.value(column); insilmaril@725: } insilmaril@725: insilmaril@726: void TreeItem::setHeading (const QString s) insilmaril@725: { insilmaril@726: itemData[0]=s; insilmaril@726: } insilmaril@726: insilmaril@753: QString TreeItem::getHeading () const insilmaril@726: { insilmaril@726: return itemData[0].toString(); insilmaril@726: } insilmaril@726: insilmaril@755: std::string TreeItem::getHeadingStd () const insilmaril@753: { insilmaril@753: return itemData[0].toString().toStdString(); insilmaril@753: } insilmaril@753: insilmaril@758: void TreeItem::setHeadingColor (QColor color) insilmaril@758: { insilmaril@758: headingColor=color; insilmaril@758: } insilmaril@758: insilmaril@758: QColor TreeItem::getHeadingColor () insilmaril@758: { insilmaril@758: return headingColor; insilmaril@758: } insilmaril@758: insilmaril@767: void TreeItem::setURL (const QString &u) insilmaril@741: { insilmaril@767: url=u; insilmaril@767: if (!url.isEmpty()) insilmaril@767: systemFlags.activate ("system-url"); insilmaril@767: else insilmaril@767: systemFlags.deactivate ("system-url"); insilmaril@767: } insilmaril@767: insilmaril@767: QString TreeItem::getURL () insilmaril@767: { insilmaril@767: return url; insilmaril@767: } insilmaril@767: insilmaril@767: void TreeItem::setVymLink (const QString &vl) insilmaril@767: { insilmaril@767: if (!vl.isEmpty()) insilmaril@767: { insilmaril@767: // We need the relative (from loading) insilmaril@767: // or absolute path (from User event) insilmaril@767: // and build the absolute path. insilmaril@767: // Note: If we have relative, use path of insilmaril@767: // current map to build absolute path insilmaril@767: QDir d(vl); insilmaril@767: if (!d.path().startsWith ("/")) insilmaril@767: { insilmaril@767: QString p=model->getDestPath(); insilmaril@767: int i=p.findRev("/",-1); insilmaril@767: d.setPath(p.left(i)+"/"+vl); insilmaril@767: d.convertToAbs(); insilmaril@767: } insilmaril@767: vymLink=d.path(); insilmaril@767: systemFlags.activate("system-vymLink"); insilmaril@767: } insilmaril@767: else insilmaril@767: { insilmaril@767: systemFlags.deactivate("system-vymLink"); insilmaril@767: vymLink.clear(); insilmaril@767: } insilmaril@767: } insilmaril@767: insilmaril@767: QString TreeItem::getVymLink () insilmaril@767: { insilmaril@767: return vymLink; insilmaril@767: } insilmaril@767: insilmaril@767: void TreeItem::setNote(const QString &s) insilmaril@767: { insilmaril@767: NoteObj n; insilmaril@767: n.setNote(s); insilmaril@791: setNoteObj (n); insilmaril@767: } insilmaril@767: insilmaril@767: void TreeItem::clearNote() insilmaril@767: { insilmaril@767: note.clear(); insilmaril@767: systemFlags.deactivate ("system-note"); insilmaril@746: } insilmaril@746: insilmaril@791: void TreeItem::setNoteObj(const NoteObj &n){ insilmaril@746: note=n; insilmaril@767: if (!note.isEmpty() && !systemFlags.isActive ("system-note")) insilmaril@767: systemFlags.activate ("system-note"); insilmaril@767: if (note.isEmpty() && systemFlags.isActive ("system-note")) insilmaril@767: systemFlags.deactivate ("system-note"); insilmaril@741: } insilmaril@741: insilmaril@741: QString TreeItem::getNote() insilmaril@741: { insilmaril@746: return note.getNote(); insilmaril@746: } insilmaril@746: insilmaril@768: bool TreeItem::hasEmptyNote() insilmaril@768: { insilmaril@768: return note.isEmpty(); insilmaril@768: } insilmaril@768: insilmaril@746: NoteObj TreeItem::getNoteObj() insilmaril@746: { insilmaril@746: return note; insilmaril@746: } insilmaril@746: insilmaril@746: QString TreeItem::getNoteASCII(const QString &indent, const int &width) insilmaril@746: { insilmaril@746: return note.getNoteASCII(indent,width); insilmaril@746: } insilmaril@746: insilmaril@746: QString TreeItem::getNoteASCII() insilmaril@746: { insilmaril@746: return note.getNoteASCII(); insilmaril@746: } insilmaril@746: insilmaril@746: QString TreeItem::getNoteOpenDoc() insilmaril@746: { insilmaril@746: return note.getNoteOpenDoc(); insilmaril@741: } insilmaril@741: insilmaril@766: void TreeItem::activateStandardFlag (const QString &name) insilmaril@726: { insilmaril@766: standardFlags.activate (name); insilmaril@767: model->emitDataHasChanged(this); insilmaril@726: } insilmaril@726: insilmaril@766: void TreeItem::deactivateStandardFlag (const QString &name) insilmaril@726: { insilmaril@766: standardFlags.deactivate (name); insilmaril@767: model->emitDataHasChanged(this); insilmaril@726: } insilmaril@726: insilmaril@767: void TreeItem::deactivateAllStandardFlags () insilmaril@753: { insilmaril@767: standardFlags.deactivateAll (); insilmaril@767: model->emitDataHasChanged(this); insilmaril@767: } insilmaril@767: insilmaril@767: void TreeItem::toggleStandardFlag(const QString &name, FlagRow *master) insilmaril@767: { insilmaril@767: standardFlags.toggle (name,master); insilmaril@767: model->emitDataHasChanged(this); insilmaril@753: } insilmaril@753: insilmaril@766: bool TreeItem::isActiveStandardFlag (const QString &name) insilmaril@726: { insilmaril@766: return standardFlags.isActive (name); insilmaril@725: } insilmaril@725: insilmaril@767: QStringList TreeItem::activeStandardFlagNames () insilmaril@767: { insilmaril@767: return standardFlags.activeFlagNames(); insilmaril@767: } insilmaril@767: insilmaril@770: FlagRow* TreeItem::getStandardFlagRow() insilmaril@770: { insilmaril@770: return &standardFlags; insilmaril@770: } insilmaril@770: insilmaril@776: QStringList TreeItem::activeSystemFlagNames () insilmaril@767: { insilmaril@767: return systemFlags.activeFlagNames(); insilmaril@767: } insilmaril@767: insilmaril@767: bool TreeItem::canMoveDown() insilmaril@767: { insilmaril@767: switch (type) insilmaril@767: { insilmaril@767: case Undefined: return false; insilmaril@767: case MapCenter: insilmaril@767: case Branch: insilmaril@767: if (!parentItem) return false; insilmaril@767: if (parentItem->num (this) < parentItem->branchCount()-1) insilmaril@767: return true; insilmaril@767: else insilmaril@767: return false; insilmaril@767: break; insilmaril@767: case Image: return false; insilmaril@767: default: return false; insilmaril@767: } insilmaril@767: } insilmaril@767: insilmaril@767: bool TreeItem::canMoveUp() insilmaril@767: { insilmaril@767: switch (type) insilmaril@767: { insilmaril@767: case MapCenter: insilmaril@767: case Branch: insilmaril@767: if (!parentItem) return false; insilmaril@767: if (parentItem->num (this) > 0) insilmaril@767: return true; insilmaril@767: else insilmaril@767: return false; insilmaril@767: break; insilmaril@767: default: return false; insilmaril@767: } insilmaril@767: } insilmaril@767: insilmaril@822: uint TreeItem::getID() insilmaril@754: { insilmaril@822: return id; insilmaril@754: } insilmaril@754: insilmaril@822: TreeItem* TreeItem::findID (const uint &n) insilmaril@754: { insilmaril@822: if (n>=0 && nid) insilmaril@822: return childItems.at(n); insilmaril@822: } insilmaril@822: else insilmaril@822: return NULL; insilmaril@754: } insilmaril@754: insilmaril@754: insilmaril@738: TreeItem* TreeItem::getChildNum(const int &n) insilmaril@738: { insilmaril@738: if (n>=0 && n0) insilmaril@804: return getBranchNum (0); insilmaril@738: else insilmaril@738: return NULL; insilmaril@738: } insilmaril@738: insilmaril@750: BranchItem* TreeItem::getLastBranch() insilmaril@738: { insilmaril@741: if (branchCounter>0) insilmaril@804: return getBranchNum (branchCounter-1); insilmaril@738: else insilmaril@738: return NULL; insilmaril@738: } insilmaril@738: insilmaril@763: BranchItem* TreeItem::getNextBranch(BranchItem *currentBranch) insilmaril@763: { insilmaril@763: if (!currentBranch) return NULL; insilmaril@763: int n=num (currentBranch)+1; insilmaril@763: if (n=0 && n=0 && ngetLMO()); insilmaril@750: } else insilmaril@750: return NULL; insilmaril@750: } insilmaril@750: insilmaril@776: ImageItem* TreeItem::getImageNum (const int &n) insilmaril@776: { insilmaril@776: if (n>=0 && n0 ) insilmaril@776: return (FloatImageObj*)(getImageNum(n)->getLMO()); insilmaril@776: else insilmaril@776: return NULL; insilmaril@776: } insilmaril@753: insilmaril@794: AttributeItem* TreeItem::getAttributeNum (const int &n) insilmaril@794: { insilmaril@794: if (n>=0 && n=0 && n0 ) insilmaril@790: { insilmaril@790: XLinkItem *xli=getXLinkNum (n); insilmaril@790: if (!xli) return NULL; insilmaril@790: if (xli->isBegin() ) insilmaril@790: return (XLinkObj*)(xli->getLMO()); insilmaril@790: else insilmaril@790: { insilmaril@790: xli=xli->getPartnerXLink(); insilmaril@790: if (!xli) return NULL; insilmaril@790: return (XLinkObj*)(xli->getLMO()); insilmaril@790: } insilmaril@790: } insilmaril@790: return NULL; insilmaril@790: } insilmaril@790: insilmaril@779: insilmaril@819: void TreeItem::setHideTmp (HideTmpMode mode) //FIXME-2 update visibility in derived objects insilmaril@753: { insilmaril@819: if (type==Image || type==Branch || type==MapCenter) insilmaril@819: // ((ImageItem*)this)->updateVisibility(); insilmaril@819: { insilmaril@819: LinkableMapObj* lmo=((MapItem*)this)->getLMO(); insilmaril@753: insilmaril@819: if (mode==HideExport && (hideExport || hasHiddenExportParent() ) ) // FIXME-2 try to avoid calling hasScrolledParent repeatedly insilmaril@819: insilmaril@753: { insilmaril@753: // Hide stuff according to hideExport flag and parents insilmaril@791: hidden=true; insilmaril@819: //if (lmo) lmo->setVisibility (false); insilmaril@819: updateVisibility(); // FIXME-3 missing for images insilmaril@753: }else insilmaril@753: { insilmaril@753: // Do not hide, but still take care of scrolled status insilmaril@791: hidden=false; insilmaril@819: updateVisibility(); insilmaril@819: } insilmaril@753: // And take care of my children insilmaril@753: for (int i=0; isetHideTmp (mode); insilmaril@819: } insilmaril@753: } insilmaril@753: insilmaril@753: bool TreeItem::hasHiddenExportParent() insilmaril@753: { insilmaril@753: // Calls parents recursivly to insilmaril@753: // find out, if we or parents are temp. hidden insilmaril@753: insilmaril@753: if (hidden || hideExport) return true; insilmaril@753: insilmaril@753: if (parentItem) insilmaril@753: return parentItem->hasHiddenExportParent(); insilmaril@753: else insilmaril@753: return false; insilmaril@753: } insilmaril@753: insilmaril@753: insilmaril@753: void TreeItem::setHideInExport(bool b) insilmaril@753: { insilmaril@819: if (type==MapCenter ||type==Branch || type==Image) insilmaril@753: { insilmaril@753: hideExport=b; insilmaril@753: if (b) insilmaril@777: systemFlags.activate("system-hideInExport"); insilmaril@753: else insilmaril@777: systemFlags.deactivate("system-hideInExport"); insilmaril@753: } insilmaril@753: } insilmaril@753: insilmaril@753: bool TreeItem::hideInExport() insilmaril@753: { insilmaril@753: return hideExport; insilmaril@753: } insilmaril@753: insilmaril@791: void TreeItem::updateVisibility() insilmaril@791: { insilmaril@791: // overloaded in derived objects insilmaril@791: } insilmaril@791: insilmaril@753: bool TreeItem::isHidden() insilmaril@753: { insilmaril@753: return hidden; insilmaril@753: } insilmaril@753: insilmaril@804: QString TreeItem::getGeneralAttr() insilmaril@777: { insilmaril@780: QString s; insilmaril@779: if (hideExport) insilmaril@780: s+=attribut("hideInExport","true"); insilmaril@780: if (!url.isEmpty()) insilmaril@780: s+=attribut ("url",url); insilmaril@780: if (!vymLink.isEmpty()) insilmaril@804: s+=attribut ("vymLink",convertToRel (model->getDestPath(),vymLink)); insilmaril@780: return s; insilmaril@777: } insilmaril@753: insilmaril@726: