home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 January
/
usenetsourcesnewsgroupsinfomagicjanuary1994.iso
/
sources
/
x
/
volume4
/
xgen
/
part03
/
spreadsheet.c
< prev
Wrap
C/C++ Source or Header
|
1989-06-29
|
21KB
|
879 lines
#define MAX_NUM_ARGS 20
#define MAX_NUMBER_COLUMNS 10
#define SIZE_OF_INPUT_STRING 50
#define SIZE_OF_SCROLL_STRING 1000
#define MAX_NUM_SPREADSHEETS 20
#include <stdio.h>
#include <X11/IntrinsicP.h>
#include <X11/Intrinsic.h>
#include <X11/CompositeP.h>
#include <X11/CommandP.h>
#include <X11/LabelP.h>
#include <X11/StringDefs.h>
#include <X11/Shell.h>
#include <X11/Form.h>
#include <X11/Core.h>
#include <X11/Viewport.h>
#include <X11/VPaned.h>
#include <X11/Text.h>
#include <X11/AsciiText.h>
#include <X11/AsciiTextP.h>
#include "application.h"
void nothing()
{
return;
}
extern Widget top_level;
static char space_string[] = " ";
extern XtTranslations input_text_translations;
static XtTranslations scroll_text_translations;
static XtTranslations spread_input_translations;
struct _spreadsheet {
Widget input_text;
Widget scroll_text;
int scrolltext_width; /* number of characters */
int column_width[MAX_NUMBER_COLUMNS];
int number_of_columns;
char input_string[SIZE_OF_INPUT_STRING];
char scroll_string[SIZE_OF_SCROLL_STRING];
long cursor_position;
int pres_column;
int total_width;
};
struct _spreadsheet_info {
Widget widget_ptr;
struct _spreadsheet *spreadsheet;
};
static struct _spreadsheet_info
spreadsheet_info[MAX_NUM_SPREADSHEETS];
void check_length();
void bell()
{
XBell( XtDisplay(top_level), 50 );
}
XtTranslations parse_spreadsheet_transl()
{
void copy_to_scroll();
void update_cursor_position();
static XtActionsRec actionlist[] =
{
{"Nothing", nothing},
{"Bell", bell},
{"Copy_To_Scroll", copy_to_scroll},
{"Update_Cursor_Position", update_cursor_position}
};
static char Input_Text_Translations[] =
"Ctrl<Key>N: Bell() \n\
<Key>0xff54: Bell() \n\
Ctrl<Key>P: Bell() \n\
<Key>0xff52: Bell() \n\
Ctrl<Key>V: Bell() \n\
Meta<Key>V: Bell() \n\
Ctrl<Key>Z: Bell() \n\
Meta<Key>Z: Bell() \n\
Ctrl<Key>J: Bell() \n\
<Key>0xff0a: Bell() \n\
Ctrl<Key>O: Bell() \n\
Ctrl<Key>M: Bell() \n\
Ctrl<Key>L: Bell() \n\
Meta<Key>I: Bell() \n\
<Key>0xff0d: Bell() \n\
Shift<Btn1Up>: Help()";
static char Spread_Input_Translations[] =
"<Key>0xff0d: Copy_To_Scroll()";
static char Scroll_Text_Translations[] =
"Ctrl<Key>N: Update_Cursor_Position(3)\n\
Ctrl<Key>P: Update_Cursor_Position(4)\n\
Ctrl<Key>F: Update_Cursor_Position(1)\n\
Ctrl<Key>B: Update_Cursor_Position(2)\n\
Button1<PtrMoved>: extend-adjust() \n\
Button3<PtrMoved>: extend-adjust() \n\
<BtnDown>: Nothing()\n\
<Key>: Nothing()\n\
Shift<Key>: Nothing()";
input_text_translations = XtParseTranslationTable(
Input_Text_Translations );
scroll_text_translations = XtParseTranslationTable(
Scroll_Text_Translations );
spread_input_translations = XtParseTranslationTable(
Spread_Input_Translations );
XtAddActions( actionlist, 4);
return( input_text_translations);
}
Widget create_spreadsheet( resources , outer_form,
prev_widget, pres_cmd_arg )
struct resource *resources;
Widget outer_form;
Widget prev_widget;
struct _rec_cmd_line_arg **pres_cmd_arg;
{
Widget label,
label2,
form,
form2,
vpane;
struct resource *pres_resource;
Arg label_args[MAX_NUM_ARGS];
Arg label2_args[MAX_NUM_ARGS];
Arg scroll_args[MAX_NUM_ARGS];
Arg vpane_args[MAX_NUM_ARGS];
Arg form_args[MAX_NUM_ARGS];
Arg text_args[MAX_NUM_ARGS];
Arg args[MAX_NUM_ARGS];
XFontStruct *font;
char string[STR_LEN];
char *temp, *label_ptr, *number;
char *column_label;
char scrollspace_label[STR_LEN];
int label_length,
number_length,
leading_spaces,
trailing_spaces;
int num_label_args = 0,
num_label2_args = 0,
num_vpane_args = 0,
num_scroll_args = 0,
num_form_args = 0,
num_text_args = 0,
num_args = 0;
int max_column_width = 0;
int column,
pixel;
char *help_msg = NULL;
struct _spreadsheet *spreadsheet;
struct _grouped_arg *pres_grouped_arg,
*prev_grouped_arg;
*pres_cmd_arg = (struct _rec_cmd_line_arg *)(
malloc(sizeof(struct _rec_cmd_line_arg)));
spreadsheet = (struct _spreadsheet *)malloc( sizeof( struct _spreadsheet ));
*(spreadsheet->scroll_string) = '\0';
*(spreadsheet->input_string) = '\0';
spreadsheet->scrolltext_width = 0;
pres_resource = resources;
while( pres_resource != NULL )
{
if( !strcmp( pres_resource->name, "labelbackground") )
{
pixel = get_pixel( pres_resource->value );
XtSetArg( label_args[num_label_args], XtNbackground,
pixel );
num_label_args++;
XtSetArg( form_args[num_form_args], XtNbackground,
pixel );
num_form_args++;
goto next;
}
if( !strcmp( pres_resource->name, "labelforeground") )
{
pixel = get_pixel( pres_resource->value );
XtSetArg( label_args[num_label_args], XtNforeground,
pixel );
num_label_args++;
goto next;
}
if( !strcmp( pres_resource->name, "labelfont" ) )
{
font = XLoadQueryFont( XtDisplay(top_level),
pres_resource->value );
XtSetArg( label_args[num_label_args], XtNfont,
font);
num_label_args++;
goto next;
}
if( !strcmp( pres_resource->name, "label" ))
{
XtSetArg( label_args[num_label_args], XtNlabel,
pres_resource->value );
num_label_args++;
goto next;
}
if( !strcmp(pres_resource->name, "textbackground") )
{
pixel = get_pixel( pres_resource->value );
XtSetArg( text_args[num_text_args], XtNbackground,
pixel);
num_text_args++;
goto next;
}
if( !strcmp(pres_resource->name, "textfont") )
{
font = XLoadQueryFont( XtDisplay(top_level),
pres_resource->value );
XtSetArg( text_args[num_text_args], XtNfont,
font);
num_text_args++;
goto next;
}
if( !strcmp( pres_resource->name, "textforeground") )
{
pixel = get_pixel( pres_resource->value );
XtSetArg( text_args[num_text_args], XtNforeground,
pixel );
num_text_args++;
goto next;
}
if( !strcmp(pres_resource->name, "titlebackground") )
{
pixel = get_pixel( pres_resource->value );
XtSetArg( label2_args[num_label2_args], XtNbackground,
pixel);
num_label2_args++;
goto next;
}
/* if( !strcmp(pres_resource->name, "titlefont") )
{
font = XLoadQueryFont( XtDisplay(top_level),
pres_resource->value );
XtSetArg( label2_args[num_label2_args], XtNfont,
font); num_label2_args++;
goto next;
}*/
if( !strcmp( pres_resource->name, "titleforeground") )
{
pixel = get_pixel( pres_resource->value );
XtSetArg( label2_args[num_label2_args], XtNforeground,
pixel );
num_label2_args++;
goto next;
}
if( !strcmp( pres_resource->name, "scrollheight") )
{
XtSetArg( scroll_args[num_scroll_args], XtNheight,
atoi(pres_resource->value) );
num_scroll_args++;
goto next;
}
if( !strcmp( pres_resource->name, "scrollbackground" ))
{
pixel = get_pixel( pres_resource->value );
XtSetArg( scroll_args[num_scroll_args], XtNbackground,
pixel );
num_scroll_args++;
goto next;
}
if( !strcmp( pres_resource->name, "scrollforeground" ))
{
pixel = get_pixel( pres_resource->value );
XtSetArg( scroll_args[num_scroll_args], XtNforeground,
pixel );
num_scroll_args++;
goto next;
}
if( !strcmp( pres_resource->name, "scrollfont" ))
{
font = XLoadQueryFont( XtDisplay( top_level),
pres_resource->value );
XtSetArg( scroll_args[num_scroll_args], XtNfont,
font);
num_scroll_args++;
XtSetArg( label2_args[num_label2_args], XtNfont,
font);
num_label2_args++;
goto next;
}
if( !strcmp( pres_resource->name, "borderwidth" ))
{
XtSetArg( vpane_args[num_vpane_args], XtNborderWidth,
atoi( pres_resource->value ));
num_vpane_args++;
goto next;
}
if( !strcmp( pres_resource->name, "bordercolor") )
{
pixel = get_pixel( pres_resource->value );
XtSetArg( vpane_args[num_vpane_args], XtNborderColor,
pixel) ;
num_vpane_args++;
goto next;
}
if( !strcmp( pres_resource->name, "columns"))
{
column_label = scrollspace_label;
strcpy( column_label, " " );
column_label += 2;
column = 0;
temp = pres_resource->value;
pres_grouped_arg =
(struct _grouped_arg *)malloc(
sizeof( struct _grouped_arg));
(*pres_cmd_arg)->grouped_arg =
pres_grouped_arg;
while( *temp != '\0')
{
pres_grouped_arg =
(struct _grouped_arg *)malloc(
sizeof( struct _grouped_arg));
if( column == 0)
(*pres_cmd_arg)->grouped_arg =
pres_grouped_arg;
else
prev_grouped_arg->next =
pres_grouped_arg;
/* skip leading spaces */
while ( *temp == ' ')
temp++;
label_ptr = temp;
/* find length of label */
while( *temp != ':' &&
*temp != ' ')
temp++;
label_length = temp-label_ptr;
strncpy( string, label_ptr, label_length);
*(string + label_length ) = '\0';
(pres_grouped_arg)->name_quark = XrmStringToQuark(string) ;
/* skip trailing spaces */
while( *temp == ' ' )
temp++;
/* check for syntax error
if( *temp != ':' ); /* error */
temp++;
/* skip leading spaces */
while( *temp == ' ' )
temp++;
number = temp;
while( *temp != ' ' &&
*temp != '\0' )
temp++;
while( *temp == ' ' )
temp++;
number_length = temp - number;
strncpy( string, number, number_length );
spreadsheet->column_width[column] = atoi( string );
if( max_column_width <
spreadsheet->column_width[column])
max_column_width = spreadsheet->
column_width[column];
if( column == 0)
pres_grouped_arg->value =
spreadsheet->scroll_string;
else
pres_grouped_arg->value =
prev_grouped_arg->value +
spreadsheet->column_width[column-1] + 2;
spreadsheet->scrolltext_width += spreadsheet->column_width[column];
if( ((long)label_length) > spreadsheet->column_width[column])
label_length = spreadsheet->column_width[column];
leading_spaces = spreadsheet->column_width[column]/2 -
label_length/2;
strncpy( column_label, space_string,
leading_spaces);
column_label += leading_spaces;
strncpy( column_label, label_ptr, label_length );
*(column_label + label_length + 1) = '\0';
trailing_spaces = spreadsheet->column_width[column] -
leading_spaces - label_length + 2;
spreadsheet->scrolltext_width += 2 ;
column_label += label_length;
strncpy( column_label,
space_string, trailing_spaces );
column_label += trailing_spaces;
column++;
prev_grouped_arg = pres_grouped_arg;
}
pres_grouped_arg->next = NULL;
*(column_label ) = '\0';
spreadsheet->number_of_columns = column;
(*pres_cmd_arg)->num_columns = column;
(*pres_cmd_arg)->scrolltext_width = spreadsheet->
scrolltext_width;
XtSetArg(label2_args[num_label2_args],
XtNlabel, scrollspace_label );
num_label2_args++;
if (font == NULL )
{
fprintf( stderr, "In shell %s scrolltext %s:%s. No such font. Using internal default\n");
font = XLoadQueryFont( XtDisplay(top_level),
"fixed" );
}
XtSetArg(scroll_args[num_scroll_args],
XtNwidth,
XTextWidth(font,scrollspace_label,
strlen( scrollspace_label )) );
num_scroll_args++;
goto next;
}
if( !strcmp( pres_resource->name, "horizdistance"))
{
XtSetArg(vpane_args[num_vpane_args],
XtNhorizDistance,
atoi(pres_resource->value));
num_vpane_args++;
goto next;
}
if( !strcmp( pres_resource->name, "vertdistance"))
{
XtSetArg(vpane_args[num_vpane_args],
XtNvertDistance,
atoi(pres_resource->value));
num_vpane_args++;
goto next;
}
if( !strcmp( pres_resource->name, "help"))
{
help_msg = pres_resource->value;
goto next;
}
next:
pres_resource = pres_resource->next;
}
XtSetArg( vpane_args[num_vpane_args], XtNfromVert,
prev_widget);
num_vpane_args++;
XtSetArg( vpane_args[num_vpane_args], XtNgripIndent, -30 );
num_vpane_args++;
vpane = XtCreateManagedWidget("", vPanedWidgetClass,
outer_form, vpane_args, num_vpane_args );
XtSetArg(form_args[num_form_args], XtNdefaultDistance, 0 );
num_form_args++;
form = XtCreateManagedWidget("", formWidgetClass,
vpane, form_args, num_form_args );
XtSetArg( label_args[num_label_args], XtNborderWidth, 0);
num_label_args++;
label = XtCreateManagedWidget("", labelWidgetClass,
form, label_args, num_label_args );
XtSetArg(text_args[num_text_args], XtNfromHoriz, label );
num_text_args++;
*(spreadsheet->input_string) = '\0';
XtSetArg(text_args[num_text_args], XtNstring,
spreadsheet->input_string);
num_text_args++;
XtSetArg(text_args[num_text_args], XtNeditType, XttextEdit);
num_text_args++;
XtSetArg(text_args[num_text_args], XtNtextOptions, editable );
num_text_args++;
XtSetArg(text_args[num_text_args], XtNlength, max_column_width);
num_text_args++;
XtSetArg(text_args[num_text_args], XtNwidth,
max_column_width * (font->max_bounds).width );
num_text_args++;
XtSetArg(text_args[num_text_args], XtNfont, font);
num_text_args++;
spreadsheet->input_text = XtCreateManagedWidget("",
asciiStringWidgetClass,
form, text_args, num_text_args );
enter_hash_help( spreadsheet->input_text, help_msg);
(*pres_cmd_arg)->input_text_widget = spreadsheet->input_text;
XtOverrideTranslations( spreadsheet->input_text, input_text_translations);
XtOverrideTranslations( spreadsheet->input_text,
spread_input_translations);
XtSetArg(label2_args[num_label2_args], XtNjustify,
XtJustifyLeft);
num_label2_args++;
label2 = XtCreateManagedWidget("", labelWidgetClass,
vpane, label2_args, num_label2_args );
XtSetArg( scroll_args[num_scroll_args], XtNeditType,
XttextEdit );
num_scroll_args++;
XtSetArg( scroll_args[num_scroll_args], XtNtextOptions,
scrollVertical|editable);
num_scroll_args++;
*(spreadsheet->scroll_string) = '\0';
XtSetArg( scroll_args[num_scroll_args], XtNstring,
spreadsheet->scroll_string);
num_scroll_args++;
(*pres_cmd_arg)->scroll_string = spreadsheet->scroll_string;
XtSetArg( scroll_args[num_scroll_args], XtNlength,
1000);
num_scroll_args++;
spreadsheet->scroll_text = XtCreateManagedWidget("", asciiStringWidgetClass,
vpane, scroll_args, num_scroll_args );
(*pres_cmd_arg)->text_widget = spreadsheet->scroll_text;
XtOverrideTranslations( spreadsheet->scroll_text,
scroll_text_translations );
spreadsheet->cursor_position = 0;
spreadsheet->pres_column = 0;
enter_spreadsheet( spreadsheet, vpane);
return(vpane);
}
void copy_to_scroll(w)
Widget w;
{
Arg args[3];
XtTextBlock text;
int replace_end;
int temp;
XtArgVal cursor;
void update_input_string();
struct _spreadsheet *spreadsheet,
*get_spreadsheet_info();
spreadsheet = get_spreadsheet_info(XtParent(XtParent(w)));
temp = strlen( spreadsheet->input_string );
if ( temp > spreadsheet->column_width[
spreadsheet->pres_column] )
temp = spreadsheet->column_width[spreadsheet->
pres_column];
XtSetArg( args[0], XtNinsertPosition,
&cursor);
XtGetValues(spreadsheet->scroll_text, args, 1);
spreadsheet->cursor_position = (int)cursor;
while( temp<(spreadsheet->column_width[
spreadsheet->pres_column] + 2) )
{
*(spreadsheet->input_string + temp ) = ' ';
temp++;
}
if ( spreadsheet->pres_column+1 >=
spreadsheet->number_of_columns)
*(spreadsheet->input_string + temp -1 ) = '\n';
text.firstPos = 0;
text.ptr = spreadsheet->input_string;
text.length = temp;
replace_end = (spreadsheet->cursor_position +
temp )>strlen(spreadsheet->scroll_string)?
strlen(spreadsheet->scroll_string):
spreadsheet->cursor_position + temp;
XtTextReplace ( spreadsheet->scroll_text,
spreadsheet->cursor_position,
replace_end, &text );
spreadsheet->cursor_position += spreadsheet->
column_width[spreadsheet->pres_column] + 2;
spreadsheet->pres_column += 1;
if(spreadsheet->pres_column + 1> spreadsheet->number_of_columns)
spreadsheet->pres_column = 0;
XtSetArg( args[0], XtNinsertPosition, spreadsheet->cursor_position);
XtSetValues( spreadsheet->scroll_text, args, 1);
update_input_string(spreadsheet);
}
void update_cursor_position(w, event, params, num_params)
Widget w;
XEvent *event;
String *params;
Cardinal *num_params;
{
Arg args[3];
int temp;
void update_input_string();
XtArgVal cursor;
struct _spreadsheet *spreadsheet,
*get_spreadsheet_info();
spreadsheet = get_spreadsheet_info(XtParent(w));
XtSetArg( args[0], XtNinsertPosition,
&cursor);
XtGetValues(w, args, 1);
spreadsheet->cursor_position = (int)cursor;
if( **params == '1' )
{
spreadsheet->cursor_position +=
spreadsheet->column_width[spreadsheet->pres_column] + 2;
if( spreadsheet->cursor_position >
strlen( spreadsheet->scroll_string ))
{
spreadsheet->cursor_position -=
spreadsheet->column_width[
spreadsheet->pres_column] + 2;
return;
}
spreadsheet->pres_column++;
if ( spreadsheet->pres_column +1 >
spreadsheet->number_of_columns )
spreadsheet->pres_column = 0;
}
if( **params == '2' )
{
temp = spreadsheet->pres_column;
spreadsheet->pres_column--;
if ( spreadsheet->pres_column < 0 )
spreadsheet->pres_column =
spreadsheet->number_of_columns - 1;
spreadsheet->cursor_position -=
spreadsheet->column_width[spreadsheet->pres_column]
+ 2;
if( spreadsheet->cursor_position < 0)
{
spreadsheet->cursor_position +=
spreadsheet->column_width[
spreadsheet->pres_column] + 2;
spreadsheet->pres_column = temp;
return;
}
}
if( **params == '3' )
{
spreadsheet->cursor_position +=
spreadsheet->scrolltext_width;
if( spreadsheet->cursor_position >
(long)(strlen(spreadsheet->scroll_string)))
{
spreadsheet->cursor_position -=
spreadsheet->scrolltext_width;
return;
}
}
if( **params == '4' )
{
spreadsheet->cursor_position -=
spreadsheet->scrolltext_width;
if( spreadsheet->cursor_position < 0 )
{
spreadsheet->cursor_position +=
spreadsheet->scrolltext_width;
return;
}
}
XtSetArg( args[0], XtNinsertPosition,
spreadsheet->cursor_position );
XtSetValues( spreadsheet->scroll_text, args, 1 );
update_input_string(spreadsheet);
}
void update_input_string(spreadsheet)
struct _spreadsheet *spreadsheet;
{
char *temp;
XtTextBlock text;
Arg args[2];
char string[50];
int length ;
temp = (char *)((long)(spreadsheet->scroll_string) +
spreadsheet->cursor_position);
while( *( temp ) != ' '
&& *( temp ) != '\0')
temp ++;
/* strncpy( string, scroll_string+cursor_position
, temp-cursor_position);
/* *( string + temp-cursor_position ) = '\0';
*/
text.length = (long)temp - spreadsheet->
cursor_position -
(long)spreadsheet->scroll_string;
text.ptr = (char *)((long)spreadsheet->scroll_string +
spreadsheet->cursor_position);
text.firstPos = 0;
temp = spreadsheet->input_string;
while( *(temp) != '\0')
temp++;
XtTextReplace( spreadsheet->input_text, 0, (long)temp -
(long)spreadsheet->input_string ,
&text );
XtSetArg( args[0], XtNinsertPosition, 0);
XtSetArg( args[1], XtNlength, spreadsheet->column_width[
spreadsheet->pres_column] );
XtSetValues( spreadsheet->input_text, args, 1);
}
enter_spreadsheet( spreadsheet, widget_ptr )
struct _spreadsheet *spreadsheet;
Widget widget_ptr;
{
static int i= 0;
int key;
if( i == 0 )
{
for ( i == 0 ; i<MAX_NUM_SPREADSHEETS ; i++ )
{
spreadsheet_info[i].widget_ptr = NULL;
}
}
key = ((long) widget_ptr)%MAX_NUM_SPREADSHEETS;
while( spreadsheet_info[key].widget_ptr != NULL)
key++;
spreadsheet_info[key].widget_ptr = widget_ptr;
spreadsheet_info[key].spreadsheet = spreadsheet;
return;
}
struct _spreadsheet *get_spreadsheet_info(w)
Widget w;
{
int key;
key = ((long)w)%MAX_NUM_SPREADSHEETS;
while(w != spreadsheet_info[key].widget_ptr)
key++;
return(spreadsheet_info[key].spreadsheet );
}
/*
void check_length(w, event, params, num_params)
Widget w;
XEvent *event;
String *params;
Cardinal *num_params;
{
XKeyEvent *keyevent;
keyevent = (XKeyEvent *)event;
keyevent->keycode = XKeysymToKeycode(0xFFB1);
}
*/