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