- Fixed a nasty regression which made the control unusable
- Fixed the "caret looks like a point" bug - More work on the Styling code git-svn-id: file:///srv/svn/repos/haiku/trunk/current@8638 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -227,90 +227,6 @@ _BStyleBuffer_::GetNullStyle(const BFont **font,
|
|||||||
*color = &fNullStyle.color;
|
*color = &fNullStyle.color;
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
bool
|
|
||||||
_BStyleBuffer_::IsContinuousStyle(uint32 *ioMode, STEStylePtr outStyle,
|
|
||||||
int32 fromOffset, int32 toOffset)
|
|
||||||
{
|
|
||||||
if (fStyleRunDesc.ItemCount() < 1) {
|
|
||||||
SetStyle(*ioMode, &fNullStyle.font, &outStyle->font,
|
|
||||||
&fNullStyle.color, &outStyle->color);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool result = true;
|
|
||||||
int32 fromIndex = OffsetToRun(fromOffset);
|
|
||||||
int32 toIndex = OffsetToRun(toOffset - 1);
|
|
||||||
|
|
||||||
if (fromIndex == toIndex) {
|
|
||||||
int32 styleIndex = fStyleRunDesc[fromIndex]->index;
|
|
||||||
STEStylePtr style = &fStyleRecord[styleIndex]->style;
|
|
||||||
|
|
||||||
SetStyle(*ioMode, &style->font, &outStyle->font, &style->color,
|
|
||||||
&outStyle->color);
|
|
||||||
result = true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
int32 styleIndex = fStyleRunDesc[toIndex]->index;
|
|
||||||
STEStyle theStyle = fStyleRecord[styleIndex]->style;
|
|
||||||
//STEStylePtr style = NULL;
|
|
||||||
|
|
||||||
/* for (int32 i = fromIndex; i < toIndex; i++) {
|
|
||||||
styleIndex = fStyleRunDesc[i]->index;
|
|
||||||
style = &fStyleRecord[styleIndex]->style;
|
|
||||||
|
|
||||||
if (*ioMode & doFont) {
|
|
||||||
if (strcmp(theStyle.font, style->font) != 0) {
|
|
||||||
*ioMode &= ~doFont;
|
|
||||||
result = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*ioMode & doSize) {
|
|
||||||
if (theStyle.size != style->size) {
|
|
||||||
*ioMode &= ~doSize;
|
|
||||||
result = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*ioMode & doShear) {
|
|
||||||
if (theStyle.shear != style->shear) {
|
|
||||||
*ioMode &= ~doShear;
|
|
||||||
result = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*ioMode & doUnderline) {
|
|
||||||
if (theStyle.underline != style->underline) {
|
|
||||||
*ioMode &= ~doUnderline;
|
|
||||||
result = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*ioMode & doColor) {
|
|
||||||
if ( (theStyle.color.red != style->color.red) ||
|
|
||||||
(theStyle.color.green != style->color.green) ||
|
|
||||||
(theStyle.color.blue != style->color.blue) ||
|
|
||||||
(theStyle.color.alpha != style->color.alpha) ) {
|
|
||||||
*ioMode &= ~doColor;
|
|
||||||
result = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*ioMode & doExtra) {
|
|
||||||
if (theStyle.extra != style->extra) {
|
|
||||||
*ioMode &= ~doExtra;
|
|
||||||
result = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
SetStyle(*ioMode, &theStyle.font, &outStyle->font, &theStyle.color,
|
|
||||||
&outStyle->color);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
void
|
void
|
||||||
_BStyleBuffer_::SetStyleRange(int32 fromOffset, int32 toOffset,
|
_BStyleBuffer_::SetStyleRange(int32 fromOffset, int32 toOffset,
|
||||||
int32 textLen, uint32 inMode,
|
int32 textLen, uint32 inMode,
|
||||||
@@ -484,9 +400,10 @@ _BStyleBuffer_::Iterate(int32 fromOffset, int32 length, _BInlineInput_ *input,
|
|||||||
const BFont **outFont, const rgb_color **outColor,
|
const BFont **outFont, const rgb_color **outColor,
|
||||||
float *outAscent, float *outDescent, uint32 *) const
|
float *outAscent, float *outDescent, uint32 *) const
|
||||||
{
|
{
|
||||||
|
// TODO: Handle the _BInlineInput_ style here in some way
|
||||||
int32 numRuns = fStyleRunDesc.ItemCount();
|
int32 numRuns = fStyleRunDesc.ItemCount();
|
||||||
if ((length < 1) || (numRuns < 1))
|
if (length < 1 || numRuns < 1)
|
||||||
return (0);
|
return 0;
|
||||||
|
|
||||||
int32 result = length;
|
int32 result = length;
|
||||||
int32 runIndex = fStyleRunDesc.OffsetToRun(fromOffset);
|
int32 runIndex = fStyleRunDesc.OffsetToRun(fromOffset);
|
||||||
@@ -506,6 +423,7 @@ _BStyleBuffer_::Iterate(int32 fromOffset, int32 length, _BInlineInput_ *input,
|
|||||||
result = (result > nextOffset) ? nextOffset : result;
|
result = (result > nextOffset) ? nextOffset : result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
@@ -564,11 +482,105 @@ _BStyleBuffer_::operator[](int32 index) const
|
|||||||
return run;
|
return run;
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
void
|
||||||
/*void _BStyleBuffer_::ContinuousGetStyle(BFont *, uint32 *, rgb_color *, bool *,
|
_BStyleBuffer_::ContinuousGetStyle(BFont *outFont, uint32 *ioMode,
|
||||||
int32, int32) const
|
rgb_color *outColor, bool *sameColor, int32 fromOffset, int32 toOffset) const
|
||||||
{
|
{
|
||||||
}*/
|
uint32 mode = doAll;
|
||||||
|
if (fStyleRunDesc.ItemCount() < 1) {
|
||||||
|
if (ioMode)
|
||||||
|
*ioMode = mode;
|
||||||
|
if (outFont)
|
||||||
|
*outFont = fNullStyle.font;
|
||||||
|
if (outColor)
|
||||||
|
*outColor = fNullStyle.color;
|
||||||
|
if (sameColor)
|
||||||
|
*sameColor = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32 fromIndex = OffsetToRun(fromOffset);
|
||||||
|
int32 toIndex = OffsetToRun(toOffset - 1);
|
||||||
|
|
||||||
|
bool result = true;
|
||||||
|
if (fromIndex == toIndex) {
|
||||||
|
int32 styleIndex = fStyleRunDesc[fromIndex]->index;
|
||||||
|
STEStylePtr style = &fStyleRecord[styleIndex]->style;
|
||||||
|
|
||||||
|
if (ioMode)
|
||||||
|
*ioMode = mode;
|
||||||
|
if (outFont)
|
||||||
|
*outFont = style->font;
|
||||||
|
if (outColor)
|
||||||
|
*outColor = style->color;
|
||||||
|
if (sameColor)
|
||||||
|
*sameColor = true;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
int32 styleIndex = fStyleRunDesc[toIndex]->index;
|
||||||
|
STEStyle theStyle = fStyleRecord[styleIndex]->style;
|
||||||
|
STEStylePtr style = NULL;
|
||||||
|
|
||||||
|
for (int32 i = fromIndex; i < toIndex; i++) {
|
||||||
|
styleIndex = fStyleRunDesc[i]->index;
|
||||||
|
style = &fStyleRecord[styleIndex]->style;
|
||||||
|
|
||||||
|
if (mode & doFont) {
|
||||||
|
if (theStyle.font != style->font) {
|
||||||
|
mode &= ~doFont;
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mode & doSize) {
|
||||||
|
if (theStyle.font.Size() != style->font.Size()) {
|
||||||
|
mode &= ~doSize;
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mode & doShear) {
|
||||||
|
if (theStyle.font.Shear() != style->font.Shear()) {
|
||||||
|
mode &= ~doShear;
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mode & doUnderline) {
|
||||||
|
// if (theStyle.underline != style->font.underline) {
|
||||||
|
mode &= ~doUnderline;
|
||||||
|
// result = false;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mode & doColor) {
|
||||||
|
if ( (theStyle.color.red != style->color.red) ||
|
||||||
|
(theStyle.color.green != style->color.green) ||
|
||||||
|
(theStyle.color.blue != style->color.blue) ||
|
||||||
|
(theStyle.color.alpha != style->color.alpha) ) {
|
||||||
|
mode &= ~doColor;
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mode & doExtra) {
|
||||||
|
// if (theStyle.extra != style->font.extra) {
|
||||||
|
mode &= ~doExtra;
|
||||||
|
// result = false;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ioMode)
|
||||||
|
*ioMode = mode;
|
||||||
|
if (outFont)
|
||||||
|
*outFont = theStyle.font;
|
||||||
|
if (outColor)
|
||||||
|
*outColor = theStyle.color;
|
||||||
|
if (sameColor)
|
||||||
|
*sameColor = result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log $
|
* $Log $
|
||||||
|
|||||||
@@ -139,13 +139,13 @@ public:
|
|||||||
void GetNullStyle(const BFont **font,
|
void GetNullStyle(const BFont **font,
|
||||||
const rgb_color **color) const;
|
const rgb_color **color) const;
|
||||||
|
|
||||||
bool IsContinuousStyle(uint32 *ioMode, STEStylePtr outStyle,
|
|
||||||
int32 fromOffset, int32 toOffset);
|
|
||||||
void SetStyleRange(int32 fromOffset, int32 toOffset,
|
void SetStyleRange(int32 fromOffset, int32 toOffset,
|
||||||
int32 textLen, uint32 inMode,
|
int32 textLen, uint32 inMode,
|
||||||
const BFont *inFont, const rgb_color *inColor);
|
const BFont *inFont, const rgb_color *inColor);
|
||||||
void GetStyle(int32 inOffset, BFont *outFont,
|
void GetStyle(int32 inOffset, BFont *outFont,
|
||||||
rgb_color *outColor) const;
|
rgb_color *outColor) const;
|
||||||
|
void ContinuousGetStyle(BFont *, uint32 *, rgb_color *,
|
||||||
|
bool *, int32, int32) const;
|
||||||
STEStyleRangePtr GetStyleRange(int32 startOffset, int32 endOffset) const;
|
STEStyleRangePtr GetStyleRange(int32 startOffset, int32 endOffset) const;
|
||||||
|
|
||||||
void RemoveStyleRange(int32 fromOffset, int32 toOffset);
|
void RemoveStyleRange(int32 fromOffset, int32 toOffset);
|
||||||
|
|||||||
@@ -1610,6 +1610,8 @@ BTextView::SetFontAndColor(int32 startOffset, int32 endOffset,
|
|||||||
const rgb_color *inColor)
|
const rgb_color *inColor)
|
||||||
{
|
{
|
||||||
CALLED();
|
CALLED();
|
||||||
|
printf("SetFontAndColor(%ld, %ld, %p, mode: 0x%x, %p)\n",
|
||||||
|
startOffset, endOffset, inFont, inMode, inColor);
|
||||||
// hide the caret/unhilite the selection
|
// hide the caret/unhilite the selection
|
||||||
if (fActive) {
|
if (fActive) {
|
||||||
if (startOffset != endOffset)
|
if (startOffset != endOffset)
|
||||||
@@ -1660,12 +1662,9 @@ BTextView::GetFontAndColor(BFont *outFont, uint32 *outMode,
|
|||||||
rgb_color *outColor, bool *outEqColor) const
|
rgb_color *outColor, bool *outEqColor) const
|
||||||
{
|
{
|
||||||
CALLED();
|
CALLED();
|
||||||
// TODO fill in outMode and outEqColor
|
|
||||||
fStyles->GetStyle(fSelStart, outFont, outColor);
|
|
||||||
|
|
||||||
// TODO: This is a hack to make beshare work.
|
fStyles->ContinuousGetStyle(outFont, outMode, outColor, outEqColor,
|
||||||
// We should use _BStyleBuffer_::ContinuousGetStyle() here.
|
fSelStart, fSelEnd);
|
||||||
*outMode = doSize;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1781,43 +1780,57 @@ BTextView::PointAt(int32 inOffset, float *outHeight) const
|
|||||||
BPoint result;
|
BPoint result;
|
||||||
int32 textLength = fText->Length();
|
int32 textLength = fText->Length();
|
||||||
int32 lineNum = LineAt(inOffset);
|
int32 lineNum = LineAt(inOffset);
|
||||||
|
|
||||||
// TODO: This looks broken. line + 1 could go outside the line buffer
|
|
||||||
STELinePtr line = (*fLines)[lineNum];
|
STELinePtr line = (*fLines)[lineNum];
|
||||||
float height = (line + 1)->origin - line->origin;
|
float height = 0;
|
||||||
|
|
||||||
result.x = 0.0;
|
result.x = 0.0;
|
||||||
result.y = line->origin + fTextRect.top;
|
result.y = line->origin + fTextRect.top;
|
||||||
|
|
||||||
// special case: go down one line if inOffset is a newline
|
// Handle the case where there is only one line
|
||||||
if (inOffset == textLength && (*fText)[textLength - 1] == '\n') {
|
// (no text inserted)
|
||||||
float ascent, descent;
|
// TODO: See if we can do this better
|
||||||
StyledWidth(inOffset, 1, &ascent, &descent);
|
if (fStyles->NumRuns() == 0) {
|
||||||
|
const rgb_color *color = NULL;
|
||||||
|
const BFont *font = NULL;
|
||||||
|
fStyles->GetNullStyle(&font, &color);
|
||||||
|
|
||||||
result.y += height;
|
font_height fontHeight;
|
||||||
height = ascent + descent;
|
font->GetHeight(&fontHeight);
|
||||||
|
height = fontHeight.ascent + fontHeight.descent;
|
||||||
} else {
|
|
||||||
int32 offset = line->offset;
|
|
||||||
int32 length = inOffset - line->offset;
|
|
||||||
int32 numChars = length;
|
|
||||||
bool foundTab = false;
|
|
||||||
do {
|
|
||||||
foundTab = fText->FindChar(B_TAB, offset, &numChars);
|
|
||||||
|
|
||||||
result.x += StyledWidth(offset, numChars);
|
} else {
|
||||||
|
height = (line + 1)->origin - line->origin;
|
||||||
|
|
||||||
if (foundTab) {
|
// special case: go down one line if inOffset is a newline
|
||||||
result.x += ActualTabWidth(result.x);
|
if (inOffset == textLength && (*fText)[textLength - 1] == '\n') {
|
||||||
numChars++;
|
float ascent, descent;
|
||||||
}
|
StyledWidth(inOffset, 1, &ascent, &descent);
|
||||||
|
|
||||||
offset += numChars;
|
result.y += height;
|
||||||
length -= numChars;
|
height = ascent + descent;
|
||||||
numChars = length;
|
|
||||||
} while (foundTab && length > 0);
|
} else {
|
||||||
}
|
int32 offset = line->offset;
|
||||||
|
int32 length = inOffset - line->offset;
|
||||||
|
int32 numChars = length;
|
||||||
|
bool foundTab = false;
|
||||||
|
do {
|
||||||
|
foundTab = fText->FindChar(B_TAB, offset, &numChars);
|
||||||
|
|
||||||
|
result.x += StyledWidth(offset, numChars);
|
||||||
|
|
||||||
|
if (foundTab) {
|
||||||
|
result.x += ActualTabWidth(result.x);
|
||||||
|
numChars++;
|
||||||
|
}
|
||||||
|
|
||||||
|
offset += numChars;
|
||||||
|
length -= numChars;
|
||||||
|
numChars = length;
|
||||||
|
} while (foundTab && length > 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// convert from text rect coordinates
|
// convert from text rect coordinates
|
||||||
result.x += fTextRect.left - 1.0;
|
result.x += fTextRect.left - 1.0;
|
||||||
|
|
||||||
@@ -1888,7 +1901,7 @@ BTextView::OffsetAt(BPoint point) const
|
|||||||
foundTab = fText->FindChar(B_TAB, offset, &numChars);
|
foundTab = fText->FindChar(B_TAB, offset, &numChars);
|
||||||
|
|
||||||
delta = numChars / 2;
|
delta = numChars / 2;
|
||||||
delta = min_c(delta, 1);
|
delta = max_c(delta, 1);
|
||||||
|
|
||||||
if (numChars > 1) {
|
if (numChars > 1) {
|
||||||
do {
|
do {
|
||||||
@@ -1908,7 +1921,7 @@ BTextView::OffsetAt(BPoint point) const
|
|||||||
// still too far to the left, measure some more
|
// still too far to the left, measure some more
|
||||||
offset += delta;
|
offset += delta;
|
||||||
delta /= 2;
|
delta /= 2;
|
||||||
delta = min_c(delta, 1);
|
delta = max_c(delta, 1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// oops, we overshot the point, go back some
|
// oops, we overshot the point, go back some
|
||||||
@@ -3038,13 +3051,17 @@ BTextView::HandlePageKey(uint32 inPageKey)
|
|||||||
|
|
||||||
case B_PAGE_UP:
|
case B_PAGE_UP:
|
||||||
case B_PAGE_DOWN:
|
case B_PAGE_DOWN:
|
||||||
// TODO: Fix this
|
|
||||||
{
|
{
|
||||||
if (ScrollBar(B_VERTICAL) != NULL) {
|
int32 currentOffset = OffsetAt(fClickOffset);
|
||||||
float delta = Bounds().Height();
|
float delta = Bounds().Height();
|
||||||
delta = (inPageKey == B_PAGE_UP) ? -delta : delta;
|
delta = (inPageKey == B_PAGE_UP) ? -delta : delta;
|
||||||
|
|
||||||
|
if (ScrollBar(B_VERTICAL) != NULL)
|
||||||
ScrollBar(B_VERTICAL)->SetValue(ScrollBar(B_VERTICAL)->Value() + delta);
|
ScrollBar(B_VERTICAL)->SetValue(ScrollBar(B_VERTICAL)->Value() + delta);
|
||||||
}
|
|
||||||
|
// TODO: Selection
|
||||||
|
GoToLine(LineAt(PointAt(currentOffset + delta)));
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user