Extended wxTextAttr and added wxTextCtrl::GetStyle stub
allow better rich text support. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@21272 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
f22c3c98a0
commit
e00a5d3ca1
@ -50,8 +50,8 @@ No base class
|
||||
|
||||
\wxheading{Constants}
|
||||
|
||||
These flags define what kind of filenames is included in the list of files
|
||||
enumerated by GetFirst/GetNext
|
||||
These flags define what kind of filename is included in the list of files
|
||||
enumerated by GetFirst/GetNext.
|
||||
|
||||
{\small
|
||||
\begin{verbatim}
|
||||
|
@ -2,9 +2,13 @@
|
||||
|
||||
\section{\class{wxTextAttr}}\label{wxtextattr}
|
||||
|
||||
wxTextAttr represents the attributes, or style, for a range of text in a\rtfsp
|
||||
wxTextAttr represents the character and paragraph attributes, or style, for a range of text in a\rtfsp
|
||||
\helpref{wxTextCtrl}{wxtextctrl}.
|
||||
|
||||
When setting up a wxTextAttr object, pass a bitlist mask to SetFlags to indicate
|
||||
which style elements should be changed. As a convenience, when you call a
|
||||
setter such as SetFont, the relevant bit will be set.
|
||||
|
||||
\wxheading{Derived from}
|
||||
|
||||
No base class
|
||||
@ -13,61 +17,185 @@ No base class
|
||||
|
||||
<wx/textctrl.h>
|
||||
|
||||
\wxheading{Constants}
|
||||
|
||||
The following values can be passed to SetAlignment to determine
|
||||
paragraph alignment.
|
||||
|
||||
{\small
|
||||
\begin{verbatim}
|
||||
enum wxTextAttrAlignment
|
||||
{
|
||||
wxTEXT_ALIGNMENT_DEFAULT,
|
||||
wxTEXT_ALIGNMENT_LEFT,
|
||||
wxTEXT_ALIGNMENT_CENTRE,
|
||||
wxTEXT_ALIGNMENT_CENTER = wxTEXT_ALIGNMENT_CENTRE,
|
||||
wxTEXT_ALIGNMENT_RIGHT,
|
||||
wxTEXT_ALIGNMENT_JUSTIFIED
|
||||
};
|
||||
\end{verbatim}
|
||||
}
|
||||
|
||||
These values are passed in a bitlist to SetFlags to determine
|
||||
what attributes will be considered when setting the attributes
|
||||
for a text control.
|
||||
|
||||
{\small
|
||||
\begin{verbatim}
|
||||
#define wxTEXT_ATTR_TEXT_COLOUR 0x0001
|
||||
#define wxTEXT_ATTR_BACKGROUND_COLOUR 0x0002
|
||||
#define wxTEXT_ATTR_FONT_FACE 0x0004
|
||||
#define wxTEXT_ATTR_FONT_SIZE 0x0008
|
||||
#define wxTEXT_ATTR_FONT_WEIGHT 0x0010
|
||||
#define wxTEXT_ATTR_FONT_ITALIC 0x0020
|
||||
#define wxTEXT_ATTR_FONT_UNDERLINE 0x0040
|
||||
#define wxTEXT_ATTR_FONT \
|
||||
wxTEXT_ATTR_FONT_FACE | wxTEXT_ATTR_FONT_SIZE | wxTEXT_ATTR_FONT_WEIGHT \
|
||||
| wxTEXT_ATTR_FONT_ITALIC | wxTEXT_ATTR_FONT_UNDERLINE
|
||||
#define wxTEXT_ATTR_ALIGNMENT 0x0080
|
||||
#define wxTEXT_ATTR_LEFT_INDENT 0x0100
|
||||
#define wxTEXT_ATTR_RIGHT_INDENT 0x0200
|
||||
#define wxTEXT_ATTR_TABS 0x0400
|
||||
\end{verbatim}
|
||||
}
|
||||
|
||||
\latexignore{\rtfignore{\wxheading{Members}}}
|
||||
|
||||
\membersection{wxTextAttr::wxTextAttr}\label{wxtextattrctor}
|
||||
|
||||
\func{}{wxTextAttr}{\void}
|
||||
|
||||
\func{}{wxTextAttr}{\param{const wxColour\& }{colText}, \param{const wxColour\& }{colBack = wxNullColour}, \param{const wxFont\& }{font = wxNullFont}}
|
||||
\func{}{wxTextAttr}{\param{const wxColour\& }{colText}, \param{const wxColour\& }{colBack = wxNullColour},
|
||||
\param{const wxFont\& }{font = wxNullFont}, \param{wxTextAttrAlignment }{alignment = wxTEXT\_ALIGNMENT\_DEFAULT}}
|
||||
|
||||
The constructors initialize one or more of the text foreground and background
|
||||
colours and font. The values not initialized in the constructor can be set
|
||||
The constructors initialize one or more of the text foreground colour, background
|
||||
colour, font, and alignment. The values not initialized in the constructor can be set
|
||||
later, otherwise \helpref{wxTextCtrl::SetStyle}{wxtextctrlsetstyle} will use
|
||||
the default values for them.
|
||||
|
||||
\membersection{wxTextAttr::GetBackgroundColour}
|
||||
\membersection{wxTextAttr::GetAlignment}\label{wxtextattrgetalignment}
|
||||
|
||||
\constfunc{wxTextAttrAlignment}{GetAlignment}{\void}
|
||||
|
||||
Returns the paragraph alignment.
|
||||
|
||||
\membersection{wxTextAttr::GetBackgroundColour}\label{wxtextattrgetbackgroundcolour}
|
||||
|
||||
\constfunc{const wxColour\&}{GetBackgroundColour}{\void}
|
||||
|
||||
Return the background colour specified by this attribute.
|
||||
|
||||
\membersection{wxTextAttr::GetFont}
|
||||
\membersection{wxTextAttr::GetFont}\label{wxtextattrgetfont}
|
||||
|
||||
\constfunc{const wxFont\&}{GetFont}{\void}
|
||||
|
||||
Return the text font specified by this attribute.
|
||||
|
||||
\membersection{wxTextAttr::GetTextColour}
|
||||
\membersection{wxTextAttr::GetLeftIndent}\label{wxtextattrgetleftindent}
|
||||
|
||||
\constfunc{int}{GetLeftIndent}{\void}
|
||||
|
||||
Returns the left indent in tenths of a millimetre.
|
||||
|
||||
\membersection{wxTextAttr::GetRightIndent}\label{wxtextattrgetrightindent}
|
||||
|
||||
\constfunc{int}{GetRightIndent}{\void}
|
||||
|
||||
Returns the right indent in tenths of a millimetre.
|
||||
|
||||
\membersection{wxTextAttr::GetTabs}\label{wxtextattrgettabs}
|
||||
|
||||
\constfunc{const wxArrayInt\&}{GetTabs}{\void}
|
||||
|
||||
Returns the array of integers representing the tab stops. Each
|
||||
array element specifies the tab stop in tenths of a millimetre.
|
||||
|
||||
\membersection{wxTextAttr::GetTextColour}\label{wxtextattrgettextcolour}
|
||||
|
||||
\constfunc{const wxColour\&}{GetTextColour}{\void}
|
||||
|
||||
Return the text colour specified by this attribute.
|
||||
|
||||
\membersection{wxTextAttr::HasBackgroundColour}
|
||||
\membersection{wxTextAttr::HasBackgroundColour}\label{wxtextattrhasbackgroundcolour}
|
||||
|
||||
\constfunc{bool}{HasBackgroundColour}{\void}
|
||||
|
||||
Returns {\tt true} if this style specifies the background colour to use.
|
||||
|
||||
\membersection{wxTextAttr::HasFont}
|
||||
\membersection{wxTextAttr::HasFont}\label{wxtextattrhasfont}
|
||||
|
||||
\constfunc{bool}{HasFont}{\void}
|
||||
|
||||
Returns {\tt true} if this style specifies the font to use.
|
||||
|
||||
\membersection{wxTextAttr::HasTextColour}
|
||||
\membersection{wxTextAttr::HasTextColour}\label{wxtextattrhastextcolour}
|
||||
|
||||
\constfunc{bool}{HasTextColour}{\void}
|
||||
|
||||
Returns {\tt true} if this style specifies the foreground colour to use.
|
||||
|
||||
\membersection{wxTextAttr::IsDefault}
|
||||
\membersection{wxTextAttr::GetFlags}\label{wxtextattrgetflags}
|
||||
|
||||
\func{long}{GetFlags}{\void}
|
||||
|
||||
Returns a bitlist indicating which attributes will be set.
|
||||
|
||||
\membersection{wxTextAttr::IsDefault}\label{wxtextattrisdefault}
|
||||
|
||||
\constfunc{bool}{IsDefault}{\void}
|
||||
|
||||
Returns {\tt true} if this style specifies any non-default attributes.
|
||||
|
||||
\membersection{wxTextAttr::SetAlignment}\label{wxtextattrsetalignment}
|
||||
|
||||
\func{void}{SetAlignment}{\param{wxTextAttrAlignment}{ alignment}}
|
||||
|
||||
Sets the paragraph alignment.
|
||||
|
||||
\membersection{wxTextAttr::SetBackgroundColour}\label{wxtextattrsetbackgroundcolour}
|
||||
|
||||
\func{void}{SetBackgroundColour}{\param{const wxColour\& }{colour}}
|
||||
|
||||
Sets the background colour.
|
||||
|
||||
\membersection{wxTextAttr::SetFlags}\label{wxtextattrsetflags}
|
||||
|
||||
\func{void}{SetFlags}{\param{long}{ flags}}
|
||||
|
||||
Pass a bitlist indicating which attributes will be set.
|
||||
|
||||
\membersection{wxTextAttr::SetFont}\label{wxtextattrsetfont}
|
||||
|
||||
\func{void}{SetFont}{\param{const wxFont\&}{ font}}
|
||||
|
||||
Sets the text font.
|
||||
|
||||
\membersection{wxTextAttr::SetLeftIndent}\label{wxtextattrsetleftindent}
|
||||
|
||||
\func{void}{SetLeftIndent}{\param{int }{indent}}
|
||||
|
||||
Sets the left indent in tenths of a millimetre.
|
||||
|
||||
\membersection{wxTextAttr::SetRightIndent}\label{wxtextattrsetrightindent}
|
||||
|
||||
\func{void}{SetRightIndent}{\param{int }{indent}}
|
||||
|
||||
Sets the right indent in tenths of a millimetre.
|
||||
|
||||
\membersection{wxTextAttr::SetTabs}\label{wxtextattrsettabs}
|
||||
|
||||
\func{void}{SetTabs}{\param{const wxArrayInt\&}{ tabs}}
|
||||
|
||||
Sets the array of integers representing the tab stops. Each
|
||||
array element specifies the tab stop in tenths of a millimetre.
|
||||
|
||||
\membersection{wxTextAttr::SetTextColour}\label{wxtextattrsettextcolour}
|
||||
|
||||
\func{void}{SetTextColour}{\param{const wxColour\& }{colour}}
|
||||
|
||||
Sets the text colour.
|
||||
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%% wxTextCtrl %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
\section{\class{wxTextCtrl}}\label{wxtextctrl}
|
||||
@ -576,6 +704,22 @@ consisting of the from and to values.}
|
||||
Gets the text currently selected in the control. If there is no selection, the
|
||||
returned string is empty.
|
||||
|
||||
\membersection{wxTextCtrl::GetStyle}\label{wxtextctrlgetstyle}
|
||||
|
||||
\func{bool}{GetStyle}{\param{long }{position}, \param{wxTextAttr\& }{style}}
|
||||
|
||||
Returns the style at this position in the text control. Not all platforms
|
||||
support this function.
|
||||
|
||||
\wxheading{Return value}
|
||||
|
||||
{\tt true} on success, {\tt false} if an error occured - it may also mean that
|
||||
the styles are not supported under this platform.
|
||||
|
||||
\wxheading{See also}
|
||||
|
||||
\helpref{wxTextCtrl::SetStyle}{wxtextctrlsetstyle}, \helpref{wxTextAttr}{wxtextattr}
|
||||
|
||||
\membersection{wxTextCtrl::GetValue}\label{wxtextctrlgetvalue}
|
||||
|
||||
\constfunc{wxString}{GetValue}{\void}
|
||||
@ -874,23 +1018,26 @@ in the control is selected.
|
||||
|
||||
\func{bool}{SetStyle}{\param{long }{start}, \param{long }{end}, \param{const wxTextAttr\& }{style}}
|
||||
|
||||
Changes the style of the selection. If either of the font, foreground, or
|
||||
background colour is not set in {\it style}, the values of\rtfsp
|
||||
\helpref{GetDefaultStyle()}{wxtextctrlgetdefaultstyle} are used.
|
||||
Changes the style of the given range. If any attribute within {\it style} is
|
||||
not set, the correspondign attribute from \helpref{GetDefaultStyle()}{wxtextctrlgetdefaultstyle} is used.
|
||||
|
||||
\wxheading{Parameters}
|
||||
|
||||
\docparam{start}{The start of selection to change.}
|
||||
\docparam{start}{The start of the range to change.}
|
||||
|
||||
\docparam{end}{The end of selection to change.}
|
||||
\docparam{end}{The end of the range to change.}
|
||||
|
||||
\docparam{style}{The new style for the selection.}
|
||||
\docparam{style}{The new style for the range.}
|
||||
|
||||
\wxheading{Return value}
|
||||
|
||||
{\tt true} on success, {\tt false} if an error occured - may also mean that
|
||||
{\tt true} on success, {\tt false} if an error occured - it may also mean that
|
||||
the styles are not supported under this platform.
|
||||
|
||||
\wxheading{See also}
|
||||
|
||||
\helpref{wxTextCtrl::GetStyle}{wxtextctrlgetstyle}, \helpref{wxTextAttr}{wxtextattr}
|
||||
|
||||
\membersection{wxTextCtrl::SetValue}\label{wxtextctrlsetvalue}
|
||||
|
||||
\func{virtual void}{SetValue}{\param{const wxString\& }{ value}}
|
||||
|
@ -349,7 +349,7 @@ public:
|
||||
|
||||
// Operations
|
||||
|
||||
// Each wxAccessible implementation must define this
|
||||
// Each platform's implementation must define this
|
||||
// static void NotifyEvent(int eventType, wxWindow* window, wxAccObject objectType,
|
||||
// int objectId);
|
||||
|
||||
|
@ -92,6 +92,7 @@ public:
|
||||
// controls)
|
||||
virtual bool SetStyle(long start, long end, const wxTextAttr& style);
|
||||
virtual bool SetDefaultStyle(const wxTextAttr& style);
|
||||
virtual bool GetStyle(long position, wxTextAttr& style);
|
||||
#endif // wxUSE_RICHEDIT
|
||||
|
||||
// translate between the position (which is just an index in the text ctrl
|
||||
|
@ -25,6 +25,7 @@
|
||||
#if wxUSE_TEXTCTRL
|
||||
|
||||
#include "wx/control.h" // the base class
|
||||
#include "wx/dynarray.h"
|
||||
|
||||
// 16-bit Borland 4.0 doesn't seem to allow multiple inheritance with wxWindow
|
||||
// and streambuf: it complains about deriving a huge class from the huge class
|
||||
@ -102,6 +103,38 @@ WXDLLEXPORT_DATA(extern const wxChar*) wxEmptyString;
|
||||
// wxTE_RICH controls - can be used together with or instead of wxTE_RICH
|
||||
#define wxTE_RICH2 0x8000
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Types for wxTextAttr
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// Alignment
|
||||
|
||||
enum wxTextAttrAlignment
|
||||
{
|
||||
wxTEXT_ALIGNMENT_DEFAULT,
|
||||
wxTEXT_ALIGNMENT_LEFT,
|
||||
wxTEXT_ALIGNMENT_CENTRE,
|
||||
wxTEXT_ALIGNMENT_CENTER = wxTEXT_ALIGNMENT_CENTRE,
|
||||
wxTEXT_ALIGNMENT_RIGHT,
|
||||
wxTEXT_ALIGNMENT_JUSTIFIED
|
||||
};
|
||||
|
||||
// Flags to indicate which attributes are being applied
|
||||
|
||||
#define wxTEXT_ATTR_TEXT_COLOUR 0x0001
|
||||
#define wxTEXT_ATTR_BACKGROUND_COLOUR 0x0002
|
||||
#define wxTEXT_ATTR_FONT_FACE 0x0004
|
||||
#define wxTEXT_ATTR_FONT_SIZE 0x0008
|
||||
#define wxTEXT_ATTR_FONT_WEIGHT 0x0010
|
||||
#define wxTEXT_ATTR_FONT_ITALIC 0x0020
|
||||
#define wxTEXT_ATTR_FONT_UNDERLINE 0x0040
|
||||
#define wxTEXT_ATTR_FONT \
|
||||
wxTEXT_ATTR_FONT_FACE | wxTEXT_ATTR_FONT_SIZE | wxTEXT_ATTR_FONT_WEIGHT | wxTEXT_ATTR_FONT_ITALIC | wxTEXT_ATTR_FONT_UNDERLINE
|
||||
#define wxTEXT_ATTR_ALIGNMENT 0x0080
|
||||
#define wxTEXT_ATTR_LEFT_INDENT 0x0100
|
||||
#define wxTEXT_ATTR_RIGHT_INDENT 0x0200
|
||||
#define wxTEXT_ATTR_TABS 0x0400
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxTextAttr: a structure containing the visual attributes of a text
|
||||
// ----------------------------------------------------------------------------
|
||||
@ -110,31 +143,52 @@ class WXDLLEXPORT wxTextAttr
|
||||
{
|
||||
public:
|
||||
// ctors
|
||||
wxTextAttr() { }
|
||||
wxTextAttr() { Init(); }
|
||||
wxTextAttr(const wxColour& colText,
|
||||
const wxColour& colBack = wxNullColour,
|
||||
const wxFont& font = wxNullFont)
|
||||
: m_colText(colText), m_colBack(colBack), m_font(font) { }
|
||||
const wxFont& font = wxNullFont,
|
||||
wxTextAttrAlignment alignment = wxTEXT_ALIGNMENT_DEFAULT);
|
||||
|
||||
// operations
|
||||
void Init();
|
||||
|
||||
// operators
|
||||
void operator= (const wxTextAttr& attr);
|
||||
|
||||
// setters
|
||||
void SetTextColour(const wxColour& colText) { m_colText = colText; }
|
||||
void SetBackgroundColour(const wxColour& colBack) { m_colBack = colBack; }
|
||||
void SetFont(const wxFont& font) { m_font = font; }
|
||||
void SetTextColour(const wxColour& colText) { m_colText = colText; m_flags |= wxTEXT_ATTR_TEXT_COLOUR; }
|
||||
void SetBackgroundColour(const wxColour& colBack) { m_colBack = colBack; m_flags |= wxTEXT_ATTR_BACKGROUND_COLOUR; }
|
||||
void SetFont(const wxFont& font, long flags = wxTEXT_ATTR_FONT) { m_font = font; m_flags |= flags; }
|
||||
void SetAlignment(wxTextAttrAlignment alignment) { m_textAlignment = alignment; m_flags |= wxTEXT_ATTR_ALIGNMENT; }
|
||||
void SetTabs(const wxArrayInt& tabs) { m_tabs = tabs; m_flags |= wxTEXT_ATTR_TABS; }
|
||||
void SetLeftIndent(int indent) { m_leftIndent = indent; m_flags |= wxTEXT_ATTR_LEFT_INDENT; }
|
||||
void SetRightIndent(int indent) { m_rightIndent = indent; m_flags |= wxTEXT_ATTR_RIGHT_INDENT; }
|
||||
void SetFlags(long flags) { m_flags = flags; }
|
||||
|
||||
// accessors
|
||||
bool HasTextColour() const { return m_colText.Ok(); }
|
||||
bool HasBackgroundColour() const { return m_colBack.Ok(); }
|
||||
bool HasFont() const { return m_font.Ok(); }
|
||||
bool HasTextColour() const { return m_colText.Ok() && HasFlag(wxTEXT_ATTR_TEXT_COLOUR) ; }
|
||||
bool HasBackgroundColour() const { return m_colBack.Ok() && HasFlag(wxTEXT_ATTR_BACKGROUND_COLOUR) ; }
|
||||
bool HasFont() const { return m_font.Ok() && HasFlag(wxTEXT_ATTR_FONT) ; }
|
||||
bool HasAlignment() const { return (m_textAlignment != wxTEXT_ALIGNMENT_DEFAULT) || ((m_flags & wxTEXT_ATTR_ALIGNMENT) != 0) ; }
|
||||
bool HasTabs() const { return (m_flags & wxTEXT_ATTR_TABS) != 0 ; }
|
||||
bool HasLeftIndent() const { return (m_flags & wxTEXT_ATTR_LEFT_INDENT) != 0 ; }
|
||||
bool HasRightIndent() const { return (m_flags & wxTEXT_ATTR_RIGHT_INDENT) != 0 ; }
|
||||
bool HasFlag(long flag) const { return (m_flags & flag) != 0; }
|
||||
|
||||
// setters
|
||||
const wxColour& GetTextColour() const { return m_colText; }
|
||||
const wxColour& GetBackgroundColour() const { return m_colBack; }
|
||||
const wxFont& GetFont() const { return m_font; }
|
||||
wxTextAttrAlignment GetAlignment() const { return m_textAlignment; }
|
||||
const wxArrayInt& GetTabs() const { return m_tabs; }
|
||||
long GetLeftIndent() const { return m_leftIndent; }
|
||||
long GetRightIndent() const { return m_rightIndent; }
|
||||
long GetFlags() const { return m_flags; }
|
||||
|
||||
// returns false if we have any attributes set, true otherwise
|
||||
bool IsDefault() const
|
||||
{
|
||||
return !HasTextColour() && !HasBackgroundColour() && !HasFont();
|
||||
return !HasTextColour() && !HasBackgroundColour() && !HasFont() && !HasAlignment() &&
|
||||
!HasTabs() && !HasLeftIndent() && !HasRightIndent() ;
|
||||
}
|
||||
|
||||
// return the attribute having the valid font and colours: it uses the
|
||||
@ -145,9 +199,14 @@ public:
|
||||
const wxTextCtrlBase *text);
|
||||
|
||||
private:
|
||||
wxColour m_colText,
|
||||
m_colBack;
|
||||
wxFont m_font;
|
||||
long m_flags;
|
||||
wxColour m_colText,
|
||||
m_colBack;
|
||||
wxFont m_font;
|
||||
wxTextAttrAlignment m_textAlignment;
|
||||
wxArrayInt m_tabs; // array of int: tab stops in 1/10 mm
|
||||
int m_leftIndent; // left indent in 1/10 mm
|
||||
int m_rightIndent; // right indent in 1/10 mm
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
@ -224,6 +283,7 @@ public:
|
||||
// methods allow to apply the given text style to the given selection or to
|
||||
// set/get the style which will be used for all appended text
|
||||
virtual bool SetStyle(long start, long end, const wxTextAttr& style);
|
||||
virtual bool GetStyle(long position, wxTextAttr& style);
|
||||
virtual bool SetDefaultStyle(const wxTextAttr& style);
|
||||
virtual const wxTextAttr& GetDefaultStyle() const;
|
||||
|
||||
|
@ -44,6 +44,9 @@
|
||||
#define wxUSE_CLIPBOARD 0
|
||||
#endif
|
||||
|
||||
#include "wx/colordlg.h"
|
||||
#include "wx/fontdlg.h"
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// class definitions
|
||||
//----------------------------------------------------------------------
|
||||
@ -199,6 +202,7 @@ public:
|
||||
void OnLogClear(wxCommandEvent& event);
|
||||
void OnFileSave(wxCommandEvent& event);
|
||||
void OnFileLoad(wxCommandEvent& event);
|
||||
void OnRichTextTest(wxCommandEvent& event);
|
||||
|
||||
void OnSetEditable(wxCommandEvent& event);
|
||||
void OnSetEnabled(wxCommandEvent& event);
|
||||
@ -260,6 +264,34 @@ private:
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
/*
|
||||
* RichTextFrame is used to demonstrate rich text behaviour
|
||||
*/
|
||||
|
||||
class RichTextFrame: public wxFrame
|
||||
{
|
||||
public:
|
||||
RichTextFrame(wxWindow* parent, const wxString& title);
|
||||
|
||||
// Event handlers
|
||||
|
||||
void OnClose(wxCommandEvent& event);
|
||||
void OnLeftAlign(wxCommandEvent& event);
|
||||
void OnRightAlign(wxCommandEvent& event);
|
||||
void OnJustify(wxCommandEvent& event);
|
||||
void OnCentre(wxCommandEvent& event);
|
||||
void OnChangeFont(wxCommandEvent& event);
|
||||
void OnChangeTextColour(wxCommandEvent& event);
|
||||
void OnChangeBackgroundColour(wxCommandEvent& event);
|
||||
void OnLeftIndent(wxCommandEvent& event);
|
||||
void OnRightIndent(wxCommandEvent& event);
|
||||
|
||||
private:
|
||||
wxTextCtrl *m_textCtrl;
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// main()
|
||||
//----------------------------------------------------------------------
|
||||
@ -277,6 +309,7 @@ enum
|
||||
TEXT_LOAD,
|
||||
TEXT_SAVE,
|
||||
TEXT_CLEAR,
|
||||
TEXT_RICH_TEXT_TEST,
|
||||
|
||||
// clipboard menu
|
||||
TEXT_CLIPBOARD_COPY = 200,
|
||||
@ -325,6 +358,8 @@ bool MyApp::OnInit()
|
||||
file_menu->Append(TEXT_LOAD, _T("&Load file\tCtrl-O"),
|
||||
_T("Load the sample file into text control"));
|
||||
file_menu->AppendSeparator();
|
||||
file_menu->Append(TEXT_RICH_TEXT_TEST, _T("Show Rich Text Editor"));
|
||||
file_menu->AppendSeparator();
|
||||
file_menu->Append(TEXT_ABOUT, _T("&About\tAlt-A"));
|
||||
file_menu->AppendSeparator();
|
||||
file_menu->Append(TEXT_QUIT, _T("E&xit\tAlt-X"), _T("Quit this sample"));
|
||||
@ -1065,6 +1100,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
||||
EVT_MENU(TEXT_ABOUT, MyFrame::OnAbout)
|
||||
EVT_MENU(TEXT_SAVE, MyFrame::OnFileSave)
|
||||
EVT_MENU(TEXT_LOAD, MyFrame::OnFileLoad)
|
||||
EVT_MENU(TEXT_RICH_TEXT_TEST, MyFrame::OnRichTextTest)
|
||||
|
||||
EVT_MENU(TEXT_LOG_KEY, MyFrame::OnLogKey)
|
||||
EVT_MENU(TEXT_LOG_CHAR, MyFrame::OnLogChar)
|
||||
@ -1223,6 +1259,12 @@ void MyFrame::OnFileLoad(wxCommandEvent& event)
|
||||
wxLogStatus(this, _T("Couldn't load the file"));
|
||||
}
|
||||
|
||||
void MyFrame::OnRichTextTest(wxCommandEvent& event)
|
||||
{
|
||||
RichTextFrame* frame = new RichTextFrame(this, _T("Rich Text Editor"));
|
||||
frame->Show(TRUE);
|
||||
}
|
||||
|
||||
void MyFrame::OnIdle( wxIdleEvent& event )
|
||||
{
|
||||
// track the window which has the focus in the status bar
|
||||
@ -1249,3 +1291,230 @@ void MyFrame::OnIdle( wxIdleEvent& event )
|
||||
}
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
/*
|
||||
* RichTextFrame is used to demonstrate rich text behaviour
|
||||
*/
|
||||
|
||||
enum
|
||||
{
|
||||
RICHTEXT_CLOSE = 1000,
|
||||
RICHTEXT_LEFT_ALIGN,
|
||||
RICHTEXT_RIGHT_ALIGN,
|
||||
RICHTEXT_CENTRE,
|
||||
RICHTEXT_JUSTIFY,
|
||||
RICHTEXT_CHANGE_FONT,
|
||||
RICHTEXT_CHANGE_TEXT_COLOUR,
|
||||
RICHTEXT_CHANGE_BACKGROUND_COLOUR,
|
||||
RICHTEXT_LEFT_INDENT,
|
||||
RICHTEXT_RIGHT_INDENT
|
||||
};
|
||||
|
||||
BEGIN_EVENT_TABLE(RichTextFrame, wxFrame)
|
||||
EVT_MENU(RICHTEXT_CLOSE, RichTextFrame::OnClose)
|
||||
EVT_MENU(RICHTEXT_LEFT_ALIGN, RichTextFrame::OnLeftAlign)
|
||||
EVT_MENU(RICHTEXT_RIGHT_ALIGN, RichTextFrame::OnRightAlign)
|
||||
EVT_MENU(RICHTEXT_CENTRE, RichTextFrame::OnCentre)
|
||||
EVT_MENU(RICHTEXT_JUSTIFY, RichTextFrame::OnJustify)
|
||||
EVT_MENU(RICHTEXT_CHANGE_FONT, RichTextFrame::OnChangeFont)
|
||||
EVT_MENU(RICHTEXT_CHANGE_TEXT_COLOUR, RichTextFrame::OnChangeTextColour)
|
||||
EVT_MENU(RICHTEXT_CHANGE_BACKGROUND_COLOUR, RichTextFrame::OnChangeBackgroundColour)
|
||||
EVT_MENU(RICHTEXT_LEFT_INDENT, RichTextFrame::OnLeftIndent)
|
||||
EVT_MENU(RICHTEXT_RIGHT_INDENT, RichTextFrame::OnRightIndent)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
RichTextFrame::RichTextFrame(wxWindow* parent, const wxString& title):
|
||||
wxFrame(parent, -1, title, wxDefaultPosition, wxSize(300, 400))
|
||||
{
|
||||
m_textCtrl = new wxTextCtrl(this, -1, wxEmptyString, wxDefaultPosition,
|
||||
wxDefaultSize, wxTE_MULTILINE|wxTE_RICH2);
|
||||
|
||||
wxString value;
|
||||
int i;
|
||||
for (i = 0; i < 10; i++)
|
||||
{
|
||||
int j;
|
||||
for (j = 0; j < 10; j++)
|
||||
{
|
||||
value << wxT("Hello, welcome to a very simple rich text editor. You can set some character and paragraph styles from the Edit menu. ");
|
||||
}
|
||||
value << wxT("\n\n");
|
||||
}
|
||||
m_textCtrl->SetValue(value);
|
||||
|
||||
wxMenuBar* menuBar = new wxMenuBar;
|
||||
wxMenu* fileMenu = new wxMenu;
|
||||
fileMenu->Append(RICHTEXT_CLOSE, _("Close\tCtrl+W"));
|
||||
menuBar->Append(fileMenu, _("File"));
|
||||
|
||||
wxMenu* editMenu = new wxMenu;
|
||||
editMenu->Append(RICHTEXT_LEFT_ALIGN, _("Left Align"));
|
||||
editMenu->Append(RICHTEXT_RIGHT_ALIGN, _("Right Align"));
|
||||
editMenu->Append(RICHTEXT_CENTRE, _("Centre"));
|
||||
editMenu->Append(RICHTEXT_JUSTIFY, _("Justify"));
|
||||
editMenu->AppendSeparator();
|
||||
editMenu->Append(RICHTEXT_CHANGE_FONT, _("Change Font"));
|
||||
editMenu->Append(RICHTEXT_CHANGE_TEXT_COLOUR, _("Change Text Colour"));
|
||||
editMenu->Append(RICHTEXT_CHANGE_BACKGROUND_COLOUR, _("Change Background Colour"));
|
||||
editMenu->AppendSeparator();
|
||||
editMenu->Append(RICHTEXT_LEFT_INDENT, _("Left Indent"));
|
||||
editMenu->Append(RICHTEXT_RIGHT_INDENT, _("Right indent"));
|
||||
menuBar->Append(editMenu, _("Edit"));
|
||||
|
||||
SetMenuBar(menuBar);
|
||||
}
|
||||
|
||||
// Event handlers
|
||||
|
||||
void RichTextFrame::OnClose(wxCommandEvent& event)
|
||||
{
|
||||
Close(TRUE);
|
||||
}
|
||||
|
||||
void RichTextFrame::OnLeftAlign(wxCommandEvent& event)
|
||||
{
|
||||
wxTextAttr attr;
|
||||
attr.SetAlignment(wxTEXT_ALIGNMENT_LEFT);
|
||||
|
||||
long start, end;
|
||||
m_textCtrl->GetSelection(& start, & end);
|
||||
m_textCtrl->SetStyle(start, end, attr);
|
||||
}
|
||||
|
||||
void RichTextFrame::OnRightAlign(wxCommandEvent& event)
|
||||
{
|
||||
wxTextAttr attr;
|
||||
attr.SetAlignment(wxTEXT_ALIGNMENT_RIGHT);
|
||||
|
||||
long start, end;
|
||||
m_textCtrl->GetSelection(& start, & end);
|
||||
m_textCtrl->SetStyle(start, end, attr);
|
||||
}
|
||||
|
||||
void RichTextFrame::OnJustify(wxCommandEvent& event)
|
||||
{
|
||||
wxTextAttr attr;
|
||||
attr.SetAlignment(wxTEXT_ALIGNMENT_JUSTIFIED);
|
||||
|
||||
long start, end;
|
||||
m_textCtrl->GetSelection(& start, & end);
|
||||
m_textCtrl->SetStyle(start, end, attr);
|
||||
}
|
||||
|
||||
void RichTextFrame::OnCentre(wxCommandEvent& event)
|
||||
{
|
||||
wxTextAttr attr;
|
||||
attr.SetAlignment(wxTEXT_ALIGNMENT_CENTRE);
|
||||
|
||||
long start, end;
|
||||
m_textCtrl->GetSelection(& start, & end);
|
||||
m_textCtrl->SetStyle(start, end, attr);
|
||||
}
|
||||
|
||||
void RichTextFrame::OnChangeFont(wxCommandEvent& event)
|
||||
{
|
||||
wxFontData data;
|
||||
|
||||
wxFontDialog dialog(this, data);
|
||||
|
||||
if (dialog.ShowModal() == wxID_OK)
|
||||
{
|
||||
wxFontData retData = dialog.GetFontData();
|
||||
wxFont font = retData.GetChosenFont();
|
||||
|
||||
wxTextAttr attr;
|
||||
attr.SetFont(font);
|
||||
|
||||
long start, end;
|
||||
m_textCtrl->GetSelection(& start, & end);
|
||||
m_textCtrl->SetStyle(start, end, attr);
|
||||
}
|
||||
}
|
||||
|
||||
void RichTextFrame::OnChangeTextColour(wxCommandEvent& event)
|
||||
{
|
||||
wxColourData data;
|
||||
data.SetColour(* wxBLACK);
|
||||
data.SetChooseFull(TRUE);
|
||||
for (int i = 0; i < 16; i++)
|
||||
{
|
||||
wxColour colour(i*16, i*16, i*16);
|
||||
data.SetCustomColour(i, colour);
|
||||
}
|
||||
|
||||
wxColourDialog dialog(this, &data);
|
||||
dialog.SetTitle(_T("Choose the text colour"));
|
||||
if (dialog.ShowModal() == wxID_OK)
|
||||
{
|
||||
wxColourData retData = dialog.GetColourData();
|
||||
wxColour col = retData.GetColour();
|
||||
|
||||
wxTextAttr attr;
|
||||
attr.SetTextColour(col);
|
||||
|
||||
long start, end;
|
||||
m_textCtrl->GetSelection(& start, & end);
|
||||
m_textCtrl->SetStyle(start, end, attr);
|
||||
}
|
||||
}
|
||||
|
||||
void RichTextFrame::OnChangeBackgroundColour(wxCommandEvent& event)
|
||||
{
|
||||
wxColourData data;
|
||||
data.SetColour(* wxWHITE);
|
||||
data.SetChooseFull(TRUE);
|
||||
for (int i = 0; i < 16; i++)
|
||||
{
|
||||
wxColour colour(i*16, i*16, i*16);
|
||||
data.SetCustomColour(i, colour);
|
||||
}
|
||||
|
||||
wxColourDialog dialog(this, &data);
|
||||
dialog.SetTitle(_T("Choose the text background colour"));
|
||||
if (dialog.ShowModal() == wxID_OK)
|
||||
{
|
||||
wxColourData retData = dialog.GetColourData();
|
||||
wxColour col = retData.GetColour();
|
||||
|
||||
wxTextAttr attr;
|
||||
attr.SetBackgroundColour(col);
|
||||
|
||||
long start, end;
|
||||
m_textCtrl->GetSelection(& start, & end);
|
||||
m_textCtrl->SetStyle(start, end, attr);
|
||||
}
|
||||
}
|
||||
|
||||
void RichTextFrame::OnLeftIndent(wxCommandEvent& event)
|
||||
{
|
||||
wxString indentStr = wxGetTextFromUser(_("Please enter the left indent in tenths of a millimetre."),
|
||||
_("Left Indent"));
|
||||
if (!indentStr.IsEmpty())
|
||||
{
|
||||
int indent = wxAtoi(indentStr);
|
||||
|
||||
wxTextAttr attr;
|
||||
attr.SetLeftIndent(indent);
|
||||
|
||||
long start, end;
|
||||
m_textCtrl->GetSelection(& start, & end);
|
||||
m_textCtrl->SetStyle(start, end, attr);
|
||||
}
|
||||
}
|
||||
|
||||
void RichTextFrame::OnRightIndent(wxCommandEvent& event)
|
||||
{
|
||||
wxString indentStr = wxGetTextFromUser(_("Please enter the right indent in tenths of a millimetre."),
|
||||
_("Right Indent"));
|
||||
if (!indentStr.IsEmpty())
|
||||
{
|
||||
int indent = wxAtoi(indentStr);
|
||||
|
||||
wxTextAttr attr;
|
||||
attr.SetRightIndent(indent);
|
||||
|
||||
long start, end;
|
||||
m_textCtrl->GetSelection(& start, & end);
|
||||
m_textCtrl->SetStyle(start, end, attr);
|
||||
}
|
||||
}
|
||||
|
@ -69,6 +69,30 @@ wxTextCtrlBase::~wxTextCtrlBase()
|
||||
// style functions - not implemented here
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
wxTextAttr::wxTextAttr(const wxColour& colText,
|
||||
const wxColour& colBack,
|
||||
const wxFont& font,
|
||||
wxTextAttrAlignment alignment)
|
||||
: m_colText(colText), m_colBack(colBack), m_font(font), m_textAlignment(alignment)
|
||||
{
|
||||
m_flags = 0;
|
||||
m_leftIndent = 0;
|
||||
m_rightIndent = 0;
|
||||
if (m_colText.Ok()) m_flags |= wxTEXT_ATTR_TEXT_COLOUR;
|
||||
if (m_colBack.Ok()) m_flags |= wxTEXT_ATTR_BACKGROUND_COLOUR;
|
||||
if (m_font.Ok()) m_flags |= wxTEXT_ATTR_FONT;
|
||||
if (alignment != wxTEXT_ALIGNMENT_DEFAULT)
|
||||
m_flags |= wxTEXT_ATTR_ALIGNMENT;
|
||||
}
|
||||
|
||||
void wxTextAttr::Init()
|
||||
{
|
||||
m_textAlignment = wxTEXT_ALIGNMENT_DEFAULT;
|
||||
m_flags = 0;
|
||||
m_leftIndent = 0;
|
||||
m_rightIndent = 0;
|
||||
}
|
||||
|
||||
/* static */
|
||||
wxTextAttr wxTextAttr::Combine(const wxTextAttr& attr,
|
||||
const wxTextAttr& attrDef,
|
||||
@ -101,9 +125,44 @@ wxTextAttr wxTextAttr::Combine(const wxTextAttr& attr,
|
||||
colBg = text->GetBackgroundColour();
|
||||
}
|
||||
|
||||
return wxTextAttr(colFg, colBg, font);
|
||||
wxTextAttr newAttr(colFg, colBg, font);
|
||||
|
||||
if (attr.HasAlignment())
|
||||
newAttr.SetAlignment(attr.GetAlignment());
|
||||
else if (attrDef.HasAlignment())
|
||||
newAttr.SetAlignment(attrDef.GetAlignment());
|
||||
|
||||
if (attr.HasTabs())
|
||||
newAttr.SetTabs(attr.GetTabs());
|
||||
else if (attrDef.HasTabs())
|
||||
newAttr.SetTabs(attrDef.GetTabs());
|
||||
|
||||
if (attr.HasLeftIndent())
|
||||
newAttr.SetLeftIndent(attr.GetLeftIndent());
|
||||
else if (attrDef.HasLeftIndent())
|
||||
newAttr.SetLeftIndent(attrDef.GetLeftIndent());
|
||||
|
||||
if (attr.HasRightIndent())
|
||||
newAttr.SetRightIndent(attr.GetRightIndent());
|
||||
else if (attrDef.HasRightIndent())
|
||||
newAttr.SetRightIndent(attrDef.GetRightIndent());
|
||||
|
||||
return newAttr;
|
||||
}
|
||||
|
||||
void wxTextAttr::operator= (const wxTextAttr& attr)
|
||||
{
|
||||
m_font = attr.m_font;
|
||||
m_colText = attr.m_colText;
|
||||
m_colBack = attr.m_colBack;
|
||||
m_textAlignment = attr.m_textAlignment;
|
||||
m_leftIndent = attr.m_leftIndent;
|
||||
m_rightIndent = attr.m_rightIndent;
|
||||
m_tabs = attr.m_tabs;
|
||||
m_flags = attr.m_flags;
|
||||
}
|
||||
|
||||
|
||||
// apply styling to text range
|
||||
bool wxTextCtrlBase::SetStyle(long WXUNUSED(start), long WXUNUSED(end),
|
||||
const wxTextAttr& WXUNUSED(style))
|
||||
@ -112,6 +171,13 @@ bool wxTextCtrlBase::SetStyle(long WXUNUSED(start), long WXUNUSED(end),
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// get the styling at the given position
|
||||
bool wxTextCtrlBase::GetStyle(long WXUNUSED(position), wxTextAttr& WXUNUSED(style))
|
||||
{
|
||||
// to be implemented in derived TextCtrl classes
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// change default text attributes
|
||||
bool wxTextCtrlBase::SetDefaultStyle(const wxTextAttr& style)
|
||||
{
|
||||
|
@ -1918,7 +1918,9 @@ bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style)
|
||||
|
||||
// the richedit 1.0 doesn't handle setting background colour, so don't
|
||||
// even try to do anything if it's the only thing we want to change
|
||||
if ( m_verRichEdit == 1 && !style.HasFont() && !style.HasTextColour() )
|
||||
if ( m_verRichEdit == 1 && !style.HasFont() && !style.HasTextColour() &&
|
||||
!style.HasLeftIndent() && !style.HasRightIndent() && !style.HasAlignment() &&
|
||||
!style.HasTabs() )
|
||||
{
|
||||
// nothing to do: return TRUE if there was really nothing to do and
|
||||
// FALSE if we failed to set bg colour
|
||||
@ -2032,6 +2034,81 @@ bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style)
|
||||
wxLogDebug(_T("SendMessage(EM_SETCHARFORMAT, SCF_SELECTION) failed"));
|
||||
}
|
||||
|
||||
// now do the paragraph formatting
|
||||
PARAFORMAT2 pf;
|
||||
wxZeroMemory(pf);
|
||||
// we can't use PARAFORMAT2 with RichEdit 1.0, so pretend it is a simple
|
||||
// PARAFORMAT in that case
|
||||
#if wxUSE_RICHEDIT2
|
||||
if ( m_verRichEdit == 1 )
|
||||
{
|
||||
// this is the only thing the control is going to grok
|
||||
pf.cbSize = sizeof(PARAFORMAT);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
// PARAFORMAT or PARAFORMAT2
|
||||
pf.cbSize = sizeof(pf);
|
||||
}
|
||||
|
||||
if (style.HasAlignment())
|
||||
{
|
||||
pf.dwMask |= PFM_ALIGNMENT;
|
||||
if (style.GetAlignment() == wxTEXT_ALIGNMENT_RIGHT)
|
||||
pf.wAlignment = PFA_RIGHT;
|
||||
else if (style.GetAlignment() == wxTEXT_ALIGNMENT_CENTRE)
|
||||
pf.wAlignment = PFA_CENTER;
|
||||
else if (style.GetAlignment() == wxTEXT_ALIGNMENT_JUSTIFIED)
|
||||
pf.wAlignment = PFA_JUSTIFY;
|
||||
else
|
||||
pf.wAlignment = PFA_LEFT;
|
||||
}
|
||||
|
||||
if (style.HasLeftIndent())
|
||||
{
|
||||
pf.dwMask |= PFM_STARTINDENT;
|
||||
|
||||
// Convert from 1/10 mm to TWIPS
|
||||
pf.dxStartIndent = (int) (((double) style.GetLeftIndent()) * mm2twips / 10.0) ;
|
||||
|
||||
// TODO: do we need to specify dxOffset?
|
||||
}
|
||||
|
||||
if (style.HasRightIndent())
|
||||
{
|
||||
pf.dwMask |= PFM_RIGHTINDENT;
|
||||
|
||||
// Convert from 1/10 mm to TWIPS
|
||||
pf.dxRightIndent = (int) (((double) style.GetRightIndent()) * mm2twips / 10.0) ;
|
||||
}
|
||||
|
||||
if (style.HasTabs())
|
||||
{
|
||||
pf.dwMask |= PFM_TABSTOPS;
|
||||
|
||||
const wxArrayInt& tabs = style.GetTabs();
|
||||
|
||||
pf.cTabCount = wxMin(tabs.GetCount(), MAX_TAB_STOPS);
|
||||
size_t i;
|
||||
for (i = 0; i < (size_t) pf.cTabCount; i++)
|
||||
{
|
||||
// Convert from 1/10 mm to TWIPS
|
||||
pf.rgxTabs[i] = (int) (((double) tabs[i]) * mm2twips / 10.0) ;
|
||||
}
|
||||
}
|
||||
|
||||
if (pf.dwMask != 0)
|
||||
{
|
||||
// do format the selection
|
||||
bool ok = ::SendMessage(GetHwnd(), EM_SETPARAFORMAT,
|
||||
0, (LPARAM) &pf) != 0;
|
||||
if ( !ok )
|
||||
{
|
||||
wxLogDebug(_T("SendMessage(EM_SETPARAFORMAT, 0) failed"));
|
||||
}
|
||||
}
|
||||
|
||||
if ( changeSel )
|
||||
{
|
||||
// restore the original selection
|
||||
@ -2054,6 +2131,12 @@ bool wxTextCtrl::SetDefaultStyle(const wxTextAttr& style)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool wxTextCtrl::GetStyle(long WXUNUSED(position), wxTextAttr& WXUNUSED(style))
|
||||
{
|
||||
// TODO
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
Loading…
Reference in New Issue
Block a user