]> 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}
 
 
 \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}
 
 {\small
 \begin{verbatim}
index 2229d11ec5c93abbca382f85eda3f161a3050173..f5fe95c452bf799fe08202cebf896a8f72eb3a61 100644 (file)
@@ -2,9 +2,13 @@
 
 \section{\class{wxTextAttr}}\label{wxtextattr}
 
 
 \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}.
 
 \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
 \wxheading{Derived from}
 
 No base class
@@ -13,61 +17,185 @@ No base class
 
 <wx/textctrl.h>
 
 
 <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}
 
 \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.
 
 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.
 
 
 \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.
 
 
 \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.
 
 
 \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.
 
 
 \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.
 
 
 \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.
 
 
 \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.
 
 
 \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}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%% 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.
 
 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}
 \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}}
 
 
 \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}
 
 
 \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}
 
 
 \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.
 
 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}}
 \membersection{wxTextCtrl::SetValue}\label{wxtextctrlsetvalue}
 
 \func{virtual void}{SetValue}{\param{const wxString\& }{ value}}
index 978987ed9da159e1db2f34c2d2bdbccef868b1af..b7b80b84fa74aa34850abe7698157f809d115a9d 100644 (file)
@@ -349,7 +349,7 @@ public:
 
 // Operations
 
 
 // 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);
 
     // 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);
     // 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
 #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
 #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
 
 // 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
 
 // 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
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // wxTextAttr: a structure containing the visual attributes of a text
 // ----------------------------------------------------------------------------
@@ -110,31 +143,52 @@ class WXDLLEXPORT wxTextAttr
 {
 public:
     // ctors
 {
 public:
     // ctors
-    wxTextAttr() { }
+    wxTextAttr() { Init(); }
     wxTextAttr(const wxColour& colText,
                const wxColour& colBack = wxNullColour,
     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
 
     // 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
 
     // 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; }
     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
     {
 
     // 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
     }
 
     // return the attribute having the valid font and colours: it uses the
@@ -145,9 +199,14 @@ public:
                               const wxTextCtrlBase *text);
 
 private:
                               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);
     // 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;
 
     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
 
     #define wxUSE_CLIPBOARD 0
 #endif
 
+#include "wx/colordlg.h"
+#include "wx/fontdlg.h"
+
 //----------------------------------------------------------------------
 // class definitions
 //----------------------------------------------------------------------
 //----------------------------------------------------------------------
 // class definitions
 //----------------------------------------------------------------------
@@ -199,6 +202,7 @@ public:
     void OnLogClear(wxCommandEvent& event);
     void OnFileSave(wxCommandEvent& event);
     void OnFileLoad(wxCommandEvent& event);
     void OnLogClear(wxCommandEvent& event);
     void OnFileSave(wxCommandEvent& event);
     void OnFileLoad(wxCommandEvent& event);
+    void OnRichTextTest(wxCommandEvent& event);
 
     void OnSetEditable(wxCommandEvent& event);
     void OnSetEnabled(wxCommandEvent& event);
 
     void OnSetEditable(wxCommandEvent& event);
     void OnSetEnabled(wxCommandEvent& event);
@@ -260,6 +264,34 @@ private:
     DECLARE_EVENT_TABLE()
 };
 
     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()
 //----------------------------------------------------------------------
 //----------------------------------------------------------------------
 // main()
 //----------------------------------------------------------------------
@@ -277,6 +309,7 @@ enum
     TEXT_LOAD,
     TEXT_SAVE,
     TEXT_CLEAR,
     TEXT_LOAD,
     TEXT_SAVE,
     TEXT_CLEAR,
+    TEXT_RICH_TEXT_TEST,
 
     // clipboard menu
     TEXT_CLIPBOARD_COPY = 200,
 
     // 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_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"));
     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_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)
 
     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"));
 }
 
         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
 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();
 }
     }
     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
 // ----------------------------------------------------------------------------
 
 // 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,
 /* static */
 wxTextAttr wxTextAttr::Combine(const wxTextAttr& attr,
                                const wxTextAttr& attrDef,
@@ -101,9 +125,44 @@ wxTextAttr wxTextAttr::Combine(const wxTextAttr& attr,
             colBg = text->GetBackgroundColour();
     }
 
             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))
 // 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;
 }
 
     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)
 {
 // 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
 
     // 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
     {
         // 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"));
     }
 
         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
     if ( changeSel )
     {
         // restore the original selection
@@ -2054,6 +2131,12 @@ bool wxTextCtrl::SetDefaultStyle(const wxTextAttr& style)
     return TRUE;
 }
 
     return TRUE;
 }
 
+bool wxTextCtrl::GetStyle(long WXUNUSED(position), wxTextAttr& WXUNUSED(style))
+{
+    // TODO
+    return FALSE;
+}
+
 #endif
 
 // ----------------------------------------------------------------------------
 #endif
 
 // ----------------------------------------------------------------------------