|
|
//========= 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
|