Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

253 lines
5.4 KiB

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