ui.selectable.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. (function($)
  2. {
  3. //Make nodes selectable by expression
  4. $.extend($.expr[':'], { selectable: "(' '+a.className+' ').indexOf(' ui-selectable ')" });
  5. $.extend($.expr[':'], { selectee: "(' '+a.className+' ').indexOf(' ui-selectee ')" });
  6. $.fn.selectable = function(o) {
  7. return this.each(function() {
  8. if (!$(this).is(".ui-selectable")) new $.ui.selectable(this, o);
  9. });
  10. }
  11. $.ui.selectable = function(el, o) {
  12. var options = {
  13. filter: '*'
  14. };
  15. var o = o || {}; $.extend(options, o); //Extend and copy options
  16. this.element = el; var self = this; //Do bindings
  17. self.dragged = false;
  18. $.extend(options, {
  19. helper: function() { return $(document.createElement('div')).css({border:'1px dotted black'}); },
  20. _start: function(h,p,c,t,e) {
  21. self.start.apply(t, [self, e]); // Trigger the start callback
  22. },
  23. _drag: function(h,p,c,t,e) {
  24. self.dragged = true;
  25. self.drag.apply(t, [self, e]); // Trigger the drag callback
  26. },
  27. _stop: function(h,p,c,t,e) {
  28. self.stop.apply(t, [self, e]); // Trigger the end callback
  29. self.dragged = false;
  30. }
  31. });
  32. //Initialize mouse interaction
  33. this.mouse = new $.ui.mouseInteraction(el, options);
  34. //Add the class for themeing
  35. $(this.element).addClass("ui-selectable");
  36. $(this.element).children(options.filter).addClass("ui-selectee");
  37. }
  38. $.extend($.ui.selectable.prototype, {
  39. plugins: {},
  40. start: function(self, ev) {
  41. $(self.mouse.helper).css({'z-index': 100, position: 'absolute', left: ev.clientX, top: ev.clientY, width:0, height: 0});
  42. if (ev.ctrlKey) {
  43. if ($(ev.target).is('.ui-selected')) {
  44. $(ev.target).removeClass('ui-selected').addClass('ui-unselecting');
  45. $(self.element).triggerHandler("selectableunselecting", [ev, {
  46. selectable: self.element,
  47. unselecting: ev.target,
  48. options: this.options
  49. }], this.options.unselecting);
  50. }
  51. } else {
  52. self.unselecting(self, ev, this.options);
  53. self.selectingTarget(self, ev, this.options);
  54. }
  55. },
  56. drag: function(self, ev) {
  57. var x1 = self.mouse.opos[0], y1 = self.mouse.opos[1], x2 = ev.pageX, y2 = ev.pageY;
  58. if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
  59. if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
  60. $(self.mouse.helper).css({left: x1, top: y1, width: x2-x1, height: y2-y1});
  61. self.selectingTarget(self, ev, this.options);
  62. },
  63. stop: function(self, ev) {
  64. var options = this.options;
  65. $('.ui-selecting', self.element).each(function() {
  66. $(this).removeClass('ui-selecting').addClass('ui-selected');
  67. $(self.element).triggerHandler("selectableselected", [ev, {
  68. selectable: self.element,
  69. selected: this,
  70. options: options
  71. }], options.selected);
  72. });
  73. $('.ui-unselecting', self.element).each(function() {
  74. $(this).removeClass('ui-unselecting');
  75. $(self.element).triggerHandler("selectableunselected", [ev, {
  76. selectable: self.element,
  77. unselected: this,
  78. options: options
  79. }], options.unselected);
  80. });
  81. },
  82. unselecting: function(self, ev, options) {
  83. $('.ui-selected', self.element).each(function() {
  84. if (this != ev.target) {
  85. $(this).removeClass('ui-selected').addClass('ui-unselecting');
  86. $(self.element).triggerHandler("selectableunselecting", [ev, {
  87. selectable: self.element,
  88. unselecting: this,
  89. options: options
  90. }], options.unselecting);
  91. }
  92. });
  93. },
  94. selectingTarget: function(self, ev, options) {
  95. var target = $(ev.target);
  96. if (target.is('.ui-selectee:not(.ui-selecting)')) {
  97. target.removeClass('ui-selected').removeClass('ui-unselecting').addClass('ui-selecting');
  98. $(self.element).triggerHandler("selectableselecting", [ev, {
  99. selectable: self.element,
  100. selecting: ev.target,
  101. options: options
  102. }], options.selecting);
  103. }
  104. }
  105. });
  106. })(jQuery);