1 #include "xml-freemind.h"
6 #include "branchitem.h"
10 extern Settings settings;
11 extern QString vymVersion;
13 bool parseFreemindHandler::startDocument() //FIXME-3 import not complete yet
18 stateStack.append(StateInit);
24 QString parseFreemindHandler::parseHREF(QString href)
26 QString type=href.section(":",0,0);
27 QString path=href.section(":",1,1);
28 if (!tmpDir.endsWith("/"))
29 return tmpDir + "/" + path;
34 bool parseFreemindHandler::startElement ( const QString&, const QString&,
35 const QString& eName, const QXmlAttributes& atts )
39 qDebug() << "startElement <"<< qPrintable(eName)
41 <<" stateLast="<<stateStack.last()
42 <<" loadMode="<<loadMode
43 // <<" line="<<qPrintable (QXmlDefaultHandler::lineNumber())
46 stateStack.append (state);
47 if ( state == StateInit && (eName == "map") )
50 if (!atts.value( "version").isEmpty() )
53 if (! versionLowerOrEqual( atts.value("version"),v ) )
54 QMessageBox::warning( 0, "Warning: Version Problem" ,
55 "<h3>Freemind map is newer than version " +v +" </h3>"
56 "<p>The map you are just trying to load was "
57 "saved using freemind " +atts.value("version")+". "
58 "Your version of vym can parse freemind " + v +".");
62 mapCenter=model->createMapCenter();
65 // Create two hidden branches, because Freemind has no relative
66 // positioning for mainbranches
67 mainBranchLeft = model->createBranch (lastBranch);
68 mainBranchRight = model->createBranch (lastBranch);
70 mainBranchLeft->setRelPos ( QPointF(-200,0));
71 mainBranchLeft->setHeadingPlainText (" ");
72 mainBranchRight->setRelPos ( QPointF(200,0));
73 mainBranchRight->setHeadingPlainText (" ");
74 } else if ( eName == "attribute_registry" && state == StateMap )
76 state = StateAttributeRegistry;
77 } else if ( eName == "attribute_name" && state == StateAttributeRegistry)
79 state = StateAttributeName;
80 } else if ( eName == "attribute_value" && state == StateAttributeName)
82 state = StateAttributeValue;
83 } else if ( eName == "node" && state == StateMap )
87 } else if ( eName == "node" && state == StateNode )
89 lastBranch=model->createBranch(lastBranch);
92 } else if ( eName == "properties" )
94 } else if ( eName == "map_styles" )
96 } else if ( eName == "font" && state == StateNode) //FIXME-3 not implemented
99 } else if ( eName == "edge" && state == StateNode) //FIXME-3 xlink not implemented
102 } else if ( eName == "hook" && state == StateNode)
105 } else if ( eName == "icon" && state == StateNode)
108 if (!atts.value("BUILTIN").isEmpty() )
110 QString f=atts.value("BUILTIN");
114 else if (f=="messagebox_warning")
115 v="freemind-warning";
118 else if (f=="button_ok")
120 else if (f=="button_cancel")
122 else if (f.contains("full-"))
123 v=f.replace("full-","freemind-priority-");
126 else if (f=="forward")
127 v="freemind-forward";
128 else if (f=="attach")
130 else if (f=="ksmiletris")
132 else if (f=="clanbomber")
133 v="freemind-clanbomber";
134 else if (f=="desktop_new")
135 v="freemind-desktopnew";
138 else if (f=="gohome")
140 else if (f=="kaddressbook")
141 v="freemind-kaddressbook";
142 else if (f=="knotify")
143 v="freemind-knotify";
148 else if (f=="password")
149 v="freemind-password";
150 else if (f=="pencil")
154 else if (f=="wizard")
160 else if (f=="bookmark")
161 v="freemind-bookmark";
162 else if (f=="penguin")
163 v="freemind-penguin";
167 qWarning()<<"parseFreemindHandler: Unknown icon found: "<<f;
169 lastBranch->activateStandardFlag (v);
171 } else if ( eName == "arrowlink" && state == StateNode)
173 state=StateArrowLink;
174 } else if ( eName == "cloud" && state == StateNode)
177 } else if ( eName == "richcontent" && state == StateNode)
179 state=StateRichContent;
180 return readRichContentAttr (atts);
181 } else if ( eName == "html" && state == StateRichContent)
187 } else if ( eName == "text" && state == StateHook)
190 } else if ( state == StateHtml )
192 // accept all while in html mode,
198 // Usually we would return an error here
199 // In order to not break with every new element in FreeMind or FreePlane,
200 // better ignore the new element for now
202 qWarning()<<"parseFreemindHandler: Unknown element found and ignoring:: "<<eName;
207 bool parseFreemindHandler::endElement ( const QString &, const QString&, const QString &eName)
210 qDebug() << "endElement </" <<qPrintable(eName)
212 <<" stateStack="<<stateStack.last()
218 // Freemind does not have the two "extra" mainbranches used here,
219 // so we have to update mapcenter
220 model->emitDataChanged (mapCenter);
222 // Remove helper branches, if not needed
223 if (mainBranchLeft->childCount()==0) model->deleteItem (mainBranchLeft);
224 if (mainBranchRight->childCount()==0) model->deleteItem (mainBranchRight);
227 model->emitDataChanged (lastBranch);
228 lastBranch=(BranchItem*)lastBranch->parent();
229 lastBranch->setLastSelectedBranch (0);
231 case StateRichContent:
232 if (!htmldata.isEmpty())
234 if (htmlPurpose==Node)
235 lastBranch->setHeadingPlainText (htmldata); // FIXME-3 probably wrong for RT heading
236 else if (htmlPurpose==Note)
237 lastBranch->setNote (htmldata);
241 htmldata+="</"+eName+">";
244 //state=StateHtmlNote;
245 htmldata.replace ("<br></br>","<br />");
251 state=stateStack.takeLast();
255 bool parseFreemindHandler::characters ( const QString& ch)
257 //qDebug() << "characters \""<<qPrintable(ch)<<"\" state="<<state;
259 QString ch_org=quotemeta (ch);
260 QString ch_simplified=ch.simplified();
261 if ( ch_simplified.isEmpty() ) return true;
265 case StateInit: break;
266 case StateMap: break;
267 case StateNode: break;
268 case StateCloud: break;
269 case StateEdge: break;
270 case StateIcon: break;
271 case StateArrowLink: break;
272 case StateFont: break;
273 case StateHook: break;
275 lastBranch->setNote (ch_simplified);
286 QString parseFreemindHandler::errorString()
288 return "the document is not in the Freemind file format";
291 bool parseFreemindHandler::readNodeAttr (const QXmlAttributes& a)
293 // Freemind has a different concept for mainbranches
294 if (!a.value( "POSITION").isEmpty() )
296 if (a.value ("POSITION")=="left")
297 model->relinkBranch (lastBranch, mainBranchLeft);
298 else if (a.value ("POSITION")=="right")
299 model->relinkBranch (lastBranch, mainBranchRight);
302 if (a.value( "FOLDED")=="true" )
303 lastBranch->toggleScroll();
305 if (!a.value( "TEXT").isEmpty() )
307 lastBranch->setHeadingPlainText (a.value ("TEXT")); // FIXME-3 what about RT?
308 //model->setHeading (a.value ("TEXT"), lastBranch);
311 if (!a.value( "COLOR").isEmpty() )
312 lastBranch->setHeadingColor (QColor (a.value ("COLOR")));
314 if (!a.value( "LINK").isEmpty() )
315 lastBranch->setURL (a.value ("LINK"));
320 bool parseFreemindHandler::readRichContentAttr (const QXmlAttributes& a)
322 if (a.value ("TYPE")=="NODE" )
324 else if (a.value ("TYPE")=="NOTE" )
329 qWarning()<<"parseFreemindHandler: Unknown purpose of richContent found: "<<a.value("TYPE");;
330 // FIXME-3 Usually we would stop here, ignore for now