mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-01 06:35:42 +00:00
2503 lines
61 KiB
C++
Executable File
2503 lines
61 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 "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.
|
|
*/
|
|
// srchfrm.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "srchfrm.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 "advopdlg.h"
|
|
#include "edhdrdlg.h"
|
|
#include "srchobj.h"
|
|
#include "shcut.h"
|
|
#include "msgcom.h"
|
|
#include "mailqf.h"
|
|
#include "rdfglobal.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;
|
|
CLDAPSearchFrame *g_pLDAPSearchWindow = NULL;
|
|
|
|
#ifndef _AFXDLL
|
|
#undef new
|
|
#endif
|
|
IMPLEMENT_DYNCREATE(CSearchView, COutlinerView)
|
|
IMPLEMENT_DYNCREATE(CLDAPSearchView, COutlinerView)
|
|
#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_SEARCH);
|
|
}
|
|
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_SAVE);
|
|
if (widget)
|
|
SlideWindow(widget, dx, 0);
|
|
widget = GetDlgItem(IDC_SEARCHHELP);
|
|
SlideWindow(widget, dx, 0);
|
|
|
|
widget = GetDlgItem(IDC_ADVANCED_SEARCH);
|
|
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;
|
|
m_pAdvancedOptionsDlg = NULL;
|
|
m_pCustomHeadersDlg = 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_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_NEW, OnNew)
|
|
ON_UPDATE_COMMAND_UI(IDC_NEW, OnUpdateQuery)
|
|
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_SEARCH, OnAdvanced)
|
|
ON_UPDATE_COMMAND_UI( IDC_ADVANCED_SEARCH, 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_CBN_SELCHANGE(IDC_COMBO_AND_OR, OnAndOr)
|
|
ON_UPDATE_COMMAND_UI(IDC_COMBO_AND_OR, 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 )
|
|
|
|
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
|
|
//VERIFY(::DestroyMenu( hFileMenu ));
|
|
}
|
|
|
|
|
|
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::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 hwndActionFirst = ::GetNextDlgTabItem( m_barAction.m_hWnd, NULL, FALSE );
|
|
|
|
HWND hwndSearchLast = ::GetNextDlgTabItem( m_barSearch.m_hWnd, hwndSearchFirst, TRUE );
|
|
HWND hwndActionLast = ::GetNextDlgTabItem( m_barAction.m_hWnd, hwndActionFirst, TRUE );
|
|
|
|
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 );
|
|
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::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();
|
|
CComboBox *pCombo = (CComboBox *) m_barSearch.m_searchObj.GetColumnOneAttributeWidget(m_iRowSelected);
|
|
if (lParam == IDOK )
|
|
{
|
|
m_barSearch.m_searchObj.UpdateColumn1Attributes();
|
|
}
|
|
else
|
|
{
|
|
pCombo->SetCurSel(0);
|
|
}
|
|
MSG_ReleaseEditHeadersSemaphore(master, this);
|
|
m_pCustomHeadersDlg = NULL;
|
|
return 0;
|
|
}
|
|
|
|
|
|
LONG CSearchFrame::OnFinishedAdvanced(WPARAM wParam, LPARAM lParam )
|
|
{
|
|
m_barSearch.UpdateAttribList();
|
|
m_barSearch.UpdateOpList();
|
|
m_barSearch.m_searchObj.ReInitializeWidgets();
|
|
m_pAdvancedOptionsDlg = NULL;
|
|
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()
|
|
{
|
|
m_pAdvancedOptionsDlg = new CAdvSearchOptionsDlg(this);
|
|
if(m_pAdvancedOptionsDlg)
|
|
m_pAdvancedOptionsDlg->ShowWindow(SW_SHOW);
|
|
|
|
}
|
|
|
|
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);
|
|
|
|
|
|
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;
|
|
if ( m_bSearching || CanAllInterrupt()) {
|
|
cs.LoadString( IDS_STOP );
|
|
} else {
|
|
cs.LoadString( IDS_SEARCH );
|
|
}
|
|
|
|
pCmdUI->SetText( cs );
|
|
}
|
|
|
|
void CSearchFrame::OnUpdateAndOr(CCmdUI *pCmdUI)
|
|
{
|
|
|
|
if ( m_bSearching || CanAllInterrupt()) {
|
|
pCmdUI->Enable(FALSE);
|
|
}else {
|
|
pCmdUI->Enable(TRUE);
|
|
}
|
|
}
|
|
|
|
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::OnScope()
|
|
{
|
|
m_barSearch.UpdateAttribList();
|
|
m_barSearch.UpdateOpList();
|
|
}
|
|
|
|
void CSearchFrame::OnAttrib1()
|
|
{
|
|
EditHeader(0);
|
|
m_barSearch.UpdateOpList();
|
|
|
|
}
|
|
|
|
void CSearchFrame::OnAttrib2()
|
|
{
|
|
EditHeader(1);
|
|
m_barSearch.UpdateOpList();
|
|
}
|
|
|
|
void CSearchFrame::OnAttrib3()
|
|
{
|
|
EditHeader(2);
|
|
m_barSearch.UpdateOpList();
|
|
}
|
|
|
|
void CSearchFrame::OnAttrib4()
|
|
{
|
|
EditHeader(3);
|
|
m_barSearch.UpdateOpList();
|
|
}
|
|
|
|
void CSearchFrame::OnAttrib5()
|
|
{
|
|
EditHeader(4);
|
|
m_barSearch.UpdateOpList();
|
|
}
|
|
|
|
|
|
void CSearchFrame::EditHeader(int iRow)
|
|
{
|
|
//We are being asked to modify custom headers
|
|
CComboBox *combo;
|
|
int iCurSel;
|
|
MSG_SearchAttribute attrib;
|
|
m_iRowSelected = iRow;
|
|
combo = (CComboBox *) m_barSearch.m_searchObj.GetColumnOneAttributeWidget(iRow);
|
|
iCurSel = combo->GetCurSel();
|
|
attrib = (MSG_SearchAttribute) combo->GetItemData(iCurSel);
|
|
|
|
if (attrib == -1)
|
|
{
|
|
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);
|
|
combo->SetCurSel(0);
|
|
return;
|
|
//We can't edit anything since another window already has the semaphore.
|
|
}
|
|
}
|
|
else
|
|
{ //Something is hosed!
|
|
return;
|
|
}
|
|
|
|
m_pCustomHeadersDlg = new CCustomHeadersDlg(this);
|
|
if (m_pCustomHeadersDlg)
|
|
{
|
|
m_pCustomHeadersDlg->ShowWindow(SW_SHOW);
|
|
}
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// 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()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
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 ) {
|
|
RDFGLOBAL_DragTitleAndURL( pDataSource, value->u.string, url->address );
|
|
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);
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// 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);
|
|
}
|
|
}
|
|
|
|
void WFE_MSGOpenSearch()
|
|
{
|
|
CSearchFrame::Open();
|
|
}
|
|
|
|
void WFE_MSGSearchClose()
|
|
{
|
|
CSearchFrame::Close();
|
|
}
|
|
|
|
void WFE_MSGOpenLDAPSearch()
|
|
{
|
|
CLDAPSearchFrame::Open();
|
|
}
|
|
|
|
void WFE_MSGLDAPSearchClose()
|
|
{
|
|
CLDAPSearchFrame::Close();
|
|
}
|