#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Xaw/Cardinals.h>
#include <X11/Xaw/List.h>
#include <X11/Xaw/Panner.h>
#include <X11/Xaw/Toggle.h>
#include <X11/Xfuncs.h>
#include <X11/Xos.h>
#include <stdio.h>
#include <stdlib.h>
#include "editresP.h"
static char * GetResourceName ( ResourceBoxInfo * res_box );
static void _AppendResourceString ( Widget w, XtPointer res_box_ptr,
XtPointer filename_ptr );
static void _SetResourcesFile ( Widget w, XtPointer junk,
XtPointer filename_ptr );
static void ObtainResource ( XtPointer node_ptr );
static void CreateSetValuesCommand ( WNode * node, XtPointer info_ptr );
static void SetOnlyMatchingWidgets ( WNode * node, XtPointer info_ptr );
void
Quit(Widget w, XtPointer client_data, XtPointer call_data)
{
XtDestroyApplicationContext(XtWidgetToApplicationContext(w));
exit(0);
}
void
SendTree(Widget w, XtPointer value, XtPointer call_data)
{
if ((Boolean)(long) value)
global_client.window = None;
if (!XtIsWidget(w))
w = XtParent(w);
_XEditResResetStream(&(global_client.stream));
SetCommand(w, LocalSendWidgetTree, NULL);
}
void
FindWidget(Widget w, XtPointer client_data, XtPointer call_data)
{
_FindWidget(XtParent(w));
}
void
InitSetValues(Widget w, XtPointer client_data, XtPointer call_data)
{
if (!XtIsWidget(w))
w = XtParent(w);
PopupSetValues(w, NULL);
}
void
TreeSelect(Widget w, XtPointer client_data, XtPointer call_data)
{
SelectTypes type = (SelectTypes) (unsigned long) client_data;
_TreeSelect(global_tree_info, type);
}
void
TreeRelabel(Widget w, XtPointer client_data, XtPointer call_data)
{
LabelTypes type = (LabelTypes) (unsigned long) client_data;
_TreeRelabel(global_tree_info, type);
}
void
PannerCallback(Widget w, XtPointer closure, XtPointer report_ptr)
{
Arg args[2];
XawPannerReport *report = (XawPannerReport *) report_ptr;
if (global_tree_info == NULL)
return;
XtSetArg (args[0], XtNx, -report->slider_x);
XtSetArg (args[1], XtNy, -report->slider_y);
XtSetValues(global_tree_info->tree_widget, args, TWO);
}
void
PortholeCallback(Widget w, XtPointer panner_ptr, XtPointer report_ptr)
{
Arg args[10];
Cardinal n = 0;
XawPannerReport *report = (XawPannerReport *) report_ptr;
Widget panner = (Widget) panner_ptr;
XtSetArg (args[n], XtNsliderX, report->slider_x); n++;
XtSetArg (args[n], XtNsliderY, report->slider_y); n++;
if (report->changed != (XawPRSliderX | XawPRSliderY)) {
XtSetArg (args[n], XtNsliderWidth, report->slider_width); n++;
XtSetArg (args[n], XtNsliderHeight, report->slider_height); n++;
XtSetArg (args[n], XtNcanvasWidth, report->canvas_width); n++;
XtSetArg (args[n], XtNcanvasHeight, report->canvas_height); n++;
}
XtSetValues (panner, args, n);
}
void
FlashActiveWidgets(Widget w, XtPointer junk, XtPointer garbage)
{
_FlashActiveWidgets(global_tree_info);
}
void
GetResourceList(Widget w, XtPointer junk, XtPointer garbage)
{
WNode * node;
ProtocolStream * stream = &(global_client.stream);
if (global_tree_info == NULL) {
SetMessage(global_screen_data.info_label,
res_labels[17]);
return;
}
if (global_tree_info->num_nodes != 1) {
SetMessage(global_screen_data.info_label,
res_labels[19]);
return;
}
node = global_tree_info->active_nodes[0];
if (node->resources != NULL) {
char * errors = NULL;
CreateResourceBox(node, &errors);
if (errors != NULL) {
SetMessage(global_screen_data.info_label, errors);
XtFree(errors);
}
return;
}
_XEditResResetStream(stream);
_XEditResPut16(stream, (unsigned short) 1);
InsertWidgetFromNode(stream, node);
SetCommand(global_tree_info->tree_widget, LocalGetResources, NULL);
}
void
DumpTreeToFile(Widget w, XtPointer junk, XtPointer garbage)
{
_PopupFileDialog(XtParent(w), "Enter the filename:", "",
_DumpTreeToFile, (XtPointer) global_tree_info);
}
void
AnyChosen(Widget w, XtPointer any_info_ptr, XtPointer state_ptr)
{
AnyInfo * any_info = (AnyInfo *) any_info_ptr;
Boolean state = (Boolean)(long) state_ptr;
Arg args[1];
if (state) {
if (any_info->left_count == 0) {
XtSetSensitive(any_info->left_dot, FALSE);
XtSetSensitive(any_info->left_star, FALSE);
XtSetArg(args[0], XtNstate, TRUE);
XtSetValues(any_info->left_star, args, ONE);
}
if ((any_info->right_count == NULL)||(*any_info->right_count == 0)) {
XtSetSensitive(any_info->right_dot, FALSE);
XtSetSensitive(any_info->right_star, FALSE);
XtSetArg(args[0], XtNstate, TRUE);
XtSetValues(any_info->right_star, args, ONE);
}
any_info->left_count++;
if (any_info->right_count != NULL)
(*any_info->right_count)++;
}
else {
if (any_info->left_count > 0)
any_info->left_count--;
if ((any_info->right_count != NULL)&&(*any_info->right_count > 0))
(*any_info->right_count)--;
if (any_info->left_count == 0) {
XtSetSensitive(any_info->left_dot, TRUE);
XtSetSensitive(any_info->left_star, TRUE);
XtSetArg(args[0], XtNstate, TRUE);
XtSetValues(any_info->left_dot, args, ONE);
}
if ((any_info->right_count == NULL)||(*any_info->right_count == 0)) {
XtSetSensitive(any_info->right_dot, TRUE);
XtSetSensitive(any_info->right_star, TRUE);
XtSetArg(args[0], XtNstate, TRUE);
XtSetValues(any_info->right_dot, args, ONE);
}
}
SetResourceString(NULL, (XtPointer) any_info->node, NULL);
ActivateResourceWidgets(NULL, (XtPointer) any_info->node, NULL);
}
static char *
GetResourceName(ResourceBoxInfo *res_box)
{
XawListReturnStruct * list_info;
char * result;
list_info = XawListShowCurrent(res_box->norm_list);
if ((list_info->list_index == XAW_LIST_NONE) &&
(res_box->cons_list != NULL)) {
list_info = XawListShowCurrent(res_box->cons_list);
}
if (list_info->list_index == XAW_LIST_NONE)
result = "unknown";
else
result = list_info->string;
return(result);
}
void
ActivateWidgetsAndSetResourceString(Widget w,
XtPointer node_ptr, XtPointer call_data)
{
SetResourceString(w, node_ptr, call_data);
ActivateResourceWidgets(w, node_ptr, call_data);
}
void
SetResourceString(Widget w, XtPointer node_ptr, XtPointer junk)
{
static char * malloc_string;
static Cardinal malloc_size;
WNode * node = (WNode *) node_ptr;
ResourceBoxInfo * res_box = node->resources->res_box;
char * temp, buf[BUFSIZ * 10];
NameInfo * name_node = res_box->name_info;
Arg args[1];
int len;
if ((w != NULL) && XtIsSubclass(w, toggleWidgetClass)) {
if (!((Boolean)(long) junk))
return;
}
buf[0] = '\0';
if ((temp = (char *) XawToggleGetCurrent(name_node->sep_leader)) != NULL)
strcat(buf, temp);
for ( ; name_node->next != NULL ; name_node = name_node->next) {
temp = (char *) XawToggleGetCurrent(name_node->name_leader);
if ( (temp != NULL) && !streq(temp, ANY_RADIO_DATA) ) {
strcat(buf, temp);
temp = (char *) XawToggleGetCurrent(name_node->next->sep_leader);
if (temp == NULL)
strcat(buf, "!");
else
strcat(buf, temp);
}
}
strcat(buf, GetResourceName(res_box));
len = strlen(buf) + 2;
#ifdef notdef
XtSetArg(args[0], XtNstring, &temp);
XtGetValues(res_box->value_wid, args, ONE);
len += strlen(temp);
#endif
if (len > malloc_size) {
malloc_string = XtRealloc(malloc_string, sizeof(char) * len);
malloc_size = len;
}
strcpy(malloc_string, buf);
strcat(malloc_string, ":");
#ifdef notdef
strcat(malloc_string, temp);
#endif
XtSetArg(args[0], XtNlabel, malloc_string);
XtSetValues(res_box->res_label, args, ONE);
}
extern Boolean do_get_values;
void
ResourceListCallback(Widget list, XtPointer node_ptr, XtPointer junk)
{
Widget o_list;
WNode * node = (WNode *) node_ptr;
ResourceBoxInfo * res_box = node->resources->res_box;
if (list == res_box->norm_list)
o_list = res_box->cons_list;
else
o_list = res_box->norm_list;
if (o_list != NULL)
XawListUnhighlight(o_list);
SetResourceString(list, node_ptr, junk);
if (global_effective_protocol_version >=
PROTOCOL_VERSION_ONE_POINT_ONE && do_get_values) {
ObtainResource(node_ptr);
do_get_values = False;
}
}
void
PopdownResBox(Widget w, XtPointer shell_ptr, XtPointer junk)
{
Widget shell = (Widget) shell_ptr;
XtPopdown(shell);
XtDestroyWidget(shell);
}
static void
_AppendResourceString(Widget w, XtPointer res_box_ptr, XtPointer filename_ptr)
{
Arg args[1];
FILE * fp;
char buf[BUFSIZ], * resource_string, *filename = (char *) filename_ptr;
ResourceBoxInfo * res_box = (ResourceBoxInfo *) res_box_ptr;
char *value_ptr;
if (filename != NULL) {
if (global_resources.allocated_save_resources_file)
XtFree(global_resources.save_resources_file);
else
global_resources.allocated_save_resources_file = TRUE;
global_resources.save_resources_file = XtNewString(filename);
}
if ((fp = fopen(global_resources.save_resources_file, "a+")) == NULL) {
sprintf(buf, "Unable to open this file for writing, would %s",
"you like To try again?");
_PopupFileDialog(global_toplevel ,buf,
global_resources.save_resources_file,
_AppendResourceString, res_box_ptr);
return;
}
XtSetArg(args[0], XtNlabel, &resource_string);
XtGetValues(res_box->res_label, args, ONE);
XtSetArg(args[0], XtNstring, &value_ptr);
XtGetValues(res_box->value_wid, args, ONE);
fprintf(fp, "%s %s\n", resource_string, value_ptr);
fclose(fp);
}
void
SaveResource(Widget w, XtPointer res_box_ptr, XtPointer junk)
{
if (streq(global_resources.save_resources_file, ""))
_PopupFileDialog(XtParent(w), "Enter file to dump resources into:",
global_resources.save_resources_file,
_AppendResourceString, res_box_ptr);
else
_AppendResourceString(w, res_box_ptr, NULL);
}
static void
_SetResourcesFile(Widget w, XtPointer junk, XtPointer filename_ptr)
{
char *filename = (char *) filename_ptr;
if (global_resources.allocated_save_resources_file)
XtFree(global_resources.save_resources_file);
else
global_resources.allocated_save_resources_file = TRUE;
global_resources.save_resources_file = XtNewString(filename);
}
void
SetFile(Widget w, XtPointer junk, XtPointer garbage)
{
_PopupFileDialog(XtParent(w), "Enter file to dump resources into:",
global_resources.save_resources_file,
_SetResourcesFile, NULL);
}
void
ApplyResource(Widget w, XtPointer node_ptr, XtPointer junk)
{
ProtocolStream * stream = &(global_client.stream);
ApplyResourcesInfo info;
WNode * node = (WNode *) node_ptr;
char * value;
unsigned short size, i;
long len;
Arg args[1];
info.name = GetResourceName(node->resources->res_box);
info.class = "IGNORE_ME";
info.stream = stream;
info.count = 0;
XtSetArg(args[0], XtNlabel, &value);
XtGetValues(node->resources->res_box->res_label, args, ONE);
info.database = NULL;
XrmPutLineResource(&(info.database), value);
_XEditResResetStream(stream);
_XEditResPutString8(stream, info.name);
_XEditResPutString8(stream, XtRString);
value = GetResourceValueForSetValues(node, &size);
_XEditResPut16(stream, size);
for (i = 0; i < size; i++)
_XEditResPut8(stream, value[i]);
XtFree(value);
len = stream->current - stream->top;
_XEditResPut16(stream, 0);
ExecuteOverAllNodes(node->tree_info->top_node,
CreateSetValuesCommand, (XtPointer) &info);
if (info.count > 0) {
*(stream->top + len++) = info.count >> XER_NBBY;
*(stream->top + len) = info.count;
SetCommand(node->tree_info->tree_widget, LocalSetValues, NULL);
}
else
SetMessage(global_screen_data.info_label,
res_labels[20]);
XrmDestroyDatabase(info.database);
}
static void
ObtainResource(XtPointer node_ptr)
{
ProtocolStream * stream = &(global_client.stream);
ObtainResourcesInfo info;
WNode * node = (WNode *) node_ptr;
char * value;
Arg args[1];
info.name = GetResourceName(node->resources->res_box);
info.class = "IGNORE_ME";
info.stream = stream;
info.count = 1;
XtSetArg(args[0], XtNlabel, &value);
XtGetValues(node->resources->res_box->res_label, args, ONE);
info.database = NULL;
XrmPutLineResource(&(info.database), value);
_XEditResResetStream(stream);
_XEditResPutString8(stream, info.name);
_XEditResPut16(stream, 1);
InsertWidgetFromNode(stream, node);
SetCommand(node->tree_info->tree_widget, LocalGetValues, NULL);
}
static void
CreateSetValuesCommand(WNode *node, XtPointer info_ptr)
{
ApplyResourcesInfo * info = (ApplyResourcesInfo *) info_ptr;
XrmNameList name_quarks;
XrmClassList class_quarks;
char ** names, **classes;
GetNamesAndClasses(node, &names, &classes);
name_quarks = (XrmNameList) Quarkify(names, info->name);
class_quarks = (XrmNameList) Quarkify(classes, info->class);
if (CheckDatabase(info->database, name_quarks, class_quarks)) {
InsertWidgetFromNode(info->stream, node);
info->count++;
}
XtFree((char *)names);
XtFree((char *)classes);
XtFree((char *)name_quarks);
XtFree((char *)class_quarks);
}
void
ActivateResourceWidgets(Widget w, XtPointer node_ptr, XtPointer junk)
{
WNode * node = (WNode *) node_ptr;
ApplyResourcesInfo info;
char * line;
Arg args[1];
info.name = GetResourceName(node->resources->res_box);
info.class = "IGNORE_ME";
info.count = 0;
info.stream = NULL;
XtSetArg(args[0], XtNlabel, &line);
XtGetValues(node->resources->res_box->res_label, args, ONE);
info.database = NULL;
XrmPutLineResource(&(info.database), line);
ExecuteOverAllNodes(node->tree_info->top_node,
SetOnlyMatchingWidgets, (XtPointer) &info);
XrmDestroyDatabase(info.database);
}
static void
SetOnlyMatchingWidgets(WNode *node, XtPointer info_ptr)
{
ApplyResourcesInfo * info = (ApplyResourcesInfo *) info_ptr;
XrmNameList name_quarks;
XrmClassList class_quarks;
char ** names, **classes;
Boolean state;
Arg args[1];
GetNamesAndClasses(node, &names, &classes);
name_quarks = (XrmNameList) Quarkify(names, info->name);
class_quarks = (XrmNameList) Quarkify(classes, info->class);
state = CheckDatabase(info->database, name_quarks, class_quarks);
XtSetArg(args[0], XtNstate, state);
XtSetValues(node->widget, args, ONE);
TreeToggle(node->widget, (XtPointer) node, (XtPointer)(long) state);
XtFree((char *)names);
XtFree((char *)classes);
XtFree((char *)name_quarks);
XtFree((char *)class_quarks);
}