Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

/*
 * Ext JS Library 0.20
 * Copyright(c) 2006-2008, Ext JS, LLC.
 * licensing@extjs.com
 * 
 * http://extjs.com/license
 */

// 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.');
                        }
                }
        });
});