@Override
	public void mouseDragged(MouseEvent e) {
		if (this.grabbing) {
			Rectangle r = this.getRegionBounds();
			int flags = 0;
			double pre = this.position;

			int left = e.getX() + this.grabOffset;
			this.position = left / (double) (r.width - this.grabSize) * (this.valueRange[1] - this.valueRange[0]);
			if (this.position < this.valueRange[0]) this.position = this.valueRange[0];
			else if (this.position > this.valueRange[1]) this.position = this.valueRange[1];

			if (e.isShiftDown() && this.position > this.valueRange[0] && this.position < this.valueRange[1]) {
				this.position = Math.round(this.position / this.snap) * this.snap;
			}

			if (this.position != pre) {
				flags |= ChangeEvent.CHANGED;
				this.dragFlags |= flags;
			}

			this.signalChange(ChangeEvent.DRAGGING | flags);

			this.repaint();
		}
	}