windows-nt/Source/XPSP1/NT/net/wlbs/nlbmgr/exe/righttopview.cpp
2020-09-26 16:20:57 +08:00

201 lines
5 KiB
C++

#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;
}