Files
cdesktop/cde/programs/dtappbuilder/src/libABil/bil_store.c
2012-03-10 18:58:32 +00:00

3725 lines
92 KiB
C

/*
* 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
*/
/*
* $XConsortium: bil_store.c /main/3 1995/11/06 18:26:05 rswiston $
*
* @(#)bil_store.c 1.145 22 Mar 1995
*
* RESTRICTED CONFIDENTIAL INFORMATION:
*
* The information in this document is subject to special
* restrictions in a confidential disclosure agreement between
* HP, IBM, Sun, USL, SCO and Univel. Do not distribute this
* document outside HP, IBM, Sun, USL, SCO, or Univel without
* Sun's specific written approval. This document and all copies
* and derivative works thereof must be returned or destroyed at
* Sun's request.
*
* Copyright 1993 Sun Microsystems, Inc. All rights reserved.
*
*/
/*
* bil_store.c - storing routines for the ABObj tree.
*/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <assert.h>
#include <sys/param.h>
#include <sys/types.h>
#include <ab/util_types.h>
#include <ab_private/util.h>
#include <ab_private/abio.h>
#include <ab_private/trav.h>
#include <ab_private/bil.h>
#include "load.h"
#include "bilP.h"
/*************************************************************************
**
**
** Constants (#define and const)
**
**
**
**************************************************************************/
/* a value_column that is a multiple of 8 saves a good deal of space,
* because tabs can be used, instead of spaces.
*/
#define VALUE_COLUMN 32 /* column to start value */
/*************************************************************************
**
**
** Private Functions (C declarations and macros)
**
**
**
**************************************************************************/
#define get_from_name(obj) (obj_get_name(obj_get_from(obj)))
#define get_to_name(obj) (obj_get_name(obj_get_to(obj)))
#ifdef BOGUS
static int store_project_tree(
ABObj root,
STRING filename,
BIL_SAVE_TYPE save_type
);
#endif /* BOGUS */
static BIL_TOKEN * get_object_attrs(
ABObj obj
);
static int store_object(
FILE *outFile,
ABObj obj,
BIL_SAVE_TYPE save_type
);
static int store_attribute(
FILE *outFile,
ABObj obj,
BIL_TOKEN attr,
BIL_SAVE_TYPE save_type
);
static int store_res_file_types(FILE *outFile, ABObj obj);
static int store_dnd_ops(FILE *outFile, ABDndOpFlags ops);
static int store_dnd_types(FILE *outFile, ABDndTypeFlags types);
static int store_action(
FILE *outFile,
ABObj obj,
BIL_SAVE_TYPE save_type
);
static STRING create_bil_file_list(
ABObj proj
);
static int bilP_write_tree(
FILE *outFile,
ABObj root,
BIL_SAVE_TYPE save_type
);
#ifdef BOGUS
static int save_cross_module_actions(
FILE *outFile,
ABObj root,
BIL_SAVE_TYPE save_type
);
#endif /* BOGUS */
static BOOL attr_is_undef(
BIL_TOKEN attr,
ABObj obj
);
static BOOL skip_attr(
BIL_TOKEN attr,
ABObj obj,
BIL_SAVE_TYPE save_type
);
static int bilP_write_tree_ui_objs(
FILE *outFile,
ABObj root,
BIL_SAVE_TYPE save_type
);
static int bilP_write_tree_conn_objs(
FILE *outFile,
ABObj root,
BIL_SAVE_TYPE save_type
);
/*
* DEBUGGING ROUTINES
*/
#ifdef DEBUG
static int util_dabort_impl(int abort_debug_level);
static BOOL attachment_is_ok(
ABObj obj,
AB_COMPASS_POINT attach_dir
);
static int check_attachments(
ABObj obj
);
static int bilP_obj_verify(
ABObj obj
);
#endif /* DEBUG */
#ifdef DEBUG
#define util_dabort(_lvl) util_dabort_impl(_lvl)
#else
#define util_dabort(_lvl) /* ignore this */
#endif
/*************************************************************************
**
**
** Function Definitions
**
**
**
**************************************************************************/
/*
*
*/
static BOOL
attr_is_undef(
BIL_TOKEN attr,
ABObj obj
)
{
char buf[256];
*buf = 0;
switch (attr)
{
case AB_BIL_BG_COLOR:
return( obj_get_bg_color(obj) == NULL );
case AB_BIL_CHILDREN:
return (obj_get_num_salient_ui_children(obj) == 0);
case AB_BIL_WIN_CHILDREN:
return (obj_get_num_win_children(obj) == 0);
case AB_BIL_DRAG_CURSOR:
return util_strempty(obj_get_drag_cursor(obj));
break;
case AB_BIL_DRAG_CURSOR_MASK:
return util_strempty(obj_get_drag_cursor_mask(obj));
break;
case AB_BIL_DRAG_ENABLED:
return ( (obj_get_drag_ops(obj) == 0) /* no dnd at all */
|| (obj_get_drag_types(obj) == 0) );
break;
case AB_BIL_DRAG_OPS:
return (obj_get_drag_ops(obj) == 0);
break;
case AB_BIL_DRAG_TYPES:
return (obj_get_drag_types(obj) == 0);
break;
case AB_BIL_DROP_ENABLED:
case AB_BIL_DROP_SITE_CHILD_ALLOWED: /* undef if drop-enabled undef */
return ( (obj_get_drop_ops(obj) == 0) /* no dnd at all */
|| (obj_get_drop_types(obj) == 0) );
break;
case AB_BIL_DROP_OPS:
return (obj_get_drop_ops(obj) == 0);
break;
case AB_BIL_DROP_TYPES:
return (obj_get_drop_types(obj) == 0);
break;
case AB_BIL_FG_COLOR:
return( obj_get_fg_color(obj) == NULL );
case AB_BIL_HATTACH_TYPE:
return (obj_get_hattach_type(obj) == AB_ATTACH_UNDEF);
case AB_BIL_LABEL:
return( util_strempty(obj_get_label(obj)) );
case AB_BIL_LABEL_TYPE:
if ( util_strempty(obj_get_label(obj)) &&
(obj_get_label_type(obj) == AB_LABEL_STRING)
)
{
return (True);
}
else return (False);
/* REMIND: No object seems to have this attribute */
case AB_BIL_PACKING:
if ( obj_get_packing(obj) == AB_PACK_UNDEF )
{
util_error(
catgets(ABIL_MESSAGE_CATD, ABIL_MESSAGE_SET, 41,
"packing is undefined\n"));
return (True);
}
else return (False);
case AB_BIL_PROCESS_STRING:
return (util_strempty(obj_get_process_string(obj)));
case AB_BIL_MENU:
return (util_strempty(obj_get_menu_name(obj)));
case AB_BIL_MENU_TITLE:
return (util_strempty(obj_get_menu_title(obj)));
/*
case AB_BIL_MENU_TYPE:
if ( obj_get_menu_type(obj) == AB_MENU_UNDEF )
{
util_error(
catgets(ABIL_MESSAGE_CATD, ABIL_MESSAGE_SET, 42,
"menu type is undefined\n"));
return (True);
}
return (False);
*/
case AB_BIL_LABEL_ALIGNMENT:
return (util_strempty(obj_get_label(obj)));
/* REMIND: No object seems to have this attribute */
case AB_BIL_REFERENCE_POINT:
if (obj_get_ref_point(obj) == AB_CP_UNDEF)
{
util_error(
catgets(ABIL_MESSAGE_CATD, ABIL_MESSAGE_SET, 42,
"reference point is undefined\n"));
return (True);
}
else return (False);
case AB_BIL_ACCELERATOR:
return(util_strempty(obj_get_accelerator(obj)));
case AB_BIL_INITIAL_VALUE:
{
AB_OBJECT_TYPE type;
type = obj_get_type(obj);
if (type == AB_TYPE_SCALE || type == AB_TYPE_SPIN_BOX)
return( False );
else
if (type == AB_TYPE_TEXT_FIELD ||
type == AB_TYPE_TEXT_PANE)
return (util_strempty(obj_get_initial_value_string(obj)));
}
case AB_BIL_TO:
case AB_BIL_ARG_TYPE:
return (obj_get_func_type(obj) != AB_FUNC_BUILTIN);
case AB_BIL_VATTACH_TYPE:
return (obj_get_vattach_type(obj) == AB_ATTACH_UNDEF);
case AB_BIL_ARG_VALUE:
{
AB_ARG_TYPE type = AB_ARG_UNDEF;
type = obj_get_arg_type(obj);
switch (type)
{
case AB_ARG_FLOAT:
case AB_ARG_INT:
return (False);
case AB_ARG_VOID_PTR:
case AB_ARG_STRING:
return (util_strempty(obj_get_arg_string(obj)));
default:
return (True);
}
}
case AB_BIL_NORTH_ATTACHMENT:
case AB_BIL_EAST_ATTACHMENT:
case AB_BIL_SOUTH_ATTACHMENT:
case AB_BIL_WEST_ATTACHMENT:
{
AB_ATTACH_TYPE attach_type = AB_ATTACH_UNDEF;
AB_COMPASS_POINT attach_dir = AB_CP_UNDEF;
switch (attr)
{
case AB_BIL_NORTH_ATTACHMENT: attach_dir = AB_CP_NORTH; break;
case AB_BIL_EAST_ATTACHMENT: attach_dir = AB_CP_EAST; break;
case AB_BIL_SOUTH_ATTACHMENT: attach_dir = AB_CP_SOUTH; break;
case AB_BIL_WEST_ATTACHMENT: attach_dir = AB_CP_WEST; break;
}
attach_type = obj_get_attach_type(obj, attach_dir);
return ( (attach_type == AB_ATTACH_UNDEF)
|| (attach_type == AB_ATTACH_NONE) );
}
case AB_BIL_LABEL_POSITION:
return (util_strempty(obj_get_label(obj)));
case AB_BIL_ICON_FILE:
return (util_strempty(obj_get_icon(obj)));
case AB_BIL_ICON_MASK_FILE:
return (util_strempty(obj_get_icon_mask(obj)));
case AB_BIL_ICON_LABEL:
return (util_strempty(obj_get_icon_label(obj)));
case AB_BIL_BORDER_FRAME:
{
AB_LINE_TYPE border_type = obj_get_border_frame(obj);
return (border_type == AB_LINE_UNDEF);
}
case AB_BIL_HELP_LOCATION:
if (!obj_is_action(obj))
return (util_strempty(obj_get_help_location(obj)));
else
return (util_strempty(obj_get_func_help_location(obj)));
case AB_BIL_HELP_TEXT:
return (util_strempty(obj_get_help_text(obj)));
case AB_BIL_HELP_VOLUME:
if (!obj_is_action(obj))
return (util_strempty(obj_get_help_volume(obj)));
else
return (util_strempty(obj_get_func_help_volume(obj)));
case AB_BIL_LINE_STYLE:
{
AB_LINE_TYPE line_style = obj_get_line_style(obj);
return (line_style == AB_LINE_UNDEF);
}
case AB_BIL_MNEMONIC:
return (util_strempty(obj_get_mnemonic(obj)));
case AB_BIL_WIN_PARENT:
/* A NULL window parent for the dialog is valid. */
return (obj_get_win_parent(obj) == NULL);
case AB_BIL_DEFAULT_BUTTON:
if (obj_is_popup_win(obj))
return(obj_get_default_act_button(obj) == NULL);
break;
case AB_BIL_DIRECTORY:
return (util_strempty(obj_get_directory(obj)));
case AB_BIL_FILTER_PATTERN:
return (util_strempty(obj_get_filter_pattern(obj)));
case AB_BIL_MESSAGE:
return (util_strempty(obj_get_msg_string(obj)));
case AB_BIL_OK_LABEL:
return (util_strempty(obj_get_ok_label(obj)));
case AB_BIL_ACTION:
return ((obj_get_func_type(obj) == AB_FUNC_ON_ITEM_HELP)
|| (obj_get_func_type(obj) == AB_FUNC_HELP_VOLUME));
case AB_BIL_ACTION1_LABEL:
return (util_strempty(obj_get_action1_label(obj)));
case AB_BIL_ACTION2_LABEL:
return (util_strempty(obj_get_action2_label(obj)));
case AB_BIL_ACTION3_LABEL:
return (util_strempty(obj_get_action3_label(obj)));
/* We do NOT write out the Position for Windows! */
case AB_BIL_X:
return (obj_is_window(obj) || obj_get_x(obj) == -1);
case AB_BIL_Y:
return (obj_is_window(obj) || obj_get_y(obj) == -1);
case AB_BIL_WIDTH:
return (obj_get_width(obj) == -1);
case AB_BIL_HEIGHT:
return (obj_get_height(obj) == -1);
case AB_BIL_VENDOR:
return (util_strempty(obj_get_vendor(obj)));
case AB_BIL_VERSION:
return (util_strempty(obj_get_version(obj)));
case AB_BIL_ROOT_WINDOW:
return (obj_get_root_window(obj) == NULL);
case AB_BIL_PANE_MAX_HEIGHT:
{
ABObj parent = NULL;
parent = obj_get_parent(obj);
if ((parent != NULL) && obj_is_paned_win(parent))
return (obj_get_pane_max(obj) == 1000);
else
return (True);
}
case AB_BIL_PANE_MIN_HEIGHT:
{
ABObj parent = NULL;
parent = obj_get_parent(obj);
if ((parent != NULL) && obj_is_paned_win(parent))
return (obj_get_pane_min(obj) == 1);
else
return (True);
}
case AB_BIL_HELP_BUTTON:
if (obj_is_popup_win(obj))
{
ABObj helpb = NULL;
helpb = obj_get_help_act_button(obj);
return (helpb == NULL);
}
else return (False);
} /* End switch (attr) */
return False;
}
/*
* Returns TRUE if the attribute should not be written to the BIL file.
* Generally, this is true if the attribute has a default or undefined value
*/
static BOOL
skip_attr(
BIL_TOKEN attr,
ABObj obj,
BIL_SAVE_TYPE save_type
)
{
ABObj parent;
save_type = save_type; /* avoid compiler warning */
if (attr_is_undef(attr, obj))
{
return True;
}
/*
* Put out only column stuff for column groups and only
* row stuff for row groups.
*/
if (obj_is_group(obj))
{
if ((obj_get_group_type(obj) == AB_GROUP_ROWS) &&
(attr == AB_BIL_COLUMN_ALIGNMENT ||
attr == AB_BIL_NUM_ROWS ||
attr == AB_BIL_NUM_COLUMNS ||
attr == AB_BIL_VOFFSET ||
attr == AB_BIL_VATTACH_TYPE))
return TRUE;
if ((obj_get_group_type(obj) == AB_GROUP_COLUMNS) &&
(attr == AB_BIL_ROW_ALIGNMENT ||
attr == AB_BIL_NUM_ROWS ||
attr == AB_BIL_NUM_COLUMNS ||
attr == AB_BIL_HOFFSET ||
attr == AB_BIL_HATTACH_TYPE))
return TRUE;
if ((obj_get_group_type(obj) == AB_GROUP_IGNORE) &&
(attr == AB_BIL_COLUMN_ALIGNMENT ||
attr == AB_BIL_NUM_ROWS ||
attr == AB_BIL_NUM_COLUMNS ||
attr == AB_BIL_VOFFSET ||
attr == AB_BIL_VATTACH_TYPE ||
attr == AB_BIL_ROW_ALIGNMENT ||
attr == AB_BIL_NUM_ROWS ||
attr == AB_BIL_NUM_COLUMNS ||
attr == AB_BIL_HOFFSET ||
attr == AB_BIL_HATTACH_TYPE))
return TRUE;
}
parent = obj_get_parent(obj);
if (parent)
parent = obj_get_root(parent);
/*
* object is group member
* If group type is anything other than AB_GROUP_IGNORE, don't write out
* position and attachment attributes
*/
if (parent &&
obj_is_group(parent) &&
(obj_get_group_type(parent) != AB_GROUP_IGNORE) &&
(attr == AB_BIL_X ||
attr == AB_BIL_Y ||
attr == AB_BIL_NORTH_ATTACHMENT ||
attr == AB_BIL_SOUTH_ATTACHMENT ||
attr == AB_BIL_EAST_ATTACHMENT ||
attr == AB_BIL_WEST_ATTACHMENT))
return TRUE;
/*
* Only write out drag options if drag and drop is actually being used
* on this object
*/
if ( (attr == AB_BIL_DRAG_TO_ROOT_ALLOWED)
&& attr_is_undef(AB_BIL_DRAG_OPS, obj) )
{
/* drag not enabled - don't bother with this att */
return TRUE;
}
if (obj_is_project(obj))
{
if ((attr == AB_BIL_FILES) && (save_type != BIL_SAVE_FILE_PER_MODULE))
{
/* encapsulated or dump - don't write files attribute */
return TRUE;
}
}
return FALSE;
}
STRING
bil_get_filename(
ABObj proj,
ABObj module
)
{
char proj_dir[MAXPATHLEN]= "",
module_dir[MAXPATHLEN]= "",
module_file[MAXPATHLEN]= "";
STRING proj_fullpath, mod_fullpath;
if ( proj != NULL && module != NULL )
{
proj_fullpath = obj_get_file(proj);
mod_fullpath = obj_get_file(module);
if (proj_fullpath != NULL && mod_fullpath != NULL)
{
util_get_dir_name_from_path(proj_fullpath, proj_dir, MAXPATHLEN);
util_get_dir_name_from_path(mod_fullpath, module_dir, MAXPATHLEN);
util_get_file_name_from_path(mod_fullpath, module_file, MAXPATHLEN);
/* If the project file is saved in the same directory
* as the bil file, then simply return the name of the
* bil file.
*/
if (strcmp(proj_dir, module_dir) == 0)
{
return(module_file);
}
/* Else return the absolute path for the bil file */
else
{
return(obj_get_file(module));
}
}
else
{
if (proj_fullpath == NULL && mod_fullpath != NULL)
{
return(mod_fullpath);
}
else return NULL;
}
}
return NULL;
}
/*
* Return a list of object attributes for the specified object type.
*/
static BIL_TOKEN *
get_object_attrs(
ABObj obj
)
{
BIL_TOKEN *returnAttrs = NULL;
AB_OBJECT_TYPE type;
type = obj_get_type(obj);
if ( type == AB_TYPE_ITEM )
{
AB_ITEM_TYPE subtype;
subtype = obj_get_item_type(obj);
switch (subtype)
{
case AB_ITEM_FOR_CHOICE:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_ITEM_TYPE,
AB_BIL_LABEL_TYPE,
AB_BIL_LABEL,
AB_BIL_ACTIVE,
AB_BIL_SELECTED,
AB_BIL_BG_COLOR,
AB_BIL_FG_COLOR,
AB_BIL_HELP_VOLUME,
AB_BIL_HELP_LOCATION,
AB_BIL_HELP_TEXT,
-1,
};
returnAttrs = attrs;
}
break;
case AB_ITEM_FOR_COMBO_BOX:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_ITEM_TYPE,
AB_BIL_LABEL,
AB_BIL_SELECTED,
-1,
};
returnAttrs = attrs;
}
break;
case AB_ITEM_FOR_LIST:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_ITEM_TYPE,
AB_BIL_LABEL,
AB_BIL_SELECTED,
-1,
};
returnAttrs = attrs;
}
break;
case AB_ITEM_FOR_MENU:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_ITEM_TYPE,
AB_BIL_LABEL_TYPE,
AB_BIL_LABEL,
AB_BIL_ACCELERATOR,
AB_BIL_MNEMONIC,
AB_BIL_LINE_STYLE,
AB_BIL_MENU,
AB_BIL_BG_COLOR,
AB_BIL_FG_COLOR,
AB_BIL_ACTIVE,
AB_BIL_HELP_VOLUME,
AB_BIL_HELP_LOCATION,
AB_BIL_HELP_TEXT,
-1,
};
returnAttrs = attrs;
}
break;
case AB_ITEM_FOR_MENUBAR:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_ITEM_TYPE,
AB_BIL_LABEL_TYPE,
AB_BIL_LABEL,
AB_BIL_IS_HELP_ITEM,
AB_BIL_MNEMONIC,
AB_BIL_MENU,
AB_BIL_BG_COLOR,
AB_BIL_FG_COLOR,
AB_BIL_ACTIVE,
AB_BIL_HELP_VOLUME,
AB_BIL_HELP_LOCATION,
AB_BIL_HELP_TEXT,
-1,
};
returnAttrs = attrs;
}
break;
case AB_ITEM_FOR_SPIN_BOX:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_ITEM_TYPE,
AB_BIL_LABEL,
AB_BIL_SELECTED,
-1,
};
returnAttrs = attrs;
}
break;
}
}
else
{
switch (type)
{
case AB_TYPE_PROJECT:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_FILES,
AB_BIL_VENDOR,
AB_BIL_VERSION,
AB_BIL_ROOT_WINDOW,
AB_BIL_SESSION_MGMT,
AB_BIL_TOOLTALK,
AB_BIL_I18N,
AB_BIL_RES_FILE_TYPES,
-1,
};
returnAttrs = attrs;
}
break;
case AB_TYPE_MODULE:
{
static BIL_TOKEN attrs[] =
{
-1,
};
returnAttrs = attrs;
}
break;
case AB_TYPE_BASE_WINDOW:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_X,
AB_BIL_Y,
AB_BIL_WIDTH,
AB_BIL_HEIGHT,
AB_BIL_BG_COLOR,
AB_BIL_FG_COLOR,
AB_BIL_ICON_FILE,
AB_BIL_ICON_MASK_FILE,
AB_BIL_ICON_LABEL,
AB_BIL_LABEL,
AB_BIL_RESIZABLE,
AB_BIL_VISIBLE,
AB_BIL_ICONIC,
AB_BIL_HELP_VOLUME,
AB_BIL_HELP_LOCATION,
AB_BIL_HELP_TEXT,
AB_BIL_DRAG_ENABLED,
AB_BIL_DRAG_CURSOR,
AB_BIL_DRAG_CURSOR_MASK,
AB_BIL_DRAG_OPS,
AB_BIL_DRAG_TO_ROOT_ALLOWED,
AB_BIL_DRAG_TYPES,
AB_BIL_DROP_ENABLED,
AB_BIL_DROP_SITE_CHILD_ALLOWED,
AB_BIL_DROP_OPS,
AB_BIL_DROP_TYPES,
AB_BIL_CHILDREN,
AB_BIL_WIN_CHILDREN,
-1,
};
returnAttrs = attrs;
}
break;
case AB_TYPE_COMBO_BOX:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_LABEL_TYPE,
AB_BIL_LABEL,
AB_BIL_LABEL_POSITION,
AB_BIL_READ_ONLY,
AB_BIL_VISIBLE,
AB_BIL_ACTIVE,
AB_BIL_X,
AB_BIL_Y,
AB_BIL_WIDTH,
AB_BIL_HEIGHT,
AB_BIL_BG_COLOR,
AB_BIL_FG_COLOR,
AB_BIL_NORTH_ATTACHMENT,
AB_BIL_SOUTH_ATTACHMENT,
AB_BIL_EAST_ATTACHMENT,
AB_BIL_WEST_ATTACHMENT,
AB_BIL_HELP_VOLUME,
AB_BIL_HELP_LOCATION,
AB_BIL_HELP_TEXT,
AB_BIL_CHILDREN,
-1,
};
returnAttrs = attrs;
}
break;
case AB_TYPE_CONTAINER:
{
AB_CONTAINER_TYPE cont_type;
cont_type = obj_get_container_type(obj);
switch (cont_type)
{
case AB_CONT_GROUP:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_CONTAINER_TYPE,
AB_BIL_ACTIVE,
AB_BIL_VISIBLE,
AB_BIL_X,
AB_BIL_Y,
AB_BIL_WIDTH,
AB_BIL_HEIGHT,
AB_BIL_GROUP_TYPE,
AB_BIL_COLUMN_ALIGNMENT,
AB_BIL_NUM_COLUMNS,
AB_BIL_VOFFSET,
AB_BIL_VATTACH_TYPE,
AB_BIL_ROW_ALIGNMENT,
AB_BIL_NUM_ROWS,
AB_BIL_HOFFSET,
AB_BIL_HATTACH_TYPE,
AB_BIL_BG_COLOR,
AB_BIL_FG_COLOR,
AB_BIL_BORDER_FRAME,
AB_BIL_NORTH_ATTACHMENT,
AB_BIL_SOUTH_ATTACHMENT,
AB_BIL_EAST_ATTACHMENT,
AB_BIL_WEST_ATTACHMENT,
AB_BIL_HELP_VOLUME,
AB_BIL_HELP_LOCATION,
AB_BIL_HELP_TEXT,
AB_BIL_DRAG_ENABLED,
AB_BIL_DRAG_CURSOR,
AB_BIL_DRAG_CURSOR_MASK,
AB_BIL_DRAG_OPS,
AB_BIL_DRAG_TO_ROOT_ALLOWED,
AB_BIL_DRAG_TYPES,
AB_BIL_DROP_ENABLED,
AB_BIL_DROP_SITE_CHILD_ALLOWED,
AB_BIL_DROP_OPS,
AB_BIL_DROP_TYPES,
AB_BIL_CHILDREN,
-1,
};
returnAttrs = attrs;
}
break;
case AB_CONT_MENU_BAR:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_CONTAINER_TYPE,
AB_BIL_WIDTH,
AB_BIL_HEIGHT,
AB_BIL_BG_COLOR,
AB_BIL_FG_COLOR,
AB_BIL_ACTIVE,
AB_BIL_MENU,
AB_BIL_HELP_VOLUME,
AB_BIL_HELP_LOCATION,
AB_BIL_HELP_TEXT,
AB_BIL_CHILDREN,
-1,
};
returnAttrs = attrs;
}
break;
case AB_CONT_PANED:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_CONTAINER_TYPE,
AB_BIL_X,
AB_BIL_Y,
AB_BIL_VISIBLE,
AB_BIL_ACTIVE,
AB_BIL_NORTH_ATTACHMENT,
AB_BIL_SOUTH_ATTACHMENT,
AB_BIL_EAST_ATTACHMENT,
AB_BIL_WEST_ATTACHMENT,
AB_BIL_CHILDREN,
-1,
};
returnAttrs = attrs;
}
break;
case AB_CONT_RELATIVE:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_CONTAINER_TYPE,
AB_BIL_X,
AB_BIL_Y,
AB_BIL_WIDTH,
AB_BIL_HEIGHT,
AB_BIL_BG_COLOR,
AB_BIL_FG_COLOR,
AB_BIL_MENU,
AB_BIL_MENU_TITLE,
AB_BIL_VISIBLE,
AB_BIL_BORDER_FRAME,
AB_BIL_PANE_MIN_HEIGHT,
AB_BIL_PANE_MAX_HEIGHT,
AB_BIL_NORTH_ATTACHMENT,
AB_BIL_SOUTH_ATTACHMENT,
AB_BIL_EAST_ATTACHMENT,
AB_BIL_WEST_ATTACHMENT,
AB_BIL_HELP_VOLUME,
AB_BIL_HELP_LOCATION,
AB_BIL_HELP_TEXT,
AB_BIL_DRAG_ENABLED,
AB_BIL_DRAG_CURSOR,
AB_BIL_DRAG_CURSOR_MASK,
AB_BIL_DRAG_OPS,
AB_BIL_DRAG_TO_ROOT_ALLOWED,
AB_BIL_DRAG_TYPES,
AB_BIL_DROP_ENABLED,
AB_BIL_DROP_SITE_CHILD_ALLOWED,
AB_BIL_DROP_OPS,
AB_BIL_DROP_TYPES,
AB_BIL_CHILDREN,
-1,
};
returnAttrs = attrs;
}
break;
case AB_CONT_TOOL_BAR:
case AB_CONT_FOOTER:
case AB_CONT_BUTTON_PANEL:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_CONTAINER_TYPE,
AB_BIL_WIDTH,
AB_BIL_HEIGHT,
AB_BIL_BG_COLOR,
AB_BIL_FG_COLOR,
AB_BIL_MENU,
AB_BIL_MENU_TITLE,
AB_BIL_VISIBLE,
AB_BIL_BORDER_FRAME,
AB_BIL_HELP_VOLUME,
AB_BIL_HELP_LOCATION,
AB_BIL_HELP_TEXT,
AB_BIL_DRAG_ENABLED,
AB_BIL_DRAG_CURSOR,
AB_BIL_DRAG_CURSOR_MASK,
AB_BIL_DRAG_OPS,
AB_BIL_DRAG_TO_ROOT_ALLOWED,
AB_BIL_DRAG_TYPES,
AB_BIL_DROP_ENABLED,
AB_BIL_DROP_SITE_CHILD_ALLOWED,
AB_BIL_DROP_OPS,
AB_BIL_DROP_TYPES,
AB_BIL_CHILDREN,
-1,
};
returnAttrs = attrs;
}
break;
}
}
break;
case AB_TYPE_BUTTON:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_BUTTON_TYPE,
AB_BIL_X,
AB_BIL_Y,
AB_BIL_WIDTH,
AB_BIL_HEIGHT,
AB_BIL_BG_COLOR,
AB_BIL_FG_COLOR,
AB_BIL_LABEL_TYPE,
AB_BIL_LABEL_ALIGNMENT,
AB_BIL_LABEL,
AB_BIL_MENU,
AB_BIL_ACTIVE,
AB_BIL_VISIBLE,
AB_BIL_NORTH_ATTACHMENT,
AB_BIL_SOUTH_ATTACHMENT,
AB_BIL_EAST_ATTACHMENT,
AB_BIL_WEST_ATTACHMENT,
AB_BIL_HELP_VOLUME,
AB_BIL_HELP_LOCATION,
AB_BIL_HELP_TEXT,
-1,
};
returnAttrs = attrs;
}
break;
case AB_TYPE_CHOICE:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_CHOICE_TYPE,
AB_BIL_X,
AB_BIL_Y,
AB_BIL_WIDTH,
AB_BIL_HEIGHT,
AB_BIL_BG_COLOR,
AB_BIL_FG_COLOR,
AB_BIL_LABEL_TYPE,
AB_BIL_LABEL,
AB_BIL_LABEL_POSITION,
AB_BIL_NUM_COLUMNS,
AB_BIL_ORIENTATION,
AB_BIL_SELECTION_REQUIRED,
AB_BIL_ACTIVE,
AB_BIL_VISIBLE,
AB_BIL_NORTH_ATTACHMENT,
AB_BIL_SOUTH_ATTACHMENT,
AB_BIL_EAST_ATTACHMENT,
AB_BIL_WEST_ATTACHMENT,
AB_BIL_HELP_VOLUME,
AB_BIL_HELP_LOCATION,
AB_BIL_HELP_TEXT,
AB_BIL_CHILDREN,
-1,
};
returnAttrs = attrs;
}
break;
case AB_TYPE_DIALOG:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_X,
AB_BIL_Y,
AB_BIL_WIDTH,
AB_BIL_HEIGHT,
AB_BIL_BG_COLOR,
AB_BIL_FG_COLOR,
AB_BIL_LABEL,
AB_BIL_RESIZABLE,
AB_BIL_VISIBLE,
AB_BIL_DEFAULT_BUTTON,
AB_BIL_HELP_BUTTON,
AB_BIL_HELP_VOLUME,
AB_BIL_HELP_LOCATION,
AB_BIL_HELP_TEXT,
AB_BIL_DRAG_ENABLED,
AB_BIL_DRAG_CURSOR,
AB_BIL_DRAG_CURSOR_MASK,
AB_BIL_DRAG_OPS,
AB_BIL_DRAG_TO_ROOT_ALLOWED,
AB_BIL_DRAG_TYPES,
AB_BIL_DROP_ENABLED,
AB_BIL_DROP_SITE_CHILD_ALLOWED,
AB_BIL_DROP_OPS,
AB_BIL_DROP_TYPES,
AB_BIL_CHILDREN,
-1,
};
returnAttrs = attrs;
}
break;
case AB_TYPE_DRAWING_AREA:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_X,
AB_BIL_Y,
AB_BIL_WIDTH,
AB_BIL_HEIGHT,
AB_BIL_DRAWAREA_WIDTH,
AB_BIL_DRAWAREA_HEIGHT,
AB_BIL_BG_COLOR,
AB_BIL_FG_COLOR,
AB_BIL_BORDER_FRAME,
AB_BIL_MENU,
AB_BIL_MENU_TITLE,
AB_BIL_HSCROLLBAR,
AB_BIL_VSCROLLBAR,
AB_BIL_ACTIVE,
AB_BIL_VISIBLE,
AB_BIL_PANE_MIN_HEIGHT,
AB_BIL_PANE_MAX_HEIGHT,
AB_BIL_NORTH_ATTACHMENT,
AB_BIL_SOUTH_ATTACHMENT,
AB_BIL_EAST_ATTACHMENT,
AB_BIL_WEST_ATTACHMENT,
AB_BIL_HELP_VOLUME,
AB_BIL_HELP_LOCATION,
AB_BIL_HELP_TEXT,
AB_BIL_DRAG_ENABLED,
AB_BIL_DRAG_CURSOR,
AB_BIL_DRAG_CURSOR_MASK,
AB_BIL_DRAG_OPS,
AB_BIL_DRAG_TO_ROOT_ALLOWED,
AB_BIL_DRAG_TYPES,
AB_BIL_DROP_ENABLED,
AB_BIL_DROP_SITE_CHILD_ALLOWED,
AB_BIL_DROP_OPS,
AB_BIL_DROP_TYPES,
-1,
};
returnAttrs = attrs;
}
break;
case AB_TYPE_LABEL:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_X,
AB_BIL_Y,
AB_BIL_WIDTH,
AB_BIL_HEIGHT,
AB_BIL_BG_COLOR,
AB_BIL_FG_COLOR,
AB_BIL_LABEL_TYPE,
AB_BIL_LABEL,
/*
AB_BIL_LABEL_STYLE,
*/
AB_BIL_LABEL_ALIGNMENT,
AB_BIL_ACTIVE,
AB_BIL_VISIBLE,
AB_BIL_MENU,
AB_BIL_NORTH_ATTACHMENT,
AB_BIL_SOUTH_ATTACHMENT,
AB_BIL_EAST_ATTACHMENT,
AB_BIL_WEST_ATTACHMENT,
AB_BIL_HELP_VOLUME,
AB_BIL_HELP_LOCATION,
AB_BIL_HELP_TEXT,
AB_BIL_DRAG_ENABLED,
AB_BIL_DRAG_CURSOR,
AB_BIL_DRAG_CURSOR_MASK,
AB_BIL_DRAG_OPS,
AB_BIL_DRAG_TO_ROOT_ALLOWED,
AB_BIL_DRAG_TYPES,
AB_BIL_DROP_ENABLED,
AB_BIL_DROP_SITE_CHILD_ALLOWED,
AB_BIL_DROP_OPS,
AB_BIL_DROP_TYPES,
-1,
};
returnAttrs = attrs;
}
break;
case AB_TYPE_LAYERS:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_X,
AB_BIL_Y,
AB_BIL_WIDTH,
AB_BIL_HEIGHT,
AB_BIL_BG_COLOR,
AB_BIL_FG_COLOR,
AB_BIL_PANE_MIN_HEIGHT,
AB_BIL_PANE_MAX_HEIGHT,
AB_BIL_NORTH_ATTACHMENT,
AB_BIL_SOUTH_ATTACHMENT,
AB_BIL_EAST_ATTACHMENT,
AB_BIL_WEST_ATTACHMENT,
AB_BIL_CHILDREN,
-1,
};
returnAttrs = attrs;
}
break;
case AB_TYPE_LIST:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_X,
AB_BIL_Y,
AB_BIL_WIDTH,
AB_BIL_HEIGHT,
AB_BIL_BG_COLOR,
AB_BIL_FG_COLOR,
AB_BIL_LABEL_TYPE,
AB_BIL_LABEL,
AB_BIL_LABEL_POSITION,
AB_BIL_SELECTION_MODE,
AB_BIL_SELECTION_REQUIRED,
AB_BIL_MENU,
AB_BIL_MENU_TITLE,
AB_BIL_NUM_ROWS,
/*
AB_BIL_HSCROLLBAR,
AB_BIL_VSCROLLBAR,
*/
AB_BIL_ACTIVE,
AB_BIL_VISIBLE,
AB_BIL_NORTH_ATTACHMENT,
AB_BIL_SOUTH_ATTACHMENT,
AB_BIL_EAST_ATTACHMENT,
AB_BIL_WEST_ATTACHMENT,
AB_BIL_HELP_VOLUME,
AB_BIL_HELP_LOCATION,
AB_BIL_HELP_TEXT,
AB_BIL_CHILDREN,
-1,
};
returnAttrs = attrs;
}
break;
case AB_TYPE_MENU:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_TEAR_OFF,
AB_BIL_BG_COLOR,
AB_BIL_FG_COLOR,
AB_BIL_LABEL,
AB_BIL_CHILDREN,
-1,
};
returnAttrs = attrs;
}
break;
case AB_TYPE_SEPARATOR:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_LINE_STYLE,
AB_BIL_ORIENTATION,
AB_BIL_X,
AB_BIL_Y,
AB_BIL_WIDTH,
AB_BIL_HEIGHT,
AB_BIL_BG_COLOR,
AB_BIL_FG_COLOR,
AB_BIL_VISIBLE,
AB_BIL_NORTH_ATTACHMENT,
AB_BIL_SOUTH_ATTACHMENT,
AB_BIL_EAST_ATTACHMENT,
AB_BIL_WEST_ATTACHMENT,
AB_BIL_HELP_VOLUME,
AB_BIL_HELP_LOCATION,
AB_BIL_HELP_TEXT,
-1,
};
returnAttrs = attrs;
}
break;
case AB_TYPE_SCALE:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_LABEL_TYPE,
AB_BIL_LABEL,
AB_BIL_LABEL_POSITION,
AB_BIL_READ_ONLY,
AB_BIL_ORIENTATION,
AB_BIL_DIRECTION,
AB_BIL_MIN_VALUE,
AB_BIL_MAX_VALUE,
AB_BIL_INITIAL_VALUE,
AB_BIL_INCREMENT,
AB_BIL_DECIMAL_POINTS,
AB_BIL_SHOW_VALUE,
AB_BIL_X,
AB_BIL_Y,
AB_BIL_WIDTH,
AB_BIL_HEIGHT,
AB_BIL_BG_COLOR,
AB_BIL_FG_COLOR,
AB_BIL_ACTIVE,
AB_BIL_VISIBLE,
AB_BIL_NORTH_ATTACHMENT,
AB_BIL_SOUTH_ATTACHMENT,
AB_BIL_EAST_ATTACHMENT,
AB_BIL_WEST_ATTACHMENT,
AB_BIL_HELP_VOLUME,
AB_BIL_HELP_LOCATION,
AB_BIL_HELP_TEXT,
-1,
};
returnAttrs = attrs;
}
break;
case AB_TYPE_SPIN_BOX:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_LABEL_TYPE,
AB_BIL_LABEL,
AB_BIL_LABEL_POSITION,
AB_BIL_TEXT_TYPE,
AB_BIL_ARROW_STYLE,
AB_BIL_MIN_VALUE,
AB_BIL_MAX_VALUE,
AB_BIL_INITIAL_VALUE,
AB_BIL_INCREMENT,
AB_BIL_DECIMAL_POINTS,
AB_BIL_VISIBLE,
AB_BIL_ACTIVE,
AB_BIL_X,
AB_BIL_Y,
AB_BIL_WIDTH,
AB_BIL_HEIGHT,
AB_BIL_BG_COLOR,
AB_BIL_FG_COLOR,
AB_BIL_NORTH_ATTACHMENT,
AB_BIL_SOUTH_ATTACHMENT,
AB_BIL_EAST_ATTACHMENT,
AB_BIL_WEST_ATTACHMENT,
AB_BIL_HELP_VOLUME,
AB_BIL_HELP_LOCATION,
AB_BIL_HELP_TEXT,
AB_BIL_CHILDREN,
-1,
};
returnAttrs = attrs;
}
break;
case AB_TYPE_TERM_PANE:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_X,
AB_BIL_Y,
AB_BIL_WIDTH,
AB_BIL_HEIGHT,
AB_BIL_BG_COLOR,
AB_BIL_FG_COLOR,
AB_BIL_BORDER_FRAME,
AB_BIL_LABEL_TYPE,
AB_BIL_LABEL,
AB_BIL_NUM_ROWS,
AB_BIL_NUM_COLUMNS,
AB_BIL_VSCROLLBAR,
AB_BIL_PROCESS_STRING,
AB_BIL_ACTIVE,
AB_BIL_VISIBLE,
AB_BIL_PANE_MIN_HEIGHT,
AB_BIL_PANE_MAX_HEIGHT,
AB_BIL_NORTH_ATTACHMENT,
AB_BIL_SOUTH_ATTACHMENT,
AB_BIL_EAST_ATTACHMENT,
AB_BIL_WEST_ATTACHMENT,
AB_BIL_HELP_VOLUME,
AB_BIL_HELP_LOCATION,
AB_BIL_HELP_TEXT,
-1,
};
returnAttrs = attrs;
}
break;
case AB_TYPE_TEXT_FIELD:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_TEXT_TYPE,
AB_BIL_X,
AB_BIL_Y,
AB_BIL_WIDTH,
AB_BIL_HEIGHT,
AB_BIL_BG_COLOR,
AB_BIL_FG_COLOR,
AB_BIL_LABEL_TYPE,
AB_BIL_LABEL,
AB_BIL_LABEL_POSITION,
AB_BIL_NUM_COLUMNS,
AB_BIL_MAX_LENGTH,
AB_BIL_INITIAL_VALUE,
AB_BIL_READ_ONLY,
AB_BIL_ACTIVE,
AB_BIL_VISIBLE,
AB_BIL_MENU,
AB_BIL_NORTH_ATTACHMENT,
AB_BIL_SOUTH_ATTACHMENT,
AB_BIL_EAST_ATTACHMENT,
AB_BIL_WEST_ATTACHMENT,
AB_BIL_HELP_VOLUME,
AB_BIL_HELP_LOCATION,
AB_BIL_HELP_TEXT,
-1,
};
returnAttrs = attrs;
}
break;
case AB_TYPE_TEXT_PANE:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_TEXT_TYPE,
AB_BIL_X,
AB_BIL_Y,
AB_BIL_WIDTH,
AB_BIL_HEIGHT,
AB_BIL_BG_COLOR,
AB_BIL_FG_COLOR,
AB_BIL_BORDER_FRAME,
AB_BIL_NUM_ROWS,
AB_BIL_NUM_COLUMNS,
AB_BIL_HSCROLLBAR,
AB_BIL_VSCROLLBAR,
AB_BIL_WORD_WRAP,
AB_BIL_INITIAL_VALUE,
AB_BIL_READ_ONLY,
AB_BIL_ACTIVE,
AB_BIL_VISIBLE,
AB_BIL_MENU,
AB_BIL_MENU_TITLE,
AB_BIL_PANE_MIN_HEIGHT,
AB_BIL_PANE_MAX_HEIGHT,
AB_BIL_NORTH_ATTACHMENT,
AB_BIL_SOUTH_ATTACHMENT,
AB_BIL_EAST_ATTACHMENT,
AB_BIL_WEST_ATTACHMENT,
AB_BIL_HELP_VOLUME,
AB_BIL_HELP_LOCATION,
AB_BIL_HELP_TEXT,
-1,
};
returnAttrs = attrs;
}
break;
case AB_TYPE_ACTION:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_FROM,
AB_BIL_TO,
AB_BIL_WHEN,
AB_BIL_ACTION_TYPE,
AB_BIL_ACTION,
AB_BIL_ARG_TYPE,
AB_BIL_ARG_VALUE,
AB_BIL_HELP_VOLUME,
AB_BIL_HELP_LOCATION,
-1,
};
returnAttrs = attrs;
}
break;
case AB_TYPE_FILE_CHOOSER:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_X,
AB_BIL_Y,
AB_BIL_BG_COLOR,
AB_BIL_FG_COLOR,
AB_BIL_VISIBLE,
AB_BIL_LABEL,
AB_BIL_FILTER_PATTERN,
AB_BIL_OK_LABEL,
AB_BIL_AUTO_DISMISS,
AB_BIL_DIRECTORY,
AB_BIL_FILE_TYPE_MASK,
AB_BIL_HELP_VOLUME,
AB_BIL_HELP_LOCATION,
AB_BIL_HELP_TEXT,
-1,
};
returnAttrs = attrs;
}
break;
case AB_TYPE_MESSAGE:
{
static BIL_TOKEN attrs[] =
{
AB_BIL_TYPE,
AB_BIL_MESSAGE_TYPE,
AB_BIL_LABEL,
AB_BIL_MESSAGE,
AB_BIL_ACTION1_LABEL,
AB_BIL_ACTION2_LABEL,
AB_BIL_ACTION3_LABEL,
AB_BIL_CANCEL_BUTTON,
AB_BIL_HELP_BUTTON,
AB_BIL_DEFAULT_BUTTON,
AB_BIL_HELP_VOLUME,
AB_BIL_HELP_LOCATION,
AB_BIL_HELP_TEXT,
-1,
};
returnAttrs = attrs;
}
break;
}
} /* !AB_TYPE_ITEM */
return returnAttrs;
}
static int
store_object(
FILE *outFile,
ABObj obj,
BIL_SAVE_TYPE save_type
)
{
AB_OBJECT_TYPE obj_type;
BIL_TOKEN *attrp = NULL;
#ifdef DEBUG
if (bilP_obj_verify(obj) < 0)
util_dabort(1);
#endif
obj_type = obj_get_type(obj);
abio_put_keyword(outFile, obj_type);
abio_putc(outFile, ' ');
abio_put_keyword_name(outFile, obj_get_name(obj));
abio_putc(outFile, '\n');
abio_puts(outFile, abio_bil_object_begin_string());
abio_putc(outFile, '\n');
abio_set_indent(outFile, 1);
/* Write out all resource pairs out */
/* get_object_attrs returns an array of BIL_TOKENs
* which represent the attributes for a specific object
* type.
*/
for (attrp = get_object_attrs(obj); (attrp != NULL) && (*attrp != -1);
++attrp)
{
store_attribute(outFile, obj, *attrp, save_type);
}
abio_set_indent(outFile, 0);
if (! (obj_is_module(obj) || obj_is_project(obj)) )
{
abio_puts(outFile, abio_bil_object_end_string());
}
abio_putc(outFile, '\n');
return 0;
}
/*
* Store one attribute.
*/
static int
store_attribute(
FILE *outFile,
ABObj obj,
BIL_TOKEN attr,
BIL_SAVE_TYPE save_type
)
{
int attrWidth = 0;
int newAttrWidth = 0;
int attrLen = 0;
BOOL firstWidthIter = TRUE;
char attrbuf[1024]; /* attribute name string */
/* If the attribute is NULL, then don't bother writing it
* out to the output file, just return.
*/
if (skip_attr(attr, obj, save_type))
return 0;
/*
* Build and write out the attribute name string, lining up the
* values in their proper columns.
* Assume: indent char is tab
*/
assert(abio_get_indent_char(outFile) == '\t');
strcpy(attrbuf, bilP_token_to_string(attr));
attrLen = strlen(attrbuf);
attrWidth = (abio_get_indent(outFile) * 8) + attrLen;
firstWidthIter = TRUE; /* go through at least once */
while ((attrWidth < VALUE_COLUMN) || firstWidthIter)
{
firstWidthIter = FALSE;
newAttrWidth = ((attrWidth/8) * 8) + 8;
if (newAttrWidth <= VALUE_COLUMN)
{
attrbuf[attrLen++] = '\t';
attrbuf[attrLen] = 0;
attrWidth = newAttrWidth;
}
else
{
attrbuf[attrLen++] = ' ';
attrbuf[attrLen] = 0;
++attrWidth;
}
}
abio_puts(outFile, attrbuf);
/*
* Output the attribute/value pair.
*/
switch (attr)
{
/* Attributes/resources common to all ABobj's */
case AB_BIL_TYPE:
abio_puts(outFile, util_object_type_to_string(obj_get_type(obj)));
break;
case AB_BIL_X:
abio_puts(outFile, abio_integer_string(obj_get_x(obj)));
break;
case AB_BIL_Y:
abio_puts(outFile, abio_integer_string(obj_get_y(obj)));
break;
case AB_BIL_WIDTH:
abio_puts(outFile, abio_integer_string(obj_get_width(obj)));
break;
case AB_BIL_HEIGHT:
abio_puts(outFile, abio_integer_string(obj_get_height(obj)));
break;
case AB_BIL_DRAG_CURSOR:
abio_put_string(outFile, obj_get_drag_cursor(obj));
break;
case AB_BIL_DRAG_CURSOR_MASK:
abio_put_string(outFile, obj_get_drag_cursor_mask(obj));
break;
case AB_BIL_DRAG_ENABLED:
abio_puts(outFile,
abio_bil_boolean_string(obj_get_drag_initially_enabled(obj)));
break;
case AB_BIL_DRAG_OPS:
store_dnd_ops(outFile, obj_get_drag_ops(obj));
break;
case AB_BIL_DRAG_TO_ROOT_ALLOWED:
abio_puts(outFile,
abio_bil_boolean_string(obj_get_drag_to_root_allowed(obj)));
break;
case AB_BIL_DRAG_TYPES:
store_dnd_types(outFile, obj_get_drag_types(obj));
break;
case AB_BIL_DRAWAREA_WIDTH:
abio_puts(outFile, abio_integer_string(obj_get_drawarea_width(obj)));
break;
case AB_BIL_DRAWAREA_HEIGHT:
abio_puts(outFile, abio_integer_string(obj_get_drawarea_height(obj)));
break;
case AB_BIL_DROP_ENABLED:
abio_puts(outFile,
abio_bil_boolean_string(obj_get_drop_initially_enabled(obj)));
break;
case AB_BIL_DROP_SITE_CHILD_ALLOWED:
abio_puts(outFile,
abio_bil_boolean_string(obj_drop_on_children_is_allowed(obj)));
break;
case AB_BIL_DROP_OPS:
store_dnd_ops(outFile, obj_get_drop_ops(obj));
break;
case AB_BIL_DROP_TYPES:
store_dnd_types(outFile, obj_get_drop_types(obj));
break;
case AB_BIL_BG_COLOR:
abio_put_string(outFile, obj_get_bg_color(obj));
break;
case AB_BIL_FG_COLOR:
abio_put_string(outFile, obj_get_fg_color(obj));
break;
case AB_BIL_ICON_LABEL:
abio_put_string(outFile, obj_get_icon_label(obj));
break;
case AB_BIL_LABEL:
abio_put_string(outFile, obj_get_label(obj));
break;
case AB_BIL_LABEL_TYPE:
{
AB_LABEL_TYPE lbl_type = AB_LABEL_UNDEF;
lbl_type = obj_get_label_type(obj);
abio_puts(outFile, bilP_label_type_to_string(lbl_type));
break;
}
case AB_BIL_LABEL_POSITION:
abio_puts(outFile, bilP_compass_point_to_string(obj_get_label_position(obj)));
break;
/*
case AB_BIL_LABEL_STYLE:
{
AB_LABEL_STYLE lbl_style;
lbl_style = obj_get_label_style(obj);
if (lbl_style)
{
abio_puts(outFile, bilP_label_style_to_string(lbl_style));
}
break;
}
*/
/* Attributes specific to a particular ABObj */
case AB_BIL_FILES:
{
STRING bil_files = NULL;
if ((bil_files = create_bil_file_list(obj)) != NULL)
{
abio_puts(outFile, abio_bil_object_begin_string());
abio_puts(outFile, bil_files);
abio_puts(outFile, abio_bil_object_end_string());
util_free(bil_files);
}
else
util_dprintf(1, "malloc or copy failed for bil file list");
break;
}
case AB_BIL_WIN_CHILDREN:
{
ABObj refObj = NULL,
objModule = NULL,
refModule = NULL;
AB_OBJ_REF_TYPE refType = AB_REF_UNDEF;
STRING refObj_mod_name = NULL;
ABObjList refs = NULL;
void *voidRefType = NULL;
int numRefs = 0, i = 0;
if ((refs = obj_get_refs_to(obj)) != NULL)
{
/* Go ahead and write '(' to the file because
* this won't get called unless there are
* dialogs whose win-parent is this object.
*/
abio_puts(outFile, abio_bil_object_begin_string());
abio_putc(outFile, '\n');
abio_set_indent(outFile, 2);
numRefs = objlist_get_num_objs(refs);
for (i = 0; i < numRefs; i++)
{
refObj = objlist_get_obj(refs, i, &voidRefType);
refType = (AB_OBJ_REF_TYPE)voidRefType;
if (refType == AB_REF_WIN_PARENT)
{
refModule = obj_get_module(refObj);
objModule = obj_get_module(obj);
if (objModule == refModule)
{
abio_puts(outFile, obj_get_name(refObj));
abio_putc(outFile, '\n');
}
else
{
refObj_mod_name = obj_get_name(refModule);
abio_printf(outFile, "%s.%s\n",
refObj_mod_name,
obj_get_name(refObj));
}
}
}
abio_set_indent(outFile, 1);
abio_puts(outFile, abio_bil_object_end_string());
objlist_destroy(refs);
}
break;
}
case AB_BIL_WIN_PARENT:
{
ABObj obj_module= NULL;
ABObj win_parent= NULL;
ABObj win_parent_module= NULL;
STRING win_parent_mod_name = NULL;
win_parent= obj_get_win_parent(obj);
if (win_parent == NULL)
{
abio_puts(outFile, bilP_token_to_string(AB_BIL_UNDEF_KEYWORD));
break;
}
obj_module = obj_get_module(obj);
win_parent_module = obj_get_module(win_parent);
if (obj_module == win_parent_module)
{
abio_puts(outFile, obj_get_name(win_parent));
}
else /* The dialog's parent is in another module */
{
win_parent_mod_name = obj_get_name(win_parent_module);
abio_puts(outFile, win_parent_mod_name);
abio_putc(outFile, '.');
abio_puts(outFile, obj_get_name(win_parent));
}
break;
}
case AB_BIL_BORDER_FRAME:
abio_puts(outFile, bilP_border_frame_to_string(obj_get_border_frame(obj)));
break;
case AB_BIL_PACKING:
abio_puts(outFile, bilP_packing_to_string(obj_get_packing(obj)));
break;
case AB_BIL_PROCESS_STRING:
abio_put_string(outFile, obj_get_process_string(obj));
break;
case AB_BIL_RES_FILE_TYPES:
store_res_file_types(outFile, obj);
break;
case AB_BIL_ROW_ALIGNMENT:
abio_puts(outFile, bilP_alignment_to_string(obj_get_row_align(obj)));
break;
case AB_BIL_COLUMN_ALIGNMENT:
abio_puts(outFile, bilP_alignment_to_string(obj_get_col_align(obj)));
break;
/* REMIND: Currently, there is only one resizable field
* in AB_WINDOW_INFO struct. There is no
* differentiation between resizable width
* and height. Do we need to change the
* struct to add both a width_resizable field
* and a height_resizable field?
*/
/*
case AB_BIL_HEIGHT_RESIZABLE:
abio_puts(outFile, abio_bil_boolean_string(obj_get_height_resizable(obj)));
break;
case AB_BIL_WIDTH_RESIZABLE:
abio_puts(outFile, abio_bil_boolean_string(obj_get_width_resizable(obj)));
break;
*/
case AB_BIL_RESIZABLE:
abio_puts(outFile, abio_bil_boolean_string(obj_get_resizable(obj)));
break;
case AB_BIL_CONTAINER_TYPE:
abio_puts(outFile, bilP_container_type_to_string(obj_get_container_type(obj)));
break;
case AB_BIL_MENU:
abio_puts(outFile, obj_get_menu_name(obj));
break;
case AB_BIL_MENU_TITLE:
abio_put_string(outFile, obj_get_menu_title(obj));
break;
/*
case AB_BIL_MENU_TYPE:
abio_puts(outFile, bilP_menu_type_to_string(obj_get_menu_type(obj)));
break;
*/
case AB_BIL_GROUP_TYPE:
abio_puts(outFile, bilP_group_type_to_string(obj_get_group_type(obj)));
break;
case AB_BIL_LABEL_ALIGNMENT:
switch (obj_get_type(obj))
{
case AB_TYPE_BUTTON:
case AB_TYPE_LABEL:
abio_puts(outFile, bilP_alignment_to_string(obj_get_label_alignment(obj)));
break;
}
break;
case AB_BIL_NUM_COLUMNS:
abio_puts(outFile, abio_integer_string(obj_get_num_columns(obj)));
break;
case AB_BIL_HATTACH_TYPE:
abio_puts(outFile, bilP_attachment_to_string(obj_get_hattach_type(obj)));
break;
case AB_BIL_VATTACH_TYPE:
abio_puts(outFile, bilP_attachment_to_string(obj_get_vattach_type(obj)));
break;
case AB_BIL_HOFFSET:
abio_puts(outFile, abio_integer_string(obj_get_hoffset(obj)));
break;
case AB_BIL_HSPACING:
abio_puts(outFile, abio_integer_string(obj_get_hspacing(obj)));
break;
case AB_BIL_REFERENCE_POINT:
abio_puts(outFile, bilP_compass_point_to_string(obj_get_ref_point(obj)));
break;
case AB_BIL_NUM_ROWS:
abio_puts(outFile, abio_integer_string(obj_get_num_rows(obj)));
break;
case AB_BIL_VENDOR:
abio_put_string(outFile, obj_get_vendor(obj));
break;
case AB_BIL_VERSION:
abio_put_string(outFile, obj_get_version(obj));
break;
case AB_BIL_ROOT_WINDOW:
{
ABObj root_win= NULL;
ABObj root_win_module= NULL;
STRING root_win_mod_name = NULL;
root_win= obj_get_root_window(obj);
if (root_win != NULL)
{
root_win_module = obj_get_module(root_win);
root_win_mod_name = obj_get_name(root_win_module);
abio_puts(outFile, root_win_mod_name);
abio_putc(outFile, '.');
abio_puts(outFile, obj_get_name(root_win));
}
break;
}
case AB_BIL_VISIBLE:
abio_puts(outFile, abio_bil_boolean_string(obj_is_initially_visible(obj)));
break;
case AB_BIL_VOFFSET:
abio_puts(outFile, abio_integer_string(obj_get_voffset(obj)));
break;
case AB_BIL_VSPACING:
abio_puts(outFile, abio_integer_string(obj_get_vspacing(obj)));
break;
case AB_BIL_BUTTON_TYPE:
abio_puts(outFile, bilP_button_type_to_string(obj_get_button_type(obj)));
break;
case AB_BIL_ORIENTATION:
abio_puts(outFile, bilP_orientation_to_string(obj_get_orientation(obj)));
break;
case AB_BIL_DIRECTION:
abio_puts(outFile, bilP_direction_to_string(obj_get_direction(obj)));
break;
case AB_BIL_SELECTION_REQUIRED:
abio_puts(outFile, abio_bil_boolean_string(obj_get_selection_required(obj)));
break;
case AB_BIL_HSCROLLBAR:
abio_puts(outFile, bilP_scrollbar_policy_to_string(
obj_get_hscrollbar_policy(obj)));
break;
case AB_BIL_VSCROLLBAR:
abio_puts(outFile, bilP_scrollbar_policy_to_string(
obj_get_vscrollbar_policy(obj)));
break;
case AB_BIL_IS_HELP_ITEM:
abio_puts(outFile, abio_bil_boolean_string(obj_is_help_item(obj)));
break;
case AB_BIL_ITEM_TYPE:
abio_puts(outFile, bilP_item_type_to_string(obj_get_item_type(obj)));
break;
case AB_BIL_ACCELERATOR:
abio_put_string(outFile, obj_get_accelerator(obj));
break;
case AB_BIL_MNEMONIC:
abio_put_string(outFile, obj_get_mnemonic(obj));
break;
case AB_BIL_TEAR_OFF:
abio_puts(outFile, abio_bil_boolean_string(obj_get_tearoff(obj)));
break;
case AB_BIL_EXCLUSIVE:
abio_puts(outFile, abio_bil_boolean_string(obj_get_exclusive(obj)));
break;
case AB_BIL_DECIMAL_POINTS:
abio_puts(outFile, abio_integer_string(obj_get_decimal_points(obj)));
break;
case AB_BIL_INCREMENT:
abio_puts(outFile, abio_integer_string(obj_get_increment(obj)));
break;
case AB_BIL_MIN_VALUE:
abio_puts(outFile, abio_integer_string(obj_get_min_value(obj)));
break;
case AB_BIL_MAX_VALUE:
abio_puts(outFile, abio_integer_string(obj_get_max_value(obj)));
break;
case AB_BIL_TEXT_TYPE:
abio_puts(outFile, bilP_text_type_to_string(obj_get_text_type(obj)));
break;
case AB_BIL_MAX_LENGTH:
abio_puts(outFile, abio_integer_string(obj_get_max_length(obj)));
break;
case AB_BIL_INITIAL_VALUE:
{
STRING val;
int ival;
AB_OBJECT_TYPE type;
type = obj_get_type(obj);
if (type == AB_TYPE_SCALE || type == AB_TYPE_SPIN_BOX)
{
ival = obj_get_initial_value_int(obj);
abio_puts(outFile, abio_integer_string(ival));
}
else if (type == AB_TYPE_TEXT_FIELD || type == AB_TYPE_TEXT_PANE)
{
val = obj_get_initial_value_string(obj);
if (val != NULL)
abio_put_string(outFile, val);
}
break;
}
case AB_BIL_READ_ONLY:
abio_puts(outFile, abio_bil_boolean_string(obj_get_read_only(obj)));
break;
case AB_BIL_ACTION:
{
AB_FUNC_TYPE type = AB_FUNC_UNDEF;
type = obj_get_func_type(obj);
switch (type)
{
case AB_FUNC_BUILTIN:
abio_puts(outFile, bilP_builtin_action_to_string(
obj_get_func_builtin(obj)));
break;
case AB_FUNC_USER_DEF:
abio_puts(outFile, obj_get_func_name(obj));
break;
case AB_FUNC_CODE_FRAG:
abio_put_string(outFile, obj_get_func_code(obj));
break;
}
break;
}
case AB_BIL_ACTION_TYPE:
abio_puts(outFile, bilP_func_type_to_string(obj_get_func_type(obj)));
break;
case AB_BIL_FROM:
{
AB_FUNC_TYPE type = AB_FUNC_UNDEF;
if (obj_is_project(obj->info.action.from))
{
abio_puts(outFile, bilP_token_to_string(AB_BIL_APPLICATION));
}
else
{
type = obj_get_func_type(obj);
switch (type)
{
case AB_FUNC_BUILTIN:
{
ABObj to_module = NULL, from_module = NULL;
STRING from_mod_name = NULL;
to_module = obj_get_module(obj->info.action.to);
from_module = obj_get_module(obj->info.action.from);
if (to_module == from_module)
{
abio_puts(outFile, get_from_name(obj));
}
else /* It is a cross-module connection */
{
from_mod_name = obj_get_name(from_module);
abio_puts(outFile, from_mod_name);
abio_putc(outFile, '.');
abio_puts(outFile, get_from_name(obj));
}
break;
}
case AB_FUNC_USER_DEF:
case AB_FUNC_CODE_FRAG:
case AB_FUNC_ON_ITEM_HELP:
case AB_FUNC_HELP_VOLUME:
abio_puts(outFile, get_from_name(obj));
break;
} /* End Switch */
}
break;
} /* End case AB_BIL_FROM */
case AB_BIL_TO:
{
AB_FUNC_TYPE type = AB_FUNC_UNDEF;
type = obj_get_func_type(obj);
switch (type)
{
case AB_FUNC_BUILTIN:
{
ABObj to_module, from_module;
STRING to_mod_name;
to_module = obj_get_module(obj->info.action.to);
from_module = obj_get_module(obj->info.action.from);
if (to_module == from_module)
{
abio_puts(outFile, get_to_name(obj));
}
else /* It is a cross-module connection */
{
to_mod_name = obj_get_name(to_module);
abio_puts(outFile, to_mod_name);
abio_putc(outFile, '.');
abio_puts(outFile, get_to_name(obj));
}
}
break;
case AB_FUNC_USER_DEF:
case AB_FUNC_CODE_FRAG:
case AB_FUNC_ON_ITEM_HELP:
case AB_FUNC_HELP_VOLUME:
break;
}
break;
}
case AB_BIL_WHEN:
abio_puts(outFile, bilP_when_to_string(obj_get_when(obj)));
break;
case AB_BIL_ARG_TYPE:
abio_puts(outFile, bilP_arg_type_to_string(obj_get_arg_type(obj)));
break;
case AB_BIL_ARG_VALUE:
{
AB_ARG_TYPE type = AB_ARG_UNDEF;
if ((type = obj_get_arg_type(obj)) != NULL)
{
switch (type)
{
case AB_ARG_FLOAT:
abio_put_float(outFile, obj_get_arg_float(obj));
break;
case AB_ARG_INT:
abio_put_integer(outFile, obj_get_arg_int(obj));
break;
case AB_ARG_VOID_PTR:
case AB_ARG_STRING:
if (obj_get_arg_string(obj))
{
abio_put_string(outFile,
obj_get_arg_string(obj));
}
break;
}
}
break;
}
case AB_BIL_CHOICE_TYPE:
abio_puts(outFile, bilP_choice_type_to_string(obj_get_choice_type(obj)));
break;
case AB_BIL_SELECTED:
abio_puts(outFile,
abio_bil_boolean_string(obj_is_initially_selected(obj)));
break;
case AB_BIL_SELECTION_MODE:
abio_puts(outFile, bilP_selection_mode_to_string(obj_get_selection_mode(obj)));
break;
case AB_BIL_DEFAULT:
abio_puts(outFile, abio_bil_boolean_string(obj_is_default(obj)));
break;
case AB_BIL_CHILDREN:
{
AB_TRAVERSAL trav;
ABObj child;
abio_puts(outFile, abio_bil_object_begin_string());
abio_putc(outFile, '\n');
abio_set_indent(outFile, 2);
for( trav_open(&trav, obj, AB_TRAV_SALIENT_UI_CHILDREN);
(child = trav_next(&trav)) != NULL; )
{
abio_puts(outFile, obj_get_name(child));
abio_putc(outFile, '\n');
}
trav_close(&trav);
abio_set_indent(outFile, 1);
abio_puts(outFile, abio_bil_object_end_string());
break;
}
case AB_BIL_NORTH_ATTACHMENT:
{
AB_ATTACH_TYPE attach_type = AB_ATTACH_UNDEF;
abio_putc(outFile, '(');
attach_type = obj_get_attach_type(obj, AB_CP_NORTH);
if (attach_type != AB_ATTACH_UNDEF)
abio_puts(outFile, bilP_attachment_to_string(attach_type));
abio_putc(outFile, ' ');
switch (attach_type)
{
case AB_ATTACH_OBJ:
case AB_ATTACH_ALIGN_OBJ_EDGE:
abio_puts(outFile, obj_get_name(obj_get_root( (ABObj)obj_get_attach_value(obj, AB_CP_NORTH))));
break;
case AB_ATTACH_GRIDLINE:
case AB_ATTACH_CENTER_GRIDLINE:
abio_put_integer(outFile, (int)obj_get_attach_value(obj, AB_CP_NORTH));
break;
case AB_ATTACH_POINT:
case AB_ATTACH_NONE:
abio_put_integer(outFile, 0);
break;
}
abio_putc(outFile, ' ');
if (obj->attachments != NULL)
abio_put_integer(outFile, obj_get_attach_offset(obj, AB_CP_NORTH));
else
abio_put_integer(outFile, 0);
abio_putc(outFile, ')');
break;
}
case AB_BIL_SOUTH_ATTACHMENT:
{
AB_ATTACH_TYPE attach_type = AB_ATTACH_UNDEF;
abio_putc(outFile, '(');
attach_type = obj_get_attach_type(obj, AB_CP_SOUTH);
if (attach_type != AB_ATTACH_UNDEF)
abio_puts(outFile, bilP_attachment_to_string(attach_type));
abio_putc(outFile, ' ');
switch (attach_type)
{
case AB_ATTACH_OBJ:
case AB_ATTACH_ALIGN_OBJ_EDGE:
abio_puts(outFile, obj_get_name(obj_get_root((ABObj)obj_get_attach_value(obj, AB_CP_SOUTH))));
break;
case AB_ATTACH_GRIDLINE:
case AB_ATTACH_CENTER_GRIDLINE:
abio_put_integer(outFile, (int)obj_get_attach_value(obj, AB_CP_SOUTH));
break;
default:
abio_put_integer(outFile, 0);
break;
}
abio_putc(outFile, ' ');
if (obj->attachments != NULL)
abio_put_integer(outFile, obj_get_attach_offset(obj, AB_CP_SOUTH));
else
abio_put_integer(outFile, 0);
abio_putc(outFile, ')');
break;
}
case AB_BIL_EAST_ATTACHMENT:
{
AB_ATTACH_TYPE attach_type = AB_ATTACH_UNDEF;
abio_putc(outFile, '(');
attach_type = obj_get_attach_type(obj, AB_CP_EAST);
if (attach_type != AB_ATTACH_UNDEF)
abio_puts(outFile, bilP_attachment_to_string(attach_type));
abio_putc(outFile, ' ');
switch (attach_type)
{
case AB_ATTACH_OBJ:
case AB_ATTACH_ALIGN_OBJ_EDGE:
abio_puts(outFile, obj_get_name(obj_get_root((ABObj)obj_get_attach_value(obj, AB_CP_EAST))));
break;
case AB_ATTACH_GRIDLINE:
case AB_ATTACH_CENTER_GRIDLINE:
abio_put_integer(outFile, (int)obj_get_attach_value(obj, AB_CP_EAST));
break;
default:
abio_put_integer(outFile, 0);
break;
}
abio_putc(outFile, ' ');
if (obj->attachments != NULL)
abio_put_integer(outFile,obj_get_attach_offset(obj, AB_CP_EAST));
else
abio_put_integer(outFile, 0);
abio_putc(outFile, ')');
break;
}
case AB_BIL_WEST_ATTACHMENT:
{
AB_ATTACH_TYPE attach_type = AB_ATTACH_UNDEF;
abio_putc(outFile, '(');
attach_type = obj_get_attach_type(obj, AB_CP_WEST);
if (attach_type != AB_ATTACH_UNDEF)
abio_puts(outFile, bilP_attachment_to_string(attach_type));
abio_putc(outFile, ' ');
switch (attach_type)
{
case AB_ATTACH_OBJ:
case AB_ATTACH_ALIGN_OBJ_EDGE:
abio_puts(outFile, obj_get_name(obj_get_root((ABObj)obj_get_attach_value(obj, AB_CP_WEST))));
break;
case AB_ATTACH_GRIDLINE:
case AB_ATTACH_CENTER_GRIDLINE:
abio_put_integer(outFile, (int)obj_get_attach_value(obj, AB_CP_WEST));
break;
default:
abio_put_integer(outFile, 0);
break;
}
abio_putc(outFile, ' ');
if (obj->attachments != NULL)
abio_put_integer(outFile, obj_get_attach_offset(obj, AB_CP_WEST));
else
abio_put_integer(outFile, 0);
abio_putc(outFile, ')');
break;
}
case AB_BIL_SB_ALWAYS_VISIBLE:
/* REMIND: (mcv) This is an obsolete attribute.
* Take this case out when bil files have been
* converted to new hscroll/vscroll values.
*/
break;
case AB_BIL_ICON_FILE:
abio_put_string(outFile, obj_get_icon(obj));
break;
case AB_BIL_ICON_MASK_FILE:
abio_put_string(outFile, obj_get_icon_mask(obj));
break;
case AB_BIL_HELP_LOCATION:
if (!obj_is_action(obj))
abio_put_string(outFile, obj_get_help_location(obj));
else
abio_put_string(outFile, obj_get_func_help_location(obj));
break;
case AB_BIL_HELP_TEXT:
abio_put_string(outFile, obj_get_help_text(obj));
break;
case AB_BIL_HELP_VOLUME:
if (!obj_is_action(obj))
abio_put_string(outFile, obj_get_help_volume(obj));
else
abio_put_string(outFile, obj_get_func_help_volume(obj));
break;
case AB_BIL_WORD_WRAP:
abio_puts(outFile, abio_bil_boolean_string(obj_get_word_wrap(obj)));
break;
case AB_BIL_LINE_STYLE:
abio_puts(outFile,
bilP_line_style_to_string(obj_get_line_style(obj)));
break;
case AB_BIL_ARROW_STYLE:
abio_puts(outFile,
bilP_arrow_style_to_string(obj_get_arrow_style(obj)));
break;
case AB_BIL_ICONIC:
abio_puts(outFile, abio_bil_boolean_string(obj_is_initially_iconic(obj)));
break;
case AB_BIL_ACTIVE:
abio_puts(outFile, abio_bil_boolean_string(obj_is_initially_active(obj)));
break;
case AB_BIL_SHOW_VALUE:
abio_puts(outFile, abio_bil_boolean_string(obj_get_show_value(obj)));
break;
case AB_BIL_FILTER_PATTERN:
abio_put_string(outFile, obj_get_filter_pattern(obj));
break;
case AB_BIL_OK_LABEL:
abio_put_string(outFile, obj_get_ok_label(obj));
break;
case AB_BIL_AUTO_DISMISS:
abio_puts(outFile, abio_bil_boolean_string(obj_get_auto_dismiss(obj)));
break;
case AB_BIL_DIRECTORY:
abio_put_string(outFile, obj_get_directory(obj));
break;
case AB_BIL_FILE_TYPE_MASK:
abio_puts(outFile, bilP_file_type_mask_to_string(obj_get_file_type_mask(obj)));
break;
case AB_BIL_MESSAGE_TYPE:
abio_puts(outFile, bilP_msg_type_to_string(obj_get_msg_type(obj)));
break;
case AB_BIL_MESSAGE:
abio_put_string(outFile, obj_get_msg_string(obj));
break;
case AB_BIL_SESSION_MGMT:
{
abio_puts(outFile, abio_bil_object_begin_string());
abio_putc(outFile, '\n');
abio_set_indent(outFile, 2);
store_attribute(outFile, obj, AB_BIL_SESSIONING_METHOD, save_type);
abio_set_indent(outFile, 1);
abio_puts(outFile, abio_bil_object_end_string());
break;
}
case AB_BIL_SESSIONING_METHOD:
abio_puts(outFile,
bilP_sessioning_method_to_string(obj_get_sessioning_method(obj)));
break;
case AB_BIL_I18N:
{
abio_puts(outFile, abio_bil_object_begin_string());
abio_putc(outFile, '\n');
abio_set_indent(outFile, 2);
store_attribute(outFile, obj, AB_BIL_I18N_ENABLED, save_type);
abio_set_indent(outFile, 1);
abio_puts(outFile, abio_bil_object_end_string());
break;
}
case AB_BIL_I18N_ENABLED:
abio_puts(outFile,
abio_bil_boolean_string(obj_get_i18n_enabled(obj)));
break;
case AB_BIL_TOOLTALK:
{
abio_puts(outFile, abio_bil_object_begin_string());
abio_putc(outFile, '\n');
abio_set_indent(outFile, 2);
store_attribute(outFile, obj, AB_BIL_TOOLTALK_DESKTOP_LEVEL, save_type);
abio_set_indent(outFile, 1);
abio_puts(outFile, abio_bil_object_end_string());
break;
}
case AB_BIL_TOOLTALK_DESKTOP_LEVEL:
abio_puts(outFile,
bilP_tt_desktop_level_to_string(obj_get_tooltalk_level(obj)));
break;
case AB_BIL_CANCEL_BUTTON:
abio_puts(outFile,
abio_bil_boolean_string(obj_has_cancel_button(obj)));
break;
case AB_BIL_HELP_BUTTON:
if (obj_is_popup_win(obj))
{
ABObj help_b = obj_get_help_act_button(obj);
if (help_b != NULL)
abio_puts(outFile, obj_get_name(help_b));
}
else if (obj_is_message(obj))
{
abio_puts(outFile,
abio_bil_boolean_string(obj_has_help_button(obj)));
}
break;
case AB_BIL_ACTION1_LABEL:
abio_put_string(outFile, obj_get_action1_label(obj));
break;
case AB_BIL_ACTION2_LABEL:
abio_put_string(outFile, obj_get_action2_label(obj));
break;
case AB_BIL_ACTION3_LABEL:
abio_put_string(outFile, obj_get_action3_label(obj));
break;
case AB_BIL_DEFAULT_BUTTON:
if (obj_is_popup_win(obj))
{
ABObj default_b = obj_get_default_act_button(obj);
if (default_b == NULL)
{
abio_puts(outFile, bilP_token_to_string(AB_BIL_UNDEF_KEYWORD));
break;
}
else
abio_puts(outFile, obj_get_name(default_b));
}
else
abio_puts(outFile,
bilP_default_button_to_string(obj_get_default_btn(obj)));
break;
case AB_BIL_PANE_MIN_HEIGHT:
abio_puts(outFile, abio_integer_string(obj_get_pane_min(obj)));
break;
case AB_BIL_PANE_MAX_HEIGHT:
abio_puts(outFile, abio_integer_string(obj_get_pane_max(obj)));
break;
}
abio_putc(outFile, '\n');
return 0;
}
static int
store_res_file_types(FILE *outFile, ABObj obj)
{
AB_ARG_CLASS_FLAGS resFileArgClasses = obj_get_res_file_arg_classes(obj);
AB_ARG_CLASS argClass;
AB_ARG_CLASS_FLAGS argClassFlag;
int i = 0;
int classCount = 0;
abio_puts(outFile, abio_bil_object_begin_string());
for (i = 0; i < AB_ARG_CLASS_NUM_VALUES; ++i)
{
argClass = (AB_ARG_CLASS)i;
argClassFlag = util_arg_class_to_flag(argClass);
if ((resFileArgClasses & argClassFlag) != 0)
{
if (classCount > 0)
{
abio_puts(outFile, " ");
}
abio_puts(outFile, bilP_arg_class_to_string(argClass));
++classCount;
}
}
abio_puts(outFile, abio_bil_object_end_string());
return classCount;
}
static int
store_dnd_ops(FILE *outFile, ABDndOpFlags opFlags)
{
int flagCount = 0;
int numWritten = 0;
ABDndOpFlags oneFlag = 0;
BIL_TOKEN token = AB_BIL_UNDEF;
STRING tokenString = NULL;
abio_puts(outFile, abio_bil_object_begin_string());
for (flagCount = 0; flagCount < 3; ++flagCount)
{
switch (flagCount)
{
case 0: oneFlag = ABDndOpCopy; break;
case 1: oneFlag = ABDndOpLink; break;
case 2: oneFlag = ABDndOpMove; break;
}
if ((opFlags & oneFlag) != 0)
{
token = bilP_dnd_op_flag_to_token(oneFlag);
tokenString = bilP_token_to_string(token);
if (numWritten > 0)
{
abio_puts(outFile, " ");
}
abio_puts(outFile, tokenString);
++numWritten;
}
}
abio_puts(outFile, abio_bil_object_end_string());
return numWritten;
}
static int
store_dnd_types(FILE *outFile, ABDndTypeFlags typeFlags)
{
int flagCount = 0;
int numWritten = 0;
ABDndTypeFlags oneFlag = 0;
BIL_TOKEN token = AB_BIL_UNDEF;
STRING tokenString = NULL;
abio_puts(outFile, abio_bil_object_begin_string());
for (flagCount = 0; flagCount < 4; ++flagCount)
{
switch (flagCount)
{
case 0: oneFlag = ABDndTypeText; break;
case 1: oneFlag = ABDndTypeFilename; break;
case 2: oneFlag = ABDndTypeUserDef; break;
case 3: oneFlag = ABDndTypeAny; break;
}
if ((typeFlags & oneFlag) != 0)
{
token = bilP_dnd_type_flag_to_token(oneFlag);
tokenString = bilP_token_to_string(token);
if (numWritten > 0)
{
abio_puts(outFile, " ");
}
abio_puts(outFile, tokenString);
++numWritten;
}
}
abio_puts(outFile, abio_bil_object_end_string());
return numWritten;
}
/*
* This will write out a project or module definition
*/
static int
bilP_write_tree(
FILE *outFile,
ABObj root,
BIL_SAVE_TYPE save_type
)
{
#ifdef DEBUG
if (obj_tree_verify(root) < 0)
util_dabort(1);
#endif
bilP_write_tree_ui_objs(outFile, root, save_type);
bilP_write_tree_conn_objs(outFile, root, save_type);
if (obj_is_project(root) || obj_is_module(root))
{
/*
* This ends the module (module) section of the BIL out file
*/
abio_puts(outFile, abio_bil_object_end_string());
abio_putc(outFile, '\n');
}
return 0;
}
static int
bilP_write_tree_ui_objs(
FILE *outFile,
ABObj root,
BIL_SAVE_TYPE save_type
)
{
AB_TRAVERSAL trav;
ABObj child;
if (root == NULL)
return -1;
if ( !obj_is_sub(root) && obj_is_defined(root)
&& (obj_is_ui(root) || obj_is_module(root)
|| obj_is_project(root))
)
{
store_object(outFile, root, save_type);
}
for( trav_open(&trav, root, AB_TRAV_SALIENT_CHILDREN);
(child = trav_next(&trav)) != NULL; )
{
if ( obj_is_module(child)
&& ( (save_type == BIL_SAVE_FILE_PER_MODULE)
|| (save_type == BIL_SAVE_ENCAPSULATED))
)
{
/* don't go into modules... */
continue;
}
bilP_write_tree_ui_objs(outFile, child, save_type);
}
trav_close(&trav);
return 0;
}
static int
store_action(
FILE *outFile,
ABObj obj,
BIL_SAVE_TYPE save_type
)
{
AB_OBJECT_TYPE obj_type;
BIL_TOKEN *attrp;
obj_type = obj_get_type(obj);
abio_put_keyword(outFile, obj_type);
abio_putc(outFile, '\n');
abio_puts(outFile, abio_bil_object_begin_string());
abio_putc(outFile, '\n');
abio_set_indent(outFile, 1);
for (attrp = get_object_attrs(obj); *attrp != -1; attrp++)
store_attribute(outFile, obj, *attrp, save_type);
abio_set_indent(outFile, 0);
abio_puts(outFile, abio_bil_object_end_string());
abio_putc(outFile, '\n');
return 0;
}
static int
bilP_write_tree_conn_objs(
FILE *outFile,
ABObj root,
BIL_SAVE_TYPE save_type
)
{
AB_TRAVERSAL trav;
ABObj action_obj = NULL;
AB_FUNC_TYPE type = AB_FUNC_UNDEF;
BOOL saveCrossModule = (obj_get_module(root) == NULL);
for (trav_open(&trav, root, AB_TRAV_ACTIONS_FOR_OBJ);
(action_obj = trav_next(&trav)) !=NULL; )
{
type = obj_get_func_type(action_obj);
switch (type)
{
case AB_FUNC_BUILTIN:
/* Check if the connection is within the same module.
* We don't want to write it out if it is a cross-module
* connection.
*/
if (!util_xor(obj_is_cross_module(action_obj),
saveCrossModule) )
{
/*is_cross_module and saveCrossModule are logically same*/
store_action(outFile, action_obj, save_type);
}
break;
case AB_FUNC_USER_DEF:
case AB_FUNC_CODE_FRAG:
case AB_FUNC_ON_ITEM_HELP:
case AB_FUNC_HELP_VOLUME:
store_action(outFile, action_obj, save_type);
break;
}
}
return 0;
}
#ifdef BOGUS
static int
save_cross_module_actions(
FILE *outFile,
ABObj root,
BIL_SAVE_TYPE save_type
)
{
AB_TRAVERSAL mod_trav, act_trav;
ABObj mod_obj = NULL, action_obj = NULL;
AB_FUNC_TYPE type = AB_FUNC_UNDEF;
if (!obj_is_project(root))
return -1;
for (trav_open(&mod_trav, root, AB_TRAV_MODULES);
(mod_obj = trav_next(&mod_trav)) !=NULL; )
{
for (trav_open(&act_trav, mod_obj, AB_TRAV_ACTIONS);
(action_obj = trav_next(&act_trav)) !=NULL; )
{
type = obj_get_func_type(action_obj);
if (type == AB_FUNC_BUILTIN)
{
/* Check if this is a cross-module connection */
if ( obj_get_module(action_obj->info.action.to) != mod_obj)
store_action(outFile, action_obj, save_type);
}
}
}
return 0;
}
#endif /* BOGUS */
/* This routine returns a list of bil files. The space is
* malloc'ed here, so it must be freed in the calling routine.
*/
static STRING
create_bil_file_list(
ABObj proj
)
{
AB_TRAVERSAL trav;
STRING bil_list = NULL;
ABObj child;
int first = 1;
STRING file = NULL;
int name_len = 0;
bil_list = util_malloc(MAXPATHLEN * sizeof(char));
if (bil_list == NULL)
return bil_list;
*bil_list = 0;
for (trav_open_cond(&trav, proj, AB_TRAV_MODULES, obj_is_defined_module);
(child = trav_next(&trav)) != NULL ; )
{
file = obj_get_file(child);
name_len = name_len + strlen(file) + 2; /* for \0 and blank */
if (name_len > MAXPATHLEN)
bil_list = (STRING) realloc(bil_list, name_len);
if (first)
{
first = 0;
if (strcpy(bil_list, file) == NULL)
{
if (bil_list) util_free(bil_list);
return NULL;
}
}
else
{
strcat(bil_list, " ");
strcat(bil_list, file);
}
}
trav_close(&trav);
return (bil_list);
}
int
bil_save_tree(
ABObj root,
STRING file_name,
STRING old_proj_dir,
BIL_SAVE_TYPE save_type
)
{
int return_value = OK;
STRING errmsg = NULL;
FILE *bilOutFile= NULL;
int filesWritten = 0;
STRING old_file = NULL;
int old_file_len = 0;
if (save_type == BIL_SAVE_DUMP)
{
save_type = BIL_SAVE_ENCAPSULATED;
}
if (root == NULL)
{
goto epilogue;
}
if (file_name == NULL)
{
file_name = obj_get_file(root);
}
if (file_name == NULL)
{
return_value = ERR_CLIENT;
goto epilogue;
}
#ifdef BOGUS
if (obj_is_project(root) && (save_type == BIL_SAVE_FILE_PER_MODULE))
{
/*
* Only save the project, itself
*/
if (store_project_tree(root, file_name, save_type) < 0)
{
return_value = ERR_OPEN;
goto epilogue;
}
}
else
#endif /* BOGUS */
{
/*
* Save the whole tree
*/
/* Check root's old filename. If it is not NULL, then
* that old file should be opened and any beginning
* comments should be preserved in the new file. If it
* is NULL, then the object (module or project) has
* never been saved, so pass in NULL for old file.
*/
if (old_proj_dir != NULL)
{
old_file = obj_get_file(root);
/* If the old filename is an absolute path, then
* we simply use that to check the old file for
* comments. If it's not an absolute path (e.g.
* a module was stored in the same directory as
* the project (most likely case) OR the module
* was saved to a subdirectory of the project dir,
* then we have to cobble together an absolute
* path for the old file.
*/
if ((old_file != NULL) && !util_path_is_absolute(old_file))
{
old_file_len = strlen(old_file);
old_file = (STRING) NULL;
old_file = (STRING) util_malloc(old_file_len +
strlen(old_proj_dir) +2);
sprintf(old_file, "%s/%s", old_proj_dir, obj_get_file(root));
}
}
else if (save_type == BIL_SAVE_FILE_PER_MODULE)
{
/* If old_proj_dir is NULL and we're saving
* a module or project, then that means that
* the old file is located in the current dir-
* ectory, so we don't have to cobble together
* an absolute path to find it. If the save_
* type is BIL_SAVE_ENCAPSULATED, then old_file
* will be NULL, because we're not implementing
* saving the comments from the old bip and bil
* files in the bix file at this time.
*/
old_file = obj_get_file(root);
}
/* Open the bil output file */
return_value = abio_open_bil_output(file_name, old_file, &bilOutFile);
if (return_value != OK)
{
goto epilogue;
}
/*
* Write out the top part of the tree (or perhaps a module)
*/
bilP_write_tree(bilOutFile, root, save_type);
/*
* See if we need to write out the modules, as well.
*/
if ((save_type != BIL_SAVE_FILE_PER_MODULE) && (!obj_is_module(root)))
{
ABObj module = NULL;
AB_TRAVERSAL trav;
for (trav_open(&trav, root, AB_TRAV_MODULES);
(module = trav_next(&trav)) != NULL; )
{
bilP_write_tree(bilOutFile, module, save_type);
}
trav_close(&trav);
}
/* write out end-of-data marker */
if (save_type == BIL_SAVE_ENCAPSULATED)
{
abio_printf(bilOutFile, "%s\n",
bilP_token_to_string(AB_BIL_DATA_END));
}
/* Close the bil output file */
abio_close_output(bilOutFile);
}
epilogue:
return return_value;
}
#ifdef BOGUS
static int
store_project_tree(
ABObj root,
STRING filename,
BIL_SAVE_TYPE save_type
)
{
int return_value = 0;
FILE *bilOutFile= NULL;
STRING errmsg = NULL;
if ( (root != NULL) && (filename != NULL) )
{
errmsg = abio_open_bil_output(filename, &bilOutFile);
if (errmsg != NULL)
{
util_printf_err("%s\n", errmsg);
return_value = -1;
goto epilogue;
}
store_object(bilOutFile, root, save_type);
save_cross_module_actions(bilOutFile, root, save_type);
/* This ends the project file */
abio_puts(bilOutFile, abio_bil_object_end_string());
abio_putc(bilOutFile, '\n');
abio_close_output(bilOutFile);
}
else
{
util_printf_err(
catgets(ABIL_MESSAGE_CATD, ABIL_MESSAGE_SET, 45,
"Cannot save project; Either nothing to store or NULL filename."));
}
epilogue:
return return_value;
}
#endif /* BOGUS */
#ifdef DEBUG
static int bad_obj_msg(
ABObj obj,
STRING fieldName,
int return_value,
STRING file,
int line
);
#define bad_obj(_obj,_fieldName) \
(bad_obj_msg(_obj,_fieldName, -1, __FILE__, __LINE__))
/* Check things that obj_verify() can't check, like
* undefined types and invalid subtypes. Check for
* attributes that should not be undefined, etc.
*/
static int
bilP_obj_verify(
ABObj obj
)
{
int rc = 0; /* return code */
AB_OBJECT_TYPE type = AB_TYPE_UNDEF;
ABObj project = NULL;
char name[1024];
*name = 0;
if (!debugging())
{
return 0;
}
if ((rc = obj_verify(obj)) < 0)
{
return rc;
}
project = obj_get_project(obj);
/* Check object type */
type = obj_get_type(obj);
if (type == AB_TYPE_UNDEF)
{
return bad_obj(obj, "object type");
}
if (obj_is_salient_ui(obj) && util_strempty(obj_get_name(obj)))
{
return bad_obj(obj, "name");
}
/* Check object subtype */
switch (type)
{
case AB_TYPE_ACTION:
if (obj_get_when(obj) == AB_WHEN_UNDEF)
{
return bad_obj(obj, "when");
}
if (obj_get_from(obj) == NULL)
{
return bad_obj(obj, "from");
}
if (obj_get_func_type(obj) == AB_FUNC_UNDEF)
{
return bad_obj(obj, "func_type");
}
break;
case AB_TYPE_BUTTON:
if (obj_get_button_type(obj) == AB_BUT_UNDEF)
{
return bad_obj(obj, "button type");
}
break;
case AB_TYPE_CONTAINER:
if ( (obj_get_container_type(obj) == AB_CONT_UNDEF)
|| (obj_get_container_type(obj) == AB_CONT_ABSOLUTE) )
{
/* absolute is no longer supported by BIL */
return bad_obj(obj, "container type");
}
else
{
if ( (obj_get_container_type(obj) == AB_CONT_GROUP)
&& (obj_get_group_type(obj) == AB_GROUP_UNDEF) )
{
return bad_obj(obj, "group type");
}
}
break;
case AB_TYPE_MESSAGE:
if (obj_get_msg_type(obj) == AB_MSG_UNDEF)
{
return bad_obj(obj, "message type");
}
break;
case AB_TYPE_ITEM:
if (obj_get_item_type(obj) == AB_ITEM_FOR_UNDEF)
{
return bad_obj(obj, "item type");
}
break;
case AB_TYPE_CHOICE:
if (obj_get_choice_type(obj) == AB_CHOICE_UNDEF)
{
return bad_obj(obj, "choice type");
}
break;
case AB_TYPE_LABEL:
if (obj_get_label_type(obj) == AB_LABEL_UNDEF)
{
return bad_obj(obj, "label type");
}
break;
case AB_TYPE_TEXT_FIELD:
case AB_TYPE_TEXT_PANE:
if (obj_get_text_type(obj) == AB_TEXT_UNDEF)
{
return bad_obj(obj, "text type");
}
break;
default:
break;
}
/* Check other attributes */
switch (type)
{
case AB_TYPE_CONTAINER:
if ((obj_get_container_type(obj) == AB_CONT_GROUP) ||
(obj_get_container_type(obj) == AB_CONT_PANED) ||
(obj_get_container_type(obj) == AB_CONT_RELATIVE))
{
if (check_attachments(obj) < 0)
{
return bad_obj(obj, "attachment");
}
if (obj_get_container_type(obj) == AB_CONT_GROUP)
{
if ((obj_get_row_align(obj) == AB_ALIGN_UNDEF) ||
(obj_get_col_align(obj) == AB_ALIGN_UNDEF))
{
return bad_obj(obj, "alignment");
}
}
}
break;
case AB_TYPE_BUTTON:
if (check_attachments(obj) < 0)
{
return bad_obj(obj, "attachment");
}
if (!util_strempty(obj_get_label(obj)))
{
if (obj_get_label_alignment(obj) == AB_ALIGN_UNDEF)
{
return bad_obj(obj, "label alignment");
}
}
break;
case AB_TYPE_LABEL:
if (check_attachments(obj) < 0)
{
return bad_obj(obj, "attachment");
}
if (!util_strempty(obj_get_label(obj)))
{
if (obj_get_label_alignment(obj) == AB_ALIGN_UNDEF)
{
return bad_obj(obj, "label alignment");
}
}
break;
case AB_TYPE_CHOICE:
if (check_attachments(obj) < 0)
{
return bad_obj(obj, "attachment");
}
if (obj_get_orientation(obj) == AB_ORIENT_UNDEF)
{
return bad_obj(obj, "orientation");
}
if (!util_strempty(obj_get_label(obj)))
{
if (obj_get_label_position(obj) == AB_CP_UNDEF)
{
return bad_obj(obj, "label position");
}
}
break;
case AB_TYPE_SEPARATOR:
if (check_attachments(obj) < 0)
{
return bad_obj(obj, "attachment");
}
if (obj_get_orientation(obj) == AB_ORIENT_UNDEF)
{
return bad_obj(obj, "orientation");
}
break;
case AB_TYPE_SCALE:
if (check_attachments(obj) < 0)
{
return bad_obj(obj, "attachment");
}
if ((obj_get_orientation(obj) == AB_ORIENT_UNDEF) ||
(obj_get_direction(obj) == AB_DIR_UNDEF))
{
return bad_obj(obj, "orientation");
}
if (!util_strempty(obj_get_label(obj)))
{
if (obj_get_label_position(obj) == AB_CP_UNDEF)
{
return bad_obj(obj, "label position");
}
}
break;
case AB_TYPE_ACTION:
if (obj_get_func_type(obj) == AB_FUNC_UNDEF)
{
return bad_obj(obj, "func type");
}
switch (obj_get_func_type(obj))
{
case AB_FUNC_BUILTIN:
if (obj_get_func_builtin(obj) == AB_STDACT_UNDEF)
{
return bad_obj(obj, "builtin action type");
}
break;
case AB_FUNC_USER_DEF:
if (obj_get_func_name(obj) == NULL)
{
return bad_obj(obj, "function name");
}
break;
case AB_FUNC_CODE_FRAG:
if (obj_get_func_code(obj) == NULL)
{
return bad_obj(obj, "user code");
}
break;
}
if (obj_get_from(obj) == NULL)
{
return bad_obj(obj, "from");
}
if (obj_get_func_type(obj) == AB_FUNC_BUILTIN)
{
if (obj_get_to(obj) == NULL)
{
return bad_obj(obj, "to");
}
}
if (obj_get_when(obj) == AB_WHEN_UNDEF)
{
return bad_obj(obj, "when");
}
if (obj_get_arg_type(obj) == AB_ARG_UNDEF)
{
return bad_obj(obj, "arg type");
}
break;
case AB_TYPE_COMBO_BOX:
if (check_attachments(obj) < 0)
{
return bad_obj(obj, "attachment");
}
if (!util_strempty(obj_get_label(obj)))
{
if (obj_get_label_position(obj) == AB_CP_UNDEF)
{
return bad_obj(obj, "label position");
}
}
break;
case AB_TYPE_SPIN_BOX:
if (check_attachments(obj) < 0)
{
return bad_obj(obj, "attachment");
}
if (!util_strempty(obj_get_label(obj)))
{
if (obj_get_label_position(obj) == AB_CP_UNDEF)
{
return bad_obj(obj, "label position");
}
}
break;
case AB_TYPE_LIST:
if (check_attachments(obj) < 0)
{
return bad_obj(obj, "attachment");
}
if (!util_strempty(obj_get_label(obj)))
{
if (obj_get_label_position(obj) == AB_CP_UNDEF)
{
return bad_obj(obj, "label position");
}
}
break;
case AB_TYPE_TEXT_FIELD:
if (check_attachments(obj) < 0)
{
return bad_obj(obj, "attachment");
}
if (!util_strempty(obj_get_label(obj)))
{
if (obj_get_label_position(obj) == AB_CP_UNDEF)
{
return bad_obj(obj, "label position");
}
}
break;
case AB_TYPE_DIALOG:
if (obj_get_win_parent(obj) != NULL)
{
if (obj_verify(obj_get_win_parent(obj)) < 0)
{
return bad_obj(obj, "win_parent");
}
}
break;
case AB_TYPE_FILE_CHOOSER:
if (obj_get_file_type_mask(obj) == AB_FILE_TYPE_MASK_UNDEF)
{
return bad_obj(obj, "file_type_mask");
}
break;
case AB_TYPE_LAYERS:
case AB_TYPE_TEXT_PANE:
case AB_TYPE_DRAWING_AREA:
if (check_attachments(obj) < 0)
{
return bad_obj(obj, "attachment");
}
break;
default:
break;
}
/*
* Windows should not have other objects as parents.
* :win-children attribute handles associating popups with main windows
*/
if (obj_is_window(obj))
{
ABObj parent = obj_get_parent(obj);
ABObj root_window = obj_get_root_window(project);
ABObj win_parent = obj_get_win_parent(obj);
if (!obj_is_module(parent))
{
return bad_obj(obj, "parent");
}
if ((win_parent != NULL) && (!obj_is_window(win_parent)))
{
return bad_obj(obj, "win_parent");
}
}
/*
* messages should be parented to the module
*/
if (obj_is_message(obj))
{
if (!obj_is_module(obj_get_parent(obj)))
{
return bad_obj(obj, "parent");
}
}
/*
* As a final check, see if we can determine what attributes this
* object needs.
*/
if (get_object_attrs(obj) == NULL)
{
return bad_obj(obj, "BIL attributes");
}
return 0;
}
/*
* Prints out a message about a bad object and possibly aborts
*/
static int bad_obj_msg(
ABObj obj,
STRING fieldName,
int return_value,
STRING file,
int line
)
{
char name[1024];
*name = 0;
util_dprintf(1, "Bad %s (%s:%d)! %s\n",
fieldName, file, line, obj_get_safe_name(obj, name, 1024));
util_dabort(5);
return return_value;
}
static BOOL
attachment_is_ok(
ABObj obj,
AB_COMPASS_POINT attach_dir
)
{
AB_ATTACH_TYPE attach_type = AB_ATTACH_UNDEF;
ABObj attach_obj = NULL;
BOOL attachment_ok = TRUE;
attach_type = obj_get_attach_type(obj, attach_dir);
switch (attach_type)
{
case AB_ATTACH_OBJ:
case AB_ATTACH_ALIGN_OBJ_EDGE:
attach_obj = (ABObj)obj_get_attach_value(obj, attach_dir);
if (obj_verify(attach_obj) < 0)
attachment_ok = FALSE;
break;
}
return (attachment_ok);
}
static int
check_attachments(
ABObj obj
)
{
int iRet = 0;
ABObj parent = NULL;
if (obj == NULL)
return iRet;
if (obj_get_parent(obj) != NULL)
parent = obj_get_root(obj_get_parent(obj));
if ( obj_is_group_member(obj) &&
((obj_get_group_type(parent) == AB_GROUP_COLUMNS) ||
(obj_get_group_type(parent) == AB_GROUP_ROWS) ||
(obj_get_group_type(parent) == AB_GROUP_ROWSCOLUMNS))
)
{
if (obj_has_flag(obj_get_module(obj), MappedFlag))
{
if (!attachment_is_ok(obj, AB_CP_NORTH) ||
!attachment_is_ok(obj, AB_CP_SOUTH) ||
!attachment_is_ok(obj, AB_CP_EAST) ||
!attachment_is_ok(obj, AB_CP_WEST))
{
iRet = -1;
}
}
}
else
{
if( !attachment_is_ok(obj, AB_CP_NORTH) ||
!attachment_is_ok(obj, AB_CP_SOUTH) ||
!attachment_is_ok(obj, AB_CP_EAST) ||
!attachment_is_ok(obj, AB_CP_WEST) )
{
iRet = -1;
}
}
return iRet;
}
/* REMIND: move to libAButil */
static int
util_dabort_impl(int debug_abort_level)
{
if (debug_level() >= debug_abort_level)
{
abort();
return -1; /* shouldn't execute */
}
return 0;
}
#endif /* DEBUG */