⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ceditview.cpp

📁 日本的开源编辑器源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//	$Id: CEditView.cpp,v 1.104 2005/04/17 10:01:03 genta Exp $
/*!	@file
	@brief 文書ウィンドウの管理

	@author Norio Nakatani
	@date	1998/03/13 作成
	$Revision: 1.104 $
*/
/*
	Copyright (C) 1998-2001, Norio Nakatani
	Copyright (C) 2000-2001, genta
	Copyright (C) 2001, GAE, MIK, hor, asa-o, Stonee, Misaka, novice, YAZAKI
	Copyright (C) 2002, YAZAKI, hor, aroka, MIK, Moca
	Copyright (C) 2003, 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 "keycode.h"
#include "funccode.h"
#include "CRunningTimer.h"
#include "charcode.h"
#include "mymessage.h"
#include "CWaitCursor.h"
#include "CEditWnd.h"
#include "CShareData.h"
#include "CDlgCancel.h"
#include "sakura_rc.h"
#include "etc_uty.h"
#include "global.h"
#include "CAutoSave.h"
#include "CLayout.h"/// 2002/2/3 aroka
#include "COpe.h"///
#include "COpeBlk.h"///
#include "CDropTarget.h"///
#include "CSplitBoxWnd.h"///
#include "CRegexKeyword.h"///	//@@@ 2001.11.17 add MIK
#include "CMarkMgr.h"///
#include "COsVersionInfo.h"
#include "CDocLine.h"   // 2002.04.09 minfu
#include "CFileLoad.h" // 2002/08/30 Moca
#include "CMemoryIterator.h"	// @@@ 2002.09.28 YAZAKI
#include "my_icmp.h" // 2002/11/30 Moca 追加
#include "CMigemo.h"

#ifndef WM_MOUSEWHEEL
	#define WM_MOUSEWHEEL	0x020A
#endif

// novice 2004/10/10 マウスサイドボタン対応
#ifndef WM_XBUTTONDOWN
	#define WM_XBUTTONDOWN   0x020B
	#define WM_XBUTTONUP     0x020C
	#define WM_XBUTTONDBLCLK 0x020D
#endif
#ifndef XBUTTON1
	#define XBUTTON1 0x0001
	#define XBUTTON2 0x0002
#endif

#ifndef IMR_RECONVERTSTRING
#define IMR_RECONVERTSTRING             0x0004
#endif // IMR_RECONVERTSTRING

/* 2002.04.09 minfu 再変換調整 */
#ifndef IMR_CONFIRMRECONVERTSTRING
#define IMR_CONFIRMRECONVERTSTRING             0x0005
#endif // IMR_CONFIRMRECONVERTSTRING



CEditView*	g_m_pcEditView;
LRESULT CALLBACK EditViewWndProc( HWND, UINT, WPARAM, LPARAM );
VOID CALLBACK EditViewTimerProc( HWND, UINT, UINT, DWORD );

#define IDT_ROLLMOUSE	1

/* リソースヘッダー */
#define	 BFT_BITMAP		0x4d42	  /* 'BM' */

/* リソースがDIBかどうかを判断するマクロ */
#define	 ISDIB(bft)		((bft) == BFT_BITMAP)

/* 指定された値を最も近いバイト境界に整列させるマクロ */
#define	 WIDTHBYTES(i)	((i+31)/32*4)

//DWORD DoGrepProc(
//	DWORD	dwGrepParam
//);

//@@@2002.01.14 YAZAKI staticにしてメモリの節約((10240+10) * 3 バイト)
int CEditView::m_pnDx[10240 + 10];

