b=497498 move drag event dispatch logic from nsWindow to nsDragService r=roc

--HG--
extra : rebase_source : ec52cbad0d1efff13c989e8b5061f7fc3445b92b
This commit is contained in:
Karl Tomlinson 2012-04-19 18:18:31 +12:00
Родитель c42f5a3887
Коммит 657ea8347a
4 изменённых файлов: 44 добавлений и 71 удалений

Просмотреть файл

@ -1829,7 +1829,18 @@ gboolean
nsDragService::RunScheduledTask()
{
if (mTargetWindow && mTargetWindow != mPendingWindow) {
mTargetWindow->OnDragLeave();
PR_LOG(sDragLm, PR_LOG_DEBUG,
("nsDragService: dispatch drag leave (%p)\n",
mTargetWindow.get()));
mTargetWindow->
DispatchDragEvent(NS_DRAGDROP_EXIT, mTargetWindowPoint, 0);
if (!mSourceNode) {
// The drag that was initiated in a different app. End the drag
// session, since we're done with it for now (until the user drags
// back into this app).
EndDragSession(false);
}
}
// It is possible that the pending state has been updated during dispatch
@ -1889,8 +1900,7 @@ nsDragService::RunScheduledTask()
// protocol is used.
if (task == eDragTaskMotion || positionHasChanged) {
nsWindow::UpdateDragStatus(mTargetDragContext, this);
mTargetWindow->
DispatchDragMotionEvents(this, mTargetWindowPoint, mTargetTime);
DispatchMotionEvents();
if (task == eDragTaskMotion) {
// Reply to tell the source whether we can drop and what
@ -1900,8 +1910,7 @@ nsDragService::RunScheduledTask()
}
if (task == eDragTaskDrop) {
gboolean success = mTargetWindow->
DispatchDragDropEvent(this, mTargetWindowPoint, mTargetTime);
gboolean success = DispatchDropEvent();
// Perhaps we should set the del parameter to TRUE when the drag
// action is move, but we don't know whether the data was successfully
@ -1932,3 +1941,31 @@ nsDragService::RunScheduledTask()
mTaskSource = 0;
return FALSE;
}
void
nsDragService::DispatchMotionEvents()
{
mCanDrop = false;
FireDragEventAtSource(NS_DRAGDROP_DRAG);
mTargetWindow->
DispatchDragEvent(NS_DRAGDROP_OVER, mTargetWindowPoint, mTargetTime);
}
// Returns true if the drop was successful
gboolean
nsDragService::DispatchDropEvent()
{
// We need to check IsDestroyed here because the nsRefPtr
// only protects this from being deleted, it does NOT protect
// against nsView::~nsView() calling Destroy() on it, bug 378273.
if (mTargetWindow->IsDestroyed())
return FALSE;
PRUint32 msg = mCanDrop ? NS_DRAGDROP_DROP : NS_DRAGDROP_EXIT;
mTargetWindow->DispatchDragEvent(msg, mTargetWindowPoint, mTargetTime);
return mCanDrop;
}

Просмотреть файл

@ -244,6 +244,8 @@ private:
// Callback for g_idle_add_full() to run mScheduledTask.
static gboolean TaskDispatchCallback(gpointer data);
gboolean RunScheduledTask();
void DispatchMotionEvents();
gboolean DispatchDropEvent();
};
#endif // nsDragService_h__

Просмотреть файл

@ -3303,37 +3303,6 @@ nsWindow::ThemeChanged()
}
}
void
nsWindow::DispatchDragMotionEvents(nsDragService *aDragService,
const nsIntPoint& aWindowPoint, guint aTime)
{
aDragService->SetCanDrop(false);
aDragService->FireDragEventAtSource(NS_DRAGDROP_DRAG);
DispatchDragEvent(NS_DRAGDROP_OVER, aWindowPoint, aTime);
}
// Returns true if the drop was successful
gboolean
nsWindow::DispatchDragDropEvent(nsDragService *aDragService,
const nsIntPoint& aWindowPoint, guint aTime)
{
// We need to check mIsDestroyed here because the nsRefPtr
// only protects this from being deleted, it does NOT protect
// against nsView::~nsView() calling Destroy() on it, bug 378670.
if (mIsDestroyed)
return FALSE;
bool canDrop;
aDragService->GetCanDrop(&canDrop);
PRUint32 msg = canDrop ? NS_DRAGDROP_DROP : NS_DRAGDROP_EXIT;
DispatchDragEvent(msg, aWindowPoint, aTime);
return canDrop;
}
void
nsWindow::DispatchDragEvent(PRUint32 aMsg, const nsIntPoint& aRefPoint,
guint aTime)
@ -3371,34 +3340,6 @@ nsWindow::OnDragDataReceivedEvent(GtkWidget *aWidget,
aSelectionData, aInfo, aTime);
}
void
nsWindow::OnDragLeave(void)
{
LOGDRAG(("nsWindow::OnDragLeave(%p)\n", (void*)this));
DispatchDragEvent(NS_DRAGDROP_EXIT, nsIntPoint(0, 0), 0);
nsCOMPtr<nsIDragService> dragService = do_GetService(kCDragServiceCID);
if (dragService) {
nsCOMPtr<nsIDragSession> currentDragSession;
dragService->GetCurrentSession(getter_AddRefs(currentDragSession));
if (currentDragSession) {
nsCOMPtr<nsIDOMNode> sourceNode;
currentDragSession->GetSourceNode(getter_AddRefs(sourceNode));
if (!sourceNode) {
// We're leaving a window while doing a drag that was
// initiated in a different app. End the drag session,
// since we're done with it for now (until the user
// drags back into mozilla).
dragService->EndDragSession(false);
}
}
}
}
static void
GetBrandName(nsXPIDLString& brandName)
{

Просмотреть файл

@ -245,7 +245,6 @@ public:
guint aInfo,
guint aTime,
gpointer aData);
void OnDragLeave(void);
private:
void NativeResize(PRInt32 aWidth,
@ -300,12 +299,6 @@ public:
void DispatchDragEvent(PRUint32 aMsg,
const nsIntPoint& aRefPoint,
guint aTime);
void DispatchDragMotionEvents(nsDragService *aDragService,
const nsIntPoint& aPoint,
guint aTime);
gboolean DispatchDragDropEvent(nsDragService *aDragService,
const nsIntPoint& aWindowPoint,
guint aTime);
static void UpdateDragStatus (GdkDragContext *aDragContext,
nsIDragService *aDragService);
// If this dispatched the keydown event actually, this returns TRUE,