summaryrefslogtreecommitdiffstats
path: root/public/javascripts/context_menu.js
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2008-04-03 16:38:06 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2008-04-03 16:38:06 +0000
commitf6ce427a00650e92f414dc3682e56348d549d7ea (patch)
tree0f8b0d51ae74c4071a01e4d8ed31d9d363d80806 /public/javascripts/context_menu.js
parent7f0aa5611948ebed0c1eaf4c3218762fb50e199e (diff)
downloadredmine-f6ce427a00650e92f414dc3682e56348d549d7ea.tar.gz
redmine-f6ce427a00650e92f414dc3682e56348d549d7ea.zip
Display the context menu above and/or to the left of the click if needed (patch by Mike Duchene, closes #960).
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1323 e93f8b46-1217-0410-a6f0-8f06a7374b81
Diffstat (limited to 'public/javascripts/context_menu.js')
-rw-r--r--public/javascripts/context_menu.js65
1 files changed, 61 insertions, 4 deletions
diff --git a/public/javascripts/context_menu.js b/public/javascripts/context_menu.js
index e3f128d89..3e2d571fa 100644
--- a/public/javascripts/context_menu.js
+++ b/public/javascripts/context_menu.js
@@ -93,14 +93,55 @@ ContextMenu.prototype = {
},
showMenu: function(e) {
- $('context-menu').style['left'] = (Event.pointerX(e) + 'px');
- $('context-menu').style['top'] = (Event.pointerY(e) + 'px');
- Element.update('context-menu', '');
- new Ajax.Updater({success:'context-menu'}, this.url,
+ var mouse_x = Event.pointerX(e);
+ var mouse_y = Event.pointerY(e);
+ 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').style['left'] = (render_x + 'px');
+ $('context-menu').style['top'] = (render_y + 'px');
+ Element.update('context-menu', '');
+
+ new Ajax.Updater({success:'context-menu'}, this.url,
{asynchronous:true,
evalScripts:true,
parameters:Form.serialize(Event.findElement(e, 'form')),
onComplete:function(request){
+ dims = $('context-menu').getDimensions();
+ menu_width = dims.width;
+ menu_height = dims.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').addClassName('reverse-x');
+ } else {
+ $('context-menu').removeClassName('reverse-x');
+ }
+ if (max_height > window_height) {
+ render_y -= menu_height;
+ $('context-menu').addClassName('reverse-y');
+ } else {
+ $('context-menu').removeClassName('reverse-y');
+ }
+ if (render_x <= 0) render_x = 1;
+ if (render_y <= 0) render_y = 1;
+ $('context-menu').style['left'] = (render_x + 'px');
+ $('context-menu').style['top'] = (render_y + 'px');
+
Effect.Appear('context-menu', {duration: 0.20});
if (window.parseStylesheets) { window.parseStylesheets(); } // IE
}})
@@ -159,3 +200,19 @@ function toggleIssuesSelection(el) {
}
}
}
+
+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};
+}