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:
Julian Smart 2003-06-20 16:25:31 +00:00
parent f22c3c98a0
commit e00a5d3ca1
8 changed files with 663 additions and 37 deletions

View File

@ -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}

View File

@ -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}}

View File

@ -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);

View File

@ -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

View File

@ -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;

View File

@ -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);
}
}

View File

@ -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)
{

View File

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