Chris@909: /* redMine - project management software Chris@909: Copyright (C) 2006-2008 Jean-Philippe Lang */ Chris@909: Chris@909: var observingContextMenuClick; Chris@909: Chris@909: ContextMenu = Class.create(); Chris@909: ContextMenu.prototype = { Chris@909: initialize: function (url) { Chris@909: this.url = url; Chris@909: this.createMenu(); Chris@909: Chris@909: if (!observingContextMenuClick) { Chris@909: Event.observe(document, 'click', this.Click.bindAsEventListener(this)); Chris@909: Event.observe(document, 'contextmenu', this.RightClick.bindAsEventListener(this)); Chris@909: observingContextMenuClick = true; Chris@909: } Chris@909: Chris@909: this.unselectAll(); Chris@909: this.lastSelected = null; Chris@909: }, Chris@909: Chris@909: RightClick: function(e) { Chris@909: this.hideMenu(); Chris@909: // do not show the context menu on links Chris@909: if (Event.element(e).tagName == 'A') { return; } Chris@909: var tr = Event.findElement(e, 'tr'); Chris@909: if (tr == document || tr == undefined || !tr.hasClassName('hascontextmenu')) { return; } Chris@909: Event.stop(e); Chris@909: if (!this.isSelected(tr)) { Chris@909: this.unselectAll(); Chris@909: this.addSelection(tr); Chris@909: this.lastSelected = tr; Chris@909: } Chris@909: this.showMenu(e); Chris@909: }, Chris@909: Chris@909: Click: function(e) { Chris@909: this.hideMenu(); Chris@909: if (Event.element(e).tagName == 'A' || Event.element(e).tagName == 'IMG') { return; } Chris@909: if (Event.isLeftClick(e) || (navigator.appVersion.match(/\bMSIE\b/))) { Chris@909: var tr = Event.findElement(e, 'tr'); Chris@909: if (tr!=null && tr!=document && tr.hasClassName('hascontextmenu')) { Chris@909: // a row was clicked, check if the click was on checkbox Chris@909: var box = Event.findElement(e, 'input'); Chris@909: if (box!=document && box!=undefined) { Chris@909: // a checkbox may be clicked Chris@909: if (box.checked) { Chris@909: tr.addClassName('context-menu-selection'); Chris@909: } else { Chris@909: tr.removeClassName('context-menu-selection'); Chris@909: } Chris@909: } else { Chris@909: if (e.ctrlKey || e.metaKey) { Chris@909: this.toggleSelection(tr); Chris@909: } else if (e.shiftKey) { Chris@909: if (this.lastSelected != null) { Chris@909: var toggling = false; Chris@909: var rows = $$('.hascontextmenu'); Chris@909: for (i=0; i window_width) { Chris@909: render_x -= menu_width; Chris@909: $('context-menu').addClassName('reverse-x'); Chris@909: } else { Chris@909: $('context-menu').removeClassName('reverse-x'); Chris@909: } Chris@909: if (max_height > window_height) { Chris@909: render_y -= menu_height; Chris@909: $('context-menu').addClassName('reverse-y'); Chris@909: } else { Chris@909: $('context-menu').removeClassName('reverse-y'); Chris@909: } Chris@909: if (render_x <= 0) render_x = 1; Chris@909: if (render_y <= 0) render_y = 1; Chris@909: $('context-menu').style['left'] = (render_x + 'px'); Chris@909: $('context-menu').style['top'] = (render_y + 'px'); Chris@909: Chris@909: Effect.Appear('context-menu', {duration: 0.20}); Chris@909: if (window.parseStylesheets) { window.parseStylesheets(); } // IE Chris@909: }}) Chris@909: }, Chris@909: Chris@909: hideMenu: function() { Chris@909: Element.hide('context-menu'); Chris@909: }, Chris@909: Chris@909: addSelection: function(tr) { Chris@909: tr.addClassName('context-menu-selection'); Chris@909: this.checkSelectionBox(tr, true); Chris@909: this.clearDocumentSelection(); Chris@909: }, Chris@909: Chris@909: toggleSelection: function(tr) { Chris@909: if (this.isSelected(tr)) { Chris@909: this.removeSelection(tr); Chris@909: } else { Chris@909: this.addSelection(tr); Chris@909: } Chris@909: }, Chris@909: Chris@909: removeSelection: function(tr) { Chris@909: tr.removeClassName('context-menu-selection'); Chris@909: this.checkSelectionBox(tr, false); Chris@909: }, Chris@909: Chris@909: unselectAll: function() { Chris@909: var rows = $$('.hascontextmenu'); Chris@909: for (i=0; i 0) { inputs[0].checked = checked; } Chris@909: }, Chris@909: Chris@909: isSelected: function(tr) { Chris@909: return Element.hasClassName(tr, 'context-menu-selection'); Chris@909: }, Chris@909: Chris@909: clearDocumentSelection: function() { Chris@909: if (document.selection) { Chris@909: document.selection.clear(); // IE Chris@909: } else { Chris@909: window.getSelection().removeAllRanges(); Chris@909: } Chris@909: } Chris@909: } Chris@909: Chris@909: function toggleIssuesSelection(el) { Chris@909: var boxes = el.getElementsBySelector('input[type=checkbox]'); Chris@909: var all_checked = true; Chris@909: for (i = 0; i < boxes.length; i++) { if (boxes[i].checked == false) { all_checked = false; } } Chris@909: for (i = 0; i < boxes.length; i++) { Chris@909: if (all_checked) { Chris@909: boxes[i].checked = false; Chris@909: boxes[i].up('tr').removeClassName('context-menu-selection'); Chris@909: } else if (boxes[i].checked == false) { Chris@909: boxes[i].checked = true; Chris@909: boxes[i].up('tr').addClassName('context-menu-selection'); Chris@909: } Chris@909: } Chris@909: } Chris@909: Chris@909: function window_size() { Chris@909: var w; Chris@909: var h; Chris@909: if (window.innerWidth) { Chris@909: w = window.innerWidth; Chris@909: h = window.innerHeight; Chris@909: } else if (document.documentElement) { Chris@909: w = document.documentElement.clientWidth; Chris@909: h = document.documentElement.clientHeight; Chris@909: } else { Chris@909: w = document.body.clientWidth; Chris@909: h = document.body.clientHeight; Chris@909: } Chris@909: return {width: w, height: h}; Chris@909: }