/*=================================================================*/
/* program name: ixcol.c                                           */
/* description:                                                    */
/* Programm zeigt die Verwendung von Widget's unter der            */
/* graphischen Oberflaeche X-Window X11R4 unter Verwendung         */
/* des OSF/MOTIF 1.1 Toolkits.                                     */
/* Es werden nacheinander die Farben, die dazugehoerigen Texte,    */
/* die Slider und die FileSelectionBox generiert.                  */
/* Die Auswahl der Farbwerte erfolgt ueber die Farbpushbuttons,    */
/* die Einstellung ueber die Slider, bzw. den ArrowButtons.        */
/*-----------------------------------------------------------------*/
/*        start: 08-May-1991                                       */
/* last changes: 17-Jan-1993 by: mb                                */
/*-----------------------------------------------------------------*/
/* created by Matthias Beil                                        */
/*-----------------------------------------------------------------*/
/* Compiler: Unix CC (Interactive)                                 */
/*=================================================================*/

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <fcntl.h>

#include <Xm/Xm.h>
#include <Xm/Form.h>
#include <Xm/RowColumn.h>
#include <Xm/LabelG.h>
#include <Xm/PushB.h>
#include <Xm/Scale.h>
#include <Xm/ArrowB.h>
#include <Xm/FileSB.h>


/*-----------------------------------------------------------------*/
/*                                                                 */
/*-----------------------------------------------------------------*/

#define IXCOL_FONT     "8x13"

#define HORIZ_OFFSET   20
#define VERT_OFFSET    10

#define MAX_COLORS     16
#define MAX_INCDEC     1000
#define MAX_COLVAL     65535

Display        *dispColor;
Colormap       recColorMap;
unsigned long  recColorTab[MAX_COLORS];
XFontStruct    *precFont;
XmFontList     recFontList;

static int     iActColorNr    = 0;

static Widget  widColorForm   = (Widget) NULL;
static Widget  widLabelRow    = (Widget) NULL;
static Widget  widColorRow    = (Widget) NULL;
static Widget  widSliderRow   = (Widget) NULL;
static Widget  widFile        = (Widget) NULL;
static Widget  widSliderRed   = (Widget) NULL;
static Widget  widSliderGreen = (Widget) NULL;
static Widget  widSliderBlue  = (Widget) NULL;


/*=================================================================*/
/* function name: SetColorValue                                    */
/*   description:                                                  */
/* Setzt den neuen Farbwert. Falls kein Wert vorhanden wird der    */
/* alte Farbwert genommen.                                         */
/*-----------------------------------------------------------------*/
/*        start: 08-May-1991                                       */
/* last changes: 08-Aug-1992 by: mb                                */
/*=================================================================*/

void SetColorValue(iColAdr, 
		   iRed, 
		   iGreen, 
		   iBlue)
int iColAdr;
int iRed;
int iGreen;
int iBlue;
{
  XColor xcColor;
                              /* Hole alten Farbwert */
  xcColor.pixel = (unsigned long) recColorTab[iColAdr];
  XQueryColor(
    (Display *) dispColor, 
    (Colormap) recColorMap, 
    (XColor *) &xcColor);
  xcColor.flags = (DoRed | DoGreen | DoBlue);
  if ((iRed >= 0) && (iRed <= MAX_COLVAL))
  {
    xcColor.red   = (unsigned short) iRed;
  }
  if ((iGreen >= 0) && (iGreen <= MAX_COLVAL))
  {
    xcColor.green = (unsigned short) iGreen;
  }
  if ((iBlue >= 0) && (iBlue <= MAX_COLVAL))
  {
    xcColor.blue  = (unsigned short) iBlue;
  }
  XStoreColor(
    (Display *) dispColor, 
    (Colormap) recColorMap, 
    (XColor *) &xcColor);
} /* end of SetColorValue */


/*=================================================================*/
/* function name: InitColorTab                                     */
/*   description:                                                  */
/* Vorbesetzen der Farbwerte. Der einfachhalber mit Grauwerten.    */
/*-----------------------------------------------------------------*/
/*        start: 08-May-1991                                       */
/* last changes: 25-Jul-1992 by: mb                                */
/*=================================================================*/

void InitColorTab()
{
  int iCnt;
  int iTmp;
  int iTmpRed;
  int iTmpBlue;

  for (iCnt = 0; iCnt < MAX_COLORS; iCnt++)
  {
    iTmp = (iCnt * (MAX_COLVAL / (MAX_COLORS - 1)));
    iTmpBlue = iTmp;
    if (iTmp == 0)
    {
      iTmp = 1;
    }
    iTmpRed = (MAX_COLVAL - iTmp);
    SetColorValue(iCnt, iTmpRed, 0, iTmpBlue);
  }
} /* end of InitColorTab */


/*=================================================================*/
/* function name: SetScaleFromColor                                */
/*   description:                                                  */
/* Setze die Scale-Slider entsprechend der Farbwerte.              */
/*-----------------------------------------------------------------*/
/*        start: 08-May-1991                                       */
/* last changes: 25-Jul-1992 by: mb                                */
/*=================================================================*/

void SetScaleFromColor()
{
  XColor xcColor;

  xcColor.pixel = (unsigned long) recColorTab[iActColorNr];
  XQueryColor(
    (Display *) dispColor, 
    (Colormap) recColorMap, 
    (XColor *) &xcColor);
  XmScaleSetValue(
    (Widget) widSliderRed, 
    (int) xcColor.red);
  XmScaleSetValue(
    (Widget) widSliderGreen, 
    (int) xcColor.green);
  XmScaleSetValue(
    (Widget) widSliderBlue, 
    (int) xcColor.blue);
} /* end of SetScaleFromColor */


/*=================================================================*/
/* function name: SelectColorCB                                    */
/*   description:                                                  */
/* Zeige den ausgewaehlten Farbwert an und setze Sliders ent-      */
/* sprechend.                                                      */
/*-----------------------------------------------------------------*/
/*        start: 08-May-1991                                       */
/* last changes: 17-Jan-1993 by: mb                                */
/*=================================================================*/

void SelectColorCB(widCB, pClientData, pCallData)
Widget    widCB;
XtPointer pClientData;
XtPointer pCallData;
{
  static Widget widLast = (Widget) NULL;

  iActColorNr = (int) pClientData;
  if (widLast != (Widget) NULL)
  {
    XtVaSetValues(widLast,
      XmNborderColor, 1,
      NULL);
  }
  widLast = widCB;
  XtVaSetValues(widCB,
    XmNborderColor, 0,
    NULL);
                              /* Setze Sliders                     */
  SetScaleFromColor();
} /* end of SelectColorCB */


/*=================================================================*/
/* function name: SliderMoveCB                                     */
/*   description:                                                  */
/* Aktualisiere den Wert des entsprechenden Sliders.               */
/*-----------------------------------------------------------------*/
/*        start: 08-May-1991                                       */
/* last changes: 25-Jul-1992 by: mb                                */
/*=================================================================*/

void SliderMoveCB(widCB, pClientData, pCallData)
Widget    widCB;
XtPointer pClientData;
XtPointer pCallData;
{
  int    iTmp;

  XmScaleGetValue(
    (Widget) widCB, 
    (int *) &iTmp);
  if (widCB == widSliderRed)
  {
    SetColorValue((int) iActColorNr, (int) iTmp, (int) -1, (int) -1);
  }
  if (widCB == widSliderGreen)
  {
    SetColorValue((int) iActColorNr, (int) -1, (int) iTmp, (int) -1);
  }
  if (widCB == widSliderBlue)
  {
    SetColorValue((int) iActColorNr, (int) -1, (int) -1, (int) iTmp);
  }
  SetScaleFromColor();
} /* end of SliderMoveCB */


/*=================================================================*/
/* function name: SliderLeftCB                                     */
/*   description:                                                  */
/* Falls linke Pfeiltaste betaetigt wurde, aktualisiere Wert.      */
/*-----------------------------------------------------------------*/
/*        start: 08-May-1991                                       */
/* last changes: 25-Jul-1992 by: mb                                */
/*=================================================================*/

