xml-vym.cpp
author insilmaril
Tue, 07 Jul 2009 09:34:24 +0000
changeset 779 1fb50e79661c
parent 777 8acac4fade1b
child 780 fe839bdfd10c
permissions -rw-r--r--
Hiding of links works again
insilmaril@576
     1
#include "xml-vym.h"
insilmaril@576
     2
insilmaril@576
     3
#include <QMessageBox>
insilmaril@576
     4
#include <QColor>
insilmaril@576
     5
#include <QTextStream>
insilmaril@576
     6
#include <iostream>
insilmaril@611
     7
#include <typeinfo>
insilmaril@576
     8
insilmaril@749
     9
#include "branchitem.h"
insilmaril@576
    10
#include "misc.h"
insilmaril@576
    11
#include "settings.h"
insilmaril@576
    12
#include "linkablemapobj.h"
insilmaril@742
    13
#include "mainwindow.h"
insilmaril@576
    14
#include "version.h"
insilmaril@576
    15
insilmaril@776
    16
static ImageItem *lastImageItem;
insilmaril@776
    17
static MapItem *lastMI;
insilmaril@576
    18
insilmaril@742
    19
extern Main *mainWindow;
insilmaril@576
    20
extern Settings settings;
insilmaril@576
    21
extern QString vymVersion;
insilmaril@576
    22
insilmaril@576
    23
bool parseVYMHandler::startDocument()
insilmaril@576
    24
{
insilmaril@576
    25
    errorProt = "";
insilmaril@576
    26
    state = StateInit;
insilmaril@576
    27
    laststate = StateInit;
insilmaril@576
    28
	stateStack.clear();
insilmaril@576
    29
	stateStack.append(StateInit);
insilmaril@576
    30
	htmldata="";
insilmaril@576
    31
	isVymPart=false;
insilmaril@576
    32
    return true;
insilmaril@576
    33
}
insilmaril@576
    34
insilmaril@576
    35
bool parseVYMHandler::startElement  ( const QString&, const QString&,
insilmaril@576
    36
                    const QString& eName, const QXmlAttributes& atts ) 
