/*
 * Copyright(c) 1992 Bell Communications Research, Inc. (Bellcore)
 * Copyright(c) 1995-99 Andrew Lister
 *                        All rights reserved
 * Permission to use, copy, modify and distribute this material for
 * any purpose and without fee is hereby granted, provided that the
 * above copyright notice and this permission notice appear in all
 * copies, and that the name of Bellcore not be used in advertising
 * or publicity pertaining to this material without the specific,
 * prior written permission of an authorized representative of
 * Bellcore.
 *
 * BELLCORE MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES, EX-
 * PRESS OR IMPLIED, WITH RESPECT TO THE SOFTWARE, INCLUDING, BUT
 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR ANY PARTICULAR PURPOSE, AND THE WARRANTY AGAINST IN-
 * FRINGEMENT OF PATENTS OR OTHER INTELLECTUAL PROPERTY RIGHTS.  THE
 * SOFTWARE IS PROVIDED "AS IS", AND IN NO EVENT SHALL BELLCORE OR
 * ANY OF ITS AFFILIATES BE LIABLE FOR ANY DAMAGES, INCLUDING ANY
 * LOST PROFITS OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES RELAT-
 * ING TO THE SOFTWARE.
 *
 * MatrixWidget Author: Andrew Wason, Bellcore, aw@bae.bellcore.com
 *
 * $Id: MatrixP.h,v 1.1 1999/09/11 01:25:38 fnevgeny Exp $
 */

/*
 * MatrixP.h - Private definitions for Matrix widget
 */

#ifndef _Xbae_MatrixP_h
#define _Xbae_MatrixP_h

#if XmVersion <= 1001
#	include <Xm/XmP.h>
#else
#	include <Xm/ManagerP.h>
#endif

#include <Xbae/Matrix.h>

#ifndef P
#if defined(__STDC__) || defined (__cplusplus)
#define P(x)		x
#else
#define P(x)		()
#define const
#define volatile
#endif
#endif

/*
 * A few definitions we like to use, but those with R4 won't have.
 * From Xfuncproto.h in R5.
 */

#ifndef XlibSpecificationRelease
# ifndef _XFUNCPROTOBEGIN
#   ifdef __cplusplus                      /* for C++ V2.0 */
#     define _XFUNCPROTOBEGIN extern "C" {   /* do not leave open across includes */
#     define _XFUNCPROTOEND }
#   else
#     define _XFUNCPROTOBEGIN
#     define _XFUNCPROTOEND
#   endif
# endif /* _XFUNCPROTOBEGIN */
#else
#include <X11/Xfuncproto.h>
#endif

/*
 * New types for the class methods
 */
_XFUNCPROTOBEGIN

typedef void (*XbaeMatrixSetCellProc) P((XbaeMatrixWidget, int, int,
					 const String, Boolean));

typedef String (*XbaeMatrixGetCellProc) P((XbaeMatrixWidget, int, int));

typedef void (*XbaeMatrixEditCellProc) P((XbaeMatrixWidget, XEvent *,
					  int, int, String *, Cardinal));

typedef void (*XbaeMatrixSelectCellProc) P((XbaeMatrixWidget, int, int));

typedef void (*XbaeMatrixSelectRowProc) P((XbaeMatrixWidget, int));

typedef void (*XbaeMatrixSelectColumnProc) P((XbaeMatrixWidget, int));

typedef void (*XbaeMatrixDeselectAllProc) P((XbaeMatrixWidget));

typedef void (*XbaeMatrixSelectAllProc) P((XbaeMatrixWidget));

typedef void (*XbaeMatrixDeselectCellProc) P((XbaeMatrixWidget, int, int));

typedef void (*XbaeMatrixDeselectRowProc) P((XbaeMatrixWidget, int));

typedef void (*XbaeMatrixDeselectColumnProc) P((XbaeMatrixWidget, int));

typedef Boolean (*XbaeMatrixCommitEditProc) P((XbaeMatrixWidget, XEvent *,
					       Boolean));

