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