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

📄 edit.c

📁 C语言编程中算法数据结构中的树行代码
💻 C
📖 第 1 页 / 共 3 页
字号:
/******************************************************************************
*
*
* 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 + -