Bug 463088 - Tab tear off cursor needs to be constant on Windows. r=enndeakin.

This commit is contained in:
Jim Mathies 2009-03-06 11:54:29 -06:00
parent b66ef2ce00
commit 492b851d97
7 changed files with 74 additions and 8 deletions

View File

@ -1924,6 +1924,9 @@
// the tab by dropping it on the desktop would result in an // the tab by dropping it on the desktop would result in an
// "internet shortcut" // "internet shortcut"
dt.mozSetDataAt("text/plain", spec, 0); dt.mozSetDataAt("text/plain", spec, 0);
// Set the cursor to an arrow during tab drags.
dt.mozCursor = "default";
var canvas = tabPreviews.capture(target, false); var canvas = tabPreviews.capture(target, false);
dt.setDragImage(canvas, 0, 0); dt.setDragImage(canvas, 0, 0);

View File

@ -76,7 +76,8 @@ nsDOMDataTransfer::nsDOMDataTransfer()
mIsExternal(PR_FALSE), mIsExternal(PR_FALSE),
mUserCancelled(PR_FALSE), mUserCancelled(PR_FALSE),
mDragImageX(0), mDragImageX(0),
mDragImageY(0) mDragImageY(0),
mCursorState(PR_FALSE)
{ {
} }
@ -297,6 +298,25 @@ nsDOMDataTransfer::GetMozItemCount(PRUint32* aCount)
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP
nsDOMDataTransfer::GetMozCursor(nsAString& aCursorState)
{
if (mCursorState)
aCursorState.AssignASCII("default");
else
aCursorState.AssignASCII("auto");
return NS_OK;
}
NS_IMETHODIMP
nsDOMDataTransfer::SetMozCursor(const nsAString& aCursorState)
{
// Lock the cursor to an arrow during the drag.
mCursorState = aCursorState.EqualsASCII("default");
return NS_OK;
}
NS_IMETHODIMP NS_IMETHODIMP
nsDOMDataTransfer::MozTypesAt(PRUint32 aIndex, nsIDOMDOMStringList** aTypes) nsDOMDataTransfer::MozTypesAt(PRUint32 aIndex, nsIDOMDOMStringList** aTypes)
{ {

View File

@ -167,6 +167,9 @@ protected:
PRUint32 mDropEffect; PRUint32 mDropEffect;
PRUint32 mEffectAllowed; PRUint32 mEffectAllowed;
// Indicates the behavior of the cursor during drag operations
PRPackedBool mCursorState;
// readonly data transfers may not be modified except the drop effect and // readonly data transfers may not be modified except the drop effect and
// effect allowed. // effect allowed.
PRPackedBool mReadOnly; PRPackedBool mReadOnly;

View File

@ -39,7 +39,7 @@
interface nsIVariant; interface nsIVariant;
[scriptable, uuid(B5947DD0-8E86-4B9C-AA65-C86303EFCF94)] [scriptable, uuid(E4970BA1-9567-455C-8B4E-4607D7E741BB)]
interface nsIDOMDataTransfer : nsISupports interface nsIDOMDataTransfer : nsISupports
{ {
/** /**
@ -180,6 +180,16 @@ interface nsIDOMNSDataTransfer : nsISupports
*/ */
readonly attribute unsigned long mozItemCount; readonly attribute unsigned long mozItemCount;
/**
* Sets the drag cursor state. Primarily used to control the cursor during
* tab drags, but could be expanded to other uses.
*
* Possible values:
* auto - use default system behavior.
* default - set the cursor to an arrow during the drag operation.
*/
attribute DOMString mozCursor;
/** /**
* Holds a list of the format types of the data that is stored for an item * Holds a list of the format types of the data that is stored for an item
* at the specified index. If the index is not in the range from 0 to * at the specified index. If the index is not in the range from 0 to

View File

@ -270,7 +270,7 @@ nsDragService::StartInvokingDragSession(IDataObject * aDataObj,
{ {
// To do the drag we need to create an object that // To do the drag we need to create an object that
// implements the IDataObject interface (for OLE) // implements the IDataObject interface (for OLE)
nsNativeDragSource* nativeDragSource = new nsNativeDragSource(); nsNativeDragSource* nativeDragSource = new nsNativeDragSource(mDataTransfer);
if (!nativeDragSource) if (!nativeDragSource)
return NS_ERROR_OUT_OF_MEMORY; return NS_ERROR_OUT_OF_MEMORY;

View File

@ -38,14 +38,17 @@
#include "nsNativeDragSource.h" #include "nsNativeDragSource.h"
#include <stdio.h> #include <stdio.h>
#include "nsISupportsImpl.h" #include "nsISupportsImpl.h"
#include "nsString.h"
/* /*
* class nsNativeDragSource * class nsNativeDragSource
*/ */
nsNativeDragSource::nsNativeDragSource() nsNativeDragSource::nsNativeDragSource(nsIDOMDataTransfer* aDataTransfer) :
: m_cRef(0), mUserCancelled(PR_FALSE) m_cRef(0),
mUserCancelled(PR_FALSE),
m_hCursor(nsnull)
{ {
mDataTransfer = do_QueryInterface(aDataTransfer);
} }
nsNativeDragSource::~nsNativeDragSource() nsNativeDragSource::~nsNativeDragSource()
@ -122,5 +125,23 @@ nsNativeDragSource::GiveFeedback(DWORD dwEffect)
#ifdef DEBUG #ifdef DEBUG
//printf("GiveFeedback\n"); //printf("GiveFeedback\n");
#endif #endif
// For drags involving tabs, we do some custom work with cursors.
if (mDataTransfer) {
nsAutoString cursor;
mDataTransfer->GetMozCursor(cursor);
if (cursor.EqualsASCII("default")) {
m_hCursor = ::LoadCursor(0, IDC_ARROW);
} else {
m_hCursor = nsnull;
}
}
if (m_hCursor) {
::SetCursor(m_hCursor);
return S_OK;
}
// Let the system choose which cursor to apply.
return ResultFromScode(DRAGDROP_S_USEDEFAULTCURSORS); return ResultFromScode(DRAGDROP_S_USEDEFAULTCURSORS);
} }

View File

@ -38,6 +38,8 @@
#define _nsNativeDragSource_h_ #define _nsNativeDragSource_h_
#include "nscore.h" #include "nscore.h"
#include "nsIDOMDataTransfer.h"
#include "nsCOMPtr.h"
#include <ole2.h> #include <ole2.h>
#include <oleidl.h> #include <oleidl.h>
@ -53,7 +55,7 @@ public:
// construct an nsNativeDragSource referencing adapter // construct an nsNativeDragSource referencing adapter
// nsNativeDragSource(nsIDragSource * adapter); // nsNativeDragSource(nsIDragSource * adapter);
nsNativeDragSource(); nsNativeDragSource(nsIDOMDataTransfer* aDataTransfer);
~nsNativeDragSource(); ~nsNativeDragSource();
// IUnknown methods - see iunknown.h for documentation // IUnknown methods - see iunknown.h for documentation
@ -78,7 +80,14 @@ public:
PRPackedBool UserCancelled() { return mUserCancelled; } PRPackedBool UserCancelled() { return mUserCancelled; }
protected: protected:
ULONG m_cRef; // reference count // Reference count
ULONG m_cRef;
// Data object, hold information about cursor state
nsCOMPtr<nsIDOMNSDataTransfer> mDataTransfer;
// Custom drag cursor
HCURSOR m_hCursor;
// true if the user cancelled the drag by pressing escape // true if the user cancelled the drag by pressing escape
PRPackedBool mUserCancelled; PRPackedBool mUserCancelled;