]> git.saurik.com Git - wxWidgets.git/blob - samples/richedit/wxlwindow.h
added TAB handling
[wxWidgets.git] / samples / richedit / wxlwindow.h
1 /*-*- c++ -*-********************************************************
2 * wxLwindow.h : a scrolled Window for displaying/entering rich text*
3 * *
4 * (C) 1998-2000 by Karsten Ballüder (ballueder@gmx.net) *
5 * *
6 * $Id$
7 *******************************************************************/
8 #ifndef WXLWINDOW_H
9 #define WXLWINDOW_H
10
11 #ifdef __GNUG__
12 # pragma interface "wxlwindow.h"
13 #endif
14
15 #ifndef USE_PCH
16 # include <wx/wx.h>
17 #endif
18
19 #include "wxllist.h"
20
21 #ifndef WXLOWIN_MENU_FIRST
22 # define WXLOWIN_MENU_FIRST 12000
23 #endif
24
25
26 enum
27 {
28 WXLOWIN_MENU_LARGER = WXLOWIN_MENU_FIRST,
29 WXLOWIN_MENU_SMALLER,
30 WXLOWIN_MENU_UNDERLINE,
31 WXLOWIN_MENU_BOLD,
32 WXLOWIN_MENU_ITALICS,
33 WXLOWIN_MENU_ROMAN,
34 WXLOWIN_MENU_TYPEWRITER,
35 WXLOWIN_MENU_SANSSERIF,
36 WXLOWIN_MENU_RCLICK,
37 WXLOWIN_MENU_DBLCLICK,
38 WXLOWIN_MENU_MDOWN,
39 WXLOWIN_MENU_LDOWN,
40 WXLOWIN_MENU_LCLICK = WXLOWIN_MENU_LDOWN,
41 WXLOWIN_MENU_LUP,
42 WXLOWIN_MENU_MOUSEMOVE,
43 WXLOWIN_MENU_LAST = WXLOWIN_MENU_MOUSEMOVE
44 };
45
46 /**
47 This class is a rich text editing widget.
48 */
49 class wxLayoutWindow : public wxScrolledWindow
50 {
51 public:
52 /** Constructor.
53 @param parent parent window to display this panel in
54 */
55 wxLayoutWindow(wxWindow *parent);
56
57 /// Destructor.
58 virtual ~wxLayoutWindow();
59
60 /**@name Editing functionality */
61 //@{
62 /// Clears the window and sets default parameters.
63 void Clear(int family = wxROMAN,
64 int size=12,
65 int style=wxNORMAL,
66 int weight=wxNORMAL,
67 int underline=0,
68 wxColour *fg=NULL,
69 wxColour *bg=NULL);
70
71 /// override base class virtual to also refresh the scrollbar position
72 virtual void Refresh(bool eraseBackground = TRUE,
73 const wxRect *rect = (const wxRect *)NULL);
74
75 /** Sets a background image, only used on screen, not on printouts.
76 @param bitmap a pointer to a wxBitmap or NULL to remove it
77 */
78 void SetBackgroundBitmap(wxBitmap *bitmap = NULL)
79 {
80 if(m_BGbitmap) delete m_BGbitmap;
81 m_BGbitmap = bitmap;
82 }
83 /// Enable or disable editing, i.e. processing of keystrokes.
84 void SetEditable(bool toggle)
85 { m_Editable = toggle; SetCursorVisibility(toggle); }
86 /// Query whether list can be edited by user.
87 bool IsEditable(void) const { return m_Editable; }
88 /** Sets cursor visibility, visible=1, invisible=0,
89 visible-on-demand=-1, to hide it until moved.
90 @param visibility -1,0 or 1
91 @return the old visibility
92 */
93 inline int SetCursorVisibility(int visibility = -1)
94 { int v =m_CursorVisibility;
95 m_CursorVisibility = visibility; return v;}
96
97 /// Pastes text from clipboard.
98 void Paste(bool privateFormat = FALSE, bool usePrimarySelection = FALSE);
99 /** Copies selection to clipboard.
100 @param invalidate used internally, see wxllist.h for details
101 */
102 bool Copy(bool invalidate = true, bool privateFormat = FALSE, bool primary = FALSE);
103 /// Copies selection to clipboard and deletes it.
104 bool Cut(bool privateFormat = FALSE, bool usePrimary = FALSE);
105 //@}
106
107 /// find string in buffer
108 bool Find(const wxString &needle,
109 wxPoint * fromWhere = NULL,
110 const wxString &configPath = "MsgViewFindString");
111 /// find the same string again
112 bool FindAgain(void);
113
114 void EnablePopup(bool enable = true) { m_DoPopupMenu = enable; }
115
116 /** Sets the wrap margin.
117 @param margin set this to 0 to disable it
118 */
119 void SetWrapMargin(CoordType margin) { m_WrapMargin = margin; }
120
121 /** Toggle wordwrap as we type.
122 @param on true to activate word wrap
123 */
124 void SetWordWrap(bool on = true) { m_DoWordWrap = on; }
125
126 /** Redraws the window.
127 Internally, this stores the parameter and calls a refresh on
128 wxMSW, draws directly on wxGTK.
129 */
130 void RequestUpdate(const wxRect *updateRect = NULL);
131
132 /// if exact == false, assume 50% extra size for the future
133 void ResizeScrollbars(bool exact = false); // don't change this to true!
134
135 /// if the flag is true, we send events when user clicks on embedded objects
136 inline void SetMouseTracking(bool doIt = true) { m_doSendEvents = doIt; }
137
138 /* Returns a pointer to the wxLayoutList object.
139 @return the list
140 */
141 wxLayoutList * GetLayoutList(void) { return m_llist; }
142
143 /**@name Callbacks */
144 //@{
145 void OnSize(wxSizeEvent &event);
146 void OnPaint(wxPaintEvent &event);
147 void OnChar(wxKeyEvent& event);
148 void OnKeyUp(wxKeyEvent& event);
149 void OnUpdateMenuUnderline(wxUpdateUIEvent& event);
150 void OnUpdateMenuBold(wxUpdateUIEvent& event);
151 void OnUpdateMenuItalic(wxUpdateUIEvent& event);
152 void OnMenu(wxCommandEvent& event);
153 void OnLeftMouseDown(wxMouseEvent& event) { OnMouse(WXLOWIN_MENU_LDOWN, event); }
154 void OnLeftMouseUp(wxMouseEvent& event) { OnMouse(WXLOWIN_MENU_LUP, event); }
155 void OnRightMouseClick(wxMouseEvent& event) { OnMouse(WXLOWIN_MENU_RCLICK, event); }
156 void OnMiddleMouseDown(wxMouseEvent& event) { OnMouse(WXLOWIN_MENU_MDOWN, event); }
157 void OnMouseDblClick(wxMouseEvent& event) { OnMouse(WXLOWIN_MENU_DBLCLICK, event); }
158 void OnMouseMove(wxMouseEvent &event) { OnMouse(WXLOWIN_MENU_MOUSEMOVE, event) ; }
159 void OnSetFocus(wxFocusEvent &ev);
160 void OnKillFocus(wxFocusEvent &ev);
161 //@}
162
163 /// Creates a wxMenu for use as a format popup.
164 static wxMenu * MakeFormatMenu(void);
165 /// Redraws the window, used by RequestUpdate() or OnPaint().
166 void InternalPaint(const wxRect *updateRect);
167
168 /** Tell window to update a wxStatusBar with UserData labels and
169 cursor positions.
170 @param bar wxStatusBar pointer
171 @param labelfield field to use in statusbar for URLs/userdata labels, or -1 to disable
172 @param cursorfield field to use for cursor position, or -1 to disable
173 */
174 void SetStatusBar(class wxStatusBar *bar,
175 int labelfield = -1,
176 int cursorfield = -1)
177 {
178 m_StatusBar = bar; m_StatusFieldLabel = labelfield;
179 m_StatusFieldCursor = cursorfield;
180 }
181 #ifndef __WXMSW__
182 /// Enable or disable focus follow mode under non-MSW
183 void SetFocusFollowMode(bool enable = TRUE)
184 { m_FocusFollowMode = enable; }
185 #endif
186
187 /**@name Modified flag handling, will not get reset by list unless
188 in Clear() */
189 //@{
190 /// Set dirty flag.
191 void SetModified(bool modified = TRUE) { m_Modified = modified; }
192 /// Query whether window needs redrawing.
193 bool IsModified(void) const { return m_Modified; }
194 //@}
195
196 /**@name Dirty flag handling for optimisations.
197 Normally one should only need to call SetDirty(), e.g. when
198 manipulating the wxLayoutList directly, so the window will update
199 itself. ResetDirty() and IsDirty() should only be used
200 internally. */
201 //@{
202 /// Set dirty flag.
203 void SetDirty(void) { m_Dirty = true; m_Modified = true; }
204 /// Query whether window needs redrawing.
205 bool IsDirty(void) const { return m_Dirty; }
206 /// Reset dirty flag.
207 void ResetDirty(void) { m_Dirty = false; }
208 //@}
209
210
211 protected:
212 /// generic function for mouse events processing
213 void OnMouse(int eventId, wxMouseEvent& event);
214 /// as the name says
215 void ScrollToCursor(void);
216 /// for sending events
217 wxWindow *m_Parent;
218 /// Shall we send events?
219 bool m_doSendEvents;
220 /// Where does the current view start?
221 int m_ViewStartX; int m_ViewStartY;
222 /// Do we currently have the focus?
223 bool m_HaveFocus;
224 /// do we handle clicks of the right mouse button?
225 bool m_DoPopupMenu;
226 /// Should InternalPaint() scroll to cursor (VZ: seems unused any more)
227 bool m_ScrollToCursor;
228 /// Do we currently have a non-standard cursor?
229 bool m_HandCursor;
230 /// the menu
231 wxMenu * m_PopupMenu;
232 /// for derived classes, set when mouse is clicked
233 wxPoint m_ClickPosition;
234 /// for scrollbar calculations:
235 int m_maxx;
236 int m_maxy;
237 int m_lineHeight;
238 /// do we want automatic word wrap?
239 bool m_DoWordWrap;
240 /// wrap margin
241 CoordType m_WrapMargin;
242
243 /// do we have the corresponding scrollbar?
244 bool m_hasHScrollbar,
245 m_hasVScrollbar;
246
247 /** Visibility parameter for cursor. 0/1 as expected, -1: visible
248 on demand.
249 */
250 int m_CursorVisibility;
251
252 bool SetAutoDeleteSelection(bool enable = TRUE)
253 {
254 bool old = m_AutoDeleteSelection;
255 m_AutoDeleteSelection = enable;
256 return old;
257 }
258 private:
259 /// The layout list to be displayed.
260 wxLayoutList *m_llist;
261 /// Can user edit the window?
262 bool m_Editable;
263 /// Are we currently building a selection with the keyboard?
264 bool m_Selecting;
265 /// Has list changed since last redraw, e.g. in size?
266 bool m_Dirty;
267 /// Has the list ever been modified?
268 bool m_Modified;
269 wxMemoryDC *m_memDC;
270 wxBitmap *m_bitmap;
271 wxPoint m_bitmapSize;
272 /// A frame's statusbar to update
273 class wxStatusBar *m_StatusBar;
274 /// statusbar field for labels
275 int m_StatusFieldLabel;
276 /// statusbar field for cursor positions
277 int m_StatusFieldCursor;
278 /// a pointer to a bitmap for the background
279 wxBitmap *m_BGbitmap;
280 /**@name Some configuration options */
281 //@{
282 /// Do we want to auto-replace the selection with new text?
283 bool m_AutoDeleteSelection;
284 #ifndef __WXMSW__
285 /// Do we want the focus to follow the mouse?
286 bool m_FocusFollowMode;
287 #endif
288 /// For finding text and finding it again:
289 wxString m_FindString;
290 //@}
291 DECLARE_EVENT_TABLE()
292 };
293
294 #endif