public void mouseDragged(MouseEvent e) {
		if (SwingUtilities.isLeftMouseButton(e)) {
			if (!pickedUp) {
				throw new RuntimeException("dragging without prior pickup?");
			}

			Point pp = SwingUtilities.convertPoint(this, e.getPoint(),
					workspace.getMiniMap());
			if (workspace.getMiniMap().contains(pp)) {
				workspace.getMiniMap().blockDragged(this, e.getPoint());
				lastDragWidget = workspace.getMiniMap();
				return;
			}

			// drag this block if appropriate (checks bounds first)
			dragHandler.mouseDragged(e);

			// Find the widget under the mouse
			dragHandler.myLoc.move(getX() + dragHandler.mPressedX, getY()
					+ dragHandler.mPressedY);
			Point p = SwingUtilities.convertPoint(this.getParent(),
					dragHandler.myLoc, workspace);
			WorkspaceWidget widget = workspace.getWidgetAt(p);
			if (widget == null) {
				// not on a workspace widget, cancel dragging
				return;
			}

			// if this is the first call to mouseDragged
			if (!dragging) {
				Block block = getBlock();
				BlockConnector plug = BlockLinkChecker.getPlugEquivalent(block);
				if (plug != null && plug.hasBlock()) {
					Block parent = workspace.getEnv().getBlock(
							plug.getBlockID());
					BlockConnector socket = parent.getConnectorTo(blockID);
					BlockLink link = BlockLink.getBlockLink(workspace, block,
							parent, plug, socket);
					link.disconnect();
					// socket is removed internally from block's socket list if
					// socket is expandable
					workspace.getEnv().getRenderableBlock(parent.getBlockID())
							.blockDisconnected(socket);

					// NOTIFY WORKSPACE LISTENERS OF DISCONNECTION
					workspace.notifyListeners(new WorkspaceEvent(workspace,
							widget, link, WorkspaceEvent.BLOCKS_DISCONNECTED));
				}
				startDragging(this, widget);
			}

			// drag this block and all attached to it
			drag(this, dragHandler.dragDX, dragHandler.dragDY, widget, true);

			workspace.getMiniMap().repaint();
		}
	}