/* Justification for lynx - implemented by Vlad Harchev <hvv@hippo.ru>
   11 July 1999
*/

#ifndef LYJUSTIFY_H
#define LYJUSTIFY_H

#include <HTUtils.h>

#ifdef EXP_JUSTIFY_ELTS

extern BOOL ok_justify;
extern BOOL can_justify_here;
extern BOOL can_justify_here_saved;

extern BOOL can_justify_this_line;
extern int wait_for_this_stacked_elt;
extern BOOL form_in_htext;

    /*this is the element with SGML_EMPTY content, so it won't
    get on the stack, so we can't trap it with wait_for_this_stacked_elt */
extern BOOL in_DT;

/*disabled by default*/
/*#define DEBUG_JUSTIFY*/
#ifdef DEBUG_JUSTIFY
extern BOOL can_justify_stack_depth;/* can be 0 or 1 if all code is correct*/
#  define CAN_JUSTIFY_STACK_INC ++can_justify_stack_depth;\
	assert(can_justify_stack_depth < 2 && can_justify_stack_depth >=0 );
#  define CAN_JUSTIFY_STACK_DEC --can_justify_stack_depth;\
	assert(can_justify_stack_depth < 2 && can_justify_stack_depth >=0 );
#else
#  define CAN_JUSTIFY_STACK_INC /* nothing */
#  define CAN_JUSTIFY_STACK_DEC /* nothing */
#endif

#define CAN_JUSTIFY_PUSH(x) can_justify_here_saved=can_justify_here;\
	can_justify_here=(x); CAN_JUSTIFY_STACK_INC
#define CAN_JUSTIFY_POP can_justify_here=can_justify_here_saved;\
	CAN_JUSTIFY_STACK_INC
#define CAN_JUSTIFY_SET(x) can_justify_here=(x);

/*
 * This is used to indicate that starting from the current offset in current
 * line justification can take place (in order the gap between some prefix and
 * the word not to be enlarged.
 * For example, when forming OL,
 *     1.21 foo
 * 	   ^justification can start here so that gap between 1.21 and "foo"
 *	   will not be enlarged.
 * This is a macro (that uses 'me').
 */
#define CAN_JUSTIFY_START  mark_justify_start_position(me->text);
#define CANT_JUSTIFY_THIS_LINE can_justify_this_line = FALSE
#define EMIT_IFDEF_EXP_JUSTIFY_ELTS(x) x
    /*defined in order not to wrap single line of code  into #ifdef/#endif */

extern void ht_justify_cleanup NOPARAMS;
extern void mark_justify_start_position PARAMS((void* text));

#else /* ! EXP_JUSTIFY_ELTS */

/*
 * define empty macros so that they can be used without wrapping them in
 * #ifdef EXP_JUSTIFY_ELTS/#endif
 */

#define CAN_JUSTIFY_PUSH(x)
#define CAN_JUSTIFY_POP
#define CAN_JUSTIFY_SET(x)
#define CAN_JUSTIFY_START
#define CANT_JUSTIFY_THIS_LINE
#define EMIT_IFDEF_EXP_JUSTIFY_ELTS(x)

#endif /* EXP_JUSTIFY_ELTS */

#define CAN_JUSTIFY_PUSH_F CAN_JUSTIFY_PUSH(FALSE)

#endif /* LYJUSTIFY_H */
