////////////////////////////////////////////////////////////////////////////
// CXimMgr クラスのインプリメンテーション
//
////////////////////////////////////////////////////////////////////////////

#include "XimMgr.h"
#include "TaEditJPEXT.h"

////////////////////////////////////////////////////////////////////////////
// 構築/破棄
////////////////////////////////////////////////////////////////////////////

CXimMgr::CXimMgr() :
	m_FontSet( NULL ),
	m_FontListEntry( NULL ),
	m_FontList( NULL ),
	LeftColumnWidth( 0 )
{

}

CXimMgr::~CXimMgr()
{
	Clear();
}

////////////////////////////////////////////////////////////////////////////
// メソッド
////////////////////////////////////////////////////////////////////////////

// 初期化
bool CXimMgr::Initialize( Widget argWgt, VClsPtr< CConfigInfo > argpConf )
{
	Arg al[20];
	int ac = 0;
	const string &rFontName = argpConf->RefFontName();
	Display *pDisplay = XtDisplay( argWgt );
	Screen *scr = XtScreen( argWgt );
	Window wnd = XtWindow( argWgt );
	int i;
	XPoint pt = { 20, 20 };

	// フォントの情報を構築
	m_FontSet = JPEXT_CreateFontSet( pDisplay, rFontName.c_str() );
	m_FontListEntry = XmFontListEntryCreate( XmFONTLIST_DEFAULT_TAG, XmFONT_IS_FONTSET, m_FontSet );
	m_FontList = XmFontListAppendEntry( NULL, m_FontListEntry );

	m_Wgt = argWgt;
	XmImRegister( argWgt, 0 );

	XtSetArg( al[ac], XmNbackground, argpConf->RefPreEditTextB_Color() ); ac++;
	XtSetArg( al[ac], XmNforeground, argpConf->RefPreEditTextF_Color() ); ac++;
	XtSetArg( al[ac], XmNspotLocation, &pt ); ac++;
	XtSetArg( al[ac], XmNbackgroundPixmap, NULL ); ac++;
	XtSetArg( al[ac], XmNfontList, m_FontList ); ac++;
	XtSetArg( al[ac], XmNlineSpace, 1 ); ac++;
	XmImSetValues( argWgt, al, ac );

	ac = 0;

	return true;
}

// フォーカスが入った
void CXimMgr::OnForcus()
{
	Arg al[1];
	int ac = 0;

	XmImSetFocusValues( m_Wgt, al, ac ); 
}

// フォーカスがでていった
void CXimMgr::ExitForcus()
{
	XmImUnsetFocus( m_Wgt );
}

// 入力位置の設定
void CXimMgr::SetPosition( int x, int y ) const
{
	Arg al[1];
	int ac = 0;
	XPoint pt = { x + LeftColumnWidth, y };

	XtSetArg( al[ac], XmNspotLocation, &pt ); ac++;
	XmImSetValues( m_Wgt, al, ac );
}

// 入力テキストの取得
void CXimMgr::GetInputText( XKeyPressedEvent *event, wstring *pStr, KeySym *pKeySym, bool *pOnShift, bool *pCtrl )
{
	int r;
	KeySym wKeySym;
	Status wStatus;
	char pBuf1[3] = { 0, 0, 0 };
	char *pBuf2 = pBuf1;

	// 文字列を取得
	r = XmImMbLookupString( m_Wgt, event, pBuf1, 2, &wKeySym, &wStatus );
	if ( wStatus == XBufferOverflow ) {
		// 一文字では不足する場合
		pBuf2 = (char*)alloca( sizeof( char ) * ( r + 1 ) );
		XmImMbLookupString( m_Wgt, event, pBuf2, r, &wKeySym, &wStatus );
		pBuf2[r] = '\0';
	}

	(*pKeySym) = wKeySym;
	(*pOnShift) = ( event->state & ShiftMask ) ? true : false;
	(*pCtrl) = ( event->state & ControlMask ) ? true : false;

	if ( wStatus == XLookupChars || wStatus == XLookupBoth ) {
		// ワイドバイト文字列に変換
		JPEXT_MBStoWCS( pBuf2, pStr );
	}
	else
		(*pStr) = L"";
}

// 破棄
void CXimMgr::Clear()
{
	XmImUnregister( m_Wgt );

	XmFontListFree( m_FontList );
	XmFontListEntryFree( &m_FontListEntry );
	XFreeFontSet( XtDisplay( m_Wgt ), m_FontSet );
}

// ビューの左側にあける領域の幅を設定
// （CCoursorオブジェクトから通知されるX座標は、LeftColumnWidthが引かれた値であるため
// 　CXimMgrはこの値を知らざるを得ない）
void CXimMgr::SetLeftColumnWidth( int LCW )
{
	LeftColumnWidth = LCW;
}

