253 lines
5.4 KiB
C++
253 lines
5.4 KiB
C++
#include "mbftpch.h"
|
||
#include "combotb.h"
|
||
|
||
const static COLORREF EditBack = RGB(255, 255, 255);
|
||
const static COLORREF EditFore = RGB(0, 0, 0 );
|
||
const static int FtTBHMargin = 5;
|
||
const static int FtTBVMargin = 5;
|
||
const static int FtHGap = 3;
|
||
|
||
|
||
CComboToolbar::CComboToolbar() :
|
||
m_Combobox(NULL),
|
||
m_iCount(0),
|
||
m_Buttons(NULL),
|
||
m_iNumButtons(0)
|
||
{
|
||
m_nAlignment = Center;
|
||
}
|
||
|
||
CComboToolbar::~CComboToolbar()
|
||
{
|
||
delete [] m_Buttons;
|
||
}
|
||
|
||
|
||
typedef CBitmapButton * LPBITMAPBTN;
|
||
|
||
BOOL CComboToolbar::Create(HWND hwndParent, struct Buttons *buttons,
|
||
int iNumButtons, LPVOID pOwner)
|
||
{
|
||
int i;
|
||
BOOL fRet;
|
||
|
||
m_pOwner = pOwner;
|
||
if (!CToolbar::Create(hwndParent))
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
m_iNumButtons = iNumButtons;
|
||
m_hMargin = FtTBHMargin;
|
||
m_vMargin = FtTBVMargin;
|
||
m_gap = FtHGap;
|
||
m_bMinDesiredSize = TRUE;
|
||
m_bHasCenterChild = TRUE;
|
||
m_uRightIndex = m_iNumButtons + 1;
|
||
|
||
DBG_SAVE_FILE_LINE
|
||
m_Buttons = (CGenWindow**) new LPBITMAPBTN [m_iNumButtons];
|
||
if (NULL != m_Buttons)
|
||
{
|
||
::ZeroMemory(m_Buttons, m_iNumButtons * sizeof(LPBITMAPBTN));
|
||
|
||
for (i = 0; i < m_iNumButtons; i++)
|
||
{
|
||
if (buttons[i].idCommand)
|
||
{
|
||
DBG_SAVE_FILE_LINE
|
||
m_Buttons[i] = new CBitmapButton();
|
||
if (NULL != m_Buttons[i])
|
||
{
|
||
fRet = ((CBitmapButton*)m_Buttons[i])->Create(GetWindow(), buttons[i].idCommand,
|
||
g_hDllInst, buttons[i].idbStates, TRUE,
|
||
buttons[i].nInputStates, buttons[i].nCustomStates, NULL);
|
||
m_Buttons[i]->SetTooltip(buttons[i].pszTooltip);
|
||
ASSERT(fRet);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
DBG_SAVE_FILE_LINE
|
||
CSeparator *pSep = new CSeparator();
|
||
m_Buttons[i] = pSep;
|
||
if (NULL != pSep)
|
||
{
|
||
fRet = pSep->Create(GetWindow(), CSeparator::Blank);
|
||
ASSERT (fRet);
|
||
}
|
||
}
|
||
m_Buttons[i]->Release();
|
||
}
|
||
}
|
||
|
||
DBG_SAVE_FILE_LINE
|
||
m_Combobox = new CComboBox();
|
||
if (NULL != m_Combobox)
|
||
{
|
||
if (m_Combobox->Create(GetWindow(), 100, CBS_AUTOHSCROLL|CBS_DROPDOWNLIST,
|
||
NULL, NULL))
|
||
{
|
||
m_Combobox->SetColors(CreateSolidBrush(EditBack), EditBack, EditFore);
|
||
m_Combobox->SetTooltip((LPSTR)IDS_RECEIVER_TT);
|
||
m_Combobox->SetFont((HFONT)::GetStockObject(DEFAULT_GUI_FONT));
|
||
m_Combobox->Release();
|
||
}
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
void CComboToolbar::OnDesiredSizeChanged()
|
||
{
|
||
ScheduleLayout();
|
||
}
|
||
|
||
|
||
LRESULT CComboToolbar::ProcessMessage(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||
{
|
||
switch(message)
|
||
{
|
||
HANDLE_MSG(hwnd, WM_COMMAND, OnCommand);
|
||
|
||
default:
|
||
break;
|
||
}
|
||
return (CToolbar::ProcessMessage(hwnd, message, wParam, lParam));
|
||
}
|
||
|
||
|
||
void CComboToolbar::OnCommand(HWND hwnd, int wId, HWND hwndCtl, UINT codeNotify)
|
||
{
|
||
if (m_pOwner)
|
||
{
|
||
CAppletWindow *pWindow = (CAppletWindow*)m_pOwner;
|
||
pWindow->OnCommand((WORD)wId, hwndCtl, (WORD)codeNotify);
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
WARNING_OUT(("CComboToolbar::OnCommand--Received unhandlable message.\n"));
|
||
}
|
||
}
|
||
|
||
|
||
void CComboToolbar::HandlePeerNotification(T120ConfID confID, T120NodeID nodeID,
|
||
PeerMsg *pMsg)
|
||
{
|
||
int iLen, iIndex, iCount;
|
||
char szName[MAX_PATH];
|
||
|
||
if (pMsg->m_NodeID != nodeID)
|
||
{
|
||
iLen = T120_GetNodeName(confID, pMsg->m_NodeID, szName, MAX_PATH);
|
||
if (iLen)
|
||
{
|
||
ASSERT (iLen < MAX_PATH);
|
||
MEMBER_ID nMemberID = MAKE_MEMBER_ID(pMsg->m_MBFTPeerID, pMsg->m_NodeID);
|
||
|
||
if (pMsg->m_bPeerAdded)
|
||
{
|
||
if (m_iCount == 0)
|
||
{
|
||
char szAll[MAX_PATH];
|
||
::LoadString(g_hDllInst, IDS_ALL_RECEIVER, szAll, MAX_PATH);
|
||
m_Combobox->AddText(TEXT(szAll));
|
||
WARNING_OUT(("Insert ALL"));
|
||
}
|
||
m_Combobox->AddText(szName, nMemberID);
|
||
WARNING_OUT(("Insert %s.\n", szName));
|
||
m_iCount++;
|
||
}
|
||
else
|
||
{
|
||
// Scan through the whole list to find the user
|
||
iCount = m_Combobox->GetNumItems();
|
||
for (iIndex = 0; iIndex < iCount; iIndex++)
|
||
{
|
||
if (nMemberID == (MEMBER_ID)m_Combobox->GetUserData(iIndex))
|
||
break;
|
||
|
||
}
|
||
|
||
if (iIndex < iCount)
|
||
{ // found
|
||
m_Combobox->RemoveItem(iIndex);
|
||
WARNING_OUT(("delete %s", szName));
|
||
m_iCount--;
|
||
if (0 == m_iCount)
|
||
{
|
||
ASSERT (m_Combobox->GetNumItems() == 1);
|
||
m_Combobox->RemoveItem(0);
|
||
WARNING_OUT(("delete ALL"));
|
||
}
|
||
}
|
||
else
|
||
{
|
||
WARNING_OUT(("Can't find to be deleted peer, %s.\n", szName));
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
WARNING_OUT(("Can't find node name for nConfID=%d, nNodeID=%d.\n",
|
||
(UINT) confID, (UINT) pMsg->m_NodeID));
|
||
}
|
||
}
|
||
else
|
||
{ // delete all items. Bacause MBFTEngine does not explicitly send PeerNotify message for every peer
|
||
// when the node leaves message, so it is up to the host to remove all the peers during its close.
|
||
if (!pMsg->m_bPeerAdded)
|
||
{
|
||
iCount = m_Combobox->GetNumItems();
|
||
for (iIndex = iCount - 1; iIndex >= 0; iIndex--)
|
||
{
|
||
m_Combobox->RemoveItem(iIndex);
|
||
}
|
||
m_iCount = 0;
|
||
}
|
||
}
|
||
|
||
if (m_iCount)
|
||
{
|
||
// Default select "ALL"
|
||
m_Combobox->SetSelectedIndex(0);
|
||
}
|
||
else
|
||
{
|
||
// Deselect
|
||
m_Combobox->SetSelectedIndex(-1);
|
||
}
|
||
}
|
||
|
||
|
||
//
|
||
// Return item selected and its associated itemdata
|
||
//
|
||
UINT CComboToolbar::GetSelectedItem(LPARAM *ItemData)
|
||
{
|
||
int iIndex = m_Combobox->GetSelectedIndex();
|
||
if (iIndex >= 0)
|
||
{
|
||
*ItemData = m_Combobox->GetUserData(iIndex);
|
||
}
|
||
return iIndex;
|
||
}
|
||
|
||
|
||
static const int c_iCommands[] =
|
||
{ IDM_ADD_FILES, IDM_REMOVE_FILES, IDM_SEND_ALL, IDM_SEND_ONE, IDM_STOP_SENDING,
|
||
IDM_OPEN_RECV_FOLDER};
|
||
|
||
void CComboToolbar::UpdateButton(int *iFlags)
|
||
{
|
||
for (int iIndex = 0; iIndex < m_iNumButtons; iIndex++)
|
||
{
|
||
if (NULL != m_Buttons[iIndex])
|
||
{
|
||
::EnableWindow(m_Buttons[iIndex]->GetWindow(), iFlags[iIndex]);
|
||
}
|
||
}
|
||
}
|
||
|