mc/xv/support/xview_private/item_impl.h
1998-02-27 04:54:42 +00:00

330 lines
14 KiB
C

/* @(#)item_impl.h 20.53 92/06/01 SMI */
/*
* (c) Copyright 1989 Sun Microsystems, Inc. Sun design patents
* pending in the U.S. and foreign countries. See LEGAL NOTICE
* file for terms of the license.
*/
#ifndef _xview_private_item_impl_already_included
#define _xview_private_item_impl_already_included
/* panels and panel_items are both of type Xv_panel_or_item so that we
* can pass them to common routines.
*/
#define ITEM_PRIVATE(i) XV_PRIVATE(Item_info, Xv_item, i)
#define ITEM_PUBLIC(item) XV_PUBLIC(item)
/* Item status flags. (Used in ip->flags.)
*
* N.B.: Definitions marked with a "!P!" are ALSO used in the flags variable
* in the Panel_info structure (i.e., panel->flags).
*/
#define IS_PANEL 0x00000001 /* object is a panel !P! */
#define IS_ITEM 0x00000002 /* object is an item */
#define HIDDEN 0x00000004 /* item is not currently displayed */
#define ITEM_X_FIXED 0x00000008 /* item's x coord fixed by user */
#define ITEM_Y_FIXED 0x00000010 /* item's y coord fixed by user */
#define LABEL_X_FIXED 0x00000020 /* label x coord fixed by user */
#define LABEL_Y_FIXED 0x00000040 /* label y coord fixed by user */
#define VALUE_X_FIXED 0x00000080 /* value x coord fixed by user */
#define VALUE_Y_FIXED 0x00000100 /* value y coord fixed by user */
#define CREATED 0x00000200 /* XV_END_CREATE received */
#define WANTS_KEY 0x00000400 /* item wants keystroke events !P! */
#define WANTS_ADJUST 0x00000800 /* item wants ACTION_ADJUST events */
#define BUSY_MODIFIED 0x00001000 /* the BUSY flag was modified via xv_set */
#define DEAF 0x00002000 /* item doesn't want any events */
#define INVOKED 0x00004000
#define LABEL_INVERTED 0x00020000 /* invert the label !P! */
#define PREVIEWING 0x00080000
#define BUSY 0x00100000
#define INACTIVE 0x00200000
#define IS_MENU_ITEM 0x00400000 /* paint item like a menu item */
#define WANTS_ISO 0x00800000 /* item wants all ISO characters */
#define UPDATE_SCROLL 0x01000000 /* need to update scroll size */
#define POST_EVENTS 0x02000000 /* send events through the notifier */
#ifdef OW_I18N
#define WCHAR_NOTIFY 0x04000000 /* wide char version of notify proc */
#define IC_ACTIVE 0x08000000 /* indicate if item should ignore IM */
#endif /* OW_I18N */
#define hidden(ip) ((ip)->flags & HIDDEN ? TRUE : FALSE)
#define busy(ip) ((ip)->flags & BUSY ? TRUE : FALSE)
#define busy_modified(ip) ((ip)->flags & BUSY_MODIFIED ? TRUE : FALSE)
#define inactive(ip) ((ip)->flags & INACTIVE ? TRUE : FALSE)
#define invoked(ip) ((ip)->flags & INVOKED ? TRUE : FALSE)
#define item_fixed(ip) ((ip)->flags & (ITEM_X_FIXED | ITEM_Y_FIXED) ? TRUE : FALSE)
#define label_fixed(ip) ((ip)->flags & (LABEL_X_FIXED|LABEL_Y_FIXED) ? TRUE : FALSE)
#define value_fixed(ip) ((ip)->flags & (VALUE_X_FIXED|VALUE_Y_FIXED) ? TRUE : FALSE)
#define created(ip) ((ip)->flags & CREATED ? TRUE : FALSE)
#define is_menu_item(ip) ((ip)->flags & IS_MENU_ITEM ? TRUE : FALSE)
#define wants_iso(object) ((object)->flags & WANTS_ISO ? TRUE : FALSE)
#define wants_key(object) ((object)->flags & WANTS_KEY ? TRUE : FALSE)
#define wants_adjust(object) ((object)->flags & WANTS_ADJUST ? TRUE : FALSE)
#define label_inverted_flag(object) ((object)->flags & LABEL_INVERTED ? TRUE : FALSE)
#define deaf(object) ((object)->flags & DEAF ? TRUE : FALSE)
#define is_panel(object) ((object)->flags & IS_PANEL ? TRUE : FALSE)
#define is_item(object) ((object)->flags & IS_ITEM ? TRUE : FALSE)
#define previewing(object) ((object)->flags & PREVIEWING ? TRUE : FALSE)
#define update_scroll(object) ((object)->flags & UPDATE_SCROLL ? TRUE : FALSE)
#define post_events(object) ((object)->flags & POST_EVENTS ? TRUE : FALSE)
#ifdef OW_I18N
#define wchar_notify(object) ((object)->flags & WCHAR_NOTIFY ? TRUE : FALSE)
#define ic_active(object) ((object)->flags & IC_ACTIVE ? TRUE : FALSE)
#endif /* OW_I18N */
/* miscellaneous constants */
#define BIG 0x7FFF
#define KEY_NEXT KEY_BOTTOMRIGHT
#define ITEM_X_GAP 10 /* # of x pixels between items */
#define ITEM_Y_GAP 13 /* # of y pixels between items rows */
#define LABEL_X_GAP 8 /* used in panel_attr.c */
#define LABEL_Y_GAP 4 /* used in panel_attr.c */
/* structures */
/*********************** panel_image **************************************/
typedef enum {
PIT_SVRIM,
PIT_STRING
} Panel_image_type;
typedef struct panel_image {
Panel_image_type im_type;
unsigned int inverted : 1; /* true to invert the image */
unsigned int boxed : 1; /* true to enclose image in a box */
union {
struct {
char *text;
#ifdef OW_I18N
CHAR *text_wc;
#endif /* OW_I18N */
Xv_font font;
short bold; /* TRUE if text should be bold */
Graphics_info *ginfo;
} t; /* PIT_STRING arm */
Server_image svrim; /* PIT_SVRIM arm */
} im_value;
int color; /* -1 => use foreground color */
} Panel_image;
#define image_type(image) ((image)->im_type)
#define image_inverted(image) ((image)->inverted)
#define image_boxed(image) ((image)->boxed)
#define is_string(image) (image_type(image) == PIT_STRING)
#define is_svrim(image) (image_type(image) == PIT_SVRIM)
#define image_string(image) ((image)->im_value.t.text)
#ifdef OW_I18N
#define image_string_wc(image) ((image)->im_value.t.text_wc)
#endif /* OW_I18N */
#define image_font(image) ((image)->im_value.t.font)
#define image_bold(image) ((image)->im_value.t.bold)
#define image_ginfo(image) ((image)->im_value.t.ginfo)
#define image_svrim(image) ((image)->im_value.svrim)
#define image_color(image) ((image)->color)
#define image_set_type(image, type) (image_type(image) = type)
#define image_set_string(image, string) (image_string(image) = (string))
#ifdef OW_I18N
#define image_set_string_wc(image, string) (image_string_wc(image) = (string))
#endif /* OW_I18N */
#define image_set_svrim(image, svrim) (image_svrim(image) = (svrim))
#define image_set_bold(image, bold) (image_bold(image) = (bold) != 0)
#define image_set_inverted(image, inverted) (image_inverted(image) = (inverted) != 0)
#define image_set_boxed(image, boxed) (image_boxed(image) = (boxed) != 0)
#define image_set_color(image, color) (image_color(image) = color)
/*************************** panel item ***********************************/
/* *** NOTE: The first three fields of the item_info struct must match those
* of the panel_info struct, since these are used interchangably in some
* routines.
*/
typedef struct item_info {
/**** DO NOT CHANGE THE ORDER OR PLACEMENT OF THESE THREE FIELDS ****/
Panel_ops ops; /* item type specific operations */
unsigned int flags; /* boolean attributes */
Panel_item public_self; /* back pointer to object */
/**** ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ****/
Panel_item child_kbd_focus_item;
/* NULL: no embedded panel item that
* wants the keyboard focus instead
* of the parent item.
* other: Setting PANEL_CARET_ITEM to
* the parent item causes the embedded
* panel item 'child_kbd_focus_item'
* to receive the input focus. */
Xv_opaque client_data; /* for client use */
int color_index; /* for color panel items */
Panel_item_type item_type; /* type of this item */
Panel_image label; /* the label */
Rect label_rect; /* enclosing label rect */
int label_width; /* desired label width
* (0= fit to image) */
Panel_setting layout; /* HORIZONTAL, VERTICAL */
Xv_opaque menu;
struct item_info *next; /* next item */
int (*notify)(); /* notify proc */
int notify_status; /* notify proc status: XV_OK or
* XV_ERROR */
Panel_item owner; /* NULL: created by application
* other: item that created this item */
Rect painted_rect; /* painted area in the pw */
struct panel_info *panel; /* panel subwindow for the item */
struct item_info *previous; /* previous item */
Rect rect; /* enclosing item rect */
Panel_setting repaint; /* item's repaint behavior */
Xv_Font value_font; /* = panel->std_font by default */
#ifdef OW_I18N
XFontSet value_fontset_id; /* = panel->std_fontset_id by
default */
#else
XID value_font_xid; /* = panel->std_font_xid by default */
#endif /* OW_I18N */
Graphics_info *value_ginfo; /* OLGX graphics information */
Rect value_rect; /* enclosing value rect */
int x_gap; /* horizontal space to previous item
* (-1 = use panel->item_x_offset) */
int y_gap; /* vertical space to previous item
* (-1 = use panel->item_y_offset) */
#ifdef OW_I18N
int (*notify_wc)(); /* wide char version of notify proc */
#endif /* OW_I18N */
} Item_info;
/************************************************************************
* Panel Package private functions *
************************************************************************/
Pkg_private int item_init();
Pkg_private Xv_opaque item_set_avlist();
Pkg_private Xv_opaque item_get_attr();
Pkg_private int item_destroy();
/************************************************************************
* Panel text item private macros, constants, and data structures *
************************************************************************/
/* Macros */
#define TEXT_PRIVATE(item) \
XV_PRIVATE(Text_info, Xv_panel_text, item)
#define TEXT_PUBLIC(item) XV_PUBLIC(item)
#define TEXT_FROM_ITEM(ip) TEXT_PRIVATE(ITEM_PUBLIC(ip))
/* Constants */
#define PV_HIGHLIGHT TRUE
#define PV_NO_HIGHLIGHT FALSE
#define BOX_Y 2
#define LINE_Y 1
#define SCROLL_BTN_GAP 3 /* space between Scrolling Button and text */
/* dp->flags masks */
#define SELECTING_ITEM 0x00000001
#define TEXT_HIGHLIGHTED 0x00000002
#define UNDERLINED 0x00000004
#define PTXT_READ_ONLY 0x00000008
#define TEXT_SELECTED 0x00000010
/* text item has a nonzero length primary seleciton */
#define LEFT_SCROLL_BTN_SELECTED 0x00000020
#define RIGHT_SCROLL_BTN_SELECTED 0x00000040
#define SELECTING_SCROLL_BTN 0x00000080
#define SELECTION_REQUEST_FAILED 0x00000100
#ifdef OW_I18N
#define STORED_LENGTH_WC 0x00000200 /* TRUE stored in wchar, FALSE mb */
#endif /* OW_I18N */
#define DRAG_MOVE_FILENAME 0x00000001
#define DRAG_MOVE_TEXT 0x00000002
#define DROP_OR_PASTE_FAILED 0x00000004
typedef enum {
HL_NONE,
HL_UNDERLINE,
HL_STRIKE_THRU,
HL_INVERT
} Highlight;
typedef enum {
INVALID, /* UNDO => do nothing on */
INSERT, /* UNDO => insert contents of undo_buffer into dp->value */
DELETE /* UNDO => delete contents of undo_buffer from dp->value */
} Undo_direction;
typedef struct {
Panel_item public_self;/* back pointer to object */
int caret_offset; /* caret's x offset from right margin
* of left arrow (which may be blank).
* -1 = invalid. */
int caret_position; /* caret's character position */
u_char delete_pending; /* primary selection is
* pending-delete */
int display_length; /* in characters */
int display_width; /* in pixels */
#ifndef OW_I18N
Selection_item dnd_item; /* Drag and Drop Selection Item */
#endif
int dnd_sel_first; /* index of first char in dnd selection */
int dnd_sel_last; /* index of last char in dnd selection */
Drag_drop dnd; /* Drag and Drop object */
Drop_site_item drop_site; /* Drag and Drop Site item */
int ext_first; /* first char of extended word */
int ext_last; /* last char of extended word */
int first_char; /* first displayed character */
int flags;
int font_home;
int last_char; /* last displayed character */
struct timeval last_click_time;
char mask;
Panel_setting notify_level; /* NONE, SPECIFIED, NON_PRINTABLE,
* ALL */
int scroll_btn_height; /* Abbrev_MenuButton_Height() */
int scroll_btn_width; /* Abbrev_MenuButton_Width() + space */
unsigned long sel_length_data; /* length of selection */
unsigned long sel_yield_data; /* sel yield data -old sel package*/
int select_click_cnt[2]; /* nbr of select mouse clicks
* pending (primary, secondary) */
int select_down_x;
/* x coordinate of SELECT-down event. Used in determining when to
* initiate a drag and drop operation. */
int select_down_y;
/* y coordinate of SELECT-down event. Used in determining when to
* initiate a drag and drop operation. */
int seln_first[2]; /* index of first char selected
* (primary, secondary) */
int seln_last[2]; /* index of last char selected
* (primary, secondary) */
int stored_length;
char *terminators;
Rect text_rect; /* rect containing text (i.e., not arrows) */
char *undo_buffer;
Undo_direction undo_direction; /* Insert or delete the contents
* of the undo_buffer to or from
* dp->value, or undo_buffer is
* invalid */
char *value;
int value_offset; /* right margin of last displayed
* char (x offset from right margin
* of left arrow) */
#ifdef OW_I18N
wchar_t mask_wc;
int saved_caret_offset; /* caret's x offset, saved when
* conv mode on and commit. */
int saved_caret_position; /* caret's character position */
/* saved when conv mode on and commit */
wchar_t *undo_buffer_wc; /* wide char form of undo
buffer */
wchar_t *value_wc; /* wide char form of panel
value */
wchar_t *terminators_wc; /* wide char form of
terminating characters */
#endif /*OW_I18N*/
} Text_info;
#endif