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:'0 0 5 5',
cmargins:'0 5 5 5',
rootVisible:false,
lines:false,
autoScroll:true,
root: new Ext.tree.TreeNode('My Feeds'),
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();
});
}
});
Ext.reg('appfeedpanel', FeedPanel);