summaryrefslogtreecommitdiff
path: root/basctl/source
diff options
context:
space:
mode:
authorAugust Sodora <augsod@gmail.com>2011-11-17 00:19:47 -0500
committerNorbert Thiebaud <nthiebaud@gmail.com>2011-11-17 18:41:22 -0600
commitd27db6c53415a7ccea9cb7bfa97be10995874fcf (patch)
treeceeded5f5e85d24aa84f652e94fe8e118dcb543c /basctl/source
parenta1deac6043ffdc5fba454f92c42e46de0943f7f7 (diff)
Fixed scrolling bug
Diffstat (limited to 'basctl/source')
-rw-r--r--basctl/source/basicide/baside2b.cxx7
-rw-r--r--basctl/source/basicide/linenumberwindow.cxx44
-rw-r--r--basctl/source/basicide/linenumberwindow.hxx8
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