
/*******************************************************************************
*	ファイル名：DataCollectView.cpp
*	用　　　途：ビュークラス実装
*	備　　　考：
*	履　　　歴：
********************************************************************************/
#include "stdafx.h"
#include "DataCollect.h"
#include "DataCollectDoc.h"
#include "DataCollectView.h"

/****************************
*	　マクロ・定数定義		*
****************************/
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#define	VIEW_BACK_COLROR	RGB(24, 27, 28)
#define	VIEW_LISTBOX_COLROR	RGB(59, 62, 65)
/****************************
*		 クラス実装			*
****************************/

/*******************************************************************************
*	ク ラ ス名：CDataCollectView
*	用　　　途：ビュークラス
*	備　　　考：
********************************************************************************/

//***** 動的生成のサポート
IMPLEMENT_DYNCREATE( CDataCollectView, CFormView )

//***** メッセージマップ
BEGIN_MESSAGE_MAP( CDataCollectView, CFormView )
	ON_WM_CTLCOLOR()
	ON_WM_DESTROY()

	ON_MESSAGE( WM_UPD_LOGDSP, &CDataCollectView::OnDspLog )	// ログ表示関連イベントメッセージ
	ON_MESSAGE( WM_INPUT_PATH, &CDataCollectView::OnInputPath )	// 入力元パス有無イベントメッセージ

END_MESSAGE_MAP()


/*******************************************************************************
*	関　数　名：CDataCollectView
*	用　　　途：コンストラクタ
*	引　き　数：
*	戻　り　値：
*	備　　　考：
********************************************************************************/
CDataCollectView::CDataCollectView()
	: CFormView		( CDataCollectView::IDD )
{
	// 背景色用ブラシ作成
    m_hBkBrush			= ::CreateSolidBrush( VIEW_BACK_COLROR );
	m_hListBoxBrush		= ::CreateSolidBrush( VIEW_LISTBOX_COLROR );
}


/*******************************************************************************
*	関　数　名：~CDataCollectView
*	用　　　途：デストラクタ
*	引　き　数：
*	戻　り　値：
*	備　　　考：
********************************************************************************/
CDataCollectView::~CDataCollectView()
{
	//***** 最後の後始末を行う
	CleanupWnds( FINALIZE ) ;
}


/*******************************************************************************
*	関　数　名：PreCreateWindow
*	用　　　途：ウィンドウ生成前処理
*	引　き　数：生成コンテキスト情報
*	戻　り　値：
*	備　　　考：
********************************************************************************/
BOOL CDataCollectView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: この位置で CREATESTRUCT cs を修正して Window クラスまたはスタイルを
	//  修正してください。
	return CFormView::PreCreateWindow(cs);
}


/*******************************************************************************
*	関　数　名：DoDataExchange
*	用　　　途：ダイアログデータ交換処理
*	引　き　数：データ交換オブジェクト
*	戻　り　値：
*	備　　　考：
********************************************************************************/
void CDataCollectView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);

	DDX_Control( pDX, IDC_LIST_SYSLOG			, m_ListLog[LOG_SYSTEM]			) ;
	DDX_Control( pDX, IDC_LIST_ERRLOG			, m_ListLog[LOG_ERROR]			) ;
	DDX_Control( pDX, IDC_LIST_MININGLOG		, m_ListLog[LOG_MINING]			) ;
	DDX_Control( pDX, IDC_LIST_SETTING1LOG		, m_ListLog[LOG_SETTING1]		) ;
	DDX_Control( pDX, IDC_LIST_SETTING2LOG		, m_ListLog[LOG_SETTING2]		) ;
	DDX_Control( pDX, IDC_LIST_SETTING3LOG		, m_ListLog[LOG_SETTING3]		) ;
	DDX_Control( pDX, IDC_LIST_SETTING4LOG		, m_ListLog[LOG_SETTING4]		) ;
	DDX_Control( pDX, IDC_LIST_PRODUCTINFOLOG	, m_ListLog[LOG_PRODUCTINFO]);

	DDX_Control( pDX, IDC_TXT_MINING_PATH		, m_txtInputPath[LOG_MINING]		) ;
	DDX_Control( pDX, IDC_TXT_SETTING1_PATH		, m_txtInputPath[LOG_SETTING1]		) ;
	DDX_Control( pDX, IDC_TXT_SETTING2_PATH		, m_txtInputPath[LOG_SETTING2]		) ;
	DDX_Control( pDX, IDC_TXT_SETTING3_PATH		, m_txtInputPath[LOG_SETTING3]		) ;
	DDX_Control( pDX, IDC_TXT_SETTING4_PATH		, m_txtInputPath[LOG_SETTING4]		) ;
	DDX_Control( pDX, IDC_TXT_PRODUCTINFO_PATH	, m_txtInputPath[LOG_PRODUCTINFO]);
}

