📄 ceditdoc_new.cpp
字号:
// クラスモジュールでは強制的にPrivate
nFuncId &= 0x0f2f;
nFuncId |= 0x20;
}
nFuncId |= 0x208; // ユーザ定義型宣言
nParseCnt = 1;
nFuncLine = nLineCount + 1;
}else
if( 0 == nParseCnt && 0 == stricmp( szWord, "Event" )
){
nFuncId |= 0x209; // イベント宣言
nParseCnt = 1;
nFuncLine = nLineCount + 1;
}else
if( 0 == nParseCnt && 0 == stricmp( szWord, "Property" )
&& 0 == stricmp( szWordPrev, "End")
){
bProcedure = false; // プロシージャフラグをクリア
}else
if( 1 == nParseCnt ){
strcpy( szFuncName, szWord );
/*
カーソル位置変換
物理位置(行頭からのバイト数、折り返し無し行位置)
→ レイアウト位置(行頭からの表示桁位置、折り返しあり行位置)
*/
int nPosX;
int nPosY;
m_cLayoutMgr.CaretPos_Phys2Log( 0, nFuncLine - 1, &nPosX, &nPosY );
pcFuncInfoArr->AppendData( nFuncLine, nPosY + 1 , szFuncName, nFuncId );
nParseCnt = 0;
nFuncId = 0; // Jul 10, 2003 little YOSHI 論理和を使用するため、必ず初期化
}
strcpy( szWordPrev, szWord );
nWordIdx = 0;
szWord[0] = '\0';
nMode = 0;
i--;
continue;
}
}else
/* 記号列読み込み中 */
if( 2 == nMode ){
// Jul 10, 2003 little YOSHI
// 「#Const」と「Const」を区別するために、「#」も識別するように変更
if( '_' == pLine[i] ||
'~' == pLine[i] ||
('a' <= pLine[i] && pLine[i] <= 'z' )||
('A' <= pLine[i] && pLine[i] <= 'Z' )||
('0' <= pLine[i] && pLine[i] <= '9' )||
'\t' == pLine[i] ||
' ' == pLine[i] ||
CR == pLine[i] ||
LF == pLine[i] ||
'{' == pLine[i] ||
'}' == pLine[i] ||
'(' == pLine[i] ||
')' == pLine[i] ||
';' == pLine[i] ||
'\'' == pLine[i] ||
'/' == pLine[i] ||
'-' == pLine[i] ||
'#' == pLine[i]
){
strcpy( szWordPrev, szWord );
nWordIdx = 0;
szWord[0] = '\0';
nMode = 0;
i--;
continue;
} else if (1 == nCharChars && '"' == pLine[i]) {
// Aug 7, 2003 little YOSHI 追加
// テキストの中は無視します。
nMode = 3;
}else{
if( nWordIdx >= nMaxWordLeng ){
nMode = 999;
continue;
}else{
memcpy( &szWord[nWordIdx], &pLine[i], nCharChars );
szWord[nWordIdx + nCharChars] = '\0';
nWordIdx += (nCharChars);
}
}
}else
/* 長過ぎる単語無視中 */
if( 999 == nMode ){
/* 空白やタブ記号等を飛ばす */
if( '\t' == pLine[i] ||
' ' == pLine[i] ||
CR == pLine[i] ||
LF == pLine[i]
){
nMode = 0;
continue;
}
}else
/* ノーマルモード */
if( 0 == nMode ){
/* 空白やタブ記号等を飛ばす */
if( '\t' == pLine[i] ||
' ' == pLine[i] ||
CR == pLine[i] ||
LF == pLine[i]
){
continue;
}else
if( i < nLineLen && '\'' == pLine[i] ){
break;
} else if (1 == nCharChars && '"' == pLine[i]) {
// Aug 7, 2003 little YOSHI 追加
// テキストの中は無視します。
nMode = 3;
}else{
if( (1 == nCharChars && (
'_' == pLine[i] ||
'~' == pLine[i] ||
('a' <= pLine[i] && pLine[i] <= 'z' )||
('A' <= pLine[i] && pLine[i] <= 'Z' )||
('0' <= pLine[i] && pLine[i] <= '9' )
) )
|| 2 == nCharChars
){
nWordIdx = 0;
memcpy( &szWord[nWordIdx], &pLine[i], nCharChars );
szWord[nWordIdx + nCharChars] = '\0';
nWordIdx += (nCharChars);
nMode = 1;
}else{
nWordIdx = 0;
memcpy( &szWord[nWordIdx], &pLine[i], nCharChars );
szWord[nWordIdx + nCharChars] = '\0';
nWordIdx += (nCharChars);
nMode = 2;
}
}
} else
/* テキストが閉じるまで読み飛ばす */ // Aug 7, 2003 little YOSHI 追加
if (nMode == 3) {
// 連続するダブルクォーテーションは無視する
if (1 == nCharChars && '"' == pLine[i]) {
// ダブルクォーテーションが現れたらフラグを反転する
bDQuote = !bDQuote;
} else if (bDQuote) {
// ダブルクォーテーションの次に
// ダブルクォーテーション以外の文字が現れたらノーマルモードに移行
--i;
nMode = 0;
bDQuote = false;
continue;
}
}
i += (nCharChars - 1);
}
}
return;
}
// To Here June 23, 2001 N.Nakatani
// From Here 2001.12.03 hor
/*! ブックマークリスト作成(無理矢理!)
20020119 aroka
空行をマーク対象にするフラグ bMarkUpBlankLineEnable を導入しました。
*/
void CEditDoc::MakeFuncList_BookMark( CFuncInfoArr* pcFuncInfoArr )
{
const char* pLine;
int nLineLen;
int nLineCount;
int i,j,nX,nY;
char* pszText;
BOOL bMarkUpBlankLineEnable = m_pShareData->m_Common.m_bMarkUpBlankLineEnable; //! 空行をマーク対象にするフラグ 20020119 aroka
int nNewLineLen = m_cNewLineCode.GetLen();
int nLineLast = m_cDocLineMgr.GetLineCount();
for( nLineCount = 0; nLineCount < nLineLast; ++nLineCount ){
if(!m_cDocLineMgr.GetLineInfo(nLineCount)->IsBookMarked())continue;
pLine = m_cDocLineMgr.GetLineStr( nLineCount, &nLineLen );
if( NULL == pLine ){
break;
}
// Jan, 16, 2002 hor
if( bMarkUpBlankLineEnable ){// 20020119 aroka
if( nLineLen<=nNewLineLen && nLineCount< nLineLast ){
continue;
}
}// LTrim
for( i = 0; i < nLineLen; ++i ){
if( pLine[i] == ' ' ||
pLine[i] == '\t'){
continue;
}else if( (unsigned char)pLine[i] == (unsigned char)0x81 && (unsigned char)pLine[i + 1] == (unsigned char)0x40 ){
++i;
continue;
}
break;
}
if( bMarkUpBlankLineEnable ){// 20020119 aroka
if(( i >= nLineLen-nNewLineLen && nLineCount< nLineLast )||
( i >= nLineLen )) {
continue;
}
}// RTrim
for( j=nLineLen ; j>=i ; --j ){
if( pLine[j] == CR ||
pLine[j] == LF ||
pLine[j] ==' ' ||
pLine[j] =='\t'||
pLine[j] =='\0'){
continue;
}else if( 1<j && (unsigned char)pLine[j-1] == (unsigned char)0x81 && (unsigned char)pLine[j] == (unsigned char)0x40 ){
--j;
continue;
}else{
break;
}
}
nLineLen=j-i+1;
pszText = new char[nLineLen + 1];
memcpy( pszText, (const char *)&pLine[i], nLineLen );
pszText[nLineLen] = '\0';
m_cLayoutMgr.CaretPos_Phys2Log( 0, nLineCount, &nX, &nY );
pcFuncInfoArr->AppendData( nLineCount+1, nY+1 , (char *)pszText, 0 );
delete [] pszText;
}
return;
}
// To Here 2001.12.03 hor
// From Here Jan. 22, 2002 genta
/*! 変更フラグの設定
@param flag [in] 設定する値.true: 変更有り / false: 変更無し
@param redraw [in] true: タイトルの再描画を行う / false: 行わない
@author genta
@date 2002.01.22 新規作成
*/
void CEditDoc::SetModified( bool flag, bool redraw)
{
if( m_bIsModified == flag ) // 変更がなければ何もしない
return;
m_bIsModified = flag;
if( redraw )
SetParentCaption();
}
// From Here Jan. 22, 2002 genta
/*!
ファイル名の設定
ファイル名を設定すると同時に,ウィンドウアイコンを適切に設定する.
@param szFile [in] ファイルのパス名
@author genta
@date 2002.09.09
*/
void CEditDoc::SetFilePath(const char* szFile)
{
strcpy( m_szFilePath, szFile );
SetDocumentIcon();
//@@@ From Here 2003.05.31 MIK
//タブウインドウ //SetParentCaptionで実施
//m_pcEditWnd->ChangeFileNameNotify( szFile );
//@@@ To Here 2003.05.31 MIK
}
/*! ファイル名(パスなし)を取得する
@author Moca
@date 2002.10.13
*/
const char * CEditDoc::GetFileName( void ) const
{
const char *p, *pszName;
pszName = p = GetFilePath();
while( *p != '\0' ){
if( _IS_SJIS_1( (unsigned char)*p ) && _IS_SJIS_2( (unsigned char)p[1] ) ){
p+=2;
}else if( *p == '\\' ){
pszName = p + 1;
p++;
}else{
p++;
}
}
return pszName;
}
/*!
アイコンの設定
タイプ別設定に応じてウィンドウアイコンをファイルに関連づけられた物,
または標準のものに設定する.
@author genta
@date 2002.09.10
*/
void CEditDoc::SetDocumentIcon(void)
{
HICON hIconBig, hIconSmall;
if( m_bGrepMode ) // Grepモードの時はアイコンを変更しない
return;
if( GetDocumentAttribute().m_bUseDocumentIcon )
m_pcEditWnd->GetRelatedIcon( GetFilePath(), hIconBig, hIconSmall );
else
m_pcEditWnd->GetDefaultIcon( hIconBig, hIconSmall );
m_pcEditWnd->SetWindowIcon( hIconBig, ICON_BIG );
m_pcEditWnd->SetWindowIcon( hIconSmall, ICON_SMALL );
}
/*!
カレントファイルをMRUに登録する。
ブックマークも一緒に登録する。
@date 2003.03.30 genta 作成
*/
void CEditDoc::AddToMRU(void)
{
FileInfo fi;
CMRU cMRU;
SetFileInfo( &fi );
strcpy( fi.m_szMarkLines, m_cDocLineMgr.GetBookMarks() );
//@@@ 2001.12.26 YAZAKI MRUリストは、CMRUに依頼する
cMRU.Add( &fi );
}
/*! @brief 指定されたファイルを開く
現在の編集状況に応じて,現在のウィンドウに読み込むか,新しいウィンドウを開くか
あるいは既に開かれているウィンドウにフォーカスを移すだけにするかを決定し,
実行する.
対象ファイル,エディタウィンドウの状況に依らず新しいファイルを開きたい場合に
使用する.
@date 2003.03.30 genta 「閉じて開く」から利用するために引数追加
@date 2004.10.09 CEditViewより移動
*/
void CEditDoc::OpenFile( const char *filename, int nCharCode, BOOL bReadOnly )
{
char pszPath[_MAX_PATH];
BOOL bOpened;
FileInfo* pfi;
HWND hWndOwner;
/* 「ファイルを開く」ダイアログ */
if( filename == NULL ){
pszPath[0] = '\0';
if( !OpenFileDialog( m_hWnd, NULL, pszPath, &nCharCode, &bReadOnly ) ){
return;
}
}
else {
strncpy( pszPath, filename, _MAX_PATH - 1 );
}
/* 指定ファイルが開かれているか調べる */
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;
int nCharCodeNew;
if( CODE_AUTODETECT == nCharCode ){ /* 文字コード自動判別 */
/* ファイルの日本語コードセット判別
エラー -1 */
nCharCodeNew = CMemory::CheckKanjiCodeOfFile( pszPath );
if( -1 == nCharCodeNew ){
}else{
nCharCode = nCharCodeNew;
}
}
/* 文字コード種別 */
// Oct. 03, 2004 genta コード確認は設定に依存
if( nCharCode != pfi->m_nCharCode &&
m_pShareData->m_Common.GetQueryIfCodeChange() ){
char* pszCodeNameCur;
char* pszCodeNameNew;
// gm_pszCodeNameArr_1 を使うように変更 Moca. 2002/05/26
if( -1 < pfi->m_nCharCode && pfi->m_nCharCode < CODE_CODEMAX ){
pszCodeNameCur = (char*)gm_pszCodeNameArr_1[pfi->m_nCharCode];
}
if( -1 < nCharCode && nCharCode < CODE_CODEMAX ){
pszCodeNameNew = (char*)gm_pszCodeNameArr_1[nCharCode];
}
::MYMESSAGEBOX( m_hWnd, MB_OK | MB_ICONEXCLAMATION | MB_TOPMOST, GSTR_APPNAME,
"%s\n\n\n既に開いているファイルを違う文字コードで開く場合は、\n一旦閉じてから開いてください。\n\n現在の文字コードセット=[%s]\n新しい文字コードセット=[%s]",
pszPath, pszCodeNameCur, pszCodeNameNew
);
}
/* 自分が開いているか */
if( 0 == strcmp( GetFilePath(), pszPath ) ){
/* 何もしない */
}else{
/* 開いているウィンドウをアクティブにする */
/* アクティブにする */
ActivateFrameWindow( hWndOwner );
}
}else{
/* ファイルが開かれていない */
/* 変更フラグがオフで、ファイルを読み込んでいない場合 */
//@@@ 2001.12.26 YAZAKI Grep結果で無い場合も含める。
if( !IsModified() &&
!IsFilePathAvailable() && /* 現在編集中のファイルのパス */
!m_bGrepMode /* Grep結果ではない */
){
/* ファイル読み込み */
// Oct. 03, 2004 genta コード確認は設定に依存
FileRead( pszPath, &bOpened, nCharCode, bReadOnly,
m_pShareData->m_Common.m_bQueryIfCodeChange );
}else{
if( strchr( pszPath, ' ' ) ){
char szFile2[_MAX_PATH + 3];
wsprintf( szFile2, "\"%s\"", pszPath );
strcpy( pszPath, szFile2 );
}
/* 新たな編集ウィンドウを起動 */
CEditApp::OpenNewEditor( m_hInstance, m_hWnd, pszPath, nCharCode, bReadOnly );
}
}
return;
}
/*[EOF]*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -