From a27e5441c46cf61414b24211f2df5a76af77b5c8 Mon Sep 17 00:00:00 2001 From: "pavlov%netscape.com" Date: Tue, 28 Sep 1999 01:31:41 +0000 Subject: [PATCH] work to get drawing done based on regions and not rects. remove unneeded code in nsBaseWidget and removed tabs. add InvalidateRegion() method to nsIWidget. did InvalidateRegion implimentation on unix. a=shaver r=beard git-svn-id: svn://10.0.0.236/trunk@49180 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/widget/public/nsGUIEvent.h | 3 + mozilla/widget/public/nsIWidget.h | 13 +- mozilla/widget/public/nsIWidget.idl | 9 + mozilla/widget/src/gtk/nsGtkUtils.cpp | 2 +- mozilla/widget/src/gtk/nsWidget.cpp | 41 ++ mozilla/widget/src/gtk/nsWidget.h | 5 + mozilla/widget/src/gtk/nsWindow.cpp | 9 + mozilla/widget/src/windows/nsWindow.cpp | 9 +- mozilla/widget/src/xpwidgets/nsBaseWidget.cpp | 427 +++++++++--------- mozilla/widget/src/xpwidgets/nsBaseWidget.h | 210 ++++----- 10 files changed, 417 insertions(+), 311 deletions(-) diff --git a/mozilla/widget/public/nsGUIEvent.h b/mozilla/widget/public/nsGUIEvent.h index 722cb5829b7..6cde82a18fb 100644 --- a/mozilla/widget/public/nsGUIEvent.h +++ b/mozilla/widget/public/nsGUIEvent.h @@ -23,6 +23,7 @@ #include "nsRect.h" class nsIRenderingContext; +class nsIRegion; class nsIWidget; class nsIMenuItem; @@ -89,6 +90,8 @@ struct nsSizeEvent : public nsGUIEvent { struct nsPaintEvent : public nsGUIEvent { /// Context to paint in. nsIRenderingContext *renderingContext; + /// area to paint (should be used instead of rect) + nsIRegion *region; /// x,y, width, height in pixels of area to paint nsRect *rect; }; diff --git a/mozilla/widget/public/nsIWidget.h b/mozilla/widget/public/nsIWidget.h index 1f665edc6a7..eb99bebd21e 100644 --- a/mozilla/widget/public/nsIWidget.h +++ b/mozilla/widget/public/nsIWidget.h @@ -477,6 +477,15 @@ class nsIWidget : public nsISupports { NS_IMETHOD Invalidate(const nsRect & aRect, PRBool aIsSynchronous) = 0; + /** + * Invalidate a specified region for a widget and repaints it. + * + * @param aIsSynchronouse PR_TRUE then repaint synchronously. If PR_FALSE repaint later. + * @see #Update() + */ + + NS_IMETHOD InvalidateRegion(const nsIRegion* aRegion, PRBool aIsSynchronous) = 0; + /** * Force a synchronous repaint of the window if there are dirty rects. * @@ -643,12 +652,14 @@ class nsIWidget : public nsISupports { NS_IMETHOD DispatchEvent(nsGUIEvent* event, nsEventStatus & aStatus) = 0; +#ifdef LOSER /** * FSets the vertical scrollbar widget * */ NS_IMETHOD SetVerticalScrollbar(nsIWidget * aScrollbar) = 0; - +#endif + /** * For printing and lightweight widgets * diff --git a/mozilla/widget/public/nsIWidget.idl b/mozilla/widget/public/nsIWidget.idl index bbb9850e531..51e9fcdf1b4 100644 --- a/mozilla/widget/public/nsIWidget.idl +++ b/mozilla/widget/public/nsIWidget.idl @@ -26,6 +26,7 @@ */ #include "nsISupports.idl" +#include "nsIScriptableRegion.idl" %{ C++ #include "nsRect.h" @@ -466,6 +467,14 @@ interface nsIWidget : nsISupports */ void InvalidateRect([const] in nsRect aRect, in PRBool aIsSynchronous); + /** + * Invalidate a specified rect for a widget and repaints it. + * + * @param aIsSynchronouse PR_TRUE then repaint synchronously. If PR_FALSE repaint later. + * @see #Update() + */ + void InvalidateRect([const] in nsIScriptableRegion aRegion, in PRBool aIsSynchronous); + /** * Force a synchronous repaint of the window if there are dirty rects. * diff --git a/mozilla/widget/src/gtk/nsGtkUtils.cpp b/mozilla/widget/src/gtk/nsGtkUtils.cpp index 05e93012297..49efaff9cb7 100644 --- a/mozilla/widget/src/gtk/nsGtkUtils.cpp +++ b/mozilla/widget/src/gtk/nsGtkUtils.cpp @@ -212,7 +212,7 @@ nsGtkUtils::gdk_window_flash(GdkWindow * aGdkWindow, XSync(display, False); - usleep(aInterval); + usleep(aInterval); } diff --git a/mozilla/widget/src/gtk/nsWidget.cpp b/mozilla/widget/src/gtk/nsWidget.cpp index 24e055f8d1b..0d5bbfc6389 100644 --- a/mozilla/widget/src/gtk/nsWidget.cpp +++ b/mozilla/widget/src/gtk/nsWidget.cpp @@ -753,6 +753,41 @@ NS_IMETHODIMP nsWidget::Invalidate(const nsRect & aRect, PRBool aIsSynchronous) return NS_OK; } + +NS_IMETHODIMP nsWidget::InvalidateRegion(const nsIRegion *aRegion, PRBool aIsSynchronous) +{ + nsRegionRectSet *regionRectSet = nsnull; + + mUpdateArea->Union(*aRegion); + + if (NS_FAILED(mUpdateArea->GetRects(®ionRectSet))) + { + return NS_ERROR_FAILURE; + } + + mUpdateArea->Union(*aRegion); + + PRUint32 len; + PRUint32 i; + + len = regionRectSet->mRectsLen; + + for (i=0;imRects[i]); + + gtk_widget_queue_draw_area(mWidget, + r->x, r->y, + r->width, r->height); + } + + // drop the const.. whats the right thing to do here? + ((nsIRegion*)aRegion)->FreeRects(regionRectSet); + + return NS_OK; +} + + NS_IMETHODIMP nsWidget::Update(void) { if (!mWidget) @@ -846,6 +881,12 @@ NS_IMETHODIMP nsWidget::SetPreferredSize(PRInt32 aWidth, PRInt32 aHeight) return NS_OK; } +NS_IMETHODIMP nsWidget::SetTitle(const nsString &aTitle) +{ + gtk_widget_set_name(mWidget, "foo"); + return NS_OK; +} + nsresult nsWidget::CreateWidget(nsIWidget *aParent, const nsRect &aRect, EVENT_CALLBACK aHandleEventFunction, diff --git a/mozilla/widget/src/gtk/nsWidget.h b/mozilla/widget/src/gtk/nsWidget.h index 837f4c9250b..44c3df3f5da 100644 --- a/mozilla/widget/src/gtk/nsWidget.h +++ b/mozilla/widget/src/gtk/nsWidget.h @@ -120,6 +120,10 @@ public: NS_IMETHOD GetPreferredSize(PRInt32& aWidth, PRInt32& aHeight); NS_IMETHOD SetPreferredSize(PRInt32 aWidth, PRInt32 aHeight); + // Use this to set the name of a widget for normal widgets.. not the same as the nsWindow version + NS_IMETHOD SetTitle(const nsString& aTitle); + + virtual void ConvertToDeviceCoordinates(nscoord &aX, nscoord &aY); // the following are nsWindow specific, and just stubbed here @@ -132,6 +136,7 @@ public: NS_IMETHOD Invalidate(PRBool aIsSynchronous); NS_IMETHOD Invalidate(const nsRect &aRect, PRBool aIsSynchronous); + NS_IMETHOD InvalidateRegion(const nsIRegion *aRegion, PRBool aIsSynchronous); NS_IMETHOD Update(void); NS_IMETHOD DispatchEvent(nsGUIEvent* event, nsEventStatus & aStatus); diff --git a/mozilla/widget/src/gtk/nsWindow.cpp b/mozilla/widget/src/gtk/nsWindow.cpp index 669b6a4abc1..e0830e8e5f9 100644 --- a/mozilla/widget/src/gtk/nsWindow.cpp +++ b/mozilla/widget/src/gtk/nsWindow.cpp @@ -426,6 +426,10 @@ PRBool nsWindow::OnExpose(nsPaintEvent &event) mUpdateArea->Union(event.rect->x, event.rect->y, event.rect->width, event.rect->height); + // NS_ADDREF(mUpdateArea); + // event.region = mUpdateArea; + + // printf("\n\n"); PRInt32 x, y, w, h; mUpdateArea->GetBoundingBox(&x,&y,&w,&h); @@ -453,6 +457,7 @@ PRBool nsWindow::OnExpose(nsPaintEvent &event) result = DispatchWindowEvent(&event); NS_RELEASE(event.renderingContext); + // NS_RELEASE(mUpdateArea); } @@ -509,6 +514,9 @@ PRBool nsWindow::OnDraw(nsPaintEvent &event) #endif // NS_DEBUG + // NS_ADDREF(mUpdateArea); + // event.region = mUpdateArea; + // printf("\n\n"); PRInt32 x, y, w, h; mUpdateArea->GetBoundingBox(&x,&y,&w,&h); @@ -536,6 +544,7 @@ PRBool nsWindow::OnDraw(nsPaintEvent &event) result = DispatchWindowEvent(&event); NS_RELEASE(event.renderingContext); + // NS_RELEASE(mUpdateArea); } diff --git a/mozilla/widget/src/windows/nsWindow.cpp b/mozilla/widget/src/windows/nsWindow.cpp index 51802463ec4..97781cef2b6 100644 --- a/mozilla/widget/src/windows/nsWindow.cpp +++ b/mozilla/widget/src/windows/nsWindow.cpp @@ -114,7 +114,9 @@ nsWindow::nsWindow() : nsBaseWidget() mHitMenu = nsnull; mHitSubMenus = new nsVoidArray(); +#ifdef LOSER mVScrollbar = nsnull; +#endif mIsInMouseCapture = PR_FALSE; mIMEProperty = 0; @@ -2590,7 +2592,9 @@ PRBool nsWindow::ProcessMessage(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT case WM_SETTINGCHANGE: firstTime = TRUE; // Fall through - case WM_MOUSEWHEEL: { + case WM_MOUSEWHEEL: +#ifdef LOSER + { if (firstTime) { firstTime = FALSE; //printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ WM_SETTINGCHANGE\n"); @@ -2611,6 +2615,7 @@ PRBool nsWindow::ProcessMessage(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT } } HWND scrollbar = NULL; + if (nsnull != mVScrollbar) { scrollbar = (HWND)mVScrollbar->GetNativeData(NS_NATIVE_WINDOW); } @@ -2634,7 +2639,7 @@ PRBool nsWindow::ProcessMessage(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT } return 0 ; } break; - +#endif case WM_PALETTECHANGED: if ((HWND)wParam == mWnd) { diff --git a/mozilla/widget/src/xpwidgets/nsBaseWidget.cpp b/mozilla/widget/src/xpwidgets/nsBaseWidget.cpp index 92b907dbc52..ed5cf9119a1 100644 --- a/mozilla/widget/src/xpwidgets/nsBaseWidget.cpp +++ b/mozilla/widget/src/xpwidgets/nsBaseWidget.cpp @@ -60,7 +60,9 @@ nsBaseWidget::nsBaseWidget() , mIsDestroying(PR_FALSE) , mOnDestroyCalled(PR_FALSE) , mBounds(0,0,0,0) +#ifdef LOSER , mVScrollbar(nsnull) +#endif , mZIndex(0) { NS_NewISupportsArray(getter_AddRefs(mChildren)); @@ -77,7 +79,9 @@ nsBaseWidget::nsBaseWidget() nsBaseWidget::~nsBaseWidget() { NS_IF_RELEASE(mMenuListener); +#ifdef LOSER NS_IF_RELEASE(mVScrollbar); +#endif } //------------------------------------------------------------------------- @@ -86,67 +90,69 @@ nsBaseWidget::~nsBaseWidget() // //------------------------------------------------------------------------- void nsBaseWidget::BaseCreate(nsIWidget *aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIAppShell *aAppShell, - nsIToolkit *aToolkit, - nsWidgetInitData *aInitData) + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext, + nsIAppShell *aAppShell, + nsIToolkit *aToolkit, + nsWidgetInitData *aInitData) { - if (nsnull == mToolkit) { - if (nsnull != aToolkit) { - mToolkit = (nsIToolkit*)aToolkit; - NS_ADDREF(mToolkit); - } - else { - if (nsnull != aParent) { - mToolkit = (nsIToolkit*)(aParent->GetToolkit()); // the call AddRef's, we don't have to - } - // it's some top level window with no toolkit passed in. - // Create a default toolkit with the current thread - else { - static NS_DEFINE_CID(kToolkitCID, NS_TOOLKIT_CID); - - nsresult res; - res = nsComponentManager::CreateInstance(kToolkitCID, nsnull, NS_GET_IID(nsIToolkit), (void **)&mToolkit); - if (NS_OK != res) - NS_ASSERTION(PR_FALSE, "Can not create a toolkit in nsBaseWidget::Create"); - if (mToolkit) - mToolkit->Init(PR_GetCurrentThread()); - } - } - - } - - mAppShell = aAppShell; - NS_IF_ADDREF(mAppShell); - - // save the event callback function - mEventCallback = aHandleEventFunction; - - // keep a reference to the device context - if (aContext) { - mContext = aContext; - NS_ADDREF(mContext); + if (nsnull == mToolkit) { + if (nsnull != aToolkit) { + mToolkit = (nsIToolkit*)aToolkit; + NS_ADDREF(mToolkit); } else { - nsresult res; - - static NS_DEFINE_CID(kDeviceContextCID, NS_DEVICE_CONTEXT_CID); - - res = nsComponentManager::CreateInstance(kDeviceContextCID, nsnull, NS_GET_IID(nsIDeviceContext), (void **)&mContext); - - if (NS_OK == res) - mContext->Init(nsnull); + if (nsnull != aParent) { + mToolkit = (nsIToolkit*)(aParent->GetToolkit()); // the call AddRef's, we don't have to + } + // it's some top level window with no toolkit passed in. + // Create a default toolkit with the current thread + else { + static NS_DEFINE_CID(kToolkitCID, NS_TOOLKIT_CID); + + nsresult res; + res = nsComponentManager::CreateInstance(kToolkitCID, nsnull, + NS_GET_IID(nsIToolkit), (void **)&mToolkit); + if (NS_OK != res) + NS_ASSERTION(PR_FALSE, "Can not create a toolkit in nsBaseWidget::Create"); + if (mToolkit) + mToolkit->Init(PR_GetCurrentThread()); + } } + + } + + mAppShell = aAppShell; + NS_IF_ADDREF(mAppShell); + + // save the event callback function + mEventCallback = aHandleEventFunction; + + // keep a reference to the device context + if (aContext) { + mContext = aContext; + NS_ADDREF(mContext); + } + else { + nsresult res; + + static NS_DEFINE_CID(kDeviceContextCID, NS_DEVICE_CONTEXT_CID); + + res = nsComponentManager::CreateInstance(kDeviceContextCID, nsnull, + NS_GET_IID(nsIDeviceContext), (void **)&mContext); - if (nsnull != aInitData) { - PreCreateWidget(aInitData); - } + if (NS_OK == res) + mContext->Init(nsnull); + } - if (aParent) { - aParent->AddChild(this); - } + if (nsnull != aInitData) { + PreCreateWidget(aInitData); + } + + if (aParent) { + aParent->AddChild(this); + } } NS_IMETHODIMP nsBaseWidget::CaptureMouse(PRBool aCapture) @@ -154,6 +160,11 @@ NS_IMETHODIMP nsBaseWidget::CaptureMouse(PRBool aCapture) return NS_OK; } +NS_IMETHODIMP nsBaseWidget::InvalidateRegion(const nsIRegion *aRegion, PRBool aIsSynchronous) +{ + return NS_ERROR_FAILURE; +} + //------------------------------------------------------------------------- // // Accessor functions to get/set the client data @@ -185,9 +196,9 @@ NS_METHOD nsBaseWidget::Destroy() parent->RemoveChild(this); NS_RELEASE(parent); } - +#ifdef LOSER NS_IF_RELEASE(mVScrollbar); - +#endif // disconnect listeners. NS_IF_RELEASE(mMouseListener); NS_IF_RELEASE(mEventListener); @@ -303,7 +314,7 @@ NS_IMETHODIMP nsBaseWidget::GetZIndex(PRInt32* aZIndex) //------------------------------------------------------------------------- nscolor nsBaseWidget::GetForegroundColor(void) { - return mForeground; + return mForeground; } @@ -314,8 +325,8 @@ nscolor nsBaseWidget::GetForegroundColor(void) //------------------------------------------------------------------------- NS_METHOD nsBaseWidget::SetForegroundColor(const nscolor &aColor) { - mForeground = aColor; - return NS_OK; + mForeground = aColor; + return NS_OK; } @@ -326,7 +337,7 @@ NS_METHOD nsBaseWidget::SetForegroundColor(const nscolor &aColor) //------------------------------------------------------------------------- nscolor nsBaseWidget::GetBackgroundColor(void) { - return mBackground; + return mBackground; } //------------------------------------------------------------------------- @@ -336,8 +347,8 @@ nscolor nsBaseWidget::GetBackgroundColor(void) //------------------------------------------------------------------------- NS_METHOD nsBaseWidget::SetBackgroundColor(const nscolor &aColor) { - mBackground = aColor; - return NS_OK; + mBackground = aColor; + return NS_OK; } //------------------------------------------------------------------------- @@ -347,7 +358,7 @@ NS_METHOD nsBaseWidget::SetBackgroundColor(const nscolor &aColor) //------------------------------------------------------------------------- nsCursor nsBaseWidget::GetCursor() { - return mCursor; + return mCursor; } NS_METHOD nsBaseWidget::SetCursor(nsCursor aCursor) @@ -411,8 +422,8 @@ nsIDeviceContext* nsBaseWidget::GetDeviceContext() nsIAppShell *nsBaseWidget::GetAppShell() { - NS_IF_ADDREF(mAppShell); - return mAppShell; + NS_IF_ADDREF(mAppShell); + return mAppShell; } @@ -423,131 +434,10 @@ nsIAppShell *nsBaseWidget::GetAppShell() //------------------------------------------------------------------------- void nsBaseWidget::OnDestroy() { - // release references to device context, toolkit, and app shell - NS_IF_RELEASE(mContext); - NS_IF_RELEASE(mToolkit); - NS_IF_RELEASE(mAppShell); -} - - -//------------------------------------------------------------------------- -// -// Constructor -// -//------------------------------------------------------------------------- - -nsBaseWidget::Enumerator::Enumerator(nsBaseWidget & inParent) - : mCurrentPosition(0), mParent(inParent) -{ - NS_INIT_REFCNT(); -} - - -//------------------------------------------------------------------------- -// -// Destructor -// -//------------------------------------------------------------------------- -nsBaseWidget::Enumerator::~Enumerator() -{ -} - - -//enumerator interfaces -NS_IMETHODIMP -nsBaseWidget::Enumerator::Next() -{ - PRUint32 itemCount = 0; - mParent.mChildren->Count(&itemCount); - if (mCurrentPosition < itemCount - 1 ) - mCurrentPosition ++; - else - return NS_ERROR_FAILURE; - return NS_OK; -} - - - -NS_IMETHODIMP -nsBaseWidget::Enumerator::Prev() -{ - if (mCurrentPosition > 0 ) - mCurrentPosition --; - else - return NS_ERROR_FAILURE; - return NS_OK; -} - - - -NS_IMETHODIMP -nsBaseWidget::Enumerator::CurrentItem(nsISupports **aItem) -{ - if (!aItem) - return NS_ERROR_NULL_POINTER; - - PRUint32 itemCount = 0; - mParent.mChildren->Count(&itemCount); - if ( mCurrentPosition < itemCount ) { - nsISupports* widget = mParent.mChildren->ElementAt(mCurrentPosition); -// NS_IF_ADDREF(widget); already addref'd in nsSupportsArray::ElementAt() - *aItem = widget; - } - else - return NS_ERROR_FAILURE; - - return NS_OK; -} - - - -NS_IMETHODIMP -nsBaseWidget::Enumerator::First() -{ - PRUint32 itemCount = 0; - mParent.mChildren->Count(&itemCount); - if ( itemCount ) { - mCurrentPosition = 0; - return NS_OK; - } - else - return NS_ERROR_FAILURE; - - return NS_OK; -} - - - -NS_IMETHODIMP -nsBaseWidget::Enumerator::Last() -{ - PRUint32 itemCount = 0; - mParent.mChildren->Count(&itemCount); - if ( itemCount ) { - mCurrentPosition = itemCount - 1; - return NS_OK; - } - else - return NS_ERROR_FAILURE; - - return NS_OK; -} - - - -NS_IMETHODIMP -nsBaseWidget::Enumerator::IsDone() -{ - PRUint32 itemCount = 0; - mParent.mChildren->Count(&itemCount); - - if ((mCurrentPosition == itemCount-1) || (itemCount == 0) ){ //empty lists always return done - return NS_OK; - } - else { - return NS_COMFALSE; - } - return NS_OK; + // release references to device context, toolkit, and app shell + NS_IF_RELEASE(mContext); + NS_IF_RELEASE(mToolkit); + NS_IF_RELEASE(mAppShell); } @@ -565,11 +455,6 @@ NS_METHOD nsBaseWidget::SetBorderStyle(nsBorderStyle aBorderStyle) } -NS_METHOD nsBaseWidget::SetTitle(const nsString& aTitle) -{ - return NS_OK; -} - /** * Processes a mouse pressed event * @@ -658,7 +543,7 @@ NS_METHOD nsBaseWidget::SetBounds(const nsRect &aRect) return NS_OK; } - + /** @@ -765,6 +650,7 @@ NS_METHOD nsBaseWidget::Paint(nsIRenderingContext& aRenderingContext, return NS_OK; } +#ifdef LOSER NS_METHOD nsBaseWidget::SetVerticalScrollbar(nsIWidget * aWidget) { NS_IF_RELEASE(mVScrollbar); @@ -772,6 +658,7 @@ NS_METHOD nsBaseWidget::SetVerticalScrollbar(nsIWidget * aWidget) NS_IF_ADDREF(mVScrollbar); return NS_OK; } +#endif NS_METHOD nsBaseWidget::EnableDragDrop(PRBool aEnable) { @@ -783,12 +670,6 @@ NS_METHOD nsBaseWidget::SetModal(void) return NS_ERROR_FAILURE; } -//------------------------------------------------------------------------- -NS_IMETHODIMP nsBaseWidget::CaptureRollupEvents(nsIRollupListener * aListener, PRBool aDoCapture) -{ - return NS_ERROR_FAILURE; -} - #ifdef NS_DEBUG ////////////////////////////////////////////////////////////// // @@ -1079,3 +960,143 @@ nsBaseWidget::debug_CleanupCrapSoThatBruceAndPurifyAreHappy() #endif // NS_DEBUG + + + + + + + + + + + + + + + + + + + + + +//------------------------------------------------------------------------- +// +// Constructor +// +//------------------------------------------------------------------------- + +nsBaseWidget::Enumerator::Enumerator(nsBaseWidget & inParent) + : mCurrentPosition(0), mParent(inParent) +{ + NS_INIT_REFCNT(); +} + + +//------------------------------------------------------------------------- +// +// Destructor +// +//------------------------------------------------------------------------- +nsBaseWidget::Enumerator::~Enumerator() +{ +} + + +//enumerator interfaces +NS_IMETHODIMP +nsBaseWidget::Enumerator::Next() +{ + PRUint32 itemCount = 0; + mParent.mChildren->Count(&itemCount); + if (mCurrentPosition < itemCount - 1 ) + mCurrentPosition ++; + else + return NS_ERROR_FAILURE; + return NS_OK; +} + + + +NS_IMETHODIMP +nsBaseWidget::Enumerator::Prev() +{ + if (mCurrentPosition > 0 ) + mCurrentPosition --; + else + return NS_ERROR_FAILURE; + return NS_OK; +} + + + +NS_IMETHODIMP +nsBaseWidget::Enumerator::CurrentItem(nsISupports **aItem) +{ + if (!aItem) + return NS_ERROR_NULL_POINTER; + + PRUint32 itemCount = 0; + mParent.mChildren->Count(&itemCount); + if ( mCurrentPosition < itemCount ) { + nsISupports* widget = mParent.mChildren->ElementAt(mCurrentPosition); +// NS_IF_ADDREF(widget); already addref'd in nsSupportsArray::ElementAt() + *aItem = widget; + } + else + return NS_ERROR_FAILURE; + + return NS_OK; +} + + + +NS_IMETHODIMP +nsBaseWidget::Enumerator::First() +{ + PRUint32 itemCount = 0; + mParent.mChildren->Count(&itemCount); + if ( itemCount ) { + mCurrentPosition = 0; + return NS_OK; + } + else + return NS_ERROR_FAILURE; + + return NS_OK; +} + + + +NS_IMETHODIMP +nsBaseWidget::Enumerator::Last() +{ + PRUint32 itemCount = 0; + mParent.mChildren->Count(&itemCount); + if ( itemCount ) { + mCurrentPosition = itemCount - 1; + return NS_OK; + } + else + return NS_ERROR_FAILURE; + + return NS_OK; +} + + + +NS_IMETHODIMP +nsBaseWidget::Enumerator::IsDone() +{ + PRUint32 itemCount = 0; + mParent.mChildren->Count(&itemCount); + + if ((mCurrentPosition == itemCount-1) || (itemCount == 0) ){ //empty lists always return done + return NS_OK; + } + else { + return NS_COMFALSE; + } + return NS_OK; +} diff --git a/mozilla/widget/src/xpwidgets/nsBaseWidget.h b/mozilla/widget/src/xpwidgets/nsBaseWidget.h index 318df2ac482..19f1ec0bb20 100644 --- a/mozilla/widget/src/xpwidgets/nsBaseWidget.h +++ b/mozilla/widget/src/xpwidgets/nsBaseWidget.h @@ -44,127 +44,129 @@ class nsBaseWidget : public nsIWidget { public: - nsBaseWidget(); - virtual ~nsBaseWidget(); + nsBaseWidget(); + virtual ~nsBaseWidget(); + + NS_DECL_ISUPPORTS + + NS_IMETHOD PreCreateWidget(nsWidgetInitData *aWidgetInitData) { return NS_OK;} + + // nsIWidget interface + NS_IMETHOD CaptureMouse(PRBool aCapture); + NS_IMETHOD InvalidateRegion(const nsIRegion *aRegion, PRBool aIsSynchronous); + NS_IMETHOD GetClientData(void*& aClientData); + NS_IMETHOD SetClientData(void* aClientData); + NS_IMETHOD Destroy(); + virtual nsIWidget* GetParent(void); + virtual nsIEnumerator* GetChildren(); + virtual void AddChild(nsIWidget* aChild); + virtual void RemoveChild(nsIWidget* aChild); - NS_DECL_ISUPPORTS + NS_IMETHOD SetZIndex(PRInt32 aZIndex); + NS_IMETHOD GetZIndex(PRInt32* aZIndex); - NS_IMETHOD PreCreateWidget(nsWidgetInitData *aWidgetInitData) { return NS_OK;} - - // nsIWidget interface - NS_IMETHOD CaptureMouse(PRBool aCapture); - NS_IMETHOD GetClientData(void*& aClientData); - NS_IMETHOD SetClientData(void* aClientData); - NS_IMETHOD Destroy(); - virtual nsIWidget* GetParent(void); - virtual nsIEnumerator* GetChildren(); - virtual void AddChild(nsIWidget* aChild); - virtual void RemoveChild(nsIWidget* aChild); - - NS_IMETHOD SetZIndex(PRInt32 aZIndex); - NS_IMETHOD GetZIndex(PRInt32* aZIndex); - - virtual nscolor GetForegroundColor(void); - NS_IMETHOD SetForegroundColor(const nscolor &aColor); - virtual nscolor GetBackgroundColor(void); - NS_IMETHOD SetBackgroundColor(const nscolor &aColor); - virtual nsCursor GetCursor(); - NS_IMETHOD SetCursor(nsCursor aCursor); - virtual nsIRenderingContext* GetRenderingContext(); - virtual nsIDeviceContext* GetDeviceContext(); - virtual nsIAppShell * GetAppShell(); - virtual nsIToolkit* GetToolkit(); - NS_IMETHOD SetModal(void); - NS_IMETHOD SetWindowType(nsWindowType aWindowType); - NS_IMETHOD SetBorderStyle(nsBorderStyle aBorderStyle); - NS_IMETHOD SetTitle(const nsString& aTitle); - NS_IMETHOD AddMouseListener(nsIMouseListener * aListener); - NS_IMETHOD AddEventListener(nsIEventListener * aListener); - NS_IMETHOD AddMenuListener(nsIMenuListener * aListener); - NS_IMETHOD SetBounds(const nsRect &aRect); - NS_IMETHOD GetBounds(nsRect &aRect); - NS_IMETHOD GetBoundsAppUnits(nsRect &aRect, float aAppUnits); - NS_IMETHOD GetClientBounds(nsRect &aRect); - NS_IMETHOD GetBorderSize(PRInt32 &aWidth, PRInt32 &aHeight); - NS_IMETHOD Paint(nsIRenderingContext& aRenderingContext, const nsRect& aDirtyRect); - NS_IMETHOD SetVerticalScrollbar(nsIWidget * aScrollbar); - NS_IMETHOD EnableDragDrop(PRBool aEnable); - virtual void ConvertToDeviceCoordinates(nscoord &aX,nscoord &aY) {} - virtual void FreeNativeData(void * data, PRUint32 aDataType) {}//~~~ - - NS_IMETHOD CaptureRollupEvents(nsIRollupListener * aListener, PRBool aDoCapture); + virtual nscolor GetForegroundColor(void); + NS_IMETHOD SetForegroundColor(const nscolor &aColor); + virtual nscolor GetBackgroundColor(void); + NS_IMETHOD SetBackgroundColor(const nscolor &aColor); + virtual nsCursor GetCursor(); + NS_IMETHOD SetCursor(nsCursor aCursor); + virtual nsIRenderingContext* GetRenderingContext(); + virtual nsIDeviceContext* GetDeviceContext(); + virtual nsIAppShell * GetAppShell(); + virtual nsIToolkit* GetToolkit(); + NS_IMETHOD SetModal(void); + NS_IMETHOD SetWindowType(nsWindowType aWindowType); + NS_IMETHOD SetBorderStyle(nsBorderStyle aBorderStyle); + NS_IMETHOD AddMouseListener(nsIMouseListener * aListener); + NS_IMETHOD AddEventListener(nsIEventListener * aListener); + NS_IMETHOD AddMenuListener(nsIMenuListener * aListener); + NS_IMETHOD SetBounds(const nsRect &aRect); + NS_IMETHOD GetBounds(nsRect &aRect); + NS_IMETHOD GetBoundsAppUnits(nsRect &aRect, float aAppUnits); + NS_IMETHOD GetClientBounds(nsRect &aRect); + NS_IMETHOD GetBorderSize(PRInt32 &aWidth, PRInt32 &aHeight); + NS_IMETHOD Paint(nsIRenderingContext& aRenderingContext, const nsRect& aDirtyRect); +#ifdef LOSER + NS_IMETHOD SetVerticalScrollbar(nsIWidget * aScrollbar); +#endif + NS_IMETHOD EnableDragDrop(PRBool aEnable); + virtual void ConvertToDeviceCoordinates(nscoord &aX,nscoord &aY) {} + virtual void FreeNativeData(void * data, PRUint32 aDataType) {}//~~~ protected: - virtual void DrawScaledRect(nsIRenderingContext& aRenderingContext, - const nsRect & aRect, - float aScale, - float aAppUnits); - virtual void DrawScaledLine(nsIRenderingContext& aRenderingContext, - nscoord aSX, nscoord aSY, nscoord aEX, nscoord aEY, - float aScale, float aAppUnits, PRBool aIsHorz); - virtual void OnDestroy(); - virtual void BaseCreate(nsIWidget *aParent, - const nsRect &aRect, - EVENT_CALLBACK aHandleEventFunction, - nsIDeviceContext *aContext, - nsIAppShell *aAppShell, - nsIToolkit *aToolkit, - nsWidgetInitData *aInitData); + virtual void DrawScaledRect(nsIRenderingContext& aRenderingContext, + const nsRect & aRect, + float aScale, + float aAppUnits); + virtual void DrawScaledLine(nsIRenderingContext& aRenderingContext, + nscoord aSX, nscoord aSY, nscoord aEX, nscoord aEY, + float aScale, float aAppUnits, PRBool aIsHorz); + virtual void OnDestroy(); + virtual void BaseCreate(nsIWidget *aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext, + nsIAppShell *aAppShell, + nsIToolkit *aToolkit, + nsWidgetInitData *aInitData); protected: - void* mClientData; - EVENT_CALLBACK mEventCallback; - nsIDeviceContext *mContext; - nsIAppShell *mAppShell; - nsIToolkit *mToolkit; - nsIMouseListener *mMouseListener; - nsIEventListener *mEventListener; - nsIMenuListener *mMenuListener; - nscolor mBackground; - nscolor mForeground; - nsCursor mCursor; - nsWindowType mWindowType; - nsBorderStyle mBorderStyle; - PRBool mIsShiftDown; - PRBool mIsControlDown; - PRBool mIsAltDown; - PRBool mIsDestroying; - PRBool mOnDestroyCalled; - nsRect mBounds; - nsIWidget *mVScrollbar; - PRInt32 mZIndex; + void* mClientData; + EVENT_CALLBACK mEventCallback; + nsIDeviceContext *mContext; + nsIAppShell *mAppShell; + nsIToolkit *mToolkit; + nsIMouseListener *mMouseListener; + nsIEventListener *mEventListener; + nsIMenuListener *mMenuListener; + nscolor mBackground; + nscolor mForeground; + nsCursor mCursor; + nsWindowType mWindowType; + nsBorderStyle mBorderStyle; + PRBool mIsShiftDown; + PRBool mIsControlDown; + PRBool mIsAltDown; + PRBool mIsDestroying; + PRBool mOnDestroyCalled; + nsRect mBounds; +#ifdef LOSER + nsIWidget *mVScrollbar; +#endif + PRInt32 mZIndex; // keep the list of children - nsCOMPtr mChildren; + nsCOMPtr mChildren; - class Enumerator : public nsIBidirectionalEnumerator { - public: - NS_DECL_ISUPPORTS + class Enumerator : public nsIBidirectionalEnumerator { + public: + NS_DECL_ISUPPORTS - Enumerator(nsBaseWidget & inParent); - virtual ~Enumerator(); + Enumerator(nsBaseWidget & inParent); + virtual ~Enumerator(); - NS_DECL_NSIENUMERATOR - NS_DECL_NSIBIDIRECTIONALENUMERATOR + NS_DECL_NSIENUMERATOR + NS_DECL_NSIBIDIRECTIONALENUMERATOR - private: - PRUint32 mCurrentPosition; - nsBaseWidget& mParent; - }; - friend class Enumerator; + private: + PRUint32 mCurrentPosition; + nsBaseWidget& mParent; + }; + friend class Enumerator; // Enumeration of the methods which are accessable on the "main GUI thread" // via the CallMethod(...) mechanism... // see nsSwitchToUIThread - enum { - CREATE = 0x0101, - CREATE_NATIVE, - DESTROY, - SET_FOCUS, - SET_CURSOR, - CREATE_HACK - }; + enum { + CREATE = 0x0101, + CREATE_NATIVE, + DESTROY, + SET_FOCUS, + SET_CURSOR, + CREATE_HACK + }; #ifdef NS_DEBUG protected: