From b2660a7eabbfbf2d84a70743bbb79c8a095a194c Mon Sep 17 00:00:00 2001 From: "blizzard%redhat.com" Date: Mon, 28 Jun 1999 00:59:43 +0000 Subject: [PATCH] child window goes inside scrollbar parent window next will come events git-svn-id: svn://10.0.0.236/trunk@37154 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/widget/src/xlib/nsScrollBar.cpp | 155 ++++++++++++++++++------ mozilla/widget/src/xlib/nsScrollBar.h | 18 ++- 2 files changed, 131 insertions(+), 42 deletions(-) diff --git a/mozilla/widget/src/xlib/nsScrollBar.cpp b/mozilla/widget/src/xlib/nsScrollBar.cpp index a0259af31e2..e5861ecbd91 100644 --- a/mozilla/widget/src/xlib/nsScrollBar.cpp +++ b/mozilla/widget/src/xlib/nsScrollBar.cpp @@ -30,16 +30,19 @@ nsScrollbar::nsScrollbar(PRBool aIsVertical) : nsWidget(), nsIScrollbar() mThumbSize = 0; mLineIncrement = 1; mIsVertical = aIsVertical; - mRenderingContext = nsnull; - mBackground = NS_RGB(192,192,192); + mBackground = NS_RGB(100,100,100); bg_pixel = xlib_rgb_xpixel_from_rgb(mBackground); border_pixel = xlib_rgb_xpixel_from_rgb(mBackground); + mBar = 0; + mBarBounds.x = mBarBounds.y = mBarBounds.width = mBarBounds.height = 0; }; nsScrollbar::~nsScrollbar() { - if (mRenderingContext) - NS_RELEASE(mRenderingContext); + if (mBar) { + XDestroyWindow(gDisplay, mBar); + DeleteWindowCallback(mBar); + } } nsresult nsScrollbar::QueryInterface(const nsIID& aIID, void** aInstancePtr) @@ -61,6 +64,8 @@ NS_METHOD nsScrollbar::SetMaxRange(PRUint32 aEndRange) printf("nsScrollbar::SetMaxRange()\n"); printf("Max Range set to %d\n", aEndRange); mMaxRange = aEndRange; + CalcBarBounds(); + LayoutBar(); return NS_OK; } @@ -76,6 +81,8 @@ NS_METHOD nsScrollbar::SetPosition(PRUint32 aPos) printf("nsScrollbar::SetPosition()\n"); printf("Scroll to %d\n", aPos); mPosition = aPos; + CalcBarBounds(); + LayoutBar(); return NS_OK; } @@ -91,6 +98,8 @@ NS_METHOD nsScrollbar::SetThumbSize(PRUint32 aSize) printf("nsScrollbar::SetThumbSize()\n"); printf("Thumb size set to %d\n", aSize); mThumbSize = aSize; + CalcBarBounds(); + LayoutBar(); return NS_OK; } @@ -106,6 +115,8 @@ NS_METHOD nsScrollbar::SetLineIncrement(PRUint32 aSize) printf("nsScrollbar::SetLineIncrement()\n"); printf("Set Line Increment to %d\n", aSize); mLineIncrement = aSize; + CalcBarBounds(); + LayoutBar(); return NS_OK; } @@ -126,6 +137,8 @@ NS_METHOD nsScrollbar::SetParameters(PRUint32 aMaxRange, PRUint32 aThumbSize, SetThumbSize(aThumbSize); SetPosition(aPosition); SetLineIncrement(aLineIncrement); + CalcBarBounds(); + LayoutBar(); return NS_OK; } @@ -135,31 +148,13 @@ PRBool nsScrollbar::OnScroll(PRUint32 scrollCode, int cPos) return PR_FALSE; } -PRBool nsScrollbar::OnPaint(nsPaintEvent &event) -{ - PRBool result; - nsRect scrollRect; - printf("nsScrollbar::OnPaint\n"); - // draw the scrollbar itself - scrollRect.x = 0; - scrollRect.y = 0; - scrollRect.width = mBounds.width/2; - scrollRect.height = mBounds.height/2; - printf("mBounds %d %d\n", - mBounds.width, mBounds.height); - printf("About to fill rect %d %d\n", - scrollRect.width, scrollRect.height); - if (mRenderingContext) { - mRenderingContext->FillRect(scrollRect); - } - result = PR_FALSE; - return result; -} - PRBool nsScrollbar::OnResize(nsSizeEvent &event) { PRBool result; printf("nsScrollbar::OnResize\n"); + nsWidget::OnResize(event); + CalcBarBounds(); + LayoutBar(); result = PR_FALSE; return result; } @@ -182,7 +177,7 @@ void nsScrollbar::CreateNative(Window aParent, nsRect aRect) // be discarded... attr.bit_gravity = SouthEastGravity; // make sure that we listen for events - attr.event_mask = StructureNotifyMask | ExposureMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask; + attr.event_mask = StructureNotifyMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask; // set the default background color and border to that awful gray attr.background_pixel = bg_pixel; attr.border_pixel = border_pixel; @@ -196,17 +191,99 @@ void nsScrollbar::CreateNative(Window aParent, nsRect aRect) CreateNativeWindow(aParent, mBounds, attr, attr_mask); CreateGC(); - - // create a rendering context for this window - static NS_DEFINE_IID(kRenderingContextCID, NS_RENDERING_CONTEXT_CID); - static NS_DEFINE_IID(kRenderingContextIID, NS_IRENDERING_CONTEXT_IID); - if (NS_OK != nsComponentManager::CreateInstance(kRenderingContextCID, - nsnull, - kRenderingContextIID, - (void **)&mRenderingContext)) { - // oy vey! - printf("Oh, dear. I couldn't create an nsRenderingContext for this scrollbar. All hell is about to break loose.\n"); - } - mRenderingContext->Init(mContext, this); - mRenderingContext->SetColor(NS_RGB(0,0,0)); + // set up the scrolling bar. + attr.background_pixel = xlib_rgb_xpixel_from_rgb(NS_RGB(192,192,192)); + attr.border_pixel = xlib_rgb_xpixel_from_rgb(NS_RGB(100,100,100)); + // set up the size + CalcBarBounds(); + mBar = XCreateWindow(gDisplay, + mBaseWindow, + mBarBounds.x, mBarBounds.y, + mBarBounds.width, mBarBounds.height, + 2, // border width + gDepth, + InputOutput, + gVisual, + attr_mask, + &attr); + AddWindowCallback(mBar, this); +} + +NS_IMETHODIMP nsScrollbar::Show(PRBool bState) +{ + nsWidget::Show(bState); + if (mBar) { + XMapWindow(gDisplay, mBar); + } + CalcBarBounds(); + LayoutBar(); + return NS_OK; +} + +NS_IMETHODIMP nsScrollbar::Resize(PRUint32 aWidth, + PRUint32 aHeight, + PRBool aRepaint) +{ + nsWidget::Resize(aWidth, aHeight, aRepaint); + CalcBarBounds(); + LayoutBar(); + return NS_OK; +} + +NS_IMETHODIMP nsScrollbar::Resize(PRUint32 aX, + PRUint32 aY, + PRUint32 aWidth, + PRUint32 aHeight, + PRBool aRepaint) +{ + nsWidget::Resize(aX, aY, aWidth, aHeight, aRepaint); + CalcBarBounds(); + LayoutBar(); + return NS_OK; +} + +void nsScrollbar::CalcBarBounds(void) +{ + float bar_start; + float bar_end; + + if (mMaxRange == 0) { + bar_start = 0; + bar_end = 0; + printf("CalcBarBounds: max range is zero.\n"); + } + else { + printf("CalcBarBounds: position: %d max: %d thumb: %d\n", + mPosition, mMaxRange, mThumbSize); + bar_start = (float)mPosition / (float)mMaxRange; + bar_end = ((float)mThumbSize + (float)mPosition ) / (float)mMaxRange; + printf("CalcBarBounds: start: %f end: %f\n", bar_start, bar_end); + } + + if (mIsVertical == PR_TRUE) { + mBarBounds.x = 0; + mBarBounds.y = (int)(bar_start * mBounds.height); + mBarBounds.width = mBounds.width; + mBarBounds.height = (int)(bar_end * mBounds.height); + } + else { + mBarBounds.x = (int)(bar_start * mBounds.width); + mBarBounds.y = 0; + mBarBounds.width = (int)(bar_end * mBounds.width); + mBarBounds.height = mBounds.height; + } + if (mBarBounds.height == 0) { + mBarBounds.height = 1; + } + if (mBarBounds.width == 0) { + mBarBounds.width = 1; + } + printf("CalcBarBounds: bar is (%s) %d %d %d %d\n", ((mIsVertical == PR_TRUE) ? "vertical" : "horizontal" ), mBarBounds.x, mBarBounds.y, mBarBounds.width, mBarBounds.height); +} + +void nsScrollbar::LayoutBar(void) +{ + XMoveResizeWindow(gDisplay, mBar, + mBarBounds.x, mBarBounds.y, + mBarBounds.width, mBarBounds.height); } diff --git a/mozilla/widget/src/xlib/nsScrollBar.h b/mozilla/widget/src/xlib/nsScrollBar.h index cfcf36f244b..9002e9a2817 100644 --- a/mozilla/widget/src/xlib/nsScrollBar.h +++ b/mozilla/widget/src/xlib/nsScrollBar.h @@ -36,9 +36,17 @@ public: NS_IMETHOD_(nsrefcnt) Release(void); // Override some of the native widget methods for scrollbars - PRBool OnPaint(nsPaintEvent &event); - PRBool OnResize(nsSizeEvent &event); - PRBool DispatchMouseEvent(nsMouseEvent &aEvent); + PRBool OnResize (nsSizeEvent &event); + PRBool DispatchMouseEvent (nsMouseEvent &aEvent); + NS_IMETHOD Show (PRBool bState); + NS_IMETHOD Resize (PRUint32 aWidth, + PRUint32 aHeight, + PRBool aRepaint); + NS_IMETHOD Resize (PRUint32 aX, + PRUint32 aY, + PRUint32 aWidth, + PRUint32 aHeight, + PRBool aRepaint); // nsIScrollBar implementation NS_IMETHOD SetMaxRange(PRUint32 aEndRange); @@ -56,12 +64,16 @@ public: void CreateNative(Window aParent, nsRect aRect); private: + void CalcBarBounds(void); + void LayoutBar(void); PRUint32 mMaxRange; PRUint32 mPosition; PRUint32 mThumbSize; PRUint32 mLineIncrement; PRBool mIsVertical; nsIRenderingContext *mRenderingContext; + Window mBar; + nsRect mBarBounds; }; #endif // nsButton_h__