//-----------------------------------------------------------------------------
// 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: custclas.cpp,v 1.1.2.1 2002/11/09 23:18:16 VS Exp $
// Copyright:   (c) Robert O'Connor and Vaclav Slavik
// Licence:     wxWindows licence
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// GCC implementation
//-----------------------------------------------------------------------------

#ifdef __GNUG__
    #pragma implementation "custclas.h"
#endif

//-----------------------------------------------------------------------------
// Standard wxWindows 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" wxWindows 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
};

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


