зеркало из https://github.com/mozilla/gecko-dev.git
388 строки
12 KiB
C++
388 строки
12 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) 1997 Netscape Communications Corporation. All Rights
|
|
* Reserved.
|
|
*/
|
|
|
|
|
|
// CLDAPQueryDialog.cp
|
|
|
|
#include "CLDAPQueryDialog.h"
|
|
#include "pascalstring.h"
|
|
#include "LGAEditField.h"
|
|
#include "prefapi.h"
|
|
#include "SearchHelpers.h"
|
|
#include "resgui.h"
|
|
#include "xp_help.h"
|
|
//------------------------------------------------------------------------------
|
|
// ¥ CLDAPBasicHandler
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
// ¥ Setup
|
|
//------------------------------------------------------------------------------
|
|
//
|
|
void CLDAPBasicHandler::Setup( MSG_Pane *inSearchPane, DIR_Server *inServer, LView *inView )
|
|
{
|
|
Assert_( inSearchPane != NULL );
|
|
Assert_( inServer != NULL );
|
|
Assert_(inView != NULL );
|
|
|
|
mView = inView;
|
|
int maxItems = 4;
|
|
|
|
// Get Basic Search attributes
|
|
MSG_SearchError error = MSG_GetBasicLdapSearchAttributes (
|
|
inServer, &mSearchAttributes[0], &maxItems);
|
|
|
|
|
|
// Update the captions to reflect their new attributes
|
|
for( int32 captionNumber = 0; captionNumber < maxItems; captionNumber++ )
|
|
{
|
|
LCaption* caption = dynamic_cast< LCaption*>( mView->FindPaneByID (eBasicSearchCaption+ captionNumber ) );
|
|
Assert_( caption );
|
|
caption->SetDescriptor ( CStr255(mSearchAttributes[ captionNumber ].name ));
|
|
}
|
|
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// ¥ GetSearchParameters
|
|
//------------------------------------------------------------------------------
|
|
// Get the current search parameters. outSearchParams must be able to hold at least
|
|
// 4 elements. Strings are output as c-strings.
|
|
//
|
|
Int32 CLDAPBasicHandler::GetSearchParameters(SearchLevelParamT* levelParam )
|
|
{
|
|
CStr255 valueString;
|
|
MSG_SearchOperator op = (MSG_SearchOperator) opContains;;
|
|
int maxItems = 4;
|
|
Int32 currentLevel = 0;
|
|
|
|
for( int32 i = 0; i < maxItems; i++ )
|
|
{
|
|
LGAEditField* editField = dynamic_cast< LGAEditField*>( mView->FindPaneByID (eBasicSearchTerm+ i ) );
|
|
Assert_( editField );
|
|
editField->GetDescriptor ( valueString );
|
|
if ( valueString.Length() )
|
|
{
|
|
levelParam[ currentLevel ].val.attribute = MSG_SearchAttribute( mSearchAttributes[ i ].attrib );
|
|
XP_STRCPY( levelParam[ currentLevel ].val.u.string, valueString );
|
|
levelParam[ currentLevel ].op = op;
|
|
levelParam[ currentLevel ].boolOp = true;
|
|
currentLevel++;
|
|
}
|
|
}
|
|
|
|
return currentLevel;
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// ¥ SetSearchParameters
|
|
//------------------------------------------------------------------------------
|
|
// This works by taking the first occurence of an Param whose attribute
|
|
// which matches a basic search criteria attribute.
|
|
//
|
|
void CLDAPBasicHandler::SetSearchParameters ( SearchLevelParamT* levelParam , int32 numLevels )
|
|
{
|
|
int maxItems = 4;
|
|
Int32 currentLevel = 0;
|
|
MSG_SearchAttribute attribute;
|
|
for( int32 basic = 0; basic < maxItems; basic++ )
|
|
{
|
|
attribute = MSG_SearchAttribute( mSearchAttributes[ basic ].attrib );
|
|
for ( int32 currentLevel = 0; currentLevel<numLevels; currentLevel++ )
|
|
{
|
|
if ( levelParam[ currentLevel ].val.attribute == attribute )
|
|
{
|
|
LGAEditField* editField = dynamic_cast< LGAEditField*>( mView->FindPaneByID (eBasicSearchTerm+ basic ) );
|
|
Assert_( editField );
|
|
editField->SetDescriptor( CStr255( levelParam[ currentLevel ].val.u.string) );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// ¥ Setup
|
|
//------------------------------------------------------------------------------
|
|
// Advanced Search Routines
|
|
// Most of the work is done by delagation to the Search Manager
|
|
//
|
|
void CLDAPAdvancedHandler::Setup( MSG_Pane *inSearchPane, DIR_Server *inServer, LView *inView )
|
|
{
|
|
Assert_( inSearchPane != NULL );
|
|
Assert_( inServer != NULL );
|
|
Assert_(inView != NULL );
|
|
|
|
mSearchFolders.InsertItemsAt(1, LArray::index_First, &inServer);
|
|
mSearchManager.InitSearchManager( inView, NULL, scopeLdapDirectory, & mSearchFolders );
|
|
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// ¥ GetSearchParameters
|
|
//------------------------------------------------------------------------------
|
|
//
|
|
Int32 CLDAPAdvancedHandler::GetSearchParameters ( SearchLevelParamT* levelParam )
|
|
{
|
|
mSearchManager.GetSearchParameters( levelParam );
|
|
return mSearchManager.GetNumVisibleLevels();
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// ¥ SetSearchParameters
|
|
//------------------------------------------------------------------------------
|
|
//
|
|
void CLDAPAdvancedHandler::SetSearchParameters ( SearchLevelParamT* levelParam , int32 numLevels )
|
|
{
|
|
mSearchManager.SetSearchParameters ( numLevels, levelParam );
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// ¥ ~CLDAPQueryDialog
|
|
//------------------------------------------------------------------------------
|
|
//
|
|
CLDAPQueryDialog::~CLDAPQueryDialog()
|
|
{
|
|
if( mMSGPane ) // If the search manager isn't initialized don't save the window data
|
|
{
|
|
PREF_SetBoolPref("mail.addr_book.useAdvancedSearch", mAdvancedSearch);
|
|
CSaveWindowStatus::SaveStatusInfo();
|
|
}
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// ¥ BuildQuery
|
|
//------------------------------------------------------------------------------
|
|
//
|
|
Boolean CLDAPQueryDialog::BuildQuery()
|
|
{
|
|
// Initial Search setup
|
|
Assert_( mMSGPane );
|
|
MSG_SearchFree ( mMSGPane );
|
|
MSG_SearchAlloc ( mMSGPane );
|
|
|
|
|
|
if( MSG_AddLdapScope( mMSGPane, mDirServer ) != SearchError_Success )
|
|
return false;
|
|
|
|
if( AddParametersToSearch( ) != SearchError_Success)
|
|
return false;
|
|
|
|
return true;
|
|
|
|
};
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// ¥ AddParametersToSearch
|
|
//------------------------------------------------------------------------------
|
|
//
|
|
MSG_SearchError CLDAPQueryDialog::AddParametersToSearch( )
|
|
{
|
|
Assert_(mMSGPane != nil);
|
|
MSG_SearchError error = SearchError_Success;
|
|
|
|
// Get the search parameters
|
|
StSearchDataBlock searchParams( mMaxLevels, StSearchDataBlock::eAllocateStrings);
|
|
SearchLevelParamT *curLevel = searchParams.GetData();
|
|
int32 numLevels = mHandler[ mAdvancedSearch ]->GetSearchParameters( curLevel );
|
|
|
|
// Add parameters to the search
|
|
for ( Int32 i=0; i< numLevels; i++ )
|
|
{
|
|
#ifdef FE_IMPLEMENTS_BOOLEAN_OR
|
|
error = MSG_AddSearchTerm(mMSGPane, curLevel[i].val.attribute, curLevel[i].op,
|
|
&curLevel[i].val, curLevel[i].boolOp, NULL ) ;
|
|
#else
|
|
error = MSG_AddSearchTerm(mMSGPane, curLevel[i].val.attribute, curLevel[i].op,
|
|
&curLevel[i].val) ;
|
|
#endif
|
|
if ( error != SearchError_Success )
|
|
break;
|
|
}
|
|
return error;
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// ¥ Setup
|
|
//------------------------------------------------------------------------------
|
|
//
|
|
void CLDAPQueryDialog::Setup( MSG_Pane* inPane, DIR_Server* inServer )
|
|
{
|
|
mMSGPane = inPane;
|
|
mDirServer = inServer;
|
|
|
|
// Set the name of the group box
|
|
LView* box = dynamic_cast<LView* >( FindPaneByID('ScBx') );
|
|
Assert_( box);
|
|
CStr255 name;
|
|
box->GetDescriptor( name );
|
|
name+= mDirServer->description;
|
|
box->SetDescriptor( name );
|
|
|
|
// Setup the Handlers
|
|
mBasicView = dynamic_cast<LView*>( box->FindPaneByID( eBasicEnclosure ) );
|
|
Assert_( mBasicView );
|
|
mHandler[ eBasic ]->Setup( inPane, inServer, mBasicView );
|
|
USearchHelper::LinkListenerToBroadcasters( mBasicView, this );
|
|
|
|
mAdvancedView = dynamic_cast<LView*>( box->FindPaneByID( eAdvancedEnclosure ) );
|
|
Assert_( mAdvancedView );
|
|
mHandler[ eAdvanced ]->Setup( inPane, inServer, mAdvancedView );
|
|
|
|
CLDAPAdvancedHandler* advancedLDAP = dynamic_cast<CLDAPAdvancedHandler*>(mHandler[ eAdvanced ]);
|
|
Assert_( advancedLDAP );
|
|
mSearchManager = advancedLDAP->GetSearchManager();
|
|
mSearchManager->AddListener( this );
|
|
|
|
XP_Bool isAdvanced = false;
|
|
if (PREF_GetBoolPref("mail.addr_book.useAdvancedSearch", &isAdvanced)== PREF_NOERROR )
|
|
mAdvancedSearch = isAdvanced;
|
|
CSaveWindowStatus::FinishCreateWindow();
|
|
|
|
mIsModified = false;
|
|
|
|
ShowHandler();
|
|
Show();
|
|
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// ¥ ListenToMessage
|
|
//------------------------------------------------------------------------------
|
|
//
|
|
void CLDAPQueryDialog::ListenToMessage(MessageT inMessage, void *ioParam)
|
|
{
|
|
switch( inMessage )
|
|
{
|
|
case paneID_Search:
|
|
BuildQuery();
|
|
break;
|
|
|
|
case CSearchManager::msg_SearchParametersResized:
|
|
ResizeWindowBy( 0, *((Int16 *) ioParam) );
|
|
break;
|
|
|
|
case CSearchEditField::msg_UserChangedText:
|
|
mIsModified = true;
|
|
break;
|
|
|
|
case msg_Help:
|
|
if ( mAdvancedSearch )
|
|
ShowHelp( HELP_SEARCH_LDAP_ADVANCED );
|
|
else
|
|
ShowHelp( HELP_SEARCH_LDAP_BASIC );
|
|
break;
|
|
|
|
case paneID_Advanced:
|
|
case paneID_Basic:
|
|
if ( !PREF_PrefIsLocked( "mail.addr_book.useAdvancedSearch") )
|
|
mAdvancedSearch = !mAdvancedSearch;
|
|
ShowHandler();
|
|
break;
|
|
};
|
|
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// ¥ FinishCreateSelf
|
|
//------------------------------------------------------------------------------
|
|
//
|
|
void CLDAPQueryDialog::FinishCreateSelf()
|
|
{
|
|
mHandler[ eBasic ] = new CLDAPBasicHandler;
|
|
mHandler[ eAdvanced ] = new CLDAPAdvancedHandler;
|
|
UReanimator::LinkListenerToControls( this, this, CLDAPQueryDialog::res_ID );
|
|
Inherited::FinishCreateSelf();
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// ¥ ShowHandler
|
|
//------------------------------------------------------------------------------
|
|
//
|
|
void CLDAPQueryDialog::ShowHandler()
|
|
{
|
|
Assert_ ( mSearchManager );
|
|
|
|
Int32 windowHeight = 130;
|
|
if ( mAdvancedSearch )
|
|
{
|
|
Int16 deltaLevels = 5 - mSearchManager->GetNumVisibleLevels();
|
|
windowHeight = 220 - deltaLevels * 23 ;
|
|
}
|
|
|
|
ResizeWindowTo ( 500, windowHeight );
|
|
// modify contents, always do when going from advanced to basic
|
|
// Only do when going from basic to advanced if there has been a modification
|
|
if ( mIsModified || !mAdvancedSearch)
|
|
{
|
|
StSearchDataBlock searchParams( mMaxLevels, StSearchDataBlock::eAllocateStrings);
|
|
SearchLevelParamT *curLevel = searchParams.GetData();
|
|
int32 numLevels = mHandler[ !mAdvancedSearch ]->GetSearchParameters( curLevel );
|
|
mHandler[ mAdvancedSearch ]->SetSearchParameters( curLevel, numLevels );
|
|
mIsModified = false;
|
|
}
|
|
|
|
// Swap the Buttons
|
|
USearchHelper::ShowHidePane( FindPaneByID(paneID_Advanced), !mAdvancedSearch);
|
|
USearchHelper::ShowHidePane( FindPaneByID( paneID_Basic ), mAdvancedSearch);
|
|
|
|
// Swap the panes
|
|
USearchHelper::ShowHidePane( mBasicView, !mAdvancedSearch);
|
|
USearchHelper::ShowHidePane( mAdvancedView, mAdvancedSearch);
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// ¥ ReadWindowStatus
|
|
//------------------------------------------------------------------------------
|
|
//
|
|
void CLDAPQueryDialog::ReadWindowStatus(LStream *inStatusData)
|
|
{
|
|
CSaveWindowStatus::ReadWindowStatus(inStatusData);
|
|
|
|
mSearchManager->ReadSavedSearchStatus(inStatusData);
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// ¥ WriteWindowStatus
|
|
//------------------------------------------------------------------------------
|
|
//
|
|
void CLDAPQueryDialog::WriteWindowStatus(LStream *outStatusData)
|
|
{
|
|
CSaveWindowStatus::WriteWindowStatus(outStatusData);
|
|
if( mAdvancedSearch == 0 )
|
|
{
|
|
mAdvancedSearch = true;
|
|
ShowHandler();
|
|
}
|
|
mSearchManager->WriteSavedSearchStatus(outStatusData);
|
|
|
|
}
|