📄 ceditdoc_new.cpp
字号:
//
bool CEditDoc::IsModificationForbidden( int nCommand )
{
if( m_bReadOnly == FALSE && // 読みとり専用でも
!( 0 != m_nFileShareModeOld && m_hLockedFile == NULL ) ) // 上書き禁止でもなければ
return false; // 常に書き換え許可
// 上書き禁止モードの場合
// 暫定Case文: 実際にはもっと効率の良い方法を使うべき
switch( nCommand ){
// ファイルを書き換えるコマンドは使用禁止
case F_CHAR:
case F_IME_CHAR:
case F_DELETE:
case F_DELETE_BACK:
case F_WordDeleteToEnd:
case F_WordDeleteToStart:
case F_WordDelete:
case F_WordCut:
case F_LineDeleteToStart:
case F_LineDeleteToEnd:
case F_LineCutToStart:
case F_LineCutToEnd:
case F_DELETE_LINE:
case F_CUT_LINE:
case F_DUPLICATELINE:
case F_INDENT_TAB:
case F_UNINDENT_TAB:
case F_INDENT_SPACE:
case F_UNINDENT_SPACE:
case F_CUT:
case F_PASTE:
case F_INS_DATE:
case F_INS_TIME:
case F_CTRL_CODE_DIALOG: //@@@ 2002.06.02 MIK
case F_INSTEXT:
case F_ADDTAIL:
case F_PASTEBOX:
case F_REPLACE_DIALOG:
case F_REPLACE:
case F_REPLACE_ALL:
case F_CODECNV_EMAIL:
case F_CODECNV_EUC2SJIS:
case F_CODECNV_UNICODE2SJIS:
case F_CODECNV_UNICODEBE2SJIS:
case F_CODECNV_SJIS2JIS:
case F_CODECNV_SJIS2EUC:
case F_CODECNV_UTF82SJIS:
case F_CODECNV_UTF72SJIS:
case F_CODECNV_SJIS2UTF7:
case F_CODECNV_SJIS2UTF8:
case F_CODECNV_AUTO2SJIS:
case F_TOLOWER:
case F_TOUPPER:
case F_TOHANKAKU:
case F_TOHANKATA: // 2002/08/29 ai
case F_TOZENEI: // 2001/07/30 Miasaka
case F_TOHANEI:
case F_TOZENKAKUKATA:
case F_TOZENKAKUHIRA:
case F_HANKATATOZENKAKUKATA:
case F_HANKATATOZENKAKUHIRA:
case F_TABTOSPACE:
case F_SPACETOTAB: //#### Stonee, 2001/05/27
case F_HOKAN:
case F_CHGMOD_INS:
case F_LTRIM: // 2001.12.03 hor
case F_RTRIM: // 2001.12.03 hor
case F_SORT_ASC: // 2001.12.11 hor
case F_SORT_DESC: // 2001.12.11 hor
case F_MERGE: // 2001.12.11 hor
// ::MessageBox( m_hWnd, "Operation is forbidden.", "DEBUG", MB_OK | MB_ICONEXCLAMATION );
return true;
}
return false; // デフォルトで書き換え許可
}
// To Here Aug. 14, 2000 genta
// From Here Aug. 21, 2000 genta
//
// 自動保存を行うかどうかのチェック
//
void CEditDoc::CheckAutoSave(void)
{
if( m_cAutoSave.CheckAction() ){
// 上書き保存
bool en;
if( !IsModified() ) // 変更無しなら何もしない
return; // ここでは,「無変更でも保存」は無視する
// 2003.10.09 zenryaku 保存失敗エラーの抑制
if( !IsFilePathAvailable() ) // まだファイル名が設定されていなければ保存しない
return;
en = m_cAutoSave.IsEnabled();
m_cAutoSave.Enable(false); // 2重呼び出しを防ぐため
SaveFile( GetFilePath() ); // 保存(m_nCharCode, m_cSaveLineCodeを変更しない)
m_cAutoSave.Enable(en);
}
}
//
// 設定変更を自動保存動作に反映する
//
void CEditDoc::ReloadAutoSaveParam(void)
{
m_cAutoSave.SetInterval( m_pShareData->m_Common.GetAutoBackupInterval() );
m_cAutoSave.Enable( m_pShareData->m_Common.IsAutoBackupEnabled() );
}
// ファイルの保存機能をEditViewから移動
//
bool CEditDoc::SaveFile( const char* pszPath )
{
if( FileWrite( pszPath, m_cSaveLineCode ) ){
SetModified(false,true); // Jan. 22, 2002 genta
/* 現在位置で無変更な状態になったことを通知 */
m_cOpeBuf.SetNoModified();
return true;
}
return false;
}
// To Here Aug. 21, 2000 genta
// From Here Sep 8, 2000 genta
//
//! Perl用アウトライン解析機能(簡易版)
/*!
単純に /^\\s*sub\\s+(\\w+)/ に一致したら $1を取り出す動作を行う。
ネストとかは面倒くさいので考えない。
package{ }を使わなければこれで十分.無いよりはまし。
@par nModeの意味
@li 0: はじめ
@li 2: subを見つけた後
@li 1: 単語読み出し中
*/
void CEditDoc::MakeFuncList_Perl( CFuncInfoArr* pcFuncInfoArr )
{
const char* pLine;
int nLineLen;
int nLineCount;
int i;
int nCharChars;
char szWord[100];
int nWordIdx = 0;
int nMaxWordLeng = 70;
int nMode;
for( nLineCount = 0; nLineCount < m_cDocLineMgr.GetLineCount(); ++nLineCount ){
pLine = m_cDocLineMgr.GetLineStr( nLineCount, &nLineLen );
nMode = 0;
for( i = 0; i < nLineLen; ++i ){
/* 1バイト文字だけを処理する */
nCharChars = CMemory::MemCharNext( pLine, nLineLen, &pLine[i] ) - &pLine[i];
if( 1 < nCharChars ){
break;
}
/* 単語読み込み中 */
if( 0 == nMode ){
/* 空白やタブ記号等を飛ばす */
if( '\t' == pLine[i] ||
' ' == pLine[i] ||
CR == pLine[i] ||
LF == pLine[i]
){
continue;
}
if( 's' != pLine[i] )
break;
// sub の一文字目かもしれない
if( nLineLen - i < 4 )
break;
if( strncmp( pLine + i, "sub", 3 ) )
break;
int c = pLine[ i + 3 ];
if( c == ' ' || c == '\t' ){
nMode = 2; // 発見
i += 3;
}
else
break;
}
else if( 2 == nMode ){
if( '\t' == pLine[i] ||
' ' == pLine[i] ||
CR == pLine[i] ||
LF == pLine[i]
){
continue;
}
if( '_' == pLine[i] ||
('a' <= pLine[i] && pLine[i] <= 'z' )||
('A' <= pLine[i] && pLine[i] <= 'Z' )||
('0' <= pLine[i] && pLine[i] <= '9' )
){
// 関数名の始まり
nWordIdx = 0;
szWord[nWordIdx] = pLine[i];
szWord[nWordIdx + 1] = '\0';
nMode = 1;
continue;
}
else
break;
}
else if( 1 == nMode ){
if( '_' == pLine[i] ||
('a' <= pLine[i] && pLine[i] <= 'z' )||
('A' <= pLine[i] && pLine[i] <= 'Z' )||
('0' <= pLine[i] && pLine[i] <= '9' )
){
++nWordIdx;
if( nWordIdx >= nMaxWordLeng ){
break;
}else{
szWord[nWordIdx] = pLine[i];
szWord[nWordIdx + 1] = '\0';
}
}else{
// 関数名取得
/*
カーソル位置変換
物理位置(行頭からのバイト数、折り返し無し行位置)
→
レイアウト位置(行頭からの表示桁位置、折り返しあり行位置)
*/
int nPosX;
int nPosY;
m_cLayoutMgr.CaretPos_Phys2Log(
0,
nLineCount/*nFuncLine - 1*/,
&nPosX,
&nPosY
);
// Mar. 9, 2001
pcFuncInfoArr->AppendData( nLineCount + 1/*nFuncLine*/, nPosY + 1, szWord, 0 );
break;
}
}
}
}
#ifdef _DEBUG
pcFuncInfoArr->DUMP();
#endif
return;
}
// To HERE Sep. 8, 2000 genta
// From Here June 23, 2001 N.Nakatani
//! Visual Basic関数リスト作成(簡易版)
/*!
Visual Basicのコードから単純にユーザー定義の関数やステートメントを取り出す動作を行う。
Jul 10, 2003 little YOSHI 細かく解析するように変更
すべてのキーワードは自動的に成形されるので、大文字小文字は完全に一致する。
フォームやモジュールだけではなく、クラスにも対応。
ただし、Constの「,」で連続宣言には未対応
Jul. 21, 2003 genta キーワードの大文字?小文字を同一視するようにした
Aug 7, 2003 little YOSHI ダブルクォーテーションで囲まれたテキストを無視するようにした
関数名などをVBの名前付け規則より255文字に拡張
*/
void CEditDoc::MakeFuncList_VisualBasic( CFuncInfoArr* pcFuncInfoArr )
{
const int nMaxWordLeng = 255; // Aug 7, 2003 little YOSHI VBの名前付け規則より255文字に拡張
const char* pLine;
int nLineLen = 0;//: 2002/2/3 aroka 警告対策:初期化
int nLineCount;
int i;
int nCharChars;
char szWordPrev[256]; // Aug 7, 2003 little YOSHI VBの名前付け規則より255文字に拡張
char szWord[256]; // Aug 7, 2003 little YOSHI VBの名前付け規則より255文字に拡張
int nWordIdx = 0;
// int nMaxWordLeng = 70; // Aug 7, 2003 little YOSHI 定数に変更↑
int nMode;
char szFuncName[256]; // Aug 7, 2003 little YOSHI VBの名前付け規則より255文字に拡張
int nFuncLine;
int nFuncId;
int nParseCnt = 0;
bool bClass; // クラスモジュールフラグ
bool bProcedure; // プロシージャフラグ(プロシージャ内ではTrue)
bool bDQuote; // ダブルクォーテーションフラグ(ダブルクォーテーションがきたらTrue)
// 調べるファイルがクラスモジュールのときはType、Constの挙動が異なるのでフラグを立てる
bClass = false;
int filelen = strlen(GetFilePath());
if ( 4 < filelen ) {
if ( 0 == _stricmp((GetFilePath() + filelen - 4), ".cls") ) {
bClass = true;
}
}
szWordPrev[0] = '\0';
szWord[nWordIdx] = '\0';
nMode = 0;
pLine = NULL;
bProcedure = false;
for( nLineCount = 0; nLineCount < m_cDocLineMgr.GetLineCount(); ++nLineCount ){
if( NULL != pLine ){
if( '_' != pLine[nLineLen-1]){
nParseCnt = 0;
}
}
pLine = m_cDocLineMgr.GetLineStr( nLineCount, &nLineLen );
nFuncId = 0;
bDQuote = false;
for( i = 0; i < nLineLen; ++i ){
/* 1バイト文字だけを処理する */
nCharChars = CMemory::MemCharNext( pLine, nLineLen, &pLine[i] ) - &pLine[i];
if( 0 == nCharChars ){
nCharChars = 1;
}
/* 単語読み込み中 */
if( 1 == nMode ){
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
){
if( nWordIdx >= nMaxWordLeng ){
nMode = 999;
continue;
}else{
memcpy( &szWord[nWordIdx], &pLine[i], nCharChars );
szWord[nWordIdx + nCharChars] = '\0';
nWordIdx += (nCharChars);
}
} else if (1 == nCharChars && '"' == pLine[i]) {
// Aug 7, 2003 little YOSHI 追加
// テキストの中は無視します。
nMode = 3;
}else{
if ( 0 == nParseCnt && 0 == stricmp(szWord, "Public") ) {
// パブリック宣言を見つけた!
nFuncId |= 0x10;
}else
if ( 0 == nParseCnt && 0 == stricmp(szWord, "Private") ) {
// プライベート宣言を見つけた!
nFuncId |= 0x20;
}else
if ( 0 == nParseCnt && 0 == stricmp(szWord, "Friend") ) {
// フレンド宣言を見つけた!
nFuncId |= 0x30;
}else
if ( 0 == nParseCnt && 0 == stricmp(szWord, "Static") ) {
// スタティック宣言を見つけた!
nFuncId |= 0x100;
}else
if( 0 == nParseCnt && 0 == stricmp( szWord, "Function" ) ){
if ( 0 == stricmp( szWordPrev, "End" ) ){
// プロシージャフラグをクリア
bProcedure = false;
}else
if( 0 != stricmp( szWordPrev, "Exit" ) ){
if( 0 == stricmp( szWordPrev, "Declare" ) ){
nFuncId |= 0x200; // DLL参照宣言
}else{
bProcedure = true; // プロシージャフラグをセット
}
nFuncId |= 0x01; // 関数
nParseCnt = 1;
nFuncLine = nLineCount + 1;
}
}else
if( 0 == nParseCnt && 0 == stricmp( szWord, "Sub" ) ){
if ( 0 == stricmp( szWordPrev, "End" ) ){
// プロシージャフラグをクリア
bProcedure = false;
}else
if( 0 != stricmp( szWordPrev, "Exit" ) ){
if( 0 == stricmp( szWordPrev, "Declare" ) ){
nFuncId |= 0x200; // DLL参照宣言
}else{
bProcedure = true; // プロシージャフラグをセット
}
nFuncId |= 0x02; // 関数
nParseCnt = 1;
nFuncLine = nLineCount + 1;
}
}else
if( 0 == nParseCnt && 0 == stricmp( szWord, "Get" )
&& 0 == stricmp( szWordPrev, "Property" )
){
bProcedure = true; // プロシージャフラグをセット
nFuncId |= 0x03; // プロパティ取得
nParseCnt = 1;
nFuncLine = nLineCount + 1;
}else
if( 0 == nParseCnt && 0 == stricmp( szWord, "Let" )
&& 0 == stricmp( szWordPrev, "Property" )
){
bProcedure = true; // プロシージャフラグをセット
nFuncId |= 0x04; // プロパティ設定
nParseCnt = 1;
nFuncLine = nLineCount + 1;
}else
if( 0 == nParseCnt && 0 == stricmp( szWord, "Set" )
&& 0 == stricmp( szWordPrev, "Property" )
){
bProcedure = true; // プロシージャフラグをセット
nFuncId |= 0x05; // プロパティ参照
nParseCnt = 1;
nFuncLine = nLineCount + 1;
}else
if( 0 == nParseCnt && 0 == stricmp( szWord, "Const" )
&& 0 != stricmp( szWordPrev, "#" )
){
if ( bClass || bProcedure || 0 == ((nFuncId >> 4) & 0x0f) ) {
// クラスモジュールでは強制的にPrivate
// プロシージャ内では強制的にPrivate
// Publicの指定がないとき、デフォルトでPrivateになる
nFuncId &= 0x0f2f;
nFuncId |= 0x20;
}
nFuncId |= 0x06; // 定数
nParseCnt = 1;
nFuncLine = nLineCount + 1;
}else
if( 0 == nParseCnt && 0 == stricmp( szWord, "Enum" )
){
nFuncId |= 0x207; // 列挙型宣言
nParseCnt = 1;
nFuncLine = nLineCount + 1;
}else
if( 0 == nParseCnt && 0 == stricmp( szWord, "Type" )
){
if ( bClass ) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -