1 /*
   2  * Copyright (c) 1996, 2020, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 #ifndef AWT_COMPONENT_H
  27 #define AWT_COMPONENT_H
  28 
  29 #include "awtmsg.h"
  30 #include "awt_Object.h"
  31 #include "awt_Font.h"
  32 #include "awt_Brush.h"
  33 #include "awt_Pen.h"
  34 #include "awt_Win32GraphicsDevice.h"
  35 #include "GDIWindowSurfaceData.h"
  36 
  37 #include "java_awt_Component.h"
  38 #include "sun_awt_windows_WComponentPeer.h"
  39 #include "java_awt_event_KeyEvent.h"
  40 #include "java_awt_event_MouseEvent.h"
  41 #include "java_awt_event_WindowEvent.h"
  42 #include "java_awt_Dimension.h"
  43 
  44 extern LPCTSTR szAwtComponentClassName;
  45 
  46 static LPCTSTR DrawingStateProp = TEXT("SunAwtDrawingStateProp");
  47 
  48 const UINT IGNORE_KEY = (UINT)-1;
  49 const UINT MAX_ACP_STR_LEN = 7; // ANSI CP identifiers are no longer than this
  50 
  51 #define LEFT_BUTTON 1
  52 #define MIDDLE_BUTTON 2
  53 #define RIGHT_BUTTON 4
  54 #define DBL_CLICK 8
  55 #define X1_BUTTON 16
  56 #define X2_BUTTON 32
  57 
  58 #ifndef MK_XBUTTON1
  59 #define MK_XBUTTON1         0x0020
  60 #endif
  61 
  62 #ifndef MK_XBUTTON2
  63 #define MK_XBUTTON2         0x0040
  64 #endif
  65 
  66 // combination of standard mouse button flags
  67 const int ALL_MK_BUTTONS = MK_LBUTTON|MK_MBUTTON|MK_RBUTTON;
  68 const int X_BUTTONS = MK_XBUTTON1|MK_XBUTTON2;
  69 
  70 // The allowable difference between coordinates of the WM_TOUCH event and the
  71 // corresponding WM_LBUTTONDOWN/WM_LBUTTONUP event letting to associate these
  72 // events, when their coordinates are slightly different.
  73 const int TOUCH_MOUSE_COORDS_DELTA = 10;
  74 
  75 // Whether to check for embedded frame and adjust location
  76 #define CHECK_EMBEDDED 0
  77 #define DONT_CHECK_EMBEDDED 1
  78 
  79 class AwtPopupMenu;
  80 
  81 class AwtDropTarget;
  82 
  83 /*
  84  * Message routing codes
  85  */
  86 enum MsgRouting {
  87     mrPassAlong,    /* pass along to next in chain */
  88     mrDoDefault,    /* skip right to underlying default behavior */
  89     mrConsume,      /* consume msg & terminate routing immediatly,
  90                      * don't pass anywhere
  91                      */
  92 };
  93 
  94 /************************************************************************
  95  * AwtComponent class
  96  */
  97 
  98 class AwtComponent : public AwtObject {
  99 public:
 100     /* java.awt.Component fields and method IDs */
 101     static jfieldID peerID;
 102     static jfieldID xID;
 103     static jfieldID yID;
 104     static jfieldID widthID;
 105     static jfieldID heightID;
 106     static jfieldID visibleID;
 107     static jfieldID backgroundID;
 108     static jfieldID foregroundID;
 109     static jfieldID enabledID;
 110     static jfieldID parentID;
 111     static jfieldID cursorID;
 112     static jfieldID graphicsConfigID;
 113     static jfieldID peerGCID;
 114     static jfieldID focusableID;
 115     static jfieldID appContextID;
 116     static jfieldID hwndID;
 117 
 118     static jmethodID getFontMID;
 119     static jmethodID getToolkitMID;
 120     static jmethodID isEnabledMID;
 121     static jmethodID getLocationOnScreenMID;
 122     static jmethodID replaceSurfaceDataMID;
 123     static jmethodID replaceSurfaceDataLaterMID;
 124     static jmethodID disposeLaterMID;
 125 
 126     static const UINT WmAwtIsComponent;
 127     static jint * masks; //InputEvent mask array
 128     AwtComponent();
 129     virtual ~AwtComponent();
 130 
 131     /*
 132      * Dynamic class registration & creation
 133      */
 134     virtual LPCTSTR GetClassName() = 0;
 135     /*
 136      * Fix for 4964237: Win XP: Changing theme changes java dialogs title icon
 137      * WNDCLASS structure has been superseded by the WNDCLASSEX in Win32
 138      */
 139     virtual void FillClassInfo(WNDCLASSEX *lpwc);
 140     virtual void RegisterClass();
 141     virtual void UnregisterClass();
 142 
 143     virtual void CreateHWnd(JNIEnv *env, LPCWSTR title,
 144                     DWORD windowStyle, DWORD windowExStyle,
 145                     int x, int y, int w, int h,
 146                     HWND hWndParent, HMENU hMenu,
 147                     COLORREF colorForeground, COLORREF colorBackground,
 148                     jobject peer);
 149     virtual void DestroyHWnd();
 150     void InitPeerGraphicsConfig(JNIEnv *env, jobject peer);
 151 
 152     virtual void Dispose();
 153 
 154     void UpdateBackground(JNIEnv *env, jobject target);
 155 
 156     virtual void SubclassHWND();
 157     virtual void UnsubclassHWND();
 158 
 159     static LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
 160         WPARAM wParam, LPARAM lParam);
 161 
 162     /*
 163      * Access to the various objects of this aggregate component
 164      */
 165     INLINE HWND GetHWnd() { return m_hwnd; }
 166     INLINE void SetHWnd(HWND hwnd) { m_hwnd = hwnd; }
 167 
 168     static AwtComponent* GetComponent(HWND hWnd);
 169 
 170     /*
 171      * Access to the properties of the component
 172      */
 173     INLINE COLORREF GetColor() { return m_colorForeground; }
 174     virtual void SetColor(COLORREF c);
 175     HPEN GetForegroundPen();
 176 
 177     COLORREF GetBackgroundColor();
 178     virtual void SetBackgroundColor(COLORREF c);
 179     HBRUSH GetBackgroundBrush();
 180     INLINE BOOL IsBackgroundColorSet() { return m_backgroundColorSet; }
 181 
 182     virtual void SetFont(AwtFont *pFont);
 183 
 184     INLINE void SetText(LPCTSTR text) { ::SetWindowText(GetHWnd(), text); }
 185     INLINE int GetText(LPTSTR buffer, int size) {
 186         return ::GetWindowText(GetHWnd(), buffer, size);
 187     }
 188     INLINE int GetTextLength() { return ::GetWindowTextLength(GetHWnd()); }
 189 
 190     virtual void GetInsets(RECT* rect) {
 191         VERIFY(::SetRectEmpty(rect));
 192     }
 193 
 194     BOOL IsVisible() { return m_visible;};
 195 
 196     HDC GetDCFromComponent();
 197 
 198     /*
 199      * Enable/disable component
 200      */
 201     virtual void Enable(BOOL bEnable);
 202 
 203     /*
 204      * Validate and call handleExpose on rects of UpdateRgn
 205      */
 206     void PaintUpdateRgn(const RECT *insets);
 207 
 208     static HWND GetTopLevelParentForWindow(HWND hwndDescendant);
 209 
 210     static jobject FindHeavyweightUnderCursor(BOOL useCache);
 211 
 212     /*
 213      * Returns the parent component.  If no parent window, or the
 214      * parent window isn't an AwtComponent, returns NULL.
 215      */
 216     AwtComponent* GetParent();
 217 
 218     /* Get the component's immediate container. Note: may return NULL while
 219        the component is being reparented in full-screen mode by Direct3D */
 220     class AwtWindow* GetContainer();
 221 
 222     /* Is a component a container? Used by above method */
 223     virtual BOOL IsContainer() { return FALSE;} // Plain components can't
 224 
 225     /**
 226      * Returns TRUE if this message will trigger native focus change, FALSE otherwise.
 227      */
 228     virtual BOOL IsFocusingKeyMessage(MSG *pMsg);
 229     virtual BOOL IsFocusingMouseMessage(MSG *pMsg);
 230 
 231     BOOL IsFocusable();
 232 
 233     /*
 234      * Returns an increasing unsigned value used for child control IDs.
 235      * There is no attempt to reclaim command ID's.
 236      */
 237     INLINE UINT CreateControlID() { return m_nextControlID++; }
 238 
 239     // returns the current keyboard layout
 240     INLINE static HKL GetKeyboardLayout() {
 241         return m_hkl;
 242     }
 243 
 244     // returns the current code page that should be used in
 245     // all MultiByteToWideChar and WideCharToMultiByte calls.
 246     // This code page should also be use in IsDBCSLeadByteEx.
 247     INLINE static UINT GetCodePage()
 248     {
 249         return m_CodePage;
 250     }
 251 
 252 // Added by waleed for BIDI Support
 253     // returns the right to left status
 254     INLINE static BOOL GetRTLReadingOrder() {
 255         return sm_rtlReadingOrder;
 256     }
 257     // returns the right to left status
 258     INLINE static BOOL GetRTL() {
 259         return sm_rtl;
 260     }
 261     // returns the current sub language
 262     INLINE static LANGID GetSubLanguage() {
 263         return SUBLANGID(m_idLang);
 264     }
 265 // end waleed
 266 
 267     // returns the current input language
 268     INLINE static LANGID GetInputLanguage()
 269     {
 270         return m_idLang;
 271     }
 272     // Convert Language ID to CodePage
 273     static UINT LangToCodePage(LANGID idLang);
 274 
 275     /*
 276      * methods on this component
 277      */
 278     virtual int GetScreenImOn();
 279     virtual void Show();
 280     virtual void Hide();
 281     virtual void Reshape(int x, int y, int w, int h);
 282     void ReshapeNoScale(int x, int y, int w, int h);
 283 
 284     /*
 285      * Fix for 4046446.
 286      * Component size/position helper, for the values above the short int limit.
 287      */
 288     static BOOL SetWindowPos(HWND wnd, HWND after,
 289                              int x, int y, int w, int h, UINT flags);
 290 
 291     /*
 292      * Sets the scrollbar values.  'bar' can be either SB_VERT or
 293      * SB_HORZ.  'min', 'value', and 'max' can have the value INT_MAX
 294      * which means that the value should not be changed.
 295      */
 296     void SetScrollValues(UINT bar, int min, int value, int max);
 297 
 298     INLINE LRESULT SendMessage(UINT msg, WPARAM wParam=0, LPARAM lParam=0) {
 299         DASSERT(GetHWnd());
 300         return ::SendMessage(GetHWnd(), msg, wParam, lParam);
 301     }
 302 
 303     void PostUngrabEvent();
 304 
 305     INLINE virtual LONG GetStyle() {
 306         DASSERT(GetHWnd());
 307         return ::GetWindowLong(GetHWnd(), GWL_STYLE);
 308     }
 309     INLINE virtual void SetStyle(LONG style) {
 310         DASSERT(GetHWnd());
 311         // SetWindowLong() error handling as recommended by Win32 API doc.
 312         ::SetLastError(0);
 313         DWORD ret = ::SetWindowLong(GetHWnd(), GWL_STYLE, style);
 314         DASSERT(ret != 0 || ::GetLastError() == 0);
 315     }
 316     INLINE virtual LONG GetStyleEx() {
 317         DASSERT(GetHWnd());
 318         return ::GetWindowLong(GetHWnd(), GWL_EXSTYLE);
 319     }
 320     INLINE virtual void SetStyleEx(LONG style) {
 321         DASSERT(GetHWnd());
 322         // SetWindowLong() error handling as recommended by Win32 API doc.
 323         ::SetLastError(0);
 324         DWORD ret = ::SetWindowLong(GetHWnd(), GWL_EXSTYLE, style);
 325         DASSERT(ret != 0 || ::GetLastError() == 0);
 326     }
 327 
 328     virtual BOOL NeedDblClick() { return FALSE; }
 329 
 330     /* for multifont component */
 331     static void DrawWindowText(HDC hDC, jobject font, jstring text,
 332                                int x, int y);
 333     static void DrawGrayText(HDC hDC, jobject font, jstring text,
 334                              int x, int y);
 335 
 336     void DrawListItem(JNIEnv *env, DRAWITEMSTRUCT &drawInfo);
 337 
 338     void MeasureListItem(JNIEnv *env, MEASUREITEMSTRUCT &measureInfo);
 339 
 340     jstring GetItemString(JNIEnv *env, jobject target, jint index);
 341 
 342     jint GetFontHeight(JNIEnv *env);
 343 
 344     virtual jobject PreferredItemSize(JNIEnv *env) {DASSERT(FALSE); return NULL; }
 345 
 346     INLINE BOOL isEnabled() {
 347         JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
 348         if (env->EnsureLocalCapacity(2) < 0) {
 349             return NULL;
 350         }
 351         jobject self = GetPeer(env);
 352         jobject target = env->GetObjectField(self, AwtObject::targetID);
 353         BOOL e = env->CallBooleanMethod(target, AwtComponent::isEnabledMID);
 354         DASSERT(!safe_ExceptionOccurred(env));
 355 
 356         env->DeleteLocalRef(target);
 357 
 358         return e;
 359     }
 360 
 361     INLINE BOOL isRecursivelyEnabled() {
 362         AwtComponent* p = this;
 363         do {
 364             if (!p->isEnabled()) {
 365                 return FALSE;
 366             }
 367         } while (!p->IsTopLevel() &&
 368             (p = p->GetParent()) != NULL);
 369         return TRUE;
 370     }
 371 
 372     void SendKeyEventToFocusOwner(jint id, jlong when, jint raw, jint cooked,
 373                                   jint modifiers, jint keyLocation, jlong nativeCode,
 374                                   MSG *msg = NULL);
 375     /*
 376      * Allocate and initialize a new java.awt.event.KeyEvent, and
 377      * post it to the peer's target object.  No response is expected
 378      * from the target.
 379      */
 380     void SendKeyEvent(jint id, jlong when, jint raw, jint cooked,
 381                       jint modifiers, jint keyLocation, jlong nativeCode,
 382                       MSG *msg = NULL);
 383 
 384     /*
 385      * Allocate and initialize a new java.awt.event.MouseEvent, and
 386      * post it to the peer's target object.  No response is expected
 387      * from the target.
 388      */
 389     void SendMouseEvent(jint id, jlong when, jint x, jint y,
 390                         jint modifiers, jint clickCount,
 391                         jboolean popupTrigger, jint button = 0,
 392                         MSG *msg = NULL, BOOL causedByTouchEvent = FALSE);
 393 
 394     /*
 395      * Allocate and initialize a new java.awt.event.MouseWheelEvent, and
 396      * post it to the peer's target object.  No response is expected
 397      * from the target.
 398      */
 399     void SendMouseWheelEvent(jint id, jlong when, jint x, jint y,
 400                              jint modifiers, jint clickCount,
 401                              jboolean popupTrigger, jint scrollType,
 402                              jint scrollAmount, jint wheelRotation,
 403                              jdouble preciseWheelRotation, MSG *msg = NULL);
 404 
 405     /*
 406      * Allocate and initialize a new java.awt.event.FocusEvent, and
 407      * post it to the peer's target object.  No response is expected
 408      * from the target.
 409      */
 410     void SendFocusEvent(jint id, HWND opposite);
 411 
 412     /* Forward a filtered event directly to the subclassed window.
 413        synthetic should be TRUE iff the message was generated because
 414        of a synthetic Java event, rather than a native event. */
 415     virtual MsgRouting HandleEvent(MSG *msg, BOOL synthetic);
 416 
 417     /* Post a WM_AWT_HANDLE_EVENT message which invokes HandleEvent
 418        on the toolkit thread. This method may pre-filter the messages. */
 419     virtual BOOL PostHandleEventMessage(MSG *msg, BOOL synthetic);
 420 
 421     /* Event->message synthesizer methods. */
 422     void SynthesizeKeyMessage(JNIEnv *env, jobject keyEvent);
 423     void SynthesizeMouseMessage(JNIEnv *env, jobject mouseEvent);
 424 
 425     /* Components which inherit native mouse wheel behavior will
 426      * return TRUE.  These are TextArea, Choice, FileDialog, and
 427      * List.  All other Components return FALSE.
 428      */
 429     virtual BOOL InheritsNativeMouseWheelBehavior();
 430 
 431     /* Determines whether the component is obscured by another window */
 432     // Called on Toolkit thread
 433     static jboolean _IsObscured(void *param);
 434 
 435     /* Invalidate the specified rectangle. */
 436     virtual void Invalidate(RECT* r);
 437 
 438     /* Begin and end deferred window positioning. */
 439     virtual void BeginValidate();
 440     virtual void EndValidate();
 441 
 442     /* Keyboard conversion routines. */
 443     static void InitDynamicKeyMapTable();
 444     static void BuildDynamicKeyMapTable();
 445     static jint GetJavaModifiers();
 446     static jint GetActionModifiers();
 447     static jint GetButton(int mouseButton);
 448     static UINT GetButtonMK(int mouseButton);
 449     static UINT WindowsKeyToJavaKey(UINT windowsKey, UINT modifiers, UINT character, BOOL isDeadKey);
 450     static void JavaKeyToWindowsKey(UINT javaKey, UINT *windowsKey, UINT *modifiers, UINT originalWindowsKey);
 451     static void UpdateDynPrimaryKeymap(UINT wkey, UINT jkeyLegacy, jint keyLocation, UINT modifiers);
 452 
 453     INLINE static void JavaKeyToWindowsKey(UINT javaKey,
 454                                        UINT *windowsKey, UINT *modifiers)
 455     {
 456         JavaKeyToWindowsKey(javaKey, windowsKey, modifiers, IGNORE_KEY);
 457     }
 458 
 459     enum TransOps {NONE, LOAD, SAVE};
 460 
 461     UINT WindowsKeyToJavaChar(UINT wkey, UINT modifiers, TransOps ops, BOOL &isDeadKey);
 462 
 463     /* routines used for input method support */
 464     void SetInputMethod(jobject im, BOOL useNativeCompWindow);
 465     void SendInputMethodEvent(jint id, jstring text, int cClause,
 466                               int *rgClauseBoundary, jstring *rgClauseReading,
 467                               int cAttrBlock, int *rgAttrBoundary,
 468                               BYTE *rgAttrValue, int commitedTextLength,
 469                               int caretPos, int visiblePos);
 470     void InquireCandidatePosition();
 471     INLINE LPARAM GetCandidateType() { return m_bitsCandType; }
 472     HWND ImmGetHWnd();
 473     HIMC ImmAssociateContext(HIMC himc);
 474     HWND GetProxyFocusOwner();
 475 
 476     INLINE HWND GetProxyToplevelContainer() {
 477         HWND proxyHWnd = GetProxyFocusOwner();
 478         return ::GetAncestor(proxyHWnd, GA_ROOT); // a browser in case of EmbeddedFrame
 479     }
 480 
 481     void CallProxyDefWindowProc(UINT message,
 482                                 WPARAM wParam,
 483                                 LPARAM lParam,
 484                                 LRESULT &retVal,
 485                                 MsgRouting &mr);
 486 
 487     /*
 488      * Windows message handler functions
 489      */
 490     virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
 491     virtual LRESULT DefWindowProc(UINT msg, WPARAM wParam, LPARAM lParam);
 492 
 493     /* return true if msg is processed */
 494     virtual MsgRouting PreProcessMsg(MSG& msg);
 495 
 496     virtual MsgRouting WmCreate() {return mrDoDefault;}
 497     virtual MsgRouting WmClose() {return mrDoDefault;}
 498     virtual MsgRouting WmDestroy();
 499     virtual MsgRouting WmNcDestroy();
 500 
 501     virtual MsgRouting WmActivate(UINT nState, BOOL fMinimized, HWND opposite)
 502     {
 503         return mrDoDefault;
 504     }
 505 
 506     virtual MsgRouting WmEraseBkgnd(HDC hDC, BOOL& didErase)
 507     {
 508         return mrDoDefault;
 509     }
 510 
 511     virtual MsgRouting WmPaint(HDC hDC);
 512     virtual MsgRouting WmGetMinMaxInfo(LPMINMAXINFO lpmmi);
 513     virtual MsgRouting WmMove(int x, int y);
 514     virtual MsgRouting WmSize(UINT type, int w, int h);
 515     virtual MsgRouting WmSizing();
 516     virtual MsgRouting WmShowWindow(BOOL show, UINT status);
 517     virtual MsgRouting WmSetFocus(HWND hWndLost);
 518     virtual MsgRouting WmKillFocus(HWND hWndGot);
 519     virtual MsgRouting WmCtlColor(HDC hDC, HWND hCtrl,
 520                                   UINT ctlColor, HBRUSH& retBrush);
 521     virtual MsgRouting WmHScroll(UINT scrollCode, UINT pos, HWND hScrollBar);
 522     virtual MsgRouting WmVScroll(UINT scrollCode, UINT pos, HWND hScrollBar);
 523 
 524     virtual MsgRouting WmMouseEnter(UINT flags, int x, int y);
 525     virtual MsgRouting WmMouseDown(UINT flags, int x, int y, int button);
 526     virtual MsgRouting WmMouseUp(UINT flags, int x, int y, int button);
 527     virtual MsgRouting WmMouseMove(UINT flags, int x, int y);
 528     virtual MsgRouting WmMouseExit(UINT flags, int x, int y);
 529     virtual MsgRouting WmMouseWheel(UINT flags, int x, int y,
 530                                     int wheelRotation, BOOL isHorizontal);
 531     virtual MsgRouting WmNcMouseDown(WPARAM hitTest, int x, int y, int button);
 532     virtual MsgRouting WmNcMouseUp(WPARAM hitTest, int x, int y, int button);
 533     virtual MsgRouting WmWindowPosChanging(LPARAM windowPos);
 534     virtual MsgRouting WmWindowPosChanged(LPARAM windowPos);
 535     virtual void WmTouch(WPARAM wParam, LPARAM lParam);
 536 
 537     // NB: 64-bit: vkey is wParam of the message, but other API's take
 538     // vkey parameters of type UINT, so we do the cast before dispatching.
 539     virtual MsgRouting WmKeyDown(UINT vkey, UINT repCnt, UINT flags, BOOL system);
 540     virtual MsgRouting WmKeyUp(UINT vkey, UINT repCnt, UINT flags, BOOL system);
 541 
 542     virtual MsgRouting WmChar(UINT character, UINT repCnt, UINT flags, BOOL system);
 543     virtual MsgRouting WmIMEChar(UINT character, UINT repCnt, UINT flags, BOOL system);
 544     virtual MsgRouting WmInputLangChange(UINT charset, HKL hKeyBoardLayout);
 545     virtual MsgRouting WmForwardChar(WCHAR character, LPARAM lParam,
 546                                      BOOL synthethic);
 547     virtual MsgRouting WmPaste();
 548 
 549     virtual void SetCompositionWindow(RECT &r);
 550     virtual void OpenCandidateWindow(int x, int y);
 551     virtual void SetCandidateWindow(int iCandType, int x, int y);
 552     virtual MsgRouting WmImeSetContext(BOOL fSet, LPARAM *lplParam);
 553     virtual MsgRouting WmImeNotify(WPARAM subMsg, LPARAM bitsCandType);
 554     virtual MsgRouting WmImeStartComposition();
 555     virtual MsgRouting WmImeEndComposition();
 556     virtual MsgRouting WmImeComposition(WORD wChar, LPARAM flags);
 557 
 558     virtual MsgRouting WmTimer(UINT_PTR timerID) {return mrDoDefault;}
 559 
 560     virtual MsgRouting WmCommand(UINT id, HWND hWndCtrl, UINT notifyCode);
 561 
 562     /* reflected WmCommand from parent */
 563     virtual MsgRouting WmNotify(UINT notifyCode);
 564 
 565     virtual MsgRouting WmCompareItem(UINT /*ctrlId*/,
 566                                      COMPAREITEMSTRUCT &compareInfo,
 567                                      LRESULT &result);
 568     virtual MsgRouting WmDeleteItem(UINT /*ctrlId*/,
 569                                     DELETEITEMSTRUCT &deleteInfo);
 570     virtual MsgRouting WmDrawItem(UINT ctrlId,
 571                                   DRAWITEMSTRUCT &drawInfo);
 572     virtual MsgRouting WmMeasureItem(UINT ctrlId,
 573                                      MEASUREITEMSTRUCT &measureInfo);
 574     /* Fix 4181790 & 4223341 : These functions get overridden in owner-drawn
 575      * components instead of the Wm... versions.
 576      */
 577     virtual MsgRouting OwnerDrawItem(UINT ctrlId,
 578                                      DRAWITEMSTRUCT &drawInfo);
 579     virtual MsgRouting OwnerMeasureItem(UINT ctrlId,
 580                                         MEASUREITEMSTRUCT &measureInfo);
 581 
 582     virtual MsgRouting WmPrint(HDC hDC, LPARAM flags);
 583     virtual MsgRouting WmPrintClient(HDC hDC, LPARAM flags);
 584 
 585     virtual MsgRouting WmNcCalcSize(BOOL fCalcValidRects,
 586                                     LPNCCALCSIZE_PARAMS lpncsp,
 587                                     LRESULT &retVal);
 588     virtual MsgRouting WmNcPaint(HRGN hrgn);
 589     virtual MsgRouting WmNcHitTest(UINT x, UINT y, LRESULT &retVal);
 590     virtual MsgRouting WmSysCommand(UINT uCmdType, int xPos, int yPos);
 591     virtual MsgRouting WmEnterSizeMove();
 592     virtual MsgRouting WmExitSizeMove();
 593     virtual MsgRouting WmEnterMenuLoop(BOOL isTrackPopupMenu);
 594     virtual MsgRouting WmExitMenuLoop(BOOL isTrackPopupMenu);
 595 
 596     virtual MsgRouting WmQueryNewPalette(LRESULT &retVal);
 597     virtual MsgRouting WmPaletteChanged(HWND hwndPalChg);
 598     virtual MsgRouting WmPaletteIsChanging(HWND hwndPalChg);
 599     virtual MsgRouting WmStyleChanged(int wStyleType, LPSTYLESTRUCT lpss);
 600     virtual MsgRouting WmSettingChange(UINT wFlag, LPCTSTR pszSection);
 601 
 602     virtual MsgRouting WmContextMenu(HWND hCtrl, UINT xPos, UINT yPos) {
 603         return mrDoDefault;
 604     }
 605 
 606     void UpdateColorModel();
 607 
 608     jintArray CreatePrintedPixels(SIZE &loc, SIZE &size, int alpha);
 609 
 610     /*
 611      * HWND, AwtComponent and Java Peer interaction
 612      *
 613      * Link the C++, Java peer, and HWNDs together.
 614      */
 615     void LinkObjects(JNIEnv *env, jobject peer);
 616 
 617     void UnlinkObjects();
 618 
 619     static BOOL QueryNewPaletteCalled() { return m_QueryNewPaletteCalled; }
 620 
 621 #ifdef DEBUG
 622     virtual void VerifyState(); /* verify component and peer are in sync. */
 623 #else
 624     void VerifyState() {}       /* no-op */
 625 #endif
 626 
 627     virtual AwtDropTarget* CreateDropTarget(JNIEnv* env);
 628     virtual void DestroyDropTarget();
 629 
 630     INLINE virtual HWND GetDBCSEditHandle() { return NULL; }
 631     // State for native drawing API
 632     INLINE jint GetDrawState() { return GetDrawState(m_hwnd); }
 633     INLINE void SetDrawState(jint state) { SetDrawState(m_hwnd, state); }    // State for native drawing API
 634 
 635     INLINE virtual BOOL IsTopLevel() { return FALSE; }
 636     INLINE virtual BOOL IsEmbeddedFrame() { return FALSE; }
 637     INLINE virtual BOOL IsScrollbar() { return FALSE; }
 638 
 639     static INLINE BOOL IsTopLevelHWnd(HWND hwnd) {
 640         AwtComponent *comp = AwtComponent::GetComponent(hwnd);
 641         return (comp != NULL && comp->IsTopLevel());
 642     }
 643     static INLINE BOOL IsEmbeddedFrameHWnd(HWND hwnd) {
 644         AwtComponent *comp = AwtComponent::GetComponent(hwnd);
 645         return (comp != NULL && comp->IsEmbeddedFrame());
 646     }
 647 
 648     static jint GetDrawState(HWND hwnd);
 649     static void SetDrawState(HWND hwnd, jint state);
 650 
 651     static HWND GetHWnd(JNIEnv* env, jobject target);
 652 
 653     static MSG* CreateMessage(UINT message, WPARAM wParam, LPARAM lParam, int x, int y);
 654     static void InitMessage(MSG* msg, UINT message, WPARAM wParam, LPARAM lParam, int x, int y);
 655 
 656     // Some methods to be called on Toolkit thread via Toolkit.InvokeFunction()
 657     static void _Show(void *param);
 658     static void _Hide(void *param);
 659     static void _Enable(void *param);
 660     static void _Disable(void *param);
 661     static jobject _GetLocationOnScreen(void *param);
 662     static void _Reshape(void *param);
 663     static void _ReshapeNoCheck(void *param);
 664     static void _NativeHandleEvent(void *param);
 665     static void _SetForeground(void *param);
 666     static void _SetBackground(void *param);
 667     static void _SetFont(void *param);
 668     static void _Start(void *param);
 669     static void _BeginValidate(void *param);
 670     static void _EndValidate(void *param);
 671     static void _UpdateWindow(void *param);
 672     static jlong _AddNativeDropTarget(void *param);
 673     static void _RemoveNativeDropTarget(void *param);
 674     static jintArray _CreatePrintedPixels(void *param);
 675     static jboolean _NativeHandlesWheelScrolling(void *param);
 676     static void _SetParent(void * param);
 677     static void _SetRectangularShape(void *param);
 678     static void _SetZOrder(void *param);
 679 
 680     static HWND sm_focusOwner;
 681 
 682 private:
 683     static HWND sm_focusedWindow;
 684 
 685 public:
 686     static inline HWND GetFocusedWindow() { return sm_focusedWindow; }
 687     static void SetFocusedWindow(HWND window);
 688 
 689     static void _SetFocus(void *param);
 690 
 691     static void *SetNativeFocusOwner(void *self);
 692     static void *GetNativeFocusedWindow();
 693     static void *GetNativeFocusOwner();
 694 
 695     static BOOL sm_inSynthesizeFocus;
 696 
 697     // Execute on Toolkit only.
 698     INLINE static LRESULT SynthesizeWmSetFocus(HWND targetHWnd, HWND oppositeHWnd) {
 699         sm_inSynthesizeFocus = TRUE;
 700         LRESULT res = ::SendMessage(targetHWnd, WM_SETFOCUS, (WPARAM)oppositeHWnd, 0);
 701         sm_inSynthesizeFocus = FALSE;
 702         return res;
 703     }
 704     // Execute on Toolkit only.
 705     INLINE static LRESULT SynthesizeWmKillFocus(HWND targetHWnd, HWND oppositeHWnd) {
 706         sm_inSynthesizeFocus = TRUE;
 707         LRESULT res = ::SendMessage(targetHWnd, WM_KILLFOCUS, (WPARAM)oppositeHWnd, 0);
 708         sm_inSynthesizeFocus = FALSE;
 709         return res;
 710     }
 711 
 712     static BOOL sm_bMenuLoop;
 713     static INLINE BOOL isMenuLoopActive() {
 714         return sm_bMenuLoop;
 715     }
 716 
 717     // when this component is being destroyed, this method is called
 718     // to find out if there are any messages being processed, and if
 719     // there are some then disposal of this component is postponed
 720     virtual BOOL CanBeDeleted() {
 721         return m_MessagesProcessing == 0;
 722     }
 723 
 724     BOOL IsDestroyPaused() const {
 725         return m_bPauseDestroy;
 726     }
 727 
 728 protected:
 729     static AwtComponent* GetComponentImpl(HWND hWnd);
 730 
 731     static int GetClickCount();
 732 
 733     HWND     m_hwnd;
 734     UINT     m_myControlID;     /* its own ID from the view point of parent */
 735     BOOL     m_backgroundColorSet;
 736     BOOL     m_visible;         /* copy of Component.visible */
 737 
 738     static BOOL sm_suppressFocusAndActivation;
 739     static BOOL sm_restoreFocusAndActivation;
 740 
 741     /*
 742      * The function sets the focus-restore flag ON/OFF.
 743      * When the flag is ON, focus is restored immidiately after the proxy loses it.
 744      * All focus messages are suppressed. It's also assumed that sm_focusedWindow and
 745      * sm_focusOwner don't change after the flag is set ON and before it's set OFF.
 746      */
 747     static INLINE void SetRestoreFocus(BOOL doSet) {
 748         sm_suppressFocusAndActivation = doSet;
 749         sm_restoreFocusAndActivation = doSet;
 750     }
 751 
 752     virtual void SetDragCapture(UINT flags);
 753     virtual void ReleaseDragCapture(UINT flags);
 754 
 755     virtual void FillBackground(HDC hMemoryDC, SIZE &size);
 756     virtual void FillAlpha(void *bitmapBits, SIZE &size, BYTE alpha);
 757 
 758     int ScaleUpX(int x);
 759     int ScaleUpAbsX(int x);
 760     int ScaleUpY(int y);
 761     int ScaleUpAbsY(int y);
 762     int ScaleDownX(int x);
 763     int ScaleDownAbsX(int x);
 764     int ScaleDownY(int y);
 765     int ScaleDownAbsY(int y);
 766 
 767 private:
 768     /* A bitmask keeps the button's numbers as MK_LBUTTON, MK_MBUTTON, MK_RBUTTON
 769      * which are allowed to
 770      * generate the CLICK event after the RELEASE has happened.
 771      * There are conditions that must be true for that sending CLICK event:
 772      * 1) button was initially PRESSED
 773      * 2) no movement or drag has happened until RELEASE
 774     */
 775     UINT m_mouseButtonClickAllowed;
 776 
 777     BOOL m_touchDownOccurred;
 778     BOOL m_touchUpOccurred;
 779     POINT m_touchDownPoint;
 780     POINT m_touchUpPoint;
 781 
 782     BOOL m_bSubclassed;
 783     BOOL m_bPauseDestroy;
 784 
 785     COLORREF m_colorForeground;
 786     COLORREF m_colorBackground;
 787 
 788     AwtPen*  m_penForeground;
 789     AwtBrush* m_brushBackground;
 790 
 791     WNDPROC  m_DefWindowProc;
 792     // counter for messages being processed by this component
 793     UINT     m_MessagesProcessing;
 794 
 795     // provides a unique ID for child controls
 796     UINT     m_nextControlID;
 797 
 798     // DeferWindowPos handle for batched-up window positioning
 799     HDWP     m_hdwp;
 800     // Counter to handle nested calls to Begin/EndValidate
 801     UINT     m_validationNestCount;
 802 
 803     AwtDropTarget* m_dropTarget; // associated DropTarget object
 804 
 805     // When we process WM_INPUTLANGCHANGE we remember the keyboard
 806     // layout handle and associated input language and codepage.
 807     // We also invalidate VK translation table for VK_OEM_* codes
 808     static HKL    m_hkl;
 809     static UINT   m_CodePage;
 810     static LANGID m_idLang;
 811 
 812     static BOOL sm_rtl;
 813     static BOOL sm_rtlReadingOrder;
 814 
 815     static BOOL sm_PrimaryDynamicTableBuilt;
 816 
 817     jobject m_InputMethod;
 818     BOOL    m_useNativeCompWindow;
 819     LPARAM  m_bitsCandType;
 820     UINT    m_PendingLeadByte;
 821 
 822     void SetComponentInHWND();
 823 
 824     // Determines whether a given virtual key is on the numpad
 825     static BOOL IsNumPadKey(UINT vkey, BOOL extended);
 826 
 827     // Determines the keyLocation of a given key
 828     static jint GetKeyLocation(UINT wkey, UINT flags);
 829     static jint GetShiftKeyLocation(UINT wkey, UINT flags);
 830 
 831     // Cache for FindComponent
 832     static HWND sm_cursorOn;
 833 
 834     static BOOL m_QueryNewPaletteCalled;
 835 
 836     static AwtComponent* sm_getComponentCache; // a cache for the GetComponent(..) method.
 837 
 838     int windowMoveLockPosX;
 839     int windowMoveLockPosY;
 840     int windowMoveLockPosCX;
 841     int windowMoveLockPosCY;
 842 
 843     // 6524352: support finer-resolution
 844     int m_wheelRotationAmountX;
 845     int m_wheelRotationAmountY;
 846 
 847     BOOL deadKeyActive;
 848 
 849     /*
 850      * The association list of children's IDs and corresponding components.
 851      * Some components like Choice or List are required their sizes while
 852      * the creations of themselfs are in progress.
 853      */
 854     class ChildListItem {
 855     public:
 856         ChildListItem(UINT id, AwtComponent* component) {
 857             m_ID = id;
 858             m_Component = component;
 859             m_next = NULL;
 860         }
 861         ~ChildListItem() {
 862             if (m_next != NULL)
 863                 delete m_next;
 864         }
 865 
 866         UINT m_ID;
 867         AwtComponent* m_Component;
 868         ChildListItem* m_next;
 869     };
 870 
 871 public:
 872     INLINE void PushChild(UINT id, AwtComponent* component) {
 873         ChildListItem* child = new ChildListItem(id, component);
 874         child->m_next = m_childList;
 875         m_childList = child;
 876     }
 877 
 878     static void SetParent(void * param);
 879 private:
 880     AwtComponent* SearchChild(UINT id);
 881     void RemoveChild(UINT id) ;
 882     static BOOL IsNavigationKey(UINT wkey);
 883     static void BuildPrimaryDynamicTable();
 884 
 885     ChildListItem* m_childList;
 886 
 887     HCURSOR m_hCursorCache; // the latest cursor which has been active within the heavyweight component
 888 public:
 889     inline void setCursorCache(HCURSOR hCursor) {
 890         m_hCursorCache = hCursor;
 891     }
 892     inline HCURSOR getCursorCache() {
 893         return m_hCursorCache;
 894     }
 895 };
 896 
 897 class CounterHelper {
 898 private:
 899     UINT *m_counter;
 900 public:
 901     explicit CounterHelper(UINT *counter) {
 902         m_counter = counter;
 903         (*m_counter)++;
 904     }
 905     ~CounterHelper() {
 906         (*m_counter)--;
 907         m_counter = NULL;
 908     }
 909 };
 910 
 911 // DC management objects; these classes are used to track the list of
 912 // DC's associated with a given Component.  Then DC's can be released
 913 // appropriately on demand or on window destruction to avoid resource
 914 // leakage.
 915 class DCItem {
 916 public:
 917     HDC             hDC;
 918     HWND            hWnd;
 919     DCItem          *next;
 920 };
 921 class DCList {
 922     DCItem          *head;
 923     CriticalSection listLock;
 924 public:
 925     DCList() { head = NULL; }
 926 
 927     void            AddDC(HDC hDC, HWND hWnd);
 928     void            AddDCItem(DCItem *newItem);
 929     DCItem          *RemoveDC(HDC hDC, HWND hWnd);
 930     DCItem          *RemoveAllDCs(HWND hWnd);
 931     DCItem          *RemoveAllDCs();
 932     void            RealizePalettes(int screen);
 933 };
 934 
 935 void ReleaseDCList(HWND hwnd, DCList &list);
 936 void ReleaseDCList(DCList &list);
 937 void MoveDCToPassiveList(HDC hDC, HWND hWnd);
 938 
 939 #include "ObjectList.h"
 940 
 941 #endif /* AWT_COMPONENT_H */