typedef void (*XbaeMatrixCancelEditProc) P((XbaeMatrixWidget, Boolean));

typedef void (*XbaeMatrixAddRowsProc) P((XbaeMatrixWidget, int, String *,
					 String *, Pixel *, Pixel *, int));

typedef void (*XbaeMatrixDeleteRowsProc) P((XbaeMatrixWidget, int, int));

typedef void (*XbaeMatrixAddColumnsProc) P((XbaeMatrixWidget, int, String *,
					    String *, short *, int *,
					    unsigned char*, unsigned char *,
					    Pixel *, Pixel *, int));

typedef void (*XbaeMatrixDeleteColumnsProc) P((XbaeMatrixWidget, int, int));

typedef void (*XbaeMatrixSetRowColorsProc) P((XbaeMatrixWidget, int, Pixel *,
					      int, Boolean));

typedef void (*XbaeMatrixSetColumnColorsProc) P((XbaeMatrixWidget, int,
						 Pixel *, int, Boolean));

typedef void (*XbaeMatrixSetCellColorProc) P((XbaeMatrixWidget, int, int,
					      Pixel, Boolean));

_XFUNCPROTOEND

/*
 * Different than the traversal directions in Xm.h
 */
#define NOT_TRAVERSING	-1

/*
 * New fields for the Matrix widget class record
 */
typedef struct {
    XbaeMatrixSetCellProc		set_cell;
    XbaeMatrixGetCellProc		get_cell;
    XbaeMatrixEditCellProc		edit_cell;
    XbaeMatrixSelectCellProc		select_cell;
    XbaeMatrixSelectRowProc		select_row;
    XbaeMatrixSelectColumnProc		select_column;
    XbaeMatrixDeselectAllProc		deselect_all;
    XbaeMatrixSelectAllProc		select_all;
    XbaeMatrixDeselectCellProc		deselect_cell;
    XbaeMatrixDeselectRowProc		deselect_row;
    XbaeMatrixDeselectColumnProc	deselect_column;
    XbaeMatrixCommitEditProc		commit_edit;
    XbaeMatrixCancelEditProc		cancel_edit;
    XbaeMatrixAddRowsProc		add_rows;
    XbaeMatrixDeleteRowsProc		delete_rows;
    XbaeMatrixAddColumnsProc		add_columns;
    XbaeMatrixDeleteColumnsProc		delete_columns;
    XbaeMatrixSetRowColorsProc		set_row_colors;
    XbaeMatrixSetColumnColorsProc	set_column_colors;
    XbaeMatrixSetCellColorProc		set_cell_color;
    XtPointer				extension;
} XbaeMatrixClassPart;

/*
 * Full class record declaration
 */
typedef struct _XbaeMatrixClassRec {
    CoreClassPart		core_class;
    CompositeClassPart		composite_class;
    ConstraintClassPart		constraint_class;
    XmManagerClassPart		manager_class;
    XbaeMatrixClassPart		matrix_class;
} XbaeMatrixClassRec;

externalref XbaeMatrixClassRec xbaeMatrixClassRec;


/*
 * Inheritance constants for set/get/edit methods
 */
#define XbaeInheritGetCell ((XbaeMatrixGetCellProc) _XtInherit)
#define XbaeInheritSetCell ((XbaeMatrixSetCellProc) _XtInherit)
#define XbaeInheritEditCell ((XbaeMatrixEditCellProc) _XtInherit)
#define XbaeInheritSelectCell ((XbaeMatrixSelectCellProc) _XtInherit)
#define XbaeInheritSelectRow ((XbaeMatrixSelectRowProc) _XtInherit)
#define XbaeInheritSelectColumn ((XbaeMatrixSelectColumnProc) _XtInherit)
#if XmVersion >= 1002
#define XbaeInheritHighlightCell ((XbaeMatrixHighlightCellProc) _XtInherit)
#define XbaeInheritHighlightRow ((XbaeMatrixHighlightRowProc) _XtInherit)
#define XbaeInheritHighlightColumn ((XbaeMatrixHighlightColumnProc) _XtInherit)
#endif
#define XbaeInheritDeselectAll ((XbaeMatrixDeselectAllProc) _XtInherit)
#define XbaeInheritSelectAll ((XbaeMatrixSelectAllProc) _XtInherit)
#define XbaeInheritDeselectCell ((XbaeMatrixDeselectCellProc) _XtInherit)
#define XbaeInheritDeselectRow ((XbaeMatrixDeselectRowProc) _XtInherit)
#define XbaeInheritDeselectColumn ((XbaeMatrixDeselectColumnProc) _XtInherit)
#define XbaeInheritCommitEdit ((XbaeMatrixCommitEditProc) _XtInherit)
#define XbaeInheritCancelEdit ((XbaeMatrixCancelEditProc) _XtInherit)
#define XbaeInheritAddRows ((XbaeMatrixAddRowsProc) _XtInherit)
#define XbaeInheritDeleteRows ((XbaeMatrixDeleteRowsProc) _XtInherit)
#define XbaeInheritAddColumns ((XbaeMatrixAddColumnsProc) _XtInherit)
#define XbaeInheritDeleteColumns ((XbaeMatrixDeleteColumnsProc)_XtInherit)
#define XbaeInheritSetRowColors ((XbaeMatrixSetRowColorsProc)_XtInherit)
#define XbaeInheritSetColumnColors ((XbaeMatrixSetColumnColorsProc)_XtInherit)
#define XbaeInheritSetCellColor ((XbaeMatrixSetCellColorProc)_XtInherit)

/*
 * New data structures for the ScrollMgr code
 */
typedef struct _SmScrollNode {
    int x;
    int y;
    struct _SmScrollNode *next;
    struct _SmScrollNode *prev;
} SmScrollNodeRec, *SmScrollNode;

typedef struct _SmScrollMgr {
    int offset_x;
    int offset_y;
    int scroll_count;
    SmScrollNode scroll_queue;
    Boolean scrolling;
} SmScrollMgrRec, *SmScrollMgr;

/*
 * Rectangle struct used for internal calculations.  (x1,y1) are the upper
 * left corner, (x2,y2) are the lower right.
 */
typedef struct _Rectangle
{
    int x1, y1;
    int x2, y2;
}
Rectangle;

/*
 * Data structure for column labels
 */
typedef struct _ColumnLabelLines {
    int lines;
    int *lengths;
} ColumnLabelLinesRec, *ColumnLabelLines;

/*
 * New fields for the Matrix widget record
 */
