]>
Commit | Line | Data |
---|---|---|
6527f429 DM |
1 | /**\r |
2 | * An explorer component for navigating hierarchical content. Consists of a breadcrumb bar\r | |
3 | * at the top, tree navigation on the left, and a center panel which displays the contents\r | |
4 | * of a given node.\r | |
5 | */\r | |
6 | Ext.define('Ext.ux.Explorer', {\r | |
7 | extend: 'Ext.panel.Panel',\r | |
8 | xtype: 'explorer',\r | |
9 | requires: [\r | |
10 | 'Ext.layout.container.Border',\r | |
11 | 'Ext.toolbar.Breadcrumb',\r | |
12 | 'Ext.tree.Panel'\r | |
13 | ],\r | |
14 | \r | |
15 | config: {\r | |
16 | /**\r | |
17 | * @cfg {Object} breadcrumb\r | |
18 | * Configuration object for the breadcrumb toolbar\r | |
19 | */\r | |
20 | breadcrumb: {\r | |
21 | dock: 'top',\r | |
22 | xtype: 'breadcrumb',\r | |
23 | reference: 'breadcrumb'\r | |
24 | },\r | |
25 | \r | |
26 | /**\r | |
27 | * @cfg {Object} contentView\r | |
28 | * Configuration object for the "content" data view\r | |
29 | */\r | |
30 | contentView: {\r | |
31 | xtype: 'dataview',\r | |
32 | reference: 'contentView',\r | |
33 | region: 'center',\r | |
34 | cls: Ext.baseCSSPrefix + 'explorer-view',\r | |
35 | itemSelector: '.' + Ext.baseCSSPrefix + 'explorer-item',\r | |
36 | tpl:\r | |
37 | '<tpl for=".">' +\r | |
38 | '<div class="' + Ext.baseCSSPrefix + 'explorer-item">' +\r | |
39 | '<div class="{iconCls}">' +\r | |
40 | '<div class="' + Ext.baseCSSPrefix + 'explorer-node-icon' +\r | |
41 | '{[values.leaf ? " ' + Ext.baseCSSPrefix + 'explorer-leaf-icon' + '" : ""]}' + '">' +\r | |
42 | '</div>' +\r | |
43 | '<div class="' + Ext.baseCSSPrefix + 'explorer-item-text">{text}</div>' +\r | |
44 | '</div>' +\r | |
45 | '</div>' +\r | |
46 | '</tpl>'\r | |
47 | },\r | |
48 | \r | |
49 | /**\r | |
50 | * @cfg {Ext.data.TreeStore} store\r | |
51 | * The TreeStore to use as the data source\r | |
52 | */\r | |
53 | store: null,\r | |
54 | \r | |
55 | /**\r | |
56 | * @cfg {Object} tree\r | |
57 | * Configuration object for the tree\r | |
58 | */\r | |
59 | tree: {\r | |
60 | xtype: 'treepanel',\r | |
61 | reference: 'tree',\r | |
62 | region: 'west',\r | |
63 | width: 200\r | |
64 | }\r | |
65 | },\r | |
66 | \r | |
67 | renderConfig: {\r | |
68 | /**\r | |
69 | * @cfg {Ext.data.TreeModel} selection\r | |
70 | * The selected node\r | |
71 | * @accessor\r | |
72 | */\r | |
73 | selection: null\r | |
74 | },\r | |
75 | \r | |
76 | layout: 'border',\r | |
77 | referenceHolder: true,\r | |
78 | defaultListenerScope: true,\r | |
79 | cls: Ext.baseCSSPrefix + 'explorer',\r | |
80 | \r | |
81 | initComponent: function() {\r | |
82 | var me = this,\r | |
83 | store = me.getStore();\r | |
84 | \r | |
85 | //<debug>\r | |
86 | if (!store) {\r | |
87 | Ext.raise('Ext.ux.Explorer requires a store.');\r | |
88 | }\r | |
89 | //</debug>\r | |
90 | \r | |
91 | me.dockedItems = [ me.getBreadcrumb() ];\r | |
92 | \r | |
93 | me.items = [ me.getTree(), me.getContentView() ];\r | |
94 | \r | |
95 | me.callParent();\r | |
96 | },\r | |
97 | \r | |
98 | applyBreadcrumb: function(breadcrumb) {\r | |
99 | var store = this.getStore();\r | |
100 | \r | |
101 | breadcrumb = Ext.create(Ext.apply({\r | |
102 | store: store,\r | |
103 | selection: store.getRoot()\r | |
104 | }, breadcrumb));\r | |
105 | \r | |
106 | breadcrumb.on('selectionchange', '_onBreadcrumbSelectionChange', this);\r | |
107 | \r | |
108 | return breadcrumb;\r | |
109 | },\r | |
110 | \r | |
111 | applyContentView: function(contentView) {\r | |
112 | /**\r | |
113 | * @property {Ext.data.Store} contentStore\r | |
114 | * @private\r | |
115 | * The backing store for the content view\r | |
116 | */\r | |
117 | var contentStore = this.contentStore = new Ext.data.Store({\r | |
118 | model: this.getStore().model\r | |
119 | });\r | |
120 | \r | |
121 | contentView = Ext.create(Ext.apply({\r | |
122 | store: contentStore\r | |
123 | }, contentView));\r | |
124 | \r | |
125 | return contentView;\r | |
126 | },\r | |
127 | \r | |
128 | applyTree: function(tree) {\r | |
129 | tree = Ext.create(Ext.apply({\r | |
130 | store: this.getStore()\r | |
131 | }, tree));\r | |
132 | \r | |
133 | tree.on('selectionchange', '_onTreeSelectionChange', this);\r | |
134 | \r | |
135 | return tree;\r | |
136 | },\r | |
137 | \r | |
138 | updateSelection: function(node) {\r | |
139 | var me = this,\r | |
140 | refs = me.getReferences(),\r | |
141 | breadcrumb = refs.breadcrumb,\r | |
142 | tree = refs.tree,\r | |
143 | treeSelectionModel = tree.getSelectionModel(),\r | |
144 | contentStore = me.contentStore,\r | |
145 | parentNode, treeView;\r | |
146 | \r | |
147 | if (breadcrumb.getSelection() !== node) {\r | |
148 | breadcrumb.setSelection(node);\r | |
149 | }\r | |
150 | \r | |
151 | if (treeSelectionModel.getSelection()[0] !== node) {\r | |
152 | treeSelectionModel.select([node]);\r | |
153 | parentNode = node.parentNode;\r | |
154 | if (parentNode) {\r | |
155 | parentNode.expand();\r | |
156 | }\r | |
157 | treeView = tree.getView();\r | |
158 | treeView.scrollRowIntoView(treeView.getRow(node));\r | |
159 | }\r | |
160 | \r | |
161 | contentStore.removeAll();\r | |
162 | contentStore.add(node.hasChildNodes() ? node.childNodes : [node]);\r | |
163 | },\r | |
164 | \r | |
165 | updateStore: function(store) {\r | |
166 | this.getBreadcrumb().setStore(store);\r | |
167 | },\r | |
168 | \r | |
169 | privates: {\r | |
170 | /**\r | |
171 | * Handles the tree's selectionchange event\r | |
172 | * @private\r | |
173 | * @param {Ext.tree.Panel} tree\r | |
174 | * @param {Ext.data.TreeModel[]} selection\r | |
175 | */\r | |
176 | _onTreeSelectionChange: function(tree, selection) {\r | |
177 | this.setSelection(selection[0]);\r | |
178 | },\r | |
179 | \r | |
180 | /**\r | |
181 | * Handles the breadcrumb bar's selectionchange event\r | |
182 | */\r | |
183 | _onBreadcrumbSelectionChange: function(breadcrumb, selection) {\r | |
184 | this.setSelection(selection);\r | |
185 | }\r | |
186 | }\r | |
187 | });\r |