1 /*
2  * Copyright (c) 1996, 2015, 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 #include "awt.h"
27 #include "awt_Toolkit.h"
28 #include "awt_Checkbox.h"
29 #include "awt_Canvas.h"
30 #include "awt_Window.h"
31 
32 /* IMPORTANT! Read the README.JNI file for notes on JNI converted AWT code.
33  */
34 
35 /***********************************************************************/
36 // Struct for _SetLabel() method
37 struct SetLabelStruct {
38     jobject checkbox;
39     jstring label;
40 };
41 // Struct for _SetState() method
42 struct SetStateStruct {
43     jobject checkbox;
44     jboolean state;
45 };
46 
47 /************************************************************************
48  * AwtCheckbox fields
49  */
50 
51 /* java.awt.Checkbox field IDs */
52 jfieldID AwtCheckbox::labelID;
53 jfieldID AwtCheckbox::groupID;
54 jfieldID AwtCheckbox::stateID;
55 
56 const int AwtCheckbox::CHECK_SIZE = 13;
57 
58 /************************************************************************
59  * AwtCheckbox methods
60  */
61 
AwtCheckbox()62 AwtCheckbox::AwtCheckbox() {
63 
64     m_fLButtonDowned = FALSE;
65 }
66 
GetClassName()67 LPCTSTR AwtCheckbox::GetClassName() {
68     return TEXT("BUTTON");  /* System provided checkbox class (a type of button) */
69 }
70 
Create(jobject peer,jobject parent)71 AwtCheckbox* AwtCheckbox::Create(jobject peer, jobject parent)
72 {
73     DASSERT(AwtToolkit::IsMainThread());
74     JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
75 
76     jstring label = NULL;
77     jobject target = NULL;
78     AwtCheckbox *checkbox = NULL;
79 
80     try {
81         if (env->EnsureLocalCapacity(2) < 0) {
82             return NULL;
83         }
84 
85         PDATA pData;
86         AwtComponent* awtParent;
87         JNI_CHECK_PEER_GOTO(parent, done);
88         awtParent = (AwtCanvas*)pData;
89 
90         target = env->GetObjectField(peer, AwtObject::targetID);
91         JNI_CHECK_NULL_GOTO(target, "null target", done);
92 
93         checkbox = new AwtCheckbox();
94 
95         {
96             DWORD style = WS_CHILD | WS_CLIPSIBLINGS | BS_OWNERDRAW;
97             LPCWSTR defaultLabelStr = L"";
98             LPCWSTR labelStr = defaultLabelStr;
99             DWORD exStyle = 0;
100 
101             if (GetRTL()) {
102                 exStyle |= WS_EX_RIGHT;
103                 if (GetRTLReadingOrder())
104                     exStyle |= WS_EX_RTLREADING;
105             }
106 
107             label = (jstring)env->GetObjectField(target, AwtCheckbox::labelID);
108             if (label != NULL) {
109                 labelStr = JNU_GetStringPlatformChars(env, label, 0);
110             }
111             if (labelStr != 0) {
112                 jint x = env->GetIntField(target, AwtComponent::xID);
113                 jint y = env->GetIntField(target, AwtComponent::yID);
114                 jint width = env->GetIntField(target, AwtComponent::widthID);
115                 jint height = env->GetIntField(target, AwtComponent::heightID);
116                 checkbox->CreateHWnd(env, labelStr, style, exStyle,
117                                      x, y, width, height,
118                                      awtParent->GetHWnd(),
119                                      reinterpret_cast<HMENU>(static_cast<INT_PTR>(
120                          awtParent->CreateControlID())),
121                                      ::GetSysColor(COLOR_WINDOWTEXT),
122                                      ::GetSysColor(COLOR_BTNFACE),
123                                      peer);
124 
125                 if (labelStr != defaultLabelStr) {
126                     JNU_ReleaseStringPlatformChars(env, label, labelStr);
127                 }
128             } else {
129                 throw std::bad_alloc();
130             }
131         }
132     } catch (...) {
133         env->DeleteLocalRef(label);
134         env->DeleteLocalRef(target);
135         throw;
136     }
137 
138 done:
139     env->DeleteLocalRef(label);
140     env->DeleteLocalRef(target);
141 
142     return checkbox;
143 }
144 
145 MsgRouting
WmMouseUp(UINT flags,int x,int y,int button)146 AwtCheckbox::WmMouseUp(UINT flags, int x, int y, int button)
147 {
148     MsgRouting mrResult = AwtComponent::WmMouseUp(flags, x, y, button);
149 
150     if (::IsWindow(AwtWindow::GetModalBlocker(AwtComponent::GetTopLevelParentForWindow(GetHWnd()))))
151     {
152         return mrConsume;
153     }
154 
155     POINT p = {x, y};
156     RECT rect;
157     ::GetClientRect(GetHWnd(), &rect);
158 
159     if (::PtInRect(&rect, p) && button == LEFT_BUTTON && m_fLButtonDowned) {
160         WmNotify(BN_CLICKED);
161     }
162     m_fLButtonDowned = FALSE;
163     return mrResult;
164 }
165 
166 MsgRouting
WmMouseDown(UINT flags,int x,int y,int button)167 AwtCheckbox::WmMouseDown(UINT flags, int x, int y, int button)
168 {
169     m_fLButtonDowned = TRUE;
170     return AwtComponent::WmMouseDown(flags, x, y, button);
171 }
172 
173 MsgRouting
WmNotify(UINT notifyCode)174 AwtCheckbox::WmNotify(UINT notifyCode)
175 {
176     if (notifyCode == BN_CLICKED) {
177         BOOL fChecked = !GetState();
178         DoCallback("handleAction", "(Z)V", fChecked);
179     }
180     return mrDoDefault;
181 }
182 
GetState()183 BOOL AwtCheckbox::GetState()
184 {
185     JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
186 
187     if (env->EnsureLocalCapacity(2) < 0) {
188         return NULL;
189     }
190     jobject target = GetTarget(env);
191     jboolean result = JNI_FALSE;
192     if (target != NULL) {
193         result = env->GetBooleanField(target, AwtCheckbox::stateID);
194     }
195 
196     env->DeleteLocalRef(target);
197 
198     return (BOOL)result;
199 }
200 
GetCheckSize()201 int AwtCheckbox::GetCheckSize()
202 {
203     /* using height of small icon for check mark size */
204     return CHECK_SIZE;
205 }
206 
207 MsgRouting
OwnerDrawItem(UINT,DRAWITEMSTRUCT & drawInfo)208 AwtCheckbox::OwnerDrawItem(UINT /*ctrlId*/, DRAWITEMSTRUCT& drawInfo)
209 {
210     JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
211 
212     if (env->EnsureLocalCapacity(4) < 0) {
213         return mrConsume;
214     }
215 
216     jobject self = GetPeer(env);
217     jobject target = env->GetObjectField(self, AwtObject::targetID);
218 
219     HDC hDC = drawInfo.hDC;
220     RECT rect = drawInfo.rcItem;
221     int checkSize;
222     UINT nState;
223     SIZE size;
224 
225     jobject font = GET_FONT(target, self);
226     jstring str = (jstring)env->GetObjectField(target, AwtCheckbox::labelID);
227     size = AwtFont::getMFStringSize(hDC, font, str);
228 
229     jobject group = env->GetObjectField(target, AwtCheckbox::groupID);
230     if (group != NULL)
231         nState = DFCS_BUTTONRADIO;
232     else
233         nState = DFCS_BUTTONCHECK;
234 
235     if (GetState())
236         nState |= DFCS_CHECKED;
237     else
238         nState &= ~DFCS_CHECKED;
239 
240     if (drawInfo.itemState & ODS_SELECTED)
241         nState |= DFCS_PUSHED;
242 
243     if (drawInfo.itemAction & ODA_DRAWENTIRE) {
244         VERIFY(::FillRect (hDC, &rect, GetBackgroundBrush()));
245     }
246 
247     /* draw check mark */
248     checkSize = GetCheckSize();
249     RECT boxRect;
250 
251     boxRect.left = (GetRTL()) ? rect.right - checkSize : rect.left;
252     boxRect.top = (rect.bottom - rect.top - checkSize)/2;
253     boxRect.right = boxRect.left + checkSize;
254     boxRect.bottom = boxRect.top + checkSize;
255     ::DrawFrameControl(hDC, &boxRect, DFC_BUTTON, nState);
256 
257     /*
258      * draw string
259      *
260      * 4 is a heuristic number
261      */
262     rect.left = rect.left + checkSize + checkSize/4;
263     if (drawInfo.itemAction & ODA_DRAWENTIRE) {
264         BOOL bEnabled = isEnabled();
265 
266         int x = (GetRTL()) ? rect.right - (checkSize + checkSize / 4 + size.cx)
267                            : rect.left;
268         int y = (rect.top + rect.bottom - size.cy) / 2;
269         if (bEnabled) {
270             AwtComponent::DrawWindowText(hDC, font, str, x, y);
271         } else {
272             AwtComponent::DrawGrayText(hDC, font, str, x, y);
273         }
274     }
275 
276     /* Draw focus rect */
277     RECT focusRect;
278     const int margin = 2; /*  2 is a heuristic number */
279 
280     focusRect.left = (GetRTL()) ? rect.right - checkSize - checkSize / 4 -
281                                       2 * margin - size.cx
282                                 : rect.left - margin;
283     focusRect.top = (rect.top+rect.bottom-size.cy)/2;
284     focusRect.right = (GetRTL()) ? rect.right - checkSize - checkSize / 4 +
285                                       margin
286                                  : focusRect.left + size.cx + 2 * margin;
287     focusRect.bottom = focusRect.top + size.cy;
288 
289     /*  draw focus rect */
290     if ((drawInfo.itemState & ODS_FOCUS) &&
291         ((drawInfo.itemAction & ODA_FOCUS)||
292          (drawInfo.itemAction &ODA_DRAWENTIRE))) {
293         if(::DrawFocusRect(hDC, &focusRect) == 0)
294             VERIFY(::GetLastError() == 0);
295     }
296     /*  erase focus rect */
297     else if (!(drawInfo.itemState & ODS_FOCUS) &&
298              (drawInfo.itemAction & ODA_FOCUS)) {
299         if(::DrawFocusRect(hDC, &focusRect) == 0)
300             VERIFY(::GetLastError() == 0);
301     }
302 
303     /*  Notify any subclasses */
304     rect = drawInfo.rcItem;
305     DoCallback("handlePaint", "(IIII)V", rect.left, rect.top,
306                rect.right-rect.left, rect.bottom-rect.top);
307 
308     env->DeleteLocalRef(target);
309     env->DeleteLocalRef(font);
310     env->DeleteLocalRef(str);
311     env->DeleteLocalRef(group);
312 
313     return mrConsume;
314 }
315 
WmPaint(HDC)316 MsgRouting AwtCheckbox::WmPaint(HDC)
317 {
318     /*  Suppress peer notification, because it's handled in WmDrawItem. */
319     return mrDoDefault;
320 }
321 
IsFocusingMouseMessage(MSG * pMsg)322 BOOL AwtCheckbox::IsFocusingMouseMessage(MSG *pMsg) {
323     return pMsg->message == WM_LBUTTONDOWN || pMsg->message == WM_LBUTTONUP;
324 }
325 
IsFocusingKeyMessage(MSG * pMsg)326 BOOL AwtCheckbox::IsFocusingKeyMessage(MSG *pMsg) {
327     return (pMsg->message == WM_KEYDOWN || pMsg->message == WM_KEYUP) &&
328             pMsg->wParam == VK_SPACE;
329 }
330 
HandleEvent(MSG * msg,BOOL synthetic)331 MsgRouting AwtCheckbox::HandleEvent(MSG *msg, BOOL synthetic)
332 {
333     if (IsFocusingMouseMessage(msg)) {
334         SendMessage(BM_SETSTATE, (WPARAM)(msg->message == WM_LBUTTONDOWN ? TRUE : FALSE));
335         delete msg;
336         return mrConsume;
337     }
338     if (IsFocusingKeyMessage(msg)) {
339         SendMessage(BM_SETSTATE, (WPARAM)(msg->message == WM_KEYDOWN ? TRUE : FALSE));
340         if (msg->message == WM_KEYDOWN) {
341             m_fLButtonDowned = TRUE;
342         } else if (m_fLButtonDowned == TRUE) {
343             WmNotify(BN_CLICKED);
344             m_fLButtonDowned = TRUE;
345         }
346         delete msg;
347         return mrConsume;
348     }
349     return AwtComponent::HandleEvent(msg, synthetic);
350 }
351 
_SetLabel(void * param)352 void AwtCheckbox::_SetLabel(void *param)
353 {
354     JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
355 
356     SetLabelStruct *sls = (SetLabelStruct *)param;
357     jobject checkbox = sls->checkbox;
358     jstring label = sls->label;
359 
360     int badAlloc = 0;
361     AwtCheckbox *c = NULL;
362 
363     PDATA pData;
364     JNI_CHECK_PEER_GOTO(checkbox, done);
365 
366     c = (AwtCheckbox *)pData;
367     if (::IsWindow(c->GetHWnd()))
368     {
369         LPCTSTR labelStr = NULL;
370 
371         // By convension null label means empty string
372         if (label == NULL)
373         {
374             labelStr = TEXT("");
375         }
376         else
377         {
378             labelStr = JNU_GetStringPlatformChars(env, label, JNI_FALSE);
379         }
380 
381         if (labelStr == NULL)
382         {
383             badAlloc = 1;
384         }
385         else
386         {
387             c->SetText(labelStr);
388             c->VerifyState();
389             if (label != NULL) {
390                 JNU_ReleaseStringPlatformChars(env, label, labelStr);
391             }
392         }
393     }
394 
395 done:
396     env->DeleteGlobalRef(checkbox);
397     if (label != NULL)
398     {
399         env->DeleteGlobalRef(label);
400     }
401 
402     delete sls;
403 
404     if (badAlloc) {
405         throw std::bad_alloc();
406     }
407 }
408 
_SetCheckboxGroup(void * param)409 void AwtCheckbox::_SetCheckboxGroup(void *param)
410 {
411     JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
412 
413     jobject *jos = (jobject *)param;
414     jobject checkbox = jos[0];
415     jobject group = jos[1];
416 
417     AwtCheckbox *c = NULL;
418 
419     PDATA pData;
420     JNI_CHECK_PEER_GOTO(checkbox, done);
421 
422     c = (AwtCheckbox *)pData;
423     if (::IsWindow(c->GetHWnd()))
424     {
425 /*
426 #ifdef DEBUG
427         if (group != NULL) {
428             DASSERT(IsInstanceOf((HObject*)group, "java/awt/CheckboxGroup"));
429         }
430 #endif
431 */
432         long style = c->GetStyle();
433         if (group == NULL) {
434             style = style & ~BS_AUTORADIOBUTTON;
435             style = style | BS_AUTOCHECKBOX;
436         } else {
437             style = style & ~BS_AUTOCHECKBOX;
438             style = style | BS_AUTORADIOBUTTON;
439         }
440         c->SetStyle(style);
441         c->SendMessage(BM_SETSTYLE, (WPARAM)BS_OWNERDRAW, (LPARAM)TRUE);
442         c->VerifyState();
443     }
444 
445 done:
446     env->DeleteGlobalRef(checkbox);
447     if (group != NULL) {
448       env->DeleteGlobalRef(group);
449     }
450 
451     delete[] jos;
452 }
453 
_SetState(void * param)454 void AwtCheckbox::_SetState(void *param)
455 {
456     JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
457 
458     SetStateStruct *sss = (SetStateStruct *)param;
459     jobject checkbox = sss->checkbox;
460     jboolean state = sss->state;
461 
462     AwtCheckbox *c = NULL;
463 
464     PDATA pData;
465     JNI_CHECK_PEER_GOTO(checkbox, done);
466 
467     c = (AwtCheckbox *)pData;
468     if (::IsWindow(c->GetHWnd()))
469     {
470         /*
471          * when multifont and group checkbox receive setState native
472          * method, it must be redraw to display correct check mark
473          */
474         jobject target = env->GetObjectField(checkbox, AwtObject::targetID);
475         jobject group = env->GetObjectField(target, AwtCheckbox::groupID);
476         HWND hWnd = c->GetHWnd();
477         if (group != NULL) {
478             RECT rect;
479             VERIFY(::GetWindowRect(hWnd, &rect));
480             VERIFY(::ScreenToClient(hWnd, (LPPOINT)&rect));
481             VERIFY(::ScreenToClient(hWnd, ((LPPOINT)&rect) + 1));
482             VERIFY(::InvalidateRect(hWnd, &rect,TRUE));
483             VERIFY(::UpdateWindow(hWnd));
484         } else {
485             c->SendMessage(BM_SETCHECK, (WPARAM)(state ? BST_CHECKED : BST_UNCHECKED));
486             VERIFY(::InvalidateRect(hWnd, NULL, FALSE));
487         }
488         c->VerifyState();
489         env->DeleteLocalRef(target);
490         env->DeleteLocalRef(group);
491     }
492 
493 done:
494     env->DeleteGlobalRef(checkbox);
495 
496     delete sss;
497 }
498 
499 #ifdef DEBUG
VerifyState()500 void AwtCheckbox::VerifyState()
501 {
502     if (AwtToolkit::GetInstance().VerifyComponents() == FALSE) {
503         return;
504     }
505 
506     if (m_callbacksEnabled == FALSE) {
507         /*  Component is not fully setup yet. */
508         return;
509     }
510 
511     AwtComponent::VerifyState();
512     JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
513 
514     if (env->EnsureLocalCapacity(2) < 0) {
515         return;
516     }
517 
518     jobject target = GetTarget(env);
519 
520     /*  Check button style */
521     DWORD style = ::GetWindowLong(GetHWnd(), GWL_STYLE);
522     DASSERT(style & BS_OWNERDRAW);
523 
524     /*  Check label */
525     int len = ::GetWindowTextLength(GetHWnd());
526     LPTSTR peerStr;
527     try {
528         peerStr = new TCHAR[len+1];
529     } catch (std::bad_alloc&) {
530         env->DeleteLocalRef(target);
531         throw;
532     }
533 
534     GetText(peerStr, len+1);
535     jstring label = (jstring)env->GetObjectField(target, AwtCheckbox::labelID);
536     DASSERT(_tcscmp(peerStr, JavaStringBuffer(env, label)) == 0);
537     delete [] peerStr;
538 
539     env->DeleteLocalRef(target);
540     env->DeleteLocalRef(label);
541 }
542 #endif
543 
544 
545 /************************************************************************
546  * Checkbox native methods
547  */
548 
549 extern "C" {
550 
551 /*
552  * Class:     sun_awt_windows_WButtonPeer
553  * Method:    initIDs
554  * Signature: ()V
555  */
556 JNIEXPORT void JNICALL
Java_java_awt_Checkbox_initIDs(JNIEnv * env,jclass cls)557 Java_java_awt_Checkbox_initIDs(JNIEnv *env, jclass cls)
558 {
559     TRY;
560 
561     AwtCheckbox::labelID =
562       env->GetFieldID(cls, "label", "Ljava/lang/String;");
563     DASSERT(AwtCheckbox::labelID != NULL);
564     CHECK_NULL(AwtCheckbox::labelID);
565 
566     AwtCheckbox::groupID =
567       env->GetFieldID(cls, "group", "Ljava/awt/CheckboxGroup;");
568     DASSERT(AwtCheckbox::groupID != NULL);
569     CHECK_NULL(AwtCheckbox::groupID);
570 
571     AwtCheckbox::stateID = env->GetFieldID(cls, "state", "Z");
572     DASSERT(AwtCheckbox::stateID != NULL);
573 
574     CATCH_BAD_ALLOC;
575 }
576 
577 } /* extern "C" */
578 
579 
580 /************************************************************************
581  * WCheckboxPeer native methods
582  */
583 
584 extern "C" {
585 
586 /*
587  * Class:     sun_awt_windows_WCheckboxPeer
588  * Method:    getCheckMarkSize
589  * Signature: ()I
590  */
591 JNIEXPORT jint JNICALL
Java_sun_awt_windows_WCheckboxPeer_getCheckMarkSize(JNIEnv * env,jclass cls)592 Java_sun_awt_windows_WCheckboxPeer_getCheckMarkSize(JNIEnv *env,
593                                                           jclass cls)
594 {
595     return (jint)AwtCheckbox::GetCheckSize();
596 }
597 
598 /*
599  * Class:     sun_awt_windows_WCheckboxPeer
600  * Method:    setState
601  * Signature: (Z)V
602  */
603 JNIEXPORT void JNICALL
Java_sun_awt_windows_WCheckboxPeer_setState(JNIEnv * env,jobject self,jboolean state)604 Java_sun_awt_windows_WCheckboxPeer_setState(JNIEnv *env, jobject self,
605                                             jboolean state)
606 {
607     TRY;
608 
609     SetStateStruct *sss = new SetStateStruct;
610     sss->checkbox = env->NewGlobalRef(self);
611     sss->state = state;
612 
613     AwtToolkit::GetInstance().SyncCall(AwtCheckbox::_SetState, sss);
614     // global refs and sss are deleted in _SetState()
615 
616     CATCH_BAD_ALLOC;
617 }
618 
619 /*
620  * Class:     sun_awt_windows_WCheckboxPeer
621  * Method:    setCheckboxGroup
622  * Signature: (Ljava/awt/CheckboxGroup;)V
623  */
624 JNIEXPORT void JNICALL
Java_sun_awt_windows_WCheckboxPeer_setCheckboxGroup(JNIEnv * env,jobject self,jobject group)625 Java_sun_awt_windows_WCheckboxPeer_setCheckboxGroup(JNIEnv *env, jobject self,
626                                                     jobject group)
627 {
628     TRY;
629 
630     jobject *jos = new jobject[2];
631     jos[0] = env->NewGlobalRef(self);
632     jos[1] = env->NewGlobalRef(group);
633 
634     AwtToolkit::GetInstance().SyncCall(AwtCheckbox::_SetCheckboxGroup, jos);
635     // global refs and jos are deleted in _SetLabel()
636 
637     CATCH_BAD_ALLOC;
638 }
639 
640 /*
641  * Class:     sun_awt_windows_WCheckboxPeer
642  * Method:    setLabel
643  * Signature: (Ljava/lang/String;)V
644  */
645 JNIEXPORT void JNICALL
Java_sun_awt_windows_WCheckboxPeer_setLabel(JNIEnv * env,jobject self,jstring label)646 Java_sun_awt_windows_WCheckboxPeer_setLabel(JNIEnv *env, jobject self,
647                                             jstring label)
648 {
649     TRY;
650 
651     SetLabelStruct *sls = new SetLabelStruct;
652     sls->checkbox = env->NewGlobalRef(self);
653     sls->label = (label != NULL) ? (jstring)env->NewGlobalRef(label) : NULL;
654 
655     AwtToolkit::GetInstance().SyncCall(AwtCheckbox::_SetLabel, sls);
656     // global refs and sls are deleted in _SetLabel()
657 
658     CATCH_BAD_ALLOC;
659 }
660 
661 /*
662  * Class:     sun_awt_windows_WCheckboxPeer
663  * Method:    create
664  * Signature: (Lsun/awt/windows/WComponentPeer;)V
665  */
666 JNIEXPORT void JNICALL
Java_sun_awt_windows_WCheckboxPeer_create(JNIEnv * env,jobject self,jobject parent)667 Java_sun_awt_windows_WCheckboxPeer_create(JNIEnv *env, jobject self,
668                                           jobject parent)
669 {
670     TRY;
671 
672     AwtToolkit::CreateComponent(self, parent,
673                                 (AwtToolkit::ComponentFactory)
674                                 AwtCheckbox::Create);
675     PDATA pData;
676     JNI_CHECK_PEER_CREATION_RETURN(self);
677 
678 #ifdef DEBUG
679     ((AwtComponent*)JNI_GET_PDATA(self))->VerifyState();
680 #endif
681 
682     CATCH_BAD_ALLOC;
683 }
684 
685 } /* extern "C" */
686