X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/77ffb5937e89927b621128789401db8921fe580f..cd643444314b6b488c9ecaf7c971f2a7abafca18:/include/wx/textctrl.h diff --git a/include/wx/textctrl.h b/include/wx/textctrl.h index 379b2f4341..7c8be51720 100644 --- a/include/wx/textctrl.h +++ b/include/wx/textctrl.h @@ -1,12 +1,12 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: textctrl.h +// Name: wx/textctrl.h // Purpose: wxTextCtrlBase class - the interface of wxTextCtrl // Author: Vadim Zeitlin // Modified by: // Created: 13.07.99 // RCS-ID: $Id$ -// Copyright: (c) wxWidgets team -// Licence: wxWidgets licence +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// #ifndef _WX_TEXTCTRL_H_BASE_ @@ -16,46 +16,37 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma interface "textctrlbase.h" -#endif - #include "wx/defs.h" #if wxUSE_TEXTCTRL #include "wx/control.h" // the base class +#include "wx/textentry.h" // single-line text entry interface #include "wx/dynarray.h" // wxArrayInt #include "wx/gdicmn.h" // wxPoint -// 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 -// streambuf. !! Also, can't use streambuf if making or using a DLL :-( +// Open Watcom 1.3 does allow only ios::rdbuf() while +// we want something with streambuf parameter +// Also, can't use streambuf if making or using a DLL :-( -#if (defined(__BORLANDC__)) || defined(__MWERKS__) || \ +#if defined(__WATCOMC__) || \ + defined(__MWERKS__) || \ (defined(__WINDOWS__) && (defined(WXUSINGDLL) || defined(WXMAKINGDLL))) - #define NO_TEXT_WINDOW_STREAM -#endif - -#ifndef NO_TEXT_WINDOW_STREAM - #if wxUSE_STD_IOSTREAM - #include "wx/ioswrap.h" // derivation: we need the full decls. - #else // !wxUSE_STD_IOSTREAM - // can't compile this feature in if we don't use streams at all - #define NO_TEXT_WINDOW_STREAM - #endif // wxUSE_STD_IOSTREAM/!wxUSE_STD_IOSTREAM + #define wxHAS_TEXT_WINDOW_STREAM 0 +#elif wxUSE_STD_IOSTREAM + #include "wx/ioswrap.h" + #define wxHAS_TEXT_WINDOW_STREAM 1 +#else + #define wxHAS_TEXT_WINDOW_STREAM 0 #endif -class WXDLLEXPORT wxTextCtrl; -class WXDLLEXPORT wxTextCtrlBase; +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; +class WXDLLIMPEXP_FWD_CORE wxTextCtrlBase; // ---------------------------------------------------------------------------- // wxTextCtrl types // ---------------------------------------------------------------------------- -// wxTextPos is the position in the text -typedef long wxTextPos; - // wxTextCoord is the line or row number (which should have been unsigned but // is long for backwards compatibility) typedef long wxTextCoord; @@ -64,16 +55,17 @@ typedef long wxTextCoord; // constants // ---------------------------------------------------------------------------- -WXDLLEXPORT_DATA(extern const wxChar*) wxTextCtrlNameStr; +extern WXDLLEXPORT_DATA(const wxChar) wxTextCtrlNameStr[]; + +// this is intentionally not enum to avoid warning fixes with +// typecasting from enum type to wxTextCoord +const wxTextCoord wxOutOfRangeTextCoord = -1; +const wxTextCoord wxInvalidTextCoord = -2; // ---------------------------------------------------------------------------- // wxTextCtrl style flags // ---------------------------------------------------------------------------- -// the flag bits 0x0001, and 0x0004 are free but should be used only for the -// things which don't make sense for a text control used by wxTextEntryDialog -// because they would otherwise conflict with wxOK, wxCANCEL, wxCENTRE - #define wxTE_NO_VSCROLL 0x0002 #define wxTE_AUTO_SCROLL 0x0008 @@ -97,23 +89,44 @@ WXDLLEXPORT_DATA(extern const wxChar*) wxTextCtrlNameStr; // automatically detect the URLs and generate the events when mouse is // moved/clicked over an URL // -// this is for Win32 richedit controls only so far +// this is for Win32 richedit and wxGTK2 multiline controls only so far #define wxTE_AUTO_URL 0x1000 // by default, the Windows text control doesn't show the selection when it // doesn't have focus - use this style to force it to always show it #define wxTE_NOHIDESEL 0x2000 -// use wxHSCROLL to not wrap text at all, wxTE_LINEWRAP to wrap it at any +// use wxHSCROLL to not wrap text at all, wxTE_CHARWRAP to wrap it at any // position and wxTE_WORDWRAP to wrap at words boundary +// +// if no wrapping style is given at all, the control wraps at word boundary #define wxTE_DONTWRAP wxHSCROLL -#define wxTE_LINEWRAP 0x4000 -#define wxTE_WORDWRAP 0x0000 // it's just == !wxHSCROLL +#define wxTE_CHARWRAP 0x4000 // wrap at any position +#define wxTE_WORDWRAP 0x0001 // wrap only at words boundaries +#define wxTE_BESTWRAP 0x0000 // this is the default + +#if WXWIN_COMPATIBILITY_2_6 + // obsolete synonym + #define wxTE_LINEWRAP wxTE_CHARWRAP +#endif // WXWIN_COMPATIBILITY_2_6 // force using RichEdit version 2.0 or 3.0 instead of 1.0 (default) for // wxTE_RICH controls - can be used together with or instead of wxTE_RICH #define wxTE_RICH2 0x8000 +// reuse wxTE_RICH2's value for CAPEDIT control on Windows CE +#if defined(__SMARTPHONE__) || defined(__POCKETPC__) +#define wxTE_CAPITALIZE wxTE_RICH2 +#else +#define wxTE_CAPITALIZE 0 +#endif + +// ---------------------------------------------------------------------------- +// wxTextCtrl file types +// ---------------------------------------------------------------------------- + +#define wxTEXT_TYPE_ANY 0 + // ---------------------------------------------------------------------------- // wxTextCtrl::HitTest return values // ---------------------------------------------------------------------------- @@ -155,7 +168,8 @@ enum wxTextAttrAlignment #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 + ( 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 @@ -178,6 +192,22 @@ public: // operations void Init(); + // merges the attributes of the base and the overlay objects and returns + // the result; the parameter attributes take precedence + // + // WARNING: the order of arguments is the opposite of Combine() + static wxTextAttr Merge(const wxTextAttr& base, const wxTextAttr& overlay) + { + return Combine(overlay, base, NULL); + } + + // merges the attributes of this object and overlay + void Merge(const wxTextAttr& overlay) + { + *this = Merge(*this, overlay); + } + + // operators void operator= (const wxTextAttr& attr); @@ -233,90 +263,67 @@ private: 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_leftSubIndent; // left indent for all but the first + int m_leftSubIndent; // left indent for all but the first // line in a paragraph relative to the // first line, in 1/10 mm int m_rightIndent; // right indent in 1/10 mm }; // ---------------------------------------------------------------------------- -// wxTextCtrl: a single or multiple line text zone where user can enter and -// edit text +// wxTextAreaBase: multiline text control specific methods // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxTextCtrlBase : public wxControl -#ifndef NO_TEXT_WINDOW_STREAM - , public wxSTD streambuf -#endif - +class WXDLLIMPEXP_CORE wxTextAreaBase { public: - // creation - // -------- + wxTextAreaBase() { } + virtual ~wxTextAreaBase() { } - wxTextCtrlBase(); - ~wxTextCtrlBase(); - - // accessors - // --------- - - virtual wxString GetValue() const = 0; - virtual void SetValue(const wxString& value) = 0; - - virtual wxString GetRange(long from, long to) const; + // lines access + // ------------ virtual int GetLineLength(long lineNo) const = 0; virtual wxString GetLineText(long lineNo) const = 0; virtual int GetNumberOfLines() const = 0; - virtual bool IsModified() const = 0; - virtual bool IsEditable() const = 0; - - // more readable flag testing methods - bool IsSingleLine() const { return !(GetWindowStyle() & wxTE_MULTILINE); } - bool IsMultiLine() const { return !IsSingleLine(); } - - // If the return values from and to are the same, there is no selection. - virtual void GetSelection(long* from, long* to) const = 0; - virtual wxString GetStringSelection() const; - - // operations - // ---------- + // file IO + // ------- - // editing - virtual void Clear() = 0; - virtual void Replace(long from, long to, const wxString& value) = 0; - virtual void Remove(long from, long to) = 0; + bool LoadFile(const wxString& file, int fileType = wxTEXT_TYPE_ANY) + { return DoLoadFile(file, fileType); } + bool SaveFile(const wxString& file = wxEmptyString, + int fileType = wxTEXT_TYPE_ANY); - // load/save the controls contents from/to the file - virtual bool LoadFile(const wxString& file); - virtual bool SaveFile(const wxString& file = wxEmptyString); + // dirty flag handling + // ------------------- - // sets/clears the dirty flag + virtual bool IsModified() const = 0; virtual void MarkDirty() = 0; virtual void DiscardEdits() = 0; + void SetModified(bool modified) + { + if ( modified ) + MarkDirty(); + else + DiscardEdits(); + } - // set the max number of characters which may be entered in a single line - // text control - virtual void SetMaxLength(unsigned long WXUNUSED(len)) { } - - // writing text inserts it at the current position, appending always - // inserts it at the end - virtual void WriteText(const wxString& text) = 0; - virtual void AppendText(const wxString& text) = 0; - // insert the character which would have resulted from this key event, - // return TRUE if anything has been inserted - virtual bool EmulateKeyPress(const wxKeyEvent& event); + // styles handling + // --------------- // text control under some platforms supports the text styles: these // 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 SetStyle(long start, long end, const wxTextAttr& style) = 0; + virtual bool GetStyle(long position, wxTextAttr& style) = 0; + virtual bool SetDefaultStyle(const wxTextAttr& style) = 0; + virtual const wxTextAttr& GetDefaultStyle() const { return m_defaultStyle; } + + + // coordinates translation + // ----------------------- // translate between the position (which is just an index in the text ctrl // considering all its contents as a single strings) and (x, y) coordinates @@ -330,40 +337,65 @@ public: // // NB: pt is in device coords (not adjusted for the client area origin nor // scrolling) + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, long *pos) const; virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, wxTextCoord *col, wxTextCoord *row) const; - // Clipboard operations - virtual void Copy() = 0; - virtual void Cut() = 0; - virtual void Paste() = 0; +protected: + // implementation of loading/saving + virtual bool DoLoadFile(const wxString& file, int fileType) = 0; + virtual bool DoSaveFile(const wxString& file, int fileType) = 0; - virtual bool CanCopy() const; - virtual bool CanCut() const; - virtual bool CanPaste() const; - // Undo/redo - virtual void Undo() = 0; - virtual void Redo() = 0; + // the name of the last file loaded with LoadFile() which will be used by + // SaveFile() by default + wxString m_filename; - virtual bool CanUndo() const = 0; - virtual bool CanRedo() const = 0; + // the text style which will be used for any new text added to the control + wxTextAttr m_defaultStyle; - // Insertion point - virtual void SetInsertionPoint(long pos) = 0; - virtual void SetInsertionPointEnd() = 0; - virtual long GetInsertionPoint() const = 0; - virtual long GetLastPosition() const = 0; - virtual void SetSelection(long from, long to) = 0; - virtual void SelectAll(); - virtual void SetEditable(bool editable) = 0; + DECLARE_NO_COPY_CLASS(wxTextAreaBase) +}; - // override streambuf method -#ifndef NO_TEXT_WINDOW_STREAM - int overflow(int i); -#endif // NO_TEXT_WINDOW_STREAM +// this class defines wxTextCtrl interface, wxTextCtrlBase actually implements +// too much things because it derives from wxTextEntry and not wxTextEntryBase +// and so any classes which "look like" wxTextCtrl (such as wxRichTextCtrl) +// but don't need the (native) implementation bits from wxTextEntry should +// actually derive from this one and not wxTextCtrlBase +class WXDLLIMPEXP_CORE wxTextCtrlIface : public wxTextAreaBase, + public wxTextEntryBase +{ +public: + wxTextCtrlIface() { } + +private: + DECLARE_NO_COPY_CLASS(wxTextCtrlIface) +}; + +// ---------------------------------------------------------------------------- +// wxTextCtrl: a single or multiple line text zone where user can edit text +// ---------------------------------------------------------------------------- + +class WXDLLEXPORT wxTextCtrlBase : public wxControl, +#if wxHAS_TEXT_WINDOW_STREAM + public wxSTD streambuf, +#endif + public wxTextAreaBase, + public wxTextEntry +{ +public: + // creation + // -------- + + wxTextCtrlBase() { } + virtual ~wxTextCtrlBase() { } + + + // more readable flag testing methods + bool IsSingleLine() const { return !HasFlag(wxTE_MULTILINE); } + bool IsMultiLine() const { return !IsSingleLine(); } // stream-like insertion operators: these are always available, whether we // were, or not, compiled with streambuf support @@ -374,20 +406,53 @@ public: wxTextCtrl& operator<<(double d); wxTextCtrl& operator<<(const wxChar c); + // insert the character which would have resulted from this key event, + // return true if anything has been inserted + virtual bool EmulateKeyPress(const wxKeyEvent& event); + + + // generate the wxEVT_COMMAND_TEXT_UPDATED event, like SetValue() does and + // return true if the event was processed + static bool SendTextUpdatedEvent(wxWindow *win); + bool SendTextUpdatedEvent() { return SendTextUpdatedEvent(this); } + // do the window-specific processing after processing the update event virtual void DoUpdateWindowUI(wxUpdateUIEvent& event); virtual bool ShouldInheritColours() const { return false; } + // work around the problem with having HitTest() both in wxControl and + // wxTextAreaBase base classes + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, long *pos) const + { + return wxTextAreaBase::HitTest(pt, pos); + } + + virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, + wxTextCoord *col, + wxTextCoord *row) const + { + return wxTextAreaBase::HitTest(pt, col, row); + } + + // we provide stubs for these functions as not all platforms have styles + // support, but we really should leave them pure virtual here + virtual bool SetStyle(long start, long end, const wxTextAttr& style); + virtual bool GetStyle(long position, wxTextAttr& style); + virtual bool SetDefaultStyle(const wxTextAttr& style); + protected: - // the name of the last file loaded with LoadFile() which will be used by - // SaveFile() by default - wxString m_filename; + // override streambuf method +#if wxHAS_TEXT_WINDOW_STREAM + int overflow(int i); +#endif // wxHAS_TEXT_WINDOW_STREAM + + virtual bool DoLoadFile(const wxString& file, int fileType); + virtual bool DoSaveFile(const wxString& file, int fileType); - // the text style which will be used for any new text added to the control - wxTextAttr m_defaultStyle; DECLARE_NO_COPY_CLASS(wxTextCtrlBase) + DECLARE_ABSTRACT_CLASS(wxTextCtrlBase) }; // ---------------------------------------------------------------------------- @@ -398,12 +463,16 @@ protected: #include "wx/x11/textctrl.h" #elif defined(__WXUNIVERSAL__) #include "wx/univ/textctrl.h" +#elif defined(__SMARTPHONE__) && defined(__WXWINCE__) + #include "wx/msw/wince/textctrlce.h" #elif defined(__WXMSW__) #include "wx/msw/textctrl.h" #elif defined(__WXMOTIF__) #include "wx/motif/textctrl.h" -#elif defined(__WXGTK__) +#elif defined(__WXGTK20__) #include "wx/gtk/textctrl.h" +#elif defined(__WXGTK__) + #include "wx/gtk1/textctrl.h" #elif defined(__WXMAC__) #include "wx/mac/textctrl.h" #elif defined(__WXCOCOA__) @@ -463,12 +532,22 @@ public: typedef void (wxEvtHandler::*wxTextUrlEventFunction)(wxTextUrlEvent&); -#define EVT_TEXT(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TEXT_UPDATED, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxCommandEventFunction, & fn ), (wxObject *) NULL ), -#define EVT_TEXT_ENTER(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TEXT_ENTER, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxCommandEventFunction, & fn ), (wxObject *) NULL ), -#define EVT_TEXT_URL(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TEXT_URL, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) wxStaticCastEvent( wxTextUrlEventFunction, & fn ), (wxObject *) NULL ), -#define EVT_TEXT_MAXLEN(id, fn) DECLARE_EVENT_TABLE_ENTRY( wxEVT_COMMAND_TEXT_MAXLEN, id, -1, (wxObjectEventFunction) (wxEventFunction) wxStaticCastEvent( wxCommandEventFunction, & fn ), (wxObject *) NULL ), +#define wxTextEventHandler(func) wxCommandEventHandler(func) +#define wxTextUrlEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxTextUrlEventFunction, &func) + +#define wx__DECLARE_TEXTEVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_TEXT_ ## evt, id, wxTextEventHandler(fn)) + +#define wx__DECLARE_TEXTURLEVT(evt, id, fn) \ + wx__DECLARE_EVT1(wxEVT_COMMAND_TEXT_ ## evt, id, wxTextUrlEventHandler(fn)) + +#define EVT_TEXT(id, fn) wx__DECLARE_TEXTEVT(UPDATED, id, fn) +#define EVT_TEXT_ENTER(id, fn) wx__DECLARE_TEXTEVT(ENTER, id, fn) +#define EVT_TEXT_URL(id, fn) wx__DECLARE_TEXTURLEVT(URL, id, fn) +#define EVT_TEXT_MAXLEN(id, fn) wx__DECLARE_TEXTEVT(MAXLEN, id, fn) -#ifndef NO_TEXT_WINDOW_STREAM +#if wxHAS_TEXT_WINDOW_STREAM // ---------------------------------------------------------------------------- // wxStreamToTextRedirector: this class redirects all data sent to the given @@ -510,7 +589,7 @@ private: wxSTD streambuf *m_sbufOld; }; -#endif // !NO_TEXT_WINDOW_STREAM +#endif // wxHAS_TEXT_WINDOW_STREAM #endif // wxUSE_TEXTCTRL