wxWidgets/samples/xrc/custclas.cpp

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") );
}