which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.65.10.50/trunk@976 c028cbd2-c16b-5b4b-a496-9718f37d4682
591 lines
13 KiB
C
Executable File
591 lines
13 KiB
C
Executable File
/* 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;
|
|
}
|