insilmaril@566
|
1 |
#include "xml-freemind.h"
|
insilmaril@566
|
2 |
|
insilmaril@566
|
3 |
#include <QMessageBox>
|
insilmaril@566
|
4 |
#include <QColor>
|
insilmaril@566
|
5 |
#include <QTextStream>
|
insilmaril@566
|
6 |
#include <iostream>
|
insilmaril@566
|
7 |
|
insilmaril@566
|
8 |
#include "misc.h"
|
insilmaril@566
|
9 |
#include "settings.h"
|
insilmaril@566
|
10 |
#include "linkablemapobj.h"
|
insilmaril@566
|
11 |
#include "version.h"
|
insilmaril@566
|
12 |
|
insilmaril@566
|
13 |
static BranchObj *lastBranch;
|
insilmaril@566
|
14 |
static FloatObj *lastFloat;
|
insilmaril@566
|
15 |
static OrnamentedObj *lastOO;
|
insilmaril@566
|
16 |
|
insilmaril@566
|
17 |
extern Settings settings;
|
insilmaril@566
|
18 |
extern QString vymVersion;
|
insilmaril@566
|
19 |
|
insilmaril@566
|
20 |
extern QString flagsPath;
|
insilmaril@566
|
21 |
|
insilmaril@574
|
22 |
bool parseFreemindHandler::startDocument()
|
insilmaril@566
|
23 |
{
|
insilmaril@566
|
24 |
errorProt = "";
|
insilmaril@566
|
25 |
state = StateInit;
|
insilmaril@566
|
26 |
laststate = StateInit;
|
insilmaril@566
|
27 |
stateStack.clear();
|
insilmaril@566
|
28 |
stateStack.append(StateInit);
|
insilmaril@566
|
29 |
isVymPart=false;
|
insilmaril@566
|
30 |
return true;
|
insilmaril@566
|
31 |
}
|
insilmaril@566
|
32 |
|
insilmaril@566
|
33 |
|
insilmaril@574
|
34 |
QString parseFreemindHandler::parseHREF(QString href)
|
insilmaril@566
|
35 |
{
|
insilmaril@566
|
36 |
QString type=href.section(":",0,0);
|
insilmaril@566
|
37 |
QString path=href.section(":",1,1);
|
insilmaril@566
|
38 |
if (!tmpDir.endsWith("/"))
|
insilmaril@566
|
39 |
return tmpDir + "/" + path;
|
insilmaril@566
|
40 |
else
|
insilmaril@566
|
41 |
return tmpDir + path;
|
insilmaril@566
|
42 |
}
|
insilmaril@566
|
43 |
|
insilmaril@574
|
44 |
bool parseFreemindHandler::startElement ( const QString&, const QString&,
|
insilmaril@566
|
45 |
const QString& eName, const QXmlAttributes& atts )
|
insilmaril@566
|
46 |
{
|
insilmaril@566
|
47 |
QColor col;
|
insilmaril@566
|
48 |
/* Testing
|
insilmaril@660
|
49 |
cout << "startElement <"<< qPrintable(eName)
|
insilmaril@566
|
50 |
<<"> state="<<state
|
insilmaril@566
|
51 |
<<" laststate="<<stateStack.last()
|
insilmaril@566
|
52 |
<<" loadMode="<<loadMode
|
insilmaril@660
|
53 |
// <<" line="<<qPrintable (QXmlDefaultHandler::lineNumber())
|
insilmaril@566
|
54 |
<<endl;
|
insilmaril@566
|
55 |
*/
|
insilmaril@566
|
56 |
stateStack.append (state);
|
insilmaril@566
|
57 |
if ( state == StateInit && (eName == "map") )
|
insilmaril@566
|
58 |
{
|
insilmaril@566
|
59 |
state = StateMap;
|
insilmaril@566
|
60 |
if (!atts.value( "version").isEmpty() )
|
insilmaril@566
|
61 |
{
|
insilmaril@566
|
62 |
QString v="0.8.0";
|
insilmaril@566
|
63 |
if (!checkVersion(atts.value("version"),v))
|
insilmaril@566
|
64 |
QMessageBox::warning( 0, "Warning: Version Problem" ,
|
insilmaril@566
|
65 |
"<h3>Freemind map is newer than version " +v +" </h3>"
|
insilmaril@566
|
66 |
"<p>The map you are just trying to load was "
|
insilmaril@566
|
67 |
"saved using freemind " +atts.value("version")+". "
|
insilmaril@566
|
68 |
"The version of this vym can parse freemind " + v +".");
|
insilmaril@566
|
69 |
}
|
insilmaril@647
|
70 |
model->first()->addBranch();
|
insilmaril@647
|
71 |
lastBranch=model->first()->getLastBranch();
|
insilmaril@566
|
72 |
lastBranch->move2RelPos (200,0);
|
insilmaril@566
|
73 |
lastBranch->setHeading (" ");
|
insilmaril@647
|
74 |
model->first()->addBranch();
|
insilmaril@647
|
75 |
lastBranch=model->first()->getLastBranch();
|
insilmaril@566
|
76 |
lastBranch->move2RelPos (-200,0);
|
insilmaril@566
|
77 |
lastBranch->setHeading (" ");
|
insilmaril@647
|
78 |
lastBranch=model->first();
|
insilmaril@566
|
79 |
|
insilmaril@566
|
80 |
} else if ( eName == "node" && (state == StateMap || state == StateNode ))
|
insilmaril@566
|
81 |
{
|
insilmaril@566
|
82 |
if (!atts.value( "POSITION").isEmpty() )
|
insilmaril@566
|
83 |
{
|
insilmaril@566
|
84 |
if (atts.value ("POSITION")=="left")
|
insilmaril@566
|
85 |
{
|
insilmaril@647
|
86 |
model->select ("bo:1");
|
insilmaril@647
|
87 |
lastBranch=model->getSelectedBranch();
|
insilmaril@566
|
88 |
if (lastBranch)
|
insilmaril@566
|
89 |
{
|
insilmaril@566
|
90 |
lastBranch->addBranch();
|
insilmaril@566
|
91 |
lastBranch=lastBranch->getLastBranch();
|
insilmaril@566
|
92 |
readNodeAttr (atts);
|
insilmaril@566
|
93 |
}
|
insilmaril@566
|
94 |
} else if (atts.value ("POSITION")=="right")
|
insilmaril@566
|
95 |
{
|
insilmaril@647
|
96 |
model->select ("bo:0");
|
insilmaril@647
|
97 |
lastBranch=model->getSelectedBranch();
|
insilmaril@566
|
98 |
if (lastBranch)
|
insilmaril@566
|
99 |
{
|
insilmaril@566
|
100 |
lastBranch->addBranch();
|
insilmaril@566
|
101 |
lastBranch=lastBranch->getLastBranch();
|
insilmaril@566
|
102 |
readNodeAttr (atts);
|
insilmaril@566
|
103 |
}
|
insilmaril@566
|
104 |
}
|
insilmaril@566
|
105 |
} else
|
insilmaril@566
|
106 |
{
|
insilmaril@566
|
107 |
if (state!=StateMap)
|
insilmaril@566
|
108 |
{
|
insilmaril@566
|
109 |
lastBranch->addBranch();
|
insilmaril@566
|
110 |
lastBranch=lastBranch->getLastBranch();
|
insilmaril@566
|
111 |
}
|
insilmaril@566
|
112 |
readNodeAttr (atts);
|
insilmaril@566
|
113 |
}
|
insilmaril@566
|
114 |
state=StateNode;
|
insilmaril@566
|
115 |
} else if ( eName == "font" && state == StateNode)
|
insilmaril@566
|
116 |
{
|
insilmaril@566
|
117 |
state=StateFont;
|
insilmaril@566
|
118 |
} else if ( eName == "edge" && state == StateNode)
|
insilmaril@566
|
119 |
{
|
insilmaril@566
|
120 |
state=StateEdge;
|
insilmaril@566
|
121 |
} else if ( eName == "hook" && state == StateNode)
|
insilmaril@566
|
122 |
{
|
insilmaril@566
|
123 |
state=StateHook;
|
insilmaril@566
|
124 |
} else if ( eName == "icon" && state == StateNode)
|
insilmaril@566
|
125 |
{
|
insilmaril@566
|
126 |
state=StateIcon;
|
insilmaril@566
|
127 |
if (!atts.value("BUILTIN").isEmpty() )
|
insilmaril@566
|
128 |
{
|
insilmaril@566
|
129 |
QString f=atts.value("BUILTIN");
|
insilmaril@566
|
130 |
QString v;
|
insilmaril@566
|
131 |
if (f=="help")
|
insilmaril@566
|
132 |
v="questionmark";
|
insilmaril@566
|
133 |
else if (f=="messagebox_warning")
|
insilmaril@566
|
134 |
v="freemind-warning";
|
insilmaril@566
|
135 |
else if (f=="idea")
|
insilmaril@566
|
136 |
v="lamp";
|
insilmaril@566
|
137 |
else if (f=="button_ok")
|
insilmaril@566
|
138 |
v="hook-green";
|
insilmaril@566
|
139 |
else if (f=="button_cancel")
|
insilmaril@566
|
140 |
v="cross-red";
|
insilmaril@566
|
141 |
else if (f.contains("full-"))
|
insilmaril@574
|
142 |
v=f.replace("full-","freemind-priority-");
|
insilmaril@566
|
143 |
else if (f=="back")
|
insilmaril@566
|
144 |
v="freemind-back";
|
insilmaril@566
|
145 |
else if (f=="forward")
|
insilmaril@566
|
146 |
v="freemind-forward";
|
insilmaril@566
|
147 |
else if (f=="attach")
|
insilmaril@566
|
148 |
v="freemind-attach";
|
insilmaril@566
|
149 |
else if (f=="ksmiletris")
|
insilmaril@566
|
150 |
v="smiley-good"; //
|
insilmaril@566
|
151 |
else if (f=="clanbomber")
|
insilmaril@566
|
152 |
v="freemind-clanbomber";
|
insilmaril@566
|
153 |
else if (f=="desktop_new")
|
insilmaril@566
|
154 |
v="freemind-desktopnew";
|
insilmaril@566
|
155 |
else if (f=="flag")
|
insilmaril@566
|
156 |
v="freemind-flag";
|
insilmaril@566
|
157 |
else if (f=="gohome")
|
insilmaril@566
|
158 |
v="freemind-gohome";
|
insilmaril@566
|
159 |
else if (f=="kaddressbook")
|
insilmaril@566
|
160 |
v="freemind-kaddressbook";
|
insilmaril@566
|
161 |
else if (f=="knotify")
|
insilmaril@566
|
162 |
v="freemind-knotify";
|
insilmaril@566
|
163 |
else if (f=="korn")
|
insilmaril@566
|
164 |
v="freemind-korn";
|
insilmaril@566
|
165 |
else if (f=="Mail")
|
insilmaril@566
|
166 |
v="freemind-mail";
|
insilmaril@566
|
167 |
else if (f=="password")
|
insilmaril@566
|
168 |
v="freemind-password";
|
insilmaril@566
|
169 |
else if (f=="pencil")
|
insilmaril@566
|
170 |
v="freemind-pencil";
|
insilmaril@566
|
171 |
else if (f=="stop")
|
insilmaril@566
|
172 |
v="freemind-stop";
|
insilmaril@566
|
173 |
else if (f=="wizard")
|
insilmaril@566
|
174 |
v="freemind-wizard";
|
insilmaril@566
|
175 |
else if (f=="xmag")
|
insilmaril@566
|
176 |
v="freemind-xmag";
|
insilmaril@566
|
177 |
else if (f=="bell")
|
insilmaril@566
|
178 |
v="freemind-bell";
|
insilmaril@566
|
179 |
else if (f=="bookmark")
|
insilmaril@566
|
180 |
v="freemind-bookmark";
|
insilmaril@566
|
181 |
else if (f=="penguin")
|
insilmaril@566
|
182 |
v="freemind-penguin";
|
insilmaril@566
|
183 |
else if (f=="licq")
|
insilmaril@566
|
184 |
v="freemind-licq";
|
insilmaril@566
|
185 |
|
insilmaril@566
|
186 |
lastBranch->activateStandardFlag( v);
|
insilmaril@566
|
187 |
}
|
insilmaril@566
|
188 |
} else if ( eName == "arrowlink" && state == StateNode)
|
insilmaril@566
|
189 |
{
|
insilmaril@566
|
190 |
state=StateArrowLink;
|
insilmaril@566
|
191 |
} else if ( eName == "cloud" && state == StateNode)
|
insilmaril@566
|
192 |
{
|
insilmaril@566
|
193 |
state=StateCloud;
|
insilmaril@566
|
194 |
} else if ( eName == "text" && state == StateHook)
|
insilmaril@566
|
195 |
{
|
insilmaril@566
|
196 |
state=StateText;
|
insilmaril@566
|
197 |
} else
|
insilmaril@566
|
198 |
return false; // Error
|
insilmaril@566
|
199 |
return true;
|
insilmaril@566
|
200 |
}
|
insilmaril@566
|
201 |
|
insilmaril@574
|
202 |
bool parseFreemindHandler::endElement ( const QString&, const QString&, const QString &eName)
|
insilmaril@566
|
203 |
{
|
insilmaril@566
|
204 |
/* Testing
|
insilmaril@660
|
205 |
cout << "endElement </" <<qPrintable(eName)
|
insilmaril@566
|
206 |
<<"> state=" <<state
|
insilmaril@566
|
207 |
<<" laststate=" <<laststate
|
insilmaril@566
|
208 |
<<" stateStack="<<stateStack.last()
|
insilmaril@566
|
209 |
<<endl;
|
insilmaril@566
|
210 |
*/
|
insilmaril@566
|
211 |
switch ( state )
|
insilmaril@566
|
212 |
{
|
insilmaril@566
|
213 |
case StateNode:
|
insilmaril@566
|
214 |
lastBranch=(BranchObj*)(lastBranch->getParObj());
|
insilmaril@566
|
215 |
break;
|
insilmaril@566
|
216 |
default:
|
insilmaril@566
|
217 |
break;
|
insilmaril@566
|
218 |
}
|
insilmaril@566
|
219 |
state=stateStack.takeLast();
|
insilmaril@566
|
220 |
return true;
|
insilmaril@566
|
221 |
}
|
insilmaril@566
|
222 |
|
insilmaril@574
|
223 |
bool parseFreemindHandler::characters ( const QString& ch)
|
insilmaril@566
|
224 |
{
|
insilmaril@660
|
225 |
//cout << "characters \""<<qPrintable(ch)<<"\" state="<<state <<" laststate="<<laststate<<endl;
|
insilmaril@566
|
226 |
|
insilmaril@566
|
227 |
QString ch_org=quotemeta (ch);
|
insilmaril@566
|
228 |
QString ch_simplified=ch.simplifyWhiteSpace();
|
insilmaril@566
|
229 |
if ( ch_simplified.isEmpty() ) return true;
|
insilmaril@566
|
230 |
|
insilmaril@566
|
231 |
switch ( state )
|
insilmaril@566
|
232 |
{
|
insilmaril@566
|
233 |
case StateInit: break;
|
insilmaril@566
|
234 |
case StateMap: break;
|
insilmaril@566
|
235 |
case StateNode: break;
|
insilmaril@566
|
236 |
case StateCloud: break;
|
insilmaril@566
|
237 |
case StateEdge: break;
|
insilmaril@566
|
238 |
case StateIcon: break;
|
insilmaril@566
|
239 |
case StateArrowLink: break;
|
insilmaril@566
|
240 |
case StateFont: break;
|
insilmaril@566
|
241 |
case StateHook: break;
|
insilmaril@566
|
242 |
case StateText:
|
insilmaril@566
|
243 |
lastBranch->setNote (ch_simplified);
|
insilmaril@566
|
244 |
break;
|
insilmaril@566
|
245 |
default:
|
insilmaril@566
|
246 |
return false;
|
insilmaril@566
|
247 |
}
|
insilmaril@566
|
248 |
return true;
|
insilmaril@566
|
249 |
}
|
insilmaril@566
|
250 |
|
insilmaril@574
|
251 |
QString parseFreemindHandler::errorString()
|
insilmaril@566
|
252 |
{
|
insilmaril@574
|
253 |
return "the document is not in the Freemind file format";
|
insilmaril@566
|
254 |
}
|
insilmaril@566
|
255 |
|
insilmaril@574
|
256 |
bool parseFreemindHandler::readNodeAttr (const QXmlAttributes& a)
|
insilmaril@566
|
257 |
{
|
insilmaril@566
|
258 |
lastOO=lastBranch;
|
insilmaril@566
|
259 |
|
insilmaril@566
|
260 |
if (a.value( "FOLDED")=="true" )
|
insilmaril@566
|
261 |
lastBranch->toggleScroll();
|
insilmaril@566
|
262 |
if (!a.value( "TEXT").isEmpty() )
|
insilmaril@566
|
263 |
lastBranch->setHeading (a.value ("TEXT"));
|
insilmaril@566
|
264 |
|
insilmaril@566
|
265 |
if (!a.value( "COLOR").isEmpty() )
|
insilmaril@566
|
266 |
lastBranch->setColor (QColor (a.value ("COLOR")));
|
insilmaril@566
|
267 |
|
insilmaril@566
|
268 |
if (!a.value( "LINK").isEmpty() )
|
insilmaril@566
|
269 |
lastBranch->setURL (a.value ("LINK"));
|
insilmaril@566
|
270 |
|
insilmaril@566
|
271 |
return true;
|
insilmaril@566
|
272 |
}
|
insilmaril@566
|
273 |
|
insilmaril@566
|
274 |
|