sr= waterson r= kin bug 26831 table cell selection changed to use borders not background.

This commit is contained in:
mjudge%netscape.com 2001-05-03 23:57:08 +00:00
parent a6458cda9e
commit eb8e69ab3e
4 changed files with 272 additions and 76 deletions

View File

@ -232,6 +232,129 @@ nsresult nsTableCellFrame::SetColIndex(PRInt32 aColIndex)
return rv;
}
//ASSURE DIFFERENT COLORS for selection
inline nscolor EnsureDifferentColors(nscolor colorA, nscolor colorB)
{
if (colorA == colorB)
{
nscolor res;
res = NS_RGB(NS_GET_R(colorA) ^ 0xff,
NS_GET_G(colorA) ^ 0xff,
NS_GET_B(colorA) ^ 0xff);
return res;
}
return colorA;
}
#ifdef OLD_TABLE_SELECTION
const nsStyleColor *
nsTableCellFrame::GetColorStyleFromSelection(const nsStyleColor *aStyleColor)
{
PRInt16 displaySelection;
const nsStyleColor *retval = aStyleColor;
displaySelection = DisplaySelection(aPresContext);
if (displaySelection) {
nsFrameState frameState;
PRBool isSelected;
GetFrameState(&frameState);
isSelected = (frameState & NS_FRAME_SELECTED_CONTENT) == NS_FRAME_SELECTED_CONTENT;
if (isSelected) {
nsCOMPtr<nsIPresShell> shell;
nsresult result = aPresContext->GetShell(getter_AddRefs(shell));
if (NS_FAILED(result))
return result;
nsCOMPtr<nsIFrameSelection> frameSelection;
result = shell->GetFrameSelection(getter_AddRefs(frameSelection));
if (NS_SUCCEEDED(result)) {
PRBool tableCellSelectionMode;
result = frameSelection->GetTableCellSelection(&tableCellSelectionMode);
if (NS_SUCCEEDED(result) && tableCellSelectionMode) {
frameSelection->GetTableCellSelectionStyleColor(&retval);
if(displaySelection == nsISelectionController::SELECTION_DISABLED) {
((nsStyleColor *)retval)->mBackgroundColor = NS_RGB(176,176,176);// disabled color
}
else {
nsILookAndFeel* look = nsnull;
if (NS_SUCCEEDED(aPresContext->GetLookAndFeel(&look)) && look) {
look->GetColor(nsILookAndFeel::eColor_TextSelectBackground, ((nsStyleColor *)retval)->mBackgroundColor);
NS_RELEASE(look);
}
}
}
}
}
}
return retval;
}
#else //OLD_TABLE_SELECTION
nsresult
nsTableCellFrame::DecorateForSelection(nsIPresContext* aPresContext,
nsIRenderingContext& aRenderingContext,
const nsStyleColor *aStyleColor)
{
PRInt16 displaySelection;
displaySelection = DisplaySelection(aPresContext);
if (displaySelection) {
nsFrameState frameState;
PRBool isSelected;
GetFrameState(&frameState);
isSelected = (frameState & NS_FRAME_SELECTED_CONTENT) == NS_FRAME_SELECTED_CONTENT;
if (isSelected) {
nsCOMPtr<nsIPresShell> shell;
nsresult result = aPresContext->GetShell(getter_AddRefs(shell));
if (NS_FAILED(result))
return result;
nsCOMPtr<nsIFrameSelection> frameSelection;
result = shell->GetFrameSelection(getter_AddRefs(frameSelection));
if (NS_SUCCEEDED(result)) {
PRBool tableCellSelectionMode;
result = frameSelection->GetTableCellSelection(&tableCellSelectionMode);
if (NS_SUCCEEDED(result) && tableCellSelectionMode) {
nscolor bordercolor;
if(displaySelection == nsISelectionController::SELECTION_DISABLED) {
bordercolor = NS_RGB(176,176,176);// disabled color
}
else {
nsILookAndFeel* look = nsnull;
if (NS_SUCCEEDED(aPresContext->GetLookAndFeel(&look)) && look) {
look->GetColor(nsILookAndFeel::eColor_TextSelectBackground, bordercolor);
NS_RELEASE(look);
}
}
float t2pfloat;
if (NS_SUCCEEDED(aPresContext->GetPixelsToTwips(&t2pfloat)))
{
PRInt16 t2p = (PRInt16)t2pfloat;
if ((mRect.width >(3*t2p)) && (mRect.height > (3*t2p)))
{
//compare bordercolor to ((nsStyleColor *)myColor)->mBackgroundColor)
bordercolor = EnsureDifferentColors(bordercolor, aStyleColor->mBackgroundColor);
//outerrounded
aRenderingContext.SetColor(bordercolor);
aRenderingContext.DrawLine(t2p, 0, mRect.width, 0);
aRenderingContext.DrawLine(0, t2p, 0, mRect.height);
aRenderingContext.DrawLine(t2p, mRect.height, mRect.width, mRect.height);
aRenderingContext.DrawLine(mRect.width, t2p, mRect.width, mRect.height);
//middle
aRenderingContext.DrawRect(t2p, t2p, mRect.width-t2p, mRect.height-t2p);
//shading
aRenderingContext.DrawLine(2*t2p, mRect.height-2*t2p, mRect.width-t2p, mRect.height- (2*t2p));
aRenderingContext.DrawLine(mRect.width - (2*t2p), 2*t2p, mRect.width - (2*t2p), mRect.height-t2p);
}
}
}
}
}
}
return NS_OK;
}
#endif //OLD_TABLE_SELECTION
NS_METHOD nsTableCellFrame::Paint(nsIPresContext* aPresContext,
nsIRenderingContext& aRenderingContext,
const nsRect& aDirtyRect,
@ -243,52 +366,20 @@ NS_METHOD nsTableCellFrame::Paint(nsIPresContext* aPresContext,
}
const nsStyleDisplay* disp =
(const nsStyleDisplay*)mStyleContext->GetStyleData(eStyleStruct_Display);
if (NS_FRAME_PAINT_LAYER_BACKGROUND == aWhichLayer) {
if (disp->IsVisibleOrCollapsed()) {
const nsStyleColor* myColor =
(const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color);
//TABLECELL SELECTION
PRInt16 displaySelection;
displaySelection = DisplaySelection(aPresContext);
if (displaySelection) {
nsFrameState frameState;
PRBool isSelected;
GetFrameState(&frameState);
isSelected = (frameState & NS_FRAME_SELECTED_CONTENT) == NS_FRAME_SELECTED_CONTENT;
if (isSelected) {
nsCOMPtr<nsIPresShell> shell;
nsresult result = aPresContext->GetShell(getter_AddRefs(shell));
if (NS_FAILED(result))
return result;
nsCOMPtr<nsIFrameSelection> frameSelection;
result = shell->GetFrameSelection(getter_AddRefs(frameSelection));
if (NS_SUCCEEDED(result)) {
PRBool tableCellSelectionMode;
result = frameSelection->GetTableCellSelection(&tableCellSelectionMode);
if (NS_SUCCEEDED(result) && tableCellSelectionMode) {
frameSelection->GetTableCellSelectionStyleColor(&myColor);
if(displaySelection==nsISelectionController::SELECTION_DISABLED) {
((nsStyleColor *)myColor)->mBackgroundColor = NS_RGB(176,176,176);// disabled color
}
else {
nsILookAndFeel* look = nsnull;
if (NS_SUCCEEDED(aPresContext->GetLookAndFeel(&look)) && look) {
look->GetColor(nsILookAndFeel::eColor_TextSelectBackground, ((nsStyleColor *)myColor)->mBackgroundColor);//VERY BAD CAST..TEMPORARY
NS_RELEASE(look);
}
}
}
}
}
}
//END SELECTION
const nsStyleColor* myColor = (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color);
#ifdef OLD_TABLE_SELECTION
myColor = GetColorStyleFromSelection(myColor);
#endif
const nsStyleBorder* myBorder =
(const nsStyleBorder*)mStyleContext->GetStyleData(eStyleStruct_Border);
NS_ASSERTION(nsnull!=myColor, "bad style color");
NS_ASSERTION(nsnull!=myBorder, "bad style spacing");
const nsStyleTable* cellTableStyle;
GetStyleData(eStyleStruct_Table, ((const nsStyleStruct *&)cellTableStyle));
nsRect rect(0, 0, mRect.width, mRect.height);
@ -313,6 +404,9 @@ NS_METHOD nsTableCellFrame::Paint(nsIPresContext* aPresContext,
}
}
}
#ifndef OLD_TABLE_SELECTION
DecorateForSelection(aPresContext, aRenderingContext,myColor); //ignore return value
#endif //OLD_TABLE_SELECTION
}
}

