diff options
Diffstat (limited to 'sc/source/ui')
-rw-r--r-- | sc/source/ui/inc/tabview.hxx | 4 | ||||
-rw-r--r-- | sc/source/ui/view/tabview.cxx | 114 | ||||
-rw-r--r-- | sc/source/ui/view/tabvwsh3.cxx | 10 |
3 files changed, 85 insertions, 43 deletions
diff --git a/sc/source/ui/inc/tabview.hxx b/sc/source/ui/inc/tabview.hxx index 23b97ed79392..5e7d9c792fc6 100644 --- a/sc/source/ui/inc/tabview.hxx +++ b/sc/source/ui/inc/tabview.hxx @@ -229,6 +229,8 @@ public: ScTabView( vcl::Window* pParent, ScDocShell& rDocSh, ScTabViewShell* pViewShell ); ~ScTabView(); + enum SplitMethod { SC_SPLIT_METHOD_FIRST_COL, SC_SPLIT_METHOD_FIRST_ROW, SC_SPLIT_METHOD_CURSOR }; + void MakeDrawLayer(); void HideListBox(); @@ -494,7 +496,7 @@ public: Point GetMousePosPixel(); - void FreezeSplitters( bool bFreeze ); + void FreezeSplitters( bool bFreeze, SplitMethod eSplitMethod = SC_SPLIT_METHOD_CURSOR ); void RemoveSplit(); void SplitAtCursor(); void SplitAtPixel( const Point& rPixel, bool bHor, bool bVer ); diff --git a/sc/source/ui/view/tabview.cxx b/sc/source/ui/view/tabview.cxx index 9895bb79e14b..791851622e22 100644 --- a/sc/source/ui/view/tabview.cxx +++ b/sc/source/ui/view/tabview.cxx @@ -1931,7 +1931,7 @@ Point ScTabView::GetMousePosPixel() return aPos; } -void ScTabView::FreezeSplitters( bool bFreeze ) +void ScTabView::FreezeSplitters( bool bFreeze, SplitMethod eSplitMetod) { ScSplitMode eOldH = aViewData.GetHSplitMode(); ScSplitMode eOldV = aViewData.GetVSplitMode(); @@ -1949,19 +1949,20 @@ void ScTabView::FreezeSplitters( bool bFreeze ) aViewData.GetDocShell()->SetDocumentModified(); Point aSplit; - SCsCOL nPosX; - SCsROW nPosY; - if (eOldH != SC_SPLIT_NONE || eOldV != SC_SPLIT_NONE) + SCsCOL nPosX = 1; + SCsROW nPosY = 1; + if (eOldV != SC_SPLIT_NONE || eOldH != SC_SPLIT_NONE) { - if (eOldH != SC_SPLIT_NONE) + if ( eOldV != SC_SPLIT_NONE && (eSplitMetod == SC_SPLIT_METHOD_FIRST_ROW || eSplitMetod == SC_SPLIT_METHOD_CURSOR)) + aSplit.Y() = aViewData.GetVSplitPos() - aWinStart.Y(); + + if ( eOldH != SC_SPLIT_NONE && (eSplitMetod == SC_SPLIT_METHOD_FIRST_COL || eSplitMetod == SC_SPLIT_METHOD_CURSOR)) { long nSplitPos = aViewData.GetHSplitPos(); if ( bLayoutRTL ) nSplitPos = pFrameWin->GetOutputSizePixel().Width() - nSplitPos - 1; aSplit.X() = nSplitPos - aWinStart.X(); } - if (eOldV != SC_SPLIT_NONE) - aSplit.Y() = aViewData.GetVSplitPos() - aWinStart.Y(); aViewData.GetPosFromPixel( aSplit.X(), aSplit.Y(), ePos, nPosX, nPosY ); bool bLeft; @@ -1974,51 +1975,80 @@ void ScTabView::FreezeSplitters( bool bFreeze ) } else { - nPosX = static_cast<SCsCOL>( aViewData.GetCurX()); - nPosY = static_cast<SCsROW>( aViewData.GetCurY()); + switch(eSplitMetod) + { + case SC_SPLIT_METHOD_FIRST_ROW: + { + nPosX = 0; + nPosY = 1; + } + break; + case SC_SPLIT_METHOD_FIRST_COL: + { + nPosX = 1; + nPosY = 0; + } + break; + case SC_SPLIT_METHOD_CURSOR: + { + nPosX = static_cast<SCsCOL>( aViewData.GetCurX()); + nPosY = static_cast<SCsROW>( aViewData.GetCurY()); + } + break; + } } - SCCOL nLeftPos = aViewData.GetPosX(SC_SPLIT_LEFT); SCROW nTopPos = aViewData.GetPosY(SC_SPLIT_BOTTOM); - SCCOL nRightPos = static_cast<SCCOL>(nPosX); SCROW nBottomPos = static_cast<SCROW>(nPosY); - if (eOldH != SC_SPLIT_NONE) - if (aViewData.GetPosX(SC_SPLIT_RIGHT) > nRightPos) - nRightPos = aViewData.GetPosX(SC_SPLIT_RIGHT); - if (eOldV != SC_SPLIT_NONE) + SCCOL nLeftPos = aViewData.GetPosX(SC_SPLIT_LEFT); + SCCOL nRightPos = static_cast<SCCOL>(nPosX); + + if (eSplitMetod == SC_SPLIT_METHOD_FIRST_ROW || eSplitMetod == SC_SPLIT_METHOD_CURSOR) { - nTopPos = aViewData.GetPosY(SC_SPLIT_TOP); - if (aViewData.GetPosY(SC_SPLIT_BOTTOM) > nBottomPos) - nBottomPos = aViewData.GetPosY(SC_SPLIT_BOTTOM); + if (eOldV != SC_SPLIT_NONE) + { + nTopPos = aViewData.GetPosY(SC_SPLIT_TOP); + if (aViewData.GetPosY(SC_SPLIT_BOTTOM) > nBottomPos) + nBottomPos = aViewData.GetPosY(SC_SPLIT_BOTTOM); + } + aSplit = aViewData.GetScrPos( static_cast<SCCOL>(nPosX), static_cast<SCROW>(nPosY), ePos, true ); + if (aSplit.Y() > 0) + { + aViewData.SetVSplitMode( SC_SPLIT_FIX ); + aViewData.SetVSplitPos( aSplit.Y() + aWinStart.Y() ); + aViewData.SetFixPosY( nPosY ); + + aViewData.SetPosY(SC_SPLIT_TOP, nTopPos); + aViewData.SetPosY(SC_SPLIT_BOTTOM, nBottomPos); + } + else + aViewData.SetVSplitMode( SC_SPLIT_NONE ); } - aSplit = aViewData.GetScrPos( static_cast<SCCOL>(nPosX), static_cast<SCROW>(nPosY), ePos, true ); - if (nPosX > aViewData.GetPosX(SC_SPLIT_LEFT)) // (aSplit.X() > 0) doesn't work for RTL + if (eSplitMetod == SC_SPLIT_METHOD_FIRST_COL || eSplitMetod == SC_SPLIT_METHOD_CURSOR) { - long nSplitPos = aSplit.X() + aWinStart.X(); - if ( bLayoutRTL ) - nSplitPos = pFrameWin->GetOutputSizePixel().Width() - nSplitPos - 1; - - aViewData.SetHSplitMode( SC_SPLIT_FIX ); - aViewData.SetHSplitPos( nSplitPos ); - aViewData.SetFixPosX( nPosX ); + if (eOldH != SC_SPLIT_NONE) + { + if (aViewData.GetPosX(SC_SPLIT_RIGHT) > nRightPos) + nRightPos = aViewData.GetPosX(SC_SPLIT_RIGHT); + } + aSplit = aViewData.GetScrPos( static_cast<SCCOL>(nPosX), static_cast<SCROW>(nPosY), ePos, true ); + if (nPosX > aViewData.GetPosX(SC_SPLIT_LEFT)) // (aSplit.X() > 0) doesn't work for RTL + { + long nSplitPos = aSplit.X() + aWinStart.X(); + if ( bLayoutRTL ) + nSplitPos = pFrameWin->GetOutputSizePixel().Width() - nSplitPos - 1; - aViewData.SetPosX(SC_SPLIT_LEFT, nLeftPos); - aViewData.SetPosX(SC_SPLIT_RIGHT, nRightPos); - } - else - aViewData.SetHSplitMode( SC_SPLIT_NONE ); - if (aSplit.Y() > 0) - { - aViewData.SetVSplitMode( SC_SPLIT_FIX ); - aViewData.SetVSplitPos( aSplit.Y() + aWinStart.Y() ); - aViewData.SetFixPosY( nPosY ); + aViewData.SetHSplitMode( SC_SPLIT_FIX ); + aViewData.SetHSplitPos( nSplitPos ); + aViewData.SetFixPosX( nPosX ); - aViewData.SetPosY(SC_SPLIT_TOP, nTopPos); - aViewData.SetPosY(SC_SPLIT_BOTTOM, nBottomPos); + aViewData.SetPosX(SC_SPLIT_LEFT, nLeftPos); + aViewData.SetPosX(SC_SPLIT_RIGHT, nRightPos); + } + else + aViewData.SetHSplitMode( SC_SPLIT_NONE ); } - else - aViewData.SetVSplitMode( SC_SPLIT_NONE ); } else // unfreeze { @@ -2104,6 +2134,8 @@ void ScTabView::InvalidateSplit() SfxBindings& rBindings = aViewData.GetBindings(); rBindings.Invalidate( SID_WINDOW_SPLIT ); rBindings.Invalidate( SID_WINDOW_FIX ); + rBindings.Invalidate( SID_WINDOW_FIX_COL ); + rBindings.Invalidate( SID_WINDOW_FIX_ROW ); pHSplitter->SetFixed( aViewData.GetHSplitMode() == SC_SPLIT_FIX ); pVSplitter->SetFixed( aViewData.GetVSplitMode() == SC_SPLIT_FIX ); diff --git a/sc/source/ui/view/tabvwsh3.cxx b/sc/source/ui/view/tabvwsh3.cxx index 606755a7c42f..4ea02a9fde79 100644 --- a/sc/source/ui/view/tabvwsh3.cxx +++ b/sc/source/ui/view/tabvwsh3.cxx @@ -896,13 +896,21 @@ void ScTabViewShell::Execute( SfxRequest& rReq ) break; case SID_WINDOW_FIX: + case SID_WINDOW_FIX_COL: + case SID_WINDOW_FIX_ROW: { + SplitMethod eSplitMethod = SC_SPLIT_METHOD_CURSOR; + if (nSlot == SID_WINDOW_FIX_COL) + eSplitMethod = SC_SPLIT_METHOD_FIRST_COL; + else if (nSlot == SID_WINDOW_FIX_ROW) + eSplitMethod = SC_SPLIT_METHOD_FIRST_ROW; + ScSplitMode eHSplit = GetViewData().GetHSplitMode(); ScSplitMode eVSplit = GetViewData().GetVSplitMode(); if ( eHSplit == SC_SPLIT_FIX || eVSplit == SC_SPLIT_FIX ) // remove RemoveSplit(); else - FreezeSplitters( true ); // create or fixate + FreezeSplitters( true, eSplitMethod); // create or fixate rReq.Done(); InvalidateSplit(); |