--- /dev/null
+<html>\r
+<head>\r
+ <title>The source code</title>\r
+ <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />\r
+ <script type="text/javascript" src="../resources/prettify/prettify.js"></script>\r
+</head>\r
+<body onload="prettyPrint();">\r
+ <pre class="prettyprint lang-js">tx.Importer = function(){\r
+ function chooseFile(callback){\r
+ var file = new air.File(air.File.documentsDirectory.nativePath);\r
+ var filter = new air.FileFilter("Tasks XML File", "*.xml");\r
+ \r
+ file.addEventListener('select', function(e){\r
+ doImport(e.target, callback);\r
+ });\r
+ \r
+ file.browseForOpen('Open', [filter]);\r
+ }\r
+ \r
+ \r
+ /*\r
+ * This import function used to be clean and simple. The addition of asynchronous import and\r
+ * a progress bar changed that quickly. :) \r
+ */\r
+ function doImport(file, callback){\r
+ \r
+ Ext.Msg.progress('Import', 'Reading file...');\r
+ \r
+ var listTable = tx.data.conn.getTable('list', 'listId');\r
+ var taskTable = tx.data.conn.getTable('task', 'taskId');\r
+ var taskCount = 0;\r
+ var visibleIndex = 0;\r
+ var doUpdate = true;\r
+ var f = String.format;\r
+ \r
+ function getProgress(index){\r
+ if(taskCount > 0){\r
+ return (.8 * index) / taskCount;\r
+ }else{\r
+ return .8;\r
+ }\r
+ }\r
+ \r
+ function readFile(){\r
+ var stream = new air.FileStream();\r
+ stream.open(file, air.FileMode.READ);\r
+ var xml = stream.readUTFBytes(stream.bytesAvailable);\r
+ stream.close();\r
+ \r
+ Ext.Msg.updateProgress(.1, 'Parsing...');\r
+ parse.defer(10, null, [xml]);\r
+ }\r
+ \r
+ function parse(xml){\r
+ try {\r
+ var doc = new runtime.flash.xml.XMLDocument();\r
+ doc.ignoreWhite = true;\r
+ doc.parseXML(xml);\r
+ \r
+ var lists = doc.firstChild.childNodes;\r
+ var count = lists.length;\r
+ \r
+ for (var i = 0; i < count; i++) {\r
+ taskCount += lists[i].childNodes.length;\r
+ } \r
+ Ext.Msg.updateProgress(.15, '', 'Loading Tasks...');\r
+ loadLists(lists, 0);\r
+ }catch(e){\r
+ air.trace(e);\r
+ alert('An error occured while trying to import the selected file.');\r
+ } \r
+ }\r
+ \r
+ function loadLists(lists, index){\r
+ if(index < lists.length){\r
+ var list = lists[index];\r
+ listTable.save(list.attributes);\r
+ nextTask(list.childNodes, 0, lists, index);\r
+ }\r
+ else {\r
+ Ext.Msg.updateProgress(1, '', 'Completing import...');\r
+ callback.defer(10);\r
+ } \r
+ } \r
+ \r
+ function nextTask(tasks, index, lists, listIndex){\r
+ if(index < tasks.length){\r
+ Ext.Msg.updateProgress(\r
+ getProgress(++visibleIndex),\r
+ f('{0} of {1}', visibleIndex, taskCount)\r
+ );\r
+ loadTasks.defer(250, window, [tasks, index, lists, listIndex]);\r
+ }\r
+ else {\r
+ loadLists(lists, ++listIndex);\r
+ }\r
+ }\r
+ \r
+ function loadTasks(tasks, index, lists, listIndex){\r
+ taskTable.save(tasks[index].attributes);\r
+ nextTask(tasks, ++index, lists, listIndex);\r
+ }\r
+ \r
+ readFile.defer(10);\r
+ }\r
+ \r
+ this.doImport = function(callback){\r
+ chooseFile(callback);\r
+ }\r
+};\r
+</pre> \r
+</body>\r
+</html>
\ No newline at end of file