void SliderLeftCB(widCB, pClientData, pCallData)
Widget    widCB;
XtPointer pClientData;
XtPointer pCallData;
{
  int    iTmp;
  Widget widTmpSlider;
                              /* Parent Widget wird uebergeben.    */
                              /* Ermittelt Wert und falls moeglich */
                              /* aendert ihn                       */
  widTmpSlider = (Widget) pClientData;
  XmScaleGetValue(
    (Widget) widTmpSlider, 
    (int *) &iTmp);
  if (iTmp > MAX_INCDEC)
  {
    iTmp -= MAX_INCDEC;
  }
  XmScaleSetValue(
    (Widget) widTmpSlider, 
    (int) iTmp);
                              /* Setze Slider mittels eines Call-  */
                              /* back Aufrufs                      */
  SliderMoveCB(
    (Widget) widTmpSlider, 
    (XtPointer) NULL, 
    (XtPointer) NULL);
} /* end of SliderLeftCB */


/*=================================================================*/
/* function name: SliderRightCB                                    */
/*   description:                                                  */
/* Aktualisiere den Farbwert, falls rechte Pfeiltaste selektiert   */
/* wurde.                                                          */
/*-----------------------------------------------------------------*/
/*        start: 08-May-1991                                       */
/* last changes: 25-Jul-1992 by: mb                                */
/*=================================================================*/

void SliderRightCB(widCB, pClientData, pCallData)
Widget    widCB;
XtPointer pClientData;
XtPointer pCallData;
{
  int    iTmp;
  Widget widTmpSlider;

  widTmpSlider = (Widget) pClientData;
  XmScaleGetValue(
    (Widget) widTmpSlider, 
    (int *) &iTmp);
  if (iTmp <= (MAX_COLVAL - MAX_INCDEC))
  {
    iTmp += MAX_INCDEC;
  }
  XmScaleSetValue(
    (Widget) widTmpSlider, 
    (int) iTmp);
                              /* Setze Slider mittels eines Call-  */
                              /* back Aufrufs                      */
  SliderMoveCB(
    (Widget) widTmpSlider, 
    (XtPointer) NULL, 
    (XtPointer) NULL);
} /* end of SliderRightCB */


/*=================================================================*/
/* function name: FileWriteCB                                      */
/*   description:                                                  */
/* Speichere Farbwerte in eine Datei.                              */
/*-----------------------------------------------------------------*/
/*        start: 08-May-1991                                       */
/* last changes: 25-Jul-1992 by: mb                                */
/*=================================================================*/

void FileWriteCB(widCB, pClientData, pCallData)
Widget    widCB;
XtPointer pClientData;
XtPointer pCallData;
{
  char     *pszFileName;
  int      iCnt;
  int      iFileHandle;
  XmString xmTmpStr;
  XColor   xcColor;
                              /* Ermittle Dateinamen               */
  XtVaGetValues(widCB,
    XmNtextString, &xmTmpStr,
    NULL);
                              /* Wandle Compound-String in normalen*/
                              /* ASCIIZ-String um.                 */
  XmStringGetLtoR(xmTmpStr, XmSTRING_DEFAULT_CHARSET, &pszFileName);

  iFileHandle = open(pszFileName, 
		     (O_CREAT | O_TRUNC | O_RDWR),
		     0666);
  if (iFileHandle != -1)
  {
    for (iCnt = 0; iCnt < MAX_COLORS; iCnt++)
    {
      xcColor.pixel = recColorTab[iCnt];
      XQueryColor(
	(Display *) dispColor, 
	(Colormap) recColorMap, 
	(XColor *) &xcColor);
      write(iFileHandle, (char *) &xcColor.red,   
	    sizeof(unsigned short));
      write(iFileHandle, (char *) &xcColor.green, 
	    sizeof(unsigned short));
      write(iFileHandle, (char *) &xcColor.blue,  
	    sizeof(unsigned short));
    }
    close((char *) iFileHandle);
  }
  XtFree((char *) pszFileName);
} /* end of FileWriteCB */


/*=================================================================*/
/* function name: FileReadCB                                       */
/*   description:                                                  */
/* Lese aus der ausgewaehlten Datei die Farbwerte.                 */
/*-----------------------------------------------------------------*/
/*        start: 08-May-1991                                       */
/* last changes: 25-Jul-1992 by: mb                                */
/*=================================================================*/

