summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Dziedzic <tdziedz2@illinois.edu>2010-09-22 21:40:32 +0200
committerCédric Bosdonnat <cedricbosdo@openoffice.org>2010-09-22 21:41:33 +0200
commitccc534c27bc51526a291e21797ac337a7a695346 (patch)
treeeaea441c6f993bcea8f47096e15964c517b6c84f
parentd6b73c9d63b02142b9d48d9fed1573912ee3705e (diff)
Pushed Thomas' patch AS IS
-rw-r--r--patches/dev300/sc-single-right.diff603
1 files changed, 603 insertions, 0 deletions
diff --git a/patches/dev300/sc-single-right.diff b/patches/dev300/sc-single-right.diff
new file mode 100644
index 000000000..51f54e4b3
--- /dev/null
+++ b/patches/dev300/sc-single-right.diff
@@ -0,0 +1,603 @@
+--- sc/source/ui/view/gridwin.cxx.orig2 2010-08-10 11:27:53.922000033 -0500
++++ sc/source/ui/view/gridwin.cxx 2010-08-15 22:09:59.868000093 -0500
+@@ -123,6 +123,8 @@
+ #include "cellsh.hxx"
+ #include "overlayobject.hxx"
+
++#include "popmenu.hxx"
++
+ #include "drawview.hxx"
+ #include <svx/sdrpagewindow.hxx>
+ #include <svx/sdr/overlay/overlaymanager.hxx>
+@@ -449,7 +451,8 @@
+ nPaintCount( 0 ),
+ bNeedsRepaint( FALSE ),
+ bAutoMarkVisible( FALSE ),
+- bListValButton( FALSE )
++ bListValButton( FALSE ),
++ bMoveSingle( false )
+ {
+ switch(eWhich)
+ {
+@@ -1512,6 +1515,29 @@
+
+ aCurMousePos = rMEvt.GetPosPixel();
+
++ std::vector<Rectangle> aPixelRects;
++ GetSelectionRects( aPixelRects );
++
++ // is there a better way to test if the selected rectangle is only 1 cell
++ BOOL test;
++ std::vector<Rectangle>::iterator it = aPixelRects.begin();
++ if( aPixelRects.size() )
++ test = it->Top() == it->Bottom() && it->Left() == it->Right();
++
++ ScRange aRange;
++ ScMarkType eMarkType = pViewData->GetSimpleArea( aRange );
++
++ if( bMoveSingle && /*rMEvt.IsLeft() &&*/ ( ( eMarkType != SC_MARK_MULTI && test ) || !pViewData->GetMarkData().IsMarked() ) )
++ {
++ //bMoveSingle = false;
++
++ SCCOL nCol = pViewData->GetCurX();
++ SCROW nRow = pViewData->GetCurY();
++ SCTAB nTab = pViewData->GetTabNo();
++
++ pViewData->GetView()->MarkCursor( nCol, nRow, nTab );
++ }
++
+ // Filter-Popup beendet sich mit eigenem Mausklick, nicht erst beim Klick
+ // in das GridWindow, darum ist die folgende Abfrage nicht mehr noetig:
+ #if 0
+@@ -1783,7 +1809,7 @@
+ // Gridwin - SelectionEngine
+ //
+
+- if ( rMEvt.IsLeft() )
++ if ( rMEvt.IsLeft() || ( rMEvt.IsRight() && bMoveSingle ) )
+ {
+ ScViewSelectionEngine* pSelEng = pViewData->GetView()->GetSelEngine();
+ pSelEng->SetWindow(this);
+@@ -2257,6 +2283,8 @@
+
+ void __EXPORT ScGridWindow::MouseMove( const MouseEvent& rMEvt )
+ {
++ bMoveSingle = false;
++
+ aCurMousePos = rMEvt.GetPosPixel();
+
+ if ( rMEvt.IsLeaveWindow() && pNoteMarker && !pNoteMarker->IsByKeyboard() )
+@@ -2446,14 +2474,48 @@
+ {
+ BOOL bAlt = rMEvt.IsMod2();
+
++ //ScMarkData& rMark = pViewData->GetMarkData();
++ //EditView* pEditView = pViewData->GetEditView( eWhich );
++ //Cursor* pCur = pEditView->GetCursor();
++ //SCTAB nTab = pViewData->GetTabNo();
++ SCCOL nX = pViewData->GetCurX();
++ SCROW nY = pViewData->GetCurY();
++ Point aScrPos = pViewData->GetScrPos( nX, nY, eWhich, TRUE );
++
++ long nSizeXPix;
++ long nSizeYPix;
++
++ // get dimensions of cursor
++ pViewData->GetMergeSizePixel( nX, nY, nSizeXPix, nSizeYPix );
++
++
++ BOOL bLeft = ((aCurMousePos.X() >= aScrPos.X() && aCurMousePos.X() <= aScrPos.X() + 1) && aCurMousePos.Y() >= aScrPos.Y() && aCurMousePos.Y() <= aScrPos.Y() + nSizeYPix );
++ BOOL bTop = ((aCurMousePos.Y() >= aScrPos.Y() && aCurMousePos.Y() <= aScrPos.Y() + 1) && aCurMousePos.X() >= aScrPos.X() && aCurMousePos.X() <= aScrPos.X() + nSizeXPix );
++ // bottom and right borders actually count as the next cells that's why we do == instead of by range
++ // need to fix checking if click is on border but changes to a different cell or is this desireable?
++ BOOL bBottom = ((aCurMousePos.Y() == aScrPos.Y() + nSizeYPix - 1) &&
++ aCurMousePos.X() >= aScrPos.X() && aCurMousePos.X() <= aScrPos.X() + nSizeXPix );
++ BOOL bRight = ((aCurMousePos.X() == aScrPos.X() + nSizeXPix - 1) &&
++ aCurMousePos.Y() >= aScrPos.Y() && aCurMousePos.Y() <= aScrPos.Y() + nSizeYPix );
++ //BOOL bBottom = ((aCurMousePos.Y() >= aScrPos.Y() + nSizeYPix - 1 && aCurMousePos.Y() <= aScrPos.Y() + nSizeYPix + 1) &&
++ // aCurMousePos.X() >= aScrPos.X() && aCurMousePos.X() <= aScrPos.X() + nSizeXPix );
++ //BOOL bRight = ((aCurMousePos.X() >= aScrPos.X() + nSizeXPix - 1 && aCurMousePos.X() <= aScrPos.X() + nSizeXPix + 1) &&
++ // aCurMousePos.Y() >= aScrPos.Y() && aCurMousePos.Y() <= aScrPos.Y() + nSizeYPix );
++
+ if (bEditMode) // Edit-Mode muss zuerst kommen!
+ SetPointer( Pointer( POINTER_ARROW ) );
+- else if ( !bAlt && !nButtonDown &&
+- GetEditUrl(rMEvt.GetPosPixel()) )
++ else if ( !bAlt && !nButtonDown && GetEditUrl(rMEvt.GetPosPixel()) )
+ SetPointer( Pointer( POINTER_REFHAND ) );
++ else if ( ( bLeft || bTop || bBottom || bRight ) )
++ {
++ SetPointer( Pointer( POINTER_MOVE ) );
++ bMoveSingle = TRUE;
++ return;
++ }
+ else if ( DrawMouseMove(rMEvt) ) // setzt Pointer um
+ return;
+ }
++
+ }
+
+ if ( pViewData->GetView()->GetSelEngine()->SelMouseMove( rMEvt ) )
+@@ -2765,6 +2827,12 @@
+
+ if ( nCmd == COMMAND_CONTEXTMENU && !SC_MOD()->GetIsWaterCan() )
+ {
++ // don't display context menu when we are over the cursor border, to implement right click dragging
++ if (bMoveSingle)
++ {
++ return;
++ }
++
+ if (pViewData->IsAnyFillMode())
+ {
+ pViewData->GetView()->StopRefMode();
+@@ -3832,11 +3900,11 @@
+ const ScDragData& rData = pScMod->GetDragData();
+
+ return DropTransferObj( rData.pCellTransfer, nDragStartX, nDragStartY,
+- PixelToLogic(rEvt.maPosPixel), rEvt.mnAction );
++ PixelToLogic(rEvt.maPosPixel), rEvt.maPosPixel, rEvt.mnAction );
+ }
+
+ sal_Int8 ScGridWindow::DropTransferObj( ScTransferObj* pTransObj, SCCOL nDestPosX, SCROW nDestPosY,
+- const Point& rLogicPos, sal_Int8 nDndAction )
++ const Point& rLogicPos, const Point& rMousePos, sal_Int8 nDndAction )
+ {
+ if ( !pTransObj )
+ return 0;
+@@ -3859,6 +3927,8 @@
+ bIsMove = ( nDndAction & DND_ACTION_MOVE && !bIsNavi );
+ }
+
++ bool bIsRight = ( nDndAction == DND_ACTION_RIGHT && !bIsNavi );
++
+ BOOL bIsLink = ( nDndAction == DND_ACTION_LINK );
+
+ ScRange aSource = pTransObj->GetRange();
+@@ -3949,6 +4019,7 @@
+ {
+ // call with bApi = TRUE to avoid error messages in drop handler
+ bDone = pDocSh->GetDocFunc().InsertCells( aDest, NULL, meDragInsertMode, TRUE /*bRecord*/, TRUE /*bApi*/, TRUE /*bPartOfPaste*/ );
++
+ if ( bDone )
+ {
+ if ( nThisTab == nSourceTab )
+@@ -3976,6 +4047,195 @@
+ // call with bApi = TRUE to avoid error messages in drop handler
+ bDone = pView->LinkBlock( aSource, aDest.aStart, TRUE /*bApi*/ );
+ }
++ else if ( bIsRight )
++ {
++ ScPopupMenu maPopup(ScResId( RID_POPUP_RIGHTDRAGDROP ));
++
++ // GetMousePosPixel() returns the position from the start of the drag.. need to fix this, workaround segfaults :S
++ //EditView* pEditView = pViewData->GetEditView( eWhich );
++ //Cursor* pCur = pEditView->GetCursor();
++ sal_uInt16 nItemId = maPopup.Execute( this, rMousePos);//Point(nDestPosX * pCur->GetWidth(), nDestPosY * pCur->GetHeight() )); //GetMousePosPixel()); //Point(nDestPosX, nDestPosY));
++
++ //maPopup.Execute(pViewData->GetView()->GetWindowByPos( eWhich ), Point(0,0));/*rLogicPos);*/
++
++ // follow excel's format for now
++ switch ( nItemId )
++ {
++ case RID_RIGHTDRAGDROP_MOVE:
++ // Move Here
++ bIsMove = TRUE;
++ bDone = pView->MoveBlockTo( aSource, aDest.aStart, bIsMove, TRUE /*bRecord*/, TRUE /*bPaint*/, TRUE /*bApi*/ );
++ break;
++
++ case RID_RIGHTDRAGDROP_COPY:
++ // Copy Here
++ bIsMove = FALSE;
++ bDone = pView->MoveBlockTo( aSource, aDest.aStart, bIsMove, TRUE /*bRecord*/, TRUE /*bPaint*/, TRUE /*bApi*/ );
++ break;
++
++ case RID_RIGHTDRAGDROP_COPYVALUES:
++ // Copy Here as Values Only
++ break;
++
++ case RID_RIGHTDRAGDROP_COPYFORMATS:
++ // Copy Here as Formats Only
++ break;
++
++ case RID_RIGHTDRAGDROP_LINK:
++ // Link Here
++ bIsLink = TRUE;
++ bDone = pView->LinkBlock( aSource, aDest.aStart, TRUE /*bApi*/ );
++ break;
++
++ case RID_RIGHTDRAGDROP_HYPERLINK:
++ // Create Hyperlink Here
++ break;
++
++ case RID_RIGHTDRAGDROP_SHIFTDOWNC:
++ // Shift Down and Copy
++ meDragInsertMode = INS_CELLSDOWN;
++ aUndo = ScGlobal::GetRscString( bIsMove ? STR_UNDO_MOVE : STR_UNDO_COPY );
++ pDocSh->GetUndoManager()->EnterListAction( aUndo, aUndo );
++
++ bDone = TRUE;
++ bIsMove = FALSE;
++ if ( meDragInsertMode != INS_NONE )
++ {
++ // call with bApi = TRUE to avoid error messages in drop handler
++ bDone = pDocSh->GetDocFunc().InsertCells( aDest, NULL, meDragInsertMode, TRUE /*bRecord*/, TRUE /*bApi*/, TRUE /*bPartOfPaste*/ );
++ if ( bDone )
++ {
++ if ( nThisTab == nSourceTab )
++ {
++ if ( meDragInsertMode == INS_CELLSDOWN &&
++ nDestPosX == aSource.aStart.Col() && nDestPosY < aSource.aStart.Row() )
++ {
++ bDone = aSource.Move( 0, nSizeY, 0, pSourceDoc );
++ }
++ else if ( meDragInsertMode == INS_CELLSRIGHT &&
++ nDestPosY == aSource.aStart.Row() && nDestPosX < aSource.aStart.Col() )
++ {
++ bDone = aSource.Move( nSizeX, 0, 0, pSourceDoc );
++ }
++ }
++ pDocSh->UpdateOle( pViewData );
++ pView->CellContentChanged();
++ }
++ }
++ bDone = pView->MoveBlockTo( aSource, aDest.aStart, bIsMove, TRUE /*bRecord*/, TRUE /*bPaint*/, TRUE /*bApi*/ );
++ break;
++
++ case RID_RIGHTDRAGDROP_SHIFTRIGHTC:
++ // Shift Right and Copy
++ meDragInsertMode = INS_CELLSRIGHT;
++ aUndo = ScGlobal::GetRscString( bIsMove ? STR_UNDO_MOVE : STR_UNDO_COPY );
++ pDocSh->GetUndoManager()->EnterListAction( aUndo, aUndo );
++
++ bDone = TRUE;
++ bIsMove = FALSE;
++ if ( meDragInsertMode != INS_NONE )
++ {
++ // call with bApi = TRUE to avoid error messages in drop handler
++ bDone = pDocSh->GetDocFunc().InsertCells( aDest, NULL, meDragInsertMode, TRUE /*bRecord*/, TRUE /*bApi*/, TRUE /*bPartOfPaste*/ );
++ if ( bDone )
++ {
++ if ( nThisTab == nSourceTab )
++ {
++ if ( meDragInsertMode == INS_CELLSDOWN &&
++ nDestPosX == aSource.aStart.Col() && nDestPosY < aSource.aStart.Row() )
++ {
++ bDone = aSource.Move( 0, nSizeY, 0, pSourceDoc );
++ }
++ else if ( meDragInsertMode == INS_CELLSRIGHT &&
++ nDestPosY == aSource.aStart.Row() && nDestPosX < aSource.aStart.Col() )
++ {
++ bDone = aSource.Move( nSizeX, 0, 0, pSourceDoc );
++ }
++ }
++ pDocSh->UpdateOle( pViewData );
++ pView->CellContentChanged();
++ }
++ }
++ bDone = pView->MoveBlockTo( aSource, aDest.aStart, bIsMove, TRUE /*bRecord*/, TRUE /*bPaint*/, TRUE /*bApi*/ );
++ break;
++
++ case RID_RIGHTDRAGDROP_SHIFTDOWNM:
++ // Shift Down and Move
++ meDragInsertMode = INS_CELLSDOWN;
++ aUndo = ScGlobal::GetRscString( bIsMove ? STR_UNDO_MOVE : STR_UNDO_COPY );
++ pDocSh->GetUndoManager()->EnterListAction( aUndo, aUndo );
++
++ bDone = TRUE;
++ bIsMove = TRUE;
++ if ( meDragInsertMode != INS_NONE )
++ {
++ // call with bApi = TRUE to avoid error messages in drop handler
++ bDone = pDocSh->GetDocFunc().InsertCells( aDest, NULL, meDragInsertMode, TRUE /*bRecord*/, TRUE /*bApi*/, TRUE /*bPartOfPaste*/ );
++ if ( bDone )
++ {
++ if ( nThisTab == nSourceTab )
++ {
++ if ( meDragInsertMode == INS_CELLSDOWN &&
++ nDestPosX == aSource.aStart.Col() && nDestPosY < aSource.aStart.Row() )
++ {
++ bDone = aSource.Move( 0, nSizeY, 0, pSourceDoc );
++ }
++ else if ( meDragInsertMode == INS_CELLSRIGHT &&
++ nDestPosY == aSource.aStart.Row() && nDestPosX < aSource.aStart.Col() )
++ {
++ bDone = aSource.Move( nSizeX, 0, 0, pSourceDoc );
++ }
++ }
++ pDocSh->UpdateOle( pViewData );
++ pView->CellContentChanged();
++ }
++ }
++ bDone = pView->MoveBlockTo( aSource, aDest.aStart, bIsMove, TRUE /*bRecord*/, TRUE /*bPaint*/, TRUE /*bApi*/ );
++ break;
++
++ case RID_RIGHTDRAGDROP_SHIFTRIGHTM:
++ // Shift Right and Move
++ meDragInsertMode = INS_CELLSRIGHT;
++ aUndo = ScGlobal::GetRscString( bIsMove ? STR_UNDO_MOVE : STR_UNDO_COPY );
++ pDocSh->GetUndoManager()->EnterListAction( aUndo, aUndo );
++
++ bDone = TRUE;
++ bIsMove = TRUE;
++ if ( meDragInsertMode != INS_NONE )
++ {
++ // call with bApi = TRUE to avoid error messages in drop handler
++ bDone = pDocSh->GetDocFunc().InsertCells( aDest, NULL, meDragInsertMode, TRUE /*bRecord*/, TRUE /*bApi*/, TRUE /*bPartOfPaste*/ );
++ if ( bDone )
++ {
++ if ( nThisTab == nSourceTab )
++ {
++ if ( meDragInsertMode == INS_CELLSDOWN &&
++ nDestPosX == aSource.aStart.Col() && nDestPosY < aSource.aStart.Row() )
++ {
++ bDone = aSource.Move( 0, nSizeY, 0, pSourceDoc );
++ }
++ else if ( meDragInsertMode == INS_CELLSRIGHT &&
++ nDestPosY == aSource.aStart.Row() && nDestPosX < aSource.aStart.Col() )
++ {
++ bDone = aSource.Move( nSizeX, 0, 0, pSourceDoc );
++ }
++ }
++ pDocSh->UpdateOle( pViewData );
++ pView->CellContentChanged();
++ }
++ }
++ bDone = pView->MoveBlockTo( aSource, aDest.aStart, bIsMove, TRUE /*bRecord*/, TRUE /*bPaint*/, TRUE /*bApi*/ );
++ break;
++
++ case 0:
++ // nothing selected
++ case RID_RIGHTDRAGDROP_CANCEL:
++ // Cancel
++ default:
++ // Need to return DND_ACTION_NONE to prevent moving the shaded area if nothing is to be done.
++ return DND_ACTION_NONE;
++ }
++ }
+ else
+ {
+ // call with bApi = TRUE to avoid error messages in drop handler
+@@ -4317,7 +4577,7 @@
+ {
+ // keep a reference to the data in case the selection is changed during paste
+ uno::Reference<datatransfer::XTransferable> xRef( pCellTransfer );
+- DropTransferObj( pCellTransfer, nPosX, nPosY, aLogicPos, DND_ACTION_COPY );
++ DropTransferObj( pCellTransfer, nPosX, nPosY, aLogicPos, rPosPixel, DND_ACTION_COPY );
+ }
+ else
+ {
+--- sc/source/ui/inc/gridwin.hxx.orig2 2010-08-16 21:54:09.998000096 -0500
++++ sc/source/ui/inc/gridwin.hxx 2010-08-16 21:54:18.584000098 -0500
+@@ -116,6 +116,8 @@
+
+ ::boost::shared_ptr<Rectangle> mpAutoFillRect;
+
++ bool bMoveSingle;
++
+ /**
+ * Stores current visible column and row ranges, used to avoid expensive
+ * operations on objects that are outside visible area.
+--- sc/inc/sc.hrc.orig2 2010-08-14 09:16:59.107000093 -0500
++++ sc/inc/sc.hrc 2010-08-14 09:31:40.135000093 -0500
+@@ -1643,6 +1643,21 @@
+
+ #define SC_DIALOGS_END (SC_DIALOGS_START + 155)
+
++// Popup for right dragging.
++#define RID_POPUP_RIGHTDRAGDROP (SC_DIALOGS_START + 156)
++#define RID_RIGHTDRAGDROP_MOVE (SC_DIALOGS_START + 157)
++#define RID_RIGHTDRAGDROP_COPY (SC_DIALOGS_START + 158)
++#define RID_RIGHTDRAGDROP_COPYVALUES (SC_DIALOGS_START + 159)
++#define RID_RIGHTDRAGDROP_COPYFORMATS (SC_DIALOGS_START + 160)
++#define RID_RIGHTDRAGDROP_LINK (SC_DIALOGS_START + 161)
++#define RID_RIGHTDRAGDROP_HYPERLINK (SC_DIALOGS_START + 162)
++#define RID_RIGHTDRAGDROP_SHIFTDOWNC (SC_DIALOGS_START + 163)
++#define RID_RIGHTDRAGDROP_SHIFTRIGHTC (SC_DIALOGS_START + 164)
++#define RID_RIGHTDRAGDROP_SHIFTDOWNM (SC_DIALOGS_START + 165)
++#define RID_RIGHTDRAGDROP_SHIFTRIGHTM (SC_DIALOGS_START + 166)
++#define RID_RIGHTDRAGDROP_CANCEL (SC_DIALOGS_START + 167)
++
++
+ #ifndef STD_MASKCOLOR
+ #define STD_MASKCOLOR Color { Red = 0xFF00; Green = 0x0000; Blue = 0xFF00; }
+ #endif
+--- sc/source/ui/navipi/navipi.src.orig2 2010-08-14 09:36:21.672000092 -0500
++++ sc/source/ui/navipi/navipi.src 2010-08-15 17:25:02.982000089 -0500
+@@ -370,45 +370,70 @@
+ };
+ };
+ };
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
++Menu RID_POPUP_RIGHTDRAGDROP
++{
++ ItemList =
++ {
++ MenuItem
++ {
++ Identifier = RID_RIGHTDRAGDROP_MOVE ;
++ Text [ en-US ] = "Move Here" ;
++ };
++ MenuItem
++ {
++ Identifier = RID_RIGHTDRAGDROP_COPY ;
++ Text [ en-US ] = "Copy Here" ;
++ };
++ //MenuItem
++ //{
++ // Identifier = RID_RIGHTDRAGDROP_COPYVALUES ;
++ // Text [ en-US ] = "Copy Here as Values Only" ;
++ //};
++ //MenuItem
++ //{
++ // Identifier = RID_RIGHTDRAGDROP_COPYFORMATS ;
++ // Text [ en-US ] = "Copy Here as Formats Only" ;
++ //};
++ MenuItem
++ {
++ Identifier = RID_RIGHTDRAGDROP_LINK ;
++ Text [ en-US ] = "Link Here" ;
++ };
++ //MenuItem
++ //{
++ // Identifier = RID_RIGHTDRAGDROP_HYPERLINK ;
++ // Text [ en-US ] = "Create Hyperlink Here" ;
++ //};
++ //////////////////////////////////////////////////
++ MenuItem { Separator = TRUE ; };
++ //////////////////////////////////////////////////
++ MenuItem
++ {
++ Identifier = RID_RIGHTDRAGDROP_SHIFTDOWNC ;
++ Text [ en-US ] = "Shift Down and Copy" ;
++ };
++ MenuItem
++ {
++ Identifier = RID_RIGHTDRAGDROP_SHIFTRIGHTC ;
++ Text [ en-US ] = "Shift Right and Copy" ;
++ };
++ MenuItem
++ {
++ Identifier = RID_RIGHTDRAGDROP_SHIFTDOWNM ;
++ Text [ en-US ] = "Shift Down and Move" ;
++ };
++ MenuItem
++ {
++ Identifier = RID_RIGHTDRAGDROP_SHIFTRIGHTM ;
++ Text [ en-US ] = "Shift Right and Move" ;
++ };
++ //////////////////////////////////////////////////
++ MenuItem { Separator = TRUE ; };
++ //////////////////////////////////////////////////
++ MenuItem
++ {
++ Identifier = RID_RIGHTDRAGDROP_CANCEL ;
++ Text [ en-US ] = "Cancel" ;
++ };
++ };
++};
+--- vcl/source/window/seleng.cxx.orig2 2010-08-10 11:35:56.392000035 -0500
++++ vcl/source/window/seleng.cxx 2010-08-14 08:20:22.702000092 -0500
+@@ -202,7 +202,7 @@
+ BOOL SelectionEngine::SelMouseButtonDown( const MouseEvent& rMEvt )
+ {
+ nFlags &= (~SELENG_CMDEVT);
+- if ( !pFunctionSet || !pWin || rMEvt.GetClicks() > 1 || rMEvt.IsRight() )
++ if ( !pFunctionSet || !pWin || rMEvt.GetClicks() > 1)
+ return FALSE;
+
+ USHORT nModifier = rMEvt.GetModifier() | nLockedMods;
+--- vcl/source/window/winproc.cxx.orig2 2010-08-12 20:54:52.205000092 -0500
++++ vcl/source/window/winproc.cxx 2010-08-13 23:26:41.251000089 -0500
+@@ -546,8 +546,8 @@
+ // den Status der Maustasten, damit man mit Mod1 z.B. sofort
+ // in den Kopiermodus gehen kann.
+ const MouseSettings& rMSettings = pMouseDownWin->GetSettings().GetMouseSettings();
+- if ( (nCode & (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE)) ==
+- (rMSettings.GetStartDragCode() & (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE)) )
++ if ( ( (nCode & (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE)) ==
++ (rMSettings.GetStartDragCode() & (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE)) ) || ( nCode & MOUSE_RIGHT ) )
+ {
+ if ( !pMouseDownWin->ImplGetFrameData()->mbStartDragCalled )
+ {
+@@ -697,8 +697,8 @@
+ pChild->ImplGetFrameData()->mnFirstMouseX = nMouseX;
+ pChild->ImplGetFrameData()->mnFirstMouseY = nMouseY;
+ pChild->ImplGetFrameData()->mnFirstMouseCode = nCode;
+- pChild->ImplGetFrameData()->mbStartDragCalled = !((nCode & (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE)) ==
+- (rMSettings.GetStartDragCode() & (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE)));
++ pChild->ImplGetFrameData()->mbStartDragCalled = !( ((nCode & (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE)) ==
++ (rMSettings.GetStartDragCode() & (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE))) || ( nCode & MOUSE_RIGHT ) );
+ }
+ pChild->ImplGetFrameData()->mnMouseDownTime = nMsgTime;
+ }
+--- vcl/unx/source/dtrans/X11_selection.cxx.orig2 2010-08-13 21:04:01.229000093 -0500
++++ vcl/unx/source/dtrans/X11_selection.cxx 2010-08-14 08:22:34.206000092 -0500
+@@ -2763,9 +2763,10 @@
+ sendDropPosition( true, rMessage.xkey.time );
+ }
+ }
+- else if(
++ else if((
+ ( rMessage.type == ButtonPress || rMessage.type == ButtonRelease ) &&
+- rMessage.xbutton.button == m_nDragButton )
++ rMessage.xbutton.button == m_nDragButton ) ||
++ ( rMessage.xbutton.button == Button3 ) )
+ {
+ bool bCancel = true;
+ if( m_aDropWindow != None )
+@@ -2783,7 +2784,7 @@
+ dtde.Context = new DropTargetDropContext( m_aCurrentDropWindow, m_nDropTimestamp, *this );
+ dtde.LocationX = x;
+ dtde.LocationY = y;
+- dtde.DropAction = m_nUserDragAction;
++ dtde.DropAction = ( rMessage.xbutton.button == Button3 ) ? DNDConstants::ACTION_RIGHT : m_nUserDragAction;
+ dtde.SourceActions = m_nSourceActions;
+ dtde.Transferable = m_xDragSourceTransferable;
+ m_bDropSent = true;
+--- svtools/inc/svtools/transfer.hxx.orig2 2010-08-14 00:03:15.653000092 -0500
++++ svtools/inc/svtools/transfer.hxx 2010-08-14 01:10:08.078000092 -0500
+@@ -73,6 +73,7 @@
+ #define DND_ACTION_MOVE ::com::sun::star::datatransfer::dnd::DNDConstants::ACTION_MOVE
+ #define DND_ACTION_COPYMOVE ::com::sun::star::datatransfer::dnd::DNDConstants::ACTION_COPY_OR_MOVE
+ #define DND_ACTION_LINK ::com::sun::star::datatransfer::dnd::DNDConstants::ACTION_LINK
++#define DND_ACTION_RIGHT ::com::sun::star::datatransfer::dnd::DNDConstants::ACTION_RIGHT
+
+ #define DND_POINTER_NONE 0
+ #define DND_IMAGE_NONE 0
+--- offapi/com/sun/star/datatransfer/dnd/DNDConstants.idl.orig2 2010-08-14 01:09:16.240000096 -0500
++++ offapi/com/sun/star/datatransfer/dnd/DNDConstants.idl 2010-08-14 01:09:23.002000093 -0500
+@@ -76,6 +76,12 @@
+ const byte ACTION_REFERENCE = 0x04;
+
+ //=============================================================================
++ /** Action for right click dragging.
++ */
++
++ const byte ACTION_RIGHT = 0x08;
++
++ //=============================================================================
+ /** Action default.
+ */
+