context-menu.js

118 lines | 3.291 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();
});