#ifndef WCE_PEER_H_INCLUDED
#define WCE_PEER_H_INCLUDED

#include <windows.h>
#include <jni.h>
#include <assert.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * RGB565のDIBを作成する際に使用する構造体
 * BITMAPINFOにキャストしてCreateDIBSection()に渡す
 */

typedef struct BITMAPINFO_RGB565_t {
	BITMAPINFOHEADER bmiHeader;
	DWORD dwRedMask;
	DWORD dwGreenMask;
	DWORD dwBlueMask;
} BITMAPINFO_RGB565;

/**
 * １つのメニューバー上に存在できるメニュー最大数
 */
#define	MAX_MENUS	128

/**
 * システムウインドウクラス名
 */
extern const _TCHAR* g_system_window_class_name;

/**
 * Frame用ウインドウクラス名
 */
extern const _TCHAR* g_frame_class_name;

/**
 * Color.getRGB()が返す値を、COLORREFに変換する
 */
#define TO_COLORREF(rgb) ((((rgb) >> 16) & 0xff) | ((rgb) & 0xff00) | (((rgb) << 16) & 0xff0000))

void init(JNIEnv* env);
void initialize_system_window(JNIEnv* env, jobject toolkit);

/**
 * Buttonに対応するネイティブコンポーネントを作成する
 */
HWND create_native_button(jobject peer, HWND hwndParent, int x, int y, int width, int height);

/**
 * Canvasに対応するネイティブコンポーネントを作成する
 */
HWND create_native_canvas(jobject peer, HWND hwndParent, int x, int y, int width, int height);

/**
 * Checkboxに対応するネイティブコンポーネントを作成する
 */
HWND create_native_checkbox(jobject peer, HWND hwndParent, int x, int y, int width, int height, jobject checkBoxGroup);

/**
 * Choiceに対応するネイティブコンポーネントを作成する
 */
HWND create_native_choice(jobject peer, HWND hwndParent, int x, int y, int width, int height);

/**
 * Dialogに対応するネイティブコンポーネントを作成する
 */
HWND create_native_dialog(jobject peer, HWND hwndParent, jint x, jint y, jint width, jint height, jboolean undecorated);

/**
 * FileDialogに対応するネイティブコンポーネントを作成する
 */
HWND create_native_file_dialog(jobject peer, HWND hwndParent, int x, int y, int width, int height);

/**
 * Frameに対応するネイティブコンポーネントを作成する
 */
HWND create_native_frame(jobject peer, HWND hwndParent, jint x, jint y, jint width, jint height, jboolean undecorated);

/**
 * Labelに対応するネイティブコンポーネントを作成する
 */
HWND create_native_label(jobject peer, HWND hwndParent, int x, int y, int width, int height);

/**
 * Listに対応するネイティブコンポーネントを作成する
 */
HWND create_native_list(jobject peer, HWND hwndParent, int x, int y, int width, int height, BOOL multi);

/**
 * Panelに対応するネイティブコンポーネントを作成する
 */
HWND create_native_panel(jobject peer, HWND hwndParent, int x, int y, int width, int height);

/**
 * Scrollbarに対応するネイティブコンポーネントを作成する
 */
HWND create_native_scrollbar(jobject peer, HWND hwndParent, int x, int y, int width, int height, int orientation);

/**
 * Scrollpaneに対応するネイティブコンポーネントを作成する
 */
HWND create_native_scroll_pane(jobject peer, HWND hwndParent, int x, int y, int width, int height, int policy);

/**
 * TextFieldに対応するネイティブコンポーネントを作成する
 */
HWND create_native_text_field(jobject peer, HWND hwndParent, int x, int y, int width, int height);

/**
 * TextAreaに対応するネイティブコンポーネントを作成する
 */
HWND create_native_text_area(jobject peer, HWND hwndParent, int x, int y, int width, int height, int scrollbarVisibility);

/**
 * Windowに対応するネイティブコンポーネントを作成する
 */
HWND create_native_window(jobject peer, HWND hwndParent, int x, int y, int width, int height);

/**
 * 指定されたコンポーネントの表示状態を変更する
 */
void set_visible(JNIEnv* env, HWND hwnd, BOOL visible);

/**
 * 指定されたウインドウを最背面に移動する
 */
void to_back(JNIEnv* env, HWND hwnd);

