diff options
author | August Sodora <augsod@gmail.com> | 2011-11-17 00:19:47 -0500 |
---|---|---|
committer | Norbert Thiebaud <nthiebaud@gmail.com> | 2011-11-17 18:41:22 -0600 |
commit | d27db6c53415a7ccea9cb7bfa97be10995874fcf (patch) | |
tree | ceeded5f5e85d24aa84f652e94fe8e118dcb543c /basctl | |
parent | a1deac6043ffdc5fba454f92c42e46de0943f7f7 (diff) |
Fixed scrolling bug
Diffstat (limited to 'basctl')
-rw-r--r-- | basctl/source/basicide/baside2b.cxx | 7 | ||||
-rw-r--r-- | basctl/source/basicide/linenumberwindow.cxx | 44 | ||||
-rw-r--r-- | basctl/source/basicide/linenumberwindow.hxx | 8 |
3 files changed, 53 insertions, 6 deletions
diff --git a/basctl/source/basicide/baside2b.cxx b/basctl/source/basicide/baside2b.cxx index 2a4d8ce6d698..a80e9e454c2a 100644 --- a/basctl/source/basicide/baside2b.cxx +++ b/basctl/source/basicide/baside2b.cxx @@ -333,6 +333,7 @@ void EditorWindow::Resize() pEditView->SetStartDocPos( aStartDocPos ); pEditView->ShowCursor(); pModulWindow->GetBreakPointWindow().GetCurYOffset() = aStartDocPos.Y(); + pModulWindow->GetLineNumberWindow().GetCurYOffset() = aStartDocPos.Y(); } InitScrollBars(); if ( nVisY != pEditView->GetStartDocPos().Y() ) @@ -574,6 +575,7 @@ void EditorWindow::CreateEditEngine() pEditView->SetStartDocPos( Point( 0, 0 ) ); pEditView->SetSelection( TextSelection() ); pModulWindow->GetBreakPointWindow().GetCurYOffset() = 0; + pModulWindow->GetLineNumberWindow().GetCurYOffset() = 0; pEditEngine->SetUpdateMode( sal_True ); Update(); // has only been invalidated at UpdateMode = sal_True @@ -661,7 +663,9 @@ void EditorWindow::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint ) pModulWindow->GetEditVScrollBar().SetThumbPos( pEditView->GetStartDocPos().Y() ); pModulWindow->GetBreakPointWindow().DoScroll ( 0, pModulWindow->GetBreakPointWindow().GetCurYOffset() - pEditView->GetStartDocPos().Y() ); - pModulWindow->GetLineNumberWindow().Invalidate(); + pModulWindow->GetLineNumberWindow().DoScroll + ( 0, pModulWindow->GetLineNumberWindow().GetCurYOffset() - pEditView->GetStartDocPos().Y() ); + pModulWindow->Invalidate(); } else if( rTextHint.GetId() == TEXT_HINT_TEXTHEIGHTCHANGED ) { @@ -1681,6 +1685,7 @@ IMPL_LINK( ComplexEditorWindow, ScrollHdl, ScrollBar *, pCurScrollBar ) long nDiff = aEdtWindow.GetEditView()->GetStartDocPos().Y() - pCurScrollBar->GetThumbPos(); aEdtWindow.GetEditView()->Scroll( 0, nDiff ); aBrkWindow.DoScroll( 0, nDiff ); + aLineNumberWindow.DoScroll(0, nDiff); aEdtWindow.GetEditView()->ShowCursor( sal_False, sal_True ); pCurScrollBar->SetThumbPos( aEdtWindow.GetEditView()->GetStartDocPos().Y() ); } diff --git a/basctl/source/basicide/linenumberwindow.cxx b/basctl/source/basicide/linenumberwindow.cxx index 5168da1b092a..deba85df526c 100644 --- a/basctl/source/basicide/linenumberwindow.cxx +++ b/basctl/source/basicide/linenumberwindow.cxx @@ -7,7 +7,8 @@ LineNumberWindow::LineNumberWindow( Window* pParent, ModulWindow* pModulWin ) : Window( pParent, WB_BORDER ), pModulWindow(pModulWin), - nWidth(1) + nWidth(1), + nCurYOffset(0) { SetBackground(Wallpaper(GetSettings().GetStyleSettings().GetFieldColor())); } @@ -16,6 +17,9 @@ LineNumberWindow::~LineNumberWindow() { } void LineNumberWindow::Paint( const Rectangle& ) { + if(SyncYOffset()) + return; + ExtTextEngine* txtEngine = pModulWindow->GetEditEngine(); if(!txtEngine) return; @@ -27,9 +31,9 @@ void LineNumberWindow::Paint( const Rectangle& ) GetParent()->Resize(); ulong windowHeight = GetOutputSize().Height(); - ulong startY = txtView->GetStartDocPos().Y(); ulong nLineHeight = GetTextHeight(); + ulong startY = txtView->GetStartDocPos().Y(); ulong nStartLine = startY / nLineHeight + 1; ulong nEndLine = (startY + windowHeight) / nLineHeight + 1; @@ -38,8 +42,9 @@ void LineNumberWindow::Paint( const Rectangle& ) nWidth = String::CreateFromInt64(nEndLine).Len() * 10; - for(ulong i = nStartLine, y = 0; i < nEndLine; ++i, y += nLineHeight) - DrawText(Point(0, y), String::CreateFromInt64(i)); + sal_Int64 y = (nStartLine - 1) * nLineHeight; + for(ulong i = nStartLine; i <= nEndLine; ++i, y += nLineHeight) + DrawText(Point(0, y - nCurYOffset), String::CreateFromInt64(i)); } void LineNumberWindow::DataChanged(DataChangedEvent const & rDCEvt) @@ -56,3 +61,34 @@ void LineNumberWindow::DataChanged(DataChangedEvent const & rDCEvt) } } } + +void LineNumberWindow::DoScroll(long nHorzScroll, long nVertScroll) +{ + nCurYOffset -= nVertScroll; + Window::Scroll(nHorzScroll, nVertScroll); +} + +long& LineNumberWindow::GetCurYOffset() +{ + return nCurYOffset; +} + +bool LineNumberWindow::SyncYOffset() +{ + TextView* pView = pModulWindow->GetEditView(); + if (!pView) + return false; + + long nViewYOffset = pView->GetStartDocPos().Y(); + if (nCurYOffset == nViewYOffset) + return false; + + nCurYOffset = nViewYOffset; + Invalidate(); + return true; +} + +ulong LineNumberWindow::GetWidth() +{ + return (nWidth < 20 ? 20 : nWidth); +} diff --git a/basctl/source/basicide/linenumberwindow.hxx b/basctl/source/basicide/linenumberwindow.hxx index 885ea1485542..fd30171a0d20 100644 --- a/basctl/source/basicide/linenumberwindow.hxx +++ b/basctl/source/basicide/linenumberwindow.hxx @@ -10,6 +10,7 @@ class LineNumberWindow : public Window private: ModulWindow* pModulWindow; ulong nWidth; + long nCurYOffset; virtual void DataChanged(DataChangedEvent const & rDCEvt); @@ -20,7 +21,12 @@ public: LineNumberWindow( Window* pParent, ModulWindow* pModulWin ); ~LineNumberWindow(); - ulong GetWidth() { return (nWidth < 20 ? 20 : nWidth); } + void DoScroll( long nHorzScroll, long nVertScroll ); + + bool SyncYOffset(); + long& GetCurYOffset(); + + ulong GetWidth(); }; #endif // BASICIDE_LINENUMBERWINDOW_HXX |