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 }