l2-unlegits/l2ooghelper/TradeP2PDlg.cpp
2012-02-01 05:25:08 +00:00

290 lines
7.9 KiB
C++
Raw Blame History

#include "stdafx.h"
#include "TradeP2PDlg.h"
#include "Logger.h"
#include "Resource.h"
#include "windowUtils.h"
#include "L2Client.h"
#include "DBLayer.h"
extern HINSTANCE g_hInst;
// extern
long long int BuySellDlg_RequestItemCount( HWND hDlg, TradeItem *it );
TradeP2PDlg::TradeP2PDlg( void *pvL2Client )
{
m_pvL2Client = pvL2Client;
m_hWndParent = NULL;
m_hDlg = NULL;
m_ownInv = NULL;
m_youGive = NULL;
m_youRecv = NULL;
m_hWndYourInv = m_hWndYouGive = m_hWndYouRecv =
m_hWndStaticOtherPlayerName = NULL;
m_partnerName[0] = 0;
}
TradeP2PDlg::~TradeP2PDlg()
{
destroyDialog();
}
BOOL TradeP2PDlg::createDialog( HWND hWndParent )
{
m_hWndParent = hWndParent;
m_hDlg = CreateDialogParam( g_hInst, MAKEINTRESOURCE(IDD_TRADEP2P),
hWndParent, &TradeP2PDlg::TradeP2PDlgProc, (LPARAM)this );
if( m_hDlg ) return TRUE;
// error!
m_hWndParent = NULL;
return FALSE;
}
void TradeP2PDlg::destroyDialog()
{
clearContents();
if( m_hDlg )
{
DestroyWindow( m_hDlg );
m_hDlg = NULL;
}
}
void TradeP2PDlg::showWindow( bool bShow )
{
if( m_hDlg )
{
if( bShow ) ShowWindow( m_hDlg, SW_SHOWNORMAL );
else ShowWindow( m_hDlg, SW_HIDE );
}
}
const wchar_t *TradeP2PDlg::getPartnerName() const
{
return (const wchar_t *)m_partnerName;
}
void TradeP2PDlg::clearContents()
{
// clear lists
if( m_ownInv )
{
delete m_ownInv;
m_ownInv = NULL;
}
if( m_youGive )
{
delete m_youGive;
m_youGive = NULL;
}
if( m_youRecv )
{
delete m_youRecv;
m_youRecv = NULL;
}
// clear partner name
m_partnerName[0] = 0;
}
void TradeP2PDlg::tradeStart( const TradeItemsList *ownInv, const wchar_t *partnerName )
{
clearContents();
// create lists
m_ownInv = new TradeItemsList();
m_youGive = new TradeItemsList();
m_youRecv = new TradeItemsList();
// copy *ourInv trade list to our inv
int i;
for( i=0; i<ownInv->itemCount; i++ )
{
TradeItem it = ownInv->item[i];
m_ownInv->addItem( it );
}
// save partner name
memset( m_partnerName, 0, sizeof(m_partnerName) );
wcsncpy( m_partnerName, partnerName, 255 );
m_partnerName[255] = 0;
// update window
showWindow();
wnd_updateLists( this );
}
void TradeP2PDlg::tradeOwnAdd( const TradeItem& it )
{
m_youGive->addItem( it );
TradeP2PDlg::wnd_updateLists( this );
}
void TradeP2PDlg::tradeOtherAdd( const TradeItem& it )
{
m_youRecv->addItem( it );
TradeP2PDlg::wnd_updateLists( this );
}
void TradeP2PDlg::tradeDone()
{
clearContents();
showWindow( false );
}
/*
CONTROL "",IDC_LV_INV,"SysListView32",...
CONTROL "",IDC_LV_SEND,"SysListView32",...
CONTROL "",IDC_LV_RECV,"SysListView32",...
CONTROL "OK",IDOK,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,8,324,92,24
CONTROL "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",IDCANCEL,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,146,324,92,24
CONTROL "<22><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE,4,1,238,9
CONTROL "<22><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:",IDC_STATIC,"Static",WS_CHILD|WS_VISIBLE,6,121,242,9
CONTROL "%username% <20><><EFBFBD><EFBFBD> <20><><EFBFBD>:",IDC_ST_TRADECHAR,"Static",WS_CHILD|WS_VISIBLE,6,219,242,9
*/
INT_PTR CALLBACK TradeP2PDlg::TradeP2PDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch( uMsg )
{
case WM_INITDIALOG:
{
// store pointer class as window userdata
class TradeP2PDlg *pcls = (class TradeP2PDlg *)lParam;
SetWindowLongPtr( hDlg, GWLP_USERDATA, (LONG_PTR)lParam );
// get handles to child windows
pcls->m_hWndYourInv = GetDlgItem( hDlg, IDC_LV_INV );
pcls->m_hWndYouGive = GetDlgItem( hDlg, IDC_LV_SEND );
pcls->m_hWndYouRecv = GetDlgItem( hDlg, IDC_LV_RECV );
pcls->m_hWndStaticOtherPlayerName = GetDlgItem( hDlg, IDC_ST_TRADECHAR );
// initialize child list-views
// initialize your inv LV
WULV_SetExtStyle( pcls->m_hWndYourInv, true, true );
WULV_InsertColumn( pcls->m_hWndYourInv, TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"), 150, 0 );
WULV_InsertColumn( pcls->m_hWndYourInv, TEXT("<EFBFBD>-<2D><>"), 50, 1 );
// initialize you give LV
WULV_SetExtStyle( pcls->m_hWndYouGive, true, true );
WULV_InsertColumn( pcls->m_hWndYouGive, TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"), 150, 0 );
WULV_InsertColumn( pcls->m_hWndYouGive, TEXT("<EFBFBD>-<2D><>"), 50, 1 );
// initialize you recv LV
WULV_SetExtStyle( pcls->m_hWndYouRecv, true, true );
WULV_InsertColumn( pcls->m_hWndYouRecv, TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"), 150, 0 );
WULV_InsertColumn( pcls->m_hWndYouRecv, TEXT("<EFBFBD>-<2D><>"), 50, 1 );
// last, update lists contents
pcls->wnd_updateLists( pcls );
} break;
case WM_COMMAND:
{
class TradeP2PDlg *pcls = (class TradeP2PDlg *)GetWindowLongPtr( hDlg, GWLP_USERDATA );
switch( LOWORD(wParam) )
{
case IDOK: pcls->wnd_OnOK( pcls ); break;
case IDCANCEL: pcls->wnd_OnCancel( pcls ); break;
}
} break;
case WM_NOTIFY:
{
class TradeP2PDlg *pcls = (class TradeP2PDlg *)GetWindowLongPtr( hDlg, GWLP_USERDATA );
LPNMHDR pnmh = (LPNMHDR)lParam;
if( pnmh->code == NM_DBLCLK )
{
if( pnmh->hwndFrom == pcls->m_hWndYourInv )
{
// The iItem, iSubItem, and ptAction members of this structure contain information about the item.
LPNMITEMACTIVATE lpnmitem = (LPNMITEMACTIVATE)lParam;
wnd_OnInvDblClick( pcls, lpnmitem->iItem );
}
}
} break;
case WM_KEYDOWN:
{
log_error( LOG_ERROR, "TradeP2PDlgProc(): WM_KEYDOWN\n" );
} break;
default: return FALSE; break;
}
return TRUE;
}
void TradeP2PDlg::wnd_fill_LV_from_list( HWND hWndLV, TradeItemsList *list )
{
TCHAR text[256] = {0};
int i = 0;
ListView_DeleteAllItems( hWndLV );
if( !list ) return;
for( i=0; i<list->itemCount; i++ )
{
// insert item name
TCHAR itemName[256] = {0};
DBLayer_getItemName( list->item[i].itemID, itemName, 256 );
if( list->item[i].enchantLevel > 0 )
wsprintf( text, TEXT("+%d %s"), list->item[i].enchantLevel, itemName );
else
wcscpy( text, itemName );
// item lParam... should be item index in array, i think
int added_item = WULV_InsertItem( hWndLV, text, 999, i );
if( added_item == -1 ) continue;
// insert item count
wsprintf( text, TEXT("%I64d"), list->item[i].count );
WULV_SetItem( hWndLV, text, added_item, 1 );
}
}
void TradeP2PDlg::wnd_updateLists( TradeP2PDlg *pcls )
{
wnd_fill_LV_from_list( pcls->m_hWndYourInv, pcls->m_ownInv );
wnd_fill_LV_from_list( pcls->m_hWndYouGive, pcls->m_youGive );
wnd_fill_LV_from_list( pcls->m_hWndYouRecv, pcls->m_youRecv );
// update partner name
TCHAR wndText[256] = {0};
wsprintf( wndText, TEXT("Partner: %s"), pcls->m_partnerName );
SetWindowText( pcls->m_hWndStaticOtherPlayerName, wndText );
}
void TradeP2PDlg::wnd_OnOK( TradeP2PDlg *pcls )
{
class L2Client *pcl = (class L2Client *)pcls->m_pvL2Client;
// confirm trade
pcl->send_TradeDone( 1 );
}
void TradeP2PDlg::wnd_OnCancel( TradeP2PDlg *pcls )
{
class L2Client *pcl = (class L2Client *)pcls->m_pvL2Client;
// cancel trade
pcl->send_TradeDone( 0 );
}
void TradeP2PDlg::wnd_OnInvDblClick( TradeP2PDlg *pcls, int iItem )
{
class L2Client *pcl = (class L2Client *)pcls->m_pvL2Client;
// get TradeItem for clicked item
int idx = WULV_GetItemLPARAM( pcls->m_hWndYourInv, iItem );
if( idx < 0 || idx >= pcls->m_ownInv->itemCount ) return;
TradeItem it = pcls->m_ownInv->item[idx];
// request count to give to other player
long long move_count = BuySellDlg_RequestItemCount( pcls->m_hDlg, &it );
if( move_count == 0 ) return; // give cancelled
// reduce own item count
pcls->m_ownInv->item[idx].count -= move_count;
// if own item count zeroed, remove whole cell
if( pcls->m_ownInv->item[idx].count <= 0 )
pcls->m_ownInv->removeCellAndShift( idx );
// send AddTradeItem
pcl->send_AddTradeItem(
pcls->m_ownInv->listID, // 0/*tradeID*/, //trade ID - possible partner OID?
it.objectID,
move_count );
// update lists to display reduced own item count (or whole removed item)
TradeP2PDlg::wnd_updateLists( pcls );
}