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: