Adding view manager API for specifying background color for the document. Fix for bug 75591. r=waterson,sr=attinasi,a=blizzard

This commit is contained in:
roc+%cs.cmu.edu 2001-04-23 18:14:46 +00:00
Родитель 043d570472
Коммит 8b1b9bad9d
5 изменённых файлов: 77 добавлений и 17 удалений

Просмотреть файл

@ -511,6 +511,21 @@ public:
NS_IMETHOD FlushPendingInvalidates()=0;
/**
* Set the default background color that the view manager should use
* to paint otherwise unowned areas. If the color isn't known, just set
* it to zero (which means 'transparent' since the color is RGBA).
*
* @param aColor the default background color
*/
NS_IMETHOD SetDefaultBackgroundColor(nscolor aColor)=0;
/**
* Retrieve the default background color.
*
* @param aColor the default background color
*/
NS_IMETHOD GetDefaultBackgroundColor(nscolor* aColor)=0;
};
//when the refresh happens, should it be double buffered?

Просмотреть файл

@ -423,6 +423,7 @@ nsViewManager::nsViewManager()
mX = 0;
mY = 0;
mCachingWidgetChanges = 0;
mDefaultBackgroundColor = NS_RGBA(0, 0, 0, 0);
mAllowDoubleBuffering = PR_TRUE;
mHasPendingInvalidates = PR_FALSE;
mPendingInvalidateEvent = PR_FALSE;
@ -947,6 +948,35 @@ void nsViewManager::Refresh(nsIView *aView, nsIRenderingContext *aContext, const
#endif
}
void nsViewManager::DefaultRefresh(nsIView* aView, const nsRect* aRect)
{
nsCOMPtr<nsIWidget> widget;
GetWidgetForView(aView, getter_AddRefs(widget));
if (! widget)
return;
nsCOMPtr<nsIRenderingContext> context
= getter_AddRefs(CreateRenderingContext(*aView));
if (! context)
return;
nscolor bgcolor = mDefaultBackgroundColor;
if (NS_GET_A(mDefaultBackgroundColor) == 0) {
// If we haven't been given a default bgcolor, then use the
// widget's bgcolor.
nsCOMPtr<nsIWidget> widget;
GetWidgetForView(aView, getter_AddRefs(widget));
if (widget)
bgcolor = widget->GetBackgroundColor();
}
context->SetColor(bgcolor);
context->FillRect(*aRect);
}
// Perform a *stable* sort of the buffer by increasing Z-index. The common case is
// when many or all z-indices are equal and the list is mostly sorted; make sure
// that's fast (should be linear time if all z-indices are equal).
@ -1930,28 +1960,14 @@ NS_IMETHODIMP nsViewManager::DispatchEvent(nsGUIEvent *aEvent, nsEventStatus *aS
Refresh(view, ((nsPaintEvent*)aEvent)->renderingContext, &damrect, updateFlags);
}
else {
// since we got an NS_PAINT event we need to draw something so we don't get blank areas.
nsCOMPtr<nsIWidget> widget;
GetWidgetForView(view, getter_AddRefs(widget));
if (widget) {
nsCOMPtr<nsIRenderingContext> context;
context = getter_AddRefs(CreateRenderingContext(*view));
if (context) {
nscolor bgColor = 0;
SystemAttrStruct info;
info.mColor = &bgColor;
mContext->GetSystemAttribute(eSystemAttr_Color_WindowBackground, &info);
context->SetColor(bgColor);
context->FillRect(damrect);
}
// since we got an NS_PAINT event, we need to
// draw something so we don't get blank areas.
DefaultRefresh(view, &damrect);
}
}
}
}
*aStatus = nsEventStatus_eConsumeNoDefault;
}
break;
}
@ -3833,4 +3849,16 @@ nsViewManager::ProcessWidgetChanges(nsIView* aView)
return NS_OK;
}
NS_IMETHODIMP
nsViewManager::SetDefaultBackgroundColor(nscolor aColor)
{
mDefaultBackgroundColor = aColor;
return NS_OK;
}
NS_IMETHODIMP
nsViewManager::GetDefaultBackgroundColor(nscolor* aColor)
{
*aColor = mDefaultBackgroundColor;
return NS_OK;
}

Просмотреть файл

@ -154,6 +154,8 @@ public:
NS_IMETHOD AllowDoubleBuffering(PRBool aDoubleBuffer);
NS_IMETHOD IsPainting(PRBool& aIsPainting);
NS_IMETHOD FlushPendingInvalidates();
NS_IMETHOD SetDefaultBackgroundColor(nscolor aColor);
NS_IMETHOD GetDefaultBackgroundColor(nscolor* aColor);
nsresult ProcessInvalidateEvent();
static PRInt32 GetViewManagerCount();
static const nsVoidArray* GetViewManagerArray();
@ -175,6 +177,7 @@ private:
nsIRegion *region, PRUint32 aUpdateFlags);
void Refresh(nsIView* aView, nsIRenderingContext *aContext,
const nsRect *rect, PRUint32 aUpdateFlags);
void DefaultRefresh(nsIView* aView, const nsRect* aRect);
void RenderViews(nsIView *aRootView, nsIRenderingContext& aRC, const nsRect& aRect,
PRBool &aResult);
@ -327,6 +330,7 @@ private:
nsRect mTranslucentArea; // bounding box of all translucent views.
nsIScrollableView *mRootScrollable;
PRInt32 mCachingWidgetChanges;
nscolor mDefaultBackgroundColor;
nsHashtable mMapPlaceholderViewToZTreeNode;

Просмотреть файл

@ -2967,4 +2967,15 @@ nsViewManager2::ProcessWidgetChanges(nsIView* aView)
return NS_OK;
}
NS_IMETHODIMP
nsViewManager2::SetDefaultBackgroundColor(nscolor aColor)
{
return NS_OK;
}
NS_IMETHODIMP
nsViewManager2::GetDefaultBackgroundColor(nscolor* aColor)
{
*aColor = 0;
return NS_OK;
}

Просмотреть файл

@ -151,6 +151,8 @@ public:
NS_IMETHOD AllowDoubleBuffering(PRBool aDoubleBuffer);
NS_IMETHOD IsPainting(PRBool& aIsPainting);
NS_IMETHOD FlushPendingInvalidates();
NS_IMETHOD SetDefaultBackgroundColor(nscolor aColor);
NS_IMETHOD GetDefaultBackgroundColor(nscolor* aColor);
nsresult ProcessInvalidateEvent();
static PRInt32 GetViewManagerCount();
static const nsVoidArray* GetViewManagerArray();