initial import
[vym] / xml-freemind.cpp
diff --git a/xml-freemind.cpp b/xml-freemind.cpp
new file mode 100644 (file)
index 0000000..6f0271f
--- /dev/null
@@ -0,0 +1,275 @@
+#include "xml-freemind.h"
+
+#include <QMessageBox>
+#include <QColor>
+#include <QTextStream>
+#include <iostream>
+
+#include "misc.h"
+#include "settings.h"
+#include "linkablemapobj.h"
+#include "version.h"
+
+static BranchObj *lastBranch;
+//static FloatObj *lastFloat;
+static OrnamentedObj *lastOO;
+
+extern Settings settings;
+extern QString vymVersion;
+
+extern QString flagsPath;
+
+bool parseFreemindHandler::startDocument()
+{
+    errorProt = "";
+    state = StateInit;
+    laststate = StateInit;
+       stateStack.clear();
+       stateStack.append(StateInit);
+       isVymPart=false;
+    return true;
+}
+
+
+QString parseFreemindHandler::parseHREF(QString href)
+{
+       QString type=href.section(":",0,0);
+       QString path=href.section(":",1,1);
+       if (!tmpDir.endsWith("/"))
+               return tmpDir + "/" + path;
+       else    
+               return tmpDir + path;
+}
+
+bool parseFreemindHandler::startElement  ( const QString&, const QString&,
+                    const QString& eName, const QXmlAttributes& atts ) 
+{
+    QColor col;
+       /* Testing
+       cout << "startElement <"<< qPrintable(eName)
+               <<">  state="<<state 
+               <<"  laststate="<<stateStack.last()
+               <<"   loadMode="<<loadMode
+       //      <<"       line="<<qPrintable (QXmlDefaultHandler::lineNumber())
+               <<endl;
+       */      
+       stateStack.append (state);      
+    if ( state == StateInit && (eName == "map")  ) 
+       {
+        state = StateMap;
+               if (!atts.value( "version").isEmpty() ) 
+               {
+                       QString v="0.8.0";
+                       if (!checkVersion(atts.value("version"),v))
+                               QMessageBox::warning( 0, "Warning: Version Problem" ,
+                                  "<h3>Freemind map is newer than version " +v +" </h3>"
+                                  "<p>The map you are just trying to load was "
+                                  "saved using freemind " +atts.value("version")+". "
+                                  "The version of this vym can parse freemind " + v +"."); 
+               }
+               cout <<"model="<<model<<"   first="<<model->first()<<endl;
+               model->first()->addBranch();
+               lastBranch=model->first()->getLastBranch();
+               lastBranch->move2RelPos (200,0);
+               lastBranch->setHeading ("  ");
+               model->first()->addBranch();
+               lastBranch=model->first()->getLastBranch();
+               lastBranch->move2RelPos (-200,0);
+               lastBranch->setHeading ("  ");
+               lastBranch=model->first();
+
+       } else if ( eName == "node" &&  (state == StateMap || state == StateNode )) 
+       {
+               if (!atts.value( "POSITION").isEmpty() )
+               {
+                       if (atts.value ("POSITION")=="left")
+                       {
+                               model->select ("bo:1");
+                               lastBranch=model->getSelectedBranch();
+                               if (lastBranch)
+                               {
+                                       lastBranch->addBranch();
+                                       lastBranch=lastBranch->getLastBranch();
+                                       readNodeAttr (atts);
+                               }       
+                       } else if (atts.value ("POSITION")=="right")
+                       {
+                               model->select ("bo:0");
+                               lastBranch=model->getSelectedBranch();
+                               if (lastBranch)
+                               {
+                                       lastBranch->addBranch();
+                                       lastBranch=lastBranch->getLastBranch();
+                                       readNodeAttr (atts);
+                               }       
+                       }
+               } else
+               {
+                       if (state!=StateMap)
+                       {
+                               lastBranch->addBranch();
+                               lastBranch=lastBranch->getLastBranch();
+                       }
+                       readNodeAttr (atts);
+               }
+               state=StateNode;
+       } else if ( eName == "font" && state == StateNode) 
+       {
+               state=StateFont;
+       } else if ( eName == "edge" && state == StateNode) 
+       {
+               state=StateEdge;
+       } else if ( eName == "hook" && state == StateNode) 
+       {
+               state=StateHook;
+       } else if ( eName == "icon" && state == StateNode) 
+       {
+               state=StateIcon;
+               if (!atts.value("BUILTIN").isEmpty() )
+               {
+                       QString f=atts.value("BUILTIN");
+                       QString v;
+                       if (f=="help")
+                               v="questionmark";
+                       else if (f=="messagebox_warning")
+                               v="freemind-warning"; 
+                       else if (f=="idea")
+                               v="lamp"; 
+                       else if (f=="button_ok")
+                               v="hook-green"; 
+                       else if (f=="button_cancel")
+                               v="cross-red"; 
+                       else if (f.contains("full-"))
+                               v=f.replace("full-","freemind-priority-"); 
+                       else if (f=="back")
+                               v="freemind-back"; 
+                       else if (f=="forward")
+                               v="freemind-forward"; 
+                       else if (f=="attach")
+                               v="freemind-attach"; 
+                       else if (f=="ksmiletris")
+                               v="smiley-good"; // 
+                       else if (f=="clanbomber")
+                               v="freemind-clanbomber"; 
+                       else if (f=="desktop_new")
+                               v="freemind-desktopnew"; 
+                       else if (f=="flag")
+                               v="freemind-flag"; 
+                       else if (f=="gohome")
+                               v="freemind-gohome"; 
+                       else if (f=="kaddressbook")
+                               v="freemind-kaddressbook"; 
+                       else if (f=="knotify")
+                               v="freemind-knotify"; 
+                       else if (f=="korn")
+                               v="freemind-korn";
+                       else if (f=="Mail")
+                               v="freemind-mail"; 
+                       else if (f=="password")
+                               v="freemind-password"; 
+                       else if (f=="pencil")
+                               v="freemind-pencil";
+                       else if (f=="stop")
+                               v="freemind-stop"; 
+                       else if (f=="wizard")
+                               v="freemind-wizard";
+                       else if (f=="xmag")
+                               v="freemind-xmag";
+                       else if (f=="bell")
+                               v="freemind-bell";
+                       else if (f=="bookmark")
+                               v="freemind-bookmark"; 
+                       else if (f=="penguin")
+                               v="freemind-penguin"; 
+                       else if (f=="licq")
+                               v="freemind-licq"; 
+
+                       lastBranch->activateStandardFlag( v);
+               }
+       } else if ( eName == "arrowlink" && state == StateNode) 
+       {
+               state=StateArrowLink;
+       } else if ( eName == "cloud" && state == StateNode) 
+       {
+               state=StateCloud;
+       } else if ( eName == "text" && state == StateHook) 
+       {
+               state=StateText;
+       } else 
+        return false;   // Error
+    return true;
+}
+
+bool parseFreemindHandler::endElement  ( const QString&, const QString&, const QString&)
+{
+       /* Testing
+       cout << "endElement </" <<qPrintable(eName)
+               <<">  state=" <<state 
+               <<"  laststate=" <<laststate
+               <<"  stateStack="<<stateStack.last() 
+               <<endl;
+       */
+    switch ( state ) 
+       {
+        case StateNode: 
+                       lastBranch=(BranchObj*)(lastBranch->getParObj());
+            break;
+               default: 
+                       break;
+    }  
+       state=stateStack.takeLast();    
+       return true;
+}
+
+bool parseFreemindHandler::characters   ( const QString& ch)
+{
+       //cout << "characters \""<<qPrintable(ch)<<"\"  state="<<state <<"  laststate="<<laststate<<endl;
+
+       QString ch_org=quotemeta (ch);
+    QString ch_simplified=ch.simplifyWhiteSpace();
+    if ( ch_simplified.isEmpty() ) return true;
+
+    switch ( state ) 
+    {
+        case StateInit: break;
+        case StateMap: break; 
+        case StateNode: break; 
+        case StateCloud: break; 
+        case StateEdge: break; 
+        case StateIcon: break; 
+        case StateArrowLink: break; 
+        case StateFont: break; 
+        case StateHook: break; 
+        case StateText: 
+                       lastBranch->setNote (ch_simplified);
+                       break; 
+        default: 
+                       return false;
+    }
+    return true;
+}
+
+QString parseFreemindHandler::errorString() 
+{
+    return "the document is not in the Freemind file format";
+}
+
+bool parseFreemindHandler::readNodeAttr (const QXmlAttributes& a)
+{
+       lastOO=lastBranch;
+
+       if (a.value( "FOLDED")=="true" )
+               lastBranch->toggleScroll();
+       if (!a.value( "TEXT").isEmpty() )
+               lastBranch->setHeading (a.value ("TEXT"));
+
+       if (!a.value( "COLOR").isEmpty() )
+               lastBranch->setColor (QColor (a.value ("COLOR")));
+
+       if (!a.value( "LINK").isEmpty() )
+               lastBranch->setURL (a.value ("LINK"));
+
+       return true;    
+}
+
+