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