campo-sirio/xi/xilm.h
alex ebabab8c26 This commit was generated by cvs2svn to compensate for changes in r5761,
which included commits to RCS files with non-trunk default branches.

git-svn-id: svn://10.65.10.50/trunk@5762 c028cbd2-c16b-5b4b-a496-9718f37d4682
1997-12-17 12:57:49 +00:00

680 lines
20 KiB
C
Executable File

/*******************************************************************************
* Copyright 1991-1996 by ORCA Software, Inc. *
* *
* All rights reserved. May not be reproduced or distributed, in printed or *
* electronic form, without permission of ORCA Software, Inc. May not be *
* distributed as object code, separately or linked with other object modules, *
* without permission. *
*******************************************************************************/
/******************************************************************
LM module
******************************************************************/
#define LM_ATR_ENABLED XI_ATR_ENABLED
#define LM_ATR_VISIBLE XI_ATR_VISIBLE
#define LM_ATR_NAVIGATE XI_ATR_NAVIGATE
#define LM_ATR_TABWRAP XI_ATR_TABWRAP
/*-------------------------------------------------------------------------
function: lm_adj_v
lmp: current lmp
v: to vertical coord to convert
-------------------------------------------------------------------------*/
#define lm_adj_v(lmp, v) (v = v + lmp->mlr.top + lmp->rrr_offset)
typedef enum _lm_cb_type
{
LM_CB_CHAR,
LM_CB_CHANGE,
LM_CB_DBL,
LM_CB_FOCUS,
LM_CB_TEXT,
LM_CB_SELECT,
LM_CB_CELL_BTN,
LM_CB_GET_FIRST,
LM_CB_GET_NEXT,
LM_CB_GET_PREV,
LM_CB_GET_LAST,
LM_CB_GET_PERCENT,
LM_CB_REC_ALLOCATE,
LM_CB_REC_FREE,
LM_CB_ROW_SIZE,
LM_CB_COL_DELETE,
LM_CB_COL_MOVE,
LM_CB_COL_SIZE,
LM_CB_DROP_ROW
}
LM_CB_TYPE;
typedef struct _lm_cb_data
{
LM lm;
LM_CB_TYPE cb_type;
int cid;
XinWindow win;
int row;
int column;
long rec;
union
{
struct
{
long spec_rec;
long data_rec;
int percent;
unsigned long attrib;
XinColor color;
BOOLEAN refused;
int row_height;
BOOLEAN has_focus;
} rec_request;
struct
{
int new_row_height;
BOOLEAN refused;
} row_size;
struct
{
long record;
} rec_allocate;
struct
{
long record;
} rec_free;
struct
{
long record;
int percent;
} get_percent;
struct
{
char *text;
int len;
int icon_rid;
XI_BITMAP* bitmap;
unsigned long attrib;
XinColor color;
XinColor back_color;
XinFont *font;
BOOLEAN button;
BOOLEAN button_on_left;
BOOLEAN button_on_focus;
BOOLEAN button_full_cell;
int button_icon_rid;
XI_BITMAP* button_bitmap;
void *font_id;
} text;
BOOLEAN refused;
struct
{
int ch;
BOOLEAN shift;
BOOLEAN control;
BOOLEAN alt;
BOOLEAN is_paste;
BOOLEAN refused;
} chr;
struct
{
BOOLEAN dbl_click;
BOOLEAN selected;
BOOLEAN refused;
BOOLEAN shift;
BOOLEAN control;
int column;
} select;
struct
{
BOOLEAN shift;
BOOLEAN control;
} cell_btn;
struct
{
int new_col_nbr;
BOOLEAN in_fixed;
int new_col_width;
int new_col_pixel_width;
BOOLEAN refused;
} column;
struct
{
XI_OBJ* src_list;
long src_rec;
BOOLEAN after_all_rows;
BOOLEAN delete_row;
BOOLEAN shift;
BOOLEAN control;
} drop_row;
/* nothing for LM_CB_CHANGE */
} v;
} LM_CB_DATA;
typedef void ( *LM_CB ) ( LM_CB_DATA * lm_cb_data );
#define LM_COL_ATR_ENABLED XI_ATR_ENABLED
#define LM_COL_ATR_EDITMENU XI_ATR_EDITMENU
#define LM_COL_ATR_AUTOSELECT XI_ATR_AUTOSELECT
#define LM_COL_ATR_AUTOSCROLL XI_ATR_AUTOSCROLL
#define LM_COL_ATR_RJUST XI_ATR_RJUST
#define LM_COL_ATR_READONLY XI_ATR_READONLY
#define LM_COL_ATR_PASSWORD XI_ATR_PASSWORD
#define LM_COL_ATR_SELECTED XI_ATR_SELECTED
#define LM_COL_ATR_SELECTABLE XI_ATR_SELECTABLE
#define LM_COL_ATR_COL_SELECTABLE XI_ATR_COL_SELECTABLE
#define LM_COL_ATR_VISIBLE XI_ATR_VISIBLE
#define LM_ROW_ATR_ENABLED XI_ATR_ENABLED
#define LM_ROW_ATR_SELECTED XI_ATR_SELECTED
#define LM_CELL_ATR_SELECTED XI_ATR_SELECTED
#define LM_CELL_ATR_RJUST XI_ATR_RJUST
#define LM_CELL_ATR_HCENTER XI_ATR_HCENTER
typedef struct _lm_column_data
{
unsigned long attrib;
short pix_width;
short x_pix_pos;
short text_size;
char *heading_text;
short width;
BOOLEAN center_heading;
BOOLEAN heading_well;
BOOLEAN heading_platform;
BOOLEAN column_well;
BOOLEAN column_platform;
XinFont *font;
int icon_rid;
short icon_x;
short icon_y;
XI_BITMAP* bitmap;
BOOLEAN size_rows;
BOOLEAN suppress_update_heading;
BOOLEAN suppress_update_cells;
BOOLEAN vertical_align_center;
BOOLEAN vertical_align_bottom;
BOOLEAN wrap_text;
BOOLEAN wrap_text_scrollbar;
BOOLEAN cr_ok;
BOOLEAN var_len_text;
BOOLEAN auto_tab;
XI_ICON_MODE_TYPE icon_mode;
BOOLEAN pushed;
/* temporary variables - don't assume this is good */
XinRect column_rct; /* used for caching column rectangles to speed
* drawing */
XinRect prct; /* physical rect */
BOOLEAN XinWindowPaintNeeds;
} LM_COLUMN_DATA;
typedef struct _lm_column_def
{
unsigned long attrib;
short position;
short pix_width; /* pixels */
short text_size;
char *heading_text;
BOOLEAN center_heading;
BOOLEAN heading_well;
BOOLEAN heading_platform;
BOOLEAN column_well;
BOOLEAN column_platform;
XinFont *font;
int icon_rid;
short icon_x;
short icon_y;
XI_BITMAP* bitmap;
BOOLEAN size_rows;
BOOLEAN suppress_update_heading;
BOOLEAN suppress_update_cells;
BOOLEAN vertical_align_center;
BOOLEAN vertical_align_bottom;
BOOLEAN wrap_text;
BOOLEAN wrap_text_scrollbar;
BOOLEAN cr_ok;
BOOLEAN var_len_text;
BOOLEAN auto_tab;
XI_ICON_MODE_TYPE icon_mode;
} LM_COLUMN_DEF;
typedef struct _lm_def
{
int cid;
XI_OBJ *list_obj;
XI_OBJ *itf_obj;
/* XI may specify this */
XinPoint pnt;
short pixel_height;
/* If absolute height is set, then the height of the list will be exactly
* height pixels high */
BOOLEAN absolute_height;
short pixel_width;
short pix_char_width;
unsigned long attrib;
LM_CB lm_cb;
XinFont *font;
BOOLEAN is_list_font; /* False, if "font" is from the interface or system */
XinColor enabled_color; /* but inactive */
XinColor back_color;
XinColor disabled_color;
XinColor disabled_back_color;
XinColor active_color;
XinColor active_back_color;
XinColor white_space_color;
XinColor rule_color;
char *parent;
BOOLEAN no_heading;
BOOLEAN one_row_list;
int nbr_rows;
int realized_rows_array_len;
BOOLEAN sizable_columns;
BOOLEAN movable_columns;
short fixed_columns;
short min_cell_height;
short min_heading_height;
BOOLEAN no_horz_lines;
BOOLEAN no_vert_lines;
int first_vis_column;
BOOLEAN drop_and_delete;
BOOLEAN select_cells;
BOOLEAN fixed_row_height;
BOOLEAN sizable_rows;
BOOLEAN get_all_records;
BOOLEAN resize_with_window;
int horz_sync_list;
int vert_sync_list;
BOOLEAN row_focus_border;
XinColor row_focus_border_color;
int max_lines_in_cell;
BOOLEAN single_select;
BOOLEAN retain_back_color_on_select;
BOOLEAN drag_and_drop_rows;
BOOLEAN drag_rows_autoscroll;
BOOLEAN button_on_cell_focus;
int position_by_typing_cid;
} LM_DEF;
#define LM_HEADING_TEXT 1001
typedef enum
{
LM_LIST,
LM_ROW,
LM_COLUMN,
LM_CELL
}
LM_PART;
typedef struct _lm_cell_data
{
unsigned long attrib;
XinFont *font;
XinColor color;
XinColor back_color;
int icon_rid;
XI_BITMAP* bitmap;
BOOLEAN button;
BOOLEAN button_on_left;
BOOLEAN button_on_focus;
BOOLEAN button_full_cell;
int button_icon_rid;
XI_BITMAP* button_bitmap;
BOOLEAN valid_data;
int font_height;
XI_TEXT *xi_text;
} LM_CELL_DATA;
typedef struct _lm_data
{
int cid;
XinWindow win;
XinRect rct;
short pix_top;
short pix_hdr_bottom;
short pix_row1_top;
short pix_char_width;
short pix_cell_height;
short pix_row_spacing;
unsigned long attrib;
short nbr_columns;
LM_COLUMN_DATA **lm_column_data;
XinColor back_color;
XinColor enabled_color; /* but inactive */
XinColor disabled_color;
XinColor disabled_back_color;
XinColor active_color;
XinColor active_back_color;
XinColor white_space_color;
XinColor rule_color;
BOOLEAN no_heading;
BOOLEAN sizable_columns;
BOOLEAN movable_columns;
short fixed_columns;
short pixel_width;
short pixel_height;
BOOLEAN moving_column;
BOOLEAN sizing_column;
int column_being_sized;
short min_cell_height;
short min_heading_height;
BOOLEAN no_horz_lines;
BOOLEAN no_vert_lines;
BOOLEAN drop_and_delete;
BOOLEAN select_cells;
BOOLEAN selecting_text;
BOOLEAN sizing_row;
BOOLEAN resize_with_window;
int row_being_sized;
int horz_sync_list;
int vert_sync_list;
BOOLEAN row_focus_border;
XinColor row_focus_border_color;
int max_lines_in_cell;
BOOLEAN single_select;
BOOLEAN retain_back_color_on_select;
BOOLEAN drag_and_drop_rows;
BOOLEAN drag_rows_autoscroll;
BOOLEAN button_on_cell_focus;
int position_by_typing_cid;
/* run time data */
LM_CB lm_cb;
XI_OBJ *list_obj;
XI_OBJ *itf_obj;
XinFont *font;
BOOLEAN is_list_font; /* False, if "font" is from the interface or system */
BOOLEAN have_mouse;
int column_being_moved;
int last_x;
int last_y;
BOOLEAN down_in_hscrolling;
BOOLEAN in_hscrolling;
BOOLEAN last_in_hscrolling;
XI_OBJ* last_itf;
int org_x;
int org_y;
int ascent;
int descent;
int leading;
BOOLEAN selecting_cells;
int down_row;
int down_column;
int cur_row;
int cur_column;
BOOLEAN down_on_disabled;
int delta_x;
int first_vis;
int last_vis;
int vir_left;
int vir_right;
BOOLEAN btn_down; /* or up */
BOOLEAN down_in_btn;
int btn_down_row;
int btn_down_col;
int update_rows_at_top;
int update_rows_at_bottom;
BOOLEAN update_cells_only;
BOOLEAN text_scrolling;
int old_row_height;
BOOLEAN horizontally_scrolling_list;
struct _lm_focus_state *focus_state;
XinFont *cur_font;
BOOLEAN have_last_rec;
long last_rec;
BOOLEAN down_in_heading;
/* vertical scrolling information */
XinRect mlr;
int mlr_height;
int rrr_offset; /* offset of mlr */
int rrr_bottom; /* total number of vertical pixels in realized
* row rect */
int nbr_rows; /* visible, specified by XI */
int realized_rows_array_len; /* also specified by XI */
int nbr_realized_rows; /* number of rows actually used in realized row
* array */
int first_fully_vis;
int last_fully_vis;
BOOLEAN fixed_row_height;
BOOLEAN sizable_rows;
BOOLEAN get_all_records;
BOOLEAN in_cell_request; /* Hold on to text for a cell, in case application wants */
int cell_request_row; /* to know what we had last. */
int cell_request_col;
char *cell_request_text;
/* the following arrays are all allocated to the length of
* realized_rows_array_len */
long *recs;
int *pix_offsets; /* pixel offsets of each row */
int *pix_heights; /* pixel heights of each row */
BOOLEAN *set_heights;
unsigned long *row_attribs;
XinColor *row_colors;
LM_CELL_DATA **cell_data;
/* Drag and Drop Rows information */
XinPoint down_pt;
BOOLEAN down_in_row;
BOOLEAN dragging_row;
long rec_being_moved;
int drag_row_height;
BOOLEAN delay_select;
int delay_row;
int delay_column;
BOOLEAN delay_dbl;
char *position_by_typing_buf;
} LM_DATA;
#define NULL_LM (LM)0
/*
Activities to test
1. Resize list
2. Resize column
3. Move columns around
4. Add columns
5. Delete columns
6. xi_cell_request
7. Tab around
8. Horizontal scroll
9. Vertical scroll
10. Drop horizontal thumb
11. Drop vertical thumb
12. Select range of cells
13. Set font on range of cells
14. Click on partially vis column
15. Size row
16. Change wrapping of text in cell
*/
typedef struct _lm_scroll_arg
{
LM lm;
int nbr_lines;
int percent;
BOOLEAN same_cell;
long rec;
BOOLEAN have_rec;
XinColor color;
unsigned long attrib;
int row_height;
BOOLEAN rec_at_top;
int pixels_scrolled; /* this is a return value from lm_scroll */
} LM_SCROLL_ARG;
void calculate_pix_offsets( LM_DATA * lmp, BOOLEAN draw_changes );
void calculate_visibles( LM_DATA * lmp );
void calc_x_pix_pos( LM lm, LM_COLUMN_DATA * lcdata, int position );
BOOLEAN
do_lm_cb( LM lm, LM_CB_TYPE cb_reason, int row, int column,
XinEvent * ep, int *percent, int pixels );
BOOLEAN
do_lm_cb_get( LM lm, LM_CB_TYPE cb_reason, long *spec_rec,
long *data_rec, int percent, XinColor * color,
unsigned long *attrib, int *row_height );
void do_lm_cb_text( LM_DATA * lmp, int row, int col, BOOLEAN preserve_focus );
void do_scroll_bar( XI_LIST_DATA * listdata );
BOOLEAN lm_adj_h( LM_DATA * lmp, short *h );
void lm_allocate_rec_info( LM_DATA * lmp, int realized_rows_array_len );
void lm_calc_last_vis( LM_DATA * lmp );
int lm_calculate_row_height( LM_DATA * lmp, int row );
void lm_cell_request( LM lm, LM_PART lm_part, int idx1, int idx2 );
void lm_column_set_pixel_width( LM lm, int idx, int width );
LM lm_create( XinWindow win, LM_DEF * lm_def, void *parent );
void
lm_create_column( LM lm, LM_COLUMN_DEF * lm_column_def,
BOOLEAN do_cell_requests, BOOLEAN in_hscrolling );
void lm_cleanup( LM lm );
void lm_delete( LM lm );
void lm_delete_column( LM lm, int column_nbr, BOOLEAN adjust_hscrolling );
BOOLEAN lm_delete_row( LM lm, int row );
void lm_draw_line( LM_DATA * lmp, XinPoint p, BOOLEAN adj_v, BOOLEAN adj_h );
int lm_event( XI_OBJ* itf, LM lm, XinEvent * ep );
void
lm_focus_cb( long lm, int row, int column, BOOLEAN invisible,
BOOLEAN set );
unsigned long
lm_get_attrib( LM lm, LM_PART lm_part, int idx, int idx2,
BOOLEAN invisible );
int lm_get_buf_size( LM lm, LM_PART part, int idx );
int lm_get_cid( LM lm );
XinRect *
lm_get_cell_rect( XinRect * rctp, LM lm, int row, int col, BOOLEAN inner,
BOOLEAN physical_rct );
int lm_get_col_spacing( void );
int lm_get_fixed_columns( LM lm );
int lm_get_left_most_far_right_col( LM_DATA * lmp, int nbr_columns );
long *lm_get_list_info( LM lm, int *nbr_recs );
XI_OBJ *lm_get_list_obj( LM lm );
XinRect *lm_get_list_rct( LM_DATA * lmp, XinRect * r );
void
lm_get_metrics( XI_OBJ_DEF * obj_def, int *hborder, int *column_div,
int *list_bottom );
XinRect *lm_get_rect( LM lm, LM_PART part, int idx, XinRect * rct );
XinRect *lm_get_row_rect( XinRect * rctp, LM lm, int row );
void lm_get_sel( LM lm, int *c1, int *c2 );
char *
lm_get_text( LM lm, char *s, int len, int row, int column,
BOOLEAN invisible );
void
lm_get_vertical_metrics( XI_OBJ_DEF * obj_def, int *first_row_y,
int *row_spacing, int *client_height,
int *title_height );
void lm_get_visible_columns( LM lm, int *first_vis, int *last_vis );
int lm_get_visible_rows( LM lm, int *first_vis, int *last_vis );
int lm_hit_test( LM lm, XinEvent* ep, XinEvent* oevt, int* rowp, int* columnp,
BOOLEAN* is_vis, BOOLEAN* is_hit, BOOLEAN* is_part_vis );
void lm_hscroll( LM lm, int nbr_columns, int pos );
BOOLEAN lm_insert_row( LM lm, int row );
void lm_invalidate_rect( LM_DATA * lmp, XinRect * rctp, BOOLEAN adj_h );
void
lm_invalidate_rect2( LM_DATA * lmp, XinRect * rct_to_invalidate,
BOOLEAN adj_left );
void
lm_invalidate_rows( LM lm, int row_start, int row_end,
BOOLEAN invalidate );
void
lm_invalidate_rows_internal( LM lm, int row_start, int row_end,
BOOLEAN redraw, int column,
BOOLEAN preserve_focus_text );
void lm_local_hscroll( LM lm, int nbr_columns );
void lm_move_event( LM_DATA * lmp, XinEvent * ep );
void lm_drag_row_event( XI_OBJ* itf, LM_DATA* lmp, XinEvent* ep, XinEvent* oevp );
void lm_move_to( LM_DATA * lmp, XinPoint p, BOOLEAN adj_v, BOOLEAN adj_h );
void lm_recalc_metrics( LM lm );
void lm_redraw_row( LM_DATA * lmp, int row, BOOLEAN update );
void lm_remove_all_rows( LM_DATA * lm, BOOLEAN delete_focus );
BOOLEAN lm_row_has_focus( LM_DATA * lmp, int row, BOOLEAN is_vert_scrolled );
int lm_scroll( LM_SCROLL_ARG * arg );
void lm_scroll_rect( LM_DATA * lmp, XinRect * rctp, int dh, int dv );
void lm_set_fixed_columns( LM lm, int new_fixed_count );
void
lm_set_attrib( LM lm, LM_PART lm_part, int idx, int idx2,
BOOLEAN invisible, unsigned long attrib,
int half_baked );
void lm_set_buf_size( LM lm, LM_PART part, int idx, int size );
void lm_set_column_bitmap( LM lm, XI_BITMAP* bitmap, int cid );
void lm_set_column_icon( LM lm, int icon_rid, int cid );
void lm_set_column_width( LM lm, int idx, int width );
void
lm_set_color( LM lm, LM_PART part, int row, int column,
BOOLEAN invisible, XinColor color, BOOLEAN half_baked );
void lm_set_fixed_columns( LM lm, int new_fixed_count );
void lm_set_hscroll_bar( LM lm );
void lm_set_hscroll_range( LM lm );
void lm_set_bitmap( LM lm, XI_BITMAP* bitmap, int row, int column );
void lm_set_icon( LM lm, int icon_rid, int row, int column );
void lm_set_focus( LM lm, int row, int column );
void lm_set_font( LM lm, LM_PART part, int idx, int idx2, XinFont * font );
void lm_set_list_size( LM lm, int height, int width );
void lm_set_rect( LM lm, XinRect *rect );
void
lm_set_row_height( LM lm, int row, int height, BOOLEAN set_height,
int old_height, BOOLEAN only_update );
void
lm_set_sel( LM lm, int row, int column, BOOLEAN invisible, int c1,
int c2 );
void lm_set_text( LM lm, char *s, int row, int column, BOOLEAN invisible );
void lm_size_event( LM_DATA * lmp, XinEvent * ep );
void lm_text_scrolling( XI_OBJ * xi_obj );
void lm_wrap_text( LM_DATA * lmp, int row, int col, BOOLEAN set_font );
int lm_make_rrr_room_pix( LM_DATA * lmp, int pixels, BOOLEAN do_redraw );
BOOLEAN navigate_char_event( LM lm, XinEvent * ep );
void redraw_cell( LM lm, int row, int col, BOOLEAN update );
void
draw_cell_range( LM_DATA * lmp, int first_row, int last_row,
int first_col, int last_col,
BOOLEAN in_event_update );
XinRect *lm_get_scroll_rct( LM_DATA * lmp, XinRect * r );
void lm_do_rec_event( LM_DATA * lmp, int row, XI_EVENT_TYPE type );
void lm_row_copy( LM_DATA * lmp, int source_row, int dest_row );
void lm_adjust_rows( LM_DATA * lmp, int delta );
void set_focus_cell_rct( LM_DATA * lmp, int row, int col, BOOLEAN in_update_event );
XI_TEXT *lm_xi_text_focus_get( LM lm );
void lm_calculate_pix_offsets( LM lm );
void lm_xi_text_prect_get( LM_DATA * lmp, LM_COLUMN_DATA * column_data,
LM_CELL_DATA * cell_data, int row, int col, int col_offset,
int leading, int ascent, int descent, XinRect * rctp );
BOOLEAN lm_cr_is_ok( LM lm, int row, int col, BOOLEAN v_scrolled );
BOOLEAN lm_is_button_full_cell( LM lm, int row, int col );
void lm_xi_text_construct( LM_DATA * lmp, int row, int column );
#define LMP(l) ((LM_DATA *)(l))
#if XIWS == XIWS_WM
#define RULE_Y_OFFSET_TOP 0
#define RULE_Y_OFFSET_BOTTOM 0
#define BORDER_WIDTH 8
#define RULE_WIDTH_V 8 /* width of vertical lines */
#define RULE_WIDTH_H 0 /* width of horz lines */
#define HPIX_PER_CH 8
#define VPIX_PER_CH 8
#else
#define RULE_Y_OFFSET_TOP 1
#define RULE_Y_OFFSET_BOTTOM 1
#define BORDER_WIDTH 2
#define RULE_WIDTH_V 1
#define RULE_WIDTH_H 1
#define WIDTHLOOP(idx, wid) for (idx = 0; idx < wid; idx++)
#endif
#define CELL_IS_ENABLED(lm, row, col) (LIST_IS_ENABLED(lm) && COLUMN_IS_ENABLED(lm, col))
#define CELL_IS_SELECTED(lm, row, col) ((LMP(lm)->row_attribs[row] & LM_ROW_ATR_SELECTED) || (LMP(lm)->lm_column_data[col]->attrib & LM_COL_ATR_SELECTED) || \
(LMP(lm)->cell_data[row][col].attrib & LM_CELL_ATR_SELECTED))
#define CELL_IS_SELECTABLE(lm, row, col) (LMP(lm)->lm_column_data[col]->attrib & LM_COL_ATR_SELECTABLE)
#define LIST_IS_ENABLED(lm) ((LMP(lm)->attrib & (LM_ATR_ENABLED | LM_ATR_VISIBLE)) == (LM_ATR_ENABLED | LM_ATR_VISIBLE))
#define COLUMN_IS_ENABLED(lm, col) (LMP(lm)->lm_column_data[col]->attrib & LM_COL_ATR_ENABLED)
#define COLUMN_IS_SELECTABLE(lm, col) (LMP(lm)->lm_column_data[col]->attrib & LM_COL_ATR_COL_SELECTABLE)
#define COLUMN_IS_SELECTED(lm, col) (LMP(lm)->lm_column_data[col]->attrib & LM_COL_ATR_SELECTED)
#define COLUMN_IS_PUSHED(lm, col) (LMP(lm)->lm_column_data[col]->pushed)