diff .svn/pristine/78/787bda5f0568c9fa3603342f51af7f230d71bae6.svn-base @ 1298:4f746d8966dd redmine_2.3_integration

Merge from redmine-2.3 branch to create new branch redmine-2.3-integration
author Chris Cannam
date Fri, 14 Jun 2013 09:28:30 +0100
parents 622f24f53b42
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.svn/pristine/78/787bda5f0568c9fa3603342f51af7f230d71bae6.svn-base	Fri Jun 14 09:28:30 2013 +0100
@@ -0,0 +1,236 @@
+var contextMenuObserving;
+var contextMenuUrl;
+
+function contextMenuRightClick(event) {
+  var target = $(event.target);
+  if (target.is('a')) {return;}
+  var tr = target.parents('tr').first();
+  if (!tr.hasClass('hascontextmenu')) {return;}
+  event.preventDefault();
+  if (!contextMenuIsSelected(tr)) {
+    contextMenuUnselectAll();
+    contextMenuAddSelection(tr);
+    contextMenuSetLastSelected(tr);
+  }
+  contextMenuShow(event);
+}
+
+function contextMenuClick(event) {
+  var target = $(event.target);
+  var lastSelected;
+
+  if (target.is('a') && target.hasClass('submenu')) {
+    event.preventDefault();
+    return;
+  }
+  contextMenuHide();
+  if (target.is('a') || target.is('img')) { return; }
+  if (event.which == 1 || (navigator.appVersion.match(/\bMSIE\b/))) {
+    var tr = target.parents('tr').first();
+    if (tr.length && tr.hasClass('hascontextmenu')) {
+      // a row was clicked, check if the click was on checkbox
+      if (target.is('input')) {
+        // a checkbox may be clicked
+        if (target.attr('checked')) {
+          tr.addClass('context-menu-selection');
+        } else {
+          tr.removeClass('context-menu-selection');
+        }
+      } else {
+        if (event.ctrlKey || event.metaKey) {
+          contextMenuToggleSelection(tr);
+        } else if (event.shiftKey) {
+          lastSelected = contextMenuLastSelected();
+          if (lastSelected.length) {
+            var toggling = false;
+            $('.hascontextmenu').each(function(){
+              if (toggling || $(this).is(tr)) {
+                contextMenuAddSelection($(this));
+              }
+              if ($(this).is(tr) || $(this).is(lastSelected)) {
+                toggling = !toggling;
+              }
+            });
+          } else {
+            contextMenuAddSelection(tr);
+          }
+        } else {
+          contextMenuUnselectAll();
+          contextMenuAddSelection(tr);
+        }
+        contextMenuSetLastSelected(tr);
+      }
+    } else {
+      // click is outside the rows
+      if (target.is('a') && (target.hasClass('disabled') || target.hasClass('submenu'))) {
+        event.preventDefault();
+      } else {
+        contextMenuUnselectAll();
+      }
+    }
+  }
+}
+
+function contextMenuCreate() {
+  if ($('#context-menu').length < 1) {
+    var menu = document.createElement("div");
+    menu.setAttribute("id", "context-menu");
+    menu.setAttribute("style", "display:none;");
+    document.getElementById("content").appendChild(menu);
+  }
+}
+
+function contextMenuShow(event) {
+  var mouse_x = event.pageX;
+  var mouse_y = event.pageY;
+  var render_x = mouse_x;
+  var render_y = mouse_y;
+  var dims;
+  var menu_width;
+  var menu_height;
+  var window_width;
+  var window_height;
+  var max_width;
+  var max_height;
+
+  $('#context-menu').css('left', (render_x + 'px'));
+  $('#context-menu').css('top', (render_y + 'px'));
+  $('#context-menu').html('');
+
+  $.ajax({
+    url: contextMenuUrl,
+    data: $(event.target).parents('form').first().serialize(),
+    success: function(data, textStatus, jqXHR) {
+      $('#context-menu').html(data);
+      menu_width = $('#context-menu').width();
+      menu_height = $('#context-menu').height();
+      max_width = mouse_x + 2*menu_width;
+      max_height = mouse_y + menu_height;
+
+      var ws = window_size();
+      window_width = ws.width;
+      window_height = ws.height;
+
+      /* display the menu above and/or to the left of the click if needed */
+      if (max_width > window_width) {
+       render_x -= menu_width;
+       $('#context-menu').addClass('reverse-x');
+      } else {
+       $('#context-menu').removeClass('reverse-x');
+      }
+      if (max_height > window_height) {
+       render_y -= menu_height;
+       $('#context-menu').addClass('reverse-y');
+      } else {
+       $('#context-menu').removeClass('reverse-y');
+      }
+      if (render_x <= 0) render_x = 1;
+      if (render_y <= 0) render_y = 1;
+      $('#context-menu').css('left', (render_x + 'px'));
+      $('#context-menu').css('top', (render_y + 'px'));
+      $('#context-menu').show();
+
+      //if (window.parseStylesheets) { window.parseStylesheets(); } // IE
+
+    }
+  });
+}
+
+function contextMenuSetLastSelected(tr) {
+  $('.cm-last').removeClass('cm-last');
+  tr.addClass('cm-last');
+}
+
+function contextMenuLastSelected() {
+  return $('.cm-last').first();
+}
+
+function contextMenuUnselectAll() {
+  $('.hascontextmenu').each(function(){
+    contextMenuRemoveSelection($(this));
+  });
+  $('.cm-last').removeClass('cm-last');
+}
+
+function contextMenuHide() {
+  $('#context-menu').hide();
+}
+
+function contextMenuToggleSelection(tr) {
+  if (contextMenuIsSelected(tr)) {
+    contextMenuRemoveSelection(tr);
+  } else {
+    contextMenuAddSelection(tr);
+  }
+}
+
+function contextMenuAddSelection(tr) {
+  tr.addClass('context-menu-selection');
+  contextMenuCheckSelectionBox(tr, true);
+  contextMenuClearDocumentSelection();
+}
+
+function contextMenuRemoveSelection(tr) {
+  tr.removeClass('context-menu-selection');
+  contextMenuCheckSelectionBox(tr, false);
+}
+
+function contextMenuIsSelected(tr) {
+  return tr.hasClass('context-menu-selection');
+}
+
+function contextMenuCheckSelectionBox(tr, checked) {
+  tr.find('input[type=checkbox]').attr('checked', checked);
+}
+
+function contextMenuClearDocumentSelection() {
+  // TODO
+  if (document.selection) {
+    document.selection.empty(); // IE
+  } else {
+    window.getSelection().removeAllRanges();
+  }
+}
+
+function contextMenuInit(url) {
+  contextMenuUrl = url;
+  contextMenuCreate();
+  contextMenuUnselectAll();
+  
+  if (!contextMenuObserving) {
+    $(document).click(contextMenuClick);
+    $(document).contextmenu(contextMenuRightClick);
+    contextMenuObserving = true;
+  }
+}
+
+function toggleIssuesSelection(el) {
+  var boxes = $(el).parents('form').find('input[type=checkbox]');
+  var all_checked = true;
+  boxes.each(function(){ if (!$(this).attr('checked')) { all_checked = false; } });
+  boxes.each(function(){
+    if (all_checked) {
+      $(this).removeAttr('checked');
+      $(this).parents('tr').removeClass('context-menu-selection');
+    } else if (!$(this).attr('checked')) {
+      $(this).attr('checked', true);
+      $(this).parents('tr').addClass('context-menu-selection');
+    }
+  });
+}
+
+function window_size() {
+  var w;
+  var h;
+  if (window.innerWidth) {
+    w = window.innerWidth;
+    h = window.innerHeight;
+  } else if (document.documentElement) {
+    w = document.documentElement.clientWidth;
+    h = document.documentElement.clientHeight;
+  } else {
+    w = document.body.clientWidth;
+    h = document.body.clientHeight;
+  }
+  return {width: w, height: h};
+}