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