mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-31 06:05:44 +00:00
1009 lines
27 KiB
C++
1009 lines
27 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape Public License
|
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
* http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
* for the specific language governing rights and limitations under the
|
|
* NPL.
|
|
*
|
|
* The Initial Developer of this code under the NPL is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
* Reserved.
|
|
*/
|
|
// srchobj.cpp : implementation file
|
|
//
|
|
|
|
|
|
#include "stdafx.h"
|
|
#include "srchobj.h"
|
|
#include "dirprefs.h"
|
|
#include "xp_time.h"
|
|
#include "xplocale.h"
|
|
#include "template.h"
|
|
#include "dateedit.h"
|
|
#include "intl_csi.h"
|
|
#include "msg_srch.h"
|
|
#include "advopdlg.h"
|
|
#include "wfemsg.h"
|
|
#include "edhdrdlg.h"
|
|
#include "numedit.h"
|
|
|
|
|
|
static int ChoicesTable[][4] =
|
|
{{IDC_COMBO_ATTRIB1, IDC_COMBO_OP1, IDC_EDIT_VALUE1, IDC_STATIC_THE1},
|
|
{IDC_COMBO_ATTRIB2, IDC_COMBO_OP2, IDC_EDIT_VALUE2, IDC_STATIC_THE2},
|
|
{IDC_COMBO_ATTRIB3, IDC_COMBO_OP3, IDC_EDIT_VALUE3, IDC_STATIC_THE3},
|
|
{IDC_COMBO_ATTRIB4, IDC_COMBO_OP4, IDC_EDIT_VALUE4, IDC_STATIC_THE4},
|
|
{IDC_COMBO_ATTRIB5, IDC_COMBO_OP5, IDC_EDIT_VALUE5, IDC_STATIC_THE5}};
|
|
|
|
#define COL_ATTRIB 0
|
|
#define COL_OP 1
|
|
#define COL_VALUE 2
|
|
#define COL_COUNT 4
|
|
|
|
static _TCHAR szResultText[64];
|
|
|
|
|
|
|
|
MSG_SearchError MSG_GetValuesForAttribute( MSG_ScopeAttribute scope,
|
|
MSG_SearchAttribute attrib,
|
|
MSG_SearchMenuItem *items,
|
|
uint16 *maxItems)
|
|
{
|
|
const int32 aiStatiValues[] = { MSG_FLAG_READ,
|
|
MSG_FLAG_REPLIED,
|
|
MSG_FLAG_FORWARDED,
|
|
MSG_FLAG_NEW,
|
|
MSG_FLAG_MARKED };
|
|
|
|
const MSG_PRIORITY aiPriorityValues[] = {
|
|
MSG_LowestPriority,
|
|
MSG_LowPriority,
|
|
MSG_NormalPriority,
|
|
MSG_HighPriority,
|
|
MSG_HighestPriority };
|
|
|
|
uint16 nStati = sizeof(aiStatiValues) / sizeof(int32);
|
|
uint16 nPriorities = sizeof(aiPriorityValues) / sizeof(MSG_PRIORITY);
|
|
uint16 i;
|
|
|
|
switch (attrib) {
|
|
case attribPriority:
|
|
for ( i = 0; i < nPriorities && i < *maxItems; i++ ) {
|
|
items[i].attrib = (int16) aiPriorityValues[i];
|
|
MSG_GetPriorityName( (MSG_PRIORITY) items[i].attrib,
|
|
items[i].name,
|
|
sizeof( items[i].name ) / sizeof(char) );
|
|
items[i].isEnabled = TRUE;
|
|
}
|
|
*maxItems = i;
|
|
if ( i == nPriorities ) {
|
|
return SearchError_Success;
|
|
} else {
|
|
return SearchError_ListTooSmall;
|
|
}
|
|
|
|
case attribMsgStatus:
|
|
for ( i = 0; i < nStati && i < *maxItems; i++ ) {
|
|
|
|
// XXX WHS Watch them int sizes!
|
|
// if a message status flag > 16 bits comes out,
|
|
// we'll need to resize MSG_SearchMenuItem.attrib
|
|
|
|
items[i].attrib = (int16) aiStatiValues[i];
|
|
MSG_GetStatusName( (int32) items[i].attrib,
|
|
items[i].name,
|
|
sizeof( items[i].name ) / sizeof(char) );
|
|
items[i].isEnabled = TRUE;
|
|
}
|
|
*maxItems = i;
|
|
if ( i == nStati ) {
|
|
return SearchError_Success;
|
|
} else {
|
|
return SearchError_ListTooSmall;
|
|
}
|
|
|
|
default:
|
|
*maxItems = 0;
|
|
return SearchError_InvalidAttribute;
|
|
}
|
|
}
|
|
|
|
|
|
static void SlideWindow( CWnd *pWnd, int dx, int dy )
|
|
{
|
|
CRect rect;
|
|
CWnd *parent;
|
|
|
|
if (pWnd)
|
|
{
|
|
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;
|
|
|
|
if (pWnd)
|
|
{
|
|
pWnd->GetWindowRect(&rect);
|
|
if (parent = pWnd->GetParent())
|
|
parent->ScreenToClient(&rect);
|
|
|
|
rect.bottom += dy;
|
|
rect.right += dx;
|
|
|
|
pWnd->MoveWindow(&rect, TRUE);
|
|
}
|
|
}
|
|
|
|
CSearchObject::CSearchObject()
|
|
{
|
|
m_wnd = NULL;
|
|
}
|
|
|
|
CSearchObject::~CSearchObject()
|
|
{
|
|
}
|
|
|
|
CComboBox * CSearchObject::GetColumnOneAttributeWidget(int iRow)
|
|
{
|
|
if (m_wnd)
|
|
return (CComboBox *)m_wnd->GetDlgItem( ChoicesTable[iRow][COL_ATTRIB] );
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
int CSearchObject::InitializeLDAPSearchWindow (MSG_Pane* searchPane, DIR_Server* curServer, int* iMoreCount, BOOL bLogicType)
|
|
{
|
|
MSG_SearchAttribute attrib;
|
|
MSG_SearchOperator op;
|
|
MSG_SearchValue value;
|
|
int numTerms = 0;
|
|
int numItems;
|
|
CComboBox *combo;
|
|
int i, j, k = 0;
|
|
DWORD dwItemData = (DWORD) -1L;
|
|
BOOL found = FALSE;
|
|
int dy = 0;
|
|
|
|
MSG_CountSearchTerms (searchPane, &numTerms);
|
|
|
|
// set the window to the right number of rows
|
|
if (numTerms) {
|
|
if ((*iMoreCount) <= numTerms - 1) {
|
|
for (j = (*iMoreCount); j < numTerms - 1; j++)
|
|
dy += More (iMoreCount, bLogicType);
|
|
}
|
|
else {
|
|
for (j = (*iMoreCount); j > numTerms - 1; j--)
|
|
dy += Fewer (iMoreCount, bLogicType);
|
|
}
|
|
}
|
|
|
|
// reset values back to null string
|
|
for (i = 0; i <= (*iMoreCount); i++)
|
|
{
|
|
(m_wnd->GetDlgItem( ChoicesTable[i][COL_VALUE]))->SetWindowText("");
|
|
}
|
|
|
|
for (i = 0; i < numTerms; i++)
|
|
{
|
|
MSG_GetNthSearchTerm (searchPane, i, &attrib, &op, &value);
|
|
// set the attribute
|
|
j = 0;
|
|
found = FALSE;
|
|
combo = (CComboBox *) m_wnd->GetDlgItem( ChoicesTable[i][COL_ATTRIB] );
|
|
numItems = combo->GetCount();
|
|
while (j < numItems && !found) {
|
|
dwItemData = combo->GetItemData(j);
|
|
if (dwItemData != (DWORD)attrib)
|
|
j++;
|
|
else
|
|
found = TRUE;
|
|
}
|
|
|
|
combo->SetCurSel (j);
|
|
|
|
if (found) {
|
|
// if the attribute is found make sure that
|
|
// it hasn't been remaped from customization of a different server
|
|
int numScopes = 0;
|
|
DIR_Server* server = NULL;
|
|
uint16 maxItems = 16;
|
|
MSG_SearchMenuItem items[16];
|
|
MSG_ScopeAttribute scope = scopeLdapDirectory;
|
|
MSG_CountSearchScopes (searchPane, &numScopes);
|
|
BOOL found2 = FALSE;
|
|
|
|
if (numScopes) {
|
|
ASSERT (numScopes == 1);
|
|
MSG_GetNthSearchScope (searchPane, 0, &scope, (void**) &server);
|
|
if (server && !DIR_AreServersSame (server, curServer)) {
|
|
MSG_GetAttributesForSearchScopes (WFE_MSGGetMaster(), scopeLdapDirectory,
|
|
(void**) &server, 1, items, &maxItems);
|
|
|
|
while (k < maxItems && !found2) {
|
|
if (items [k].attrib != attrib)
|
|
k++;
|
|
else
|
|
found2 = TRUE;
|
|
}
|
|
if (found2) {
|
|
char label [kSearchMenuLength];
|
|
combo->GetLBText(j, label );
|
|
if (strcmp (items [k].name, label ) != 0) {
|
|
found = FALSE;
|
|
combo->SetCurSel (0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// set the operator
|
|
if (found)
|
|
{
|
|
j = 0;
|
|
found = FALSE;
|
|
combo = (CComboBox *) m_wnd->GetDlgItem( ChoicesTable[i][COL_OP] );
|
|
numItems = combo->GetCount();
|
|
while (j < numItems && !found) {
|
|
dwItemData = combo->GetItemData(j);
|
|
if (dwItemData != (DWORD)op)
|
|
j++;
|
|
else
|
|
found = TRUE;
|
|
}
|
|
combo->SetCurSel (j);
|
|
// set the value
|
|
(m_wnd->GetDlgItem( ChoicesTable[i][COL_VALUE]))->SetWindowText(value.u.string);
|
|
}
|
|
}
|
|
return dy;
|
|
}
|
|
|
|
void CSearchObject::UpdateAttribList(MSG_ScopeAttribute scope, DIR_Server* pServer)
|
|
{
|
|
CComboBox *combo;
|
|
int i, j, iCurSel = -1;
|
|
DWORD dwItemData = (DWORD) -1L;
|
|
|
|
combo = (CComboBox *) m_wnd->GetDlgItem( IDC_COMBO_SCOPE );
|
|
if (combo) {
|
|
iCurSel = combo->GetCurSel();
|
|
dwItemData = combo->GetItemData(iCurSel);
|
|
}
|
|
|
|
//defines required for custom hearder vars
|
|
MSG_FolderInfo *folderInfos[1];
|
|
BOOL bUsesCustomHeaders;
|
|
folderInfos[0]= (MSG_FolderInfo *) dwItemData;
|
|
uint16 numItems = 0;
|
|
MSG_SearchMenuItem * HeaderItems = NULL;
|
|
CString strEditCustom;
|
|
//ldap searching define
|
|
uint16 maxItems = 16;
|
|
MSG_SearchMenuItem items[16];
|
|
|
|
if (scope != scopeLdapDirectory) {
|
|
MSG_GetNumAttributesForSearchScopes (WFE_MSGGetMaster(), scopeMailFolder, (void**)folderInfos, 1, &numItems);
|
|
bUsesCustomHeaders = MSG_ScopeUsesCustomHeaders(WFE_MSGGetMaster(), scopeMailFolder, folderInfos[0], FALSE);
|
|
HeaderItems = new MSG_SearchMenuItem [numItems+1];
|
|
if (!HeaderItems )
|
|
return; //something bad happened here!!
|
|
MSG_GetAttributesForSearchScopes (WFE_MSGGetMaster(), scope, (void **)folderInfos, 1, HeaderItems, &numItems);
|
|
//setup custom header combo selection text
|
|
strEditCustom.LoadString(IDS_EDIT_CUSTOM);
|
|
strcpy( HeaderItems[numItems].name, strEditCustom);
|
|
HeaderItems[numItems].attrib = -1; //identifies a command to launch the Edit headers dialog
|
|
HeaderItems[numItems].isEnabled = FALSE;
|
|
}
|
|
else {
|
|
DIR_Server *server = pServer;
|
|
if (iCurSel != -1) {
|
|
XP_List *ldapDirectories = XP_ListNew();
|
|
if (ldapDirectories) {
|
|
DIR_GetLdapServers (theApp.m_directories, ldapDirectories);
|
|
if (XP_ListCount(ldapDirectories))
|
|
server = (DIR_Server*) XP_ListGetObjectNum (ldapDirectories, iCurSel + 1);
|
|
XP_ListDestroy (ldapDirectories);
|
|
}
|
|
}
|
|
if (server)
|
|
MSG_GetAttributesForSearchScopes (WFE_MSGGetMaster(), scope, (void**)&server, 1, items, &maxItems);
|
|
}
|
|
|
|
|
|
for (i = 0; i < 5; i++) {
|
|
DWORD dwOldAttrib = (DWORD) -1L;
|
|
|
|
combo = (CComboBox *) m_wnd->GetDlgItem( ChoicesTable[i][COL_ATTRIB] );
|
|
int idx = combo->GetCurSel();
|
|
if (combo->GetCurSel() != -1)
|
|
dwOldAttrib = combo->GetItemData(idx);
|
|
combo->ResetContent();
|
|
|
|
if ( scope == scopeLdapDirectory)
|
|
{
|
|
for (j = 0; j < maxItems; j++) {
|
|
combo->AddString(items[j].name);
|
|
combo->SetItemData(j, items[j].attrib);
|
|
if (items[j].attrib == (MSG_SearchAttribute) dwOldAttrib)
|
|
combo->SetCurSel(j);
|
|
}
|
|
}
|
|
else
|
|
{ //do extra work to handle custom headers. We only do this for searching messages.
|
|
|
|
for (j = 0; j < numItems; j++) {
|
|
combo->AddString(HeaderItems[j].name);
|
|
combo->SetItemData(j, HeaderItems[j].attrib);
|
|
if (HeaderItems[j].attrib == (MSG_SearchAttribute) dwOldAttrib)
|
|
combo->SetCurSel(j);
|
|
}
|
|
if (j == numItems && bUsesCustomHeaders)
|
|
{ //place the edit text in the last position of the combo box
|
|
combo->AddString(HeaderItems[j].name);
|
|
combo->SetItemData(j, HeaderItems[j].attrib);
|
|
}
|
|
}
|
|
if (combo->GetCurSel() == -1)
|
|
combo->SetCurSel(i % combo->GetCount());
|
|
}
|
|
if (HeaderItems)
|
|
delete HeaderItems; //free the memory to the header array since it's now in the combo box
|
|
}
|
|
|
|
void CSearchObject::UpdateOpList(MSG_ScopeAttribute scope, DIR_Server* pServer)
|
|
{
|
|
for (int i = 0; i < 5; i++) {
|
|
UpdateOpList(i, scope, pServer);
|
|
}
|
|
}
|
|
|
|
void CSearchObject::UpdateOpList(int iRow, MSG_ScopeAttribute scope, DIR_Server* pServer)
|
|
{
|
|
CComboBox *combo;
|
|
CWnd *widget, *widgetPrior;
|
|
CEdit *edit;
|
|
CNSNumEdit *AgeInDays;
|
|
CNSDateEdit *date;
|
|
DWORD dwItemData = (DWORD) -1L;
|
|
|
|
int j, iAttribCurSel, iScopeCurSel = -1;
|
|
MSG_SearchAttribute attrib;
|
|
|
|
combo = (CComboBox *) m_wnd->GetDlgItem( IDC_COMBO_SCOPE );
|
|
if (combo) {
|
|
iScopeCurSel = combo->GetCurSel();
|
|
dwItemData = combo->GetItemData(iScopeCurSel);
|
|
}
|
|
|
|
combo = (CComboBox *) m_wnd->GetDlgItem( ChoicesTable[iRow][COL_ATTRIB] );
|
|
iAttribCurSel = combo->GetCurSel();
|
|
attrib = (MSG_SearchAttribute) combo->GetItemData(iAttribCurSel);
|
|
|
|
DWORD dwOldOp = (DWORD) -1L;
|
|
MSG_SearchMenuItem items[16];
|
|
uint16 maxItems = 16;
|
|
|
|
combo = (CComboBox *) m_wnd->GetDlgItem( ChoicesTable[iRow][COL_OP] );
|
|
int idx = combo->GetCurSel();
|
|
if (idx != -1)
|
|
dwOldOp = combo->GetItemData(idx);
|
|
combo->ResetContent();
|
|
|
|
if (scope != scopeLdapDirectory) {
|
|
MSG_FolderInfo *folderInfos[1];
|
|
folderInfos[0]= (MSG_FolderInfo *) dwItemData;
|
|
MSG_GetOperatorsForSearchScopes(WFE_MSGGetMaster(), scope, (void **) folderInfos, 1, attrib, items, &maxItems);
|
|
} else {
|
|
DIR_Server *server = pServer;
|
|
if (iScopeCurSel != -1) {
|
|
XP_List *ldapDirectories = XP_ListNew();
|
|
if (ldapDirectories) {
|
|
DIR_GetLdapServers (theApp.m_directories, ldapDirectories);
|
|
if (XP_ListCount(ldapDirectories))
|
|
server = (DIR_Server*) XP_ListGetObjectNum (ldapDirectories, iScopeCurSel + 1);
|
|
XP_ListDestroy (ldapDirectories);
|
|
}
|
|
}
|
|
if (server)
|
|
MSG_GetOperatorsForSearchScopes(WFE_MSGGetMaster(), scope, (void **) &server, 1, attrib, items, &maxItems);
|
|
}
|
|
|
|
for (j = 0; j < maxItems; j++) {
|
|
combo->AddString(items[j].name);
|
|
combo->SetItemData(j, items[j].attrib);
|
|
if (items[j].attrib == (MSG_SearchOperator) dwOldOp)
|
|
combo->SetCurSel(j);
|
|
}
|
|
if (combo->GetCurSel() == -1)
|
|
combo->SetCurSel(0);
|
|
|
|
// Calculate a dialog unit
|
|
RECT rect = {0, 0, 1, 1};
|
|
::MapDialogRect(m_wnd->m_hWnd, &rect);
|
|
int iDialogUnit = rect.right;
|
|
|
|
POINT ptUs = {0,0};
|
|
m_wnd->ClientToScreen(&ptUs);
|
|
|
|
//
|
|
// Substitute a happy new widget based on the search attribute
|
|
//
|
|
|
|
if ( attrib == AttribWas [iRow] ) {
|
|
return;
|
|
}
|
|
|
|
AttribWas[iRow] = attrib;
|
|
|
|
MSG_SearchValueWidget valueWidget;
|
|
MSG_GetSearchWidgetForAttribute ( attrib, &valueWidget );
|
|
|
|
if (( WidgetWas[iRow] == valueWidget ) && ( valueWidget != widgetMenu) ) {
|
|
return;
|
|
}
|
|
widget = m_wnd->GetDlgItem( ChoicesTable[iRow][COL_VALUE] );
|
|
widgetPrior = m_wnd->GetDlgItem( ChoicesTable[iRow][COL_OP] );
|
|
|
|
RECT rectWidget;
|
|
widget->GetWindowRect(&rectWidget);
|
|
::OffsetRect( &rectWidget, -ptUs.x, -ptUs.y );
|
|
|
|
DWORD dwStyle = widget->GetStyle() &
|
|
(WS_CHILD|WS_VISIBLE|WS_DISABLED|WS_GROUP|WS_TABSTOP);
|
|
|
|
DWORD dwExStyle = 0;
|
|
widget->DestroyWindow();
|
|
|
|
switch( valueWidget ) {
|
|
case widgetMenu:
|
|
rectWidget.bottom = rectWidget.top + 60 * iDialogUnit;
|
|
dwStyle |= WS_VSCROLL|CBS_DROPDOWNLIST;
|
|
combo = new CComboBox;
|
|
maxItems = 16;
|
|
combo->Create( dwStyle, rectWidget, m_wnd, ChoicesTable[iRow][COL_VALUE] );
|
|
combo->SetFont(m_wnd->GetFont());
|
|
MSG_GetValuesForAttribute( scope, attrib, items, &maxItems );
|
|
for (j = 0; j < maxItems; j++) {
|
|
combo->AddString( items[j].name );
|
|
combo->SetItemData( j, items[j].attrib );
|
|
}
|
|
combo->SetCurSel(0);
|
|
combo->SetWindowPos( widgetPrior, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
|
|
break;
|
|
|
|
case widgetDate:
|
|
#ifdef _WIN32
|
|
dwExStyle |= WS_EX_CLIENTEDGE;
|
|
if ( !sysInfo.m_bWin4 )
|
|
#endif
|
|
{
|
|
dwStyle |= WS_BORDER;
|
|
}
|
|
dwStyle |= WS_CLIPCHILDREN;
|
|
|
|
date = new CNSDateEdit;
|
|
#ifdef _WIN32
|
|
date->CreateEx( dwExStyle, _T("STATIC"), "", dwStyle,
|
|
rectWidget.left, rectWidget.top,
|
|
rectWidget.right - rectWidget.left,
|
|
rectWidget.bottom - rectWidget.top,
|
|
m_wnd->m_hWnd, (HMENU) ChoicesTable[iRow][COL_VALUE]);
|
|
#else
|
|
date->Create( "", dwStyle|SS_SIMPLE, rectWidget, m_wnd, ChoicesTable[iRow][COL_VALUE] );
|
|
#endif
|
|
date->SetFont(m_wnd->GetFont() );
|
|
date->SetDate( CTime( time( NULL ) ) );
|
|
date->SetWindowPos( widgetPrior, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
|
|
break;
|
|
|
|
case widgetInt:
|
|
// TODO!!! Add edit class that takes only numbers
|
|
dwStyle |= ES_AUTOHSCROLL;
|
|
#ifdef _WIN32
|
|
dwExStyle |= WS_EX_CLIENTEDGE;
|
|
if ( !sysInfo.m_bWin4 )
|
|
#endif
|
|
{
|
|
dwStyle |= WS_BORDER;
|
|
}
|
|
AgeInDays = new CNSNumEdit;
|
|
#ifdef _WIN32
|
|
AgeInDays->CreateEx( dwExStyle, _T("EDIT"), "", dwStyle,
|
|
rectWidget.left, rectWidget.top,
|
|
rectWidget.right - rectWidget.left,
|
|
rectWidget.bottom - rectWidget.top,
|
|
m_wnd->m_hWnd, (HMENU) ChoicesTable[iRow][COL_VALUE]);
|
|
#else
|
|
AgeInDays->Create( dwStyle, rectWidget, m_wnd, ChoicesTable[iRow][COL_VALUE] );
|
|
#endif
|
|
AgeInDays->SetFont(m_wnd->GetFont());
|
|
//AgeInDays->SetWindowText(_T(""));
|
|
AgeInDays->SetValue(0);
|
|
AgeInDays->SetWindowPos( widgetPrior, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
|
|
break;
|
|
|
|
case widgetText:
|
|
default:
|
|
dwStyle |= ES_AUTOHSCROLL;
|
|
#ifdef _WIN32
|
|
dwExStyle |= WS_EX_CLIENTEDGE;
|
|
if ( !sysInfo.m_bWin4 )
|
|
#endif
|
|
{
|
|
dwStyle |= WS_BORDER;
|
|
}
|
|
edit = new CEdit;
|
|
#ifdef _WIN32
|
|
edit->CreateEx( dwExStyle, _T("EDIT"), "", dwStyle,
|
|
rectWidget.left, rectWidget.top,
|
|
rectWidget.right - rectWidget.left,
|
|
rectWidget.bottom - rectWidget.top,
|
|
m_wnd->m_hWnd, (HMENU) ChoicesTable[iRow][COL_VALUE]);
|
|
#else
|
|
edit->Create( dwStyle, rectWidget, m_wnd, ChoicesTable[iRow][COL_VALUE] );
|
|
#endif
|
|
edit->SetFont(m_wnd->GetFont());
|
|
edit->SetWindowText(_T(""));
|
|
edit->SetWindowPos( widgetPrior, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
|
|
break;
|
|
}
|
|
WidgetWas[iRow] = valueWidget;
|
|
}
|
|
|
|
int CSearchObject::More(int* moreCount, BOOL bLogicType)
|
|
{
|
|
CWnd *widget;
|
|
int dy = 0;
|
|
CRect rect, rect2;
|
|
|
|
if (*moreCount < 4)
|
|
{
|
|
(*moreCount)++;
|
|
|
|
CString strLogicText;
|
|
int nID = 0;
|
|
for (int i = 0; i < COL_COUNT; i++) {
|
|
nID = ChoicesTable[(*moreCount)][i];
|
|
widget = m_wnd->GetDlgItem(nID);
|
|
if(widget == NULL) continue;
|
|
if (i == 3 && bLogicType)
|
|
{
|
|
strLogicText.LoadString(IDS_ANDTHE);
|
|
widget->SetWindowText(strLogicText);
|
|
}
|
|
else if ( i==3 && !bLogicType)
|
|
{ //jump to another set up resource id's
|
|
strLogicText.LoadString(IDS_ORTHE);
|
|
widget->SetWindowText(strLogicText);
|
|
}
|
|
widget->ShowWindow(SW_SHOW);
|
|
}
|
|
|
|
widget = m_wnd->GetDlgItem(ChoicesTable[(*moreCount)][0]);
|
|
widget->GetWindowRect(&rect);
|
|
dy = rect.bottom;
|
|
widget = m_wnd->GetDlgItem(ChoicesTable[(*moreCount) - 1][0]);
|
|
widget->GetWindowRect(&rect);
|
|
dy -= rect.bottom;
|
|
widget = m_wnd->GetDlgItem(IDC_MORE);
|
|
SlideWindow(widget, 0, dy);
|
|
widget = m_wnd->GetDlgItem(IDC_FEWER);
|
|
SlideWindow(widget, 0, dy);
|
|
|
|
widget = m_wnd->GetDlgItem(IDC_NEW);
|
|
SlideWindow(widget, 0, dy);
|
|
|
|
widget = m_wnd->GetDlgItem(IDC_CLEAR_SEARCH);
|
|
SlideWindow(widget, 0, dy);
|
|
widget = m_wnd->GetDlgItem(IDC_STATIC_DESC);
|
|
SlideWindow(widget, 0, dy);
|
|
}
|
|
|
|
return dy;
|
|
}
|
|
|
|
void CSearchObject::OnAndOr(int iMoreCount, BOOL* bLogicType)
|
|
{
|
|
*bLogicType = m_wnd->IsDlgButtonChecked(IDC_RADIO_ALL);
|
|
ChangeLogicText(iMoreCount, *bLogicType);
|
|
}
|
|
|
|
int CSearchObject::ChangeLogicText(int iMoreCount, BOOL bLogicType)
|
|
{
|
|
if (iMoreCount <= 4)
|
|
{
|
|
CWnd *widget;
|
|
|
|
CString strLogicText;
|
|
int nID = 0;
|
|
for (int Row = 1; Row <= iMoreCount; Row++)
|
|
{
|
|
widget = m_wnd->GetDlgItem(ChoicesTable[Row][3]);
|
|
if (!widget) return 0;
|
|
if (bLogicType)
|
|
{ //Display AND logic text
|
|
strLogicText.LoadString(IDS_ANDTHE);
|
|
widget->SetWindowText(strLogicText);
|
|
}
|
|
else
|
|
{ //Display OR logic text
|
|
strLogicText.LoadString(IDS_ORTHE);
|
|
widget->SetWindowText(strLogicText);
|
|
}
|
|
widget->ShowWindow(SW_SHOW);
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
int CSearchObject::Fewer(int* iMoreCount, BOOL bLogicTyp)
|
|
{
|
|
CWnd *widget;
|
|
int dy = 0;
|
|
|
|
if (*iMoreCount > 0) {
|
|
for (int i = 0; i < COL_COUNT; i++) {
|
|
widget = m_wnd->GetDlgItem(ChoicesTable[*iMoreCount][i]);
|
|
if(widget == NULL) continue;
|
|
widget->ShowWindow(SW_HIDE);
|
|
}
|
|
(*iMoreCount)--;
|
|
|
|
CRect rect;
|
|
widget = m_wnd->GetDlgItem(ChoicesTable[*iMoreCount][0]);
|
|
widget->GetWindowRect(&rect);
|
|
dy = rect.bottom;
|
|
widget = m_wnd->GetDlgItem(ChoicesTable[*iMoreCount + 1][0]);
|
|
widget->GetWindowRect(&rect);
|
|
dy -= rect.bottom;
|
|
|
|
widget = m_wnd->GetDlgItem(IDC_MORE);
|
|
SlideWindow(widget, 0, dy);
|
|
widget = m_wnd->GetDlgItem(IDC_FEWER);
|
|
SlideWindow(widget, 0, dy);
|
|
widget = m_wnd->GetDlgItem(IDC_NEW);
|
|
SlideWindow(widget, 0, dy);
|
|
|
|
widget = m_wnd->GetDlgItem(IDC_CLEAR_SEARCH);
|
|
SlideWindow(widget, 0, dy);
|
|
widget = m_wnd->GetDlgItem(IDC_STATIC_DESC);
|
|
SlideWindow(widget, 0, dy);
|
|
}
|
|
|
|
return dy;
|
|
}
|
|
|
|
|
|
int CSearchObject::ClearSearch(int* iMoreCount, BOOL bIsLDAPSearch)
|
|
{
|
|
CWnd *widget;
|
|
int dy = 0, res = 0;
|
|
|
|
while (*iMoreCount > 0) {
|
|
for (int j = 0; j < COL_COUNT; j++) {
|
|
widget = m_wnd->GetDlgItem(ChoicesTable[*iMoreCount][j]);
|
|
widget->ShowWindow(SW_HIDE);
|
|
}
|
|
(*iMoreCount)--;
|
|
|
|
CRect rect;
|
|
widget = m_wnd->GetDlgItem(ChoicesTable[*iMoreCount][0]);
|
|
widget->GetWindowRect(&rect);
|
|
dy = rect.bottom;
|
|
widget = m_wnd->GetDlgItem(ChoicesTable[*iMoreCount + 1][0]);
|
|
widget->GetWindowRect(&rect);
|
|
dy -= rect.bottom;
|
|
|
|
widget = m_wnd->GetDlgItem(IDC_MORE);
|
|
SlideWindow(widget, 0, dy);
|
|
widget = m_wnd->GetDlgItem(IDC_FEWER);
|
|
SlideWindow(widget, 0, dy);
|
|
widget = m_wnd->GetDlgItem(IDC_NEW);
|
|
SlideWindow(widget, 0, dy);
|
|
|
|
|
|
widget = m_wnd->GetDlgItem(IDC_CLEAR_SEARCH);
|
|
SlideWindow(widget, 0, dy);
|
|
widget = m_wnd->GetDlgItem(IDC_STATIC_DESC);
|
|
SlideWindow(widget, 0, dy);
|
|
|
|
//if ((bIsLDAPSearch && (*iMoreCount) >= 0) || (*iMoreCount) > 0)
|
|
if ((*iMoreCount) >= 0)
|
|
res += dy;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
void CSearchObject::OnSize( UINT nType, int cx, int cy, int dx )
|
|
{
|
|
CWnd *widget;
|
|
|
|
for (int i = 0; i < 5; i++) {
|
|
widget = m_wnd->GetDlgItem(ChoicesTable[i][COL_VALUE]);
|
|
GrowWindow(widget, dx, 0);
|
|
if (WidgetWas[i] == widgetMenu) {
|
|
RECT rect = {0, 0, 1, 1};
|
|
::MapDialogRect(m_wnd->GetSafeHwnd(), &rect);
|
|
int iDialogUnit = rect.right;
|
|
int dy = 60 * iDialogUnit;
|
|
GrowWindow(widget, 0, dy);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CSearchObject::BuildQuery (MSG_Pane* searchPane, int iMoreCount, BOOL bLogicType)
|
|
{
|
|
MSG_SearchAttribute attrib;
|
|
MSG_SearchOperator op;
|
|
MSG_SearchValue value;
|
|
CNSDateEdit *date = NULL;
|
|
CNSNumEdit *AgeInDays = NULL;
|
|
CComboBox * combo = NULL;
|
|
int iCurSel = 0;
|
|
CWnd * widget = NULL;
|
|
char szArbitraryHeader[70];
|
|
|
|
for (int i = 0; i <= iMoreCount; i++) {
|
|
combo = (CComboBox *) m_wnd->GetDlgItem(ChoicesTable[i][COL_ATTRIB]);
|
|
iCurSel = combo->GetCurSel();
|
|
attrib = (MSG_SearchAttribute) combo->GetItemData(iCurSel);
|
|
|
|
combo = (CComboBox *) m_wnd->GetDlgItem(ChoicesTable[i][COL_OP]);
|
|
iCurSel = combo->GetCurSel();
|
|
op = (MSG_SearchOperator) combo->GetItemData(iCurSel);
|
|
|
|
widget = m_wnd->GetDlgItem(ChoicesTable[i][COL_VALUE]);
|
|
widget->GetWindowText(szResultText, sizeof(szResultText));
|
|
|
|
value.attribute = attrib;
|
|
XP_Bool freeValueStr = FALSE;
|
|
|
|
switch (attrib)
|
|
{
|
|
case attribAgeInDays:
|
|
{
|
|
AgeInDays = (CNSNumEdit *) m_wnd->GetDlgItem(ChoicesTable[i][COL_VALUE]);
|
|
value.u.age = AgeInDays->GetValue();
|
|
}
|
|
break;
|
|
case attribDate:
|
|
{
|
|
CTime ctime;
|
|
date = (CNSDateEdit *) m_wnd->GetDlgItem(ChoicesTable[i][COL_VALUE]);
|
|
date->GetDate(ctime);
|
|
value.u.date = ctime.GetTime();
|
|
}
|
|
break;
|
|
case attribPriority:
|
|
combo = (CComboBox *) m_wnd->GetDlgItem(ChoicesTable[i][COL_VALUE]);
|
|
iCurSel = combo->GetCurSel();
|
|
value.u.priority = (MSG_PRIORITY) combo->GetItemData(iCurSel);
|
|
break;
|
|
case attribMsgStatus:
|
|
combo = (CComboBox *) m_wnd->GetDlgItem(ChoicesTable[i][COL_VALUE]);
|
|
iCurSel = combo->GetCurSel();
|
|
value.u.msgStatus = combo->GetItemData(iCurSel);
|
|
break;
|
|
|
|
case attribOtherHeader:
|
|
combo = (CComboBox *) m_wnd->GetDlgItem(ChoicesTable[i][COL_ATTRIB]);
|
|
iCurSel = combo->GetCurSel();
|
|
combo->GetLBText(iCurSel, szArbitraryHeader);
|
|
|
|
default:
|
|
value.u.string = XP_STRDUP (szResultText);
|
|
freeValueStr = TRUE;
|
|
break;
|
|
}
|
|
|
|
MSG_AddSearchTerm(searchPane, attrib, op, &value, bLogicType,
|
|
(attrib != attribOtherHeader ? NULL : szArbitraryHeader) );
|
|
|
|
if (freeValueStr)
|
|
XP_FREE(value.u.string);
|
|
}
|
|
|
|
}
|
|
|
|
void CSearchObject::InitializeAttributes (MSG_SearchValueWidget widgetValue, MSG_SearchAttribute attribValue)
|
|
{
|
|
for (int i = 0; i < 5; i++ ) {
|
|
WidgetWas[i] = widgetValue;
|
|
AttribWas[i] = attribValue;
|
|
}
|
|
}
|
|
|
|
int CSearchObject::New(CWnd* window)
|
|
{
|
|
CRect rect, rect2;
|
|
CWnd *widget;
|
|
int dy = 0;
|
|
|
|
m_wnd = window;
|
|
widget = m_wnd->GetDlgItem(IDC_FEWER);
|
|
ASSERT(widget);
|
|
widget->GetWindowRect(&rect);
|
|
widget = m_wnd->GetDlgItem(ChoicesTable[0][0]);
|
|
ASSERT(widget);
|
|
widget->GetWindowRect(&rect2);
|
|
dy = rect2.bottom - rect.top;
|
|
widget = m_wnd->GetDlgItem(ChoicesTable[4][0]);
|
|
ASSERT(widget);
|
|
widget->GetWindowRect(&rect2);
|
|
dy += rect.top - rect2.bottom;
|
|
|
|
// Hide all the advanced lines
|
|
for (int j = 1; j < 5; j++) {
|
|
for (int i = 0; i < COL_COUNT; i++) {
|
|
widget = m_wnd->GetDlgItem(ChoicesTable[j][i]);
|
|
if(widget == NULL) continue;
|
|
widget->ShowWindow(SW_HIDE);
|
|
}
|
|
}
|
|
|
|
m_wnd->CheckRadioButton(IDC_RADIO_ANY, IDC_RADIO_ALL, IDC_RADIO_ANY);
|
|
|
|
// Move more and fewer and disable fewer
|
|
widget = m_wnd->GetDlgItem(IDC_FEWER);
|
|
SlideWindow(widget, 0, dy);
|
|
widget->EnableWindow (FALSE);
|
|
widget = m_wnd->GetDlgItem(IDC_MORE);
|
|
SlideWindow(widget, 0, dy);
|
|
widget = m_wnd->GetDlgItem(IDC_NEW);
|
|
SlideWindow(widget, 0, dy);
|
|
|
|
widget = m_wnd->GetDlgItem(IDC_CLEAR_SEARCH);
|
|
SlideWindow(widget, 0, dy);
|
|
widget = m_wnd->GetDlgItem(IDC_STATIC_DESC);
|
|
SlideWindow(widget, 0, dy);
|
|
|
|
return dy;
|
|
}
|
|
|
|
void CSearchObject::ReInitializeWidgets()
|
|
{
|
|
|
|
CWnd *widget;
|
|
|
|
for (int i = 0; i < 5; i++) {
|
|
widget = m_wnd->GetDlgItem( ChoicesTable[i][COL_VALUE] );
|
|
|
|
switch (WidgetWas[i]) {
|
|
case widgetMenu:
|
|
((CComboBox *) widget)->SetCurSel(0);
|
|
break;
|
|
|
|
case widgetDate:
|
|
((CNSDateEdit *) widget)->SetDate(CTime(time(NULL)));
|
|
break;
|
|
|
|
case widgetInt:
|
|
((CNSNumEdit *) widget)->SetValue(0);
|
|
break;
|
|
|
|
case widgetText:
|
|
default:
|
|
widget->SetWindowText("");
|
|
break;
|
|
}
|
|
}
|
|
|
|
widget = m_wnd->GetDlgItem( ChoicesTable[0][COL_VALUE] );
|
|
widget->SetFocus();
|
|
}
|
|
|
|
void CSearchObject::RestoreDefaultFocus()
|
|
{
|
|
if(m_wnd == NULL)
|
|
return;
|
|
CWnd * widget = m_wnd->GetDlgItem( ChoicesTable[0][COL_VALUE] );
|
|
if(widget != NULL)
|
|
widget->SetFocus();
|
|
}
|
|
|
|
void CSearchObject::UpdateColumn1Attributes()
|
|
{
|
|
int i, j;
|
|
CWnd *widget = NULL;
|
|
uint16 numItems;
|
|
CComboBox *combo = NULL;
|
|
|
|
MSG_FolderInfo *pInbox = NULL;
|
|
MSG_GetFoldersWithFlag (WFE_MSGGetMaster(), MSG_FOLDER_FLAG_INBOX, &pInbox, 1);
|
|
MSG_GetNumAttributesForSearchScopes (WFE_MSGGetMaster(), scopeMailFolder, (void**)&pInbox, 1, &numItems);
|
|
MSG_SearchMenuItem * HeaderItems = new MSG_SearchMenuItem [numItems+1];
|
|
|
|
if (!HeaderItems)
|
|
return; //something bad happened here!!
|
|
|
|
//we are getting the list of Headers and updating controls in column 1
|
|
MSG_GetAttributesForSearchScopes (WFE_MSGGetMaster(), scopeMailFolder, (void**)&pInbox, 1, HeaderItems, &numItems);
|
|
|
|
CString strEditCustom;
|
|
strEditCustom.LoadString(IDS_EDIT_CUSTOM);
|
|
strcpy( HeaderItems[numItems].name, strEditCustom);
|
|
HeaderItems[numItems].attrib = -1; //identifies a command to launch the Edit headers dialog
|
|
HeaderItems[numItems].isEnabled = FALSE;
|
|
|
|
CComboBox* comboScope;
|
|
int iScopeCurSel;
|
|
|
|
comboScope = (CComboBox *) m_wnd->GetDlgItem( IDC_COMBO_SCOPE );
|
|
iScopeCurSel = comboScope->GetCurSel();
|
|
DWORD dwItemData = comboScope->GetItemData(iScopeCurSel);
|
|
MSG_ScopeAttribute scope = DetermineScope( dwItemData );
|
|
BOOL bUsesCustomHeaders = MSG_ScopeUsesCustomHeaders(WFE_MSGGetMaster(), scope, pInbox, FALSE);
|
|
|
|
for (i = 0; i < 5; i++) {
|
|
|
|
combo = (CComboBox *) m_wnd->GetDlgItem( ChoicesTable[i][COL_ATTRIB] );
|
|
if (!combo)
|
|
{
|
|
delete HeaderItems; //free the memory since it's now in the combo box
|
|
return;
|
|
}
|
|
combo->ResetContent();
|
|
for (j = 0; j < numItems; j++) {
|
|
combo->AddString(HeaderItems[j].name);
|
|
combo->SetItemData(j, HeaderItems[j].attrib);
|
|
}
|
|
if (j == numItems && bUsesCustomHeaders)
|
|
{ //place the edit text in the last position of the combo box
|
|
combo->AddString(HeaderItems[j].name);
|
|
combo->SetItemData(j, HeaderItems[j].attrib);
|
|
}
|
|
|
|
combo->SetCurSel(0);
|
|
UpdateOpList(i, scope);
|
|
}
|
|
|
|
delete HeaderItems; //free the memory since it's now in the combo box
|
|
}
|
|
|
|
|
|
MSG_ScopeAttribute CSearchObject::DetermineScope( DWORD dwItemData )
|
|
{
|
|
MSG_Pane *pPane = NULL;
|
|
MSG_ScopeAttribute scope = scopeMailFolder;
|
|
|
|
|
|
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;
|
|
}
|
|
|