//******************************************************************************
//
// MIDITrail / MTMIDIINCfgDlg
//
// MIDI入力設定ダイアログ
//
// Copyright (C) 2012-2021 WADA Masashi. All Rights Reserved.
//
//******************************************************************************

#import "MTParam.h"
#import "MTMIDIINCfgDlg.h"

@implementation MTMIDIINCfgDlg


//******************************************************************************
// 生成
//******************************************************************************
- (id)init
{
	//Nibファイルを指定してウィンドウコントローラを生成
	return [super initWithWindowNibName:@"MIDIINCfgDlg"];
}

//******************************************************************************
// 破棄
//******************************************************************************
- (void)dealloc
{
	[m_pUserConf release];
	[super dealloc];
}

//******************************************************************************
// ウィンドウ読み込み完了
//******************************************************************************
- (void)windowDidLoad
{
	int result = 0;
	
	//ウィンドウ表示項目初期化
	//  モーダル終了後に再度モーダル表示してもwindowDidLoadは呼び出されない
	result = [self initDlg];
	if (result != 0) goto EXIT;
	
EXIT:;
	if (result != 0) YN_SHOW_ERR();
}

//******************************************************************************
// モーダルウィンドウ表示
//******************************************************************************
- (void)showModalWindow
{	
	//モーダルウィンドウ表示
	[NSApp runModalForWindow:[self window]];
	
	//モーダル表示終了後はウィンドウを非表示にする
	[[self window] orderOut:self];
}

//******************************************************************************
// OKボタン押下
//******************************************************************************
- (IBAction)onOK:(id)sender
{
	int result = 0;
	
	//設定保存
	result = [self save];
	if (result != 0) goto EXIT;
	
EXIT:;
	if (result != 0) YN_SHOW_ERR();
	//モーダル表示終了
	[NSApp stopModal];
}

//******************************************************************************
// Cancelボタン押下：またはESCキー押下
//******************************************************************************
- (IBAction)onCancel:(id)sender
{
	//モーダル表示終了
	[NSApp stopModal];
}

//******************************************************************************
// クローズボタン押下
//******************************************************************************
- (void)windowWillClose:(NSNotification*)aNotification
{
	//モーダル表示終了
	[NSApp stopModal];	
}

//******************************************************************************
// ダイアログ初期化
//******************************************************************************
- (int)initDlg
{
	int result = 0;
	
	//設定ファイル初期化
	result = [self initConfFile];
	if (result != 0) goto EXIT;
	
	//MIDI入力デバイス制御の初期化
	result = m_MIDIInDevCtrl.Initialize();
	if (result != 0) goto EXIT;
	
	//MIDI入力デバイス選択ポップアップボタン初期化
	result = [self initPopUpButton:m_pPopUpBtnPortA portName:@"PortA"];
	if (result != 0) goto EXIT;
	
	//MIDITHRUチェックボタン初期化
	result = [self initCheckBtnMIDITHRU];
	if (result != 0) goto EXIT;
	
EXIT:;
	return result;
}

//******************************************************************************
// 設定ファイル初期化
//******************************************************************************
- (int)initConfFile
{
	int result = 0;
	
	//ユーザ設定情報初期化
	[m_pUserConf release];
	m_pUserConf = [[YNUserConf alloc] init];
	if (m_pUserConf == nil) {
		YN_SET_ERR(@"Could not allocate memory.", 0, 0);
		goto EXIT;
	}
	
	//カテゴリ／セクション設定
	[m_pUserConf setCategory:MT_CONF_CATEGORY_MIDI];
	[m_pUserConf setSection:MT_CONF_SECTION_MIDIIN];
	
EXIT:;
	return result;
}

//******************************************************************************
// ポップアップボタン初期化
//******************************************************************************
- (int)initPopUpButton:(NSPopUpButton*)pPopUpButton portName:(NSString*)pPortName
{
	int result = 0;
	unsigned int index = 0;
	NSInteger itemIndex = 0;
	NSInteger selectedIndex = 0;
	NSString* pSelectedDevIDname = nil;
	NSString* pSelectedDevDisplayName = nil;
	NSString* pDevIDname = nil;
	NSString* pDevDisplayName = nil;
	NSMenu* pMenu = nil;
	NSMenuItem* pItem = nil;
	
	//ユーザ選択デバイス情報取得
	pSelectedDevIDname = [m_pUserConf strValueForKey:pPortName defaultValue:@""];
	pSelectedDevDisplayName = [m_pUserConf strValueForKey:[NSString stringWithFormat:@"%@_DevDisplayName", pPortName]
											 defaultValue:@""];
	
	//ユーザ選択デバイスがない場合は「選択なし」を選択状態にする
	if ([pSelectedDevIDname isEqual:@""]) {
		selectedIndex = 0;
	}
	
	//メニュー生成
	pMenu = [[[NSMenu alloc] initWithTitle:@"Port A"] autorelease];
	
	//メニュー項目「選択なし」をメニューに追加
	pItem = [[NSMenuItem alloc] initWithTitle:@"(none)" action:nil keyEquivalent:@""];
	[pItem setTag:index];
	[pMenu addItem:pItem];
	[pItem release];
	itemIndex++;
	
	for (index = 0; index < m_MIDIInDevCtrl.GetDevNum(); index++) {
		//表示デバイス名をメニューに追加
		pDevIDname = m_MIDIInDevCtrl.GetDevIdName(index);
		pDevDisplayName = m_MIDIInDevCtrl.GetDevDisplayName(index);
		pItem = [[NSMenuItem alloc] initWithTitle:pDevDisplayName action:nil keyEquivalent:@""];
		[pItem setTag:index];
		[pMenu addItem:pItem];
		[pItem release];
		//選択デバイスのデバイス識別名称と一致する場合
		if ([pSelectedDevIDname isEqual:pDevIDname]) {
			//デバイス表示名称が保存されていない場合はデバイス識別名のみで判定
			if ([pSelectedDevDisplayName length] == 0) {
				selectedIndex = itemIndex;
			}
			//デバイス表示名称が保存されている場合はデバイス表示名称の一致も判定
			else if ([pSelectedDevDisplayName isEqualToString:pDevDisplayName]) {
				selectedIndex = itemIndex;
			}
		}
		itemIndex++;
	}
	
	//メニューをポップアップボタンに登録
	[pPopUpButton setMenu:pMenu];
	//	[pMenu release];
	//リリースするとdeallocで落ちる
	
	//選択状態設定
	[pPopUpButton selectItemAtIndex:selectedIndex];
	
	//同期
	[pPopUpButton synchronizeTitleAndSelectedItem];
	
EXIT:;
	return result;
}

//******************************************************************************
// MIDITHRUチェックボタン初期化 
//******************************************************************************
- (int)initCheckBtnMIDITHRU
{
	int result = 0;
	int checkMIDITHRU = 0;
	
	//MIDITHRUチェック状態取得
	checkMIDITHRU = [m_pUserConf intValueForKey:@"MIDITHRU" defaultValue:1];
	
	//チェックボタンに反映
	if (checkMIDITHRU == 0) {
		[m_pCheckBtnMIDITHRU setState:NSOffState];
	}
	else {
		[m_pCheckBtnMIDITHRU setState:NSOnState];
	}
	
EXIT:;
	return result;
}

//******************************************************************************
// 設定ファイル保存
//******************************************************************************
- (int)save
{
	int result = 0;
	
	result = [self savePortCfg:m_pPopUpBtnPortA portName:@"PortA"];
	if (result != 0) goto EXIT;
	
	result = [self saveMIDITHRU];
	if (result != 0) goto EXIT;
	
EXIT:;
	return result;
}

//******************************************************************************
// ポート設定保存
//******************************************************************************
- (int)savePortCfg:(NSPopUpButton*)pPopUpBotton portName:(NSString*)pPortName
{
	int result = 0;
	NSInteger selectedIndex = 0;
	NSString* pDevIdName = nil;
	NSString* pDevDisplayName = nil;
	
	//選択された項目
	selectedIndex = [pPopUpBotton indexOfSelectedItem];
	
	//選択された項目に対応する識別用デバイス名
	if (selectedIndex == 0) {
		pDevIdName = @"";
		pDevDisplayName = @"";
	}
	else {
		pDevIdName = m_MIDIInDevCtrl.GetDevIdName((unsigned int)(selectedIndex-1));
		pDevDisplayName = m_MIDIInDevCtrl.GetDevDisplayName((unsigned int)(selectedIndex-1));
	}
	
	//設定保存
	[m_pUserConf setStr:pDevIdName forKey:pPortName];
	[m_pUserConf setStr:pDevDisplayName forKey:[NSString stringWithFormat:@"%@_DevDisplayName", pPortName]];
	
EXIT:;
	return result;
}

//******************************************************************************
// MIDITHRU保存 
//******************************************************************************
- (int)saveMIDITHRU
{
	int result = 0;
	int checkMIDITHRU = 0;
	
	//MIDITHRUチェック状態確認
	if ([m_pCheckBtnMIDITHRU state] == NSOnState) {
		checkMIDITHRU = 1;
	}
	else {
		checkMIDITHRU = 0;
	}
	
	//設定保存
	[m_pUserConf setInt:checkMIDITHRU forKey:@"MIDITHRU"];
	
EXIT:;
	return result;
}

@end


