Patch by Rene Gollent: TextViews now can scroll even if they aren't

attached to a BScrollView.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22432 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stefano Ceccherini 2007-10-04 11:32:06 +00:00
parent 39c99f8644
commit f2476bcc9c
4 changed files with 44 additions and 18 deletions

View File

@ -255,6 +255,7 @@ virtual void Undo(BClipboard *clipboard);
undo_state UndoState(bool *isRedo) const;
protected:
void _ScrollToOffset(int32 nOffset, bool useHorz, bool useVert);
virtual void GetDragParameters(BMessage *drag,
BBitmap **bitmap,
BPoint *point,

View File

@ -100,6 +100,11 @@ _BTextInput_::KeyDown(const char* bytes, int32 numBytes)
}
}
void
_BTextInput_::ScrollToOffset(int32 nOffset)
{
_ScrollToOffset(nOffset, true, false);
}
void
_BTextInput_::MakeFocus(bool state)

View File

@ -62,6 +62,7 @@ virtual void MakeFocus(bool focusState = true);
void AlignTextRect();
void SetInitialText();
virtual void ScrollToOffset(int32 nOffset);
virtual void Paste(BClipboard *clipboard);
protected:

View File

@ -24,7 +24,7 @@
#include <stdlib.h>
#include <new>
using namespace std;
#define DEBUG 1
#include <Application.h>
#include <Beep.h>
#include <Bitmap.h>
@ -806,6 +806,7 @@ BTextView::MessageReceived(BMessage *message)
switch (opcode) {
case B_INPUT_METHOD_STARTED:
{
PRINT(("B_INPUT_METHOD_STARTED\n"));
BMessenger messenger;
if (message->FindMessenger("be:reply_to", &messenger) == B_OK) {
ASSERT(fInline == NULL);
@ -815,16 +816,21 @@ BTextView::MessageReceived(BMessage *message)
}
case B_INPUT_METHOD_STOPPED:
PRINT(("B_INPUT_METHOD_STOPPED\n"));
delete fInline;
fInline = NULL;
break;
case B_INPUT_METHOD_CHANGED:
HandleInputMethodChanged(message);
PRINT(("B_INPUT_METHOD_CHANGED\n"));
if (fInline != NULL)
HandleInputMethodChanged(message);
break;
case B_INPUT_METHOD_LOCATION_REQUEST:
HandleInputMethodLocationRequest();
PRINT(("B_INPUT_METHOD_LOCATION_REQUEST\n"));
if (fInline != NULL)
HandleInputMethodLocationRequest();
break;
default:
@ -1928,25 +1934,40 @@ BTextView::GetTextRegion(int32 startOffset, int32 endOffset, BRegion *outRegion)
*/
void
BTextView::ScrollToOffset(int32 inOffset)
{
_ScrollToOffset(inOffset, ScrollBar(B_HORIZONTAL) != NULL, ScrollBar(B_VERTICAL) != NULL);
}
void
BTextView::_ScrollToOffset(int32 inOffset, bool useHorz, bool useVert)
{
BRect bounds = Bounds();
float lineHeight = 0.0;
float xdiff = 0.0;
float ydiff = 0.0;
BPoint point = PointAt(inOffset, &lineHeight);
// TODO: We should do the following, since otherwise the textview
// won't scroll unless it's attached to a scrollview.
/*if (!bounds.Contains(point))
ScrollTo(point); */
if (ScrollBar(B_HORIZONTAL) != NULL) {
if (point.x < bounds.left || point.x >= bounds.right)
ScrollBar(B_HORIZONTAL)->SetValue(point.x - (bounds.IntegerWidth() / 2));
if (useHorz) {
if (point.x < bounds.left) {
xdiff = -1 * (bounds.IntegerWidth() / 2);
// normalize scroll value to prevent scrolling past left boundary of view
if (bounds.left < fabs(xdiff))
xdiff = -1 * bounds.left;
} else if (point.x >= bounds.right)
xdiff = bounds.IntegerWidth() / 2;
}
if (ScrollBar(B_VERTICAL) != NULL) {
if (point.y < bounds.top || (point.y + lineHeight) >= bounds.bottom)
ScrollBar(B_VERTICAL)->SetValue(point.y - (bounds.IntegerHeight() / 2));
if (useVert) {
if (point.y < bounds.top) {
ydiff = -1 * (bounds.IntegerHeight() / 2);
// normalize scroll value to prevent scrolling past top of view
if (bounds.top < fabs(ydiff))
ydiff = -1 * bounds.top;
} else if (point.y >= bounds.bottom)
ydiff = bounds.IntegerHeight() / 2;
}
ScrollBy(xdiff, ydiff);
}
@ -4398,8 +4419,7 @@ void
BTextView::HandleInputMethodChanged(BMessage *message)
{
// TODO: block input if not editable (Andrew)
if (!fInline)
return;
ASSERT(fInline != NULL);
const char *string = NULL;
if (message->FindString("be:string", &string) < B_OK || string == NULL)
@ -4470,8 +4490,7 @@ BTextView::HandleInputMethodChanged(BMessage *message)
void
BTextView::HandleInputMethodLocationRequest()
{
if (!fInline)
return;
ASSERT(fInline != NULL);
int32 offset = fInline->Offset();
const int32 limit = offset + fInline->Length();