home *** CD-ROM | disk | FTP | other *** search
- /* -*- 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);
- }
-