📄 ceditview_new.cpp
字号:
// $Id: CEditView_New.cpp,v 1.46 2005/01/23 12:43:47 Administrator Exp $
/*! @file
@brief CEditViewクラス
@author Norio Nakatani
@date 1998/12/08 作成
$Revision: 1.46 $
*/
/*
Copyright (C) 1998-2001, Norio Nakatani
Copyright (C) 2000-2001, genta, mik
Copyright (C) 2001, hor
Copyright (C) 2003, MIK
Copyright (C) 2005, MIK
This source code is designed for sakura editor.
Please contact the copyright holders to use this code for other purpose.
*/
#include <stdlib.h>
#include <time.h>
#include <io.h>
#include "CEditView.h"
#include "debug.h"
#include "funccode.h"
#include "CRunningTimer.h"
#include "charcode.h"
#include "mymessage.h"
#include "CEditWnd.h"
#include "CShareData.h"
#include "CDlgCancel.h"
#include "sakura_rc.h"
#include "etc_uty.h"
#include "CRegexKeyword.h" //@@@ 2001.11.17 add MIK
#include "my_icmp.h" //@@@ 2002.01.13 add
#include "Clayout.h"// 2002/2/10 aroka
#include "CDocLine.h"// 2002/2/10 aroka
/*! フォントを選ぶ
@param bFat TRUEで太字
@param bUnderLine TRUEでアンダーライン
*/
HFONT CEditView::ChooseFontHandle( BOOL bFat, BOOL bUnderLine )
{
if( bFat ){ /* 太字か */
if( bUnderLine ){ /* 下線か */
return m_hFont_HAN_FAT_UL;
}else{
return m_hFont_HAN_FAT;
}
}else{
if( bUnderLine ){ /* 下線か */
return m_hFont_HAN_UL;
}else{
return m_hFont_HAN;
}
}
}
/* 通常の描画処理 new */
void CEditView::OnPaint( HDC hdc, PAINTSTRUCT *pPs, BOOL bUseMemoryDC )
{
MY_RUNNINGTIMER( cRunningTimer, "CEditView::OnPaint" );
// 2004.01.28 Moca デスクトップに作画しないように
if( NULL == hdc ){
return;
}
// if( m_bDoing_UndoRedo ){ /* アンドゥ?リドゥの実行中か */
// return;
// }
if( !m_bDrawSWITCH ){
return;
}
/* キャレットを隠す */
HideCaret_( m_hWnd ); // 2002/07/22 novice
// May 9, 2000 genta
Types *TypeDataPtr = &(m_pcEditDoc->GetDocumentAttribute());
int i;
HFONT hFontOld;
HBRUSH hBrush;
COLORREF crBackOld;
COLORREF crTextOld;
HDC hdcOld;
int nTop;
RECT rc;
RECT rcBack;
BOOL bEOF;
int nLineHeight = m_nCharHeight + TypeDataPtr->m_nLineSpace;
int nCharWidth = m_nCharWidth + TypeDataPtr->m_nColmSpace;
int nLineTo = m_nViewTopLine + m_nViewRowNum + 1;
int nX = m_nViewAlignLeft - m_nViewLeftCol * nCharWidth;
int nY;
BOOL bDispBkBitmap = /*TRUE*/FALSE;
const CLayout* pcLayout;
HPEN hPen;
HPEN hPenOld;
//@@@ 2001.11.17 add start MIK
//変更があればタイプ設定を行う。
if( TypeDataPtr->m_bUseRegexKeyword
|| m_cRegexKeyword->m_bUseRegexKeyword ) //OFFなのに前回のデータが残ってる
{
//タイプ別設定をする。設定済みかどうかは呼び先でチェックする。
m_cRegexKeyword->RegexKeySetTypes(TypeDataPtr);
}
//@@@ 2001.11.17 add end MIK
/* キャレットの行桁位置を表示する */
// DrawCaretPosInfo();
/* メモリDCを利用した再描画の場合は描画先のDCを切り替える */
bUseMemoryDC = FALSE;
if( bUseMemoryDC ){
hdcOld = hdc;
hdc = m_hdcCompatDC;
}
/* 03/02/18 対括弧の強調表示(消去) ai */
DrawBracketPair( false );
/* ルーラーとテキストの間の余白 */
//@@@ 2002.01.03 YAZAKI 余白が0のときは無駄でした。
if ( m_nTopYohaku ){
rc.left = 0;
rc.top = m_nViewAlignTop - m_nTopYohaku;
rc.right = m_nViewAlignLeft + m_nViewCx;
rc.bottom = m_nViewAlignTop;
hBrush = ::CreateSolidBrush( TypeDataPtr->m_ColorInfoArr[COLORIDX_TEXT].m_colBACK );
::FillRect( hdc, &rc, hBrush );
::DeleteObject( hBrush );
}
/* 行番号の表示 */
// From Here Sep. 7, 2001 genta
// Sep. 23, 2002 genta 行番号非表示でも行番号色の帯があるので隙間を埋める
if( m_nTopYohaku ){
rc.left = 0;
rc.top = m_nViewAlignTop - m_nTopYohaku;
// Sep. 23 ,2002 genta 余白はテキスト色のまま残す
rc.right = m_nViewAlignLeft - m_pShareData->m_Common.m_nLineNumRightSpace;
rc.bottom = m_nViewAlignTop;
hBrush = ::CreateSolidBrush( TypeDataPtr->m_ColorInfoArr[COLORIDX_GYOU].m_colBACK );
::FillRect( hdc, &rc, hBrush );
::DeleteObject( hBrush );
}
// To Here Sep. 7, 2001 genta
::SetBkMode( hdc, TRANSPARENT );
hFontOld = (HFONT)::SelectObject( hdc, m_hFont_HAN );
m_hFontOld = NULL;
// crBackOld = ::SetBkColor( hdc, TypeDataPtr->m_colorBACK );
// crTextOld = ::SetTextColor( hdc, TypeDataPtr->m_colorTEXT );
crBackOld = ::SetBkColor( hdc, TypeDataPtr->m_ColorInfoArr[COLORIDX_TEXT].m_colBACK );
crTextOld = ::SetTextColor( hdc, TypeDataPtr->m_ColorInfoArr[COLORIDX_TEXT].m_colTEXT );
// ::FillRect( hdc, &pPs->rcPaint, ::GetStockObject( WHITE_BRUSH ) );
nTop = pPs->rcPaint.top;
bEOF = FALSE;
// i = m_nViewTopLine;
if( 0 > nTop - m_nViewAlignTop ){
i = m_nViewTopLine;
}else{
i = m_nViewTopLine + ( ( nTop - m_nViewAlignTop ) / nLineHeight );
}
int nMaxRollBackLineNum = 260 / TypeDataPtr->m_nMaxLineSize + 1;
int nRollBackLineNum = 0;
pcLayout = m_pcEditDoc->m_cLayoutMgr.Search( i );
while( nRollBackLineNum < nMaxRollBackLineNum ){
pcLayout = m_pcEditDoc->m_cLayoutMgr.Search( i );
if( NULL == pcLayout ){
break;
}
if( 0 == pcLayout->m_nOffset ){ /* 対応する論理行の先頭からのオフセット */
break;
}
i--;
nRollBackLineNum++;
}
nY = ( i - m_nViewTopLine ) * nLineHeight + m_nViewAlignTop;
nLineTo = m_nViewTopLine + ( ( pPs->rcPaint.bottom - m_nViewAlignTop ) / nLineHeight );
BOOL bSelected;
bSelected = IsTextSelected();
for( ; i <= nLineTo; ){
pcLayout = m_pcEditDoc->m_cLayoutMgr.Search( i );
#ifdef _DEBUG
{
if( NULL != pcLayout ){
if( (void*)0xdddddddd == (void*)pcLayout->m_pCDocLine->m_pLine ){
m_pcEditDoc->m_cDocLineMgr.DUMP();
m_pcEditDoc->m_cLayoutMgr.DUMP();
pcLayout = m_pcEditDoc->m_cLayoutMgr.Search( i );
}
int nLineLen = pcLayout->m_pCDocLine->m_pLine->GetLength() - pcLayout->m_nOffset;
const char * pLine = (const char *)pcLayout->m_pCDocLine->m_pLine->GetPtr() + pcLayout->m_nOffset;
}
}
#endif
if( DispLineNew(
hdc,
pcLayout,
i,
nX,
nY,
bDispBkBitmap,
nLineTo,
bSelected
) ){
pPs->rcPaint.bottom += nLineHeight; /* EOF再描画対応 */
bEOF = TRUE;
break;
}
if( NULL == pcLayout ){
bEOF = TRUE;
break;
}
}
if( NULL != m_hFontOld ){
::SelectObject( hdc, m_hFontOld );
m_hFontOld = NULL;
}
// if( bEOF ){
// nTop = ( i + 1 - m_nViewTopLine ) * nLineHeight + m_nViewAlignTop;
// }else{
// nTop = ( i - m_nViewTopLine ) * nLineHeight + m_nViewAlignTop;
// }
if( bDispBkBitmap ){
}else{
/* テキストのない部分を背景色で塗りつぶす */
if( nY/*nTop*/ < pPs->rcPaint.bottom ){
rcBack.left = pPs->rcPaint.left;
rcBack.right = pPs->rcPaint.right;
rcBack.top = nY/*nTop*/;
rcBack.bottom = pPs->rcPaint.bottom;
//#ifdef _DEBUG
// hBrush = ::CreateSolidBrush( RGB( 128, 128, 128 ) );
//#else
hBrush = ::CreateSolidBrush( TypeDataPtr->m_ColorInfoArr[COLORIDX_TEXT].m_colBACK );
//#endif
::FillRect( hdc, &rcBack, hBrush );
::DeleteObject( hBrush );
}
}
::SetTextColor( hdc, crTextOld );
::SetBkColor( hdc, crBackOld );
::SelectObject( hdc, hFontOld );
/* 折り返し位置の表示 */
if( TypeDataPtr->m_ColorInfoArr[COLORIDX_WRAP].m_bDisp ){
nX = m_nViewAlignLeft + ( TypeDataPtr->m_nMaxLineSize - m_nViewLeftCol ) * nCharWidth;
// 2003.10.15 Moca Windows 95/98では座標を下位16bit表現しか見ないので
// 折り返し位置が右に行きすぎると変な位置に線が引かれてしまうのを防ぐ
if( nX < 0x10000 ){
/* 折り返し記号の色のペンを作成 */
hPen = ::CreatePen( PS_SOLID, 0, TypeDataPtr->m_ColorInfoArr[COLORIDX_WRAP].m_colTEXT );
hPenOld = (HPEN)::SelectObject( hdc, hPen );
::MoveToEx( hdc, nX, m_nViewAlignTop, NULL );
::LineTo( hdc, nX, m_nViewAlignTop + m_nViewCy );
::SelectObject( hdc, hPenOld );
::DeleteObject( hPen );
}
}
/* ルーラー描画 */
if ( pPs->rcPaint.top < m_nViewAlignTop - m_nTopYohaku ) { // ルーラーが再描画範囲にあるときのみ再描画する 2002.02.25 Add By KK
m_bRedrawRuler = true; //2002.02.25 Add By KK ルーラー全体を描画。
DispRuler( hdc );
}
if ( m_pcEditDoc->m_nActivePaneIndex == m_nMyIndex ){
/* アクティブペインは、アンダーライン描画 */
m_cUnderLine.CaretUnderLineON( TRUE );
}
/* メモリDCを利用した再描画の場合はメモリDCに描画した内容を画面へコピーする */
if( bUseMemoryDC ){
::BitBlt(
hdcOld,
pPs->rcPaint.left,
pPs->rcPaint.top,
pPs->rcPaint.right - pPs->rcPaint.left,
pPs->rcPaint.bottom - pPs->rcPaint.top,
hdc,
pPs->rcPaint.left,
pPs->rcPaint.top,
SRCCOPY
);
}
/* 03/02/18 対括弧の強調表示(描画) ai */
DrawBracketPair( true );
/* キャレットを現在位置に表示します */
ShowCaret_( m_hWnd ); // 2002/07/22 novice
return;
}
//@@@ 2001.02.17 Start by MIK
/*! 行のテキスト/選択状態の描画
@par nCOMMENTMODE
関数内部で状態遷移のために使われる変数nCOMMENTMODEと状態の関係。
// 2002/03/13 novice
- COLORIDX_TEXT : テキスト
- COLORIDX_COMMENT : 行コメント
- COLORIDX_BLOCK1 : ブロックコメント1
- COLORIDX_SSTRING : シングルコーテーション
- COLORIDX_WSTRING : ダブルコーテーション
- COLORIDX_KEYWORD1 : 強調キーワード1
- COLORIDX_CTRLCODE : コントロールコード
- COLORIDX_DIGIT : 半角数値
- COLORIDX_BLOCK2 : ブロックコメント2
- COLORIDX_KEYWORD2 : 強調キーワード2
- COLORIDX_URL : URL
- COLORIDX_SEARCH : 検索
- 1000: 正規表現キーワード
色指定SetCurrentColorを呼ぶときにCOLORIDX_*値を加算するので、
1000~COLORIDX_LASTまでは正規表現で使用する。
@date 2001.12.21 YAZAKI 改行記号の描きかたを変更
*/
//@@@ 2001.02.17 End by MIK
int CEditView::DispLineNew(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -