/* r4style.c (c)Copyright Sequiter Software Inc., 1991-1994. All rights reserved. */ #include "d4all.h" PSTYLE4 S4FUNCTION style4lookup( REPORT4 *report, char *style_name ) { STYLE4 *style_on; if( report == NULL || style_name == NULL ) return NULL; style_on = (STYLE4 *)l4first( &report->styles ); while( style_on ) { #ifdef S4WINDOWS if( !lstrcmp( (LPCSTR)style_name, (LPCSTR)style_on->name ) ) #else if( !strcmp( (char *)style_name, (char *)style_on->name ) ) #endif return style_on; style_on = (STYLE4 *)l4next( &report->styles, style_on ); } return NULL; } BOOL S4FUNCTION style4free( REPORT4 *report, STYLE4 *style ) { if( report == NULL || style == NULL ) return FALSE; if( report ) l4remove( &report->styles, style ); #ifdef S4WINDOWS if( style->screen_font ) { DeleteObject( style->screen_font ); style->screen_font = NULL; } if( style->printer_font ) { DeleteObject( style->printer_font ); style->printer_font = NULL; } #endif if( style->codes_before ) { u4free( style->codes_before ); style->codes_before = NULL; style->codes_before_len = 0; } if( style->codes_after ) { u4free( style->codes_after ); style->codes_after = NULL; style->codes_after_len = 0; } u4free( style ); return TRUE; } BOOL S4FUNCTION style4delete( REPORT4 *report, char *style_name ) { STYLE4 *style_on; if( report == NULL || style_name == NULL ) return FALSE; style_on = style4lookup( report, style_name ); if( !style_on ) return FALSE; style4free( report, style_on ); return TRUE; } int S4FUNCTION style4color( PSTYLE4 style, R4COLORREF color ) { if( style == NULL ) return -1; style->color = color; return 0; } int S4FUNCTION style4default_set( PREPORT4 report, PSTYLE4 style ) { if( report == NULL || style == NULL ) return -1; report->active_style = style; return 0; } #ifdef S4WINDOWS STYLE4 FAR* S4FUNCTION style4create( REPORT4 *report, PR4LOGFONT lfont, char *name, R4COLORREF color, int point_size ) { STYLE4 *style = NULL; #ifdef S4WIN32 LOGFONT ntFont; #endif if( !name || name[0] == '\0' ) { if( report ) e4describe( report->code_base, e4parm, E4_REP_NOSNAM, 0, 0 ); return NULL; } if( report ) { style = style4lookup( report, name ); if( style != NULL ) { e4describe( report->code_base, e4style_create, E4_REP_DUPSNAM, 0, 0 ); return NULL; } } if( report ) style = (PSTYLE4)u4alloc_free( report->code_base, sizeof(STYLE4) ); else style = (PSTYLE4)u4alloc( sizeof(STYLE4) ); if( style == NULL ) return NULL; style->color = color; style->point_size = point_size; u4ncpy( style->name, name, sizeof(style->name) ) ; memcpy( &style->lfont, lfont, sizeof(R4LOGFONT) ) ; #ifdef S4WIN32 ntFont.lfHeight = lfont->lfHeight ; ntFont.lfWidth = lfont->lfWidth ; ntFont.lfEscapement = lfont->lfEscapement ; ntFont.lfOrientation = lfont->lfOrientation ; ntFont.lfWeight = lfont->lfWeight ; ntFont.lfItalic = lfont->lfItalic ; ntFont.lfUnderline = lfont->lfUnderline ; ntFont.lfStrikeOut = lfont->lfStrikeOut ; ntFont.lfCharSet = lfont->lfCharSet ; ntFont.lfOutPrecision = lfont->lfOutPrecision ; ntFont.lfClipPrecision = lfont->lfClipPrecision ; ntFont.lfQuality = lfont->lfQuality ; ntFont.lfPitchAndFamily = lfont->lfPitchAndFamily ; lstrcpy( ntFont.lfFaceName, lfont->lfFaceName ); memcpy( &style->ntFont, &ntFont, sizeof(LOGFONT) ); style->screen_font = CreateFontIndirect( (const LOGFONT FAR*)&style->ntFont ) ; if ( style->screen_font == NULL ) { u4free( style ); return NULL ; } #else style->screen_font = CreateFontIndirect( (const LOGFONT FAR*)&style->lfont ) ; if ( style->screen_font == NULL ) { u4free( style ); return NULL ; } #endif style->codes_before_len = style->codes_after_len = 0; style->codes_before = NULL; style->codes_after = NULL; if( report ) { style->menu_id = 600 + report->styles.n_link; l4add( &report->styles, style ) ; if ( report->active_style == NULL ) report->active_style = style ; } return style ; } #else PSTYLE4 style4create( PREPORT4 report, char *name, int before_len, char *before, int after_len, char *after ) { STYLE4 *style = NULL; if( !name || name[0] == '\0' ) { if( report ) e4describe( report->code_base, e4parm, E4_REP_NOSNAM, 0, 0 ); return NULL; } if( report ) { style = style4lookup( report, name ); if( style != NULL ) { e4describe( report->code_base, e4style_create, E4_REP_DUPSNAM, 0, 0 ); return NULL; } } if( report ) style = (PSTYLE4)u4alloc_free( report->code_base, sizeof(STYLE4) ); else style = (PSTYLE4)u4alloc( sizeof(STYLE4) ); if( style == NULL ) return NULL; u4ncpy( style->name, name, sizeof( style->name ) ); if( before_len > 0 && before != NULL ) { style->codes_before_len = before_len; style->codes_before = (char *)u4alloc( before_len ); if( style->codes_before == NULL ) return NULL; memcpy( style->codes_before, before, before_len ); } if( after_len >0 && after != NULL ) { style->codes_after_len = after_len; style->codes_after = (char *)u4alloc( after_len ); if( style->codes_after == NULL ) { if( style->codes_before != NULL ) u4free( style->codes_before ); return NULL; } memcpy( style->codes_after, after, after_len ); } if( report ) { l4add( &report->styles, style ); if( report->active_style == NULL ) report->active_style = style; } return style; } #endif void style4swap( POBJ4 obj, PSTYLE4 old, PSTYLE4 newstyle ) { POBJ4 obj_on; if( obj->style == old ) obj->style = newstyle; obj_on = (POBJ4)l4first( &obj->contained ); while( obj_on ) { style4swap( obj_on, old, newstyle ); obj_on = (POBJ4)l4next( &obj->contained, obj_on ); } } void style4changeLoadedStyles( REPORT4 *report, STYLE4 *old_style, STYLE4 *new_style ) { GROUP4 *group_on; AREA4 *area_on; OBJ4 *obj_on; area_on = (AREA4 *)l4first( &report->page_header_footer->header_areas ); while( area_on ) { obj_on = (OBJ4 *)l4first( &area_on->objects ); while( obj_on ) { if( obj_on->style == old_style ) { style4swap( obj_on, old_style, new_style ); } obj_on = (OBJ4 *)l4next( &area_on->objects, obj_on ); } area_on = (AREA4 *)l4next( &report->page_header_footer->header_areas, area_on ); } area_on = (AREA4 *)l4first( &report->page_header_footer->footer_areas ); while( area_on ) { obj_on = (OBJ4 *)l4first( &area_on->objects ); while( obj_on ) { if( obj_on->style == old_style ) { style4swap( obj_on, old_style, new_style ); } obj_on = (OBJ4 *)l4next( &area_on->objects, obj_on ); } area_on = (AREA4 *)l4next( &report->page_header_footer->footer_areas, area_on ); } group_on = (GROUP4 *)l4first( &report->groups ); while( group_on ) { area_on = (AREA4 *)l4first( &group_on->header_areas ); while( area_on ) { obj_on = (OBJ4 *)l4first( &area_on->objects ); while( obj_on ) { if( obj_on->style == old_style ) { style4swap( obj_on, old_style, new_style ); } obj_on = (OBJ4 *)l4next( &area_on->objects, obj_on ); } area_on = (AREA4 *)l4next( &group_on->header_areas, area_on ); } area_on = (AREA4 *)l4first( &group_on->footer_areas ); while( area_on ) { obj_on = (OBJ4 *)l4first( &area_on->objects ); while( obj_on ) { if( obj_on->style == old_style ) { style4swap( obj_on, old_style, new_style ); } obj_on = (OBJ4 *)l4next( &area_on->objects, obj_on ); } area_on = (AREA4 *)l4next( &group_on->footer_areas, area_on ); } group_on = (GROUP4 *)l4next( &report->groups, group_on ); } } int S4FUNCTION report4styleSheetSave( REPORT4 *report, char *file_name ) { CODE4 *c4; FILE4 file; FILE4SEQ_WRITE seq; char name_buf[512], buf[1024]; short sval; STYLE4 *style_on; int create_error, safety; c4 = report->code_base; u4ncpy( name_buf, file_name, sizeof(name_buf) ); u4name_ext( name_buf, sizeof(name_buf), "CRS", 0 ); create_error = c4->create_error; safety = c4->safety; c4->create_error = 0; c4->safety = 0; if( (file4create( &file, c4, name_buf, 1 )) != 0 ) { e4set( c4, 0 ); c4->create_error = create_error; c4->safety = safety; return -1; } file4seq_write_init( &seq, &file, 0L, buf, sizeof(buf) ); name_buf[0] = STYLE_MASK; name_buf[1] = VERSION_MASK; file4seq_write( &seq, name_buf, 2 ); sval = report->styles.n_link; file4seq_write( &seq, &sval, sizeof(short) ); style_on = (STYLE4 *)l4first( &report->styles ); while( style_on ) { report4save_style( &seq, style_on ); style_on = (STYLE4 *)l4next( &report->styles, style_on ); } file4seq_write_flush( &seq ); file4close( &file ); c4->create_error = create_error; c4->safety = safety; return 0; } int S4FUNCTION report4styleSheetLoad( REPORT4 *report, char *file_name, int override ) { FILE4 file; FILE4SEQ_READ seq; int auto_open, create_error, expr_error, open_error; char name_buf[512]; int m1, m2, m3, m4, i; short sval; CODE4 *c4; PSTYLE4 style, style_old; char buf[1024]; c4 = report->code_base; auto_open = c4->auto_open; create_error = c4->create_error; expr_error = c4->expr_error; open_error = c4->open_error; c4->auto_open = c4->create_error = c4->expr_error = c4->open_error = 0; u4ncpy( name_buf, file_name, sizeof(name_buf) ); u4name_ext( name_buf, sizeof(name_buf), "REP", 0 ); #ifndef S4UNIX c4upper( name_buf ); #endif if( file4open( &file, c4, name_buf, 1 ) != 0 ) { e4set( c4, 0 ); return -1; } file4seq_read_init( &seq, &file, 0L, buf, sizeof(buf) ); file4seq_read( &seq, &m1, 1 ); file4seq_read( &seq, &m2, 1 ); m3 = m1 & STYLE_MASK; m4 = m2 & VERSION_MASK; if( m3 != STYLE_MASK ) return -1; if( m4 != VERSION_MASK ) return -1; file4seq_read( &seq, &sval, sizeof(short) ); for( i = 0; i < sval; i++ ) { style = report4retrieve_style( &seq, NULL ); if( !style ) { file4close( &file ); return -1; } if( (style_old = style4lookup( report, style->name )) != NULL ) { if( !override ) { style4free( NULL, style ); } else { style4changeLoadedStyles( report, style_old, style ); style4free( report, style_old ); l4add( &report->styles, style ); } } else { if( !override ) { style4free( NULL, style ); } else { style4changeLoadedStyles( report, style_old, style ); style4free( report, style_old ); l4add( &report->styles, style ); } } } c4->auto_open = auto_open; c4->create_error = create_error; c4->expr_error = expr_error; c4->open_error = open_error; file4close( &file ); return 0; } PSTYLE4 S4FUNCTION report4styleFirst( PREPORT4 report ) { if( !report ) { return NULL; } return (PSTYLE4)l4first( &report->styles ); } PSTYLE4 S4FUNCTION report4styleNext( PREPORT4 report, PSTYLE4 style ) { if( !report ) { return NULL; } return (PSTYLE4)l4next( &report->styles, style ); } PSTYLE4 S4FUNCTION report4styleLast( PREPORT4 report ) { if( !report ) { return NULL; } return (PSTYLE4)l4last( &report->styles ); } PSTYLE4 S4FUNCTION report4stylePrev( PREPORT4 report, PSTYLE4 style ) { if( !report ) { return NULL; } return (PSTYLE4)l4prev( &report->styles, style ); } int S4FUNCTION report4numStyles( PREPORT4 report ) { if( !report ) { return 0; } return report->styles.n_link; } PSTYLE4 S4FUNCTION report4styleSelected( PREPORT4 report ) { if( !report ) { return NULL; } return report->active_style; } int S4FUNCTION report4styleSelect( PREPORT4 report, PSTYLE4 style ) { if( !report || !style ) { if( report && !style ) e4describe( report->code_base, e4style_select, E4_REP_SSELECT, 0, 0 ); return -1; } report->active_style = style; return 0; } PSTYLE4 S4FUNCTION style4index( PREPORT4 report, int index ) { int i; PSTYLE4 style = NULL; if( !report || index < 0 ) { if( report ) e4describe( report->code_base, e4style_index, E4_REP_SINDEX, 0, 0 ); return NULL; } for( i = 0; i <= index; i++ ) { style = (PSTYLE4)l4next( &report->styles, style ); if( style == NULL ) break; } return style; }