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

#include "GCStorage.h"

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

CGCStorage::CGCStorage()
{

}

CGCStorage::~CGCStorage()
{
	FreeGC();
}

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

// GCを構築する
bool CGCStorage::CreateGC( int id, Widget wgt, Pixel fg, Pixel bg )
{
	Display *d = XtDisplay( wgt );
	Window window = XtWindow( wgt );
	map< int, pair< GC, Widget > >::iterator itr;
	GC gc;

	// 同一IDの物がすでに存在しているか否か確認する
	itr = mapGC.find( id );

	if ( itr == mapGC.end() ) {
		// 既存のものが存在しなかった場合はGCを構築する
		gc = XCreateGC( d, window, 0, NULL );
		if ( NULL == gc ) return false;
	}
	else {
		// 既存の物が存在する場合は、それを再利用する
		gc = itr->second.first;
	}

	// 色を設定する
	XSetForeground( d, gc, fg );
	XSetBackground( d, gc, bg );

	// mapに追加する
	if ( itr == mapGC.end() ) {
		pair< int, pair< GC, Widget > > wPair( id, pair< GC, Widget >( gc, wgt ) );
		mapGC.insert( wPair );
	}
	return true;
}

// GCを取得する
GC CGCStorage::GetGC( int id ) const
{
	map< int, pair< GC, Widget > >::const_iterator itr;
	itr = mapGC.find( id );
	if ( itr == mapGC.end() )
		return NULL;
	else
		return itr->second.first;
}

// 全てのGCを解放する
void CGCStorage::FreeGC()
{
	map< int, pair< GC, Widget > >::iterator itr;

	itr = mapGC.begin();
	for (; itr != mapGC.end(); itr++ ) {
		Display *pDisplay = XtDisplay( itr->second.second );
		XFreeGC( pDisplay, itr->second.first );
	}	
	mapGC.clear();
}


