File Annotation

Not logged in
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: #include "stdafx.h"
13b7203622 2011-02-23        kinaba: #include "NoahApp.h"
13b7203622 2011-02-23        kinaba: #include "SubDlg.h"
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: int CArcViewDlg::st_nLife;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: BOOL CArcViewDlg::onInit()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	char cstr[100];
13b7203622 2011-02-23        kinaba: 	kiStr str;
13b7203622 2011-02-23        kinaba: 	kiPath path;
13b7203622 2011-02-23        kinaba: 	SHFILEINFO sfi,lfi;
13b7203622 2011-02-23        kinaba: 	HIMAGELIST hImS,hImL;
13b7203622 2011-02-23        kinaba: 	kiListView ctrl( this, IDC_FILELIST );
13b7203622 2011-02-23        kinaba: 	__int64 filesize_sum = 0;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	//-- ダイアログ一個生成の印
13b7203622 2011-02-23        kinaba: 	hello();
13b7203622 2011-02-23        kinaba: 	m_bSmallFirst[0] = m_bSmallFirst[1] = m_bSmallFirst[2] =
13b7203622 2011-02-23        kinaba: 	m_bSmallFirst[3] = m_bSmallFirst[4] = m_bSmallFirst[5] = true;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	//-- 真ん中に&前に
13b7203622 2011-02-23        kinaba: 	setCenter( hwnd(), app()->mainhwnd() );
13b7203622 2011-02-23        kinaba: 	setFront( hwnd() );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	//-- アイコン
13b7203622 2011-02-23        kinaba: 	path = m_fname.basedir, path += m_fname.sname;
13b7203622 2011-02-23        kinaba: 	hImS = (HIMAGELIST)::SHGetFileInfo( path, 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX | SHGFI_ICON | SHGFI_SMALLICON );
13b7203622 2011-02-23        kinaba: 	hImL = (HIMAGELIST)::SHGetFileInfo( path, 0, &lfi, sizeof(lfi), SHGFI_SYSICONINDEX | SHGFI_ICON | SHGFI_LARGEICON );
13b7203622 2011-02-23        kinaba: 	sendMsg( WM_SETICON, ICON_BIG,   (LPARAM)lfi.hIcon );
13b7203622 2011-02-23        kinaba: 	sendMsg( WM_SETICON, ICON_SMALL, (LPARAM)sfi.hIcon );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	//-- タイトル
13b7203622 2011-02-23        kinaba: 	sendMsg( WM_SETTEXT, 0, (LPARAM)kiPath(m_fname.lname).name() );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	//-- 解凍先
13b7203622 2011-02-23        kinaba: 	sendMsgToItem( IDC_DDIR, WM_SETTEXT, 0, (LPARAM)(const char*)m_ddir );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	//-- リスト
13b7203622 2011-02-23        kinaba: 	if( !m_pArc->list( m_fname, m_files ) || m_files.len()==0 )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		m_bAble = false;
13b7203622 2011-02-23        kinaba: 		ctrl.insertColumn( 0, "", 510 );
13b7203622 2011-02-23        kinaba: 		ctrl.insertItem( 0, str.loadRsrc(IDS_NOLIST) );
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	else
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		m_bAble = ( 0 != (m_pArc->ability() & aMeltEach) );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		ctrl.setImageList( hImL, hImS );
13b7203622 2011-02-23        kinaba: 		ctrl.insertColumn( 0, str.loadRsrc(IDS_FNAME),   110 );
13b7203622 2011-02-23        kinaba: 		ctrl.insertColumn( 1, str.loadRsrc(IDS_SIZE),    70,  LVCFMT_RIGHT );
13b7203622 2011-02-23        kinaba: 		ctrl.insertColumn( 2, str.loadRsrc(IDS_DATETIME),100, LVCFMT_RIGHT );
13b7203622 2011-02-23        kinaba: 		ctrl.insertColumn( 3, str.loadRsrc(IDS_RATIO),   55,  LVCFMT_RIGHT );
13b7203622 2011-02-23        kinaba: 		ctrl.insertColumn( 4, str.loadRsrc(IDS_METHOD),  50,  LVCFMT_RIGHT );
13b7203622 2011-02-23        kinaba: 		ctrl.insertColumn( 5, str.loadRsrc(IDS_PATH),    130 );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		FILETIME ftm;
13b7203622 2011-02-23        kinaba: 		SYSTEMTIME stm;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		//-- アイテム
13b7203622 2011-02-23        kinaba: 		for( unsigned int i=0,k=0; i!=m_files.len(); i++ )
13b7203622 2011-02-23        kinaba: 			if( m_files[i].isfile )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: #define			usiz (m_files[i].inf.dwOriginalSize)
13b7203622 2011-02-23        kinaba: #define			csiz (m_files[i].inf.dwCompressedSize)
13b7203622 2011-02-23        kinaba: #define			method (m_files[i].inf.szMode)
13b7203622 2011-02-23        kinaba: #define			date (m_files[i].inf.wDate)
13b7203622 2011-02-23        kinaba: #define			time (m_files[i].inf.wTime)
13b7203622 2011-02-23        kinaba: 				path = m_files[i].inf.szFileName;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 				// ファイル名
13b7203622 2011-02-23        kinaba: 				ctrl.insertItem( k, path.name(),
13b7203622 2011-02-23        kinaba: 					(LPARAM)(&m_files[i]), kiSUtil::getSysIcon(path.ext()) );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 				// サイズ
13b7203622 2011-02-23        kinaba: 				if( usiz == 0xffffffff )
13b7203622 2011-02-23        kinaba: 					ctrl.setSubItem( k, 1, "????" );
13b7203622 2011-02-23        kinaba: 				else
13b7203622 2011-02-23        kinaba: 					ctrl.setSubItem( k, 1, str.setInt( usiz,true ) );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 				// 時間
13b7203622 2011-02-23        kinaba: 				if( ::DosDateTimeToFileTime( date, time, &ftm )
13b7203622 2011-02-23        kinaba: 				 && ::FileTimeToSystemTime( &ftm, &stm ) )
13b7203622 2011-02-23        kinaba: 				{
13b7203622 2011-02-23        kinaba: 					*cstr=0;
13b7203622 2011-02-23        kinaba: 					::GetDateFormat( LOCALE_USER_DEFAULT, 0, &stm,
13b7203622 2011-02-23        kinaba: 									 "yy/MM/dd", cstr, sizeof(cstr) );
13b7203622 2011-02-23        kinaba: 					str=cstr;
13b7203622 2011-02-23        kinaba: 					::GetTimeFormat( LOCALE_USER_DEFAULT, 0, &stm,
13b7203622 2011-02-23        kinaba: 									 " HH:mm", cstr, sizeof(cstr) );
13b7203622 2011-02-23        kinaba: 					str+=cstr;
13b7203622 2011-02-23        kinaba: 					ctrl.setSubItem( k, 2, str );
13b7203622 2011-02-23        kinaba: 				}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 				// 圧縮率
13b7203622 2011-02-23        kinaba: 				filesize_sum += usiz;
13b7203622 2011-02-23        kinaba: 				if( usiz==0 )		ctrl.setSubItem( k, 3, "100%" );
13b7203622 2011-02-23        kinaba: 				else if( csiz==0 )	ctrl.setSubItem( k, 3, "????" );
13b7203622 2011-02-23        kinaba: 				else				ctrl.setSubItem( k, 3, str.setInt( (int)(((__int64)csiz)*100/usiz) )+='%' );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 				// メソッド
13b7203622 2011-02-23        kinaba: 				ctrl.setSubItem( k, 4, method );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 				// パス
13b7203622 2011-02-23        kinaba: 				path.beDirOnly();
13b7203622 2011-02-23        kinaba: 				ctrl.setSubItem( k, 5, path );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 				k++;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: #undef			usiz
13b7203622 2011-02-23        kinaba: #undef			csiz
13b7203622 2011-02-23        kinaba: #undef			method
13b7203622 2011-02-23        kinaba: #undef			date
13b7203622 2011-02-23        kinaba: #undef			time
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		//-- ドラッグ&ドロップフォーマット登録
13b7203622 2011-02-23        kinaba: 		FORMATETC fmt;
13b7203622 2011-02-23        kinaba: 		fmt.cfFormat = CF_HDROP;
13b7203622 2011-02-23        kinaba: 		fmt.ptd      = NULL;
13b7203622 2011-02-23        kinaba: 		fmt.dwAspect = DVASPECT_CONTENT;
13b7203622 2011-02-23        kinaba: 		fmt.lindex   = -1;
13b7203622 2011-02-23        kinaba: 		fmt.tymed    = TYMED_HGLOBAL;
13b7203622 2011-02-23        kinaba: 		addFormat( fmt );
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	//-- 情報 --
13b7203622 2011-02-23        kinaba: 	char tmp[255];
13b7203622 2011-02-23        kinaba: 	kiStr full_filename = m_fname.basedir + m_fname.lname;
13b7203622 2011-02-23        kinaba: 	__int64 filesize_arc = kiFile::getSize64(full_filename);
13b7203622 2011-02-23        kinaba: 	if( filesize_sum==0 ) filesize_sum = 1;
13b7203622 2011-02-23        kinaba: 	wsprintf( tmp, kiStr().loadRsrc(IDS_ARCVIEW_MSG),
13b7203622 2011-02-23        kinaba: 		m_files.len(),
13b7203622 2011-02-23        kinaba: 		(int)(filesize_arc*100 / filesize_sum),
13b7203622 2011-02-23        kinaba: 		(const char*)m_pArc->arctype_name(full_filename)
13b7203622 2011-02-23        kinaba: 	);
13b7203622 2011-02-23        kinaba: 	sendMsgToItem( IDC_STATUSBAR, WM_SETTEXT, 0, (long)tmp );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	if( !m_bAble )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		static const UINT items[] = { IDC_SELECTINV,IDC_REF,IDC_MELTEACH,IDC_SHOW,IDC_DDIR };
13b7203622 2011-02-23        kinaba: 		for( int i=0; i!=sizeof(items)/sizeof(UINT); i++ )
13b7203622 2011-02-23        kinaba: 			::EnableWindow( item(items[i]), FALSE );
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	return FALSE;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: bool CArcViewDlg::onOK()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	setdir();
13b7203622 2011-02-23        kinaba: 	m_pArc->melt( m_fname, m_ddir );
13b7203622 2011-02-23        kinaba: 	myapp().open_folder( m_ddir, 1 );
13b7203622 2011-02-23        kinaba: 	kiSUtil::switchCurDirToExeDir(); // 念のため
13b7203622 2011-02-23        kinaba: 	return onCancel();
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: bool CArcViewDlg::onCancel()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	::SetCurrentDirectory( m_fname.basedir );
13b7203622 2011-02-23        kinaba: 	m_tdir.remove();
13b7203622 2011-02-23        kinaba: 	if( kiSUtil::exist(m_tdir) )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		kiStr tmp(600);
13b7203622 2011-02-23        kinaba: 		if( IDNO==app()->msgBox( tmp.loadRsrc(IDS_EXECUTING), NULL, MB_YESNO|MB_DEFBUTTON2 ) )
13b7203622 2011-02-23        kinaba: 			return false;
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	kiListView(this,IDC_FILELIST).setImageList( NULL, NULL );
13b7203622 2011-02-23        kinaba: 	byebye();
13b7203622 2011-02-23        kinaba: 	return true;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: bool CArcViewDlg::giveData( const FORMATETC& fmt, STGMEDIUM* stg, bool firstcall )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( firstcall )
13b7203622 2011-02-23        kinaba: 		if( 0x8000<=m_pArc->melt( m_fname, m_tdir, &m_files ) )
13b7203622 2011-02-23        kinaba: 			return false;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	unsigned int i;
13b7203622 2011-02-23        kinaba: 	BOOL fWide = (app()->osver().dwPlatformId==VER_PLATFORM_WIN32_NT);
13b7203622 2011-02-23        kinaba: 	kiArray<kiPath> lst;
13b7203622 2011-02-23        kinaba: 	kiPath tmp;
13b7203622 2011-02-23        kinaba: 	int flen = 0;
13b7203622 2011-02-23        kinaba: 	wchar_t wbuf[600];
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	for( i=0; i!=m_files.len(); i++ )
13b7203622 2011-02-23        kinaba: 		if( m_files[i].selected )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			tmp = m_tdir;
13b7203622 2011-02-23        kinaba: 			tmp += m_files[i].inf.szFileName;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			lst.add( tmp );
13b7203622 2011-02-23        kinaba: 			if( fWide )
13b7203622 2011-02-23        kinaba: 				flen += (::MultiByteToWideChar( CP_ACP, 0, tmp, -1, wbuf, 600 )+1)*2;
13b7203622 2011-02-23        kinaba: 			else
13b7203622 2011-02-23        kinaba: 				flen += (tmp.len()+1);
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	HDROP hDrop = (HDROP)::GlobalAlloc( GHND, sizeof(DROPFILES)+flen+1 );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	DROPFILES* dr = (DROPFILES*)::GlobalLock( hDrop );
13b7203622 2011-02-23        kinaba: 	dr->pFiles = sizeof(DROPFILES);
13b7203622 2011-02-23        kinaba: 	dr->pt.x   = dr->pt.y = 0;
13b7203622 2011-02-23        kinaba: 	dr->fNC    = FALSE;
13b7203622 2011-02-23        kinaba: 	dr->fWide  = fWide;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	char* buf = (char*)(&dr[1]);
13b7203622 2011-02-23        kinaba: 	for( i=0; i!=lst.len(); i++ )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		if( fWide )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			flen = ::MultiByteToWideChar( CP_ACP, 0, lst[i], -1, wbuf, 600 );
13b7203622 2011-02-23        kinaba: 			ki_memcpy( buf, wbuf, flen*2 );
13b7203622 2011-02-23        kinaba: 			for( int k=0; k!=flen; k++ )
13b7203622 2011-02-23        kinaba: 				if( ((wchar_t*)buf)[k] == '/' )
13b7203622 2011-02-23        kinaba: 					((wchar_t*)buf)[k] = '\\';
13b7203622 2011-02-23        kinaba: 			buf += flen*2;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 		else
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			ki_strcpy( buf,lst[i] );
13b7203622 2011-02-23        kinaba: 			for( int k=0; k!=lst[i].len(); k++ )
13b7203622 2011-02-23        kinaba: 				if( buf[k] == '/' )
13b7203622 2011-02-23        kinaba: 					buf[k] = '\\';
13b7203622 2011-02-23        kinaba: 			buf += lst[i].len() + 1;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	*buf=0;
13b7203622 2011-02-23        kinaba: 	if( fWide )
13b7203622 2011-02-23        kinaba: 		buf[1]='\0';
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	::GlobalUnlock( hDrop );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	stg->hGlobal        = hDrop;
13b7203622 2011-02-23        kinaba: 	stg->tymed          = TYMED_HGLOBAL;
13b7203622 2011-02-23        kinaba: 	stg->pUnkForRelease = NULL;
13b7203622 2011-02-23        kinaba: 	return true;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: BOOL CALLBACK CArcViewDlg::proc( UINT msg, WPARAM wp, LPARAM lp )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	switch( msg )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 	//-- メインウインドウ指定 ---------------------
13b7203622 2011-02-23        kinaba: 	case WM_ACTIVATE:
13b7203622 2011-02-23        kinaba: 		if( LOWORD(wp)==WA_ACTIVE || LOWORD(wp)==WA_CLICKACTIVE )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			app()->setMainWnd( this );
13b7203622 2011-02-23        kinaba: 			return TRUE;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 		break;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	//-- リサイズ関連の処理 ---------------------
13b7203622 2011-02-23        kinaba: 	case WM_GETMINMAXINFO:
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			RECT self,child;
13b7203622 2011-02-23        kinaba: 			::GetWindowRect( hwnd(), &self );
13b7203622 2011-02-23        kinaba: 			::GetWindowRect( item(IDC_REF), &child );
13b7203622 2011-02-23        kinaba: 			POINT& sz = ((MINMAXINFO*)lp)->ptMinTrackSize;
13b7203622 2011-02-23        kinaba: 			sz.x = child.right - self.left + 18;
13b7203622 2011-02-23        kinaba: 			sz.y = child.bottom - self.top + 100;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 		return TRUE;
13b7203622 2011-02-23        kinaba: 	case WM_SIZE:
13b7203622 2011-02-23        kinaba: 		if( wp!=SIZE_MAXHIDE && wp!=SIZE_MINIMIZED )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			RECT self,ref,child,sbar;
13b7203622 2011-02-23        kinaba: 			::GetWindowRect( hwnd(), &self );
13b7203622 2011-02-23        kinaba: 			::GetWindowRect( item(IDC_REF), &ref );
13b7203622 2011-02-23        kinaba: 			::GetWindowRect( item(IDC_FILELIST), &child );
13b7203622 2011-02-23        kinaba: 			::GetClientRect( item(IDC_STATUSBAR), &sbar );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			::SetWindowPos( item(IDC_FILELIST), NULL, 0, 0,
13b7203622 2011-02-23        kinaba: 				LOWORD(lp),
13b7203622 2011-02-23        kinaba: 				(self.bottom-ref.bottom)-(child.top-ref.bottom)
13b7203622 2011-02-23        kinaba: 				-(sbar.bottom-sbar.top)-10,
13b7203622 2011-02-23        kinaba: 				SWP_NOMOVE|SWP_NOOWNERZORDER|SWP_NOZORDER );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			::GetClientRect( hwnd(), &self );
13b7203622 2011-02-23        kinaba: 			::SetWindowPos( item(IDC_STATUSBAR), NULL, sbar.left,
13b7203622 2011-02-23        kinaba: 				self.bottom - (sbar.bottom-sbar.top),
13b7203622 2011-02-23        kinaba: 				0, 0, SWP_NOSIZE|SWP_NOOWNERZORDER|SWP_NOZORDER );
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 		break;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	case WM_NOTIFY:
13b7203622 2011-02-23        kinaba: 		if( wp==IDC_FILELIST && m_bAble )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			NMHDR* phdr=(NMHDR*)lp;
13b7203622 2011-02-23        kinaba: 			if( phdr->code==LVN_BEGINDRAG || phdr->code==LVN_BEGINRDRAG )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				if( setSelection() )
13b7203622 2011-02-23        kinaba: 					kiDropSource::DnD( this, DROPEFFECT_COPY );
13b7203622 2011-02-23        kinaba: 				return TRUE;
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 			else if( phdr->code==LVN_COLUMNCLICK )
13b7203622 2011-02-23        kinaba: 				DoSort( ((NMLISTVIEW*)lp)->iSubItem );
13b7203622 2011-02-23        kinaba: 			else if( phdr->code==NM_DBLCLK )
13b7203622 2011-02-23        kinaba: 				sendMsg( WM_COMMAND, IDC_SHOW );
13b7203622 2011-02-23        kinaba: 			else if( phdr->code==NM_RCLICK )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				if( setSelection() )
13b7203622 2011-02-23        kinaba: 					DoRMenu();
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 		break;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	case WM_COMMAND:
13b7203622 2011-02-23        kinaba: 		switch( LOWORD(wp) )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 		case IDC_SELECTINV: // 選択反転
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				LVITEM item;
13b7203622 2011-02-23        kinaba: 				item.mask = LVIF_STATE;
13b7203622 2011-02-23        kinaba: 				item.stateMask = LVIS_SELECTED;
13b7203622 2011-02-23        kinaba: 				int j,m=sendMsgToItem( IDC_FILELIST, LVM_GETITEMCOUNT );
13b7203622 2011-02-23        kinaba: 				for( j=0; j!=m; j++ )
13b7203622 2011-02-23        kinaba: 				{
13b7203622 2011-02-23        kinaba: 					item.state = ~sendMsgToItem( IDC_FILELIST, LVM_GETITEMSTATE, j, LVIS_SELECTED );
13b7203622 2011-02-23        kinaba: 					sendMsgToItem( IDC_FILELIST, LVM_SETITEMSTATE, j, (LPARAM)&item );
13b7203622 2011-02-23        kinaba: 				}
13b7203622 2011-02-23        kinaba: 				::SetFocus( this->item(IDC_FILELIST) );
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 			return TRUE;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		case IDC_REF: // 解凍先設定
13b7203622 2011-02-23        kinaba: 			kiSUtil::getFolderDlgOfEditBox( item(IDC_DDIR), hwnd(), kiStr().loadRsrc(IDS_CHOOSEDIR) );
13b7203622 2011-02-23        kinaba: 			return TRUE;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		case IDC_MELTEACH: // 一部解凍
13b7203622 2011-02-23        kinaba: 			if( setSelection() )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				setdir();
13b7203622 2011-02-23        kinaba: 				int result = m_pArc->melt( m_fname, m_ddir, &m_files );
13b7203622 2011-02-23        kinaba: 				if( result<0x8000 )
13b7203622 2011-02-23        kinaba: 					myapp().open_folder( m_ddir, 1 );
13b7203622 2011-02-23        kinaba: 				else if( result != 0x8020 )
13b7203622 2011-02-23        kinaba: 				{
13b7203622 2011-02-23        kinaba: 					char str[255];
13b7203622 2011-02-23        kinaba: 					wsprintf( str, "%s\nError No: [%x]",
13b7203622 2011-02-23        kinaba: 						(const char*)kiStr().loadRsrc( IDS_M_ERROR ), result );
13b7203622 2011-02-23        kinaba: 					app()->msgBox( str );
13b7203622 2011-02-23        kinaba: 				}
13b7203622 2011-02-23        kinaba: 				kiSUtil::switchCurDirToExeDir(); // 念のため
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 			return TRUE;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		case IDC_SHOW: // 表示
13b7203622 2011-02-23        kinaba: 			if( setSelection() )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				int assocCnt = hlp_cnt_check();
13b7203622 2011-02-23        kinaba: 				if( 0x8000 > m_pArc->melt( m_fname, m_tdir, &m_files ) )
13b7203622 2011-02-23        kinaba: 				{
13b7203622 2011-02-23        kinaba: 					if( assocCnt != -1 )
13b7203622 2011-02-23        kinaba: 						m_files[assocCnt].selected = false;
13b7203622 2011-02-23        kinaba: 					for( unsigned i=0; i!=m_files.len(); i++ )
13b7203622 2011-02-23        kinaba: 						if( m_files[i].selected )
13b7203622 2011-02-23        kinaba: 						{
13b7203622 2011-02-23        kinaba: 							kiPath tmp(m_tdir);
13b7203622 2011-02-23        kinaba: 							char yen[MAX_PATH];
13b7203622 2011-02-23        kinaba: 							ki_strcpy( yen, m_files[i].inf.szFileName );
13b7203622 2011-02-23        kinaba: 							for( char* p=yen; *p; p=kiStr::next(p) )
13b7203622 2011-02-23        kinaba: 								if( *p=='/' )
13b7203622 2011-02-23        kinaba: 									*p = '\\';
13b7203622 2011-02-23        kinaba: 							tmp += yen;
13b7203622 2011-02-23        kinaba: 							::ShellExecute( hwnd(), NULL, tmp, NULL, m_tdir, SW_SHOWDEFAULT );
13b7203622 2011-02-23        kinaba: 						}
13b7203622 2011-02-23        kinaba: 				}
13b7203622 2011-02-23        kinaba: 				kiSUtil::switchCurDirToExeDir(); // 念のため
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 			return TRUE;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	return FALSE;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: int CArcViewDlg::hlp_cnt_check()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	// 一個目の選択済みファイルが .hlp か否か
13b7203622 2011-02-23        kinaba: 	for( unsigned i=0; i!=m_files.len(); i++ )
13b7203622 2011-02-23        kinaba: 		if( m_files[i].selected )
13b7203622 2011-02-23        kinaba: 			break;
13b7203622 2011-02-23        kinaba: 	if( i==m_files.len() )
13b7203622 2011-02-23        kinaba: 		return -1;
13b7203622 2011-02-23        kinaba: 	int x = kiPath::ext(m_files[i].inf.szFileName)-m_files[i].inf.szFileName;
13b7203622 2011-02-23        kinaba: 	if( 0!=ki_strcmpi( "hlp", m_files[i].inf.szFileName+x ) )
13b7203622 2011-02-23        kinaba: 		return -1;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// .cnt のファイル名
13b7203622 2011-02-23        kinaba: 	char cntpath[FNAME_MAX32];
13b7203622 2011-02-23        kinaba: 	ki_strcpy( cntpath, m_files[i].inf.szFileName );
13b7203622 2011-02-23        kinaba: 	cntpath[x]='c', cntpath[x+1]='n', cntpath[x+2]='t';
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// .cntも一時的に選択する
13b7203622 2011-02-23        kinaba: 	for( i=0; i!=m_files.len(); i++ )
13b7203622 2011-02-23        kinaba: 		if( 0==ki_strcmpi( cntpath, m_files[i].inf.szFileName ) )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			if( m_files[i].selected )
13b7203622 2011-02-23        kinaba: 				return -1;
13b7203622 2011-02-23        kinaba: 			m_files[i].selected = true;
13b7203622 2011-02-23        kinaba: 			return i;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	return -1;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: int CALLBACK CArcViewDlg::lv_compare( LPARAM p1, LPARAM p2, LPARAM type )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	bool rev = false;
13b7203622 2011-02-23        kinaba: 	if( type>=10000 )
13b7203622 2011-02-23        kinaba: 		rev=true, type-=10000;
13b7203622 2011-02-23        kinaba: 	int ans = 0;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	INDIVIDUALINFO *a1=&((arcfile*)p1)->inf, *a2=&((arcfile*)p2)->inf;
13b7203622 2011-02-23        kinaba: 	switch( type )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 	case 0: //NAME
13b7203622 2011-02-23        kinaba: 		ans = ::lstrcmp( kiPath::name(a1->szFileName),
13b7203622 2011-02-23        kinaba: 			             kiPath::name(a2->szFileName) );
13b7203622 2011-02-23        kinaba: 		break;
13b7203622 2011-02-23        kinaba: 	case 1: //SIZE
13b7203622 2011-02-23        kinaba: 		ans = (signed)a1->dwOriginalSize - (signed)a2->dwOriginalSize;
13b7203622 2011-02-23        kinaba: 		break;
13b7203622 2011-02-23        kinaba: 	case 2: //DATE,TIME
13b7203622 2011-02-23        kinaba: 		ans = (signed)a1->wDate - (signed)a2->wDate;
13b7203622 2011-02-23        kinaba: 		if( ans==0 )
13b7203622 2011-02-23        kinaba: 			ans = (signed)a1->wTime - (signed)a2->wTime;
13b7203622 2011-02-23        kinaba: 		break;
13b7203622 2011-02-23        kinaba: 	case 3:{//RATIO
13b7203622 2011-02-23        kinaba: 		int cr1, cr2;
13b7203622 2011-02-23        kinaba: 		if( a1->dwOriginalSize==0 )        cr1=100;
13b7203622 2011-02-23        kinaba: 		else if( a1->dwCompressedSize==0 ) cr1=-1;
13b7203622 2011-02-23        kinaba: 		else cr1 = (a1->dwCompressedSize*100)/(a1->dwOriginalSize);
13b7203622 2011-02-23        kinaba: 		if( a2->dwOriginalSize==0 )        cr2=100;
13b7203622 2011-02-23        kinaba: 		else if( a2->dwCompressedSize==0 ) cr2=-1;
13b7203622 2011-02-23        kinaba: 		else cr2 = (int)((((__int64)a2->dwCompressedSize)*100)/(a2->dwOriginalSize));
13b7203622 2011-02-23        kinaba: 		ans = cr1 - cr2;
13b7203622 2011-02-23        kinaba: 		}break;
13b7203622 2011-02-23        kinaba: 	case 4: //METHOD
13b7203622 2011-02-23        kinaba: 		ans = ::lstrcmp( a1->szMode, a2->szMode );
13b7203622 2011-02-23        kinaba: 		break;
13b7203622 2011-02-23        kinaba: 	case 5:{//PATH
13b7203622 2011-02-23        kinaba: 		kiPath pt1(a1->szFileName), pt2(a2->szFileName);
13b7203622 2011-02-23        kinaba: 		pt1.beDirOnly(), pt2.beDirOnly();
13b7203622 2011-02-23        kinaba: 		ans = ::lstrcmp( pt1, pt2 );
13b7203622 2011-02-23        kinaba: 		}break;
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	return rev ? -ans : ans;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void CArcViewDlg::DoSort( int col )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	WPARAM p = col + (m_bSmallFirst[col] ? 0 : 10000);
13b7203622 2011-02-23        kinaba: 	sendMsgToItem( IDC_FILELIST, LVM_SORTITEMS, p, (LPARAM)lv_compare );
13b7203622 2011-02-23        kinaba: 	m_bSmallFirst[col] = !m_bSmallFirst[col];
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void CArcViewDlg::GenerateDirMenu( HMENU m, int& id, StrArray* sx, const kiPath& pth )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	// フォルダ内リストアップ
13b7203622 2011-02-23        kinaba: 	kiFindFile ff;
13b7203622 2011-02-23        kinaba: 	ff.begin( kiPath(pth)+="*" );
13b7203622 2011-02-23        kinaba: 	for( WIN32_FIND_DATA fd; ff.next(&fd); )
13b7203622 2011-02-23        kinaba: 		if( fd.cFileName[0]!='.'
13b7203622 2011-02-23        kinaba: 		 && !(fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			kiPath fullpath(pth); fullpath+=fd.cFileName;
13b7203622 2011-02-23        kinaba: 			const int pID=id;
13b7203622 2011-02-23        kinaba: 			MENUITEMINFO mi = { sizeof(MENUITEMINFO) };
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			if( fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				// 再帰的に
13b7203622 2011-02-23        kinaba: 				mi.fMask = MIIM_SUBMENU | 0x00000040;// (MIIM_STRING)
13b7203622 2011-02-23        kinaba: 				mi.hSubMenu = ::CreatePopupMenu();
13b7203622 2011-02-23        kinaba: 				GenerateDirMenu( mi.hSubMenu, id, sx,
13b7203622 2011-02-23        kinaba: 					kiPath(kiPath(fullpath)+="\\") );
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 			else
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				const char* ext = kiPath::ext(fd.cFileName);
13b7203622 2011-02-23        kinaba: 				if( ::lstrlen(ext) > 4 ) continue;
13b7203622 2011-02-23        kinaba: 				if( 0==::lstrcmpi(ext,"lnk") )
13b7203622 2011-02-23        kinaba: 					*const_cast<char*>(ext-1) = '\0';
13b7203622 2011-02-23        kinaba: 				mi.fMask = MIIM_ID | 0x00000040;// (MIIM_STRING)
13b7203622 2011-02-23        kinaba: 				mi.wID = id++;
13b7203622 2011-02-23        kinaba: 				sx->add( fullpath );
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			mi.dwTypeData = const_cast<char*>((const char*)fd.cFileName);
13b7203622 2011-02-23        kinaba: 			mi.cch        = ::lstrlen(fd.cFileName);
13b7203622 2011-02-23        kinaba: 			::InsertMenuItem( m, pID, FALSE, &mi );
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void CArcViewDlg::DoRMenu()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	// メニュー作成
13b7203622 2011-02-23        kinaba: 	HMENU m = ::CreatePopupMenu();
13b7203622 2011-02-23        kinaba: 	POINT pt; ::GetCursorPos( &pt );
13b7203622 2011-02-23        kinaba: 	const int IDSTART = 128;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// フォルダの中身をリストアップしつつメニューに追加
13b7203622 2011-02-23        kinaba: 	int id = IDSTART;
13b7203622 2011-02-23        kinaba: 	StrArray lst;
13b7203622 2011-02-23        kinaba: 	GenerateDirMenu( m, id, &lst, kiPath(CSIDL_SENDTO) );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// メニュー表示
13b7203622 2011-02-23        kinaba: 	id = ::TrackPopupMenu( m,
13b7203622 2011-02-23        kinaba: 		TPM_LEFTALIGN|TPM_TOPALIGN|TPM_RETURNCMD|TPM_NONOTIFY,
13b7203622 2011-02-23        kinaba: 		pt.x, pt.y, 0, hwnd(), NULL );
13b7203622 2011-02-23        kinaba: 	::DestroyMenu( m );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// 結果処理
13b7203622 2011-02-23        kinaba: 	if( id != 0 )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		kiStr cmd;
13b7203622 2011-02-23        kinaba: 		if( 0x8000>m_pArc->melt( m_fname, m_tdir, &m_files ) )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			for( UINT i=0; i!=m_files.len(); i++ )
13b7203622 2011-02-23        kinaba: 				if( m_files[i].selected )
13b7203622 2011-02-23        kinaba: 				{
13b7203622 2011-02-23        kinaba: 					cmd += "\"";
13b7203622 2011-02-23        kinaba: 					cmd += m_tdir;
13b7203622 2011-02-23        kinaba: 					const char* buf = m_files[i].inf.szFileName;
13b7203622 2011-02-23        kinaba: 					for( int k=0; buf[k]; ++k )
13b7203622 2011-02-23        kinaba: 						cmd += ( buf[k]=='/' ? '\\' : buf[k] );
13b7203622 2011-02-23        kinaba: 					cmd += "\" ";
13b7203622 2011-02-23        kinaba: 				}
13b7203622 2011-02-23        kinaba: 			ShellExecute(hwnd(),NULL,lst[id-IDSTART],cmd,NULL,SW_SHOW);
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: