Artifact Content

Not logged in

Artifact 285630280e899bbb1e6aafa085917897cfe5d7e5


     1  // NoahCM.cpp
     2  //-- CNoahConfigManager -- save / load / modify the setting of 'Noah' --
     3  
     4  #include "stdafx.h"
     5  #include "resource.h"
     6  #include "NoahApp.h"
     7  #include "NoahCM.h"
     8  
     9  //----------------------------------------------//
    10  //---------- INIファイル名の設定など -----------//
    11  //----------------------------------------------//
    12  
    13  void CNoahConfigManager::init()
    14  {
    15  	//-- caldix.iniがもしあればDLLインストール先を読み込み。環境変数に追加
    16  	{
    17  		kiIniFile caldini;
    18  		caldini.setFileName( "caldix.ini" );
    19  		caldini.setSection(  "conf" );
    20  		kiStr dll_to = caldini.getStr( "dll", "" );
    21  		if( dll_to.len() != 0 )
    22  		{
    23  			int siz = ::GetEnvironmentVariable( "PATH", NULL, 0 );
    24  			char* buf = new char[siz+1];
    25  			::GetEnvironmentVariable( "PATH", buf, siz+1 );
    26  			::SetEnvironmentVariable( "PATH", (kiStr(buf)+=";")+=dll_to );
    27  			delete [] buf;
    28  		}
    29  	}
    30  
    31  	//-- 設定読み込み済みフラグをクリア
    32  	m_Loaded = 0;
    33  
    34  	//-- iniファイル名設定
    35  	char usr[256];
    36  	DWORD siz=sizeof(usr);
    37  	if( !::GetUserName( usr, &siz ) )
    38  		ki_strcpy( usr, "Default" );
    39  	m_Ini.setFileName( "Noah.ini" );
    40  	m_Ini.setSection( usr );
    41  
    42  	//-- 解凍用設定は全部ロードしておく
    43  	load( Melt );
    44  }
    45  
    46  //----------------------------------------------//
    47  //------------ 設定の load & save --------------//
    48  //----------------------------------------------//
    49  
    50  typedef bool (WINAPI * XT_IA)();
    51  typedef void (WINAPI * XT_LS)(bool*,bool*);
    52  typedef void (WINAPI * XT_SS)(bool,bool);
    53  typedef void (WINAPI * XT_AS)(bool*);
    54  typedef void (WINAPI * XT_LSEX)(const char*,bool*);
    55  typedef void (WINAPI * XT_SSEX)(const char*,bool);
    56  
    57  void CNoahConfigManager::load( loading_flag what )
    58  {
    59  	if( (what & Mode) && !(m_Loaded & Mode) ) //----------- モード
    60  	{
    61  		m_Mode     = m_Ini.getInt( "Mode", 2 ) & 3;
    62  		m_MiniBoot = m_Ini.getBool( "MiniBoot", false );
    63  		m_OneExt   = m_Ini.getBool( "OneExt", false );
    64  		m_ZeroExt  = m_Ini.getBool( "NoExt", false );
    65  		m_MbLim    = max( 1, m_Ini.getInt( "MultiBootLimit", 4 ) );
    66  	}
    67  	if( (what & Melt) && !(m_Loaded & Melt) ) //----------- 解凍
    68  	{
    69  		const char* x = m_Ini.getStr( "MDir", kiPath( kiPath::Dsk ) );
    70  		m_MDirSm = (*x=='@');
    71  		m_MDir   = (*x=='@') ? x+1 : x;
    72  		const int m = m_Ini.getInt( "MkDir", 2 );
    73  		m_MNoNum = ( m>=16 );
    74  		m_MkDir  = ( m&3 );
    75  		m_Kill   = m_Ini.getStr( "Kill", "" );
    76  	}
    77  	if( (what & Compress) && !(m_Loaded & Compress) ) //--- 圧縮
    78  	{
    79  		const char* x = m_Ini.getStr( "CDir", kiPath( kiPath::Dsk ) );
    80  		m_CDirSm = (*x=='@');
    81  		m_CDir   = (*x=='@') ? x+1 : x;
    82  		m_CExt = m_Ini.getStr( "CExt", "zip" );
    83  		m_CMhd = m_Ini.getStr( "CMhd", "7-zip" );
    84  	}
    85  	if( (what & Shell) && !(m_Loaded & Shell) )	//---------- ショートカット
    86  												//---------- 関連づけ
    87  												//---------- シェルエクステンション
    88  	{
    89  		m_OldVer = m_Ini.getBool( "OldAbout", false );
    90  
    91  		kiPath SndLink(kiPath::Snd),DskLink(kiPath::Dsk);
    92  		SndLink += "Noah.lnk", DskLink += "Noah.lnk";
    93  		m_SCSendTo = kiSUtil::exist(SndLink);
    94  		m_SCDesktop= kiSUtil::exist(DskLink);
    95  
    96  		m_bShlOK = NOSHL;
    97  		m_hNoahXtDLL = kiSUtil::loadLibrary( "NoahXt" );
    98  		if( m_hNoahXtDLL )
    99  		{
   100  			XT_IA Init = (XT_IA)getProc( "Init" );
   101  			m_bShlOK = ( Init() ? SHLOK : NOADMIN );
   102  			XT_LS LoadSE = (XT_LS)getProc( "LoadSE" );
   103  			XT_AS LoadAssoc = (XT_AS)getProc( "LoadAS" );
   104  			XT_LSEX LoadASEx = (XT_LSEX)getProc( "LoadASEx" );
   105  			LoadSE( &m_SECmp, &m_SEExt );
   106  			LoadAssoc( m_bAsso );
   107  			LoadASEx( "7z\0", &m_bAsso[12] );
   108  		}
   109  	}
   110  	if( (what & OpenDir) && !(m_Loaded & OpenDir) ) //------ フォルダオープン
   111  	{
   112  		m_MODir = m_Ini.getBool( "MODir", true );
   113  		m_CODir = m_Ini.getBool( "CODir", true );
   114  		m_OpenBy = m_Ini.getStr( "OpenBy", kiPath(kiPath::Win)+"explorer.exe \"%s\"" );
   115  	}
   116  
   117  	m_Loaded |= what;
   118  }
   119  
   120  void CNoahConfigManager::save()
   121  {
   122  	kiStr tmp;
   123  
   124  	//-- モード
   125  	m_Ini.putInt( "Mode", m_Mode );
   126  	//-- 解凍
   127  	tmp = m_MDirSm ? "@" : "", tmp+= m_MDir;
   128  	m_Ini.putStr( "MDir", tmp );
   129  	m_Ini.putInt( "MkDir", m_MkDir+(m_MNoNum?16:0) );
   130  	//-- 圧縮
   131  	tmp = m_CDirSm ? "@" : "", tmp+= m_CDir;
   132  	m_Ini.putStr( "CDir", tmp );
   133  	m_Ini.putStr( "CExt", m_CExt );
   134  	m_Ini.putStr( "CMhd", m_CMhd );
   135  	//-- ショートカット
   136  	kiPath SndLink(kiPath::Snd); SndLink += "Noah.lnk";
   137  	kiPath DskLink(kiPath::Dsk); DskLink += "Noah.lnk";
   138  	if( m_SCSendTo )
   139  	{
   140  		if( !kiSUtil::exist(SndLink) )
   141  			kiSUtil::createShortCut( kiPath(kiPath::Snd), "Noah" );
   142  	}
   143  	else
   144  		::DeleteFile(SndLink);
   145  	if( m_SCDesktop )
   146  	{
   147  		if( !kiSUtil::exist(DskLink) )
   148  			kiSUtil::createShortCut( kiPath(kiPath::Dsk), "Noah" );
   149  	}
   150  	else
   151  		::DeleteFile(DskLink);
   152  	//-- 関連づけ・シェルエクステンション
   153  	if( m_bShlOK )
   154  	{
   155  		XT_SS SaveSE = (XT_SS)getProc( "SaveSE" );
   156  		XT_AS SaveAssoc = (XT_AS)getProc( "SaveAS" );
   157  		XT_SSEX SaveASEx = (XT_SSEX)getProc( "SaveASEx" );
   158  		SaveSE( m_SECmp, m_SEExt );
   159  		SaveAssoc( m_bAsso );
   160  		SaveASEx( "7z\0", m_bAsso[12] );
   161  	}
   162  	//-- フォルダオープン
   163  	m_Ini.putBool("MODir", m_MODir );
   164  	m_Ini.putBool("CODir", m_CODir );
   165  }
   166  
   167  void CNoahConfigManager::dialog()
   168  {
   169  	CNoahConfigDialog dlg;
   170  	dlg.createModeless( NULL );
   171  
   172  	app()->setMainWnd( &dlg );
   173  
   174  	if( dlg.isAlive() )
   175  		kiWindow::msgLoop();
   176  }
   177  
   178  FARPROC CNoahConfigManager::getProc( const char* name )
   179  {
   180  	return ::GetProcAddress( m_hNoahXtDLL, name );
   181  }
   182  
   183  //----------------------------------------------//
   184  //--------------- ダイアログ関係 ---------------//
   185  //----------------------------------------------//
   186  
   187  ///////// 初期化 /////////////
   188  
   189  #define IDI_LZH 101
   190  #define IDI_ZIP 102
   191  #define IDI_CAB 103
   192  #define IDI_RAR 104
   193  #define IDI_TAR 105
   194  #define IDI_YZ1 106
   195  #define IDI_GCA 107
   196  #define IDI_ARJ 108
   197  #define IDI_BGA 109
   198  #define IDI_ACE 110
   199  #define IDI_OTH 111
   200  #define IDI_JAK 112
   201  
   202  #define icon_is(_x) { if( mycnf().m_hNoahXtDLL ) setIcon( ::LoadIcon( mycnf().m_hNoahXtDLL, MAKEINTRESOURCE(_x) ) ); }
   203  	CNoahConfigDialog::CCmprPage::CCmprPage() : kiPropSheetPage( IDD_CMPCFG ) icon_is( IDI_ACE )
   204  	CNoahConfigDialog::CMeltPage::CMeltPage() : kiPropSheetPage( IDD_MLTCFG ) icon_is( IDI_LZH )
   205  	CNoahConfigDialog::CWinXPage::CWinXPage() : kiPropSheetPage( IDD_WINCFG ) icon_is( IDI_YZ1 )
   206  	CNoahConfigDialog::CInfoPage::CInfoPage() : kiPropSheetPage( IDD_INFCFG ) icon_is( IDI_GCA )
   207  #undef icon_is
   208  
   209  CNoahConfigDialog::CNoahConfigDialog()
   210  {
   211  	//-- [icon] Noahのプロパティ
   212  	m_Header.dwFlags |= PSH_PROPTITLE | PSH_USEICONID;
   213  	m_Header.pszIcon = MAKEINTRESOURCE( IDI_MAIN );
   214  	m_Header.pszCaption = "Noah";
   215  
   216  	//-- アクセラレータをセット
   217  	loadAccel( IDR_ACCEL );
   218  
   219  	//-- ページをどかどかと追加
   220  	m_Pages.add( new CCmprPage );
   221  	m_Pages.add( new CMeltPage );
   222  	m_Pages.add( new CWinXPage );
   223  	m_Pages.add( new CInfoPage );
   224  }
   225  
   226  BOOL CNoahConfigDialog::onInit()
   227  {
   228  	//-- DnD ON, 前面へ
   229  	::DragAcceptFiles( hwnd(), TRUE );
   230  	setFront( hwnd() );
   231  	return FALSE;
   232  }
   233  
   234  ///////// 各種コマンド /////////////
   235  
   236  void CNoahConfigDialog::onCommand( UINT id )
   237  {
   238  	//-- アクセラレータトラップ
   239  	if( id == IDA_HELP )		onHelp();
   240  	else if( id == IDA_MYDIR )	myapp().open_folder( kiPath( kiPath::Exe ) );
   241  }
   242  
   243  void CNoahConfigDialog::onHelp()
   244  {
   245  	kiPath exepos( kiPath::Exe );
   246  
   247  	//-- exeと同じ箇所にあるmanual.htmを起動
   248  	kiPath hlp(exepos); hlp+="manual.htm";
   249  	if( kiSUtil::exist(hlp) )
   250  		::ShellExecute( hwnd(), NULL, hlp, NULL, NULL, SW_MAXIMIZE );
   251  	else
   252  	{
   253  		//-- 無ければreadme.txtを
   254  		hlp=exepos; hlp+="readme.txt";
   255  		if( kiSUtil::exist(hlp) )
   256  			::ShellExecute( hwnd(), NULL, hlp, NULL, NULL, SW_SHOWDEFAULT );
   257  	}
   258  }
   259  
   260  void CNoahConfigDialog::onDrop( HDROP hdrop )
   261  {
   262  	//-- ダイアログへのドラッグ&ドロップ
   263  	sendOK2All();
   264  
   265  	//-- 途中で邪魔にならないように、消える
   266  	::ShowWindow( hwnd(), SW_HIDE );
   267  
   268  	char str[MAX_PATH];
   269  	StrArray reallist;
   270  	cCharArray dummy;
   271  
   272  	unsigned long max = ::DragQueryFile( hdrop, 0xffffffff, NULL, 0 );
   273  	for( unsigned int i=0; i!=max; i++ )
   274  	{
   275  		::DragQueryFile( hdrop, i, str, MAX_PATH );
   276  		reallist.add( kiStr(str) );
   277  	}
   278  	for( i=0; i!=max; i++ )
   279  		dummy.add( (const char*)reallist[i] );
   280  	myapp().do_files( dummy, NULL );
   281  
   282  	// 復帰
   283  	::DragFinish( hdrop );
   284  	::ShowWindow( hwnd(), SW_SHOW );
   285  }
   286  
   287  ///////// 終了時処理など /////////////
   288  
   289  void CNoahConfigDialog::shift_and_button()
   290  {
   291  	if( app()->keyPushed( VK_SHIFT ) )
   292  	{
   293  		app()->setMainWnd( NULL );
   294  		myapp().do_cmdline();
   295  	}
   296  }
   297  
   298  bool CNoahConfigDialog::onOK()
   299  {
   300  	onApply();
   301  	::PostQuitMessage( 0 );
   302  	return true;
   303  }
   304  
   305  void CNoahConfigDialog::onApply()
   306  {
   307  	mycnf().save();
   308  	shift_and_button();
   309  }
   310  
   311  bool CNoahConfigDialog::onCancel()
   312  {
   313  	sendOK2All();
   314  	::ShowWindow( hwnd(), SW_HIDE );
   315  	shift_and_button();
   316  	::PostQuitMessage( 0 );
   317  	return true;
   318  }
   319  
   320  ///////// 圧縮設定・解凍設定の共通部分 /////////////
   321  
   322  static void dirinit( kiDialog* dlg, bool same, bool open, const char* dir )
   323  {
   324  	dlg->sendMsgToItem( same ? IDC_DDIR1 : IDC_DDIR2 , BM_SETCHECK, TRUE );
   325  	if( open )
   326  		dlg->sendMsgToItem( IDC_ODIR , BM_SETCHECK, TRUE );
   327  	dlg->sendMsgToItem( IDC_DDIR , WM_SETTEXT , 0, (LPARAM)dir );
   328  }
   329  
   330  static void dirok( kiDialog* dlg, bool& same, bool& open, kiPath& dir )
   331  {
   332  	same = ( BST_CHECKED==dlg->sendMsgToItem( IDC_DDIR1, BM_GETCHECK ) );
   333  	open = ( BST_CHECKED==dlg->sendMsgToItem( IDC_ODIR, BM_GETCHECK ) );
   334  	static char str[MAX_PATH];
   335  	dlg->sendMsgToItem( IDC_DDIR, WM_GETTEXT, MAX_PATH, (LPARAM)str );
   336  	dir = str;
   337  }
   338  
   339  static bool dirdlg( kiDialog* dlg, UINT msg, WPARAM wp )
   340  {
   341  	if( msg==WM_COMMAND && LOWORD(wp)==IDC_REF )
   342  	{
   343  		kiSUtil::getFolderDlgOfEditBox(
   344  			dlg->item(IDC_DDIR), dlg->hwnd(), kiStr().loadRsrc(IDS_CHOOSEDIR) );
   345  		return true;
   346  	}
   347  	return false;
   348  }
   349  
   350  ///////// 圧縮設定 /////////////
   351  
   352  BOOL CNoahConfigDialog::CCmprPage::onInit()
   353  {
   354  	// 圧縮先フォルダ
   355  	dirinit( this, mycnf().cdirsm(), mycnf().codir(), mycnf().cdir() );
   356  
   357  	// 動作モード
   358  	sendMsgToItem( IDC_MODE1 + mycnf().mode(), BM_SETCHECK, TRUE );
   359  
   360  	// 圧縮形式
   361  	correct( mycnf().cext(), true );
   362  	int ind=sendMsgToItem( IDC_CMPMHD, CB_FINDSTRINGEXACT, -1, (LPARAM)(const char*)mycnf().cmhd() );
   363  	if( ind!=CB_ERR )
   364  		sendMsgToItem( IDC_CMPMHD, CB_SETCURSEL, ind );
   365  
   366  	// ツールチップ
   367  	m_tooltip = ::CreateWindowEx(
   368  		0, TOOLTIPS_CLASS, NULL, TTS_ALWAYSTIP,
   369  		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
   370  		hwnd(), NULL, app()->inst(), NULL );
   371  	SetUpToolTip();
   372  
   373  	::SetFocus(hwnd());
   374  	return TRUE;
   375  }
   376  
   377  bool CNoahConfigDialog::CCmprPage::onOK()
   378  {
   379  	// 圧縮先フォルダ
   380  	dirok( this, mycnf().m_CDirSm, mycnf().m_CODir, mycnf().m_CDir );
   381  
   382  	// 動作モード
   383  	for( int i=0; i!=4; i++ )
   384  		if( BST_CHECKED==sendMsgToItem( IDC_MODE1 + i, BM_GETCHECK ) )
   385  			{ mycnf().m_Mode = i; break; }
   386  
   387  	// 圧縮形式
   388  	char str[200]="";
   389  	sendMsgToItem( IDC_CMPEXT, CB_GETLBTEXT, sendMsgToItem( IDC_CMPEXT, CB_GETCURSEL ), (LPARAM)str );
   390  	if( *str )
   391  	{
   392  		mycnf().m_CExt = str;
   393  		sendMsgToItem( IDC_CMPMHD, CB_GETLBTEXT, sendMsgToItem( IDC_CMPMHD, CB_GETCURSEL ), (LPARAM)str );
   394  		mycnf().m_CMhd = str;
   395  	}
   396  
   397  	onCancel(); // 終了処理
   398  	return true;
   399  }
   400  
   401  bool CNoahConfigDialog::CCmprPage::onCancel()
   402  {
   403  	// 終了処理
   404  	::DestroyWindow( m_tooltip );
   405  	return true;
   406  }
   407  
   408  void CNoahConfigDialog::CCmprPage::SetUpToolTip()
   409  {
   410  	char ext[200]="";
   411  	sendMsgToItem( IDC_CMPEXT, CB_GETLBTEXT, sendMsgToItem( IDC_CMPEXT, CB_GETCURSEL ), (LPARAM)ext );
   412  	char mhd[200]="";
   413  	sendMsgToItem( IDC_CMPMHD, CB_GETLBTEXT, sendMsgToItem( IDC_CMPMHD, CB_GETCURSEL ), (LPARAM)mhd );
   414  
   415  	TOOLINFO ti = {sizeof(TOOLINFO)};
   416  	ti.uFlags   = TTF_SUBCLASS;
   417  	{
   418  		ti.uId      = 0;
   419  		ti.hwnd     = item(IDC_CMPEXT);
   420  		::GetClientRect( item(IDC_CMPEXT), &ti.rect );
   421  		SendMessage( m_tooltip, TTM_DELTOOL, 0, (LPARAM)&ti );
   422  		if( *ext )
   423  		{
   424  			ti.lpszText = ext;
   425  			SendMessage( m_tooltip, TTM_ADDTOOL, 0, (LPARAM)&ti );
   426  		}
   427  	}
   428  	{
   429  		ti.uId      = 1;
   430  		ti.hwnd     = item(IDC_CMPMHD);
   431  		::GetClientRect( item(IDC_CMPMHD), &ti.rect );
   432  		SendMessage( m_tooltip, TTM_DELTOOL, 0, (LPARAM)&ti );
   433  		if( *mhd )
   434  		{
   435  			ti.lpszText = mhd;
   436  			SendMessage( m_tooltip, TTM_ADDTOOL, 0, (LPARAM)&ti );
   437  		}
   438  	}
   439  }
   440  
   441  BOOL CALLBACK CNoahConfigDialog::CCmprPage::proc( UINT msg, WPARAM wp, LPARAM lp )
   442  {
   443  	if( dirdlg( this, msg, wp ) )
   444  		return TRUE;
   445  
   446  	if( msg==WM_COMMAND && HIWORD(wp)==CBN_SELCHANGE && LOWORD(wp)==IDC_CMPEXT )
   447  	{
   448  		char str[200]="";
   449  		sendMsgToItem( IDC_CMPEXT, CB_GETLBTEXT, sendMsgToItem( IDC_CMPEXT, CB_GETCURSEL ), (LPARAM)str );
   450  		if( *str )
   451  			correct( str, false );
   452  		SetUpToolTip();
   453  		return TRUE;
   454  	}
   455  	else if( msg==WM_COMMAND && HIWORD(wp)==CBN_SELCHANGE && LOWORD(wp)==IDC_CMPMHD )
   456  	{
   457  		SetUpToolTip();
   458  	}
   459  	return FALSE;
   460  }
   461  
   462  void CNoahConfigDialog::CCmprPage::correct( const char* ext, bool first )
   463  {
   464  	cCharArray extl;
   465  	StrArray mhdl;
   466  	int mhdef;
   467  	myarc().get_cmpmethod( ext, mhdef, mhdl, first, &extl );
   468  
   469  	if( first )
   470  		for( unsigned int i=0; i!=extl.len(); i++ )
   471  			sendMsgToItem( IDC_CMPEXT, CB_ADDSTRING, 0, (LPARAM)extl[i] );
   472  	sendMsgToItem( IDC_CMPEXT, CB_SELECTSTRING, 0, (LPARAM)ext );
   473  
   474  	sendMsgToItem( IDC_CMPMHD, CB_RESETCONTENT );
   475  	for( unsigned int j=0; j!=mhdl.len(); j++ )
   476  		sendMsgToItem( IDC_CMPMHD, CB_ADDSTRING, 0, (LPARAM)(const char*)mhdl[j] );
   477  	sendMsgToItem( IDC_CMPMHD, CB_SETCURSEL, mhdef );
   478  }
   479  
   480  
   481  ///////// 解凍設定 /////////////
   482  
   483  BOOL CNoahConfigDialog::CMeltPage::onInit()
   484  {
   485  	// 解凍先フォルダ
   486  	dirinit( this, mycnf().mdirsm(), mycnf().modir(), mycnf().mdir() );
   487  
   488  	// フォルダ自動生成
   489  	if( mycnf().mkdir()!=0 )
   490  		sendMsgToItem( IDC_MKDIR ,BM_SETCHECK, TRUE );
   491  	if( mycnf().mkdir()==1 )
   492  		sendMsgToItem( IDC_MKDIR1,BM_SETCHECK, TRUE );
   493  	if( mycnf().mkdir()==2 )
   494  		sendMsgToItem( IDC_MKDIR2,BM_SETCHECK, TRUE );
   495  	if( mycnf().mnonum() )
   496  		sendMsgToItem( IDC_MKDIR3,BM_SETCHECK, TRUE );
   497  	correct();
   498  
   499  	return FALSE;
   500  }
   501  
   502  bool CNoahConfigDialog::CMeltPage::onOK()
   503  {
   504  	// 解凍先フォルダ
   505  	dirok( this, mycnf().m_MDirSm, mycnf().m_MODir, mycnf().m_MDir );
   506  
   507  	// フォルダ自動生成
   508  	mycnf().m_MNoNum = ( BST_CHECKED==sendMsgToItem( IDC_MKDIR3, BM_GETCHECK ) );
   509  	if( BST_CHECKED!=sendMsgToItem( IDC_MKDIR ,BM_GETCHECK ) )
   510  		mycnf().m_MkDir = 0;
   511  	else
   512  	{
   513  		if( BST_CHECKED==sendMsgToItem( IDC_MKDIR1 ,BM_GETCHECK ) )
   514  			mycnf().m_MkDir = 1;
   515  		else if( BST_CHECKED==sendMsgToItem( IDC_MKDIR2 ,BM_GETCHECK ) )
   516  			mycnf().m_MkDir = 2;
   517  		else
   518  			mycnf().m_MkDir = 3;
   519  	}
   520  	return true;
   521  }
   522  
   523  BOOL CALLBACK CNoahConfigDialog::CMeltPage::proc( UINT msg, WPARAM wp, LPARAM lp )
   524  {
   525  	if( dirdlg( this, msg, wp ) )
   526  		return TRUE;
   527  
   528  	if( msg==WM_COMMAND )
   529  		if( LOWORD(wp)==IDC_MKDIR || LOWORD(wp)==IDC_MKDIR1 )
   530  		{
   531  			correct();
   532  			return TRUE;
   533  		}
   534  
   535  	return FALSE;
   536  }
   537  
   538  void CNoahConfigDialog::CMeltPage::correct()
   539  {
   540  	BOOL _mk = ( BST_CHECKED==sendMsgToItem( IDC_MKDIR ,BM_GETCHECK ) );
   541  	BOOL _1f = ( BST_CHECKED==sendMsgToItem( IDC_MKDIR1,BM_GETCHECK ) );
   542  	::EnableWindow( ::GetDlgItem(hwnd(),IDC_MKDIR1), _mk );
   543  	::EnableWindow( ::GetDlgItem(hwnd(),IDC_MKDIR2), _mk && !_1f );
   544  	::EnableWindow( ::GetDlgItem(hwnd(),IDC_MKDIR3), _mk );
   545  	if( _1f )
   546  		sendMsgToItem( IDC_MKDIR2, BM_SETCHECK, TRUE );
   547  }
   548  
   549  ///////// Windows拡張設定 /////////////
   550  
   551  BOOL CNoahConfigDialog::CWinXPage::onInit()
   552  {
   553  	if( !mycnf().m_bShlOK )
   554  		for( UINT i=IDC_LZH; i<=IDC_MLT; i++ )
   555  			::EnableWindow( item(i), FALSE );
   556  	else
   557  	{
   558  		for( UINT i=IDC_LZH; i<=IDC_7Z; i++ )
   559  			if( mycnf().m_bAsso[i-IDC_LZH] )
   560  				sendMsgToItem( i, BM_SETCHECK, TRUE );
   561  		if( mycnf().m_SECmp )
   562  			sendMsgToItem( IDC_CMP ,BM_SETCHECK, TRUE );
   563  		if( mycnf().m_SEExt )
   564  			sendMsgToItem( IDC_MLT ,BM_SETCHECK, TRUE );
   565  	}
   566  	if( !mycnf().m_bShlOK || !myarc().b2e_enabled() )
   567  	{
   568  		::ShowWindow( item(IDC_ASS), SW_HIDE );
   569  		::EnableWindow( item(IDC_ASS), FALSE );
   570  	}
   571  	if( mycnf().m_bShlOK!=1 )
   572  		::ShowWindow( item(IDC_NOADMIN), SW_HIDE );
   573  	if( mycnf().m_SCSendTo )
   574  		sendMsgToItem( IDC_SND, BM_SETCHECK, TRUE );
   575  	if( mycnf().m_SCDesktop )
   576  		sendMsgToItem( IDC_DSK, BM_SETCHECK, TRUE );
   577  
   578  	return FALSE;
   579  }
   580  
   581  bool CNoahConfigDialog::CWinXPage::onOK()
   582  {
   583  	mycnf().m_SCSendTo = ( BST_CHECKED==sendMsgToItem( IDC_SND ,BM_GETCHECK ) );
   584  	mycnf().m_SCDesktop= ( BST_CHECKED==sendMsgToItem( IDC_DSK ,BM_GETCHECK ) );
   585  	for( UINT i=IDC_LZH; i<=IDC_7Z; i++ )
   586  		mycnf().m_bAsso[i-IDC_LZH] = ( BST_CHECKED==sendMsgToItem( i, BM_GETCHECK ) );
   587  	mycnf().m_SECmp = ( BST_CHECKED==sendMsgToItem( IDC_CMP ,BM_GETCHECK ) );
   588  	mycnf().m_SEExt = ( BST_CHECKED==sendMsgToItem( IDC_MLT ,BM_GETCHECK ) );
   589  
   590  	return true;
   591  }
   592  
   593  BOOL CALLBACK CNoahConfigDialog::CWinXPage::proc( UINT msg, WPARAM wp, LPARAM lp )
   594  {
   595  	if( msg==WM_COMMAND )
   596  		if( LOWORD(wp)==IDC_ASS )
   597  		{
   598  			CAssPage x( hwnd() );
   599  			return TRUE;
   600  		}
   601  	return FALSE;
   602  }
   603  
   604  CNoahConfigDialog::CAssPage::CAssPage( HWND parent ) : kiDialog( IDD_ANYASS )
   605  {
   606  	doModal( parent );
   607  }
   608  
   609  BOOL CNoahConfigDialog::CAssPage::onInit()
   610  {
   611  	typedef void (WINAPI * XT_LAX)(const char*,bool*);
   612  	XT_LAX LoadASEx = (XT_LAX)mycnf().getProc( "LoadASEx" );
   613  	static const char* const ext_list[] =
   614  		{ "lzh","zip","cab","rar","tar","yz1","gca","arj","gza","ace","cpt","jak","7z" };
   615  
   616  	// b2e検索
   617  	kiPath wild( kiPath::Exe );
   618  	wild += "b2e\\*.b2e";
   619  	kiFindFile find;
   620  	find.begin( wild );
   621  
   622  	char* first_dot;
   623  	bool state;
   624  	HWND lst[] = { item(IDC_NASSOC), item(IDC_ASSOC) };
   625  
   626  	for( WIN32_FIND_DATA fd; find.next(&fd); )
   627  	{
   628  		// # 付きは圧縮専用
   629  		if( fd.cFileName[0] == '#' )
   630  			continue;
   631  
   632  		// 拡張子を切り出し
   633  		::CharLower( fd.cFileName );
   634  		first_dot = const_cast<char*>(kiPath::ext_all(fd.cFileName)-1);
   635  		*first_dot = '\0';
   636  
   637  		// 基本形式ならここではねる
   638  		for( int i=0; i<sizeof(ext_list)/sizeof(const char*); i++ )
   639  			if( 0==ki_strcmp( ext_list[i], fd.cFileName ) )
   640  				break;
   641  		if( i != sizeof(ext_list)/sizeof(const char*) )
   642  			continue;
   643  
   644  		// 関連づけ済みかどうかチェック
   645  		LoadASEx( fd.cFileName, &state );
   646  
   647  		// 適切な方のリストへ追加
   648  		*first_dot = '.';
   649  		*const_cast<char*>(kiPath::ext(fd.cFileName)-1) = '\0';
   650  		::SendMessage( lst[state?1:0], LB_SETITEMDATA,
   651  					   ::SendMessage( lst[state?1:0], LB_ADDSTRING, 0, (LPARAM)fd.cFileName ),
   652  					   state?1:0 );
   653  	}
   654  
   655  	return FALSE;
   656  }
   657  
   658  BOOL CALLBACK CNoahConfigDialog::CAssPage::proc( UINT msg, WPARAM wp, LPARAM lp )
   659  {
   660  	if( msg==WM_COMMAND )
   661  	{
   662  		char str[300];
   663  		DWORD dat;
   664  		HWND from=item(IDC_NASSOC), to=item(IDC_ASSOC);
   665  
   666  		switch( LOWORD(wp) )
   667  		{
   668  		case IDC_DEL:
   669  			from=item(IDC_ASSOC), to=item(IDC_NASSOC);
   670  		case IDC_ADD:{
   671  			int end = ::SendMessage( from, LB_GETCOUNT, 0, 0 );
   672  			for( int i=0; i<end; i++ )
   673  				if( ::SendMessage( from, LB_GETSEL, i, 0 ) )
   674  				{
   675  					// 取得
   676  					::SendMessage( from, LB_GETTEXT, i, (LPARAM)str );
   677  					dat = ::SendMessage( from, LB_GETITEMDATA, i, 0 );
   678  					// コピー
   679  					::SendMessage( to, LB_SETITEMDATA,
   680  								   ::SendMessage( to, LB_ADDSTRING, 0, (LPARAM)str ),
   681  								   dat );
   682  					// 削除
   683  					::SendMessage( from, LB_DELETESTRING, i, 0 );
   684  					i--, end--;
   685  				}
   686  
   687  			}return TRUE;
   688  		}
   689  	}
   690  	return FALSE;
   691  }
   692  
   693  static void crack_str( char* p )
   694  {
   695  	for( ; *p; p=kiStr::next(p) )
   696  		if( *p=='.' )
   697  			*p++ = '\0';
   698  	*++p = '\0';
   699  }
   700  
   701  bool CNoahConfigDialog::CAssPage::onOK()
   702  {
   703  	typedef void (WINAPI * XT_SAX)(const char*,bool);
   704  	XT_SAX SaveASEx = (XT_SAX)mycnf().getProc( "SaveASEx" );
   705  
   706  	char str[301];
   707  	int i, nc = sendMsgToItem( IDC_NASSOC, LB_GETCOUNT ),
   708  	       ac = sendMsgToItem(  IDC_ASSOC, LB_GETCOUNT );
   709  
   710  	// 解除
   711  	for( i=0; i<nc; i++ )
   712  		if( sendMsgToItem( IDC_NASSOC, LB_GETITEMDATA, i ) )
   713  		{
   714  			sendMsgToItem( IDC_NASSOC, LB_GETTEXT, i, (LPARAM)str );
   715  			crack_str( str );
   716  			SaveASEx( str, false );
   717  		}
   718  	// 設定
   719  	for( i=0; i<ac; i++ )
   720  		if( !sendMsgToItem( IDC_ASSOC, LB_GETITEMDATA, i ) )
   721  		{
   722  			sendMsgToItem(  IDC_ASSOC, LB_GETTEXT, i, (LPARAM)str );
   723  			crack_str( str );
   724  			SaveASEx( str, true );
   725  		}
   726  
   727  	return true;
   728  }
   729  
   730  ///////// その他設定 /////////////
   731  
   732  BOOL CNoahConfigDialog::CInfoPage::onInit()
   733  {
   734  	kiStr ver;
   735  	myarc().get_version( ver );
   736  	sendMsgToItem( IDC_VERSION, WM_SETTEXT, 0, (LPARAM)(const char*)ver );
   737  	return FALSE;
   738  }