зеркало из https://github.com/mozilla/pjs.git
Fixed button to respond to the list-style-image property on CSS
This commit is contained in:
Родитель
9bcf37d744
Коммит
e45dcff509
|
@ -317,6 +317,8 @@ nsButtonFrameRenderer::PaintButton (nsIPresContext& aPresContext,
|
||||||
nsFramePaintLayer aWhichLayer,
|
nsFramePaintLayer aWhichLayer,
|
||||||
const nsRect& aRect)
|
const nsRect& aRect)
|
||||||
{
|
{
|
||||||
|
printf("painted width='%d' height='%d'\n",aRect.width, aRect.height);
|
||||||
|
|
||||||
// draw the border and background inside the focus and outline borders
|
// draw the border and background inside the focus and outline borders
|
||||||
PaintBorderAndBackground(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer, aRect);
|
PaintBorderAndBackground(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer, aRect);
|
||||||
|
|
||||||
|
@ -565,26 +567,25 @@ nsButtonFrameRenderer::ReResolveStyles(nsIPresContext& aPresContext)
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
nsButtonFrameRenderer::AddBordersAndPadding(nsIPresContext* aPresContext,
|
nsButtonFrameRenderer::AddFocusBordersAndPadding(nsIPresContext& aPresContext,
|
||||||
const nsHTMLReflowState& aReflowState,
|
const nsHTMLReflowState& aReflowState,
|
||||||
nsHTMLReflowMetrics& aMetrics,
|
nsHTMLReflowMetrics& aMetrics,
|
||||||
nsMargin& aBorderPadding)
|
nsMargin& aBorderPadding)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
nsHTMLReflowState::ComputeBorderPaddingFor(aFrame,
|
nsHTMLReflowState::ComputeBorderPaddingFor(mFrame,
|
||||||
aReflowState.parentReflowState,
|
aReflowState.parentReflowState,
|
||||||
aBorderPadding);
|
aBorderPadding);
|
||||||
*/
|
|
||||||
|
|
||||||
aBorderPadding.left = aBorderPadding.right = aBorderPadding.top = aBorderPadding.bottom = 0;
|
|
||||||
|
|
||||||
aBorderPadding += GetButtonOuterFocusBorderAndPadding();
|
aBorderPadding += GetButtonOuterFocusBorderAndPadding();
|
||||||
aBorderPadding += GetButtonBorderAndPadding();
|
|
||||||
aBorderPadding += GetButtonInnerFocusMargin();
|
aBorderPadding += GetButtonInnerFocusMargin();
|
||||||
aBorderPadding += GetButtonInnerFocusBorderAndPadding();
|
aBorderPadding += GetButtonInnerFocusBorderAndPadding();
|
||||||
|
|
||||||
aMetrics.width += aBorderPadding.left + aBorderPadding.right;
|
aMetrics.width += aBorderPadding.left + aBorderPadding.right;
|
||||||
aMetrics.height += aBorderPadding.top + aBorderPadding.bottom;
|
aMetrics.height += aBorderPadding.top + aBorderPadding.bottom;
|
||||||
|
|
||||||
|
printf("requested width='%d' height='%d'\n",aMetrics.width, aMetrics.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -91,7 +91,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Subroutine to add in borders and padding
|
* Subroutine to add in borders and padding
|
||||||
*/
|
*/
|
||||||
virtual void AddBordersAndPadding(nsIPresContext* aPresContext,
|
virtual void AddFocusBordersAndPadding(nsIPresContext& aPresContext,
|
||||||
const nsHTMLReflowState& aReflowState,
|
const nsHTMLReflowState& aReflowState,
|
||||||
nsHTMLReflowMetrics& aDesiredSize,
|
nsHTMLReflowMetrics& aDesiredSize,
|
||||||
nsMargin& aBorderPadding);
|
nsMargin& aBorderPadding);
|
||||||
|
|
|
@ -317,6 +317,8 @@ nsButtonFrameRenderer::PaintButton (nsIPresContext& aPresContext,
|
||||||
nsFramePaintLayer aWhichLayer,
|
nsFramePaintLayer aWhichLayer,
|
||||||
const nsRect& aRect)
|
const nsRect& aRect)
|
||||||
{
|
{
|
||||||
|
printf("painted width='%d' height='%d'\n",aRect.width, aRect.height);
|
||||||
|
|
||||||
// draw the border and background inside the focus and outline borders
|
// draw the border and background inside the focus and outline borders
|
||||||
PaintBorderAndBackground(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer, aRect);
|
PaintBorderAndBackground(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer, aRect);
|
||||||
|
|
||||||
|
@ -565,26 +567,25 @@ nsButtonFrameRenderer::ReResolveStyles(nsIPresContext& aPresContext)
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
nsButtonFrameRenderer::AddBordersAndPadding(nsIPresContext* aPresContext,
|
nsButtonFrameRenderer::AddFocusBordersAndPadding(nsIPresContext& aPresContext,
|
||||||
const nsHTMLReflowState& aReflowState,
|
const nsHTMLReflowState& aReflowState,
|
||||||
nsHTMLReflowMetrics& aMetrics,
|
nsHTMLReflowMetrics& aMetrics,
|
||||||
nsMargin& aBorderPadding)
|
nsMargin& aBorderPadding)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
nsHTMLReflowState::ComputeBorderPaddingFor(aFrame,
|
nsHTMLReflowState::ComputeBorderPaddingFor(mFrame,
|
||||||
aReflowState.parentReflowState,
|
aReflowState.parentReflowState,
|
||||||
aBorderPadding);
|
aBorderPadding);
|
||||||
*/
|
|
||||||
|
|
||||||
aBorderPadding.left = aBorderPadding.right = aBorderPadding.top = aBorderPadding.bottom = 0;
|
|
||||||
|
|
||||||
aBorderPadding += GetButtonOuterFocusBorderAndPadding();
|
aBorderPadding += GetButtonOuterFocusBorderAndPadding();
|
||||||
aBorderPadding += GetButtonBorderAndPadding();
|
|
||||||
aBorderPadding += GetButtonInnerFocusMargin();
|
aBorderPadding += GetButtonInnerFocusMargin();
|
||||||
aBorderPadding += GetButtonInnerFocusBorderAndPadding();
|
aBorderPadding += GetButtonInnerFocusBorderAndPadding();
|
||||||
|
|
||||||
aMetrics.width += aBorderPadding.left + aBorderPadding.right;
|
aMetrics.width += aBorderPadding.left + aBorderPadding.right;
|
||||||
aMetrics.height += aBorderPadding.top + aBorderPadding.bottom;
|
aMetrics.height += aBorderPadding.top + aBorderPadding.bottom;
|
||||||
|
|
||||||
|
printf("requested width='%d' height='%d'\n",aMetrics.width, aMetrics.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -91,7 +91,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* Subroutine to add in borders and padding
|
* Subroutine to add in borders and padding
|
||||||
*/
|
*/
|
||||||
virtual void AddBordersAndPadding(nsIPresContext* aPresContext,
|
virtual void AddFocusBordersAndPadding(nsIPresContext& aPresContext,
|
||||||
const nsHTMLReflowState& aReflowState,
|
const nsHTMLReflowState& aReflowState,
|
||||||
nsHTMLReflowMetrics& aDesiredSize,
|
nsHTMLReflowMetrics& aDesiredSize,
|
||||||
nsMargin& aBorderPadding);
|
nsMargin& aBorderPadding);
|
||||||
|
|
|
@ -69,6 +69,7 @@
|
||||||
#include "nsIDOMHTMLMapElement.h"
|
#include "nsIDOMHTMLMapElement.h"
|
||||||
#include "nsIStyleSet.h"
|
#include "nsIStyleSet.h"
|
||||||
#include "nsIStyleContext.h"
|
#include "nsIStyleContext.h"
|
||||||
|
#include "nsIPopUpMenu.h"
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
#define BROKEN_IMAGE_URL "resource:/res/html/broken-image.gif"
|
#define BROKEN_IMAGE_URL "resource:/res/html/broken-image.gif"
|
||||||
|
@ -179,7 +180,6 @@ nsTitledButtonFrame::nsTitledButtonFrame()
|
||||||
mAlign = NS_SIDE_BOTTOM;
|
mAlign = NS_SIDE_BOTTOM;
|
||||||
mTruncationType = Right;
|
mTruncationType = Right;
|
||||||
mNeedsLayout = PR_TRUE;
|
mNeedsLayout = PR_TRUE;
|
||||||
mUpdateHappendedInInit = PR_FALSE;
|
|
||||||
mHasImage = PR_FALSE;
|
mHasImage = PR_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,10 +212,24 @@ nsTitledButtonFrame::Init(nsIPresContext& aPresContext,
|
||||||
|
|
||||||
// Set the image loader's source URL and base URL
|
// Set the image loader's source URL and base URL
|
||||||
|
|
||||||
|
// get src
|
||||||
|
mHasImage = PR_FALSE;
|
||||||
nsAutoString src;
|
nsAutoString src;
|
||||||
if ((NS_CONTENT_ATTR_HAS_VALUE == mContent->GetAttribute(nsXULAtoms::nameSpaceID, nsHTMLAtoms::src, src)) &&
|
if ((NS_CONTENT_ATTR_HAS_VALUE == mContent->GetAttribute(nsXULAtoms::nameSpaceID, nsHTMLAtoms::src, src)) &&
|
||||||
(src.Length() > 0)) {
|
(src.Length() > 0)) {
|
||||||
mHasImage = PR_TRUE;
|
mHasImage = PR_TRUE;
|
||||||
|
} else {
|
||||||
|
// if no src then get the list style image
|
||||||
|
const nsStyleList* myList =
|
||||||
|
(const nsStyleList*)mStyleContext->GetStyleData(eStyleStruct_List);
|
||||||
|
|
||||||
|
if (myList->mListStyleImage.Length() > 0) {
|
||||||
|
src = myList->mListStyleImage;
|
||||||
|
mHasImage = PR_TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mHasImage == PR_TRUE) {
|
||||||
mImageLoader.SetURLSpec(src);
|
mImageLoader.SetURLSpec(src);
|
||||||
nsIURL* baseURL = nsnull;
|
nsIURL* baseURL = nsnull;
|
||||||
nsIHTMLContent* htmlContent;
|
nsIHTMLContent* htmlContent;
|
||||||
|
@ -246,17 +260,6 @@ nsTitledButtonFrame::Init(nsIPresContext& aPresContext,
|
||||||
mContent->GetAttribute(nsXULAtoms::nameSpaceID, nsHTMLAtoms::align, align);
|
mContent->GetAttribute(nsXULAtoms::nameSpaceID, nsHTMLAtoms::align, align);
|
||||||
setAlignment(align);
|
setAlignment(align);
|
||||||
|
|
||||||
/*
|
|
||||||
// get the alignment
|
|
||||||
nsAutoString disabled;
|
|
||||||
mContent->GetAttribute(nsXULAtoms::nameSpaceID, nsHTMLAtoms::disabled, disabled);
|
|
||||||
SetDisabled(disabled);
|
|
||||||
|
|
||||||
// defer the update
|
|
||||||
if (mRenderer.isDisabled())
|
|
||||||
mUpdateHappendedInInit = PR_TRUE;
|
|
||||||
*/
|
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -307,6 +310,15 @@ nsTitledButtonFrame::AttributeChanged(nsIPresContext* aPresContext,
|
||||||
|
|
||||||
aChild->GetAttribute(nsXULAtoms::nameSpaceID, nsHTMLAtoms::src, newSRC);
|
aChild->GetAttribute(nsXULAtoms::nameSpaceID, nsHTMLAtoms::src, newSRC);
|
||||||
|
|
||||||
|
if (newSRC.Equals("")) {
|
||||||
|
// if no src then get the list style image
|
||||||
|
const nsStyleList* myList =
|
||||||
|
(const nsStyleList*)mStyleContext->GetStyleData(eStyleStruct_List);
|
||||||
|
|
||||||
|
if (myList->mListStyleImage.Length() > 0) {
|
||||||
|
newSRC = myList->mListStyleImage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!oldSRC.Equals(newSRC)) {
|
if (!oldSRC.Equals(newSRC)) {
|
||||||
if (newSRC.Length() == 0)
|
if (newSRC.Length() == 0)
|
||||||
|
@ -367,47 +379,33 @@ nsTitledButtonFrame::AttributeChanged(nsIPresContext* aPresContext,
|
||||||
aChild->GetAttribute(nsXULAtoms::nameSpaceID, nsHTMLAtoms::value, align);
|
aChild->GetAttribute(nsXULAtoms::nameSpaceID, nsHTMLAtoms::value, align);
|
||||||
setAlignment(align);
|
setAlignment(align);
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
else if (nsHTMLAtoms::disabled == aAttribute) {
|
|
||||||
nsAutoString disabled;
|
|
||||||
aChild->GetAttribute(nsXULAtoms::nameSpaceID, nsHTMLAtoms::value, disabled);
|
|
||||||
SetDisabled(disabled);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsTitledButtonFrame::Paint(nsIPresContext& aPresContext,
|
nsTitledButtonFrame::Paint(nsIPresContext& aPresContext,
|
||||||
nsIRenderingContext& aRenderingContext,
|
nsIRenderingContext& aRenderingContext,
|
||||||
const nsRect& aDirtyRect,
|
const nsRect& aDirtyRect,
|
||||||
nsFramePaintLayer aWhichLayer)
|
nsFramePaintLayer aWhichLayer)
|
||||||
{
|
{
|
||||||
|
|
||||||
const nsStyleDisplay* disp = (const nsStyleDisplay*)
|
const nsStyleDisplay* disp = (const nsStyleDisplay*)
|
||||||
mStyleContext->GetStyleData(eStyleStruct_Display);
|
mStyleContext->GetStyleData(eStyleStruct_Display);
|
||||||
if (!disp->mVisible)
|
if (!disp->mVisible)
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
||||||
// if we changed an attribute in our Init method then we need to update the
|
|
||||||
// styles now.
|
|
||||||
/*
|
|
||||||
if (PR_TRUE == mUpdateHappendedInInit)
|
|
||||||
{
|
|
||||||
mUpdateHappendedInInit = PR_FALSE;
|
|
||||||
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
nsRect rect (0,0, mRect.width, mRect.height);
|
nsRect rect (0,0, mRect.width, mRect.height);
|
||||||
mRenderer.PaintButton(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer, rect);
|
mRenderer.PaintButton(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer, rect);
|
||||||
|
|
||||||
|
|
||||||
LayoutTitleAndImage(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer);
|
LayoutTitleAndImage(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer);
|
||||||
|
|
||||||
PaintTitle(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer);
|
PaintTitle(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer);
|
||||||
PaintImage(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer);
|
PaintImage(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
aRenderingContext.SetColor(NS_RGB(0,128,0));
|
aRenderingContext.SetColor(NS_RGB(0,128,0));
|
||||||
aRenderingContext.DrawRect(mImageRect);
|
aRenderingContext.DrawRect(mImageRect);
|
||||||
|
@ -649,6 +647,17 @@ nsTitledButtonFrame::PaintTitle(nsIPresContext& aPresContext,
|
||||||
{
|
{
|
||||||
if (eFramePaintLayer_Content == aWhichLayer) {
|
if (eFramePaintLayer_Content == aWhichLayer) {
|
||||||
|
|
||||||
|
// place 4 pixels of spacing
|
||||||
|
float p2t;
|
||||||
|
aPresContext.GetScaledPixelsToTwips(&p2t);
|
||||||
|
nscoord pixel = NSIntPixelsToTwips(1, p2t);
|
||||||
|
|
||||||
|
nsRect disabledRect(mTitleRect.x+pixel, mTitleRect.y+pixel, mTitleRect.width, mTitleRect.height);
|
||||||
|
|
||||||
|
// don't draw if the title is not dirty
|
||||||
|
if (PR_FALSE == aDirtyRect.Intersects(mTitleRect) && PR_FALSE == aDirtyRect.Intersects(disabledRect))
|
||||||
|
return NS_OK;
|
||||||
|
|
||||||
// paint the title
|
// paint the title
|
||||||
const nsStyleFont* fontStyle = (const nsStyleFont*)mStyleContext->GetStyleData(eStyleStruct_Font);
|
const nsStyleFont* fontStyle = (const nsStyleFont*)mStyleContext->GetStyleData(eStyleStruct_Font);
|
||||||
const nsStyleColor* colorStyle = (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color);
|
const nsStyleColor* colorStyle = (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color);
|
||||||
|
@ -658,13 +667,8 @@ nsTitledButtonFrame::PaintTitle(nsIPresContext& aPresContext,
|
||||||
// if disabled paint
|
// if disabled paint
|
||||||
if (PR_TRUE == mRenderer.isDisabled())
|
if (PR_TRUE == mRenderer.isDisabled())
|
||||||
{
|
{
|
||||||
// place 4 pixels of spacing
|
|
||||||
float p2t;
|
|
||||||
aPresContext.GetScaledPixelsToTwips(&p2t);
|
|
||||||
nscoord pixel = NSIntPixelsToTwips(1, p2t);
|
|
||||||
|
|
||||||
aRenderingContext.SetColor(NS_RGB(255,255,255));
|
aRenderingContext.SetColor(NS_RGB(255,255,255));
|
||||||
aRenderingContext.DrawString(mTruncatedTitle, mTitleRect.x+pixel, mTitleRect.y+pixel);
|
aRenderingContext.DrawString(mTruncatedTitle, disabledRect.x, disabledRect.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
aRenderingContext.SetColor(colorStyle->mColor);
|
aRenderingContext.SetColor(colorStyle->mColor);
|
||||||
|
@ -689,6 +693,11 @@ nsTitledButtonFrame::PaintImage(nsIPresContext& aPresContext,
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// don't draw if the image is not dirty
|
||||||
|
if (PR_FALSE == aDirtyRect.Intersects(mImageRect))
|
||||||
|
return NS_OK;
|
||||||
|
|
||||||
|
|
||||||
nsIImage* image = mImageLoader.GetImage();
|
nsIImage* image = mImageLoader.GetImage();
|
||||||
if (nsnull == image) {
|
if (nsnull == image) {
|
||||||
// No image yet, or image load failed. Draw the alt-text and an icon
|
// No image yet, or image load failed. Draw the alt-text and an icon
|
||||||
|
@ -719,57 +728,9 @@ nsTitledButtonFrame::Reflow(nsIPresContext& aPresContext,
|
||||||
nsReflowStatus& aStatus)
|
nsReflowStatus& aStatus)
|
||||||
{
|
{
|
||||||
mNeedsLayout = PR_TRUE;
|
mNeedsLayout = PR_TRUE;
|
||||||
|
nsresult result = nsLeafFrame::Reflow(aPresContext, aMetrics, aReflowState, aStatus);
|
||||||
NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS,
|
mRenderer.AddFocusBordersAndPadding(aPresContext, aReflowState, aMetrics, mBorderPadding);
|
||||||
("enter nsTitledButtonFrame::Reflow: aMaxSize=%d,%d",
|
return result;
|
||||||
aReflowState.availableWidth, aReflowState.availableHeight));
|
|
||||||
|
|
||||||
NS_PRECONDITION(mState & NS_FRAME_IN_REFLOW, "frame is not in reflow");
|
|
||||||
|
|
||||||
// figure out our size
|
|
||||||
GetDesiredSize(&aPresContext, aReflowState, aMetrics);
|
|
||||||
|
|
||||||
mRenderer.AddBordersAndPadding(&aPresContext, aReflowState, aMetrics, mBorderPadding);
|
|
||||||
|
|
||||||
if (nsnull != aMetrics.maxElementSize) {
|
|
||||||
aMetrics.maxElementSize->width = aMetrics.width;
|
|
||||||
aMetrics.maxElementSize->height = aMetrics.height;
|
|
||||||
}
|
|
||||||
|
|
||||||
PRBool fixedWidthContent = aReflowState.HaveFixedContentWidth();
|
|
||||||
if (NS_INTRINSICSIZE == aReflowState.computedWidth) {
|
|
||||||
fixedWidthContent = PR_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
PRBool fixedHeightContent = aReflowState.HaveFixedContentHeight();
|
|
||||||
if (NS_INTRINSICSIZE == aReflowState.computedHeight) {
|
|
||||||
fixedHeightContent = PR_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsRect minSize(0,0,mMinSize.width, mMinSize.height);
|
|
||||||
minSize.Inflate(mBorderPadding);
|
|
||||||
|
|
||||||
// if the width is set
|
|
||||||
if (fixedWidthContent)
|
|
||||||
if (aReflowState.computedWidth >= minSize.width)
|
|
||||||
aMetrics.width = aReflowState.computedWidth;
|
|
||||||
else
|
|
||||||
aMetrics.width = minSize.width;
|
|
||||||
|
|
||||||
|
|
||||||
// if the height is set
|
|
||||||
if (fixedHeightContent)
|
|
||||||
if (aReflowState.computedWidth >= minSize.height)
|
|
||||||
aMetrics.height = aReflowState.computedHeight;
|
|
||||||
else
|
|
||||||
aMetrics.height = minSize.height;
|
|
||||||
|
|
||||||
aStatus = NS_FRAME_COMPLETE;
|
|
||||||
|
|
||||||
NS_FRAME_TRACE(NS_FRAME_TRACE_CALLS,
|
|
||||||
("exit nsTitledButtonFrame::Reflow: size=%d,%d",
|
|
||||||
aMetrics.width, aMetrics.height));
|
|
||||||
return NS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -847,6 +808,34 @@ nsTitledButtonFrame::GetDesiredSize(nsIPresContext* aPresContext,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PRBool fixedWidthContent = aReflowState.HaveFixedContentWidth();
|
||||||
|
if (NS_INTRINSICSIZE == aReflowState.computedWidth) {
|
||||||
|
fixedWidthContent = PR_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
PRBool fixedHeightContent = aReflowState.HaveFixedContentHeight();
|
||||||
|
if (NS_INTRINSICSIZE == aReflowState.computedHeight) {
|
||||||
|
fixedHeightContent = PR_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
nsRect minSize(0,0,mMinSize.width, mMinSize.height);
|
||||||
|
|
||||||
|
// if the width is set
|
||||||
|
if (fixedWidthContent)
|
||||||
|
if (aReflowState.computedWidth >= minSize.width)
|
||||||
|
aDesiredSize.width = aReflowState.computedWidth;
|
||||||
|
else
|
||||||
|
aDesiredSize.width = minSize.width;
|
||||||
|
|
||||||
|
|
||||||
|
// if the height is set
|
||||||
|
if (fixedHeightContent)
|
||||||
|
if (aReflowState.computedWidth >= minSize.height)
|
||||||
|
aDesiredSize.height = aReflowState.computedHeight;
|
||||||
|
else
|
||||||
|
aDesiredSize.height = minSize.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1111,4 +1100,232 @@ nsTitledButtonFrame :: ReResolveStyleContext ( nsIPresContext* aPresContext, nsI
|
||||||
} // ReResolveStyleContext
|
} // ReResolveStyleContext
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
//----------------------------------------
|
||||||
|
NS_IMETHODIMP nsTitledButtonFrame::CreateMenu(nsIPopUpMenu * aPopUpMenu,
|
||||||
|
nsIDOMNode * aMenuNode,
|
||||||
|
nsString & aMenuName)
|
||||||
|
{
|
||||||
|
// Create and place back button
|
||||||
|
nsresult rv = nsRepository::CreateInstance(kPopUpMenuCID, nsnull, kIPopUpMenuIID,
|
||||||
|
(void**)&mPopUpMenu);
|
||||||
|
if (NS_OK != rv)
|
||||||
|
return rv;
|
||||||
|
|
||||||
|
nsIWidget * menuParentWidget;
|
||||||
|
if (NS_OK != this->QueryInterface(kIWidgetIID,(void**)&menuParentWidget)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsIWidget * popupWidget;
|
||||||
|
nsRect rect;
|
||||||
|
if (NS_OK == mPopUpMenu->QueryInterface(kIWidgetIID,(void**)&popupWidget)) {
|
||||||
|
popupWidget->Create(menuParentWidget, rect, nsnull, nsnull);
|
||||||
|
NS_RELEASE(popupWidget);
|
||||||
|
}
|
||||||
|
NS_RELEASE(menuParentWidget);
|
||||||
|
|
||||||
|
// Begin menuitem inner loop
|
||||||
|
nsCOMPtr<nsIDOMNode> menuitemNode;
|
||||||
|
aMenuNode->GetFirstChild(getter_AddRefs(menuitemNode));
|
||||||
|
while (menuitemNode) {
|
||||||
|
nsCOMPtr<nsIDOMElement> menuitemElement(do_QueryInterface(menuitemNode));
|
||||||
|
if (menuitemElement) {
|
||||||
|
nsString menuitemNodeType;
|
||||||
|
nsString menuitemName;
|
||||||
|
menuitemElement->GetNodeName(menuitemNodeType);
|
||||||
|
if (menuitemNodeType.Equals("menuitem")) {
|
||||||
|
// LoadMenuItem
|
||||||
|
LoadMenuItem(pnsMenu, menuitemElement, menuitemNode);
|
||||||
|
} else if (menuitemNodeType.Equals("separator")) {
|
||||||
|
pnsMenu->AddSeparator();
|
||||||
|
} else if (menuitemNodeType.Equals("menu")) {
|
||||||
|
// Load a submenu
|
||||||
|
LoadSubMenu(pnsMenu, menuitemElement, menuitemNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nsCOMPtr<nsIDOMNode> oldmenuitemNode(menuitemNode);
|
||||||
|
oldmenuitemNode->GetNextSibling(getter_AddRefs(menuitemNode));
|
||||||
|
} // end menu item innner loop
|
||||||
|
}
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------
|
||||||
|
NS_IMETHODIMP nsWebShellWindow::LoadMenuItem(
|
||||||
|
nsIMenu * pParentMenu,
|
||||||
|
nsIDOMElement * menuitemElement,
|
||||||
|
nsIDOMNode * menuitemNode)
|
||||||
|
{
|
||||||
|
nsString menuitemName;
|
||||||
|
nsString menuitemCmd;
|
||||||
|
|
||||||
|
menuitemElement->GetAttribute(nsAutoString("name"), menuitemName);
|
||||||
|
menuitemElement->GetAttribute(nsAutoString("cmd"), menuitemCmd);
|
||||||
|
// Create nsMenuItem
|
||||||
|
nsIMenuItem * pnsMenuItem = nsnull;
|
||||||
|
nsresult rv = nsRepository::CreateInstance(kMenuItemCID, nsnull, kIMenuItemIID, (void**)&pnsMenuItem);
|
||||||
|
if (NS_OK == rv) {
|
||||||
|
pnsMenuItem->Create(pParentMenu); //, menuitemName, 0);
|
||||||
|
// Set nsMenuItem Name
|
||||||
|
pnsMenuItem->SetLabel(menuitemName);
|
||||||
|
// Make nsMenuItem a child of nsMenu
|
||||||
|
pParentMenu->AddMenuItem(pnsMenuItem);
|
||||||
|
|
||||||
|
// Create MenuDelegate - this is the intermediator inbetween
|
||||||
|
// the DOM node and the nsIMenuItem
|
||||||
|
// The nsWebShellWindow wacthes for Document changes and then notifies the
|
||||||
|
// the appropriate nsMenuDelegate object
|
||||||
|
nsCOMPtr<nsIDOMElement> domElement(do_QueryInterface(menuitemNode));
|
||||||
|
if (!domElement) {
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsAutoString cmdAtom("onClick");
|
||||||
|
nsString cmdName;
|
||||||
|
|
||||||
|
domElement->GetAttribute(cmdAtom, cmdName);
|
||||||
|
|
||||||
|
nsXULCommand * menuDelegate = new nsXULCommand();
|
||||||
|
menuDelegate->SetCommand(cmdName);
|
||||||
|
menuDelegate->SetWebShell(mWebShell);
|
||||||
|
menuDelegate->SetDOMElement(domElement);
|
||||||
|
menuDelegate->SetMenuItem(pnsMenuItem);
|
||||||
|
nsIXULCommand * icmd;
|
||||||
|
if (NS_OK == menuDelegate->QueryInterface(kIXULCommandIID, (void**) &icmd)) {
|
||||||
|
mMenuDelegates.AppendElement(icmd);
|
||||||
|
nsCOMPtr<nsIMenuListener> listener(do_QueryInterface(menuDelegate));
|
||||||
|
if (listener) {
|
||||||
|
pnsMenuItem->AddMenuListener(listener);
|
||||||
|
if (DEBUG_MENUSDEL) printf("Adding menu listener to [%s]\n", menuitemName.ToNewCString());
|
||||||
|
} else {
|
||||||
|
if (DEBUG_MENUSDEL) printf("*** NOT Adding menu listener to [%s]\n", menuitemName.ToNewCString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------
|
||||||
|
void nsWebShellWindow::LoadSubMenu(
|
||||||
|
nsIMenu * pParentMenu,
|
||||||
|
nsIDOMElement * menuElement,
|
||||||
|
nsIDOMNode * menuNode)
|
||||||
|
{
|
||||||
|
nsString menuName;
|
||||||
|
menuElement->GetAttribute(nsAutoString("name"), menuName);
|
||||||
|
//printf("Creating Menu [%s] \n", menuName.ToNewCString()); // this leaks
|
||||||
|
|
||||||
|
// Create nsMenu
|
||||||
|
nsIMenu * pnsMenu = nsnull;
|
||||||
|
nsresult rv = nsRepository::CreateInstance(kMenuCID, nsnull, kIMenuIID, (void**)&pnsMenu);
|
||||||
|
if (NS_OK == rv) {
|
||||||
|
// Call Create
|
||||||
|
pnsMenu->Create(pParentMenu, menuName);
|
||||||
|
|
||||||
|
// Set nsMenu Name
|
||||||
|
pnsMenu->SetLabel(menuName);
|
||||||
|
// Make nsMenu a child of parent nsMenu
|
||||||
|
pParentMenu->AddMenu(pnsMenu);
|
||||||
|
|
||||||
|
// Begin menuitem inner loop
|
||||||
|
nsCOMPtr<nsIDOMNode> menuitemNode;
|
||||||
|
menuNode->GetFirstChild(getter_AddRefs(menuitemNode));
|
||||||
|
while (menuitemNode) {
|
||||||
|
nsCOMPtr<nsIDOMElement> menuitemElement(do_QueryInterface(menuitemNode));
|
||||||
|
if (menuitemElement) {
|
||||||
|
nsString menuitemNodeType;
|
||||||
|
menuitemElement->GetNodeName(menuitemNodeType);
|
||||||
|
printf("Type [%s] %d\n", menuitemNodeType.ToNewCString(), menuitemNodeType.Equals("separator"));
|
||||||
|
if (menuitemNodeType.Equals("menuitem")) {
|
||||||
|
// Load a menuitem
|
||||||
|
LoadMenuItem(pnsMenu, menuitemElement, menuitemNode);
|
||||||
|
} else if (menuitemNodeType.Equals("separator")) {
|
||||||
|
pnsMenu->AddSeparator();
|
||||||
|
} else if (menuitemNodeType.Equals("menu")) {
|
||||||
|
// Add a submenu
|
||||||
|
LoadSubMenu(pnsMenu, menuitemElement, menuitemNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nsCOMPtr<nsIDOMNode> oldmenuitemNode(menuitemNode);
|
||||||
|
oldmenuitemNode->GetNextSibling(getter_AddRefs(menuitemNode));
|
||||||
|
} // end menu item innner loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//------------------------------------------------------------
|
||||||
|
void nsTitledButtonFrame::CreatePopUpMenu()
|
||||||
|
{
|
||||||
|
if (nsnull != mPopUpMenu) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create and place back button
|
||||||
|
nsresult rv = nsRepository::CreateInstance(kPopUpMenuCID, nsnull, kIPopUpMenuIID,
|
||||||
|
(void**)&mPopUpMenu);
|
||||||
|
if (NS_OK == rv) {
|
||||||
|
nsIWidget * menuParentWidget;
|
||||||
|
if (NS_OK != this->QueryInterface(kIWidgetIID,(void**)&menuParentWidget)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsIWidget * popupWidget;
|
||||||
|
nsRect rect;
|
||||||
|
if (NS_OK == mPopUpMenu->QueryInterface(kIWidgetIID,(void**)&popupWidget)) {
|
||||||
|
popupWidget->Create(menuParentWidget, rect, nsnull, nsnull);
|
||||||
|
NS_RELEASE(popupWidget);
|
||||||
|
}
|
||||||
|
NS_RELEASE(menuParentWidget);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------
|
||||||
|
NS_METHOD nsTitledButtonFrame::GetPopUpMenu(nsIPopUpMenu *& aPopUpMenu)
|
||||||
|
{
|
||||||
|
CreatePopUpMenu();
|
||||||
|
|
||||||
|
NS_ADDREF(mPopUpMenu);
|
||||||
|
aPopUpMenu = mPopUpMenu;
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------
|
||||||
|
NS_METHOD nsTitledButtonFrame::AddMenuItem(const nsString& aMenuLabel, PRInt32 aCommand)
|
||||||
|
{
|
||||||
|
CreatePopUpMenu();
|
||||||
|
|
||||||
|
nsIMenuItem * menuItem = nsnull;
|
||||||
|
nsresult rv = nsRepository::CreateInstance(kMenuItemCID, nsnull, kIMenuItemIID, (void**)&menuItem);
|
||||||
|
menuItem->Create(mPopUpMenu, aMenuLabel, aCommand);
|
||||||
|
if (NS_OK == rv) {
|
||||||
|
mPopUpMenu->AddItem(menuItem);
|
||||||
|
NS_RELEASE(menuItem);
|
||||||
|
}
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
nsEventStatus nsTitledButtonFrame::OnLeftButtonDown()
|
||||||
|
{
|
||||||
|
mState |= eButtonState_pressed;
|
||||||
|
Invalidate(PR_TRUE);
|
||||||
|
|
||||||
|
nsRect rect;
|
||||||
|
GetBounds(rect);
|
||||||
|
|
||||||
|
if (mPopUpMenu) {
|
||||||
|
mMenuIsPoppedUp = PR_TRUE;
|
||||||
|
mPopUpMenu->ShowMenu(0, rect.height);
|
||||||
|
mMenuIsPoppedUp = PR_FALSE;
|
||||||
|
}
|
||||||
|
return nsEventStatus_eIgnore;
|
||||||
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
|
@ -26,6 +26,8 @@
|
||||||
#include "nsLeafFrame.h"
|
#include "nsLeafFrame.h"
|
||||||
#include "nsButtonFrameRenderer.h"
|
#include "nsButtonFrameRenderer.h"
|
||||||
|
|
||||||
|
class nsIPopUpMenu;
|
||||||
|
|
||||||
class nsTitledButtonImageLoader : public nsHTMLImageLoader {
|
class nsTitledButtonImageLoader : public nsHTMLImageLoader {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -98,6 +100,7 @@ protected:
|
||||||
const nsHTMLReflowState& aReflowState,
|
const nsHTMLReflowState& aReflowState,
|
||||||
nsHTMLReflowMetrics& aDesiredSize);
|
nsHTMLReflowMetrics& aDesiredSize);
|
||||||
|
|
||||||
|
|
||||||
void DisplayAltFeedback(nsIPresContext& aPresContext,
|
void DisplayAltFeedback(nsIPresContext& aPresContext,
|
||||||
nsIRenderingContext& aRenderingContext,
|
nsIRenderingContext& aRenderingContext,
|
||||||
PRInt32 aIconId);
|
PRInt32 aIconId);
|
||||||
|
@ -137,7 +140,9 @@ private:
|
||||||
nsButtonFrameRenderer mRenderer;
|
nsButtonFrameRenderer mRenderer;
|
||||||
PRBool mHasImage;
|
PRBool mHasImage;
|
||||||
|
|
||||||
PRBool mUpdateHappendedInInit;
|
nsIPopUpMenu * mPopUpMenu;
|
||||||
|
PRBool mMenuIsPoppedUp;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}; // class nsTitledButtonFrame
|
}; // class nsTitledButtonFrame
|
||||||
|
|
Загрузка…
Ссылка в новой задаче