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