@Override
	public synchronized void mouseMoved(MouseEvent e) {
		Point mousePoint = e.getPoint();
		// Test all objects to see if the mouse position is within the bounds of
		// the eventable object. If it is, add their event to the
		// waitingEventsMouseOver list. We must also add it to the list of
		// currentMouseOver, so that we can fire the mouse out events when the
		// mouse is outside of the dimensions of the eventable object
		synchronized (registeredListeningObjects) {
			for (IMouseEventable eventable : registeredListeningObjects) {
				// If the mouse is within the dimensions of the object, and if
				// the
				// object hasn't already received its mouse over event before.
				// And isEventsDisabled is called to make sure that it actually
				// wants to recieve the events still
				if (eventable.getDimensions().contains(mousePoint)
						&& !currentMouseOver.contains(eventable)
						&& !eventable.isEventsDisabled()) {
					synchronized (waitingEventLists) {
						waitingEventLists.get(MouseEventType.MOUSE_OVER).add(eventable);
					}
					synchronized (currentMouseOver) {
						currentMouseOver.add(eventable);
					}
				}
			}
		}

		synchronized (currentMouseOver) {
			for (IMouseEventable eventable : currentMouseOver) {
				if (!eventable.getDimensions().contains(mousePoint)) {
					synchronized (waitingEventLists) {
						waitingEventLists.get(MouseEventType.MOUSE_OUT).add(eventable);
					}
					synchronized (currentMouseOver) {
						currentMouseOver.remove(eventable);
					}
				}
			}
		}

		// Update the latest position of the mouse moved x,y
		mousePosX = e.getX();
		mousePosY = e.getY();
	}