diff --git a/widget/src/mac/nsFileWidget.h b/widget/src/mac/nsFileWidget.h new file mode 100644 index 000000000000..28132f0d9fbe --- /dev/null +++ b/widget/src/mac/nsFileWidget.h @@ -0,0 +1,131 @@ +/* -*- Mode: c++; tab-width: 2; indent-tabs-mode: nil; -*- */ +/* + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#ifndef nsFileWidget_h__ +#define nsFileWidget_h__ + +#include "nsToolkit.h" +#include "nsIWidget.h" +#include "nsIFileWidget.h" +#include "nsWindow.h" + +/** + * Native Motif FileSelector wrapper + */ + +class nsFileWidget : public nsWindow +{ + public: + nsFileWidget(nsISupports *aOuter); + virtual ~nsFileWidget(); + NS_IMETHOD QueryObject(REFNSIID aIID, void** aInstancePtr); + + void Create(nsIWidget *aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext = nsnull, + nsIAppShell *aAppShell = nsnull, + nsIToolkit *aToolkit = nsnull, + nsWidgetInitData *aInitData = nsnull); + + void Create(nsNativeWidget aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext = nsnull, + nsIAppShell *aAppShell = nsnull, + nsIToolkit *aToolkit = nsnull, + nsWidgetInitData *aInitData = nsnull); + + // nsIWidget interface + + virtual void Create( nsIWidget *aParent, + nsString& aTitle, + nsMode aMode, + nsIDeviceContext *aContext = nsnull, + nsIAppShell *aAppShell = nsnull, + nsIToolkit *aToolkit = nsnull, + void *aInitData = nsnull); + + // nsIFileWidget part + virtual void Show(PRBool bState); + virtual void GetFile(nsString& aFile); + virtual void SetDefaultString(nsString& aString); + virtual void SetFilterList(PRUint32 aNumberOfFilters, + const nsString aTitles[], + const nsString aFilters[]); + virtual void OnOk(); + virtual void OnCancel(); + + + + protected: + PRBool mIOwnEventLoop; + PRBool mWasCancelled; + nsString mTitle; + nsMode mMode; + nsString mFile; + PRUint32 mNumberOfFilters; + const nsString* mTitles; + const nsString* mFilters; + nsString mDefault; + + void GetFilterListArray(nsString& aFilterList); + + private: + + // this should not be public + static PRInt32 GetOuterOffset() { + return offsetof(nsFileWidget,mAggWidget); + } + + + // Aggregator class and instance variable used to aggregate in the + // nsIFileWidget interface to nsFileWidget w/o using multiple + // inheritance. + class AggFileWidget : public nsIFileWidget { + public: + AggFileWidget(); + virtual ~AggFileWidget(); + + AGGREGATE_METHOD_DEF + + // nsIFileWidget + virtual void Create( nsIWidget *aParent, + nsString& aTitle, + nsMode aMode, + nsIDeviceContext *aContext = nsnull, + nsIAppShell *aAppShell = nsnull, + nsIToolkit *aToolkit = nsnull, + void *aInitData = nsnull); + + virtual void GetFile(nsString& aFile); + virtual void SetDefaultString(nsString& aString); + virtual void SetFilterList(PRUint32 aNumberOfFilters, + const nsString aTitles[], + const nsString aFilters[]); + + virtual PRBool Show(); + virtual void OnOk(); + virtual void OnCancel(); + }; + AggFileWidget mAggWidget; + friend class AggFileWidget; + +}; + +#endif // nsFileWidget_h__ diff --git a/widget/src/mac/nsListBox.cpp b/widget/src/mac/nsListBox.cpp new file mode 100644 index 000000000000..bb44cc0df61c --- /dev/null +++ b/widget/src/mac/nsListBox.cpp @@ -0,0 +1,556 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#include "nsListBox.h" +#include "nsColor.h" +#include "nsGUIEvent.h" +#include "nsString.h" +#include "nsStringUtil.h" + +#include + +#define DBG 0 + +//------------------------------------------------------------------------- +// +// initializer +// +//------------------------------------------------------------------------- + +void nsListBox::SetMultipleSelection(PRBool aMultipleSelections) +{ + mMultiSelect = aMultipleSelections; +} + + +//------------------------------------------------------------------------- +// +// AddItemAt +// +//------------------------------------------------------------------------- + +void nsListBox::AddItemAt(nsString &aItem, PRInt32 aPosition) +{ + NS_ALLOC_STR_BUF(val, aItem, 256); + + XmString str; + + str = XmStringCreateLocalized(val); + + XmListAddItem(mWidget, str, (int)aPosition+1); + NS_FREE_STR_BUF(val); +} + +//------------------------------------------------------------------------- +// +// Finds an item at a postion +// +//------------------------------------------------------------------------- +PRInt32 nsListBox::FindItem(nsString &aItem, PRInt32 aStartPos) +{ + NS_ALLOC_STR_BUF(val, aItem, 256); + + XmString str = XmStringCreate(val, XmFONTLIST_DEFAULT_TAG); + + int index = XmListItemPos(mWidget, str)-1; + if (index < aStartPos) { + index = -1; + } + NS_FREE_STR_BUF(val); + XmStringFree(str); + + return index; +} + +//------------------------------------------------------------------------- +// +// CountItems - Get Item Count +// +//------------------------------------------------------------------------- +PRInt32 nsListBox::GetItemCount() +{ + int count = 0; + XtVaGetValues(mWidget, XmNitemCount, &count, nsnull); + + return (PRInt32)count; +} + +//------------------------------------------------------------------------- +// +// Removes an Item at a specified location +// +//------------------------------------------------------------------------- +PRBool nsListBox::RemoveItemAt(PRInt32 aPosition) +{ + int count = 0; + XtVaGetValues(mWidget, XmNitemCount, &count, nsnull); + if (aPosition >= 0 && aPosition < count) { + XmListDeletePos(mWidget, aPosition+1); + return PR_TRUE; + } + return PR_FALSE; +} + +//------------------------------------------------------------------------- +// +// +// +//------------------------------------------------------------------------- +PRBool nsListBox::GetItemAt(nsString& anItem, PRInt32 aPosition) +{ + PRBool result = PR_FALSE; + XmStringTable list; + + int count = 0; + XtVaGetValues(mWidget, XmNitems, &list, XmNitemCount, &count, nsnull); + + if (aPosition >= 0 && aPosition < count) { + char * text; + if (XmStringGetLtoR(list[aPosition], XmFONTLIST_DEFAULT_TAG, &text)) { + anItem.SetLength(0); + anItem.Append(text); + XtFree(text); + result = PR_TRUE; + } + } + + return result; +} + +//------------------------------------------------------------------------- +// +// Gets the selected of selected item +// +//------------------------------------------------------------------------- +void nsListBox::GetSelectedItem(nsString& aItem) +{ + int * list; + int count; + + if (XmListGetSelectedPos(mWidget, &list, &count)) { + GetItemAt(aItem, list[0]-1); + XtFree((char *)list); + } +} + +//------------------------------------------------------------------------- +// +// Gets the list of selected otems +// +//------------------------------------------------------------------------- +PRInt32 nsListBox::GetSelectedIndex() +{ + if (!mMultiSelect) { + int * list; + int count; + + if (XmListGetSelectedPos(mWidget, &list, &count)) { + int index = -1; + if (count > 0) { + index = list[0]-1; + } + XtFree((char *)list); + return index; + } + } else { + NS_ASSERTION(0, "Multi selection list box does not support GetSlectedIndex()"); + } + return -1; +} + +//------------------------------------------------------------------------- +// +// SelectItem +// +//------------------------------------------------------------------------- +void nsListBox::SelectItem(PRInt32 aPosition) +{ + int count = 0; + XtVaGetValues(mWidget, XmNitemCount, &count, nsnull); + if (aPosition >= 0 && aPosition < count) { + XmListSelectPos(mWidget, aPosition+1, FALSE); + } +} + +//------------------------------------------------------------------------- +// +// GetSelectedCount +// +//------------------------------------------------------------------------- +PRInt32 nsListBox::GetSelectedCount() +{ + int count = 0; + XtVaGetValues(mWidget, XmNselectedItemCount, &count, nsnull); + return (PRInt32)count; +} + +//------------------------------------------------------------------------- +// +// GetSelectedIndices +// +//------------------------------------------------------------------------- +void nsListBox::GetSelectedIndices(PRInt32 aIndices[], PRInt32 aSize) +{ + int * list; + int count; + + if (XmListGetSelectedPos(mWidget, &list, &count)) { + int num = aSize > count?count:aSize; + int i; + for (i=0;i 0) { + XtVaSetValues(mWidget, XmNselectedItemCount, 0, NULL); + } + int i; + for (i=0;iAddChild(this); + Widget parentWidget = nsnull; + + if (DBG) fprintf(stderr, "aParent 0x%x\n", aParent); + + if (aParent) { + parentWidget = (Widget) aParent->GetNativeData(NS_NATIVE_WIDGET); + } else { + parentWidget = (Widget) aAppShell->GetNativeData(NS_NATIVE_SHELL); + } + + InitToolkit(aToolkit, aParent); + InitDeviceContext(aContext, parentWidget); + + if (DBG) fprintf(stderr, "Parent 0x%x\n", parentWidget); + + unsigned char selectionPolicy; + + Boolean autoSelection; + if (mMultiSelect) { + //selectionPolicy = XmEXTENDED_SELECT; + selectionPolicy = XmMULTIPLE_SELECT; + autoSelection = TRUE; + } else { + selectionPolicy = XmBROWSE_SELECT; + autoSelection = FALSE; + } + + mWidget = ::XtVaCreateManagedWidget("", + xmListWidgetClass, + parentWidget, + XmNitemCount, 0, + XmNx, aRect.x, + XmNy, aRect.y, + XmNwidth, aRect.width, + XmNheight, aRect.height, + XmNrecomputeSize, False, + XmNselectionPolicy, selectionPolicy, + XmNautomaticSelection, autoSelection, + XmNscrollBarDisplayPolicy, XmAS_NEEDED, + XmNlistSizePolicy, XmCONSTANT, + XmNmarginTop, 0, + XmNmarginBottom, 0, + XmNmarginLeft, 0, + XmNmarginRight, 0, + XmNmarginHeight, 0, + XmNmarginWidth, 0, + XmNlistMarginHeight, 0, + XmNlistMarginWidth, 0, + XmNscrolledWindowMarginWidth, 0, + XmNscrolledWindowMarginHeight, 0, + nsnull); + if (DBG) fprintf(stderr, "Button 0x%x this 0x%x\n", mWidget, this); + + // save the event callback function + mEventCallback = aHandleEventFunction; + + //InitCallbacks(); + +} + +//------------------------------------------------------------------------- +// +// nsListBox Creator +// +//------------------------------------------------------------------------- +void nsListBox::Create(nsNativeWidget aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext, + nsIAppShell *aAppShell, + nsIToolkit *aToolkit, + nsWidgetInitData *aInitData) +{ +} + +//------------------------------------------------------------------------- +// +// move, paint, resizes message - ignore +// +//------------------------------------------------------------------------- +PRBool nsListBox::OnMove(PRInt32, PRInt32) +{ + return PR_FALSE; +} + +//------------------------------------------------------------------------- +// +// paint message. Don't send the paint out +// +//------------------------------------------------------------------------- +PRBool nsListBox::OnPaint(nsPaintEvent &aEvent) +{ + return PR_FALSE; +} + +PRBool nsListBox::OnResize(nsSizeEvent &aEvent) +{ + return PR_FALSE; +} + + +//------------------------------------------------------------------------- +//------------------------------------------------------------------------- +//------------------------------------------------------------------------- +//------------------------------------------------------------------------- +#define GET_OUTER() ((nsListBox*) ((char*)this - nsListBox::GetOuterOffset())) + + +//------------------------------------------------------------------------- +// +// SetMultipleSelection +// +//------------------------------------------------------------------------- + +void nsListBox::AggListBox::SetMultipleSelection(PRBool aMultipleSelections) +{ + GET_OUTER()->SetMultipleSelection(aMultipleSelections); +} + + +//------------------------------------------------------------------------- +// +// AddItemAt +// +//------------------------------------------------------------------------- + +void nsListBox::AggListBox::AddItemAt(nsString &aItem, PRInt32 aPosition) +{ + GET_OUTER()->AddItemAt(aItem, aPosition); +} + +//------------------------------------------------------------------------- +// +// Finds an item at a postion +// +//------------------------------------------------------------------------- +PRInt32 nsListBox::AggListBox::FindItem(nsString &aItem, PRInt32 aStartPos) +{ + return GET_OUTER()->FindItem(aItem, aStartPos); +} + +//------------------------------------------------------------------------- +// +// CountItems - Get Item Count +// +//------------------------------------------------------------------------- +PRInt32 nsListBox::AggListBox::GetItemCount() +{ + return GET_OUTER()->GetItemCount(); +} + +//------------------------------------------------------------------------- +// +// Removes an Item at a specified location +// +//------------------------------------------------------------------------- +PRBool nsListBox::AggListBox::RemoveItemAt(PRInt32 aPosition) +{ + return GET_OUTER()->RemoveItemAt(aPosition); +} + +//------------------------------------------------------------------------- +// +// Removes an Item at a specified location +// +//------------------------------------------------------------------------- +PRBool nsListBox::AggListBox::GetItemAt(nsString& anItem, PRInt32 aPosition) +{ + return GET_OUTER()->GetItemAt(anItem, aPosition); +} + +//------------------------------------------------------------------------- +// +// Gets the selected of selected item +// +//------------------------------------------------------------------------- +void nsListBox::AggListBox::GetSelectedItem(nsString& aItem) +{ + GET_OUTER()->GetSelectedItem(aItem); +} + +//------------------------------------------------------------------------- +// +// Gets the list of selected otems +// +//------------------------------------------------------------------------- +PRInt32 nsListBox::AggListBox::GetSelectedIndex() +{ + return GET_OUTER()->GetSelectedIndex(); +} + +//------------------------------------------------------------------------- +// +// SelectItem +// +//------------------------------------------------------------------------- +void nsListBox::AggListBox::SelectItem(PRInt32 aPosition) +{ + GET_OUTER()->SelectItem(aPosition); +} + +//------------------------------------------------------------------------- +// +// GetSelectedCount +// +//------------------------------------------------------------------------- +PRInt32 nsListBox::AggListBox::GetSelectedCount() +{ + return GET_OUTER()->GetSelectedCount(); +} + +//------------------------------------------------------------------------- +// +// GetSelectedIndices +// +//------------------------------------------------------------------------- +void nsListBox::AggListBox::GetSelectedIndices(PRInt32 aIndices[], PRInt32 aSize) +{ + GET_OUTER()->GetSelectedIndices(aIndices, aSize); +} + +//------------------------------------------------------------------------- +// +// GetSelectedIndices +// +//------------------------------------------------------------------------- +void nsListBox::AggListBox::SetSelectedIndices(PRInt32 aIndices[], PRInt32 aSize) +{ + GET_OUTER()->SetSelectedIndices(aIndices, aSize); +} + +//------------------------------------------------------------------------- +// +// Deselect +// +//------------------------------------------------------------------------- +void nsListBox::AggListBox::Deselect() +{ + GET_OUTER()->Deselect(); +} + + +//---------------------------------------------------------------------- + +BASE_IWIDGET_IMPL(nsListBox, AggListBox); + + diff --git a/widget/src/mac/nsListBox.h b/widget/src/mac/nsListBox.h new file mode 100644 index 000000000000..24ee5a234e06 --- /dev/null +++ b/widget/src/mac/nsListBox.h @@ -0,0 +1,118 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#ifndef nsListBox_h__ +#define nsListBox_h__ + +#include "nsWindow.h" +#include "nsIListBox.h" + +/** + * Native Motif Listbox wrapper + */ + +class nsListBox : public nsWindow +{ + +public: + nsListBox(nsISupports *aOuter); + virtual ~nsListBox(); + + // nsISupports. Forward to the nsObject base class + NS_IMETHOD QueryObject(const nsIID& aIID, void** aInstancePtr); + + void Create(nsIWidget *aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext = nsnull, + nsIAppShell *aAppShell = nsnull, + nsIToolkit *aToolkit = nsnull, + nsWidgetInitData *aInitData = nsnull); + + void Create(nsNativeWidget aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext = nsnull, + nsIAppShell *aAppShell = nsnull, + nsIToolkit *aToolkit = nsnull, + nsWidgetInitData *aInitData = nsnull); + + + virtual PRBool OnMove(PRInt32 aX, PRInt32 aY); + virtual PRBool OnPaint(nsPaintEvent & aEvent); + virtual PRBool OnResize(nsSizeEvent &aEvent); + + + // nsIListBox interface + void SetMultipleSelection(PRBool aMultipleSelections); + void AddItemAt(nsString &aItem, PRInt32 aPosition); + PRInt32 FindItem(nsString &aItem, PRInt32 aStartPos); + PRInt32 GetItemCount(); + PRBool RemoveItemAt(PRInt32 aPosition); + PRBool GetItemAt(nsString& anItem, PRInt32 aPosition); + void GetSelectedItem(nsString& aItem); + PRInt32 GetSelectedIndex(); + PRInt32 GetSelectedCount(); + void GetSelectedIndices(PRInt32 aIndices[], PRInt32 aSize); + void SetSelectedIndices(PRInt32 aIndices[], PRInt32 aSize); + void SelectItem(PRInt32 aPosition); + void Deselect() ; + +protected: + PRBool mMultiSelect; + +private: + + // this should not be public + static PRInt32 GetOuterOffset() { + return offsetof(nsListBox,mAggWidget); + } + + + // Aggregator class and instance variable used to aggregate in the + // nsIListBox interface to nsListBox w/o using multiple + // inheritance. + class AggListBox : public nsIListBox { + public: + AggListBox(); + virtual ~AggListBox(); + + AGGREGATE_METHOD_DEF + + // nsIListBox + void SetMultipleSelection(PRBool aMultipleSelections); + void AddItemAt(nsString &aItem, PRInt32 aPosition); + PRInt32 FindItem(nsString &aItem, PRInt32 aStartPos); + PRInt32 GetItemCount(); + PRBool RemoveItemAt(PRInt32 aPosition); + PRBool GetItemAt(nsString& anItem, PRInt32 aPosition); + void GetSelectedItem(nsString& aItem); + PRInt32 GetSelectedIndex(); + PRInt32 GetSelectedCount(); + void GetSelectedIndices(PRInt32 aIndices[], PRInt32 aSize); + void SetSelectedIndices(PRInt32 aIndices[], PRInt32 aSize); + void SelectItem(PRInt32 aPosition); + void Deselect() ; + + }; + AggListBox mAggWidget; + friend class AggListBox; + +}; + +#endif // nsListBox_h__ diff --git a/widget/src/mac/nsLookAndFeel.cpp b/widget/src/mac/nsLookAndFeel.cpp new file mode 100644 index 000000000000..1e7c9a7c1242 --- /dev/null +++ b/widget/src/mac/nsLookAndFeel.cpp @@ -0,0 +1,109 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#include "nsLookAndFeel.h" + +static NS_DEFINE_IID(kILookAndFeelIID, NS_ILOOKANDFEEL_IID); + +//------------------------------------------------------------------------- +// +// Query interface implementation +// +//------------------------------------------------------------------------- + +NS_IMPL_ISUPPORTS(nsLookAndFeel, kILookAndFeelIID); + +nsLookAndFeel::nsLookAndFeel(nsISupports *aOuter) +{ + mRefCnt = 0; +} + +nsLookAndFeel::~nsLookAndFeel() +{ +} + +NS_IMETHODIMP_(nscolor) nsLookAndFeel::GetColor(nsColorID aID) +{ + nscolor res = NS_RGB(0xff,0xff,0xff); + switch (aID) { + case WindowBackground: + res = NS_RGB(0xff,0xff,0xff); + break; + case WindowForeground: + res = NS_RGB(0x00,0x00,0x00); + break; + case WidgetBackground: + res = NS_RGB(0x80,0x80,0x80); + break; + case WidgetForeground: + res = NS_RGB(0x00,0x00,0x00); + break; + case WidgetSelectBackground: + res = NS_RGB(0x80,0x80,0x80); + break; + case WidgetSelectForeground: + res = NS_RGB(0x00,0x00,0x80); + break; + case Widget3DHighlight: + res = NS_RGB(0xa0,0xa0,0xa0); + break; + case Widget3DShadow: + res = NS_RGB(0x40,0x40,0x40); + break; + case TextBackground: + res = NS_RGB(0xff,0xff,0xff); + break; + case TextForeground: + res = NS_RGB(0x00,0x00,0x00); + break; + case TextSelectBackground: + res = NS_RGB(0x00,0x00,0x80); + break; + case TextSelectForeground: + res = NS_RGB(0xff,0xff,0xff); + break; + default: + break; + } + + return res; +} + +NS_IMETHODIMP_(PRInt32) nsLookAndFeel::GetMetric(nsMetricID aID) +{ + PRInt32 res; + switch (aID) { + case WindowTitleHeight: + res = 0; + break; + case WindowBorderWidth: + res = 4; + break; + case WindowBorderHeight: + res = 4; + break; + case Widget3DBorder: + res = 4; + break; + default: + res = 0; + } + return res; +} + + diff --git a/widget/src/mac/nsLookAndFeel.h b/widget/src/mac/nsLookAndFeel.h new file mode 100644 index 000000000000..b4e1c1fe72dc --- /dev/null +++ b/widget/src/mac/nsLookAndFeel.h @@ -0,0 +1,34 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#ifndef __nsLookAndFeel +#define __nsLookAndFeel +#include "nsILookAndFeel.h" + +class nsLookAndFeel: public nsILookAndFeel { + NS_DECL_ISUPPORTS + +public: + nsLookAndFeel(nsISupports *aOuter); + virtual ~nsLookAndFeel(); + + NS_IMETHOD_(nscolor) GetColor(nsColorID aID); + NS_IMETHOD_(PRInt32) GetMetric(nsMetricID aID); +}; + +#endif diff --git a/widget/src/mac/nsRadioButton.cpp b/widget/src/mac/nsRadioButton.cpp new file mode 100644 index 000000000000..8b831e737e0f --- /dev/null +++ b/widget/src/mac/nsRadioButton.cpp @@ -0,0 +1,332 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#include "nsRadioButton.h" +#include "nsColor.h" +#include "nsGUIEvent.h" +#include "nsString.h" +#include "nsStringUtil.h" + +#include "nsXtEventHandler.h" +#include +#include + +#define DBG 0 +//------------------------------------------------------------------------- +// +// nsRadioButton constructor +// +//------------------------------------------------------------------------- +nsRadioButton::nsRadioButton(nsISupports *aOuter) : + nsWindow(aOuter), + mIsArmed(PR_FALSE) +{ +} + +//------------------------------------------------------------------------- +// +// nsRadioButton destructor +// +//------------------------------------------------------------------------- +nsRadioButton::~nsRadioButton() +{ +} + +//------------------------------------------------------------------------- +// +// nsRadioButton Creator +// +//------------------------------------------------------------------------- +void nsRadioButton::Create(nsIWidget *aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext, + nsIAppShell *aAppShell, + nsIToolkit *aToolkit, + nsWidgetInitData *aInitData) +{ + aParent->AddChild(this); + Widget parentWidget = nsnull; + + if (DBG) fprintf(stderr, "aParent 0x%x\n", aParent); + + if (aParent) { + parentWidget = (Widget) aParent->GetNativeData(NS_NATIVE_WIDGET); + } else { + parentWidget = (Widget) aAppShell->GetNativeData(NS_NATIVE_SHELL); + } + + InitToolkit(aToolkit, aParent); + InitDeviceContext(aContext, parentWidget); + + if (DBG) fprintf(stderr, "Parent 0x%x\n", parentWidget); + + mWidget = ::XmCreateRadioBox(parentWidget, "radio", nsnull, 0); + XtVaSetValues(mWidget, XmNwidth, aRect.width, + XmNheight, aRect.height, + XmNx, aRect.x, + XmNy, aRect.y, + XmNrecomputeSize, False, + XmNresizeHeight, False, + XmNresizeWidth, False, + XmNradioAlwaysOne, False, + XmNmarginHeight, 0, + XmNmarginWidth, 0, + XmNadjustMargin, False, + XmNspacing, 0, +// XmNentryAlignment, XmALIGNMENT_CENTER, +// XmNentryVerticalAlignment, XmALIGNMENT_CENTER, + XmNisAligned, False, + XmNentryBorder, 0, + XmNorientation, XmVERTICAL, + XmNborderWidth, 0, + 0); + + mRadioBtn = ::XmCreateToggleButton(mWidget, "", nsnull, 0); + + XtVaSetValues(mRadioBtn, + XmNwidth, aRect.width, + XmNheight, aRect.height, + XmNx, 0, + XmNy, 0, + XmNrecomputeSize, False, + XmNresizeHeight, False, + XmNresizeWidth, False, + XmNmarginHeight, 0, + XmNmarginWidth, 0, + XmNadjustMargin, False, + XmNspacing, 0, + XmNisAligned, False, + XmNentryBorder, 0, + XmNborderWidth, 0, + 0); + + XtManageChild(mRadioBtn); + + if (DBG) fprintf(stderr, "Button 0x%x this 0x%x\n", mWidget, this); + + // save the event callback function + mEventCallback = aHandleEventFunction; + + InitCallbacks(); + + XtAddCallback(mRadioBtn, + XmNarmCallback, + nsXtWidget_RadioButton_ArmCallback, + this); + + XtAddCallback(mRadioBtn, + XmNdisarmCallback, + nsXtWidget_RadioButton_DisArmCallback, + this); + + /*XtAddCallback(mRadioBtn, + XmNvalueChangedCallback, + nsXtWidget_Toggle_ValueChangedCallback, + this);*/ + + + +} + +//------------------------------------------------------------------------- +// +// nsRadioButton Creator +// +//------------------------------------------------------------------------- +void nsRadioButton::Create(nsNativeWidget aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext, + nsIAppShell *aAppShell, + nsIToolkit *aToolkit, + nsWidgetInitData *aInitData) +{ +} + +//------------------------------------------------------------------------- +// +// Query interface implementation +// +//------------------------------------------------------------------------- +nsresult nsRadioButton::QueryObject(REFNSIID aIID, void** aInstancePtr) +{ + static NS_DEFINE_IID(kIRadioButtonIID, NS_IRADIOBUTTON_IID); + + if (aIID.Equals(kIRadioButtonIID)) { + AddRef(); + *aInstancePtr = (void**) &mAggWidget; + return NS_OK; + } + return nsWindow::QueryObject(aIID, aInstancePtr); +} + +//------------------------------------------------------------------------- +// +// Armed +// +//------------------------------------------------------------------------- +void nsRadioButton::Armed() +{ + mIsArmed = PR_TRUE; + mValueWasSet = PR_FALSE; + mInitialState = XmToggleButtonGetState(mRadioBtn); + if (DBG) printf("Arm: InitialValue: %d\n", mInitialState); +} + +//------------------------------------------------------------------------- +// +// DisArmed +// +//------------------------------------------------------------------------- +void nsRadioButton::DisArmed() +{ + if (DBG) printf("DisArm: InitialValue: %d\n", mInitialState); + if (DBG) printf("DisArm: ActualValue: %d\n", XmToggleButtonGetState(mRadioBtn)); + if (DBG) printf("DisArm: mValueWasSet %d\n", mValueWasSet); + if (DBG) printf("DisArm: mNewValue %d\n", mNewValue); + + if (mValueWasSet) { + XmToggleButtonSetState(mRadioBtn, mNewValue, TRUE); + } else { + XmToggleButtonSetState(mRadioBtn, mInitialState, TRUE); + } + mIsArmed = PR_FALSE; +} + +//------------------------------------------------------------------------- +// +// Set this button label +// +//------------------------------------------------------------------------- +void nsRadioButton::SetState(PRBool aState) +{ + int state = aState; + if (mIsArmed) { + mNewValue = aState; + mValueWasSet = PR_TRUE; + } + XmToggleButtonSetState(mRadioBtn, aState, TRUE); +} + +//------------------------------------------------------------------------- +// +// Set this button label +// +//------------------------------------------------------------------------- +PRBool nsRadioButton::GetState() +{ + int state = XmToggleButtonGetState(mRadioBtn); + if (mIsArmed) { + if (mValueWasSet) { + return mNewValue; + } else { + return state; + } + } else { + return state; + } +} + +//------------------------------------------------------------------------- +// +// Set this button label +// +//------------------------------------------------------------------------- +void nsRadioButton::SetLabel(const nsString& aText) +{ + NS_ALLOC_STR_BUF(label, aText, 256); + XmString str; + str = XmStringCreate(label, XmFONTLIST_DEFAULT_TAG); + XtVaSetValues(mRadioBtn, XmNlabelString, str, nsnull); + NS_FREE_STR_BUF(label); + XmStringFree(str); +} + + +//------------------------------------------------------------------------- +// +// Get this button label +// +//------------------------------------------------------------------------- +void nsRadioButton::GetLabel(nsString& aBuffer) +{ + XmString str; + XtVaGetValues(mRadioBtn, XmNlabelString, &str, nsnull); + char * text; + if (XmStringGetLtoR(str, XmFONTLIST_DEFAULT_TAG, &text)) { + aBuffer.SetLength(0); + aBuffer.Append(text); + XtFree(text); + } + XmStringFree(str); + +} + +//------------------------------------------------------------------------- +// +// move, paint, resizes message - ignore +// +//------------------------------------------------------------------------- +PRBool nsRadioButton::OnMove(PRInt32, PRInt32) +{ + return PR_FALSE; +} + +PRBool nsRadioButton::OnPaint(nsPaintEvent &aEvent) +{ + return PR_FALSE; +} + +PRBool nsRadioButton::OnResize(nsSizeEvent &aEvent) +{ + return PR_FALSE; +} + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- + +#define GET_OUTER() \ + ((nsRadioButton*) ((char*)this - nsRadioButton::GetOuterOffset())) + +PRBool nsRadioButton::AggRadioButton::GetState() +{ + return GET_OUTER()->GetState(); +} + +void nsRadioButton::AggRadioButton::SetState(PRBool aState) +{ + GET_OUTER()->SetState(aState); +} + +void nsRadioButton::AggRadioButton::SetLabel(const nsString& aText) +{ + GET_OUTER()->SetLabel(aText); +} + +void nsRadioButton::AggRadioButton::GetLabel(nsString& aText) +{ + GET_OUTER()->GetLabel(aText); +} + + +//---------------------------------------------------------------------- + +BASE_IWIDGET_IMPL(nsRadioButton, AggRadioButton); + diff --git a/widget/src/mac/nsRadioButton.h b/widget/src/mac/nsRadioButton.h new file mode 100644 index 000000000000..5f2f465b2667 --- /dev/null +++ b/widget/src/mac/nsRadioButton.h @@ -0,0 +1,106 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#ifndef nsRadioButton_h__ +#define nsRadioButton_h__ + +#include "nsWindow.h" +#include "nsIRadioButton.h" + +/** + * Native Motif Radiobutton wrapper + */ + +class nsRadioButton : public nsWindow + +{ + +public: + + nsRadioButton(nsISupports *aOuter); + virtual ~nsRadioButton(); + + NS_IMETHOD QueryObject(REFNSIID aIID, void** aInstancePtr); + + void Create(nsIWidget *aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext = nsnull, + nsIAppShell *aAppShell = nsnull, + nsIToolkit *aToolkit = nsnull, + nsWidgetInitData *aInitData = nsnull); + + void Create(nsNativeWidget aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext = nsnull, + nsIAppShell *aAppShell = nsnull, + nsIToolkit *aToolkit = nsnull, + nsWidgetInitData *aInitData = nsnull); + + // nsIRadioButton part + virtual void SetLabel(const nsString& aText); + virtual void GetLabel(nsString& aBuffer); + + virtual PRBool OnMove(PRInt32 aX, PRInt32 aY); + virtual PRBool OnPaint(nsPaintEvent &aEvent); + virtual PRBool OnResize(nsSizeEvent &aEvent); + + virtual void SetState(PRBool aState); + virtual PRBool GetState(); + + // These are needed to Override the auto check behavior + void Armed(); + void DisArmed(); + +private: + + // this should not be public + static PRInt32 GetOuterOffset() { + return offsetof(nsRadioButton,mAggWidget); + } + + Widget mRadioBtn; + Boolean mInitialState; + Boolean mNewValue; + Boolean mValueWasSet; + Boolean mIsArmed; + + // Aggregator class and instance variable used to aggregate in the + // nsIButton interface to nsRadioButton w/o using multiple + // inheritance. + class AggRadioButton : public nsIRadioButton { + public: + AggRadioButton(); + virtual ~AggRadioButton(); + + AGGREGATE_METHOD_DEF + + // nsIRadioButton + virtual void SetLabel(const nsString &aText); + virtual void GetLabel(nsString &aBuffer); + virtual void SetState(PRBool aState); + virtual PRBool GetState(); + + }; + AggRadioButton mAggWidget; + friend class AggRadioButton; + +}; + +#endif // nsRadioButton_h__ diff --git a/widget/src/mac/nsScrollbar.cpp b/widget/src/mac/nsScrollbar.cpp new file mode 100644 index 000000000000..a14cf71564a3 --- /dev/null +++ b/widget/src/mac/nsScrollbar.cpp @@ -0,0 +1,508 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#include "nsScrollbar.h" +#include "nsToolkit.h" +#include "nsGUIEvent.h" +#include "nsUnitConversion.h" +#include + +#include "nsXtEventHandler.h" + +#define DBG 0 + +//------------------------------------------------------------------------- +// +// nsScrollbar constructor +// +//------------------------------------------------------------------------- +nsScrollbar::nsScrollbar(nsISupports *aOuter, PRBool aIsVertical) : nsWindow(aOuter) +{ + strcpy(gInstanceClassName, "nsScrollbar"); + mOrientation = (aIsVertical) ? XmVERTICAL : XmHORIZONTAL; + mLineIncrement = 0; + +} +//------------------------------------------------------------------------- +// +// Create +// +//------------------------------------------------------------------------- +void nsScrollbar::Create(nsNativeWidget aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext, + nsIAppShell *aAppShell, + nsIToolkit *aToolkit, + nsWidgetInitData *aInitData) +{ + Widget parentWidget = (Widget)aParent; + strcpy(gInstanceClassName, "nsScrollbar"); + + int procDir = mOrientation == XmVERTICAL? XmMAX_ON_BOTTOM:XmMAX_ON_RIGHT; + + mWidget = ::XtVaCreateManagedWidget("scrollbar", + xmScrollBarWidgetClass, + parentWidget, + XmNorientation, mOrientation, + XmNprocessingDirection, procDir, + XmNwidth, aRect.width, + XmNheight, aRect.height, + XmNrecomputeSize, False, + XmNhighlightOnEnter, False, + XmNminimum, 0, + XmNmaximum, 100, + XmNx, aRect.x, + XmNy, aRect.y, + nsnull); + + // save the event callback function + mEventCallback = aHandleEventFunction; + + //InitCallbacks(); + XtAddCallback(mWidget, + XmNdragCallback, + nsXtWidget_Scrollbar_Callback, + this); + + XtAddCallback(mWidget, + XmNdecrementCallback, + nsXtWidget_Scrollbar_Callback, + this); + + XtAddCallback(mWidget, + XmNincrementCallback, + nsXtWidget_Scrollbar_Callback, + this); + + XtAddCallback(mWidget, + XmNvalueChangedCallback, + nsXtWidget_Scrollbar_Callback, + this); + + /*XtAddCallback(mWidget, + XmNresizeCallback, + nsXtWidget_Resize_Callback, + this);*/ + +} + + +void nsScrollbar::Create(nsIWidget *aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext, + nsIAppShell *aAppShell, + nsIToolkit *aToolkit, + nsWidgetInitData *aInitData) +{ + Widget parentWidget; + + if (aParent) { + parentWidget = (Widget) aParent->GetNativeData(NS_NATIVE_WIDGET); + } else { + parentWidget = (Widget) aAppShell->GetNativeData(NS_NATIVE_SHELL); + } + + Create((nsNativeWidget)parentWidget, aRect, aHandleEventFunction, aContext, aAppShell, aToolkit, aInitData); + +} + +//------------------------------------------------------------------------- +// +// nsScrollbar destructor +// +//------------------------------------------------------------------------- +nsScrollbar::~nsScrollbar() +{ +} + + +//------------------------------------------------------------------------- +// +// Query interface implementation +// +//------------------------------------------------------------------------- +nsresult nsScrollbar::QueryObject(const nsIID& aIID, void** aInstancePtr) +{ + static NS_DEFINE_IID(kInsScrollbarIID, NS_ISCROLLBAR_IID); + + if (aIID.Equals(kInsScrollbarIID)) { + AddRef(); + *aInstancePtr = (void**) &mAggWidget; + return NS_OK; + } + return nsWindow::QueryObject(aIID, aInstancePtr); + +} + + +//------------------------------------------------------------------------- +// +// Define the range settings +// +//------------------------------------------------------------------------- +void nsScrollbar::SetMaxRange(PRUint32 aEndRange) +{ + int max = aEndRange; + XtVaGetValues(mWidget, XmNmaximum, &max, nsnull); + if (DBG) printf("SetMaxRange %d\n", max); + +} + + +//------------------------------------------------------------------------- +// +// Return the range settings +// +//------------------------------------------------------------------------- +PRUint32 nsScrollbar::GetMaxRange() +{ + int maxRange = 0; + XtVaGetValues(mWidget, XmNmaximum, &maxRange, nsnull); + return (PRUint32)maxRange; +} + + +//------------------------------------------------------------------------- +// +// Set the thumb position +// +//------------------------------------------------------------------------- +void nsScrollbar::SetPosition(PRUint32 aPos) +{ + int pos = (int)aPos; + if (DBG) printf("SetPosition %d\n", pos); + XtVaSetValues(mWidget, XmNvalue, pos, nsnull); +} + + +//------------------------------------------------------------------------- +// +// Get the current thumb position. +// +//------------------------------------------------------------------------- +PRUint32 nsScrollbar::GetPosition() +{ + int pagePos = 0; + XtVaGetValues(mWidget, XmNvalue, &pagePos, nsnull); + + return (PRUint32)pagePos; +} + + +//------------------------------------------------------------------------- +// +// Set the thumb size +// +//------------------------------------------------------------------------- +void nsScrollbar::SetThumbSize(PRUint32 aSize) +{ + if (aSize > 0) { + XtVaSetValues(mWidget, XmNpageIncrement, (int)aSize, nsnull); + XtVaSetValues(mWidget, XmNsliderSize, (int)aSize, nsnull); + } + if (DBG) printf("SetThumbSize %d\n", aSize); +} + + +//------------------------------------------------------------------------- +// +// Get the thumb size +// +//------------------------------------------------------------------------- +PRUint32 nsScrollbar::GetThumbSize() +{ + int pageSize = 0; + XtVaGetValues(mWidget, XmNpageIncrement, &pageSize, nsnull); + + return (PRUint32)pageSize; +} + + +//------------------------------------------------------------------------- +// +// Set the line increment for this scrollbar +// +//------------------------------------------------------------------------- +void nsScrollbar::SetLineIncrement(PRUint32 aLineIncrement) +{ + if (aLineIncrement > 0) { + mLineIncrement = aLineIncrement; + XtVaSetValues(mWidget, XmNincrement, aLineIncrement, nsnull); + } + + if (DBG) printf("SetLineIncrement %d\n", aLineIncrement); +} + + +//------------------------------------------------------------------------- +// +// Get the line increment for this scrollbar +// +//------------------------------------------------------------------------- +PRUint32 nsScrollbar::GetLineIncrement() +{ + return mLineIncrement; +} + + +//------------------------------------------------------------------------- +// +// Set all scrolling parameters +// +//------------------------------------------------------------------------- +void nsScrollbar::SetParameters(PRUint32 aMaxRange, PRUint32 aThumbSize, + PRUint32 aPosition, PRUint32 aLineIncrement) +{ + + int thumbSize = (((int)aThumbSize) > 0?aThumbSize:1); + int maxRange = (((int)aMaxRange) > 0?aMaxRange:10); + mLineIncrement = (((int)aLineIncrement) > 0?aLineIncrement:1); + + int maxPos = maxRange - thumbSize; + int pos = ((int)aPosition) > maxPos ? maxPos-1 : ((int)aPosition); + + if (DBG) printf("SetParameters Max: %6d Thumb: %4d Pos: %4d Line: %4d \n", + maxRange, thumbSize, + pos, mLineIncrement); + + XtVaSetValues(mWidget, + XmNincrement, mLineIncrement, + XmNminimum, 0, + XmNmaximum, maxRange, + XmNsliderSize, thumbSize, + XmNpageIncrement, thumbSize, + XmNvalue, pos, + nsnull); + +} + + +//------------------------------------------------------------------------- +// +// paint message. Don't send the paint out +// +//------------------------------------------------------------------------- +PRBool nsScrollbar::OnPaint(nsPaintEvent & aEvent) +{ + return PR_FALSE; +} + + +PRBool nsScrollbar::OnResize(nsSizeEvent &aEvent) +{ + + if (DBG) printf("*&*&*&*&*&*&*()()()()(((( nsScrollbar::OnResize\n"); + return nsWindow::OnResize(aEvent); + //return PR_FALSE; +} + +//------------------------------------------------------------------------- +int nsScrollbar::AdjustScrollBarPosition(int aPosition) +{ + int maxRange; + int sliderSize; + + XtVaGetValues(mWidget, XmNmaximum, &maxRange, + XmNsliderSize, &sliderSize, + nsnull); + int cap = maxRange - sliderSize; + return aPosition > cap ? cap : aPosition; +} + +//------------------------------------------------------------------------- +// +// Deal with scrollbar messages (actually implemented only in nsScrollbar) +// +//------------------------------------------------------------------------- +PRBool nsScrollbar::OnScroll(nsScrollbarEvent & aEvent, PRUint32 cPos) +{ + PRBool result = PR_TRUE; + int newPosition; + + switch (aEvent.message) { + + // scroll one line right or down + case NS_SCROLLBAR_LINE_NEXT: + { + XtVaGetValues(mWidget, XmNvalue, &newPosition, nsnull); + newPosition += mLineIncrement; + PRUint32 max = GetMaxRange() - GetThumbSize(); + if (newPosition > (int)max) + newPosition = (int)max; + + // if an event callback is registered, give it the chance + // to change the increment + if (mEventCallback) { + aEvent.position = newPosition; + result = ConvertStatus((*mEventCallback)(&aEvent)); + newPosition = aEvent.position; + } + + XtVaSetValues(mWidget, XmNvalue, + AdjustScrollBarPosition(newPosition), nsnull); + break; + } + + + // scroll one line left or up + case NS_SCROLLBAR_LINE_PREV: + { + XtVaGetValues(mWidget, XmNvalue, &newPosition, nsnull); + + newPosition -= mLineIncrement; + if (newPosition < 0) + newPosition = 0; + + // if an event callback is registered, give it the chance + // to change the decrement + if (mEventCallback) { + aEvent.position = newPosition; + + result = ConvertStatus((*mEventCallback)(&aEvent)); + newPosition = aEvent.position; + } + + XtVaSetValues(mWidget, XmNvalue, newPosition, nsnull); + + break; + } + + // Scrolls one page right or down + case NS_SCROLLBAR_PAGE_NEXT: + { + XtVaGetValues(mWidget, XmNvalue, &newPosition, nsnull); + PRUint32 max = GetMaxRange() - GetThumbSize(); + if (newPosition > (int)max) + newPosition = (int)max; + + // if an event callback is registered, give it the chance + // to change the increment + if (mEventCallback) { + aEvent.position = newPosition; + result = ConvertStatus((*mEventCallback)(&aEvent)); + newPosition = aEvent.position; + } + XtVaSetValues(mWidget, XmNvalue, + AdjustScrollBarPosition(newPosition+10), nsnull); + break; + } + + // Scrolls one page left or up. + case NS_SCROLLBAR_PAGE_PREV: + { + XtVaGetValues(mWidget, XmNvalue, &newPosition, nsnull); + if (newPosition < 0) + newPosition = 0; + + // if an event callback is registered, give it the chance + // to change the increment + if (mEventCallback) { + aEvent.position = newPosition; + result = ConvertStatus((*mEventCallback)(&aEvent)); + newPosition = aEvent.position; + } + + XtVaSetValues(mWidget, XmNvalue, newPosition-10, nsnull); + break; + } + + + // Scrolls to the absolute position. The current position is specified by + // the cPos parameter. + case NS_SCROLLBAR_POS: + { + newPosition = cPos; + + // if an event callback is registered, give it the chance + // to change the increment + if (mEventCallback) { + aEvent.position = newPosition; + result = ConvertStatus((*mEventCallback)(&aEvent)); + newPosition = aEvent.position; + } + + XtVaSetValues(mWidget, XmNvalue, + AdjustScrollBarPosition(newPosition), nsnull); + + break; + } + } + return result; +} + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +#define GET_OUTER() ((nsScrollbar*) ((char*)this - nsScrollbar::GetOuterOffset())) + +// nsIScrollbar part +void nsScrollbar::AggScrollbar::SetMaxRange(PRUint32 aEndRange) +{ + GET_OUTER()->SetMaxRange(aEndRange); +} + +PRUint32 nsScrollbar::AggScrollbar::GetMaxRange() +{ + return GET_OUTER()->GetMaxRange(); +} + +void nsScrollbar::AggScrollbar::SetPosition(PRUint32 aPos) +{ + GET_OUTER()->SetPosition(aPos); +} + +PRUint32 nsScrollbar::AggScrollbar::GetPosition() +{ + return GET_OUTER()->GetPosition(); +} + +void nsScrollbar::AggScrollbar::SetThumbSize(PRUint32 aSize) +{ + GET_OUTER()->SetThumbSize(aSize); +} + +PRUint32 nsScrollbar::AggScrollbar::GetThumbSize() +{ + return GET_OUTER()->GetThumbSize(); +} + +void nsScrollbar::AggScrollbar::SetLineIncrement(PRUint32 aSize) +{ + GET_OUTER()->SetLineIncrement(aSize); +} + +PRUint32 nsScrollbar::AggScrollbar::GetLineIncrement() +{ + return GET_OUTER()->GetLineIncrement(); +} + +void nsScrollbar::AggScrollbar::SetParameters(PRUint32 aMaxRange, + PRUint32 aThumbSize, + PRUint32 aPosition, + PRUint32 aLineIncrement) +{ + GET_OUTER()->SetParameters(aMaxRange, aThumbSize, aPosition, aLineIncrement); +} + +//---------------------------------------------------------------------- + +BASE_IWIDGET_IMPL(nsScrollbar, AggScrollbar); + diff --git a/widget/src/mac/nsScrollbar.h b/widget/src/mac/nsScrollbar.h new file mode 100644 index 000000000000..b83fca35a926 --- /dev/null +++ b/widget/src/mac/nsScrollbar.h @@ -0,0 +1,112 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#ifndef nsScrollbar_h__ +#define nsScrollbar_h__ + +#include "nsWindow.h" + +#include "nsIScrollbar.h" + +/** + * Native Motif scrollbar wrapper. + */ + +class nsScrollbar : public nsWindow +{ + +public: + nsScrollbar(nsISupports *aOuter, PRBool aIsVertical); + virtual ~nsScrollbar(); + + NS_IMETHOD QueryObject(REFNSIID aIID, void** aInstancePtr); + + void Create(nsIWidget *aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext = nsnull, + nsIAppShell *aAppShell = nsnull, + nsIToolkit *aToolkit = nsnull, + nsWidgetInitData *aInitData = nsnull); + + void Create(nsNativeWidget aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext = nsnull, + nsIAppShell *aAppShell = nsnull, + nsIToolkit *aToolkit = nsnull, + nsWidgetInitData *aInitData = nsnull); + + + // nsIScrollbar part + virtual void SetMaxRange(PRUint32 aEndRange); + virtual PRUint32 GetMaxRange(); + virtual void SetPosition(PRUint32 aPos); + virtual PRUint32 GetPosition(); + virtual void SetThumbSize(PRUint32 aSize); + virtual PRUint32 GetThumbSize(); + virtual void SetLineIncrement(PRUint32 aSize); + virtual PRUint32 GetLineIncrement(); + virtual void SetParameters(PRUint32 aMaxRange, PRUint32 aThumbSize, + PRUint32 aPosition, PRUint32 aLineIncrement); + + virtual PRBool OnPaint(nsPaintEvent & aEvent); + virtual PRBool OnScroll(nsScrollbarEvent & aEvent, PRUint32 cPos); + virtual PRBool OnResize(nsSizeEvent &aEvent); + +private: + + PRUint32 mLineIncrement; + int mOrientation; + + int AdjustScrollBarPosition(int aPosition); + + // this should not be public + static PRInt32 GetOuterOffset() { + return offsetof(nsScrollbar,mAggWidget); + } + + // Aggregator class and instance variable used to aggregate in the + // nsIButton interface to nsButton w/o using multiple + // inheritance. + class AggScrollbar : public nsIScrollbar { + public: + AggScrollbar(); + virtual ~AggScrollbar(); + + AGGREGATE_METHOD_DEF + + // nsIScrollbar part + virtual void SetMaxRange(PRUint32 aEndRange); + virtual PRUint32 GetMaxRange(); + virtual void SetPosition(PRUint32 aPos); + virtual PRUint32 GetPosition(); + virtual void SetThumbSize(PRUint32 aSize); + virtual PRUint32 GetThumbSize(); + virtual void SetLineIncrement(PRUint32 aSize); + virtual PRUint32 GetLineIncrement(); + virtual void SetParameters(PRUint32 aMaxRange, PRUint32 aThumbSize, + PRUint32 aPosition, PRUint32 aLineIncrement); + }; + AggScrollbar mAggWidget; + friend class AggScrollbar; + + +}; + +#endif // nsScrollbar_ diff --git a/widget/src/mac/nsTextAreaWidget.cpp b/widget/src/mac/nsTextAreaWidget.cpp new file mode 100644 index 000000000000..6f9bba07e865 --- /dev/null +++ b/widget/src/mac/nsTextAreaWidget.cpp @@ -0,0 +1,324 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#include "nsTextAreaWidget.h" +#include "nsToolkit.h" +#include "nsColor.h" +#include "nsGUIEvent.h" +#include "nsString.h" +#include "nsXtEventHandler.h" + +#include + +#define DBG 0 + +//------------------------------------------------------------------------- +// +// nsTextAreaWidget constructor +// +//------------------------------------------------------------------------- +nsTextAreaWidget::nsTextAreaWidget(nsISupports *aOuter) : nsWindow(aOuter), + mMakeReadOnly(PR_FALSE) +{ + //mBackground = NS_RGB(124, 124, 124); +} + +//------------------------------------------------------------------------- +// +// nsTextAreaWidget destructor +// +//------------------------------------------------------------------------- +nsTextAreaWidget::~nsTextAreaWidget() +{ +} + +//------------------------------------------------------------------------- +void nsTextAreaWidget::Create(nsIWidget *aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext, + nsIAppShell *aAppShell, + nsIToolkit *aToolkit, + nsWidgetInitData *aInitData) +{ + aParent->AddChild(this); + Widget parentWidget = nsnull; + + if (DBG) fprintf(stderr, "aParent 0x%x\n", aParent); + + if (aParent) { + parentWidget = (Widget) aParent->GetNativeData(NS_NATIVE_WIDGET); + } else { + parentWidget = (Widget) aAppShell->GetNativeData(NS_NATIVE_SHELL); + } + + InitToolkit(aToolkit, aParent); + InitDeviceContext(aContext, parentWidget); + + if (DBG) fprintf(stderr, "Parent 0x%x\n", parentWidget); + + mWidget = ::XtVaCreateManagedWidget("button", + xmTextWidgetClass, + parentWidget, + XmNwidth, aRect.width, + XmNheight, aRect.height, + XmNrecomputeSize, False, + XmNhighlightOnEnter, False, + XmNeditMode, XmMULTI_LINE_EDIT, + XmNeditable, mMakeReadOnly?False:True, + XmNx, aRect.x, + XmNy, aRect.y, + nsnull); + mHelper = new nsTextHelper(mWidget); + if (DBG) fprintf(stderr, "Button 0x%x this 0x%x\n", mWidget, this); + + // save the event callback function + mEventCallback = aHandleEventFunction; + + InitCallbacks("nsTextAreaWidget"); + + if (mMakeReadOnly) { + SetReadOnly(PR_TRUE); + } + +} + +//------------------------------------------------------------------------- +void nsTextAreaWidget::Create(nsNativeWidget aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext, + nsIAppShell *aAppShell, + nsIToolkit *aToolkit, + nsWidgetInitData *aInitData) +{ +} + + +//------------------------------------------------------------------------- +// +// Query interface implementation +// +//------------------------------------------------------------------------- +nsresult nsTextAreaWidget::QueryObject(REFNSIID aIID, void** aInstancePtr) +{ + static NS_DEFINE_IID(kITextWidgetIID, NS_ITEXTWIDGET_IID); + static NS_DEFINE_IID(kITextAreaWidgetIID, NS_ITEXTAREAWIDGET_IID); + + if (aIID.Equals(kITextWidgetIID)) { + AddRef(); + *aInstancePtr = (void**) &mAggWidget; + return NS_OK; + } + if (aIID.Equals(kITextAreaWidgetIID)) { + AddRef(); + *aInstancePtr = (void**) &mAggWidget; + return NS_OK; + } + return nsWindow::QueryObject(aIID, aInstancePtr); +} + + +//------------------------------------------------------------------------- +// +// paint, resizes message - ignore +// +//------------------------------------------------------------------------- +PRBool nsTextAreaWidget::OnPaint(nsPaintEvent & aEvent) +{ + return PR_FALSE; +} + + +//-------------------------------------------------------------- +PRBool nsTextAreaWidget::OnResize(nsSizeEvent &aEvent) +{ + return PR_FALSE; +} + +//-------------------------------------------------------------- +void nsTextAreaWidget::SetPassword(PRBool aIsPassword) +{ +} + +//-------------------------------------------------------------- +PRBool nsTextAreaWidget::SetReadOnly(PRBool aReadOnlyFlag) +{ + if (mWidget == nsnull && aReadOnlyFlag) { + mMakeReadOnly = PR_TRUE; + return PR_TRUE; + } + return mHelper->SetReadOnly(aReadOnlyFlag); +} + +//-------------------------------------------------------------- +void nsTextAreaWidget::SetMaxTextLength(PRUint32 aChars) +{ + mHelper->SetMaxTextLength(aChars); +} + +//-------------------------------------------------------------- +PRUint32 nsTextAreaWidget::GetText(nsString& aTextBuffer, PRUint32 aBufferSize) { + return mHelper->GetText(aTextBuffer, aBufferSize); +} + +//-------------------------------------------------------------- +PRUint32 nsTextAreaWidget::SetText(const nsString& aText) +{ + return mHelper->SetText(aText); +} + +//-------------------------------------------------------------- +PRUint32 nsTextAreaWidget::InsertText(const nsString &aText, PRUint32 aStartPos, PRUint32 aEndPos) +{ + return mHelper->InsertText(aText, aStartPos, aEndPos); +} + +//-------------------------------------------------------------- +void nsTextAreaWidget::RemoveText() +{ + mHelper->RemoveText(); +} + +//-------------------------------------------------------------- +void nsTextAreaWidget::SelectAll() +{ + mHelper->SelectAll(); +} + + +//-------------------------------------------------------------- +void nsTextAreaWidget::SetSelection(PRUint32 aStartSel, PRUint32 aEndSel) +{ + mHelper->SetSelection(aStartSel, aEndSel); +} + + +//-------------------------------------------------------------- +void nsTextAreaWidget::GetSelection(PRUint32 *aStartSel, PRUint32 *aEndSel) +{ + mHelper->GetSelection(aStartSel, aEndSel); +} + +//-------------------------------------------------------------- +void nsTextAreaWidget::SetCaretPosition(PRUint32 aPosition) +{ + mHelper->SetCaretPosition(aPosition); +} + +//-------------------------------------------------------------- +PRUint32 nsTextAreaWidget::GetCaretPosition() +{ + return mHelper->GetCaretPosition(); +} + +//-------------------------------------------------------------- +PRBool nsTextAreaWidget::AutoErase() +{ + return mHelper->AutoErase(); +} + + + +//-------------------------------------------------------------- +#define GET_OUTER() ((nsTextAreaWidget*) ((char*)this - nsTextAreaWidget::GetOuterOffset())) + + +//-------------------------------------------------------------- +void nsTextAreaWidget::AggTextAreaWidget::SetMaxTextLength(PRUint32 aChars) +{ + GET_OUTER()->SetMaxTextLength(aChars); +} + +//-------------------------------------------------------------- +PRUint32 nsTextAreaWidget::AggTextAreaWidget::GetText(nsString& aTextBuffer, PRUint32 aBufferSize) { + return GET_OUTER()->GetText(aTextBuffer, aBufferSize); +} + +//-------------------------------------------------------------- +PRUint32 nsTextAreaWidget::AggTextAreaWidget::SetText(const nsString& aText) +{ + return GET_OUTER()->SetText(aText); +} + +//-------------------------------------------------------------- +PRUint32 nsTextAreaWidget::AggTextAreaWidget::InsertText(const nsString &aText, PRUint32 aStartPos, PRUint32 aEndPos) +{ + return GET_OUTER()->InsertText(aText, aStartPos, aEndPos); +} + +//-------------------------------------------------------------- +void nsTextAreaWidget::AggTextAreaWidget::RemoveText() +{ + GET_OUTER()->RemoveText(); +} + +//-------------------------------------------------------------- +void nsTextAreaWidget::AggTextAreaWidget::SetPassword(PRBool aIsPassword) +{ + GET_OUTER()->SetPassword(aIsPassword); +} + +//-------------------------------------------------------------- +PRBool nsTextAreaWidget::AggTextAreaWidget::SetReadOnly(PRBool aReadOnlyFlag) +{ + return GET_OUTER()->SetReadOnly(aReadOnlyFlag); +} + +//-------------------------------------------------------------- +void nsTextAreaWidget::AggTextAreaWidget::SelectAll() +{ + GET_OUTER()->SelectAll(); +} + + +//-------------------------------------------------------------- +void nsTextAreaWidget::AggTextAreaWidget::SetSelection(PRUint32 aStartSel, PRUint32 aEndSel) +{ + GET_OUTER()->SetSelection(aStartSel, aEndSel); +} + + +//-------------------------------------------------------------- +void nsTextAreaWidget::AggTextAreaWidget::GetSelection(PRUint32 *aStartSel, PRUint32 *aEndSel) +{ + GET_OUTER()->GetSelection(aStartSel, aEndSel); +} + +//-------------------------------------------------------------- +void nsTextAreaWidget::AggTextAreaWidget::SetCaretPosition(PRUint32 aPosition) +{ + GET_OUTER()->SetCaretPosition(aPosition); +} + +//-------------------------------------------------------------- +PRUint32 nsTextAreaWidget::AggTextAreaWidget::GetCaretPosition() +{ + return GET_OUTER()->GetCaretPosition(); +} + +PRBool nsTextAreaWidget::AggTextAreaWidget::AutoErase() +{ + return GET_OUTER()->AutoErase(); +} + + +//---------------------------------------------------------------------- + +BASE_IWIDGET_IMPL(nsTextAreaWidget, AggTextAreaWidget); + diff --git a/widget/src/mac/nsTextAreaWidget.h b/widget/src/mac/nsTextAreaWidget.h new file mode 100644 index 000000000000..226a62dd1688 --- /dev/null +++ b/widget/src/mac/nsTextAreaWidget.h @@ -0,0 +1,117 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#ifndef nsTextAreaWidget_h__ +#define nsTextAreaWidget_h__ + +#include "nsWindow.h" +#include "nsTextHelper.h" + +#include "nsITextAreaWidget.h" + +/** + * Native Motif single line edit control wrapper. + */ + +class nsTextAreaWidget : public nsWindow +{ + +public: + nsTextAreaWidget(nsISupports *aOuter); + virtual ~nsTextAreaWidget(); + + NS_IMETHOD QueryObject(REFNSIID aIID, void** aInstancePtr); + + void Create(nsIWidget *aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext = nsnull, + nsIAppShell *aAppShell = nsnull, + nsIToolkit *aToolkit = nsnull, + nsWidgetInitData *aInitData = nsnull); + + void Create(nsNativeWidget aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext = nsnull, + nsIAppShell *aAppShell = nsnull, + nsIToolkit *aToolkit = nsnull, + nsWidgetInitData *aInitData = nsnull); + + + virtual PRBool OnPaint(nsPaintEvent & aEvent); + virtual PRBool OnResize(nsSizeEvent &aEvent); + + // nsTextHelper Interface + virtual void SelectAll(); + virtual void SetMaxTextLength(PRUint32 aChars); + virtual PRUint32 GetText(nsString& aTextBuffer, PRUint32 aBufferSize); + virtual PRUint32 SetText(const nsString& aText); + virtual PRUint32 InsertText(const nsString &aText, PRUint32 aStartPos, PRUint32 aEndPos); + virtual void RemoveText(); + virtual void SetPassword(PRBool aIsPassword); + virtual PRBool SetReadOnly(PRBool aReadOnlyFlag); + virtual void SetSelection(PRUint32 aStartSel, PRUint32 aEndSel); + virtual void GetSelection(PRUint32 *aStartSel, PRUint32 *aEndSel); + virtual void SetCaretPosition(PRUint32 aPosition); + virtual PRUint32 GetCaretPosition(); + virtual PRBool AutoErase(); + +protected: + nsTextHelper *mHelper; + +private: + PRBool mMakeReadOnly; + + // this should not be public + static PRInt32 GetOuterOffset() { + return offsetof(nsTextAreaWidget,mAggWidget); + } + + + // Aggregator class and instance variable used to aggregate in the + // nsIText interface to nsText w/o using multiple + // inheritance. + class AggTextAreaWidget : public nsITextAreaWidget { + public: + AggTextAreaWidget(); + virtual ~AggTextAreaWidget(); + + AGGREGATE_METHOD_DEF + + virtual void SelectAll(); + virtual void SetMaxTextLength(PRUint32 aChars); + virtual PRUint32 GetText(nsString& aTextBuffer, PRUint32 aBufferSize); + virtual PRUint32 SetText(const nsString& aText); + virtual PRUint32 InsertText(const nsString &aText, PRUint32 aStartPos, PRUint32 aEndPos); + virtual void RemoveText(); + virtual void SetPassword(PRBool aIsPassword); + virtual PRBool SetReadOnly(PRBool aReadOnlyFlag); + virtual void SetSelection(PRUint32 aStartSel, PRUint32 aEndSel); + virtual void GetSelection(PRUint32 *aStartSel, PRUint32 *aEndSel); + virtual void SetCaretPosition(PRUint32 aPosition); + virtual PRUint32 GetCaretPosition(); + virtual PRBool AutoErase(); + + }; + AggTextAreaWidget mAggWidget; + friend class AggTextAreaWidget; + +}; + +#endif // nsTextAreaWidget_h__ diff --git a/widget/src/mac/nsTextHelper.cpp b/widget/src/mac/nsTextHelper.cpp new file mode 100644 index 000000000000..e3a751a0d080 --- /dev/null +++ b/widget/src/mac/nsTextHelper.cpp @@ -0,0 +1,208 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#include "nsTextHelper.h" +#include "nsTextWidget.h" +#include "nsToolkit.h" +#include "nsColor.h" +#include "nsGUIEvent.h" +#include "nsString.h" +#include "nsStringUtil.h" + +#include + +#define DBG 0 + +//------------------------------------------------------------------------- +// +// nsTextHelper constructor +// +//------------------------------------------------------------------------- + +nsTextHelper::nsTextHelper(Widget aWidget) +{ + mWidget = aWidget; + mIsReadOnly = PR_FALSE; + mIsPassword = PR_FALSE; +} + +//------------------------------------------------------------------------- +// +// nsTextHelper destructor +// +//------------------------------------------------------------------------- +nsTextHelper::~nsTextHelper() +{ +} + +//------------------------------------------------------------------------- +void nsTextHelper::SetMaxTextLength(PRUint32 aChars) +{ + XmTextSetMaxLength(mWidget, (int)aChars); +} + +//------------------------------------------------------------------------- +PRUint32 nsTextHelper::GetText(nsString& aTextBuffer, PRUint32 aBufferSize) +{ + if (!mIsPassword) { + char * str = XmTextGetString(mWidget); + aTextBuffer.SetLength(0); + aTextBuffer.Append(str); + PRUint32 len = (PRUint32)strlen(str); + XtFree(str); + return len; + } else { + PasswordData * data; + XtVaGetValues(mWidget, XmNuserData, &data, NULL); + aTextBuffer = data->mPassword; + return aTextBuffer.Length(); + } +} + +//------------------------------------------------------------------------- +PRUint32 nsTextHelper::SetText(const nsString& aText) +{ + //printf("SetText Password %d\n", mIsPassword); + if (!mIsPassword) { + NS_ALLOC_STR_BUF(buf, aText, 512); + XmTextSetString(mWidget, buf); + NS_FREE_STR_BUF(buf); + } else { + PasswordData * data; + XtVaGetValues(mWidget, XmNuserData, &data, NULL); + data->mPassword = aText; + data->mIgnore = True; + char * buf = new char[aText.Length()+1]; + memset(buf, '*', aText.Length()); + buf[aText.Length()] = 0; + //printf("SetText [%s] [%s]\n", data->mPassword.ToNewCString(), buf); + XmTextSetString(mWidget, buf); + data->mIgnore = False; + } + return(aText.Length()); +} + +//------------------------------------------------------------------------- +PRUint32 nsTextHelper::InsertText(const nsString &aText, PRUint32 aStartPos, PRUint32 aEndPos) +{ + + if (!mIsPassword) { + NS_ALLOC_STR_BUF(buf, aText, 512); + XmTextInsert(mWidget, aStartPos, buf); + NS_FREE_STR_BUF(buf); + } else { + PasswordData * data; + XtVaGetValues(mWidget, XmNuserData, &data, NULL); + data->mIgnore = True; + nsString newText(aText); + data->mPassword.Insert(newText, aStartPos, aText.Length()); + char * buf = new char[data->mPassword.Length()+1]; + memset(buf, '*', data->mPassword.Length()); + buf[data->mPassword.Length()] = 0; + //printf("SetText [%s] [%s]\n", data->mPassword.ToNewCString(), buf); + XmTextInsert(mWidget, aStartPos, buf); + data->mIgnore = False; + } + return(aText.Length()); + +} + +//------------------------------------------------------------------------- +void nsTextHelper::RemoveText() +{ + char blank[2]; + blank[0] = 0; + + XmTextSetString(mWidget, blank); +} + +//------------------------------------------------------------------------- +void nsTextHelper::SetPassword(PRBool aIsPassword) +{ + mIsPassword = aIsPassword; +} + +//------------------------------------------------------------------------- +PRBool nsTextHelper::SetReadOnly(PRBool aReadOnlyFlag) +{ + NS_ASSERTION(mWidget != nsnull, + "SetReadOnly - Widget is NULL, Create may not have been called!"); + PRBool oldSetting = mIsReadOnly; + mIsReadOnly = aReadOnlyFlag; + XmTextSetEditable(mWidget, aReadOnlyFlag?False:True); + + return(oldSetting); +} + + +//------------------------------------------------------------------------- +void nsTextHelper::SelectAll() +{ + nsString text; + PRUint32 numChars = GetText(text, 0); + SetSelection(0, numChars); +} + + +//------------------------------------------------------------------------- +void nsTextHelper::SetSelection(PRUint32 aStartSel, PRUint32 aEndSel) +{ + XmTextPosition left = (XmTextPosition)aStartSel; + XmTextPosition right = (XmTextPosition)aEndSel; + + Time time; +printf("SetSel %d %d\n", left, right); + XmTextSetSelection(mWidget, left, right, 0); +} + + +//------------------------------------------------------------------------- +void nsTextHelper::GetSelection(PRUint32 *aStartSel, PRUint32 *aEndSel) +{ + XmTextPosition left; + XmTextPosition right; + + if (XmTextGetSelectionPosition(mWidget, &left, &right)) { + printf("left %d right %d\n", left, right); + *aStartSel = (PRUint32)left; + *aEndSel = (PRUint32)right; + } else { + printf("nsTextHelper::GetSelection Error getting positions\n"); + } +} + +//------------------------------------------------------------------------- +void nsTextHelper::SetCaretPosition(PRUint32 aPosition) +{ + XmTextSetInsertionPosition(mWidget, (XmTextPosition)aPosition); +} + +//------------------------------------------------------------------------- +PRUint32 nsTextHelper::GetCaretPosition() +{ + return (PRUint32)XmTextGetInsertionPosition(mWidget); +} + + +//------------------------------------------------------------------------- +PRBool nsTextHelper::AutoErase() +{ + return(PR_TRUE); +} + + diff --git a/widget/src/mac/nsTextHelper.h b/widget/src/mac/nsTextHelper.h new file mode 100644 index 000000000000..b565cacca52c --- /dev/null +++ b/widget/src/mac/nsTextHelper.h @@ -0,0 +1,58 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ +#ifndef nsTextHelper_h__ +#define nsTextHelper_h__ + +#include "nsITextWidget.h" +#include "nsWindow.h" +#include + +/** + * Base class for nsTextAreaWidget and nsTextWidget + */ + +class nsTextHelper +{ + +public: + nsTextHelper(Widget aWidget); + virtual ~nsTextHelper(); + + virtual void SelectAll(); + virtual void SetMaxTextLength(PRUint32 aChars); + virtual PRUint32 GetText(nsString& aTextBuffer, PRUint32 aBufferSize); + virtual PRUint32 SetText(const nsString& aText); + virtual PRUint32 InsertText(const nsString &aText, PRUint32 aStartPos, PRUint32 aEndPos); + virtual void RemoveText(); + virtual void SetPassword(PRBool aIsPassword); + virtual PRBool SetReadOnly(PRBool aReadOnlyFlag); + virtual void SetSelection(PRUint32 aStartSel, PRUint32 aEndSel); + virtual void GetSelection(PRUint32 *aStartSel, PRUint32 *aEndSel); + virtual void SetCaretPosition(PRUint32 aPosition); + virtual PRUint32 GetCaretPosition(); + //virtual void PreCreateWidget(nsWidgetInitData *aInitData); + virtual PRBool AutoErase(); + +protected: + Widget mWidget; + PRBool mIsPassword; + PRBool mIsReadOnly; + +}; + +#endif // nsTextHelper_h__ diff --git a/widget/src/mac/nsTextWidget.cpp b/widget/src/mac/nsTextWidget.cpp new file mode 100644 index 000000000000..e4c75ef68a13 --- /dev/null +++ b/widget/src/mac/nsTextWidget.cpp @@ -0,0 +1,360 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#include "nsTextWidget.h" +#include "nsToolkit.h" +#include "nsColor.h" +#include "nsGUIEvent.h" +#include "nsString.h" +#include "nsXtEventHandler.h" + +#include + +#define DBG 0 + +extern int mIsPasswordCallBacksInstalled; + +//------------------------------------------------------------------------- +// +// nsTextWidget constructor +// +//------------------------------------------------------------------------- +nsTextWidget::nsTextWidget(nsISupports *aOuter) : nsWindow(aOuter), + mIsPasswordCallBacksInstalled(PR_FALSE), + mMakeReadOnly(PR_FALSE), + mMakePassword(PR_FALSE) +{ + //mBackground = NS_RGB(124, 124, 124); +} + +//------------------------------------------------------------------------- +// +// nsTextWidget destructor +// +//------------------------------------------------------------------------- +nsTextWidget::~nsTextWidget() +{ +} + +//------------------------------------------------------------------------- +void nsTextWidget::Create(nsIWidget *aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext, + nsIAppShell *aAppShell, + nsIToolkit *aToolkit, + nsWidgetInitData *aInitData) +{ + aParent->AddChild(this); + Widget parentWidget = nsnull; + + if (DBG) fprintf(stderr, "aParent 0x%x\n", aParent); + + if (aParent) { + parentWidget = (Widget) aParent->GetNativeData(NS_NATIVE_WIDGET); + } else { + parentWidget = (Widget) aAppShell->GetNativeData(NS_NATIVE_SHELL); + } + + InitToolkit(aToolkit, aParent); + InitDeviceContext(aContext, parentWidget); + + + if (DBG) fprintf(stderr, "Parent 0x%x\n", parentWidget); + + mWidget = ::XtVaCreateManagedWidget("button", + xmTextWidgetClass, + parentWidget, + XmNwidth, aRect.width, + XmNheight, aRect.height, + XmNrecomputeSize, False, + XmNhighlightOnEnter, False, + XmNeditable, mMakeReadOnly?False:True, + XmNx, aRect.x, + XmNy, aRect.y, + nsnull); + mHelper = new nsTextHelper(mWidget); + if (DBG) fprintf(stderr, "Button 0x%x this 0x%x\n", mWidget, this); + + // save the event callback function + mEventCallback = aHandleEventFunction; + + InitCallbacks("nsTextWidget"); + + XtAddCallback(mWidget, + XmNfocusCallback, + nsXtWidget_Focus_Callback, + this); + + XtAddCallback(mWidget, + XmNlosingFocusCallback, + nsXtWidget_Focus_Callback, + this); + + if (mMakeReadOnly) { + SetReadOnly(PR_TRUE); + } + if (mMakePassword) { + SetPassword(PR_TRUE); + PasswordData * data = new PasswordData(); + data->mPassword = ""; + XtVaSetValues(mWidget, XmNuserData, data, NULL); + } + + + + +} + +//------------------------------------------------------------------------- +void nsTextWidget::Create(nsNativeWidget aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext, + nsIAppShell *aAppShell, + nsIToolkit *aToolkit, + nsWidgetInitData *aInitData) +{ +} + + +//------------------------------------------------------------------------- +// +// Query interface implementation +// +//------------------------------------------------------------------------- +nsresult nsTextWidget::QueryObject(REFNSIID aIID, void** aInstancePtr) +{ + static NS_DEFINE_IID(kITextWidgetIID, NS_ITEXTWIDGET_IID); + + if (aIID.Equals(kITextWidgetIID)) { + AddRef(); + *aInstancePtr = (void**) &mAggWidget; + return NS_OK; + } + return nsWindow::QueryObject(aIID, aInstancePtr); +} + + +//------------------------------------------------------------------------- +// +// paint, resizes message - ignore +// +//------------------------------------------------------------------------- +PRBool nsTextWidget::OnPaint(nsPaintEvent & aEvent) +{ + return PR_FALSE; +} + + +//-------------------------------------------------------------- +PRBool nsTextWidget::OnResize(nsSizeEvent &aEvent) +{ + return PR_FALSE; +} + +//-------------------------------------------------------------- +void nsTextWidget::SetPassword(PRBool aIsPassword) +{ + if (mWidget == nsnull && aIsPassword) { + mMakePassword = PR_TRUE; + return; + } + + if (aIsPassword) { + if (!mIsPasswordCallBacksInstalled) { + XtAddCallback(mWidget, XmNmodifyVerifyCallback, nsXtWidget_Text_Callback, NULL); + XtAddCallback(mWidget, XmNactivateCallback, nsXtWidget_Text_Callback, NULL); + mIsPasswordCallBacksInstalled = PR_TRUE; + } + } else { + if (mIsPasswordCallBacksInstalled) { + XtRemoveCallback(mWidget, XmNmodifyVerifyCallback, nsXtWidget_Text_Callback, NULL); + XtRemoveCallback(mWidget, XmNactivateCallback, nsXtWidget_Text_Callback, NULL); + mIsPasswordCallBacksInstalled = PR_FALSE; + } + } + mHelper->SetPassword(aIsPassword); +} + +//-------------------------------------------------------------- +PRBool nsTextWidget::SetReadOnly(PRBool aReadOnlyFlag) +{ + if (mWidget == nsnull && aReadOnlyFlag) { + mMakeReadOnly = PR_TRUE; + return PR_TRUE; + } + return mHelper->SetReadOnly(aReadOnlyFlag); +} + +//-------------------------------------------------------------- +void nsTextWidget::SetMaxTextLength(PRUint32 aChars) +{ + mHelper->SetMaxTextLength(aChars); +} + +//-------------------------------------------------------------- +PRUint32 nsTextWidget::GetText(nsString& aTextBuffer, PRUint32 aBufferSize) { + return mHelper->GetText(aTextBuffer, aBufferSize); +} + +//-------------------------------------------------------------- +PRUint32 nsTextWidget::SetText(const nsString& aText) +{ + return mHelper->SetText(aText); +} + +//-------------------------------------------------------------- +PRUint32 nsTextWidget::InsertText(const nsString &aText, PRUint32 aStartPos, PRUint32 aEndPos) +{ + return mHelper->InsertText(aText, aStartPos, aEndPos); +} + +//-------------------------------------------------------------- +void nsTextWidget::RemoveText() +{ + mHelper->RemoveText(); +} + +//-------------------------------------------------------------- +void nsTextWidget::SelectAll() +{ + mHelper->SelectAll(); +} + + +//-------------------------------------------------------------- +void nsTextWidget::SetSelection(PRUint32 aStartSel, PRUint32 aEndSel) +{ + mHelper->SetSelection(aStartSel, aEndSel); +} + + +//-------------------------------------------------------------- +void nsTextWidget::GetSelection(PRUint32 *aStartSel, PRUint32 *aEndSel) +{ + mHelper->GetSelection(aStartSel, aEndSel); +} + +//-------------------------------------------------------------- +void nsTextWidget::SetCaretPosition(PRUint32 aPosition) +{ + mHelper->SetCaretPosition(aPosition); +} + +//-------------------------------------------------------------- +PRUint32 nsTextWidget::GetCaretPosition() +{ + return mHelper->GetCaretPosition(); +} + +//-------------------------------------------------------------- +PRBool nsTextWidget::AutoErase() +{ + return mHelper->AutoErase(); +} + + + +//-------------------------------------------------------------- +#define GET_OUTER() ((nsTextWidget*) ((char*)this - nsTextWidget::GetOuterOffset())) + + +//-------------------------------------------------------------- +void nsTextWidget::AggTextWidget::SetMaxTextLength(PRUint32 aChars) +{ + GET_OUTER()->SetMaxTextLength(aChars); +} + +//-------------------------------------------------------------- +PRUint32 nsTextWidget::AggTextWidget::GetText(nsString& aTextBuffer, PRUint32 aBufferSize) { + return GET_OUTER()->GetText(aTextBuffer, aBufferSize); +} + +//-------------------------------------------------------------- +PRUint32 nsTextWidget::AggTextWidget::SetText(const nsString& aText) +{ + return GET_OUTER()->SetText(aText); +} + +//-------------------------------------------------------------- +PRUint32 nsTextWidget::AggTextWidget::InsertText(const nsString &aText, PRUint32 aStartPos, PRUint32 aEndPos) +{ + return GET_OUTER()->InsertText(aText, aStartPos, aEndPos); +} + +//-------------------------------------------------------------- +void nsTextWidget::AggTextWidget::RemoveText() +{ + GET_OUTER()->RemoveText(); +} + +//-------------------------------------------------------------- +void nsTextWidget::AggTextWidget::SetPassword(PRBool aIsPassword) +{ + GET_OUTER()->SetPassword(aIsPassword); +} + +//-------------------------------------------------------------- +PRBool nsTextWidget::AggTextWidget::SetReadOnly(PRBool aReadOnlyFlag) +{ + return GET_OUTER()->SetReadOnly(aReadOnlyFlag); +} + +//-------------------------------------------------------------- +void nsTextWidget::AggTextWidget::SelectAll() +{ + GET_OUTER()->SelectAll(); +} + + +//-------------------------------------------------------------- +void nsTextWidget::AggTextWidget::SetSelection(PRUint32 aStartSel, PRUint32 aEndSel) +{ + GET_OUTER()->SetSelection(aStartSel, aEndSel); +} + + +//-------------------------------------------------------------- +void nsTextWidget::AggTextWidget::GetSelection(PRUint32 *aStartSel, PRUint32 *aEndSel) +{ + GET_OUTER()->GetSelection(aStartSel, aEndSel); +} + +//-------------------------------------------------------------- +void nsTextWidget::AggTextWidget::SetCaretPosition(PRUint32 aPosition) +{ + GET_OUTER()->SetCaretPosition(aPosition); +} + +//-------------------------------------------------------------- +PRUint32 nsTextWidget::AggTextWidget::GetCaretPosition() +{ + return GET_OUTER()->GetCaretPosition(); +} + +PRBool nsTextWidget::AggTextWidget::AutoErase() +{ + return GET_OUTER()->AutoErase(); +} + + +//---------------------------------------------------------------------- + +BASE_IWIDGET_IMPL(nsTextWidget, AggTextWidget); + diff --git a/widget/src/mac/nsTextWidget.h b/widget/src/mac/nsTextWidget.h new file mode 100644 index 000000000000..dc3e91715a88 --- /dev/null +++ b/widget/src/mac/nsTextWidget.h @@ -0,0 +1,124 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#ifndef nsTextWidget_h__ +#define nsTextWidget_h__ + +#include "nsWindow.h" +#include "nsTextHelper.h" + +#include "nsITextWidget.h" + +typedef struct _PasswordData { + nsString mPassword; + Boolean mIgnore; +} PasswordData; + +/** + * Native Motif single line edit control wrapper. + */ + +class nsTextWidget : public nsWindow +{ + +public: + nsTextWidget(nsISupports *aOuter); + virtual ~nsTextWidget(); + + NS_IMETHOD QueryObject(REFNSIID aIID, void** aInstancePtr); + + void Create(nsIWidget *aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext = nsnull, + nsIAppShell *aAppShell = nsnull, + nsIToolkit *aToolkit = nsnull, + nsWidgetInitData *aInitData = nsnull); + + void Create(nsNativeWidget aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext = nsnull, + nsIAppShell *aAppShell = nsnull, + nsIToolkit *aToolkit = nsnull, + nsWidgetInitData *aInitData = nsnull); + + + virtual PRBool OnPaint(nsPaintEvent & aEvent); + virtual PRBool OnResize(nsSizeEvent &aEvent); + + // nsTextHelper Interface + virtual void SelectAll(); + virtual void SetMaxTextLength(PRUint32 aChars); + virtual PRUint32 GetText(nsString& aTextBuffer, PRUint32 aBufferSize); + virtual PRUint32 SetText(const nsString& aText); + virtual PRUint32 InsertText(const nsString &aText, PRUint32 aStartPos, PRUint32 aEndPos); + virtual void RemoveText(); + virtual void SetPassword(PRBool aIsPassword); + virtual PRBool SetReadOnly(PRBool aReadOnlyFlag); + virtual void SetSelection(PRUint32 aStartSel, PRUint32 aEndSel); + virtual void GetSelection(PRUint32 *aStartSel, PRUint32 *aEndSel); + virtual void SetCaretPosition(PRUint32 aPosition); + virtual PRUint32 GetCaretPosition(); + virtual PRBool AutoErase(); + +protected: + PRBool mIsPasswordCallBacksInstalled; + nsTextHelper *mHelper; + +private: + PRBool mMakeReadOnly; + PRBool mMakePassword; + + // this should not be public + static PRInt32 GetOuterOffset() { + return offsetof(nsTextWidget,mAggWidget); + } + + + // Aggregator class and instance variable used to aggregate in the + // nsIText interface to nsText w/o using multiple + // inheritance. + class AggTextWidget : public nsITextWidget { + public: + AggTextWidget(); + virtual ~AggTextWidget(); + + AGGREGATE_METHOD_DEF + + virtual void SelectAll(); + virtual void SetMaxTextLength(PRUint32 aChars); + virtual PRUint32 GetText(nsString& aTextBuffer, PRUint32 aBufferSize); + virtual PRUint32 SetText(const nsString& aText); + virtual PRUint32 InsertText(const nsString &aText, PRUint32 aStartPos, PRUint32 aEndPos); + virtual void RemoveText(); + virtual void SetPassword(PRBool aIsPassword); + virtual PRBool SetReadOnly(PRBool aReadOnlyFlag); + virtual void SetSelection(PRUint32 aStartSel, PRUint32 aEndSel); + virtual void GetSelection(PRUint32 *aStartSel, PRUint32 *aEndSel); + virtual void SetCaretPosition(PRUint32 aPosition); + virtual PRUint32 GetCaretPosition(); + virtual PRBool AutoErase(); + + }; + AggTextWidget mAggWidget; + friend class AggTextWidget; + +}; + +#endif // nsTextWidget_h__ diff --git a/widget/src/mac/nsToolkit.cpp b/widget/src/mac/nsToolkit.cpp new file mode 100644 index 000000000000..8800156d484f --- /dev/null +++ b/widget/src/mac/nsToolkit.cpp @@ -0,0 +1,82 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#include "nsToolkit.h" +#include "nsWindow.h" +#include "nsGUIEvent.h" +#include +#include +#include +#include +#include +#include + + +PRBool nsToolkit::mInit = PR_FALSE; + + +//------------------------------------------------------------------------- +// +// constructor +// +//------------------------------------------------------------------------- +nsToolkit::nsToolkit() +{ + NS_INIT_REFCNT(); + + // once only, macintosh specific initialization + if( mInit == PR_TRUE) + { + mInit = PR_TRUE; + InitGraf; + InitWindows(); + InitMenus(); + TEInit(); + InitDialogs(0); + InitCursor(); + } +} + + +//------------------------------------------------------------------------- +// +// destructor +// +//------------------------------------------------------------------------- +nsToolkit::~nsToolkit() +{ +} + + +//------------------------------------------------------------------------- +// +// nsISupports implementation macro +// +//------------------------------------------------------------------------- +NS_DEFINE_IID(kIToolkitIID, NS_ITOOLKIT_IID); +NS_IMPL_ISUPPORTS(nsToolkit,kIToolkitIID); + + + +//------------------------------------------------------------------------- +// +// +//------------------------------------------------------------------------- +void nsToolkit::Init(PRThread *aThread) +{ +} diff --git a/widget/src/mac/nsToolkit.h b/widget/src/mac/nsToolkit.h new file mode 100644 index 000000000000..e104d07390e0 --- /dev/null +++ b/widget/src/mac/nsToolkit.h @@ -0,0 +1,52 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#ifndef TOOLKIT_H +#define TOOLKIT_H + +#include "nsIToolkit.h" + +struct MethodInfo; + +/** + * Wrapper around the thread running the message pump. + * The toolkit abstraction is necessary because the message pump must + * execute within the same thread that created the widget under Win32. + */ + +class nsToolkit : public nsIToolkit +{ + +public: + nsToolkit(); + virtual ~nsToolkit(); + + NS_DECL_ISUPPORTS + + virtual void Init(PRThread *aThread); + +public: + +private: + static PRBool mInit; + +}; + + + +#endif // TOOLKIT_H diff --git a/widget/src/mac/nsWidgetFactory.cpp b/widget/src/mac/nsWidgetFactory.cpp new file mode 100644 index 000000000000..177bcaca5636 --- /dev/null +++ b/widget/src/mac/nsWidgetFactory.cpp @@ -0,0 +1,243 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#include "nsIFactory.h" +#include "nsISupports.h" +#include "nsIButton.h" +#include "nsITextWidget.h" +#include "nsWidgetsCID.h" + +#include "nsToolkit.h" +#include "nsWindow.h" +#include "nsAppShell.h" +#include "nsButton.h" +#include "nsScrollbar.h" +#include "nsCheckButton.h" +#include "nsRadioButton.h" +#include "nsTextWidget.h" +#include "nsTextAreaWidget.h" +#include "nsFileWidget.h" +#include "nsListBox.h" +#include "nsComboBox.h" +#include "nsLookAndFeel.h" + +static NS_DEFINE_IID(kCWindow, NS_WINDOW_CID); +static NS_DEFINE_IID(kCChild, NS_CHILD_CID); +static NS_DEFINE_IID(kCAppShellCID, NS_APPSHELL_CID); +static NS_DEFINE_IID(kCHorzScrollbarCID, NS_HORZSCROLLBAR_CID); +static NS_DEFINE_IID(kCVertScrollbarCID, NS_VERTSCROLLBAR_CID); +static NS_DEFINE_IID(kCCheckButtonCID, NS_CHECKBUTTON_CID); +static NS_DEFINE_IID(kCRadioButtonCID, NS_RADIOBUTTON_CID); +static NS_DEFINE_IID(kCTextWidgetCID, NS_TEXTFIELD_CID); +static NS_DEFINE_IID(kCTextAreaWidgetCID, NS_TEXTAREA_CID); +static NS_DEFINE_IID(kCFileWidgetCID, NS_FILEWIDGET_CID); +static NS_DEFINE_IID(kCButtonCID, NS_BUTTON_CID); +static NS_DEFINE_IID(kCListBoxCID, NS_LISTBOX_CID); +static NS_DEFINE_IID(kCComboBoxCID, NS_COMBOBOX_CID); +static NS_DEFINE_IID(kCLookAndFeelCID, NS_LOOKANDFEEL_CID); + + +static NS_DEFINE_IID(kIWidget, NS_IWIDGET_IID); +static NS_DEFINE_IID(kIAppShellIID, NS_IAPPSHELL_IID); +static NS_DEFINE_IID(kIButton, NS_IBUTTON_IID); +static NS_DEFINE_IID(kICheckButton, NS_ICHECKBUTTON_IID); +static NS_DEFINE_IID(kIScrollbar, NS_ISCROLLBAR_IID); +static NS_DEFINE_IID(kIFileWidget, NS_IFILEWIDGET_IID); +static NS_DEFINE_IID(kIListBox, NS_ILISTBOX_IID); + +static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); +static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID); + + +class nsWidgetFactory : public nsIFactory +{ +public: + + NS_DECL_ISUPPORTS + + // nsIFactory methods + NS_IMETHOD CreateInstance(nsISupports *aOuter, + const nsIID &aIID, + void **aResult); + + NS_IMETHOD LockFactory(PRBool aLock); + + nsWidgetFactory(const nsCID &aClass); + ~nsWidgetFactory(); +private: + nsCID mClassID; + +}; + + + +nsWidgetFactory::nsWidgetFactory(const nsCID &aClass) +{ + mClassID = aClass; +} + +nsWidgetFactory::~nsWidgetFactory() +{ +} + +nsresult nsWidgetFactory::QueryInterface(const nsIID &aIID, + void **aInstancePtr) +{ + if (NULL == aInstancePtr) { + return NS_ERROR_NULL_POINTER; + } + + if (aIID.Equals(kIFactoryIID)) { + *aInstancePtr = (void*)(nsWidgetFactory*)this; + AddRef(); + return NS_OK; + } + + if (aIID.Equals(kISupportsIID)) { + *aInstancePtr = (void*)(nsISupports*)(nsWidgetFactory*)this; + AddRef(); + return NS_OK; + } + + return NS_NOINTERFACE; +} + +NS_IMPL_ADDREF(nsWidgetFactory) +NS_IMPL_RELEASE(nsWidgetFactory) + +nsresult nsWidgetFactory::CreateInstance(nsISupports *aOuter, + const nsIID &aIID, + void **aResult) +{ + if (aResult == NULL) { + return NS_ERROR_NULL_POINTER; + } + + *aResult = NULL; + + if (nsnull != aOuter && !aIID.Equals(kISupportsIID)) { + // aggregation with IID != nsISupports + return NS_ERROR_ILLEGAL_VALUE; + } + + nsWindow *inst = nsnull; + if (aIID.Equals(kCWindow)) { + inst = new nsWindow(aOuter); + } + else if ( mClassID.Equals(kCCheckButtonCID)) { + inst = new nsCheckButton(aOuter); + } + else if ( mClassID.Equals(kCButtonCID)) { + inst = new nsButton(aOuter); + } + else if (mClassID.Equals(kCVertScrollbarCID)) { + inst = new nsScrollbar(aOuter, PR_TRUE); + } + else if (mClassID.Equals(kCHorzScrollbarCID)) { + inst = new nsScrollbar(aOuter, PR_FALSE); + } + else if (aIID.Equals(kIScrollbar)) { + inst = nsnull; + fprintf(stderr, "------ NOT CreatingkIScrollbar Scrollbar\n"); + } + else if (mClassID.Equals(kCTextWidgetCID)) { + inst = new nsTextWidget(aOuter); + } + else if (mClassID.Equals(kCTextAreaWidgetCID)) { + inst = new nsTextAreaWidget(aOuter); + } + else if ( mClassID.Equals(kCRadioButtonCID)) { + inst = new nsRadioButton(aOuter); + } + else if (mClassID.Equals(kCListBoxCID)) { + inst = new nsListBox(aOuter); + } + else if (mClassID.Equals(kCComboBoxCID)) { + inst = new nsComboBox(aOuter); + } + else if (mClassID.Equals(kCFileWidgetCID)) { + inst = new nsFileWidget(aOuter); + } + else if (aIID.Equals(kIWidget)) { + inst = new nsWindow(aOuter); + } + else if (mClassID.Equals(kCChild)) { + inst = new ChildWindow(aOuter); + } + else if (mClassID.Equals(kCLookAndFeelCID)) { + nsLookAndFeel *laf = new nsLookAndFeel(aOuter); + if (laf == NULL) { + return NS_ERROR_OUT_OF_MEMORY; + } + nsresult res = laf->QueryInterface(aIID, aResult); + if (res != NS_OK) { + delete laf; + } + return res; + } + else if (mClassID.Equals(kCAppShellCID)) { + nsAppShell *appInst = new nsAppShell(); + if (appInst == NULL) { + return NS_ERROR_OUT_OF_MEMORY; + } + nsresult res = appInst->QueryInterface(aIID, aResult); + if (res != NS_OK) { + delete appInst; + } + return res; + } + + if (inst == NULL) { + return NS_ERROR_OUT_OF_MEMORY; + } + + nsresult res = inst->QueryObject(aIID, aResult); + + if (res != NS_OK) { + delete inst; + } + else { + NS_RELEASE(inst); + } + + return res; +} + +nsresult nsWidgetFactory::LockFactory(PRBool aLock) +{ + // Not implemented in simplest case. + return NS_OK; +} + +// return the proper factory to the caller +extern "C" NS_WIDGET nsresult NSGetFactory(const nsCID &aClass, nsIFactory **aFactory) +{ + if (nsnull == aFactory) { + return NS_ERROR_NULL_POINTER; + } + + *aFactory = new nsWidgetFactory(aClass); + + if (nsnull == aFactory) { + return NS_ERROR_OUT_OF_MEMORY; + } + + return (*aFactory)->QueryInterface(kIFactoryIID, (void**)aFactory); +} + + diff --git a/widget/src/mac/nsWindow.cpp b/widget/src/mac/nsWindow.cpp new file mode 100644 index 000000000000..672345bc62cc --- /dev/null +++ b/widget/src/mac/nsWindow.cpp @@ -0,0 +1,1108 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#include "nsWindow.h" +#include "nsIFontMetrics.h" +#include "nsIFontCache.h" +#include "nsGUIEvent.h" +#include "nsIRenderingContext.h" +#include "nsIDeviceContext.h" +#include "nsRect.h" +#include "nsTransform2D.h" +#include "nsGfxCIID.h" +#include "stdio.h" + +#define DBG 0 + + +//Widget gFirstTopLevelWindow = 0; + +static NS_DEFINE_IID(kIWidgetIID, NS_IWIDGET_IID); + +//NS_IMPL_QUERY_INTERFACE(nsWindow, kIWidgetIID) +//NS_IMPL_ADDREF(nsWindow) +//NS_IMPL_RELEASE(nsWindow) + +/** + * + */ +nsrefcnt nsWindow::AddRefObject(void) { + return ++mRefCnt; +} + +/** + * + */ +nsrefcnt nsWindow::ReleaseObject(void) { + return (--mRefCnt) ? mRefCnt : (delete this, 0); +} + + +/** + * + */ +nsresult nsWindow::QueryObject(const nsIID& aIID, void** aInstancePtr) +{ + if (NULL == aInstancePtr) { + return NS_ERROR_NULL_POINTER; + } + + static NS_DEFINE_IID(kIWidgetIID, NS_IWIDGET_IID); + if (aIID.Equals(kIWidgetIID)) { + *aInstancePtr = (void*) ((nsISupports*)this); + AddRef(); + return NS_OK; + } + + static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); + if (aIID.Equals(kISupportsIID)) { + *aInstancePtr = (void*) ((nsISupports*)&mInner); + AddRef(); + return NS_OK; + } + + return NS_NOINTERFACE; +} + +/** + * nsISupports methods + */ +nsresult nsWindow::QueryInterface(const nsIID& aIID, void** aInstancePtr) +{ + return mOuter->QueryInterface(aIID, aInstancePtr); +} + +/** + * + */ +nsrefcnt nsWindow::AddRef(void) +{ + return mOuter->AddRef(); +} + +/** + * + */ +nsrefcnt nsWindow::Release(void) +{ + return mOuter->Release(); +} + + +void nsWindow::WidgetToScreen(const nsRect& aOldRect, nsRect& aNewRect) +{ +} + +void nsWindow::ScreenToWidget(const nsRect& aOldRect, nsRect& aNewRect) +{ +} + +//------------------------------------------------------------------------- +// +// Setup initial tooltip rectangles +// +//------------------------------------------------------------------------- +void nsWindow::SetTooltips(PRUint32 aNumberOfTips,nsRect* aTooltipAreas[]) +{ +} + +//------------------------------------------------------------------------- +// +// Update all tooltip rectangles +// +//------------------------------------------------------------------------- + +void nsWindow::UpdateTooltips(nsRect* aNewTips[]) +{ +} + +//------------------------------------------------------------------------- +// +// Remove all tooltip rectangles +// +//------------------------------------------------------------------------- + +void nsWindow::RemoveTooltips() +{ +} + + +//------------------------------------------------------------------------- +// +// nsWindow constructor +// +//------------------------------------------------------------------------- +nsWindow::nsWindow(nsISupports *aOuter): + mEventListener(nsnull), + mMouseListener(nsnull), + mToolkit(nsnull), + mFontMetrics(nsnull), + mContext(nsnull), + mEventCallback(nsnull), + mIgnoreResize(PR_FALSE) +{ + strcpy(gInstanceClassName, "nsWindow"); + // XXX Til can deal with ColorMaps! + SetForegroundColor(1); + SetBackgroundColor(2); + mBounds.x = 0; + mBounds.y = 0; + mBounds.width = 0; + mBounds.height = 0; + mResized = PR_FALSE; + + // Setup for possible aggregation + if (aOuter) + mOuter = aOuter; + else + mOuter = &mInner; + mRefCnt = 1; // FIXTHIS + + mShown = PR_FALSE; + mVisible = PR_FALSE; + mDisplayed = PR_FALSE; + mLowerLeft = PR_FALSE; + mCursor = eCursor_standard; +} + + +//------------------------------------------------------------------------- +// +// nsWindow destructor +// +//------------------------------------------------------------------------- +nsWindow::~nsWindow() +{ + + //XtDestroyWidget(mWidget); + //if (nsnull != mGC) { + //::XFreeGC((Display *)GetNativeData(NS_NATIVE_DISPLAY),mGC); + //mGC = nsnull; + //} +} + +//------------------------------------------------------------------------- +// +// +// +//------------------------------------------------------------------------- +void nsWindow::InitToolkit(nsIToolkit *aToolkit, + nsIWidget *aWidgetParent) +{ + if (nsnull == mToolkit) { + if (nsnull != aToolkit) { + mToolkit = (nsToolkit*)aToolkit; + mToolkit->AddRef(); + } + else { + if (nsnull != aWidgetParent) { + mToolkit = (nsToolkit*)(aWidgetParent->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 { + mToolkit = new nsToolkit(); + mToolkit->AddRef(); + mToolkit->Init(PR_GetCurrentThread()); + + // Create a shared GC for all widgets + //((nsToolkit *)mToolkit)->SetSharedGC((GC)GetNativeData(NS_NATIVE_GRAPHIC)); + } + } + } + +} + + +void nsWindow::CreateMainWindow(nsNativeWidget aNativeParent, + nsIWidget *aWidgetParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext, + nsIAppShell *aAppShell, + nsIToolkit *aToolkit, + nsWidgetInitData *aInitData) +{ + //Widget mainWindow = 0, frame = 0; + mBounds = aRect; + mAppShell = aAppShell; + + //InitToolkit(aToolkit, aWidgetParent); + + // save the event callback function + //mEventCallback = aHandleEventFunction; + + //InitDeviceContext(aContext, (Widget) aAppShell->GetNativeData(NS_NATIVE_SHELL)); + + //Widget frameParent = 0; + +#ifdef NOTNOW + if (gFirstTopLevelWindow == 0) + { + mainWindow = ::XtVaCreateManagedWidget("mainWindow",xmMainWindowWidgetClass,(Widget) aAppShell->GetNativeData(NS_NATIVE_SHELL), nsnull); + gFirstTopLevelWindow = mainWindow; + } + else + { + Widget shell = ::XtVaCreatePopupShell(" ",xmDialogShellWidgetClass,(Widget) aAppShell->GetNativeData(NS_NATIVE_SHELL), 0); + XtVaSetValues(shell, XmNwidth, aRect.width, XmNheight, aRect.height, nsnull); + mainWindow = ::XtVaCreateManagedWidget("mainWindow",xmMainWindowWidgetClass,shell, nsnull); + XtVaSetValues(mainWindow, XmNwidth, aRect.width, XmNheight, aRect.height, nsnull); + } +#endif + + //mWidget = frame ; + + //if (aWidgetParent) + //{ + //aWidgetParent->AddChild(this); + //} + +} + + +void nsWindow::CreateChildWindow(nsNativeWidget aNativeParent, + nsIWidget *aWidgetParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext, + nsIAppShell *aAppShell, + nsIToolkit *aToolkit, + nsWidgetInitData *aInitData) +{ + mBounds = aRect; + mAppShell = aAppShell; + + InitToolkit(aToolkit, aWidgetParent); + + // save the event callback function + mEventCallback = aHandleEventFunction; + + //InitDeviceContext(aContext, (Widget)aNativeParent); + + //mWidget = ::XtVaCreateManagedWidget("frame",xmDrawingAreaWidgetClass,(Widget)aNativeParent, + //XmNwidth, aRect.width,XmNheight, aRect.height,XmNmarginHeight, 0,XmNmarginWidth, 0, XmNrecomputeSize, False, nsnull); + + + if (aWidgetParent) + { + //aWidgetParent->AddChild(this); + } + + // Force cursor to default setting + mCursor = eCursor_select; + SetCursor(eCursor_standard); + + CreateGC(); +} + +//------------------------------------------------------------------------- +// +// Create a window. +// +// Note: aNativeParent is always non-null if aWidgetParent is non-null. +// aNativeaParent is set regardless if the parent for the Create() was an +// nsIWidget or a Native widget. +// aNativeParent is equal to aWidgetParent->GetNativeData(NS_NATIVE_WIDGET) +//------------------------------------------------------------------------- + +void nsWindow::CreateWindow(nsNativeWidget aNativeParent, + nsIWidget *aWidgetParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext, + nsIAppShell *aAppShell, + nsIToolkit *aToolkit, + nsWidgetInitData *aInitData) +{ + if (0==aNativeParent) + CreateMainWindow(aNativeParent, aWidgetParent, aRect, + aHandleEventFunction, aContext, aAppShell, aToolkit, aInitData); + else + CreateChildWindow(aNativeParent, aWidgetParent, aRect, + aHandleEventFunction, aContext, aAppShell, aToolkit, aInitData); +} + + + + +//------------------------------------------------------------------------- +// +// create with nsIWidget parent +// +//------------------------------------------------------------------------- + +void nsWindow::Create(nsIWidget *aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext, + nsIAppShell *aAppShell, + nsIToolkit *aToolkit, + nsWidgetInitData *aInitData) +{ + if (aParent) + aParent->AddChild(this); + CreateWindow((nsNativeWidget)((aParent) ? aParent->GetNativeData(NS_NATIVE_WIDGET) : 0), + aParent, aRect, aHandleEventFunction, aContext, aAppShell, aToolkit, + aInitData); +} + +//------------------------------------------------------------------------- +// +// create with a native parent +// +//------------------------------------------------------------------------- +void nsWindow::Create(nsNativeWidget aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext, + nsIAppShell *aAppShell, + nsIToolkit *aToolkit, + nsWidgetInitData *aInitData) +{ + CreateWindow(aParent, 0, aRect, aHandleEventFunction, aContext, aAppShell, aToolkit, aInitData); +} + + +//------------------------------------------------------------------------- +// +// Close this nsWindow +// +//------------------------------------------------------------------------- +void nsWindow::Destroy() +{ +} + + +//------------------------------------------------------------------------- +// +// Get this nsWindow parent +// +//------------------------------------------------------------------------- +nsIWidget* nsWindow::GetParent(void) +{ + return nsnull; +} + + +//------------------------------------------------------------------------- +// +// Get this nsWindow's list of children +// +//------------------------------------------------------------------------- +nsIEnumerator* nsWindow::GetChildren() +{ + return nsnull; +} + + +//------------------------------------------------------------------------- +// +// Add a child to the list of children +// +//------------------------------------------------------------------------- +void nsWindow::AddChild(nsIWidget* aChild) +{ +} + + +//------------------------------------------------------------------------- +// +// Remove a child from the list of children +// +//------------------------------------------------------------------------- +void nsWindow::RemoveChild(nsIWidget* aChild) +{ +} + + +//------------------------------------------------------------------------- +// +// Hide or show this component +// +//------------------------------------------------------------------------- +void nsWindow::Show(PRBool bState) +{ + mShown = bState; + if (bState) { + //XtManageChild(mWidget); + } + //else + //XtUnmanageChild(mWidget); + +// UpdateVisibilityFlag(); +// UpdateDisplay(); +} + +//------------------------------------------------------------------------- +// +// Move this component +// +//------------------------------------------------------------------------- +void nsWindow::Move(PRUint32 aX, PRUint32 aY) +{ + mBounds.x = aX; + mBounds.y = aY; +// UpdateVisibilityFlag(); +// UpdateDisplay(); + //XtMoveWidget(mWidget, (Position)aX, (Position)GetYCoord(aY)); + //XtVaSetValues(mWidget, XmNx, aX, XmNy, GetYCoord(aY), nsnull); +} + +//------------------------------------------------------------------------- +// +// Resize this component +// +//------------------------------------------------------------------------- +void nsWindow::Resize(PRUint32 aWidth, PRUint32 aHeight, PRBool aRepaint) +{ + if (DBG) printf("$$$$$$$$$ %s::Resize %d %d Repaint: %s\n", + gInstanceClassName, aWidth, aHeight, (aRepaint?"true":"false")); + mBounds.width = aWidth; + mBounds.height = aHeight; +// UpdateVisibilityFlag(); +// UpdateDisplay(); + //XtVaSetValues(mWidget, XmNx, mBounds.x, XmNy, mBounds.y, XmNwidth, aWidth, XmNheight, aHeight, nsnull); + +// XtResizeWidget(mWidget, aWidth, aHeight, 0); +} + + +//------------------------------------------------------------------------- +// +// Resize this component +// +//------------------------------------------------------------------------- +void nsWindow::Resize(PRUint32 aX, PRUint32 aY, PRUint32 aWidth, PRUint32 aHeight, PRBool aRepaint) +{ + mBounds.x = aX; + mBounds.y = aY; + mBounds.width = aWidth; + mBounds.height = aHeight; +// UpdateVisibilityFlag(); +// UpdateDisplay(); + // XtVaSetValues(mWidget, XmNx, aX, XmNy, GetYCoord(aY),XmNwidth, aWidth, XmNheight, aHeight, nsnull); +} + + +//------------------------------------------------------------------------- +// +// Enable/disable this component +// +//------------------------------------------------------------------------- +void nsWindow::Enable(PRBool bState) +{ +} + + +//------------------------------------------------------------------------- +// +// Give the focus to this component +// +//------------------------------------------------------------------------- +void nsWindow::SetFocus(void) +{ +} + + +//------------------------------------------------------------------------- +// +// Get this component dimension +// +//------------------------------------------------------------------------- +void nsWindow::SetBounds(const nsRect &aRect) +{ + mBounds = aRect; +} + +//------------------------------------------------------------------------- +// +// Get this component dimension +// +//------------------------------------------------------------------------- +void nsWindow::GetBounds(nsRect &aRect) +{ + + /*XWindowAttributes attrs ; + Window w = nsnull; + + if (mWidget) + w = ::XtWindow(mWidget); + + if (mWidget && w) { + + XWindowAttributes attrs ; + + Display * d = ::XtDisplay(mWidget); + + XGetWindowAttributes(d, w, &attrs); + + aRect.x = attrs.x ; + aRect.y = attrs.y ; + aRect.width = attrs.width ; + aRect.height = attrs.height; + + } else { + //printf("Bad bounds computed for nsIWidget\n"); + + // XXX If this code gets hit, one should question why and how + // and fix it there. + aRect = mBounds; + + } + */ + aRect = mBounds; +} + + +//------------------------------------------------------------------------- +// +// Get the foreground color +// +//------------------------------------------------------------------------- +nscolor nsWindow::GetForegroundColor(void) +{ + return (mForeground); +} + + +//------------------------------------------------------------------------- +// +// Set the foreground color +// +//------------------------------------------------------------------------- +void nsWindow::SetForegroundColor(const nscolor &aColor) +{ + mForeground = aColor; +} + + +//------------------------------------------------------------------------- +// +// Get the background color +// +//------------------------------------------------------------------------- +nscolor nsWindow::GetBackgroundColor(void) +{ + return (mBackground); +} + + +//------------------------------------------------------------------------- +// +// Set the background color +// +//------------------------------------------------------------------------- +void nsWindow::SetBackgroundColor(const nscolor &aColor) +{ + mBackground = aColor ; + //XtVaSetValues(mWidget, +} + + +//------------------------------------------------------------------------- +// +// Get this component font +// +//------------------------------------------------------------------------- +nsIFontMetrics* nsWindow::GetFont(void) +{ + NS_NOTYETIMPLEMENTED("GetFont not yet implemented"); // to be implemented + return nsnull; +} + + +//------------------------------------------------------------------------- +// +// Set this component font +// +//------------------------------------------------------------------------- +void nsWindow::SetFont(const nsFont &aFont) +{ + if (mContext == nsnull) { + return; + } + nsIFontCache* fontCache = mContext->GetFontCache(); + if (fontCache != nsnull) { + nsIFontMetrics* metrics = fontCache->GetMetricsFor(aFont); + if (metrics != nsnull) { + + //XmFontList fontList = NULL; + //XmFontListEntry entry = NULL; + //XFontStruct * fontStruct = XQueryFont(XtDisplay(mWidget),(XID)metrics->GetFontHandle()); + //if (fontStruct != NULL) { + //entry = XmFontListEntryCreate(XmFONTLIST_DEFAULT_TAG,XmFONT_IS_FONT, fontStruct); + //fontList = XmFontListAppendEntry(NULL, entry); + + // XtVaSetValues(mWidget, XmNfontList, fontList, NULL); + + //XmFontListEntryFree(&entry); + //XmFontListFree(fontList); + //} + + NS_RELEASE(metrics); + } else { + printf("****** Error: Metrics is NULL!\n"); + } + NS_RELEASE(fontCache); + } else { + printf("****** Error: FontCache is NULL!\n"); + } +} + + +//------------------------------------------------------------------------- +// +// Get this component cursor +// +//------------------------------------------------------------------------- +nsCursor nsWindow::GetCursor() +{ + return eCursor_standard; +} + + +//------------------------------------------------------------------------- +// +// Set this component cursor +// +//------------------------------------------------------------------------- + +void nsWindow::SetCursor(nsCursor aCursor) +{ +} + +//------------------------------------------------------------------------- +// +// Invalidate this component visible area +// +//------------------------------------------------------------------------- +void nsWindow::Invalidate(PRBool aIsSynchronous) +{ + +} + + +//------------------------------------------------------------------------- +// +// Return some native data according to aDataType +// +//------------------------------------------------------------------------- +void* nsWindow::GetNativeData(PRUint32 aDataType) +{ + switch(aDataType) { + + case NS_NATIVE_WINDOW: + //return (void*)XtWindow(mWidget); + case NS_NATIVE_DISPLAY: + //return (void*)XtDisplay(mWidget); + case NS_NATIVE_WIDGET: + //return (void*)(mWidget); + case NS_NATIVE_GRAPHIC: + { + void *res = NULL; + return res; + } + case NS_NATIVE_COLORMAP: + default: + break; + } + + return NULL; +} + + +//------------------------------------------------------------------------- +// +// Create a rendering context from this nsWindow +// +//------------------------------------------------------------------------- +nsIRenderingContext* nsWindow::GetRenderingContext() +{ + nsIRenderingContext * ctx = nsnull; + + if (GetNativeData(NS_NATIVE_WIDGET)) { + + nsresult res; + + static NS_DEFINE_IID(kRenderingContextCID, NS_RENDERING_CONTEXT_CID); + static NS_DEFINE_IID(kRenderingContextIID, NS_IRENDERING_CONTEXT_IID); + + res = NSRepository::CreateInstance(kRenderingContextCID, nsnull, kRenderingContextIID, (void **)&ctx); + + if (NS_OK == res) + ctx->Init(mContext, this); + + NS_ASSERTION(NULL != ctx, "Null rendering context"); + } + + return ctx; + +} + +//------------------------------------------------------------------------- +// +// Return the toolkit this widget was created on +// +//------------------------------------------------------------------------- +nsIToolkit* nsWindow::GetToolkit() +{ + return nsnull; +} + + +//------------------------------------------------------------------------- +// +// Set the colormap of the window +// +//------------------------------------------------------------------------- +void nsWindow::SetColorMap(nsColorMap *aColorMap) +{ +} + +//------------------------------------------------------------------------- +// +// Return the used device context +// +//------------------------------------------------------------------------- +nsIDeviceContext* nsWindow::GetDeviceContext() +{ + return mContext; +} + +//------------------------------------------------------------------------- +// +// Return the used app shell +// +//------------------------------------------------------------------------- +nsIAppShell* nsWindow::GetAppShell() +{ + return mAppShell; +} + +//------------------------------------------------------------------------- +// +// Scroll the bits of a window +// +//------------------------------------------------------------------------- +void nsWindow::Scroll(PRInt32 aDx, PRInt32 aDy, nsRect *aClipRect) +{ +} + + +void nsWindow::SetBorderStyle(nsBorderStyle aBorderStyle) +{ +} + +void nsWindow::SetTitle(const nsString& aTitle) +{ +} + + +/** + * Processes a mouse pressed event + * + **/ +void nsWindow::AddMouseListener(nsIMouseListener * aListener) +{ +} + +/** + * Processes a mouse pressed event + * + **/ +void nsWindow::AddEventListener(nsIEventListener * aListener) +{ +} + +PRBool nsWindow::ConvertStatus(nsEventStatus aStatus) +{ + switch(aStatus) { + case nsEventStatus_eIgnore: + return(PR_FALSE); + case nsEventStatus_eConsumeNoDefault: + return(PR_TRUE); + case nsEventStatus_eConsumeDoDefault: + return(PR_FALSE); + default: + NS_ASSERTION(0, "Illegal nsEventStatus enumeration value"); + break; + } + return(PR_FALSE); +} + +//------------------------------------------------------------------------- +// +// Invokes callback and ProcessEvent method on Event Listener object +// +//------------------------------------------------------------------------- + +PRBool nsWindow::DispatchEvent(nsGUIEvent* event) +{ + PRBool result = PR_FALSE; + event->widgetSupports = mOuter; + + if (nsnull != mEventCallback) { + result = ConvertStatus((*mEventCallback)(event)); + } + // Dispatch to event listener if event was not consumed + if ((result != PR_TRUE) && (nsnull != mEventListener)) { + return ConvertStatus(mEventListener->ProcessEvent(*event)); + } + else { + return(result); + } +} + +//------------------------------------------------------------------------- +// +// Deal with all sort of mouse event +// +//------------------------------------------------------------------------- +PRBool nsWindow::DispatchMouseEvent(nsMouseEvent aEvent) +{ + PRBool result = PR_FALSE; + if (nsnull == mEventCallback && nsnull == mMouseListener) { + return result; + } + + + // call the event callback + if (nsnull != mEventCallback) { + result = DispatchEvent(&aEvent); + + return result; + } + + if (nsnull != mMouseListener) { + switch (aEvent.message) { + case NS_MOUSE_MOVE: { + /*result = ConvertStatus(mMouseListener->MouseMoved(event)); + nsRect rect; + GetBounds(rect); + if (rect.Contains(event.point.x, event.point.y)) { + if (mCurrentWindow == NULL || mCurrentWindow != this) { + //printf("Mouse enter"); + mCurrentWindow = this; + } + } else { + //printf("Mouse exit"); + }*/ + + } break; + + case NS_MOUSE_LEFT_BUTTON_DOWN: + case NS_MOUSE_MIDDLE_BUTTON_DOWN: + case NS_MOUSE_RIGHT_BUTTON_DOWN: + result = ConvertStatus(mMouseListener->MousePressed(aEvent)); + break; + + case NS_MOUSE_LEFT_BUTTON_UP: + case NS_MOUSE_MIDDLE_BUTTON_UP: + case NS_MOUSE_RIGHT_BUTTON_UP: + result = ConvertStatus(mMouseListener->MouseReleased(aEvent)); + result = ConvertStatus(mMouseListener->MouseClicked(aEvent)); + break; + } // switch + } + return result; +} + + +/** + * Processes an Expose Event + * + **/ +PRBool nsWindow::OnPaint(nsPaintEvent &event) +{ + nsresult result ; + + // call the event callback + if (mEventCallback) { + + nsRect rr ; + + /* + * Maybe ... some day ... somone will pull the invalid rect + * out of the paint message rather than drawing the whole thing... + */ + GetBounds(rr); + + rr.x = 0; + rr.y = 0; + + event.rect = &rr; + + event.renderingContext = nsnull; + static NS_DEFINE_IID(kRenderingContextCID, NS_RENDERING_CONTEXT_CID); + static NS_DEFINE_IID(kRenderingContextIID, NS_IRENDERING_CONTEXT_IID); + + if (NS_OK == NSRepository::CreateInstance(kRenderingContextCID, + nsnull, + kRenderingContextIID, + (void **)&event.renderingContext)) + { + event.renderingContext->Init(mContext, this); + result = DispatchEvent(&event); + NS_RELEASE(event.renderingContext); + } + else + { + result = PR_FALSE; + } + } + return result; +} + + +void nsWindow::BeginResizingChildren(void) +{ +} + +void nsWindow::EndResizingChildren(void) +{ +} + + +void nsWindow::OnDestroy() +{ +} + +PRBool nsWindow::OnResize(nsSizeEvent &aEvent) +{ + nsRect* size = aEvent.windowSize; + /*if (mWidget) { + Arg arg[3]; + printf("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Setting to 600,800\n"); + XtSetArg(arg[0], XtNwidth, 600); + XtSetArg(arg[1], XtNheight,800); + + XtSetValues(mWidget, arg, 2); + + }*/ + + if (mEventCallback && !mIgnoreResize) { + return(DispatchEvent(&aEvent)); + } + return FALSE; +} + +PRBool nsWindow::OnKey(PRUint32 aEventType, PRUint32 aKeyCode, nsKeyEvent* aEvent) +{ + if (mEventCallback) { + return(DispatchEvent(aEvent)); + } + else + return FALSE; +} + + +PRBool nsWindow::DispatchFocus(nsGUIEvent &aEvent) +{ + if (mEventCallback) { + return(DispatchEvent(&aEvent)); + } + + return FALSE; +} + +PRBool nsWindow::OnScroll(nsScrollbarEvent & aEvent, PRUint32 cPos) +{ + return FALSE; +} + +void nsWindow::SetIgnoreResize(PRBool aIgnore) +{ + mIgnoreResize = aIgnore; +} + +PRBool nsWindow::IgnoreResize() +{ + return mIgnoreResize; +} + +void nsWindow::SetResizeRect(nsRect& aRect) +{ + mResizeRect = aRect; +} + +void nsWindow::GetResizeRect(nsRect* aRect) +{ + aRect->x = mResizeRect.x; + aRect->y = mResizeRect.y; + aRect->width = mResizeRect.width; + aRect->height = mResizeRect.height; +} + +void nsWindow::SetResized(PRBool aResized) +{ + mResized = aResized; +} + +PRBool nsWindow::GetResized() +{ + return(mResized); +} + +void nsWindow::UpdateVisibilityFlag() +{ + //Widget parent = XtParent(mWidget); + + if (TRUE) { + PRUint32 pWidth = 0; + PRUint32 pHeight = 0; + //XtVaGetValues(parent, XmNwidth, &pWidth, XmNheight, &pHeight, nsnull); + if ((mBounds.y + mBounds.height) > pHeight) { + mVisible = PR_FALSE; + return; + } + + if (mBounds.y < 0) + mVisible = PR_FALSE; + } + + mVisible = PR_TRUE; +} + +void nsWindow::UpdateDisplay() +{ + // If not displayed and needs to be displayed + if ((PR_FALSE==mDisplayed) && + (PR_TRUE==mShown) && + (PR_TRUE==mVisible)) { + //XtManageChild(mWidget); + mDisplayed = PR_TRUE; + } + + // Displayed and needs to be removed + if (PR_TRUE==mDisplayed) { + if ((PR_FALSE==mShown) || (PR_FALSE==mVisible)) { + //XtUnmanageChild(mWidget); + mDisplayed = PR_FALSE; + } + } +} + +PRUint32 nsWindow::GetYCoord(PRUint32 aNewY) +{ + if (PR_TRUE==mLowerLeft) { + return(aNewY - 12 /*KLUDGE fix this later mBounds.height */); + } + return(aNewY); +} + diff --git a/widget/src/mac/nsWindow.h b/widget/src/mac/nsWindow.h new file mode 100644 index 000000000000..f91ae53659d6 --- /dev/null +++ b/widget/src/mac/nsWindow.h @@ -0,0 +1,554 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ +#ifndef Window_h__ +#define Window_h__ + +#include "nsISupports.h" + +#include "nsToolkit.h" + +#include "nsIWidget.h" +#include "nsIEnumerator.h" +#include "nsIAppShell.h" + +#include "nsIMouseListener.h" +#include "nsIEventListener.h" +#include "nsString.h" + + +#define NSRGB_2_COLOREF(color) \ + RGB(NS_GET_R(color),NS_GET_G(color),NS_GET_B(color)) + + +/** + * Native Motif window wrapper. + */ + +class nsWindow : public nsIWidget +{ + +public: + nsWindow(nsISupports *aOuter); + virtual ~nsWindow(); + + NS_DECL_ISUPPORTS + + + NS_IMETHOD QueryObject(const nsIID& aIID, void** aInstancePtr); + nsrefcnt AddRefObject(void); + nsrefcnt ReleaseObject(void); + + // nsIWidget interface + virtual void Create(nsIWidget *aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext, + nsIAppShell *aAppShell = nsnull, + nsIToolkit *aToolkit = nsnull, + nsWidgetInitData *aInitData = nsnull); + virtual void Create(nsNativeWidget aParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext, + nsIAppShell *aAppShell = nsnull, + nsIToolkit *aToolkit = nsnull, + nsWidgetInitData *aInitData = nsnull); + virtual void Destroy(); + virtual nsIWidget* GetParent(void); + virtual nsIEnumerator* GetChildren(); + virtual void AddChild(nsIWidget* aChild); + virtual void RemoveChild(nsIWidget* aChild); + virtual void Show(PRBool bState); + virtual void Move(PRUint32 aX, PRUint32 aY); + virtual void Resize(PRUint32 aWidth, + PRUint32 aHeight, PRBool aRepaint); + virtual void Resize(PRUint32 aX, + PRUint32 aY, + PRUint32 aWidth, + PRUint32 aHeight, PRBool aRepaint); + virtual void Enable(PRBool bState); + virtual void SetFocus(void); + virtual void GetBounds(nsRect &aRect); + virtual void SetBounds(const nsRect &aRect); + virtual nscolor GetForegroundColor(void); + virtual void SetForegroundColor(const nscolor &aColor); + virtual nscolor GetBackgroundColor(void); + virtual void SetBackgroundColor(const nscolor &aColor); + virtual nsIFontMetrics* GetFont(void); + virtual void SetFont(const nsFont &aFont); + virtual nsCursor GetCursor(); + virtual void SetCursor(nsCursor aCursor); + virtual void Invalidate(PRBool aIsSynchronous); + virtual void* GetNativeData(PRUint32 aDataType); + virtual nsIRenderingContext* GetRenderingContext(); + virtual void SetColorMap(nsColorMap *aColorMap); + virtual nsIDeviceContext* GetDeviceContext(); + virtual nsIAppShell* GetAppShell(); + virtual void Scroll(PRInt32 aDx, PRInt32 aDy, nsRect *aClipRect); + virtual nsIToolkit* GetToolkit(); + virtual void SetBorderStyle(nsBorderStyle aBorderStyle); + virtual void SetTitle(const nsString& aTitle); + virtual void SetTooltips(PRUint32 aNumberOfTips,nsRect* aTooltipAreas[]); + + virtual void RemoveTooltips(); + virtual void UpdateTooltips(nsRect* aNewTips[]); + virtual void WidgetToScreen(const nsRect& aOldRect, nsRect& aNewRect); + virtual void ScreenToWidget(const nsRect& aOldRect, nsRect& aNewRect); + virtual void AddMouseListener(nsIMouseListener * aListener); + virtual void AddEventListener(nsIEventListener * aListener); + virtual void BeginResizingChildren(void); + virtual void EndResizingChildren(void); + + static PRBool ConvertStatus(nsEventStatus aStatus); + virtual PRBool DispatchEvent(nsGUIEvent* event); + virtual PRBool DispatchMouseEvent(nsMouseEvent aEvent); + + virtual void OnDestroy(); + virtual PRBool OnPaint(nsPaintEvent &event); + virtual PRBool OnResize(nsSizeEvent &aEvent); + virtual PRBool OnKey(PRUint32 aEventType, PRUint32 aKeyCode, nsKeyEvent* aEvent); + + virtual PRBool DispatchFocus(nsGUIEvent &aEvent); + virtual PRBool OnScroll(nsScrollbarEvent & aEvent, PRUint32 cPos); + + virtual void SetIgnoreResize(PRBool aIgnore); + virtual PRBool IgnoreResize(); + + virtual PRUint32 GetYCoord(PRUint32 aNewY); + + // Resize event management + void SetResizeRect(nsRect& aRect); + void SetResized(PRBool aResized); + void GetResizeRect(nsRect* aRect); + PRBool GetResized(); + + char gInstanceClassName[256]; +protected: + + void CreateGC(); + void CreateWindow(nsNativeWidget aNativeParent, nsIWidget *aWidgetParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext, + nsIAppShell *aAppShell, + nsIToolkit *aToolkit, + nsWidgetInitData *aInitData); + + void CreateMainWindow(nsNativeWidget aNativeParent, nsIWidget *aWidgetParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext, + nsIAppShell *aAppShell, + nsIToolkit *aToolkit, + nsWidgetInitData *aInitData); + + void CreateChildWindow(nsNativeWidget aNativeParent, nsIWidget *aWidgetParent, + const nsRect &aRect, + EVENT_CALLBACK aHandleEventFunction, + nsIDeviceContext *aContext, + nsIAppShell *aAppShell, + nsIToolkit *aToolkit, + nsWidgetInitData *aInitData); + + + void InitToolkit(nsIToolkit *aToolkit, nsIWidget * aWidgetParent); + + + virtual void UpdateVisibilityFlag(); + virtual void UpdateDisplay(); + + //Widget mWidget; + EVENT_CALLBACK mEventCallback; + nsIDeviceContext *mContext; + nsIFontMetrics *mFontMetrics; + nsToolkit *mToolkit; + nsIAppShell *mAppShell; + + nsIMouseListener * mMouseListener; + nsIEventListener * mEventListener; + + nscolor mBackground; + nscolor mForeground; + nsCursor mCursor; + nsBorderStyle mBorderStyle; + nsRect mBounds; + + PRBool mIgnoreResize; + PRBool mShown; + PRBool mVisible; + PRBool mDisplayed; + + // Resize event management + nsRect mResizeRect; + int mResized; + PRBool mLowerLeft; + + nsISupports* mOuter; + + class InnerSupport : public nsISupports { + public: + InnerSupport() {} + +#define INNER_OUTER \ + ((nsWindow*)((char*)this - offsetof(nsWindow, mInner))) + + NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr) + { return INNER_OUTER->QueryObject(aIID, aInstancePtr); } + NS_IMETHOD_(nsrefcnt) AddRef(void) + { return INNER_OUTER->AddRefObject(); } + NS_IMETHOD_(nsrefcnt) Release(void) + { return INNER_OUTER->ReleaseObject(); } + } mInner; + friend InnerSupport; + +private: + //GC mGC; +}; + +// +// A child window is a window with different style +// +class ChildWindow : public nsWindow { + +public: + ChildWindow(nsISupports *aOuter) : nsWindow(aOuter) {} + +}; + +#define AGGREGATE_METHOD_DEF \ +public: \ + NS_IMETHOD QueryInterface(REFNSIID aIID, \ + void** aInstancePtr); \ + NS_IMETHOD_(nsrefcnt) AddRef(void); \ + NS_IMETHOD_(nsrefcnt) Release(void); \ +protected: \ + nsrefcnt mRefCnt; \ +public: \ + virtual void Create(nsIWidget *aParent, \ + const nsRect &aRect, \ + EVENT_CALLBACK aHandleEventFunction, \ + nsIDeviceContext *aContext, \ + nsIAppShell *aAppShell, \ + nsIToolkit *aToolkit = nsnull, \ + nsWidgetInitData *aInitData = nsnull); \ + virtual void Create(nsNativeWidget aParent, \ + const nsRect &aRect, \ + EVENT_CALLBACK aHandleEventFunction, \ + nsIDeviceContext *aContext, \ + nsIAppShell *aAppShell, \ + nsIToolkit *aToolkit = nsnull, \ + nsWidgetInitData *aInitData = nsnull); \ + virtual void Destroy(); \ + virtual nsIWidget* GetParent(void); \ + virtual nsIEnumerator* GetChildren(); \ + virtual void AddChild(nsIWidget* aChild); \ + virtual void RemoveChild(nsIWidget* aChild); \ + virtual void Show(PRBool bState); \ + virtual void Move(PRUint32 aX, PRUint32 aY); \ + virtual void Resize(PRUint32 aWidth, \ + PRUint32 aHeight, PRBool aRepaint); \ + virtual void Resize(PRUint32 aX, \ + PRUint32 aY, \ + PRUint32 aWidth, \ + PRUint32 aHeight, PRBool aRepaint); \ + virtual void Enable(PRBool bState); \ + virtual void SetFocus(void); \ + virtual void GetBounds(nsRect &aRect); \ + virtual void SetBounds(const nsRect &aRect); \ + virtual nscolor GetForegroundColor(void); \ + virtual void SetForegroundColor(const nscolor &aColor); \ + virtual nscolor GetBackgroundColor(void); \ + virtual void SetBackgroundColor(const nscolor &aColor); \ + virtual nsIFontMetrics* GetFont(void); \ + virtual void SetFont(const nsFont &aFont); \ + virtual nsCursor GetCursor(); \ + virtual void SetCursor(nsCursor aCursor); \ + virtual void Invalidate(PRBool aIsSynchronous); \ + virtual void* GetNativeData(PRUint32 aDataType); \ + virtual nsIRenderingContext* GetRenderingContext(); \ + virtual void SetColorMap(nsColorMap *aColorMap); \ + virtual nsIDeviceContext* GetDeviceContext(); \ + virtual nsIAppShell* GetAppShell(); \ + virtual void Scroll(PRInt32 aDx, PRInt32 aDy, nsRect *aClipRect); \ + virtual nsIToolkit* GetToolkit(); \ + virtual void SetBorderStyle(nsBorderStyle aBorderStyle); \ + virtual void SetTitle(const nsString& aTitle); \ + virtual void SetTooltips(PRUint32 aNumberOfTips,nsRect* aTooltipAreas[]); \ + virtual void RemoveTooltips(); \ + virtual void UpdateTooltips(nsRect* aNewTips[]); \ + virtual void WidgetToScreen(const nsRect& aOldRect, nsRect& aNewRect); \ + virtual void ScreenToWidget(const nsRect& aOldRect, nsRect& aNewRect); \ + virtual void AddMouseListener(nsIMouseListener * aListener); \ + virtual void AddEventListener(nsIEventListener * aListener); \ + virtual void BeginResizingChildren(void); \ + virtual void EndResizingChildren(void); \ + virtual PRBool DispatchEvent(nsGUIEvent* event); \ + virtual PRBool DispatchMouseEvent(nsMouseEvent aEvent); \ + virtual void OnDestroy(); \ + virtual PRBool OnPaint(nsPaintEvent & event); \ + virtual PRBool OnResize(nsSizeEvent &aEvent); \ + virtual PRBool OnKey(PRUint32 aEventType, PRUint32 aKeyCode, nsKeyEvent* aEvent); \ + virtual PRBool DispatchFocus(nsGUIEvent &aEvent); \ + virtual PRBool OnScroll(nsScrollbarEvent & aEvent, PRUint32 cPos); + + +#define BASE_IWIDGET_IMPL_NO_SHOW(_classname, _aggname) \ + _classname::_aggname::_aggname() \ + { \ + } \ + _classname::_aggname::~_aggname() \ + { \ + } \ + nsrefcnt _classname::_aggname::AddRef() \ + { \ + return GET_OUTER()->AddRef(); \ + } \ + nsrefcnt _classname::_aggname::Release() \ + { \ + return GET_OUTER()->Release(); \ + } \ + nsresult _classname::_aggname::QueryInterface(REFNSIID aIID, void** aInstancePtr) \ + { \ + return GET_OUTER()->QueryInterface(aIID, aInstancePtr); \ + } \ + void _classname::_aggname::Create(nsIWidget *aParent, \ + const nsRect &aRect, \ + EVENT_CALLBACK aHandleEventFunction, \ + nsIDeviceContext *aContext, \ + nsIAppShell *aAppShell, \ + nsIToolkit *aToolkit, \ + nsWidgetInitData *aInitData) \ + { \ + GET_OUTER()->Create(aParent, aRect, aHandleEventFunction, aContext, aAppShell, aToolkit, aInitData); \ + } \ + void _classname::_aggname::Create(nsNativeWidget aParent, \ + const nsRect &aRect, \ + EVENT_CALLBACK aHandleEventFunction, \ + nsIDeviceContext *aContext, \ + nsIAppShell *aAppShell, \ + nsIToolkit *aToolkit, \ + nsWidgetInitData *aInitData) \ + { \ + GET_OUTER()->Create(aParent, aRect, aHandleEventFunction, aContext, aAppShell, aToolkit, aInitData); \ + } \ + void _classname::_aggname::Destroy() \ + { \ + GET_OUTER()->Destroy(); \ + } \ + nsIWidget* _classname::_aggname::GetParent(void) \ + { \ + return GET_OUTER()->GetParent(); \ + } \ + nsIEnumerator* _classname::_aggname::GetChildren() \ + { \ + return GET_OUTER()->GetChildren(); \ + } \ + void _classname::_aggname::AddChild(nsIWidget* aChild) \ + { \ + GET_OUTER()->AddChild(aChild); \ + } \ + void _classname::_aggname::RemoveChild(nsIWidget* aChild) \ + { \ + GET_OUTER()->RemoveChild(aChild); \ + } \ + void _classname::_aggname::Move(PRUint32 aX, PRUint32 aY) \ + { \ + GET_OUTER()->Move(aX, aY); \ + } \ + void _classname::_aggname::Resize(PRUint32 aWidth, \ + PRUint32 aHeight, PRBool aRepaint) \ + { \ + GET_OUTER()->Resize(aWidth, aHeight, aRepaint); \ + } \ + void _classname::_aggname::Resize(PRUint32 aX, \ + PRUint32 aY, \ + PRUint32 aWidth, \ + PRUint32 aHeight, PRBool aRepaint) \ + { \ + GET_OUTER()->Resize(aX, aY, aWidth, aHeight, aRepaint); \ + } \ + void _classname::_aggname::Enable(PRBool bState) \ + { \ + GET_OUTER()->Enable(bState); \ + } \ + void _classname::_aggname::SetFocus(void) \ + { \ + GET_OUTER()->SetFocus(); \ + } \ + void _classname::_aggname::GetBounds(nsRect &aRect) \ + { \ + GET_OUTER()->GetBounds(aRect); \ + } \ + void _classname::_aggname::SetBounds(const nsRect &aRect) \ + { \ + GET_OUTER()->SetBounds(aRect); \ + } \ + nscolor _classname::_aggname::GetForegroundColor(void) \ + { \ + return GET_OUTER()->GetForegroundColor(); \ + } \ + void _classname::_aggname::SetForegroundColor(const nscolor &aColor) \ + { \ + GET_OUTER()->SetForegroundColor(aColor); \ + } \ + nscolor _classname::_aggname::GetBackgroundColor(void) \ + { \ + return GET_OUTER()->GetBackgroundColor(); \ + } \ + void _classname::_aggname::SetBackgroundColor(const nscolor &aColor) \ + { \ + GET_OUTER()->SetBackgroundColor(aColor); \ + } \ + nsIFontMetrics* _classname::_aggname::GetFont(void) \ + { \ + return GET_OUTER()->GetFont(); \ + } \ + void _classname::_aggname::SetFont(const nsFont &aFont) \ + { \ + GET_OUTER()->SetFont(aFont); \ + } \ + nsCursor _classname::_aggname::GetCursor() \ + { \ + return GET_OUTER()->GetCursor(); \ + } \ + void _classname::_aggname::SetCursor(nsCursor aCursor) \ + { \ + GET_OUTER()->SetCursor(aCursor); \ + } \ + void _classname::_aggname::Invalidate(PRBool aIsSynchronous) \ + { \ + GET_OUTER()->Invalidate(aIsSynchronous); \ + } \ + void* _classname::_aggname::GetNativeData(PRUint32 aDataType) \ + { \ + return GET_OUTER()->GetNativeData(aDataType); \ + } \ + nsIRenderingContext* _classname::_aggname::GetRenderingContext() \ + { \ + return GET_OUTER()->GetRenderingContext(); \ + } \ + nsIDeviceContext* _classname::_aggname::GetDeviceContext() \ + { \ + return GET_OUTER()->GetDeviceContext(); \ + } \ + nsIAppShell* _classname::_aggname::GetAppShell() \ + { \ + return GET_OUTER()->GetAppShell(); \ + } \ + void _classname::_aggname::Scroll(PRInt32 aDx, PRInt32 aDy, nsRect *aClipRect) \ + { \ + GET_OUTER()->Scroll(aDx, aDy, aClipRect); \ + } \ + nsIToolkit* _classname::_aggname::GetToolkit() \ + { \ + return GET_OUTER()->GetToolkit(); \ + } \ + void _classname::_aggname::SetColorMap(nsColorMap *aColorMap) \ + { \ + GET_OUTER()->SetColorMap(aColorMap); \ + } \ + void _classname::_aggname::AddMouseListener(nsIMouseListener * aListener) \ + { \ + GET_OUTER()->AddMouseListener(aListener); \ + } \ + void _classname::_aggname::AddEventListener(nsIEventListener * aListener) \ + { \ + GET_OUTER()->AddEventListener(aListener); \ + } \ + void _classname::_aggname::SetBorderStyle(nsBorderStyle aBorderStyle) \ + { \ + GET_OUTER()->SetBorderStyle(aBorderStyle); \ + } \ + void _classname::_aggname::SetTitle(const nsString& aTitle) \ + { \ + GET_OUTER()->SetTitle(aTitle); \ + } \ + void _classname::_aggname::SetTooltips(PRUint32 aNumberOfTips,nsRect* aTooltipAreas[]) \ + { \ + GET_OUTER()->SetTooltips(aNumberOfTips, aTooltipAreas); \ + } \ + void _classname::_aggname::UpdateTooltips(nsRect* aNewTips[]) \ + { \ + GET_OUTER()->UpdateTooltips(aNewTips); \ + } \ + void _classname::_aggname::RemoveTooltips() \ + { \ + GET_OUTER()->RemoveTooltips(); \ + } \ + void _classname::_aggname::WidgetToScreen(const nsRect& aOldRect, nsRect& aNewRect) \ + { \ + GET_OUTER()->WidgetToScreen(aOldRect, aNewRect); \ + } \ + void _classname::_aggname::ScreenToWidget(const nsRect& aOldRect, nsRect& aNewRect) \ + { \ + GET_OUTER()->ScreenToWidget(aOldRect, aNewRect); \ + } \ + PRBool _classname::_aggname::DispatchEvent(nsGUIEvent* event) \ + { \ + return GET_OUTER()->DispatchEvent(event); \ + } \ + PRBool _classname::_aggname::DispatchMouseEvent(nsMouseEvent event) \ + { \ + return GET_OUTER()->DispatchMouseEvent(event); \ + } \ + PRBool _classname::_aggname::OnPaint(nsPaintEvent &event) \ + { \ + return GET_OUTER()->OnPaint(event); \ + } \ + void _classname::_aggname::BeginResizingChildren() \ + { \ + GET_OUTER()->BeginResizingChildren(); \ + } \ + void _classname::_aggname::EndResizingChildren() \ + { \ + GET_OUTER()->EndResizingChildren(); \ + } \ + void _classname::_aggname::OnDestroy() \ + { \ + GET_OUTER()->OnDestroy(); \ + } \ + PRBool _classname::_aggname::OnResize(nsSizeEvent &aEvent) \ + { \ + return GET_OUTER()->OnResize(aEvent); \ + } \ + PRBool _classname::_aggname::OnKey(PRUint32 aEventType, PRUint32 aKeyCode, nsKeyEvent* aEvent) \ + { \ + return GET_OUTER()->OnKey(aEventType, aKeyCode, aEvent); \ + } \ + PRBool _classname::_aggname::DispatchFocus(nsGUIEvent &aEvent) \ + { \ + return GET_OUTER()->DispatchFocus(aEvent); \ + } \ + PRBool _classname::_aggname::OnScroll(nsScrollbarEvent & aEvent, PRUint32 cPos) \ + { \ + return GET_OUTER()->OnScroll(aEvent, cPos); \ + } + +#define BASE_IWIDGET_IMPL_SHOW(_classname, _aggname) \ + void _classname::_aggname::Show(PRBool bState) \ + { \ + GET_OUTER()->Show(bState); \ + } + +#define BASE_IWIDGET_IMPL(_classname, _aggname) \ + BASE_IWIDGET_IMPL_NO_SHOW(_classname, _aggname) \ + BASE_IWIDGET_IMPL_SHOW(_classname, _aggname) + + + +#endif // Window_h__