gecko-dev/cmd/winfe/mailqf.cpp
1998-03-28 02:44:41 +00:00

403 lines
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);
}