📄 edit.c
字号:
/******************************************************************************
*
*
* Notepad2
*
* Edit.c
* Text File Editing Helper Stuff
*
* See Readme.txt for more information about this source code.
* Please send me your comments to this work.
*
* See License.txt for details about distribution and modification.
*
* (c) Florian Balmer 1996-2008
* florian.balmer@gmail.com
* http://www.flos-freeware.ch
*
*
******************************************************************************/
#include <windows.h>
#include <shlwapi.h>
#include <commctrl.h>
#include <commdlg.h>
#include <string.h>
#include "notepad2.h"
#include "helpers.h"
#include "dialogs.h"
#include "scintilla.h"
#include "scilexer.h"
#include "styles.h"
#include "edit.h"
#include "resource.h"
extern HWND hwndMain;
extern HWND hwndEdit;
extern HINSTANCE g_hInstance;
extern LPMALLOC g_lpMalloc;
extern HWND hDlgFindReplace;
extern UINT cpLastFind;
extern int iDefaultEncoding;
extern int iEncodings[5];
extern int iDefaultEOLMode;
extern int iLineEndings[3];
extern int bFixLineEndings;
// Default Codepage and Character Set
extern int iDefaultCodePage;
extern int iDefaultCharSet;
extern BOOL bSkipUnicodeDetection;
extern LPMRULIST mruFind;
extern LPMRULIST mruReplace;
//=============================================================================
//
// EditCreate()
//
HWND EditCreate(HWND hwndParent)
{
HWND hwnd;
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
"Scintilla",
NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS,
0,0,0,0,
hwndParent,
(HMENU)IDC_EDIT,
g_hInstance,
NULL);
SendMessage(hwnd,SCI_SETCODEPAGE,iDefaultCodePage,0);
SendMessage(hwnd,SCI_SETEOLMODE,SC_EOL_CRLF,0);
SendMessage(hwnd,SCI_SETPASTECONVERTENDINGS,1,0);
SendMessage(hwnd,SCI_SETMODEVENTMASK,/*SC_MODEVENTMASKALL*/SC_MOD_INSERTTEXT|SC_MOD_DELETETEXT,0);
SendMessage(hwnd,SCI_USEPOPUP,FALSE,0);
SendMessage(hwnd,SCI_SETCARETPERIOD,GetCaretBlinkTime(),0);
SendMessage(hwnd,SCI_SETSCROLLWIDTH,2048,0);
SendMessage(hwnd,SCI_SETSCROLLWIDTHTRACKING,TRUE,0);
SendMessage(hwnd,SCI_SETENDATLASTLINE,TRUE,0);
SendMessage(hwnd,SCI_SETCARETSTICKY,FALSE,0);
SendMessage(hwnd,SCI_SETXCARETPOLICY,CARET_SLOP|CARET_EVEN,50);
SendMessage(hwnd,SCI_SETYCARETPOLICY,CARET_EVEN,0);
SendMessage(hwnd,SCI_SETTABINDENTS,TRUE,0);
SendMessage(hwnd,SCI_SETBACKSPACEUNINDENTS,FALSE,0);
SendMessage(hwnd,SCI_ASSIGNCMDKEY,(SCK_NEXT + (SCMOD_CTRL << 16)),SCI_PARADOWN);
SendMessage(hwnd,SCI_ASSIGNCMDKEY,(SCK_PRIOR + (SCMOD_CTRL << 16)),SCI_PARAUP);
SendMessage(hwnd,SCI_ASSIGNCMDKEY,(SCK_NEXT + ((SCMOD_CTRL | SCMOD_SHIFT) << 16)),SCI_PARADOWNEXTEND);
SendMessage(hwnd,SCI_ASSIGNCMDKEY,(SCK_PRIOR + ((SCMOD_CTRL | SCMOD_SHIFT) << 16)),SCI_PARAUPEXTEND);
SendMessage(hwnd,SCI_ASSIGNCMDKEY,(SCK_HOME + (0 << 16)),SCI_VCHOMEWRAP);
SendMessage(hwnd,SCI_ASSIGNCMDKEY,(SCK_END + (0 << 16)),SCI_LINEENDWRAP);
SendMessage(hwnd,SCI_ASSIGNCMDKEY,(SCK_HOME + (SCMOD_SHIFT << 16)),SCI_VCHOMEWRAPEXTEND);
SendMessage(hwnd,SCI_ASSIGNCMDKEY,(SCK_END + (SCMOD_SHIFT << 16)),SCI_LINEENDWRAPEXTEND);
// Init default values for printing
EditPrintInit();
SciInitThemes(hwnd);
return(hwnd);
}
//=============================================================================
//
// EditSetNewText()
//
extern BOOL bFreezeAppTitle;
void EditSetNewText(HWND hwnd,LPCSTR lpstrText,DWORD cbText)
{
bFreezeAppTitle = TRUE;
if (SendMessage(hwnd,SCI_GETREADONLY,0,0))
SendMessage(hwnd,SCI_SETREADONLY,FALSE,0);
SendMessage(hwnd,SCI_CANCEL,0,0);
SendMessage(hwnd,SCI_SETUNDOCOLLECTION,0,0);
SendMessage(hwnd,SCI_EMPTYUNDOBUFFER,0,0);
SendMessage(hwnd,SCI_CLEARALL,0,0);
SendMessage(hwnd,SCI_MARKERDELETEALL,(WPARAM)-1,0);
SendMessage(hwnd,SCI_SETSCROLLWIDTH,2048,0);
if (cbText > 0)
SendMessage(hwnd,SCI_ADDTEXT,cbText,(LPARAM)lpstrText);
SendMessage(hwnd,SCI_SETUNDOCOLLECTION,1,0);
SendMessage(hwnd,EM_EMPTYUNDOBUFFER,0,0);
SendMessage(hwnd,SCI_SETSAVEPOINT,0,0);
SendMessage(hwnd,SCI_GOTOPOS,0,0);
SendMessage(hwnd,SCI_CHOOSECARETX,0,0);
bFreezeAppTitle = FALSE;
}
//=============================================================================
//
// EditConvertText()
//
BOOL EditConvertText(HWND hwnd,UINT cpSource,UINT cpDest,BOOL bSetSavePoint)
{
struct TextRange tr = { { 0, -1 }, NULL };
int length, cbText, cbwText;
char *pchText;
WCHAR *pwchText;
if (cpSource == cpDest)
return(TRUE);
length = SendMessage(hwnd,SCI_GETLENGTH,0,0);
if (length == 0) {
SendMessage(hwnd,SCI_CANCEL,0,0);
SendMessage(hwnd,SCI_SETUNDOCOLLECTION,0,0);
SendMessage(hwnd,SCI_EMPTYUNDOBUFFER,0,0);
SendMessage(hwnd,SCI_CLEARALL,0,0);
SendMessage(hwnd,SCI_MARKERDELETEALL,(WPARAM)-1,0);
SendMessage(hwnd,SCI_SETCODEPAGE,cpDest,0);
SendMessage(hwnd,SCI_SETUNDOCOLLECTION,1,0);
SendMessage(hwnd,EM_EMPTYUNDOBUFFER,0,0);
SendMessage(hwnd,SCI_GOTOPOS,0,0);
SendMessage(hwnd,SCI_CHOOSECARETX,0,0);
if (bSetSavePoint)
SendMessage(hwnd,SCI_SETSAVEPOINT,0,0);
}
else {
pchText = GlobalAlloc(GPTR,length*5+2);
tr.lpstrText = pchText;
SendMessage(hwnd,SCI_GETTEXTRANGE,0,(LPARAM)&tr);
pwchText = GlobalAlloc(GPTR,length*3+2);
cbwText = MultiByteToWideChar(cpSource,0,pchText,length,pwchText,length*3+2);
cbText = WideCharToMultiByte(cpDest,0,pwchText,cbwText,pchText,length*5+2,NULL,NULL);
SendMessage(hwnd,SCI_CANCEL,0,0);
SendMessage(hwnd,SCI_SETUNDOCOLLECTION,0,0);
SendMessage(hwnd,SCI_EMPTYUNDOBUFFER,0,0);
SendMessage(hwnd,SCI_CLEARALL,0,0);
SendMessage(hwnd,SCI_MARKERDELETEALL,(WPARAM)-1,0);
SendMessage(hwnd,SCI_SETCODEPAGE,cpDest,0);
SendMessage(hwnd,SCI_ADDTEXT,cbText,(LPARAM)pchText);
SendMessage(hwnd,SCI_EMPTYUNDOBUFFER,0,0);
SendMessage(hwnd,SCI_SETUNDOCOLLECTION,1,0);
SendMessage(hwnd,SCI_GOTOPOS,0,0);
SendMessage(hwnd,SCI_CHOOSECARETX,0,0);
GlobalFree(pchText);
GlobalFree(pwchText);
}
return(TRUE);
}
//=============================================================================
//
// EditGetClipboardText()
//
LPSTR EditGetClipboardText(HWND hwnd)
{
HANDLE hmem;
WCHAR *pwch;
char *pmch;
char *ptmp;
int wlen, mlen, mlen2;
int codepage;
int eolmode;
if (!IsClipboardFormatAvailable(CF_UNICODETEXT) || !OpenClipboard(GetParent(hwnd)))
return(NULL);
hmem = GetClipboardData(CF_UNICODETEXT);
pwch = GlobalLock(hmem);
wlen = lstrlenW(pwch);
codepage = SendMessage(hwnd,SCI_GETCODEPAGE,0,0);
eolmode = SendMessage(hwnd,SCI_GETEOLMODE,0,0);
mlen = WideCharToMultiByte(codepage,0,pwch,wlen + 1,NULL,0,0,0) - 1;
pmch = LocalAlloc(LPTR,mlen + 1);
if (pmch)
WideCharToMultiByte(codepage,0,pwch,wlen + 1,pmch,mlen + 1,NULL,NULL);
ptmp = LocalAlloc(LPTR,mlen * 2 + 1);
if (ptmp) {
char *s = pmch;
char *d = ptmp;
int i;
for (i = 0; (i < mlen) && (*s != 0); i++) {
if (*s == '\n' || *s == '\r') {
if (eolmode == SC_EOL_CR) {
*d++ = '\r';
} else if (eolmode == SC_EOL_LF) {
*d++ = '\n';
} else { // eolmode == SC_EOL_CRLF
*d++ = '\r';
*d++ = '\n';
}
if ((*s == '\r') && (i+1 < mlen) && (*(s+1) == '\n')) {
i++;
s++;
}
s++;
} else {
*d++ = *s++;
}
}
*d++ = 0;
mlen2 = (d - ptmp) - 1;
LocalFree(pmch);
pmch = LocalAlloc(LPTR,mlen2 + 1);
lstrcpy(pmch,ptmp);
LocalFree(ptmp);
}
GlobalUnlock(hmem);
CloseClipboard();
return(pmch);
}
//=============================================================================
//
// EditDetectEOLMode() - moved here to handle Unicode files correctly
//
int EditDetectEOLMode(HWND hwnd,LPCSTR lpData,DWORD cbData)
{
int iEOLMode = iLineEndings[iDefaultEOLMode];
char *cp = (char*)lpData;
while (*cp && (*cp != '\x0D' && *cp != '\x0A')) cp++;
if (*cp == '\x0D' && *(cp+1) == '\x0A')
iEOLMode = SC_EOL_CRLF;
else if (*cp == '\x0D' && *(cp+1) != '\x0A')
iEOLMode = SC_EOL_CR;
else if (*cp == '\x0A')
iEOLMode = SC_EOL_LF;
return (iEOLMode);
}
//=============================================================================
//
// IsUnicode(), IsUTF8(), IsUTF7()
//
BOOL IsUnicode(const char* pBuffer,int cb,LPBOOL lpbBOM,LPBOOL lpbReverse)
{
int i = 0xFFFF;
BOOL bIsTextUnicode;
BOOL bHasBOM;
BOOL bHasRBOM;
if (!pBuffer || cb < 2)
return FALSE;
if (!bSkipUnicodeDetection)
bIsTextUnicode = IsTextUnicode(pBuffer,cb,&i);
else
bIsTextUnicode = FALSE;
bHasBOM = (*pBuffer == '\xFF' && *(pBuffer+1) == '\xFE');
bHasRBOM = (*pBuffer == '\xFE' && *(pBuffer+1) == '\xFF');
/*
#define IS_TEXT_UNICODE_ASCII16 0x0001
#define IS_TEXT_UNICODE_REVERSE_ASCII16 0x0010
#define IS_TEXT_UNICODE_STATISTICS 0x0002
#define IS_TEXT_UNICODE_REVERSE_STATISTICS 0x0020
#define IS_TEXT_UNICODE_CONTROLS 0x0004
#define IS_TEXT_UNICODE_REVERSE_CONTROLS 0x0040
#define IS_TEXT_UNICODE_SIGNATURE 0x0008
#define IS_TEXT_UNICODE_REVERSE_SIGNATURE 0x0080
#define IS_TEXT_UNICODE_ILLEGAL_CHARS 0x0100
#define IS_TEXT_UNICODE_ODD_LENGTH 0x0200
#define IS_TEXT_UNICODE_DBCS_LEADBYTE 0x0400
#define IS_TEXT_UNICODE_NULL_BYTES 0x1000
*//*
{
char szBuf[512];
wsprintf(szBuf,
"IS_TEXT_UNICODE_ASCII16\t\t\t%s\n"\
"IS_TEXT_UNICODE_REVERSE_ASCII16\t\t%s\n"\
"IS_TEXT_UNICODE_STATISTICS\t\t%s\n"\
"IS_TEXT_UNICODE_REVERSE_STATISTICS\t%s\n"\
"IS_TEXT_UNICODE_CONTROLS\t\t%s\n"\
"IS_TEXT_UNICODE_REVERSE_CONTROLS\t%s\n"\
"IS_TEXT_UNICODE_SIGNATURE\t\t%s\n"\
"IS_TEXT_UNICODE_REVERSE_SIGNATURE\t%s\n"\
"IS_TEXT_UNICODE_ILLEGAL_CHARS\t\t%s\n"\
"IS_TEXT_UNICODE_ODD_LENGTH\t\t%s\n"\
"IS_TEXT_UNICODE_DBCS_LEADBYTE\t\t%s\n"\
"IS_TEXT_UNICODE_NULL_BYTES\t\t%s\n\n"\
"bIsTextUnicode\t\t\t\t%i\n\n"\
"bHasBOM\t\t\t\t\t%i\n"\
"bHasRBOM\t\t\t\t%i",
i & IS_TEXT_UNICODE_ASCII16 ? "1" :"-",
i & IS_TEXT_UNICODE_REVERSE_ASCII16 ? "1" :"-",
i & IS_TEXT_UNICODE_STATISTICS ? "1" :"-",
i & IS_TEXT_UNICODE_REVERSE_STATISTICS ? "1" :"-",
i & IS_TEXT_UNICODE_CONTROLS ? "1" :"-",
i & IS_TEXT_UNICODE_REVERSE_CONTROLS ? "1" :"-",
i & IS_TEXT_UNICODE_SIGNATURE ? "1" :"-",
i & IS_TEXT_UNICODE_REVERSE_SIGNATURE ? "1" :"-",
i & IS_TEXT_UNICODE_ILLEGAL_CHARS ? "1" :"-",
i & IS_TEXT_UNICODE_ODD_LENGTH ? "1" :"-",
i & IS_TEXT_UNICODE_DBCS_LEADBYTE ? "1" :"-",
i & IS_TEXT_UNICODE_NULL_BYTES ? "1" :"-",
bIsTextUnicode,bHasBOM,bHasRBOM);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -