Mozilla/mozilla/cmd/xfe/src/ABSearchView.cpp
spider 957093e8c5 Normandy Merge ....
git-svn-id: svn://10.0.0.236/trunk@4231 18797224-902f-48f8-a5cc-f745e15eee43
1998-06-22 21:19:46 +00:00

1249 lines
32 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.
*/
/*
ABSearchView.cpp -- class definition for XFE_ABSearchView
Created: Tao Cheng <tao@netscape.com>, 23-oct-97
*/
#include "ABSearchView.h"
#include "ViewDialog.h"
#include <Xm/Form.h>
#include <Xm/LabelG.h>
#include <Xm/Label.h>
#include <Xm/PushB.h>
#include <Xm/TextF.h>
#include <Xm/Frame.h>
#include <Xm/RowColumn.h>
#include <Xfe/Xfe.h>
#include "xpgetstr.h"
#include "xfe.h"
#include "felocale.h"
extern int XFE_SEARCH_DLG_PROMPT;
extern int XFE_SEARCH_ATTRIB_NAME;
extern int XFE_SEARCH_ATTRIB_EMAIL;
extern int XFE_SEARCH_ATTRIB_ORGAN;
extern int XFE_SEARCH_ATTRIB_ORGANU;
extern int XFE_SEARCH_RESULT_PROMPT;
extern int XFE_AB_SEARCH;
extern int XFE_SEARCH_BASIC;
extern int XFE_SEARCH_ADVANCED;
extern int XFE_SEARCH_MORE;
extern int XFE_SEARCH_FEWER;
extern int XFE_DLG_CANCEL;
extern int XFE_DLG_CLEAR;
extern int XFE_SEARCH_BOOL_PROMPT;
extern int XFE_SEARCH_BOOL_AND_PROMPT;
extern int XFE_SEARCH_BOOL_OR_PROMPT;
extern int XFE_SEARCH_BOOL_WHERE;
extern int XFE_SEARCH_BOOL_THE;
extern int XFE_SEARCH_BOOL_AND_THE;
extern int XFE_SEARCH_BOOL_OR_THE;
extern "C" Widget
fe_make_option_menu(Widget toplevel, Widget parent, char* widgetName,
Widget *popup);
//
const char *XFE_ABSearchView::dlgClose =
"XFE_ABSearchView::dlgClose";
XFE_ABSearchView::XFE_ABSearchView(XFE_Component *toplevel_component,
Widget parent,
MWContext *context,
ABSearchInfo_t *info):
XFE_MNView(toplevel_component,
NULL,
context,
(MSG_Pane *)NULL),
m_mode(AB_SEARCH_NONE),
m_searchInfo(info),
m_params(NULL),
m_nRules(0),
m_nAllocted(0),
m_attrItems(NULL),
m_nAttribItems(0),
m_ruleCmdGroupForm(0),
m_andOrForm(0)
{
XP_ASSERT(info && info->m_dir);
m_dir = info->m_dir;
setBaseWidget(parent);
Arg av [20];
int ac = 0;
/* 2 sub forms
*/
Widget subForms[2],
workForm;
/* search rules
*/
ac = 0;
subForms[0] = XmCreateForm(parent, "searchRulesForm", av, ac);
XtManageChild(subForms[0]);
/* Frame
*/
ac = 0;
XtSetArg (av[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
XtSetArg (av[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
XtSetArg (av[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
XtSetArg (av[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
XtSetArg (av[ac],
XmNchildHorizontalAlignment, XmALIGNMENT_BEGINNING);ac++;
Widget frame = XmCreateFrame(subForms[0], "viewFrame", av, ac);
XtManageChild(frame);
/* frame title
*/
Widget title;
/* to satisfy gcc
*/
char tmp[256];
sprintf(tmp,
"%s %s",
XP_GetString(XFE_SEARCH_DLG_PROMPT),
m_dir->description?m_dir->description:"");
title = XtVaCreateManagedWidget(tmp,
xmLabelGadgetClass, frame,
XmNchildType, XmFRAME_TITLE_CHILD,
NULL);
m_dirPrompt = title;
ac = 0;
XtSetArg (av[ac], XmNchildType, XmFRAME_WORKAREA_CHILD); ac++;
workForm = XmCreateForm(frame, "workAreaForm", av, ac);
XtManageChild(workForm);
m_workForm = workForm;
/* row Col
*/
ac = 0;
XtSetArg(av[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
XtSetArg(av[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
XtSetArg(av[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
XtSetArg(av[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
m_rulesRowCol = XmCreateRowColumn(workForm, "rulesRowCol", av, ac);
/* result prompt
*/
m_searchRulesPrompt =
XtVaCreateManagedWidget(XP_GetString(XFE_SEARCH_RESULT_PROMPT),
xmLabelGadgetClass, workForm,
XmNleftAttachment, XmATTACH_FORM,
XmNtopAttachment, XmATTACH_WIDGET,
XmNtopWidget, m_rulesRowCol,
XmNtopOffset, 5,
XmNrightAttachment, XmATTACH_FORM,
XmNbottomAttachment, XmATTACH_FORM,
NULL);
/* cmdButtonForm
*/
ac = 0;
subForms[1] = XmCreateForm (parent, "cmdButtonForm", av, ac);
XtManageChild(subForms[1]);
/* cmdRowCol1
*/
ac = 0;
XtSetArg(av[ac], XmNorientation, XmVERTICAL); ac++;
XtSetArg(av[ac], XmNentryAlignment, XmALIGNMENT_CENTER); ac++;
XtSetArg(av[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
XtSetArg(av[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
XtSetArg(av[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
XtSetArg(av[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
Widget rowCol1 = XmCreateRowColumn(subForms[1] , "cmdRowCol1", av, ac);
XtManageChild(rowCol1);
/* Search button
*/
ac = 0;
Widget dummy = XmCreatePushButton(rowCol1,
XP_GetString(XFE_AB_SEARCH),
av, ac);
XtVaSetValues(dummy,
XmNalignment, XmALIGNMENT_CENTER,
NULL);
fe_SetString(dummy, XmNlabelString, XP_GetString(XFE_AB_SEARCH));
XtManageChild(dummy);
XtAddCallback(dummy, XmNactivateCallback,
XFE_ABSearchView::okCallback,
this);
/* Cancel button
*/
ac = 0;
dummy = XmCreatePushButton(rowCol1,
XP_GetString(XFE_DLG_CANCEL),
av, ac);
XtVaSetValues(dummy,
XmNalignment, XmALIGNMENT_CENTER,
NULL);
fe_SetString(dummy, XmNlabelString, XP_GetString(XFE_DLG_CANCEL));
XtManageChild(dummy);
XtAddCallback(dummy, XmNactivateCallback,
XFE_ABSearchView::cancelCallback,
this);
ac = 0;
XtSetArg(av[ac], XmNorientation, XmVERTICAL); ac++;
XtSetArg(av[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
XtSetArg(av[ac], XmNtopAttachment, XmATTACH_NONE); ac++;
XtSetArg(av[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
XtSetArg(av[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
Widget rowCol2 = XmCreateRowColumn(subForms[1] , "cmdRowCol2", av, ac);
XtManageChild(rowCol2);
ac = 0;
XtSetArg(av[ac], XmNalignment, XmALIGNMENT_CENTER);ac++;
dummy = m_modeToggle =
XmCreatePushButton(rowCol2,
((info->m_mode == AB_SEARCH_BASIC)?
XP_GetString(XFE_SEARCH_ADVANCED):
XP_GetString(XFE_SEARCH_BASIC)),
av, ac);
XtManageChild(dummy);
/* attachment
*/
XtVaSetValues(subForms[1],
// XmNheight, 300,
XmNleftAttachment, XmATTACH_NONE,
XmNtopAttachment, XmATTACH_FORM,
XmNrightAttachment, XmATTACH_FORM,
XmNbottomAttachment, XmATTACH_FORM,
NULL);
XtVaSetValues(subForms[0],
// XmNheight, 300,
XmNleftAttachment, XmATTACH_FORM,
XmNtopAttachment, XmATTACH_FORM,
XmNrightAttachment, XmATTACH_WIDGET,
XmNrightWidget, subForms[1],
XmNbottomAttachment, XmATTACH_FORM,
NULL);
/* pre-alloc
*/
if (!m_params ||
!m_nAllocted) {
m_nAllocted = 4;
m_params = (ABSearchUIParam_t *) XP_CALLOC(m_nAllocted,
sizeof(ABSearchUIParam_t));
}/* if */
XtManageChild(m_rulesRowCol);
toggleSearchMode(info);
//callbacks
XtAddCallback(m_modeToggle, XmNactivateCallback,
XFE_ABSearchView::toggleSearchModeCallback,
this);
}
XFE_ABSearchView::~XFE_ABSearchView()
{
}
Widget
XFE_ABSearchView::rebuildOptChildren(Widget popupParent,
int num,
ABSearchUIHint_t *hint,
XtCallbackProc cb)
{
XP_ASSERT(num && hint);
WidgetList childrenList;
int numChildren;
/* Clean up first
*/
XtVaGetValues(popupParent,
XmNchildren, &childrenList,
XmNnumChildren, &numChildren,
NULL);
int i;
for (i = 0; i < numChildren; i++) {
/* free user data
*/
/* destroy widget
*/
XtDestroyWidget(childrenList[i]);
}/* for i */
/* Create new ones...
*/
Arg av[20];
int ac = 0;
XmString xmStr;
Widget btn,
btn1 = NULL;
for (i = 0; i < num; i++) {
xmStr = XmStringCreateSimple(hint[i].m_menuItem->name);
ac = 0;
XtSetArg(av[ac], XmNlabelString, xmStr); ac++;
XtSetArg(av[ac], XmNuserData, &(hint[i])); ac++;
btn = XmCreatePushButtonGadget(popupParent, "optBtn", av, ac);
if (!btn1)
btn1 = btn;
hint[i].m_obj = (void *) this;
XtAddCallback(btn, XmNactivateCallback, cb, this);
XtManageChild(btn);
XmStringFree(xmStr);
}/* for i */
return btn1;
}
Widget
XFE_ABSearchView::makeOptMenu(Widget parent,
int num,
ABSearchUIHint_t *hint,
XtCallbackProc cb,
Widget *popUp)
{
char tmp[32];
sprintf(tmp, "optMenu_%d", hint[0].m_type);
Widget popup = NULL, /* to build pull down */
optMenu = fe_make_option_menu(getToplevel()->getBaseWidget(),
parent, tmp, &popup);
*popUp = popup;
/* rebuild popup children
*/
Widget btn1 = rebuildOptChildren(popup,
num,
hint,
cb);
XtVaSetValues(optMenu,
XmNmenuHistory, btn1,
XmNtraversalOn, False,
NULL);
XtManageChild(optMenu);
return optMenu;
}
void XFE_ABSearchView::cleanupUI(uint16 i, XP_Bool clearRule)
{
if (m_params[i].m_ruleForm) {
if (clearRule) {
m_params[i].m_op = opContains;
m_params[i].m_attribNval.attribute = attribCommonName;
XP_FREEIF(m_params[i].m_attribNval.u.string);
}/* if */
XtUnmanageChild(m_params[i].m_ruleForm);
if (m_params[i].m_attribOptMenu) {
XtUnmanageChild(m_params[i].m_attribOptMenu);
/* TODO: need to free heap here
*/
/*
*/
XtDestroyWidget(m_params[i].m_attribOptMenu);
m_params[i].m_attribOptMenu = NULL;
}/* if */
if (m_params[i].m_opOptMenu) {
XtUnmanageChild(m_params[i].m_opOptMenu);
XtDestroyWidget(m_params[i].m_opOptMenu);
m_params[i].m_opOptMenu = NULL;
}/* if */
if (m_params[i].m_label) {
XtUnmanageChild(m_params[i].m_label);
XtDestroyWidget(m_params[i].m_label);
m_params[i].m_label = NULL;
}/* if */
if (m_params[i].m_textF) {
XtUnmanageChild(m_params[i].m_textF);
XtDestroyWidget(m_params[i].m_textF);
m_params[i].m_textF = NULL;
}/* if */
XtDestroyWidget(m_params[i].m_ruleForm);
m_params[i].m_ruleForm = NULL;
}/* if form */
}
void XFE_ABSearchView::remove1Rule()
{
XP_ASSERT(m_nRules > 1);
m_nRules--;
cleanupUI(m_nRules, True);
}
void XFE_ABSearchView::setOptMenu(Widget w, int16 attrib)
{
if (!w ||
!XmIsRowColumn(w))
XP_ASSERT(0);
Widget popup = NULL;
XtVaGetValues(w,
XmNsubMenuId, &popup,
NULL);
if (!popup ||
!XmIsRowColumn(popup))
XP_ASSERT(0);
int numChildren = 0;
WidgetList childrenList;
XtVaGetValues(popup,
XmNchildren, &childrenList,
XmNnumChildren, &numChildren,
NULL);
XP_ASSERT(childrenList && numChildren);
void *userData = NULL;
for (int i=0; i < numChildren; i++) {
XtVaGetValues(childrenList[i], XmNuserData, &userData, NULL);
if (!XfeIsAlive(childrenList[i])) {
continue;
}/* if */
if (attrib ==
((ABSearchUIHint_t *)userData)->m_menuItem->attrib) {
XtVaSetValues(w,
XmNmenuHistory, childrenList[i],
NULL);
break;
}/* if */
}/* for i */
}
void XFE_ABSearchView::getAttribNames()
{
m_attrItems =
(MSG_SearchMenuItem *)XP_CALLOC(kNumAttributes,
sizeof(MSG_SearchMenuItem));
m_nAttribItems = kNumAttributes;
DIR_Server *dirs[1];
dirs[0]= (DIR_Server*) m_dir;
MSG_SearchError err;
err = MSG_GetAttributesForSearchScopes(fe_getMNMaster(),
scopeLdapDirectory,
(void **) dirs,
1,
m_attrItems,
&m_nAttribItems);
}
void XFE_ABSearchView::add1Rule(MSG_SearchAttribute attrib,
MSG_SearchOperator op,
char *stringVal)
{
Arg av [20];
int ac = 0;
/* the form
*/
if (m_nAllocted <= m_nRules) {
m_nAllocted = m_nRules+1;
m_params = (ABSearchUIParam_t *)
XP_REALLOC(m_params,
m_nAllocted*sizeof(ABSearchUIParam_t));
memset(&(m_params[m_nRules]), 0, sizeof(ABSearchUIParam_t));
}/* else if */
if (!m_params[m_nRules].m_ruleForm) {
ac = 0;
m_params[m_nRules].m_ruleForm =
XmCreateForm(m_rulesRowCol, "advancedRuleForm", av, ac);
}/* if */
// 0: andOr
XtVaSetValues(m_params[m_nRules].m_ruleForm,
XmNpositionIndex, m_nRules+1,
0);
/* label: and/or the
*/
/* compute
*/
Dimension wid = 0, max_with = 0;
char tmp[256];
Widget dummy =
XtVaCreateManagedWidget(tmp,
xmLabelWidgetClass,
m_params[m_nRules].m_ruleForm,
XmNalignment, XmALIGNMENT_END,
XmNleftAttachment, XmATTACH_FORM,
XmNtopAttachment, XmATTACH_FORM,
XmNrightAttachment, XmATTACH_NONE,
XmNbottomAttachment, XmATTACH_FORM,
NULL);
for (int j=0; j < 3; j++) {
sprintf(tmp,
"%s",
XP_GetString(XFE_SEARCH_BOOL_THE+j));
fe_SetString(dummy, XmNlabelString, tmp);
XtVaGetValues(dummy,
XmNwidth, &wid,
NULL);
if (wid > max_with)
max_with = wid;
}/* for i */
XtDestroyWidget(dummy);
/* real
*/
sprintf(tmp,
"%s",
(m_nRules==0)?
(XP_GetString(XFE_SEARCH_BOOL_THE)):
(m_searchInfo->m_logicOp?
XP_GetString(XFE_SEARCH_BOOL_AND_THE):
XP_GetString(XFE_SEARCH_BOOL_OR_THE)));
m_params[m_nRules].m_label =
XtVaCreateManagedWidget(tmp,
xmLabelWidgetClass,
m_params[m_nRules].m_ruleForm,
XmNwidth, max_with,
XmNrecomputeSize, False,
XmNalignment, XmALIGNMENT_END,
XmNleftAttachment, XmATTACH_FORM,
XmNtopAttachment, XmATTACH_FORM,
XmNrightAttachment, XmATTACH_NONE,
XmNbottomAttachment, XmATTACH_FORM,
NULL);
/* Attrib
*/
if (!m_nAttribItems ||
!m_attrItems)
getAttribNames();
/* attrib menu
*/
ABSearchUIHint_t *hint =
(ABSearchUIHint_t *) XP_CALLOC(m_nAttribItems,
sizeof(ABSearchUIHint_t));
XP_Bool validAttrib = False;
int i;
for (i=0; i < m_nAttribItems; i++) {
hint[i].m_th = m_nRules;
hint[i].m_type = AB_SEARCH_ATTRIB;
hint[i].m_menuItem = &(m_attrItems[i]);
hint[i].m_obj = this;
if (attrib != kNumAttributes &&
!validAttrib)
if (hint[i].m_menuItem->attrib == (MSG_SearchAttribute) attrib)
validAttrib = True;
}/* for i */
m_params[m_nRules].m_attribOptMenu =
makeOptMenu(m_params[m_nRules].m_ruleForm,
m_nAttribItems,
hint,
&(XFE_ABSearchView::optValChgCallback),
&m_params[m_nRules].m_attribPopup);
/* use whatever is there */
if (!validAttrib) {
/* correct
*/
attrib = (MSG_SearchAttribute)
m_attrItems[m_nRules%m_nAttribItems].attrib;
}/* if */
m_params[m_nRules].m_attribNval.attribute = attrib;
setOptMenu(m_params[m_nRules].m_attribOptMenu,
(uint16) attrib);
XtVaSetValues(m_params[m_nRules].m_attribOptMenu,
XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, m_params[m_nRules].m_label,
XmNtopAttachment, XmATTACH_FORM,
XmNrightAttachment, XmATTACH_NONE,
XmNbottomAttachment, XmATTACH_FORM,
NULL);
/* op menu
*/
uint16 opNum = 0;
hint = getOptMenuHint(m_nRules, &opNum);
m_params[m_nRules].m_opOptMenu =
makeOptMenu(m_params[m_nRules].m_ruleForm,
opNum,
hint,
&(XFE_ABSearchView::optValChgCallback),
&m_params[m_nRules].m_opPopup);
/* compute op
*/
XP_Bool opValid = False;
for (i=0; (op != kNumOperators) && (i < opNum); i++) {
if (op == (MSG_SearchOperator) hint[i].m_menuItem->attrib) {
opValid = True;
break;
}/* if */
}/* for i */
if (!opValid) {
op = (MSG_SearchOperator) hint[0].m_menuItem->attrib;
}/* if */
m_params[m_nRules].m_op = op;
setOptMenu(m_params[m_nRules].m_opOptMenu, op);
XtVaSetValues(m_params[m_nRules].m_opOptMenu,
XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, m_params[m_nRules].m_attribOptMenu,
XmNtopAttachment, XmATTACH_FORM,
XmNrightAttachment, XmATTACH_NONE,
XmNbottomAttachment, XmATTACH_FORM,
NULL);
/* TextF
*/
ac = 0;
XtSetArg(av[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
XtSetArg(av[ac], XmNleftWidget, m_params[m_nRules].m_opOptMenu); ac++;
XtSetArg(av[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
XtSetArg(av[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
XtSetArg(av[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
//XtSetArg(av[ac], XmNwidth, 150); ac++;
m_params[m_nRules].m_textF = fe_CreateTextField(m_params[m_nRules].m_ruleForm,
"ruleTextVal",
av, ac);
XtAddCallback(m_params[m_nRules].m_textF, XmNactivateCallback,
XFE_ABSearchView::textFActivateCallback,
this);
/* set def
*/
fe_SetTextField(m_params[m_nRules].m_textF,
stringVal?stringVal:"");
m_params[i].m_attribNval.u.string = stringVal;
XtManageChild(m_params[m_nRules].m_textF);
XtManageChild(m_params[m_nRules].m_ruleForm);
m_nRules++;
XtVaSetValues(m_ruleCmdGroupForm,
XmNpositionIndex, XmLAST_POSITION,
NULL);
}
char*
XFE_ABSearchView::getValByAttrib(ABSearchUIParam_t *params,
int nParams, MSG_SearchAttribute attrib)
{
for (int i=0; i < nParams; i++) {
if (params[i].m_attribNval.attribute == attrib)
return params[i].m_attribNval.u.string;
}/* for i */
return NULL;
}
void XFE_ABSearchView::toggleSearchMode(ABSearchInfo_t *info)
{
XP_ASSERT(info && info->m_dir && m_rulesRowCol);
XtUnmanageChild(m_workForm);
/* pass params
*/
m_searchInfo = info;
if (info->m_nRules &&
info->m_params) {
m_nRules = info->m_nRules;
m_params = info->m_params;
}/* if */
m_dir = info->m_dir;
/* to satisfy gcc
*/
char tmp[256];
/* set title
*/
sprintf(tmp,
"%s %s",
XP_GetString(XFE_SEARCH_DLG_PROMPT),
m_dir->description?m_dir->description:"");
fe_SetString(m_dirPrompt,
XmNlabelString, tmp);
Arg av [20];
int ac = 0;
int i = 0;
/* Buffer up
*/
int nVal = m_nRules;
ABSearchUIParam_t *buffer =
(ABSearchUIParam_t *) XP_CALLOC(m_nRules,
sizeof(ABSearchUIParam_t));
buffer =
(ABSearchUIParam_t *) memcpy(buffer, m_params,
m_nRules*sizeof(ABSearchUIParam_t));
if (info->m_mode == AB_SEARCH_BASIC) {
/* clean up residue
*/
fe_SetString(m_modeToggle,
XmNlabelString, XP_GetString(XFE_SEARCH_ADVANCED));
if (m_andOrForm)
XtUnmanageChild(m_andOrForm);
if (m_ruleCmdGroupForm)
XtUnmanageChild(m_ruleCmdGroupForm);
/* un map widgets
*/
for (i=0; i < m_nRules; i++)
cleanupUI(i, False);
XtVaSetValues(m_rulesRowCol,
XmNorientation, XmVERTICAL,
XmNnumColumns, 2,
XmNpacking, XmPACK_COLUMN,
NULL);
/* get new attribs
*/
m_searchInfo->m_logicOp = True; //and
m_nRules = kNumAttributes;
MSG_SearchMenuItem *attrItems =
(MSG_SearchMenuItem *)XP_CALLOC(m_nRules,
sizeof(MSG_SearchMenuItem));
#if 0
/* Tao: do not take out this ....
*/
MSG_SearchError err =
MSG_GetBasicLdapSearchAttributes(m_dir,
attrItems,
(int *) &m_nRules);
#endif
if (!m_nRules ||
!attrItems[0].name ||
!XP_STRLEN(attrItems[0].name)) {
m_nRules = 4;
attrItems[0].attrib = attribCommonName;
attrItems[1].attrib = attribOrganization;
attrItems[2].attrib = attrib822Address;
attrItems[3].attrib = attribOrgUnit;
for (i=0; i < m_nRules; i++) {
DIR_AttributeId id;
MSG_SearchAttribToDirAttrib((MSG_SearchAttribute)attrItems[i].attrib,
&id);
XP_STRCPY(attrItems[i].name, DIR_GetAttributeName(m_dir, id));
}/* for i */
}/* if */
/* realloc if needed
*/
if (m_nRules > m_nAllocted) {
m_params = (ABSearchUIParam_t *)
XP_REALLOC(m_params,
m_nRules*sizeof(ABSearchUIParam_t));
int delta = m_nRules-m_nAllocted;
memset(&(m_params[m_nAllocted]),
0,
delta*sizeof(ABSearchUIParam_t));
m_nAllocted = m_nRules;
}/* if */
for (i=0; i < m_nRules; i++) {
// set defaults
m_params[i].m_op = opContains;
m_params[i].m_attribNval.attribute =
(MSG_SearchAttribute) attrItems[i].attrib;
m_params[i].m_attribNval.u.string =
getValByAttrib(buffer, nVal,
m_params[i].m_attribNval.attribute);
/* attrib name
*/
const char *text = attrItems[i].name;
ac = 0;
if (!m_params[i].m_ruleForm)
m_params[i].m_ruleForm = XmCreateForm(m_rulesRowCol,
"basicRulesForm", av, ac);
/* Create labels
*/
m_params[i].m_label =
XtVaCreateManagedWidget(text,
xmLabelGadgetClass, m_params[i].m_ruleForm,
XmNalignment, XmALIGNMENT_BEGINNING,
XmNleftAttachment, XmATTACH_FORM,
XmNtopAttachment, XmATTACH_FORM,
XmNrightAttachment, XmATTACH_NONE,
XmNbottomAttachment, XmATTACH_NONE,
NULL);
/* TextF
*/
ac = 0;
XtSetArg(av[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
XtSetArg(av[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
XtSetArg(av[ac], XmNtopWidget, m_params[i].m_label); ac++;
XtSetArg(av[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
XtSetArg(av[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
//XtSetArg(av[ac], XmNwidth, 180); ac++;
m_params[i].m_textF = fe_CreateTextField(m_params[i].m_ruleForm,
text,
av, ac);
/* set default
*/
if (m_params[i].m_attribNval.u.string)
fe_SetTextField(m_params[i].m_textF,
m_params[i].m_attribNval.u.string);
else
fe_SetTextField(m_params[i].m_textF,
"");
XtAddCallback(m_params[i].m_textF, XmNactivateCallback,
XFE_ABSearchView::textFActivateCallback,
this);
XtManageChild(m_params[i].m_textF);
XtManageChild(m_params[i].m_ruleForm);
}/* for i */
XP_FREEIF(attrItems);
}/* if */
else {
/* AB_SEARCH_ADVANCED
* clean up residue
*/
fe_SetString(m_modeToggle,
XmNlabelString, XP_GetString(XFE_SEARCH_BASIC));
/* un map
*/
for (i=0; i < m_nRules; i++)
cleanupUI(i, False);
XtVaSetValues(m_rulesRowCol,
XmNorientation, XmVERTICAL,
XmNnumColumns, 1,
XmNpacking, XmPACK_COLUMN,
NULL);
/* free heap & basic widget .....
*/
/* get attribs for this scope
*/
if (!m_andOrForm) {
ac = 0;
XtSetArg(av[ac], XmNpositionIndex, 0); ac++;
m_andOrForm =
XmCreateForm(m_rulesRowCol, "andOrForm", av, ac);
ABSearchUIHint_t *hint =
(ABSearchUIHint_t *) XP_CALLOC(2,
sizeof(ABSearchUIHint_t));
/* and, or
*/
int i;
for (i=0; i < 2; i++) {
hint[i].m_th = -1;
hint[i].m_type = AB_SEARCH_CONNECTOR;
hint[i].m_menuItem =
(MSG_SearchMenuItem *) XP_CALLOC(1, sizeof(MSG_SearchMenuItem));
hint[i].m_menuItem->attrib = (int16) ((i==0)?True:False);
XP_SAFE_SPRINTF(hint[i].m_menuItem->name,
sizeof(hint[i].m_menuItem->name),
"%s",
XP_GetString(XFE_SEARCH_BOOL_AND_PROMPT+i));
hint[i].m_menuItem->isEnabled = True;
hint[i].m_obj = this;
}/* for i */
m_andOrOptMenu =
makeOptMenu(m_andOrForm,
2,
hint,
&(XFE_ABSearchView::optValChgCallback),
&m_andOrPopup);
XtVaSetValues(m_andOrOptMenu,
XmNleftAttachment, XmATTACH_FORM,
XmNtopAttachment, XmATTACH_FORM,
XmNrightAttachment, XmATTACH_NONE,
XmNbottomAttachment, XmATTACH_FORM,
NULL);
/* where
*/
Widget label = XtVaCreateManagedWidget(XP_GetString(XFE_SEARCH_BOOL_WHERE),
xmLabelGadgetClass, m_andOrForm,
XmNleftAttachment, XmATTACH_WIDGET,
XmNleftWidget, m_andOrOptMenu,
XmNtopAttachment, XmATTACH_FORM,
XmNrightAttachment, XmATTACH_NONE,
XmNbottomAttachment, XmATTACH_FORM,
NULL);
}/* if */
/* use whatever is there */
MSG_SearchAttribute attrib =
(MSG_SearchAttribute) info->m_logicOp;
setOptMenu(m_andOrOptMenu, (uint16) attrib);
XtManageChild(m_andOrForm);
/* get attribs for this scope
*/
if (!m_ruleCmdGroupForm) {
/* cmd group:form, more/fewer/clear
*/
ac = 0;
XtSetArg(av[ac], XmNpositionIndex, XmLAST_POSITION); ac++;
m_ruleCmdGroupForm =
XmCreateForm(m_rulesRowCol, "ruleCmdGroupForm", av, ac);
ac = 0;
XtSetArg(av[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
XtSetArg(av[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
XtSetArg(av[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
XtSetArg(av[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
m_moreBtn = XmCreatePushButton(m_ruleCmdGroupForm,
XP_GetString(XFE_SEARCH_MORE),
av, ac);
ac = 0;
XtSetArg(av[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
XtSetArg(av[ac], XmNleftWidget, m_moreBtn); ac++;
XtSetArg(av[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
XtSetArg(av[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
XtSetArg(av[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
m_fewerBtn = XmCreatePushButton(m_ruleCmdGroupForm,
XP_GetString(XFE_SEARCH_FEWER),
av, ac);
ac = 0;
XtSetArg(av[ac], XmNleftAttachment, XmATTACH_NONE); ac++;
XtSetArg(av[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
XtSetArg(av[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
XtSetArg(av[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
m_clearBtn = XmCreatePushButton(m_ruleCmdGroupForm,
XP_GetString(XFE_DLG_CLEAR),
av, ac);
XtManageChild(m_moreBtn);
XtManageChild(m_fewerBtn);
XtManageChild(m_clearBtn);
XtManageChild(m_ruleCmdGroupForm);
//
XtAddCallback(m_moreBtn, XmNactivateCallback,
XFE_ABSearchView::moreCallback,
this);
XtAddCallback(m_fewerBtn, XmNactivateCallback,
XFE_ABSearchView::fewerCallback,
this);
XtAddCallback(m_clearBtn, XmNactivateCallback,
XFE_ABSearchView::clearCallback,
this);
}/* if !m_ruleCmdGroupForm */
uint16 existing = m_nRules;
m_nRules = 0;
for (i=0; i < existing; i++) {
if (!m_params[i].m_attribNval.u.string ||
!XP_STRLEN(m_params[i].m_attribNval.u.string))
continue;
add1Rule(m_params[i].m_attribNval.attribute,
m_params[i].m_op,
m_params[i].m_attribNval.u.string);
}/* for i */
if (!m_nRules)
add1Rule();
XtSetSensitive(m_fewerBtn, (m_nRules <= 1)?False:True);
XtVaSetValues(m_ruleCmdGroupForm,
XmNpositionIndex, XmLAST_POSITION,
NULL);
XtManageChild(m_ruleCmdGroupForm);
}/* else */
XP_FREEIF(buffer);
XtManageChild(m_workForm);
}
void XFE_ABSearchView::getParams()
{
for (int i=0; i < m_nRules; i++) {
if (!m_params[i].m_textF)
/* meaningless
*/
break;
m_params[i].m_attribNval.u.string =
fe_GetTextField(m_params[i].m_textF);
}/* for i */
m_searchInfo->m_nRules = m_nRules;
m_searchInfo->m_params = m_params;
}
ABSearchUIHint_t*
XFE_ABSearchView::getOptMenuHint(uint16 th, uint16 *num)
{
/* op
*/
DIR_Server *dirs[1];
dirs[0] = (DIR_Server*) m_dir;
MSG_SearchMenuItem *opItems =
(MSG_SearchMenuItem *) XP_CALLOC(kNumOperators,
sizeof(MSG_SearchMenuItem));
uint16 opNum = kNumOperators;
MSG_SearchAttribute attrib =
m_params[th].m_attribNval.attribute;
MSG_SearchError err;
err = MSG_GetOperatorsForSearchScopes(fe_getMNMaster(),
scopeLdapDirectory,
(void**)dirs,
1,
attrib,
opItems,
&opNum);
*num = opNum;
/* op menu
*/
ABSearchUIHint_t *hint =
(ABSearchUIHint_t *) XP_CALLOC(opNum,
sizeof(ABSearchUIHint_t));
for (int i=0; i < opNum; i++) {
hint[i].m_th = th;
hint[i].m_type = AB_SEARCH_OP;
hint[i].m_menuItem = & opItems[i];
hint[i].m_obj = this;
}/* for i */
return hint;
}
void XFE_ABSearchView::setParams(ABSearchInfo_t *info)
{
toggleSearchMode(info);
}
// CBs
void XFE_ABSearchView::optValChgCallback(Widget w,
XtPointer clientData,
XtPointer callData)
{
XFE_ABSearchView *obj = (XFE_ABSearchView *) clientData;
obj->optValChgCB(w, callData);
}
void XFE_ABSearchView::optValChgCB(Widget w,
XtPointer /* callData */)
{
ABSearchUIHint_t *hint = NULL;
XtVaGetValues(w,
XmNuserData, &hint,
NULL);
XP_ASSERT(hint);
if (hint->m_type == AB_SEARCH_ATTRIB) {
m_params[hint->m_th].m_attribNval.attribute =
(MSG_SearchAttribute) hint->m_menuItem->attrib;
/* rebuild op
*/
uint16 opNum = 0;
ABSearchUIHint_t *Hint = getOptMenuHint(hint->m_th, &opNum);
Widget btn1 =
rebuildOptChildren(m_params[hint->m_th].m_opPopup,
opNum,
Hint,
&(XFE_ABSearchView::optValChgCallback));
XtVaSetValues(m_params[hint->m_th].m_opOptMenu,
XmNmenuHistory, btn1,
NULL);
m_params[hint->m_th].m_op =
(MSG_SearchOperator) Hint[0].m_menuItem->attrib;
}/* if */
else if (hint->m_type == AB_SEARCH_OP)
m_params[hint->m_th].m_op =
(MSG_SearchOperator) hint->m_menuItem->attrib;
else if (hint->m_type == AB_SEARCH_CONNECTOR) {
m_searchInfo->m_logicOp = (XP_Bool) hint->m_menuItem->attrib;
if (m_nRules > 1) {
char tmp[256];
sprintf(tmp,
"%s",
(m_searchInfo->m_logicOp?
XP_GetString(XFE_SEARCH_BOOL_AND_THE):
XP_GetString(XFE_SEARCH_BOOL_OR_THE)));
for (int i=1; i < m_nRules; i++) {
fe_SetString(m_params[i].m_label,
XmNlabelString, tmp);
}/* for i */
}/* if */
}/* else if */
}
void XFE_ABSearchView::toggleSearchModeCallback(Widget w,
XtPointer clientData,
XtPointer callData)
{
XFE_ABSearchView *obj = (XFE_ABSearchView *) clientData;
obj->toggleSearchModeCB(w, callData);
}
void XFE_ABSearchView::toggleSearchModeCB(Widget /* w */,
XtPointer /* callData */)
{
m_searchInfo->m_mode =
(m_searchInfo->m_mode==AB_SEARCH_ADVANCED)
?AB_SEARCH_BASIC
:AB_SEARCH_ADVANCED;
/* get input
*/
getParams();
toggleSearchMode(m_searchInfo);
}
void XFE_ABSearchView::okCallback(Widget w,
XtPointer clientData,
XtPointer callData)
{
XFE_ABSearchView *obj = (XFE_ABSearchView *) clientData;
obj->okCB(w, callData);
}
void XFE_ABSearchView::okCB(Widget /* w */,
XtPointer /* callData */)
{
cancelCB(NULL, NULL);
((ABSearchCBProc) m_searchInfo->m_cbProc)(m_searchInfo, NULL);
}
void XFE_ABSearchView::cancelCallback(Widget w,
XtPointer clientData,
XtPointer callData)
{
XFE_ABSearchView *obj = (XFE_ABSearchView *) clientData;
obj->cancelCB(w, callData);
}
void XFE_ABSearchView::cancelCB(Widget /* w */,
XtPointer /* callData */)
{
getParams();
for (int i=0; i < m_nRules; i++) {
m_params[i].m_ruleForm = NULL;
m_params[i].m_attribOptMenu = NULL;
m_params[i].m_attribPopup = NULL;
m_params[i].m_opOptMenu = NULL;
m_params[i].m_opPopup = NULL;
m_params[i].m_label = NULL;
m_params[i].m_textF = NULL;
}/* for i */
notifyInterested(XFE_ABSearchView::dlgClose);
}
void XFE_ABSearchView::moreCallback(Widget w,
XtPointer clientData,
XtPointer callData)
{
XFE_ABSearchView *obj = (XFE_ABSearchView *) clientData;
obj->moreCB(w, callData);
}
void XFE_ABSearchView::moreCB(Widget /* w */,
XtPointer /* callData */)
{
add1Rule();
XtSetSensitive(m_fewerBtn, (m_nRules <= 1)?False:True);
}
void XFE_ABSearchView::fewerCallback(Widget w,
XtPointer clientData,
XtPointer callData)
{
XFE_ABSearchView *obj = (XFE_ABSearchView *) clientData;
obj->fewerCB(w, callData);
}
void XFE_ABSearchView::fewerCB(Widget /* w */,
XtPointer /* callData */)
{
remove1Rule();
XtSetSensitive(m_fewerBtn, (m_nRules <= 1)?False:True);
}
void XFE_ABSearchView::clearCallback(Widget w,
XtPointer clientData,
XtPointer callData)
{
XFE_ABSearchView *obj = (XFE_ABSearchView *) clientData;
obj->clearCB(w, callData);
}
void XFE_ABSearchView::clearCB(Widget /* w */,
XtPointer /* callData */)
{
/* simply clear textF
*/
for (int i=0; i < m_nRules; i++) {
XP_FREEIF(m_params[i].m_attribNval.u.string);
fe_SetTextField(m_params[i].m_textF,
"");
}/* for i */
}
void XFE_ABSearchView::textFActivateCallback(Widget w,
XtPointer clientData,
XtPointer callData)
{
XFE_ABSearchView *obj = (XFE_ABSearchView *) clientData;
obj->textFActivateCB(w, callData);
}
void XFE_ABSearchView::textFActivateCB(Widget /* w */,
XtPointer /* clientData */)
{
okCB(NULL, NULL);
}