/*
 *		mcmap()	-	displays current colormap
 *
 *	RCS:
 *		$Revision$
 *		$Date$
 *
 *	Security:
 *		Unclassified
 *
 *	Description:
 *		text
 *
 *	Input Parameters:
 *		type	identifier	description
 *
 *		text
 *
 *	Output Parameters:
 *		type	identifier	description
 *
 *		text
 *
 *	Return Values:
 *		value	description
 *
 *	Side Effects:
 *		text
 *
 *	Limitations and Comments:
 *		text
 *
 *	Development History:
 *		when	who		why
 * 9/18/93, mm, to reveal the secret of colormap :-)
 */

/*
** compile:
** gcc mcmap.c -o mcmap -lXm -lXt -lX11
*/

#include <stdio.h>
#include <Xm/Xm.h>
#include <Xm/MainW.h>
#include <Xm/DrawingA.h>
#include <Xm/PushBG.h>
#include <Xm/PushB.h>
#include <Xm/RowColumn.h>
#include <Xm/Separator.h>
#include <Xm/TextF.h>
#include <Xm/ScrolledW.h>
#include <Xm/Form.h>
#include <Xm/Label.h>
#include <Xm/LabelG.h>

#define star_width 16
#define star_height 16
static char star_bits[] = {
   0xff, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x77, 0xf7, 0x6f, 0xfb, 0x5f, 0xfd,
   0xbf, 0xfe, 0xc1, 0xc1, 0xbf, 0xfe, 0x5f, 0xfd, 0x6f, 0xfb, 0x77, 0xf7,
   0x7f, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff};

GC gc;
Pixmap pixmap;
Colormap colormap_h;
Display *display_h;
XColor colors[256];
XColor xcolor;

#define START 				0
#define TOPLEVEL_W			START+1
#define MAINW_W				START+2
#define FORM_W				START+3
#define RC_W				START+4
#define RGBV_W				START+5
#define PIXELV_W			START+6
#define VERSION_SHELL		START+7
#define END					VERSION_SHELL
#define NUM_WIDGETS			END

Widget w_special[NUM_WIDGETS];
void QuitCb ();
extern void NullCb();
void tell_rgb();
void Version_Show();

main (argc, argv)

int argc;
char **argv;

