gecko-dev/cmd/winfe/srchfrm.cpp
1998-06-22 21:19:46 +00:00

2701 lines
67 KiB
C++
Executable File

/* -*- 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 "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
* the License for the specific language governing rights and limitations
* under the License.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is Netscape Communications
* Corporation. Portions created by Netscape are Copyright (C) 1996
* Netscape Communications Corporation. All Rights Reserved.
*/
// srchfrm.cpp : implementation file
//
#include "stdafx.h"
#include "fldrfrm.h"
#include "thrdfrm.h"
#include "msgfrm.h"
#include "abdefn.h"
#include "addrbook.h"
#include "wfemsg.h"
#include "dirprefs.h"
#include "xp_time.h"
#include "xplocale.h"
#include "template.h"
#include "dateedit.h"
#include "apimsg.h"
#include "nethelp.h"
#include "xp_help.h"
#include "fegui.h"
#include "intl_csi.h"
#include "msg_srch.h"
#include "srchobj.h"
#include "shcut.h"
#include "msgcom.h"
#include "mailqf.h"
#include "srchfrm.h"
#include "advprosh.h"
#define SEARCH_GROW_HEIGHT 200
#define SCOPE_SELECTED 0
#define SCOPE_ALL_MAIL 1
#define SCOPE_SUBSCRIBED_NEWS 2
#define SCOPE_ALL_NEWS 3
#define DEF_VISIBLE_COLUMNS 4
#define LDAPSEARCH_SOURCETARGET_FORMAT "Netscape LDAP Search source-target"
#define NETSCAPE_SEARCH_FORMAT "Netscape Search"
CSearchFrame *g_pSearchWindow = NULL;
#if 0 // MW fix
CLDAPSearchFrame *g_pLDAPSearchWindow = NULL;
#endif
#ifndef _AFXDLL
#undef new
#endif
IMPLEMENT_DYNCREATE(CSearchView, COutlinerView)
#if 0 // MW fix
IMPLEMENT_DYNCREATE(CLDAPSearchView, COutlinerView)
#endif
#ifndef _AFXDLL
#define new DEBUG_NEW
#endif
// Minor space saver
static _TCHAR szResultText[64];
/////////////////////////////////////////////////////////////////////////////
// CSearchBar
static void SlideWindow( CWnd *pWnd, int dx, int dy )
{
CRect rect;
CWnd *parent;
pWnd->GetWindowRect(&rect);
if (parent = pWnd->GetParent())
parent->ScreenToClient(&rect);
rect.top += dy;
rect.left += dx;
rect.bottom += dy;
rect.right += dx;
pWnd->MoveWindow(&rect, TRUE);
}
static void GrowWindow( CWnd *pWnd, int dx, int dy )
{
CRect rect;
CWnd *parent;
pWnd->GetWindowRect(&rect);
if (parent = pWnd->GetParent())
parent->ScreenToClient(&rect);
rect.bottom += dy;
rect.right += dx;
pWnd->MoveWindow(&rect, TRUE);
}
CSearchBar::CSearchBar()
{
m_iMoreCount = 0;
m_iHeight = 0;
m_iWidth = 0;
m_bLogicType = 0;
}
CSearchBar::~CSearchBar()
{
}
int CSearchBar::GetHeightNeeded()
{
CRect rect, rect2, rect3;
CWnd *widget = GetDlgItem(IDC_MORE);
ASSERT(widget);
GetWindowRect(&rect);
widget->GetWindowRect(&rect2);
CWnd *widget2 = NULL;
if(m_bLDAP)
{
widget2 = GetDlgItem(IDC_ADVANCED_OPTIONS);
}
else
{
widget2 = GetDlgItem(IDC_SEARCHHELP);
}
if (widget2)
widget2->GetWindowRect(&rect3);
else
return 0;
//because of help button
int nHeight = (rect3.bottom > rect2.bottom) ? rect3.bottom : rect2.bottom;
return nHeight - rect.top + 8;
}
MSG_ScopeAttribute CSearchBar::DetermineScope( DWORD dwItemData )
{
MSG_Pane *pPane = NULL;
MSG_ScopeAttribute scope = scopeMailFolder;
if ( m_bLDAP ) {
scope = scopeLdapDirectory;
} else {
MSG_FolderLine folderLine;
if (MSG_GetFolderLineById(WFE_MSGGetMaster(), (MSG_FolderInfo *) dwItemData, &folderLine)) {
if (folderLine.flags & MSG_FOLDER_FLAG_MAIL) {
scope = scopeMailFolder; // Yeah, it's redundant
} else if (folderLine.flags & (MSG_FOLDER_FLAG_NEWS_HOST|MSG_FOLDER_FLAG_NEWSGROUP)) {
scope = scopeNewsgroup;
}
}
}
return scope;
}
void CSearchBar::UpdateAttribList()
{
CComboBox* combo;
int iScopeCurSel;
combo = (CComboBox *) GetDlgItem( IDC_COMBO_SCOPE );
iScopeCurSel = combo->GetCurSel();
DWORD dwItemData = combo->GetItemData(iScopeCurSel);
MSG_ScopeAttribute scope = DetermineScope( dwItemData );
m_searchObj.UpdateAttribList (scope);
}
void CSearchBar::InitializeAttributes (MSG_SearchValueWidget widgetValue, MSG_SearchAttribute attribValue)
{
m_searchObj.InitializeAttributes (widgetValue, attribValue);
}
void CSearchBar::UpdateOpList()
{
CComboBox* combo;
int iScopeCurSel;
combo = (CComboBox *) GetDlgItem( IDC_COMBO_SCOPE );
iScopeCurSel = combo->GetCurSel();
DWORD dwItemData = combo->GetItemData(iScopeCurSel);
MSG_ScopeAttribute scope = DetermineScope( dwItemData );
m_searchObj.UpdateOpList (scope);
}
void CSearchBar::UpdateOpList(int iRow)
{
CComboBox* combo;
int iScopeCurSel;
combo = (CComboBox *) GetDlgItem( IDC_COMBO_SCOPE );
iScopeCurSel = combo->GetCurSel();
DWORD dwItemData = combo->GetItemData(iScopeCurSel);
MSG_ScopeAttribute scope = DetermineScope( dwItemData );
m_searchObj.UpdateOpList (iRow, scope);
}
int CSearchBar::More()
{
int dy = 0;
dy = m_searchObj.More (&m_iMoreCount, m_bLogicType);
#ifndef _WIN32
m_sizeFixedLayout.cy = GetHeightNeeded();
#endif
return dy;
}
int CSearchBar::ChangeLogicText()
{
m_searchObj.ChangeLogicText (m_iMoreCount, m_bLogicType);
return 1;
}
int CSearchBar::Fewer()
{
int dy = 0;
dy = m_searchObj.Fewer(&m_iMoreCount, m_bLogicType);
#ifndef _WIN32
m_sizeFixedLayout.cy = GetHeightNeeded();
#endif
return dy;
}
void CSearchBar::Advanced()
{
}
void CSearchBar::OnAndOr()
{
m_searchObj.OnAndOr (m_iMoreCount, &m_bLogicType);
}
int CSearchBar::ClearSearch(BOOL bIsLDAPSearch)
{
int dy = 0, res = 0;
res = m_searchObj.ClearSearch (&m_iMoreCount, bIsLDAPSearch);
//We need to tell the frame to shrink
if ( !m_iMoreCount && !res)
{
CRect rect;
GetParent()->GetWindowRect(&rect);
if (rect.Height() > m_iOrigFrameHeight)
res = (m_iOrigFrameHeight - rect.Height()); //We need to tell the frame to shrink
}
UpdateAttribList();
UpdateOpList();
m_searchObj.ReInitializeWidgets();
#ifndef _WIN32
m_sizeFixedLayout.cy = GetHeightNeeded();
#endif
return res;
}
void CSearchBar::BuildQuery(MSG_Pane* searchPane)
{
m_searchObj.BuildQuery (searchPane, m_iMoreCount, m_bLogicType);
}
/////////////////////////////////////////////////////////////////////////////
// CSearchBar overloaded methods
BOOL CSearchBar::Create(CWnd* pParentWnd, UINT nIDTemplate, UINT nStyle, UINT nID)
{
BOOL res = CDialogBar::Create(pParentWnd, nIDTemplate, nStyle, nID);
CRect rect, rect2;
int dy = 0;
dy = m_searchObj.New (this);
m_iHeight = m_sizeDefault.cy - dy;
#ifndef _WIN32
m_sizeFixedLayout.cy = m_iHeight;
#endif
m_iWidth = m_sizeDefault.cx;
return res;
}
CSize CSearchBar::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
{
CSize size;
size.cx = (bStretch && bHorz ? 32767 : m_sizeDefault.cx );
size.cy = GetHeightNeeded ( );
return size;
}
/////////////////////////////////////////////////////////////////////////////
// CSearchBar Message handlers
BEGIN_MESSAGE_MAP(CSearchBar, CDialogBar)
//{{AFX_MSG_MAP(CSearchFrame)
ON_WM_CREATE()
ON_WM_SIZE()
//}}AFX_MSG_MAP
#ifndef _WIN32
ON_MESSAGE(WM_DLGSUBCLASS, OnDlgSubclass)
#endif
END_MESSAGE_MAP()
int CSearchBar::OnCreate( LPCREATESTRUCT lpCreateStruct )
{
int retval = CDialogBar::OnCreate( lpCreateStruct);
CRect rect;
GetWindowRect(&rect);
m_sizeDefault = rect.Size();
return retval;
}
void CSearchBar::OnSize( UINT nType, int cx, int cy )
{
CDialogBar::OnSize( nType, cx, cy );
if ( cx && m_iWidth && ( cx != m_iWidth ) ) {
CWnd *widget;
int dx = cx - m_iWidth;
widget = GetDlgItem(IDC_FIND);
SlideWindow(widget, dx, 0);
widget = GetDlgItem(IDC_NEW);
SlideWindow(widget, dx, 0);
widget = GetDlgItem(IDC_SAVE);
SlideWindow(widget, dx, 0);
widget = GetDlgItem(IDC_SEARCHHELP);
SlideWindow(widget, dx, 0);
widget = GetDlgItem(IDC_ADVANCED_OPTIONS);
SlideWindow(widget, dx, 0);
m_searchObj.OnSize (nType, cx, cy, dx);
m_iWidth = cx;
}
}
#ifndef _WIN32
LRESULT CSearchBar::OnDlgSubclass(WPARAM wParam, LPARAM lParam)
{
*(int FAR*) lParam = 0;
return 0;
}
#endif
/////////////////////////////////////////////////////////////////////////////
// CNewsMsgList
class CSearchResultsList: public IMsgList {
CSearchFrame *m_pControllingFrame;
unsigned long m_ulRefCount;
public:
// IUnknown Interface
STDMETHODIMP QueryInterface(REFIID,LPVOID *);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
// IMsgList Interface
virtual void ListChangeStarting( MSG_Pane* pane, XP_Bool asynchronous,
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
int32 num);
virtual void ListChangeFinished( MSG_Pane* pane, XP_Bool asynchronous,
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
int32 num);
virtual void GetSelection( MSG_Pane* pane, MSG_ViewIndex **indices, int *count,
int *focus);
virtual void SelectItem( MSG_Pane* pane, int item );
virtual void CopyMessagesInto( MSG_Pane *pane, MSG_ViewIndex *indices, int count,
MSG_FolderInfo *folderInfo);
virtual void MoveMessagesInto( MSG_Pane *pane, MSG_ViewIndex *indices, int count,
MSG_FolderInfo *folderInfo);
CSearchResultsList( CSearchFrame *pControllingFrame ) {
m_ulRefCount = 0;
m_pControllingFrame = pControllingFrame;
}
};
STDMETHODIMP CSearchResultsList::QueryInterface(REFIID refiid, LPVOID * ppv)
{
*ppv = NULL;
if (IsEqualIID(refiid,IID_IUnknown))
*ppv = (LPUNKNOWN) this;
else if (IsEqualIID(refiid,IID_IMsgList))
*ppv = (LPMSGLIST) this;
if (*ppv != NULL) {
((LPUNKNOWN) *ppv)->AddRef();
return NOERROR;
}
return ResultFromScode(E_NOINTERFACE);
}
STDMETHODIMP_(ULONG) CSearchResultsList::AddRef(void)
{
return ++m_ulRefCount;
}
STDMETHODIMP_(ULONG) CSearchResultsList::Release(void)
{
ULONG ulRef;
ulRef = --m_ulRefCount;
if (m_ulRefCount == 0)
delete this;
return ulRef;
}
void CSearchResultsList::ListChangeStarting( MSG_Pane* pane, XP_Bool asynchronous,
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
int32 num)
{
if (m_pControllingFrame) {
m_pControllingFrame->ListChangeStarting( pane, asynchronous,
notify, where, num );
}
}
void CSearchResultsList::ListChangeFinished( MSG_Pane* pane, XP_Bool asynchronous,
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
int32 num)
{
if (m_pControllingFrame) {
m_pControllingFrame->ListChangeFinished( pane, asynchronous,
notify, where, num );
}
}
void CSearchResultsList::GetSelection( MSG_Pane* pane, MSG_ViewIndex **indices, int *count,
int *focus)
{
}
void CSearchResultsList::SelectItem( MSG_Pane* pane, int item )
{
}
void CSearchResultsList::MoveMessagesInto( MSG_Pane *pane, MSG_ViewIndex *indices, int count,
MSG_FolderInfo *folderInfo)
{
MSG_DragEffect effect = MSG_DragMessagesIntoFolderStatus(pane,
indices,
count,
folderInfo,
MSG_Require_Move);
if (effect != MSG_Drag_Not_Allowed)
MSG_MoveMessagesIntoFolder(pane, indices, count, folderInfo);
}
void CSearchResultsList::CopyMessagesInto( MSG_Pane *pane, MSG_ViewIndex *indices, int count,
MSG_FolderInfo *folderInfo)
{
MSG_DragEffect effect = MSG_DragMessagesIntoFolderStatus(pane,
indices,
count,
folderInfo,
MSG_Require_Copy);
if (effect != MSG_Drag_Not_Allowed)
MSG_CopyMessagesIntoFolder(pane, indices, count, folderInfo);
}
/////////////////////////////////////////////////////////////////////////////
// CSearchFrame
CSearchFrame::CSearchFrame()
{
INTL_CharSetInfo csi = LO_GetDocumentCharacterSetInfo(GetContext());
m_cxType = SearchCX;
GetContext()->type = MWContextSearch;
GetContext()->fancyFTP = TRUE;
GetContext()->fancyNews = TRUE;
GetContext()->intrupt = FALSE;
GetContext()->reSize = FALSE;
INTL_SetCSIWinCSID(csi, CIntlWin::GetSystemLocaleCsid());
m_pMaster = WFE_MSGGetMaster();
m_iHeight = 0;
m_iWidth = 0;
m_bResultsShowing = FALSE;
m_bSearching = FALSE;
m_bIsLDAPSearch = FALSE;
m_bDragCopying = FALSE;
m_listSearch = XP_ListNew();
m_listResult = NULL;
m_pOutliner = NULL;
CSearchResultsList *pInstance = new CSearchResultsList (this);
pInstance->QueryInterface (IID_IMsgList, (LPVOID *) &m_pIMsgList);
m_pSearchPane = MSG_CreateSearchPane (GetContext(), WFE_MSGGetMaster());
MSG_SetFEData (m_pSearchPane, pInstance);
}
CSearchFrame::~CSearchFrame()
{
MSG_SearchFree (m_pSearchPane);
MSG_DestroyPane (m_pSearchPane);
m_pIMsgList->Release();
}
#ifndef _WIN32
CWnd* CSearchFrame::CreateView(CCreateContext* pContext, UINT nID)
{
ASSERT(m_hWnd != NULL);
ASSERT(::IsWindow(m_hWnd));
ASSERT(pContext != NULL);
ASSERT(pContext->m_pNewViewClass != NULL);
// Note: can be a CWnd with PostNcDestroy self cleanup
CWnd* pView = (CWnd*)pContext->m_pNewViewClass->CreateObject();
if (pView == NULL)
{
TRACE1("Warning: Dynamic create of view type %hs failed.\n",
pContext->m_pNewViewClass->m_lpszClassName);
return NULL;
}
ASSERT(pView->IsKindOf( RUNTIME_CLASS( CWnd ) ));
// views are always created with a border!
if (!pView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
CRect(0,0,0,0), this, nID, pContext))
{
TRACE0("Warning: could not create view for frame.\n");
return NULL; // can't continue without a view
}
return pView;
}
#endif
void CSearchFrame::AdjustHeight(int dy)
{
CRect rect;
GetWindowRect(&rect);
CSize size = rect.Size();
size.cy += dy; //plus fudge for group box bottom margin
m_iHeight = size.cy;
SetWindowPos( NULL, 0, 0, size.cx, size.cy,
SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOZORDER);
}
void CSearchFrame::ShowResults( BOOL bShow )
{
if ( bShow != m_bResultsShowing ) {
if (bShow) {
CRect rect;
GetWindowRect(&rect);
CSize size = rect.Size();
m_iHeight += SEARCH_GROW_HEIGHT;
SetWindowPos( NULL, 0, 0, size.cx, m_iHeight,
SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOZORDER);
m_barStatus.ShowWindow(SW_SHOW);
RecalcLayout();
} else {
CRect rect;
GetWindowRect(&rect);
CSize size = rect.Size();
m_iHeight -= SEARCH_GROW_HEIGHT;
SetWindowPos( NULL, 0, 0, size.cx, m_iHeight,
SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOZORDER);
RecalcLayout();
m_pOutliner->SetTotalLines(0);
m_pOutliner->SelectItem(0);
}
m_bResultsShowing = bShow;
}
}
void CSearchFrame::ListChangeStarting( MSG_Pane* pane, XP_Bool asynchronous,
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
int32 num)
{
if ( pane == (MSG_Pane*) m_pSearchPane )
{
if ( m_pOutliner )
{
m_pOutliner->MysticStuffStarting( asynchronous, notify,where, num );
}
}
}
void CSearchFrame::ListChangeFinished( MSG_Pane* pane, XP_Bool asynchronous,
MSG_NOTIFY_CODE notify, MSG_ViewIndex where,
int32 num)
{
if ( pane == (MSG_Pane*) m_pSearchPane )
{
if ( m_pOutliner )
{
m_pOutliner->MysticStuffFinishing( asynchronous, notify, where, num );
}
}
}
void CSearchFrame::Progress(MWContext *pContext, const char *pMessage)
{
m_barStatus.SetPaneText( m_barStatus.CommandToIndex( ID_SEPARATOR), pMessage );
}
void CSearchFrame::SetProgressBarPercent(MWContext *pContext, int32 lPercent)
{
m_barStatus.SetPercentDone(lPercent);
}
void CSearchFrame::AllConnectionsComplete( MWContext *pContext )
{
CStubsCX::AllConnectionsComplete( pContext );
// If we were performing a search as view operation, we want to turn the progress bar cylon
// off when the connections are complete because this implies that the search as view op is done!
if (!m_bSearching)
SetProgressBarPercent(pContext, 0);
m_bSearching = FALSE;
int total = m_pOutliner->GetTotalLines();
CString csStatus;
if ( total > 1) {
csStatus.Format( szLoadString(IDS_SEARCHHITS), total );
} else if ( total > 0 ) {
csStatus.LoadString( IDS_SEARCHONEHIT );
} else {
csStatus.LoadString( IDS_SEARCHNOHITS );
}
m_barStatus.SetPaneText( m_barStatus.CommandToIndex( ID_SEPARATOR), csStatus );
SendMessageToDescendants(WM_IDLEUPDATECMDUI, (WPARAM)TRUE, (LPARAM)0);
}
void CSearchFrame::UpdateScopes( CMailNewsFrame *pFrame )
{
m_barSearch.m_wndScopes.Populate(WFE_MSGGetMaster(), NULL);
MSG_FolderInfo *folderInfo = pFrame ? pFrame->GetCurFolder() : NULL;
m_barSearch.m_wndScopes.SetCurSel(0);
if (folderInfo) {
MSG_FolderLine folderLine;
MSG_GetFolderLineById( WFE_MSGGetMaster(), folderInfo, &folderLine );
if (folderLine.flags & MSG_FOLDER_FLAG_CATEGORY) {
folderInfo = MSG_GetCategoryContainerForCategory(folderInfo);
}
for ( int i = 0; i < m_barSearch.m_wndScopes.GetCount(); i++ ) {
DWORD dwItemData = m_barSearch.m_wndScopes.GetItemData(i);
if (dwItemData == (DWORD) folderInfo) {
m_barSearch.m_wndScopes.SetCurSel(i);
break;
}
}
}
m_barSearch.UpdateAttribList();
m_barSearch.UpdateOpList();
}
/////////////////////////////////////////////////////////////////////////////
// CSearchFrame Overloaded methods
void CSearchFrame::Create()
{
DWORD dwDefaultStyle = WS_OVERLAPPEDWINDOW|WS_CLIPSIBLINGS|WS_CLIPCHILDREN;
CString strFullString, strTitle;
strFullString.LoadString( IDR_SEARCHFRAME );
AfxExtractSubString( strTitle, strFullString, 0 );
LPCTSTR lpszClass = GetIconWndClass( dwDefaultStyle, IDR_SEARCHFRAME );
LPCTSTR lpszTitle = strTitle;
CFrameWnd::Create(lpszClass, lpszTitle, dwDefaultStyle);
ActivateFrame();
}
BOOL CSearchFrame::PreCreateWindow(CREATESTRUCT& cs)
{
cs.hwndParent = NULL;
return CFrameWnd::PreCreateWindow(cs);
}
BOOL CSearchFrame::OnCreateClient( LPCREATESTRUCT lpcs, CCreateContext* pContext )
{
CWnd *pWnd;
CCreateContext Context;
Context.m_pNewViewClass = RUNTIME_CLASS(CSearchView);
if ( pWnd = CreateView(&Context) ) {
COutlinerView *pView = (COutlinerView *) pWnd;
pView->CreateColumns ( );
m_pOutliner = (CSearchOutliner *) pView->m_pOutlinerParent->m_pOutliner;
m_pOutliner->SetContext( GetContext() );
m_pOutliner->SetPane (m_pSearchPane);
} else {
return FALSE;
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CSearchFrame message handlers
BEGIN_MESSAGE_MAP(CSearchFrame, CFrameWnd)
ON_WM_SETFOCUS()
ON_WM_CREATE()
ON_WM_CLOSE()
ON_WM_DESTROY()
ON_WM_GETMINMAXINFO()
ON_BN_CLICKED(IDC_MORE, OnMore)
ON_UPDATE_COMMAND_UI( IDC_MORE, OnUpdateMore )
ON_BN_CLICKED(IDC_FEWER, OnFewer)
ON_UPDATE_COMMAND_UI( IDC_FEWER, OnUpdateFewer )
ON_BN_CLICKED(IDC_FIND, OnFind)
ON_UPDATE_COMMAND_UI( IDC_FIND, OnUpdateFind )
ON_BN_CLICKED(IDC_TO, OnTo)
ON_UPDATE_COMMAND_UI( IDC_TO, OnUpdateTo )
ON_BN_CLICKED(IDC_BUTTON_FILE_MESSAGE, OnFileButton)
ON_UPDATE_COMMAND_UI( IDC_BUTTON_FILE_MESSAGE, OnUpdateFileButton )
ON_BN_CLICKED(IDC_BUTTON_DELETE_MESSAGE, OnDeleteMessage)
ON_UPDATE_COMMAND_UI( IDC_BUTTON_DELETE_MESSAGE, OnUpdateDeleteButton )
ON_BN_CLICKED(IDC_NEW, OnNew)
ON_UPDATE_COMMAND_UI(IDC_NEW, OnUpdateClearSearch)
ON_BN_CLICKED(IDC_SAVE, OnSave)
ON_UPDATE_COMMAND_UI( IDC_SAVE, OnUpdateSave )
ON_BN_CLICKED(IDC_SEARCHHELP, OnHelp)
ON_UPDATE_COMMAND_UI( IDC_SEARCHHELP, OnUpdateHelp )
ON_BN_CLICKED(IDC_ADVANCED_OPTIONS, OnAdvanced)
ON_UPDATE_COMMAND_UI( IDC_ADVANCED_OPTIONS, OnUpdateAdvanced )
ON_CBN_SELCHANGE(IDC_COMBO_SCOPE, OnScope)
ON_CBN_SELCHANGE(IDC_COMBO_ATTRIB1, OnAttrib1)
ON_CBN_SELCHANGE(IDC_COMBO_ATTRIB2, OnAttrib2)
ON_CBN_SELCHANGE(IDC_COMBO_ATTRIB3, OnAttrib3)
ON_CBN_SELCHANGE(IDC_COMBO_ATTRIB4, OnAttrib4)
ON_CBN_SELCHANGE(IDC_COMBO_ATTRIB5, OnAttrib5)
ON_BN_CLICKED(IDC_RADIO_ALL, OnAndOr)
ON_BN_CLICKED(IDC_RADIO_ANY, OnAndOr)
ON_UPDATE_COMMAND_UI(IDC_RADIO_ALL, OnUpdateAndOr)
ON_UPDATE_COMMAND_UI(IDC_RADIO_ANY, OnUpdateAndOr)
ON_MESSAGE(WM_ADVANCED_OPTIONS_DONE, OnFinishedAdvanced)
ON_MESSAGE(WM_EDIT_CUSTOM_DONE, OnFinishedHeaders)
ON_COMMAND(ID_EDIT_DELETEMESSAGE, OnDeleteMessage)
ON_UPDATE_COMMAND_UI(ID_EDIT_DELETEMESSAGE, OnUpdateDeleteMessage)
ON_COMMAND(ID_FILE_OPENMESSAGE, OnOpenMessage)
ON_UPDATE_COMMAND_UI(ID_FILE_OPENMESSAGE, OnUpdateOpenMessage)
#ifdef ON_COMMAND_RANGE
ON_COMMAND_RANGE(FIRST_MOVE_MENU_ID, LAST_MOVE_MENU_ID, OnFileMessage )
#endif
#ifdef ON_UPDATE_COMMAND_UI_RANGE
ON_UPDATE_COMMAND_UI_RANGE( IDC_COMBO_ATTRIB1, IDC_EDIT_VALUE5, OnUpdateQuery )
ON_UPDATE_COMMAND_UI_RANGE( FIRST_MOVE_MENU_ID, LAST_MOVE_MENU_ID, OnUpdateFile )
#endif
ON_UPDATE_COMMAND_UI( ID_MESSAGE_FILE, OnUpdateFile )
ON_UPDATE_COMMAND_UI( IDC_COMBO_SCOPE, OnUpdateQuery )
ON_UPDATE_COMMAND_UI(IDS_ONLINE_STATUS, OnUpdateOnlineStatus)
END_MESSAGE_MAP()
#ifndef ON_COMMAND_RANGE
BOOL CSearchFrame::OnCommand( WPARAM wParam, LPARAM lParam )
{
UINT nID = wParam;
if ( nID >= FIRST_MOVE_MENU_ID && nID <= LAST_MOVE_MENU_ID ) {
OnFileMessage( nID );
return TRUE;
}
return CSearchFrame::OnCommand( wParam, lParam );
}
#endif
#ifndef ON_UPDATE_COMMAND_UI_RANGE
BOOL CSearchFrame::OnCmdMsg( UINT nID, int nCode, void* pExtra,
AFX_CMDHANDLERINFO* pHandlerInfo )
{
if ((nID >= IDC_COMBO_ATTRIB1) && (nID <= IDC_EDIT_VALUE5) &&
( nCode == CN_UPDATE_COMMAND_UI) ) {
OnUpdateQuery( (CCmdUI *) pExtra );
return TRUE;
}
else if (nCode == CN_UPDATE_COMMAND_UI)
{
CCmdUI* pCmdUI = (CCmdUI*)pExtra;
if ( nID >= FIRST_MOVE_MENU_ID && nID <= LAST_MOVE_MENU_ID ) {
OnUpdateFile( pCmdUI );
return TRUE;
}
if ( nID >= FIRST_COPY_MENU_ID && nID <= LAST_COPY_MENU_ID ) {
OnUpdateFile( pCmdUI );
return TRUE;
}
}
return CFrameWnd::OnCmdMsg( nID, nCode, pExtra, pHandlerInfo );
}
#endif
void CSearchFrame::OnFileButton()
{
int nTotalLines = m_pOutliner->GetTotalLines();
MSG_ViewIndex *indices;
int iSel;
m_pOutliner->GetSelection(indices, iSel);
HMENU hFileMenu = CreatePopupMenu();
if (!hFileMenu)
return; //Bail!!!
if(iSel <= nTotalLines)
{
UINT nID = FIRST_MOVE_MENU_ID;
CMailNewsFrame::UpdateMenu(NULL, hFileMenu, nID);
}
CRect rect;
CWnd * pWidget = (CWnd *)m_barAction.GetDlgItem(IDC_BUTTON_FILE_MESSAGE);
if(pWidget)
{ //convert this bad boy to Screen units
pWidget->GetWindowRect(&rect);
::MapDialogRect(pWidget->GetSafeHwnd(), &rect);
pWidget->EnableWindow(FALSE);
}
else
return;//Bail!!
// Track the popup now.
DWORD dwError = ::TrackPopupMenu(hFileMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON,
rect.left, rect.bottom, 0, GetSafeHwnd(), NULL);
pWidget->EnableWindow(TRUE);
// Cleanup handled in CMailNewsFrame
}
void CSearchFrame::OnUpdateFileButton(CCmdUI *pCmdUI)
{
MSG_ViewIndex *indices;
int count;
m_pOutliner->GetSelection(indices, count);
int nLines = m_pOutliner->GetTotalLines();
pCmdUI->Enable(((nLines > 0) && count));
}
void CSearchFrame::OnUpdateDeleteButton(CCmdUI *pCmdUI)
{
MSG_ViewIndex *indices;
int count;
m_pOutliner->GetSelection(indices, count);
int nLines = m_pOutliner->GetTotalLines();
pCmdUI->Enable(((nLines > 0) && count));
}
void CSearchFrame::OnFileMessage(UINT nID)
{
if ( m_pSearchPane )
{
MSG_ViewIndex *indices;
int count;
m_pOutliner->GetSelection(indices, count);
MSG_FolderInfo *folderInfo = FolderInfoFromMenuID( nID );
ASSERT(folderInfo);
if (folderInfo)
{
// We want to make file behave for newsgroups
if ( MSG_GetFolderFlags(folderInfo) & MSG_FOLDER_FLAG_NEWSGROUP )
{
MSG_CopyMessagesIntoFolder( m_pSearchPane, indices, count, folderInfo);
}
else
{
MSG_MoveMessagesIntoFolder( m_pSearchPane, indices, count, folderInfo);
}
ModalStatusBegin( MODAL_DELAY );
}
}
}
void CSearchFrame::OnOpenMessage()
{
BOOL bReuse = g_MsgPrefs.m_bMessageReuse;
if (GetKeyState(VK_MENU) & 0x8000)
bReuse = !bReuse;
MSG_ViewIndex *indices;
int i, count;
m_pOutliner->GetSelection(indices, count);
for ( i = 0; i < count; i++ ) {
MSG_ResultElement *elem = NULL;
MSG_GetResultElement(m_pSearchPane, indices[i], &elem);
ASSERT(elem);
if ( !elem )
continue;
MWContextType cxType = MSG_GetResultElementType( elem );
if ( cxType == MWContextMail || cxType == MWContextMailMsg ||
cxType == MWContextNews || cxType == MWContextNewsMsg ) {
CMessageFrame *frame = CMessageFrame::Open ();
MSG_OpenResultElement (elem, frame->GetPane());
} else if ( cxType == MWContextBrowser ) {
MWContext *pContext = NULL;
VERIFY(pContext = CFE_CreateNewDocWindow( NULL, NULL ));
if (pContext) {
MSG_OpenResultElement( elem, (MSG_Pane *) pContext );
}
} else {
ASSERT(0); // What on earth are you passing me?
}
}
}
void CSearchFrame::OnUpdateOpenMessage(CCmdUI *pCmdUI )
{
pCmdUI->Enable(TRUE);
}
MSG_FolderInfo *CSearchFrame::FolderInfoFromMenuID( MSG_FolderInfo *mailRoot,
UINT &nBase, UINT nID )
{
int i, iCount;
MSG_FolderInfo **folderInfos;
MSG_FolderInfo *res = NULL;
MSG_FolderLine folderLine;
if (mailRoot == NULL ) {
// Loop through top level folderInfos, looking for mail trees.
iCount = MSG_GetFolderChildren(m_pMaster, NULL, NULL, NULL);
folderInfos = new MSG_FolderInfo*[iCount];
if (folderInfos) {
MSG_GetFolderChildren(m_pMaster, NULL, folderInfos, iCount);
for (i = 0; i < iCount && !res; i++) {
if (MSG_GetFolderLineById(m_pMaster, folderInfos[i], &folderLine)) {
if (folderLine.flags & MSG_FOLDER_FLAG_MAIL) {
res = FolderInfoFromMenuID( folderInfos[i], nBase, nID);
}
}
}
delete [] folderInfos;
}
return res;
}
MSG_GetFolderLineById( m_pMaster, mailRoot, &folderLine );
if (folderLine.level > 1) { // We've a subfolder
if ( nID == nBase ) {
return mailRoot;
}
nBase++;
}
iCount = MSG_GetFolderChildren( m_pMaster, mailRoot, NULL, NULL );
folderInfos = new MSG_FolderInfo*[iCount];
ASSERT( folderInfos );
if (folderInfos) {
MSG_GetFolderChildren( m_pMaster, mailRoot, folderInfos, iCount );
for ( i = 0; i < iCount && !res; i++ ) {
if ( MSG_GetFolderLineById( m_pMaster, folderInfos[ i ], &folderLine ) ) {
if ( folderLine.numChildren > 0 ) {
res = FolderInfoFromMenuID( folderInfos[ i ], nBase, nID );
} else {
if ( nID == nBase ) {
res = folderInfos[ i ];
} else {
nBase++;
}
}
}
}
delete [] folderInfos;
}
return res;
}
MSG_FolderInfo *CSearchFrame::FolderInfoFromMenuID( UINT nID )
{
UINT nBase = 0;
if ( nID >= FIRST_MOVE_MENU_ID && nID <= LAST_MOVE_MENU_ID )
{
nBase = FIRST_MOVE_MENU_ID;
}
else
{
ASSERT(0);
return NULL;
}
return FolderInfoFromMenuID( NULL, nBase, nID );
}
void CSearchFrame::OnUpdateFile( CCmdUI *pCmdUI )
{
MSG_ViewIndex *indices = NULL;
int count;
MSG_ResultElement *elem = NULL;
m_pOutliner->GetSelection(indices, count);
MSG_GetResultElement(m_pSearchPane, indices[0], &elem);
ASSERT(elem);
if ( !elem )
return;
MSG_SearchValue *value;
MSG_GetResultAttribute(elem, attribMessageKey, &value);
BOOL bEnable = value->u.key != MSG_MESSAGEKEYNONE;
if (pCmdUI->m_pSubMenu)
{
pCmdUI->m_pMenu->EnableMenuItem(pCmdUI->m_nIndex,
MF_BYPOSITION |(bEnable ? MF_ENABLED : MF_GRAYED));
}
else
{
pCmdUI->Enable( bEnable );
}
}
BOOL CSearchFrame::PreTranslateMessage( MSG* pMsg )
{
if ( (GetKeyState(VK_CONTROL) & 0x8000) || (GetKeyState(VK_MENU) & 0x8000))
return CFrameWnd::PreTranslateMessage(pMsg);
if (pMsg->message == WM_KEYDOWN && (int) pMsg->wParam == VK_ESCAPE)
PostMessage(WM_CLOSE);
if (pMsg->message == WM_KEYDOWN && (int) pMsg->wParam == VK_TAB) {
HWND hwndNext = NULL;
HWND hwndFocus = ::GetFocus();
HWND hwndSearchFirst = ::GetNextDlgTabItem( m_barSearch.m_hWnd, NULL, FALSE );
HWND hwndSearchLast = ::GetNextDlgTabItem( m_barSearch.m_hWnd, hwndSearchFirst, TRUE );
#ifdef _WIN32
HWND hwndActionFirst = ::GetNextDlgTabItem( m_barAction.m_hWnd, NULL, FALSE );
HWND hwndActionLast = ::GetNextDlgTabItem( m_barAction.m_hWnd, hwndActionFirst, TRUE );
#else
HWND hwndActionFirst = NULL;
HWND hwndActionLast = NULL;
if (m_bIsLDAPSearch)
{
HWND hAdd = ::GetDlgItem( m_barAction.m_hWnd, IDC_ADD );
HWND hTo = ::GetDlgItem( m_barAction.m_hWnd, IDC_TO );
if (::IsWindow(hAdd) && ::IsWindowVisible(hAdd) && ::IsWindowEnabled(hAdd))
{
hwndActionFirst = hAdd;
if (::IsWindow(hTo) && ::IsWindowVisible(hTo) && ::IsWindowEnabled(hTo))
hwndActionLast = hTo;
}
else
{
if (::IsWindow(hTo) && ::IsWindowVisible(hTo) && ::IsWindowEnabled(hTo))
hwndActionFirst = hTo;
}
}
else
{
HWND hTo = ::GetDlgItem( m_barAction.m_hWnd, IDC_TO );
if (::IsWindow(hTo) && ::IsWindowVisible(hTo) && ::IsWindowEnabled(hTo))
hwndActionFirst = hTo;
}
#endif
if ( GetKeyState(VK_SHIFT) & 0x8000 ) {
// Tab backward
if ( hwndFocus == hwndSearchFirst ) {
// Handle tabbing into action bar
if ( m_bResultsShowing ) {
hwndNext = hwndActionLast;
if ( !hwndNext || GetWindowLong( hwndNext, GWL_STYLE) & WS_DISABLED ) {
// Nothing active in the action bar
// we can head for the outliner instead
hwndNext = m_pOutliner->m_hWnd;
}
}
} else if (hwndFocus == m_pOutliner->m_hWnd) {
// Handle tabbing out of outliner
hwndNext = hwndSearchLast;
} else if ( hwndFocus == hwndActionFirst ) {
// Handle tabbing into the outliner
hwndNext = m_pOutliner->m_hWnd;
}
} else {
// Tab forward
if (hwndFocus == m_pOutliner->m_hWnd) {
// Handle tabbing out of outliner
hwndNext = hwndActionFirst;
if ( !hwndNext || GetWindowLong( hwndNext, GWL_STYLE) & WS_DISABLED ) {
// nothing active in action bar
hwndNext = hwndSearchFirst;
}
} else if ( hwndFocus == hwndSearchLast ) {
// Handle tabbing into outliner
if ( m_bResultsShowing ) {
// we can head for the outliner instead
hwndNext = m_pOutliner->m_hWnd;
}
} else if (hwndFocus == hwndActionLast) {
// Handle tabbing out of the action bar
hwndNext = hwndSearchFirst;
}
}
if ( hwndNext ) {
::SetFocus( hwndNext );
return TRUE;
}
}
return CFrameWnd::PreTranslateMessage(pMsg);
}
int CSearchFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
UINT aIDArray[] = { IDS_TRANSFER_STATUS, ID_SEPARATOR };
int res = CFrameWnd::OnCreate(lpCreateStruct);
SetWindowText(szLoadString(IDS_SEARCHMESSAGES));
m_barSearch.m_bLDAP = FALSE;
m_helpString = HELP_SEARCH_MAILNEWS;
#ifdef _WIN32
m_barSearch.Create( this, IDD_SEARCH, WS_CHILD|CBRS_ALIGN_TOP, 1 );
#else
m_barSearch.Create( this, IDD_SEARCH, WS_CHILD|CBRS_TOP, 1 );
#endif
m_barStatus.Create( this, FALSE, FALSE, TRUE );
//set initial online status
int idx = m_barStatus.CommandToIndex(IDS_ONLINE_STATUS);
if (idx > -1)
{
UINT nID = IDS_ONLINE_STATUS;
UINT nStyle;
int nWidth;
m_barStatus.GetPaneInfo( idx, nID, nStyle, nWidth );
if (!NET_IsOffline())
m_barStatus.SetPaneInfo(idx, IDS_ONLINE_STATUS, SBPS_NORMAL, nWidth);
else
m_barStatus.SetPaneInfo(idx, IDS_ONLINE_STATUS, SBPS_DISABLED, nWidth);
}
m_barAction.Create( this, IDD_MSGSRCHACTION, WS_CHILD|CBRS_BOTTOM, 2);
RecalcLayout( );
m_barSearch.InitializeAttributes (widgetText, attribSender);
m_barSearch.m_wndScopes.SubclassDlgItem(IDC_COMBO_SCOPE, &m_barSearch);
UpdateScopes( NULL );
// Initially size window to only dialog + title bar.
CRect rect, rect2;
int BorderX = GetSystemMetrics(SM_CXFRAME);
int BorderY = GetSystemMetrics(SM_CYFRAME);
GetWindowRect(&rect);
m_barSearch.GetWindowRect(&rect2);
CSize size = m_barSearch.CalcFixedLayout(FALSE, FALSE);
// Figure height of title bar + bottom border
size.cy += rect2.top - rect.top + BorderY;
size.cx += BorderX * 2;
SetWindowPos( NULL, 0, 0, size.cx, size.cy,
SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOZORDER);
m_iHeight = size.cy;
m_iWidth = size.cx;
m_barSearch.m_iOrigFrameHeight = m_iOrigFrameHeight = m_iHeight;
m_barSearch.m_searchObj.SetOrigFrameHeight(m_barSearch.m_iOrigFrameHeight);
OnNew();
#ifndef _WIN32
SendMessageToDescendants(WM_IDLEUPDATECMDUI, (WPARAM)TRUE, (LPARAM)0);
#endif
return res;
}
void CSearchFrame::OnSize( UINT nType, int cx, int cy )
{
CFrameWnd::OnSize( nType, cx, cy );
}
void CSearchFrame::OnClose()
{
CFrameWnd::OnClose();
g_pSearchWindow = NULL;
}
void CSearchFrame::OnDestroy()
{
CFrameWnd::OnDestroy();
if(!IsDestroyed()) {
DestroyContext();
}
}
void CSearchFrame::OnSetFocus(CWnd *pOldWnd)
{
m_barSearch.m_searchObj.RestoreDefaultFocus();
}
void CSearchFrame::OnUpdateDeleteMessage(CCmdUI* pCmdUI)
{
pCmdUI->Enable(TRUE);
}
void CSearchFrame::OnDeleteMessage()
{
ModalStatusBegin( MODAL_DELAY );
MSG_ViewIndex *indices = NULL;
int count = 0;
m_pOutliner->GetSelection(indices, count);
MSG_Command(m_pSearchPane, MSG_DeleteMessage, indices, count);
ModalStatusEnd();
}
void CSearchFrame::ModalStatusBegin( int iModalDelay )
{
if ( iModalDelay > -1 ) {
}
}
void CSearchFrame::ModalStatusEnd()
{
}
LONG CSearchFrame::OnFinishedHeaders(WPARAM wParam, LPARAM lParam )
{
MSG_Master *master = WFE_MSGGetMaster();
if(lParam == IDOK)
m_barSearch.m_searchObj.UpdateColumn1Attributes();
MSG_ReleaseEditHeadersSemaphore(master, this);
return 0;
}
LONG CSearchFrame::OnFinishedAdvanced(WPARAM wParam, LPARAM lParam )
{
if(lParam == IDOK)
{
m_barSearch.UpdateAttribList();
m_barSearch.UpdateOpList();
//m_barSearch.m_searchObj.ReInitializeWidgets();
}
return 0;
}
void CSearchFrame::OnGetMinMaxInfo( MINMAXINFO FAR* lpMMI )
{
CFrameWnd::OnGetMinMaxInfo( lpMMI );
if (m_iHeight) {
if (!m_bResultsShowing) {
lpMMI->ptMaxSize.y = m_iHeight;
lpMMI->ptMaxTrackSize.y = m_iHeight;
}
lpMMI->ptMinTrackSize.y = m_iHeight;
}
if (m_iWidth) {
lpMMI->ptMinTrackSize.x = m_iWidth;
}
}
void CSearchFrame::OnAndOr()
{
m_barSearch.OnAndOr();
}
void CSearchFrame::OnAdvanced()
{
MSG_Master *master = WFE_MSGGetMaster();
//find out if we are the only ones trying to edit headers.
if (master)
{
if (!MSG_AcquireEditHeadersSemaphore(master, this))
{
::MessageBox(FEU_GetLastActiveFrame()->GetSafeHwnd(),
szLoadString(IDS_EDIT_HEADER_IN_USE),
szLoadString(IDS_CUSTOM_HEADER_ERROR),
MB_OK|MB_ICONSTOP);
return;
//We can't edit anything since another window already has the semaphore.
}
}
else
{ //Something is hosed!
return;
}
CString title;
title.LoadString(IDS_ADVSEARCH_PROPERTY_SHEET);
// it will delete itself in OnNcDestroy. This is a way to have two "modal" dialogs
CAdvancedOptionsPropertySheet * paops = new CAdvancedOptionsPropertySheet(this, title, AOP_SEARCH_OPTIONS | AOP_CUSTOM_HEADERS);
assert(paops != NULL);
if(paops != NULL)
paops->Create(this);
}
void CSearchFrame::OnUpdateAdvanced( CCmdUI *pCmdUI)
{
pCmdUI->Enable( !m_bSearching );
}
void CSearchFrame::OnMore()
{
AdjustHeight(m_barSearch.More());
RecalcLayout( );
#ifndef _WIN32
SendMessageToDescendants(WM_IDLEUPDATECMDUI, (WPARAM)TRUE, (LPARAM)0);
#endif
}
void CSearchFrame::OnUpdateMore( CCmdUI *pCmdUI )
{
pCmdUI->Enable( (m_barSearch.m_iMoreCount < 4) && !m_bSearching );
}
void CSearchFrame::OnFewer()
{
AdjustHeight(m_barSearch.Fewer());
RecalcLayout( );
#ifndef _WIN32
SendMessageToDescendants(WM_IDLEUPDATECMDUI, (WPARAM)TRUE, (LPARAM)0);
#endif
}
void CSearchFrame::OnUpdateFewer( CCmdUI *pCmdUI )
{
pCmdUI->Enable( (m_barSearch.m_iMoreCount > 0) && !m_bSearching );
}
void CSearchFrame::OnNew()
{
if (m_bSearching) {
XP_InterruptContext( GetContext() );
m_bSearching = FALSE;
}
MSG_SearchFree(m_pSearchPane); /* free memory in context */
ShowResults( FALSE );
m_pOutliner->SelectItem(0);
int dy = m_barSearch.ClearSearch(m_bIsLDAPSearch);
CComboBox * pCombo = (CComboBox *)m_barSearch.GetDlgItem(IDC_COMBO_ATTRIB1);
if(pCombo != NULL)
{
pCombo->SetCurSel(0);
OnAttrib1();
}
AdjustHeight(dy);
#ifndef _WIN32
SendMessageToDescendants(WM_IDLEUPDATECMDUI, (WPARAM)TRUE, (LPARAM)0);
#endif
}
void CSearchFrame::OnSave()
{
char *name = FE_PromptWithCaption(GetContext(),
szLoadString(IDS_VIRTUALNEWSGROUP),
szLoadString(IDS_VIRTUALNEWSGROUPDESC),
NULL);
MSG_SaveProfile(m_pSearchPane, name);
}
void CSearchFrame::OnUpdateSave( CCmdUI *pCmdUI )
{
XP_Bool fEnable = FALSE;
MSG_SaveProfileStatus (m_pSearchPane, &fEnable);
pCmdUI->Enable( fEnable );
}
void CSearchFrame::OnHelp()
{
NetHelp(m_helpString);
}
void CSearchFrame::OnUpdateHelp( CCmdUI *pCmdUI )
{
pCmdUI->Enable( TRUE );
}
void CSearchFrame::OnFind()
{
if ( m_bSearching ) {
// We've turned into stop button
XP_InterruptContext( GetContext() );
return;
}
// Build Search
ShowResults( FALSE );
MSG_SearchFree (m_pSearchPane);
MSG_SearchAlloc (m_pSearchPane);
ASSERT(m_pOutliner);
m_pOutliner->Invalidate();
CComboBox *combo;
int iCurSel;
MSG_ScopeAttribute scope;
MSG_Master *master = WFE_MSGGetMaster();
combo = (CComboBox *) m_barSearch.GetDlgItem( IDC_COMBO_SCOPE );
iCurSel = combo->GetCurSel();
DWORD dwData = combo->GetItemData(iCurSel);
scope = m_barSearch.DetermineScope(dwData);
MSG_AddScopeTerm( m_pSearchPane, scope, (MSG_FolderInfo *) dwData );
m_barSearch.BuildQuery (m_pSearchPane);
if (MSG_Search(m_pSearchPane) == SearchError_Success) {
m_bSearching = TRUE;
ShowResults( TRUE );
SendMessageToDescendants(WM_IDLEUPDATECMDUI, (WPARAM)TRUE, (LPARAM)0);
m_barStatus.SetPaneText( m_barStatus.CommandToIndex( ID_SEPARATOR),
szLoadString( IDS_SEARCHING ) );
}
}
void CSearchFrame::OnUpdateFind(CCmdUI *pCmdUI)
{
CString cs;
BOOL bStopButton = FALSE;
if(m_bSearching || CanAllInterrupt())
{
cs.LoadString( IDS_STOP );
bStopButton = TRUE;
}
else
cs.LoadString( IDS_SEARCH );
pCmdUI->SetText(cs);
pCmdUI->Enable(bStopButton ? TRUE : readyToSearch());
}
void CSearchFrame::OnUpdateAndOr(CCmdUI *pCmdUI)
{
//pCmdUI->Enable(!(m_bSearching || CanAllInterrupt()) && m_barSearch.GetDlgItem(IDC_COMBO_ATTRIB2)->IsWindowVisible());
}
void CSearchFrame::OnTo()
{
MSG_ViewIndex *indices;
int count;
m_pOutliner->GetSelection(indices, count);
if (count == 1) {
MSG_ResultElement *elem = NULL;
MSG_GetResultElement(m_pSearchPane, indices[0], &elem);
ASSERT(elem);
if ( !elem )
return;
MSG_SearchValue *value;
MSG_GetResultAttribute(elem, attribMessageKey, &value);
MessageKey key = value->u.key;
MSG_GetResultAttribute(elem, attribFolderInfo, &value);
MSG_FolderInfo *folderInfo = value->u.folder;
if (folderInfo)
{
C3PaneMailFrame::Open(folderInfo, key);
}
}
}
void CSearchFrame::OnUpdateTo( CCmdUI *pCmdUI )
{
MSG_ViewIndex *indices;
int count;
m_pOutliner->GetSelection(indices, count);
int nLines = m_pOutliner->GetTotalLines();
pCmdUI->Enable( ((nLines > 0) && count) && MSG_GoToFolderStatus (m_pSearchPane, indices, count));
}
void CSearchFrame::OnUpdateQuery( CCmdUI *pCmdUI )
{
pCmdUI->Enable(!m_bSearching);
}
void CSearchFrame::OnUpdateClearSearch(CCmdUI *pCmdUI)
{
BOOL b = FALSE;
CComboBox * pCombo = (CComboBox *)m_barSearch.GetDlgItem(IDC_COMBO_ATTRIB2);
if(pCombo != NULL)
b = pCombo->IsWindowVisible();
pCmdUI->Enable(!m_bSearching && (b || readyToSearch() || m_bResultsShowing));
}
void CSearchFrame::OnScope()
{
m_barSearch.UpdateAttribList();
m_barSearch.UpdateOpList();
}
BOOL CSearchFrame::readyToSearch()
{
BOOL bRet = FALSE;
BOOL b1 = FALSE;
BOOL b2 = FALSE;
BOOL b3 = FALSE;
BOOL b4 = FALSE;
BOOL b5 = FALSE;
char szString[256];
CEdit * pEdit = NULL;
CComboBox * pCombo = NULL;
DWORD dwAttrib;
pCombo = (CComboBox *)m_barSearch.GetDlgItem(IDC_COMBO_ATTRIB1);
if(pCombo != NULL)
{
dwAttrib = pCombo->GetItemData(pCombo->GetCurSel());
if(pCombo->IsWindowVisible() && ((dwAttrib == attribDate)||(dwAttrib == attribPriority)||(dwAttrib == attribMsgStatus)))
b1 = TRUE;
else
{
pEdit = (CEdit *)m_barSearch.GetDlgItem(IDC_EDIT_VALUE1);
if(pEdit != NULL)
{
pEdit->GetWindowText(szString, sizeof(szString));
b1 = ((strlen(szString) > 0) && pEdit->IsWindowVisible());
}
}
}
pCombo = (CComboBox *)m_barSearch.GetDlgItem(IDC_COMBO_ATTRIB2);
if(pCombo != NULL)
{
dwAttrib = pCombo->GetItemData(pCombo->GetCurSel());
if(pCombo->IsWindowVisible() && ((dwAttrib == attribDate)||(dwAttrib == attribPriority)||(dwAttrib == attribMsgStatus)))
b2 = TRUE;
else
{
pEdit = (CEdit *)m_barSearch.GetDlgItem(IDC_EDIT_VALUE2);
if(pEdit != NULL)
{
pEdit->GetWindowText(szString, sizeof(szString));
b2 = ((strlen(szString) > 0) && pEdit->IsWindowVisible());
}
}
}
pCombo = (CComboBox *)m_barSearch.GetDlgItem(IDC_COMBO_ATTRIB3);
if(pCombo != NULL)
{
dwAttrib = pCombo->GetItemData(pCombo->GetCurSel());
if(pCombo->IsWindowVisible() && ((dwAttrib == attribDate)||(dwAttrib == attribPriority)||(dwAttrib == attribMsgStatus)))
b3 = TRUE;
else
{
pEdit = (CEdit *)m_barSearch.GetDlgItem(IDC_EDIT_VALUE3);
if(pEdit != NULL)
{
pEdit->GetWindowText(szString, sizeof(szString));
b3 = ((strlen(szString) > 0) && pEdit->IsWindowVisible());
}
}
}
pCombo = (CComboBox *)m_barSearch.GetDlgItem(IDC_COMBO_ATTRIB4);
if(pCombo != NULL)
{
dwAttrib = pCombo->GetItemData(pCombo->GetCurSel());
if(pCombo->IsWindowVisible() && ((dwAttrib == attribDate)||(dwAttrib == attribPriority)||(dwAttrib == attribMsgStatus)))
b4 = TRUE;
else
{
pEdit = (CEdit *)m_barSearch.GetDlgItem(IDC_EDIT_VALUE4);
if(pEdit != NULL)
{
pEdit->GetWindowText(szString, sizeof(szString));
b4 = ((strlen(szString) > 0) && pEdit->IsWindowVisible());
}
}
}
pCombo = (CComboBox *)m_barSearch.GetDlgItem(IDC_COMBO_ATTRIB5);
if(pCombo != NULL)
{
dwAttrib = pCombo->GetItemData(pCombo->GetCurSel());
if(pCombo->IsWindowVisible() && ((dwAttrib == attribDate)||(dwAttrib == attribPriority)||(dwAttrib == attribMsgStatus)))
b5 = TRUE;
else
{
pEdit = (CEdit *)m_barSearch.GetDlgItem(IDC_EDIT_VALUE5);
if(pEdit != NULL)
{
pEdit->GetWindowText(szString, sizeof(szString));
b5 = ((strlen(szString) > 0) && pEdit->IsWindowVisible());
}
}
}
bRet = b1 || b2 || b3 || b4 || b5;
return bRet;
}
void CSearchFrame::OnAttrib1()
{
m_barSearch.UpdateOpList();
}
void CSearchFrame::OnAttrib2()
{
m_barSearch.UpdateOpList();
}
void CSearchFrame::OnAttrib3()
{
m_barSearch.UpdateOpList();
}
void CSearchFrame::OnAttrib4()
{
m_barSearch.UpdateOpList();
}
void CSearchFrame::OnAttrib5()
{
m_barSearch.UpdateOpList();
}
void CSearchFrame::OnUpdateOnlineStatus(CCmdUI *pCmdUI)
{
pCmdUI->Enable(!NET_IsOffline());
}
//////////////////////////////////////////////////////////////////////////////
// CSearchOutliner
CSearchOutliner::CSearchOutliner ( )
{
m_attribSortBy = attribDate;
m_bSortDescending = FALSE;
m_iMysticPlane = 0;
ApiApiPtr(api);
m_pUnkUserImage = api->CreateClassInstance(APICLASS_IMAGEMAP);
if (m_pUnkUserImage) {
m_pUnkUserImage->QueryInterface(IID_IImageMap,(LPVOID*)&m_pIUserImage);
ASSERT(m_pIUserImage);
m_pIUserImage->Initialize(IDB_MAILNEWS,16,16);
}
m_hFont = NULL;
}
CSearchOutliner::~CSearchOutliner ( )
{
if (m_pUnkUserImage) {
if (m_pIUserImage)
m_pUnkUserImage->Release();
}
if (m_hFont) {
theApp.ReleaseAppFont(m_hFont);
}
}
BEGIN_MESSAGE_MAP(CSearchOutliner, CMSelectOutliner )
//{{AFX_MSG_MAP(CSearchOutliner)
ON_WM_CREATE()
ON_WM_KEYDOWN()
ON_WM_CHAR()
ON_WM_SETFOCUS()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CSearchOutliner::OnSetFocus(CWnd* pOldWnd)
{
CMSelectOutliner::OnSetFocus(pOldWnd);
int iTotal = GetTotalLines();
MSG_ViewIndex * indices = NULL;
int iSelected = 0;
GetSelection(indices, iSelected);
if((iSelected == 0) && (iTotal > 0))
SelectItem(0);
}
void CSearchOutliner::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar == VK_DELETE)
{
BOOL bShiftPressed = (GetKeyState(VK_SHIFT) < 0);
deleteMessages(bShiftPressed);
return;
}
CMSelectOutliner::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CSearchOutliner::deleteMessages(BOOL bNoTrash)
{
MSG_ViewIndex *indices = NULL;
int count = 0;
GetSelection(indices, count);
MSG_Command(m_pSearchPane, bNoTrash ? MSG_DeleteMessageNoTrash : MSG_DeleteMessage, indices, count);
}
void CSearchOutliner::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(nChar == 1) // CTRL/A -- select all
{
int iTotalLines = GetTotalLines();
if(iTotalLines > 0)
SelectRange(0, iTotalLines - 1, TRUE);
}
CMSelectOutliner::OnChar(nChar, nRepCnt, nFlags);
}
int CSearchOutliner::OnCreate ( LPCREATESTRUCT lpCreateStruct )
{
int iRetVal = COutliner::OnCreate ( lpCreateStruct );
InitializeClipFormats ( );
return iRetVal;
}
void CSearchOutliner::PropertyMenu ( int iSel, UINT flags )
{
HMENU hmenu = CreatePopupMenu();
if ( !hmenu )
return; // Bail
if ( iSel < m_iTotalLines )
{
::AppendMenu( hmenu, MF_STRING, ID_FILE_OPENMESSAGE, szLoadString( IDS_POPUP_OPENMESSAGE ) );
::AppendMenu( hmenu, MF_SEPARATOR, 0, NULL );
HMENU hFileMenu = CreatePopupMenu();
UINT nID = FIRST_MOVE_MENU_ID;
CMailNewsFrame::UpdateMenu( NULL, hFileMenu, nID );
::AppendMenu( hmenu, MF_POPUP|MF_STRING, (UINT) hFileMenu, szLoadString( IDS_POPUP_FILE ) );
::AppendMenu( hmenu, MF_STRING, CASTUINT(ID_EDIT_DELETEMESSAGE), szLoadString( IDS_POPUP_DELETEMESSAGE ) );
}
// Track the popup now.
POINT pt = m_ptHit;
ClientToScreen(&pt);
::TrackPopupMenu( hmenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0,
GetParentFrame()->GetSafeHwnd(), NULL);
// Cleanup
VERIFY(::DestroyMenu( hmenu ));
}
void CSearchOutliner::InitializeClipFormats(void)
{
m_cfSearchMessages = (CLIPFORMAT)RegisterClipboardFormat(NETSCAPE_SEARCH_FORMAT);
}
CLIPFORMAT * CSearchOutliner::GetClipFormatList(void)
{
static CLIPFORMAT cfFormatList[2];
cfFormatList[0] = m_cfSearchMessages;
cfFormatList[1] = 0;
return cfFormatList;
}
COleDataSource * CSearchOutliner::GetDataSource(void)
{
MSG_ViewIndex *indices;
int count;
GetSelection(indices, count);
HANDLE hContent = GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE,sizeof(MailNewsDragData));
MailNewsDragData *pDragData = (MailNewsDragData *) GlobalLock (hContent);
pDragData->m_pane = m_pSearchPane;
pDragData->m_indices = indices;
pDragData->m_count = count;
GlobalUnlock(hContent);
COleDataSource * pDataSource = new COleDataSource;
pDataSource->CacheGlobalData(m_cfSearchMessages,hContent);
if ( count == 1 ) {
MSG_ResultElement *elem = NULL;
MSG_GetResultElement(m_pSearchPane, indices[0], &elem);
MSG_SearchValue *value;
MSG_GetResultAttribute(elem, attribMessageKey, &value);
MessageKey key = value->u.key;
MSG_GetResultAttribute(elem, attribSubject, &value);
URL_Struct *url = MSG_ConstructUrlForMessage( m_pSearchPane, key );
if ( url ) {
NET_FreeURLStruct( url );
}
}
return pDataSource;
}
BOOL CSearchOutliner::DeleteItem ( int iLine )
{
#ifndef DEBUG_phil
// Delete? Are you kidding?
MessageBeep(0);
return FALSE;
#else
MSG_ResultElement *elem = NULL;
MSG_GetResultElement (m_pSearchPane, iLine, &elem);
char *fileName = wfe_GetExistingFileName(m_hWnd, szLoadString(IDS_FILETOATTACH), ALL, TRUE);
if (fileName)
{
CString cs;
WFE_ConvertFile2Url(cs,(const char *)fileName);
MSG_SearchValue value;
value.attribute = attribJpegFile;
value.u.string = XP_STRDUP(cs);
MSG_ModifyLdapResult (elem, &value);
XP_FREE (fileName);
XP_FREE(value.u.string);
}
return TRUE;
#endif
}
void CSearchOutliner::ChangeResults (int num)
{
int iOldTotal = m_iTotalLines;
m_iTotalLines += num;
EnableScrollBars();
if (num > 0)
HandleInsert(iOldTotal, num);
else
HandleDelete(iOldTotal, -num);
}
HFONT CSearchOutliner::GetLineFont(void *pLineData)
{
MSG_SearchValue *folderInfoResult;
MSG_GetResultAttribute( (MSG_ResultElement *) pLineData, attribFolderInfo,
&folderInfoResult );
int16 doc_csid = 0;
if (folderInfoResult)
doc_csid = MSG_GetFolderCSID( folderInfoResult->u.folder );
if (!doc_csid)
doc_csid = INTL_DefaultWinCharSetID(0);
int16 win_csid = INTL_DocToWinCharSetID(doc_csid);
if ( win_csid != m_iCSID ) {
m_iCSID = win_csid;
CClientDC dc( this );
if (m_hFont) {
theApp.ReleaseAppFont(m_hFont);
}
LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT));
lf.lfPitchAndFamily = FF_SWISS;
lf.lfCharSet = IntlGetLfCharset(win_csid);
if (win_csid == CS_LATIN1)
_tcscpy(lf.lfFaceName, "MS Sans Serif");
else
_tcscpy(lf.lfFaceName, IntlGetUIPropFaceName(win_csid));
lf.lfHeight = -MulDiv(9, dc.GetDeviceCaps(LOGPIXELSY), 72);
m_hFont = theApp.CreateAppFont( lf );
}
return m_hFont ? m_hFont : m_hRegFont;
}
int CSearchOutliner::TranslateIcon (void * pData)
{
// Do something smart to differentiate between mail and news
int idxImage = IDX_MAILMESSAGE;
return idxImage;
}
int CSearchOutliner::TranslateIconFolder (void * pData)
{
// We're a flat list, so we're never a folder
return ( OUTLINER_ITEM );
}
void * CSearchOutliner::AcquireLineData ( int line )
{
MSG_ResultElement *elem = NULL;
MSG_GetResultElement (m_pSearchPane, line, &elem);
return elem;
}
void CSearchOutliner::GetTreeInfo ( int iLine, uint32 * pFlags, int * pDepth,
OutlinerAncestorInfo ** pAncestor )
{
if ( pFlags ) *pFlags = 0; // Flags?
if ( pDepth ) *pDepth = 0; // We're flat, remember?
}
void CSearchOutliner::ReleaseLineData ( void * )
{
}
LPCTSTR CSearchOutliner::GetColumnText ( UINT iColumn, void * pLineData )
{
MSG_SearchValue *result;
MSG_SearchAttribute attrib = (MSG_SearchAttribute) iColumn;
CString cs;
szResultText[0] = '\0'; // default to empty string
szResultText[63] = '\0';
if (MSG_GetResultAttribute( (MSG_ResultElement *) pLineData, attrib, &result) ==
SearchError_Success) {
switch (result->attribute) {
case attribDate:
_tcsncpy(szResultText, MSG_FormatDate(m_pSearchPane, result->u.date), 63);
break;
case attribPriority:
MSG_GetPriorityName( result->u.priority, szResultText, 64);
break;
case attribMsgStatus:
MSG_GetStatusName( result->u.msgStatus, szResultText, 64);
break;
case attribSender:
case attribSubject:
{
char *buf = IntlDecodeMimePartIIStr(result->u.string, INTL_DocToWinCharSetID(m_iCSID), FALSE);
if (buf) {
_tcsncpy(szResultText, buf, 63);
XP_FREE(buf);
break;
}
}
default:
_tcsncpy(szResultText, result->u.string, 63);
break;
}
MSG_DestroySearchValue (result);
}
return szResultText;
}
void CSearchOutliner::OnSelDblClk()
{
BOOL bReuse = g_MsgPrefs.m_bMessageReuse;
if (GetKeyState(VK_MENU) & 0x8000)
bReuse = !bReuse;
MSG_ViewIndex *indices;
int i, count;
GetSelection(indices, count);
for ( i = 0; i < count; i++ ) {
MSG_ResultElement *elem = NULL;
MSG_GetResultElement(m_pSearchPane, indices[i], &elem);
ASSERT(elem);
if ( !elem )
continue;
MWContextType cxType = MSG_GetResultElementType( elem );
if ( cxType == MWContextMail || cxType == MWContextMailMsg ||
cxType == MWContextNews || cxType == MWContextNewsMsg ) {
CMessageFrame *frame = CMessageFrame::Open ();
MSG_OpenResultElement (elem, frame->GetPane());
} else if ( cxType == MWContextBrowser ) {
MWContext *pContext = NULL;
VERIFY(pContext = CFE_CreateNewDocWindow( NULL, NULL ));
if (pContext) {
MSG_OpenResultElement( elem, (MSG_Pane *) pContext );
}
} else {
ASSERT(0); // What on earth are you passing me?
}
}
}
void CSearchOutliner::OnSelChanged()
{
#ifndef _WIN32 // Force update on Win16
GetParentFrame()->SendMessageToDescendants(WM_IDLEUPDATECMDUI, (WPARAM)TRUE, (LPARAM)0);
#endif
}
void CSearchOutliner::MysticStuffStarting( XP_Bool asynchronous,
MSG_NOTIFY_CODE notify,
MSG_ViewIndex where,
int32 num )
{
++m_iMysticPlane;
}
void CSearchOutliner::MysticStuffFinishing( XP_Bool asynchronous,
MSG_NOTIFY_CODE notify,
MSG_ViewIndex where,
int32 num )
{
if (notify == MSG_NotifyInsertOrDelete)
{
if (num > 0)
HandleInsert(where, num);
else
HandleDelete(where, -num);
((CSearchFrame*)GetParentFrame())->ModalStatusEnd();
}
}
/////////////////////////////////////////////////////////////////////////////
// CSearchOutlinerParent
BOOL CSearchOutlinerParent::RenderData ( int idColumn, CRect & rect, CDC &dc, LPCTSTR text )
{
MSG_SearchAttribute attrib = (MSG_SearchAttribute) idColumn;
CSearchOutliner *pOutliner = (CSearchOutliner *) m_pOutliner;
// Draw Sort Indicator
MSG_COMMAND_CHECK_STATE sortType = pOutliner->m_attribSortBy == attrib ? MSG_Checked : MSG_Unchecked;
if (sortType != MSG_Checked)
return FALSE;
int idxImage = pOutliner->m_bSortDescending ? IDX_SORTINDICATORUP : IDX_SORTINDICATORDOWN;
UINT dwDTFormat = DT_NOCLIP | DT_NOPREFIX | DT_SINGLELINE | DT_VCENTER;
RECT rectText = rect;
rectText.left += 4;
rectText.right -= 5;
rectText.right -= 14;
m_pIImage->DrawTransImage( idxImage,
rectText.right + 4,
(rect.top + rect.bottom) / 2 - 4,
&dc );
WFE_DrawTextEx( 0, dc.m_hDC, (LPTSTR) text, -1,
&rectText, dwDTFormat, WFE_DT_CROPRIGHT );
return TRUE;
}
COutliner * CSearchOutlinerParent::GetOutliner ( void )
{
return new CSearchOutliner;
}
void CSearchOutlinerParent::CreateColumns ( void )
{
CString cs;
cs.LoadString(IDS_MAIL_SUBJECT);
m_pOutliner->AddColumn ( cs, attribSubject, 20, 0, ColumnVariable, 3500 );
cs.LoadString(IDS_MAIL_SENDER);
m_pOutliner->AddColumn ( cs, attribSender, 20, 0, ColumnVariable, 2500 );
cs.LoadString(IDS_MAIL_DATE);
m_pOutliner->AddColumn ( cs, attribDate, 20, 0, ColumnVariable, 1000 );
cs.LoadString(IDS_MAIL_PRIORITY);
m_pOutliner->AddColumn ( cs, attribPriority, 20, 0, ColumnVariable, 1000 );
cs.LoadString(IDS_MAIL_LOCATION);
m_pOutliner->AddColumn ( cs, attribLocation, 20, 0, ColumnVariable, 2000 );
m_pOutliner->SetImageColumn( attribSubject );
m_pOutliner->SetHasPipes( FALSE );
}
BOOL CSearchOutlinerParent::ColumnCommand ( int idColumn )
{
MSG_SearchAttribute attrib = (MSG_SearchAttribute) idColumn;
CSearchOutliner *pOutliner = (CSearchOutliner *) m_pOutliner;
if (attrib == pOutliner->m_attribSortBy) {
pOutliner->m_bSortDescending = !pOutliner->m_bSortDescending;
} else {
pOutliner->m_attribSortBy = attrib;
}
MSG_SortResultList(pOutliner->m_pSearchPane, pOutliner->m_attribSortBy, pOutliner->m_bSortDescending);
Invalidate();
pOutliner->Invalidate();
return TRUE;
}
void CSearchFrame::Open()
{
if (!g_pSearchWindow) {
g_pSearchWindow = new CSearchFrame();
g_pSearchWindow->Create();
} else {
g_pSearchWindow->ActivateFrame( g_pSearchWindow->IsIconic() ? SW_RESTORE : SW_SHOW );
}
}
void CSearchFrame::Open( CMailNewsFrame *pFrame )
{
CSearchFrame::Open();
if ( g_pSearchWindow ) {
g_pSearchWindow->UpdateScopes( pFrame );
}
}
void CSearchFrame::Close()
{
if (g_pSearchWindow) {
g_pSearchWindow->PostMessage(WM_CLOSE);
}
}
#if 0 // MW fix
/////////////////////////////////////////////////////////////////////////////
// CLDAPSearchFrame
void CLDAPSearchFrame::Create()
{
m_bIsLDAPSearch = TRUE;
DWORD dwDefaultStyle = WS_OVERLAPPEDWINDOW|WS_CLIPSIBLINGS|WS_CLIPCHILDREN;
CString strFullString, strTitle;
strFullString.LoadString( IDR_SEARCHFRAME );
AfxExtractSubString( strTitle, strFullString, 0 );
LPCTSTR lpszClass = GetIconWndClass( dwDefaultStyle, IDR_SEARCHFRAME );
LPCTSTR lpszTitle = strTitle;
CFrameWnd::Create(lpszClass, lpszTitle, dwDefaultStyle);
ActivateFrame();
}
BOOL CLDAPSearchFrame::OnCreateClient( LPCREATESTRUCT lpcs, CCreateContext* pContext )
{
CWnd *pWnd;
CCreateContext Context;
Context.m_pNewViewClass = RUNTIME_CLASS(CLDAPSearchView);
if ( pWnd = CreateView(&Context) ) {
COutlinerView *pView = (COutlinerView *) pWnd;
pView->CreateColumns ( );
m_pOutliner = (CLDAPSearchOutliner *) pView->m_pOutlinerParent->m_pOutliner;
m_pOutliner->SetContext( GetContext() );
m_pOutliner->SetPane (m_pSearchPane);
} else {
return FALSE;
}
return TRUE;
}
BEGIN_MESSAGE_MAP(CLDAPSearchFrame, CSearchFrame)
ON_WM_CREATE()
ON_WM_CLOSE()
ON_CBN_SELCHANGE(IDC_COMBO_SCOPE, OnScope)
ON_BN_CLICKED(IDC_FIND, OnFind)
ON_BN_CLICKED(IDC_ADD, OnAdd)
ON_UPDATE_COMMAND_UI(IDC_ADD, OnUpdateAdd)
ON_BN_CLICKED(IDC_TO, OnTo)
ON_UPDATE_COMMAND_UI(IDC_TO, OnUpdateTo)
END_MESSAGE_MAP()
int CLDAPSearchFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
UINT aIDArray[] = { ID_SEPARATOR, IDS_TRANSFER_STATUS };
int res = CFrameWnd::OnCreate(lpCreateStruct);
m_barSearch.m_bLDAP = TRUE;
m_helpString = HELP_SEARCH_LDAP;
#ifdef _WIN32
m_barSearch.Create( this, IDD_SEARCHLDAP, WS_CHILD|CBRS_ALIGN_TOP, 1 );
#else
m_barSearch.Create( this, IDD_SEARCHLDAP, WS_CHILD|CBRS_TOP, 1 );
#endif
m_barStatus.Create( this, FALSE, FALSE );
m_barAction.Create( this, IDD_LDAPSEARCH, WS_CHILD|CBRS_BOTTOM, 2);
m_barStatus.SetPaneText(m_barStatus.CommandToIndex( ID_SEPARATOR),
szLoadString(IDS_SEARCHLDAP));
RecalcLayout( );
m_barSearch.InitializeAttributes (widgetText, attribCommonName);
CComboBox *combo;
combo = (CComboBox *) m_barSearch.GetDlgItem(IDC_COMBO_SCOPE);
combo->ResetContent();
XP_List *ldapDirectories = XP_ListNew();
if (ldapDirectories) {
DIR_GetLdapServers (theApp.m_directories, ldapDirectories);
if (XP_ListCount(ldapDirectories)) {
for (int i = 1; i <= XP_ListCount(ldapDirectories); i++) {
DIR_Server *server = (DIR_Server*) XP_ListGetObjectNum (ldapDirectories, i);
XP_ASSERT(server);
if (server) {
if (server->description && server->description[0])
combo->AddString (server->description);
else
combo->AddString (server->serverName);
combo->SetItemData (i-1, scopeLdapDirectory * 2);
}
}
XP_ListDestroy (ldapDirectories);
}
else {
combo->AddString("");
combo->SetItemData (0, scopeLdapDirectory * 2);
}
}
else {
combo->AddString("");
combo->SetItemData (0, scopeLdapDirectory * 2);
}
combo->SetCurSel(0);
OnScope();
// Initially size window to only dialog + title bar.
CRect rect, rect2;
int BorderX = GetSystemMetrics(SM_CXFRAME);
int BorderY = GetSystemMetrics(SM_CYFRAME);
GetWindowRect(&rect);
m_barSearch.GetWindowRect(&rect2);
CSize size = m_barSearch.CalcFixedLayout(FALSE, FALSE);
// Figure height of title bar + bottom border
size.cy += rect2.top - rect.top + BorderY;
size.cx += BorderX * 2;
SetWindowPos( NULL, 0, 0, size.cx, size.cy,
SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOZORDER);
m_iHeight = size.cy;
m_iWidth = size.cx;
OnNew();
ShowResults( TRUE );
return res;
}
void CLDAPSearchFrame::OnClose()
{
if (m_pOutliner)
m_pOutliner->SaveXPPrefs("mailnews.ldapsearch_columns_win");
CFrameWnd::OnClose();
g_pLDAPSearchWindow = NULL;
}
void CLDAPSearchFrame::OnScope()
{
CSearchFrame::OnScope();
CComboBox *combo = (CComboBox *) m_barSearch.GetDlgItem(IDC_COMBO_SCOPE);
int iCurSel = combo->GetCurSel();
XP_List *ldapDirectories = XP_ListNew();
if (!ldapDirectories)
return;
DIR_GetLdapServers(theApp.m_directories, ldapDirectories);
DIR_Server *pServer = (DIR_Server*) XP_ListGetObjectNum(ldapDirectories, iCurSel + 1);
XP_ListDestroy (ldapDirectories);
if (!pServer)
return;
int iCount = m_pOutliner->GetNumColumns();
for (int i = 0; i < iCount; i++) {
MSG_SearchAttribute attrib = (MSG_SearchAttribute) m_pOutliner->GetColumnAtPos(i);
DIR_AttributeId id;
MSG_SearchAttribToDirAttrib(attrib, &id);
const char *text = DIR_GetAttributeName(pServer, id);
m_pOutliner->SetColumnName(attrib, text);
}
m_pOutliner->GetParent()->Invalidate();
}
void CLDAPSearchFrame::OnFind()
{
if ( m_bSearching ) {
// We've turned into stop button
XP_InterruptContext( GetContext() );
m_bSearching = FALSE;
return;
} else if (CanAllInterrupt()) {
AllInterrupt();
}
// Build Search
ShowResults( FALSE );
MSG_SearchFree (m_pSearchPane);
MSG_SearchAlloc (m_pSearchPane);
ASSERT(m_pOutliner);
m_pOutliner->Invalidate();
CComboBox *combo;
int iCurSel;
combo = (CComboBox *) m_barSearch.GetDlgItem( IDC_COMBO_SCOPE );
iCurSel = combo->GetCurSel();
XP_List *ldapDirectories = XP_ListNew();
if (!ldapDirectories)
return;
DIR_GetLdapServers (theApp.m_directories, ldapDirectories);
DIR_Server *pServer = (DIR_Server*) XP_ListGetObjectNum (ldapDirectories, iCurSel + 1);
XP_ListDestroy (ldapDirectories);
if (!pServer)
return;
MSG_AddLdapScope( m_pSearchPane, pServer);
m_barSearch.BuildQuery (m_pSearchPane);
if (MSG_Search(m_pSearchPane) == SearchError_Success) {
m_bSearching = TRUE;
ShowResults( TRUE );
SendMessageToDescendants(WM_IDLEUPDATECMDUI, (WPARAM)TRUE, (LPARAM)0);
m_barStatus.SetPaneText(m_barStatus.CommandToIndex( ID_SEPARATOR),
szLoadString( IDS_SEARCHING ) );
}
}
void CLDAPSearchFrame::OnAdd()
{
MSG_ViewIndex *indices;
int count;
m_pOutliner->GetSelection( indices, count );
MSG_AddLdapResultsToAddressBook( m_pSearchPane, indices, count );
}
void CLDAPSearchFrame::OnUpdateAdd( CCmdUI *pCmdUI )
{
MSG_ViewIndex *indices;
int count;
m_pOutliner->GetSelection( indices, count );
pCmdUI->Enable( count > 0 && !m_bSearching);
}
void CLDAPSearchFrame::OnTo()
{
MSG_ViewIndex *indices;
int count;
m_pOutliner->GetSelection( indices, count );
MSG_ComposeFromLdapResults( m_pSearchPane, indices, count);
}
void CLDAPSearchFrame::OnUpdateTo( CCmdUI *pCmdUI )
{
MSG_ViewIndex *indices;
int count;
m_pOutliner->GetSelection( indices, count );
pCmdUI->Enable( count > 0 && !m_bSearching);
}
/////////////////////////////////////////////////////////////////////////////
// CLDAPSearchOutliner
BEGIN_MESSAGE_MAP(CLDAPSearchOutliner, CSearchOutliner)
//{{AFX_MSG_MAP(CLDAPSearchOutliner)
ON_WM_CREATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
int CLDAPSearchOutliner::OnCreate ( LPCREATESTRUCT lpCreateStruct )
{
int iRetVal = CSearchOutliner::OnCreate ( lpCreateStruct );
InitializeClipFormats ( );
return iRetVal;
}
HFONT CLDAPSearchOutliner::GetLineFont( void *pData )
{
return m_hRegFont;
}
int CLDAPSearchOutliner::TranslateIcon (void * pData)
{
// Do something smart
int idxImage = IDX_MAILMESSAGE;
return idxImage;
}
void CLDAPSearchOutliner::InitializeClipFormats(void)
{
m_cfAddresses = (CLIPFORMAT)RegisterClipboardFormat(vCardClipboardFormat);
m_cfSourceTarget = (CLIPFORMAT)RegisterClipboardFormat(LDAPSEARCH_SOURCETARGET_FORMAT);
}
CLIPFORMAT * CLDAPSearchOutliner::GetClipFormatList(void)
{
static CLIPFORMAT cfFormatList[3];
cfFormatList[0] = m_cfAddresses;
cfFormatList[1] = m_cfSourceTarget;
cfFormatList[2] = 0;
return cfFormatList;
}
COleDataSource * CLDAPSearchOutliner::GetDataSource(void)
{
COleDataSource * pDataSource = new COleDataSource;
char* pVcard = NULL;
char* pVcards = XP_STRDUP("");
HANDLE hString = 0;
PersonEntry person;
char szFirstNameText[130] = "\0";
char szLastNameText[130] = "\0";
char szEmailText[130] = "\0";
char szOrganizationText[130] = "\0";
char szLocalityText[130] = "\0";
char szWorkPhoneText[130] = "\0";
MSG_ResultElement* elem = NULL;
MSG_SearchValue *result = NULL;
MSG_ViewIndex *indices;
int count;
GetSelection( indices, count );
for (int i = 0; i < count; i++){
szFirstNameText[0] = '\0';
szLastNameText[0] = '\0';
szEmailText[0] = '\0';
szOrganizationText[0] = '\0';
szLocalityText[0] = '\0';
szWorkPhoneText[0] = '\0';
if (MSG_GetResultElement (m_pSearchPane, indices[i], &elem) == SearchError_Success) {
if (MSG_GetResultAttribute( elem, attribGivenName, &result) == SearchError_Success) {
XP_STRNCPY_SAFE (szFirstNameText, result->u.string, sizeof (szFirstNameText));
MSG_DestroySearchValue (result);
}
if (MSG_GetResultAttribute( elem, attribSurname, &result) == SearchError_Success) {
XP_STRNCPY_SAFE (szLastNameText, result->u.string, sizeof (szLastNameText));
MSG_DestroySearchValue (result);
}
if (MSG_GetResultAttribute( elem, attrib822Address, &result) == SearchError_Success) {
XP_STRNCPY_SAFE (szEmailText, result->u.string, sizeof (szEmailText));
MSG_DestroySearchValue (result);
}
if (MSG_GetResultAttribute( elem, attribOrganization, &result) == SearchError_Success) {
XP_STRNCPY_SAFE (szOrganizationText, result->u.string, sizeof (szOrganizationText));
MSG_DestroySearchValue (result);
}
if (MSG_GetResultAttribute( elem, attribLocality, &result) == SearchError_Success) {
XP_STRNCPY_SAFE (szLocalityText, result->u.string, sizeof (szLocalityText));
MSG_DestroySearchValue (result);
}
if (MSG_GetResultAttribute( elem, attribPhoneNumber, &result) == SearchError_Success) {
XP_STRNCPY_SAFE (szWorkPhoneText, result->u.string, sizeof (szLocalityText));
MSG_DestroySearchValue (result);
}
if ((XP_STRLEN (szFirstNameText) == 0) || (XP_STRLEN (szLastNameText) == 0))
{
if (MSG_GetResultAttribute( elem, attribCommonName, &result) == SearchError_Success) {
XP_STRNCPY_SAFE (szFirstNameText, result->u.string, sizeof (szFirstNameText));
MSG_DestroySearchValue (result);
szLastNameText[0] = '\0';
}
}
}
person.Initialize();
if (szFirstNameText[0] != '\0')
person.pGivenName = szFirstNameText;
if (szLastNameText[0] != '\0')
person.pFamilyName = szLastNameText;
if (szOrganizationText[0] != '\0')
person.pCompanyName = szOrganizationText;
if (szLocalityText[0] != '\0')
person.pLocality = szLocalityText;
if (szEmailText[0] != '\0')
person.pEmailAddress = szEmailText;
if (szWorkPhoneText[0] != '\0')
person.pWorkPhone = szWorkPhoneText;
AB_ExportToVCardFromPerson(theApp.m_pABook, &person, &pVcard);
pVcards = StrAllocCat(pVcards, pVcard);
XP_FREE(pVcard);
pVcard = NULL;
}
if (pVcards) {
hString = GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE|GMEM_ZEROINIT,strlen(pVcards)+1);
LPSTR lpszString = (LPSTR)GlobalLock(hString);
strcpy(lpszString,pVcards);
XP_FREE (pVcards);
GlobalUnlock(hString);
pDataSource->CacheGlobalData(m_cfAddresses, hString);
pDataSource->CacheGlobalData(m_cfSourceTarget, hString);
pDataSource->CacheGlobalData(CF_TEXT, hString);
}
return pDataSource;
}
/////////////////////////////////////////////////////////////////////////////
// CSearchOutlinerParent
COutliner * CLDAPSearchOutlinerParent::GetOutliner ( void )
{
return new CLDAPSearchOutliner;
}
void CLDAPSearchOutlinerParent::CreateColumns ( void )
{
CString cs;
cs.LoadString(IDS_USERNAME);
m_pOutliner->AddColumn (cs, attribCommonName, 20, 0, ColumnVariable, 2500 );
cs.LoadString(IDS_EMAILADDRESS);
m_pOutliner->AddColumn (cs, attrib822Address, 20, 0, ColumnVariable, 2000 );
cs.LoadString(IDS_COMPANYNAME);
m_pOutliner->AddColumn (cs, attribOrganization, 20, 0, ColumnVariable, 2000 );
cs.LoadString(IDS_PHONE);
m_pOutliner->AddColumn (cs, attribPhoneNumber, 20, 0, ColumnVariable, 2000, FALSE);
cs.LoadString(IDS_LOCALITY);
m_pOutliner->AddColumn (cs, attribLocality, 20, 0, ColumnVariable, 1500 );
m_pOutliner->SetImageColumn( attribSubject );
m_pOutliner->SetHasPipes( FALSE );
m_pOutliner->SetVisibleColumns(DEF_VISIBLE_COLUMNS);
m_pOutliner->LoadXPPrefs("mailnews.ldapsearch_columns_win");
}
void CLDAPSearchFrame::Open()
{
XP_List *ldapDirectories = XP_ListNew();
if (!ldapDirectories)
return;
DIR_GetLdapServers(theApp.m_directories, ldapDirectories);
if (XP_ListCount(ldapDirectories)) {
if (!g_pLDAPSearchWindow) {
g_pLDAPSearchWindow = new CLDAPSearchFrame();
g_pLDAPSearchWindow->Create();
} else {
g_pLDAPSearchWindow->ActivateFrame( g_pLDAPSearchWindow->IsIconic() ? SW_RESTORE : SW_SHOW );
}
} else {
::MessageBox(FEU_GetLastActiveFrame()->GetSafeHwnd(),
szLoadString(IDS_NOLDAPSERVERS),
szLoadString(IDS_TITLE_ERROR),
MB_OK|MB_ICONSTOP);
}
XP_ListDestroy (ldapDirectories);
}
void CLDAPSearchFrame::Close()
{
if (g_pLDAPSearchWindow) {
g_pLDAPSearchWindow->PostMessage(WM_CLOSE);
}
}
#endif
void WFE_MSGOpenSearch()
{
CSearchFrame::Open();
}
void WFE_MSGSearchClose()
{
CSearchFrame::Close();
}
#if 0 //MW fix
void WFE_MSGOpenLDAPSearch()
{
CLDAPSearchFrame::Open();
}
void WFE_MSGLDAPSearchClose()
{
CLDAPSearchFrame::Close();
}
#endif