git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27745 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			163 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //-----------------------------------------------------------------------------
 | |
| // 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
 | |
| // RCS-ID:      $Id$
 | |
| // Copyright:   (c) Robert O'Connor and Vaclav Slavik
 | |
| // Licence:     wxWindows licence
 | |
| //-----------------------------------------------------------------------------
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| // GCC implementation
 | |
| //-----------------------------------------------------------------------------
 | |
| 
 | |
| #ifdef __GNUG__
 | |
|     #pragma implementation "custclas.h"
 | |
| #endif
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| // 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
 | |
| //-----------------------------------------------------------------------------
 | |
| 
 | |
| IMPLEMENT_DYNAMIC_CLASS( MyResizableListCtrl, wxListCtrl )
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| // Event table: connect the events to the handler functions to process them
 | |
| //-----------------------------------------------------------------------------
 | |
| 
 | |
| BEGIN_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 )
 | |
| END_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 );
 | |
| }
 | |
| 
 | |
| 
 | |
| MyResizableListCtrl::~MyResizableListCtrl()
 | |
| {
 | |
| }
 | |
| 
 | |
| 
 | |
| 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::GetSystemMetric( 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") );
 | |
| }
 | |
| 
 | |
| 
 |