]> git.saurik.com Git - wxWidgets.git/commitdiff
Extended wxTextAttr and added wxTextCtrl::GetStyle stub
authorJulian Smart <julian@anthemion.co.uk>
Fri, 20 Jun 2003 16:25:31 +0000 (16:25 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Fri, 20 Jun 2003 16:25:31 +0000 (16:25 +0000)
allow better rich text support.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@21272 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/latex/wx/dir.tex
docs/latex/wx/text.tex
include/wx/access.h
include/wx/msw/textctrl.h
include/wx/textctrl.h
samples/text/text.cpp
src/common/textcmn.cpp
src/msw/textctrl.cpp

index 007b170b0209cc275606db9b9d3b8650a1261325..cac3971232df866e8d027684eff8258af5cb73d3 100644 (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}
index 2229d11ec5c93abbca382f85eda3f161a3050173..f5fe95c452bf799fe08202cebf896a8f72eb3a61 100644 (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}}
index 978987ed9da159e1db2f34c2d2bdbccef868b1af..b7b80b84fa74aa34850abe7698157f809d115a9d 100644 (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);
 
index 1ac33d3ad2c1f69b18b25638e2196c0ea5007ca4..7c67cb23e3969980a07faaf94b61b34e01e755fa 100644 (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
index cee3bcad453d224d8ca805b3791adae22125db6b..c43869e8199c2a1cdc220e2cf8fe02ceb491b4dc 100644 (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;
 
index 85d143fd6da63a11ef03e98311d8a1216c4b5be9..7ddeaa84238beff4c90d3302df51ae0b94df1c47 100644 (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);
+    }
+}
index 6709d10e0b6246ac46897cb4cff7f4166a542114..57e584a3106e28dfcadea07399fb670537fbaf3f 100644 (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)
 {
index 288f674d4275bc637d4da4a080588a53ea516b64..652bb9555294f79667a8784247b9b7a9dc389bdb 100644 (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
 
 // ----------------------------------------------------------------------------