зеркало из https://github.com/mozilla/gecko-dev.git
403 строки
11 KiB
C++
403 строки
11 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape Public License
|
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
* http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
* for the specific language governing rights and limitations under the
|
|
* NPL.
|
|
*
|
|
* The Initial Developer of this code under the NPL is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
* Reserved.
|
|
*/
|
|
|
|
#include "stdafx.h"
|
|
#include "dropmenu.h"
|
|
#include "mailqf.h"
|
|
#include "wfemsg.h"
|
|
#include "mailmisc.h"
|
|
#include "mailfrm.h"
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
// CMailQFMenuDropTarget
|
|
|
|
class CMailQFMenuDropTarget: public CDropMenuDropTarget
|
|
{
|
|
public:
|
|
CMailQFMenuDropTarget(CWnd *pOwner);
|
|
|
|
protected:
|
|
virtual DROPEFFECT OnDragEnter(CWnd * pWnd,
|
|
COleDataObject * pDataObject, DWORD dwKeyState, CPoint point);
|
|
virtual DROPEFFECT OnDragOver(CWnd * pWnd,
|
|
COleDataObject * pDataObject, DWORD dwKeyState, CPoint point );
|
|
virtual BOOL OnDrop(CWnd * pWnd, COleDataObject * pDataObject,
|
|
DROPEFFECT dropEffect, CPoint point);
|
|
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
// CMailQFButton
|
|
|
|
CMailQFButton::CMailQFButton(): CMailQFButtonParent()
|
|
{
|
|
m_pDropMenu = new CMailQFDropMenu;
|
|
m_hFolderBitmap = NULL;
|
|
m_hSelectedFolderBitmap = NULL;
|
|
}
|
|
|
|
CMailQFButton::~CMailQFButton()
|
|
{
|
|
m_pDropMenu->DestroyDropMenu();
|
|
delete m_pDropMenu;
|
|
if(m_hFolderBitmap)
|
|
DeleteObject(m_hFolderBitmap);
|
|
}
|
|
|
|
BOOL CMailQFButton::Create(const CRect & rect, CWnd* pwndParent, UINT uID)
|
|
{
|
|
CString csLabel, csTip, csStatus;
|
|
|
|
WFE_ParseButtonString( ID_MESSAGE_FILE, csStatus, csTip, csLabel );
|
|
|
|
BOOL bRtn = CMailQFButtonParent::Create(pwndParent, theApp.m_pToolbarStyle, CSize(50, 40), CSize(30, 27),
|
|
csLabel, csTip, csStatus,
|
|
IDR_MAILTHREAD, 4, CSize(23, 21), TRUE, uID, 10);
|
|
|
|
m_DropTarget.Register(this);
|
|
|
|
if(bRtn){
|
|
HINSTANCE hInst = AfxGetResourceHandle();
|
|
HDC hDC = ::GetDC(m_hWnd);
|
|
WFE_InitializeUIPalette(hDC);
|
|
m_hFolderBitmap = WFE_LoadTransparentBitmap(hInst, hDC, sysInfo.m_clrMenu, RGB(255, 0, 255),
|
|
WFE_GetUIPalette(GetParentFrame()), IDB_MAILFOLDER);
|
|
m_hSelectedFolderBitmap = WFE_LoadTransparentBitmap(hInst, hDC,sysInfo.m_clrHighlight,
|
|
RGB(255, 0, 255), WFE_GetUIPalette(GetParentFrame()), IDB_MAILFOLDEROPEN);
|
|
|
|
::ReleaseDC(m_hWnd, hDC);
|
|
}
|
|
|
|
return(bRtn);
|
|
|
|
}
|
|
|
|
|
|
void CMailQFButton::OnPaletteChanged( CWnd* pFocusWnd )
|
|
{
|
|
if (pFocusWnd != this) {
|
|
HPALETTE hPalette = WFE_GetUIPalette(GetParentFrame());
|
|
HDC hDC = ::GetDC(m_hWnd);
|
|
HPALETTE hOldPalette = ::SelectPalette(hDC, hPalette, TRUE);
|
|
::SelectPalette(hDC, hOldPalette, FALSE);
|
|
::ReleaseDC(m_hWnd, hDC);
|
|
Invalidate();
|
|
}
|
|
}
|
|
|
|
|
|
void CMailQFButton::OnAction()
|
|
{
|
|
OnBtnClicked(FALSE);
|
|
}
|
|
|
|
void CMailQFButton::BuildMenu( MSG_FolderInfo *folderInfo, CDropMenu *pMenu, UINT &nID )
|
|
{
|
|
MSG_Master *master = WFE_MSGGetMaster();
|
|
int32 iCount = MSG_GetFolderChildren( master, folderInfo, NULL, 0 );
|
|
|
|
MSG_FolderInfo **folderInfos = new MSG_FolderInfo*[iCount];
|
|
if ( iCount && folderInfos ) {
|
|
MSG_GetFolderChildren( master, folderInfo, folderInfos, iCount );
|
|
|
|
for ( int i = 0; i < iCount; i++ ) {
|
|
MSG_FolderLine folderLine;
|
|
|
|
if ( MSG_GetFolderLineById( master, folderInfos[i], &folderLine ) ) {
|
|
if ( folderLine.numChildren > 0 ) {
|
|
CDropMenu *pNewMenu = new CMailQFDropMenu;
|
|
pMenu->AppendMenu(MF_POPUP, nID, pNewMenu, FALSE, folderLine.name, FALSE, m_hFolderBitmap, m_hSelectedFolderBitmap);
|
|
nID++;
|
|
BuildMenu( folderInfos[i], pNewMenu, nID );
|
|
} else {
|
|
pMenu->AppendMenu(MF_STRING, nID, folderLine.name, FALSE, m_hFolderBitmap, m_hSelectedFolderBitmap);
|
|
nID++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void CMailQFButton::BuildMenu()
|
|
{
|
|
// *** If you change the way this menu is built, you also need to
|
|
// change CMailNewsFrame::FolderInfoFromMenuID and make it the same
|
|
// as CMailNewsFrame::UpdateMenu ***
|
|
|
|
int nCount = m_pDropMenu->GetMenuItemCount();
|
|
// clean out the menu before adding to it
|
|
for(int i = nCount - 1; i >= 0; i--)
|
|
{
|
|
m_pDropMenu->DeleteMenu(i, MF_BYPOSITION);
|
|
}
|
|
|
|
UINT nID = FIRST_MOVE_MENU_ID;
|
|
|
|
int32 iLines = MSG_GetFolderChildren (WFE_MSGGetMaster(), NULL, NULL, 0);
|
|
MSG_FolderInfo **ppFolderInfo = new MSG_FolderInfo *[iLines];
|
|
ASSERT(ppFolderInfo);
|
|
if (ppFolderInfo)
|
|
{
|
|
MSG_GetFolderChildren (WFE_MSGGetMaster(), NULL, ppFolderInfo, iLines);
|
|
for (int i = 0; i < iLines; i++)
|
|
{
|
|
MSG_FolderLine folderLine;
|
|
if (MSG_GetFolderLineById (WFE_MSGGetMaster(), ppFolderInfo[i], &folderLine)) {
|
|
if ( folderLine.flags & MSG_FOLDER_FLAG_MAIL ) {
|
|
if (nID > FIRST_MOVE_MENU_ID)
|
|
m_pDropMenu->AppendMenu(MF_SEPARATOR, 0, "", FALSE, NULL);
|
|
BuildMenu( ppFolderInfo[i], m_pDropMenu, nID );
|
|
}
|
|
}
|
|
}
|
|
delete ppFolderInfo;
|
|
}
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP( CMailQFButton, CMailQFButtonParent)
|
|
ON_MESSAGE( QF_DRAGGINGBOOKMARK, OnQuickfileDrag )
|
|
ON_MESSAGE( DM_DROPOCCURRED, OnDrop )
|
|
#ifdef ON_COMMAND_RANGE
|
|
ON_COMMAND_RANGE(FIRST_MOVE_MENU_ID, LAST_MOVE_MENU_ID, OnMoveOrCopy )
|
|
ON_COMMAND_RANGE(FIRST_COPY_MENU_ID, LAST_COPY_MENU_ID, OnMoveOrCopy )
|
|
ON_WM_SYSCOLORCHANGE()
|
|
#endif
|
|
END_MESSAGE_MAP()
|
|
|
|
#ifndef ON_COMMAND_RANGE
|
|
|
|
BOOL CMailQFButton::OnCommand( WPARAM wParam, LPARAM lParam )
|
|
{
|
|
UINT nID = wParam;
|
|
|
|
if ( nID >= FIRST_MOVE_MENU_ID && nID <= LAST_MOVE_MENU_ID ) {
|
|
OnMoveOrCopy( nID );
|
|
return TRUE;
|
|
}
|
|
if ( nID >= FIRST_COPY_MENU_ID && nID <= LAST_COPY_MENU_ID ) {
|
|
OnMoveOrCopy( nID );
|
|
return TRUE;
|
|
}
|
|
return CMailQFButtonParent::OnCommand( wParam, lParam );
|
|
}
|
|
|
|
#endif
|
|
|
|
void CMailQFButton::OnBtnClicked(BOOL bDragging)
|
|
{
|
|
RECT rc;
|
|
GetWindowRect(&rc);
|
|
|
|
if (!m_bMenuShowing) {
|
|
BuildMenu( );
|
|
|
|
CMailQFMenuDropTarget *dropTarget = new CMailQFMenuDropTarget(m_pDropMenu);
|
|
|
|
m_bMenuShowing = TRUE;
|
|
m_pDropMenu->TrackDropMenu(this, rc.left, rc.bottom+1, bDragging, dropTarget);
|
|
}
|
|
}
|
|
|
|
LRESULT CMailQFButton::OnQuickfileDrag(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
if ( m_eState != eBUTTON_DOWN ) {
|
|
//keep button feedback in mousedown state
|
|
m_eState = eBUTTON_DOWN;
|
|
RedrawWindow();
|
|
|
|
OnBtnClicked(TRUE);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
LRESULT CMailQFButton::OnDrop(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
LRESULT res = 0;
|
|
|
|
UINT nID = LOWORD(lParam);
|
|
|
|
// Dig out the frame that initiated the drag.-
|
|
HGLOBAL hData = (HGLOBAL) wParam;
|
|
MailNewsDragData *pData = (MailNewsDragData *) GlobalLock( hData );
|
|
|
|
LPMAILFRAME pMailFrame = NULL;
|
|
LPUNKNOWN pUnk = (LPUNKNOWN) MSG_GetFEData( pData->m_pane );
|
|
|
|
if ( pUnk ) {
|
|
pUnk->QueryInterface( IID_IMailFrame, (LPVOID *) &pMailFrame );
|
|
|
|
if (pMailFrame) {
|
|
CMailNewsFrame *pFrame = pMailFrame->GetMailNewsFrame();
|
|
|
|
if ( pFrame ) {
|
|
res = pFrame->SendMessage( WM_COMMAND, (WPARAM) nID, 0 );
|
|
}
|
|
}
|
|
}
|
|
|
|
GlobalUnlock( hData );
|
|
return res;
|
|
}
|
|
|
|
void CMailQFButton::OnMoveOrCopy( UINT nID )
|
|
{
|
|
GetParentFrame()->SendMessage( WM_COMMAND, (WPARAM) nID, 0 );
|
|
}
|
|
|
|
void CMailQFButton::OnSysColorChange( )
|
|
{
|
|
if(m_hFolderBitmap)
|
|
{
|
|
VERIFY(::DeleteObject(m_hFolderBitmap));
|
|
VERIFY(::DeleteObject(m_hSelectedFolderBitmap));
|
|
|
|
HINSTANCE hInstance = AfxGetResourceHandle();
|
|
HDC hDC = ::GetDC(m_hWnd);
|
|
WFE_InitializeUIPalette(hDC);
|
|
|
|
m_hFolderBitmap = WFE_LoadTransparentBitmap(hInstance, hDC, sysInfo.m_clrMenu, RGB(255, 0, 255),
|
|
WFE_GetUIPalette(GetParentFrame()), IDB_BOOKMARK_FOLDER2);
|
|
m_hSelectedFolderBitmap = WFE_LoadTransparentBitmap(hInstance, hDC,sysInfo.m_clrHighlight,
|
|
RGB(255, 0, 255), WFE_GetUIPalette(GetParentFrame()), IDB_BOOKMARK_FOLDER2);
|
|
|
|
::ReleaseDC(m_hWnd, hDC);
|
|
}
|
|
|
|
CMailQFButtonParent::OnSysColorChange();
|
|
}
|
|
/////////////////////////////////////////////////////////////////////
|
|
// CMailQFDropTarget
|
|
|
|
DROPEFFECT CMailQFDropTarget::OnDragEnter(CWnd * pWnd,
|
|
COleDataObject * pDataObject, DWORD dwKeyState, CPoint point)
|
|
{
|
|
DROPEFFECT deReturn = DROPEFFECT_NONE;
|
|
// Only interested in bookmarks
|
|
if (pDataObject->IsDataAvailable(
|
|
::RegisterClipboardFormat(NETSCAPE_MESSAGE_FORMAT)))
|
|
{
|
|
pWnd->SendMessage(QF_DRAGGINGBOOKMARK, 0, 0);
|
|
}
|
|
return(deReturn);
|
|
|
|
} // END OF FUNCTION CMailQFDropTarget::OnDragEnter()
|
|
|
|
DROPEFFECT CMailQFDropTarget::OnDragOver(CWnd * pWnd,
|
|
COleDataObject * pDataObject, DWORD dwKeyState, CPoint point)
|
|
{
|
|
DROPEFFECT deReturn = DROPEFFECT_NONE;
|
|
|
|
return(deReturn);
|
|
|
|
} // END OF FUNCTION CMailQFDropTarget::OnDragOver()
|
|
|
|
BOOL CMailQFDropTarget::OnDrop(CWnd * pWnd,
|
|
COleDataObject * pDataObject, DROPEFFECT dropEffect, CPoint point)
|
|
{
|
|
BOOL bRtn = FALSE;
|
|
|
|
return(bRtn);
|
|
|
|
} // END OF FUNCTION CMailQFDropTarget::OnDrop()
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
// CMailQFDropMenu
|
|
|
|
CDropMenuDropTarget *CMailQFDropMenu::GetDropMenuDropTarget(CWnd *pOwner)
|
|
{
|
|
return new CMailQFMenuDropTarget(pOwner);
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP( CMailQFDropMenu, CMailQFDropMenuParent )
|
|
ON_WM_LBUTTONUP()
|
|
END_MESSAGE_MAP()
|
|
|
|
void CMailQFDropMenu::OnLButtonUp(UINT nFlags, CPoint point)
|
|
{
|
|
MenuSelectionType eSelType;
|
|
int nSelection = FindSelection(point, eSelType);
|
|
|
|
if(nSelection != -1)
|
|
{
|
|
CDropMenuItem *pItem = (CDropMenuItem *)m_pMenuItemArray[nSelection];
|
|
#ifdef _WIN32
|
|
SendMessage(WM_COMMAND, MAKEWPARAM(pItem->GetCommand(), 0), 0);
|
|
#else
|
|
SendMessage(WM_COMMAND, (WPARAM)pItem->GetCommand(), MAKELPARAM( m_hWnd, 0) );
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
// CMailQFMenuDropTarget
|
|
|
|
CMailQFMenuDropTarget::CMailQFMenuDropTarget(CWnd *pOwner): CDropMenuDropTarget( pOwner )
|
|
{
|
|
}
|
|
|
|
|
|
DROPEFFECT CMailQFMenuDropTarget::OnDragEnter(CWnd * pWnd, COleDataObject * pDataObject,
|
|
DWORD dwKeyState, CPoint point)
|
|
{
|
|
DROPEFFECT deReturn = DROPEFFECT_NONE;
|
|
|
|
// Only interested in bookmarks now
|
|
if (pDataObject->IsDataAvailable(
|
|
::RegisterClipboardFormat(NETSCAPE_MESSAGE_FORMAT)))
|
|
{
|
|
deReturn = DROPEFFECT_MOVE;
|
|
}
|
|
|
|
return(deReturn);
|
|
|
|
}
|
|
|
|
DROPEFFECT CMailQFMenuDropTarget::OnDragOver(CWnd * pWnd, COleDataObject * pDataObject,
|
|
DWORD dwKeyState, CPoint point )
|
|
{
|
|
DROPEFFECT deReturn = DROPEFFECT_NONE;
|
|
|
|
// Only interested in bookmarks now
|
|
if (pDataObject->IsDataAvailable(
|
|
::RegisterClipboardFormat(NETSCAPE_MESSAGE_FORMAT)))
|
|
{
|
|
m_pOwner->SendMessage(DT_DRAGGINGOCCURRED, (WPARAM) 0, MAKELPARAM(point.x, point.y));
|
|
deReturn = DROPEFFECT_MOVE;
|
|
}
|
|
|
|
return(deReturn);
|
|
|
|
}
|
|
|
|
BOOL CMailQFMenuDropTarget::OnDrop(CWnd * pWnd, COleDataObject * pDataObject,
|
|
DROPEFFECT dropEffect, CPoint point)
|
|
{
|
|
BOOL bRtn = FALSE;
|
|
|
|
// Only interested in bookmarks now
|
|
CLIPFORMAT cfMessage = ::RegisterClipboardFormat(NETSCAPE_MESSAGE_FORMAT);
|
|
if (pDataObject->IsDataAvailable(cfMessage))
|
|
{
|
|
HGLOBAL hContent = pDataObject->GetGlobalData(cfMessage);
|
|
pWnd->SendMessage(DT_DROPOCCURRED, (WPARAM) hContent, MAKELPARAM( point.x, point.y ) );
|
|
}
|
|
|
|
return(bRtn);
|
|
}
|