/**
 * 指定されたウインドウを最前面に移動する
 */
void to_front(JNIEnv* env, HWND hwnd);

/**
 * ウインドウの有効／無効を切り替える
 */
void set_enabled(JNIEnv* env, HWND hwnd, BOOL enabled);

/**
 * ウインドウのサイズを変更する
 */
void set_bounds(JNIEnv* env, HWND hwnd, int x, int y, int width, int height);

// 現在未使用
void get_bounds(JNIEnv* env, HWND hwnd, int* px, int* y, int* width, int* height);

/* !!!! Mod PeteC 2006-06-20 */
void set_focus(HWND hwnd);
/* !!!! End Mod PeteC 2006-06-20 */

HWND get_focus();

/**
 * ウインドウを破棄する
 */
void dispose(JNIEnv* env, jobject peer_obj, HWND hwnd);

/**
 * ウインドウの画面上における座標を返す
 */
jobject get_location_on_screen(JNIEnv* env, HWND hwnd);

/**
 * 背景色を設定する
 */
void set_background(JNIEnv* env, jobject peer_obj, HWND hWnd, jint rgb);

/**
 * 前面色を設定する
 */
void set_foreground(JNIEnv* env, jobject peer_obj, HWND hWnd, jint rgb);

/**
 * OSメッセージを処理する
 */
void handle_native_message(JNIEnv* env, HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);

/**
 * メニューアイテムに付与するユニークなコマンドIDを作成する
 */
WORD create_menu_item_id(HMENU hmenuParent);

/**
 * メニューアイテムのコマンドIDを再利用可能にする
 */
void delete_menu_item_id(WORD id);

/**
 * 指定されたHWNDに対応するメニューバーのウインドウハンドルを返す
 * メニューバーを持たない場合はNULLを返す。
 */
HWND get_menu_bar_of(HWND hwnd);

/**
 * ポップアップメニューを表示する
 */
void show_popup_menu(JNIEnv* env, jobject peer_obj, HWND hwnd, HMENU hmenu, int x, int y);

/**
 * 指定されたCheckboxに対して、CheckboxGroupを設定する
 */
void set_checkbox_group(HWND windowHandle, jobject checkboxGroup);


/**
 * jstringの内容を_TCHAR*に変換する
 * この関数の戻り値は malloc() で確保されているので、不要になった時点でfree()を使用して
 * 解放する必要がある
 */
_TCHAR* get_string_chars(JNIEnv* env, jstring str);

/**
 * スクロールバーの行増分を設定する
 */
void set_scrollbar_line_increment(HWND hwndScroll, int inc);

/**
 * スクロールバーのページ増分を設定する
 */
void set_scrollbar_page_increment(HWND hwndScroll, int inc);

/**
 * 指定されたデバイスコンテキストを初期化する
 */
void init_DC(HDC hdc);

/**
 * ScrollPaneのスクロールバーに関するパラメータを設定する
 */
void set_scroll_pane_scrollbar_parameters(HWND hwnd, int scrollbarType, int maximum, int visibleAmount);

/**
 * ScrollPaneのスクロール位置を設定する
 */
void set_scroll_pane_scroll_position(HWND hwnd, int oldX, int oldY, int newX, int newY);

/**
 * Dialogの表示／非表示を切り替える
 */
void set_dialog_visible(HWND hwnd, BOOL visible, BOOL modal);

/**
 * Componentのカーソルを設定する
 */
void set_cursor(HWND hwnd, int type);

/**
 * Componentのフォントを設定する
 */
void set_font(HWND hwnd, HFONT hFont);

/**
 * 指定されたテキストのサイズを返す
 */
void get_text_extent_point(HWND hwnd, const _TCHAR* text, SIZE* psize);

/**
 * Window.setBoundsCallback()を呼び出す
 */
void call_Window_setBoundsCallback(JNIEnv* env, jobject window, jint x, jint y, jint width, jint height);

/**
 * AWTErrorをthrowする
 */
void throw_AWTError(JNIEnv* env, const char* message);

/**
 * 指定されたウインドウに対応するメニューバーの表示／非表示を切り替える
 * 指定されたウインドウがメニューバーを持たない場合には何もしない
 */
void set_menu_bar_visible(HWND hwndFrame, BOOL visible);

#ifdef __cplusplus
}
#endif

#endif
