//--------------------------------------------------------------------------------------
// File: ImeUi.h
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// http://go.microsoft.com/fwlink/?LinkId=320437
//--------------------------------------------------------------------------------------
#pragma once

#include <windows.h>

class CImeUiFont_Base
{
public:
    virtual void    SetHeight( _In_ UINT uHeight )
    {
        UNREFERENCED_PARAMETER(uHeight);
    }; // for backward compatibility
    virtual void    SetColor( _In_ DWORD color ) = 0;
    virtual void    SetPosition( _In_ int x, _In_ int y ) = 0;
    virtual void    GetTextExtent( _In_z_ LPCTSTR szText, _Out_ DWORD* puWidth, _Out_ DWORD* puHeight ) = 0;
    virtual void    DrawText( _In_z_ LPCTSTR pszText ) = 0;
};

typedef struct
{
    // symbol (Henkan-kyu)
    DWORD symbolColor;
    DWORD symbolColorOff;
    DWORD symbolColorText;
    BYTE symbolHeight;
    BYTE symbolTranslucence;
    BYTE symbolPlacement;
    CImeUiFont_Base* symbolFont;

    // candidate list
    DWORD candColorBase;
    DWORD candColorBorder;
    DWORD candColorText;

    // composition string
    DWORD compColorInput;
    DWORD compColorTargetConv;
    DWORD compColorConverted;
    DWORD compColorTargetNotConv;
    DWORD compColorInputErr;
    BYTE compTranslucence;
    DWORD compColorText;

    // caret
    BYTE caretWidth;
    BYTE caretYMargin;
}               IMEUI_APPEARANCE;

typedef struct	// D3DTLVERTEX compatible
{
    float sx;
    float sy;
    float sz;
    float rhw;
    DWORD color;
    DWORD specular;
    float tu;
    float tv;
}               IMEUI_VERTEX;

// IME States
#define IMEUI_STATE_OFF		0
#define IMEUI_STATE_ON		1
#define IMEUI_STATE_ENGLISH	2

// IME const
#define MAX_CANDLIST 10

// IME Flags
#define IMEUI_FLAG_SUPPORT_CARET	0x00000001

bool ImeUi_Initialize( _In_ HWND hwnd, _In_ bool bDisable = false );
void ImeUi_Uninitialize();
void ImeUi_SetAppearance( _In_opt_ const IMEUI_APPEARANCE* pia );
void ImeUi_GetAppearance( _Out_opt_ IMEUI_APPEARANCE* pia );
bool ImeUi_IgnoreHotKey( _In_ const MSG* pmsg );
LPARAM ImeUi_ProcessMessage( _In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _Inout_ LPARAM& lParam, _Out_ bool* trapped );
void ImeUi_SetScreenDimension( _In_ UINT width, _In_ UINT height );
void ImeUi_RenderUI( _In_ bool bDrawCompAttr = true, _In_ bool bDrawOtherUi = true );
void ImeUi_SetCaretPosition( _In_ UINT x, _In_ UINT y );
void ImeUi_SetCompStringAppearance( _In_ CImeUiFont_Base* pFont, _In_ DWORD color, _In_ const RECT* prc );
bool ImeUi_GetCaretStatus();
void ImeUi_SetInsertMode( _In_ bool bInsert );
void ImeUi_SetState( _In_ DWORD dwState );
DWORD ImeUi_GetState();
void ImeUi_EnableIme( _In_ bool bEnable );
bool ImeUi_IsEnabled();
void ImeUi_FinalizeString( _In_ bool bSend = false );
void ImeUi_ToggleLanguageBar( _In_ BOOL bRestore );
bool ImeUi_IsSendingKeyMessage();
void ImeUi_SetWindow( _In_ HWND hwnd );
UINT ImeUi_GetInputCodePage();
DWORD ImeUi_GetFlags();
void ImeUi_SetFlags( _In_ DWORD dwFlags, _In_ bool bSet );

WORD ImeUi_GetPrimaryLanguage();
DWORD ImeUi_GetImeId( _In_ UINT uIndex );
WORD ImeUi_GetLanguage();
LPCTSTR ImeUi_GetIndicatior();
bool ImeUi_IsShowReadingWindow();
bool ImeUi_IsShowCandListWindow();
bool ImeUi_IsVerticalCand();
bool ImeUi_IsHorizontalReading();
TCHAR*          ImeUi_GetCandidate( _In_ UINT idx );
TCHAR*          ImeUi_GetCompositionString();
DWORD ImeUi_GetCandidateSelection();
DWORD ImeUi_GetCandidateCount();
BYTE*           ImeUi_GetCompStringAttr();
DWORD ImeUi_GetImeCursorChars();

extern void ( CALLBACK*ImeUiCallback_DrawRect )( _In_ int x1, _In_ int y1, _In_ int x2, _In_ int y2, _In_ DWORD color );
extern void*    ( __cdecl*ImeUiCallback_Malloc )( _In_ size_t bytes );
extern void ( __cdecl*ImeUiCallback_Free )( _In_ void* ptr );
extern void ( CALLBACK*ImeUiCallback_DrawFans )( _In_ const IMEUI_VERTEX* paVertex, _In_ UINT uNum );
extern void ( CALLBACK*ImeUiCallback_OnChar )( _In_ WCHAR wc );
