# HG changeset patch
# User insilmaril
# Date 1185194522 0
# Node ID ebebedffba5089a192679ec905eb16159394430b
# Parent  e7f6bcdf5f6c46cbcef626e00f8c48c2e97e47bf
Added import filter for Freemind

diff -r e7f6bcdf5f6c -r ebebedffba50 version.h
--- a/version.h	Mon Jul 23 12:42:02 2007 +0000
+++ b/version.h	Mon Jul 23 12:42:02 2007 +0000
@@ -4,12 +4,13 @@
 #include <QString>
 
 #define __VYM_NAME "VYM"
-#define __VYM_VERSION "1.9.2"
+#define __VYM_VERSION "1.9.3"
 //#define __VYM_CODENAME "Codename: 1.10.0-beta-1"
 #define __VYM_CODENAME "Codename: development version"
-#define __VYM_BUILD_DATE "July 16, 2007"
+#define __VYM_BUILD_DATE "July 23, 2007"
 
 
 bool checkVersion(const QString &);
+bool checkVersion(const QString &, const QString &);
 
 #endif
diff -r e7f6bcdf5f6c -r ebebedffba50 vym.pro
--- a/vym.pro	Mon Jul 23 12:42:02 2007 +0000
+++ b/vym.pro	Mon Jul 23 12:42:02 2007 +0000
@@ -48,6 +48,7 @@
 	texteditor.h \
 	version.h \
 	xml.h \
+	xml-freemind.h \
 	xsltproc.h \
 	settings.h \
 	warningdialog.h
@@ -93,6 +94,7 @@
 	texteditor.cpp \
 	version.cpp \
 	xml.cpp \
+	xml-freemind.cpp \
 	xsltproc.cpp \
 	settings.cpp \
 	warningdialog.cpp 
