/* * Ext JS Library 2.0 Copyright(c) 2006-2007, Ext JS, LLC. licensing@extjs.com * * http://extjs.com/license */ FeedPanel = function() { FeedPanel.superclass.constructor.call(this, { id : 'feed-tree', region : 'west', title : 'Feeds', split : true, width : 225, minSize : 175, maxSize : 400, collapsible : true, margins : '5 0 5 5', cmargins : '5 5 5 5', rootVisible : false, lines : false, autoScroll : true, root : new Ext.tree.TreeNode('Feed Viewer'), collapseFirst : false, tbar : [{ iconCls : 'add-feed', text : 'Add Feed', handler : this.showWindow, scope : this }, { id : 'delete', iconCls : 'delete-icon', text : 'Remove', handler : function() { var s = this.getSelectionModel() .getSelectedNode(); if (s) { this.removeFeed(s.attributes.url); } }, scope : this }] }); this.feeds = this.root.appendChild(new Ext.tree.TreeNode({ text : 'My Feeds', cls : 'feeds-node', expanded : true })); this.getSelectionModel().on({ 'beforeselect' : function(sm, node) { return node.isLeaf(); }, 'selectionchange' : function(sm, node) { if (node) { this.fireEvent('feedselect', node.attributes); } this.getTopToolbar().items.get('delete').setDisabled(!node); }, scope : this }); this.addEvents({ feedselect : true }); this.on('contextmenu', this.onContextMenu, this); }; Ext.extend(FeedPanel, Ext.tree.TreePanel, { onContextMenu : function(node, e) { if (!this.menu) { // create context menu on first right click this.menu = new Ext.menu.Menu({ id : 'feeds-ctx', items : [{ id : 'load', iconCls : 'load-icon', text : 'Load Feed', scope : this, handler : function() { this.ctxNode.select(); } }, { text : 'Remove', iconCls : 'delete-icon', scope : this, handler : function() { this.ctxNode.ui .removeClass('x-node-ctx'); this .removeFeed(this.ctxNode.attributes.url); this.ctxNode = null; } }, '-', { iconCls : 'add-feed', text : 'Add Feed', handler : this.showWindow, scope : this }] }); this.menu.on('hide', this.onContextHide, this); } if (this.ctxNode) { this.ctxNode.ui.removeClass('x-node-ctx'); this.ctxNode = null; } if (node.isLeaf()) { this.ctxNode = node; this.ctxNode.ui.addClass('x-node-ctx'); this.menu.items.get('load').setDisabled(node.isSelected()); this.menu.showAt(e.getXY()); } }, onContextHide : function() { if (this.ctxNode) { this.ctxNode.ui.removeClass('x-node-ctx'); this.ctxNode = null; } }, showWindow : function(btn) { if (!this.win) { this.win = new FeedWindow(); this.win.on('validfeed', this.addFeed, this); } this.win.show(btn); }, selectFeed : function(url) { this.getNodeById(url).select(); }, removeFeed : function(url) { var node = this.getNodeById(url); if (node) { node.unselect(); Ext.fly(node.ui.elNode).ghost('l', { callback : node.remove, scope : node, duration : .4 }); } }, addFeed : function(attrs, inactive, preventAnim) { var exists = this.getNodeById(attrs.url); if (exists) { if (!inactive) { exists.select(); exists.ui.highlight(); } return; } Ext.apply(attrs, { iconCls : 'feed-icon', leaf : true, cls : 'feed', id : attrs.url }); var node = new Ext.tree.TreeNode(attrs); this.feeds.appendChild(node); if (!inactive) { if (!preventAnim) { Ext.fly(node.ui.elNode).slideIn('l', { callback : node.select, scope : node, duration : .4 }); } else { node.select(); } } return node; }, // prevent the default context menu when you miss the node afterRender : function() { FeedPanel.superclass.afterRender.call(this); this.el.on('contextmenu', function(e) { e.preventDefault(); }); } });