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