treeitem.cpp
author insilmaril
Tue, 08 Sep 2009 12:15:39 +0000
changeset 792 7d67be709091
parent 791 f1006de05c54
child 794 d922fb6ea482
permissions -rw-r--r--
First results in moving colliding MapCenters apart
insilmaril@746
     1
#include <iostream>
insilmaril@725
     2
#include <QStringList>
insilmaril@725
     3
insilmaril@790
     4
#include "attributeitem.h"
insilmaril@741
     5
#include "branchobj.h"
insilmaril@750
     6
#include "branchitem.h"
insilmaril@790
     7
#include "treeitem.h"
insilmaril@746
     8
#include "vymmodel.h"
insilmaril@790
     9
#include "xlinkitem.h"
insilmaril@790
    10
#include "xlinkobj.h"
insilmaril@725
    11
insilmaril@758
    12
using namespace std;
insilmaril@758
    13
insilmaril@772
    14
extern FlagRow* standardFlagsMaster;
insilmaril@758
    15
insilmaril@776
    16
TreeItem::TreeItem()
insilmaril@776
    17
{
insilmaril@791
    18
	cout << "Constr. TI  this="<<this<<endl;
insilmaril@776
    19
	init();
insilmaril@776
    20
	itemData.clear();
insilmaril@776
    21
	rootItem=this;
insilmaril@776
    22
	parentItem=NULL;
insilmaril@776
    23
}
insilmaril@776
    24
insilmaril@776
    25
TreeItem::TreeItem(const QList<QVariant> &data, TreeItem *parent)
insilmaril@725
    26
{
insilmaril@773
    27
	//cout << "Constructor TreeItem this="<<this<<"  parent="<<parent<<endl;
insilmaril@756
    28
	init();
insilmaril@756
    29
    parentItem = parent;
insilmaril@756
    30
    itemData = data;
insilmaril@773
    31
	
insilmaril@773
    32
	rootItem=this;
insilmaril@773
    33
	if (parentItem )
insilmaril@773
    34
		rootItem=parentItem->rootItem;
insilmaril@756
    35
}
insilmaril@756
    36
insilmaril@756
    37
TreeItem::~TreeItem()
insilmaril@756
    38
{
insilmaril@756
    39
	//cout << "Destructor TreeItem "<<getHeadingStd()<<endl;
insilmaril@756
    40
	TreeItem *ti;
insilmaril@756
    41
	while (!childItems.isEmpty())
insilmaril@756
    42
	{
insilmaril@756
    43
		ti=childItems.takeFirst();
insilmaril@791
    44
		delete ti;
insilmaril@756
    45
	}	
insilmaril@756
    46
}
insilmaril@756
    47
insilmaril@756
    48
insilmaril@756
    49
void TreeItem::init()
insilmaril@756
    50
{
insilmaril@746
    51
	model=NULL;
insilmaril@746
    52
insilmaril@738
    53
	branchOffset=0;
insilmaril@741
    54
	branchCounter=0;
insilmaril@746
    55
insilmaril@763
    56
	imageOffset=0;
insilmaril@763
    57
	imageCounter=0;
insilmaril@763
    58
insilmaril@786
    59
	attributeCounter=0;
insilmaril@786
    60
	attributeOffset=0;
insilmaril@786
    61
insilmaril@790
    62
	xlinkCounter=0;
insilmaril@790
    63
	xlinkOffset=0;
insilmaril@790
    64
insilmaril@746
    65
	note.setNote(""); 
insilmaril@786
    66
	// note.setFontHint (textEditor->getFontHintDefault() );	//FIXME-3
insilmaril@746
    67
	// isNoteInEditor=false;
insilmaril@753
    68
insilmaril@753
    69
	hidden=false;
insilmaril@776
    70
	hideExport=false;
insilmaril@754
    71
insilmaril@754
    72
	// Reset ID
insilmaril@754
    73
	objID="";
insilmaril@772
    74
insilmaril@772
    75
	standardFlags.setMasterRow (standardFlagsMaster);
insilmaril@725
    76
}
insilmaril@725
    77
insilmaril@746
    78
insilmaril@746
    79
void TreeItem::setModel (VymModel *m)
insilmaril@746
    80
{
insilmaril@746
    81
	model=m;
insilmaril@746
    82
}
insilmaril@746
    83
insilmaril@746
    84
VymModel* TreeItem::getModel ()
insilmaril@746
    85
{
insilmaril@746
    86
	return model;
insilmaril@746
    87
}
insilmaril@741
    88
insilmaril@776
    89
int TreeItem::getRowNumAppend (TreeItem *item)
insilmaril@776
    90
{	
insilmaril@776
    91
	switch (item->type)
insilmaril@776
    92
	{
insilmaril@786
    93
		case Attribute: return attributeOffset + attributeCounter;
insilmaril@790
    94
		case XLink: return xlinkOffset + xlinkCounter;
insilmaril@786
    95
		case Image: return imageOffset + imageCounter;
insilmaril@776
    96
		case MapCenter: return branchOffset + branchCounter;
insilmaril@776
    97
		case Branch: return branchOffset + branchCounter;
insilmaril@776
    98
		default: return -1;
insilmaril@776
    99
	}
insilmaril@776
   100
}
insilmaril@776
   101
insilmaril@725
   102
void TreeItem::appendChild(TreeItem *item)
insilmaril@725
   103
{
insilmaril@756
   104
	item->parentItem=this;
insilmaril@773
   105
	item->rootItem=rootItem;
insilmaril@746
   106
	item->setModel (model);
insilmaril@741
   107
insilmaril@786
   108
	if (item->type == Attribute)
insilmaril@786
   109
	{
insilmaril@786
   110
		// attribute are on top of list
insilmaril@786
   111
		childItems.insert (attributeCounter,item);
insilmaril@786
   112
		attributeCounter++;
insilmaril@790
   113
		xlinkOffset++;
insilmaril@790
   114
		imageOffset++;
insilmaril@790
   115
		branchOffset++;
insilmaril@790
   116
	}
insilmaril@790
   117
insilmaril@790
   118
	if (item->type == XLink)
insilmaril@790
   119
	{
insilmaril@790
   120
		childItems.insert (xlinkCounter+xlinkOffset,item);
insilmaril@790
   121
		xlinkCounter++;
insilmaril@786
   122
		imageOffset++;
insilmaril@786
   123
		branchOffset++;
insilmaril@786
   124
	}
insilmaril@786
   125
insilmaril@776
   126
	if (item->type == Image)
insilmaril@738
   127
	{
insilmaril@786
   128
		childItems.insert (imageCounter+imageOffset,item);
insilmaril@776
   129
		imageCounter++;
insilmaril@776
   130
		branchOffset++;
insilmaril@776
   131
	}
insilmaril@776
   132
insilmaril@776
   133
	if (item->isBranchLikeType())
insilmaril@776
   134
	{
insilmaril@776
   135
		// branches are on bottom of list
insilmaril@776
   136
		childItems.append(item);
insilmaril@741
   137
		branchCounter++;
insilmaril@788
   138
insilmaril@788
   139
		// Set correct type		//FIXME-3 DUP in constr branchitem
insilmaril@788
   140
		if (this==rootItem)
insilmaril@788
   141
			item->setType(MapCenter);
insilmaril@788
   142
		else
insilmaril@788
   143
			item->setType (Branch);
insilmaril@738
   144
	}
insilmaril@725
   145
}
insilmaril@725
   146
insilmaril@727
   147
void TreeItem::removeChild(int row)
insilmaril@727
   148
{
insilmaril@745
   149
    if (row<0 || row > childItems.size()-1)
insilmaril@745
   150
		qWarning ("TreeItem::removeChild tried to remove non existing item?!\n");
insilmaril@745
   151
	else
insilmaril@727
   152
	{
insilmaril@786
   153
		if (childItems.at(row)->type==Attribute)
insilmaril@786
   154
		{
insilmaril@786
   155
			attributeCounter--;
insilmaril@790
   156
			xlinkOffset--;
insilmaril@790
   157
			imageOffset--;
insilmaril@790
   158
			branchOffset--;
insilmaril@790
   159
		}	
insilmaril@790
   160
		if (childItems.at(row)->type==XLink)
insilmaril@790
   161
		{
insilmaril@790
   162
			xlinkCounter--;
insilmaril@786
   163
			imageOffset--;
insilmaril@786
   164
			branchOffset--;
insilmaril@786
   165
		}	
insilmaril@776
   166
		if (childItems.at(row)->type==Image)
insilmaril@776
   167
		{
insilmaril@776
   168
			imageCounter--;
insilmaril@786
   169
			branchOffset--;
insilmaril@776
   170
		}	
insilmaril@786
   171
		if (childItems.at(row)->isBranchLikeType())
insilmaril@786
   172
			branchCounter--;
insilmaril@786
   173
insilmaril@755
   174
		childItems.removeAt (row);
insilmaril@745
   175
	}
insilmaril@727
   176
}
insilmaril@727
   177
insilmaril@788
   178
/*
insilmaril@788
   179
void TreeItem::clear()	// FIXME-2 used in vymmodel addMapInsert, but needs to be used via model and emit layout changes...
insilmaril@772
   180
{
insilmaril@788
   181
	cout << "TI::clear\n";
insilmaril@772
   182
	while ( childItems.size()>0)
insilmaril@772
   183
	{
insilmaril@772
   184
		branchCounter--;
insilmaril@772
   185
		childItems.removeAt (0);
insilmaril@772
   186
	}
insilmaril@772
   187
}
insilmaril@788
   188
*/
insilmaril@772
   189
insilmaril@725
   190
TreeItem *TreeItem::child(int row)
insilmaril@725
   191
{
insilmaril@725
   192
    return childItems.value(row);
insilmaril@725
   193
}
insilmaril@725
   194
insilmaril@725
   195
int TreeItem::childCount() const
insilmaril@725
   196
{
insilmaril@725
   197
    return childItems.count();
insilmaril@725
   198
}
insilmaril@725
   199
insilmaril@745
   200
int TreeItem::childNumber() const
insilmaril@745
   201
{
insilmaril@745
   202
    if (parentItem)
insilmaril@745
   203
        return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));
insilmaril@745
   204
insilmaril@745
   205
    return 0;
insilmaril@745
   206
}
insilmaril@745
   207
insilmaril@725
   208
int TreeItem::columnCount() const
insilmaril@725
   209
{
insilmaril@791
   210
	return 1;
insilmaril@725
   211
}
insilmaril@741
   212
insilmaril@741
   213
int TreeItem::branchCount() const
insilmaril@741
   214
{
insilmaril@741
   215
    return branchCounter;
insilmaril@741
   216
}
insilmaril@749
   217
insilmaril@749
   218
int TreeItem::imageCount() const
insilmaril@749
   219
{
insilmaril@776
   220
    return imageCounter; 
insilmaril@749
   221
}
insilmaril@749
   222
insilmaril@790
   223
int TreeItem::xlinkCount() const
insilmaril@749
   224
{
insilmaril@790
   225
    return xlinkCounter; 
insilmaril@749
   226
}
insilmaril@749
   227
insilmaril@786
   228
int TreeItem::attributeCount() const 
insilmaril@786
   229
{
insilmaril@786
   230
    return attributeCounter; 
insilmaril@786
   231
}
insilmaril@786
   232
insilmaril@727
   233
int TreeItem::row() const
insilmaril@727
   234
{
insilmaril@727
   235
    if (parentItem)
insilmaril@727
   236
        return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));
insilmaril@727
   237
insilmaril@788
   238
	cout << "TI::row() pI=NULL this="<<this<<"  ***************\n";
insilmaril@727
   239
    return 0;
insilmaril@727
   240
}
insilmaril@727
   241
insilmaril@740
   242
int TreeItem::depth() 
insilmaril@740
   243
{
insilmaril@787
   244
	// Rootitem d=-1
insilmaril@787
   245
	// MapCenter d=0
insilmaril@755
   246
	int d=-2;
insilmaril@740
   247
	TreeItem *ti=this;
insilmaril@740
   248
	while (ti!=NULL)
insilmaril@740
   249
	{
insilmaril@740
   250
		ti=ti->parent();
insilmaril@740
   251
		d++;
insilmaril@740
   252
	}
insilmaril@740
   253
	return d;
insilmaril@740
   254
}
insilmaril@740
   255
insilmaril@727
   256
TreeItem *TreeItem::parent()
insilmaril@727
   257
{
insilmaril@791
   258
	//cout << "TI::parent of "<<getHeadingStd()<<"  is "<<parentItem<<endl;
insilmaril@727
   259
    return parentItem;
insilmaril@727
   260
}
insilmaril@727
   261
insilmaril@755
   262
int TreeItem::childNum()
insilmaril@755
   263
{
insilmaril@755
   264
	return parentItem->childItems.indexOf (this);
insilmaril@755
   265
}
insilmaril@755
   266
insilmaril@741
   267
int TreeItem::num()
insilmaril@741
   268
{
insilmaril@791
   269
	if (!parentItem) return -1;
insilmaril@791
   270
	return parentItem->num (this);
insilmaril@749
   271
}
insilmaril@749
   272
insilmaril@749
   273
