]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/xul/staff_client/chrome/content/util/widgets.js
generic event dispatch
[Evergreen.git] / Open-ILS / xul / staff_client / chrome / content / util / widgets.js
1 dump('entering util/widgets.js\n');
2
3 if (typeof util == 'undefined') var util = {};
4 util.widgets = {};
5
6 util.widgets.EXPORT_OK  = [ 
7         'get_list_from_tree_selection',
8         'disable_accesskeys_in_node_and_children', 
9         'enable_accesskeys_in_node_and_children', 
10         'remove_children',
11         'make_grid',
12         'make_menulist',
13         'insertAfter',
14         'apply_vertical_tab_on_enter_handler',
15         'vertical_tab',
16         'click',
17         'dispatch',
18 ];
19 util.widgets.EXPORT_TAGS        = { ':all' : util.widgets.EXPORT_OK };
20
21 util.widgets.click = function(e) {
22         var evt = document.createEvent("MouseEvent");
23         evt.initMouseEvent( "click", true, true, window, 0, 0, 0, 0, 0, false,false,false,false,0,null);
24         e.dispatchEvent(evt);
25 }
26
27 util.widgets.dispatch = function(ev,el) {
28         var evt = document.createEvent("Events");
29         evt.initEvent( ev, true, true );
30         el.dispatchEvent(evt);
31 }
32
33 util.widgets.make_menulist = function( items ) {
34         var menulist = document.createElement('menulist');
35         var menupopup = document.createElement('menupopup'); menulist.appendChild(menupopup);
36         for (var i = 0; i < items.length; i++) {
37                 var menuitem = document.createElement('menuitem'); menupopup.appendChild(menuitem);
38                 menuitem.setAttribute('label',items[i][0]);
39                 menuitem.setAttribute('value',items[i][1]);
40         }
41         return menulist;
42 }
43
44 util.widgets.make_grid = function( cols ) {
45         var grid = document.createElement('grid');
46         var columns = document.createElement('columns'); grid.appendChild(columns);
47         for (var i = 0; i < cols.length; i++) {
48                 var column = document.createElement('column'); columns.appendChild(column);
49                 for (var j in cols[i]) {
50                         column.setAttribute(j,cols[i][j]);
51                 }
52         }
53         var rows = document.createElement('rows'); grid.appendChild(rows);
54         return grid;
55 }
56
57 util.widgets.get_list_from_tree_selection = function(tree_w) {
58         var hitlist;
59         if (typeof(tree_w) != 'object') {
60                 tree = document.getElementById(tree_w);
61         } else {
62                 tree = tree_w;
63         }
64         var list = [];
65         var start = new Object();
66         var end = new Object();
67         var numRanges = tree.view.selection.getRangeCount();
68         for (var t=0; t<numRanges; t++){
69                 tree.view.selection.getRangeAt(t,start,end);
70                 for (var v=start.value; v<=end.value; v++){
71                         var i = tree.contentView.getItemAtIndex(v);
72                         list.push( i );
73                 }
74         }
75         return list;
76 }
77
78 util.widgets.remove_children = function(w) {
79         if (typeof w != 'object') w = document.getElementById(w);
80         while(w.lastChild) w.removeChild( w.lastChild );
81 }
82
83 util.widgets.disable_accesskeys_in_node_and_children = function( node ) {
84         if (node.getAttribute('accesskey')) {
85                 node.setAttribute('oldaccesskey', node.getAttribute('accesskey'));
86                 node.setAttribute('accesskey',''); node.accessKey = '';
87         }
88         for (var i = 0; i < node.childNodes.length; i++) {
89                 util.widgets.disable_accesskeys_in_node_and_children( node.childNodes[i] );
90         }
91         dump('- node = <' + node.id + '> accesskey = <' + node.accessKey + '> accesskey = <' + node.getAttribute('accesskey') + '> oldaccesskey = <' + node.getAttribute('oldaccesskey') + '>\n');
92 }
93
94 util.widgets.enable_accesskeys_in_node_and_children = function( node ) {
95         if (node.getAttribute('oldaccesskey')) {
96                 node.setAttribute('accesskey', node.getAttribute('oldaccesskey'));
97                 node.accessKey = node.getAttribute('oldaccesskey'); 
98                 node.setAttribute('oldaccesskey','');
99         }
100         for (var i = 0; i < node.childNodes.length; i++) {
101                 util.widgets.enable_accesskeys_in_node_and_children( node.childNodes[i] );
102         }
103         dump('+ node = <' + node.id + '> accesskey = <' + node.accessKey + '> accesskey = <' + node.getAttribute('accesskey') + '> oldaccesskey = <' + node.getAttribute('oldaccesskey') + '>\n');
104 }
105
106 util.widgets.insertAfter = function(parent_node,new_node,sibling_node) {
107         sibling_node = sibling_node.nextSibling;
108         if (sibling_node) {
109                 parent_node.insertBefore(new_node,sibling_node);
110         } else {
111                 parent_node.appendChild(new_node);
112         }
113 }
114
115 util.widgets.apply_vertical_tab_on_enter_handler = function(node) {
116         try {
117                 node.addEventListener(
118                         'keypress',
119                         function(ev) {
120                                 dump('keypress: ev.target.tagName = ' + ev.target.tagName 
121                                         + ' ev.target.nodeName = ' + ev.target.nodeName 
122                                         + ' ev.keyCode = ' + ev.keyCode 
123                                         + ' ev.charCode = ' + ev.charCode + '\n');
124                                 if (ev.keyCode == 13) {
125                                         dump('trying vertical tab\n');
126                                         util.widgets.vertical_tab(ev.target);
127                                         ev.preventDefault(); ev.stopPropagation();
128                                         return true;
129                                 }
130                         },
131                         false
132                 );
133         } catch(E) {
134                 alert(E);
135         }
136 }
137
138 util.widgets.vertical_tab = function(node) {
139         try {
140                 var rel_vert_pos = node.getAttribute('rel_vert_pos') || 0;
141                 dump('vertical_tab -> node = ' + node.nodeName + ' rel_vert_pos = ' + rel_vert_pos + '\n');
142
143                 var nl = document.getElementsByTagName( node.nodeName );
144
145                 var found_self = false; var next_node; var max_rel_vert_pos = 0;
146                 for (var i = 0; i < nl.length; i++) {
147
148                         var candidate_node = nl[i];
149                         var test_rel_vert_pos = candidate_node.getAttribute('rel_vert_pos') || 0;
150
151                         if (found_self && !next_node && (test_rel_vert_pos == rel_vert_pos) && !candidate_node.disabled) {
152                         
153                                 next_node = candidate_node;
154
155                         }
156                         if (candidate_node == node) found_self = true;
157
158                         if (test_rel_vert_pos > max_rel_vert_pos) max_rel_vert_pos = test_rel_vert_pos;
159                 }
160
161                 dump('intermediate: next_node = ' + next_node + ' max_rel_vert_pos = ' + max_rel_vert_pos + '\n');
162
163                 if (!next_node) {
164
165                         found_self = false;
166                         for (var next_pos = rel_vert_pos; next_pos <= max_rel_vert_pos; next_pos++) {
167
168                                 for (var i = 0; i < nl.length; i++) {
169                                         var candidate_node = nl[i];
170                                         var test_rel_vert_pos = candidate_node.getAttribute('rel_vert_pos') || 0;
171
172                                         if (found_self && !next_node && (test_rel_vert_pos == next_pos) && !candidate_node.disabled ) {
173                                                 next_node = candidate_node;
174                                         }
175
176                                         if (candidate_node == node) found_self = true;
177                                 }
178
179                         }
180
181                 }
182
183                 if (next_node) {
184                         dump('focusing\n');
185                         next_node.focus();
186                 }
187         } catch(E) {
188                 alert(E);
189         }
190 }
191
192
193 dump('exiting util/widgets.js\n');