📄 ceditdoc.cpp
字号:
// BOOL bReadOnly;
strcpy( pszPathNew, "" );
/* 「ファイルを開く」ダイアログ */
nCharCode = CODE_AUTODETECT; /* 文字コード自動判別 */
bReadOnly = FALSE;
// ::ShowWindow( m_hWnd, SW_SHOW );
if( !OpenFileDialog( m_hWnd, pszPath, pszPathNew, &nCharCode, &bReadOnly ) ){
delete [] pszPathNew;
return FALSE;
}
strcpy( pszPath, pszPathNew );
delete [] pszPathNew;
if( -1 == _access( pszPath, 0 ) ){
bFileIsExist = FALSE;
}else{
bFileIsExist = TRUE;
}
}
}
}
// From Here Oct. 19, 2002 genta
// 読み込みアクセス権が無い場合には漢字コード判定でファイルを
// 開けないので文字コード判別エラーと出てしまう.
// より適切なメッセージを出すため,読めないファイルは
// 事前に判定?排除する
//
// _accessではロックされたファイルの状態を取得できないので
// 実際にファイルを開いて確認する
if( bFileIsExist){
HANDLE hTest = CreateFile( pszPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL );
if( hTest == INVALID_HANDLE_VALUE ){
// 読み込みアクセス権がない
::MYMESSAGEBOX(
m_hWnd, MB_OK | MB_ICONSTOP, GSTR_APPNAME,
_T("\'%s\'\nというファイルを開けません。\n読み込みアクセス権がありません。"),
pszPath
);
return FALSE;
}
else {
CloseHandle( hTest );
}
}
// To Here Oct. 19, 2002 genta
CEditWnd* pCEditWnd = m_pcEditWnd; // Sep. 10, 2002 genta
if( NULL != pCEditWnd ){
hwndProgress = pCEditWnd->m_hwndProgressBar;
}else{
hwndProgress = NULL;
}
bRet = TRUE;
if( NULL == pszPath ){
MYMESSAGEBOX(
m_hWnd,
MB_YESNO | MB_ICONEXCLAMATION | MB_TOPMOST,
"バグじゃぁあああ!!!",
"CEditDoc::FileRead()\n\nNULL == pszPath\n【対処】エラーの出た状況を作者に連絡してくださいね。"
);
return FALSE;
}
/* 指定ファイルが開かれているか調べる */
if( CShareData::getInstance()->IsPathOpened( pszPath, &hWndOwner ) ){
::SendMessage( hWndOwner, MYWM_GETFILEINFO, 0, 0 );
// pfi = (FileInfo*)m_pShareData->m_szWork;
pfi = (FileInfo*)&m_pShareData->m_FileInfo_MYWM_GETFILEINFO;
/* アクティブにする */
ActivateFrameWindow( hWndOwner );
*pbOpened = TRUE;
/* MRUリストへの登録 */
//@@@ 2001.12.26 YAZAKI MRUリストは、CMRUに依頼する
cMRU.Add( pfi );
bRet = FALSE;
goto end_of_func;
}
for( i = 0; i < 4; ++i ){
if( m_cEditViewArr[i].IsTextSelected() ){ /* テキストが選択されているか */
/* 現在の選択範囲を非選択状態に戻す */
m_cEditViewArr[i].DisableSelectArea( TRUE );
}
}
// Sep. 10, 2002 genta
SetFilePath( pszPath ); /* 現在編集中のファイルのパス */
/* 指定された文字コード種別に変更する */
// Oct. 25, 2000 genta
// 文字コードとして異常な値が設定された場合の対応
// -1以上CODE_MAX未満のみ受け付ける
// Oct. 26, 2000 genta
// CODE_AUTODETECTはこの範囲から外れているから個別にチェック
if( ( -1 <= nCharCode && nCharCode < CODE_CODEMAX ) || nCharCode == CODE_AUTODETECT )
m_nCharCode = nCharCode;
/* MRUリストに存在するか調べる 存在するならばファイル情報を返す */
//@@@ 2001.12.26 YAZAKI MRUリストは、CMRUに依頼する
if ( cMRU.GetFileInfo( pszPath, &fi ) ){
bIsExistInMRU = TRUE;
// m_cDlgJump.m_bPLSQL = fi.m_bPLSQL; /* 行ジャンプが PL/SQLモードか */
// m_cDlgJump.m_nPLSQL_E1 = fi.m_nPLSQL_E1; /* 行ジャンプが PL/SQLモードのときの基点 */
if( -1 == m_nCharCode ){
/* 前回に指定された文字コード種別に変更する */
m_nCharCode = fi.m_nCharCode;
}
/* ファイルが存在しない */
if( FALSE == bFileIsExist &&
CODE_AUTODETECT == m_nCharCode /* 文字コード自動判別 */
){
m_nCharCode = 0;
}
if( CODE_AUTODETECT == m_nCharCode ){ /* 文字コード自動判別 */
/*
|| ファイルの日本語コードセット判別
||
|| 【戻り値】
|| SJIS 0
|| JIS 1
|| EUC 2
|| Unicode 3
|| エラー -1
*/
m_nCharCode = CMemory::CheckKanjiCodeOfFile( pszPath );
if( -1 == m_nCharCode ){
::MYMESSAGEBOX( m_hWnd, MB_OK | MB_ICONEXCLAMATION | MB_TOPMOST, GSTR_APPNAME,
"%s\n文字コードの判別処理でエラーが発生しました。",
pszPath
);
// Sep. 10, 2002 genta
SetFilePath( "" );
bRet = FALSE;
goto end_of_func;
}
}
if( m_nCharCode != fi.m_nCharCode ){
if( bConfirmCodeChange ){
char* pszCodeName = NULL;
char* pszCodeNameNew = NULL;
// gm_pszCodeNameArr_1 を使うように変更 Moca. 2002/05/26
if( -1 < fi.m_nCharCode && fi.m_nCharCode < CODE_CODEMAX ){
pszCodeName = (char*)gm_pszCodeNameArr_1[fi.m_nCharCode];
}
if( -1 < m_nCharCode && m_nCharCode < CODE_CODEMAX ){
pszCodeNameNew = (char*)gm_pszCodeNameArr_1[m_nCharCode];
}
if( pszCodeName != NULL ){
::MessageBeep( MB_ICONQUESTION );
nRet = MYMESSAGEBOX(
m_hWnd,
MB_YESNOCANCEL | MB_ICONQUESTION | MB_TOPMOST,
"文字コード情報",
"%s\n\nこのファイルは、前回は別の文字コード %s で開かれています。\n前回と同じ文字コードを使いますか?\n\n?[はい(Y)] =%s\n?[いいえ(N)]=%s\n?[キャンセル]=開きません",
GetFilePath(), pszCodeName, pszCodeName, pszCodeNameNew
);
if( IDYES == nRet ){
/* 前回に指定された文字コード種別に変更する */
m_nCharCode = fi.m_nCharCode;
}else
if( IDCANCEL == nRet ){
m_nCharCode = 0;
// Sep. 10, 2002 genta
SetFilePath( "" );
bRet = FALSE;
goto end_of_func;
}
}else{
MYMESSAGEBOX(
m_hWnd,
MB_YESNO | MB_ICONEXCLAMATION | MB_TOPMOST,
"バグじゃぁあああ!!!",
"【対処】エラーの出た状況を作者に連絡してください。"
);
// Sep. 10, 2002 genta
SetFilePath( "" );
bRet = FALSE;
goto end_of_func;
}
}
}
}else{
bIsExistInMRU = FALSE;
/* ファイルが存在しない */
if( FALSE == bFileIsExist &&
CODE_AUTODETECT == m_nCharCode /* 文字コード自動判別 */
){
m_nCharCode = 0;
}
if( CODE_AUTODETECT == m_nCharCode ){ /* 文字コード自動判別 */
/*
|| ファイルの日本語コードセット判別
||
|| 【戻り値】
|| SJIS 0
|| JIS 1
|| EUC 2
|| Unicode 3
|| エラー -1
*/
m_nCharCode = CMemory::CheckKanjiCodeOfFile( pszPath );
if( -1 == m_nCharCode ){
::MYMESSAGEBOX( m_hWnd, MB_OK | MB_ICONEXCLAMATION | MB_TOPMOST, GSTR_APPNAME,
"%s\n文字コードの判別処理でエラーが発生しました。",
pszPath
);
// Sep. 10, 2002 genta
SetFilePath( "" );
bRet = FALSE;
goto end_of_func;
}
}
}
if( -1 == m_nCharCode ){
m_nCharCode = 0;
}
// if( (_access( pszPath, 0 )) == -1 ){
// ::MYMESSAGEBOX(
// m_hwndParent,
// MB_OK | MB_ICONSTOP | MB_TOPMOST,
// GSTR_APPNAME,
// "\'%s\'\nファイルは存在しません。 新規に作成します。",
// pszPath
// );
//
// strcpy( m_szFilePath, pszPath ); /* 現在編集中のファイルのパス */
// m_nCharCode = CODE_SJIS;
//
// return TRUE;
// }
// Nov. 12, 2000 genta ロングファイル名の取得を前方に移動
char szWork[MAX_PATH];
/* ロングファイル名を取得する */
if( TRUE == ::GetLongFileName( pszPath, szWork ) ){
// Sep. 10, 2002 genta
SetFilePath( szWork );
}
/* 共有データ構造体のアドレスを返す */
m_pShareData = CShareData::getInstance()->GetShareData();
doctype = CShareData::getInstance()->GetDocumentType( GetFilePath() );
SetDocumentType( doctype, true );
// From Here Jul. 26, 2003 ryoji BOMの有無の初期状態を設定
switch( m_nCharCode ){
case CODE_UNICODE:
case CODE_UNICODEBE:
m_bBomExist = TRUE;
break;
case CODE_UTF8:
default:
m_bBomExist = FALSE;
break;
}
// To Here Jul. 26, 2003 ryoji BOMの有無の初期状態を設定
/* ファイルが存在しない */
if( FALSE == bFileIsExist ){
// Oct. 09, 2004 genta フラグに応じて警告を出す(以前の動作)ように
if( m_pShareData->m_Common.GetAlertIfFileNotExist() ){
::MessageBeep( MB_ICONINFORMATION );
// Feb. 15, 2003 genta Popupウィンドウを表示しないように.
// ここでステータスメッセージを使っても画面に表示されない.
::MYMESSAGEBOX(
m_hwndParent,
MB_OK | MB_ICONINFORMATION | MB_TOPMOST,
GSTR_APPNAME,
"%s\nというファイルは存在しません。\n\nファイルを保存したときに、ディスク上にこのファイルが作成されます。", //Mar. 24, 2001 jepro 若干修正
pszPath
);
}
}else{
/* ファイルを読む */
if( NULL != hwndProgress ){
::ShowWindow( hwndProgress, SW_SHOW );
}
// Jul. 26, 2003 ryoji BOM引数追加
if( FALSE == m_cDocLineMgr.ReadFile( GetFilePath(), m_hWnd, hwndProgress,
m_nCharCode, &m_FileTime, m_pShareData->m_Common.GetAutoMIMEdecode(), &m_bBomExist ) ){
// Sep. 10, 2002 genta
SetFilePath( "" );
bRet = FALSE;
goto end_of_func;
}
//#ifdef _DEBUG
// m_cDocLineMgr.DUMP();
//#endif
}
/* レイアウト情報の変更 */
{
Types& ref = GetDocumentAttribute();
m_cLayoutMgr.SetLayoutInfo(
TRUE,
hwndProgress,
ref
);
}
/* 全ビューの初期化:ファイルオープン/クローズ時等に、ビューを初期化する */
InitAllView();
// Nov. 20, 2000 genta
// IME状態の設定
SetImeMode( GetDocumentAttribute().m_nImeState );
if( bIsExistInMRU && m_pShareData->m_Common.GetRestoreCurPosition() ){
/*
カーソル位置変換
物理位置(行頭からのバイト数、折り返し無し行位置)
→
レイアウト位置(行頭からの表示桁位置、折り返しあり行位置)
*/
int nCaretPosX;
int nCaretPosY;
m_cLayoutMgr.CaretPos_Phys2Log(
fi.m_nX,
fi.m_nY,
&nCaretPosX,
&nCaretPosY
);
if( nCaretPosY >= m_cLayoutMgr.GetLineCount() ){
/*ファイルの最後に移動 */
// m_cEditViewArr[m_nActivePaneIndex].Command_GOFILEEND(FALSE);
m_cEditViewArr[m_nActivePaneIndex].HandleCommand( F_GOFILEEND, 0, 0, 0, 0, 0 );
}else{
m_cEditViewArr[m_nActivePaneIndex].m_nViewTopLine = fi.m_nViewTopLine; // 2001/10/20 novice
m_cEditViewArr[m_nActivePaneIndex].m_nViewLeftCol = fi.m_nViewLeftCol; // 2001/10/20 novice
// From Here Mar. 28, 2003 MIK
// 改行の真ん中にカーソルが来ないように。
CDocLine *pTmpDocLine = m_cDocLineMgr.GetLineInfo( nCaretPosY );
if( pTmpDocLine ){
if( pTmpDocLine->GetLengthWithoutEOL() < fi.m_nX ) nCaretPosX--;
}
// To Here Mar. 28, 2003 MIK
m_cEditViewArr[m_nActivePaneIndex].MoveCursor( nCaretPosX, nCaretPosY, TRUE );
m_cEditViewArr[m_nActivePaneIndex].m_nCaretPosX_Prev =
m_cEditViewArr[m_nActivePaneIndex].m_nCaretPosX;
}
}
// 2002.01.16 hor ブックマーク復元
if( bIsExistInMRU ){
if( m_pShareData->m_Common.GetRestoreBookmarks() ){
m_cDocLineMgr.SetBookMarks(fi.m_szMarkLines);
}
}else{
strcpy(fi.m_szMarkLines,"");
}
SetFileInfo( &fi );
// May 12, 2000 genta
// 改行コードの設定
{
SetNewLineCode( EOL_CRLF );
CDocLine* pFirstlineinfo = m_cDocLineMgr.GetLineInfo( 0 );
if( pFirstlineinfo != NULL ){
enumEOLType t = (enumEOLType)pFirstlineinfo->m_cEol;
if( t != EOL_NONE && t != EOL_UNKNOWN ){
SetNewLineCode( t );
}
}
}
/* MRUリストへの登録 */
//@@@ 2001.12.26 YAZAKI MRUリストは、CMRUに依頼する
cMRU.Add( &fi );
/* カレントディレクトリの変更 */
{
char szCurDir[_MAX_PATH];
char szDrive[_MAX_DRIVE], szDir[_MAX_DIR];
_splitpath( GetFilePath(), szDrive, szDir, NULL, NULL );
strcpy( szCurDir, szDrive);
strcat( szCurDir, szDir );
::SetCurrentDirectory( szCurDir );
}
end_of_func:;
// 2004.05.13 Moca 改行コードの設定内からここに移動
m_cEditViewArr[m_nActivePaneIndex].DrawCaretPosInfo();
if( NULL != hwndProgress ){
::ShowWindow( hwndProgress, SW_HIDE );
}
if( TRUE == bRet && IsFilePathAvailable() ){
/* ファイルの排他ロック */
DoFileLock();
}
// From Here Jul. 26, 2003 ryoji エラーの時は規定のBOM設定とする
if( FALSE == bRet ){
switch( m_nCharCode ){
case CODE_UNICODE:
case CODE_UNICODEBE:
m_bBomExist = TRUE;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -