You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
438 lines
7.7 KiB
438 lines
7.7 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#ifndef RICHEDITCTRLEX_H |
|
#define RICHEDITCTRLEX_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#pragma warning(push, 1) |
|
#include <list> |
|
#include <stack> |
|
#pragma warning(pop) |
|
|
|
using namespace std; |
|
#pragma warning(disable : 4786) |
|
|
|
|
|
#ifdef RICHED_IMPL |
|
#ifdef _AFXEXT |
|
#define RICHED_DECL __declspec(dllexport) |
|
#else |
|
#define RICHED_DECL |
|
#endif |
|
#else |
|
#ifdef _AFXEXT |
|
#define RICHED_DECL __declspec(dllimport) |
|
#else |
|
#define RICHED_DECL |
|
#endif//_AFXEXT |
|
#endif //RICHED_IMPL |
|
|
|
|
|
class CRTFBuilder; |
|
class CStringManip; |
|
class CIntManip; |
|
|
|
|
|
typedef CRTFBuilder &(*RTFSM_PFUNC) (CRTFBuilder &); |
|
typedef CRTFBuilder &(*RTFSM_STRINGPFUNC) (CRTFBuilder &, CString &); |
|
typedef CRTFBuilder &(*RTFSM_INTPFUNC) (CRTFBuilder &, int); |
|
typedef CRTFBuilder &(*RTFSM_BOOLPFUNC) (CRTFBuilder &, bool); |
|
typedef CRTFBuilder &(*RTFSM_CONTROLPFUNC) (CRTFBuilder &, CRichEditCtrl &); |
|
|
|
|
|
class CBoolString |
|
{ |
|
private: |
|
|
|
bool m_b; |
|
CString m_strOn; |
|
CString m_strOff; |
|
|
|
public: |
|
|
|
CBoolString(CString strOn, CString strOff = "") |
|
{ |
|
m_strOn = strOn; |
|
m_strOff = strOff; |
|
m_b = false; |
|
} |
|
|
|
void operator=(bool b) |
|
{ |
|
m_b = b; |
|
} |
|
|
|
operator CString() const |
|
{ |
|
return m_b ? m_strOn : m_strOff; |
|
} |
|
}; |
|
|
|
|
|
class CTextAttributes |
|
{ |
|
protected: |
|
|
|
int m_nFontSize; |
|
|
|
CBoolString m_bsBold; |
|
CBoolString m_bsUnderline; |
|
CBoolString m_bsItalic; |
|
CBoolString m_bsStrike; |
|
|
|
int m_nFontNumber; |
|
int m_nColorFground; |
|
int m_nColorBground; |
|
|
|
public: |
|
|
|
CTextAttributes() |
|
: m_bsBold("\\b") , |
|
m_bsUnderline("\\ul"), |
|
m_bsItalic("\\i"), |
|
m_bsStrike("\\strike") |
|
{ |
|
m_nColorBground = m_nColorFground = m_nFontNumber = m_nFontSize = 0; |
|
m_bsBold = false; |
|
} |
|
|
|
operator CString() const |
|
{ |
|
CString s; |
|
s.Format("\\plain%s%s%s%s\\f%d\\fs%d\\cb%d\\cf%d ", |
|
((CString)m_bsBold).GetBuffer(), |
|
((CString)m_bsUnderline).GetBuffer(), ((CString)m_bsItalic).GetBuffer(), ((CString)m_bsStrike).GetBuffer(), |
|
m_nFontNumber , |
|
m_nFontSize , |
|
m_nColorBground, |
|
m_nColorFground); |
|
return s; |
|
} |
|
|
|
friend class CRTFBuilder; |
|
}; |
|
|
|
|
|
|
|
class CFontList : public list<CString> |
|
{ |
|
public: |
|
|
|
operator CString() const |
|
{ |
|
CString s; |
|
s = "{\\fonttbl"; |
|
|
|
int nCount = 0; |
|
for (const_iterator i = begin(); i!=end(); i++) |
|
{ |
|
CString s2; |
|
s2.Format("{\\f%d %s;}", nCount++, (const char*)(*i)); |
|
s+=s2; |
|
} |
|
|
|
s+='}'; |
|
return s; |
|
} |
|
|
|
void add(const CString &s) |
|
{ |
|
push_back(s); |
|
} |
|
}; |
|
|
|
|
|
class CColorList : public list<COLORREF> |
|
{ |
|
public: |
|
|
|
int add(COLORREF c) |
|
{ |
|
push_back(c); |
|
return size() - 1; |
|
} |
|
|
|
int find(COLORREF c) |
|
{ |
|
int n = 0; |
|
for (iterator i = begin(); i != end(); i++, n++) |
|
{ |
|
COLORREF cComp(*i); |
|
if (cComp == c) |
|
{ |
|
return n; |
|
} |
|
} |
|
|
|
return -1; |
|
} |
|
|
|
|
|
operator CString() const |
|
{ |
|
CString s("{\\colortbl"); |
|
for (const_iterator i = begin(); i != end(); i++) |
|
{ |
|
COLORREF c(*i); |
|
int r((c & 0x000000ff)); |
|
int g((c >> 8) & 0x000000ff); |
|
int b((c >> 16) & 0x000000ff); |
|
|
|
CString s2; |
|
s2.Format("\\red%d\\green%d\\blue%d;", r, g, b); |
|
s += s2; |
|
} |
|
|
|
s += '}'; |
|
return s; |
|
} |
|
}; |
|
|
|
|
|
class RICHED_DECL CManip |
|
{ |
|
protected: |
|
|
|
CString m_strVal; |
|
int m_nVal; |
|
LPVOID m_pFunc; |
|
bool m_bVal; |
|
|
|
public: |
|
|
|
virtual CRTFBuilder &go(CRTFBuilder &) = 0; |
|
|
|
CManip() |
|
{ |
|
m_pFunc = NULL; |
|
m_nVal = 0; |
|
m_strVal = ""; |
|
} |
|
|
|
CManip(LPVOID p, CString s) |
|
{ |
|
m_pFunc = p; |
|
m_strVal = s; |
|
} |
|
|
|
CManip(LPVOID p, int n) |
|
{ |
|
m_pFunc = p; |
|
m_nVal = n; |
|
} |
|
|
|
CManip(LPVOID p, bool b) |
|
{ |
|
m_pFunc = p; |
|
m_bVal = b; |
|
} |
|
}; |
|
|
|
|
|
class RICHED_DECL CStringManip : public CManip |
|
{ |
|
public: |
|
|
|
CStringManip(RTFSM_STRINGPFUNC p, CString s = "") : CManip ((LPVOID)p, s) {}; |
|
|
|
CRTFBuilder &go(CRTFBuilder &b) |
|
{ |
|
return((RTFSM_STRINGPFUNC)m_pFunc) (b, m_strVal); |
|
} |
|
}; |
|
|
|
|
|
class RICHED_DECL CControlManip : public CManip |
|
{ |
|
protected: |
|
|
|
CRichEditCtrl &m_control; |
|
|
|
public: |
|
|
|
CControlManip(RTFSM_CONTROLPFUNC p, CRichEditCtrl& c) : m_control(c), CManip((LPVOID)p, (CString)"") {}; |
|
|
|
CRTFBuilder &go(CRTFBuilder &b) |
|
{ |
|
return((RTFSM_CONTROLPFUNC)m_pFunc)(b, m_control); |
|
} |
|
}; |
|
|
|
|
|
class RICHED_DECL CIntManip : public CManip |
|
{ |
|
public: |
|
|
|
CIntManip(RTFSM_INTPFUNC p, int n = 0) : CManip ((LPVOID)p, n) {}; |
|
|
|
CRTFBuilder &go(CRTFBuilder &b) |
|
{ |
|
return((RTFSM_INTPFUNC)m_pFunc)(b, m_nVal); |
|
} |
|
}; |
|
|
|
|
|
class RICHED_DECL CBoolManip : public CManip |
|
{ |
|
public: |
|
|
|
CBoolManip(RTFSM_BOOLPFUNC p, bool b) : CManip((LPVOID)p, b) {}; |
|
|
|
CRTFBuilder &go(CRTFBuilder &b) |
|
{ |
|
return ((RTFSM_BOOLPFUNC ) m_pFunc)( b, m_bVal); |
|
} |
|
}; |
|
|
|
|
|
class RICHED_DECL CRTFBuilder |
|
{ |
|
protected: |
|
|
|
CString m_string; |
|
CTextAttributes m_attr; |
|
CFontList m_fontList; |
|
CColorList m_colorList; |
|
stack<CTextAttributes> m_attrStack; |
|
|
|
public: |
|
|
|
void bold (bool b = true); |
|
void strike(bool b = true); |
|
void italic(bool b = true); |
|
void underline(bool b = true); |
|
void normal(); |
|
void size(int n); |
|
void font(const CString &i); |
|
void black(); |
|
void blue(); |
|
void green(); |
|
void red(); |
|
void color(COLORREF); |
|
void backColor(COLORREF); |
|
|
|
void push(); |
|
void pop(); |
|
|
|
CRTFBuilder &operator+=(CString &s); |
|
CRTFBuilder(); |
|
virtual ~CRTFBuilder(); |
|
|
|
void addFont(const CString &s) |
|
{ |
|
m_fontList.add(s); |
|
} |
|
|
|
void addColor(COLORREF c) |
|
{ |
|
m_colorList.add(c); |
|
} |
|
|
|
|
|
CRTFBuilder & operator+=(LPCTSTR p); |
|
|
|
operator CString() const |
|
{ |
|
return m_string; |
|
} |
|
|
|
void write(CRichEditCtrl &); |
|
|
|
int colorCount() const |
|
{ |
|
return m_colorList.size(); |
|
} |
|
|
|
public: |
|
|
|
CRTFBuilder & operator<<(LPCTSTR); |
|
CRTFBuilder & operator<<(int); |
|
CRTFBuilder & operator>>(CRichEditCtrl &); |
|
|
|
friend RICHED_DECL CRTFBuilder &normal(CRTFBuilder &); |
|
friend RICHED_DECL CRTFBuilder &push(CRTFBuilder&); |
|
friend RICHED_DECL CRTFBuilder &pop(CRTFBuilder &); |
|
friend RICHED_DECL CRTFBuilder &black(CRTFBuilder &); |
|
friend RICHED_DECL CRTFBuilder &red(CRTFBuilder &); |
|
friend RICHED_DECL CRTFBuilder &green(CRTFBuilder &); |
|
friend RICHED_DECL CRTFBuilder &blue(CRTFBuilder &); |
|
friend RICHED_DECL CRTFBuilder &bold(CRTFBuilder &); |
|
friend RICHED_DECL CRTFBuilder &strike(CRTFBuilder &); |
|
friend RICHED_DECL CRTFBuilder &italic(CRTFBuilder &); |
|
friend RICHED_DECL CRTFBuilder &underline(CRTFBuilder &); |
|
}; |
|
|
|
|
|
RICHED_DECL CControlManip write (CRichEditCtrl &); |
|
RICHED_DECL CIntManip normal (int = 0); |
|
RICHED_DECL CIntManip push (int = 0); |
|
RICHED_DECL CIntManip pop (int = 0); |
|
RICHED_DECL CIntManip size (int); |
|
RICHED_DECL CIntManip color (int); |
|
RICHED_DECL CIntManip backColor (int); |
|
RICHED_DECL CIntManip addColor (int); |
|
RICHED_DECL CIntManip font (int); |
|
RICHED_DECL CStringManip font (LPCTSTR); |
|
RICHED_DECL CStringManip addFont (LPCTSTR); |
|
RICHED_DECL CBoolManip bold (bool); |
|
RICHED_DECL CBoolManip strike (bool); |
|
RICHED_DECL CBoolManip italic (bool); |
|
RICHED_DECL CBoolManip underline (bool); |
|
|
|
RICHED_DECL CRTFBuilder & operator<<(CRTFBuilder &, RTFSM_PFUNC); |
|
RICHED_DECL CRTFBuilder & operator<<(CRTFBuilder &, CManip & m); |
|
|
|
|
|
class RICHED_DECL CRichEditCtrlEx : public CRichEditCtrl |
|
{ |
|
public: |
|
|
|
// Construction |
|
CRichEditCtrlEx(); |
|
|
|
public: |
|
|
|
void enable(bool b = true) |
|
{ |
|
ModifyStyle(b ? WS_DISABLED : 0, b ? 0 : WS_DISABLED, 0); |
|
} |
|
|
|
void disable(bool b = true) |
|
{ |
|
enable(!b); |
|
} |
|
|
|
void readOnly(bool b = true) |
|
{ |
|
SetReadOnly(b); |
|
} |
|
|
|
void writable(bool b = true) |
|
{ |
|
readOnly(!b); |
|
} |
|
|
|
// ClassWizard generated virtual function overrides |
|
//{{AFX_VIRTUAL(CRichEditCtrlEx) |
|
protected: |
|
virtual void PreSubclassWindow(); |
|
//}}AFX_VIRTUAL |
|
|
|
public: |
|
virtual ~CRichEditCtrlEx(); |
|
|
|
protected: |
|
//{{AFX_MSG(CRichEditCtrlEx) |
|
//}}AFX_MSG |
|
|
|
DECLARE_MESSAGE_MAP() |
|
}; |
|
|
|
#endif // RICHEDITCTRLEX_H
|
|
|