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);
}
};