diff -r e7f6bcdf5f6c -r ebebedffba50 xml-freemind.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xml-freemind.cpp	Mon Jul 23 12:42:02 2007 +0000
@@ -0,0 +1,330 @@
+#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;
+
+parseFMHandler::parseFMHandler() {}
+
+parseFMHandler::~parseFMHandler() {}
+
+QString parseFMHandler::errorProtocol() { return errorProt; }
+
+
+bool parseFMHandler::startDocument()
+{
+    errorProt = "";
+    state = StateInit;
+    laststate = StateInit;
+	stateStack.clear();
+	stateStack.append(StateInit);
+    branchDepth=0;
+	htmldata="";
+	isVymPart=false;
+    return true;
+}
+
+
+QString parseFMHandler::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 parseFMHandler::startElement  ( const QString&, const QString&,
+                    const QString& eName, const QXmlAttributes& atts ) 
+{
+    QColor col;
+	/* Testing
+	cout << "startElement <"<< eName.ascii()
+		<<">  state="<<state 
+		<<"  laststate="<<stateStack.last()
+		<<"   loadMode="<<loadMode
+	//	<<"       line="<<QXmlDefaultHandler::lineNumber().ascii()
+		<<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 +"."); 
+		}
+		mc->addBranch();
+		lastBranch=mc->getLastBranch();
+		lastBranch->move2RelPos (200,0);
+		lastBranch->setHeading ("  ");
+		mc->addBranch();
+		lastBranch=mc->getLastBranch();
+		lastBranch->move2RelPos (-200,0);
+		lastBranch->setHeading ("  ");
+		lastBranch=mc;
+
+	} else if ( eName == "node" &&  (state == StateMap || state == StateNode )) 
+	{
+		if (!atts.value( "POSITION").isEmpty() )
+		{
+			if (atts.value ("POSITION")=="left")
+			{
+				me->select ("bo:1");
+				lastBranch=me->getSelectedBranch();
+				if (lastBranch)
+				{
+					lastBranch->addBranch();
+					lastBranch=lastBranch->getLastBranch();
+					readNodeAttr (atts);
+				}	
+			} else if (atts.value ("POSITION")=="right")
+			{
+				me->select ("bo:0");
+				lastBranch=me->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-"); //FIXME
+			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 parseFMHandler::endElement  ( const QString&, const QString&, const QString &eName)
+{
+	/* Testing
+	cout << "endElement </" <<eName.ascii()
+		<<">  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 parseFMHandler::characters   ( const QString& ch)
+{
+	//cout << "characters \""<<ch.ascii()<<"\"  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 parseFMHandler::errorString() 
+{
+    return "the document is not in the VYM file format";
+}
+
+bool parseFMHandler::fatalError( const QXmlParseException& exception ) 
+{
+    errorProt += QString( "Fatal parsing error: %1 in line %2, column %3\n")
+    .arg( exception.message() )
+    .arg( exception.lineNumber() )
+    .arg( exception.columnNumber() );
+	// Try to read the bogus line
+	errorProt+=QString("File is: %1\n").arg(inputFile);
+	QString s;
+	if (loadStringFromDisk (inputFile,s))
+	{
+		QStringList sl=QStringList::split ("\n",s);
+		int i=1;
+		QStringList::Iterator it = sl.begin();
+		while (i<exception.lineNumber())
+		{
+			it++;
+			i++;
+		}
+		s=*it;
+		s.insert (exception.columnNumber()-1,"<ERROR>");
+		errorProt+=s;
+    }
+    return QXmlDefaultHandler::fatalError( exception );
+}
+
+void parseFMHandler::setMapEditor (MapEditor* e)
+{
+    me=e;
+	mc=me->getMapCenter();
+}
+
+void parseFMHandler::setTmpDir (QString tp)
+{
+	tmpDir=tp;
+}
+
+void parseFMHandler::setInputFile (QString f)
+{
+	inputFile=f;
+}
+
+void parseFMHandler::setLoadMode (const LoadMode &lm)
+{
+	loadMode=lm;
+}
+
+bool parseFMHandler::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;	
+}
+
+
diff -r e7f6bcdf5f6c -r ebebedffba50 xml-freemind.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xml-freemind.h	Mon Jul 23 12:42:02 2007 +0000
@@ -0,0 +1,63 @@
+#ifndef XML_FREEMIND_H
+#define XML_FREEMIND_H
+
+
+#include <QString>
+#include <QXmlAttributes>
+
+#include "file.h"
+#include "mapcenterobj.h"
+#include "mapeditor.h"
+
+
+class parseFMHandler  : public QXmlDefaultHandler
+{
+public:
+	parseFMHandler();
+	~parseFMHandler();
+	QString errorProtocol();
+	bool startDocument();
+	QString parseHREF(QString);
+	bool startElement ( const QString&, const QString&,
+                        const QString& eName, const QXmlAttributes& atts ); 
+	bool   endElement ( const QString&, const QString&, const QString& ); 
+	bool characters   ( const QString&);
+	QString errorString();
+	bool fatalError( const QXmlParseException&);
+	void setMapEditor (MapEditor*);
+	void setTmpDir (QString);
+	void setInputFile (QString);
+	void setLoadMode (const LoadMode &);
+	bool readNodeAttr (const QXmlAttributes&);
+
+private:
+	QString     errorProt;
+	enum State 
+	{ 
+		StateInit, 
+		StateMap, 
+		StateNode, 
+		StateCloud,
+		StateEdge, 
+		StateIcon, 
+		StateFont,
+		StateArrowLink,
+		StateHook,
+		StateText
+	 };
+				 
+
+	LoadMode loadMode;
+	bool isVymPart;
+	State state;			 
+	State laststate;
+	QList <State> stateStack;
+	QString htmldata;
+	int branchDepth; 
+	NoteObj no;
+	MapCenterObj* mc;
+	MapEditor* me; 
+	QString tmpDir; 
+	QString inputFile;
+}; 
+#endif