void FileReadCB(widCB, pClientData, pCallData)
Widget  widCB;
XtPointer pClientData;
XtPointer pCallData;
{
  char           *pszFileName;
  unsigned short nRed;
  unsigned short nGreen;
  unsigned short nBlue;
  int            iCnt;
  int            iFileHandle;
  XmString       xmTmpStr;

  XtVaGetValues(widCB,
    XmNtextString, &xmTmpStr,
    NULL);
  XmStringGetLtoR(xmTmpStr, XmSTRING_DEFAULT_CHARSET, &pszFileName);

  iFileHandle = open(pszFileName, O_RDWR);
  if (iFileHandle != -1)
  {
    for (iCnt = 0; iCnt < MAX_COLORS; iCnt++)
    {
      read(iFileHandle, (char *) &nRed,   sizeof(unsigned short));
      read(iFileHandle, (char *) &nGreen, sizeof(unsigned short));
      read(iFileHandle, (char *) &nBlue,  sizeof(unsigned short));
      SetColorValue(iCnt, (int) nRed, (int) nGreen, (int) nBlue);
    }
    close((char *) iFileHandle);
  }
  XtFree((char *) pszFileName);
  SetScaleFromColor();
} /* end of FileReadCB */


/*=================================================================*/
/* function name: ExitProgCB                                       */
/*   description:                                                  */
/* Verlasse das Programm.                                          */
/*-----------------------------------------------------------------*/
/*        start: 12-Oct-1991                                       */
/* last changes: 08-Aug-1992 by: mb                                */
/*=================================================================*/

void ExitProgCB(widCB, pClientData, pCallData)
Widget    widCB;
XtPointer pClientData;
XtPointer pCallData;
{
  XtCloseDisplay((Display *) dispColor);
  exit(0);
} /* end of ExitProgCB */


/*=================================================================*/
/* function name: CreateRowLabelRow                                */
/*   description:                                                  */
/* Erzeuge die Widgets fuer die Farbwerte und Bezeichnungen.       */
/*-----------------------------------------------------------------*/
/*        start: 08-May-1991                                       */
/* last changes: 17-Jan-1993 by: mb                                */
/*=================================================================*/

void CreateRowLabelColor(widParent)
Widget widParent;
{
  char     szTmpStr[30];
  int      iCnt;
  int      iTmp;
  int      iTmpHeight = 0;
  XmString xmTmpStr;
  Widget   widrecTmp[MAX_COLORS];

  widLabelRow = XtVaCreateManagedWidget(
		  "ixcolRowLabel", 
		  xmRowColumnWidgetClass,
		  widParent,
		  XmNnumColumns, 1,
		  XmNorientation, XmVERTICAL,
		  XmNspacing, 2,
		  XmNborderWidth, 1,
		  NULL);

  for (iCnt = 0; iCnt < MAX_COLORS; iCnt++) 
  {
    sprintf(szTmpStr, "Farbwert Nr.: %2d", (iCnt + 1));
    xmTmpStr = XmStringCreateLtoR(szTmpStr, 
                                  XmSTRING_DEFAULT_CHARSET);
    if ((iTmp = XmStringHeight(recFontList, xmTmpStr)) > iTmpHeight)
    {
      iTmpHeight = iTmp;
    }
    widrecTmp[iCnt] = XtVaCreateWidget(
			"clabel",
			xmLabelGadgetClass,
			widLabelRow,
			XmNlabelString, xmTmpStr,
			XmNshadowThickness, 0,
			XmNborderWidth, 1,
			XmNfontList, recFontList,
			NULL);
    XmStringFree(xmTmpStr);
  }
  XtManageChildren(widrecTmp, MAX_COLORS);

  widColorRow = XtVaCreateManagedWidget(
		  "ixcolColorRow",
		  xmRowColumnWidgetClass,
		  widParent,
		  XmNwidth, 35,
		  XmNheight, (iTmpHeight + 2),
		  XmNnumColumns, 1,
		  XmNorientation, XmVERTICAL,
		  XmNbackground, 1,
		  XmNspacing, 2,
		  XmNborderWidth, 1,
		  NULL);

  xmTmpStr = XmStringCreateLtoR("", XmSTRING_DEFAULT_CHARSET);
  for (iCnt = 0; iCnt < MAX_COLORS; iCnt++) 
  {
    sprintf(szTmpStr, "ixcolPush%d", iCnt);
                                       /* Kein Gadget verwenden    */
    widrecTmp[iCnt] = XtVaCreateWidget(
			szTmpStr,
			xmPushButtonWidgetClass,
			widColorRow,
			XmNlabelString, xmTmpStr,
			XmNwidth, 29,
			XmNheight, (iTmpHeight + 2),
			XmNrecomputeSize, False,
			XmNbackground, recColorTab[iCnt],
			XmNborderWidth, 1,
			XmNborderColor, 1,
			XmNshadowThickness, 1,
			NULL);
    XtAddCallback(widrecTmp[iCnt], XmNactivateCallback, 
                  SelectColorCB, (XtPointer) iCnt);
  }
  XtManageChildren(widrecTmp, MAX_COLORS);
  XmStringFree(xmTmpStr);
} /* end of CreateRowLabelColor */


