| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 | 
							- 'use strict';
 
- module.exports = function(Chart) {
 
- 	var globalOpts = Chart.defaults.global;
 
- 	globalOpts.elements.rectangle = {
 
- 		backgroundColor: globalOpts.defaultColor,
 
- 		borderWidth: 0,
 
- 		borderColor: globalOpts.defaultColor,
 
- 		borderSkipped: 'bottom'
 
- 	};
 
- 	function isVertical(bar) {
 
- 		return bar._view.width !== undefined;
 
- 	}
 
- 	/**
 
- 	 * Helper function to get the bounds of the bar regardless of the orientation
 
- 	 * @private
 
- 	 * @param bar {Chart.Element.Rectangle} the bar
 
- 	 * @return {Bounds} bounds of the bar
 
- 	 */
 
- 	function getBarBounds(bar) {
 
- 		var vm = bar._view;
 
- 		var x1, x2, y1, y2;
 
- 		if (isVertical(bar)) {
 
- 			// vertical
 
- 			var halfWidth = vm.width / 2;
 
- 			x1 = vm.x - halfWidth;
 
- 			x2 = vm.x + halfWidth;
 
- 			y1 = Math.min(vm.y, vm.base);
 
- 			y2 = Math.max(vm.y, vm.base);
 
- 		} else {
 
- 			// horizontal bar
 
- 			var halfHeight = vm.height / 2;
 
- 			x1 = Math.min(vm.x, vm.base);
 
- 			x2 = Math.max(vm.x, vm.base);
 
- 			y1 = vm.y - halfHeight;
 
- 			y2 = vm.y + halfHeight;
 
- 		}
 
- 		return {
 
- 			left: x1,
 
- 			top: y1,
 
- 			right: x2,
 
- 			bottom: y2
 
- 		};
 
- 	}
 
- 	Chart.elements.Rectangle = Chart.Element.extend({
 
- 		draw: function() {
 
- 			var ctx = this._chart.ctx;
 
- 			var vm = this._view;
 
- 			var halfWidth = vm.width / 2,
 
- 				leftX = vm.x - halfWidth,
 
- 				rightX = vm.x + halfWidth,
 
- 				top = vm.base - (vm.base - vm.y),
 
- 				halfStroke = vm.borderWidth / 2;
 
- 			// Canvas doesn't allow us to stroke inside the width so we can
 
- 			// adjust the sizes to fit if we're setting a stroke on the line
 
- 			if (vm.borderWidth) {
 
- 				leftX += halfStroke;
 
- 				rightX -= halfStroke;
 
- 				top += halfStroke;
 
- 			}
 
- 			ctx.beginPath();
 
- 			ctx.fillStyle = vm.backgroundColor;
 
- 			ctx.strokeStyle = vm.borderColor;
 
- 			ctx.lineWidth = vm.borderWidth;
 
- 			// Corner points, from bottom-left to bottom-right clockwise
 
- 			// | 1 2 |
 
- 			// | 0 3 |
 
- 			var corners = [
 
- 				[leftX, vm.base],
 
- 				[leftX, top],
 
- 				[rightX, top],
 
- 				[rightX, vm.base]
 
- 			];
 
- 			// Find first (starting) corner with fallback to 'bottom'
 
- 			var borders = ['bottom', 'left', 'top', 'right'];
 
- 			var startCorner = borders.indexOf(vm.borderSkipped, 0);
 
- 			if (startCorner === -1) {
 
- 				startCorner = 0;
 
- 			}
 
- 			function cornerAt(index) {
 
- 				return corners[(startCorner + index) % 4];
 
- 			}
 
- 			// Draw rectangle from 'startCorner'
 
- 			var corner = cornerAt(0);
 
- 			ctx.moveTo(corner[0], corner[1]);
 
- 			for (var i = 1; i < 4; i++) {
 
- 				corner = cornerAt(i);
 
- 				ctx.lineTo(corner[0], corner[1]);
 
- 			}
 
- 			ctx.fill();
 
- 			if (vm.borderWidth) {
 
- 				ctx.stroke();
 
- 			}
 
- 		},
 
- 		height: function() {
 
- 			var vm = this._view;
 
- 			return vm.base - vm.y;
 
- 		},
 
- 		inRange: function(mouseX, mouseY) {
 
- 			var inRange = false;
 
- 			if (this._view) {
 
- 				var bounds = getBarBounds(this);
 
- 				inRange = mouseX >= bounds.left && mouseX <= bounds.right && mouseY >= bounds.top && mouseY <= bounds.bottom;
 
- 			}
 
- 			return inRange;
 
- 		},
 
- 		inLabelRange: function(mouseX, mouseY) {
 
- 			var me = this;
 
- 			if (!me._view) {
 
- 				return false;
 
- 			}
 
- 			var inRange = false;
 
- 			var bounds = getBarBounds(me);
 
- 			if (isVertical(me)) {
 
- 				inRange = mouseX >= bounds.left && mouseX <= bounds.right;
 
- 			} else {
 
- 				inRange = mouseY >= bounds.top && mouseY <= bounds.bottom;
 
- 			}
 
- 			return inRange;
 
- 		},
 
- 		inXRange: function(mouseX) {
 
- 			var bounds = getBarBounds(this);
 
- 			return mouseX >= bounds.left && mouseX <= bounds.right;
 
- 		},
 
- 		inYRange: function(mouseY) {
 
- 			var bounds = getBarBounds(this);
 
- 			return mouseY >= bounds.top && mouseY <= bounds.bottom;
 
- 		},
 
- 		getCenterPoint: function() {
 
- 			var vm = this._view;
 
- 			var x, y;
 
- 			if (isVertical(this)) {
 
- 				x = vm.x;
 
- 				y = (vm.y + vm.base) / 2;
 
- 			} else {
 
- 				x = (vm.x + vm.base) / 2;
 
- 				y = vm.y;
 
- 			}
 
- 			return {x: x, y: y};
 
- 		},
 
- 		getArea: function() {
 
- 			var vm = this._view;
 
- 			return vm.width * Math.abs(vm.y - vm.base);
 
- 		},
 
- 		tooltipPosition: function() {
 
- 			var vm = this._view;
 
- 			return {
 
- 				x: vm.x,
 
- 				y: vm.y
 
- 			};
 
- 		}
 
- 	});
 
- };
 
 
  |