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
 */

ListTree = function(config){
        ListTree.superclass.constructor.call(this, Ext.apply({
                id:'list-tree',
                animate:false,
                //rootVisible:false,
                region:'west',
                width:200,
                split:true,
                title:'My Lists',
                autoScroll:true,
                margins: '3 0 3 3',
                cmargins: '3 3 3 3',
                useArrows:true,
                collapsible:true,
                minWidth:120
        }, config));
        
        this.on('contextmenu', this.onContextMenu, this);
}
Ext.extend(ListTree, Ext.tree.TreePanel, {
        
        initComponent : function(){
                this.bbar = [
                        tx.actions.newList, 
                        tx.actions.deleteList, 
                        '-', 
                        tx.actions.newFolder,
                        tx.actions.deleteFolder
                ];
                
                this.loader = new ListLoader({
                        store: tx.data.lists
                });
                ListTree.superclass.initComponent.call(this);
                
                var root = new Ext.tree.AsyncTreeNode({
                text: 'All Lists',
                        id: 'root',
                        leaf: false,
                        iconCls: 'icon-folder',
                        expanded: true,
                        isFolder: true,
                        editable: false
            });
            this.setRootNode(root);
                                
                this.editor = new Ext.tree.TreeEditor(this, {
                allowBlank:false,
                blankText:'A name is required',
                selectOnFocus:true
            });
        this.editor.shadow = false;

        this.editor.on('beforecomplete', function(ed, value, startValue){
                        var node = ed.editNode;
                        value = Ext.util.Format.htmlEncode(value);
                        var r = this.store.getById(node.id);
                        r.set('listName', value);
                        //ed.editing = false;
            //ed.hide();
                        //return false;
                }, this);
                
                this.sorter = new Ext.tree.TreeSorter(this, {
                        folderSort: true
                });
        },
        
        getActiveFolderId : function(){
                var sm = this.selModel;
                var n = sm.getSelectedNode();
                if(n){
                        return n.attributes.isFolder ? n.id : n.attributes.parentId;
                }
                return 'root';
        },
        
        onContextMenu : function(node, e){
        if(!this.menu){ // create context menu on first right click
            this.menu = new Ext.menu.Menu({
                id:'lists-ctx',
                                listWidth: 200,
                items: [{
                    iconCls:'icon-edit',
                    text:'New Task',
                    scope: this,
                    handler:function(){
                                                this.ctxNode.select();
                                                tx.actions.newTask.execute();
                    }
                },{
                    iconCls:'icon-list-new',
                    text:'New List',
                    scope: this,
                    handler:function(){
                                                this.ctxNode.select();
                                                tx.actions.newList.execute();
                    }
                },{
                    iconCls:'icon-folder-new',
                    text:'New Folder',
                    scope: this,
                    handler:function(){
                                                this.ctxNode.select();
                                                tx.actions.newFolder.execute();
                    }
                },'-',{
                                        text:'Delete',
                    iconCls:'icon-list-delete',
                    scope: this,
                    handler:function(){
                        this.removeList(this.ctxNode);
                    }
                }]
            });
            this.menu.on('hide', this.onContextHide, this);
        }
        if(this.ctxNode){
            this.ctxNode.ui.removeClass('x-node-ctx');
            this.ctxNode = null;
        }
        this.ctxNode = node;
        this.ctxNode.ui.addClass('x-node-ctx');
                
                this.menu.items.get(1).setVisible(!!node.attributes.isFolder);
                this.menu.items.get(2).setVisible(!!node.attributes.isFolder);
                this.menu.items.get(0).setVisible(!node.attributes.isFolder);
                
                this.menu.showAt(e.getXY());
    },

    onContextHide : function(){
        if(this.ctxNode){
            this.ctxNode.ui.removeClass('x-node-ctx');
            this.ctxNode = null;
        }
    },
        
        startEdit : function(node, select){
                if(typeof node == 'string'){
                        node = this.getNodeById(node);
                }
                if(select === true){
                        node.select();
                }
                var ed = this.editor;
                setTimeout(function(){
                        ed.editNode = node;
                        ed.startEdit(node.ui.textNode);
                }, 10);
        },
        
        removeList : function(s){
                if (s && s.attributes.editable) {
                        Ext.Msg.confirm('Confirm', 'Are you sure you want to delete "' + Ext.util.Format.htmlEncode(s.text) + '"?', function(btn){
                                if (btn == 'yes') {
                                        if (s.nextSibling) {
                                                s.nextSibling.select();
                                        }
                                        else 
                                                if (s.previousSibling) {
                                                        s.previousSibling.select();
                                                }
                                        s.parentNode.removeChild(s);
                                        tx.data.lists.remove(this.store.getById(s.id));
                                        tx.data.tasks.removeList(s.id);
                                }
                        }, this);
                }
        }
});