📄 ceditview_command_new.cpp
字号:
return;
}
if( '(' == cChar && '(' == pLine2[k] ){
return;
}
}
if( 0 == nLevel ){
break;
}else{
nLevel--; /* {}の入れ子レベル */
}
}
}
nCharChars = &pLine2[k] - CMemory::MemCharPrev( pLine2, nLineLen2, &pLine2[k] );
if( 0 == nCharChars ){
nCharChars = 1;
}
k -= nCharChars;
}
if( k < 0 ){
/* この行にはない */
continue;
}
for( m = 0; m < nLineLen2; m++ ){
if( TAB != pLine2[m] && SPACE != pLine2[m] ){
break;
}
}
nDataLen = m;
//fzc TAB改为2个空格
//pszData = new char[nDataLen + 2];
pszData = new char[nDataLen + 3];
memcpy( pszData, pLine2, nDataLen );
if( CR == cChar
|| '{' == cChar
|| '(' == cChar
){
//fzc TAB改为2个空格
//pszData[nDataLen] = '\t';
pszData[nDataLen] = ' ';
pszData[nDataLen + 1] = ' ';
pszData[nDataLen + 2] = '\0';
nDataLen += 2;
}else{
pszData[nDataLen] = '\0';
}
break;
}
if( j < 0 ){
/* 対応する括弧が見つからなかった */
if( CR == cChar ){
return;
}else{
nDataLen = 0;
pszData = new char[nDataLen + 1];
pszData[nDataLen] = '\0';
}
}
/* 調整後のカーソル位置を計算しておく */
nCPX = nCaretPosX_PHY - nXTo + nDataLen;
nCPY = m_nCaretPosY_PHY;
nSrcLen = nXTo - nXFm;
if( nSrcLen >= sizeof( pszSrc ) - 1 ){
// Sep. 18, 2002 genta メモリリーク対策
delete [] pszData;
return;
}
if( NULL == pLine ){
pszSrc[0] = '\0';
}else{
memcpy( pszSrc, &pLine[nXFm], nSrcLen );
pszSrc[nSrcLen] = '\0';
}
/* 調整によって置換される箇所 */
m_pcEditDoc->m_cLayoutMgr.CaretPos_Phys2Log( nXFm, nYFm, &nXFm, &nYFm );
m_pcEditDoc->m_cLayoutMgr.CaretPos_Phys2Log( nXTo, nYTo, &nXTo, &nYTo );
if( ( 0 == nDataLen && nYFm == nYTo && nXFm == nXTo )
|| ( nDataLen == nSrcLen && 0 == memcmp( pszSrc, pszData, nDataLen ) )
){
bChange = FALSE;
}else{
bChange = TRUE;
/* データ置換 削除&挿入にも使える */
ReplaceData_CEditView(
nYFm, /* 削除範囲行 From レイアウト行番号 */
nXFm, /* 削除範囲位置From レイアウト行桁位置 */
nYTo, /* 削除範囲行 To レイアウト行番号 */
nXTo, /* 削除範囲位置To レイアウト行桁位置 */
NULL, /* 削除されたデータのコピー(NULL可能) */
pszData, /* 挿入するデータ */
nDataLen, /* 挿入するデータの長さ */
TRUE
// BOOL bUndo /* Undo操作かどうか */
);
}
/* カーソル位置調整 */
m_pcEditDoc->m_cLayoutMgr.CaretPos_Phys2Log( nCPX, nCPY, &nCPX, &nCPY );
/* 選択エリアの先頭へカーソルを移動 */
MoveCursor( nCPX, nCPY, TRUE );
m_nCaretPosX_Prev = m_nCaretPosX;
if( bChange && !m_bDoing_UndoRedo ){ /* アンドゥ?リドゥの実行中か */
pcOpe = new COpe;
pcOpe->m_nOpe = OPE_MOVECARET; /* 操作種別 */
pcOpe->m_nCaretPosX_PHY_Before = m_nCaretPosX_PHY; /* 操作前のキャレット位置X */
pcOpe->m_nCaretPosY_PHY_Before = m_nCaretPosY_PHY; /* 操作前のキャレット位置Y */
pcOpe->m_nCaretPosX_PHY_After = pcOpe->m_nCaretPosX_PHY_Before; /* 操作後のキャレット位置X */
pcOpe->m_nCaretPosY_PHY_After = pcOpe->m_nCaretPosY_PHY_Before; /* 操作後のキャレット位置Y */
/* 操作の追加 */
m_pcOpeBlk->AppendOpe( pcOpe );
}
break;
}
if( NULL != pszData ){
delete [] pszData;
pszData = NULL;
}
return;
}
// 2001/06/20 Start by asa-o
// テキストを1行下へスクロール
void CEditView::Command_WndScrollDown( void )
{
int nCaretMarginY;
nCaretMarginY = m_nViewRowNum / _CARETMARGINRATE;
if( nCaretMarginY < 1 )
nCaretMarginY = 1;
nCaretMarginY += 2;
if( m_nCaretPosY > m_nViewRowNum + m_nViewTopLine - (nCaretMarginY + 1) ){
m_cUnderLine.CaretUnderLineOFF( TRUE );
}
// Sep. 11, 2004 genta 同期用に行数を記憶
// Sep. 11, 2004 genta 同期スクロールの関数化
SyncScrollV( ScrollAtV(m_nViewTopLine - 1));
// テキストが選択されていない
if( !IsTextSelected() )
{
// カーソルが画面外に出た
if( m_nCaretPosY > m_nViewRowNum + m_nViewTopLine - nCaretMarginY )
{
// From Here 2001.12.03 hor
// if( m_nCaretPosY > m_pcEditDoc->m_cDocLineMgr.GetLineCount() - nCaretMarginY )
// Cursor_UPDOWN( (m_pcEditDoc->m_cDocLineMgr.GetLineCount() - nCaretMarginY) - m_nCaretPosY, FALSE );
// To Here 2001.12.03 hor
if( m_nCaretPosY > m_pcEditDoc->m_cLayoutMgr.GetLineCount() - nCaretMarginY )
Cursor_UPDOWN( (m_pcEditDoc->m_cLayoutMgr.GetLineCount() - nCaretMarginY) - m_nCaretPosY, FALSE );
else
Cursor_UPDOWN( -1, FALSE);
DrawCaretPosInfo();
}
}
m_cUnderLine.CaretUnderLineON( TRUE );
}
// テキストを1行上へスクロール
void CEditView::Command_WndScrollUp(void)
{
int nCaretMarginY;
nCaretMarginY = m_nViewRowNum / _CARETMARGINRATE;
if( nCaretMarginY < 1 )
nCaretMarginY = 1;
if( m_nCaretPosY < m_nViewTopLine + (nCaretMarginY + 1) ){
m_cUnderLine.CaretUnderLineOFF( TRUE );
}
// Sep. 11, 2004 genta 同期用に行数を記憶
// Sep. 11, 2004 genta 同期スクロールの関数化
SyncScrollV( ScrollAtV( m_nViewTopLine + 1 ));
// テキストが選択されていない
if( !IsTextSelected() )
{
// カーソルが画面外に出た
if( m_nCaretPosY < m_nViewTopLine + nCaretMarginY )
{
if( m_nViewTopLine == 1 )
Cursor_UPDOWN( nCaretMarginY + 1, FALSE );
else
Cursor_UPDOWN( 1, FALSE );
DrawCaretPosInfo();
}
}
m_cUnderLine.CaretUnderLineON( TRUE );
}
// 2001/06/20 End
/* 次の段落へ進む
2002/04/26 段落の両端で止まるオプションを追加
2002/04/19 新規
*/
void CEditView::Command_GONEXTPARAGRAPH( int bSelect )
{
CDocLine* pcDocLine;
int nCaretPointer = 0;
bool nFirstLineIsEmptyLine = false;
/* まずは、現在位置が空行(スペース、タブ、改行記号のみの行)かどうか判別 */
if ( pcDocLine = m_pcEditDoc->m_cDocLineMgr.GetLineInfo( m_nCaretPosY_PHY + nCaretPointer ) ){
nFirstLineIsEmptyLine = pcDocLine->IsEmptyLine();
nCaretPointer++;
}
else {
// EOF行でした。
return;
}
/* 次に、nFirstLineIsEmptyLineと異なるところまで読み飛ばす */
while ( pcDocLine = m_pcEditDoc->m_cDocLineMgr.GetLineInfo( m_nCaretPosY_PHY + nCaretPointer ) ) {
if ( pcDocLine->IsEmptyLine() == nFirstLineIsEmptyLine ){
nCaretPointer++;
}
else {
break;
}
};
/* nFirstLineIsEmptyLineが空行だったら、今見ているところは非空行。すなわちおしまい。
nFirstLineIsEmptyLineが非空行だったら、今見ているところは空行。
*/
if ( nFirstLineIsEmptyLine == true ){
// おしまい。
}
else {
// いま見ているところは空行の1行目
if ( m_pShareData->m_Common.m_bStopsBothEndsWhenSearchParagraph ){ // 段落の両端で止まる
}
else {
/* 仕上げに、空行じゃないところまで進む */
while ( pcDocLine = m_pcEditDoc->m_cDocLineMgr.GetLineInfo( m_nCaretPosY_PHY + nCaretPointer ) ) {
if ( pcDocLine->IsEmptyLine() ){
nCaretPointer++;
}
else {
break;
}
};
}
}
// EOFまで来たり、目的の場所まできたので移動終了。
/* 移動距離を計算 */
int nCaretPosX_Layo;
int nCaretPosY_Layo;
/* 移動前の物理位置 */
m_pcEditDoc->m_cLayoutMgr.CaretPos_Phys2Log(
m_nCaretPosX_PHY, m_nCaretPosY_PHY,
&nCaretPosX_Layo, &nCaretPosY_Layo
);
/* 移動後の物理位置 */
int nCaretPosY_Layo_CaretPointer;
m_pcEditDoc->m_cLayoutMgr.CaretPos_Phys2Log(
m_nCaretPosX_PHY, m_nCaretPosY_PHY + nCaretPointer,
&nCaretPosX_Layo, &nCaretPosY_Layo_CaretPointer
);
Cursor_UPDOWN( nCaretPosY_Layo_CaretPointer - nCaretPosY_Layo, bSelect );
return;
}
/* 前の段落へ進む
2002/04/26 段落の両端で止まるオプションを追加
2002/04/19 新規
*/
void CEditView::Command_GOPREVPARAGRAPH( int bSelect )
{
CDocLine* pcDocLine;
int nCaretPointer = -1;
bool nFirstLineIsEmptyLine = false;
/* まずは、現在位置が空行(スペース、タブ、改行記号のみの行)かどうか判別 */
if ( pcDocLine = m_pcEditDoc->m_cDocLineMgr.GetLineInfo( m_nCaretPosY_PHY + nCaretPointer ) ){
nFirstLineIsEmptyLine = pcDocLine->IsEmptyLine();
nCaretPointer--;
}
else {
nFirstLineIsEmptyLine = true;
nCaretPointer--;
}
/* 次に、nFirstLineIsEmptyLineと異なるところまで読み飛ばす */
while ( pcDocLine = m_pcEditDoc->m_cDocLineMgr.GetLineInfo( m_nCaretPosY_PHY + nCaretPointer ) ) {
if ( pcDocLine->IsEmptyLine() == nFirstLineIsEmptyLine ){
nCaretPointer--;
}
else {
break;
}
};
/* nFirstLineIsEmptyLineが空行だったら、今見ているところは非空行。すなわちおしまい。
nFirstLineIsEmptyLineが非空行だったら、今見ているところは空行。
*/
if ( nFirstLineIsEmptyLine == true ){
// おしまい。
if ( m_pShareData->m_Common.m_bStopsBothEndsWhenSearchParagraph ){ // 段落の両端で止まる
nCaretPointer++; // 空行の最上行(段落の末端の次の行)で止まる。
}
else {
/* 仕上げに、空行じゃないところまで進む */
while ( pcDocLine = m_pcEditDoc->m_cDocLineMgr.GetLineInfo( m_nCaretPosY_PHY + nCaretPointer ) ) {
if ( pcDocLine->IsEmptyLine() ){
break;
}
else {
nCaretPointer--;
}
};
nCaretPointer++; // 空行の最上行(段落の末端の次の行)で止まる。
}
}
else {
// いま見ているところは空行の1行目
if ( m_pShareData->m_Common.m_bStopsBothEndsWhenSearchParagraph ){ // 段落の両端で止まる
nCaretPointer++;
}
else {
nCaretPointer++;
}
}
// EOFまで来たり、目的の場所まできたので移動終了。
/* 移動距離を計算 */
int nCaretPosX_Layo;
int nCaretPosY_Layo;
/* 移動前の物理位置 */
m_pcEditDoc->m_cLayoutMgr.CaretPos_Phys2Log(
m_nCaretPosX_PHY, m_nCaretPosY_PHY,
&nCaretPosX_Layo, &nCaretPosY_Layo
);
/* 移動後の物理位置 */
int nCaretPosY_Layo_CaretPointer;
m_pcEditDoc->m_cLayoutMgr.CaretPos_Phys2Log(
m_nCaretPosX_PHY, m_nCaretPosY_PHY + nCaretPointer,
&nCaretPosX_Layo, &nCaretPosY_Layo_CaretPointer
);
Cursor_UPDOWN( nCaretPosY_Layo_CaretPointer - nCaretPosY_Layo, bSelect );
return;
}
// From Here 2001.12.03 hor
//! ブックマークの設定?解除を行う(トグル動作)
void CEditView::Command_BOOKMARK_SET(void)
{
CDocLine* pCDocLine;
int nX=0;
int nY;
int nYfrom,nYto;
if( IsTextSelected() && m_nSelectLineFrom<m_nSelectLineTo ){
nYfrom=m_nSelectLineFrom;
nYto =m_nSelectLineTo;
m_pcEditDoc->m_cLayoutMgr.CaretPos_Log2Phys(nX,nYfrom,&nX,&nYfrom);
m_pcEditDoc->m_cLayoutMgr.CaretPos_Log2Phys(nX,nYto,&nX,&nYto);
for(nY=nYfrom;nY<=nYto;nY++){
pCDocLine=m_pcEditDoc->m_cDocLineMgr.GetLineInfo( nY );
if(NULL!=pCDocLine)pCDocLine->SetBookMark(!pCDocLine->IsBookMarked());
}
}else{
pCDocLine=m_pcEditDoc->m_cDocLineMgr.GetLineInfo( m_nCaretPosY_PHY );
if(NULL!=pCDocLine)pCDocLine->SetBookMark(!pCDocLine->IsBookMarked());
}
// 2002.01.16 hor 分割したビューも更新
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -