\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}
\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
<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}
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}
\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}}
// 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);
// 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
#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
// 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
// ----------------------------------------------------------------------------
{
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
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
};
// ----------------------------------------------------------------------------
// 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;
#define wxUSE_CLIPBOARD 0
#endif
+#include "wx/colordlg.h"
+#include "wx/fontdlg.h"
+
//----------------------------------------------------------------------
// class definitions
//----------------------------------------------------------------------
void OnLogClear(wxCommandEvent& event);
void OnFileSave(wxCommandEvent& event);
void OnFileLoad(wxCommandEvent& event);
+ void OnRichTextTest(wxCommandEvent& event);
void OnSetEditable(wxCommandEvent& event);
void OnSetEnabled(wxCommandEvent& event);
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()
//----------------------------------------------------------------------
TEXT_LOAD,
TEXT_SAVE,
TEXT_CLEAR,
+ TEXT_RICH_TEXT_TEST,
// clipboard menu
TEXT_CLIPBOARD_COPY = 200,
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"));
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)
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
}
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);
+ }
+}
// 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,
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))
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)
{
// 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
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
return TRUE;
}
+bool wxTextCtrl::GetStyle(long WXUNUSED(position), wxTextAttr& WXUNUSED(style))
+{
+ // TODO
+ return FALSE;
+}
+
#endif
// ----------------------------------------------------------------------------