]> git.saurik.com Git - wxWidgets.git/blob - contrib/samples/gizmos/splittree/tree.cpp
Fixed memory leak in textcmn.cpp
[wxWidgets.git] / contrib / samples / gizmos / splittree / tree.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: tree.cpp
3 // Purpose: Minimal wxWindows sample
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 04/01/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 // ============================================================================
13 // declarations
14 // ============================================================================
15
16 // ----------------------------------------------------------------------------
17 // headers
18 // ----------------------------------------------------------------------------
19 #ifdef __GNUG__
20 #pragma implementation "tree.cpp"
21 #pragma interface "tree.cpp"
22 #endif
23
24 // For compilers that support precompilation, includes "wx/wx.h".
25 #include "wx/wxprec.h"
26
27 #ifdef __BORLANDC__
28 #pragma hdrstop
29 #endif
30
31 // for all others, include the necessary headers (this file is usually all you
32 // need because it includes almost all "standard" wxWindows headers)
33 #ifndef WX_PRECOMP
34 #include "wx/wx.h"
35 #endif
36
37 #if !defined(__WXMSW__) || wxUSE_XPM_IN_MSW
38 /* Closed folder */
39 static char * icon1_xpm[] = {
40 /* width height ncolors chars_per_pixel */
41 "16 16 6 1",
42 /* colors */
43 " s None c None",
44 ". c #000000",
45 "+ c #c0c0c0",
46 "@ c #808080",
47 "# c #ffff00",
48 "$ c #ffffff",
49 /* pixels */
50 " ",
51 " @@@@@ ",
52 " @#+#+#@ ",
53 " @#+#+#+#@@@@@@ ",
54 " @$$$$$$$$$$$$@.",
55 " @$#+#+#+#+#+#@.",
56 " @$+#+#+#+#+#+@.",
57 " @$#+#+#+#+#+#@.",
58 " @$+#+#+#+#+#+@.",
59 " @$#+#+#+#+#+#@.",
60 " @$+#+#+#+#+#+@.",
61 " @$#+#+#+#+#+#@.",
62 " @@@@@@@@@@@@@@.",
63 " ..............",
64 " ",
65 " "};
66
67 /* File */
68 static char * icon2_xpm[] = {
69 /* width height ncolors chars_per_pixel */
70 "16 16 3 1",
71 /* colors */
72 " s None c None",
73 ". c #000000",
74 "+ c #ffffff",
75 /* pixels */
76 " ",
77 " ........ ",
78 " .++++++.. ",
79 " .+.+.++.+. ",
80 " .++++++.... ",
81 " .+.+.+++++. ",
82 " .+++++++++. ",
83 " .+.+.+.+.+. ",
84 " .+++++++++. ",
85 " .+.+.+.+.+. ",
86 " .+++++++++. ",
87 " .+.+.+.+.+. ",
88 " .+++++++++. ",
89 " ........... ",
90 " ",
91 " "};
92 #endif
93
94 #include "wx/imaglist.h"
95 #include "tree.h"
96
97 // ----------------------------------------------------------------------------
98 // resources
99 // ----------------------------------------------------------------------------
100 // the application icon
101 #if defined(__WXGTK__) || defined(__WXMOTIF__)
102 #include "mondrian.xpm"
103 #endif
104
105 // ----------------------------------------------------------------------------
106 // event tables and other macros for wxWindows
107 // ----------------------------------------------------------------------------
108
109 // the event tables connect the wxWindows events with the functions (event
110 // handlers) which process them. It can be also done at run-time, but for the
111 // simple menu events like this the static method is much simpler.
112 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
113 EVT_MENU(Minimal_Quit, MyFrame::OnQuit)
114 EVT_MENU(Minimal_About, MyFrame::OnAbout)
115 END_EVENT_TABLE()
116
117 // Create a new application object: this macro will allow wxWindows to create
118 // the application object during program execution (it's better than using a
119 // static object for many reasons) and also declares the accessor function
120 // wxGetApp() which will return the reference of the right type (i.e. MyApp and
121 // not wxApp)
122 IMPLEMENT_APP(MyApp)
123
124 // ============================================================================
125 // implementation
126 // ============================================================================
127
128 // ----------------------------------------------------------------------------
129 // the application class
130 // ----------------------------------------------------------------------------
131
132 // 'Main program' equivalent: the program execution "starts" here
133 bool MyApp::OnInit()
134 {
135 // create the main application window
136 MyFrame *frame = new MyFrame("Tree Testing",
137 wxPoint(50, 50), wxSize(450, 340));
138
139 // and show it (the frames, unlike simple controls, are not shown when
140 // created initially)
141 frame->Show(TRUE);
142
143 // success: wxApp::OnRun() will be called which will enter the main message
144 // loop and the application will run. If we returned FALSE here, the
145 // application would exit immediately.
146 return TRUE;
147 }
148
149 // ----------------------------------------------------------------------------
150 // main frame
151 // ----------------------------------------------------------------------------
152
153 // frame constructor
154 MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
155 : wxFrame((wxFrame *)NULL, idMAIN_FRAME, title, pos, size)
156 {
157 m_splitter = NULL;
158 m_scrolledWindow = NULL;
159 m_tree = NULL;
160 m_valueWindow = NULL;
161 #ifdef __WXMAC__
162 // we need this in order to allow the about menu relocation, since ABOUT is
163 // not the default id of the about menu
164 wxApp::s_macAboutMenuItemId = Minimal_About;
165 #endif
166
167 m_scrolledWindow = new wxSplitterScrolledWindow(this, idSCROLLED_WINDOW, wxDefaultPosition,
168 wxDefaultSize, wxNO_BORDER | wxCLIP_CHILDREN | wxVSCROLL);
169 m_splitter = new wxThinSplitterWindow(m_scrolledWindow, idSPLITTER_WINDOW, wxDefaultPosition,
170 wxDefaultSize, wxSP_3DBORDER | wxCLIP_CHILDREN /* | wxSP_LIVE_UPDATE */);
171 m_splitter->SetSashSize(2);
172 m_tree = new TestTree(m_splitter, idTREE_CTRL, wxDefaultPosition,
173 wxDefaultSize, wxTR_HAS_BUTTONS | wxTR_NO_LINES | wxNO_BORDER );
174 m_valueWindow = new TestValueWindow(m_splitter, idVALUE_WINDOW, wxDefaultPosition,
175 wxDefaultSize, wxNO_BORDER);
176 m_splitter->SplitVertically(m_tree, m_valueWindow);
177 //m_splitter->AdjustScrollbars();
178 m_splitter->SetSashPosition(200);
179 m_scrolledWindow->SetTargetWindow(m_tree);
180
181 m_scrolledWindow->EnableScrolling(FALSE, FALSE);
182
183 // Let the two controls know about each other
184 m_valueWindow->SetTreeCtrl(m_tree);
185 m_tree->SetCompanionWindow(m_valueWindow);
186
187 // set the frame icon
188 SetIcon(wxICON(mondrian));
189
190 // create a menu bar
191 wxMenu *menuFile = new wxMenu("", wxMENU_TEAROFF);
192
193 // the "About" item should be in the help menu
194 wxMenu *helpMenu = new wxMenu;
195 helpMenu->Append(Minimal_About, "&About...\tCtrl-A", "Show about dialog");
196
197 menuFile->Append(Minimal_Quit, "E&xit\tAlt-X", "Quit this program");
198
199 // now append the freshly created menu to the menu bar...
200 wxMenuBar *menuBar = new wxMenuBar();
201 menuBar->Append(menuFile, "&File");
202 menuBar->Append(helpMenu, "&Help");
203
204 // ... and attach this menu bar to the frame
205 SetMenuBar(menuBar);
206 }
207
208
209 // event handlers
210
211 void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
212 {
213 // TRUE is to force the frame to close
214 Close(TRUE);
215 }
216
217 void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
218 {
219 wxString msg;
220 msg.Printf( _T("This is the about dialog of tree sample.\n")
221 _T("Welcome to %s"), wxVERSION_STRING);
222
223 wxMessageBox(msg, "About Tree Test", wxOK | wxICON_INFORMATION, this);
224 }
225
226 /*
227 * TesTree
228 */
229
230 IMPLEMENT_CLASS(TestTree, wxRemotelyScrolledTreeCtrl)
231
232 BEGIN_EVENT_TABLE(TestTree, wxRemotelyScrolledTreeCtrl)
233 EVT_PAINT(TestTree::OnPaint)
234 END_EVENT_TABLE()
235
236 TestTree::TestTree(wxWindow* parent, wxWindowID id, const wxPoint& pt,
237 const wxSize& sz, long style):
238 wxRemotelyScrolledTreeCtrl(parent, id, pt, sz, style)
239 {
240 m_imageList = new wxImageList(16, 16, TRUE);
241 #if !defined(__WXMSW__) // || wxUSE_XPM_IN_MSW
242 m_imageList->Add(wxIcon(icon1_xpm));
243 m_imageList->Add(wxIcon(icon2_xpm));
244 #elif defined(__WXMSW__)
245 m_imageList->Add(wxIcon(wxT("wxICON_SMALL_CLOSED_FOLDER"), wxBITMAP_TYPE_ICO_RESOURCE));
246 m_imageList->Add(wxIcon(wxT("wxICON_SMALL_FILE"), wxBITMAP_TYPE_ICO_RESOURCE));
247 #else
248 #error "Sorry, we don't have icons available for this platforms."
249 #endif
250 SetImageList(m_imageList);
251
252
253 // Add some dummy items
254 wxTreeItemId rootId = AddRoot(_("Root"), -1, -1);
255 int i;
256 for (i = 1; i <= 20; i++)
257 {
258 wxString label;
259 label.Printf(wxT("Item %d"), i);
260 wxTreeItemId id = AppendItem(rootId, label, 0);
261 //SetItemImage( id, 1, wxTreeItemIcon_Expanded );
262
263 int j;
264 for (j = 0; j < 10; j++)
265 AppendItem(id, _("Child"), 1);
266 }
267 Expand(rootId);
268 }
269
270 TestTree::~TestTree()
271 {
272 SetImageList(NULL);
273 delete m_imageList;
274 }
275
276 void TestTree::OnPaint(wxPaintEvent& event)
277 {
278 wxPaintDC dc(this);
279
280 wxTreeCtrl::OnPaint(event);
281
282 // Reset the device origin since it may have been set
283 dc.SetDeviceOrigin(0, 0);
284
285 wxSize sz = GetClientSize();
286
287 wxPen pen(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DLIGHT), 1, wxSOLID);
288 dc.SetPen(pen);
289 dc.SetBrush(* wxTRANSPARENT_BRUSH);
290
291 wxSize clientSize = GetClientSize();
292 wxRect itemRect;
293 int cy=0;
294 wxTreeItemId h, lastH;
295 for(h=GetFirstVisibleItem();h;h=GetNextVisible(h))
296 {
297 if (GetBoundingRect(h, itemRect))
298 {
299 cy = itemRect.GetTop();
300 dc.DrawLine(0, cy, clientSize.x, cy);
301 lastH = h;
302 }
303 }
304 if (GetBoundingRect(lastH, itemRect))
305 {
306 cy = itemRect.GetBottom();
307 dc.DrawLine(0, cy, clientSize.x, cy);
308 }
309 }
310
311 /*
312 * TestValueWindow
313 */
314
315 //IMPLEMENT_CLASS(TestValueWindow, wxWindow)
316
317 BEGIN_EVENT_TABLE(TestValueWindow, wxTreeCompanionWindow)
318 END_EVENT_TABLE()
319
320 TestValueWindow::TestValueWindow(wxWindow* parent, wxWindowID id,
321 const wxPoint& pos,
322 const wxSize& sz,
323 long style):
324 wxTreeCompanionWindow(parent, id, pos, sz, style)
325 {
326 SetBackgroundColour(* wxWHITE);
327 }