]>
Commit | Line | Data |
---|---|---|
6527f429 DM |
1 | /**\r |
2 | * @class Ext.tree.NavigationModel\r | |
3 | * @private\r | |
4 | * This class listens for key events fired from a {@link Ext.tree.Panel TreePanel}, and moves the currently focused item\r | |
5 | * by adding the class {@link #focusCls}.\r | |
6 | *\r | |
7 | * Navigation and interactions are defined by http://www.w3.org/TR/2013/WD-wai-aria-practices-20130307/#TreeView\r | |
8 | * or, if there are multiple visible columns, by http://www.w3.org/TR/2013/WD-wai-aria-practices-20130307/#treegrid\r | |
9 | */\r | |
10 | Ext.define('Ext.tree.NavigationModel', {\r | |
11 | extend: 'Ext.grid.NavigationModel',\r | |
12 | \r | |
13 | alias: 'view.navigation.tree',\r | |
14 | \r | |
15 | initKeyNav: function(view) {\r | |
16 | var me = this,\r | |
17 | columns = me.view.ownerGrid.columns,\r | |
18 | len, i;\r | |
19 | \r | |
20 | // Must go up to any possible locking assembly to find total number of columns\r | |
21 | me.isTreeGrid = columns && columns.length > 1;\r | |
22 | me.callParent([view]);\r | |
23 | \r | |
24 | // We will have two keyNavs if we are the navigation model for a lockable assembly\r | |
25 | for (i = 0, len = me.keyNav.length; i < len; i++) {\r | |
26 | me.keyNav[i].map.addBinding([{\r | |
27 | key: '8',\r | |
28 | shift: true,\r | |
29 | handler: me.onAsterisk,\r | |
30 | scope: me\r | |
31 | }, {\r | |
32 | key: Ext.event.Event.NUM_MULTIPLY,\r | |
33 | handler: me.onAsterisk,\r | |
34 | scope: me\r | |
35 | }]);\r | |
36 | }\r | |
37 | me.view.grid.on({\r | |
38 | columnschanged: me.onColumnsChanged,\r | |
39 | scope: me\r | |
40 | });\r | |
41 | },\r | |
42 | \r | |
43 | onColumnsChanged: function() {\r | |
44 | // Must go up to any possible locking assembly to find total number of columns\r | |
45 | this.isTreeGrid = this.view.ownerGrid.getVisibleColumnManager().getColumns().length > 1;\r | |
46 | },\r | |
47 | \r | |
48 | \r | |
49 | onCellClick: function(view, cell, cellIndex, record, row, recordIndex, clickEvent) {\r | |
50 | this.callParent([view, cell, cellIndex, record, row, recordIndex, clickEvent]);\r | |
51 | \r | |
52 | // Return false if node toggled.\r | |
53 | // Do not process the cell click further when we do an expand/collapse\r | |
54 | return !clickEvent.nodeToggled;\r | |
55 | },\r | |
56 | \r | |
57 | onKeyLeft: function(keyEvent) {\r | |
58 | var me = this,\r | |
59 | view = keyEvent.view,\r | |
60 | record = me.record;\r | |
61 | \r | |
62 | // Left when a TreeGrid navigates between columns\r | |
63 | if (me.isTreeGrid && !keyEvent.ctrlKey) {\r | |
64 | return me.callParent([keyEvent]);\r | |
65 | }\r | |
66 | \r | |
67 | // Left arrow key on an expanded node closes the node.\r | |
68 | if (keyEvent.position.column.isTreeColumn && record.isExpanded()) {\r | |
69 | view.collapse(record);\r | |
70 | }\r | |
71 | // Left arrow key on a closed or end node moves focus to the node's parent (don't attempt to focus hidden root).\r | |
72 | else {\r | |
73 | record = record.parentNode;\r | |
74 | if (record && !(record.isRoot() && !view.rootVisible)) {\r | |
75 | me.setPosition(record, null, keyEvent);\r | |
76 | }\r | |
77 | }\r | |
78 | },\r | |
79 | \r | |
80 | onKeyRight: function(keyEvent) {\r | |
81 | var me = this,\r | |
82 | record = me.record;\r | |
83 | \r | |
84 | // Right when a TreeGrid navigates between columns\r | |
85 | if (me.isTreeGrid && !keyEvent.ctrlKey) {\r | |
86 | return me.callParent([keyEvent]);\r | |
87 | }\r | |
88 | \r | |
89 | // Right arrow key expands a closed node, moves to the first child of an open node, or does nothing on an end node.\r | |
90 | if (!record.isLeaf()) {\r | |
91 | if (keyEvent.position.column.isTreeColumn && !record.isExpanded()) {\r | |
92 | keyEvent.view.expand(record);\r | |
93 | } else if (record.isExpanded()) {\r | |
94 | record = record.childNodes[0];\r | |
95 | if (record) {\r | |
96 | me.setPosition(record);\r | |
97 | }\r | |
98 | }\r | |
99 | }\r | |
100 | },\r | |
101 | \r | |
102 | onKeyEnter: function(keyEvent) {\r | |
103 | if (this.record.data.checked != null) {\r | |
104 | this.toggleCheck(keyEvent);\r | |
105 | } else {\r | |
106 | this.callParent([keyEvent]);\r | |
107 | }\r | |
108 | },\r | |
109 | \r | |
110 | onKeySpace: function(keyEvent) {\r | |
111 | if (this.record.data.checked != null) {\r | |
112 | this.toggleCheck(keyEvent);\r | |
113 | } else {\r | |
114 | this.callParent([keyEvent]);\r | |
115 | }\r | |
116 | },\r | |
117 | \r | |
118 | toggleCheck: function(keyEvent) {\r | |
119 | this.view.onCheckChange(keyEvent);\r | |
120 | },\r | |
121 | \r | |
122 | // (asterisk) on keypad expands all nodes.\r | |
123 | onAsterisk: function(keyEvent) {\r | |
124 | this.view.ownerCt.expandAll();\r | |
125 | }\r | |
126 | }); |