Added ref counting for nsIContent, made selection rendering changes

git-svn-id: svn://10.0.0.236/trunk@7162 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
rods%netscape.com
1998-08-03 22:23:32 +00:00
parent 7abd0f037e
commit 339fff0c28

View File

@@ -46,7 +46,7 @@
#include "nsSelectionRange.h"
#define CALC_DEBUG 0
//#define DO_SELECTION 0
//#define DO_SELECTION 1
@@ -667,8 +667,8 @@ TextFrame::PaintRegularText(nsIPresContext& aPresContext,
nscoord dx, nscoord dy)
{
// Get Selection Object
nsIPresShell * shell = aPresContext.GetShell();
nsIDocument * doc = shell->GetDocument();
nsIPresShell * shell = aPresContext.GetShell();
nsIDocument * doc = shell->GetDocument();
if (doc->GetDisplaySelection() == PR_FALSE)
@@ -840,12 +840,14 @@ TextFrame::PaintRegularText(nsIPresContext& aPresContext,
nsSelectionPoint * startPnt = range->GetStartPoint();
nsSelectionPoint * endPnt = range->GetEndPoint();
nsIContent * startContent = startPnt->GetContent();
nsIContent * endContent = endPnt->GetContent();
PRBool startEndInSameContent;
// This is a little more optimized,
// Check to see if the start and end points are in the same content
if (mContent == startPnt->GetContent() &&
mContent == endPnt->GetContent()) {
if (mContent == startContent && mContent == endContent) {
startEndInSameContent = PR_TRUE; // If this gets set to TRUE then we get to skip the IsInRange check
// The Start & End contents are the same
@@ -870,6 +872,11 @@ TextFrame::PaintRegularText(nsIPresContext& aPresContext,
aRenderingContext.DrawLine(textLen, 0, textLen, mRect.height);
NS_RELEASE(fm);
}
NS_IF_RELEASE(startContent);
NS_IF_RELEASE(endContent);
NS_IF_RELEASE(selection);
NS_RELEASE(doc);
NS_RELEASE(shell);
return;
}
} else {
@@ -877,7 +884,7 @@ TextFrame::PaintRegularText(nsIPresContext& aPresContext,
}
if (startEndInSameContent || doc->IsInRange(range->GetStartContent(), range->GetEndContent(), mContent)) {
if (startEndInSameContent || doc->IsInRange(startContent, endContent, mContent)) {
nsIFontMetrics * fm = aRenderingContext.GetFontMetrics();
PRInt32 startOffset = startPnt->GetOffset() - mContentOffset;
@@ -896,7 +903,15 @@ TextFrame::PaintRegularText(nsIPresContext& aPresContext,
strncpy(buf, compressedStr, compressedStrLen);
buf[compressedStrLen] = 0;
printf("2 - Drawing [%s] at [%d,%d,%d,%d]\n", buf, rect.x, rect.y, rect.width, rect.height);
if (strstr(buf, "size=4")) {
if (strstr(buf, "Example")) {
int xx = 0;
xx++;
}
if (strstr(buf, "basic4")) {
int xx = 0;
xx++;
}
if (strstr(buf, "font5")) {
int xx = 0;
xx++;
}
@@ -917,52 +932,75 @@ TextFrame::PaintRegularText(nsIPresContext& aPresContext,
// and draw from the beginning to where the selection starts
//---------------------------------------------------
nsString textStr;
nscoord startTwipLen = 0;
PRUint32 selTextCharLen = endPnt->GetOffset()-startPnt->GetOffset();
nscoord startTwipLen = 0;
nscoord endCoord;
nscoord startCoord;
if (startPnt->GetOffset() > mContentOffset) {
textStr.Append(compressedStr, startPnt->GetOffset());
startTwipLen = fm->GetWidth(textStr);
aRenderingContext.DrawString(compressedStr, startPnt->GetOffset(), dx, dy, startTwipLen);
PRBool skip = PR_FALSE;
if (startPnt->GetOffset() > mContentOffset+mContentLength) {
startCoord = 0;
skip = PR_TRUE;
} else if (startPnt->GetOffset() <= mContentOffset) {
startCoord = 0;
} else {
startCoord = startPnt->GetOffset() - mContentOffset;
}
if (endPnt->GetOffset() > mContentOffset+mContentLength) {
endCoord = mContentLength;
} else if (endPnt->GetOffset() <= mContentOffset) {
endCoord = mContentLength;
skip = PR_TRUE;
} else {
endCoord = endPnt->GetOffset() - mContentOffset;
}
PRUint32 selTextCharLen = endCoord - startCoord;
if (startCoord > 0) {
textStr.Append(compressedStr, startCoord);
startTwipLen = fm->GetWidth(textStr);
aRenderingContext.DrawString(compressedStr, startCoord, dx, dy, startTwipLen);
}
//---------------------------------------------------
// Calc the starting point of the Selection and
// and draw the selected text
//---------------------------------------------------
textStr.SetLength(0);
textStr.Append(compressedStr+startPnt->GetOffset(), selTextCharLen);
textStr.Append(compressedStr+startCoord, selTextCharLen);
nscoord selTextTwipLen = fm->GetWidth(textStr);
rect.x = startTwipLen;
rect.width = selTextTwipLen;
// Render Selected Text
aRenderingContext.SetColor(NS_RGB(0,0,0));
aRenderingContext.FillRect(rect);
if (!skip) {
// Render Selected Text
aRenderingContext.SetColor(NS_RGB(0,0,0));
aRenderingContext.FillRect(rect);
aRenderingContext.SetColor(NS_RGB(255,255,255));
// Render the text in White
aRenderingContext.DrawString(compressedStr+startPnt->GetOffset(), selTextCharLen,
// Render the text in White
aRenderingContext.SetColor(NS_RGB(255,255,255));
}
aRenderingContext.DrawString(compressedStr+startCoord, selTextCharLen,
dx+startTwipLen, dy, selTextTwipLen);
//---------------------------------------------------
// Calc the end point of the Selection and
// and draw the remaining text
//---------------------------------------------------
if (endPnt->GetOffset() < (PRInt32)compressedStrLen) {
if (endCoord < (PRInt32)compressedStrLen && !skip) {
textStr.SetLength(0);
textStr.Append(compressedStr+endPnt->GetOffset(), compressedStrLen-selTextCharLen);
textStr.Append(compressedStr+endCoord, compressedStrLen-selTextCharLen);
PRUint32 endTextTwipLen = fm->GetWidth(textStr);
aRenderingContext.SetColor(color->mColor);
aRenderingContext.DrawString(compressedStr+endPnt->GetOffset(), compressedStrLen-endPnt->GetOffset(),
aRenderingContext.DrawString(compressedStr+endCoord, compressedStrLen-endCoord,
dx+startTwipLen+selTextTwipLen, dy, mRect.width-endTextTwipLen);
}
} else if (mContent == startPnt->GetContent()) {
} else if (mContent == startContent) {
if (startPnt->GetOffset() > mContentOffset &&
startPnt->GetOffset() < mContentOffset+mContentLength) {
@@ -1007,12 +1045,19 @@ TextFrame::PaintRegularText(nsIPresContext& aPresContext,
aRenderingContext.DrawString(compressedStr+startOffset, selTextCharLen,
dx+startTwipLen, dy, selTextTwipLen);
} else {
// Render the text Normal
const nsStyleColor* color = (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color);
aRenderingContext.SetColor(color->mColor);
aRenderingContext.SetColor(NS_RGB(0,0,0));
aRenderingContext.FillRect(rect);
aRenderingContext.SetColor(NS_RGB(255,255,255));
// Render the text in White
aRenderingContext.DrawString(compressedStr, compressedStrLen, dx, dy, mRect.width);
// Render the text Normal
//const nsStyleColor* color = (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color);
//aRenderingContext.SetColor(color->mColor);
//aRenderingContext.DrawString(compressedStr, compressedStrLen, dx, dy, mRect.width);
}
} else if (mContent == endPnt->GetContent()) {
} else if (mContent == endContent) {
if (endPnt->GetOffset() > mContentOffset &&
endPnt->GetOffset() < mContentOffset+mContentLength) {
@@ -1073,6 +1118,10 @@ TextFrame::PaintRegularText(nsIPresContext& aPresContext,
aRenderingContext.SetColor(NS_RGB(0,0,0));
aRenderingContext.FillRect(rect);
if (strstr(compressedStr, "size=4")) {
int xx = 0;
}
aRenderingContext.SetColor(NS_RGB(255,255,255));
// Render the text
aRenderingContext.DrawString(compressedStr, compressedStrLen, dx, dy, mRect.width);
@@ -1091,6 +1140,9 @@ TextFrame::PaintRegularText(nsIPresContext& aPresContext,
*/
NS_RELEASE(fm);
} else {
if (strstr(compressedStr, "size=4")) {
int xx = 0;
}
// Render the text
const nsStyleColor* color = (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color);
aRenderingContext.SetColor(color->mColor);
@@ -1100,6 +1152,10 @@ TextFrame::PaintRegularText(nsIPresContext& aPresContext,
if (delCompressedStr) {
delete compressedStr;
}
//printf("startContent %d\n", startContent?startContent->Release():-1);
//printf("endContent %d\n", endContent?endContent->Release():-1);
NS_IF_RELEASE(startContent);
NS_IF_RELEASE(endContent);
NS_RELEASE(shell);
NS_RELEASE(doc);
NS_RELEASE(selection);
@@ -1457,8 +1513,8 @@ PRInt32 TextFrame::GetPosition(nsIPresContext& aCX,
PRInt32 offset;
PRInt32 width;
CalcCursorPosition(aCX, aEvent, (TextFrame *)aNewFrame, offset, width);
aAcutalContentOffset = ((TextFrame *)aNewFrame)->GetContentOffset();;
offset += aAcutalContentOffset;
aAcutalContentOffset = ((TextFrame *)aNewFrame)->GetContentOffset();
//offset += aAcutalContentOffset;
return offset;
}
@@ -1661,12 +1717,29 @@ nsresult Text::QueryInterface(const nsIID& aIID, void** aInstancePtr)
nsrefcnt Text::AddRef(void)
{
return nsHTMLContent::AddRef();
/*nsAutoString tmp;
ToCString(tmp, 0, mLength);
char * str = tmp.ToNewCString();
if (strlen(str) > 10) {
str[10] = 0;
}
if (strstr(str, "Example")) {
int x = 0;
}
printf("%-8s AddRef RefCnt=%d<\n", str, mRefCnt);*/
nsrefcnt count = nsHTMLContent::AddRef();
/*printf("%-8s Current RefCnt=%d<\n", str, mRefCnt);
if (str) {
delete str;
}*/
return count;
}
nsrefcnt Text::Release(void)
{
return nsHTMLContent::Release();
nsrefcnt count = nsHTMLContent::Release();
return count;
}
void Text::List(FILE* out, PRInt32 aIndent) const
@@ -1738,7 +1811,7 @@ void Text::ConvertContentToXIF(nsXIFConverter& aConverter) const
nsSelectionPoint* endPoint = range->GetEndPoint();
nsIContent* startContent = startPoint->GetContent();
nsIContent* endContent = endPoint->GetContent();
nsIContent* endContent = endPoint->GetContent();
PRInt32 startOffset = startPoint->GetOffset();
PRInt32 endOffset = endPoint->GetOffset();
@@ -1757,8 +1830,11 @@ void Text::ConvertContentToXIF(nsXIFConverter& aConverter) const
buffer.Cut(0,startOffset);
}
aConverter.AddContent(buffer);
NS_IF_RELEASE(startContent);
NS_IF_RELEASE(endContent);
}
}
NS_RELEASE(sel);
}
else
{