// Initialize the state provider Ext.state.Manager.setProvider(new Ext.air.FileProvider({ file: 'tasks.state', // if first time running defaultState : { mainWindow : { width:780, height:580, x:10, y:10 }, defaultReminder: 480 } })); Ext.onReady(function(){ Ext.QuickTips.init(); // maintain window state automatically var win = new Ext.air.NativeWindow({ id: 'mainWindow', instance: window.nativeWindow, minimizeToTray: true, trayIcon: 'ext-air/resources/icons/extlogo16.png', trayTip: 'Simple Tasks', trayMenu : [{ text: 'Open Simple Tasks', handler: function(){ win.activate(); } }, '-', { text: 'Exit', handler: function(){ air.NativeApplication.nativeApplication.exit(); } }] }); tx.data.conn.open('tasks.db'); var grid = new TaskGrid(); var selections = grid.getSelectionModel(); // Shared actions used by Ext toolbars, menus, etc. var actions = { newTask: new Ext.Action({ text: 'New Task', iconCls: 'icon-active', tooltip: 'New Task', handler: function(){ taskHeader.ntTitle.focus(); } }), deleteTask: new Ext.Action({ itemText: 'Delete', iconCls: 'icon-delete-task', tooltip: 'Delete Task', disabled: true, handler: function(){ Ext.Msg.confirm('Confirm', 'Are you sure you want to delete the selected task(s)?', function(btn){ if (btn == 'yes') { selections.each(function(s){ tx.data.tasks.remove(s); }); } }); } }), complete: new Ext.Action({ itemText: 'Mark Complete', iconCls: 'icon-mark-complete', tooltip: 'Mark Complete', disabled: true, handler: function(){ selections.each(function(s){ s.set('completed', true); }); tx.data.tasks.applyFilter(); } }), active: new Ext.Action({ itemText: 'Mark Active', tooltip: 'Mark Active', iconCls: 'icon-mark-active', disabled: true, handler: function(){ selections.each(function(s){ s.set('completed', false); }); tx.data.tasks.applyFilter(); } }), newList: new Ext.Action({ itemText: 'New List', tooltip: 'New List', iconCls: 'icon-list-new', handler: function(){ var id = tx.data.lists.newList(false, tree.getActiveFolderId()).id; tree.startEdit(id, true); } }), deleteList: new Ext.Action({ itemText: 'Delete', tooltip: 'Delete List', iconCls: 'icon-list-delete', disabled: true, handler: function(){ tree.removeList(tree.getSelectionModel().getSelectedNode()); } }), newFolder: new Ext.Action({ itemText: 'New Folder', tooltip: 'New Folder', iconCls: 'icon-folder-new', handler: function(){ var id = tx.data.lists.newList(true, tree.getActiveFolderId()).id; tree.startEdit(id, true); } }), deleteFolder: new Ext.Action({ itemText: 'Delete', tooltip: 'Delete Folder', iconCls: 'icon-folder-delete', disabled: true, handler: function(s){ tree.removeList(tree.getSelectionModel().getSelectedNode()); } }), quit : new Ext.Action({ text: 'Exit', handler: function(){ air.NativeApplication.nativeApplication.exit(); } }), pasteAsTask : new Ext.Action({ itemText: 'Paste as New Task', tooltip: 'Paste as New Task', iconCls: 'icon-paste-new', handler: function(){ if(air.Clipboard.generalClipboard.hasFormat(air.ClipboardFormats.TEXT_FORMAT)){ var text = air.Clipboard.generalClipboard.getData(air.ClipboardFormats.TEXT_FORMAT); tx.data.tasks.addTask({ taskId: Ext.uniqueId(), title: Ext.util.Format.htmlEncode(text.replace(/[\n\r]/g, '')), dueDate: new Date(), description: '', listId: tx.data.getActiveListId(), completed: false, reminder: '' }); }else{ Ext.Msg.alert('Warning', 'Could not create task. The clipboard is empty.'); } } }) }; tx.actions = actions; var menus = Ext.air.SystemMenu; menus.add('File', [ actions.newTask, actions.newList, actions.newFolder, '-',{ text:'Import...', handler: function(){ var importer = new tx.Importer(); importer.doImport(function(){ tx.data.lists.load(); root.reload(); loadList('root'); Ext.Msg.hide(); }); } },{ text:'Export...', handler: function(){ new tx.Exporter(); } }, '-', actions.quit ]); menus.add('Edit', [ actions.pasteAsTask ]); var viewMenu = menus.add('View', [{ text: 'All Tasks', checked: true, handler: function(){ Ext.getCmp('filter').setActiveItem(0); } },{ text: 'Active Tasks', checked: false, handler: function(){ Ext.getCmp('filter').setActiveItem(1); } },{ text: 'Completed Tasks', checked: false, handler: function(){ Ext.getCmp('filter').setActiveItem(2); } }]); menus.add('Help', [{ text: 'About', handler: function(){ Ext.air.NativeWindowManager.getAboutWindow().activate(); } }]); var tree = new ListTree({ actions: actions, store: tx.data.lists }); var root = tree.getRootNode(); var listSm = tree.getSelectionModel(); tx.data.lists.bindTree(tree); tx.data.lists.on('update', function(){ tx.data.tasks.applyGrouping(); if(grid.titleNode){ grid.setTitle(grid.titleNode.text); } }); var tb = new Ext.Toolbar({ region:'north', id:'main-tb', height:26, items: [{ xtype:'splitbutton', iconCls:'icon-edit', text:'New', handler: actions.newTask.initialConfig.handler, menu: [actions.newTask, actions.newList, actions.newFolder] },'-', actions.deleteTask, actions.complete, actions.active, '-', actions.pasteAsTask, '->',{ xtype:'switch', id:'filter', activeItem:0, items: [{ tooltip:'All Tasks', filter: 'all', iconCls:'icon-all', menuIndex: 0 },{ tooltip:'Active Tasks', filter: false, iconCls:'icon-active', menuIndex: 1 },{ tooltip:'Completed Tasks', filter: true, iconCls:'icon-complete', menuIndex: 2 }], listeners: { change: function(btn, item){ tx.data.tasks.applyFilter(item.filter); for (var i = 0; i < 3; i++) { viewMenu.items[i].checked = item.menuIndex === i; } }, delay: 10 // delay gives user instant click feedback before filtering tasks } }, ' ', ' ', ' ' ] }); var viewport = new Ext.Viewport({ layout:'border', items: [tb, tree, grid] }); grid.on('keydown', function(e){ if(e.getKey() == e.DELETE && !grid.editing){ actions.deleteTask.execute(); } }); tree.el.on('keydown', function(e){ if(e.getKey() == e.DELETE && !tree.editor.editing){ actions.deleteList.execute(); } }); selections.on('selectionchange', function(sm){ var disabled = sm.getCount() < 1; actions.complete.setDisabled(disabled); actions.active.setDisabled(disabled); actions.deleteTask.setDisabled(disabled); }); var taskHeader = new TaskHeader(grid); win.show(); win.instance.activate(); tx.data.tasks.init(); tree.root.select(); var loadList = function(listId){ var node = tree.getNodeById(listId); if(node && !node.isSelected()){ node.select(); return; } actions.deleteList.setDisabled(!node || !node.attributes.editable); actions.deleteFolder.setDisabled(!node || node.attributes.editable === false || !node.attributes.isFolder); if(node){ if (node.attributes.isFolder) { var lists = []; node.cascade(function(n){ if (!n.attributes.isFolder) { lists.push(n.attributes.id); } }); tx.data.tasks.loadList(lists); } else { tx.data.tasks.loadList(node.id); } grid.titleNode = node; grid.setTitle(node.text); grid.setIconClass(node.attributes.iconCls); } } listSm.on('selectionchange', function(t, node){ loadList(node ? node.id : null); }); root.reload(); if(Ext.state.Manager.get('defaultReminder') === undefined){ Ext.state.Manager.set('defaultReminder', 9 * 60); // default to 9am } win.on('closing', function(){ Ext.air.NativeWindowManager.closeAll(); }); tx.ReminderManager.init(); grid.body.on('dragover', function(e){ if(e.hasFormat(Ext.air.DragType.TEXT)){ e.preventDefault(); } }); grid.body.on('drop', function(e){ if(e.hasFormat(Ext.air.DragType.TEXT)){ var text = e.getData(Ext.air.DragType.TEXT); try{ // from outlook if(text.indexOf("Subject\t") != -1){ var tasks = text.split("\n"); for(var i = 1, len = tasks.length; i < len; i++){ var data = tasks[i].split("\t"); var list = tx.data.lists.findList(data[2]); tx.data.tasks.addTask({ taskId: Ext.uniqueId(), title: Ext.util.Format.htmlEncode(data[0]), dueDate: Date.parseDate(data[1], 'D n/j/Y') || '', description: '', listId: list ? list.id : tx.data.getActiveListId(), completed: false, reminder: '' }); } }else{ tx.data.tasks.addTask({ taskId: Ext.uniqueId(), title: Ext.util.Format.htmlEncode(text), dueDate: new Date(), description: '', listId: tx.data.getActiveListId(), completed: false, reminder: '' }); } }catch(e){ air.trace('An error occured trying to import drag drop tasks.'); } } }); });