Artifact Content

Not logged in

Artifact f3e6b8304ab28f8713a8ef14b11620d7185792b5


#ifndef AFX_ARCVIEWDLG_H__91EDF9F6_142E_4E25_BCE3_448E937E29D9__INCLUDED_
#define AFX_ARCVIEWDLG_H__91EDF9F6_142E_4E25_BCE3_448E937E29D9__INCLUDED_

#include "NoahApp.h"
#include "Archiver.h"
#include "resource.h"

class CArcViewDlg : public kiDialog, kiDataObject
{
public:
	CArcViewDlg( CArchiver* ptr,arcname& fnm,const kiPath& ddir )
		: kiDialog( IDD_ARCVIEW ), m_pArc( ptr ),
		m_fname( fnm ), m_ddir( ddir )
		{
			AddRef();
			myapp().get_tempdir( m_tdir );
		}

private: //-- ダイアログとしての処理

	BOOL CALLBACK proc( UINT msg, WPARAM wp, LPARAM lp );
	BOOL onInit();
	bool onOK();
	bool onCancel();
	void setdir()
		{
			char str[MAX_PATH];
			sendMsgToItem( IDC_DDIR, WM_GETTEXT, MAX_PATH, (LPARAM)str );
			m_ddir = str;
			m_ddir.beBackSlash( true );
			m_ddir.mkdir();
			m_ddir.beShortPath();
		}
	bool setSelection()
		{
			bool x=false;
			LVITEM it;
			it.mask = (LVIF_PARAM | LVIF_STATE);
			it.iSubItem = 0;
			it.stateMask = LVIS_SELECTED;
			for( it.iItem=0; sendMsgToItem( IDC_FILELIST, LVM_GETITEM, 0, (LPARAM)&it ); it.iItem++ )
				if( ((arcfile*)it.lParam)->selected = (0!=(LVIS_SELECTED&it.state)) )
					x = true;
			return x;
		}
	int hlp_cnt_check();
	bool m_bAble;

private: //-- ドラッグ&ドロップ処理

	bool giveData( const FORMATETC& fmt, STGMEDIUM* stg, bool firstcall );

private: //-- ソート処理

	void DoSort( int col );
	static int CALLBACK lv_compare( LPARAM p1, LPARAM p2, LPARAM type );
	bool m_bSmallFirst[6];

private: //-- 右クリック

	void DoRMenu();
	void GenerateDirMenu( HMENU m, int& id, StrArray* sx, const kiPath& pth );

private: //-- 解凍作業

	CArchiver* m_pArc;
	arcname m_fname;
	kiPath m_ddir, m_tdir;
	aflArray m_files;

//-- 存在しているウインドウ数管理。
public:	static void clear() { st_nLife=0; }
private:static void hello() { st_nLife++; }
		static void byebye() { if(--st_nLife==0) kiWindow::loopbreak(); }
		static int st_nLife;
};


class CArcPwdDlg : public kiDialog
{
	char *buf;
	const char *nam;
	int siz;
public:
	CArcPwdDlg( HWND h, char* x, int s, const char* n ) : kiDialog( IDD_PASSWORD ), buf(x), siz(s), nam(n)
		{
			doModal( h );
		}
	BOOL onInit()
		{
			sendMsgToItem( IDC_MASK, BM_SETCHECK, BST_CHECKED );
			sendMsgToItem( IDC_EDIT, EM_SETLIMITTEXT, siz );
			sendMsgToItem( IDC_EDIT, EM_SETPASSWORDCHAR, '*' );
			sendMsg( WM_SETTEXT, 0, (LPARAM)nam );
			::SetFocus( item(IDC_EDIT) );
			return TRUE;
		}
	BOOL CALLBACK proc( UINT msg, WPARAM wp, LPARAM lp )
		{
			if( msg==WM_COMMAND && LOWORD(wp)==IDC_MASK )
			{
				if( BST_CHECKED==sendMsgToItem( IDC_MASK, BM_GETCHECK ) )
					sendMsgToItem( IDC_EDIT, EM_SETPASSWORDCHAR, '*' );
				else
					sendMsgToItem( IDC_EDIT, EM_SETPASSWORDCHAR );
				::InvalidateRect( item(IDC_EDIT), NULL, TRUE );
			}
			return FALSE;
		}
	bool onOK()
		{
			sendMsgToItem( IDC_EDIT, WM_GETTEXT, siz, (LPARAM)buf );
			return true;
		}
};

class CArcProgressDlg : public kiDialog
{
	unsigned int bl;
public:
	CArcProgressDlg( unsigned int barlimit, bool packing=false )
		: kiDialog( IDD_PROGRESS ), bl( barlimit )
		{
			createModeless();
			if( bl<0x10000 )
				sendMsgToItem( IDC_BAR, PBM_SETRANGE, 0, MAKELPARAM(0,bl) );
			if( packing )
				sendMsg( WM_SETTEXT, 0, (LPARAM)"Compressing..." );
			kiWindow::setFront( hwnd() );
			msgloop();
		}
	~CArcProgressDlg()
		{
			if( isAlive() )
				end( IDCANCEL );
		}
	bool msgloop()
		{
			kiWindow::msg();
			return isAlive();
		}
	void change( const char* name=NULL, unsigned int pos=0xffffffff )
		{
			if( name ) sendMsgToItem( IDC_FNAME, WM_SETTEXT, 0, (LPARAM)name );
			if( pos!=0xffffffff )
				if( bl<0x10000 )sendMsgToItem( IDC_BAR, PBM_SETPOS, pos );
				else			sendMsgToItem( IDC_BAR, PBM_SETPOS, pos*100/bl );
		}
};


class CArcPathCheckDlg
{
private:
	class TheDlg : public kiDialog
	{
	public:
		TheDlg( const char* path, HWND h )
			: kiDialog(IDD_PATHCHECK), result(CANCEL), path(path) { doModal(h); }
		enum { YES, ALL_YES, CANCEL } result;
	private:
		const char* path;
		BOOL onInit()
		{
			sendMsgToItem( IDC_PATHNAME, WM_SETTEXT, 0, (LPARAM)path );
			return TRUE;
		}
		BOOL CALLBACK proc( UINT msg, WPARAM wp, LPARAM lp )
		{
			if( msg==WM_COMMAND )
				switch( LOWORD(wp) )
				{
				case IDYES:     result = YES;     end(IDOK);     return TRUE;
				case ID_ALLYES: result = ALL_YES; end(IDOK);     return TRUE;
				case ID_ALLNO:  result = CANCEL;  end(IDCANCEL); return TRUE;
				}
			return FALSE;
		}
	};

private:
	bool all_yes;

public:
	CArcPathCheckDlg() : all_yes(false) {}

	bool is_ok_to_extract( const char* path, kiWindow* wnd )
	{
		if( all_yes )
			return true;
		switch( TheDlg(path,wnd?wnd->hwnd():NULL).result )
		{
		case TheDlg::ALL_YES: all_yes = true;
		case TheDlg::YES:     return true;
		}
		return false;
	}
};


#endif