xref: /MusicPlayer2/MusicPlayer2/ScintillaEditView.h (revision 6060ad5185b70f10cb5eef3b975ec4a101ff4d89)
18af74909SZhong Yang #pragma once
28af74909SZhong Yang 
38af74909SZhong Yang #include "../scintilla/include/SciLexer.h"
48af74909SZhong Yang #include "../scintilla/include/Scintilla.h"
50831e654SZhong Yang #include "ColorConvert.h"
68af74909SZhong Yang 
78af74909SZhong Yang // CScintillaEditView 视图
88af74909SZhong Yang 
98af74909SZhong Yang #define SCINTILLA_MARGIN_LINENUMBER 0
108af74909SZhong Yang #define MARGIN_FOLD_INDEX 1
118af74909SZhong Yang 
128af74909SZhong Yang class CScintillaEditView : public CView
138af74909SZhong Yang {
148af74909SZhong Yang 	DECLARE_DYNCREATE(CScintillaEditView)
158af74909SZhong Yang 
168af74909SZhong Yang protected:
178af74909SZhong Yang 	CScintillaEditView();           // 动态创建所使用的受保护的构造函数
188af74909SZhong Yang 	virtual ~CScintillaEditView();
198af74909SZhong Yang 
208af74909SZhong Yang public:
218af74909SZhong Yang     struct KeepCurrentLine
228af74909SZhong Yang     {
KeepCurrentLineKeepCurrentLine238af74909SZhong Yang         KeepCurrentLine(CScintillaEditView* view)
248af74909SZhong Yang             : m_view(view)
258af74909SZhong Yang         {
268af74909SZhong Yang             //保存当前行
278af74909SZhong Yang             current_line = m_view->GetFirstVisibleLine();
288af74909SZhong Yang         }
~KeepCurrentLineKeepCurrentLine298af74909SZhong Yang         ~KeepCurrentLine()
308af74909SZhong Yang         {
318af74909SZhong Yang             //恢复当前行
328af74909SZhong Yang             m_view->SetFirstVisibleLine(current_line);
338af74909SZhong Yang         }
348af74909SZhong Yang 
358af74909SZhong Yang         CScintillaEditView* m_view{};
368af74909SZhong Yang         int current_line{};
378af74909SZhong Yang     };
388af74909SZhong Yang 
398af74909SZhong Yang 	virtual void OnDraw(CDC* pDC);      // 重写以绘制该视图
408af74909SZhong Yang #ifdef _DEBUG
418af74909SZhong Yang 	virtual void AssertValid() const;
428af74909SZhong Yang #ifndef _WIN32_WCE
438af74909SZhong Yang 	virtual void Dump(CDumpContext& dc) const;
448af74909SZhong Yang #endif
458af74909SZhong Yang #endif
468af74909SZhong Yang 
47fa103b8dSZhong Yang     void SetTextW(const wstring& text);
48fa103b8dSZhong Yang     void GetTextW(wstring& text);
49fa103b8dSZhong Yang     const wchar_t* GetTextW(int& size);      //获取文本(返回字符串指针,需要自行释放内存)
50fa103b8dSZhong Yang     const char* GetText(int& size);      //获取UTF8格式文本(返回字符串指针,需要自行释放内存)
51fa103b8dSZhong Yang     std::string GetText(int start, int end);
528af74909SZhong Yang     void SetFontFace(const wchar_t* font_face);
538af74909SZhong Yang     void SetFontSize(int font_size);
548af74909SZhong Yang     void SetTabSize(int tab_size);
558af74909SZhong Yang     void SetSel(int start, int end, const wstring& edit_str);        //设置选中范围(位置以字符为单位)
568af74909SZhong Yang     void GetSel(int& start, int& end);      //获取选中范围(位置以字符为单位)
578af74909SZhong Yang     void SetBackgroundColor(COLORREF color);
588af74909SZhong Yang     void SetReadOnly(bool read_only);
598af74909SZhong Yang     bool IsReadOnly();
608af74909SZhong Yang 
618af74909SZhong Yang     void Undo();
628af74909SZhong Yang     void Redo();
638af74909SZhong Yang     void Cut();
648af74909SZhong Yang     void Copy();
658af74909SZhong Yang     void Paste();
668af74909SZhong Yang     void SelectAll();
678af74909SZhong Yang     void EmptyUndoBuffer();     //清空撤销缓存
688af74909SZhong Yang 
698af74909SZhong Yang     void SetWordWrap(bool word_wrap);
708af74909SZhong Yang 
718af74909SZhong Yang     bool IsEditChangeNotificationEnable();
728af74909SZhong Yang 
738af74909SZhong Yang     bool CanUndo();
748af74909SZhong Yang     bool CanRedo();
758af74909SZhong Yang     bool CanPaste();
768af74909SZhong Yang     bool IsSelectionEmpty();
778af74909SZhong Yang     bool IsModified();
788af74909SZhong Yang     void SetSavePoint();
798af74909SZhong Yang 
808af74909SZhong Yang     void SetLineNumberWidth(int width);
818af74909SZhong Yang     void ShowLineNumber(bool show);
828af74909SZhong Yang     void SetLineNumberColor(COLORREF color);
838af74909SZhong Yang 
848af74909SZhong Yang     int GetZoom();
858af74909SZhong Yang     void SetZoom(int zoom);
868af74909SZhong Yang 
878af74909SZhong Yang     enum eEolMode
888af74909SZhong Yang     {
898af74909SZhong Yang         EOL_CRLF,
908af74909SZhong Yang         EOL_CR,
918af74909SZhong Yang         EOL_LF
928af74909SZhong Yang     };
938af74909SZhong Yang     void SetEolMode(eEolMode eolMode);
948af74909SZhong Yang     eEolMode GetEolMode();
958af74909SZhong Yang 
968af74909SZhong Yang     void ConvertEolMode(eEolMode eolMode);
978af74909SZhong Yang 
988af74909SZhong Yang     void SetViewEol(bool show);
998af74909SZhong Yang 
1008af74909SZhong Yang     int GetFirstVisibleLine();
1018af74909SZhong Yang     void SetFirstVisibleLine(int line);
1028af74909SZhong Yang 
1038af74909SZhong Yang     //语法解析
1048af74909SZhong Yang     void SetLexer(int lexer);
1058af74909SZhong Yang     void SetKeywords(int id, const char* keywords);
1068af74909SZhong Yang     void SetSyntaxColor(int id, COLORREF color);
1078af74909SZhong Yang     void SetSyntaxFontStyle(int id, bool bold, bool italic);
1088af74909SZhong Yang     void SetLexerNormalText();
1098af74909SZhong Yang 
1108af74909SZhong Yang     static eEolMode JudgeEolMode(const wstring& str);
1118af74909SZhong Yang     static int CharactorPosToBytePos(int pos, const wchar_t* str, size_t size);     //将字符的位置转换成字节的位置(使用UTF8编码)
1128af74909SZhong Yang     static int BytePosToCharactorPos(int pos, const char* str, size_t size);     //将字节的位置转换成字符的位置(使用UTF8编码)
1138af74909SZhong Yang 
1148af74909SZhong Yang     void SetContextMenu(CMenu* pMenu, CWnd* pMenuOwner);
1158af74909SZhong Yang 
116fa103b8dSZhong Yang     void GetLinePos(int line, int& start, int& end);        //获取某一行的开始和结束位置
117fa103b8dSZhong Yang     void GetCurLinePos(int& start, int& end);               //获取当前行的开始和结束位置
118fa103b8dSZhong Yang 
1190831e654SZhong Yang     void SetLexerLyric(ColorTable theme_color);       //设置LRC语法解析
12061ef93eeSZhong Yang 
121fa103b8dSZhong Yang     std::string GetCurrentLineText();
122fa103b8dSZhong Yang     std::wstring GetCurrentLineTextW();
123fa103b8dSZhong Yang 
1248af74909SZhong Yang private:
1258af74909SZhong Yang 
1268af74909SZhong Yang private:
1278af74909SZhong Yang     bool m_change_notification_enable = true;      //如果为false,则不响应文本改变消息
1288af74909SZhong Yang     int m_line_number_width = 36;
1298af74909SZhong Yang     COLORREF m_line_number_color{};
1308af74909SZhong Yang     COLORREF m_background_color{ RGB(255,255,255) };
1318af74909SZhong Yang 
1328af74909SZhong Yang     CMenu* m_pMenu{};
1338af74909SZhong Yang     CWnd* m_pContextMenuOwner{};
1348af74909SZhong Yang 
1358af74909SZhong Yang protected:
1368af74909SZhong Yang 	DECLARE_MESSAGE_MAP()
1378af74909SZhong Yang     virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
1388af74909SZhong Yang public:
1398af74909SZhong Yang     afx_msg void OnPaint();
1408af74909SZhong Yang     virtual void PreSubclassWindow();
1418af74909SZhong Yang     virtual void OnInitialUpdate();
1428af74909SZhong Yang     afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
143*6060ad51Szhongyang219 protected:
144*6060ad51Szhongyang219     afx_msg LRESULT OnTabletQuerysystemgesturestatus(WPARAM wParam, LPARAM lParam);
1458af74909SZhong Yang };
1468af74909SZhong Yang 
1478af74909SZhong Yang 
148