BOOL IsDataAvailable( LPDATAOBJECT pDataObject, CLIPFORMAT cfFormat )
{
//	STGMEDIUM	stgMedium;
	FORMATETC	fe;
	BOOL		bRes;
//初期形
//	fe.cfFormat = cfFormat;
//	fe.ptd = NULL;
//	fe.dwAspect = DVASPECT_CONTENT;
//	fe.lindex = -1;
//	fe.tymed = (TYMED)-1;
//	bRes = SUCCEEDED( pDataObject->QueryGetData( &fe ) );


/*
	TYMED_HGLOBAL	= 1,
	TYMED_FILE		= 2,
	TYMED_ISTREAM	= 4,
	TYMED_ISTORAGE	= 8,
	TYMED_GDI		= 16,
	TYMED_MFPICT	= 32,
	TYMED_ENHMF		= 64,
	TYMED_NULL		= 0
*/
//	MYTRACE( "=====================\n" );

	fe.cfFormat = cfFormat;
	fe.ptd = NULL;
	fe.dwAspect = DVASPECT_CONTENT;
	fe.lindex = -1;
	fe.tymed = (TYMED)TYMED_FILE;
	bRes = SUCCEEDED( pDataObject->QueryGetData( &fe ) );
//	MYTRACE( "bRes= %d\n", bRes );
	if( bRes ){
		return FALSE;
	}

	fe.cfFormat = cfFormat;
	fe.ptd = NULL;
	fe.dwAspect = DVASPECT_CONTENT;
	fe.lindex = -1;
	fe.tymed = (TYMED)TYMED_ISTREAM;
	bRes = SUCCEEDED( pDataObject->QueryGetData( &fe ) );
//	MYTRACE( "bRes= %d\n", bRes );
	if( bRes ){
		return FALSE;
	}

	fe.cfFormat = cfFormat;
	fe.ptd = NULL;
	fe.dwAspect = DVASPECT_CONTENT;
	fe.lindex = -1;
	fe.tymed = (TYMED)TYMED_ISTORAGE;
	bRes = SUCCEEDED( pDataObject->QueryGetData( &fe ) );
//	MYTRACE( "bRes= %d\n", bRes );
	if( bRes ){
		return FALSE;
	}

	fe.cfFormat = cfFormat;
	fe.ptd = NULL;
	fe.dwAspect = DVASPECT_CONTENT;
	fe.lindex = -1;
	fe.tymed = (TYMED)TYMED_GDI;
	bRes = SUCCEEDED( pDataObject->QueryGetData( &fe ) );
//	MYTRACE( "bRes= %d\n", bRes );
	if( bRes ){
		return FALSE;
	}

	fe.cfFormat = cfFormat;
	fe.ptd = NULL;
	fe.dwAspect = DVASPECT_CONTENT;
	fe.lindex = -1;
	fe.tymed = (TYMED)TYMED_MFPICT;
	bRes = SUCCEEDED( pDataObject->QueryGetData( &fe ) );
//	MYTRACE( "bRes= %d\n", bRes );
	if( bRes ){
		return FALSE;
	}

	fe.cfFormat = cfFormat;
	fe.ptd = NULL;
	fe.dwAspect = DVASPECT_CONTENT;
	fe.lindex = -1;
	fe.tymed = (TYMED)TYMED_ENHMF;
	bRes = SUCCEEDED( pDataObject->QueryGetData( &fe ) );
//	MYTRACE( "bRes= %d\n", bRes );
	if( bRes ){
		return FALSE;
	}


	fe.cfFormat = cfFormat;
	fe.ptd = NULL;
	fe.dwAspect = DVASPECT_CONTENT;
	fe.lindex = -1;
	fe.tymed = (TYMED)TYMED_NULL;
	bRes = SUCCEEDED( pDataObject->QueryGetData( &fe ) );
//	MYTRACE( "bRes= %d\n", bRes );
	if( bRes ){
		return FALSE;
	}

	fe.cfFormat = cfFormat;
	fe.ptd = NULL;
	fe.dwAspect = DVASPECT_CONTENT;
	fe.lindex = -1;
	fe.tymed = (TYMED)TYMED_HGLOBAL;
	bRes = SUCCEEDED( pDataObject->QueryGetData( &fe ) );
//	MYTRACE( "bRes= %d\n", bRes );

//	MYTRACE( "=====================\n" );
	return bRes;
}
HGLOBAL GetGlobalData( LPDATAOBJECT pDataObject, CLIPFORMAT cfFormat )
{
	FORMATETC fe;
	fe.cfFormat = cfFormat;
	fe.ptd = NULL;
	fe.dwAspect = DVASPECT_CONTENT;
	fe.lindex = -1;
	fe.tymed = (TYMED)-1;

	HGLOBAL hDest = NULL;
	STGMEDIUM stgMedium;
	if( SUCCEEDED( pDataObject->GetData( &fe, &stgMedium ) ) ){
		if( stgMedium.pUnkForRelease == NULL ){
			if( stgMedium.tymed == TYMED_HGLOBAL )
				hDest = stgMedium.hGlobal;
		}else{
			if( stgMedium.tymed == TYMED_HGLOBAL ){
				DWORD nSize = ::GlobalSize( stgMedium.hGlobal );
				hDest = ::GlobalAlloc( GMEM_SHARE|GMEM_MOVEABLE, nSize );
				if( hDest != NULL ){
					// copy the bits
					LPVOID lpSource = ::GlobalLock( stgMedium.hGlobal );
					LPVOID lpDest = ::GlobalLock( hDest );
					memcpy( lpDest, lpSource, nSize );
					::GlobalUnlock( hDest );
					::GlobalUnlock( stgMedium.hGlobal );
				}
			}
			::ReleaseStgMedium( &stgMedium );
		}
	}
	return hDest;
}


/*
|| ウィンドウプロシージャ
||
*/
LRESULT CALLBACK EditViewWndProc(
	HWND		hwnd,	// handle of window
	UINT		uMsg,	// message identifier
	WPARAM		wParam,	// first message parameter
	LPARAM		lParam 	// second message parameter
)
{
	CEditView*	pCEdit;
	switch( uMsg ){
	case WM_CREATE:
		pCEdit = ( CEditView* )g_m_pcEditView;
		return pCEdit->DispatchEvent( hwnd, uMsg, wParam, lParam );
	default:
		pCEdit = ( CEditView* )::GetWindowLongPtr( hwnd, 0 );
		if( NULL != pCEdit ){
			//	May 16, 2000 genta
			//	From Here
			if( uMsg == WM_COMMAND ){
				::SendMessage( ::GetParent( pCEdit->m_hwndParent ), WM_COMMAND, wParam,  lParam );
			}
			else{
				return pCEdit->DispatchEvent( hwnd, uMsg, wParam, lParam );
			}
			//	To Here
		}
		return ::DefWindowProc( hwnd, uMsg, wParam, lParam );
	}
}


/*
||  タイマーメッセージのコールバック関数
||
||	現在は、マウスによる領域選択時のスクロール処理のためにタイマーを使用しています。
*/
VOID CALLBACK EditViewTimerProc(
	HWND hwnd,		// handle of window for timer messages
	UINT uMsg,		// WM_TIMER message
	UINT idEvent,	// timer identifier
	DWORD dwTime 	// current system time
)
{
	CEditView*	pCEditView;
	pCEditView = ( CEditView* )::GetWindowLongPtr( hwnd, 0 );
	if( NULL != pCEditView ){
		pCEditView->OnTimer( hwnd, uMsg, idEvent, dwTime );
	}
	return;
}



//	@date 2002.2.17 YAZAKI CShareDataのインスタンスは、CProcessにひとつあるのみ。
CEditView::CEditView() : m_cHistory( new CAutoMarkMgr ) //,
// 20020331 aroka 再変換対応 for 95/NT
// 2002.04.09 コンストラクタのなかに移動しました。 minfu
//	m_uMSIMEReconvertMsg( ::RegisterWindowMessage( RWM_RECONVERT ) ),
//	m_uATOKReconvertMsg( ::RegisterWindowMessage( MSGNAME_ATOK_RECONVERT ) )
{
	LOGFONT		lf;

	//	Jun. 27, 2001 genta	正規表現ライブラリの差し替え
	m_CurRegexp.Init();

	m_bDrawSWITCH = TRUE;
	m_pcDropTarget = new CDropTarget( this );
	m_bDragSource = FALSE;
	m_bDragMode = FALSE;					/* 選択テキストのドラッグ中か */
	m_bCurSrchKeyMark = FALSE;				/* 検索文字列 */
	//	Jun. 27, 2001 genta
	m_szCurSrchKey[0] = '\0';
	//strcpy( m_szCurSrchKey, "" );			/**/
	m_bCurSrchRegularExp = 0;				/* 検索/置換  1==正規表現 */
	m_bCurSrchLoHiCase = 0;					/* 検索/置換  1==英大文字小文字の区別 */
	m_bCurSrchWordOnly = 0;					/* 検索/置換  1==単語のみ検索 */

	m_bExecutingKeyMacro = FALSE;			/* キーボードマクロの実行中 */
	m_bPrevCommand = 0;
	m_nMyIndex = 0;

	//	Dec. 4, 2002 genta
	//	メニューバーへのメッセージ表示機能はCEditWndへ移管

	/* 共有データ構造体のアドレスを返す */
	m_pShareData = CShareData::getInstance()->GetShareData();
	m_bCommandRunning = FALSE;	/* コマンドの実行中 */
	m_pcOpeBlk = NULL;			/* 操作ブロック */
	m_bDoing_UndoRedo = FALSE;	/* アンドゥ?リドゥの実行中か */
	m_pcsbwVSplitBox = NULL;	/* 垂直分割ボックス */
	m_pcsbwHSplitBox = NULL;	/* 水平分割ボックス */
	m_pszAppName = "EditorClient";
	m_hInstance = NULL;
	m_hWnd = NULL;
	m_hwndVScrollBar = NULL;
	m_nVScrollRate = 1;			/* 垂直スクロールバーの縮尺 */
	m_hwndHScrollBar = NULL;
	m_hwndSizeBox = NULL;
	m_nCaretPosX = 0;			/* ビュー左端からのカーソル桁位置(0オリジン) */
	m_nCaretPosX_Prev = 0;		/* ビュー左端からのカーソル桁直前の位置(0オリジン) */
	m_nCaretPosY = 0;			/* ビュー上端からのカーソル行位置(0オリジン) */

	m_nCaretPosX_PHY = 0;		/* カーソル位置 改行単位行先頭からのバイト数(0開始) */
	m_nCaretPosY_PHY = 0;		/* カーソル位置 改行単位行の行番号(0開始) */

	m_nSrchStartPosX_PHY = -1;	/* 検索/置換開始時のカーソル位置  改行単位行先頭からのバイト数(0開始) */	// 02/06/26 ai
	m_nSrchStartPosY_PHY = -1;	/* 検索/置換開始時のカーソル位置  改行単位行の行番号(0開始) */				// 02/06/26 ai
	m_bSearch = FALSE;			/* 検索/置換開始位置を登録するか */											// 02/06/26 ai
	m_nBracketPairPosX_PHY = -1;/* 対括弧の位置 改行単位行先頭からのバイト数(0開始) */	// 02/12/13 ai
	m_nBracketPairPosY_PHY = -1;/* 対括弧の位置 改行単位行の行番号(0開始) */			// 02/12/13 ai
	m_nBracketCaretPosX_PHY = -1;	/* 03/02/18 ai */
	m_nBracketCaretPosY_PHY = -1;	/* 03/02/18 ai */
	m_bDrawBracketPairFlag = FALSE;	/* 03/02/18 ai */
	m_bDrawSelectArea = FALSE;	/* 選択範囲を描画したか */	// 02/12/13 ai

	m_nCaretWidth = 0;			/* キャレットの幅 */
	m_nCaretHeight = 0;			/* キャレットの高さ */
	m_bSelectingLock = FALSE;	/* 選択状態のロック */
	m_bBeginSelect = FALSE;		/* 範囲選択中 */
	m_bBeginBoxSelect = FALSE;	/* 矩形範囲選択中 */
	m_bBeginLineSelect = FALSE;	/* 行単位選択中 */
	m_bBeginWordSelect = FALSE;	/* 単語単位選択中 */

	m_nSelectLineBgnFrom = -1;	/* 範囲選択開始行(原点) */
	m_nSelectColmBgnFrom = -1;	/* 範囲選択開始桁(原点) */
	m_nSelectLineBgnTo = -1;	/* 範囲選択開始行(原点) */
	m_nSelectColmBgnTo = -1;	/* 範囲選択開始桁(原点) */

	m_nSelectLineFrom = -1;		/* 範囲選択開始行 */
	m_nSelectColmFrom = -1;		/* 範囲選択開始桁 */
	m_nSelectLineTo = -1;		/* 範囲選択終了行 */
	m_nSelectColmTo = -1;		/* 範囲選択終了桁 */

	m_nSelectLineFromOld = 0;	/* 範囲選択開始行 */
	m_nSelectColmFromOld = 0;	/* 範囲選択開始桁 */
	m_nSelectLineToOld = 0;		/* 範囲選択終了行 */
	m_nSelectColmToOld = 0;		/* 範囲選択終了桁 */
	m_nViewAlignLeft = 0;		/* 表示域の左端座標 */
	m_nViewAlignLeftCols = 0;	/* 行番号域の桁数 */
	m_nTopYohaku = m_pShareData->m_Common.m_nRulerBottomSpace; 	/* ルーラーとテキストの隙間 */
	m_nViewAlignTop = m_nTopYohaku;		/* 表示域の上端座標 */

	/* ルーラー表示 */
	m_nViewAlignTop += m_pShareData->m_Common.m_nRulerHeight;	/* ルーラー高さ */
	m_nOldCaretPosX = 0;	// 前回描画したルーラーのキャレット位置 2002.02.25 Add By KK
	m_nOldCaretWidth = 0;	// 前回描画したルーラーのキャレット幅   2002.02.25 Add By KK
	m_bRedrawRuler = true;	// ルーラー全体を描き直す時=true   2002.02.25 Add By KK
	m_nViewCx = 0;				/* 表示域の幅 */
	m_nViewCy = 0;				/* 表示域の高さ */
	m_nViewColNum = 0;			/* 表示域の桁数 */
	m_nViewRowNum = 0;			/* 表示域の行数 */
	m_nViewTopLine = 0;			/* 表示域の一番上の行 */
	m_nViewLeftCol = 0;			/* 表示域の一番左の桁 */
	m_hdcCompatDC = NULL;		/* 再描画用コンパチブルDC */
	m_hbmpCompatBMP = NULL;		/* 再描画用メモリBMP */
	m_hbmpCompatBMPOld = NULL;	/* 再描画用メモリBMP(OLD) */
	m_nCharWidth = 10;			/* 半角文字の幅 */
	m_nCharHeight = 18;			/* 文字の高さ */

	/* フォント作成 */
	m_hFont_HAN = CreateFontIndirect( &(m_pShareData->m_Common.m_lf) );

	/* 太字フォント作成 */
	lf = m_pShareData->m_Common.m_lf;
	lf.lfWeight += 300;
	if( 1000 < lf.lfWeight ){
		lf.lfWeight = 1000;
	}
	m_hFont_HAN_FAT = CreateFontIndirect( &lf );

	/* 下線フォント作成 */
	lf = m_pShareData->m_Common.m_lf;
	lf.lfUnderline = TRUE;
	m_hFont_HAN_UL = CreateFontIndirect( &lf );

	/* 太字下線フォント作成 */
	lf = m_pShareData->m_Common.m_lf;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -