*             if the dockable already belongs to the desktop containment
	 *             hierarchy.
	 */
	public void addDockable(Dockable dockable, RelativeDockablePosition position) {
		/*
		 * addDockable isn't called internally by the API : just for user
		 * applications
		 */
		if (this.isAncestorOf(dockable.getComponent())) {
			throw new IllegalArgumentException(
					"Dockable is already contained in the desktop");
		}

		registerDockable(dockable);

		if (DockingUtilities.findSingleDockableContainer(dockable) != null) {
			remove(dockable);
		}

		DockableState newState = new DockableState(this, dockable,
				DockableState.Location.DOCKED, position);

		DockableState currentState = getDockableState(dockable);
		DockableState.Location currentLocation = getLocation(currentState);

		DockableStateWillChangeEvent dswe = new DockableStateWillChangeEvent(
				currentState, newState);
		DockingActionEvent dae = new DockingActionAddDockableEvent(this,
				dockable, currentLocation, newState.getLocation(), dockingPanel);
		if (isDockingActionAccepted(dae, dswe)) {
			@SuppressWarnings("deprecation")
			SingleDockableContainer sdc = RelativeDockingUtilities
					.insertDockable(dockingPanel, dockable, position);
			sdc.installDocking(this);

			context.setDockableState(dockable, newState);
			dockable.getDockKey().setLocation(DockableState.Location.DOCKED);

			DockableStateChangeEvent dse = new DockableStateChangeEvent(
					currentState, newState);
			fireDockingAction(dae, dse);

			DockingUtilities.updateResizeWeights(dockingPanel);
		}
	}