Files
cdesktop/cde/programs/dtappbuilder/src/ab/conn_stubs.c
2018-06-27 22:00:56 -06:00

3988 lines
103 KiB
C
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*** DTB_USER_CODE_START vvv Add file header below vvv ***/
/*
* CDE - Common Desktop Environment
*
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
*
* These libraries and programs are free software; you can
* redistribute them and/or modify them under the terms of the GNU
* Lesser General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* These libraries and programs are distributed in the hope that
* they will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with these libraries and programs; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
/*** DTB_USER_CODE_END ^^^ Add file header above ^^^ ***/
/*
* File: conn_stubs.c
* Contains: Module callbacks and connection functions
*
* This file was generated by dtcodegen, from module conn
*
* Any text may be added between the DTB_USER_CODE_START and
* DTB_USER_CODE_END comments (even non-C code). Descriptive comments
* are provided only as an aid.
*
* ** EDIT ONLY WITHIN SECTIONS MARKED WITH DTB_USER_CODE COMMENTS. **
* ** ALL OTHER MODIFICATIONS WILL BE OVERWRITTEN. DO NOT MODIFY OR **
* ** DELETE THE GENERATED COMMENTS! **
*/
#include <stdint.h>
#include <stdio.h>
#include <Xm/Xm.h>
#include "dtb_utils.h"
#include "dtbuilder.h"
#include "conn_ui.h"
/**************************************************************************
*** DTB_USER_CODE_START
***
*** All necessary header files have been included.
***
*** Add include files, types, macros, externs, and user functions here.
***/
#include <sys/param.h>
#include "dtbuilder.h"
#include "conn_ui.h"
#include "palette_ui.h"
#include "prop.h"
#include <ab_private/connP.h>
#include <X11/Xlib.h>
#include <X11/Intrinsic.h>
#include <X11/cursorfont.h>
#include <Xm/List.h>
#include <Xm/PushB.h>
#include <Xm/RowColumn.h>
#include <Xm/ToggleB.h>
#include <Xm/TextF.h>
#include <Xm/Text.h>
#include <ab_private/obj.h>
#include <ab_private/trav.h>
#include <ab_private/objxm.h>
#include <ab_private/abobj.h>
#include <ab_private/abobj_set.h>
#include <ab_private/abobj_list.h>
#include <ab_private/brws.h>
#include <ab_private/proj.h>
#include <ab_private/istr.h>
#include <ab_private/ab.h>
#include <ab_private/ui_util.h>
#include "dtb_utils.h"
/*
* Declarations of global widgets used by callbacks.
*/
static Widget src_menu = NULL;
static Widget target_menu = NULL;
static Widget when_menu = NULL;
static Widget action_menu = NULL;
static Widget view_menu = NULL;
static Widget when_pulldown = NULL;
static Widget action_pulldown = NULL;
static Widget src_list = NULL;
static Widget target_list = NULL;
static Widget connection_list = NULL;
static Widget arg_rowcol = NULL;
static Widget arg_label = NULL;
static Widget arg_field = NULL;
static Widget connect_button = NULL;
static Widget change_button = NULL;
static Widget cancel_button = NULL;
static Widget delete_button = NULL;
static Widget std_action_item = NULL;
static Widget call_function_item = NULL;
static Widget execute_code_item = NULL;
static Widget on_item_help_item = NULL;
static Widget help_volume_item = NULL;
static Widget location_rowcol = NULL;
static Widget location_field = NULL;
static Widget volume_rowcol = NULL;
static Widget volume_field = NULL;
static Widget action_type_opmenu = NULL;
static Widget exec_code_dialog = NULL;
static Widget exec_code_textpane = NULL;
static Widget ConnP_view_source_obj = NULL; /* View:'s "Source Object" PushButton */
static long ConnP_view_filter = -1;
static STRING CodeFragBuf = NULL;
static STRING action_type_labels[ACTION_TYPE_NUM_VALUES];
static AB_WHEN DefaultWhen = AB_WHEN_UNDEF;
static AB_FUNC_TYPE DefaultFuncType = AB_FUNC_UNDEF;
/*
* End declarations of global widgets
*/
static void init_exec_code_dialog(
DtbConnExecCodeDialogInfo instance
);
static void populate_src_menu(
Widget widget,
XtPointer client_data,
XtPointer call_data
);
static void populate_target_menu(
Widget widget,
XtPointer client_data,
XtPointer call_data
);
static void populate_when_menu(
Widget widget,
XtPointer client_data,
XtPointer call_data
);
static void populate_action_menu(
Widget widget,
XtPointer client_data,
XtPointer call_data
);
static void populate_view_menu(
Widget widget,
XtPointer client_data,
XtPointer call_data
);
static void populate_list(
Widget list,
ABObj cur_selection,
BOOL invoke_cb
);
static void populate_connection_list(
ABObj cur_action_obj
);
static void change_src_type(
Widget w,
XtPointer client_data,
XtPointer call_data
);
static void change_target_type(
Widget w,
XtPointer client_data,
XtPointer call_data
);
static void change_arg_sensitivity(
Widget w,
XtPointer client_data,
XtPointer call_data
);
static void set_view_filter(
Widget w,
XtPointer client_data,
XtPointer call_data
);
static BOOL is_action_type(
ABObj obj,
int filter
);
static void update_cur_src(
Widget w,
XtPointer client_data,
XtPointer call_data
);
static void update_cur_target(
Widget w,
XtPointer client_data,
XtPointer call_data
);
static void select_connection(
Widget w,
XtPointer client_data,
XtPointer call_data
);
static void setup_source(
AB_OBJECT_TYPE source_type,
int source_subtype,
ABObj source
);
static void setup_target(
AB_OBJECT_TYPE target_type,
int target_subtype,
ABObj target
);
static int get_cur_when(
void
);
static AB_BUILTIN_ACTION get_cur_act(
void
);
static void set_cur_when(
AB_WHEN new_when
);
static void set_cur_act(
AB_BUILTIN_ACTION new_act
);
static ABObj get_cur_connection(
void
);
static void set_standard_action_type(
void
);
static void set_call_function_action_type(
void
);
static void set_execute_code_action_type(
void
);
static void set_on_item_help_action_type(
void
);
static void set_access_help_vol_action_type(
void
);
static void set_conn_controls(
BOOL state
);
static void hide_execute_code_win(
void
);
static BOOL verify_builtin_arg_string(
AB_BUILTIN_ACTION c_act,
ABObj c_target,
Widget field
);
static void update_on_src_type_change(
AB_OBJECT_TYPE obj_type,
int obj_subtype
);
static void update_on_target_type_change(
AB_OBJECT_TYPE obj_type,
int obj_subtype
);
static void update_conn_ed_controls(void);
static AB_FUNC_TYPE get_cur_func_type(void);
static BOOL src_list_test(
ABObj test_obj
);
static BOOL target_list_test(
ABObj test_obj
);
static void set_ctrls_for_src(
BOOL state
);
static void set_ctrls_for_target(
BOOL state
);
extern void
conn_init(void)
{
conn_strings_init();
obj_add_destroy_callback(connP_update_on_obj_destroy, NULL);
}
extern void
conn_popup_dialog(
Widget widget,
XtPointer client_data,
XtPointer call_data
)
{
extern Widget AB_toplevel;
if (AB_conn_dialog == (Widget)NULL)
{
dtbConnConnDialogInfo_clear(&dtb_conn_conn_dialog);
(void)dtb_conn_conn_dialog_initialize(&dtb_conn_conn_dialog,
AB_toplevel);
AB_conn_dialog = dtb_conn_conn_dialog.conn_dialog_shellform;
/*
* Setup dialog to participate in dtbuilder window protocol
*/
ab_register_window(AB_conn_dialog, AB_WIN_DIALOG,
WindowHidden, AB_toplevel, AB_WPOS_TILE_HORIZONTAL,
conn_cancelCB, (XtPointer)&dtb_conn_conn_dialog);
/*
* These callbacks only operate on the Connections Editor dialog
* i.e. update lists
*
* If any code is added to them that is independent of
* the Connections Editor, then the callback registration
* may have to be done in conn_init().
*/
obj_add_rename_callback(connP_update_on_obj_rename, NULL);
obj_add_update_callback(connP_update_on_show_status, NULL);
}
XtManageChild(AB_conn_dialog);
ab_show_window(AB_conn_dialog);
update_conn_ed_controls();
}
static void
init_exec_code_dialog(
DtbConnExecCodeDialogInfo instance
)
{
exec_code_dialog = instance->exec_code_dialog_shellform;
exec_code_textpane = instance->exec_code_textpane;
ab_register_window(exec_code_dialog, AB_WIN_DIALOG,
WindowHidden, AB_conn_dialog, AB_WPOS_STACK_CENTER,
NULL, NULL);
}
static void
populate_src_menu(
Widget widget,
XtPointer client_data,
XtPointer call_data
)
{
int i;
for (i = 0; i < ConnP_num_conn_objs; i++)
{
Widget w;
w = XtVaCreateManagedWidget("src_menu_push",
xmPushButtonWidgetClass, widget,
XtVaTypedArg, XmNlabelString, XtRString,
ConnP_conn_objs[i].label, strlen(ConnP_conn_objs[i].label)+1,
NULL);
XtAddCallback(w, XmNactivateCallback,
(XtCallbackProc)change_src_type,
(XtPointer)&(ConnP_conn_objs[i]));
}
}
static void
populate_target_menu(
Widget widget,
XtPointer client_data,
XtPointer call_data
)
{
int i;
for (i = 0; i < ConnP_num_conn_objs; i++)
{
Widget w = NULL;
/* Application and Message objects can never be a
* target, so don't put them in the Target Object
* Type option menu.
*/
if ( (ConnP_conn_objs[i].obj_type != AB_TYPE_MESSAGE) &&
(ConnP_conn_objs[i].obj_type != AB_TYPE_PROJECT) &&
(ConnP_conn_objs[i].obj_type != AB_TYPE_MENU)
)
{
w = XtVaCreateManagedWidget("target_menu_push",
xmPushButtonWidgetClass, widget,
XtVaTypedArg, XmNlabelString, XtRString,
ConnP_conn_objs[i].label,
strlen(ConnP_conn_objs[i].label)+1,
NULL);
XtAddCallback(w, XmNactivateCallback,
(XtCallbackProc)change_target_type,
(XtPointer)&(ConnP_conn_objs[i]));
}
}
}
static void
populate_when_menu(
Widget widget,
XtPointer client_data,
XtPointer call_data
)
{
int num_labels;
int i;
char **labels;
Widget *w_list = NULL;
when_pulldown = widget;
labels = connP_get_when_labels(&num_labels);
if (num_labels > 0)
{
w_list = (Widget *)XtMalloc(sizeof(Widget) * (num_labels + 1));
for (i = 0; i < num_labels; i++)
{
Widget w;
w = XtVaCreateWidget("when_menu_push",
xmPushButtonWidgetClass, when_pulldown,
XtVaTypedArg, XmNlabelString, XtRString,
labels[i], strlen(labels[i])+1,
NULL);
w_list[i] = w;
}
w_list[i] = NULL;
}
XtVaSetValues(when_pulldown, XmNuserData, (XtPointer)w_list, NULL);
connP_ui_source_type_update(connP_get_source_type(),
connP_get_source_subtype());
}
static void
populate_action_menu(
Widget widget,
XtPointer client_data,
XtPointer call_data
)
{
int num_labels;
int i;
char **labels;
Widget *w_list = NULL;
action_pulldown = widget;
labels = connP_get_act_labels(&num_labels);
if (num_labels > 0)
{
w_list = (Widget *)XtMalloc(sizeof(Widget) * (num_labels + 1));
for (i = 0; i < num_labels; i++)
{
Widget w;
w = XtVaCreateWidget("action_menu_push",
xmPushButtonWidgetClass, action_pulldown,
XtVaTypedArg, XmNlabelString, XtRString,
labels[i], strlen(labels[i])+1,
NULL);
XtAddCallback(w, XmNactivateCallback,
change_arg_sensitivity, (XtPointer)NULL);
w_list[i] = w;
}
w_list[i] = NULL;
}
XtVaSetValues(action_pulldown, XmNuserData, (XtPointer)w_list, NULL);
connP_ui_target_type_update(connP_get_target_type(),
connP_get_target_subtype());
}
static void
populate_view_menu(
Widget widget,
XtPointer client_data,
XtPointer call_data
)
{
long i;
Widget w;
w = XtVaCreateManagedWidget("view_menu_push",
xmPushButtonWidgetClass, widget,
XtVaTypedArg, XmNlabelString, XtRString,
"Source Object", sizeof("Source Object"),
NULL);
XtAddCallback(w, XmNactivateCallback, set_view_filter, (XtPointer)-1);
ConnP_view_source_obj = w;
for (i = 0; i < ConnP_num_conn_objs; i++)
{
w = XtVaCreateManagedWidget("view_menu_push",
xmPushButtonWidgetClass, widget,
XtVaTypedArg, XmNlabelString, XtRString,
ConnP_conn_objs[i].label, strlen(ConnP_conn_objs[i].label)+1,
NULL);
XtAddCallback(w, XmNactivateCallback, set_view_filter, (XtPointer)i);
}
}
static void
setup_source(
AB_OBJECT_TYPE source_type,
int source_subtype,
ABObj source
)
{
long i = connP_get_obj_type_index(source_type, source_subtype);
if (i < 0) return;
XtVaSetValues(XmOptionButtonGadget(src_menu),
XtVaTypedArg, XmNlabelString, XtRString,
ConnP_conn_objs[i].label, strlen(ConnP_conn_objs[i].label)+1,
NULL);
populate_list(src_list, source, FALSE);
}
static void
setup_target(
AB_OBJECT_TYPE target_type,
int target_subtype,
ABObj target
)
{
long i = connP_get_obj_type_index(target_type, target_subtype);
if (i < 0) return;
XtVaSetValues(XmOptionButtonGadget(target_menu),
XtVaTypedArg, XmNlabelString, XtRString,
ConnP_conn_objs[i].label, strlen(ConnP_conn_objs[i].label)+1,
NULL);
populate_list(target_list, target, FALSE);
}
static void
populate_list(
Widget list,
ABObj cur_selection,
BOOL invoke_cb
)
{
ABObj project = proj_get_project();
STRING select_item = NULL;
int iRet = -1;
if (list == NULL || project == NULL)
return;
if (list == src_list)
abobj_list_load(list, project, src_list_test);
else
abobj_list_load(list, project, target_list_test);
/* If the current object is in the list, then select
* (highlight) it and call the callback associated
* with selecting a list item. If all the items remain
* deselected, then we have to make sure to make the
* appropriate things inactive.
*/
if (cur_selection)
{
select_item = abobj_get_moduled_name(cur_selection);
iRet = ui_list_select_item(list, select_item, invoke_cb);
}
/* If cur_selection is NOT in the list, grey out the
* the right controls.
*/
if ((iRet < 0) || (cur_selection == NULL))
{
if (list == target_list)
{
if (get_cur_func_type() == AB_FUNC_BUILTIN)
set_ctrls_for_target(FALSE);
else
set_ctrls_for_target(TRUE);
}
else if (list == src_list)
set_ctrls_for_src(FALSE);
}
}
static BOOL
src_list_test(
ABObj test_obj
)
{
AB_OBJECT_TYPE obj_type = obj_get_type(test_obj);
int obj_subtype = obj_get_subtype(test_obj);
AB_OBJECT_TYPE cur_obj_type = connP_get_source_type();
int cur_obj_subtype = connP_get_source_subtype();
ABObj mod = obj_get_module(test_obj);
BOOL ret = FALSE;
if ((cur_obj_type == AB_TYPE_PROJECT) &&
(obj_type == cur_obj_type))
{
ret = TRUE;
}
else if ((mod != NULL) && obj_has_flag(mod, MappedFlag)
&& obj_is_defined(mod))
{
if (connP_objtype_needs_subtype(cur_obj_type, cur_obj_subtype))
{
if (!obj_is_sub(test_obj) &&
obj_is_defined(test_obj) &&
(obj_type == cur_obj_type) &&
(obj_subtype == cur_obj_subtype))
{
ret = TRUE;
}
}
else
{
/* If the object is not a container (i.e. group,
* menubar, panedwindow, etc.), and the object
* doesn't need a subtype, either because it
* doesn't have one (i.e. AB_TYPE_PROJECT) or
* because all object subtypes should appear
* under one catetory (i.e. AB_TYPE_CHOICE shows
* optionmenus, radioboxes, and checkboxes), then
* search for all those objects based solely on
* the object type - don't care about subtype.
* If the object is a container and it doesn't
* need a subtype, then its one of AB_CONT_FOOTER,
* AB_CONT_BUTTON_PANEL, AB_CONT_RELATIVE,
* AB_CONT_TOOL_BAR, so only count those objects.
*/
if (!obj_is_container(test_obj) &&
!obj_is_sub(test_obj) &&
obj_is_defined(test_obj) &&
obj_type == cur_obj_type)
{
ret = TRUE;
}
else if (obj_is_container(test_obj) &&
(cur_obj_type == AB_TYPE_CONTAINER)
&& !obj_is_sub(test_obj) &&
obj_is_defined(test_obj) &&
( (obj_subtype == AB_CONT_FOOTER) ||
(obj_subtype == AB_CONT_BUTTON_PANEL)||
(obj_subtype == AB_CONT_RELATIVE) ||
(obj_subtype == AB_CONT_TOOL_BAR)))
{
ret = TRUE;
}
}
}
return ret;
}
static BOOL
target_list_test(
ABObj test_obj
)
{
AB_OBJECT_TYPE obj_type = obj_get_type(test_obj);
int obj_subtype = obj_get_subtype(test_obj);
AB_OBJECT_TYPE cur_obj_type = connP_get_target_type();
int cur_obj_subtype = connP_get_target_subtype();
ABObj mod = obj_get_module(test_obj);
BOOL ret = FALSE;
if ((mod != NULL) && obj_has_flag(mod, MappedFlag)
&& obj_is_defined(mod))
{
if (connP_objtype_needs_subtype(cur_obj_type, cur_obj_subtype))
{
if (!obj_is_sub(test_obj) &&
obj_is_defined(test_obj) &&
(obj_type == cur_obj_type) &&
(obj_subtype == cur_obj_subtype))
{
ret = TRUE;
}
}
else
{
/* If the object is not a container (i.e. group,
* menubar, panedwindow, etc.), and the object
* doesn't need a subtype, either because it
* doesn't have one (i.e. AB_TYPE_PROJECT) or
* because all object subtypes should appear
* under one catetory (i.e. AB_TYPE_CHOICE shows
* optionmenus, radioboxes, and checkboxes), then
* search for all those objects based solely on
* the object type - don't care about subtype.
* If the object is a container and it doesn't
* need a subtype, then it's one of AB_CONT_FOOTER,
* AB_CONT_BUTTON_PANEL, AB_CONT_RELATIVE,
* AB_CONT_TOOL_BAR, so only count those objects.
*/
if (!obj_is_container(test_obj) &&
!obj_is_sub(test_obj) &&
obj_is_defined(test_obj) &&
obj_type == cur_obj_type)
{
ret = TRUE;
}
else if (obj_is_container(test_obj) &&
(cur_obj_type == AB_TYPE_CONTAINER)
&& !obj_is_sub(test_obj) &&
obj_is_defined(test_obj) &&
( (obj_subtype == AB_CONT_FOOTER) ||
(obj_subtype == AB_CONT_BUTTON_PANEL)||
(obj_subtype == AB_CONT_RELATIVE) ||
(obj_subtype == AB_CONT_TOOL_BAR)))
{
ret = TRUE;
}
}
}
return ret;
}
static void
populate_connection_list(
ABObj cur_action_obj
)
{
ABObj project = proj_get_project();
ABObj obj = NULL, selected_conn = NULL;
AB_TRAVERSAL trav;
ABObj *obj_list = (ABObj *)NULL;
int count;
XtSetSensitive(change_button, FALSE);
XtSetSensitive(delete_button, FALSE);
if (connection_list == NULL || project == NULL)
return;
/* Save the currently selected connection in the View list */
selected_conn = get_cur_connection();
XtVaGetValues(connection_list, XmNuserData, (XtPointer)&obj_list, NULL);
if (obj_list != NULL)
XtFree((char *)obj_list);
obj_list = (ABObj *)NULL;
XtVaSetValues(connection_list, XmNuserData, (XtPointer)obj_list, NULL);
XmListDeselectAllItems(connection_list);
XmListDeleteAllItems(connection_list);
/*
if (connP_get_source() != NULL &&
obj_get_type(connP_get_source()) != connP_get_source_type())
return;
*/
count = 0;
for (trav_open(&trav, project, AB_TRAV_ACTIONS);
(obj = trav_next(&trav)) != NULL; )
{
if (!is_action_type(obj, ConnP_view_filter))
continue;
count++;
}
trav_close(&trav);
if (count == 0)
{
XtSetSensitive(connection_list, FALSE);
return;
}
else
{
XtSetSensitive(connection_list, TRUE);
}
obj_list = (ABObj *)XtMalloc(sizeof(ABObj) * (count+1));
if (obj_list == (ABObj *)NULL)
return;
count = 0;
for (trav_open(&trav, project, AB_TRAV_ACTIONS);
(obj = trav_next(&trav)) != NULL; )
{
XmString xm_item_str;
if (is_action_type(obj, ConnP_view_filter))
{
STRING item_str = connP_make_conn_string(obj);
xm_item_str = XmStringCreateLocalized(item_str);
XmListAddItem(connection_list, xm_item_str, 0);
XmStringFree(xm_item_str);
if ((cur_action_obj == obj) ||
(selected_conn && (selected_conn == obj)))
{
ui_list_select_item(connection_list, item_str, FALSE);
XtSetSensitive(change_button, TRUE);
XtSetSensitive(delete_button, TRUE);
}
obj_list[count++] = obj;
}
}
trav_close(&trav);
obj_list[count] = (ABObj)NULL;
XtVaSetValues(connection_list, XmNuserData, (XtPointer)obj_list, NULL);
}
static BOOL
is_action_type(
ABObj obj,
int filter
)
{
BOOL ret_val = (BOOL)FALSE;
ABObj mod;
if (!obj_is_project(obj->info.action.from))
{
mod = obj_get_module(obj->info.action.from);
if (mod == NULL || !obj_has_flag(mod, MappedFlag))
goto cret;
}
if (filter == -1)
{
ret_val = obj->info.action.from == connP_get_source();
}
else
{
AB_OBJECT_TYPE obj_type = ConnP_conn_objs[filter].obj_type;
int obj_subtype = ConnP_conn_objs[filter].obj_subtype;
ret_val = obj_get_type(obj->info.action.from) == obj_type;
if (obj_subtype != -1)
ret_val &= (obj_get_subtype(obj->info.action.from) == obj_subtype);
}
cret:
return(ret_val);
}
static void
change_src_type(
Widget w,
XtPointer client_data,
XtPointer call_data
)
{
ConnObj *objtype_desc = (ConnObj *)client_data;
if (objtype_desc == (ConnObj *)NULL)
return;
update_on_src_type_change(objtype_desc->obj_type,
objtype_desc->obj_subtype);
/* Reset the current source to be NULL */
conn_set_source((ABObj) NULL);
/* Reset the connections list */
connP_set_connection(NULL);
populate_connection_list(connP_get_connection());
/* Make When option menu inactive */
set_ctrls_for_src(FALSE);
set_conn_controls(FALSE);
}
static void
change_target_type(
Widget w,
XtPointer client_data,
XtPointer call_data
)
{
ConnObj *objtype_desc = (ConnObj *)client_data;
if (objtype_desc == (ConnObj *)NULL)
return;
update_on_target_type_change(objtype_desc->obj_type,
objtype_desc->obj_subtype);
/* Reset the current target to be NULL */
conn_set_target((ABObj) NULL);
/* Make action option menu and argument field inactive */
set_ctrls_for_target(FALSE);
if (!connP_conn_is_possible())
set_conn_controls(FALSE);
}
static void
change_arg_sensitivity(
Widget w,
XtPointer client_data,
XtPointer call_data
)
{
int act_cand = get_cur_act();
AB_BUILTIN_ACTION act_type = AB_STDACT_UNDEF;
if (act_cand < 0 || act_cand >= AB_BUILTIN_ACTION_NUM_VALUES)
return;
XmTextFieldSetString(arg_field, "");
act_type = (AB_BUILTIN_ACTION)act_cand;
if (connP_action_needs_arg(act_type))
{
XtSetSensitive(arg_label, TRUE);
XtSetSensitive(arg_field, TRUE);
XmProcessTraversal(arg_field, XmTRAVERSE_CURRENT);
}
else
{
XtSetSensitive(arg_label, FALSE);
XtSetSensitive(arg_field, FALSE);
}
}
static void
set_view_filter(
Widget w,
XtPointer client_data,
XtPointer call_data
)
{
if (ConnP_view_filter != (long)client_data)
{
ConnP_view_filter = (long)client_data;
populate_connection_list(NULL);
}
}
/* This is the browseSelect callback for the Source
* object list.
*/
static void
update_cur_src(
Widget w,
XtPointer client_data,
XtPointer call_data
)
{
XmListCallbackStruct *list_cl = (XmListCallbackStruct *)call_data;
ABObj module = (ABObj) NULL;
ABObj selected_obj = (ABObj) NULL;
STRING name = NULL;
if (list_cl->reason != XmCR_BROWSE_SELECT)
{
return;
}
if (name = objxm_xmstr_to_str(list_cl->item))
{
abobj_moduled_name_extract(name, &module, &selected_obj);
if (selected_obj == NULL)
abobj_project_name_extract(name, &selected_obj);
util_free(name);
if (selected_obj)
{
conn_set_source(selected_obj);
/* If the object is a message, then we have to do
* some special processing for the "When" optionmenu.
* The reason is that the "When" optionmenu can
* change when different message objects are selected
* from the Source Object List. If a particular
* message does not have a certain button, then that
* "when" (i.e. Click Action1) is made inactive, so
* another "when" should be shown instead.
*/
if (obj_is_message(selected_obj))
{
if (obj_has_action1_button(selected_obj))
{
XtVaSetValues(XmOptionButtonGadget(when_menu),
XtVaTypedArg, XmNlabelString, XtRString,
ConnP_conn_whens[0].label,
strlen(ConnP_conn_whens[0].label)+1, NULL);
}
else if (obj_has_action2_button(selected_obj))
{
XtVaSetValues(XmOptionButtonGadget(when_menu),
XtVaTypedArg, XmNlabelString, XtRString,
ConnP_conn_whens[1].label,
strlen(ConnP_conn_whens[1].label)+1, NULL);
}
else if (obj_has_action3_button(selected_obj))
{
XtVaSetValues(XmOptionButtonGadget(when_menu),
XtVaTypedArg, XmNlabelString, XtRString,
ConnP_conn_whens[2].label,
strlen(ConnP_conn_whens[2].label)+1, NULL);
}
else if (obj_has_cancel_button(selected_obj))
{
XtVaSetValues(XmOptionButtonGadget(when_menu),
XtVaTypedArg, XmNlabelString, XtRString,
ConnP_conn_whens[3].label,
strlen(ConnP_conn_whens[3].label)+1, NULL);
}
}
/* If the currently selected object is a choice item,
* then we have to check if it is a radio/checkbox
* item or an optionmenu item. If it's a radio/checkbox
* item, then set the "When" to be "Toggled" ["Activated"
* is made inactive in connP_update_when_menu()]. If the
* the item is an optionmenu item, then make the "When"
* ["Toggled" is made inactive in connP_update_when_menu()].
*/
if (obj_is_choice_item(selected_obj))
{
if (obj_is_option_menu(obj_get_root(obj_get_parent(selected_obj))))
XtVaSetValues(XmOptionButtonGadget(when_menu),
XtVaTypedArg, XmNlabelString, XtRString,
ConnP_conn_whens[2].label,
strlen(ConnP_conn_whens[2].label)+1, NULL);
else
XtVaSetValues(XmOptionButtonGadget(when_menu),
XtVaTypedArg, XmNlabelString, XtRString,
ConnP_conn_whens[3].label,
strlen(ConnP_conn_whens[3].label)+1, NULL);
}
connP_set_connection(NULL);
populate_connection_list(connP_get_connection());
set_ctrls_for_src(TRUE);
if (connP_conn_is_possible())
set_conn_controls(TRUE);
else
set_conn_controls(FALSE);
}
}
}
static void
update_cur_target(
Widget w,
XtPointer client_data,
XtPointer call_data
)
{
XmListCallbackStruct *list_cl = (XmListCallbackStruct *)call_data;
ABObj module = (ABObj) NULL;
ABObj selected_obj = (ABObj) NULL;
STRING name = NULL;
AB_WHEN g_when = AB_WHEN_UNDEF;
AB_FUNC_TYPE g_func = AB_FUNC_UNDEF;
AB_BUILTIN_ACTION g_act = AB_STDACT_UNDEF;
if (list_cl->reason != XmCR_BROWSE_SELECT)
return;
if (name = objxm_xmstr_to_str(list_cl->item))
{
abobj_moduled_name_extract(name, &module, &selected_obj);
util_free(name);
if (selected_obj)
{
conn_set_target(selected_obj);
/* Get the default action. It can change depending
* upon the source and target objects.
*/
connP_guess_when_action(connP_get_source_type(),
connP_get_source_subtype(),
connP_get_target_type(),
connP_get_target_subtype(),
&g_when, &g_func, &g_act);
if (g_act != get_cur_act())
set_cur_act(g_act);
set_ctrls_for_target(TRUE);
if (connP_conn_is_possible())
set_conn_controls(TRUE);
else
set_conn_controls(FALSE);
}
}
}
static void
select_connection(
Widget w,
XtPointer client_data,
XtPointer call_data
)
{
XmListCallbackStruct *list_cl = (XmListCallbackStruct *)call_data;
ABObj *obj_list = (ABObj *)NULL;
ABObj cur_action = NULL;
AB_ACTION_INFO *cur_info;
if (list_cl->reason != XmCR_BROWSE_SELECT)
return;
XtVaGetValues(w, XmNuserData, &obj_list, NULL);
if (obj_list == NULL)
return;
if (list_cl->item_position > 0)
cur_action = obj_list[list_cl->item_position-1];
if (cur_action == NULL || !obj_is_action(cur_action))
return;
cur_info = &(cur_action->info.action);
if (cur_info->from == NULL)
return;
XtSetSensitive(change_button, TRUE);
XtSetSensitive(delete_button, TRUE);
if (connP_get_source_type() != obj_get_type(cur_info->from))
{
if (connP_objtype_needs_subtype(obj_get_type(cur_info->from),
obj_get_subtype(cur_info->from)))
{
if (connP_get_source_subtype() != obj_get_subtype(cur_info->from))
{
conn_set_source(cur_info->from);
setup_source(connP_get_source_type(),
connP_get_source_subtype(),
connP_get_source());
}
}
else
{
conn_set_source(cur_info->from);
setup_source(connP_get_source_type(),
connP_get_source_subtype(),
connP_get_source());
}
}
else
{
conn_set_source(cur_info->from);
ui_list_select_item(src_list,
abobj_get_moduled_name(cur_info->from), FALSE);
}
set_cur_when(cur_info->when);
set_ctrls_for_src(TRUE);
switch (cur_info->func_type)
{
case AB_FUNC_BUILTIN:
if (cur_info->to == NULL)
return;
if (connP_get_target_type() != obj_get_type(cur_info->to))
{
if (connP_objtype_needs_subtype(obj_get_type(cur_info->to),
obj_get_subtype(cur_info->to)))
{
if (connP_get_target_subtype() != obj_get_subtype(cur_info->to))
{
conn_set_target(cur_info->to);
setup_target(connP_get_target_type(),
connP_get_target_subtype(),
connP_get_target());
}
}
else
{
conn_set_target(cur_info->to);
setup_target(connP_get_target_type(),
connP_get_target_subtype(),
connP_get_target());
}
}
else
{
conn_set_target(cur_info->to);
ui_list_select_item(target_list,
abobj_get_moduled_name(cur_info->to), FALSE);
}
set_cur_act(cur_info->func_value.builtin);
set_ctrls_for_target(TRUE);
if (connP_get_action_type() != AB_FUNC_BUILTIN)
{
ui_optionmenu_change_label(action_type_opmenu,
action_type_labels[ACTION_TYPE_PREDEFINED]);
set_standard_action_type();
}
switch (connP_action_needs_arg(cur_info->func_value.builtin))
{
case AB_ARG_STRING:
{
ISTRING istr_val;
istr_val = cur_info->arg_value.sval;
/*
* Populate arg entries
*/
if (istr_val != NULL)
XtVaSetValues(arg_field, XmNvalue,
istr_string(istr_val), NULL);
else
XtVaSetValues(arg_field, XmNvalue, "", NULL);
}
break;
case AB_ARG_INT:
{
char str_val[MAXPATHLEN];
*str_val = 0;
sprintf(str_val, "%d", cur_info->arg_value.ival);
XtVaSetValues(arg_field, XmNvalue, str_val, NULL);
}
break;
}
break;
case AB_FUNC_USER_DEF:
{
STRING cur_func_name = NULL;
STRING func_name = obj_get_func_name(cur_action);
XtVaGetValues(arg_field, XmNvalue, &cur_func_name, NULL);
set_ctrls_for_target(TRUE);
if (connP_get_action_type() != AB_FUNC_USER_DEF)
{
ui_optionmenu_change_label(action_type_opmenu,
action_type_labels[ACTION_TYPE_CALLFUNC]);
set_call_function_action_type();
}
if (strcmp(cur_func_name, func_name) != 0)
{
if (func_name != (STRING) NULL)
XtVaSetValues(arg_field, XmNvalue, func_name, NULL);
}
break;
}
case AB_FUNC_CODE_FRAG:
{
STRING code_frag = obj_get_func_code(cur_action);
set_ctrls_for_target(TRUE);
if (connP_get_action_type() != AB_FUNC_CODE_FRAG)
{
ui_optionmenu_change_label(action_type_opmenu,
action_type_labels[ACTION_TYPE_EXECUTE_CODE]);
set_execute_code_action_type();
}
if (!util_strempty(code_frag))
{
char *newline = NULL;
STRING first_line = NULL;
XmTextSetString(exec_code_textpane, code_frag);
newline = strchr(code_frag, '\n');
if (newline)
{
*newline = '\0';
}
first_line = (STRING)util_malloc(strlen(code_frag) + 4);
if (first_line)
{
strcpy(first_line, code_frag);
strcat(first_line, "...");
XmTextFieldSetString(arg_field, first_line);
util_free(first_line);
}
/* Put back the newline character */
if (newline) *newline = '\n';
}
else
XmTextFieldSetString(arg_field, "");
ab_show_window(exec_code_dialog);
break;
}
case AB_FUNC_ON_ITEM_HELP:
if (connP_get_action_type() != AB_FUNC_ON_ITEM_HELP)
{
ui_optionmenu_change_label(action_type_opmenu,
action_type_labels[ACTION_TYPE_ON_ITEM_HELP]);
set_on_item_help_action_type();
}
break;
case AB_FUNC_HELP_VOLUME:
{
STRING help_loc = obj_get_func_help_location(cur_action);
STRING help_vol = obj_get_func_help_volume(cur_action);
if (connP_get_action_type() != AB_FUNC_HELP_VOLUME)
{
ui_optionmenu_change_label(action_type_opmenu,
action_type_labels[ACTION_TYPE_HELP_VOLUME]);
}
set_access_help_vol_action_type();
if (help_loc != (STRING) NULL)
XmTextFieldSetString(location_field, help_loc);
if (help_vol != (STRING) NULL)
XmTextFieldSetString(volume_field, help_vol);
break;
}
}
}
static int
get_cur_when(
void
)
{
Widget label_wid = XmOptionButtonGadget(when_menu);
XmString xm_when_label = (XmString)NULL;
char *when_label = NULL;
int i;
XtVaGetValues(label_wid, XmNlabelString, &xm_when_label, NULL);
if (xm_when_label != NULL) {
when_label = objxm_xmstr_to_str(xm_when_label);
for (i = 0; i < ConnP_num_conn_whens; i++) {
if (!strcmp(when_label, ConnP_conn_whens[i].label)) {
XtFree(when_label);
return((int)ConnP_conn_whens[i].when_type);
}
}
}
/*
* Should never happen
*/
XtFree(when_label);
return(-1);
}
static AB_BUILTIN_ACTION
get_cur_act(
void
)
{
Widget label_wid = XmOptionButtonGadget(action_menu);
XmString xm_act_label = (XmString)NULL;
char *act_label = NULL;
int i;
XtVaGetValues(label_wid, XmNlabelString, &xm_act_label, NULL);
if (xm_act_label != NULL) {
act_label = objxm_xmstr_to_str(xm_act_label);
for (i = 0; i < ConnP_num_conn_acts; i++) {
if (!strcmp(act_label, ConnP_conn_acts[i].label)) {
XtFree(act_label);
return(ConnP_conn_acts[i].act_type);
}
}
}
/*
* Should never happen
*/
XtFree(act_label);
return((AB_BUILTIN_ACTION)-1);
}
static void
set_cur_when(
AB_WHEN new_when
)
{
int i;
for (i = 0; i < ConnP_num_conn_whens; i++)
{
if (new_when == ConnP_conn_whens[i].when_type)
break;
}
if (i < ConnP_num_conn_whens)
{
XtVaSetValues(XmOptionButtonGadget(when_menu),
XtVaTypedArg, XmNlabelString, XtRString,
ConnP_conn_whens[i].label, strlen(ConnP_conn_whens[i].label)+1,
NULL);
}
}
static void
set_cur_act(
AB_BUILTIN_ACTION new_act
)
{
int i;
for (i = 0; i < ConnP_num_conn_acts; i++)
if (new_act == ConnP_conn_acts[i].act_type)
break;
if (i < ConnP_num_conn_acts)
{
XtVaSetValues(XmOptionButtonGadget(action_menu),
XtVaTypedArg, XmNlabelString, XtRString,
ConnP_conn_acts[i].label, strlen(ConnP_conn_acts[i].label)+1,
NULL);
change_arg_sensitivity(arg_field, (XtPointer)NULL, (XtPointer)NULL);
}
}
extern void
connP_ui_source_type_update(
AB_OBJECT_TYPE new_type,
int new_subtype
)
{
Widget *w_list = NULL;
int i;
AB_WHEN g_when = AB_WHEN_UNDEF;
AB_FUNC_TYPE g_func = AB_FUNC_UNDEF;
AB_BUILTIN_ACTION g_act = AB_STDACT_UNDEF;
if (when_pulldown == NULL)
{
return;
}
XtVaGetValues(when_pulldown,
XmNuserData, &w_list,
NULL);
if (w_list == NULL)
{
return;
}
for (i = 0; w_list[i] != NULL; i++)
{
XtUnmanageChild(w_list[i]);
}
for (i = 0; i < ConnP_num_conn_whens; i++)
{
XtManageChild(w_list[ConnP_conn_whens[i].when_type - 1]);
}
}
extern void
connP_ui_target_type_update(
AB_OBJECT_TYPE new_type,
int new_subtype
)
{
Widget *w_list = NULL;
int i;
if (action_pulldown == NULL)
return;
XtVaGetValues(action_pulldown,
XmNuserData, &w_list,
NULL);
if (w_list == NULL)
return;
for (i = 0; w_list[i] != NULL; i++)
XtUnmanageChild(w_list[i]);
for (i = 0; i < ConnP_num_conn_acts; i++)
XtManageChild(w_list[ConnP_conn_acts[i].act_type - 1]);
}
static ABObj
get_cur_connection(
void
)
{
XmString *sel_items = NULL;
int sel_count = 0;
ABObj *obj_list = (ABObj *) NULL;
int pos = 0;
ABObj ab_action = NULL;
if (connection_list == NULL)
return(NULL);
/*
* Look for selected connection
*/
XtVaGetValues(connection_list,
XmNselectedItemCount, &sel_count,
XmNselectedItems, &sel_items,
XmNuserData, &obj_list,
NULL);
if (sel_count != 1 || obj_list == NULL)
{
return(NULL);
}
pos = XmListItemPos(connection_list, sel_items[0]);
if (pos <= 0)
{
return(NULL);
}
ab_action = obj_list[pos-1];
return(ab_action);
}
static void
set_standard_action_type(
void
)
{
XmString xm_label_str;
long i = 0;
BOOL found = FALSE;
connP_set_action_type(AB_FUNC_BUILTIN);
XtSetSensitive(target_menu, TRUE);
XtSetSensitive(target_list, TRUE);
XtManageChild(action_menu);
/* It's possible that the target list has a selected
* item even though it is insensitive. That means
* that when the Action Type is set back to Predefined
* and the target list becomes active again, then the
* action optionmenu has to have the right default
* action showing for the target object type selected.
*/
if (ui_list_get_selected_pos(target_list) > 0)
{
/* If the current predefined action is not appropriate
* for the current target object type, then change
* it to the default action. This shouldn't happen
* though, I think.
*/
for (i = 0; i < ConnP_num_conn_acts; i++)
if (get_cur_act() == ConnP_conn_acts[i].act_type)
found = TRUE;
if (!found)
{
i = -1;
i = connP_get_obj_type_index(connP_get_target_type(),
connP_get_target_subtype());
if (i >= 0)
set_cur_act(ConnP_conn_objs[i].default_act);
}
set_ctrls_for_target(TRUE);
}
else /* No target object selected */
{
set_ctrls_for_target(FALSE);
}
XtManageChild(arg_rowcol);
XmTextFieldSetString(arg_field, "");
XmTextFieldSetEditable(arg_field, True);
XtUnmanageChild(location_rowcol);
XtUnmanageChild(volume_rowcol);
hide_execute_code_win();
xm_label_str = XmStringCreateLocalized(catgets(Dtb_project_catd,
100, 54, ARGUMENT_LABEL));
XtVaSetValues(arg_label, XmNlabelString, xm_label_str, NULL);
XmStringFree(xm_label_str);
if (connP_conn_is_possible())
set_conn_controls(TRUE);
else
set_conn_controls(FALSE);
}
static void
set_call_function_action_type(
void
)
{
XmString xm_label_str;
connP_set_action_type(AB_FUNC_USER_DEF);
XtSetSensitive(target_menu, FALSE);
XtSetSensitive(target_list, FALSE);
XtManageChild(arg_rowcol);
XmTextFieldSetEditable(arg_field, True);
XmTextFieldSetString(arg_field, "");
XtUnmanageChild(action_menu);
XtUnmanageChild(volume_rowcol);
XtUnmanageChild(location_rowcol);
hide_execute_code_win();
xm_label_str = XmStringCreateLocalized(catgets(Dtb_project_catd,
100, 55, FUNCTION_LABEL));
XtVaSetValues(arg_label, XmNlabelString, xm_label_str, NULL);
XmStringFree(xm_label_str);
XtSetSensitive(arg_label, TRUE);
XtSetSensitive(arg_field, TRUE);
XmProcessTraversal(arg_field, XmTRAVERSE_CURRENT);
if (connP_conn_is_possible())
set_conn_controls(TRUE);
else
set_conn_controls(FALSE);
}
static void
set_execute_code_action_type(
void
)
{
XmString xm_label_str;
connP_set_action_type(AB_FUNC_CODE_FRAG);
XtSetSensitive(target_menu, FALSE);
XtSetSensitive(target_list, FALSE);
XtManageChild(arg_rowcol);
XmTextFieldSetEditable(arg_field, False);
XmTextFieldSetString(arg_field, "");
XtUnmanageChild(action_menu);
XtUnmanageChild(volume_rowcol);
XtUnmanageChild(location_rowcol);
xm_label_str = XmStringCreateLocalized(catgets(Dtb_project_catd,
100, 56, CODE_LABEL));
XtVaSetValues(arg_label, XmNlabelString, xm_label_str, NULL);
XmStringFree(xm_label_str);
XtSetSensitive(arg_label, TRUE);
XtSetSensitive(arg_field, TRUE);
XmProcessTraversal(arg_field, XmTRAVERSE_CURRENT);
if (connP_conn_is_possible())
set_conn_controls(TRUE);
else
set_conn_controls(FALSE);
}
static void
set_on_item_help_action_type(
void
)
{
connP_set_action_type(AB_FUNC_ON_ITEM_HELP);
XtSetSensitive(target_menu, FALSE);
XtSetSensitive(target_list, FALSE);
XtUnmanageChild(action_menu);
XtUnmanageChild(arg_rowcol);
XtUnmanageChild(volume_rowcol);
XtUnmanageChild(location_rowcol);
hide_execute_code_win();
if (connP_conn_is_possible())
set_conn_controls(TRUE);
else
set_conn_controls(FALSE);
}
static void
set_access_help_vol_action_type(
void
)
{
connP_set_action_type(AB_FUNC_HELP_VOLUME);
XtSetSensitive(target_menu, FALSE);
XtSetSensitive(target_list, FALSE);
XtUnmanageChild(action_menu);
XtUnmanageChild(arg_rowcol);
XtManageChild(volume_rowcol);
XmTextFieldSetString(volume_field, "");
XtManageChild(location_rowcol);
XmTextFieldSetString(location_field, "");
hide_execute_code_win();
if (connP_conn_is_possible())
set_conn_controls(TRUE);
else
set_conn_controls(FALSE);
}
extern int
connP_update_on_obj_destroy(
ObjEvDestroyInfo info
)
{
ABObj obj = info->obj,
project;
AB_OBJECT_TYPE ab_type;
ab_type = obj_get_type(obj);
if (ab_type == AB_TYPE_UNDEF || ab_type == AB_TYPE_UNKNOWN)
return 0;
project = obj_get_project(obj);
if (!project)
return (0);
/*
* If entire project is being destroyed, skip the cleanup
*/
if (!obj_has_flag(project, BeingDestroyedFlag))
connP_destroy_connections_for(obj);
if (AB_conn_dialog != (Widget)NULL)
{
if (obj == connP_get_source())
{
conn_set_source(NULL);
set_ctrls_for_src(FALSE);
}
if (obj == connP_get_target())
{
conn_set_target(NULL);
set_ctrls_for_target(FALSE);
}
if (connP_obj_part_of_conn(obj, connP_get_connection()))
{
connP_set_connection(NULL);
}
/*
* If obj is salient and its type is the same as that of
* the current source or target type in the conn-mgr,
* update the manager window
*/
abobj_list_obj_destroyed(src_list, info->obj, src_list_test);
abobj_list_obj_destroyed(target_list, info->obj, target_list_test);
populate_connection_list(connP_get_connection());
if (connP_conn_is_possible())
set_conn_controls(TRUE);
else
set_conn_controls(FALSE);
}
return 0;
}
extern int
connP_update_on_obj_rename(
ObjEvAttChangeInfo info
)
{
ABObj obj = info->obj;
AB_OBJECT_TYPE ab_type = AB_TYPE_UNDEF;
ABObj module = obj_get_module(obj);
int iRet = 0;
if ((obj != NULL) && (AB_conn_dialog != (Widget)NULL))
{
ab_type = obj_get_type(obj);
if ((ab_type != AB_TYPE_UNDEF) && (ab_type != AB_TYPE_UNKNOWN)
&& !obj_is_project(obj))
{
/* Replace the items in the Source and Target lists
* whose module name has changed or the object name
* has changed.
*/
abobj_list_obj_renamed(src_list, obj,
istr_string(info->old_name), src_list_test);
abobj_list_obj_renamed(target_list, obj,
istr_string(info->old_name), target_list_test);
/* Update the Connections list. An object's name
* or an object's module name may have changed
* and if it is part of a connection that is showing
* in the list, it has to be replaced.
*/
populate_connection_list(connP_get_connection());
}
}
return iRet;
}
/* Handles module show/hide and Undo of deleted object */
extern int
connP_update_on_show_status(
ObjEvUpdateInfo info
)
{
ABObj obj = info->obj;
ABObj conn = NULL, cur_conn_src_mod = NULL;
ABObj cur_conn_target_mod = NULL;
ABObj src_mod = NULL, target_mod = NULL;
int iRet = 0;
util_dprintf(3, "object updated: %s\n", obj_get_name(info->obj));
if ((obj != NULL) && (AB_conn_dialog != (Widget) NULL))
{
/* Update the Source, Target, and Connections lists */
abobj_list_obj_updated(src_list, info, src_list_test);
abobj_list_obj_updated(target_list, info, target_list_test);
populate_connection_list(connP_get_connection());
/* A module is being hidden */
if (obj_is_module(obj) && !obj_has_flag(obj, MappedFlag))
{
src_mod = obj_get_module(connP_get_source());
if (src_mod == obj)
{
conn_set_source(NULL);
set_ctrls_for_src(FALSE);
}
target_mod = obj_get_module(connP_get_target());
if (target_mod == obj)
{
conn_set_target(NULL);
if (connP_get_action_type() == AB_FUNC_BUILTIN)
set_ctrls_for_target(FALSE);
else
set_ctrls_for_target(TRUE);
}
if (conn = connP_get_connection())
{
cur_conn_src_mod = obj_get_module(obj_get_from(conn));
cur_conn_target_mod = obj_get_module(obj_get_to(conn));
if ((obj == cur_conn_src_mod) ||
(obj == cur_conn_target_mod))
{
connP_set_connection(NULL);
}
}
if (connP_conn_is_possible())
set_conn_controls(TRUE);
else
set_conn_controls(FALSE);
}
}
return(iRet);
}
BOOL
connP_conn_is_possible(void)
{
BOOL ConnIsPossible = FALSE;
ABObj source = NULL,
target = NULL;
source = connP_get_source();
target = connP_get_target();
switch (connP_get_action_type())
{
case AB_FUNC_BUILTIN:
if ( (source != NULL) && (target != NULL) )
{
/* If the source object is a message
* but the message doesn't have an
* Action1, Action2, Action3, or a
* Cancel button, then a connection
* cannot be made on that message.
*/
if (obj_is_message(source))
{
if ( obj_has_action1_button(source) ||
obj_has_action2_button(source) ||
obj_has_action3_button(source) ||
obj_has_cancel_button(source)
)
{
ConnIsPossible = TRUE;
}
}
else
{
ConnIsPossible = TRUE;
}
}
break;
case AB_FUNC_USER_DEF:
case AB_FUNC_CODE_FRAG:
if (source != NULL)
{
if (obj_is_message(source))
{
if ( obj_has_action1_button(source) ||
obj_has_action2_button(source) ||
obj_has_action3_button(source) ||
obj_has_cancel_button(source)
)
{
ConnIsPossible = TRUE;
}
}
else
{
ConnIsPossible = TRUE;
}
}
break;
case AB_FUNC_ON_ITEM_HELP:
case AB_FUNC_HELP_VOLUME:
if ((source != NULL) && obj_is_menu_item(source))
{
ConnIsPossible = TRUE;
}
default:
break;
}
return (ConnIsPossible);
}
static void
set_conn_controls(
BOOL state
)
{
XtSetSensitive(connect_button, state);
}
/*
** validate a builtin connection's AB_ARG_STRING
**
** called from connP_make_connection()
*/
static BOOL
verify_builtin_arg_string(
AB_BUILTIN_ACTION c_act,
ABObj c_target,
Widget field
)
{
BOOL rval = False;
if (!c_act || !c_target || !field ||
(connP_get_action_type() != AB_FUNC_BUILTIN) ||
(connP_action_needs_arg(c_act) != AB_ARG_STRING))
{
return False;
}
switch (c_act)
{
case AB_STDACT_DISABLE:
case AB_STDACT_ENABLE:
case AB_STDACT_HIDE:
rval = True;
break;
case AB_STDACT_SET_LABEL:
/*
** cmvc 7896: set-label conn doesn't work on graphic
*/
switch (obj_get_label_type(c_target))
{
case AB_LABEL_GLYPH:
/* validate graphic filename */
if (prop_graphic_filename_ok(field, False))
rval = True;
break;
case AB_LABEL_ARROW_DOWN: /* are these really valid? */
case AB_LABEL_ARROW_LEFT:
case AB_LABEL_ARROW_RIGHT:
case AB_LABEL_ARROW_UP:
case AB_LABEL_DRAWN:
case AB_LABEL_SEPARATOR:
rval = True;
break;
case AB_LABEL_STRING:
rval = True;
break;
case AB_LABEL_UNDEF:
case AB_LABEL_TYPE_NUM_VALUES:
default:
break;
}
break;
case AB_STDACT_SET_TEXT:
case AB_STDACT_SET_VALUE:
case AB_STDACT_SHOW:
rval = True;
break;
case AB_STDACT_UNDEF:
case AB_BUILTIN_ACTION_NUM_VALUES:
default:
rval = False;
break;
}
return rval;
}
/*** DTB_USER_CODE_END
***
*** End of user code section
***
**************************************************************************/
void
conn_cancelCB(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
DtbConnConnDialogInfo dtbSource = (DtbConnConnDialogInfo)clientData;
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
/* If secondary Execute code dialog is open, close it also
* to ensure correct window state tracking
*/
if (exec_code_dialog && ab_window_is_open(exec_code_dialog))
ui_win_show(exec_code_dialog, False, XtGrabNone);
ui_win_show(AB_conn_dialog, False, XtGrabNone);
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_make_connection(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
char *str_value = (char *)NULL;
ABObj ab_action = (ABObj)NULL;
ABObj c_source;
ABObj c_target;
AB_WHEN c_when;
BOOL is_cross_module = (BOOL)FALSE;
STRING vol_value = NULL,
loc_value = NULL;
BOOL valid = False;
if ((c_source = connP_get_source()) == NULL ||
connP_get_source_type() != obj_get_type(c_source))
return;
c_when = (AB_WHEN)get_cur_when();
switch (connP_get_action_type())
{
case AB_FUNC_BUILTIN:
if ((c_target = connP_get_target()) != NULL &&
connP_get_target_type() == obj_get_type(c_target))
{
AB_BUILTIN_ACTION c_act = (AB_BUILTIN_ACTION)get_cur_act();
ab_action = obj_create(AB_TYPE_ACTION, NULL);
switch (connP_action_needs_arg(c_act))
{
case AB_ARG_UNDEF:
break;
case AB_ARG_STRING:
if (!verify_builtin_arg_string(c_act, c_target, arg_field))
return;
XtVaGetValues(arg_field, XmNvalue, &str_value, NULL);
if (str_value != (char *)NULL)
connP_set_conn_arg(ab_action, AB_ARG_STRING, str_value);
break;
case AB_ARG_INT:
if (!prop_number_ok(arg_field, "Argument Field",
obj_get_min_value(c_target),
obj_get_max_value(c_target)))
{
return;
}
XtVaGetValues(arg_field, XmNvalue, &str_value, NULL);
if (str_value != (char *)NULL)
connP_set_conn_arg(ab_action, AB_ARG_INT, str_value);
break;
default:
break;
}
connP_make_builtin_conn(ab_action, c_source, c_target, c_when,
c_act);
/* Set SaveNeeded flag */
if (obj_get_module(c_source) == obj_get_module(c_target))
{
abobj_set_save_needed(obj_get_module(c_source), TRUE);
}
else
{
abobj_set_save_needed(obj_get_project(c_source), TRUE);
is_cross_module = TRUE;
}
}
break;
case AB_FUNC_USER_DEF:
/*
* Populate function name
*/
XtVaGetValues(arg_field, XmNvalue, &str_value, NULL);
if (!util_strempty(str_value))
{
ab_action = obj_create(AB_TYPE_ACTION, NULL);
connP_make_user_def_conn(ab_action, c_source, c_when, str_value);
/* Set SaveNeeded flag */
abobj_set_save_needed(obj_is_project(c_source)? c_source :
obj_get_module(c_source), TRUE);
}
else
{
dtb_conn_no_func_msg_initialize(&dtb_conn_no_func_msg);
(void)dtb_show_modal_message(dtb_get_toplevel_widget(),
&dtb_conn_no_func_msg, NULL, NULL, NULL);
}
break;
case AB_FUNC_CODE_FRAG:
/*
* Populate code fragment
*/
str_value = CodeFragBuf;
if (!util_strempty(str_value))
{
ab_action = obj_create(AB_TYPE_ACTION, NULL);
connP_make_code_frag_conn(ab_action, c_source, c_when, str_value);
/* Set SaveNeeded flag */
abobj_set_save_needed(obj_is_project(c_source)? c_source :
obj_get_module(c_source), TRUE);
}
break;
case AB_FUNC_ON_ITEM_HELP:
ab_action = obj_create(AB_TYPE_ACTION, NULL);
connP_make_on_item_help_conn(ab_action, c_source, c_when);
/* Set SaveNeeded flag */
abobj_set_save_needed(obj_get_module(c_source), TRUE);
break;
case AB_FUNC_HELP_VOLUME:
XtVaGetValues(volume_field, XmNvalue, &vol_value, NULL);
XtVaGetValues(location_field, XmNvalue, &loc_value, NULL);
ab_action = obj_create(AB_TYPE_ACTION, NULL);
connP_make_help_vol_conn(ab_action, c_source,
c_when, vol_value, loc_value);
/* Set SaveNeeded flag */
abobj_set_save_needed(obj_get_module(c_source), TRUE);
break;
}
if (ab_action != (ABObj)NULL)
{
if (is_cross_module)
{
obj_add_action(obj_get_project(c_source), ab_action);
}
else
{
obj_add_action(obj_is_project(c_source)? c_source :
obj_get_module(c_source), ab_action);
}
connP_set_connection(ab_action);
/*
* cmvc 4359 - make View: be Source Object, if it is not already or
* if the View: is not the Source: connection being made.
*/
if (!((ConnP_view_filter == -1) ||
(ConnP_view_filter == connP_get_obj_type_index(connP_get_source_type(), connP_get_source_subtype())))
)
{
ConnP_view_filter = -1;
XtVaSetValues(view_menu,
XmNmenuHistory, ConnP_view_source_obj,
NULL);
}
populate_connection_list(connP_get_connection());
}
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_change_connection(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
ABObj ab_action;
AB_WHEN c_when;
AB_BUILTIN_ACTION c_act;
ABObj c_source;
ABObj c_target;
BOOL is_changed;
AB_FUNC_TYPE cur_func_type;
char *str_value = (char *)NULL;
STRING loc_value = (STRING) NULL,
vol_value = (STRING) NULL;
ISTRING istr_value = (ISTRING)NULL,
istr_loc_value = (ISTRING)NULL,
istr_vol_value = (ISTRING)NULL;
if ((ab_action = get_cur_connection()) == NULL)
return;
if ((c_source = connP_get_source()) == NULL)
return;
if (connP_get_source_type() != obj_get_type(c_source))
return;
c_when = (AB_WHEN)get_cur_when();
/*
* Match contents of selected action with
* current selections on the connections manager.
*/
is_changed = FALSE;
cur_func_type = connP_get_action_type();
switch (cur_func_type)
{
/**************************************************
* Switching the action (function) type to *
* Predefined Action. *
**************************************************/
case AB_FUNC_BUILTIN:
c_act = get_cur_act();
if ((c_target = connP_get_target()) == NULL ||
connP_get_target_type() != obj_get_type(c_target))
return;
switch (ab_action->info.action.func_type)
{
/* Switching func type from predefined action
* to predefined action.
*/
case AB_FUNC_BUILTIN:
if (connP_action_needs_arg(c_act) == AB_ARG_INT)
{
if (!prop_number_ok(arg_field, "Argument Field",
obj_get_min_value(c_target),
obj_get_max_value(c_target)))
{
return;
}
}
str_value = XmTextFieldGetString(arg_field);
is_changed = connP_change_in_builtin(ab_action,
c_source, c_target, c_when,
get_cur_act(), str_value);
if (!util_strempty(str_value))
XtFree(str_value);
break;
/* Switching func type from call-function to
* predefined action.
*/
case AB_FUNC_USER_DEF:
is_changed = TRUE;
if (ab_action->info.action.func_value.func_name != (ISTRING)NULL)
istr_destroy(ab_action->info.action.func_value.func_name);
connP_make_builtin_conn(ab_action, c_source, c_target,
c_when, c_act);
break;
/* Switching func type from execute-code to
* predefined action.
*/
case AB_FUNC_CODE_FRAG:
is_changed = TRUE;
XmTextFieldSetString(arg_field, "");
XmTextSetString(exec_code_textpane, "");
if (ab_action->info.action.func_value.code_frag != (ISTRING)NULL)
istr_destroy(ab_action->info.action.func_value.code_frag);
connP_make_builtin_conn(ab_action, c_source, c_target,
c_when, c_act);
break;
/* Switching func type from activate-on-item-help to
* predefined action.
*/
case AB_FUNC_ON_ITEM_HELP:
is_changed = TRUE;
connP_make_builtin_conn(ab_action, c_source, c_target,
c_when, c_act);
break;
/* Switching func type from access-help-volume to
* predefined action.
*/
case AB_FUNC_HELP_VOLUME:
is_changed = TRUE;
if (ab_action->info.action.location != (ISTRING)NULL)
istr_destroy(ab_action->info.action.location);
if (ab_action->info.action.volume_id != (ISTRING)NULL)
istr_destroy(ab_action->info.action.volume_id);
connP_make_builtin_conn(ab_action, c_source, c_target,
c_when, c_act);
XmTextFieldSetString(location_field, "");
XmTextFieldSetString(volume_field, "");
break;
}
if (is_changed == TRUE)
{
if (obj_get_module(c_source) == obj_get_module(c_target))
{
abobj_set_save_needed(obj_is_project(c_source)?
c_source : obj_get_module(c_source), TRUE);
}
else /* This is a cross-module connection */
{
abobj_set_save_needed(obj_is_project(c_source)?
c_source : obj_get_module(c_source), TRUE);
}
}
break;
/**************************************************
* Switching the action (function) type to *
* Call-Function . *
**************************************************/
case AB_FUNC_USER_DEF:
str_value = XmTextFieldGetString(arg_field);
if (str_value == (char *)NULL)
return;
switch (ab_action->info.action.func_type)
{
/* Switching func type from call-function to
* call-function.
*/
case AB_FUNC_USER_DEF:
istr_value = istr_create(str_value);
if (ab_action->info.action.func_value.func_name != istr_value)
{
is_changed = TRUE;
istr_destroy(ab_action->info.action.func_value.func_name);
}
if (c_when != obj_get_when(ab_action))
is_changed = TRUE;
if (is_changed)
{
connP_make_user_def_conn(ab_action, c_source, c_when, str_value);
abobj_set_save_needed(obj_is_project(c_source)?
c_source : obj_get_module(c_source), TRUE);
}
break;
/* Switching func type from Predefined-action to
* Call-Function.
*/
case AB_FUNC_BUILTIN:
connP_builtin_remove_arg(ab_action);
is_changed = TRUE;
connP_make_user_def_conn(ab_action, c_source, c_when, str_value);
abobj_set_save_needed(obj_is_project(c_source)? c_source :
obj_get_module(c_source), TRUE);
break;
/* Switching func type from Execute-code to
* Call-Function.
*/
case AB_FUNC_CODE_FRAG:
is_changed = TRUE;
XmTextFieldSetString(arg_field, "");
XmTextSetString(exec_code_textpane, "");
if (ab_action->info.action.func_value.code_frag != (ISTRING)NULL)
istr_destroy(ab_action->info.action.func_value.code_frag);
connP_make_user_def_conn(ab_action, c_source, c_when, str_value);
abobj_set_save_needed(obj_is_project(c_source)? c_source :
obj_get_module(c_source), TRUE);
break;
/* Switching func type from activate-on-item-help to
* call-function.
*/
case AB_FUNC_ON_ITEM_HELP:
is_changed = TRUE;
connP_make_user_def_conn(ab_action, c_source, c_when, str_value);
abobj_set_save_needed(obj_is_project(c_source)?
c_source : obj_get_module(c_source), TRUE);
break;
/* Switching func type from access-help-volume to
* call-function.
*/
case AB_FUNC_HELP_VOLUME:
is_changed = TRUE;
if (ab_action->info.action.location != (ISTRING) NULL)
istr_destroy(ab_action->info.action.location);
if (ab_action->info.action.volume_id != (ISTRING) NULL)
istr_destroy(ab_action->info.action.volume_id);
connP_make_user_def_conn(ab_action, c_source, c_when, str_value);
abobj_set_save_needed(obj_is_project(c_source)?
c_source : obj_get_module(c_source), TRUE);
XmTextFieldSetString(location_field, "");
XmTextFieldSetString(volume_field, "");
break;
}
XtFree(str_value);
break;
/**************************************************
* Switching the action (function) type to *
* Execute-Code. *
**************************************************/
case AB_FUNC_CODE_FRAG:
str_value = CodeFragBuf;
if (str_value == (STRING) NULL)
return;
switch (ab_action->info.action.func_type)
{
/* Switching func type from Predefined Action to
* Execute Code.
*/
case AB_FUNC_BUILTIN:
connP_builtin_remove_arg(ab_action);
is_changed = TRUE;
connP_make_code_frag_conn(ab_action, c_source, c_when, str_value);
abobj_set_save_needed(obj_is_project(c_source)? c_source :
obj_get_module(c_source), TRUE);
break;
/* Switching func type from Call-Function to
* Execute Code.
*/
case AB_FUNC_USER_DEF:
if (ab_action->info.action.func_value.func_name != (ISTRING)NULL)
istr_destroy(ab_action->info.action.func_value.func_name);
is_changed = TRUE;
connP_make_code_frag_conn(ab_action, c_source, c_when, str_value);
abobj_set_save_needed(obj_is_project(c_source)? c_source :
obj_get_module(c_source), TRUE);
break;
/* Switching func type from Execute Code to
* Execute Code.
*/
case AB_FUNC_CODE_FRAG:
istr_value = istr_create(str_value);
if (ab_action->info.action.func_value.code_frag != istr_value)
{
is_changed = TRUE;
istr_destroy(ab_action->info.action.func_value.code_frag);
}
if (c_when != obj_get_when(ab_action))
is_changed = TRUE;
if (is_changed)
{
connP_make_code_frag_conn(ab_action, c_source, c_when, str_value);
abobj_set_save_needed(obj_is_project(c_source)?
c_source : obj_get_module(c_source), TRUE);
}
break;
/* Switching func type from activate-on-item-help to
* Execute Code.
*/
case AB_FUNC_ON_ITEM_HELP:
is_changed = TRUE;
connP_make_code_frag_conn(ab_action, c_source, c_when, str_value);
abobj_set_save_needed(obj_is_project(c_source)?
c_source : obj_get_module(c_source), TRUE);
break;
/* Switching func type from access-help-volume to
* Execute Code.
*/
case AB_FUNC_HELP_VOLUME:
is_changed = TRUE;
if (ab_action->info.action.location != (ISTRING)NULL)
istr_destroy(ab_action->info.action.location);
if (ab_action->info.action.volume_id != (ISTRING)NULL)
istr_destroy(ab_action->info.action.volume_id);
connP_make_code_frag_conn(ab_action, c_source, c_when, str_value);
abobj_set_save_needed(obj_is_project(c_source)?
c_source : obj_get_module(c_source), TRUE);
XmTextFieldSetString(location_field, "");
XmTextFieldSetString(volume_field, "");
break;
}
XtFree(str_value);
break;
/**************************************************
* Switching the action (function) type to *
* 'Activate On-Item Help'. *
**************************************************/
case AB_FUNC_ON_ITEM_HELP:
switch (ab_action->info.action.func_type)
{
/* Switching func type from activate-on-item-help
* to activate-on-item-help.
*/
case AB_FUNC_ON_ITEM_HELP:
if (c_when != obj_get_when(ab_action))
{
is_changed = TRUE;
connP_make_on_item_help_conn(ab_action, c_source, c_when);
abobj_set_save_needed(obj_is_project(c_source)?
c_source : obj_get_module(c_source), TRUE);
}
break;
/* Switching func type from call-function to
* activate-on-item-help.
*/
case AB_FUNC_USER_DEF:
is_changed = TRUE;
if (ab_action->info.action.func_value.func_name != (ISTRING) NULL)
istr_destroy(ab_action->info.action.func_value.func_name);
connP_make_on_item_help_conn(ab_action, c_source, c_when);
abobj_set_save_needed(obj_is_project(c_source)? c_source :
obj_get_module(c_source), TRUE);
XmTextFieldSetString(arg_field, "");
break;
/* Switching func type from predefined-action to
* activate-on-item-help.
*/
case AB_FUNC_BUILTIN:
is_changed = TRUE;
connP_builtin_remove_arg(ab_action);
connP_make_on_item_help_conn(ab_action, c_source, c_when);
abobj_set_save_needed(obj_is_project(c_source)?
c_source : obj_get_module(c_source), TRUE);
XmTextFieldSetString(arg_field, "");
break;
/* Switching func type from execute-code to
* activate-on-item-help.
*/
case AB_FUNC_CODE_FRAG:
is_changed = TRUE;
if (ab_action->info.action.func_value.code_frag != (ISTRING)NULL)
istr_destroy(ab_action->info.action.func_value.code_frag);
connP_make_on_item_help_conn(ab_action, c_source, c_when);
abobj_set_save_needed(obj_is_project(c_source)?
c_source : obj_get_module(c_source), TRUE);
XmTextFieldSetString(arg_field, "");
XmTextSetString(exec_code_textpane, "");
break;
/* Switching func type from access-help-volume to
* activate-on-item-help.
*/
case AB_FUNC_HELP_VOLUME:
is_changed = TRUE;
if (ab_action->info.action.location != (ISTRING) NULL)
istr_destroy(ab_action->info.action.location);
if (ab_action->info.action.volume_id != (ISTRING) NULL)
istr_destroy(ab_action->info.action.volume_id);
connP_make_on_item_help_conn(ab_action, c_source, c_when);
abobj_set_save_needed(obj_is_project(c_source)?
c_source : obj_get_module(c_source), TRUE);
XmTextFieldSetString(location_field, "");
XmTextFieldSetString(volume_field, "");
break;
}
break;
/**************************************************
* Switching the action (function) type to *
* 'Access Help Volume'. *
**************************************************/
case AB_FUNC_HELP_VOLUME:
loc_value = XmTextFieldGetString(location_field);
vol_value = XmTextFieldGetString(volume_field);
if (loc_value == (STRING)NULL || (vol_value == (STRING)NULL))
return;
switch (ab_action->info.action.func_type)
{
/* Switching func type from call-function to
* access-help-volume.
*/
case AB_FUNC_USER_DEF:
is_changed = TRUE;
if (ab_action->info.action.func_value.func_name != (ISTRING) NULL)
istr_destroy(ab_action->info.action.func_value.func_name);
connP_make_help_vol_conn(ab_action, c_source, c_when,
vol_value, loc_value);
abobj_set_save_needed(obj_is_project(c_source)?
c_source : obj_get_module(c_source), TRUE);
XmTextFieldSetString(arg_field, "");
break;
/* Switching func type from predefined-action to
* access-help-volume.
*/
case AB_FUNC_BUILTIN:
is_changed = TRUE;
connP_builtin_remove_arg(ab_action);
connP_make_help_vol_conn(ab_action, c_source, c_when,
vol_value, loc_value);
abobj_set_save_needed(obj_is_project(c_source)?
c_source : obj_get_module(c_source), TRUE);
XmTextFieldSetString(arg_field, "");
break;
/* Switching func type from execute-code to
* access-help-volume.
*/
case AB_FUNC_CODE_FRAG:
is_changed = TRUE;
if (ab_action->info.action.func_value.code_frag != (ISTRING)NULL)
istr_destroy(ab_action->info.action.func_value.code_frag);
connP_make_help_vol_conn(ab_action, c_source, c_when,
vol_value, loc_value);
abobj_set_save_needed(obj_is_project(c_source)?
c_source : obj_get_module(c_source), TRUE);
XmTextFieldSetString(arg_field, "");
XmTextSetString(exec_code_textpane, "");
break;
/* Switching func type from access-help-volume to
* access-help-volume.
*/
case AB_FUNC_HELP_VOLUME:
istr_loc_value = istr_create(loc_value);
istr_vol_value = istr_create(vol_value);
if (ab_action->info.action.location != istr_loc_value)
{
is_changed = TRUE;
istr_destroy(ab_action->info.action.location);
}
if (ab_action->info.action.volume_id != istr_vol_value)
{
is_changed = TRUE;
istr_destroy(ab_action->info.action.volume_id);
}
if (c_when != obj_get_when(ab_action))
is_changed = TRUE;
if (is_changed)
{
connP_make_help_vol_conn(ab_action, c_source, c_when,
vol_value, loc_value);
abobj_set_save_needed(obj_is_project(c_source)?
c_source : obj_get_module(c_source), TRUE);
}
break;
}
XtFree(loc_value);
XtFree(vol_value);
break;
}
if (is_changed == TRUE)
{
connP_set_connection(ab_action);
populate_connection_list(connP_get_connection());
}
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_delete_connection(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
ABObj ab_action;
ABObj source, target;
if ((ab_action = get_cur_connection()) == NULL)
return;
source = ab_action->info.action.from;
target = ab_action->info.action.to;
/* Set the SaveNeededFlag on the module, if it is an
* intra-module connection. Otherwise set it on the
* project, since it is a cross-module connection which
* is stored in the .bip file.
*/
if ( obj_get_module(source) == obj_get_module(target) )
{
abobj_set_save_needed(obj_is_project(source)? source :
obj_get_module(source), TRUE);
}
else /* This is a cross-module connection */
{
abobj_set_save_needed(obj_is_project(source)? source :
obj_get_module(source), TRUE);
}
obj_destroy(ab_action);
connP_set_connection(NULL);
populate_connection_list(connP_get_connection());
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_register_connect_button(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
DtbConnConnDialogInfo dtbSource = (DtbConnConnDialogInfo)callData;
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
/* Make Connect button initially inactive */
XtSetSensitive(dtbSource->connect_button, FALSE);
connect_button = dtbSource->connect_button;
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_register_change_button(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
DtbConnConnDialogInfo dtbSource = (DtbConnConnDialogInfo)callData;
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
/* Make Change button initially inactive */
XtSetSensitive(dtbSource->change_button, FALSE);
change_button = dtbSource->change_button;
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_register_cancel_button(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
DtbConnConnDialogInfo dtbSource = (DtbConnConnDialogInfo)callData;
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
cancel_button = dtbSource->cancel_button;
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_register_delete_button(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
DtbConnConnDialogInfo dtbSource = (DtbConnConnDialogInfo)callData;
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
/* Make Delete button initially inactive */
XtSetSensitive(dtbSource->delete_button, FALSE);
delete_button = dtbSource->delete_button;
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_register_source_choices(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
DtbConnConnDialogInfo dtbSource = (DtbConnConnDialogInfo)callData;
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
/*
* jit - Workaround for dtcodegen bug:
* does not set XmNsubMenuId if Option Menu has 0 items
*/
XtVaSetValues(widget, XmNsubMenuId, dtbSource->source_choices_menu, NULL);
src_menu = dtbSource->source_choices;
populate_src_menu(dtbSource->source_choices_menu, NULL, NULL);
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_register_target_choices(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
DtbConnConnDialogInfo dtbSource = (DtbConnConnDialogInfo)callData;
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
/*
* jit - Workaround for dtcodegen bug:
* does not set XmNsubMenuId if Option Menu has 0 items
*/
XtVaSetValues(widget, XmNsubMenuId, dtbSource->target_choices_menu, NULL);
target_menu = dtbSource->target_choices;
populate_target_menu(dtbSource->target_choices_menu, NULL, NULL);
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_register_when_choices(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
DtbConnConnDialogInfo dtbSource = (DtbConnConnDialogInfo)callData;
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
/*
* jit - Workaround for dtcodegen bug:
* does not set XmNsubMenuId if Option Menu has 0 items
*/
XtVaSetValues(widget, XmNsubMenuId, dtbSource->when_choices_menu, NULL);
when_menu = dtbSource->when_choices;
populate_when_menu(dtbSource->when_choices_menu, NULL, NULL);
XtAddCallback(XtParent(dtbSource->when_choices_menu),
XmNpopupCallback, connP_update_when_menu,
(XtPointer) NULL);
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_register_predef_act_choices(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
DtbConnConnDialogInfo dtbSource = (DtbConnConnDialogInfo)callData;
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
/*
* jit - Workaround for dtcodegen bug:
* does not set XmNsubMenuId if Option Menu has 0 items
*/
XtVaSetValues(widget, XmNsubMenuId, dtbSource->predef_act_choices_menu, NULL)
;
action_menu = dtbSource->predef_act_choices;
populate_action_menu(dtbSource->predef_act_choices_menu, NULL, NULL);
XtAddCallback(XtParent(dtbSource->predef_act_choices_menu),
XmNpopupCallback, connP_update_action_menu,
(XtPointer) NULL);
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_register_view_choices(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
DtbConnConnDialogInfo dtbSource = (DtbConnConnDialogInfo)callData;
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
/*
* jit - Workaround for dtcodegen bug:
* does not set XmNsubMenuId if Option Menu has 0 items
*/
XtVaSetValues(widget, XmNsubMenuId, dtbSource->view_choices_menu, NULL);
view_menu = dtbSource->view_choices;
populate_view_menu(dtbSource->view_choices_menu, NULL, NULL);
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_register_source_list(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
DtbConnConnDialogInfo dtbSource = (DtbConnConnDialogInfo)callData;
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
src_list = dtbSource->source_list;
XtAddCallback(dtbSource->source_list, XmNbrowseSelectionCallback,
update_cur_src, NULL);
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_register_target_list(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
DtbConnConnDialogInfo dtbSource = (DtbConnConnDialogInfo)callData;
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
target_list = dtbSource->target_list;
XtAddCallback(dtbSource->target_list, XmNbrowseSelectionCallback,
update_cur_target, NULL);
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_register_conn_list(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
DtbConnConnDialogInfo dtbSource = (DtbConnConnDialogInfo)callData;
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
connection_list = dtbSource->conn_list;
XtAddCallback(dtbSource->conn_list, XmNbrowseSelectionCallback,
select_connection, NULL);
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_register_arg_field(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
DtbConnConnDialogInfo dtbSource = (DtbConnConnDialogInfo)callData;
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
arg_rowcol = dtbSource->arg_field_rowcolumn;
arg_label = dtbSource->arg_field_label;
arg_field = dtbSource->arg_field;
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_register_action_Predefined_item(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
DtbConnConnDialogInfo dtbSource = (DtbConnConnDialogInfo)callData;
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
std_action_item = dtbSource->action_type_choices_items.Predefined_item;
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_register_action_Call_Function_item(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
DtbConnConnDialogInfo dtbSource = (DtbConnConnDialogInfo)callData;
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
call_function_item =
dtbSource->action_type_choices_items.Call_Function_item;
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_register_action_Execute_Code_item(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
DtbConnConnDialogInfo dtbSource = (DtbConnConnDialogInfo)callData;
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
execute_code_item =
dtbSource->action_type_choices_items.Execute_Code_item;
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_show_execute_code(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
DtbConnExecCodeDialogInfo dtbSource = &dtb_conn_exec_code_dialog;
if (!(dtbSource->initialized))
{
dtb_conn_exec_code_dialog_initialize(dtbSource, dtb_palette_ab_palette_main.ab_palette_main);
init_exec_code_dialog(dtbSource);
}
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
set_execute_code_action_type();
ab_show_window(exec_code_dialog);
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_register_action_on_item_help_item(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
DtbConnConnDialogInfo dtbSource = (DtbConnConnDialogInfo)callData;
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
on_item_help_item = widget;
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_register_action_help_vol_item(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
DtbConnConnDialogInfo dtbSource = (DtbConnConnDialogInfo)callData;
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
help_volume_item = widget;
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_register_loc_textf(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
DtbConnConnDialogInfo dtbSource = (DtbConnConnDialogInfo)callData;
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
location_rowcol = dtbSource->loc_textf_rowcolumn;
location_field = dtbSource->loc_textf;
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_register_vol_textf(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
DtbConnConnDialogInfo dtbSource = (DtbConnConnDialogInfo)callData;
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
volume_rowcol = dtbSource->vol_textf_rowcolumn;
volume_field = dtbSource->vol_textf;
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_register_action_type_opmenu(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
DtbConnConnDialogInfo dtbSource = (DtbConnConnDialogInfo)callData;
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
XmString xmstr = NULL;
STRING label = NULL;
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
action_type_opmenu = widget;
XtVaGetValues(std_action_item, XmNlabelString, &xmstr, NULL);
action_type_labels[ACTION_TYPE_PREDEFINED] = objxm_xmstr_to_str(xmstr);
xmstr = NULL;
XtVaGetValues(call_function_item, XmNlabelString, &xmstr, NULL);
action_type_labels[ACTION_TYPE_CALLFUNC] = objxm_xmstr_to_str(xmstr);
xmstr = NULL;
XtVaGetValues(execute_code_item, XmNlabelString, &xmstr, NULL);
action_type_labels[ACTION_TYPE_EXECUTE_CODE] = objxm_xmstr_to_str(xmstr);
xmstr = NULL;
XtVaGetValues(on_item_help_item, XmNlabelString, &xmstr, NULL);
action_type_labels[ACTION_TYPE_ON_ITEM_HELP] = objxm_xmstr_to_str(xmstr);
xmstr = NULL;
XtVaGetValues(help_volume_item, XmNlabelString, &xmstr, NULL);
action_type_labels[ACTION_TYPE_HELP_VOLUME] = objxm_xmstr_to_str(xmstr);
xmstr = NULL;
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_enable_std_actions(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
set_standard_action_type();
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_enable_call_function(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
set_call_function_action_type();
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_enable_on_item_help(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
set_on_item_help_action_type();
if (connP_conn_is_possible())
set_conn_controls(TRUE);
else
set_conn_controls(FALSE);
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_enable_access_help_vol(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
set_access_help_vol_action_type();
if (connP_conn_is_possible())
set_conn_controls(TRUE);
else
set_conn_controls(FALSE);
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_exec_code_okCB(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
STRING code_frag = NULL;
STRING first_line = NULL;
char *newline = NULL;
DtbConnExecCodeDialogInfo dtbSource =
(DtbConnExecCodeDialogInfo) clientData;
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
code_frag = XmTextGetString(exec_code_textpane);
if (!util_strempty(code_frag))
{
if (CodeFragBuf)
util_free(CodeFragBuf);
CodeFragBuf = strdup(code_frag);
newline = strchr(code_frag, '\n');
if (newline)
{
*newline = '\0';
}
first_line = (STRING)util_malloc(strlen(code_frag) + 4);
if (first_line)
{
strcpy(first_line, code_frag);
strcat(first_line, "...");
XmTextFieldSetString(arg_field, first_line);
util_free(first_line);
}
}
else
{
if (CodeFragBuf)
util_free(CodeFragBuf);
if (code_frag)
CodeFragBuf = strdup(code_frag);
else
CodeFragBuf = NULL;
XmTextFieldSetString(arg_field, "");
}
XtFree(code_frag);
ui_win_show(exec_code_dialog, False, XtGrabNone);
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_exec_code_applyCB(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
STRING code_frag = NULL;
STRING first_line = NULL;
char *newline = NULL;
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
code_frag = XmTextGetString(exec_code_textpane);
if (!util_strempty(code_frag))
{
if (CodeFragBuf)
util_free(CodeFragBuf);
CodeFragBuf = strdup(code_frag);
newline = strchr(code_frag, '\n');
if (newline)
{
*newline = '\0';
}
first_line = (STRING)util_malloc(strlen(code_frag) + 4);
if (first_line)
{
strcpy(first_line, code_frag);
strcat(first_line, "...");
XmTextFieldSetString(arg_field, first_line);
util_free(first_line);
}
}
else
{
if (CodeFragBuf)
util_free(CodeFragBuf);
if (code_frag)
CodeFragBuf = strdup(code_frag);
else
CodeFragBuf = NULL;
XmTextFieldSetString(arg_field, "");
}
XtFree(code_frag);
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
exec_code_cancelCB(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
DtbConnExecCodeDialogInfo dtbSource = (DtbConnExecCodeDialogInfo)clientData;
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
ui_win_show(exec_code_dialog, False, XtGrabNone);
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
void
connP_clear_exec_dlg(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
/*** DTB_USER_CODE_START vvv Add C variables and code below vvv ***/
/*** DTB_USER_CODE_END ^^^ Add C variables and code above ^^^ ***/
/*** DTB_USER_CODE_START vvv Add C code below vvv ***/
XmTextSetString(exec_code_textpane, "");
/*** DTB_USER_CODE_END ^^^ Add C code above ^^^ ***/
}
/**************************************************************************
*** DTB_USER_CODE_START
***
*** All automatically-generated data and functions have been defined.
***
*** Add new functions here, or at the top of the file.
***/
/*
** This function checks to see if a show-help connection can be allowed
** between any source/target object pair. The rule it implements is that
** the source object must be a push or drawn button that is a child of the
** target dialog;
*/
BOOL
allow_show_help_connection(
ABObj src_obj,
ABObj target_obj
)
{
AB_OBJECT_TYPE src_type;
AB_OBJECT_TYPE target_type;
int src_subtype;
if( (src_obj == (ABObj)NULL) || (target_obj == (ABObj)NULL)) return(FALSE);
src_type = obj_get_type(src_obj);
target_type = obj_get_type(target_obj);
src_subtype = obj_get_subtype(src_obj);
if( (target_type == AB_TYPE_DIALOG) &&
(src_type == AB_TYPE_BUTTON) &&
((src_subtype == AB_BUT_PUSH) || (src_subtype == AB_BUT_DRAWN) ) &&
(obj_get_parent_of_type(src_obj,AB_TYPE_DIALOG) == target_obj) ) {
return(TRUE);
}
else return(FALSE);
}
static void
hide_execute_code_win(void)
{
DtbConnExecCodeDialogInfo instance = &dtb_conn_exec_code_dialog;
if (!(instance->initialized))
{
dtb_conn_exec_code_dialog_initialize(instance, dtb_palette_ab_palette_main.ab_palette_main);
init_exec_code_dialog(instance);
}
ui_win_show(exec_code_dialog, False, XtGrabNone);
}
/* This function is the popupCallback for the "When" optionmenu.
* It makes certain "whens" active or inactive depending upon
* the object type and the specific object selected in the list.
*/
void
connP_update_when_menu(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
ABObj cur_obj = connP_get_source();
Widget *w_list = NULL;
XtVaGetValues(when_pulldown, XmNuserData, &w_list, NULL);
if (w_list == NULL)
{
return;
}
switch (connP_get_source_type())
{
/* If the current source object type is Choice Item,
* then we have to check if the currently selected
* object is a radiobox/checkbox item or if it is an
* optionmenu item. If it is a radiobox/checkbox item
* then "Toggled" should become active and "Activated"
* should become inactive - vice versa if currently
* selected object is an optionmenu item.
*/
case AB_TYPE_ITEM:
if (obj_is_choice_item(cur_obj))
{
if (obj_is_option_menu(obj_get_root(obj_get_parent(cur_obj))))
{
XtSetSensitive(w_list[ConnP_conn_whens[2].when_type-1], True);
XtSetSensitive(w_list[ConnP_conn_whens[3].when_type-1], False);
}
else
{
XtSetSensitive(w_list[ConnP_conn_whens[2].when_type-1], False);
XtSetSensitive(w_list[ConnP_conn_whens[3].when_type-1], True);
}
}
break;
case AB_TYPE_MESSAGE:
if (cur_obj != NULL)
{
if (!obj_has_action1_button(cur_obj))
XtSetSensitive(w_list[ConnP_conn_whens[0].when_type-1],
False);
else
XtSetSensitive(w_list[ConnP_conn_whens[0].when_type-1],
True);
if (!obj_has_action2_button(cur_obj))
XtSetSensitive(w_list[ConnP_conn_whens[1].when_type-1],
False);
else
XtSetSensitive(w_list[ConnP_conn_whens[1].when_type-1],
True);
if (!obj_has_action3_button(cur_obj))
XtSetSensitive(w_list[ConnP_conn_whens[2].when_type-1],
False);
else
XtSetSensitive(w_list[ConnP_conn_whens[2].when_type-1],
True);
if (!obj_has_cancel_button(cur_obj))
XtSetSensitive(w_list[ConnP_conn_whens[3].when_type-1],
False);
else
XtSetSensitive(w_list[ConnP_conn_whens[3].when_type-1],
True);
}
break;
default:
break;
}
}
/* This function is the popupCallback for the "Action Type"
* optionmenu.
*/
void
connP_update_action_menu(
Widget widget,
XtPointer clientData,
XtPointer callData
)
{
ABObj src_obj = connP_get_source();
ABObj target_obj = connP_get_target();
AB_OBJECT_TYPE target_type = connP_get_target_type();
Widget *w_list = NULL;
XtVaGetValues(action_pulldown, XmNuserData, &w_list, NULL);
if (w_list == NULL)
return;
switch (target_type)
{
/* If any target object of these types don't have
* a label, then set "Set Label" action inactive.
*/
case AB_TYPE_CHOICE:
case AB_TYPE_COMBO_BOX:
case AB_TYPE_LIST:
case AB_TYPE_SPIN_BOX:
case AB_TYPE_SCALE:
case AB_TYPE_TEXT_FIELD:
if (!obj_has_label(target_obj))
XtSetSensitive(w_list[AB_STDACT_SET_LABEL-1], False);
else
XtSetSensitive(w_list[AB_STDACT_SET_LABEL-1], True);
default:
break;
}
}
void
conn_override_default_when(
AB_WHEN when
)
{
DefaultWhen = when;
}
void
conn_reset_default_when(void)
{
DefaultWhen = AB_WHEN_UNDEF;
}
void
conn_override_default_action_type(
AB_FUNC_TYPE func_type
)
{
DefaultFuncType = func_type;
}
void
conn_reset_default_action_type(void)
{
DefaultFuncType = AB_FUNC_UNDEF;
}
static void
update_on_src_type_change(
AB_OBJECT_TYPE obj_type,
int obj_subtype
)
{
AB_WHEN g_when = AB_WHEN_UNDEF;
AB_FUNC_TYPE g_func = AB_FUNC_UNDEF;
AB_BUILTIN_ACTION g_act = AB_STDACT_UNDEF;
if (obj_type == (AB_OBJECT_TYPE) NULL)
return;
/* Update the When option menu */
connP_set_source_type(obj_type, obj_subtype);
/* Get the default when and action type */
(void)connP_guess_when_action(obj_type, obj_subtype,
connP_get_target_type(),
connP_get_target_subtype(),
&g_when, &g_func, &g_act);
/* Set the default when */
if (DefaultWhen != AB_WHEN_UNDEF)
g_when = DefaultWhen;
if (g_when != get_cur_when())
set_cur_when(g_when);
/* Set the default Action Type */
if (DefaultFuncType != AB_FUNC_UNDEF)
g_func = DefaultFuncType;
if (g_func == AB_FUNC_USER_DEF)
{
ui_optionmenu_change_label(action_type_opmenu,
action_type_labels[ACTION_TYPE_CALLFUNC]);
set_call_function_action_type();
}
else
{
ui_optionmenu_change_label(action_type_opmenu,
action_type_labels[ACTION_TYPE_PREDEFINED]);
set_standard_action_type();
}
/* Update the Source object list and select the current
* source object (if there is one) in the list.
*/
populate_list(src_list, connP_get_source(), TRUE);
}
static void
update_on_target_type_change(
AB_OBJECT_TYPE obj_type,
int obj_subtype
)
{
AB_WHEN g_when = AB_WHEN_UNDEF;
AB_FUNC_TYPE g_func = AB_FUNC_UNDEF;
AB_BUILTIN_ACTION g_act = AB_STDACT_UNDEF;
if (obj_type == (AB_OBJECT_TYPE) NULL)
return;
/* Update the Action option menu */
connP_set_target_type(obj_type, obj_subtype);
/* Get the default pre-defined action */
(void)connP_guess_when_action(connP_get_source_type(),
connP_get_source_subtype(),
obj_type, obj_subtype,
&g_when, &g_func, &g_act);
if (g_act != get_cur_act())
set_cur_act(g_act);
/* Update the Target object list and select the current
* source object (if there is one) in the list.
*/
populate_list(target_list, connP_get_target(), TRUE);
}
static void
update_conn_ed_controls(void)
{
AB_WHEN g_when = AB_WHEN_UNDEF;
AB_FUNC_TYPE g_func = AB_FUNC_UNDEF;
AB_BUILTIN_ACTION g_act = AB_STDACT_UNDEF;
AB_OBJECT_TYPE source_type = AB_TYPE_UNDEF;
int source_subtype = -1;
AB_OBJECT_TYPE target_type = AB_TYPE_UNDEF;
int target_subtype = -1;
long i = -1, j = -1;
source_type = connP_get_source_type();
source_subtype = connP_get_source_subtype();
i = connP_get_obj_type_index(source_type, source_subtype);
target_type = connP_get_target_type();
target_subtype = connP_get_target_subtype();
j = connP_get_obj_type_index(target_type, target_subtype);
if ((i < 0) || (j < 0)) return;
/* Update the Source option menu */
XtVaSetValues(XmOptionButtonGadget(src_menu),
XtVaTypedArg, XmNlabelString, XtRString,
ConnP_conn_objs[i].label, strlen(ConnP_conn_objs[i].label)+1,
NULL);
update_on_src_type_change(source_type, source_subtype);
/* Update the Target option menu */
XtVaSetValues(XmOptionButtonGadget(target_menu),
XtVaTypedArg, XmNlabelString, XtRString,
ConnP_conn_objs[j].label, strlen(ConnP_conn_objs[j].label)+1,
NULL);
update_on_target_type_change(target_type, target_subtype);
if (connP_conn_is_possible())
set_conn_controls(TRUE);
else
set_conn_controls(FALSE);
}
static AB_FUNC_TYPE
get_cur_func_type(void)
{
Widget label_wid = XmOptionButtonGadget(action_type_opmenu);
XmString xm_act_label = (XmString)NULL;
char *act_label = NULL;
int i;
AB_FUNC_TYPE func_type = AB_FUNC_UNDEF;
XtVaGetValues(label_wid, XmNlabelString, &xm_act_label, NULL);
if (xm_act_label != NULL) {
act_label = objxm_xmstr_to_str(xm_act_label);
for (i = 0; i < ACTION_TYPE_NUM_VALUES; i++) {
if (!strcmp(act_label, action_type_labels[i])) {
break;
}
}
}
switch (i)
{
case ACTION_TYPE_PREDEFINED:
func_type = AB_FUNC_BUILTIN;
break;
case ACTION_TYPE_CALLFUNC:
func_type = AB_FUNC_USER_DEF;
break;
case ACTION_TYPE_EXECUTE_CODE:
func_type = AB_FUNC_CODE_FRAG;
break;
case ACTION_TYPE_ON_ITEM_HELP:
func_type = AB_FUNC_ON_ITEM_HELP;
break;
case ACTION_TYPE_HELP_VOLUME:
func_type = AB_FUNC_HELP_VOLUME;
break;
default:
break;
}
XtFree(act_label);
return(func_type);
}
BOOL
connP_obj_part_of_conn(
ABObj obj,
ABObj conn_obj
)
{
BOOL ret = FALSE;
if (obj && conn_obj)
{
if (obj_get_from(conn_obj) == obj)
ret = TRUE;
else if (obj_get_to(conn_obj) == obj)
ret = TRUE;
}
return ret;
}
static void
set_ctrls_for_src(
BOOL state
)
{
Widget when_opmenu = XmOptionButtonGadget(when_menu);
XtSetSensitive(when_opmenu, state);
}
static void
set_ctrls_for_target(
BOOL state
)
{
Widget act_opmenu = XmOptionButtonGadget(action_menu);
AB_FUNC_TYPE cat = connP_get_action_type();
switch (cat)
{
case AB_FUNC_BUILTIN:
XtSetSensitive(act_opmenu, state);
/* If setting the action option menu active,
* then we have to look at the action to
* determine if the argument field should
* also become active.
*/
if (state)
{
change_arg_sensitivity(arg_field,
(XtPointer) NULL, (XtPointer) NULL);
}
else
{
XtSetSensitive(arg_label, state);
XtSetSensitive(arg_field, state);
}
break;
case AB_FUNC_USER_DEF:
case AB_FUNC_CODE_FRAG:
XtSetSensitive(arg_label, state);
XtSetSensitive(arg_field, state);
break;
default: break;
}
}
/*** DTB_USER_CODE_END
***
*** End of user code section
***
**************************************************************************/