#ifdef _DEBUG

/****************************
*		 診断コード			*
****************************/

/*******************************************************************************
*	関　数　名：AssertValid
*	用　　　途：オブジェクトの正当性評価
*	引　き　数：
*	戻　り　値：
*	備　　　考：
********************************************************************************/
void CDataCollectView::AssertValid() const
{
	CFormView::AssertValid() ;
}


/*******************************************************************************
*	関　数　名：Dump
*	用　　　途：オブジェクトのデバッグダンプ
*	引　き　数：ダンプコンテキスト
*	戻　り　値：
*	備　　　考：
********************************************************************************/
void CDataCollectView::Dump( CDumpContext& dc ) const
{
	CFormView::Dump( dc ) ;
}


/*******************************************************************************
*	関　数　名：GetDocument
*	用　　　途：ドキュメントオブジェクトの取得
*	引　き　数：
*	戻　り　値：
*	備　　　考：デバッグバージョン
********************************************************************************/
CDataCollectDoc* CDataCollectView::GetDocument() const // デバッグ以外のバージョンはインラインです。
{
	ASSERT( m_pDocument->IsKindOf( RUNTIME_CLASS(CDataCollectDoc) ) ) ;

	return (CDataCollectDoc*)m_pDocument ;
}


#endif //_DEBUG


/*******************************************************************************
*	関　数　名：OnInitialUpdate
*	用　　　途：ドキュメント生成初回初期化処理
*	引　き　数：
*	戻　り　値：
*	備　　　考：
********************************************************************************/
void CDataCollectView::OnInitialUpdate()
{
	CFormView::OnInitialUpdate() ;
	GetParentFrame()->RecalcLayout() ;

	CDataCollectDoc* pDoc = GetDocument() ;

	//***** ドキュメントへ初期化の通知
	pDoc->InitialUpdateView( this ) ;

	if( !pDoc->GetInitilize() ){
		AfxMessageBox( _T("初期化異常のため、ソフトを起動出来ません") ) ;
		::SendMessage( AfxGetMainWnd()->m_hWnd, WM_EXIT_APP, 0, 0 ) ;
	}

	//***** ビュー内表示の初期化
	InitView() ;

	SetupViewSize() ;
}


/*******************************************************************************
*	関　数　名：InitView
*	用　　　途：ビュー内表示の初期化を行います
*	引　き　数：
*	戻　り　値：
*	備　　　考：
********************************************************************************/
void CDataCollectView::InitView()
{
	//ログ表示メッセージ設定
	for( INT32 i = 0 ; i < NOF_LOG ; i++ ){
		CDailyLogManagerS::GetInstance().SetLogMessage( i, this->m_hWnd, WM_UPD_LOGDSP );
	}

	// 入力元パス有無テキスト
	for( INT32 i = LOG_MINING ; i < NOF_LOG ; i++ ){
		m_txtInputPath[i].SetStateAttr( FALSE, _T(""), RED ) ;
		m_txtInputPath[i].SetStateAttr( TRUE , _T(""), GREEN ) ;
		m_txtInputPath[i].SetState( FALSE ) ;
	}
}

