context-menu.js

118 lines | 3.267 kB Blame History Raw Download
/*
 * Copyright 2012 LinkedIn Corp.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

$.namespace('azkaban');

azkaban.ContextMenuView = Backbone.View.extend({
	events: {
	},
	
  initialize: function(settings) {
		var div = this.el;
		$('body').click(function(e) {
			$(".contextMenu").remove();
		});
		$('body').bind("contextmenu", function(e) {$(".contextMenu").remove()});
	},
	
  show: function(evt, menu) {
		console.log("Show context menu");
		$(".contextMenu").remove();
		var x = evt.pageX;
		var y = evt.pageY;

		var contextMenu = this.setupMenu(menu);
		$(contextMenu).css({top: y, left: x});
		$(this.el).after(contextMenu);
	},
	
  hide: function(evt) {
		console.log("Hide context menu");
		$(".contextMenu").remove();
	},
	
  handleClick: function(evt) {
		console.log("handling click");
	},
	
  setupMenu: function(menu) {
		var contextMenu = document.createElement("div");
		$(contextMenu).addClass("contextMenu");
		var ul = document.createElement("ul");
		$(contextMenu).append(ul);

		for (var i = 0; i < menu.length; ++i) {
			var menuItem = document.createElement("li");
			if (menu[i].break) {
				$(menuItem).addClass("break");
			  $(ul).append(menuItem);
        continue;
			}
      var title = menu[i].title;
      var callback = menu[i].callback;
      $(menuItem).addClass("menuitem");
      $(menuItem).text(title);
      menuItem.callback = callback;
      $(menuItem).click(function() { 
        $(contextMenu).hide(); 
        this.callback.call();
      });
        
      if (menu[i].submenu) {
        var expandSymbol = document.createElement("div");
        $(expandSymbol).addClass("expandSymbol");
        $(menuItem).append(expandSymbol);
        
        var subMenu = this.setupMenu(menu[i].submenu);
        $(subMenu).addClass("subMenu");
        subMenu.parent = contextMenu;
        menuItem.subMenu = subMenu;
        $(subMenu).hide();
        $(this.el).after(subMenu);
        
        $(menuItem).mouseenter(function() {
          $(".subMenu").hide();
          var menuItem = this;
          menuItem.selected = true;
          setTimeout(function() {
            if (menuItem.selected) {
              var offset = $(menuItem).offset();
              var left = offset.left;
              var top = offset.top;
              var width = $(menuItem).width();
              var subMenu = menuItem.subMenu;
              
              var newLeft = left + width - 5;
              $(subMenu).css({left: newLeft, top: top});
              $(subMenu).show();
            }
          }, 500);
        });
        $(menuItem).mouseleave(function() {this.selected = false;});
      }
			$(ul).append(menuItem);
		}

		return contextMenu;
	}
});

var contextMenuView;
$(function() {
	contextMenuView = new azkaban.ContextMenuView({el:$('#contextMenu')});
	contextMenuView.hide();
});