int TreeItem::num (TreeItem *item)
insilmaril@749
   274
{
insilmaril@749
   275
	if (!item) return -1;
insilmaril@776
   276
	if (!childItems.contains(item)) return -1;
insilmaril@749
   277
	switch (item->getType())
insilmaril@749
   278
	{
insilmaril@763
   279
		case MapCenter: return childItems.indexOf (item) - branchOffset;
insilmaril@763
   280
		case Branch: return childItems.indexOf (item) - branchOffset;
insilmaril@763
   281
		case Image: return parentItem->childItems.indexOf (item) - imageOffset;
insilmaril@787
   282
		case Attribute: return parentItem->childItems.indexOf (item) - attributeOffset;
insilmaril@790
   283
		case XLink: return parentItem->childItems.indexOf (item) - xlinkOffset;
insilmaril@749
   284
		default: return -1;
insilmaril@749
   285
	}
insilmaril@741
   286
}
insilmaril@766
   287
void TreeItem::setType(const Type t)
insilmaril@766
   288
{
insilmaril@766
   289
	type=t;
insilmaril@766
   290
	itemData[1]=getTypeName();
insilmaril@766
   291
}
insilmaril@766
   292
insilmaril@766
   293
TreeItem::Type TreeItem::getType()
insilmaril@766
   294
{
insilmaril@791
   295
	if (type==Branch && depth()==0) return MapCenter;	//FIXME-3 should not be necesssary
insilmaril@766
   296
	return type;
insilmaril@766
   297
}
insilmaril@766
   298
insilmaril@766
   299
bool TreeItem::isBranchLikeType() const
insilmaril@766
   300
{
insilmaril@766
   301
	if (type==Branch ||type==MapCenter) return true;
insilmaril@766
   302
	return false;
insilmaril@766
   303
}
insilmaril@766
   304
insilmaril@766
   305
QString TreeItem::getTypeName()
insilmaril@766
   306
{
insilmaril@766
   307
	switch (type)
insilmaril@766
   308
	{
insilmaril@766
   309
		case Undefined: return QString ("Undefined");
insilmaril@766
   310
		case MapCenter: return QString ("MapCenter");
insilmaril@766
   311
		case Branch: return QString ("Branch");
insilmaril@766
   312
		case Image: return QString ("Image");
insilmaril@788
   313
		case Attribute: return QString ("Attribute");
insilmaril@790
   314
		case XLink: return QString ("XLink");
insilmaril@766
   315
		default: return QString ("TreeItem::getTypeName no typename defined?!");
insilmaril@766
   316
	}
insilmaril@766
   317
}
insilmaril@766
   318
insilmaril@725
   319
insilmaril@725
   320
QVariant TreeItem::data(int column) const
insilmaril@725
   321
{
insilmaril@725
   322
    return itemData.value(column);
insilmaril@725
   323
}
insilmaril@725
   324
insilmaril@726
   325
void TreeItem::setHeading (const QString s)
insilmaril@725
   326
{
insilmaril@726
   327
	itemData[0]=s;
insilmaril@726
   328
}
insilmaril@726
   329
insilmaril@753
   330
QString TreeItem::getHeading () const
insilmaril@726
   331
{
insilmaril@726
   332
	return itemData[0].toString();
insilmaril@726
   333
}
insilmaril@726
   334
insilmaril@755
   335
std::string TreeItem::getHeadingStd () const
insilmaril@753
   336
{
insilmaril@753
   337
	return itemData[0].toString().toStdString();
insilmaril@753
   338
}
insilmaril@753
   339
insilmaril@758
   340
void TreeItem::setHeadingColor (QColor color)
insilmaril@758
   341
{
insilmaril@758
   342
	headingColor=color;
insilmaril@758
   343
}
insilmaril@758
   344
insilmaril@758
   345
QColor TreeItem::getHeadingColor ()
insilmaril@758
   346
{
insilmaril@758
   347
	return headingColor;
insilmaril@758
   348
}
insilmaril@758
   349
insilmaril@767
   350
void TreeItem::setURL (const QString &u)
insilmaril@741
   351
{
insilmaril@767
   352
	url=u;
insilmaril@767
   353
	if (!url.isEmpty())
insilmaril@767
   354
		systemFlags.activate ("system-url");
insilmaril@767
   355
	else
insilmaril@767
   356
		systemFlags.deactivate ("system-url");
insilmaril@767
   357
}
insilmaril@767
   358
insilmaril@767
   359
QString TreeItem::getURL ()
insilmaril@767
   360
{
insilmaril@767
   361
	return url;
insilmaril@767
   362
}
insilmaril@767
   363
insilmaril@767
   364