{

	Widget
		toplevel,
		main_w,
		form,
		pb,
		qb,
		rgbLabel,
		rgbValue,
		pixelLabel,
		pixelValue,
		about,
		rc;
	
    int
        xcells,
        ycells,
        cells;

	XtAppContext app;
	XGCValues gcv;

	Arg args[100];
	int i, n;

	toplevel = XtVaAppInitialize (&app, "Demos", NULL, 0,
		&argc, argv, NULL, NULL);

    w_special[TOPLEVEL_W] = toplevel;

	display_h = XtDisplay (toplevel);
	colormap_h = DefaultColormap(display_h, DefaultScreen(display_h));

    cells=XDisplayCells (display_h, XDefaultScreen(display_h));

#ifdef DEBUG
    (void) fprintf (stderr,
        "Cells: %d\n", cells);
#endif
    if (cells > 256)
    {
        (void) fprintf (stderr,
            "\nThis program only works with <= 8 bit displays!\n");
        exit(1);
    }
	main_w = XtVaCreateManagedWidget ("main_w",
		xmMainWindowWidgetClass, toplevel, NULL);


	n = 0;

	form = XmCreateForm (main_w, "form",
		args, n);
	XtManageChild (form);
w_special[FORM_W] = form;

	gcv.foreground = WhitePixelOfScreen (XtScreen(form));
	gc = XCreateGC(XtDisplay(form),
		RootWindowOfScreen(XtScreen(main_w)), GCForeground, &gcv);
	
	rc = XtVaCreateWidget ("rc", xmRowColumnWidgetClass, form,
		XmNnumColumns,		16,
		XmNorientation,		XmHORIZONTAL,
		XmNpacking,         XmPACK_COLUMN,
		XmNleftAttachment,  XmATTACH_FORM,
		XmNtopAttachment,   XmATTACH_FORM,
		NULL);

w_special[RC_W] = rc;

	qb = XtVaCreateManagedWidget ("EXIT",
		xmPushButtonGadgetClass, form,
		XmNtopAttachment,	  XmATTACH_WIDGET,
		XmNtopWidget,		  rc,
		XmNtopOffset,  		  20,
		XmNleftAttachment,    XmATTACH_FORM,
		XmNleftOffset,		  20,
		XmNbottomAttachment,  XmATTACH_FORM,
		XmNbottomOffset,	  10,
		XmNshadowThickness,   3,
		XmNwidth, 70,
		NULL);

	XtAddCallback(qb, XmNactivateCallback, QuitCb, NULL);

	n = 0;
	XtSetArg(args[n], XmNtopAttachment,		XmATTACH_WIDGET); 	n++;
	XtSetArg(args[n], XmNtopWidget,			rc); 				n++;
	XtSetArg(args[n], XmNtopOffset,   		20); 				n++;
	XtSetArg(args[n], XmNleftAttachment, 	XmATTACH_WIDGET); 	n++;
	XtSetArg(args[n], XmNleftWidget,		qb); 				n++;
	XtSetArg(args[n], XmNleftOffset, 		20); 				n++;
	XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM);     n++;
	XtSetArg (args[n], XmNbottomOffset, 	10);                n++;

	pixelLabel = XmCreateLabel (form, "Pixel", args, n);
	XtManageChild (pixelLabel);

	n = 0;
	XtSetArg(args[n], XmNtopAttachment,		XmATTACH_WIDGET);  n++;
	XtSetArg(args[n], XmNtopWidget,			rc);               n++;
	XtSetArg(args[n], XmNtopOffset,   		20);               n++;
	XtSetArg(args[n], XmNleftAttachment, 	XmATTACH_WIDGET);  n++;
	XtSetArg(args[n], XmNleftWidget,		pixelLabel);	   n++;
	XtSetArg(args[n], XmNeditable, 			False);            n++;
	XtSetArg(args[n], XmNcursorPositionVisible, False);        n++;
	XtSetArg(args[n], XmNcolumns,          	12);               n++;
	XtSetArg(args[n], XmNmarginHeight,     	1);                n++;
	XtSetArg(args[n], XmNshadowThickness,  	2);                n++;
	XtSetArg(args[n], XmNbottomAttachment, 	XmATTACH_FORM);	   n++;
	XtSetArg (args[n], XmNbottomOffset, 	10);               n++;
	
	pixelValue = XmCreateTextField(form, "pixelValue", args, n);
	XtManageChild (pixelValue);
	w_special[PIXELV_W] = pixelValue;


	n = 0;
	XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
	XtSetArg(args[n], XmNtopWidget,     rc); n++;
	XtSetArg(args[n], XmNtopOffset,   20); n++;
	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_WIDGET);	n++;
	XtSetArg(args[n], XmNleftWidget,		pixelValue);		n++;
	XtSetArg(args[n], XmNleftOffset, 20); n++;
	XtSetArg (args[n], XmNbottomAttachment, XmATTACH_FORM);     n++;
	XtSetArg (args[n], XmNbottomOffset, 10);                        n++;

	rgbLabel = XmCreateLabel (form, "RGB",args, n);
	XtManageChild (rgbLabel);

	n = 0;
	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET); n++;
	XtSetArg(args[n], XmNtopWidget,		rc); n++;
	XtSetArg(args[n], XmNtopOffset,   20); n++;
	XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
	XtSetArg(args[n], XmNleftWidget,	rgbLabel); n++;
	XtSetArg(args[n], XmNrightAttachment,  XmATTACH_NONE); n++;
	XtSetArg(args[n], XmNrightOffset,      4); n++;
	XtSetArg(args[n], XmNeditable, False);              n++;
	XtSetArg(args[n], XmNcursorPositionVisible, False); n++;
	XtSetArg(args[n], XmNcolumns,          12); n++;
	XtSetArg(args[n], XmNmarginHeight,     1);                  n++;
	XtSetArg(args[n], XmNshadowThickness,  2);                  n++;
	XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
	XtSetArg (args[n], XmNbottomOffset, 10);                        n++;
	
	rgbValue = XmCreateTextField(form, "rgbValue", args, n);
	XtManageChild (rgbValue);
	w_special[RGBV_W] = rgbValue;

	about = XtVaCreateManagedWidget ("ABOUT",
		xmPushButtonGadgetClass, form,
		XmNtopAttachment,     XmATTACH_WIDGET,
		XmNtopWidget,         rc,
		XmNtopOffset,         20,
		XmNleftAttachment, XmATTACH_WIDGET,
		XmNleftWidget,		rgbValue,
		XmNleftOffset,		43,
		XmNbottomAttachment,  XmATTACH_FORM,
		XmNbottomOffset,      10,
		XmNshadowThickness,   3,
		XmNwidth, 70,
		NULL);

	XtAddCallback(about, XmNactivateCallback, Version_Show, NULL);

    if (cells > 64)
    {
        xcells=16;
        ycells=16;
    }
    else if (cells > 16)
    { 
       xcells = 8;
       ycells = 8;
    }
    else if (cells > 8)
    { 
        xcells = 4;
        ycells = 4;
    }
    else
    {
        xcells = 2;
        ycells = 2;
    }

	for (i=0; i < cells; i++) 
	{	
		pixmap = XCreatePixmap (XtDisplay(rc),
			RootWindowOfScreen(XtScreen(rc)),
			16, 16, DefaultDepthOfScreen(XtScreen(rc)));

		XSetForeground (XtDisplay(rc), gc, i);
		XFillRectangle (XtDisplay(rc), pixmap, gc, 0,0,16,16);
		pb = XtVaCreateManagedWidget("pb",xmPushButtonWidgetClass, rc,
			XmNlabelType, XmPIXMAP,
			XmNlabelPixmap, pixmap,
			NULL);
		XtAddCallback (pb, XmNactivateCallback, tell_rgb, (XtPointer)i);
	}

	XtManageChild(rc);
 	XtRealizeWidget(toplevel);
	XtAppMainLoop(app);

}        