/*******************************************************************************
*	関　数　名：SetupViewSize
*	用　　　途：ビューの表示領域を設定します
*	引　き　数：
*	戻　り　値：
*	備　　　考：
********************************************************************************/
void CDataCollectView::SetupViewSize()
{
	CRect			rectClient ;		// クライアント領域サイズ
	CSize			sizeScreen ;		// スクリーン領域サイズ

	sizeScreen.cx = GetSystemMetrics( SM_CXSCREEN ) ;
	sizeScreen.cy = GetSystemMetrics( SM_CYSCREEN ) ;

	// ディスプレイサイズが実際のサイズより大きければ
	// ビューサイズを固定する
	// そうでなければスクロールバーを表示する
	if( sizeScreen.cx >= MAINFRM_SIZE_X && sizeScreen.cy >= MAINFRM_SIZE_Y ){ 
		GetClientRect( &rectClient ) ;
		SetScrollSizes( MM_TEXT, rectClient.Size() ) ;
	}
}

/********************************************************************************
*	関数名：OnCtlColor											
*	用　途：
*	引き数：													
*	戻り値：													
*	備　考：
********************************************************************************/
HBRUSH CDataCollectView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CFormView::OnCtlColor(pDC, pWnd, nCtlColor);

	// TODO:  ここで DC の属性を変更してください。
	if (nCtlColor == CTLCOLOR_DLG)
	{
		return m_hBkBrush;
	}
	else if (nCtlColor == CTLCOLOR_LISTBOX)
	{
		pDC->SetTextColor(WHITE);
		pDC->SetBkMode(TRANSPARENT);

		return m_hListBoxBrush;
	}
	else if (nCtlColor == CTLCOLOR_STATIC)
	{
		if(pWnd->GetDlgCtrlID() == IDC_STATIC)
		{
			pDC->SetTextColor(WHITE);
			pDC->SetBkMode(TRANSPARENT);

			return m_hBkBrush;
		}
	}

	// TODO:  既定値を使用したくない場合は別のブラシを返します。
	return hbr;
}

/*******************************************************************************
*	関　数　名：OnDestroy
*	用　　　途：ウィンドウ破棄時メッセージイベント
*	引　き　数：
*	戻　り　値：
*	備　　　考：
********************************************************************************/
void CDataCollectView::OnDestroy()
{
	//***** 子ダイアログ関連の後始末
	CleanupWnds( DESTROY ) ;

	//***** ドキュメントの終了処理
	GetDocument()->OnTermDocument() ;

	::DeleteObject( m_hBkBrush		); // 背景色用ブラシ削除
	::DeleteObject( m_hListBoxBrush ); // リストボックス用ブラシ削除

	CFormView::OnDestroy() ;
}

/*******************************************************************************
*	関　数　名：CleanupWnds
*	用　　　途：ウィンドウの後始末処理
*	引　き　数：呼び出しタイミング
*	戻　り　値：
*	備　　　考：
********************************************************************************/
void CDataCollectView::CleanupWnds( INT32 nTiming )
{
	switch( nTiming ){ 
	case DESTROY:
	//***** ウィンドウ破棄時終了処理

		break ;

	case FINALIZE:
	//***** デストラクタ終了処理

		break ;

	default:
		break ;
	}
}

/*******************************************************************************
*	関　数　名：OnUpdate
*	用　　　途：描画更新オーバーライドイベント
*	引　き　数：更新指示送信元、パラメータ
*	戻　り　値：
*	備　　　考：ドキュメントのUpdateAllViewsにより更新指示された時に
*				すべてのビューに呼び出されます。
*				最初の呼び出しは基底クラスのOnInitialUpdate()にて行われ、
*				この時点では、タブ画面等はまだ初期化されていないので、
*				空振りします。
********************************************************************************/
void CDataCollectView::OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint )
{
	// 全画面表示が無効化されてちらつくので、
	// 基底クラスのメソッドは呼ばない
	//	CFormView::OnUpdate( pSender, lHint, pHint ) ;

	//***** Viewの表示更新
	OnUpdateView( pHint, lHint ) ;
}


/*******************************************************************************
*	関　数　名：OnUpdateView
*	用　　　途：ビュー更新オーバーライドイベント
*	引　き　数：更新指示送信元、通知コード
*	戻　り　値：
*	備　　　考：
********************************************************************************/
void CDataCollectView::OnUpdateView( CObject* pSender, LPARAM lNotifCode )
{	
	switch( lNotifCode ){
		case NTCD_UPDATE_PARAM:		// パラメータ更新
		{
			break ;
		}

		case NTCD_CHANGE_MODE :		// モード切替
		{
			break ;
		}

		default	:
			break ;
	}
}

/********************************************************************************
*	関数名：OnDspLog						
*	用　途：画面表示イベントメッセージ処理	
*	引き数：
*	戻り値：
*	備　考
********************************************************************************/
LRESULT CDataCollectView::OnDspLog(WPARAM wParam, LPARAM lParam)
{
	UINT		uiLogID = (UINT)wParam ;
	CString		strDsp;
	CListBox*	pList ;

	for( INT32 i = 0 ; i < NOF_LOG ; i++ ){
		if( uiLogID != CDailyLogManagerS::GetInstance().GetLogID(i) ) continue ;

		pList = &m_ListLog[i] ;

		break ;
	}

	while( TRUE ){
		strDsp = CDailyLogManagerS::GetInstance().GetDspPrints(uiLogID);
	
		//表示ログがなくなったら終了
		if(strDsp.IsEmpty() == TRUE){
			break;
		}

		pList->InsertString( 0, strDsp );
	
		if( pList->GetCount() > SIZE_DSPLOG ){						//設定サイズを超える場合末尾の行を削除
			pList->DeleteString( pList->GetCount() - 1 );
		}

		DspScrollBarH( pList ) ;
	}

	return TRUE;
}

/*******************************************************************************
*	関　数　名：DspScrollBarH
*	用　　　途：水平スクロールバー表示
*	引　き　数：
*	戻　り　値：
*	備　　　考：
********************************************************************************/
void CDataCollectView::DspScrollBarH( CListBox* pListBox )
{
	// Find the longest string in the list box.
	CString    strTmp;
	CSize      size;
	INT32      nSizeX = 0 ;
	TEXTMETRIC tTextMatric ;
	CDC*       pDC	 = pListBox->GetDC();
	CFont*     pFont = pListBox->GetFont();

	// Select the listbox font, save the old font
	CFont* pOldFont = pDC->SelectObject(pFont);
	// Get the text metrics for avg char width
	pDC->GetTextMetrics(&tTextMatric); 

	for( INT32 i = 0; i < pListBox->GetCount(); i++ )
	{
	   pListBox->GetText(i, strTmp);
	   size = pDC->GetTextExtent(strTmp);

	   // Add the avg width to prevent clipping
	   size.cx += tTextMatric.tmAveCharWidth;

	   if (size.cx > nSizeX)
		  nSizeX = size.cx;
	}
	// Select the old font back into the DC
	pDC->SelectObject(pOldFont);
	pListBox->ReleaseDC(pDC);

	// Set the horizontal extent so every character of all strings 
	// can be scrolled to.
	pListBox->SetHorizontalExtent(nSizeX);
}

/********************************************************************************
*	関数名：OnInputPath						
*	用　途：入力元パス有無イベントメッセージ処理	
*	引き数：
*	戻り値：
*	備　考
********************************************************************************/
LRESULT CDataCollectView::OnInputPath(WPARAM wParam, LPARAM lParam)
{
	INT32 nIndex  = (INT32)wParam ;
	BOOL  bEnable = (BOOL)lParam ; 

	m_txtInputPath[nIndex].SetState( bEnable ) ;

	return TRUE;
}