From 660a04f377b56da10bfe00ccbbb8af0924505f31 Mon Sep 17 00:00:00 2001 From: Stefano Ceccherini Date: Wed, 28 Jul 2004 08:33:28 +0000 Subject: [PATCH] Fixed some refresh bug I introduced in one of the latest commits. "Where are those millions open source code reviewers when you need them?". Word wrapping should work again. Some small style changes. Added some more TODO items and some comments. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@8491 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/interface/BTextView/TextView.cpp | 106 +++++++++++++--------- 1 file changed, 65 insertions(+), 41 deletions(-) diff --git a/src/kits/interface/BTextView/TextView.cpp b/src/kits/interface/BTextView/TextView.cpp index f2d35207bc..04ee4d231d 100644 --- a/src/kits/interface/BTextView/TextView.cpp +++ b/src/kits/interface/BTextView/TextView.cpp @@ -31,6 +31,8 @@ // - Consider using BObjectList instead of BList // for disallowed charachters (it would remove a lot of reinterpret_casts) // - Asynchronous mouse tracking +// - Check for correctness and possible optimizations the calls to Refresh(), +// to refresh only changed parts of text (currently we often redraw the whole text) // Standard Includes ----------------------------------------------------------- #include @@ -101,6 +103,8 @@ enum { class _BTextTrackState_ { // TODO: Implement ? + // It's most probably used to keep track of asynchronous mouse + // movements public: _BTextTrackState_(bool inSelection) : fMoved(false), @@ -112,7 +116,12 @@ public: }; -// Globals --------------------------------------------------------------------- +// Initialized/finalized by init/fini_interface_kit +_BWidthBuffer_* BTextView::sWidths = NULL; +sem_id BTextView::sWidthSem = B_BAD_SEM_ID; +int32 BTextView::sWidthAtom = 0; + + static property_info sPropertyList[] = { { @@ -168,12 +177,6 @@ sPropertyList[] = { }; -// Initialized/finalized by init/fini_interface_kit -_BWidthBuffer_* BTextView::sWidths = NULL; -sem_id BTextView::sWidthSem = B_BAD_SEM_ID; -int32 BTextView::sWidthAtom = 0; - - BTextView::BTextView(BRect frame, const char *name, BRect textRect, uint32 resizeMask, uint32 flags) : BView(frame, name, resizeMask, @@ -995,7 +998,7 @@ BTextView::SetText(const char *inText, const text_run_array *inRuns) if (fText->Length() > 0) DeleteText(0, fText->Length()); // TODO: was fText->Length() - 1 - int len = (inText) ? strlen(inText) : 0; + int32 len = inText ? strlen(inText) : 0; if (inText != NULL && len > 0) InsertText(inText, len, 0, inRuns); @@ -2143,7 +2146,7 @@ BTextView::SetTextRect(BRect rect) fTextRect = rect; if (Window() != NULL) - Refresh(0, fLines->NumLines(), true, false); + Refresh(0, fText->Length(), true, false); } @@ -2186,7 +2189,7 @@ BTextView::SetTabWidth(float width) fTabWidth = width; if (Window() != NULL) - Refresh(0, fLines->NumLines(), true, false); + Refresh(0, fText->Length(), true, false); } @@ -2296,7 +2299,7 @@ BTextView::SetWordWrap(bool wrap) } } - Refresh(0, fLines->NumLines(), true, false); + Refresh(0, fText->Length(), true, true); if (fActive) { // show the caret, hilite the selection @@ -2320,14 +2323,19 @@ BTextView::DoesWordWrap() const CALLED(); return fWrap; } -//------------------------------------------------------------------------------ + + void BTextView::SetMaxBytes(int32 max) { CALLED(); + // TODO: Finish this: + // We probably have to check if the existing text is longer than the new + // fMaxBytes, and truncate if it's the case fMaxBytes = max; } -//------------------------------------------------------------------------------ + + int32 BTextView::MaxBytes() const { @@ -2363,7 +2371,8 @@ BTextView::AllowChar(uint32 aChar) if (fDisallowedChars != NULL) fDisallowedChars->RemoveItem(reinterpret_cast(aChar)); } -//------------------------------------------------------------------------------ + + void BTextView::SetAlignment(alignment flag) { @@ -2381,21 +2390,24 @@ BTextView::SetAlignment(alignment flag) } } } -//------------------------------------------------------------------------------ + + alignment BTextView::Alignment() const { CALLED(); return fAlignment; } -//------------------------------------------------------------------------------ + + void BTextView::SetAutoindent(bool state) { CALLED(); fAutoindent = state; } -//------------------------------------------------------------------------------ + + bool BTextView::DoesAutoindent() const { @@ -2428,7 +2440,8 @@ BTextView::ColorSpace() const CALLED(); return fColorSpace; } -//------------------------------------------------------------------------------ + + void BTextView::MakeResizable(bool resize, BView *resizeView) { @@ -2447,7 +2460,7 @@ BTextView::MakeResizable(bool resize, BView *resizeView) else if (fCaretVisible) { InvertCaret(); - Refresh(0, fLines->NumLines(), true, false); + Refresh(0, fText->Length(), true, false); } } } @@ -2459,33 +2472,38 @@ BTextView::MakeResizable(bool resize, BView *resizeView) NewOffscreen(); } } -//------------------------------------------------------------------------------ + + bool BTextView::IsResizable() const { CALLED(); return fResizable; } -//------------------------------------------------------------------------------ + + void BTextView::SetDoesUndo(bool undo) { CALLED(); if (undo && fUndo == NULL) fUndo = new _BUndoBuffer_(this, B_UNDO_UNAVAILABLE); + else if (!undo && fUndo != NULL) { delete fUndo; fUndo = NULL; } } -//------------------------------------------------------------------------------ + + bool BTextView::DoesUndo() const { CALLED(); return fUndo != NULL; } -//------------------------------------------------------------------------------ + + void BTextView::HideTyping(bool enabled) { @@ -2493,14 +2511,16 @@ BTextView::HideTyping(bool enabled) //TODO: Implement ? //fText->SetPasswordMode(enabled); } -//------------------------------------------------------------------------------ + + bool BTextView::IsTypingHidden() const { CALLED(); return fText->PasswordMode(); } -//------------------------------------------------------------------------------ + + void BTextView::ResizeToPreferred() { @@ -2509,28 +2529,32 @@ BTextView::ResizeToPreferred() GetPreferredSize(&widht, &height); BView::ResizeTo(widht, height); } -//------------------------------------------------------------------------------ + + void BTextView::GetPreferredSize(float *width, float *height) { CALLED(); BView::GetPreferredSize(width, height); } -//------------------------------------------------------------------------------ + + void BTextView::AllAttached() { CALLED(); BView::AllAttached(); } -//------------------------------------------------------------------------------ + + void BTextView::AllDetached() { CALLED(); BView::AllDetached(); } -//------------------------------------------------------------------------------ + + void * BTextView::FlattenRunArray(const text_run_array *inArray, int32 *outSize) { @@ -2573,7 +2597,8 @@ BTextView::FlattenRunArray(const text_run_array *inArray, int32 *outSize) return array; } -//------------------------------------------------------------------------------ + + text_run_array * BTextView::UnflattenRunArray(const void *data, int32 *outSize) { @@ -2694,7 +2719,8 @@ BTextView::GetDragParameters(BMessage *drag, BBitmap **bitmap, if (drag == NULL) return; - // What is this for ? + // Add originator and action + drag->AddPointer("be:originator", this); drag->AddInt32("be_actions", B_TRASH_TARGET); // add the text @@ -2708,9 +2734,6 @@ BTextView::GetDragParameters(BMessage *drag, BBitmap **bitmap, drag->AddData("application/x-vnd.Be-text_run_array", B_MIME_TYPE, styles, size); - // add the message originator - drag->AddPointer("be:originator", this); - free(styles); if (bitmap != NULL) @@ -3467,6 +3490,8 @@ void BTextView::DrawLines(int32 startLine, int32 endLine, int32 startOffset, bool erase) { + // TODO: Draw on the "fOffscreen" BBitmap, then draw it on the view + CALLED(); // clip the text BRect clipRect = Bounds() & fTextRect; @@ -4034,7 +4059,7 @@ BTextView::PreviousInitialByte(int32 offset) const { CALLED(); const char *text = Text(); - int count = 6; + int32 count = 6; for (--offset; (text + offset) > text && count; --offset, --count) { if ((*(text + offset) & 0xc0 ) != 0x80) @@ -4060,12 +4085,11 @@ BTextView::GetProperty(BMessage *specifier, int32 form, } else if (strcmp(property, "Text") == 0) { int32 index, range; - char *buffer; - + specifier->FindInt32("index", &index); specifier->FindInt32("range", &range); - buffer = new char[range + 1]; + char *buffer = new char[range + 1]; GetText(index, range, buffer); reply->what = B_REPLY; @@ -4102,11 +4126,11 @@ BTextView::SetProperty(BMessage *specifier, int32 form, } else if (strcmp(property, "Text") == 0) { int32 index, range; - const char *buffer; - + specifier->FindInt32("index", &index); specifier->FindInt32("range", &range); + const char *buffer = NULL; if (specifier->FindString("data", &buffer) == B_OK) InsertText(buffer, range, index, NULL); else @@ -4175,7 +4199,7 @@ BTextView::HandleInputMethodChanged(BMessage *message) fSelStart += stringLen; fClickOffset = fSelEnd = fSelStart; - Refresh(0, fLines->NumLines(), true, false); + Refresh(0, fSelEnd, true, false); // If we find the "be:confirmed" boolean (and the boolean is true), // it means it's over for now, so the current _BInlineInput_ object