void LLDockControl::repositionDockable()
{
	if (!mDockWidget) return;
	LLRect dockRect = mDockWidget->calcScreenRect();
	LLRect rootRect;
	LLRect floater_rect = mDockableFloater->calcScreenRect();
	mGetAllowedRectCallback(rootRect);

	// recalculate dockable position if:
	if (mPrevDockRect != dockRect					//dock position   changed
		|| mDockWidgetVisible != isDockVisible()	//dock visibility changed
		|| mRootRect != rootRect					//root view rect  changed
		|| mFloaterRect != floater_rect				//floater rect    changed
		|| mRecalculateDockablePosition				//recalculation is forced
	)
	{
		// undock dockable and off() if dock not visible
		if (!isDockVisible())
		{
			mDockableFloater->setDocked(false);
			// force off() since dockable may not have dockControll at this time
			off();
			LLDockableFloater* dockable_floater =
					dynamic_cast<LLDockableFloater*> (mDockableFloater);
			if(dockable_floater != NULL)
			{
				dockable_floater->onDockHidden();
			}
		}
		else
		{
			if(mEnabled)
			{
				moveDockable();
			}
			LLDockableFloater* dockable_floater =
					dynamic_cast<LLDockableFloater*> (mDockableFloater);
			if(dockable_floater != NULL)
			{
				dockable_floater->onDockShown();
			}
		}

		mPrevDockRect = dockRect;
		mRootRect = rootRect;
		mFloaterRect = floater_rect;
		mRecalculateDockablePosition = false;
		mDockWidgetVisible = isDockVisible();
	}
}
void LLDockControl::on()
{
	 if (isDockVisible())
	{
		mEnabled = true;
		mRecalculateDockablePosition = true;
	}
}
void LLDockControl::setDock(LLView* dockWidget)
{
	mDockWidget = dockWidget;
	if (mDockWidget != NULL)
	{
		repositionDockable();
		mDockWidgetVisible = isDockVisible();
	}
	else
	{
		mDockWidgetVisible = false;
	}
}
void LLDockControl::setDock(LLView* dockWidget)
{
	if (dockWidget != NULL)
	{
		mDockWidgetHandle = dockWidget->getHandle();
		repositionDockable();
		mDockWidgetVisible = isDockVisible();
	}
	else
	{
		mDockWidgetHandle = LLHandle<LLView>();
		mDockWidgetVisible = false;
	}
}
LLDockControl::LLDockControl(LLView* dockWidget, LLFloater* dockableFloater,
		const LLUIImagePtr& dockTongue, DocAt dockAt, get_allowed_rect_callback_t get_allowed_rect_callback) :
		mDockableFloater(dockableFloater),
		mDockTongue(dockTongue),
		mDockTongueX(0),
		mDockTongueY(0)
{
	mDockAt = dockAt;

	if (dockWidget != NULL)
	{
		mDockWidgetHandle = dockWidget->getHandle();
	}

	if (dockableFloater->isDocked())
	{
		on();
	}
	else
	{
		off();
	}

	if (!(get_allowed_rect_callback))
	{
		mGetAllowedRectCallback = boost::bind(&LLDockControl::getAllowedRect, this, _1);
	}
	else
	{
		mGetAllowedRectCallback = get_allowed_rect_callback;
	}

	if (dockWidget != NULL) 
	{
		repositionDockable();
	}

	if (getDock() != NULL)
	{
		mDockWidgetVisible = isDockVisible();
	}
	else
	{
		mDockWidgetVisible = false;
	}
}