typedef struct {
    /*
     * resources
     */
    Boolean	allow_column_resize;	/* can columns dynamically resize?   */
    Boolean	bold_labels;		/* draw bold row/column labels?	     */
    Boolean	button_labels;		/* draw labels as buttons?	     */
    Boolean	fill;			/* fill available space?	     */
    Boolean	trailing_attached_right;  /* trailing columns fixed to right */
    Boolean	trailing_attached_bottom; /* trailing rows fixed to bottom   */
    Boolean	reverse_select;		/* reverse colours - selected cells? */
    Boolean	scroll_select;		/* flag to scroll a selected cell    */
    Boolean	**selected_cells;	/* 2D array of selected cells	     */
    Boolean	show_arrows;	        /* sow arrows when text obscured?    */
    Boolean     *column_button_labels;  /* which column labels are butons */
    Boolean     *row_button_labels;     /* which row labels are butons */
    Boolean	traverse_fixed;		/* allow traversal to fixed cells?   */
    Boolean	calc_cursor_position;	/* calculate insert pos from click   */
    unsigned char cell_shadow_type;	/* cell shadow type		     */
    unsigned char **cell_shadow_types;	/* 2D array of per cell shadow type  */
    unsigned char *column_alignments;	/* alignment of each column	     */
    unsigned char *column_label_alignments;/* alignment of each column label */
    unsigned char *column_shadow_types;	/* 1D array of per col shadow types  */
    unsigned char grid_type;		/* shadowed in/shadowed out/plain    */
    unsigned char hsb_display_policy;	/* horiz scroll bar display policy   */
    unsigned char row_label_alignment;	/* alignment of row labels	     */
    unsigned char *row_shadow_types;	/* 1D array of per row shadow types  */
    unsigned char scrollbar_placement;	/* placement of the scrollbars	     */
    unsigned char selection_policy;	/* as for XmList */
    unsigned char shadow_type;		/* matrix window shadow type	     */
#if XmVersion >= 1002
    unsigned char **highlighted_cells;	/* 2D array of highlighted cells     */
#endif
    unsigned char vsb_display_policy;	/* vert scroll bar display policy    */

    String	**cells;		/* 2D array of strings		     */
    String	*column_labels;		/* array of labels above each column */
    String	*row_labels;		/* array of labels next to each row  */

    XtPointer	**cell_user_data;	/* 2D array of per cell user data    */
    XtPointer	*column_user_data;	/* 1D array of per column user data  */
    XtPointer	*row_user_data;		/* 1D array of per row user data     */

    short	*column_widths;		/* width of each column in chars     */
    short	row_label_width;	/* max width of row labels in chars  */

    int		alt_row_count;		/* # of rows for e/o background	     */
    int		columns;		/* number of cells per row	     */
    int		*column_max_lengths;	/* max length of each col in chars   */
    int         double_click_interval;	/* interval between clicks	     */
    int         left_column;		/* horizontal origin (in col space)  */
    int		rows;			/* number of rows per column	     */
    int		top_row;		/* vertical origin (in row space)    */

    Dimension	cell_highlight_thickness; /* hilite thickness for textField  */
    Dimension	cell_margin_height;	/* margin height for textField	     */
    Dimension	cell_margin_width;	/* margin width for textField	     */
    Dimension	cell_shadow_thickness;	/* shadow thickness for each cell    */
    Dimension	fixed_columns;		/* number of leading fixed columns   */
    Dimension	fixed_rows;		/* number of leading fixed rows	     */
    Dimension	space;			/* spacing for scrollbars	     */
    Dimension	text_shadow_thickness;	/* shadow thickness for text field   */
    Dimension	trailing_fixed_columns;	/* number of trailing fixed columns  */
    Dimension	trailing_fixed_rows;	/* number of trailing fixed rows     */
    Dimension	visible_columns;	/* number of columns to make visible */
    Dimension	visible_rows;		/* number of rows to make visible    */

    Pixel	button_label_background; /* color of button label background */
    Pixel	**cell_background;	/* 2D array of Pixels		     */
    Pixel	**colors;		/* 2D array of Pixels		     */
    Pixel	column_label_color;	/* color of column label	     */
    Pixel	even_row_background;	/* even row background color	     */
    Pixel	grid_line_color;	/* color of grid, for XmGrid_LINE    */
    Pixel       odd_row_background;	/* odd row background color	     */
    Pixel	row_label_color;	/* color of row label		     */
    Pixel	selected_background;	/* background for selected cells     */
    Pixel	selected_foreground;	/* foreground for selected cells     */
    Pixel	text_background;	/* background for the "text" field   */

    XtTranslations text_translations;	/* translations for textField widget */

    XtCallbackList default_action_callback; /* called for a double click     */
    XtCallbackList draw_cell_callback;	/* called when a cell is drawn	     */
    XtCallbackList enter_cell_callback;	/* called when a cell is entered     */
    XtCallbackList label_activate_callback; /* called when label pressed     */
    XtCallbackList leave_cell_callback;	/* called when a cell is left	     */
    XtCallbackList modify_verify_callback; /* verify change to textField     */
					/* and a draw_cell_callback is set   */
#if XmVersion > 1001
    XtCallbackList process_drag_callback; /* called when a drag is initiated */
#endif
    XtCallbackList resize_callback;	/* called when Matrix is resized     */
    XtCallbackList resize_column_callback; /* called when column is resized  */
    XtCallbackList select_cell_callback; /* called when cells are selected   */
    XtCallbackList traverse_cell_callback; /* next cell to traverse to	     */
    XtCallbackList write_cell_callback;	/*called when a cell needs to be set*/ 

    XmFontList	font_list;		/* fontList of widget and textField  */
    XmFontList	label_font_list;	/* fontList of labels		     */

    
    /*
     * private state
     */
#if XmVersion >= 1002
    unsigned char highlight_location;	/* What is being highlighted	     */
#endif
    short	first_row_offset;	/* hidden first row */
    int		cell_visible_height;	/* height of visible cells in pixels */
    int		column_label_maxlines;	/* max # lines in column labels	     */
    int		*column_positions;	/* pixel position of each column     */
    int		current_column;		/* column of the text field	     */
    int		current_row;		/* row of the text field	     */
    int		horiz_origin;		/* horiz origin (in pixel space)     */
    int		label_baseline;		/* baseline of label		     */
    int		last_column;		/* The last selected column	     */
    int		last_row;		/* The last selected row	     */
    int		num_selected_cells;	/* The number selected cells	     */
    int		text_baseline;		/* baseline of text in each cell     */
    int		traversing;		/* direction we are traversing	     */

    unsigned int non_fixed_total_width;	/* width of cell area in pixels	     */
    unsigned int current_clip;		/* current clip mask setting	     */
    unsigned int disable_redisplay;	/* disable redisplay counter	     */

    Dimension	desired_height;		/* height widget wants to be	     */
    Dimension	desired_width;		/* width widget wants to be	     */

    Time	last_click_time;	/* when last ButtonPress occurred    */

    Widget	text_field;		/* the text field		     */
    Widget	horizontal_sb;		/* the horizontal scrollbar	     */
    Widget      vertical_sb;		/* the vertical scrollbar	     */
    Widget	clip_window;		/* the clip child		     */
    Widget	left_clip;		/* clips for scrolling fixed cells   */
    Widget	right_clip;
    Widget	top_clip;
    Widget	bottom_clip;
    Widget	current_parent;		/* Current textField parent window   */
#if CELL_WIDGETS
    Widget	**cell_widgets;		/* array of widgets for cells	     */
#endif

    GC		cell_bottom_shadow_clip_gc; /* GC for clipped bottom shadow  */
    GC          cell_grid_line_gc;
    GC		cell_top_shadow_clip_gc; /* GC for clipped top shadow	     */
    GC		draw_gc;		/* GC for drawing cells		     */
    GC          grid_line_gc;		/* GC for grid line		     */
    GC		label_clip_gc;		/* GC for clipped labels	     */
    GC		label_gc;		/* GC for drawing labels	     */
    GC		pixmap_gc;		/* GC for drawing pixmap cells	     */
    GC		resize_bottom_shadow_gc;
    GC		resize_top_shadow_gc;

    ColumnLabelLines column_label_lines; /* structs for multi line labels    */
				     
    XFontStruct	*font_struct;		/* fontStruct from fontList	     */
    XFontStruct	*label_font_struct;	/* fontStruct from fontList	     */

    SmScrollMgr clip_scroll_mgr;	/* ScrollMgr for Clip		     */
    SmScrollMgr matrix_scroll_mgr;	/* ScrollMgr for Matrix		     */

    XFontSet	font_set;		/* fontSet from fontList	     */
    short	font_y;
    short	font_width;
    short	font_height;
    Font	fid;
    XFontSet	label_font_set;		/* fontSet from fontList	     */
    short	label_font_y;
    short	label_font_width;
    short	label_font_height;
    Font	label_fid;

} XbaeMatrixPart;

/*
 * Full instance record declaration
 */
typedef struct _XbaeMatrixRec {
    CorePart		core;
    CompositePart	composite;
    ConstraintPart	constraint;
    XmManagerPart	manager;
    XbaeMatrixPart	matrix;
} XbaeMatrixRec;

/* provide clean-up for those with R4 */
#ifndef XlibSpecificationRelease
# undef _Xconst
# undef _XFUNCPROTOBEGIN
# undef _XFUNCPROTOEND
#endif

#undef P
#endif /* _Xbae_MatrixP_h */