void TreeItem::setVymLink (const QString &vl)
insilmaril@767
   365
{
insilmaril@767
   366
	if (!vl.isEmpty())
insilmaril@767
   367
	{
insilmaril@767
   368
		// We need the relative (from loading) 
insilmaril@767
   369
		// or absolute path (from User event)
insilmaril@767
   370
		// and build the absolute path.
insilmaril@767
   371
		// Note: If we have relative, use path of
insilmaril@767
   372
		// current map to build absolute path
insilmaril@767
   373
		QDir d(vl);
insilmaril@767
   374
		if (!d.path().startsWith ("/"))
insilmaril@767
   375
		{
insilmaril@767
   376
			QString p=model->getDestPath();
insilmaril@767
   377
			int i=p.findRev("/",-1);
insilmaril@767
   378
			d.setPath(p.left(i)+"/"+vl);
insilmaril@767
   379
			d.convertToAbs();
insilmaril@767
   380
		}
insilmaril@767
   381
		vymLink=d.path();
insilmaril@767
   382
		systemFlags.activate("system-vymLink");
insilmaril@767
   383
	}	
insilmaril@767
   384
	else	
insilmaril@767
   385
	{
insilmaril@767
   386
		systemFlags.deactivate("system-vymLink");
insilmaril@767
   387
		vymLink.clear();
insilmaril@767
   388
	}	
insilmaril@767
   389
}
insilmaril@767
   390
insilmaril@767
   391
QString TreeItem::getVymLink ()
insilmaril@767
   392
{
insilmaril@767
   393
	return vymLink;
insilmaril@767
   394
}
insilmaril@767
   395
insilmaril@767
   396
void TreeItem::setNote(const QString &s)
insilmaril@767
   397
{
insilmaril@767
   398
	NoteObj n;
insilmaril@767
   399
	n.setNote(s);
insilmaril@791
   400
	setNoteObj (n);
insilmaril@767
   401
}
insilmaril@767
   402
insilmaril@767
   403
void TreeItem::clearNote()
insilmaril@767
   404
{
insilmaril@767
   405
	note.clear();
insilmaril@767
   406
	systemFlags.deactivate ("system-note");
insilmaril@746
   407
}
insilmaril@746
   408
insilmaril@791
   409
void TreeItem::setNoteObj(const NoteObj &n){
insilmaril@746
   410
	note=n;
insilmaril@767
   411
	if (!note.isEmpty() && !systemFlags.isActive ("system-note"))
insilmaril@767
   412
		systemFlags.activate ("system-note");
insilmaril@767
   413
	if (note.isEmpty() && systemFlags.isActive ("system-note"))
insilmaril@767
   414
		systemFlags.deactivate ("system-note");
insilmaril@741
   415
}
insilmaril@741
   416
insilmaril@741
   417
QString TreeItem::getNote()
insilmaril@741
   418
{
insilmaril@746
   419
	return note.getNote();
insilmaril@746
   420
}
insilmaril@746
   421
insilmaril@768
   422
bool TreeItem::hasEmptyNote()
insilmaril@768
   423
{
insilmaril@768
   424
	return note.isEmpty();
insilmaril@768
   425
}
insilmaril@768
   426
insilmaril@746
   427
NoteObj TreeItem::getNoteObj()
insilmaril@746
   428
{
insilmaril@746
   429
	return note;
insilmaril@746
   430
}
insilmaril@746
   431
insilmaril@746
   432
QString TreeItem::getNoteASCII(const QString &indent, const int &width)
insilmaril@746
   433
{
insilmaril@746
   434
    return note.getNoteASCII(indent,width);
insilmaril@746
   435
}
insilmaril@746
   436
insilmaril@746
   437
QString TreeItem::getNoteASCII()
insilmaril@746
   438
{
insilmaril@746
   439
    return note.getNoteASCII();
insilmaril@746
   440
}
insilmaril@746
   441
insilmaril@746
   442
QString TreeItem::getNoteOpenDoc()
insilmaril@746
   443
{
insilmaril@746
   444
    return note.getNoteOpenDoc();
insilmaril@741
   445
}
insilmaril@741
   446
insilmaril@766
   447
void TreeItem::activateStandardFlag (const QString &name)
insilmaril@726
   448
{
insilmaril@766
   449
	standardFlags.activate (name);
insilmaril@767
   450
	model->emitDataHasChanged(this);
insilmaril@726
   451
}
insilmaril@726
   452
insilmaril@766
   453
void TreeItem::deactivateStandardFlag (const QString &name)
insilmaril@726
   454
{
insilmaril@766
   455
	standardFlags.deactivate (name);
insilmaril@767
   456
	model->emitDataHasChanged(this);
insilmaril@726
   457
}
insilmaril@726
   458
insilmaril@767
   459
void TreeItem::deactivateAllStandardFlags ()
insilmaril@753
   460
{
insilmaril@767
   461
	standardFlags.deactivateAll ();
insilmaril@767
   462
	model->emitDataHasChanged(this);
insilmaril@767
   463
}
insilmaril@767
   464
insilmaril@767
   465
void TreeItem::toggleStandardFlag(const QString &name, FlagRow *master)
insilmaril@767
   466
{
insilmaril@767
   467
	standardFlags.toggle (name,master);
insilmaril@767
   468
	model->emitDataHasChanged(this);
insilmaril@753
   469
}
insilmaril@753
   470
insilmaril@766
   471
bool TreeItem::isActiveStandardFlag (const QString &name)
insilmaril@726
   472
{
insilmaril@766
   473
	return standardFlags.isActive (name);
insilmaril@725
   474
}
insilmaril@725
   475
insilmaril@767
   476
QStringList TreeItem::activeStandardFlagNames ()
insilmaril@767
   477
{
insilmaril@767
   478
	return standardFlags.activeFlagNames();
insilmaril@767
   479
}
insilmaril@767
   480
insilmaril@770
   481
FlagRow* TreeItem::getStandardFlagRow()
insilmaril@770
   482
{
insilmaril@770
   483
	return &standardFlags;
insilmaril@770
   484
}
insilmaril@770
   485
insilmaril@776
   486
QStringList TreeItem::activeSystemFlagNames ()
insilmaril@767
   487
{
insilmaril@767
   488
	return systemFlags.activeFlagNames();
insilmaril@767
   489
}
insilmaril@767
   490
insilmaril@767
   491
bool TreeItem::canMoveDown()
insilmaril@767
   492
{
insilmaril@767
   493
	switch (type)
insilmaril@767
   494
	{
insilmaril@767
   495
		case Undefined: return false;
insilmaril@767
   496
		case MapCenter: 
insilmaril@767
   497
		case Branch: 
insilmaril@767
   498
			if (!parentItem) return false;
insilmaril@767
   499
			if (parentItem->num (this) < parentItem->branchCount()-1)
insilmaril@767
   500
				return true;
insilmaril@767
   501
			else
insilmaril@767
   502
				return false;
insilmaril@767
   503
			break;	
insilmaril@767
   504
		case Image: return false;
insilmaril@767
   505
		default: return false;
insilmaril@767
   506
	}
insilmaril@767
   507
}
insilmaril@767
   508
insilmaril@767
   509
bool TreeItem::canMoveUp()
insilmaril@767
   510
{
insilmaril@767
   511
	switch (type)
insilmaril@767
   512
	{
insilmaril@767
   513
		case MapCenter: 
insilmaril@767
   514
		case Branch: 
insilmaril@767
   515
			if (!parentItem) return false;
insilmaril@767
   516
			if (parentItem->num (this) > 0)
insilmaril@767
   517
				return true;
insilmaril@767
   518
			else
insilmaril@767
   519
				return false;
insilmaril@767
   520
			break;	
insilmaril@767
   521
		default: return false;
insilmaril@767
   522
	}
insilmaril@767
   523
}
insilmaril@767
   524
insilmaril@754
   525
void TreeItem::setID (const QString &s)
insilmaril@754
   526
{
insilmaril@754
   527
	objID=s;
insilmaril@754
   528
}
insilmaril@754
   529
insilmaril@754
   530
QString TreeItem::getID()
insilmaril@754
   531
{
insilmaril@754
   532
	return objID;
insilmaril@754
   533
}
insilmaril@754
   534
insilmaril@754
   535
insilmaril@738
   536
TreeItem* TreeItem::getChildNum(const int &n)
insilmaril@738
   537
{
insilmaril@738
   538
	if (n>=0 && n<childItems.count() )
insilmaril@738
   539
		return childItems.at(n);
insilmaril@738
   540
	else
insilmaril@738
   541
		return NULL;
insilmaril@738
   542
}
insilmaril@738
   543
insilmaril@750
   544
BranchItem* TreeItem::getFirstBranch()
insilmaril@738
   545
{
insilmaril@741
   546
	if (branchCounter>0)
insilmaril@738
   547
		return getBranchNum (branchOffset);
insilmaril@738
   548
	else
insilmaril@738
   549
		return NULL;
insilmaril@738
   550
}
insilmaril@738
   551
insilmaril@750
   552
BranchItem* TreeItem::getLastBranch()
insilmaril@738
   553
{
insilmaril@741
   554
	if (branchCounter>0)
insilmaril@741
   555
		return getBranchNum (branchOffset + branchCounter-1);
insilmaril@738
   556
	else
insilmaril@738
   557
		return NULL;
insilmaril@738
   558
}
insilmaril@738
   559
insilmaril@763
   560
BranchItem* TreeItem::getNextBranch(BranchItem *currentBranch)
insilmaril@763
   561
{
insilmaril@763
   562
	if (!currentBranch) return NULL;
insilmaril@763
   563
	int n=num (currentBranch)+1;
insilmaril@763
   564
	if (n<branchCounter)
insilmaril@763
   565
		return getBranchNum (branchOffset + n);
insilmaril@763
   566
	else
insilmaril@763
   567
		return NULL;
insilmaril@763
   568
}
insilmaril@763
   569
insilmaril@738
   570
insilmaril@750
   571
BranchItem* TreeItem::getBranchNum(const int &n)
insilmaril@738
   572
{
insilmaril@776
   573
	if (n>=0 && n<branchCounter)
insilmaril@750
   574
		return (BranchItem*)getChildNum (branchOffset + n);
insilmaril@738
   575
	else
insilmaril@738
   576
		return NULL;
insilmaril@738
   577
}
insilmaril@738
   578
insilmaril@750
   579
BranchObj* TreeItem::getBranchObjNum(const int &n)
insilmaril@750
   580
{
insilmaril@776
   581
	if (n>=0 && n<branchCounter)
insilmaril@750
   582
	{
insilmaril@776
   583
		return (BranchObj*)(getBranchNum(n)->getLMO());
insilmaril@750
   584
	} else
insilmaril@750
   585
		return NULL;
insilmaril@750
   586
}
insilmaril@750
   587
insilmaril@776
   588
ImageItem* TreeItem::getImageNum (const int &n)
insilmaril@776
   589
{
insilmaril@776
   590
	if (n>=0 && n<imageCounter)
insilmaril@776
   591
		return (ImageItem*)getChildNum (imageOffset + n);
insilmaril@776
   592
	else
insilmaril@776
   593
		return NULL;
insilmaril@776
   594
}
insilmaril@776
   595
insilmaril@776
   596
FloatImageObj* TreeItem::getImageObjNum (const int &n)	// FIXME-5 what about SVGs later?
insilmaril@776
   597
{
insilmaril@776
   598
	if (imageCounter>0 )
insilmaril@776
   599
		return (FloatImageObj*)(getImageNum(n)->getLMO());
insilmaril@776
   600
	else
insilmaril@776
   601
		return NULL;
insilmaril@776
   602
}
insilmaril@753
   603
insilmaril@790
   604
XLinkItem* TreeItem::getXLinkNum (const int &n)	
insilmaril@790
   605
{
insilmaril@790
   606
	if (n>=0 && n<xlinkCounter )
insilmaril@790
   607
		return (XLinkItem*)getChildNum (xlinkOffset +n);
insilmaril@790
   608
	else
insilmaril@790
   609
		return NULL;
insilmaril@790
   610
}
insilmaril@790
   611
insilmaril@790
   612
insilmaril@790
   613
XLinkObj* TreeItem::getXLinkObjNum (const int &n)	
insilmaril@790
   614
{
insilmaril@790
   615
	if (xlinkCounter>0 )
insilmaril@790
   616
	{
insilmaril@790
   617
		XLinkItem *xli=getXLinkNum (n);
insilmaril@790
   618
		if (!xli) return NULL;
insilmaril@790
   619
		if (xli->isBegin() )
insilmaril@790
   620
			return (XLinkObj*)(xli->getLMO());
insilmaril@790
   621
		else
insilmaril@790
   622
		{
insilmaril@790
   623
			xli=xli->getPartnerXLink();
insilmaril@790
   624
			if (!xli) return NULL;
insilmaril@790
   625
			return (XLinkObj*)(xli->getLMO());
insilmaril@790
   626
		}
insilmaril@790
   627
	}
insilmaril@790
   628
	return NULL;
insilmaril@790
   629
}
insilmaril@790
   630
insilmaril@779
   631
insilmaril@791
   632