insilmaril@576
    37
{
insilmaril@576
    38
    QColor col;
insilmaril@576
    39
	/* Testing
insilmaril@660
    40
	cout << "startElement <"<< qPrintable(eName)
insilmaril@576
    41
		<<">  state="<<state 
insilmaril@576
    42
		<<"  laststate="<<stateStack.last()
insilmaril@576
    43
		<<"   loadMode="<<loadMode
insilmaril@735
    44
	//	<<"       line="<<QXmlDefaultHandler::lineNumber()
insilmaril@576
    45
		<<endl;
insilmaril@736
    46
	*/	
insilmaril@576
    47
	stateStack.append (state);	
insilmaril@576
    48
    if ( state == StateInit && (eName == "vymmap")  ) 
insilmaril@576
    49
	{
insilmaril@576
    50
        state = StateMap;
insilmaril@742
    51
		branchesTotal=branchesCurrent=0;
insilmaril@647
    52
insilmaril@647
    53
		if (loadMode==NewMap )
insilmaril@576
    54
		{
insilmaril@647
    55
			// Create mapCenter
insilmaril@647
    56
			model->clear();
insilmaril@776
    57
			lastBranch=NULL;
insilmaril@647
    58
insilmaril@576
    59
			if (!atts.value( "author").isEmpty() )
insilmaril@647
    60
				model->setAuthor(atts.value( "author" ) );
insilmaril@576
    61
			if (!atts.value( "comment").isEmpty() )
insilmaril@647
    62
				model->setComment (atts.value( "comment" ) );
insilmaril@749
    63
			if (!atts.value( "branchCount").isEmpty() )
insilmaril@742
    64
			{
insilmaril@749
    65
				branchesTotal=atts.value("branchCount").toInt();
insilmaril@742
    66
				if (branchesTotal>10)
insilmaril@742
    67
				{
insilmaril@742
    68
					mainWindow->setProgressMinimum (0);
insilmaril@742
    69
					mainWindow->setProgressMaximum (branchesTotal);
insilmaril@742
    70
					mainWindow->setProgressValue(0);
insilmaril@742
    71
				}
insilmaril@742
    72
			} else
insilmaril@742
    73
			{
insilmaril@742
    74
				mainWindow->setProgressMinimum (0);
insilmaril@742
    75
				mainWindow->setProgressMaximum (0);
insilmaril@742
    76
				mainWindow->setProgressValue(0);
insilmaril@742
    77
			}
insilmaril@742
    78
insilmaril@742
    79
				
insilmaril@576
    80
			if (!atts.value( "backgroundColor").isEmpty() )
insilmaril@576
    81
			{
insilmaril@576
    82
				col.setNamedColor(atts.value("backgroundColor"));
insilmaril@647
    83
				model->getScene()->setBackgroundBrush(col);
insilmaril@576
    84
			}	    
insilmaril@576
    85
			if (!atts.value( "selectionColor").isEmpty() )
insilmaril@576
    86
			{
insilmaril@576
    87
				col.setNamedColor(atts.value("selectionColor"));
insilmaril@721
    88
				model->setSelectionColor(col);
insilmaril@576
    89
			}	    
insilmaril@576
    90
			if (!atts.value( "linkColorHint").isEmpty() ) 
insilmaril@576
    91
			{
insilmaril@576
    92
				if (atts.value("linkColorHint")=="HeadingColor")
insilmaril@721
    93
					model->setMapLinkColorHint(LinkableMapObj::HeadingColor);
insilmaril@576
    94
				else
insilmaril@721
    95
					model->setMapLinkColorHint(LinkableMapObj::DefaultColor);
insilmaril@576
    96
			}
insilmaril@576
    97
			if (!atts.value( "linkStyle").isEmpty() ) 
insilmaril@721
    98
				model->setMapLinkStyle(atts.value("linkStyle"));
insilmaril@576
    99
			if (!atts.value( "linkColor").isEmpty() ) 
insilmaril@576
   100
			{
insilmaril@576
   101
				col.setNamedColor(atts.value("linkColor"));
insilmaril@721
   102
				model->setMapDefLinkColor(col);
insilmaril@576
   103
			}	
insilmaril@576
   104
			if (!atts.value( "defXLinkColor").isEmpty() ) 
insilmaril@576
   105
			{
insilmaril@576
   106
				col.setNamedColor(atts.value("defXLinkColor"));
insilmaril@721
   107
				model->setMapDefXLinkColor(col);
insilmaril@576
   108
			}	
insilmaril@576
   109
			if (!atts.value( "defXLinkWidth").isEmpty() ) 
insilmaril@721
   110
				model->setMapDefXLinkWidth(atts.value("defXLinkWidth").toInt ());
insilmaril@576
   111
		}	
insilmaril@727
   112
		// Check version
insilmaril@727
   113
		if (!atts.value( "version").isEmpty() ) 
insilmaril@727
   114
		{
insilmaril@727
   115
			if (!checkVersion(atts.value("version")))
insilmaril@727
   116
				QMessageBox::warning( 0, "Warning: Version Problem" ,
insilmaril@727
   117
				   "<h3>Map is newer than VYM</h3>"
insilmaril@727
   118
				   "<p>The map you are just trying to load was "
insilmaril@727
   119
				   "saved using vym " +atts.value("version")+". "
insilmaril@727
   120
				   "The version of this vym is " + vymVersion + 
insilmaril@727
   121
				   ". If you run into problems after pressing "
insilmaril@727
   122
				   "the ok-button below, updating vym should help.");
insilmaril@727
   123
			else	   
insilmaril@727
   124
				model->setVersion(atts.value( "version" ));
insilmaril@727
   125
insilmaril@727
   126
		}
insilmaril@727
   127
insilmaril@576
   128
	} else if ( eName == "select" && state == StateMap ) 
insilmaril@576
   129
	{
insilmaril@576
   130
		state=StateMapSelect;
insilmaril@576
   131
	} else if ( eName == "setting" && state == StateMap ) 
insilmaril@576
   132
	{
insilmaril@576
   133
		state=StateMapSetting;
insilmaril@576
   134
		if (loadMode==NewMap)
insilmaril@576
   135
			readSettingAttr (atts);
insilmaril@576
   136
	} else if ( eName == "mapcenter" && state == StateMap ) 
insilmaril@576
   137
	{
insilmaril@576
   138
		state=StateMapCenter;
insilmaril@576
   139
		if (loadMode==NewMap)
insilmaril@576
   140
		{	
insilmaril@576
   141
			// Really use the found mapcenter as MCO in a new map
insilmaril@647
   142
insilmaril@776
   143
			lastBranch=model->createMapCenter(); 
insilmaril@576
   144
		} else
insilmaril@576
   145
		{
insilmaril@576
   146
			// Treat the found mapcenter as a branch 
insilmaril@576
   147
			// in an existing map
insilmaril@753
   148
			BranchItem *bi=model->getSelectedBranchItem();
insilmaril@753
   149
			if (bi)
insilmaril@576
   150
			{
insilmaril@776
   151
				lastBranch=bi;
insilmaril@576
   152
				if (loadMode==ImportAdd)
insilmaril@576
   153
				{
insilmaril@776
   154
					lastBranch=model->createBranch(lastBranch);
insilmaril@753
   155
				} //else
insilmaril@753
   156
					//FIXME-3 lastBranch->clear();
insilmaril@576
   157
			} else
insilmaril@576
   158
				return false;
insilmaril@576
   159
		}
insilmaril@576
   160
		readBranchAttr (atts);
insilmaril@576
   161
	} else if ( 
insilmaril@576
   162
		(eName == "standardflag" ||eName == "standardFlag") && 
insilmaril@576
   163
		(state == StateMapCenter || state==StateBranch)) 
insilmaril@576
   164
	{
insilmaril@576
   165
		state=StateStandardFlag;
insilmaril@576
   166
	} else if ( eName == "heading" && (state == StateMapCenter||state==StateBranch)) 
insilmaril@576
   167
	{
insilmaril@576
   168
		laststate=state;
insilmaril@576
   169
		state=StateHeading;
insilmaril@576
   170
		if (!atts.value( "textColor").isEmpty() ) 
insilmaril@576
   171
		{
insilmaril@576
   172
			col.setNamedColor(atts.value("textColor"));
insilmaril@776
   173
			lastBranch->setHeadingColor(col );
insilmaril@576
   174
		}	    
insilmaril@576
   175
	} else if ( eName == "note" && 
insilmaril@576
   176
				(state == StateMapCenter ||state==StateBranch))
insilmaril@576
   177
	{	// only for backward compatibility (<1.4.6). Use htmlnote now.
insilmaril@576
   178
		state=StateNote;
insilmaril@576
   179
		if (!readNoteAttr (atts) ) return false;
insilmaril@576
   180
	} else if ( eName == "htmlnote" && state == StateMapCenter) 
insilmaril@576
   181
	{
insilmaril@576
   182
		laststate=state;
insilmaril@576
   183
		state=StateHtmlNote;
insilmaril@576
   184
    } else if ( eName == "floatimage" && 
insilmaril@576
   185
				(state == StateMapCenter ||state==StateBranch)) 
insilmaril@576
   186
	{
insilmaril@776
   187
		state=StateImage;
insilmaril@776
   188
		lastImage=model->createImage(lastBranch);
insilmaril@776
   189
		if (!readImageAttr(atts)) return false;
insilmaril@576
   190
	} else if ( (eName == "branch"||eName=="floatimage") && state == StateMap) 
insilmaril@576
   191
	{
insilmaril@576
   192
		// This is used in vymparts, which have no mapcenter!
insilmaril@576
   193
		isVymPart=true;
insilmaril@753
   194
		TreeItem *ti=model->getSelectedItem();
insilmaril@753
   195
		if (!ti)
insilmaril@576
   196
		{
insilmaril@576
   197
			// If a vym part is _loaded_ (not imported), 
insilmaril@576
   198
			// selection==lmo==NULL
insilmaril@576
   199
			// Treat it like ImportAdd then...
insilmaril@576
   200
			loadMode=ImportAdd;
insilmaril@746
   201
			// FIXME-3 lmo=model->first()->getLMO();		
insilmaril@741
   202
			// Do we really have no MCO when loading?????
insilmaril@741
   203
			cout << "xml-vym aborted\n";
insilmaril@576
   204
		}	
insilmaril@753
   205
		if (ti && ti->isBranchLikeType() )
insilmaril@576
   206
		{
insilmaril@776
   207
			lastBranch=(BranchItem*)ti;
insilmaril@576
   208
			if (eName=="branch")
insilmaril@576
   209
			{
insilmaril@576
   210
				state=StateBranch;
insilmaril@576
   211
				if (loadMode==ImportAdd)
insilmaril@576
   212
				{
insilmaril@776
   213
					lastBranch=model->createBranch(lastBranch);
insilmaril@576
   214
					
insilmaril@576
   215
				} else
insilmaril@753
   216
					//FIXME-2 lastBranch->clear();
insilmaril@576
   217
				readBranchAttr (atts);
insilmaril@576
   218
			} else if (eName=="floatimage")
insilmaril@576
   219
			{
insilmaril@776
   220
				state=StateImage;
insilmaril@776
   221
				lastImage=model->createImage (lastBranch);
insilmaril@776
   222
				if (!readImageAttr(atts)) return false;
insilmaril@576
   223
			} else return false;
insilmaril@576
   224
		} else return false;
insilmaril@576
   225
	} else if ( eName == "branch" && state == StateMapCenter) 
insilmaril@576
   226
	{
insilmaril@576
   227
		state=StateBranch;
insilmaril@776
   228
		lastBranch=model->createBranch(lastBranch);
insilmaril@576
   229
		readBranchAttr (atts);
insilmaril@576
   230
	} else if ( eName == "htmlnote" && state == StateBranch) 
insilmaril@576
   231
	{
insilmaril@576
   232
		laststate=state;
insilmaril@576
   233
		state=StateHtmlNote;
insilmaril@576
   234
		no.clear();
insilmaril@576
   235
		if (!atts.value( "fonthint").isEmpty() ) 
insilmaril@576
   236
			no.setFontHint(atts.value ("fonthint") );
insilmaril@576
   237
	} else if ( eName == "frame" && (state == StateBranch||state==StateMapCenter)) 
insilmaril@576
   238
	{
insilmaril@576
   239
		laststate=state;
insilmaril@576
   240
		state=StateFrame;
insilmaril@576
   241
		if (!readFrameAttr(atts)) return false;
insilmaril@576
   242
    } else if ( eName == "xlink" && state == StateBranch ) 
insilmaril@576
   243
	{
insilmaril@576
   244
		state=StateBranchXLink;
insilmaril@576
   245
		if (!readXLinkAttr (atts)) return false;
insilmaril@576
   246
    } else if ( eName == "branch" && state == StateBranch ) 
insilmaril@576
   247
	{
insilmaril@776
   248
		lastBranch=model->createBranch(lastBranch);
insilmaril@576
   249
		readBranchAttr (atts);
insilmaril@576
   250
    } else if ( eName == "html" && state == StateHtmlNote ) 
insilmaril@576
   251
	{
insilmaril@576
   252
		state=StateHtml;
insilmaril@576
   253
		htmldata="<"+eName;
insilmaril@576
   254
		readHtmlAttr(atts);
insilmaril@576
   255
		htmldata+=">";
insilmaril@576
   256
    } else if ( state == StateHtml ) 
insilmaril@576
   257
	{
insilmaril@576
   258
		// accept all while in html mode,
insilmaril@576
   259
		htmldata+="<"+eName;
insilmaril@576
   260
		readHtmlAttr(atts);
insilmaril@576
   261
		htmldata+=">";
insilmaril@576
   262
    } else
insilmaril@576
   263
        return false;   // Error
insilmaril@576
   264
    return true;
insilmaril@576
   265
}
insilmaril@576
   266
