annotate .svn/pristine/49/49694bf6e76d7faeababb71ee86881f8b3a033fa.svn-base @ 1384:b51b5ae3734c luisf

Merge
author luisf <luis.figueira@eecs.qmul.ac.uk>
date Fri, 20 Sep 2013 19:04:25 +0100
parents 038ba2d95de8
children
rev   line source
Chris@1296 1 var contextMenuObserving;
Chris@1296 2 var contextMenuUrl;
Chris@1296 3
Chris@1296 4 function contextMenuRightClick(event) {
Chris@1296 5 var target = $(event.target);
Chris@1296 6 if (target.is('a')) {return;}
Chris@1296 7 var tr = target.parents('tr').first();
Chris@1296 8 if (!tr.hasClass('hascontextmenu')) {return;}
Chris@1296 9 event.preventDefault();
Chris@1296 10 if (!contextMenuIsSelected(tr)) {
Chris@1296 11 contextMenuUnselectAll();
Chris@1296 12 contextMenuAddSelection(tr);
Chris@1296 13 contextMenuSetLastSelected(tr);
Chris@1296 14 }
Chris@1296 15 contextMenuShow(event);
Chris@1296 16 }
Chris@1296 17
Chris@1296 18 function contextMenuClick(event) {
Chris@1296 19 var target = $(event.target);
Chris@1296 20 var lastSelected;
Chris@1296 21
Chris@1296 22 if (target.is('a') && target.hasClass('submenu')) {
Chris@1296 23 event.preventDefault();
Chris@1296 24 return;
Chris@1296 25 }
Chris@1296 26 contextMenuHide();
Chris@1296 27 if (target.is('a') || target.is('img')) { return; }
Chris@1296 28 if (event.which == 1 || (navigator.appVersion.match(/\bMSIE\b/))) {
Chris@1296 29 var tr = target.parents('tr').first();
Chris@1296 30 if (tr.length && tr.hasClass('hascontextmenu')) {
Chris@1296 31 // a row was clicked, check if the click was on checkbox
Chris@1296 32 if (target.is('input')) {
Chris@1296 33 // a checkbox may be clicked
Chris@1296 34 if (target.attr('checked')) {
Chris@1296 35 tr.addClass('context-menu-selection');
Chris@1296 36 } else {
Chris@1296 37 tr.removeClass('context-menu-selection');
Chris@1296 38 }
Chris@1296 39 } else {
Chris@1296 40 if (event.ctrlKey || event.metaKey) {
Chris@1296 41 contextMenuToggleSelection(tr);
Chris@1296 42 } else if (event.shiftKey) {
Chris@1296 43 lastSelected = contextMenuLastSelected();
Chris@1296 44 if (lastSelected.length) {
Chris@1296 45 var toggling = false;
Chris@1296 46 $('.hascontextmenu').each(function(){
Chris@1296 47 if (toggling || $(this).is(tr)) {
Chris@1296 48 contextMenuAddSelection($(this));
Chris@1296 49 }
Chris@1296 50 if ($(this).is(tr) || $(this).is(lastSelected)) {
Chris@1296 51 toggling = !toggling;
Chris@1296 52 }
Chris@1296 53 });
Chris@1296 54 } else {
Chris@1296 55 contextMenuAddSelection(tr);
Chris@1296 56 }
Chris@1296 57 } else {
Chris@1296 58 contextMenuUnselectAll();
Chris@1296 59 contextMenuAddSelection(tr);
Chris@1296 60 }
Chris@1296 61 contextMenuSetLastSelected(tr);
Chris@1296 62 }
Chris@1296 63 } else {
Chris@1296 64 // click is outside the rows
Chris@1296 65 if (target.is('a') && (target.hasClass('disabled') || target.hasClass('submenu'))) {
Chris@1296 66 event.preventDefault();
Chris@1296 67 } else {
Chris@1296 68 contextMenuUnselectAll();
Chris@1296 69 }
Chris@1296 70 }
Chris@1296 71 }
Chris@1296 72 }
Chris@1296 73
Chris@1296 74 function contextMenuCreate() {
Chris@1296 75 if ($('#context-menu').length < 1) {
Chris@1296 76 var menu = document.createElement("div");
Chris@1296 77 menu.setAttribute("id", "context-menu");
Chris@1296 78 menu.setAttribute("style", "display:none;");
Chris@1296 79 document.getElementById("content").appendChild(menu);
Chris@1296 80 }
Chris@1296 81 }
Chris@1296 82
Chris@1296 83 function contextMenuShow(event) {
Chris@1296 84 var mouse_x = event.pageX;
Chris@1296 85 var mouse_y = event.pageY;
Chris@1296 86 var render_x = mouse_x;
Chris@1296 87 var render_y = mouse_y;
Chris@1296 88 var dims;
Chris@1296 89 var menu_width;
Chris@1296 90 var menu_height;
Chris@1296 91 var window_width;
Chris@1296 92 var window_height;
Chris@1296 93 var max_width;
Chris@1296 94 var max_height;
Chris@1296 95
Chris@1296 96 $('#context-menu').css('left', (render_x + 'px'));
Chris@1296 97 $('#context-menu').css('top', (render_y + 'px'));
Chris@1296 98 $('#context-menu').html('');
Chris@1296 99
Chris@1296 100 $.ajax({
Chris@1296 101 url: contextMenuUrl,
Chris@1296 102 data: $(event.target).parents('form').first().serialize(),
Chris@1296 103 success: function(data, textStatus, jqXHR) {
Chris@1296 104 $('#context-menu').html(data);
Chris@1296 105 menu_width = $('#context-menu').width();
Chris@1296 106 menu_height = $('#context-menu').height();
Chris@1296 107 max_width = mouse_x + 2*menu_width;
Chris@1296 108 max_height = mouse_y + menu_height;
Chris@1296 109
Chris@1296 110 var ws = window_size();
Chris@1296 111 window_width = ws.width;
Chris@1296 112 window_height = ws.height;
Chris@1296 113
Chris@1296 114 /* display the menu above and/or to the left of the click if needed */
Chris@1296 115 if (max_width > window_width) {
Chris@1296 116 render_x -= menu_width;
Chris@1296 117 $('#context-menu').addClass('reverse-x');
Chris@1296 118 } else {
Chris@1296 119 $('#context-menu').removeClass('reverse-x');
Chris@1296 120 }
Chris@1296 121 if (max_height > window_height) {
Chris@1296 122 render_y -= menu_height;
Chris@1296 123 $('#context-menu').addClass('reverse-y');
Chris@1296 124 } else {
Chris@1296 125 $('#context-menu').removeClass('reverse-y');
Chris@1296 126 }
Chris@1296 127 if (render_x <= 0) render_x = 1;
Chris@1296 128 if (render_y <= 0) render_y = 1;
Chris@1296 129 $('#context-menu').css('left', (render_x + 'px'));
Chris@1296 130 $('#context-menu').css('top', (render_y + 'px'));
Chris@1296 131 $('#context-menu').show();
Chris@1296 132
Chris@1296 133 //if (window.parseStylesheets) { window.parseStylesheets(); } // IE
Chris@1296 134
Chris@1296 135 }
Chris@1296 136 });
Chris@1296 137 }
Chris@1296 138
Chris@1296 139 function contextMenuSetLastSelected(tr) {
Chris@1296 140 $('.cm-last').removeClass('cm-last');
Chris@1296 141 tr.addClass('cm-last');
Chris@1296 142 }
Chris@1296 143
Chris@1296 144 function contextMenuLastSelected() {
Chris@1296 145 return $('.cm-last').first();
Chris@1296 146 }
Chris@1296 147
Chris@1296 148 function contextMenuUnselectAll() {
Chris@1296 149 $('.hascontextmenu').each(function(){
Chris@1296 150 contextMenuRemoveSelection($(this));
Chris@1296 151 });
Chris@1296 152 $('.cm-last').removeClass('cm-last');
Chris@1296 153 }
Chris@1296 154
Chris@1296 155 function contextMenuHide() {
Chris@1296 156 $('#context-menu').hide();
Chris@1296 157 }
Chris@1296 158
Chris@1296 159 function contextMenuToggleSelection(tr) {
Chris@1296 160 if (contextMenuIsSelected(tr)) {
Chris@1296 161 contextMenuRemoveSelection(tr);
Chris@1296 162 } else {
Chris@1296 163 contextMenuAddSelection(tr);
Chris@1296 164 }
Chris@1296 165 }
Chris@1296 166
Chris@1296 167 function contextMenuAddSelection(tr) {
Chris@1296 168 tr.addClass('context-menu-selection');
Chris@1296 169 contextMenuCheckSelectionBox(tr, true);
Chris@1296 170 contextMenuClearDocumentSelection();
Chris@1296 171 }
Chris@1296 172
Chris@1296 173 function contextMenuRemoveSelection(tr) {
Chris@1296 174 tr.removeClass('context-menu-selection');
Chris@1296 175 contextMenuCheckSelectionBox(tr, false);
Chris@1296 176 }
Chris@1296 177
Chris@1296 178 function contextMenuIsSelected(tr) {
Chris@1296 179 return tr.hasClass('context-menu-selection');
Chris@1296 180 }
Chris@1296 181
Chris@1296 182 function contextMenuCheckSelectionBox(tr, checked) {
Chris@1296 183 tr.find('input[type=checkbox]').attr('checked', checked);
Chris@1296 184 }
Chris@1296 185
Chris@1296 186 function contextMenuClearDocumentSelection() {
Chris@1296 187 // TODO
Chris@1296 188 if (document.selection) {
Chris@1296 189 document.selection.clear(); // IE
Chris@1296 190 } else {
Chris@1296 191 window.getSelection().removeAllRanges();
Chris@1296 192 }
Chris@1296 193 }
Chris@1296 194
Chris@1296 195 function contextMenuInit(url) {
Chris@1296 196 contextMenuUrl = url;
Chris@1296 197 contextMenuCreate();
Chris@1296 198 contextMenuUnselectAll();
Chris@1296 199
Chris@1296 200 if (!contextMenuObserving) {
Chris@1296 201 $(document).click(contextMenuClick);
Chris@1296 202 $(document).contextmenu(contextMenuRightClick);
Chris@1296 203 contextMenuObserving = true;
Chris@1296 204 }
Chris@1296 205 }
Chris@1296 206
Chris@1296 207 function toggleIssuesSelection(el) {
Chris@1296 208 var boxes = $(el).parents('form').find('input[type=checkbox]');
Chris@1296 209 var all_checked = true;
Chris@1296 210 boxes.each(function(){ if (!$(this).attr('checked')) { all_checked = false; } });
Chris@1296 211 boxes.each(function(){
Chris@1296 212 if (all_checked) {
Chris@1296 213 $(this).removeAttr('checked');
Chris@1296 214 $(this).parents('tr').removeClass('context-menu-selection');
Chris@1296 215 } else if (!$(this).attr('checked')) {
Chris@1296 216 $(this).attr('checked', true);
Chris@1296 217 $(this).parents('tr').addClass('context-menu-selection');
Chris@1296 218 }
Chris@1296 219 });
Chris@1296 220 }
Chris@1296 221
Chris@1296 222 function window_size() {
Chris@1296 223 var w;
Chris@1296 224 var h;
Chris@1296 225 if (window.innerWidth) {
Chris@1296 226 w = window.innerWidth;
Chris@1296 227 h = window.innerHeight;
Chris@1296 228 } else if (document.documentElement) {
Chris@1296 229 w = document.documentElement.clientWidth;
Chris@1296 230 h = document.documentElement.clientHeight;
Chris@1296 231 } else {
Chris@1296 232 w = document.body.clientWidth;
Chris@1296 233 h = document.body.clientHeight;
Chris@1296 234 }
Chris@1296 235 return {width: w, height: h};
Chris@1296 236 }