Old API depreciated. Use of new API. Source cleaning.
[wxWidgets.git] / samples / xrc / custclas.cpp
1 //-----------------------------------------------------------------------------
2 // Name: custclass.cpp
3 // Purpose: XML resources sample: A custom class to insert into a XRC file
4 // Author: Robert O'Connor (rob@medicalmnemonics.com), Vaclav Slavik
5 // RCS-ID: $Id$
6 // Copyright: (c) Robert O'Connor and Vaclav Slavik
7 // Licence: wxWindows licence
8 //-----------------------------------------------------------------------------
9
10 //-----------------------------------------------------------------------------
11 // GCC implementation
12 //-----------------------------------------------------------------------------
13
14 #ifdef __GNUG__
15 #pragma implementation "custclas.h"
16 #endif
17
18 //-----------------------------------------------------------------------------
19 // Standard wxWidgets headers
20 //-----------------------------------------------------------------------------
21
22 // For compilers that support precompilation, includes "wx/wx.h".
23 #include "wx/wxprec.h"
24
25 #ifdef __BORLANDC__
26 #pragma hdrstop
27 #endif
28
29 // For all others, include the necessary headers (this file is usually all you
30 // need because it includes almost all "standard" wxWidgets headers)
31 #ifndef WX_PRECOMP
32 #include "wx/wx.h"
33 #endif
34
35 //-----------------------------------------------------------------------------
36 // Header of this .cpp file
37 //-----------------------------------------------------------------------------
38
39 #include "custclas.h"
40
41 //-----------------------------------------------------------------------------
42 // Internal constants
43 //-----------------------------------------------------------------------------
44
45 // Popup menu (PU) item control IDs. In this example, they aren't hooked up
46 // to any functions. Normally you would use these IDs in your event table, so
47 // that if one of these menu items is clicked, then a certain function is
48 // called.
49 enum {
50 PU_ADD_RECORD = wxID_HIGHEST + 1,
51 PU_EDIT_RECORD,
52 PU_DELETE_RECORD
53 };
54
55 // Columns of the listctrl (the leftmost one starts at 0, and so on).
56 // Allows easier code maintenance if want to add/rearrangement of listctrl's
57 // columns.
58 enum {
59 RECORD_COLUMN = 0,
60 ACTION_COLUMN,
61 PRIORITY_COLUMN
62 };
63
64 //-----------------------------------------------------------------------------
65 // wxWidgets macro: implement dynamic class
66 //-----------------------------------------------------------------------------
67
68 IMPLEMENT_DYNAMIC_CLASS( MyResizableListCtrl, wxListCtrl )
69
70 //-----------------------------------------------------------------------------
71 // Event table: connect the events to the handler functions to process them
72 //-----------------------------------------------------------------------------
73
74 BEGIN_EVENT_TABLE( MyResizableListCtrl, wxListCtrl )
75 // Something to do when right mouse down
76 EVT_RIGHT_DOWN( MyResizableListCtrl::ContextSensitiveMenu )
77 // Something to do when resized
78 EVT_SIZE( MyResizableListCtrl::OnSize )
79 END_EVENT_TABLE()
80
81 //-----------------------------------------------------------------------------
82 // Public methods
83 //-----------------------------------------------------------------------------
84
85 // Constructor, including setting the dialog's m_configuration_section member
86 // to the incoming configuration_section string.
87 MyResizableListCtrl::MyResizableListCtrl( wxWindow *parent, wxWindowID id,
88 const wxPoint& pos, const wxSize& size,
89 long style, const wxValidator& validator,
90 const wxString& name )
91 : wxListCtrl( parent, id, pos, size, style, validator, name )
92 {
93
94 // This listctrl needs to insert its columns in the constructor, since
95 // as soon as the listctrl is built, it is resized and grafted onto an
96 // "unknown" XRC placeholder. This induces an OnSize() event, calling the
97 // overrriden OnSize function for this class, which needs to have 3
98 // columns to resize (else an assert on WXGTK debug build).
99 InsertColumn( RECORD_COLUMN, _("Record"), wxLIST_FORMAT_LEFT, 140);
100 InsertColumn( ACTION_COLUMN, _("Action"), wxLIST_FORMAT_LEFT, 70);
101 InsertColumn( PRIORITY_COLUMN, _("Priority"), wxLIST_FORMAT_LEFT, 70 );
102 }
103
104
105 void MyResizableListCtrl::ContextSensitiveMenu( wxMouseEvent& event )
106 {
107 // Make an instance of a menu.
108 wxMenu a_menu;
109
110 a_menu.Append( PU_ADD_RECORD, _( "Add a new record...") );
111 a_menu.Append( PU_EDIT_RECORD, _( "Edit selected record..." ) );
112 a_menu.Append( PU_DELETE_RECORD, _( "Delete selected record" ) );
113
114 // If no listctrl rows selected, then disable the menu items that
115 // require selection
116 if ( GetSelectedItemCount() == 0 ) {
117 a_menu.Enable( PU_EDIT_RECORD, false );
118 a_menu.Enable( PU_DELETE_RECORD, false );
119 }
120
121 // Show the popup menu (wxWindow::PopupMenu ), at the x,y position
122 // of the click event
123 PopupMenu( &a_menu, event.GetPosition() );
124 }
125
126
127 void MyResizableListCtrl::OnSize( wxSizeEvent &event )
128 {
129 // Call our custom width setting function.
130 SetColumnWidths();
131 // REQURED event.Skip() call to allow this event to propagate
132 // upwards so others can do what they need to do in response to
133 // this size event.
134 event.Skip();
135 }
136
137
138 void MyResizableListCtrl::SetColumnWidths()
139 {
140 // Get width of entire listctrl
141 int leftmostColumnWidth = GetSize().x;
142
143 // Subtract width of other columns, scrollbar, and some padding
144 leftmostColumnWidth -= GetColumnWidth( ACTION_COLUMN );
145 leftmostColumnWidth -= GetColumnWidth( PRIORITY_COLUMN );
146 leftmostColumnWidth -= wxSystemSettings::GetMetric( wxSYS_VSCROLL_X );
147 leftmostColumnWidth -= 5;
148
149 // Set the column width to the new value.
150 SetColumnWidth( RECORD_COLUMN, leftmostColumnWidth );
151
152 // This is just a debug message in case you want to watch the
153 // events scroll by as you resize.
154 wxLogDebug( wxT("Successfully set column widths") );
155 }
156
157