View File

@ -251,6 +251,10 @@ protected:
void MapHAlignAttribute(nsIPresContext* aPresContext, nsTableFrame *aTableFrame);
PRBool ConvertToPixelValue(nsHTMLValue& aValue, PRInt32 aDefault, PRInt32& aResult);
nsresult DecorateForSelection(nsIPresContext* aPresContext,
nsIRenderingContext& aRenderingContext,
const nsStyleColor* aStyleColor);
const nsStyleColor * GetColorStyleFromSelection(const nsStyleColor *aStyleColor);
protected:

View File

@ -232,6 +232,129 @@ nsresult nsTableCellFrame::SetColIndex(PRInt32 aColIndex)
return rv;
}
//ASSURE DIFFERENT COLORS for selection
inline nscolor EnsureDifferentColors(nscolor colorA, nscolor colorB)
{
if (colorA == colorB)
{
nscolor res;
res = NS_RGB(NS_GET_R(colorA) ^ 0xff,
NS_GET_G(colorA) ^ 0xff,
NS_GET_B(colorA) ^ 0xff);
return res;
}
return colorA;
}
#ifdef OLD_TABLE_SELECTION
const nsStyleColor *
nsTableCellFrame::GetColorStyleFromSelection(const nsStyleColor *aStyleColor)
{
PRInt16 displaySelection;
const nsStyleColor *retval = aStyleColor;
displaySelection = DisplaySelection(aPresContext);
if (displaySelection) {
nsFrameState frameState;
PRBool isSelected;
GetFrameState(&frameState);
isSelected = (frameState & NS_FRAME_SELECTED_CONTENT) == NS_FRAME_SELECTED_CONTENT;
if (isSelected) {
nsCOMPtr<nsIPresShell> shell;
nsresult result = aPresContext->GetShell(getter_AddRefs(shell));
if (NS_FAILED(result))
return result;
nsCOMPtr<nsIFrameSelection> frameSelection;
result = shell->GetFrameSelection(getter_AddRefs(frameSelection));
if (NS_SUCCEEDED(result)) {
PRBool tableCellSelectionMode;
result = frameSelection->GetTableCellSelection(&tableCellSelectionMode);
if (NS_SUCCEEDED(result) && tableCellSelectionMode) {
frameSelection->GetTableCellSelectionStyleColor(&retval);
if(displaySelection == nsISelectionController::SELECTION_DISABLED) {
((nsStyleColor *)retval)->mBackgroundColor = NS_RGB(176,176,176);// disabled color
}
else {
nsILookAndFeel* look = nsnull;
if (NS_SUCCEEDED(aPresContext->GetLookAndFeel(&look)) && look) {
look->GetColor(nsILookAndFeel::eColor_TextSelectBackground, ((nsStyleColor *)retval)->mBackgroundColor);
NS_RELEASE(look);
}
}
}
}
}
}
return retval;
}
#else //OLD_TABLE_SELECTION
nsresult
nsTableCellFrame::DecorateForSelection(nsIPresContext* aPresContext,
nsIRenderingContext& aRenderingContext,
const nsStyleColor *aStyleColor)
{
PRInt16 displaySelection;
displaySelection = DisplaySelection(aPresContext);
if (displaySelection) {
nsFrameState frameState;
PRBool isSelected;
GetFrameState(&frameState);
isSelected = (frameState & NS_FRAME_SELECTED_CONTENT) == NS_FRAME_SELECTED_CONTENT;
if (isSelected) {
nsCOMPtr<nsIPresShell> shell;
nsresult result = aPresContext->GetShell(getter_AddRefs(shell));
if (NS_FAILED(result))
return result;
nsCOMPtr<nsIFrameSelection> frameSelection;
result = shell->GetFrameSelection(getter_AddRefs(frameSelection));
if (NS_SUCCEEDED(result)) {
PRBool tableCellSelectionMode;
result = frameSelection->GetTableCellSelection(&tableCellSelectionMode);
if (NS_SUCCEEDED(result) && tableCellSelectionMode) {
nscolor bordercolor;
if(displaySelection == nsISelectionController::SELECTION_DISABLED) {
bordercolor = NS_RGB(176,176,176);// disabled color
}
else {
nsILookAndFeel* look = nsnull;
if (NS_SUCCEEDED(aPresContext->GetLookAndFeel(&look)) && look) {
look->GetColor(nsILookAndFeel::eColor_TextSelectBackground, bordercolor);
NS_RELEASE(look);
}
}
float t2pfloat;
if (NS_SUCCEEDED(aPresContext->GetPixelsToTwips(&t2pfloat)))
{
PRInt16 t2p = (PRInt16)t2pfloat;
if ((mRect.width >(3*t2p)) && (mRect.height > (3*t2p)))
{
//compare bordercolor to ((nsStyleColor *)myColor)->mBackgroundColor)
bordercolor = EnsureDifferentColors(bordercolor, aStyleColor->mBackgroundColor);
//outerrounded
aRenderingContext.SetColor(bordercolor);
aRenderingContext.DrawLine(t2p, 0, mRect.width, 0);
aRenderingContext.DrawLine(0, t2p, 0, mRect.height);
aRenderingContext.DrawLine(t2p, mRect.height, mRect.width, mRect.height);
aRenderingContext.DrawLine(mRect.width, t2p, mRect.width, mRect.height);
//middle
aRenderingContext.DrawRect(t2p, t2p, mRect.width-t2p, mRect.height-t2p);
//shading
aRenderingContext.DrawLine(2*t2p, mRect.height-2*t2p, mRect.width-t2p, mRect.height- (2*t2p));
aRenderingContext.DrawLine(mRect.width - (2*t2p), 2*t2p, mRect.width - (2*t2p), mRect.height-t2p);
}
}
}
}
}
}
return NS_OK;
}
#endif //OLD_TABLE_SELECTION
NS_METHOD nsTableCellFrame::Paint(nsIPresContext* aPresContext,
nsIRenderingContext& aRenderingContext,
const nsRect& aDirtyRect,
@ -243,52 +366,20 @@ NS_METHOD nsTableCellFrame::Paint(nsIPresContext* aPresContext,
}
const nsStyleDisplay* disp =
(const nsStyleDisplay*)mStyleContext->GetStyleData(eStyleStruct_Display);
if (NS_FRAME_PAINT_LAYER_BACKGROUND == aWhichLayer) {
if (disp->IsVisibleOrCollapsed()) {
const nsStyleColor* myColor =
(const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color);
//TABLECELL SELECTION
PRInt16 displaySelection;
displaySelection = DisplaySelection(aPresContext);
if (displaySelection) {
nsFrameState frameState;
PRBool isSelected;
GetFrameState(&frameState);
isSelected = (frameState & NS_FRAME_SELECTED_CONTENT) == NS_FRAME_SELECTED_CONTENT;
if (isSelected) {
nsCOMPtr<nsIPresShell> shell;
nsresult result = aPresContext->GetShell(getter_AddRefs(shell));
if (NS_FAILED(result))
return result;
nsCOMPtr<nsIFrameSelection> frameSelection;
result = shell->GetFrameSelection(getter_AddRefs(frameSelection));
if (NS_SUCCEEDED(result)) {
PRBool tableCellSelectionMode;
result = frameSelection->GetTableCellSelection(&tableCellSelectionMode);
if (NS_SUCCEEDED(result) && tableCellSelectionMode) {
frameSelection->GetTableCellSelectionStyleColor(&myColor);
if(displaySelection==nsISelectionController::SELECTION_DISABLED) {
((nsStyleColor *)myColor)->mBackgroundColor = NS_RGB(176,176,176);// disabled color
}
else {
nsILookAndFeel* look = nsnull;
if (NS_SUCCEEDED(aPresContext->GetLookAndFeel(&look)) && look) {
look->GetColor(nsILookAndFeel::eColor_TextSelectBackground, ((nsStyleColor *)myColor)->mBackgroundColor);//VERY BAD CAST..TEMPORARY
NS_RELEASE(look);
}
}
}
}
}
}
//END SELECTION
const nsStyleColor* myColor = (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color);
#ifdef OLD_TABLE_SELECTION
myColor = GetColorStyleFromSelection(myColor);
#endif
const nsStyleBorder* myBorder =
(const nsStyleBorder*)mStyleContext->GetStyleData(eStyleStruct_Border);
NS_ASSERTION(nsnull!=myColor, "bad style color");
NS_ASSERTION(nsnull!=myBorder, "bad style spacing");
const nsStyleTable* cellTableStyle;
GetStyleData(eStyleStruct_Table, ((const nsStyleStruct *&)cellTableStyle));
nsRect rect(0, 0, mRect.width, mRect.height);
@ -313,6 +404,9 @@ NS_METHOD nsTableCellFrame::Paint(nsIPresContext* aPresContext,
}
}
}
#ifndef OLD_TABLE_SELECTION
DecorateForSelection(aPresContext, aRenderingContext,myColor); //ignore return value
#endif //OLD_TABLE_SELECTION
}
}

View File

@ -251,6 +251,10 @@ protected:
void MapHAlignAttribute(nsIPresContext* aPresContext, nsTableFrame *aTableFrame);
PRBool ConvertToPixelValue(nsHTMLValue& aValue, PRInt32 aDefault, PRInt32& aResult);
nsresult DecorateForSelection(nsIPresContext* aPresContext,
nsIRenderingContext& aRenderingContext,
const nsStyleColor* aStyleColor);
const nsStyleColor * GetColorStyleFromSelection(const nsStyleColor *aStyleColor);
protected: