blob: b914ef1a2ce74d41b312b07bb79f5792265d00c9 [file] [log] [blame]
/*
* Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
#ifndef AWT_COMPONENT_H
#define AWT_COMPONENT_H
#include "awtmsg.h"
#include "awt_Object.h"
#include "awt_Font.h"
#include "awt_Brush.h"
#include "awt_Pen.h"
#include "awt_Win32GraphicsDevice.h"
#include "GDIWindowSurfaceData.h"
#include "java_awt_Component.h"
#include "sun_awt_windows_WComponentPeer.h"
#include "java_awt_event_KeyEvent.h"
#include "java_awt_event_MouseEvent.h"
#include "java_awt_event_WindowEvent.h"
#include "java_awt_Dimension.h"
extern LPCTSTR szAwtComponentClassName;
static LPCTSTR DrawingStateProp = TEXT("SunAwtDrawingStateProp");
const UINT IGNORE_KEY = (UINT)-1;
const UINT MAX_ACP_STR_LEN = 7; // ANSI CP identifiers are no longer than this
#define LEFT_BUTTON 1
#define MIDDLE_BUTTON 2
#define RIGHT_BUTTON 4
#define DBL_CLICK 8
#define X1_BUTTON 16
#define X2_BUTTON 32
#ifndef MK_XBUTTON1
#define MK_XBUTTON1 0x0020
#endif
#ifndef MK_XBUTTON2
#define MK_XBUTTON2 0x0040
#endif
// combination of standard mouse button flags
const int ALL_MK_BUTTONS = MK_LBUTTON|MK_MBUTTON|MK_RBUTTON;
const int X_BUTTONS = MK_XBUTTON1|MK_XBUTTON2;
// Whether to check for embedded frame and adjust location
#define CHECK_EMBEDDED 0
#define DONT_CHECK_EMBEDDED 1
class AwtPopupMenu;
class AwtDropTarget;
/*
* Message routing codes
*/
enum MsgRouting {
mrPassAlong, /* pass along to next in chain */
mrDoDefault, /* skip right to underlying default behavior */
mrConsume, /* consume msg & terminate routing immediatly,
* don't pass anywhere
*/
};
/************************************************************************
* AwtComponent class
*/
class AwtComponent : public AwtObject {
public:
/* java.awt.Component fields and method IDs */
static jfieldID peerID;
static jfieldID xID;
static jfieldID yID;
static jfieldID widthID;
static jfieldID heightID;
static jfieldID visibleID;
static jfieldID backgroundID;
static jfieldID foregroundID;
static jfieldID enabledID;
static jfieldID parentID;
static jfieldID cursorID;
static jfieldID graphicsConfigID;
static jfieldID peerGCID;
static jfieldID focusableID;
static jfieldID appContextID;
static jfieldID hwndID;
static jmethodID getFontMID;
static jmethodID getToolkitMID;
static jmethodID isEnabledMID;
static jmethodID getLocationOnScreenMID;
static jmethodID replaceSurfaceDataMID;
static jmethodID replaceSurfaceDataLaterMID;
static jmethodID disposeLaterMID;
static const UINT WmAwtIsComponent;
static jint * masks; //InputEvent mask array
AwtComponent();
virtual ~AwtComponent();
/*
* Dynamic class registration & creation
*/
virtual LPCTSTR GetClassName() = 0;
/*
* Fix for 4964237: Win XP: Changing theme changes java dialogs title icon
* WNDCLASS structure has been superseded by the WNDCLASSEX in Win32
*/
virtual void FillClassInfo(WNDCLASSEX *lpwc);
virtual void RegisterClass();
virtual void UnregisterClass();
virtual void CreateHWnd(JNIEnv *env, LPCWSTR title,
DWORD windowStyle, DWORD windowExStyle,
int x, int y, int w, int h,
HWND hWndParent, HMENU hMenu,
COLORREF colorForeground, COLORREF colorBackground,
jobject peer);
virtual void DestroyHWnd();
void InitPeerGraphicsConfig(JNIEnv *env, jobject peer);
virtual void Dispose();
void UpdateBackground(JNIEnv *env, jobject target);
virtual void SubclassHWND();
virtual void UnsubclassHWND();
static LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam);
/*
* Access to the various objects of this aggregate component
*/
INLINE HWND GetHWnd() { return m_hwnd; }
INLINE void SetHWnd(HWND hwnd) { m_hwnd = hwnd; }
static AwtComponent* GetComponent(HWND hWnd);
/*
* Access to the properties of the component
*/
INLINE COLORREF GetColor() { return m_colorForeground; }
virtual void SetColor(COLORREF c);
HPEN GetForegroundPen();
COLORREF GetBackgroundColor();
virtual void SetBackgroundColor(COLORREF c);
HBRUSH GetBackgroundBrush();
INLINE BOOL IsBackgroundColorSet() { return m_backgroundColorSet; }
virtual void SetFont(AwtFont *pFont);
INLINE void SetText(LPCTSTR text) { ::SetWindowText(GetHWnd(), text); }
INLINE int GetText(LPTSTR buffer, int size) {
return ::GetWindowText(GetHWnd(), buffer, size);
}
INLINE int GetTextLength() { return ::GetWindowTextLength(GetHWnd()); }
virtual void GetInsets(RECT* rect) {
VERIFY(::SetRectEmpty(rect));
}
BOOL IsVisible() { return m_visible;};
HDC GetDCFromComponent();
/*
* Enable/disable component
*/
virtual void Enable(BOOL bEnable);
/*
* Validate and call handleExpose on rects of UpdateRgn
*/
void PaintUpdateRgn(const RECT *insets);
static HWND GetTopLevelParentForWindow(HWND hwndDescendant);
static jobject FindHeavyweightUnderCursor(BOOL useCache);
/*
* Returns the parent component. If no parent window, or the
* parent window isn't an AwtComponent, returns NULL.
*/
AwtComponent* GetParent();
/* Get the component's immediate container. Note: may return NULL while
the component is being reparented in full-screen mode by Direct3D */
class AwtWindow* GetContainer();
/* Is a component a container? Used by above method */
virtual BOOL IsContainer() { return FALSE;} // Plain components can't
/**
* Returns TRUE if this message will trigger native focus change, FALSE otherwise.
*/
virtual BOOL IsFocusingKeyMessage(MSG *pMsg);
virtual BOOL IsFocusingMouseMessage(MSG *pMsg);
BOOL IsFocusable();
/*
* Returns an increasing unsigned value used for child control IDs.
* There is no attempt to reclaim command ID's.
*/
INLINE UINT CreateControlID() { return m_nextControlID++; }
// returns the current keyboard layout
INLINE static HKL GetKeyboardLayout() {
return m_hkl;
}
// returns the current code page that should be used in
// all MultiByteToWideChar and WideCharToMultiByte calls.
// This code page should also be use in IsDBCSLeadByteEx.
INLINE static UINT GetCodePage()
{
return m_CodePage;
}
// Added by waleed for BIDI Support
// returns the right to left status
INLINE static BOOL GetRTLReadingOrder() {
return sm_rtlReadingOrder;
}
// returns the right to left status
INLINE static BOOL GetRTL() {
return sm_rtl;
}
// returns the current sub language
INLINE static LANGID GetSubLanguage() {
return SUBLANGID(m_idLang);
}
// end waleed
// returns the current input language
INLINE static LANGID GetInputLanguage()
{
return m_idLang;
}
// Convert Language ID to CodePage
static UINT LangToCodePage(LANGID idLang);
/*
* methods on this component
*/
virtual void Show();
virtual void Hide();
virtual void Reshape(int x, int y, int w, int h);
/*
* Fix for 4046446.
* Component size/position helper, for the values above the short int limit.
*/
static BOOL SetWindowPos(HWND wnd, HWND after,
int x, int y, int w, int h, UINT flags);
/*
* Sets the scrollbar values. 'bar' can be either SB_VERT or
* SB_HORZ. 'min', 'value', and 'max' can have the value INT_MAX
* which means that the value should not be changed.
*/
void SetScrollValues(UINT bar, int min, int value, int max);
INLINE LRESULT SendMessage(UINT msg, WPARAM wParam=0, LPARAM lParam=0) {
DASSERT(GetHWnd());
return ::SendMessage(GetHWnd(), msg, wParam, lParam);
}
void PostUngrabEvent();
INLINE virtual LONG GetStyle() {
DASSERT(GetHWnd());
return ::GetWindowLong(GetHWnd(), GWL_STYLE);
}
INLINE virtual void SetStyle(LONG style) {
DASSERT(GetHWnd());
// SetWindowLong() error handling as recommended by Win32 API doc.
::SetLastError(0);
DWORD ret = ::SetWindowLong(GetHWnd(), GWL_STYLE, style);
DASSERT(ret != 0 || ::GetLastError() == 0);
}
INLINE virtual LONG GetStyleEx() {
DASSERT(GetHWnd());
return ::GetWindowLong(GetHWnd(), GWL_EXSTYLE);
}
INLINE virtual void SetStyleEx(LONG style) {
DASSERT(GetHWnd());
// SetWindowLong() error handling as recommended by Win32 API doc.
::SetLastError(0);
DWORD ret = ::SetWindowLong(GetHWnd(), GWL_EXSTYLE, style);
DASSERT(ret != 0 || ::GetLastError() == 0);
}
virtual BOOL NeedDblClick() { return FALSE; }
/* for multifont component */
static void DrawWindowText(HDC hDC, jobject font, jstring text,
int x, int y);
static void DrawGrayText(HDC hDC, jobject font, jstring text,
int x, int y);
void DrawListItem(JNIEnv *env, DRAWITEMSTRUCT &drawInfo);
void MeasureListItem(JNIEnv *env, MEASUREITEMSTRUCT &measureInfo);
jstring GetItemString(JNIEnv *env, jobject target, jint index);
jint GetFontHeight(JNIEnv *env);
virtual jobject PreferredItemSize(JNIEnv *env) {DASSERT(FALSE); return NULL; }
INLINE BOOL isEnabled() {
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
if (env->EnsureLocalCapacity(2) < 0) {
return NULL;
}
jobject self = GetPeer(env);
jobject target = env->GetObjectField(self, AwtObject::targetID);
BOOL e = env->CallBooleanMethod(target, AwtComponent::isEnabledMID);
DASSERT(!safe_ExceptionOccurred(env));
env->DeleteLocalRef(target);
return e;
}
INLINE BOOL isRecursivelyEnabled() {
AwtComponent* p = this;
do {
if (!p->isEnabled()) {
return FALSE;
}
} while (!p->IsTopLevel() &&
(p = p->GetParent()) != NULL);
return TRUE;
}
void SendKeyEventToFocusOwner(jint id, jlong when, jint raw, jint cooked,
jint modifiers, jint keyLocation, jlong nativeCode,
MSG *msg = NULL);
/*
* Allocate and initialize a new java.awt.event.KeyEvent, and
* post it to the peer's target object. No response is expected
* from the target.
*/
void SendKeyEvent(jint id, jlong when, jint raw, jint cooked,
jint modifiers, jint keyLocation, jlong nativeCode,
MSG *msg = NULL);
/*
* Allocate and initialize a new java.awt.event.MouseEvent, and
* post it to the peer's target object. No response is expected
* from the target.
*/
void SendMouseEvent(jint id, jlong when, jint x, jint y,
jint modifiers, jint clickCount,
jboolean popupTrigger, jint button = 0,
MSG *msg = NULL);
/*
* Allocate and initialize a new java.awt.event.MouseWheelEvent, and
* post it to the peer's target object. No response is expected
* from the target.
*/
void SendMouseWheelEvent(jint id, jlong when, jint x, jint y,
jint modifiers, jint clickCount,
jboolean popupTrigger, jint scrollType,
jint scrollAmount, jint wheelRotation,
jdouble preciseWheelRotation, MSG *msg = NULL);
/*
* Allocate and initialize a new java.awt.event.FocusEvent, and
* post it to the peer's target object. No response is expected
* from the target.
*/
void SendFocusEvent(jint id, HWND opposite);
/* Forward a filtered event directly to the subclassed window.
synthetic should be TRUE iff the message was generated because
of a synthetic Java event, rather than a native event. */
virtual MsgRouting HandleEvent(MSG *msg, BOOL synthetic);
/* Post a WM_AWT_HANDLE_EVENT message which invokes HandleEvent
on the toolkit thread. This method may pre-filter the messages. */
virtual BOOL PostHandleEventMessage(MSG *msg, BOOL synthetic);
/* Event->message synthesizer methods. */
void SynthesizeKeyMessage(JNIEnv *env, jobject keyEvent);
void SynthesizeMouseMessage(JNIEnv *env, jobject mouseEvent);
/* Components which inherit native mouse wheel behavior will
* return TRUE. These are TextArea, Choice, FileDialog, and
* List. All other Components return FALSE.
*/
virtual BOOL InheritsNativeMouseWheelBehavior();
/* Determines whether the component is obscured by another window */
// Called on Toolkit thread
static jboolean _IsObscured(void *param);
/* Invalidate the specified rectangle. */
virtual void Invalidate(RECT* r);
/* Begin and end deferred window positioning. */
virtual void BeginValidate();
virtual void EndValidate();
/* Keyboard conversion routines. */
static void InitDynamicKeyMapTable();
static void BuildDynamicKeyMapTable();
static jint GetJavaModifiers();
static jint GetButton(int mouseButton);
static UINT GetButtonMK(int mouseButton);
static UINT WindowsKeyToJavaKey(UINT windowsKey, UINT modifiers, UINT character, BOOL isDeadKey);
static void JavaKeyToWindowsKey(UINT javaKey, UINT *windowsKey, UINT *modifiers, UINT originalWindowsKey);
static void UpdateDynPrimaryKeymap(UINT wkey, UINT jkeyLegacy, jint keyLocation, UINT modifiers);
INLINE static void AwtComponent::JavaKeyToWindowsKey(UINT javaKey,
UINT *windowsKey, UINT *modifiers)
{
JavaKeyToWindowsKey(javaKey, windowsKey, modifiers, IGNORE_KEY);
}
enum TransOps {NONE, LOAD, SAVE};
UINT WindowsKeyToJavaChar(UINT wkey, UINT modifiers, TransOps ops, BOOL &isDeadKey);
/* routines used for input method support */
void SetInputMethod(jobject im, BOOL useNativeCompWindow);
void SendInputMethodEvent(jint id, jstring text, int cClause,
int *rgClauseBoundary, jstring *rgClauseReading,
int cAttrBlock, int *rgAttrBoundary,
BYTE *rgAttrValue, int commitedTextLength,
int caretPos, int visiblePos);
void InquireCandidatePosition();
INLINE LPARAM GetCandidateType() { return m_bitsCandType; }
HWND ImmGetHWnd();
HIMC ImmAssociateContext(HIMC himc);
HWND GetProxyFocusOwner();
INLINE HWND GetProxyToplevelContainer() {
HWND proxyHWnd = GetProxyFocusOwner();
return ::GetAncestor(proxyHWnd, GA_ROOT); // a browser in case of EmbeddedFrame
}
void CallProxyDefWindowProc(UINT message,
WPARAM wParam,
LPARAM lParam,
LRESULT &retVal,
MsgRouting &mr);
/*
* Windows message handler functions
*/
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
virtual LRESULT DefWindowProc(UINT msg, WPARAM wParam, LPARAM lParam);
/* return true if msg is processed */
virtual MsgRouting PreProcessMsg(MSG& msg);
virtual MsgRouting WmCreate() {return mrDoDefault;}
virtual MsgRouting WmClose() {return mrDoDefault;}
virtual MsgRouting WmDestroy();
virtual MsgRouting WmNcDestroy();
virtual MsgRouting WmActivate(UINT nState, BOOL fMinimized, HWND opposite)
{
return mrDoDefault;
}
virtual MsgRouting WmEraseBkgnd(HDC hDC, BOOL& didErase)
{
return mrDoDefault;
}
virtual MsgRouting WmPaint(HDC hDC);
virtual MsgRouting WmGetMinMaxInfo(LPMINMAXINFO lpmmi);
virtual MsgRouting WmMove(int x, int y);
virtual MsgRouting WmSize(UINT type, int w, int h);
virtual MsgRouting WmSizing();
virtual MsgRouting WmShowWindow(BOOL show, UINT status);
virtual MsgRouting WmSetFocus(HWND hWndLost);
virtual MsgRouting WmKillFocus(HWND hWndGot);
virtual MsgRouting WmCtlColor(HDC hDC, HWND hCtrl,
UINT ctlColor, HBRUSH& retBrush);
virtual MsgRouting WmHScroll(UINT scrollCode, UINT pos, HWND hScrollBar);
virtual MsgRouting WmVScroll(UINT scrollCode, UINT pos, HWND hScrollBar);
virtual MsgRouting WmMouseEnter(UINT flags, int x, int y);
virtual MsgRouting WmMouseDown(UINT flags, int x, int y, int button);
virtual MsgRouting WmMouseUp(UINT flags, int x, int y, int button);
virtual MsgRouting WmMouseMove(UINT flags, int x, int y);
virtual MsgRouting WmMouseExit(UINT flags, int x, int y);
virtual MsgRouting WmMouseWheel(UINT flags, int x, int y,
int wheelRotation);
virtual MsgRouting WmNcMouseDown(WPARAM hitTest, int x, int y, int button);
virtual MsgRouting WmNcMouseUp(WPARAM hitTest, int x, int y, int button);
virtual MsgRouting WmWindowPosChanging(LPARAM windowPos);
virtual MsgRouting WmWindowPosChanged(LPARAM windowPos);
// NB: 64-bit: vkey is wParam of the message, but other API's take
// vkey parameters of type UINT, so we do the cast before dispatching.
virtual MsgRouting WmKeyDown(UINT vkey, UINT repCnt, UINT flags, BOOL system);
virtual MsgRouting WmKeyUp(UINT vkey, UINT repCnt, UINT flags, BOOL system);
virtual MsgRouting WmChar(UINT character, UINT repCnt, UINT flags, BOOL system);
virtual MsgRouting WmIMEChar(UINT character, UINT repCnt, UINT flags, BOOL system);
virtual MsgRouting WmInputLangChange(UINT charset, HKL hKeyBoardLayout);
virtual MsgRouting WmForwardChar(WCHAR character, LPARAM lParam,
BOOL synthethic);
virtual MsgRouting WmPaste();
virtual void SetCompositionWindow(RECT &r);
virtual void OpenCandidateWindow(int x, int y);
virtual void SetCandidateWindow(int iCandType, int x, int y);
virtual MsgRouting WmImeSetContext(BOOL fSet, LPARAM *lplParam);
virtual MsgRouting WmImeNotify(WPARAM subMsg, LPARAM bitsCandType);
virtual MsgRouting WmImeStartComposition();
virtual MsgRouting WmImeEndComposition();
virtual MsgRouting WmImeComposition(WORD wChar, LPARAM flags);
virtual MsgRouting WmTimer(UINT_PTR timerID) {return mrDoDefault;}
virtual MsgRouting WmCommand(UINT id, HWND hWndCtrl, UINT notifyCode);
/* reflected WmCommand from parent */
virtual MsgRouting WmNotify(UINT notifyCode);
virtual MsgRouting WmCompareItem(UINT /*ctrlId*/,
COMPAREITEMSTRUCT &compareInfo,
LRESULT &result);
virtual MsgRouting WmDeleteItem(UINT /*ctrlId*/,
DELETEITEMSTRUCT &deleteInfo);
virtual MsgRouting WmDrawItem(UINT ctrlId,
DRAWITEMSTRUCT &drawInfo);
virtual MsgRouting WmMeasureItem(UINT ctrlId,
MEASUREITEMSTRUCT &measureInfo);
/* Fix 4181790 & 4223341 : These functions get overridden in owner-drawn
* components instead of the Wm... versions.
*/
virtual MsgRouting OwnerDrawItem(UINT ctrlId,
DRAWITEMSTRUCT &drawInfo);
virtual MsgRouting OwnerMeasureItem(UINT ctrlId,
MEASUREITEMSTRUCT &measureInfo);
virtual MsgRouting WmPrint(HDC hDC, LPARAM flags);
virtual MsgRouting WmPrintClient(HDC hDC, LPARAM flags);
virtual MsgRouting WmNcCalcSize(BOOL fCalcValidRects,
LPNCCALCSIZE_PARAMS lpncsp,
LRESULT &retVal);
virtual MsgRouting WmNcPaint(HRGN hrgn);
virtual MsgRouting WmNcHitTest(UINT x, UINT y, LRESULT &retVal);
virtual MsgRouting WmSysCommand(UINT uCmdType, int xPos, int yPos);
virtual MsgRouting WmExitSizeMove();
virtual MsgRouting WmEnterMenuLoop(BOOL isTrackPopupMenu);
virtual MsgRouting WmExitMenuLoop(BOOL isTrackPopupMenu);
virtual MsgRouting WmQueryNewPalette(LRESULT &retVal);
virtual MsgRouting WmPaletteChanged(HWND hwndPalChg);
virtual MsgRouting WmPaletteIsChanging(HWND hwndPalChg);
virtual MsgRouting WmStyleChanged(int wStyleType, LPSTYLESTRUCT lpss);
virtual MsgRouting WmSettingChange(UINT wFlag, LPCTSTR pszSection);
virtual MsgRouting WmContextMenu(HWND hCtrl, UINT xPos, UINT yPos) {
return mrDoDefault;
}
void UpdateColorModel();
jintArray CreatePrintedPixels(SIZE &loc, SIZE &size, int alpha);
/*
* HWND, AwtComponent and Java Peer interaction
*
* Link the C++, Java peer, and HWNDs together.
*/
void LinkObjects(JNIEnv *env, jobject peer);
void UnlinkObjects();
static BOOL QueryNewPaletteCalled() { return m_QueryNewPaletteCalled; }
#ifdef DEBUG
virtual void VerifyState(); /* verify component and peer are in sync. */
#else
void VerifyState() {} /* no-op */
#endif
virtual AwtDropTarget* CreateDropTarget(JNIEnv* env);
virtual void DestroyDropTarget();
INLINE virtual HWND GetDBCSEditHandle() { return NULL; }
// State for native drawing API
INLINE jint GetDrawState() { return GetDrawState(m_hwnd); }
INLINE void SetDrawState(jint state) { SetDrawState(m_hwnd, state); } // State for native drawing API
INLINE virtual BOOL IsTopLevel() { return FALSE; }
INLINE virtual BOOL IsEmbeddedFrame() { return FALSE; }
INLINE virtual BOOL IsScrollbar() { return FALSE; }
static INLINE BOOL IsTopLevelHWnd(HWND hwnd) {
AwtComponent *comp = AwtComponent::GetComponent(hwnd);
return (comp != NULL && comp->IsTopLevel());
}
static INLINE BOOL IsEmbeddedFrameHWnd(HWND hwnd) {
AwtComponent *comp = AwtComponent::GetComponent(hwnd);
return (comp != NULL && comp->IsEmbeddedFrame());
}
static jint GetDrawState(HWND hwnd);
static void SetDrawState(HWND hwnd, jint state);
static HWND GetHWnd(JNIEnv* env, jobject target);
static MSG* CreateMessage(UINT message, WPARAM wParam, LPARAM lParam, int x, int y);
static void InitMessage(MSG* msg, UINT message, WPARAM wParam, LPARAM lParam, int x, int y);
// Some methods to be called on Toolkit thread via Toolkit.InvokeFunction()
static void _Show(void *param);
static void _Hide(void *param);
static void _Enable(void *param);
static void _Disable(void *param);
static jobject _GetLocationOnScreen(void *param);
static void _Reshape(void *param);
static void _ReshapeNoCheck(void *param);
static void _NativeHandleEvent(void *param);
static void _SetForeground(void *param);
static void _SetBackground(void *param);
static void _SetFont(void *param);
static void _Start(void *param);
static void _BeginValidate(void *param);
static void _EndValidate(void *param);
static void _UpdateWindow(void *param);
static jlong _AddNativeDropTarget(void *param);
static void _RemoveNativeDropTarget(void *param);
static jintArray _CreatePrintedPixels(void *param);
static jboolean _NativeHandlesWheelScrolling(void *param);
static void _SetRectangularShape(void *param);
static void _SetZOrder(void *param);
static HWND sm_focusOwner;
private:
static HWND sm_focusedWindow;
public:
static inline HWND GetFocusedWindow() { return sm_focusedWindow; }
static void SetFocusedWindow(HWND window);
static void _SetFocus(void *param);
static void *SetNativeFocusOwner(void *self);
static void *GetNativeFocusedWindow();
static void *GetNativeFocusOwner();
static BOOL sm_inSynthesizeFocus;
// Execute on Toolkit only.
INLINE static LRESULT SynthesizeWmSetFocus(HWND targetHWnd, HWND oppositeHWnd) {
sm_inSynthesizeFocus = TRUE;
LRESULT res = ::SendMessage(targetHWnd, WM_SETFOCUS, (WPARAM)oppositeHWnd, 0);
sm_inSynthesizeFocus = FALSE;
return res;
}
// Execute on Toolkit only.
INLINE static LRESULT SynthesizeWmKillFocus(HWND targetHWnd, HWND oppositeHWnd) {
sm_inSynthesizeFocus = TRUE;
LRESULT res = ::SendMessage(targetHWnd, WM_KILLFOCUS, (WPARAM)oppositeHWnd, 0);
sm_inSynthesizeFocus = FALSE;
return res;
}
static BOOL sm_bMenuLoop;
static INLINE BOOL isMenuLoopActive() {
return sm_bMenuLoop;
}
// when this component is being destroyed, this method is called
// to find out if there are any messages being processed, and if
// there are some then disposal of this component is postponed
virtual BOOL CanBeDeleted() {
return m_MessagesProcessing == 0;
}
BOOL IsDestroyPaused() const {
return m_bPauseDestroy;
}
protected:
static AwtComponent* GetComponentImpl(HWND hWnd);
static int GetClickCount();
HWND m_hwnd;
UINT m_myControlID; /* its own ID from the view point of parent */
BOOL m_backgroundColorSet;
BOOL m_visible; /* copy of Component.visible */
static BOOL sm_suppressFocusAndActivation;
static BOOL sm_restoreFocusAndActivation;
/*
* The function sets the focus-restore flag ON/OFF.
* When the flag is ON, focus is restored immidiately after the proxy loses it.
* All focus messages are suppressed. It's also assumed that sm_focusedWindow and
* sm_focusOwner don't change after the flag is set ON and before it's set OFF.
*/
static INLINE void SetRestoreFocus(BOOL doSet) {
sm_suppressFocusAndActivation = doSet;
sm_restoreFocusAndActivation = doSet;
}
virtual void SetDragCapture(UINT flags);
virtual void ReleaseDragCapture(UINT flags);
virtual void FillBackground(HDC hMemoryDC, SIZE &size);
virtual void FillAlpha(void *bitmapBits, SIZE &size, BYTE alpha);
private:
/* A bitmask keeps the button's numbers as MK_LBUTTON, MK_MBUTTON, MK_RBUTTON
* which are allowed to
* generate the CLICK event after the RELEASE has happened.
* There are conditions that must be true for that sending CLICK event:
* 1) button was initially PRESSED
* 2) no movement or drag has happened until RELEASE
*/
UINT m_mouseButtonClickAllowed;
BOOL m_bSubclassed;
BOOL m_bPauseDestroy;
COLORREF m_colorForeground;
COLORREF m_colorBackground;
AwtPen* m_penForeground;
AwtBrush* m_brushBackground;
WNDPROC m_DefWindowProc;
// counter for messages being processed by this component
UINT m_MessagesProcessing;
// provides a unique ID for child controls
UINT m_nextControlID;
// DeferWindowPos handle for batched-up window positioning
HDWP m_hdwp;
// Counter to handle nested calls to Begin/EndValidate
UINT m_validationNestCount;
AwtDropTarget* m_dropTarget; // associated DropTarget object
// When we process WM_INPUTLANGCHANGE we remember the keyboard
// layout handle and associated input language and codepage.
// We also invalidate VK translation table for VK_OEM_* codes
static HKL m_hkl;
static UINT m_CodePage;
static LANGID m_idLang;
static BOOL sm_rtl;
static BOOL sm_rtlReadingOrder;
static BOOL sm_PrimaryDynamicTableBuilt;
jobject m_InputMethod;
BOOL m_useNativeCompWindow;
LPARAM m_bitsCandType;
UINT m_PendingLeadByte;
void SetComponentInHWND();
// Determines whether a given virtual key is on the numpad
static BOOL IsNumPadKey(UINT vkey, BOOL extended);
// Determines the keyLocation of a given key
static jint GetKeyLocation(UINT wkey, UINT flags);
static jint GetShiftKeyLocation(UINT wkey, UINT flags);
// Cache for FindComponent
static HWND sm_cursorOn;
static BOOL m_QueryNewPaletteCalled;
static AwtComponent* sm_getComponentCache; // a cache for the GetComponent(..) method.
int windowMoveLockPosX;
int windowMoveLockPosY;
int windowMoveLockPosCX;
int windowMoveLockPosCY;
// 6524352: support finer-resolution
int m_wheelRotationAmount;
/*
* The association list of children's IDs and corresponding components.
* Some components like Choice or List are required their sizes while
* the creations of themselfs are in progress.
*/
class ChildListItem {
public:
ChildListItem(UINT id, AwtComponent* component) {
m_ID = id;
m_Component = component;
m_next = NULL;
}
~ChildListItem() {
if (m_next != NULL)
delete m_next;
}
UINT m_ID;
AwtComponent* m_Component;
ChildListItem* m_next;
};
public:
INLINE void PushChild(UINT id, AwtComponent* component) {
ChildListItem* child = new ChildListItem(id, component);
child->m_next = m_childList;
m_childList = child;
}
static void SetParent(void * param);
private:
AwtComponent* SearchChild(UINT id);
void RemoveChild(UINT id) ;
static BOOL IsNavigationKey(UINT wkey);
static void BuildPrimaryDynamicTable();
ChildListItem* m_childList;
HCURSOR m_hCursorCache; // the latest cursor which has been active within the heavyweight component
public:
inline void setCursorCache(HCURSOR hCursor) {
m_hCursorCache = hCursor;
}
inline HCURSOR getCursorCache() {
return m_hCursorCache;
}
};
class CounterHelper {
private:
UINT *m_counter;
public:
explicit CounterHelper(UINT *counter) {
m_counter = counter;
(*m_counter)++;
}
~CounterHelper() {
(*m_counter)--;
m_counter = NULL;
}
};
// DC management objects; these classes are used to track the list of
// DC's associated with a given Component. Then DC's can be released
// appropriately on demand or on window destruction to avoid resource
// leakage.
class DCItem {
public:
HDC hDC;
HWND hWnd;
DCItem *next;
};
class DCList {
DCItem *head;
CriticalSection listLock;
public:
DCList() { head = NULL; }
void AddDC(HDC hDC, HWND hWnd);
void AddDCItem(DCItem *newItem);
DCItem *RemoveDC(HDC hDC, HWND hWnd);
DCItem *RemoveAllDCs(HWND hWnd);
void RealizePalettes(int screen);
};
void ReleaseDCList(HWND hwnd, DCList &list);
void MoveDCToPassiveList(HDC hDC, HWND hWnd);
namespace TimeHelper{
jlong getMessageTimeUTC();
jlong windowsToUTC(DWORD event_offset);
}
#include "ObjectList.h"
#endif /* AWT_COMPONENT_H */