/*=================================================================*/
/* function name: CreateSlider                                     */
/*   description:                                                  */
/* Erzeuge einen einzelnen Slider mit jeweils zwei Kind-Widgets.   */
/*-----------------------------------------------------------------*/
/*        start: 08-May-1991                                       */
/* last changes: 08-Aug-1992 by: mb                                */
/*=================================================================*/

void CreateSlider(widParent, pwidSlider, pszSliderName)
Widget widParent;
Widget *pwidSlider;
char   *pszSliderName;
{
  Widget   widTmp;
  Widget   widTmpSlider;
  XmString xmTmpStr;

  xmTmpStr = XmStringCreateLtoR(pszSliderName, 
				XmSTRING_DEFAULT_CHARSET);
  *pwidSlider = widTmpSlider = 
    XtVaCreateManagedWidget( 
      "ixcolSlider", 
      xmScaleWidgetClass, 
      widParent, 
      XmNtitleString, xmTmpStr, 
      XmNminimum, (int) 0, 
      XmNmaximum, (int) MAX_COLVAL, 
      XmNvalue, (int) 0, 
      XmNorientation, XmHORIZONTAL, 
      XmNprocessingDirection, XmMAX_ON_RIGHT, 
      XmNborderWidth, 1, 
      XmNshowValue, True, 
      XmNscaleMultiple, 10, 
      XmNdecimalPoints, 2,
      XmNfontList, recFontList, 
      NULL);
  XtAddCallback(widTmpSlider, XmNdragCallback, SliderMoveCB, NULL);
  XtAddCallback(widTmpSlider, XmNvalueChangedCallback, 
		SliderMoveCB, NULL);
  XmStringFree(xmTmpStr);

  widTmp = XtVaCreateManagedWidget(
	      "ixcolArrowLeft",
	      xmArrowButtonWidgetClass,
	      widTmpSlider,
	      XmNarrowDirection, XmARROW_LEFT,
	      NULL);
  XtAddCallback(widTmp, XmNactivateCallback,
		SliderLeftCB, (XtPointer) widTmpSlider);

  widTmp = XtVaCreateManagedWidget(
	     "ixcolArrowRight",
	     xmArrowButtonWidgetClass,
	     widTmpSlider,
	     XmNarrowDirection, XmARROW_RIGHT,
	     NULL);
  XtAddCallback(widTmp, XmNactivateCallback,
		SliderRightCB, (XtPointer) widTmpSlider);
} /* end of CreateSlider */


/*=================================================================*/
/* function name: CreateRowSlider                                  */
/*   description:                                                  */
/* Binde die einzelnen Sliders in ein Row-Widget ein.              */
/*-----------------------------------------------------------------*/
/*        start: 08-May-1991                                       */
/* last changes: 08-Aug-1992 by: mb                                */
/*=================================================================*/

void CreateRowSlider(widParent)
Widget widParent;
{
  widSliderRow = XtVaCreateManagedWidget(
		   "ixcolRowSlider",
		   xmRowColumnWidgetClass,
		   widParent,
		   XmNwidth, 200,
		   XmNnumColumns, 1,
		   XmNorientation, XmVERTICAL,
		   XmNresizeWidth, False,
		   NULL);

  CreateSlider(widSliderRow, &widSliderRed,   "Red");
  CreateSlider(widSliderRow, &widSliderGreen, "Green");
  CreateSlider(widSliderRow, &widSliderBlue,  "Blue");
} /* end of CreateRowSlider */


