Форк Rambox
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

186 lines
5.1 KiB

/**
* An explorer component for navigating hierarchical content. Consists of a breadcrumb bar
* at the top, tree navigation on the left, and a center panel which displays the contents
* of a given node.
*/
Ext.define('Ext.ux.Explorer', {
extend: 'Ext.panel.Panel',
xtype: 'explorer',
requires: [
'Ext.layout.container.Border',
'Ext.toolbar.Breadcrumb',
'Ext.tree.Panel'
],
config: {
/**
* @cfg {Object} breadcrumb
* Configuration object for the breadcrumb toolbar
*/
breadcrumb: {
dock: 'top',
xtype: 'breadcrumb',
reference: 'breadcrumb'
},
/**
* @cfg {Object} contentView
* Configuration object for the "content" data view
*/
contentView: {
xtype: 'dataview',
reference: 'contentView',
region: 'center',
cls: Ext.baseCSSPrefix + 'explorer-view',
itemSelector: '.' + Ext.baseCSSPrefix + 'explorer-item',
tpl:
'<tpl for=".">' +
'<div class="' + Ext.baseCSSPrefix + 'explorer-item">' +
'<div class="{iconCls}">' +
'<div class="' + Ext.baseCSSPrefix + 'explorer-node-icon' +
'{[values.leaf ? " ' + Ext.baseCSSPrefix + 'explorer-leaf-icon' + '" : ""]}' + '">' +
'</div>' +
'<div class="' + Ext.baseCSSPrefix + 'explorer-item-text">{text}</div>' +
'</div>' +
'</div>' +
'</tpl>'
},
/**
* @cfg {Ext.data.TreeStore} store
* The TreeStore to use as the data source
*/
store: null,
/**
* @cfg {Object} tree
* Configuration object for the tree
*/
tree: {
xtype: 'treepanel',
reference: 'tree',
region: 'west',
width: 200
}
},
renderConfig: {
/**
* @cfg {Ext.data.TreeModel} selection
* The selected node
*/
selection: null
},
layout: 'border',
referenceHolder: true,
defaultListenerScope: true,
cls: Ext.baseCSSPrefix + 'explorer',
initComponent: function() {
var me = this,
store = me.getStore();
//<debug>
if (!store) {
Ext.Error.raise('Ext.ux.Explorer requires a store.');
}
//</debug>
me.dockedItems = [ me.getBreadcrumb() ];
me.items = [ me.getTree(), me.getContentView() ];
me.callParent();
},
applyBreadcrumb: function(breadcrumb) {
var store = this.getStore();
breadcrumb = Ext.create(Ext.apply({
store: store,
selection: store.getRoot()
}, breadcrumb));
breadcrumb.on('selectionchange', '_onBreadcrumbSelectionChange', this);
return breadcrumb;
},
applyContentView: function(contentView) {
/**
* @property {Ext.data.Store} contentStore
* @private
* The backing store for the content view
*/
var contentStore = this.contentStore = new Ext.data.Store({
model: this.getStore().model
});
contentView = Ext.create(Ext.apply({
store: contentStore
}, contentView));
return contentView;
},
applyTree: function(tree) {
tree = Ext.create(Ext.apply({
store: this.getStore()
}, tree));
tree.on('selectionchange', '_onTreeSelectionChange', this);
return tree;
},
updateSelection: function(node) {
var me = this,
refs = me.getReferences(),
breadcrumb = refs.breadcrumb,
tree = refs.tree,
treeSelectionModel = tree.getSelectionModel(),
contentStore = me.contentStore,
parentNode, treeView;
if (breadcrumb.getSelection() !== node) {
breadcrumb.setSelection(node);
}
if (treeSelectionModel.getSelection()[0] !== node) {
treeSelectionModel.select([node]);
parentNode = node.parentNode;
if (parentNode) {
parentNode.expand();
}
treeView = tree.getView();
treeView.scrollRowIntoView(treeView.getRow(node));
}
contentStore.removeAll();
contentStore.add(node.hasChildNodes() ? node.childNodes : [node]);
},
updateStore: function(store) {
this.getBreadcrumb().setStore(store);
},
privates: {
/**
* Handles the tree's selectionchange event
* @private
* @param {Ext.tree.Panel} tree
* @param {Ext.data.TreeModel[]} selection
*/
_onTreeSelectionChange: function(tree, selection) {
this.setSelection(selection[0]);
},
/**
* Handles the breadcrumb bar's selectionchange event
*/
_onBreadcrumbSelectionChange: function(breadcrumb, selection) {
this.setSelection(selection);
}
}
});