insilmaril@576
   267
bool parseVYMHandler::endElement  ( const QString&, const QString&, const QString &eName)
insilmaril@576
   268
{
insilmaril@576
   269
	/* Testing
insilmaril@660
   270
	cout << "endElement </" <<qPrintable(eName)
insilmaril@576
   271
		<<">  state=" <<state 
insilmaril@576
   272
		<<"  laststate=" <<laststate
insilmaril@576
   273
		<<"  stateStack="<<stateStack.last() 
insilmaril@576
   274
		<<endl;
insilmaril@576
   275
	*/
insilmaril@576
   276
    switch ( state ) 
insilmaril@576
   277
	{
insilmaril@742
   278
		case StateMap:
insilmaril@742
   279
			mainWindow->removeProgressBar();
insilmaril@742
   280
			break;
insilmaril@768
   281
        case StateMapCenter: 
insilmaril@777
   282
			model->selectParent();	// FIXME-3 really needed to "select"? Maybe optimize...
insilmaril@776
   283
			model->emitDataHasChanged (lastBranch);
insilmaril@776
   284
			lastBranch=(BranchItem*)(lastBranch->parent());
insilmaril@776
   285
			lastBranch->setLastSelectedBranch (0);	// Reset last selected to first child branch
insilmaril@768
   286
            break;
insilmaril@576
   287
        case StateBranch: 
insilmaril@777
   288
			model->selectParent();// FIXME-3 really needed to "select"? Maybe optimize...
insilmaril@776
   289
			model->emitDataHasChanged (lastBranch);
insilmaril@776
   290
			lastBranch=(BranchItem*)(lastBranch->parent());
insilmaril@776
   291
			lastBranch->setLastSelectedBranch (0);	// Reset last selected to first child branch
insilmaril@576
   292
            break;
insilmaril@576
   293
        case StateHtml: 
insilmaril@576
   294
			htmldata+="</"+eName+">";
insilmaril@576
   295
			if (eName=="html")
insilmaril@576
   296
			{
insilmaril@576
   297
				state=StateHtmlNote;  
insilmaril@576
   298
				htmldata.replace ("<br></br>","<br />");
insilmaril@576
   299
				no.setNote (htmldata);
insilmaril@776
   300
				lastBranch->setNoteObj (no);
insilmaril@576
   301
			}	
insilmaril@576
   302
			break;
insilmaril@576
   303
		default: 
insilmaril@576
   304
			break;
insilmaril@576
   305
    }  
insilmaril@576
   306
	state=stateStack.takeLast();	
insilmaril@576
   307
	return true;
insilmaril@576
   308
}
insilmaril@576
   309
