146 lines
5.5 KiB
C++
146 lines
5.5 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
|
|
// 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"
|
|
|
|
|
|
// 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( "Successfully set column widths" );
|
|
}
|
|
|
|
|