Exemplo n.º 1
0
Arquivo: breaks.c Projeto: gplv2/rlib
static void rlib_break_all_below_in_reverse_order(rlib *r, struct rlib_part *part, struct rlib_report *report, struct rlib_element *e, gboolean precalculate) {
	gint count=0,i=0,j=0;
	gint newpage = FALSE;
	gboolean t;
	struct rlib_report_break *rb;
	struct rlib_element *xxx, *be;
	struct rlib_break_fields *bf = NULL;

	for(xxx = e; xxx != NULL; xxx=xxx->next)
		count++;

	for(i=count;i > 0;i--) {
		xxx = e;
		for(j=0;j<i-1;j++)
			xxx = xxx->next;		
		rb = xxx->data;
		for(be = rb->fields; be != NULL; be=be->next) {
			bf = be->data;
			rlib_value_free(bf->rval);
			bf->rval = NULL;
		}
		if(OUTPUT(r)->do_breaks) {
			gint did_end_page = FALSE;
			
			
			if(precalculate == FALSE)
				did_end_page = rlib_end_page_if_line_wont_fit(r, part, report, rb->footer);

			if(!INPUT(r, r->current_result)->isdone(INPUT(r, r->current_result), r->results[r->current_result].result))
				rlib_navigate_previous(r, r->current_result);

			if(precalculate == FALSE) {
				if(did_end_page) {
					bf->rval = rlib_execute_pcode(r, &bf->rval2, bf->code, NULL);
					rlib_print_break_header_output(r, part, report, rb, rb->header, FALSE);
					rlib_value_free(bf->rval);
					bf->rval = NULL;		
				}

				rlib_print_break_footer_output(r, part, report, rb, rb->footer, FALSE);
			}
			if(!INPUT(r, r->current_result)->isdone(INPUT(r, r->current_result), r->results[r->current_result].result))
				rlib_navigate_next(r, r->current_result);
		}

		rlib_reset_variables_on_break(r, part, report, (gchar *)rb->xml_name.xml, precalculate);
		rlib_process_expression_variables(r, report);
		if (rlib_execute_as_boolean(r, rb->newpage_code, &t))
			newpage = t;
		
	}
	if(newpage && OUTPUT(r)->do_breaks) {
		if(!INPUT(r, r->current_result)->isdone(INPUT(r, r->current_result), r->results[r->current_result].result)) {
			if(OUTPUT(r)->paginate)
				rlib_layout_end_page(r, part, report, TRUE);
			rlib_force_break_headers(r, part, report, precalculate);
		}
	}
}
Exemplo n.º 2
0
static gint rlib_do_followers(rlib *r, gint i, gint way) {
	gint follower;
	gint rtn = TRUE;
	follower = r->followers[i].follower;

	if(r->results[follower]->navigation_failed == TRUE)
		return FALSE;

	if(r->results[follower]->next_failed)
		r->results[follower]->navigation_failed = TRUE;
		

	if(way == RLIB_NAVIGATE_NEXT) {
		if(rlib_navigate_next(r, follower) != TRUE) {
			if(rlib_navigate_last(r, follower) != TRUE) {
				rtn = FALSE;
			}
			r->results[follower]->next_failed = TRUE;
		}	
	} else if(way == RLIB_NAVIGATE_PREVIOUS) {
		if(rlib_navigate_previous(r, follower) != TRUE)
			rtn = FALSE;
	} else if(way == RLIB_NAVIGATE_FIRST) {
		if(rlib_navigate_first(r, follower) != TRUE)
			rtn = FALSE;
		else {
			r->results[follower]->next_failed = FALSE;
			r->results[follower]->navigation_failed = FALSE;
		
		}
	} else if(way == RLIB_NAVIGATE_LAST) {
		if(rlib_navigate_last(r, follower) != TRUE)
			rtn = FALSE;
	}
	return rtn;
}