/*=================================================================*/
/* function name: CreateFileSelectionBox                           */
/*   description:                                                  */
/* Erzeuge die FileSelectionBox.                                   */
/*-----------------------------------------------------------------*/
/*        start: 08-May-1991                                       */
/* last changes: 08-Aug-1992 by: mb                                */
/*=================================================================*/

void CreateFileSelectionBox(widParent)
Widget widParent;
{
  XmString xmTmpStr;
  Widget   widTmp;

  xmTmpStr = XmStringCreateLtoR("*.rgb", XmSTRING_DEFAULT_CHARSET);
  widFile = XtVaCreateWidget(
	      "ixcolFile",
	      xmFileSelectionBoxWidgetClass,
	      widParent,
	      XmNdirMask, xmTmpStr,
	      XmNtextFontList, recFontList,
	      XmNlabelFontList, recFontList,
	      NULL);
  XtAddCallback(widFile, XmNokCallback, FileReadCB, NULL);  
  XtAddCallback(widFile, XmNcancelCallback, FileWriteCB, NULL);  
  XtAddCallback(widFile, XmNhelpCallback, ExitProgCB, NULL);
  XmStringFree(xmTmpStr);

  widTmp = XmFileSelectionBoxGetChild(widFile, XmDIALOG_OK_BUTTON);
  xmTmpStr = XmStringCreateLtoR("Read", XmSTRING_DEFAULT_CHARSET);
  XtVaSetValues(widTmp,
    XmNlabelString, xmTmpStr,
    NULL);
  XmStringFree(xmTmpStr);

  widTmp = XmFileSelectionBoxGetChild(widFile, 
                                      XmDIALOG_CANCEL_BUTTON);
  xmTmpStr = XmStringCreateLtoR("Write", XmSTRING_DEFAULT_CHARSET);
  XtVaSetValues(widTmp,
    XmNlabelString, xmTmpStr,
    NULL);
  XmStringFree(xmTmpStr);

  widTmp = XmFileSelectionBoxGetChild(widFile,
				      XmDIALOG_HELP_BUTTON);
  xmTmpStr = XmStringCreateLtoR("Quit", XmSTRING_DEFAULT_CHARSET);
  XtVaSetValues(widTmp,
    XmNlabelString, xmTmpStr,
    NULL);
  XmStringFree(xmTmpStr);

  XtManageChild(widFile);
} /* end of CreateFileSelectionBox */


/*=================================================================*/
/* function name: AttachColorBoard                                 */
/*   description:                                                  */
/* Stelle das Layout des Farbtabellen-Boards her.                  */
/*-----------------------------------------------------------------*/
/*        start: 08-May-1991                                       */
/* last changes: 08-May-1991 by: mb                                */
/*=================================================================*/

void AttachColorBoard()
{
  XtVaSetValues(widColorRow,
    XmNleftAttachment, XmATTACH_FORM,
    XmNtopAttachment, XmATTACH_FORM,
    XmNbottomAttachment, XmATTACH_FORM,
    XmNleftOffset, HORIZ_OFFSET,
    XmNtopOffset, VERT_OFFSET,
    XmNbottomOffset, VERT_OFFSET,
    NULL);

  XtVaSetValues(widLabelRow,
    XmNleftAttachment, XmATTACH_WIDGET,
    XmNleftWidget, widColorRow,
    XmNtopAttachment, XmATTACH_FORM,
    XmNbottomAttachment, XmATTACH_FORM,
    XmNleftOffset, HORIZ_OFFSET,
    XmNtopOffset, VERT_OFFSET,
    XmNbottomOffset, VERT_OFFSET,
    NULL);

  XtVaSetValues(widSliderRow,
    XmNleftAttachment, XmATTACH_WIDGET,
    XmNleftWidget, widLabelRow,
    XmNtopAttachment, XmATTACH_FORM,
    XmNbottomAttachment, XmATTACH_FORM,
    XmNleftOffset, HORIZ_OFFSET,
    XmNtopOffset, VERT_OFFSET,
    XmNbottomOffset, VERT_OFFSET,
    NULL);

  XtVaSetValues(widFile,
    XmNleftAttachment, XmATTACH_WIDGET,
    XmNleftWidget, widSliderRow,
    XmNrightAttachment, XmATTACH_FORM,
    XmNtopAttachment, XmATTACH_FORM,
    XmNbottomAttachment, XmATTACH_FORM,
    XmNleftOffset, HORIZ_OFFSET,
    XmNrightOffset, HORIZ_OFFSET,
    XmNtopOffset, VERT_OFFSET,
    XmNbottomOffset, VERT_OFFSET,
    NULL);
} /* end of AttachColorBoard */


