]> git.saurik.com Git - wxWidgets.git/blob - samples/richedit/wxlwindow.h
wxStaticBitmapBase::DoGetBestSize
[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
84 /// Enable or disable editing, i.e. processing of keystrokes.
85 void SetEditable(bool toggle)
86 {
87 m_Editable = toggle;
88 SetCursorVisibility(toggle);
89 }
90
91 /// Query whether list can be edited by user.
92 bool IsEditable() const { return m_Editable; }
93
94 /** Sets cursor visibility, visible=1, invisible=0,
95 visible-on-demand=-1, to hide it until moved.
96 @param visibility -1,0 or 1
97 @return the old visibility
98 */
99 inline int SetCursorVisibility(int visibility = -1)
100 {
101 int v =m_CursorVisibility;
102 m_CursorVisibility = visibility; return v;
103 }
104
105 /// Pastes text from clipboard.
106 void Paste(bool privateFormat = false, bool usePrimarySelection = false);
107
108 /** Copies selection to clipboard.
109 @param invalidate used internally, see wxllist.h for details
110 */
111 bool Copy(bool invalidate = true, bool privateFormat = false, bool primary = false);
112
113 /// Copies selection to clipboard and deletes it.
114 bool Cut(bool privateFormat = false, bool usePrimary = false);
115 //@}
116
117 /// find string in buffer
118 bool Find(const wxString &needle,
119 wxPoint * fromWhere = NULL,
120 const wxString &configPath = _T("MsgViewFindString"));
121
122 /// find the same string again
123 bool FindAgain();
124
125 void EnablePopup(bool enable = true) { m_DoPopupMenu = enable; }
126
127 /** Sets the wrap margin.
128 @param margin set this to 0 to disable it
129 */
130 void SetWrapMargin(CoordType margin) { m_WrapMargin = margin; }
131
132 /** Toggle wordwrap as we type.
133 @param on true to activate word wrap
134 */
135 void SetWordWrap(bool on = true) { m_DoWordWrap = on; }
136
137 /** Redraws the window.
138 Internally, this stores the parameter and calls a refresh on
139 wxMSW, draws directly on wxGTK.
140 */
141 void RequestUpdate(const wxRect *updateRect = NULL);
142
143 /// if exact == false, assume 50% extra size for the future
144 void ResizeScrollbars(bool exact = false); // don't change this to true!
145
146 /// if the flag is true, we send events when user clicks on embedded objects
147 inline void SetMouseTracking(bool doIt = true) { m_doSendEvents = doIt; }
148
149 /** Returns a pointer to the wxLayoutList object.
150 @return the list
151 */
152 wxLayoutList * GetLayoutList() { return m_llist; }
153
154 /**@name Callbacks */
155 //@{
156 void OnSize(wxSizeEvent &event);
157 void OnPaint(wxPaintEvent &event);
158 void OnChar(wxKeyEvent& event);
159 void OnKeyUp(wxKeyEvent& event);
160 void OnUpdateMenuUnderline(wxUpdateUIEvent& event);
161 void OnUpdateMenuBold(wxUpdateUIEvent& event);
162 void OnUpdateMenuItalic(wxUpdateUIEvent& event);
163 void OnMenu(wxCommandEvent& event);
164 void OnLeftMouseDown(wxMouseEvent& event) { OnMouse(WXLOWIN_MENU_LDOWN, event); }
165 void OnLeftMouseUp(wxMouseEvent& event) { OnMouse(WXLOWIN_MENU_LUP, event); }
166 void OnRightMouseClick(wxMouseEvent& event) { OnMouse(WXLOWIN_MENU_RCLICK, event); }
167 void OnMiddleMouseDown(wxMouseEvent& event) { OnMouse(WXLOWIN_MENU_MDOWN, event); }
168 void OnMouseDblClick(wxMouseEvent& event) { OnMouse(WXLOWIN_MENU_DBLCLICK, event); }
169 void OnMouseMove(wxMouseEvent &event) { OnMouse(WXLOWIN_MENU_MOUSEMOVE, event) ; }
170 void OnSetFocus(wxFocusEvent &ev);
171 void OnKillFocus(wxFocusEvent &ev);
172 //@}
173
174 /// Creates a wxMenu for use as a format popup.
175 static wxMenu * MakeFormatMenu();
176
177 /// Redraws the window, used by RequestUpdate() or OnPaint().
178 void InternalPaint(const wxRect *updateRect);
179
180 /** Tell window to update a wxStatusBar with UserData labels and
181 cursor positions.
182 @param bar wxStatusBar pointer
183 @param labelfield field to use in statusbar for URLs/userdata labels, or -1 to disable
184 @param cursorfield field to use for cursor position, or -1 to disable
185 */
186 void SetStatusBar(class wxStatusBar *bar,
187 int labelfield = -1,
188 int cursorfield = -1)
189 {
190 m_StatusBar = bar; m_StatusFieldLabel = labelfield;
191 m_StatusFieldCursor = cursorfield;
192 }
193
194 #ifndef __WXMSW__
195 /// Enable or disable focus follow mode under non-MSW
196 void SetFocusFollowMode(bool enable = true)
197 {
198 m_FocusFollowMode = enable;
199 }
200 #endif
201
202 /** @name Modified flag handling, will not get reset by list unless
203 in Clear() */
204 //@{
205 /// Set dirty flag.
206 void SetModified(bool modified = true) { m_Modified = modified; }
207
208 /// Query whether window needs redrawing.
209 bool IsModified() const { return m_Modified; }
210 //@}
211
212 /**
213 @name Dirty flag handling for optimisations.
214 Normally one should only need to call SetDirty(), e.g. when
215 manipulating the wxLayoutList directly, so the window will update
216 itself. ResetDirty() and IsDirty() should only be used
217 internally. */
218 //@{
219 /// Set dirty flag.
220 void SetDirty() { m_Dirty = true; m_Modified = true; }
221
222 /// Query whether window needs redrawing.
223 bool IsDirty() const { return m_Dirty; }
224
225 /// Reset dirty flag.
226 void ResetDirty() { m_Dirty = false; }
227 //@}
228
229
230 protected:
231 /// generic function for mouse events processing
232 void OnMouse(int eventId, wxMouseEvent& event);
233
234 /// as the name says
235 void ScrollToCursor();
236
237 /// for sending events
238 wxWindow *m_Parent;
239
240 /// Shall we send events?
241 bool m_doSendEvents;
242
243 /// Where does the current view start?
244 int m_ViewStartX; int m_ViewStartY;
245
246 /// Do we currently have the focus?
247 bool m_HaveFocus;
248
249 /// do we handle clicks of the right mouse button?
250 bool m_DoPopupMenu;
251
252 /// Should InternalPaint() scroll to cursor (VZ: seems unused any more)
253 bool m_ScrollToCursor;
254
255 /// Do we currently have a non-standard cursor?
256 bool m_HandCursor;
257
258 /// the menu
259 wxMenu * m_PopupMenu;
260
261 /// for derived classes, set when mouse is clicked
262 wxPoint m_ClickPosition;
263
264 /// for scrollbar calculations:
265 int m_maxx;
266 int m_maxy;
267 int m_lineHeight;
268
269 /// do we want automatic word wrap?
270 bool m_DoWordWrap;
271
272 /// wrap margin
273 CoordType m_WrapMargin;
274
275 /// do we have the corresponding scrollbar?
276 bool m_hasHScrollbar,
277 m_hasVScrollbar;
278
279 /** Visibility parameter for cursor. 0/1 as expected, -1: visible
280 on demand.
281 */
282 int m_CursorVisibility;
283
284 bool SetAutoDeleteSelection(bool enable = true)
285 {
286 bool old = m_AutoDeleteSelection;
287 m_AutoDeleteSelection = enable;
288 return old;
289 }
290 private:
291 /// The layout list to be displayed.
292 wxLayoutList *m_llist;
293
294 /// Can user edit the window?
295 bool m_Editable;
296
297 /// Are we currently building a selection with the keyboard?
298 bool m_Selecting;
299
300 /// Has list changed since last redraw, e.g. in size?
301 bool m_Dirty;
302
303 /// Has the list ever been modified?
304 bool m_Modified;
305
306 wxMemoryDC *m_memDC;
307 wxBitmap *m_bitmap;
308 wxPoint m_bitmapSize;
309
310 /// A frame's statusbar to update
311 class wxStatusBar *m_StatusBar;
312
313 /// statusbar field for labels
314 int m_StatusFieldLabel;
315
316 /// statusbar field for cursor positions
317 int m_StatusFieldCursor;
318
319 /// a pointer to a bitmap for the background
320 wxBitmap *m_BGbitmap;
321
322 /**@name Some configuration options */
323 //@{
324 /// Do we want to auto-replace the selection with new text?
325 bool m_AutoDeleteSelection;
326
327 #ifndef __WXMSW__
328 /// Do we want the focus to follow the mouse?
329 bool m_FocusFollowMode;
330 #endif
331 /// For finding text and finding it again:
332 wxString m_FindString;
333 //@}
334
335 DECLARE_EVENT_TABLE()
336 };
337
338 #endif