|
|
#include "RightTopView.h"
#include "PortsPage.h"
#include <vector>
#include <algorithm>
using namespace std;
IMPLEMENT_DYNCREATE( RightTopView, CListView )
BEGIN_MESSAGE_MAP( RightTopView, CListView )
ON_NOTIFY(HDN_ITEMCLICK, 0, OnColumnClick)
END_MESSAGE_MAP()
Document* RightTopView::GetDocument() { return ( Document *) m_pDocument; }
void RightTopView::OnInitialUpdate() { //
// set images for this view.
//
GetListCtrl().SetImageList( GetDocument()->m_images48x48, LVSIL_SMALL );
//
// set the style, we only want report
// view
//
// get present style.
LONG presentStyle; presentStyle = GetWindowLong( m_hWnd, GWL_STYLE );
// Set the last error to zero to avoid confusion.
// See sdk for SetWindowLong.
SetLastError(0);
// set new style.
SetWindowLong( m_hWnd, GWL_STYLE, presentStyle | LVS_REPORT );
//
// we will register
// with the document class,
// as we are the list pane
//
GetDocument()->registerListPane( this );
// initially nothing has been clicked.
m_sort_column = -1; }
void RightTopView::OnColumnClick(NMHDR* pNotifyStruct, LRESULT* pResult) { HTREEITEM hdlSelItem; hdlSelItem = GetDocument()->getLeftPane().GetSelectedItem();
TVITEM selItem; selItem.hItem = hdlSelItem; selItem.mask = TVIF_IMAGE ; GetDocument()->getLeftPane().GetItem( &selItem ); // We only handle column clicks for port rules.
if( selItem.iImage != 2 ) { return; }
LPNMLISTVIEW lv = ( LPNMLISTVIEW) pNotifyStruct; vector<PortsPage::PortData> ports; int index;
// get all the port rules presently in the list.
for( index = 0; index < GetListCtrl().GetItemCount(); ++index ) { PortsPage::PortData portData; wchar_t buffer[Common::BUF_SIZE];
GetListCtrl().GetItemText( index, 0, buffer, Common::BUF_SIZE ); portData.start_port = buffer; GetListCtrl().GetItemText( index, 1, buffer, Common::BUF_SIZE ); portData.end_port = buffer;
GetListCtrl().GetItemText( index, 2, buffer, Common::BUF_SIZE ); portData.protocol = buffer; GetListCtrl().GetItemText( index, 3, buffer, Common::BUF_SIZE ); portData.mode = buffer; GetListCtrl().GetItemText( index, 4, buffer, Common::BUF_SIZE ); portData.priority = buffer; GetListCtrl().GetItemText( index, 5, buffer, Common::BUF_SIZE ); portData.load = buffer; GetListCtrl().GetItemText( index, 6, buffer, Common::BUF_SIZE ); portData.affinity = buffer;
ports.push_back( portData ); }
// sort these port rules depending upon the header which has
// been clicked.
switch( lv->iItem ) { case 0 : // user has clicked start port.
sort( ports.begin(), ports.end(), comp_start_port() ); break;
case 1: // user has clicked end port
sort( ports.begin(), ports.end(), comp_end_port() );
break;
case 2: // user has clicked protocol
sort( ports.begin(), ports.end(), comp_protocol() ); break;
case 3: // user has clicked mode
sort( ports.begin(), ports.end(), comp_mode() ); break;
case 4: // user has clicked priority
sort( ports.begin(), ports.end(), comp_priority_int() ); break;
case 5: // user has clicked load
sort( ports.begin(), ports.end(), comp_load_int() ); break;
case 6: // user has clicked affinity
sort( ports.begin(), ports.end(), comp_affinity() ); break;
default: break; }
/* If we are sorting by the same column we were previously sorting by,
then we reverse the sort order. */ if( m_sort_column == lv->iItem ) { m_sort_ascending = !m_sort_ascending; } else { // default sort is ascending.
m_sort_ascending = true; } m_sort_column = lv->iItem;
int portIndex; int itemCount = GetListCtrl().GetItemCount(); for( index = 0; index < itemCount; ++index ) { if( m_sort_ascending == true ) { portIndex = index; } else { portIndex = ( itemCount - 1 ) - index; }
GetListCtrl().SetItemText( index, 0, ports[portIndex].start_port ); GetListCtrl().SetItemText( index, 1, ports[portIndex].end_port ); GetListCtrl().SetItemText( index, 2, ports[portIndex].protocol ); GetListCtrl().SetItemText( index, 3, ports[portIndex].mode ); GetListCtrl().SetItemText( index, 4, ports[portIndex].priority ); GetListCtrl().SetItemText( index, 5, ports[portIndex].load ); GetListCtrl().SetItemText( index, 6, ports[portIndex].affinity ); }
return; }
|