gecko-dev/widget/src/windows/nsWindow.h

287 lines
11 KiB
C
Raw Normal View History

1998-04-13 20:24:54 +00:00
/* -*- 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 "nsBaseWidget.h"
1998-04-13 20:24:54 +00:00
#include "nsdefs.h"
#include "nsSwitchToUIThread.h"
#include "nsToolkit.h"
#include "nsIWidget.h"
#include "nsIMenuBar.h"
1998-04-13 20:24:54 +00:00
#include "nsIMouseListener.h"
#include "nsIEventListener.h"
#include "nsStringUtil.h"
#include "nsString.h"
1998-04-13 20:24:54 +00:00
#include "nsVoidArray.h"
class nsNativeDragTarget;
1998-04-13 20:24:54 +00:00
#define NSRGB_2_COLOREF(color) \
RGB(NS_GET_R(color),NS_GET_G(color),NS_GET_B(color))
/**
* Native WIN32 window wrapper.
*/
1999-04-19 19:04:12 +00:00
class nsWindow : public nsSwitchToUIThread,
public nsBaseWidget
1998-04-13 20:24:54 +00:00
{
public:
nsWindow();
virtual ~nsWindow();
1998-04-13 20:24:54 +00:00
// nsIWidget interface
NS_IMETHOD Create(nsIWidget *aParent,
1998-04-13 20:24:54 +00:00
const nsRect &aRect,
EVENT_CALLBACK aHandleEventFunction,
nsIDeviceContext *aContext,
nsIAppShell *aAppShell = nsnull,
nsIToolkit *aToolkit = nsnull,
1998-05-14 21:34:08 +00:00
nsWidgetInitData *aInitData = nsnull);
NS_IMETHOD Create(nsNativeWidget aParent,
1998-04-13 20:24:54 +00:00
const nsRect &aRect,
EVENT_CALLBACK aHandleEventFunction,
nsIDeviceContext *aContext,
nsIAppShell *aAppShell = nsnull,
nsIToolkit *aToolkit = nsnull,
1998-05-14 21:34:08 +00:00
nsWidgetInitData *aInitData = nsnull);
// Utility method for implementing both Create(nsIWidget ...) and
// Create(nsNativeWidget...)
virtual nsresult StandardWindowCreate(nsIWidget *aParent,
const nsRect &aRect,
EVENT_CALLBACK aHandleEventFunction,
nsIDeviceContext *aContext,
nsIAppShell *aAppShell,
nsIToolkit *aToolkit,
nsWidgetInitData *aInitData,
nsNativeWidget aNativeParent = nsnull);
NS_IMETHOD Destroy();
1998-04-13 20:24:54 +00:00
virtual nsIWidget* GetParent(void);
NS_IMETHOD Show(PRBool bState);
NS_IMETHOD IsVisible(PRBool & aState);
HWND mBorderlessParent;
NS_IMETHOD CaptureMouse(PRBool aCapture);
NS_IMETHOD Move(PRUint32 aX, PRUint32 aY);
NS_IMETHOD Resize(PRUint32 aWidth,
PRUint32 aHeight,
PRBool aRepaint);
NS_IMETHOD Resize(PRUint32 aX,
1998-04-13 20:24:54 +00:00
PRUint32 aY,
PRUint32 aWidth,
PRUint32 aHeight,
PRBool aRepaint);
NS_IMETHOD Enable(PRBool bState);
NS_IMETHOD SetFocus(void);
NS_IMETHOD GetBounds(nsRect &aRect);
NS_IMETHOD GetClientBounds(nsRect &aRect);
NS_IMETHOD SetBackgroundColor(const nscolor &aColor);
1998-04-13 20:24:54 +00:00
virtual nsIFontMetrics* GetFont(void);
NS_IMETHOD SetFont(const nsFont &aFont);
NS_IMETHOD SetCursor(nsCursor aCursor);
NS_IMETHOD Invalidate(PRBool aIsSynchronous);
NS_IMETHOD Invalidate(const nsRect & aRect, PRBool aIsSynchronous);
NS_IMETHOD Update();
1998-04-13 20:24:54 +00:00
virtual void* GetNativeData(PRUint32 aDataType);
1999-05-27 23:20:09 +00:00
virtual void FreeNativeData(void * data, PRUint32 aDataType);//~~~
NS_IMETHOD SetColorMap(nsColorMap *aColorMap);
NS_IMETHOD Scroll(PRInt32 aDx, PRInt32 aDy, nsRect *aClipRect);
NS_IMETHOD SetTitle(const nsString& aTitle);
NS_IMETHOD SetMenuBar(nsIMenuBar * aMenuBar);
1999-06-04 04:00:30 +00:00
NS_IMETHOD ShowMenuBar(PRBool aShow);
NS_IMETHOD IsMenuBarVisible(PRBool *aVisible);
NS_IMETHOD SetTooltips(PRUint32 aNumberOfTips,nsRect* aTooltipAreas[]);
NS_IMETHOD RemoveTooltips();
NS_IMETHOD UpdateTooltips(nsRect* aNewTips[]);
NS_IMETHOD WidgetToScreen(const nsRect& aOldRect, nsRect& aNewRect);
NS_IMETHOD ScreenToWidget(const nsRect& aOldRect, nsRect& aNewRect);
NS_IMETHOD BeginResizingChildren(void);
NS_IMETHOD EndResizingChildren(void);
NS_IMETHOD GetPreferredSize(PRInt32& aWidth, PRInt32& aHeight);
NS_IMETHOD SetPreferredSize(PRInt32 aWidth, PRInt32 aHeight);
NS_IMETHOD DispatchEvent(nsGUIEvent* event, nsEventStatus & aStatus);
NS_IMETHOD EnableFileDrop(PRBool aEnable);
1998-04-13 20:24:54 +00:00
virtual void SetUpForPaint(HDC aHDC);
virtual void ConvertToDeviceCoordinates(nscoord &aX,nscoord &aY) {}
1998-09-16 17:18:56 +00:00
1998-04-13 20:24:54 +00:00
// nsSwitchToUIThread interface
virtual BOOL CallMethod(MethodInfo *info);
HWND GetWindowHandle() { return mWnd; }
WNDPROC GetPrevWindowProc() { return mPrevWndProc; }
1998-05-29 22:44:13 +00:00
virtual PRBool DispatchMouseEvent(PRUint32 aEventType, nsPoint* aPoint = nsnull);
virtual PRBool AutoErase();
1998-05-29 22:44:13 +00:00
nsPoint* GetLastPoint() { return &mLastPoint; }
1998-04-13 20:24:54 +00:00
1999-02-17 14:30:47 +00:00
PRInt32 GetNewCmdMenuId() { mMenuCmdId++; return mMenuCmdId;}
void InitEvent(nsGUIEvent& event, PRUint32 aEventType, nsPoint* aPoint = nsnull);
1998-04-13 20:24:54 +00:00
protected:
virtual PRBool ProcessMessage(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *aRetValue);
virtual PRBool DispatchWindowEvent(nsGUIEvent* event);
nsresult MenuHasBeenSelected(HMENU aNativeMenu, UINT aItemNum, UINT aFlags, UINT aCommand);
1999-04-19 08:23:18 +00:00
nsresult DynamicMenuHasBeenSelected(HMENU aNativeMenu, UINT aItemNum, UINT aFlags, UINT aCommand);
nsIMenuItem * FindMenuItem(nsIMenu * aMenu, PRUint32 aId);
nsIMenu * FindMenu(nsIMenu * aMenu, HMENU aNativeMenu, PRInt32 &aDepth);
1998-04-13 20:24:54 +00:00
1998-05-14 21:34:08 +00:00
// Allow Derived classes to modify the height that is passed
// when the window is created or resized.
virtual PRInt32 GetHeight(PRInt32 aProposedHeight);
1998-04-13 20:24:54 +00:00
virtual LPCTSTR WindowClass();
virtual DWORD WindowStyle();
virtual DWORD WindowExStyle();
virtual void SubclassWindow(BOOL bState);
1998-04-13 20:24:54 +00:00
virtual void OnDestroy();
1998-05-29 22:44:13 +00:00
virtual PRBool OnMove(PRInt32 aX, PRInt32 aY);
1998-04-13 20:24:54 +00:00
virtual PRBool OnPaint();
virtual PRBool OnResize(nsRect &aWindowRect);
1999-04-23 14:30:51 +00:00
#if 1
1999-06-11 20:32:09 +00:00
BOOL OnChar(UINT mbcsCharCode, UINT virtualKeyCode, bool isMultibyte);
#else
BOOL OnChar(UINT aVirtualKeyCode);
#endif
1999-04-23 14:30:51 +00:00
BOOL OnKeyDown( UINT aVirtualKeyCode, UINT aScanCode);
BOOL OnKeyUp( UINT aVirtualKeyCode, UINT aScanCode);
ULONG IsSpecialChar(UINT aVirtualKeyCode, WORD *aAsciiKey);
virtual PRBool DispatchKeyEvent(PRUint32 aEventType, WORD aCharCode, UINT aVirtualCharCode);
1998-04-13 20:24:54 +00:00
virtual PRBool DispatchFocus(PRUint32 aEventType);
virtual PRBool OnScroll(UINT scrollCode, int cPos);
virtual HBRUSH OnControlColor();
static LRESULT CALLBACK WindowProc(HWND hWnd,
UINT msg,
WPARAM wParam,
LPARAM lParam);
static PRBool ConvertStatus(nsEventStatus aStatus);
DWORD GetBorderStyle(nsBorderStyle aBorderStyle);
1998-04-13 20:24:54 +00:00
PRBool DispatchStandardEvent(PRUint32 aMsg);
void AddTooltip(HWND hwndOwner, nsRect* aRect, int aId);
void RelayMouseEvent(UINT aMsg, WPARAM wParam, LPARAM lParam);
void GetNonClientBounds(nsRect &aRect);
void HandleTextEvent(void);
void HandleStartComposition(void);
void HandleEndComposition(void);
void MapDBCSAtrributeArrayToUnicodeOffsets(PRUint32* textRangeListLengthResult, nsTextRangeArray* textRangeListResult);
1998-04-13 20:24:54 +00:00
protected:
1998-05-29 22:44:13 +00:00
static nsWindow* gCurrentWindow;
nsPoint mLastPoint;
1998-04-13 20:24:54 +00:00
HWND mWnd;
HWND mTooltip;
1998-04-13 20:24:54 +00:00
HPALETTE mPalette;
WNDPROC mPrevWndProc;
1999-06-08 06:07:51 +00:00
PRBool mHas3DBorder;
1998-04-13 20:24:54 +00:00
HBRUSH mBrush;
PRBool mIsShiftDown;
PRBool mIsControlDown;
PRBool mIsAltDown;
PRBool mIsDestroying;
PRBool mOnDestroyCalled;
PRBool mIsVisible;
// XXX Temporary, should not be caching the font
nsFont * mFont;
PRInt32 mPreferredWidth;
PRInt32 mPreferredHeight;
nsIMenuBar * mMenuBar;
PRInt32 mMenuCmdId;
nsIMenu * mHitMenu;
nsVoidArray * mHitSubMenus;
1999-02-17 14:30:47 +00:00
// For Input Method Support
DWORD mIMEProperty;
PRBool mIMEIsComposing;
char* mIMECompositionString;
PRUnichar* mIMECompositionUniString;
PRInt32 mIMECompositionUniStringSize;
PRInt32 mIMECompositionStringLength;
PRInt32 mIMECompositionStringSize;
char* mIMEAttributeString;
PRInt32 mIMEAttributeStringLength;
PRInt32 mIMEAttributeStringSize;
char* mIMECompClauseString;
PRInt32 mIMECompClauseStringLength;
PRInt32 mIMECompClauseStringSize;
#if 1
BOOL mHaveDBCSLeadByte;
unsigned char mDBCSLeadByte;
#endif
// Drag & Drop
nsNativeDragTarget * mNativeDragTarget;
1998-04-13 20:24:54 +00:00
// Enumeration of the methods which are accessable on the "main GUI thread"
// via the CallMethod(...) mechanism...
// see nsSwitchToUIThread
enum {
CREATE = 0x0101,
CREATE_NATIVE,
DESTROY,
SET_FOCUS,
SET_CURSOR,
CREATE_HACK
};
static BOOL sIsRegistered;
HDWP mDeferredPositioner;
1998-04-13 20:24:54 +00:00
};
//
// A child window is a window with different style
//
class ChildWindow : public nsWindow {
public:
ChildWindow(){}
PRBool DispatchMouseEvent(PRUint32 aEventType, nsPoint* aPoint = nsnull);
1998-04-13 20:24:54 +00:00
protected:
virtual DWORD WindowStyle();
virtual DWORD WindowExStyle() { return 0; }
};
1998-04-13 20:24:54 +00:00
#endif // Window_h__