insilmaril@576
   310
bool parseVYMHandler::characters   ( const QString& ch)
insilmaril@576
   311
{
insilmaril@761
   312
	//cout << "characters \""<<ch.toStdString()<<"\"  state="<<state <<"  laststate="<<laststate<<endl;
insilmaril@576
   313
insilmaril@576
   314
	QString ch_org=quotemeta (ch);
insilmaril@576
   315
    QString ch_simplified=ch.simplifyWhiteSpace();
insilmaril@576
   316
    if ( ch_simplified.isEmpty() ) return true;
insilmaril@576
   317
insilmaril@576
   318
    switch ( state ) 
insilmaril@576
   319
    {
insilmaril@576
   320
        case StateInit: break;
insilmaril@576
   321
        case StateMap: break; 
insilmaril@576
   322
		case StateMapSelect:
insilmaril@647
   323
			model->select(ch_simplified);
insilmaril@576
   324
			break;
insilmaril@576
   325
		case StateMapSetting:break;
insilmaril@576
   326
        case StateMapCenter: break;
insilmaril@576
   327
        case StateNote:
insilmaril@776
   328
			lastBranch->setNote(ch_simplified);
insilmaril@576
   329
			break;
insilmaril@576
   330
        case StateBranch: break;
insilmaril@576
   331
        case StateStandardFlag: 
insilmaril@776
   332
            lastBranch->activateStandardFlag(ch_simplified); 
insilmaril@576
   333
            break;
insilmaril@776
   334
        case StateImage: break;
insilmaril@576
   335
        case StateHtmlNote: break;
insilmaril@576
   336
        case StateHtml:
insilmaril@576
   337
			htmldata+=ch_org;
insilmaril@576
   338
			break;
insilmaril@576
   339
        case StateHeading: 
insilmaril@776
   340
            lastBranch->setHeading(ch_simplified);
insilmaril@576
   341
            break;
insilmaril@576
   342
        default: 
insilmaril@576
   343
			return false;
insilmaril@576
   344
    }
insilmaril@576
   345
    return true;
insilmaril@576
   346
}
insilmaril@576
   347
insilmaril@576
   348
QString parseVYMHandler::errorString() 
insilmaril@576
   349
{
insilmaril@576
   350
    return "the document is not in the VYM file format";
insilmaril@576
   351
}
insilmaril@576
   352
insilmaril@753
   353
bool parseVYMHandler::readBranchAttr (const QXmlAttributes& a)	//FIXME-2
insilmaril@576
   354
{
insilmaril@772
   355
	mainWindow->setProgressValue (branchesCurrent++);
insilmaril@749
   356
insilmaril@776
   357
	lastMI=lastBranch;
insilmaril@776
   358
insilmaril@756
   359
	if (!readOOAttr(a)) return false;
insilmaril@576
   360
insilmaril@576
   361
	if (!a.value( "scrolled").isEmpty() )
insilmaril@779
   362
		lastBranch->toggleScroll();	//FIXME-3 in endElement unscroll again, if branch is still empty 
insilmaril@779
   363
		// (interesting for import of KDE bookmarks)
insilmaril@763
   364
/*
insilmaril@576
   365
	if (!a.value( "frameType").isEmpty() ) 
insilmaril@576
   366
		lastOO->setFrameType (a.value("frameType")); //Compatibility 1.8.1
insilmaril@576
   367
insilmaril@576
   368
	if (!a.value( "incImgV").isEmpty() ) 
insilmaril@576
   369
	{	
insilmaril@576
   370
		if (a.value("incImgV")=="true")
insilmaril@576
   371
			lastBranch->setIncludeImagesVer(true);
insilmaril@576
   372
		else	
insilmaril@576
   373
			lastBranch->setIncludeImagesVer(false);
insilmaril@576
   374
	}	
insilmaril@576
   375
	if (!a.value( "incImgH").isEmpty() ) 
insilmaril@576
   376
	{	
insilmaril@576
   377
		if (a.value("incImgH")=="true")
insilmaril@576
   378
			lastBranch->setIncludeImagesHor(true);
insilmaril@576
   379
		else	
insilmaril@576
   380
			lastBranch->setIncludeImagesHor(false);
insilmaril@576
   381
	}	
insilmaril@753
   382
*/	
insilmaril@576
   383
	return true;	
insilmaril@576
   384
}
insilmaril@576
   385
insilmaril@777
   386
