diff --git a/src/kits/interface/TextView.cpp b/src/kits/interface/TextView.cpp index 5ea17ca241..ca35684849 100644 --- a/src/kits/interface/TextView.cpp +++ b/src/kits/interface/TextView.cpp @@ -2438,16 +2438,16 @@ BTextView::DoesUndo() const void BTextView::HideTyping(bool enabled) { - CALLED(); - //TODO: Implement ? - //fText->SetPasswordMode(enabled); + if (enabled) + Delete(0, fText->Length()); + + fText->SetPasswordMode(enabled); } bool BTextView::IsTypingHidden() const { - CALLED(); return fText->PasswordMode(); } @@ -3636,13 +3636,13 @@ BTextView::DrawLines(int32 startLine, int32 endLine, int32 startOffset, bool era long offset = startOffset != -1 ? startOffset : line->offset; const BFont *font = NULL; const rgb_color *color = NULL; - int32 numChars; + int32 numBytes; // iterate through each style on this line - while ((numChars = fStyles->Iterate(offset, length, fInline, &font, &color)) != 0) { + while ((numBytes = fStyles->Iterate(offset, length, fInline, &font, &color)) != 0) { view->SetFont(font); view->SetHighColor(*color); - tabChars = numChars; + tabChars = numBytes; do { foundTab = fText->FindChar(B_TAB, offset, &tabChars); if (foundTab) { @@ -3650,7 +3650,7 @@ BTextView::DrawLines(int32 startLine, int32 endLine, int32 startOffset, bool era numTabs++; if ((*fText)[offset + tabChars + numTabs] != B_TAB) break; - } while ((tabChars + numTabs) < numChars); + } while ((tabChars + numTabs) < numBytes); } if (inputRegion.CountRects() > 0) { @@ -3680,7 +3680,8 @@ BTextView::DrawLines(int32 startLine, int32 endLine, int32 startOffset, bool era view->PopState(); } - view->DrawString(fText->GetString(offset, tabChars), tabChars); + const char *string = fText->GetString(offset, numBytes); + view->DrawString(string); if (foundTab) { float penPos = PenLocation().x - fTextRect.left; @@ -3695,8 +3696,8 @@ BTextView::DrawLines(int32 startLine, int32 endLine, int32 startOffset, bool era offset += tabChars; length -= tabChars; - numChars -= tabChars; - tabChars = numChars; + numBytes -= tabChars; + tabChars = numBytes; numTabs = 0; } while (foundTab && tabChars > 0); } diff --git a/src/kits/interface/textview_support/TextGapBuffer.cpp b/src/kits/interface/textview_support/TextGapBuffer.cpp index 5f9579d34f..80ff05906c 100644 --- a/src/kits/interface/textview_support/TextGapBuffer.cpp +++ b/src/kits/interface/textview_support/TextGapBuffer.cpp @@ -10,7 +10,10 @@ #include #include +#include + #include +#include // for B_UTF8_BULLET #include "TextGapBuffer.h" @@ -166,15 +169,18 @@ _BTextGapBuffer_::SizeGapTo(long inCount) const char * -_BTextGapBuffer_::GetString(int32 fromOffset, int32 numChars) +_BTextGapBuffer_::GetString(int32 fromOffset, int32 numBytes) { + // numBytes won't necessarily be honored. This function could return more + // bytes than specified (for example when in password mode) + // TODO: Fix this, it's not very nice. char *result = ""; - if (numChars < 1) - return (result); + if (numBytes < 1) + return result; bool isStartBeforeGap = (fromOffset < fGapIndex); - bool isEndBeforeGap = ((fromOffset + numChars - 1) < fGapIndex); + bool isEndBeforeGap = ((fromOffset + numBytes - 1) < fGapIndex); if (isStartBeforeGap == isEndBeforeGap) { result = fBuffer + fromOffset; @@ -182,17 +188,37 @@ _BTextGapBuffer_::GetString(int32 fromOffset, int32 numChars) result += fGapCount; } else { - if (fScratchSize < numChars) { - fScratchBuffer = (char *)realloc(fScratchBuffer, numChars); - fScratchSize = numChars; + if (fScratchSize < numBytes) { + fScratchBuffer = (char *)realloc(fScratchBuffer, numBytes); + fScratchSize = numBytes; } - for (long i = 0; i < numChars; i++) + for (long i = 0; i < numBytes; i++) fScratchBuffer[i] = (*this)[fromOffset + i]; result = fScratchBuffer; } + // TODO: this could be improved. We are overwriting what we did some lines ago, + // we could just avoid to do that. + if (fPasswordMode) { + uint32 numChars = UTF8CountChars(result, numBytes); + uint32 charLen = UTF8CountBytes(B_UTF8_BULLET, 1); + uint32 newSize = numChars * charLen + 1; + if ((uint32)fScratchSize < newSize) { + fScratchBuffer = (char *)realloc(fScratchBuffer, newSize); + fScratchSize = newSize; + } + result = fScratchBuffer; + + char *scratchPtr = result; + for (uint32 i = 0; i < numChars; i++) { + memcpy(scratchPtr, B_UTF8_BULLET, charLen); + scratchPtr += charLen; + } + scratchPtr = '\0'; + } + return result; } @@ -206,7 +232,7 @@ _BTextGapBuffer_::FindChar(char inChar, long fromIndex, long *ioDelta) continue; if ((*this)[fromIndex + i] == inChar) { *ioDelta = i; - return (true); + return true; } }