//----------------------------------------------------------------------------- // Name: custclass.cpp // Purpose: XML resources sample: A custom class to insert into a XRC file // Author: Robert O'Connor (rob@medicalmnemonics.com), Vaclav Slavik // Copyright: (c) Robert O'Connor and Vaclav Slavik // Licence: wxWindows licence //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // Standard wxWidgets headers //----------------------------------------------------------------------------- // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // For all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWidgets headers) #ifndef WX_PRECOMP #include "wx/wx.h" #endif //----------------------------------------------------------------------------- // Header of this .cpp file //----------------------------------------------------------------------------- #include "custclas.h" //----------------------------------------------------------------------------- // Internal constants //----------------------------------------------------------------------------- // Popup menu (PU) item control IDs. In this example, they aren't hooked up // to any functions. Normally you would use these IDs in your event table, so // that if one of these menu items is clicked, then a certain function is // called. enum { PU_ADD_RECORD = wxID_HIGHEST + 1, PU_EDIT_RECORD, PU_DELETE_RECORD }; // Columns of the listctrl (the leftmost one starts at 0, and so on). // Allows easier code maintenance if want to add/rearrangement of listctrl's // columns. enum { RECORD_COLUMN = 0, ACTION_COLUMN, PRIORITY_COLUMN }; //----------------------------------------------------------------------------- // wxWidgets macro: implement dynamic class //----------------------------------------------------------------------------- wxIMPLEMENT_DYNAMIC_CLASS( MyResizableListCtrl, wxListCtrl ); //----------------------------------------------------------------------------- // Event table: connect the events to the handler functions to process them //----------------------------------------------------------------------------- wxBEGIN_EVENT_TABLE( MyResizableListCtrl, wxListCtrl ) // Something to do when right mouse down EVT_RIGHT_DOWN( MyResizableListCtrl::ContextSensitiveMenu ) // Something to do when resized EVT_SIZE( MyResizableListCtrl::OnSize ) wxEND_EVENT_TABLE() //----------------------------------------------------------------------------- // Public methods //----------------------------------------------------------------------------- // Constructor, including setting the dialog's m_configuration_section member // to the incoming configuration_section string. MyResizableListCtrl::MyResizableListCtrl( wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name ) : wxListCtrl( parent, id, pos, size, style, validator, name ) { // This listctrl needs to insert its columns in the constructor, since // as soon as the listctrl is built, it is resized and grafted onto an // "unknown" XRC placeholder. This induces an OnSize() event, calling the // overrriden OnSize function for this class, which needs to have 3 // columns to resize (else an assert on WXGTK debug build). InsertColumn( RECORD_COLUMN, _("Record"), wxLIST_FORMAT_LEFT, 140); InsertColumn( ACTION_COLUMN, _("Action"), wxLIST_FORMAT_LEFT, 70); InsertColumn( PRIORITY_COLUMN, _("Priority"), wxLIST_FORMAT_LEFT, 70 ); } void MyResizableListCtrl::ContextSensitiveMenu( wxMouseEvent& event ) { // Make an instance of a menu. wxMenu a_menu; a_menu.Append( PU_ADD_RECORD, _( "Add a new record...") ); a_menu.Append( PU_EDIT_RECORD, _( "Edit selected record..." ) ); a_menu.Append( PU_DELETE_RECORD, _( "Delete selected record" ) ); // If no listctrl rows selected, then disable the menu items that // require selection if ( GetSelectedItemCount() == 0 ) { a_menu.Enable( PU_EDIT_RECORD, false ); a_menu.Enable( PU_DELETE_RECORD, false ); } // Show the popup menu (wxWindow::PopupMenu ), at the x,y position // of the click event PopupMenu( &a_menu, event.GetPosition() ); } void MyResizableListCtrl::OnSize( wxSizeEvent &event ) { // Call our custom width setting function. SetColumnWidths(); // REQURED event.Skip() call to allow this event to propagate // upwards so others can do what they need to do in response to // this size event. event.Skip(); } void MyResizableListCtrl::SetColumnWidths() { // Get width of entire listctrl int leftmostColumnWidth = GetSize().x; // Subtract width of other columns, scrollbar, and some padding leftmostColumnWidth -= GetColumnWidth( ACTION_COLUMN ); leftmostColumnWidth -= GetColumnWidth( PRIORITY_COLUMN ); leftmostColumnWidth -= wxSystemSettings::GetMetric( wxSYS_VSCROLL_X ); leftmostColumnWidth -= 5; // Set the column width to the new value. SetColumnWidth( RECORD_COLUMN, leftmostColumnWidth ); // This is just a debug message in case you want to watch the // events scroll by as you resize. wxLogDebug( wxT("Successfully set column widths") ); }