Fixes many, though not all 64bit-warnings. In lots of places, pointers are cast to ints to be then used as array subscripts. The only way to deal with this is to change them to long. Additionally, use calloc() to allocate the int_array in istr.c and drop the (wrong) macro patch to istr.h. Should make dtbuilder work on 32bit again.
3983 lines
103 KiB
C
3983 lines
103 KiB
C
/*** 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 librararies 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 <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(
|
||
)
|
||
{
|
||
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; )
|
||
{
|
||
register 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;
|
||
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;
|
||
register 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;
|
||
register 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
|
||
)
|
||
{
|
||
register 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
|
||
)
|
||
{
|
||
register 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()
|
||
{
|
||
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;
|
||
register 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
|
||
***
|
||
**************************************************************************/
|
||
|
||
|