netscape-revival
sun-java/awt/windows/awt.cpp
/*
* @(#)awt.cpp 1.76 95/12/09 Thomas Ball
*
* Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software
* and its documentation for NON-COMMERCIAL purposes and without
* fee is hereby granted provided that this copyright notice
* appears in all copies. Please refer to the file "copyright.html"
* for further important copyright and licensing information.
*
* SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
* THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
* ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
* DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
*/
#include "stdafx.h"
#include "awt.h"
#include "awtapp.h"
#include "awt_comp.h"
#include "awt_mainfrm.h"
#include "awt_edit.h"
#include "awt_font.h"
#include "awt_fontmetrics.h"
#include "awt_graphics.h"
#include "awt_image.h"
#include "awt_list.h"
#include "awt_optmenu.h"
#include "awt_window.h"
#include "awt_button.h"
#include "awt_menu.h"
#include "awt_label.h"
#include "resource.h"
#include "awt_filedlg.h"
#include "awt_sbar.h"
#include "awt_event.h"
#if defined(NETSCAPE) && defined(DEBUG)
AwtCList __AllAwtObjects;
#endif /* NETSCAPE */
extern "C" {
#define AWT_LOCK() GetApp()->MonitorEnter()
#define AWT_UNLOCK() GetApp()->MonitorExit()
PR_LOG_DEFINE(AWT);
#if defined(NETSCAPE) && defined(DEBUG)
int DebugPrintf(const char *fmt, ...)
{
char buffer[512];
int ret = 0;
va_list args;
va_start(args, fmt);
PR_vsnprintf(buffer, sizeof(buffer), fmt, args);
PR_LOG(AWT, out, (buffer));
va_end(args);
return ret;
}
#endif // NETSCAPE && DEBUG
// Returns a copy of pStr where \n have been converted to \r\n.
// If the result != 'pStr', 'pStr' has been freed.
char *AddCR(char *pStr, int nStrLen) {
int nNewlines = 0;
int i, nResultIx, nLen;
char *result;
// count newlines
for (i=0; pStr[i] != 0; i++) {
if (pStr[i] == '\n') {
nNewlines++;
}
}
nLen = i;
if (nLen + nNewlines + 1 > nStrLen) {
result = (char *)malloc(nLen + nNewlines + 1);
} else {
result = pStr;
}
nResultIx = nLen + nNewlines;
for (i=nLen; i>=0; i--) {
result[nResultIx--] = pStr[i];
if (pStr[i] == '\n') {
result[nResultIx--] = '\r';
}
}
ASSERT(nResultIx == -1);
if (result != pStr) {
free(pStr);
}
return result;
}
// Converts \r\n pairs to \n.
int RemoveCR(char *pStr) {
int i, nLen = 0;
if (pStr) {
for (i=0; pStr[i] != 0; i++) {
if (pStr[i] == '\r' && pStr[i + 1] == '\n') {
i++;
}
pStr[nLen++] = pStr[i];
}
pStr[nLen] = 0;
}
return nLen;
}
// Image related stuff
#include "java_awt_image_ImageObserver.h"
typedef struct Hjava_awt_image_ColorModel *CMHandle;
typedef Classjava_awt_image_ColorModel *CMPtr;
typedef struct Hsun_awt_win32_Win32Image *IHandle;
typedef Classsun_awt_win32_Win32Image *IPtr;
typedef struct Hsun_awt_image_ImageRepresentation *IRHandle;
typedef Classsun_awt_image_ImageRepresentation *IRPtr;
typedef struct Hsun_awt_image_OffScreenImageSource *OSISHandle;
typedef Classsun_awt_image_OffScreenImageSource *OSISPtr;
typedef struct Hjava_awt_Graphics *GHandle;
typedef Classjava_awt_Graphics *GPtr;
typedef struct HArrayOfByte *ByteHandle;
typedef unsigned char *BytePtr;
typedef struct HArrayOfInt *IntHandle;
typedef unsigned int *IntPtr;
#define IMAGE_SIZEINFO (java_awt_image_ImageObserver_WIDTH | \
java_awt_image_ImageObserver_HEIGHT)
#define IMAGE_DRAWINFO (java_awt_image_ImageObserver_WIDTH | \
java_awt_image_ImageObserver_SOMEBITS | \
java_awt_image_ImageObserver_HEIGHT)
#define IMAGE_OFFSCRNINFO (java_awt_image_ImageObserver_WIDTH | \
java_awt_image_ImageObserver_HEIGHT | \
java_awt_image_ImageObserver_SOMEBITS | \
java_awt_image_ImageObserver_ALLBITS)
AwtImage *
image_getpImage(IRHandle irh) {
AwtImage *pImage = (AwtImage *) irh->obj->pData;
if (pImage == NULL &&
(irh->obj->availinfo & IMAGE_SIZEINFO) == IMAGE_SIZEINFO)
{
pImage = new AwtImage;
pImage->Init(irh);
irh->obj->pData = (long) pImage;
}
return pImage;
}
} //extern "C"
/** BUTTON methods **/
void
sun_awt_win32_MButtonPeer_create(struct Hsun_awt_win32_MButtonPeer *self,
struct Hsun_awt_win32_MComponentPeer *parent)
{
CHECKHEAP;
AWT_LOCK();
Hjava_awt_Button *selfT = (Hjava_awt_Button*)unhand(self)->target;
if (parent == 0 || unhand(parent)->pData == 0 || selfT == NULL) {
SignalError(0, JAVAPKG "NullPointerException", "null parent");
AWT_UNLOCK();
return;
}
Classjava_awt_Button *selfTC = (Classjava_awt_Button *)unhand(selfT);
AwtWindow *pParent = (AwtWindow*)unhand(parent)->pData;
char stackBuffer[64];
char *buffer = &stackBuffer[0];
int len = javaStringLength(selfTC->label);
if (len >= sizeof(stackBuffer)) {
buffer = (char *)malloc(len + 1);
}
javaString2CString(selfTC->label, buffer, len + 1);
AWT_TRACE(("%x:buttonCreate(%x, %s)\n", self, parent, buffer));
AwtButton *pButton = AwtButton::CreateButton(selfT, pParent, buffer);
if (len >= sizeof(stackBuffer)) {
free(buffer);
}
unhand(self)->pData = (long)pButton;
CHECKHEAP;
AWT_UNLOCK();
}
void
sun_awt_win32_MButtonPeer_setColor(struct Hsun_awt_win32_MButtonPeer *self,
long fg,
struct Hjava_awt_Color *c)
{
CHECKHEAP;
AWT_LOCK();
if (c == NULL) {
SignalError(0,JAVAPKG "NullPointerException", "null color");
AWT_UNLOCK();
return;
}
Classjava_awt_Color *cC = (Classjava_awt_Color *)c->obj;
COLORREF color = PALETTERGB((cC->value>>16)&0xff, (cC->value>>8)&0xff, (cC->value)&0xff);
AwtButton *pButton = (AwtButton*)unhand(self);
AWT_TRACE(("%x:buttonSetColor(%d, %x)\n", self, fg, color));
pButton->PostMsg(AwtButton::SETCOLOR, unhand(self)->pData, fg, color);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MButtonPeer_setLabel(struct Hsun_awt_win32_MButtonPeer *self,
struct Hjava_lang_String *label)
{
CHECKHEAP;
AWT_LOCK();
AwtButton *pButton = (AwtButton*)unhand(self)->pData;
int len = javaStringLength(label);
char *buffer;
buffer = (char *)malloc(len + 1);
javaString2CString(label, buffer, len + 1);
AWT_TRACE(("%x:buttonSetLabel(%s)", self, buffer));
pButton->PostMsg(AwtButton::SETTEXT, (long)buffer);
AWT_UNLOCK();
CHECKHEAP;
}
/** CANVAS methods **/
void
sun_awt_win32_MCanvasPeer_create(struct Hsun_awt_win32_MCanvasPeer *self,
struct Hsun_awt_win32_MComponentPeer *parent)
{
CHECKHEAP;
AWT_LOCK();
if (parent == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null parent");
AWT_UNLOCK();
return;
}
AwtWindow *pParent = (AwtWindow *)unhand(parent)->pData;
Hjava_awt_Canvas *selfT = (Hjava_awt_Canvas*)unhand(self)->target;
if (selfT == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null target");
AWT_UNLOCK();
return;
}
AWT_TRACE(("%x:canvasCreate(%x)\n", self, parent));
AwtWindow *pWindow = AwtWindow::Create(selfT, pParent,
unhand(selfT)->width,
unhand(selfT)->height,
RGB(192, 192, 192));
unhand(self)->pData = (long)pWindow;
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MCanvasPeer_setColor(struct Hsun_awt_win32_MCanvasPeer *self,
long fg,
struct Hjava_awt_Color *c)
{
CHECKHEAP;
AWT_LOCK();
if (c == NULL) {
SignalError(0,JAVAPKG "NullPointerException", "null color");
AWT_UNLOCK();
return;
}
Classjava_awt_Color *cC = (Classjava_awt_Color *)c->obj;
COLORREF color = PALETTERGB((cC->value>>16)&0xff, (cC->value>>8)&0xff, (cC->value)&0xff);
AwtWindow *pWindow = (AwtWindow *)unhand(self)->pData;
AWT_TRACE(("%x:canvasSetColor(%d, %x)\n", self, fg, color));
pWindow->PostMsg(AwtWindow::SETCOLOR, unhand(self)->pData, fg, color);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MCanvasPeer_scroll(struct Hsun_awt_win32_MCanvasPeer *self,
long dx, long dy)
{
CHECKHEAP;
AWT_LOCK();
AwtWindow *pWindow = (AwtWindow *)unhand(self)->pData;
AWT_TRACE(("%x:canvasScroll(%d, %d)\n", self, dx, dy));
pWindow->PostMsg(AwtWindow::SCROLLWND, dx, -dy);
AWT_UNLOCK();
CHECKHEAP;
}
/** CHECKBOX methods **/
void
sun_awt_win32_MCheckboxPeer_create(struct Hsun_awt_win32_MCheckboxPeer *self,
struct Hsun_awt_win32_MComponentPeer *parent)
{
CHECKHEAP;
AWT_LOCK();
Hjava_awt_Checkbox *selfT = (Hjava_awt_Checkbox *)unhand(self)->target;
if (parent == 0 || unhand(parent)->pData == 0 || selfT == NULL) {
SignalError(0,JAVAPKG "NullPointerException", "null parent");
AWT_UNLOCK();
return;
}
Classjava_awt_Checkbox *selfTC = (Classjava_awt_Checkbox *)unhand(selfT);
AwtWindow *pParent = (AwtWindow*)unhand(parent)->pData;
AwtButton *pButton;
char stackBuffer[64];
char *buffer = &stackBuffer[0];
int len = javaStringLength(selfTC->label);
if (len >= sizeof(stackBuffer)) {
buffer = (char *)malloc(len + 1);
}
javaString2CString(selfTC->label, buffer, len + 1);
AWT_TRACE(("%x:checkboxCreate(%s)->", self, buffer));
if (selfTC->group != NULL) {
pButton = AwtButton::CreateRadio(selfT, pParent, buffer);
} else {
pButton = AwtButton::CreateToggle(selfT, pParent, buffer);
}
if (len >= sizeof(stackBuffer)) {
free(buffer);
}
unhand(self)->pData = (long)pButton;
CHECKHEAP;
AWT_UNLOCK();
}
void
sun_awt_win32_MCheckboxPeer_setColor(struct Hsun_awt_win32_MCheckboxPeer *self,
long fg,
struct Hjava_awt_Color *c)
{
CHECKHEAP;
AWT_LOCK();
if (c == NULL) {
SignalError(0,JAVAPKG "NullPointerException", "null color");
AWT_UNLOCK();
return;
}
Classjava_awt_Color *cC = (Classjava_awt_Color *)c->obj;
COLORREF color = PALETTERGB((cC->value>>16)&0xff, (cC->value>>8)&0xff, (cC->value)&0xff);
AwtButton *pButton = (AwtButton*)unhand(self);
AWT_TRACE(("%x:checkboxSetColor(%d, %x)\n", self, fg, color));
pButton->PostMsg(AwtButton::SETCOLOR, unhand(self)->pData, fg, color);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MCheckboxPeer_setCheckboxGroup(struct Hsun_awt_win32_MCheckboxPeer *self,
struct Hjava_awt_CheckboxGroup *group)
{
}
void
sun_awt_win32_MCheckboxPeer_setState(struct Hsun_awt_win32_MCheckboxPeer *self,
long state)
{
CHECKHEAP;
AWT_LOCK();
AwtButton *pButton = (AwtButton*)unhand(self)->pData;
AWT_TRACE(("%x:checkboxSetState(%d)", self, state));
pButton->PostMsg(AwtButton::SETSTATE, state);
AWT_UNLOCK();
CHECKHEAP;
}
long
sun_awt_win32_MCheckboxPeer_getState(struct Hsun_awt_win32_MCheckboxPeer *self)
{
CHECKHEAP;
AWT_LOCK();
long result;
AwtButton *pButton = (AwtButton*)unhand(self)->pData;
AWT_TRACE(("%x:checkboxGetState()->", self));
result = pButton->SendMsg(AwtButton::GETSTATE);
AWT_TRACE(("%d\n", result));
AWT_UNLOCK();
CHECKHEAP;
return result;
}
void
sun_awt_win32_MCheckboxPeer_setLabel(struct Hsun_awt_win32_MCheckboxPeer *self,
struct Hjava_lang_String *label)
{
CHECKHEAP;
AWT_LOCK();
AwtButton *pButton = (AwtButton*)unhand(self)->pData;
int len = javaStringLength(label);
char *buffer;
buffer = (char *)malloc(len + 1);
javaString2CString(label, buffer, len + 1);
AWT_TRACE(("%x:checkboxSetLabel(%s)", self, buffer));
pButton->PostMsg(AwtButton::SETTEXT, (long)buffer);
AWT_UNLOCK();
CHECKHEAP;
}
/** CHOICE methods */
void
sun_awt_win32_MChoicePeer_create(struct Hsun_awt_win32_MChoicePeer *self,
struct Hsun_awt_win32_MComponentPeer *parent)
{
CHECKHEAP;
AWT_LOCK();
if (parent == 0 || unhand(parent)->pData == NULL) {
SignalError(0, JAVAPKG "NullPointerException", "null parent");
AWT_UNLOCK();
return;
}
AwtWindow *pParent = (AwtWindow *)unhand(parent)->pData;
Hjava_awt_Choice *selfT = (Hjava_awt_Choice*)unhand(self)->target;
AWT_TRACE(("%x:choiceCreate(%x)->", self, parent));
AwtOptionMenu *pChoice = AwtOptionMenu::Create(selfT, pParent);
unhand(self)->pData = (long)pChoice;
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MChoicePeer_setColor(struct Hsun_awt_win32_MChoicePeer *self,
long fg,
struct Hjava_awt_Color *c)
{
CHECKHEAP;
AWT_LOCK();
if (c == NULL) {
SignalError(0,JAVAPKG "NullPointerException", "null color");
AWT_UNLOCK();
return;
}
Classjava_awt_Color *cC = (Classjava_awt_Color *)c->obj;
COLORREF color = PALETTERGB((cC->value>>16)&0xff, (cC->value>>8)&0xff, (cC->value)&0xff);
AwtOptionMenu *pChoice = (AwtOptionMenu *)unhand(self)->pData;
AWT_TRACE(("%x:choiceSetColor(%d, %x)\n", self, fg, color));
pChoice->PostMsg(AwtOptionMenu::SETCOLOR, unhand(self)->pData, fg, color);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MChoicePeer_addItem(struct Hsun_awt_win32_MChoicePeer *self,
struct Hjava_lang_String *item,
long index)
{
CHECKHEAP;
AWT_LOCK();
if (item == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null item");
AWT_UNLOCK();
return;
}
AwtOptionMenu *pChoice = (AwtOptionMenu *)unhand(self)->pData;
int len = javaStringLength(item);
char *buffer;
buffer = (char *)malloc(len + 1);
javaString2CString(item, buffer, len + 1);
AWT_TRACE(("%x:choiceAddItem(%s, %d)\n", self, buffer, index));
pChoice->PostMsg(AwtOptionMenu::ADDITEM, (long)buffer, index);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MChoicePeer_select(struct Hsun_awt_win32_MChoicePeer *self,
long index)
{
CHECKHEAP;
AWT_LOCK();
AwtOptionMenu *pChoice = (AwtOptionMenu *)unhand(self)->pData;
if (pChoice == NULL) {
SignalError(0, JAVAPKG "NullPointerException", 0);
AWT_UNLOCK();
return;
}
// range checking is done by target.
AWT_TRACE(("%x:choiceSelect(%d)\n", self, index));
pChoice->PostMsg(AwtOptionMenu::SELECT, index);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MChoicePeer_remove(struct Hsun_awt_win32_MChoicePeer *self,
long index)
{
CHECKHEAP;
AWT_LOCK();
AwtOptionMenu *pChoice = (AwtOptionMenu *)unhand(self)->pData;
if (pChoice == NULL) {
SignalError(0, JAVAPKG "NullPointerException", 0);
AWT_UNLOCK();
return;
}
AWT_TRACE(("%x:choiceRemove(%d)\n", self, index));
pChoice->PostMsg(AwtOptionMenu::REMOVE, index);
AWT_UNLOCK();
CHECKHEAP;
}
/** COMPONENT methods **/
/*
* Looking at the state variables in target, initialize the component properly.
*/
void
sun_awt_win32_MComponentPeer_pInitialize(struct Hsun_awt_win32_MComponentPeer *self)
{
CHECKHEAP;
AWT_LOCK();
Classsun_awt_win32_MComponentPeer *selfC = unhand(self);
if (selfC->target == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null target");
AWT_UNLOCK();
return;
}
Classjava_awt_Component *selfTC = unhand(selfC->target);
AWT_TRACE(("%x:componentInitialize()\n", self));
AwtComp::PostMsg(AwtComp::INITIALIZE, selfC->pData, selfTC->enabled,
(long)selfC->target);
AWT_UNLOCK();
CHECKHEAP;
}
struct Hjava_awt_Event *
sun_awt_win32_MComponentPeer_setData(struct Hsun_awt_win32_MComponentPeer *self,
long data,
struct Hjava_awt_Event *event)
{
Classjava_awt_Event *eventPtr = unhand(event);
eventPtr->data = data;
return event;
}
long
sun_awt_win32_MComponentPeer_handleEvent(struct Hsun_awt_win32_MComponentPeer *self,
struct Hjava_awt_Event *event)
{
#ifdef NEW_EVENT_MODEL
AWT_LOCK();
Classjava_awt_Event *eventPtr = unhand(event);
if (eventPtr->data != 0) {
DispatchInputEvent(eventPtr);
AWT_UNLOCK();
return 1;
} else {
AWT_UNLOCK();
return 0;
}
#else
return 0;
#endif /* NEW_EVENT_MODEL */
}
void
sun_awt_win32_MComponentPeer_pEnable(struct Hsun_awt_win32_MComponentPeer *self)
{
CHECKHEAP;
AWT_LOCK();
AWT_TRACE(("%x:componentEnable()\n", self));
AwtComp::PostMsg(AwtComp::ENABLE, unhand(self)->pData, TRUE);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MComponentPeer_pDisable(struct Hsun_awt_win32_MComponentPeer *self)
{
CHECKHEAP;
AWT_LOCK();
AWT_TRACE(("%x:componentDisable()\n", self));
AwtComp::PostMsg(AwtComp::ENABLE, unhand(self)->pData, FALSE);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MComponentPeer_pShow(struct Hsun_awt_win32_MComponentPeer *self)
{
CHECKHEAP;
AWT_LOCK();
AWT_TRACE(("%x:componentShow()\n", self));
AwtComp::PostMsg(AwtComp::SHOW, unhand(self)->pData, TRUE);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MComponentPeer_pHide(struct Hsun_awt_win32_MComponentPeer *self)
{
CHECKHEAP;
AWT_LOCK();
AWT_TRACE(("%x:componentHide()\n", self));
AwtComp::PostMsg(AwtComp::SHOW, unhand(self)->pData, FALSE);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MComponentPeer_pReshape(struct Hsun_awt_win32_MComponentPeer *self,
long x,
long y,
long w,
long h)
{
CHECKHEAP;
AWT_LOCK();
AWT_TRACE(("%x:componentReshape(%d %d %d %d)\n", self, x, y, w, h));
AwtComp::PostMsg(AwtComp::RESHAPE, unhand(self)->pData, x, y, w, h);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MComponentPeer_pRepaint(struct Hsun_awt_win32_MComponentPeer *self,
long x,
long y,
long w,
long h)
{
CHECKHEAP;
AWT_LOCK();
Hjava_awt_Component *selfT = (Hjava_awt_Component*)unhand(self)->target;
AWT_TRACE(("%x:componentRepaint(%d %d %d %d)\n", self, x, y, w, h));
if (unhand(self)->pData != NULL) {
AwtComp::PostMsg(AwtComp::REPAINT, unhand(self)->pData, (long)selfT, x, y, w, h);
}
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MComponentPeer_pDispose(struct Hsun_awt_win32_MComponentPeer *self)
{
CHECKHEAP;
AWT_LOCK();
AWT_TRACE(("%x:componentDispose()\n", self));
if (unhand(self)->pData != NULL) {
AwtComp::PostMsg(AwtComp::DISPOSE, unhand(self)->pData);
unhand(self)->pData = NULL;
}
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MComponentPeer_setFont(struct Hsun_awt_win32_MComponentPeer *self,
struct Hjava_awt_Font *f)
{
CHECKHEAP;
AWT_LOCK();
if (f == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null font");
AWT_UNLOCK();
return;
}
Classjava_awt_Font *fC = (Classjava_awt_Font*)unhand(f);
AwtFont *pFont = (AwtFont*)fC->pData;
char stackBuffer[64];
char *buffer = &stackBuffer[0];
int len = -1;
if (pFont == NULL) {
len = javaStringLength(fC->name);
if (len >= sizeof(stackBuffer)) {
buffer = (char *)malloc(len + 1);
}
javaString2CString(fC->name, buffer, len + 1);
AWT_TRACE(("<%x:creatingFont(%s, %d, %d)>\n", f, buffer, fC->style, fC->size));
pFont = AwtFont::Create(buffer, fC->style, fC->size);
}
AWT_TRACE(("%x:componentSetFont(%x)\n", self, f));
AwtComp::PostMsg(AwtComp::SETFONT, unhand(self)->pData, (long)pFont);
if (fC->pData != NULL && len >= 0) {
free(buffer);
}
fC->pData = (long)pFont;
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MComponentPeer_setForeground(struct Hsun_awt_win32_MComponentPeer *self,
struct Hjava_awt_Color *c)
{
CHECKHEAP;
AWT_LOCK();
if (c == NULL) {
SignalError(0,JAVAPKG "NullPointerException", "null color");
AWT_UNLOCK();
return;
}
Classjava_awt_Color *cC = (Classjava_awt_Color *)c->obj;
COLORREF color = PALETTERGB((cC->value>>16)&0xff,
(cC->value>>8)&0xff,
(cC->value)&0xff);
AWT_TRACE(("%x:componentSetForeground(%x)\n", self, color));
AwtComp::PostMsg(AwtComp::SETCOLOR, unhand(self)->pData, TRUE, color);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MComponentPeer_setBackground(struct Hsun_awt_win32_MComponentPeer *self,
struct Hjava_awt_Color *c)
{
CHECKHEAP;
AWT_LOCK();
if (c == NULL) {
SignalError(0,JAVAPKG "NullPointerException", "null color");
AWT_UNLOCK();
return;
}
Classjava_awt_Color *cC = (Classjava_awt_Color *)c->obj;
COLORREF color = PALETTERGB((cC->value>>16)&0xff,
(cC->value>>8)&0xff,
(cC->value)&0xff);
AWT_TRACE(("%x:componentSetBackground(%x)\n", self, color));
AwtComp::PostMsg(AwtComp::SETCOLOR, unhand(self)->pData, FALSE, color);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MComponentPeer_requestFocus(struct Hsun_awt_win32_MComponentPeer *self)
{
CHECKHEAP;
AWT_LOCK();
AWT_TRACE(("%x:componentRequestFocus()\n", self));
AwtComp::PostMsg(AwtComp::SETFOCUS, unhand(self)->pData);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MComponentPeer_nextFocus(struct Hsun_awt_win32_MComponentPeer *self)
{
CHECKHEAP;
AWT_LOCK();
AWT_TRACE(("%x:componentNextFocus()\n", self));
AwtComp::PostMsg(AwtComp::NEXTFOCUS, unhand(self)->pData);
AWT_UNLOCK();
CHECKHEAP;
}
/** FILEDIALOG methods **/
void
sun_awt_win32_MFileDialogPeer_pCreate(struct Hsun_awt_win32_MFileDialogPeer *self,
struct Hsun_awt_win32_MComponentPeer *parent,
long mode,
struct Hjava_lang_String *title,
struct Hjava_lang_String *file)
{
CHECKHEAP;
AWT_LOCK();
if (parent == NULL || unhand(self)->target == NULL) {
SignalError(0, JAVAPKG "NullPointerException", "null parent");
AWT_UNLOCK();
return;
}
MainFrame *pParent = (MainFrame *)unhand(parent)->pData;
Classsun_awt_win32_MFileDialogPeer *selfC = unhand(self);
Hjava_awt_FileDialog *selfT = (Hjava_awt_FileDialog*)selfC->target;
//Classjava_awt_FileDialog *selfTC = unhand(selfT);
char *titleBuffer = NULL, *fileBuffer = NULL;
BOOL bOpen;
if (file != NULL) {
int len = javaStringLength(file);
fileBuffer = (char *)malloc(len + 1);
javaString2CString(file, fileBuffer, len + 1);
} else {
fileBuffer = strdup("*.*");
}
// <<<Need to do something about title>>
bOpen = mode == java_awt_FileDialog_LOAD;
if (title == NULL) {
titleBuffer = bOpen ? strdup("Open") : strdup("Save");
} else {
int len = javaStringLength(title);
titleBuffer = (char *)malloc(len + 1);
javaString2CString(title, titleBuffer, len + 1);
}
AWT_TRACE(("%x:fileDialogCreate(%x, open=%d, title=%s, file=%s)\n", self,
parent, bOpen, titleBuffer, fileBuffer));
AwtFileDialog *pFileDialog = AwtFileDialog::Create(selfT, pParent, bOpen,
titleBuffer, fileBuffer);
unhand(self)->pData = (long)pFileDialog;
free(fileBuffer);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MFileDialogPeer_setDirectory(struct Hsun_awt_win32_MFileDialogPeer *self,
struct Hjava_lang_String *dir)
{
CHECKHEAP;
AWT_LOCK();
AwtFileDialog *pFileDialog = (AwtFileDialog*)unhand(self)->pData;
int len = javaStringLength(dir);
char *buffer;
buffer = (char *)malloc(len + 1);
javaString2CString(dir, buffer, len + 1);
AWT_TRACE(("%x:fileDialogSetDirectory(%s)\n", self, buffer));
pFileDialog->PostMsg(AwtFileDialog::SETDIRECTORY, (long)buffer);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MFileDialogPeer_setFile(struct Hsun_awt_win32_MFileDialogPeer *self,
struct Hjava_lang_String *file)
{
CHECKHEAP;
AWT_LOCK();
AwtFileDialog *pFileDialog = (AwtFileDialog*)unhand(self)->pData;
int len = javaStringLength(file);
char *buffer;
buffer = (char *)malloc(len + 1);
javaString2CString(file, buffer, len + 1);
AWT_TRACE(("%x:fileDialogSetFile(%s)\n", self, buffer));
pFileDialog->PostMsg(AwtFileDialog::SETFILE, (long)buffer);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MFileDialogPeer_pShow(struct Hsun_awt_win32_MFileDialogPeer *self)
{
CHECKHEAP;
AWT_LOCK();
AwtFileDialog *pFileDialog = (AwtFileDialog *)unhand(self)->pData;
AWT_TRACE(("%x:fileDialogShow\n", self));
pFileDialog->SendMsg(AwtFileDialog::SHOW, TRUE);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MFileDialogPeer_pHide(struct Hsun_awt_win32_MFileDialogPeer *self)
{
CHECKHEAP;
AWT_LOCK();
AwtFileDialog *pFileDialog = (AwtFileDialog *)unhand(self)->pData;
AWT_TRACE(("%x:fileDialogHide\n", self));
pFileDialog->SendMsg(AwtFileDialog::SHOW, FALSE);
AWT_UNLOCK();
CHECKHEAP;
}
/** FONT methods **/
void
sun_awt_win32_Win32FontMetrics_init(struct Hsun_awt_win32_Win32FontMetrics *self)
{
CHECKHEAP;
AWT_LOCK();
Classsun_awt_win32_Win32FontMetrics *selfC = (Classsun_awt_win32_Win32FontMetrics *)unhand(self);
if (selfC == NULL || selfC->font == NULL) {
SignalError(0, JAVAPKG "NullPointerException", 0);
AWT_UNLOCK();
return;
}
AWT_TRACE(("%x:fontMetricsInit()\n", self));
AwtFontMetrics::LoadMetrics(self);
AWT_UNLOCK();
CHECKHEAP;
}
long
sun_awt_win32_Win32FontMetrics_stringWidth(struct Hsun_awt_win32_Win32FontMetrics *self,
struct Hjava_lang_String *str)
{
CHECKHEAP;
AWT_LOCK();
HArrayOfChar *data;
if (str == 0 || (data = unhand(str)->value) == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null string");
AWT_UNLOCK();
return 0;
}
long result;
char stackBuffer[64];
char *buffer = &stackBuffer[0];
int len = javaStringLength(str);
if (len >= sizeof(stackBuffer)) {
buffer = (char *)malloc(len + 1);
}
javaString2CString(str, buffer, len + 1);
AWT_TRACE(("%x:fontStringWidth(%s)->", self, buffer));
result = AwtFontMetrics::StringWidth(self, buffer);
AWT_TRACE(("%d\n", result));
if (len >= sizeof(stackBuffer)) {
free(buffer);
}
AWT_UNLOCK();
CHECKHEAP;
return result;
}
long
sun_awt_win32_Win32FontMetrics_charsWidth(struct Hsun_awt_win32_Win32FontMetrics *self,
HArrayOfChar *str, long off, long len)
{
CHECKHEAP;
AWT_LOCK();
Classsun_awt_win32_Win32FontMetrics *selfC = (Classsun_awt_win32_Win32FontMetrics *)unhand(self);
if (str == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null chars");
AWT_UNLOCK();
return 0;
}
if ((len < 0) || (off < 0) || (len + off > (long)obj_length(str))) {
SignalError(0, JAVAPKG "ArrayIndexOutOfBoundsException", 0);
AWT_UNLOCK();
return 0;
}
WCHAR *pStr;
long *widths = unhand(selfC->widths)->body;
long result = 0;
AWT_TRACE(("%x:fontCharsWidth(%s, %d, %d)->", self, "<some chars>", off, len));
for (pStr = unhand(str)->body + off; len; len--) {
if (*pStr < 256) {
result += widths[*pStr++];
}
}
AWT_TRACE(("%d\n", result));
AWT_UNLOCK();
CHECKHEAP;
return result;
}
long
sun_awt_win32_Win32FontMetrics_bytesWidth(struct Hsun_awt_win32_Win32FontMetrics *self,
HArrayOfByte *str, long off, long len)
{
CHECKHEAP;
AWT_LOCK();
Classsun_awt_win32_Win32FontMetrics *selfC = (Classsun_awt_win32_Win32FontMetrics *)unhand(self);
if (str == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null bytes");
AWT_UNLOCK();
return 0;
}
if ((len < 0) || (off < 0) || (len + off > (long)obj_length(str))) {
SignalError(0, JAVAPKG "ArrayIndexOutOfBoundsException", 0);
AWT_UNLOCK();
return 0;
}
char *pStr= unhand(str)->body + off;
long *widths = unhand(unhand(self)->widths)->body;
long result = 0;
AWT_TRACE(("%x:fontBytesWidth(%s, %d, %d)->", self, pStr, off, len));
for (; len; len--) {
result += widths[*pStr++];
}
AWT_TRACE(("%d\n", result));
AWT_UNLOCK();
CHECKHEAP;
return result;
}
/** FRAME methods */
void
sun_awt_win32_MFramePeer_create(struct Hsun_awt_win32_MFramePeer *self,
struct Hsun_awt_win32_MComponentPeer *parent)
{
CHECKHEAP;
AWT_LOCK();
if (unhand(self)->target == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null target");
AWT_UNLOCK();
return;
}
MainFrame *pParent = NULL;
Classsun_awt_win32_MFramePeer *selfC = unhand(self);
Hjava_awt_Frame *selfT = (Hjava_awt_Frame*)selfC->target;
if (parent != NULL) {
pParent = (MainFrame*)unhand(parent)->pData;
}
AWT_TRACE(("%x:frameCreate(%x)\n", self, parent));
MainFrame *pFrame = MainFrame::Create(selfT, TRUE, pParent,
unhand(selfT)->width,
unhand(selfT)->height,
RGB(192, 192, 192));
SET_PDATA(self, pFrame->GetMainWindow());
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MFramePeer_setInsets(struct Hsun_awt_win32_MFramePeer *self,
struct Hjava_awt_Insets *insets)
{
CHECKHEAP;
AWT_LOCK();
AwtWindow *pWindow = (AwtWindow*)unhand(self)->pData;
MainFrame *pFrame = pWindow->GetFrame();
pFrame->SetInsets(insets);
AWT_UNLOCK();
}
void
sun_awt_win32_MFramePeer_pSetIconImage(struct Hsun_awt_win32_MFramePeer *self,
struct Hsun_awt_image_ImageRepresentation *ir)
{
CHECKHEAP;
AWT_LOCK();
if (ir == 0) {
SignalError(0, JAVAPKG "NullPointerException", 0);
AWT_UNLOCK();
return;
}
AwtWindow *pWindow = (AwtWindow*)unhand(self)->pData;
MainFrame *pFrame = pWindow->GetFrame();
AWT_TRACE(("%x:frameSetIcon(%x)\n", self, ir));
pFrame->PostMsg(MainFrame::SETICON, (long)ir);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MFramePeer_setResizable(struct Hsun_awt_win32_MFramePeer *self,
long resizable)
{
CHECKHEAP;
AWT_LOCK();
AwtWindow *pWindow = (AwtWindow*)unhand(self)->pData;
MainFrame *pFrame = pWindow->GetFrame();
AWT_TRACE(("%x:frameSetResizable(%d)\n", self, resizable));
pFrame->PostMsg(MainFrame::SETRESIZABLE, resizable);
AWT_UNLOCK();
CHECKHEAP;
}
// This structure needs to be a CObject subclass, so it can be freed
// (if necessary) during cleanup.
class MenuBarData : public CObject {
public:
DECLARE_DYNAMIC(MenuBarData)
HMENU hMenuBar;
MainFrame *pFrame;
};
IMPLEMENT_DYNAMIC(MenuBarData, CObject)
void
sun_awt_win32_MFramePeer_setMenuBar(struct Hsun_awt_win32_MFramePeer *self,
struct Hjava_awt_MenuBar *mb)
{
CHECKHEAP;
AWT_LOCK();
AwtWindow *pWindow = (AwtWindow*)unhand(self)->pData;
MainFrame *pFrame = pWindow->GetFrame();
if (mb == 0) {
AWT_UNLOCK();
return;
}
if (unhand(self)->target == 0 || pFrame == 0) {
SignalError(0, JAVAPKG "NullPointerException", 0);
AWT_UNLOCK();
return;
}
MenuBarData *pMenuBar = (MenuBarData*)
unhand((Hsun_awt_win32_MMenuPeer*)unhand(mb)->peer)->pData;
AWT_TRACE(("%x:frameSetMenuBar(%x)\n", self, mb));
pFrame->PostMsg(MainFrame::DRAWMENUBAR, (long)pMenuBar->hMenuBar);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MFramePeer_pSetTitle(struct Hsun_awt_win32_MFramePeer *self,
struct Hjava_lang_String *title)
{
CHECKHEAP;
AWT_LOCK();
AwtWindow *pWindow = (AwtWindow*)unhand(self)->pData;
MainFrame *pFrame = pWindow->GetFrame();
int len = javaStringLength(title);
char *buffer = NULL;
if (len > 0) {
buffer = (char *)malloc(len + 1);
javaString2CString(title, buffer, len + 1);
}
AWT_TRACE(("%x:frameSetTitle(%s)\n", self, buffer));
pFrame->PostMsg(MainFrame::SETTEXT, (long)buffer);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MFramePeer_pShow(struct Hsun_awt_win32_MFramePeer *self)
{
CHECKHEAP;
AWT_LOCK();
AwtWindow *pWindow = (AwtWindow*)unhand(self)->pData;
MainFrame *pFrame = pWindow->GetFrame();
AWT_TRACE(("%x:frameShow()\n", self));
AwtComp::PostMsg(AwtComp::SHOW, (long)pFrame, TRUE);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MFramePeer_pHide(struct Hsun_awt_win32_MFramePeer *self)
{
CHECKHEAP;
AWT_LOCK();
AwtWindow *pWindow = (AwtWindow*)unhand(self)->pData;
MainFrame *pFrame = pWindow->GetFrame();
AWT_TRACE(("%x:frameHide()\n", self));
AwtComp::PostMsg(AwtComp::SHOW, (long)pFrame, FALSE);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MFramePeer_pReshape(struct Hsun_awt_win32_MFramePeer *self,
long x, long y,
long w, long h)
{
CHECKHEAP;
AWT_LOCK();
AwtWindow *pWindow = (AwtWindow*)unhand(self)->pData;
MainFrame *pFrame = pWindow->GetFrame();
AWT_TRACE(("%x:frameReshape(%d %d %d %d)\n", self, x, y, w, h));
pFrame->PostMsg(MainFrame::RESHAPE, x, y, w, h);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MFramePeer_setCursor(struct Hsun_awt_win32_MFramePeer *self,
long cursorType)
{
CHECKHEAP;
AWT_LOCK();
AwtWindow *pWindow = (AwtWindow*)unhand(self)->pData;
MainFrame *pFrame = pWindow->GetFrame();
AWT_TRACE(("%x:frameSetCursor(%d)\n", self, cursorType));
pFrame->PostMsg(MainFrame::SETCURSOR, cursorType);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MFramePeer_pDispose(struct Hsun_awt_win32_MFramePeer *self)
{
CHECKHEAP;
AWT_LOCK();
AwtWindow *pWindow = (AwtWindow*)unhand(self)->pData;
MainFrame *pFrame = pWindow->GetFrame();
AWT_TRACE(("%x:frameDispose()\n", self));
pFrame->PostMsg(MainFrame::DISPOSE);
AWT_UNLOCK();
CHECKHEAP;
}
/** GRAPHICS methods */
void
sun_awt_win32_Win32Graphics_create(struct Hsun_awt_win32_Win32Graphics *self,
struct Hsun_awt_win32_MComponentPeer *canvas)
{
CHECKHEAP;
AWT_LOCK();
if (canvas == 0 || unhand(canvas)->pData == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null canvas");
AWT_UNLOCK();
return;
}
AwtWindow *pWindow = (AwtWindow*)unhand(canvas)->pData;
AWT_TRACE(("%x:graphicsCreate(%x)\n", self, canvas));
AwtGraphics *pGraphics = AwtGraphics::Create(self, pWindow);
unhand(self)->pData = (long)pGraphics;
AWT_UNLOCK();
CHECKHEAP;
}
void sun_awt_win32_Win32Graphics_createFromComponent(struct Hsun_awt_win32_Win32Graphics *self,
struct Hsun_awt_win32_MComponentPeer *canvas)
{
CHECKHEAP;
AWT_LOCK();
if (canvas == NULL || unhand(canvas)->pData == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null canvas");
AWT_UNLOCK();
return;
}
AwtWindow *pWindow = (AwtWindow*)unhand(canvas)->pData;
AWT_TRACE(("%x:graphicsCreate(%x)\n", self, canvas));
AwtGraphics *pGraphics = AwtGraphics::Create(self, pWindow);
unhand(self)->pData = (long)pGraphics;
AWT_UNLOCK();
CHECKHEAP;
}
void sun_awt_win32_Win32Graphics_createFromGraphics(struct Hsun_awt_win32_Win32Graphics *self,
struct Hsun_awt_win32_Win32Graphics *g)
{
CHECKHEAP;
AWT_LOCK();
if (g == NULL || unhand(g)->pData == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null graphics");
AWT_UNLOCK();
return;
}
AwtGraphics *pG = (AwtGraphics*)unhand(g)->pData;
AWT_TRACE(("%x:graphicsCreateFromGraphics(%x)\n", self, pG));
AwtGraphics *pGraphics = AwtGraphics::CreateCopy(self, pG);
unhand(self)->pData = (long)pGraphics;
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_Win32Graphics_imageCreate(struct Hsun_awt_win32_Win32Graphics *self,
struct Hsun_awt_image_ImageRepresentation *ir)
{
CHECKHEAP;
AWT_LOCK();
if (self==0 || ir==0) {
SignalError(0, JAVAPKG "NullPointerException", "null image");
AWT_UNLOCK();
return;
}
AwtImage *pImage = image_getpImage(ir);
AWT_TRACE(("%x:graphicsImageCreate(%x)->", self, ir));
AwtGraphics *pGraphics = AwtGraphics::Create(self, pImage);
AWT_TRACE(("%x\n", pGraphics));
unhand(self)->pData = (long)pGraphics;
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_Win32Graphics_pSetFont(struct Hsun_awt_win32_Win32Graphics *self,
struct Hjava_awt_Font *font)
{
CHECKHEAP;
AWT_LOCK();
if (font == 0) {
SignalError(0, JAVAPKG "NullPointerException", 0);
AWT_UNLOCK();
return;
}
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
AwtFont *pFont = AwtFont::GetFont(font);
AWT_TRACE(("%x:graphicsSetFont(%x)\n", self, font));
if (pGraphics != NULL) {
pGraphics->SetFont(pFont);
}
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_Win32Graphics_pSetForeground(struct Hsun_awt_win32_Win32Graphics *self,
struct Hjava_awt_Color *c)
{
CHECKHEAP;
AWT_LOCK();
if (c == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null color");
AWT_UNLOCK();
return;
}
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
Classjava_awt_Color *pColor = (Classjava_awt_Color *)c->obj;
COLORREF color = PALETTERGB((pColor->value>>16)&0xff, (pColor->value>>8)&0xff, (pColor->value)&0xff);
AWT_TRACE(("%x:graphicsSetForeground(%x)\n", self, color));
if (pGraphics != NULL) {
pGraphics->SetColor(color);
}
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_Win32Graphics_dispose(struct Hsun_awt_win32_Win32Graphics *self)
{
CHECKHEAP;
AWT_LOCK();
AwtGraphics *pGraphics = (AwtGraphics*)unhand(self)->pData;
AWT_TRACE(("%x:graphicsDispose()\n", self));
if (pGraphics != NULL) {
pGraphics->Dispose();
unhand(self)->pData = NULL;
}
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_Win32Graphics_drawString(struct Hsun_awt_win32_Win32Graphics *self,
Hjava_lang_String *text,
long x,
long y)
{
CHECKHEAP;
AWT_LOCK();
if (text==0) {
SignalError(0, JAVAPKG "NullPointerException", "null string");
AWT_UNLOCK();
return;
}
AwtGraphics *pGraphics = (AwtGraphics*)unhand(self)->pData;
char *buffer;
int len = javaStringLength(text);
buffer = (char *)malloc(len + 1);
javaString2CString(text, buffer, len + 1);
AWT_TRACE(("%x:graphicsDrawString(%s, %d, %d)\n", self, buffer, x, y));
if (pGraphics != NULL) {
pGraphics->DrawString(buffer, x, y);
}
AWT_UNLOCK();
CHECKHEAP;
}
long
sun_awt_win32_Win32Graphics_drawStringWidth(struct Hsun_awt_win32_Win32Graphics *self,
Hjava_lang_String *text,
long x,
long y)
{
CHECKHEAP;
AWT_LOCK();
long result = -1;
if (text==0) {
SignalError(0, JAVAPKG "NullPointerException", "null string");
AWT_UNLOCK();
return result;
}
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
char *buffer;
int len = javaStringLength(text);
buffer = (char *)malloc(len + 1);
javaString2CString(text, buffer, len + 1);
AWT_TRACE(("%x:graphicsDrawStringWidth(%s, %d, %d)->", self, buffer, x, y));
if (pGraphics != NULL) {
result = pGraphics->DrawStringWidth(buffer, x, y);
}
AWT_TRACE(("%d\n", result));
AWT_UNLOCK();
CHECKHEAP;
return result;
}
void
sun_awt_win32_Win32Graphics_drawChars(struct Hsun_awt_win32_Win32Graphics *self,
HArrayOfChar *text,
long offset,
long length,
long x,
long y)
{
CHECKHEAP;
AWT_LOCK();
if (text == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null chars");
AWT_UNLOCK();
return;
}
if (offset < 0 || length < 0 || offset + length > (long)obj_length(text)) {
SignalError(0, JAVAPKG "ArrayIndexOutOfBoundsException", 0);
AWT_UNLOCK();
return;
}
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
WCHAR *pSrc= unhand(text)->body + offset;
char *buffer;
int i;
buffer = (char *)malloc(length + 1);
for (i=0; i<length; i++) {
buffer[i] = (char)pSrc[i];
}
buffer[length] = 0;
AWT_TRACE(("%x:graphicsDrawChars(%s, %d, %d, %d, %d)\n", self, buffer, offset, length, x, y));
if (pGraphics != NULL) {
pGraphics->DrawString(buffer, x, y);
}
AWT_UNLOCK();
CHECKHEAP;
}
long
sun_awt_win32_Win32Graphics_drawCharsWidth(struct Hsun_awt_win32_Win32Graphics *self,
HArrayOfChar *text,
long offset,
long length,
long x,
long y)
{
CHECKHEAP;
AWT_LOCK();
long result = -1;
if (text == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null chars");
AWT_UNLOCK();
return result;
}
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
WCHAR *pSrc= unhand(text)->body + offset;
char *buffer;
int i;
buffer = (char *)malloc(length + 1);
for (i=0; i<length; i++) {
buffer[i] = (char)pSrc[i];
}
buffer[length] = 0;
AWT_TRACE(("%x:graphicsDrawCharsWidth(%s, %d, %d, %d, %d)->", self, buffer, offset, length, x, y));
if (pGraphics != NULL) {
result = pGraphics->DrawStringWidth(buffer, x, y);
}
AWT_TRACE(("%d\n", result));
AWT_UNLOCK();
CHECKHEAP;
return result;
}
void
sun_awt_win32_Win32Graphics_drawBytes(struct Hsun_awt_win32_Win32Graphics *self,
HArrayOfByte *text,
long offset,
long length,
long x,
long y)
{
CHECKHEAP;
AWT_LOCK();
if (text == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null bytes");
AWT_UNLOCK();
return;
}
if (offset < 0 || length < 0 || offset + length > (long)obj_length(text)) {
SignalError(0, JAVAPKG "ArrayIndexOutOfBoundsException", 0);
AWT_UNLOCK();
return;
}
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
char *pSrc= unhand(text)->body + offset;
char *buffer;
buffer = (char *)malloc(length + 1);
memcpy(buffer, pSrc, length);
buffer[length] = 0;
AWT_TRACE(("%x:graphicsDrawBytes(%s, %d, %d, %d, %d)\n", self, buffer, offset, length, x, y));
if (pGraphics != NULL) {
pGraphics->DrawString(buffer, x, y);
}
AWT_UNLOCK();
CHECKHEAP;
}
long
sun_awt_win32_Win32Graphics_drawBytesWidth(struct Hsun_awt_win32_Win32Graphics *self,
HArrayOfByte *text,
long offset,
long length,
long x,
long y)
{
CHECKHEAP;
AWT_LOCK();
long result = -1;
if (text == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null bytes");
AWT_UNLOCK();
return result;
}
if (offset < 0 || length < 0 || offset + length > (long)obj_length(text)) {
SignalError(0, JAVAPKG "ArrayIndexOutOfBoundsException", 0);
AWT_UNLOCK();
return result;
}
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
char *pSrc= unhand(text)->body + offset;
char *buffer;
buffer = (char *)malloc(length + 1);
memcpy(buffer, pSrc, length);
buffer[length] = 0;
AWT_TRACE(("%x:graphicsDrawBytesWidth(%s, %d, %d, %d, %d)", self, buffer, offset, length, x, y));
if (pGraphics != NULL) {
result = pGraphics->DrawStringWidth(buffer, x, y);
}
AWT_TRACE(("%d\n", result));
AWT_UNLOCK();
CHECKHEAP;
return result;
}
void
sun_awt_win32_Win32Graphics_drawLine(struct Hsun_awt_win32_Win32Graphics *self,
long x1, long y1,
long x2, long y2)
{
CHECKHEAP;
AWT_LOCK();
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
AWT_TRACE(("%x:graphicsDrawLine(%d, %d, %d, %d)\n", self, x1, y1, x2, y2));
if (pGraphics != NULL) {
pGraphics->DrawLine(x1, y1, x2, y2);
}
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_Win32Graphics_clearRect(struct Hsun_awt_win32_Win32Graphics *self,
long x,
long y,
long w,
long h)
{
CHECKHEAP;
AWT_LOCK();
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
AWT_TRACE(("%x:graphicsClearRect(%d, %d, %d, %d)\n",
self, x, y, w, h));
if (pGraphics != NULL) {
pGraphics->ClearRect(x, y, w, h);
}
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_Win32Graphics_fillRect(struct Hsun_awt_win32_Win32Graphics *self,
long x,
long y,
long w,
long h)
{
CHECKHEAP;
AWT_LOCK();
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
AWT_TRACE(("%x:graphicsFillRect(%d, %d, %d, %d)\n",
self, x, y, w, h));
if (pGraphics != NULL) {
pGraphics->FillRect(x, y, w, h);
}
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_Win32Graphics_drawRect(struct Hsun_awt_win32_Win32Graphics *self,
long x,
long y,
long w,
long h)
{
CHECKHEAP;
AWT_LOCK();
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
AWT_TRACE(("%x:graphicsDrawRect(%d, %d, %d, %d)\n",
self, x, y, w, h));
if (pGraphics != NULL) {
pGraphics->DrawRect(x, y, w, h);
}
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_Win32Graphics_drawRoundRect(struct Hsun_awt_win32_Win32Graphics *self,
long x, long y, long w, long h,
long arcWidth, long arcHeight)
{
CHECKHEAP;
AWT_LOCK();
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
AWT_TRACE(("%x:graphicsDrawRoundRect(%d, %d, %d, %d, %d, %d)\n",
self, x, y, w, h, arcWidth, arcHeight));
if (pGraphics != NULL) {
pGraphics->RoundRect(x, y, w, h, arcWidth, arcHeight);
}
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_Win32Graphics_fillRoundRect(struct Hsun_awt_win32_Win32Graphics *self,
long x, long y, long w, long h,
long arcWidth, long arcHeight)
{
CHECKHEAP;
AWT_LOCK();
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
AWT_TRACE(("%x:graphicsFillRoundRect(%d, %d, %d, %d, %d, %d)\n",
self, x, y, w, h, arcWidth, arcHeight));
if (pGraphics != NULL) {
pGraphics->FillRoundRect(x, y, w, h, arcWidth, arcHeight);
}
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_Win32Graphics_setPaintMode(struct Hsun_awt_win32_Win32Graphics *self)
{
CHECKHEAP;
AWT_LOCK();
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
struct Hjava_awt_Color *fg = unhand(self)->foreground;
if (fg == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null color");
AWT_UNLOCK();
return;
}
Classjava_awt_Color *pColor = (Classjava_awt_Color *)fg->obj;
COLORREF fgcolor = PALETTERGB((pColor->value>>16)&0xff,
(pColor->value>>8)&0xff,
(pColor->value)&0xff);
AWT_TRACE(("%x:graphicsSetPaintMode()\n"));
if (pGraphics != NULL) {
pGraphics->SetRop(R2_COPYPEN, fgcolor, RGB(0, 0, 0));
}
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_Win32Graphics_setXORMode(struct Hsun_awt_win32_Win32Graphics *self,
struct Hjava_awt_Color *c)
{
CHECKHEAP;
AWT_LOCK();
struct Hjava_awt_Color *fg = unhand(self)->foreground;
if (c == 0 || fg == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null color");
AWT_UNLOCK();
return;
}
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
Classjava_awt_Color *pColor = (Classjava_awt_Color *)c->obj;
COLORREF color = PALETTERGB((pColor->value>>16)&0xff,
(pColor->value>>8)&0xff,
(pColor->value)&0xff);
pColor = (Classjava_awt_Color *)fg->obj;
COLORREF fgcolor = PALETTERGB((pColor->value>>16)&0xff,
(pColor->value>>8)&0xff,
(pColor->value)&0xff);
AWT_TRACE(("%x:graphicsSetXORMode()\n"));
if (pGraphics != NULL) {
pGraphics->SetRop(R2_XORPEN, fgcolor, color);
}
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_Win32Graphics_clipRect(struct Hsun_awt_win32_Win32Graphics *self,
long x, long y,
long w, long h)
{
CHECKHEAP;
AWT_LOCK();
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
AWT_TRACE(("%x:graphicsClipRect(%d, %d, %d, %d)\n",
self, x, y, w, h));
if (pGraphics != NULL) {
pGraphics->SetClipRect(x, y, w, h);
}
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_Win32Graphics_getClipRect(struct Hsun_awt_win32_Win32Graphics *self,
struct Hjava_awt_Rectangle *clip)
{
CHECKHEAP;
AWT_LOCK();
RECT rect;
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
if (clip == 0 || pGraphics == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null clip");
AWT_UNLOCK();
return;
}
AWT_TRACE(("%x:graphicsGetClipRect()->"));
if (pGraphics != NULL) {
pGraphics->GetClipRect(&rect);
unhand(clip)->x = rect.left;
unhand(clip)->y = rect.top;
unhand(clip)->width = rect.right - rect.left;
unhand(clip)->height = rect.bottom - rect.top;
AWT_TRACE(("(%d %d %d %d)\n", rect.left, rect.top, rect.right, rect.bottom));
} else {
AWT_TRACE(("** graphics disposed **\n"));
}
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_Win32Graphics_clearClip(struct Hsun_awt_win32_Win32Graphics *self)
{
CHECKHEAP;
AWT_LOCK();
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
AWT_TRACE(("%x:graphicsClearClip()\n", self));
if (pGraphics != NULL) {
pGraphics->ClearClipRect();
}
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_Win32Graphics_copyArea(struct Hsun_awt_win32_Win32Graphics *self,
long x, long y,
long width, long height,
long dx, long dy)
{
CHECKHEAP;
AWT_LOCK();
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
AWT_TRACE(("%x:graphicsCopyArea(%d, %d, %d, %d, %d, %d)\n",
self, x, y, width, height, dx, dy));
if (pGraphics != NULL) {
pGraphics->CopyArea(dx+x, dy+y, x, y, width, height);
}
AWT_UNLOCK();
CHECKHEAP;
}
static POINT *
transformPoints(struct Hsun_awt_win32_Win32Graphics *self,
HArrayOfInt *xpoints,
HArrayOfInt *ypoints,
long npoints)
{
static POINT *points;
static int points_length = 0;
ArrayOfInt *xpoints_array = unhand(xpoints);
ArrayOfInt *ypoints_array = unhand(ypoints);
int i;
if ((int)obj_length(ypoints) < npoints || (int)obj_length(xpoints) < npoints) {
SignalError(0, JAVAPKG "IllegalArgumentException", 0);
return 0;
}
if (points_length < npoints) {
if (points_length != 0) {
free((void *)points);
}
points = (POINT*)malloc(sizeof(POINT) * npoints);
if (points == 0) {
SignalError(0, JAVAPKG "OutOfMemoryError",0);
return 0;
}
points_length = npoints;
}
for (i=0; i<npoints; ++i) {
points[i].x = (xpoints_array->body)[i];
points[i].y = (ypoints_array->body)[i];
}
return points;
}
void
sun_awt_win32_Win32Graphics_drawPolygon(struct Hsun_awt_win32_Win32Graphics *self,
HArrayOfInt *xpoints,
HArrayOfInt *ypoints,
long npoints)
{
CHECKHEAP;
AWT_LOCK();
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
if (pGraphics == NULL || xpoints == NULL || ypoints == NULL) {
SignalError(0, JAVAPKG "NullPointerException", 0);
AWT_UNLOCK();
return;
}
POINT *points = transformPoints(self, xpoints, ypoints, npoints);
if (points == 0) {
AWT_UNLOCK();
return;
}
AWT_TRACE(("%x:graphicsPolygon(n=%d)\n", self, npoints));
pGraphics->Polygon(points, npoints);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_Win32Graphics_fillPolygon(struct Hsun_awt_win32_Win32Graphics *self,
HArrayOfInt *xpoints,
HArrayOfInt *ypoints,
long npoints)
{
CHECKHEAP;
AWT_LOCK();
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
if (pGraphics == NULL || xpoints == NULL || ypoints == NULL) {
SignalError(0, JAVAPKG "NullPointerException", 0);
AWT_UNLOCK();
return;
}
POINT *points = transformPoints(self, xpoints, ypoints, npoints);
if (points == 0) {
AWT_UNLOCK();
return;
}
AWT_TRACE(("%x:graphicsFillPolygon(n=%d)\n", self, npoints));
pGraphics->FillPolygon(points, npoints);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_Win32Graphics_drawOval(struct Hsun_awt_win32_Win32Graphics *self,
long x, long y, long w, long h)
{
CHECKHEAP;
AWT_LOCK();
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
AWT_TRACE(("%x:graphicsOval(%d, %d, %d, %d)\n",
self, x, y, w, h));
if (pGraphics != NULL) {
pGraphics->Ellipse(x, y, w, h);
} else
DebugBreak();
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_Win32Graphics_fillOval(struct Hsun_awt_win32_Win32Graphics *self,
long x, long y, long w, long h)
{
CHECKHEAP;
AWT_LOCK();
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
AWT_TRACE(("%x:graphicsFillOval(%d, %d, %d, %d)\n",
self, x, y, w, h));
if (pGraphics != NULL) {
pGraphics->FillEllipse(x, y, w, h);
}
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_Win32Graphics_drawArc(struct Hsun_awt_win32_Win32Graphics *self,
long x, long y, long w, long h,
long startAngle, long endAngle)
{
CHECKHEAP;
AWT_LOCK();
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
AWT_TRACE(("%x:graphicsDrawArc(%d, %d, %d, %d %d %d)\n",
self, x, y, w, h, startAngle, endAngle));
if (pGraphics != NULL) {
pGraphics->Arc(x, y, w, h, startAngle, endAngle);
}
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_Win32Graphics_fillArc(struct Hsun_awt_win32_Win32Graphics *self,
long x, long y, long w, long h,
long startAngle, long endAngle)
{
CHECKHEAP;
AWT_LOCK();
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
AWT_TRACE(("%x:graphicsFillArc(%d, %d, %d, %d %d %d)\n",
self, x, y, w, h, startAngle, endAngle));
if (pGraphics != NULL) {
pGraphics->FillArc(x, y, w, h, startAngle, endAngle);
}
AWT_UNLOCK();
CHECKHEAP;
}
/** LABEL methods */
void
sun_awt_win32_MLabelPeer_create(struct Hsun_awt_win32_MLabelPeer *self,
struct Hsun_awt_win32_MComponentPeer *parent)
{
CHECKHEAP;
AWT_LOCK();
if (parent == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null parent");
AWT_UNLOCK();
return;
}
Hjava_awt_Label *selfT = (Hjava_awt_Label*)unhand(self)->target;
AwtWindow *pParent = (AwtWindow*)unhand(parent)->pData;
AWT_TRACE(("%x:labelCreate(%x)\n", self, parent));
AwtLabel *pLabel = AwtLabel::Create(selfT, pParent, NULL);
unhand(self)->pData = (long)pLabel;
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MLabelPeer_setText(struct Hsun_awt_win32_MLabelPeer *self,
Hjava_lang_String *label)
{
char *buffer;
CHECKHEAP;
AWT_LOCK();
AwtLabel *pLabel = (AwtLabel *)unhand(self)->pData;
if (label != 0) {
int len = javaStringLength(label);
buffer = (char *)malloc(len + 1);
javaString2CString(label, buffer, len + 1);
} else {
buffer = (char *)malloc(1);
buffer[0] = 0;
}
AWT_TRACE(("%x:labelSetText(%s)\n", self, (buffer ? buffer : "")));
pLabel->PostMsg(AwtLabel::SETTEXT, (long)buffer);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MLabelPeer_setAlignment(struct Hsun_awt_win32_MLabelPeer *self,
long alignment)
{
CHECKHEAP;
AWT_TRACE(("%x:labelSetAlignment(%ld)\n", self, alignment));
AwtLabel *pLabel = (AwtLabel *)unhand(self)->pData;
pLabel->SetAlignment(alignment);
CHECKHEAP;
}
/** LIST methods */
void
sun_awt_win32_MListPeer_create(struct Hsun_awt_win32_MListPeer *self,
struct Hsun_awt_win32_MComponentPeer *parent)
{
CHECKHEAP;
AWT_LOCK();
if (parent == 0 || unhand(parent)->pData == 0) {
SignalError(0, JAVAPKG "NullPointerException", 0);
AWT_UNLOCK();
return;
}
Hjava_awt_List *selfT = (Hjava_awt_List*)unhand(self)->target;
AwtWindow *pParent = (AwtWindow *)unhand(parent)->pData;
AWT_TRACE(("%x:listCreate(%x)\n", parent));
AwtList *pList = AwtList::Create(selfT, pParent);
unhand(self)->pData = (long)pList;
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MListPeer_setColor(struct Hsun_awt_win32_MListPeer *self,
long fg,
struct Hjava_awt_Color *c)
{
CHECKHEAP;
AWT_LOCK();
if (c == NULL) {
SignalError(0,JAVAPKG "NullPointerException", "null color");
AWT_UNLOCK();
return;
}
Classjava_awt_Color *cC = (Classjava_awt_Color *)c->obj;
COLORREF color = PALETTERGB((cC->value>>16)&0xff, (cC->value>>8)&0xff, (cC->value)&0xff);
AwtList *pList = (AwtList *)unhand(self)->pData;
AWT_TRACE(("%x:listSetColor(%d, %x)\n", self, fg, color));
pList->PostMsg(AwtList::SETCOLOR, unhand(self)->pData, fg, color);
AWT_UNLOCK();
CHECKHEAP;
}
long
sun_awt_win32_MListPeer_isSelected(struct Hsun_awt_win32_MListPeer *self,
long pos)
{
CHECKHEAP;
AWT_LOCK();
AwtList *pList = (AwtList *)unhand(self)->pData;
long result;
AWT_TRACE(("%x:listIsSelected(%d)->", self, pos));
result = pList->SendMsg(AwtList::ISSELECTED, pos);
AWT_TRACE(("%d\n", result));
AWT_UNLOCK();
CHECKHEAP;
return result;
}
void
sun_awt_win32_MListPeer_addItem(struct Hsun_awt_win32_MListPeer *self,
Hjava_lang_String *item,
long index)
{
CHECKHEAP;
AWT_LOCK();
if (item == NULL) {
SignalError(0, JAVAPKG "NullPointerException", "null item");
AWT_UNLOCK();
return;
}
AwtList *pList = (AwtList *)unhand(self)->pData;
int len = javaStringLength(item);
char *buffer;
buffer = (char *)malloc(len + 1);
javaString2CString(item, buffer, len + 1);
AWT_TRACE(("%x:listAddItem(%s)\n", self, buffer));
pList->PostMsg(AwtList::ADDITEM, (long)buffer, index);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MListPeer_makeVisible(struct Hsun_awt_win32_MListPeer *self,
long pos)
{
CHECKHEAP;
AWT_LOCK();
AwtList *pList = (AwtList *)unhand(self)->pData;
AWT_TRACE(("%x:listMakeVisible(%d)\n", self, pos));
pList->PostMsg(AwtList::MAKEVISIBLE, pos);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MListPeer_select(struct Hsun_awt_win32_MListPeer *self,
long pos)
{
CHECKHEAP;
AWT_LOCK();
AwtList *pList = (AwtList *)unhand(self)->pData;
AWT_TRACE(("%x:listSelect(%d)\n", self, pos));
pList->PostMsg(AwtList::SELECT, pos, TRUE);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MListPeer_deselect(struct Hsun_awt_win32_MListPeer *self,
long pos)
{
CHECKHEAP;
AWT_LOCK();
AwtList *pList = (AwtList *)unhand(self)->pData;
AWT_TRACE(("%x:listDeselect(%d)\n", self, pos));
pList->PostMsg(AwtList::SELECT, pos, FALSE);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MListPeer_delItems(struct Hsun_awt_win32_MListPeer *self,
long start, long end)
{
CHECKHEAP;
AWT_LOCK();
AwtList *pList = (AwtList *)unhand(self)->pData;
AWT_TRACE(("%x:listDelItems(%d, %d)\n", self, start, end));
pList->PostMsg(AwtList::DELETEITEMS, start, end);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MListPeer_setMultipleSelections(struct Hsun_awt_win32_MListPeer *self,
long v)
{
CHECKHEAP;
AWT_LOCK();
AwtList *pList = (AwtList *)unhand(self)->pData;
AWT_TRACE(("%x:listSetMultipleSelections(%d)\n", self, v));
pList->PostMsg(AwtList::SETMULTIPLESELECTIONS, v);
AWT_UNLOCK();
CHECKHEAP;
}
/** MTOOLKIT methods */
void
sun_awt_win32_MToolkit_init(struct Hsun_awt_win32_MToolkit *self,
struct Hjava_lang_Thread *parent)
{
CHECKHEAP;
#ifdef HEAPCHECKING_ENABLED
printf("Heap-checking enabled\n");
#endif
AWT_TRACE(("pInit\n"));
((CAwtApp *)AfxGetApp())->Init(self, parent);
CHECKHEAP;
}
void
sun_awt_win32_MToolkit_eventLoop(struct Hsun_awt_win32_MToolkit *self)
{
CHECKHEAP;
AWT_TRACE(("eventLoop\n"));
((CAwtApp *)AfxGetApp())->MainLoop(self);
CHECKHEAP;
}
void
sun_awt_win32_MToolkit_callbackLoop(struct Hsun_awt_win32_MToolkit *self)
{
CHECKHEAP;
AWT_TRACE(("callbackLoop\n"));
((CAwtApp *)AfxGetApp())->CallbackLoop(self);
CHECKHEAP;
}
void
sun_awt_win32_MToolkit_sync(struct Hsun_awt_win32_MToolkit *self)
{
CHECKHEAP;
AWT_TRACE(("sync\n"));
GdiFlush();
CHECKHEAP;
}
long
sun_awt_win32_MToolkit_getScreenHeight(struct Hsun_awt_win32_MToolkit *self)
{
CHECKHEAP;
long result;
HWND hWnd = ::GetDesktopWindow();
HDC hDC = ::GetDC(hWnd);
AWT_TRACE(("%x:getScreenHeight()->", self));
result = ::GetDeviceCaps(hDC, VERTRES);
AWT_TRACE(("%d\n", result));
::ReleaseDC(hWnd, hDC);
CHECKHEAP;
return result;
}
long
sun_awt_win32_MToolkit_getScreenWidth(struct Hsun_awt_win32_MToolkit *self)
{
CHECKHEAP;
long result;
HWND hWnd = ::GetDesktopWindow();
HDC hDC = ::GetDC(hWnd);
AWT_TRACE(("%x:getScreenWidth()->", self));
result = ::GetDeviceCaps(hDC, HORZRES);
AWT_TRACE(("%d\n", result));
::ReleaseDC(hWnd, hDC);
CHECKHEAP;
return result;
}
long
sun_awt_win32_MToolkit_getScreenResolution(struct Hsun_awt_win32_MToolkit *self)
{
CHECKHEAP;
long result;
HWND hWnd = ::GetDesktopWindow();
HDC hDC = ::GetDC(hWnd);
AWT_TRACE(("%x:getScreenResolution()->", self));
result = ::GetDeviceCaps(hDC, LOGPIXELSX);
AWT_TRACE(("%d\n", result));
::ReleaseDC(hWnd, hDC);
CHECKHEAP;
return result;
}
struct Hjava_awt_image_ColorModel *
sun_awt_win32_MToolkit_makeColorModel(struct Hsun_awt_win32_MToolkit *self)
{
struct Hjava_awt_image_ColorModel *result;
AWT_TRACE(("%x:makeColorModel()->", self));
result = AwtImage::getColorModel();
AWT_TRACE(("%x\n", result));
CHECKHEAP;
return result;
}
/** MENU methods */
void
sun_awt_win32_MMenuPeer_createMenu(struct Hsun_awt_win32_MMenuPeer *self,
struct Hjava_awt_MenuBar *parent)
{
CHECKHEAP;
AWT_LOCK();
Hjava_awt_Menu *selfT = (Hjava_awt_Menu *)unhand(self)->target;
Classjava_awt_Menu *selfTC = unhand(selfT);
if (parent == 0 || selfTC == 0) {
SignalError(0, JAVAPKG "NullPointerException", 0);
AWT_UNLOCK();
return;
}
Hsun_awt_win32_MMenuBarPeer *parentP = (Hsun_awt_win32_MMenuBarPeer*)unhand(parent)->peer;
MenuBarData *pMenuBarData = (MenuBarData*)unhand(parentP)->pData;
char stackBuffer[64];
char *buffer = &stackBuffer[0];
int len = javaStringLength(selfTC->label);
if (len >= sizeof(stackBuffer)) {
buffer = (char *)malloc(len + 1);
}
javaString2CString(selfTC->label, buffer, len + 1);
AWT_TRACE(("%x:menuCreate(%x, %s, font=%x, tearoff=%d, ishelp=%d, enabled=%d)\n",
self, parentP, buffer, selfTC->font, selfTC->tearOff,
selfTC->isHelpMenu, selfTC->enabled));
AwtMenu *pMenu = AwtMenu::Create(selfT, pMenuBarData->pFrame, pMenuBarData->hMenuBar, buffer);
if (!selfTC->enabled) {
pMenu->PostMsg(AwtMenu::ENABLE, selfTC->enabled);
}
if (len >= sizeof(stackBuffer)) {
free(buffer);
}
unhand(self)->pData = (long)pMenu;
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MMenuPeer_createSubMenu(struct Hsun_awt_win32_MMenuPeer *self,
struct Hjava_awt_Menu *parent)
{
CHECKHEAP;
AWT_LOCK();
Hjava_awt_Menu *selfT = (Hjava_awt_Menu *)unhand(self)->target;
Classjava_awt_Menu *selfTC = unhand(selfT);
if (parent == 0 || selfT == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null parent");
AWT_UNLOCK();
return;
}
Hsun_awt_win32_MMenuPeer *parentP = (Hsun_awt_win32_MMenuPeer*)unhand(parent)->peer;
AwtMenu *pParent = (AwtMenu*)unhand(parentP)->pData;
char stackBuffer[64];
char *buffer = &stackBuffer[0];
int len = javaStringLength(selfTC->label);
if (len >= sizeof(stackBuffer)) {
buffer = (char *)malloc(len + 1);
}
javaString2CString(selfTC->label, buffer, len + 1);
AWT_TRACE(("%x:menuCreateSub(%x %d)\n", self, parentP, selfTC->enabled));
AwtMenu *pSubMenu = AwtMenu::Create(selfT, pParent->GetFrame(), pParent->m_hMenu, buffer);
if (!selfTC->enabled) {
pSubMenu->PostMsg(AwtMenu::ENABLE, selfTC->enabled);
}
if (len >= sizeof(stackBuffer)) {
free(buffer);
}
unhand(self)->pData = (long)pSubMenu;
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MMenuPeer_pEnable(struct Hsun_awt_win32_MMenuPeer *self,
long enable)
{
CHECKHEAP;
AWT_LOCK();
AWT_TRACE(("%x:menuEnable(%d)\n", self, enable));
AwtMenu *pMenu = (AwtMenu *)unhand(self)->pData;
pMenu->PostMsg(AwtMenu::ENABLE, enable);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MMenuPeer_dispose(struct Hsun_awt_win32_MMenuPeer *self)
{
CHECKHEAP;
AWT_LOCK();
AwtMenu *pMenu = (AwtMenu *)unhand(self)->pData;
AWT_TRACE(("%x:menuDispose()\n", self));
if (pMenu != NULL) {
unhand(self)->pData = NULL;
pMenu->PostMsg(AwtMenu::DISPOSE);
}
AWT_UNLOCK();
CHECKHEAP;
}
/** MENUBAR methods */
void
sun_awt_win32_MMenuBarPeer_create(struct Hsun_awt_win32_MMenuBarPeer *self,
struct Hjava_awt_Frame *frame)
{
CHECKHEAP;
AWT_LOCK();
if (frame == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null frame");
AWT_UNLOCK();
return;
}
MenuBarData *pData = new MenuBarData();
((CAwtApp*)AfxGetApp())->cleanupListAdd((CObject*)pData);
Hsun_awt_win32_MFramePeer *frameP = (Hsun_awt_win32_MFramePeer*)unhand(frame)->peer;
AwtWindow *pWindow = (AwtWindow*)unhand(frameP)->pData;
MainFrame *pFrame = pWindow->GetFrame();
pData->pFrame = pFrame;
pData->hMenuBar = pFrame->CreateMenuBar();
ASSERT(pData->hMenuBar != NULL);
AWT_TRACE(("%x:menuBarCreate(%x)\n", self, frameP));
pFrame->PostMsg(MainFrame::DRAWMENUBAR, (long)pData->hMenuBar);
unhand(self)->pData = (long)pData;
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MMenuBarPeer_dispose(struct Hsun_awt_win32_MMenuBarPeer *self)
{
CHECKHEAP;
AWT_LOCK();
MenuBarData *pData = (MenuBarData *)unhand(self)->pData;
AWT_TRACE(("%x:menuBarDispose()\n", self));
if (pData != NULL) {
((CAwtApp*)AfxGetApp())->cleanupListRemove((CObject*)pData);
unhand(self)->pData = NULL;
pData->pFrame->PostMsg(MainFrame::DISPOSEMENUBAR, (long)pData->hMenuBar);
delete pData;
}
AWT_UNLOCK();
CHECKHEAP;
}
/** MENUITEM methods */
// This structure needs to be a CObject subclass, so it can be freed
// (if necessary) during cleanup.
class MenuItemData : public CObject {
public:
DECLARE_DYNAMIC(MenuItemData)
// The menu that contains this item.
AwtMenu *pMenu;
// The menu item id.
UINT nID;
};
IMPLEMENT_DYNAMIC(MenuItemData, CObject)
void
sun_awt_win32_MMenuItemPeer_create(struct Hsun_awt_win32_MMenuItemPeer *self,
struct Hjava_awt_Menu *parent)
{
CHECKHEAP;
AWT_LOCK();
if (parent == 0) {
SignalError(0, JAVAPKG "NullPointerException", "parent null");
AWT_UNLOCK();
return;
}
Hsun_awt_win32_MMenuPeer *parentP = (Hsun_awt_win32_MMenuPeer*)unhand(parent)->peer;
Hjava_awt_MenuItem *selfT = unhand(self)->target;
Classjava_awt_MenuItem *selfTC = unhand(unhand(self)->target);
Classsun_awt_win32_MMenuItemPeer *selfC = unhand(self);
MenuItemData *pMenuItem = new MenuItemData();
((CAwtApp*)AfxGetApp())->cleanupListAdd((CObject*)pMenuItem);
AwtMenu *pMenu = (AwtMenu *)(unhand(parentP)->pData);
char stackBuffer[64];
char *buffer = &stackBuffer[0];
int len = javaStringLength(selfTC->label);
if (len >= sizeof(stackBuffer)) {
buffer = (char *)malloc(len + 1);
}
javaString2CString(selfTC->label, buffer, len + 1);
pMenuItem->pMenu = pMenu;
AWT_TRACE(("%x:menuItemCreate(%x, %s, %d)\n", self, parentP, buffer,
selfTC->enabled));
if (!strcmp(buffer, "-")) {
pMenu->PostMsg(AwtMenu::APPENDSEPARATOR);
} else {
pMenuItem->nID = pMenu->SendMsg(AwtMenu::APPENDITEM, (long)selfT, (long)buffer);
if (!selfTC->enabled) {
pMenu->PostMsg(AwtMenu::ENABLEITEM, pMenuItem->nID, FALSE);
}
if (selfC->isCheckbox) {
Classjava_awt_CheckboxMenuItem *pC = (Classjava_awt_CheckboxMenuItem*)selfTC;
if (pC->state) {
pMenu->PostMsg(AwtMenu::SETMARK, pMenuItem->nID, TRUE);
}
}
if (len >= sizeof(stackBuffer)) {
free(buffer);
}
unhand(self)->pData = (long)pMenuItem;
}
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MMenuItemPeer_pEnable(struct Hsun_awt_win32_MMenuItemPeer *self,
long enable)
{
CHECKHEAP;
AWT_LOCK();
Classsun_awt_win32_MMenuItemPeer *selfC = unhand(self);
MenuItemData *pMenuItem = (MenuItemData*)selfC->pData;
AWT_TRACE(("%x:menuItemEnable(%d)\n", self, enable));
pMenuItem->pMenu->PostMsg(AwtMenu::ENABLEITEM, pMenuItem->nID, enable);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MMenuItemPeer_dispose(struct Hsun_awt_win32_MMenuItemPeer *self)
{
CHECKHEAP;
AWT_LOCK();
Classsun_awt_win32_MMenuItemPeer *selfC = unhand(self);
MenuItemData *pMenuItem = (MenuItemData*)selfC->pData;
AWT_TRACE(("%x:menuItemDispose()\n", self));
if (pMenuItem != NULL) {
((CAwtApp*)AfxGetApp())->cleanupListRemove((CObject*)pMenuItem);
pMenuItem->pMenu->PostMsg(AwtMenu::DISPOSEITEM, pMenuItem->nID);
unhand(self)->pData = NULL;
delete pMenuItem;
}
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MCheckboxMenuItemPeer_setState(struct Hsun_awt_win32_MCheckboxMenuItemPeer *self,
long state)
{
CHECKHEAP;
AWT_LOCK();
Classsun_awt_win32_MCheckboxMenuItemPeer *selfC = unhand(self);
MenuItemData *pMenuItem = (MenuItemData*)selfC->pData;
AWT_TRACE(("%x:menuItemSetState(%d)\n", self, state));
pMenuItem->pMenu->PostMsg(AwtMenu::SETMARK, pMenuItem->nID, state);
AWT_UNLOCK();
CHECKHEAP;
}
long
sun_awt_win32_MCheckboxMenuItemPeer_getState(struct Hsun_awt_win32_MCheckboxMenuItemPeer *self)
{
CHECKHEAP;
AWT_LOCK();
long result;
Classsun_awt_win32_MCheckboxMenuItemPeer *selfC = unhand(self);
MenuItemData *pMenuItem = (MenuItemData*)selfC->pData;
AWT_TRACE(("%x:menuItemGetState()->", self));
result = pMenuItem->pMenu->SendMsg(AwtMenu::ISMARKED, pMenuItem->nID);
AWT_TRACE(("%d\n", result));
AWT_UNLOCK();
CHECKHEAP;
return result;
}
/** SCROLLBAR methods */
void
sun_awt_win32_MScrollbarPeer_pCreate(struct Hsun_awt_win32_MScrollbarPeer *self,
struct Hsun_awt_win32_MComponentPeer *parent)
{
CHECKHEAP;
AWT_LOCK();
if (parent == 0 || unhand(self)->target == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null parent");
AWT_UNLOCK();
return;
}
Hjava_awt_Scrollbar *selfT = (Hjava_awt_Scrollbar*)unhand(self)->target;
Classjava_awt_Scrollbar *selfTC = unhand(selfT);
AwtWindow *pParent = (AwtWindow *)unhand(parent)->pData;
AWT_TRACE(("%x:scrollbarCreate(%x, vert=%d)->", self, parent,
selfTC->orientation == java_awt_Scrollbar_VERTICAL));
AwtScrollbar *pScrollbar = AwtScrollbar::Create(selfT, pParent,
selfTC->orientation == java_awt_Scrollbar_VERTICAL, FALSE);
unhand(self)->pData = (long)pScrollbar;
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MScrollbarPeer_setColor(struct Hsun_awt_win32_MScrollbarPeer *self,
long fg,
struct Hjava_awt_Color *c)
{
CHECKHEAP;
AWT_LOCK();
if (c == NULL) {
SignalError(0,JAVAPKG "NullPointerException", "null color");
AWT_UNLOCK();
return;
}
Classjava_awt_Color *cC = (Classjava_awt_Color *)c->obj;
COLORREF color = PALETTERGB((cC->value>>16)&0xff, (cC->value>>8)&0xff, (cC->value)&0xff);
AwtScrollbar *pScrollbar = (AwtScrollbar *)unhand(self)->pData;
AWT_TRACE(("%x:scrollbarSetColor(%d, %x)\n", self, fg, color));
pScrollbar->PostMsg(AwtScrollbar::SETCOLOR, unhand(self)->pData, fg, color);
AWT_UNLOCK();
CHECKHEAP;
}
long
sun_awt_win32_MScrollbarPeer_minimum(struct Hsun_awt_win32_MScrollbarPeer *self)
{
CHECKHEAP;
AWT_LOCK();
AwtScrollbar *pScrollbar = (AwtScrollbar *)unhand(self)->pData;
long result;
AWT_TRACE(("%x:scrollbarMinimum()->", self));
result = pScrollbar->SendMsg(AwtScrollbar::MINIMUM);
AWT_TRACE(("%d\n", result));
AWT_UNLOCK();
CHECKHEAP;
return result;
}
long
sun_awt_win32_MScrollbarPeer_maximum(struct Hsun_awt_win32_MScrollbarPeer *self)
{
CHECKHEAP;
AWT_LOCK();
AwtScrollbar *pScrollbar = (AwtScrollbar *)unhand(self)->pData;
long result;
AWT_TRACE(("%x:scrollbarMaximum()->", self));
result = pScrollbar->SendMsg(AwtScrollbar::MAXIMUM);
AWT_TRACE(("%d\n", result));
AWT_UNLOCK();
CHECKHEAP;
return result;
}
long
sun_awt_win32_MScrollbarPeer_value(struct Hsun_awt_win32_MScrollbarPeer *self)
{
CHECKHEAP;
AWT_LOCK();
AwtScrollbar *pScrollbar = (AwtScrollbar *)unhand(self)->pData;
long result;
AWT_TRACE(("%x:scrollbarValue()->", self));
result = pScrollbar->SendMsg(AwtScrollbar::VALUE);
AWT_TRACE(("%d\n", result));
AWT_UNLOCK();
CHECKHEAP;
return result;
}
void
sun_awt_win32_MScrollbarPeer_setValue(struct Hsun_awt_win32_MScrollbarPeer *self, long value)
{
CHECKHEAP;
AWT_LOCK();
AwtScrollbar *pScrollbar = (AwtScrollbar *)unhand(self)->pData;
AWT_TRACE(("%x:scrollbarSetValue(%d)\n", self, value));
pScrollbar->PostMsg(AwtScrollbar::SETVALUE, value);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MScrollbarPeer_setValues(struct Hsun_awt_win32_MScrollbarPeer *self,
long value,
long visible,
long minimum,
long maximum)
{
CHECKHEAP;
AWT_LOCK();
AwtScrollbar *pScrollbar = (AwtScrollbar *)unhand(self)->pData;
AWT_TRACE(("%x:scrollbarSetValues(%d, %d, %d, %d)\n", self,
value, visible, minimum, maximum));
pScrollbar->PostMsg(AwtScrollbar::SETVALUES, minimum, value, max(0, maximum - visible));
AWT_UNLOCK();
CHECKHEAP;
}
/** TEXTAREA methods */
void
sun_awt_win32_MTextAreaPeer_create(struct Hsun_awt_win32_MTextAreaPeer *self,
struct Hsun_awt_win32_MComponentPeer *parent)
{
CHECKHEAP;
AWT_LOCK();
if (parent == 0 || unhand(parent)->pData == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null parent");
AWT_UNLOCK();
return;
}
Hjava_awt_TextArea *selfT = (Hjava_awt_TextArea*)unhand(self)->target;
Classjava_awt_TextArea *selfTC = (Classjava_awt_TextArea*)unhand(selfT);
AwtWindow *pParent = (AwtWindow *)unhand(parent)->pData;
AWT_TRACE(("%x:textAreaCreate(%x, %d, %d)\n", self, parent, selfTC->rows, selfTC->cols));
AwtEdit *pEdit = AwtEdit::Create(selfT, pParent, NULL, NULL, TRUE, selfTC->rows, selfTC->cols);
unhand(self)->pData = (long)pEdit;
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MTextAreaPeer_setColor(struct Hsun_awt_win32_MTextAreaPeer *self,
long fg,
struct Hjava_awt_Color *c)
{
CHECKHEAP;
AWT_LOCK();
if (c == NULL) {
SignalError(0,JAVAPKG "NullPointerException", "null color");
AWT_UNLOCK();
return;
}
Classjava_awt_Color *cC = (Classjava_awt_Color *)c->obj;
COLORREF color = PALETTERGB((cC->value>>16)&0xff, (cC->value>>8)&0xff, (cC->value)&0xff);
AwtEdit *pEdit = (AwtEdit *)unhand(self)->pData;
AWT_TRACE(("%x:textareaSetColor(%d, %x)\n", self, fg, color));
pEdit->PostMsg(AwtEdit::SETCOLOR, unhand(self)->pData, fg, color);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MTextAreaPeer_pSetEditable(struct Hsun_awt_win32_MTextAreaPeer *self,
/*boolean*/ long e)
{
CHECKHEAP;
AWT_LOCK();
AwtEdit *pEdit = (AwtEdit *)unhand(self)->pData;
AWT_TRACE(("%x:textAreaSetEditable(%d)\n", self, e));
pEdit->PostMsg(AwtEdit::SETEDITABLE, e);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MTextAreaPeer_select(struct Hsun_awt_win32_MTextAreaPeer *self,
long selStart, long selEnd)
{
CHECKHEAP;
AWT_LOCK();
AwtEdit *pEdit = (AwtEdit *)unhand(self)->pData;
AWT_TRACE(("%x:textAreaSelect(%d, %d)\n", self, selStart, selEnd));
pEdit->PostMsg(AwtEdit::SETSELECTION, selStart, selEnd);
AWT_UNLOCK();
CHECKHEAP;
}
long
sun_awt_win32_MTextAreaPeer_getSelectionStart(struct Hsun_awt_win32_MTextAreaPeer *self)
{
CHECKHEAP;
AWT_LOCK();
AwtEdit *pEdit = (AwtEdit *)unhand(self)->pData;
long result;
AWT_TRACE(("%x:textAreaGetSelectionStart()->", self));
result = pEdit->SendMsg(AwtEdit::GETSELECTIONSTART);
AWT_TRACE(("%d\n", result));
AWT_UNLOCK();
CHECKHEAP;
return result;
}
long
sun_awt_win32_MTextAreaPeer_getSelectionEnd(struct Hsun_awt_win32_MTextAreaPeer *self)
{
CHECKHEAP;
AWT_LOCK();
AwtEdit *pEdit = (AwtEdit *)unhand(self)->pData;
long result;
AWT_TRACE(("%x:textAreaGetSelectionEnd()->", self));
result = pEdit->SendMsg(AwtEdit::GETSELECTIONEND);
AWT_TRACE(("%d\n", result));
AWT_UNLOCK();
CHECKHEAP;
return result;
}
void
sun_awt_win32_MTextAreaPeer_setText(struct Hsun_awt_win32_MTextAreaPeer *self,
Hjava_lang_String *txt)
{
CHECKHEAP;
AWT_LOCK();
if (txt == 0) {
SignalError(0,JAVAPKG "NullPointerException", "null text");
AWT_UNLOCK();
return;
}
AwtEdit *pEdit = (AwtEdit *)unhand(self)->pData;
int nLen = javaStringLength(txt);
char *pBuffer;
// Let's allocate a more space which may prevent a another malloc.
int nBufferLen = nLen + nLen/10 + 1;
pBuffer = (char *)malloc(nBufferLen);
javaString2CString(txt, pBuffer, nBufferLen);
pBuffer = AddCR(pBuffer, nBufferLen);
AWT_TRACE(("%x:textAreaSetText(%s)\n", self, pBuffer));
pEdit->PostMsg(AwtEdit::SETTEXT, (long)pBuffer);
AWT_UNLOCK();
CHECKHEAP;
}
Hjava_lang_String *
sun_awt_win32_MTextAreaPeer_getText(struct Hsun_awt_win32_MTextAreaPeer *self)
{
CHECKHEAP;
AWT_LOCK();
CString string;
int nStringLen;
AwtEdit *pEdit = (AwtEdit *)self->obj->pData;
AWT_TRACE(("%x:textAreaGetText()->", self));
pEdit->SendMsg(AwtEdit::GETTEXT, (long)&string);
nStringLen = RemoveCR(string.GetBuffer(0));
AWT_TRACE(("%d characters\n", nStringLen));
AWT_UNLOCK();
CHECKHEAP;
return makeJavaString(string.GetBuffer(0), nStringLen);
}
void
sun_awt_win32_MTextAreaPeer_insertText(struct Hsun_awt_win32_MTextAreaPeer *self,
Hjava_lang_String *txt,
long pos)
{
CHECKHEAP;
AWT_LOCK();
if (txt == 0) {
SignalError(0,JAVAPKG "NullPointerException", "null text");
AWT_UNLOCK();
return;
}
AwtEdit *pEdit = (AwtEdit *)unhand(self)->pData;
int nLen = javaStringLength(txt);
char *pBuffer;
// Let's allocate a more space which may prevent a another malloc.
int nBufferLen = nLen + nLen/10 + 1;
pBuffer = (char *)malloc(nBufferLen);
javaString2CString(txt, pBuffer, nBufferLen);
pBuffer = AddCR(pBuffer, nBufferLen);
AWT_TRACE(("%x:textAreaInsertText(%d, %s)\n", self, pos, pBuffer));
pEdit->PostMsg(AwtEdit::INSERTTEXT, (long)pBuffer, pos);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MTextAreaPeer_replaceText(struct Hsun_awt_win32_MTextAreaPeer *self,
Hjava_lang_String *txt,
long start,
long end)
{
CHECKHEAP;
AWT_LOCK();
if (txt == 0) {
SignalError(0,JAVAPKG "NullPointerException", "null text");
AWT_UNLOCK();
return;
}
AwtEdit *pEdit = (AwtEdit *)unhand(self)->pData;
int nLen = javaStringLength(txt);
char *pBuffer;
// Let's allocate a more space which may prevent a another malloc.
int nBufferLen = nLen + nLen/10 + 1;
pBuffer = (char *)malloc(nBufferLen);
javaString2CString(txt, pBuffer, nBufferLen);
pBuffer = AddCR(pBuffer, nBufferLen);
AWT_TRACE(("%x:textAreaReplaceText(%s, %d, %d)->\n", self, pBuffer, start, end));
pEdit->PostMsg(AwtEdit::REPLACETEXT, (long)pBuffer, start, end);
AWT_UNLOCK();
CHECKHEAP;
}
/** TEXTFIELD methods */
void
sun_awt_win32_MTextFieldPeer_create(struct Hsun_awt_win32_MTextFieldPeer *self,
struct Hsun_awt_win32_MComponentPeer *parent)
{
CHECKHEAP;
AWT_LOCK();
if (parent==0 ||
unhand(parent)->pData == 0 ||
unhand(self)->target == 0) {
SignalError(0,JAVAPKG "NullPointerException", "null parent");
AWT_UNLOCK();
return;
}
Hjava_awt_TextField *selfT = (Hjava_awt_TextField*)unhand(self)->target;
AwtWindow *pParent = (AwtWindow *)unhand(parent)->pData;
AWT_TRACE(("%x:textFieldCreate(%x)\n", self, parent));
AwtEdit *pEdit = AwtEdit::Create(selfT, pParent, NULL, NULL, TRUE);
unhand(self)->pData = (long)pEdit;
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MTextFieldPeer_setColor(struct Hsun_awt_win32_MTextFieldPeer *self,
long fg,
struct Hjava_awt_Color *c)
{
CHECKHEAP;
AWT_LOCK();
if (c == NULL) {
SignalError(0,JAVAPKG "NullPointerException", "null color");
AWT_UNLOCK();
return;
}
Classjava_awt_Color *cC = (Classjava_awt_Color *)c->obj;
COLORREF color = PALETTERGB((cC->value>>16)&0xff, (cC->value>>8)&0xff, (cC->value)&0xff);
AwtEdit *pEdit = (AwtEdit *)unhand(self)->pData;
AWT_TRACE(("%x:textfieldSetColor(%d, %x)\n", self, fg, color));
pEdit->PostMsg(AwtEdit::SETCOLOR, unhand(self)->pData, fg, color);
AWT_UNLOCK();
CHECKHEAP;
}
struct Hjava_lang_String *
sun_awt_win32_MTextFieldPeer_getText(struct Hsun_awt_win32_MTextFieldPeer *self)
{
CHECKHEAP;
AWT_LOCK();
CString string;
AwtEdit *pEdit = (AwtEdit *)unhand(self)->pData;
AWT_TRACE(("%x:textFieldGetText()->", self));
pEdit->SendMsg(AwtEdit::GETTEXT, (long)&string);
AWT_TRACE(("%s\n", string));
AWT_UNLOCK();
CHECKHEAP;
return makeJavaString(string.GetBuffer(0), string.GetLength());
}
void
sun_awt_win32_MTextFieldPeer_setText(struct Hsun_awt_win32_MTextFieldPeer *self,
struct Hjava_lang_String *l)
{
CHECKHEAP;
AWT_LOCK();
AwtEdit *pEdit = (AwtEdit *)unhand(self)->pData;
int len = javaStringLength(l);
char *buffer;
buffer = (char *)malloc(len + 1);
javaString2CString(l, buffer, len + 1);
AWT_TRACE(("%x:textFieldSetText(%s)\n", self, buffer));
pEdit->PostMsg(AwtEdit::SETTEXT, (long)buffer);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MTextFieldPeer_pSetEditable(struct Hsun_awt_win32_MTextFieldPeer *self,
long editable)
{
CHECKHEAP;
AWT_LOCK();
AwtEdit *pEdit = (AwtEdit *)unhand(self)->pData;
AWT_TRACE(("%x:textFieldSetEditable(%d)\n", self, editable));
pEdit->PostMsg(AwtEdit::SETEDITABLE, editable);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MTextFieldPeer_dispose(struct Hsun_awt_win32_MTextFieldPeer *self)
{
CHECKHEAP;
AWT_LOCK();
AwtEdit *pEdit = (AwtEdit *)unhand(self)->pData;
AWT_TRACE(("%x:textFieldDispose()\n", self));
pEdit->PostMsg(AwtEdit::DISPOSE);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MTextFieldPeer_setEchoCharacter(struct Hsun_awt_win32_MTextFieldPeer *self, unicode c)
{
CHECKHEAP;
AWT_LOCK();
AwtEdit *pEdit = (AwtEdit *)unhand(self)->pData;
AWT_TRACE(("%x:textFieldSetEchoCharacter(%c)\n", self, c));
pEdit->PostMsg(AwtEdit::SETECHOCHARACTER, c);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MTextFieldPeer_select(struct Hsun_awt_win32_MTextFieldPeer *self,
long selStart, long selEnd)
{
CHECKHEAP;
AWT_LOCK();
AwtEdit *pEdit = (AwtEdit *)unhand(self)->pData;
AWT_TRACE(("%x:textFieldSelect(%d, %d)\n", self, selStart, selEnd));
pEdit->PostMsg(AwtEdit::SETSELECTION, selStart, selEnd);
AWT_UNLOCK();
CHECKHEAP;
}
long
sun_awt_win32_MTextFieldPeer_getSelectionStart(struct Hsun_awt_win32_MTextFieldPeer *self)
{
CHECKHEAP;
AWT_LOCK();
AwtEdit *pEdit = (AwtEdit *)unhand(self)->pData;
long result;
AWT_TRACE(("%x:textFieldGetSelectionStart()->", self));
result = pEdit->SendMsg(AwtEdit::GETSELECTIONSTART);
AWT_TRACE(("%d\n", result));
AWT_UNLOCK();
CHECKHEAP;
return result;
}
long
sun_awt_win32_MTextFieldPeer_getSelectionEnd(struct Hsun_awt_win32_MTextFieldPeer *self)
{
CHECKHEAP;
AWT_LOCK();
AwtEdit *pEdit = (AwtEdit *)unhand(self)->pData;
long result;
AWT_TRACE(("%x:textFieldGetSelectionEnd()->", self));
result = pEdit->SendMsg(AwtEdit::GETSELECTIONEND);
AWT_TRACE(("%d\n", result));
AWT_UNLOCK();
CHECKHEAP;
return result;
}
/** IMAGE methods **/
void
sun_awt_image_ImageRepresentation_offscreenInit(IRHandle irh)
{
if (irh == 0) {
SignalError(0, JAVAPKG "NullPointerException", 0);
return;
}
AWT_LOCK();
IRPtr ir = unhand(irh);
if (ir->width <= 0 || ir->height <= 0) {
SignalError(0, JAVAPKG "IllegalArgumentException", 0);
AWT_UNLOCK();
return;
}
AwtImage *pImage = new AwtImage;
if (pImage == NULL) {
SignalError(0, JAVAPKG "OutOfMemoryError", 0);
AWT_UNLOCK();
return;
}
AWT_TRACE(("%x:imageRepOffscreenInit(%d, %d)->", irh, ir->width, ir->height));
if (!pImage->Create(irh, ir->width, ir->height)) {
SignalError(0, JAVAPKG "OutOfMemoryError", 0);
delete pImage;
} else {
unhand(irh)->pData = (long)pImage;
unhand(irh)->availinfo = IMAGE_OFFSCRNINFO;
AWT_TRACE(("%x\n", pImage));
}
AWT_UNLOCK();
}
long
sun_awt_image_ImageRepresentation_setBytePixels(IRHandle irh,
long x, long y,
long w, long h,
CMHandle cmh, ByteHandle arrh,
long off, long scansize)
{
if (irh == 0 || cmh == 0 || arrh == 0) {
SignalError(0, JAVAPKG "NullPointerException", 0);
return -1;
}
if (w <= 0 || h <= 0) {
return -1;
}
if ((long)obj_length(arrh) < (scansize * h)) {
SignalError(0, JAVAPKG "ArrayIndexOutOfBoundsException", 0);
return -1;
}
AWT_LOCK();
AwtImage *pImage = image_getpImage(irh);
if (pImage == 0) {
SignalError(0, JAVAPKG "OutOfMemoryError", 0);
AWT_UNLOCK();
return -1;
}
long ret = pImage->GenericImageConvert(cmh, 0, x, y, w, h,
unhand(arrh), off, 8, scansize,
pImage->GetSrcWidth(),
pImage->GetSrcHeight(),
pImage->GetWidth(),
pImage->GetHeight(),
pImage);
AWT_UNLOCK();
return ret;
}
long
sun_awt_image_ImageRepresentation_setIntPixels(IRHandle irh,
long x, long y, long w, long h,
CMHandle cmh, IntHandle arrh,
long off, long scansize)
{
if (irh == 0 || cmh == 0 || arrh == 0) {
SignalError(0, JAVAPKG "NullPointerException", 0);
return -1;
}
if (w <= 0 || h <= 0) {
return -1;
}
if ((long)obj_length(arrh) < (scansize * h)) {
SignalError(0, JAVAPKG "ArrayIndexOutOfBoundsException", 0);
return -1;
}
AWT_LOCK();
AwtImage *pImage = image_getpImage(irh);
if (pImage == 0) {
SignalError(0, JAVAPKG "OutOfMemoryError", 0);
AWT_UNLOCK();
return -1;
}
long ret = pImage->GenericImageConvert(cmh, 0, x, y, w, h,
unhand(arrh), off, 32, scansize,
pImage->GetSrcWidth(),
pImage->GetSrcHeight(),
pImage->GetWidth(),
pImage->GetHeight(),
pImage);
AWT_UNLOCK();
return ret;
}
long
sun_awt_image_ImageRepresentation_finish(IRHandle irh, long force)
{
int ret = 0;
if (irh == 0) {
SignalError(0, JAVAPKG "NullPointerException", 0);
return 0;
}
AWT_LOCK();
AwtImage *pImage = image_getpImage(irh);
if (pImage != 0) {
ret = pImage->freeRenderData(force);
}
AWT_UNLOCK();
return ret;
}
void
sun_awt_image_ImageRepresentation_imageDraw(IRHandle irh, GHandle gh,
long x, long y,
struct Hjava_awt_Color *c)
{
struct Hsun_awt_win32_Win32Graphics *self;
if (irh == 0 || gh == 0) {
SignalError(0, JAVAPKG "NullPointerException", 0);
return;
}
self = (struct Hsun_awt_win32_Win32Graphics *) gh;
IRPtr ir = unhand(irh);
if ((ir->availinfo & IMAGE_DRAWINFO) != IMAGE_DRAWINFO) {
return;
}
AWT_LOCK();
AwtImage *pImage = (AwtImage *) ir->pData;
AwtGraphics *pGraphics = (AwtGraphics *)unhand(self)->pData;
if (pGraphics != NULL && pImage != NULL) {
pGraphics->DrawImage(pImage, x, y, c);
}
AWT_UNLOCK();
}
void
sun_awt_image_ImageRepresentation_disposeImage(IRHandle irh)
{
if (irh == 0) {
SignalError(0, JAVAPKG "NullPointerException", 0);
return;
}
AWT_LOCK();
AwtImage *pImage = (AwtImage *) irh->obj->pData;
AWT_TRACE(("%x:imageDestroy()\n", pImage));
if (pImage != NULL) {
delete pImage;
irh->obj->pData = NULL;
}
AWT_UNLOCK();
}
/** OFFSCREENIMAGESOURCE methods */
void
sun_awt_image_OffScreenImageSource_sendPixels(OSISHandle osish)
{
OSISPtr osis = unhand(osish);
IRHandle irh = osis->baseIR;
IRPtr ir;
if (irh == 0) {
SignalError(0, JAVAPKG "NullPointerException", 0);
return;
}
ir = unhand(irh);
if ((ir->availinfo & IMAGE_OFFSCRNINFO) != IMAGE_OFFSCRNINFO) {
SignalError(0, JAVAPKG "IllegalAccessError", 0);
return;
}
AwtImage *pImage = image_getpImage(irh);
if (pImage == 0) {
SignalError(0, JAVAPKG "OutOfMemoryError", 0);
return;
}
pImage->sendPixels(osis);
}
/** DIALOG methods **/
void
sun_awt_win32_MDialogPeer_create(struct Hsun_awt_win32_MDialogPeer *self,
struct Hsun_awt_win32_MComponentPeer *parent)
{
CHECKHEAP;
AWT_LOCK();
if (unhand(self)->target == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null target");
AWT_UNLOCK();
return;
}
MainFrame *pParent = NULL;
Classsun_awt_win32_MDialogPeer *selfC = unhand(self);
Hjava_awt_Frame *selfT = (Hjava_awt_Frame*)selfC->target;
if (parent != NULL) {
pParent = (MainFrame*)unhand(parent)->pData;
}
AWT_TRACE(("%x:frameCreate(%x)\n", self, parent));
MainFrame *pFrame = MainFrame::Create(selfT, TRUE, pParent,
unhand(selfT)->width,
unhand(selfT)->height,
RGB(192, 192, 192));
SET_PDATA(self, pFrame->GetMainWindow());
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MDialogPeer_setInsets(struct Hsun_awt_win32_MDialogPeer *self,
struct Hjava_awt_Insets *insets)
{
CHECKHEAP;
AWT_LOCK();
AwtWindow *pWindow = (AwtWindow*)unhand(self)->pData;
MainFrame *pFrame = pWindow->GetFrame();
pFrame->SetInsets(insets);
AWT_UNLOCK();
}
void
sun_awt_win32_MDialogPeer_pShow(struct Hsun_awt_win32_MDialogPeer *self)
{
CHECKHEAP;
AWT_LOCK();
AwtWindow *pWindow = (AwtWindow*)unhand(self)->pData;
MainFrame *pFrame = pWindow->GetFrame();
AWT_TRACE(("%x:frameShow()\n", self));
AwtComp::PostMsg(AwtComp::SHOW, (long)pFrame, TRUE);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MDialogPeer_pHide(struct Hsun_awt_win32_MDialogPeer *self)
{
CHECKHEAP;
AWT_LOCK();
AwtWindow *pWindow = (AwtWindow*)unhand(self)->pData;
MainFrame *pFrame = pWindow->GetFrame();
AWT_TRACE(("%x:frameHide()\n", self));
AwtComp::PostMsg(AwtComp::SHOW, (long)pFrame, FALSE);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MDialogPeer_pSetTitle(struct Hsun_awt_win32_MDialogPeer *self,
struct Hjava_lang_String *title)
{
CHECKHEAP;
AWT_LOCK();
AwtWindow *pWindow = (AwtWindow*)unhand(self)->pData;
MainFrame *pFrame = pWindow->GetFrame();
int len = javaStringLength(title);
char *buffer = NULL;
if (len > 0) {
buffer = (char *)malloc(len + 1);
javaString2CString(title, buffer, len + 1);
}
AWT_TRACE(("%x:frameSetTitle(%s)\n", self, buffer));
pFrame->PostMsg(MainFrame::SETTEXT, (long)buffer);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MDialogPeer_pDispose(struct Hsun_awt_win32_MDialogPeer *self)
{
CHECKHEAP;
AWT_LOCK();
AwtWindow *pWindow = (AwtWindow*)unhand(self)->pData;
MainFrame *pFrame = pWindow->GetFrame();
AWT_TRACE(("%x:frameDispose()\n", self));
pFrame->PostMsg(MainFrame::DISPOSE);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MDialogPeer_pReshape(struct Hsun_awt_win32_MDialogPeer *self,
long x, long y,
long w, long h)
{
CHECKHEAP;
AWT_LOCK();
AwtWindow *pWindow = (AwtWindow*)unhand(self)->pData;
MainFrame *pFrame = pWindow->GetFrame();
AWT_TRACE(("%x:dialogReshape(%d %d %d %d)\n", self, x, y, w, h));
pFrame->PostMsg(MainFrame::RESHAPE, x, y, w, h);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MDialogPeer_setResizable(struct Hsun_awt_win32_MDialogPeer *self,
long resizable)
{
CHECKHEAP;
AWT_LOCK();
AwtWindow *pWindow = (AwtWindow*)unhand(self)->pData;
MainFrame *pFrame = pWindow->GetFrame();
AWT_TRACE(("%x:frameSetResizable(%d)\n", self, resizable));
pFrame->PostMsg(MainFrame::SETRESIZABLE, resizable);
AWT_UNLOCK();
CHECKHEAP;
}
/** WINDOW methods **/
void
sun_awt_win32_MWindowPeer_create(struct Hsun_awt_win32_MWindowPeer *self,
struct Hsun_awt_win32_MComponentPeer *parent)
{
CHECKHEAP;
AWT_LOCK();
if (unhand(self)->target == 0) {
SignalError(0, JAVAPKG "NullPointerException", "null target");
AWT_UNLOCK();
return;
}
MainFrame *pParent = NULL;
Classsun_awt_win32_MWindowPeer *selfC = unhand(self);
Hjava_awt_Frame *selfT = (Hjava_awt_Frame*)selfC->target;
if (parent != NULL) {
pParent = (MainFrame*)unhand(parent)->pData;
}
AWT_TRACE(("%x:frameCreate(%x)\n", self, parent));
MainFrame *pFrame = MainFrame::Create(selfT, FALSE, pParent,
unhand(selfT)->width,
unhand(selfT)->height,
RGB(192, 192, 192));
SET_PDATA(self, pFrame->GetMainWindow());
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MWindowPeer_setInsets(struct Hsun_awt_win32_MWindowPeer *self,
struct Hjava_awt_Insets *insets)
{
CHECKHEAP;
AWT_LOCK();
AwtWindow *pWindow = (AwtWindow*)unhand(self)->pData;
MainFrame *pFrame = pWindow->GetFrame();
pFrame->SetInsets(insets);
AWT_UNLOCK();
}
void
sun_awt_win32_MWindowPeer_pShow(struct Hsun_awt_win32_MWindowPeer *self)
{
CHECKHEAP;
AWT_LOCK();
AwtWindow *pWindow = (AwtWindow*)unhand(self)->pData;
MainFrame *pFrame = pWindow->GetFrame();
AWT_TRACE(("%x:frameShow()\n", self));
AwtComp::PostMsg(AwtComp::SHOW, (long)pFrame, TRUE);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MWindowPeer_pHide(struct Hsun_awt_win32_MWindowPeer *self)
{
CHECKHEAP;
AWT_LOCK();
AwtWindow *pWindow = (AwtWindow*)unhand(self)->pData;
MainFrame *pFrame = pWindow->GetFrame();
AWT_TRACE(("%x:frameHide()\n", self));
AwtComp::PostMsg(AwtComp::SHOW, (long)pFrame, FALSE);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MWindowPeer_pDispose(struct Hsun_awt_win32_MWindowPeer *self)
{
CHECKHEAP;
AWT_LOCK();
AwtWindow *pWindow = (AwtWindow*)unhand(self)->pData;
MainFrame *pFrame = pWindow->GetFrame();
AWT_TRACE(("%x:frameDispose()\n", self));
pFrame->PostMsg(MainFrame::DISPOSE);
AWT_UNLOCK();
CHECKHEAP;
}
void
sun_awt_win32_MWindowPeer_pReshape(struct Hsun_awt_win32_MWindowPeer *self,
long x, long y,
long w, long h)
{
CHECKHEAP;
AWT_LOCK();
AwtWindow *pWindow = (AwtWindow*)unhand(self)->pData;
MainFrame *pFrame = pWindow->GetFrame();
AWT_TRACE(("%x:dialogReshape(%d %d %d %d)\n", self, x, y, w, h));
pFrame->PostMsg(MainFrame::RESHAPE, x, y, w, h);
AWT_UNLOCK();
CHECKHEAP;
}