bool parseVYMHandler::readFrameAttr (const QXmlAttributes& a)	// FIXME-4 does not work if there is no lmo for treeitem
insilmaril@576
   387
{
insilmaril@777
   388
	if (lastMI)
insilmaril@576
   389
	{
insilmaril@777
   390
		OrnamentedObj* oo=(OrnamentedObj*)(lastMI->getLMO()); 
insilmaril@777
   391
		if (oo)
insilmaril@576
   392
		{
insilmaril@777
   393
			bool ok;
insilmaril@777
   394
			int x;
insilmaril@777
   395
			{
insilmaril@777
   396
				if (!a.value( "frameType").isEmpty() ) 
insilmaril@777
   397
					oo->setFrameType (a.value("frameType"));
insilmaril@777
   398
				if (!a.value( "penColor").isEmpty() ) 
insilmaril@777
   399
					oo->setFramePenColor (a.value("penColor"));
insilmaril@777
   400
				if (!a.value( "brushColor").isEmpty() ) 
insilmaril@777
   401
					oo->setFrameBrushColor (a.value("brushColor"));
insilmaril@777
   402
				if (!a.value( "padding").isEmpty() ) 
insilmaril@777
   403
				{
insilmaril@777
   404
					x=a.value("padding").toInt(&ok);
insilmaril@777
   405
					if (ok) oo->setFramePadding(x);
insilmaril@777
   406
				}	
insilmaril@777
   407
				if (!a.value( "borderWidth").isEmpty() ) 
insilmaril@777
   408
				{
insilmaril@777
   409
					x=a.value("borderWidth").toInt(&ok);
insilmaril@777
   410
					if (ok) oo->setFrameBorderWidth(x);
insilmaril@777
   411
				}	
insilmaril@777
   412
			}		
insilmaril@777
   413
			return true;
insilmaril@777
   414
		}
insilmaril@777
   415
	}
insilmaril@777
   416
	return false;
insilmaril@576
   417
}
insilmaril@576
   418
insilmaril@576
   419
bool parseVYMHandler::readOOAttr (const QXmlAttributes& a)
insilmaril@576
   420
{
insilmaril@777
   421
	if (lastMI)	//FIXME-1  below lastBranch is used, not lastMI. So it might not work for images
insilmaril@576
   422
	{
insilmaril@576
   423
		bool okx,oky;
insilmaril@585
   424
		float x,y;
insilmaril@576
   425
		if (!a.value( "relPosX").isEmpty() ) 
insilmaril@576
   426
		{
insilmaril@576
   427
			if (!a.value( "relPosY").isEmpty() ) 
insilmaril@576
   428
			{
insilmaril@585
   429
				x=a.value("relPosX").toFloat (&okx);
insilmaril@585
   430
				y=a.value("relPosY").toFloat (&oky);
insilmaril@576
   431
				if (okx && oky  )
insilmaril@776
   432
					lastBranch->setRelPos (QPointF(x,y));
insilmaril@576
   433
				else
insilmaril@576
   434
					return false;   // Couldn't read relPos
insilmaril@576
   435
			}           
insilmaril@576
   436
		}           
insilmaril@652
   437
		if (!a.value( "absPosX").isEmpty() && loadMode==NewMap ) 
insilmaril@576
   438
		{
insilmaril@576
   439
			if (!a.value( "absPosY").isEmpty() ) 
insilmaril@576
   440
			{
insilmaril@585
   441
				x=a.value("absPosX").toFloat (&okx);
insilmaril@585
   442
				y=a.value("absPosY").toFloat (&oky);
insilmaril@576
   443
				if (okx && oky  )
insilmaril@776
   444
					lastBranch->setAbsPos (QPointF(x,y));
insilmaril@576
   445
				else
insilmaril@576
   446
					return false;   // Couldn't read absPos
insilmaril@576
   447
			}           
insilmaril@576
   448
		}           
insilmaril@768
   449
		//if (!a.value( "id").isEmpty() ) 
insilmaril@776
   450
		//	lastBranch->setID (a.value ("id"));
insilmaril@768
   451
			
insilmaril@576
   452
		if (!a.value( "url").isEmpty() ) 
insilmaril@776
   453
			lastBranch->setURL (a.value ("url"));
insilmaril@576
   454
		if (!a.value( "vymLink").isEmpty() ) 
insilmaril@776
   455
			lastBranch->setVymLink (a.value ("vymLink"));
insilmaril@576
   456
		if (!a.value( "hideInExport").isEmpty() ) 
insilmaril@576
   457
			if (a.value("hideInExport")=="true")
insilmaril@776
   458
				lastBranch->setHideInExport(true);
insilmaril@576
   459
insilmaril@576
   460
		if (!a.value( "hideLink").isEmpty()) 
insilmaril@576
   461
		{
insilmaril@576
   462
			if (a.value ("hideLink") =="true")
insilmaril@779
   463
				lastMI->setHideLinkUnselected(true);
insilmaril@576
   464
			else	
insilmaril@779
   465
				lastMI->setHideLinkUnselected(false);
insilmaril@576
   466
		}	
insilmaril@576
   467
	}
insilmaril@576
   468
	return true;	
insilmaril@576
   469
}
insilmaril@576
   470
insilmaril@576
   471
bool parseVYMHandler::readNoteAttr (const QXmlAttributes& a)
insilmaril@576
   472
{	// only for backward compatibility (<1.4.6). Use htmlnote now.
insilmaril@576
   473
	no.clear();
insilmaril@576
   474
	QString fn;
insilmaril@576
   475
	if (!a.value( "href").isEmpty() ) 
insilmaril@576
   476
	{
insilmaril@576
   477
		// Load note
insilmaril@576
   478
		fn=parseHREF(a.value ("href") );
insilmaril@576
   479
		QFile file (fn);
insilmaril@576
   480
		QString s;						// Reading a note
insilmaril@576
   481
insilmaril@576
   482
		if ( !file.open( QIODevice::ReadOnly) )
insilmaril@576
   483
		{
insilmaril@576
   484
			qWarning ("parseVYMHandler::readNoteAttr:  Couldn't load "+fn);
insilmaril@576
   485
			return false;
insilmaril@576
   486
		}	
insilmaril@576
   487
		QTextStream stream( &file );
insilmaril@576
   488
		QString lines;
insilmaril@576
   489
		while ( !stream.atEnd() ) {
insilmaril@576
   490
			lines += stream.readLine()+"\n"; 
insilmaril@576
   491
		}
insilmaril@576
   492
		file.close();
insilmaril@576
   493
insilmaril@576
   494
		lines ="<html><head><meta name=\"qrichtext\" content=\"1\" /></head><body>"+lines + "</p></body></html>";
insilmaril@576
   495
		no.setNote (lines);
insilmaril@576
   496
	}		
insilmaril@576
   497
	if (!a.value( "fonthint").isEmpty() ) 
insilmaril@576
   498
		no.setFontHint(a.value ("fonthint") );
insilmaril@776
   499
	lastBranch->setNoteObj(no);
insilmaril@576
   500
	return true;
insilmaril@576
   501
}
insilmaril@576
   502
insilmaril@776
   503
bool parseVYMHandler::readImageAttr (const QXmlAttributes& a)
insilmaril@576
   504
{
insilmaril@776
   505
	lastMI=lastImage;
insilmaril@576
   506
	
insilmaril@576
   507
	//if (!readOOAttr(a)) return false;
insilmaril@576
   508
insilmaril@776
   509
	/* FIXME-1 if (!a.value( "useOrientation").isEmpty() ) 
insilmaril@576
   510
	{
insilmaril@576
   511
		if (a.value ("useOrientation") =="true")
insilmaril@776
   512
			lastImage->setUseOrientation (true);
insilmaril@576
   513
		else	
insilmaril@776
   514
			lastImage->setUseOrientation (false);
insilmaril@576
   515
	}	
insilmaril@776
   516
	*/
insilmaril@576
   517
	if (!a.value( "href").isEmpty() )
insilmaril@576
   518
	{
insilmaril@776
   519
		// Load Image
insilmaril@776
   520
		if (!lastImage->load (parseHREF(a.value ("href") ) ))
insilmaril@576
   521
		{
insilmaril@576
   522
			QMessageBox::warning( 0, "Warning: " ,
insilmaril@776
   523
				"Couldn't load image\n"+parseHREF(a.value ("href") ));
insilmaril@776
   524
			lastImage=NULL;
insilmaril@576
   525
			return true;
insilmaril@576
   526
		}
insilmaril@576
   527
		
insilmaril@576
   528
	}	
insilmaril@576
   529
	if (!a.value( "zPlane").isEmpty() ) 
insilmaril@776
   530
		lastImage->setZValue (a.value("zPlane").toInt ());
insilmaril@596
   531
    float x,y;
insilmaril@576
   532
    bool okx,oky;
insilmaril@576
   533
	if (!a.value( "relPosX").isEmpty() ) 
insilmaril@576
   534
	{
insilmaril@576
   535
		if (!a.value( "relPosY").isEmpty() ) 
insilmaril@576
   536
		{
insilmaril@576
   537
			// read relPos
insilmaril@585
   538
			x=a.value("relPosX").toFloat (&okx);
insilmaril@585
   539
			y=a.value("relPosY").toFloat (&oky);
insilmaril@576
   540
			if (okx && oky) 
insilmaril@777
   541
				lastImage->setRelPos (QPointF (x,y) );
insilmaril@576
   542
			else
insilmaril@576
   543
				// Couldn't read relPos
insilmaril@576
   544
				return false;  
insilmaril@576
   545
		}           
insilmaril@576
   546
	}	
insilmaril@576
   547
	
insilmaril@777
   548
	//FIXME-3 if (!readOOAttr(a)) return false;
insilmaril@576
   549
insilmaril@776
   550
	if (!a.value ("originalName").isEmpty() )
insilmaril@576
   551
	{
insilmaril@776
   552
		lastImage->setOriginalFilename (a.value("originalName"));
insilmaril@576
   553
	}
insilmaril@576
   554
	return true;
insilmaril@576
   555
}
insilmaril@576
   556
insilmaril@576
   557