/*=================================================================*/
/* function name: CreateColorBoard                                 */
/*   description:                                                  */
/* Erzeugt das Farbparameter-Tableau.                              */
/*-----------------------------------------------------------------*/
/*        start: 08-May-1991                                       */
/* last changes: 08-Aug-1992 by: mb                                */
/*=================================================================*/

void CreateColorBoard(widParent)
Widget widParent;
{
  XmString xmTmpStr;

  xmTmpStr = XmStringCreateLtoR("ix Color Board (c) 91-92 mb", 
				XmSTRING_DEFAULT_CHARSET);
  widColorForm = XtVaCreateWidget(
		   "ixcolForm",
		   xmFormWidgetClass,
		   widParent,
		   XmNwidth, 700,
		   XmNheight, 400,
		   XmNdialogTitle, xmTmpStr,
		   XmNautoUnmanage, False,
		   XmNresizable, True,
		   NULL);
  XmStringFree(xmTmpStr);

  CreateRowLabelColor(widColorForm);
  CreateRowSlider(widColorForm);
  CreateFileSelectionBox(widColorForm);

  AttachColorBoard();
  XtManageChild(widColorForm);
} /* end of CreateColorBoard */


/*=================================================================*/
/* function name: main                                             */
/*   description:                                                  */
/* Aufruf-Funktion, verwaltet und Initialisiert das gesamte        */
/* Programm.                                                       */
/*-----------------------------------------------------------------*/
/*        start: 08-May-1991                                       */
/* last changes: 25-Jul-1992 by: mb                                */
/*=================================================================*/

void main(argc, argv)
int  argc;
char **argv;
{
  Widget       widTopLevel;
  Status       StatColor;
  XtAppContext appContext;

  widTopLevel = XtAppInitialize(
		  (XtAppContext *) &appContext,
		  (String) "XixColor", 
		  (XrmOptionDescList) NULL, 
		  (Cardinal) 0, 
		  (Cardinal *) &argc, 
		  (String *) argv,
		  (String *) NULL,
		  (ArgList) NULL,
		  (Cardinal) 0);
  dispColor   = (Display *) XtDisplay((Widget) widTopLevel);
                              /* Reserviere Farbwerte beim X-System */       
  recColorMap = (Colormap) XDefaultColormap( 
			     (Display *) dispColor, 
			     (int) XDefaultScreen(
				     (Display *) dispColor));
  StatColor   = XAllocColorCells(
		  (Display *) dispColor, 
		  (Colormap) recColorMap, 
		  (Bool) True, 
		  (unsigned long *) NULL, 
		  (unsigned int) 0, 
		  (unsigned long *) recColorTab, 
		  (unsigned int) MAX_COLORS);
  if (StatColor == 0)
  {
    fprintf(stderr, "could not allocate %d colors.\n", MAX_COLORS);
    exit(1);
  }
                              /* Lade Zeichensatz. Kann entfallen   */          
  precFont = XLoadQueryFont( 
	       (Display *) dispColor, 
	       (char *) IXCOL_FONT);
  if (precFont == (XFontStruct *) NULL)
  {
    fprintf(stderr, "error: font %s not found!\n",
	    IXCOL_FONT);
    exit(1);
  }
  recFontList = XmFontListCreate(
		  (XFontStruct *) precFont, 
		  (XmStringCharSet) XmSTRING_DEFAULT_CHARSET);
                              /* Erzeuge das Board                  */    
  InitColorTab();
  CreateColorBoard((Widget) widTopLevel);
                              /* Realisiere das Board und starte    */
			      /* Endlosschleife.                    */
  XtRealizeWidget((Widget) widTopLevel);
  XtAppMainLoop((XtAppContext) appContext);
} /* end of main */

