]> git.saurik.com Git - wxWidgets.git/blame - samples/caret/caret.cpp
Applied patch [ 892511 ] wxUniversal: fix of segfault in toolbar.cpp
[wxWidgets.git] / samples / caret / caret.cpp
CommitLineData
0290598f
VZ
1/////////////////////////////////////////////////////////////////////////////
2// Name: caret.cpp
3// Purpose: wxCaret sample
4// Author: Robert Roebling
5// Modified by:
6// Created: 04/01/98
7// RCS-ID: $Id$
8// Copyright: (c) wxWindows team
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
0290598f 12// For compilers that support precompilation, includes "wx/wx.h".
92a19c2e 13#include "wx/wxprec.h"
0290598f
VZ
14
15#ifdef __BORLANDC__
16 #pragma hdrstop
17#endif
18
19// for all others, include the necessary headers (this file is usually all you
20// need because it includes almost all <standard< wxWindows headers
21#ifndef WX_PRECOMP
012f2cb2 22 #include "wx/wx.h"
0290598f 23
012f2cb2 24 #include "wx/log.h"
0290598f
VZ
25#endif
26
27#include "wx/caret.h"
28
29// ----------------------------------------------------------------------------
30// ressources
31// ----------------------------------------------------------------------------
32// the application icon
618f2efa 33#if defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXMGL__)
0290598f
VZ
34 #include "mondrian.xpm"
35#endif
36
37// ----------------------------------------------------------------------------
38// private classes
39// ----------------------------------------------------------------------------
40
41// Define a new application type, each program should derive a class from wxApp
42class MyApp : public wxApp
43{
44public:
45 // override base class virtuals
46 // ----------------------------
47
48 // this one is called on application startup and is a good place for the app
49 // initialization (doing it here and not in the ctor allows to have an error
50 // return: if OnInit() returns false, the application terminates)
51 virtual bool OnInit();
52};
53
0290598f
VZ
54// MyCanvas is a canvas on which you can type
55class MyCanvas: public wxScrolledWindow
56{
57public:
58 MyCanvas() { }
59 MyCanvas( wxWindow *parent );
60 ~MyCanvas();
61
92607616 62 wxChar& CharAt(int x, int y) { return *(m_text + x + m_xChars * y); }
0290598f 63
697e0cdd 64 // operations
fb476982 65 void SetFontSize(int fontSize);
697e0cdd
VZ
66 void CreateCaret();
67 void MoveCaret(int x, int y);
68
0290598f
VZ
69 // caret movement
70 void Home() { m_xCaret = 0; }
71 void End() { m_xCaret = m_xChars - 1; }
72 void FirstLine() { m_yCaret = 0; }
73 void LastLine() { m_yCaret = m_yChars - 1; }
74 void PrevChar() { if ( !m_xCaret-- ) { End(); PrevLine(); } }
75 void NextChar() { if ( ++m_xCaret == m_xChars ) { Home(); NextLine(); } }
76 void PrevLine() { if ( !m_yCaret-- ) LastLine(); }
77 void NextLine() { if ( ++m_yCaret == m_yChars ) FirstLine(); }
78
79 // event handlers
80 void OnPaint( wxPaintEvent &event );
81 void OnSize( wxSizeEvent &event );
82 void OnChar( wxKeyEvent &event );
83
84private:
697e0cdd
VZ
85 // move the caret to m_xCaret, m_yCaret
86 void DoMoveCaret();
87
fb476982
VZ
88 // update the geometry
89 void ChangeSize();
90
0290598f
VZ
91 wxFont m_font;
92
93 // the margin around the text (looks nicer)
94 int m_xMargin, m_yMargin;
95
96 // size (in pixels) of one character
97 long m_widthChar, m_heightChar;
98
99 // position (in text coords) of the caret
100 int m_xCaret, m_yCaret;
101
102 // the size (in text coords) of the window
103 int m_xChars, m_yChars;
104
105 // the text
92607616 106 wxChar *m_text;
0290598f
VZ
107
108 DECLARE_DYNAMIC_CLASS(MyCanvas)
109 DECLARE_EVENT_TABLE()
110};
111
697e0cdd
VZ
112
113// Define a new frame type: this is going to be our main frame
114class MyFrame : public wxFrame
115{
116public:
117 // ctor(s)
118 MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
119
120 // event handlers (these functions should _not_ be virtual)
121 void OnQuit(wxCommandEvent& event);
122 void OnAbout(wxCommandEvent& event);
123 void OnSetBlinkTime(wxCommandEvent& event);
fb476982 124 void OnSetFontSize(wxCommandEvent& event);
697e0cdd
VZ
125 void OnCaretMove(wxCommandEvent& event);
126
127private:
128 MyCanvas *m_canvas;
129
130 // any class wishing to process wxWindows events must use this macro
131 DECLARE_EVENT_TABLE()
132};
133
0290598f
VZ
134// ----------------------------------------------------------------------------
135// constants
136// ----------------------------------------------------------------------------
137
138// IDs for the controls and the menu commands
139enum
140{
141 // menu items
7e12d1bf
VZ
142 Caret_Quit = 1,
143 Caret_About,
f6bcfd97 144 Caret_SetBlinkTime,
fb476982 145 Caret_SetFontSize,
697e0cdd 146 Caret_Move,
0290598f
VZ
147
148 // controls start here (the numbers are, of course, arbitrary)
7e12d1bf 149 Caret_Text = 1000
0290598f
VZ
150};
151
152// ----------------------------------------------------------------------------
153// event tables and other macros for wxWindows
154// ----------------------------------------------------------------------------
155
156// the event tables connect the wxWindows events with the functions (event
157// handlers) which process them. It can be also done at run-time, but for the
158// simple menu events like this the static method is much simpler.
159BEGIN_EVENT_TABLE(MyFrame, wxFrame)
7e12d1bf
VZ
160 EVT_MENU(Caret_Quit, MyFrame::OnQuit)
161 EVT_MENU(Caret_About, MyFrame::OnAbout)
f6bcfd97 162 EVT_MENU(Caret_SetBlinkTime, MyFrame::OnSetBlinkTime)
fb476982 163 EVT_MENU(Caret_SetFontSize, MyFrame::OnSetFontSize)
697e0cdd 164 EVT_MENU(Caret_Move, MyFrame::OnCaretMove)
0290598f
VZ
165END_EVENT_TABLE()
166
167// Create a new application object: this macro will allow wxWindows to create
168// the application object during program execution (it's better than using a
169// static object for many reasons) and also declares the accessor function
170// wxGetApp() which will return the reference of the right type (i.e. MyApp and
171// not wxApp)
172IMPLEMENT_APP(MyApp)
173
174// ============================================================================
175// implementation
176// ============================================================================
177
178// ----------------------------------------------------------------------------
179// the application class
180// ----------------------------------------------------------------------------
181
182// `Main program' equivalent: the program execution "starts" here
183bool MyApp::OnInit()
184{
697e0cdd 185 // create and show the main application window
9f84eccd 186 MyFrame *frame = new MyFrame(_T("Caret wxWindows sample"),
0290598f
VZ
187 wxPoint(50, 50), wxSize(450, 340));
188
0290598f 189 frame->Show(TRUE);
0290598f
VZ
190
191 // success: wxApp::OnRun() will be called which will enter the main message
192 // loop and the application will run. If we returned FALSE here, the
193 // application would exit immediately.
194 return TRUE;
195}
196
197// ----------------------------------------------------------------------------
198// main frame
199// ----------------------------------------------------------------------------
200
201// frame constructor
202MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
203 : wxFrame((wxFrame *)NULL, -1, title, pos, size)
204{
205 // set the frame icon
206 SetIcon(wxICON(mondrian));
207
208 // create a menu bar
209 wxMenu *menuFile = new wxMenu;
210
9f84eccd 211 menuFile->Append(Caret_SetBlinkTime, _T("&Blink time...\tCtrl-B"));
fb476982 212 menuFile->Append(Caret_SetFontSize, _T("&Font size...\tCtrl-S"));
9f84eccd 213 menuFile->Append(Caret_Move, _T("&Move caret\tCtrl-C"));
f6bcfd97 214 menuFile->AppendSeparator();
9f84eccd 215 menuFile->Append(Caret_About, _T("&About...\tCtrl-A"), _T("Show about dialog"));
0290598f 216 menuFile->AppendSeparator();
9f84eccd 217 menuFile->Append(Caret_Quit, _T("E&xit\tAlt-X"), _T("Quit this program"));
0290598f
VZ
218
219 // now append the freshly created menu to the menu bar...
220 wxMenuBar *menuBar = new wxMenuBar;
9f84eccd 221 menuBar->Append(menuFile, _T("&File"));
0290598f
VZ
222
223 // ... and attach this menu bar to the frame
224 SetMenuBar(menuBar);
225
697e0cdd 226 m_canvas = new MyCanvas(this);
0290598f
VZ
227
228 // create a status bar just for fun (by default with 1 pane only)
229 CreateStatusBar(2);
9f84eccd 230 SetStatusText(_T("Welcome to wxWindows!"));
0290598f
VZ
231}
232
233
234// event handlers
235
236void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
237{
238 // TRUE is to force the frame to close
239 Close(TRUE);
240}
241
242void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
243{
f6bcfd97
BP
244