bool parseVYMHandler::readXLinkAttr (const QXmlAttributes& a)
insilmaril@576
   558
{
insilmaril@576
   559
	QColor col;
insilmaril@576
   560
	bool okx;
insilmaril@576
   561
	bool success=false;
insilmaril@647
   562
	XLinkObj *xlo=new XLinkObj (model->getScene());
insilmaril@576
   563
	if (!a.value( "color").isEmpty() ) 
insilmaril@576
   564
	{
insilmaril@576
   565
		col.setNamedColor(a.value("color"));
insilmaril@576
   566
		xlo->setColor (col);
insilmaril@576
   567
	}
insilmaril@576
   568
insilmaril@576
   569
	if (!a.value( "width").isEmpty() ) 
insilmaril@576
   570
	{
insilmaril@576
   571
		xlo->setWidth(a.value ("width").toInt (&okx, 10));
insilmaril@576
   572
	}
insilmaril@576
   573
insilmaril@576
   574
	// Connecting by select string for compatibility with version < 1.8.76
insilmaril@576
   575
	if (!a.value( "beginBranch").isEmpty() ) 
insilmaril@576
   576
	{ 
insilmaril@576
   577
		if (!a.value( "endBranch").isEmpty() ) 
insilmaril@576
   578
		{
insilmaril@754
   579
			TreeItem *ti=model->findBySelectString (a.value( "beginBranch"));
insilmaril@754
   580
			if (ti && ti->isBranchLikeType())
insilmaril@576
   581
			{
insilmaril@754
   582
			/* FIXME-2 xLinks
insilmaril@576
   583
				xlo->setBegin ((BranchObj*)lmo);
insilmaril@754
   584
				lmo=model->findBySelectString (a.value( "endBranch"));
insilmaril@773
   585
				if (lmo && typid (*lmo)==typid (BranchObj))
insilmaril@576
   586
				{
insilmaril@576
   587
					xlo->setEnd ((BranchObj*)(lmo));
insilmaril@576
   588
					xlo->activate();
insilmaril@596
   589
					success=true;
insilmaril@576
   590
				}
insilmaril@754
   591
			*/
insilmaril@576
   592
			}
insilmaril@576
   593
		}           
insilmaril@576
   594
	}	
insilmaril@576
   595
insilmaril@576
   596
	// object ID is used starting in version 1.8.76
insilmaril@754
   597
	/* FIXME-2 xLinks
insilmaril@576
   598
	if (!a.value( "beginID").isEmpty() ) 
insilmaril@576
   599
	{ 
insilmaril@576
   600
		if (!a.value( "endID").isEmpty() ) 
insilmaril@576
   601
		{
insilmaril@647
   602
			LinkableMapObj *lmo=model->findID (a.value( "beginID"));
insilmaril@773
   603
			if (lmo && typid (*lmo)==typid (BranchObj))
insilmaril@576
   604
			{
insilmaril@576
   605
				xlo->setBegin ((BranchObj*)lmo);
insilmaril@647
   606
				lmo=model->findID (a.value( "endID"));
insilmaril@773
   607
				if (lmo && typid (*lmo)==typid (BranchObj))
insilmaril@576
   608
				{
insilmaril@576
   609
					xlo->setEnd ((BranchObj*)(lmo));
insilmaril@576
   610
					xlo->activate();
insilmaril@596
   611
					success=true;
insilmaril@576
   612
				}
insilmaril@576
   613
			}
insilmaril@576
   614
		}           
insilmaril@576
   615
	}	
insilmaril@754
   616
	*/
insilmaril@576
   617
	if (!success) delete (xlo);
insilmaril@596
   618
	return true;	// xLinks can only be established at the "end branch", return true
insilmaril@576
   619
}
insilmaril@576
   620
insilmaril@576
   621
bool parseVYMHandler::readHtmlAttr (const QXmlAttributes& a)
insilmaril@576
   622
{
insilmaril@576
   623
	for (int i=1; i<=a.count(); i++)
insilmaril@576
   624
		htmldata+=" "+a.localName(i-1)+"=\""+a.value(i-1)+"\"";
insilmaril@576
   625
	return true;
insilmaril@576
   626
}
insilmaril@576
   627
insilmaril@576
   628
bool parseVYMHandler::readSettingAttr (const QXmlAttributes& a)
insilmaril@576
   629
{
insilmaril@576
   630
	if (!a.value( "key").isEmpty() ) 
insilmaril@576
   631
	{
insilmaril@576
   632
		if (!a.value( "value").isEmpty() ) 
insilmaril@721
   633
			settings.setLocalEntry (model->getDestPath(), a.value ("key"), a.value ("value"));
insilmaril@576
   634
		else
insilmaril@576
   635
			return false;
insilmaril@576
   636
		
insilmaril@576
   637
	} else
insilmaril@576
   638
		return false;
insilmaril@576
   639
	
insilmaril@576
   640
	return true;
insilmaril@576
   641
}