void TreeItem::setHideTmp (HideTmpMode mode)  //FIXME-2	update visibility in derived objects...
insilmaril@753
   633
{
insilmaril@753
   634
		/*
insilmaril@753
   635
	if (type==Image)
insilmaril@791
   636
		((ImageItem*)this)->updateVisibility();
insilmaril@791
   637
		*/
insilmaril@753
   638
insilmaril@753
   639
		if (mode==HideExport && (hideExport || hasHiddenExportParent() ) )
insilmaril@753
   640
		{
insilmaril@753
   641
			// Hide stuff according to hideExport flag and parents
insilmaril@791
   642
	//		if (lmo) lmo->setVisibility (false);
insilmaril@791
   643
			hidden=true;
insilmaril@753
   644
		}else
insilmaril@753
   645
		{
insilmaril@753
   646
			// Do not hide, but still take care of scrolled status
insilmaril@791
   647
			hidden=false;
insilmaril@791
   648
/*
insilmaril@753
   649
			XXXXXXXX treeItem should be THIS
insilmaril@753
   650
insilmaril@753
   651
			move visible to TreeItem???
insilmaril@753
   652
insilmaril@753
   653
			BranchObj now has updateContents
insilmaril@791
   654
*/
insilmaril@791
   655
/*
insilmaril@791
   656
		if (isBranchLikeType() )
insilmaril@791
   657
			((BranchItem*)this)->updateVisibility();
insilmaril@753
   658
insilmaril@753
   659
			if ( ((BranchItem*)treeItem)->hasScrolledParent((BranchItem*)treeItem))
insilmaril@753
   660
				setVisibility (false);
insilmaril@753
   661
			else
insilmaril@753
   662
				setVisibility (true);
insilmaril@791
   663
*/			
insilmaril@753
   664
		}	
insilmaril@753
   665
insilmaril@791
   666
/*
insilmaril@753
   667
		// And take care of my children
insilmaril@753
   668
		for (int i=0; i<branchCount(); ++i)
insilmaril@791
   669
			getBranchNum(i)->setHideTmp (mode);	// FIXME-4 maybe also consider images and other types
insilmaril@791
   670
*/
insilmaril@753
   671
}
insilmaril@753
   672
insilmaril@753
   673
bool TreeItem::hasHiddenExportParent()
insilmaril@753
   674
{
insilmaril@753
   675
	// Calls parents recursivly to
insilmaril@753
   676
	// find out, if we or parents are temp. hidden
insilmaril@753
   677
insilmaril@753
   678
	if (hidden || hideExport) return true;
insilmaril@753
   679
insilmaril@753
   680
	if (parentItem) 
insilmaril@753
   681
		return parentItem->hasHiddenExportParent();
insilmaril@753
   682
	else
insilmaril@753
   683
		return false;
insilmaril@753
   684
}
insilmaril@753
   685
insilmaril@753
   686
insilmaril@753
   687
void TreeItem::setHideInExport(bool b) 
insilmaril@753
   688
{
insilmaril@776
   689
	if (type==Branch || type==Image)
insilmaril@753
   690
	{
insilmaril@753
   691
		hideExport=b;
insilmaril@753
   692
		if (b)
insilmaril@777
   693
			systemFlags.activate("system-hideInExport");
insilmaril@753
   694
		else	
insilmaril@777
   695
			systemFlags.deactivate("system-hideInExport");
insilmaril@753
   696
	}
insilmaril@753
   697
}	
insilmaril@753
   698
insilmaril@753
   699
bool TreeItem::hideInExport()
insilmaril@753
   700
{
insilmaril@753
   701
	return hideExport;
insilmaril@753
   702
}	
insilmaril@753
   703
insilmaril@791
   704
void TreeItem::updateVisibility()
insilmaril@791
   705
{
insilmaril@791
   706
	// overloaded in derived objects
insilmaril@791
   707
}	
insilmaril@791
   708
insilmaril@753
   709
bool TreeItem::isHidden()
insilmaril@753
   710
{
insilmaril@753
   711
	return hidden;
insilmaril@753
   712
}	
insilmaril@753
   713
insilmaril@779
   714
QString TreeItem::getGeneralAttr()
insilmaril@777
   715
{
insilmaril@780
   716
	QString s;
insilmaril@779
   717
	if (hideExport)
insilmaril@780
   718
		 s+=attribut("hideInExport","true");
insilmaril@780
   719
	if (!url.isEmpty())
insilmaril@780
   720
		s+=attribut ("url",url);
insilmaril@780
   721
	if (!vymLink.isEmpty())
insilmaril@780
   722
		s+=attribut ("vymLink",vymLink);
insilmaril@780
   723
	return s;	
insilmaril@777
   724
}
insilmaril@753
   725
insilmaril@726
   726