void
tell_rgb (w,i)
Widget w;
int i;

{
XColor xcolor;
char pixelStr[10];
char rgbStr[80];

Arg args[20];
int n;

xcolor.pixel = i;
XQueryColor (XtDisplay(w_special[RC_W]), colormap_h, &xcolor);

sprintf (pixelStr, "%d", xcolor.pixel);
sprintf (rgbStr, "%d %d %d", xcolor.red/256, xcolor.green/256,xcolor.blue/256);
n = 0;
XtSetArg (args[n], XmNvalue, pixelStr); n++;
XtSetValues (w_special[PIXELV_W], args, n);

n = 0;
XtSetArg(args[n], XmNvalue, rgbStr); n++;
XtSetValues(w_special[RGBV_W], args, n); 
}





void
Version_Show (w, client_data, state)
		Widget w;
		XtPointer   client_data;
		XmToggleButtonCallbackStruct    *state;
{
	static Widget base_form2,
				  rc,
				  left,
				  heading,
				  icon,
				  separator,
				  closeb,
				  titles;

	Pixel fg, bg;
	Pixmap pixmap;
	XmString close_str;



	if (!base_form2) {

	base_form2 = XmCreateFormDialog (w_special[TOPLEVEL_W],
				"Version Display",
				NULL,0);
	
	XtVaSetValues (XtParent(base_form2),
				XtNtitle,	"Version Display",
				NULL);
	XtVaSetValues (base_form2,
				XmNfractionBase, 7,
				NULL);

	w_special [VERSION_SHELL] = base_form2;

	rc = XtVaCreateWidget ("rc", 
				xmRowColumnWidgetClass, base_form2,
				XmNorientation, XmHORIZONTAL,
				NULL);
	left = XtVaCreateWidget (NULL, 
				xmRowColumnWidgetClass, rc,
				NULL);

	heading = XtVaCreateWidget ("heading", 
				xmFormWidgetClass, left,
				NULL);

	XtVaGetValues (heading, 
				XmNforeground, &fg,
				XmNbackground, &bg,
				NULL);

/*	pixmap = XCreatePixmapFromBitmapData ( XtDisplay(heading),
				RootWindowOfScreen(XtScreen(heading)),
				semcor_logo_bits, semcor_logo_width,
				semcor_logo_height,
				fg, bg, DefaultDepthOfScreen(XtScreen(heading)));*/
				
	pixmap = XCreatePixmapFromBitmapData ( XtDisplay(heading),
				RootWindowOfScreen(XtScreen(heading)),
				star_bits, star_width,
				star_height,
				fg, bg, DefaultDepthOfScreen(XtScreen(heading)));

	icon = XtVaCreateManagedWidget ("mcmap.icon", 
				xmLabelGadgetClass, heading,
				XmNleftAttachment,	XmATTACH_FORM,
				XmNlabelType,		XmPIXMAP,
				XmNlabelPixmap,		pixmap,
				XmNalignment,		XmALIGNMENT_END,
				NULL);
	
	titles = XtVaCreateWidget (NULL,
				xmRowColumnWidgetClass, heading,
				XmNrightAttachment,		XmATTACH_FORM,
				XmNleftAttachment,		XmATTACH_WIDGET,
				XmNleftWidget,			icon,
				XmNtopAttachment,		XmATTACH_FORM,
				XmNbottomAttachment,	XmATTACH_FORM,
				NULL);
	XtVaCreateManagedWidget ("mcmap Version 1.1 Shows contents of the Colormap", xmLabelGadgetClass, titles, NULL);
	XtVaCreateManagedWidget ("(c) 1993 By Muhammad A Muquit muquit@semcor.com", xmLabelGadgetClass, titles, NULL);

	/*Create a separator*/

	separator = XtVaCreateWidget ("Separator",
				xmSeparatorWidgetClass, base_form2,
				XmNtopAttachment,	XmATTACH_WIDGET,
				XmNtopWidget,	rc,
				XmNtopOffset,	5,
				XmNleftAttachment,	XmATTACH_FORM,
				XmNrightAttachment,	XmATTACH_FORM,
				NULL);

	close_str = XmStringCreateSimple ("CLOSE");
	closeb = XtVaCreateManagedWidget ("CLOSE",
				xmPushButtonWidgetClass, base_form2,
				XmNlabelString, close_str,
				XmNtopAttachment,	XmATTACH_WIDGET,
				XmNtopWidget,		separator,
				XmNtopOffset,		10,
				XmNbottomAttachment,	XmATTACH_FORM,
				XmNbottomOffset,	10,
				XmNleftAttachment,	XmATTACH_POSITION,
				XmNleftPosition,	3,
				XmNrightAttachment,	XmATTACH_POSITION,
				XmNrightPosition,	4,
				NULL);

	XmStringFree (close_str);

/*	XtAddCallback (closeb, XmNactivateCallback, NullCb, NULL);*/

	XtManageChild (rc);
	XtManageChild (left);
	XtManageChild (titles);
	XtManageChild (heading);
	XtManageChild (separator);

}	
	XtManageChild (base_form2);
}	

void QuitCb ()
{
    exit(1);
}
